diff --git a/.github/workflows/BuildAndRun.yml b/.github/workflows/BuildAndRun.yml deleted file mode 100644 index fba422db4..000000000 --- a/.github/workflows/BuildAndRun.yml +++ /dev/null @@ -1,106 +0,0 @@ -name: Build and Run - -on: workflow_dispatch - -jobs: - build_and_run: - runs-on: ubuntu-latest - outputs: - VALUE: ${{ steps.short_hash.outputs.VALUE }} - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set SHORT_HASH - run: | - echo "::set-output name=VALUE::${LONG_HASH:0:8}" - echo "RELEASE_TAG=${LONG_HASH:0:8}-$(TZ=UTC-8 date +"%Y.%m.%d")" >> $GITHUB_ENV - id: short_hash - env: - LONG_HASH: ${{ github.sha }} - - - name: Set up JDK - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'adopt' - - - name: Set up Maven - uses: stCarolas/setup-maven@v4.5 - with: - maven-version: 3.9.3 - - - name: Create output folder - run: mkdir BuildOutput - -# - name: Build flyfly project -# working-directory: ./FlySpring/flyfly -# run: mvn clean package - -# - name: Copy flyfly JAR to Examples folder and rename -# run: cp ./FlySpring/flyfly/target/flyfly-0.0.1-SNAPSHOT.jar ././BuildOutput/flyfly.jar - - - name: Build edgechain-app project - working-directory: ./FlySpring/edgechain-app - # run: mvn -Djavacpp.platform=linux-x86_64 clean package -DskipTests - run: mvn clean package -DskipTests - - - name: Run edgechain testcases - working-directory: ./FlySpring/edgechain-app - run: mvn test - - - name: Copy edgechain-app JAR to Examples folder - run: cp ./FlySpring/edgechain-app/target/edgechain.jar ./BuildOutput/ - - - name: Upload Examples folder as artifact - uses: actions/upload-artifact@v3 - with: - name: Output - path: ./BuildOutput/ - - release: - name: Release jar - needs: build_and_run - if: startsWith(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Download jar from build - uses: actions/download-artifact@v3 - with: - name: Output - path: Output - - name: Display structure of downloaded files - run: ls -R - - # - name: Create Release - # id: create_release - # uses: actions/create-release@v1.1.4 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # tag_name: ${{ github.ref }} - # release_name: ${{ github.ref }} - # - name: Upload Release jar - # id: upload_release_asset - # uses: actions/upload-release-asset@v1.0.1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_release.outputs.upload_url }} - # asset_path: Examples/ - # asset_name: Examples - # asset_content_type: application/zip - - name: 'Get variables' - id: vars - run: | - echo "tag_name= ${{needs.build_and_run.outputs.VALUE}}" >> $GITHUB_OUTPUT - - name: Release - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ env.RELEASE_TAG }} - # body: 🚀 Automated build - files: | - ./Output/**/*.* - - # tag_name: ${{needs.build_and_run.steps.short_hash.outputs.VALUE}} - diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 63a2d646e..512a9b7df 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -22,7 +22,7 @@ jobs: path-to-document: 'https://github.com/arakoodev/.github/blob/main/CLA.md' # e.g. a CLA or a DCO document # branch should not be protected branch: 'main' - allowlist: user1,dependabot-preview[bot], dependabot[bot],github-actions,github-actions[bot],[pre-commit*,pre-commit*,bot* + allowlist: user1,actions-user,dependabot-preview[bot], dependabot[bot],github-actions,github-actions[bot],[pre-commit*,pre-commit*,bot* custom-pr-sign-comment: 'I have read the Arakoo CLA Document and I hereby sign the CLA' custom-notsigned-prcomment: 'Thank you for your submission, we really appreciate it. Before we can accept your contribution, we ask that you sign the [Arakoo Contributor License Agreement](https://github.com/arakoodev/.github/blob/main/CLA.md). You can sign the CLA by adding a new comment to this pull request and pasting exactly the following text.' remote-organization-name: arakoodev diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index af5fec411..277c19a4c 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -1,54 +1,58 @@ -name: Generate attachments +name: PR Build on: - # This workflow is started only on PRs - pull_request_target: - types: + pull_request_target: + types: - opened - reopened - synchronize + paths: + - 'Java/**' + - 'JS/**' jobs: - # Main job - build: - permissions: - # Required to upload/save artifact, otherwise you'll get - # "Error: Resource not accessible by integration" - contents: write - # Required to post comment, otherwise you'll get - # "Error: Resource not accessible by integration" - pull-requests: write - + changes: runs-on: ubuntu-latest + permissions: + pull-requests: read outputs: - VALUE: ${{ steps.short_hash.outputs.VALUE }} + java: ${{ steps.filter.outputs.java }} + js: ${{ steps.filter.outputs.js }} steps: - # Put your steps here to generate the files to upload. - # Usually configure Node.js, build, etc. - # Finally, upload the artifacts and post comment: - - name: Checkout PR - if: ${{ github.event_name == 'pull_request_target' }} - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v2 + id: filter with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} + filters: | + java: + - 'Java/**' + js: + - 'JS/**' + + java: + needs: changes + if: ${{ needs.changes.outputs.java == 'true' }} + runs-on: ubuntu-latest + outputs: + VALUE: ${{ steps.set_short_hash.outputs.VALUE }} - # Token for current repo (used to post PR comment) - repo-token: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 - name: Set SHORT_HASH + id: set_short_hash run: | - echo "::set-output name=VALUE::${LONG_HASH:0:8}" - echo "RELEASE_TAG=${LONG_HASH:0:8}-$(TZ=UTC-8 date +"%Y.%m.%d")" >> $GITHUB_ENV - id: short_hash - env: - LONG_HASH: ${{ github.sha }} + echo "::set-output name=VALUE::${{ github.sha }}" + echo "RELEASE_TAG=${{ github.sha }}-$(TZ=UTC-8 date +"%Y.%m.%d")" >> $GITHUB_ENV + + - name: Goto Java folder + run: cd Java - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v2 with: - java-version: '17' distribution: 'adopt' + java-version: '17' - name: Set up Maven uses: stCarolas/setup-maven@v4.5 @@ -56,23 +60,90 @@ jobs: maven-version: 3.9.3 - name: Create output folder - run: mkdir BuildOutput + run: mkdir -p Java/FlySpring/edgechain-app/BuildOutput - name: Build edgechain-app project - working-directory: ./FlySpring/edgechain-app - run: mvn clean package -DskipTests + working-directory: Java/FlySpring/edgechain-app + run: mvn clean package -DskipTests - name: Run edgechain testcases - working-directory: ./FlySpring/edgechain-app + working-directory: Java/FlySpring/edgechain-app run: mvn test - - name: Copy edgechain-app JAR to Examples folder - run: cp ./FlySpring/edgechain-app/target/edgechain.jar ./BuildOutput/ + - name: Copy edgechain-app JAR to BuildOutput + run: cp Java/FlySpring/edgechain-app/target/edgechain.jar Java/FlySpring/edgechain-app/BuildOutput + + + js: + needs: changes + if: ${{ needs.changes.outputs.js == 'true' }} + permissions: + contents: write + pull-requests: write + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + - name: Install Prettier + run: npm install prettier + - name: Install ESLint + run: > + npm install eslint@^8 && + npm install @microsoft/eslint-formatter-sarif@latest eslint-config-google@latest eslint-plugin-import@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest eslint-config-prettier@latest eslint-plugin-prettier@latest + - name: Get cache date + id: get-date + run: echo "name=date::$(/bin/date -u "+%Y%m%d")" + shell: bash + - name: ESLint Cache + uses: actions/cache@v3 + with: + path: ./.eslintcache + key: ${{ runner.os }}-eslintcache-${{ hashFiles('./eslintcache') }} + restore-keys: | + ${{ runner.os }}-eslintcache- + - name: Run ESLint + run: npx eslint JS + --fix + --cache + --config JS/.eslintrc.js + --ext .js,.jsx,.ts,.tsx + continue-on-error: true + + - name: Run Prettiers + run: npx prettier --tab-width 4 --print-width 100 --trailing-comma es5 --ignore-path "$(CURDIR)/.prettierignore" --write JS/ + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Automatically applying Prettier changes + commit_user_name: GitHub Actions + commit_user_email: actions@github.com + commit_author: GitHub Actions + branch: ts + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Goto JS folder + run: cd JS/edgechains/lib - - name: Upload Examples folder as artifact - uses: actions/upload-artifact@v3 + - name: Set up Node.js + uses: actions/setup-node@v3 with: - name: Output - path: ./BuildOutput/ + node-version: '18' + + - name: Install dependencies + run: npm install + working-directory: JS/edgechains/lib + + - name: Build edgechain-app project + run: npm run build + working-directory: JS/edgechains/lib - + - name: Package edgechain-app project + run: npm pack + working-directory: JS/edgechains/lib \ No newline at end of file diff --git a/.github/workflows/release-java.yml b/.github/workflows/release-java.yml new file mode 100644 index 000000000..50d836e4b --- /dev/null +++ b/.github/workflows/release-java.yml @@ -0,0 +1,78 @@ +name: Release Java + +on: + workflow_dispatch + +jobs: + build: + runs-on: ubuntu-latest + outputs: + VALUE: ${{ steps.set_short_hash.outputs.VALUE }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set SHORT_HASH + id: set_short_hash + run: | + echo "::set-output name=VALUE::${{ github.sha }}" + echo "RELEASE_TAG=${{ github.sha }}-$(TZ=UTC-8 date +"%Y.%m.%d")" >> $GITHUB_ENV + + - name: Goto Java folder + run: cd Java + + - name: Set up JDK + uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '17' + + - name: Set up Maven + uses: stCarolas/setup-maven@v4.5 + with: + maven-version: 3.9.3 + + - name: Create output folder + run: mkdir -p Java/FlySpring/edgechain-app/BuildOutput + + - name: Build edgechain-app project + working-directory: Java/FlySpring/edgechain-app + run: mvn clean package -DskipTests + + - name: Run edgechain testcases + working-directory: Java/FlySpring/edgechain-app + run: mvn test + + - name: Copy edgechain-app JAR to Examples folder + run: cp Java/FlySpring/edgechain-app/target/edgechain.jar Java/FlySpring/edgechain-app/BuildOutput + + - name: Upload Examples folder as artifact + uses: actions/upload-artifact@v2 + with: + name: Output + path: Java/FlySpring/edgechain-app/BuildOutput + + release: + name: release-java + needs: build + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Download jar from build + uses: actions/download-artifact@v2 + with: + name: Output + path: Output + - name: Display structure of downloaded files + run: ls -R + + - name: Get variables + id: vars + run: echo "tag_name=${{ env.RELEASE_TAG }}" >> $GITHUB_ENV + + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: | + ./Output/**/*.* + tag_name: ${{ env.RELEASE_TAG }} diff --git a/.github/workflows/release-js.yml b/.github/workflows/release-js.yml new file mode 100644 index 000000000..e039e267d --- /dev/null +++ b/.github/workflows/release-js.yml @@ -0,0 +1,86 @@ +name: Release Js + +on: + workflow_dispatch + +permissions: + contents: write + +jobs: + formatting: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + - name: Install Prettier + run: npm install prettier + - name: Install ESLint + run: > + npm install eslint@latest && + npm install @microsoft/eslint-formatter-sarif@latest eslint-config-google@latest eslint-plugin-import@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest eslint-config-prettier@latest eslint-plugin-prettier@latest + - name: Get cache date + id: get-date + run: echo "name=date::$(/bin/date -u "+%Y%m%d")" + shell: bash + - name: ESLint Cache + uses: actions/cache@v3 + with: + path: ./.eslintcache + key: ${{ runner.os }}-eslintcache-${{ hashFiles('./eslintcache') }} + restore-keys: | + ${{ runner.os }}-eslintcache- + - name: Run ESLint + run: npx eslint JS + --fix + --cache + --config JS/.eslintrc.js + --ext .js,.jsx,.ts,.tsx + continue-on-error: true + + - name: Run Prettiers + run: npx prettier --tab-width 4 --print-width 100 --trailing-comma es5 --ignore-path "$(CURDIR)/node_modules/*" --write JS/ + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Automatically applying Prettier changes + commit_user_name: GitHub Actions + commit_user_email: actions@github.com + commit_author: GitHub Actions + branch: ${{ github.head_ref }} + + release: + name: release-js + needs: formatting + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Goto JS folder + run: cd JS/edgechains/lib + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Install dependencies + run: npm install + working-directory: JS/edgechains/lib + + - name: Build edgechain-app project + run: npm run build + working-directory: JS/edgechains/lib + + - name: Package edgechain-app project + run: npm pack + working-directory: JS/edgechains/lib + + - name: Upload release Tarball + uses: actions/upload-artifact@v3 + with: + name: release-artifact + path: 'JS/edgechains/lib/*.tgz' diff --git a/.github/workflows/release-wasm.yml b/.github/workflows/release-wasm.yml new file mode 100644 index 000000000..4de5ab4ab --- /dev/null +++ b/.github/workflows/release-wasm.yml @@ -0,0 +1,102 @@ +name: Release Wasm + +on: workflow_dispatch + +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + wasm: + - 'JS/wasm/**' + # start of the build job + - name: Build Engine + working-directory: . + run: | + make add all + - name: Build CLI + working-directory: . + run: | + make build-arakoo + - name: Build Jsonnet + working-directory: . + run: | + make build-jsonnet TAG=${{ github.ref_name }} + - name: Build Edgechains + working-directory: . + run: | + make build-edgechains TAG=${{ github.ref_name }} + + # start of the release job + - name: Create out directory + working-directory: . + run: | + mkdir bin/ + + - name: Copy arakoo bin + working-directory: . + run: | + cp target/release/arakoo bin/ + - name: Zip Jsonnet + uses: thedoctor0/zip-release@0.7.5 + with: + type: 'zip' + filename: 'jsonnet.zip' + exclusions: '*.git* /*node_modules/* .editorconfig' + path: 'JS/jsonnet' + + - name: Copy Jsonnet + working-directory: . + run: | + cp jsonnet.zip bin/ + + - name: Zip edgechains + uses: thedoctor0/zip-release@0.7.5 + with: + type: 'zip' + filename: 'edgechains.zip' + exclusions: '*.git* /*node_modules/* .editorconfig' + path: 'JS/edgechains/arakoodev' + + - name: copy edgechains + working-directory: . + run: | + cp edgechains.zip bin/ + + - name: Copy Javy bin + working-directory: . + run: | + cp target/release/arakoo-compiler bin/ + + - name: Upload Release Binary + uses: actions/upload-artifact@v4 + with: + name: arakoo-${{ github.ref_name }}-x86_64 + path: bin + + release: + name: release-wasm + needs: build + runs-on: ubuntu-latest + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: arakoo-${{ github.ref_name }}-x86_64 + path: Output + - name: Display structure of downloaded files + run: ls -R + + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: | + ./Output/* diff --git a/.github/workflows/security-scan.yml b/.github/workflows/security-scan.yml deleted file mode 100644 index 8bb298855..000000000 --- a/.github/workflows/security-scan.yml +++ /dev/null @@ -1,76 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ "master" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "master" ] - schedule: - - cron: '31 12 * * 2' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'java' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Use only 'java' to analyze code written in Java, Kotlin or both - # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - - # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{matrix.language}}" diff --git a/.github/workflows/webassembly-pr-build.yml b/.github/workflows/webassembly-pr-build.yml new file mode 100644 index 000000000..c1edcde92 --- /dev/null +++ b/.github/workflows/webassembly-pr-build.yml @@ -0,0 +1,78 @@ +name: Webassembly PR Build + +on: + pull_request_target: + types: + - opened + - reopened + - synchronize + paths: + - 'JS/wasm/**' + +jobs: + changes: + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + wasm: ${{ steps.filter.outputs.wasm }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + wasm: + - 'JS/**' + + wasm: + needs: changes + if: ${{ needs.changes.outputs.wasm == 'true' }} + permissions: + contents: write + pull-requests: write + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + + - name: Cache Javy Core + uses: actions/cache@v2 + with: + path: ./target + key: javy-core + restore-keys: | + javy-core + + - name: Check if Javy Core is cached + id: cache-hit + run: | + # echo "cache-hit=$(test -d ./target && echo true || echo false)" >> $GITHUB_OUTPUT + echo "cache-hit=$(test -d ./target && echo true || echo false)" >> $GITHUB_OUTPUT + + - name: Build Javy Core + working-directory: . + run: | + make add all + - name: Build CLI + working-directory: . + run: | + make build-arakoo + - name: Build Jsonnet + working-directory: . + run: | + make build-jsonnet \ No newline at end of file diff --git a/.gitignore b/.gitignore index 549e00a2a..9a80dbd8c 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,16 @@ build/ ### VS Code ### .vscode/ + +### Node Modules ### +node_modules + +### rust ### +/target/ +index.wasm +index.wit +Cargo.lock +yarn.lock +package-lock.json +.DS_Store +pnpm-lock.yaml diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..1f2c2b602 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +**/node_modules +JS/wasm/* \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..2d288a0ff --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,34 @@ +[workspace] +members = [ + "JS/wasm/crates/arakoo-core", + "JS/wasm/crates/cli", + "JS/wasm/crates/serve", + "JS/jsonnet", +] +resolver = "2" + +[workspace.package] +edition = "2021" +version = "0.0.1" + +[workspace.dependencies] +wizer = "6.0.0" +wasmtime = { features = ["async"], version = "19" } +wasmtime-wasi = "19" +javy = { version = "2.1.0" } +anyhow = "1.0.79" +once_cell = "1.19.0" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +serde_bytes = "0.11" +http = "1.1.0" +reqwest = { version = "0.12.4", features = [ + "blocking","json" +] } + +[profile.release] +lto = true +opt-level = 's' + +[profile.dev] +incremental = true diff --git a/Examples/.DS_Store b/Examples/.DS_Store deleted file mode 100644 index 07e27bb69..000000000 Binary files a/Examples/.DS_Store and /dev/null differ diff --git a/Examples/code-interpreter/CodeInterpreter.java b/Examples/code-interpreter/CodeInterpreter.java deleted file mode 100644 index 084876a39..000000000 --- a/Examples/code-interpreter/CodeInterpreter.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.edgechain; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; - -import java.util.concurrent.TimeUnit; - -import org.json.JSONException; -import org.json.JSONObject; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.edgechain.lib.codeInterpreter.Eval; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -@SpringBootApplication -public class CodeInterpreter { - - private static final String OPENAI_AUTH_KEY = ""; - private static OpenAiEndpoint userChatEndpoint; - private static final ObjectMapper objectMapper = new ObjectMapper(); - private static JsonnetLoader loader = - new FileJsonnetLoader("./code-interpreter/code-interpreter.jsonnet"); - - public static void main(String[] args) { - System.setProperty("server.port", "8080"); - new SpringApplicationBuilder(CodeInterpreter.class).run(args); - } - - @RestController - @RequestMapping("/v1/examples") - public class interpreter { - - @PostMapping("/code-interpreter") - public double interpret(ArkRequest arkRequest) throws JSONException { - - JSONObject json = arkRequest.getBody(); - - userChatEndpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - loader - .put("prompt", new JsonnetArgs(DataType.STRING, json.getString("prompt"))) - .loadOrReload(); - - String prompt = loader.get("extract"); - - while (true) { - - String response = - userChatEndpoint - .chatCompletion(prompt, "code-interpreter", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - - try { - JsonNode jsonNode = objectMapper.readTree(response); - System.out.println("Valid JSON from chatgpt " + jsonNode); - - String tool = jsonNode.get("action").get("tool").asText(); - String arg = jsonNode.get("action").get("arg").asText(); - - if ("CodeInterpreter".equals(tool)) { - Double val = Eval.evaluateExpression(arg); - System.out.println("CodeInterpreter: " + val); - - prompt += - String.format("\n%s\nObservation: CodeInterpreter returned %s", response, val); - } else if ("Finish".equals(tool)) { - System.out.println("FINAL ANSWER: " + arg); - return Double.parseDouble(arg); - } - } catch (JsonProcessingException e) { - System.out.println("Invalid JSON from chatgpt " + response); - e.printStackTrace(); - } - } - } - } -} diff --git a/Examples/code-interpreter/code-interpreter.jsonnet b/Examples/code-interpreter/code-interpreter.jsonnet deleted file mode 100644 index b17c7101c..000000000 --- a/Examples/code-interpreter/code-interpreter.jsonnet +++ /dev/null @@ -1,52 +0,0 @@ -local example = " - You are a Reasoning + Acting (React) Chain Bot. You have to be interactive so ask the queries one by one from the user to reach to the final answer. Please provide a single Thought and single Action to the user so that the user can search the query of the action and provide you with the observation. - The tools you have access to are: - 1. CodeInterpreter - 2. Finish - Do not perform mathematical or code operations yourself, rather use CodeInterpreter. - If you have the answer use Finish tool to end the thought process. - For example the chain would be like this: - - Question: What is value of pi divided by 2 - { - thought: I need to search the value of pi, - action: { - tool: Search - arg: Value of pi - } - } - observation: Value of pi is approximately 3.141 - { - thought: I need to divide the value of pi by 2. - action: { - tool: CodeInterpreter, - arg: 3.141/2 - } - } - observation: CodeInterpreter returned 15.705 - { - thought: We have obtained the value of pi divided by 2. - action: { - tool: Finish - arg: 15.705 - } - } - "; - -local extract = std.join(" ", [ - example, - "Question:" + payload.prompt, - " EXTRACTED = { - thought:: string, - action: { - tool: string, - arg: string - } - } " , - " Return EXTRACTED as a valid JSON object." -]); - - -{ - "extract": extract -} \ No newline at end of file diff --git a/Examples/htmx-ui-demo/Chat.java b/Examples/htmx-ui-demo/Chat.java deleted file mode 100644 index e6203bec4..000000000 --- a/Examples/htmx-ui-demo/Chat.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.edgechain; - -// SOURCES ./MessageItem.java - -import java.util.List; - -public class Chat { - public String heading; - public List chatHistory; - - public Chat(String heading, List chatHistory) { - this.heading = heading; - this.chatHistory = chatHistory; - } - - public Chat() {} -} diff --git a/Examples/htmx-ui-demo/ChatMessage.java b/Examples/htmx-ui-demo/ChatMessage.java deleted file mode 100644 index 8d0c4b71c..000000000 --- a/Examples/htmx-ui-demo/ChatMessage.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.edgechain; - -public class ChatMessage { - String role; - String content; - - public ChatMessage(String role, String content) { - this.role = role; - this.content = content; - } - - public ChatMessage() {} - - public String getRole() { - return role; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - @Override - public String toString() { - return "ChatMessage{" + "role='" + role + '\'' + ", content='" + content + '\'' + '}'; - } -} diff --git a/Examples/htmx-ui-demo/DashboardApp.java b/Examples/htmx-ui-demo/DashboardApp.java deleted file mode 100644 index 1a5e74c63..000000000 --- a/Examples/htmx-ui-demo/DashboardApp.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.edgechain; - -// SOURCES ChatMessage.java -// SOURCES MessageItem.java -// SOURCES Chat.java -// SOURCES User.java - -// FILES resources/templates/index.html=./index.html -// FILES resources/templates/fragments.html=./fragments.html -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.reactive.function.client.WebClient; - -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Flux; - -import java.util.ArrayList; -import java.util.List; - -@SpringBootApplication -@Controller -@RequestMapping("/") -public class DashboardApp { - - public WebClient webClient() { - return WebClient.builder().build(); - } - - public static void main(String[] args) { - System.setProperty("server.port", "8081"); - SpringApplication.run(DashboardApp.class, args); - } - - private StringBuilder currentContent; - public List messages = new ArrayList<>(); - public List chats = new ArrayList<>(); - private String Url = "http://localhost:8080/v1/examples/wiki-summary?query="; - - @GetMapping - public String index(Model model, HttpServletRequest request) { - if ((String) request.getSession().getAttribute("access_token") == null) { - return "redirect:/login"; - } - - addAttributeForIndex(model); - return "index"; - } - - @PostMapping - public String sendMessage(@ModelAttribute("item") MessageItem messageItem, Model model) { - messages.add(messageItem); - return "redirect:/"; - } - - @PostMapping(headers = "HX-Request") - public String htmxSendMessage( - MessageItem messageItem, Model model, HttpServletResponse response) { - System.out.println(messages + "from htmx"); - System.out.println(messageItem); - messages.add(messageItem); - model.addAttribute("item", messageItem); - - response.setHeader("HX-Trigger", "itemAdded"); - - return "fragments :: meassageItem"; - } - - private void addAttributeForIndex(Model model) { - System.out.println("Add Attribute For Index"); - model.addAttribute("item", new MessageItem()); - model.addAttribute("messages", messages); - model.addAttribute("chats", chats); - model.addAttribute("chat", new Chat()); - model.addAttribute("currentId", 1); - } - - @GetMapping("/responce") - public String reply(Model model) { - currentContent = new StringBuilder(); - MessageItem messageItem = new MessageItem("", true); - model.addAttribute("item", messageItem); - - return "fragments :: meassageItem"; - } - - @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux sseMethod() { - - return webClient() - .get() - .uri(Url + messages.get(messages.size() - 1).getMessage()) - .headers( - httpHeaders -> { - httpHeaders.setContentType(MediaType.APPLICATION_JSON); - httpHeaders.set("stream", "true"); - }) - .retrieve() - .bodyToFlux(ChatCompletionResponse.class) - .map(it -> currentContent.append(it.getChoices().get(0).getMessage().getContent())); - } - - public void addChat() { - chats.add(new Chat("Chat 1", new ArrayList())); - chats.add(new Chat("Chat 2", new ArrayList())); - chats.add(new Chat("Chat 3", new ArrayList())); - chats.add(new Chat("Chat 4", new ArrayList())); - } - - @GetMapping("login") - public String logIn() { - return "signIn"; - } - - @GetMapping("signup") - public String singUp() { - return "signUp"; - } - - @GetMapping("signinlink") - public String signInLink() { - return "signInLink"; - } - - public User user = new User(); - - @PostMapping("signup") - public String signUpRequest(HttpServletRequest request) { - - user.email = request.getParameter("email"); - user.password = request.getParameter("password"); - - User info = - webClient() - .post() - .uri("http://localhost:8080/v1/signup") - .contentType(MediaType.APPLICATION_JSON) - .body(Mono.just(user), User.class) - .retrieve() - .bodyToMono(User.class) - .block(); - - return "redirect:/signInLink"; - } - - @PostMapping("signin") - public String signInRequest(HttpServletRequest request) { - user.email = request.getParameter("email"); - user.password = request.getParameter("password"); - - AuthenticatedResponse authResponse = - webClient() - .post() - .uri("http://localhost:8080/v1/login") - .contentType(MediaType.APPLICATION_JSON) - .body(Mono.just(user), User.class) - .retrieve() - .bodyToMono(AuthenticatedResponse.class) - .block(); - - HttpSession session = request.getSession(); - session.setAttribute("access_token", authResponse.getAccess_token()); - - return "redirect:/"; - } - - @GetMapping("logout") - public String logOut(HttpServletRequest request) { - request.getSession().setAttribute("access_token", null); - return "redirect:/login"; - } -} diff --git a/Examples/htmx-ui-demo/MessageItem.java b/Examples/htmx-ui-demo/MessageItem.java deleted file mode 100644 index 9d184d382..000000000 --- a/Examples/htmx-ui-demo/MessageItem.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.edgechain; - -public class MessageItem { - private String message; - private boolean isReceived; - - public MessageItem(String message, boolean isReceived) { - this.message = message; - this.isReceived = isReceived; - } - - public MessageItem() {} - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isReceived() { - return isReceived; - } - - public void setReceived(boolean received) { - isReceived = received; - } - - @Override - public String toString() { - return "MessageItem{" + "message='" + message + '\'' + ", isReceived=" + isReceived + '}'; - } -} diff --git a/Examples/htmx-ui-demo/User.java b/Examples/htmx-ui-demo/User.java deleted file mode 100644 index d2ea16502..000000000 --- a/Examples/htmx-ui-demo/User.java +++ /dev/null @@ -1,11 +0,0 @@ -class User { - public String email; - public String password; - - public User(String email, String password) { - this.email = email; - this.password = password; - } - - public User() {} -} diff --git a/Examples/htmx-ui-demo/templates/fragments.html b/Examples/htmx-ui-demo/templates/fragments.html deleted file mode 100644 index 165bb1706..000000000 --- a/Examples/htmx-ui-demo/templates/fragments.html +++ /dev/null @@ -1,18 +0,0 @@ - - -
  • -
    -
    - Lorem ipsum -
    -
    -
  • - - - Context 1 - - - \ No newline at end of file diff --git a/Examples/htmx-ui-demo/templates/index.html b/Examples/htmx-ui-demo/templates/index.html deleted file mode 100644 index 97b71f140..000000000 --- a/Examples/htmx-ui-demo/templates/index.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - chat app - Arakoo - - - - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -

    Chat

    -
    -
    -
    -
      -
    • -
    • -
    -
    -
    -
    -
    - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/Examples/htmx-ui-demo/templates/signIn.html b/Examples/htmx-ui-demo/templates/signIn.html deleted file mode 100644 index dff8fdb85..000000000 --- a/Examples/htmx-ui-demo/templates/signIn.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - Sign in - Tabler - Premium and Open Source dashboard template with responsive and high quality UI. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - Arakoo - -
    -
    -
    -

    Login to your account

    -
    -
    - - -
    -
    - -
    - - - - - - -
    -
    -
    - -
    - -
    -
    -
    or
    - -
    -
    - Don't have account yet? Sign up -
    -
    -
    - - - - - - - - diff --git a/Examples/htmx-ui-demo/templates/signInLink.html b/Examples/htmx-ui-demo/templates/signInLink.html deleted file mode 100644 index e47b66629..000000000 --- a/Examples/htmx-ui-demo/templates/signInLink.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - Sign in link - Tabler - Premium and Open Source dashboard template with responsive and high quality UI. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - Tabler - -
    -
    -
    -

    Check your inbox

    -

    - We've sent you a magic link to support@tabler.io.
    - Please click the link to confirm your address. -

    -
    -
    - Can't see the email? Please check the spam folder.
    - Wrong email? Please re-enter your address. -
    -
    -
    -
    - - - - - - \ No newline at end of file diff --git a/Examples/htmx-ui-demo/templates/signUp.html b/Examples/htmx-ui-demo/templates/signUp.html deleted file mode 100644 index 3e971e22e..000000000 --- a/Examples/htmx-ui-demo/templates/signUp.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Sign up - Tabler - Premium and Open Source dashboard template with responsive and high quality UI. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - Arakoo - -
    -
    -
    -

    Create new account

    -
    - - -
    -
    - -
    - - - - - - -
    -
    -
    - -
    - -
    -
    -
    - Already have account? Sign in -
    -
    -
    - - - - - - diff --git a/Examples/json/JsonFormat.java b/Examples/json/JsonFormat.java deleted file mode 100644 index d1d7f5aaf..000000000 --- a/Examples/json/JsonFormat.java +++ /dev/null @@ -1,272 +0,0 @@ -package com.edgechain; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.json.JSONObject; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -import com.edgechain.lib.constants.EndpointConstants; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.jsonFormat.request.FunctionRequest; -import com.edgechain.lib.jsonFormat.request.Message; -import com.edgechain.lib.jsonFormat.request.OpenApiFunctionRequest; -import com.edgechain.lib.jsonFormat.request.Parameters; -import com.edgechain.lib.jsonFormat.response.FunctionResponse; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -@SpringBootApplication -public class JsonFormat { - - private static final String OPENAI_AUTH_KEY = ""; - - // need only for situation endpoint - private static final String OPENAI_ORG_ID = ""; - - private static OpenAiEndpoint userChatEndpoint; - private static JsonnetLoader loader = new FileJsonnetLoader("./json/json-format.jsonnet"); - private static JsonnetLoader functionLoader = new FileJsonnetLoader("./json/function.jsonnet"); - private static final ObjectMapper objectMapper = new ObjectMapper(); - - public static void main(String[] args) { - System.setProperty("server.port", "8080"); - new SpringApplicationBuilder(JsonFormat.class).run(args); - - loader - .put("prompt", new JsonnetArgs(DataType.STRING, "")) - .put("format", new JsonnetArgs(DataType.STRING, "")) - .put("situation", new JsonnetArgs(DataType.STRING, "")) - .put("validAction", new JsonnetArgs(DataType.STRING, "")) - .put("callToAction", new JsonnetArgs(DataType.STRING, "")) - .put("actionFormat", new JsonnetArgs(DataType.STRING, "")) - .put("response1", new JsonnetArgs(DataType.STRING, "")) - .put("response2", new JsonnetArgs(DataType.STRING, "")) - .put("response3", new JsonnetArgs(DataType.STRING, "")); - } - - @Bean - public RestTemplate functionCall() { - RestTemplate restTemplate = new RestTemplate(); - restTemplate - .getInterceptors() - .add( - (request, body, execution) -> { - request.getHeaders().add("Authorization", "Bearer " + OPENAI_AUTH_KEY); - request.getHeaders().add("OpenAI-Organization", OPENAI_ORG_ID); - return execution.execute(request, body); - }); - return restTemplate; - } - - @RestController - @RequestMapping("/v1") - public class ExampleController { - - @PostMapping(value = "/extract") - public String extract(ArkRequest arkRequest) { - - userChatEndpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - JSONObject json = arkRequest.getBody(); - - loader - .put("prompt", new JsonnetArgs(DataType.STRING, json.getString("prompt"))) - .put("format", new JsonnetArgs(DataType.STRING, json.getString("format"))) - .loadOrReload(); - - String gptResponse = - userChatEndpoint - .chatCompletion(loader.get("extract"), "Json-format", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - - if (gptResponse == null || gptResponse.isEmpty()) { - System.out.println("ChatGptResponse is null. There was an error processing the request."); - return ("ChatGptResponse is empty. There was an error processing the request. Please try" - + " again."); - } - - try { - JsonNode jsonNode = objectMapper.readTree(gptResponse); - System.out.println("The response is a valid JSON string." + jsonNode); - } catch (Exception e) { - System.out.println("The response is not a valid JSON string."); - } - - return gptResponse; - } - - @PostMapping(value = "/situation") - public String situation(ArkRequest arkRequest) { - - JSONObject json = arkRequest.getBody(); - - OpenAiEndpoint userChat = - new OpenAiEndpoint( - EndpointConstants.OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - OPENAI_ORG_ID, - "gpt-3.5-turbo", - "user", - 0.7, - false, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - loader - .put("situation", new JsonnetArgs(DataType.STRING, json.getString("situation"))) - .put("validAction", new JsonnetArgs(DataType.STRING, json.getString("validAction"))) - .put("callToAction", new JsonnetArgs(DataType.STRING, json.getString("callToAction"))) - .put("actionFormat", new JsonnetArgs(DataType.STRING, json.getString("actionFormat"))) - .loadOrReload(); - - String response1 = - userChat - .chatCompletion(loader.get("actionPrompt"), "Json-format", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - - System.out.println("ChatGpt Response1: " + response1); - - loader.put("response1", new JsonnetArgs(DataType.STRING, response1)).loadOrReload(); - - String response2 = - userChat - .chatCompletion(loader.get("validActionCheckPrompt"), "Json-format", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - - System.out.println("ChatGpt Response2: " + response2); - - loader.put("response2", new JsonnetArgs(DataType.STRING, response2)).loadOrReload(); - - String response3 = - userChat - .chatCompletion(loader.get("ActionFormatPrompt"), "Json-format", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - - System.out.println("ChatGpt Response3: " + response3); - - try { - JsonNode jsonNode = objectMapper.readTree(response3); - System.out.println("The response is a valid JSON string." + jsonNode); - return response3; - } catch (Exception e) { - System.out.println("The response is not a valid JSON string so retrying."); - loader.put("response3", new JsonnetArgs(DataType.STRING, response3)).loadOrReload(); - - String response4 = - userChat - .chatCompletion(loader.get("getValidFormat"), "Json-format", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - - System.out.println("Final Response: " + response4); - return response4; - } - } - - @PostMapping(value = "/function") - public Object function(ArkRequest arkRequest) { - JSONObject json = arkRequest.getBody(); - - JsonNode userFormat = null; - try { - JSONObject format = json.getJSONObject("format"); - userFormat = objectMapper.readTree(format.toString()); - System.out.println("The user format is a valid JSON string." + format); - } catch (JsonProcessingException e) { - e.printStackTrace(); - return "Format has no valid JSON format"; - } - - functionLoader - .put("prompt", new JsonnetArgs(DataType.STRING, json.getString("prompt"))) - .put("format", new JsonnetArgs(DataType.STRING, userFormat.toString())) - .loadOrReload(); - - FunctionRequest function = - new FunctionRequest( - "reply_user", "reply to user's query", new Parameters("object", userFormat)); - - Message systemMessage = - new Message("system", "Only use function_call to reply to use. Do not use content."); - Message userMessage = new Message("user", functionLoader.get("functionPrompt")); - - List messages = Arrays.asList(systemMessage, userMessage); - - OpenApiFunctionRequest request = - new OpenApiFunctionRequest( - "gpt-3.5-turbo-0613", messages, 0.7, Collections.singletonList(function), "auto"); - - FunctionResponse response = - functionCall().postForObject(OPENAI_CHAT_COMPLETION_API, request, FunctionResponse.class); - - if (response == null - || response.getChoices().isEmpty() - || response.getChoices().get(0).getMessage().getFunction_call().getArguments() == null - || response - .getChoices() - .get(0) - .getMessage() - .getFunction_call() - .getArguments() - .isEmpty()) { - System.out.println( - "ChatGptResponse is null or empty. There was an error processing the request."); - return "ChatGptResponse is empty. There was an error processing the request. Please try" - + " again."; - } else { - try { - JsonNode jsonNode = - objectMapper.readTree( - response.getChoices().get(0).getMessage().getFunction_call().getArguments()); - System.out.println("The response is a valid JSON string." + jsonNode); - } catch (Exception e) { - System.out.println("The response is not a valid JSON string."); - } - return response.getChoices().get(0).getMessage().getFunction_call().getArguments(); - } - } - } -} diff --git a/Examples/json/function.jsonnet b/Examples/json/function.jsonnet deleted file mode 100644 index 3e718a211..000000000 --- a/Examples/json/function.jsonnet +++ /dev/null @@ -1,9 +0,0 @@ - -local functionPrompt = std.join(" ",[ - payload.prompt+"I need a Exact json format like this: ", - payload.format -]); - -{ - "functionPrompt": functionPrompt -} \ No newline at end of file diff --git a/Examples/json/json-format.jsonnet b/Examples/json/json-format.jsonnet deleted file mode 100644 index a6ba76ad3..000000000 --- a/Examples/json/json-format.jsonnet +++ /dev/null @@ -1,38 +0,0 @@ -local extract = std.join(" ", [ - "INPUT = " + payload.prompt, - " EXTRACTED = " + payload.format, - " Return EXTRACTED as a valid JSON object." -]); - -local actionPrompt = std.join(" ", [ - "This is the situation: " + payload.situation, - " These are the set of valid actions to take: " + payload.validAction, - payload.callToAction -]); - -local validActionCheckPrompt = std.join(" ", [ - "Given the situation: " + payload.situation, - " And the action you choose: " + payload.response1, - " Is the action you in this set of valid actions: " + payload.validAction, - "? If not, choose the best valid action to take. If so, please return the original action" -]); - -local ActionFormatPrompt = std.join(" ",[ - "This is the correct format for an action: " + payload.actionFormat, - " This is the chosen action: " + payload.response2, - " Convert the chosen action to the correct format." -]); - -local getValidFormat = std.join(" ",[ - "This is the correct format for an action: " + payload.actionFormat, - " This is a formatted action: " + payload.response3, - " Return the action in the correct format." -]); - -{ - "extract": extract, - "actionPrompt": actionPrompt, - "validActionCheckPrompt" : validActionCheckPrompt, - "ActionFormatPrompt":ActionFormatPrompt, - "getValidFormat":getValidFormat -} diff --git a/Examples/pinecone/PineconeExample.java b/Examples/pinecone/PineconeExample.java deleted file mode 100644 index 8f98764e6..000000000 --- a/Examples/pinecone/PineconeExample.java +++ /dev/null @@ -1,371 +0,0 @@ -package com.edgechain; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; - -import com.edgechain.lib.chains.PineconeRetrieval; -import com.edgechain.lib.chains.Retrieval; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.reader.impl.PdfReader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.response.ArkResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.*; - -@SpringBootApplication -public class PineconeExample { - - private static final String OPENAI_AUTH_KEY = ""; - private static final String PINECONE_AUTH_KEY = ""; - private static final String PINECONE_QUERY_API = ""; - private static final String PINECONE_UPSERT_API = ""; - private static final String PINECONE_DELETE = ""; - - private static OpenAiEndpoint ada002Embedding; - private static OpenAiEndpoint gpt3Endpoint; - - private static PineconeEndpoint upsertPineconeEndpoint; - private static PineconeEndpoint queryPineconeEndpoint; - - private static PineconeEndpoint deletePineconeEndpoint; - - private static RedisHistoryContextEndpoint contextEndpoint; - - private JsonnetLoader queryLoader = new FileJsonnetLoader("./pinecone/pinecone-query.jsonnet"); - private JsonnetLoader chatLoader = new FileJsonnetLoader("./pinecone/pinecone-chat.jsonnet"); - - public static void main(String[] args) { - System.setProperty("server.port", "8080"); - Properties properties = new Properties(); - - properties.setProperty("spring.jpa.show-sql", "true"); - properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); - - // Adding Cors ==> You can configure multiple cors w.r.t your urls.; - properties.setProperty("cors.origins", "http://localhost:4200"); - - // Redis Configuration - properties.setProperty("redis.url", ""); - properties.setProperty("redis.port", "12285"); - properties.setProperty("redis.username", "default"); - properties.setProperty("redis.password", ""); - properties.setProperty("redis.ttl", "3600"); - - // If you want to use PostgreSQL only; then just provide dbHost, dbUsername & dbPassword. - // If you haven't specified PostgreSQL, then logs won't be stored. - properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); - properties.setProperty("postgres.db.password", ""); - - new SpringApplicationBuilder(PineconeExample.class).properties(properties).run(args); - - // Variables Initialization ==> Endpoints must be intialized in main method... - ada002Embedding = - new OpenAiEndpoint( - OPENAI_EMBEDDINGS_API, - OPENAI_AUTH_KEY, - "text-embedding-ada-002", - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - gpt3Endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - upsertPineconeEndpoint = - new PineconeEndpoint( - PINECONE_UPSERT_API, - PINECONE_AUTH_KEY, - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - queryPineconeEndpoint = - new PineconeEndpoint( - PINECONE_QUERY_API, PINECONE_AUTH_KEY, new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - deletePineconeEndpoint = - new PineconeEndpoint( - PINECONE_DELETE, PINECONE_AUTH_KEY, new FixedDelay(4, 5, TimeUnit.SECONDS)); - - contextEndpoint = - new RedisHistoryContextEndpoint(new ExponentialDelay(2, 2, 2, TimeUnit.SECONDS)); - } - - /** - * By Default, every API is unauthenticated & exposed without any sort of authentication; To - * authenticate, your custom APIs in Controller you would need @PreAuthorize(hasAuthority("")); - * this will authenticate by JWT having two fields: a) email, b) role:"authenticated,user_create" - * To authenticate, internal APIs related to historyContext & Logging, Delete Redis/Postgres we - * need to create bean of AuthFilter; you can uncomment the code. Note, you need to define - * "jwt.secret" property as well to decode accessToken. - */ - // @Bean - // @Primary - // public AuthFilter authFilter() { - // AuthFilter filter = new AuthFilter(); - // // ======== new MethodAuthentication(List.of(APIs), authorities) ============= - // filter.setRequestPost(new MethodAuthentication(List.of("/v1/postgresql/historycontext"), - // "authenticated")); // define multiple roles by comma - // filter.setRequestGet(new MethodAuthentication(List.of(""), "")); - // filter.setRequestDelete(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPatch(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPut(new MethodAuthentication(List.of(""), "")); - // return filter; - // } - - @RestController - public class PineconeController { - - @Autowired private PdfReader pdfReader; - - /********************** PINECONE WITH OPENAI ****************************/ - - /** - * Namespace: VectorDb allows you to partition the vectors in an index into namespaces. Queries - * and other operations are then limited to one namespace, so different requests can search - * different subsets of your index. If namespace is null or empty, in pinecone it will be - * prefixed as "" empty string & in redis it will be prefixed as "knowledge" For example, you - * might want to define a namespace for indexing books by finance, law, medicine etc.. Can be - * used in multiple use-cases.... such as User uploading book, generating unique namespace & - * then querying/chatting with it.. - * - * @param arkRequest - * @return - */ - // Namespace is optional (if not provided, it will be using Empty String "") - @PostMapping("/pinecone/upsert") // /v1/examples/openai/upsert?namespace=machine-learning - public void upsertPinecone(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); - InputStream file = arkRequest.getMultiPart("file").getInputStream(); - - // Configure Pinecone - upsertPineconeEndpoint.setNamespace(namespace); - - String[] arr = pdfReader.readByChunkSize(file, 512); - - /** - * Retrieval Class is basically used to generate embeddings & upsert it to VectorDB; If OpenAI - * Embedding Endpoint is not provided; then Doc2Vec constructor is used If the model is not - * provided, then it will emit an error - */ - Retrieval retrieval = - new PineconeRetrieval(upsertPineconeEndpoint, ada002Embedding, arkRequest); - - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); - } - - @PostMapping(value = "/pinecone/query") - public ArkResponse query(ArkRequest arkRequest) { - - String namespace = arkRequest.getQueryParam("namespace"); - String query = arkRequest.getBody().getString("query"); - int topK = arkRequest.getIntQueryParam("topK"); - - // Configure Pinecone - queryPineconeEndpoint.setNamespace(namespace); - - // Step 1: Chain ==> Get Embeddings From Input & Then Query To Pinecone - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Step 2: Chain ==> Query Embeddings from Pinecone - EdgeChain> queryChain = - new EdgeChain<>(queryPineconeEndpoint.query(embeddingsChain.get(), topK)); - - // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to - // OpenAI - EdgeChain> gpt3Chain = - queryChain.transform(wordEmbeddings -> queryFn(wordEmbeddings, arkRequest)); - - return gpt3Chain.getArkResponse(); - } - - /** - * For chatting, you need to create a historyContext via Redis/PostgreSQL. Implementation is - * provided above. - * - * @param arkRequest - * @return - */ - @PostMapping(value = "/pinecone/chat") - public ArkResponse chatWithPinecone(ArkRequest arkRequest) { - - String contextId = arkRequest.getQueryParam("id"); - String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); - boolean stream = arkRequest.getBooleanHeader("stream"); - - // Configure Pinecone - queryPineconeEndpoint.setNamespace(namespace); - - // Configure GPT3endpoint - gpt3Endpoint.setStream(stream); - - // Get HistoryContext - HistoryContext historyContext = contextEndpoint.get(contextId); - - // Load Jsonnet To extract topK query dynamically - chatLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("query", new JsonnetArgs(DataType.STRING, query)) - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "false")) - .loadOrReload(); - - // Extract topK value from JsonnetLoader; - int topK = chatLoader.getInt("topK"); - - // Chain 1 ==> Get Embeddings From Input - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from Pinecone & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method - EdgeChain> pineconeChain = - new EdgeChain<>(queryPineconeEndpoint.query(embeddingsChain.get(), topK)); - - // Chain 3 ===> Transform String of Queries into List - EdgeChain queryChain = - new EdgeChain<>(pineconeChain) - .transform( - pineconeResponse -> { - List queryList = new ArrayList<>(); - pineconeResponse.get().forEach(q -> queryList.add(q.getId())); - return String.join("\n", queryList); - }); - - // Chain 4 ===> Create fn() to prepare your chat prompt - EdgeChain promptChain = - queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion(promptChain.get(), "PineconeChatChain", arkRequest)); - - // (FOR NON STREAMING) - // If it's not stream ==> - // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - if (!stream) { - - // Chain 6 - EdgeChain historyUpdatedChain = - gpt3Chain.doOnNext( - chatResponse -> - contextEndpoint.put( - historyContext.getId(), - query - + chatResponse.getChoices().get(0).getMessage().getContent() - + historyContext.getResponse())); - - return historyUpdatedChain.getArkResponse(); - } - - // For STREAMING Version - else { - - /* As the response is in stream, so we will use StringBuilder to append the response - and once GPT chain indicates that it is finished, we will save the following into Postgres - Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - */ - - StringBuilder stringBuilder = new StringBuilder(); - - // Chain 7 - EdgeChain streamingOutputChain = - gpt3Chain.doOnNext( - chatResponse -> { - if (Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - stringBuilder.append( - chatResponse.getChoices().get(0).getMessage().getContent()); - } - // Now the streaming response is ended. Save it to DB i.e. HistoryContext - else { - contextEndpoint.put( - historyContext.getId(), - query + stringBuilder + historyContext.getResponse()); - } - }); - - return streamingOutputChain.getArkStreamResponse(); - } - } - - // Namespace is optional (if not provided, it will be using Empty String "") - @DeleteMapping("/pinecone/deleteAll") - public ArkResponse deletePinecone(ArkRequest arkRequest) { - String namespace = arkRequest.getQueryParam("namespace"); - deletePineconeEndpoint.setNamespace(namespace); - return new EdgeChain<>(deletePineconeEndpoint.deleteAll()).getArkResponse(); - } - - public List queryFn( - List wordEmbeddings, ArkRequest arkRequest) { - - List resp = new ArrayList<>(); - - // Iterate over each Query result; returned from Pinecone - for (WordEmbeddings wordEmbedding : wordEmbeddings) { - - String query = wordEmbedding.getId(); - - queryLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "context", - new JsonnetArgs( - DataType.STRING, - query)) // Step 3: Concatenate the Prompt: ${Base Prompt} - ${Pinecone - // Output} - .loadOrReload(); - // Step 4: Now, pass the prompt to OpenAI ChatCompletion & Add it to the list which will be - // returned - resp.add( - new EdgeChain<>( - gpt3Endpoint.chatCompletion( - queryLoader.get("prompt"), "PineconeQueryChain", arkRequest)) - .get()); - } - - return resp; - } - - public String chatFn(String chatHistory, String queries) { - chatLoader - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "history", - new JsonnetArgs(DataType.STRING, chatHistory)) // Getting ChatHistory from Mapper - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("context", new JsonnetArgs(DataType.STRING, queries)) // Getting Queries from Mapper - .loadOrReload(); // Step 5: Pass the Args & Reload Jsonnet - - return chatLoader.get("prompt"); - } - } -} diff --git a/Examples/pinecone/pinecone-chat.jsonnet b/Examples/pinecone/pinecone-chat.jsonnet deleted file mode 100644 index cfc48da47..000000000 --- a/Examples/pinecone/pinecone-chat.jsonnet +++ /dev/null @@ -1,20 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - Use the following pieces of context to answer the question at the end. If - you don't know the answer, just say that you don't know, don't try to make up an answer. - |||; -local query = "Question: "+ payload.query; -local context = if(payload.keepContext == "true") then payload.context else ""; -local history = "Chat History: "+ if(payload.keepHistory == "true") then payload.history else ""; - -local prompt = std.join("\n", [query, preset, context, history]); -{ - "maxTokens": maxTokens, - "topK": 5, - "query": query, - "preset" : preset, - "context": context, - "history": history, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/pinecone/pinecone-query.jsonnet b/Examples/pinecone/pinecone-query.jsonnet deleted file mode 100644 index 959817947..000000000 --- a/Examples/pinecone/pinecone-query.jsonnet +++ /dev/null @@ -1,14 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - Use the following pieces of context to answer the question at the end. If - you don't know the answer, just say that you don't know, don't try to make up an answer. - |||; -local context = if(payload.keepContext == "true") then payload.context else ""; -local prompt = std.join("\n", [preset, context]); -{ - "maxTokens": maxTokens, - "preset" : preset, - "context": context, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/postgresql/PostgreSQLExample.java b/Examples/postgresql/PostgreSQLExample.java deleted file mode 100644 index 2c5e0b36c..000000000 --- a/Examples/postgresql/PostgreSQLExample.java +++ /dev/null @@ -1,333 +0,0 @@ -package com.edgechain; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; - -import com.edgechain.lib.chains.PostgresRetrieval; -import com.edgechain.lib.chains.Retrieval; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.*; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.reader.impl.PdfReader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.response.ArkResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; - -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.*; - -@SpringBootApplication -public class PostgreSQLExample { - - private static final String OPENAI_AUTH_KEY = ""; - - private static OpenAiEndpoint ada002Embedding; - private static OpenAiEndpoint gpt3Endpoint; - private static PostgresEndpoint postgresEndpoint; - private static PostgreSQLHistoryContextEndpoint contextEndpoint; - - private JsonnetLoader queryLoader = new FileJsonnetLoader("./postgres/postgres-query.jsonnet"); - private JsonnetLoader chatLoader = new FileJsonnetLoader("./postgres/postgres-chat.jsonnet"); - - public static void main(String[] args) { - - System.setProperty("server.port", "8080"); - - Properties properties = new Properties(); - - // Should only be used in dev environment - properties.setProperty("spring.jpa.show-sql", "true"); - properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); - - // Adding Cors ==> You can configure multiple cors w.r.t your urls.; - properties.setProperty("cors.origins", "http://localhost:4200"); - - // If you want to use PostgreSQL only; then just provide dbHost, dbUsername & dbPassword. - // If you haven't specified PostgreSQL, then logs won't be stored. - properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); - properties.setProperty("postgres.db.password", ""); - - new SpringApplicationBuilder(PostgreSQLExample.class).properties(properties).run(args); - - // Variables Initialization ==> Endpoints must be intialized in main method... - ada002Embedding = - new OpenAiEndpoint( - OPENAI_EMBEDDINGS_API, - OPENAI_AUTH_KEY, - "text-embedding-ada-002", - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - gpt3Endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - postgresEndpoint = - new PostgresEndpoint("spring_vectors", new ExponentialDelay(5, 5, 2, TimeUnit.SECONDS)); - contextEndpoint = new PostgreSQLHistoryContextEndpoint(new FixedDelay(2, 3, TimeUnit.SECONDS)); - } - - /** - * By Default, every API is unauthenticated & exposed without any sort of authentication; To - * authenticate, your custom APIs in Controller you would need @PreAuthorize(hasAuthority("")); - * this will authenticate by JWT having two fields: a) email, b) role To authenticate, internal - * APIs related to historyContext & Logging, Delete Redis/Postgres we need to create bean of - * AuthFilter; you can uncomment the code. Note, you need to define "jwt.secret" property as well - * to decode accessToken. - */ - // @Bean - // @Primary - // public AuthFilter authFilter() { - // AuthFilter filter = new AuthFilter(); - // // new MethodAuthentication(List.of(APIs), roles) - // filter.setRequestPost(new MethodAuthentication(List.of("/v1/postgresql/historycontext"), - // "authenticated")); // define multiple roles by comma - // filter.setRequestGet(new MethodAuthentication(List.of(""), "")); - // filter.setRequestDelete(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPatch(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPut(new MethodAuthentication(List.of(""), "")); - // return filter; - // } - - @RestController - public class PostgreSQLController { - - @Autowired private PdfReader pdfReader; - - // ========== PGVectors ============== - - // Concept of Namespace // - /* - * Namespace: VectorDb allows you to partition the vectors in an index into namespaces. Queries - * and other operations are then limited to one namespace, so different requests can search - * different subsets of your index. If namespace is null or empty, in pinecone it will be - * prefixed as "" empty string & in redis it will be prefixed as "knowledge" For example, you - * might want to define a namespace for indexing books by finance, law, medicine etc.. Can be - * used in multiple use-cases.... such as User uploading book, generating unique namespace & - * then querying/chatting with it... - * - */ - - /** - * If namespace is empty string or null, then the default namespace is 'knowledge'==> The - * concept of namespace is defined above * - */ - @PostMapping("/postgres/upsert") - public void upsert(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); - String filename = arkRequest.getMultiPart("file").getSubmittedFileName(); - InputStream file = arkRequest.getMultiPart("file").getInputStream(); - - postgresEndpoint.setNamespace(namespace); - - String[] arr = pdfReader.readByChunkSize(file, 512); - - final Retrieval retrieval = - new PostgresRetrieval(postgresEndpoint, filename, 1536, ada002Embedding, arkRequest); - - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); - } - - @PostMapping(value = "/postgres/query") - public ArkResponse query(ArkRequest arkRequest) { - - String namespace = arkRequest.getQueryParam("namespace"); - String query = arkRequest.getBody().getString("query"); - int topK = arkRequest.getIntQueryParam("topK"); - - postgresEndpoint.setNamespace(namespace); - - // Chain 1==> Get Embeddings From Input & Then Query To PostgreSQL - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from PostgreSQL - EdgeChain> queryChain = - new EdgeChain<>( - postgresEndpoint.query( - embeddingsChain.get(), PostgresDistanceMetric.IP, topK, 10)); // defining probes - - // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to - // OpenAI - EdgeChain> gpt3Chain = - queryChain.transform(wordEmbeddings -> queryFn(wordEmbeddings, arkRequest)); - - return gpt3Chain.getArkResponse(); - } - - @PostMapping(value = "/postgres/chat") - public ArkResponse chat(ArkRequest arkRequest) { - - String contextId = arkRequest.getQueryParam("id"); - - String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); - - boolean stream = arkRequest.getBooleanHeader("stream"); - - // Configure PostgresEndpoint - postgresEndpoint.setNamespace(namespace); - - gpt3Endpoint.setStream(stream); - - // Get HistoryContext - HistoryContext historyContext = contextEndpoint.get(contextId); - - // Load Jsonnet To extract topK query dynamically - chatLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("query", new JsonnetArgs(DataType.STRING, query)) - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "false")) - .loadOrReload(); - - // Extract topK value from JsonnetLoader; - int topK = chatLoader.getInt("topK"); - - // Chain 1 ==> Get Embeddings From Input - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from PostgreSQL & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method - EdgeChain> postgresChain = - new EdgeChain<>( - postgresEndpoint.query(embeddingsChain.get(), PostgresDistanceMetric.L2, topK)); - - // Chain 3 ===> Transform String of Queries into List - EdgeChain queryChain = - new EdgeChain<>(postgresChain) - .transform( - postgresResponse -> { - List queryList = new ArrayList<>(); - postgresResponse.get().forEach(q -> queryList.add(q.getRawText())); - return String.join("\n", queryList); - }); - - // Chain 4 ===> Create fn() to prepare your chat prompt - EdgeChain promptChain = - queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion(promptChain.get(), "PostgresChatChain", arkRequest)); - - // (FOR NON STREAMING) - // If it's not stream ==> - // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - if (!stream) { - - // Chain 6 - EdgeChain historyUpdatedChain = - gpt3Chain.doOnNext( - chatResponse -> - contextEndpoint.put( - historyContext.getId(), - query - + chatResponse.getChoices().get(0).getMessage().getContent() - + historyContext.getResponse())); - - return historyUpdatedChain.getArkResponse(); - } - - // For STREAMING Version - else { - - /* As the response is in stream, so we will use StringBuilder to append the response - and once GPT chain indicates that it is finished, we will save the following into Postgres - Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - */ - - StringBuilder stringBuilder = new StringBuilder(); - - // Chain 7 - EdgeChain streamingOutputChain = - gpt3Chain.doOnNext( - chatResponse -> { - if (Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - stringBuilder.append( - chatResponse.getChoices().get(0).getMessage().getContent()); - } - // Now the streaming response is ended. Save it to DB i.e. HistoryContext - else { - contextEndpoint.put( - historyContext.getId(), - query + stringBuilder + historyContext.getResponse()); - } - }); - - return streamingOutputChain.getArkStreamResponse(); - } - } - - public List queryFn( - List wordEmbeddings, ArkRequest arkRequest) { - - List resp = new ArrayList<>(); - - // Iterate over each Query result; returned from Postgres - for (PostgresWordEmbeddings wordEmbedding : wordEmbeddings) { - - String query = wordEmbedding.getRawText(); - - queryLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "context", - new JsonnetArgs( - DataType.STRING, - query)) // Step 3: Concatenate the Prompt: ${Base Prompt} - ${Postgres - // Output} - .loadOrReload(); - // Step 4: Now, pass the prompt to OpenAI ChatCompletion & Add it to the list which will be - // returned - resp.add( - new EdgeChain<>( - gpt3Endpoint.chatCompletion( - queryLoader.get("prompt"), "PostgresQueryChain", arkRequest)) - .get()); - } - - return resp; - } - } - - public String chatFn(String chatHistory, String queries) { - chatLoader - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "history", - new JsonnetArgs(DataType.STRING, chatHistory)) // Getting ChatHistory from Mapper - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("context", new JsonnetArgs(DataType.STRING, queries)) // Getting Queries from Mapper - .loadOrReload(); // Step 5: Pass the Args & Reload Jsonnet - - return chatLoader.get("prompt"); - } -} diff --git a/Examples/postgresql/postgres-chat.jsonnet b/Examples/postgresql/postgres-chat.jsonnet deleted file mode 100644 index 9fdaf9d1d..000000000 --- a/Examples/postgresql/postgres-chat.jsonnet +++ /dev/null @@ -1,23 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - You will be given context that may or may not be related to the question. If the context is related to the question, use it to answer the question. - Otherwise, say that you don't know the answer, and attempt to answer it anyways using an 'In General' format - Follow Up Input: {question} - Context: {context} - Chat History: {chat_history} - |||; -local query = "Question: "+ payload.query; -local context = if(payload.keepContext == "true") then payload.context else ""; -local history = "Chat History: "+ if(payload.keepHistory == "true") then payload.history else ""; - -local prompt = std.join("\n", [query, preset, context, history]); -{ - "maxTokens": maxTokens, - "topK": 5, - "query": query, - "preset" : preset, - "context": context, - "history": history, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/postgresql/postgres-query.jsonnet b/Examples/postgresql/postgres-query.jsonnet deleted file mode 100644 index b8e385a57..000000000 --- a/Examples/postgresql/postgres-query.jsonnet +++ /dev/null @@ -1,14 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - You will be given context that may or may not be related to the question. If the context is related to the question, use it to answer the question. - Otherwise, say that you don't know the answer, and attempt to answer it anyways using an 'In General' format - |||; -local context = if(payload.keepContext == "true") then payload.context else ""; -local prompt = std.join("\n", [preset, context]); -{ - "maxTokens": maxTokens, - "preset" : preset, - "context": context, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/react-chain/ReactChainApplication.java b/Examples/react-chain/ReactChainApplication.java deleted file mode 100644 index b8c848f25..000000000 --- a/Examples/react-chain/ReactChainApplication.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.edgechain; - -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; - -@SpringBootApplication -public class ReactChainApplication { - - private static final String OPENAI_AUTH_KEY = ""; - - private static OpenAiEndpoint userChatEndpoint; - - public static void main(String[] args) { - System.setProperty("server.port", "8080"); - - Properties properties = new Properties(); - - properties.setProperty("spring.jpa.show-sql", "true"); - properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); - - // Adding Cors ==> You can configure multiple cors w.r.t your urls.; - properties.setProperty("cors.origins", "http://localhost:4200"); - - // If you want to use PostgreSQL only; then just provide dbHost, dbUsername & dbPassword. - // If you haven't specified PostgreSQL, then logs won't be stored. - properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", ""); - properties.setProperty("postgres.db.password", ""); - - new SpringApplicationBuilder(ReactChainApplication.class).properties(properties).run(args); - - userChatEndpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - } - - @RestController - @RequestMapping("/v1/examples") - public class ExampleController { - - @GetMapping(value = "/react-chain") - public String reactChain(ArkRequest arkRequest) { - String prompt = (String) arkRequest.getBody().get("prompt"); - StringBuilder context = new StringBuilder(); - JsonnetLoader loader = - new FileJsonnetLoader("./react-chain.jsonnet") - .put("context", new JsonnetArgs(DataType.STRING, "This is context")) - .put("gptResponse", new JsonnetArgs(DataType.STRING, "")) - .loadOrReload(); - String preset = loader.get("preset"); - - prompt = preset + " \nQuestion: " + prompt; - - String gptResponse = - userChatEndpoint - .chatCompletion(prompt, "React-Chain", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - context.append(prompt); - loader.put("context", new JsonnetArgs(DataType.STRING, context.toString())); - loader.put("gptResponse", new JsonnetArgs(DataType.STRING, gptResponse)); - - while (!checkIfFinished(gptResponse)) { - loader.loadOrReload(); - prompt = loader.get("prompt"); - gptResponse = - userChatEndpoint - .chatCompletion(prompt, "React-Chain", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - context.append("\n" + prompt); - loader.put("context", new JsonnetArgs(DataType.STRING, context.toString())); - loader.put("gptResponse", new JsonnetArgs(DataType.STRING, gptResponse)); - } - return gptResponse.substring(gptResponse.indexOf("Finish[") + 7, gptResponse.indexOf("]")); - } - - private boolean checkIfFinished(String gptResponse) { - return gptResponse.contains("Finish"); - } - } -} diff --git a/Examples/react-chain/react-chain.jsonnet b/Examples/react-chain/react-chain.jsonnet deleted file mode 100644 index 5f2c25d20..000000000 --- a/Examples/react-chain/react-chain.jsonnet +++ /dev/null @@ -1,77 +0,0 @@ - -local config = { - "edgechains.config": { - "mapper": { - "search": udf.fn, - }, - }, -}; - -local callFunction(funcName) = - local mapper = config["edgechains.config"].mapper; - mapper[funcName]; -local preset = ||| - You are a Reasoning + Acting (React) Chain Bot. You have to be interactive so ask the queries one by one from the user to reach to the final answer. Please provide a single Thought and single Action to the user so that the user can search the query of the action and provide you with the observation. When you have found the answer to the original prompt then the final response should be Action: Finish[Answer to the original prompt]. - For example the chain would be like this: - - Question: Which magazine was started first Arthur's Magazine or First for Women? - Thought 1: I need to search Arthur's Magazine and First for Women, and find which was - started first. - Action 1: Search[Arthur's Magazine] - Observation 1: Arthur's Magazine (1844-1846) was an American literary periodical published - in Philadelphia in the 19th century. - Thought 2: Arthur's Magazine was started in 1844. I need to search First for Women - next. - Action 2: Search[First for Women] - Observation 2: First for Women is a woman’s magazine published by Bauer Media Group in the - USA.[1] The magazine was started in 1989. - Thought 3: First for Women was started in 1989. 1844 (Arthur's Magazine) < 1989 (First - for Women), so Arthur's Magazine was started first. - Action 3: Finish[Arthur's Magazine] - - Question: Were Pavel Urysohn and Leonid Levin known for the same type of work? - Thought 1: I need to search Pavel Urysohn and Leonid Levin, find their types of work, - then find if they are the same. - Action 1: Search[Pavel Urysohn] - Observation 1: Pavel Samuilovich Urysohn (February 3, 1898 - August 17, 1924) was a Soviet - mathematician who is best known for his contributions in dimension theory. - Thought 2: Pavel Urysohn is a mathematician. I need to search Leonid Levin next and - find its type of work. - Action 2: Search[Leonid Levin] - Observation 2: Leonid Anatolievich Levin is a Soviet-American mathematician and computer - scientist. - Thought 3: Leonid Levin is a mathematician and computer scientist. So Pavel Urysohn - and Leonid Levin have the same type of work. - Action 3: Finish[yes] - - **ALL THE OBSERVATIONS WILL BE PROVIDED BY THE USER, YOU DON'T HAVE TO PROVIDE ANY OBSERVATION** - |||; - -//To extract action from the response -local extractAction(str) = - local action = xtr.strings.substringBefore(xtr.strings.substringAfter(str, "["), "]"); - action; - -//To extract thought from the response -local extractThought(str) = - local thought = xtr.strings.substringAfter(xtr.strings.substringBefore(str, "Action"), ":"); - thought; - -local gptResponse = payload.gptResponse; //this will be populated from the java code after the prompt is submitted to gpt -local action = extractAction(gptResponse); -local thought = extractThought(gptResponse); -local searchResponse = std.substr(callFunction("search")(action), 0, 200); //extract action from response and insert here -local observation = xtr.join(["Observation:", searchResponse], ''); -local context = payload.context + "\n" + gptResponse + "\n" + observation; -local prompt = xtr.strings.appendIfMissing(context, "\n" + observation); -{ - observation: observation, - thought: thought, - action: action, - preset: preset, - prompt: prompt, - context: context, - searchResponse: searchResponse, - gptResponse: gptResponse -} - diff --git a/Examples/redis/RedisExample.java b/Examples/redis/RedisExample.java deleted file mode 100644 index 603970750..000000000 --- a/Examples/redis/RedisExample.java +++ /dev/null @@ -1,360 +0,0 @@ -package com.edgechain; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; - -import com.edgechain.lib.chains.RedisRetrieval; -import com.edgechain.lib.chains.Retrieval; -import com.edgechain.lib.chunk.enums.LangType; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.*; -import com.edgechain.lib.index.enums.RedisDistanceMetric; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.reader.impl.PdfReader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.response.ArkResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; - -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.*; - -@SpringBootApplication -public class RedisExample { - - private static final String OPENAI_AUTH_KEY = ""; - private static OpenAiEndpoint ada002Embedding; - private static OpenAiEndpoint gpt3Endpoint; - private static RedisEndpoint redisEndpoint; - private static RedisHistoryContextEndpoint contextEndpoint; - - private JsonnetLoader queryLoader = new FileJsonnetLoader("./redis/redis-query.jsonnet"); - private JsonnetLoader chatLoader = new FileJsonnetLoader("./redis/redis-chat.jsonnet"); - - public static void main(String[] args) { - System.setProperty("server.port", "8080"); - - Properties properties = new Properties(); - - properties.setProperty("spring.jpa.show-sql", "true"); - properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); - - // Adding Cors ==> You can configure multiple cors w.r.t your urls.; - properties.setProperty("cors.origins", "http://localhost:4200"); - - // If you want to use PostgreSQL only; then just provide dbHost, dbUsername & dbPassword. - // If you haven't specified PostgreSQL, then logs won't be stored. - properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); - properties.setProperty("postgres.db.password", ""); - - // Redis Configuration - properties.setProperty("redis.url", ""); - properties.setProperty("redis.port", "12285"); - properties.setProperty("redis.username", "default"); - properties.setProperty("redis.password", ""); - properties.setProperty("redis.ttl", "3600"); - - new SpringApplicationBuilder(RedisExample.class).properties(properties).run(args); - - // Variables Initialization ==> Endpoints must be intialized in main method... - ada002Embedding = - new OpenAiEndpoint( - OPENAI_EMBEDDINGS_API, - OPENAI_AUTH_KEY, - "text-embedding-ada-002", - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - gpt3Endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - redisEndpoint = - new RedisEndpoint("vector_index", new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - contextEndpoint = - new RedisHistoryContextEndpoint(new ExponentialDelay(2, 2, 2, TimeUnit.SECONDS)); - } - - /** - * By Default, every API is unauthenticated & exposed without any sort of authentication; To - * authenticate, your custom APIs in Controller you would need @PreAuthorize(hasAuthority("")); - * this will authenticate by JWT having two fields: a) email, b) role To authenticate, internal - * APIs related to historyContext & Logging, Delete Redis/Postgres we need to create bean of - * AuthFilter; you can uncomment the code. Note, you need to define "jwt.secret" property as well - * to decode accessToken. - */ - // @Bean - // @Primary - // public AuthFilter authFilter() { - // AuthFilter filter = new AuthFilter(); - // // new MethodAuthentication(List.of(APIs), roles) - // filter.setRequestPost(new MethodAuthentication(List.of("/v1/postgresql/historycontext"), - // "authenticated")); // define multiple roles by comma - // filter.setRequestGet(new MethodAuthentication(List.of(""), "")); - // filter.setRequestDelete(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPatch(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPut(new MethodAuthentication(List.of(""), "")); - // return filter; - // } - - @RestController - public class RedisController { - - @Autowired private PdfReader pdfReader; - - /********************** REDIS WITH OPENAI ****************************/ - - // Namespace is optional (if not provided, it will be using namespace will be "knowledge") - @PostMapping("/redis/upsert") // /v1/examples/openai/upsert?namespace=machine-learning - public void upsert(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); - InputStream file = arkRequest.getMultiPart("file").getInputStream(); - - /** - * Both IndexName & namespace are integral for upsert & performing similarity search; If you - * are creating different namespace; recommended to use different index_name because filtering - * is done by index_name * - */ - // Configure RedisEndpoint - redisEndpoint.setNamespace(namespace); - - /** - * We have two implementation for Read By Sentence: a) readBySentence(LangType, Your File) - * EdgeChains sdk has predefined support to chunk by sentences w.r.t to 5 languages (english, - * france, german, italy, dutch....) - * - *

    b) readBySentence(Custom OpenNLP Trained Model, Your File) - */ - String[] arr = pdfReader.readBySentence(LangType.EN, file); - - /** - * Retrieval Class is basically used to generate embeddings & upsert it to VectorDB; If OpenAI - * Embedding Endpoint is not provided; then Doc2Vec constructor is used If the model is not - * provided, then it will emit an error - */ - Retrieval retrieval = - new RedisRetrieval( - redisEndpoint, ada002Embedding, 1536, RedisDistanceMetric.COSINE, arkRequest); - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); - } - - /** - * Objective: I want to pass input, generate embeddings using OpenAI and get results from Redis - * - * @param arkRequest - * @return - */ - @PostMapping(value = "/redis/similarity-search") - public ArkResponse similaritySearch(ArkRequest arkRequest) { - - String namespace = arkRequest.getQueryParam("namespace"); - String query = arkRequest.getBody().getString("query"); - int topK = arkRequest.getIntQueryParam("topK"); - - redisEndpoint.setNamespace(namespace); - - // Chain 1 ==> Generate Embeddings Using Ada002 - EdgeChain ada002Chain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Pass those embeddings to Redis & Return Score/values (Similarity search) - EdgeChain> redisQueries = - new EdgeChain<>(redisEndpoint.query(ada002Chain.get(), topK)); - - return redisQueries.getArkResponse(); - } - - @PostMapping(value = "/redis/query") - public ArkResponse queryRedis(ArkRequest arkRequest) { - - String namespace = arkRequest.getQueryParam("namespace"); - String query = arkRequest.getBody().getString("query"); - int topK = arkRequest.getIntQueryParam("topK"); - - redisEndpoint.setNamespace(namespace); - - // Chain 1==> Get Embeddings From Input & Then Query To Redis - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from Redis - EdgeChain> queryChain = - new EdgeChain<>(redisEndpoint.query(embeddingsChain.get(), topK)); - - // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to - // OpenAI - EdgeChain> gpt3Chain = - queryChain.transform(wordEmbeddings -> queryFn(wordEmbeddings, arkRequest)); - - return gpt3Chain.getArkResponse(); - } - - @PostMapping(value = "/redis/chat") - public ArkResponse chatWithRedis(ArkRequest arkRequest) { - - String contextId = arkRequest.getQueryParam("id"); - String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); - boolean stream = arkRequest.getBooleanHeader("stream"); - - // configure GPT3Endpoint - gpt3Endpoint.setStream(stream); - - redisEndpoint.setNamespace(namespace); - - // Get HistoryContext - HistoryContext historyContext = contextEndpoint.get(contextId); - - // Load Jsonnet To extract topK query dynamically - chatLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("query", new JsonnetArgs(DataType.STRING, query)) - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "false")) - .loadOrReload(); - - // Extract topK value from JsonnetLoader; - int topK = chatLoader.getInt("topK"); - - // Chain 1 ==> Get Embeddings From Input - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from Redis & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method - EdgeChain> redisChain = - new EdgeChain<>(redisEndpoint.query(embeddingsChain.get(), topK)); - - // Chain 3 ===> Transform String of Queries into List - EdgeChain queryChain = - new EdgeChain<>(redisChain) - .transform( - redisResponse -> { - List queryList = new ArrayList<>(); - redisResponse.get().forEach(q -> queryList.add(q.getId())); - return String.join("\n", queryList); - }); - - // Chain 4 ===> Create fn() to prepare your chat prompt - EdgeChain promptChain = - queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion(promptChain.get(), "RedisChatChain", arkRequest)); - - // (FOR NON STREAMING) - // If it's not stream ==> - // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - if (!stream) { - - // Chain 6 - EdgeChain historyUpdatedChain = - gpt3Chain.doOnNext( - chatResponse -> - contextEndpoint.put( - historyContext.getId(), - query - + chatResponse.getChoices().get(0).getMessage().getContent() - + historyContext.getResponse())); - - return historyUpdatedChain.getArkResponse(); - } - - // For STREAMING Version - else { - - /* As the response is in stream, so we will use StringBuilder to append the response - and once GPT chain indicates that it is finished, we will save the following into Redis - Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - */ - - StringBuilder stringBuilder = new StringBuilder(); - - // Chain 7 - EdgeChain streamingOutputChain = - gpt3Chain.doOnNext( - chatResponse -> { - if (Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - stringBuilder.append( - chatResponse.getChoices().get(0).getMessage().getContent()); - } - // Now the streaming response is ended. Save it to DB i.e. HistoryContext - else { - contextEndpoint.put( - historyContext.getId(), - query + stringBuilder + historyContext.getResponse()); - } - }); - - return streamingOutputChain.getArkStreamResponse(); - } - } - - public List queryFn( - List wordEmbeddings, ArkRequest arkRequest) { - - List resp = new ArrayList<>(); - - // Iterate over each Query result; returned from Redis - for (WordEmbeddings wordEmbedding : wordEmbeddings) { - - String query = wordEmbedding.getId(); - - queryLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "context", - new JsonnetArgs( - DataType.STRING, - query)) // Step 3: Concatenate the Prompt: ${Base Prompt} - ${Redis - // Output} - .loadOrReload(); - // Step 4: Now, pass the prompt to OpenAI ChatCompletion & Add it to the list which will be - // returned - resp.add( - new EdgeChain<>( - gpt3Endpoint.chatCompletion( - queryLoader.get("prompt"), "RedisQueryChain", arkRequest)) - .get()); - } - - return resp; - } - - public String chatFn(String chatHistory, String queries) { - chatLoader - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "history", - new JsonnetArgs(DataType.STRING, chatHistory)) // Getting ChatHistory from Mapper - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("context", new JsonnetArgs(DataType.STRING, queries)) // Getting Queries from Mapper - .loadOrReload(); // Step 5: Pass the Args & Reload Jsonnet - - return chatLoader.get("prompt"); - } - } -} diff --git a/Examples/redis/redis-chat.jsonnet b/Examples/redis/redis-chat.jsonnet deleted file mode 100644 index cfc48da47..000000000 --- a/Examples/redis/redis-chat.jsonnet +++ /dev/null @@ -1,20 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - Use the following pieces of context to answer the question at the end. If - you don't know the answer, just say that you don't know, don't try to make up an answer. - |||; -local query = "Question: "+ payload.query; -local context = if(payload.keepContext == "true") then payload.context else ""; -local history = "Chat History: "+ if(payload.keepHistory == "true") then payload.history else ""; - -local prompt = std.join("\n", [query, preset, context, history]); -{ - "maxTokens": maxTokens, - "topK": 5, - "query": query, - "preset" : preset, - "context": context, - "history": history, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/redis/redis-query.jsonnet b/Examples/redis/redis-query.jsonnet deleted file mode 100644 index 959817947..000000000 --- a/Examples/redis/redis-query.jsonnet +++ /dev/null @@ -1,14 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - Use the following pieces of context to answer the question at the end. If - you don't know the answer, just say that you don't know, don't try to make up an answer. - |||; -local context = if(payload.keepContext == "true") then payload.context else ""; -local prompt = std.join("\n", [preset, context]); -{ - "maxTokens": maxTokens, - "preset" : preset, - "context": context, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/supabase-miniLM/SupabaseMiniLMExample.java b/Examples/supabase-miniLM/SupabaseMiniLMExample.java deleted file mode 100644 index a58cdb94c..000000000 --- a/Examples/supabase-miniLM/SupabaseMiniLMExample.java +++ /dev/null @@ -1,349 +0,0 @@ -package com.edgechain; - -import com.edgechain.lib.chains.PostgresRetrieval; -import com.edgechain.lib.chains.Retrieval; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.embeddings.miniLLM.enums.MiniLMModel; -import com.edgechain.lib.endpoint.impl.*; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.reader.impl.PdfReader; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.response.ArkResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Properties; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; - -@SpringBootApplication -public class SupabaseMiniLMExample { - private static final String OPENAI_AUTH_KEY = ""; - - private static OpenAiEndpoint gpt3Endpoint; - private static PostgresEndpoint postgresEndpoint; - private static PostgreSQLHistoryContextEndpoint contextEndpoint; - - private static MiniLMEndpoint miniLMEndpoint; - - private JsonnetLoader queryLoader = - new FileJsonnetLoader("./supabase-miniLM/postgres-query.jsonnet"); - private JsonnetLoader chatLoader = - new FileJsonnetLoader("./supabase-miniLM/postgres-chat.jsonnet"); - - public static void main(String[] args) { - - System.setProperty("server.port", "8080"); - - // Optional, if you are using supabase for authentication - Properties properties = new Properties(); - properties.setProperty("supabase.url", ""); - properties.setProperty("supabase.annon.key", ""); - - // Adding Cors ==> You can configure multiple cors w.r.t your urls.; - properties.setProperty("cors.origins", "http://localhost:4200"); - - // Should only be used in dev environment - properties.setProperty("spring.jpa.show-sql", "true"); - properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); - - // For DB config - properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); - properties.setProperty("postgres.db.password", ""); - - // For JWT decode - properties.setProperty("jwt.secret", ""); - - new SpringApplicationBuilder(SupabaseMiniLMExample.class).properties(properties).run(args); - - gpt3Endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-3.5-turbo", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - - // Creating MiniLM Endpoint - // When endpoint.embeddings() is called; it will look for the model; if not available, it will - // download on fly. - // All the requests will wait until the model is download & loaded once into the application... - // As you can see, the model is not download; so it will download on fly... - miniLMEndpoint = new MiniLMEndpoint(MiniLMModel.ALL_MINILM_L12_V2); - - // Creating PostgresEndpoint ==> We create a new table because miniLM supports 384 dimensional - // vectors; - postgresEndpoint = - new PostgresEndpoint("minilm_vectors", new ExponentialDelay(2, 3, 2, TimeUnit.SECONDS)); - - contextEndpoint = new PostgreSQLHistoryContextEndpoint(new FixedDelay(2, 3, TimeUnit.SECONDS)); - } - - /** - * By Default, every API is unauthenticated & exposed without any sort of authentication; To - * authenticate, your custom APIs in Controller you would need @PreAuthorize(hasAuthority("")); - * this will authenticate by JWT having two fields: a) email, b) role To authenticate, internal - * APIs related to historyContext & Logging, Delete Redis/Postgres we need to create bean of - * AuthFilter; you can uncomment the code. Note, you need to define "jwt.secret" property as well - * to decode accessToken. - */ - // @Bean - // @Primary - // public AuthFilter authFilter() { - // AuthFilter filter = new AuthFilter(); - // // new MethodAuthentication(List.of(APIs), roles) - // filter.setRequestPost(new MethodAuthentication(List.of("/v1/postgresql/historycontext"), - // "authenticated")); // define multiple roles by comma - // filter.setRequestGet(new MethodAuthentication(List.of(""), "")); - // filter.setRequestDelete(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPatch(new MethodAuthentication(List.of(""), "")); - // filter.setRequestPut(new MethodAuthentication(List.of(""), "")); - // return filter; - // } - - @RestController - public class SupabaseController { - - @Autowired private PdfReader pdfReader; - - // ========== PGVectors ============== - - // Concept of Namespace // - /* - * Namespace: VectorDb allows you to partition the vectors in an index into namespaces. Queries - * and other operations are then limited to one namespace, so different requests can search - * different subsets of your index. If namespace is null or empty, in pinecone it will be - * prefixed as "" empty string & in redis it will be prefixed as "knowledge" For example, you - * might want to define a namespace for indexing books by finance, law, medicine etc.. Can be - * used in multiple use-cases.... such as User uploading book, generating unique namespace & - * then querying/chatting with it... - * - */ - - /** - * If namespace is empty string or null, then the default namespace is 'knowledge'==> The - * concept of namespace is defined above * - */ - @PostMapping("/miniLM/upsert") - @PreAuthorize("hasAnyAuthority('authenticated')") - public void upsert(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); - String filename = arkRequest.getMultiPart("file").getSubmittedFileName(); - InputStream file = arkRequest.getMultiPart("file").getInputStream(); - - postgresEndpoint.setNamespace(namespace); - - String[] arr = pdfReader.readByChunkSize(file, 512); - - Retrieval retrieval = - new PostgresRetrieval(postgresEndpoint, filename, 384, miniLMEndpoint, arkRequest); - - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); - } - - @PostMapping(value = "/miniLM/query") - @PreAuthorize("hasAnyAuthority('authenticated')") - public ArkResponse queryPostgres(ArkRequest arkRequest) { - - String namespace = arkRequest.getQueryParam("namespace"); - String query = arkRequest.getBody().getString("query"); - int topK = arkRequest.getIntQueryParam("topK"); - - postgresEndpoint.setNamespace(namespace); - - // Chain 1==> Get Embeddings From Input using MiniLM & Then Query To PostgreSQL - EdgeChain embeddingsChain = - new EdgeChain<>(miniLMEndpoint.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from PostgreSQL - EdgeChain> queryChain = - new EdgeChain<>( - postgresEndpoint.query(embeddingsChain.get(), PostgresDistanceMetric.L2, topK)); - - // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to - // OpenAI - EdgeChain> gpt3Chain = - queryChain.transform(wordEmbeddings -> queryFn(wordEmbeddings, arkRequest)); - - return gpt3Chain.getArkResponse(); - } - - @PostMapping(value = "/miniLM/chat") - @PreAuthorize("hasAnyAuthority('authenticated')") - public ArkResponse chatWithPostgres(ArkRequest arkRequest) { - - String contextId = arkRequest.getQueryParam("id"); - - String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); - - boolean stream = arkRequest.getBooleanHeader("stream"); - - // Configure PostgresEndpoint - postgresEndpoint.setNamespace(namespace); - - gpt3Endpoint.setStream(stream); - - // Get HistoryContext - HistoryContext historyContext = contextEndpoint.get(contextId); - - // Load Jsonnet To extract topK query dynamically - chatLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("query", new JsonnetArgs(DataType.STRING, query)) - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "false")) - .loadOrReload(); - - // Extract topK value from JsonnetLoader; - int topK = chatLoader.getInt("topK"); - - // Chain 1 ==> Get Embeddings From Input using MiniLM - EdgeChain embeddingsChain = - new EdgeChain<>(miniLMEndpoint.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from PostgreSQL & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method - EdgeChain> postgresChain = - new EdgeChain<>( - postgresEndpoint.query(embeddingsChain.get(), PostgresDistanceMetric.L2, topK)); - - // Chain 3 ===> Transform String of Queries into List - EdgeChain queryChain = - new EdgeChain<>(postgresChain) - .transform( - postgresResponse -> { - List queryList = new ArrayList<>(); - postgresResponse.get().forEach(q -> queryList.add(q.getRawText())); - return String.join("\n", queryList); - }); - - // Chain 4 ===> Create fn() to prepare your chat prompt - EdgeChain promptChain = - queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion( - promptChain.get(), "MiniLMPostgresChatChain", arkRequest)); - - // (FOR NON STREAMING) - // If it's not stream ==> - // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - if (!stream) { - - // Chain 6 - EdgeChain historyUpdatedChain = - gpt3Chain.doOnNext( - chatResponse -> - contextEndpoint.put( - historyContext.getId(), - query - + chatResponse.getChoices().get(0).getMessage().getContent() - + historyContext.getResponse())); - - return historyUpdatedChain.getArkResponse(); - } - - // For STREAMING Version - else { - - /* As the response is in stream, so we will use StringBuilder to append the response - and once GPT chain indicates that it is finished, we will save the following into Postgres - Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory - */ - - StringBuilder stringBuilder = new StringBuilder(); - - // Chain 7 - EdgeChain streamingOutputChain = - gpt3Chain.doOnNext( - chatResponse -> { - if (Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - stringBuilder.append( - chatResponse.getChoices().get(0).getMessage().getContent()); - } - // Now the streaming response is ended. Save it to DB i.e. HistoryContext - else { - contextEndpoint.put( - historyContext.getId(), - query + stringBuilder + historyContext.getResponse()); - } - }); - - return streamingOutputChain.getArkStreamResponse(); - } - } - - public List queryFn( - List wordEmbeddings, ArkRequest arkRequest) { - - List resp = new ArrayList<>(); - - // Iterate over each Query result; returned from Postgres - for (PostgresWordEmbeddings wordEmbedding : wordEmbeddings) { - - String query = wordEmbedding.getRawText(); - - queryLoader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "context", - new JsonnetArgs( - DataType.STRING, - query)) // Step 3: Concatenate the Prompt: ${Base Prompt} - ${Postgres - // Output} - .loadOrReload(); - // Step 4: Now, pass the prompt to OpenAI ChatCompletion & Add it to the list which will be - // returned - resp.add( - new EdgeChain<>( - gpt3Endpoint.chatCompletion( - queryLoader.get("prompt"), "MiniLMPostgresQueryChain", arkRequest)) - .get()); - } - - return resp; - } - } - - public String chatFn(String chatHistory, String queries) { - chatLoader - .put("keepHistory", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "history", - new JsonnetArgs(DataType.STRING, chatHistory)) // Getting ChatHistory from Mapper - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("context", new JsonnetArgs(DataType.STRING, queries)) // Getting Queries from Mapper - .loadOrReload(); // Step 5: Pass the Args & Reload Jsonnet - - return chatLoader.get("prompt"); - } -} diff --git a/Examples/supabase-miniLM/postgres-chat.jsonnet b/Examples/supabase-miniLM/postgres-chat.jsonnet deleted file mode 100644 index 9fdaf9d1d..000000000 --- a/Examples/supabase-miniLM/postgres-chat.jsonnet +++ /dev/null @@ -1,23 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - You will be given context that may or may not be related to the question. If the context is related to the question, use it to answer the question. - Otherwise, say that you don't know the answer, and attempt to answer it anyways using an 'In General' format - Follow Up Input: {question} - Context: {context} - Chat History: {chat_history} - |||; -local query = "Question: "+ payload.query; -local context = if(payload.keepContext == "true") then payload.context else ""; -local history = "Chat History: "+ if(payload.keepHistory == "true") then payload.history else ""; - -local prompt = std.join("\n", [query, preset, context, history]); -{ - "maxTokens": maxTokens, - "topK": 5, - "query": query, - "preset" : preset, - "context": context, - "history": history, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/supabase-miniLM/postgres-query.jsonnet b/Examples/supabase-miniLM/postgres-query.jsonnet deleted file mode 100644 index b8e385a57..000000000 --- a/Examples/supabase-miniLM/postgres-query.jsonnet +++ /dev/null @@ -1,14 +0,0 @@ - -local maxTokens = if(payload.keepMaxTokens == "true") then payload.maxTokens else 10000; -local preset = ||| - You will be given context that may or may not be related to the question. If the context is related to the question, use it to answer the question. - Otherwise, say that you don't know the answer, and attempt to answer it anyways using an 'In General' format - |||; -local context = if(payload.keepContext == "true") then payload.context else ""; -local prompt = std.join("\n", [preset, context]); -{ - "maxTokens": maxTokens, - "preset" : preset, - "context": context, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/Examples/wiki/WikiExample.java b/Examples/wiki/WikiExample.java deleted file mode 100644 index 7c3d8cab1..000000000 --- a/Examples/wiki/WikiExample.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.edgechain; - -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.response.ArkResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; - -import java.util.*; -import java.util.concurrent.TimeUnit; - -import com.edgechain.lib.wiki.response.WikiResponse; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; - -@SpringBootApplication -public class WikiExample { - - private static final String OPENAI_AUTH_KEY = ""; - - /* Step 3: Create OpenAiEndpoint to communicate with OpenAiServices; */ - private static OpenAiEndpoint gpt4Endpoint; - private static WikiEndpoint wikiEndpoint; - - private final JsonnetLoader loader = new FileJsonnetLoader("./wiki/wiki.jsonnet"); - - public static void main(String[] args) { - System.setProperty("server.port", "8080"); - - // Optional, for logging SQL queries (shouldn't be used in prod) - Properties properties = new Properties(); - - // Adding Cors ==> You can configure multiple cors w.r.t your urls.; - properties.setProperty("cors.origins", "http://localhost:4200"); - - properties.setProperty("spring.jpa.show-sql", "true"); - properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); - - properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); - properties.setProperty("postgres.db.password", ""); - - new SpringApplicationBuilder(WikiExample.class).properties(properties).run(args); - - wikiEndpoint = new WikiEndpoint(); - - gpt4Endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - OPENAI_AUTH_KEY, - "gpt-4", - "user", - 0.7, - new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - } - - @RestController - public class WikiController { - - /** - * Objective: Get the Content From Wikipedia & then pass the prompt: {Create 5-bullet point - * summary of: } + {wikiContent} to OpenAiChatCompletion API. - * - * @return ArkResponseObservable - */ - @GetMapping(value = "/wiki-summary") - public ArkResponse wikiSummary(ArkRequest arkRequest) { - - String query = arkRequest.getQueryParam("query"); - boolean stream = arkRequest.getBooleanHeader("stream"); - - // Configure GPT4Endpoint - gpt4Endpoint.setStream(stream); - - // Chain 1 ==> WikiChain - EdgeChain wikiChain = new EdgeChain<>(wikiEndpoint.getPageContent(query)); - - // Chain 2 ===> Creating Prompt Chain & Return ChatCompletion - EdgeChain promptChain = wikiChain.transform(this::fn); - - // Chain 3 ==> Pass Prompt to ChatCompletion API & Return ArkResponseObservable - EdgeChain openAiChain = - new EdgeChain<>(gpt4Endpoint.chatCompletion(promptChain.get(), "WikiChain", arkRequest)); - - /** - * The best part is flexibility with just one method EdgeChainsSDK will return response either - * in json or stream; The real magic happens here. Streaming happens only if your logic allows - * otherwise; it will return text/eventstream - */ - - // Note: When you call getArkResponse() or getArkStreamResponse() ==> Only then your streams - // are executed... - if (stream) return openAiChain.getArkStreamResponse(); - else return openAiChain.getArkResponse(); - } - - private String fn(WikiResponse wiki) { - loader - .put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put("maxTokens", new JsonnetArgs(DataType.INTEGER, "4096")) - .put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "true")) - .put( - "context", - new JsonnetArgs( - DataType.STRING, - wiki.getText())) // Step 4: Concatenate ${Base Prompt} + ${Wiki Output} - .loadOrReload(); // Step 5: Reloading Jsonnet File - - return loader.get("prompt"); - } - } -} diff --git a/Examples/wiki/wiki.jsonnet b/Examples/wiki/wiki.jsonnet deleted file mode 100644 index 051d088ce..000000000 --- a/Examples/wiki/wiki.jsonnet +++ /dev/null @@ -1,26 +0,0 @@ -local keepMaxTokens = payload.keepMaxTokens; -local maxTokens = if keepMaxTokens == "true" then payload.maxTokens else 5120; - -local preset = ||| - You are a Summary Generator Bot. For any question other than summarizing the data, you should tell that you cannot answer it. - You should detect the language and the characters the user is writing in, and reply in the same character set and language. - - You should follow the following template while answering the user: - - ``` - 1. - - 2. - - ... - ``` - Now, given the data, create a 30-bullet point summary of: - |||; -local keepContext = payload.keepContext; -local context = if keepContext == "true" then payload.context else ""; -local prompt = std.join("\n", [preset, context]); -{ - "maxTokens": maxTokens, - "typeOfKeepContext": xtr.type(keepContext), - "preset" : preset, - "context": context, - "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt -} \ No newline at end of file diff --git a/FlySpring/autoroute/.gitignore b/FlySpring/autoroute/.gitignore deleted file mode 100644 index 549e00a2a..000000000 --- a/FlySpring/autoroute/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/FlySpring/autoroute/dependency-reduced-pom.xml b/FlySpring/autoroute/dependency-reduced-pom.xml deleted file mode 100644 index 8bde02dcf..000000000 --- a/FlySpring/autoroute/dependency-reduced-pom.xml +++ /dev/null @@ -1,205 +0,0 @@ - - - - spring-boot-starter-parent - org.springframework.boot - 3.0.0 - pom.xml - - 4.0.0 - com.flyspring - autoroute-spring-boot-starter - autoroute - 0.1.1-SNAPSHOT - AutoRoute java functions to routes - - - - maven-shade-plugin - 3.4.1 - - - package - - shade - - - - - - - - - - gofly - - - - maven-antrun-plugin - 3.1.0 - - - package - - run - - - - - - - - - - - - - - - - org.junit.jupiter - junit-jupiter-api - 5.9.2 - test - - - opentest4j - org.opentest4j - - - junit-platform-commons - org.junit.platform - - - apiguardian-api - org.apiguardian - - - - - org.mockito - mockito-junit-jupiter - 5.3.0 - test - - - mockito-core - org.mockito - - - - - junit - junit - 4.4 - test - - - org.springframework - spring-mock - 2.0.8 - test - - - commons-io - commons-io - 2.6 - provided - - - org.springframework.boot - spring-boot-starter-webflux - 3.0.5 - provided - - - org.reflections - reflections - 0.9.12 - provided - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - 3.0.0 - provided - - - org.springframework.security - spring-security-oauth2-jose - 6.0.0 - provided - - - org.glowroot - glowroot-agent-api - 0.13.6 - provided - - - org.projectlombok - lombok - 1.18.24 - provided - true - - - io.reactivex.rxjava3 - rxjava - 3.1.6 - provided - - - io.reactivex - rxjava-reactive-streams - 1.2.1 - provided - - - io.projectreactor.addons - reactor-adapter - 3.5.1 - provided - - - org.apache.pdfbox - pdfbox - 2.0.28 - provided - - - com.squareup.okhttp3 - okhttp - 4.10.0 - provided - - - commons-fileupload - commons-fileupload - 1.5 - provided - - - me.xuender - unidecode - 0.0.7 - provided - - - org.apache.tika - tika-core - 2.7.0 - provided - - - org.apache.tika - tika-parsers-standard-package - 2.7.0 - provided - - - - 17 - 17 - - diff --git a/FlySpring/autoroute/pom.xml b/FlySpring/autoroute/pom.xml deleted file mode 100644 index 8612af0e4..000000000 --- a/FlySpring/autoroute/pom.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - 4.0.0 - - com.flyspring - autoroute-spring-boot-starter - 0.1.1-SNAPSHOT - autoroute - AutoRoute java functions to routes - - org.springframework.boot - spring-boot-starter-parent - 3.0.0 - - - - - 17 - 17 - - - - - org.junit.jupiter - junit-jupiter-api - 5.9.2 - test - - - org.mockito - mockito-junit-jupiter - 5.3.0 - test - - - junit - junit - 4.4 - test - - - org.springframework - spring-mock - 2.0.8 - test - - - commons-io - commons-io - 2.6 - - - org.springframework.boot - spring-boot-starter-webflux - 3.0.5 - - - org.reflections - reflections - 0.9.12 - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - - - org.springframework.security - spring-security-oauth2-jose - - - org.glowroot - glowroot-agent-api - 0.13.6 - - - - org.projectlombok - lombok - true - - - - io.reactivex.rxjava3 - rxjava - 3.1.6 - - - - io.reactivex - rxjava-reactive-streams - 1.2.1 - - - - io.projectreactor.addons - reactor-adapter - 3.5.1 - - - - org.apache.pdfbox - pdfbox - 2.0.28 - - - - com.squareup.okhttp3 - okhttp - 4.10.0 - - - - commons-fileupload - commons-fileupload - 1.5 - - - - me.xuender - unidecode - 0.0.7 - - - - org.apache.tika - tika-core - 2.7.0 - - - - org.apache.tika - tika-parsers-standard-package - 2.7.0 - - - - - - - gofly - - - - maven-antrun-plugin - 3.1.0 - - - package - - - - - - - run - - - - - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.4.1 - - - - - - package - - shade - - - - - - - - \ No newline at end of file diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/chains/IndexChain.java b/FlySpring/autoroute/src/main/java/com/app/openai/chains/IndexChain.java deleted file mode 100644 index 03dfca5fd..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/chains/IndexChain.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.app.openai.chains; - -import com.app.openai.endpoint.Endpoint; -import com.app.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; - -public class IndexChain extends EdgeChain { - - public IndexChain(Observable observable) { - super(observable); - } - - public IndexChain(Observable observable, Endpoint endpoint) { - super(observable, endpoint); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/chains/OpenAiChain.java b/FlySpring/autoroute/src/main/java/com/app/openai/chains/OpenAiChain.java deleted file mode 100644 index f96a9448b..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/chains/OpenAiChain.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.app.openai.chains; - -import com.app.openai.endpoint.Endpoint; -import com.app.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; - -public class OpenAiChain extends EdgeChain { - - public OpenAiChain(Observable observable) { - super(observable); - } - - public OpenAiChain(Observable observable, Endpoint endpoint) { - super(observable, endpoint); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/chains/PluginChain.java b/FlySpring/autoroute/src/main/java/com/app/openai/chains/PluginChain.java deleted file mode 100644 index 4c93099df..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/chains/PluginChain.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.app.openai.chains; - -import com.app.openai.endpoint.Endpoint; -import com.app.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; - -public class PluginChain extends EdgeChain { - - public PluginChain(Observable observable) { - super(observable); - } - - public PluginChain(Observable observable, Endpoint endpoint) { - super(observable, endpoint); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/chains/PluginResponseChain.java b/FlySpring/autoroute/src/main/java/com/app/openai/chains/PluginResponseChain.java deleted file mode 100644 index 13de20c2c..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/chains/PluginResponseChain.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.app.openai.chains; - -import com.app.openai.endpoint.Endpoint; -import com.app.openai.plugin.response.PluginResponse; -import com.app.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; - -public class PluginResponseChain extends EdgeChain { - - public PluginResponseChain(Observable observable) { - super(observable); - } - - public PluginResponseChain(Observable observable, Endpoint endpoint) { - super(observable, endpoint); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/client/OpenAiClient.java b/FlySpring/autoroute/src/main/java/com/app/openai/client/OpenAiClient.java deleted file mode 100644 index 78d938dd0..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/client/OpenAiClient.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.app.openai.client; - -import com.app.openai.chains.OpenAiChain; -import com.app.openai.embeddings.openai.OpenAiEmbeddingRequest; -import com.app.openai.endpoint.Endpoint; -import com.app.openai.request.ChatCompletionRequest; -import com.app.openai.request.CompletionRequest; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.util.Objects; - -@Service -public class OpenAiClient { - - private final RestTemplate restTemplate = new RestTemplate(); - - public OpenAiChain createChatCompletion(Endpoint endpoint, ChatCompletionRequest request) { - - return new OpenAiChain( - Observable.create( - emitter -> { - try { - - System.out.println("Logging...."); - - // Create headers - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(endpoint.getApiKey()); - - HttpEntity entity = new HttpEntity<>(request, headers); - - // Send the POST request - ResponseEntity response = - restTemplate.exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); - - emitter.onNext(Objects.requireNonNullElse(response.getBody(), "")); - emitter.onComplete(); - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - public OpenAiChain createCompletion(Endpoint endpoint, CompletionRequest request) { - return new OpenAiChain( - Observable.create( - emitter -> { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(endpoint.getApiKey()); - - HttpEntity entity = new HttpEntity<>(request, headers); - - ResponseEntity response = - this.restTemplate.exchange( - endpoint.getUrl(), HttpMethod.POST, entity, String.class); - emitter.onNext(response.getBody()); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - public OpenAiChain createEmbeddings(Endpoint endpoint, OpenAiEmbeddingRequest request) { - return new OpenAiChain( - Observable.create( - emitter -> { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(endpoint.getApiKey()); - HttpEntity entity = new HttpEntity<>(request, headers); - - ResponseEntity response = - this.restTemplate.exchange( - endpoint.getUrl(), HttpMethod.POST, entity, String.class); - emitter.onNext(response.getBody()); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/WordVec.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/WordVec.java deleted file mode 100644 index 18b7b92a6..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/WordVec.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.app.openai.embeddings; - -import java.io.Serializable; -import java.util.List; - -public class WordVec implements Serializable { - - private static final long serialVersionUID = 2210956496609994219L; - private String id; - private List values; - private String score; - - public WordVec() {} - - public WordVec(String id, List values) { - this.id = id; - this.values = values; - this.score = String.format("%.2f", 0.00); - } - - public WordVec(String id, List values, String score) { - this.id = id; - this.values = values; - this.score = score; - } - - public String getId() { - return id; - } - - public List getValues() { - return values; - } - - public String getScore() { - return score; - } - - @Override - public String toString() { - return "Vector{" + "id='" + id + '\'' + ", values=" + values + ", score='" + score + '\'' + '}'; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbedding.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbedding.java deleted file mode 100644 index 14a2abd8b..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbedding.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.app.openai.embeddings.openai; - -import java.util.List; - -public class OpenAiEmbedding { - - private String object; - private List embedding; - private Integer index; - - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - - public List getEmbedding() { - return embedding; - } - - public void setEmbedding(List embedding) { - this.embedding = embedding; - } - - public Integer getIndex() { - return index; - } - - public void setIndex(Integer index) { - this.index = index; - } - - @Override - public String toString() { - return "OpenAiEmbedding{" - + "object='" - + object - + '\'' - + ", embedding=" - + embedding - + ", index=" - + index - + '}'; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbeddingRequest.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbeddingRequest.java deleted file mode 100644 index 029abcf70..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbeddingRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.app.openai.embeddings.openai; - -public class OpenAiEmbeddingRequest { - private String input; - private String model; - - public OpenAiEmbeddingRequest(String model, String input) { - this.model = model; - this.input = input; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - @Override - public String toString() { - return "OpenAiEmbeddingRequest{" + "model='" + model + '\'' + ", input='" + input + '\'' + '}'; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbeddingResponse.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbeddingResponse.java deleted file mode 100644 index a6b4ab12e..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/OpenAiEmbeddingResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.app.openai.embeddings.openai; - -import java.util.List; - -public class OpenAiEmbeddingResponse { - - private String model; - private String object; - private List data; - private Usage usage; - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - - public List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public Usage getUsage() { - return usage; - } - - public void setUsage(Usage usage) { - this.usage = usage; - } - - @Override - public String toString() { - return "OpenAiEmbeddingResponse{" - + "model='" - + model - + '\'' - + ", object='" - + object - + '\'' - + ", data=" - + data - + ", usage=" - + usage - + '}'; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/Usage.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/Usage.java deleted file mode 100644 index 595524aef..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/openai/Usage.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.app.openai.embeddings.openai; - -public class Usage { - - long prompt_tokens; - long total_tokens; - - public long getPrompt_tokens() { - return prompt_tokens; - } - - public void setPrompt_tokens(long prompt_tokens) { - this.prompt_tokens = prompt_tokens; - } - - public long getTotal_tokens() { - return total_tokens; - } - - public void setTotal_tokens(long total_tokens) { - this.total_tokens = total_tokens; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/prompt/ChatQueryPrompt.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/prompt/ChatQueryPrompt.java deleted file mode 100644 index e6f464a32..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/prompt/ChatQueryPrompt.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.app.openai.embeddings.prompt; - -import com.app.openai.prompt.PromptTemplate; - -public class ChatQueryPrompt implements PromptTemplate { - - @Override - public String getPrompt() { - return "Use the following pieces of context to answer the question at the end. If " - + "you don't know the answer, just say that you don't know, don't try to make " - + "up an answer."; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/service/EmbeddingService.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/service/EmbeddingService.java deleted file mode 100644 index 453ec921a..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/service/EmbeddingService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.app.openai.embeddings.service; - -import com.app.openai.chains.IndexChain; -import com.app.openai.embeddings.WordVec; - -import java.io.Serializable; - -public abstract class EmbeddingService implements Serializable { - - private static final long serialVersionUID = -3410729795509987165L; - - public abstract IndexChain upsert(WordVec wordVec); - - public abstract IndexChain predict(String query, String OPENAI_API_KEY); - - public abstract IndexChain predict(String query, Double temperature, String OPENAI_API_KEY); - - public abstract IndexChain delete(); -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/service/impl/PineconeEmbeddingService.java b/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/service/impl/PineconeEmbeddingService.java deleted file mode 100644 index b766e53a5..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/embeddings/service/impl/PineconeEmbeddingService.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.app.openai.embeddings.service.impl; - -import com.app.openai.chains.IndexChain; -import com.app.openai.embeddings.WordVec; -import com.app.openai.embeddings.service.EmbeddingService; -import com.app.openai.endpoint.Endpoint; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.util.*; - -public class PineconeEmbeddingService extends EmbeddingService { - - private static final String OPENAI_EMBEDDINGS_API = "https://api.openai.com/v1/embeddings"; - private static final String OPENAI_CHAT_COMPLETION_API = - "https://api.openai.com/v1/chat/completions"; - private final Endpoint endpoint; - private final String namespace; - - public PineconeEmbeddingService(Endpoint endpoint, String namespace) { - this.endpoint = endpoint; - this.namespace = namespace; - } - - public PineconeEmbeddingService(Endpoint endpoint) { - this.endpoint = endpoint; - this.namespace = ""; - } - - @Override - public IndexChain upsert(WordVec wordVec) { - return new IndexChain( - Observable.create( - emitter -> { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("Api-Key", endpoint.getApiKey()); - - Map embeddings = new HashMap<>(); - embeddings.put("id", wordVec.getId()); - embeddings.put("values", wordVec.getValues()); - - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("vectors", embeddings); - if (!namespace.isBlank()) body.add("namespace", namespace); - - HttpEntity> entity = new HttpEntity<>(body, headers); - - ResponseEntity response = - new RestTemplate() - .exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); - emitter.onNext(response.getBody()); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public IndexChain predict(String query, String OPENAI_API_KEY) { - return new IndexChain( - Observable.create( - emitter -> { - try { - - // LLMService openAiEmbedding = new LLMService(new - // OpenAIEmbeddingProvider( - // new - // Endpoint(OPENAI_EMBEDDINGS_API,OPENAI_API_KEY), "text-embedding-ada-002")); - // - // List queryEmbeddings = - // openAiEmbedding.request(query) - // .transform(response -> new - // ObjectMapper().readValue(response, OpenAiEmbeddingResponse.class)) - // .transform(embeddingResponse -> - // embeddingResponse.getData().get(0).getEmbedding()) - // .getWithRetry(); - // - // HttpHeaders headers = new HttpHeaders(); - // - // headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - // headers.setContentType(MediaType.APPLICATION_JSON); - // headers.set("Api-Key",endpoint.getApiKey()); - // - // // Prepare the request payload using a LinkedHashMap to - // maintain key order - // Map payload = new LinkedHashMap<>(); - // payload.put("includeValues", true); - // payload.put("includeMetadata", false); - // payload.put("vector", queryEmbeddings); - // payload.put("top_k", 1); - // - // - // HttpEntity> entity = new - // HttpEntity<>(payload, headers); - // - // ResponseEntity response = new - // RestTemplate().exchange(endpoint.getUrl(), HttpMethod.POST, entity, - // String.class); - // - // WordVec wordVec = parsePredict(response.getBody()); - // - // if(Objects.nonNull(wordVec)) { - // LLMProvider llmProvider = - // new OpenAiChatCompletionProvider - // (new - // Endpoint(OPENAI_CHAT_COMPLETION_API, OPENAI_API_KEY), "gpt-3.5-turbo", "user"); - // - // LLMService chatCompletion = new - // LLMService(llmProvider); - // - // String prompt = new ChatQueryPrompt().getPrompt() + - // "\n" + query; - // String responseBody = - // chatCompletion.request(prompt).getWithRetry(); - // emitter.onNext(parseChatCompletion(responseBody)); - // } - // else{ - // emitter.onNext("Unable to extract information..."); - // } - - emitter.onComplete(); // Complete Signal Necessary - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public IndexChain predict(String query, Double temperature, String OPENAI_API_KEY) { - - return new IndexChain( - Observable.create( - emitter -> { - try { - - // LLMService openAiEmbedding = new LLMService(new - // OpenAIEmbeddingProvider( - // new - // Endpoint(OPENAI_EMBEDDINGS_API,OPENAI_API_KEY), "text-embedding-ada-002")); - // - // List queryEmbeddings = - // openAiEmbedding.request(query) - // .transform(response -> new - // ObjectMapper().readValue(response, OpenAiEmbeddingResponse.class)) - // .transform(embeddingResponse -> - // embeddingResponse.getData().get(0).getEmbedding()) - // .getWithRetry(); - // - // HttpHeaders headers = new HttpHeaders(); - // - // headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - // headers.setContentType(MediaType.APPLICATION_JSON); - // headers.set("Api-Key",endpoint.getApiKey()); - // - // // Prepare the request payload using a LinkedHashMap to - // maintain key order - // Map payload = new LinkedHashMap<>(); - // payload.put("includeValues", true); - // payload.put("includeMetadata", false); - // payload.put("vector", queryEmbeddings); - // payload.put("top_k", 1); - // - // - // HttpEntity> entity = new - // HttpEntity<>(payload, headers); - // - // ResponseEntity response = new - // RestTemplate().exchange(endpoint.getUrl(), HttpMethod.POST, entity, - // String.class); - // - // WordVec wordVec = parsePredict(response.getBody()); - // - // if(Objects.nonNull(wordVec)) { - // LLMProvider llmProvider = - // new OpenAiChatCompletionProvider - // (new - // Endpoint(OPENAI_CHAT_COMPLETION_API, OPENAI_API_KEY), "gpt-3.5-turbo", "user", - // temperature); - // - // LLMService chatCompletion = new - // LLMService(llmProvider); - // - // String prompt = new ChatQueryPrompt().getPrompt() + - // "\n" + query; - // String responseBody = - // chatCompletion.request(prompt).getWithRetry(); - // emitter.onNext(parseChatCompletion(responseBody)); - // } - // else{ - // emitter.onNext("Unable to extract information..."); - // } - - emitter.onComplete(); // Complete Signal Necessary - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public IndexChain delete() { - return new IndexChain( - Observable.create( - emitter -> { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("Api-Key", endpoint.getApiKey()); - - Map body = new HashMap<>(); - body.put("deleteAll", true); - - if (!namespace.isEmpty()) body.put("namespace", namespace); - - HttpEntity> entity = new HttpEntity<>(body, headers); - - ResponseEntity responseEntity = - new RestTemplate() - .exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); - emitter.onNext(responseEntity.getBody()); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })); - } - - private String parseChatCompletion(String body) throws JsonProcessingException { - JsonNode outputJsonNode = new ObjectMapper().readTree(body); - System.out.println("Pretty String: " + outputJsonNode.toPrettyString()); - - return outputJsonNode.get("choices").get(0).get("message").get("content").asText(); - } - - private WordVec parsePredict(String body) throws JsonProcessingException { - - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode outputJsonNode = objectMapper.readTree(body); - System.out.println("Pretty String: " + outputJsonNode.toPrettyString()); - - return objectMapper.treeToValue(outputJsonNode.get("matches").get(0), WordVec.class); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/endpoint/Endpoint.java b/FlySpring/autoroute/src/main/java/com/app/openai/endpoint/Endpoint.java deleted file mode 100644 index 82609b111..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/endpoint/Endpoint.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.app.openai.endpoint; - -import com.app.openai.llm.provider.LLMProvider; -import com.app.openai.llm.provider.impl.OpenAiChatCompletionProvider; -import com.app.rxjava.retry.RetryPolicy; - -public class Endpoint { - private final String url; - private String apiKey; - private final RetryPolicy retryPolicy; - private final String model; - private final String role; - private final Double temperature; - private final LLMProvider llmProvider; - - public Endpoint(String url) { - this(url, null, null, null, null); - } - - public Endpoint(String url, String apiKey) { - this(url, apiKey, null, null, null); - } - - public Endpoint(String url, String apiKey, RetryPolicy retryPolicy) { - this(url, apiKey, null, null, retryPolicy); - } - - public Endpoint(String url, RetryPolicy retryPolicy) { - this(url, null, null, null, retryPolicy); - } - - public Endpoint(String url, String apiKey, String model, String role, RetryPolicy retryPolicy) { - this(url, apiKey, model, role, null, retryPolicy); - } - - public Endpoint( - String url, - String apiKey, - String model, - String role, - Double temperature, - RetryPolicy retryPolicy) { - this.url = url; - this.apiKey = apiKey; - this.retryPolicy = retryPolicy; - this.model = model; - this.role = role; - this.temperature = temperature; - this.llmProvider = new OpenAiChatCompletionProvider(this); - } - - public String getApiKey() { - return this.apiKey; - } - - public String getUrl() { - return this.url; - } - - public RetryPolicy getRetryPolicy() { - return this.retryPolicy; - } - - public String getModel() { - return this.model; - } - - public String getRole() { - return this.role; - } - - public Double getTemperature() { - return this.temperature; - } - - public LLMProvider getLlmProvider() { - return this.llmProvider; - } - - public String toString() { - return "Endpoint{url='" - + this.url - + "', apiKey='" - + this.apiKey - + "', retryPolicy=" - + this.retryPolicy - + ", model='" - + this.model - + "', role='" - + this.role - + "', temperature=" - + this.temperature - + ", llmProvider=" - + this.llmProvider - + "}"; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/LLMProvider.java b/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/LLMProvider.java deleted file mode 100644 index 6a6ec2cfb..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/LLMProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.app.openai.llm.provider; - -import com.app.rxjava.transformer.observable.EdgeChain; - -public interface LLMProvider { - - EdgeChain request(String prompt); -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAIEmbeddingProvider.java b/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAIEmbeddingProvider.java deleted file mode 100644 index cfbe6548b..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAIEmbeddingProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.app.openai.llm.provider.impl; - -import com.app.openai.client.OpenAiClient; -import com.app.openai.embeddings.openai.OpenAiEmbeddingRequest; -import com.app.openai.endpoint.Endpoint; -import com.app.openai.llm.provider.LLMProvider; -import com.app.rxjava.transformer.observable.EdgeChain; - -import java.io.Serializable; - -public class OpenAIEmbeddingProvider implements LLMProvider, Serializable { - - private static final long serialVersionUID = -6453404111107021938L; - private final Endpoint endpoint; - private final String model; - - public OpenAIEmbeddingProvider(Endpoint endpoint, String model) { - this.endpoint = endpoint; - this.model = model; - } - - @Override - public EdgeChain request(String prompt) { - return new OpenAiClient().createEmbeddings(endpoint, new OpenAiEmbeddingRequest(model, prompt)); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAiChatCompletionProvider.java b/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAiChatCompletionProvider.java deleted file mode 100644 index 8d471d186..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAiChatCompletionProvider.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.app.openai.llm.provider.impl; - -import com.app.openai.client.OpenAiClient; -import com.app.openai.endpoint.Endpoint; -import com.app.openai.llm.provider.LLMProvider; -import com.app.openai.request.ChatCompletionRequest; -import com.app.openai.request.ChatMessage; -import com.app.rxjava.transformer.observable.EdgeChain; - -import java.util.List; - -public class OpenAiChatCompletionProvider implements LLMProvider { - private final Endpoint endpoint; - - public OpenAiChatCompletionProvider(Endpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain request(String prompt) { - ChatCompletionRequest request = - ChatCompletionRequest.builder() - .model(endpoint.getModel()) - .temperature(endpoint.getTemperature()) - .messages(List.of(new ChatMessage(endpoint.getRole(), prompt))) - .build(); - return (new OpenAiClient()).createChatCompletion(endpoint, request); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAiCompletionProvider.java b/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAiCompletionProvider.java deleted file mode 100644 index c770aac9e..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/llm/provider/impl/OpenAiCompletionProvider.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.app.openai.llm.provider.impl; - -import com.app.openai.client.OpenAiClient; -import com.app.openai.endpoint.Endpoint; -import com.app.openai.llm.provider.LLMProvider; -import com.app.openai.request.CompletionRequest; -import com.app.rxjava.transformer.observable.EdgeChain; - -public class OpenAiCompletionProvider implements LLMProvider { - - private final Endpoint endpoint; - private final String model; - private final Double temperature; - private final Integer max_tokens; - - public OpenAiCompletionProvider( - Endpoint endpoint, String model, Double temperature, Integer max_tokens) { - this.endpoint = endpoint; - this.model = model; - this.temperature = temperature; - this.max_tokens = max_tokens; - } - - @Override - public EdgeChain request(String prompt) { - - CompletionRequest completionRequest = - CompletionRequest.builder() - .prompt(prompt) - .model(this.model) - .temperature(this.temperature) - .maxTokens(this.max_tokens) - .build(); - - return new OpenAiClient().createCompletion(endpoint, completionRequest); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/llm/service/LLMService.java b/FlySpring/autoroute/src/main/java/com/app/openai/llm/service/LLMService.java deleted file mode 100644 index 5da87f835..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/llm/service/LLMService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.app.openai.llm.service; - -import com.app.openai.llm.provider.LLMProvider; -import com.app.rxjava.transformer.observable.EdgeChain; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Serializable; - -public class LLMService implements LLMProvider, Serializable { - - private static final long serialVersionUID = 2134005420372599230L; - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - private final LLMProvider provider; - - public LLMService(LLMProvider provider) { - log.info("Selected the following LLM Provider: " + provider.getClass().getSimpleName()); - this.provider = provider; - } - - @Override - public EdgeChain request(String prompt) { - return provider.request(prompt); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/llm/wrapper/LLMWrapper.java b/FlySpring/autoroute/src/main/java/com/app/openai/llm/wrapper/LLMWrapper.java deleted file mode 100644 index b76b95f71..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/llm/wrapper/LLMWrapper.java +++ /dev/null @@ -1,31 +0,0 @@ -// package com.app.openai.llm.wrapper; -// -// import com.app.openai.endpoint.Endpoint; -// import com.app.openai.llm.provider.LLMProvider; -// import com.app.openai.llm.provider.impl.OpenAiChatCompletionProvider; -// import com.app.openai.llm.service.LLMService; -// import com.app.rxjava.transformer.observable.EdgeChain; -// -// public class LLMWrapper { -// -// private final String prompt; -// -// private static final String OPENAI_CHAT_COMPLETION_API = -// "https://api.openai.com/v1/chat/completions"; -// -// public LLMWrapper(String prompt) { -// this.prompt = prompt; -// } -// -// public EdgeChain request(LLMProvider provider) { -// LLMService llmService = new LLMService(provider); -// return llmService.request(prompt); -// } -// -// public EdgeChain chatCompletion(String OPENAI_API_KEY, String model, String role){ -// OpenAiChatCompletionProvider provider = new OpenAiChatCompletionProvider -// (new Endpoint(OPENAI_CHAT_COMPLETION_API, OPENAI_API_KEY), model, role); -// -// return request(provider); -// } -// } diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/parser/Scratchpad.java b/FlySpring/autoroute/src/main/java/com/app/openai/parser/Scratchpad.java deleted file mode 100644 index 729e73b46..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/parser/Scratchpad.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.app.openai.parser; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Scratchpad { - - private List scratchpadList; - - public Scratchpad(String textoutput) { - scratchpadList = new ArrayList<>(); - String regex = - "(Thought \\d+:.*?(?=Thought \\d+|Action \\d+|Observation \\d+|$))|(Action" - + " \\d+:.*?(?=Thought \\d+|Action \\d+|Observation \\d+|$))|(Observation" - + " \\d+:.*?(?=Thought \\d+|Action \\d+|Observation \\d+|$))"; - Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); - Matcher matcher = pattern.matcher(textoutput); - - while (matcher.find()) { - scratchpadList.add(matcher.group().trim()); - } - } - - public List getScratchpadList() { - return scratchpadList; - } - - // Method to extract content between brackets for a given action index - public String getActionContent() { - String actionContent = null; - for (String item : scratchpadList) { - if (item.startsWith("Action") && item.contains("Search")) { - Pattern pattern = Pattern.compile("\\[(.*?)\\]"); - Matcher matcher = pattern.matcher(item); - if (matcher.find()) { - actionContent = matcher.group(1); - } - break; - } - } - return actionContent; - } - - // Method to replace the content of an action by the given index with a new string called - // wikiContentForAction - public void observationReplacer(String newString) { - boolean observationFound = false; - int observationIndex = -1; - for (int i = 0; i < scratchpadList.size(); i++) { - String item = scratchpadList.get(i); - if (item.startsWith("Observation")) { - String updatedItem = "Observation: " + newString; - scratchpadList.set(i, updatedItem); - observationFound = true; - observationIndex = i; - break; - } - } - if (!observationFound) { - scratchpadList.add("Observation: " + newString); - observationIndex = scratchpadList.size() - 1; - } - - // Remove everything after the newly added or updated observation - if (observationIndex >= 0 && observationIndex < scratchpadList.size() - 1) { - scratchpadList.subList(observationIndex + 1, scratchpadList.size()).clear(); - } - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/parser/StringParser.java b/FlySpring/autoroute/src/main/java/com/app/openai/parser/StringParser.java deleted file mode 100644 index 9260a900b..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/parser/StringParser.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.app.openai.parser; - -public class StringParser { - - private String output; - private String[] thoughts; - private String[] actions; - private String[] observations; - private String finalAnswer; - - public StringParser(String output) { - this.output = output; - splitOutput(); - } - - private void splitOutput() { - String[] blocks = output.split("(?<=\\D)(?=Thought \\d+:)"); - - actions = new String[blocks.length]; - thoughts = new String[blocks.length]; - observations = new String[blocks.length]; - - for (int i = 0; i < blocks.length; i++) { - String[] parts = blocks[i].split("(?<=\\D)(?=Action \\d+:)"); - if (parts.length == 2) { - thoughts[i] = parts[0].trim(); - actions[i] = parts[1].trim(); - } - parts = actions[i].split("(?<=\\D)(?=Observation \\d+:)"); - if (parts.length == 2) { - actions[i] = parts[0].trim(); - observations[i] = parts[1].trim(); - } - } - - String finalAnswerPattern = "Action \\d+: Finish\\["; - int finalAnswerIndex = output.lastIndexOf(finalAnswerPattern); - if (finalAnswerIndex >= 0) { - finalAnswer = output.substring(finalAnswerIndex + finalAnswerPattern.length()).trim(); - int endIndex = finalAnswer.indexOf("]"); - if (endIndex >= 0) { - finalAnswer = finalAnswer.substring(0, endIndex); - } - - // Remove final answer from the last action - actions[actions.length - 1] = - actions[actions.length - 1].replace("Finish[" + finalAnswer + "]", "").trim(); - } - } - - public String[] getThoughts() { - return thoughts; - } - - public String[] getActions() { - return actions; - } - - public String[] getObservations() { - return observations; - } - - public String getFinalAnswer() { - return finalAnswer; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/parser/TextExtractorForWiki.java b/FlySpring/autoroute/src/main/java/com/app/openai/parser/TextExtractorForWiki.java deleted file mode 100644 index dda6326cc..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/parser/TextExtractorForWiki.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.app.openai.parser; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -// used this class for debugging. -public class TextExtractorForWiki { - - public static String extractTextFromBrackets(String input) { - Pattern pattern = Pattern.compile("\\[(.*?)\\]"); - Matcher matcher = pattern.matcher(input); - String extractedText = null; - if (matcher.find()) { - extractedText = matcher.group(1); - } - return extractedText; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/builder/PluginBuilder.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/builder/PluginBuilder.java deleted file mode 100644 index e20e6b817..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/builder/PluginBuilder.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.app.openai.plugin.builder; - -import com.app.openai.endpoint.Endpoint; -import com.app.openai.llm.service.LLMService; -import com.app.openai.plugin.parser.PluginJSONParser; -import com.app.openai.plugin.response.PluginResponse; -import com.app.openai.plugin.services.PluginResponseService; -import com.app.openai.plugin.services.PluginService; -import com.app.openai.plugin.tool.ApiConfig; -import com.app.openai.plugin.tool.PluginTool; -import com.app.openai.prompt.PromptTemplate; -import com.app.openai.prompt.impl.CompletionPrompt; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; - -public class PluginBuilder { - - public static Observable requestAPI( - LLMService llmService, Endpoint pluginAPI, Endpoint specAPI, String query) { - - // Create PluginResponseService Constructor - PluginResponseService pluginResponseService = new PluginResponseService(pluginAPI, specAPI); - - // Fetch Plugin Information - PluginResponse pluginResponse = pluginResponseService.getPluginResponse(); - - // Use Plugin Service - PluginService pluginService = - new PluginService( - llmService, pluginResponse, new CompletionPrompt(pluginResponse).getPrompt(), query); - - return pluginService.request(); - } - - public static Observable requestAPI( - LLMService llmService, - Endpoint pluginAPI, - Endpoint specAPI, - PromptTemplate promptTemplate, - String query) { - - // Create PluginResponseService Constructor - PluginResponseService pluginResponseService = new PluginResponseService(pluginAPI, specAPI); - - // Fetch Plugin Information - PluginResponse pluginResponse = pluginResponseService.getPluginResponse(); - - // Use Plugin Service - PluginService pluginService = - new PluginService(llmService, pluginResponse, promptTemplate.getPrompt(), query); - - return pluginService.request(); - } - - public static Observable requestJSON( - LLMService llmService, PluginJSONParser pluginJSONParser, String query) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - - PluginTool pluginTool = - objectMapper.readValue(pluginJSONParser.getPluginJSON(), PluginTool.class); - pluginTool.setApi( - objectMapper.readValue(pluginJSONParser.getApiConfigJson(), ApiConfig.class)); - - PluginResponse pluginResponse = - new PluginResponse(pluginTool, pluginJSONParser.getSpecAPIJson()); - - // Use Plugin Service - PluginService pluginService = - new PluginService( - llmService, pluginResponse, new CompletionPrompt(pluginResponse).getPrompt(), query); - - return pluginService.request(); - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - public static Observable requestJSON( - LLMService llmService, - PluginJSONParser pluginJSONParser, - PromptTemplate promptTemplate, - String query) { - try { - - ObjectMapper objectMapper = new ObjectMapper(); - - PluginTool pluginTool = - objectMapper.readValue(pluginJSONParser.getPluginJSON(), PluginTool.class); - pluginTool.setApi( - objectMapper.readValue(pluginJSONParser.getApiConfigJson(), ApiConfig.class)); - - PluginResponse pluginResponse = - new PluginResponse(pluginTool, pluginJSONParser.getSpecAPIJson()); - - // Use Plugin Service - PluginService pluginService = - new PluginService(llmService, pluginResponse, promptTemplate.getPrompt(), query); - - return pluginService.request(); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/parser/PluginJSONParser.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/parser/PluginJSONParser.java deleted file mode 100644 index 9cba77dfd..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/parser/PluginJSONParser.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.app.openai.plugin.parser; - -public class PluginJSONParser { - - private String pluginJSON; - private String apiConfigJson; - private String specAPIJson; - - public PluginJSONParser(String pluginJSON, String specAPIJson) { - this.pluginJSON = pluginJSON; - this.specAPIJson = specAPIJson; - } - - public PluginJSONParser(String pluginJSON, String apiConfigJson, String specAPIJson) { - this.pluginJSON = pluginJSON; - this.apiConfigJson = apiConfigJson; - this.specAPIJson = specAPIJson; - } - - public String getPluginJSON() { - return pluginJSON; - } - - public void setPluginJSON(String pluginJSON) { - this.pluginJSON = pluginJSON; - } - - public String getApiConfigJson() { - return apiConfigJson; - } - - public void setApiConfigJson(String apiConfigJson) { - this.apiConfigJson = apiConfigJson; - } - - public String getSpecAPIJson() { - return specAPIJson; - } - - public void setSpecAPIJson(String specAPIJson) { - this.specAPIJson = specAPIJson; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/parser/PluginParser.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/parser/PluginParser.java deleted file mode 100644 index c0df314eb..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/parser/PluginParser.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.app.openai.plugin.parser; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class PluginParser { - - private final String action; - private final String observation; - - private PluginParser(String action, String observation) { - this.action = action; - this.observation = observation; - } - - public static String parse(String nameForModel, String openAPISpec) { - return new PluginParser("Action: " + nameForModel, "Observation: " + openAPISpec).toString(); - } - - public static List extractUrls(String response) { - - List urlList = new ArrayList<>(); - - StringTokenizer tokenizer = new StringTokenizer(parseOpenAPIResponse(response), "\n"); - - while (tokenizer.hasMoreTokens()) { - - String token = tokenizer.nextToken(); - - if (token.startsWith("Action Input: ")) { - - String regex = - "\\b((?:https?|ftp|file):" - + "//[-a-zA-Z0-9+&@#/%?=" - + "~_|!:, .;]*[-a-zA-Z0-9+" - + "&@#/%=~_|])"; - - // Compile the Regular Expression - Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); - - Matcher m = p.matcher(token); - while (m.find()) { - urlList.add(token.substring(m.start(0), m.end(0))); - } - } - } - - return urlList; - } - - public static String getFinalAnswer(String response) { - // Initializing Variables; - String finalAnswer = null; - StringTokenizer tokenizer = new StringTokenizer(parseOpenAPIResponse(response), "\n"); - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken(); - if (token.startsWith("Final Answer: ")) { - finalAnswer = token; - break; - } - } - - return finalAnswer; - } - - @Override - public String toString() { - return action + "\n" + observation; - } - - private static String parseOpenAPIResponse(String body) { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode outputJsonNode = null; - try { - outputJsonNode = objectMapper.readTree(body); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - System.out.println("Pretty String: " + outputJsonNode.toPrettyString()); - return outputJsonNode.get("choices").get(0).get("text").asText(); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/response/PluginResponse.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/response/PluginResponse.java deleted file mode 100644 index 704aa69ce..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/response/PluginResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.app.openai.plugin.response; - -import com.app.openai.plugin.tool.PluginTool; - -import java.util.StringJoiner; - -public class PluginResponse { - - private PluginTool plugin; - private String openApiSpec; - - public PluginResponse() {} - - public PluginResponse(PluginTool plugin, String openApiSpec) { - this.plugin = plugin; - this.openApiSpec = openApiSpec; - } - - public PluginTool getPlugin() { - return plugin; - } - - public String getOpenApiSpec() { - return openApiSpec; - } - - public void setOpenApiSpec(String openApiSpec) { - this.openApiSpec = openApiSpec; - } - - @Override - public String toString() { - return new StringJoiner(", ", PluginResponse.class.getSimpleName() + "[", "]") - .add("plugin=" + plugin) - .add("openApiSpec='" + openApiSpec + "'") - .toString(); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/services/PluginResponseService.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/services/PluginResponseService.java deleted file mode 100644 index 0447d8ea6..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/services/PluginResponseService.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.app.openai.plugin.services; - -import com.app.openai.chains.PluginResponseChain; -import com.app.openai.endpoint.Endpoint; -import com.app.openai.plugin.response.PluginResponse; -import com.app.openai.plugin.tool.PluginTool; -import com.app.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestTemplate; - -public class PluginResponseService { - - private RestTemplate restTemplate = new RestTemplate(); - - private final Endpoint pluginEndpoint; - private final Endpoint pluginSpecEndpoint; - - public PluginResponseService(Endpoint pluginEndpoint, Endpoint pluginSpecEndpoint) { - this.pluginEndpoint = pluginEndpoint; - this.pluginSpecEndpoint = pluginSpecEndpoint; - } - - public PluginResponse getPluginResponse() { - return new PluginResponseChain( - Observable.create( - emitter -> { - try { - Observable obs1 = - this.requestPluginAPI(pluginEndpoint).getScheduledObservableWithRetry(); - Observable obs2 = - this.requestSpecAPI(pluginSpecEndpoint).getScheduledObservableWithRetry(); - - PluginResponse response = - new EdgeChain<>(Observable.zip(obs1, obs2, PluginResponse::new)) - .getWithOutRetry(); - - emitter.onNext(response); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })) - .getWithOutRetry(); - } - - private EdgeChain requestPluginAPI(Endpoint pluginEndpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(pluginEndpoint.getApiKey()); - - PluginTool response = - this.restTemplate - .exchange( - pluginEndpoint.getUrl(), - HttpMethod.GET, - new HttpEntity<>(headers), - PluginTool.class) - .getBody(); - - emitter.onNext(response); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })); - } - - private EdgeChain requestSpecAPI(Endpoint pluginSpecEndpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(pluginSpecEndpoint.getApiKey()); - - String response = - this.restTemplate - .exchange( - pluginSpecEndpoint.getUrl(), - HttpMethod.GET, - new HttpEntity<>(headers), - String.class) - .getBody(); - - emitter.onNext(response); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/services/PluginService.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/services/PluginService.java deleted file mode 100644 index 3f9a31520..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/services/PluginService.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.app.openai.plugin.services; - -import com.app.openai.chains.PluginChain; -import com.app.openai.llm.service.LLMService; -import com.app.openai.plugin.parser.PluginParser; -import com.app.openai.plugin.response.PluginResponse; -import com.app.rxjava.utils.Atom; -import com.app.rxjava.utils.AtomInteger; -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestTemplate; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; - -public class PluginService { - - private RestTemplate restTemplate = new RestTemplate(); - - private static final Integer DEFAULT_RETRY_ATTEMPT = 3; - private static final String DEFAULT_MESSAGE = "Couldn't extract information about: "; - - private final LLMService llmService; - private final PluginResponse pluginResponse; - private final String initialPrompt; - private final String query; - - public PluginService( - LLMService llmService, PluginResponse pluginResponse, String initialPrompt, String query) { - this.llmService = llmService; - this.pluginResponse = pluginResponse; - this.initialPrompt = initialPrompt; - this.query = query; - } - - public Observable request() { - - AtomInteger retryCount = AtomInteger.of(0); - Atom terminateWhileLoop = Atom.of(false); - - return new PluginChain( - Observable.create( - emitter -> { - try { - - StringBuilder prompt = new StringBuilder(); - prompt - .append(initialPrompt) - .append("\n") - .append(query) - .append("\n"); // Updating Prompt - - // Step 4: Send The Request & Now Append the Parse Response to Prompt; - String initialResponse = initializePlugin(llmService, pluginResponse, prompt); - prompt.append(initialResponse); - - // Step 8: Fetch JSON Response from URLs extracted via - // ActionInput; - String jsonResponse = sendRequestWithOpenAPISpec(llmService, prompt); - prompt.append(jsonResponse); - - if (jsonResponse.isEmpty()) { - // WILL Retry FOR MAX_RETRY + 1 = 3 + 1; 4 times... - if (retryCount.incrementAndGet() > DEFAULT_RETRY_ATTEMPT) { - terminateWhileLoop.set(true); - } - emitter.onNext(DEFAULT_MESSAGE + query); - } else { - terminateWhileLoop.set(true); - emitter.onNext(this.sendExtractedJsonResponse(llmService, prompt)); - } - - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })) - .doWhileLoop(terminateWhileLoop::get) - .getObservable(); - } - - private String initializePlugin( - LLMService llmService, PluginResponse pluginResponse, StringBuilder prompt) { - try { - // Step 2: Create PluginRequest (which act as JSON body for RestTemplate) & Send POST request - // to OPENAPI Completion - llmService.request(prompt.toString()).getWithRetry(); - - // Step 3: Parse The Initial Response Using PluginParser - return PluginParser.parse( - pluginResponse.getPlugin().getName_for_model(), pluginResponse.getOpenApiSpec()); - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - private String sendRequestWithOpenAPISpec(LLMService llmService, StringBuilder prompt) { - try { - System.out.println("Logging"); - - // Step 5: Create PluginRequest & Send To CreateCompletion OpenAPI - String response = llmService.request(prompt.toString()).getWithRetry(); - - // Step 6: Parse the Response & Fetch Http GET request from ActionInput - List urlList = PluginParser.extractUrls(response); - - // Step 7: Loop Over URL List & Test if anyone of them works; - String jsonResponse = null; - - System.out.println("URL List: " + urlList.size()); - - Iterator iterator = urlList.iterator(); - while (iterator.hasNext()) { - String str = iterator.next(); - System.out.println("URL: " + str); - jsonResponse = extractJsonBody(str); - if (Objects.nonNull(jsonResponse)) { - break; - } - } - - return Objects.requireNonNullElse(jsonResponse, ""); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - private String sendExtractedJsonResponse(LLMService llmService, StringBuilder prompt) { - try { - String response = llmService.request(prompt.toString()).getWithRetry(); - return PluginParser.getFinalAnswer(response); - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - // Validating if the response is JSON & returning it; - private String extractJsonBody(String url) { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - - // Create HttpEntity with headers and body - HttpEntity entity = new HttpEntity<>(headers); - - try { - String body = this.restTemplate.exchange(url, HttpMethod.GET, entity, String.class).getBody(); - - if (isValidJSON(body)) { - return body; - } - return null; - } catch (final Exception e) { - return null; - } - } - - private boolean isValidJSON(String json) { - - ObjectMapper mapper = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS); - - try { - mapper.readTree(json); - } catch (JacksonException e) { - return false; - } - return true; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/template/PluginTemplate.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/template/PluginTemplate.java deleted file mode 100644 index a41e8cea8..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/template/PluginTemplate.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.app.openai.plugin.template; - -import com.app.openai.endpoint.Endpoint; -import com.app.openai.llm.provider.impl.OpenAiCompletionProvider; -import com.app.openai.llm.service.LLMService; -import com.app.openai.plugin.builder.PluginBuilder; -import com.app.openai.plugin.parser.PluginJSONParser; -import com.app.rxjava.retry.RetryPolicy; -import com.app.rxjava.transformer.observable.EdgeChain; - -public class PluginTemplate { - - public static EdgeChain buildWithAPI( - OpenAiCompletionProvider provider, String query, String pluginURL, String specAPI) { - return new EdgeChain<>( - PluginBuilder.requestAPI( - new LLMService(provider), new Endpoint(pluginURL), new Endpoint(specAPI), query)); - } - - public static EdgeChain buildWithAPI( - OpenAiCompletionProvider provider, - String query, - String pluginURL, - String specAPI, - RetryPolicy retryPolicy) { - return new EdgeChain<>( - PluginBuilder.requestAPI( - new LLMService(provider), - new Endpoint(pluginURL, retryPolicy), - new Endpoint(specAPI, retryPolicy), - query)); - } - - public static EdgeChain buildWithJSON( - OpenAiCompletionProvider provider, PluginJSONParser parser, String query) { - return new EdgeChain<>(PluginBuilder.requestJSON(new LLMService(provider), parser, query)); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/tool/ApiConfig.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/tool/ApiConfig.java deleted file mode 100644 index a08e14605..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/tool/ApiConfig.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.app.openai.plugin.tool; - -public class ApiConfig { - - private String type; - private String url; - private Boolean has_user_authentication; - private Boolean is_user_authenticated; - - public ApiConfig() {} - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public Boolean getHas_user_authentication() { - return has_user_authentication; - } - - public void setHas_user_authentication(Boolean has_user_authentication) { - this.has_user_authentication = has_user_authentication; - } - - public Boolean getIs_user_authenticated() { - return is_user_authenticated; - } - - public void setIs_user_authenticated(Boolean is_user_authenticated) { - this.is_user_authenticated = is_user_authenticated; - } - - @Override - public String toString() { - return "ApiConfig{" - + "type='" - + type - + '\'' - + ", url='" - + url - + '\'' - + ", has_user_authentication=" - + has_user_authentication - + ", is_user_authenticated=" - + is_user_authenticated - + '}'; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/tool/PluginTool.java b/FlySpring/autoroute/src/main/java/com/app/openai/plugin/tool/PluginTool.java deleted file mode 100644 index 119437de1..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/plugin/tool/PluginTool.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.app.openai.plugin.tool; - -import java.util.StringJoiner; - -public class PluginTool { - - private String schema_version; - private String name_for_model; - private String name_for_human; - private String description_for_model; - private String description_for_human; - - private ApiConfig api; - private String logo_url; - private String contact_email; - private String legal_info_url; - - public String getSchema_version() { - return schema_version; - } - - public void setSchema_version(String schema_version) { - this.schema_version = schema_version; - } - - public String getName_for_model() { - return name_for_model; - } - - public void setName_for_model(String name_for_model) { - this.name_for_model = name_for_model; - } - - public String getName_for_human() { - return name_for_human; - } - - public void setName_for_human(String name_for_human) { - this.name_for_human = name_for_human; - } - - public String getDescription_for_model() { - return description_for_model; - } - - public void setDescription_for_model(String description_for_model) { - this.description_for_model = description_for_model; - } - - public String getDescription_for_human() { - return description_for_human; - } - - public void setDescription_for_human(String description_for_human) { - this.description_for_human = description_for_human; - } - - public ApiConfig getApi() { - return api; - } - - public void setApi(ApiConfig api) { - this.api = api; - } - - public String getLogo_url() { - return logo_url; - } - - public void setLogo_url(String logo_url) { - this.logo_url = logo_url; - } - - public String getContact_email() { - return contact_email; - } - - public void setContact_email(String contact_email) { - this.contact_email = contact_email; - } - - public String getLegal_info_url() { - return legal_info_url; - } - - public void setLegal_info_url(String legal_info_url) { - this.legal_info_url = legal_info_url; - } - - @Override - public String toString() { - return new StringJoiner(", ", PluginTool.class.getSimpleName() + "[", "]") - .add("schema_version='" + schema_version + "'") - .add("name_for_model='" + name_for_model + "'") - .add("name_for_human='" + name_for_human + "'") - .add("description_for_model='" + description_for_model + "'") - .add("description_for_human='" + description_for_human + "'") - .add("api=" + api) - .add("logo_url='" + logo_url + "'") - .add("contact_email='" + contact_email + "'") - .add("legal_info_url='" + legal_info_url + "'") - .toString(); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/prompt/PromptTemplate.java b/FlySpring/autoroute/src/main/java/com/app/openai/prompt/PromptTemplate.java deleted file mode 100644 index 72717a4af..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/prompt/PromptTemplate.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.app.openai.prompt; - -public interface PromptTemplate { - - String getPrompt(); -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/prompt/impl/CompletionPrompt.java b/FlySpring/autoroute/src/main/java/com/app/openai/prompt/impl/CompletionPrompt.java deleted file mode 100644 index ced780c8b..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/prompt/impl/CompletionPrompt.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.app.openai.prompt.impl; - -import com.app.openai.plugin.response.PluginResponse; -import com.app.openai.prompt.PromptTemplate; - -public class CompletionPrompt implements PromptTemplate { - - private final PluginResponse pluginResponse; - - public CompletionPrompt(PluginResponse pluginResponse) { - this.pluginResponse = pluginResponse; - } - - @Override - public String getPrompt() { - return "Answer the following questions as best you can. You have access to the following tools:" - + " requests_get, " - + pluginResponse.getPlugin().getName_for_model() - + "\n" - + pluginResponse.getPlugin().getName_for_model() - + ": " - + String.format( - "Call this tool to get the OpenAPI spec (and usage guide) for interacting with the %s" - + " API ", - pluginResponse.getPlugin().getName_for_human()) - + String.format( - "You should only call this ONCE! What is the %s API useful for? ", - pluginResponse.getPlugin().getName_for_human()) - + pluginResponse.getPlugin().getDescription_for_human() - + "\n" - + "requests_get: A portal to the internet. Use this when you need to get specific content" - + " from a website. Input should be a url (i.e. https://www.google.com). The output will" - + " be the text response of the GET request. \n" - + "Use the following format:\n" - + "\n" - + String.format( - "Question: the input question you must answer\n" - + "Thought: you should always think about what to do\n" - + "Action: the action to take, should be one of [requests_get, %s]\n" - + "Action Input: the input to the action\n" - + "Observation: the result of the action\n" - + "... (this Thought/Action/Action Input/Observation can repeat N times)\n" - + "Thought: I now know the final answer\n" - + "Final Answer: the final answer to the original input question\n\n" - + "Begin! And always use the openapi spec for creating the API get requests.\n", - pluginResponse.getPlugin().getName_for_model()); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/request/ChatCompletionRequest.java b/FlySpring/autoroute/src/main/java/com/app/openai/request/ChatCompletionRequest.java deleted file mode 100644 index 1801148e2..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/request/ChatCompletionRequest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.app.openai.request; - -import java.util.List; -import java.util.Objects; - -public class ChatCompletionRequest { - - private String model; - private Double temperature; - private List messages; - - public ChatCompletionRequest(String model, List messages, Double temperature) { - this.model = model; - this.messages = messages; - this.temperature = Objects.isNull(temperature) ? 0.7 : temperature; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public List getMessages() { - return messages; - } - - public void setMessages(List messages) { - this.messages = messages; - } - - public Double getTemperature() { - return temperature; - } - - public void setTemperature(Double temperature) { - this.temperature = temperature; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionRequest{"); - sb.append("model='").append(model).append('\''); - sb.append(", temperature=").append(temperature); - sb.append(", messages=").append(messages); - sb.append('}'); - return sb.toString(); - } - - public static ChatCompletionRequestBuilder builder() { - return new ChatCompletionRequestBuilder(); - } - - public static class ChatCompletionRequestBuilder { - private String model; - private Double temperature; - private List messages; - - public ChatCompletionRequestBuilder model(String model) { - this.model = model; - return this; - } - - public ChatCompletionRequestBuilder temperature(Double temperature) { - this.temperature = temperature; - return this; - } - - public ChatCompletionRequestBuilder messages(List messages) { - this.messages = messages; - return this; - } - - public ChatCompletionRequest build() { - return new ChatCompletionRequest(model, messages, temperature); - } - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/request/ChatMessage.java b/FlySpring/autoroute/src/main/java/com/app/openai/request/ChatMessage.java deleted file mode 100644 index 9a994a004..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/request/ChatMessage.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.app.openai.request; - -public class ChatMessage { - String role; - String content; - - public ChatMessage(String role, String content) { - this.role = role; - this.content = content; - } - - public String getRole() { - return role; - } - - public String getContent() { - return content; - } - - @Override - public String toString() { - return "ChatMessage{" + "role='" + role + '\'' + ", content='" + content + '\'' + '}'; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/openai/request/CompletionRequest.java b/FlySpring/autoroute/src/main/java/com/app/openai/request/CompletionRequest.java deleted file mode 100644 index 7c58a8586..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/openai/request/CompletionRequest.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.app.openai.request; - -public class CompletionRequest { - - private String prompt; - private String model; - private Double temperature; - private Integer max_tokens; - private Double top_p; - private Double frequency_penalty; - private Double presence_penalty; - - public CompletionRequest( - String prompt, - String model, - Double temperature, - Integer max_tokens, - Double top_p, - Double frequency_penalty, - Double presence_penalty) { - this.prompt = prompt; - this.model = model; - this.temperature = temperature; - this.max_tokens = max_tokens; - this.top_p = top_p == null ? 1.0 : top_p; - this.frequency_penalty = frequency_penalty == null ? 0.0 : frequency_penalty; - this.presence_penalty = presence_penalty == null ? 0.0 : presence_penalty; - } - - public String getPrompt() { - return prompt; - } - - public void setPrompt(String prompt) { - this.prompt = prompt; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public Double getTemperature() { - return temperature; - } - - public void setTemperature(Double temperature) { - this.temperature = temperature; - } - - public Integer getMax_tokens() { - return max_tokens; - } - - public void setMax_tokens(Integer max_tokens) { - this.max_tokens = max_tokens; - } - - public Double getTop_p() { - return top_p; - } - - public void setTop_p(Double top_p) { - this.top_p = top_p; - } - - public Double getFrequency_penalty() { - return frequency_penalty; - } - - public void setFrequency_penalty(Double frequency_penalty) { - this.frequency_penalty = frequency_penalty; - } - - public Double getPresence_penalty() { - return presence_penalty; - } - - public void setPresence_penalty(Double presence_penalty) { - this.presence_penalty = presence_penalty; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CompletionRequest{"); - sb.append("prompt='").append(prompt).append('\''); - sb.append(", model='").append(model).append('\''); - sb.append(", temperature=").append(temperature); - sb.append(", max_tokens=").append(max_tokens); - sb.append(", top_p=").append(top_p); - sb.append(", frequency_penalty=").append(frequency_penalty); - sb.append(", presence_penalty=").append(presence_penalty); - sb.append('}'); - return sb.toString(); - } - - public static CompletionRequestBuilder builder() { - return new CompletionRequestBuilder(); - } - - public static class CompletionRequestBuilder { - private String prompt; - private String model; - private Double temperature; - private Integer max_tokens; - private Double top_p; - private Double frequency_penalty; - private Double presence_penalty; - - public CompletionRequestBuilder prompt(String prompt) { - this.prompt = prompt; - return this; - } - - public CompletionRequestBuilder model(String model) { - this.model = model; - return this; - } - - public CompletionRequestBuilder temperature(Double temperature) { - this.temperature = temperature; - return this; - } - - public CompletionRequestBuilder maxTokens(Integer max_tokens) { - this.max_tokens = max_tokens; - return this; - } - - public CompletionRequestBuilder topP(Double top_p) { - this.top_p = top_p; - return this; - } - - public CompletionRequestBuilder frequencyPenalty(Double frequency_penalty) { - this.frequency_penalty = frequency_penalty; - return this; - } - - public CompletionRequestBuilder presencePenalty(Double presence_penalty) { - this.presence_penalty = presence_penalty; - return this; - } - - public CompletionRequest build() { - return new CompletionRequest( - this.prompt, - this.model, - this.temperature, - this.max_tokens, - this.top_p, - this.frequency_penalty, - this.presence_penalty); - } - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/RetryPolicy.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/RetryPolicy.java deleted file mode 100644 index 3a35da13c..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/RetryPolicy.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.app.rxjava.retry; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.functions.Function; - -import java.io.Serializable; - -public abstract class RetryPolicy - implements Function, Observable>, Serializable { - - private static final long serialVersionUID = -3531903621076848363L; -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/impl/ExponentialDelay.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/impl/ExponentialDelay.java deleted file mode 100644 index db03b915b..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/impl/ExponentialDelay.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.app.rxjava.retry.impl; - -import com.app.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.functions.Function; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.TimeUnit; - -public class ExponentialDelay extends RetryPolicy { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final long firstDelay; - private final int maxRetries; - private final int factor; - private final TimeUnit unit; - private int retryCount; - - public ExponentialDelay(long firstDelay, int maxRetries, int factor, TimeUnit unit) { - this.firstDelay = firstDelay; - this.maxRetries = maxRetries; - this.factor = factor; - this.unit = unit; - } - - @Override - public Observable apply(Observable observable) throws Throwable { - return observable.flatMap( - (Function>) - throwable -> { - long compute = compute(firstDelay, retryCount, factor, unit); - - if (++retryCount < maxRetries) { - logger.info("Retrying it.... " + throwable.getMessage()); - return Observable.timer(compute, TimeUnit.MILLISECONDS); - } - - logger.error(throwable.getMessage()); - return Observable.error(throwable); - }); - } - - private long compute( - final long firstDelay, final int retryCount, final double factor, TimeUnit unit) { - return Math.round(Math.pow(factor, retryCount) * unit.toMillis(firstDelay)); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/impl/FixedDelay.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/impl/FixedDelay.java deleted file mode 100644 index a03aadee1..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/retry/impl/FixedDelay.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.app.rxjava.retry.impl; - -import com.app.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.functions.Function; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.TimeUnit; - -public class FixedDelay extends RetryPolicy { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private final int maxRetries; - private final int retryDelay; - private final TimeUnit unit; - private int retryCount; - - public FixedDelay(int maxRetries, int retryDelay, TimeUnit unit) { - this.maxRetries = maxRetries; - this.retryDelay = retryDelay; - this.unit = unit; - this.retryCount = 0; - } - - @Override - public Observable apply(final Observable attempts) { - return attempts.flatMap( - (Function>) - throwable -> { - if (++retryCount < maxRetries) { - // Unsubscribe the original observable & resubscribed it. - logger.info("Retrying it.... " + throwable.getMessage()); - return Observable.timer(unit.toMillis(retryDelay), TimeUnit.MILLISECONDS); - } - - // Once, max-retries hit, emit an error. - logger.error(throwable.getMessage()); - return Observable.error(throwable); - }); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/transformer/observable/AbstractEdgeChain.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/transformer/observable/AbstractEdgeChain.java deleted file mode 100644 index 37cebeb9a..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/transformer/observable/AbstractEdgeChain.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.app.rxjava.transformer.observable; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.ObservableSource; -import io.reactivex.rxjava3.core.Scheduler; -import io.reactivex.rxjava3.functions.*; - -import java.io.Serializable; - -public abstract class AbstractEdgeChain implements Serializable { - - private static final long serialVersionUID = -7323653750095226732L; - - protected Observable observable; - - public AbstractEdgeChain(Observable observable) { - this.observable = observable; - } - - public abstract AbstractEdgeChain transform(Function mapper); - - public abstract AbstractEdgeChain combine( - ObservableSource other, BiFunction zipper); - - public abstract AbstractEdgeChain filter(Predicate predicate); - - public abstract AbstractEdgeChain mergeWith(ObservableSource other); - - public abstract AbstractEdgeChain concatWith(ObservableSource other); - - public abstract AbstractEdgeChain doOnComplete(Action onComplete); - - public abstract AbstractEdgeChain doOnNext(Consumer onNext); - - public abstract AbstractEdgeChain doOnError(Consumer onError); - - public abstract AbstractEdgeChain schedule(); - - public abstract AbstractEdgeChain schedule(Scheduler scheduler); - - public abstract AbstractEdgeChain doWhileLoop(BooleanSupplier booleanSupplier); - - public abstract void execute(); - - public abstract void execute(Consumer onNext, Consumer onError); - - public abstract void execute( - Consumer onNext, Consumer onError, Action onComplete); - - public abstract Observable getObservable(); - - public abstract Observable getScheduledObservableWithRetry(); - - public abstract Observable getScheduledObservableWithoutRetry(); - - public abstract T getWithRetry(Scheduler scheduler); - - public abstract T getWithRetry(); - - public abstract T getWithOutRetry(); - - /* For completable implementation */ - public abstract void awaitWithRetry(); - - public abstract void awaitWithoutRetry(); - - public abstract void completed(); - - public abstract void completed(Action onComplete); - - public abstract void completed(Action onComplete, Consumer onError); -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/transformer/observable/EdgeChain.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/transformer/observable/EdgeChain.java deleted file mode 100644 index b16e288a1..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/transformer/observable/EdgeChain.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.app.rxjava.transformer.observable; - -import com.app.openai.endpoint.Endpoint; -import com.app.rxjava.retry.impl.FixedDelay; -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.ObservableSource; -import io.reactivex.rxjava3.core.Scheduler; -import io.reactivex.rxjava3.functions.*; -import io.reactivex.rxjava3.schedulers.Schedulers; - -import java.io.Serializable; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -public class EdgeChain extends AbstractEdgeChain implements Serializable { - - private static final long serialVersionUID = 297269864039510096L; - - private static final int MAX_RETRIES = 4; - private static final int FIXED_DELAY = 3; - private static final TimeUnit UNIT = TimeUnit.SECONDS; - - private Endpoint endpoint; - - public EdgeChain(Observable observable) { - super(observable); - } - - public EdgeChain(Observable observable, Endpoint endpoint) { - super(observable); - this.endpoint = endpoint; - } - - @Override - public EdgeChain transform(Function mapper) { - return new EdgeChain<>(this.observable.map(mapper), endpoint); - } - - @Override - public EdgeChain combine(ObservableSource other, BiFunction zipper) { - return new EdgeChain<>(this.observable.zipWith(other, zipper), endpoint); - } - - @Override - public EdgeChain filter(Predicate predicate) { - return new EdgeChain<>(this.observable.filter(predicate), endpoint); - } - - @Override - public EdgeChain mergeWith(ObservableSource other) { - return new EdgeChain<>(this.observable.mergeWith(other), endpoint); - } - - @Override - public EdgeChain concatWith(ObservableSource other) { - return new EdgeChain<>(this.observable.concatWith(other), endpoint); - } - - @Override - public AbstractEdgeChain doOnComplete(Action onComplete) { - return new EdgeChain<>(this.observable.doOnComplete(onComplete), endpoint); - } - - @Override - public EdgeChain doOnNext(@NonNull Consumer onNext) { - return new EdgeChain<>(this.observable.doOnNext(onNext), endpoint); - } - - @Override - public EdgeChain doOnError(@NonNull Consumer onError) { - return new EdgeChain<>(this.observable.doOnError(onError), endpoint); - } - - @Override - public EdgeChain schedule() { - return new EdgeChain<>(this.observable.subscribeOn(Schedulers.io()), endpoint); - } - - @Override - public EdgeChain schedule(Scheduler scheduler) { - return new EdgeChain<>(this.observable.subscribeOn(scheduler), endpoint); - } - - /** - * Wrapper implementation of doWhile loop - * - * @param booleanSupplier - * @return - */ - @Override - public EdgeChain doWhileLoop(BooleanSupplier booleanSupplier) { - return new EdgeChain<>(this.observable.repeatUntil(booleanSupplier), endpoint); - } - - @Override - public void execute() { - this.observable - .subscribeOn(Schedulers.io()) - .retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy()) - .subscribe(); - } - - @Override - public void execute(Consumer onNext, Consumer onError) { - this.observable - .subscribeOn(Schedulers.io()) - .retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy()) - .subscribe(onNext, onError); - } - - @Override - public void execute( - Consumer onNext, Consumer onError, Action onComplete) { - this.observable - .subscribeOn(Schedulers.io()) - .retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy()) - .subscribe(onNext, onError, onComplete); - } - - @Override - public Observable getScheduledObservableWithRetry() { - return this.observable - .retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy()) - .subscribeOn(Schedulers.io()); - } - - @Override - public Observable getScheduledObservableWithoutRetry() { - return this.observable.subscribeOn(Schedulers.io()); - } - - @Override - public T getWithRetry(Scheduler scheduler) { - return this.observable - .subscribeOn(scheduler) - .retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy()) - .firstOrError() - .blockingGet(); - } - - @Override - public T getWithRetry() { - return this.observable - .retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy()) - .firstOrError() - .blockingGet(); - } - - @Override - public T getWithOutRetry() { - return this.observable.firstOrError().blockingGet(); - } - - @Override - public Observable getObservable() { - return this.observable; - } - - @Override - public void awaitWithRetry() { - Completable.fromObservable( - this.observable.retryWhen( - Objects.isNull(endpoint) - ? new FixedDelay(MAX_RETRIES, FIXED_DELAY, UNIT) - : endpoint.getRetryPolicy())) - .blockingAwait(); - } - - @Override - public void awaitWithoutRetry() { - Completable.fromObservable(this.observable).blockingAwait(); - } - - @Override - public void completed() { - Completable.fromObservable(this.observable).subscribeOn(Schedulers.io()).subscribe(); - } - - @Override - public void completed(Action onComplete) { - Completable.fromObservable(this.observable).subscribeOn(Schedulers.io()).subscribe(onComplete); - } - - @Override - public void completed(Action onComplete, Consumer onError) { - Completable.fromObservable(this.observable) - .subscribeOn(Schedulers.io()) - .subscribe(onComplete, onError); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/utils/Atom.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/utils/Atom.java deleted file mode 100644 index dd669416c..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/utils/Atom.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.app.rxjava.utils; - -import java.util.concurrent.atomic.AtomicReference; - -/** - * Simple wrapper over an AtomicReference - * - * @param The type of data stored in the atom. An immutable object. - */ -public final class Atom { - private final AtomicReference ref; - - private Atom(T data) { - this.ref = new AtomicReference<>(data); - } - - public static Atom of(T data) { - return new Atom<>(data); - } - - public T set(T data) { - this.ref.set(data); - return data; - } - - public T get() { - return this.ref.get(); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/app/rxjava/utils/AtomInteger.java b/FlySpring/autoroute/src/main/java/com/app/rxjava/utils/AtomInteger.java deleted file mode 100644 index 5bd3cc984..000000000 --- a/FlySpring/autoroute/src/main/java/com/app/rxjava/utils/AtomInteger.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.app.rxjava.utils; - -import java.io.Serializable; -import java.util.concurrent.atomic.AtomicInteger; - -/** Simple wrapper over an AtomicInteger */ -public final class AtomInteger implements Serializable { - - private static final long serialVersionUID = 2089141378144025092L; - private final AtomicInteger ref; - - private AtomInteger(Integer data) { - this.ref = new AtomicInteger(data); - } - - public static AtomInteger of(Integer data) { - return new AtomInteger(data); - } - - public Integer incrementAndGet() { - return this.ref.incrementAndGet(); - } - - public Integer getAndIncrement() { - return this.ref.getAndIncrement(); - } - - public Integer get() { - return this.ref.get(); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AudienceValidator.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AudienceValidator.java deleted file mode 100644 index 2df7ac2a4..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AudienceValidator.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.flyspring.autoroute; - -import org.springframework.security.oauth2.core.OAuth2Error; -import org.springframework.security.oauth2.core.OAuth2TokenValidator; -import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult; -import org.springframework.security.oauth2.jwt.Jwt; - -public class AudienceValidator implements OAuth2TokenValidator { - private final String audience; - - AudienceValidator(String audience) { - this.audience = audience; - } - - public OAuth2TokenValidatorResult validate(Jwt jwt) { - OAuth2Error error = new OAuth2Error("invalid_token", "The required audience is missing", null); - - if (jwt.getAudience().contains(audience)) { - return OAuth2TokenValidatorResult.success(); - } - return OAuth2TokenValidatorResult.failure(error); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AuthConfig.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AuthConfig.java deleted file mode 100644 index 8b0af3299..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AuthConfig.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.flyspring.autoroute; - -import java.util.*; -import java.util.stream.Collectors; - -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.*; -import org.springframework.core.convert.converter.Converter; -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.*; -import org.springframework.security.config.web.server.ServerHttpSecurity.AuthorizeExchangeSpec; -import org.springframework.security.oauth2.core.*; -import org.springframework.security.oauth2.jwt.*; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; -import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter; -import org.springframework.security.web.server.*; - -import reactor.core.publisher.Mono; - -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -@Configuration -@EnableConfigurationProperties(AuthProperties.class) -@EnableWebFluxSecurity -public class AuthConfig { - - @Autowired private AuthProperties authProperties; - - @Bean - public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { - if (authProperties.type == null || authProperties.type.isEmpty()) - return http.authorizeExchange().anyExchange().permitAll().and().cors().and().build(); - - AuthorizeExchangeSpec spec = http.authorizeExchange(); - requireRoles(spec); - spec.pathMatchers("/route/secured/**").authenticated(); - spec.pathMatchers("/**").permitAll(); - http.cors() - .and() - .oauth2ResourceServer() - .jwt() - .jwtAuthenticationConverter(grantedAuthoritiesExtractor()); - return http.build(); - } - - private void requireRoles(AuthorizeExchangeSpec spec) { - String requestPrefix = "/route/secured/role/"; - String rootPackage = "com.application.project.myapi.secured.role"; - Reflections reflections = new Reflections(rootPackage, new SubTypesScanner(false)); - Set roles = new HashSet<>(); - reflections.getSubTypesOf(Object.class).stream() - .forEach( - clazz -> { - String name = clazz.getPackage().getName(); - if (name.equals(rootPackage)) return; - name = name.replace(rootPackage + ".", ""); - if (name.contains(".")) return; - roles.add(name); - }); - for (String role : roles) { - spec.pathMatchers(requestPrefix + role + "/**").hasRole(role.toUpperCase()); - } - } - - @Bean - @ConditionalOnProperty(prefix = "flyspring.auth", name = "type", havingValue = "auth0") - ReactiveJwtDecoder jwtDecoder() { - NimbusReactiveJwtDecoder jwtDecoder = - (NimbusReactiveJwtDecoder) - ReactiveJwtDecoders.fromOidcIssuerLocation(authProperties.issuer); - - OAuth2TokenValidator audienceValidator = new AudienceValidator(authProperties.audience); - OAuth2TokenValidator withIssuer = - JwtValidators.createDefaultWithIssuer(authProperties.issuer); - OAuth2TokenValidator withAudience = - new DelegatingOAuth2TokenValidator<>( - withIssuer, audienceValidator, new JwtTimestampValidator()); - - jwtDecoder.setJwtValidator(withAudience); - - return jwtDecoder; - } - - Converter> grantedAuthoritiesExtractor() { - GrantedAuthoritiesExtractor extractor = - new GrantedAuthoritiesExtractor(authProperties.audience); - return new ReactiveJwtAuthenticationConverterAdapter(extractor); - } - - static class GrantedAuthoritiesExtractor extends JwtAuthenticationConverter { - private String audience; - - public GrantedAuthoritiesExtractor(String audience) { - super(); - this.audience = audience; - } - - protected Collection extractAuthorities(Jwt jwt) { - Collection authorities = - (Collection) jwt.getClaims().get(audience + "/roles"); - if (authorities == null) authorities = new LinkedList(); - return authorities.stream() - .map(role -> "ROLE_" + role) - .map(SimpleGrantedAuthority::new) - .collect(Collectors.toList()); - } - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AuthProperties.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AuthProperties.java deleted file mode 100644 index cbafa53c2..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/AuthProperties.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.flyspring.autoroute; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(prefix = "flyspring.auth") -public class AuthProperties { - String type; - String issuer; - String audience; - - public String getType() { - return this.type; - } - - public void setType(String type) { - this.type = type; - } - - public String getIssuer() { - return this.issuer; - } - - public void setIssuer(String issuer) { - this.issuer = issuer; - } - - public String getAudience() { - return this.audience; - } - - public void setAudience(String audience) { - this.audience = audience; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/FlyRequest.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/FlyRequest.java deleted file mode 100644 index 57883c553..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/FlyRequest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.flyspring.autoroute; - -import java.util.List; -import java.util.Map; - -import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.support.ServerRequestWrapper; - -import com.fasterxml.jackson.databind.JsonNode; - -import reactor.core.publisher.Mono; - -public class FlyRequest extends ServerRequestWrapper { - - private ServerRequest request; - - public FlyRequest(ServerRequest delegate) { - super(delegate); - this.request = delegate; - } - - public String getQueryParam(String key) { - if (request.queryParams().isEmpty()) return ""; - else return request.queryParams().getFirst(key); - } - - public List getQueryParamArray(String key) { - List listString = request.queryParams().get(key); - return listString; - } - - public MultiValueMap getQueryParams() { - return request.queryParams(); - } - - public Map getPathVariables() { - return request.pathVariables(); - } - - public String getPathVariable(String key) { - return request.pathVariables().get(key); - } - - public Mono getRequestBody() { - return request.bodyToMono(JsonNode.class); - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/PropertiesLoader.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/PropertiesLoader.java deleted file mode 100644 index 544c907c0..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/PropertiesLoader.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.flyspring.autoroute; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -public class PropertiesLoader { - - public static Properties loadProperties(String resourceFileName) throws IOException { - Properties configuration = new Properties(); - InputStream inputStream = - PropertiesLoader.class.getClassLoader().getResourceAsStream(resourceFileName); - configuration.load(inputStream); - inputStream.close(); - return configuration; - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/RouterFunctionConfig.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/RouterFunctionConfig.java deleted file mode 100644 index ebb296dd3..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/RouterFunctionConfig.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.flyspring.autoroute; - -import java.lang.reflect.Method; -import java.util.*; -import java.util.stream.*; - -import org.glowroot.agent.api.Glowroot; -import org.glowroot.agent.api.Instrumentation; -import org.glowroot.agent.api.Instrumentation.Transaction; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.context.annotation.*; -import org.springframework.web.reactive.function.server.RouterFunctions.Builder; - -import com.flyspring.autoroute.annotations.PathVariableAnnotation; - -import org.springframework.web.reactive.function.server.*; - -import lombok.extern.slf4j.Slf4j; -import reactor.core.publisher.Mono; - -@Slf4j -@Configuration -public class RouterFunctionConfig { - - @Autowired private AutowireCapableBeanFactory autowireCapableBeanFactory; - private String prefix = "/route"; - private final String apiPackage = "com.application.project.myapi"; - - /** - * Register controllers' methods from package com.application.package.myapi as endpoints that - * starts with '/route' The route is dependant on the class name and the request type is dependant - * on the method name. - */ - @Bean - public RouterFunction routerFunction() { - return RouterFunctions.route() - .path( - prefix, - builder -> { - register(builder, apiPackage); - }) - .build(); - } - - private String getFileName(String fullName) { - return fullName.substring(fullName.lastIndexOf(".") + 1); - } - - /** - * Using Builder to register controllers' methods from package com.application.project.myapi as - * endpoints. The route is dependant on the class name and the request type is dependant on the - * method name. - */ - private void register(Builder builder, String packageName) { - Reflections reflections = new Reflections(packageName, new SubTypesScanner(false)); - reflections.getSubTypesOf(Object.class).stream() - .forEach( - clazz -> { - try { - registerFile(builder, clazz, getUrlFromClassName(clazz.getName())); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - - private String getUrlFromClassName(String className) { - String withoutPrefix = className.replaceFirst(apiPackage + ".", ""); - if (!withoutPrefix.contains(".")) return ""; - String withoutFileName = withoutPrefix.substring(0, withoutPrefix.lastIndexOf(".")); - return withoutFileName.replace(".", "/"); - } - - private void registerFile(Builder builder, Class clazz, String urlString) throws Exception { - String fileName = getFileName(clazz.getName()); - System.out.println("Filename without extention: " + fileName); - List methods = - Stream.of(clazz.getDeclaredMethods()) - .filter( - method -> - method.getName().toUpperCase().contains("FLY") - && !method.getName().contains("$")) - .collect(Collectors.toList()); - - String endPoint = urlString + "/" + fileName.replaceFirst("Fly", ""); - for (Method method : methods) { - String pathVariable = ""; - System.out.println("Methods in the class: " + method.getName()); - Method classMethod = clazz.getDeclaredMethod(method.getName(), FlyRequest.class); - if (classMethod.isAnnotationPresent(PathVariableAnnotation.class)) { - PathVariableAnnotation annotation = classMethod.getAnnotation(PathVariableAnnotation.class); - for (String p : annotation.name()) { - log.info(fileName + " pathVariables:{}", p); - pathVariable += "/" + p; - } - } - - String apiType = method.getName().toUpperCase().replace("FLY", ""); - log.info("APItype:{}", apiType); - log.info("Endpoint:{}", prefix + endPoint); - String path = endPoint + pathVariable; - switch (apiType) { - case "GET" -> builder.GET( - path, req -> invokeMethod(apiType, path, req, clazz, classMethod)); - case "POST" -> builder.POST( - path, req -> invokeMethod(apiType, path, req, clazz, classMethod)); - case "PATCH" -> builder.PATCH( - path, req -> invokeMethod(apiType, path, req, clazz, classMethod)); - case "PUT" -> builder.PUT( - path, req -> invokeMethod(apiType, path, req, clazz, classMethod)); - case "DELETE" -> builder.DELETE( - path, req -> invokeMethod(apiType, path, req, clazz, classMethod)); - } - } - } - - @Instrumentation.Timer("FlySpring Timer") - @Transaction( - timer = "FlySpring Timer", - traceHeadline = "", - transactionName = "FlySpring", - transactionType = "Web") - private Mono invokeMethod( - String apiType, String path, ServerRequest req, Class clazz, Method classMethod) { - try { - Glowroot.setTransactionName(apiType + ":" + prefix + path); - Object instance = clazz.getDeclaredConstructor().newInstance(); - instance = autowireCapableBeanFactory.createBean(clazz); - autowireCapableBeanFactory.autowireBean(instance); - Object result = classMethod.invoke(instance, new FlyRequest(req)); - if (result instanceof Mono) - return (Mono) classMethod.invoke(instance, new FlyRequest(req)); - return ServerResponse.ok().body(Mono.just(result), classMethod.getReturnType()); - } catch (Exception e) { - e.printStackTrace(); - return ServerResponse.ok().body(Mono.just("Exception " + apiType), String.class); - } - } -} diff --git a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/annotations/PathVariableAnnotation.java b/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/annotations/PathVariableAnnotation.java deleted file mode 100644 index f17ce7ab6..000000000 --- a/FlySpring/autoroute/src/main/java/com/flyspring/autoroute/annotations/PathVariableAnnotation.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.flyspring.autoroute.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface PathVariableAnnotation { - - public String[] name(); -} diff --git a/FlySpring/autoroute/src/main/resources/META-INF/spring.factories b/FlySpring/autoroute/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 5e0d552cb..000000000 --- a/FlySpring/autoroute/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.flyspring.autoroute.RouterFunctionConfig,\ -com.flyspring.autoroute.AuthConfig \ No newline at end of file diff --git a/FlySpring/autoroute/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/FlySpring/autoroute/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index bb885819e..000000000 --- a/FlySpring/autoroute/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1,2 +0,0 @@ -com.flyspring.autoroute.RouterFunctionConfig -com.flyspring.autoroute.AuthConfig \ No newline at end of file diff --git a/FlySpring/autoroute/src/test/java/com/flyspring/autoroute/AudienceValidatorTest.java b/FlySpring/autoroute/src/test/java/com/flyspring/autoroute/AudienceValidatorTest.java deleted file mode 100644 index 567de480d..000000000 --- a/FlySpring/autoroute/src/test/java/com/flyspring/autoroute/AudienceValidatorTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.flyspring.autoroute; - -import org.junit.jupiter.api.Test; -import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult; -import org.springframework.security.oauth2.jwt.Jwt; - -import java.time.Duration; -import java.time.Instant; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class AudienceValidatorTest { - @Test - public void testValidate_validAudience() { - String audience = "my-audience"; - Jwt jwt = createValidJwt(audience); - AudienceValidator validator = new AudienceValidator(audience); - - OAuth2TokenValidatorResult result = validator.validate(jwt); - System.out.println(jwt.getAudience().get(0).toLowerCase()); - assertFalse(result.hasErrors()); - } - - @Test - public void testValidate_missingAudience() { - String audience = "my-audience"; - Jwt jwt = createValidJwt("other-audience"); - AudienceValidator validator = new AudienceValidator(audience); - - OAuth2TokenValidatorResult result = validator.validate(jwt); - - assertTrue(result.hasErrors()); - assertEquals("invalid_token", result.getErrors().iterator().next().getErrorCode()); - } - - @Test - public void testValidate_multipleAudiences() { - String audience = "my-audience"; - Jwt jwt = createValidJwt("other-audience", audience, "third-audience"); - AudienceValidator validator = new AudienceValidator(audience); - - OAuth2TokenValidatorResult result = validator.validate(jwt); - - assertFalse(result.hasErrors()); - } - - @Test - public void testValidate_emptyAudience() { - String audience = ""; - Jwt jwt = createValidJwt(audience); - AudienceValidator validator = new AudienceValidator(audience); - - OAuth2TokenValidatorResult result = validator.validate(jwt); - - assertFalse(result.hasErrors()); - } - - private Jwt createValidJwt(String... audience) { - Instant now = Instant.now(); - Instant expiresAt = now.plus(Duration.ofHours(1)); - - Jwt jwt = - Jwt.withTokenValue("test-token-value") - .header("alg", "RS256") - .claim("iss", "test-issuer") - .claim("sub", "test-subject") - .audience(List.of(audience)) - .issuedAt(now) - .expiresAt(expiresAt) - .build(); - - return jwt; - } -} diff --git a/FlySpring/autoroute/src/test/java/com/flyspring/autoroute/FlyRequestTest.java b/FlySpring/autoroute/src/test/java/com/flyspring/autoroute/FlyRequestTest.java deleted file mode 100644 index 1d531b2c9..000000000 --- a/FlySpring/autoroute/src/test/java/com/flyspring/autoroute/FlyRequestTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.flyspring.autoroute; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -// import org.springframework.mock.web.reactive.function.server.MockServerRequest; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.server.ServerRequest; -import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Map; -import static org.junit.Assert.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - -class FlyRequestTest { - - @Test - void testGetQueryParam() { - ServerRequest mockedServerRequest = Mockito.mock(ServerRequest.class); - MultiValueMap queryParams = new LinkedMultiValueMap<>(); - queryParams.put("name", List.of("Alice")); - when(mockedServerRequest.queryParams()).thenReturn(queryParams); - FlyRequest flyRequest = new FlyRequest(mockedServerRequest); - String name = flyRequest.getQueryParam("name"); - assertEquals("Alice", name); - } - - @Test - void testGetQueryParamArray() { - ServerRequest mockedServerRequest = Mockito.mock(ServerRequest.class); - MultiValueMap queryParams = new LinkedMultiValueMap<>(); - queryParams.put("fruits", List.of("apple", "orange")); - when(mockedServerRequest.queryParams()).thenReturn(queryParams); - FlyRequest flyRequest = new FlyRequest(mockedServerRequest); - List fruits = flyRequest.getQueryParamArray("fruits"); - assertEquals(List.of("apple", "orange"), fruits); - } - - @Test - void testGetQueryParams() { - ServerRequest mockedServerRequest = Mockito.mock(ServerRequest.class); - MultiValueMap queryParams = new LinkedMultiValueMap<>(); - queryParams.put("name", List.of("Alice")); - queryParams.put("age", List.of("30")); - when(mockedServerRequest.queryParams()).thenReturn(queryParams); - FlyRequest flyRequest = new FlyRequest(mockedServerRequest); - MultiValueMap actualParams = flyRequest.getQueryParams(); - assertEquals(queryParams, actualParams); - } - - @Test - void testGetPathVariables() { - ServerRequest mockedServerRequest = Mockito.mock(ServerRequest.class); - Map pathVariables = Map.of("id", "123"); - when(mockedServerRequest.pathVariables()).thenReturn(pathVariables); - FlyRequest flyRequest = new FlyRequest(mockedServerRequest); - Map actualVariables = flyRequest.getPathVariables(); - assertEquals(pathVariables, actualVariables); - } - - @Test - void testGetPathVariable() { - ServerRequest mockedServerRequest = Mockito.mock(ServerRequest.class); - Map pathVariables = Map.of("id", "123"); - when(mockedServerRequest.pathVariables()).thenReturn(pathVariables); - FlyRequest flyRequest = new FlyRequest(mockedServerRequest); - String id = flyRequest.getPathVariable("id"); - assertEquals("123", id); - } - - @Test - void testGetRequestBody() { - ServerRequest mockedServerRequest = Mockito.mock(ServerRequest.class); - when(mockedServerRequest.bodyToMono(JsonNode.class)) - .thenReturn(Mono.just(new ObjectMapper().createObjectNode().put("name", "Alice"))); - FlyRequest flyRequest = new FlyRequest(mockedServerRequest); - JsonNode requestBody = flyRequest.getRequestBody().block(); - assertEquals(new ObjectMapper().createObjectNode().put("name", "Alice"), requestBody); - } - - @Test - public void testGetRequestBody_whenRequestIsNotNull_thenReturnsMonoJsonNode() { - ServerRequest request = Mockito.mock(ServerRequest.class); - FlyRequest flyRequest = new FlyRequest(request); - when(request.bodyToMono(JsonNode.class)) - .thenReturn(Mono.just(new ObjectMapper().createObjectNode())); - JsonNode requestBody = flyRequest.getRequestBody().block(); - assertNotNull(requestBody); - } -} diff --git a/FlySpring/edgechain-app/.gitignore b/FlySpring/edgechain-app/.gitignore deleted file mode 100644 index 848775e32..000000000 --- a/FlySpring/edgechain-app/.gitignore +++ /dev/null @@ -1,47 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -/src/main/java/com/edgechain/EdgeChainAppRunner.java -/src/main/resources/jbang.jar -/src/main/java/com/edgechain/Doc2VecExample.java -/src/main/java/com/edgechain/PineconeExample.java -/src/main/java/com/edgechain/PostgreSQLExample.java -/src/main/java/com/edgechain/RedisExample.java -/src/main/java/com/edgechain/SupabaseExample.java -/src/main/java/com/edgechain/WikiExample.java -/src/main/java/com/edgechain/OpenAiLoggerExample.java - -### VS Code ### -.vscode/ - - -/src/main/java/com/edgechain/HydeExample.java -/model/ diff --git a/FlySpring/edgechain-app/.mvn/wrapper/maven-wrapper.jar b/FlySpring/edgechain-app/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index cb28b0e37..000000000 Binary files a/FlySpring/edgechain-app/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/FlySpring/edgechain-app/.mvn/wrapper/maven-wrapper.properties b/FlySpring/edgechain-app/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index b27a13f1d..000000000 --- a/FlySpring/edgechain-app/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.2/apache-maven-3.9.2-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/FlySpring/edgechain-app/mvnw b/FlySpring/edgechain-app/mvnw deleted file mode 100644 index 66df28542..000000000 --- a/FlySpring/edgechain-app/mvnw +++ /dev/null @@ -1,308 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.2.0 -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "$(uname)" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin ; then - javaHome="$(dirname "\"$javaExecutable\"")" - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "\"$javaExecutable\"")" - fi - javaHome="$(dirname "\"$javaExecutable\"")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$(cd "$wdir/.." || exit 1; pwd) - fi - # end of workaround - done - printf '%s' "$(cd "$basedir" || exit 1; pwd)" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' < "$1" - fi -} - -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi -} - -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" -else - log "Couldn't find $wrapperJarPath, downloading it ..." - - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - fi - while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; - esac - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" - - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi - - if command -v wget > /dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; - esac -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - elif command -v shasum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." - exit 1 - fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 - exit 1 - fi -fi - -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/FlySpring/edgechain-app/mvnw.cmd b/FlySpring/edgechain-app/mvnw.cmd deleted file mode 100644 index 95ba6f54a..000000000 --- a/FlySpring/edgechain-app/mvnw.cmd +++ /dev/null @@ -1,205 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.2.0 -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B -) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% diff --git a/FlySpring/edgechain-app/pom.xml b/FlySpring/edgechain-app/pom.xml deleted file mode 100644 index 27b8f282b..000000000 --- a/FlySpring/edgechain-app/pom.xml +++ /dev/null @@ -1,378 +0,0 @@ - - - 4.0.0 - com.edgechain - edgechain-app - 1.0.0 - edgechain - EdgeChains SDK. - jar - - 17 - 17 - 17 - 0.23.0 - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-webflux - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - - redis.clients - jedis - 4.3.1 - - - - org.postgresql - postgresql - runtime - - - - javax.validation - validation-api - 2.0.1.Final - - - - com.github.f4b6a3 - uuid-creator - 5.2.0 - - - - org.hibernate.validator - hibernate-validator - 6.1.6.Final - - - - org.modelmapper - modelmapper - 3.1.1 - - - - io.jsonwebtoken - jjwt - 0.9.1 - - - - javax.xml.bind - jaxb-api - 2.3.1 - - - - - com.squareup.retrofit2 - retrofit - 2.9.0 - - - - com.squareup.retrofit2 - adapter-rxjava3 - 2.9.0 - - - - com.squareup.retrofit2 - converter-jackson - 2.9.0 - - - - org.apache.opennlp - opennlp-tools - 2.2.0 - - - - io.reactivex.rxjava3 - rxjava - 3.1.6 - - - - io.reactivex - rxjava-reactive-streams - 1.2.1 - - - - io.projectreactor.addons - reactor-adapter - 3.5.1 - - - - me.xuender - unidecode - 0.0.7 - - - - org.apache.tika - tika-core - 2.7.0 - - - - org.apache.tika - tika-parsers-standard-package - 2.7.0 - - - - ai.djl - api - ${djl.version} - - - - ai.djl - basicdataset - ${djl.version} - - - - ai.djl.huggingface - tokenizers - 0.23.0 - - - - ai.djl - model-zoo - ${djl.version} - - - - - - ai.djl.pytorch - pytorch-engine - ${djl.version} - - - - ai.djl.pytorch - pytorch-model-zoo - ${djl.version} - - - - - io.github.jam01 - xtrasonnet - 0.5.3 - - - - com.knuddels - jtokkit - 0.6.1 - - - - net.objecthunter - exp4j - 0.4.8 - - - - - info.picocli - picocli-spring-boot-starter - 4.7.0 - - - - net.lingala.zip4j - zip4j - 2.11.3 - - - - org.zeroturnaround - zt-exec - 1.12 - - - - org.testcontainers - testcontainers - 1.17.6 - - - - org.testcontainers - postgresql - - - - org.springframework.boot - spring-boot-starter-test - test - - - - ai.djl.onnxruntime - onnxruntime-engine - 0.23.0 - runtime - - - - - - - - - - org.springframework.boot - spring-boot-dependencies - 3.1.0 - pom - import - - - - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.apache.maven.plugins - maven-shade-plugin - 3.3.0 - - - org.springframework.boot - spring-boot-maven-plugin - 2.7.0 - - - - false - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - package - - shade - - - edgechain - - - META-INF/spring.handlers - META-INF/spring.schemas - - - META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - - - - - com.edgechain.EdgeChainApplication - - - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - download-and-unpack-jbang - generate-resources - - run - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java deleted file mode 100644 index 1e00dfc6c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.edgechain; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.servlet.handler.HandlerMappingIntrospector; - -import java.net.URL; -import java.nio.file.Paths; - -@SpringBootApplication -@EnableScheduling -public class EdgeChainApplication { - - private static final Logger logger = LoggerFactory.getLogger(EdgeChainApplication.class); - - public static void main(String[] args) { - - logger.info("Please avoid special symbols such as space in naming the directory."); - System.setProperty("jar.name", getJarFileName(EdgeChainApplication.class)); - logger.info("Executed jar file: " + System.getProperty("jar.name")); - - SpringApplication springApplication = - new SpringApplicationBuilder() - .sources(EdgeChainApplication.class) - .web(WebApplicationType.NONE) - .build(); - - springApplication.run(args); - } - - @Bean(name = "mvcHandlerMappingIntrospector") - public HandlerMappingIntrospector mvcHandlerMappingIntrospector() { - return new HandlerMappingIntrospector(); - } - - private static String getJarFileName(Class clazz) { - URL classResource = clazz.getResource(clazz.getSimpleName() + ".class"); - if (classResource == null) { - throw new RuntimeException("class resource is null"); - } - String url = classResource.toString(); - if (url.startsWith("jar:file:")) { - String path = url.replaceAll("^jar:(file:.*[.]jar)!/.*", "$1"); - try { - return Paths.get(new URL(path).toURI()).toString(); - } catch (Exception e) { - throw new RuntimeException("Invalid jar file"); - } - } - throw new RuntimeException("Invalid jar file"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java deleted file mode 100644 index e1091f97b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.edgechain.lib.chains; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; -import com.edgechain.lib.request.ArkRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PineconeRetrieval extends Retrieval { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private final PineconeEndpoint pineconeEndpoint; - - private final ArkRequest arkRequest; - private final Endpoint endpoint; - - public PineconeRetrieval( - PineconeEndpoint pineconeEndpoint, Endpoint endpoint, ArkRequest arkRequest) { - this.pineconeEndpoint = pineconeEndpoint; - this.endpoint = endpoint; - this.arkRequest = arkRequest; - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) - logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) - logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); - } - - @Override - public void upsert(String input) { - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) { - WordEmbeddings embeddings = - openAiEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.pineconeEndpoint.upsert(embeddings); - } else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) { - WordEmbeddings embeddings = - miniLMEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.pineconeEndpoint.upsert(embeddings); - } else - throw new RuntimeException( - "Invalid Endpoint; Only OpenAIEndpoint & MiniLMEndpoint are supported"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java deleted file mode 100644 index c888c03c9..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.edgechain.lib.chains; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.request.ArkRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PostgresRetrieval extends Retrieval { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private final PostgresEndpoint postgresEndpoint; - private final int dimensions; - - private final PostgresDistanceMetric metric; - private final int lists; - - private final String filename; - - private final ArkRequest arkRequest; - - private final Endpoint endpoint; - - public PostgresRetrieval( - PostgresEndpoint postgresEndpoint, - String filename, - int dimensions, - Endpoint endpoint, - ArkRequest arkRequest) { - this.postgresEndpoint = postgresEndpoint; - this.dimensions = dimensions; - this.filename = filename; - this.endpoint = endpoint; - this.arkRequest = arkRequest; - this.metric = PostgresDistanceMetric.COSINE; - this.lists = 2000; - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) - logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) - logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); - } - - public PostgresRetrieval( - PostgresEndpoint postgresEndpoint, - String filename, - int dimensions, - Endpoint endpoint, - ArkRequest arkRequest, - PostgresDistanceMetric metric, - int lists) { - this.postgresEndpoint = postgresEndpoint; - this.dimensions = dimensions; - this.filename = filename; - this.endpoint = endpoint; - this.arkRequest = arkRequest; - this.metric = metric; - this.lists = lists; - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) - logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) - logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); - } - - @Override - public void upsert(String input) { - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) { - WordEmbeddings embeddings = - openAiEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.postgresEndpoint.upsert( - embeddings, this.filename, this.dimensions, this.metric, this.lists); - } else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) { - WordEmbeddings embeddings = - miniLMEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.postgresEndpoint.upsert( - embeddings, this.filename, this.dimensions, this.metric, this.lists); - } else if (endpoint instanceof BgeSmallEndpoint bgeSmallEndpoint) { - WordEmbeddings embeddings = bgeSmallEndpoint.embeddings(input, arkRequest); - this.postgresEndpoint.upsert( - embeddings, this.filename, this.dimensions, this.metric, this.lists); - } else - throw new RuntimeException( - "Invalid Endpoint; Only OpenAIEndpoint & MiniLMEndpoint are supported"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java deleted file mode 100644 index 34d4c3d50..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.edgechain.lib.chains; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; -import com.edgechain.lib.index.enums.RedisDistanceMetric; -import com.edgechain.lib.request.ArkRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RedisRetrieval extends Retrieval { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private final RedisEndpoint redisEndpoint; - private final ArkRequest arkRequest; - private final Endpoint endpoint; - private final int dimension; - private final RedisDistanceMetric metric; - - public RedisRetrieval( - RedisEndpoint redisEndpoint, - Endpoint endpoint, - int dimension, - RedisDistanceMetric metric, - ArkRequest arkRequest) { - this.redisEndpoint = redisEndpoint; - this.endpoint = endpoint; - this.dimension = dimension; - this.metric = metric; - this.arkRequest = arkRequest; - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) - logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) - logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); - } - - @Override - public void upsert(String input) { - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) { - WordEmbeddings embeddings = - openAiEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.redisEndpoint.upsert(embeddings, dimension, metric); - } else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) { - WordEmbeddings embeddings = - miniLMEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.redisEndpoint.upsert(embeddings, dimension, metric); - } else - throw new RuntimeException( - "Invalid Endpoint; Only OpenAIEndpoint & MiniLMEndpoint are supported"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/Retrieval.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/Retrieval.java deleted file mode 100644 index 39916b97f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/Retrieval.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.edgechain.lib.chains; - -public abstract class Retrieval { - - public abstract void upsert(String input); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chunk/Chunker.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chunk/Chunker.java deleted file mode 100644 index d8296f180..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chunk/Chunker.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.edgechain.lib.chunk; - -import com.edgechain.lib.chunk.enums.LangType; -import opennlp.tools.sentdetect.SentenceDetectorME; -import opennlp.tools.sentdetect.SentenceModel; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; -import java.util.stream.IntStream; - -public class Chunker { - - private final String input; - - public Chunker(String input) { - this.input = input; - } - - public String[] byChunkSize(int chunkSize) { - - int noOfChunks = (int) Math.ceil((float) this.input.length() / chunkSize); - - return IntStream.range(0, noOfChunks) - .parallel() - .mapToObj( - i -> { - int start = i * chunkSize; - int end = Math.min((i + 1) * chunkSize, this.input.length()); - return this.input.substring(start, end).strip(); - }) - .toArray(String[]::new); - } - - public String[] bySentence(LangType langType) { - SentenceModel model = null; - try { - - if (langType.equals(LangType.EN)) - model = - new SentenceModel( - Objects.requireNonNull(getClass().getResourceAsStream("/en-sent.zip"))); - else if (langType.equals(LangType.FR)) - model = - new SentenceModel( - Objects.requireNonNull(getClass().getResourceAsStream("/fr-sent.zip"))); - else if (langType.equals(LangType.DE)) - model = - new SentenceModel( - Objects.requireNonNull(getClass().getResourceAsStream("/de-sent.zip"))); - else if (langType.equals(LangType.IT)) - model = - new SentenceModel( - Objects.requireNonNull(getClass().getResourceAsStream("/it-sent.zip"))); - else - model = - new SentenceModel( - Objects.requireNonNull(getClass().getResourceAsStream("/nl-sent.zip"))); - - } catch (IOException e) { - throw new RuntimeException(e); - } - SentenceDetectorME sdetector = new SentenceDetectorME(model); - - // detect sentences in the paragraph - return sdetector.sentDetect(this.input); - } - - public String[] bySentence(InputStream inputStream) { - - SentenceModel model = null; - try { - model = new SentenceModel(inputStream); - } catch (IOException e) { - throw new RuntimeException(e); - } - SentenceDetectorME sdetector = new SentenceDetectorME(model); - - // detect sentences in the paragraph - return sdetector.sentDetect(this.input); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chunk/enums/LangType.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chunk/enums/LangType.java deleted file mode 100644 index 5da66ce06..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chunk/enums/LangType.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.edgechain.lib.chunk.enums; - -public enum LangType { - EN, - FR, - DE, - IT, - NL -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/codeInterpreter/Eval.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/codeInterpreter/Eval.java deleted file mode 100644 index 5b6d839fa..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/codeInterpreter/Eval.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.edgechain.lib.codeInterpreter; - -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; - -public class Eval { - - public static double evaluateExpression(String input) { - Expression expression = new ExpressionBuilder(input).build(); - double result = expression.evaluate(); - System.out.println(result + " from Eval"); - return result; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/EdgeChainAutoConfiguration.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/EdgeChainAutoConfiguration.java deleted file mode 100644 index efb8d4b66..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/EdgeChainAutoConfiguration.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.configuration; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan(basePackages = {"com.edgechain.lib", "com.edgechain.lib.configuration"}) -public class EdgeChainAutoConfiguration {} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java deleted file mode 100644 index 60945770b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.edgechain.lib.configuration; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; -import java.util.Objects; - -@Configuration -public class PostgreSQLConfiguration { - - @Autowired private Environment env; - - @Bean - public DataSource dataSource() { - - String dbHost = env.getProperty("postgres.db.host"); - String dbUsername = env.getProperty("postgres.db.username"); - String dbPassword = env.getProperty("postgres.db.password"); - - return DataSourceBuilder.create() - .url(dbHost) - .driverClassName("org.postgresql.Driver") - .username(dbUsername) - .password(dbPassword) - .build(); - - // return DataSourceBuilder.create() - // .type(HikariDataSource.class) - // .url(dbHost) - // .driverClassName("org.postgresql.Driver") - // .username(dbUsername) - // .password(dbPassword) - // .build(); - } - - @Bean - public JdbcTemplate jdbcTemplate() { - return new JdbcTemplate(dataSource()); - } - - private boolean nonNullAndNotEmpty(String val) { - return Objects.nonNull(val) && val.trim().isEmpty(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java deleted file mode 100644 index 947c37cd9..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.edgechain.lib.configuration; - -import java.util.Objects; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; -import org.springframework.core.env.Environment; -import org.springframework.data.redis.connection.RedisPassword; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import redis.clients.jedis.JedisPooled; - -@Configuration -public class RedisConfiguration { - - @Autowired @Lazy private Environment env; - - @Bean - @Lazy - public JedisPooled jedisPooled() { - - int port = 6379; - String host = "127.0.0.1"; - - if (Objects.nonNull(env.getProperty("redis.port"))) { - port = Integer.parseInt(env.getProperty("redis.port")); - } - - if (Objects.nonNull(env.getProperty("redis.url"))) { - host = env.getProperty("redis.url"); - } - - return new JedisPooled( - host, port, env.getProperty("redis.username"), env.getProperty("redis.password")); - } - - @Bean - @Lazy - public JedisConnectionFactory jedisConnectionFactory() { - - int port = 6379; - String host = "127.0.0.1"; - - if (Objects.nonNull(env.getProperty("redis.port"))) { - port = Integer.parseInt(env.getProperty("redis.port")); - } - - if (Objects.nonNull(env.getProperty("redis.url"))) { - host = env.getProperty("redis.url"); - } - - RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration(); - redisConfiguration.setUsername(env.getProperty("redis.username")); - redisConfiguration.setPassword(RedisPassword.of(env.getProperty("redis.password"))); - redisConfiguration.setPort(port); - redisConfiguration.setHostName(host); - - return new JedisConnectionFactory(redisConfiguration); - } - - @Bean - public RedisTemplate redisTemplate() { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(jedisConnectionFactory()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); - redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); - redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); - redisTemplate.setEnableTransactionSupport(true); - redisTemplate.afterPropertiesSet(); - return redisTemplate; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java deleted file mode 100644 index 519730dc8..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.edgechain.lib.configuration; - -import com.edgechain.lib.configuration.domain.AuthFilter; -import com.edgechain.lib.configuration.domain.MethodAuthentication; -import com.edgechain.lib.configuration.domain.SecurityUUID; -import org.modelmapper.ModelMapper; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.web.client.RestTemplate; - -import java.util.List; -import java.util.UUID; - -@Configuration("WebConfiguration") -@Import(EdgeChainAutoConfiguration.class) -public class WebConfiguration { - - public static final String CONTEXT_PATH = "/edgechains"; - - @Bean - public ModelMapper modelMapper() { - return new ModelMapper(); - } - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - @Bean - @Primary - public SecurityUUID securityUUID() { - return new SecurityUUID(UUID.randomUUID().toString()); - } - - @Bean - public AuthFilter authFilter() { - AuthFilter filter = new AuthFilter(); - filter.setRequestPost(new MethodAuthentication(List.of(""), "")); - filter.setRequestGet(new MethodAuthentication(List.of(""), "")); - filter.setRequestDelete(new MethodAuthentication(List.of(""), "")); - filter.setRequestPatch(new MethodAuthentication(List.of(""), "")); - filter.setRequestPut(new MethodAuthentication(List.of(""), "")); - - return filter; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/context/ApplicationContextHolder.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/context/ApplicationContextHolder.java deleted file mode 100644 index 413bedc8c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/context/ApplicationContextHolder.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.edgechain.lib.configuration.context; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -@Component -public class ApplicationContextHolder implements ApplicationContextAware { - - private static ApplicationContext context; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - context = applicationContext; - } - - public static ApplicationContext getContext() { - return context; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/AuthFilter.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/AuthFilter.java deleted file mode 100644 index 183e01908..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/AuthFilter.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.edgechain.lib.configuration.domain; - -public class AuthFilter { - - private MethodAuthentication requestGet; - private MethodAuthentication requestPost; - private MethodAuthentication requestPut; - private MethodAuthentication requestDelete; - private MethodAuthentication requestPatch; - - public MethodAuthentication getRequestPost() { - return requestPost; - } - - public void setRequestPost(MethodAuthentication requestPost) { - this.requestPost = requestPost; - } - - public MethodAuthentication getRequestGet() { - return requestGet; - } - - public void setRequestGet(MethodAuthentication requestGet) { - this.requestGet = requestGet; - } - - public MethodAuthentication getRequestPut() { - return requestPut; - } - - public void setRequestPut(MethodAuthentication requestPut) { - this.requestPut = requestPut; - } - - public MethodAuthentication getRequestDelete() { - return requestDelete; - } - - public void setRequestDelete(MethodAuthentication requestDelete) { - this.requestDelete = requestDelete; - } - - public MethodAuthentication getRequestPatch() { - return requestPatch; - } - - public void setRequestPatch(MethodAuthentication requestPatch) { - this.requestPatch = requestPatch; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/MethodAuthentication.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/MethodAuthentication.java deleted file mode 100644 index 56e9130d0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/MethodAuthentication.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.edgechain.lib.configuration.domain; - -import java.util.ArrayList; -import java.util.List; - -public class MethodAuthentication { - - private List requests = new ArrayList<>(); - private String[] authorities; - - public MethodAuthentication(List requests, String... authorities) { - this.requests = requests; - this.authorities = authorities; - } - - public void setRequests(List requests) { - this.requests = requests; - } - - public void setAuthorities(String[] authorities) { - this.authorities = authorities; - } - - public String[] getRequests() { - return requests.toArray(String[]::new); - } - - public String[] getAuthorities() { - return authorities; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/SecurityUUID.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/SecurityUUID.java deleted file mode 100644 index 2a1a0fb0d..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/domain/SecurityUUID.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.edgechain.lib.configuration.domain; - -public class SecurityUUID { - - private String authKey; - - public SecurityUUID(String authKey) { - this.authKey = authKey; - } - - public String getAuthKey() { - return authKey; - } - - public void setAuthKey(String authKey) { - this.authKey = authKey; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/constants/EndpointConstants.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/constants/EndpointConstants.java deleted file mode 100644 index 7031d84d6..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/constants/EndpointConstants.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.edgechain.lib.constants; - -public class EndpointConstants { - - public static final String OPENAI_CHAT_COMPLETION_API = - "https://api.openai.com/v1/chat/completions"; - - public static final String OPENAI_EMBEDDINGS_API = "https://api.openai.com/v1/embeddings"; -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/HistoryContextClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/HistoryContextClient.java deleted file mode 100644 index ed4cd8a97..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/HistoryContextClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.edgechain.lib.context.client; - -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; - -public interface HistoryContextClient { - - EdgeChain create(String id, T endpoint); - - EdgeChain put(String key, String response, T endpoint); - - EdgeChain get(String key, T endpoint); - - EdgeChain delete(String key, T endpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java deleted file mode 100644 index 08b5e7538..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.edgechain.lib.context.client.impl; - -import com.edgechain.lib.context.client.HistoryContextClient; -import com.edgechain.lib.context.client.repositories.PostgreSQLHistoryContextRepository; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Objects; - -@Service -public class PostgreSQLHistoryContextClient - implements HistoryContextClient { - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired private PostgreSQLHistoryContextRepository historyContextRepository; - - @Autowired private JdbcTemplate jdbcTemplate; - - private static final String PREFIX = "historycontext:"; - - @Override - public EdgeChain create(String id, PostgreSQLHistoryContextEndpoint endpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - if (Objects.isNull(id) || id.isEmpty()) - throw new RuntimeException("Postgres history_context id cannot be empty or null"); - - this.createTable(); // Create Table IF NOT EXISTS; - - HistoryContext context = new HistoryContext(PREFIX + id, "", LocalDateTime.now()); - emitter.onNext(historyContextRepository.save(context)); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public EdgeChain put( - String id, String response, PostgreSQLHistoryContextEndpoint endpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HistoryContext historyContext = this.get(id, null).get(); - String input = response.replaceAll("'", ""); - historyContext.setResponse(input); - - HistoryContext returnValue = this.historyContextRepository.save(historyContext); - logger.info(String.format("%s is updated", id)); - - emitter.onNext(returnValue); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public EdgeChain get(String id, PostgreSQLHistoryContextEndpoint endpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - emitter.onNext( - this.historyContextRepository - .findById(id) - .orElseThrow( - () -> - new RuntimeException( - "PostgreSQL history_context id isn't found."))); - emitter.onComplete(); - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public EdgeChain delete(String id, PostgreSQLHistoryContextEndpoint endpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HistoryContext historyContext = this.get(id, null).get(); - this.historyContextRepository.delete(historyContext); - - emitter.onNext(""); - emitter.onComplete(); - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Transactional - public void createTable() { - jdbcTemplate.execute( - "CREATE TABLE IF NOT EXISTS history_context (id TEXT PRIMARY KEY, response TEXT, created_at" - + " timestamp)"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java deleted file mode 100644 index 962839794..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.edgechain.lib.context.client.impl; - -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.context.client.HistoryContextClient; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.core.env.Environment; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Repository; - -import java.time.LocalDateTime; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -@Repository -public class RedisHistoryContextClient - implements HistoryContextClient { - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - private static final String PREFIX = "historycontext:"; - - @Autowired private RedisTemplate redisTemplate; - - @Autowired @Lazy private Environment env; - - @Override - public EdgeChain create(String id, RedisHistoryContextEndpoint endpoint) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - if (Objects.isNull(id) || id.isEmpty()) - throw new RuntimeException("Redis key cannot be empty or null"); - - String key = PREFIX + id; - - if (this.redisTemplate.hasKey(key)) - throw new RuntimeException("Duplicate historycontext is not allowed."); - - HistoryContext context = new HistoryContext(); - context.setId(key); - context.setResponse(""); - context.setCreatedAt(LocalDateTime.now()); - - this.redisTemplate.opsForValue().set(key, context); - this.redisTemplate.expire( - key, Long.parseLong(env.getProperty("redis.ttl")), TimeUnit.SECONDS); - - emitter.onNext(context); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public EdgeChain put( - String key, String response, RedisHistoryContextEndpoint endpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HistoryContext historyContext = this.get(key, null).get(); - historyContext.setResponse(response); - - this.redisTemplate.opsForValue().set(key, historyContext); - this.redisTemplate.expire( - key, Long.parseLong(env.getProperty("redis.ttl")), TimeUnit.SECONDS); - - logger.info(String.format("%s is updated", key)); - - emitter.onNext(historyContext); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public EdgeChain get(String key, RedisHistoryContextEndpoint endpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - Boolean b = this.redisTemplate.hasKey(key); - if (Boolean.TRUE.equals(b)) { - emitter.onNext( - Objects.requireNonNull( - (HistoryContext) this.redisTemplate.opsForValue().get(key))); - emitter.onComplete(); - } else { - emitter.onError(new RuntimeException("Redis history_context id isn't found.")); - } - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - @Override - public EdgeChain delete(String key, RedisHistoryContextEndpoint endpoint) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - this.get(key, null).get(); - this.redisTemplate.delete(key); - emitter.onNext(""); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/jdbc/HistoryContextExtractor.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/jdbc/HistoryContextExtractor.java deleted file mode 100644 index 03f7912b7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/jdbc/HistoryContextExtractor.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.edgechain.lib.context.client.impl.jdbc; - -import com.edgechain.lib.context.domain.HistoryContext; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.ResultSetExtractor; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; - -public class HistoryContextExtractor implements ResultSetExtractor { - - @Override - public HistoryContext extractData(ResultSet rs) throws SQLException, DataAccessException { - - HistoryContext context = new HistoryContext(); - context.setId(rs.getString(1)); - context.setResponse(rs.getString(2)); - - Timestamp timestamp = rs.getTimestamp(3); - context.setCreatedAt(timestamp.toLocalDateTime()); - return context; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/jdbc/HistoryContextRowMapper.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/jdbc/HistoryContextRowMapper.java deleted file mode 100644 index 32dd5e5b3..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/jdbc/HistoryContextRowMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.edgechain.lib.context.client.impl.jdbc; - -import com.edgechain.lib.context.domain.HistoryContext; -import org.springframework.jdbc.core.RowMapper; - -import java.sql.ResultSet; -import java.sql.SQLException; - -public class HistoryContextRowMapper implements RowMapper { - - @Override - public HistoryContext mapRow(ResultSet rs, int rowNum) throws SQLException { - - HistoryContextExtractor extractor = new HistoryContextExtractor(); - return extractor.extractData(rs); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/repositories/PostgreSQLHistoryContextRepository.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/repositories/PostgreSQLHistoryContextRepository.java deleted file mode 100644 index 1879eb492..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/repositories/PostgreSQLHistoryContextRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.context.client.repositories; - -import com.edgechain.lib.context.domain.HistoryContext; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface PostgreSQLHistoryContextRepository extends JpaRepository {} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/domain/ContextPutRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/domain/ContextPutRequest.java deleted file mode 100644 index 7c34ea8dc..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/domain/ContextPutRequest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.edgechain.lib.context.domain; - -public class ContextPutRequest { - - private String id; - private String response; - private T endpoint; - - public ContextPutRequest() {} - - public ContextPutRequest(String id, String response, T endpoint) { - this.id = id; - this.response = response; - this.endpoint = endpoint; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getResponse() { - return response; - } - - public void setResponse(String response) { - this.response = response; - } - - public T getEndpoint() { - return endpoint; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/domain/HistoryContext.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/domain/HistoryContext.java deleted file mode 100644 index ed2b96e4a..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/domain/HistoryContext.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.edgechain.lib.context.domain; - -import com.edgechain.lib.response.ArkObject; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; -import org.json.JSONObject; - -import java.io.Serializable; -import java.time.LocalDateTime; - -@Entity(name = "HistoryContext") -@Table(name = "history_context") -public class HistoryContext implements ArkObject, Serializable { - - @Transient private static final long serialVersionUID = 2819947915596690671L; - - @Id private String id; - private String response; - - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - private LocalDateTime createdAt; - - public HistoryContext() {} - - public HistoryContext(String id, String response, LocalDateTime createdAt) { - this.id = id; - this.response = response; - this.createdAt = createdAt; - } - - public HistoryContext(String id, String response) { - this.id = id; - this.response = response; - } - - public String getResponse() { - return response; - } - - public void setResponse(String response) { - this.response = response; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(LocalDateTime createdAt) { - this.createdAt = createdAt; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("HistoryContext{"); - sb.append("id='").append(id).append('\''); - sb.append(", response='").append(response).append('\''); - sb.append(", createdAt=").append(createdAt); - sb.append('}'); - return sb.toString(); - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("id", id); - json.put("response", response); - json.put("createdAt", createdAt.toString()); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/ChatCompletionLoggerController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/ChatCompletionLoggerController.java deleted file mode 100644 index edf3a7731..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/ChatCompletionLoggerController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.logger.ChatCompletionLogger; -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import org.springframework.data.domain.Page; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.Objects; - -@RestController -@RequestMapping("/v1/logs/chat") -public class ChatCompletionLoggerController { - - private ChatCompletionLogger chatCompletionLogger; - - private ChatCompletionLogger getInstance() { - if (Objects.isNull(chatCompletionLogger)) - return chatCompletionLogger = new ChatCompletionLogger(); - else return chatCompletionLogger; - } - - @GetMapping("/findAll/{page}/{size}") - public Page findAll(@PathVariable int page, @PathVariable int size) { - return getInstance().findAll(page, size); - } - - @GetMapping("/findAll/sorted/{page}/{size}") - public Page findAllOrderByCompletedAtDesc( - @PathVariable int page, @PathVariable int size) { - return getInstance().findAllOrderByCompletedAtDesc(page, size); - } - - @PostMapping("/findByName/{page}/{size}") - public Page findAllByName( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByName(mapper.get("name"), page, size); - } - - @PostMapping("/findByName/sorted/{page}/{size}") - public Page findAllByNameOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByNameOrderByCompletedAtDesc(mapper.get("name"), page, size); - } - - @PostMapping("/findByModel/{page}/{size}") - public Page findAllByModel( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByModel(mapper.get("model"), page, size); - } - - @PostMapping("/findByModel/sorted/{page}/{size}") - public Page findAllByModelOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByModelOrderByCompletedAtDesc(mapper.get("model"), page, size); - } - - @PostMapping("/findByIdentifier/{page}/{size}") - public Page findAllByCallIdentifier( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByCallIdentifier(mapper.get("identifier"), page, size); - } - - @PostMapping("/findByIdentifier/sorted/{page}/{size}") - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance() - .findAllByCallIdentifierOrderByCompletedAtDesc(mapper.get("identifier"), page, size); - } - - @PostMapping("/findByLatencyLessThanEq/{page}/{size}") - public Page findAllByLatencyLessThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByLatencyLessThanEqual(mapper.get("latency"), page, size); - } - - @PostMapping("/findByLatencyGtrThanEq/{page}/{size}") - public Page findAllByLatencyGreaterThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByLatencyGreaterThanEqual(mapper.get("latency"), page, size); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java deleted file mode 100644 index 2163bc918..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.logger.EmbeddingLogger; -import com.edgechain.lib.logger.EmbeddingLogger; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import java.util.HashMap; -import java.util.Objects; - -import org.springframework.data.domain.Page; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/v1/logs/embeddings") -public class EmbeddingLoggerController { - - private EmbeddingLogger embeddingLogger; - - private EmbeddingLogger getInstance() { - if (Objects.isNull(embeddingLogger)) return embeddingLogger = new EmbeddingLogger(); - else return embeddingLogger; - } - - @GetMapping("/findAll/{page}/{size}") - public Page findAll(@PathVariable int page, @PathVariable int size) { - return getInstance().findAll(page, size); - } - - @GetMapping("/findAll/sorted/{page}/{size}") - public Page findAllOrderByCompletedAtDesc( - @PathVariable int page, @PathVariable int size) { - return getInstance().findAllOrderByCompletedAtDesc(page, size); - } - - @PostMapping("/findByModel/{page}/{size}") - public Page findAllByModel( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByModel(mapper.get("model"), page, size); - } - - @PostMapping("/findByModel/sorted/{page}/{size}") - public Page findAllByModelOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByModelOrderByCompletedAtDesc(mapper.get("model"), page, size); - } - - @PostMapping("/findByIdentifier/{page}/{size}") - public Page findAllByCallIdentifier( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByCallIdentifier(mapper.get("identifier"), page, size); - } - - @PostMapping("/findByIdentifier/sorted/{page}/{size}") - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance() - .findAllByCallIdentifierOrderByCompletedAtDesc(mapper.get("identifier"), page, size); - } - - @PostMapping("/findByLatencyLessThanEq/{page}/{size}") - public Page findAllByLatencyLessThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByLatencyLessThanEqual(mapper.get("latency"), page, size); - } - - @PostMapping("/findByLatencyGtrThanEq/{page}/{size}") - public Page findAllByLatencyGreaterThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return getInstance().findAllByLatencyGreaterThanEqual(mapper.get("latency"), page, size); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java deleted file mode 100644 index 1a44017c9..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; -import org.json.JSONObject; -import org.springframework.web.bind.annotation.*; - -import java.util.Objects; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -@RestController("App PgHistoryContextController") -@RequestMapping("/v1/postgresql/historycontext") -public class PgHistoryContextController { - - private PostgreSQLHistoryContextEndpoint endpoint; - - private PostgreSQLHistoryContextEndpoint getInstance() { - if (Objects.isNull(endpoint)) - return endpoint = - new PostgreSQLHistoryContextEndpoint(new FixedDelay(2, 5, TimeUnit.SECONDS)); - else return endpoint; - } - - /*** Creating HistoryContext (Using PostgreSQL) Controller ****/ - @PostMapping - public HistoryContext create( - @RequestParam(value = "id", defaultValue = "initialValue") String id) { - if (id.equals("initialValue")) - return getInstance().create(UUID.randomUUID().toString()); // Here randomId is generated. - else return getInstance().create(id); - } - - @PutMapping - public HistoryContext update(ArkRequest arkRequest) { - JSONObject json = arkRequest.getBody(); - return getInstance().put(json.getString("id"), json.getString("response")); - } - - @GetMapping - public HistoryContext getPostgreSQLHistoryContext(ArkRequest arkRequest) { - String id = arkRequest.getQueryParam("id"); - return getInstance().get(id); - } - - @DeleteMapping - public void delete(ArkRequest arkRequest) { - String id = arkRequest.getQueryParam("id"); - getInstance().delete(id); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java deleted file mode 100644 index 166bc7b6f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; - -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController("App PostgreSQLController") -@RequestMapping("/v1/postgres") -public class PostgresController { - - private PostgresEndpoint postgresEndpoint; - - private PostgresEndpoint getInstance() { - if (Objects.isNull(postgresEndpoint)) - return postgresEndpoint = - new PostgresEndpoint(new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - else return postgresEndpoint; - } - - @DeleteMapping("/deleteAll") - public StringResponse deletePostgres(ArkRequest arkRequest) { - - String table = arkRequest.getQueryParam("table"); - String namespace = arkRequest.getQueryParam("namespace"); - - getInstance().setTableName(table); - getInstance().setNamespace(namespace); - - return getInstance().deleteAll(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java deleted file mode 100644 index 950855fc2..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.endpoint.impl.RedisEndpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -@RestController("App RedisController") -@RequestMapping("/v1/redis") -public class RedisController { - - private RedisEndpoint redisEndpoint; - - private RedisEndpoint getInstance() { - if (Objects.isNull(redisEndpoint)) { - return redisEndpoint = new RedisEndpoint(new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - } else return redisEndpoint; - } - - /** Delete Redis By Pattern Name * */ - @DeleteMapping("/delete") - // delete all the - // keys start with machine-learning namespace - public void deleteRedis(ArkRequest arkRequest) { - String patternName = arkRequest.getQueryParam("pattern"); - getInstance().delete(patternName); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java deleted file mode 100644 index 9f956768a..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; -import org.json.JSONObject; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.Objects; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -@RestController("App RedisHistoryContextController") -@RequestMapping("/v1/redis/historycontext") -public class RedisHistoryContextController { - private RedisHistoryContextEndpoint endpoint; - - private RedisHistoryContextEndpoint getInstance() { - if (Objects.isNull(endpoint)) - return endpoint = new RedisHistoryContextEndpoint(new FixedDelay(2, 3, TimeUnit.SECONDS)); - else return endpoint; - } - - @PostMapping - public HistoryContext create( - @RequestParam(value = "id", defaultValue = "initialValue") String id) { - if (id.equals("initialValue")) - return getInstance().create(UUID.randomUUID().toString()); // Here randomId is generated. - else return getInstance().create(id); - } - - @PutMapping - public HistoryContext put(ArkRequest arkRequest) throws IOException { - JSONObject json = arkRequest.getBody(); - return getInstance().put(json.getString("id"), json.getString("response")); - } - - @GetMapping - public HistoryContext get(ArkRequest arkRequest) { - String id = arkRequest.getQueryParam("id"); - return getInstance().get(id); - } - - @DeleteMapping - public void deleteRedisHistoryContext(ArkRequest arkRequest) { - String id = arkRequest.getQueryParam("id"); - getInstance().delete(id); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java deleted file mode 100644 index 557cdb394..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.edgechain.lib.controllers; - -import com.edgechain.lib.endpoint.impl.SupabaseEndpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import com.edgechain.lib.supabase.utils.AuthUtils; -import org.json.JSONObject; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Objects; - -@RestController -@RequestMapping("/v1") -public class SupabaseController { - - private static SupabaseEndpoint supabaseEndpoint; - - private SupabaseEndpoint getInstance() { - if (Objects.isNull(supabaseEndpoint)) supabaseEndpoint = new SupabaseEndpoint(); - return supabaseEndpoint; - } - - @PostMapping( - value = "/signup") // Confirmation email is sent to the specified address.. Click on "Confirm - // your mail" - public SupabaseUser signUp(ArkRequest arkRequest) { - JSONObject json = arkRequest.getBody(); - return getInstance().signup(json.getString("email"), json.getString("password")); - } - - @PostMapping(value = "/login") - public AuthenticatedResponse login(ArkRequest arkRequest) { - JSONObject json = arkRequest.getBody(); - return getInstance().login(json.getString("email"), json.getString("password")); - } - - @PostMapping(value = "/refreshToken") - public AuthenticatedResponse refreshToken(ArkRequest arkRequest) { - JSONObject json = arkRequest.getBody(); - return getInstance().refreshToken(json.getString("refreshToken")); - } - - @PostMapping(value = "/signout") - @PreAuthorize("hasAuthority('authenticated')") - public void signOut(ArkRequest arkRequest) { - String accessToken = AuthUtils.extractToken(arkRequest); - getInstance().signOut(accessToken); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java deleted file mode 100644 index e5cb0101b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.edgechain.lib.embeddings; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.io.Serializable; -import java.util.List; - -public class WordEmbeddings implements ArkObject, Serializable { - - private static final long serialVersionUID = 2210956496609994219L; - private String id; - private List values; - private String score; - - public WordEmbeddings() {} - - // Postgres - public WordEmbeddings(String id) { - this.id = id; - } - - public WordEmbeddings(String id, List values) { - this.id = id; - this.values = values; - } - - public WordEmbeddings(String id, List values, String score) { - this.id = id; - this.values = values; - this.score = score; - } - - public WordEmbeddings(String id, String score) { - this.id = id; - this.score = score; - } - - public String getId() { - return id; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - - public String getScore() { - return score; - } - - public void setId(String id) { - this.id = id; - } - - public void setScore(String score) { - this.score = score; - } - - @Override - public String toString() { - return "Vector{" + "id='" + id + '\'' + ", values=" + values + ", score='" + score + '\'' + '}'; - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("id", id); - json.put("values", new JSONArray(values)); - json.put("score", score); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java deleted file mode 100644 index 905ff134f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.edgechain.lib.embeddings.bgeSmall; - -import ai.djl.MalformedModelException; -import ai.djl.huggingface.tokenizers.Encoding; -import ai.djl.huggingface.tokenizers.HuggingFaceTokenizer; -import ai.djl.inference.Predictor; -import ai.djl.ndarray.NDArray; -import ai.djl.ndarray.NDList; -import ai.djl.ndarray.NDManager; -import ai.djl.ndarray.types.DataType; -import ai.djl.repository.zoo.Criteria; -import ai.djl.repository.zoo.ModelNotFoundException; -import ai.djl.repository.zoo.ZooModel; -import ai.djl.training.util.ProgressBar; -import ai.djl.translate.Batchifier; -import ai.djl.translate.Translator; -import ai.djl.translate.TranslatorContext; -import com.edgechain.lib.embeddings.bgeSmall.response.BgeSmallResponse; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.LinkedList; -import java.util.List; - -@Service -public class BgeSmallClient { - - private BgeSmallEndpoint endpoint; - - private static volatile ZooModel bgeSmallEn; - - public BgeSmallEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(BgeSmallEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain createEmbeddings(String input) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - Predictor predictor = loadSmallBgeEn().newPredictor(); - float[] predict = predictor.predict(input); - List floatList = new LinkedList<>(); - for (float v : predict) { - floatList.add(v); - } - - emitter.onNext(new BgeSmallResponse(floatList)); - emitter.onComplete(); - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - private ZooModel loadSmallBgeEn() throws IOException { - - ZooModel r = bgeSmallEn; - - if (r == null) { - synchronized (this) { - r = bgeSmallEn; - if (r == null) { - Path path = Paths.get("./model"); - HuggingFaceTokenizer tokenizer = - HuggingFaceTokenizer.builder() - .optTokenizerPath(path) - .optManager(NDManager.newBaseManager("PyTorch")) - .build(); - - MyTextEmbeddingTranslator translator = - new MyTextEmbeddingTranslator(tokenizer, Batchifier.STACK, "cls", true, true); - - Criteria criteria = - Criteria.builder() - .setTypes(String.class, float[].class) - .optModelPath(path) - .optEngine("OnnxRuntime") - .optTranslator(translator) - .optProgress(new ProgressBar()) - .build(); - try { - r = criteria.loadModel(); - bgeSmallEn = r; - } catch (IOException | ModelNotFoundException | MalformedModelException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - } - return r; - } - - // Custom TextEmbeddingTranslator for BGE-Small Onnx Model - static final class MyTextEmbeddingTranslator implements Translator { - - private static final int[] AXIS = {0}; - - private HuggingFaceTokenizer tokenizer; - private Batchifier batchifier; - private boolean normalize; - private String pooling; - private boolean includeTokenTypes; - - MyTextEmbeddingTranslator( - HuggingFaceTokenizer tokenizer, - Batchifier batchifier, - String pooling, - boolean normalize, - boolean includeTokenTypes) { - this.tokenizer = tokenizer; - this.batchifier = batchifier; - this.pooling = pooling; - this.normalize = normalize; - this.includeTokenTypes = includeTokenTypes; - } - - /** {@inheritDoc} */ - @Override - public Batchifier getBatchifier() { - return batchifier; - } - - /** {@inheritDoc} */ - @Override - public NDList processInput(TranslatorContext ctx, String input) { - Encoding encoding = tokenizer.encode(input); - ctx.setAttachment("encoding", encoding); - return encoding.toNDList(ctx.getNDManager(), includeTokenTypes); - } - - /** {@inheritDoc} */ - @Override - public float[] processOutput(TranslatorContext ctx, NDList list) { - Encoding encoding = (Encoding) ctx.getAttachment("encoding"); - NDManager manager = ctx.getNDManager(); - NDArray embeddings = processEmbedding(manager, list, encoding, pooling); - if (normalize) { - embeddings = embeddings.normalize(2, 0); - } - - return embeddings.toFloatArray(); - } - - static NDArray processEmbedding( - NDManager manager, NDList list, Encoding encoding, String pooling) { - NDArray embedding = list.get("last_hidden_state"); - if (embedding == null) { - // For Onnx model, NDArray name is not present - embedding = list.head(); - } - long[] attentionMask = encoding.getAttentionMask(); - try (NDManager ptManager = NDManager.newBaseManager("PyTorch")) { - NDArray inputAttentionMask = ptManager.create(attentionMask).toType(DataType.FLOAT32, true); - switch (pooling) { - case "mean": - return meanPool(embedding, inputAttentionMask, false); - case "mean_sqrt_len": - return meanPool(embedding, inputAttentionMask, true); - case "max": - return maxPool(embedding, inputAttentionMask); - case "weightedmean": - return weightedMeanPool(embedding, inputAttentionMask); - case "cls": - return embedding.get(0); - default: - throw new AssertionError("Unexpected pooling mode: " + pooling); - } - } - } - - private static NDArray meanPool(NDArray embeddings, NDArray attentionMask, boolean sqrt) { - long[] shape = embeddings.getShape().getShape(); - attentionMask = attentionMask.expandDims(-1).broadcast(shape); - NDArray inputAttentionMaskSum = attentionMask.sum(AXIS); - NDArray clamp = inputAttentionMaskSum.clip(1e-9, 1e12); - NDArray prod = embeddings.mul(attentionMask); - NDArray sum = prod.sum(AXIS); - if (sqrt) { - return sum.div(clamp.sqrt()); - } - return sum.div(clamp); - } - - private static NDArray maxPool(NDArray embeddings, NDArray inputAttentionMask) { - long[] shape = embeddings.getShape().getShape(); - inputAttentionMask = inputAttentionMask.expandDims(-1).broadcast(shape); - inputAttentionMask = inputAttentionMask.eq(0); - embeddings = embeddings.duplicate(); - embeddings.set(inputAttentionMask, -1e9); // Set padding tokens to large negative value - - return embeddings.max(AXIS, true); - } - - private static NDArray weightedMeanPool(NDArray embeddings, NDArray attentionMask) { - long[] shape = embeddings.getShape().getShape(); - NDArray weight = embeddings.getManager().arange(1, shape[0] + 1); - weight = weight.expandDims(-1).broadcast(shape); - - attentionMask = attentionMask.expandDims(-1).broadcast(shape).mul(weight); - NDArray maskSum = attentionMask.sum(AXIS); - NDArray embeddingSum = embeddings.mul(attentionMask).sum(AXIS); - return embeddingSum.div(maskSum); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/response/BgeSmallResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/response/BgeSmallResponse.java deleted file mode 100644 index 9182ccc06..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/response/BgeSmallResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.edgechain.lib.embeddings.bgeSmall.response; - -import java.util.List; - -public class BgeSmallResponse { - - private List embedding; - - public BgeSmallResponse() {} - - public BgeSmallResponse(List embedding) { - this.embedding = embedding; - } - - public List getEmbedding() { - return embedding; - } - - public void setEmbedding(List embedding) { - this.embedding = embedding; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java deleted file mode 100644 index b3c958995..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.edgechain.lib.embeddings.miniLLM; - -import ai.djl.MalformedModelException; -import ai.djl.huggingface.translator.TextEmbeddingTranslatorFactory; -import ai.djl.inference.Predictor; -import ai.djl.repository.zoo.Criteria; -import ai.djl.repository.zoo.ModelNotFoundException; -import ai.djl.repository.zoo.ZooModel; -import ai.djl.training.util.ProgressBar; -import com.edgechain.lib.embeddings.miniLLM.enums.MiniLMModel; -import com.edgechain.lib.embeddings.miniLLM.response.MiniLMResponse; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; - -@Service -public class MiniLMClient { - - private MiniLMEndpoint endpoint; - - private static volatile ZooModel allMiniL6V2; - private static volatile ZooModel allMiniL12V2; - - private static volatile ZooModel paraphraseMiniLML3v2; - - private static volatile ZooModel multiQAMiniLML6CosV1; - - public MiniLMEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(MiniLMEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain createEmbeddings(String input) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - if (this.endpoint.getMiniLMModel().equals(MiniLMModel.ALL_MINILM_L6_V2)) { - - Predictor predictor = - loadAllMiniL6V2(this.endpoint.getMiniLMModel()).newPredictor(); - - float[] predict = predictor.predict(input); - - List floatList = new LinkedList<>(); - for (float v : predict) { - floatList.add(v); - } - - emitter.onNext(new MiniLMResponse(floatList)); - emitter.onComplete(); - } else if (this.endpoint.getMiniLMModel().equals(MiniLMModel.ALL_MINILM_L12_V2)) { - - Predictor predictor = - loadAllMiniL12V2(this.endpoint.getMiniLMModel()).newPredictor(); - - float[] predict = predictor.predict(input); - - List floatList = new LinkedList<>(); - for (float v : predict) { - floatList.add(v); - } - - emitter.onNext(new MiniLMResponse(floatList)); - emitter.onComplete(); - } else if (this.endpoint - .getMiniLMModel() - .equals(MiniLMModel.PARAPHRASE_MINILM_L3_V2)) { - Predictor predictor = - loadParaphraseMiniLML3v2(this.endpoint.getMiniLMModel()).newPredictor(); - - float[] predict = predictor.predict(input); - - List floatList = new LinkedList<>(); - for (float v : predict) { - floatList.add(v); - } - - emitter.onNext(new MiniLMResponse(floatList)); - emitter.onComplete(); - } else { - - System.out.println("d"); - ZooModel zooModel = - loadMultiQAMiniLML6CosV1(this.endpoint.getMiniLMModel()); - - Predictor predictor = zooModel.newPredictor(); - - float[] predict = predictor.predict(input); - - List floatList = new LinkedList<>(); - for (float v : predict) { - floatList.add(v); - } - - emitter.onNext(new MiniLMResponse(floatList)); - emitter.onComplete(); - } - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - private ZooModel loadAllMiniL6V2(MiniLMModel miniLMModel) { - - ZooModel r = allMiniL6V2; - - if (r == null) { - synchronized (this) { - r = allMiniL6V2; - if (r == null) { - - Criteria criteria = - Criteria.builder() - .setTypes(String.class, float[].class) - .optModelUrls(MiniLMModel.getURL(miniLMModel)) - .optEngine("PyTorch") - .optTranslatorFactory(new TextEmbeddingTranslatorFactory()) - .optProgress(new ProgressBar()) - .build(); - - try { - r = criteria.loadModel(); - allMiniL6V2 = r; - } catch (IOException | ModelNotFoundException | MalformedModelException e) { - throw new RuntimeException(e); - } - } - } - } - return r; - } - - private ZooModel loadAllMiniL12V2(MiniLMModel miniLMModel) { - - ZooModel r = allMiniL12V2; - - if (r == null) { - synchronized (this) { - r = allMiniL12V2; - if (r == null) { - - Criteria criteria = - Criteria.builder() - .setTypes(String.class, float[].class) - .optModelUrls(MiniLMModel.getURL(miniLMModel)) - .optEngine("PyTorch") - .optTranslatorFactory(new TextEmbeddingTranslatorFactory()) - .optProgress(new ProgressBar()) - .build(); - - try { - r = criteria.loadModel(); - allMiniL12V2 = r; - } catch (IOException | ModelNotFoundException | MalformedModelException e) { - throw new RuntimeException(e); - } - } - } - } - - return r; - } - - private ZooModel loadParaphraseMiniLML3v2(MiniLMModel miniLMModel) { - - ZooModel r = paraphraseMiniLML3v2; - - if (r == null) { - synchronized (this) { - r = paraphraseMiniLML3v2; - if (r == null) { - - Criteria criteria = - Criteria.builder() - .setTypes(String.class, float[].class) - .optModelUrls(MiniLMModel.getURL(miniLMModel)) - .optEngine("PyTorch") - .optTranslatorFactory(new TextEmbeddingTranslatorFactory()) - .optProgress(new ProgressBar()) - .build(); - - try { - r = criteria.loadModel(); - paraphraseMiniLML3v2 = r; - } catch (IOException | ModelNotFoundException | MalformedModelException e) { - throw new RuntimeException(e); - } - } - } - } - return r; - } - - private ZooModel loadMultiQAMiniLML6CosV1(MiniLMModel miniLMModel) { - - ZooModel r = multiQAMiniLML6CosV1; - - if (r == null) { - synchronized (this) { - r = multiQAMiniLML6CosV1; - if (r == null) { - Criteria criteria = - Criteria.builder() - .setTypes(String.class, float[].class) - .optModelUrls(MiniLMModel.getURL(miniLMModel)) - .optEngine("PyTorch") - .optTranslatorFactory(new TextEmbeddingTranslatorFactory()) - .optProgress(new ProgressBar()) - .build(); - - try { - r = criteria.loadModel(); - multiQAMiniLML6CosV1 = r; - } catch (IOException | ModelNotFoundException | MalformedModelException e) { - throw new RuntimeException(e); - } - } - } - } - - return r; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/enums/MiniLMModel.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/enums/MiniLMModel.java deleted file mode 100644 index 7305ef100..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/enums/MiniLMModel.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.edgechain.lib.embeddings.miniLLM.enums; - -public enum MiniLMModel { - ALL_MINILM_L6_V2("all-MiniLM-L6-v2"), - ALL_MINILM_L12_V2("all-MiniLM-L12-v2"), - PARAPHRASE_MINILM_L3_V2("paraphrase-MiniLM-L3-v2"), - - MULTI_QA_MINILM_L6_COS_V1("multi-qa-MiniLM-L6-cos-v1"); - - private static final String BASE_URL = "djl://ai.djl.huggingface.pytorch/sentence-transformers/"; - - private final String name; - - MiniLMModel(String s) { - this.name = s; - } - - public String getName() { - return name; - } - - public static String getURL(MiniLMModel model) { - switch (model) { - case ALL_MINILM_L6_V2 -> { - return BASE_URL + "all-MiniLM-L6-v2"; - } - - case ALL_MINILM_L12_V2 -> { - return BASE_URL + "all-MiniLM-L12-v2"; - } - - case PARAPHRASE_MINILM_L3_V2 -> { - return BASE_URL + "paraphrase-MiniLM-L3-v2"; - } - - case MULTI_QA_MINILM_L6_COS_V1 -> { - return BASE_URL + "multi-qa-MiniLM-L6-cos-v1"; - } - - default -> { - return "all-MiniLM-L12-v2"; - } - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/response/MiniLMResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/response/MiniLMResponse.java deleted file mode 100644 index 8e725533c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/response/MiniLMResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.edgechain.lib.embeddings.miniLLM.response; - -import java.util.List; - -public class MiniLMResponse { - - private List embedding; - - public MiniLMResponse() {} - - public MiniLMResponse(List embedding) { - this.embedding = embedding; - } - - public List getEmbedding() { - return embedding; - } - - public void setEmbedding(List embedding) { - this.embedding = embedding; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java deleted file mode 100644 index b7143cc25..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.edgechain.lib.embeddings.request; - -public class OpenAiEmbeddingRequest { - private String input; - private String model; - - public OpenAiEmbeddingRequest(String model, String input) { - this.model = model; - this.input = input; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - @Override - public String toString() { - return "OpenAiEmbeddingRequest{" + "model='" + model + '\'' + ", input='" + input + '\'' + '}'; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java deleted file mode 100644 index dfcf38cc0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.edgechain.lib.embeddings.response; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONObject; - -import java.util.List; - -public class OpenAiEmbedding implements ArkObject { - - private String object; - private List embedding; - private Integer index; - - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - - public List getEmbedding() { - return embedding; - } - - public void setEmbedding(List embedding) { - this.embedding = embedding; - } - - public Integer getIndex() { - return index; - } - - public void setIndex(Integer index) { - this.index = index; - } - - @Override - public String toString() { - return "OpenAiEmbedding{" - + "object='" - + object - + '\'' - + ", embedding=" - + embedding - + ", index=" - + index - + '}'; - } - - @Override - public JSONObject toJson() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("object", object); - jsonObject.put("embedding", embedding); - jsonObject.put("index", index); - return jsonObject; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java deleted file mode 100644 index ebf52ad5e..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.edgechain.lib.embeddings.response; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONObject; - -import java.util.List; -import java.util.stream.Collectors; - -public class OpenAiEmbeddingResponse implements ArkObject { - - private String model; - private String object; - private List data; - private Usage usage; - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - - public List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public Usage getUsage() { - return usage; - } - - public void setUsage(Usage usage) { - this.usage = usage; - } - - @Override - public String toString() { - return "OpenAiEmbeddingResponse{" - + "model='" - + model - + '\'' - + ", object='" - + object - + '\'' - + ", data=" - + data - + ", usage=" - + usage - + '}'; - } - - @Override - public JSONObject toJson() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("model", model); - jsonObject.put("object", object); - jsonObject.put("data", data.stream().map(OpenAiEmbedding::toJson).collect(Collectors.toList())); - jsonObject.put("usage", usage.toJson()); - return jsonObject; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java deleted file mode 100644 index 28b4914b8..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.edgechain.lib.embeddings.response; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONObject; - -public class Usage implements ArkObject { - - long prompt_tokens; - long total_tokens; - - public long getPrompt_tokens() { - return prompt_tokens; - } - - public void setPrompt_tokens(long prompt_tokens) { - this.prompt_tokens = prompt_tokens; - } - - public long getTotal_tokens() { - return total_tokens; - } - - public void setTotal_tokens(long total_tokens) { - this.total_tokens = total_tokens; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("Usage{"); - sb.append("prompt_tokens=").append(prompt_tokens); - sb.append(", total_tokens=").append(total_tokens); - sb.append('}'); - return sb.toString(); - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("prompt_tokens", prompt_tokens); - json.put("total_tokens", total_tokens); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java deleted file mode 100644 index 5128f9894..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.edgechain.lib.endpoint; - -import com.edgechain.lib.rxjava.retry.RetryPolicy; - -import java.io.Serializable; - -public class Endpoint implements Serializable { - - private static final long serialVersionUID = 8770981950923685799L; - - private String url; - private String apiKey; - private RetryPolicy retryPolicy; - - public Endpoint() {} - - public Endpoint(RetryPolicy retryPolicy) { - this(null, null, retryPolicy); - } - - public Endpoint(String url) { - this(url, null, null); - } - - public Endpoint(String url, RetryPolicy retryPolicy) { - this(url, null, retryPolicy); - } - - public Endpoint(String url, String apiKey) { - this(url, apiKey, null); - } - - public Endpoint(String url, String apiKey, RetryPolicy retryPolicy) { - this.url = url; - this.apiKey = apiKey; - this.retryPolicy = retryPolicy; - } - - public String getApiKey() { - return this.apiKey; - } - - public String getUrl() { - return this.url; - } - - public RetryPolicy getRetryPolicy() { - return this.retryPolicy; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("Endpoint{"); - sb.append("url='").append(url).append('\''); - sb.append(", apiKey='").append(apiKey).append('\''); - sb.append(", retryPolicy=").append(retryPolicy); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpoint.java deleted file mode 100644 index 0ab920b58..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpoint.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.retrofit.BgeSmallService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import retrofit2.Retrofit; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.util.Objects; - -public class BgeSmallEndpoint extends Endpoint { - - private Logger logger = LoggerFactory.getLogger(BgeSmallEndpoint.class); - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final BgeSmallService bgeSmallService = retrofit.create(BgeSmallService.class); - - private String input; - - private String modelUrl; - private String tokenizerUrl; - - private String callIdentifier; - private final String MODEL_PATH = "./model/model.onnx"; - private final String TOKENIZER_PATH = "./model/tokenizer.json"; - private final String MODEL_FOLDER = "./model"; - - public BgeSmallEndpoint() {} - - public BgeSmallEndpoint(String modelUrl, String tokenizerUrl) { - this.modelUrl = modelUrl; - this.tokenizerUrl = tokenizerUrl; - - logger.info("Downloading bge-small-en model. Please wait..."); - File modelFile = new File(MODEL_PATH); - File tokenizerFile = new File(TOKENIZER_PATH); - - // check if the file already exists - if (!modelFile.exists()) downloadFile(modelUrl, MODEL_PATH); - if (!tokenizerFile.exists()) downloadFile(tokenizerUrl, TOKENIZER_PATH); - logger.info("Model downloaded successfully!"); - } - - public String getModelUrl() { - return modelUrl; - } - - public String getTokenizerUrl() { - return tokenizerUrl; - } - - public String getInput() { - return input; - } - - public String getCallIdentifier() { - return callIdentifier; - } - - public BgeSmallEndpoint(RetryPolicy retryPolicy, String modelUrl, String tokenizerUrl) { - super(retryPolicy); - this.modelUrl = modelUrl; - this.tokenizerUrl = tokenizerUrl; - } - - public WordEmbeddings embeddings(String input, ArkRequest arkRequest) { - - this.input = input; // set Input - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } - - return bgeSmallService - .embeddings(this) - .map(m -> new WordEmbeddings(input, m.getEmbedding())) - .blockingGet(); - } - - private void downloadFile(String urlStr, String path) { - - File modelFolderFile = new File(MODEL_FOLDER); - - if (!modelFolderFile.exists()) { - modelFolderFile.mkdir(); - } - - ReadableByteChannel rbc = null; - FileOutputStream fos = null; - try { - URL url = new URL(urlStr); - rbc = Channels.newChannel(url.openStream()); - fos = new FileOutputStream(path); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - } catch (IOException e) { - logger.info("Error downloading model"); - e.printStackTrace(); - } finally { - assert fos != null; - try { - fos.close(); - rbc.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/MiniLMEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/MiniLMEndpoint.java deleted file mode 100644 index f50f247d4..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/MiniLMEndpoint.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.embeddings.miniLLM.enums.MiniLMModel; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.retrofit.MiniLMService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import java.util.Objects; - -import io.reactivex.rxjava3.core.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import retrofit2.Retrofit; - -public class MiniLMEndpoint extends Endpoint { - - private Logger logger = LoggerFactory.getLogger(MiniLMEndpoint.class); - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final MiniLMService miniLMService = retrofit.create(MiniLMService.class); - - private String input; - - private MiniLMModel miniLMModel; - - private String callIdentifier; - - public MiniLMEndpoint() {} - - public MiniLMEndpoint(MiniLMModel miniLMModel) { - this.miniLMModel = miniLMModel; - } - - public String getInput() { - return input; - } - - public MiniLMModel getMiniLMModel() { - return miniLMModel; - } - - public String getCallIdentifier() { - return callIdentifier; - } - - public MiniLMEndpoint(RetryPolicy retryPolicy, MiniLMModel miniLMModel) { - super(retryPolicy); - this.miniLMModel = miniLMModel; - } - - public Observable embeddings(String input, ArkRequest arkRequest) { - - this.input = input; // set Input - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } - - return Observable.fromSingle( - miniLMService.embeddings(this).map(m -> new WordEmbeddings(input, m.getEmbedding()))); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/OpenAiEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/OpenAiEndpoint.java deleted file mode 100644 index d21685899..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/OpenAiEndpoint.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.configuration.context.ApplicationContextHolder; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.openai.request.ChatMessage; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.retrofit.client.OpenAiStreamService; -import com.edgechain.lib.retrofit.OpenAiService; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; - -import java.util.List; -import java.util.Objects; - -public class OpenAiEndpoint extends Endpoint { - - private final OpenAiStreamService openAiStreamService = - ApplicationContextHolder.getContext().getBean(OpenAiStreamService.class); - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final OpenAiService openAiService = retrofit.create(OpenAiService.class); - - private String orgId; - private String model; - private String role; - private Double temperature; - - private Boolean stream; - - /** Getter Fields ** */ - private List chatMessages; - - private String input; - - /** Log fields * */ - private String chainName; - - private String callIdentifier; - - public OpenAiEndpoint() {} - - public OpenAiEndpoint(String url, String apiKey, String model) { - super(url, apiKey, null); - this.model = model; - } - - public OpenAiEndpoint(String url, String apiKey, String model, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.model = model; - } - - public OpenAiEndpoint( - String url, String apiKey, String model, String role, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.model = model; - this.role = role; - } - - public OpenAiEndpoint( - String url, - String apiKey, - String model, - String role, - Double temperature, - RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.model = model; - this.role = role; - this.temperature = temperature; - } - - public OpenAiEndpoint( - String url, String apiKey, String model, String role, Double temperature, Boolean stream) { - super(url, apiKey, null); - this.model = model; - this.role = role; - this.temperature = temperature; - this.stream = stream; - } - - public OpenAiEndpoint( - String url, - String apiKey, - String model, - String role, - Double temperature, - Boolean stream, - RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.model = model; - this.role = role; - this.temperature = temperature; - this.stream = stream; - } - - public OpenAiEndpoint( - String url, - String apiKey, - String orgId, - String model, - String role, - Double temperature, - Boolean stream) { - super(url, apiKey, null); - this.orgId = orgId; - this.model = model; - this.role = role; - this.temperature = temperature; - this.stream = stream; - } - - public OpenAiEndpoint( - String url, - String apiKey, - String orgId, - String model, - String role, - Double temperature, - Boolean stream, - RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.orgId = orgId; - this.model = model; - this.role = role; - this.temperature = temperature; - this.stream = stream; - } - - public String getModel() { - return model; - } - - public String getRole() { - return role; - } - - public Double getTemperature() { - return temperature; - } - - public Boolean getStream() { - return stream; - } - - public void setOrgId(String orgId) { - this.orgId = orgId; - } - - public String getOrgId() { - return orgId; - } - - public void setModel(String model) { - this.model = model; - } - - public void setRole(String role) { - this.role = role; - } - - public void setTemperature(Double temperature) { - this.temperature = temperature; - } - - public void setStream(Boolean stream) { - this.stream = stream; - } - - public List getChatMessages() { - return chatMessages; - } - - public String getInput() { - return input; - } - - public String getChainName() { - return chainName; - } - - public void setChainName(String chainName) { - this.chainName = chainName; - } - - public String getCallIdentifier() { - return callIdentifier; - } - - public Observable chatCompletion( - String input, String chainName, ArkRequest arkRequest) { - - this.chatMessages = List.of(new ChatMessage(this.role, input)); - this.chainName = chainName; - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } - - if (Objects.nonNull(this.getStream()) && this.getStream()) - return this.openAiStreamService - .chatCompletion(this) - .map( - chatResponse -> { - if (!Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - chatResponse.getChoices().get(0).getMessage().setContent(""); - return chatResponse; - } else return chatResponse; - }); - else return Observable.fromSingle(this.openAiService.chatCompletion(this)); - } - - public Observable chatCompletion( - List chatMessages, String chainName, ArkRequest arkRequest) { - - this.chainName = chainName; - this.chatMessages = chatMessages; - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } else { - this.callIdentifier = "URI wasn't provided"; - } - - if (Objects.nonNull(this.getStream()) && this.getStream()) - return this.openAiStreamService - .chatCompletion(this) - .map( - chatResponse -> { - if (!Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - chatResponse.getChoices().get(0).getMessage().setContent(""); - return chatResponse; - } else return chatResponse; - }); - else return Observable.fromSingle(this.openAiService.chatCompletion(this)); - } - - public Observable embeddings(String input, ArkRequest arkRequest) { - this.input = input; // set Input - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } - - return Observable.fromSingle( - openAiService - .embeddings(this) - .map( - embeddingResponse -> - new WordEmbeddings(input, embeddingResponse.getData().get(0).getEmbedding()))); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PineconeEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PineconeEndpoint.java deleted file mode 100644 index 5d2938906..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PineconeEndpoint.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.PineconeService; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; - -import java.util.List; - -public class PineconeEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final PineconeService pineconeService = retrofit.create(PineconeService.class); - - private String namespace; - - // Getters; - private WordEmbeddings wordEmbeddings; - - private int topK; - - public PineconeEndpoint() {} - - public PineconeEndpoint(String namespace) { - this.namespace = namespace; - } - - public PineconeEndpoint(String url, String apiKey) { - super(url, apiKey); - } - - public PineconeEndpoint(String url, String apiKey, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - } - - public PineconeEndpoint(String url, String apiKey, String namespace) { - super(url, apiKey); - this.namespace = namespace; - } - - public PineconeEndpoint(String url, String apiKey, String namespace, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.namespace = namespace; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - // Getters - - public WordEmbeddings getWordEmbeddings() { - return wordEmbeddings; - } - - public void setWordEmbeddings(WordEmbeddings wordEmbeddings) { - this.wordEmbeddings = wordEmbeddings; - } - - public int getTopK() { - return topK; - } - - public void setTopK(int topK) { - this.topK = topK; - } - - public StringResponse upsert(WordEmbeddings wordEmbeddings) { - this.wordEmbeddings = wordEmbeddings; - return this.pineconeService.upsert(this).blockingGet(); - } - - public Observable> query(WordEmbeddings wordEmbeddings, int topK) { - this.wordEmbeddings = wordEmbeddings; - this.topK = topK; - return Observable.fromSingle(this.pineconeService.query(this)); - } - - public StringResponse deleteAll() { - return this.pineconeService.deleteAll(this).blockingGet(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgreSQLHistoryContextEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgreSQLHistoryContextEndpoint.java deleted file mode 100644 index 2fb095412..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgreSQLHistoryContextEndpoint.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.context.domain.ContextPutRequest; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.PostgreSQLContextService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import java.util.Objects; -import retrofit2.Retrofit; - -public class PostgreSQLHistoryContextEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final PostgreSQLContextService contextService = - retrofit.create(PostgreSQLContextService.class); - - public PostgreSQLHistoryContextEndpoint() {} - - public PostgreSQLHistoryContextEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - } - - public HistoryContext create(String id) { - return this.contextService.create(id, this).blockingGet(); - } - - public HistoryContext put(String id, String response) { - return this.contextService.put(new ContextPutRequest<>(id, response, this)).blockingGet(); - } - - public HistoryContext get(String id) { - return this.contextService.get(id, this).blockingGet(); - } - - public void delete(String id) { - if (Objects.nonNull(id) && !id.isEmpty()) { - this.contextService.delete(id, this).blockingAwait(); - } else throw new RuntimeException("Redis key cannot be null or empty"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgresEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgresEndpoint.java deleted file mode 100644 index fc8443d28..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgresEndpoint.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.retrofit.PostgresService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; - -import java.util.List; - -public class PostgresEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final PostgresService postgresService = retrofit.create(PostgresService.class); - - private String tableName; - - private int lists; - - private String namespace; - - private String filename; - - // Getters - private WordEmbeddings wordEmbeddings; - private PostgresDistanceMetric metric; - private int dimensions; - private int topK; - - private int probes; - - public PostgresEndpoint() {} - - public PostgresEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - } - - public PostgresEndpoint(String tableName) { - this.tableName = tableName; - } - - public PostgresEndpoint(String tableName, RetryPolicy retryPolicy) { - super(retryPolicy); - this.tableName = tableName; - } - - public String getTableName() { - return tableName; - } - - public String getNamespace() { - return namespace; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - // Getters - - public WordEmbeddings getWordEmbeddings() { - return wordEmbeddings; - } - - public int getDimensions() { - return dimensions; - } - - public int getTopK() { - return topK; - } - - public String getFilename() { - return filename; - } - - public PostgresDistanceMetric getMetric() { - return metric; - } - - public int getLists() { - return lists; - } - - public int getProbes() { - return probes; - } - - // Convenience Methods - - public StringResponse upsert( - WordEmbeddings wordEmbeddings, - String filename, - int dimension, - PostgresDistanceMetric metric, - int lists) { - this.wordEmbeddings = wordEmbeddings; - this.dimensions = dimension; - this.filename = filename; - this.metric = metric; - this.lists = lists; - return this.postgresService.upsert(this).blockingGet(); - } - - public Observable> query( - WordEmbeddings wordEmbeddings, PostgresDistanceMetric metric, int topK) { - this.wordEmbeddings = wordEmbeddings; - this.topK = topK; - this.metric = metric; - this.probes = 1; - return Observable.fromSingle(this.postgresService.query(this)); - } - - public Observable> query( - WordEmbeddings wordEmbeddings, PostgresDistanceMetric metric, int topK, int probes) { - this.wordEmbeddings = wordEmbeddings; - this.topK = topK; - this.metric = metric; - this.probes = probes; - return Observable.fromSingle(this.postgresService.query(this)); - } - - public StringResponse deleteAll() { - return this.postgresService.deleteAll(this).blockingGet(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisEndpoint.java deleted file mode 100644 index 1dad38b37..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisEndpoint.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.RedisService; -import com.edgechain.lib.index.enums.RedisDistanceMetric; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; -import java.util.List; - -public class RedisEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final RedisService redisService = retrofit.create(RedisService.class); - - private String indexName; - private String namespace; - - // Getters; - private WordEmbeddings wordEmbeddings; - - private int dimensions; - - private RedisDistanceMetric metric; - - private int topK; - - public RedisEndpoint() {} - - public RedisEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - } - - public RedisEndpoint(String indexName) { - this.indexName = indexName; - } - - public RedisEndpoint(String indexName, RetryPolicy retryPolicy) { - super(retryPolicy); - this.indexName = indexName; - } - - public RedisEndpoint(String indexName, String namespace) { - this.indexName = indexName; - this.namespace = namespace; - } - - public RedisEndpoint(String indexName, String namespace, RetryPolicy retryPolicy) { - super(retryPolicy); - this.indexName = indexName; - this.namespace = namespace; - } - - public String getIndexName() { - return indexName; - } - - public void setIndexName(String indexName) { - this.indexName = indexName; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - // Getters - public WordEmbeddings getWordEmbeddings() { - return wordEmbeddings; - } - - public void setWordEmbeddings(WordEmbeddings wordEmbeddings) { - this.wordEmbeddings = wordEmbeddings; - } - - public int getDimensions() { - return dimensions; - } - - public void setDimensions(int dimensions) { - this.dimensions = dimensions; - } - - public RedisDistanceMetric getMetric() { - return metric; - } - - public void setMetric(RedisDistanceMetric metric) { - this.metric = metric; - } - - public int getTopK() { - return topK; - } - - public void setTopK(int topK) { - this.topK = topK; - } - - // Convenience Methods - public StringResponse upsert( - WordEmbeddings wordEmbeddings, int dimension, RedisDistanceMetric metric) { - - this.wordEmbeddings = wordEmbeddings; - this.dimensions = dimension; - this.metric = metric; - - return this.redisService.upsert(this).blockingGet(); - } - - public Observable> query(WordEmbeddings embeddings, int topK) { - this.topK = topK; - this.wordEmbeddings = embeddings; - return Observable.fromSingle(this.redisService.query(this)); - } - - public void delete(String patternName) { - this.redisService.deleteByPattern(patternName, this).blockingAwait(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisHistoryContextEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisHistoryContextEndpoint.java deleted file mode 100644 index 1a420722c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisHistoryContextEndpoint.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.context.domain.ContextPutRequest; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.RedisContextService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import retrofit2.Retrofit; - -import java.util.Objects; - -public class RedisHistoryContextEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final RedisContextService contextService = retrofit.create(RedisContextService.class); - - public RedisHistoryContextEndpoint() {} - - public RedisHistoryContextEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - } - - public HistoryContext create(String id) { - return this.contextService.create(id, this).blockingGet(); - } - - public HistoryContext put(String id, String response) { - return this.contextService.put(new ContextPutRequest<>(id, response, this)).blockingGet(); - } - - public HistoryContext get(String id) { - return this.contextService.get(id, this).blockingGet(); - } - - public void delete(String id) { - - if (Objects.nonNull(id) && !id.isEmpty()) { - this.contextService.delete(id, this).blockingAwait(); - } else throw new RuntimeException("Redis key cannot be null or empty"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/SupabaseEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/SupabaseEndpoint.java deleted file mode 100644 index 7ff111733..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/SupabaseEndpoint.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.SupabaseService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import retrofit2.Retrofit; - -import java.util.HashMap; - -public class SupabaseEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final SupabaseService supabaseService = retrofit.create(SupabaseService.class); - - public SupabaseEndpoint() {} - - public SupabaseUser signup(String email, String password) { - Credential credential = new Credential(email, password); - return this.supabaseService.signup(credential).blockingGet(); - } - - public AuthenticatedResponse login(String email, String password) { - Credential credential = new Credential(email, password); - return this.supabaseService.login(credential).blockingGet(); - } - - public AuthenticatedResponse refreshToken(String refreshToken) { - HashMap mapper = new HashMap<>(); - mapper.put("refreshToken", refreshToken); - return this.supabaseService.refreshToken(mapper).blockingGet(); - } - - public void signOut(String accessToken) { - HashMap mapper = new HashMap<>(); - mapper.put("token", accessToken); - this.supabaseService.signOut(mapper).blockingAwait(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/WikiEndpoint.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/WikiEndpoint.java deleted file mode 100644 index cc9e95871..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/WikiEndpoint.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.WikiService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import com.edgechain.lib.wiki.response.WikiResponse; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; - -public class WikiEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final WikiService wikiService = retrofit.create(WikiService.class); - - private String input; - - public WikiEndpoint() {} - - public WikiEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - this.input = input; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - public Observable getPageContent(String input) { - this.input = input; - return Observable.fromSingle(this.wikiService.getPageContent(this)); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/exceptions/AppExceptionHandler.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/exceptions/AppExceptionHandler.java deleted file mode 100644 index d3f71f0a3..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/exceptions/AppExceptionHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.edgechain.lib.exceptions; - -import java.util.Objects; - -import com.edgechain.lib.exceptions.response.ErrorResponse; -import com.edgechain.lib.supabase.exceptions.SupabaseAuthException; -import com.edgechain.lib.supabase.exceptions.SupabaseUserExistException; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -@ControllerAdvice -public class AppExceptionHandler { - - @ExceptionHandler(value = {Exception.class}) - public ResponseEntity handleException(Exception ex) { - ErrorResponse response = new ErrorResponse(ex.getMessage()); - return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); - } - - @ExceptionHandler(value = {SupabaseUserExistException.class}) - public ResponseEntity handleSupabaseUserExistException(Exception ex) { - ErrorResponse response = new ErrorResponse(ex.getMessage()); - return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); - } - - @ExceptionHandler(value = {SupabaseAuthException.class}) - public ResponseEntity handleSupabaseAuthException(Exception ex) { - ErrorResponse response = new ErrorResponse(ex.getMessage()); - return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); - } - - @ExceptionHandler(value = {DataIntegrityViolationException.class}) - public ResponseEntity handleDataIntegrityViolationException( - DataIntegrityViolationException ex) { - ErrorResponse response = - new ErrorResponse((Objects.requireNonNull(ex.getRootCause()).getMessage())); - return new ResponseEntity<>(response, new HttpHeaders(), HttpStatus.BAD_REQUEST); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/exceptions/response/ErrorResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/exceptions/response/ErrorResponse.java deleted file mode 100644 index 2f2f50157..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/exceptions/response/ErrorResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.edgechain.lib.exceptions.response; - -public class ErrorResponse { - - private String message; - - public ErrorResponse(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/ApplicationRunner.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/ApplicationRunner.java deleted file mode 100644 index 7cb93a497..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/ApplicationRunner.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.edgechain.lib.flyfly; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; -import picocli.CommandLine; -import java.util.Map; - -@Component -public class ApplicationRunner implements CommandLineRunner { - - @Autowired private FlyflyCommand runCommand; - @Autowired private CommandLine.IFactory factory; - @Autowired private ApplicationContext context; - - @Override - public void run(String... args) throws Exception { - if (getBootLoaderClass().contains("com.edgechain.EdgeChainApplication")) { - new CommandLine(runCommand, factory).execute(args); - } - } - - public String getBootLoaderClass() { - Map annotatedBeans = - context.getBeansWithAnnotation(SpringBootApplication.class); - return annotatedBeans.isEmpty() - ? null - : annotatedBeans.values().toArray()[0].getClass().getName(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/FlyflyCommand.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/FlyflyCommand.java deleted file mode 100644 index a1d113b50..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/FlyflyCommand.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.edgechain.lib.flyfly; - -import com.edgechain.lib.flyfly.commands.jbang.JbangCommand; -import org.springframework.stereotype.Component; -import picocli.CommandLine.Command; - -@Component -@Command( - name = "edgechain", - subcommands = { - // RunCommand.class, - // FormatCommand.class, - JbangCommand.class, - // CommandLine.HelpCommand.class - }) -public class FlyflyCommand {} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/format/FormatCommand.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/format/FormatCommand.java deleted file mode 100644 index a2ec13f9c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/format/FormatCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.edgechain.lib.flyfly.commands.format; - -import com.edgechain.lib.flyfly.utils.ProjectTypeChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import picocli.CommandLine.Command; - -@Component -@Command(name = "format", description = "Format code with Spotless", hidden = true) -public class FormatCommand implements Runnable { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - @Autowired Formatter formatter; - @Autowired ProjectTypeChecker projectTypeChecker; - - @Override - public void run() { - - if (projectTypeChecker.isGradleProject()) formatter.format(); - else { - log.error("Couldn't find build.gradle"); - log.error("Please try again inside the project directory"); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/format/Formatter.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/format/Formatter.java deleted file mode 100644 index 62f2c6139..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/format/Formatter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.edgechain.lib.flyfly.commands.format; - -import com.edgechain.lib.flyfly.utils.ProjectSetup; -import org.apache.commons.lang3.SystemUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class Formatter { - @Autowired ProjectSetup projectSetup; - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - void format() { - try { - log.info("Checking formatting configuration"); - if (!projectSetup.formatScriptExists()) { - log.info("Configuring Spotless"); - projectSetup.addFormatScript(); - } - log.info("Running Spotless"); - String[] command; - if (SystemUtils.IS_OS_WINDOWS) - command = new String[] {"cmd", "/c", "gradlew.bat -I .flyfly/format.gradle spotlessApply"}; - else - command = new String[] {"bash", "-c", "./gradlew -I .flyfly/format.gradle spotlessApply"}; - - ProcessBuilder pb = new ProcessBuilder(command); - pb.inheritIO(); - pb.start().waitFor(); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangCommand.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangCommand.java deleted file mode 100644 index e50b3530d..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangCommand.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.edgechain.lib.flyfly.commands.jbang; - -import java.io.*; -import java.util.Objects; - -import com.edgechain.lib.utils.JsonUtils; -import org.apache.commons.io.FileUtils; -import org.springframework.stereotype.Component; -import picocli.CommandLine.Command; -import picocli.CommandLine.Parameters; - -@Component -@Command( - name = "jbang", - description = "Activate jbang i.e., java -jar edgechain.jar jbang Hello.java") -public class JbangCommand implements Runnable { - - @Parameters(description = "Java file to be executed with jbang;") - private String javaFile; - - @Override - public void run() { - - InputStream inputStream = this.getClass().getResourceAsStream("/jbang.jar"); - - if (Objects.isNull(inputStream)) - throw new RuntimeException("Unable to find jbang.jar in resource directory"); - - File jbangJar = new File(System.getProperty("java.io.tmpdir") + File.separator + "jbang.jar"); - - try { - FileUtils.copyInputStreamToFile(inputStream, jbangJar); - } catch (IOException e) { - throw new RuntimeException(e); - } - - jbangJar.deleteOnExit(); - - // Clear Jbang Cache - clearCache(jbangJar); - - // Build Jar using Jbang - buildJar(jbangJar, this.javaFile); - - // Get Information - JbangResponse jbangResponse = info(jbangJar, this.javaFile); - - String classPath; - if (jbangResponse.getResolvedDependencies().isEmpty()) { - classPath = - jbangResponse - .getApplicationJar() - .concat(File.pathSeparator) - .concat(System.getProperty("jar.name")); - } else { - classPath = - jbangResponse - .getApplicationJar() - .concat(File.pathSeparator) - .concat(String.join(File.pathSeparator, jbangResponse.getResolvedDependencies())) - .concat(File.pathSeparator) - .concat(System.getProperty("jar.name")); - } - - String mainClass; - if (Objects.isNull(jbangResponse.getMainClass())) { - mainClass = "com.edgechain." + jbangResponse.getOriginalResource(); - } else { - mainClass = jbangResponse.getMainClass(); - } - - // System.out.println("Classpath ==========: "+classPath); - // System.out.println("Main Class =========: "+mainClass); - - // Execute - execute(classPath, mainClass); - } - - private void clearCache(File jbangJar) { - - try { - ProcessBuilder pb = - new ProcessBuilder("java", "-jar", jbangJar.getAbsolutePath(), "cache", "clear") - .inheritIO(); - - Process process = pb.start(); - process.waitFor(); - - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } - - private void buildJar(File jbangJar, String javaFile) { - - try { - ProcessBuilder pb = - new ProcessBuilder( - "java", - "-jar", - jbangJar.getAbsolutePath(), - "--cp", - System.getProperty("jar.name"), - javaFile) - .inheritIO() - .redirectErrorStream(true); - Process process = pb.start(); - process.waitFor(); - } catch (InterruptedException | IOException e) { - throw new RuntimeException(e); - } - } - - private JbangResponse info(File jbangJar, String javaFile) { - - try { - ProcessBuilder pb = - new ProcessBuilder("java", "-jar", jbangJar.getAbsolutePath(), "info", "tools", javaFile); - - Process process = pb.start(); - - BufferedReader bufferedReader = - new BufferedReader(new InputStreamReader(process.getInputStream())); - - StringBuilder appender = new StringBuilder(); - - String line; - while ((line = bufferedReader.readLine()) != null) { - appender.append(line); - } - - process.waitFor(); - bufferedReader.close(); - - return JsonUtils.convertToObject(appender.toString(), JbangResponse.class); - - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } - - private void execute(String classPath, String mainClass) { - - try { - - ProcessBuilder pb = - new ProcessBuilder("java", "-classpath", classPath, mainClass).inheritIO(); - - Process process = pb.start(); - - process.waitFor(); - - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangFile.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangFile.java deleted file mode 100644 index ea11a9c7f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangFile.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.edgechain.lib.flyfly.commands.jbang; - -public class JbangFile { - private String originalResource; - private String backingResource; - public String target; -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangResponse.java deleted file mode 100644 index 39cc51169..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangResponse.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.edgechain.lib.flyfly.commands.jbang; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -import java.util.List; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class JbangResponse { - - private String originalResource; - private String backingResource; - private String applicationJar; - private String mainClass; - private List dependencies; - private List resolvedDependencies; - private String availableJdkPath; - private List compileOptions; - private List jbangFiles; - private List sources; - - public String getOriginalResource() { - return originalResource; - } - - public void setOriginalResource(String originalResource) { - this.originalResource = originalResource; - } - - public String getBackingResource() { - return backingResource; - } - - public void setBackingResource(String backingResource) { - this.backingResource = backingResource; - } - - public String getApplicationJar() { - return applicationJar; - } - - public void setApplicationJar(String applicationJar) { - this.applicationJar = applicationJar; - } - - public String getMainClass() { - return mainClass; - } - - public void setMainClass(String mainClass) { - this.mainClass = mainClass; - } - - public List getDependencies() { - return dependencies; - } - - public void setDependencies(List dependencies) { - this.dependencies = dependencies; - } - - public List getResolvedDependencies() { - return resolvedDependencies; - } - - public void setResolvedDependencies(List resolvedDependencies) { - this.resolvedDependencies = resolvedDependencies; - } - - public String getAvailableJdkPath() { - return availableJdkPath; - } - - public void setAvailableJdkPath(String availableJdkPath) { - this.availableJdkPath = availableJdkPath; - } - - public List getCompileOptions() { - return compileOptions; - } - - public void setCompileOptions(List compileOptions) { - this.compileOptions = compileOptions; - } - - public List getJbangFiles() { - return jbangFiles; - } - - public void setJbangFiles(List jbangFiles) { - this.jbangFiles = jbangFiles; - } - - public List getSources() { - return sources; - } - - public void setSources(List sources) { - this.sources = sources; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangSource.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangSource.java deleted file mode 100644 index ec0e8ffaf..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/jbang/JbangSource.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.edgechain.lib.flyfly.commands.jbang; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class JbangSource { - public String originalResource; - public String backingResource; - - public String getOriginalResource() { - return originalResource; - } - - public void setOriginalResource(String originalResource) { - this.originalResource = originalResource; - } - - public String getBackingResource() { - return backingResource; - } - - public void setBackingResource(String backingResource) { - this.backingResource = backingResource; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/JarRunner.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/JarRunner.java deleted file mode 100644 index 0f5053ba0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/JarRunner.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.edgechain.lib.flyfly.commands.run; - -import java.io.File; -import java.io.IOException; - -import com.edgechain.lib.flyfly.utils.FileTools; -import com.edgechain.lib.flyfly.utils.ProjectSetup; -import org.apache.commons.lang3.SystemUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class JarRunner { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - @Autowired ProjectSetup projectSetup; - @Autowired FileTools fileTools; - - public void run(File jarFile) { - try { - log.info("Checking if glowroot agent exists"); - if (!projectSetup.glowrootAgentExists()) { - log.info("Agent doesn't exist"); - log.info("Adding glowroot agent"); - projectSetup.addGlowrootAgent(); - } - log.info("Runnng the jar"); - String agentPath = projectSetup.getGlowrootAgentPath(); - String jarPath = jarFile.getAbsolutePath(); - String[] command; - if (SystemUtils.IS_OS_WINDOWS) - command = new String[] {"cmd", "/c", "java -javaagent:" + agentPath + " -jar " + jarPath}; - else - command = new String[] {"bash", "-c", "java -javaagent:" + agentPath + " -jar " + jarPath}; - - ProcessBuilder pb = new ProcessBuilder(command); - pb.inheritIO(); - pb.start().waitFor(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java deleted file mode 100644 index 488460574..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.edgechain.lib.flyfly.commands.run; - -import static java.nio.file.StandardWatchEventKinds.*; - -import com.edgechain.lib.flyfly.utils.ProjectSetup; -import jakarta.annotation.PreDestroy; -import java.io.*; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import org.apache.commons.lang3.SystemUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.zeroturnaround.exec.ProcessExecutor; - -@Component -public class ProjectRunner { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - @Autowired TestContainersStarter testContainersStarter; - @Autowired ProjectSetup projectSetup; - - Process runningProcess; - WatchService filesWatcher; - WatchService buildFileWatcher; - boolean allowInfrastructureServices; - - public void run() { - try { - log.info("Configuring the project"); - log.info("Checking if initscript exists"); - if (!projectSetup.initscriptExists()) { - log.info("Initscript doesn't exist"); - log.info("Adding flyfly.gradle to initscripts"); - projectSetup.addInitscript(); - } - projectSetup.addAutorouteJar(); - allowInfrastructureServices = isDockerInstalled(); - if (allowInfrastructureServices) checkAndConfigureServices(); - log.debug("registering watcher for src files changes"); - registerFilesWatcher(); - log.debug("registering watcher for build file changes"); - registerBuildFileWatcher(); - log.info("Starting the project"); - runTheProject(); - loop(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - boolean isDockerInstalled() throws IOException, InterruptedException { - log.info("Checking if docker is installed to allow infrastructure services"); - int exitCode; - try { - String[] command; - if (SystemUtils.IS_OS_WINDOWS) command = new String[] {"cmd", "/c", "docker", "info"}; - else command = new String[] {"docker", "info"}; - - exitCode = new ProcessExecutor().command(command).start().getProcess().waitFor(); - } catch (Exception e) { - exitCode = -1; - } - if (exitCode != 0) { - log.warn("Couldn't find docker. Disabling infrastructure services."); - return false; - } - return true; - } - - void runTheProject() throws IOException { - String[] command; - if (SystemUtils.IS_OS_WINDOWS) command = new String[] {"cmd", "/c", "gradlew.bat", "bootRun"}; - else command = new String[] {"./gradlew", "bootRun"}; - - runningProcess = - new ProcessExecutor().command(command).redirectOutput(System.out).start().getProcess(); - } - - void checkAndConfigureServices() throws IOException { - log.info("Checking if services are needed"); - // Set supportedDBGroupIds = - // Set.of("mysql", "com.mysql", "org.postgresql", "org.mariadb.jdbc"); - Set supportedDBGroupIds = Set.of("org.postgresql"); - BufferedReader reader = new BufferedReader(new FileReader("build.gradle")); - String line; - while ((line = reader.readLine()) != null) { - if (line.contains("dependencies")) { - while ((line = reader.readLine()) != null) { - int start = line.indexOf("\'"); - int end = line.indexOf(":"); - if (start < 0 || end < 0) continue; - String groupID = line.substring(start + 1, end); - if (supportedDBGroupIds.contains(groupID)) { - if (!testContainersStarter.isServiesNeeded()) break; - log.info("Found : " + groupID); - switch (groupID) { - // case "mysql", "com.mysql" -> testContainersStarter.startMySQL(); - case "org.postgresql" -> testContainersStarter.startPostgreSQL(); - // case "org.mariadb.jdbc" -> testContainersStarter.startMariaDB(); - } - break; - } - } - break; - } - } - reader.close(); - } - - void registerBuildFileWatcher() throws IOException { - Path path = Paths.get(""); - buildFileWatcher = FileSystems.getDefault().newWatchService(); - path.register(buildFileWatcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); - } - - public void loop() throws IOException, InterruptedException { - while (true) { - if (didFilesChange() && runningProcess.isAlive()) { - reloadTheProject(); - } - if (didBuildFileChange()) { - handleBuildFileChange(); - } - } - } - - void registerFilesWatcher() throws IOException { - Path path = Paths.get("src"); - filesWatcher = FileSystems.getDefault().newWatchService(); - Files.walkFileTree( - path, - new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - dir.register(filesWatcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); - return FileVisitResult.CONTINUE; - } - }); - } - - void reloadTheProject() throws IOException, InterruptedException { - destroyRunningProcess(); - runTheProject(); - } - - boolean didFilesChange() throws InterruptedException { - WatchKey key = filesWatcher.poll(500, TimeUnit.MILLISECONDS); - if (key == null) return false; - for (WatchEvent event : key.pollEvents()) {} - key.reset(); - if (!runningProcess.isAlive()) return false; - return true; - } - - boolean didBuildFileChange() throws InterruptedException { - WatchKey key = buildFileWatcher.poll(500, TimeUnit.MILLISECONDS); - if (key == null) return false; - boolean found = false; - for (WatchEvent event : key.pollEvents()) { - Path p = (Path) event.context(); - if (p.endsWith("build.gradle")) found = true; - } - key.reset(); - if (found) log.info("Detected build file change ..."); - return found; - } - - void handleBuildFileChange() throws IOException, InterruptedException { - destroyRunningProcess(); - if (allowInfrastructureServices) checkAndConfigureServices(); - runTheProject(); - } - - @PreDestroy - void destroyRunningProcess() throws InterruptedException, IOException { - if (runningProcess == null) return; - if (SystemUtils.IS_OS_WINDOWS) { - Runtime.getRuntime().exec("cmd.exe /c taskkill /f /t /pid " + runningProcess.pid()).waitFor(); - } else runningProcess.destroy(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/RunCommand.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/RunCommand.java deleted file mode 100644 index 583b582a5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/RunCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.edgechain.lib.flyfly.commands.run; - -import java.io.File; - -import com.edgechain.lib.flyfly.utils.ProjectTypeChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import picocli.CommandLine.Command; -import picocli.CommandLine.Parameters; - -@Component -@Command( - name = "run", - description = - "Run a JAR or Gradle Spring Boot Application. Ignore if your application is executed.", - hidden = true) -public class RunCommand implements Runnable { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - @Parameters(hidden = true) - File[] files; - - @Autowired ProjectRunner projectRunner; - @Autowired ProjectTypeChecker projectTypeChecker; - @Autowired JarRunner jarRunner; - - @Override - public void run() { - if (files != null && files.length > 0) jarRunner.run(files[0]); - else if (projectTypeChecker.isGradleProject()) projectRunner.run(); - else { - log.error("Couldn't find build.gradle"); - log.error("Please try again inside the project directory"); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java deleted file mode 100644 index edea76f91..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.edgechain.lib.flyfly.commands.run; - -import jakarta.annotation.PreDestroy; -import java.io.*; -import java.nio.file.FileSystems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import org.testcontainers.containers.PostgreSQLContainer; - -@Component -public class TestContainersStarter { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - private static final String dbName = "test"; - private static final String userName = "test"; - private static final String password = "test"; - // private MySQLContainer mysql; - private PostgreSQLContainer postgre; - // private MariaDBContainer mariaDB; - private String flyflyTempTag = "#flyfly_temp_property"; - - // public void startMySQL() throws IOException { - // if (mysql != null && mysql.isRunning()) return; - // log.info("Starting a temporary MySQL database."); - // mysql = - // new MySQLContainer<>(DockerImageName.parse("mysql:5.7")) - // .withDatabaseName(dbName) - // .withUsername(userName) - // .withPassword(password); - // mysql.addParameter("TC_MY_CNF", null); - // mysql.start(); - // log.info("Database started."); - // log.info("DB URL: " + mysql.getJdbcUrl()); - // log.info("DB Username: " + mysql.getUsername()); - // log.info("DB Password: " + mysql.getPassword()); - // addTempProperties(mysql.getJdbcUrl()); - // } - - public void startPostgreSQL() throws IOException { - if (postgre != null && postgre.isRunning()) return; - log.info("Starting a temporary PostgreSQL database."); - postgre = - new PostgreSQLContainer<>("postgres:14.5") - .withDatabaseName(dbName) - .withUsername(userName) - .withPassword(password); - postgre.addParameter("TC_MY_CNF", null); - postgre.start(); - log.info("Database started."); - log.info("DB URL: " + postgre.getJdbcUrl()); - log.info("DB Username: " + postgre.getUsername()); - log.info("DB Password: " + postgre.getPassword()); - addTempProperties(postgre.getJdbcUrl()); - } - - // public void startMariaDB() throws IOException { - // if (postgre != null && postgre.isRunning()) return; - // log.info("Starting a temporary MariaDB database."); - // mariaDB = - // new MariaDBContainer<>("mariadb:10.3.6") - // .withDatabaseName(dbName) - // .withUsername(userName) - // .withPassword(password); - // mariaDB.addParameter("TC_MY_CNF", null); - // mariaDB.start(); - // log.info("Database started."); - // log.info("DB URL: " + mariaDB.getJdbcUrl()); - // log.info("DB Username: " + mariaDB.getUsername()); - // log.info("DB Password: " + mariaDB.getPassword()); - // addTempProperties(mariaDB.getJdbcUrl()); - // } - - public void addTempProperties(String url) throws IOException { - log.info("Appending temporary DB configuration to application.properties"); - BufferedWriter writer = new BufferedWriter(new FileWriter(getPropertiesPath(), true)); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.url=" + url); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.username=" + userName); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.password=" + password); - writer.flush(); - writer.close(); - } - - public void removeTempProperties() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(getPropertiesPath())); - StringBuilder sb = new StringBuilder(); - boolean tempNotFound = true; - String line; - while ((line = reader.readLine()) != null) { - if (line.contains(flyflyTempTag)) { - tempNotFound = false; - reader.readLine(); - continue; - } - sb.append(line + "\n"); - } - reader.close(); - if (tempNotFound) return; - - BufferedWriter writer = new BufferedWriter(new FileWriter(getPropertiesPath())); - writer.write(sb.toString()); - writer.flush(); - writer.close(); - } - - public boolean isServiesNeeded() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(getPropertiesPath())); - String line; - String datafield = "spring.datasource.url"; - while ((line = reader.readLine()) != null) { - if (line.contains(datafield)) { - reader.close(); - return false; - } - } - reader.close(); - return true; - } - - public String getPropertiesPath() { - String separator = FileSystems.getDefault().getSeparator(); - return System.getProperty("user.dir") - + separator - + "src" - + separator - + "main" - + separator - + "resources" - + separator - + "application.properties"; - } - - @PreDestroy - public void destroy() { - try { - removeTempProperties(); - } catch (IOException e) { - } - // if (mysql != null && mysql.isRunning()) mysql.close(); - if (postgre != null && postgre.isRunning()) postgre.close(); - // if (mariaDB != null && mariaDB.isRunning()) mariaDB.close(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/FileTools.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/FileTools.java deleted file mode 100644 index 046eeb69b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/FileTools.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.edgechain.lib.flyfly.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import net.lingala.zip4j.ZipFile; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class FileTools { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - public void exportFileTo(String file, String dest) throws IOException { - log.debug("Exporting " + file + " To " + dest); - InputStream resource = FileTools.class.getClassLoader().getResourceAsStream(file); - Files.copy(resource, Path.of(dest)); - log.debug("Exported successfully"); - } - - public void unzip(String zipFilePath, String destDir) throws IOException { - log.debug("Unzipping " + zipFilePath + " into " + destDir); - ZipFile zipFile = new ZipFile(zipFilePath); - zipFile.extractAll(destDir); - zipFile.close(); - log.debug("Unzipped successfully"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java deleted file mode 100644 index d6b86789d..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.edgechain.lib.flyfly.utils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileSystems; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class ProjectSetup { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - @Autowired FileTools fileTools; - - private String userHome = System.getProperty("user.home"); - private String separator = FileSystems.getDefault().getSeparator(); - private String initscriptDir = - userHome + separator + ".gradle" + separator + "init.d" + separator + "flyfly.gradle"; - private String flyflyDir = System.getProperty("user.dir") + separator + ".flyfly"; - private String formatScriptDir = flyflyDir + separator + "format.gradle"; - private String autorouteDir = flyflyDir + separator + "autoroute.jar"; - private String glowrootDir = flyflyDir + separator + "glowroot"; - - public boolean initscriptExists() { - log.debug("Checking if flyfly.gradle exists in " + initscriptDir); - return new File(initscriptDir).exists(); - } - - public void addInitscript() throws IOException { - File initDir = new File(userHome + separator + ".gradle" + separator + "init.d"); - if (!initDir.exists()) initDir.mkdirs(); - fileTools.exportFileTo("flyfly.gradle", initscriptDir); - } - - public void addAutorouteJar() throws IOException { - File flyflyFolder = new File(flyflyDir); - if (!flyflyFolder.exists()) flyflyFolder.mkdirs(); - File autorouteFile = new File(autorouteDir); - if (!autorouteFile.exists() || (autorouteFile.exists() && autorouteFile.delete())) - fileTools.exportFileTo("autoroute.jar", autorouteDir); - } - - public boolean formatScriptExists() { - log.debug("Checking if format.gradle exists in " + formatScriptDir); - return new File(formatScriptDir).exists(); - } - - public void addFormatScript() throws IOException { - File flyflyFolder = new File(flyflyDir); - if (!flyflyFolder.exists()) flyflyFolder.mkdirs(); - fileTools.exportFileTo("format.gradle", formatScriptDir); - } - - public boolean glowrootAgentExists() { - log.debug("Checking if glowroot folder exists in " + glowrootDir); - return new File(glowrootDir).exists(); - } - - public void addGlowrootAgent() throws IOException { - File flyflyFolder = new File(flyflyDir); - if (!flyflyFolder.exists()) flyflyFolder.mkdirs(); - String zipDir = flyflyDir + separator + "glowroot.zip"; - fileTools.exportFileTo("glowroot.zip", zipDir); - fileTools.unzip(zipDir, flyflyDir); - new File(zipDir).delete(); - } - - public String getGlowrootAgentPath() { - return flyflyDir + separator + "glowroot" + separator + "glowroot.jar"; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectTypeChecker.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectTypeChecker.java deleted file mode 100644 index 1fa9857bf..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectTypeChecker.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.edgechain.lib.flyfly.utils; - -import java.io.File; -import org.springframework.stereotype.Component; - -@Component -public class ProjectTypeChecker { - - public boolean isMavenProject() { - File dir = new File(System.getProperty("user.dir")); - for (File file : dir.listFiles()) if (file.getName().equals("pom.xml")) return true; - return false; - } - - public boolean isGradleProject() { - File dir = new File(System.getProperty("user.dir")); - for (File file : dir.listFiles()) if (file.getName().equals("build.gradle")) return true; - return false; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java deleted file mode 100644 index adcfd1c65..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.edgechain.lib.index.client.impl; - -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; -import com.edgechain.lib.index.request.pinecone.PineconeUpsert; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; -import java.util.*; - -@Service -public class PineconeClient { - - private PineconeEndpoint endpoint; - private String namespace; - - public PineconeEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(PineconeEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain upsert(WordEmbeddings wordEmbeddings) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "" - : endpoint.getNamespace(); - - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("Api-Key", endpoint.getApiKey()); - - PineconeUpsert pinecone = new PineconeUpsert(); - pinecone.setVectors(List.of(wordEmbeddings)); - pinecone.setNamespace(namespace); - - HttpEntity entity = new HttpEntity<>(pinecone, headers); - - ResponseEntity response = - new RestTemplate() - .exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); - - emitter.onNext(new StringResponse(response.getBody())); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - public EdgeChain> query(WordEmbeddings wordEmbeddings, int topK) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "" - : endpoint.getNamespace(); - - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("Api-Key", endpoint.getApiKey()); - - // Prepare the request payload using a LinkedHashMap to maintain key order - Map payload = new LinkedHashMap<>(); - payload.put("includeValues", true); - payload.put("includeMetadata", false); - payload.put("vector", wordEmbeddings.getValues()); - payload.put("top_k", topK); - payload.put("namespace", this.namespace); - - HttpEntity> entity = new HttpEntity<>(payload, headers); - - ResponseEntity response = - new RestTemplate() - .exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); - - emitter.onNext(this.parsePredict(response.getBody())); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - public EdgeChain deleteAll() { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "" - : endpoint.getNamespace(); - - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("Api-Key", endpoint.getApiKey()); - - Map body = new HashMap<>(); - body.put("deleteAll", true); - body.put("namespace", namespace); - - HttpEntity> entity = new HttpEntity<>(body, headers); - - new RestTemplate() - .exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); - - emitter.onNext( - new StringResponse( - "Word embeddings are successfully deleted for namespace:" - + this.namespace)); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - private List parsePredict(String body) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode jsonNode = objectMapper.readTree(body); - - int matches = jsonNode.get("matches").size(); - List words2VecList = new ArrayList<>(); - - for (int i = 0; i < matches; i++) { - words2VecList.add( - objectMapper.treeToValue(jsonNode.get("matches").get(i), WordEmbeddings.class)); - } - - return words2VecList; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java deleted file mode 100644 index e3652b284..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.edgechain.lib.index.client.impl; - -import com.edgechain.lib.configuration.context.ApplicationContextHolder; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.index.repositories.PostgresClientRepository; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.stereotype.Service; - -import java.sql.Timestamp; -import java.util.*; - -@Service -public class PostgresClient { - - private PostgresEndpoint postgresEndpoint; - private String namespace; - - private final PostgresClientRepository repository = - ApplicationContextHolder.getContext().getBean(PostgresClientRepository.class); - - public PostgresEndpoint getPostgresEndpoint() { - return postgresEndpoint; - } - - public void setPostgresEndpoint(PostgresEndpoint postgresEndpoint) { - this.postgresEndpoint = postgresEndpoint; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public EdgeChain upsert(WordEmbeddings wordEmbeddings) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.namespace = - (Objects.isNull(postgresEndpoint.getNamespace()) - || postgresEndpoint.getNamespace().isEmpty()) - ? "knowledge" - : postgresEndpoint.getNamespace(); - - // Create Table - this.repository.createTable(postgresEndpoint); - - String input = wordEmbeddings.getId().replaceAll("'", ""); - - // Upsert Embeddings - this.repository.upsertEmbeddings( - postgresEndpoint.getTableName(), - input, - postgresEndpoint.getFilename(), - wordEmbeddings, - this.namespace); - - emitter.onNext(new StringResponse("Upserted")); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - postgresEndpoint); - } - - public EdgeChain> query( - WordEmbeddings wordEmbeddings, PostgresDistanceMetric metric, int topK, int probes) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - this.namespace = - (Objects.isNull(postgresEndpoint.getNamespace()) - || postgresEndpoint.getNamespace().isEmpty()) - ? "knowledge" - : postgresEndpoint.getNamespace(); - - List> rows = - this.repository.query( - postgresEndpoint.getTableName(), - this.namespace, - probes, - metric, - wordEmbeddings, - topK); - - List wordEmbeddingsList = new ArrayList<>(); - - for (Map row : rows) { - - PostgresWordEmbeddings val = new PostgresWordEmbeddings(); - val.setId((String) row.get("id")); - val.setRawText((String) row.get("raw_text")); - val.setFilename((String) row.get("filename")); - val.setTimestamp(((Timestamp) row.get("timestamp")).toLocalDateTime()); - val.setNamespace((String) row.get("namespace")); - val.setScore((Double) row.get("score")); - - wordEmbeddingsList.add(val); - } - - emitter.onNext(wordEmbeddingsList); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - postgresEndpoint); - } - - public EdgeChain deleteAll() { - - return new EdgeChain<>( - Observable.create( - emitter -> { - this.namespace = - (Objects.isNull(postgresEndpoint.getNamespace()) - || postgresEndpoint.getNamespace().isEmpty()) - ? "knowledge" - : postgresEndpoint.getNamespace(); - - try { - this.repository.deleteAll(postgresEndpoint.getTableName(), this.namespace); - emitter.onNext( - new StringResponse( - "Word embeddings are successfully deleted for namespace:" - + this.namespace)); - emitter.onComplete(); - } catch (final Exception e) { - emitter.onError(e); - } - }), - postgresEndpoint); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java deleted file mode 100644 index 7f1c3790b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.edgechain.lib.index.client.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; -import com.edgechain.lib.index.enums.RedisDistanceMetric; -import com.edgechain.lib.index.responses.RedisDocument; -import com.edgechain.lib.index.responses.RedisProperty; -import com.edgechain.lib.index.responses.RedisResponse; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.edgechain.lib.utils.FloatUtils; -import com.edgechain.lib.utils.JsonUtils; -import io.reactivex.rxjava3.core.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import redis.clients.jedis.JedisPooled; -import redis.clients.jedis.search.*; - -import java.util.*; - -@Service -public class RedisClient { - - private static final String REDIS_DELETE_SCRIPT_IN_LUA = - "local keys = redis.call('keys', '%s')" - + " for i,k in ipairs(keys) do" - + " local res = redis.call('del', k)" - + " end"; - - private RedisEndpoint endpoint; - - private String indexName; - private String namespace; - - public RedisEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(RedisEndpoint endpoint) { - this.endpoint = endpoint; - } - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired private JedisPooled jedisPooled; - - public EdgeChain upsert( - WordEmbeddings words2Vec, int dimension, RedisDistanceMetric metric) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.indexName = endpoint.getIndexName(); - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "knowledge" - : endpoint.getNamespace(); - - this.createSearchIndex(dimension, RedisDistanceMetric.getDistanceMetric(metric)); - - Map map = new HashMap<>(); - map.put("id".getBytes(), words2Vec.getId().getBytes()); - map.put( - "values".getBytes(), - FloatUtils.toByteArray(FloatUtils.toFloatArray(words2Vec.getValues()))); - - long v = - jedisPooled.hset((this.namespace + ":" + words2Vec.getId()).getBytes(), map); - - jedisPooled.getPool().returnResource(jedisPooled.getPool().getResource()); - - emitter.onNext(new StringResponse("Created ~ " + v)); - emitter.onComplete(); - } catch (Exception ex) { - jedisPooled.getPool().returnBrokenResource(jedisPooled.getPool().getResource()); - emitter.onError(ex); - } - }), - endpoint); - } - - public EdgeChain> query(WordEmbeddings words2Vec, int topK) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.indexName = endpoint.getIndexName(); - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "knowledge" - : endpoint.getNamespace(); - - Query query = - new Query("*=>[KNN $k @values $values]") - .addParam( - "values", - FloatUtils.toByteArray(FloatUtils.toFloatArray(words2Vec.getValues()))) - .addParam("k", topK) - .returnFields("id", "__values_score") - .setSortBy("__values_score", false) - .dialect(2); - - SearchResult searchResult = jedisPooled.ftSearch(this.indexName, query); - - String body = JsonUtils.convertToString(searchResult); - - RedisResponse redisResponse = JsonUtils.convertToObject(body, RedisResponse.class); - - Iterator iterator = redisResponse.getDocuments().iterator(); - - List words2VecList = new ArrayList<>(); - - while (iterator.hasNext()) { - ArrayList properties = iterator.next().getProperties(); - words2VecList.add( - new WordEmbeddings( - properties.get(1).getId(), - String.valueOf(properties.get(0).get__values_score()))); - } - - emitter.onNext(words2VecList); - emitter.onComplete(); - - } catch (Exception ex) { - emitter.onError(ex); - } - }), - endpoint); - } - - public EdgeChain deleteByPattern(String pattern) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - this.indexName = endpoint.getIndexName(); - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "knowledge" - : endpoint.getNamespace(); - - jedisPooled.eval(String.format(REDIS_DELETE_SCRIPT_IN_LUA, pattern)); - - jedisPooled.getPool().returnResource(jedisPooled.getPool().getResource()); - - emitter.onNext( - new StringResponse( - "Word embeddings are successfully deleted for pattern:" + pattern)); - emitter.onComplete(); - - } catch (Exception ex) { - jedisPooled.getPool().returnBrokenResource(jedisPooled.getPool().getResource()); - emitter.onError(ex); - } - }), - endpoint); - } - - private void createSearchIndex(int dimension, String metric) { - try { - Map map = jedisPooled.ftInfo(this.indexName); - if (Objects.nonNull(map)) { - return; - } - } catch (Exception e) { - logger.info(e.getMessage()); - } - - Map attributes = new HashMap<>(); - attributes.put("TYPE", "FLOAT32"); - attributes.put("DIM", dimension); - attributes.put("DISTANCE_METRIC", metric); - Schema schema = - new Schema() - .addTextField("id", 1) - .addVectorField("values", Schema.VectorField.VectorAlgo.HNSW, attributes); - - IndexDefinition indexDefinition = new IndexDefinition().setPrefixes(this.namespace); - - String ftCreate = - jedisPooled.ftCreate( - this.indexName, IndexOptions.defaultOptions().setDefinition(indexDefinition), schema); - - logger.info("Redis search vector_index created ~ " + ftCreate); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java deleted file mode 100644 index 862c44025..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.edgechain.lib.index.domain; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.time.LocalDateTime; -import java.util.List; - -public class PostgresWordEmbeddings implements ArkObject { - - private Long embedding_id; - - private String id; - - private String rawText; - - private String namespace; - - private String filename; - - private List values; - - private LocalDateTime timestamp; - - private Double score; // will be added - - public Long getEmbedding_id() { - return embedding_id; - } - - public void setEmbedding_id(Long embedding_id) { - this.embedding_id = embedding_id; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getRawText() { - return rawText; - } - - public void setRawText(String rawText) { - this.rawText = rawText; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - - public LocalDateTime getTimestamp() { - return timestamp; - } - - public void setTimestamp(LocalDateTime timestamp) { - this.timestamp = timestamp; - } - - public void setScore(Double score) { - this.score = score; - } - - public Double getScore() { - return score; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public String getFilename() { - return filename; - } - - public void setFilename(String filename) { - this.filename = filename; - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("id", id); - json.put("rawText", rawText); - json.put("namespace", namespace); - json.put("filename", filename); - json.put("values", new JSONArray(values)); - json.put("timestamp", timestamp.toString()); - json.put("score", score); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/PostgresDistanceMetric.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/PostgresDistanceMetric.java deleted file mode 100644 index d05ac08c7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/PostgresDistanceMetric.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.edgechain.lib.index.enums; - -public enum PostgresDistanceMetric { - L2, - IP, - COSINE; - - public static String getDistanceMetric(PostgresDistanceMetric metric) { - - switch (metric) { - case IP -> { - return "<#>"; - } - case COSINE -> { - return "<=>"; - } - - default -> { - return "<->"; - } - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/RedisDistanceMetric.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/RedisDistanceMetric.java deleted file mode 100644 index ebdd0828a..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/RedisDistanceMetric.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.edgechain.lib.index.enums; - -public enum RedisDistanceMetric { - L2, - IP, - COSINE; - - public static String getDistanceMetric(RedisDistanceMetric metric) { - - switch (metric) { - case IP -> { - return "IP"; - } - case L2 -> { - return "L2"; - } - - default -> { - return "COSINE"; - } - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java deleted file mode 100644 index ea3e641c7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.edgechain.lib.index.repositories; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.utils.FloatUtils; -import com.github.f4b6a3.uuid.UuidCreator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; - -@Repository -public class PostgresClientRepository { - - @Autowired private JdbcTemplate jdbcTemplate; - - @Transactional - public void createTable(PostgresEndpoint postgresEndpoint) { - - jdbcTemplate.execute("CREATE EXTENSION IF NOT EXISTS vector;"); - jdbcTemplate.execute( - String.format( - "CREATE TABLE IF NOT EXISTS %s (embedding_id SERIAL PRIMARY KEY, id VARCHAR(255) NOT" - + " NULL UNIQUE, raw_text TEXT NOT NULL UNIQUE, embedding vector(%s), timestamp" - + " TIMESTAMP NOT NULL, namespace TEXT, filename VARCHAR(255));", - postgresEndpoint.getTableName(), postgresEndpoint.getDimensions())); - - if (PostgresDistanceMetric.L2.equals(postgresEndpoint.getMetric())) { - jdbcTemplate.execute( - String.format( - "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding vector_l2_ops) WITH" - + " (lists = %s);", - postgresEndpoint.getTableName().concat("_").concat("l2_idx"), - postgresEndpoint.getTableName(), - postgresEndpoint.getLists())); - } else if (PostgresDistanceMetric.COSINE.equals(postgresEndpoint.getMetric())) { - jdbcTemplate.execute( - String.format( - "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding vector_cosine_ops) WITH" - + " (lists = %s);", - postgresEndpoint.getTableName().concat("_").concat("cosine_idx"), - postgresEndpoint.getTableName(), - postgresEndpoint.getLists())); - } else { - jdbcTemplate.execute( - String.format( - "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding vector_ip_ops) WITH" - + " (lists = %s);", - postgresEndpoint.getTableName().concat("_").concat("ip_idx"), - postgresEndpoint.getTableName(), - postgresEndpoint.getLists())); - } - } - - @Transactional - public void upsertEmbeddings( - String tableName, - String input, - String filename, - WordEmbeddings wordEmbeddings, - String namespace) { - - jdbcTemplate.execute( - String.format( - "INSERT INTO %s (id, raw_text, embedding, timestamp, namespace, filename) VALUES ('%s'," - + " '%s', '%s', '%s', '%s', '%s') ON CONFLICT (raw_text) DO UPDATE SET embedding =" - + " EXCLUDED.embedding;", - tableName, - UuidCreator.getTimeOrderedEpoch().toString(), - input, - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - LocalDateTime.now(), - namespace, - filename)); - } - - @Transactional(readOnly = true, propagation = Propagation.REQUIRED) - public List> query( - String tableName, - String namespace, - int probes, - PostgresDistanceMetric metric, - WordEmbeddings wordEmbeddings, - int topK) { - - String embeddings = Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())); - - jdbcTemplate.execute(String.format("SET LOCAL ivfflat.probes = %s;", probes)); - if (metric.equals(PostgresDistanceMetric.IP)) { - - return jdbcTemplate.queryForList( - String.format( - "SELECT id, raw_text, namespace, filename, timestamp, ( embedding <#> '%s') * -1 AS" - + " score FROM %s WHERE namespace='%s' ORDER BY embedding %s '%s' LIMIT %s;", - embeddings, - tableName, - namespace, - PostgresDistanceMetric.getDistanceMetric(metric), - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - topK)); - - } else if (metric.equals(PostgresDistanceMetric.COSINE)) { - - return jdbcTemplate.queryForList( - String.format( - "SELECT id, raw_text, namespace, filename, timestamp, 1 - ( embedding <=> '%s') AS" - + " score FROM %s WHERE namespace='%s' ORDER BY embedding %s '%s' LIMIT %s;", - embeddings, - tableName, - namespace, - PostgresDistanceMetric.getDistanceMetric(metric), - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - topK)); - } else { - return jdbcTemplate.queryForList( - String.format( - "SELECT id, raw_text, namespace, filename, timestamp, (embedding <-> '%s') AS score" - + " FROM %s WHERE namespace='%s' ORDER BY embedding %s '%s' ASC LIMIT %s;", - embeddings, - tableName, - namespace, - PostgresDistanceMetric.getDistanceMetric(metric), - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - topK)); - } - } - - @Transactional - public void deleteAll(String tableName, String namespace) { - jdbcTemplate.execute( - String.format("delete from %s where namespace='%s'", tableName, namespace)); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/request/pinecone/PineconeUpsert.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/request/pinecone/PineconeUpsert.java deleted file mode 100644 index 2bc90d970..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/request/pinecone/PineconeUpsert.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.edgechain.lib.index.request.pinecone; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import java.util.List; - -public class PineconeUpsert { - - List vectors; - String namespace; - - public List getVectors() { - return vectors; - } - - public void setVectors(List vectors) { - this.vectors = vectors; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisDocument.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisDocument.java deleted file mode 100644 index 4aee8c5ed..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisDocument.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.edgechain.lib.index.responses; - -import java.util.ArrayList; - -public class RedisDocument { - - private String id; - private double score; - private Object payload; - private ArrayList properties; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public double getScore() { - return score; - } - - public void setScore(double score) { - this.score = score; - } - - public Object getPayload() { - return payload; - } - - public void setPayload(Object payload) { - this.payload = payload; - } - - public ArrayList getProperties() { - return properties; - } - - public void setProperties(ArrayList properties) { - this.properties = properties; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisProperty.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisProperty.java deleted file mode 100644 index a39665e94..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisProperty.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.edgechain.lib.index.responses; - -public class RedisProperty { - private String id; - private Double __values_score; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Double get__values_score() { - return __values_score; - } - - public void set__values_score(Double __values_score) { - this.__values_score = __values_score; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("RedisProperty{"); - sb.append("id='").append(id).append('\''); - sb.append(", __values_score=").append(__values_score); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisResponse.java deleted file mode 100644 index f0a7ba938..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/responses/RedisResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.edgechain.lib.index.responses; - -import java.util.ArrayList; - -public class RedisResponse { - - private int totalResults; - private ArrayList documents; - - public int getTotalResults() { - return totalResults; - } - - public void setTotalResults(int totalResults) { - this.totalResults = totalResults; - } - - public ArrayList getDocuments() { - return documents; - } - - public void setDocuments(ArrayList documents) { - this.documents = documents; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/FunctionRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/FunctionRequest.java deleted file mode 100644 index 1424a3398..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/FunctionRequest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.edgechain.lib.jsonFormat.request; - -public class FunctionRequest { - - private String name; - private String description; - private Object parameters; - - public FunctionRequest() {} - - public FunctionRequest(String name, String description, Object parameters) { - this.name = name; - this.description = description; - this.parameters = parameters; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Object getParameters() { - return parameters; - } - - public void setParameters(Parameters parameters) { - this.parameters = parameters; - } - - @Override - public String toString() { - return "FunctionRequest [name=" - + name - + ", description=" - + description - + ", parameters=" - + parameters - + "]"; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/Message.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/Message.java deleted file mode 100644 index 89a9fc9eb..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/Message.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.edgechain.lib.jsonFormat.request; - -public class Message { - - private String role; - private String content; - - public Message() {} - - public Message(String role, String content) { - this.role = role; - this.content = content; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/OpenApiFunctionRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/OpenApiFunctionRequest.java deleted file mode 100644 index 95556b49b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/OpenApiFunctionRequest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.edgechain.lib.jsonFormat.request; - -import java.util.List; - -public class OpenApiFunctionRequest { - - private String model; - private List messages; - private double temperature; - private List functions; - private String function_call; - - public OpenApiFunctionRequest( - String model, List messages, List functions) { - this.model = model; - this.messages = messages; - this.functions = functions; - } - - public OpenApiFunctionRequest( - String model, - List messages, - double temperature, - List functions, - String function_call) { - this.model = model; - this.messages = messages; - this.temperature = temperature; - this.functions = functions; - this.function_call = function_call; - } - - public OpenApiFunctionRequest() {} - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public List getMessages() { - return messages; - } - - public void setMessages(List messages) { - this.messages = messages; - } - - public double getTemperature() { - return temperature; - } - - public void setTemperature(double temperature) { - this.temperature = temperature; - } - - public List getFunctions() { - return functions; - } - - public void setFunctions(List functions) { - this.functions = functions; - } - - public String getFunction_call() { - return function_call; - } - - public void setFunction_call(String function_call) { - this.function_call = function_call; - } - - @Override - public String toString() { - return "OpenApiFunctionRequest [model=" - + model - + ", messages=" - + messages - + ", temperature=" - + temperature - + ", functions=" - + functions - + ", function_call=" - + function_call - + "]"; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/Parameters.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/Parameters.java deleted file mode 100644 index 2ac1078f5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/request/Parameters.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.edgechain.lib.jsonFormat.request; - -public class Parameters { - - private String type; - private Object properties; - - public Parameters() {} - - public Parameters(String type, Object properties) { - this.type = type; - this.properties = properties; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public Object getProperties() { - return properties; - } - - public void setProperties(Object properties) { - this.properties = properties; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/response/FunctionMessage.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/response/FunctionMessage.java deleted file mode 100644 index 42b0c77d7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/response/FunctionMessage.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.edgechain.lib.jsonFormat.response; - -public class FunctionMessage { - - private Fucntion function_call; - private String role; - private String content; - - public FunctionMessage() {} - - public FunctionMessage(Fucntion function_call, String role, String content) { - this.function_call = function_call; - this.role = role; - this.content = content; - } - - public static class Fucntion { - private String name; - private String arguments; - - public Fucntion() {} - - public Fucntion(String name, String arguments) { - this.name = name; - this.arguments = arguments; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getArguments() { - return arguments; - } - - public void setArguments(String arguments) { - this.arguments = arguments; - } - } - - public Fucntion getFunction_call() { - return function_call; - } - - public void setFunction_call(Fucntion function_call) { - this.function_call = function_call; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/response/FunctionResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/response/FunctionResponse.java deleted file mode 100644 index e9e72e54f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonFormat/response/FunctionResponse.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.edgechain.lib.jsonFormat.response; - -import java.util.List; - -public class FunctionResponse { - - private List choices; - - public FunctionResponse(List choices) { - this.choices = choices; - } - - public FunctionResponse() {} - - public List getChoices() { - return choices; - } - - public void setChoices(List choices) { - this.choices = choices; - } - - public static class Choice { - - private int index; - private FunctionMessage message; - - public Choice(int index, FunctionMessage message) { - this.index = index; - this.message = message; - } - - public Choice() {} - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } - - public FunctionMessage getMessage() { - return message; - } - - public void setMessage(FunctionMessage message) { - this.message = message; - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java deleted file mode 100644 index 8bdbd4a33..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.edgechain.lib.jsonnet; - -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.exceptions.JsonnetArgException; - -public class JsonnetArgs { - - private DataType dataType; - private final String val; - - public JsonnetArgs(DataType dataType, String val) { - - this.dataType = dataType; - - // Validation - if (dataType.equals(DataType.INTEGER)) Integer.parseInt(val); - else if (dataType.equals(DataType.BOOLEAN)) { - try { - this.validateBoolean(val); - } catch (JsonnetArgException e) { - throw new RuntimeException(e); - } - } - this.val = val; - } - - public DataType getDataType() { - return dataType; - } - - public void setDataType(DataType dataType) { - this.dataType = dataType; - } - - public String getVal() { - return val; - } - - public boolean validateBoolean(String val) throws JsonnetArgException { - - if ("true".equalsIgnoreCase(val)) { - return true; - } else if ("false".equalsIgnoreCase(val)) { - return true; - } else { - throw new JsonnetArgException("Invalid Boolean DataType"); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java deleted file mode 100644 index c3a8a932b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.edgechain.lib.jsonnet; - -import com.edgechain.lib.jsonnet.enums.DataType; -import com.edgechain.lib.jsonnet.exceptions.JsonnetLoaderException; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.github.jam01.xtrasonnet.Transformer; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.RandomStringUtils; -import org.json.JSONArray; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; -import java.util.*; - -public abstract class JsonnetLoader { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private Map args = new HashMap<>(); - private Map xtraArgsMap = new HashMap<>(); - private static final ObjectMapper objectMapper = new ObjectMapper(); - private JSONObject jsonObject; - - public JsonnetLoader() {} - - public void load(InputStream inputStream) { - try { - preconfigured(); - - // Create Temp File With Unique Name - String filename = - RandomStringUtils.randomAlphanumeric(12) + "_" + System.currentTimeMillis() + ".jsonnet"; - File file = new File(System.getProperty("java.io.tmpdir") + File.separator + filename); - - BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); - - StringBuilder sb = new StringBuilder(); - String line; - while ((line = br.readLine()) != null) { - sb.append(line).append(System.lineSeparator()); - } - - String text = sb.toString().replaceAll("[\r]+", ""); - - PrintWriter printWriter = new PrintWriter(file); - printWriter.write(text); - printWriter.flush(); - printWriter.close(); - br.close(); - - // Transform Jsonnet Args - for (Map.Entry entry : this.args.entrySet()) { - - if (entry.getValue().getDataType().equals(DataType.STRING)) { - String regex = "[^\\p{L}\\p{N}\\p{P}\\p{Z}]"; - - xtraArgsMap.put(entry.getKey(), entry.getValue().getVal().replaceAll(regex, "")); - - } else if (entry.getValue().getDataType().equals(DataType.INTEGER) - || entry.getValue().getDataType().equals(DataType.BOOLEAN)) { - xtraArgsMap.put(entry.getKey(), entry.getValue().getVal()); - } - } - - var res = - Transformer.builder(text) - .withLibrary(new XtraSonnetCustomFunc()) - .build() - .transform(serializeXtraArgs(xtraArgsMap)); - // Get the String Output & Transform it into JsonnetSchema - this.jsonObject = new JSONObject(res); - - // Delete File - FileUtils.deleteQuietly(file); - - } catch (final Exception e) { - throw new JsonnetLoaderException(e.getMessage()); - } - } - - private static String serializeXtraArgs(Map xtraArgsMap) { - try { - return objectMapper.writeValueAsString(xtraArgsMap); - } catch (Exception e) { - e.printStackTrace(); - return "{}"; - } - } - - public abstract JsonnetLoader loadOrReload(); - - public JsonnetLoader put(String key, JsonnetArgs args) { - this.args.put(key, args); - return this; - } - - public Map getArgs() { - return args; - } - - public String get(String key) { - return this.jsonObject.getString(key); - } - - public JSONArray getArray(String key) { - return this.jsonObject.getJSONArray(key); - } - - public int getInt(String key) { - return this.jsonObject.getInt(key); - } - - public boolean getBoolean(String key) { - return this.jsonObject.getBoolean(key); - } - - private void preconfigured() { - Map args = this.getArgs(); - - if (Objects.isNull(args.get("keepContext"))) { - args.put("keepContext", new JsonnetArgs(DataType.BOOLEAN, "false")); - } - - if (Objects.isNull(args.get("keepMaxTokens"))) - args.put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "false")); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java deleted file mode 100644 index ca3d0665b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.edgechain.lib.jsonnet; - -import com.edgechain.lib.endpoint.impl.WikiEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.github.jam01.xtrasonnet.DataFormatService; -import io.github.jam01.xtrasonnet.header.Header; -import io.github.jam01.xtrasonnet.spi.Library; -import sjsonnet.Importer; -import sjsonnet.Val; - -import java.util.*; - -public class XtraSonnetCustomFunc extends Library { - @Override - public String namespace() { - return "udf"; - } - - @Override - public Map functions( - DataFormatService dataFormats, Header header, Importer importer) { - var res = new HashMap(); - res.put( - "fn", - builtin( - new String[] {"param"}, - (vals, pos, ev) -> { - String prompt = vals[0].asString(); - if (prompt == null || prompt.equals("")) { - return new Val.Str(dummyPosition(), ""); - } - WikiEndpoint wikiEndpoint = new WikiEndpoint(); - - String response = - new EdgeChain<>(wikiEndpoint.getPageContent(prompt)).get().getText(); - return new Val.Str(dummyPosition(), response); - })); - return res; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/enums/DataType.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/enums/DataType.java deleted file mode 100644 index 092b7800f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/enums/DataType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.edgechain.lib.jsonnet.enums; - -public enum DataType { - INTEGER, - STRING, - BOOLEAN -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/JsonnetArgException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/JsonnetArgException.java deleted file mode 100644 index 6d9c166dc..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/JsonnetArgException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.jsonnet.exceptions; - -public class JsonnetArgException extends Exception { - - public JsonnetArgException(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/JsonnetLoaderException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/JsonnetLoaderException.java deleted file mode 100644 index 77813663e..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/JsonnetLoaderException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.jsonnet.exceptions; - -public class JsonnetLoaderException extends RuntimeException { - - public JsonnetLoaderException(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/UnexpectedServiceException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/UnexpectedServiceException.java deleted file mode 100644 index 51f781404..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/exceptions/UnexpectedServiceException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.jsonnet.exceptions; - -public class UnexpectedServiceException extends RuntimeException { - - public UnexpectedServiceException(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java deleted file mode 100644 index 0743e402a..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.edgechain.lib.jsonnet.impl; - -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.exceptions.JsonnetLoaderException; - -import java.io.*; - -public class FileJsonnetLoader extends JsonnetLoader { - - private String filePath; - - public FileJsonnetLoader(String filePath) { - this.filePath = filePath; - } - - public FileJsonnetLoader() { - super(); - } - - @Override - public JsonnetLoader loadOrReload() { - try (InputStream in = new FileInputStream(filePath)) { - this.load(in); - return this; - } catch (final Exception e) { - throw new JsonnetLoaderException(e.getMessage()); - } - } - - public String getFilePath() { - return filePath; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/mapper/ServiceMapper.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/mapper/ServiceMapper.java deleted file mode 100644 index 083d2c819..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/mapper/ServiceMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.edgechain.lib.jsonnet.mapper; - -import com.edgechain.lib.configuration.context.ApplicationContextHolder; -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.exceptions.UnexpectedServiceException; - -import java.util.Iterator; - -public class ServiceMapper { - - public T map(JsonnetLoader loader, String name, Class classType) { - - Iterator iterator = loader.getArray("services").iterator(); - while (iterator.hasNext()) { - String service = (String) iterator.next(); - if (service.equals(name)) { - return ApplicationContextHolder.getContext().getBean(classType); - } - } - - throw new UnexpectedServiceException( - String.format("%s service is not defined in jsonnet", name)); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/ChatCompletionLogger.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/ChatCompletionLogger.java deleted file mode 100644 index 7c005b876..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/ChatCompletionLogger.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.edgechain.lib.logger; - -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.retrofit.logger.ChatCompletionLoggerService; -import org.springframework.data.domain.Page; -import org.springframework.web.bind.annotation.PathVariable; -import retrofit2.Retrofit; - -import java.util.HashMap; - -public class ChatCompletionLogger { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final ChatCompletionLoggerService chatCompletionLoggerService = - retrofit.create(ChatCompletionLoggerService.class); - - public ChatCompletionLogger() {} - - public Page findAll(int page, int size) { - return this.chatCompletionLoggerService.findAll(page, size).blockingGet(); - } - - public Page findAllOrderByCompletedAtDesc(int page, int size) { - return this.chatCompletionLoggerService.findAllOrderByCompletedAtDesc(page, size).blockingGet(); - } - - public Page findAllByName(String name, int page, int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("name", name); - - return this.chatCompletionLoggerService.findAllByName(mapper, page, size).blockingGet(); - } - - public Page findAllByNameOrderByCompletedAtDesc( - String name, int page, int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("name", name); - - return this.chatCompletionLoggerService - .findAllByNameOrderByCompletedAtDesc(mapper, page, size) - .blockingGet(); - } - - public Page findAllByModel(String model, int page, int size) { - HashMap mapper = new HashMap<>(); - mapper.put("model", model); - return this.chatCompletionLoggerService.findAllByModel(mapper, page, size).blockingGet(); - } - - public Page findAllByModelOrderByCompletedAtDesc( - String model, int page, int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("model", model); - - return this.chatCompletionLoggerService - .findAllByModelOrderByCompletedAtDesc(mapper, page, size) - .blockingGet(); - } - - public Page findAllByCallIdentifier( - String callIdentifier, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("identifier", callIdentifier); - - return this.chatCompletionLoggerService - .findAllByCallIdentifier(mapper, page, size) - .blockingGet(); - } - - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - String callIdentifier, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("identifier", callIdentifier); - - return this.chatCompletionLoggerService - .findAllByCallIdentifierOrderByCompletedAtDesc(mapper, page, size) - .blockingGet(); - } - - public Page findAllByLatencyLessThanEqual( - long latency, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("latency", latency); - - return this.chatCompletionLoggerService - .findAllByLatencyLessThanEqual(mapper, page, size) - .blockingGet(); - } - - public Page findAllByLatencyGreaterThanEqual( - long latency, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("latency", latency); - return this.chatCompletionLoggerService - .findAllByLatencyGreaterThanEqual(mapper, page, size) - .blockingGet(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java deleted file mode 100644 index c1e30b9b5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.edgechain.lib.logger; - -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.retrofit.logger.EmbeddingLoggerService; -import com.edgechain.lib.retrofit.logger.EmbeddingLoggerService; -import org.springframework.data.domain.Page; -import org.springframework.web.bind.annotation.PathVariable; -import retrofit2.Retrofit; - -import java.util.HashMap; - -public class EmbeddingLogger { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final EmbeddingLoggerService embeddingLoggerService = - retrofit.create(EmbeddingLoggerService.class); - - public EmbeddingLogger() {} - - public Page findAll(int page, int size) { - return this.embeddingLoggerService.findAll(page, size).blockingGet(); - } - - public Page findAllOrderByCompletedAtDesc(int page, int size) { - return this.embeddingLoggerService.findAllOrderByCompletedAtDesc(page, size).blockingGet(); - } - - public Page findAllByModel(String model, int page, int size) { - HashMap mapper = new HashMap<>(); - mapper.put("model", model); - return this.embeddingLoggerService.findAllByModel(mapper, page, size).blockingGet(); - } - - public Page findAllByModelOrderByCompletedAtDesc(String model, int page, int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("model", model); - - return this.embeddingLoggerService - .findAllByModelOrderByCompletedAtDesc(mapper, page, size) - .blockingGet(); - } - - public Page findAllByCallIdentifier( - String callIdentifier, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("identifier", callIdentifier); - - return this.embeddingLoggerService.findAllByCallIdentifier(mapper, page, size).blockingGet(); - } - - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - String callIdentifier, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("identifier", callIdentifier); - - return this.embeddingLoggerService - .findAllByCallIdentifierOrderByCompletedAtDesc(mapper, page, size) - .blockingGet(); - } - - public Page findAllByLatencyLessThanEqual( - long latency, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("latency", latency); - - return this.embeddingLoggerService - .findAllByLatencyLessThanEqual(mapper, page, size) - .blockingGet(); - } - - public Page findAllByLatencyGreaterThanEqual( - long latency, @PathVariable int page, @PathVariable int size) { - - HashMap mapper = new HashMap<>(); - mapper.put("latency", latency); - return this.embeddingLoggerService - .findAllByLatencyGreaterThanEqual(mapper, page, size) - .blockingGet(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java deleted file mode 100644 index 5960c5352..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.edgechain.lib.logger.entities; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.*; - -import javax.validation.constraints.NotBlank; -import java.time.LocalDateTime; -import java.util.UUID; - -@Table(name = "chat_completion_logs") -@Entity(name = "ChatCompletionLog") -public class ChatCompletionLog { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private Long chatCompletionId; - - @Column(nullable = false, unique = true) - private String id; - - @Column(nullable = false) - @NotBlank(message = "Chat Completion Log: 'name' field cannot be empty or null.") - private String name; - - @Column(nullable = false) - @NotBlank(message = "Chat Completion Log: 'call_identifier' field cannot be empty or null.") - private String callIdentifier; - - @Column(nullable = false) - @NotBlank - private String type; - - private LocalDateTime createdAt; - private LocalDateTime completedAt; - - @Column(nullable = false) - @NotBlank(message = "Chat Completion Log: 'model' field cannot be empty or null.") - private String model; - - @Column(columnDefinition = "TEXT") - @NotBlank - private String input; - - @Column(columnDefinition = "TEXT") - private String content; - - private Long latency; - - private Long promptTokens; - private Long totalTokens; - - @PrePersist - protected void onCreate() { - setId(UUID.randomUUID().toString()); - } - - public void setId(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(LocalDateTime createdAt) { - this.createdAt = createdAt; - } - - public LocalDateTime getCompletedAt() { - return completedAt; - } - - public void setCompletedAt(LocalDateTime completedAt) { - this.completedAt = completedAt; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public long getLatency() { - return latency; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public void setLatency(Long latency) { - this.latency = latency; - } - - public Long getPromptTokens() { - return promptTokens; - } - - public void setPromptTokens(Long promptTokens) { - this.promptTokens = promptTokens; - } - - public Long getTotalTokens() { - return totalTokens; - } - - public void setTotalTokens(Long totalTokens) { - this.totalTokens = totalTokens; - } - - public Long getChatCompletionId() { - return chatCompletionId; - } - - public void setChatCompletionId(Long chatCompletionId) { - this.chatCompletionId = chatCompletionId; - } - - public String getCallIdentifier() { - return callIdentifier; - } - - public void setCallIdentifier(String callIdentifier) { - this.callIdentifier = callIdentifier; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionLog{"); - sb.append("chatCompletionId=").append(chatCompletionId); - sb.append(", id='").append(id).append('\''); - sb.append(", name='").append(name).append('\''); - sb.append(", callIdentifier='").append(callIdentifier).append('\''); - sb.append(", type='").append(type).append('\''); - sb.append(", createdAt=").append(createdAt); - sb.append(", completedAt=").append(completedAt); - sb.append(", model='").append(model).append('\''); - sb.append(", input='").append(input).append('\''); - sb.append(", content='").append(content).append('\''); - sb.append(", latency=").append(latency); - sb.append(", promptTokens=").append(promptTokens); - sb.append(", totalTokens=").append(totalTokens); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/EmbeddingLog.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/EmbeddingLog.java deleted file mode 100644 index e565fc024..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/EmbeddingLog.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.edgechain.lib.logger.entities; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.*; -import java.time.LocalDateTime; -import java.util.UUID; -import javax.validation.constraints.NotBlank; - -@Table(name = "embedding_logs") -@Entity(name = "EmbeddingLog") -public class EmbeddingLog { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private Long embeddingId; - - @Column(nullable = false, unique = true) - private String id; - - @Column(nullable = false) - @NotBlank(message = "Embedding Log: 'call_identifier' field cannot be empty or null.") - private String callIdentifier; - - private LocalDateTime createdAt; - private LocalDateTime completedAt; - - @Column(nullable = false) - @NotBlank(message = "Embedding Log: 'model' field cannot be empty or null.") - private String model; - - private Long latency; - - private Long promptTokens; - private Long totalTokens; - - @PrePersist - protected void onCreate() { - setId(UUID.randomUUID().toString()); - } - - public Long getEmbeddingId() { - return embeddingId; - } - - public void setId(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(LocalDateTime createdAt) { - this.createdAt = createdAt; - } - - public LocalDateTime getCompletedAt() { - return completedAt; - } - - public void setCompletedAt(LocalDateTime completedAt) { - this.completedAt = completedAt; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public long getLatency() { - return latency; - } - - public void setLatency(Long latency) { - this.latency = latency; - } - - public Long getPromptTokens() { - return promptTokens; - } - - public void setPromptTokens(Long promptTokens) { - this.promptTokens = promptTokens; - } - - public Long getTotalTokens() { - return totalTokens; - } - - public void setTotalTokens(Long totalTokens) { - this.totalTokens = totalTokens; - } - - public void setEmbeddingId(Long embeddingId) { - this.embeddingId = embeddingId; - } - - public String getCallIdentifier() { - return callIdentifier; - } - - public void setCallIdentifier(String callIdentifier) { - this.callIdentifier = callIdentifier; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/ChatCompletionLogRepository.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/ChatCompletionLogRepository.java deleted file mode 100644 index c84b553f1..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/ChatCompletionLogRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.edgechain.lib.logger.repositories; - -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import org.jetbrains.annotations.NotNull; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ChatCompletionLogRepository extends JpaRepository { - - @Override - Page findAll(@NotNull Pageable pageable); - - Page findAllByOrderByCompletedAtDesc(Pageable pageable); - - Page findAllByName(String name, Pageable pageable); - - Page findAllByNameOrderByCompletedAtDesc(String name, Pageable pageable); - - Page findAllByModel(String model, Pageable pageable); - - Page findAllByModelOrderByCompletedAtDesc(String model, Pageable pageable); - - Page findAllByCallIdentifier(String callIdentifier, Pageable pageable); - - Page findAllByCallIdentifierOrderByCompletedAtDesc( - String callIdentifier, Pageable pageable); - - Page findAllByLatencyLessThanEqual(long latency, Pageable pageable); - - Page findAllByLatencyGreaterThanEqual(long latency, Pageable pageable); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/EmbeddingLogRepository.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/EmbeddingLogRepository.java deleted file mode 100644 index ca1048b8c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/EmbeddingLogRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.edgechain.lib.logger.repositories; - -import com.edgechain.lib.logger.entities.EmbeddingLog; -import org.jetbrains.annotations.NotNull; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface EmbeddingLogRepository extends JpaRepository { - - @Override - Page findAll(@NotNull Pageable pageable); - - Page findAllByOrderByCompletedAtDesc(Pageable pageable); - - Page findAllByModel(String model, Pageable pageable); - - Page findAllByModelOrderByCompletedAtDesc(String model, Pageable pageable); - - Page findAllByCallIdentifier(String callIdentifier, Pageable pageable); - - Page findAllByCallIdentifierOrderByCompletedAtDesc( - String callIdentifier, Pageable pageable); - - Page findAllByLatencyLessThanEqual(long latency, Pageable pageable); - - Page findAllByLatencyGreaterThanEqual(long latency, Pageable pageable); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java deleted file mode 100644 index 9871831f6..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.edgechain.lib.logger.services; - -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import com.edgechain.lib.logger.repositories.ChatCompletionLogRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -public class ChatCompletionLogService { - - @Autowired private ChatCompletionLogRepository chatCompletionLogRepository; - @Autowired private JdbcTemplate jdbcTemplate; - - public ChatCompletionLog saveOrUpdate(ChatCompletionLog chatCompletionLog) { - this.createTable(); - return chatCompletionLogRepository.save(chatCompletionLog); - } - - @Transactional(readOnly = true) - public Page findAll(Pageable pageable) { - return this.chatCompletionLogRepository.findAll(pageable); - } - - @Transactional(readOnly = true) - public Page findAllOrderByCompletedAtDesc(Pageable pageable) { - return this.chatCompletionLogRepository.findAllByOrderByCompletedAtDesc(pageable); - } - - @Transactional(readOnly = true) - public Page findAllByName(String name, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByName(name, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByNameOrderByCompletedAtDesc( - String name, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByNameOrderByCompletedAtDesc(name, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByModel(String model, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByModel(model, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByModelOrderByCompletedAtDesc( - String model, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByModelOrderByCompletedAtDesc(model, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByCallIdentifier(String callIdentifier, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByCallIdentifier(callIdentifier, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - String callIdentifier, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByCallIdentifierOrderByCompletedAtDesc( - callIdentifier, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByLatencyLessThanEqual(long latency, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByLatencyLessThanEqual(latency, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByLatencyGreaterThanEqual(long latency, Pageable pageable) { - return this.chatCompletionLogRepository.findAllByLatencyGreaterThanEqual(latency, pageable); - } - - @Transactional - public void createTable() { - jdbcTemplate.execute( - "CREATE TABLE IF NOT EXISTS chat_completion_logs (\n" - + " chat_completion_id SERIAL PRIMARY KEY,\n" - + " id VARCHAR(255) NOT NULL UNIQUE,\n" - + " name VARCHAR(255) NOT NULL,\n" - + " call_identifier VARCHAR(255) NOT NULL,\n" - + " type VARCHAR(255) NOT NULL,\n" - + " created_at TIMESTAMP,\n" - + " completed_at TIMESTAMP,\n" - + " model VARCHAR(255) NOT NULL,\n" - + " input TEXT NOT NULL,\n" - + " content TEXT,\n" - + " latency BIGINT,\n" - + " prompt_tokens BIGINT,\n" - + " total_tokens BIGINT\n" - + ");"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java deleted file mode 100644 index 8f4ad06e6..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.edgechain.lib.logger.services; - -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.repositories.EmbeddingLogRepository; -import com.edgechain.lib.logger.repositories.EmbeddingLogRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -public class EmbeddingLogService { - - @Autowired private EmbeddingLogRepository embeddingLogRepository; - @Autowired private JdbcTemplate jdbcTemplate; - - public EmbeddingLog saveOrUpdate(EmbeddingLog embeddingLog) { - this.createTable(); - return this.embeddingLogRepository.save(embeddingLog); - } - - @Transactional(readOnly = true) - public Page findAll(Pageable pageable) { - return this.embeddingLogRepository.findAll(pageable); - } - - @Transactional(readOnly = true) - public Page findAllOrderByCompletedAtDesc(Pageable pageable) { - return this.embeddingLogRepository.findAllByOrderByCompletedAtDesc(pageable); - } - - @Transactional(readOnly = true) - public Page findAllByModel(String model, Pageable pageable) { - return this.embeddingLogRepository.findAllByModel(model, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByModelOrderByCompletedAtDesc(String model, Pageable pageable) { - return this.embeddingLogRepository.findAllByModelOrderByCompletedAtDesc(model, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByCallIdentifier(String callIdentifier, Pageable pageable) { - return this.embeddingLogRepository.findAllByCallIdentifier(callIdentifier, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - String callIdentifier, Pageable pageable) { - return this.embeddingLogRepository.findAllByCallIdentifierOrderByCompletedAtDesc( - callIdentifier, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByLatencyLessThanEqual(long latency, Pageable pageable) { - return this.embeddingLogRepository.findAllByLatencyLessThanEqual(latency, pageable); - } - - @Transactional(readOnly = true) - public Page findAllByLatencyGreaterThanEqual(long latency, Pageable pageable) { - return this.embeddingLogRepository.findAllByLatencyGreaterThanEqual(latency, pageable); - } - - @Transactional - public void createTable() { - jdbcTemplate.execute( - "CREATE TABLE IF NOT EXISTS embedding_logs (\n" - + " embedding_id SERIAL PRIMARY KEY,\n" - + " id VARCHAR(255) NOT NULL UNIQUE,\n" - + " call_identifier VARCHAR(255) NOT NULL,\n" - + " created_at TIMESTAMP,\n" - + " completed_at TIMESTAMP,\n" - + " model VARCHAR(255) NOT NULL,\n" - + " latency BIGINT,\n" - + " prompt_tokens BIGINT,\n" - + " total_tokens BIGINT\n" - + ");;"); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/chains/PluginChain.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/chains/PluginChain.java deleted file mode 100644 index f25126982..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/chains/PluginChain.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.edgechain.lib.openai.chains; - -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; - -public class PluginChain extends EdgeChain { - - public PluginChain(Observable observable) { - super(observable); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java deleted file mode 100644 index e406cab3f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.edgechain.lib.openai.client; - -import com.edgechain.lib.constants.EndpointConstants; -import com.edgechain.lib.embeddings.request.OpenAiEmbeddingRequest; -import com.edgechain.lib.embeddings.response.OpenAiEmbeddingResponse; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.openai.request.ChatCompletionRequest; -import com.edgechain.lib.openai.request.CompletionRequest; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.openai.response.CompletionResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.adapter.rxjava.RxJava3Adapter; - -import java.util.Objects; - -@Service -public class OpenAiClient { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - private final RestTemplate restTemplate = new RestTemplate(); - - private OpenAiEndpoint endpoint; - - public OpenAiEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(OpenAiEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain createChatCompletion(ChatCompletionRequest request) { - - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - logger.info("Logging ChatCompletion...."); - - // Create headers - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(endpoint.getApiKey()); - - if (Objects.nonNull(endpoint.getOrgId()) && !endpoint.getOrgId().isEmpty()) { - headers.set("OpenAI-Organization", endpoint.getOrgId()); - } - HttpEntity entity = new HttpEntity<>(request, headers); - - logger.info(String.valueOf(entity.getBody())); - - // Send the POST request - ResponseEntity response = - restTemplate.exchange( - endpoint.getUrl(), HttpMethod.POST, entity, ChatCompletionResponse.class); - - emitter.onNext(Objects.requireNonNull(response.getBody())); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - public EdgeChain createChatCompletionStream( - ChatCompletionRequest request) { - - try { - return new EdgeChain<>( - RxJava3Adapter.fluxToObservable( - WebClient.builder() - .build() - .post() - .uri(EndpointConstants.OPENAI_CHAT_COMPLETION_API) - .accept(MediaType.TEXT_EVENT_STREAM) - .headers( - httpHeaders -> { - httpHeaders.setContentType(MediaType.APPLICATION_JSON); - httpHeaders.setBearerAuth(endpoint.getApiKey()); - if (Objects.nonNull(endpoint.getOrgId()) - && !endpoint.getOrgId().isEmpty()) { - httpHeaders.set("OpenAI-Organization", endpoint.getOrgId()); - } - }) - .bodyValue(new ObjectMapper().writeValueAsString(request)) - .retrieve() - .bodyToFlux(ChatCompletionResponse.class)), - endpoint); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - - public EdgeChain createCompletion(CompletionRequest request) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(endpoint.getApiKey()); - if (Objects.nonNull(endpoint.getOrgId()) && !endpoint.getOrgId().isEmpty()) { - headers.set("OpenAI-Organization", endpoint.getOrgId()); - } - HttpEntity entity = new HttpEntity<>(request, headers); - - ResponseEntity response = - this.restTemplate.exchange( - endpoint.getUrl(), HttpMethod.POST, entity, CompletionResponse.class); - emitter.onNext(Objects.requireNonNull(response.getBody())); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } - - public EdgeChain createEmbeddings(OpenAiEmbeddingRequest request) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(endpoint.getApiKey()); - if (Objects.nonNull(endpoint.getOrgId()) && !endpoint.getOrgId().isEmpty()) { - headers.set("OpenAI-Organization", endpoint.getOrgId()); - } - HttpEntity entity = new HttpEntity<>(request, headers); - - ResponseEntity response = - this.restTemplate.exchange( - endpoint.getUrl(), HttpMethod.POST, entity, OpenAiEmbeddingResponse.class); - - emitter.onNext(Objects.requireNonNull(response.getBody())); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - endpoint); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/exceptions/PromptException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/exceptions/PromptException.java deleted file mode 100644 index 2b936ea15..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/exceptions/PromptException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.openai.exceptions; - -public class PromptException extends RuntimeException { - - public PromptException(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/Scratchpad.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/Scratchpad.java deleted file mode 100644 index e4e3fd411..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/Scratchpad.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.edgechain.lib.openai.parser; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Scratchpad { - - private List scratchpadList; - - public Scratchpad() {} - - public Scratchpad(String textoutput) { - scratchpadList = new ArrayList<>(); - String regex = - "(Thought \\d+:.*?(?=Thought \\d+|Action \\d+|Observation \\d+|$))|(Action" - + " \\d+:.*?(?=Thought \\d+|Action \\d+|Observation \\d+|$))|(Observation" - + " \\d+:.*?(?=Thought \\d+|Action \\d+|Observation \\d+|$))"; - Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); - Matcher matcher = pattern.matcher(textoutput); - - while (matcher.find()) { - scratchpadList.add(matcher.group().trim()); - } - } - - public List getScratchpadList() { - return scratchpadList; - } - - public void setScratchpadList(List scratchpadList) { - this.scratchpadList = scratchpadList; - } - - // Method to extract content between brackets for a given action index - public String getActionContent() { - String actionContent = null; - for (String item : scratchpadList) { - if (item.startsWith("Action") && item.contains("Search")) { - Pattern pattern = Pattern.compile("\\[(.*?)\\]"); - Matcher matcher = pattern.matcher(item); - if (matcher.find()) { - actionContent = matcher.group(1); - } - break; - } - } - return actionContent; - } - - // Method to replace the content of an action by the given index with a new string called - // wikiContentForAction - public void observationReplacer(String newString) { - boolean observationFound = false; - int observationIndex = -1; - for (int i = 0; i < scratchpadList.size(); i++) { - String item = scratchpadList.get(i); - if (item.startsWith("Observation")) { - String updatedItem = "Observation: " + newString; - scratchpadList.set(i, updatedItem); - observationFound = true; - observationIndex = i; - break; - } - } - if (!observationFound) { - scratchpadList.add("Observation: " + newString); - observationIndex = scratchpadList.size() - 1; - } - - // Remove everything after the newly added or updated observation - if (observationIndex >= 0 && observationIndex < scratchpadList.size() - 1) { - scratchpadList.subList(observationIndex + 1, scratchpadList.size()).clear(); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/StringParser.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/StringParser.java deleted file mode 100644 index 44f9ed0f0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/StringParser.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.edgechain.lib.openai.parser; - -public class StringParser { - - private String output; - private String[] thoughts; - private String[] actions; - private String[] observations; - private String finalAnswer; - - public StringParser(String output) { - this.output = output; - splitOutput(); - } - - private void splitOutput() { - String[] blocks = output.split("(?<=\\D)(?=Thought \\d+:)"); - - actions = new String[blocks.length]; - thoughts = new String[blocks.length]; - observations = new String[blocks.length]; - - for (int i = 0; i < blocks.length; i++) { - String[] parts = blocks[i].split("(?<=\\D)(?=Action \\d+:)"); - if (parts.length == 2) { - thoughts[i] = parts[0].trim(); - actions[i] = parts[1].trim(); - } - parts = actions[i].split("(?<=\\D)(?=Observation \\d+:)"); - if (parts.length == 2) { - actions[i] = parts[0].trim(); - observations[i] = parts[1].trim(); - } - } - - String finalAnswerPattern = "Action \\d+: Finish\\["; - int finalAnswerIndex = output.lastIndexOf(finalAnswerPattern); - if (finalAnswerIndex >= 0) { - finalAnswer = output.substring(finalAnswerIndex + finalAnswerPattern.length()).trim(); - int endIndex = finalAnswer.indexOf("]"); - if (endIndex >= 0) { - finalAnswer = finalAnswer.substring(0, endIndex); - } - - // Remove final answer from the last action - actions[actions.length - 1] = - actions[actions.length - 1].replace("Finish[" + finalAnswer + "]", "").trim(); - } - } - - public String[] getThoughts() { - return thoughts; - } - - public String[] getActions() { - return actions; - } - - public String[] getObservations() { - return observations; - } - - public String getFinalAnswer() { - return finalAnswer; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/TextExtractorForWiki.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/TextExtractorForWiki.java deleted file mode 100644 index 3a7f9dd87..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/parser/TextExtractorForWiki.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.edgechain.lib.openai.parser; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -// used this class for debugging. -public class TextExtractorForWiki { - - public static String extractTextFromBrackets(String input) { - Pattern pattern = Pattern.compile("\\[(.*?)\\]"); - Matcher matcher = pattern.matcher(input); - String extractedText = null; - if (matcher.find()) { - extractedText = matcher.group(1); - } - return extractedText; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/builder/PluginBuilder.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/builder/PluginBuilder.java deleted file mode 100644 index 40d1acea7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/builder/PluginBuilder.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.edgechain.lib.openai.plugin.builder; - -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.openai.plugin.parser.PluginJSONParser; -import com.edgechain.lib.openai.plugin.prompt.CompletionPrompt; -import com.edgechain.lib.openai.plugin.response.PluginResponse; -import com.edgechain.lib.openai.plugin.services.PluginResponseService; -import com.edgechain.lib.openai.plugin.services.PluginService; -import com.edgechain.lib.openai.plugin.tool.ApiConfig; -import com.edgechain.lib.openai.plugin.tool.PluginTool; -import com.edgechain.lib.openai.prompt.PromptTemplate; -import com.edgechain.lib.openai.providers.OpenAiCompletionProvider; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class PluginBuilder { - - public static EdgeChain requestAPI( - OpenAiCompletionProvider provider, Endpoint pluginAPI, Endpoint specAPI, String query) { - - // Create PluginResponseService Constructor - PluginResponseService pluginResponseService = new PluginResponseService(pluginAPI, specAPI); - - // Fetch Plugin Information - PluginResponse pluginResponse = pluginResponseService.getPluginResponse(); - - // Use Plugin Service - PluginService pluginService = - new PluginService( - provider, pluginResponse, new CompletionPrompt(pluginResponse).getPrompt(), query); - - return pluginService.request(); - } - - public static EdgeChain requestAPI( - OpenAiCompletionProvider provider, - Endpoint pluginAPI, - Endpoint specAPI, - PromptTemplate promptTemplate, - String query) { - - // Create PluginResponseService Constructor - PluginResponseService pluginResponseService = new PluginResponseService(pluginAPI, specAPI); - - // Fetch Plugin Information - PluginResponse pluginResponse = pluginResponseService.getPluginResponse(); - - // Use Plugin Service - PluginService pluginService = - new PluginService(provider, pluginResponse, promptTemplate.getPrompt(), query); - - return pluginService.request(); - } - - public static EdgeChain requestJSON( - OpenAiCompletionProvider provider, PluginJSONParser pluginJSONParser, String query) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - - PluginTool pluginTool = - objectMapper.readValue(pluginJSONParser.getPluginJSON(), PluginTool.class); - pluginTool.setApi( - objectMapper.readValue(pluginJSONParser.getApiConfigJson(), ApiConfig.class)); - - PluginResponse pluginResponse = - new PluginResponse(pluginTool, pluginJSONParser.getSpecAPIJson()); - - // Use Plugin Service - PluginService pluginService = - new PluginService( - provider, pluginResponse, new CompletionPrompt(pluginResponse).getPrompt(), query); - - return pluginService.request(); - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - public static EdgeChain requestJSON( - OpenAiCompletionProvider provider, - PluginJSONParser pluginJSONParser, - PromptTemplate promptTemplate, - String query) { - try { - - ObjectMapper objectMapper = new ObjectMapper(); - - PluginTool pluginTool = - objectMapper.readValue(pluginJSONParser.getPluginJSON(), PluginTool.class); - pluginTool.setApi( - objectMapper.readValue(pluginJSONParser.getApiConfigJson(), ApiConfig.class)); - - PluginResponse pluginResponse = - new PluginResponse(pluginTool, pluginJSONParser.getSpecAPIJson()); - - // Use Plugin Service - PluginService pluginService = - new PluginService(provider, pluginResponse, promptTemplate.getPrompt(), query); - - return pluginService.request(); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/chains/PluginResponseChain.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/chains/PluginResponseChain.java deleted file mode 100644 index cb08d3b35..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/chains/PluginResponseChain.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.edgechain.lib.openai.plugin.chains; - -import com.edgechain.lib.openai.plugin.response.PluginResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; - -public class PluginResponseChain extends EdgeChain { - - public PluginResponseChain(Observable observable) { - super(observable); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/parser/PluginJSONParser.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/parser/PluginJSONParser.java deleted file mode 100644 index 20a7c44a6..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/parser/PluginJSONParser.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.edgechain.lib.openai.plugin.parser; - -import java.io.Serializable; - -public class PluginJSONParser implements Serializable { - - private static final long serialVersionUID = -5128420085721258857L; - private String pluginJSON; - private String apiConfigJson; - private String specAPIJson; - - public PluginJSONParser(String pluginJSON, String specAPIJson) { - this.pluginJSON = pluginJSON; - this.specAPIJson = specAPIJson; - } - - public PluginJSONParser(String pluginJSON, String apiConfigJson, String specAPIJson) { - this.pluginJSON = pluginJSON; - this.apiConfigJson = apiConfigJson; - this.specAPIJson = specAPIJson; - } - - public String getPluginJSON() { - return pluginJSON; - } - - public void setPluginJSON(String pluginJSON) { - this.pluginJSON = pluginJSON; - } - - public String getApiConfigJson() { - return apiConfigJson; - } - - public void setApiConfigJson(String apiConfigJson) { - this.apiConfigJson = apiConfigJson; - } - - public String getSpecAPIJson() { - return specAPIJson; - } - - public void setSpecAPIJson(String specAPIJson) { - this.specAPIJson = specAPIJson; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/parser/PluginParser.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/parser/PluginParser.java deleted file mode 100644 index d7d1fbe97..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/parser/PluginParser.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.edgechain.lib.openai.plugin.parser; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class PluginParser { - - private final String action; - private final String observation; - - private PluginParser(String action, String observation) { - this.action = action; - this.observation = observation; - } - - public static String parse(String nameForModel, String openAPISpec) { - return new PluginParser("Action: " + nameForModel, "Observation: " + openAPISpec).toString(); - } - - public static List extractUrls(String response) { - - List urlList = new ArrayList<>(); - - StringTokenizer tokenizer = new StringTokenizer(parseOpenAPIResponse(response), "\n"); - - while (tokenizer.hasMoreTokens()) { - - String token = tokenizer.nextToken(); - - if (token.startsWith("Action Input: ")) { - - String regex = - "\\b((?:https?|ftp|file):" - + "//[-a-zA-Z0-9+&@#/%?=" - + "~_|!:, .;]*[-a-zA-Z0-9+" - + "&@#/%=~_|])"; - - // Compile the Regular Expression - Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); - - Matcher m = p.matcher(token); - while (m.find()) { - urlList.add(token.substring(m.start(0), m.end(0))); - } - } - } - - return urlList; - } - - public static String getFinalAnswer(String response) { - // Initializing Variables; - String finalAnswer = null; - StringTokenizer tokenizer = new StringTokenizer(parseOpenAPIResponse(response), "\n"); - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken(); - if (token.startsWith("Final Answer: ")) { - finalAnswer = token; - break; - } - } - - return finalAnswer; - } - - @Override - public String toString() { - return action + "\n" + observation; - } - - private static String parseOpenAPIResponse(String body) { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode outputJsonNode = null; - try { - outputJsonNode = objectMapper.readTree(body); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - System.out.println("Pretty String: " + outputJsonNode.toPrettyString()); - return outputJsonNode.get("choices").get(0).get("text").asText(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/prompt/CompletionPrompt.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/prompt/CompletionPrompt.java deleted file mode 100644 index ec1640e2e..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/prompt/CompletionPrompt.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.edgechain.lib.openai.plugin.prompt; - -import com.edgechain.lib.openai.plugin.response.PluginResponse; -import com.edgechain.lib.openai.prompt.PromptTemplate; - -public class CompletionPrompt implements PromptTemplate { - - private final PluginResponse pluginResponse; - - public CompletionPrompt(PluginResponse pluginResponse) { - this.pluginResponse = pluginResponse; - } - - @Override - public String getPrompt() { - return "Answer the following questions as best you can. You have access to the following tools:" - + " requests_get, " - + pluginResponse.getPlugin().getName_for_model() - + "\n" - + pluginResponse.getPlugin().getName_for_model() - + ": " - + String.format( - "Call this tool to get the OpenAPI spec (and usage guide) for interacting with the %s" - + " API ", - pluginResponse.getPlugin().getName_for_human()) - + String.format( - "You should only call this ONCE! What is the %s API useful for? ", - pluginResponse.getPlugin().getName_for_human()) - + pluginResponse.getPlugin().getDescription_for_human() - + "\n" - + "requests_get: A portal to the internet. Use this when you need to get specific content" - + " from a website. Input should be a url (i.e. https://www.google.com). The output will" - + " be the text response of the GET request. \n" - + "Use the following format:\n" - + "\n" - + String.format( - "Question: the input question you must answer\n" - + "Thought: you should always think about what to do\n" - + "Action: the action to take, should be one of [requests_get, %s]\n" - + "Action Input: the input to the action\n" - + "Observation: the result of the action\n" - + "... (this Thought/Action/Action Input/Observation can repeat N times)\n" - + "Thought: I now know the final answer\n" - + "Final Answer: the final answer to the original input question\n\n" - + "Begin! And always use the openapi spec for creating the API get requests.\n", - pluginResponse.getPlugin().getName_for_model()); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/response/PluginResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/response/PluginResponse.java deleted file mode 100644 index 9ed8ba436..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/response/PluginResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.edgechain.lib.openai.plugin.response; - -import com.edgechain.lib.openai.plugin.tool.PluginTool; - -import java.util.StringJoiner; - -public class PluginResponse { - - private PluginTool plugin; - private String openApiSpec; - - public PluginResponse() {} - - public PluginResponse(PluginTool plugin, String openApiSpec) { - this.plugin = plugin; - this.openApiSpec = openApiSpec; - } - - public PluginTool getPlugin() { - return plugin; - } - - public String getOpenApiSpec() { - return openApiSpec; - } - - public void setOpenApiSpec(String openApiSpec) { - this.openApiSpec = openApiSpec; - } - - @Override - public String toString() { - return new StringJoiner(", ", PluginResponse.class.getSimpleName() + "[", "]") - .add("plugin=" + plugin) - .add("openApiSpec='" + openApiSpec + "'") - .toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/services/PluginResponseService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/services/PluginResponseService.java deleted file mode 100644 index 3918b8d23..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/services/PluginResponseService.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.edgechain.lib.openai.plugin.services; - -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.openai.plugin.chains.PluginResponseChain; -import com.edgechain.lib.openai.plugin.response.PluginResponse; -import com.edgechain.lib.openai.plugin.tool.PluginTool; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestTemplate; - -public class PluginResponseService { - - private RestTemplate restTemplate = new RestTemplate(); - - private final Endpoint pluginEndpoint; - private final Endpoint pluginSpecEndpoint; - - public PluginResponseService(Endpoint pluginEndpoint, Endpoint pluginSpecEndpoint) { - this.pluginEndpoint = pluginEndpoint; - this.pluginSpecEndpoint = pluginSpecEndpoint; - } - - public PluginResponse getPluginResponse() { - return new PluginResponseChain( - Observable.create( - emitter -> { - try { - Observable obs1 = - this.requestPluginAPI(pluginEndpoint).getScheduledObservable(); - Observable obs2 = - this.requestSpecAPI(pluginSpecEndpoint).getScheduledObservable(); - - PluginResponse response = - new EdgeChain<>(Observable.zip(obs1, obs2, PluginResponse::new)).get(); - - emitter.onNext(response); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })) - .get(); - } - - private EdgeChain requestPluginAPI(Endpoint pluginEndpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(pluginEndpoint.getApiKey()); - - PluginTool response = - this.restTemplate - .exchange( - pluginEndpoint.getUrl(), - HttpMethod.GET, - new HttpEntity<>(headers), - PluginTool.class) - .getBody(); - - emitter.onNext(response); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })); - } - - private EdgeChain requestSpecAPI(Endpoint pluginSpecEndpoint) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBearerAuth(pluginSpecEndpoint.getApiKey()); - - String response = - this.restTemplate - .exchange( - pluginSpecEndpoint.getUrl(), - HttpMethod.GET, - new HttpEntity<>(headers), - String.class) - .getBody(); - - emitter.onNext(response); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/services/PluginService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/services/PluginService.java deleted file mode 100644 index 9b643c3b5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/services/PluginService.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.edgechain.lib.openai.plugin.services; - -import com.edgechain.lib.openai.plugin.parser.PluginParser; -import com.edgechain.lib.openai.plugin.response.PluginResponse; -import com.edgechain.lib.openai.providers.OpenAiCompletionProvider; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestTemplate; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -public class PluginService { - - private RestTemplate restTemplate = new RestTemplate(); - - private static final String DEFAULT_MESSAGE = "Couldn't extract information about: "; - - private final OpenAiCompletionProvider provider; - private final PluginResponse pluginResponse; - private final String initialPrompt; - private final String query; - - public PluginService( - OpenAiCompletionProvider provider, - PluginResponse pluginResponse, - String initialPrompt, - String query) { - this.provider = provider; - this.pluginResponse = pluginResponse; - this.initialPrompt = initialPrompt; - this.query = query; - } - - public EdgeChain request() { - - return new EdgeChain( - Observable.create( - emitter -> { - try { - - StringBuilder prompt = new StringBuilder(); - prompt - .append(initialPrompt) - .append("\n") - .append(query) - .append("\n"); // Updating Prompt - - // Step 4: Send The Request & Now Append the Parse Response to Prompt; - String initialResponse = initializePlugin(provider, pluginResponse, prompt); - prompt.append(initialResponse); - - // Step 8: Fetch JSON Response from URLs extracted via - // ActionInput; - String jsonResponse = sendRequestWithOpenAPISpec(provider, prompt); - prompt.append(jsonResponse); - - if (jsonResponse.isEmpty()) throw new RuntimeException(DEFAULT_MESSAGE + query); - else emitter.onNext(this.sendExtractedJsonResponse(provider, prompt)); - - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - })) - .retry(new FixedDelay(4, 0, TimeUnit.SECONDS)); - } - - private String initializePlugin( - OpenAiCompletionProvider provider, PluginResponse pluginResponse, StringBuilder prompt) { - try { - // Step 2: Create PluginRequest (which act as JSON body for RestTemplate) & Send POST request - // to OPENAPI Completion - provider.request(prompt.toString()).get(); - - // Step 3: Parse The Initial Response Using PluginParser - return PluginParser.parse( - pluginResponse.getPlugin().getName_for_model(), pluginResponse.getOpenApiSpec()); - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - private String sendRequestWithOpenAPISpec( - OpenAiCompletionProvider provider, StringBuilder prompt) { - try { - System.out.println("Logging"); - - // Step 5: Create PluginRequest & Send To CreateCompletion OpenAPI - StringResponse completionResponse = provider.request(prompt.toString()).get(); - - // Step 6: Parse the Response & Fetch Http GET request from ActionInput - List urlList = PluginParser.extractUrls(completionResponse.getResponse()); - - // Step 7: Loop Over URL List & Test if anyone of them works; - String jsonResponse = null; - - System.out.println("URL List: " + urlList.size()); - - Iterator iterator = urlList.iterator(); - while (iterator.hasNext()) { - String str = iterator.next(); - System.out.println("URL: " + str); - jsonResponse = extractJsonBody(str); - if (Objects.nonNull(jsonResponse)) { - break; - } - } - - return Objects.requireNonNullElse(jsonResponse, ""); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - private String sendExtractedJsonResponse( - OpenAiCompletionProvider provider, StringBuilder prompt) { - try { - - StringResponse completionResponse = provider.request(prompt.toString()).get(); - return PluginParser.getFinalAnswer(completionResponse.getResponse()); - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - // Validating if the response is JSON & returning it; - private String extractJsonBody(String url) { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - - // Create HttpEntity with headers and body - HttpEntity entity = new HttpEntity<>(headers); - - try { - String body = this.restTemplate.exchange(url, HttpMethod.GET, entity, String.class).getBody(); - - if (isValidJSON(body)) { - return body; - } - return null; - } catch (final Exception e) { - return null; - } - } - - private boolean isValidJSON(String json) { - - ObjectMapper mapper = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS); - - try { - mapper.readTree(json); - } catch (JacksonException e) { - return false; - } - return true; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/tool/ApiConfig.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/tool/ApiConfig.java deleted file mode 100644 index 1da8715c8..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/tool/ApiConfig.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.edgechain.lib.openai.plugin.tool; - -public class ApiConfig { - - private String type; - private String url; - private Boolean has_user_authentication; - private Boolean is_user_authenticated; - - public ApiConfig() {} - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public Boolean getHas_user_authentication() { - return has_user_authentication; - } - - public void setHas_user_authentication(Boolean has_user_authentication) { - this.has_user_authentication = has_user_authentication; - } - - public Boolean getIs_user_authenticated() { - return is_user_authenticated; - } - - public void setIs_user_authenticated(Boolean is_user_authenticated) { - this.is_user_authenticated = is_user_authenticated; - } - - @Override - public String toString() { - return "ApiConfig{" - + "type='" - + type - + '\'' - + ", url='" - + url - + '\'' - + ", has_user_authentication=" - + has_user_authentication - + ", is_user_authenticated=" - + is_user_authenticated - + '}'; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/tool/PluginTool.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/tool/PluginTool.java deleted file mode 100644 index 05ebe70f0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/plugin/tool/PluginTool.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.edgechain.lib.openai.plugin.tool; - -import java.util.StringJoiner; - -public class PluginTool { - - private String schema_version; - private String name_for_model; - private String name_for_human; - private String description_for_model; - private String description_for_human; - - private ApiConfig api; - private String logo_url; - private String contact_email; - private String legal_info_url; - - public String getSchema_version() { - return schema_version; - } - - public void setSchema_version(String schema_version) { - this.schema_version = schema_version; - } - - public String getName_for_model() { - return name_for_model; - } - - public void setName_for_model(String name_for_model) { - this.name_for_model = name_for_model; - } - - public String getName_for_human() { - return name_for_human; - } - - public void setName_for_human(String name_for_human) { - this.name_for_human = name_for_human; - } - - public String getDescription_for_model() { - return description_for_model; - } - - public void setDescription_for_model(String description_for_model) { - this.description_for_model = description_for_model; - } - - public String getDescription_for_human() { - return description_for_human; - } - - public void setDescription_for_human(String description_for_human) { - this.description_for_human = description_for_human; - } - - public ApiConfig getApi() { - return api; - } - - public void setApi(ApiConfig api) { - this.api = api; - } - - public String getLogo_url() { - return logo_url; - } - - public void setLogo_url(String logo_url) { - this.logo_url = logo_url; - } - - public String getContact_email() { - return contact_email; - } - - public void setContact_email(String contact_email) { - this.contact_email = contact_email; - } - - public String getLegal_info_url() { - return legal_info_url; - } - - public void setLegal_info_url(String legal_info_url) { - this.legal_info_url = legal_info_url; - } - - @Override - public String toString() { - return new StringJoiner(", ", PluginTool.class.getSimpleName() + "[", "]") - .add("schema_version='" + schema_version + "'") - .add("name_for_model='" + name_for_model + "'") - .add("name_for_human='" + name_for_human + "'") - .add("description_for_model='" + description_for_model + "'") - .add("description_for_human='" + description_for_human + "'") - .add("api=" + api) - .add("logo_url='" + logo_url + "'") - .add("contact_email='" + contact_email + "'") - .add("legal_info_url='" + legal_info_url + "'") - .toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/prompt/PromptTemplate.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/prompt/PromptTemplate.java deleted file mode 100644 index 8f04e2daf..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/prompt/PromptTemplate.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.edgechain.lib.openai.prompt; - -public interface PromptTemplate { - - String getPrompt(); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java deleted file mode 100644 index e304a4232..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.edgechain.lib.openai.providers; - -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.openai.request.CompletionRequest; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; - -/** Going to be removed * */ -public class OpenAiCompletionProvider { - private final OpenAiEndpoint endpoint; - - public OpenAiCompletionProvider(OpenAiEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain request(String input) { - - CompletionRequest completionRequest = - CompletionRequest.builder() - .prompt(input) - .model(endpoint.getModel()) - .temperature(endpoint.getTemperature()) - .build(); - - return null; - - // - // return new OpenAiClient(endpoint) - // .createCompletion(completionRequest) - // .transform(s -> new StringResponse(s.getChoices().get(0).getText())); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java deleted file mode 100644 index 952d2e06a..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.edgechain.lib.openai.request; - -import java.util.List; - -public class ChatCompletionRequest { - - private String model; - private Double temperature; - private List messages; - private Boolean stream; - - public ChatCompletionRequest() {} - - public ChatCompletionRequest( - String model, List messages, Double temperature, Boolean stream) { - this.model = model; - this.temperature = temperature; - this.messages = messages; - this.stream = stream; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public List getMessages() { - return messages; - } - - public void setMessages(List messages) { - this.messages = messages; - } - - public Double getTemperature() { - return temperature; - } - - public void setTemperature(Double temperature) { - this.temperature = temperature; - } - - public Boolean getStream() { - return stream; - } - - public void setStream(Boolean stream) { - this.stream = stream; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionRequest{"); - sb.append("model='").append(model).append('\''); - sb.append(", temperature=").append(temperature); - sb.append(", messages=").append(messages); - sb.append(", stream=").append(stream); - sb.append('}'); - return sb.toString(); - } - - public static ChatCompletionRequestBuilder builder() { - return new ChatCompletionRequestBuilder(); - } - - public static class ChatCompletionRequestBuilder { - private String model; - private Double temperature; - private List messages; - - private Boolean stream = Boolean.FALSE; - - public ChatCompletionRequestBuilder model(String model) { - this.model = model; - return this; - } - - public ChatCompletionRequestBuilder temperature(Double temperature) { - this.temperature = temperature; - return this; - } - - public ChatCompletionRequestBuilder messages(List messages) { - this.messages = messages; - return this; - } - - public ChatCompletionRequestBuilder stream(Boolean value) { - this.stream = value; - return this; - } - - public ChatCompletionRequest build() { - return new ChatCompletionRequest(model, messages, temperature, stream); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java deleted file mode 100644 index 6ea6007b6..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.edgechain.lib.openai.request; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONObject; - -public class ChatMessage implements ArkObject { - String role; - String content; - - public ChatMessage(String role, String content) { - this.role = role; - this.content = content; - } - - public ChatMessage() {} - - public String getRole() { - return role; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - @Override - public String toString() { - return "ChatMessage{" + "role='" + role + '\'' + ", content='" + content + '\'' + '}'; - } - - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("role", role); - json.put("content", content); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/CompletionRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/CompletionRequest.java deleted file mode 100644 index b8c177c28..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/CompletionRequest.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.edgechain.lib.openai.request; - -public class CompletionRequest { - - private String prompt; - private String model; - private Double temperature; - private Double top_p; - private Double frequency_penalty; - private Double presence_penalty; - - public CompletionRequest() {} - - public CompletionRequest( - String prompt, - String model, - Double temperature, - Integer max_tokens, - Double top_p, - Double frequency_penalty, - Double presence_penalty) { - this.prompt = prompt; - this.model = model; - this.temperature = temperature; - this.top_p = top_p == null ? 1.0 : top_p; - this.frequency_penalty = frequency_penalty == null ? 0.0 : frequency_penalty; - this.presence_penalty = presence_penalty == null ? 0.0 : presence_penalty; - } - - public String getPrompt() { - return prompt; - } - - public void setPrompt(String prompt) { - this.prompt = prompt; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public Double getTemperature() { - return temperature; - } - - public void setTemperature(Double temperature) { - this.temperature = temperature; - } - - public Double getTop_p() { - return top_p; - } - - public void setTop_p(Double top_p) { - this.top_p = top_p; - } - - public Double getFrequency_penalty() { - return frequency_penalty; - } - - public void setFrequency_penalty(Double frequency_penalty) { - this.frequency_penalty = frequency_penalty; - } - - public Double getPresence_penalty() { - return presence_penalty; - } - - public void setPresence_penalty(Double presence_penalty) { - this.presence_penalty = presence_penalty; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CompletionRequest{"); - sb.append("prompt='").append(prompt).append('\''); - sb.append(", model='").append(model).append('\''); - sb.append(", temperature=").append(temperature); - sb.append(", top_p=").append(top_p); - sb.append(", frequency_penalty=").append(frequency_penalty); - sb.append(", presence_penalty=").append(presence_penalty); - sb.append('}'); - return sb.toString(); - } - - public static CompletionRequestBuilder builder() { - return new CompletionRequestBuilder(); - } - - public static class CompletionRequestBuilder { - private String prompt; - private String model; - private Double temperature; - private Integer max_tokens; - private Double top_p; - private Double frequency_penalty; - private Double presence_penalty; - - public CompletionRequestBuilder prompt(String prompt) { - this.prompt = prompt; - return this; - } - - public CompletionRequestBuilder model(String model) { - this.model = model; - return this; - } - - public CompletionRequestBuilder temperature(Double temperature) { - this.temperature = temperature; - return this; - } - - public CompletionRequestBuilder maxTokens(Integer max_tokens) { - this.max_tokens = max_tokens; - return this; - } - - public CompletionRequestBuilder topP(Double top_p) { - this.top_p = top_p; - return this; - } - - public CompletionRequestBuilder frequencyPenalty(Double frequency_penalty) { - this.frequency_penalty = frequency_penalty; - return this; - } - - public CompletionRequestBuilder presencePenalty(Double presence_penalty) { - this.presence_penalty = presence_penalty; - return this; - } - - public CompletionRequest build() { - return new CompletionRequest( - this.prompt, - this.model, - this.temperature, - this.max_tokens, - this.top_p, - this.frequency_penalty, - this.presence_penalty); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionChoice.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionChoice.java deleted file mode 100644 index 124493a0c..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionChoice.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.edgechain.lib.openai.response; - -import com.edgechain.lib.openai.request.ChatMessage; -import com.edgechain.lib.response.ArkObject; -import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.json.JSONObject; - -public class ChatCompletionChoice implements ArkObject { - - private Integer index; - - @JsonAlias("delta") - private ChatMessage message; - - @JsonProperty("finish_reason") - private String finishReason; - - public Integer getIndex() { - return index; - } - - public void setIndex(Integer index) { - this.index = index; - } - - public ChatMessage getMessage() { - return message; - } - - public void setMessage(ChatMessage message) { - this.message = message; - } - - public String getFinishReason() { - return finishReason; - } - - public void setFinishReason(String finishReason) { - this.finishReason = finishReason; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionChoice{"); - sb.append("index=").append(index); - sb.append(", message=").append(message); - sb.append(", finishReason='").append(finishReason).append('\''); - sb.append('}'); - return sb.toString(); - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("index", index); - json.put("message", message.toJson()); - json.put("finish_reason", finishReason); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java deleted file mode 100644 index d44acfc67..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.edgechain.lib.openai.response; - -import com.edgechain.lib.embeddings.response.Usage; -import com.edgechain.lib.response.ArkObject; -import org.json.JSONObject; - -import java.io.Serializable; -import java.util.List; -import java.util.stream.Collectors; - -public class ChatCompletionResponse implements ArkObject, Serializable { - - private static final long serialVersionUID = 463938151412139368L; - private String id; - - private String object; - private long created; - - private String model; - - private List choices; - - private Usage usage; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - - public long getCreated() { - return created; - } - - public void setCreated(long created) { - this.created = created; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public List getChoices() { - return choices; - } - - public void setChoices(List choices) { - this.choices = choices; - } - - public Usage getUsage() { - return usage; - } - - public void setUsage(Usage usage) { - this.usage = usage; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionResponse{"); - sb.append("id='").append(id).append('\''); - sb.append(", object='").append(object).append('\''); - sb.append(", created=").append(created); - sb.append(", model='").append(model).append('\''); - sb.append(", choices=").append(choices); - sb.append(", usage=").append(usage); - sb.append('}'); - return sb.toString(); - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("id", id); - json.put("object", object); - json.put("created", created); - json.put("model", model); - json.put( - "choices", choices.stream().map(ChatCompletionChoice::toJson).collect(Collectors.toList())); - json.put("usage", usage.toJson()); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/CompletionChoice.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/CompletionChoice.java deleted file mode 100644 index c3961b653..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/CompletionChoice.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.edgechain.lib.openai.response; - -public class CompletionChoice { - - String text; - Integer index; - - LogProbResult logprobs; - - String finish_reason; - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public Integer getIndex() { - return index; - } - - public void setIndex(Integer index) { - this.index = index; - } - - public LogProbResult getLogprobs() { - return logprobs; - } - - public void setLogprobs(LogProbResult logprobs) { - this.logprobs = logprobs; - } - - public String getFinish_reason() { - return finish_reason; - } - - public void setFinish_reason(String finish_reason) { - this.finish_reason = finish_reason; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CompletionChoice{"); - sb.append("text='").append(text).append('\''); - sb.append(", index=").append(index); - sb.append(", logprobs=").append(logprobs); - sb.append(", finish_reason='").append(finish_reason).append('\''); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/CompletionResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/CompletionResponse.java deleted file mode 100644 index 6aa72faed..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/CompletionResponse.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.edgechain.lib.openai.response; - -import com.edgechain.lib.embeddings.response.Usage; - -import java.util.List; - -public class CompletionResponse { - - private String id; - - private String object; - - private long created; - - private String model; - - private List choices; - - private Usage usage; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - - public long getCreated() { - return created; - } - - public void setCreated(long created) { - this.created = created; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public List getChoices() { - return choices; - } - - public void setChoices(List choices) { - this.choices = choices; - } - - public Usage getUsage() { - return usage; - } - - public void setUsage(Usage usage) { - this.usage = usage; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CompletionResponse{"); - sb.append("id='").append(id).append('\''); - sb.append(", object='").append(object).append('\''); - sb.append(", created=").append(created); - sb.append(", model='").append(model).append('\''); - sb.append(", choices=").append(choices); - sb.append(", usage=").append(usage); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/LogProbResult.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/LogProbResult.java deleted file mode 100644 index f857c820d..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/LogProbResult.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.edgechain.lib.openai.response; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; -import java.util.Map; - -public class LogProbResult { - - List tokens; - - @JsonProperty("token_logprobs") - List tokenLogprobs; - - @JsonProperty("top_logprobs") - List> topLogprobs; - - List textOffset; - - public List getTokens() { - return tokens; - } - - public void setTokens(List tokens) { - this.tokens = tokens; - } - - public List getTokenLogprobs() { - return tokenLogprobs; - } - - public void setTokenLogprobs(List tokenLogprobs) { - this.tokenLogprobs = tokenLogprobs; - } - - public List> getTopLogprobs() { - return topLogprobs; - } - - public void setTopLogprobs(List> topLogprobs) { - this.topLogprobs = topLogprobs; - } - - public List getTextOffset() { - return textOffset; - } - - public void setTextOffset(List textOffset) { - this.textOffset = textOffset; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/Reader.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/Reader.java deleted file mode 100644 index fa5be7ad5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/Reader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.edgechain.lib.reader; - -import com.edgechain.lib.chunk.enums.LangType; - -import java.io.InputStream; -import java.io.Serializable; - -public abstract class Reader implements Serializable { - - private static final long serialVersionUID = 5990895695593800211L; - - public Reader() {} - - public abstract String[] readByChunkSize(InputStream inputStream, int chunkSize); - - public abstract String[] readBySentence(LangType langType, InputStream fileInputStream); - - public abstract String[] readBySentence( - InputStream modelInputStream, InputStream fileInputStream); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/impl/PdfReader.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/impl/PdfReader.java deleted file mode 100644 index 216e5d55f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/impl/PdfReader.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.edgechain.lib.reader.impl; - -import com.edgechain.lib.chunk.Chunker; -import com.edgechain.lib.chunk.enums.LangType; -import com.edgechain.lib.reader.Reader; -import me.xuender.unidecode.Unidecode; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.parser.ParseContext; -import org.apache.tika.parser.pdf.PDFParser; -import org.apache.tika.sax.BodyContentHandler; -import org.springframework.stereotype.Service; - -import java.io.InputStream; - -@Service -public class PdfReader extends Reader { - - @Override - public String[] readByChunkSize(InputStream inputStream, int chunkSize) { - try { - BodyContentHandler contentHandler = new BodyContentHandler(-1); - Metadata data = new Metadata(); - ParseContext context = new ParseContext(); - PDFParser pdfparser = new PDFParser(); - pdfparser.parse(inputStream, contentHandler, data, context); - - Chunker chunker = - new Chunker(Unidecode.decode(contentHandler.toString()).replaceAll("[\t\n\r]+", " ")); - return chunker.byChunkSize(chunkSize); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - @Override - public String[] readBySentence(LangType langType, InputStream fileInputStream) { - try { - BodyContentHandler contentHandler = new BodyContentHandler(-1); - Metadata data = new Metadata(); - ParseContext context = new ParseContext(); - PDFParser pdfparser = new PDFParser(); - pdfparser.parse(fileInputStream, contentHandler, data, context); - - Chunker chunker = - new Chunker(Unidecode.decode(contentHandler.toString()).replaceAll("[\t\n\r]+", " ")); - return chunker.bySentence(langType); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - @Override - public String[] readBySentence(InputStream modelInputStream, InputStream fileInputStream) { - try { - BodyContentHandler contentHandler = new BodyContentHandler(-1); - Metadata data = new Metadata(); - ParseContext context = new ParseContext(); - PDFParser pdfparser = new PDFParser(); - pdfparser.parse(fileInputStream, contentHandler, data, context); - - Chunker chunker = - new Chunker(Unidecode.decode(contentHandler.toString()).replaceAll("[\t\n\r]+", " ")); - return chunker.bySentence(modelInputStream); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/impl/TextReader.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/impl/TextReader.java deleted file mode 100644 index 89e3a2f0f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/reader/impl/TextReader.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.edgechain.lib.reader.impl; - -import com.edgechain.lib.chunk.Chunker; -import com.edgechain.lib.chunk.enums.LangType; -import com.edgechain.lib.reader.Reader; -import me.xuender.unidecode.Unidecode; -import org.apache.tika.exception.TikaException; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.parser.ParseContext; -import org.apache.tika.parser.pdf.PDFParser; -import org.apache.tika.parser.txt.TXTParser; -import org.apache.tika.sax.BodyContentHandler; -import org.springframework.stereotype.Service; -import org.xml.sax.SAXException; - -import java.io.IOException; -import java.io.InputStream; - -@Service -public class TextReader extends Reader { - - @Override - public String[] readByChunkSize(InputStream inputStream, int chunkSize) { - - BodyContentHandler contentHandler = new BodyContentHandler(); - Metadata metadata = new Metadata(); - ParseContext parseContext = new ParseContext(); - TXTParser txtParser = new TXTParser(); - - try { - txtParser.parse(inputStream, contentHandler, metadata, parseContext); - Chunker chunker = - new Chunker(Unidecode.decode(contentHandler.toString()).replaceAll("[\t\n\r]+", " ")); - return chunker.byChunkSize(chunkSize); - - } catch (IOException | SAXException | TikaException e) { - throw new RuntimeException(e); - } - } - - @Override - public String[] readBySentence(LangType langType, InputStream fileInputStream) { - try { - BodyContentHandler contentHandler = new BodyContentHandler(-1); - Metadata data = new Metadata(); - ParseContext context = new ParseContext(); - PDFParser pdfparser = new PDFParser(); - pdfparser.parse(fileInputStream, contentHandler, data, context); - - Chunker chunker = - new Chunker(Unidecode.decode(contentHandler.toString()).replaceAll("[\t\n\r]+", " ")); - return chunker.bySentence(langType); - - } catch (final Exception e) { - throw new RuntimeException(e.getMessage()); - } - } - - @Override - public String[] readBySentence(InputStream modelInputStream, InputStream fileInputStream) { - BodyContentHandler contentHandler = new BodyContentHandler(); - Metadata metadata = new Metadata(); - ParseContext parseContext = new ParseContext(); - TXTParser txtParser = new TXTParser(); - - try { - txtParser.parse(fileInputStream, contentHandler, metadata, parseContext); - Chunker chunker = - new Chunker(Unidecode.decode(contentHandler.toString()).replaceAll("[\t\n\r]+", " ")); - return chunker.bySentence(modelInputStream); - - } catch (IOException | SAXException | TikaException e) { - throw new RuntimeException(e); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java deleted file mode 100644 index dd047758f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.edgechain.lib.request; - -import com.edgechain.lib.request.exception.InvalidArkRequest; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.*; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import java.io.IOException; -import java.security.Principal; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Objects; -import java.util.stream.Collectors; - -public class ArkRequest { - - private final HttpServletRequest request; - - private static final Logger logger = LoggerFactory.getLogger(ArkRequest.class); - - public ArkRequest() { - this.request = - ((ServletRequestAttributes) - Objects.requireNonNull(RequestContextHolder.getRequestAttributes())) - .getRequest(); - - String contentType = request.getContentType(); - - if (Objects.isNull(contentType)) { - logger.error( - "ArkRequest can only accept Content-Type:application/json ||" - + " Content-Type:multipart/form-data - You haven't specified Content-Type"); - - throw new InvalidArkRequest( - "ArkRequest can only accept Content-Type:application/json ||" - + " Content-Type:multipart/form-data - You haven't specified Content-Type"); - } else if (!contentType.contains("application/json") - && !contentType.contains("multipart/form-data")) { - logger.error( - "ArkRequest can only accept Content-Type:application/json ||" - + " Content-Type:multipart/form-data"); - - throw new InvalidArkRequest( - "ArkRequest can only accept Content-Type:application/json ||" - + " Content-Type:multipart/form-data"); - } - } - - public String getContentType() { - return this.request.getContentType(); - } - - public String getHeader(String key) { - return this.request.getHeader(key); - } - - public Enumeration getHeaders(String key) { - return this.request.getHeaders(key); - } - - public Enumeration getHeaderNames() { - return this.request.getHeaderNames(); - } - - public long getDateHeader(String key) { - return this.request.getDateHeader(key); - } - - public int getIntHeader(String key) { - return this.request.getIntHeader(key); - } - - public boolean getBooleanHeader(String key) { - return Boolean.parseBoolean(this.getHeader(key)); - } - - public String getContextPath() { - return this.request.getContextPath(); - } - - public String getRequestURI() { - return this.request.getRequestURI(); - } - - public String getQueryString() { - return this.request.getQueryString(); - } - - public String getQueryParam(String key) { - return this.request.getParameter(key); - } - - public int getIntQueryParam(String key) { - return Integer.parseInt(this.request.getParameter(key)); - } - - public JSONObject getBody() { - try { - return new JSONObject(this.request.getReader().lines().collect(Collectors.joining())); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public Cookie[] getCookies() { - return this.request.getCookies(); - } - - public Part getMultiPart(String name) { - try { - return this.request.getPart(name); - } catch (IOException | ServletException e) { - throw new RuntimeException(e); - } - } - - public Collection getMultiParts() { - try { - return this.request.getParts(); - } catch (IOException | ServletException e) { - throw new RuntimeException(e); - } - } - - public Principal getPrincipal() { - return this.request.getUserPrincipal(); - } - - public String getMethodName() { - return this.request.getMethod(); - } - - public HttpServletRequest getRequest() { - return request; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/PluginAPIRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/PluginAPIRequest.java deleted file mode 100644 index 76ab53a78..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/PluginAPIRequest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.edgechain.lib.request; - -import com.edgechain.lib.endpoint.Endpoint; - -public class PluginAPIRequest { - - private Endpoint endpoint; - private Endpoint pluginEndpoint; - private Endpoint specEndpoint; - private String input; - - public PluginAPIRequest() {} - - public PluginAPIRequest( - Endpoint endpoint, Endpoint pluginEndpoint, Endpoint specEndpoint, String input) { - this.endpoint = endpoint; - this.pluginEndpoint = pluginEndpoint; - this.specEndpoint = specEndpoint; - this.input = input; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - public Endpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(Endpoint endpoint) { - this.endpoint = endpoint; - } - - public Endpoint getPluginEndpoint() { - return pluginEndpoint; - } - - public void setPluginEndpoint(Endpoint pluginEndpoint) { - this.pluginEndpoint = pluginEndpoint; - } - - public Endpoint getSpecEndpoint() { - return specEndpoint; - } - - public void setSpecEndpoint(Endpoint specEndpoint) { - this.specEndpoint = specEndpoint; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/PluginJSONRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/PluginJSONRequest.java deleted file mode 100644 index 415d2e875..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/PluginJSONRequest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.edgechain.lib.request; - -import com.edgechain.lib.endpoint.Endpoint; - -public class PluginJSONRequest { - - private Endpoint endpoint; - private String input; - - private String pluginJSON; - private String apiConfigJSON; - private String specAPIJSON; - - public PluginJSONRequest() {} - - public Endpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(Endpoint endpoint) { - this.endpoint = endpoint; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - public String getPluginJSON() { - return pluginJSON; - } - - public void setPluginJSON(String pluginJSON) { - this.pluginJSON = pluginJSON; - } - - public String getApiConfigJSON() { - return apiConfigJSON; - } - - public void setApiConfigJSON(String apiConfigJSON) { - this.apiConfigJSON = apiConfigJSON; - } - - public String getSpecAPIJSON() { - return specAPIJSON; - } - - public void setSpecAPIJSON(String specAPIJSON) { - this.specAPIJSON = specAPIJSON; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/exception/InvalidArkRequest.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/exception/InvalidArkRequest.java deleted file mode 100644 index db217d869..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/exception/InvalidArkRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.request.exception; - -public class InvalidArkRequest extends RuntimeException { - - public InvalidArkRequest(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java deleted file mode 100644 index 97a26403e..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.edgechain.lib.response; - -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -public class ArkEmitter extends SseEmitter implements ArkResponse { - private final ArkEmitterObserver observer; - - public ArkEmitter(EdgeChain edgeChain) { - this(edgeChain.getScheduledObservable()); - } - - public ArkEmitter(Observable observable) { - this.observer = new ArkEmitterObserver(observable, this); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java deleted file mode 100644 index fc0f2fbd8..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.edgechain.lib.response; - -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.observers.DisposableObserver; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; - -import java.io.IOException; - -class ArkEmitterObserver extends DisposableObserver implements Runnable { - - private final ResponseBodyEmitter responseBodyEmitter; - - private boolean completed; - - public ArkEmitterObserver(Observable observable, ResponseBodyEmitter responseBodyEmitter) { - this.responseBodyEmitter = responseBodyEmitter; - this.responseBodyEmitter.onTimeout(this); - this.responseBodyEmitter.onCompletion(this); - observable.subscribe(this); - } - - @Override - public void onNext(@NonNull T value) { - - try { - if (!completed) { - responseBodyEmitter.send(value); - } - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } - } - - @Override - public void onError(@NonNull Throwable e) { - responseBodyEmitter.completeWithError(e); - } - - @Override - public void onComplete() { - if (!completed) { - completed = true; - responseBodyEmitter.complete(); - } - } - - @Override - public void run() { - this.dispose(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObject.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObject.java deleted file mode 100644 index 2e829b890..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObject.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.response; - -import org.json.JSONObject; - -public interface ArkObject { - - JSONObject toJson(); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java deleted file mode 100644 index 88c816f56..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.edgechain.lib.response; - -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Observable; -import org.springframework.web.context.request.async.DeferredResult; - -public class ArkObservable extends DeferredResult implements ArkResponse { - - private final ArkObserver observer; - - public ArkObservable(EdgeChain edgeChain) { - observer = new ArkObserver<>(edgeChain.getScheduledObservable(), this); - } - - public ArkObservable(Observable observable) { - observer = new ArkObserver<>(observable, this); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObserver.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObserver.java deleted file mode 100644 index a8a066efb..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObserver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.edgechain.lib.response; - -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.observers.DisposableObserver; -import org.springframework.web.context.request.async.DeferredResult; - -public class ArkObserver extends DisposableObserver implements Runnable { - - private final DeferredResult deferredResult; - - public ArkObserver(Observable observable, DeferredResult deferredResult) { - this.deferredResult = deferredResult; - this.deferredResult.onTimeout(this); - this.deferredResult.onCompletion(this); - observable.subscribe(this); - } - - @Override - public void onNext(@NonNull T value) { - deferredResult.setResult(value); - } - - @Override - public void onError(@NonNull Throwable e) { - deferredResult.setErrorResult(e); - } - - @Override - public void onComplete() {} - - @Override - public void run() { - this.dispose(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkResponse.java deleted file mode 100644 index e0d6806ef..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkResponse.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.edgechain.lib.response; - -public interface ArkResponse {} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/StringResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/StringResponse.java deleted file mode 100644 index fb69660f9..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/StringResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.edgechain.lib.response; - -import java.io.Serializable; - -public class StringResponse implements Serializable { - - private static final long serialVersionUID = 9123288168138857565L; - private String response; - - public StringResponse() {} - - public StringResponse(String response) { - this.response = response; - } - - public String getResponse() { - return response; - } - - public void setResponse(String response) { - this.response = response; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java deleted file mode 100644 index 3f8302378..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.embeddings.bgeSmall.response.BgeSmallResponse; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.POST; - -public interface BgeSmallService { - @POST(value = "bgeSmall") - Single embeddings(@Body BgeSmallEndpoint bgeSmallEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java deleted file mode 100644 index a0cfaff77..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.embeddings.miniLLM.response.MiniLMResponse; - -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.POST; - -public interface MiniLMService { - - @POST(value = "miniLM") - Single embeddings(@Body MiniLMEndpoint miniLMEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java deleted file mode 100644 index c1bd2e116..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.embeddings.response.OpenAiEmbeddingResponse; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.POST; - -public interface OpenAiService { - - @POST(value = "openai/chat-completion") - Single chatCompletion(@Body OpenAiEndpoint openAiEndpoint); - - @POST(value = "openai/completion") - Single completion(@Body OpenAiEndpoint openAiEndpoint); - - @POST(value = "openai/embeddings") - Single embeddings(@Body OpenAiEndpoint openAiEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java deleted file mode 100644 index 9d5282377..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; -import com.edgechain.lib.response.StringResponse; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.HTTP; -import retrofit2.http.POST; - -import java.util.List; - -public interface PineconeService { - - @POST(value = "index/pinecone/upsert") - Single upsert(@Body PineconeEndpoint pineconeEndpoint); - - @POST(value = "index/pinecone/query") - Single> query(@Body PineconeEndpoint pineconeEndpoint); - - @HTTP(method = "DELETE", path = "index/pinecone/deleteAll", hasBody = true) - Single deleteAll(@Body PineconeEndpoint pineconeEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java deleted file mode 100644 index b1b8325d9..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.context.domain.ContextPutRequest; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.*; - -public interface PostgreSQLContextService { - - @POST(value = "context/postgresql/create") - Single create( - @Query("id") String id, @Body PostgreSQLHistoryContextEndpoint endpoint); - - @POST(value = "context/postgresql/update") - Single put(@Body ContextPutRequest request); - - @POST(value = "context/postgresql/{id}") - Single get( - @Path("id") String id, @Body PostgreSQLHistoryContextEndpoint endpoint); - - @HTTP(method = "DELETE", path = "context/postgresql/{id}", hasBody = true) - Completable delete(@Path("id") String id, @Body PostgreSQLHistoryContextEndpoint endpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java deleted file mode 100644 index bdbd229b7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.response.StringResponse; -import io.reactivex.rxjava3.core.Single; -import java.util.List; - -import retrofit2.http.Body; -import retrofit2.http.HTTP; -import retrofit2.http.POST; - -public interface PostgresService { - - @POST(value = "index/postgres/upsert") - Single upsert(@Body PostgresEndpoint postgresEndpoint); - - // - @POST(value = "index/postgres/query") - Single> query(@Body PostgresEndpoint postgresEndpoint); - - @POST("index/postgres/probes") - Single probes(@Body PostgresEndpoint postgresEndpoint); - - @HTTP(method = "DELETE", path = "index/postgres/deleteAll", hasBody = true) - Single deleteAll(@Body PostgresEndpoint postgresEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java deleted file mode 100644 index bc327e916..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.context.domain.ContextPutRequest; -import com.edgechain.lib.context.domain.HistoryContext; - -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.*; - -public interface RedisContextService { - - @POST(value = "context/redis/create") - Single create(@Query("id") String id, @Body RedisHistoryContextEndpoint endpoint); - - @POST(value = "context/redis/update") - Single put(@Body ContextPutRequest request); - - @POST(value = "context/redis/{id}") - Single get(@Path("id") String id, @Body RedisHistoryContextEndpoint endpoint); - - @HTTP(method = "DELETE", path = "context/redis/{id}", hasBody = true) - Completable delete(@Path("id") String id, @Body RedisHistoryContextEndpoint endpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java deleted file mode 100644 index 513fb5dc5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; -import com.edgechain.lib.response.StringResponse; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.HTTP; -import retrofit2.http.POST; -import retrofit2.http.Query; - -import java.util.List; - -public interface RedisService { - - @POST(value = "index/redis/upsert") - Single upsert(@Body RedisEndpoint redisEndpoint); - - @POST(value = "index/redis/query") - Single> query(@Body RedisEndpoint redisEndpoint); - - @HTTP(method = "DELETE", path = "index/redis/delete", hasBody = true) - Completable deleteByPattern(@Query("pattern") String pattern, @Body RedisEndpoint redisEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/SupabaseService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/SupabaseService.java deleted file mode 100644 index 06ae72e75..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/SupabaseService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.POST; - -import java.util.HashMap; - -public interface SupabaseService { - - @POST(value = "supabase/signup") - Single signup(@Body Credential credential); - - @POST(value = "supabase/login") - Single login(@Body Credential credential); - - @POST(value = "supabase/refreshToken") - Single refreshToken(@Body HashMap mapper); - - @POST(value = "supabase/signout") - Completable signOut(@Body HashMap mapper); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java deleted file mode 100644 index d5b2d33bf..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.edgechain.lib.retrofit; - -import com.edgechain.lib.endpoint.impl.WikiEndpoint; -import com.edgechain.lib.wiki.response.WikiResponse; -import io.reactivex.rxjava3.core.Single; -import retrofit2.http.Body; -import retrofit2.http.POST; - -public interface WikiService { - - @POST(value = "wiki/page-content") - Single getPageContent(@Body WikiEndpoint wikiEndpoint); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java deleted file mode 100644 index 4bdab038e..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.edgechain.lib.retrofit.client; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.configuration.domain.SecurityUUID; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.utils.JsonUtils; -import io.reactivex.rxjava3.core.Observable; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.adapter.rxjava.RxJava3Adapter; - -@Service -public class OpenAiStreamService { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - @Autowired private SecurityUUID securityUUID; - - public Observable chatCompletion(OpenAiEndpoint openAiEndpoint) { - - logger.info("Logging Chat Completion Stream...."); - logger.info("Prompt: " + StringUtils.join(openAiEndpoint.getChatMessages())); - - return RxJava3Adapter.fluxToObservable( - WebClient.builder() - .build() - .post() - .uri( - "http://0.0.0.0" - + ":" - + System.getProperty("server.port") - + WebConfiguration.CONTEXT_PATH - + "/openai/chat-completion-stream") - .headers( - httpHeaders -> { - httpHeaders.setContentType(MediaType.APPLICATION_JSON); - httpHeaders.set("stream", "true"); - httpHeaders.set("Authorization", securityUUID.getAuthKey()); - }) - .bodyValue(JsonUtils.convertToString(openAiEndpoint)) - .retrieve() - .bodyToFlux(ChatCompletionResponse.class)); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java deleted file mode 100644 index f2b7c6b4b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.edgechain.lib.retrofit.client; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.configuration.context.ApplicationContextHolder; -import com.edgechain.lib.configuration.domain.SecurityUUID; -import com.edgechain.lib.retrofit.utils.PageJacksonModule; -import com.edgechain.lib.retrofit.utils.SortJacksonModule; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.ResponseBody; -import retrofit2.Retrofit; -import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; -import retrofit2.converter.jackson.JacksonConverterFactory; - -import java.lang.reflect.Type; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -public class RetrofitClientInstance { - - private static final String BASE_URL = "http://0.0.0.0"; - - private static SecurityUUID securityUUID = - ApplicationContextHolder.getContext().getBean(SecurityUUID.class); - - private static Retrofit retrofit; - - public static Retrofit getInstance() { - if (retrofit == null) { - - return retrofit = - new Retrofit.Builder() - .baseUrl( - BASE_URL - + ":" - + System.getProperty("server.port") - + WebConfiguration.CONTEXT_PATH - + "/") - .addConverterFactory(JacksonBuilder()) - .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) - .client( - new OkHttpClient.Builder() - .addInterceptor( - chain -> { - Request original = chain.request(); - Request request = - original - .newBuilder() - .header("Authorization", securityUUID.getAuthKey()) - .build(); - Response response = chain.proceed(request); - String body = response.body().string(); - - String errorMessage = ""; - - if (!response.isSuccessful()) { - // Create a new Gson object - Gson gson = new Gson(); - - // Define the type for the map - Type type = new TypeToken>() {}.getType(); - - // Convert JSON string into a map - Map map = gson.fromJson(body, type); - - if (Objects.nonNull(map)) { - errorMessage = map.toString(); - } - } - - return response - .newBuilder() - .body(ResponseBody.create(body, response.body().contentType())) - .message(errorMessage) - .build(); - }) - .connectTimeout(15, TimeUnit.MINUTES) - .readTimeout(20, TimeUnit.MINUTES) - .build()) - .build(); - } - return retrofit; - } - - private static JacksonConverterFactory JacksonBuilder() { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.registerModule(new ParameterNamesModule()); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new PageJacksonModule()); - objectMapper.registerModule(new SortJacksonModule()); - - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - return JacksonConverterFactory.create(objectMapper); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/ChatCompletionLoggerService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/ChatCompletionLoggerService.java deleted file mode 100644 index 9eb4356bf..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/ChatCompletionLoggerService.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.edgechain.lib.retrofit.logger; - -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import io.reactivex.rxjava3.core.Single; -import org.springframework.data.domain.Page; -import retrofit2.http.Body; -import retrofit2.http.GET; -import retrofit2.http.POST; -import retrofit2.http.Path; - -import java.util.HashMap; - -public interface ChatCompletionLoggerService { - - @GET(value = "logs/chat-completion/findAll/{page}/{size}") - Single> findAll(@Path("page") int page, @Path("size") int size); - - @GET(value = "logs/chat-completion/findAll/sorted/{page}/{size}") - Single> findAllOrderByCompletedAtDesc( - @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByName/{page}/{size}") - Single> findAllByName( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByName/sorted/{page}/{size}") - Single> findAllByNameOrderByCompletedAtDesc( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByModel/{page}/{size}") - Single> findAllByModel( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByModel/sorted/{page}/{size}") - Single> findAllByModelOrderByCompletedAtDesc( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByIdentifier/{page}/{size}") - Single> findAllByCallIdentifier( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByIdentifier/sorted/{page}/{size}") - Single> findAllByCallIdentifierOrderByCompletedAtDesc( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByLatencyLessThanEq/{page}/{size}") - Single> findAllByLatencyLessThanEqual( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/chat-completion/findByLatencyGtrThanEq/{page}/{size}") - Single> findAllByLatencyGreaterThanEqual( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/EmbeddingLoggerService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/EmbeddingLoggerService.java deleted file mode 100644 index 0b552ed91..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/EmbeddingLoggerService.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.edgechain.lib.retrofit.logger; - -import com.edgechain.lib.logger.entities.EmbeddingLog; -import io.reactivex.rxjava3.core.Single; -import org.springframework.data.domain.Page; -import retrofit2.http.Body; -import retrofit2.http.GET; -import retrofit2.http.POST; -import retrofit2.http.Path; - -import java.util.HashMap; - -public interface EmbeddingLoggerService { - - @GET(value = "logs/embeddings/findAll/{page}/{size}") - Single> findAll(@Path("page") int page, @Path("size") int size); - - @GET(value = "logs/embeddings/findAll/sorted/{page}/{size}") - Single> findAllOrderByCompletedAtDesc( - @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/embeddings/findByModel/{page}/{size}") - Single> findAllByModel( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/embeddings/findByModel/sorted/{page}/{size}") - Single> findAllByModelOrderByCompletedAtDesc( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/embeddings/findByIdentifier/{page}/{size}") - Single> findAllByCallIdentifier( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/embeddings/findByIdentifier/sorted/{page}/{size}") - Single> findAllByCallIdentifierOrderByCompletedAtDesc( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/embeddings/findByLatencyLessThanEq/{page}/{size}") - Single> findAllByLatencyLessThanEqual( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); - - @POST(value = "logs/embeddings/findByLatencyGtrThanEq/{page}/{size}") - Single> findAllByLatencyGreaterThanEqual( - @Body HashMap mapper, @Path("page") int page, @Path("size") int size); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/PageJacksonModule.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/PageJacksonModule.java deleted file mode 100644 index b0e1232fd..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/PageJacksonModule.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.edgechain.lib.retrofit.utils; - -import java.util.Iterator; -import java.util.List; -import java.util.function.Function; - -import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; - -/** - * This Jackson module provides support to deserialize Spring {@link Page} objects. - * - * @author Pascal Büttiker - * @author Olga Maciaszek-Sharma - * @author Pedro Mendes - * @author Nikita Konev - */ -public class PageJacksonModule extends Module { - - @Override - public String getModuleName() { - return "PageJacksonModule"; - } - - @Override - public Version version() { - return new Version(0, 1, 0, "", null, null); - } - - @Override - public void setupModule(SetupContext context) { - context.setMixInAnnotations(Page.class, PageMixIn.class); - } - - @JsonDeserialize(as = SimplePageImpl.class) - @JsonIgnoreProperties(ignoreUnknown = true) - private interface PageMixIn {} - - static class SimplePageImpl implements Page { - - private final Page delegate; - - SimplePageImpl( - @JsonProperty("content") List content, - @JsonProperty("number") int number, - @JsonProperty("size") int size, - @JsonProperty("totalElements") - @JsonAlias({"total-elements", "total_elements", "totalelements", "TotalElements"}) - long totalElements, - @JsonProperty("sort") Sort sort) { - if (size > 0) { - PageRequest pageRequest; - if (sort != null) { - pageRequest = PageRequest.of(number, size, sort); - } else { - pageRequest = PageRequest.of(number, size); - } - delegate = new PageImpl<>(content, pageRequest, totalElements); - } else { - delegate = new PageImpl<>(content); - } - } - - @JsonProperty - @Override - public int getTotalPages() { - return delegate.getTotalPages(); - } - - @JsonProperty - @Override - public long getTotalElements() { - return delegate.getTotalElements(); - } - - @JsonProperty - @Override - public int getNumber() { - return delegate.getNumber(); - } - - @JsonProperty - @Override - public int getSize() { - return delegate.getSize(); - } - - @JsonProperty - @Override - public int getNumberOfElements() { - return delegate.getNumberOfElements(); - } - - @JsonProperty - @Override - public List getContent() { - return delegate.getContent(); - } - - @JsonProperty - @Override - public boolean hasContent() { - return delegate.hasContent(); - } - - @JsonIgnore - @Override - public Sort getSort() { - return delegate.getSort(); - } - - @JsonProperty - @Override - public boolean isFirst() { - return delegate.isFirst(); - } - - @JsonProperty - @Override - public boolean isLast() { - return delegate.isLast(); - } - - @JsonIgnore - @Override - public boolean hasNext() { - return delegate.hasNext(); - } - - @JsonIgnore - @Override - public boolean hasPrevious() { - return delegate.hasPrevious(); - } - - @JsonIgnore - @Override - public Pageable nextPageable() { - return delegate.nextPageable(); - } - - @JsonIgnore - @Override - public Pageable previousPageable() { - return delegate.previousPageable(); - } - - @JsonIgnore - @Override - public Page map(Function converter) { - return delegate.map(converter); - } - - @JsonIgnore - @Override - public Iterator iterator() { - return delegate.iterator(); - } - - @JsonIgnore - @Override - public Pageable getPageable() { - return delegate.getPageable(); - } - - @JsonIgnore - @Override - public boolean isEmpty() { - return delegate.isEmpty(); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return delegate.equals(obj); - } - - @Override - public String toString() { - return delegate.toString(); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/SortJacksonModule.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/SortJacksonModule.java deleted file mode 100644 index 9c3897d80..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/SortJacksonModule.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.edgechain.lib.retrofit.utils; - -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.module.SimpleDeserializers; -import com.fasterxml.jackson.databind.module.SimpleSerializers; - -import org.springframework.data.domain.Sort; - -/** - * This Jackson module provides support for serializing and deserializing for Spring {@link Sort} - * object. - * - * @author Can Bezmen - */ -public class SortJacksonModule extends Module { - - @Override - public String getModuleName() { - return "SortModule"; - } - - @Override - public Version version() { - return new Version(0, 1, 0, "", null, null); - } - - @Override - public void setupModule(SetupContext context) { - SimpleSerializers serializers = new SimpleSerializers(); - serializers.addSerializer(Sort.class, new SortJsonComponent.SortSerializer()); - context.addSerializers(serializers); - - SimpleDeserializers deserializers = new SimpleDeserializers(); - deserializers.addDeserializer(Sort.class, new SortJsonComponent.SortDeserializer()); - context.addDeserializers(deserializers); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/SortJsonComponent.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/SortJsonComponent.java deleted file mode 100644 index 0951ac8d8..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/utils/SortJsonComponent.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.edgechain.lib.retrofit.utils; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.node.ArrayNode; - -import org.springframework.data.domain.Sort; - -/** - * This class provides provides support for serializing and deserializing for Spring {@link Sort} - * object. - * - * @author Can Bezmen - */ -public class SortJsonComponent { - - public static class SortSerializer extends JsonSerializer { - - @Override - public void serialize(Sort value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { - gen.writeStartArray(); - value - .iterator() - .forEachRemaining( - v -> { - try { - gen.writeObject(v); - } catch (IOException e) { - throw new RuntimeException("Couldn't serialize object " + v); - } - }); - gen.writeEndArray(); - } - - @Override - public Class handledType() { - return Sort.class; - } - } - - public static class SortDeserializer extends JsonDeserializer { - - @Override - public Sort deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException { - TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser); - if (treeNode.isArray()) { - ArrayNode arrayNode = (ArrayNode) treeNode; - List orders = new ArrayList<>(); - for (JsonNode jsonNode : arrayNode) { - Sort.Order order = - new Sort.Order( - Sort.Direction.valueOf(jsonNode.get("direction").textValue()), - jsonNode.get("property").textValue()); - orders.add(order); - } - return Sort.by(orders); - } - return null; - } - - @Override - public Class handledType() { - return Sort.class; - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/RetryPolicy.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/RetryPolicy.java deleted file mode 100644 index 4e7771fb7..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/RetryPolicy.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.edgechain.lib.rxjava.retry; - -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.functions.Function; - -import java.io.Serializable; - -@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) -public abstract class RetryPolicy - implements Function, Observable>, Serializable { - - public RetryPolicy() {} - - private static final long serialVersionUID = -3531903621076848363L; -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/impl/ExponentialDelay.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/impl/ExponentialDelay.java deleted file mode 100644 index 434add387..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/impl/ExponentialDelay.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.edgechain.lib.rxjava.retry.impl; - -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.functions.Function; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.TimeUnit; - -public class ExponentialDelay extends RetryPolicy { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private long firstDelay; - private int maxRetries; - private int factor; - private TimeUnit unit = TimeUnit.SECONDS; - private int retryCount; - - public ExponentialDelay() {} - - public ExponentialDelay(long firstDelay, int maxRetries, int factor, TimeUnit unit) { - this.firstDelay = firstDelay; - this.maxRetries = maxRetries; - this.factor = factor; - this.unit = unit; - this.retryCount = 0; - } - - @Override - public Observable apply(Observable observable) throws Throwable { - return observable.flatMap( - (Function>) - throwable -> { - if (throwable.getMessage().contains("The mapper function returned a null value") - || throwable - .getMessage() - .contains( - "JSON decoding error: Cannot deserialize value of type" - + " `com.edgechain.lib.openai.response.ChatCompletionResponse` from" - + " Array value (token `JsonToken.START_ARRAY`)")) - return Observable.empty(); - - long compute = compute(firstDelay, retryCount, factor, unit); - - if (++retryCount < maxRetries) { - logger.info( - String.format( - "Retrying: Attempt: %s, Max Retries: %s ~ %s", - retryCount, maxRetries, throwable.getMessage())); - return Observable.timer(compute, TimeUnit.MILLISECONDS); - } - - logger.error( - String.format( - "Error Occurred: Attempt: %s, Max Retries: %s ~ %s", - retryCount, maxRetries, throwable.getMessage())); - return Observable.error(throwable); - }); - } - - private long compute( - final long firstDelay, final int retryCount, final double factor, TimeUnit unit) { - return Math.round(Math.pow(factor, retryCount) * unit.toMillis(firstDelay)); - } - - public long getFirstDelay() { - return firstDelay; - } - - public int getMaxRetries() { - return maxRetries; - } - - public int getFactor() { - return factor; - } - - public TimeUnit getUnit() { - return unit; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ExponentialDelay{"); - sb.append("firstDelay=").append(firstDelay); - sb.append(", maxRetries=").append(maxRetries); - sb.append(", factor=").append(factor); - sb.append(", unit=").append(unit); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/impl/FixedDelay.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/impl/FixedDelay.java deleted file mode 100644 index 3c3f0ca5b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/retry/impl/FixedDelay.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.edgechain.lib.rxjava.retry.impl; - -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.functions.Function; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.TimeUnit; - -public class FixedDelay extends RetryPolicy { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private int maxRetries; - private int retryDelay; - private TimeUnit unit = TimeUnit.SECONDS; - private int retryCount; - - public FixedDelay() {} - - public FixedDelay(int maxRetries, int retryDelay, TimeUnit unit) { - this.maxRetries = maxRetries; - this.retryDelay = retryDelay; - this.unit = unit; - this.retryCount = 0; - } - - @Override - public Observable apply(final Observable attempts) { - return attempts.flatMap( - (Function>) - throwable -> { - if (throwable.getMessage().contains("The mapper function returned a null value") - || throwable - .getMessage() - .contains( - "JSON decoding error: Cannot deserialize value of type" - + " `com.edgechain.lib.openai.response.ChatCompletionResponse` from" - + " Array value (token `JsonToken.START_ARRAY`)")) - return Observable.empty(); - - if (++retryCount < maxRetries) { - logger.info( - String.format( - "Retrying: Attempt: %s, Max Retries: %s ~ %s", - retryCount, maxRetries, throwable.getMessage())); - return Observable.timer(unit.toMillis(retryDelay), TimeUnit.MILLISECONDS); - } - - // Once, max-retries hit, emit an error. - logger.error( - String.format( - "Error Occurred: Attempt: %s, Max Retries: %s ~ %s", - retryCount, maxRetries, throwable.getMessage())); - return Observable.error(throwable); - }); - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("FixedDelay{"); - sb.append("maxRetries=").append(maxRetries); - sb.append(", retryDelay=").append(retryDelay); - sb.append(", unit=").append(unit); - sb.append('}'); - return sb.toString(); - } - - public int getRetryCount() { - return retryCount; - } - - public int getMaxRetries() { - return maxRetries; - } - - public int getRetryDelay() { - return retryDelay; - } - - public TimeUnit getUnit() { - return unit; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java deleted file mode 100644 index 2546488aa..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.edgechain.lib.rxjava.transformer.observable; - -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.*; -import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.functions.*; - -import java.io.Serializable; - -public abstract class AbstractEdgeChain implements Serializable { - - private static final long serialVersionUID = -7323653750095226732L; - - protected Observable observable; - - public AbstractEdgeChain(Observable observable) { - this.observable = observable; - } - - public abstract AbstractEdgeChain transform(Function mapper); - - public abstract AbstractEdgeChain combine( - ObservableSource other, BiFunction zipper); - - public abstract AbstractEdgeChain combine(EdgeChain other, BiFunction zipper); - - public abstract AbstractEdgeChain filter(Predicate predicate); - - public abstract AbstractEdgeChain mergeWith(ObservableSource other); - - public abstract AbstractEdgeChain concatWith(ObservableSource other); - - // doOnEach, doOnSubscribe(), doOnComplete(), - - public abstract AbstractEdgeChain doOnComplete(Action onComplete); - - public abstract AbstractEdgeChain doOnNext(Consumer onNext); - - public abstract AbstractEdgeChain doOnEach( - @NonNull Consumer> onNotification); - - public abstract AbstractEdgeChain doAfterNext(Consumer onAfterNext); - - public abstract AbstractEdgeChain doOnError(Consumer onError); - - public abstract AbstractEdgeChain doOnSubscribe(Consumer onSubscribe); - - public abstract AbstractEdgeChain schedule(); - - public abstract AbstractEdgeChain schedule(Scheduler scheduler); - - public abstract AbstractEdgeChain retry( - Function, ? extends ObservableSource> handler); - - public abstract AbstractEdgeChain doWhileLoop(BooleanSupplier booleanSupplier); - - public abstract void execute(); - - public abstract void execute(RetryPolicy retryPolicy); - - public abstract void execute(Consumer onNext, Consumer onError); - - public abstract void execute( - Consumer onNext, Consumer onError, RetryPolicy retryPolicy); - - public abstract void execute( - Consumer onNext, - Consumer onError, - Action onComplete, - RetryPolicy retryPolicy); - - public abstract void execute( - Consumer onNext, Consumer onError, Action onComplete); - - public abstract Observable getObservable(); - - public abstract Observable getScheduledObservable(); - - public abstract Single toSingle(); - - public abstract T get(); - - public abstract Completable await(); - - public abstract void completed(); - - public abstract void completed(Action onComplete); - - public abstract void completed(Action onComplete, Consumer onError); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java deleted file mode 100644 index a030780d5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.edgechain.lib.rxjava.transformer.observable; - -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.response.ArkResponse; -import com.edgechain.lib.response.ArkEmitter; -import com.edgechain.lib.response.ArkObservable; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import com.edgechain.lib.utils.RetryUtils; -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.*; -import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.functions.*; -import io.reactivex.rxjava3.schedulers.Schedulers; - -import java.io.Serializable; - -public class EdgeChain extends AbstractEdgeChain implements Serializable { - - private static final long serialVersionUID = 297269864039510096L; - - private Endpoint endpoint; - - public EdgeChain(Observable observable) { - super(observable); - } - - public EdgeChain(Observable observable, Endpoint endpoint) { - super(observable); - this.endpoint = endpoint; - } - - public EdgeChain(T item) { - super(Observable.just(item)); - } - - @Override - public EdgeChain transform(Function mapper) { - return new EdgeChain<>(this.observable.map(mapper)); - } - - @Override - public EdgeChain combine(ObservableSource other, BiFunction zipper) { - return new EdgeChain<>(this.observable.zipWith(other, zipper)); - } - - @Override - public EdgeChain combine(EdgeChain other, BiFunction zipper) { - return new EdgeChain<>(this.observable.zipWith(other.getObservable(), zipper)); - } - - @Override - public EdgeChain filter(Predicate predicate) { - return new EdgeChain<>(this.observable.filter(predicate)); - } - - @Override - public EdgeChain mergeWith(ObservableSource other) { - return new EdgeChain<>(this.observable.mergeWith(other)); - } - - @Override - public EdgeChain concatWith(ObservableSource other) { - return new EdgeChain<>(this.observable.concatWith(other)); - } - - @Override - public EdgeChain doOnComplete(Action onComplete) { - return new EdgeChain<>(this.observable.doOnComplete(onComplete), endpoint); - } - - @Override - public EdgeChain doOnNext(@NonNull Consumer onNext) { - return new EdgeChain<>(this.observable.doOnNext(onNext), endpoint); - } - - @Override - public EdgeChain doOnEach(@NonNull Consumer> onNotification) { - return new EdgeChain<>(this.observable.doOnEach(onNotification), endpoint); - } - - @Override - public EdgeChain doAfterNext(@NonNull Consumer onAfterNext) { - return new EdgeChain<>(this.observable.doAfterNext(onAfterNext), endpoint); - } - - @Override - public EdgeChain doOnError(@NonNull Consumer onError) { - return new EdgeChain<>(this.observable.doOnError(onError), endpoint); - } - - @Override - public EdgeChain doOnSubscribe(Consumer onSubscribe) { - return new EdgeChain<>(this.observable.doOnSubscribe(onSubscribe), endpoint); - } - - @Override - public EdgeChain schedule() { - return new EdgeChain<>(this.observable.subscribeOn(Schedulers.io())); - } - - @Override - public EdgeChain schedule(Scheduler scheduler) { - return new EdgeChain<>(this.observable.subscribeOn(scheduler)); - } - - @Override - public EdgeChain retry( - Function, ? extends ObservableSource> handler) { - return new EdgeChain<>(this.observable.retryWhen(handler)); - } - - /** - * Wrapper implementation of doWhile loop - * - * @param booleanSupplier - * @return - */ - @Override - public EdgeChain doWhileLoop(BooleanSupplier booleanSupplier) { - return new EdgeChain<>(this.observable.repeatUntil(booleanSupplier)); - } - - @Override - public void execute() { - this.observable.subscribeOn(Schedulers.io()).subscribe(); - } - - @Override - public void execute(RetryPolicy retryPolicy) { - this.observable.subscribeOn(Schedulers.io()).retryWhen(retryPolicy).subscribe(); - } - - @Override - public void execute(Consumer onNext, Consumer onError) { - this.observable.subscribeOn(Schedulers.io()).subscribe(onNext, onError); - } - - @Override - public void execute( - Consumer onNext, Consumer onError, RetryPolicy retryPolicy) { - this.observable.subscribeOn(Schedulers.io()).retryWhen(retryPolicy).subscribe(onNext, onError); - } - - @Override - public void execute( - Consumer onNext, Consumer onError, Action onComplete) { - this.observable.subscribeOn(Schedulers.io()).subscribe(onNext, onError, onComplete); - } - - @Override - public void execute( - Consumer onNext, - Consumer onError, - Action onComplete, - RetryPolicy retryPolicy) { - this.observable - .subscribeOn(Schedulers.io()) - .retryWhen(retryPolicy) - .subscribe(onNext, onError, onComplete); - } - - @Override - public Observable getScheduledObservable() { - - if (RetryUtils.available(endpoint)) - return this.observable.retryWhen(endpoint.getRetryPolicy()).subscribeOn(Schedulers.io()); - else return this.observable.subscribeOn(Schedulers.io()); - } - - @Override - public Single toSingle() { - - if (RetryUtils.available(endpoint)) - return this.observable - .subscribeOn(Schedulers.io()) - .retryWhen(endpoint.getRetryPolicy()) - .firstOrError(); - else return this.observable.subscribeOn(Schedulers.io()).firstOrError(); - } - - @Override - public T get() { - if (RetryUtils.available(endpoint)) - return this.observable.retryWhen(endpoint.getRetryPolicy()).firstOrError().blockingGet(); - else return this.observable.firstOrError().blockingGet(); - } - - @Override - public Observable getObservable() { - return this.observable; - } - - @Override - public Completable await() { - - if (RetryUtils.available(endpoint)) - return this.observable - .subscribeOn(Schedulers.io()) - .retryWhen(endpoint.getRetryPolicy()) - .firstOrError() - .ignoreElement(); - else return this.observable.subscribeOn(Schedulers.io()).firstOrError().ignoreElement(); - } - - @Override - public void completed() { - Completable.fromObservable(this.observable).subscribeOn(Schedulers.io()).subscribe(); - } - - @Override - public void completed(Action onComplete) { - Completable.fromObservable(this.observable).subscribeOn(Schedulers.io()).subscribe(onComplete); - } - - @Override - public void completed(Action onComplete, Consumer onError) { - Completable.fromObservable(this.observable) - .subscribeOn(Schedulers.io()) - .subscribe(onComplete, onError); - } - - public ArkResponse getArkResponse() { - return new ArkObservable<>(this.observable.subscribeOn(Schedulers.io())); - } - - public ArkResponse getArkStreamResponse() { - return new ArkEmitter<>(this.observable.subscribeOn(Schedulers.io())); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/utils/Atom.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/utils/Atom.java deleted file mode 100644 index f1a497626..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/utils/Atom.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.edgechain.lib.rxjava.utils; - -import java.util.concurrent.atomic.AtomicReference; - -/** - * Simple wrapper over an AtomicReference - * - * @param The type of data stored in the atom. An immutable object. - */ -public final class Atom { - private final AtomicReference ref; - - private Atom(T data) { - this.ref = new AtomicReference<>(data); - } - - public static Atom of(T data) { - return new Atom<>(data); - } - - public T set(T data) { - this.ref.set(data); - return data; - } - - public T get() { - return this.ref.get(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/utils/AtomInteger.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/utils/AtomInteger.java deleted file mode 100644 index 5a65f05e5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/utils/AtomInteger.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.edgechain.lib.rxjava.utils; - -import java.io.Serializable; -import java.util.concurrent.atomic.AtomicInteger; - -/** Simple wrapper over an AtomicInteger */ -public final class AtomInteger implements Serializable { - - private static final long serialVersionUID = 2089141378144025092L; - private final AtomicInteger ref; - - private AtomInteger(Integer data) { - this.ref = new AtomicInteger(data); - } - - public static AtomInteger of(Integer data) { - return new AtomInteger(data); - } - - public Integer incrementAndGet() { - return this.ref.incrementAndGet(); - } - - public Integer getAndIncrement() { - return this.ref.getAndIncrement(); - } - - public Integer get() { - return this.ref.get(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/entities/User.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/entities/User.java deleted file mode 100644 index 8bfe22b59..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/entities/User.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.edgechain.lib.supabase.entities; - -import java.io.Serializable; -import java.util.*; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -public class User implements UserDetails, Serializable { - - private static final long serialVersionUID = -2363484450980070975L; - - private UUID id; - private String aud; - private String role; - - private String email; - private String phone; - - private String accessToken; - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public String getAud() { - return aud; - } - - public void setAud(String aud) { - this.aud = aud; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - User user = (User) o; - - return id.equals(user.id); - } - - @Override - public int hashCode() { - return Objects.hash(id); - } - - @Override - public Collection getAuthorities() { - Set authorities = new HashSet<>(); - List roles = Arrays.asList(this.role.split(",")); - roles.forEach(r -> authorities.add(new SimpleGrantedAuthority(r))); - return authorities; - } - - @Override - public String getPassword() { - return accessToken; - } - - @Override - public String getUsername() { - return email; - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return true; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/FilterException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/FilterException.java deleted file mode 100644 index 67728b224..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/FilterException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.supabase.exceptions; - -public class FilterException extends RuntimeException { - - public FilterException(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/SupabaseAuthException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/SupabaseAuthException.java deleted file mode 100644 index b30718b48..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/SupabaseAuthException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.edgechain.lib.supabase.exceptions; - -public class SupabaseAuthException extends RuntimeException { - - public SupabaseAuthException(String message) { - super(message); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/SupabaseUserExistException.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/SupabaseUserExistException.java deleted file mode 100644 index 9495e94a2..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/exceptions/SupabaseUserExistException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.edgechain.lib.supabase.exceptions; - -public class SupabaseUserExistException extends RuntimeException { - - public SupabaseUserExistException(String message) { - super(message); - } - - public SupabaseUserExistException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/repository/UserRepository.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/repository/UserRepository.java deleted file mode 100644 index 2006d3ee4..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/repository/UserRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.edgechain.lib.supabase.repository; - -import com.edgechain.lib.supabase.entities.User; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.BeanPropertyRowMapper; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public class UserRepository { - - @Autowired private JdbcTemplate jdbcTemplate; - - public Optional findByEmail(String email) { - String sql = String.format("select * from auth.users where email='%s'", email); - List contextList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); - - if (contextList.size() > 0) return Optional.ofNullable(contextList.get(0)); - else return Optional.empty(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/request/Credential.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/request/Credential.java deleted file mode 100644 index 84291771f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/request/Credential.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.edgechain.lib.supabase.request; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -public class Credential implements Serializable { - - private static final long serialVersionUID = -5683437072462410726L; - - @NotBlank private String email; - - @NotBlank private String password; - - public Credential() {} - - public Credential(String email, String password) { - this.email = email; - this.password = password; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/AuthenticatedResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/AuthenticatedResponse.java deleted file mode 100644 index 33580f2bd..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/AuthenticatedResponse.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.edgechain.lib.supabase.response; - -public class AuthenticatedResponse { - - private String access_token; - private String token_type; - private int expires_in; - private String refresh_token; - - public SupabaseAuthUser user; // Modifiable to add more fields as required. - - public String getAccess_token() { - return access_token; - } - - public void setAccess_token(String access_token) { - this.access_token = access_token; - } - - public String getToken_type() { - return token_type; - } - - public void setToken_type(String token_type) { - this.token_type = token_type; - } - - public int getExpires_in() { - return expires_in; - } - - public void setExpires_in(int expires_in) { - this.expires_in = expires_in; - } - - public String getRefresh_token() { - return refresh_token; - } - - public void setRefresh_token(String refresh_token) { - this.refresh_token = refresh_token; - } - - public SupabaseAuthUser getUser() { - return user; - } - - public void setUser(SupabaseAuthUser user) { - this.user = user; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("AuthenticatedResponse{"); - sb.append("access_token='").append(access_token).append('\''); - sb.append(", token_type='").append(token_type).append('\''); - sb.append(", expires_in=").append(expires_in); - sb.append(", refresh_token='").append(refresh_token).append('\''); - sb.append(", user=").append(user); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseAuth.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseAuth.java deleted file mode 100644 index fb2b58bb0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseAuth.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.edgechain.lib.supabase.response; - -import com.edgechain.lib.supabase.entities.User; - -public class SupabaseAuth { - - public String access_token; - public String token_type; - public int expires_in; - public String refresh_token; - public User user; - - public String getAccess_token() { - return access_token; - } - - public void setAccess_token(String access_token) { - this.access_token = access_token; - } - - public String getToken_type() { - return token_type; - } - - public void setToken_type(String token_type) { - this.token_type = token_type; - } - - public int getExpires_in() { - return expires_in; - } - - public void setExpires_in(int expires_in) { - this.expires_in = expires_in; - } - - public String getRefresh_token() { - return refresh_token; - } - - public void setRefresh_token(String refresh_token) { - this.refresh_token = refresh_token; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("SupabaseAuth{"); - sb.append("access_token='").append(access_token).append('\''); - sb.append(", token_type='").append(token_type).append('\''); - sb.append(", expires_in=").append(expires_in); - sb.append(", refresh_token='").append(refresh_token).append('\''); - sb.append(", user=").append(user); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseAuthUser.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseAuthUser.java deleted file mode 100644 index 974fea9a0..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseAuthUser.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.edgechain.lib.supabase.response; - -import com.edgechain.lib.supabase.response.metadata.AppMetadata; - -import java.time.LocalDateTime; -import java.util.Map; -import java.util.UUID; - -public class SupabaseAuthUser { - private UUID id; - private String aud; - private String role; - private String email; - - private LocalDateTime confirmed_at; - - private LocalDateTime last_sign_in_at; - - private AppMetadata app_metadata; - private Map user_metadata; - - private LocalDateTime created_at; - - private LocalDateTime updated_at; - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public String getAud() { - return aud; - } - - public void setAud(String aud) { - this.aud = aud; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public LocalDateTime getLast_sign_in_at() { - return last_sign_in_at; - } - - public void setLast_sign_in_at(LocalDateTime last_sign_in_at) { - this.last_sign_in_at = last_sign_in_at; - } - - public AppMetadata getApp_metadata() { - return app_metadata; - } - - public void setApp_metadata(AppMetadata app_metadata) { - this.app_metadata = app_metadata; - } - - public Map getUser_metadata() { - return user_metadata; - } - - public void setUser_metadata(Map user_metadata) { - this.user_metadata = user_metadata; - } - - public LocalDateTime getCreated_at() { - return created_at; - } - - public void setCreated_at(LocalDateTime created_at) { - this.created_at = created_at; - } - - public LocalDateTime getUpdated_at() { - return updated_at; - } - - public void setUpdated_at(LocalDateTime updated_at) { - this.updated_at = updated_at; - } - - public LocalDateTime getConfirmed_at() { - return confirmed_at; - } - - public void setConfirmed_at(LocalDateTime confirmed_at) { - this.confirmed_at = confirmed_at; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseUser.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseUser.java deleted file mode 100644 index 7f7c9d91f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/SupabaseUser.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.edgechain.lib.supabase.response; - -import com.edgechain.lib.supabase.response.metadata.AppMetadata; -import com.edgechain.lib.supabase.response.metadata.Identity; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class SupabaseUser implements Serializable { - - private static final long serialVersionUID = 642686832515951642L; - private UUID id; - private String aud; - private String role; - private String email; - private LocalDateTime email_confirmed_at; - private String phone; - - private LocalDateTime confirmation_sent_at; - - private LocalDateTime confirmed_at; - - private LocalDateTime last_sign_in_at; - - private AppMetadata app_metadata; - private Map user_metadata; - private List identities = new ArrayList<>(); - - private LocalDateTime created_at; - - private LocalDateTime updated_at; - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public String getAud() { - return aud; - } - - public void setAud(String aud) { - this.aud = aud; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public LocalDateTime getEmail_confirmed_at() { - return email_confirmed_at; - } - - public void setEmail_confirmed_at(LocalDateTime email_confirmed_at) { - this.email_confirmed_at = email_confirmed_at; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public LocalDateTime getConfirmation_sent_at() { - return confirmation_sent_at; - } - - public void setConfirmation_sent_at(LocalDateTime confirmation_sent_at) { - this.confirmation_sent_at = confirmation_sent_at; - } - - public LocalDateTime getConfirmed_at() { - return confirmed_at; - } - - public void setConfirmed_at(LocalDateTime confirmed_at) { - this.confirmed_at = confirmed_at; - } - - public LocalDateTime getLast_sign_in_at() { - return last_sign_in_at; - } - - public void setLast_sign_in_at(LocalDateTime last_sign_in_at) { - this.last_sign_in_at = last_sign_in_at; - } - - public AppMetadata getApp_metadata() { - return app_metadata; - } - - public void setApp_metadata(AppMetadata app_metadata) { - this.app_metadata = app_metadata; - } - - public Map getUser_metadata() { - return user_metadata; - } - - public void setUser_metadata(Map user_metadata) { - this.user_metadata = user_metadata; - } - - public List getIdentities() { - return identities; - } - - public void setIdentities(List identities) { - this.identities = identities; - } - - public LocalDateTime getCreated_at() { - return created_at; - } - - public void setCreated_at(LocalDateTime created_at) { - this.created_at = created_at; - } - - public LocalDateTime getUpdated_at() { - return updated_at; - } - - public void setUpdated_at(LocalDateTime updated_at) { - this.updated_at = updated_at; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("SupabaseUser{"); - sb.append("id=").append(id); - sb.append(", aud='").append(aud).append('\''); - sb.append(", role='").append(role).append('\''); - sb.append(", email='").append(email).append('\''); - sb.append(", email_confirmed_at=").append(email_confirmed_at); - sb.append(", phone='").append(phone).append('\''); - sb.append(", confirmation_sent_at=").append(confirmation_sent_at); - sb.append(", confirmed_at=").append(confirmed_at); - sb.append(", last_sign_in_at='").append(last_sign_in_at).append('\''); - sb.append(", app_metadata=").append(app_metadata); - sb.append(", user_metadata=").append(user_metadata); - sb.append(", identities=").append(identities); - sb.append(", created_at=").append(created_at); - sb.append(", updated_at=").append(updated_at); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/AppMetadata.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/AppMetadata.java deleted file mode 100644 index 3b7cb9008..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/AppMetadata.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.edgechain.lib.supabase.response.metadata; - -import java.util.ArrayList; -import java.util.List; - -public class AppMetadata { - - private String provider; - private List providers = new ArrayList<>(); - - public String getProvider() { - return provider; - } - - public void setProvider(String provider) { - this.provider = provider; - } - - public List getProviders() { - return providers; - } - - public void setProviders(List providers) { - this.providers = providers; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("AppMetadata{"); - sb.append("provider='").append(provider).append('\''); - sb.append(", providers=").append(providers); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/Identity.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/Identity.java deleted file mode 100644 index 59485a105..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/Identity.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.edgechain.lib.supabase.response.metadata; - -import java.time.LocalDateTime; - -public class Identity { - private String id; - private String user_id; - private IdentityData identity_data; - private String provider; - private LocalDateTime last_sign_in_at; - private LocalDateTime created_at; - private LocalDateTime updated_at; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getUser_id() { - return user_id; - } - - public void setUser_id(String user_id) { - this.user_id = user_id; - } - - public IdentityData getIdentity_data() { - return identity_data; - } - - public void setIdentity_data(IdentityData identity_data) { - this.identity_data = identity_data; - } - - public String getProvider() { - return provider; - } - - public void setProvider(String provider) { - this.provider = provider; - } - - public LocalDateTime getLast_sign_in_at() { - return last_sign_in_at; - } - - public void setLast_sign_in_at(LocalDateTime last_sign_in_at) { - this.last_sign_in_at = last_sign_in_at; - } - - public LocalDateTime getCreated_at() { - return created_at; - } - - public void setCreated_at(LocalDateTime created_at) { - this.created_at = created_at; - } - - public LocalDateTime getUpdated_at() { - return updated_at; - } - - public void setUpdated_at(LocalDateTime updated_at) { - this.updated_at = updated_at; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("Identity{"); - sb.append("id='").append(id).append('\''); - sb.append(", user_id='").append(user_id).append('\''); - sb.append(", identity_data=").append(identity_data); - sb.append(", provider='").append(provider).append('\''); - sb.append(", last_sign_in_at=").append(last_sign_in_at); - sb.append(", created_at=").append(created_at); - sb.append(", updated_at=").append(updated_at); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/IdentityData.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/IdentityData.java deleted file mode 100644 index 4f9bbb36d..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/response/metadata/IdentityData.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.edgechain.lib.supabase.response.metadata; - -public class IdentityData { - private String email; - private String sub; - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getSub() { - return sub; - } - - public void setSub(String sub) { - this.sub = sub; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("IdentityData{"); - sb.append("email='").append(email).append('\''); - sb.append(", sub='").append(sub).append('\''); - sb.append('}'); - return sb.toString(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java deleted file mode 100644 index 9fe5614ca..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.edgechain.lib.supabase.security; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.configuration.domain.SecurityUUID; -import com.edgechain.lib.exceptions.response.ErrorResponse; -import com.edgechain.lib.supabase.entities.User; -import com.edgechain.lib.supabase.exceptions.FilterException; -import com.edgechain.lib.supabase.utils.AuthUtils; -import com.edgechain.lib.utils.JsonUtils; -import io.jsonwebtoken.*; -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Objects; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -@Component -@Order(Ordered.HIGHEST_PRECEDENCE) -public class JwtFilter extends OncePerRequestFilter { - - @Autowired private JwtHelper jwtHelper; - - @Autowired private UserSecurityService userSecurityService; - - @Autowired private SecurityUUID securityUUID; - - @Override - protected void doFilterInternal( - HttpServletRequest request, HttpServletResponse response, FilterChain filter) - throws ServletException, IOException { - - if (request.getRequestURI().startsWith(WebConfiguration.CONTEXT_PATH)) { - String authHeader = request.getHeader("Authorization"); - if (Objects.isNull(authHeader) || !authHeader.equals(securityUUID.getAuthKey())) - throw new FilterException("Access Denied"); - } - - String token = AuthUtils.extractToken(request); - - if (token != null) { - - /** If you are using Supabase, then uncomment this line; * */ - // User user = userSecurityService.loadUserByUsername(token); - - /** - * Because, EdgeChains is a project independent of supabase; therefore, your jwt must contain - * these two fields: a) email: "", b) role: "authenticated, user_create" - */ - Jws claimsJws; - try { - claimsJws = jwtHelper.parseToken(token); - } catch (final Exception e) { - ErrorResponse errorResponse = new ErrorResponse(e.getMessage()); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - response.getWriter().print(JsonUtils.convertToString(errorResponse)); - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - return; - } - - String email = (String) claimsJws.getBody().get("email"); - String role = (String) claimsJws.getBody().get("role"); - - User user = new User(); - user.setEmail(email); - user.setAccessToken(token); - user.setRole(role); - - UsernamePasswordAuthenticationToken authToken = - new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authToken); - } - - filter.doFilter(request, response); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java deleted file mode 100644 index a97d6112b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.edgechain.lib.supabase.security; - -import io.jsonwebtoken.*; -import java.security.Key; -import javax.crypto.spec.SecretKeySpec; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -@Component -public class JwtHelper { - - @Autowired private Environment env; - - public Jws parseToken(String accessToken) { - try { - Key hmacKey = - new SecretKeySpec( - env.getProperty("jwt.secret").getBytes(), SignatureAlgorithm.HS256.getJcaName()); - - return Jwts.parser().setSigningKey(hmacKey).parseClaimsJws(accessToken); - - } catch (MalformedJwtException e) { - throw new JwtException("Token Malformed"); - } catch (UnsupportedJwtException e) { - throw new JwtException("Token Unsupported"); - } catch (ExpiredJwtException e) { - throw new JwtException("Token Expired"); - } catch (IllegalArgumentException e) { - throw new JwtException("Token Empty"); - } catch (SignatureException e) { - throw new JwtException("Token Signature Failed"); - } - } - - // validate - public boolean validate(String accessToken) { - try { - Key hmacKey = - new SecretKeySpec( - env.getProperty("jwt.secret").getBytes(), SignatureAlgorithm.HS256.getJcaName()); - - // String encoded = - // Base64.getEncoder().encodeToString(this.supabaseEnv.getJwtSecret().getBytes()); - Jwts.parser().setSigningKey(hmacKey).parseClaimsJws(accessToken); - return true; - } catch (MalformedJwtException e) { - throw new JwtException("Token Malformed"); - } catch (UnsupportedJwtException e) { - throw new JwtException("Token Unsupported"); - } catch (ExpiredJwtException e) { - throw new JwtException("Token Expired"); - } catch (IllegalArgumentException e) { - throw new JwtException("Token Empty"); - } catch (SignatureException e) { - throw new JwtException("Token Signature Failed"); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/PrincipalConverter.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/PrincipalConverter.java deleted file mode 100644 index 948c97b35..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/PrincipalConverter.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.edgechain.lib.supabase.security; - -import java.security.Principal; - -import com.edgechain.lib.supabase.entities.User; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.convert.converter.Converter; -import org.springframework.format.FormatterRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class PrincipalConverter implements WebMvcConfigurer { - @Override - public void addFormatters(FormatterRegistry registry) { - registry.addConverter(new PSC()); - } - - public class PSC implements Converter { - @Override - public User convert(Principal from) { - return (User) from; - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/UserSecurityService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/UserSecurityService.java deleted file mode 100644 index 020ec34a1..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/UserSecurityService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.edgechain.lib.supabase.security; - -import com.edgechain.lib.supabase.entities.User; -import com.edgechain.lib.supabase.services.UserService; -import org.modelmapper.ModelMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -@Service -public class UserSecurityService implements UserDetailsService { - - @Autowired private UserService userService; - - @Override - public User loadUserByUsername(String accessToken) throws UsernameNotFoundException { - User user = new ModelMapper().map(this.userService.getUser(accessToken), User.class); - user.setAccessToken(accessToken); - return user; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java deleted file mode 100644 index cd35fabc8..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.edgechain.lib.supabase.security; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.configuration.domain.AuthFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.Ordered; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; -import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import java.util.Arrays; -import java.util.Objects; - -@EnableWebSecurity -@EnableMethodSecurity -@Configuration -public class WebSecurity { - - @Autowired private Environment env; - @Autowired private AuthFilter authFilter; - @Autowired private JwtFilter jwtFilter; - - @Bean - public AuthenticationManager authenticationManager(AuthenticationConfiguration config) - throws Exception { - return config.getAuthenticationManager(); - } - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - - return http.cors() - .configurationSource(corsConfiguration()) - .and() - .csrf() - .disable() - .authorizeHttpRequests( - (auth) -> { - try { - auth.requestMatchers("" + WebConfiguration.CONTEXT_PATH + "/**") - .permitAll() - .requestMatchers(HttpMethod.POST, authFilter.getRequestPost().getRequests()) - .hasAnyAuthority(authFilter.getRequestPost().getAuthorities()) - // - .requestMatchers(HttpMethod.GET, authFilter.getRequestGet().getRequests()) - .hasAnyAuthority(authFilter.getRequestGet().getAuthorities()) - .requestMatchers(HttpMethod.DELETE, authFilter.getRequestDelete().getRequests()) - .hasAnyAuthority(authFilter.getRequestDelete().getAuthorities()) - .requestMatchers(HttpMethod.PUT, authFilter.getRequestPut().getRequests()) - .hasAnyAuthority(authFilter.getRequestPut().getAuthorities()) - .requestMatchers(HttpMethod.PATCH, authFilter.getRequestPatch().getRequests()) - .hasAnyAuthority(authFilter.getRequestPatch().getAuthorities()) - .anyRequest() - .permitAll(); - - } catch (Exception e) { - throw new RuntimeException(e); - } - }) - .httpBasic(Customizer.withDefaults()) - .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .exceptionHandling() - .and() - .securityContext(c -> c.requireExplicitSave(false)) - .formLogin() - .disable() - .build(); - } - - @Bean - public CorsConfigurationSource corsConfiguration() { - - CorsConfiguration configuration = new CorsConfiguration(); - - String cors = env.getProperty("cors.origins"); - - if (Objects.nonNull(cors) && !cors.isEmpty()) { - configuration.setAllowedOrigins(Arrays.stream(cors.split(",")).toList()); - } - - configuration.setAllowCredentials(true); - configuration.setAllowedMethods( - Arrays.asList("GET", "POST", "OPTIONS", "PUT", "PATCH", "DELETE", "HEAD")); - configuration.setAllowedHeaders( - Arrays.asList( - "Origin", - "Content-Type", - "Accept", - "Access-Control-Allow-Headers", - "Access-Control-Request-Method", - "Access-Control-Request-Headers", - "X-Requested-With", - "Authorization", - "Stream")); - configuration.setMaxAge(3600L); - - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", configuration); - - return source; - } - - @Bean - public FilterRegistrationBean corsFilter() { - FilterRegistrationBean bean = - new FilterRegistrationBean<>(new CorsFilter(corsConfiguration())); - bean.setOrder(Ordered.HIGHEST_PRECEDENCE); - return bean; - } - - @Bean - public FilterRegistrationBean jwtFilterFilterRegistrationBean(JwtFilter jwtFilter) { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(jwtFilter); - registrationBean.setEnabled(false); - return registrationBean; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/SupabaseAuthService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/SupabaseAuthService.java deleted file mode 100644 index 1b5848b28..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/SupabaseAuthService.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.edgechain.lib.supabase.services; - -import java.util.HashMap; -import java.util.Map; - -import com.edgechain.lib.supabase.exceptions.SupabaseAuthException; -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -@Service -public class SupabaseAuthService { - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - private static final String AUTH_MAPPING = "/auth/v1"; - - @Autowired private RestTemplate restTemplate; - - @Autowired private Environment env; - - public SupabaseUser signUpWithEmail(Credential credential) { - try { - // Set Path - String path = setPath() + "/signup"; - - // Set Authorization AccessToken; - HttpHeaders headers = setHeaders(); - HttpEntity requestEntity = new HttpEntity<>(credential, headers); - - ResponseEntity response = - restTemplate.exchange(path, HttpMethod.POST, requestEntity, SupabaseUser.class); - - return response.getBody(); - - } catch (final Exception e) { - logger.info(e.getMessage()); - throw new SupabaseAuthException(e.getMessage()); - } - } - - public AuthenticatedResponse signInWithEmail(Credential credential) { - try { - // Set Path - String path = setPath() + "/token?grant_type=password"; - - HttpHeaders headers = setHeaders(); - HttpEntity requestEntity = new HttpEntity<>(credential, headers); - - ResponseEntity response = - restTemplate.exchange(path, HttpMethod.POST, requestEntity, AuthenticatedResponse.class); - - return response.getBody(); - - } catch (final Exception e) { - logger.info(e.getMessage()); - throw new SupabaseAuthException(e.getMessage()); - } - } - - public AuthenticatedResponse refreshToken(String refreshToken) { - - try { - String path = setPath() + "/token?grant_type=refresh_token"; - - HttpHeaders headers = setHeaders(); - - Map body = new HashMap<>(); - body.put("refresh_token", refreshToken); - - HttpEntity requestEntity = new HttpEntity<>(body, headers); - - ResponseEntity response = - restTemplate.exchange(path, HttpMethod.POST, requestEntity, AuthenticatedResponse.class); - - return response.getBody(); - - } catch (final Exception e) { - logger.info(e.getMessage()); - throw new SupabaseAuthException(e.getMessage()); - } - } - - public void signOut(String accessToken) { - try { - // Set Path - String path = setPath() + "/logout"; - - // Set Authorization AccessToken; - HttpHeaders headers = setHeaders(); - headers.set("Authorization", "Bearer " + accessToken); - HttpEntity requestEntity = new HttpEntity<>(headers); - - restTemplate.postForObject(path, requestEntity, String.class); - - } catch (final Exception e) { - logger.info(e.getMessage()); - throw new SupabaseAuthException(e.getMessage()); - } - } - - public SupabaseUser getUser(String accessToken) { - try { - // Set Path - String path = setPath() + "/user"; - - // Set Authorization AccessToken; - HttpHeaders headers = setHeaders(); - headers.set("Authorization", "Bearer " + accessToken); - HttpEntity requestEntity = new HttpEntity<>(headers); - - ResponseEntity response = - restTemplate.exchange(path, HttpMethod.GET, requestEntity, SupabaseUser.class); - - return response.getBody(); - - } catch (final Exception e) { - logger.info(e.getMessage()); - throw new SupabaseAuthException(e.getMessage()); - } - } - - private HttpHeaders setHeaders() { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("apikey", env.getProperty("supabase.annon.key")); - headers.set("X-Client-Info", "supabase-java/0.0.0-automated"); - return headers; - } - - private String setPath() { - return env.getProperty("supabase.url") + AUTH_MAPPING; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/UserService.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/UserService.java deleted file mode 100644 index 376a3b97f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/UserService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.edgechain.lib.supabase.services; - -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; - -public interface UserService { - - SupabaseUser getUser(String accessToken); - - AuthenticatedResponse login(Credential credential); - - AuthenticatedResponse refreshToken(String refreshToken); - - SupabaseUser signup(Credential credential); - - void signOut(String accessToken); -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/impl/UserServiceImpl.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/impl/UserServiceImpl.java deleted file mode 100644 index 45534cd23..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/services/impl/UserServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.edgechain.lib.supabase.services.impl; - -import java.util.Optional; - -import com.edgechain.lib.supabase.entities.User; -import com.edgechain.lib.supabase.exceptions.SupabaseUserExistException; -import com.edgechain.lib.supabase.repository.UserRepository; -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import com.edgechain.lib.supabase.services.SupabaseAuthService; -import com.edgechain.lib.supabase.services.UserService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class UserServiceImpl implements UserService { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Autowired private SupabaseAuthService supabaseAuthService; - - @Autowired private UserRepository userRepository; - - @Override - public SupabaseUser getUser(String accessToken) { - return this.supabaseAuthService.getUser(accessToken); - } - - @Override - public AuthenticatedResponse login(Credential credential) { - return this.supabaseAuthService.signInWithEmail(credential); - } - - @Override - public AuthenticatedResponse refreshToken(String refreshToken) { - return this.supabaseAuthService.refreshToken(refreshToken); - } - - @Override - public SupabaseUser signup(Credential credential) { - Optional userOptional = userRepository.findByEmail(credential.getEmail()); - if (userOptional.isPresent()) { - logger.error("User already exists."); - throw new SupabaseUserExistException("User already exists."); - } - - return this.supabaseAuthService.signUpWithEmail(credential); - } - - @Override - public void signOut(String accessToken) { - this.supabaseAuthService.signOut(accessToken); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/utils/AuthUtils.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/utils/AuthUtils.java deleted file mode 100644 index 6c7a203b6..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/utils/AuthUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.edgechain.lib.supabase.utils; - -import com.edgechain.lib.request.ArkRequest; -import jakarta.servlet.http.HttpServletRequest; - -public class AuthUtils { - - public static String extractToken(HttpServletRequest request) { - String header = request.getHeader("Authorization"); - if (header != null && header.startsWith("Bearer")) return header.replace("Bearer ", ""); - - return null; - } - - public static String extractToken(ArkRequest request) { - String header = request.getHeader("Authorization"); - if (header != null && header.startsWith("Bearer")) return header.replace("Bearer ", ""); - return null; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/FloatUtils.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/FloatUtils.java deleted file mode 100644 index f88cfcb9f..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/FloatUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.edgechain.lib.utils; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.List; - -public class FloatUtils { - - public static byte[] toByteArray(float[] input) { - byte[] bytes = new byte[Float.BYTES * input.length]; - ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer().put(input); - return bytes; - } - - public static float[] toFloatArray(List floatList) { - float[] floatArray = new float[floatList.size()]; - int i = 0; - - for (Float f : floatList) { - floatArray[i++] = (f != null ? f : Float.NaN); - } - - return floatArray; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/JsonUtils.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/JsonUtils.java deleted file mode 100644 index 0d73a7f73..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/JsonUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.edgechain.lib.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; - -public class JsonUtils { - - public static String convertToString(Object object) { - ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); - try { - return ow.writeValueAsString(object); - } catch (JsonProcessingException e) { - throw new RuntimeException(e.getMessage()); - } - } - - public static T convertToObject(String jsonString, Class clazz) { - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return mapper.readValue(jsonString, clazz); - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/RetryUtils.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/RetryUtils.java deleted file mode 100644 index 38031a3d2..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/RetryUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.edgechain.lib.utils; - -import com.edgechain.lib.endpoint.Endpoint; - -import java.util.Objects; - -public class RetryUtils { - - public static boolean available(Endpoint endpoint) { - if (Objects.isNull(endpoint) || Objects.isNull(endpoint.getRetryPolicy())) return false; - return true; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java deleted file mode 100644 index bd647cd72..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.edgechain.lib.wiki.client; - -import com.edgechain.lib.endpoint.impl.WikiEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.edgechain.lib.wiki.response.WikiResponse; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.core.Observable; -import java.util.Collections; -import java.util.Objects; - -import me.xuender.unidecode.Unidecode; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -public class WikiClient { - - private static final String WIKIPEDIA_API_URL = "https://en.wikipedia.org/w/api.php"; - - private WikiEndpoint wikiEndpoint; - - public WikiClient() {} - - public WikiClient(WikiEndpoint wikiEndpoint) { - this.wikiEndpoint = wikiEndpoint; - } - - public EdgeChain getPageContent(String input) { - return new EdgeChain<>( - Observable.create( - emitter -> { - try { - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - - MultiValueMap formParams = new LinkedMultiValueMap<>(); - formParams.add("action", "query"); - formParams.add("prop", "extracts"); - formParams.add("format", "json"); - formParams.add("titles", input); - formParams.add("explaintext", ""); // Add this line to request plain text content - - HttpEntity> requestEntity = - new HttpEntity<>(formParams, headers); - - ResponseEntity response = - new RestTemplate() - .exchange(WIKIPEDIA_API_URL, HttpMethod.POST, requestEntity, String.class); - - String jsonResponse = response.getBody(); - - JsonNode rootNode = new ObjectMapper().readTree(jsonResponse); - - JsonNode pagesNode = rootNode.path("query").path("pages"); - - // Iterate through the pages and extract the first page's content - String output = null; - String regex = "[^\\p{L}\\p{N}\\p{P}\\p{Z}]"; - for (JsonNode pageNode : pagesNode) { - if (pageNode.has("extract")) { - output = - Unidecode.decode(pageNode.get("extract").asText()) - .replaceAll("[\t\n\r]+", " "); - output = output.replaceAll(regex, ""); - } - } - - if (Objects.isNull(output)) - throw new RuntimeException("Unable to find content from Wiki."); - - emitter.onNext(new WikiResponse(output)); - emitter.onComplete(); - - } catch (final Exception e) { - emitter.onError(e); - } - }), - wikiEndpoint); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/response/WikiResponse.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/response/WikiResponse.java deleted file mode 100644 index cbee718eb..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/response/WikiResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.edgechain.lib.wiki.response; - -import com.edgechain.lib.response.ArkObject; -import org.json.JSONObject; - -public class WikiResponse implements ArkObject { - - private String text; - - public WikiResponse() {} - - public WikiResponse(String text) { - this.text = text; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("WikiResponse{"); - sb.append("text='").append(text).append('\''); - sb.append('}'); - return sb.toString(); - } - - @Override - public JSONObject toJson() { - JSONObject json = new JSONObject(); - json.put("text", text); - return json; - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java deleted file mode 100644 index 41210f1cc..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.edgechain.service.controllers.bgeSmall; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.embeddings.bgeSmall.BgeSmallClient; -import com.edgechain.lib.embeddings.bgeSmall.response.BgeSmallResponse; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.services.EmbeddingLogService; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Single; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.Objects; - -@RestController("Service BgeSmallController") -@RequestMapping(WebConfiguration.CONTEXT_PATH + "/bgeSmall") -public class BgeSmallController { - - @Autowired private BgeSmallClient bgeSmallClient; - - @Autowired private EmbeddingLogService embeddingLogService; - - @Autowired private Environment env; - - @PostMapping - public Single embeddings(@RequestBody BgeSmallEndpoint bgeSmallEndpoint) { - - this.bgeSmallClient.setEndpoint(bgeSmallEndpoint); - - EdgeChain edgeChain = - this.bgeSmallClient.createEmbeddings(bgeSmallEndpoint.getInput()); - - if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - - EmbeddingLog embeddingLog = new EmbeddingLog(); - embeddingLog.setCreatedAt(LocalDateTime.now()); - embeddingLog.setCallIdentifier(bgeSmallEndpoint.getCallIdentifier()); - embeddingLog.setModel("bge-small-en"); - - return edgeChain - .doOnNext( - c -> { - embeddingLog.setCompletedAt(LocalDateTime.now()); - Duration duration = - Duration.between(embeddingLog.getCreatedAt(), embeddingLog.getCompletedAt()); - embeddingLog.setLatency(duration.toMillis()); - embeddingLogService.saveOrUpdate(embeddingLog); - }) - .toSingle(); - } - - return edgeChain.toSingle(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java deleted file mode 100644 index cf5d8d16b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.edgechain.service.controllers.context; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.context.client.impl.PostgreSQLHistoryContextClient; -import com.edgechain.lib.context.domain.ContextPutRequest; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/context/postgresql") -public class PostgreSQLHistoryContextController { - - @Autowired private PostgreSQLHistoryContextClient contextClient; - - @PostMapping("/create") - public Single create( - @RequestParam("id") String id, @RequestBody PostgreSQLHistoryContextEndpoint endpoint) { - return this.contextClient.create(id, endpoint).toSingle(); - } - - @PostMapping("/update") - public Single put( - @RequestBody ContextPutRequest request) { - return this.contextClient - .put(request.getId(), request.getResponse(), request.getEndpoint()) - .toSingle(); - } - - @PostMapping(value = "/{id}") - public Single get( - @PathVariable("id") String id, @RequestBody PostgreSQLHistoryContextEndpoint endpoint) { - return this.contextClient.get(id, endpoint).toSingle(); - } - - @DeleteMapping("/{id}") - public Completable delete( - @PathVariable("id") String id, @RequestBody PostgreSQLHistoryContextEndpoint endpoint) { - return this.contextClient.delete(id, endpoint).await(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java deleted file mode 100644 index ce97d689a..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.edgechain.service.controllers.context; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.context.client.impl.RedisHistoryContextClient; -import com.edgechain.lib.context.domain.ContextPutRequest; -import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/context/redis") -public class RedisHistoryContextController { - - @Autowired private RedisHistoryContextClient contextClient; - - @PostMapping("/create") - public Single create( - @RequestParam("id") String id, @RequestBody RedisHistoryContextEndpoint endpoint) { - return this.contextClient.create(id, endpoint).toSingle(); - } - - @PostMapping("/update") - public Single put( - @RequestBody ContextPutRequest request) { - return this.contextClient - .put(request.getId(), request.getResponse(), request.getEndpoint()) - .toSingle(); - } - - @PostMapping(value = "/{id}") - public Single get( - @PathVariable("id") String id, @RequestBody RedisHistoryContextEndpoint endpoint) { - return this.contextClient.get(id, endpoint).toSingle(); - } - - @DeleteMapping("/{id}") - public Completable delete( - @PathVariable("id") String id, @RequestBody RedisHistoryContextEndpoint endpoint) { - return this.contextClient.delete(id, endpoint).await(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java deleted file mode 100644 index 8a7a8a527..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.edgechain.service.controllers.index; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; -import com.edgechain.lib.index.client.impl.PineconeClient; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Single; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController("Service PineconeController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/index/pinecone") -public class PineconeController { - - @Autowired private PineconeClient pineconeClient; - - @PostMapping("/upsert") - public Single upsert(@RequestBody PineconeEndpoint pineconeEndpoint) { - - pineconeClient.setEndpoint(pineconeEndpoint); - - EdgeChain edgeChain = - pineconeClient.upsert(pineconeEndpoint.getWordEmbeddings()); - - return edgeChain.toSingle(); - } - - @PostMapping("/query") - public Single> query(@RequestBody PineconeEndpoint pineconeEndpoint) { - - pineconeClient.setEndpoint(pineconeEndpoint); - - EdgeChain> edgeChain = - pineconeClient.query(pineconeEndpoint.getWordEmbeddings(), pineconeEndpoint.getTopK()); - - return edgeChain.toSingle(); - } - - @DeleteMapping("/deleteAll") - public Single deleteAll(@RequestBody PineconeEndpoint pineconeEndpoint) { - - pineconeClient.setEndpoint(pineconeEndpoint); - - EdgeChain edgeChain = pineconeClient.deleteAll(); - return edgeChain.toSingle(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java deleted file mode 100644 index 58491b687..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.edgechain.service.controllers.index; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; -import com.edgechain.lib.index.client.impl.PostgresClient; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Single; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.web.bind.annotation.*; - -@RestController("Service PostgresController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/index/postgres") -public class PostgresController { - - @Autowired @Lazy private PostgresClient postgresClient; - - @PostMapping("/upsert") - public Single upsert(@RequestBody PostgresEndpoint postgresEndpoint) { - - this.postgresClient.setPostgresEndpoint(postgresEndpoint); - EdgeChain edgeChain = - this.postgresClient.upsert(postgresEndpoint.getWordEmbeddings()); - - return edgeChain.toSingle(); - } - - @PostMapping("/query") - public Single> query( - @RequestBody PostgresEndpoint postgresEndpoint) { - - this.postgresClient.setPostgresEndpoint(postgresEndpoint); - - EdgeChain> edgeChain = - this.postgresClient.query( - postgresEndpoint.getWordEmbeddings(), - postgresEndpoint.getMetric(), - postgresEndpoint.getTopK(), - postgresEndpoint.getProbes()); - - return edgeChain.toSingle(); - } - - @DeleteMapping("/deleteAll") - public Single deleteAll(@RequestBody PostgresEndpoint postgresEndpoint) { - - this.postgresClient.setPostgresEndpoint(postgresEndpoint); - - EdgeChain edgeChain = this.postgresClient.deleteAll(); - return edgeChain.toSingle(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java deleted file mode 100644 index 6fcd2e566..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.edgechain.service.controllers.index; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; -import com.edgechain.lib.index.client.impl.RedisClient; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Single; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController("Service RedisController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/index/redis") -public class RedisController { - - @Autowired @Lazy private RedisClient redisClient; - - @PostMapping("/upsert") - public Single upsert(@RequestBody RedisEndpoint redisEndpoint) { - - this.redisClient.setEndpoint(redisEndpoint); - - EdgeChain edgeChain = - this.redisClient.upsert( - redisEndpoint.getWordEmbeddings(), - redisEndpoint.getDimensions(), - redisEndpoint.getMetric()); - - return edgeChain.toSingle(); - } - - @PostMapping("/query") - public Single> query(@RequestBody RedisEndpoint redisEndpoint) { - - this.redisClient.setEndpoint(redisEndpoint); - - EdgeChain> edgeChain = - this.redisClient.query(redisEndpoint.getWordEmbeddings(), redisEndpoint.getTopK()); - - return edgeChain.toSingle(); - } - - @DeleteMapping("/delete") - public Completable deleteByPattern( - @RequestParam("pattern") String pattern, @RequestBody RedisEndpoint redisEndpoint) { - - this.redisClient.setEndpoint(redisEndpoint); - - EdgeChain edgeChain = this.redisClient.deleteByPattern(pattern); - return edgeChain.await(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/ChatCompletionLogController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/ChatCompletionLogController.java deleted file mode 100644 index 61fdb9662..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/ChatCompletionLogController.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.edgechain.service.controllers.logging; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import com.edgechain.lib.logger.services.ChatCompletionLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; - -@RestController("Service ChatCompletionLogController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/logs/chat-completion") -public class ChatCompletionLogController { - - @Autowired private ChatCompletionLogService chatCompletionLogService; - - @GetMapping("/findAll/{page}/{size}") - public Page findAll(@PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAll(PageRequest.of(page, size)); - } - - @GetMapping("/findAll/sorted/{page}/{size}") - public Page findAllOrderByCompletedAtDesc( - @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllOrderByCompletedAtDesc(PageRequest.of(page, size)); - } - - @PostMapping("/findByName/{page}/{size}") - public Page findAllByName( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByName( - mapper.get("name"), PageRequest.of(page, size)); - } - - @PostMapping("/findByName/sorted/{page}/{size}") - public Page findAllByNameOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByNameOrderByCompletedAtDesc( - mapper.get("name"), PageRequest.of(page, size)); - } - - @PostMapping("/findByModel/{page}/{size}") - public Page findAllByModel( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByModel( - mapper.get("model"), PageRequest.of(page, size)); - } - - @PostMapping("/findByModel/sorted/{page}/{size}") - public Page findAllByModelOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByModelOrderByCompletedAtDesc( - mapper.get("model"), PageRequest.of(page, size)); - } - - @PostMapping("/findByIdentifier/{page}/{size}") - public Page findAllByCallIdentifier( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByCallIdentifier( - mapper.get("identifier"), PageRequest.of(page, size)); - } - - @PostMapping("/findByIdentifier/sorted/{page}/{size}") - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByCallIdentifierOrderByCompletedAtDesc( - mapper.get("identifier"), PageRequest.of(page, size)); - } - - @PostMapping("/findByLatencyLessThanEq/{page}/{size}") - public Page findAllByLatencyLessThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByLatencyLessThanEqual( - mapper.get("latency"), PageRequest.of(page, size)); - } - - @PostMapping("/findByLatencyGtrThanEq/{page}/{size}") - public Page findAllByLatencyGreaterThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.chatCompletionLogService.findAllByLatencyGreaterThanEqual( - mapper.get("latency"), PageRequest.of(page, size)); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java deleted file mode 100644 index d01d214b5..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.edgechain.service.controllers.logging; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.services.EmbeddingLogService; -import com.edgechain.lib.logger.services.EmbeddingLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; - -@RestController("Service EmbeddingLogController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/logs/embeddings") -public class EmbeddingLogController { - - @Autowired private EmbeddingLogService embeddingLogService; - - @GetMapping("/findAll/{page}/{size}") - public Page findAll(@PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAll(PageRequest.of(page, size)); - } - - @GetMapping("/findAll/sorted/{page}/{size}") - public Page findAllOrderByCompletedAtDesc( - @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllOrderByCompletedAtDesc(PageRequest.of(page, size)); - } - - @PostMapping("/findByModel/{page}/{size}") - public Page findAllByModel( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllByModel(mapper.get("model"), PageRequest.of(page, size)); - } - - @PostMapping("/findByModel/sorted/{page}/{size}") - public Page findAllByModelOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllByModelOrderByCompletedAtDesc( - mapper.get("model"), PageRequest.of(page, size)); - } - - @PostMapping("/findByIdentifier/{page}/{size}") - public Page findAllByCallIdentifier( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllByCallIdentifier( - mapper.get("identifier"), PageRequest.of(page, size)); - } - - @PostMapping("/findByIdentifier/sorted/{page}/{size}") - public Page findAllByCallIdentifierOrderByCompletedAtDesc( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllByCallIdentifierOrderByCompletedAtDesc( - mapper.get("identifier"), PageRequest.of(page, size)); - } - - @PostMapping("/findByLatencyLessThanEq/{page}/{size}") - public Page findAllByLatencyLessThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllByLatencyLessThanEqual( - mapper.get("latency"), PageRequest.of(page, size)); - } - - @PostMapping("/findByLatencyGtrThanEq/{page}/{size}") - public Page findAllByLatencyGreaterThanEqual( - @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { - return this.embeddingLogService.findAllByLatencyGreaterThanEqual( - mapper.get("latency"), PageRequest.of(page, size)); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java deleted file mode 100644 index 56824fc07..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.edgechain.service.controllers.miniLM; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.embeddings.miniLLM.MiniLMClient; -import com.edgechain.lib.embeddings.miniLLM.response.MiniLMResponse; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.services.EmbeddingLogService; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import io.reactivex.rxjava3.core.Single; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.Objects; - -@RestController("Service MiniLMController") -@RequestMapping(WebConfiguration.CONTEXT_PATH + "/miniLM") -public class MiniLMController { - - @Autowired private MiniLMClient miniLMClient; - - @Autowired private EmbeddingLogService embeddingLogService; - - @Autowired private Environment env; - - @PostMapping - public Single embeddings(@RequestBody MiniLMEndpoint miniLMEndpoint) { - - this.miniLMClient.setEndpoint(miniLMEndpoint); - - EdgeChain edgeChain = - this.miniLMClient.createEmbeddings(miniLMEndpoint.getInput()); - - if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - - EmbeddingLog embeddingLog = new EmbeddingLog(); - embeddingLog.setCreatedAt(LocalDateTime.now()); - embeddingLog.setCallIdentifier(miniLMEndpoint.getCallIdentifier()); - embeddingLog.setModel(miniLMEndpoint.getMiniLMModel().getName()); - - return edgeChain - .doOnNext( - c -> { - embeddingLog.setCompletedAt(LocalDateTime.now()); - Duration duration = - Duration.between(embeddingLog.getCreatedAt(), embeddingLog.getCompletedAt()); - embeddingLog.setLatency(duration.toMillis()); - embeddingLogService.saveOrUpdate(embeddingLog); - }) - .toSingle(); - } - - return edgeChain.toSingle(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java deleted file mode 100644 index addb60116..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java +++ /dev/null @@ -1,263 +0,0 @@ -package com.edgechain.service.controllers.openai; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.embeddings.request.OpenAiEmbeddingRequest; -import com.edgechain.lib.embeddings.response.OpenAiEmbeddingResponse; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.logger.entities.ChatCompletionLog; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.services.ChatCompletionLogService; -import com.edgechain.lib.logger.services.EmbeddingLogService; -import com.edgechain.lib.openai.client.OpenAiClient; -import com.edgechain.lib.openai.request.ChatCompletionRequest; -import com.edgechain.lib.openai.request.ChatMessage; -import com.edgechain.lib.openai.request.CompletionRequest; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.openai.response.CompletionResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.edgechain.lib.rxjava.utils.AtomInteger; -import com.knuddels.jtokkit.Encodings; -import com.knuddels.jtokkit.api.Encoding; -import com.knuddels.jtokkit.api.EncodingRegistry; -import com.knuddels.jtokkit.api.EncodingType; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Single; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.sql.SQLException; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@RestController("Service OpenAiController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/openai") -public class OpenAiController { - - @Autowired private ChatCompletionLogService chatCompletionLogService; - @Autowired private EmbeddingLogService embeddingLogService; - - @Autowired private Environment env; - @Autowired private OpenAiClient openAiClient; - - @PostMapping(value = "/chat-completion") - public Single chatCompletion(@RequestBody OpenAiEndpoint openAiEndpoint) { - - ChatCompletionRequest chatCompletionRequest = - ChatCompletionRequest.builder() - .model(openAiEndpoint.getModel()) - .temperature(openAiEndpoint.getTemperature()) - .messages(openAiEndpoint.getChatMessages()) - .stream(false) - .build(); - - this.openAiClient.setEndpoint(openAiEndpoint); - - EdgeChain edgeChain = - openAiClient.createChatCompletion(chatCompletionRequest); - - if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - - ChatCompletionLog chatCompletionLog = new ChatCompletionLog(); - chatCompletionLog.setName(openAiEndpoint.getChainName()); - chatCompletionLog.setCreatedAt(LocalDateTime.now()); - chatCompletionLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); - chatCompletionLog.setInput(StringUtils.join(openAiEndpoint.getChatMessages())); - chatCompletionLog.setModel(openAiEndpoint.getModel()); - - return edgeChain - .doOnNext( - c -> { - chatCompletionLog.setPromptTokens(c.getUsage().getPrompt_tokens()); - chatCompletionLog.setTotalTokens(c.getUsage().getTotal_tokens()); - chatCompletionLog.setContent(c.getChoices().get(0).getMessage().getContent()); - chatCompletionLog.setType(c.getObject()); - - chatCompletionLog.setCompletedAt(LocalDateTime.now()); - - Duration duration = - Duration.between( - chatCompletionLog.getCreatedAt(), chatCompletionLog.getCompletedAt()); - chatCompletionLog.setLatency(duration.toMillis()); - - chatCompletionLogService.saveOrUpdate(chatCompletionLog); - }) - .toSingle(); - - } else return edgeChain.toSingle(); - } - - @PostMapping( - value = "/chat-completion-stream", - consumes = {MediaType.APPLICATION_JSON_VALUE}) - public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoint) { - - ChatCompletionRequest chatCompletionRequest = - ChatCompletionRequest.builder() - .model(openAiEndpoint.getModel()) - .temperature(openAiEndpoint.getTemperature()) - .messages(openAiEndpoint.getChatMessages()) - .stream(true) - .build(); - - this.openAiClient.setEndpoint(openAiEndpoint); - - SseEmitter emitter = new SseEmitter(); - ExecutorService executorService = Executors.newSingleThreadExecutor(); - - executorService.execute( - () -> { - try { - EdgeChain edgeChain = - openAiClient.createChatCompletionStream(chatCompletionRequest); - - AtomInteger chunks = AtomInteger.of(0); - - if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - - ChatCompletionLog chatCompletionLog = new ChatCompletionLog(); - chatCompletionLog.setName(openAiEndpoint.getChainName()); - chatCompletionLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); - chatCompletionLog.setInput(StringUtils.join(openAiEndpoint.getChatMessages())); - chatCompletionLog.setModel(openAiEndpoint.getModel()); - chatCompletionLog.setCreatedAt(LocalDateTime.now()); - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("<|im_start|>"); - - for (ChatMessage chatMessage : openAiEndpoint.getChatMessages()) { - stringBuilder.append(chatMessage.getContent()); - } - EncodingRegistry registry = Encodings.newDefaultEncodingRegistry(); - Encoding enc = registry.getEncoding(EncodingType.CL100K_BASE); - - List strings = new ArrayList<>(); - for (ChatMessage chatMessage : openAiEndpoint.getChatMessages()) { - strings.add(chatMessage.getContent()); - } - - chatCompletionLog.setPromptTokens((long) enc.countTokens(stringBuilder.toString())); - - StringBuilder content = new StringBuilder(); - - Observable obs = edgeChain.getScheduledObservable(); - - obs.subscribe( - res -> { - try { - - emitter.send(res); - - chunks.incrementAndGet(); - content.append(res.getChoices().get(0).getMessage().getContent()); - - if (Objects.nonNull(res.getChoices().get(0).getFinishReason())) { - - emitter.complete(); - - chatCompletionLog.setType(res.getObject()); - chatCompletionLog.setContent(content.toString()); - chatCompletionLog.setCompletedAt(LocalDateTime.now()); - chatCompletionLog.setTotalTokens( - chunks.get() + chatCompletionLog.getPromptTokens()); - - Duration duration = - Duration.between( - chatCompletionLog.getCreatedAt(), - chatCompletionLog.getCompletedAt()); - chatCompletionLog.setLatency(duration.toMillis()); - - chatCompletionLogService.saveOrUpdate(chatCompletionLog); - } - - } catch (final Exception e) { - emitter.completeWithError(e); - } - }); - } else { - - Observable obs = edgeChain.getScheduledObservable(); - obs.subscribe( - res -> { - try { - emitter.send(res); - if (Objects.nonNull(res.getChoices().get(0).getFinishReason())) { - emitter.complete(); - } - - } catch (final Exception e) { - emitter.completeWithError(e); - } - }); - } - - } catch (final Exception e) { - emitter.completeWithError(e); - } - }); - - executorService.shutdown(); - return emitter; - } - - @PostMapping("/completion") - public Single completion(@RequestBody OpenAiEndpoint openAiEndpoint) { - - CompletionRequest completionRequest = - CompletionRequest.builder() - .prompt(openAiEndpoint.getInput()) - .model(openAiEndpoint.getModel()) - .temperature(openAiEndpoint.getTemperature()) - .build(); - - this.openAiClient.setEndpoint(openAiEndpoint); - - EdgeChain edgeChain = openAiClient.createCompletion(completionRequest); - - return edgeChain.toSingle(); - } - - @PostMapping("/embeddings") - public Single embeddings(@RequestBody OpenAiEndpoint openAiEndpoint) - throws SQLException { - - this.openAiClient.setEndpoint(openAiEndpoint); - - EdgeChain edgeChain = - openAiClient.createEmbeddings( - new OpenAiEmbeddingRequest(openAiEndpoint.getModel(), openAiEndpoint.getInput())); - - if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - - EmbeddingLog embeddingLog = new EmbeddingLog(); - embeddingLog.setCreatedAt(LocalDateTime.now()); - embeddingLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); - embeddingLog.setModel(openAiEndpoint.getModel()); - - return edgeChain - .doOnNext( - e -> { - embeddingLog.setPromptTokens(e.getUsage().getPrompt_tokens()); - embeddingLog.setCompletedAt(LocalDateTime.now()); - embeddingLog.setTotalTokens(e.getUsage().getTotal_tokens()); - - Duration duration = - Duration.between(embeddingLog.getCreatedAt(), embeddingLog.getCompletedAt()); - embeddingLog.setLatency(duration.toMillis()); - - embeddingLogService.saveOrUpdate(embeddingLog); - }) - .toSingle(); - } - - return edgeChain.toSingle(); - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/supabase/SupabaseController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/supabase/SupabaseController.java deleted file mode 100644 index 49f4ecb26..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/supabase/SupabaseController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.edgechain.service.controllers.supabase; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import com.edgechain.lib.supabase.security.JwtHelper; -import com.edgechain.lib.supabase.services.UserService; -import java.util.HashMap; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -@RestController("Service SupabaseController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/supabase") -public class SupabaseController { - - @Autowired private UserService userService; - - @Autowired private JwtHelper jwtHelper; - - @PostMapping("/signup") - public SupabaseUser signup(@RequestBody Credential credential) { - return this.userService.signup(credential); - } - - @PostMapping("/login") - public AuthenticatedResponse login(@RequestBody Credential credential) { - return this.userService.login(credential); - } - - @PostMapping("/refreshToken") - public AuthenticatedResponse refreshToken(@RequestBody HashMap mapper) { - return this.userService.refreshToken(mapper.get("refreshToken")); - } - - @PostMapping("/signout") - @PreAuthorize("hasAnyAuthority('authenticated')") - public void signOut(@RequestBody HashMap mapper) { - String token = mapper.get("token"); - if (token != null) { - this.userService.signOut(token); - } - } -} diff --git a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java b/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java deleted file mode 100644 index f7ef9660b..000000000 --- a/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.edgechain.service.controllers.wiki; - -import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; -import com.edgechain.lib.wiki.client.WikiClient; -import com.edgechain.lib.wiki.response.WikiResponse; -import io.reactivex.rxjava3.core.Single; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; - -@RestController("Service WikiController") -@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/wiki") -public class WikiController { - - @PostMapping( - value = "/page-content", - consumes = {MediaType.APPLICATION_JSON_VALUE}, - produces = {MediaType.APPLICATION_JSON_VALUE}) - public Single wikiContent(@RequestBody WikiEndpoint wikiEndpoint) { - EdgeChain edgeChain = - new WikiClient(wikiEndpoint).getPageContent(wikiEndpoint.getInput()); - return edgeChain.toSingle(); - } -} diff --git a/FlySpring/edgechain-app/src/main/resources/application.properties b/FlySpring/edgechain-app/src/main/resources/application.properties deleted file mode 100644 index 86cead832..000000000 --- a/FlySpring/edgechain-app/src/main/resources/application.properties +++ /dev/null @@ -1,13 +0,0 @@ -spring.main.allow-bean-definition-overriding=true -spring.banner.location=classpath:banner.txt -spring.mvc.async.request-timeout=600000 -spring.servlet.multipart.max-file-size=70MB -spring.servlet.multipart.max-request-size=100MB -spring.jackson.default-property-inclusion=NON_NULL -logging.level.org.apache.tika.parser.pdf=error -logging.level.org.apache.pdfbox=error -logging.level.org.apache.fontbox.ttf.CmapSubtable=error -spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false -spring.jpa.hibernate.ddl-auto=none -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.data.redis.repositories.enabled=false \ No newline at end of file diff --git a/FlySpring/edgechain-app/src/main/resources/banner.txt b/FlySpring/edgechain-app/src/main/resources/banner.txt deleted file mode 100644 index e3580b9cc..000000000 --- a/FlySpring/edgechain-app/src/main/resources/banner.txt +++ /dev/null @@ -1,6 +0,0 @@ - ______ __ ________ _ - / ____/___/ /___ ____ / ____/ /_ ____ _(_)___ - / __/ / __ / __ `/ _ \ / / / __ \/ __ `/ / __ \ - / /___/ /_/ / /_/ / __/ / /___/ / / / /_/ / / / / / -/_____/\__,_/\__, /\___/ \____/_/ /_/\__,_/_/_/ /_/ - /____/ diff --git a/FlySpring/edgechain-app/src/main/resources/de-sent.zip b/FlySpring/edgechain-app/src/main/resources/de-sent.zip deleted file mode 100644 index 9e8dfa5bc..000000000 Binary files a/FlySpring/edgechain-app/src/main/resources/de-sent.zip and /dev/null differ diff --git a/FlySpring/edgechain-app/src/main/resources/en-sent.zip b/FlySpring/edgechain-app/src/main/resources/en-sent.zip deleted file mode 100644 index e89076be5..000000000 Binary files a/FlySpring/edgechain-app/src/main/resources/en-sent.zip and /dev/null differ diff --git a/FlySpring/edgechain-app/src/main/resources/fr-sent.zip b/FlySpring/edgechain-app/src/main/resources/fr-sent.zip deleted file mode 100644 index 7ca04d3d2..000000000 Binary files a/FlySpring/edgechain-app/src/main/resources/fr-sent.zip and /dev/null differ diff --git a/FlySpring/edgechain-app/src/main/resources/glowroot.zip b/FlySpring/edgechain-app/src/main/resources/glowroot.zip deleted file mode 100644 index 00b2b7fc1..000000000 Binary files a/FlySpring/edgechain-app/src/main/resources/glowroot.zip and /dev/null differ diff --git a/FlySpring/edgechain-app/src/main/resources/it-sent.zip b/FlySpring/edgechain-app/src/main/resources/it-sent.zip deleted file mode 100644 index 446a3a4ec..000000000 Binary files a/FlySpring/edgechain-app/src/main/resources/it-sent.zip and /dev/null differ diff --git a/FlySpring/edgechain-app/src/main/resources/nl-sent.zip b/FlySpring/edgechain-app/src/main/resources/nl-sent.zip deleted file mode 100644 index f5f28f0f6..000000000 Binary files a/FlySpring/edgechain-app/src/main/resources/nl-sent.zip and /dev/null differ diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java deleted file mode 100644 index e6edef4d7..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.edgechain.chunker; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.chunk.Chunker; -import com.edgechain.lib.chunk.enums.LangType; - -@SpringBootTest -public class ChunkerTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - @DisplayName("Test By Chunk Size") - public void chunker_ByChunkSize_ReturnExpectedValue(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = "This is a test string for chunking."; - Chunker chunker = new Chunker(input); - int chunkSize = 5; - - String[] result = chunker.byChunkSize(chunkSize); - - String[] expected = {"This", "is a", "test", "strin", "g for", "chun", "king."}; - assertArrayEquals(expected, result); - } - - @Test - @DisplayName("Test By Sentence") - public void chunker_BySentence_ReturnExpectedValue(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = "This is sentence one. Sentence two. Sentence three."; - Chunker chunker = new Chunker(input); - LangType langType = LangType.EN; - - String[] result = chunker.bySentence(langType); - - String[] expected = {"This is sentence one.", "Sentence two.", "Sentence three."}; - assertArrayEquals(expected, result); - } - - @Test - @DisplayName("Test By Chunk Size With Empty Input ") - public void chunker_ByChunkSizeWithEmptyInput_ReturnEmptyArray(TestInfo testInfo) - throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = ""; - Chunker chunker = new Chunker(input); - int chunkSize = 5; - - String[] result = chunker.byChunkSize(chunkSize); - - String[] expected = {}; - assertArrayEquals(expected, result); - } - - @Test - @DisplayName("Test By Sentence With Empty Input ") - public void chunker_BySentenceWithEmptyInput_ReturnEmptyArray(TestInfo testInfo) - throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = "This is a test."; - Chunker chunker = new Chunker(input); - int chunkSize = 100; - - String[] result = chunker.byChunkSize(chunkSize); - - String[] expected = {"This is a test."}; - assertArrayEquals(expected, result); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java deleted file mode 100644 index e4d0527aa..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.edgechain.codeInterpreter; - -import static org.junit.Assert.assertFalse; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; - -public class CodeInterpreterTest { - - @Test - @DisplayName("Test concatStrings method in JSONnet") - public void test_extract_method() throws Exception { - String inputJsonnet = - "local extract(example, prompt) =\n" - + " local result = example + \" \" + prompt;\n" - + " result;\n" - + "{ \"extract\": extract(\" You are a Reasoning + Acting (React) Chain Bot. You have" - + " to be interactive so ask the queries one by one from the user to reach to the final" - + " answer.\", \" Question:what is 10+2 ? \") }"; - - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - jsonnetLoader.load(inputStream); - - String extractedValue = jsonnetLoader.get("extract"); - assertNotNull(extractedValue); - - // assert - String expectedOutput = - " You are a Reasoning + Acting (React) Chain Bot. You have to be interactive so ask the" - + " queries one by one from the user to reach to the final answer. Question:what is" - + " 10+2 ? "; - assertEquals(expectedOutput, extractedValue); - assertTrue(extractedValue.contains("You are a Reasoning")); - assertTrue(extractedValue.contains("Question:what is 10+2 ?")); - } - - @Test - @DisplayName("Test extraction with empty questions") - public void test_empty_example_extraction() throws Exception { - - String prompt = "Question: What is 2 + 2?"; - String inputJsonnet = - "local extract(example, prompt) =\n" - + " local result = example + \" \" + prompt;\n" - + " result;\n" - + "{ \"extract\": extract(\" You are a Reasoning + Acting (React) Chain Bot. You have" - + " to be interactive so ask the queries one by one from the user to reach to the final" - + " answer.\", \" \") }"; - - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - jsonnetLoader.load(inputStream); - - String extractedValue = jsonnetLoader.get("extract"); - assertNotNull(extractedValue); - assertFalse(extractedValue.contains(prompt)); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/EvalTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/EvalTest.java deleted file mode 100644 index 5ed89a313..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/EvalTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.edgechain.codeInterpreter; - -import org.junit.jupiter.api.Test; - -import com.edgechain.lib.codeInterpreter.Eval; - -import static org.junit.jupiter.api.Assertions.*; - -public class EvalTest { - - @Test - public void testEvaluateExpression_Addition() { - double result = Eval.evaluateExpression("2 + 2"); - assertEquals(4.0, result, 0.0001); - } - - @Test - public void testEvaluateExpression_ComplexExpression() { - double result = Eval.evaluateExpression("(10 + 5) * 2 - (3 / 1)"); - assertEquals(27.0, result, 0.0001); - } - - @Test - public void testEvaluateExpression_DivideByZero() { - - assertThrows( - ArithmeticException.class, - () -> { - Eval.evaluateExpression("1 / 0"); - }); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonFormat/JsonFormatTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonFormat/JsonFormatTest.java deleted file mode 100644 index d417a0d4c..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonFormat/JsonFormatTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.edgechain.jsonFormat; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.jsonFormat.request.FunctionRequest; -import com.edgechain.lib.jsonFormat.request.Message; -import com.edgechain.lib.jsonFormat.request.OpenApiFunctionRequest; -import com.edgechain.lib.jsonFormat.request.Parameters; -import com.edgechain.lib.openai.request.ChatMessage; -import com.edgechain.lib.openai.response.ChatCompletionChoice; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -@SpringBootTest -public class JsonFormatTest { - - @Test - @DisplayName("Test if the extracted JSON is valid") - public void testExtract_ValidInput_ReturnsValidJSON(TestInfo testInfo) { - System.out.println("======== " + testInfo.getDisplayName() + " ========"); - - // Valid JSON response - String validGptResponse = - "{\"action\": {\"reason\": \"I have a strong starting hand with two aces\", \"type\":" - + " \"raise\"}, \"amount\": 50}"; - testExtract(validGptResponse, true); - } - - @Test - @DisplayName("Test if the extracted JSON is invalid") - public void testExtract_InvalidInput_ReturnsNull(TestInfo testInfo) { - System.out.println("======== " + testInfo.getDisplayName() + " ========"); - - // Invalid JSON response - String invalidGptResponse = - "{\"action\": {\"reason\": \"I have a strong starting hand with two aces\", \"type\":" - + " \"raise\", \"amount\": 50"; - testExtract(invalidGptResponse, false); - } - - @Test - @DisplayName("Test open api function request") - public void testOpenApi_FunctionRequest_ReturnsValidObject(TestInfo testInfo) { - - System.out.println("======== " + testInfo.getDisplayName() + " ========"); - - // Create sample messages - List messages = new ArrayList<>(); - messages.add(new Message("system", "System message")); - messages.add(new Message("user", "User message")); - - // Create a sample function - FunctionRequest function = - new FunctionRequest( - "reply_user", "Reply to user's query", new Parameters("object", "userFormat")); - - // Create an OpenApiFunctionRequest - OpenApiFunctionRequest request = - new OpenApiFunctionRequest( - "gpt-3.5-turbo-0613", messages, 0.7, Collections.singletonList(function), "auto"); - - // Verify expected values - assertEquals("gpt-3.5-turbo-0613", request.getModel()); - assertNotNull(request.getMessages()); - assertEquals(2, request.getMessages().size()); - assertEquals(0.7, request.getTemperature()); - assertNotNull(request.getFunctions()); - assertEquals(1, request.getFunctions().size()); - assertEquals("auto", request.getFunction_call()); - } - - @Test - @DisplayName("Test function request") - public void test_FunctionRequest_ReturnsValidObject(TestInfo testInfo) { - - System.out.println("======== " + testInfo.getDisplayName() + " ========"); - - // Create a sample parameters object - Parameters parameters = new Parameters("object", "userFormat"); - - // Create a FunctionRequest - FunctionRequest function = - new FunctionRequest("reply_user", "Reply to user's query", parameters); - - // Verify expected values - assertEquals("reply_user", function.getName()); - assertEquals("Reply to user's query", function.getDescription()); - assertNotNull(function.getParameters()); - } - - // test case helper method - private void testExtract(String response, boolean expectValidJson) { - ChatCompletionChoice chatCompletionChoice = new ChatCompletionChoice(); - chatCompletionChoice.setIndex(0); - chatCompletionChoice.setMessage(new ChatMessage("user", response)); - chatCompletionChoice.setFinishReason("stop"); - - ChatCompletionResponse chatCompletionResponse = new ChatCompletionResponse(); - chatCompletionResponse.setChoices(Collections.singletonList(chatCompletionChoice)); - chatCompletionResponse.setModel("gpt-3.5-turbo"); - - String result = chatCompletionResponse.getChoices().get(0).getMessage().getContent(); - - assertNotNull(result, "Extracted JSON should not be null."); - - // Verify if the response is a valid JSON string - ObjectMapper objectMapper = new ObjectMapper(); - try { - JsonNode jsonNode = objectMapper.readTree(result); - if (expectValidJson) { - assertTrue(jsonNode.isObject(), "The response should be a valid JSON object."); - assertEquals( - "I have a strong starting hand with two aces", - jsonNode.get("action").get("reason").asText(), - "Incorrect reason in the extracted JSON."); - assertEquals( - "raise", - jsonNode.get("action").get("type").asText(), - "Incorrect type in the extracted JSON."); - assertEquals(50, jsonNode.get("amount").asInt(), "Incorrect amount in the extracted JSON."); - } else { - fail( - "Expected an exception for invalid JSON, but parsing succeeded with result: " - + jsonNode); - } - } catch (Exception e) { - if (expectValidJson) { - fail("Failed to parse the response JSON: " + e.getMessage()); - } else { - // Successfully caught an exception for invalid JSON - System.out.println( - "Successfully caught the expected exception for invalid JSON: " + e.getMessage()); - } - } - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java deleted file mode 100644 index 5dcdcbfc8..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.edgechain.jsonnet; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import com.edgechain.lib.jsonnet.JsonnetArgs; -import com.edgechain.lib.jsonnet.enums.DataType; -import org.json.JSONArray; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; - -@SpringBootTest -public class JsonnetLoaderTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - @DisplayName("Test Load Jsonnet file") - public void jsonLoader_LoadJsonnet_ReturnExpectedValue(TestInfo testInfo) { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String inputJsonnet = "{ \"key\": \"value\" }"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - - jsonnetLoader.load(inputStream); - String value = jsonnetLoader.get("key"); - - assertEquals("value", value); - } - - @Test - @DisplayName("Test Load Jsonnet file with array") - public void jsonLoader_LoadJsonnetWithArray_ReturnExpectedValue(TestInfo testInfo) { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String inputJsonnet = "{ \"array\": [1, 2, 3] }"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - - jsonnetLoader.load(inputStream); - JSONArray array = jsonnetLoader.getArray("array"); - - assertNotNull(array); - assertEquals(3, array.length()); - assertEquals(1, array.getInt(0)); - assertEquals(2, array.getInt(1)); - assertEquals(3, array.getInt(2)); - } - - @Test - @DisplayName("Test Load Jsonnet file with object") - public void jsonLoader_LoadJsonnetWithObject_ReturnExpectedValue(TestInfo testInfo) { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String inputJsonnet = "{ \"number\": 42 }"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - - jsonnetLoader.load(inputStream); - int number = jsonnetLoader.getInt("number"); - - assertEquals(42, number); - } - - @Test - @DisplayName("Test Load Jsonnet file with boolean") - public void jsonLoader_LoadJsonnetWithBoolean_ReturnExpectedValue(TestInfo testInfo) { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String inputJsonnet = "{ \"flag\": true }"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - - jsonnetLoader.load(inputStream); - boolean flag = jsonnetLoader.getBoolean("flag"); - - assertTrue(flag); - } - - // Test for accessing external variable with xtrasonnet library - @Test - @DisplayName("Test external variable with xtrasonnet") - public void test_external_variable_xtrasonnet() throws Exception { - String inputJsonnet = "local externalVar = payload.x;\n{externalVar: externalVar}"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - jsonnetLoader.put("x", new JsonnetArgs(DataType.INTEGER, "5")); - jsonnetLoader.load(inputStream); - String externalVar = jsonnetLoader.get("externalVar"); - assertNotNull(externalVar); - assertEquals(externalVar, "5"); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java deleted file mode 100644 index cf8c8be36..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.edgechain.openai; - -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.openai.request.ChatCompletionRequest; -import com.edgechain.lib.openai.request.ChatMessage; -import com.edgechain.lib.openai.response.ChatCompletionResponse; -import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.utils.JsonUtils; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reactivex.rxjava3.observers.TestObserver; -import org.junit.jupiter.api.*; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.server.LocalServerPort; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class OpenAiClientTest { - - @LocalServerPort private int port; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @BeforeEach - public void setup() { - System.setProperty("server.port", "" + port); - } - - @ParameterizedTest - @ValueSource(classes = {ChatCompletionRequest.class}) - @DisplayName("Test ChatCompletionRequest Json Request") - @Order(1) - public void testOpenAiClient_ChatCompletionRequest_ShouldMatchRequestBody(Class clazz) - throws IOException { - - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - ChatCompletionRequest chatCompletionRequest = - ChatCompletionRequest.builder() - .model("gpt-3.5-turbo") - .temperature(0.7) - .messages( - List.of( - new ChatMessage( - "user", "Can you write two unique sentences on Java Language?"))) - .stream(false) - .build(); - - byte[] bytes = - Files.readAllBytes(Paths.get("src/test/java/resources/" + clazz.getSimpleName() + ".json")); - String originalJson = new String(bytes); - - assertEquals( - mapper.readTree(JsonUtils.convertToString(chatCompletionRequest)), - mapper.readTree(originalJson)); - } - - @ParameterizedTest - @ValueSource(classes = {ChatCompletionResponse.class}) - @DisplayName("Test ChatCompletionResponse POJO") - @Order(2) - public void testOpenAiClient_ChatCompletionResponse_ShouldMappedToPOJO(Class clazz) { - assertDoesNotThrow( - () -> { - byte[] bytes = - Files.readAllBytes( - Paths.get("src/test/java/resources/" + clazz.getSimpleName() + ".json")); - String json = new String(bytes); - - ChatCompletionResponse chatCompletionResponse = - JsonUtils.convertToObject(json, ChatCompletionResponse.class); - logger.info("" + chatCompletionResponse); // Printing the object - }); - } - - @Test - @DisplayName("Test OpenAiEndpoint With Retry Mechanism") - @Order(3) - public void testOpenAiClient_WithRetryMechanism_ShouldThrowExceptionWithRetry(TestInfo testInfo) - throws InterruptedException { - - System.out.println("======== " + testInfo.getDisplayName() + " ========"); - - OpenAiEndpoint endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - "", // apiKey - "", // orgId - "gpt-3.5-turbo", - "user", - 0.7, - false, - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - TestObserver test = - endpoint - .chatCompletion( - "Can you write two unique sentences on Java Language?", "TestChain", null) - .test(); - - // Step 4: To act & assert - test.await(); - - // Assert - test.assertError(Exception.class); - } - - @Test - @DisplayName("Test OpenAiEndpoint With No Retry Mechanism") - @Order(4) - public void testOpenAiClient_WithNoRetryMechanism_ShouldThrowExceptionWithNoRetry( - TestInfo testInfo) throws InterruptedException { - - System.out.println("======== " + testInfo.getDisplayName() + " ========"); - - // Step 1 : Create OpenAi Endpoint - OpenAiEndpoint endpoint = - new OpenAiEndpoint( - OPENAI_CHAT_COMPLETION_API, - "", // apiKey - "", // orgId - "gpt-3.5-turbo", - "user", - 0.7, - false); - - TestObserver test = - endpoint - .chatCompletion( - "Can you write two unique sentences on Java Language?", "TestChain", null) - .test(); - - // Step 4: To act & assert - test.await(); - - // Assert - test.assertError(Exception.class); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/PluginParserTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/PluginParserTest.java deleted file mode 100644 index 381de1940..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/PluginParserTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.edgechain.parser; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.List; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.openai.plugin.parser.PluginParser; - -@SpringBootTest -public class PluginParserTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - @DisplayName("Test Plugin Parser") - public void pluginParser_Parse_ReturnsExpectedValue(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String nameForModel = "PluginName"; - String openAPISpec = "{\"choices\":[{\"text\":\"Sample response\"}]}"; - - String result = PluginParser.parse(nameForModel, openAPISpec); - - String expected = - "Action: PluginName\nObservation: {\"choices\":[{\"text\":\"Sample response\"}]}"; - assertEquals(expected, result); - } - - @Test - @DisplayName("Test Plugin Parser No Action") - public void pluginParser_ParseNoAction_ReturnsExpectedValue(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - // Sample input response in JSON format - String response = - "{ \"choices\": [{ \"text\": \"Action Input: https://example.com/endpoint\" }, { \"text\":" - + " \"Action Input: http://test.com\" }] }"; - - List urlList = PluginParser.extractUrls(response); - - // Check the size of the URL list and the presence of URLs - assertEquals(1, urlList.size()); - assertTrue(urlList.contains("https://example.com/endpoint")); - } - - @Test - @DisplayName("Test Plugin Parser Get Final Answer") - public void pluginParser_GetFinalAnswer_ReturnsExpectedValue(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - // Sample input response in JSON format with the final answer as the first - // choice - String response = - "{ \"choices\": [{ \"text\": \"Final Answer: Success\" }, { \"text\": \"Action Input:" - + " https://example.com/endpoint\" }, { \"text\": \"Not a Final Answer\" }] }"; - - String finalAnswer = PluginParser.getFinalAnswer(response); - - assertEquals("Final Answer: Success", finalAnswer); - } - - @Test - @DisplayName("Test Plugin Parser Get Final Answer Not Found") - public void pluginParser_GetFinalAnswerNotFound_ReturnsNull(TestInfo testInfo) { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - // Sample input response in JSON format - String response = - "{ \"choices\": [{ \"text\": \"Action Input: https://example.com/endpoint\" }, { \"text\":" - + " \"Not a Final Answer\" }] }"; - - String finalAnswer = PluginParser.getFinalAnswer(response); - - assertEquals(null, finalAnswer); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/ScratchpadTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/ScratchpadTest.java deleted file mode 100644 index 1c08f09cf..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/ScratchpadTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.edgechain.parser; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.openai.parser.Scratchpad; - -@SpringBootTest -public class ScratchpadTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - @DisplayName("Test Get Action Content") - public void Scratchpad_GetActionContent_ReturnsExpectedValue(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = - "Thought 1: Lorem ipsum\n" - + "Action 1: [Search: Content for action 1]\n" - + "Observation 1: Some observation"; - Scratchpad scratchpad = new Scratchpad(input); - - String actionContent = scratchpad.getActionContent(); - - assertEquals("Search: Content for action 1", actionContent); - } - - @Test - @DisplayName("Test Get Action Content No Action") - public void Scratchpad_GetActionContentNoAction_ReturnsNull(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = - "Thought 1: Lorem ipsum\nAction 1: [Some other action]\nObservation 1: Some observation"; - Scratchpad scratchpad = new Scratchpad(input); - - String actionContent = scratchpad.getActionContent(); - - assertNull(actionContent); - } - - @Test - @DisplayName("Test Observation Replacer Update Existing Observation") - public void scratchpad_ObservationReplacer_UpdateExistingObservation(TestInfo testInfo) - throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = - "Thought 1: Lorem ipsum\n" - + "Action 1: [Search: Content for action 1]\n" - + "Observation 1: Initial observation"; - Scratchpad scratchpad = new Scratchpad(input); - - scratchpad.observationReplacer("Updated observation"); - - assertEquals("Observation: Updated observation", scratchpad.getScratchpadList().get(2)); - } - - @Test - @DisplayName("Test Observation Replacer Add New Observation") - public void scratchpad_ObservationReplacer_AddNewObservation(TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String input = "Thought 1: Lorem ipsum\nAction 1: [Search: Content for action 1]"; - Scratchpad scratchpad = new Scratchpad(input); - - scratchpad.observationReplacer("New observation"); - - assertEquals("Observation: New observation", scratchpad.getScratchpadList().get(2)); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/StringParserTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/StringParserTest.java deleted file mode 100644 index e7f4162ad..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/parser/StringParserTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.edgechain.parser; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.openai.parser.StringParser; - -@SpringBootTest -public class StringParserTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - @DisplayName("Test string parser Get Thought Content") - public void StringParser_GetThoughtContent_ReturnsExpectedValue() { - - logger.info("======== " + "Test Get Thought Content" + " ========"); - - String input = - "Thought 1: Lorem ipsum\n" - + "Action 1: [Search: Content for action 1]\n" - + "Observation 1: Some observation"; - StringParser parser = new StringParser(input); - - String[] thoughts = parser.getThoughts(); - - assertEquals(1, thoughts.length); - assertEquals("Thought 1: Lorem ipsum", thoughts[0]); - } - - @Test - @DisplayName("Test string parser Get Action Content") - public void StringParser_GetActionContent_ReturnsExpectedValue() { - - logger.info("======== " + "Test Get Action Content" + " ========"); - - String input = - "Thought 1: Lorem ipsum\n" - + "Action 1: [Search: Content for action 1]\n" - + "Observation 1: Some observation"; - StringParser parser = new StringParser(input); - - String[] actions = parser.getActions(); - - assertEquals(1, actions.length); - assertEquals("Action 1: [Search: Content for action 1]", actions[0]); - } - - @Test - @DisplayName("Test string parser Get Observation Content") - public void StringParser_GetObservationContent_ReturnsExpectedValue() { - - logger.info("======== " + "Test Get Observation Content" + " ========"); - - String input = - "Thought 1: Lorem ipsum\n" - + "Action 1: [Search: Content for action 1]\n" - + "Observation 1: Some observation"; - StringParser parser = new StringParser(input); - - String[] observations = parser.getObservations(); - - assertEquals(1, observations.length); - assertEquals("Observation 1: Some observation", observations[0]); - } - - @Test - @DisplayName("Test string parser Get Final Answer") - public void StringParser_GetFinalAnswer_ReturnsExpectedValue() { - - logger.info("======== " + "Test Get Final Answer" + " ========"); - - String input = - "Thought 1: Lorem ipsum\nObservation 1: Some observation\nAction 1: Finish[Final Answer]"; - StringParser parser = new StringParser(input); - - String[] actions = parser.getActions(); - String finalAnswer = null; - - if (actions != null && actions.length > 0) { - // Check if the last action contains the final answer - String lastAction = actions[actions.length - 1]; - int startIndex = lastAction.indexOf("Finish["); - if (startIndex >= 0) { - finalAnswer = lastAction.substring(startIndex + 7); // 7 is the length of "Finish[" - int endIndex = finalAnswer.indexOf("]"); - if (endIndex >= 0) { - finalAnswer = finalAnswer.substring(0, endIndex); - } - } - } - - assertNotNull(finalAnswer); - assertEquals("Final Answer", finalAnswer); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java deleted file mode 100644 index 0f49fb8d6..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.edgechain.pinecone; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class PineconeClientTest {} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java deleted file mode 100644 index fc8de64ab..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.edgechain.reactChain; - -import com.edgechain.lib.jsonnet.JsonnetLoader; -import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@SpringBootTest -public class ReactChainTest { - - @Test - @DisplayName("Test extractAction method for Reach Chain") - public void test_extractAction_fromJsonnet() throws Exception { - String inputJsonnet = - "local extractAction(str) =\n" - + " local action = xtr.strings.substringBefore(xtr.strings.substringAfter(str," - + " \"[\"), \"]\");\n" - + " action;\n" - + "{ \"action\": extractAction(\"Thought 1: I need to search ABC and XYZ, and find" - + " which was started first.Action 1: Search[ABC]\") }"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - jsonnetLoader.load(inputStream); - String action = jsonnetLoader.get("action"); - assertNotNull(action); - assertEquals(action, "ABC"); - } - - @Test - @DisplayName("Test extractThought method for Reach Chain") - public void test_extractThought_fromJsonnet() throws Exception { - String inputJsonnet = - "local extractThought(str) =\n" - + " local thought = xtr.strings.substringAfter(xtr.strings.substringBefore(str," - + " \"Action\"), \":\");\n" - + " thought;\n" - + "{ \"thought\": extractThought(\"Thought 1:I need to search ABC and XYZ, and find" - + " which was started first.Action 1: Search[ABC]\") }"; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - jsonnetLoader.load(inputStream); - String thought = jsonnetLoader.get("thought"); - assertNotNull(thought); - assertEquals(thought, "I need to search ABC and XYZ, and find which was started first."); - } - - @Test - @DisplayName("Mapper search function test") - public void test_mapper() { - String inputJsonnet = - """ - local config = { - "edgechains.config": { - "mapper": { - "search": "udf.fn", - }, - }, - }; - local callFunction(funcName) = - local mapper = config["edgechains.config"].mapper; - mapper[funcName]; - local searchFunction = callFunction("search"); - { "searchFunction": searchFunction } - """; - InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); - JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); - jsonnetLoader.load(inputStream); - String searchFunction = jsonnetLoader.get("searchFunction"); - assertNotNull(searchFunction); - assertEquals(searchFunction, "udf.fn"); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/redis/RedisClientTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/redis/RedisClientTest.java deleted file mode 100644 index 91c4f56f4..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/redis/RedisClientTest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.edgechain.redis; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class RedisClientTest {} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/supabase/AuthControllerTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/supabase/AuthControllerTest.java deleted file mode 100644 index b65484b52..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/supabase/AuthControllerTest.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.edgechain.supabase; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.Optional; -import java.util.UUID; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; - -import com.edgechain.lib.supabase.entities.User; -import com.edgechain.lib.supabase.exceptions.SupabaseAuthException; -import com.edgechain.lib.supabase.exceptions.SupabaseUserExistException; -import com.edgechain.lib.supabase.repository.UserRepository; -import com.edgechain.lib.supabase.request.Credential; -import com.edgechain.lib.supabase.response.AuthenticatedResponse; -import com.edgechain.lib.supabase.response.SupabaseUser; -import com.edgechain.lib.supabase.services.SupabaseAuthService; -import com.edgechain.lib.supabase.services.impl.UserServiceImpl; -import com.edgechain.service.controllers.supabase.SupabaseController; - -@ExtendWith(MockitoExtension.class) -@SpringBootTest -public class AuthControllerTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Mock private UserRepository userRepository; - - @InjectMocks private SupabaseController supabaseController; - - @InjectMocks @Spy private UserServiceImpl userService; - - @Mock private SupabaseAuthService supabaseAuthService; - - @Test - @DisplayName("Test Signup with valid credential") - public void authController_SignupWithValidCredential_ReturnSupabaseUser(TestInfo testInfo) - throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - Credential testCredential = new Credential("test@example.com", "testPassword"); - - // Set up mock behavior for userRepository.findByEmail() to return an empty - // Optional (email doesn't exist) - when(userRepository.findByEmail(testCredential.getEmail())).thenReturn(Optional.empty()); - - // Set up mock behavior for supabaseAuthService.signUpWithEmail() - SupabaseUser expectedSupabaseUser = new SupabaseUser(); - expectedSupabaseUser.setId(UUID.randomUUID()); - expectedSupabaseUser.setEmail(testCredential.getEmail()); - when(supabaseAuthService.signUpWithEmail(testCredential)).thenReturn(expectedSupabaseUser); - - // Call the signup method of UserServiceImpl - SupabaseUser actualSupabaseUser = userService.signup(testCredential); - - // Verify the result - assertNotNull(actualSupabaseUser); - assertEquals(expectedSupabaseUser.getId(), actualSupabaseUser.getId()); - assertEquals(expectedSupabaseUser.getEmail(), actualSupabaseUser.getEmail()); - - // Verify that userRepository.findByEmail() was called with the test email - verify(userRepository, times(1)).findByEmail(testCredential.getEmail()); - - // Verify that supabaseAuthService.signUpWithEmail() was called with the test - // credential - verify(supabaseAuthService, times(1)).signUpWithEmail(testCredential); - } - - @Test - @DisplayName("Test Signup with existing email") - public void authController_SignupWithExistingEmail_ThrowSupabaseUserExistException( - TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - Credential testCredential = new Credential("existing@example.com", "testPassword"); - - // Mock the behavior of userRepository.findByEmail to return an optional - // containing a user - User existingUser = new User(); - existingUser.setEmail(testCredential.getEmail()); - when(userRepository.findByEmail(testCredential.getEmail())) - .thenReturn(Optional.of(existingUser)); - - // Call the signup method of UserServiceImpl - assertThrows( - SupabaseUserExistException.class, - () -> { - userService.signup(testCredential); - }); - - // Verify that userRepository.findByEmail() was called with the testCredential - verify(userRepository, times(1)).findByEmail(testCredential.getEmail()); - } - - @Test - @DisplayName("Test Login with valid credential") - public void authController_LoginWithValidCredential_ReturnAuthenticatedResponse(TestInfo testInfo) - throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - Credential testCredential = new Credential("test@example.com", "testPassword"); - - // Set up mock behavior for supabaseAuthService.signInWithEmail() - AuthenticatedResponse expectedResponse = new AuthenticatedResponse(); - expectedResponse.setAccess_token("testAccessToken"); - expectedResponse.setRefresh_token("testRefreshToken"); - expectedResponse.setToken_type("jwt"); - expectedResponse.setExpires_in(3600); - - when(supabaseAuthService.signInWithEmail(testCredential)).thenReturn(expectedResponse); - - // Call the login method directly - AuthenticatedResponse result = userService.login(testCredential); - - // Verify the result - assertNotNull(result); - assertEquals(expectedResponse, result); - - // Verify that supabaseAuthService.signInWithEmail() was called with the - // testCredential - verify(supabaseAuthService, times(1)).signInWithEmail(testCredential); - } - - @Test - @DisplayName("Test Login with invalid credential") - public void authController_LoginWithInvalidCredential_ThrowSupabaseAuthException( - TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - Credential testCredential = new Credential("test@example.com", "wrongPassword"); - - // Set up mock behavior for supabaseAuthService.signInWithEmail() to throw an - // exception - when(supabaseAuthService.signInWithEmail(testCredential)) - .thenThrow(new SupabaseAuthException("Invalid credentials")); - - // Call the login method directly - try { - userService.login(testCredential); - } catch (SupabaseAuthException e) { - // Verify that supabaseAuthService.signInWithEmail() was called with the - // testCredential - verify(supabaseAuthService, times(1)).signInWithEmail(testCredential); - return; - } - } - - @Test - @DisplayName("Test RefreshToken with valid refresh token") - public void authController_RefreshTokenWithValidRefreshToken_ReturnAuthenticatedResponse( - TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String refreshToken = "testRefreshToken"; - - // Set up mock behavior for supabaseAuthService.refreshToken() - AuthenticatedResponse expectedResponse = new AuthenticatedResponse(); - when(supabaseAuthService.refreshToken(refreshToken)).thenReturn(expectedResponse); - - // Call the refreshToken method of UserServiceImpl - AuthenticatedResponse actualResponse = userService.refreshToken(refreshToken); - - // Verify the result - assertNotNull(actualResponse); - assertEquals(expectedResponse, actualResponse); - - // Verify that supabaseAuthService.refreshToken() was called with the test - // refresh token - verify(supabaseAuthService, times(1)).refreshToken(refreshToken); - } - - @Test - @DisplayName("Test RefreshToken with invalid refresh token") - public void authController_RefreshTokenWithInvalidRefreshToken_ThrowSupabaseAuthException( - TestInfo testInfo) throws Exception { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - String refreshToken = "invalidRefreshToken"; - - // Set up mock behavior for supabaseAuthService.refreshToken() to throw an - // exception - when(supabaseAuthService.refreshToken(refreshToken)) - .thenThrow(new SupabaseAuthException("Invalid refresh token")); - - // Call the refreshToken method directly - assertThrows( - SupabaseAuthException.class, - () -> { - userService.refreshToken(refreshToken); - }); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java b/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java deleted file mode 100644 index 8d8b20a98..000000000 --- a/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.edgechain.wiki; - -import com.edgechain.lib.endpoint.impl.WikiEndpoint; -import io.reactivex.rxjava3.observers.TestObserver; -import org.junit.jupiter.api.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; -import static org.junit.jupiter.api.Assertions.*; - -import com.edgechain.lib.wiki.response.WikiResponse; -import org.springframework.boot.test.web.server.LocalServerPort; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class WikiClientTest { - - @LocalServerPort private int port; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @BeforeEach - public void setup() { - System.setProperty("server.port", "" + port); - } - - @Test - @DisplayName("Test WikiContent Method Returns WikiResponse") - @Order(1) - public void wikiControllerTest_TestWikiContentMethod_ReturnsWikiResponse(TestInfo testInfo) - throws InterruptedException { - - logger.info("======== " + testInfo.getDisplayName() + " ========"); - - // Prepare test data - WikiEndpoint wikiEndpoint = new WikiEndpoint(); - TestObserver test = wikiEndpoint.getPageContent("Barack Obama").test(); - - test.await(); - - logger.info(test.values().toString()); - - test.assertNoErrors(); - } -} diff --git a/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json b/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json deleted file mode 100644 index fe735f847..000000000 --- a/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "model" : "gpt-3.5-turbo", - "temperature" : 0.7, - "messages" : [ { - "role" : "user", - "content" : "Can you write two unique sentences on Java Language?" - } ], - "stream" : false -} \ No newline at end of file diff --git a/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionResponse.json b/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionResponse.json deleted file mode 100644 index e07f2951f..000000000 --- a/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionResponse.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "id" : "chatcmpl-7cCBttNGLwPkAMswN8074tMYdd3Zm", - "object" : "chat.completion", - "created" : 1689337681, - "model" : "gpt-3.5-turbo-0613", - "choices" : [ { - "index" : 0, - "message" : { - "role" : "assistant", - "content" : "1. Java language is a versatile, object-oriented programming language used for developing various applications such as mobile applications, desktop applications, and web services.\n2. Known for its write once, run anywhere feature, Java offers robust security and cross-platform compatibility making it a popular choice among developers." - }, - "finish_reason" : "stop" - } ], - "usage" : { - "prompt_tokens" : 880, - "total_tokens" : 1396 - } -} \ No newline at end of file diff --git a/FlySpring/edgechain-app/src/test/java/resources/train/train_docs.txt b/FlySpring/edgechain-app/src/test/java/resources/train/train_docs.txt deleted file mode 100644 index 5653c54b5..000000000 --- a/FlySpring/edgechain-app/src/test/java/resources/train/train_docs.txt +++ /dev/null @@ -1,1000 +0,0 @@ -anarchism is a political philosophy that advocates self-governed societies with voluntary institutions . these are often described as stateless societies , but several authors have defined them more specifically as institutions based on non-hierarchical free associations . anarchism holds the state to be undesirable , unnecessary , or harmful . while anti-statism is central , anarchism entails opposing authority or hierarchical organisation in the conduct of human relations , including , but not limited to , the state system . -as an anti-dogmatic philosophy , anarchism draws on many currents of thought and strategy . anarchism does not offer a fixed body of doctrine from a single particular world view , instead fluxing and flowing as a philosophy . there are many types and traditions of anarchism , not all of which are mutually exclusive . anarchist schools of thought can differ fundamentally , supporting anything from extreme individualism to complete collectivism . strains of anarchism have often been divided into the categories of social and individualist anarchism or similar dual classifications . anarchism is usually considered a radical left-wing ideology , and much of anarchist economics and anarchist legal philosophy reflect anti-authoritarian interpretations of communism , collectivism , syndicalism , mutualism , or participatory economics . -etymology and terminology . -the term `` anarchism '' is a compound word composed from the word `` anarchy '' and the suffix '' - ism '' , themselves derived respectively from the greek , i.e. `` anarchy '' -lrb- from , `` anarchos '' , meaning `` one without rulers '' ; from the privative prefix ἀν - -lrb- `` an - '' , i.e. `` without '' -rrb- and , `` archos '' , i.e. `` leader '' , `` ruler '' ; -lrb- cf. `` archon '' or , `` arkhē '' , i.e. `` authority '' , `` sovereignty '' , `` realm '' , `` magistracy '' -rrb- -rrb- and the suffix or -lrb- '' - ismos '' , '' - isma '' , from the verbal infinitive suffix - ίζειν , '' - izein '' -rrb- . the first known use of this word was in 1539 . various factions within the french revolution labelled opponents as anarchists -lrb- as robespierre did the hébertists -rrb- although few shared many views of later anarchists . there would be many revolutionaries of the early nineteenth century who contributed to the anarchist doctrines of the next generation , such as william godwin and wilhelm weitling , but they did not use the word `` anarchist '' or `` anarchism '' in describing themselves or their beliefs . -the first political philosopher to call himself an anarchist was pierre-joseph proudhon , marking the formal birth of anarchism in the mid-nineteenth century . since the 1890s , and beginning in france , the term `` libertarianism '' has often been used as a synonym for anarchism and was used almost exclusively in this sense until the 1950s in the united states ; its use as a synonym is still common outside the united states . on the other hand , some use `` libertarianism '' to refer to individualistic free-market philosophy only , referring to free-market anarchism as `` libertarian anarchism '' . -the earliest anarchist themes can be found in the 6th century bc , among the works of taoist philosopher laozi , and in later centuries by zhuangzi and bao jingyan . zhuangzi 's philosophy has been described by various sources as anarchist . zhuangzi wrote , `` a petty thief is put in jail . a great brigand becomes a ruler of a nation . '' diogenes of sinope and the cynics , their contemporary zeno of citium , the founder of stoicism , also introduced similar topics . jesus is sometimes considered the first anarchist in the christian anarchist tradition . georges lechartier wrote that `` the true founder of anarchy was jesus christ and ... the first anarchist society was that of the apostles . '' in early islamic history , some manifestations of anarchic thought are found during the islamic civil war over the caliphate , where the kharijites insisted that the imamate is a right for each individual within the islamic society . later , some muslim scholars , such as amer al-basri and abu hanifa , led movements of boycotting the rulers , paving the way to the waqf -lrb- endowments -rrb- tradition , which served as an alternative to and asylum from the centralized authorities of the emirs . but such interpretations reverberates subversive religious conceptions like the aforementioned seemingly anarchistic taoist teachings and that of other anti-authoritarian religious traditions creating a complex relationship regarding the question as to whether or not anarchism and religion are compatible . this is exemplified when the glorification of the state is viewed as a form of sinful idolatry . -the french renaissance political philosopher étienne de la boétie wrote in his most famous work the `` discourse on voluntary servitude '' what some historians consider an important anarchist precedent . -the radical protestant christian gerrard winstanley and his group the diggers are cited by various authors as proposing anarchist social measures in the 17th century in england . the term `` anarchist '' first entered the english language in 1642 , during the english civil war , as a term of abuse , used by royalists against their roundhead opponents . by the time of the french revolution some , such as the `` enragés '' , began to use the term positively , in opposition to jacobin centralisation of power , seeing `` revolutionary government '' as oxymoronic . by the turn of the 19th century , the english word `` anarchism '' had lost its initial negative connotation . -modern anarchism sprang from the secular or religious thought of the enlightenment , particularly jean-jacques rousseau 's arguments for the moral centrality of freedom . -as part of the political turmoil of the 1790s in the wake of the french revolution , william godwin developed the first expression of modern anarchist thought . godwin was , according to peter kropotkin , `` the first to formulate the political and economical conceptions of anarchism , even though he did not give that name to the ideas developed in his work '' , while godwin attached his anarchist ideas to an early edmund burke . -godwin is generally regarded as the founder of the school of thought known as ` philosophical anarchism ' . he argued in `` political justice '' -lrb- 1793 -rrb- that government has an inherently malevolent influence on society , and that it perpetuates dependency and ignorance . he thought that the spread of the use of reason to the masses would eventually cause government to wither away as an unnecessary force . although he did not accord the state with moral legitimacy , he was against the use of revolutionary tactics for removing the government from power . rather , he advocated for its replacement through a process of peaceful evolution . -his aversion to the imposition of a rules-based society led him to denounce , as a manifestation of the people 's ` mental enslavement ' , the foundations of law , property rights and even the institution of marriage . he considered the basic foundations of society as constraining the natural development of individuals to use their powers of reasoning to arrive at a mutually beneficial method of social organisation . in each case , government and its institutions are shown to constrain the development of our capacity to live wholly in accordance with the full and free exercise of private judgment . -the french pierre-joseph proudhon is regarded as the first `` self-proclaimed '' anarchist , a label he adopted in his groundbreaking work , `` what is property ? , '' published in 1840 . it is for this reason that some claim proudhon as the founder of modern anarchist theory . he developed the theory of spontaneous order in society , where organisation emerges without a central coordinator imposing its own idea of order against the wills of individuals acting in their own interests ; his famous quote on the matter is , `` liberty is the mother , not the daughter , of order . '' in `` what is property ? '' proudhon answers with the famous accusation `` property is theft . '' in this work , he opposed the institution of decreed `` property '' -lrb- `` propriété '' -rrb- , where owners have complete rights to `` use and abuse '' their property as they wish . he contrasted this with what he called `` possession , '' or limited ownership of resources and goods only while in more or less continuous use . later , however , proudhon added that `` property is liberty , '' and argued that it was a bulwark against state power . his opposition to the state , organised religion , and certain capitalist practices inspired subsequent anarchists , and made him one of the leading social thinkers of his time . -the anarcho-communist joseph déjacque was the first person to describe himself as `` libertarian '' . unlike pierre-joseph proudhon , he argued that , `` it is not the product of his or her labour that the worker has a right to , but to the satisfaction of his or her needs , whatever may be their nature . '' in 1844 in germany the post-hegelian philosopher max stirner published the book , `` the ego and its own , '' which would later be considered an influential early text of individualist anarchism . french anarchists active in the 1848 revolution included anselme bellegarrigue , ernest coeurderoy , joseph déjacque and pierre joseph proudhon . -first international and the paris commune . -in europe , harsh reaction followed the revolutions of 1848 , during which ten countries had experienced brief or long-term social upheaval as groups carried out nationalist uprisings . after most of these attempts at systematic change ended in failure , conservative elements took advantage of the divided groups of socialists , anarchists , liberals , and nationalists , to prevent further revolt . in spain ramón de la sagra established the anarchist journal `` el porvenir '' in la coruña in 1845 which was inspired by proudhon ´ s ideas . the catalan politician francesc pi i margall became the principal translator of proudhon 's works into spanish and later briefly became president of spain in 1873 while being the leader of the democratic republican federal party . according to george woodcock `` these translations were to have a profound and lasting effect on the development of spanish anarchism after 1870 , but before that time proudhonian ideas , as interpreted by pi , already provided much of the inspiration for the federalist movement which sprang up in the early 1860 's . '' according to the `` encyclopedia britannica '' `` during the spanish revolution of 1873 , pi y margall attempted to establish a decentralized , or `` cantonalist , '' political system on proudhonian lines . '' -in 1864 the international workingmen 's association -lrb- sometimes called the `` first international '' -rrb- united diverse revolutionary currents including french followers of proudhon , blanquists , philadelphes , english trade unionists , socialists and social democrats . due to its links to active workers ' movements , the international became a significant organisation . karl marx became a leading figure in the international and a member of its general council . proudhon 's followers , the mutualists , opposed marx 's state socialism , advocating political abstentionism and small property holdings . woodcock also reports that the american individualist anarchists lysander spooner and william b. greene had been members of the first international . in 1868 , following their unsuccessful participation in the league of peace and freedom -lrb- lpf -rrb- , russian revolutionary mikhail bakunin and his collectivist anarchist associates joined the first international -lrb- which had decided not to get involved with the lpf -rrb- . they allied themselves with the federalist socialist sections of the international , who advocated the revolutionary overthrow of the state and the collectivization of property . -at first , the collectivists worked with the marxists to push the first international in a more revolutionary socialist direction . subsequently , the international became polarised into two camps , with marx and bakunin as their respective figureheads . bakunin characterised marx 's ideas as centralist and predicted that , if a marxist party came to power , its leaders would simply take the place of the ruling class they had fought against . anarchist historian george woodcock reports that `` the annual congress of the international had not taken place in 1870 owing to the outbreak of the paris commune , and in 1871 the general council called only a special conference in london . one delegate was able to attend from spain and none from italy , while a technical excuse -- that they had split away from the fédération romande -- was used to avoid inviting bakunin 's swiss supporters . thus only a tiny minority of anarchists was present , and the general council 's resolutions passed almost unanimously . most of them were clearly directed against bakunin and his followers . '' in 1872 , the conflict climaxed with a final split between the two groups at the hague congress , where bakunin and james guillaume were expelled from the international and its headquarters were transferred to new york . in response , the federalist sections formed their own international at the st. imier congress , adopting a revolutionary anarchist program . -the paris commune was a government that briefly ruled paris from 18 march -lrb- more formally , from 28 march -rrb- to 28 may 1871 . the commune was the result of an uprising in paris after france was defeated in the franco-prussian war . anarchists participated actively in the establishment of the paris commune . they included george woodcock states : -organised labour . -the anti-authoritarian sections of the first international were the precursors of the anarcho-syndicalists , seeking to `` replace the privilege and authority of the state '' with the `` free and spontaneous organisation of labour . '' in 1886 , the federation of organized trades and labor unions -lrb- fotlu -rrb- of the united states and canada unanimously set 1 may 1886 , as the date by which the eight-hour work day would become standard . -in response , unions across the united states prepared a general strike in support of the event . on 3 may , in chicago , a fight broke out when strikebreakers attempted to cross the picket line , and two workers died when police opened fire upon the crowd . the next day , 4 may , anarchists staged a rally at chicago 's haymarket square . a bomb was thrown by an unknown party near the conclusion of the rally , killing an officer . in the ensuing panic , police opened fire on the crowd and each other . seven police officers and at least four workers were killed . eight anarchists directly and indirectly related to the organisers of the rally were arrested and charged with the murder of the deceased officer . the men became international political celebrities among the labour movement . four of the men were executed and a fifth committed suicide prior to his own execution . the incident became known as the haymarket affair , and was a setback for the labour movement and the struggle for the eight-hour day . in 1890 a second attempt , this time international in scope , to organise for the eight-hour day was made . the event also had the secondary purpose of memorializing workers killed as a result of the haymarket affair . although it had initially been conceived as a once-off event , by the following year the celebration of international workers ' day on may day had become firmly established as an international worker 's holiday . -in 1907 , the international anarchist congress of amsterdam gathered delegates from 14 different countries , among which important figures of the anarchist movement , including errico malatesta , pierre monatte , luigi fabbri , benoît broutchoux , emma goldman , rudolf rocker , and christiaan cornelissen . various themes were treated during the congress , in particular concerning the organisation of the anarchist movement , popular education issues , the general strike or antimilitarism . a central debate concerned the relation between anarchism and syndicalism -lrb- or trade unionism -rrb- . malatesta and monatte were in particular disagreement themselves on this issue , as the latter thought that syndicalism was revolutionary and would create the conditions of a social revolution , while malatesta did not consider syndicalism by itself sufficient . he thought that the trade-union movement was reformist and even conservative , citing as essentially bourgeois and anti-worker the phenomenon of professional union officials . malatesta warned that the syndicalists aims were in perpetuating syndicalism itself , whereas anarchists must always have anarchy as their end and consequently refrain from committing to any particular method of achieving it . -the spanish workers federation in 1881 was the first major anarcho-syndicalist movement ; anarchist trade union federations were of special importance in spain . the most successful was the confederación nacional del trabajo -lrb- national confederation of labour : cnt -rrb- , founded in 1910 . before the 1940s , the cnt was the major force in spanish working class politics , attracting 1.58 million members at one point and playing a major role in the spanish civil war . the cnt was affiliated with the international workers association , a federation of anarcho-syndicalist trade unions founded in 1922 , with delegates representing two million workers from 15 countries in europe and latin america . in latin america in particular `` the anarchists quickly became active in organizing craft and industrial workers throughout south and central america , and until the early 1920s most of the trade unions in mexico , brazil , peru , chile , and argentina were anarcho-syndicalist in general outlook ; the prestige of the spanish c.n.t. as a revolutionary organization was -undoubtedly to a great extent responsible for this situation . the largest and most militant of these organizations was the federación obrera regional argentina ... it grew quickly to a membership of nearly a quarter of a million , which dwarfed the rival socialdemocratic unions . '' -propaganda of the deed and illegalism . -some anarchists , such as johann most , advocated publicizing violent acts of retaliation against counter-revolutionaries because `` we preach not only action in and for itself , but also action as propaganda . '' by the 1880s , people inside and outside the anarchist movement began to use the slogan , `` propaganda of the deed '' to refer to individual bombings , regicides , and tyrannicides . from 1905 onwards , the russian counterparts of these anti-syndicalist anarchist-communists become partisans of economic terrorism and illegal ` expropriations ' . '' illegalism as a practice emerged and within it `` the acts of the anarchist bombers and assassins -lrb- `` propaganda by the deed '' -rrb- and the anarchist burglars -lrb- `` individual reappropriation '' -rrb- expressed their desperation and their personal , violent rejection of an intolerable society . moreover , they were clearly meant to be `` exemplary '' invitations to revolt . '' . france 's bonnot gang was the most famous group to embrace illegalism . -however , as soon as 1887 , important figures in the anarchist movement distanced themselves from such individual acts . peter kropotkin thus wrote that year in `` le révolté '' that `` a structure based on centuries of history can not be destroyed with a few kilos of dynamite '' . a variety of anarchists advocated the abandonment of these sorts of tactics in favour of collective revolutionary action , for example through the trade union movement . the anarcho-syndicalist , fernand pelloutier , argued in 1895 for renewed anarchist involvement in the labour movement on the basis that anarchism could do very well without `` the individual dynamiter . '' -state repression -lrb- including the infamous 1894 french `` lois scélérates '' -rrb- of the anarchist and labour movements following the few successful bombings and assassinations may have contributed to the abandonment of these kinds of tactics , although reciprocally state repression , in the first place , may have played a role in these isolated acts . the dismemberment of the french socialist movement , into many groups and , following the suppression of the 1871 paris commune , the execution and exile of many `` communards '' to penal colonies , favoured individualist political expression and acts . -numerous heads of state were assassinated between 1881 and 1914 by members of the anarchist movement , including tsar alexander ii of russia , president sadi carnot of france , empress elisabeth of austria , king umberto i of italy , president william mckinley of the united states , king carlos i of portugal and king george i of greece . mckinley 's assassin leon czolgosz claimed to have been influenced by anarchist and feminist emma goldman . -propaganda of the deed was abandoned by the vast majority of the anarchist movement after world war i -lrb- 1914 -- 1918 -rrb- and the 1917 october revolution . -russian revolution and other uprisings of the 1910s . -anarchists participated alongside the bolsheviks in both february and october revolutions , and were initially enthusiastic about the bolshevik revolution . however , following a political falling out with the bolsheviks by the anarchists and other left-wing opposition , the conflict culminated in the 1921 kronstadt rebellion , which the new government repressed . anarchists in central russia were either imprisoned , driven underground or joined the victorious bolsheviks ; the anarchists from petrograd and moscow fled to ukraine . there , in the free territory , they fought in the civil war against the whites -lrb- a grouping of monarchists and other opponents of the october revolution -rrb- and then the bolsheviks as part of the revolutionary insurrectionary army of ukraine led by nestor makhno , who established an anarchist society in the region for a number of months . -expelled american anarchists emma goldman and alexander berkman were amongst those agitating in response to bolshevik policy and the suppression of the kronstadt uprising , before they left russia . both wrote accounts of their experiences in russia , criticising the amount of control the bolsheviks exercised . for them , bakunin 's predictions about the consequences of marxist rule that the rulers of the new `` socialist '' marxist state would become a new elite had proved all too true . -the victory of the bolsheviks in the october revolution and the resulting russian civil war did serious damage to anarchist movements internationally . many workers and activists saw bolshevik success as setting an example ; communist parties grew at the expense of anarchism and other socialist movements . in france and the united states , for example , members of the major syndicalist movements of the cgt and iww left the organisations and joined the communist international . -the revolutionary wave of 1917 -- 23 saw the active participation of anarchists in varying degrees of protagonism . in the german uprising known as the german revolution of 1918 -- 1919 which established the bavarian soviet republic the anarchists gustav landauer , silvio gesell and erich mühsam had important leadership positions within the revolutionary councilist structures . in the italian events known as the `` biennio rosso '' the anarcho-syndicalist trade union unione sindacale italiana `` grew to 800,000 members and the influence of the italian anarchist union -lrb- 20,000 members plus `` umanita nova '' , its daily paper -rrb- grew accordingly ... anarchists were the first to suggest occupying workplaces . in the mexican revolution the mexican liberal party was established and during the early 1910s it led a series of military offensives leading to the conquest and occupation of certain towns and districts in baja california with the leadership of anarcho-communist ricardo flores magón . -in paris , the dielo truda group of russian anarchist exiles , which included nestor makhno , concluded that anarchists needed to develop new forms of organisation in response to the structures of bolshevism . their 1926 manifesto , called the `` organisational platform of the general union of anarchists -lrb- draft -rrb- '' , was supported . platformist groups active today include the workers solidarity movement in ireland and the north eastern federation of anarchist communists of north america . synthesis anarchism emerged as an organisational alternative to platformism that tries to join anarchists of different tendencies under the principles of anarchism without adjectives . in the 1920s this form found as its main proponents volin and sebastien faure . it is the main principle behind the anarchist federations grouped around the contemporary global international of anarchist federations . -conflicts with european fascist regimes . -in the 1920s and 1930s , the rise of fascism in europe transformed anarchism 's conflict with the state . italy saw the first struggles between anarchists and fascists . italian anarchists played a key role in the anti-fascist organisation `` arditi del popolo '' , which was strongest in areas with anarchist traditions , and achieved some success in their activism , such as repelling blackshirts in the anarchist stronghold of parma in august 1922 . the veteran italian anarchist , luigi fabbri , was one of the first critical theorists of fascism , describing it as `` the preventive counter-revolution . '' in france , where the far right leagues came close to insurrection in the february 1934 riots , anarchists divided over a united front policy . -anarchists in france and italy were active in the resistance during world war ii . in germany the anarchist erich mühsam was arrested on charges unknown in the early morning hours of 28 february 1933 , within a few hours after the reichstag fire in berlin . joseph goebbels , the nazi propaganda minister , labelled him as one of `` those jewish subversives . '' over the next seventeen months , he would be imprisoned in the concentration camps at sonnenburg , brandenburg and finally , oranienburg . on 2 february 1934 , mühsam was transferred to the concentration camp at oranienburg when finally on the night of 9 july 1934 , mühsam was tortured and murdered by the guards , his battered corpse found hanging in a latrine the next morning . -spanish revolution . -in spain , the national anarcho-syndicalist trade union confederación nacional del trabajo initially refused to join a popular front electoral alliance , and abstention by cnt supporters led to a right wing election victory . but in 1936 , the cnt changed its policy and anarchist votes helped bring the popular front back to power . months later , the former ruling class responded with an attempted coup causing the spanish civil war -lrb- 1936 -- 1939 -rrb- . in response to the army rebellion , an anarchist-inspired movement of peasants and workers , supported by armed militias , took control of barcelona and of large areas of rural spain where they collectivised the land . but even before the fascist victory in 1939 , the anarchists were losing ground in a bitter struggle with the stalinists , who controlled much of the distribution of military aid to the republican cause from the soviet union . the events known as the spanish revolution was a workers ' social revolution that began during the outbreak of the spanish civil war in 1936 and resulted in the widespread implementation of anarchist and more broadly libertarian socialist organisational principles throughout various portions of the country for two to three years , primarily catalonia , aragon , andalusia , and parts of the levante . much of spain 's economy was put under worker control ; in anarchist strongholds like catalonia , the figure was as high as 75 % , but lower in areas with heavy communist party of spain influence , as the soviet-allied party actively resisted attempts at collectivization enactment . factories were run through worker committees , agrarian areas became collectivised and run as libertarian communes . anarchist historian sam dolgoff estimated that about eight million people participated directly or at least indirectly in the spanish revolution , which he claimed `` came closer to realizing the ideal of the free stateless society on a vast scale than any other revolution in history . '' -stalinist-led troops suppressed the collectives and persecuted both dissident marxists and anarchists . the prominent italian anarchist camillo berneri , who volunteered to fight against franco was killed instead in spain by gunmen associated with the spanish communist party . -post-war years . -anarchism sought to reorganise itself after the war and in this context the organisational debate between synthesis anarchism and platformism took importance once again especially in the anarchist movements of italy and france . the mexican anarchist federation was established in 1945 after the anarchist federation of the centre united with the anarchist federation of the federal district . in the early 1940s , the antifascist international solidarity and the federation of anarchist groups of cuba merged into the large national organisation asociación libertaria de cuba -lrb- cuban libertarian association -rrb- . from 1944 to 1947 , the bulgarian anarchist communist federation reemerged as part of a factory and workplace committee movement , but was repressed by the new communist regime . in 1945 in france the fédération anarchiste and the anarchosyndicalist trade union confédération nationale du travail was established in the next year while the also synthesist federazione anarchica italiana was founded in italy . korean anarchists formed the league of free social constructors in september 1945 and in 1946 the japanese anarchist federation was founded . an international anarchist congress with delegates from across europe was held in paris in may 1948 . after world war ii , an appeal in the `` fraye arbeter shtime '' detailing the plight of german anarchists and called for americans to support them . by february 1946 , the sending of aid parcels to anarchists in germany was a large-scale operation . the federation of libertarian socialists was founded in germany in 1947 and rudolf rocker wrote for its organ , `` die freie gesellschaft '' , which survived until 1953 . in 1956 the uruguayan anarchist federation was founded . in 1955 the anarcho-communist federation of argentina renamed itself as the argentine libertarian federation . the syndicalist workers ' federation was a syndicalist group in active in post-war britain , and one of solidarity federation 's earliest predecessors . it was formed in 1950 by members of the dissolved anarchist federation of britain . unlike the afb , which was influenced by anarcho-syndicalist ideas but ultimately not syndicalist itself , the swf decided to pursue a more definitely syndicalist , worker-centred strategy from the outset . -anarchism continued to influence important literary and intellectual personalities of the time , such as albert camus , herbert read , paul goodman , dwight macdonald , allen ginsberg , george woodcock , leopold kohr , julian beck , john cage and the french surrealist group led by andré breton , which now openly embraced anarchism and collaborated in the fédération anarchiste . -anarcho-pacifism became influential in the anti-nuclear movement and anti war movements of the time as can be seen in the activism and writings of the english anarchist member of campaign for nuclear disarmament alex comfort or the similar activism of the american catholic anarcho-pacifists ammon hennacy and dorothy day . anarcho-pacifism became a `` basis for a critique of militarism on both sides of the cold war . '' the resurgence of anarchist ideas during this period is well documented in robert graham 's , `` volume two : the emergence of the new anarchism -lrb- 1939 -- 1977 -rrb- '' . -contemporary anarchism . -a surge of popular interest in anarchism occurred in western nations during the 1960s and 1970s . anarchism was influential in the counterculture of the 1960s and anarchists actively participated in the late sixties students and workers revolts . in 1968 in carrara , italy the international of anarchist federations was founded during an international anarchist conference held there in 1968 by the three existing european federations of france -lrb- the fédération anarchiste -rrb- , the federazione anarchica italiana of italy and the iberian anarchist federation as well as the bulgarian federation in french exile . -in the united kingdom in the 1970s this was associated with the punk rock movement , as exemplified by bands such as crass and the sex pistols . the housing and employment crisis in most of western europe led to the formation of communes and squatter movements like that of barcelona , spain . in denmark , squatters occupied a disused military base and declared the freetown christiania , an autonomous haven in central copenhagen . since the revival of anarchism in the mid 20th century , a number of new movements and schools of thought emerged . although feminist tendencies have always been a part of the anarchist movement in the form of anarcha-feminism , they returned with vigour during the second wave of feminism in the 1960s . anarchist anthropologist david graeber and anarchist historian andrej grubacic have posited a rupture between generations of anarchism , with those `` who often still have not shaken the sectarian habits '' of the 19th century contrasted with the younger activists who are `` much more informed , among other elements , by indigenous , feminist , ecological and cultural-critical ideas '' , and who by the turn of the 21st century formed `` by far the majority '' of anarchists . -around the turn of the 21st century , anarchism grew in popularity and influence as part of the anti-war , anti-capitalist , and anti-globalisation movements . anarchists became known for their involvement in protests against the meetings of the world trade organization -lrb- wto -rrb- , group of eight , and the world economic forum . some anarchist factions at these protests engaged in rioting , property destruction , and violent confrontations with police . these actions were precipitated by ad hoc , leaderless , anonymous cadres known as `` black blocs '' ; other organisational tactics pioneered in this time include security culture , affinity groups and the use of decentralised technologies such as the internet . a significant event of this period was the confrontations at wto conference in seattle in 1999 . according to anarchist scholar simon critchley , `` contemporary anarchism can be seen as a powerful critique of the pseudo-libertarianism of contemporary neo-liberalism ... one might say that contemporary anarchism is about responsibility , whether sexual , ecological or socio-economic ; it flows from an experience of conscience about the manifold ways in which the west ravages the rest ; it is an ethical outrage at the yawning inequality , impoverishment and disenfranchisment that is so palpable locally and globally . '' -international anarchist federations in existence include the international of anarchist federations , the international workers ' association , and international libertarian solidarity . -the largest organised anarchist movement today is in spain , in the form of the confederación general del trabajo -lrb- cgt -rrb- and the cnt . cgt membership was estimated at around 100,000 for 2003 . other active syndicalist movements include in sweden the central organisation of the workers of sweden and the swedish anarcho-syndicalist youth federation ; the cnt-ait in france ; the union sindicale italiana in italy ; in the us workers solidarity alliance and the uk solidarity federation and anarchist federation . the revolutionary industrial unionist industrial workers of the world , claiming 3,000 paying members , and the international workers association , an anarcho-syndicalist successor to the first international , also remain active . -anarchist schools of thought . -anarchist schools of thought had been generally grouped in two main historical traditions , individualist anarchism and social anarchism , which have some different origins , values and evolution . the individualist wing of anarchism emphasises negative liberty , i.e. opposition to state or social control over the individual , while those in the social wing emphasise positive liberty to achieve one 's potential and argue that humans have needs that society ought to fulfill , `` recognizing equality of entitlement '' . in a chronological and theoretical sense , there are classical -- those created throughout the 19th century -- and post-classical anarchist schools -- those created since the mid-20th century and after . -beyond the specific factions of anarchist thought is philosophical anarchism , which embodies the theoretical stance that the state lacks moral legitimacy without accepting the imperative of revolution to eliminate it . a component especially of individualist anarchism philosophical anarchism may accept the existence of a minimal state as unfortunate , and usually temporary , `` necessary evil '' but argue that citizens do not have a moral obligation to obey the state when its laws conflict with individual autonomy . one reaction against sectarianism within the anarchist milieu was `` anarchism without adjectives '' , a call for toleration first adopted by fernando tarrida del mármol in 1889 in response to the `` bitter debates '' of anarchist theory at the time . in abandoning the hyphenated anarchisms -lrb- i.e. collectivist - , communist - , mutualist -- and individualist-anarchism -rrb- , it sought to emphasise the anti-authoritarian beliefs common to all anarchist schools of thought . -classical anarchist schools of thought . -mutualism began in 18th-century english and french labour movements before taking an anarchist form associated with pierre-joseph proudhon in france and others in the united states . proudhon proposed spontaneous order , whereby organisation emerges without central authority , a `` positive anarchy '' where order arises when everybody does `` what he wishes and only what he wishes '' and where `` business transactions alone produce the social order . '' it is important to recognize that proudhon distinguished between ideal political possibilities and practical governance . for this reason , much in contrast to some of his theoretical statements concerning ultimate spontaneous self-governance , proudhon was heavily involved in french parliamentary politics and allied himself not with anarchist but socialist factions of workers movements and , in addition to advocating state-protected charters for worker-owned cooperatives , promoted certain nationalization schemes during his life of public service . -mutualist anarchism is concerned with reciprocity , free association , voluntary contract , federation , and credit and currency reform . according to the american mutualist william batchelder greene , each worker in the mutualist system would receive `` just and exact pay for his work ; services equivalent in cost being exchangeable for services equivalent in cost , without profit or discount . '' mutualism has been retrospectively characterised as ideologically situated between individualist and collectivist forms of anarchism . proudhon first characterised his goal as a `` third form of society , the synthesis of communism and property . '' -individualist anarchism . -individualist anarchism refers to several traditions of thought within the anarchist movement that emphasize the individual and their will over any kinds of external determinants such as groups , society , traditions , and ideological systems . individualist anarchism is not a single philosophy but refers to a group of individualistic philosophies that sometimes are in conflict . -in 1793 , william godwin , who has often been cited as the first anarchist , wrote `` political justice '' , which some consider the first expression of anarchism . godwin , a philosophical anarchist , from a rationalist and utilitarian basis opposed revolutionary action and saw a minimal state as a present `` necessary evil '' that would become increasingly irrelevant and powerless by the gradual spread of knowledge . godwin advocated individualism , proposing that all cooperation in labour be eliminated on the premise that this would be most conducive with the general good . -an influential form of individualist anarchism , called `` egoism , '' or egoist anarchism , was expounded by one of the earliest and best-known proponents of individualist anarchism , the german max stirner . stirner 's `` the ego and its own '' , published in 1844 , is a founding text of the philosophy . according to stirner , the only limitation on the rights of the individual is their power to obtain what they desire , without regard for god , state , or morality . to stirner , rights were `` spooks '' in the mind , and he held that society does not exist but `` the individuals are its reality '' . stirner advocated self-assertion and foresaw unions of egoists , non-systematic associations continually renewed by all parties ' support through an act of will , which stirner proposed as a form of organisation in place of the state . egoist anarchists argue that egoism will foster genuine and spontaneous union between individuals . `` egoism '' has inspired many interpretations of stirner 's philosophy . it was re-discovered and promoted by german philosophical anarchist and lgbt activist john henry mackay . -josiah warren is widely regarded as the first american anarchist , and the four-page weekly paper he edited during 1833 , `` the peaceful revolutionist '' , was the first anarchist periodical published . for american anarchist historian eunice minette schuster `` it is apparent ... that proudhonian anarchism was to be found in the united states at least as early as 1848 and that it was not conscious of its affinity to the individualist anarchism of josiah warren and stephen pearl andrews ... william b. greene presented this proudhonian mutualism in its purest and most systematic form . '' . henry david thoreau -lrb- 1817 -- 1862 -rrb- was an important early influence in individualist anarchist thought in the united states and europe . thoreau was an american author , poet , naturalist , tax resister , development critic , surveyor , historian , philosopher , and leading transcendentalist . he is best known for his books `` walden '' , a reflection upon simple living in natural surroundings , and his essay , `` civil disobedience '' , an argument for individual resistance to civil government in moral opposition to an unjust state . later benjamin tucker fused stirner 's egoism with the economics of warren and proudhon in his eclectic influential publication `` liberty '' . -from these early influences individualist anarchism in different countries attracted a small but diverse following of bohemian artists and intellectuals , free love and birth control advocates -lrb- see anarchism and issues related to love and sex -rrb- , individualist naturists nudists -lrb- see anarcho-naturism -rrb- , freethought and anti-clerical activists as well as young anarchist outlaws in what became known as illegalism and individual reclamation -lrb- see european individualist anarchism and individualist anarchism in france -rrb- . these authors and activists included oscar wilde , emile armand , han ryner , henri zisly , renzo novatore , miguel gimenez igualada , adolf brand and lev chernyi among others . -social anarchism . -collectivist anarchism . -post-classical schools of thought . -internal issues and debates . -topics of interest . -intersecting and overlapping between various schools of thought , certain topics of interest and internal disputes have proven perennial within anarchist theory . -free love . -libertarian education and freethought . -external links . -autism is a neurodevelopmental disorder characterized by impaired social interaction , verbal and non-verbal communication , and restricted and repetitive behavior . parents usually notice signs in the first two years of their child 's life . these signs often develop gradually , though some children with autism reach their developmental milestones at a normal pace and then regress . the diagnostic criteria require that symptoms become apparent in early childhood , typically before age three . -while autism is highly heritable , researchers suspect both environmental and genetic factors as causes . in rare cases , autism is strongly associated with agents that cause birth defects . controversies surround other proposed environmental causes ; for example , the vaccine hypotheses have been disproven . autism affects information processing in the brain by altering how nerve cells and their synapses connect and organize ; how this occurs is not well understood . it is one of three recognized disorders in the autism spectrum -lrb- asds -rrb- , the other two being asperger syndrome , which lacks delays in cognitive development and language , and pervasive developmental disorder , not otherwise specified -lrb- commonly abbreviated as pdd-nos -rrb- , which is diagnosed when the full set of criteria for autism or asperger syndrome are not met . -early speech or behavioral interventions can help children with autism gain self-care , social , and communication skills . although there is no known cure , there have been reported cases of children who recovered . not many children with autism live independently after reaching adulthood , though some become successful . an autistic culture has developed , with some individuals seeking a cure and others believing autism should be accepted as a difference and not treated as a disorder . -globally , autism is estimated to affect 21.7 million people as of 2013 . as of 2010 , the number of people affected is estimated at about 1 -- 2 per 1,000 worldwide . it occurs four to five times more often in boys than girls . about 1.5 % of children in the united states -lrb- one in 68 -rrb- are diagnosed with asd , a 30 % increase from one in 88 in 2012 . the rate of autism among adults aged 18 years and over in the united kingdom is 1.1 % . the number of people diagnosed has been increasing dramatically since the 1980s , partly due to changes in diagnostic practice and government-subsidized financial incentives for named diagnoses ; the question of whether actual rates have increased is unresolved . -autism is a highly variable neurodevelopmental disorder that first appears during infancy or childhood , and generally follows a steady course without remission . people with autism may be severely impaired in some respects but normal , or even superior , in others . overt symptoms gradually begin after the age of six months , become established by age two or three years , and tend to continue through adulthood , although often in more muted form . it is distinguished not by a single symptom , but by a characteristic triad of symptoms : impairments in social interaction ; impairments in communication ; and restricted interests and repetitive behavior . other aspects , such as atypical eating , are also common but are not essential for diagnosis . autism 's individual symptoms occur in the general population and appear not to associate highly , without a sharp line separating pathologically severe from common traits . -social development . -social deficits distinguish autism and the related autism spectrum disorders -lrb- asd ; see classification -rrb- from other developmental disorders . people with autism have social impairments and often lack the intuition about others that many people take for granted . noted autistic temple grandin described her inability to understand the social communication of neurotypicals , or people with normal neural development , as leaving her feeling `` like an anthropologist on mars '' . -unusual social development becomes apparent early in childhood . autistic infants show less attention to social stimuli , smile and look at others less often , and respond less to their own name . autistic toddlers differ more strikingly from social norms ; for example , they have less eye contact and turn-taking , and do not have the ability to use simple movements to express themselves , such as pointing at things . three - to five-year-old children with autism are less likely to exhibit social understanding , approach others spontaneously , imitate and respond to emotions , communicate nonverbally , and take turns with others . however , they do form attachments to their primary caregivers . most childen with autism display moderately less attachment security than neurotypical children , although this difference disappears in children with higher mental development or less severe asd . older children and adults with asd perform worse on tests of face and emotion recognition although this may be partly due to a lower ability to defines a person 's own emotions . -children with high-functioning autism suffer from more intense and frequent loneliness compared to non-autistic peers , despite the common belief that children with autism prefer to be alone . making and maintaining friendships often proves to be difficult for those with autism . for them , the quality of friendships , not the number of friends , predicts how lonely they feel . functional friendships , such as those resulting in invitations to parties , may affect the quality of life more deeply . -there are many anecdotal reports , but few systematic studies , of aggression and violence in individuals with asd . the limited data suggest that , in children with intellectual disability , autism is associated with aggression , destruction of property , and tantrums . -about a third to a half of individuals with autism do not develop enough natural speech to meet their daily communication needs . differences in communication may be present from the first year of life , and may include delayed onset of babbling , unusual gestures , diminished responsiveness , and vocal patterns that are not synchronized with the caregiver . in the second and third years , children with autism have less frequent and less diverse babbling , consonants , words , and word combinations ; their gestures are less often integrated with words . children with autism are less likely to make requests or share experiences , and are more likely to simply repeat others ' words -lrb- echolalia -rrb- or reverse pronouns . joint attention seems to be necessary for functional speech , and deficits in joint attention seem to distinguish infants with asd : for example , they may look at a pointing hand instead of the pointed-at object , and they consistently fail to point at objects in order to comment on or share an experience . children with autism may have difficulty with imaginative play and with developing symbols into language . -in a pair of studies , high-functioning children with autism aged 8 -- 15 performed equally well as , and adults better than , individually matched controls at basic language tasks involving vocabulary and spelling . both autistic groups performed worse than controls at complex language tasks such as figurative language , comprehension and inference . as people are often sized up initially from their basic language skills , these studies suggest that people speaking to autistic individuals are more likely to overestimate what their audience comprehends . -repetitive behavior . -autistic individuals display many forms of repetitive or restricted behavior , which the repetitive behavior scale-revised -lrb- rbs-r -rrb- categorizes as follows . -no single repetitive or self-injurious behavior seems to be specific to autism , but only autism appears to have an elevated pattern of occurrence and severity of these behaviors . -other symptoms . -autistic individuals may have symptoms that are independent of the diagnosis , but that can affect the individual or the family . -an estimated 0.5 % to 10 % of individuals with asd show unusual abilities , ranging from splinter skills such as the memorization of trivia to the extraordinarily rare talents of prodigious autistic savants . many individuals with asd show superior skills in perception and attention , relative to the general population . sensory abnormalities are found in over 90 % of those with autism , and are considered core features by some , although there is no good evidence that sensory symptoms differentiate autism from other developmental disorders . differences are greater for under-responsivity -lrb- for example , walking into things -rrb- than for over-responsivity -lrb- for example , distress from loud noises -rrb- or for sensation seeking -lrb- for example , rhythmic movements -rrb- . an estimated 60 % -- 80 % of autistic people have motor signs that include poor muscle tone , poor motor planning , and toe walking ; deficits in motor coordination are pervasive across asd and are greater in autism proper . -unusual eating behavior occurs in about three-quarters of children with asd , to the extent that it was formerly a diagnostic indicator . selectivity is the most common problem , although eating rituals and food refusal also occur ; this does not appear to result in malnutrition . although some children with autism also have gastrointestinal symptoms , there is a lack of published rigorous data to support the theory that children with autism have more or different gastrointestinal symptoms than usual ; studies report conflicting results , and the relationship between gastrointestinal problems and asd is unclear . -parents of children with asd have higher levels of stress . siblings of children with asd report greater admiration of and less conflict with the affected sibling than siblings of unaffected children and were similar to siblings of children with down syndrome in these aspects of the sibling relationship . however , they reported lower levels of closeness and intimacy than siblings of children with down syndrome ; siblings of individuals with asd have greater risk of negative well-being and poorer sibling relationships as adults . -it has long been presumed that there is a common cause at the genetic , cognitive , and neural levels for autism 's characteristic triad of symptoms . however , there is increasing suspicion that autism is instead a complex disorder whose core aspects have distinct causes that often co-occur . -autism has a strong genetic basis , although the genetics of autism are complex and it is unclear whether asd is explained more by rare mutations with major effects , or by rare multigene interactions of common genetic variants . complexity arises due to interactions among multiple genes , the environment , and epigenetic factors which do not change dna but are heritable and influence gene expression . studies of twins suggest that heritability is 0.7 for autism and as high as 0.9 for asd , and siblings of those with autism are about 25 times more likely to be autistic than the general population . however , most of the mutations that increase autism risk have not been identified . typically , autism can not be traced to a mendelian -lrb- single-gene -rrb- mutation or to a single chromosome abnormality , and none of the genetic syndromes associated with asds have been shown to selectively cause asd . numerous candidate genes have been located , with only small effects attributable to any particular gene . the large number of autistic individuals with unaffected family members may result from copy number variations -- spontaneous deletions or duplications in genetic material during meiosis . hence , a substantial fraction of autism cases may be traceable to genetic causes that are highly heritable but not inherited : that is , the mutation that causes the autism is not present in the parental genome . -several lines of evidence point to synaptic dysfunction as a cause of autism . some rare mutations may lead to autism by disrupting some synaptic pathways , such as those involved with cell adhesion . gene replacement studies in mice suggest that autistic symptoms are closely related to later developmental steps that depend on activity in synapses and on activity-dependent changes . all known teratogens -lrb- agents that cause birth defects -rrb- related to the risk of autism appear to act during the first eight weeks from conception , and though this does not exclude the possibility that autism can be initiated or affected later , there is strong evidence that autism arises very early in development . -exposure to air pollution during pregnancy , especially heavy metals and particulates , may increase the risk of autism . environmental factors that have been claimed to contribute to or exacerbate autism , or may be important in future research , include certain foods , infectious diseases , solvents , diesel exhaust , pcbs , phthalates and phenols used in plastic products , pesticides , brominated flame retardants , alcohol , smoking , illicit drugs , vaccines , and prenatal stress , although no links have been found , and some have been completely disproven . -parents may first become aware of autistic symptoms in their child around the time of a routine vaccination . this has led to unsupported theories blaming vaccine `` overload '' , a vaccine preservative , or the mmr vaccine for causing autism . the latter theory was supported by a litigation-funded study that has since been shown to have been `` an elaborate fraud '' . although these theories lack convincing scientific evidence and are biologically implausible , parental concern about a potential vaccine link with autism has led to lower rates of childhood immunizations , outbreaks of previously controlled childhood diseases in some countries , and the preventable deaths of several children . -autism 's symptoms result from maturation-related changes in various systems of the brain . how autism occurs is not well understood . its mechanism can be divided into two areas : the pathophysiology of brain structures and processes associated with autism , and the neuropsychological linkages between brain structures and behaviors . the behaviors appear to have multiple pathophysiologies . -unlike many other brain disorders , such as parkinson 's , autism does not have a clear unifying mechanism at either the molecular , cellular , or systems level ; it is not known whether autism is a few disorders caused by mutations converging on a few common molecular pathways , or is -lrb- like intellectual disability -rrb- a large set of disorders with diverse mechanisms . autism appears to result from developmental factors that affect many or all functional brain systems , and to disturb the timing of brain development more than the final product . neuroanatomical studies and the associations with teratogens strongly suggest that autism 's mechanism includes alteration of brain development soon after conception . this anomaly appears to start a cascade of pathological events in the brain that are significantly influenced by environmental factors . just after birth , the brains of children with autism tend to grow faster than usual , followed by normal or relatively slower growth in childhood . it is not known whether early overgrowth occurs in all children with autism . it seems to be most prominent in brain areas underlying the development of higher cognitive specialization . hypotheses for the cellular and molecular bases of pathological early overgrowth include the following : -the immune system is thought to play an important role in autism . children with autism have been found by researchers to have inflammation of both the peripheral and central immune systems as indicated by increased levels of pro-inflammatory cytokines and significant activation of microglia . biomarkers of abnormal immune function have also been associated with increased impairments in behaviors that are characteristic of the core features of autism such as deficits in social interactions and communication . interactions between the immune system and the nervous system begin early during the embryonic stage of life , and successful neurodevelopment depends on a balanced immune response . it is thought that activation of a pregnant mother 's immune system such as from environmental toxicants or infection can contribute to causing autism through causing a disruption of brain development . this is supported by recent studies that have found that infection during pregnancy is associated with an increased risk of autism . -the relationship of neurochemicals to autism is not well understood ; several have been investigated , with the most evidence for the role of serotonin and of genetic differences in its transport . the role of group i metabotropic glutamate receptors -lrb- mglur -rrb- in the pathogenesis of fragile x syndrome , the most common identified genetic cause of autism , has led to interest in the possible implications for future autism research into this pathway . some data suggests neuronal overgrowth potentially related to an increase in several growth hormones or to impaired regulation of growth factor receptors . also , some inborn errors of metabolism are associated with autism , but probably account for less than 5 % of cases . -the mirror neuron system -lrb- mns -rrb- theory of autism hypothesizes that distortion in the development of the mns interferes with imitation and leads to autism 's core features of social impairment and communication difficulties . the mns operates when an animal performs an action or observes another animal perform the same action . the mns may contribute to an individual 's understanding of other people by enabling the modeling of their behavior via embodied simulation of their actions , intentions , and emotions . several studies have tested this hypothesis by demonstrating structural abnormalities in mns regions of individuals with asd , delay in the activation in the core circuit for imitation in individuals with asperger syndrome , and a correlation between reduced mns activity and severity of the syndrome in children with asd . however , individuals with autism also have abnormal brain activation in many circuits outside the mns and the mns theory does not explain the normal performance of children with autism on imitation tasks that involve a goal or object . -asd-related patterns of low function and aberrant activation in the brain differ depending on whether the brain is doing social or nonsocial tasks . -in autism there is evidence for reduced functional connectivity of the default network , a large-scale brain network involved in social and emotional processing , with intact connectivity of the task-positive network , used in sustained attention and goal-directed thinking . in people with autism the two networks are not negatively correlated in time , suggesting an imbalance in toggling between the two networks , possibly reflecting a disturbance of self-referential thought . -the underconnectivity theory of autism hypothesizes that autism is marked by underfunctioning high-level neural connections and synchronization , along with an excess of low-level processes . evidence for this theory has been found in functional neuroimaging studies on autistic individuals and by a brainwave study that suggested that adults with asd have local overconnectivity in the cortex and weak functional connections between the frontal lobe and the rest of the cortex . other evidence suggests the underconnectivity is mainly within each hemisphere of the cortex and that autism is a disorder of the association cortex . -from studies based on event-related potentials , transient changes to the brain 's electrical activity in response to stimuli , there is considerable evidence for differences in autistic individuals with respect to attention , orientation to auditory and visual stimuli , novelty detection , language and face processing , and information storage ; several studies have found a preference for nonsocial stimuli . for example , magnetoencephalography studies have found evidence in children with autism of delayed responses in the brain 's processing of auditory signals . -in the genetic area , relations have been found between autism and schizophrenia based on duplications and deletions of chromosomes ; research showed that schizophrenia and autism are significantly more common in combination with 1q21 .1 deletion syndrome . research on autism/schizophrenia relations for chromosome 15 -lrb- 15q13 .3 -rrb- , chromosome 16 -lrb- 16p13 .1 -rrb- and chromosome 17 -lrb- 17p12 -rrb- are inconclusive . -two major categories of cognitive theories have been proposed about the links between autistic brains and behavior . -the first category focuses on deficits in social cognition . simon baron-cohen 's empathizing -- systemizing theory postulates that autistic individuals can systemize -- that is , they can develop internal rules of operation to handle events inside the brain -- but are less effective at empathizing by handling events generated by other agents . an extension , the extreme male brain theory , hypothesizes that autism is an extreme case of the male brain , defined psychometrically as individuals in whom systemizing is better than empathizing . these theories are somewhat related to baron-cohen 's earlier theory of mind approach , which hypothesizes that autistic behavior arises from an inability to ascribe mental states to oneself and others . the theory of mind hypothesis is supported by the atypical responses of children with autism to the sally -- anne test for reasoning about others ' motivations , and the mirror neuron system theory of autism described in `` pathophysiology '' maps well to the hypothesis . however , most studies have found no evidence of impairment in autistic individuals ' ability to understand other people 's basic intentions or goals ; instead , data suggests that impairments are found in understanding more complex social emotions or in considering others ' viewpoints . -the second category focuses on nonsocial or general processing : the executive functions such as working memory , planning , inhibition . in his review , kenworthy states that `` the claim of executive dysfunction as a causal factor in autism is controversial '' , however , `` it is clear that executive dysfunction plays a role in the social and cognitive deficits observed in individuals with autism '' . tests of core executive processes such as eye movement tasks indicate improvement from late childhood to adolescence , but performance never reaches typical adult levels . a strength of the theory is predicting stereotyped behavior and narrow interests ; two weaknesses are that executive function is hard to measure and that executive function deficits have not been found in young children with autism . -weak central coherence theory hypothesizes that a limited ability to see the big picture underlies the central disturbance in autism . one strength of this theory is predicting special talents and peaks in performance in autistic people . a related theory -- enhanced perceptual functioning -- focuses more on the superiority of locally oriented and perceptual operations in autistic individuals . these theories map well from the underconnectivity theory of autism . -neither category is satisfactory on its own ; social cognition theories poorly address autism 's rigid and repetitive behaviors , while the nonsocial theories have difficulty explaining social impairment and communication difficulties . a combined theory based on multiple deficits may prove to be more useful . -diagnosis is based on behavior , not cause or mechanism . under the dsm-5 , autism is characterized by persistent deficits in social communication and interaction across multiple contexts , as well as restricted , repetitive patterns of behavior , interests , or activities . these deficits are present in early childhood , typically before age three , and lead to clinically significant functional impairment . sample symptoms include lack of social or emotional reciprocity , stereotyped and repetitive use of language or idiosyncratic language , and persistent preoccupation with unusual objects . the disturbance must not be better accounted for by rett syndrome , intellectual disability or global developmental delay . icd-10 uses essentially the same definition . -several diagnostic instruments are available . two are commonly used in autism research : the autism diagnostic interview-revised -lrb- adi-r -rrb- is a semistructured parent interview , and the autism diagnostic observation schedule -lrb- ados -rrb- uses observation and interaction with the child . the childhood autism rating scale -lrb- cars -rrb- is used widely in clinical environments to assess severity of autism based on observation of children . -a pediatrician commonly performs a preliminary investigation by taking developmental history and physically examining the child . if warranted , diagnosis and evaluations are conducted with help from asd specialists , observing and assessing cognitive , communication , family , and other factors using standardized tools , and taking into account any associated medical conditions . a pediatric neuropsychologist is often asked to assess behavior and cognitive skills , both to aid diagnosis and to help recommend educational interventions . a differential diagnosis for asd at this stage might also consider intellectual disability , hearing impairment , and a specific language impairment such as landau -- kleffner syndrome . the presence of autism can make it harder to diagnose coexisting psychiatric disorders such as depression . -clinical genetics evaluations are often done once asd is diagnosed , particularly when other symptoms already suggest a genetic cause . although genetic technology allows clinical geneticists to link an estimated 40 % of cases to genetic causes , consensus guidelines in the us and uk are limited to high-resolution chromosome and fragile x testing . a genotype-first model of diagnosis has been proposed , which would routinely assess the genome 's copy number variations . as new genetic tests are developed several ethical , legal , and social issues will emerge . commercial availability of tests may precede adequate understanding of how to use test results , given the complexity of autism 's genetics . metabolic and neuroimaging tests are sometimes helpful , but are not routine . -asd can sometimes be diagnosed by age 14 months , although diagnosis becomes increasingly stable over the first three years of life : for example , a one-year-old who meets diagnostic criteria for asd is less likely than a three-year-old to continue to do so a few years later . in the uk the national autism plan for children recommends at most 30 weeks from first concern to completed diagnosis and assessment , though few cases are handled that quickly in practice . although the symptoms of autism and asd begin early in childhood , they are sometimes missed ; years later , adults may seek diagnoses to help them or their friends and family understand themselves , to help their employers make adjustments , or in some locations to claim disability living allowances or other benefits . -underdiagnosis and overdiagnosis are problems in marginal cases , and much of the recent increase in the number of reported asd cases is likely due to changes in diagnostic practices . the increasing popularity of drug treatment options and the expansion of benefits has given providers incentives to diagnose asd , resulting in some overdiagnosis of children with uncertain symptoms . conversely , the cost of screening and diagnosis and the challenge of obtaining payment can inhibit or delay diagnosis . it is particularly hard to diagnose autism among the visually impaired , partly because some of its diagnostic criteria depend on vision , and partly because autistic symptoms overlap with those of common blindness syndromes or blindisms . -autism is one of the five pervasive developmental disorders -lrb- pdd -rrb- , which are characterized by widespread abnormalities of social interactions and communication , and severely restricted interests and highly repetitive behavior . these symptoms do not imply sickness , fragility , or emotional disturbance . -of the five pdd forms , asperger syndrome is closest to autism in signs and likely causes ; rett syndrome and childhood disintegrative disorder share several signs with autism , but may have unrelated causes ; pdd not otherwise specified -lrb- pdd-nos ; also called `` atypical autism '' -rrb- is diagnosed when the criteria are not met for a more specific disorder . unlike with autism , people with asperger syndrome have no substantial delay in language development . the terminology of autism can be bewildering , with autism , asperger syndrome and pdd-nos often called the `` autism spectrum disorders '' -lrb- asd -rrb- or sometimes the `` autistic disorders '' , whereas autism itself is often called `` autistic disorder '' , `` childhood autism '' , or `` infantile autism '' . in this article , `` autism '' refers to the classic autistic disorder ; in clinical practice , though , `` autism '' , `` asd '' , and `` pdd '' are often used interchangeably . asd , in turn , is a subset of the broader autism phenotype , which describes individuals who may not have asd but do have autistic-like traits , such as avoiding eye contact . -the manifestations of autism cover a wide spectrum , ranging from individuals with severe impairments -- who may be silent , developmentally disabled , and locked into hand flapping and rocking -- to high functioning individuals who may have active but distinctly odd social approaches , narrowly focused interests , and verbose , pedantic communication . because the behavior spectrum is continuous , boundaries between diagnostic categories are necessarily somewhat arbitrary . sometimes the syndrome is divided into low - , medium - or high-functioning autism -lrb- lfa , mfa , and hfa -rrb- , based on iq thresholds , or on how much support the individual requires in daily life ; these subdivisions are not standardized and are controversial . autism can also be divided into syndromal and non-syndromal autism ; the syndromal autism is associated with severe or profound intellectual disability or a congenital syndrome with physical symptoms , such as tuberous sclerosis . although individuals with asperger syndrome tend to perform better cognitively than those with autism , the extent of the overlap between asperger syndrome , hfa , and non-syndromal autism is unclear . -some studies have reported diagnoses of autism in children due to a loss of language or social skills , as opposed to a failure to make progress , typically from 15 to 30 months of age . the validity of this distinction remains controversial ; it is possible that regressive autism is a specific subtype , or that there is a continuum of behaviors between autism with and without regression . -research into causes has been hampered by the inability to identify biologically meaningful subgroups within the autistic population and by the traditional boundaries between the disciplines of psychiatry , psychology , neurology and pediatrics . newer technologies such as fmri and diffusion tensor imaging can help identify biologically relevant phenotypes -lrb- observable traits -rrb- that can be viewed on brain scans , to help further neurogenetic studies of autism ; one example is lowered activity in the fusiform face area of the brain , which is associated with impaired perception of people versus objects . it has been proposed to classify autism using genetics as well as behavior . -about half of parents of children with asd notice their child 's unusual behaviors by age 18 months , and about four-fifths notice by age 24 months . according to an article in the `` journal of autism and developmental disorders '' , failure to meet any of the following milestones `` is an absolute indication to proceed with further evaluations . delay in referral for such testing may delay early diagnosis and treatment and affect the long-term outcome '' . -us and japanese practice is to screen all children for asd at 18 and 24 months , using autism-specific formal screening tests . in contrast , in the uk , children whose families or doctors recognize possible signs of autism are screened . it is not known which approach is more effective . screening tools include the modified checklist for autism in toddlers -lrb- m-chat -rrb- , the early screening of autistic traits questionnaire , and the first year inventory ; initial data on m-chat and its predecessor , the checklist for autism in toddlers -lrb- chat -rrb- , on children aged 18 -- 30 months suggests that it is best used in a clinical setting and that it has low sensitivity -lrb- many false-negatives -rrb- but good specificity -lrb- few false-positives -rrb- . it may be more accurate to precede these tests with a broadband screener that does not distinguish asd from other developmental disorders . screening tools designed for one culture 's norms for behaviors like eye contact may be inappropriate for a different culture . although genetic screening for autism is generally still impractical , it can be considered in some cases , such as children with neurological symptoms and dysmorphic features . -infection with rubella during pregnancy causes fewer than 1 % of cases of autism ; vaccination against rubella can prevent many of those cases . -the main goals when treating children with autism are to lessen associated deficits and family distress , and to increase quality of life and functional independence . in general , higher iqs are correlated with greater responsiveness to treatment and improved treatment outcomes . no single treatment is best and treatment is typically tailored to the child 's needs . families and the educational system are the main resources for treatment . studies of interventions have methodological problems that prevent definitive conclusions about efficacy , however the development of evidence-based interventions has advanced in recent years . although many psychosocial interventions have some positive evidence , suggesting that some form of treatment is preferable to no treatment , the methodological quality of systematic reviews of these studies has generally been poor , their clinical results are mostly tentative , and there is little evidence for the relative effectiveness of treatment options . intensive , sustained special education programs and behavior therapy early in life can help children acquire self-care , social , and job skills , and often improve functioning and decrease symptom severity and maladaptive behaviors ; claims that intervention by around age three years is crucial are not substantiated . available approaches include applied behavior analysis -lrb- aba -rrb- , developmental models , structured teaching , speech and language therapy , social skills therapy , and occupational therapy . among these approaches , interventions either treat autistic features comprehensively , or focalize treatment on a specific area of deficit . there is some evidence that early intensive behavioral intervention -lrb- eibi -rrb- , an early intervention model based on aba for 20 to 40 hours a week for multiple years , is an effective treatment for some children with asd . two theoretical frameworks outlined for early childhood intervention include applied behavioral analysis -lrb- aba -rrb- and developmental social pragmatic models -lrb- dsp -rrb- . one interventional strategy utilizes a parent training model , which teaches parents how to implement various aba and dsp techniques , allowing for parents to disseminate interventions themselves . various dsp programs have been developed to explicitly deliver intervention systems through at-home parent implementation . despite the recent development of parent training models , these interventions have demonstrated effectiveness in numerous studies , being evaluated as a probable efficacious mode of treatment . -educational interventions can be effective to varying degrees in most children : intensive aba treatment has demonstrated effectiveness in enhancing global functioning in preschool children and is well-established for improving intellectual performance of young children . similarly , teacher-implemented intervention that utilizes an aba combined with a developmental social pragmatic approach has been found to be a well-established treatment in improving social-communication skills in young children , although there is less evidence in its treatment of global symptoms . neuropsychological reports are often poorly communicated to educators , resulting in a gap between what a report recommends and what education is provided . it is not known whether treatment programs for children lead to significant improvements after the children grow up , and the limited research on the effectiveness of adult residential programs shows mixed results . the appropriateness of including children with varying severity of autism spectrum disorders in the general education population is a subject of current debate among educators and researchers . -many medications are used to treat asd symptoms that interfere with integrating a child into home or school when behavioral treatment fails . more than half of us children diagnosed with asd are prescribed psychoactive drugs or anticonvulsants , with the most common drug classes being antidepressants , stimulants , and antipsychotics . antipsychotics , such as risperidone and aripiprazole , have been found to be useful for treating irritability , repetitive behavior , and sleeplessness that often occurs with autism . there is scant reliable research about the effectiveness or safety of drug treatments for adolescents and adults with asd . a person with asd may respond atypically to medications , the medications can have adverse effects , and no known medication relieves autism 's core symptoms of social and communication impairments . experiments in mice have reversed or reduced some symptoms related to autism by replacing or modulating gene function , suggesting the possibility of targeting therapies to specific rare mutations known to cause autism . -alternative medicine . -although many alternative therapies and interventions are available , few are supported by scientific studies . treatment approaches have little empirical support in quality-of-life contexts , and many programs focus on success measures that lack predictive validity and real-world relevance . scientific evidence appears to matter less to service providers than program marketing , training availability , and parent requests . some alternative treatments may place the child at risk . a 2008 study found that compared to their peers , autistic boys have significantly thinner bones if on casein-free diets ; in 2005 , botched chelation therapy killed a five-year-old child with autism . there has been early research looking at hyperbaric treatments in children with autism . -treatment is expensive ; indirect costs are more so . for someone born in 2000 , a us study estimated an average lifetime cost of $ -lrb- net present value in dollars , inflation-adjusted from 2003 estimate -rrb- , with about 10 % medical care , 30 % extra education and other care , and 60 % lost economic productivity . publicly supported programs are often inadequate or inappropriate for a given child , and unreimbursed out-of-pocket medical or therapy expenses are associated with likelihood of family financial problems ; one 2008 us study found a 14 % average loss of annual income in families of children with asd , and a related study found that asd is associated with higher probability that child care problems will greatly affect parental employment . us states increasingly require private health insurance to cover autism services , shifting costs from publicly funded education programs to privately funded health insurance . after childhood , key treatment issues include residential care , job training and placement , sexuality , social skills , and estate planning . -society and culture . -the emergence of the autism rights movement has served as an attempt to encourage people to be more tolerant of those with autism . through this movement , people hope to cause others to think of autism as a difference instead of a disease . proponents of this movement wish to seek `` acceptance , not cures . '' there have also been many worldwide events promoting autism awareness such as world autism awareness day , light it up blue , autism sunday , autistic pride day , autreat , and others . there have also been many organizations dedicated to increasing the awareness of autism and the effects that autism has on someone 's life . these organizations include autism speaks , autism national committee , autism society of america , and many others . social-science scholars have had an increased focused on studying those with autism in hopes to learn more about `` autism as a culture , transcultural comparisons ... and research on social movements . '' media has had an influence on how the public perceives those with autism . rain man , a film that won 4 oscars , depicts a character with autism who has incredible talents and abilities . while many autistics do n't have these special abilities , there are some autistic individuals who have been successful in their fields . -there is no known cure . children recover occasionally , so that they lose their diagnosis of asd ; this occurs sometimes after intensive treatment and sometimes not . it is not known how often recovery happens ; reported rates in unselected samples of children with asd have ranged from 3 % to 25 % . most children with autism acquire language by age five or younger , though a few have developed communication skills in later years . most children with autism lack social support , meaningful relationships , future employment opportunities or self-determination . although core difficulties tend to persist , symptoms often become less severe with age . -few high-quality studies address long-term prognosis . some adults show modest improvement in communication skills , but a few decline ; no study has focused on autism after midlife . acquiring language before age six , having an iq above 50 , and having a marketable skill all predict better outcomes ; independent living is unlikely with severe autism . most , but not all , people with autism face significant obstacles in transitioning to adulthood . -most recent reviews tend to estimate a prevalence of 1 -- 2 per 1,000 for autism and close to 6 per 1,000 for asd , and 11 per 1,000 children in the united states for asd as of 2008 ; because of inadequate data , these numbers may underestimate asd 's true rate . globally , autism affects an estimated 21.7 million people as of 2013 , while asperger syndrome affects a further 31.1 million . in 2012 , the nhs estimated that the overall prevalence of autism among adults aged 18 years and over in the uk was 1.1 % . rates of pdd-nos 's has been estimated at 3.7 per 1,000 , asperger syndrome at roughly 0.6 per 1,000 , and childhood disintegrative disorder at 0.02 per 1,000 . -the number of reported cases of autism increased dramatically in the 1990s and early 2000s . this increase is largely attributable to changes in diagnostic practices , referral patterns , availability of services , age at diagnosis , and public awareness , though unidentified environmental risk factors can not be ruled out . the available evidence does not rule out the possibility that autism 's true prevalence has increased ; a real increase would suggest directing more attention and funding toward changing environmental factors instead of continuing to focus on genetics . -boys are at higher risk for asd than girls . the sex ratio averages 4.3:1 and is greatly modified by cognitive impairment : it may be close to 2:1 with intellectual disability and more than 5.5:1 without . several theories about the higher prevalence in males have been investigated , but the cause of the difference is unconfirmed ; one theory is that females are underdiagnosed . -although the evidence does not implicate any single pregnancy-related risk factor as a cause of autism , the risk of autism is associated with advanced age in either parent , and with diabetes , bleeding , and use of psychiatric drugs in the mother during pregnancy . the risk is greater with older fathers than with older mothers ; two potential explanations are the known increase in mutation burden in older sperm , and the hypothesis that men marry later if they carry genetic liability and show some signs of autism . most professionals believe that race , ethnicity , and socioeconomic background do not affect the occurrence of autism . -several other conditions are common in children with autism . they include : -a few examples of autistic symptoms and treatments were described long before autism was named . the `` table talk '' of martin luther , compiled by his notetaker , mathesius , contains the story of a 12-year-old boy who may have been severely autistic . luther reportedly thought the boy was a soulless mass of flesh possessed by the devil , and suggested that he be suffocated , although a later critic has cast doubt on the veracity of this report . the earliest well-documented case of autism is that of hugh blair of borgue , as detailed in a 1747 court case in which his brother successfully petitioned to annul blair 's marriage to gain blair 's inheritance . the wild boy of aveyron , a feral child caught in 1798 , showed several signs of autism ; the medical student jean itard treated him with a behavioral program designed to help him form social attachments and to induce speech via imitation . -the new latin word `` autismus '' -lrb- english translation `` autism '' -rrb- was coined by the swiss psychiatrist eugen bleuler in 1910 as he was defining symptoms of schizophrenia . he derived it from the greek word `` autós '' -lrb- αὐτός , meaning `` self '' -rrb- , and used it to mean morbid self-admiration , referring to `` autistic withdrawal of the patient to his fantasies , against which any influence from outside becomes an intolerable disturbance '' . -the word `` autism '' first took its modern sense in 1938 when hans asperger of the vienna university hospital adopted bleuler 's terminology `` autistic psychopaths '' in a lecture in german about child psychology . asperger was investigating an asd now known as asperger syndrome , though for various reasons it was not widely recognized as a separate diagnosis until 1981 . leo kanner of the johns hopkins hospital first used `` autism '' in its modern sense in english when he introduced the label `` early infantile autism '' in a 1943 report of 11 children with striking behavioral similarities . almost all the characteristics described in kanner 's first paper on the subject , notably `` autistic aloneness '' and `` insistence on sameness '' , are still regarded as typical of the autistic spectrum of disorders . it is not known whether kanner derived the term independently of asperger . -kanner 's reuse of `` autism '' led to decades of confused terminology like `` infantile schizophrenia '' , and child psychiatry 's focus on maternal deprivation led to misconceptions of autism as an infant 's response to `` refrigerator mothers '' . starting in the late 1960s autism was established as a separate syndrome by demonstrating that it is lifelong , distinguishing it from intellectual disability and schizophrenia and from other developmental disorders , and demonstrating the benefits of involving parents in active programs of therapy . as late as the mid-1970s there was little evidence of a genetic role in autism ; now it is thought to be one of the most heritable of all psychiatric conditions . although the rise of parent organizations and the destigmatization of childhood asd have deeply affected how we view asd , parents continue to feel social stigma in situations where their child 's autistic behavior is perceived negatively by others , and many primary care physicians and medical specialists still express some beliefs consistent with outdated autism research . -the internet has helped autistic individuals bypass nonverbal cues and emotional sharing that they find so hard to deal with , and has given them a way to form online communities and work remotely . sociological and cultural aspects of autism have developed : some in the community seek a cure , while others believe that autism is simply another way of being . -albedo -lrb- -rrb- , or `` reflection coefficient '' , derived from latin `` albedo '' `` whiteness '' -lrb- or reflected sunlight -rrb- in turn from `` albus '' `` white '' , is the diffuse reflectivity or reflecting power of a surface . -it is the ratio of reflected radiation from the surface to incident radiation upon it . its dimensionless nature lets it be expressed as a percentage and is measured on a scale from zero for no reflection of a perfectly black surface to 1 for perfect reflection of a white surface . -note : since it is the ratio of all reflected radiation to incident radiation it will include the diffuse and the specular radiation reflected . it is , however , common to assume a surface reflects in either a totally specular manner or a totally diffuse manner , as this can simplify calculations . -albedo depends on the frequency of the radiation . when quoted unqualified , it usually refers to some appropriate average across the spectrum of visible light . in general , the albedo depends on the directional distribution of incident radiation , except for lambertian surfaces , which scatter radiation in all directions according to a cosine function and therefore have an albedo that is independent of the incident distribution . in practice , a bidirectional reflectance distribution function -lrb- brdf -rrb- may be required to accurately characterize the scattering properties of a surface , but albedo is very useful as a first approximation . -the albedo is an important concept in climatology , astronomy , and calculating reflectivity of surfaces in leed sustainable-rating systems for buildings . the average overall albedo of earth , its `` planetary albedo '' , is 30 to 35 % because of cloud cover , but widely varies locally across the surface because of different geological and environmental features . -the term was introduced into optics by johann heinrich lambert in his 1760 work `` photometria '' . -terrestrial albedo . -albedos of typical materials in visible light range from up to 0.9 for fresh snow to about 0.04 for charcoal , one of the darkest substances . deeply shadowed cavities can achieve an effective albedo approaching the zero of a black body . when seen from a distance , the ocean surface has a low albedo , as do most forests , whereas desert areas have some of the highest albedos among landforms . most land areas are in an albedo range of 0.1 to 0.4 . the average albedo of earth is about 0.3 . this is far higher than for the ocean primarily because of the contribution of clouds . -earth 's surface albedo is regularly estimated via earth observation satellite sensors such as nasa 's modis instruments on board the terra and aqua satellites . as the total amount of reflected radiation can not be directly measured by satellite , a mathematical model of the brdf is used to translate a sample set of satellite reflectance measurements into estimates of directional-hemispherical reflectance and bi-hemispherical reflectance -lrb- e.g. -rrb- . -earth 's average surface temperature due to its albedo and the greenhouse effect is currently about 15 ° c . if earth were frozen entirely -lrb- and hence be more reflective -rrb- the average temperature of the planet would drop below − 40 ° c . if only the continental land masses became covered by glaciers , the mean temperature of the planet would drop to about 0 ° c . in contrast , if the entire earth is covered by water -- a so-called aquaplanet -- the average temperature on the planet would rise to just under 27 ° c. -white-sky and black-sky albedo . -it has been shown that for many applications involving terrestrial albedo , the albedo at a particular solar zenith angle '' θ '' `` i '' can reasonably be approximated by the proportionate sum of two terms : the directional-hemispherical reflectance at that solar zenith angle , formula_1 , and the bi-hemispherical reflectance , formula_2 the proportion concerned being defined as the proportion of diffuse illumination formula_3 . -albedo formula_4 can then be given as : -directional-hemispherical reflectance is sometimes referred to as black-sky albedo and bi-hemispherical reflectance as white-sky albedo . these terms are important because they allow the albedo to be calculated for any given illumination conditions from a knowledge of the intrinsic properties of the surface . -astronomical albedo . -the albedos of planets , satellites and asteroids can be used to infer much about their properties . the study of albedos , their dependence on wavelength , lighting angle -lrb- `` phase angle '' -rrb- , and variation in time comprises a major part of the astronomical field of photometry . for small and far objects that can not be resolved by telescopes , much of what we know comes from the study of their albedos . for example , the absolute albedo can indicate the surface ice content of outer solar system objects , the variation of albedo with phase angle gives information about regolith properties , whereas unusually high radar albedo is indicative of high metal content in asteroids . -enceladus , a moon of saturn , has one of the highest known albedos of any body in the solar system , with 99 % of em radiation reflected . another notable high-albedo body is eris , with an albedo of 0.96 . many small objects in the outer solar system and asteroid belt have low albedos down to about 0.05 . a typical comet nucleus has an albedo of 0.04 . such a dark surface is thought to be indicative of a primitive and heavily space weathered surface containing some organic compounds . -the overall albedo of the moon is around 0.12 , but it is strongly directional and non-lambertian , displaying also a strong opposition effect . although such reflectance properties are different from those of any terrestrial terrains , they are typical of the regolith surfaces of airless solar system bodies . -two common albedos that are used in astronomy are the -lrb- v-band -rrb- geometric albedo -lrb- measuring brightness when illumination comes from directly behind the observer -rrb- and the bond albedo -lrb- measuring total proportion of electromagnetic energy reflected -rrb- . their values can differ significantly , which is a common source of confusion . -in detailed studies , the directional reflectance properties of astronomical bodies are often expressed in terms of the five hapke parameters which semi-empirically describe the variation of albedo with phase angle , including a characterization of the opposition effect of regolith surfaces . -the correlation between astronomical -lrb- geometric -rrb- albedo , absolute magnitude and diameter is : -where formula_7 is the astronomical albedo , formula_8 is the diameter in kilometers , and formula_9 is the absolute magnitude . -examples of terrestrial albedo effects . -although the albedo -- temperature effect is best known in colder , whiter regions on earth , the maximum albedo is actually found in the tropics where year-round illumination is greater . the maximum is additionally in the northern hemisphere , varying between three and twelve degrees north . the minima are found in the subtropical regions of the northern and southern hemispheres , beyond which albedo increases without respect to illumination . -insolation effects . -the intensity of albedo temperature effects depend on the amount of albedo and the level of local insolation ; high albedo areas in the arctic and antarctic regions are cold due to low insolation , where areas such as the sahara desert , which also have a relatively high albedo , will be hotter due to high insolation . tropical and sub-tropical rain forest areas have low albedo , and are much hotter than their temperate forest counterparts , which have lower insolation . because insolation plays such a big role in the heating and cooling effects of albedo , high insolation areas like the tropics will tend to show a more pronounced fluctuation in local temperature when local albedo changes . -climate and weather . -albedo affects climate and drives weather . all weather is a result of the uneven heating of earth caused by different areas of the planet having different albedos . essentially , for the driving of weather , there are two types of albedo regions on earth : land and ocean . land and ocean regions produce the four basic different types of air masses , depending on latitude and therefore insolation : warm and dry , which form over tropical and sub-tropical land masses ; warm and wet , which form over tropical and sub-tropical oceans ; cold and dry which form over temperate , polar and sub-polar land masses ; and cold and wet , which form over temperate , polar and sub-polar oceans . different temperatures between the air masses result in different air pressures , and the masses develop into pressure systems . high pressure systems flow toward lower pressure , driving weather from north to south in the northern hemisphere , and south to north in the lower ; however due to the spinning of earth , the coriolis effect further complicates flow and creates several weather/climate bands and the jet streams . -albedo -- temperature feedback . -when an area 's albedo changes due to snowfall , a snow -- temperature feedback results . a layer of snowfall increases local albedo , reflecting away sunlight , leading to local cooling . in principle , if no outside temperature change affects this area -lrb- e.g. a warm air mass -rrb- , the raised albedo and lower temperature would maintain the current snow and invite further snowfall , deepening the snow -- temperature feedback . however , because local weather is dynamic due to the change of seasons , eventually warm air masses and a more direct angle of sunlight -lrb- higher insolation -rrb- cause melting . when the melted area reveals surfaces with lower albedo , such as grass or soil , the effect is reversed : the darkening surface lowers albedo , increasing local temperatures , which induces more melting and thus reducing the albedo further , resulting in still more heating . -snow albedo is highly variable , ranging from as high as 0.9 for freshly fallen snow , to about 0.4 for melting snow , and as low as 0.2 for dirty snow . over antarctica they average a little more than 0.8 . if a marginally snow-covered area warms , snow tends to melt , lowering the albedo , and hence leading to more snowmelt because more radiation is being absorbed by the snowpack -lrb- the ice -- albedo positive feedback -rrb- . cryoconite , powdery windblown dust containing soot , sometimes reduces albedo on glaciers and ice sheets . -hence , small errors in albedo can lead to large errors in energy estimates , which is why it is important to measure the albedo of snow-covered areas through remote sensing techniques rather than applying a single value over broad regions . -small-scale effects . -albedo works on a smaller scale , too . in sunlight , dark clothes absorb more heat and light-coloured clothes reflect it better , thus allowing some control over body temperature by exploiting the albedo effect of the colour of external clothing . -solar photovoltaic effects . -albedo can affect the electrical energy output of solar photovoltaic devices . for example , the effects of a spectrally responsive albedo are illustrated by the differences between the spectrally weighted albedo of solar photovoltaic technology based on hydrogenated amorphous silicon -lrb- a-si : h -rrb- and crystalline silicon -lrb- c-si -rrb- - based compared to traditional spectral-integrated albedo predictions . research showed impacts of over 10 % . more recently , the analysis was extended to the effects of spectral bias due to the specular reflectivity of 22 commonly occurring surface materials -lrb- both human-made and natural -rrb- and analyzes the albedo effects on the performance of seven photovoltaic materials covering three common photovoltaic system topologies : industrial -lrb- solar farms -rrb- , commercial flat rooftops and residential pitched-roof applications . -because forests generally have a low albedo , -lrb- the majority of the ultraviolet and visible spectrum is absorbed through photosynthesis -rrb- , some scientists have suggested that greater heat absorption by trees could offset some of the carbon benefits of afforestation -lrb- or offset the negative climate impacts of deforestation -rrb- . in the case of evergreen forests with seasonal snow cover albedo reduction may be great enough for deforestation to cause a net cooling effect . trees also impact climate in extremely complicated ways through evapotranspiration . the water vapor causes cooling on the land surface , causes heating where it condenses , acts a strong greenhouse gas , and can increase albedo when it condenses into clouds scientists generally treat evapotranspiration as a net cooling impact , and the net climate impact of albedo and evapotranspiration changes from deforestation depends greatly on local climate -in seasonally snow-covered zones , winter albedos of treeless areas are 10 % to 50 % higher than nearby forested areas because snow does not cover the trees as readily . deciduous trees have an albedo value of about 0.15 to 0.18 whereas coniferous trees have a value of about 0.09 to 0.15 . -studies by the hadley centre have investigated the relative -lrb- generally warming -rrb- effect of albedo change and -lrb- cooling -rrb- effect of carbon sequestration on planting forests . they found that new forests in tropical and midlatitude areas tended to cool ; new forests in high latitudes -lrb- e.g. siberia -rrb- were neutral or perhaps warming . -water reflects light very differently from typical terrestrial materials . the reflectivity of a water surface is calculated using the fresnel equations -lrb- see graph -rrb- . -at the scale of the wavelength of light even wavy water is always smooth so the light is reflected in a locally specular manner -lrb- not diffusely -rrb- . the glint of light off water is a commonplace effect of this . at small angles of incident light , waviness results in reduced reflectivity because of the steepness of the reflectivity-vs . - incident-angle curve and a locally increased average incident angle . -although the reflectivity of water is very low at low and medium angles of incident light , it becomes very high at high angles of incident light such as those that occur on the illuminated side of earth near the terminator -lrb- early morning , late afternoon , and near the poles -rrb- . however , as mentioned above , waviness causes an appreciable reduction . because light specularly reflected from water does not usually reach the viewer , water is usually considered to have a very low albedo in spite of its high reflectivity at high angles of incident light . -note that white caps on waves look white -lrb- and have high albedo -rrb- because the water is foamed up , so there are many superimposed bubble surfaces which reflect , adding up their reflectivities . fresh ` black ' ice exhibits fresnel reflection . -cloud albedo has substantial influence over atmospheric temperatures . different types of clouds exhibit different reflectivity , theoretically ranging in albedo from a minimum of near 0 to a maximum approaching 0.8 . `` on any given day , about half of earth is covered by clouds , which reflect more sunlight than land and water . clouds keep earth cool by reflecting sunlight , but they can also serve as blankets to trap warmth . '' -albedo and climate in some areas are affected by artificial clouds , such as those created by the contrails of heavy commercial airliner traffic . a study following the burning of the kuwaiti oil fields during iraqi occupation showed that temperatures under the burning oil fires were as much as 10 ° c colder than temperatures several miles away under clear skies . -aerosol effects . -aerosols -lrb- very fine particles/droplets in the atmosphere -rrb- have both direct and indirect effects on earth 's radiative balance . the direct -lrb- albedo -rrb- effect is generally to cool the planet ; the indirect effect -lrb- the particles act as cloud condensation nuclei and thereby change cloud properties -rrb- is less certain . as per the effects are : -black carbon . -another albedo-related effect on the climate is from black carbon particles . the size of this effect is difficult to quantify : the intergovernmental panel on climate change estimates that the global mean radiative forcing for black carbon aerosols from fossil fuels is +0.2 w m − 2 , with a range +0.1 to +0.4 w m − 2 . black carbon is a bigger cause of the melting of the polar ice cap in the arctic than carbon dioxide due to its effect on the albedo . -human activities . -human activities -lrb- e.g. deforestation , farming , and urbanization -rrb- change the albedo of various areas around the globe . however , quantification of this effect on the global scale is difficult . -other types of albedo . -single-scattering albedo is used to define scattering of electromagnetic waves on small particles . it depends on properties of the material -lrb- refractive index -rrb- ; the size of the particle or particles ; and the wavelength of the incoming radiation . -a -lrb- named , plural `` as '' , `` a 's '' , `` a `` s , `` a 's '' or `` aes '' -rrb- is the first letter and the first vowel in the iso basic latin alphabet . it is similar to the ancient greek letter alpha , from which it derives . the upper-case version consists of the two slanting sides of a triangle , crossed in the middle by a horizontal bar . the lower-case version can be written in two forms : the double-storey a and single-storey ɑ . the latter is commonly used in handwriting and fonts based on it , especially fonts intended to be read by children . it is also found in italic type . -the earliest certain ancestor of `` a '' is aleph -lrb- also written ` aleph -rrb- , the first letter of the phoenician alphabet -lrb- which consisted entirely of consonants , thereby being an abjad rather than a true alphabet -rrb- . in turn , the origin of aleph may have been a pictogram of an ox head in proto-sinaitic script influenced by egyptian hieroglyphs , styled as a triangular head with two horns extended . -in 1600 b.c.e. , the phoenician alphabet 's letter had a linear form that served as the base for some later forms . its name must have corresponded closely to the hebrew or arabic aleph . -when the ancient greeks adopted the alphabet , they had no use for the glottal stop -- the first phoneme of the phoenician pronunciation of the letter , and the sound that the letter denoted in phoenician and other semitic languages -- so they used an adaptation of the sign to represent the vowel , and gave it the similar name of alpha . in the earliest greek inscriptions after the greek dark ages , dating to the 8th century bc , the letter rests upon its side , but in the greek alphabet of later times it generally resembles the modern capital letter , although many local varieties can be distinguished by the shortening of one leg , or by the angle at which the cross line is set . -the etruscans brought the greek alphabet to their civilization in the italian peninsula and left the letter unchanged . the romans later adopted the etruscan alphabet to write the latin language , and the resulting letter was preserved in the latin alphabet used to write many languages , including english . -typographic variants . -during roman times , there were many variations on the letter `` a '' . first was the monumental or lapidary style , which was used when inscribing on stone or other `` permanent '' mediums . for perishable surfaces , which were used for everyday or utilitarian purposes , a cursive style was used . due to the `` perishable '' nature of the surfaces , examples of this style are not as common as those of the monumental . this perishable style was called cursive and numerous variations have survived , such as majuscule cursive , minuscule cursive , and semicursive minuscule . there were also variants intermediate between the monumental and the cursive . the known variants include the early semi-uncial , the uncial , and the later semi-uncial . -at the end of the roman empire -lrb- 5th century ad -rrb- , several variants of the cursive minuscule developed through western europe . among these were the semicursive minuscule of italy , the merovingian script in france , the visigothic script in spain , and the insular or anglo-irish semi-uncial or anglo-saxon majuscule , of great britain . by the 9th century , the caroline script , which was very similar to the present-day form , was the principal form used in book-making , before the advent of the printing press . this form was derived through a combining of prior forms . -15th-century italy saw the formation of the two main variants that are known today . these variants , the `` italic '' and `` roman '' forms , were derived from the caroline script version . the italic form used in most current handwriting consists of a circle and vertical stroke -lrb- -rrb- , called latin alpha or `` script a '' . this slowly developed from the fifth-century form resembling the greek letter tau in the hands of medieval irish and english writers . most printed material uses the roman form consisting of a small loop with an arc over it -lrb- -rrb- . both derive from the majuscule -lrb- capital -rrb- form . in greek handwriting , it was common to join the left leg and horizontal stroke into a single loop , as demonstrated by the uncial version shown . many fonts then made the right leg vertical . in some of these , the serif that began the right leg stroke developed into an arc , resulting in the printed form , while in others it was dropped , resulting in the modern handwritten form . -use in writing systems . -in modern english orthography , the letter represents seven different vowel sounds : -the double sequence does not occur in native english words , but is found in some words derived from foreign languages such as `` aaron '' and `` aardvark '' . however , occurs in many common digraphs , all with their own sound or sounds , particularly , , , , and . -is the third-most-commonly used letter in english -lrb- after and -rrb- , and the second most common in spanish and french . in one study , on average , about 3.68 % of letters used in english texts tend to be , while the number is 6.22 % in spanish and 3.95 % in french . -other languages . -in most languages that use the latin alphabet , denotes an open unrounded vowel , such as , , or . an exception is saanich , in which -lrb- and the glyph á -rrb- stands for a close-mid front unrounded vowel . -other systems . -in phonetic and phonemic notation : -other uses . -in algebra , the letter `` a '' along with other letters at the beginning of the alphabet is used to represent known quantities , whereas the letters at the end of the alphabet -lrb- x , y , z -rrb- are used to denote unknown quantities . -in geometry , capital a , b , c etc. are used to denote segments , lines , rays , etc. . a capital a is also typically used as one of the letters to represent an angle in a triangle , the lowercase a representing the side opposite angle a . -in logic , a is used to signify the universal affirmative . -in physics , a is the si unit symbol for ampere . -`` a '' is often used to denote something or someone of a better or more prestigious quality or status : a - , a or a + , the best grade that can be assigned by teachers for students ' schoolwork ; `` a grade '' for clean restaurants ; a-list celebrities , etc. . such associations can have a motivating effect , as exposure to the letter a has been found to improve performance , when compared with other letters . -finally , the letter a is used to denote size , as in a narrow size shoe , or a small cup size in a brassiere . -alabama -lrb- -rrb- is a state located in the southeastern region of the united states . it is bordered by tennessee to the north , georgia to the east , florida and the gulf of mexico to the south , and mississippi to the west . alabama is the 30th-most extensive and the 23rd-most populous of the 50 united states . at , alabama has one of the longest navigable inland waterways in the nation . -from the american civil war until world war ii , alabama , like many southern states , suffered economic hardship , in part because of continued dependence on agriculture . despite the growth of major industries and urban centers , white rural interests dominated the state legislature from 1901 to the 1960s , as it did not regularly reapportion the legislature from 1901 to 1961 ; urban interests and african americans were markedly under-represented . african americans and poor whites were essentially disenfranchised altogether by the state constitution of 1901 , a status that continued into the mid-1960s before being alleviated by federal legislation . exclusion of minorities continued under at-large voting systems in most counties ; some changes were made through a series of omnibus court cases in the late 1980s to establish different electoral systems . -following world war ii , alabama experienced growth as the economy of the state changed from one primarily based on agriculture to one with diversified interests . the power of the solid south in congress gained the establishment or expansion of multiple united states armed forces installations , which helped to bridge the gap between an agricultural and industrial economy during the mid-20th century . the state economy in the 21st century is based on management , automotive , finance , manufacturing , aerospace , mineral extraction , healthcare , education , retail , and technology . -alabama is nicknamed the `` yellowhammer state '' , after the state bird . alabama is also known as the `` heart of dixie '' and the `` cotton state '' . the state tree is the longleaf pine , and the state flower is the camellia . the capital of alabama is montgomery . the largest city by population is birmingham , which has long been the most industrialized city , and largest city by total land area is huntsville . the oldest city is mobile , founded by french colonists . -the european-american naming of the alabama river and state originates from the alabama people , a muskogean-speaking tribe whose members lived just below the confluence of the coosa and tallapoosa rivers on the upper reaches of the river . in the alabama language , the word for an alabama person is `` albaamo '' -lrb- or variously `` albaama '' or `` albàamo '' in different dialects ; the plural form is `` albaamaha '' -rrb- . -the word `` alabama '' is believed to have come from the related choctaw language and was adopted by the alabama tribe as their name . the spelling of the word varies significantly among historical sources . the first usage appears in three accounts of the hernando de soto expedition of 1540 with garcilaso de la vega using `` alibamo '' , while the knight of elvas and rodrigo ranjel wrote `` alibamu '' and `` limamu '' , respectively , in efforts to transliterate the term . as early as 1702 , the french called the tribe the `` alibamon , '' with french maps identifying the river as `` rivière des alibamons '' . other spellings of the appellation have included `` alibamu '' , `` alabamo '' , `` albama '' , `` alebamon '' , `` alibama '' , `` alibamou '' , `` alabamu '' , `` allibamou '' . -sources disagree on the meaning of the word . an 1842 article in the `` jacksonville republican '' proposed that it meant `` here we rest . '' this notion was popularized in the 1850s through the writings of alexander beaufort meek . experts in the muskogean languages have been unable to find any evidence to support such a translation . -scholars believe the word comes from the choctaw `` alba '' -lrb- meaning `` plants '' or `` weeds '' -rrb- and `` amo '' -lrb- meaning `` to cut '' , `` to trim '' , or `` to gather '' -rrb- . the meaning may have been `` clearers of the thicket '' or `` herb gatherers '' , referring to clearing land for cultivation or collecting medicinal plants . the state has numerous place names of native american origin . -pre-european settlement . -indigenous peoples of varying cultures lived in the area for thousands of years before european colonization . trade with the northeastern tribes via the ohio river began during the burial mound period -lrb- 1000 bc -- ad 700 -rrb- and continued until european contact . -the agrarian mississippian culture covered most of the state from 1000 to 1600 ad , with one of its major centers built at what is now the moundville archaeological site in moundville , alabama . this is the second-largest complex of the classic middle mississippian era , after cahokia in present-day illinois , which was the center of the culture . analysis of artifacts recovered from archaeological excavations at moundville were the basis of scholars ' formulating the characteristics of the southeastern ceremonial complex -lrb- secc -rrb- . contrary to popular belief , the secc appears to have no direct links to mesoamerican culture , but developed independently . the ceremonial complex represents a major component of the religion of the mississippian peoples ; it is one of the primary means by which their religion is understood . -among the historical tribes of native american people living in the area of present-day alabama at the time of european contact were the cherokee , an iroquoian language people ; and the muskogean-speaking alabama -lrb- `` alibamu '' -rrb- , chickasaw , choctaw , creek , and koasati . while part of the same large language family , the muskogee tribes developed distinct cultures and languages . -european settlement . -with exploration in the 16th century , the spanish were the first europeans to reach alabama . the expedition of hernando de soto passed through mabila and other parts of the state in 1540 . more than 160 years later , the french founded the first european settlement in the region at old mobile in 1702 . the city was moved to the current site of mobile in 1711 . this area was claimed by the french from 1702 to 1763 as part of la louisiane . -after the french lost to the british in the seven years ' war , it became part of british west florida from 1763 to 1783 . after the united states victory in the american revolutionary war , the territory was divided between the united states and spain . the latter retained control of this western territory from 1783 until the surrender of the spanish garrison at mobile to u.s. forces on april 13 , 1813 . -thomas bassett , a loyalist to the british monarchy during the revolutionary era , was one of the earliest white settlers in the state outside mobile . he settled in the tombigbee district during the early 1770s . the boundaries of the district were roughly limited to the area within a few miles of the tombigbee river and included portions of what is today southern clarke county , northernmost mobile county , and most of washington county . -what is now the counties of baldwin and mobile became part of spanish west florida in 1783 , part of the independent republic of west florida in 1810 , and was finally added to the mississippi territory in 1812 . most of what is now the northern two-thirds of alabama was known as the yazoo lands beginning during the british colonial period . it was claimed by the province of georgia from 1767 onwards . following the revolutionary war , it remained a part of georgia , although heavily disputed . -with the exception of the area around mobile and the yazoo lands , what is now the lower one-third alabama was made part of the mississippi territory when it was organized in 1798 . the yazoo lands were added to the territory in 1804 , following the yazoo land scandal . spain kept a claim on its former spanish west florida territory in what would become the coastal counties until the adams -- onís treaty officially ceded it to the united states in 1819 . -19th century . -prior to the admission of mississippi as a state on december 10 , 1817 , the more sparsely settled eastern half of the territory was separated and named the alabama territory . the alabama territory was created by the united states congress on march 3 , 1817 . st. stephens , now abandoned , served as the territorial capital from 1817 to 1819 . -the u.s. congress selected huntsville as the site for the first constitutional convention of alabama after it was approved to become the 22nd state . from july 5 to august 2 , 1819 , delegates met to prepare the new state constitution . huntsville served as the temporary capital of alabama from 1819 to 1820 , when the seat of state government was moved to cahaba in dallas county . -cahaba , now a ghost town , was the first permanent state capital from 1820 to 1825 . alabama fever was already underway when the state was admitted to the union , with settlers and land speculators pouring into the state to take advantage of fertile land suitable for cotton cultivation . part of the frontier in the 1820s and 1830s , its constitution provided for universal suffrage for white men . -southeastern planters and traders from the upper south brought slaves with them as the cotton plantations in alabama expanded . the economy of the central black belt -lrb- named for its dark , productive soil -rrb- was built around large cotton plantations whose owners ' wealth grew largely from slave labor . the area also drew many poor , disfranchised people who became subsistence farmers . alabama had a population estimated at under 10,000 people in 1810 , but it had increased to more than 300,000 people by 1830 . most native american tribes were completely removed from the state within a few years of the passage of the indian removal act by congress in 1830 . -from 1826 to 1846 , tuscaloosa served as the capital of alabama . on january 30 , 1846 , the alabama legislature announced that it had voted to move the capital city from tuscaloosa to montgomery . the first legislative session in the new capital met in december 1847 . a new capitol building was erected under the direction of stephen decatur button of philadelphia . the first structure burned down in 1849 , but was rebuilt on the same site in 1851 . this second capitol building in montgomery remains to the present day . it was designed by barachias holt of exeter , maine . -by 1860 , the population had increased to a total of 964,201 people , of which nearly half , 435,080 were enslaved african americans , and 2,690 were free people of color . on january 11 , 1861 , alabama declared its secession from the union . after remaining an independent republic for a few days , it joined the confederate states of america . the confederacy 's capital was initially located at montgomery . alabama was heavily involved in the american civil war . although comparatively few battles were fought in the state , alabama contributed about 120,000 soldiers to the war effort . -a company of cavalry soldiers from huntsville , alabama joined nathan bedford forrest 's battalion in hopkinsville , kentucky . the company wore new uniforms with yellow trim on the sleeves , collar and coat tails . this led to them being greeted with `` yellowhammer '' , and the name later was applied to all alabama troops in the confederate army . -alabama 's slaves were freed by the 13th amendment in 1865 . alabama was under military rule from the end of the war in may 1865 until its official restoration to the union in 1868 . from 1867 to 1874 , with most white citizens barred temporarily from voting and freedmen enfranchised , many african americans emerged as political leaders in the state . alabama was represented in congress during this period by three african-american congressmen : jeremiah haralson , benjamin s. turner , and james t. rapier . -following the war , the state remained chiefly agricultural , with an economy tied to cotton . during reconstruction , state legislators ratified a new state constitution in 1868 that created the state 's first public school system and expanded women 's rights . legislators funded numerous public road and railroad projects , although these were plagued with allegations of fraud and misappropriation . organized insurgent , resistance groups tried to suppress the freedmen and republicans . besides the short-lived original ku klux klan , these included the pale faces , knights of the white camellia , red shirts , and the white league . -reconstruction in alabama ended in 1874 , when the democrats regained control of the legislature and governor 's office through an election dominated by fraud and violence . they wrote another constitution in 1875 , and the legislature passed the blaine amendment , prohibiting public money from being used to finance religious-affiliated schools . the same year , legislation was approved that called for racially segregated schools . railroad passenger cars were segregated in 1891 . after disfranchising most african americans and many poor whites in the 1901 constitution , the alabama legislature passed more jim crow laws at the beginning of the 20th century to impose segregation in everyday life . -20th century . -the new 1901 constitution of alabama included provisions for voter registration that effectively disenfranchised large portions of the population , including nearly all african americans and native americans , and tens of thousands of poor whites , through making voter registration difficult , requiring a poll taxes and literacy test . by 1903 , only 2,980 african americans were registered in alabama , although at least 74,000 were literate . this compared to more than 181,000 african americans eligible to vote in 1900 . the numbers dropped even more in later decades . -while the planter class had persuaded poor whites to vote for this legislative effort to suppress black voting , the new restrictions resulted in their disenfranchisement as well , due mostly to the imposition of a cumulative poll tax . by 1941 , whites constituted a slight majority of those disenfranchised by these laws : 600,000 whites vs. 520,000 african-americans . nearly all african americans had lost the ability to vote . despite numerous legal challenges that succeeded in overturning certain provisions , the state legislature would create new ones to maintain disenfranchisement . the exclusion of blacks from the political system persisted until after passage of federal civil rights legislation in the 1965 to enforce their constitutional rights as citizens . -the 1901 constitution required racial segregation of public schools . it also restated that interracial marriage was illegal , as it had been prohibited in 1867 . into the 1950s , the state legislature passed additional racial segregation laws related to public facilities : jails were segregated in 1911 ; hospitals in 1915 ; toilets , hotels , and restaurants in 1928 ; and bus stop waiting rooms in 1945 . -the rural-dominated alabama legislature consistently underfunded schools and services for the disenfranchised african americans , but it did not relieve them of paying taxes . partially as a response to chronic underfunding of education for african americans in the south , the rosenwald fund began funding the construction of what came to be known as rosenwald schools . in alabama these schools were designed and the construction partially financed with rosenwald funds , which paid one-third of the construction costs . the fund required the local community and state to raise matching funds to pay the rest . black residents effectively taxed themselves twice , by raising additional monies to supply matching funds for such schools , which were built in many rural areas . they often donated land and labor as well . -beginning in 1913 , the first 80 rosenwald schools were built in alabama for african-american children . a total of 387 schools , seven teachers ' houses , and several vocational buildings were completed by 1937 in the state . several of the surviving school buildings in the state are now listed on the national register of historic places . -continued racial discrimination and lynchings , agricultural depression , and the failure of the cotton crops due to boll weevil infestation led tens of thousands of african americans from rural alabama and other states to seek opportunities in northern and midwestern cities during the early decades of the 20th century as part of the great migration out of the south . reflecting this emigration , the population growth rate in alabama -lrb- see `` historical populations '' table below -rrb- dropped by nearly half from 1910 to 1920 . -at the same time , many rural people , both white and african american , migrated to the city of birmingham to work in new industrial jobs . birmingham experienced such rapid growth that it was called the `` magic city '' . by the 1920s , birmingham was the 19th-largest city in the united states and had more than 30 % of the state 's population . heavy industry and mining were the basis of its economy . its residents were under-represented for decades in the state legislature , which refused to redistrict after each decennial census according to population changes , as it was required by the state constitution . this did not change until the late 1960s following a lawsuit and court order . -industrial development related to the demands of world war ii brought a level of prosperity to the state not seen since before the civil war . rural workers poured into the largest cities in the state for better jobs and a higher standard of living . one example of this massive influx of workers occurred in mobile . between 1940 and 1943 , more than 89,000 people moved into the city to work for war-related industries . cotton and other cash crops faded in importance as the state developed a manufacturing and service base . -despite massive population changes in the state from 1901 to 1961 , the rural-dominated legislature refused to reapportion house and senate seats based on population , as required by the state constitution to follow the results of decennial censuses . they held on to old representation to maintain political and economic power in agricultural areas . in addition , the state legislature gerrymandered the few birmingham legislative seats to ensure election by persons living outside birmingham . -one result was that jefferson county , containing birmingham 's industrial and economic powerhouse , contributed more than one-third of all tax revenue to the state , but did not receive a proportional amount in services . urban interests were consistently underrepresented in the legislature . a 1960 study noted that because of rural domination , `` a minority of about 25 per cent of the total state population is in majority control of the alabama legislature . '' -a class action suit initiated on behalf of plaintiffs in lowndes county , alabama challenged the state legislature 's lack of redistricting for congressional seats . in 1962 `` white v. crook '' , judge frank m. johnson ordered the state to redistrict . united states supreme court cases of `` baker v. carr '' -lrb- 1962 -rrb- and `` reynolds v. sims '' -lrb- 1964 -rrb- ruled that the principle of `` one man , one vote '' needed to be the basis of both houses of state legislatures as well , and that their districts had to be based on population , rather than geographic counties , as alabama had used for its senate . -in 1972 , for the first time since 1901 , the legislature completed the first congressional redistricting based on the decennial census . this benefited the urban areas that had developed , as well as all in the population who had been underrepresented for more than 60 years . other changes were made to implement representative state house and senate districts . -african americans continued to press in the 1950s and 1960s to end disenfranchisement and segregation in the state through the civil rights movement , including legal challenges . in 1954 , the us supreme court ruled in `` brown v. board of education '' that public schools had to be desegregated , but alabama was slow to comply . during the 1960s , under governor george wallace , alabama resisted compliance with federal demands for desegregation.the civil rights movement had notable events in alabama , including the montgomery bus boycott -lrb- 1955 -- 56 -rrb- , freedom rides in 1961 , and 1965 selma to montgomery marches . these contributed to congressional passage and enactment of the civil rights act of 1964 and voting rights act of 1965 by the u.s. congress . -legal segregation ended in the states in 1964 , but jim crow customs often continued until specifically challenged in court . -despite recommendations of a 1973 alabama constitutional commission , the state legislature did not approve an amendment to establish home rule for counties . there is very limited home rule , but the legislature is deeply involved in passing legislation that applies to county-level functions and policies . this both deprives local residents of the ability to govern themselves and distracts the legislature from statewide issues . -alabama has made some changes since the late 20th century and has used new types of voting to increase representation . in the 1980s , an omnibus redistricting case , `` dillard v. crenshaw county , '' challenged the at-large voting for representative seats of 180 alabama jurisdictions , including counties and school boards . at-large voting had diluted the votes of any minority in a county , as the majority tended to take all seats . despite african americans making up a significant minority in the state , they had been unable to elect any representatives in most of the at-large jurisdictions . -as part of settlement of this case , five alabama cites and counties , including chilton county , adopted a system of cumulative voting for election of representatives in multi-seat jurisdictions . this has resulted in more proportional representation for voters . in another form of proportional representation , 23 jurisdictions use limited voting , as in conecuh county . in 1982 , limited voting was first tested in conecuh county . together use of these systems has increased the number of african americans and women being elected to local offices , resulting in governments that are more representative of their citizens . -alabama is the thirtieth-largest state in the united states with of total area : 3.2 % of the area is water , making alabama 23rd in the amount of surface water , also giving it the second-largest inland waterway system in the u.s. . about three-fifths of the land area is a gentle plain with a general descent towards the mississippi river and the gulf of mexico . the north alabama region is mostly mountainous , with the tennessee river cutting a large valley and creating numerous creeks , streams , rivers , mountains , and lakes . -alabama is bordered by the states of tennessee to the north , georgia to the east , florida to the south , and mississippi to the west . alabama has coastline at the gulf of mexico , in the extreme southern edge of the state . the state ranges in elevation from sea level at mobile bay to over 1,800 feet -lrb- 550 m -rrb- in the appalachian mountains in the northeast . -the highest point is mount cheaha , at a height of . alabama 's land consists of of forest or 67 % of total land area . suburban baldwin county , along the gulf coast , is the largest county in the state in both land area and water area . -areas in alabama administered by the national park service include horseshoe bend national military park near alexander city ; little river canyon national preserve near fort payne ; russell cave national monument in bridgeport ; tuskegee airmen national historic site in tuskegee ; and tuskegee institute national historic site near tuskegee . -additionally , alabama has four national forests : conecuh , talladega , tuskegee , and william b. bankhead . alabama also contains the natchez trace parkway , the selma to montgomery national historic trail , and the trail of tears national historic trail . a notable natural wonder in alabama is `` natural bridge '' rock , the longest natural bridge east of the rockies , located just south of haleyville . -a - wide meteorite impact crater is located in elmore county , just north of montgomery . this is the wetumpka crater , the site of `` alabama 's greatest natural disaster . '' a - wide meteorite hit the area about 80 million years ago . the hills just east of downtown wetumpka showcase the eroded remains of the impact crater that was blasted into the bedrock , with the area labeled the wetumpka crater or astrobleme -lrb- `` star-wound '' -rrb- because of the concentric rings of fractures and zones of shattered rock that can be found beneath the surface . in 2002 , christian koeberl with the institute of geochemistry university of vienna published evidence and established the site as the 157th recognized impact crater on earth . -the state is classified as humid subtropical -lrb- `` cfa '' -rrb- under the koppen climate classification . the average annual temperature is 64 ° f -lrb- 18 ° c -rrb- . temperatures tend to be warmer in the southern part of the state with its proximity to the gulf of mexico , while the northern parts of the state , especially in the appalachian mountains in the northeast , tend to be slightly cooler . generally , alabama has very hot summers and mild winters with copious precipitation throughout the year . alabama receives an average of of rainfall annually and enjoys a lengthy growing season of up to 300 days in the southern part of the state . -summers in alabama are among the hottest in the u.s. , with high temperatures averaging over throughout the summer in some parts of the state . alabama is also prone to tropical storms and even hurricanes . areas of the state far away from the gulf are not immune to the effects of the storms , which often dump tremendous amounts of rain as they move inland and weaken . -south alabama reports many thunderstorms . the gulf coast , around mobile bay , averages between 70 and 80 days per year with thunder reported . this activity decreases somewhat further north in the state , but even the far north of the state reports thunder on about 60 days per year . occasionally , thunderstorms are severe with frequent lightning and large hail ; the central and northern parts of the state are most vulnerable to this type of storm . alabama ranks ninth in the number of deaths from lightning and tenth in the number of deaths from lightning strikes per capita . -alabama , along with oklahoma , has the most reported ef5 tornadoes of any state , according to statistics from the national climatic data center for the period january 1 , 1950 , to june 2013 . several long-tracked f5/ef5 tornadoes have contributed to alabama reporting more tornado fatalities than any other state . the state was affected by the 1974 super outbreak and was devastated tremendously by the 2011 super outbreak . the 2011 super outbreak produced a record amount of tornadoes in the state . the tally reached 62 . -the peak season for tornadoes varies from the northern to southern parts of the state . alabama is one of the few places in the world that has a secondary tornado season in november and december , along with the spring severe weather season . the northern part of the state -- along the tennessee valley -- is one of the areas in the u.s. most vulnerable to violent tornadoes . the area of alabama and mississippi most affected by tornadoes is sometimes referred to as dixie alley , as distinct from the tornado alley of the southern plains . -winters are generally mild in alabama , as they are throughout most of the southeastern u.s. , with average january low temperatures around in mobile and around in birmingham . although snow is a rare event in much of alabama , areas of the state north of montgomery may receive a dusting of snow a few times every winter , with an occasional moderately heavy snowfall every few years . historic snowfall events include new year 's eve 1963 snowstorm and the 1993 storm of the century . the annual average snowfall for the birmingham area is per year . in the southern gulf coast , snowfall is less frequent , sometimes going several years without any snowfall . -alabama 's highest temperature of was recorded on september 5 , 1925 in the unincorporated community of centerville . the record low of occurred on january 30 , 1966 in new market . -flora and fauna . -alabama is home to a diverse array of flora and fauna , due largely to a variety of habitats that range from the tennessee valley , appalachian plateau , and ridge-and-valley appalachians of the north to the piedmont , canebrake and black belt of the central region to the gulf coastal plain and beaches along the gulf of mexico in the south . the state is usually ranked among the top in nation for its range of overall biodiversity . -alabama once boasted huge expanses of pine forest , which still form the largest proportion of forests in the state . it currently ranks fifth in the nation for the diversity of its flora . it is home to nearly 4,000 pteridophyte and spermatophyte plant species . -indigenous animal species in the state include 62 mammal species , 93 reptile species , 73 amphibian species , roughly 307 native freshwater fish species , and 420 bird species that spend at least part of their year within the state . invertebrates include 83 crayfish species and 383 mollusk species . 113 of these mollusk species have never been collected outside the state . -the united states census bureau estimates that the population of alabama was 4,849,377 on july 1 , 2014 , which represents an increase of 69,641 , or 1.46 % , since the 2010 census . this includes a natural increase since the last census of 121,054 people -lrb- that is 502,457 births minus 381,403 deaths -rrb- and an increase due to net migration of 104,991 people into the state . -immigration from outside the u.s. resulted in a net increase of 31,180 people , and migration within the country produced a net gain of 73,811 people . the state had 108,000 foreign-born -lrb- 2.4 % of the state population -rrb- , of which an estimated 22.2 % were illegal immigrants -lrb- 24,000 -rrb- . -the center of population of alabama is located in chilton county , outside the town of jemison . -race and ancestry . -according to the 2010 census , alabama had a population of 4,779,736 . the racial composition of the state was 68.5 % white -lrb- 67.0 % non-hispanic white and 1.5 % hispanic white -rrb- , 26.2 % black or african american , 3.9 % hispanic or latino of any race , 1.1 % asian , 0.6 % american indian and alaska native , 0.1 % native hawaiian and other pacific islander , 2.0 % from some other race , and 1.5 % from two or more races . in 2011 , 46.6 % of alabama 's population younger than age 1 were minorities . -the largest reported ancestry groups in alabama are : african american -lrb- 26.2 % -rrb- , english -lrb- 23.6 % -rrb- , irish -lrb- 7.7 % -rrb- , german -lrb- 5.7 % -rrb- , and scots-irish -lrb- 2.0 % -rrb- . those citing `` american '' ancestry in alabama are generally of english or british ancestry ; many anglo-americans identify as having american ancestry because their roots have been in north america for so long , in some cases since the 1600s . demographers estimate that a minimum of 20 -- 23 % of people in alabama are of predominantly english ancestry and that the figure is likely higher . in the 1980 census , 41 % of the people in alabama identified as being of english ancestry , making them the largest ethnic group at the time . -based on historic migration and settlement patterns in the southern colonies and states , demographers estimated there are more people in alabama of scots-irish origins than self-reported . many people in alabama claim irish ancestry because of the term scots-irish but , based on historic immigration and settlement , their ancestors were more likely protestant scots-irish coming from northern ireland , where they had been for a few generations as part of the english colonization . the scots-irish were the largest non-english immigrant group from the british isles before the american revolution , and many settled in the south , later moving into the deep south as it was developed . -in 1984 , under the davis -- strong act , the state legislature established the alabama indian affairs commission . native american groups within the state had increasingly been demanding recognition as ethnic groups and seeking an end to discrimination . given the long history of slavery and associated racial segregation , the native american peoples , who have sometimes been of mixed race , have insisted on having their cultural identification respected . in the past , their self-identification was often overlooked as the state tried to impose a binary breakdown of society into white and black . -the state has officially recognized nine american indian tribes in the state , descended mostly from the five civilized tribes of the american southeast . these are : -the state government has promoted recognition of native american contributions to the state , including the designation in 2000 for columbus day to be jointly celebrated as american indian heritage day . -population centers . -sources : census.gov -sources : census.gov -95.1 % of all alabama residents five years old or older spoke only english at home in 2010 , a minor decrease from 96.1 % in 2000 . alabama english is predominantly southern , and is related to south midland speech which was taken across the border from tennessee . in the major southern speech region , there is the decreasing loss of the final / r / , for example the / boyd / pronunciation of ` bird . ' in the northern third of the state , there is a south midland ` arm ' and ` barb ' rhyming with ` form ' and ` orb . ' unique words in alabama english include : redworm -lrb- earthworm -rrb- , peckerwood -lrb- woodpecker -rrb- , snake doctor and snake feeder -lrb- dragonfly -rrb- , tow sack -lrb- burlap bag -rrb- , plum peach -lrb- clingstone -rrb- , french harp -lrb- harmonica -rrb- , and dog irons -lrb- andirons -rrb- . -in the 2008 american religious identification survey , 86 % of alabama respondents reported their religion as christian , including 6 % catholic , and 11 % as having no religion . the composition of other traditions is 0.5 % mormon , 0.5 % jewish , 0.5 % muslim , 0.5 % buddhist , and 0.5 % hindu . -alabama is located in the middle of the bible belt , a region of numerous protestant christians . alabama has been identified as one of the most religious states in the united states , with about 58 % of the population attending church regularly . a majority of people in the state identify as evangelical protestant . , the three largest denominational groups in alabama are the southern baptist convention , the united methodist church , and non-denominational evangelical protestant . -in alabama , the southern baptist convention has the highest number of adherents with 1,380,121 ; this is followed by the united methodist church with 327,734 adherents , non-denominational evangelical protestant with 220,938 adherents , and the catholic church with 150,647 adherents . many baptist and methodist congregations became established in the great awakening of the early 19th century , when preachers proselytized across the south . the assemblies of god had almost 60,000 members , the churches of christ had nearly 120,000 members . the presbyterian churches , strongly associated with scots-irish immigrants of the 18th century and their descendants , had a combined membership around 75,000 -lrb- pca-28 ,009 members in 108 congregations , pc -lrb- usa -rrb- -26,247 members in 147 congregations , the cumberland presbyterian church-6 ,000 members in 59 congregations , the cumberland presbyterian church in america-5 ,000 members and 50 congregations plus the epc and associate reformed presbyterians with 230 members and 9 congregations -rrb- . -in a 2007 survey , nearly 70 % of respondents could name all four of the christian gospels . of those who indicated a religious preference , 59 % said they possessed a `` full understanding '' of their faith and needed no further learning . in a 2007 poll , 92 % of alabamians reported having at least some confidence in churches in the state . -other faiths . -although in much smaller numbers , many other religious faiths are represented in the state as well , including judaism , islam , hinduism , buddhism , sikhism , the bahá ' í faith , and unitarian universalism . -jews have been present in what is now alabama since 1763 , during the colonial era of mobile , when sephardic jews immigrated from london . the oldest jewish congregation in the state is congregation sha'arai shomayim in mobile . it was formally recognized by the state legislature on january 25 , 1844 . later immigrants in the nineteenth and twentieth centuries tended to be ashkenazy jews from eastern europe . jewish denominations in the state include two orthodox , four conservative , ten reform , and one humanistic synagogue . -muslims have been increasing in alabama , with 31 mosques built by 2011 , many by african-american converts . islam was a traditional religion in west africa , from where many slaves were brought to the colonies and the united states during the centuries of the slave trade . -several hindu temples and cultural centers in the state have been founded by indian immigrants and their descendants , the most well-known being the shri swaminarayan mandir in birmingham , the hindu temple and cultural center of birmingham in pelham , the hindu cultural center of north alabama in capshaw , and the hindu mandir and cultural center in tuscaloosa . -there are six dharma centers and organizations for theravada buddhists . most monastic buddhist temples are concentrated in southern mobile county , near bayou la batre . this area has attracted an influx of refugees from cambodia , laos , and vietnam during the 1970s and thereafter . the four temples within a ten-mile radius of bayou la batre , include chua chanh giac , wat buddharaksa , and wat lao phoutthavihan . -the first community of adherents of the baha'i faith in alabama was founded in 1896 by paul k. dealy who moved from chicago to fairhope to participate in the growth of fairhope as a utopian community . the first community of baha'is in alabama was racially integrated from the beginning due to the faith 's principles . today there is an exhibit honoring dealy in haifa , israel at the world center of the baha'i faith . baha'i centers in alabama exist in birmingham , alabama , huntsville , alabama , and florence , alabama . -a centers for disease control and prevention study in 2008 showed that obesity in alabama was a problem , with most counties having over 29 % of adults obese , except for ten which had a rate between 26 % and 29 % . residents of the state , along with those in five other states , were least likely in the nation to be physically active during leisure time . alabama , and the southeastern u.s. in general , has one of the highest incidences of adult onset diabetes in the country , exceeding 10 % of adults . -the state has invested in aerospace , education , health care , banking , and various heavy industries , including automobile manufacturing , mineral extraction , steel production and fabrication . by 2006 , crop and animal production in alabama was valued at $ 1.5 billion . in contrast to the primarily agricultural economy of the previous century , this was only about 1 % of the state 's gross domestic product . the number of private farms has declined at a steady rate since the 1960s , as land has been sold to developers , timber companies , and large farming conglomerates . -non-agricultural employment in 2008 was 121,800 in management occupations ; 71,750 in business and financial operations ; 36,790 in computer-related and mathematical occupation ; 44,200 in architecture and engineering ; 12,410 in life , physical , and social sciences ; 32,260 in community and social services ; 12,770 in legal occupations ; 116,250 in education , training , and library services ; 27,840 in art , design and media occupations ; 121,110 in healthcare ; 44,750 in fire fighting , law enforcement , and security ; 154,040 in food preparation and serving ; 76,650 in building and grounds cleaning and maintenance ; 53,230 in personal care and services ; 244,510 in sales ; 338,760 in office and administration support ; 20,510 in farming , fishing , and forestry ; 120,155 in construction and mining , gas , and oil extraction ; 106,280 in installation , maintenance , and repair ; 224,110 in production ; and 167,160 in transportation and material moving . -according to the u.s. bureau of economic analysis , the 2008 total gross state product was $ 170 billion , or $ 29,411 per capita . alabama 's 2012 gdp increased 1.2 % from the previous year . the single largest increase came in the area of information . in 2010 , per capita income for the state was $ 22,984 . -the state 's seasonally adjusted unemployment rate was 5.8 % in april 2015 . this compared to a nationwide seasonally adjusted rate of 5.4 % . -largest employers . -the five employers that employed the most employees in alabama in april 2011 were : -the next twenty largest employers , , included : -alabama 's agricultural outputs include poultry and eggs , cattle , fish , plant nursery items , peanuts , cotton , grains such as corn and sorghum , vegetables , milk , soybeans , and peaches . although known as `` the cotton state '' , alabama ranks between eighth and tenth in national cotton production , according to various reports , with texas , georgia and mississippi comprising the top three . -alabama 's industrial outputs include iron and steel products -lrb- including cast-iron and steel pipe -rrb- ; paper , lumber , and wood products ; mining -lrb- mostly coal -rrb- ; plastic products ; cars and trucks ; and apparel . in addition , alabama produces aerospace and electronic products , mostly in the huntsville area , the location of nasa 's george c. marshall space flight center and the u.s. army materiel command , headquartered at redstone arsenal . -a great deal of alabama 's economic growth since the 1990s has been due to the state 's expanding automotive manufacturing industry . located in the state are honda manufacturing of alabama , hyundai motor manufacturing alabama , mercedes-benz u.s. international , and toyota motor manufacturing alabama , as well as their various suppliers . since 1993 , the automobile industry has generated more than 67,800 new jobs in the state . alabama currently ranks 4th in the nation for vehicle exports . -automakers accounted for approximately a third of the industrial expansion in the state in 2012 . the eight models produced at the state 's auto factories totaled combined sales of 74,335 vehicles for 2012 . the strongest model sales during this period were the hyundai elantra compact car , the mercedes-benz gl-class sport utility vehicle and the honda ridgeline sport utility truck . -steel producers outokumpu , nucor , ssab , thyssenkrupp , and u.s. steel have facilities in alabama and employ over 10,000 people . in may 2007 , german steelmaker thyssenkrupp selected calvert in mobile county for a 4.65 billion combined stainless and carbon steel processing facility . thyssenkrupp 's stainless steel division , inoxum , including the stainless portion of the calvert plant , was sold to finnish stainless steel company outokumpu in 2012 . the remaining portion of the thyssenkrupp plant had final bids submitted by arcelormittal and nippon steel for $ 1.6 billion in march 2013 . companhia siderúrgica nacional submitted a combined bid for the mill at calvert , plus a majority stake in the thyssenkrupp mill in brazil , for $ 3.8 billion . in july 2013 , the plant was sold to arcelormittal and nippon steel . -the hunt refining company , a subsidiary of hunt consolidated , inc. , is based in tuscaloosa and operates a refinery there . the company also operates terminals in mobile , melvin , and moundville . jvc america , inc. operates an optical disc replication and packaging plant in tuscaloosa . -the goodyear tire and rubber company operates a large plant in gadsden that employs about 1,400 people . it has been in operation since 1929 . -construction of an airbus a320 family aircraft assembly plant in mobile was formally announced by airbus ceo fabrice brégier from the mobile convention center on july 2 , 2012 . the plans include a $ 600 million factory at the brookley aeroplex for the assembly of the a319 , a320 and a321 aircraft . construction began in 2013 , with plans for it to become operable by 2015 and produce up to 50 aircraft per year by 2017 . the assembly plant is the company 's first factory to be built within the united states . it was announced on february 1 , 2013 that airbus had hired alabama-based hoar construction to oversee construction of the facility . -an estimated 20 million tourists visit the state each year . over 100,000 of these are from other countries , including from canada , the united kingdom , germany and japan . in 2006 , 22.3 million tourists spent $ 8.3 billion providing an estimated 162,000 jobs in the state . -uab hospital is the only level i trauma center in alabama . uab is the largest state government employer in alabama , with a workforce of about 18,000 . -alabama has the headquarters of regions financial corporation , bbva compass , superior bancorp and the former colonial bancgroup . birmingham-based compass banchshares was acquired by spanish-based bbva in september 2007 , although the headquarters of bbva compass remains in birmingham . in november 2006 , regions financial completed its merger with amsouth bancorporation , which was also headquartered in birmingham . southtrust corporation , another large bank headquartered in birmingham , was acquired by wachovia in 2004 for $ 14.3 billion . -the city still has major operations for wachovia and its now post-operating bank wells fargo , which includes a regional headquarters , an operations center campus and a $ 400 million data center . nearly a dozen smaller banks are also headquartered in the birmingham , such as superior bancorp , servisfirst and new south federal savings bank . birmingham also serves as the headquarters for several large investment management companies , including harbert management corporation . -telecommunications provider at&t , formerly bellsouth , has a major presence in alabama with several large offices in birmingham . the company has over 6,000 employees and more than 1,200 contract employees . -many commercial technology companies are headquartered in huntsville , such as the network access company adtran , computer graphics company intergraph , design and manufacturer of it infrastructure avocent , and telecommunications provider deltacom . cinram manufactures and distributes 20th century fox dvds and blu-ray discs out of their huntsville plant . -rust international has grown to include brasfield & gorrie , be&k , hoar construction and b.l. harbert international , which all routinely are included in the engineering news-record lists of top design , international construction , and engineering firms . -lrb- rust international was acquired in 2000 by washington group international , which was in turn acquired by san-francisco based urs corporation in 2007 . -rrb- -law and government . -state government . -the foundational document for alabama 's government is the alabama constitution , which was ratified in 1901 . at almost 800 amendments and 310,000 words , it is by some accounts the world 's longest constitution and is roughly forty times the length of the united states constitution . -there has been a significant movement to rewrite and modernize alabama 's constitution . critics suggest that alabama 's constitution highly centralizes power in montgomery and leaves practically no power in local hands . most counties do not have home rule . any policy changes proposed around the state must be approved by the entire alabama legislature and , frequently , by state referendum . one criticism of the current constitution claims that its complexity and length intentionally codify segregation and racism . -alabama 's government is divided into three coequal branches . the legislative branch is the alabama legislature , a bicameral assembly composed of the alabama house of representatives , with 105 members , and the alabama senate , with 35 members . the legislature is responsible for writing , debating , passing , or defeating state legislation . the republican party currently holds a majority in both houses of the legislature . the legislature has the power to override a gubernatorial veto by a simple majority -lrb- most state legislatures require a two-thirds majority to override a veto -rrb- . -until 1964 , the state elected state senators by county , with one per county . it had not redistricted congressional districts since passage of its constitution in 1901 ; as a result , urbanized areas were grossly underrepresented . it had not changed legislative districts to reflect the decennial censuses , either . in `` reynolds v. sims '' -lrb- 1964 -rrb- , the us supreme court implemented the principle of `` one man , one vote '' , ruling that congressional districts had to be reapportioned based on censuses -lrb- as the state already had in its constitution but had not implemented . -rrb- further , it ruled that both houses of bicameral state legislatures had to be apportioned by population , as there was no constitutional basis for states to have geographically based systems . at that time , alabama and many other states had to change their legislative districting , as many across the country had systems that underrepresented urban areas and districts . this had caused decades of underinvestment in such areas . for instance , birmingham and jefferson county taxes had supplied one-third of the state budget , but jefferson county received only 1/67th of state services in funding . through the legislative delegations , the alabama legislature kept control of county governments . -the executive branch is responsible for the execution and oversight of laws . it is headed by the governor of alabama . other members of executive branch include the cabinet , the attorney general of alabama , the alabama secretary of state , the alabama state treasurer , and the state auditor of alabama . the current governor of the state is republican robert bentley . the lieutenant governor is republican kay ivey . -the judicial branch is responsible for interpreting the constitution and applying the law in state criminal and civil cases . the state 's highest court is the supreme court of alabama . alabama uses partisan elections to choose judges , and since the 1980s judicial campaigns have become increasingly politicized . the current chief justice of the alabama supreme court is republican roy moore . all sitting justices on the alabama supreme court are members of the republican party . there are two intermediate appellate courts , the court of civil appeals and the court of criminal appeals , and four trial courts : the circuit court -lrb- trial court of general jurisdiction -rrb- , and the district , probate , and municipal courts . -the members of the legislature take office immediately after the november elections . statewide officials such as the governor , lieutenant governor , attorney general , and other constitutional officers take office the following january . -alabama levies a 2 , 4 , or 5 percent personal income tax , depending upon the amount earned and filing status . taxpayers are allowed to deduct their federal income tax from their alabama state tax , and can do so even if taking the standard deduction . taxpayers who file itemized deductions are also allowed to deduct the federal insurance contributions act tax -lrb- social security and medicare tax -rrb- . -the state 's general sales tax rate is 4 % . sales tax rates for cities and counties are also added to purchases . for example , the total sales tax rate in mobile is 10 % and there is an additional restaurant tax of 1 % , which means that a diner in mobile would pay an 11 % tax on a meal . , sales and excise taxes in alabama account for 51 % of all state and local revenue , compared with an average of about 36 % nationwide . alabama is one of seven states that levy a tax on food at the same rate as other goods , and one of two states -lrb- the other being neighboring mississippi -rrb- which fully taxes groceries without any offsetting relief for low-income families . -lrb- most states exempt groceries from sales tax or apply a lower tax rate . -rrb- -alabama 's income tax on poor working families is among the highest in the united states . alabama is the only state that levies income tax on a family of four with income as low as $ 4,600 , which is barely one-quarter of the federal poverty line . alabama 's threshold is the lowest among the 41 states and the district of columbia with income taxes . -the corporate income tax rate is currently 6.5 % . the overall federal , state , and local tax burden in alabama ranks the state as the second least tax-burdened state in the country . property taxes are the lowest in the u.s. . the current state constitution requires a voter referendum to raise property taxes . -since alabama 's tax structure largely depends on consumer spending , it is subject to high variable budget structure . for example , in 2003 alabama had an annual budget deficit as high as $ 670 million . -county and local governments . -alabama has 67 counties . each county has its own elected legislative branch , usually called the county commission . it also has limited executive authority in the county . because of the constraints of the alabama constitution , only seven counties -lrb- jefferson , lee , mobile , madison , montgomery , shelby , and tuscaloosa -rrb- in the state have limited home rule . instead , most counties in the state must lobby the local legislation committee of the state legislature to get simple local policies approved , ranging from waste disposal to land use zoning . the cumbersome process results in local jurisdictions being unable to manage their problems , and the state legislators are buried in local county issues . -the state legislature has retained power over local governments by refusing to pass a constitutional amendment establishing home rule for counties , as recommended by the 1973 alabama constitutional commission . legislative delegations retain certain powers over each county . united states supreme court decisions in `` baker v. carr '' -lrb- 1964 -rrb- required that both houses have districts established on the basis of population , and redistricted after each census , in order to implement the principle of `` one man , one vote '' . before that , each county was represented by one state senator , leading to underrepresentation in the state senate for more urbanized , populous counties . -`` the lack of home rule for counties in alabama has resulted in the proliferation of local legislation permitting counties to do things not authorized by the state constitution . alabama 's constitution has been amended more than 700 times , and almost one-third of the amendments are local in nature , applying to only one county or city . a significant part of each legislative session is spent on local legislation , taking away time and attention of legislators from issues of statewide importance . '' -on november 9 , 2011 , jefferson county , which was $ 4 billion in debt at the time , declared bankruptcy . this is the second-largest chapter 9 -lrb- municipal -rrb- bankruptcy in the united states , after the detroit bankruptcy . jefferson county emerged from bankruptcy in december 2013 following the approval of a bankruptcy plan by the united states bankruptcy court for the northern district of alabama . -alabama is an alcoholic beverage control state , meaning that the state government holds a monopoly on the sale of alcohol . the alabama alcoholic beverage control board controls the sale and distribution of alcoholic beverages in the state . twenty-five of the 67 counties are `` dry counties '' which ban the sale of alcohol , and there are many dry municipalities even in counties which permit alcohol sales . -during reconstruction following the american civil war , alabama was occupied by federal troops of the third military district under general john pope . in 1874 , the political coalition of white democrats known as the redeemers took control of the state government from the republicans , in part by suppressing the african-american vote through violence , fraud and intimidation . -after 1890 , a coalition of white democratic politicians passed laws to segregate and disenfranchise african american residents , a process completed in provisions of the 1901 constitution . provisions which disenfranchised african americans resulted in excluding many poor whites . by 1941 more whites than african americans had been disenfranchised : 600,000 to 520,000 . the total effects were greater on the african-american community , as almost all of its citizens were disfranchised and relegated to separate and unequal treatment under the law . -from 1901 through the 1960s , the state did not redraw election districts as population grew and shifted within the state during urbanization and industrialization of certain areas . as counties were the basis of election districts , the result was a rural minority that dominated state politics through nearly three-quarters of the century , until a series of federal court cases required redistricting in 1972 to meet equal representation . -alabama state politics gained nationwide and international attention in the 1950s and 1960s during the american civil rights movement , when whites bureaucratically , and at times , violently resisted protests for electoral and social reform . democrat george wallace , the state 's only four-term governor , was a controversial figure who vowed to maintain segregation . only after passage of the federal civil rights act of 1964 and voting rights act of 1965 did african americans regain the ability to exercise suffrage , among other civil rights . in many jurisdictions , they continued to be excluded from representation by at-large electoral systems , which allowed the majority of the population to dominate elections . some changes at the county level have occurred following court challenges to establish single-member districts that enable a more diverse representation among county boards . -in 2007 , the alabama legislature passed , and republican governor bob riley signed a resolution expressing `` profound regret '' over slavery and its lingering impact . in a symbolic ceremony , the bill was signed in the alabama state capitol , which housed congress of the confederate states of america . -in 2010 , republicans won control of both houses of the legislature for the first time in 136 years , after a nearly complete realignment of political parties , who represent different visions in the 21st century . -state elections . -with the disfranchisement of african americans in 1901 , the state became part of the `` solid south '' , a system in which the democratic party operated as effectively the only viable political party in every southern state . for nearly 100 years , local and state elections in alabama were decided in the democratic party primary , with generally only token republican challengers running in the general election . since the mid to late-20th century , however , there has been a realignment among the two major political parties , and white conservatives started shifting to the republican party . in alabama , majority-white districts are now expected to regularly elect republican candidates to federal , state and local office . -members of the nine seats on the alabama supreme court and all ten seats on the state appellate courts are elected to office . until 1994 , no republicans held any of the court seats . in that general election , the then-incumbent chief justice of alabama , ernest c. hornsby , refused to leave office after losing the election by approximately 3,000 votes to republican perry o. hooper , sr. . hornsby sued alabama and defiantly remained in office for nearly a year before finally giving up the seat after losing in court . this ultimately led to a collapse of support for democrats at the ballot box in the next three or four election cycles . the democrats lost the last of the nineteen court seats in august 2011 with the resignation of the last democrat on the bench . -in the early 21st century , republicans hold all seven of the statewide elected executive branch offices . republicans hold six of the eight elected seats on the alabama state board of education . in 2010 , republicans took large majorities of both chambers of the state legislature , giving them control of that body for the first time in 136 years . the last remaining statewide democrat , who served on the alabama public service commission was defeated in 2012 . -only two republican lieutenant governors have been elected since the end of reconstruction , when republicans generally represented reconstruction government , including the newly emancipated freedmen who had gained the franchise . the two gop lt. governors were steve windom -lrb- 1999-2003 -rrb- and the current lt. governor , kay ivey , who was elected in 2010 and re-elected in 2014 . -local elections . -many local offices -lrb- county commissioners , boards of education , tax assessors , tax collectors , etc. -rrb- in the state are still held by democrats . many rural counties have voters who are majority democrats , resulting in local elections being decided in the democratic primary . similarly many metropolitan and suburban counties are majority-republican and elections are effectively decided in the republican primary , although there are exceptions . -alabama 's 67 county sheriffs are elected in partisan , at-large races , and democrats still retain the narrow majority of those posts . the current split is 35 democrats , 31 republicans , and one independent fayette -rrb- . however , most of the democratic sheriffs preside over rural and less populated counties . the majority of republican sheriffs have been elected in the more urban/suburban and heavily populated counties . , the state of alabama has one female sheriff , in morgan county , alabama , and ten african-american sheriffs . -federal elections . -the state 's two u.s. senators are jefferson b. sessions iii and richard c. shelby , both republicans . shelby was originally elected to the senate as a democrat in 1986 and re-elected in 1992 , but switched parties immediately following the november 1994 general election . -in the u.s. house of representatives , the state is represented by seven members , six of whom are republicans : -lrb- bradley byrne , mike d. rogers , robert aderholt , morris j. brooks , martha roby , and gary palmer -rrb- and one democrat : terri sewell . -primary and secondary education . -public primary and secondary education in alabama is under the purview of the alabama state board of education as well as local oversight by 67 county school boards and 60 city boards of education . together , 1,496 individual schools provide education for 744,637 elementary and secondary students . -public school funding is appropriated through the alabama legislature through the education trust fund . in fy 2006 -- 2007 , alabama appropriated $ 3,775,163,578 for primary and secondary education . that represented an increase of $ 444,736,387 over the previous fiscal year . in 2007 , over 82 percent of schools made adequate yearly progress -lrb- ayp -rrb- toward student proficiency under the national no child left behind law , using measures determined by the state of alabama . -while alabama 's public education system has improved in recent decades , it lags behind in achievement compared to other states . according to u.s. census data , alabama 's high school graduation rate -- 75 % -- is the fourth lowest in the u.s. -lrb- after kentucky , louisiana and mississippi -rrb- . the largest educational gains were among people with some college education but without degrees . -colleges and universities . -alabama 's programs of higher education include 14 four-year public universities , two-year community colleges , and 17 private , undergraduate and graduate universities . in the state are four medical schools -lrb- as of fall 2015 -rrb- -lrb- university of alabama school of medicine , university of south alabama and alabama college of osteopathic medicine and the edward via college of osteopathic medicine - auburn campus -rrb- , two veterinary colleges -lrb- auburn university and tuskegee university -rrb- , a dental school -lrb- university of alabama school of dentistry -rrb- , an optometry college -lrb- university of alabama at birmingham -rrb- , two pharmacy schools -lrb- auburn university and samford university -rrb- , and five law schools -lrb- university of alabama school of law , birmingham school of law , cumberland school of law , miles law school , and the thomas goode jones school of law -rrb- . public , post-secondary education in alabama is overseen by the alabama commission on higher education and the alabama department of postsecondary education . colleges and universities in alabama offer degree programs from two-year associate degrees to a multitude of doctoral level programs . -the largest single campus is the university of alabama , located in tuscaloosa , with 33,602 enrolled for fall 2012 . troy university was the largest institution in the state in 2010 , with an enrollment of 29,689 students across four alabama campuses -lrb- troy , dothan , montgomery , and phenix city -rrb- , as well as sixty learning sites in seventeen other states and eleven other countries . the oldest institutions are the public university of north alabama in florence and the catholic church-affiliated spring hill college in mobile , both founded in 1830 . -accreditation of academic programs is through the southern association of colleges and schools -lrb- sacs -rrb- as well as other subject-focused national and international accreditation agencies such as the association for biblical higher education -lrb- abhe -rrb- , the council on occupational education -lrb- coe -rrb- , and the accrediting council for independent colleges and schools -lrb- acics -rrb- . -according to the 2011 u.s. news & world report , alabama had three universities ranked in the top 100 public schools in america -lrb- university of alabama at 31 , auburn university at 36 , and university of alabama at birmingham at 73 -rrb- . -according to the 2012 u.s. news & world report , alabama had four tier 1 universities -lrb- university of alabama , auburn university , university of alabama at birmingham and university of alabama in huntsville -rrb- . -college football is popular in alabama , particularly the university of alabama crimson tide and auburn university tigers , rivals in the southeastern conference . in the 2013 season , alabama averaged over 100,000 fans per game and auburn averaged over 80,000 fans , both numbers among the top 20 in the nation in average attendance . bryant-denny stadium is the home of the alabama football team , and has a seating capacity of 101,821 , and is the fifth largest stadium in america . jordan-hare stadium is the home field of the auburn football team and seats up to 87,451 . -legion field is home for the uab blazers football program and the papajohns.com bowl . it seats 80,601 . ladd-peebles stadium in mobile is the home of the university of south alabama football team , and serves as the home of the ncaa senior bowl , godaddy.com bowl , and alabama-mississippi all star classic ; the stadium seats 40,646 . in 2009 , bryant-denny stadium and jordan-hare stadium became the homes of the alabama high school athletic association state football championship games , after previously being held at legion field in birmingham . -alabama has several professional and semi-professional sports teams , including four minor league baseball teams . -the talladega superspeedway motorsports complex hosts a series of nascar events . it has a seating capacity of 143,000 and is the thirteenth largest stadium in the world and sixth largest stadium in america . also , the barber motorsports park has hosted indycar series and rolex sports car series races . -the atp birmingham was a world championship tennis tournament held from 1973 to 1980 . -alabama has hosted several professional golf tournaments , such as the 1984 and 1990 pga championship at shoal creek -lrb- pga tour -rrb- , the mobile lpga tournament of champions , airbus lpga classic and yokohama tire lpga classic -lrb- lpga tour -rrb- , and the tradition -lrb- champions tour -rrb- . -major airports with sustained commercial operations in alabama include birmingham-shuttlesworth international airport -lrb- bhm -rrb- , huntsville international airport -lrb- hsv -rrb- , dothan regional airport -lrb- dhn -rrb- , mobile regional airport -lrb- mob -rrb- , montgomery regional airport -lrb- mgm -rrb- , and muscle shoals -- northwest alabama regional airport -lrb- msl -rrb- . -for rail transport , amtrak schedules the crescent , a daily passenger train , running from new york to new orleans with stops at anniston , birmingham , and tuscaloosa . -alabama has five major interstate roads that cross the state : interstate 65 -lrb- i-65 -rrb- travels north -- south roughly through the middle of the state ; i-20 / i-59 travel from the central west mississippi state line to birmingham , where i-59 continues to the north-east corner of the state and i-20 continues east towards atlanta ; i-85 originates in montgomery and travels east-northeast to the georgia state line , providing a main thoroughfare to atlanta ; and i-10 traverses the southernmost portion of the state , traveling from west to east through mobile . another interstate , i-22 , is currently under construction . when completed , it will connect birmingham with memphis , tennessee . in addition , there are currently five auxiliary interstate routes in the state : i-165 in mobile , i-359 in tuscaloosa , i-459 around birmingham , i-565 in decatur and huntsville , and i-759 in gadsden . a sixth route , i-685 , will be formed when i-85 is rerouted along a new southern bypass of montgomery . a proposed northern bypass of birmingham will be designated as i-422 . since a direct connection from i-22 to i-422 will not be possible , i-222 has been proposed , as well . -several u.s. highways also pass through the state , such as u.s. route 11 -lrb- us-11 -rrb- , us-29 , us-31 , us-43 , us-45 , us-72 , us-78 , us-80 , us-82 , us-84 , us-90 , us-98 , us-231 , us-278 , us-280 , us-331 , us-411 , and us-431 . -there are four toll roads in the state : montgomery expressway in montgomery ; tuscaloosa bypass in tuscaloosa ; emerald mountain expressway in wetumpka ; and beach express in orange beach . -the port of mobile , alabama 's only saltwater port , is a large seaport on the gulf of mexico with inland waterway access to the midwest by way of the tennessee-tombigbee waterway . the port of mobile was ranked 12th by tons of traffic in the united states during 2009 . the newly expanded container terminal at the port of mobile was ranked as the 25th busiest for container traffic in the nation during 2011 . the state 's other ports are on rivers with access to the gulf of mexico . -water ports of alabama , listed from north to south : -in greek mythology , achilles -lrb- ; , `` akhilleus '' , -rrb- was a greek hero of the trojan war and the central character and greatest warrior of homer 's `` iliad '' . his mother was the nymph thetis , and his father , peleus , was the king of the myrmidons . -achilles ' most notable feat during the trojan war was the slaying of the trojan hero hector outside the gates of troy . although the death of achilles is not presented in the `` iliad '' , other sources concur that he was killed near the end of the trojan war by paris , who shot him in the heel with an arrow . later legends -lrb- beginning with a poem by statius in the 1st century ad -rrb- state that achilles was invulnerable in all of his body except for his heel . because of his death from a small wound in the heel , the term `` achilles ' heel '' has come to mean a person 's point of weakness . -achilles ' name can be analyzed as a combination of -lrb- `` akhos '' -rrb- `` grief '' and -lrb- `` laos '' -rrb- `` a people , tribe , nation . '' in other words , achilles is an embodiment of the grief of the people , grief being a theme raised numerous times in the `` iliad '' -lrb- frequently by achilles -rrb- . achilles ' role as the hero of grief forms an ironic juxtaposition with the conventional view of achilles as the hero of κλέος `` kleos '' -lrb- `` glory '' , usually glory in war -rrb- . -`` laos '' has been construed by gregory nagy , following leonard palmer , to mean `` a corps of soldiers '' , a muster . with this derivation , the name would have a double meaning in the poem : when the hero is functioning rightly , his men bring grief to the enemy , but when wrongly , his men get the grief of war . the poem is in part about the misdirection of anger on the part of leadership . -r. s. p. beekes has suggested a pre-greek origin of the name . -the name achilleus was a common and attested name among the greeks soon after the 7th century bc . it was also turned into the female form ἀχιλλεία -lrb- `` achilleía '' -rrb- attested in attica in the 4th century bc -lrb- ig ii ² 1617 -rrb- and , in the form `` achillia '' , on a stele in halicarnassus as the name of a female gladiator fighting an `` amazon '' . -achilles was the son of the nereid thetis and peleus , the king of the myrmidons . zeus and poseidon had been rivals for the hand of thetis until prometheus , the fore-thinker , warned zeus of a prophecy that thetis would bear a son greater than his father . for this reason , the two gods withdrew their pursuit , and had her wed peleus . -there is a tale which offers an alternative version of these events : in `` argonautica '' -lrb- iv .760 -rrb- zeus ' sister and wife hera alludes to thetis ' chaste resistance to the advances of zeus , that thetis was so loyal to hera 's marriage bond that she coolly rejected him . thetis , although a daughter of the sea-god nereus , was also brought up by hera , further explaining her resistance to the advances of zeus . -according to the `` achilleid '' , written by statius in the 1st century ad , and to no surviving previous sources , when achilles was born thetis tried to make him immortal , by dipping him in the river styx . however , he was left vulnerable at the part of the body by which she held him , his heel -lrb- see achilles heel , achilles ' tendon -rrb- . it is not clear if this version of events was known earlier . in another version of this story , thetis anointed the boy in ambrosia and put him on top of a fire , to burn away the mortal parts of his body . she was interrupted by peleus and abandoned both father and son in a rage . -however , none of the sources before statius makes any reference to this general invulnerability . to the contrary , in the `` iliad '' homer mentions achilles being wounded : in book 21 the paeonian hero asteropaeus , son of pelagon , challenged achilles by the river scamander . he cast two spears at once , one grazed achilles ' elbow , `` drawing a spurt of blood '' . -also , in the fragmentary poems of the epic cycle in which we can find description of the hero 's death , `` cypria '' -lrb- unknown author -rrb- , `` aithiopis '' by arctinus of miletus , `` little iliad '' by lesche of mytilene , `` iliou persis '' by arctinus of miletus , there is no trace of any reference to his general invulnerability or his famous weakness -lrb- heel -rrb- ; in the later vase paintings presenting achilles ' death , the arrow -lrb- or in many cases , arrows -rrb- hit his body . -peleus entrusted achilles to chiron the centaur , on mt. pelion , to be reared . -achilles in the trojan war . -the first two lines of the `` iliad '' read : -achilles ' consuming rage is at times wavering , but at other times he can not be cooled . the humanization of achilles by the events of the war is an important theme of the narrative . -according to the `` iliad '' , achilles arrived at troy with 50 ships , each carrying 50 myrmidons -lrb- book 2 -rrb- . he appointed five leaders -lrb- each leader commanding 500 myrmidons -rrb- : menesthius , eudorus , peisander , phoenix and alcimedon -lrb- book 16 -rrb- . -when the greeks left for the trojan war , they accidentally stopped in mysia , ruled by king telephus . in the resulting battle , achilles gave telephus a wound that would not heal ; telephus consulted an oracle , who stated that `` he that wounded shall heal '' . guided by the oracle , he arrived at argos , where achilles healed him in order that he might become their guide for the voyage to troy . -according to other reports in euripides ' lost play about telephus , he went to aulis pretending to be a beggar and asked achilles to heal his wound . achilles refused , claiming to have no medical knowledge . alternatively , telephus held orestes for ransom , the ransom being achilles ' aid in healing the wound . odysseus reasoned that the spear had inflicted the wound ; therefore , the spear must be able to heal it . pieces of the spear were scraped off onto the wound and telephus was healed . -according to the `` cypria '' -lrb- the part of the epic cycle that tells the events of the trojan war before achilles ' wrath -rrb- , when the achaeans desired to return home , they were restrained by achilles , who afterwards attacked the cattle of aeneas , sacked neighboring cities and killed troilus . -in dares phrygius ' `` account of the destruction of troy '' , the latin summary through which the story of achilles was transmitted to medieval europe , troilus was a young trojan prince , the youngest of king priam 's -lrb- or sometimes apollo -rrb- and hecuba 's five legitimate sons . despite his youth , he was one of the main trojan war leaders . prophecies linked troilus ' fate to that of troy and so he was ambushed in an attempt to capture him . yet achilles , struck by the beauty of both troilus and his sister polyxena , and overcome with lust , directed his sexual attentions on the youth -- who , refusing to yield , instead found himself decapitated upon an altar-omphalos of apollo . later versions of the story suggested troilus was accidentally killed by achilles in an over-ardent lovers ' embrace . in this version of the myth , achilles ' death therefore came in retribution for this sacrilege . ancient writers treated troilus as the epitome of a dead child mourned by his parents . had troilus lived to adulthood , the first vatican mythographer claimed , troy would have been invincible . -achilles in the `` iliad '' . -homer 's `` iliad '' is the most famous narrative of achilles ' deeds in the trojan war . achilles ' wrath is the central theme of the poem . the homeric epic only covers a few weeks of the war , and does not narrate achilles ' death . it begins with achilles ' withdrawal from battle after he is dishonored by agamemnon , the commander of the achaean forces . agamemnon had taken a woman named chryseis as his slave . her father chryses , a priest of apollo , begs agamemnon to return her to him . agamemnon refuses and apollo sends a plague amongst the greeks . the prophet calchas correctly determines the source of the troubles but will not speak unless achilles vows to protect him . achilles does so and calchas declares chryseis must be returned to her father . agamemnon consents , but then commands that achilles ' battle prize briseis be brought to him to replace chryseis . angry at the dishonor of having his plunder and glory taken away -lrb- and as he says later , because he loved briseis -rrb- , with the urging of his mother thetis , achilles refuses to fight or lead his troops alongside the other greek forces . at this same time , burning with rage over agamemnon 's theft , achilles prays to thetis to convince zeus to help the trojans gain ground in the war , so that he may regain his honor . -as the battle turns against the greeks , thanks to the influence of zeus , nestor declares that the trojans are winning because agamemnon has angered achilles , and urges the king to appease the warrior . agamemnon agrees and sends odysseus and two other chieftains , ajax and phoenix , to achilles with the offer of the return of briseis and other gifts . achilles rejects all agamemnon offers him , and simply urges the greeks to sail home as he was planning to do . -the trojans , led by hector , subsequently push the greek army back toward the beaches and assault the greek ships . with the greek forces on the verge of absolute destruction , patroclus leads the myrmidons into battle wearing achilles ' armor , though achilles remains at his camp . patroclus succeeds in pushing the trojans back from the beaches , but is killed by hector before he can lead a proper assault on the city of troy . -after receiving the news of the death of patroclus from antilochus , the son of nestor , achilles grieves over his beloved companion 's death and holds many funeral games in his honor . his mother thetis comes to comfort the distraught achilles . she persuades hephaestus to make new armor for him , in place of the armor that patroclus had been wearing which was taken by hector . the new armor includes the shield of achilles , described in great detail in the poem . -enraged over the death of patroclus , achilles ends his refusal to fight and takes the field killing many men in his rage but always seeking out hector . achilles even engages in battle with the river god scamander who becomes angry that achilles is choking his waters with all the men he has killed . the god tries to drown achilles but is stopped by hera and hephaestus . zeus himself takes note of achilles ' rage and sends the gods to restrain him so that he will not go on to sack troy itself before the time allotted for its destruction , seeming to show that the unhindered rage of achilles can defy fate itself . finally , achilles finds his prey . achilles chases hector around the wall of troy three times before athena , in the form of hector 's favorite and dearest brother , deiphobus , persuades hector to stop running and fight achilles face to face . after hector realizes the trick , he knows the battle is inevitable . wanting to go down fighting , he charges at achilles with his only weapon , his sword , but misses . accepting his fate , hector begs achilles , not to spare his life , but to treat his body with respect after killing him . achilles tells hector it is hopeless to expect that of him , declaring that `` my rage , my fury would drive me now to hack your flesh away and eat you raw -- such agonies you have caused me '' . achilles then kills hector and drags his corpse by its heels behind his chariot during patroclus ' funeral games . -with the assistance of the god hermes , hector 's father , priam , goes to achilles ' tent to plead with achilles for the return of hector 's body so that he can be buried . achilles relents and promises a truce for the duration of the funeral . the poem ends with a description of hector 's funeral , with the doom of troy and achilles himself still to come . -achilles , after his temporary truce with priam , fought and killed the amazonian warrior queen penthesilea , but later grieved over her death . at first , he was so distracted by her beauty , he did not fight as intensely as usual . once he realized that his distraction was endangering his life , he refocused and killed her . -memnon , and the fall of achilles . -following the death of patroclus , achilles ' closest companion was nestor 's son antilochus . when memnon , king of ethiopia slew antilochus , achilles once more obtained revenge on the battlefield , killing memnon . the fight between achilles and memnon over antilochus echoes that of achilles and hector over patroclus , except that memnon -lrb- unlike hector -rrb- was also the son of a goddess . -many homeric scholars argued that episode inspired many details in the `` iliad '' 's description of the death of patroclus and achilles ' reaction to it . the episode then formed the basis of the cyclic epic `` aethiopis '' , which was composed after the `` iliad '' , possibly in the 7th century b.c. . the `` aethiopis '' is now lost , except for scattered fragments quoted by later authors . -the death of achilles , as predicted by hector with his dying breath , was brought about by paris with an arrow -lrb- to the heel according to statius -rrb- . in some versions , the god apollo guided paris ' arrow . some retellings also state that achilles was scaling the gates of troy and was hit with a poisoned arrow . -all of these versions deny paris any sort of valor , owing to the common conception that paris was a coward and not the man his brother hector was , and achilles remained undefeated on the battlefield . his bones were mingled with those of patroclus , and funeral games were held . he was represented in the `` aethiopis '' as living after his death in the island of leuke at the mouth of the river danube . -another version of achilles ' death is that he fell deeply in love with one of the trojan princesses , polyxena . achilles asks priam for polyxena 's hand in marriage . priam is willing because it would mean the end of the war and an alliance with the world 's greatest warrior . but while priam is overseeing the private marriage of polyxena and achilles , paris , who would have to give up helen if achilles married his sister , hides in the bushes and shoots achilles with a divine arrow , killing him . -achilles was cremated and his ashes buried in the same urn as those of patroclus . -paris was later killed by philoctetes using the enormous bow of heracles . -fate of achilles ' armor . -achilles ' armor was the object of a feud between odysseus and telamonian ajax -lrb- ajax the greater -rrb- . they competed for it by giving speeches on why they were the bravest after achilles to their trojan prisoners , who after considering both men came to a consensus in favor of odysseus . furious , ajax cursed odysseus , which earned the ire of athena . athena temporarily made ajax so mad with grief and anguish that he began killing sheep , thinking them his comrades . after a while , when athena lifted his madness and ajax realized that he had actually been killing sheep , ajax was left so ashamed that he committed suicide . odysseus eventually gave the armor to neoptolemus , the son of achilles . -a relic claimed to be achilles ' bronze-headed spear was for centuries preserved in the temple of athena on the acropolis of phaselis , lycia , a port on the pamphylian gulf . the city was visited in 333 bc by alexander the great , who envisioned himself as the new achilles and carried the `` iliad '' with him , but his court biographers do not mention the spear . however , it was shown in the time of pausanias in the 2nd century ad . -achilles , ajax and a game of `` petteia '' . -numerous paintings on pottery have suggested a tale not mentioned in the literary traditions . at some point in the war , achilles and ajax were playing a board game -lrb- `` petteia '' -rrb- . they were absorbed in the game and oblivious to the surrounding battle . the trojans attacked and reached the heroes , who were saved only by an intervention of athena . -achilles and patroclus . -the exact nature of achilles ' relationship with patroclus has been a subject of dispute in both the classical period and modern times . in the `` iliad '' , it appears to be the model of a deep and loyal friendship . homer does not suggest that achilles and his close friend patroclus were lovers . despite there being no direct evidence in the text of the iliad that achilles and patroclus were lovers , this theory was expressed by some later authors . commentators from classical antiquity to the present have often interpreted the relationship through the lens of their own cultures . in 5th-century bc athens , the intense bond was often viewed in light of the greek custom of `` paiderasteia '' . in plato 's `` symposium '' , the participants in a dialogue about love assume that achilles and patroclus were a couple ; phaedrus argues that achilles was the younger and more beautiful one so he was the beloved and patroclus was the lover . but ancient greek had no words to distinguish heterosexual and homosexual , and it was assumed that a man could both desire handsome young men and have sex with women . -worship of achilles in antiquity . -there was an archaic heroic cult of achilles on the white island , `` leuce '' , in the black sea off the modern coasts of romania and ukraine , with a temple and an oracle which survived into the roman period . -in the lost epic '' aithiopis '' , a continuation of the `` iliad '' attributed to arktinus of miletos , achilles ' mother thetis returned to mourn him and removed his ashes from the pyre and took them to leuce at the mouths of the danube . there the achaeans raised a tumulus for him and celebrated funeral games . -pliny 's `` natural history '' mentions a tumulus that is no longer evident -lrb- `` insula akchillis tumulo eius viri clara '' -rrb- , on the island consecrated to him , located at a distance of fifty roman miles from peuce by the danube delta , and the temple there . pausanias has been told that the island is `` covered with forests and full of animals , some wild , some tame . in this island there is also achilles ' temple and his statue '' . ruins of a square temple 30 meters to a side , possibly that dedicated to achilles , were discovered by captain kritzikly in 1823 , but there has been no modern archeological work done on the island . -pomponius mela tells that achilles is buried in the island named achillea , between boristhene and ister . the greek geographer dionysius periegetus of bithynia , who lived at the time of domitian , writes that the island was called `` leuce '' `` because the wild animals which live there are white . it is said that there , in leuce island , reside the souls of achilles and other heroes , and that they wander through the uninhabited valleys of this island ; this is how jove rewarded the men who had distinguished themselves through their virtues , because through virtue they had acquired everlasting honor '' . -the `` periplus of the euxine sea '' gives the following details : `` it is said that the goddess thetis raised this island from the sea , for her son achilles , who dwells there . here is his temple and his statue , an archaic work . this island is not inhabited , and goats graze on it , not many , which the people who happen to arrive here with their ships , sacrifice to achilles . in this temple are also deposited a great many holy gifts , craters , rings and precious stones , offered to achilles in gratitude . one can still read inscriptions in greek and latin , in which achilles is praised and celebrated . some of these are worded in patroclus ' honor , because those who wish to be favored by achilles , honor patroclus at the same time . there are also in this island countless numbers of sea birds , which look after achilles ' temple . every morning they fly out to sea , wet their wings with water , and return quickly to the temple and sprinkle it . and after they finish the sprinkling , they clean the hearth of the temple with their wings . other people say still more , that some of the men who reach this island , come here intentionally . they bring animals in their ships , destined to be sacrificed . some of these animals they slaughter , others they set free on the island , in achilles ' honor . but there are others , who are forced to come to this island by sea storms . as they have no sacrificial animals , but wish to get them from the god of the island himself , they consult achilles ' oracle . they ask permission to slaughter the victims chosen from among the animals that graze freely on the island , and to deposit in exchange the price which they consider fair . but in case the oracle denies them permission , because there is an oracle here , they add something to the price offered , and if the oracle refuses again , they add something more , until at last , the oracle agrees that the price is sufficient . and then the victim does n't run away any more , but waits willingly to be caught . so , there is a great quantity of silver there , consecrated to the hero , as price for the sacrificial victims . to some of the people who come to this island , achilles appears in dreams , to others he would appear even during their navigation , if they were not too far away , and would instruct them as to which part of the island they would better anchor their ships '' . -lrb- quoted in densuşianu -rrb- -the heroic cult of achilles on leuce island was widespread in antiquity , not only along the sea lanes of the pontic sea but also in maritime cities whose economic interests were tightly connected to the riches of the black sea . -achilles from leuce island was venerated as `` pontarches '' the lord and master of the pontic sea , the protector of sailors and navigation . sailors went out of their way to offer sacrifice . to achilles of leuce were dedicated a number of important commercial port cities of the greek waters : achilleion in messenia -lrb- stephanus byzantinus -rrb- , achilleios in laconia -lrb- pausanias , iii .25,4 -rrb- nicolae densuşianu -lrb- densuşianu 1913 -rrb- even though he recognized achilles in the name of aquileia and in the north arm of the danube delta , the arm of chilia -lrb- `` achileii '' -rrb- , though his conclusion , that leuce had sovereign rights over pontos , evokes modern rather than archaic sea-law . '' -leuce had also a reputation as a place of healing . pausanias -lrb- iii .19,13 -rrb- reports that the delphic pythia sent a lord of croton to be cured of a chest wound . ammianus marcellinus -lrb- xxii .8 -rrb- attributes the healing to waters -lrb- `` aquae '' -rrb- on the island . -worship of achilles in modern times : the achilleion in corfu . -in the region of gastouri -lrb- γαστούρι -rrb- to the south of the city of corfu greece , empress of austria elisabeth of bavaria also known as sissi built in 1890 a summer palace with achilles as its central theme and it is a monument to platonic romanticism . the palace , naturally , was named after achilles : `` achilleion '' -lrb- αχίλλειον -rrb- . this elegant structure abounds with paintings and statues of achilles both in the main hall and in the lavish gardens depicting the heroic and tragic scenes of the trojan war . -other stories . -some post-homeric sources claim that in order to keep achilles safe from the war , thetis -lrb- or , in some versions , peleus -rrb- hides the young man at the court of lycomedes , king of skyros . there , achilles is disguised as a girl and lives among lycomedes ' daughters , perhaps under the name `` pyrrha '' -lrb- the red-haired girl -rrb- . with lycomedes ' daughter deidamia , whom in the account of statius he rapes , achilles there fathers a son , neoptolemus -lrb- also called pyrrhus , after his father 's possible alias -rrb- . according to this story , odysseus learns from the prophet calchas that the achaeans would be unable to capture troy without achilles ' aid . odysseus goes to skyros in the guise of a peddler selling women 's clothes and jewelry and places a shield and spear among his goods . when achilles instantly takes up the spear , odysseus sees through his disguise and convinces him to join the greek campaign . in another version of the story , odysseus arranges for a trumpet alarm to be sounded while he was with lycomedes ' women ; while the women flee in panic , achilles prepares to defend the court , thus giving his identity away . -in book 11 of homer 's `` odyssey '' , odysseus sails to the underworld and converses with the shades . one of these is achilles , who when greeted as `` blessed in life , blessed in death '' , responds that he would rather be a slave to the worst of masters than be king of all the dead . but achilles then asks odysseus of his son 's exploits in the trojan war , and when odysseus tells of neoptolemus ' heroic actions , achilles is filled with satisfaction . this leaves the reader with an ambiguous understanding of how achilles felt about the heroic life . achilles was worshipped as a sea-god in many of the greek colonies on the black sea , the location of the mythical `` white island '' which he was said to inhabit after his death , together with many other heroes . -the kings of the epirus claimed to be descended from achilles through his son , neoptolemus . alexander the great , son of the epirote princess olympias , could therefore also claim this descent , and in many ways strove to be like his great ancestor . he is said to have visited the tomb of achilles at achilleion while passing troy . in ad 216 the roman emperor caracalla , while on his way to war against parthia , emulated alexander by holding games around achilles ' tumulus . -achilles fought and killed the amazon helene . some also said he married medea , and that after both their deaths they were united in the elysian fields of hades -- as hera promised thetis in apollonius ' `` argonautica '' . in some versions of the myth , achilles has a relationship with his captive briseis . -achilles in greek tragedy . -the greek tragedian aeschylus wrote a trilogy of plays about achilles , given the title `` achilleis '' by modern scholars . the tragedies relate the deeds of achilles during the trojan war , including his defeat of hector and eventual death when an arrow shot by paris and guided by apollo punctures his heel . extant fragments of the `` achilleis '' and other aeschylean fragments have been assembled to produce a workable modern play . the first part of the `` achilleis '' trilogy , `` the myrmidons '' , focused on the relationship between achilles and chorus , who represent the achaean army and try to convince achilles to give up his quarrel with agamemnon ; only a few lines survive today . in plato 's `` symposium '' , phaedrus points out that aeschylus portrayed achilles as the lover and patroclus as the beloved ; phaedrus argues that this is incorrect because achilles , being the younger and more beautiful of the two , was the beloved , who loved his lover so much that he chose to die to revenge him . -the tragedian sophocles also wrote `` the lovers of achilles '' , a play with achilles as the main character . only a few fragments survive . -towards the end of the 5th century bc , a more negative view of achilles emerges in greek drama ; euripides refers to achilles in a bitter or ironic tone in `` hecuba '' , `` electra '' , and `` iphigenia in aulis '' . -achilles in greek philosophy . -the philosopher zeno of elea centered one of his paradoxes on an imaginary footrace between `` swift-footed '' achilles and a tortoise , by which he attempted to show that achilles could not catch up to a tortoise with a head start , and therefore that motion and change were impossible . as a student of the monist parmenides and a member of the eleatic school , zeno believed time and motion to be illusions . -achilles in roman and medieval literature . -the romans , who traditionally traced their lineage to troy , took a highly negative view of achilles . vergil refers to achilles as a savage and a merciless butcher of men , while horace portrays achilles ruthlessly slaying women and children . other writers , such as catullus , propertius , and ovid , represent a second strand of disparagement , with an emphasis on achilles ' erotic career . this strand continues in latin accounts of the trojan war by writers such as dictys cretensis and dares phrygius and in benoît de sainte-maure 's `` roman de troie '' and guido delle colonne 's `` historia destructionis troiae '' , which remained the most widely read and retold versions of the matter of troy until the 17th century . -achilles was described by the byzantine chronicler leo the deacon , not as hellene , but as scythian , while according to the byzantine author john malalas , his army was made up of a tribe previously known as myrmidons and later as bulgars . -popular culture . -the role of achilles has been played in film by : -achilles has frequently been mentioned in music : -abraham lincoln -lrb- february 12 , 1809 -- april 15 , 1865 -rrb- was the 16th president of the united states , serving from march 1861 until his assassination in april 1865 . lincoln led the united states through its civil war -- its bloodiest war and its greatest moral , constitutional , and political crisis . in doing so , he preserved the union , abolished slavery , strengthened the federal government , and modernized the economy . -born in hodgenville , kentucky , lincoln grew up on the western frontier in kentucky and indiana . largely self-educated , he became a lawyer in illinois , a whig party leader , and a member of the illinois house of representatives , where he served from 1834 to 1846 . elected to the united states house of representatives in 1846 , lincoln promoted rapid modernization of the economy through banks , tariffs , and railroads . because he had originally agreed not to run for a second term in congress , and because his opposition to the mexican -- american war was unpopular among illinois voters , lincoln returned to springfield and resumed his successful law practice . reentering politics in 1854 , he became a leader in building the new republican party , which had a statewide majority in illinois . in 1858 , while taking part in a series of highly publicized debates with his opponent and rival , democrat stephen a. douglas , lincoln spoke out against the expansion of slavery , but lost the u.s. senate race to douglas . -in 1860 , lincoln secured the republican party presidential nomination as a moderate from a swing state . with very little support in the slaveholding states of the south , he swept the north and was elected president in 1860 . his victory prompted seven southern slave states to form the confederate states of america before he moved into the white house - no compromise or reconciliation was found regarding slavery and secession . subsequently , on april 12 , 1861 , a confederate attack on fort sumter inspired the north to enthusiastically rally behind the union in a declaration of war . as the leader of the moderate faction of the republican party , lincoln confronted radical republicans , who demanded harsher treatment of the south , war democrats , who called for more compromise , anti-war democrats -lrb- called copperheads -rrb- , who despised him , and irreconcilable secessionists , who plotted his assassination . politically , lincoln fought back by pitting his opponents against each other , by carefully planned political patronage , and by appealing to the american people with his powers of oratory . his gettysburg address became an iconic endorsement of the principles of nationalism , republicanism , equal rights , liberty , and democracy . -lincoln initially concentrated on the military and political dimensions of the war . his primary goal was to reunite the nation . he suspended habeas corpus , leading to the controversial `` ex parte merryman '' decision , and he averted potential british intervention in the war by defusing the trent affair in late 1861 . lincoln closely supervised the war effort , especially the selection of top generals , including his most successful general , ulysses s. grant . he also made major decisions on union war strategy , including a naval blockade that shut down the south 's normal trade , moves to take control of kentucky and tennessee , and using gunboats to gain control of the southern river system . lincoln tried repeatedly to capture the confederate capital at richmond ; each time a general failed , lincoln substituted another , until finally grant succeeded . as the war progressed , his complex moves toward ending slavery began with the emancipation proclamation of 1863 ; subsequently , lincoln used the u.s. army to protect escaped slaves , encouraged the border states to outlaw slavery , and pushed through congress the thirteenth amendment to the united states constitution , which permanently outlawed slavery . -an exceptionally astute politician deeply involved with power issues in each state , lincoln reached out to the war democrats and managed his own re-election campaign in the 1864 presidential election . anticipating the war 's conclusion , lincoln pushed a moderate view of reconstruction , seeking to reunite the nation speedily through a policy of generous reconciliation in the face of lingering and bitter divisiveness . on april 14 , 1865 , five days after the april 9th surrender of confederate commanding general robert e. lee , lincoln was assassinated by john wilkes booth , a confederate sympathizer . -lincoln has been consistently ranked both by scholars and the public as one of the three greatest u.s. presidents . -family and childhood . -early life and family ancestry . -abraham lincoln was born february 12 , 1809 , the second child of thomas and nancy hanks lincoln , in a one-room log cabin on the sinking spring farm in hardin county , kentucky -lrb- now larue county -rrb- . he is a descendant of samuel lincoln , who migrated from norfolk , england to hingham , massachusetts , in 1638 . samuel 's grandson and great-grandson began the family 's western migration , which passed through new jersey , pennsylvania , and virginia . lincoln 's paternal grandfather and namesake , captain abraham lincoln , moved the family from virginia to jefferson county , kentucky in the 1780s . captain lincoln was killed in an indian raid in 1786 . his children , including six-year-old thomas , the future president 's father , witnessed the attack . after his father 's murder , thomas was left to make his own way on the frontier , working at odd jobs in kentucky and in tennessee , before settling with members of his family in hardin county , kentucky , in the early 1800s . -lincoln 's mother , nancy , was the daughter of lucy shipley hanks , and was born in what is now mineral county , west virginia , then part of virginia . the identity of lincoln 's maternal grandfather is unclear . according to william ensign lincoln 's book `` the ancestry of abraham lincoln '' , nancy was the daughter of joseph hanks ; however , the debate continues over whether she was born out of wedlock . lucy hanks migrated to kentucky with her daughter , nancy . the two women resided with relatives in washington county , kentucky . -thomas lincoln and nancy hanks were married on june 12 , 1806 , in washington county , and moved to elizabethtown , kentucky , following their marriage . they became the parents of three children : sarah , born on february 10 , 1807 ; abraham , on february 12 , 1809 ; and another son , thomas , who died in infancy . thomas lincoln bought or leased several farms in kentucky , including the sinking spring farm , where abraham was born ; however , a land title dispute soon forced the lincolns to move . in 1811 the family relocated eight miles north , to knob creek farm , where thomas acquired title to of land . in 1815 a claimant in another land dispute sought to eject the family from the farm . of the 816.5 acres that thomas held in kentucky , he lost all but of his land in court disputes over property titles . frustrated over the lack of security provided by kentucky courts , thomas sold the remaining land he held in kentucky in 1814 , and began planning a move to indiana , where the land survey process was more reliable and the ability for an individual to retain land titles was more secure . -in 1816 the family moved north across the ohio river to indiana , a free , non-slaveholding territory , where they settled in an `` unbroken forest '' in hurricane township , perry county . -lrb- their land in southern indiana became part of spencer county , indiana , when the county was established in 1818 . -rrb- the farm is preserved as part of the lincoln boyhood national memorial . in 1860 lincoln noted that the family 's move to indiana was `` partly on account of slavery '' ; but mainly due to land title difficulties in kentucky . during the family 's years in kentucky and indiana , thomas lincoln worked as a farmer , cabinetmaker , and carpenter . he owned farms , several town lots and livestock , paid taxes , sat on juries , appraised estates , served on country slave patrols , and guarded prisoners . thomas and nancy lincoln were also members of a separate baptists church , which had restrictive moral standards and opposed alcohol , dancing , and slavery . within a year of the family 's arrival in indiana , thomas claimed title to of indiana land . despite some financial challenges he eventually obtained clear title to of land in what became known as the little pigeon creek community in spencer county . prior to the family 's move to illinois in 1830 , thomas had acquired an additional twenty acres of land adjacent to his property . -several significant family events took place during lincoln 's youth in indiana . on october 5 , 1818 , nancy lincoln died of milk sickness , leaving eleven-year-old sarah in charge of a household that included her father , nine-year-old abraham , and dennis hanks , nancy 's nineteen-year-old orphaned cousin . on december 2 , 1819 , lincoln 's father married sarah `` sally '' bush johnston , a widow from elizabethtown , kentucky , with three children of her own . abraham became very close to his stepmother , whom he referred to as `` mother '' . those who knew lincoln as a teenager later recalled him being very distraught over his sister sarah 's death on january 20 , 1828 , while giving birth to a stillborn son . -as a youth , lincoln disliked the hard labor associated with frontier life . some of his neighbors and family members thought for a time that he was lazy for all his `` reading , scribbling , writing , ciphering , writing poetry , etc. '' , and must have done it to avoid manual labor . his stepmother also acknowledged he did not enjoy `` physical labor '' , but loved to read . lincoln was largely self-educated . his formal schooling from several itinerant teachers was intermittent , the aggregate of which may have amounted to less than a year ; however , he was an avid reader and retained a lifelong interest in learning . family , neighbors , and schoolmates of lincoln 's youth recalled that he read and reread the `` king james bible '' , `` aesop 's fables '' , bunyan 's `` the pilgrim 's progress '' , defoe 's `` robinson crusoe '' , weems 's `` the life of washington '' , and franklin 's `` autobiography '' , among others . -as he grew into his teens , lincoln took responsibility for the chores expected of him as one of the boys in the household . he also complied with the customary obligation of a son giving his father all earnings from work done outside the home until the age of twenty-one . abraham became adept at using an axe . tall for his age , lincoln was also strong and athletic . he attained a reputation for brawn and audacity after a very competitive wrestling match with the renowned leader of a group of ruffians known as `` the clary 's grove boys '' . -in early march 1830 , fearing a milk sickness outbreak along the ohio river , the lincoln family moved west to illinois , a non-slaveholding state . they settled on a site in macon county , illinois , west of decatur . historians disagree on who initiated the move . after the family relocated to illinois , abraham became increasingly distant from his father , in part because of his father 's lack of education , and occasionally lent him money . in 1831 , as thomas and other members of the family prepared to move to a new homestead in coles county , illinois , abraham was old enough to make his own decisions and struck out on his own . traveling down the sangamon river , he ended up in the village of new salem in sangamon county . later that spring , denton offutt , a new salem merchant , hired lincoln and some friends to take goods by flatboat from new salem to new orleans via the sangamon , illinois , and mississippi rivers . after arriving in new orleans -- and witnessing slavery firsthand -- lincoln returned to new salem , where he remained for the next six years . -marriage and children . -lincoln 's first romantic interest was ann rutledge , whom he met when he first moved to new salem ; by 1835 , they were in a relationship but not formally engaged . she died at the age of 22 on august 25 , 1835 , most likely of typhoid fever . in the early 1830s , he met mary owens from kentucky when she was visiting her sister . -late in 1836 , lincoln agreed to a match with mary if she returned to new salem . mary did return in november 1836 , and lincoln courted her for a time ; however , they both had second thoughts about their relationship . on august 16 , 1837 , lincoln wrote mary a letter suggesting he would not blame her if she ended the relationship . she never replied and the courtship ended . -in 1840 , lincoln became engaged to mary todd , who was from a wealthy slave-holding family in lexington , kentucky . they met in springfield , illinois , in december 1839 and were engaged the following december . -a wedding set for january 1 , 1841 , was canceled when the two broke off their engagement at lincoln 's initiative . they later met again at a party and married on november 4 , 1842 , in the springfield mansion of mary 's married sister . while preparing for the nuptials and feeling anxiety again , lincoln , when asked where he was going , replied , `` to hell , i suppose . '' -in 1844 , the couple bought a house in springfield near lincoln 's law office . mary todd lincoln kept house , often with the help of a relative or hired servant girl . robert todd lincoln was born in 1843 and edward baker lincoln -lrb- eddie -rrb- in 1846 . lincoln `` was remarkably fond of children '' , and the lincolns were not considered to be strict with their children . -edward died on february 1 , 1850 , in springfield , probably of tuberculosis . `` willie '' lincoln was born on december 21 , 1850 , and died of a fever on february 20 , 1862 . the lincolns ' fourth son , thomas `` tad '' lincoln , was born on april 4 , 1853 , and died of heart failure at the age of 18 on july 16 , 1871 . robert was the only child to live to adulthood and have children . his last descendant , great-grandson robert todd lincoln beckwith , died in 1985 . -the deaths of their sons had profound effects on both parents . later in life , mary struggled with the stresses of losing her husband and sons , and robert lincoln committed her temporarily to a mental health asylum in 1875 . abraham lincoln suffered from `` melancholy '' , a condition which now is referred to as clinical depression . -lincoln 's father-in-law and others of the todd family were either slave owners or slave traders . lincoln was close to the todds , and he and his family occasionally visited the todd estate in lexington . he was an affectionate , though often absent , husband and father of four children . -early career and militia service . -in 1832 , at age 23 , lincoln and a partner bought a small general store on credit in new salem , illinois . although the economy was booming in the region , the business struggled and lincoln eventually sold his share . that march he began his political career with his first campaign for the illinois general assembly . he had attained local popularity and could draw crowds as a natural raconteur in new salem , though he lacked an education , powerful friends , and money , which may be why he lost . he advocated navigational improvements on the sangamon river . -before the election , lincoln served as a captain in the illinois militia during the black hawk war . following his return , lincoln continued his campaign for the august 6 election for the illinois general assembly . at , he was tall and `` strong enough to intimidate any rival '' . at his first speech , when he saw a supporter in the crowd being attacked , lincoln grabbed the assailant by his `` neck and the seat of his trousers '' and threw him . lincoln finished eighth out of 13 candidates -lrb- the top four were elected -rrb- , though he received 277 of the 300 votes cast in the new salem precinct . -lincoln served as new salem 's postmaster and later as county surveyor , all the while reading voraciously . he then decided to become a lawyer and began teaching himself law by reading blackstone 's `` commentaries on the laws of england '' and other law books . of his learning method , lincoln stated : `` i studied with nobody '' . his second campaign in 1834 was successful . he won election to the state legislature ; though he ran as a whig , many democrats favored him over a more powerful whig opponent . -admitted to the bar in 1836 , he moved to springfield , illinois , and began to practice law under john t. stuart , mary todd 's cousin . lincoln became an able and successful lawyer with a reputation as a formidable adversary during cross-examinations and closing arguments . he partnered with stephen t. logan from 1841 until 1844 . then lincoln began his practice with william herndon , whom lincoln thought `` a studious young man '' . -u.s. house of representatives , 1847 -- 49 . -from the early 1830s , lincoln was a steadfast whig and professed to friends in 1861 to be , `` an old line whig , a disciple of henry clay '' . the party , including lincoln , favored economic modernization in banking , protective tariffs to fund internal improvements including railroads , and espoused urbanization as well . -in 1846 , lincoln was elected to the u.s. house of representatives , where he served one two-year term . he was the only whig in the illinois delegation , but he showed his party loyalty by participating in almost all votes and making speeches that echoed the party line . lincoln , in collaboration with abolitionist congressman joshua r. giddings , wrote a bill to abolish slavery in the district of columbia with compensation for the owners , enforcement to capture fugitive slaves , and a popular vote on the matter . he abandoned the bill when it failed to garner sufficient whig supporters . -on foreign and military policy , lincoln spoke out against the mexican -- american war , which he attributed to president polk 's desire for `` military glory -- that attractive rainbow , that rises in showers of blood '' . lincoln also supported the wilmot proviso , which , if it had been adopted , would have banned slavery in any u.s. territory won from mexico . -lincoln emphasized his opposition to polk by drafting and introducing his spot resolutions . the war had begun with a mexican slaughter of american soldiers in territory disputed by mexico and the u.s. polk insisted that mexican soldiers had `` invaded `` our territory '' and shed the blood of our fellow-citizens on our `` own soil '' . lincoln demanded that polk show congress the exact spot on which blood had been shed and prove that the spot was on american soil . -congress never enacted the resolution or even debated it , the national papers ignored it , and it resulted in a loss of political support for lincoln in his district . one illinois newspaper derisively nicknamed him `` spotty lincoln '' . lincoln later regretted some of his statements , especially his attack on the presidential war-making powers . -realizing clay was unlikely to win the presidency , lincoln , who had pledged in 1846 to serve only one term in the house , supported general zachary taylor for the whig nomination in the 1848 presidential election . taylor won and lincoln hoped to be appointed commissioner of the general land office , but that lucrative patronage job went to an illinois rival , justin butterfield , considered by the administration to be a highly skilled lawyer , but in lincoln 's view , an `` old fossil '' . the administration offered him the consolation prize of secretary or governor of the oregon territory . this distant territory was a democratic stronghold , and acceptance of the post would have effectively ended his legal and political career in illinois , so he declined and resumed his law practice . -prairie lawyer . -lincoln returned to practicing law in springfield , handling `` every kind of business that could come before a prairie lawyer '' . twice a year for 16 years , 10 weeks at a time , he appeared in county seats in the midstate region when the county courts were in session . lincoln handled many transportation cases in the midst of the nation 's western expansion , particularly the conflicts arising from the operation of river barges under the many new railroad bridges . as a riverboat man , lincoln initially favored those interests , but ultimately represented whoever hired him . in fact , he later represented a bridge company against a riverboat company in a landmark case involving a canal boat that sank after hitting a bridge . in 1849 , he received a patent for a flotation device for the movement of boats in shallow water . the idea was never commercialized , but lincoln is the only president to hold a patent . -in 1851 , he represented the alton & sangamon railroad in a dispute with one of its shareholders , james a. barret , who had refused to pay the balance on his pledge to buy shares in the railroad on the grounds that the company had changed its original train route . lincoln successfully argued that the railroad company was not bound by its original charter extant at the time of barret 's pledge ; the charter was amended in the public interest to provide a newer , superior , and less expensive route , and the corporation retained the right to demand barret 's payment . the decision by the illinois supreme court has been cited by numerous other courts in the nation . lincoln appeared before the illinois supreme court in 175 cases , in 51 as sole counsel , of which 31 were decided in his favor . from 1853 to 1860 , another of lincoln 's largest clients was the illinois central railroad . lincoln 's reputation with clients gave rise to his nickname `` honest abe . '' -lincoln 's most notable criminal trial occurred in 1858 when he defended william `` duff '' armstrong , who was on trial for the murder of james preston metzker . the case is famous for lincoln 's use of a fact established by judicial notice in order to challenge the credibility of an eyewitness . after an opposing witness testified seeing the crime in the moonlight , lincoln produced a `` farmers ' almanac '' showing the moon was at a low angle , drastically reducing visibility . based on this evidence , armstrong was acquitted . -lincoln rarely raised objections in the courtroom ; but in an 1859 case , where he defended a cousin , peachy harrison , who was accused of stabbing another to death , lincoln angrily protested the judge 's decision to exclude evidence favorable to his client . instead of holding lincoln in contempt of court as was expected , the judge , a democrat , reversed his ruling , allowing the evidence and acquitting harrison . -republican politics 1854 -- 60 . -slavery and a `` house divided '' . -by the 1850s , slavery was still legal in the southern united states , but had been generally outlawed in the northern states , including illinois , whose original 1818 constitution forbade slavery , as required by the northwest ordinance . lincoln disapproved of slavery , and the spread of slavery to new u.s. territory in the west . he returned to politics to oppose the pro-slavery kansas -- nebraska act -lrb- 1854 -rrb- ; this law repealed the slavery-restricting missouri compromise -lrb- 1820 -rrb- . senior senator stephen a. douglas of illinois had incorporated popular sovereignty into the act . douglas ' provision , which lincoln opposed , specified settlers had the right to determine locally whether to allow slavery in new u.s. territory , rather than have such a decision restricted by the national congress . -eric foner -lrb- 2010 -rrb- contrasts the abolitionists and anti-slavery radical republicans of the northeast who saw slavery as a sin , with the conservative republicans who thought it was bad because it hurt white people and blocked progress . foner argues that lincoln was a moderate in the middle , opposing slavery primarily because it violated the republicanism principles of the founding fathers , especially the equality of all men and democratic self-government as expressed in the declaration of independence . -on october 16 , 1854 , in his `` peoria speech '' , lincoln declared his opposition to slavery , which he repeated en route to the presidency . speaking in his kentucky accent , with a very powerful voice , he said the kansas act had a '' `` declared '' indifference , but as i must think , a covert `` real '' zeal for the spread of slavery . i can not but hate it . i hate it because of the monstrous injustice of slavery itself . i hate it because it deprives our republican example of its just influence in the world ... '' -drawing on remnants of the old whig party , and on disenchanted free soil , liberty , and democratic party members , he was instrumental in forging the shape of the new republican party . at the 1856 republican national convention , lincoln placed second in the contest to become the party 's candidate for vice president . -in 1857 -- 1858 , douglas broke with president james buchanan , leading to a fight for control of the democratic party . some eastern republicans even favored the reelection of douglas for the senate in 1858 , since he had led the opposition to the lecompton constitution , which would have admitted kansas as a slave state . in march 1857 , the supreme court issued its decision in `` dred scott v. sandford '' ; chief justice roger b. taney opined that blacks were not citizens , and derived no rights from the constitution . lincoln denounced the decision , alleging it was the product of a conspiracy of democrats to support the slave power . lincoln argued , `` the authors of the declaration of independence never intended ` to say all were equal in color , size , intellect , moral developments , or social capacity ' , but they ` did consider all men created equal -- equal in certain inalienable rights , among which are life , liberty , and the pursuit of happiness ' . '' -after the state republican party convention nominated him for the u.s. senate in 1858 , lincoln delivered his house divided speech , drawing on , `` a house divided against itself can not stand . i believe this government can not endure permanently half slave and half free . i do not expect the union to be dissolved -- i do not expect the house to fall -- but i do expect it will cease to be divided . it will become all one thing , or all the other . '' the speech created an evocative image of the danger of disunion caused by the slavery debate , and rallied republicans across the north . the stage was then set for the campaign for statewide election of the illinois legislature which would , in turn , select lincoln or douglas as its u.s. senator . -lincoln -- douglas debates and cooper union speech . -the senate campaign featured the seven lincoln -- douglas debates of 1858 , the most famous political debates in american history . the principals stood in stark contrast both physically and politically . lincoln warned that `` the slave power '' was threatening the values of republicanism , and accused douglas of distorting the values of the founding fathers that all men are created equal , while douglas emphasized his freeport doctrine , that local settlers were free to choose whether to allow slavery or not , and accused lincoln of having joined the abolitionists . the debates had an atmosphere of a prize fight and drew crowds in the thousands . lincoln stated douglas ' popular sovereignty theory was a threat to the nation 's morality and that douglas represented a conspiracy to extend slavery to free states . douglas said that lincoln was defying the authority of the u.s. supreme court and the `` dred scott '' decision . -though the republican legislative candidates won more popular votes , the democrats won more seats , and the legislature re-elected douglas to the senate . despite the bitterness of the defeat for lincoln , his articulation of the issues gave him a national political reputation . in may 1859 , lincoln purchased the `` illinois staats-anzeiger , '' a german-language newspaper which was consistently supportive ; most of the state 's 130,000 german americans voted democratic but there was republican support that a german-language paper could mobilize . -on february 27 , 1860 , new york party leaders invited lincoln to give a speech at cooper union to a group of powerful republicans . lincoln argued that the founding fathers had little use for popular sovereignty and had repeatedly sought to restrict slavery . lincoln insisted the moral foundation of the republicans required opposition to slavery , and rejected any `` groping for some middle ground between the right and the wrong '' . despite his inelegant appearance -- many in the audience thought him awkward and even ugly -- lincoln demonstrated an intellectual leadership that brought him into the front ranks of the party and into contention for the republican presidential nomination . journalist noah brooks reported , `` no man ever before made such an impression on his first appeal to a new york audience . '' -historian donald described the speech as a `` superb political move for an unannounced candidate , to appear in one rival 's -lrb- william h. seward -rrb- own state at an event sponsored by the second rival 's -lrb- salmon p. chase -rrb- loyalists , while not mentioning either by name during its delivery '' . in response to an inquiry about his presidential intentions , lincoln said , `` the taste `` is '' in my mouth a little . '' -1860 presidential nomination and campaign . -on may 9 -- 10 , 1860 , the illinois republican state convention was held in decatur . lincoln 's followers organized a campaign team led by david davis , norman judd , leonard swett , and jesse dubois , and lincoln received his first endorsement to run for the presidency . exploiting the embellished legend of his frontier days with his father -lrb- clearing the land and splitting fence rails with an ax -rrb- , lincoln 's supporters adopted the label of `` the rail candidate '' . -on may 18 , at the republican national convention in chicago , lincoln 's friends promised and manipulated and won the nomination on the third ballot , beating candidates such as william h. seward and salmon p. chase . a former democrat , hannibal hamlin of maine , was nominated for vice president to balance the ticket . lincoln 's success depended on his reputation as a moderate on the slavery issue , and his strong support for whiggish programs of internal improvements and the protective tariff . -on the third ballot pennsylvania put him over the top . pennsylvania iron interests were reassured by his support for protective tariffs . lincoln 's managers had been adroitly focused on this delegation as well as the others , while following lincoln 's strong dictate to `` make no contracts that bind me '' . -most republicans agreed with lincoln that the north was the aggrieved party , as the slave power tightened its grasp on the national government with the `` dred scott '' decision and the presidency of james buchanan . throughout the 1850s , lincoln doubted the prospects of civil war , and his supporters rejected claims that his election would incite secession . meanwhile , douglas was selected as the candidate of the northern democrats . delegates from 11 slave states walked out of the democratic convention , disagreeing with douglas ' position on popular sovereignty , and ultimately selected john c. breckinridge as their candidate . -as douglas and the other candidates went through with their campaigns , lincoln was the only one of them who gave no speeches . instead , he monitored the campaign closely and relied on the enthusiasm of the republican party . the party did the leg work that produced majorities across the north , and produced an abundance of campaign posters , leaflets , and newspaper editorials . there were thousands of republican speakers who focused first on the party platform , and second on lincoln 's life story , emphasizing his childhood poverty . the goal was to demonstrate the superior power of `` free labor '' , whereby a common farm boy could work his way to the top by his own efforts . the republican party 's production of campaign literature dwarfed the combined opposition ; a `` chicago tribune '' writer produced a pamphlet that detailed lincoln 's life , and sold 100,000 to 200,000 copies . -1860 election and secession . -on november 6 , 1860 , lincoln was elected the 16th president of the united states , beating democrat stephen a. douglas , john c. breckinridge of the southern democrats , and john bell of the new constitutional union party . he was the first president from the republican party . his victory was entirely due to the strength of his support in the north and west ; no ballots were cast for him in 10 of the 15 southern slave states , and he won only two of 996 counties in all the southern states . -lincoln received 1,866,452 votes , douglas 1,376,957 votes , breckinridge 849,781 votes , and bell 588,789 votes . turnout was 82.2 percent , with lincoln winning the free northern states , as well as california and oregon . douglas won missouri , and split new jersey with lincoln . bell won virginia , tennessee , and kentucky , and breckinridge won the rest of the south . -although lincoln won only a plurality of the popular vote , his victory in the electoral college was decisive : lincoln had 180 and his opponents added together had only 123 . there were fusion tickets in which all of lincoln 's opponents combined to support the same slate of electors in new york , new jersey , and rhode island , but even if the anti-lincoln vote had been combined in every state , lincoln still would have won a majority in the electoral college . -as lincoln 's election became evident , secessionists made clear their intent to leave the union before he took office the next march . on december 20 , 1860 , south carolina took the lead by adopting an ordinance of secession ; by february 1 , 1861 , florida , mississippi , alabama , georgia , louisiana , and texas followed . six of these states then adopted a constitution and declared themselves to be a sovereign nation , the confederate states of america . the upper south and border states -lrb- delaware , maryland , virginia , north carolina , tennessee , kentucky , missouri , and arkansas -rrb- listened to , but initially rejected , the secessionist appeal . president buchanan and president-elect lincoln refused to recognize the confederacy , declaring secession illegal . the confederacy selected jefferson davis as its provisional president on february 9 , 1861 . -there were attempts at compromise . the crittenden compromise would have extended the missouri compromise line of 1820 , dividing the territories into slave and free , contrary to the republican party 's free-soil platform . lincoln rejected the idea , saying , `` i will suffer death before i consent ... to any concession or compromise which looks like buying the privilege to take possession of this government to which we have a constitutional right . '' -lincoln , however , did tacitly support the proposed corwin amendment to the constitution , which passed congress before lincoln came into office and was then awaiting ratification by the states . that proposed amendment would have protected slavery in states where it already existed and would have guaranteed that congress would not interfere with slavery without southern consent . a few weeks before the war , lincoln sent a letter to every governor informing them congress had passed a joint resolution to amend the constitution . lincoln was open to the possibility of a constitutional convention to make further amendments to the constitution . -en route to his inauguration by train , lincoln addressed crowds and legislatures across the north . the president-elect then evaded possible assassins in baltimore , who were uncovered by lincoln 's head of security , allan pinkerton . on february 23 , 1861 , he arrived in disguise in washington , d.c. , which was placed under substantial military guard . lincoln directed his inaugural address to the south , proclaiming once again that he had no intention , or inclination , to abolish slavery in the southern states : -the president ended his address with an appeal to the people of the south : `` we are not enemies , but friends . we must not be enemies ... the mystic chords of memory , stretching from every battlefield , and patriot grave , to every living heart and hearthstone , all over this broad land , will yet swell the chorus of the union , when again touched , as surely they will be , by the better angels of our nature . '' the failure of the peace conference of 1861 signaled that legislative compromise was impossible . by march 1861 , no leaders of the insurrection had proposed rejoining the union on any terms . meanwhile , lincoln and the republican leadership agreed that the dismantling of the union could not be tolerated . lincoln said as the war was ending : -beginning of the war . -the commander of fort sumter , south carolina , major robert anderson , sent a request for provisions to washington , and the execution of lincoln 's order to meet that request was seen by the secessionists as an act of war . on april 12 , 1861 , confederate forces fired on union troops at fort sumter , forcing them to surrender , and began the war . historian allan nevins argued that the newly inaugurated lincoln made three miscalculations : underestimating the gravity of the crisis , exaggerating the strength of unionist sentiment in the south , and not realizing the southern unionists were insisting there be no invasion . -william tecumseh sherman talked to lincoln during inauguration week and was `` sadly disappointed '' at his failure to realize that `` the country was sleeping on a volcano '' and that the south was preparing for war . donald concludes that , `` his repeated efforts to avoid collision in the months between inauguration and the firing on ft. sumter showed he adhered to his vow not to be the first to shed fraternal blood . but he also vowed not to surrender the forts . the only resolution of these contradictory positions was for the confederates to fire the first shot ; they did just that . '' -on april 15 , lincoln called on all the states to send detachments totaling 75,000 troops to recapture forts , protect washington , and `` preserve the union '' , which , in his view , still existed intact despite the actions of the seceding states . this call forced the states to choose sides . virginia declared its secession and was rewarded with the confederate capital , despite the exposed position of richmond so close to union lines . north carolina , tennessee , and arkansas also voted for secession over the next two months . secession sentiment was strong in missouri and maryland , but did not prevail ; kentucky tried to be neutral . the confederate attack on fort sumter rallied americans north of the mason-dixon line to the defense of the american nation . historian allan nevins says : -states sent union regiments south in response to lincoln 's call to save the capital and confront the rebellion . on april 19 , mobs in baltimore , which controlled the rail links , attacked union troops who were changing trains , and local leaders ' groups later burned critical rail bridges to the capital . the army responded by arresting local maryland officials . lincoln suspended the writ of `` habeas corpus '' in areas the army felt it needed to secure for troops to reach washington . john merryman , a maryland official involved in hindering the u.s. troop movements , petitioned supreme court chief justice and marylander , roger b. taney , author of the controversial pro-slavery `` dred scott '' opinion , to issue a writ of `` habeas corpus , '' and in june taney , acting as a circuit judge and not speaking for the supreme court , issued the writ , because in his opinion only congress could suspend the writ . lincoln continued the army policy that the writ was suspended in limited areas despite the ex parte merryman ruling . -assuming command for the union in the war . -after the battle of fort sumter , lincoln realized the importance of taking immediate executive control of the war and making an overall strategy to put down the rebellion . lincoln encountered an unprecedented political and military crisis , and he responded as commander-in-chief , using unprecedented powers . he expanded his war powers , and imposed a blockade on all the confederate shipping ports , disbursed funds before appropriation by congress , and after suspending `` habeas corpus '' , arrested and imprisoned thousands of suspected confederate sympathizers . lincoln was supported by congress and the northern public for these actions . in addition , lincoln had to contend with reinforcing strong union sympathies in the border slave states and keeping the war from becoming an international conflict . -the war effort was the source of continued disparagement of lincoln , and dominated his time and attention . from the start , it was clear that bipartisan support would be essential to success in the war effort , and any manner of compromise alienated factions on both sides of the aisle , such as the appointment of republicans and democrats to command positions in the union army . copperheads criticized lincoln for refusing to compromise on the slavery issue . conversely , the radical republicans criticized him for moving too slowly in abolishing slavery . on august 6 , 1861 , lincoln signed the confiscation act that authorized judiciary proceedings to confiscate and free slaves who were used to support the confederate war effort . in practice , the law had little effect , but it did signal political support for abolishing slavery in the confederacy . -in late august 1861 , general john c. frémont , the 1856 republican presidential nominee , issued , without consulting his superiors in washington , a proclamation of martial law in missouri . he declared that any citizen found bearing arms could be court-martialed and shot , and that slaves of persons aiding the rebellion would be freed . frémont was already under a cloud with charges of negligence in his command of the department of the west compounded with allegations of fraud and corruption . lincoln overruled frémont 's proclamation . lincoln believed that fremont 's emancipation was political ; neither militarily necessary nor legal . after lincoln acted , union enlistments from maryland , kentucky , and missouri increased by over 40,000 troops . -the trent affair of late 1861 threatened war with great britain . the u.s. navy illegally intercepted a british merchant ship , the `` trent '' , on the high seas and seized two confederate envoys ; britain protested vehemently while the u.s. cheered . lincoln resolved the issue by releasing the two men and war was successfully averted with britain . lincoln 's foreign policy approach had been initially hands off , due to his inexperience ; he left most diplomacy appointments and other foreign policy matters to his secretary of state , william seward . seward 's initial reaction to the `` trent '' affair , however , was too bellicose , so lincoln also turned to senator charles sumner , the chairman of the senate foreign relations committee and an expert in british diplomacy . -to learn technical military terms , lincoln borrowed and studied henry halleck 's book , `` elements of military art and science '' from the library of congress . lincoln painstakingly monitored the telegraphic reports coming into the war department in washington , d.c. . he kept close tabs on all phases of the military effort , consulted with governors , and selected generals based on their past success -lrb- as well as their state and party -rrb- . in january 1862 , after many complaints of inefficiency and profiteering in the war department , lincoln replaced simon cameron with edwin stanton as war secretary . stanton was a staunchly unionist pro-business conservative democrat who moved toward the radical republican faction . nevertheless , he worked more often and more closely with lincoln than any other senior official . `` stanton and lincoln virtually conducted the war together , '' say thomas and hyman . -in terms of war strategy , lincoln articulated two priorities : to ensure that washington was well-defended , and to conduct an aggressive war effort that would satisfy the demand in the north for prompt , decisive victory ; major northern newspaper editors expected victory within 90 days . twice a week , lincoln would meet with his cabinet in the afternoon , and occasionally mary lincoln would force him to take a carriage ride because she was concerned he was working too hard . lincoln learned from his chief of staff general henry halleck , a student of the european strategist jomini , of the critical need to control strategic points , such as the mississippi river ; he also knew well the importance of vicksburg and understood the necessity of defeating the enemy 's army , rather than simply capturing territory . -general mcclellan . -after the union defeat at the first battle of bull run and the retirement of the aged winfield scott in late 1861 , lincoln appointed major general george b. mcclellan general-in-chief of all the union armies . mcclellan , a young west point graduate , railroad executive , and pennsylvania democrat , took several months to plan and attempt his peninsula campaign , longer than lincoln wanted . the campaign 's objective was to capture richmond by moving the army of the potomac by boat to the peninsula and then overland to the confederate capital . mcclellan 's repeated delays frustrated lincoln and congress , as did his position that no troops were needed to defend washington . lincoln insisted on holding some of mcclellan 's troops in defense of the capital ; mcclellan , who consistently overestimated the strength of confederate troops , blamed this decision for the ultimate failure of the peninsula campaign . -lincoln removed mcclellan as general-in-chief and appointed henry wager halleck in march 1862 , after mcclellan 's `` harrison 's landing letter '' , in which he offered unsolicited political advice to lincoln urging caution in the war effort . mcclellan 's letter incensed radical republicans , who successfully pressured lincoln to appoint john pope , a republican , as head of the new army of virginia . pope complied with lincoln 's strategic desire to move toward richmond from the north , thus protecting the capital from attack . -however , lacking requested reinforcements from mcclellan , now commanding the army of the potomac , pope was soundly defeated at the second battle of bull run in the summer of 1862 , forcing the army of the potomac to defend washington for a second time . the war also expanded with naval operations in 1862 when the css `` virginia '' , formerly the uss `` merrimack '' , damaged or destroyed three union vessels in norfolk , virginia , before being engaged and damaged by the uss `` monitor '' . lincoln closely reviewed the dispatches and interrogated naval officers during their clash in the battle of hampton roads . -despite his dissatisfaction with mcclellan 's failure to reinforce pope , lincoln was desperate , and restored him to command of all forces around washington , to the dismay of all in his cabinet but seward . two days after mcclellan 's return to command , general robert e. lee 's forces crossed the potomac river into maryland , leading to the battle of antietam in september 1862 . the ensuing union victory was among the bloodiest in american history , but it enabled lincoln to announce that he would issue an emancipation proclamation in january . having composed the proclamation some time earlier , lincoln had waited for a military victory to publish it to avoid it being perceived as the product of desperation . -mcclellan then resisted the president 's demand that he pursue lee 's retreating and exposed army , while his counterpart general don carlos buell likewise refused orders to move the army of the ohio against rebel forces in eastern tennessee . as a result , lincoln replaced buell with william rosecrans ; and , after the 1862 midterm elections , he replaced mcclellan with republican ambrose burnside . both of these replacements were political moderates and prospectively more supportive of the commander-in-chief . -burnside , against the advice of the president , prematurely launched an offensive across the rappahannock river and was stunningly defeated by lee at fredericksburg in december . not only had burnside been defeated on the battlefield , but his soldiers were disgruntled and undisciplined . desertions during 1863 were in the thousands and they increased after fredericksburg . lincoln brought in joseph hooker , despite his record of loose talk about the need for a military dictatorship . -the mid-term elections in 1862 brought the republicans severe losses due to sharp disfavor with the administration over its failure to deliver a speedy end to the war , as well as rising inflation , new high taxes , rumors of corruption , the suspension of `` habeas corpus , '' the military draft law , and fears that freed slaves would undermine the labor market . the emancipation proclamation announced in september gained votes for the republicans in the rural areas of new england and the upper midwest , but it lost votes in the cities and the lower midwest . -while republicans were discouraged , democrats were energized and did especially well in pennsylvania , ohio , indiana , and new york . the republicans did maintain their majorities in congress and in the major states , except new york . the cincinnati `` gazette '' contended that the voters were `` depressed by the interminable nature of this war , as so far conducted , and by the rapid exhaustion of the national resources without progress '' . -in the spring of 1863 , lincoln was optimistic about upcoming military campaigns to the point of thinking the end of the war could be near if a string of victories could be put together ; these plans included hooker 's attack on lee north of richmond , rosecrans ' on chattanooga , grant 's on vicksburg , and a naval assault on charleston . -hooker was routed by lee at the battle of chancellorsville in may , but continued to command his troops for some weeks . he ignored lincoln 's order to divide his troops , and possibly force lee to do the same in harper 's ferry , and tendered his resignation , which lincoln accepted . he was replaced by george meade , who followed lee into pennsylvania for the gettysburg campaign , which was a victory for the union , though lee 's army avoided capture . at the same time , after initial setbacks , grant laid siege to vicksburg and the union navy attained some success in charleston harbor . -after the battle of gettysburg , lincoln clearly understood that his military decisions would be more effectively carried out by conveying his orders through his war secretary or his general-in-chief on to his generals , who resented his civilian interference with their own plans . even so , he often continued to give detailed directions to his generals as commander-in-chief . -emancipation proclamation . -lincoln understood that the federal government 's power to end slavery was limited by the constitution , which before 1865 , committed the issue to individual states . he argued before and during his election that the eventual extinction of slavery would result from preventing its expansion into new u.s. territory . at the beginning of the war , he also sought to persuade the states to accept compensated emancipation in return for their prohibition of slavery . lincoln believed that curtailing slavery in these ways would economically expunge it , as envisioned by the founding fathers , under the constitution . president lincoln rejected two geographically limited emancipation attempts by major general john c. frémont in august 1861 and by major general david hunter in may 1862 , on the grounds that it was not within their power , and it would upset the border states loyal to the union . -on june 19 , 1862 , endorsed by lincoln , congress passed an act banning slavery on all federal territory . in july 1862 , the second confiscation act was passed , which set up court procedures that could free the slaves of anyone convicted of aiding the rebellion . although lincoln believed it was not within congress 's power to free the slaves within the states , he approved the bill in deference to the legislature . he felt such action could only be taken by the commander-in-chief using war powers granted to the president by the constitution , and lincoln was planning to take that action . in that month , lincoln discussed a draft of the emancipation proclamation with his cabinet . in it , he stated that `` as a fit and necessary military measure , on january 1 , 1863 , all persons held as slaves in the confederate states will thenceforward , and forever , be free '' . -privately , lincoln concluded at this point that the slave base of the confederacy had to be eliminated . however copperheads argued that emancipation was a stumbling block to peace and reunification . republican editor horace greeley of the highly influential `` new york tribune '' fell for the ploy , and lincoln refuted it directly in a shrewd letter of august 22 , 1862 . although he said he personally wished all men could be free , lincoln stated that the primary goal of his actions as the u.s. president -lrb- he used the first person pronoun and explicitly refers to his `` official duty '' -rrb- was that of preserving the union : -the emancipation proclamation , issued on september 22 , 1862 , and put into effect on january 1 , 1863 , declared free the slaves in 10 states not then under union control , with exemptions specified for areas already under union control in two states . lincoln spent the next 100 days preparing the army and the nation for emancipation , while democrats rallied their voters in the 1862 off-year elections by warning of the threat freed slaves posed to northern whites . -once the abolition of slavery in the rebel states became a military objective , as union armies advanced south , more slaves were liberated until all three million of them in confederate territory were freed . lincoln 's comment on the signing of the proclamation was : `` i never , in my life , felt more certain that i was doing right , than i do in signing this paper . '' for some time , lincoln continued earlier plans to set up colonies for the newly freed slaves . he commented favorably on colonization in the emancipation proclamation , but all attempts at such a massive undertaking failed . a few days after emancipation was announced , 13 republican governors met at the war governors ' conference ; they supported the president 's proclamation , but suggested the removal of general george b. mcclellan as commander of the union army . -enlisting former slaves in the military was official government policy after the issuance of the emancipation proclamation . by the spring of 1863 , lincoln was ready to recruit black troops in more than token numbers . in a letter to andrew johnson , the military governor of tennessee , encouraging him to lead the way in raising black troops , lincoln wrote , `` the bare sight of 50,000 armed and drilled black soldiers on the banks of the mississippi would end the rebellion at once '' . by the end of 1863 , at lincoln 's direction , general lorenzo thomas had recruited 20 regiments of blacks from the mississippi valley . frederick douglass once observed of lincoln : `` in his company , i was never reminded of my humble origin , or of my unpopular color '' . -gettysburg address -lrb- 1863 -rrb- . -with the great union victory at the battle of gettysburg in july 1863 , and the defeat of the copperheads in the ohio election in the fall , lincoln maintained a strong base of party support and was in a strong position to redefine the war effort , despite the new york city draft riots . the stage was set for his address at the gettysburg battlefield cemetery on november 19 , 1863 . defying lincoln 's prediction that `` the world will little note , nor long remember what we say here '' , the address became the most quoted speech in american history . -in 272 words , and three minutes , lincoln asserted the nation was born not in 1789 , but in 1776 , `` conceived in liberty , and dedicated to the proposition that all men are created equal '' . he defined the war as an effort dedicated to these principles of liberty and equality for all . the emancipation of slaves was now part of the national war effort . he declared that the deaths of so many brave soldiers would not be in vain , that slavery would end as a result of the losses , and the future of democracy in the world would be assured , that `` government of the people , by the people , for the people , shall not perish from the earth '' . lincoln concluded that the civil war had a profound objective : a new birth of freedom in the nation . -general grant . -meade 's failure to capture lee 's army as it retreated from gettysburg , and the continued passivity of the army of the potomac , persuaded lincoln that a change in command was needed . general ulysses s. grant 's victories at the battle of shiloh and in the vicksburg campaign impressed lincoln and made grant a strong candidate to head the union army . responding to criticism of grant after shiloh , lincoln had said , `` i ca n't spare this man . he fights . '' with grant in command , lincoln felt the union army could relentlessly pursue a series of coordinated offensives in multiple theaters , and have a top commander who agreed on the use of black troops . -nevertheless , lincoln was concerned that grant might be considering a candidacy for president in 1864 , as mcclellan was . lincoln arranged for an intermediary to make inquiry into grant 's political intentions , and being assured that he had none , submitted to the senate grant 's promotion to commander of the union army . he obtained congress 's consent to reinstate for grant the rank of lieutenant general , which no officer had held since george washington . -grant waged his bloody overland campaign in 1864 . this is often characterized as a war of attrition , given high union losses at battles such as the battle of the wilderness and cold harbor . even though they had the advantage of fighting on the defensive , the confederate forces had `` almost as high a percentage of casualties as the union forces '' . the high casualty figures of the union alarmed the north ; grant had lost a third of his army , and lincoln asked what grant 's plans were , to which the general replied , `` i propose to fight it out on this line if it takes all summer . '' -the confederacy lacked reinforcements , so lee 's army shrank with every costly battle . grant 's army moved south , crossed the james river , forcing a siege and trench warfare outside petersburg , virginia . lincoln then made an extended visit to grant 's headquarters at city point , virginia . this allowed the president to confer in person with grant and william tecumseh sherman about the hostilities , as sherman coincidentally managed a hasty visit to grant from his position in north carolina . lincoln and the republican party mobilized support for the draft throughout the north , and replaced the union losses . -lincoln authorized grant to target the confederate infrastructure -- such as plantations , railroads , and bridges -- hoping to destroy the south 's morale and weaken its economic ability to continue fighting . grant 's move to petersburg resulted in the obstruction of three railroads between richmond and the south . this strategy allowed generals sherman and philip sheridan to destroy plantations and towns in virginia 's shenandoah valley . the damage caused by sherman 's march to the sea through georgia in 1864 was limited to a swath , but neither lincoln nor his commanders saw destruction as the main goal , but rather defeat of the confederate armies . mark e. neely jr. has argued that there was no effort to engage in `` total war '' against civilians which he believed did take place during world war ii . -confederate general jubal anderson early began a series of assaults in the north that threatened the capital . during early 's raid on washington , d.c. in 1864 , lincoln was watching the combat from an exposed position ; captain oliver wendell holmes shouted at him , `` get down , you damn fool , before you get shot ! '' after repeated calls on grant to defend washington , sheridan was appointed and the threat from early was dispatched . -as grant continued to wear down lee 's forces , efforts to discuss peace began . confederate vice president stephens led a group to meet with lincoln , seward , and others at hampton roads . lincoln refused to allow any negotiation with the confederacy as a coequal ; his sole objective was an agreement to end the fighting and the meetings produced no results . on april 1 , 1865 , grant successfully outflanked lee 's forces in the battle of five forks and nearly encircled petersburg , and the confederate government evacuated richmond . days later , when that city fell , lincoln visited the vanquished confederate capital ; as he walked through the city , white southerners were stone-faced , but freedmen greeted him as a hero . on april 9 , lee surrendered to grant at appomattox and the war was effectively over . -1864 re-election . -while the war was still being waged , lincoln faced reelection in 1864 . lincoln was a master politician , bringing together -- and holding together -- all the main factions of the republican party , and bringing in war democrats such as edwin m. stanton and andrew johnson as well . lincoln spent many hours a week talking to politicians from across the land and using his patronage powers -- greatly expanded over peacetime -- to hold the factions of his party together , build support for his own policies , and fend off efforts by radicals to drop him from the 1864 ticket . at its 1864 convention , the republican party selected johnson , a war democrat from the southern state of tennessee , as his running mate . to broaden his coalition to include war democrats as well as republicans , lincoln ran under the label of the new union party . -when grant 's 1864 spring campaigns turned into bloody stalemates and union casualties mounted , the lack of military success wore heavily on the president 's re-election prospects , and many republicans across the country feared that lincoln would be defeated . sharing this fear , lincoln wrote and signed a pledge that , if he should lose the election , he would still defeat the confederacy before turning over the white house : -lincoln did not show the pledge to his cabinet , but asked them to sign the sealed envelope . -while the democratic platform followed the `` peace wing '' of the party and called the war a `` failure '' , their candidate , general george b. mcclellan , supported the war and repudiated the platform . lincoln provided grant with more troops and mobilized his party to renew its support of grant in the war effort . sherman 's capture of atlanta in september and david farragut 's capture of mobile ended defeatist jitters ; the democratic party was deeply split , with some leaders and most soldiers openly for lincoln . by contrast , the national union party was united and energized as lincoln made emancipation the central issue , and state republican parties stressed the perfidy of the copperheads . on november 8 , lincoln was re-elected in a landslide , carrying all but three states , and receiving 78 percent of the union soldiers ' vote . -on march 4 , 1865 , lincoln delivered his second inaugural address . in it , he deemed the high casualties on both sides to be god 's will . historian mark noll concludes it ranks `` among the small handful of semi-sacred texts by which americans conceive their place in the world '' . lincoln said : -reconstruction began during the war , as lincoln and his associates anticipated questions of how to reintegrate the conquered southern states , and how to determine the fates of confederate leaders and freed slaves . shortly after lee 's surrender , a general had asked lincoln how the defeated confederates should be treated , and lincoln replied , `` let 'em up easy . '' in keeping with that sentiment , lincoln led the moderates regarding reconstruction policy , and was opposed by the radical republicans , under rep. thaddeus stevens , sen. charles sumner and sen. benjamin wade , political allies of the president on other issues . determined to find a course that would reunite the nation and not alienate the south , lincoln urged that speedy elections under generous terms be held throughout the war . his amnesty proclamation of december 8 , 1863 , offered pardons to those who had not held a confederate civil office , had not mistreated union prisoners , and would sign an oath of allegiance . -as southern states were subdued , critical decisions had to be made as to their leadership while their administrations were re-formed . of special importance were tennessee and arkansas , where lincoln appointed generals andrew johnson and frederick steele as military governors , respectively . in louisiana , lincoln ordered general nathaniel p. banks to promote a plan that would restore statehood when 10 percent of the voters agreed to it . lincoln 's democratic opponents seized on these appointments to accuse him of using the military to ensure his and the republicans ' political aspirations . on the other hand , the radicals denounced his policy as too lenient , and passed their own plan , the wade-davis bill , in 1864 . when lincoln vetoed the bill , the radicals retaliated by refusing to seat representatives elected from louisiana , arkansas , and tennessee . -lincoln 's appointments were designed to keep both the moderate and radical factions in harness . to fill chief justice taney 's seat on the supreme court , he named the choice of the radicals , salmon p. chase , who lincoln believed would uphold the emancipation and paper money policies . -after implementing the emancipation proclamation , which did not apply to every state , lincoln increased pressure on congress to outlaw slavery throughout the entire nation with a constitutional amendment . lincoln declared that such an amendment would `` clinch the whole matter '' . by december 1863 , a proposed constitutional amendment that would outlaw slavery was brought to congress for passage . this first attempt at an amendment failed to pass , falling short of the required two-thirds majority on june 15 , 1864 , in the house of representatives . passage of the proposed amendment became part of the republican/unionist platform in the election of 1864 . after a long debate in the house , a second attempt passed congress on january 31 , 1865 , and was sent to the state legislatures for ratification . upon ratification , it became the thirteenth amendment to the united states constitution on december 6 , 1865 . -as the war drew to a close , lincoln 's presidential reconstruction for the south was in flux ; having believed the federal government had limited responsibility to the millions of freedmen . he signed into law senator charles sumner 's freedmen 's bureau bill that set up a temporary federal agency designed to meet the immediate material needs of former slaves . the law assigned land for a lease of three years with the ability to purchase title for the freedmen . lincoln stated that his louisiana plan did not apply to all states under reconstruction . shortly before his assassination , lincoln announced he had a new plan for southern reconstruction . discussions with his cabinet revealed lincoln planned short-term military control over southern states , until readmission under the control of southern unionists . -historians agree that it is impossible to predict exactly what lincoln would have done about reconstruction if he had lived , but they make projections based on his known policy positions and political acumen . lincoln biographers james g. randall and richard current , according to david lincove , argue that : -eric foner argues that : -redefining the republic and republicanism . -the successful reunification of the states had consequences for the name of the country . the term `` the united states '' has historically been used , sometimes in the plural -lrb- `` these united states '' -rrb- , and other times in the singular , without any particular grammatical consistency . the civil war was a significant force in the eventual dominance of the singular usage by the end of the 19th century . -in recent years , historians such as harry jaffa , herman belz , john diggins , vernon burton and eric foner have stressed lincoln 's redefinition of `` republican values '' . as early as the 1850s , a time when most political rhetoric focused on the sanctity of the constitution , lincoln redirected emphasis to the declaration of independence as the foundation of american political values -- what he called the `` sheet anchor '' of republicanism . the declaration 's emphasis on freedom and equality for all , in contrast to the constitution 's tolerance of slavery , shifted the debate . as diggins concludes regarding the highly influential cooper union speech of early 1860 , `` lincoln presented americans a theory of history that offers a profound contribution to the theory and destiny of republicanism itself . '' his position gained strength because he highlighted the moral basis of republicanism , rather than its legalisms . nevertheless , in 1861 , lincoln justified the war in terms of legalisms -lrb- the constitution was a contract , and for one party to get out of a contract all the other parties had to agree -rrb- , and then in terms of the national duty to guarantee a republican form of government in every state . burton -lrb- 2008 -rrb- argues that lincoln 's republicanism was taken up by the freedmen as they were emancipated . -in march 1861 , in lincoln 's first inaugural address , he explored the nature of democracy . he denounced secession as anarchy , and explained that majority rule had to be balanced by constitutional restraints in the american system . he said `` a majority held in restraint by constitutional checks and limitations , and always changing easily with deliberate changes of popular opinions and sentiments , is the only true sovereign of a free people . '' -other enactments . -lincoln adhered to the whig theory of the presidency , which gave congress primary responsibility for writing the laws while the executive enforced them . lincoln vetoed only four bills passed by congress ; the only important one was the wade-davis bill with its harsh program of reconstruction . he signed the homestead act in 1862 , making millions of acres of government-held land in the west available for purchase at very low cost . the morrill land-grant colleges act , also signed in 1862 , provided government grants for agricultural colleges in each state . the pacific railway acts of 1862 and 1864 granted federal support for the construction of the united states ' first transcontinental railroad , which was completed in 1869 . the passage of the homestead act and the pacific railway acts was made possible by the absence of southern congressmen and senators who had opposed the measures in the 1850s . -other important legislation involved two measures to raise revenues for the federal government : tariffs -lrb- a policy with long precedent -rrb- , and a new federal income tax . in 1861 , lincoln signed the second and third morrill tariff , the first having become law under james buchanan . also in 1861 , lincoln signed the revenue act of 1861 , creating the first u.s. income tax . this created a flat tax of 3 percent on incomes above $ 800 -lrb- $ in current dollar terms -rrb- , which was later changed by the revenue act of 1862 to a progressive rate structure . -lincoln also presided over the expansion of the federal government 's economic influence in several other areas . the creation of the system of national banks by the national banking act provided a strong financial network in the country . it also established a national currency . in 1862 , congress created , with lincoln 's approval , the department of agriculture . in 1862 , lincoln sent a senior general , john pope , to put down the `` sioux uprising '' in minnesota . presented with 303 execution warrants for convicted santee dakota who were accused of killing innocent farmers , lincoln conducted his own personal review of each of these warrants , eventually approving 39 for execution -lrb- one was later reprieved -rrb- . president lincoln had planned to reform federal indian policy . -in the wake of grant 's casualties in his campaign against lee , lincoln had considered yet another executive call for a military draft , but it was never issued . in response to rumors of one , however , the editors of the `` new york world '' and the `` journal of commerce '' published a false draft proclamation which created an opportunity for the editors and others employed at the publications to corner the gold market . lincoln 's reaction was to send the strongest of messages to the media about such behavior ; he ordered the military to seize the two papers . the seizure lasted for two days . -lincoln is largely responsible for the institution of the thanksgiving holiday in the united states . before lincoln 's presidency , thanksgiving , while a regional holiday in new england since the 17th century , had been proclaimed by the federal government only sporadically and on irregular dates . the last such proclamation had been during james madison 's presidency 50 years before . in 1863 , lincoln declared the final thursday in november of that year to be a day of thanksgiving . in june 1864 , lincoln approved the yosemite grant enacted by congress , which provided unprecedented federal protection for the area now known as yosemite national park . -judicial appointments . -supreme court appointments . -lincoln 's declared philosophy on court nominations was that `` we can not ask a man what he will do , and if we should , and he should answer us , we should despise him for it . therefore we must take a man whose opinions are known . '' lincoln made five appointments to the united states supreme court . noah haynes swayne , nominated january 21 , 1862 and appointed january 24 , 1862 , was chosen as an anti-slavery lawyer who was committed to the union . samuel freeman miller , nominated and appointed on july 16 , 1862 , supported lincoln in the 1860 election and was an avowed abolitionist . david davis , lincoln 's campaign manager in 1860 , nominated december 1 , 1862 and appointed december 8 , 1862 , had also served as a judge in lincoln 's illinois court circuit . stephen johnson field , a previous california supreme court justice , was nominated march 6 , 1863 and appointed march 10 , 1863 , and provided geographic balance , as well as political balance to the court as a democrat . finally , lincoln 's treasury secretary , salmon p. chase , was nominated as chief justice , and appointed the same day , on december 6 , 1864 . lincoln believed chase was an able jurist , would support reconstruction legislation , and that his appointment united the republican party . -other judicial appointments . -lincoln appointed 32 federal judges , including four associate justices and one chief justice to the supreme court of the united states , and 27 judges to the united states district courts . lincoln appointed no judges to the united states circuit courts during his time in office . -states admitted to the union . -west virginia , admitted to the union june 20 , 1863 , contained the former north-westernmost counties of virginia that seceded from virginia after that commonwealth declared its secession from the union . as a condition for its admission , west virginia 's constitution was required to provide for the gradual abolition of slavery . nevada , which became the third state in the far-west of the continent , was admitted as a free state on october 31 , 1864 . -assassination and funeral . -john wilkes booth was a well-known actor and a confederate spy from maryland ; though he never joined the confederate army , he had contacts with the confederate secret service . in 1864 , booth formulated a plan -lrb- very similar to one of thomas n. conrad previously authorized by the confederacy -rrb- to kidnap lincoln in exchange for the release of confederate prisoners . after attending an april 11 , 1865 , speech in which lincoln promoted voting rights for blacks , an incensed booth changed his plans and became determined to assassinate the president . learning that the president and grant would be attending ford 's theatre , booth formulated a plan with co-conspirators to assassinate lincoln and grant at the theater , as well as vice president johnson and secretary of state seward at their homes . without his main bodyguard , ward hill lamon , lincoln left to attend the play `` our american cousin '' on april 14 . at the last minute , grant decided to go to new jersey to visit his children instead of attending the play . -lincoln 's bodyguard , john parker , left ford 's theater during intermission to drink at the saloon next door . the now unguarded president sat in his state box in the balcony . seizing the opportunity , booth crept up from behind and at about 10:13 pm , aimed at the back of lincoln 's head and fired at point-blank range , mortally wounding the president . major henry rathbone momentarily grappled with booth , but booth stabbed him and escaped . -after being on the run for 12 days , booth was tracked down and found on a farm in virginia , some south of washington . after refusing to surrender to union troops , booth was killed by sergeant boston corbett on april 26 . -doctor charles leale , an army surgeon , found the president unresponsive , barely breathing and with no detectable pulse . having determined that the president had been shot in the head , and not stabbed in the shoulder as originally thought , he made an attempt to clear the blood clot , after which the president began to breathe more naturally . the dying president was taken across the street to petersen house . after remaining in a coma for nine hours , lincoln died at 7:22 am on april 15 . secretary of war stanton saluted and said , `` now he belongs to the ages . '' -lincoln 's flag-enfolded body was then escorted in the rain to the white house by bareheaded union officers , while the city 's church bells rang . president johnson was sworn in at 10:00 am , less than 3 hours after lincoln 's death . the late president lay in state in the east room , and then in the capitol rotunda from april 19 through april 21 . for his final journey with his son willie , both caskets were transported in the executive coach `` united states '' and for three weeks the `` lincoln special '' funeral train decorated in black bunting bore lincoln 's remains on a slow circuitous waypoint journey from washington d.c. to springfield , illinois , stopping at many cities across the north for large-scale memorials attended by hundreds of thousands , as well as many people who gathered in informal trackside tributes with bands , bonfires , and hymn singing or silent reverence with hat in hand as the railway procession slowly passed by . poet walt whitman composed `` when lilacs last in the dooryard bloom 'd '' to eulogize lincoln , one of four poems he wrote about the assassinated president . historians have emphasized the widespread shock and sorrow , but also noted that some lincoln haters cheered when they heard the news . african-americans were especially moved ; they had lost ` their moses ' . in a larger sense , the outpouring of grief and anguish was in response to the deaths of so many men in the war that had just ended . -religious and philosophical beliefs . -as a young man , lincoln was a religious skeptic , or , in the words of a biographer , an iconoclast . later in life , lincoln 's frequent use of religious imagery and language might have reflected his own personal beliefs or might have been a device to appeal to his audiences , who were mostly evangelical protestants . he never joined a church , although he frequently attended with his wife . however , he was deeply familiar with the bible , and he both quoted and praised it . he was private about his beliefs and respected the beliefs of others . lincoln never made a clear profession of christian beliefs . however he did believe in an all-powerful god that shaped events and , by 1865 , was expressing those beliefs in major speeches . -in the 1840s , lincoln subscribed to the doctrine of necessity , a belief that asserted the human mind was controlled by some higher power . in the 1850s , lincoln believed in `` providence '' in a general way , and rarely used the language or imagery of the evangelicals ; he regarded the republicanism of the founding fathers with an almost religious reverence . when he suffered the death of his son edward , lincoln more frequently expressed a need to depend on god . the death of his son willie in february 1862 may have caused lincoln to look toward religion for answers and solace . after willie 's death , lincoln considered why , from a divine standpoint , the severity of the war was necessary . he wrote at this time that god `` could have either saved or destroyed the union without a human contest . yet the contest began . and having begun he could give the final victory to either side any day . yet the contest proceeds . '' on the day lincoln was assassinated , he reportedly told his wife he desired to visit the holy land . -several claims abound that lincoln 's health was declining before the assassination . these are often based on photographs appearing to show weight loss and muscle wasting . one such claim is that he suffered from a rare genetic disorder men2b , which manifests with a medullary thyroid carcinoma , mucosal neuromas and a marfinoid appearance . others simply claim he had marfan 's syndrome , based on his tall appearance with spindly fingers , and the association of possible aortic regurgitation , which can cause bobbing of the head -lrb- demusset 's sign -rrb- based on blurring of lincoln 's head in photographs , which back then had a long exposure time . -dna analysis is so far being refused by the grand army of the republic museum in philadelphia . -historical reputation . -in surveys of u.s. scholars ranking presidents conducted since the 1940s , lincoln is consistently ranked in the top three , often as number one . a 2004 study found that scholars in the fields of history and politics ranked lincoln number one , while legal scholars placed him second after washington . in presidential ranking polls conducted in the united states since 1948 , lincoln has been rated at the very top in the majority of polls : schlesinger 1948 , schlesinger 1962 , 1982 murray blessing survey , `` chicago tribune '' 1982 poll , schlesinger 1996 , cspan 1996 , ridings-mciver 1996 , `` time '' 2008 , and cspan 2009 . generally , the top three presidents are rated as 1 . lincoln ; 2 . george washington ; and 3 . franklin d. roosevelt , although lincoln and washington , and washington and roosevelt , are occasionally reversed . -president lincoln 's assassination increased his status to the point of making him a national martyr . lincoln was viewed by abolitionists as a champion for human liberty . republicans linked lincoln 's name to their party . many , though not all , in the south considered lincoln as a man of outstanding ability . -schwartz argues that lincoln 's reputation grew slowly in the late 19th century until the progressive era -lrb- 1900 -- 1920s -rrb- when he emerged as one of the most venerated heroes in american history , with even white southerners in agreement . the high point came in 1922 with the dedication of the lincoln memorial on the mall in washington . in the new deal era liberals honored lincoln not so much as the self-made man or the great war president , but as the advocate of the common man who doubtless would have supported the welfare state . in the cold war years , lincoln 's image shifted to emphasize the symbol of freedom who brought hope to those oppressed by communist regimes . -by the 1970s lincoln had become a hero to political conservatives for his intense nationalism , support for business , his insistence on stopping the spread of human bondage , his acting in terms of lockean and burkean principles on behalf of both liberty and tradition , and his devotion to the principles of the founding fathers . as a whig activist , lincoln was a spokesman for business interests , favoring high tariffs , banks , internal improvements , and railroads in opposition to the agrarian democrats . william c. harris found that lincoln 's `` reverence for the founding fathers , the constitution , the laws under it , and the preservation of the republic and its institutions undergirded and strengthened his conservatism '' . james g. randall emphasizes his tolerance and especially his moderation `` in his preference for orderly progress , his distrust of dangerous agitation , and his reluctance toward ill digested schemes of reform '' . randall concludes that , `` he was conservative in his complete avoidance of that type of so-called ` radicalism ' which involved abuse of the south , hatred for the slaveholder , thirst for vengeance , partisan plotting , and ungenerous demands that southern institutions be transformed overnight by outsiders . '' -by the late 1960s , liberals , such as historian lerone bennett , were having second thoughts , especially regarding lincoln 's views on racial issues . bennett won wide attention when he called lincoln a white supremacist in 1968 . he noted that lincoln used ethnic slurs , told jokes that ridiculed blacks , insisted he opposed social equality , and proposed sending freed slaves to another country . defenders , such as authors dirck and cashin , retorted that he was not as bad as most politicians of his day ; and that he was a `` moral visionary '' who deftly advanced the abolitionist cause , as fast as politically possible . the emphasis shifted away from lincoln-the-emancipator to an argument that blacks had freed themselves from slavery , or at least were responsible for pressuring the government on emancipation . historian barry schwartz wrote in 2009 that lincoln 's image suffered `` erosion , fading prestige , benign ridicule '' in the late 20th century . on the other hand , donald opined in his 1996 biography that lincoln was distinctly endowed with the personality trait of negative capability , defined by the poet john keats and attributed to extraordinary leaders who were `` content in the midst of uncertainties and doubts , and not compelled toward fact or reason '' . -today 's u.s. president , however , seems to be promoting a sympathetic resurgence for his predecessor , lincoln . indeed , president obama , has insisted on using lincoln 's bible for his swearing in of office at both his inaugurations . -lincoln has often been portrayed by hollywood , almost always in a flattering light . -memory and memorials . -lincoln 's portrait appears on two denominations of united states currency , the penny and the $ 5 bill . his likeness also appears on many postage stamps and he has been memorialized in many town , city , and county names , including the capital of nebraska . -the most famous and most visited memorials are the lincoln memorial in washington , d.c. ; lincoln 's sculpture on mount rushmore ; ford 's theatre and petersen house -lrb- where he died -rrb- in washington and the abraham lincoln presidential library and museum , located in springfield , illinois , not far from lincoln 's home and his tomb . -there was also the great moments with mr. lincoln exhibit in disneyland , and the hall of presidents at walt disney world , which had to do with walt disney admiring lincoln ever since he was a little boy . -barry schwartz , a sociologist who has examined america 's cultural memory , argues that in the 1930s and 1940s , the memory of abraham lincoln was practically sacred and provided the nation with `` a moral symbol inspiring and guiding american life '' . during the great depression , he argues , lincoln served `` as a means for seeing the world 's disappointments , for making its sufferings not so much explicable as meaningful '' . franklin d. roosevelt , preparing america for war , used the words of the civil war president to clarify the threat posed by germany and japan . americans asked , `` what would lincoln do ? '' however , schwartz also finds that since world war ii , lincoln 's symbolic power has lost relevance , and this `` fading hero is symptomatic of fading confidence in national greatness '' . he suggested that postmodernism and multiculturalism have diluted greatness as a concept . -teaching alexander the great gave aristotle many opportunities and an abundance of supplies . he established a library in the lyceum which aided in the production of many of his hundreds of books . the fact that aristotle was a pupil of plato contributed to his former views of platonism , but , following plato 's death , aristotle immersed himself in empirical studies and shifted from platonism to empiricism . he believed all peoples ' concepts and all of their knowledge was ultimately based on perception . aristotle 's views on natural sciences represent the groundwork underlying many of his works . -aristotle 's views on physical science profoundly shaped medieval scholarship . their influence extended into the renaissance and were not replaced systematically until the enlightenment and theories such as classical mechanics . some of aristotle 's zoological observations , such as on the hectocotyl -lrb- reproductive -rrb- arm of the octopus , were not confirmed or refuted until the 19th century . his works contain the earliest known formal study of logic , which was incorporated in the late 19th century into modern formal logic . -in metaphysics , aristotelianism profoundly influenced judeo-islamic philosophical and theological thought during the middle ages and continues to influence christian theology , especially the scholastic tradition of the catholic church . aristotle was well known among medieval muslim intellectuals and revered as `` the first teacher '' -lrb- -rrb- . -his ethics , though always influential , gained renewed interest with the modern advent of virtue ethics . all aspects of aristotle 's philosophy continue to be the object of active academic study today . though aristotle wrote many elegant treatises and dialogues -- cicero described his literary style as `` a river of gold '' -- it is thought that only around a third of his original output has survived . -aristotle , whose name means `` the best purpose '' , was born in 384 bc in stagira , chalcidice , about 55 km -lrb- 34 miles -rrb- east of modern-day thessaloniki . his father nicomachus was the personal physician to king amyntas of macedon . although there is little information on aristotle 's childhood , he probably spent some time within the macedonian palace , making his first connections with the macedonian monarchy . -at about the age of eighteen , aristotle moved to athens to continue his education at plato 's academy . he remained there for nearly twenty years before leaving athens in 348/47 bc . the traditional story about his departure records that he was disappointed with the academy 's direction after control passed to plato 's nephew speusippus , although it is possible that he feared anti-macedonian sentiments and left before plato died . -aristotle then accompanied xenocrates to the court of his friend hermias of atarneus in asia minor . there , he traveled with theophrastus to the island of lesbos , where together they researched the botany and zoology of the island . aristotle married pythias , either hermias 's adoptive daughter or niece . she bore him a daughter , whom they also named pythias . soon after hermias ' death , aristotle was invited by philip ii of macedon to become the tutor to his son alexander in 343 bc . -aristotle was appointed as the head of the royal academy of macedon . during that time he gave lessons not only to alexander , but also to two other future kings : ptolemy and cassander . aristotle encouraged alexander toward eastern conquest and his attitude towards persia was unabashedly ethnocentric . in one famous example , he counsels alexander to be `` a leader to the greeks and a despot to the barbarians , to look after the former as after friends and relatives , and to deal with the latter as with beasts or plants '' . -by 335 bc , artistotle had returned to athens , establishing his own school there known as the lyceum . aristotle conducted courses at the school for the next twelve years . while in athens , his wife pythias died and aristotle became involved with herpyllis of stagira , who bore him a son whom he named after his father , nicomachus . according to the suda , he also had an eromenos , palaephatus of abydus . -this period in athens , between 335 and 323 bc , is when aristotle is believed to have composed many of his works . he wrote many dialogues of which only fragments have survived . those works that have survived are in treatise form and were not , for the most part , intended for widespread publication ; they are generally thought to be lecture aids for his students . his most important treatises include `` physics '' , `` metaphysics '' , `` nicomachean ethics '' , `` politics '' , `` de anima '' -lrb- `` on the soul '' -rrb- and `` poetics '' . -aristotle not only studied almost every subject possible at the time , but made significant contributions to most of them . in physical science , aristotle studied anatomy , astronomy , embryology , geography , geology , meteorology , physics and zoology . in philosophy , he wrote on aesthetics , ethics , government , metaphysics , politics , economics , psychology , rhetoric and theology . he also studied education , foreign customs , literature and poetry . his combined works constitute a virtual encyclopedia of greek knowledge . -near the end of his life , alexander and aristotle became estranged over alexander 's relationship with persia and persians . a widespread tradition in antiquity suspected aristotle of playing a role in alexander 's death , but there is little evidence . -following alexander 's death , anti-macedonian sentiment in athens was rekindled . in 322 bc , eurymedon the hierophant denounced aristotle for not holding the gods in honor , prompting him to flee to his mother 's family estate in chalcis , explaining : `` i will not allow the athenians to sin twice against philosophy `` a reference to athens 's prior trial and execution of socrates . he died in euboea of natural causes later that same year , having named his student antipater as his chief executor and leaving a will in which he asked to be buried next to his wife . -charles walston argues that the tomb of aristotle is located on the sacred way between chalcis and eretria and to have contained two styluses , a pen , a signet-ring and some terra-cottas as well as what is supposed to be the earthly remains of aristotle in the form of some skull fragments . -in general , the details of the life of aristotle are not well-established . the biographies of aristotle written in ancient times are often speculative and historians only agree on a few salient points . -with the `` prior analytics '' , aristotle is credited with the earliest study of formal logic , and his conception of it was the dominant form of western logic until 19th century advances in mathematical logic . kant stated in the `` critique of pure reason '' that aristotle 's theory of logic completely accounted for the core of deductive inference . -aristotle `` says that ` on the subject of reasoning ' he ` had nothing else on an earlier date to speak of ' '' . however , plato reports that syntax was devised before him , by prodicus of ceos , who was concerned by the correct use of words . logic seems to have emerged from dialectics ; the earlier philosophers made frequent use of concepts like `` reductio ad absurdum '' in their discussions , but never truly understood the logical implications . even plato had difficulties with logic ; although he had a reasonable conception of a deductive system , he could never actually construct one , thus he relied instead on his dialectic . -plato believed that deduction would simply follow from premises , hence he focused on maintaining solid premises so that the conclusion would logically follow . consequently , plato realized that a method for obtaining conclusions would be most beneficial . he never succeeded in devising such a method , but his best attempt was published in his book `` sophist '' , where he introduced his division method . -analytics and the `` organon '' . -what we today call `` aristotelian logic '' , aristotle himself would have labeled `` analytics '' . the term `` logic '' he reserved to mean `` dialectics '' . most of aristotle 's work is probably not in its original form , because it was most likely edited by students and later lecturers . the logical works of aristotle were compiled into six books in about the early 1st century ce : -the order of the books -lrb- or the teachings from which they are composed -rrb- is not certain , but this list was derived from analysis of aristotle 's writings . it goes from the basics , the analysis of simple terms in the `` categories , '' the analysis of propositions and their elementary relations in `` on interpretation '' , to the study of more complex forms , namely , syllogisms -lrb- in the `` analytics '' -rrb- and dialectics -lrb- in the `` topics '' and `` sophistical refutations '' -rrb- . the first three treatises form the core of the logical theory `` stricto sensu '' : the grammar of the language of logic and the correct rules of reasoning . there is one volume of aristotle 's concerning logic not found in the `` organon '' , namely the fourth book of `` metaphysics . '' -aristotle 's epistemology . -like his teacher plato , aristotle 's philosophy aims at the universal . aristotle 's ontology , however , finds the universal in particular things , which he calls the essence of things , while in plato 's ontology , the universal exists apart from particular things , and is related to them as their prototype or exemplar . for aristotle , therefore , epistemology is based on the study of particular phenomena and rises to the knowledge of essences , while for plato epistemology begins with knowledge of universal forms -lrb- or ideas -rrb- and descends to knowledge of particular imitations of these . for aristotle , `` form '' still refers to the unconditional basis of phenomena but is `` instantiated '' in a particular substance -lrb- see `` universals and particulars '' , below -rrb- . in a certain sense , aristotle 's method is both inductive and deductive , while plato 's is essentially deductive from `` a priori '' principles . -in aristotle 's terminology , `` natural philosophy '' is a branch of philosophy examining the phenomena of the natural world , and includes fields that would be regarded today as physics , biology and other natural sciences . in modern times , the scope of `` philosophy '' has become limited to more generic or abstract inquiries , such as ethics and metaphysics , in which logic plays a major role . today 's philosophy tends to exclude empirical study of the natural world by means of the scientific method . in contrast , aristotle 's philosophical endeavors encompassed virtually all facets of intellectual inquiry . -in the larger sense of the word , aristotle makes philosophy coextensive with reasoning , which he also would describe as `` science '' . note , however , that his use of the term `` science '' carries a different meaning than that covered by the term `` scientific method '' . for aristotle , `` all science -lrb- `` dianoia '' -rrb- is either practical , poetical or theoretical '' -lrb- `` metaphysics '' 1025b25 -rrb- . by practical science , he means ethics and politics ; by poetical science , he means the study of poetry and the other fine arts ; by theoretical science , he means physics , mathematics and metaphysics . -if logic -lrb- or `` analytics '' -rrb- is regarded as a study preliminary to philosophy , the divisions of aristotelian philosophy would consist of : -lrb- 1 -rrb- logic ; -lrb- 2 -rrb- theoretical philosophy , including metaphysics , physics and mathematics ; -lrb- 3 -rrb- practical philosophy and -lrb- 4 -rrb- poetical philosophy . -in the period between his two stays in athens , between his times at the academy and the lyceum , aristotle conducted most of the scientific thinking and research for which he is renowned today . in fact , most of aristotle 's life was devoted to the study of the objects of natural science . aristotle 's metaphysics contains observations on the nature of numbers but he made no original contributions to mathematics . he did , however , perform original research in the natural sciences , e.g. , botany , zoology , physics , astronomy , chemistry , meteorology , and several other sciences . -aristotle 's writings on science are largely qualitative , as opposed to quantitative . beginning in the 16th century , scientists began applying mathematics to the physical sciences , and aristotle 's work in this area was deemed hopelessly inadequate . his failings were largely due to the absence of concepts like mass , velocity , force and temperature . he had a conception of speed and temperature , but no quantitative understanding of them , which was partly due to the absence of basic experimental devices , like clocks and thermometers . -his writings provide an account of many scientific observations , a mixture of precocious accuracy and curious errors . for example , in his `` history of animals '' he claimed that human males have more teeth than females . in a similar vein , john philoponus , and later galileo , showed by simple experiments that aristotle 's theory that a heavier object falls faster than a lighter object is incorrect . on the other hand , aristotle refuted democritus 's claim that the milky way was made up of `` those stars which are shaded by the earth from the sun 's rays , '' pointing out -lrb- correctly , even if such reasoning was bound to be dismissed for a long time -rrb- that , given `` current astronomical demonstrations '' that `` the size of the sun is greater than that of the earth and the distance of the stars from the earth many times greater than that of the sun , then ... the sun shines on all the stars and the earth screens none of them . '' -in places , aristotle goes too far in deriving ` laws of the universe ' from simple observation and over-stretched reason . today 's scientific method assumes that such thinking without sufficient facts is ineffective , and that discerning the validity of one 's hypothesis requires far more rigorous experimentation than that which aristotle used to support his laws . -aristotle also had some scientific blind spots . he posited a geocentric cosmology that we may discern in selections of the `` metaphysics '' , which was widely accepted up until the 16th century . from the 3rd century to the 16th century , the dominant view held that the earth was the rotational center of the universe . -because he was perhaps the philosopher most respected by european thinkers during and after the renaissance , these thinkers often took aristotle 's erroneous positions as given , which held back science in this epoch . however , aristotle 's scientific shortcomings should not mislead one into forgetting his great advances in the many scientific fields . for instance , he founded logic as a formal science and created foundations to biology that were not superseded for two millennia . moreover , he introduced the fundamental notion that nature is composed of things that change and that studying such changes can provide useful knowledge of underlying constants . -as quoted from charles lyell 's `` principles of geology '' : -five elements . -aristotle proposed a fifth element , aether , in addition to the four proposed earlier by empedocles . -each of the four earthly elements has its natural place . all that is earthly tends toward the center of the universe , i.e. , the center of the earth . water tends toward a sphere surrounding the center . air tends toward a sphere surrounding the water sphere . fire tends toward the lunar sphere -lrb- in which the moon orbits -rrb- . when elements are moved out of their natural place , they naturally move back towards it . this is `` natural motion '' -- motion requiring no extrinsic cause . so , for example , in water , earthy bodies sink while air bubbles rise up ; in air , rain falls and flame rises . outside all the other spheres , the heavenly , fifth element , manifested in the stars and planets , moves in the perfection of circles . -aristotle defined motion as the actuality of a potentiality `` as such '' . aquinas suggested that the passage be understood literally ; that motion can indeed be understood as the active fulfillment of a potential , as a transition toward a potentially possible state . because actuality and potentiality are normally opposites in aristotle , other commentators either suggest that the wording which has come down to us is erroneous , or that the addition of the `` as such '' to the definition is critical to understanding it . -causality , the four causes . -aristotle suggested that the reason for anything coming about can be attributed to four different types of simultaneously active causal factors : -additionally , things can be causes of one another , causing each other reciprocally , as hard work causes fitness and vice versa , although not in the same way or function , the one is as the beginning of change , the other as the goal . -lrb- thus aristotle first suggested a reciprocal or circular causality as a relation of mutual dependence or influence of cause upon effect -rrb- . moreover , aristotle indicated that the same thing can be the cause of contrary effects ; its presence and absence may result in different outcomes . simply it is the goal or purpose that brings about an event . our two dominoes require someone or something to intentionally knock over the first domino , because it can not fall of its own accord . -aristotle marked two modes of causation : proper -lrb- prior -rrb- causation and accidental -lrb- chance -rrb- causation . all causes , proper and incidental , can be spoken as potential or as actual , particular or generic . the same language refers to the effects of causes , so that generic effects assigned to generic causes , particular effects to particular causes , operating causes to actual effects . essentially , causality does not suggest a temporal relation between the cause and the effect . -aristotle held more accurate theories on some optical concepts than other philosophers of his day . the second oldest written evidence of a camera obscura -lrb- after mozi c. 400 bc -rrb- can be found in aristotle 's documentation of such a device in 350 bc in `` problemata '' . aristotle 's apparatus contained a dark chamber that had a single small hole , or aperture , to allow for sunlight to enter . aristotle used the device to make observations of the sun and noted that no matter what shape the hole was , the sun would still be correctly displayed as a round object . in modern cameras , this is analogous to the diaphragm . aristotle also made the observation that when the distance between the aperture and the surface with the image increased , the image was magnified . -chance and spontaneity . -according to aristotle , spontaneity and chance are causes of some things , distinguishable from other types of cause . chance as an incidental cause lies in the realm of accidental things . it is `` from what is spontaneous '' -lrb- but note that what is spontaneous does not come from chance -rrb- . for a better understanding of aristotle 's conception of `` chance '' it might be better to think of `` coincidence '' : something takes place by chance if a person sets out with the intent of having one thing take place , but with the result of another thing -lrb- not intended -rrb- taking place . -for example : a person seeks donations . that person may find another person willing to donate a substantial sum . however , if the person seeking the donations met the person donating , not for the purpose of collecting donations , but for some other purpose , aristotle would call the collecting of the donation by that particular donator a result of chance . it must be unusual that something happens by chance . in other words , if something happens all or most of the time , we can not say that it is by chance . -there is also more specific kind of chance , which aristotle names `` luck '' , that can only apply to human beings , because it is in the sphere of moral actions . according to aristotle , luck must involve choice -lrb- and thus deliberation -rrb- , and only humans are capable of deliberation and choice . `` what is not capable of action can not do anything by chance '' . -aristotle defines metaphysics as `` the knowledge of immaterial being , '' or of `` being in the highest degree of abstraction . '' he refers to metaphysics as `` first philosophy '' , as well as `` the theologic science . '' -substance , potentiality and actuality . -aristotle examines the concepts of substance and essence -lrb- `` ousia '' -rrb- in his `` metaphysics '' -lrb- book vii -rrb- , and he concludes that a particular substance is a combination of both matter and form . in book viii , he distinguishes the matter of the substance as the substratum , or the stuff of which it is composed . for example , the matter of a house is the bricks , stones , timbers etc. , or whatever constitutes the `` potential '' house , while the form of the substance is the `` actual '' house , namely ` covering for bodies and chattels ' or any other differentia -lrb- see also predicables -rrb- that let us define something as a house . the formula that gives the components is the account of the matter , and the formula that gives the differentia is the account of the form . -with regard to the change -lrb- `` kinesis '' -rrb- and its causes now , as he defines in his physics and on generation and corruption 319b -- 320a , he distinguishes the coming to be from : -the coming to be is a change where nothing persists of which the resultant is a property . in that particular change he introduces the concept of potentiality -lrb- `` dynamis '' -rrb- and actuality -lrb- `` entelecheia '' -rrb- in association with the matter and the form . -referring to potentiality , this is what a thing is capable of doing , or being acted upon , if the conditions are right and it is not prevented by something else . for example , the seed of a plant in the soil is potentially -lrb- `` dynamei '' -rrb- plant , and if is not prevented by something , it will become a plant . potentially beings can either ` act ' -lrb- `` poiein '' -rrb- or ` be acted upon ' -lrb- `` paschein '' -rrb- , which can be either innate or learned . for example , the eyes possess the potentiality of sight -lrb- innate -- being acted upon -rrb- , while the capability of playing the flute can be possessed by learning -lrb- exercise -- acting -rrb- . -actuality is the fulfillment of the end of the potentiality . because the end -lrb- `` telos '' -rrb- is the principle of every change , and for the sake of the end exists potentiality , therefore actuality is the end . referring then to our previous example , we could say that an actuality is when a plant does one of the activities that plants do . -`` for that for the sake of which a thing is , is its principle , and the becoming is for the sake of the end ; and the actuality is the end , and it is for the sake of this that the potentiality is acquired . for animals do not see in order that they may have sight , but they have sight that they may see . '' -in summary , the matter used to make a house has potentiality to be a house and both the activity of building and the form of the final house are actualities , which is also a final cause or end . then aristotle proceeds and concludes that the actuality is prior to potentiality in formula , in time and in substantiality . -with this definition of the particular substance -lrb- i.e. , matter and form -rrb- , aristotle tries to solve the problem of the unity of the beings , for example , `` what is it that makes a man one '' ? since , according to plato there are two ideas : animal and biped , how then is man a unity ? however , according to aristotle , the potential being -lrb- matter -rrb- and the actual one -lrb- form -rrb- are one and the same thing . -universals and particulars . -aristotle 's predecessor , plato , argued that all things have a universal form , which could be either a property , or a relation to other things . when we look at an apple , for example , we see an apple , and we can also analyze a form of an apple . in this distinction , there is a particular apple and a universal form of an apple . moreover , we can place an apple next to a book , so that we can speak of both the book and apple as being next to each other . -plato argued that there are some universal forms that are not a part of particular things . for example , it is possible that there is no particular good in existence , but `` good '' is still a proper universal form . bertrand russell is a 20th-century philosopher who agreed with plato on the existence of `` uninstantiated universals '' . -aristotle disagreed with plato on this point , arguing that all universals are instantiated . aristotle argued that there are no universals that are unattached to existing things . according to aristotle , if a universal exists , either as a particular or a relation , then there must have been , must be currently , or must be in the future , something on which the universal can be predicated . consequently , according to aristotle , if it is not the case that some universal can be predicated to an object that exists at some period of time , then it does not exist . -in addition , aristotle disagreed with plato about the location of universals . as plato spoke of the world of the forms , a location where all universal forms subsist , aristotle maintained that universals exist within each thing on which each universal is predicated . so , according to aristotle , the form of apple exists within each apple , rather than in the world of the forms . -biology and medicine . -in aristotelian science , especially in biology , things he saw himself have stood the test of time better than his retelling of the reports of others , which contain error and superstition . he dissected animals but not humans ; his ideas on how the human body works have been almost entirely superseded . -empirical research program . -aristotle is the earliest natural historian whose work has survived in some detail . aristotle certainly did research on the natural history of lesbos , and the surrounding seas and neighbouring areas . the works that reflect this research , such as `` history of animals '' , `` generation of animals '' , and `` parts of animals '' , contain some observations and interpretations , along with sundry myths and mistakes . the most striking passages are about the sea-life visible from observation on lesbos and available from the catches of fishermen . his observations on catfish , electric fish -lrb- `` torpedo '' -rrb- and angler-fish are detailed , as is his writing on cephalopods , namely , `` octopus '' , `` sepia '' -lrb- cuttlefish -rrb- and the paper nautilus -lrb- `` argonauta argo '' -rrb- . his description of the hectocotyl arm , used in sexual reproduction , was widely disbelieved until its rediscovery in the 19th century . he separated the aquatic mammals from fish , and knew that sharks and rays were part of the group he called selachē -lrb- selachians -rrb- . -another good example of his methods comes from the `` generation of animals '' in which aristotle describes breaking open fertilized chicken eggs at intervals to observe when visible organs were generated . -he gave accurate descriptions of ruminants ' four-chambered fore-stomachs , and of the ovoviviparous embryological development of the hound shark `` mustelus mustelus '' . -classification of living things . -aristotle distinguished about 500 species of birds , mammals and fishes . his classification of living things contains some elements which still existed in the 19th century . what the modern zoologist would call vertebrates and invertebrates , aristotle called ` animals with blood ' and ` animals without blood ' -lrb- he did not know that complex invertebrates do make use of hemoglobin , but of a different kind from vertebrates -rrb- . animals with blood were divided into live-bearing -lrb- mammals -rrb- , and egg-bearing -lrb- birds and fish -rrb- . invertebrates -lrb- ` animals without blood ' -rrb- are insects , crustacea -lrb- divided into non-shelled -- cephalopods -- and shelled -rrb- and testacea -lrb- molluscs -rrb- . in some respects , this incomplete classification is better than that of linnaeus , who crowded the invertebrata together into two groups , insecta and vermes -lrb- worms -rrb- . -aristotle believed that intellectual purposes , i.e. , final causes , guided all natural processes . such a teleological view gave aristotle cause to justify his observed data as an expression of formal design . noting that `` no animal has , at the same time , both tusks and horns , '' and `` a single-hooved animal with two horns i have never seen , '' aristotle suggested that nature , giving no animal both horns and tusks , was staving off vanity , and giving creatures faculties only to such a degree as they are necessary . noting that ruminants had multiple stomachs and weak teeth , he supposed the first was to compensate for the latter , with nature trying to preserve a type of balance . -in a similar fashion , aristotle believed that creatures were arranged in a graded scale of perfection rising from plants on up to man , the `` scala naturae '' . his system had eleven grades , arranged according `` to the degree to which they are infected with potentiality '' , expressed in their form at birth . the highest animals laid warm and wet creatures alive , the lowest bore theirs cold , dry , and in thick eggs . -aristotle also held that the level of a creature 's perfection was reflected in its form , but not preordained by that form . ideas like this , and his ideas about souls , are not regarded as science at all in modern times . -he placed emphasis on the type -lrb- s -rrb- of soul an organism possessed , asserting that plants possess a vegetative soul , responsible for reproduction and growth , animals a vegetative and a sensitive soul , responsible for mobility and sensation , and humans a vegetative , a sensitive , and a rational soul , capable of thought and reflection . -aristotle , in contrast to earlier philosophers , but in accordance with the egyptians , placed the rational soul in the heart , rather than the brain . notable is aristotle 's division of sensation and thought , which generally went against previous philosophers , with the exception of alcmaeon . -successor : theophrastus . -aristotle 's successor at the lyceum , theophrastus , wrote a series of books on botany -- the `` history of plants '' -- which survived as the most important contribution of antiquity to botany , even into the middle ages . many of theophrastus ' names survive into modern times , such as `` carpos '' for fruit , and `` pericarpion '' for seed vessel . -rather than focus on formal causes , as aristotle did , theophrastus suggested a mechanistic scheme , drawing analogies between natural and artificial processes , and relying on aristotle 's concept of the efficient cause . theophrastus also recognized the role of sex in the reproduction of some higher plants , though this last discovery was lost in later ages . -influence on hellenistic medicine . -after theophrastus , the lyceum failed to produce any original work . though interest in aristotle 's ideas survived , they were generally taken unquestioningly . it is not until the age of alexandria under the ptolemies that advances in biology can be again found . -the first medical teacher at alexandria , herophilus of chalcedon , corrected aristotle , placing intelligence in the brain , and connected the nervous system to motion and sensation . herophilus also distinguished between veins and arteries , noting that the latter pulse while the former do not . though a few ancient atomists such as lucretius challenged the teleological viewpoint of aristotelian ideas about life , teleology -lrb- and after the rise of christianity , natural theology -rrb- would remain central to biological thought essentially until the 18th and 19th centuries . ernst mayr claimed that there was `` nothing of any real consequence in biology after lucretius and galen until the renaissance . '' aristotle 's ideas of natural history and medicine survived , but they were generally taken unquestioningly . -aristotle 's psychology , given in his treatise on the soul -lrb- `` peri psyche '' , often known by its latin title `` de anima '' -rrb- , posits three kinds of soul -lrb- `` psyches '' -rrb- : the vegetative soul , the sensitive soul , and the rational soul . humans have a rational soul . this kind of soul is capable of the same powers as the other kinds : like the vegetative soul it can grow and nourish itself ; like the sensitive soul it can experience sensations and move locally . the unique part of the human , rational soul is its ability to receive forms of other things and compare them . -for aristotle , the soul -lrb- `` psyche '' -rrb- was a simpler concept than it is for us today . by soul he simply meant the form of a living being . because all beings are composites of form and matter , the form of living beings is that which endows them with what is specific to living beings , e.g. the ability to initiate movement -lrb- or in the case of plants , growth and chemical transformations , which aristotle considers types of movement -rrb- . -according to aristotle , memory is the ability to hold a perceived experience in your mind and to have the ability to distinguish between the internal `` appearance '' and an occurrence in the past . in other words , a memory is a mental picture -lrb- phantasm -rrb- in which aristotle defines in `` de anima '' , as an appearance which is imprinted on the part of the body that forms a memory . aristotle believed an `` imprint '' becomes impressed on a semi-fluid bodily organ that undergoes several changes in order to make a memory . a memory occurs when a stimuli is too complex that the nervous system -lrb- semi-fluid bodily organ -rrb- can not receive all the impressions at once . these changes are the same as those involved in the operations of sensation , common sense , and thinking . the mental picture imprinted on the bodily organ is the final product of the entire process of sense perception . it does not matter if the experience was seen or heard , every experience ends up as a mental image in memory -aristotle uses the word `` memory '' for two basic abilities . first , the actual retaining of the experience in the mnemonic `` imprint '' that can develop from sensation . second , the intellectual anxiety that comes with the `` imprint '' due to being impressed at a particular time and processing specific contents . these abilities can be explained as memory is neither sensation nor thinking because is arises only after a lapse of time . therefore , memory is of the past , prediction is of the future , and sensation is of the present . the retrieval of our `` imprints '' can not be performed suddenly . a transitional channel is needed and located in our past experiences , both for our previous experience and present experience . -aristotle proposed that slow-witted people have good memory because the fluids in their brain do not wash away their memory organ used to imprint experiences and so the `` imprint '' can easily continue . however , they can not be too slow or the hardened surface of the organ will not receive new `` imprints '' . he believed the young and the old do not properly develop an `` imprint '' . young people undergo rapid changes as they develop , while the elderly 's organs are beginning to decay , thus stunting new `` imprints '' . likewise , people who are too quick-witted are similar to the young and the image can not be fixed because of the rapid changes of their organ . because intellectual functions are not involved in memory , memories belong to some animals too , but only those in which have perception of time . -because aristotle believes people receive all kinds of sense perceptions and people perceive them as images or `` imprints '' , people are continually weaving together new `` imprints '' of things they experience . in order to search for these `` imprints '' , people search the memory itself . within the memory , if one experience is offered instead of a specific memory , that person will reject this experience until they find what they are looking for . recollection occurs when one experience naturally follows another . if the chain of `` images '' is needed , one memory will stimulate the other . if the chain of `` images '' is not needed , but expected , then it will only stimulate the other memory in most instances . when people recall experiences , they stimulate certain previous experiences until they have stimulated the one that was needed . -recollection is the self-directed activity of retrieving the information stored in a memory `` imprint '' after some time has passed . retrieval of stored information is dependent on the scope of mnemonic capabilities of a being -lrb- human or animal -rrb- and the abilities the human or animal possesses . only humans will remember `` imprints '' of intellectual activity , such as numbers and words . animals that have perception of time will be able to retrieve memories of their past observations . remembering involves only perception of the things remembered and of the time passed . recollection of an `` imprint '' is when the present experiences a person remembers are similar with elements corresponding in character and arrangement of past sensory experiences . when an `` imprint '' is recalled , it may bring forth a large group of related `` imprints '' . -aristotle believed the chain of thought , which ends in recollection of certain `` imprints '' , was connected systematically in three sorts of relationships : similarity , contrast , and contiguity . these three laws make up his laws of association . aristotle believed that past experiences are hidden within our mind . a force operates to awaken the hidden material to bring up the actual experience . according to aristotle , association is the power innate in a mental state , which operates upon the unexpressed remains of former experiences , allowing them to rise and be recalled . -before understanding aristotle 's take on dreams , first his idea of sleep must be examined . aristotle gives an account of his explanation of sleep in `` on sleep and wakefulness '' . sleep takes place as a result of overuse of the senses or of digestion , so it is vital to the body , including the senses , so it can be revitalized . while a person is asleep , the critical activities , which include thinking , sensing , recalling and remembering , do not function as they do during wakefulness . since a person can not sense during sleep they can also not have a desire , which is the result of a sensation . however , the senses are able to work during sleep , albeit differently than when a person is awake because during sleep a person can still have sensory experiences . also , all of the senses are not inactive during sleep , only the ones that are weary . -theory of dreams . -dreams do not involve actually sensing a stimulus because , as discussed , the senses do not work as they normally do during sleep . in dreams , sensation is still involved , but in an altered manner than when awake . aristotle explains the phenomenon that occurs when a person stares at a moving stimulus such as the waves in a body of water . when they look away from that stimulus , the next thing they look at appears to be moving in a wave like motion . when a person perceives a stimulus and the stimulus is no longer the focus of their attention , it leaves an impression . when the body is awake and the senses are functioning properly , a person constantly encounters new stimuli to sense and so the impressions left from previously perceived stimuli become irrelevant . however , during sleep the impressions stimuli made throughout the day become noticed because there are not new sensory experiences to distract from these impressions that were made . so , dreams result from these lasting impressions . since impressions are all that are left and not the exact stimuli , dreams will not resemble the actual experience that occurred when awake . -during sleep , a person is in an altered state of mind . aristotle compares a sleeping person to a person who is overtaken by strong feelings toward a stimulus . for example , a person who has a strong infatuation with someone may begin to think they see that person everywhere because they are so overtaken by their feelings . when a person is asleep , their senses are not acting as they do when they are awake and this results in them thinking like a person who is influenced by strong feelings . since a person sleeping is in this suggestible state , they become easily deceived by what appears in their dreams . -when asleep , a person is unable to make judgments as they do when they are awake due to the senses not functioning normally during sleep , they are unable to help a person judge what is happening in their dream . this in turn leads the person to believe the dream is real . dreams may be absurd in nature but the senses are not able to discern whether they are real or not . so , the dreamer is left to accept the dream because they lack the choice to judge it . -one component of aristotle 's theory of dreams introduces ideas that are contradictory to previously held beliefs . he claimed that dreams are not foretelling and that they are not sent by a divine being . aristotle reasoned that instances in which dreams do resemble future events are happenstances not divinations . these ideas were contradictory to what had been believed about dreams , but at the time in which he introduced these ideas more thinkers were beginning to give naturalistic as opposed to supernatural explanations to phenomena . -aristotle also includes in his theory of dreams what constitutes a dream and what does not . he claimed that a dream is first established by the fact that the person is asleep when they experience it . if a person had an image appear for a moment after waking up or if they see something in the dark it is not considered a dream because they were awake when it occurred . secondly , any sensory experience that actually occurs while a person is asleep and is perceived by the person while asleep does not qualify as part of a dream . for example , if , while a person is sleeping , a door shuts and in their dream they hear a door is shut , aristotle argues that this sensory experience is not part of the dream . the actual sensory experience is perceived by the senses , the fact that it occurred while the person was asleep does not make it part of the dream . lastly , the images of dreams must be a result of lasting impressions of sensory experiences had when awake . -practical philosophy . -aristotle considered ethics to be a practical rather than theoretical study , i.e. , one aimed at becoming good and doing good rather than knowing for its own sake . he wrote several treatises on ethics , including most notably , the `` nicomachean ethics '' . -aristotle taught that virtue has to do with the proper function -lrb- `` ergon '' -rrb- of a thing . an eye is only a good eye in so much as it can see , because the proper function of an eye is sight . aristotle reasoned that humans must have a function specific to humans , and that this function must be an activity of the `` psuchē '' -lrb- normally translated as `` soul '' -rrb- in accordance with reason -lrb- `` logos '' -rrb- . aristotle identified such an optimum activity of the soul as the aim of all human deliberate action , `` eudaimonia '' , generally translated as `` happiness '' or sometimes `` well being '' . to have the potential of ever being happy in this way necessarily requires a good character -lrb- '' ēthikē '' `` aretē '' -rrb- , often translated as moral -lrb- or ethical -rrb- virtue -lrb- or excellence -rrb- . -aristotle taught that to achieve a virtuous and potentially happy character requires a first stage of having the fortune to be habituated not deliberately , but by teachers , and experience , leading to a later stage in which one consciously chooses to do the best things . when the best people come to live life this way their practical wisdom -lrb- `` phronesis '' -rrb- and their intellect -lrb- `` nous '' -rrb- can develop with each other towards the highest possible human virtue , the wisdom of an accomplished theoretical or speculative thinker , or in other words , a philosopher . -in addition to his works on ethics , which address the individual , aristotle addressed the city in his work titled `` politics '' . aristotle considered the city to be a natural community . moreover , he considered the city to be prior in importance to the family which in turn is prior to the individual , `` for the whole must of necessity be prior to the part '' . he also famously stated that `` man is by nature a political animal '' and also arguing that humanity 's defining factor among others in the animal kingdom is its rationality . aristotle conceived of politics as being like an organism rather than like a machine , and as a collection of parts none of which can exist without the others . aristotle 's conception of the city is organic , and he is considered one of the first to conceive of the city in this manner . -the common modern understanding of a political community as a modern state is quite different from aristotle 's understanding . although he was aware of the existence and potential of larger empires , the natural community according to aristotle was the city -lrb- `` polis '' -rrb- which functions as a political `` community '' or `` partnership '' -lrb- `` koinōnia '' -rrb- . the aim of the city is not just to avoid injustice or for economic stability , but rather to allow at least some citizens the possibility to live a good life , and to perform beautiful acts : `` the political partnership must be regarded , therefore , as being for the sake of noble actions , not for the sake of living together . '' this is distinguished from modern approaches , beginning with social contract theory , according to which individuals leave the state of nature because of `` fear of violent death '' or its `` inconveniences . '' -excerpt from a speech by the character ` aristotle ' in the book protrepticus -lrb- hutchinson and johnson , 2015 p. 22 -rrb- -rhetoric and poetics . -aristotle considered epic poetry , tragedy , comedy , dithyrambic poetry and music to be imitative , each varying in imitation by medium , object , and manner . for example , music imitates with the media of rhythm and harmony , whereas dance imitates with rhythm alone , and poetry with language . the forms also differ in their object of imitation . comedy , for instance , is a dramatic imitation of men worse than average ; whereas tragedy imitates men slightly better than average . lastly , the forms differ in their manner of imitation -- through narrative or character , through change or no change , and through drama or no drama . aristotle believed that imitation is natural to mankind and constitutes one of mankind 's advantages over animals . -while it is believed that aristotle 's `` poetics '' comprised two books -- one on comedy and one on tragedy -- only the portion that focuses on tragedy has survived . aristotle taught that tragedy is composed of six elements : plot-structure , character , style , thought , spectacle , and lyric poetry . the characters in a tragedy are merely a means of driving the story ; and the plot , not the characters , is the chief focus of tragedy . tragedy is the imitation of action arousing pity and fear , and is meant to effect the catharsis of those same emotions . aristotle concludes `` poetics '' with a discussion on which , if either , is superior : epic or tragic mimesis . he suggests that because tragedy possesses all the attributes of an epic , possibly possesses additional attributes such as spectacle and music , is more unified , and achieves the aim of its mimesis in shorter scope , it can be considered superior to epic . -aristotle was a keen systematic collector of riddles , folklore , and proverbs ; he and his school had a special interest in the riddles of the delphic oracle and studied the fables of aesop . -views on women . -aristotle 's analysis of procreation describes an active , ensouling masculine element bringing life to an inert , passive female element . on this ground , feminist metaphysics have accused aristotle of misogyny and sexism . however , aristotle gave equal weight to women 's happiness as he did to men 's , and commented in his `` rhetoric '' that the things that lead to happiness need to be in women as well as men . -loss and preservation of his works . -modern scholarship reveals that aristotle 's `` lost '' works stray considerably in characterization from the surviving aristotelian corpus . whereas the lost works appear to have been originally written with an intent for subsequent publication , the surviving works do not appear to have been so . rather the surviving works mostly resemble lecture notes unintended for publication . the authenticity of a portion of the surviving works as originally aristotelian is also today held suspect , with some books duplicating or summarizing each other , the authorship of one book questioned and another book considered to be unlikely aristotle 's at all . -some of the individual works within the corpus , including the `` constitution of athens , '' are regarded by most scholars as products of aristotle 's `` school , '' perhaps compiled under his direction or supervision . others , such as `` on colors , '' may have been produced by aristotle 's successors at the lyceum , e.g. , theophrastus and straton . still others acquired aristotle 's name through similarities in doctrine or content , such as the `` de plantis , '' possibly by nicolaus of damascus . other works in the corpus include medieval palmistries and astrological and magical texts whose connections to aristotle are purely fanciful and self-promotional . -according to a distinction that originates with aristotle himself , his writings are divisible into two groups : the `` exoteric '' and the `` esoteric '' . most scholars have understood this as a distinction between works aristotle intended for the public -lrb- exoteric -rrb- , and the more technical works intended for use within the lyceum course / school -lrb- esoteric -rrb- . modern scholars commonly assume these latter to be aristotle 's own -lrb- unpolished -rrb- lecture notes -lrb- or in some cases possible notes by his students -rrb- . however , one classic scholar offers an alternative interpretation . the 5th century neoplatonist ammonius hermiae writes that aristotle 's writing style is deliberately obscurantist so that `` good people may for that reason stretch their mind even more , whereas empty minds that are lost through carelessness will be put to flight by the obscurity when they encounter sentences like these . '' -another common assumption is that none of the exoteric works is extant -- that all of aristotle 's extant writings are of the esoteric kind . current knowledge of what exactly the exoteric writings were like is scant and dubious , though many of them may have been in dialogue form . -lrb- `` fragments '' of some of aristotle 's dialogues have survived . -rrb- perhaps it is to these that cicero refers when he characterized aristotle 's writing style as `` a river of gold '' ; it is hard for many modern readers to accept that one could seriously so admire the style of those works currently available to us . however , some modern scholars have warned that we can not know for certain that cicero 's praise was reserved specifically for the exoteric works ; a few modern scholars have actually admired the concise writing style found in aristotle 's extant works . -one major question in the history of aristotle 's works , then , is how were the exoteric writings all lost , and how did the ones we now possess come to us the story of the original manuscripts of the esoteric treatises is described by strabo in his `` geography '' and plutarch in his `` parallel lives '' . the manuscripts were left from aristotle to his successor theophrastus , who in turn willed them to neleus of scepsis . neleus supposedly took the writings from athens to scepsis , where his heirs let them languish in a cellar until the 1st century bc , when apellicon of teos discovered and purchased the manuscripts , bringing them back to athens . according to the story , apellicon tried to repair some of the damage that was done during the manuscripts ' stay in the basement , introducing a number of errors into the text . when lucius cornelius sulla occupied athens in 86 bc , he carried off the library of apellicon to rome , where they were first published in 60 bc by the grammarian tyrannion of amisus and then by the philosopher andronicus of rhodes . -carnes lord attributes the popular belief in this story to the fact that it provides `` the most plausible explanation for the rapid eclipse of the peripatetic school after the middle of the third century , and for the absence of widespread knowledge of the specialized treatises of aristotle throughout the hellenistic period , as well as for the sudden reappearance of a flourishing aristotelianism during the first century b.c. '' lord voices a number of reservations concerning this story , however . first , the condition of the texts is far too good for them to have suffered considerable damage followed by apellicon 's inexpert attempt at repair . -second , there is `` incontrovertible evidence , '' lord says , that the treatises were in circulation during the time in which strabo and plutarch suggest they were confined within the cellar in scepsis . third , the definitive edition of aristotle 's texts seems to have been made in athens some fifty years before andronicus supposedly compiled his . and fourth , ancient library catalogues predating andronicus ' intervention list an aristotelian corpus quite similar to the one we currently possess . lord sees a number of post-aristotelian interpolations in the `` politics '' , for example , but is generally confident that the work has come down to us relatively intact . -on the one hand , the surviving texts of aristotle do not derive from finished literary texts , but rather from working drafts used within aristotle 's school , as opposed , on the other hand , to the dialogues and other `` exoteric '' texts which aristotle published more widely during his lifetime . the consensus is that andronicus of rhodes collected the esoteric works of aristotle 's school which existed in the form of smaller , separate works , distinguished them from those of theophrastus and other peripatetics , edited them , and finally compiled them into the more cohesive , larger works as they are known today . -more than 2300 years after his death , aristotle remains one of the most influential people who ever lived . he contributed to almost every field of human knowledge then in existence , and he was the founder of many new fields . according to the philosopher bryan magee , `` it is doubtful whether any human being has ever known as much as he did '' . among countless other achievements , aristotle was the founder of formal logic , pioneered the study of zoology , and left every future scientist and philosopher in his debt through his contributions to the scientific method . -despite these achievements , the influence of aristotle 's errors is considered by some to have held back science considerably . bertrand russell notes that `` almost every serious intellectual advance has had to begin with an attack on some aristotelian doctrine '' . russell also refers to aristotle 's ethics as `` repulsive '' , and calls his logic `` as definitely antiquated as ptolemaic astronomy '' . russell notes that these errors make it difficult to do historical justice to aristotle , until one remembers how large of an advance he made upon all of his predecessors . -later greek philosophers . -the immediate influence of aristotle 's work was felt as the lyceum grew into the peripatetic school . aristotle 's notable students included aristoxenus , dicaearchus , demetrius of phalerum , eudemos of rhodes , harpalus , hephaestion , meno , mnason of phocis , nicomachus , and theophrastus . aristotle 's influence over alexander the great is seen in the latter 's bringing with him on his expedition a host of zoologists , botanists , and researchers . he had also learned a great deal about persian customs and traditions from his teacher . although his respect for aristotle was diminished as his travels made it clear that much of aristotle 's geography was clearly wrong , when the old philosopher released his works to the public , alexander complained `` thou hast not done well to publish thy acroamatic doctrines ; for in what shall i surpass other men if those doctrines wherein i have been trained are to be all men 's common property ? '' -influence on byzantine scholars . -greek christian scribes played a crucial role in the preservation of aristotle by copying all the extant greek language manuscripts of the corpus . the first greek christians to comment extensively on aristotle were john philoponus , elias , and david in the sixth century , and stephen of alexandria in the early seventh century . john philoponus stands out for having attempted a fundamental critique of aristotle 's views on the eternity of the world , movement , and other elements of aristotelian thought . after a hiatus of several centuries , formal commentary by eustratius and michael of ephesus reappears in the late eleventh and early twelfth centuries , apparently sponsored by anna comnena . -influence on islamic theologians . -aristotle was one of the most revered western thinkers in early islamic theology . most of the still extant works of aristotle , as well as a number of the original greek commentaries , were translated into arabic and studied by muslim philosophers , scientists and scholars . averroes , avicenna and alpharabius , who wrote on aristotle in great depth , also influenced thomas aquinas and other western christian scholastic philosophers . alkindus considered aristotle as the outstanding and unique representative of philosophy and averroes spoke of aristotle as the `` exemplar '' for all future philosophers . medieval muslim scholars regularly described aristotle as the `` first teacher '' . the title `` teacher '' was first given to aristotle by muslim scholars , and was later used by western philosophers -lrb- as in the famous poem of dante -rrb- who were influenced by the tradition of islamic philosophy . -in accordance with the greek theorists , the muslims considered aristotle to be a dogmatic philosopher , the author of a closed system , and believed that aristotle shared with plato essential tenets of thought . some went so far as to credit aristotle himself with neo-platonic metaphysical ideas . -influence on western christian theologians . -with the loss of the study of ancient greek in the early medieval latin west , aristotle was practically unknown there from c. ad 600 to c. 1100 except through the latin translation of the `` organon '' made by boethius . in the twelfth and thirteenth centuries , interest in aristotle revived and latin christians had translations made , both from arabic translations , such as those by gerard of cremona , and from the original greek , such as those by james of venice and william of moerbeke . -after thomas aquinas wrote his theology , working from moerbeke 's translations , the demand for aristotle 's writings grew and the greek manuscripts returned to the west , stimulating a revival of aristotelianism in europe that continued into the renaissance . -aristotle is referred to as `` the philosopher '' by scholastic thinkers such as thomas aquinas . see `` summa theologica '' , part i , question 3 , etc. . these thinkers blended aristotelian philosophy with christianity , bringing the thought of ancient greece into the middle ages . it required a repudiation of some aristotelian principles for the sciences and the arts to free themselves for the discovery of modern scientific laws and empirical methods . the medieval english poet chaucer describes his student as being happy by having -the italian poet dante says of aristotle in the first circles of hell , -post-enlightenment thinkers . -the german philosopher friedrich nietzsche has been said to have taken nearly all of his political philosophy from aristotle . however debatable this is , aristotle rigid separated action from production , and argued for the deserved subservience of some people -lrb- `` natural slaves '' -rrb- , and the natural superiority -lrb- virtue , `` arete '' -rrb- of others . it is martin heidegger , not nietzsche , who elaborated a new interpretation of aristotle , intended to warrant his deconstruction of scholastic and philosophical tradition . ayn rand accredited aristotle as `` the greatest philosopher in history '' and cited him as a major influence on her thinking . more recently , alasdair macintyre has attempted to reform what he calls the aristotelian tradition in a way that is anti-elitist and capable of disputing the claims of both liberals and nietzscheans . -list of works . -the works of aristotle that have survived from antiquity through medieval manuscript transmission are collected in the corpus aristotelicum . these texts , as opposed to aristotle 's lost works , are technical philosophical treatises from within aristotle 's school . reference to them is made according to the organization of immanuel bekker 's royal prussian academy edition -lrb- `` aristotelis opera edidit academia regia borussica '' , berlin , 1831 -- 1870 -rrb- , which in turn is based on ancient classifications of these works . -the aristotle mountains along the oscar ii coast of graham land , antarctica , are named after aristotle . he was the first person known to conjecture , in his book `` meteorology '' , the existence of a landmass in the southern high-latitude region and call it `` antarctica '' . -aristoteles -lrb- crater -rrb- is a crater on the moon bearing the classical form of aristotle 's name . -further reading . -the secondary literature on aristotle is vast . the following references are only a small selection . -an american in paris is a jazz-influenced symphonic poem by the american composer george gershwin , written in 1928 . inspired by the time gershwin had spent in paris , it evokes the sights and energy of the french capital in the 1920s and is one of his best-known compositions . -gershwin composed `` an american in paris '' on commission from the conductor walter damrosch . he scored the piece for the standard instruments of the symphony orchestra plus celesta , saxophones , and automobile horns . he brought back some parisian taxi horns for the new york premiere of the composition , which took place on december 13 , 1928 in carnegie hall , with damrosch conducting the new york philharmonic . gershwin completed the orchestration on november 18 , less than four weeks before the work 's premiere . -gershwin collaborated on the original program notes with the critic and composer deems taylor , noting that : `` my purpose here is to portray the impression of an american visitor in paris as he strolls about the city and listens to various street noises and absorbs the french atmosphere . '' when the tone poem moves into the blues , `` our american friend ... has succumbed to a spasm of homesickness . '' but , `` nostalgia is not a fatal disease . '' the american visitor `` once again is an alert spectator of parisian life '' and `` the street noises and french atmosphere are triumphant . '' -gershwin was attracted by maurice ravel 's unusual chords . after transatlantic letters back and forth as to whether ravel took students and how much he charged , ravel looked at gershwin 's prior year earnings and sent a telegram to gershwin jokingly saying he -lrb- ravel -rrb- should study with gershwin ! ... but he accepted him as a student . gershwin went to paris in 1926 ready to study and to enjoy his first trip to paris . after his initial student audition with ravel turned into a sharing of musical theories , ravel said he could n't teach him but he would send a letter referring him to nadia boulanger . while the studies were cut short , that 1926 trip resulted in the initial version of an american in paris written as a ` thank you note ' to gershwin 's hosts , robert and mabel shirmer . gershwin called it `` a rapsodic ballet ' written so freely and much more modern than his prior works . -gershwin strongly encouraged ravel to come to the united states for a tour , something ravel had been reluctant to do . to this end , upon his return to new york , gershwin joined the efforts of ravel 's friend robert schmitz , a pianist ravel had met during the war to urge ravel to tour the u.s. schmitz was the head of pro musica promoting franco-american musical relations and was able to offer ravel a $ 12,000 fee for the tour , an enticement gershwin knew would be important to ravel . -gershwin greeted ravel in ny in february 1928 at the start of ravel 's u.s. tour , and joined ravel again later in the tour in los angeles . after a lunch together with chaplin in beverly hills , ravel was persuaded to perform an unscheduled ` house concert ' in a friend 's music salon , performing among kindred spirits . -ravel 's tour reignited gershwin 's desire to return to paris which he did in march 1928 . ravel 's high praise of gershwin in an introductory letter to boulanger caused gershwin to seriously consider taking much more time to study abroad in paris . yet after playing for her , she told him she could not teach him . nadia boulanger gave gershwin basically the same advice she gave all of her accomplished master students `` do n't copy others ; be yourself . '' in this case `` why try to be a second rate ravel when you are already a first rate gershwin ? '' this did not set gershwin back , as his real intent abroad was to complete a new work based on paris and perhaps a second rhapsody for piano and orchestra to follow his `` rhapsody in blue '' . paris at this time hosted many expatriate writers : among them ezra pound , w. b. yeats , ernest hemingway ; and artist pablo picasso . < lsri archives oral interview anita loos and mary anita loos october 1979 re : letters and ravel 's telegram to gershwin > -gershwin based `` an american in paris '' on a melodic fragment called `` very parisienne '' , written in 1926 on his first visit to paris as a gift to his hosts , robert and mabel schirmer . he described the piece as a `` rhapsodic ballet '' because it was written freely and is more modern than his previous works . gershwin explained in `` musical america '' , `` my purpose here is to portray the impressions of an american visitor in paris as he strolls about the city , listens to the various street noises , and absorbs the french atmosphere . '' -the piece is structured into five sections , which culminate in a loose aba format . gershwin 's first a episode introduces the two main `` walking '' themes in the `` allegretto grazioso '' and develops a third theme in the `` subito con brio '' . the style of this a section is written in the typical french style of composers claude debussy and les six . this a section featured duple meter , singsong rhythms , and diatonic melodies with the sounds of oboe , english horn , and taxi horns . the b section 's `` andante ma con ritmo deciso '' introduces the american blues and spasms of homesickness . the `` allegro '' that follows continues to express homesickness in a faster twelve-bar blues . in the b section , gershwin uses common time , syncopated rhythms , and bluesy melodies with the sounds of trumpet , saxophone , and snare drum . `` moderato con grazia '' is the last a section that returns to the themes set in a . after recapitulating the `` walking '' themes , gershwin overlays the slow blues theme from section b in the final `` grandioso . '' -`` an american in paris '' is scored for 3 flutes -lrb- 3rd doubling on piccolo -rrb- , 2 oboes , english horn , 2 clarinets in b flat , bass clarinet in b flat , 2 bassoons , 4 horns in f , 3 trumpets in b flat , 3 trombones , tuba , timpani , snare drum , bass drum , triangle , wood block , cymbals , low and high tom-toms , xylophone , glockenspiel , celesta , 4 taxi horns labeled as a , b , c and d , alto saxophone/soprano saxophone , tenor saxophone/soprano saxophone/alto saxophone , baritone saxophone/soprano saxophone/alto saxophone , and strings . -the revised edition by f. campbell-watson calls for three saxophones , alto , tenor and baritone . in this arrangement the soprano and alto doublings have been rewritten to avoid changing instruments . -william daly arranged the score for piano solo which was published by new world music in 1929 . -gershwin did not particularly like walter damrosch 's interpretation at the world premiere of `` an american in paris '' . he stated that damrosch 's sluggish , dragging tempo caused him to walk out of the hall during a matinee performance of this work . the audience , according to edward cushing , responded with `` a demonstration of enthusiasm impressively genuine in contrast to the conventional applause which new music , good and bad , ordinarily arouses . '' critics believed that `` an american in paris '' was better crafted than his lukewarm concerto in f . some did not think it belonged in a program with classical composers césar franck , richard wagner , or guillaume lekeu on its premiere . gershwin responded to the critics , `` it 's not a beethoven symphony , you know ... it 's a humorous piece , nothing solemn about it . it 's not intended to draw tears . if it pleases symphony audiences as a light , jolly piece , a series of impressions musically expressed , it succeeds . '' -preservation status . -on september 22 , 2013 , it was announced that a musicological critical edition of the full orchestral score will be eventually released . the gershwin family , working in conjunction with the library of congress and the university of michigan , are working to make scores available to the public that represent gershwin 's true intent . it is unknown if the critical score will include the four minutes of material gershwin later deleted from the work -lrb- such as the restatement of the blues theme after the faster 12 bar blues section -rrb- , or if the score will document changes in the orchestration during gershwin 's composition process . -the score to `` an american in paris '' is currently scheduled to be issued first in a series of scores to be released . the entire project may take 30 to 40 years to complete , but `` an american in paris '' will be an early volume in the series . -`` an american in paris '' has been frequently recorded . the first recording was made for rca victor in 1929 with nathaniel shilkret conducting the victor symphony orchestra , drawn from members of the philadelphia orchestra . gershwin was on hand to `` supervise '' the recording ; however , shilkret was reported to be in charge and eventually asked the composer to leave the recording studio . then , a little later , shilkret discovered there was no one to play the brief celesta solo during the slow section , so he hastily asked gershwin if he might play the solo ; gershwin said he could and so he briefly participated in the actual recording . the radio broadcast of the september 8 , 1937 hollywood bowl george gershwin memorial concert , in which `` an american in paris , '' also conducted by shilkret , was second on the program , was recorded and was released in 1998 in a two-cd set . arthur fiedler and the boston pops orchestra recorded the work for rca victor , including one of the first stereo recordings of the music . in 1945 , arturo toscanini and the nbc symphony orchestra recorded the music in carnegie hall , one of the few commercial recordings toscanini made of music by an american composer . the seattle symphony also recorded a version in 1990 of gershwin 's original score , before he made numerous edits resulting in the score as we hear it today . -use in film . -in 1951 , mgm released the musical `` an american in paris '' , featuring gene kelly and leslie caron . winning the 1951 best picture oscar and numerous other awards , the film was directed by vincente minnelli , featured many tunes of gershwin , and concluded with an extensive , elaborate dance sequence built around the `` an american in paris '' symphonic poem -lrb- arranged for the film by johnny green -rrb- , costing $ 500,000 . -a part of the symphonic composition is also featured in `` as good as it gets '' , released in 1997 . -the academy awards are the oldest awards ceremony for achievements in motion pictures . the academy award for best production design recognizes achievement in art direction on a film . the category 's original name was best art direction , but was changed to its current name in 2012 for the 85th academy awards . this change resulted from the art director 's branch of the academy being renamed the designer 's branch . since 1947 , the award is shared with the set decorator -lrb- s -rrb- . -the films below are listed with their production year -lrb- for example , the 2000 academy award for best art direction is given to a film from 1999 -rrb- . in the lists below , the winner of the award for each year is shown first , followed by the other nominees . -the academy awards or the oscars is an annual american awards ceremony honoring cinematic achievements in the film industry . the various category winners are awarded a copy of a statuette , officially called the academy award of merit , which has become better known by its nickname oscar . the awards , first presented in 1929 at the hollywood roosevelt hotel , are overseen by the academy of motion picture arts and sciences -lrb- ampas -rrb- . -the awards ceremony was first televised in 1953 , and is now seen live in more than 200 countries . the oscars is the oldest entertainment awards ceremony ; its equivalents , the emmy awards for television , the tony awards for theatre , and the grammy awards for music and recording , are modeled after the academy awards . -the 86th academy awards ceremony was held on march 2 , 2014 , at the dolby theatre in los angeles , later than usual as to not clash with the winter olympics in sochi , russia . the 87th academy awards ceremony was held on february 22 , 2015 . historically given during the first quarter of the new year , the awards honor achievements for cinematic accomplishments for the preceding year . for example , `` 12 years a slave '' was awarded best picture for 2013 , although the oscar ceremony was conducted in 2014 . as of the 87th awards ceremony , held in 2015 , a total of 2,947 oscars have been awarded since the inception of the award . -the first academy awards presentation was held on may 16 , 1929 , at a private dinner at the hollywood roosevelt hotel with an audience of about 270 people . the post-awards party was held at the mayfair hotel . the cost of guest tickets for that night 's ceremony was $ 5 -lrb- $ in dollars -rrb- . fifteen statuettes were awarded , honoring artists , directors and other participants in the film-making industry of the time , for their works during the 1927 -- 28 period . the ceremony ran for 15 minutes . -winners had been announced to media three months earlier ; however , that was changed for the second ceremony in 1930 . since then , for the rest of the first decade , the results were given to newspapers for publication at 11:00 pm on the night of the awards . this method was used until an occasion when the `` los angeles times '' announced the winners before the ceremony began ; as a result , the academy has , since 1941 , used a sealed envelope to reveal the name of the winners . -the first best actor awarded was emil jannings , for his performances in `` the last command '' and `` the way of all flesh '' . he had to return to europe before the ceremony , so the academy agreed to give him the prize earlier ; this made him the first academy award winner in history . at that time , the winners were recognized for all of their work done in a certain category during the qualifying period ; for example , jannings received the award for two movies in which he starred during that period , and janet gaynor later won a single oscar for performances in three films . with the fourth ceremony , however , the system changed , and professionals were honored for a specific performance in a single film . for the first six ceremonies , the eligibility period spanned two calendar years . -at the 29th ceremony , held on march 27 , 1957 , the best foreign language film category was introduced . until then , foreign-language films had been honored with the special achievement award . -the 74th academy awards , held in 2002 , presented the first academy award for best animated feature . -oscar statuette . -although there are seven other types of annual awards presented by the academy -lrb- the irving g. thalberg memorial award , the jean hersholt humanitarian award , the gordon e. sawyer award , the academy scientific and technical award , the academy award for technical achievement , the john a. bonner medal of commendation and the student academy award -rrb- plus two awards that are not presented annually -lrb- the special achievement award in the form of an oscar statuette and the honorary award that may or may not be in the form of an oscar statuette -rrb- , the best known one is the `` academy award of merit '' more popularly known as the oscar statuette . made of gold-plated britannium on a black metal base , it is 13.5 in -lrb- 34 cm -rrb- tall , weighs 8.5 lb -lrb- 3.85 kg -rrb- and depicts a knight rendered in art deco style holding a crusader 's sword standing on a reel of film with five spokes . the five spokes represent the original branches of the academy : actors , writers , directors , producers , and technicians . -no model was used during the design process of the statuette . sculptor george stanley -lrb- who also did the muse fountain at the hollywood bowl -rrb- sculpted cedric gibbons 's design in clay and sachin smith cast the statuette in 92.5 percent tin and 7.5 percent copper and then gold-plated it . the only addition to the oscar since it was created is a minor streamlining of the base . the original oscar mold was cast in 1928 at the c.w. shumway & sons foundry in batavia , illinois , which also contributed to casting the molds for the vince lombardi trophy and emmy awards statuettes . since 1983 , approximately 50 oscars are made each year in chicago by illinois manufacturer r.s. owens & company . it takes between three to four weeks to manufacture 50 statuettes . -in support of the american effort in world war ii , the statuettes were made of plaster and were traded in for gold ones after the war had ended . -the origin of the name `` oscar '' is disputed . one biography of bette davis claims that she named the oscar after her first husband , band leader harmon oscar nelson ; one of the earliest mentions in print of the term `` oscar '' dates back to a `` time '' magazine article about the 1934 6th academy awards . walt disney is also quoted as thanking the academy for his oscar as early as 1932 . another claimed origin is that the academy 's executive secretary , margaret herrick , first saw the award in 1931 and made reference to the statuette 's reminding her of her `` uncle oscar '' -lrb- a nickname for her cousin oscar pierce -rrb- . columnist sidney skolsky was present during herrick 's naming and seized the name in his byline , `` employees have affectionately dubbed their famous statuette ` oscar ' '' . the trophy was officially dubbed the `` oscar '' in 1939 by the academy of motion picture arts and sciences . -to prevent information identifying the oscar winners from leaking ahead of the ceremony , oscar statuettes presented at the ceremony have blank baseplates . until 2010 , winners were expected to return the statuettes to the academy after the ceremony and wait several weeks to have inscriptions applied . since 2010 , winners have had the option of having engraved nameplates applied to their statuettes at an inscription-processing station at the governor 's ball , a party held immediately after the oscar ceremony . in 2010 , the r.s. owens company made 197 engraved nameplates ahead of the ceremony , bearing the names of every potential winner . the 175 or so nameplates for non-winning nominees were recycled afterwards . -ownership of oscar statuettes . -since 1950 , the statuettes have been legally encumbered by the requirement that neither winners nor their heirs may sell the statuettes without first offering to sell them back to the academy for us$ 1 . if a winner refuses to agree to this stipulation , then the academy keeps the statuette . academy awards not protected by this agreement have been sold in public auctions and private deals for six-figure sums . in december 2011 , orson welles ' 1941 oscar for `` citizen kane '' -lrb- best original screenplay -rrb- was put up for auction , after his heirs won a 2004 court decision contending that welles did not sign any agreement to return the statue to the academy . on december 20 , 2011 , it sold in an online auction for us$ 861,542 . -in 1992 , harold russell needed money for his wife 's medical expenses . in a controversial decision , he consigned his 1946 oscar for best supporting actor for `` the best years of our lives '' to herman darvick autograph auctions , and on august 6 , 1992 , in new york city , the oscar sold to a private collector for $ 60,500 . russell defended his action , saying , `` i do n't know why anybody would be critical . my wife 's health is much more important than sentimental reasons . the movie will be here , even if oscar is n't . '' harold russell is the only academy award winning actor to ever sell an oscar . -while the oscar is owned by the recipient , it is essentially not on the open market . michael todd 's grandson tried to sell todd 's oscar statuette to a movie prop collector in 1989 , but the academy won the legal battle by getting a permanent injunction . although some oscar sales transactions have been successful , some buyers have subsequently returned the statuettes to the academy , which keeps them in its treasury . -since 2004 , academy award nomination results have been announced to the public in late january . prior to that , the results were announced in early february . -the academy of motion picture arts and sciences -lrb- ampas -rrb- , a professional honorary organization , maintains a voting membership of 5,783 . -academy membership is divided into different branches , with each representing a different discipline in film production . actors constitute the largest voting bloc , numbering 1,311 members -lrb- 22 percent -rrb- of the academy 's composition . votes have been certified by the auditing firm pricewaterhousecoopers -lrb- and its predecessor price waterhouse -rrb- for the past 73 annual awards ceremonies . -all ampas members must be invited to join by the board of governors , on behalf of academy branch executive committees . membership eligibility may be achieved by a competitive nomination or a member may submit a name based on other significant contribution to the field of motion pictures . -new membership proposals are considered annually . the academy does not publicly disclose its membership , although as recently as 2007 press releases have announced the names of those who have been invited to join . the 2007 release also stated that it has just under 6,000 voting members . while the membership had been growing , stricter policies have kept its size steady since then . -in 2012 , the results of a study conducted by the `` los angeles times '' were published describing the demographic breakdown of approximately 88 % of ampas ' voting membership . of the 5,100 + active voters confirmed , 94 % were caucasian , 77 % were male , and 54 % were found to be over the age of 60 . 33 % of voting members are former nominees -lrb- 14 % -rrb- and winners -lrb- 19 % -rrb- . -in may 2011 , the academy sent a letter advising its 6,000 or so voting members that an online system for oscar voting will be implemented in 2013 . -according to rules 2 and 3 of the official academy awards rules , a film must open in the previous calendar year , from midnight at the start of 1 january to midnight at the end of 31 december , in los angeles county , california and play for seven consecutive days , to qualify -lrb- except for the best foreign language film -rrb- . for example , the 2009 best picture winner , `` the hurt locker '' , was actually first released in 2008 , but did not qualify for the 2008 awards as it did not play its oscar-qualifying run in los angeles until mid-2009 , thus qualifying for the 2009 awards . -rule 2 states that a film must be feature-length , defined as a minimum of 40 minutes , except for short subject awards , and it must exist either on a 35 mm or 70 mm film print or in 24 frame/s or 48 frame/s progressive scan digital cinema format with a minimum projector resolution of 2048 by 1080 pixels . -producers must submit an official screen credits online form before the deadline ; in case it is not submitted by the defined deadline , the film will be ineligible for academy awards in any year . the form includes the production credits for all related categories . then , each form is checked and put in a reminder list of eligible releases . -in late december ballots and copies of the reminder list of eligible releases are mailed to around 6,000 active members . for most categories , members from each of the branches vote to determine the nominees only in their respective categories -lrb- i.e. only directors vote for directors , writers for writers , actors for actors , etc. -rrb- . in all major categories , voters use an instant run-off voting ballot , with potential nominees rewarded in the single transferable vote tally for having strong supporters who rank them first . there are some exceptions in the case of certain categories , like foreign film , documentary and animated feature film , in which movies are selected by special screening committees made up of members from all branches . in the special case of best picture , all voting members are eligible to select the nominees for that category . foreign films must include english subtitles , and each country can submit only one film per year . -the winners are then determined by a second round of voting in which all members are then allowed to vote in most categories , including best picture . -film companies will spend as much as several million dollars on marketing to awards voters for a movie in the running for best picture , in attempts to improve chances of receiving oscars and other movie awards conferred in oscar season . the academy enforces rules to limit overt campaigning by its members so as to try to eliminate excesses and prevent the process from becoming undignified . it has an awards czar on staff who advises members on allowed practices and levies penalties on offenders . for example , a producer of the 2010 best picture nominee , `` the hurt locker , '' was disqualified as a producer in the category when he contacted associates urging them to vote for his film and not another that was seen as front-runner -lrb- `` the hurt locker '' eventually won -rrb- . -the major awards are presented at a live televised ceremony , most commonly in late february or early march following the relevant calendar year , and six weeks after the announcement of the nominees . it is the culmination of the film awards season , which usually begins during november or december of the previous year . this is an elaborate extravaganza , with the invited guests walking up the red carpet in the creations of the most prominent fashion designers of the day . black tie dress is the most common outfit for men , although fashion may dictate not wearing a bow-tie , and musical performers sometimes do not adhere to this . -lrb- the artists who recorded the nominees for best original song quite often perform those songs live at the awards ceremony , and the fact that they are performing is often used to promote the television broadcast -rrb- . -the academy awards is the only awards show that is televised live in all united states time zones -lrb- excluding hawaii ; they aired live in alaska starting in 2011 for the first time since 1996 -rrb- , canada , the united kingdom , and gathers millions of viewers elsewhere throughout the world . the 2007 ceremony was watched by more than 40 million americans . other awards ceremonies -lrb- such as the emmys , golden globes , and grammys -rrb- are broadcast live in the eastern & central time zones , but are on tape delay on the west coast and might not air the same day outside north america -lrb- if the awards are even televised -rrb- . the academy has for several years claimed that the award show has up to a billion viewers internationally , but this has so far not been confirmed by any independent sources . -the awards show was first televised in 1953 , on nbc , which continued to broadcast the event until 1960 when the abc network took over , televising the festivities -lrb- including the first color broadcast of the event in 1966 -rrb- through 1970 , after which nbc resumed the broadcasts . abc once again took over broadcast duties in 1976 and it is under contract to do so through the year 2020 . the first countries to broadcast the academy awards on television , aside from the united states , were canada , the united kingdom and mexico ; the latter two countries did not broadcast the live show , and mexico did not carry the live event until 1964 . by 1954 , seven other countries , namely brazil , cuba , venezuela , west germany , belgium , the netherlands and france , were already broadcasting the awards show , although previously filmed into a condensed 60-minute version , called the `` international edition '' of the academy awards . the awards show was broadcast for the first time via satellite in 1970 , but only two south american countries , chile and brazil purchased the rights to air the live event . by that time , the television rights to the awards show were sold in 50 countries . a decade later , the tv rights to the oscars were already being sold to 60 countries , and by 1984 , the tv rights to the awards were licensed in 76 countries . until the arrival of subscription television in europe , africa and the middle east , which enabled the oscars to be broadcast live through these territories , there was already available a previously filmed or taped 90-minute version of the awards show which was aired on broadcast television in these territories . however , several asian and australasian countries , such as japan , hong kong , south korea , singapore , malaysia , australia and new zealand were already carrying the live broadcast of the awards show since the late 1970s . ampas still produces a condensed 90-minute version of the academy awards for those territories in which the rights to the live broadcast are expensive . -after more than 60 years of being held in late march or early april , the ceremonies were moved up to late february or early march starting in 2004 to help disrupt and shorten the intense lobbying and ad campaigns associated with oscar season in the film industry . another reason was because of the growing tv ratings success of the ncaa men 's division i basketball championship , which would cut into the academy awards audience . the earlier date is also to the advantage of abc , as it now usually occurs during the highly profitable and important february sweeps period . some years , the ceremony is moved into early march in deference to the winter olympics . another reason for the move to late february and early march is to avoid the awards ceremony occurring so close to the religious holidays of passover and easter , which for decades had been a grievance from members and the general public . advertising is somewhat restricted , however , as traditionally no movie studios or competitors of official academy award sponsors may advertise during the telecast . the awards show holds the distinction of having won the most emmys in history , with 47 wins and 195 nominations . -after many years of being held on mondays at 9:00 pm eastern/6 :00 p.m pacific , in 1999 the ceremonies were moved to sundays at 8:30 pm eastern/5 :30 pm pacific . the reasons given for the move were that more viewers would tune in on sundays , that los angeles rush-hour traffic jams could be avoided , and that an earlier start time would allow viewers on the east coast to go to bed earlier . for many years the film industry had opposed a sunday broadcast because it would cut into the weekend box office . -originally scheduled for april 8 , 1968 , the 40th academy awards ceremony was postponed for two days , because of the assassination of dr. martin luther king , jr. . on march 30 , 1981 , the 53rd academy awards was postponed for one day , after the shooting of president ronald reagan and others in washington , d.c. . -in 1993 , an `` in memoriam '' segment was introduced , honoring those who had made a significant contribution to cinema who had died in the preceding 12 months , a selection compiled by a small committee of academy members . this segment has drawn criticism over the years for the omission of some names . criticism was also levied for many years regarding another aspect , with the segment having a `` popularity contest '' feel as the audience varied their applause to those who had died by the subject 's cultural impact ; the applause has since been muted during the telecast , and the audience is discouraged from clapping during the segment and giving silent reflection instead . -in terms of broadcast length , the ceremony generally averages three and a half hours . the first oscars , in 1929 , lasted 15 minutes . at the other end of the spectrum , the 2000 ceremony lasted four hours and four minutes . in 2010 , the organizers of the academy awards announced that winners ' acceptance speeches must not run past 45 seconds . this , according to organizer bill mechanic , was to ensure the elimination of what he termed `` the single most hated thing on the show '' -- overly long and embarrassing displays of emotion . -the academy has contemplated moving the ceremony even further back into january , citing tv viewers ' fatigue with the film industry 's long awards season . however , such an accelerated schedule would dramatically decrease the voting period for its members , to the point where some voters would only have time to view the contending films streamed on their computers -lrb- as opposed to traditionally receiving the films and ballots in the mail -rrb- . also , a january ceremony would have to compete with national football league playoff games . -awards ceremonies . -historically , the `` oscarcast '' has pulled in a bigger haul when box-office hits are favored to win the best picture trophy . more than 57.25 million viewers tuned to the telecast for the 70th academy awards in 1998 , the year of `` titanic '' , which generated close to us$ 600 million at the north american box office pre-oscars . the 76th academy awards ceremony in which '' '' -lrb- pre-telecast box office earnings of us$ 368 million -rrb- received 11 awards including best picture drew 43.56 million viewers . the most watched ceremony based on nielsen ratings to date , however , was the 42nd academy awards -lrb- best picture `` midnight cowboy '' -rrb- which drew a 43.4 % household rating on 7 april 1970 . -by contrast , ceremonies honoring films that have not performed well at the box office tend to show weaker ratings . the 78th academy awards which awarded low-budgeted , independent film `` crash '' -lrb- with a pre-oscar gross of us$ 53.4 million -rrb- generated an audience of 38.64 million with a household rating of 22.91 % . in 2008 , the 80th academy awards telecast was watched by 31.76 million viewers on average with an 18.66 % household rating , the lowest rated and least watched ceremony to date , in spite of celebrating 80 years of the academy awards . the best picture winner of that particular ceremony was another independently financed film -lrb- `` no country for old men '' -rrb- . -in 1929 , the first academy awards were presented at a banquet dinner at the hollywood roosevelt hotel . from 1930 to 1943 , the ceremony alternated between two venues : the ambassador hotel on wilshire boulevard and the biltmore hotel in downtown los angeles . -grauman 's chinese theatre in hollywood then hosted the awards from 1944 to 1946 , followed by the shrine auditorium in los angeles from 1947 to 1948 . the 21st academy awards in 1949 were held at the academy award theatre at what was the academy 's headquarters on melrose avenue in hollywood . -from 1950 to 1960 , the awards were presented at hollywood 's pantages theatre . with the advent of television , the awards from 1953 to 1957 took place simultaneously in hollywood and new york , first at the nbc international theatre -lrb- 1953 -rrb- and then at the nbc century theatre , after which the ceremony took place solely in los angeles . the oscars moved to the santa monica civic auditorium in santa monica , california in 1961 . by 1969 , the academy decided to move the ceremonies back to los angeles , this time to the dorothy chandler pavilion at the los angeles county music center . -in 2002 , the dolby theatre -lrb- formerly known as the kodak theatre -rrb- became the current venue of the presentation . -awards of merit categories . -current categories . -in the first year of the awards , the best directing award was split into two separate categories -lrb- drama and comedy -rrb- . at times , the best original score award has also been split into separate categories -lrb- drama and comedy/musical -rrb- . from the 1930s through the 1960s , the art direction -lrb- now production design -rrb- , cinematography , and costume design awards were likewise split into two separate categories -lrb- black-and-white films and color films -rrb- . prior to 2012 , the production design award was called art direction , while the makeup and hairstyling award was called makeup . -another award , entitled the academy award for best original musical , is still in the academy rulebooks and has yet to be discontinued . however , due to continuous insufficient eligibility each year , it has not been awarded since 1984 -lrb- when `` purple rain '' won -rrb- . -proposed categories . -the board of governors meets each year and considers new award categories . to date , the following proposed categories have been rejected : -special categories . -the special academy awards are voted on by special committees , rather than by the academy membership as a whole . they are not always presented on a consistent annual basis . -accusations of commercialism . -due to the positive exposure and prestige of the academy awards , studios spend millions of dollars and hire publicists specifically to promote their films during what is typically called the `` oscar season '' . this has generated accusations of the academy awards being influenced more by marketing than quality . no independent films have received the award -lrb- though a few were nominated -rrb- , and no actors working outside of the studio system for a picture have won the award for their work in that picture . william friedkin , an academy award-winning film director and former producer of the ceremony , expressed this sentiment at a conference in new york in 2009 , describing it as `` the greatest promotion scheme that any industry ever devised for itself '' . -tim dirks , editor of amc 's filmsite.org , has written of the academy awards , -accusations of bias . -typical criticism of the academy awards for best picture is that among the winners and nominees there is an over-representation of romantic historical epics , biographical dramas , romantic dramedies , and family melodramas , most of which are released in the u.s. the last three months of the calendar year . the oscars have been infamously known for selecting specific genres of movies to be awarded . from 1927 to 2001 around 49 % of best picture nominated films had been categorized as a drama and out of the 432 films to be analyzed within that time 47 % of the winning films were in fact dramas . this has led to the coining of the term ` oscar bait ' , describing such movies . this has led at times to more specific criticisms that the academy is disconnected from the audience , e.g. by favoring ` oscar bait ' over audience favorites , or favoring historical melodramas over critically acclaimed movies that depict current life issues . -symbolism or sentimentalization . -acting prizes in certain years have been criticized for not recognizing superior performances so much as being awarded for sentimental reasons , personal popularity , atonement for past mistakes , or presented as a `` career honor '' to recognize a distinguished nominee 's entire body of work . -refusing the award . -some winners critical of the academy awards have boycotted the ceremonies and refused to accept their oscars . the first to do so was dudley nichols -lrb- best writing in 1935 for `` the informer '' -rrb- . nichols boycotted the 8th academy awards ceremony because of conflicts between the academy and the writers ' guild . george c. scott became the second person to refuse his award -lrb- best actor in 1970 for `` patton '' -rrb- at the 43rd academy awards ceremony . scott described it as a ` meat parade ' , saying ' i do n't want any part of it . '' the third was marlon brando , who refused his award -lrb- best actor for 1972 's `` the godfather '' -rrb- , citing the film industry 's discrimination and mistreatment of native americans . at the 45th academy awards ceremony , brando sent sacheen littlefeather to read a 15-page speech detailing his criticisms . -associated events . -the following events are closely associated with the annual academy awards : -presenter and performer gifts . -it has become a tradition to give out gift bags to the presenters and performers at the oscars . in recent years these gifts have also been extended to award nominees and winners . the value of each of these gift bags can reach into the tens of thousands of dollars . in 2014 the value was reported to be as high as us$ 80,000 . the value has risen to the point where the u.s. internal revenue service issued a statement regarding the gifts and their taxable status . -oscar gift bags have included vacation packages to hawaii and mexico and japan , a private dinner party for the recipient and friends at a restaurant , videophones , a four-night stay at a hotel . watches , bracelets , vacation packages , spa treatments , bottles of vodka , maple salad dressing , and weight-loss gummie candy . some of the gifts have even had a `` risque '' element to them ; in 2014 the adult products retailer adam & eve had a `` secret room gifting suite '' . celebrities visiting the gifting suite included judith hoag , carolyn hennesy , kate linder , chris mulkey , jim o'heir , and nba star john salley . -tv ratings and ad prices . -from 2006 onwards , results are live + sd , all previous years are live viewing -see also . -global equivalents : -actrius -lrb- catalan : `` actresses '' -rrb- is a 1996 drama film directed by ventura pons . in the film , there are no male actors and the four leading actresses dubbed themselves in the castilian version . -in order to prepare the role of an important old actress , a theatre student interviews three actresses who were her pupils : an international diva -lrb- glòria marc , played by núria espert -rrb- , a television star -lrb- assumpta roca , played by rosa maria sardà -rrb- and a dubbing director -lrb- maria caminal , played by anna lizaran -rrb- . -animalia is an illustrated children 's book by graeme base . it was originally published in 1986 , followed by a tenth anniversary edition in 1996 , and a 25th anniversary edition in 2012 . over three million copies have been sold . a special numbered and signed anniversary edition was also published in 1996 , with an embossed gold jacket . -`` animalia '' is an alliterative alphabet book and contains twenty-six illustrations , one for each letter of the alphabet . each illustration features an animal from the animal kingdom -lrb- a is for alligator , b is for butterfly , etc. -rrb- along with a short poem utilizing the letter of the page for many of the words . the illustrations contain many other objects beginning with that letter that the reader can try to identify . as an additional challenge , the author has hidden a picture of himself as a child in every picture . -related products . -julia macrae books published an `` animalia '' colouring book in 2008 . h. n. abrams also published a wall calendar colouring book version for children the same year . -h. n. abrams published `` the animalia wall frieze '' , a fold-out over 26 feet in length , in which the author created new riddles for each letter . -the great american puzzle factory created a 300-piece jigsaw puzzle based on the book 's cover . -a television series was also created , based on the book , which airs in the united states , australia , canada , the united kingdom , norway and venezuela . it also airs on minimax for the czech republic and slovakia . and recently in greece on the channel et1 . the australian children 's television foundation released a teaching resource dvd-rom in 2011 to accompany the tv series with teaching aids for classroom use . -in 2010 , the base factory and appbooks released animalia as an application for ipad and iphone/ipod touch . -`` animalia '' won the young australian 's best book award in 1987 for best picture story book . -the children 's book council of australia designated `` animalia '' a 1987 : honour book . -kid 's own australian literature awards named `` animalia '' the 1988 picture book winner . -international atomic time -lrb- tai , from the french name -rrb- is a high-precision atomic coordinate time standard based on the notional passage of proper time on earth 's geoid . it is the basis for coordinated universal time -lrb- utc -rrb- , which is used for civil timekeeping all over the earth 's surface , and for terrestrial time , which is used for astronomical calculations . when the last leap second was added , tai is exactly 36 seconds ahead of utc . the 36 seconds results from the initial difference of 10 seconds at the start of 1972 , plus 26 leap seconds in utc since 1972 . -time coordinates on the tai scales are conventionally specified using traditional means of specifying days , carried over from non-uniform time standards based on the rotation of the earth . specifically , both julian dates and the gregorian calendar are used . tai in this form was synchronised with universal time at the beginning of 1958 , and the two have drifted apart ever since , due to the changing motion of the earth . -tai as a time scale is a weighted average of the time kept by over 400 atomic clocks in over 50 national laboratories worldwide . the clocks are compared using gps signals and two-way satellite time and frequency transfer . due to the averaging it is far more stable than any clock would be alone -lrb- see signal averaging for a discussion -rrb- . the majority of the clocks are caesium clocks ; the definition of the si second is written in terms of caesium . -the participating institutions each broadcast , in real time , a frequency signal with timecodes , which is their estimate of tai . time codes are usually published in the form of utc , which differs from tai by a well-known integer number of seconds . these time scales are denoted in the form `` utc -lrb- npl -rrb- '' in the utc form , where `` npl '' in this case identifies the national physical laboratory , uk . the tai form may be denoted `` tai -lrb- npl -rrb- '' . the latter is not to be confused with `` ta -lrb- npl -rrb- '' , which denotes an independent atomic time scale , not synchronised to tai or to anything else . -the clocks at different institutions are regularly compared against each other . the international bureau of weights and measures -lrb- bipm , france -rrb- , combines these measurements to retrospectively calculate the weighted average that forms the most stable time scale possible . this combined time scale is published monthly in circular t , and is the canonical tai . this time scale is expressed in the form of tables of differences utc-utc -lrb- `` k '' -rrb- -lrb- equivalent to tai-tai -lrb- `` k '' -rrb- -rrb- for each participating institution `` k '' . -lrb- the same circular also gives tables of tai-ta -lrb- `` k '' -rrb- , for the various unsynchronised atomic time scales . -rrb- -errors in publication may be corrected by issuing a revision of the faulty circular t or by errata in a subsequent circular t. aside from this , once published in circular t the tai scale is not revised . in hindsight it is possible to discover errors in tai , and to make better estimates of the true proper time scale . doing so does not create another version of tai ; it is instead considered to be creating a better realisation of terrestrial time -lrb- tt -rrb- . -early atomic time scales consisted of quartz clocks with frequencies calibrated by a single atomic clock ; the atomic clocks were not operated continuously . atomic timekeeping services started experimentally in 1955 , using the first caesium atomic clock at the national physical laboratory , uk -lrb- npl -rrb- . the `` greenwich atomic '' -lrb- ga -rrb- scale began in 1955 at the royal greenwich observatory . the international time bureau -lrb- bih -rrb- began a time scale , tm or am , in july 1955 , using both local caesium clocks and comparisons to distant clocks using the phase of vlf radio signals . the united states naval observatory began the a. 1 scale 13 september 1956 , using an atomichron commercial atomic clock , followed by the nbs-a scale at the national bureau of standards , boulder , colorado . both the bih scale and a. 1 were defined by an epoch at the beginning of 1958 : it was set to read julian date 2436204.5 -lrb- 1 january 1958 00:00:00 -rrb- at the corresponding ut2 instant . the procedures used by the bih evolved , and the name for the time scale changed : `` a3 '' in 1963 and `` ta -lrb- bih -rrb- '' in 1969 . this synchronisation was inevitably imperfect , depending as it did on the astronomical realisation of ut2 . at the time , ut2 as published by various observatories differed by several hundredths of a second . -the si second was defined in terms of the caesium atom in 1967 , and in 1971 the name international atomic time -lrb- tai -rrb- was assigned to a time scale based on si seconds with no leap seconds . during this time , irregularities in the atomic time were detected and corrected . in 1967 it was suggested that nearby masses caused clocks to operate at different rates , but this was disproven in 1968 . -in the 1970s , it became clear that the clocks participating in tai were ticking at different rates due to gravitational time dilation , and the combined tai scale therefore corresponded to an average of the altitudes of the various clocks . starting from julian date 2443144.5 -lrb- 1 january 1977 00:00:00 -rrb- , corrections were applied to the output of all participating clocks , so that tai would correspond to proper time at mean sea level -lrb- the geoid -rrb- . because the clocks had been on average well above sea level , this meant that tai slowed down , by about one part in a trillion . the former uncorrected time scale continues to be published , under the name `` eal '' -lrb- `` echelle atomique libre '' , meaning `` free atomic scale '' -rrb- . -the instant that the gravitational correction started to be applied serves as the epoch for barycentric coordinate time -lrb- tcb -rrb- , geocentric coordinate time -lrb- tcg -rrb- , and terrestrial time -lrb- tt -rrb- which represent three fundamental time scales in the solar system . all three of these time scales were defined to read jd 2443144.5003725 -lrb- 1 january 1977 00:00:32.184 -rrb- exactly at that instant . -lrb- the offset is to provide continuity with the older ephemeris time . -rrb- tai was henceforth a realisation of tt , with the equation tt -lrb- tai -rrb- = tai + 32.184 s . -the continued existence of tai was questioned in a 2007 letter from the bipm to the itu-r which stated `` in the case of a redefinition of utc without leap seconds , the cctf would consider discussing the possibility of suppressing tai , as it would remain parallel to the continuous utc . '' -in 1961 , utc began . utc is a discontinuous time scale composed from segments that are linear transformations of atomic time , the discontinuities being arranged so that utc approximated ut2 until the end of 1971 , and ut1 thereafter . this was a compromise arrangement for a broadcast time scale : a linear transformation of the bih 's atomic time meant that the time scale was stable and internationally synchronised , while approximating ut1 means that tasks such as navigation which require a source of universal time continue to be well served by public time broadcasts . -altruism or selflessness is the principle or practice of concern for the welfare of others . it is a traditional virtue in many cultures and a core aspect of various religious traditions and secular worldviews , though the concept of `` others '' toward whom concern should be directed can vary among cultures and religions . altruism or selflessness is the opposite of selfishness . the word was coined by the french philosopher auguste comte in french , as `` altruisme '' , for an antonym of egoism . he derived it from the italian `` altrui '' , which in turn was derived from latin `` alteri '' , meaning `` other people '' or `` somebody else '' . -altruism in biological organisms can be defined as an individual performing an action which is at a cost to themselves -lrb- e.g. , pleasure and quality of life , time , probability of survival or reproduction -rrb- , but benefits , either directly or indirectly , another third-party individual , without the expectation of reciprocity or compensation for that action . steinberg suggests a definition for altruism in the clinical setting , that is `` intentional and voluntary actions that aim to enhance the welfare of another person in the absence of any quid pro quo external rewards '' . -altruism can be distinguished from feelings of loyalty , in that whilst the latter is predicated upon social relationships , altruism does not consider relationships . much debate exists as to whether `` true '' altruism is possible in human psychology . the theory of psychological egoism suggests that no act of sharing , helping or sacrificing can be described as truly altruistic , as the actor may receive an intrinsic reward in the form of personal gratification . the validity of this argument depends on whether intrinsic rewards qualify as `` benefits '' . the actor also may not be expecting a reward . -the term `` altruism '' may also refer to an ethical doctrine that claims that individuals are morally obliged to benefit others . used in this sense , it is usually contrasted with egoism , which is defined as acting to the benefit of one 's self . -the notion of altruism . -the concept has a long history in philosophical and ethical thought . the term was originally coined in the 19th century by the founding sociologist and philosopher of science , auguste comte , and has become a major topic for psychologists -lrb- especially evolutionary psychology researchers -rrb- , evolutionary biologists , and ethologists . whilst ideas about altruism from one field can have an impact on the other fields , the different methods and focuses of these fields always lead to different perspectives on altruism . in simple terms , altruism is caring about the welfare of other people and acting to help them . -scientific viewpoints . -marcel mauss 's book `` the gift '' contains a passage : `` note on alms . '' this note describes the evolution of the notion of alms -lrb- and by extension of altruism -rrb- from the notion of sacrifice . in it , he writes : -alms are the fruits of a moral notion of the gift and of fortune on the one hand , and of a notion of sacrifice , on the other . generosity is an obligation , because nemesis avenges the poor and the gods for the superabundance of happiness and wealth of certain people who should rid themselves of it . this is the ancient morality of the gift , which has become a principle of justice . the gods and the spirits accept that the share of wealth and happiness that has been offered to them and had been hitherto destroyed in useless sacrifices should serve the poor and children . -evolutionary explanations . -in the science of ethology -lrb- the study of animal behaviour -rrb- , and more generally in the study of social evolution , altruism refers to behaviour by an individual that increases the fitness of another individual while decreasing the fitness of the actor . in evolutionary psychology this may be applied to a wide range of human behaviors such as charity , emergency aid , help to coalition partners , tipping , courtship gifts , production of public goods , and environmentalism . -theories of apparently altruistic behavior were accelerated by the need to produce theories compatible with evolutionary origins . two related strands of research on altruism have emerged from traditional evolutionary analyses and from evolutionary game theory a mathematical model and analysis of behavioural strategies . -some of the proposed mechanisms are : -such explanations do not imply that humans are always consciously calculating how to increase their inclusive fitness when they are doing altruistic acts . instead , evolution has shaped psychological mechanisms , such as emotions , that promote altruistic behaviors . -every single instance of altruistic behavior need not always increase inclusive fitness ; altruistic behaviors would have been selected for if such behaviors on average increased inclusive fitness in the ancestral environment . this need not imply that on average 50 % or more of altruistic acts were beneficial for the altruist in the ancestral environment ; if the benefits from helping the right person were very high it would be beneficial to err on the side of caution and usually be altruistic even if in most cases there were no benefits . -the benefits for the altruist may be increased and the costs reduced by being more altruistic towards certain groups . research has found that people are more altruistic to kin than to no-kin , to friends than to strangers , to those attractive than to those unattractive , to non-competitors than to competitors , and to members ingroups than to members of outgroup . -the study of altruism was the initial impetus behind george r. price 's development of the price equation , which is a mathematical equation used to study genetic evolution . an interesting example of altruism is found in the cellular slime moulds , such as `` dictyostelium mucoroides . '' these protists live as individual amoebae until starved , at which point they aggregate and form a multicellular fruiting body in which some cells sacrifice themselves to promote the survival of other cells in the fruiting body . -selective investment theory proposes that close social bonds , and associated emotional , cognitive , and neurohormonal mechanisms , evolved in order to facilitate long-term , high-cost altruism between those closely depending on one another for survival and reproductive success . -such cooperative behaviors have sometimes been seen as arguments for left-wing politics such by the russian zoologist and anarchist peter kropotkin in his 1902 book '' '' and peter singer in his book `` a darwinian left . '' -initial evolutionary problematics . -there are problems of early stage evolution of altruism . a first emotionally empathic individual would , if it was genetic , have been effectively exploited to death by the preexisting non-empathic individuals . this applies regardless how far back in evolution the problem is moved , not restricted to hominid but extending to pre-reptilian or anything in between including early mammals . the first empathic individual would effectively be exploited every time another individual was in the right place at the right time to take advantage , so no evolutionary adaptation to exploiting empathic individuals would be required for the lethality to take effect . it is de facto impossible that mutations for emotional empathy , ability to recognize it in others , and a direction of it towards those individuals would all occur at the same time . an ability to recognize a non-existent behavior is of no evolutionary use and so can not have pre-evolved . -jorge moll and jordan grafman , neuroscientists at the national institutes of health and labs-d'or hospital network -lrb- j.m. -rrb- provided the first evidence for the neural bases of altruistic giving in normal healthy volunteers , using functional magnetic resonance imaging . in their research , published in the proceedings of the national academy of sciences usa in october 2006 , they showed that both pure monetary rewards and charitable donations activated the mesolimbic reward pathway , a primitive part of the brain that usually lights up in response to food and sex . however , when volunteers generously placed the interests of others before their own by making charitable donations , another brain circuit was selectively activated : the subgenual cortex/septal region . these structures are intimately related to social attachment and bonding in other species . altruism , the experiment suggested , was not a superior moral faculty that suppresses basic selfish urges but rather was basic to the brain , hard-wired and pleasurable . -the international encyclopedia of the social sciences defines `` psychological altruism '' as `` a motivational state with the goal of increasing another 's welfare . '' psychological altruism is contrasted with `` psychological egoism , '' which refers to the motivation to increase one 's own welfare . -there has been some debate on whether or not humans are truly capable of psychological altruism . some definitions specify a self-sacrificial nature to altruism and a lack of external rewards for altruistic behaviors . however , because altruism ultimately benefits the self in many cases , the selflessness of altruistic acts is brought to question . the social exchange theory postulates that altruism only exists when benefits outweigh costs . daniel batson is a psychologist who examined this question and argues against the social exchange theory . he identified four major motives for altruism : altruism to ultimately benefit the self -lrb- egoism -rrb- , to ultimately benefit the other person -lrb- altruism -rrb- , to benefit a group -lrb- collectivism -rrb- , or to uphold a moral principle -lrb- principlism -rrb- . altruism that ultimately serves selfish gains is thus differentiated from selfless altruism , but the general conclusion has been that empathy-induced altruism can be genuinely selfless . the `` empathy-altruism hypothesis '' basically states that psychological altruism does exist and is evoked by the empathic desire to help someone who is suffering . feelings of empathic concern are contrasted with feelings of personal distress , which compel people to reduce their own unpleasant emotions . people with empathic concern help others in distress even when exposure to the situation could be easily avoided , whereas those lacking in empathic concern avoid helping unless it is difficult or impossible to avoid exposure to another 's suffering . helping behavior is seen in humans at about two years old , when a toddler is capable of understanding subtle emotional cues . -in psychological research on altruism , studies often observe altruism as demonstrated through prosocial behaviors such as helping , comforting , sharing , cooperation , philanthropy , and community service . research has found that people are most likely to help if they recognize that a person is in need and feel personal responsibility for reducing the person 's distress . research also suggests that the number of bystanders witnessing distress or suffering affects the likelihood of helping -lrb- the `` bystander effect '' -rrb- . greater numbers of bystanders decrease individual feelings of responsibility . however , a witness with a high level of empathic concern is likely to assume personal responsibility entirely regardless of the number of bystanders . a feeling of personal responsibility or - moral norm - has also strongly been associated with other pro-social behaviors such as charitable giving . -many studies have observed the effects of volunteerism -lrb- as a form of altruism -rrb- on happiness and health and have consistently found a strong connection between volunteerism and current and future health and well-being . in a study of older adults , those who volunteered were significantly higher on life satisfaction and will to live , and significantly lower in depression , anxiety , and somatization . volunteerism and helping behavior have not only been shown to improve mental health , but physical health and longevity as well . one study examined the physical health of mothers who volunteered over a 30-year period and found that 52 % of those who did not belong to a volunteer organization experienced a major illness while only 36 % of those who did volunteer experienced one . a study on adults ages 55 + found that during the four-year study period , people who volunteered for two or more organizations had a 63 % lower likelihood of dying . after controlling for prior health status , it was determined that volunteerism accounted for a 44 % reduction in mortality . merely being aware of kindness in oneself and others is also associated with greater well-being . a study that asked participants to count each act of kindness they performed for one week significantly enhanced their subjective happiness . -it is important to note that , while research supports the idea that altruistic acts bring about happiness , it has also been found to work in the opposite direction -- that happier people are also kinder . the relationship between altruistic behavior and happiness is bidirectional . studies have found that generosity increases linearly from sad to happy affective states . studies have also been careful to note that feeling over-taxed by the needs of others has conversely negative effects on health and happiness . for example , one study on volunteerism found that feeling overwhelmed by others ' demands had an even stronger negative effect on mental health than helping had a positive one -lrb- although positive effects were still significant -rrb- . additionally , while generous acts make people feel good about themselves , it is also important for people to appreciate the kindness they receive from others . studies suggest that gratitude goes hand-in-hand with kindness and is also very important for our well-being . a study on the relationship happiness to various character strengths showed that `` a conscious focus on gratitude led to reductions in negative affect and increases in optimistic appraisals , positive affect , offering emotional support , sleep quality , and well-being . '' . psychologists generally refer to this virtuous cycle of helping others , doing good and subsequently feeling good as `` the helper 's high '' . -`` sociologists have long been concerned with how to build the good society '' -lrb- `` altruism , morality , and social solidarity '' . american sociological association . -rrb- . the structure of our societies and how individuals come to exhibit charitable , philanthropic , and other pro-social , altruistic actions for the common good is a largely researched topic within the field . the american sociology association -lrb- asa -rrb- acknowledges public sociology saying , `` the intrinsic scientific , policy , and public relevance of this field of investigation in helping to construct ` good societies ' is unquestionable '' -lrb- `` altruism , morality , and social solidarity '' asa -rrb- . this type of sociology seeks contributions that aid grassroots and theoretical understandings of what motivates altruism and how it is organized , and promotes an altruistic focus in order to benefit the world and people it studies . how altruism is framed , organized , carried out , and what motivates it at the group level is an area of focus that sociologists seek to investigate in order to contribute back to the groups it studies and `` build the good society '' . -pathological altruism . -pathological altruism is when altruism is taken to an unhealthy extreme , and either harms the altruistic person , or well-intentioned actions cause more harm than good . -the term `` pathological altruism '' was popularised by the book `` pathological altruism '' . -examples include depression and burnout seen in healthcare professionals , an unhealthy focus on others to the detriment of one 's own needs , hoarding of animals , and ineffective philanthropic and social programs that ultimately worsen the situations they are meant to aid . -allowing mass immigration is considered by some to be an example of pathological altruism . -religious viewpoints . -most , if not all , of the world 's religions promote altruism as a very important moral value . buddhism , christianity , hinduism , islam , jainism , judaism and sikhism , etc. , place particular emphasis on altruistic morality . -altruism figures prominently in buddhism . love and compassion are components of all forms of buddhism , and are focused on all beings equally : love is the wish that all beings be happy , and compassion is the wish that all beings be free from suffering . `` many illnesses can be cured by the one medicine of love and compassion . these qualities are the ultimate source of human happiness , and the need for them lies at the very core of our being '' -lrb- dalai lama -rrb- . -since `` all beings '' includes the individual , love and compassion in buddhism are outside the opposition between self and other . it is even said that the distinction between self and other is part of the root cause of our suffering . in practical terms , however , since most of us are spontaneously self-centered , buddhism encourages us to focus love and compassion on others , and thus can be characterized as `` altruistic . '' many would agree with the dalai lama that buddhism as a religion is kindness toward others . -still , the notion of altruism is modified in such a world-view , since the belief is that such a practice promotes our own happiness : `` the more we care for the happiness of others , the greater our own sense of well-being becomes '' -lrb- dalai lama -rrb- . -in the context of larger ethical discussions on moral action and judgment , buddhism is characterized by the belief that negative -lrb- unhappy -rrb- consequences of our actions derive not from punishment or correction based on moral judgment , but from the law of karma , which functions like a natural law of cause and effect . a simple illustration of such cause and effect is the case of experiencing the effects of what i cause : if i cause suffering , then as a natural consequence i will experience suffering ; if i cause happiness , then as a natural consequence i will experience happiness . -in buddhism , `` karma '' -lrb- pāli `` kamma '' -rrb- is strictly distinguished from vipāka , meaning `` fruit '' or `` result '' . karma is categorized within the group or groups of cause -lrb- pāli `` hetu '' -rrb- in the chain of cause and effect , where it comprises the elements of `` volitional activities '' -lrb- pali `` sankhara '' -rrb- and `` action '' -lrb- pali `` bhava '' -rrb- . any action is understood to create `` seeds '' in the mind that sprout into the appropriate results -lrb- pāli `` vipaka '' -rrb- when they meet the right conditions . most types of karmas , with good or bad results , will keep one in the wheel of samsāra ; others will liberate one to nirvāna . -buddhism relates karma directly to motives behind an action . motivation usually makes the difference between `` good '' and `` bad '' , but motivation also includes the aspect of ignorance ; so a well-intended action from an ignorant mind can easily be `` bad '' in that it creates unpleasant results for the `` actor . '' -in buddhism , karma is not the only cause of all that happens . as taught in the early texts , the commentarial tradition classified causal mechanisms governing the universe in five categories , known as niyama dhammas : -the fundamental principles of jainism revolve around the concept of altruism , not only for humans but for all sentient beings . jainism preaches the view of ahimsa -- to live and let live , thereby not harming sentient beings , i.e. uncompromising reverence for all life . it also considers all living things to be equal . the first thirthankar , rishabh introduced the concept of altruism for all living beings , from extending knowledge and experience to others to donation , giving oneself up for others , non-violence and compassion for all living things . -jainism prescribes a path of non-violence to progress the soul to this ultimate goal . jains believe that to attain enlightenment and ultimately liberation , one must practice the following ethical principles -lrb- major vows -rrb- in thought , speech and action . the degree to which these principles are practiced is different for householders and monks . they are : -a major characteristic of jain belief is the emphasis on the consequences of not only physical but also mental behaviors . one 's unconquered mind with anger , pride -lrb- ego -rrb- , deceit , greed and uncontrolled sense organs are the powerful enemies of humans . anger spoils good relations , pride destroys humility , deceit destroys peace and greed destroys everything . jainism recommends conquering anger by forgiveness , pride -lrb- ego -rrb- by humility , deceit by straight-forwardness and greed by contentment . -the principle of non-violence seeks to minimize karmas which limit the capabilities of the soul . jainism views every soul as worthy of respect because it has the potential to become siddha -lrb- param-atma -- `` highest soul '' -rrb- . because all living beings possess a soul , great care and awareness is essential in one 's actions . jainism emphasizes the equality of all life , advocating harmlessness towards all , whether the creatures are great or small . this policy extends even to microscopic organisms . jainism acknowledges that every person has different capabilities and capacities to practice and therefore accepts different levels of compliance for ascetics and householders . the `` great vows '' -lrb- mahavrata -rrb- are prescribed for monks and `` limited vows '' -lrb- anuvrata -rrb- are prescribed for householders . in other words , the house-holders are encouraged to practice the five cardinal principles of non-violence , truthfulness , non-stealing , celibacy and non-possessiveness with their current practical limitations while the monks have to observe them very strictly . with consistent practice , it will be possible to overcome the limitations gradually , accelerating the spiritual progress . -altruism is central to the teachings of jesus found in the gospel , especially in the sermon on the mount and the sermon on the plain . from biblical to medieval christian traditions , tensions between self-affirmation and other-regard were sometimes discussed under the heading of `` disinterested love '' , as in the pauline phrase `` love seeks not its own interests . '' in his book `` indoctrination and self-deception , '' roderick hindery tries to shed light on these tensions by contrasting them with impostors of authentic self-affirmation and altruism , by analysis of other-regard within creative individuation of the self , and by contrasting love for the few with love for the many . love confirms others in their freedom , shuns propaganda and masks , assures others of its presence , and is ultimately confirmed not by mere declarations from others , but by each person 's experience and practice from within . as in practical arts , the presence and meaning of love becomes validated and grasped not by words and reflections alone , but in the making of the connection . -st thomas aquinas interprets ` you should love your neighbour as yourself ' as meaning that love for ourselves is the exemplar of love for others . considering that `` the love with which a man loves himself is the form and root of friendship '' and quotes aristotle that `` the origin of friendly relations with others lies in our relations to ourselves , '' he concluded that though we are not bound to love others more than ourselves , we naturally seek the common good , the good of the whole , more than any private good , the good of a part . however , he thinks we should love god more than ourselves and our neighbours , and more than our bodily life -- since the ultimate purpose of loving our neighbour is to share in eternal beatitude : a more desirable thing than bodily well being . in coining the word altruism , as stated above , comte was probably opposing this thomistic doctrine , which is present in some theological schools within catholicism . -many biblical authors draw a strong connection between love of others and love of god . 1 john 4 states that for one to love god one must love his fellowman , and that hatred of one 's fellowman is the same as hatred of god . thomas jay oord has argued in several books that altruism is but one possible form of love . an altruistic action is not always a loving action . oord defines altruism as acting for the other 's good , and he agrees with feminists who note that sometimes love requires acting for one 's own good when the other 's demands undermine overall well-being . -german philosopher max scheler distinguishes two ways in which the strong can help the weak . one way is a sincere expression of christian love , `` motivated by a powerful feeling of security , strength , and inner salvation , of the invincible fullness of one 's own life and existence '' . another way is merely `` one of the many modern substitutes for love , ... nothing but the urge to turn away from oneself and to lose oneself in other people 's business . '' at its worst , scheler says , `` love for the small , the poor , the weak , and the oppressed is really disguised hatred , repressed envy , an impulse to detract , etc. , directed against the opposite phenomena : wealth , strength , power , largesse . '' -in islam , the concept ' īthār ' -lrb- إيثار -rrb- -lrb- altruism -rrb- is the notion of ` preferring others to oneself ' . for sufis , this means devotion to others through complete forgetfulness of one 's own concerns , where concern for others is rooted to be a demand made by allah on the human body , considered to be property of allah alone . the importance lies in sacrifice for the sake of the greater good ; islam considers those practicing īthār as abiding by the highest degree of nobility . -this is similar to the notion of chivalry , but unlike that european concept , in i ` thar attention is focused on everything in existence . a constant concern for allah -lrb- i.e. god -rrb- results in a careful attitude towards people , animals , and other things in this world . -this concept was emphasized by sufis of islam like rabia al-adawiyya who paid attention to the difference between dedication to allah -lrb- i.e. god -rrb- and dedication to people . thirteenth-century turkish sufi poet yunus emre explained this philosophy as `` yaratılanı severiz , yaratandan ötürü '' or `` we love the creature , because of the creator . '' for many muslims , i ` thar must be practiced as a religious obligation during specific islamic holidays . however , i ` thar is also still an islamic ideal to which all muslims should strive to adhere at all times . -judaism defines altruism as the desired goal of creation . the famous rabbi abraham isaac kook stated that love is the most important attribute in humanity . this is defined as bestowal , or giving , which is the intention of altruism . this can be altruism towards humanity that leads to altruism towards the creator or god . kabbalah defines god as the force of giving in existence . rabbi moshe chaim luzzatto in particular focused on the ` purpose of creation ' and how the will of god was to bring creation into perfection and adhesion with this upper force . -modern kabbalah developed by rabbi yehuda ashlag , in his writings about the future generation , focuses on how society could achieve an altruistic social framework . ashlag proposed that such a framework is the purpose of creation , and everything that happens is to raise humanity to the level of altruism , love for one another . ashlag focused on society and its relation to divinity . -altruism is essential to the sikh religion . -the central faith in sikhism is that the greatest deed any one can do is to imbibe and live the godly qualities like love , affection , sacrifice , patience , harmony , truthfulness . -the fifth nanak , guru arjun dev sacrificed his life to uphold 22 carats of pure truth , the greatest gift to humanity , the guru granth . the ninth guru -, guru tegh bahadur , sacrificed his head to protect weak and defenseless people against atrocity . in the late seventeenth century , guru gobind singh ji -lrb- the tenth guru in sikhism -rrb- , was in war with the moghul rulers to protect the people of different faiths when a fellow sikh , bhai kanhaiya , attended the troops of the enemy . he gave water to both friends and foes who were wounded on the battlefield . some of the enemy began to fight again and some sikh warriors were annoyed by bhai kanhaiya as he was helping their enemy . sikh soldiers brought bhai kanhaiya before guru gobind singh ji , and complained of his action that they considered counter-productive to their struggle on the battlefield . -`` what were you doing , and why ? '' asked the guru . `` i was giving water to the wounded because i saw your face in all of them , '' replied bhai kanhaiya . -the guru responded , `` then you should also give them ointment to heal their wounds . you were practicing what you were coached in the house of the guru . '' -it was under the tutelage of the guru that bhai kanhaiya subsequently founded a volunteer corps for altruism . this volunteer corps still to date is engaged in doing good to others and trains new volunteering recruits for doing the same . -swami sivananda , an advaita scholar , reiterates the same views in his commentary synthesising vedanta views on the brahma sutras , a vedantic text . in his commentary on chapter 3 of the brahma sutras , sivananda notes that karma is insentient and short-lived , and ceases to exist as soon as a deed is executed . hence , karma can not bestow the fruits of actions at a future date according to one 's merit . furthermore , one can not argue that karma generates apurva or punya , which gives fruit . since apurva is non-sentient , it can not act unless moved by an intelligent being such as a god . it can not independently bestow reward or punishment . -there exists a wide range of philosophical views on man 's obligations or motivations to act altruistically . proponents of ethical altruism maintain that individuals are morally obligated to act altruistically . the opposing view is ethical egoism , which maintains that moral agents should always act in their own self-interest . both ethical altruism and ethical egoism contrast with utilitarianism , which maintains that each agent should act in order to maximise the efficacy of their function and the benefit to both themselves and their co-inhabitants . -a related concept in descriptive ethics is psychological egoism , the thesis that humans always act in their own self-interest and that true altruism is impossible . rational egoism is the view that rationality consists in acting in one 's self-interest -lrb- without specifying how this affects one 's moral obligations -rrb- . -ayn rand -lrb- ; born alisa zinov ` yevna rosenbaum , ; -- march 6 , 1982 -rrb- was a russian-born american novelist , philosopher , playwright , and screenwriter . she is known for her two best-selling novels , `` the fountainhead '' -lrb- 1943 -rrb- and `` atlas shrugged '' -lrb- 1957 -rrb- , and for developing a philosophical system she called objectivism . born and educated in russia , rand moved to the united states in 1926 . she had a play produced on broadway in 1935 -- 1936 . after two early novels that were initially unsuccessful in america , she achieved fame with her 1943 novel , `` the fountainhead '' . -in 1957 , she published her best-known work , the novel `` atlas shrugged '' . afterward , she turned to non-fiction to promote her philosophy , publishing her own magazines and releasing several collections of essays until her death in 1982 . rand advocated reason as the only means of acquiring knowledge and rejected faith and religion . she supported rational and ethical egoism , and rejected altruism . in politics , she condemned the initiation of force as immoral and opposed collectivism and statism as well as anarchism , instead supporting `` laissez-faire '' capitalism , which she defined as the system based on recognizing individual rights . in art , rand promoted romantic realism . she was sharply critical of most philosophers and philosophical traditions known to her , except for aristotle and some aristotelians and classical liberals . -literary critics received rand 's fiction with mixed reviews , and academia generally ignored or rejected her philosophy , though academic interest has increased in recent decades . the objectivist movement attempts to spread her ideas , both to the public and in academic settings . she has been a significant influence among libertarians and american conservatives . -early life . -rand was born alisa zinov ` yevna rosenbaum -lrb- -rrb- on february 2 , 1905 , to a russian jewish bourgeois family living in saint petersburg . she was the eldest of the three daughters of zinovy zakharovich rosenbaum and his wife , anna borisovna -lrb- née kaplan -rrb- , largely non-observant jews . zinovy rosenbaum was a successful pharmacist and businessman , eventually owning a pharmacy and the building in which it was located . with a passion for the liberal arts , rand later said she found school unchallenging and she began writing screenplays at the age of eight and novels at the age of ten . at the prestigious stoiunina gymnasium , her closest friend was vladimir nabokov 's younger sister , olga . the two girls shared an intense interest in politics and would engage in debates at the nabokov mansion : while nabokova defended constitutional monarchy , rand supported republican ideals . she was twelve at the time of the february revolution of 1917 , during which she favored alexander kerensky over tsar nicholas ii . -the subsequent october revolution and the rule of the bolsheviks under vladimir lenin disrupted the life the family had previously enjoyed . her father 's business was confiscated and the family displaced . they fled to the crimean peninsula , which was initially under control of the white army during the russian civil war . she later recalled that , while in high school , she determined that she was an atheist and that she valued reason above any other human virtue . after graduating from high school in the crimea at 16 , rand returned with her family to petrograd -lrb- as saint petersburg was renamed at that time -rrb- , where they faced desperate conditions , on occasion nearly starving . -after the russian revolution , universities were opened to women , allowing rand to be in the first group of women to enroll at petrograd state university , where , at the age of 16 , she began her studies in the department of social pedagogy , majoring in history . at the university she was introduced to the writings of aristotle and plato , who would be her greatest influence and counter-influence , respectively . a third figure whose philosophical works she studied heavily was friedrich nietzsche . able to read french , german and russian , rand also discovered the writers fyodor dostoevsky , victor hugo , edmond rostand , and friedrich schiller , who became her perennial favorites . -along with many other `` bourgeois '' students , rand was purged from the university shortly before graduating . however , after complaints from a group of visiting foreign scientists , many of the purged students were allowed to complete their work and graduate , which rand did in october 1924 . she subsequently studied for a year at the state technicum for screen arts in leningrad . for one of her assignments , she wrote an essay about the polish-american actress pola negri , which became her first published work . -by this time she had decided her professional surname for writing would be `` rand '' , possibly as a cyrillic contraction of her birth surname , and she adopted the first name `` ayn '' , either from a finnish name `` aino '' or from the hebrew word -lrb- `` ayin '' , meaning `` eye '' -rrb- . -arrival in the united states . -in the autumn of 1925 , rand was granted a visa to visit american relatives . she departed on january 17 , 1926 . when she arrived in new york city on february 19 , 1926 , she was so impressed with the skyline of manhattan that she cried what she later called `` tears of splendor '' . intent on staying in the united states to become a screenwriter , she lived for a few months with relatives in chicago , one of whom owned a movie theater and allowed her to watch dozens of films for free . she then set out for hollywood , california . -initially , rand struggled in hollywood and took odd jobs to pay her basic living expenses . a chance meeting with famed director cecil b. demille led to a job as an extra in his film `` the king of kings '' as well as subsequent work as a junior screenwriter . while working on `` the king of kings '' , she met an aspiring young actor , frank o'connor ; the two were married on april 15 , 1929 , around the time her last visa extension was set to expire . she became a permanent us resident in july 1929 , and became an american citizen on march 3 , 1931 . taking various jobs during the 1930s to support her writing , she worked for a time as the head of the costume department at rko studios . she made several attempts to bring her parents and sisters to the united states , but they were unable to acquire permission to emigrate . -early fiction . -rand 's first literary success came with the sale of her screenplay `` red pawn '' to universal studios in 1932 , although it was never produced . this was followed by the courtroom drama `` night of january 16th '' , first produced by e.e. clive in hollywood in 1934 and then successfully reopened on broadway in 1935 . each night the `` jury '' was selected from members of the audience , and one of the two different endings , depending on the jury 's `` verdict '' , would then be performed . in 1941 , paramount pictures produced a movie loosely based on the play . rand did not participate in the production and was highly critical of the result . `` ideal '' is a novel and play written in 1934 which were first published in 2015 by her estate . the heroine is an actress who embodies randian ideals . -rand 's first published novel , the semi-autobiographical `` we the living '' , was published in 1936 . set in soviet russia , it focused on the struggle between the individual and the state . in a 1959 foreword to the novel , rand stated that `` we the living '' `` is as near to an autobiography as i will ever write . it is not an autobiography in the literal , but only in the intellectual sense . the plot is invented , the background is not ... '' initial sales were slow and the american publisher let it go out of print , although european editions continued to sell . after the success of her later novels , rand was able to release a revised version in 1959 that has since sold over three million copies . in 1942 , without rand 's knowledge or permission , the novel was made into a pair of italian films , `` noi vivi '' and `` addio , kira '' . rediscovered in the 1960s , these films were re-edited into a new version which was approved by rand and re-released as `` we the living '' in 1986 . -her novella `` anthem '' was written during a break from the writing of her next major novel , `` the fountainhead '' . it presents a vision of a dystopian future world in which totalitarian collectivism has triumphed to such an extent that even the word ` i ' has been forgotten and replaced with ` we ' . it was published in england in 1938 , but rand initially could not find an american publisher . as with `` we the living '' , rand 's later success allowed her to get a revised version published in 1946 , which has sold more than 3.5 million copies . -`` the fountainhead '' and political activism . -during the 1940s , rand became politically active . both she and her husband worked full-time in volunteer positions for the 1940 presidential campaign of republican wendell willkie . this work led to rand 's first public speaking experiences , including fielding the sometimes hostile questions from new york city audiences who had just viewed pro-willkie newsreels , an experience she greatly enjoyed . this activity also brought her into contact with other intellectuals sympathetic to free-market capitalism . she became friends with journalist henry hazlitt and his wife , and hazlitt introduced her to the austrian school economist ludwig von mises . despite her philosophical differences with them , rand strongly endorsed the writings of both men throughout her career , and both of them expressed admiration for her . once mises referred to rand as `` the most courageous man in america '' , a compliment that particularly pleased her because he said `` man '' instead of `` woman '' . rand also developed a friendship with libertarian writer isabel paterson . rand questioned the well-informed paterson about american history and politics long into the night during their numerous meetings and gave paterson ideas for her only nonfiction book , `` the god of the machine '' . -rand 's first major success as a writer came with `` the fountainhead '' in 1943 , a romantic and philosophical novel that she wrote over a period of seven years . the novel centers on an uncompromising young architect named howard roark and his struggle against what rand described as `` second-handers '' -- those who attempt to live through others , placing others above themselves . it was rejected by twelve publishers before finally being accepted by the bobbs-merrill company on the insistence of editor archibald ogden , who threatened to quit if his employer did not publish it . while completing the novel , rand was prescribed benzedrine , a brand of amphetamine , to fight fatigue . the drug helped her to work long hours to meet her deadline for delivering the finished novel , but when the book was done , she was so exhausted that her doctor ordered two weeks ' rest . her use of the drug for approximately three decades may have contributed to what some of her later associates described as volatile mood swings . -`` the fountainhead '' eventually became a worldwide success , bringing rand fame and financial security . in 1943 , rand sold the rights for a film version to warner bros. , and she returned to hollywood to write the screenplay . finishing her work on that screenplay , she was hired by producer hal wallis as a screenwriter and script-doctor . her work for wallis included the screenplays for the oscar-nominated `` love letters '' and `` you came along '' . this role gave rand time to work on other projects , including a planned nonfiction treatment of her philosophy to be called `` the moral basis of individualism '' . although the planned book was never completed , a condensed version was published as an essay titled `` the only path to tomorrow '' , in the january 1944 edition of `` reader 's digest '' magazine . -rand extended her involvement with free-market and anti-communist activism while working in hollywood . she became involved with the motion picture alliance for the preservation of american ideals , a hollywood anti-communist group , and wrote articles on the group 's behalf . she also joined the anti-communist american writers association . a visit by isabel paterson to meet with rand 's california associates led to a final falling out between the two when paterson made comments to valued political allies , which rand considered rude . in 1947 , during the second red scare , rand testified as a `` friendly witness '' before the united states house un-american activities committee . her testimony described the disparity between her personal experiences in the soviet union and the portrayal of it in the 1944 film `` song of russia '' . rand argued that the film grossly misrepresented conditions in the soviet union , portraying life there as being much better and happier than it actually was . she wanted to also criticize the lauded 1946 film `` the best years of our lives '' for what she interpreted as its negative presentation of the business world , but she was not allowed to testify about it . when asked after the hearings about her feelings on the effectiveness of the investigations , rand described the process as `` futile '' . -after several delays , the film version of `` the fountainhead '' was released in 1949 . although it used rand 's screenplay with minimal alterations , she `` disliked the movie from beginning to end '' , complaining about its editing , acting , and other elements . -`` atlas shrugged '' and objectivism . -in the years following the publication of `` the fountainhead '' , rand received numerous letters from readers , some of whom it profoundly influenced . in 1951 rand moved from los angeles to new york city , where she gathered a group of these admirers around her . this group -lrb- jokingly designated `` the collective '' -rrb- included future federal reserve chairman alan greenspan , a young psychology student named nathan blumenthal -lrb- later nathaniel branden -rrb- and his wife barbara , and barbara 's cousin leonard peikoff . at first the group was an informal gathering of friends who met with rand on weekends at her apartment to discuss philosophy . later she began allowing them to read the drafts of her new novel , `` atlas shrugged '' , as the manuscript pages were written . in 1954 rand 's close relationship with the younger nathaniel branden turned into a romantic affair , with the consent of their spouses . -`` atlas shrugged '' , published in 1957 , was considered rand 's `` magnum opus '' . rand described the theme of the novel as `` the role of the mind in man 's existence -- and , as a corollary , the demonstration of a new moral philosophy : the morality of rational self-interest . '' it advocates the core tenets of rand 's philosophy of objectivism and expresses her concept of human achievement . the plot involves a dystopian united states in which the most creative industrialists , scientists , and artists respond to a welfare state government by going on strike and retreating to a mountainous hideaway where they build an independent free economy . the novel 's hero and leader of the strike , john galt , describes the strike as `` stopping the motor of the world '' by withdrawing the minds of the individuals most contributing to the nation 's wealth and achievement . with this fictional strike , rand intended to illustrate that without the efforts of the rational and productive , the economy would collapse and society would fall apart . the novel includes elements of romance , mystery , and science fiction , and it contains rand 's most extensive statement of objectivism in any of her works of fiction , a lengthy monologue delivered by galt . -despite many negative reviews , `` atlas shrugged '' became an international bestseller . in an interview with mike wallace , rand declared herself `` the most creative thinker alive '' . after completing the novel , rand fell into a severe depression . `` atlas shrugged '' was rand 's last completed work of fiction ; a turning point in her life , it marked the end of rand 's career as a novelist and the beginning of her role as a popular philosopher . -in 1958 nathaniel branden established nathaniel branden lectures , later incorporated as the nathaniel branden institute -lrb- nbi -rrb- , to promote rand 's philosophy . collective members gave lectures for nbi and wrote articles for objectivist periodicals that she edited . rand later published some of these articles in book form . critics , including some former nbi students and branden himself , have described the culture of nbi as one of intellectual conformity and excessive reverence for rand , with some describing nbi or the objectivist movement itself as a cult or religion . rand expressed opinions on a wide range of topics , from literature and music to sexuality and facial hair , and some of her followers mimicked her preferences , wearing clothes to match characters from her novels and buying furniture like hers . rand was unimpressed with many of the nbi students and held them to strict standards , sometimes reacting coldly or angrily to those who disagreed with her . however , some former nbi students believe the extent of these behaviors has been exaggerated , with the problem being concentrated among rand 's closest followers in new york . -later years . -throughout the 1960s and 1970s , rand developed and promoted her objectivist philosophy through her nonfiction works and by giving talks to students at institutions such as yale , princeton , columbia , harvard , and mit . she received an honorary doctorate from lewis & clark college in 1963 . she also began delivering annual lectures at the ford hall forum , responding afterward to questions from the audience . during these speeches and q&a sessions , she often took controversial stances on political and social issues of the day . these included supporting abortion rights , opposing the vietnam war and the military draft -lrb- but condemning many draft dodgers as `` bums '' -rrb- , supporting israel in the yom kippur war of 1973 against a coalition of arab nations as `` civilized men fighting savages '' , saying european colonists had the right to develop land taken from american indians , and calling homosexuality `` immoral '' and `` disgusting '' , while also advocating the repeal of all laws about it . she also endorsed several republican candidates for president of the united states , most strongly barry goldwater in 1964 , whose candidacy she promoted in several articles for `` the objectivist newsletter '' . -in 1964 nathaniel branden began an affair with the young actress patrecia scott , whom he later married . nathaniel and barbara branden kept the affair hidden from rand . when she learned of it in 1968 , though her romantic relationship with branden had already ended , rand terminated her relationship with both brandens , which led to the closure of nbi . rand published an article in `` the objectivist '' repudiating nathaniel branden for dishonesty and other `` irrational behavior in his private life '' . branden later apologized in an interview to `` every student of objectivism '' for `` perpetuating the ayn rand mystique '' and for `` contributing to that dreadful atmosphere of intellectual repressiveness that pervades the objectivist movement . '' in subsequent years , rand and several more of her closest associates parted company . -rand underwent surgery for lung cancer in 1974 after decades of heavy smoking . -in 1976 , she retired from writing her newsletter and , despite her initial objections , allowed evva pryor , a social worker from her attorney 's office , to enroll her in social security and medicare . during the late 1970s her activities within the objectivist movement declined , especially after the death of her husband on november 9 , 1979 . one of her final projects was work on a never-completed television adaptation of `` atlas shrugged '' . -rand died of heart failure on march 6 , 1982 , at her home in new york city , and was interred in the kensico cemetery , valhalla , new york . rand 's funeral was attended by some of her prominent followers , including alan greenspan . a floral arrangement in the shape of a dollar sign was placed near her casket . in her will , rand named leonard peikoff the heir to her estate . -rand called her philosophy `` objectivism '' , describing its essence as `` the concept of man as a heroic being , with his own happiness as the moral purpose of his life , with productive achievement as his noblest activity , and reason as his only absolute . '' she considered objectivism a systematic philosophy and laid out positions on metaphysics , epistemology , ethics , political philosophy and aesthetics . -in metaphysics , rand supported philosophical realism , and opposed anything she regarded as mysticism or supernaturalism , including all forms of religion . -in epistemology , she considered all knowledge to be based on sense perception , the validity of which she considered axiomatic , and reason , which she described as `` the faculty that identifies and integrates the material provided by man 's senses . '' she rejected all claims of non-perceptual or `` a priori '' knowledge , including '' ` instinct , ' ` intuition , ' ` revelation , ' or any form of ` just knowing . rand argued that the requirements of cognition determine the objective criteria of conceptualization , which she summarized in the form of a philosophical razor . known as `` rand 's razor , '' it states that `` concepts are not to be multiplied beyond necessity -- the corollary of which is : nor are they to be integrated in disregard of necessity . '' in her `` introduction to objectivist epistemology '' , rand presented a theory of concept formation and rejected the analytic -- synthetic dichotomy . -in ethics , rand argued for rational and ethical egoism -lrb- rational self-interest -rrb- , as the guiding moral principle . she said the individual should `` exist for his own sake , neither sacrificing himself to others nor sacrificing others to himself . '' she referred to egoism as `` the virtue of selfishness '' in her book of that title , in which she presented her solution to the is-ought problem by describing a meta-ethical theory that based morality in the needs of `` man 's survival `` qua '' man '' . she condemned ethical altruism as incompatible with the requirements of human life and happiness , and held that the initiation of force was evil and irrational , writing in `` atlas shrugged '' that `` force and mind are opposites . '' -rand 's political philosophy emphasized individual rights -lrb- including property rights -rrb- , and she considered `` laissez-faire '' capitalism the only moral social system because in her view it was the only system based on the protection of those rights . she opposed statism , which she understood to include theocracy , absolute monarchy , nazism , fascism , communism , democratic socialism , and dictatorship . rand believed that natural rights should be enforced by a constitutionally limited government . although her political views are often classified as conservative or libertarian , she preferred the term `` radical for capitalism '' . she worked with conservatives on political projects , but disagreed with them over issues such as religion and ethics . she denounced libertarianism , which she associated with anarchism . she rejected anarchism as a naïve theory based in subjectivism that could only lead to collectivism in practice . -rand 's aesthetics defined art as a `` selective re-creation of reality according to an artist 's metaphysical value-judgments . '' according to rand , art allows philosophical concepts to be presented in a concrete form that can be easily grasped , thereby fulfilling a need of human consciousness . as a writer , the art form rand focused on most closely was literature , where she considered romanticism to be the approach that most accurately reflected the existence of human free will . she described her own approach to literature as `` romantic realism '' . -rand acknowledged aristotle as her greatest influence and remarked that in the history of philosophy she could only recommend `` three a 's '' -- aristotle , aquinas , and ayn rand . in a 1959 interview with mike wallace , when asked where her philosophy came from , she responded , `` out of my own mind , with the sole acknowledgement of a debt to aristotle , the only philosopher who ever influenced me . i devised the rest of my philosophy myself . '' however , she also found early inspiration in friedrich nietzsche , and scholars have found indications of his influence in early notes from rand 's journals , in passages from the first edition of `` we the living '' -lrb- which rand later revised -rrb- , and in her overall writing style . however , by the time she wrote `` the fountainhead '' , rand had turned against nietzsche 's ideas , and the extent of his influence on her even during her early years is disputed . among the philosophers rand held in particular disdain was immanuel kant , whom she referred to as a `` monster '' , although philosophers george walsh and fred seddon have argued that she misinterpreted kant and exaggerated their differences . -reception and legacy . -during rand 's lifetime , her work evoked both extreme praise and condemnation . rand 's first novel , `` we the living '' , was admired by the literary critic h. l. mencken , her broadway play `` night of january 16th '' was both a critical and popular success , and `` the fountainhead '' was hailed by a reviewer in `` the new york times '' as `` masterful '' . rand 's novels were derided by some critics when they were first published as being long and melodramatic . however , they became bestsellers largely through word of mouth . diff --git a/FlySpring/flyfly/.gitignore b/FlySpring/flyfly/.gitignore deleted file mode 100644 index d2897da3d..000000000 --- a/FlySpring/flyfly/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ -/src/main/resources/jbang.jar diff --git a/FlySpring/flyfly/.mvn/wrapper/maven-wrapper.jar b/FlySpring/flyfly/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index c1dd12f17..000000000 Binary files a/FlySpring/flyfly/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/FlySpring/flyfly/.mvn/wrapper/maven-wrapper.properties b/FlySpring/flyfly/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index b74bf7fcd..000000000 --- a/FlySpring/flyfly/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/FlySpring/flyfly/mvnw b/FlySpring/flyfly/mvnw deleted file mode 100644 index 8a8fb2282..000000000 --- a/FlySpring/flyfly/mvnw +++ /dev/null @@ -1,316 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`\\unset -f command; \\command -v java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/FlySpring/flyfly/mvnw.cmd b/FlySpring/flyfly/mvnw.cmd deleted file mode 100644 index 1d8ab018e..000000000 --- a/FlySpring/flyfly/mvnw.cmd +++ /dev/null @@ -1,188 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% diff --git a/FlySpring/flyfly/pom.xml b/FlySpring/flyfly/pom.xml deleted file mode 100644 index aa917240b..000000000 --- a/FlySpring/flyfly/pom.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.0.0 - - - com.flyspring - flyfly - 0.0.1-SNAPSHOT - flyfly - flyfly CLI - - 17 - - - - - org.testcontainers - testcontainers-bom - 1.17.6 - pom - import - - - - - - - info.picocli - picocli-spring-boot-starter - 4.7.0 - - - org.apache.commons - commons-lang3 - - - commons-io - commons-io - 2.11.0 - - - net.lingala.zip4j - zip4j - 2.11.3 - - - org.zeroturnaround - zt-exec - 1.12 - - - org.apache.maven - maven-model - 3.3.9 - - - org.projectlombok - lombok - 1.18.20 - provided - - - org.testcontainers - testcontainers - 1.17.6 - - - org.testcontainers - mysql - - - mysql - mysql-connector-java - - - - org.testcontainers - postgresql - - - org.postgresql - postgresql - - - - org.testcontainers - mariadb - - - org.mariadb.jdbc - mariadb-java-client - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - com.flyspring.flyfly.FlyflyApplication - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - download-and-unpack-jbang - generate-resources - - run - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gofly - - - - maven-antrun-plugin - 3.1.0 - - - package - - - - - - - run - - - - - - - - - - - - - - - - - - - diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/CustomApplicationRunner.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/CustomApplicationRunner.java deleted file mode 100644 index 1002924c9..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/CustomApplicationRunner.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.flyspring.flyfly; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.*; -import org.springframework.stereotype.Component; - -import picocli.CommandLine; -import picocli.CommandLine.IFactory; - -@Component -public class CustomApplicationRunner implements CommandLineRunner, ExitCodeGenerator { - @Autowired private FlyflyCommand runCommand; - @Autowired private IFactory factory; // auto-configured to inject PicocliSpringFactory - - private int exitCode; - - @Override - public void run(String... args) throws Exception { - exitCode = new CommandLine(runCommand, factory).execute(args); - } - - @Override - public int getExitCode() { - return exitCode; - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/FlyflyApplication.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/FlyflyApplication.java deleted file mode 100644 index cca70380e..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/FlyflyApplication.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.flyspring.flyfly; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class FlyflyApplication { - - public static void main(String[] args) { - System.exit(SpringApplication.exit(SpringApplication.run(FlyflyApplication.class, args))); - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/FlyflyCommand.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/FlyflyCommand.java deleted file mode 100644 index b4d9a8ca3..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/FlyflyCommand.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.flyspring.flyfly; - -import com.flyspring.flyfly.commands.jbang.JbangCommand; -import org.springframework.stereotype.Component; - -import com.flyspring.flyfly.commands.format.FormatCommand; -import com.flyspring.flyfly.commands.run.RunCommand; - -import picocli.CommandLine; -import picocli.CommandLine.Command; - -@Component -@Command( - name = "flyfly", - subcommands = { - RunCommand.class, - FormatCommand.class, - JbangCommand.class, - CommandLine.HelpCommand.class - }) -public class FlyflyCommand {} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/format/FormatCommand.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/format/FormatCommand.java deleted file mode 100644 index 5db1c4fbf..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/format/FormatCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.flyspring.flyfly.commands.format; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.flyspring.flyfly.utils.ProjectTypeChecker; - -import lombok.extern.slf4j.Slf4j; -import picocli.CommandLine.Command; - -@Component -@Command(name = "format", description = "Format code with Spotless") -@Slf4j -public class FormatCommand implements Runnable { - @Autowired Formatter formatter; - @Autowired ProjectTypeChecker projectTypeChecker; - - @Override - public void run() { - if (projectTypeChecker.isGradleProject()) formatter.format(); - else { - log.error("Couldn't find build.gradle"); - log.error("Please try again inside the project directory"); - } - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/format/Formatter.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/format/Formatter.java deleted file mode 100644 index a228e8137..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/format/Formatter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.flyspring.flyfly.commands.format; - -import org.apache.commons.lang3.SystemUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.flyspring.flyfly.utils.ProjectSetup; - -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -public class Formatter { - @Autowired ProjectSetup projectSetup; - - void format() { - try { - log.info("Checking formatting configuration"); - if (!projectSetup.formatScriptExists()) { - log.info("Configuring Spotless"); - projectSetup.addFormatScript(); - } - log.info("Running Spotless"); - String[] command; - if (SystemUtils.IS_OS_WINDOWS) - command = new String[] {"cmd", "/c", "gradlew.bat -I .flyfly/format.gradle spotlessApply"}; - else - command = new String[] {"bash", "-c", "./gradlew -I .flyfly/format.gradle spotlessApply"}; - - ProcessBuilder pb = new ProcessBuilder(command); - pb.inheritIO(); - pb.start().waitFor(); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/jbang/JbangCommand.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/jbang/JbangCommand.java deleted file mode 100644 index 8ce9ecc78..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/jbang/JbangCommand.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.flyspring.flyfly.commands.jbang; - -import org.springframework.stereotype.Component; -import picocli.CommandLine.Command; -import picocli.CommandLine.Parameters; - -import java.io.*; -import java.util.HashMap; - -@Component -@Command(name = "jbang", description = "Activate jbang through the jar placed in resources") -public class JbangCommand implements Runnable { - - @Parameters(description = "Java file to be executed with jbang") - private String javaFile; - - @Parameters(description = "ClassPath Jar to be used") - private String classPathJar; - - @Override - public void run() { - String resourcePath = "/jbang.jar"; - try { - File jarFile = extractFileFromResources(resourcePath); - if (jarFile != null) { - runJbang(jarFile, javaFile, classPathJar); - } else { - System.out.println("Could not find jbang.jar in resources."); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - public File extractFileFromResources(String resourcePath) throws IOException { - InputStream inputStream = getClass().getResourceAsStream(resourcePath); - if (inputStream == null) { - return null; - } - File jarFile = File.createTempFile("jbang", ".jar"); - jarFile.deleteOnExit(); - try (FileOutputStream outputStream = new FileOutputStream(jarFile)) { - inputStream.transferTo(outputStream); - } - return jarFile; - } - - public void runJbang(File jarFile, String javaFile, String classPathJar) { - try { - // Step One: Execute the initial command to get the classpath - ProcessBuilder pb = - new ProcessBuilder( - "java", - "-cp", - jarFile.getAbsolutePath(), - "dev.jbang.Main", - "--cp", - classPathJar, - javaFile); - pb.redirectErrorStream(true); - Process process = pb.start(); - BufferedReader bufferedReader = - new BufferedReader(new InputStreamReader(process.getInputStream())); - - String classPath = extractClassPathFromOutput(bufferedReader); - String mainClass; - - String[] filePath; - - String platformName = System.getProperty("os.name"); - if (platformName.contains("Windows")) { - filePath = classPath.split(";"); - } else { - filePath = classPath.split(":"); - } - - File file = new File(filePath[0]); - String filename = file.getName().split("\\.")[0]; - mainClass = String.format("com.edgechain.%s", filename); - - System.out.println("Extracted Filename" + filename); - System.out.println("Main Class: " + mainClass); - - process.waitFor(); - - // Step Two: Execute the final command with the extracted classpath - if (!classPath.isEmpty() && mainClass != null && !mainClass.isEmpty()) { - runJavaWithClassPath(classPath, mainClass); - } else { - System.out.println("Could not extract classpath or main class from the output."); - } - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - } - - public String extractClassPathFromOutput(BufferedReader bufferedReader) throws IOException { - String line; - HashMap sepMap = new HashMap(); - HashMap cpPatternMap = new HashMap(); - HashMap cpEndPatternMap = new HashMap(); - - sepMap.put("Linux", "/"); - sepMap.put("Windows", "\\"); - - cpPatternMap.put("Linux", "-classpath "); - cpPatternMap.put("Windows", "-classpath '"); - - cpEndPatternMap.put("Linux", " "); - cpEndPatternMap.put("Windows", "\'"); - - String classPath = null; - String platformName = System.getProperty("os.name"); - if (platformName.contains("Windows")) { - platformName = "Windows"; - } else { - // Mac and Linux have the same representations. - platformName = "Linux"; - } - final String pattern = cpPatternMap.get(platformName); - while ((line = bufferedReader.readLine()) != null) { - int startIndex = line.indexOf(pattern); - if (startIndex > -1) { - startIndex += pattern.length(); - int endIndex = line.indexOf(cpEndPatternMap.get(platformName).charAt(0), startIndex); - if (endIndex > startIndex) { - classPath = line.substring(startIndex, endIndex); - break; - } - } - } - - System.out.println("Extracted ClassPath = " + classPath); - return classPath; - } - - public void runJavaWithClassPath(String classPath, String mainClass) { - try { - ProcessBuilder pb = new ProcessBuilder("java", "-classpath", classPath, mainClass); - pb.inheritIO(); - pb.start().waitFor(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/JarRunner.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/JarRunner.java deleted file mode 100644 index 6a722c8a1..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/JarRunner.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.flyspring.flyfly.commands.run; - -import java.io.File; -import java.io.IOException; - -import org.apache.commons.lang3.SystemUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.flyspring.flyfly.utils.FileTools; -import com.flyspring.flyfly.utils.ProjectSetup; - -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -public class JarRunner { - @Autowired ProjectSetup projectSetup; - @Autowired FileTools fileTools; - - public void run(File jarFile) { - try { - log.info("Checking if glowroot agent exists"); - if (!projectSetup.glowrootAgentExists()) { - log.info("Agent doesn't exist"); - log.info("Adding glowroot agent"); - projectSetup.addGlowrootAgent(); - } - log.info("Runnng the jar"); - String agentPath = projectSetup.getGlowrootAgentPath(); - String jarPath = jarFile.getAbsolutePath(); - String[] command; - if (SystemUtils.IS_OS_WINDOWS) - command = new String[] {"cmd", "/c", "java -javaagent:" + agentPath + " -jar " + jarPath}; - else - command = new String[] {"bash", "-c", "java -javaagent:" + agentPath + " -jar " + jarPath}; - - ProcessBuilder pb = new ProcessBuilder(command); - pb.inheritIO(); - pb.start().waitFor(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/ProjectRunner.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/ProjectRunner.java deleted file mode 100644 index 01e49433b..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/ProjectRunner.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.flyspring.flyfly.commands.run; - -import java.io.*; -import java.nio.file.*; -import static java.nio.file.StandardWatchEventKinds.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.lang3.SystemUtils; -import org.codehaus.plexus.util.xml.pull.XmlPullParserException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.zeroturnaround.exec.ProcessExecutor; - -import com.flyspring.flyfly.utils.ProjectSetup; - -import jakarta.annotation.PreDestroy; -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -public class ProjectRunner { - @Autowired TestContainersStarter testContainersStarter; - @Autowired ProjectSetup projectSetup; - - Process runningProcess; - WatchService filesWatcher; - WatchService buildFileWatcher; - boolean allowInfrastructureServices; - - public void run() { - try { - log.info("Configuring the project"); - log.info("Checking if initscript exists"); - if (!projectSetup.initscriptExists()) { - log.info("Initscript doesn't exist"); - log.info("Adding flyfly.gradle to initscripts"); - projectSetup.addInitscript(); - } - projectSetup.addAutorouteJar(); - allowInfrastructureServices = isDockerInstalled(); - if (allowInfrastructureServices) checkAndConfigureServices(); - log.debug("registering watcher for src files changes"); - registerFilesWatcher(); - log.debug("registering watcher for build file changes"); - registerBuildFileWatcher(); - log.info("Starting the project"); - runTheProject(); - loop(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - boolean isDockerInstalled() throws IOException, InterruptedException { - log.info("Checking if docker is installed to allow infrastructure services"); - int exitCode; - try { - String[] command; - if (SystemUtils.IS_OS_WINDOWS) command = new String[] {"cmd", "/c", "docker", "info"}; - else command = new String[] {"docker", "info"}; - - exitCode = new ProcessExecutor().command(command).start().getProcess().waitFor(); - } catch (Exception e) { - exitCode = -1; - } - if (exitCode != 0) { - log.warn("Couldn't find docker. Disabling infrastructure services."); - return false; - } - return true; - } - - void runTheProject() throws IOException { - String[] command; - if (SystemUtils.IS_OS_WINDOWS) command = new String[] {"cmd", "/c", "gradlew.bat", "bootRun"}; - else command = new String[] {"./gradlew", "bootRun"}; - - runningProcess = - new ProcessExecutor().command(command).redirectOutput(System.out).start().getProcess(); - } - - void checkAndConfigureServices() throws IOException { - log.info("Checking if services are needed"); - Set supportedDBGroupIds = - Set.of("mysql", "com.mysql", "org.postgresql", "org.mariadb.jdbc"); - BufferedReader reader = new BufferedReader(new FileReader("build.gradle")); - String line; - while ((line = reader.readLine()) != null) { - if (line.contains("dependencies")) { - while ((line = reader.readLine()) != null) { - int start = line.indexOf("\'"); - int end = line.indexOf(":"); - if (start < 0 || end < 0) continue; - String groupID = line.substring(start + 1, end); - if (supportedDBGroupIds.contains(groupID)) { - if (!testContainersStarter.isServiesNeeded()) break; - log.info("Found : " + groupID); - switch (groupID) { - case "mysql", "com.mysql" -> testContainersStarter.startMySQL(); - case "org.postgresql" -> testContainersStarter.startPostgreSQL(); - case "org.mariadb.jdbc" -> testContainersStarter.startMariaDB(); - } - break; - } - } - break; - } - } - reader.close(); - } - - void registerBuildFileWatcher() throws IOException { - Path path = Paths.get(""); - buildFileWatcher = FileSystems.getDefault().newWatchService(); - path.register(buildFileWatcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); - } - - public void loop() throws IOException, InterruptedException, XmlPullParserException { - while (true) { - if (didFilesChange() && runningProcess.isAlive()) { - reloadTheProject(); - } - if (didBuildFileChange()) { - handleBuildFileChange(); - } - } - } - - void registerFilesWatcher() throws IOException { - Path path = Paths.get("src"); - filesWatcher = FileSystems.getDefault().newWatchService(); - Files.walkFileTree( - path, - new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - dir.register(filesWatcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); - return FileVisitResult.CONTINUE; - } - }); - } - - void reloadTheProject() throws IOException, InterruptedException { - destroyRunningProcess(); - runTheProject(); - } - - boolean didFilesChange() throws InterruptedException { - WatchKey key = filesWatcher.poll(500, TimeUnit.MILLISECONDS); - if (key == null) return false; - for (WatchEvent event : key.pollEvents()) {} - key.reset(); - if (!runningProcess.isAlive()) return false; - return true; - } - - boolean didBuildFileChange() throws InterruptedException { - WatchKey key = buildFileWatcher.poll(500, TimeUnit.MILLISECONDS); - if (key == null) return false; - boolean found = false; - for (WatchEvent event : key.pollEvents()) { - Path p = (Path) event.context(); - if (p.endsWith("build.gradle")) found = true; - } - key.reset(); - if (found) log.info("Detected build file change ..."); - return found; - } - - void handleBuildFileChange() throws IOException, InterruptedException { - destroyRunningProcess(); - if (allowInfrastructureServices) checkAndConfigureServices(); - runTheProject(); - } - - @PreDestroy - void destroyRunningProcess() throws InterruptedException, IOException { - if (runningProcess == null) return; - if (SystemUtils.IS_OS_WINDOWS) { - Runtime.getRuntime().exec("cmd.exe /c taskkill /f /t /pid " + runningProcess.pid()).waitFor(); - } else runningProcess.destroy(); - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/RunCommand.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/RunCommand.java deleted file mode 100644 index b029d8787..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/RunCommand.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.flyspring.flyfly.commands.run; - -import java.io.File; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.flyspring.flyfly.utils.ProjectTypeChecker; - -import lombok.extern.slf4j.Slf4j; -import picocli.CommandLine.Command; -import picocli.CommandLine.Parameters; - -@Component -@Command(name = "run", description = "Run a JAR or Gradle Spring Boot Application") -@Slf4j -public class RunCommand implements Runnable { - - @Parameters(hidden = true) - File[] files; - - @Autowired ProjectRunner projectRunner; - @Autowired ProjectTypeChecker projectTypeChecker; - @Autowired JarRunner jarRunner; - - @Override - public void run() { - if (files != null && files.length > 0) jarRunner.run(files[0]); - else if (projectTypeChecker.isGradleProject()) projectRunner.run(); - else { - log.error("Couldn't find build.gradle"); - log.error("Please try again inside the project directory"); - } - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/TestContainersStarter.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/TestContainersStarter.java deleted file mode 100644 index 81ae0efe3..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/commands/run/TestContainersStarter.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.flyspring.flyfly.commands.run; - -import java.io.*; -import java.nio.file.FileSystems; - -import org.springframework.stereotype.Component; -import org.testcontainers.containers.MariaDBContainer; -import org.testcontainers.containers.MySQLContainer; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.utility.DockerImageName; - -import jakarta.annotation.PreDestroy; -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -public class TestContainersStarter { - private static final String dbName = "test"; - private static final String userName = "test"; - private static final String password = "test"; - private MySQLContainer mysql; - private PostgreSQLContainer postgre; - private MariaDBContainer mariaDB; - private String flyflyTempTag = "#flyfly_temp_property"; - - public void startMySQL() throws IOException { - if (mysql != null && mysql.isRunning()) return; - log.info("Starting a temporary MySQL database."); - mysql = - new MySQLContainer<>(DockerImageName.parse("mysql:5.7")) - .withDatabaseName(dbName) - .withUsername(userName) - .withPassword(password); - mysql.addParameter("TC_MY_CNF", null); - mysql.start(); - log.info("Database started."); - log.info("DB URL: " + mysql.getJdbcUrl()); - log.info("DB Username: " + mysql.getUsername()); - log.info("DB Password: " + mysql.getPassword()); - addTempProperties(mysql.getJdbcUrl()); - } - - public void startPostgreSQL() throws IOException { - if (postgre != null && postgre.isRunning()) return; - log.info("Starting a temporary PostgreSQL database."); - postgre = - new PostgreSQLContainer<>("postgres:14.5") - .withDatabaseName(dbName) - .withUsername(userName) - .withPassword(password); - postgre.addParameter("TC_MY_CNF", null); - postgre.start(); - log.info("Database started."); - log.info("DB URL: " + postgre.getJdbcUrl()); - log.info("DB Username: " + postgre.getUsername()); - log.info("DB Password: " + postgre.getPassword()); - addTempProperties(postgre.getJdbcUrl()); - } - - public void startMariaDB() throws IOException { - if (postgre != null && postgre.isRunning()) return; - log.info("Starting a temporary MariaDB database."); - mariaDB = - new MariaDBContainer<>("mariadb:10.3.6") - .withDatabaseName(dbName) - .withUsername(userName) - .withPassword(password); - mariaDB.addParameter("TC_MY_CNF", null); - mariaDB.start(); - log.info("Database started."); - log.info("DB URL: " + mariaDB.getJdbcUrl()); - log.info("DB Username: " + mariaDB.getUsername()); - log.info("DB Password: " + mariaDB.getPassword()); - addTempProperties(mariaDB.getJdbcUrl()); - } - - public void addTempProperties(String url) throws IOException { - log.info("Appending temporary DB configuration to application.properties"); - BufferedWriter writer = new BufferedWriter(new FileWriter(getPropertiesPath(), true)); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.url=" + url); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.username=" + userName); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.password=" + password); - writer.flush(); - writer.close(); - } - - public void removeTempProperties() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(getPropertiesPath())); - StringBuilder sb = new StringBuilder(); - boolean tempNotFound = true; - String line; - while ((line = reader.readLine()) != null) { - if (line.contains(flyflyTempTag)) { - tempNotFound = false; - reader.readLine(); - continue; - } - sb.append(line + "\n"); - } - reader.close(); - if (tempNotFound) return; - - BufferedWriter writer = new BufferedWriter(new FileWriter(getPropertiesPath())); - writer.write(sb.toString()); - writer.flush(); - writer.close(); - } - - public boolean isServiesNeeded() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(getPropertiesPath())); - String line; - String datafield = "spring.datasource.url"; - while ((line = reader.readLine()) != null) { - if (line.contains(datafield)) { - reader.close(); - return false; - } - } - reader.close(); - return true; - } - - public String getPropertiesPath() { - String separator = FileSystems.getDefault().getSeparator(); - return System.getProperty("user.dir") - + separator - + "src" - + separator - + "main" - + separator - + "resources" - + separator - + "application.properties"; - } - - @PreDestroy - public void destroy() { - try { - removeTempProperties(); - } catch (IOException e) { - } - if (mysql != null && mysql.isRunning()) mysql.close(); - if (postgre != null && postgre.isRunning()) postgre.close(); - if (mariaDB != null && mariaDB.isRunning()) mariaDB.close(); - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/FileTools.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/FileTools.java deleted file mode 100644 index 34202eaf9..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/FileTools.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.flyspring.flyfly.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; - -import org.springframework.stereotype.Component; - -import lombok.extern.slf4j.Slf4j; -import net.lingala.zip4j.ZipFile; - -@Component -@Slf4j -public class FileTools { - public void exportFileTo(String file, String dest) throws IOException { - log.debug("Exporting " + file + " To " + dest); - InputStream resource = FileTools.class.getClassLoader().getResourceAsStream(file); - Files.copy(resource, Path.of(dest)); - log.debug("Exported successfully"); - } - - public void unzip(String zipFilePath, String destDir) throws IOException { - log.debug("Unzipping " + zipFilePath + " into " + destDir); - ZipFile zipFile = new ZipFile(zipFilePath); - zipFile.extractAll(destDir); - zipFile.close(); - log.debug("Unzipped successfully"); - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/ProjectSetup.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/ProjectSetup.java deleted file mode 100644 index 1bbfe8c3b..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/ProjectSetup.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.flyspring.flyfly.utils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileSystems; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -public class ProjectSetup { - @Autowired FileTools fileTools; - - private String userHome = System.getProperty("user.home"); - private String separator = FileSystems.getDefault().getSeparator(); - private String initscriptDir = - userHome + separator + ".gradle" + separator + "init.d" + separator + "flyfly.gradle"; - private String flyflyDir = System.getProperty("user.dir") + separator + ".flyfly"; - private String formatScriptDir = flyflyDir + separator + "format.gradle"; - private String autorouteDir = flyflyDir + separator + "autoroute.jar"; - private String glowrootDir = flyflyDir + separator + "glowroot"; - - public boolean initscriptExists() { - log.debug("Checking if flyfly.gradle exists in " + initscriptDir); - return new File(initscriptDir).exists(); - } - - public void addInitscript() throws IOException { - File initDir = new File(userHome + separator + ".gradle" + separator + "init.d"); - if (!initDir.exists()) initDir.mkdirs(); - fileTools.exportFileTo("flyfly.gradle", initscriptDir); - } - - public void addAutorouteJar() throws IOException { - File flyflyFolder = new File(flyflyDir); - if (!flyflyFolder.exists()) flyflyFolder.mkdirs(); - File autorouteFile = new File(autorouteDir); - if (!autorouteFile.exists() || (autorouteFile.exists() && autorouteFile.delete())) - fileTools.exportFileTo("autoroute.jar", autorouteDir); - } - - public boolean formatScriptExists() { - log.debug("Checking if format.gradle exists in " + formatScriptDir); - return new File(formatScriptDir).exists(); - } - - public void addFormatScript() throws IOException { - File flyflyFolder = new File(flyflyDir); - if (!flyflyFolder.exists()) flyflyFolder.mkdirs(); - fileTools.exportFileTo("format.gradle", formatScriptDir); - } - - public boolean glowrootAgentExists() { - log.debug("Checking if glowroot folder exists in " + glowrootDir); - return new File(glowrootDir).exists(); - } - - public void addGlowrootAgent() throws IOException { - File flyflyFolder = new File(flyflyDir); - if (!flyflyFolder.exists()) flyflyFolder.mkdirs(); - String zipDir = flyflyDir + separator + "glowroot.zip"; - fileTools.exportFileTo("glowroot.zip", zipDir); - fileTools.unzip(zipDir, flyflyDir); - new File(zipDir).delete(); - } - - public String getGlowrootAgentPath() { - return flyflyDir + separator + "glowroot" + separator + "glowroot.jar"; - } -} diff --git a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/ProjectTypeChecker.java b/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/ProjectTypeChecker.java deleted file mode 100644 index bde630777..000000000 --- a/FlySpring/flyfly/src/main/java/com/flyspring/flyfly/utils/ProjectTypeChecker.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.flyspring.flyfly.utils; - -import java.io.File; - -import org.springframework.stereotype.Component; - -@Component -public class ProjectTypeChecker { - public boolean isMavenProject() { - File dir = new File(System.getProperty("user.dir")); - for (File file : dir.listFiles()) if (file.getName().equals("pom.xml")) return true; - return false; - } - - public boolean isGradleProject() { - File dir = new File(System.getProperty("user.dir")); - for (File file : dir.listFiles()) if (file.getName().equals("build.gradle")) return true; - return false; - } -} diff --git a/FlySpring/flyfly/src/main/resources/META-INF/MANIFEST.MF b/FlySpring/flyfly/src/main/resources/META-INF/MANIFEST.MF deleted file mode 100644 index e40923c66..000000000 --- a/FlySpring/flyfly/src/main/resources/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: com.flyspring.flyfly.FlyflyApplication - diff --git a/FlySpring/flyfly/src/main/resources/application.properties b/FlySpring/flyfly/src/main/resources/application.properties deleted file mode 100644 index 15b81894c..000000000 --- a/FlySpring/flyfly/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.banner.location=classpath:banner.txt -#logging.level.root=WARN -logging.level.com.flyspring.flyfly.commands=INFO diff --git a/FlySpring/flyfly/src/main/resources/banner.txt b/FlySpring/flyfly/src/main/resources/banner.txt deleted file mode 100644 index 147151f98..000000000 --- a/FlySpring/flyfly/src/main/resources/banner.txt +++ /dev/null @@ -1,7 +0,0 @@ - ____ __ ____ __ - / __/ / / __ __ / __/ / / __ __ - / /_ / / / / / / / /_ / / / / / / - / __/ / / / /_/ / / __/ / / / /_/ / -/_/ /_/ \__, / /_/ /_/ \__, / - /____/ /____/ -Powered by Spring Boot ${spring-boot.version} \ No newline at end of file diff --git a/FlySpring/flyfly/src/main/resources/flyfly.gradle b/FlySpring/flyfly/src/main/resources/flyfly.gradle deleted file mode 100644 index 9b23ba1e0..000000000 --- a/FlySpring/flyfly/src/main/resources/flyfly.gradle +++ /dev/null @@ -1,6 +0,0 @@ -allprojects { - apply plugin: 'java' - dependencies { - implementation files('.flyfly/autoroute.jar') - } -} \ No newline at end of file diff --git a/FlySpring/flyfly/src/main/resources/format.gradle b/FlySpring/flyfly/src/main/resources/format.gradle deleted file mode 100644 index e5a857996..000000000 --- a/FlySpring/flyfly/src/main/resources/format.gradle +++ /dev/null @@ -1,24 +0,0 @@ -initscript { - repositories { - maven { url 'https://plugins.gradle.org/m2' } - } - dependencies { - classpath 'com.diffplug.spotless:spotless-plugin-gradle:6.12.0' - } -} -allprojects { - apply plugin: com.diffplug.gradle.spotless.SpotlessPlugin - spotless { - java { - target fileTree('.') { - include '**/*.java' - exclude '**/build/**', '**/build-*/**' - } - toggleOffOn() - googleJavaFormat() - removeUnusedImports() - trimTrailingWhitespace() - endWithNewline() - } - } -} diff --git a/FlySpring/flyfly/src/main/resources/glowroot.zip b/FlySpring/flyfly/src/main/resources/glowroot.zip deleted file mode 100644 index 00b2b7fc1..000000000 Binary files a/FlySpring/flyfly/src/main/resources/glowroot.zip and /dev/null differ diff --git a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/FlyflyApplicationTests.java b/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/FlyflyApplicationTests.java deleted file mode 100644 index a1e978fbd..000000000 --- a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/FlyflyApplicationTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.flyspring.flyfly; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class FlyflyApplicationTests { - - @Test - void contextLoads() {} -} diff --git a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/format/FormatCommandTest.java b/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/format/FormatCommandTest.java deleted file mode 100644 index f49862e56..000000000 --- a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/format/FormatCommandTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.flyspring.flyfly.commands.format; - -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import com.flyspring.flyfly.utils.ProjectTypeChecker; - -@ExtendWith(MockitoExtension.class) -class FormatCommandTest { - - @Mock private Formatter formatter; - - @Mock private ProjectTypeChecker projectTypeChecker; - - @Autowired private FormatCommand formatCommand; - - @BeforeEach - void setUp() { - formatCommand = new FormatCommand(); - formatCommand.formatter = formatter; - formatCommand.projectTypeChecker = projectTypeChecker; - } - - @Test - void testFormatWithGradleProject() { - when(projectTypeChecker.isGradleProject()).thenReturn(true); - formatCommand.run(); - verify(formatter, times(1)).format(); - verify(projectTypeChecker, times(1)).isGradleProject(); - } - - @Test - void testFormatWithNoGradleProject() { - when(projectTypeChecker.isGradleProject()).thenReturn(false); - formatCommand.run(); - verify(formatter, times(0)).format(); - verify(projectTypeChecker, times(1)).isGradleProject(); - } -} diff --git a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/jbang/JbangCommandTest.java b/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/jbang/JbangCommandTest.java deleted file mode 100644 index 60129fb05..000000000 --- a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/jbang/JbangCommandTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.flyspring.flyfly.commands.jbang; - -import static org.junit.Assert.assertNull; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.BufferedReader; -import java.io.File; -import java.io.StringReader; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class JbangCommandTest { - - private JbangCommand jbangCommand; - - @BeforeEach - void setUp() { - jbangCommand = new JbangCommand(); - } - - @Test - void testExtractFileFromResources_SuccessfulExtraction() throws Exception { - // Test resource path - String resourcePath = "/jbang.jar"; - - // Call the method - File extractedFile = jbangCommand.extractFileFromResources(resourcePath); - - // Assertions - assertNotNull(extractedFile); - assertTrue(extractedFile.exists()); - assertTrue(extractedFile.isFile()); - extractedFile.delete(); - } - - @Test - void testExtractFileFromResources_ResourceNotFound() throws Exception { - // Test resource path that doesn't exist - String resourcePath = "/nonexistent-resource.txt"; - - // Call the method - File extractedFile = jbangCommand.extractFileFromResources(resourcePath); - - // Assertion - assertNull(extractedFile); - } - - @Test - void testExtractFileFromResources_FileCreationAndCleanup() throws Exception { - // Test resource path - String resourcePath = "/jbang.jar"; - - // Call the method - File extractedFile = jbangCommand.extractFileFromResources(resourcePath); - - // Assertion - assertNotNull(extractedFile); - - extractedFile.delete(); - assertFalse(extractedFile.exists()); - } - - @Test - void testExtractClassPathFromOutput_NoClassPathFound() throws Exception { - // Prepare test input - String output = "/path/to/noClassPathFound"; - - BufferedReader bufferedReader = new BufferedReader(new StringReader(output)); - - // Call the method under test - JbangCommand jbangCommand = new JbangCommand(); - String classPath = jbangCommand.extractClassPathFromOutput(bufferedReader); - - // Verify assertions - assertNull(classPath); - } - - @Test - void testExtractClassPathFromOutput_EmptyOutput() throws Exception { - // Prepare empty test input - BufferedReader bufferedReader = new BufferedReader(new StringReader("")); - - // Call the method under test - JbangCommand jbangCommand = new JbangCommand(); - String classPath = jbangCommand.extractClassPathFromOutput(bufferedReader); - - // Verify assertions - assertNull(classPath); - } -} diff --git a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/run/RunCommandTest.java b/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/run/RunCommandTest.java deleted file mode 100644 index 00319e05b..000000000 --- a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/commands/run/RunCommandTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.flyspring.flyfly.commands.run; - -import static org.mockito.Mockito.*; -import java.io.File; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import com.flyspring.flyfly.utils.ProjectTypeChecker; - -@ExtendWith(MockitoExtension.class) -class RunCommandTest { - - @Mock private JarRunner jarRunner; - - @Mock private ProjectRunner projectRunner; - - @Mock private ProjectTypeChecker projectTypeChecker; - - @Autowired private RunCommand runCommand; - - @BeforeEach - void setUp() { - runCommand = new RunCommand(); - runCommand.jarRunner = jarRunner; - runCommand.projectRunner = projectRunner; - runCommand.projectTypeChecker = projectTypeChecker; - } - - @Test - void testRunWithJarFile() { - File[] jarFiles = {new File("test.jar")}; - runCommand.files = jarFiles; - runCommand.run(); - verify(jarRunner, times(1)).run(jarFiles[0]); - verify(projectRunner, times(0)).run(); - verify(projectTypeChecker, times(0)).isGradleProject(); - } - - @Test - void testRunWithGradleProject() { - File[] jarFiles = {}; - when(projectTypeChecker.isGradleProject()).thenReturn(true); - runCommand.files = jarFiles; - runCommand.run(); - verify(projectRunner, times(1)).run(); - verify(jarRunner, times(0)).run(any(File.class)); - } - - @Test - void testRunWithNoJarFileAndNoGradleProject() { - File[] jarFiles = {}; - when(projectTypeChecker.isGradleProject()).thenReturn(false); - runCommand.files = jarFiles; - runCommand.run(); - verify(projectRunner, times(0)).run(); - verify(jarRunner, times(0)).run(any(File.class)); - } -} diff --git a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/utils/FileToolsTest.java b/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/utils/FileToolsTest.java deleted file mode 100644 index baf9d2173..000000000 --- a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/utils/FileToolsTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.flyspring.flyfly.utils; - -import static org.junit.jupiter.api.Assertions.*; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class FileToolsTest { - - private FileTools fileTools; - - @BeforeEach - void setUp() { - fileTools = new FileTools(); - } - - @Test - void testUnzip() throws IOException { - // Create a zip file with two entries - Path tempDir = Files.createTempDirectory("test"); - File zipFile = new File(tempDir.toFile(), "test.zip"); - FileOutputStream fos = new FileOutputStream(zipFile); - ZipOutputStream zos = new ZipOutputStream(fos); - zos.putNextEntry(new ZipEntry("test1.txt")); - zos.write("test1".getBytes()); - zos.closeEntry(); - zos.putNextEntry(new ZipEntry("test2.txt")); - zos.write("test2".getBytes()); - zos.closeEntry(); - zos.close(); - - // Unzip the zip file to a destination directory - Path destDir = Files.createTempDirectory("test"); - fileTools.unzip(zipFile.getPath(), destDir.toString()); - - // Verify that the two entries were unzipped correctly - Path file1 = destDir.resolve("test1.txt"); - assertTrue(file1.toFile().exists()); - assertEquals("test1", Files.readString(file1)); - Path file2 = destDir.resolve("test2.txt"); - assertTrue(file2.toFile().exists()); - assertEquals("test2", Files.readString(file2)); - - // Clean up the temporary directories and files - Files.deleteIfExists(file1); - Files.deleteIfExists(file2); - Files.deleteIfExists(destDir); - Files.deleteIfExists(zipFile.toPath()); - Files.deleteIfExists(tempDir); - } -} diff --git a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/utils/ProjectTypeCheckerTest.java b/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/utils/ProjectTypeCheckerTest.java deleted file mode 100644 index df54a05a0..000000000 --- a/FlySpring/flyfly/src/test/java/com/flyspring/flyfly/utils/ProjectTypeCheckerTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.flyspring.flyfly.utils; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class ProjectTypeCheckerTest { - - private ProjectTypeChecker projectTypeChecker; - - @BeforeEach - public void setup() { - projectTypeChecker = new ProjectTypeChecker(); - } - - @Test - public void testIsMavenProject() throws IOException { - // Create a temporary directory and file - Path tempDirectory = Files.createTempDirectory("tempDir"); - Path tempFile = Files.createTempFile(tempDirectory, "test", ".txt"); - - // Check that the file is not named "pom.xml" - Assertions.assertFalse(tempFile.toFile().getName().equals("pom.xml")); - - // Move to the temporary directory and check if it is a Maven project - System.setProperty("user.dir", tempDirectory.toString()); - Assertions.assertFalse(projectTypeChecker.isMavenProject()); - - // Delete the temporary directory and file - Files.deleteIfExists(tempFile); - Files.deleteIfExists(tempDirectory); - } - - @Test - public void testIsGradleProject() throws IOException { - // Create a temporary directory and file - Path tempDirectory = Files.createTempDirectory("tempDir"); - Path tempFile = Files.createTempFile(tempDirectory, "test", ".txt"); - - // Check that the file is not named "build.gradle" - Assertions.assertFalse(tempFile.toFile().getName().equals("build.gradle")); - - // Move to the temporary directory and check if it is a Gradle project - System.setProperty("user.dir", tempDirectory.toString()); - Assertions.assertFalse(projectTypeChecker.isGradleProject()); - - // Delete the temporary directory and file - Files.deleteIfExists(tempFile); - Files.deleteIfExists(tempDirectory); - } -} diff --git a/FlySpring/readme.md b/FlySpring/readme.md deleted file mode 100644 index 891fc9f00..000000000 --- a/FlySpring/readme.md +++ /dev/null @@ -1,25 +0,0 @@ -# flyfly CLI -## Installation & Usage -cd to autoroute directory -```console -mvn clean package -P gofly -``` -cd to flyfly directory -```console -mvn clean package -P gofly -``` -Now cd into Examples/starter :- flyfly is ready to roll! -```bash -java -jar flyfly.jar -``` - -## Commands - -### run -Runs the Spring Boot application. if the project has jpa and a database driver(connector) in the build file and there is not 'spring.datasource.url' in the application.properties. Then the CLI will start a TestContainers database and add temporary values to application.properties to allow the application to run successfully. That's if the driver is supported by the CLI and Docker is installed. -Currently supported DBs are: MySQL, Postgres, and MariaDB. - -### format -Format the code using Spotless. - -P.S. - New examples will be added soon! \ No newline at end of file diff --git a/JS/.eslintrc.js b/JS/.eslintrc.js new file mode 100644 index 000000000..017786db8 --- /dev/null +++ b/JS/.eslintrc.js @@ -0,0 +1,31 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + }, + extends: "google", + overrides: [ + { + env: { + node: true, + }, + files: [".eslintrc.{js,cjs}"], + parserOptions: { + sourceType: "script", + }, + }, + ], + parserOptions: { + ecmaVersion: "latest", + }, + rules: { + "array-callback-return": "error", + "no-undef": "off", + "no-empty": "off", + "no-func-assign": "off", + "no-cond-assign": "off", + "no-constant-binary-expression": "error", + "no-constructor-return": "error", + }, +}; diff --git a/JS/README.md b/JS/README.md new file mode 100644 index 000000000..792d60054 --- /dev/null +++ b/JS/README.md @@ -0,0 +1 @@ +# diff --git a/JS/edgechains/arakoodev/.eslintignore b/JS/edgechains/arakoodev/.eslintignore new file mode 100644 index 000000000..77a684a28 --- /dev/null +++ b/JS/edgechains/arakoodev/.eslintignore @@ -0,0 +1,3 @@ +node_modules +dist +create-edgechains \ No newline at end of file diff --git a/JS/edgechains/arakoodev/.gitignore b/JS/edgechains/arakoodev/.gitignore new file mode 100644 index 000000000..8f00ef230 --- /dev/null +++ b/JS/edgechains/arakoodev/.gitignore @@ -0,0 +1,3 @@ +node_modules +.env +dist \ No newline at end of file diff --git a/JS/edgechains/arakoodev/.npmignore b/JS/edgechains/arakoodev/.npmignore new file mode 100644 index 000000000..e8310385c --- /dev/null +++ b/JS/edgechains/arakoodev/.npmignore @@ -0,0 +1 @@ +src \ No newline at end of file diff --git a/JS/edgechains/arakoodev/.prettierrrc.json b/JS/edgechains/arakoodev/.prettierrrc.json new file mode 100644 index 000000000..6013eeb51 --- /dev/null +++ b/JS/edgechains/arakoodev/.prettierrrc.json @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid" +} diff --git a/JS/edgechains/arakoodev/README.md b/JS/edgechains/arakoodev/README.md new file mode 100644 index 000000000..81237e662 --- /dev/null +++ b/JS/edgechains/arakoodev/README.md @@ -0,0 +1,5 @@ +Installation + +``` +npm install arakoodev +``` diff --git a/JS/edgechains/arakoodev/babel.config.cjs b/JS/edgechains/arakoodev/babel.config.cjs new file mode 100644 index 000000000..b35c286db --- /dev/null +++ b/JS/edgechains/arakoodev/babel.config.cjs @@ -0,0 +1,3 @@ +module.exports = { + presets: [["@babel/preset-env", { targets: { node: "current" } }]], +}; diff --git a/JS/edgechains/arakoodev/jest.config.cjs b/JS/edgechains/arakoodev/jest.config.cjs new file mode 100644 index 000000000..bf6fbe8a8 --- /dev/null +++ b/JS/edgechains/arakoodev/jest.config.cjs @@ -0,0 +1,10 @@ +module.exports = { + presets: [["@babel/preset-env", { targets: { node: "current" } }], "@babel/preset-typescript"], + testEnvironment: "jest-environment-jsdom", + transform: { + "^.+\\.ts?$": "ts-jest", + "^.+\\.tsx?$": "ts-jest", + "^.+\\.js?$": "babel-jest", + "^.+\\.jsx?$": "babel-jest", + }, +}; diff --git a/JS/edgechains/arakoodev/ormconfig.json b/JS/edgechains/arakoodev/ormconfig.json new file mode 100644 index 000000000..21819c00f --- /dev/null +++ b/JS/edgechains/arakoodev/ormconfig.json @@ -0,0 +1,11 @@ +{ + "type": "postgres", + "host": "db.rmzqtepwnzoxgkkzjctt.supabase.co", + "port": 5432, + "username": "postgres", + "password": "xaX0MYcf1YiJlChK", + "database": "postgres", + "entities": ["dist/entities/**/*.js"], + "synchronize": false, + "logging": false +} diff --git a/JS/edgechains/arakoodev/package.json b/JS/edgechains/arakoodev/package.json new file mode 100644 index 000000000..0b0bd3784 --- /dev/null +++ b/JS/edgechains/arakoodev/package.json @@ -0,0 +1,79 @@ +{ + "name": "@arakoodev/edgechains.js", + "version": "0.1.23", + "main": "dist/index.js", + "files": [ + "dist" + ], + "exports": { + "./ai": "./dist/ai/src/index.js", + "./vector-db": "./dist/vector-db/src/index.js", + "./document-loader": "./dist/document-loader/src/index.js", + "./splitter": "./dist/splitter/src/index.js", + "./arakooserver": "./dist/arakooserver/src/index.js", + "./db": "./dist/db/src/index.js", + "./scraper": "./dist/scraper/src/index.js", + "./sync-rpc": "./dist/sync-rpc/index.js" + }, + "scripts": { + "build": "rm -rf dist && tsc -b", + "lint": "eslint --ignore-path .eslintignore --ext .js,.ts", + "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"", + "test": "vitest" + }, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.24.4", + "@hono/node-server": "^0.6.0", + "@lifeomic/attempt": "^3.1.0", + "@playwright/test": "^1.45.3", + "@supabase/supabase-js": "^2.42.3", + "axios": "^1.7.4", + "axios-retry": "^4.1.0", + "cheerio": "^1.0.0-rc.12", + "cors": "^2.8.5", + "document": "^0.4.7", + "dts-bundle-generator": "^9.3.1", + "esbuild": "^0.20.2", + "hono": "3.9", + "jest-environment-jsdom": "^29.7.0", + "jsdom": "^24.1.0", + "node-html-parser": "^6.1.13", + "pdf-parse": "^1.1.1", + "pg": "^8.11.5", + "playwright": "^1.45.1", + "prettier": "^3.2.5", + "regenerator-runtime": "^0.14.1", + "request": "^2.88.2", + "retell-client-js-sdk": "^2.0.4", + "retell-sdk": "^4.9.0", + "retry": "^0.13.1", + "ts-node": "^10.9.2", + "typeorm": "^0.3.20", + "vitest": "^2.0.3", + "youtube-transcript": "^1.2.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.0" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/preset-typescript": "^7.24.1", + "@types/cors": "^2.8.17", + "@types/jest": "^29.5.12", + "@types/node": "^20.17.2", + "@types/pdf-parse": "^1.1.4", + "@types/ws": "^8.5.12", + "buffer": "^6.0.3", + "crypto-browserify": "^3.12.1", + "jest": "^29.7.0", + "process": "^0.11.10", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "ts-jest": "^29.1.2", + "ts-loader": "^9.5.1", + "typescript": "^5.6.3", + "util": "^0.12.5" + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/index.ts b/JS/edgechains/arakoodev/src/ai/src/index.ts new file mode 100644 index 000000000..d2ccf0eb0 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/index.ts @@ -0,0 +1,6 @@ +export { OpenAI } from "./lib/openai/openai.js"; +export { GeminiAI } from "./lib/gemini/gemini.js"; +export { Palm2AI } from "./lib/palm2/palm2.js"; +export { LlamaAI } from "./lib/llama/llama.js"; +export { RetellAI } from "./lib/retell-ai/retell.js"; +export { RetellWebClient } from "./lib/retell-ai/retellWebClient.js"; diff --git a/JS/edgechains/arakoodev/src/ai/src/lib/gemini/gemini.ts b/JS/edgechains/arakoodev/src/ai/src/lib/gemini/gemini.ts new file mode 100644 index 000000000..13f1bfcd1 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/lib/gemini/gemini.ts @@ -0,0 +1,97 @@ +import axios from "axios"; +import { retry } from "@lifeomic/attempt"; +const url = "https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent"; + +interface GeminiAIConstructionOptions { + apiKey?: string; +} + +type SafetyRating = { + category: + | "HARM_CATEGORY_SEXUALLY_EXPLICIT" + | "HARM_CATEGORY_HATE_SPEECH" + | "HARM_CATEGORY_HARASSMENT" + | "HARM_CATEGORY_DANGEROUS_CONTENT"; + probability: "NEGLIGIBLE" | "LOW" | "MEDIUM" | "HIGH"; +}; + +type ContentPart = { + text: string; +}; + +type Content = { + parts: ContentPart[]; + role: string; +}; + +type Candidate = { + content: Content; + finishReason: string; + index: number; + safetyRatings: SafetyRating[]; +}; + +type UsageMetadata = { + promptTokenCount: number; + candidatesTokenCount: number; + totalTokenCount: number; +}; + +type Response = { + candidates: Candidate[]; + usageMetadata: UsageMetadata; +}; + +type responseMimeType = "text/plain" | "application/json"; + +interface GeminiAIChatOptions { + model?: string; + max_output_tokens?: number; + temperature?: number; + prompt: string; + max_retry?: number; + responseType?: responseMimeType; + delay?: number; +} + +export class GeminiAI { + apiKey: string; + constructor(options: GeminiAIConstructionOptions) { + this.apiKey = options.apiKey || process.env.GEMINI_API_KEY || ""; + } + + async chat(chatOptions: GeminiAIChatOptions): Promise { + let data = JSON.stringify({ + contents: [ + { + role: "user", + parts: [ + { + text: chatOptions.prompt, + }, + ], + }, + ], + }); + + let config = { + method: "post", + maxBodyLength: Infinity, + url, + headers: { + "Content-Type": "application/json", + "x-goog-api-key": this.apiKey, + }, + temperature: chatOptions.temperature || "0.7", + responseMimeType: chatOptions.responseType || "text/plain", + max_output_tokens: chatOptions.max_output_tokens || 1024, + data: data, + }; + return await retry( + async () => { + return (await axios.request(config)).data; + }, + { maxAttempts: chatOptions.max_retry || 3, delay: chatOptions.delay || 200 } + ); + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/lib/llama/llama.ts b/JS/edgechains/arakoodev/src/ai/src/lib/llama/llama.ts new file mode 100644 index 000000000..a577fcd30 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/lib/llama/llama.ts @@ -0,0 +1,104 @@ +import axios from "axios"; +import { role } from "../../types"; +import { retry } from "@lifeomic/attempt"; + +const url = "https://api.llama-api.com/chat/completions"; + +interface messageOption { + role: role; + content: string; + name?: string; +} + +interface llamaChatOptions { + model?: string; + role?: role; + max_tokens?: number; + temperature?: number; + prompt?: string; + messages?: messageOption[]; + stream?: boolean; + max_retry?: number; + delay?: number; +} +[]; + +export class LlamaAI { + apiKey: string; + queue: string[]; + constructor({ apiKey }: { apiKey: string }) { + this.apiKey = apiKey; + this.queue = []; + } + + async makeRequest(chatOptions: llamaChatOptions) { + try { + return await retry( + async () => { + return await axios.post( + url, + { + model: chatOptions.model || "llama-13b-chat", + messages: chatOptions.prompt + ? [ + { + role: chatOptions.role || "user", + content: chatOptions.prompt, + }, + ] + : chatOptions.messages, + max_tokens: chatOptions.max_tokens || 1024, + stream: chatOptions.stream || false, + temperature: chatOptions.temperature || 0.7, + }, + { + headers: { Authorization: "Bearer " + this.apiKey }, + } + ); + }, + { maxAttempts: chatOptions.max_retry || 3, delay: chatOptions.delay || 200 } + ); + } catch (error: any) { + console.log(error); + throw new Error(`Error while making request: ${error.message}`); + } + } + + async _runStreamForJupyter(apiRequestJson) { + const response = await this.makeRequest(apiRequestJson); + + for (const chunk of response.data) { + this.queue.push(chunk); + } + } + + async *getSequences() { + while (this.queue.length > 0) { + yield this.queue.shift(); + await new Promise((resolve) => setTimeout(resolve, 100)); + } + } + + async runStream(apiRequestJson) { + await this._runStreamForJupyter(apiRequestJson); + this.getSequences(); + } + + async runSync(apiRequestJson) { + const response = await this.makeRequest(apiRequestJson); + + if (response.status !== 200) { + throw new Error(`POST ${response.status} ${response.data.detail}`); + } + + return response.data; + } + + chat(chatOptions: llamaChatOptions) { + if (chatOptions.stream) { + return this.runStream(chatOptions); + } else { + return this.runSync(chatOptions); + } + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/lib/openai/openai.ts b/JS/edgechains/arakoodev/src/ai/src/lib/openai/openai.ts new file mode 100644 index 000000000..f60ba522f --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/lib/openai/openai.ts @@ -0,0 +1,306 @@ +import axios from "axios"; +import { zodToJsonSchema } from "zod-to-json-schema"; +import { z } from "zod"; +import { ChatModel, role } from "../../types/index"; +const openAI_url = "https://api.openai.com/v1/chat/completions"; + +interface OpenAIConstructionOptions { + apiKey?: string; + orgId?: string; +} + +interface messageOption { + role: role; + content: string; + name?: string; +} + +interface OpenAIChatOptions { + model?: ChatModel; + role?: role; + max_tokens?: number; + temperature?: number; + prompt?: string; + messages?: messageOption[]; + frequency_penalty?: number; +} + +interface chatWithFunctionOptions { + model?: ChatModel; + role?: role; + max_tokens?: number; + temperature?: number; + prompt?: string; + functions?: object | Array; + messages?: messageOption[]; + function_call?: string; +} + +interface ZodSchemaResponseOptions { + model?: ChatModel; + role?: role; + max_tokens?: number; + temperature?: number; + prompt: string; + schema: S; +} + +interface chatWithFunctionReturnOptions { + content: string; + function_call: { + name: string; + arguments: string; + }; +} + +interface OpenAIChatReturnOptions { + content: string; +} + +export class OpenAI { + apiKey: string; + orgId: string; + constructor(options: OpenAIConstructionOptions) { + this.apiKey = options.apiKey || process.env.OPENAI_API_KEY || ""; + this.orgId = options.orgId || process.env.OPENAI_ORG_ID || ""; + this.checkKeys(); + } + + private checkKeys(): void { + if (!this.apiKey) { + console.error( + "API key is missing. Please provide a valid OpenAI API key. You can add it in .env file as OPENAI_API_KEY" + ); + } + if (!this.orgId) { + console.warn( + "Organization ID is missing. Please provide a valid OpenAI Organization ID. You can add it in .env file as OPENAI_ORG_ID" + ); + } + } + + async chat(chatOptions: OpenAIChatOptions): Promise { + const response = await axios + .post( + openAI_url, + { + model: chatOptions.model || "gpt-3.5-turbo", + messages: chatOptions.prompt + ? [ + { + role: chatOptions.role || "user", + content: chatOptions.prompt, + }, + ] + : chatOptions.messages, + max_tokens: chatOptions.max_tokens || 256, + temperature: chatOptions.temperature || 0.7, + frequency_penalty: 1, + }, + { + headers: { + Authorization: "Bearer " + this.apiKey, + "content-type": "application/json", + "OpenAI-Organization": this.orgId, + }, + } + ) + .then((response) => { + return response.data.choices; + }) + .catch((error) => { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error); + } else { + console.log("Error creating request:", error.message); + } + }); + return response[0].message; + } + + async streamedChat(chatOptions: OpenAIChatOptions): Promise { + const response = await axios + .post( + openAI_url, + { + model: chatOptions.model || "gpt-3.5-turbo", + messages: chatOptions.prompt + ? [ + { + role: chatOptions.role || "user", + content: chatOptions.prompt, + }, + ] + : chatOptions.messages, + max_tokens: chatOptions.max_tokens || 256, + temperature: chatOptions.temperature || 0.7, + frequency_penalty: chatOptions.frequency_penalty || 1, + stream: true, + }, + { + headers: { + Authorization: "Bearer " + this.apiKey, + "content-type": "application/json", + "OpenAI-Organization": this.orgId, + }, + } + ) + .then((response) => { + return response.data.choices; + }) + .catch((error) => { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error); + } else { + console.log("Error creating request:", error.message); + } + }); + return response[0].message; + } + + async chatWithFunction( + chatOptions: chatWithFunctionOptions + ): Promise { + const response = await axios + .post( + openAI_url, + { + model: chatOptions.model || "gpt-3.5-turbo", + messages: chatOptions.prompt + ? [ + { + role: chatOptions.role || "user", + content: chatOptions.prompt, + }, + ] + : chatOptions.messages, + max_tokens: chatOptions.max_tokens || 1024, + temperature: chatOptions.temperature || 0.7, + functions: chatOptions.functions, + function_call: chatOptions.function_call || "auto", + }, + { + headers: { + Authorization: "Bearer " + this.apiKey, + "content-type": "application/json", + "OpenAI-Organization": this.orgId, + }, + } + ) + .then((response) => { + return response.data.choices; + }) + .catch((error) => { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error); + } else { + console.log("Error creating request:", error.message); + } + }); + return response[0].message; + } + + async generateEmbeddings({ input, model }: { input: string[]; model: string }): Promise { + const response = await axios + .post( + "https://api.openai.com/v1/embeddings", + { + model: model, + input, + }, + { + headers: { + Authorization: `Bearer ${this.apiKey}`, + "content-type": "application/json", + "OpenAI-Organization": this.orgId, + }, + } + ) + .then((response) => { + return response.data.data; + }) + .catch((error) => { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error.request); + } else { + console.log("Error creating request:", error.message); + } + }); + return response; + } + + async zodSchemaResponse( + chatOptions: ZodSchemaResponseOptions + ): Promise { + const jsonSchema = zodToJsonSchema(chatOptions.schema, { $refStrategy: "none" }); + const openAIFunctionCallDefinition = { + name: "generateSchema", + description: "Generate a schema based on provided details.", + parameters: jsonSchema, + }; + // Remembrer if any field like url or link is not available please create a dummy link based on the following prompt + const content = ` + You are a Schema generator that can generate answer based on given prompt and then return the response based on the give schema + Remembrer if any field like url or link is not available please create a dummy link based on the following prompt + + prompt: + ${chatOptions.prompt || ""} + `; + + const response = await axios + .post( + openAI_url, + { + model: chatOptions.model || "gpt-3.5-turbo-16k", + messages: [ + { + role: chatOptions.role || "user", + content, + }, + ], + functions: [openAIFunctionCallDefinition], + function_call: "auto", + max_tokens: chatOptions.max_tokens || 1000, + temperature: chatOptions.temperature || 0.7, + }, + { + headers: { + Authorization: "Bearer " + this.apiKey, + "content-type": "application/json", + "OpenAI-Organization": this.orgId, + }, + } + ) + .then((response) => { + return response.data.choices[0].message; + }) + .catch((error) => { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error); + } else { + console.log("Error creating request:", error.message); + } + }); + if (response) { + if (response.content) return response.content; + return chatOptions.schema.parse(JSON.parse(response.function_call.arguments)); + } else { + throw new Error("Response did not contain valid JSON."); + } + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/lib/palm2/palm2.ts b/JS/edgechains/arakoodev/src/ai/src/lib/palm2/palm2.ts new file mode 100644 index 000000000..c77cf6057 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/lib/palm2/palm2.ts @@ -0,0 +1,99 @@ +import axios from "axios"; + +export interface Palm2Message { + author: string; + content: string; +} + +export interface Palm2Example { + input: Palm2Message; + output: Palm2Message; +} + +export interface Palm2Prompt { + context?: string; + examples?: Palm2Example[]; + messages: Palm2Message[]; +} + +export interface Palm2Candidate { + author: string; + content: string; +} + +export interface Palm2GenerateMessageResponse { + candidates: Palm2Candidate[]; +} + +export interface Palm2ChatOptions { + model?: string; + prompt?: string; + messages?: Palm2Message[]; + context?: string; + examples?: Palm2Example[]; + temperature?: number; + top_p?: number; + top_k?: number; + candidate_count?: number; + max_output_tokens?: number; +} + +export interface Palm2ConstructionOptions { + apiKey?: string; +} + +const palm2BaseUrl = "https://generativelanguage.googleapis.com/v1beta2/models"; + +export class Palm2AI { + apiKey: string; + + constructor(options: Palm2ConstructionOptions) { + this.apiKey = options.apiKey || process.env.PALM_API_KEY || ""; + } + + private buildPrompt(chatOptions: Palm2ChatOptions): Palm2Prompt { + if (chatOptions.messages?.length) { + return { + context: chatOptions.context, + examples: chatOptions.examples, + messages: chatOptions.messages, + }; + } + + return { + context: chatOptions.context, + examples: chatOptions.examples, + messages: [ + { + author: "user", + content: chatOptions.prompt || "", + }, + ], + }; + } + + async chat( + chatOptions: Palm2ChatOptions, + ): Promise { + const model = chatOptions.model || "chat-bison-001"; + const response = await axios.post( + `${palm2BaseUrl}/${model}:generateMessage`, + { + prompt: this.buildPrompt(chatOptions), + temperature: chatOptions.temperature ?? 0.7, + top_p: chatOptions.top_p ?? 0.95, + top_k: chatOptions.top_k ?? 40, + candidate_count: chatOptions.candidate_count ?? 1, + max_output_tokens: chatOptions.max_output_tokens ?? 256, + }, + { + headers: { + "Content-Type": "application/json", + "x-goog-api-key": this.apiKey, + }, + }, + ); + + return response.data; + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/lib/retell-ai/retell.ts b/JS/edgechains/arakoodev/src/ai/src/lib/retell-ai/retell.ts new file mode 100644 index 000000000..7b347095a --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/lib/retell-ai/retell.ts @@ -0,0 +1,49 @@ +import Retell from "retell-sdk"; +import { AgentCreateParams, AgentResponse } from "retell-sdk/resources/agent.mjs"; +import { LlmResponse, LlmCreateParams } from "retell-sdk/resources/llm.mjs"; + +declare module "retell-sdk/resources/llm.mjs" { + interface LlmResponse { + llm_websocket_url: string; + } +} + +export class RetellAI { + retellClient: Retell; + llm: LlmResponse | null; + constructor(apiKey: string) { + this.retellClient = new Retell({ + apiKey: apiKey, + }); + this.llm = null; + } + + async createAgent( + body: AgentCreateParams, + options?: Retell.RequestOptions + ): Promise { + const defaultParams = { + voice_id: "11labs-Adrian", + agent_name: "Ryan", + llm_websocket_url: this?.llm?.llm_websocket_url, + }; + const keys = Object.keys(defaultParams); + for (let i = 0; i < keys.length; i++) { + if (keys[i] in body) { + delete defaultParams[keys[i]]; + } + } + const agent = await this.retellClient.agent.create({ ...defaultParams, ...body }, options); + return agent; + } + async createLLM(data?: LlmCreateParams): Promise { + const llm = await this.retellClient.llm.create(data || {}); + this.llm = llm; + return llm; + } + + async initiateWebCall(agent_id: string): Promise { + const webCallResponse = await this.retellClient.call.createWebCall({ agent_id }); + return webCallResponse.access_token; + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/lib/retell-ai/retellWebClient.ts b/JS/edgechains/arakoodev/src/ai/src/lib/retell-ai/retellWebClient.ts new file mode 100644 index 000000000..6920efc97 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/lib/retell-ai/retellWebClient.ts @@ -0,0 +1,20 @@ +import { RetellWebClient as RetellClient, StartCallConfig } from "retell-client-js-sdk"; + +export class RetellWebClient { + client: RetellClient; + constructor() { + this.client = new RetellClient(); + } + + on(event: string, callback: (...args: any[]) => void) { + return this.client.on(event, callback); + } + + async startCall(startCallConfig: StartCallConfig) { + return await this.client.startCall(startCallConfig); + } + + async stopCall(): Promise { + return this.client.stopCall(); + } +} diff --git a/JS/edgechains/arakoodev/src/ai/src/tests/openAiEndpoints.test.ts b/JS/edgechains/arakoodev/src/ai/src/tests/openAiEndpoints.test.ts new file mode 100644 index 000000000..b6ab6b654 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/tests/openAiEndpoints.test.ts @@ -0,0 +1,81 @@ +import axios from "axios"; +import { OpenAI } from "../../../../dist/openai/src/lib/endpoints/OpenAiEndpoint.js"; + +jest.mock("axios"); + +describe("ChatOpenAi", () => { + describe("generateResponse", () => { + test("should generate response from OpenAI", async () => { + const mockResponse = [ + { + message: { + content: "Test response", + }, + }, + ]; + + axios.post = jest.fn().mockResolvedValueOnce({ data: { choices: mockResponse } }); + const chatOpenAi = new OpenAI({ apiKey: "test_api_key" }); + const response = await chatOpenAi.chat({ prompt: "test prompt" }); + expect(response).toEqual("Test response"); + }); + }); + + describe("generateEmbeddings", () => { + test("should generate embeddings from OpenAI", async () => { + const mockResponse = { embeddings: "Test embeddings" }; + axios.post = jest.fn().mockResolvedValue({ data: { data: { choices: mockResponse } } }); + const chatOpenAi = new OpenAI({ apiKey: "test_api_key" }); + const res = await chatOpenAi.generateEmbeddings("test prompt"); + expect(res.choices.embeddings).toEqual("Test embeddings"); + }); + }); + + describe("chatWithAI", () => { + test("should chat with AI using multiple messages", async () => { + const mockResponse = [ + { + message: { + content: "Test response 1", + }, + }, + { + message: { + content: "Test response 2", + }, + }, + ]; + axios.post = jest.fn().mockResolvedValueOnce({ data: { choices: mockResponse } }); + const chatOpenAi = new OpenAI({ apiKey: "test_api_key" }); + const chatMessages = [ + { + role: "user", + content: "message 1", + }, + { + role: "agent", + content: "message 2", + }, + ]; + //@ts-ignore + const responses = await chatOpenAi.chat({ messages: chatMessages }); + expect(responses).toEqual(mockResponse); + }); + }); + + describe("testResponseGeneration", () => { + test("should generate test response from OpenAI", async () => { + const mockResponse = [ + { + message: { + content: "Test response", + }, + }, + ]; + axios.post = jest.fn().mockResolvedValueOnce({ data: { choices: mockResponse } }); + const chatOpenAi = new OpenAI({ apiKey: "test_api_key" }); + const response = await chatOpenAi.chat({ prompt: "test prompt" }); + expect(response).toEqual("Test response"); + }); + }); +}); diff --git a/JS/edgechains/arakoodev/src/ai/src/tests/palm2/palm2.test.ts b/JS/edgechains/arakoodev/src/ai/src/tests/palm2/palm2.test.ts new file mode 100644 index 000000000..df0b46eb3 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/tests/palm2/palm2.test.ts @@ -0,0 +1,80 @@ +import axios from "axios"; +import { describe, expect, it, vi } from "vitest"; +import { Palm2AI } from "../../lib/palm2/palm2"; + +vi.mock("axios", () => ({ + default: { + post: vi.fn(), + }, +})); + +describe("Palm2AI", () => { + it("sends a prompt to the Palm2 generateMessage endpoint", async () => { + const mockResponse = { + candidates: [{ author: "model", content: "Palm2 response" }], + }; + vi.mocked(axios.post).mockResolvedValueOnce({ data: mockResponse } as never); + + const palm2 = new Palm2AI({ apiKey: "test-api-key" }); + const response = await palm2.chat({ + prompt: "hello palm2", + model: "chat-bison-001", + }); + + expect(response).toEqual(mockResponse); + expect(axios.post).toHaveBeenCalledWith( + "https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage", + expect.objectContaining({ + prompt: { + messages: [{ author: "user", content: "hello palm2" }], + }, + }), + expect.objectContaining({ + headers: expect.objectContaining({ + "x-goog-api-key": "test-api-key", + }), + }), + ); + }); + + it("uses explicit messages and request tuning options", async () => { + const mockResponse = { + candidates: [{ author: "model", content: "ok" }], + }; + vi.mocked(axios.post).mockResolvedValueOnce({ data: mockResponse } as never); + + const palm2 = new Palm2AI({ apiKey: "test-api-key" }); + await palm2.chat({ + model: "chat-bison-001", + messages: [ + { author: "user", content: "question" }, + { author: "model", content: "answer" }, + ], + context: "You are helpful.", + temperature: 0.2, + top_p: 0.9, + top_k: 20, + candidate_count: 2, + max_output_tokens: 128, + }); + + expect(axios.post).toHaveBeenCalledWith( + "https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage", + expect.objectContaining({ + prompt: { + context: "You are helpful.", + messages: [ + { author: "user", content: "question" }, + { author: "model", content: "answer" }, + ], + }, + temperature: 0.2, + top_p: 0.9, + top_k: 20, + candidate_count: 2, + max_output_tokens: 128, + }), + expect.any(Object), + ); + }); +}); diff --git a/JS/edgechains/arakoodev/src/ai/src/tests/streaming.test.ts b/JS/edgechains/arakoodev/src/ai/src/tests/streaming.test.ts new file mode 100644 index 000000000..603353dd7 --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/tests/streaming.test.ts @@ -0,0 +1,79 @@ +import { Stream } from "../../../../dist/openai/src/lib/streaming/OpenAiStreaming.js"; +import { TextEncoder, TextDecoder } from "text-decoding"; +jest.mock("../lib/streaming/OpenAiStreaming.ts", () => { + return { + Stream: jest.fn().mockImplementation(() => ({ + OpenAIStream: jest.fn().mockImplementation((prompt) => { + return new ReadableStream({ + start(controller) { + controller.enqueue( + new TextEncoder().encode('[{"choices":[{"delta":{"content":"Hi! "}}]}]') + ); + controller.enqueue( + new TextEncoder().encode('[{"choices":[{"delta":{"content":"How "}}]}]') + ); + controller.enqueue( + new TextEncoder().encode('[{"choices":[{"delta":{"content":"can "}}]}]') + ); + controller.enqueue( + new TextEncoder().encode('[{"choices":[{"delta":{"content":"I "}}]}]') + ); + controller.enqueue( + new TextEncoder().encode( + '[{"choices":[{"delta":{"content":"help "}}]}]' + ) + ); + controller.enqueue( + new TextEncoder().encode( + '[{"choices":[{"delta":{"content":"you?."}}]}]' + ) + ); + controller.enqueue(new TextEncoder().encode("[DONE]")); + controller.close(); + }, + }); + }), + })), + }; +}); + +describe("Streaming", () => { + afterEach(() => { + jest.clearAllMocks(); // Clear mock function calls after each test + }); + + test("OpenAIStream should return expected text", async () => { + const options = { + model: "test_model", + OpenApiKey: "test_api_key", + temperature: 0.7, + top_p: 1, + frequency_penalty: 0, + presence_penalty: 0, + max_tokens: 500, + stream: true, + n: 1, + }; + + const stream = new Stream(options); + + //@ts-ignore + const streamReader = await stream.OpenAIStream("hi").getReader(); + const text = await readStreamToString(streamReader); + + expect(text).toBe("Hi! How can I help you?."); + }); +}); + +async function readStreamToString(reader) { + const decoder = new TextDecoder(); + let text = ""; + while (true) { + const { value, done } = await reader.read(); + if (done) break; + const decodedValue = decoder.decode(value); + if (decodedValue.includes("DONE")) break; + text += JSON.parse(decodedValue)[0]["choices"][0]["delta"]["content"]; + } + return text; +} diff --git a/JS/edgechains/arakoodev/src/ai/src/types/index.ts b/JS/edgechains/arakoodev/src/ai/src/types/index.ts new file mode 100644 index 000000000..33485f21a --- /dev/null +++ b/JS/edgechains/arakoodev/src/ai/src/types/index.ts @@ -0,0 +1,24 @@ +export type ChatModel = + | "gpt-4o" + | "gpt-4o-2024-05-13" + | "gpt-4-turbo" + | "gpt-4-turbo-2024-04-09" + | "gpt-4-0125-preview" + | "gpt-4-turbo-preview" + | "gpt-4-1106-preview" + | "gpt-4-vision-preview" + | "gpt-4" + | "gpt-4-0314" + | "gpt-4-0613" + | "gpt-4-32k" + | "gpt-4-32k-0314" + | "gpt-4-32k-0613" + | "gpt-3.5-turbo" + | "gpt-3.5-turbo-16k" + | "gpt-3.5-turbo-0301" + | "gpt-3.5-turbo-0613" + | "gpt-3.5-turbo-1106" + | "gpt-3.5-turbo-0125" + | "gpt-3.5-turbo-16k-0613"; + +export type role = "user" | "assistant" | "system"; diff --git a/JS/edgechains/arakoodev/src/arakooserver/src/index.ts b/JS/edgechains/arakoodev/src/arakooserver/src/index.ts new file mode 100644 index 000000000..3cbedd9f9 --- /dev/null +++ b/JS/edgechains/arakoodev/src/arakooserver/src/index.ts @@ -0,0 +1 @@ +export { ArakooServer } from "./lib/hono/hono.js"; diff --git a/JS/edgechains/arakoodev/src/arakooserver/src/lib/hono/hono.ts b/JS/edgechains/arakoodev/src/arakooserver/src/lib/hono/hono.ts new file mode 100644 index 000000000..a05a9c738 --- /dev/null +++ b/JS/edgechains/arakoodev/src/arakooserver/src/lib/hono/hono.ts @@ -0,0 +1,39 @@ +// src/arakooServer.ts +// import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { cors } from "hono/cors"; + +export class ArakooServer { + app: Hono; + + constructor() { + this.app = new Hono(); + } + + useCors(allowedEndpoints?: string, options?: any) { + this.app.use(allowedEndpoints || "*", cors(options)); + } + + createApp(): Hono { + return this.app; + } + + listen(port: number) { + const portNumber = port || 3000; + if (process.env.arakoo) { + this.app.fire(); + } else { + import("@hono/node-server").then((module) => { + module.serve( + { + fetch: this.app.fetch, + port: portNumber, + }, + () => { + console.log(`Server running on port ${portNumber}`); + } + ); + }); + } + } +} diff --git a/JS/edgechains/arakoodev/src/arakooserver/src/tests/hono/hono.test.ts b/JS/edgechains/arakoodev/src/arakooserver/src/tests/hono/hono.test.ts new file mode 100644 index 000000000..500ca557e --- /dev/null +++ b/JS/edgechains/arakoodev/src/arakooserver/src/tests/hono/hono.test.ts @@ -0,0 +1,12 @@ +import { ArakooServer } from "../../../../../dist/arakooserver/src/lib/hono/hono.js"; +import { Hono } from "hono"; +import { describe, expect, it } from "vitest"; +describe("ArakooServer", () => { + let arakooServer = new ArakooServer(); + + test("createApp should return an instance of Hono", () => { + const app = arakooServer.createApp(); + + expect(app).toBeInstanceOf(Hono); + }, 10000); +}); diff --git a/JS/edgechains/arakoodev/src/db/src/index.ts b/JS/edgechains/arakoodev/src/db/src/index.ts new file mode 100644 index 000000000..1fcbf8b51 --- /dev/null +++ b/JS/edgechains/arakoodev/src/db/src/index.ts @@ -0,0 +1 @@ +export { PostgresClient } from "./lib/postgres-client/PostgresClient.js"; diff --git a/JS/edgechains/arakoodev/src/db/src/lib/postgres-client/PostgresClient.ts b/JS/edgechains/arakoodev/src/db/src/lib/postgres-client/PostgresClient.ts new file mode 100644 index 000000000..b586ab00c --- /dev/null +++ b/JS/edgechains/arakoodev/src/db/src/lib/postgres-client/PostgresClient.ts @@ -0,0 +1,106 @@ +import { createConnection, getManager } from "typeorm"; +export class PostgresClient { + wordEmbeddings: number[][]; + metric: PostgresDistanceMetric; + topK: number; + probes: number; + tableName: string; + namespace: string; + arkRequest: any; + upperLimit: number; + + constructor( + wordEmbeddings: number[][], + metric: PostgresDistanceMetric, + topK: number, + probes: number, + tableName: string, + namespace: string, + arkRequest: any, + upperLimit: number + ) { + this.wordEmbeddings = wordEmbeddings; + this.metric = metric; + this.topK = topK; + this.probes = probes; + this.tableName = tableName; + this.namespace = namespace; + this.arkRequest = arkRequest; + this.upperLimit = upperLimit; + } + + async dbQuery() { + const connection = await createConnection(); + const entityManager = await getManager(); + try { + const query1 = `SET LOCAL ivfflat.probes = ${this.probes};`; + await entityManager.query(query1); + + let query: string = ""; + + for (let i = 0; i < this.wordEmbeddings.length; i++) { + const embedding: string = JSON.stringify(this.wordEmbeddings[i]); + + query += `( SELECT id, raw_text, document_date, metadata, namespace, filename, timestamp, + ${this.arkRequest.textWeight.baseWeight} / (ROW_NUMBER() OVER (ORDER BY text_rank DESC) + ${this.arkRequest.textWeight.fineTuneWeight}) + + ${this.arkRequest.similarityWeight.baseWeight} / (ROW_NUMBER() OVER (ORDER BY similarity DESC) + ${this.arkRequest.similarityWeight.fineTuneWeight}) + + ${this.arkRequest.dateWeight.baseWeight} / (ROW_NUMBER() OVER (ORDER BY date_rank DESC) + ${this.arkRequest.dateWeight.fineTuneWeight}) AS rrf_score + FROM ( SELECT sv.id, sv.raw_text, sv.namespace, sv.filename, sv.timestamp, svtm.document_date, svtm.metadata, ts_rank_cd(sv.tsv, plainto_tsquery('${"english"}', '${this.arkRequest.query}')) AS text_rank, `; + + if (this.metric === PostgresDistanceMetric.COSINE) + query += `1 - (sv.embedding <=> '${embedding}') AS similarity, `; + if (this.metric === PostgresDistanceMetric.IP) + query += `(sv.embedding <#> '${embedding}') * -1 AS similarity, `; + if (this.metric === PostgresDistanceMetric.L2) + query += `sv.embedding <-> '${embedding}' AS similarity, `; + + query += `CASE WHEN svtm.document_date IS NULL THEN 0 ELSE EXTRACT(YEAR FROM svtm.document_date) * 365 + EXTRACT(DOY FROM svtm.document_date) END AS date_rank FROM (SELECT id, raw_text, embedding, tsv, namespace, filename, timestamp from ${this.tableName} WHERE namespace = '${this.namespace}'`; + + if (this.metric === PostgresDistanceMetric.COSINE) + query += ` ORDER BY embedding <=> '${embedding}' LIMIT ${this.topK}`; + if (this.metric === PostgresDistanceMetric.IP) + query += ` ORDER BY embedding <#> '${embedding}' LIMIT ${this.topK}`; + if (this.metric === PostgresDistanceMetric.L2) + query += ` ORDER BY embedding <-> '${embedding}' LIMIT ${this.topK}`; + + query += `) sv JOIN ${this.tableName}_join_${this.arkRequest.metadataTable} jtm ON sv.id = jtm.id JOIN ${this.tableName}_${this.arkRequest.metadataTable} svtm ON jtm.metadata_id = svtm.metadata_id) subquery `; + + switch (this.arkRequest.orderRRF) { + case "text_rank": + query += `ORDER BY text_rank DESC, rrf_score DESC`; + break; + case "similarity": + query += `ORDER BY similarity DESC, rrf_score DESC`; + break; + case "date_rank": + query += `ORDER BY date_rank DESC, rrf_score DESC`; + break; + case "default": + query += `ORDER BY rrf_score DESC`; + break; + } + + query += ` LIMIT ${this.topK})`; + if (i < this.wordEmbeddings.length - 1) { + query += " UNION ALL \n"; + } + } + + if (this.wordEmbeddings.length > 1) { + query = `SELECT * FROM (SELECT DISTINCT ON (result.id) * FROM ( ${query} ) result) subquery ORDER BY rrf_score DESC LIMIT ${this.upperLimit};`; + } else { + query += ` ORDER BY rrf_score DESC LIMIT ${this.topK};`; + } + const results = await entityManager.query(query); + return results; + } finally { + await connection.close(); + } + } +} + +export enum PostgresDistanceMetric { + COSINE = "COSINE", + IP = "IP", + L2 = "L2", +} diff --git a/JS/edgechains/arakoodev/src/db/src/tests/postgres-client/postgresClient.test.ts b/JS/edgechains/arakoodev/src/db/src/tests/postgres-client/postgresClient.test.ts new file mode 100644 index 000000000..3d0cd8e0f --- /dev/null +++ b/JS/edgechains/arakoodev/src/db/src/tests/postgres-client/postgresClient.test.ts @@ -0,0 +1,55 @@ +import { createConnection, getManager } from "typeorm"; +import { + PostgresClient, + PostgresDistanceMetric, +} from "../../../../../dist/db/src/lib/postgres-client/PostgresClient.js"; + +// Mock createConnection and getManager functions from TypeORM +jest.mock("typeorm", () => ({ + createConnection: jest.fn(), + getManager: jest.fn(), +})); + +describe("PostgresClient", () => { + let postgresClient: PostgresClient; + + beforeEach(() => { + // Initialize a new PostgresClient instance with mock parameters + postgresClient = new PostgresClient( + [], + PostgresDistanceMetric.COSINE, + 10, + 5, + "test_table", + "test_namespace", + { + textWeight: { baseWeight: 1, fineTuneWeight: 0.5 }, + similarityWeight: { baseWeight: 1, fineTuneWeight: 0.5 }, + dateWeight: { baseWeight: 1, fineTuneWeight: 0.5 }, + orderRRF: "text_rank", + metadataTable: "test_metadata", + query: "test_query", + }, + 100 + ); + }); + + afterEach(() => { + jest.clearAllMocks(); // Clear mock function calls after each test + }); + + test("dbQuery should generate the correct SQL query", async () => { + // Mock the entityManager query function + const mockQuery = jest.fn().mockResolvedValue([]); + (getManager as jest.Mock).mockResolvedValueOnce({ query: mockQuery }); + + // Mock the createConnection function + (createConnection as jest.Mock).mockResolvedValueOnce({ close: jest.fn() }); + + // Call the dbQuery method + await postgresClient.dbQuery(); + + // Check that the correct SQL query was generated + expect(mockQuery).toHaveBeenCalledWith(expect.any(String)); + }); +}); diff --git a/JS/edgechains/arakoodev/src/document-loader/src/index.ts b/JS/edgechains/arakoodev/src/document-loader/src/index.ts new file mode 100644 index 000000000..26048df54 --- /dev/null +++ b/JS/edgechains/arakoodev/src/document-loader/src/index.ts @@ -0,0 +1,2 @@ +export { PdfLoader } from "./lib/pdf-loader/pdfLoader.js"; +export { YoutubeLoader } from "./lib/youtube-video-transcript-loader/youtubeLoader.js"; diff --git a/JS/edgechains/arakoodev/src/document-loader/src/lib/pdf-loader/pdfLoader.ts b/JS/edgechains/arakoodev/src/document-loader/src/lib/pdf-loader/pdfLoader.ts new file mode 100644 index 000000000..8d9e5ff2f --- /dev/null +++ b/JS/edgechains/arakoodev/src/document-loader/src/lib/pdf-loader/pdfLoader.ts @@ -0,0 +1,30 @@ +import pdf from "pdf-parse/lib/pdf-parse.js"; + +export class PdfLoader { + pdfBuffer: Buffer; + constructor(pdfBuffer) { + this.pdfBuffer = pdfBuffer; + } + + async loadPdf() { + try { + // Convert Buffer to ArrayBuffer + const arrayBuffer = this.bufferToArrayBuffer(this.pdfBuffer); + + // Parse PDF using pdf-parse library + const pdfData = await pdf(arrayBuffer); + return pdfData.text; + } catch (error) { + console.error("Error loading PDF:", error); + throw error; + } + } + + bufferToArrayBuffer(buffer: Buffer) { + // Create a new Uint8Array based on the Buffer + const uint8Array = new Uint8Array(buffer); + + // Create ArrayBuffer from Uint8Array + return uint8Array.buffer; + } +} diff --git a/JS/edgechains/arakoodev/src/document-loader/src/lib/youtube-video-transcript-loader/youtubeLoader.ts b/JS/edgechains/arakoodev/src/document-loader/src/lib/youtube-video-transcript-loader/youtubeLoader.ts new file mode 100644 index 000000000..ad41e6737 --- /dev/null +++ b/JS/edgechains/arakoodev/src/document-loader/src/lib/youtube-video-transcript-loader/youtubeLoader.ts @@ -0,0 +1,16 @@ +import { YoutubeTranscript } from "youtube-transcript"; + +export class YoutubeLoader { + private videoUrl: string; + private transcript: YoutubeTranscript[] | null; + + constructor(videoUrl: string) { + this.videoUrl = videoUrl; + this.transcript = null; + } + + async loadTranscript() { + this.transcript = await YoutubeTranscript.fetchTranscript(this.videoUrl); + return this.transcript.map((t: any) => t.text).join(" "); + } +} diff --git a/JS/edgechains/arakoodev/src/document-loader/src/tests/pdf-loader/pdfLoader.test.ts b/JS/edgechains/arakoodev/src/document-loader/src/tests/pdf-loader/pdfLoader.test.ts new file mode 100644 index 000000000..15746cac5 --- /dev/null +++ b/JS/edgechains/arakoodev/src/document-loader/src/tests/pdf-loader/pdfLoader.test.ts @@ -0,0 +1,36 @@ +import { PdfLoader } from "../../../../../dist/document-loader/src/lib/pdf-loader/pdfLoader.js"; + +// Mock the pdf-parse library +jest.mock("pdf-parse/lib/pdf-parse", () => { + return jest.fn().mockResolvedValue({ text: "Mock PDF text" }); +}); + +describe("PdfLoader", () => { + it("should load PDF data from buffer", async () => { + // Create a mock PDF buffer + const pdfBuffer = Buffer.from("Mock PDF Buffer"); + + // Create an instance of PdfLoader with the mock PDF buffer + const pdfLoader = new PdfLoader(pdfBuffer); + + // Call the loadPdf method + const pdfText = await pdfLoader.loadPdf(); + + expect(pdfText).toEqual("Mock PDF text"); + }); + it("should load PDF data from buffer", async () => { + // Create a mock PDF buffer + const pdfBuffer = Buffer.from( + "Expect that the loadPdf method returns the PDF text from the mock response" + ); + + // Create an instance of PdfLoader with the mock PDF buffer + const pdfLoader = new PdfLoader(pdfBuffer); + + // Call the loadPdf method + const pdfText = await pdfLoader.loadPdf(); + + // Expect that the loadPdf method returns the PDF text from the mock response + expect(pdfText).toEqual("Mock PDF text"); + }); +}); diff --git a/JS/edgechains/arakoodev/src/scraper/src/actions/index.ts b/JS/edgechains/arakoodev/src/scraper/src/actions/index.ts new file mode 100644 index 000000000..855cac38c --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/actions/index.ts @@ -0,0 +1,322 @@ +import { expect, Page } from "@playwright/test"; +import { parseSite } from "../utils/index.js"; +import { removeBlankTags } from "../utils/page-parser.js"; + +const AsyncFunction = async function () {}.constructor; + +export async function generatePrompt(page: Page, userTask: string) { + const [currentPageUrl, currentPageTitle, siteOverview] = await Promise.all([ + page.evaluate("location.href"), + page.evaluate("document.title"), + parseSite(page).then((html) => removeBlankTags(html).slice(0, 20000)), + ]).catch((error: any) => { + console.log(error.message + " " + error.stack); + return error.message + " " + error.stack; + }); + + const systemPrompt = ` + You are a Senior SDET tasked with writing Playwright code for testing purposes. Your role involves implementing specific task-based code segments within a larger test file, following the instructions provided closely. Assume that common imports like 'test' and 'expect' from '@playwright/test' are already at the top of the file. + + Context: + - Your computer is a Mac. Cmd is the meta key, META. + - The browser is already open. + - Current page URL: ${currentPageUrl}. + - Current page title: ${currentPageTitle}. + - Overview of the site in HTML format: + \`\`\` + ${siteOverview} + \`\`\` + + Key Points: + - Start directly with Playwright actions as described in the user task, without adding extraneous steps or assertions. + - Include assertions like 'expect' statements or wait functions such as 'waitForLoadState' only when they are specifically requested in the user task. + - Minimal, relevant comments should be used to clarify complex actions or essential aspects of the test's purpose. + - Apply 'frameLocator' for content in nested iframes, as needed based on the task requirements. + + User Task: ${userTask} + + Expected Code Format: + \`\`\` + // [Insert Playwright code based on the task description. Begin with necessary actions directly, and include 'waitForLoadState', assertions, or 'expect' statements only if explicitly requested in the task. Comments should be concise and pertinent, especially for complex actions or decisions.] + \`\`\` + + The objective is to create Playwright code that is efficient, precise, and perfectly aligned with the task's requirements, integrating seamlessly into the larger test file. All actions and comments should be relevant and necessary, catering to a senior-level professional's understanding of the testing scenario.`; + + return systemPrompt; +} + +export function generateTaskArrPrompt(task: string) { + return ` + Given the following task description: + + ${task} + + Extract the key actions from this task and return them as an array of strings. Each action should be a separate string in the array. If the task description contains syntax errors or you think a command can be improved for better clarity and effectiveness, please make the necessary corrections and improvements. For example: + + Input: + "Go to Hacker News and click on the first link. Then give me all the text of this page." + + Response Format: + \`\`\` + {[ + "Navigate to the Hacker News website by entering the URL 'https://news.ycombinator.com/' in the browser", + "Identify and click on the first link displayed on the Hacker News homepage", + "Extract all the text from the page", + "Return that containt using return statement" + ]} + \`\`\` + + Input: + "Go to random website. we have fields in this pattern First Name Last Name Company Name Role in Company Address Email Phone Number and then fill this fields John Smith IT Solutions Analyst 98 North Road " + + 'Response Format: + \`\`\` + {[ + "Navigate to the random website by entering the URL 'https://www.randomwebsite.com/' in the browser", + "Fill the form fields with the following data: First Name: John, Last Name: Smith, Company Name: IT Solutions, Role in Company: Analyst, Address: 98 North Road, Email:", + ]} + \`\`\` + + Input: + "Go to google and search for the term 'automation'. Click on the first link and extract the text from the page." + + Response Format: + \`\`\` + {[ + "Navigate to the random website by entering the URL 'https://google.com' in the browser", + "Search for the term 'automation' in the search bar and hit Enter key", + "Click on the first link displayed in the search results", + "Extract all the text from the page", + "Return that containt using return statement" + ]} + \`\`\` + \n + Ensure that each action is specific, clear, and comprehensive to facilitate precise implementation. + `; +} + +export function handleHistory(goalsArr: string[]): { role: string; content: string }[] { + let goalsStr = ""; + for (let index = 0; index < goalsArr.length; index++) { + const element = goalsArr[index]; + goalsStr += `${index + 1}. Goal ${index + 1}: ${element}\n`; + } + + return [ + { + role: "system", + content: + `You are a Senior SDET tasked with writing Playwright code for testing purposes. Your role + involves implementing specific task-based code segments within a larger test file, following the + instructions provided closely. Assume that common imports like 'test' and 'expect' from '@playwright/test' are already at the top of the file.\n` + + 'Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications. We have three function to perform tasks "goToLink", "intractWithPage" and "findInPage". If any task have need to go to any url use or need go to a specific url use "goToLink" command. If any task takes more then 3 requests, use the "findInPage" command so we can try searching for the element using a function but do not use "findInPage" command unnecessary it has a cost.Otherwise use intractWithPage most of the times and Ensure that If you have completed all your tasks, make sure to use the "finish" command and args also should blank. do not use this command until each and every command completed successfully\n' + + "\n" + + "GOALS:\n" + + "\n" + + goalsStr + + "\n" + + `Key Points: + - Always include the "args" object with the necessary arguments for the command. This field is required and must not be omitted. + - Start directly with Playwright actions as described in the user task, without adding extraneous steps or assertions. + - Include assertions like 'expect' statements or wait functions such as 'waitForLoadState' only when they are specifically requested in the user task. + - Minimal, relevant comments should be used to clarify complex actions or essential aspects of the test's purpose. + - Apply 'frameLocator' for content in nested iframes, as needed based on the task requirements.\n + - Don't log the output always return that + ` + + "Constraints:\n" + + "1. ~4000 word limit for short term memory. \n" + + "2. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.\n" + + "3. No user assistance\n" + + "4. Exclusively use the commands listed below e.g. command_name\n" + + "\n" + + "Commands:\n" + + `// for navigating to the page + - await page.goto('https://github.com/login'); + // for clicking on the button + - await page.getByRole('button', { name: 'Submit' }).click(); + // for filling the input fields + - await page.getByLabel('Username or email address').fill('username'); + - await page.getByLabel('Password').fill('password'); + // Text input + - await page.getByRole('textbox').fill('Peter'); + // Date input + - await page.getByLabel('Birth date').fill('2020-02-02'); + // Time input + - await page.getByLabel('Appointment time').fill('13:15'); + // Local datetime input + - await page.getByLabel('Local time').fill('2020-03-02T05:15'); + - await page.locator('[data-test="password"]').fill('secret_sauce'); + - await page.getByRole('button', { name: 'Sign in' }).click(); + - await page.innerText('html') + - page.getByRole('listitem').filter({ hasText: 'Product 2' }); + - await page.getByRole('listitem').filter({ hasText: 'Product 2' }).getByRole('button', { name: 'Add to cart' }).click(); + - page.locator('button.buttonIcon.episode-actions-later'); + - await expect(page.getByText('welcome')).toBeVisible(); + - await expect(page.getByText('welcome')).toBeVisible(); + - await page.innerText(selector); + - await page.innerText(selector, options); + - const page = await browser.newPage(); + - await page.goto('https://keycode.info'); + - await page.press('body', 'A'); + - await page.screenshot({ path: 'A.png' }); + - await page.press('body', 'ArrowLeft'); + - await page.screenshot({ path: 'ArrowLeft.png' }); + - await page.press('body', 'Shift+O'); + - await page.screenshot({ path: 'O.png' }); + - await browser.close(); + // click on any links + - await page.click('a[href="https://blog.sbensu.com/posts/demand-for-visual-programming/"]');\n\n` + + "\n" + + "\n" + + "Resources:\n" + + "1. Internet access for searches and information gathering.\n" + + "2. Long Term memory management.\n" + + "3. GPT-3.5 powered Agents for delegation of simple tasks.\n" + + "\n" + + "Performance Evaluation:\n" + + "1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities.\n" + + "2. Constructively self-criticize your big-picture behavior constantly.\n" + + "3. Reflect on past decisions and strategies to refine your approach.\n" + + "4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps.", + }, + ]; +} + +export async function findInPage(page: Page, task: string): Promise { + const [currentPageUrl, currentPageTitle, siteOverview] = await Promise.all([ + await page.evaluate("location.href"), + await page.evaluate("document.title"), + parseSite(page).then((html) => removeBlankTags(html).slice(0, 24000)), + ]).catch((error: any) => { + console.log(error.message + " " + error.stack); + return error.message + " " + error.stack; + }); + + return ` + You are a programmer and your job is to pick out information in code to a pm. You are working on an html file. You will extract the necessary content asked from the information provided. + + Context: + Your computer is a mac. Cmd is the meta key, META. + The browser is already open. + Current page url is ${currentPageUrl}. + Current page title is ${currentPageTitle}. + + Here is the overview of the site. Format is in html: + \`\`\` + ${siteOverview} + \`\`\` + \n\n + + User Task: ${task} + + `; +} + +export const mainResponseFormat = [ + { + name: "response", + description: "Generate a detailed response based on provided details.", + parameters: { + type: "object", + properties: { + thoughts: { + type: "object", + description: "A collection of thoughts including reasoning and plans.", + properties: { + text: { + type: "string", + description: "thought", + }, + reasoning: { + type: "string", + description: "reasoning", + }, + plan: { + type: "string", + description: "- short bulleted\n- list that conveys\n- long-term plan", + }, + criticism: { + type: "string", + description: "constructive self-criticism", + }, + speak: { + type: "string", + description: "thoughts summary to say to user", + }, + }, + required: ["text", "reasoning", "plan", "criticism", "speak"], + }, + command: { + type: "object", + description: "A command to be executed based on the current context.", + properties: { + name: { + type: "string", + description: "The name of the command to execute.", + }, + args: { + type: "object", + description: "Arguments required for executing the command.", + additionalProperties: true, + }, + }, + required: ["name", "args"], + }, + }, + required: ["thoughts", "command"], + }, + }, +]; + +export const taskArrResponseFormat = [ + { + name: "taskListResponse", + description: "Generate a response containing a list of tasks.", + parameters: { + type: "object", + properties: { + tasks: { + type: "array", + description: "A list of tasks to be performed, represented as strings.", + items: { + type: "string", + description: "A single task description.", + }, + }, + }, + required: ["tasks"], // Ensure that the 'tasks' array is provided + }, + }, +]; + +export const playwrightCodeResponseFormat = [ + { + name: "playwrightCode", + description: "Generates playwright Code code for a given task", + parameters: { + type: "object", + properties: { + code: { + type: "string", + description: "Playwright code for a single task.", + }, + }, + required: ["code"], + }, + }, +]; + +export async function execPlayWrightCode(page: Page, code: string): Promise { + const dependencies = [ + { param: "page", value: page }, + { param: "expect", value: expect }, + ]; + + const func = AsyncFunction(...dependencies.map((d) => d.param), code); + const args = dependencies.map((d) => d.value); + return await func(...args); +} + +export async function goToLink(page: Page, url: string): Promise { + await page.goto(url); +} diff --git a/JS/edgechains/arakoodev/src/scraper/src/index.ts b/JS/edgechains/arakoodev/src/scraper/src/index.ts new file mode 100644 index 000000000..d31fc149a --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/index.ts @@ -0,0 +1,3 @@ +export { Cheerio } from "./lib/cheerio"; +export { AutoPlayWriteWebPageScrapper } from "./lib/autoPlaywrightPageScrapper"; +export { Playwright } from "./lib/playwright"; diff --git a/JS/edgechains/arakoodev/src/scraper/src/lib/autoPlaywrightPageScrapper.ts b/JS/edgechains/arakoodev/src/scraper/src/lib/autoPlaywrightPageScrapper.ts new file mode 100644 index 000000000..25fbedc46 --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/lib/autoPlaywrightPageScrapper.ts @@ -0,0 +1,19 @@ +import { chromium } from "playwright"; + +export class AutoPlayWriteWebPageScrapper { + constructor() {} + + async getContent(url: string): Promise { + const browser = await chromium.launch({ + headless: true, + }); + const page = await browser.newPage(); + await page.goto(url, { + waitUntil: "domcontentloaded", + }); + const textContent = await page.innerText("html"); + await browser.close(); + const regex = new RegExp("\n", "g"); + return textContent.replace(regex, "").replace(/\s{2,}/g, " "); + } +} diff --git a/JS/edgechains/arakoodev/src/scraper/src/lib/cheerio.ts b/JS/edgechains/arakoodev/src/scraper/src/lib/cheerio.ts new file mode 100644 index 000000000..578c30f16 --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/lib/cheerio.ts @@ -0,0 +1,12 @@ +import axios from "axios"; +import cheerio from "cheerio"; + +export class Cheerio { + constructor() {} + async getContent(url: string): Promise { + const content = await axios(url); + const $ = cheerio.load(content.data); + const data = `${$("h1").text()} ${$("p").text()} ${$("h2").text()} ${$("h3").text()} ${$("h4").text()} ${$("h5").text()} ${$("h6").text()}`; + return data; + } +} diff --git a/JS/edgechains/arakoodev/src/scraper/src/lib/playwright.ts b/JS/edgechains/arakoodev/src/scraper/src/lib/playwright.ts new file mode 100644 index 000000000..b03b7020b --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/lib/playwright.ts @@ -0,0 +1,239 @@ +import { chromium, Page } from "playwright"; +import axios from "axios"; +import { retry } from "@lifeomic/attempt"; +import { + playwrightCodeResponseFormat, + findInPage, + generatePrompt, + generateTaskArrPrompt, + handleHistory, + mainResponseFormat, + taskArrResponseFormat, + execPlayWrightCode, + goToLink, +} from "../actions"; +const openaiUrl = "https://api.openai.com/v1/chat/completions"; + +type messages = { role: string; content: string }[]; + +export class Playwright { + apiKey: string; + model: string; + verbose: boolean; + constructor({ + apiKey, + model, + verbose = true, + }: { + apiKey: string; + model: string; + verbose?: boolean; + }) { + this.apiKey = apiKey; + this.model = model; + this.verbose = verbose; + } + + static #history: messages = []; + + #getHistory() { + return Playwright.#history; + } + + #setHistory(message: { role: string; content: string }) { + Playwright.#history.push(message); + } + + async #getThoughtAndCommands() { + const openaiResponse = await this.#openAIRequest( + [ + ...this.#getHistory(), + { + role: "user", + content: + 'Determine which next command to use, ensuring that the "args" field is always populated with the necessary arguments, and respond using the format specified above.', + }, + ], + mainResponseFormat, + mainResponseFormat[0].name + ); + this.#setHistory({ role: "assistant", content: openaiResponse.function_call.arguments }); + return await JSON.parse(openaiResponse.function_call.arguments); + } + + async #interactWithPage(page: Page, task: string) { + const taskMessage = [ + { + role: "user", + content: generateTaskArrPrompt(task), + }, + ]; + + const taskResponse = await this.#openAIRequest( + taskMessage, + taskArrResponseFormat, + taskArrResponseFormat[0].name + ); + const taskArr = JSON.parse(taskResponse.function_call.arguments).tasks; + if (this.verbose == true) { + console.log("GOALS: ", taskArr); + } + const history = handleHistory(taskArr); + history.map((element) => { + this.#setHistory(element); + }); + let commandRunningAttempt: number = 0; + let playwrightResponse: string = ""; + let isFinishCount: number = 0; + while (1) { + const parsedOpenaiResponse = await this.#getThoughtAndCommands(); + let command = parsedOpenaiResponse.command; + if (this.verbose == true) { + console.log(parsedOpenaiResponse); + } + + if (command.name == "finish") { + isFinishCount++; + if (isFinishCount >= 2) { + break; + } + this.#setHistory({ + role: "assistant", + content: `Command finish args: ${command?.args || "NO ARGUMENTS PROVIDED"}`, + }); + this.#setHistory({ + role: "system", + content: `I need to insure that all the commmands is finished or Not?`, + }); + continue; + } + + if (command.name == "goToLink") { + try { + await goToLink(page, command.args.url); + this.#setHistory({ + role: "system", + content: `Command ${command.name} returned: Success`, + }); + } catch (error: any) { + this.#setHistory({ + role: "system", + content: `Args: ${command.args}. Error: ${error.message + error.stack}`, + }); + } + continue; + } + + if (command.name == "findInPage" || commandRunningAttempt >= 3) { + const findInPagePrompt = await findInPage( + page, + JSON.stringify(parsedOpenaiResponse) + ); + const findInPageRespones = await this.#openAIRequest([ + { role: "system", content: findInPagePrompt }, + { + role: "user", + content: + "Try finding something in the html body content of the current webpage. use this content to figure out your next step. The task should be written question explaining what you want to find. You can find something like css selector, classes, link, tag, etc. So we can locate the element", + }, + ]); + if (this.verbose == true) { + console.log(findInPageRespones.content); + } + this.#setHistory({ role: "assistant", content: findInPageRespones.content }); + command = await this.#getThoughtAndCommands(); + } + + const prompt = await generatePrompt(page, JSON.stringify(command)); + const playwrightCodeResponse = await this.#openAIRequest( + [{ role: "user", content: prompt }], + playwrightCodeResponseFormat, + playwrightCodeResponseFormat[0].name + ); + const playwrightCode = JSON.parse(playwrightCodeResponse.function_call.arguments).code; + if (this.verbose == true) { + console.log("Code To Run: ", playwrightCode); + } + this.#setHistory({ role: "assistant", content: playwrightCode }); + + let result: string = ""; + try { + playwrightResponse = await execPlayWrightCode(page, playwrightCode); + result = `Command ${command.name} returned: Success`; + this.#setHistory({ role: "system", content: result }); + commandRunningAttempt = 0; + } catch (error: any) { + if (command.name === "ERROR") { + result = `Error: ${command.args}.`; + this.#setHistory({ role: "system", content: result }); + continue; + } + + result = `Unknown command '${command.name}'. Please refer to the 'COMMANDS' list for available commands and only respond in the specified JSON format. Assistant Reply commands: ${command}\nResult: ${error.message} \n ${error.stack}`; + + this.#setHistory({ role: "system", content: result }); + commandRunningAttempt++; + } + } + + return playwrightResponse; + } + + async #openAIRequest( + message: { role: string; content: string }[], + functions?: { + name: string; + description: string; + parameters: {}; + }[], + functionCall?: string + ): Promise { + const funsObj = functions + ? { + functions, + function_call: functionCall ? { name: functionCall } : "auto", + } + : {}; + + try { + const response = await axios.post( + openaiUrl, + { + model: this.model, + messages: message, + max_tokens: 1024, + temperature: 0.7, + ...funsObj, + }, + { + headers: { + Authorization: `Bearer ${this.apiKey} `, + "content-type": "application/json", + }, + } + ); + return response.data.choices[0].message; + } catch (error: any) { + console.log(error.message + "\n" + error.stack); + } + } + + /** + * Get Playwright code for a specific task + * @param task - Task description + * @param url - URL to navigate to default is https://www.google.com + * @param headless - Run in headless mode default is false + **/ + async call({ task, url, headless = true }: { task: string; url?: string; headless?: boolean }) { + if (!this.apiKey || this.apiKey == undefined) { + console.log( + "Please provide apiKey, You can find you apikey here https://platform.openai.com/" + ); + process.exit(); + } + const browser = await chromium.launch({ headless }); + const page = await browser.newPage(); + await page.goto(url || "https://www.google.com"); + return await this.#interactWithPage(page, task); + } +} diff --git a/JS/edgechains/arakoodev/src/scraper/src/tests/autoPlaywrightPageScrapper.test.ts b/JS/edgechains/arakoodev/src/scraper/src/tests/autoPlaywrightPageScrapper.test.ts new file mode 100644 index 000000000..83ebd4428 --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/tests/autoPlaywrightPageScrapper.test.ts @@ -0,0 +1,12 @@ +import { AutoPlayWriteWebPageScrapper } from "../../../../dist/scraper/src/index.js"; +import { describe, expect, it } from "vitest"; + +describe("should scrape the page", async () => { + it("should scrape the text and return", async () => { + const url = "https://en.wikipedia.org/wiki/Akbar"; + const scrapper = new AutoPlayWriteWebPageScrapper(); + + const result = await scrapper.getContent(url); + expect(`${result}`).contains("Akbar"); + }); +}); diff --git a/JS/edgechains/arakoodev/src/scraper/src/tests/cheerio.test.ts b/JS/edgechains/arakoodev/src/scraper/src/tests/cheerio.test.ts new file mode 100644 index 000000000..1fc161835 --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/tests/cheerio.test.ts @@ -0,0 +1,11 @@ +import { Cheerio } from "../../../../dist/scraper/src/index.js"; +import { describe, expect, it } from "vitest"; +describe("should scrape the page", async () => { + it("should scrape the text and return", async () => { + const url = "https://en.wikipedia.org/wiki/Akbar"; + const cheerio = new Cheerio(); + + const result = await cheerio.getContent(url); + expect(`${result}`).contains("Akbar"); + }); +}); diff --git a/JS/edgechains/arakoodev/src/scraper/src/tests/playwright.test.ts b/JS/edgechains/arakoodev/src/scraper/src/tests/playwright.test.ts new file mode 100644 index 000000000..a1a367bb0 --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/tests/playwright.test.ts @@ -0,0 +1,15 @@ +import { Playwright } from "../../../../dist/scraper/src/index.js"; +import { describe, expect, it } from "vitest"; + +describe("should scrape the page", async () => { + it("should scrape the text and return", async () => { + const playwright = new Playwright(); + + const result = await playwright.call({ + chatApi: "11111", + task: "go to wikipedia and search for Akbar and click on any articial and scrap the hole page text", + headless: false, + }); + expect(result).toContain(String); + }); +}, 1000000); diff --git a/JS/edgechains/arakoodev/src/scraper/src/utils/index.ts b/JS/edgechains/arakoodev/src/scraper/src/utils/index.ts new file mode 100644 index 000000000..5905e20d1 --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/utils/index.ts @@ -0,0 +1,34 @@ +const codeRegex = /```(.*)(\r\n|\r|\n)(?[\w\W\n]+)(\r\n|\r|\n)```/; +const codeRegex2 = /```javascript(.*)(\r\n|\r|\n)(?[\w\W\n]+)(\r\n|\r|\n)```/i; +const codeRegex3 = /```json(.*)(\r\n|\r|\n)(?[\w\W\n]+)(\r\n|\r|\n)```/i; + +export function preprocessJsonInput(text) { + try { + return text.match(codeRegex).groups.code.trim(); + } catch (e) { + return text.trim(); + } +} + +export function parseArr(text) { + try { + if (text.startsWith("[") && text.endsWith("]")) { + return JSON.parse(text); + } + if (text.startsWith("```Javascript")) { + return text.match(codeRegex2).groups.code.trim(); + } + if (text.startsWith("```json")) { + return text.match(codeRegex3).groups.code.trim(); + } + if (text.startsWith("```")) { + return text.match(codeRegex).groups.code.trim(); + } + return text; + } catch (e) { + console.log({ text }); + throw new Error("No code found"); + } +} + +export { parseSite } from "./page-parser.js"; diff --git a/JS/edgechains/arakoodev/src/scraper/src/utils/page-parser.ts b/JS/edgechains/arakoodev/src/scraper/src/utils/page-parser.ts new file mode 100644 index 000000000..c928560df --- /dev/null +++ b/JS/edgechains/arakoodev/src/scraper/src/utils/page-parser.ts @@ -0,0 +1,165 @@ +import { parse } from "node-html-parser"; +import { JSDOM } from "jsdom"; +const { document } = new JSDOM(`...`).window; + +const tagsToLog = [ + "a", + "p", + "span", + "div", + "button", + "label", + "input", + "textarea", + "section", + "select", + "option", + "table", + "td", + "th", + "ul", + "ol", + "li", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "iframe", +]; + +function createElement(node) { + const elem = document.createElement(node.tagName); + + const dataAttributes = Object.entries(node.attributes).filter( + (a) => + (tagsToLog.includes(node.tagName) && + (a[0].startsWith("name") || + a[0].startsWith("value") || + a[0].startsWith("data-component") || + a[0].startsWith("data-name") || + a[0].startsWith("aria-") || + a[0] === "class" || + a[0] === "type" || + a[0] === "role")) || + a[0] === "href" || + a[0] === "id" || + a[0] === "type" + ); + dataAttributes.forEach(([attr, value]) => { + elem.setAttribute(attr, value); + }); + + return elem; +} + +function createTextNode(text) { + return document.createTextNode(text); +} + +function isAdsIframe(node) { + const style = node.getAttribute("style") || ""; + const id = node.getAttribute("id") || ""; + return ( + node.getAttribute("height") === 0 || + style.includes("display: none") || + id.startsWith("google_ads_iframe") + ); +} + +async function dfs(node, parentElem, childFrames = []) { + for (const childNode of node.childNodes) { + if (childNode.nodeType === 1) { + if (childNode.tagName === "IFRAME") { + // optimize for performance later + for (let { childFrame, attributes } of childFrames) { + if ( + Object.entries(attributes).every( + ([attr, value]) => childNode.getAttribute(attr) === value + ) + ) { + // skip blocks that look like ads + if (isAdsIframe(childNode)) { + continue; + } + + const childElem = createElement(childNode); + parentElem.appendChild(childElem); + const newChildFrame = await toChildFramesWithAttributes(childFrame); + //@ts-ignore + const bodyNode = await childFrame.locator("body", { timeout: 1000 }); + const bodyHtml = await bodyNode.innerHTML(); + await dfs(parseFrame(bodyHtml), childElem, newChildFrame); + // ignore other matches that might be the same parent + break; + } + } + } else { + const childElem = createElement(childNode); + parentElem.appendChild(childElem); + await dfs(childNode, childElem, childFrames); + } + } else if (childNode.nodeType === 3) { + if (!childNode.isWhitespace) { + const textElem = createTextNode(childNode); + parentElem.appendChild(textElem); + } + } + } +} + +async function toChildFramesWithAttributes(frame) { + const childFramesWithAttributes: any = []; + for (let childFrame of frame.childFrames()) { + const childFrameElement = await childFrame.frameElement(); + const attributes = await childFrameElement.evaluate((node) => { + const attrs = {}; + for (let i = 0; i < node.attributes.length; i++) { + const attr = node.attributes[i]; + attrs[attr.name] = attr.value; + } + return attrs; + }); + childFramesWithAttributes.push({ childFrame, attributes }); + } + return childFramesWithAttributes; +} + +async function getStructure(frame) { + const bodyNode = await frame.locator("body", { timeout: 1000 }); + const bodyHtml = await bodyNode.innerHTML(); + const node = parseFrame(bodyHtml); + const rootElem = createElement(node); + await dfs(node, rootElem, await toChildFramesWithAttributes(frame)); + return rootElem; +} + +function parseFrame(html) { + return parse(html, { + blockTextElements: { + script: false, + noscript: false, + style: false, + pre: true, // keep text content when parsing + }, + }); +} + +export async function parseSite(page) { + let mainFrame = page.mainFrame(); + const structure = await getStructure(mainFrame); + return structure.innerHTML; +} + +export function removeBlankTags(text) { + const emptyTagRegex = /<(\w+)([^>]*)><\/\1>|<(\w+)([^>]*)>\s*<\/\3>/g; + + let newText = text; + + while (emptyTagRegex.test(newText)) { + newText = newText.replace(emptyTagRegex, ""); + } + + return newText; +} diff --git a/JS/edgechains/arakoodev/src/splitter/src/index.ts b/JS/edgechains/arakoodev/src/splitter/src/index.ts new file mode 100644 index 000000000..5e3e81290 --- /dev/null +++ b/JS/edgechains/arakoodev/src/splitter/src/index.ts @@ -0,0 +1 @@ +export { TextSplitter } from "./lib/text-splitter/textSplitter.js"; diff --git a/JS/edgechains/arakoodev/src/splitter/src/lib/text-splitter/textSplitter.ts b/JS/edgechains/arakoodev/src/splitter/src/lib/text-splitter/textSplitter.ts new file mode 100644 index 000000000..005a1cf88 --- /dev/null +++ b/JS/edgechains/arakoodev/src/splitter/src/lib/text-splitter/textSplitter.ts @@ -0,0 +1,17 @@ +export class TextSplitter { + splitTextIntoChunks(text: string, chunkSize: number): Promise { + return new Promise((resolve, reject) => { + try { + text = text.split("\n").join(" "); + const chunks: string[] = []; + for (let i = 0; i < text.length; i += chunkSize) { + chunks.push(text.substring(i, i + chunkSize)); + } + resolve(chunks); + } catch (error) { + console.error("Error splitting text into chunks:", error); + reject(error); + } + }); + } +} diff --git a/JS/edgechains/arakoodev/src/splitter/src/tests/splitter/splitter.test.ts b/JS/edgechains/arakoodev/src/splitter/src/tests/splitter/splitter.test.ts new file mode 100644 index 000000000..f3f9a5168 --- /dev/null +++ b/JS/edgechains/arakoodev/src/splitter/src/tests/splitter/splitter.test.ts @@ -0,0 +1,50 @@ +import { TextSplitter } from "../../../../../dist/splitter/src/lib/text-splitter/textSplitter.js"; + +describe("TextSplitter", () => { + it("should split text into chunks of the specified size", async () => { + const text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + const chunkSize = 10; // Set the chunk size + + // Create an instance of TextSplitter + const textSplitter = new TextSplitter(); + + // Call the splitTextIntoChunks method with the text and chunk size + const result = await textSplitter.splitTextIntoChunks(text, chunkSize); + // Define the expected chunks + const expectedChunks = [ + "Lorem ipsu", + "m dolor si", + "t amet, co", + "nsectetur ", + "adipiscing", + " elit.", + ]; + + // Check if the result matches the expected chunks + expect(result).toEqual(expectedChunks); + }); + + it("should handle empty text", async () => { + const text = ""; + const chunkSize = 10; + + const textSplitter = new TextSplitter(); + + const result = await textSplitter.splitTextIntoChunks(text, chunkSize); + + expect(result).toEqual([]); + }); + + it("should handle text shorter than chunk size", async () => { + const text = "Short"; + const chunkSize = 10; + + const textSplitter = new TextSplitter(); + + const result = await textSplitter.splitTextIntoChunks(text, chunkSize); + + expect(result).toEqual(["Short"]); + }); + + // Add more test cases as needed +}); diff --git a/JS/edgechains/arakoodev/src/sync-rpc/index.ts b/JS/edgechains/arakoodev/src/sync-rpc/index.ts new file mode 100644 index 000000000..c0fad3360 --- /dev/null +++ b/JS/edgechains/arakoodev/src/sync-rpc/index.ts @@ -0,0 +1,2 @@ +import createSyncRPC from "./lib/sync-rpc.js"; +export { createSyncRPC }; diff --git a/JS/edgechains/arakoodev/src/sync-rpc/lib/sync-rpc.ts b/JS/edgechains/arakoodev/src/sync-rpc/lib/sync-rpc.ts new file mode 100644 index 000000000..fb6a881eb --- /dev/null +++ b/JS/edgechains/arakoodev/src/sync-rpc/lib/sync-rpc.ts @@ -0,0 +1,87 @@ +import { execSync } from "node:child_process"; +import path from "node:path"; +import fs from "node:fs"; +import crypto from "node:crypto"; +import os from "node:os"; + +function createSyncRPC(filename: string) { + const absolutePath = path.resolve(filename); + + if (!fs.existsSync(absolutePath)) { + throw new Error(`File not found: ${absolutePath}`); + } + + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "sync-rpc-")); + const hash = crypto.createHash("md5").update(absolutePath).digest("hex"); + const wrapperPath = path.join(tempDir, `wrapper_${hash}.js`); + + const wrapperCode = ` + const fn = require(${JSON.stringify(absolutePath)}); + if (typeof fn !== 'function') { + throw new Error('Exported value is not a function'); + } + process.on('message', (message) => { + fn(message) + .then(result => { + process.send({ success: true, result }); + }) + .catch(error => { + process.send({ success: false, error: error.message }); + }); + }); + `; + + fs.writeFileSync(wrapperPath, wrapperCode); + + return function syncRPC(args: any) { + const scriptPath = path.join(tempDir, `script_${Date.now()}.js`); + const scriptContent = ` + const cp = require('child_process'); + const child = cp.fork(${JSON.stringify(wrapperPath)}); + child.send(${JSON.stringify(args)}); + child.on('message', (message) => { + console.log(JSON.stringify(message)); + child.kill(); + process.exit(0); + }); + `; + + fs.writeFileSync(scriptPath, scriptContent); + + try { + const output = execSync(`node ${scriptPath}`, { + encoding: "utf8", + stdio: ["pipe", "pipe", "inherit"], + }); + + fs.unlinkSync(scriptPath); + + const trimmedOutput = output.trim(); + + try { + const result = JSON.parse(trimmedOutput); + if (!result.success) { + throw new Error(result.error); + } + return JSON.stringify(result.result); + } catch (parseError: any) { + console.error("Raw output:", trimmedOutput); + throw new Error( + `Failed to parse output as JSON: ${parseError.message}\nRaw output: ${trimmedOutput}` + ); + } + } catch (error: any) { + fs.unlinkSync(scriptPath); + if (error) { + console.error("Execution error:", error.message); + if (error.stderr) { + console.error("stderr:", error.stderr); + } + throw new Error(`Execution error: ${error.message}`); + } + throw error; + } + }; +} + +export = createSyncRPC as Function; diff --git a/JS/edgechains/arakoodev/src/vector-db/src/index.ts b/JS/edgechains/arakoodev/src/vector-db/src/index.ts new file mode 100644 index 000000000..557104a14 --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/index.ts @@ -0,0 +1 @@ +export { Supabase } from "./lib/supabase/supabase.js"; diff --git a/JS/edgechains/arakoodev/src/vector-db/src/lib/supabase/supabase.ts b/JS/edgechains/arakoodev/src/vector-db/src/lib/supabase/supabase.ts new file mode 100644 index 000000000..969ecc091 --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/lib/supabase/supabase.ts @@ -0,0 +1,258 @@ +import { createClient as createSupabaseClient, SupabaseClient } from "@supabase/supabase-js"; +import retry from "retry"; +import { config } from "dotenv"; +config(); + +interface ArgsObject { + [key: string]: any; +} + +interface InsertVectorDataArgs { + client: SupabaseClient; + tableName: string; + [key: string]: any; // Allow dynamic properties +} + +interface GetDataFromQueryArgs { + client: SupabaseClient; + functionNameToCall: string; + [key: string]: any; +} + +export class Supabase { + SUPABASE_URL: string; + SUPABASE_API_KEY: string; + + constructor(SUPABASE_URL: string, SUPABASE_API_KEY: string) { + this.SUPABASE_URL = SUPABASE_URL || process.env.SUPABASE_URL!; + this.SUPABASE_API_KEY = SUPABASE_API_KEY || process.env.SUPABASE_API_KEY!; + } + + // Function to create a Supabase client + createClient() { + return createSupabaseClient(this.SUPABASE_URL, this.SUPABASE_API_KEY); + } + + /** + * Insert data into a vector database using a Supabase client. + * @param client The Supabase client instance. + * @param relation The name of the relation (table) to insert data into. + * @param content The content to insert. + * @param embedding The embedding data to insert. + * @returns The inserted data if successful. + * @throws Error if insertion fails. + */ + async insertVectorData({ client, tableName, ...args }: InsertVectorDataArgs): Promise { + return new Promise((resolve, reject) => { + const operation = retry.operation({ + retries: 5, + factor: 3, + minTimeout: 1 * 1000, + maxTimeout: 60 * 1000, + randomize: true, + }); + + operation.attempt(async (currentAttempt) => { + try { + const res = await client.from(tableName).insert(args); + if (res.error?.message) { + if (operation.retry(new Error())) { + return; + } + reject( + new Error( + `Failed to insert ${JSON.stringify(args)} with error message "${res.error.message}"` + ) + ); + } else { + resolve(res); + } + } catch (error: any) { + if (operation.retry(error)) { + return; + } + reject(error); + } + }); + }); + } + + /** + * fetch data from vector database using a Supabase client + * @param client - The Supabase client instance. + * @param functionNameToCall - The function name that you want to run from sql queries + * @param args - args that you define you query function + * @returns The fetched data if successful. + * @throws Error if fetching fails. + */ + async getDataFromQuery({ + client, + functionNameToCall, + ...args + }: GetDataFromQueryArgs): Promise { + return new Promise((resolve, reject) => { + const operation = retry.operation({ + retries: 5, + factor: 3, + minTimeout: 1 * 1000, + maxTimeout: 60 * 1000, + randomize: true, + }); + + operation.attempt(async (currentAttempt) => { + try { + let res = await client.rpc(functionNameToCall, args); + if (res.status == 200) { + resolve(res.data); + } else { + if (operation.retry(new Error())) return; + reject( + new Error( + `Failed with ErrorCode:${res.statusText} and ErrorMessage:${res.data}` + ) + ); + } + } catch (error: any) { + if (operation.retry(error)) return; + reject(error); + } + }); + }); + } + /** + * fetch all data from you database + * @param client - The Supabase client instance. + * @param tableName - The tableName from you want to get your data + * @returns The fetched data if successful. + * @throws Error if fetching fails. + */ + async getData({ + client, + tableName, + columns, + }: { + client: SupabaseClient; + tableName: string; + columns: string; + }): Promise { + return new Promise((resolve, reject) => { + const operation = retry.operation({ + retries: 5, + factor: 3, + minTimeout: 1 * 1000, + maxTimeout: 60 * 1000, + randomize: true, + }); + + operation.attempt(async (currentAttempt) => { + try { + // Insert data into the specified relation + const { data, error } = await client.from(tableName).select(columns || "*"); + if (data) { + resolve(data); + } + if (operation.retry(new Error())) return; + reject(error); + } catch (error) { + if (operation.retry(new Error())) return; + reject(error); + } + }); + }); + } + + /** + * fetch data by id from you database + * @param client - The Supabase client instance. + * @param tableName - The tableName from you want to get your data + * @param id - The Id of row + * @returns The fetched data if successful. + * @throws Error if fetching fails. + */ + async getDataById({ + client, + tableName, + id, + }: { + client: SupabaseClient; + tableName: string; + id: number; + }): Promise { + try { + // Insert data into the specified relation + const { data, error } = await client.from(tableName).select().eq("id", id).single(); + if (data) { + return data; + } + return error; + } catch (error) { + console.error("Error inserting data into vector database:", error); + throw error; + } + } + + /** + * Update data by id + * @param client - The Supabase client instance. + * @param tableName - The tableName from you want to update + * @param id - The Id of row + * @returns Updated data if Success + * @throws Error if fetching fails. + */ + async updateById({ + client, + tableName, + id, + updatedContent, + }: { + client: SupabaseClient; + tableName: string; + id: number; + updatedContent: ArgsObject; + }): Promise { + try { + // Insert data into the specified relation + const { data, error } = await client + .from(tableName) + .update(updatedContent) + .eq("id", id) + .select() + .single(); + if (data) { + return data; + } + return error; + } catch (error) { + console.error("Error inserting data into vector database:", error); + throw error; + } + } + + /** + * Delete data by id + * @param client - The Supabase client instance. + * @param tableName - The tableName from you want to update + * @param id - The Id of row + * @returns Success + * @throws Error if deleting is fails. + */ + async deleteById({ + client, + tableName, + id, + }: { + client: SupabaseClient; + tableName: string; + id: number; + }): Promise { + try { + // Insert data into the specified relation + const res = await client.from(tableName).delete().eq("id", id); + + return { status: res.status, messages: res.statusText }; + } catch (error) { + console.error("Error inserting data into vector database:", error); + throw error; + } + } +} diff --git a/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/deleteById.test.ts b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/deleteById.test.ts new file mode 100644 index 000000000..aaf1d3dcd --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/deleteById.test.ts @@ -0,0 +1,45 @@ +import { Supabase } from "../../../../../dist/vector-db/src/lib/supabase/supabase.js"; + +const MOCK_SUPABASE_API_KEY = "mock-api-key"; +const MOCK_SUPABASE_URL = "https://mock-supabase.co"; + +// Mock the deleteById method of the Supabase class +jest.mock("../../../../../dist/vector-db/src/lib/supabase/supabase.js", () => { + return { + Supabase: jest.fn().mockImplementation(() => ({ + createClient: jest.fn(() => ({ + // Mock client methods + from: jest.fn().mockReturnThis(), + })), + + deleteById: jest.fn().mockImplementation(async ({ client, tableName, id }) => { + // Mock response for a successful deletion + const mockResponse = { + status: 200, + message: "Deleted successfully", // Message indicating successful deletion + }; + + // Return the mocked response + return mockResponse; + }), + })), + }; +}); + +describe("deleteById", () => { + it("should delete data by id from the database", async () => { + let supabase = new Supabase(MOCK_SUPABASE_URL, MOCK_SUPABASE_API_KEY); + const client = supabase.createClient(); + // Call the deleteById method with mock parameters + const res = await supabase.deleteById({ + client, // Mock client + tableName: "documents", + id: 549, // Id of the row to delete + }); + + // Check if the response indicates successful deletion + expect(res).toEqual( + expect.objectContaining({ status: 200, message: "Deleted successfully" }) + ); + }); +}); diff --git a/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getData.test.ts b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getData.test.ts new file mode 100644 index 000000000..1cf19cddf --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getData.test.ts @@ -0,0 +1,37 @@ +import { Supabase } from "../../../../../dist/vector-db/src/lib/supabase/supabase.js"; +const MOCK_SUPABASE_API_KEY = "mock-api-key"; +const MOCK_SUPABASE_URL = "https://mock-supabase.co"; + +// Mock the getDataFromQuery method of the Supabase class +jest.mock("../../../../../dist/vector-db/src/lib/supabase/supabase.js", () => { + return { + Supabase: jest.fn().mockImplementation(() => ({ + createClient: jest.fn(() => ({ + // Mock client methods + from: jest.fn().mockReturnThis(), + })), + getData: jest.fn().mockImplementation(async ({ client, tableName, columns }) => { + // Mock response data + const responseData = [{ id: 1, content: "Sample content" }]; + + // Return the mock response + return responseData; + }), + })), + }; +}); + +describe("Supabase getData method", () => { + it("should fetch data from the database", async () => { + let supabase = new Supabase(MOCK_SUPABASE_URL, MOCK_SUPABASE_API_KEY); + const client = supabase.createClient(); + + // Call the getData method with mocked parameters + const tableName = "documents"; + const columns = "content"; + const result = await supabase.getData({ client, tableName, columns }); + + // Check if the result matches the expected data + expect(result).toEqual([{ id: 1, content: "Sample content" }]); + }); +}); diff --git a/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getDataById.test.ts b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getDataById.test.ts new file mode 100644 index 000000000..877561eea --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getDataById.test.ts @@ -0,0 +1,60 @@ +import { Supabase } from "../../../../../dist/vector-db/src/lib/supabase/supabase.js"; + +const MOCK_SUPABASE_API_KEY = "mock-api-key"; +const MOCK_SUPABASE_URL = "https://mock-supabase.co"; + +// Mock the getDataById method of the Supabase class +jest.mock("../../../../../dist/vector-db/src/lib/supabase/supabase.js", () => { + return { + Supabase: jest.fn().mockImplementation(() => ({ + createClient: jest.fn(() => ({ + // Mock client methods + from: jest.fn().mockReturnThis(), + })), + getDataById: jest.fn().mockImplementation(async ({ client, tableName, id }) => { + // Assuming 'id' corresponds to the index of the data in the mock data array + const mockData = [ + { id: 546, content: "Mocked content for id 546" }, + // Add more mock data as needed + ]; + + // Find the mock data corresponding to the provided id + const data = mockData.find((item) => item.id === id); + + if (data) { + return data; // Return the mock data + } else { + throw new Error(`Data with id ${id} not found`); // Throw an error if data not found + } + }), + })), + }; +}); + +let supabase = new Supabase(MOCK_SUPABASE_URL, MOCK_SUPABASE_API_KEY); +const client = supabase.createClient(); + +describe("getDataById", () => { + it("should fetch data by id from the database", async () => { + // Call the getDataById method + const res = await supabase.getDataById({ + client, // Mock client + tableName: "documents", + id: 546, // Id of the data to fetch + }); + + // Check if the fetched data matches the expected content + expect(res.content).toEqual("Mocked content for id 546"); + }); + + it("should throw an error if data with the provided id is not found", async () => { + // Call the getDataById method with an id that does not exist in the mock data + await expect( + supabase.getDataById({ + client, // Mock client + tableName: "documents", + id: 999, // Id of non-existent data + }) + ).rejects.toThrow("Data with id 999 not found"); // Expect the method to throw an error + }); +}); diff --git a/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getDataFromQuery.test.ts b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getDataFromQuery.test.ts new file mode 100644 index 000000000..2b6dae04b --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/getDataFromQuery.test.ts @@ -0,0 +1,47 @@ +import { Supabase } from "../../../../../dist/vector-db/src/lib/supabase/supabase.js"; + +const MOCK_SUPABASE_API_KEY = "mock-api-key"; +const MOCK_SUPABASE_URL = "https://mock-supabase.co"; + +// Mock the getDataFromQuery method of the Supabase class +jest.mock("../../../../../dist/vector-db/src/lib/supabase/supabase.js", () => { + return { + Supabase: jest.fn().mockImplementation(() => ({ + createClient: jest.fn(() => ({ + // Mock client methods + from: jest.fn().mockReturnThis(), + })), + getDataFromQuery: jest + .fn() + .mockImplementation(async ({ client, functionNameToCall, args }) => { + // Mock response data + const responseData = { id: 1, content: "Hello, world!" }; + + // Return the mock response + return responseData; + }), + })), + }; +}); + +describe("getDataFromQuery", () => { + it("should fetch data from the vector database", async () => { + const tableName = "documents"; + const columns = "content"; + const mockResponseData = { id: 1, content: "Hello, world!" }; + + let supabase = new Supabase(MOCK_SUPABASE_URL, MOCK_SUPABASE_API_KEY); + + const client = supabase.createClient(); + // Call the method that uses getDataFromQuery + const res = await supabase.getDataFromQuery({ + client, + functionNameToCall: "fetchData", + tableName, + columns, + }); + + // Expect the result to match the mock response data + expect(res).toEqual(mockResponseData); + }); +}); diff --git a/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/insertVectorData.test.ts b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/insertVectorData.test.ts new file mode 100644 index 000000000..35f0fb053 --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/insertVectorData.test.ts @@ -0,0 +1,58 @@ +import { Supabase } from "../../../../../dist/vector-db/src/lib/supabase/supabase.js"; + +const MOCK_SUPABASE_API_KEY = "mock-api-key"; +const MOCK_SUPABASE_URL = "https://mock-supabase.co"; + +// Mock the Supabase class to return a mock client +jest.mock("../../../../../dist/vector-db/src/lib/supabase/supabase.js", () => { + return { + Supabase: jest.fn().mockImplementation(() => ({ + createClient: jest.fn(() => ({ + // Mock client methods + from: jest.fn().mockReturnThis(), + })), + insertVectorData: jest + .fn() + .mockImplementation(async ({ tableName, content, embedding }) => { + // Assuming content is a string and embedding is an array of length 1536 + const mockResponse = { + tableName: tableName, + data: [ + { + content: content, + embedding: embedding, // Mock embedding vector + }, + ], + }; + return mockResponse; + }), + })), + }; +}); + +it("should insert data into the database", async () => { + let supabase = new Supabase(MOCK_SUPABASE_URL, MOCK_SUPABASE_API_KEY); + const client = supabase.createClient(); + const tableName = "test_table"; + const content = "test"; + // Insert data into the database + const result = await supabase.insertVectorData({ + client, + tableName, + content, + embedding: Array.from({ length: 1536 }, (_, i) => i), + }); + + // Check if the insertion was successful + expect(result).toEqual( + expect.objectContaining({ + tableName: tableName, + data: expect.arrayContaining([ + expect.objectContaining({ + content, + embedding: expect.arrayContaining(Array.from({ length: 1536 }, (_, i) => i)), // Mocked embedding vector + }), + ]), + }) + ); +}, 10000); diff --git a/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/updateById.test.ts b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/updateById.test.ts new file mode 100644 index 000000000..c759f5504 --- /dev/null +++ b/JS/edgechains/arakoodev/src/vector-db/src/tests/supabase/updateById.test.ts @@ -0,0 +1,48 @@ +import { Supabase } from "../../../../../dist/vector-db/src/lib/supabase/supabase.js"; + +const MOCK_SUPABASE_API_KEY = "mock-api-key"; +const MOCK_SUPABASE_URL = "https://mock-supabase.co"; +// Mock the updateById method of the Supabase class +jest.mock("../../../../../dist/vector-db/src/lib/supabase/supabase.js", () => { + return { + Supabase: jest.fn().mockImplementation(() => ({ + createClient: jest.fn(() => ({ + // Mock client methods + from: jest.fn().mockReturnThis(), + })), + + updateById: jest + .fn() + .mockImplementation(async ({ client, tableName, id, updatedContent }) => { + // Mock response for a successful update + const mockResponse = { + id: id, // Assuming the id remains the same after update + ...updatedContent, // Assuming updatedContent contains updated fields + }; + + // Return the mocked response + return mockResponse; + }), + })), + }; +}); + +describe("updateById", () => { + it("should update data by id in the database", async () => { + let supabase = new Supabase(MOCK_SUPABASE_URL, MOCK_SUPABASE_API_KEY); + const client = supabase.createClient(); + // Call the updateById method with mock parameters + const updatedContent = { name: "Updated Name" }; // Assuming 'name' is one of the fields to update + const res = await supabase.updateById({ + client, // Mock client + tableName: "documents", + id: 546, // Id of the row to update + updatedContent: updatedContent, + }); + + // Check if the returned data matches the updated content + expect(res).toEqual(expect.objectContaining(updatedContent)); + }); + + // Add more test cases as needed, e.g., to test error handling +}); diff --git a/JS/edgechains/arakoodev/tsconfig.json b/JS/edgechains/arakoodev/tsconfig.json new file mode 100644 index 000000000..bcb98edc2 --- /dev/null +++ b/JS/edgechains/arakoodev/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "types": ["jest", "node"], + "target": "ES2022", + "module": "NodeNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "noImplicitAny": false, + "moduleResolution": "NodeNext", + "declaration": true, + "outDir": "./dist", + "rootDir": "./src" + }, + "exclude": ["node_modules", "dist", "jest.config.cjs", "./**/*.test.ts", "./**/*.test.d.ts"] +} diff --git a/.DS_Store b/JS/edgechains/examples/.DS_Store similarity index 80% rename from .DS_Store rename to JS/edgechains/examples/.DS_Store index e86a95325..997543fa0 100644 Binary files a/.DS_Store and b/JS/edgechains/examples/.DS_Store differ diff --git a/JS/edgechains/examples/chat-with-llm/.gitignore b/JS/edgechains/examples/chat-with-llm/.gitignore new file mode 100644 index 000000000..db4c6d9b6 --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/JS/edgechains/examples/chat-with-llm/jsonnet/main.jsonnet b/JS/edgechains/examples/chat-with-llm/jsonnet/main.jsonnet new file mode 100644 index 000000000..c5194a78a --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/jsonnet/main.jsonnet @@ -0,0 +1,16 @@ +local promptTemplate = ||| + You are a helpful assistant that can answer questions based on given question + Answer the following question: {question} +|||; + + +local key = std.extVar('openai_api_key'); +local UserQuestion = std.extVar('question'); + +local promptWithQuestion = std.strReplace(promptTemplate, '{question}', UserQuestion + '\n'); + +local main() = + local response = arakoo.native('openAICall')({ prompt: promptWithQuestion, openAIApiKey: key }); + response; + +main() diff --git a/JS/edgechains/examples/chat-with-llm/jsonnet/secrets.jsonnet b/JS/edgechains/examples/chat-with-llm/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..5442ef00b --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/jsonnet/secrets.jsonnet @@ -0,0 +1,6 @@ + +local OPENAI_API_KEY = "sk-proj-***"; + +{ + "openai_api_key":OPENAI_API_KEY, +} \ No newline at end of file diff --git a/JS/edgechains/examples/chat-with-llm/package.json b/JS/edgechains/examples/chat-with-llm/package.json new file mode 100644 index 000000000..5e589a6a0 --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/package.json @@ -0,0 +1,28 @@ +{ + "name": "ownchatgpt", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "keywords": [], + "author": "", + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js", + "wasm": "tsc && webpack && arakoo-compiler dist/final.js" + }, + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "file:../../arakoodev", + "@arakoodev/jsonnet": "^0.24.0", + "file-uri-to-path": "^2.0.0", + "path": "^0.12.7", + "uninstall": "^0.0.0", + "webpack": "5.91", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^22.7.4", + "typescript": "^5.7.0-dev.20241007", + "webpack-cli": "^5.1.4" + } +} diff --git a/JS/edgechains/examples/chat-with-llm/readme.md b/JS/edgechains/examples/chat-with-llm/readme.md new file mode 100644 index 000000000..c789771f6 --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/readme.md @@ -0,0 +1,55 @@ +# Chat with LLM Example + +## Video + +https://youtu.be/fq3BpdduO2g + +## Installation + +1. Install the required dependencies: + + ```bash + npm install + ``` + +## Configuration + +1 Add OpenAiApi key in secrets.jsonnet +`bash + local OPENAI_API_KEY = "sk-****"; + ` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Hit the `POST` endpoint with basic question `http://localhost:3000/chat`. + + ```bash + + body = { + "question":"hi" + } + ``` + +## Compilation to wasm + +> For compilation to wasm you must have arakoo-compiler and arakoo runtime installed (For installation instruction you can refer the [readme](https://github.com/redoC-A2k/EdgeChains#setup-1)) + +1. Build the arakoo runtime compatible wasm + +```bash +npm run wasm +``` + +2. Run the wasm with runtime (index.wasm will be in the directory in which you run npm run wasm) + +```bash +arakoo index.wasm +``` + +Now you are good to go send the request to port 8080 diff --git a/JS/edgechains/examples/chat-with-llm/replacedirnameloader.cjs b/JS/edgechains/examples/chat-with-llm/replacedirnameloader.cjs new file mode 100644 index 000000000..524873686 --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/replacedirnameloader.cjs @@ -0,0 +1,14 @@ +const path = require("path"); + +module.exports = function (source) { + // console.log(source) + return source.replace(/__dirname/g, (match, p1) => { + // try { + return `"${this.context}"`; + // } catch (error) { + // console.log("error ",error) + // return match; + // } + // return `require('${filePath}')`; + }); +}; diff --git a/JS/edgechains/examples/chat-with-llm/replaceloader.cjs b/JS/edgechains/examples/chat-with-llm/replaceloader.cjs new file mode 100644 index 000000000..8afec60e6 --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/replaceloader.cjs @@ -0,0 +1,22 @@ +// module.exports = function (source) { +// // Regular expression to match createClient(import.meta.resolve()) +// const regex = /createClient\s*\(\s*import\.meta\.resolve\s*\(\s*(['"`].*?['"`])\s*\)\s*\)/g; + +// // Replace with require() +// return source.replace(regex, 'require($1)'); +// }; + +const path = require("path"); + +module.exports = function (source) { + // console.log(source) + return source.replace(/createClient\(([^()]*(?:\([^()]*\)[^()]*)*)\)/g, (match, p1) => { + // console.log("P1", p1) + // console.log("this.context" ,this.context) + __dirname = this.context; + // console.log("eval", eval(p1)) + // console.log("__dirname", __dirname) + const filePath = path.resolve(this.context, eval(p1)); + return `require('${filePath}')`; + }); +}; diff --git a/JS/edgechains/examples/chat-with-llm/src/index.ts b/JS/edgechains/examples/chat-with-llm/src/index.ts new file mode 100644 index 000000000..43e2708cb --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/src/index.ts @@ -0,0 +1,33 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Jsonnet from "@arakoodev/jsonnet"; + +import { createSyncRPC } from "@arakoodev/edgechains.js/sync-rpc"; + +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +const server = new ArakooServer(); + +const app = server.createApp(); + +const jsonnet = new Jsonnet(); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const openAICall = createSyncRPC(path.join(__dirname, "./lib/generateResponse.cjs")); + +app.post("/chat", async (c: any) => { + try { + const { question } = await c.req.json(); + const key = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/secrets.jsonnet")) + ).openai_api_key; + jsonnet.extString("openai_api_key", key); + jsonnet.extString("question", question || ""); + jsonnet.javascriptCallback("openAICall", openAICall); + let response = jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/main.jsonnet")); + return c.json(JSON.parse(response)); + } catch (error) { + console.log("error occured", error); + } +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/chat-with-llm/src/lib/generateResponse.cts b/JS/edgechains/examples/chat-with-llm/src/lib/generateResponse.cts new file mode 100644 index 000000000..a33426693 --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/src/lib/generateResponse.cts @@ -0,0 +1,41 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/ai"); +import { z } from "zod"; + +const schema = z.object({ + answer: z.string().describe("The answer to the question"), +}); + +// ** Example schema for a horse object, You can unComment the following code if you want to test the complex schema based answer** +// const genderOrStage = ["mare", "stallion", "gelding", "foal"]; // Example values +// const breed = ["arabian", "thoroughbred", "quarter horse", "appaloosa"]; // Example values + +// const schema = z.object({ +// isAdvertisingSaleOfHorse: z +// .boolean() +// .describe("Whether the text is advertising the sale of a horse."), +// genderOrStage: z +// .enum(genderOrStage as any) +// .nullable() +// .describe(`The gender or stage of the horse, which MUST be one of ${genderOrStage.join(", ")}.`), +// age: z.number().nullable().describe("The age of the horse in years."), +// height: z.number().nullable().describe("The height of the horse in hands."), +// breed: z +// .enum(breed as any) +// .describe(`The breed of the horse, which MUST be one of ${breed.join(", ")}.`), +// gaited: z.boolean().describe("Whether the horse is gaited or not."), +// temperament: z +// .enum(["alpha", "other"]) +// .describe('The temperament of the horse, either "alpha" indicating it is top of the herd, or "other".'), +// }); + +async function openAICall({ prompt, openAIApiKey }: any) { + try { + const openai = new OpenAI({ apiKey: openAIApiKey }); + let res = await openai.zodSchemaResponse({ prompt, schema: schema }); + return JSON.stringify(res); + } catch (error) { + return error; + } +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/chat-with-llm/tsconfig.json b/JS/edgechains/examples/chat-with-llm/tsconfig.json new file mode 100644 index 000000000..75cfffbfe --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2021", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/chat-with-llm/webpack.config.cjs b/JS/edgechains/examples/chat-with-llm/webpack.config.cjs new file mode 100644 index 000000000..a32e9a16f --- /dev/null +++ b/JS/edgechains/examples/chat-with-llm/webpack.config.cjs @@ -0,0 +1,71 @@ +const webpack = require("webpack"); +const path = require("path"); + +let definePlugin = new webpack.DefinePlugin({ + "process.env.arakoo": true, +}); + +let replacePlugin = new webpack.NormalModuleReplacementPlugin( + /\@arakoodev\/edgechains\.js\/sync-rpc/, + function (resource) { + resource.request = path.resolve(__dirname, "empty-module.js"); + } +); + +const config = [ + { + name: "first", + entry: "./dist/index.js", + output: { + path: __dirname + "/dist", + filename: "index.cjs", + iife: false, + }, + resolve: { + extensions: [".js"], + }, + mode: "production", + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: path.resolve("replaceloader.cjs"), // Use the custom loader + }, + ], + }, + optimization: { + minimize: false, + }, + plugins: [definePlugin], + }, + { + name: "second", + entry: "./dist/index.cjs", + output: { + path: __dirname + "/dist", + filename: "final.js", + iife: false, + }, + resolve: { + extensions: [".cjs", ".js"], + }, + mode: "production", + module: { + rules: [ + { + test: /\.cjs$/, + exclude: /node_modules/, + use: path.resolve("replacedirnameloader.cjs"), + }, + ], + }, + optimization: { + minimize: false, + }, + plugins: [definePlugin], + dependencies: ["first"], + }, +]; + +module.exports = config; diff --git a/JS/edgechains/examples/chat-with-palm2/.gitignore b/JS/edgechains/examples/chat-with-palm2/.gitignore new file mode 100644 index 000000000..db4c6d9b6 --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/JS/edgechains/examples/chat-with-palm2/jsonnet/main.jsonnet b/JS/edgechains/examples/chat-with-palm2/jsonnet/main.jsonnet new file mode 100644 index 000000000..c29bf8f4b --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/jsonnet/main.jsonnet @@ -0,0 +1,15 @@ +local promptTemplate = ||| + You are a helpful assistant. + Answer the following question with a short reply: {question} +|||; + +local key = std.extVar('palm2_api_key'); +local UserQuestion = std.extVar('question'); + +local promptWithQuestion = std.strReplace(promptTemplate, '{question}', UserQuestion + '\n'); + +local main() = + local response = arakoo.native('palm2Call')({ prompt: promptWithQuestion, palm2ApiKey: key }); + response; + +main() diff --git a/JS/edgechains/examples/chat-with-palm2/jsonnet/secrets.jsonnet b/JS/edgechains/examples/chat-with-palm2/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..316a67ed4 --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/jsonnet/secrets.jsonnet @@ -0,0 +1,5 @@ +local PALM2_API_KEY = "AIza..."; + +{ + palm2_api_key: PALM2_API_KEY, +} diff --git a/JS/edgechains/examples/chat-with-palm2/package.json b/JS/edgechains/examples/chat-with-palm2/package.json new file mode 100644 index 000000000..b1d9faf41 --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/package.json @@ -0,0 +1,28 @@ +{ + "name": "chat-with-palm2", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "keywords": [], + "author": "", + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js", + "wasm": "tsc && webpack && arakoo-compiler dist/final.js" + }, + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "file:../../arakoodev", + "@arakoodev/jsonnet": "^0.24.0", + "file-uri-to-path": "^2.0.0", + "path": "^0.12.7", + "uninstall": "^0.0.0", + "webpack": "5.91", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^22.7.4", + "typescript": "^5.7.0-dev.20241007", + "webpack-cli": "^5.1.4" + } +} diff --git a/JS/edgechains/examples/chat-with-palm2/readme.md b/JS/edgechains/examples/chat-with-palm2/readme.md new file mode 100644 index 000000000..fcf48608f --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/readme.md @@ -0,0 +1,53 @@ +# Chat with Palm2 Example + +## Video + +Add a Loom demo showing the `/chat` endpoint calling Palm2 through jsonnet. + +## Installation + +1. Install the required dependencies: + + ```bash + npm install + ``` + +## Configuration + +1. Add your Palm2 API key in `jsonnet/secrets.jsonnet`: + + ```jsonnet + { + palm2_api_key: 'AIza...' + } + ``` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Send a `POST` request to `http://localhost:3000/chat`. + + ```json + { + "question": "hi" + } + ``` + +## Compilation to wasm + +1. Build the wasm bundle: + + ```bash + npm run wasm + ``` + +2. Run it: + + ```bash + arakoo index.wasm + ``` diff --git a/JS/edgechains/examples/chat-with-palm2/replacedirnameloader.cjs b/JS/edgechains/examples/chat-with-palm2/replacedirnameloader.cjs new file mode 100644 index 000000000..524873686 --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/replacedirnameloader.cjs @@ -0,0 +1,14 @@ +const path = require("path"); + +module.exports = function (source) { + // console.log(source) + return source.replace(/__dirname/g, (match, p1) => { + // try { + return `"${this.context}"`; + // } catch (error) { + // console.log("error ",error) + // return match; + // } + // return `require('${filePath}')`; + }); +}; diff --git a/JS/edgechains/examples/chat-with-palm2/replaceloader.cjs b/JS/edgechains/examples/chat-with-palm2/replaceloader.cjs new file mode 100644 index 000000000..8afec60e6 --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/replaceloader.cjs @@ -0,0 +1,22 @@ +// module.exports = function (source) { +// // Regular expression to match createClient(import.meta.resolve()) +// const regex = /createClient\s*\(\s*import\.meta\.resolve\s*\(\s*(['"`].*?['"`])\s*\)\s*\)/g; + +// // Replace with require() +// return source.replace(regex, 'require($1)'); +// }; + +const path = require("path"); + +module.exports = function (source) { + // console.log(source) + return source.replace(/createClient\(([^()]*(?:\([^()]*\)[^()]*)*)\)/g, (match, p1) => { + // console.log("P1", p1) + // console.log("this.context" ,this.context) + __dirname = this.context; + // console.log("eval", eval(p1)) + // console.log("__dirname", __dirname) + const filePath = path.resolve(this.context, eval(p1)); + return `require('${filePath}')`; + }); +}; diff --git a/JS/edgechains/examples/chat-with-palm2/src/index.ts b/JS/edgechains/examples/chat-with-palm2/src/index.ts new file mode 100644 index 000000000..eb103990f --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/src/index.ts @@ -0,0 +1,34 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Jsonnet from "@arakoodev/jsonnet"; + +import { createSyncRPC } from "@arakoodev/edgechains.js/sync-rpc"; + +import fileURLToPath from "file-uri-to-path"; +import path from "path"; + +const server = new ArakooServer(); + +const app = server.createApp(); + +const jsonnet = new Jsonnet(); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const palm2Call = createSyncRPC(path.join(__dirname, "./lib/generateResponse.cjs")); + +app.post("/chat", async (c: any) => { + try { + const { question } = await c.req.json(); + const key = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/secrets.jsonnet")) + ).palm2_api_key; + jsonnet.extString("palm2_api_key", key); + jsonnet.extString("question", question || ""); + jsonnet.javascriptCallback("palm2Call", palm2Call); + let response = jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/main.jsonnet")); + return c.json(JSON.parse(response)); + } catch (error) { + console.log("error occured", error); + } +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/chat-with-palm2/src/lib/generateResponse.cts b/JS/edgechains/examples/chat-with-palm2/src/lib/generateResponse.cts new file mode 100644 index 000000000..073d96c26 --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/src/lib/generateResponse.cts @@ -0,0 +1,13 @@ +const { Palm2AI } = require("@arakoodev/edgechains.js/ai"); + +async function palm2Call({ prompt, palm2ApiKey }: any) { + try { + const palm2 = new Palm2AI({ apiKey: palm2ApiKey }); + const res = await palm2.chat({ prompt }); + return JSON.stringify({ answer: res.candidates?.[0]?.content || "" }); + } catch (error) { + return error; + } +} + +module.exports = palm2Call; diff --git a/JS/edgechains/examples/chat-with-palm2/tsconfig.json b/JS/edgechains/examples/chat-with-palm2/tsconfig.json new file mode 100644 index 000000000..75cfffbfe --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2021", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/chat-with-palm2/webpack.config.cjs b/JS/edgechains/examples/chat-with-palm2/webpack.config.cjs new file mode 100644 index 000000000..a32e9a16f --- /dev/null +++ b/JS/edgechains/examples/chat-with-palm2/webpack.config.cjs @@ -0,0 +1,71 @@ +const webpack = require("webpack"); +const path = require("path"); + +let definePlugin = new webpack.DefinePlugin({ + "process.env.arakoo": true, +}); + +let replacePlugin = new webpack.NormalModuleReplacementPlugin( + /\@arakoodev\/edgechains\.js\/sync-rpc/, + function (resource) { + resource.request = path.resolve(__dirname, "empty-module.js"); + } +); + +const config = [ + { + name: "first", + entry: "./dist/index.js", + output: { + path: __dirname + "/dist", + filename: "index.cjs", + iife: false, + }, + resolve: { + extensions: [".js"], + }, + mode: "production", + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: path.resolve("replaceloader.cjs"), // Use the custom loader + }, + ], + }, + optimization: { + minimize: false, + }, + plugins: [definePlugin], + }, + { + name: "second", + entry: "./dist/index.cjs", + output: { + path: __dirname + "/dist", + filename: "final.js", + iife: false, + }, + resolve: { + extensions: [".cjs", ".js"], + }, + mode: "production", + module: { + rules: [ + { + test: /\.cjs$/, + exclude: /node_modules/, + use: path.resolve("replacedirnameloader.cjs"), + }, + ], + }, + optimization: { + minimize: false, + }, + plugins: [definePlugin], + dependencies: ["first"], + }, +]; + +module.exports = config; diff --git a/JS/edgechains/examples/chat-with-pdf/.gitignore b/JS/edgechains/examples/chat-with-pdf/.gitignore new file mode 100644 index 000000000..d9cd34b5a --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/.gitignore @@ -0,0 +1,6 @@ +# standard exclusions +node_modules +# build artifacts +dist +# environment files +.env \ No newline at end of file diff --git a/JS/edgechains/examples/chat-with-pdf/esbuild.build.js b/JS/edgechains/examples/chat-with-pdf/esbuild.build.js new file mode 100644 index 000000000..0b5f7f3a4 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/esbuild.build.js @@ -0,0 +1,45 @@ +const esbuild = require("esbuild"); +const path = require("path"); +const fs = require("fs"); + +const outputDir = path.resolve(__dirname, "dist"); + +if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir); +} + +const distPath = path.join(process.cwd(), "dist"); + +fs.promises.mkdir(distPath, { recursive: true }); + +esbuild + .build({ + entryPoints: ["./src/index.ts"], + bundle: true, + minify: true, + platform: "node", + outfile: "./dist/index.js", + tsconfig: "./tsconfig.json", + target: "node21.1.0", + external: [ + "express", + "tsx", + "typescript", + "typeorm", + "react", + "react-dom", + "pg", + "jsdom", + "hono", + "@hanazuki/node-jsonnet", + "readline/promises", + ], + format: "cjs", + loader: { + ".html": "text", + ".css": "css", + ".jsonnet": "text", + ".wasm": "file", + }, + }) + .catch(() => process.exit(1)); diff --git a/JS/edgechains/examples/chat-with-pdf/example.pdf b/JS/edgechains/examples/chat-with-pdf/example.pdf new file mode 100644 index 000000000..9c8fc8c2e Binary files /dev/null and b/JS/edgechains/examples/chat-with-pdf/example.pdf differ diff --git a/JS/edgechains/examples/chat-with-pdf/jsonnet/main.jsonnet b/JS/edgechains/examples/chat-with-pdf/jsonnet/main.jsonnet new file mode 100644 index 000000000..b8e678697 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/jsonnet/main.jsonnet @@ -0,0 +1,26 @@ +local CUSTOM_TEMPLATE = ||| + You are a senior software developer seeking accurate answers based on provided content. Your task is to find answers exclusively from the given content and the answer should be verbose and detailedfull. If the answer is not present within the provided content, respond with "Sorry! I don't know the answer. + Content:{content} + Question:{} + |||; + + +local updateQueryPrompt(promptTemplate, query, content) = + local updatedPrompt = std.strReplace(promptTemplate, '{}', query + "\n"); + local updatedContent = std.strReplace(updatedPrompt, '{content}', content + "\n"); + updatedContent; + + +local query = std.extVar("query"); +local content = std.extVar("content"); + +local getQueryMatch(query)= + local queryEmbeddings = arakoo.native("getEmbeddings")(query); + local content = arakoo.native("getQueryMatch")(queryEmbeddings); + content; + +local updatedQueryPrompt = updateQueryPrompt(CUSTOM_TEMPLATE, query, getQueryMatch(query)); + +local getOpenAiResponse = arakoo.native("openAICall")(updatedQueryPrompt); + +getOpenAiResponse \ No newline at end of file diff --git a/JS/edgechains/examples/chat-with-pdf/jsonnet/secrets.jsonnet b/JS/edgechains/examples/chat-with-pdf/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..a70703ab2 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/jsonnet/secrets.jsonnet @@ -0,0 +1,11 @@ +local SUPABASE_API_KEY = "your supabase api key here"; + +local OPENAI_API_KEY = "your openai api key here"; + +local SUPABASE_URL = "your supabase url here"; + +{ + "supabase_api_key":SUPABASE_API_KEY, + "supabase_url":SUPABASE_URL, + "openai_api_key":OPENAI_API_KEY, +} \ No newline at end of file diff --git a/JS/edgechains/examples/chat-with-pdf/package.json b/JS/edgechains/examples/chat-with-pdf/package.json new file mode 100644 index 000000000..e6e45c133 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/package.json @@ -0,0 +1,31 @@ +{ + "name": "chat-with-pdf", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "npx vitest", + "build": "tsc -b", + "start": "tsc && node --experimental-wasm-modules dist/index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "^0.23.6", + "@arakoodev/jsonnet": "^0.23.6", + "@babel/preset-env": "^7.24.4", + "cli-spinner": "^0.2.10", + "file-uri-to-path": "^2.0.0", + "path": "^0.12.7", + "regenerator-runtime": "^0.14.1", + "sync-rpc": "^1.3.6", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/cli-spinner": "^0.2.3", + "@types/node": "^20.14.1", + "esbuild": "^0.20.2" + } +} diff --git a/JS/edgechains/examples/chat-with-pdf/readme.md b/JS/edgechains/examples/chat-with-pdf/readme.md new file mode 100644 index 000000000..938b1f88e --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/readme.md @@ -0,0 +1,110 @@ +--- + +# Setup +1. Clone the repo into a public GitHub repository (or fork [https://github.com/arakoodev/EdgeChains/fork](https://github.com/arakoodev/EdgeChains/fork)). + +``` + git clone https://github.com/arakoodev/EdgeChains/ +``` + +2. Go to the project folder +``` + cd EdgeChains +``` + +# Run the ChatWithPdf example + +This section provides instructions for developers on how to utilize the chat with PDF feature. By following these steps, you can integrate the functionality seamlessly into your projects. + +--- + +1. Go to the ChatWithPdfExample + +``` + cd JS/edgechains/examples/chat-with-pdf/ +``` + +2. Install packages with npm + +``` + npm install +``` + +3. Setup you secrets in `secrets.jsonnet` + +``` + local SUPABASE_API_KEY = "your supabase api key here"; + + + local OPENAI_API_KEY = "your openai api key here"; + + local SUPABASE_URL = "your supabase url here"; + + { + "supabase_api_key":SUPABASE_API_KEY, + "supabase_url":SUPABASE_URL, + "openai_api_key":OPENAI_API_KEY, + } + +``` + +4. Database Configuration + +- Ensure that you have a PostgreSQL Vector database set up at [Supabase](https://supabase.com/vector). +- Go to the SQL Editor tab in Supabase. +- Create a new query using the New Query button. +- Paste the following query into the editor and run it using the Run button in the bottom right corner. + +``` +create table if not exists documents ( + id bigint primary key generated always as identity, + content text, + embedding vector (1536) + ); + +create or replace function public.match_documents ( + query_embedding vector(1536), + similarity_threshold float, + match_count int +) +returns table ( + id bigint, + content text, + similarity float +) +language sql +as $$ + select + id, + content, + 1- (documents.embedding <=> query_embedding) as similarity + from documents + where 1 - (documents.embedding <=> query_embedding) > similarity_threshold + order by documents.embedding <=> query_embedding + limit match_count; + $$; + +``` + +- You should see a success message in the Result tab. + ![image](https://github.com/Shyam-Raghuwanshi/EdgeChains/assets/94217498/052d9a15-838f-4e68-9888-072cecb78a13) + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Hit the `GET` endpoint. + + ```bash + http://localhost:3000/chatWithpdf?question=who is nirmala sitaraman + ``` + +- Then you can run the ChatWithPdf example using npm run start and continue chatting with the example.pdf. + +⚠️👉Remember: Comment out the InsertToSupabase function if you are running the code again; otherwise, the PDF data will be pushed again to the Supabase vector data. + +--- diff --git a/JS/edgechains/examples/chat-with-pdf/src/index.ts b/JS/edgechains/examples/chat-with-pdf/src/index.ts new file mode 100644 index 000000000..0afc160c8 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/index.ts @@ -0,0 +1,10 @@ +import "dotenv/config"; +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import { ChatRouter } from "./routes/chat.js"; +const server = new ArakooServer(); + +const app = server.createApp(); + +app.route("/chatWithpdf", ChatRouter); + +server.listen(3000); diff --git a/JS/edgechains/examples/chat-with-pdf/src/lib/InsertToSupabase.ts b/JS/edgechains/examples/chat-with-pdf/src/lib/InsertToSupabase.ts new file mode 100644 index 000000000..a93a0a918 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/lib/InsertToSupabase.ts @@ -0,0 +1,64 @@ +import fileURLToPath from "file-uri-to-path"; +import { Spinner } from "cli-spinner"; +import { PdfLoader } from "@arakoodev/edgechains.js/document-loader"; +import { TextSplitter } from "@arakoodev/edgechains.js/splitter"; +import { createRequire } from "module"; +import { Supabase } from "@arakoodev/edgechains.js/vector-db"; +import Jsonnet from "@arakoodev/jsonnet"; +import path from "path"; +import fs from "fs"; + +const require = createRequire(import.meta.url); + +const getEmbeddings = require("./getEmbeddings.cjs"); + +const __dirname = fileURLToPath(import.meta.url); + +const pdfPath = path.join(__dirname, "../../../example.pdf"); +const pdfData = fs.readFileSync(pdfPath); +const bufferPdf = Buffer.from(pdfData); +const loader = new PdfLoader(bufferPdf); +const docs = await loader.loadPdf(); +const splitter = new TextSplitter(); +export const splitedDocs = await splitter.splitTextIntoChunks(docs, 500); + +const secretsPath = path.join(__dirname, "../../../jsonnet/secrets.jsonnet"); + +const jsonnet = new Jsonnet(); + +const secretsLoader = jsonnet.evaluateFile(secretsPath); +const supabaseApiKey = await JSON.parse(secretsLoader).supabase_api_key; +const supabaseUrl = await JSON.parse(secretsLoader).supabase_url; +const supabase = new Supabase(supabaseUrl, supabaseApiKey); +const client = supabase.createClient(); + +export async function InsertToSupabase(content: any) { + var spinner = new Spinner("Inserting to Supabase.. %s"); + try { + spinner.setSpinnerString("|/-\\"); + spinner.start(); + + const response = await getEmbeddings()(content); + for (let i = 0; i < response?.length; i++) { + if (content[i].length <= 1) { + continue; + } + + const element = response[i].embedding; + await supabase.insertVectorData({ + client, + tableName: "documents", + content: content[i].toLowerCase(), + embedding: element, + }); + } + if (!response) { + return console.log("Error inserting to Supabase"); + } + console.log("Inserted to Supabase"); + } catch (error) { + console.log("Error inserting to Supabase", error); + } finally { + spinner.stop(); + } +} diff --git a/JS/edgechains/examples/chat-with-pdf/src/lib/generateResponse.cts b/JS/edgechains/examples/chat-with-pdf/src/lib/generateResponse.cts new file mode 100644 index 000000000..601a040b2 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/lib/generateResponse.cts @@ -0,0 +1,28 @@ +const path = require("path"); +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +const z = require("zod"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const openAIApiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const openai = new OpenAI({ apiKey: openAIApiKey }); + +const schema = z.object({ + answer: z.string().describe("The answer to the question"), +}); + +function openAICall() { + return function (prompt: string) { + try { + return openai.zodSchemaResponse({ prompt, schema }).then((res: any) => { + return JSON.stringify(res); + }); + } catch (error) { + return error; + } + }; +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/chat-with-pdf/src/lib/getEmbeddings.cts b/JS/edgechains/examples/chat-with-pdf/src/lib/getEmbeddings.cts new file mode 100644 index 000000000..680e87aa8 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/lib/getEmbeddings.cts @@ -0,0 +1,23 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); + +const jsonnet = new Jsonnet(); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const openAIApiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const llm = new OpenAI({ + apiKey: openAIApiKey, +}); + +function getEmbeddings() { + return (content: any) => { + const embeddings = llm.generateEmbeddings(content).then((res: any) => { + return JSON.stringify(res); + }); + return embeddings; + }; +} + +module.exports = getEmbeddings; diff --git a/JS/edgechains/examples/chat-with-pdf/src/lib/getQueryMatch.cts b/JS/edgechains/examples/chat-with-pdf/src/lib/getQueryMatch.cts new file mode 100644 index 000000000..4ef5e4476 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/lib/getQueryMatch.cts @@ -0,0 +1,38 @@ +import path from "path"; +const Jsonnet = require("@arakoodev/jsonnet"); +const { Supabase } = require("@arakoodev/edgechains.js/vector-db"); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); + +const jsonnet = new Jsonnet(); + +const secretsLoader = jsonnet.evaluateFile(secretsPath); +const supabaseApiKey = JSON.parse(secretsLoader).supabase_api_key; +const supabaseUrl = JSON.parse(secretsLoader).supabase_url; + +const supabase = new Supabase(supabaseUrl, supabaseApiKey); +const client = supabase.createClient(); + +function getQueryMatch() { + return function (embeddings: any) { + const response = supabase + .getDataFromQuery({ + client, + functionNameToCall: "match_documents", + query_embedding: JSON.parse(embeddings)[0].embedding, + similarity_threshold: 0.5, + match_count: 1, + }) + .then((response: any) => { + const contentArr: string[] = []; + for (let i = 0; i < response?.length; i++) { + const element = response[i]; + contentArr.push(element.content); + } + return contentArr.join(" "); + }); + return response; + }; +} + +module.exports = getQueryMatch; diff --git a/JS/edgechains/examples/chat-with-pdf/src/routes/chat.ts b/JS/edgechains/examples/chat-with-pdf/src/routes/chat.ts new file mode 100644 index 000000000..3691575ef --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/routes/chat.ts @@ -0,0 +1,36 @@ +import path from "path"; +//@ts-ignore +import createClient from "sync-rpc"; +import fileURLToPath from "file-uri-to-path"; +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import { InsertToSupabase, splitedDocs } from "../lib/InsertToSupabase.js"; + +import Jsonnet from "@arakoodev/jsonnet"; + +const server = new ArakooServer(); +const __dirname = fileURLToPath(import.meta.url); + +const jsonnet = new Jsonnet(); + +const openAICall = createClient(path.join(__dirname, "../../lib/generateResponse.cjs")); +const getQueryMatch = createClient(path.join(__dirname, "../../lib/getQueryMatch.cjs")); +const getEmbeddings = createClient(path.join(__dirname, "../../lib/getEmbeddings.cjs")); + +// this should run only once for uploding pdf data to supabase then you can continue with the chatbot functionality +await InsertToSupabase(splitedDocs); + +export const ChatRouter: any = server.createApp(); + +ChatRouter.get("/", async (c: any) => { + console.time("ExecutionTime"); + const searchStr = c.req.query("question").toLowerCase(); + jsonnet.extString("query", searchStr); + jsonnet.javascriptCallback("getEmbeddings", getEmbeddings); + jsonnet.javascriptCallback("getQueryMatch", getQueryMatch); + jsonnet.javascriptCallback("openAICall", openAICall); + const response = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../../../jsonnet/main.jsonnet")) + ); + console.timeEnd("ExecutionTime"); + return c.json(response); +}); diff --git a/JS/edgechains/examples/chat-with-pdf/src/tests/chat-with-pdf.test.ts b/JS/edgechains/examples/chat-with-pdf/src/tests/chat-with-pdf.test.ts new file mode 100644 index 000000000..9d66a3385 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/src/tests/chat-with-pdf.test.ts @@ -0,0 +1,8 @@ +import { test, expect } from "vitest"; + +test("should be return expected answer", async () => { + const res = await fetch("http://localhost:3000/chatWithpdf?question=who is Nirmala Sitharaman"); + + const data = await res.json(); + expect(data.res).toString(); +}, 40000); diff --git a/JS/edgechains/examples/chat-with-pdf/tsconfig.json b/JS/edgechains/examples/chat-with-pdf/tsconfig.json new file mode 100644 index 000000000..22f20e090 --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts", "./jsonnet/**/*"] +} diff --git a/JS/edgechains/examples/chat-with-pdf/vitest.config.ts b/JS/edgechains/examples/chat-with-pdf/vitest.config.ts new file mode 100644 index 000000000..f2b57823c --- /dev/null +++ b/JS/edgechains/examples/chat-with-pdf/vitest.config.ts @@ -0,0 +1,7 @@ +import { configDefaults, defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + exclude: [...configDefaults.exclude, "packages/template/*"], + }, +}); diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/backup.js b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/backup.js new file mode 100644 index 000000000..b0c3014fa --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/backup.js @@ -0,0 +1,223 @@ +// import { OpenAI } from "openai"; +// import readlineSync from "readline-sync"; +// import axios from "axios"; +// import moment from "moment-timezone"; +// import { ChatOpenAi } from "arakoodev/openai" +export {}; +// const openai = new OpenAI({ apiKey: "sk-proj-wOByN9rS9LorcpZlyjhYT3BlbkFJYq5aMCDtdXY5MMISVuze" }) +// async function lookupTime(location: string) { +// try { +// const response = await axios.get(`http://worldtimeapi.org/api/timezone/${location}`); +// const { datetime } = response.data; +// const dateTime = moment.tz(datetime, location).format("h:mmA"); +// const timeResponse = `The current time in ${location} is ${dateTime}.`; +// return timeResponse; +// } catch (error) { +// console.error(error); +// } +// } +// async function lookupWeather(location: string) { +// const options = { +// method: 'GET', +// url: 'https://weatherapi-com.p.rapidapi.com/forecast.json', +// params: { +// q: location, +// days: '3' +// }, +// headers: { +// 'X-RapidAPI-Key': "e8c7527ecdmshdd2b467ed60092cp1803cfjsn2a4dcb102fc4", +// ' X-RapidAPI-Host': 'weatherapi-com.p.rapidapi.com' +// } +// }; +// try { +// const response = await axios.request(options); +// let weather = response.data; +// const weatherForecast = `Location: ${weather.location.name} \ +// Current Temperature: ${weather.current.temp_c} \ +// Condition: ${weather.current.condition.text}. \ +// Low Today: ${weather.forecast.forecastday[0].day.mintemp_c} \ +// High Today: ${weather.forecast.forecastday[0].day.maxtemp_c}`; +// console.log({ weatherForecast }); +// return weatherForecast; +// } catch (error) { +// console.error(error); +// return "No forecast found"; +// } +// } +// const user_input = readlineSync.question("Your input: "); +// try { +// const completion = await openai.chat.completions.create({ +// model: "gpt-3.5-turbo-0613", +// messages: [{ role: "user", content: user_input }], +// functions: [ +// { +// name: "lookupTime", +// description: "get the current time in a given location", +// parameters: { +// type: "object", // specify that the parameter is an object +// properties: { +// location: { +// type: "string", // specify the parameter type as a string +// description: "The location, e.g. Beijing, China. But it should be written in a timezone name like Asia/Shanghai" +// } +// }, +// required: ["location"] // specify that the location parameter is required +// } +// }, +// { +// name: "lookupWeather", +// description: "get the weather forecast in a given location", +// parameters: { +// type: "object", // specify that the parameter is an object +// properties: { +// location: { +// type: "string", // specify the parameter type as a string +// description: "The location, e.g. Beijing, China. But it should be written in a city, state, country" +// } +// }, +// required: ["location"] // specify that the location parameter is required +// } +// } +// ], +// function_call: "auto" +// }); +// const completionResponse = completion.choices[0].message; +// if (!completionResponse.content) { +// const functionCallName = completionResponse?.function_call?.name; +// if (functionCallName === "lookupTime") { +// const completionArguments = JSON.parse(completionResponse?.function_call?.arguments!); +// const completion_text = await lookupTime(completionArguments.location); +// console.log(completion_text); +// } else if (functionCallName === "lookupWeather") { +// const completionArguments = JSON.parse(completionResponse?.function_call?.arguments!); +// const completion_text = await lookupWeather(completionArguments.location); +// try { +// const completion = await openai.chat.completions.create({ +// model: "gpt-3.5-turbo-0613", +// messages: [{ role: "user", content: "Summarize the following input." + completion_text }] +// }); +// const completionResponse = completion.choices[0].message.content; +// console.log(completionResponse); +// } catch (error) { +// console.log(error) +// } +// } +// } else { +// const completion_text = completion.choices[0].message.content; +// console.log(completion_text); +// } +// } catch (error) { +// console.error(error); +// } +//////////////////////////////////////////////////////////////// +// import readlineSync from "readline-sync"; +// import axios from "axios"; +// import moment from "moment-timezone"; +// import { OpenAI } from "arakoodev/openai"; +// const openai = new OpenAI({ +// apiKey: "sk-proj-wOByN9rS9LorcpZlyjhYT3BlbkFJYq5aMCDtdXY5MMISVuze" +// }) +// async function lookupTime(location: string) { +// try { +// const response = await axios.get(`http://worldtimeapi.org/api/timezone/${location}`); +// const { datetime } = response.data; +// const dateTime = moment.tz(datetime, location).format("h:mmA"); +// const timeResponse = `The current time in ${location} is ${dateTime}.`; +// return timeResponse; +// } catch (error) { +// console.error(error); +// } +// } +// async function lookupWeather(location: string) { +// const options = { +// method: 'GET', +// url: 'https://weatherapi-com.p.rapidapi.com/forecast.json', +// params: { +// q: location, +// days: '3' +// }, +// headers: { +// 'X-RapidAPI-Key': "e8c7527ecdmshdd2b467ed60092cp1803cfjsn2a4dcb102fc4", +// ' X-RapidAPI-Host': 'weatherapi-com.p.rapidapi.com' +// } +// }; +// try { +// const response = await axios.request(options); +// let weather = response.data; +// const weatherForecast = `Location: ${weather.location.name} \ +// Current Temperature: ${weather.current.temp_c} \ +// Condition: ${weather.current.condition.text}. \ +// Low Today: ${weather.forecast.forecastday[0].day.mintemp_c} \ +// High Today: ${weather.forecast.forecastday[0].day.maxtemp_c}`; +// return weatherForecast; +// } catch (error) { +// console.error(error); +// return "No forecast found"; +// } +// } +// const user_input = readlineSync.question("Your input: "); +// const functions = [ +// { +// name: "lookupTime", +// description: "get the current time in a given location", +// parameters: { +// type: "object", // specify that the parameter is an object +// properties: { +// location: { +// type: "string", // specify the parameter type as a string +// description: "The location, e.g. Beijing, China. But it should be written in a timezone name like Asia/Shanghai" +// } +// }, +// required: ["location"] // specify that the location parameter is required +// } +// }, +// { +// name: "lookupWeather", +// description: "get the weather forecast in a given location", +// parameters: { +// type: "object", // specify that the parameter is an object +// properties: { +// location: { +// type: "string", // specify the parameter type as a string +// description: "The location, e.g. Beijing, China. But it should be written in a city, state, country" +// } +// }, +// required: ["location"] // specify that the location parameter is required +// } +// } +// ] +// try { +// const completion = await openai.chatWithFunction({ +// model: "gpt-3.5-turbo-0613", +// messages: [{ role: "user", content: user_input }], +// functions, +// function_call: "auto" +// }) +// const completionResponse = completion; +// if (!completionResponse.content) { +// const functionCallName = completionResponse?.function_call?.name; +// if (functionCallName === "lookupTime") { +// const completionArguments = JSON.parse(completionResponse?.function_call?.arguments!); +// const completion_text = await lookupTime(completionArguments.location); +// console.log(completion_text); +// } else if (functionCallName === "lookupWeather") { +// const completionArguments = JSON.parse(completionResponse?.function_call?.arguments!); +// const completion_text = await lookupWeather(completionArguments.location); +// try { +// const completion = await openai.chat({ +// model: "gpt-3.5-turbo-0613", +// messages: [{ role: "user", content: "Summarize the following input." + completion_text }] +// }) +// const completionResponse = completion.content; +// console.log(completionResponse); +// } catch (error) { +// console.log(error) +// } +// } +// } else { +// const completion_text = completion.content; +// console.log(completion_text); +// } +// } catch (error) { +// console.error(error); +// } diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/index.js b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/index.js new file mode 100644 index 000000000..e1d445670 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/index.js @@ -0,0 +1,25 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import fileURLToPath from "file-uri-to-path"; +import Jsonnet from "@arakoodev/jsonnet"; +import path from "path"; +//@ts-ignore +import createClient from "sync-rpc"; +const server = new ArakooServer(); +const app = server.createApp(); +const jsonnet = new Jsonnet(); +const __dirname = fileURLToPath(import.meta.url); +const openAIChat = createClient(path.join(__dirname, "../lib/openAIChat.cjs")); +const openAIFunction = createClient(path.join(__dirname, "../lib/openAIFunction.cjs")); +const lookupTime = createClient(path.join(__dirname, "../lib/lookupTime.cjs")); +const lookupWeather = createClient(path.join(__dirname, "../lib/lookupWeather.cjs")); +app.get("/", async (c) => { + const { question } = c.req.query(); + jsonnet.extString("user_input", question); + jsonnet.javascriptCallback("lookupTime", lookupTime); + jsonnet.javascriptCallback("lookupWeather", lookupWeather); + jsonnet.javascriptCallback("openAIChat", openAIChat); + jsonnet.javascriptCallback("openAIFunction", openAIFunction); + const response = jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/main.jsonnet")); + return c.json(response); +}); +server.listen(3000); diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupTime.cjs b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupTime.cjs new file mode 100644 index 000000000..6e3e6e414 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupTime.cjs @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios = require("axios"); +const moment = require("moment-timezone"); +function lookupTime() { + return (location) => { + try { + const response = axios + .get(`http://worldtimeapi.org/api/timezone/${location}`) + .then((response) => { + const { datetime } = response.data; + const dateTime = moment.tz(datetime, location).format("h:mmA"); + const timeResponse = `The current time in ${location} is ${dateTime}.`; + return timeResponse; + }) + .catch((error) => { + console.error(error); + }); + return response; + } catch (error) { + console.error(error); + } + }; +} +module.exports = lookupTime; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupWeather.cjs b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupWeather.cjs new file mode 100644 index 000000000..c1c110f3e --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupWeather.cjs @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios = require("axios"); +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const rapidAPI_Key = JSON.parse(jsonnet.evaluateFile(secretsPath)).rapid_api_key; +function lookupWeather() { + return (location) => { + const options = { + url: "https://weatherapi-com.p.rapidapi.com/forecast.json", + params: { + q: location, + days: "3", + }, + headers: { + "X-RapidAPI-Key": rapidAPI_Key, + " X-RapidAPI-Host": "weatherapi-com.p.rapidapi.com", + }, + }; + try { + const response = axios + .request(options) + .then((response) => { + const weather = response.data; + const weatherForecast = `Location: ${weather.location.name} \ + Current Temperature: ${weather.current.temp_c} \ + Condition: ${weather.current.condition.text}. \ + Low Today: ${weather.forecast.forecastday[0].day.mintemp_c} \ + High Today: ${weather.forecast.forecastday[0].day.maxtemp_c}`; + return weatherForecast; + }) + .catch((error) => { + console.error(error); + }); + return response; + } catch (error) { + console.error(error); + return "No forecast found"; + } + }; +} +module.exports = lookupWeather; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupWheather.cjs b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupWheather.cjs new file mode 100644 index 000000000..8c0fb31a5 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/lookupWheather.cjs @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios = require("axios"); +function lookupWeather() { + return (location) => { + const options = { + method: "GET", + url: "https://weatherapi-com.p.rapidapi.com/forecast.json", + params: { + q: location, + days: "3", + }, + headers: { + "X-RapidAPI-Key": "e8c7527ecdmshdd2b467ed60092cp1803cfjsn2a4dcb102fc4", + " X-RapidAPI-Host": "weatherapi-com.p.rapidapi.com", + }, + }; + try { + const response = axios + .request(options) + .then((response) => { + return response; + }) + .catch((error) => { + console.error(error); + }); + let weather = response.data; + const weatherForecast = `Location: ${weather.location.name} \ + Current Temperature: ${weather.current.temp_c} \ + Condition: ${weather.current.condition.text}. \ + Low Today: ${weather.forecast.forecastday[0].day.mintemp_c} \ + High Today: ${weather.forecast.forecastday[0].day.maxtemp_c}`; + return weatherForecast; + } catch (error) { + console.error(error); + return "No forecast found"; + } + }; +} +module.exports = lookupWeather; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/openAIChat.cjs b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/openAIChat.cjs new file mode 100644 index 000000000..96ccfbd72 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/openAIChat.cjs @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const apiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; +const openai = new OpenAI({ + apiKey, +}); +function openAIChat() { + return (prompt) => { + try { + const completion = openai + .chat({ + model: "gpt-3.5-turbo-0613", + messages: [ + { role: "user", content: "Summarize the following input." + prompt }, + ], + }) + .then((completion) => { + return JSON.stringify(completion); + }) + .catch((error) => { + console.error(error); + }); + return completion; + } catch (error) { + console.error(error); + } + }; +} +module.exports = openAIChat; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/openAIFunction.cjs b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/openAIFunction.cjs new file mode 100644 index 000000000..20d4d3232 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/lib/openAIFunction.cjs @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const apiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; +const openai = new OpenAI({ + apiKey, +}); +function openAIFunction() { + return ({ prompt, functions }) => { + try { + const completion = openai + .chatWithFunction({ + model: "gpt-3.5-turbo-0613", + messages: [{ role: "user", content: prompt }], + functions, + function_call: "auto", + }) + .then((completion) => { + return JSON.stringify(completion); + }) + .catch((error) => { + console.error(error); + }); + return completion; + } catch (error) { + console.error(error); + } + }; +} +module.exports = openAIFunction; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/dist/weather.js b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/weather.js new file mode 100644 index 000000000..a34a84b22 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/dist/weather.js @@ -0,0 +1,140 @@ +var _a, _b, _c; +import readlineSync from "readline-sync"; +import axios from "axios"; +import moment from "moment-timezone"; +import { OpenAI } from "arakoodev/openai"; +const openai = new OpenAI({ + apiKey: "sk-proj-wOByN9rS9LorcpZlyjhYT3BlbkFJYq5aMCDtdXY5MMISVuze", +}); +async function lookupTime(location) { + try { + const response = await axios.get(`http://worldtimeapi.org/api/timezone/${location}`); + const { datetime } = response.data; + const dateTime = moment.tz(datetime, location).format("h:mmA"); + const timeResponse = `The current time in ${location} is ${dateTime}.`; + return timeResponse; + } catch (error) { + console.error(error); + } +} +async function lookupWeather(location) { + const options = { + method: "GET", + url: "https://weatherapi-com.p.rapidapi.com/forecast.json", + params: { + q: location, + days: "3", + }, + headers: { + "X-RapidAPI-Key": "e8c7527ecdmshdd2b467ed60092cp1803cfjsn2a4dcb102fc4", + " X-RapidAPI-Host": "weatherapi-com.p.rapidapi.com", + }, + }; + try { + const response = await axios.request(options); + let weather = response.data; + const weatherForecast = `Location: ${weather.location.name} \ + Current Temperature: ${weather.current.temp_c} \ + Condition: ${weather.current.condition.text}. \ + Low Today: ${weather.forecast.forecastday[0].day.mintemp_c} \ + High Today: ${weather.forecast.forecastday[0].day.maxtemp_c}`; + console.log({ weatherForecast }); + return weatherForecast; + } catch (error) { + console.error(error); + return "No forecast found"; + } +} +const user_input = readlineSync.question("Your input: "); +const functions = [ + { + name: "lookupTime", + description: "get the current time in a given location", + parameters: { + type: "object", // specify that the parameter is an object + properties: { + location: { + type: "string", // specify the parameter type as a string + description: + "The location, e.g. Beijing, China. But it should be written in a timezone name like Asia/Shanghai", + }, + }, + required: ["location"], // specify that the location parameter is required + }, + }, + { + name: "lookupWeather", + description: "get the weather forecast in a given location", + parameters: { + type: "object", // specify that the parameter is an object + properties: { + location: { + type: "string", // specify the parameter type as a string + description: + "The location, e.g. Beijing, China. But it should be written in a city, state, country", + }, + }, + required: ["location"], // specify that the location parameter is required + }, + }, +]; +try { + const completion = await openai.chatWithFunction({ + model: "gpt-3.5-turbo-0613", + messages: [{ role: "user", content: user_input }], + functions, + function_call: "auto", + }); + const completionResponse = completion; + if (!completionResponse.content) { + const functionCallName = + (_a = + completionResponse === null || completionResponse === void 0 + ? void 0 + : completionResponse.function_call) === null || _a === void 0 + ? void 0 + : _a.name; + if (functionCallName === "lookupTime") { + const completionArguments = JSON.parse( + (_b = + completionResponse === null || completionResponse === void 0 + ? void 0 + : completionResponse.function_call) === null || _b === void 0 + ? void 0 + : _b.arguments + ); + const completion_text = await lookupTime(completionArguments.location); + console.log(completion_text); + } else if (functionCallName === "lookupWeather") { + const completionArguments = JSON.parse( + (_c = + completionResponse === null || completionResponse === void 0 + ? void 0 + : completionResponse.function_call) === null || _c === void 0 + ? void 0 + : _c.arguments + ); + const completion_text = await lookupWeather(completionArguments.location); + try { + const completion = await openai.chat({ + model: "gpt-3.5-turbo-0613", + messages: [ + { + role: "user", + content: "Summarize the following input." + completion_text, + }, + ], + }); + const completionResponse = completion.content; + console.log(completionResponse); + } catch (error) { + console.log(error); + } + } + } else { + const completion_text = completion.content; + console.log(completion_text); + } +} catch (error) { + console.error(error); +} diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/jsonnet/main.jsonnet b/JS/edgechains/examples/getWeather-or-time-function-calling/jsonnet/main.jsonnet new file mode 100644 index 000000000..c1adfa790 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/jsonnet/main.jsonnet @@ -0,0 +1,61 @@ +local functions = [ + { + name: "lookupTime", + description: "get the current time in a given location", + parameters: { + type: "object", // specify that the parameter is an object + properties: { + location: { + type: "string", // specify the parameter type as a string + description: "The location, e.g. Beijing, China. But it should be written in a timezone name like Asia/Shanghai" + } + }, + required: ["location"] // specify that the location parameter is required + } + }, + { + name: "lookupWeather", + description: "get the weather forecast in a given location", + parameters: { + type: "object", // specify that the parameter is an object + properties: { + location: { + type: "string", // specify the parameter type as a string + description: "The location, e.g. Beijing, China. But it should be written in a city, state, country" + } + }, + required: ["location"] // specify that the location parameter is required + } + } +]; + + +local user_input = std.extVar("user_input"); + +local completionResponse = std.parseJson(arakoo.native("openAIFunction")({prompt:user_input, functions:functions})); + +// { +// role: 'assistant', +// content: null, +// function_call: { +// name: 'lookupWeather', +// arguments: '{\n "location": "Paris, France"\n}' +// } +// } + +if(completionResponse.content == null || completionResponse.content == "null") then + local functionCallName = completionResponse.function_call.name; + if(functionCallName == "lookupTime") then + local completionArguments = completionResponse.function_call.arguments; + local completion_text = arakoo.native("lookupTime")(std.parseJson(completionArguments).location); + completion_text + else if(functionCallName == "lookupWeather") then + local completionArguments = completionResponse.function_call.arguments; + local completion_text = arakoo.native("lookupWeather")(std.parseJson(completionArguments).location); + + local completion = std.parseJson(arakoo.native("openAIChat")(completion_text)); + local completionResponse = completion.content; + completionResponse +else + local completion_text = completionResponse.content; + completion_text diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/jsonnet/secrets.jsonnet b/JS/edgechains/examples/getWeather-or-time-function-calling/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..090cd6e67 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/jsonnet/secrets.jsonnet @@ -0,0 +1,9 @@ + +local OPENAI_API_KEY = "sk-proj-***"; +local Rapid_API_Key = "e8c***"; + +{ + "rapid_api_key":Rapid_API_Key, + "openai_api_key":OPENAI_API_KEY, +} + diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/package.json b/JS/edgechains/examples/getWeather-or-time-function-calling/package.json new file mode 100644 index 000000000..46fd03ba7 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/package.json @@ -0,0 +1,27 @@ +{ + "name": "function-calling", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "tsc && node --experimental-wasm-modules ./dist/index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "^0.23.6", + "@arakoodev/jsonnet": "^0.23.6", + "axios": "^1.7.1", + "file-uri-to-path": "^2.0.0", + "moment-timezone": "^0.5.45", + "openai": "^4.47.1", + "path": "^0.12.7", + "sync-rpc": "^1.3.6" + }, + "devDependencies": { + "@types/node": "^20.14.1" + } +} diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/readme.md b/JS/edgechains/examples/getWeather-or-time-function-calling/readme.md new file mode 100644 index 000000000..cec819919 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/readme.md @@ -0,0 +1,47 @@ +## Tutorial Video + +https://youtu.be/oIsa24uPaQ4 + +## Installation + +1. Install the required dependencies: + + ```bash + npm install + ``` + +## Configuration + +1 Add OpenAiApi key in secrets.jsonnet + + ```bash + local OPENAI_API_KEY = "sk-****"; + ``` + +2 Add RapidAPIKey key in secrets.jsonnet + + + + ```bash + local Rapid_API_Key = "e8c7527e*****"; + ``` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Hit the `GET` endpoint. + + ```bash + http://localhost:3000?question=Paris temperature + ``` + + or + + ```bash + http://localhost:3000?question=Paris time + ``` diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/src/index.ts b/JS/edgechains/examples/getWeather-or-time-function-calling/src/index.ts new file mode 100644 index 000000000..626413234 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/src/index.ts @@ -0,0 +1,31 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import fileURLToPath from "file-uri-to-path"; +import Jsonnet from "@arakoodev/jsonnet"; +import path from "path"; + +//@ts-ignore +import createClient from "sync-rpc"; + +const server = new ArakooServer(); +const app = server.createApp(); +const jsonnet = new Jsonnet(); + +const __dirname = fileURLToPath(import.meta.url); + +const openAIChat = createClient(path.join(__dirname, "../lib/openAIChat.cjs")); +const openAIFunction = createClient(path.join(__dirname, "../lib/openAIFunction.cjs")); +const lookupTime = createClient(path.join(__dirname, "../lib/lookupTime.cjs")); +const lookupWeather = createClient(path.join(__dirname, "../lib/lookupWeather.cjs")); + +app.get("/", async (c) => { + const { question } = c.req.query(); + jsonnet.extString("user_input", question); + jsonnet.javascriptCallback("lookupTime", lookupTime); + jsonnet.javascriptCallback("lookupWeather", lookupWeather); + jsonnet.javascriptCallback("openAIChat", openAIChat); + jsonnet.javascriptCallback("openAIFunction", openAIFunction); + const response = jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/main.jsonnet")); + return c.json(response); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/lookupTime.cts b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/lookupTime.cts new file mode 100644 index 000000000..0c1d41472 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/lookupTime.cts @@ -0,0 +1,26 @@ +const axios = require("axios"); +const moment = require("moment-timezone"); + +function lookupTime() { + return (location: string) => { + try { + const response = axios + .get(`http://worldtimeapi.org/api/timezone/${location}`) + .then((response: any) => { + const { datetime } = response.data; + const dateTime = moment.tz(datetime, location).format("h:mmA"); + const timeResponse = `The current time in ${location} is ${dateTime}.`; + return timeResponse; + }) + .catch((error: any) => { + console.error(error); + }); + + return response; + } catch (error) { + console.error(error); + } + }; +} + +module.exports = lookupTime; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/lookupWeather.cts b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/lookupWeather.cts new file mode 100644 index 000000000..95ddbdb74 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/lookupWeather.cts @@ -0,0 +1,45 @@ +const axios = require("axios"); +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const rapidAPI_Key = JSON.parse(jsonnet.evaluateFile(secretsPath)).rapid_api_key; + +function lookupWeather() { + return (location: string) => { + const options = { + url: "https://weatherapi-com.p.rapidapi.com/forecast.json", + params: { + q: location, + days: "3", + }, + headers: { + "X-RapidAPI-Key": rapidAPI_Key, + " X-RapidAPI-Host": "weatherapi-com.p.rapidapi.com", + }, + }; + try { + const response = axios + .request(options) + .then((response: any) => { + const weather = response.data; + const weatherForecast = `Location: ${weather.location.name} \ + Current Temperature: ${weather.current.temp_c} \ + Condition: ${weather.current.condition.text}. \ + Low Today: ${weather.forecast.forecastday[0].day.mintemp_c} \ + High Today: ${weather.forecast.forecastday[0].day.maxtemp_c}`; + return weatherForecast; + }) + .catch((error: any) => { + console.error(error); + }); + return response; + } catch (error) { + console.error(error); + return "No forecast found"; + } + }; +} + +module.exports = lookupWeather; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/openAIChat.cts b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/openAIChat.cts new file mode 100644 index 000000000..088f675c7 --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/openAIChat.cts @@ -0,0 +1,37 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); + +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const apiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const openai = new OpenAI({ + apiKey, +}); + +function openAIChat() { + return (prompt: string) => { + try { + const completion = openai + .chat({ + model: "gpt-3.5-turbo-0613", + messages: [ + { role: "user", content: "Summarize the following input." + prompt }, + ], + }) + .then((completion: any) => { + return JSON.stringify(completion); + }) + .catch((error: any) => { + console.error(error); + }); + return completion; + } catch (error) { + console.error(error); + } + }; +} + +module.exports = openAIChat; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/openAIFunction.cts b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/openAIFunction.cts new file mode 100644 index 000000000..96ae6f7ec --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/src/lib/openAIFunction.cts @@ -0,0 +1,42 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); + +const path = require("path"); +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const apiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const openai = new OpenAI({ + apiKey, +}); + +interface messageOption { + prompt: string; + functions: object | Array; +} + +function openAIFunction() { + return ({ prompt, functions }: messageOption) => { + try { + const completion = openai + .chatWithFunction({ + model: "gpt-3.5-turbo-0613", + messages: [{ role: "user", content: prompt }], + functions, + function_call: "auto", + }) + .then((completion: any) => { + return JSON.stringify(completion); + }) + .catch((error: any) => { + console.error(error); + }); + return completion; + } catch (error) { + console.error(error); + } + }; +} + +module.exports = openAIFunction; diff --git a/JS/edgechains/examples/getWeather-or-time-function-calling/tsconfig.json b/JS/edgechains/examples/getWeather-or-time-function-calling/tsconfig.json new file mode 100644 index 000000000..2cc46747c --- /dev/null +++ b/JS/edgechains/examples/getWeather-or-time-function-calling/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "exclude": ["./jsonnet"] +} diff --git a/JS/edgechains/examples/language-translater/.gitignore b/JS/edgechains/examples/language-translater/.gitignore new file mode 100644 index 000000000..76add878f --- /dev/null +++ b/JS/edgechains/examples/language-translater/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/JS/edgechains/examples/language-translater/jsonnet/main.jsonnet b/JS/edgechains/examples/language-translater/jsonnet/main.jsonnet new file mode 100644 index 000000000..02c124a1f --- /dev/null +++ b/JS/edgechains/examples/language-translater/jsonnet/main.jsonnet @@ -0,0 +1,17 @@ + +local promptTemplate = ||| + You are a helpful assistant that translate this text {text} into this language {language}. + |||; + + +local text = std.extVar("text"); +local language = std.extVar("language"); + +local promptWithtext = std.strReplace(promptTemplate,'{text}', text + "\n"); +local finalPrompt = std.strReplace(promptWithtext,'{language}', language + "\n"); + +local main() = + local response = arakoo.native("openAICall")(finalPrompt); + response; + +main() \ No newline at end of file diff --git a/JS/edgechains/examples/language-translater/jsonnet/secrets.jsonnet b/JS/edgechains/examples/language-translater/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..978cacd33 --- /dev/null +++ b/JS/edgechains/examples/language-translater/jsonnet/secrets.jsonnet @@ -0,0 +1,7 @@ + +local OPENAI_API_KEY = "sk-proj-***"; + +{ + "openai_api_key":OPENAI_API_KEY, +} + diff --git a/JS/edgechains/examples/language-translater/package.json b/JS/edgechains/examples/language-translater/package.json new file mode 100644 index 000000000..eed656342 --- /dev/null +++ b/JS/edgechains/examples/language-translater/package.json @@ -0,0 +1,31 @@ +{ + "name": "language-translater", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "keywords": [], + "author": "", + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js" + }, + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "^0.23.6", + "@arakoodev/jsonnet": "^0.23.6", + "@types/node": "^20.14.2", + "file-uri-to-path": "^2.0.0", + "hono": "^4.4.5", + "htmx.org": "^1.9.12", + "hyperscript.org": "^0.9.12", + "path": "^0.12.7", + "react": "^18.3.1", + "sync-rpc": "^1.3.6", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/cors": "^2.8.17", + "@types/react": "^18.3.3", + "tailwindcss": "^3.4.4" + } +} diff --git a/JS/edgechains/examples/language-translater/readme.md b/JS/edgechains/examples/language-translater/readme.md new file mode 100644 index 000000000..e4ef87996 --- /dev/null +++ b/JS/edgechains/examples/language-translater/readme.md @@ -0,0 +1,32 @@ +# Project Name + +This is a Language Translate app + +## Tutorial Video + +https://youtu.be/RTARGcRW_0I + +## Backend + +### Configuration + +1 Add OpenAiApi key in secrets.jsonnet + + ``` + local OPENAI_API_KEY = "sk-****"; + ``` + +## Usage + +1. Start the server: + + ```bash + cd backend + npm run start + ``` + +2. Hit this following endpoint + + ```bash + localhost:3000 + ``` diff --git a/JS/edgechains/examples/language-translater/src/index.tsx b/JS/edgechains/examples/language-translater/src/index.tsx new file mode 100644 index 000000000..e9391d79c --- /dev/null +++ b/JS/edgechains/examples/language-translater/src/index.tsx @@ -0,0 +1,34 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Home from "./pages/Home.js"; +import Jsonnet from "@arakoodev/jsonnet"; +//@ts-ignore +import createClient from "sync-rpc"; +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +const server = new ArakooServer(); + +const app = server.createApp(); + +server.useCors(); + +const jsonnet = new Jsonnet(); +const __dirname = fileURLToPath(import.meta.url); + +const openAICall = createClient(path.join(__dirname, "../lib/generateResponse.cjs")); + +app.get("/", (c: any) => { + return c.html(); +}); + +app.post("/translate", async (c: any) => { + const { language, text } = await c.req.parseBody(); + jsonnet.extString("language", language || ""); + jsonnet.extString("text", text || ""); + jsonnet.javascriptCallback("openAICall", openAICall); + let response = await JSON.parse( + JSON.parse(jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/main.jsonnet"))) + ); + return c.text("Your text is : " + response.answer); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/language-translater/src/layout/index.tsx b/JS/edgechains/examples/language-translater/src/layout/index.tsx new file mode 100644 index 000000000..4cf6184c5 --- /dev/null +++ b/JS/edgechains/examples/language-translater/src/layout/index.tsx @@ -0,0 +1,18 @@ +// import "htmx.org" +export default function Layout({ children }: { children: any }) { + return ( + + + + + + + + {children} + + ); +} diff --git a/JS/edgechains/examples/language-translater/src/lib/generateResponse.cts b/JS/edgechains/examples/language-translater/src/lib/generateResponse.cts new file mode 100644 index 000000000..bf37e5159 --- /dev/null +++ b/JS/edgechains/examples/language-translater/src/lib/generateResponse.cts @@ -0,0 +1,28 @@ +import { z } from "zod"; +const path = require("path"); +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); + +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const openAIApiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const openai = new OpenAI({ apiKey: openAIApiKey }); + +const schema = z.object({ + answer: z.string().describe("The answer to the question"), +}); + +function openAICall() { + return function (prompt: string) { + try { + return openai.zodSchemaResponse({ prompt, schema: schema }).then((res: any) => { + return JSON.stringify(res); + }); + } catch (error) { + return error; + } + }; +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/language-translater/src/pages/Home.tsx b/JS/edgechains/examples/language-translater/src/pages/Home.tsx new file mode 100644 index 000000000..c0733ff69 --- /dev/null +++ b/JS/edgechains/examples/language-translater/src/pages/Home.tsx @@ -0,0 +1,62 @@ +import Layout from "../layout/index.js"; + +export default function Home() { + return ( + <> + +
    +
    +
    + + + + + + +
    + +
    +
    +
    +
    + + ); +} diff --git a/JS/edgechains/examples/language-translater/tsconfig.json b/JS/edgechains/examples/language-translater/tsconfig.json new file mode 100644 index 000000000..01890f93d --- /dev/null +++ b/JS/edgechains/examples/language-translater/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx" + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/react-chain/.gitignore b/JS/edgechains/examples/react-chain/.gitignore new file mode 100644 index 000000000..de4d1f007 --- /dev/null +++ b/JS/edgechains/examples/react-chain/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/JS/edgechains/examples/react-chain/jsonnet/main.jsonnet b/JS/edgechains/examples/react-chain/jsonnet/main.jsonnet new file mode 100644 index 000000000..52c26c847 --- /dev/null +++ b/JS/edgechains/examples/react-chain/jsonnet/main.jsonnet @@ -0,0 +1,213 @@ +local promptTemplate = ||| + Question: What is the elevation range for the area that the eastern sector of the + Colorado orogeny extends into? + Thought 1: I need to search Colorado orogeny, find the area that the eastern sector + of the Colorado orogeny extends into, then find the elevation range of the + area. + Action 1: Search[Colorado orogeny] + Observation 1: The Colorado orogeny was an episode of mountain building (an orogeny) in + Colorado and surrounding areas. + Thought 2: It does not mention the eastern sector. So I need to look up eastern + sector. + Action 2: Lookup[eastern sector] + Observation 2: (Result 1 / 1) The eastern sector extends into the High Plains and is called + the Central Plains orogeny. + Thought 3: The eastern sector of Colorado orogeny extends into the High Plains. So I + need to search High Plains and find its elevation range. + Action 3: Search[High Plains] + Observation 3: High Plains refers to one of two distinct land regions + Thought 4: I need to instead search High Plains (United States). + Action 4: Search[High Plains (United States)] + Observation 4: The High Plains are a subregion of the Great Plains. From east to west, the + High Plains rise in elevation from around 1,800 to 7,000 ft (550 to 2,130 + m).[3] + Thought 5: High Plains rise in elevation from around 1,800 to 7,000 ft, so the answer + is 1,800 to 7,000 ft. + Action 5: Finish[1,800 to 7,000 ft] + + Question: Musician and satirist Allie Goertz wrote a song about the "The Simpsons" + character Milhouse, who Matt Groening named after who? + Thought 1: The question simplifies to "The Simpsons" character Milhouse is named after + who. I only need to search Milhouse and find who it is named after. + Action 1: Search[Milhouse] + Observation 1: Milhouse Mussolini Van Houten is a recurring character in the Fox animated + television series The Simpsons voiced by Pamela Hayden and created by Matt + Groening. + Thought 2: The paragraph does not tell who Milhouse is named after, maybe I can look up + "named after". + Action 2: Lookup[named after] + Observation 2: (Result 1 / 1) Milhouse was named after U.S. president Richard Nixon, whose + middle name was Milhous. + Thought 3: Milhouse was named after U.S. president Richard Nixon, so the answer is + Richard Nixon. + Action 3: Finish[Richard Nixon] + + Question: Which documentary is about Finnish rock groups, Adam Clayton Powell or The + Saimaa Gesture? + Thought 1: I need to search Adam Clayton Powell and The Saimaa Gesture, and find which + documentary is about Finnish rock groups. + Action 1: Search[Adam Clayton Powell] + Observation 1 Could not find [Adam Clayton Powell]. Similar: [’Adam Clayton Powell + III’, ’Seventh Avenue (Manhattan)’, ’Adam Clayton Powell Jr. State Office + Building’, ’Isabel Washington Powell’, ’Adam Powell’, ’Adam Clayton Powell + (film)’, ’Giancarlo Esposito’]. + Thought 2: To find the documentary, I can search Adam Clayton Powell (film). + Action 2: Search[Adam Clayton Powell (film)] + Observation 2: Adam Clayton Powell is a 1989 American documentary film directed by + Richard Kilberg. The film is about the rise and fall of influential + African-American politician Adam Clayton Powell Jr.[3][4] It was later aired + as part of the PBS series The American Experience. + Thought 3: Adam Clayton Powell (film) is a documentary about an African-American + politician, not Finnish rock groups. So the documentary about Finnish rock + groups must instead be The Saimaa Gesture. + Action 3: Finish[The Saimaa Gesture] + + Question: What profession does Nicholas Ray and Elia Kazan have in common? + Thought 1: I need to search Nicholas Ray and Elia Kazan, find their professions, then + find the profession they have in common. + Action 1: Search[Nicholas Ray] + Observation 1: Nicholas Ray (born Raymond Nicholas Kienzle Jr., August 7, 1911 - June 16, + 1979) was an American film director, screenwriter, and actor best known for + the 1955 film Rebel Without a Cause. + Thought 2: Professions of Nicholas Ray are director, screenwriter, and actor. I need + to search Elia Kazan next and find his professions. + Action 2: Search[Elia Kazan] + Observation 2: Elia Kazan was an American film and theatre director, producer, screenwriter + and actor. + Thought 3: Professions of Elia Kazan are director, producer, screenwriter, and actor. + So profession Nicholas Ray and Elia Kazan have in common is director, + screenwriter, and actor. + Action 3: Finish[director, screenwriter, actor] + + Question: Which magazine was started first Arthur’s Magazine or First for Women? + Thought 1: I need to search Arthur’s Magazine and First for Women, and find which was + started first. + Action 1: Search[Arthur’s Magazine] + Observation 1: Arthur’s Magazine (1844-1846) was an American literary periodical published + in Philadelphia in the 19th century. + Thought 2: Arthur’s Magazine was started in 1844. I need to search First for Women + next. + Action 2: Search[First for Women] + Observation 2: First for Women is a woman’s magazine published by Bauer Media Group in the + USA.[1] The magazine was started in 1989. + Thought 3: First for Women was started in 1989. 1844 (Arthur’s Magazine) < 1989 (First + for Women), so Arthur’s Magazine was started first. + Action 3: Finish[Arthur’s Magazine] + + Question: Were Pavel Urysohn and Leonid Levin known for the same type of work? + Thought 1: I need to search Pavel Urysohn and Leonid Levin, find their types of work, + then find if they are the same. + Action 1: Search[Pavel Urysohn] + Observation 1: Pavel Samuilovich Urysohn (February 3, 1898 - August 17, 1924) was a Soviet + mathematician who is best known for his contributions in dimension theory. + Thought 2: Pavel Urysohn is a mathematician. I need to search Leonid Levin next and + find its type of work. + Action 2: Search[Leonid Levin] + Observation 2: Leonid Anatolievich Levin is a Soviet-American mathematician and computer + scientist. + Thought 3: Leonid Levin is a mathematician and computer scientist. So Pavel Urysohn + and Leonid Levin have the same type of work. + Action 3: Finish[yes] + + --ALL THE OBSERVATIONS WILL BE PROVIDED BY THE USER, YOU DON't HAVE TO PROVIDE ANY OBSERVATION-- + Question: {} + |||; + + +local UserQuestion = std.extVar("question"); + + +local range = std.range(1, 10); + + +local updatedPrompt = std.strReplace(promptTemplate,'{}', UserQuestion + "\n"); + + +local getOpenAiResponse(prompt) = + local key = std.extVar("openai_key"); + local response = arakoo.native("openAICall")({ prompt: prompt, apiKey: key }); + response; + + +local extractThought(text, actionNumber) = + local searchPattern = 'Thought ' + actionNumber + ': (.+)'; + local get_search_string = arakoo.regexMatch(text, searchPattern)[0]; + get_search_string; + + +local extractAction(text, actionNumber) = + local searchPattern = "Action " + std.toString(actionNumber) + ": " + "(.*)"; + local get_search_string = arakoo.regexMatch(text, searchPattern)[0]; + get_search_string; + +local findMatch(text, searchString) = + local match = arakoo.includes(searchString, text) || arakoo.includes(text, searchString); + match; + +local getObservation(searchTitle) = + local url = "https://en.wikipedia.org/w/api.php"; + local apiUrl = url + "?action=query&format=json&list=search&formatversion=2&srsearch=" + arakoo.urlEncode(searchTitle); + local wikiConfig = { + url: apiUrl, + }; + local wikipediaResponse = std.parseJson(arakoo.native("apiCall")(wikiConfig)).query.search; + local data = [ + if findMatch(searchTitle, wikipediaResponse[x].title) then {title: wikipediaResponse[x].title, pageId: wikipediaResponse[x].pageid} for x in std.range(0, std.length(wikipediaResponse) - 1) + ]; + + local pageId = std.toString(data[0].pageId); + local summaryUrl = url + "?action=query&format=json&exintro&explaintext&prop=extracts&redirects=1&pageids=" + pageId; + + local summaryConfig = { + url: summaryUrl, + }; + local extractedSummary = std.parseJson(arakoo.native("apiCall")(summaryConfig)).query.pages[pageId].extract; + + extractedSummary; + + +local extractAnswer(text, actionNumber) = + local searchPattern = 'Action ' + actionNumber + ': (.*)'; + local get_search_string = arakoo.regexMatch(text, searchPattern)[0]; + get_search_string; + + +local checkIfFinish(text) = + if arakoo.includes(text, "Finish") then true else false; + + +local extractMatch(text) = + local searchPattern = "\\[(.*)\\]"; + local get_match = arakoo.regexMatch(text, searchPattern)[0]; + get_match; + +local getFinalOutput(acc) = + local searchPattern = "--ALL THE OBSERVATIONS WILL BE PROVIDED BY THE USER, YOU DON't HAVE TO PROVIDE ANY OBSERVATION--(?s)(.*$)"; + local finalOutput = arakoo.regexMatch(acc, searchPattern)[0]; + finalOutput; + +local main() = + std.foldl(function(acc, i) + if arakoo.includes(getFinalOutput(acc), "Finish[") then + acc + else + local content = getOpenAiResponse(acc); + local actionNumber = i; + if(!std.isEmpty(content)) then + local action = extractAction(content, actionNumber); + local thought = extractThought(content, actionNumber); + if (!std.isEmpty(action) && !std.isEmpty(thought)) then + + if checkIfFinish(action) then + acc + '\nThought ' + actionNumber + ':' + thought + '\nAction ' + actionNumber + ': ' + action + + else + local match = extractMatch(action); + local observation = getObservation(match); + acc + '\nThought ' + actionNumber + ': ' + thought + '\nAction ' + actionNumber + ': ' + action + '\nObservation ' + actionNumber + ': ' + observation, + + range, + updatedPrompt); + + +getFinalOutput(main()) diff --git a/JS/edgechains/examples/react-chain/jsonnet/secrets.jsonnet b/JS/edgechains/examples/react-chain/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..978cacd33 --- /dev/null +++ b/JS/edgechains/examples/react-chain/jsonnet/secrets.jsonnet @@ -0,0 +1,7 @@ + +local OPENAI_API_KEY = "sk-proj-***"; + +{ + "openai_api_key":OPENAI_API_KEY, +} + diff --git a/JS/edgechains/examples/react-chain/package.json b/JS/edgechains/examples/react-chain/package.json new file mode 100644 index 000000000..df111124a --- /dev/null +++ b/JS/edgechains/examples/react-chain/package.json @@ -0,0 +1,29 @@ +{ + "name": "react-chain", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js", + "wasm": "tsc && webpack && arakoo-compiler dist/final.js", + "test": "npx vitest" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "^0.24.1", + "@arakoodev/jsonnet": "^0.24.0", + "axios": "^1.7.2", + "file-uri-to-path": "^2.0.0", + "path": "^0.12.7", + "webpack": "5.91" + }, + "devDependencies": { + "@types/deasync": "^0.1.5", + "@types/node": "^20.14.1", + "vitest": "^1.5.3", + "webpack-cli": "^5.1.4" + } +} diff --git a/JS/edgechains/examples/react-chain/readme.md b/JS/edgechains/examples/react-chain/readme.md new file mode 100644 index 000000000..f54a37896 --- /dev/null +++ b/JS/edgechains/examples/react-chain/readme.md @@ -0,0 +1,51 @@ +# React Chain Example + +This is an example project that demonstrates the usage of React Chain. + +## Configuration + +1 Add OpenAiApi key in secrets.jsonnet + + ```bash + local OPENAI_API_KEY = "sk-****"; + ``` + +## Installation + +1. Install the dependencies: + + ```bash + npm install + ``` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Hit the `GET` endpoint with question + + ```bash + http://localhost:5000?question=Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President? + ``` + +## Compilation to wasm + +> For compilation to wasm you must have arakoo-compiler and arakoo runtime installed (For installation instruction you can refer the [readme ](https://github.com/redoC-A2k/EdgeChains#setup-1)) + +1. Build the arakoo runtime compatible wasm + +```bash +npm run wasm +``` + +2. Run the wasm with runtime (index.wasm will be in the directory in which you run npm run wasm) + +```bash +arakoo index.wasm +``` + +Now you are good to go send the request to port 8080 diff --git a/JS/edgechains/examples/react-chain/replacedirnameloader.cjs b/JS/edgechains/examples/react-chain/replacedirnameloader.cjs new file mode 100644 index 000000000..524873686 --- /dev/null +++ b/JS/edgechains/examples/react-chain/replacedirnameloader.cjs @@ -0,0 +1,14 @@ +const path = require("path"); + +module.exports = function (source) { + // console.log(source) + return source.replace(/__dirname/g, (match, p1) => { + // try { + return `"${this.context}"`; + // } catch (error) { + // console.log("error ",error) + // return match; + // } + // return `require('${filePath}')`; + }); +}; diff --git a/JS/edgechains/examples/react-chain/replaceloader.cjs b/JS/edgechains/examples/react-chain/replaceloader.cjs new file mode 100644 index 000000000..8afec60e6 --- /dev/null +++ b/JS/edgechains/examples/react-chain/replaceloader.cjs @@ -0,0 +1,22 @@ +// module.exports = function (source) { +// // Regular expression to match createClient(import.meta.resolve()) +// const regex = /createClient\s*\(\s*import\.meta\.resolve\s*\(\s*(['"`].*?['"`])\s*\)\s*\)/g; + +// // Replace with require() +// return source.replace(regex, 'require($1)'); +// }; + +const path = require("path"); + +module.exports = function (source) { + // console.log(source) + return source.replace(/createClient\(([^()]*(?:\([^()]*\)[^()]*)*)\)/g, (match, p1) => { + // console.log("P1", p1) + // console.log("this.context" ,this.context) + __dirname = this.context; + // console.log("eval", eval(p1)) + // console.log("__dirname", __dirname) + const filePath = path.resolve(this.context, eval(p1)); + return `require('${filePath}')`; + }); +}; diff --git a/JS/edgechains/examples/react-chain/src/index.ts b/JS/edgechains/examples/react-chain/src/index.ts new file mode 100644 index 000000000..9a995a870 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/index.ts @@ -0,0 +1,10 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import { ReactChainRouter } from "./routes/react-chain.js"; + +const server = new ArakooServer(); + +const app = server.createApp(); + +app.route("/", ReactChainRouter); + +server.listen(5000); diff --git a/JS/edgechains/examples/react-chain/src/lib/apiCall.cts b/JS/edgechains/examples/react-chain/src/lib/apiCall.cts new file mode 100644 index 000000000..0a22abb67 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/lib/apiCall.cts @@ -0,0 +1,11 @@ +import axios from "axios"; + +async function apiCall(config: any) { + try { + const response = await axios.request(config); + return JSON.stringify(response.data); + } catch (error) { + console.error(error); + } +} +module.exports = apiCall; diff --git a/JS/edgechains/examples/react-chain/src/lib/generateResponse.cts b/JS/edgechains/examples/react-chain/src/lib/generateResponse.cts new file mode 100644 index 000000000..a55647a86 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/lib/generateResponse.cts @@ -0,0 +1,17 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); + +async function openAICall({ prompt, apiKey }: any) { + try { + const openai = new OpenAI({ + apiKey: apiKey, + temperature: 0, + }); + return openai.chat({ prompt }).then((res: any) => { + return res.content; + }); + } catch (error) { + return error; + } +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/react-chain/src/routes/react-chain.ts b/JS/edgechains/examples/react-chain/src/routes/react-chain.ts new file mode 100644 index 000000000..a59e5d105 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/routes/react-chain.ts @@ -0,0 +1,34 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Jsonnet from "@arakoodev/jsonnet"; +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +//@ts-ignore +import createClient from "@arakoodev/edgechains.js/sync-rpc"; + +const server = new ArakooServer(); +const jsonnet = new Jsonnet(); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const openAICall = createClient(path.join(__dirname, "../lib/generateResponse.cjs")); +const apiCall = createClient(path.join(__dirname, "../lib/apiCall.cjs")); + +export const ReactChainRouter = server.createApp(); + +ReactChainRouter.get("/", async (c: any) => { + try { + const question = c.req.query("question"); + let key = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/secrets.jsonnet")) + ).openai_api_key; + jsonnet.extString("question", question || ""); + jsonnet.extString("openai_key", key); + jsonnet.javascriptCallback("openAICall", openAICall); + jsonnet.javascriptCallback("apiCall", apiCall); + let response = jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/main.jsonnet")); + return c.json(response); + } catch (error) { + return c.json({ + response: "Any error occured while finding the answer. Please try again!", + }); + } +}); diff --git a/JS/edgechains/examples/react-chain/src/test/react-chain.test.ts b/JS/edgechains/examples/react-chain/src/test/react-chain.test.ts new file mode 100644 index 000000000..84bb85773 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/test/react-chain.test.ts @@ -0,0 +1,10 @@ +import { test, expect } from "vitest"; + +test("should be return expected answer", async () => { + const res = await fetch( + "http://localhost:5000?question=Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President?" + ); + + const data = await res.json(); + expect(data).toContain("Bill Clinton"); +}, 40000); diff --git a/JS/edgechains/examples/react-chain/tsconfig.json b/JS/edgechains/examples/react-chain/tsconfig.json new file mode 100644 index 000000000..5721c810b --- /dev/null +++ b/JS/edgechains/examples/react-chain/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/react-chain/vitest.config.ts b/JS/edgechains/examples/react-chain/vitest.config.ts new file mode 100644 index 000000000..f2b57823c --- /dev/null +++ b/JS/edgechains/examples/react-chain/vitest.config.ts @@ -0,0 +1,7 @@ +import { configDefaults, defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + exclude: [...configDefaults.exclude, "packages/template/*"], + }, +}); diff --git a/JS/edgechains/examples/react-chain/webpack.config.cjs b/JS/edgechains/examples/react-chain/webpack.config.cjs new file mode 100644 index 000000000..a32e9a16f --- /dev/null +++ b/JS/edgechains/examples/react-chain/webpack.config.cjs @@ -0,0 +1,71 @@ +const webpack = require("webpack"); +const path = require("path"); + +let definePlugin = new webpack.DefinePlugin({ + "process.env.arakoo": true, +}); + +let replacePlugin = new webpack.NormalModuleReplacementPlugin( + /\@arakoodev\/edgechains\.js\/sync-rpc/, + function (resource) { + resource.request = path.resolve(__dirname, "empty-module.js"); + } +); + +const config = [ + { + name: "first", + entry: "./dist/index.js", + output: { + path: __dirname + "/dist", + filename: "index.cjs", + iife: false, + }, + resolve: { + extensions: [".js"], + }, + mode: "production", + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: path.resolve("replaceloader.cjs"), // Use the custom loader + }, + ], + }, + optimization: { + minimize: false, + }, + plugins: [definePlugin], + }, + { + name: "second", + entry: "./dist/index.cjs", + output: { + path: __dirname + "/dist", + filename: "final.js", + iife: false, + }, + resolve: { + extensions: [".cjs", ".js"], + }, + mode: "production", + module: { + rules: [ + { + test: /\.cjs$/, + exclude: /node_modules/, + use: path.resolve("replacedirnameloader.cjs"), + }, + ], + }, + optimization: { + minimize: false, + }, + plugins: [definePlugin], + dependencies: ["first"], + }, +]; + +module.exports = config; diff --git a/JS/edgechains/examples/research-agent/.gitignore b/JS/edgechains/examples/research-agent/.gitignore new file mode 100644 index 000000000..76add878f --- /dev/null +++ b/JS/edgechains/examples/research-agent/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/JS/edgechains/examples/research-agent/jsonnet/main.jsonnet b/JS/edgechains/examples/research-agent/jsonnet/main.jsonnet new file mode 100644 index 000000000..f94826b79 --- /dev/null +++ b/JS/edgechains/examples/research-agent/jsonnet/main.jsonnet @@ -0,0 +1,38 @@ + +local PromptTemplate = ||| + """{researchSummary}""" Based on the above information, generate a bibliography recommendation report for the following + question or topic: "{question}". The report should provide a detailed analysis of each recommended resource, + explaining how each source can contribute to finding answers to the research question. + Focus on the relevance, reliability, and significance of each source. + Ensure that the report is well-structured, informative, in-depth, and follows Markdown syntax. + Include relevant facts, figures, and numbers whenever available. + The report should have a minimum length of 1,200 words. + |||; + + +local bingKey = std.extVar("BingKey"); +local openAIkey = std.extVar("openAIkey"); + +local generatePrompt() = + local query = std.extVar("query"); + local getWebSearch = std.parseJson(arakoo.native("bingWebSearch")({ query:query, key:bingKey })); + local data = ""; + local range = std.range(0, std.length(getWebSearch) - 1); + + local finalData = std.foldl(function(acc, i) + local url = getWebSearch[i].url; + + if !std.endsWith(url, ".pdf") then + local getPageContent = arakoo.native("webScraper")(url); + acc + std.slice(getPageContent, 0, 400, 1), + + range, data); + + local updatedPromptTemplateWithQuery = std.strReplace(PromptTemplate, "{question}", query); + local updatedPromptTemplateWithSummary = std.strReplace(updatedPromptTemplateWithQuery, "{researchSummary}", finalData); + local openAICall = arakoo.native("openAICall")({ prompt:updatedPromptTemplateWithSummary, openAIApiKey:openAIkey }); + openAICall; + + +generatePrompt() + diff --git a/JS/edgechains/examples/research-agent/jsonnet/secrets.jsonnet b/JS/edgechains/examples/research-agent/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..f0ee25658 --- /dev/null +++ b/JS/edgechains/examples/research-agent/jsonnet/secrets.jsonnet @@ -0,0 +1,9 @@ + +local OPENAI_API_KEY = "sk-proj-***"; +local BING_API_KEY = "9be1*****"; + +{ + "openai_api_key":OPENAI_API_KEY, + "bing_api_key":BING_API_KEY +} + diff --git a/JS/edgechains/examples/research-agent/package.json b/JS/edgechains/examples/research-agent/package.json new file mode 100644 index 000000000..71294d280 --- /dev/null +++ b/JS/edgechains/examples/research-agent/package.json @@ -0,0 +1,27 @@ +{ + "name": "language-translater", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "keywords": [], + "author": "", + "scripts": { + "dev": "tsc && node --experimental-wasm-modules ./dist/index.js" + }, + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "file:../../arakoodev", + "@arakoodev/jsonnet": "^0.24.0", + "axios": "^1.7.2", + "file-uri-to-path": "^2.0.0", + "hono": "^4.4.5", + "path": "^0.12.7", + "react": "^18.3.1" + }, + "devDependencies": { + "@types/cors": "^2.8.17", + "@types/node": "^20.14.2", + "@types/react": "^18.3.3" + } +} diff --git a/JS/edgechains/examples/research-agent/readme.md b/JS/edgechains/examples/research-agent/readme.md new file mode 100644 index 000000000..64385143e --- /dev/null +++ b/JS/edgechains/examples/research-agent/readme.md @@ -0,0 +1,38 @@ +# Project Name + +This is Research Agent App + +## Tutorial Video + +https://youtu.be/tM1OcMkqNes + +## Backend + +### Configuration + +1 Add OpenAiApi key and Bing api key in secrets.jsonnet + + ``` + local OPENAI_API_KEY = "sk-proj-***"; + local BING_API_KEY = "9be1*****"; + ``` + +## Installation + + ```bash + npm install + ``` + +## Usage + +1. Start the server: + + ```bash + npm run dev + ``` + +2. Hit this following endpoint + + ```bash + localhost:3000 + ``` diff --git a/JS/edgechains/examples/research-agent/src/index.tsx b/JS/edgechains/examples/research-agent/src/index.tsx new file mode 100644 index 000000000..8315dc3b6 --- /dev/null +++ b/JS/edgechains/examples/research-agent/src/index.tsx @@ -0,0 +1,50 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +//@ts-ignore +import createClient from "@arakoodev/edgechains.js/sync-rpc"; +import Home from "./pages/Home.js"; +import Jsonnet from "@arakoodev/jsonnet"; +import fileURLToPath from "file-uri-to-path"; +import path from "path"; + +const server = new ArakooServer(); +const jsonnet = new Jsonnet(); +const app = server.createApp(); + +const __dirname = fileURLToPath(import.meta.url); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const key = JSON.parse(jsonnet.evaluateFile(secretsPath)).bing_api_key; +const openAIkey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const openAICall = createClient(path.join(__dirname, "../lib/generateResponse.cjs")); +const bingWebSearch = createClient(path.join(__dirname, "../lib/bingWebSearch.cjs")); +const WebScraper = createClient(path.join(__dirname, "../lib/scrapPageContent.cjs")); + +app.get("/", (c: any) => { + return c.html(); +}); + +app.post("/research", async (c: any) => { + console.time("Time taken"); + const { query } = await c.req.parseBody(); + jsonnet.extString("query", query); + jsonnet.extString("BingKey", key); + jsonnet.extString("openAIkey", openAIkey); + jsonnet.javascriptCallback("openAICall", openAICall); + jsonnet.javascriptCallback("bingWebSearch", bingWebSearch); + jsonnet.javascriptCallback("webScraper", WebScraper); + const data = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/main.jsonnet")) + ); + const response = data + .replace(/\\n/g, "
    ") + .replace(/\\\"/g, '"') + .replace(/##\s/g, "

    ") + .replace(/###\s/g, "

    ") + .replace(/#\s/g, "

    ") + .replace(/\*\*(.*?)\*\*/g, "$1"); + console.timeEnd("Time taken"); + return c.json(response); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/research-agent/src/layout/index.tsx b/JS/edgechains/examples/research-agent/src/layout/index.tsx new file mode 100644 index 000000000..4cf6184c5 --- /dev/null +++ b/JS/edgechains/examples/research-agent/src/layout/index.tsx @@ -0,0 +1,18 @@ +// import "htmx.org" +export default function Layout({ children }: { children: any }) { + return ( + + + + + + + + {children} + + ); +} diff --git a/JS/edgechains/examples/research-agent/src/lib/bingWebSearch.cts b/JS/edgechains/examples/research-agent/src/lib/bingWebSearch.cts new file mode 100644 index 000000000..a6aa73b49 --- /dev/null +++ b/JS/edgechains/examples/research-agent/src/lib/bingWebSearch.cts @@ -0,0 +1,17 @@ +import axios from "axios"; + +async function bingWebSearch({ query, key }: { query: string; key: string }) { + try { + const response = await axios( + `https://api.bing.microsoft.com/v7.0/search?q=${encodeURIComponent(query)}&count=10`, + { + headers: { "Ocp-Apim-Subscription-Key": key }, + } + ); + return JSON.stringify(response.data.webPages.value); + } catch (error) { + console.log(error); + } +} + +module.exports = bingWebSearch; diff --git a/JS/edgechains/examples/research-agent/src/lib/generateResponse.cts b/JS/edgechains/examples/research-agent/src/lib/generateResponse.cts new file mode 100644 index 000000000..6301a0fc4 --- /dev/null +++ b/JS/edgechains/examples/research-agent/src/lib/generateResponse.cts @@ -0,0 +1,13 @@ +import { OpenAI } from "@arakoodev/edgechains.js/openai"; + +async function openAICall({ prompt, openAIApiKey }: { prompt: string; openAIApiKey: string }) { + try { + const openai = new OpenAI({ apiKey: openAIApiKey }); + const response = await openai.chat({ prompt, max_tokens: 2000 }); + return JSON.stringify(response.content); + } catch (error) { + return error; + } +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/research-agent/src/lib/scrapPageContent.cts b/JS/edgechains/examples/research-agent/src/lib/scrapPageContent.cts new file mode 100644 index 000000000..93a747ff3 --- /dev/null +++ b/JS/edgechains/examples/research-agent/src/lib/scrapPageContent.cts @@ -0,0 +1,14 @@ +import { AutoPlayWriteWebPageScrapper } from "@arakoodev/edgechains.js/scraper"; + +const scraper = new AutoPlayWriteWebPageScrapper(); + +async function getContent(url: string) { + try { + return await scraper.getContent(url); + } catch (error) { + console.log("Error Scraping: " + url); + return " "; + } +} + +module.exports = getContent; diff --git a/JS/edgechains/examples/research-agent/src/pages/Home.tsx b/JS/edgechains/examples/research-agent/src/pages/Home.tsx new file mode 100644 index 000000000..7978a0db6 --- /dev/null +++ b/JS/edgechains/examples/research-agent/src/pages/Home.tsx @@ -0,0 +1,102 @@ +import Layout from "../layout/index.js"; + +export default function Home() { + return ( + +
    +
    +
    +
    +

    + + Say Goodbye to Hours of Research + +

    +

    + Say Hello to Researcher Agent, your AI mate for rapid insights and + comprehensive research. GPT Researcher is the leading autonomous + agent that takes care of everything from accurate source gathering + to organization of research results. +

    +
    +
    + + + +
    +
    +
    + +
    +
    +

    + Research About your prompt +

    +
    +
    +
    + + + + + + + + + + + +
    +
    +
    +
    +
    + ); +} diff --git a/JS/edgechains/examples/research-agent/tsconfig.json b/JS/edgechains/examples/research-agent/tsconfig.json new file mode 100644 index 000000000..01890f93d --- /dev/null +++ b/JS/edgechains/examples/research-agent/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx" + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/resume-reviewer/.env b/JS/edgechains/examples/resume-reviewer/.env new file mode 100644 index 000000000..d370965f4 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/.env @@ -0,0 +1 @@ +DATABASE_URL="postgresql:****" \ No newline at end of file diff --git a/JS/edgechains/examples/resume-reviewer/.gitignore b/JS/edgechains/examples/resume-reviewer/.gitignore new file mode 100644 index 000000000..f06235c46 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/JS/edgechains/examples/resume-reviewer/README.md b/JS/edgechains/examples/resume-reviewer/README.md new file mode 100644 index 000000000..1b497cd31 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/README.md @@ -0,0 +1,50 @@ +# Resume Reviewer Example + +This is an example project that demonstrates the usage of Resume-Reviewer + +## Tutorial Video + +https://youtu.be/xy3DRI4Y898 + +## Configuration + +1 Add OpenAiApi key in secrets.jsonnet + + ```bash + local OPENAI_API_KEY = "sk-****"; + ``` + +2 Add Postgres connection string into .env file + + ```bash + DATABASE_URL="postgresql:**********" + ``` + +## Installation + +1. Install the dependencies: + + ```bash + cd backend + npm install + ``` + +3 Run the migrations + + ```bash + npm run migration + ``` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. hit this endpoint + + ```bash + http://localhost:3000 + ``` diff --git a/JS/edgechains/examples/resume-reviewer/jsonnet/main.jsonnet b/JS/edgechains/examples/resume-reviewer/jsonnet/main.jsonnet new file mode 100644 index 000000000..8893c55cf --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/jsonnet/main.jsonnet @@ -0,0 +1,31 @@ +local promptTemplate = ||| + Please help me structure the following resume into a more organized format, ensuring clear sections for Professional Summary, Skills, Professional Experience, Education, and Projects. Ensure the content is concise, easy to read, and well-formatted. Additionally, please rate the resume using the following points system: + + One month of full-time experience gets 2.5 points + Participation in open-source work gets 10 points + One month of internship gets 1 point + Having interned at a top company or a top startup or a YC startup results in 6 bonus points + Having worked full-time at a top company or a top startup or a YC startup results in 12 bonus points + Each project that has a lot of users or has made a big impact gets 3 points + Having a project that is technically interesting or challenging gets 4 points + Clear and well-structured format gets 5 points + Strong professional summary gets 5 points + Well-defined skills section gets 5 points + Comprehensive and relevant experience details get 5 points + Detailed and impactful project descriptions get 5 points + The total score should be out of 100. After rating the resume, provide a verbose and detailed description of what needs to be changed or improved in the resume to make it better. + + ----------------------------------------------- + {resume} + |||; + +// local promptTemplate = std.extVar("promptTemplate"); +local resume = std.extVar("resume"); + +local prompt = std.strReplace(promptTemplate,'{resume}', resume); + +local main() = + local response = arakoo.native("openAICall")(prompt); + response; + +main() \ No newline at end of file diff --git a/JS/edgechains/examples/resume-reviewer/jsonnet/secrets.jsonnet b/JS/edgechains/examples/resume-reviewer/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..978cacd33 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/jsonnet/secrets.jsonnet @@ -0,0 +1,7 @@ + +local OPENAI_API_KEY = "sk-proj-***"; + +{ + "openai_api_key":OPENAI_API_KEY, +} + diff --git a/JS/edgechains/examples/resume-reviewer/package.json b/JS/edgechains/examples/resume-reviewer/package.json new file mode 100644 index 000000000..4f260fa62 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/package.json @@ -0,0 +1,20 @@ +{ + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js" + }, + "type": "module", + "dependencies": { + "@arakoodev/edgechains.js": "^0.23.7", + "@arakoodev/jsonnet": "^0.23.6", + "@hono/node-server": "^1.11.1", + "@prisma/client": "^5.15.0", + "file-uri-to-path": "^2.0.0", + "hono": "^4.3.5", + "prisma": "^5.15.0", + "sync-rpc": "^1.3.6" + }, + "devDependencies": { + "@types/node": "^20.11.17", + "tsx": "^4.7.1" + } +} diff --git a/JS/edgechains/examples/resume-reviewer/prisma/migrations/20240608071139_init/migration.sql b/JS/edgechains/examples/resume-reviewer/prisma/migrations/20240608071139_init/migration.sql new file mode 100644 index 000000000..6be19e32d --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/prisma/migrations/20240608071139_init/migration.sql @@ -0,0 +1,14 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "name" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "resumeDetails" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_name_key" ON "User"("name"); diff --git a/JS/edgechains/examples/resume-reviewer/prisma/migrations/migration_lock.toml b/JS/edgechains/examples/resume-reviewer/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..fbffa92c2 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/JS/edgechains/examples/resume-reviewer/prisma/schema.prisma b/JS/edgechains/examples/resume-reviewer/prisma/schema.prisma new file mode 100644 index 000000000..abd318b71 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/prisma/schema.prisma @@ -0,0 +1,17 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id @default(cuid()) + email String + name String? @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + resumeDetails String +} \ No newline at end of file diff --git a/JS/edgechains/examples/resume-reviewer/src/components/Ranks.tsx b/JS/edgechains/examples/resume-reviewer/src/components/Ranks.tsx new file mode 100644 index 000000000..8e200cf50 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/src/components/Ranks.tsx @@ -0,0 +1,33 @@ +export default function RankCard({ rank, parsedResumeDetails, i }: any) { + const element = rank; + + return ( +
    +
    + {/* Data Rows with Column Headers on Each Row */} +
    +
    +
    Name
    +
    Points
    +
    Rank
    +
    + +
    +
    + {element.name[0]} +
    +
    +

    {element.name}

    +
    +
    + {element.totalPoints} +
    +
    + {i + 1}/{parsedResumeDetails.length} +
    +
    +
    +
    +
    + ); +} diff --git a/JS/edgechains/examples/resume-reviewer/src/index.tsx b/JS/edgechains/examples/resume-reviewer/src/index.tsx new file mode 100644 index 000000000..3d74b489b --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/src/index.tsx @@ -0,0 +1,76 @@ +import { Hono } from "hono"; +import Home from "./pages/Home.js"; +import RankCard from "./components/Ranks.js"; +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import { PrismaClient } from "@prisma/client"; +import Jsonnet from "@arakoodev/jsonnet"; +//@ts-ignore +import createClient from "sync-rpc"; +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +import { PdfLoader } from "@arakoodev/edgechains.js/document-loader"; + +const prisma = new PrismaClient(); +const jsonnet = new Jsonnet(); +const server = new ArakooServer(); +const app = server.createApp(); +const __dirname = fileURLToPath(import.meta.url); +const openAICall = createClient(path.join(__dirname, "../lib/generateResponse.cjs")); + +app.get("/", (c) => { + return c.html(() as string); +}); + +app.post("/handleResume", async (c) => { + const { resume, name, email } = await c.req.parseBody(); + + //@ts-ignore + const arrayBuffer = await resume.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + const loader = new PdfLoader(buffer); + const docs = await loader.loadPdf(); + jsonnet.extString("resume", JSON.stringify(docs)); + jsonnet.javascriptCallback("openAICall", openAICall); + let resumeDetails = jsonnet.evaluateFile(path.join(__dirname, "../../jsonnet/main.jsonnet")); + + await prisma.user.create({ + data: { + email: email as string, + name: name as string, + resumeDetails, + }, + }); + + const parsedResumeDetails = await prisma.user.findMany(); + const newResumeArr: any = []; + for (let index = 0; index < parsedResumeDetails.length; index++) { + const element = JSON.parse(JSON.parse(parsedResumeDetails[index].resumeDetails)); + const totalPoints = + element.fullTimeExperienceInMonthsPoints + + element.internshipExperienceInMonthsPoints + + element.projectsPoints + + element.achievementsPoints + + element.skillsPoints; + + const newResumeObj = { + ...parsedResumeDetails[index], + totalPoints, + }; + newResumeArr.push(newResumeObj); + } + + const sortedArr = newResumeArr.sort((a: any, b: any) => b.totalPoints - a.totalPoints); + return c.html( + ( + <> + {sortedArr.map((rank: any, index: number) => { + return ( + + ); + })} + + ) as string + ); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/resume-reviewer/src/layouts/index.tsx b/JS/edgechains/examples/resume-reviewer/src/layouts/index.tsx new file mode 100644 index 000000000..d0e376d89 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/src/layouts/index.tsx @@ -0,0 +1,17 @@ +export default function Layout({ children }: { children: JSX.Element }) { + return ( + + + + + + + + {children} + + ); +} diff --git a/JS/edgechains/examples/resume-reviewer/src/lib/generateResponse.cts b/JS/edgechains/examples/resume-reviewer/src/lib/generateResponse.cts new file mode 100644 index 000000000..c8290b006 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/src/lib/generateResponse.cts @@ -0,0 +1,108 @@ +const path = require("path"); +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +import { z } from "zod"; +const Jsonnet = require("@arakoodev/jsonnet"); +const jsonnet = new Jsonnet(); + +const secretsPath = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const openAIApiKey = JSON.parse(jsonnet.evaluateFile(secretsPath)).openai_api_key; + +const openai = new OpenAI({ apiKey: openAIApiKey }); + +const profileSchema = z.object({ + fullTimeExperienceInMonths: z + .number() + .int() + .describe("The total full-time work experience in months."), + fullTimeExperienceInMonthsPoints: z + .number() + .int() + .describe("The points for full-time work experience."), + internshipExperienceInMonths: z + .number() + .int() + .describe("The total internship work experience in months."), + internshipExperienceInMonthsPoints: z + .number() + .int() + .describe("The points for internship work experience."), + projects: z + .array( + z.object({ + title: z.string().describe("The title of the project."), + description: z.string().describe("A brief description of the project."), + githubLink: z + .string() + .url() + .optional() + .describe("The GitHub link to the project's repository."), + liveLink: z + .string() + .url() + .optional() + .describe("The live link where the project can be accessed."), + }) + ) + .describe("An array of projects the candidate has worked on."), + projectsPoints: z.number().int().describe("The points for projects."), + achievements: z.string().describe("A string describing the candidate's achievements."), + achievementsPoints: z.number().int().describe("The points for achievements."), + expectedMinPay: z.number().int().describe("The expected minimum pay in integer format."), + expectedMinPayCurrency: z + .string() + .default("INR") + .describe("The currency of the expected minimum pay (default is INR)."), + skills: z.string().describe("A comma-separated list of skills that the candidate has."), + skillsPoints: z.number().int().describe("The points for skills."), + leetcodeProfileLink: z + .string() + .url() + .optional() + .describe("The link to the candidate's LeetCode profile."), + codeforcesProfileLink: z + .string() + .url() + .optional() + .describe("The link to the candidate's Codeforces profile."), + hackerrankProfileLink: z + .string() + .url() + .optional() + .describe("The link to the candidate's HackerRank profile."), + githubLink: z.string().url().optional().describe("The link to the candidate's GitHub profile."), + twitterLink: z + .string() + .url() + .optional() + .describe("The link to the candidate's Twitter profile."), + linkedinLink: z + .string() + .url() + .optional() + .describe("The link to the candidate's LinkedIn profile."), + notes: z + .string() + .max(500) + .describe( + "Bullet points describing the candidate's profile, up to a maximum of 5 bullet points and 500 characters." + ), + percent: z + .number() + .max(100) + .min(1) + .describe("Generate resume percentage out of hundred using the points "), +}); + +function openAICall() { + return function (prompt: string) { + try { + return openai.zodSchemaResponse({ prompt, schema: profileSchema }).then((res: any) => { + return JSON.stringify(res); + }); + } catch (error) { + return error; + } + }; +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/resume-reviewer/src/pages/Home.tsx b/JS/edgechains/examples/resume-reviewer/src/pages/Home.tsx new file mode 100644 index 000000000..a0257a1c9 --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/src/pages/Home.tsx @@ -0,0 +1,102 @@ +import Layout from "../layouts/index.js"; + +export default function Home() { + return ( + +
    + {/* Left Side: Form and Chat */} +
    + {/* Form Section */} +
    +
    +

    + + Join the Race! + +

    +

    Upload your resume and see where you stand.

    +
    +
    + + + + +
    +
    + + {/* Chat Section */} +
    + {/* Chat content will be displayed here */} +
    +
    + + {/* Right Side: Leaderboard */} +
    +
    +

    + Top Ranks +

    +
    +
    +
    +
    +
    + ); +} diff --git a/JS/edgechains/examples/resume-reviewer/tsconfig.json b/JS/edgechains/examples/resume-reviewer/tsconfig.json new file mode 100644 index 000000000..01890f93d --- /dev/null +++ b/JS/edgechains/examples/resume-reviewer/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx" + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/retell-ai/.gitignore b/JS/edgechains/examples/retell-ai/.gitignore new file mode 100644 index 000000000..22bc5ea9e --- /dev/null +++ b/JS/edgechains/examples/retell-ai/.gitignore @@ -0,0 +1,4 @@ +dist +node_modules +.env +.env.local \ No newline at end of file diff --git a/JS/edgechains/examples/retell-ai/README.md b/JS/edgechains/examples/retell-ai/README.md new file mode 100644 index 000000000..37c2c2fc4 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/README.md @@ -0,0 +1,31 @@ +# 🚀 Welcome to your new awesome project! + +This project has been created using **webpack-cli**, you can now run + +``` +npm run build +``` + +or + +``` +yarn build +``` + +to bundle your application + +## How to use + +1. Install dependencies + +``` +npm install +``` + +2. Run the server + +``` +npm run start +``` + +> > > > > > > 100bddc3 (fixing-example) diff --git a/JS/edgechains/examples/retell-ai/client/index.js b/JS/edgechains/examples/retell-ai/client/index.js new file mode 100644 index 000000000..aaaf691d0 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/client/index.js @@ -0,0 +1,37 @@ +import "htmx.org"; +import { RetellWebClient } from "@arakoodev/edgechains.js/ai"; +import "./style.css"; + +// Create a single instance +const retellWebClient = new RetellWebClient(); + +async function startCall(access_token) { + try { + const callResponse = await retellWebClient.startCall({ + accessToken: access_token, + }); + + console.log("Call started:", callResponse); + document.getElementById("callStatus").textContent = "Call in progress..."; + } catch (error) { + console.error("Failed to start call:", error); + document.getElementById("error").textContent = `Failed to start call: ${error.message}`; + } +} + +async function endCall() { + try { + await retellWebClient.stopCall(); + console.log("Call ended successfully"); + document.getElementById("callStatus").textContent = "Call ended"; + } catch (error) { + console.error("Failed to end call:", error); + document.getElementById("error").textContent = `Failed to end call: ${error.message}`; + } +} + +// Expose functions to be used with hyperscript or other event handlers +window.startCall = startCall; +window.endCall = endCall; + +console.log("Client-side code initialized"); diff --git a/JS/edgechains/examples/retell-ai/client/style.css b/JS/edgechains/examples/retell-ai/client/style.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/client/style.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/JS/edgechains/examples/retell-ai/jsonnet/main.jsonnet b/JS/edgechains/examples/retell-ai/jsonnet/main.jsonnet new file mode 100644 index 000000000..106e09220 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/jsonnet/main.jsonnet @@ -0,0 +1,9 @@ + + +local general_prompt = "You are a friendly agent that helps people retrieves their questions's answers."; +local begin_message = "Hi, I'm Edgechains agent, how can I help you?"; + +{ + general_prompt: general_prompt, + begin_message: begin_message, +} diff --git a/JS/edgechains/examples/retell-ai/jsonnet/secrets.jsonnet b/JS/edgechains/examples/retell-ai/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..c1d311c16 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/jsonnet/secrets.jsonnet @@ -0,0 +1,5 @@ +local RETELL_API_KEY = 'key_****'; + +{ + reteall_api_key: RETELL_API_KEY, +} diff --git a/JS/edgechains/examples/retell-ai/package.json b/JS/edgechains/examples/retell-ai/package.json new file mode 100644 index 000000000..dc77184c1 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/package.json @@ -0,0 +1,67 @@ +{ + "name": "htmx-webpack-demo", + "version": "1.0.0", + "scripts": { + "build": "webpack", + "dev": "webpack --watch", + "start": "node --experimental-wasm-modules ./server/index.js" + }, + "dependencies": { + "@arakoodev/edgechains.js": "file:../../arakoodev", + "@arakoodev/jsonnet": "^0.25.0", + "@hono/node-server": "^1.13.4", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "crypto": "^1.0.1", + "crypto-browserify": "^3.12.1", + "file-uri-to-path": "^2.0.0", + "html-webpack-plugin": "^5.6.3", + "htmx.org": "^1.9.10", + "hyperscript": "^2.0.2", + "hyperscript.org": "^0.9.13", + "mini-css-extract-plugin": "^2.9.2", + "process": "^0.11.10", + "retell-client-js-sdk": "^2.0.4", + "retell-sdk": "^4.8.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "util": "^0.12.5", + "vm-browserify": "^1.1.2", + "vue": "^3.5.12", + "vue-loader": "^17.4.2", + "webpack-node-externals": "^3.0.0", + "workbox-webpack-plugin": "^7.3.0" + }, + "devDependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.26.0", + "assert": "^2.1.0", + "babel-loader": "^9.2.1", + "css-loader": "^7.1.2", + "node-polyfill-webpack-plugin": "^4.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", + "postcss-preset-env": "^10.0.9", + "style-loader": "^4.0.0", + "tailwindcss": "^3.4.14", + "url": "^0.11.4", + "webpack": "^5.96.1", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.1.0" + }, + "browser": { + "crypto": "crypto-browserify", + "stream": "stream-browserify", + "http": "stream-http", + "util": "util", + "buffer": "buffer", + "node:crypto": "crypto-browserify", + "node:stream": "stream-browserify", + "node:http": "stream-http", + "node:buffer": "buffer", + "node:util": "util" + } +} diff --git a/JS/edgechains/examples/retell-ai/postcss.config.js b/JS/edgechains/examples/retell-ai/postcss.config.js new file mode 100644 index 000000000..93e8c0e08 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/postcss.config.js @@ -0,0 +1,4 @@ +const tailwindcss = require("tailwindcss"); +module.exports = { + plugins: ["postcss-preset-env", tailwindcss], +}; diff --git a/JS/edgechains/examples/retell-ai/server/index.js b/JS/edgechains/examples/retell-ai/server/index.js new file mode 100644 index 000000000..12ffc4399 --- /dev/null +++ b/JS/edgechains/examples/retell-ai/server/index.js @@ -0,0 +1,68 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import { RetellAI } from "@arakoodev/edgechains.js/ai"; +import { serveStatic } from "@hono/node-server/serve-static"; +import Jsonnet from "@arakoodev/jsonnet"; +import path from "path"; +import fileURLToPath from "file-uri-to-path"; + +const __dirname = fileURLToPath(import.meta.url); +const jsonnet = new Jsonnet(); +const server = new ArakooServer(); +const app = server.createApp(); + +const jsonnet_main_file = path.join(__dirname, "../../jsonnet/main.jsonnet"); +const jsonnet_secrets_file = path.join(__dirname, "../../jsonnet/secrets.jsonnet"); +const jsonnet_main_obj = JSON.parse(jsonnet.evaluateFile(jsonnet_main_file)); +const jsonnet_secrets_obj = JSON.parse(jsonnet.evaluateFile(jsonnet_secrets_file)); + +const retellai = new RetellAI(jsonnet_secrets_obj.reteall_api_key); + +await retellai.createLLM({ + general_prompt: jsonnet_main_obj.general_prompt, + begin_message: jsonnet_main_obj.begin_message, +}); + +const createAgentRes = await retellai.createAgent({}); + +app.get( + "/static/*", + serveStatic({ + root: "./dist", + rewriteRequestPath: (path) => path.replace(/^\/static/, "/"), + }) +); + +app.get("/", (c) => { + return c.html(` + + HTMX Demo + + + + +
    +
    + + +
    +
    +

    Call Status: Not started

    +

    Error: No Error

    +
    +
    + + `); +}); + +app.get("/call", async (c) => { + const token = await retellai.initiateWebCall(createAgentRes.agent_id); + return c.json({ token }); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/retell-ai/tailwind.config.js b/JS/edgechains/examples/retell-ai/tailwind.config.js new file mode 100644 index 000000000..6da0163df --- /dev/null +++ b/JS/edgechains/examples/retell-ai/tailwind.config.js @@ -0,0 +1,11 @@ +module.exports = { + purge: ["./server/**/*.{html,js}"], + darkMode: "media", // or 'media' or 'class' + theme: { + extend: {}, + }, + variants: { + extend: {}, + }, + plugins: [], +}; diff --git a/JS/edgechains/examples/retell-ai/webpack.config.cjs b/JS/edgechains/examples/retell-ai/webpack.config.cjs new file mode 100644 index 000000000..15d6daf5b --- /dev/null +++ b/JS/edgechains/examples/retell-ai/webpack.config.cjs @@ -0,0 +1,45 @@ +const path = require("path"); +const webpack = require("webpack"); + +module.exports = { + mode: "development", + entry: "./client/index.js", + output: { + path: path.resolve(__dirname, "dist"), + filename: "bundle.js", + }, + resolve: { + fallback: { + buffer: require.resolve("buffer/"), + stream: require.resolve("stream-browserify"), + crypto: require.resolve("crypto-browserify"), + vm: require.resolve("vm-browserify"), + process: require.resolve("process/browser.js"), + }, + }, + plugins: [ + new webpack.ProvidePlugin({ + process: "process/browser.js", + Buffer: ["buffer", "Buffer"], + }), + ], + devServer: { + static: { + directory: path.resolve(__dirname, "dist"), + }, + port: 3000, + open: true, + hot: true, + compress: true, + historyApiFallback: true, + }, + module: { + rules: [ + { + test: /\.css$/i, + include: path.resolve(__dirname, "client"), + use: ["style-loader", "css-loader", "postcss-loader"], + }, + ], + }, +}; diff --git a/JS/edgechains/examples/rpa-challenge/.gitignore b/JS/edgechains/examples/rpa-challenge/.gitignore new file mode 100644 index 000000000..76add878f --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/JS/edgechains/examples/rpa-challenge/jsonnet/main.jsonnet b/JS/edgechains/examples/rpa-challenge/jsonnet/main.jsonnet new file mode 100644 index 000000000..c4b2258f8 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/jsonnet/main.jsonnet @@ -0,0 +1,71 @@ +local promptTemplate = ||| + Given the following task description: + {task} + Extract the key actions from this task and return them as an array of strings. Each action should be a separate string in the array. If the task description contains syntax errors or you think a command can be improved for better clarity and effectiveness, please make the necessary corrections and improvements. For example: + Using the following list of objects, generate a series of instructions to fill out a form with the specified data. After each entry, include a command to submit the form. Follow this structure for each object: + Extract the details from each object in the list. + Format the details as follows: "Fill the form fields with the following data: First Name: [First Name], Last Name: [Last Name], Company Name: [Company Name], Role in Company: [Role in Company], Address: [Address], Email: [Email], Phone Number: [Phone Number]". + After each formatted string, append the text: "Identify and click on the input with the value 'Submit'". + + Examples: + + Input: + "Go to Hacker News and click on the first link. Then give me all the text of this page." + Response Format: + \`\`\` + {[ + "Navigate to the Hacker News website by entering the URL 'https://news.ycombinator.com/' in the browser", + "Identify and click on the first link displayed on the Hacker News homepage", + "Extract all the text from the page", + "Return that containt using return statement" + ]} + \`\`\` + + Input: + "Go to google and search for the term 'automation'. Click on the first link and extract the text from the page." + + Response Format: + \`\`\` + {[ + "Navigate to the random website by entering the URL 'https://google.com' in the browser", + "Search for the term 'automation' in the search bar and hit Enter key", + "Click on the first link displayed in the search results", + "Extract all the text from the page", + "Return that containt using return statement" + ]} + \`\`\` + \n + Ensure that each action is specific, clear, and comprehensive to facilitate precise implementation. + |||; + + +local openAIResponseFormat = [ + { + name: "taskListResponse", + description: "Generate a response containing a list of tasks.", + parameters: { + type: "object", + properties: { + tasks: { + type: "array", + description: "A list of tasks to be performed, represented as strings.", + items: { + type: "string", + description: "A single task description." + } + } + }, + required: ["tasks"] // Ensure that the 'tasks' array is provided + } + } +]; + +local excelUrl = "https://rpachallenge.com/assets/downloadFiles/challenge.xlsx"; +local key = std.extVar('openai_api_key'); + +local excelData = arakoo.native('downloadExcelData')({url:excelUrl}); +local taskString = "go to https://rpachallenge.com/ click on the start button" + excelData; +local updatedPrompt = std.strReplace(promptTemplate, '{task}',taskString + "\n"); +local mainPrompt = arakoo.native("openAICall")({prompt:updatedPrompt, functions:openAIResponseFormat, openAIKey:key}); +local doMainTasks = arakoo.native("doMainTasks")({task:mainPrompt, openai:key}); +doMainTasks \ No newline at end of file diff --git a/JS/edgechains/examples/rpa-challenge/jsonnet/secrets.jsonnet b/JS/edgechains/examples/rpa-challenge/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..fe7165560 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/jsonnet/secrets.jsonnet @@ -0,0 +1,6 @@ +local OPENAI_API_KEY = "sk-***"; + +{ + "openai_api_key":OPENAI_API_KEY, +} + diff --git a/JS/edgechains/examples/rpa-challenge/package.json b/JS/edgechains/examples/rpa-challenge/package.json new file mode 100644 index 000000000..c80bc57f6 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/package.json @@ -0,0 +1,27 @@ +{ + "name": "summarizer-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "keywords": [], + "author": "", + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js" + }, + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "^0.28.0", + "@arakoodev/jsonnet": "^0.25.0", + "file-uri-to-path": "^2.0.0", + "filereader": "^0.10.3", + "path": "^0.12.7", + "sync-rpc": "^1.3.6", + "xlsx": "^0.18.5", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.14.1", + "@types/request": "^2.48.12" + } +} diff --git a/JS/edgechains/examples/rpa-challenge/readme.md b/JS/edgechains/examples/rpa-challenge/readme.md new file mode 100644 index 000000000..6b3f30a41 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/readme.md @@ -0,0 +1,33 @@ +## Tutorial Video + +https://youtu.be/iqph8HA4nas + +## Installation + +1. Install the required dependencies: + + ```bash + npm install + ``` + +## Configuration + +1 Add OpenAiApi key in secrets.jsonnet +`bash + local OPENAI_API_KEY = "sk-****"; + ` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Hit the `GET` endpoint. + + ```bash + + http://localhost:3000/ + ``` diff --git a/JS/edgechains/examples/rpa-challenge/src/index.ts b/JS/edgechains/examples/rpa-challenge/src/index.ts new file mode 100644 index 000000000..32a39c4db --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/src/index.ts @@ -0,0 +1,29 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Jsonnet from "@arakoodev/jsonnet"; +//@ts-ignore +import createClient from "@arakoodev/edgechains.js/sync-rpc"; +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +const server = new ArakooServer(); + +const app = server.createApp(); + +const jsonnet = new Jsonnet(); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const doMainTasks = createClient(path.join(__dirname, "./lib/playwright.cjs")); +const openAICall = createClient(path.join(__dirname, "./lib/generateTask.cjs")); +const downloadExcelData = createClient(path.join(__dirname, "./lib/downloadExcelTask.cjs")); + +app.get("/", async (c: any) => { + const key = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/secrets.jsonnet")) + ).openai_api_key; + jsonnet.extString("openai_api_key", key); + jsonnet.javascriptCallback("downloadExcelData", downloadExcelData); + jsonnet.javascriptCallback("doMainTasks", doMainTasks); + jsonnet.javascriptCallback("openAICall", openAICall); + let response = jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/main.jsonnet")); + return c.text(response); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/rpa-challenge/src/lib/downloadExcelTask.cts b/JS/edgechains/examples/rpa-challenge/src/lib/downloadExcelTask.cts new file mode 100644 index 000000000..b202d12b9 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/src/lib/downloadExcelTask.cts @@ -0,0 +1,18 @@ +import axios from "axios"; +import XLSX from "xlsx"; + +async function downloadExcelData({ url }: { url: string }) { + try { + let axiosResponse = await axios(url, { responseType: "arraybuffer" }); + const workbook = XLSX.read(axiosResponse.data); + + let worksheets = workbook.SheetNames.map((sheetName: any) => { + return { sheetName, data: XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]) }; + }); + return JSON.stringify(worksheets[0].data); + } catch (error) { + console.log(error); + } +} + +module.exports = downloadExcelData; diff --git a/JS/edgechains/examples/rpa-challenge/src/lib/generateTask.cts b/JS/edgechains/examples/rpa-challenge/src/lib/generateTask.cts new file mode 100644 index 000000000..7127883f0 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/src/lib/generateTask.cts @@ -0,0 +1,33 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/ai"); + +function openAICall({ + prompt, + functions, + openAIKey, +}: { + prompt: string; + functions: any; + openAIKey: string; +}) { + try { + const openai = new OpenAI({ apiKey: openAIKey }); + const completion = openai + .chatWithFunction({ + model: "gpt-3.5-turbo-0613", + messages: [{ role: "user", content: prompt }], + functions, + function_call: { name: functions[0].name }, + }) + .then((completion: any) => { + return JSON.stringify(JSON.parse(completion.function_call.arguments).tasks); + }) + .catch((error: any) => { + console.error(error); + }); + return completion; + } catch (error) { + console.error(error); + } +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/rpa-challenge/src/lib/playwright.cts b/JS/edgechains/examples/rpa-challenge/src/lib/playwright.cts new file mode 100644 index 000000000..3717b4b63 --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/src/lib/playwright.cts @@ -0,0 +1,12 @@ +import { Playwright } from "@arakoodev/edgechains.js/scraper"; + +async function doMainTasks({ task, openai }: { task: string; openai: string }) { + const scraper = new Playwright({ apiKey: openai, model: "gpt-4-1106-preview" }); + try { + return JSON.stringify(await scraper.call({ task, headless: false })); + } catch (error) { + console.log(error); + } +} + +module.exports = doMainTasks; diff --git a/JS/edgechains/examples/rpa-challenge/tsconfig.json b/JS/edgechains/examples/rpa-challenge/tsconfig.json new file mode 100644 index 000000000..01890f93d --- /dev/null +++ b/JS/edgechains/examples/rpa-challenge/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx" + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts"] +} diff --git a/JS/edgechains/examples/summarize-page/.gitignore b/JS/edgechains/examples/summarize-page/.gitignore new file mode 100644 index 000000000..76add878f --- /dev/null +++ b/JS/edgechains/examples/summarize-page/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/JS/edgechains/examples/summarize-page/dist/index.js b/JS/edgechains/examples/summarize-page/dist/index.js new file mode 100644 index 000000000..bde4d5488 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/dist/index.js @@ -0,0 +1,25 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Jsonnet from "@arakoodev/jsonnet"; +//@ts-ignore +import createClient from "@arakoodev/edgechains.js/sync-rpc"; +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +const server = new ArakooServer(); +const app = server.createApp(); +const jsonnet = new Jsonnet(); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const openAICall = createClient(path.join(__dirname, "./lib/generateResponse.cjs")); +const getPageContent = createClient(path.join(__dirname, "./lib/getDataFromUrl.cjs")); +app.get("/", async (c) => { + const pageUrl = c.req.query("pageUrl"); + const key = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/secrets.jsonnet")) + ).openai_api_key; + jsonnet.extString("pageUrl", pageUrl || ""); + jsonnet.extString("openai_api_key", key); + jsonnet.javascriptCallback("openAICall", openAICall); + jsonnet.javascriptCallback("getPageContent", getPageContent); + let response = jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/main.jsonnet")); + return c.json(response); +}); +server.listen(3000); diff --git a/JS/edgechains/examples/summarize-page/dist/lib/generateResponse.cjs b/JS/edgechains/examples/summarize-page/dist/lib/generateResponse.cjs new file mode 100644 index 000000000..382fd2a19 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/dist/lib/generateResponse.cjs @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +const zod_1 = require("zod"); +const schema = zod_1.z.object({ + answer: zod_1.z.string().describe("The answer to the question"), +}); +async function openAICall({ prompt, openAIApiKey }) { + try { + const openai = new OpenAI({ apiKey: openAIApiKey }); + let res = await openai.zodSchemaResponse({ prompt, schema: schema }); + return JSON.stringify(res); + } catch (error) { + return error; + } +} +module.exports = openAICall; diff --git a/JS/edgechains/examples/summarize-page/dist/lib/getDataFromUrl.cjs b/JS/edgechains/examples/summarize-page/dist/lib/getDataFromUrl.cjs new file mode 100644 index 000000000..efceef9dc --- /dev/null +++ b/JS/edgechains/examples/summarize-page/dist/lib/getDataFromUrl.cjs @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const scraper_1 = require("@arakoodev/edgechains.js/scraper"); +const scraper = new scraper_1.Playwright(); +async function getPageContent({ task, openai }) { + try { + return await scraper.call({ chatApi: openai, task, headless: false }); + } catch (error) { + console.log(error); + } +} +module.exports = getPageContent; diff --git a/JS/edgechains/examples/summarize-page/jsonnet/main.jsonnet b/JS/edgechains/examples/summarize-page/jsonnet/main.jsonnet new file mode 100644 index 000000000..ba15e2b7e --- /dev/null +++ b/JS/edgechains/examples/summarize-page/jsonnet/main.jsonnet @@ -0,0 +1,27 @@ +local promptTemplate = ||| + You are a helpful AI assistant capable of providing detailed summaries. Your task is to summarize the given content thoroughly and in a verbose manner. + + Content to be summarized: + ------- + {content} + -------- + Given answer should look like this: The Summary of the content is: [Your Summary]. + Please remember to provide a thorough and detailed summary. Don't give incomplete summary or just a few words. Specially focus when the summary ends the end should not be abrupt. + + |||; + + +local pageUrl = std.extVar("pageUrl"); +local task = "go to" + pageUrl + "and scrap the hole page text"; +local key = std.extVar('openai_api_key'); +local getPageContent(pageUrl) = + local content = arakoo.native("getPageContent")({task:task, openai:key}); + local pageContent = std.slice(content, 0, 20000, 1); + local promptWithPageContent = std.strReplace(promptTemplate,'{content}', pageContent + "\n"); + promptWithPageContent; + +local main(prompt) = +local response = arakoo.native("openAICall")({ prompt: prompt, openAIApiKey: key }); + response; + +main(getPageContent(pageUrl)) \ No newline at end of file diff --git a/JS/edgechains/examples/summarize-page/jsonnet/secrets.jsonnet b/JS/edgechains/examples/summarize-page/jsonnet/secrets.jsonnet new file mode 100644 index 000000000..978cacd33 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/jsonnet/secrets.jsonnet @@ -0,0 +1,7 @@ + +local OPENAI_API_KEY = "sk-proj-***"; + +{ + "openai_api_key":OPENAI_API_KEY, +} + diff --git a/JS/edgechains/examples/summarize-page/package.json b/JS/edgechains/examples/summarize-page/package.json new file mode 100644 index 000000000..6b711d031 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/package.json @@ -0,0 +1,25 @@ +{ + "name": "summarizer-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "keywords": [], + "author": "", + "scripts": { + "start": "tsc && node --experimental-wasm-modules ./dist/index.js" + }, + "license": "ISC", + "dependencies": { + "@arakoodev/edgechains.js": "^0.25.0", + "@arakoodev/jsonnet": "^0.25.0", + "file-uri-to-path": "^2.0.0", + "path": "^0.12.7", + "sync-rpc": "^1.3.6", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.14.1", + "@types/request": "^2.48.12" + } +} diff --git a/JS/edgechains/examples/summarize-page/readme.md b/JS/edgechains/examples/summarize-page/readme.md new file mode 100644 index 000000000..eb226ce97 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/readme.md @@ -0,0 +1,33 @@ +## Tutorial Video + +https://youtu.be/S289kMubG10 + +## Installation + +1. Install the required dependencies: + + ```bash + npm install + ``` + +## Configuration + +1 Add OpenAiApi key in secrets.jsonnet +`bash + local OPENAI_API_KEY = "sk-****"; + ` + +## Usage + +1. Start the server: + + ```bash + npm run start + ``` + +2. Hit the `GET` endpoint. + + ```bash + + http://localhost:3000/?pageUrl=https://en.wikipedia.org/wiki/Association_football + ``` diff --git a/JS/edgechains/examples/summarize-page/src/index.ts b/JS/edgechains/examples/summarize-page/src/index.ts new file mode 100644 index 000000000..3c6775708 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/src/index.ts @@ -0,0 +1,30 @@ +import { ArakooServer } from "@arakoodev/edgechains.js/arakooserver"; +import Jsonnet from "@arakoodev/jsonnet"; +//@ts-ignore +import createClient from "@arakoodev/edgechains.js/sync-rpc"; + +import fileURLToPath from "file-uri-to-path"; +import path from "path"; +const server = new ArakooServer(); + +const app = server.createApp(); + +const jsonnet = new Jsonnet(); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const openAICall = createClient(path.join(__dirname, "./lib/generateResponse.cjs")); +const getPageContent = createClient(path.join(__dirname, "./lib/getDataFromUrl.cjs")); + +app.get("/", async (c: any) => { + const pageUrl = c.req.query("pageUrl"); + const key = JSON.parse( + jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/secrets.jsonnet")) + ).openai_api_key; + jsonnet.extString("pageUrl", pageUrl || ""); + jsonnet.extString("openai_api_key", key); + jsonnet.javascriptCallback("openAICall", openAICall); + jsonnet.javascriptCallback("getPageContent", getPageContent); + let response = jsonnet.evaluateFile(path.join(__dirname, "../jsonnet/main.jsonnet")); + return c.json(response); +}); + +server.listen(3000); diff --git a/JS/edgechains/examples/summarize-page/src/lib/generateResponse.cts b/JS/edgechains/examples/summarize-page/src/lib/generateResponse.cts new file mode 100644 index 000000000..ce20fb710 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/src/lib/generateResponse.cts @@ -0,0 +1,18 @@ +const { OpenAI } = require("@arakoodev/edgechains.js/openai"); +import { z } from "zod"; + +const schema = z.object({ + answer: z.string().describe("The answer to the question"), +}); + +async function openAICall({ prompt, openAIApiKey }: any) { + try { + const openai = new OpenAI({ apiKey: openAIApiKey }); + let res = await openai.zodSchemaResponse({ prompt, schema: schema }); + return JSON.stringify(res); + } catch (error) { + return error; + } +} + +module.exports = openAICall; diff --git a/JS/edgechains/examples/summarize-page/src/lib/getDataFromUrl.cts b/JS/edgechains/examples/summarize-page/src/lib/getDataFromUrl.cts new file mode 100644 index 000000000..61e71196d --- /dev/null +++ b/JS/edgechains/examples/summarize-page/src/lib/getDataFromUrl.cts @@ -0,0 +1,12 @@ +import { Playwright } from "@arakoodev/edgechains.js/scraper"; +const scraper = new Playwright(); + +async function getPageContent({ task, openai }: { task: string; openai: string }) { + try { + return await scraper.call({ chatApi: openai, task, headless: false }); + } catch (error) { + console.log(error); + } +} + +module.exports = getPageContent; diff --git a/JS/edgechains/examples/summarize-page/tsconfig.json b/JS/edgechains/examples/summarize-page/tsconfig.json new file mode 100644 index 000000000..22f20e090 --- /dev/null +++ b/JS/edgechains/examples/summarize-page/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "NodeNext", + "module": "NodeNext", + "rootDir": "./src", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "exclude": ["./**/*.test.ts", "vitest.config.ts", "./jsonnet/**/*"] +} diff --git a/JS/edgechains/lib/.babelrc b/JS/edgechains/lib/.babelrc new file mode 100644 index 000000000..69fe71505 --- /dev/null +++ b/JS/edgechains/lib/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} diff --git a/JS/edgechains/lib/.eslintignore b/JS/edgechains/lib/.eslintignore new file mode 100644 index 000000000..77a684a28 --- /dev/null +++ b/JS/edgechains/lib/.eslintignore @@ -0,0 +1,3 @@ +node_modules +dist +create-edgechains \ No newline at end of file diff --git a/JS/edgechains/lib/.eslintrc.js b/JS/edgechains/lib/.eslintrc.js new file mode 100644 index 000000000..936b40272 --- /dev/null +++ b/JS/edgechains/lib/.eslintrc.js @@ -0,0 +1,22 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: ["standard-with-typescript", "prettier"], + overrides: [ + { + env: { + node: true, + }, + files: [".eslintrc.{js,cjs}"], + parserOptions: { + sourceType: "script", + }, + }, + ], + parserOptions: { + ecmaVersion: "latest", + }, + rules: {}, +}; diff --git a/JS/edgechains/lib/.gitignore b/JS/edgechains/lib/.gitignore new file mode 100644 index 000000000..8f00ef230 --- /dev/null +++ b/JS/edgechains/lib/.gitignore @@ -0,0 +1,3 @@ +node_modules +.env +dist \ No newline at end of file diff --git a/JS/edgechains/lib/.prettierrrc.json b/JS/edgechains/lib/.prettierrrc.json new file mode 100644 index 000000000..6013eeb51 --- /dev/null +++ b/JS/edgechains/lib/.prettierrrc.json @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid" +} diff --git a/JS/edgechains/lib/README.md b/JS/edgechains/lib/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/JS/edgechains/lib/create-edgechains/__common/esbuild.build.js b/JS/edgechains/lib/create-edgechains/__common/esbuild.build.js new file mode 100644 index 000000000..8da795c0e --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/esbuild.build.js @@ -0,0 +1,45 @@ +const esbuild = require("esbuild"); +const path = require("path"); +const fs = require("fs"); +const { execSync } = require("child_process"); + +const outputDir = path.resolve(__dirname, "dist"); + +if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir); +} + +const distPath = path.join(process.cwd(), "dist"); + +fs.promises.mkdir(distPath, { recursive: true }); + +esbuild + .build({ + entryPoints: ["./src/index.ts"], + bundle: true, + minify: true, + platform: "node", + outfile: "./dist/index.js", + tsconfig: "./tsconfig.json", + target: "node21.1.0", + external: [ + "express", + "tsx", + "typescript", + "typeorm", + "react", + "react-dom", + "pg", + "jsdom", + "hono", + "@hanazuki/node-jsonnet", + "readline/promises", + ], + format: "cjs", + loader: { + ".html": "text", + ".css": "css", + ".jsonnet": "text", + }, + }) + .catch(() => process.exit(1)); diff --git a/JS/edgechains/lib/create-edgechains/__common/htmljs.d.ts b/JS/edgechains/lib/create-edgechains/__common/htmljs.d.ts new file mode 100644 index 000000000..6ea96c3fd --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/htmljs.d.ts @@ -0,0 +1,4 @@ +export declare const view: (viewToRender: any) => (c: any) => Promise; +export declare const rootLayout: (layoutToApply: any) => (c: any, next: any) => Promise; +export declare const layout: (layoutToApply: any) => (c: any, next: any) => Promise; +export declare const Link: any; diff --git a/JS/edgechains/lib/create-edgechains/__common/htmljs.js b/JS/edgechains/lib/create-edgechains/__common/htmljs.js new file mode 100644 index 000000000..d52af79ca --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/htmljs.js @@ -0,0 +1,53 @@ +import { html } from "hono/html"; +// These functions form the basis of the html.js framework and will be moved to a separate lib +export const view = (viewToRender) => { + return async (c) => { + const newBody = await viewToRender({ context: c }); + return c.html(newBody); + }; +}; +export const rootLayout = (layoutToApply) => { + return async (c, next) => { + await next(); + if (c.req.header("HX-Request") !== "true") { + // Req is a normal request, so we render the whole page which means adding the root layout + const curBody = await c.res.text(); + c.res = undefined; // To overwrite res, set it to undefined before setting new value https://github.com/honojs/hono/pull/970 released in https://github.com/honojs/hono/releases/tag/v3.1.0 + const newBody = await layoutToApply({ context: c, children: html(curBody) }); + c.res = c.html(newBody); + } + // Else do nothing and let the original response be sent + }; +}; +export const layout = (layoutToApply) => { + return async (c, next) => { + await next(); + if ( + (c.req.header("HX-Request") === "true" && + (c.req.header("HX-Boosted") === "true" || !c.req.header("HX-Target"))) || + c.req.header("HX-Request") !== "true" + ) { + // Req is regular req or boosted link, so we apply layouts + const curBody = await c.res.text(); + c.res = undefined; // To overwrite res, set it to undefined before setting new value https://github.com/honojs/hono/pull/970 released in https://github.com/honojs/hono/releases/tag/v3.1.0 + const newBody = await layoutToApply({ context: c, children: html(curBody) }); + c.res = c.html(newBody); + } + // Else do nothing and let the original response be sent, which will be a partial update applied to the page with hx-target + }; +}; +export const Link = ({ to, "hx-target": hxTarget, class: className, children }) => { + if (hxTarget) { + return html`${children}`; + } else { + return html`${children}`; + } +}; diff --git a/JS/edgechains/lib/create-edgechains/__common/htmljs.ts b/JS/edgechains/lib/create-edgechains/__common/htmljs.ts new file mode 100644 index 000000000..ae460e4de --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/htmljs.ts @@ -0,0 +1,58 @@ +import { html } from "hono/html"; + +// These functions form the basis of the html.js framework and will be moved to a separate lib + +export const view = (viewToRender) => { + return async (c) => { + const newBody = await viewToRender({ context: c }); + return c.html(newBody); + }; +}; + +export const rootLayout = (layoutToApply) => { + return async (c, next) => { + await next(); + if (c.req.header("HX-Request") !== "true") { + // Req is a normal request, so we render the whole page which means adding the root layout + const curBody = await c.res.text(); + c.res = undefined; // To overwrite res, set it to undefined before setting new value https://github.com/honojs/hono/pull/970 released in https://github.com/honojs/hono/releases/tag/v3.1.0 + const newBody = await layoutToApply({ context: c, children: html(curBody) }); + c.res = c.html(newBody); + } + // Else do nothing and let the original response be sent + }; +}; + +export const layout = (layoutToApply) => { + return async (c, next) => { + await next(); + if ( + (c.req.header("HX-Request") === "true" && + (c.req.header("HX-Boosted") === "true" || !c.req.header("HX-Target"))) || + c.req.header("HX-Request") !== "true" + ) { + // Req is regular req or boosted link, so we apply layouts + const curBody = await c.res.text(); + c.res = undefined; // To overwrite res, set it to undefined before setting new value https://github.com/honojs/hono/pull/970 released in https://github.com/honojs/hono/releases/tag/v3.1.0 + const newBody = await layoutToApply({ context: c, children: html(curBody) }); + c.res = c.html(newBody); + } + // Else do nothing and let the original response be sent, which will be a partial update applied to the page with hx-target + }; +}; + +export const Link: any = ({ to, "hx-target": hxTarget, class: className, children }) => { + if (hxTarget) { + return html`${children}`; + } else { + return html`${children}`; + } +}; diff --git a/JS/edgechains/lib/create-edgechains/__common/ormconfig.json b/JS/edgechains/lib/create-edgechains/__common/ormconfig.json new file mode 100644 index 000000000..21819c00f --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/ormconfig.json @@ -0,0 +1,11 @@ +{ + "type": "postgres", + "host": "db.rmzqtepwnzoxgkkzjctt.supabase.co", + "port": 5432, + "username": "postgres", + "password": "xaX0MYcf1YiJlChK", + "database": "postgres", + "entities": ["dist/entities/**/*.js"], + "synchronize": false, + "logging": false +} diff --git a/JS/edgechains/lib/create-edgechains/__common/src/index.d.ts b/JS/edgechains/lib/create-edgechains/__common/src/index.d.ts new file mode 100644 index 000000000..3d0d62ecd --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/index.d.ts @@ -0,0 +1 @@ +import "dotenv/config"; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/index.js b/JS/edgechains/lib/create-edgechains/__common/src/index.js new file mode 100644 index 000000000..717d49148 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/index.js @@ -0,0 +1,12 @@ +import "dotenv/config"; +import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { HydeSearchRouter } from "./routes/hydeSearch.route.js"; +import { view } from "../htmljs.js"; +import ExampleLayout from "./layouts/ExampleLayout.js"; +const app = new Hono(); +app.route("/", HydeSearchRouter); +app.get("/", view(ExampleLayout)); +serve(app, () => { + console.log("server running on port 3000"); +}); diff --git a/JS/edgechains/lib/create-edgechains/__common/src/index.ts b/JS/edgechains/lib/create-edgechains/__common/src/index.ts new file mode 100644 index 000000000..188077192 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/index.ts @@ -0,0 +1,16 @@ +import "dotenv/config"; +import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { HydeSearchRouter } from "./routes/hydeSearch.route.js"; +import { view } from "../htmljs.js"; +import ExampleLayout from "./layouts/ExampleLayout.js"; + +const app = new Hono(); + +app.route("/", HydeSearchRouter); + +app.get("/", view(ExampleLayout)); + +serve(app, () => { + console.log("server running on port 3000"); +}); diff --git a/JS/edgechains/lib/create-edgechains/__common/src/jsonnet/hyde.jsonnet b/JS/edgechains/lib/create-edgechains/__common/src/jsonnet/hyde.jsonnet new file mode 100644 index 000000000..77881790f --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/jsonnet/hyde.jsonnet @@ -0,0 +1,18 @@ +//Replace the {} in the prompt template with the query +local updateQueryPrompt(promptTemplate, query) = + local updatedPrompt = std.strReplace(promptTemplate,'{}',query + "\n"); + updatedPrompt; + +//To replace the time in the system prompt +local updateTimePrompt(promptTemplate, time) = + local updatedPrompt =std.strReplace(promptTemplate,'{time}', time ); + updatedPrompt; + +local promptTemplate = std.extVar("promptTemplate"); +local time = std.extVar("time"); +local query = std.extVar("query"); +local updatedQueryPrompt = updateQueryPrompt(promptTemplate, query); +local updatedPrompt = updateTimePrompt(updatedQueryPrompt, time); +{ + "prompt": updatedPrompt +} \ No newline at end of file diff --git a/JS/edgechains/lib/create-edgechains/__common/src/jsonnet/prompts.jsonnet b/JS/edgechains/lib/create-edgechains/__common/src/jsonnet/prompts.jsonnet new file mode 100644 index 000000000..10ff2da84 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/jsonnet/prompts.jsonnet @@ -0,0 +1,103 @@ +local WEB_SEARCH = ||| + Please write a passage to answer the question. + Question: {} + Passage: + |||; + +local SCIFACT = ||| + Please write a scientific paper passage to support/refute the claim. + Claim: {} + Passage: + |||; + +local ARGUANA = ||| + Please write a counter argument for the passage. + Passage: {} + Counter Argument: + |||; + +local TREC_COVID = ||| + Please write a scientific paper passage to answer the question. + Question: {} + Passage: + |||; + +local FIQA = ||| + Please write a financial article passage to answer the question. + Question: {} + Passage: + |||; + +local DBPEDIA_ENTITY = ||| + Please write a passage to answer the question. + Question: {} + Passage: + |||; + +local TREC_NEWS = ||| + Please write a news passage about the topic. + Topic: {} + Passage: + |||; + +local MR_TYDI = ||| + Please write a passage in {} to answer the question in detail. + Question: {} + Passage: + |||; +local CHUNK_SUMMARY = ||| + Summarize the following text to replace the original text with all important information left as it is. + Do not replace abbreviations with it's full forms. + {} + Summary: + |||; + +local ANS_PROMPT_SYSTEM = ||| + You are an AI assistant whose name is DoMIno. + - Its responses must not be vague, accusatory, rude, controversial, off-topic, or defensive. + - It should avoid giving subjective opinions but rely on objective facts or phrases like \"in this context a human might say...\", \"some people might think...\", etc. + - It can provide additional relevant details to answer in-depth and comprehensively covering mutiple aspects. + - It must provide an answer based solely on the provided sources below and not prior knowledge. It should ignore whether the question is singular or plural and just focus on the subject of the question. + - If the documents do not provide any context refuse to answer do not create an answer for the query without documents. + - If the full form of any abbreviation is unknown leave it as an abbreviation. Do not try to guess or infer the full form of the abrreviation. But do answer the query using the abbreviation without expanding it. + - If it doesn't know the answer, it must just say that it doesn't know and never try to make up an answer. However, if you are asked terms like highest, lowest, minimum, maximum and if you cannot find an exact answer, then you should mention that and still give an answer without the constraints of highest, lowest, minimum, maximum. + Below are multiple sources of information which are numbered. Please discard the sources of information that are not relevant for the question. Only use the ones that are relevant: + ---------------- + {} + |||; +local ANS_PROMPT_USER = ||| + Question: {} + Helpful Answer: + |||; +local SUMMARY = ||| + Do not expand on abbreviations and leave them as is in the reply. Please generate 5 different responses in bullet points for the question. + Please write a summary to answer the question in detail: + Question: {} + Passage: + |||; +local DATE_EXTRACTION = ||| + Extract the date of the document from the given chunk in the following format Month DD, YYYY. + Only give date in the answer, don't write any sentence or full stop: + {} + |||; +local TITLE_EXTRACTION = ||| + Extract the title of the document from the given chunk: + {} + |||; + +{ + "web_search": WEB_SEARCH, + "scifact": SCIFACT, + "arguana": ARGUANA, + "trec_covid": TREC_COVID, + "fiqa": FIQA, + "dbpedia_entity": DBPEDIA_ENTITY, + "trec_news": TREC_NEWS, + "mrqa_tydi": MR_TYDI, + "chunk_summary": CHUNK_SUMMARY, + "ans_prompt_system": ANS_PROMPT_SYSTEM, + "ans_prompt_user": ANS_PROMPT_USER, + "summary": SUMMARY, + "date_extraction": DATE_EXTRACTION, + "title_extraction": TITLE_EXTRACTION +} \ No newline at end of file diff --git a/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.d.ts b/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.d.ts new file mode 100644 index 000000000..bc18f3b4a --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.d.ts @@ -0,0 +1,3 @@ +import { FC } from "hono/jsx"; +declare const ExampleLayout: FC; +export default ExampleLayout; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.js b/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.js new file mode 100644 index 000000000..7f0c9cd3b --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.js @@ -0,0 +1,279 @@ +import { html } from "hono/html"; +const ExampleLayout = (props) => html` + + + + + + Document + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    +

    Enter these details for RRF search:

    + Metadata Table Name: + OrderRRF: + + + Text-BaseWeight: + + +
    + Text-FineTuneWeight: + 0.35 +
    + Similarity-BaseWeight: + +
    + Similarity-FineTuneWeight: + 0.4 +
    + Date-BaseWeight: + +
    + Date-FineTuneWeight: + 0.75 +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + +`; +export default ExampleLayout; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.ts b/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.ts new file mode 100644 index 000000000..90df407b0 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/layouts/ExampleLayout.ts @@ -0,0 +1,282 @@ +import { html } from "hono/html"; +import { FC } from "hono/jsx"; + +const ExampleLayout: FC = (props) => html` + + + + + + Document + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    +

    Enter these details for RRF search:

    + Metadata Table Name: + OrderRRF: + + + Text-BaseWeight: + + +
    + Text-FineTuneWeight: + 0.35 +
    + Similarity-BaseWeight: + +
    + Similarity-FineTuneWeight: + 0.4 +
    + Date-BaseWeight: + +
    + Date-FineTuneWeight: + 0.75 +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + +`; + +export default ExampleLayout; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.d.ts b/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.d.ts new file mode 100644 index 000000000..c72856b8f --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.d.ts @@ -0,0 +1,3 @@ +import { Hono } from "hono"; +declare const HydeSearchRouter: Hono; +export { HydeSearchRouter }; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.js b/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.js new file mode 100644 index 000000000..6171851b8 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.js @@ -0,0 +1,73 @@ +import { Hono } from "hono"; +import { hydeSearchAdaEmbedding } from "../service/HydeSearchService.js"; +const HydeSearchRouter = new Hono(); +HydeSearchRouter.get("/search", async (c) => { + const query = await c.req.query(); + const arkRequest = { + topK: parseInt(query.topK ?? "5"), + metadataTable: query.metadataTable, + query: query.query, + textWeight: { + baseWeight: query.textBaseWeight, + fineTuneWeight: query.textFineTuneWeight, + }, + similarityWeight: { + baseWeight: query.similarityBaseWeight, + fineTuneWeight: query.similarityFineTuneWeight, + }, + dateWeight: { + baseWeight: query.dateBaseWeight, + fineTuneWeight: query.dateFineTuneWeight, + }, + orderRRF: query.orderRRF, + }; + const answer = await hydeSearchAdaEmbedding( + arkRequest, + process.env.OPENAI_API_KEY, + process.env.OPENAI_ORG_ID + ); + const final_answer = answer.finalAnswer; + const responses = answer.wordEmbeddings; + const data = { responses, final_answer }; + return c.html(` + +
    +
    +
    ${data.final_answer}
    +
    +
      + ${data.responses.map( + (item) => ` +
    • +
      +
      + ${ + item.rawText != null + ? `
      ${item.rawText}
      ` + : `
      ${item.metadata}
      ` + } + ${ + item.filename != null + ? `
      ${item.filename}
      ` + : "" + } + ${ + item.titleMetadata != null + ? `
      ${item.titleMetadata}
      ` + : "" + } + ${ + item.documentDate != null + ? `
      ${item.documentDate}
      ` + : "" + } +
      +
      +
    • + ` + )} +
    + + `); +}); +export { HydeSearchRouter }; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.ts b/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.ts new file mode 100644 index 000000000..51b376524 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/routes/hydeSearch.route.ts @@ -0,0 +1,76 @@ +import { Hono } from "hono"; +import { hydeSearchAdaEmbedding } from "../service/HydeSearchService.js"; +import { HydeFragmentData } from "../types/HydeFragmentData.js"; +const HydeSearchRouter = new Hono(); + +HydeSearchRouter.get("/search", async (c) => { + const query = await c.req.query(); + const arkRequest = { + topK: parseInt(query.topK ?? "5"), + metadataTable: query.metadataTable, + query: query.query, + textWeight: { + baseWeight: query.textBaseWeight, + fineTuneWeight: query.textFineTuneWeight, + }, + similarityWeight: { + baseWeight: query.similarityBaseWeight, + fineTuneWeight: query.similarityFineTuneWeight, + }, + dateWeight: { + baseWeight: query.dateBaseWeight, + fineTuneWeight: query.dateFineTuneWeight, + }, + orderRRF: query.orderRRF, + }; + const answer = await hydeSearchAdaEmbedding( + arkRequest, + process.env.OPENAI_API_KEY!, + process.env.OPENAI_ORG_ID! + ); + const final_answer = answer.finalAnswer; + const responses = answer.wordEmbeddings; + const data: HydeFragmentData = { responses, final_answer }; + return c.html(` + +
    +
    +
    ${data.final_answer}
    +
    +
      + ${data.responses.map( + (item) => ` +
    • +
      +
      + ${ + item.rawText != null + ? `
      ${item.rawText}
      ` + : `
      ${item.metadata}
      ` + } + ${ + item.filename != null + ? `
      ${item.filename}
      ` + : "" + } + ${ + item.titleMetadata != null + ? `
      ${item.titleMetadata}
      ` + : "" + } + ${ + item.documentDate != null + ? `
      ${item.documentDate}
      ` + : "" + } +
      +
      +
    • + ` + )} +
    + + `); +}); + +export { HydeSearchRouter }; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.d.ts b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.d.ts new file mode 100644 index 000000000..f1ab0c89f --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.d.ts @@ -0,0 +1,10 @@ +import type { ArkRequest } from "@arakoodev/edgechains.js"; +declare function hydeSearchAdaEmbedding( + arkRequest: ArkRequest, + apiKey: string, + orgId: string +): Promise<{ + wordEmbeddings: any; + finalAnswer: any; +}>; +export { hydeSearchAdaEmbedding }; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.js b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.js new file mode 100644 index 000000000..801ccda37 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.js @@ -0,0 +1,108 @@ +import Jsonnet from "@arakoodev/jsonnet"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; +import { PostgresClient } from "@arakoodev/edgechains.js"; +import * as path from "path"; +var PostgresDistanceMetric; +(function (PostgresDistanceMetric) { + PostgresDistanceMetric["COSINE"] = "COSINE"; + PostgresDistanceMetric["IP"] = "IP"; + PostgresDistanceMetric["L2"] = "L2"; +})(PostgresDistanceMetric || (PostgresDistanceMetric = {})); +async function hydeSearchAdaEmbedding(arkRequest, apiKey, orgId) { + try { + const gpt3endpoint = new OpenAiEndpoint( + "https://api.openai.com/v1/chat/completions", + apiKey, + orgId, + "gpt-3.5-turbo", + "user", + parseInt("0.7") + ); + // Get required params from API... + const table = "ada_hyde_prod"; + const namespace = "360_docs"; + const query = arkRequest.query; + const topK = Number(arkRequest.topK); + // + const jsonnet = new Jsonnet(); + const promptPath = path.join(__dirname, "../src/jsonnet/prompts.jsonnet"); + const hydePath = path.join(__dirname, "../src/jsonnet/hyde.jsonnet"); + // Load Jsonnet to extract args.. + const promptLoader = jsonnet.evaluateFile(promptPath); + // Getting ${summary} basePrompt + const promptTemplate = JSON.parse(promptLoader).summary; + // Getting the updated promptTemplate with query + let hydeLoader = jsonnet + .extString("promptTemplate", promptTemplate) + .extString("time", "") + .extString("query", query) + .evaluateFile(hydePath); + // Get concatenated prompt + const prompt = JSON.parse(hydeLoader).prompt; + // Block and get the response from GPT3 + const gptResponse = await gpt3endpoint.gptFn(prompt); + // Chain 1 ==> Get Gpt3Response & split + const gpt3Responses = gptResponse.split("\n"); + // Chain 2 ==> Get Embeddings from OpenAI using Each Response + const embeddingsListChain = Promise.all( + gpt3Responses.map(async (resp) => { + const embedding = await gpt3endpoint.embeddings(resp); + return embedding; + }) + ); + // Chain 5 ==> Query via EmbeddingChain + const dbClient = new PostgresClient( + await embeddingsListChain, + PostgresDistanceMetric.IP, + topK, + 20, + table, + namespace, + arkRequest, + 15 + ); + const queryResult = await dbClient.dbQuery(); + // Chain 6 ==> Create Prompt using Embeddings + const retrievedDocs = []; + for (const embeddings of queryResult) { + retrievedDocs.push( + `${embeddings.raw_text}\n score:${embeddings.score}\n filename:${embeddings.filename}\n` + ); + } + if (retrievedDocs.join("").length > 4096) { + retrievedDocs.length = 4096; + } + const currentTime = new Date().toLocaleString(); + const formattedTime = currentTime; + // System prompt + const ansPromptSystem = JSON.parse(promptLoader).ans_prompt_system; + hydeLoader = await jsonnet + .extString(promptTemplate, ansPromptSystem) + .extString("time", formattedTime) + .extString("qeury", retrievedDocs.join("")) + .evaluateFile(hydePath); + const finalPromptSystem = JSON.parse(hydeLoader).prompt; + // User prompt + const ansPromptUser = JSON.parse(promptLoader).ans_prompt_user; + hydeLoader = await jsonnet + .extString(promptTemplate, ansPromptUser) + .extString("qeury", query) + .evaluateFile(hydePath); + const finalPromptUser = JSON.parse(hydeLoader).prompt; + const chatMessages = [ + { role: "system", content: finalPromptSystem }, + { role: "user", content: finalPromptUser }, + ]; + const finalAnswer = await gpt3endpoint.gptFnChat(chatMessages); + const response = { + wordEmbeddings: queryResult, + finalAnswer: finalAnswer, + }; + return response; + } catch (error) { + // Handle errors here + console.error(error); + throw error; + } +} +export { hydeSearchAdaEmbedding }; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.test.js b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.test.js new file mode 100644 index 000000000..8bf864409 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.test.js @@ -0,0 +1,34 @@ +import { hydeSearchAdaEmbedding } from "./HydeSearchService.js"; +import dotenv from "dotenv"; +dotenv.config({ path: ".env" }); +describe("Hyde Search", () => { + it("should return a response", async () => { + const arkRequest = { + topK: 5, + metadataTable: "title_metadata", + query: "tell me the top 5 programming languages currently", + textWeight: { + baseWeight: "1.0", + fineTuneWeight: "0.35", + }, + similarityWeight: { + baseWeight: "1.5", + fineTuneWeight: "0.40", + }, + dateWeight: { + baseWeight: "1.25", + fineTuneWeight: "0.75", + }, + orderRRF: "default", + }; + expect( + ( + await hydeSearchAdaEmbedding( + arkRequest, + process.env.OPENAI_API_KEY, + process.env.OPENAI_ORG_ID + ) + ).finalAnswer + ).toContain("Java"); + }, 30000); +}); diff --git a/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.test.ts b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.test.ts new file mode 100644 index 000000000..463b3a1e7 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.test.ts @@ -0,0 +1,36 @@ +import { ArkRequest } from "@arakoodev/edgechains.js"; +import { hydeSearchAdaEmbedding } from "./HydeSearchService.js"; +import dotenv from "dotenv"; + +dotenv.config({ path: ".env" }); +describe("Hyde Search", () => { + it("should return a response", async () => { + const arkRequest: ArkRequest = { + topK: 5, + metadataTable: "title_metadata", + query: "tell me the top 5 programming languages currently", + textWeight: { + baseWeight: "1.0", + fineTuneWeight: "0.35", + }, + similarityWeight: { + baseWeight: "1.5", + fineTuneWeight: "0.40", + }, + dateWeight: { + baseWeight: "1.25", + fineTuneWeight: "0.75", + }, + orderRRF: "default", + }; + expect( + ( + await hydeSearchAdaEmbedding( + arkRequest, + process.env.OPENAI_API_KEY!, + process.env.OPENAI_ORG_ID! + ) + ).finalAnswer + ).toContain("Java"); + }, 30000); +}); diff --git a/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.ts b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.ts new file mode 100644 index 000000000..5c99d7c51 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/service/HydeSearchService.ts @@ -0,0 +1,132 @@ +import Jsonnet from "@arakoodev/jsonnet"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; +import { PostgresClient } from "@arakoodev/edgechains.js"; +import type { ArkRequest } from "@arakoodev/edgechains.js"; +import * as path from "path"; + +enum PostgresDistanceMetric { + COSINE = "COSINE", + IP = "IP", + L2 = "L2", +} + +async function hydeSearchAdaEmbedding(arkRequest: ArkRequest, apiKey: string, orgId: string) { + try { + const gpt3endpoint = new OpenAiEndpoint( + "https://api.openai.com/v1/chat/completions", + apiKey, + orgId, + "gpt-3.5-turbo", + "user", + parseInt("0.7") + ); + // Get required params from API... + const table = "ada_hyde_prod"; + const namespace = "360_docs"; + const query = arkRequest.query; + const topK = Number(arkRequest.topK); + + // + const jsonnet = new Jsonnet(); + + const promptPath = path.join(__dirname, "../src/jsonnet/prompts.jsonnet"); + const hydePath = path.join(__dirname, "../src/jsonnet/hyde.jsonnet"); + // Load Jsonnet to extract args.. + const promptLoader = jsonnet.evaluateFile(promptPath); + + // Getting ${summary} basePrompt + const promptTemplate = JSON.parse(promptLoader).summary; + // Getting the updated promptTemplate with query + let hydeLoader = jsonnet + .extString("promptTemplate", promptTemplate) + .extString("time", "") + .extString("query", query) + .evaluateFile(hydePath); + + // Get concatenated prompt + const prompt = JSON.parse(hydeLoader).prompt; + + // Block and get the response from GPT3 + const gptResponse = await gpt3endpoint.gptFn(prompt); + + // Chain 1 ==> Get Gpt3Response & split + const gpt3Responses = gptResponse.split("\n"); + + // Chain 2 ==> Get Embeddings from OpenAI using Each Response + const embeddingsListChain: Promise = Promise.all( + gpt3Responses.map(async (resp) => { + const embedding = await gpt3endpoint.embeddings(resp); + return embedding; + }) + ); + + // Chain 5 ==> Query via EmbeddingChain + const dbClient = new PostgresClient( + await embeddingsListChain, + PostgresDistanceMetric.IP, + topK, + 20, + table, + namespace, + arkRequest, + 15 + ); + + const queryResult = await dbClient.dbQuery(); + + // Chain 6 ==> Create Prompt using Embeddings + const retrievedDocs: string[] = []; + + for (const embeddings of queryResult) { + retrievedDocs.push( + `${embeddings.raw_text}\n score:${embeddings.score}\n filename:${embeddings.filename}\n` + ); + } + + if (retrievedDocs.join("").length > 4096) { + retrievedDocs.length = 4096; + } + + const currentTime = new Date().toLocaleString(); + const formattedTime = currentTime; + + // System prompt + const ansPromptSystem = JSON.parse(promptLoader).ans_prompt_system; + + hydeLoader = await jsonnet + .extString(promptTemplate, ansPromptSystem) + .extString("time", formattedTime) + .extString("qeury", retrievedDocs.join("")) + .evaluateFile(hydePath); + + const finalPromptSystem = JSON.parse(hydeLoader).prompt; + + // User prompt + const ansPromptUser = JSON.parse(promptLoader).ans_prompt_user; + + hydeLoader = await jsonnet + .extString(promptTemplate, ansPromptUser) + .extString("qeury", query) + .evaluateFile(hydePath); + const finalPromptUser = JSON.parse(hydeLoader).prompt; + + const chatMessages = [ + { role: "system", content: finalPromptSystem }, + { role: "user", content: finalPromptUser }, + ]; + + const finalAnswer = await gpt3endpoint.gptFnChat(chatMessages); + + const response = { + wordEmbeddings: queryResult, + finalAnswer: finalAnswer, + }; + return response; + } catch (error) { + // Handle errors here + console.error(error); + throw error; + } +} + +export { hydeSearchAdaEmbedding }; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.d.ts b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.d.ts new file mode 100644 index 000000000..6ebacb353 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.d.ts @@ -0,0 +1 @@ +export declare function getContent(): Promise; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.js b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.js new file mode 100644 index 000000000..4fd8f94ca --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.js @@ -0,0 +1,56 @@ +import Jsonnet from "@arakoodev/jsonnet"; +import * as path from "path"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; +const jsonnet = new Jsonnet(); +const promptPath = path.join(process.cwd(), "./src/testGeneration/prompts.jsonnet"); +const testGeneratorPath = path.join(process.cwd(), "./src/testGeneration/testGenerator.jsonnet"); +const gpt3endpoint = new OpenAiEndpoint( + "https://api.openai.com/v1/chat/completions", + "", + "", + "gpt-3.5-turbo", + "user", + 0.7 +); +const classText = + "public class ChatMessage {\n" + + " String role;\n" + + " String content;\n\n" + + " public ChatMessage(String role, String content) {\n" + + " this.role = role;\n" + + " this.content = content;\n" + + " }\n\n" + + " public ChatMessage() {}\n\n" + + " public String getRole() {\n" + + " return role;\n" + + " }\n\n" + + " public String getContent() {\n" + + " return content;\n" + + " }\n\n" + + " public void setContent(String content) {\n" + + " this.content = content;\n" + + " }\n\n" + + " @Override\n" + + " public String toString() {\n" + + ' return "ChatMessage{" + "role=\'" + role + "\', content=\'" + content + "\'}";\n' + + " }\n" + + "}"; +export async function getContent() { + try { + var prompt = await jsonnet.evaluateFile(promptPath); + const testPrompt = await jsonnet + .extString("promptTemplate", JSON.parse(prompt).prompt) + .extString("test_class", classText) + .extString("test_package", "JUnit") + .evaluateFile(testGeneratorPath); + var responce = await gpt3endpoint.gptFnTestGenerator(JSON.parse(testPrompt).prompt); + console.log("First Response.......\n \n" + responce); + var finalResponse = responce; + responce += JSON.parse(prompt).promptPlan; + finalResponse += await gpt3endpoint.gptFnTestGenerator(responce); + console.log("Final Response.......\n\n"); + return finalResponse; + } catch (error) { + console.log(error); + } +} diff --git a/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.ts b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.ts new file mode 100644 index 000000000..833f5a6f9 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/TestGenerator.ts @@ -0,0 +1,66 @@ +import Jsonnet from "@arakoodev/jsonnet"; +import * as path from "path"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; + +const jsonnet = new Jsonnet(); +const promptPath = path.join(process.cwd(), "./src/testGeneration/prompts.jsonnet"); +const testGeneratorPath = path.join(process.cwd(), "./src/testGeneration/testGenerator.jsonnet"); + +const gpt3endpoint = new OpenAiEndpoint( + "https://api.openai.com/v1/chat/completions", + "", + "", + "gpt-3.5-turbo", + "user", + 0.7 +); + +const classText = + "public class ChatMessage {\n" + + " String role;\n" + + " String content;\n\n" + + " public ChatMessage(String role, String content) {\n" + + " this.role = role;\n" + + " this.content = content;\n" + + " }\n\n" + + " public ChatMessage() {}\n\n" + + " public String getRole() {\n" + + " return role;\n" + + " }\n\n" + + " public String getContent() {\n" + + " return content;\n" + + " }\n\n" + + " public void setContent(String content) {\n" + + " this.content = content;\n" + + " }\n\n" + + " @Override\n" + + " public String toString() {\n" + + ' return "ChatMessage{" + "role=\'" + role + "\', content=\'" + content + "\'}";\n' + + " }\n" + + "}"; +export async function getContent() { + try { + var prompt = await jsonnet.evaluateFile(promptPath); + + const testPrompt = await jsonnet + .extString("promptTemplate", JSON.parse(prompt).prompt) + .extString("test_class", classText) + .extString("test_package", "JUnit") + .evaluateFile(testGeneratorPath); + + var responce = await gpt3endpoint.gptFnTestGenerator(JSON.parse(testPrompt).prompt); + + console.log("First Response.......\n \n" + responce); + var finalResponse = responce; + + responce += JSON.parse(prompt).promptPlan; + + finalResponse += await gpt3endpoint.gptFnTestGenerator(responce); + + console.log("Final Response.......\n\n"); + + return finalResponse; + } catch (error) { + console.log(error); + } +} diff --git a/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/prompts.jsonnet b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/prompts.jsonnet new file mode 100644 index 000000000..daa0bf998 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/prompts.jsonnet @@ -0,0 +1,28 @@ +local prompt = ||| + # How to write great unit tests with {test_package} + In this advanced tutorial for experts, we'll use Java and {test_package} to write a suite of unit tests to verify the behavior of the following function. + ```java + {test_class} + ``` + Before writing any unit tests, let's review what each element of the function is doing exactly and what the author's intentions may have been. + - First, + |||; + +local prompt_to_explain_a_plan =||| + A good unit test suite should aim to: + - Test the function's behavior for a wide range of possible inputs + - Test edge cases that the author may not have foreseen + - Take advantage of the features of {test_package} to make the tests easy to write and maintain + - Be easy to read and understand, with clean code and descriptive names + - Be deterministic, so that the tests always pass or fail in the same way + + {test_package} has many convenient features that make it easy to write and maintain unit tests. We'll use them to write unit tests for the function above. + + For this particular function, we'll want our unit tests to handle the following diverse scenarios (and under each scenario, we include a few examples as sub-bullets): + - + |||; + +{ + "promptPlan" : prompt_to_explain_a_plan, + "prompt" : prompt +} \ No newline at end of file diff --git a/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/testGenerator.jsonnet b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/testGenerator.jsonnet new file mode 100644 index 000000000..351357215 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/testGeneration/testGenerator.jsonnet @@ -0,0 +1,18 @@ +//Replace the {} in the prompt template with the query +local updateTestPrompt(promptTemplate, test_class) = + local updatedPrompt = std.strReplace(promptTemplate,'{test_class}',test_class); + updatedPrompt; + +//To replace the time in the system prompt +local updateTimePrompt(promptTemplate, test_package) = + local updatedPrompt =std.strReplace(promptTemplate,'{test_package}',test_package); + updatedPrompt; + +local promptTemplate = std.extVar("promptTemplate"); +local test_class = std.extVar("test_class"); +local test_package = std.extVar("test_package"); +local updatedQueryPrompt = updateTestPrompt(promptTemplate, test_class); +local updatedPrompt = updateTimePrompt(updatedQueryPrompt, test_package); +{ + "prompt": updatedPrompt +} \ No newline at end of file diff --git a/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.d.ts b/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.d.ts new file mode 100644 index 000000000..e807409b3 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.d.ts @@ -0,0 +1,10 @@ +export interface HydeFragmentData { + responses: Array<{ + rawText?: string; + metadata?: string; + filename?: string; + titleMetadata?: string; + documentDate?: string; + }>; + final_answer?: string; +} diff --git a/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.js b/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.js new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.js @@ -0,0 +1 @@ +export {}; diff --git a/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.ts b/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.ts new file mode 100644 index 000000000..e807409b3 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/src/types/HydeFragmentData.ts @@ -0,0 +1,10 @@ +export interface HydeFragmentData { + responses: Array<{ + rawText?: string; + metadata?: string; + filename?: string; + titleMetadata?: string; + documentDate?: string; + }>; + final_answer?: string; +} diff --git a/JS/edgechains/lib/create-edgechains/__common/tsconfig.json b/JS/edgechains/lib/create-edgechains/__common/tsconfig.json new file mode 100644 index 000000000..9f5e36d0a --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/__common/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "types": ["dotenv/config", "jest", "node"], + "target": "ES2022", + "module": "NodeNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "noImplicitAny": false, + "moduleResolution": "NodeNext", + "declaration": true + }, + "include": [ + "src/**/*.ts", + "dist/**/*.d.ts" // include the generated declaration file + ] +} diff --git a/JS/edgechains/lib/create-edgechains/index.d.ts b/JS/edgechains/lib/create-edgechains/index.d.ts new file mode 100644 index 000000000..aca639e3d --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/index.d.ts @@ -0,0 +1,6 @@ +type Options = { + project_name: string; + lang_preference: "typescript"; + deployment_target: "node"; +}; +export type { Options }; diff --git a/JS/edgechains/lib/create-edgechains/index.js b/JS/edgechains/lib/create-edgechains/index.js new file mode 100644 index 000000000..5440565f1 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/index.js @@ -0,0 +1,223 @@ +import * as path from "node:path"; +import * as fs from "node:fs"; +import inquirer from "inquirer"; +import { format } from "prettier"; +import { get_ts_config } from "./src/get-tsconfig.js"; +import { get_package_json } from "./src/get-package-json.js"; +import { fileURLToPath } from "node:url"; +import { get_gitignore } from "./src/get-gitignore.js"; +import { get_env } from "./src/get-env.js"; +function dirname_from_import_meta(import_meta_url) { + return path.dirname(fileURLToPath(import_meta_url)); +} +const prompts = [ + { + type: "number", + name: "new_dir_name", + message: `Enter a name for your project's new directory:`, + prefix: "\n", + validate: (dirname) => { + const invalidCharacters = /[<>:"\/\\|?*\x00-\x1F ]/; + return !!dirname && !invalidCharacters.test(dirname); + }, + }, +]; +async function ask_questions() { + try { + return await inquirer.prompt(prompts); + } catch (error) { + console.error("\nError:", error); + } +} +function get_options(choices) { + const options = { + project_name: choices.new_dir_name, + lang_preference: "typescript", + deployment_target: "node", + }; + return options; +} +async function main() { + const choices = await ask_questions(); + if (!choices) { + console.log("\nSomething went wrong! Please file an issue.\n"); + return; + } + const options = get_options(choices); + console.log("\nWorking..."); + try { + const new_dir_path = path.join(process.cwd(), choices.new_dir_name); + const dir_already_exists = + fs.existsSync(new_dir_path) && fs.statSync(new_dir_path).isDirectory(); + if (dir_already_exists) { + throw new Error(`Directory ${new_dir_path} already exists.`); + } + function handle_file_copy({ code, destination_without_extension, extension }) { + return handle_file_copy_low_level({ + code, + destination_without_extension, + new_dir_path, + extension, + }); + } + // create all the folders we need + fs.mkdirSync(new_dir_path, { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/jsonnet"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/routes"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/service"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/types"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/layouts"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/testGeneration"), { recursive: true }); + // tsconfig + fs.writeFileSync( + path.join(new_dir_path, "tsconfig.json"), + await format(get_ts_config(), { + parser: "json", + }), + "utf8" + ); + // package.json + fs.writeFileSync( + path.join(new_dir_path, "package.json"), + await format(get_package_json(options), { + parser: "json", + }), + "utf8" + ); + //gitignore + fs.writeFileSync(path.join(new_dir_path, ".gitignore"), get_gitignore(), "utf8"); + //.env + fs.writeFileSync(path.join(new_dir_path, ".env"), get_env(), "utf8"); + const root_dir_path = path.join(dirname_from_import_meta(import.meta.url), `../`); + const layout_file = "ExampleLayout"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/layouts/" + layout_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/layouts/" + layout_file, + extension: ".ts", + }); + const route_file = "hydeSearch.route"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/routes/" + route_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/routes/" + route_file, + extension: ".ts", + }); + const service_files = ["HydeSearchService", "HydeSearchService.test"]; + await Promise.all( + service_files.map(async (file) => { + return handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/service/" + file + ".ts"), + "utf8" + ), + destination_without_extension: "src/service/" + file, + extension: ".ts", + }); + }) + ); + const type_file = "HydeFragmentData"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/types/" + type_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/types/" + type_file, + extension: ".ts", + }); + const test_file = "TestGenerator"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/testGeneration/" + test_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/testGeneration/" + test_file, + extension: ".ts", + }); + const index_file = "index"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/" + index_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/" + index_file, + extension: ".ts", + }); + const jsonnet_files = ["hyde", "prompts"]; + await Promise.all( + jsonnet_files.map(async (file) => { + return handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/jsonnet/" + file + ".jsonnet"), + "utf8" + ), + destination_without_extension: "src/jsonnet/" + file, + extension: ".jsonnet", + }); + }) + ); + await Promise.all( + jsonnet_files.map(async (file) => { + return handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/jsonnet/" + file + ".jsonnet"), + "utf8" + ), + destination_without_extension: "src/testGeneration/" + file, + extension: ".jsonnet", + }); + }) + ); + const build_file = "esbuild.build"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/" + build_file + ".js"), + "utf8" + ), + destination_without_extension: "/" + build_file, + extension: ".js", + }); + const html_js_file = "htmljs"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/" + html_js_file + ".ts"), + "utf8" + ), + destination_without_extension: "/" + html_js_file, + extension: ".ts", + }); + const orm_file = "ormconfig"; + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/" + orm_file + ".json"), + "utf8" + ), + destination_without_extension: "/" + orm_file, + extension: ".json", + }); + console.log("\nFinished..."); + } catch (e) { + return e; + } +} +async function runMain() { + await main(); +} +runMain(); +async function handle_file_copy_low_level({ + code, + destination_without_extension, + new_dir_path, + extension, +}) { + fs.writeFileSync( + path.join(new_dir_path, destination_without_extension + extension), + code, + "utf8" + ); +} diff --git a/JS/edgechains/lib/create-edgechains/index.ts b/JS/edgechains/lib/create-edgechains/index.ts new file mode 100644 index 000000000..4c68b50de --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/index.ts @@ -0,0 +1,288 @@ +import * as path from "node:path"; +import * as fs from "node:fs"; +import inquirer from "inquirer"; +import { format } from "prettier"; +import { get_ts_config } from "./src/get-tsconfig.js"; +import { get_package_json } from "./src/get-package-json.js"; +import { fileURLToPath } from "node:url"; +import { get_gitignore } from "./src/get-gitignore.js"; +import { get_env } from "./src/get-env.js"; + +type Options = { + project_name: string; + lang_preference: "typescript"; + deployment_target: "node"; +}; + +function dirname_from_import_meta(import_meta_url: string) { + return path.dirname(fileURLToPath(import_meta_url)); +} + +type Prompts = Parameters<(typeof inquirer)["prompt"]>[0]; + +const prompts: Prompts[] = [ + { + type: "number", + name: "new_dir_name", + message: `Enter a name for your project's new directory:`, + prefix: "\n", + validate: (dirname: string) => { + const invalidCharacters = /[<>:"\/\\|?*\x00-\x1F ]/; + return !!dirname && !invalidCharacters.test(dirname); + }, + }, +]; + +async function ask_questions(): Promise { + try { + return await inquirer.prompt(prompts); + } catch (error) { + console.error("\nError:", error); + } +} + +function get_options(choices: NonNullable>>) { + const options: Options = { + project_name: choices.new_dir_name, + lang_preference: "typescript", + deployment_target: "node", + }; + return options; +} + +async function main() { + const choices = await ask_questions(); + + if (!choices) { + console.log("\nSomething went wrong! Please file an issue.\n"); + return; + } + + const options = get_options(choices); + + console.log("\nWorking..."); + + try { + const new_dir_path = path.join(process.cwd(), choices.new_dir_name); + + const dir_already_exists = + fs.existsSync(new_dir_path) && fs.statSync(new_dir_path).isDirectory(); + + if (dir_already_exists) { + throw new Error(`Directory ${new_dir_path} already exists.`); + } + + function handle_file_copy({ + code, + destination_without_extension, + extension, + }: { + code: string; + destination_without_extension: string; + extension: string; + }) { + return handle_file_copy_low_level({ + code, + destination_without_extension, + new_dir_path, + extension, + }); + } + + // create all the folders we need + fs.mkdirSync(new_dir_path, { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/jsonnet"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/routes"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/service"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/types"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/layouts"), { recursive: true }); + fs.mkdirSync(path.join(new_dir_path, "src/testGeneration"), { recursive: true }); + + // tsconfig + fs.writeFileSync( + path.join(new_dir_path, "tsconfig.json"), + await format(get_ts_config(), { + parser: "json", + }), + "utf8" + ); + + // package.json + fs.writeFileSync( + path.join(new_dir_path, "package.json"), + await format(get_package_json(options), { + parser: "json", + }), + "utf8" + ); + + //gitignore + fs.writeFileSync(path.join(new_dir_path, ".gitignore"), get_gitignore(), "utf8"); + + //.env + fs.writeFileSync(path.join(new_dir_path, ".env"), get_env(), "utf8"); + + const root_dir_path = path.join(dirname_from_import_meta(import.meta.url), `../`); + + const layout_file = "ExampleLayout"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/layouts/" + layout_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/layouts/" + layout_file, + extension: ".ts", + }); + + const route_file = "hydeSearch.route"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/routes/" + route_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/routes/" + route_file, + extension: ".ts", + }); + + const service_files = ["HydeSearchService", "HydeSearchService.test"]; + + await Promise.all( + service_files.map(async (file) => { + return handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/service/" + file + ".ts"), + "utf8" + ), + destination_without_extension: "src/service/" + file, + extension: ".ts", + }); + }) + ); + + const type_file = "HydeFragmentData"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/types/" + type_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/types/" + type_file, + extension: ".ts", + }); + + const test_file = "TestGenerator"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/testGeneration/" + test_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/testGeneration/" + test_file, + extension: ".ts", + }); + + const index_file = "index"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/" + index_file + ".ts"), + "utf8" + ), + destination_without_extension: "src/" + index_file, + extension: ".ts", + }); + + const jsonnet_files = ["hyde", "prompts"]; + + await Promise.all( + jsonnet_files.map(async (file) => { + return handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/jsonnet/" + file + ".jsonnet"), + "utf8" + ), + destination_without_extension: "src/jsonnet/" + file, + extension: ".jsonnet", + }); + }) + ); + + await Promise.all( + jsonnet_files.map(async (file) => { + return handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/src/jsonnet/" + file + ".jsonnet"), + "utf8" + ), + destination_without_extension: "src/testGeneration/" + file, + extension: ".jsonnet", + }); + }) + ); + + const build_file = "esbuild.build"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/" + build_file + ".js"), + "utf8" + ), + destination_without_extension: "/" + build_file, + extension: ".js", + }); + + const html_js_file = "htmljs"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/" + html_js_file + ".ts"), + "utf8" + ), + destination_without_extension: "/" + html_js_file, + extension: ".ts", + }); + + const orm_file = "ormconfig"; + + handle_file_copy({ + code: fs.readFileSync( + path.join(root_dir_path, "__common/" + orm_file + ".json"), + "utf8" + ), + destination_without_extension: "/" + orm_file, + extension: ".json", + }); + + console.log("\nFinished..."); + } catch (e) { + return e; + } +} +async function runMain() { + await main(); +} + +runMain(); + +async function handle_file_copy_low_level({ + code, + destination_without_extension, + new_dir_path, + extension, +}: { + code: string; + destination_without_extension: string; + new_dir_path: string; + extension: string; +}) { + fs.writeFileSync( + path.join(new_dir_path, destination_without_extension + extension), + code, + "utf8" + ); +} + +export type { Options }; diff --git a/JS/edgechains/lib/create-edgechains/scripts/create-edgechains.js b/JS/edgechains/lib/create-edgechains/scripts/create-edgechains.js new file mode 100755 index 000000000..fe86f876a --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/scripts/create-edgechains.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node +async function run() { + await import("../dist/index.mjs"); +} +run(); diff --git a/JS/edgechains/lib/create-edgechains/src/get-env.d.ts b/JS/edgechains/lib/create-edgechains/src/get-env.d.ts new file mode 100644 index 000000000..e2ed6a0f7 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-env.d.ts @@ -0,0 +1,2 @@ +declare function get_env(): string; +export { get_env }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-env.js b/JS/edgechains/lib/create-edgechains/src/get-env.js new file mode 100644 index 000000000..b6ea77cf6 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-env.js @@ -0,0 +1,8 @@ +function get_env() { + let text = ` + OPENAI_API_KEY= + OPENAI_ORG_ID= + `.trim(); + return text.trim() + "\n"; +} +export { get_env }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-env.ts b/JS/edgechains/lib/create-edgechains/src/get-env.ts new file mode 100644 index 000000000..e35f50f16 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-env.ts @@ -0,0 +1,10 @@ +function get_env() { + let text = ` + OPENAI_API_KEY= + OPENAI_ORG_ID= + `.trim(); + + return text.trim() + "\n"; +} + +export { get_env }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-gitignore.d.ts b/JS/edgechains/lib/create-edgechains/src/get-gitignore.d.ts new file mode 100644 index 000000000..0ed4ac16e --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-gitignore.d.ts @@ -0,0 +1,2 @@ +declare function get_gitignore(): string; +export { get_gitignore }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-gitignore.js b/JS/edgechains/lib/create-edgechains/src/get-gitignore.js new file mode 100644 index 000000000..f98ffd28e --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-gitignore.js @@ -0,0 +1,14 @@ +function get_gitignore() { + let text = ` + # standard exclusions + node_modules + + # build artifacts + dist + + # environment files + .env + `.trim(); + return text.trim() + "\n"; +} +export { get_gitignore }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-gitignore.ts b/JS/edgechains/lib/create-edgechains/src/get-gitignore.ts new file mode 100644 index 000000000..08ae5ca66 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-gitignore.ts @@ -0,0 +1,16 @@ +function get_gitignore() { + let text = ` + # standard exclusions + node_modules + + # build artifacts + dist + + # environment files + .env + `.trim(); + + return text.trim() + "\n"; +} + +export { get_gitignore }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-package-json.d.ts b/JS/edgechains/lib/create-edgechains/src/get-package-json.d.ts new file mode 100644 index 000000000..f15b81931 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-package-json.d.ts @@ -0,0 +1,3 @@ +import type { Options } from "../index.js"; +declare function get_package_json(options: Options): string; +export { get_package_json }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-package-json.js b/JS/edgechains/lib/create-edgechains/src/get-package-json.js new file mode 100644 index 000000000..e0e8cb261 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-package-json.js @@ -0,0 +1,58 @@ +function get_package_json(options) { + return ( + JSON.stringify( + { + name: "example", + version: "1.0.0", + description: "", + main: "dist/index.js", + scripts: { + build: "rm -rf dist && node esbuild.build.cjs", + start: "node dist/index.js", + lint: "eslint --ignore-path .eslintignore --ext .js,.ts", + format: 'prettier --ignore-path .gitignore --write "**/*.+(js|ts|json)"', + test: "npx jest", + }, + keywords: [], + author: "", + license: "ISC", + dependencies: { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + hono: "^3.9.2", + pg: "^8.11.3", + "reflect-metadata": "^0.1.13", + tsc: "^2.0.4", + typescript: "^5.3.2", + }, + devDependencies: { + "@hanazuki/node-jsonnet": "^2.1.0", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + axios: "^1.6.2", + dotenv: "^16.3.1", + "dts-bundle-generator": "^8.1.2", + eslint: "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-promise": "^6.1.1", + jest: "^29.7.0", + prettier: "^3.1.0", + react: "^18.2.0", + "@arakoodev/edgechains.js": "0.1.22", + "ts-jest": "^29.1.1", + tsx: "^3.12.2", + typeorm: "^0.3.17", + typescript: "^5.0.2", + }, + }, + null, + 2 + ) + "\n" + ); +} +export { get_package_json }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-package-json.ts b/JS/edgechains/lib/create-edgechains/src/get-package-json.ts new file mode 100644 index 000000000..32cd20f5a --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-package-json.ts @@ -0,0 +1,61 @@ +import type { Options } from "../index.js"; + +function get_package_json(options: Options) { + return ( + JSON.stringify( + { + name: "example", + version: "1.0.0", + description: "", + main: "dist/index.js", + scripts: { + build: "rm -rf dist && node esbuild.build.cjs", + start: "node dist/index.js", + lint: "eslint --ignore-path .eslintignore --ext .js,.ts", + format: 'prettier --ignore-path .gitignore --write "**/*.+(js|ts|json)"', + test: "npx jest", + }, + keywords: [], + author: "", + license: "ISC", + dependencies: { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + hono: "^3.9.2", + pg: "^8.11.3", + "reflect-metadata": "^0.1.13", + tsc: "^2.0.4", + typescript: "^5.3.2", + }, + devDependencies: { + "@hanazuki/node-jsonnet": "^2.1.0", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + axios: "^1.6.2", + dotenv: "^16.3.1", + "dts-bundle-generator": "^8.1.2", + eslint: "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-promise": "^6.1.1", + jest: "^29.7.0", + prettier: "^3.1.0", + react: "^18.2.0", + "@arakoodev/edgechains.js": "0.1.22", + "ts-jest": "^29.1.1", + tsx: "^3.12.2", + typeorm: "^0.3.17", + typescript: "^5.0.2", + }, + }, + null, + 2 + ) + "\n" + ); +} + +export { get_package_json }; diff --git a/JS/edgechains/lib/create-edgechains/src/get-tsconfig.d.ts b/JS/edgechains/lib/create-edgechains/src/get-tsconfig.d.ts new file mode 100644 index 000000000..83b213c33 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-tsconfig.d.ts @@ -0,0 +1 @@ +export declare function get_ts_config(): string; diff --git a/JS/edgechains/lib/create-edgechains/src/get-tsconfig.js b/JS/edgechains/lib/create-edgechains/src/get-tsconfig.js new file mode 100644 index 000000000..f1fa1093d --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-tsconfig.js @@ -0,0 +1,23 @@ +const ts_config = { + compilerOptions: { + types: ["dotenv/config", "jest", "node"], + target: "ES2022", + module: "NodeNext", + esModuleInterop: true, + forceConsistentCasingInFileNames: true, + strict: true, + skipLibCheck: true, + jsx: "react-jsx", + jsxImportSource: "hono/jsx", + noImplicitAny: false, + moduleResolution: "NodeNext", + declaration: true, + }, + include: [ + "src/**/*.ts", + "dist/**/*.d.ts", // include the generated declaration file + ], +}; +export function get_ts_config() { + return JSON.stringify(ts_config).trim() + "\n"; +} diff --git a/JS/edgechains/lib/create-edgechains/src/get-tsconfig.ts b/JS/edgechains/lib/create-edgechains/src/get-tsconfig.ts new file mode 100644 index 000000000..706b7b0bf --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/src/get-tsconfig.ts @@ -0,0 +1,26 @@ +import { Options } from "../index.js"; + +const ts_config = { + compilerOptions: { + types: ["dotenv/config", "jest", "node"], + target: "ES2022", + module: "NodeNext", + esModuleInterop: true, + forceConsistentCasingInFileNames: true, + strict: true, + skipLibCheck: true, + jsx: "react-jsx", + jsxImportSource: "hono/jsx", + noImplicitAny: false, + moduleResolution: "NodeNext", + declaration: true, + }, + include: [ + "src/**/*.ts", + "dist/**/*.d.ts", // include the generated declaration file + ], +}; + +export function get_ts_config() { + return JSON.stringify(ts_config).trim() + "\n"; +} diff --git a/JS/edgechains/lib/create-edgechains/tsconfig.json b/JS/edgechains/lib/create-edgechains/tsconfig.json new file mode 100644 index 000000000..1fa64fa01 --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitAny": true, + "skipLibCheck": true, + "noEmit": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx" + }, + "exclude": ["node_modules", "dist"] +} diff --git a/JS/edgechains/lib/create-edgechains/tsup.build.cjs b/JS/edgechains/lib/create-edgechains/tsup.build.cjs new file mode 100644 index 000000000..107b17dfe --- /dev/null +++ b/JS/edgechains/lib/create-edgechains/tsup.build.cjs @@ -0,0 +1,5 @@ +const { execSync } = require("child_process"); + +execSync("rm -rf dist"); + +execSync("tsup-node index.ts --format esm", { stdio: "inherit" }); diff --git a/JS/edgechains/lib/esbuild.build.cjs b/JS/edgechains/lib/esbuild.build.cjs new file mode 100644 index 000000000..13d722f7e --- /dev/null +++ b/JS/edgechains/lib/esbuild.build.cjs @@ -0,0 +1,63 @@ +const esbuild = require("esbuild"); +const path = require("path"); +const fs = require("fs"); +const { execSync } = require("child_process"); + +const outputDir = path.resolve(__dirname, "dist"); + +if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir); +} + +const distPath = path.join(process.cwd(), "dist"); + +fs.promises.mkdir(distPath, { recursive: true }); + +esbuild + .build({ + entryPoints: ["./index.ts"], + bundle: true, + minify: true, + platform: "node", + outdir: "./dist", + tsconfig: "./tsconfig.json", + target: "node21.1.0", + external: [ + "express", + "tsx", + "typescript", + "typeorm", + "react", + "react-dom", + "pg", + "jsdom", + "hono", + "@hanazuki/node-jsonnet", + "@arakoodev/jsonnet", + "readline/promises", + ], + format: "cjs", + loader: { + ".html": "text", + ".css": "css", + ".jsonnet": "text", + }, + }) + .then(() => { + const entryPoint = path.resolve(process.cwd(), "index.ts"); + const output = path.resolve(process.cwd(), "dist/index.d.ts"); + + execSync(`dts-bundle-generator ${entryPoint} --out-file ${output}`, { + stdio: "inherit", + }); + + console.log("TypeScript compilation and index.d.ts generation successful."); + + execSync("cd create-edgechains && rm -rf dist"); + + execSync("cd create-edgechains && tsup-node index.ts --format esm", { stdio: "inherit" }); + }) + .catch(() => { + console.error("TypeScript compilation or index.d.ts generation failed."); + process.exit(1); + }); diff --git a/JS/edgechains/lib/index.d.ts b/JS/edgechains/lib/index.d.ts new file mode 100644 index 000000000..68aba869b --- /dev/null +++ b/JS/edgechains/lib/index.d.ts @@ -0,0 +1,2 @@ +import "dotenv/config"; +export type { ArkRequest } from "./src/types/ArkRequest.js"; diff --git a/JS/edgechains/lib/index.js b/JS/edgechains/lib/index.js new file mode 100644 index 000000000..3d0d62ecd --- /dev/null +++ b/JS/edgechains/lib/index.js @@ -0,0 +1 @@ +import "dotenv/config"; diff --git a/JS/edgechains/lib/index.ts b/JS/edgechains/lib/index.ts new file mode 100644 index 000000000..75a914beb --- /dev/null +++ b/JS/edgechains/lib/index.ts @@ -0,0 +1,3 @@ +import "dotenv/config"; + +export type { ArkRequest } from "./src/types/ArkRequest.js"; diff --git a/JS/edgechains/lib/ormconfig.json b/JS/edgechains/lib/ormconfig.json new file mode 100644 index 000000000..21819c00f --- /dev/null +++ b/JS/edgechains/lib/ormconfig.json @@ -0,0 +1,11 @@ +{ + "type": "postgres", + "host": "db.rmzqtepwnzoxgkkzjctt.supabase.co", + "port": 5432, + "username": "postgres", + "password": "xaX0MYcf1YiJlChK", + "database": "postgres", + "entities": ["dist/entities/**/*.js"], + "synchronize": false, + "logging": false +} diff --git a/JS/edgechains/lib/package.json b/JS/edgechains/lib/package.json new file mode 100644 index 000000000..844e25526 --- /dev/null +++ b/JS/edgechains/lib/package.json @@ -0,0 +1,62 @@ +{ + "name": "@arakoodev/create-edgechains", + "version": "0.1.22", + "main": "dist/index.js", + "type": "module", + "files": [ + "dist", + "create-edgechains/scripts", + "create-edgechains/dist", + "create-edgechains/__common", + "node_modules/" + ], + "jest": { + "setupFiles": [ + "/setupTests.js" + ] + }, + "scripts": { + "build": "rm -rf dist && node esbuild.build.cjs", + "start": "node dist/index.js", + "lint": "eslint --ignore-path .eslintignore --ext .js,.ts", + "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"", + "test": "npx jest" + }, + "bin": { + "create-edgechains": "./create-edgechains/scripts/create-edgechains.js" + }, + "dependencies": { + "@arakoodev/edgechains.js": "^0.1.22", + "@arakoodev/jsonnet": "^0.1.2", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.24.4", + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "axios": "^1.6.2", + "axios-retry": "^4.1.0", + "dotenv": "^16.4.5", + "esbuild": "^0.20.2", + "eventsource-parser": "^1.1.2", + "inquirer": "^9.2.12", + "milsymbol": "^2.2.0", + "msw": "^2.2.13", + "node-fetch": "^3.3.2", + "prettier": "^3.1.0", + "regenerator-runtime": "^0.14.1", + "retry": "^0.13.1", + "typeorm": "^0.3.17" + }, + "devDependencies": { + "@types/inquirer": "^9.0.7", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "dts-bundle-generator": "^8.1.2", + "eslint": "^8.57.0", + "jest": "^29.7.0", + "jest-fetch-mock": "^3.0.3", + "react": "^18.2.0", + "ts-jest": "^29.1.2", + "tsup": "^7.2.0", + "typescript": "^5.0.2" + } +} diff --git a/JS/edgechains/lib/setupTests.js b/JS/edgechains/lib/setupTests.js new file mode 100644 index 000000000..50dec607e --- /dev/null +++ b/JS/edgechains/lib/setupTests.js @@ -0,0 +1 @@ +import "regenerator-runtime/runtime"; diff --git a/JS/edgechains/lib/src/setupTests.d.ts b/JS/edgechains/lib/src/setupTests.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/JS/edgechains/lib/src/setupTests.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/JS/edgechains/lib/src/setupTests.js b/JS/edgechains/lib/src/setupTests.js new file mode 100644 index 000000000..c0472c6f8 --- /dev/null +++ b/JS/edgechains/lib/src/setupTests.js @@ -0,0 +1,2 @@ +import dotenv from "dotenv"; +dotenv.config({ path: ".env" }); diff --git a/JS/edgechains/lib/src/setupTests.ts b/JS/edgechains/lib/src/setupTests.ts new file mode 100644 index 000000000..a4ceb40f0 --- /dev/null +++ b/JS/edgechains/lib/src/setupTests.ts @@ -0,0 +1,3 @@ +import dotenv from "dotenv"; + +dotenv.config({ path: ".env" }); diff --git a/JS/edgechains/lib/src/types/ArkRequest.d.ts b/JS/edgechains/lib/src/types/ArkRequest.d.ts new file mode 100644 index 000000000..629a78b7e --- /dev/null +++ b/JS/edgechains/lib/src/types/ArkRequest.d.ts @@ -0,0 +1,18 @@ +export interface ArkRequest { + topK: number; + metadataTable: string; + query: string; + textWeight: { + baseWeight: string; + fineTuneWeight: string; + }; + similarityWeight: { + baseWeight: string; + fineTuneWeight: string; + }; + dateWeight: { + baseWeight: string; + fineTuneWeight: string; + }; + orderRRF: string; +} diff --git a/JS/edgechains/lib/src/types/ArkRequest.js b/JS/edgechains/lib/src/types/ArkRequest.js new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/JS/edgechains/lib/src/types/ArkRequest.js @@ -0,0 +1 @@ +export {}; diff --git a/JS/edgechains/lib/src/types/ArkRequest.ts b/JS/edgechains/lib/src/types/ArkRequest.ts new file mode 100644 index 000000000..629a78b7e --- /dev/null +++ b/JS/edgechains/lib/src/types/ArkRequest.ts @@ -0,0 +1,18 @@ +export interface ArkRequest { + topK: number; + metadataTable: string; + query: string; + textWeight: { + baseWeight: string; + fineTuneWeight: string; + }; + similarityWeight: { + baseWeight: string; + fineTuneWeight: string; + }; + dateWeight: { + baseWeight: string; + fineTuneWeight: string; + }; + orderRRF: string; +} diff --git a/JS/edgechains/lib/tsconfig.json b/JS/edgechains/lib/tsconfig.json new file mode 100644 index 000000000..f8cb68f8b --- /dev/null +++ b/JS/edgechains/lib/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "types": ["dotenv/config", "node"], + "target": "ES2022", + "module": "NodeNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "noImplicitAny": false, + "moduleResolution": "NodeNext", + "declaration": true + }, + "exclude": ["node_modules", "dist", "./**/*.test.ts"] +} diff --git a/JS/jsonnet/.gitignore b/JS/jsonnet/.gitignore new file mode 100755 index 000000000..58f885656 --- /dev/null +++ b/JS/jsonnet/.gitignore @@ -0,0 +1,6 @@ +/target +node_modules/ +Cargo.lock +package-lock.json +yarn.lock +dist/ \ No newline at end of file diff --git a/JS/jsonnet/Cargo.lock b/JS/jsonnet/Cargo.lock new file mode 100755 index 000000000..42ffc6ad9 --- /dev/null +++ b/JS/jsonnet/Cargo.lock @@ -0,0 +1,843 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "arakoo" +version = "0.1.0" +dependencies = [ + "jrsonnet-evaluator", + "jrsonnet-gcmodule", + "jrsonnet-parser", + "jrsonnet-stdlib", + "serde", + "serde_json", + "wasm-bindgen", + "wasm-bindgen-test", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "jrsonnet-evaluator" +version = "0.5.0-pre95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0951f206ee982ef3c61ed49c2779b3649858d2b7c6748943e4c7f36f6df55f9c" +dependencies = [ + "annotate-snippets", + "derivative", + "hashbrown 0.13.2", + "jrsonnet-gcmodule", + "jrsonnet-interner", + "jrsonnet-macros", + "jrsonnet-parser", + "jrsonnet-types", + "pathdiff", + "rustc-hash", + "serde", + "static_assertions", + "strsim", + "thiserror", +] + +[[package]] +name = "jrsonnet-gcmodule" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11fb98940a7f8b419619e98ccbf2e094671a5fdd0e277f05acd373071186d57" +dependencies = [ + "jrsonnet-gcmodule-derive", + "parking_lot", +] + +[[package]] +name = "jrsonnet-gcmodule-derive" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bee774b7ba86fc86ee84482cd6732aa860ae3559f9827c65efd75c51e66ac76" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jrsonnet-interner" +version = "0.5.0-pre95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2332eb6c0bbd27e81ed8ad488a70e448437dd17b54e90cf3b8974b82c3c379" +dependencies = [ + "hashbrown 0.13.2", + "jrsonnet-gcmodule", + "rustc-hash", + "structdump", +] + +[[package]] +name = "jrsonnet-macros" +version = "0.5.0-pre95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b4d289fa4d4992f0a791de2e9fbdae7100005d28fced76fc49a2d70b5737f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jrsonnet-parser" +version = "0.5.0-pre95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d403645f250bdc8f31a2a142ebd4608f9595bdad1a89db871ccdfe81c427957" +dependencies = [ + "jrsonnet-gcmodule", + "jrsonnet-interner", + "peg", + "static_assertions", + "structdump", +] + +[[package]] +name = "jrsonnet-stdlib" +version = "0.5.0-pre95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d7f31ed348ea5f7dfb379ddc65fe1773d82cab7698a8dbc4d2d72013795eba" +dependencies = [ + "base64", + "jrsonnet-evaluator", + "jrsonnet-gcmodule", + "jrsonnet-macros", + "jrsonnet-parser", + "md5", + "serde", + "serde_json", + "serde_yaml_with_quirks", + "sha1", + "sha2", + "sha3", + "structdump", +] + +[[package]] +name = "jrsonnet-types" +version = "0.5.0-pre95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68522259250172a8aa3714e2f99466641cc450b5c758fbdaa05265f86c1e0d97" +dependencies = [ + "jrsonnet-gcmodule", + "peg", +] + +[[package]] +name = "js-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "peg" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "400bcab7d219c38abf8bd7cc2054eb9bbbd4312d66f6a5557d572a203f646f61" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e61cce859b76d19090f62da50a9fe92bab7c2a5f09e183763559a2ac392c90" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36bae92c60fa2398ce4678b98b2c4b5a7c61099961ca1fa305aec04a9ad28922" + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "serde_json" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml_with_quirks" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c5983eba86eae2d0058c35fb1065ccffb23af7f8965871069269088098321a" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "structdump" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0570327507bf281d8a6e6b0d4c082b12cb6bcee27efce755aa5efacd44076c1" +dependencies = [ + "proc-macro2", + "quote", + "structdump-derive", +] + +[[package]] +name = "structdump-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29cc0b59cfa11f1bceda09a9a7e37e6a6c3138575fd24ade8aa9af6d09aedf28" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139bd73305d50e1c1c4333210c0db43d989395b64a237bd35c10ef3832a7f70c" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70072aebfe5da66d2716002c729a14e4aec4da0e23cc2ea66323dac541c93928" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "web-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] diff --git a/JS/jsonnet/Cargo.toml b/JS/jsonnet/Cargo.toml new file mode 100644 index 000000000..8afe8984c --- /dev/null +++ b/JS/jsonnet/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "arakoo-jsonnet" +edition.workspace = true +version.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +wasm-bindgen = "0.2.84" +jrsonnet-evaluator = { version = "0.5.0-pre95" } +jrsonnet-parser = { version = "0.5.0-pre95" } +jrsonnet-stdlib = { version = "0.5.0-pre95" } +jrsonnet-gcmodule = { version = "0.3.6" } +serde = "1.0.195" +serde_json = "1.0.111" +wasm-bindgen-file-reader = "1" +regex = "1.10.3" +js-sys = "0.3.69" +console_error_panic_hook = "0.1.7" +urlencoding = "2.1.3" + +[dev-dependencies] +wasm-bindgen-test = "0.3.34" + +[features] +nodejs = [] +default = ["nodejs"] + diff --git a/JS/jsonnet/README.md b/JS/jsonnet/README.md new file mode 100644 index 000000000..7b1661c86 --- /dev/null +++ b/JS/jsonnet/README.md @@ -0,0 +1,86 @@ +# Jsonnet in Wasm + +This project aim to running Jsonnet in Wasm. The code is written in Rust and compiled to Wasm using the `wasm32-unknown-unknown` target. The project is based on the [Jrsonnet](https://github.com/CertainLach/jrsonnet) project, which is a Rust implementation of Jsonnet. The project is still in early stage and have some limited support for Jsonnet. + +## Available features + +- [x] Jsonnet Snippet evaluation +- [x] External variable support +- [x] External function support +- [x] Jsonnet file evaluation + +## Usage + +```bash +npm install arakoo-jsonnet +``` + +### You can evaluate snippet as follows - + +```javascript +import Jsonnet from "arakoo-jsonnet"; + +const jsonnet = new Jsonnet(); +let code = ` + local username = std.extVar('name'); + local Person(name='Alice') = { + name: name, + welcome: 'Hello ' + name + '!', + }; + { + person1: Person(username), + person2: Person('Bob'), + }`; +const result = jsonnet.extString("name", "John").evaluateSnippet(code); +console.log(result); +``` + +### Output + +```json +{ + "person1": { + "name": "John", + "welcome": "Hello John!" + }, + "person2": { + "name": "Bob", + "welcome": "Hello Bob!" + } +} +``` + +### You can evaluate functions directly from jsonnet as follows - + +```javascript +import Jsonnet from "arakoo-jsonnet"; + +let jsonnet = new Jsonnet(); +function addSomeNumber(a, b, c) { + return a + b + c; +} +let result = jsonnet.javascriptCallback("addSomeNumber", addSomeNumber).evaluateSnippet(`{ + result : arakoo.native("addSomeNumber")(3,4,5) + }`); +``` + +First you need to register the javascript function you wish to call from jsonnet by calling javascriptCallback method of jsonnet instance . Then you can call the registered function by using arakoo.native method. + +### Output + +```json +{ + "result": "12" +} +``` + +> Note - +> +> 1. You can only return string from the function which you are calling from jsonnet . If you need to return any other type than you can JSON.stringify it and then std.parseJson in jsonnet. +> 2. You need to add `--experimental-wasm-modules` flag while running the js file where you imported / required this jsonnet package + +## Build + +```bash +./build.sh +``` diff --git a/JS/jsonnet/build.sh b/JS/jsonnet/build.sh new file mode 100755 index 000000000..674e61cb4 --- /dev/null +++ b/JS/jsonnet/build.sh @@ -0,0 +1,101 @@ +#!/bin/bash +# Call this script as `./build.sh ` eg. `./build.sh false` + +set -e + +# Remove older build +if [ "$1" != "false" ]; then + echo "Removing older build..." + # check if pkg folder exists + if [ -d "jsonnet" ]; then + echo "Removing pkg folder..." + rm -rf jsonnet + fi +fi +OUT_FOLDER="jsonnet" +OUT_JSON="${OUT_FOLDER}/package.json" +OUT_TARGET="nodejs" +OUT_NPM_NAME="arakoo" +WASM_BUILD_PROFILE="release" + +echo "Using build profile: \"${WASM_BUILD_PROFILE}\"" + +# Check if wasm-pack is installed +if ! command -v wasm-pack &>/dev/null; then + echo "wasm-pack could not be found, installing now..." + curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh +fi + +echo "Building query-engine-wasm using $WASM_BUILD_PROFILE profile" +CARGO_PROFILE_RELEASE_OPT_LEVEL="z" wasm-pack build "--$WASM_BUILD_PROFILE" --target $OUT_TARGET --out-name jsonnet_wasm + +mv "pkg/" $OUT_FOLDER + +sleep 1 + +enable_cf_in_bindings() { + # Enable Cloudflare Workers in the generated JS bindings. + # The generated bindings are compatible with: + # - Node.js + # - Cloudflare Workers / Miniflare + + local FILE="$1" # e.g., `query_engine.js` + local BG_FILE="jsonnet_wasm.js" + local OUTPUT_FILE="${OUT_FOLDER}/jsonnet_wasm_binding.js" + + cat <"$OUTPUT_FILE" +import * as imports from "./${BG_FILE}"; + +// switch between both syntax for Node.js and for workers (Cloudflare Workers) +import * as wkmod from "./${BG_FILE%.js}.wasm"; +import * as nodemod from "./${BG_FILE%.js}.wasm"; +if ((typeof process !== 'undefined') && (process.release.name === 'node')) { + imports.__wbg_set_wasm(nodemod); +} else { + const instance = new WebAssembly.Instance(wkmod.default, { "./${BG_FILE}": imports }); + imports.__wbg_set_wasm(instance.exports); +} + +export * from "./${BG_FILE}"; +EOF + + cat <"$OUT_FOLDER/index.mjs" +const {Jsonnet} = await import("./jsonnet.js") + +export default Jsonnet; +EOF + + cat <"$OUT_FOLDER/index.d.ts" +declare class Jsonnet { + constructor(); + evaluateSnippet(snippet: string): string; + destroy(): void; + extString(key: string, value: string): this; + evaluateFile(filename: string): string; + javascriptCallback(name: string, func: Function): this; +} + +export default Jsonnet; +EOF + +} + +update_package_json() { + local FILE="$1" # e.g., `index.js` + local OUTPUT_FILE="${OUT_FOLDER}/package.json" + jq '.module = "'${FILE}'"' "${OUT_JSON}" >temp.json + jq '.types = "'${FILE%.js}.d.ts'"' temp.json >temp2.json + jq '.files = ["'${FILE}'", "'${FILE%.js}.d.ts'"]' temp2.json >"${OUTPUT_FILE}" + rm temp.json temp2.json +} + +move_jsonnet_to_src() { + mv jsonnet/*.js jsonnet/*.wasm jsonnet/*.d.ts src/ + rm -rf src/snippets + mv jsonnet/snippets/ src/ + rm -rf jsonnet +} + +# enable_cf_in_bindings "jsonnet_wasm_bg.js" +update_package_json "index.js" +move_jsonnet_to_src diff --git a/JS/jsonnet/package.json b/JS/jsonnet/package.json new file mode 100644 index 000000000..cfaae1656 --- /dev/null +++ b/JS/jsonnet/package.json @@ -0,0 +1,14 @@ +{ + "name": "@arakoodev/jsonnet", + "version": "0.3.1", + "exports": { + "import": { + "types": "./src/index.d.mts", + "default": "./src/index.mjs" + }, + "require": { + "types": "./src/index.d.ts", + "default": "./src/index.js" + } + } +} diff --git a/JS/jsonnet/read-file.js b/JS/jsonnet/read-file.js new file mode 100644 index 000000000..9245bad9e --- /dev/null +++ b/JS/jsonnet/read-file.js @@ -0,0 +1,8 @@ +// import fs from "fs"; +const fs = require("fs"); + +function read_file(path) { + return fs.readFileSync(path, { encoding: "utf8" }); +} + +module.exports = { read_file }; diff --git a/JS/jsonnet/src/context.rs b/JS/jsonnet/src/context.rs new file mode 100644 index 000000000..5e0a8dd04 --- /dev/null +++ b/JS/jsonnet/src/context.rs @@ -0,0 +1,232 @@ +use jrsonnet_stdlib::{builtin_type, Settings}; +use std::{ + cell::{Ref, RefCell, RefMut}, + collections::HashMap, + rc::Rc, +}; + +use jrsonnet_evaluator::function::builtin; +use jrsonnet_evaluator::{ + error::ErrorKind::{self, ImportSyntaxError}, + function::{ + builtin::{NativeCallback, NativeCallbackHandler}, + FuncVal, TlaArg, + }, + stdlib, tb, + trace::PathResolver, + typed::{ComplexValType, Typed, ValType}, + ContextBuilder, ContextInitializer, Error, ObjValue, ObjValueBuilder, ObjectLike, Result, + State, Thunk, Val, +}; +use jrsonnet_gcmodule::Trace; +use jrsonnet_parser::{IStr, Source}; +use jrsonnet_stdlib::{StdTracePrinter, TracePrinter}; + +// Implement NativeCallbackHandler for your native function + +#[builtin] +fn join(a: String, b: String) -> String { + format!("{}{}", a, b) +} + +#[builtin] +fn includes(a: String, b: String) -> bool { + if a.contains(&b) { + return true; + } else { + return false; + } +} + +#[builtin] +fn regex_match(a: String, b: String) -> Vec { + // log(&a); + // log(&b); + let re = regex::Regex::new(&b).unwrap(); + let mut matches = Vec::new(); + for cap in re.captures_iter(&a) { + if cap.len() == 0 { + continue; + } + if cap.len() == 1 { + matches.push(cap[0].to_string()); + continue; + } + matches.push(cap[1].to_string()); + } + if matches.len() == 0 { + matches.push("".to_string()); + } + matches +} + +// #[derive(Debug)] +// struct DateTimeFormatOptions { +// hour: String, +// minute: String, +// hour12: bool, +// } + +// #[builtin] +// fn format_date( +// hour: Option, +// minute: Option, +// hour12: bool, +// timeZone: Option, +// ) -> String { +// super::log(&format!("Debug : {:?}", hour)); +// super::log(&format!("Debug : {:?}", minute)); +// super::log(&format!("Debug : {:?}", hour12)); +// println!("Debug : {:?}", timeZone); +// String::from("Formatted date") +// } + +/// Returns current date and time in utc +// #[builtin] +// fn date( +// dateTime: Option, +// timeStamp: Option, +// year: Option, +// monthIndex: Option, +// day: Option, +// hours: Option, +// minutes: Option, +// seconds: Option, +// milliseconds: Option, +// ) -> String { +// String::from("Good datetime") +// } + +#[builtin] +fn url_encode(a: String) -> String { + urlencoding::encode(&a).into_owned() +} + +fn arakoolib_uncached(settings: Rc>) -> ObjValue { + let mut builder = ObjValueBuilder::new(); + builder.method( + "native", + builtin_native { + settings: settings.clone(), + }, + ); + builder.method("join", join::INST); + builder.method("regexMatch", regex_match::INST); + builder.method("includes", includes::INST); + // builder.method("formatDate", format_date::INST); + builder.method("urlEncode", url_encode::INST); + builder.build() +} + +#[derive(Trace, Clone)] +pub struct ArakooContextInitializer { + /// When we don't need to support legacy-this-file, we can reuse same context for all files + context: jrsonnet_evaluator::Context, + /// For `populate` + stdlib_thunk: Thunk, + arakoolib_thunk: Thunk, + settings: Rc>, +} + +fn extvar_source(name: &str, code: impl Into) -> Source { + let source_name = format!(""); + Source::new_virtual(source_name.into(), code.into()) +} + +#[builtin(fields( + settings: Rc>, +))] +pub fn builtin_native(this: &builtin_native, x: IStr) -> Val { + this.settings + .borrow() + .ext_natives + .get(&x) + .cloned() + .map_or(Val::Null, Val::Func) +} + +impl ArakooContextInitializer { + pub fn new(_s: State, resolver: PathResolver) -> Self { + let settings = jrsonnet_stdlib::Settings { + ext_vars: Default::default(), + ext_natives: Default::default(), + trace_printer: Box::new(StdTracePrinter::new(resolver.clone())), + path_resolver: resolver, + }; + let settings = Rc::new(RefCell::new(settings)); + let stdlib_obj = jrsonnet_stdlib::stdlib_uncached(settings.clone()); + + let stdlib_thunk = Thunk::evaluated(Val::Obj(stdlib_obj)); + let arakoolib_obj = arakoolib_uncached(settings.clone()); + let arakoolib_thunk = Thunk::evaluated(Val::Obj(arakoolib_obj)); + Self { + context: { + let mut context = ContextBuilder::with_capacity(_s, 1); + context.bind("std", stdlib_thunk.clone()); + context.bind("arakoo", arakoolib_thunk.clone()); + context.build() + }, + stdlib_thunk, + arakoolib_thunk, + settings, + } + } + pub fn settings(&self) -> Ref { + self.settings.borrow() + } + pub fn settings_mut(&self) -> RefMut { + self.settings.borrow_mut() + } + pub fn add_ext_var(&self, name: IStr, value: Val) { + self.settings_mut() + .ext_vars + .insert(name, TlaArg::Val(value)); + } + pub fn add_ext_str(&self, name: IStr, value: IStr) { + self.settings_mut() + .ext_vars + .insert(name, TlaArg::String(value)); + } + pub fn add_ext_code(&self, name: &str, code: impl Into) -> Result<()> { + let code = code.into(); + let source = extvar_source(name, code.clone()); + let parsed = jrsonnet_parser::parse( + &code, + &jrsonnet_parser::ParserSettings { + source: source.clone(), + }, + ) + .map_err(|e| ImportSyntaxError { + path: source, + error: Box::new(e), + })?; + // self.data_mut().volatile_files.insert(source_name, code); + self.settings_mut() + .ext_vars + .insert(name.into(), TlaArg::Code(parsed)); + Ok(()) + } + pub fn add_native(&self, name: impl Into, cb: impl Into) { + self.settings_mut() + .ext_natives + .insert(name.into(), cb.into()); + } +} + +impl jrsonnet_evaluator::ContextInitializer for ArakooContextInitializer { + fn reserve_vars(&self) -> usize { + 1 + } + + fn initialize(&self, _s: State, _source: Source) -> jrsonnet_evaluator::Context { + self.context.clone() + } + + fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) { + builder.bind("std", self.stdlib_thunk.clone()); + builder.bind("arakoo", self.arakoolib_thunk.clone()); + } + fn as_any(&self) -> &dyn std::any::Any { + self + } +} diff --git a/JS/jsonnet/src/index.d.mts b/JS/jsonnet/src/index.d.mts new file mode 100644 index 000000000..6d4fe8d6a --- /dev/null +++ b/JS/jsonnet/src/index.d.mts @@ -0,0 +1,10 @@ +declare class Jsonnet { + constructor(); + evaluateSnippet(snippet: string): string; + destroy(): void; + extString(key: string, value: string): this; + evaluateFile(filename: string): string; + javascriptCallback(name: string, func: Function): this; +} + +export default Jsonnet; diff --git a/JS/jsonnet/src/index.d.ts b/JS/jsonnet/src/index.d.ts new file mode 100644 index 000000000..6d4fe8d6a --- /dev/null +++ b/JS/jsonnet/src/index.d.ts @@ -0,0 +1,10 @@ +declare class Jsonnet { + constructor(); + evaluateSnippet(snippet: string): string; + destroy(): void; + extString(key: string, value: string): this; + evaluateFile(filename: string): string; + javascriptCallback(name: string, func: Function): this; +} + +export default Jsonnet; diff --git a/JS/jsonnet/src/index.js b/JS/jsonnet/src/index.js new file mode 100644 index 000000000..ddfc1489e --- /dev/null +++ b/JS/jsonnet/src/index.js @@ -0,0 +1,2 @@ +const Jsonnet = require("./jsonnet.js"); +module.exports = Jsonnet; diff --git a/JS/jsonnet/src/index.mjs b/JS/jsonnet/src/index.mjs new file mode 100644 index 000000000..d6d0a7061 --- /dev/null +++ b/JS/jsonnet/src/index.mjs @@ -0,0 +1,3 @@ +import Jsonnet from "./jsonnet.js"; + +export default Jsonnet; diff --git a/JS/jsonnet/src/jsonnet.js b/JS/jsonnet/src/jsonnet.js new file mode 100644 index 000000000..ebe36ad5d --- /dev/null +++ b/JS/jsonnet/src/jsonnet.js @@ -0,0 +1,130 @@ +// const isArakoo = process.env.arakoo; + +let Jsonnet; + +if (!process.env.arakoo) { + let module = require("./jsonnet_wasm.js"); + let { + jsonnet_evaluate_snippet, + jsonnet_destroy, + jsonnet_make, + jsonnet_ext_string, + jsonnet_evaluate_file, + get_func, + set_func, + register_native_callback, + } = module; + Jsonnet = class Jsonnet { + constructor() { + this.vm = jsonnet_make(); + } + + evaluateSnippet(snippet) { + return jsonnet_evaluate_snippet(this.vm, "snippet", snippet); + } + + extString(key, value) { + jsonnet_ext_string(this.vm, key, value); + return this; + } + + evaluateFile(filename) { + return jsonnet_evaluate_file(this.vm, filename); + } + + javascriptCallback(name, func) { + let numOfArgs = func.length; + if (numOfArgs > 0) { + set_func(name, (args) => { + let result = eval(func)(...JSON.parse(args)); + return result.toString(); + }); + } else { + set_func(name, () => { + let result = eval(func)(); + return result; + }); + } + register_native_callback(this.vm, name, numOfArgs); + return this; + } + + destroy() { + jsonnet_destroy(this.vm); + } + }; +} else { + Jsonnet = class Jsonnet { + constructor() {} + + #getVm() { + if (!this.vm) { + this.vm = __jsonnet_make(); + } + return this.vm; + } + + #setFunc(name, func) { + __jsonnet_func_map[name] = func; + } + + evaluateSnippet(snippet) { + let vm = this.#getVm(); + return __jsonnet_evaluate_snippet(vm, snippet); + } + + extString(key, value) { + let vm = this.#getVm(); + __jsonnet_ext_string(vm, key, value); + return this; + } + + evaluateFile(filename) { + let vm = this.#getVm(); + return __jsonnet_evaluate_file(vm, filename); + } + + javascriptCallback(name, func) { + let numOfArgs = func.length; + console.debug("Constructor name is: ", func.constructor.name); + if (func.constructor && func.constructor.name === "AsyncFunction") { + console.debug("In if part"); + if (numOfArgs > 0) { + this.#setFunc(name, async (args) => { + console.debug("Args recieved in async function: ", args); + let result = await eval(func)(...JSON.parse(args)); + return result.toString(); + }); + } else { + this.#setFunc(name, async () => { + let result = await eval(func)(); + return result; + }); + } + } else { + console.debug("In else part"); + if (numOfArgs > 0) { + this.#setFunc(name, (args) => { + console.debug("Args recieved: ", args); + let result = eval(func)(...JSON.parse(args)); + return result.toString(); + }); + } else { + this.#setFunc(name, () => { + let result = eval(func)(); + return result; + }); + } + } + __jsonnet_register_func(this.vm, name, numOfArgs); + return this; + } + + destroy() { + let vm = this.#getVm(); + __jsonnet_destroy(vm); + } + }; +} + +module.exports = Jsonnet; diff --git a/JS/jsonnet/src/jsonnet_wasm.d.ts b/JS/jsonnet/src/jsonnet_wasm.d.ts new file mode 100644 index 000000000..d7ba546fc --- /dev/null +++ b/JS/jsonnet/src/jsonnet_wasm.d.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * @returns {number} + */ +export function jsonnet_make(): number; +/** + * @param {number} vm + */ +export function jsonnet_destroy(vm: number): void; +/** + * @param {number} vm + * @param {string} filename + * @param {string} snippet + * @returns {string} + */ +export function jsonnet_evaluate_snippet(vm: number, filename: string, snippet: string): string; +/** + * @param {number} vm + * @param {string} filename + * @returns {string} + */ +export function jsonnet_evaluate_file(vm: number, filename: string): string; +/** + * @param {number} vm + * @param {string} key + * @param {string} value + */ +export function jsonnet_ext_string(vm: number, key: string, value: string): void; +/** + * @param {string} name + * @returns {Function | undefined} + */ +export function get_func(name: string): Function | undefined; +/** + * @param {string} name + * @param {Function} func + */ +export function set_func(name: string, func: Function): void; +/** + * @param {number} vm + * @param {string} name + * @param {number} args_num + */ +export function register_native_callback(vm: number, name: string, args_num: number): void; diff --git a/JS/jsonnet/src/jsonnet_wasm.js b/JS/jsonnet/src/jsonnet_wasm.js new file mode 100644 index 000000000..3e7153453 --- /dev/null +++ b/JS/jsonnet/src/jsonnet_wasm.js @@ -0,0 +1,402 @@ +let imports = {}; +imports["__wbindgen_placeholder__"] = module.exports; +let wasm; +const { read_file } = require(String.raw`./snippets/arakoo-jsonnet-17c737407ebd2d3c/read-file.js`); +const { TextEncoder, TextDecoder } = require(`util`); + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { + return heap[idx]; +} + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +let cachedTextEncoder = new TextEncoder("utf-8"); + +const encodeString = + typeof cachedTextEncoder.encodeInto === "function" + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); + } + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length, + }; + }; + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0() + .subarray(ptr, ptr + buf.length) + .set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7f) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == "number" || type == "boolean" || val == null) { + return `${val}`; + } + if (type == "string") { + return `"${val}"`; + } + if (type == "symbol") { + const description = val.description; + if (description == null) { + return "Symbol"; + } else { + return `Symbol(${description})`; + } + } + if (type == "function") { + const name = val.name; + if (typeof name == "string" && name.length > 0) { + return `Function(${name})`; + } else { + return "Function"; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = "["; + if (length > 0) { + debug += debugString(val[0]); + } + for (let i = 1; i < length; i++) { + debug += ", " + debugString(val[i]); + } + debug += "]"; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == "Object") { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return "Object(" + JSON.stringify(val) + ")"; + } catch (_) { + return "Object"; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** + * @returns {number} + */ +module.exports.jsonnet_make = function () { + const ret = wasm.jsonnet_make(); + return ret >>> 0; +}; + +/** + * @param {number} vm + */ +module.exports.jsonnet_destroy = function (vm) { + wasm.jsonnet_destroy(vm); +}; + +/** + * @param {number} vm + * @param {string} filename + * @param {string} snippet + * @returns {string} + */ +module.exports.jsonnet_evaluate_snippet = function (vm, filename, snippet) { + let deferred3_0; + let deferred3_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(filename, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(snippet, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.jsonnet_evaluate_snippet(retptr, vm, ptr0, len0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred3_0 = r0; + deferred3_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +}; + +/** + * @param {number} vm + * @param {string} filename + * @returns {string} + */ +module.exports.jsonnet_evaluate_file = function (vm, filename) { + let deferred2_0; + let deferred2_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(filename, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.jsonnet_evaluate_file(retptr, vm, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred2_0 = r0; + deferred2_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +}; + +/** + * @param {number} vm + * @param {string} key + * @param {string} value + */ +module.exports.jsonnet_ext_string = function (vm, key, value) { + const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(value, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.jsonnet_ext_string(vm, ptr0, len0, ptr1, len1); +}; + +/** + * @param {string} name + * @returns {Function | undefined} + */ +module.exports.get_func = function (name) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.get_func(ptr0, len0); + return takeObject(ret); +}; + +/** + * @param {string} name + * @param {Function} func + */ +module.exports.set_func = function (name, func) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.set_func(ptr0, len0, addHeapObject(func)); +}; + +/** + * @param {number} vm + * @param {string} name + * @param {number} args_num + */ +module.exports.register_native_callback = function (vm, name, args_num) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.register_native_callback(vm, ptr0, len0, args_num); +}; + +module.exports.__wbindgen_string_get = function (arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "string" ? obj : undefined; + var ptr1 = isLikeNone(ret) + ? 0 + : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +}; + +module.exports.__wbindgen_object_drop_ref = function (arg0) { + takeObject(arg0); +}; + +module.exports.__wbindgen_string_new = function (arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); +}; + +module.exports.__wbg_readfile_5b48d0f7e3518df2 = function () { + return handleError(function (arg0, arg1, arg2) { + const ret = read_file(getStringFromWasm0(arg1, arg2)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }, arguments); +}; + +module.exports.__wbindgen_object_clone_ref = function (arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); +}; + +module.exports.__wbg_call_27c0f87801dedf93 = function () { + return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbg_call_b3ca7c6051f9bec1 = function () { + return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbg_new_abda76e883ba8a5f = function () { + const ret = new Error(); + return addHeapObject(ret); +}; + +module.exports.__wbg_stack_658279fe44541cf6 = function (arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +}; + +module.exports.__wbg_error_f851667af71bcfc6 = function (arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } +}; + +module.exports.__wbindgen_debug_string = function (arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +}; + +module.exports.__wbindgen_throw = function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + +const path = require("path").join(__dirname, "jsonnet_wasm_bg.wasm"); +const bytes = require("fs").readFileSync(path); + +const wasmModule = new WebAssembly.Module(bytes); +const wasmInstance = new WebAssembly.Instance(wasmModule, imports); +wasm = wasmInstance.exports; +module.exports.__wasm = wasm; diff --git a/JS/jsonnet/src/jsonnet_wasm_bg.wasm b/JS/jsonnet/src/jsonnet_wasm_bg.wasm new file mode 100644 index 000000000..da9f86534 Binary files /dev/null and b/JS/jsonnet/src/jsonnet_wasm_bg.wasm differ diff --git a/JS/jsonnet/src/jsonnet_wasm_bg.wasm.d.ts b/JS/jsonnet/src/jsonnet_wasm_bg.wasm.d.ts new file mode 100644 index 000000000..addf76d72 --- /dev/null +++ b/JS/jsonnet/src/jsonnet_wasm_bg.wasm.d.ts @@ -0,0 +1,23 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function jsonnet_make(): number; +export function jsonnet_destroy(a: number): void; +export function jsonnet_evaluate_snippet( + a: number, + b: number, + c: number, + d: number, + e: number, + f: number +): void; +export function jsonnet_evaluate_file(a: number, b: number, c: number, d: number): void; +export function jsonnet_ext_string(a: number, b: number, c: number, d: number, e: number): void; +export function get_func(a: number, b: number): number; +export function set_func(a: number, b: number, c: number): void; +export function register_native_callback(a: number, b: number, c: number, d: number): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/JS/jsonnet/src/lib.rs b/JS/jsonnet/src/lib.rs new file mode 100755 index 000000000..b0fa2b2c6 --- /dev/null +++ b/JS/jsonnet/src/lib.rs @@ -0,0 +1,263 @@ +use std::{cell::RefCell, collections::HashMap, path::Path}; + +use console_error_panic_hook; +use jrsonnet_evaluator::{ + apply_tla, + error::ErrorKind, + function::{ + builtin::{self, NativeCallback, NativeCallbackHandler}, + TlaArg, + }, + gc::GcHashMap, + manifest::{JsonFormat, ManifestFormat}, + tb, + trace::{CompactFormat, PathResolver, TraceFormat}, + FileImportResolver, ObjValueBuilder, State, Thunk, Val, +}; +use jrsonnet_gcmodule::Trace; +use jrsonnet_parser::IStr; +use std::alloc; +use wasm_bindgen::prelude::*; + +pub mod context; + +#[wasm_bindgen(module = "/read-file.js")] +extern "C" { + #[wasm_bindgen(catch)] + fn read_file(path: &str) -> Result; +} + +// console log +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = console)] + fn log(s: &str); +} + +pub struct VM { + pub state: State, + manifest_format: Box, + trace_format: Box, + tla_args: GcHashMap, +} + +pub struct NativeContext { + // pub vm: &'a VM, + pub vm: *mut VM, +} + +pub struct MapStruct { + pub func_map: HashMap, +} + +static mut map_struct: Option = None; + +#[wasm_bindgen] +pub fn jsonnet_make() -> *mut VM { + unsafe { + map_struct = Some(MapStruct { + func_map: HashMap::new(), + }); + } + let state = State::default(); + #[cfg(feature = "nodejs")] + console_error_panic_hook::set_once(); + state.settings_mut().import_resolver = tb!(FileImportResolver::default()); + state.set_context_initializer(context::ArakooContextInitializer::new( + state.clone(), + PathResolver::new_cwd_fallback(), + )); + // add_namespace(&state); + Box::into_raw(Box::new(VM { + state, + manifest_format: Box::new(JsonFormat::default()), + trace_format: Box::new(CompactFormat::default()), + tla_args: GcHashMap::default(), + })) +} + +#[wasm_bindgen] +pub fn jsonnet_destroy(vm: *mut VM) { + unsafe { + let dloc_vm = Box::from_raw(vm); + drop(dloc_vm); + } +} + +#[wasm_bindgen] +pub fn jsonnet_evaluate_snippet(vm: *mut VM, filename: &str, snippet: &str) -> String { + let vm = unsafe { &mut *vm }; + match vm + .state + .evaluate_snippet(filename, snippet) + .and_then(|val| apply_tla(vm.state.clone(), &vm.tla_args, val)) + .and_then(|val| val.manifest(&vm.manifest_format)) + { + Ok(v) => v, + Err(e) => { + let mut out = String::new(); + vm.trace_format.write_trace(&mut out, &e).unwrap(); + out + } + } +} + +#[wasm_bindgen] +pub fn jsonnet_evaluate_file(vm: *mut VM, filename: &str) -> String { + let vm = unsafe { &mut *vm }; + match read_file(filename) { + Ok(content) => match vm + .state + .evaluate_snippet(filename, &content) + .and_then(|val| apply_tla(vm.state.clone(), &vm.tla_args, val)) + .and_then(|val| val.manifest(&vm.manifest_format)) + { + Ok(v) => v, + Err(e) => { + let mut out = String::new(); + vm.trace_format.write_trace(&mut out, &e).unwrap(); + out + } + }, + Err(e) => { + eprintln!("Error reading file: {}", e.as_string().unwrap()); + let out = String::from(e.as_string().unwrap()); + out + } + } +} + +#[wasm_bindgen] +pub fn jsonnet_ext_string(vm: *mut VM, key: &str, value: &str) { + let vm = unsafe { &mut *vm }; + // let context_initializer_ref = vm.state.context_initializer(); + + // Dereference the Ref to access the trait object + let context_initializer = vm.state.context_initializer(); + + context_initializer + .as_any() + .downcast_ref::() + .expect("only arakoo context initializer supported") + .add_ext_var(key.into(), Val::Str(value.into())); +} + +#[wasm_bindgen] +pub fn get_func(name: &str) -> Option { + unsafe { + let func = map_struct.as_mut().unwrap().func_map.get(name); + match func { + Some(f) => Some(f.clone()), + None => None, + } + } +} + +#[wasm_bindgen] +pub fn set_func(name: String, func: js_sys::Function) { + unsafe { + map_struct.as_mut().unwrap().func_map.insert(name, func); + } +} + +#[derive(jrsonnet_gcmodule::Trace)] +struct NativeJSCallback(String); + +impl NativeCallbackHandler for NativeJSCallback { + fn call(&self, args: &[Val]) -> jrsonnet_evaluator::Result { + let this = JsValue::null(); + let func = get_func(&self.0).expect("Function not found"); + let result; + if args.len() > 0 { + result = func.call1( + &this, + &JsValue::from_str( + &serde_json::to_string(args).expect("Error converting args to JSON"), + ), + ); + } else { + result = func.call0(&this); + } + println!("Result of calling JS function: {:?}", result); + if let Ok(r) = result { + Ok(Val::Str(r.as_string().unwrap().into())) + } else { + Err(ErrorKind::RuntimeError("Error calling JS function".into()).into()) + } + } +} + +// Function to register the native callback +#[wasm_bindgen] +pub extern "C" fn register_native_callback(vm: *mut VM, name: String, args_num: u32) { + let vm = unsafe { &*vm }; + let any_resolver = vm.state.context_initializer(); + let args_vec = vec![String::from("x"); args_num as usize]; + any_resolver + .as_any() + .downcast_ref::() + .expect("only arakoo context initializer supported") + .add_native( + name.clone(), + NativeCallback::new(args_vec, NativeJSCallback(name)), + ); +} + +#[cfg(test)] +mod test { + use super::*; + use regex::Regex; + #[test] + // #[wasm_bindgen] + pub fn test_ext_string() { + let vm = jsonnet_make(); + // let filename = CString::new("filename").unwrap(); + let filename = "filename"; + + let snippet = r#" + local username = std.extVar('name'); + local Person(name='Alice') = { + name: name, + welcome: 'Hello ' + name + '!', + }; + { + person1: Person(username), + person2: Person('Bob'), + }"#; + + // .unwrap(); + unsafe { + jsonnet_ext_string( + &mut *vm, // name.as_ptr() as *const c_char, + "name", // value.as_ptr() as *const c_char, + "afshan", + ); + } + + let result = unsafe { jsonnet_evaluate_snippet(&mut *vm, filename, snippet) }; + println!("{}", result); + // } + } + + #[test] + fn do_regex_test() { + let hay = r"Question: Which magazine was started first Arthur's Magazine or First for Women? + Thought 1: I need to search Arthur's Magazine and First for Women, and find which was + started first. + Action 1: Search[Arthur's Magazine] + Observation 1: Arthur's Magazine (1844-1846) was an American literary periodical published + in Philadelphia in the 19th century. + Thought 2: Arthur's Magazine was started in 1844. I need to search First for Women + next. + Action 2: Search[First for Women]"; + // get words in Search[] + let re = Regex::new(r"Observation 1: (.*)\.").unwrap(); + + let mut search = Vec::new(); + for cap in re.captures_iter(hay) { + search.push(cap[1].to_string()); + } + + println!("pattern found {:?}", search); + } +} diff --git a/JS/jsonnet/src/snippets/arakoo-jsonnet-17c737407ebd2d3c/read-file.js b/JS/jsonnet/src/snippets/arakoo-jsonnet-17c737407ebd2d3c/read-file.js new file mode 100644 index 000000000..9245bad9e --- /dev/null +++ b/JS/jsonnet/src/snippets/arakoo-jsonnet-17c737407ebd2d3c/read-file.js @@ -0,0 +1,8 @@ +// import fs from "fs"; +const fs = require("fs"); + +function read_file(path) { + return fs.readFileSync(path, { encoding: "utf8" }); +} + +module.exports = { read_file }; diff --git a/JS/jsonnet/test/package.json b/JS/jsonnet/test/package.json new file mode 100644 index 000000000..9cc96420a --- /dev/null +++ b/JS/jsonnet/test/package.json @@ -0,0 +1,26 @@ +{ + "name": "test", + "version": "1.0.0", + "description": "", + "main": "test.js", + "scripts": { + "test": "tsc && node --experimental-wasm-modules ./node_modules/mocha/bin/mocha dist/test.js" + }, + "type": "module", + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "synchronized-promise": "^0.3.1", + "util": "^0.12.5" + }, + "devDependencies": { + "@types/chai": "^4.3.14", + "@arakoodev/jsonnet": "file:../", + "@types/mocha": "^10.0.6", + "@types/node": "^20.12.7", + "chai": "^5.1.0", + "mocha": "^10.4.0", + "typescript": "^5.4.3" + } +} diff --git a/JS/jsonnet/test/test.jsonnet b/JS/jsonnet/test/test.jsonnet new file mode 100644 index 000000000..f23fd7e4b --- /dev/null +++ b/JS/jsonnet/test/test.jsonnet @@ -0,0 +1,25 @@ +{ + concat_array: [1, 2, 3] + [4], + concat_string: '123' + 4, + equality1: 1 == '1', + equality2: [{}, { x: 3 - 1 }] + == [{}, { x: 2 }], + ex1: 1 + 2 * 3 / (4 + 5), + ex2: self.ex1 | 3, + ex3: self.ex1 % 2, + ex4: (4 > 3) && (1 <= 3) || false, + obj: { a: 1, b: 2 } + { b: 3, c: 4 }, + obj_member: 'foo' in { foo: 1 }, + str1: 'The value of self.ex2 is ' + + self.ex2 + '.', + str2: 'The value of self.ex2 is %g.' + % self.ex2, + str3: 'ex1=%0.2f, ex2=%0.2f' + % [self.ex1, self.ex2], + str4: 'ex1=%(ex1)0.2f, ex2=%(ex2)0.2f' + % self, + str5: ||| + ex1=%(ex1)0.2f + ex2=%(ex2)0.2f + ||| % self, +} \ No newline at end of file diff --git a/JS/jsonnet/test/test.ts b/JS/jsonnet/test/test.ts new file mode 100644 index 000000000..98832652a --- /dev/null +++ b/JS/jsonnet/test/test.ts @@ -0,0 +1,236 @@ +import Jsonnet from "@arakoodev/jsonnet"; +// import Jsonnet from "../src/index.js" +// import Jsonnet from "../src/index.mjs" +import { expect } from "chai"; +import { describe, it } from "mocha"; + +let jsonnet = new Jsonnet(); + +describe("Testing evaluateSnippet function of jsonnet library", () => { + it("self reference", () => { + let result = JSON.parse( + jsonnet.evaluateSnippet(`{ + Martini: { + local drink = self, + ingredients: [ + { kind: "Farmer's Gin", qty: 1 }, + { + kind: 'Dry White Vermouth', + qty: drink.ingredients[0].qty, + }, + ], + garnish: 'Olive', + served: 'Straight Up', + }, + }`) + ); + let expected = { + Martini: { + garnish: "Olive", + ingredients: [ + { + kind: "Farmer's Gin", + qty: 1, + }, + { + kind: "Dry White Vermouth", + qty: 1, + }, + ], + served: "Straight Up", + }, + }; + expect(result).to.eql(expected); + }); + + it("math operations", () => { + let result = JSON.parse( + jsonnet.evaluateSnippet(`{ + a: 1 + 2, + b: 3 * 4, + c: 5 / 6, + d: 7 % 8, + e: 9 - 10, + }`) + ); + let expected = { + a: 3, + b: 12, + c: 0.8333333333333334, + d: 7, + e: -1, + }; + expect(result).to.eql(expected); + }); +}); + +describe("Testing evaluateFile function of jsonnet library", () => { + it("Read File and evaluate", () => { + // let result = jsonnet.extString("name", "Alice"); + let result = JSON.parse(jsonnet.evaluateFile("./test.jsonnet")); + let expected = { + concat_array: [1, 2, 3, 4], + concat_string: "1234", + equality1: false, + equality2: true, + ex1: 1.6666666666666665, + ex2: 3, + ex3: 1.6666666666666665, + ex4: true, + obj: { + a: 1, + b: 3, + c: 4, + }, + obj_member: true, + str1: "The value of self.ex2 is 3.", + str2: "The value of self.ex2 is 3.", + str3: "ex1=1.67, ex2=3.00", + str4: "ex1=1.67, ex2=3.00", + str5: "ex1=1.67\nex2=3.00\n", + }; + expect(result).to.eql(expected); + }); +}); + +describe("Testing extString function of jsonnet library", () => { + it("Test extString function", () => { + let result = JSON.parse( + jsonnet.extString("name", "Alice").evaluateSnippet(`local username = std.extVar('name'); + local Person(name='Alice') = { + name: name, + welcome: 'Hello ' + name + '!', + }; + { + person1: Person(username), + person2: Person('Bob'), + }`) + ); + let expected = { + person1: { + name: "Alice", + welcome: "Hello Alice!", + }, + person2: { + name: "Bob", + welcome: "Hello Bob!", + }, + }; + expect(result).to.eql(expected); + }); +}); + +describe("Testing regex function of jsonnet library", () => { + it("Test regex function", () => { + let result = JSON.parse(jsonnet.evaluateFile("./test_regex.jsonnet")); + let expected = { + person1: { + name: "Alice Arthur's Magazine", + welcome: "Hello Alice Arthur's Magazine!", + }, + person2: { + name: "Arthur's Magazine", + welcome: "Hello Arthur's Magazine!", + }, + }; + // console.log("result : ", result); + expect(result).to.eql(expected); + }); +}); + +describe("Testing join function of jsonnet library", () => { + it("Test join function", () => { + let result = JSON.parse( + jsonnet.evaluateSnippet(`local a = "open"; + local b = "source"; + { + "joined string":arakoo.join(a,b) + }`) + ); + let expected = { + "joined string": "opensource", + }; + expect(result).to.eql(expected); + }); +}); + +describe("Testing javascript native function of jsonnet library", () => { + it("Test javascript native function using arithematic operations : add", () => { + function add(a: number, b: number, c: number) { + return a + b + c; + } + let result = JSON.parse( + jsonnet.javascriptCallback("add", add).evaluateSnippet(`{ + "result": "Output "+arakoo.native("add")(1,2,3), + "name":"Alice" + }`) + ); + expect(result).to.eql({ + result: "Output 6", + name: "Alice", + }); + }); + it("Test javascript native function using arithematic operations : array sum", () => { + let numArr = [1, 2, 3, 4, 5]; + function calcSum(arr: number[]) { + let sum = 0; + for (let i = 0; i < arr.length; i++) { + sum += arr[i]; + } + return sum; + } + let result = JSON.parse( + jsonnet.javascriptCallback("arrsum", calcSum).evaluateSnippet(`{ + "result": "Output "+arakoo.native("arrsum")(${JSON.stringify(numArr)}), + "name":"Alice" + }`) + ); + expect(result).to.eql({ + result: "Output 15", + name: "Alice", + }); + }); + it("Test javascript native function using string operations : concat", () => { + function concat(a: string, b: string) { + return a + b; + } + let result = JSON.parse( + jsonnet.javascriptCallback("concat", concat).evaluateSnippet(`{ + "result": "Output "+arakoo.native("concat")("Hello ","World"), + "name":"Alice" + }`) + ); + expect(result).to.eql({ + result: "Output Hello World", + name: "Alice", + }); + }); +}); + +describe("Testing includes function of jsonnet library", () => { + it("Test includes function", () => { + let result = JSON.parse( + jsonnet.evaluateSnippet(`{ + "result":arakoo.includes("open source is awesome","source") + }`) + ); + let expected = { + result: true, + }; + expect(result).to.eql(expected); + }); +}); + +describe("Testing urlencoding function of jsonnet library", () => { + it("Test urlencoding function", () => { + let result = JSON.parse( + jsonnet.evaluateSnippet(`{ + "result":arakoo.urlEncode("open source is awesome") + }`) + ); + let expected = { + result: "open%20source%20is%20awesome", + }; + expect(result).to.eql(expected); + }); +}); diff --git a/JS/jsonnet/test/test_regex.jsonnet b/JS/jsonnet/test/test_regex.jsonnet new file mode 100644 index 000000000..dab989c99 --- /dev/null +++ b/JS/jsonnet/test/test_regex.jsonnet @@ -0,0 +1,25 @@ +// Edit me! + +local sentence = ||| + Question: Which magazine was started first Arthur's Magazine or First for Women? + Thought 1: I need to search Arthur's Magazine and First for Women, and find which was + started first. + Action 1: Search[Arthur's Magazine] + Observation 1: Arthur's Magazine (1844-1846) was an American literary periodical published + in Philadelphia in the 19th century. + Thought 2: Arthur's Magazine was started in 1844. I need to search First for Women + next. + Action 2: Search[First for Women] +|||; + +local searchPattern = 'Action 1: (.*)'; +local get_search_string = arakoo.regexMatch(arakoo.regexMatch(sentence, searchPattern)[0], 'Search\\[(.*)\\]')[0]; + +local name = arakoo.join('Alice ', get_search_string); +{ + person1: { + name: name, + welcome: 'Hello ' + self.name + '!', + }, + person2: self.person1 { name: get_search_string }, +} diff --git a/JS/jsonnet/test/tsconfig.json b/JS/jsonnet/test/tsconfig.json new file mode 100644 index 000000000..07e274402 --- /dev/null +++ b/JS/jsonnet/test/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "module": "NodeNext" /* Specify what module code is generated. */, + "moduleResolution": "NodeNext", + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "strict": true /* Enable all strict type-checking options. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "outDir": "dist" /* Redirect output structure to the directory. */ + }, + "include": ["test.ts"] +} diff --git a/JS/jsonnet/tsconfig.json b/JS/jsonnet/tsconfig.json new file mode 100644 index 000000000..41c4a5799 --- /dev/null +++ b/JS/jsonnet/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6"], + "strict": true, + "baseUrl": ".", + "paths": { + "arakoo-jsonnet": ["."] + }, + "noUncheckedIndexedAccess": true, + "noEmit": true + }, + "typedocOptions": { + "entryPoints": ["src/index.d.ts"], + "out": "../docs", + "excludeExternals": true + }, + "include": ["."] +} diff --git a/JS/wasm/assets/wasmjs/wit/arakoo-geo.witx b/JS/wasm/assets/wasmjs/wit/arakoo-geo.witx new file mode 100644 index 000000000..ef5d9e13e --- /dev/null +++ b/JS/wasm/assets/wasmjs/wit/arakoo-geo.witx @@ -0,0 +1,29 @@ +(typename $arakoo_status + (enum (@witx tag u32) + $ok + $error + $inval + $badf + $buflen + $unsupported + $badalign + $httpinvalid + $httpuser + $httpincomplete + $none + $httpheadtoolarge + $httpinvalidstatus + $limitexceeded + $again + )) + +(module $arakoo_geo + (@interface func (export "lookup") + (param $addr_octets (@witx const_pointer (@witx char8))) + (param $addr_len (@witx usize)) + (param $buf (@witx pointer (@witx char8))) + (param $buf_len (@witx usize)) + (param $nwritten_out (@witx pointer (@witx usize))) + (result $err (expected (error $arakoo_status))) + ) +) \ No newline at end of file diff --git a/JS/wasm/assets/wasmjs/wit/http-types.wit b/JS/wasm/assets/wasmjs/wit/http-types.wit new file mode 100644 index 000000000..41c3ecee1 --- /dev/null +++ b/JS/wasm/assets/wasmjs/wit/http-types.wit @@ -0,0 +1,45 @@ +type uri = string +type http-status = u16 +type http-header = tuple +type http-headers = list +enum http-method { + get, + post, + put, + patch, + delete, + options, + head +} +type http-param = tuple +type http-params = list +type http-body = list +record http-request { + body: option, + headers: http-headers, + method: http-method, + params: http-params, + uri: uri, +} +record http-request-error { + error: http-error, + message: string +} +record http-response { + body: option, + headers: http-headers, + status: http-status, +} +enum http-error { + invalid-request, + invalid-request-body, + invalid-response-body, + not-allowed, + internal-error, + timeout, + redirect-loop, +} +enum file-error { + not-found, + invalid-path, +} diff --git a/JS/wasm/assets/wasmjs/wit/http.wit b/JS/wasm/assets/wasmjs/wit/http.wit new file mode 100644 index 000000000..78b4a54ec --- /dev/null +++ b/JS/wasm/assets/wasmjs/wit/http.wit @@ -0,0 +1,6 @@ +use * from http-types +send-http-request: func(request: http-request) -> expected +jsonnet: func(file: string) -> expected +jsonnet-ext-var: func(name: string, value: string) -> expected + +read-bytes: func(file: string) -> expected diff --git a/JS/wasm/crates/arakoo-core/Cargo.toml b/JS/wasm/crates/arakoo-core/Cargo.toml new file mode 100644 index 000000000..16997c078 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "arakoo-js-engine" +edition.workspace = true +version.workspace = true + +[lib] +crate-type = ["cdylib"] + +[dependencies] +anyhow = { workspace = true } +javy = { workspace = true, features = ["export_alloc_fns", "json"] } +once_cell = { workspace = true } +serde_json = { workspace = true } +serde = { workspace = true } +serde_bytes = { workspace = true } +send_wrapper = "0.6.0" +wit-bindgen = "0.24.0" +# fastrand = { version = "2.0.1", optional = true } +# wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", tag = "v0.2.0" } +tokio = "1.36.0" +http = { workspace = true } +quickjs-wasm-rs = "3.0.0" +bytes = { version = "1.6.0", features = ["serde"] } +fastrand = "2.1.0" +log = {version = "*"} +env_logger = {version = "*"} +arakoo-jsonnet ={ path = "../../../jsonnet", default-features = false} +jrsonnet-gcmodule = { version = "0.3.6" } +jrsonnet-evaluator = { version = "0.5.0-pre95" } diff --git a/JS/wasm/crates/arakoo-core/src/apis/api_config.rs b/JS/wasm/crates/arakoo-core/src/apis/api_config.rs new file mode 100644 index 000000000..1237a427d --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/api_config.rs @@ -0,0 +1,11 @@ +/// A configuration for APIs added in this crate. +/// +/// Example usage: +/// ``` +/// # use javy_apis::APIConfig; +/// let api_config = APIConfig::default(); +/// ``` +#[derive(Debug, Default)] +pub struct APIConfig { + pub(crate) console: super::console::ConsoleConfig, +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/axios/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/axios/mod.rs new file mode 100644 index 000000000..6b43439cb --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/axios/mod.rs @@ -0,0 +1,57 @@ +use std::thread; +use std::time::Duration; + +use anyhow::{anyhow, Result}; +use log::debug; +// use crate::{types::{HttpRequest, HttpResponse}, JSApiSet}; +use super::{ + APIConfig, JSApiSet, +}; +use javy::quickjs::{JSContextRef, JSValue, JSValueRef}; +use quickjs_wasm_rs::{from_qjs_value, to_qjs_value}; + +pub(super) struct Axios; + +impl JSApiSet for Axios { + fn register(&self, runtime: &javy::Runtime, _config: &APIConfig) -> Result<()> { + let context = runtime.context(); + let global = context.global_object()?; + global + .set_property( + "setTimeout", + context + .wrap_callback(set_timeout_api()) + .expect("unable to get result"), + ) + .expect("unable to set property"); + + Ok(()) + } +} + +fn set_timeout_api() -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> Result { + move |context: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]| { + let callback = args.get(0).unwrap(); + let default = to_qjs_value(context, &JSValue::Int(0)).unwrap(); + let timeout = args.get(1).unwrap_or(&default); + thread::sleep(Duration::from_millis( + timeout + .as_f64() + .expect("Unable to convert timeout to milliseconds") as u64, + )); + debug!("timeout reached"); + if callback.is_function() { + let mut argsvec: Vec = vec![]; + if args.len() > 2 { + for i in 2..args.len() { + argsvec.push(args.get(i).unwrap().to_owned()) + } + } + let res = callback.call( + &to_qjs_value(context.to_owned(), &JSValue::Undefined).unwrap(), + &argsvec, + ); + } + Ok(JSValue::Undefined) + } +} \ No newline at end of file diff --git a/JS/wasm/crates/arakoo-core/src/apis/console/config.rs b/JS/wasm/crates/arakoo-core/src/apis/console/config.rs new file mode 100644 index 000000000..1c2d05647 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/console/config.rs @@ -0,0 +1,51 @@ +use std::io::{self, Write}; + +use super::APIConfig; + +/// A selection of possible destination streams for `console.log` and +/// `console.error`. +#[derive(Debug)] +pub enum LogStream { + /// The standard output stream. + StdOut, + /// The standard error stream. + StdErr, +} + +impl LogStream { + pub(super) fn to_stream(&self) -> Box { + match self { + Self::StdErr => Box::new(io::stderr()), + Self::StdOut => Box::new(io::stdout()), + } + } +} + +#[derive(Debug)] +pub(crate) struct ConsoleConfig { + pub(super) log_stream: LogStream, + pub(super) error_stream: LogStream, +} + +impl Default for ConsoleConfig { + fn default() -> Self { + Self { + log_stream: LogStream::StdOut, + error_stream: LogStream::StdErr, + } + } +} + +impl APIConfig { + /// Sets the destination stream for `console.log`. + pub fn log_stream(&mut self, stream: LogStream) -> &mut Self { + self.console.log_stream = stream; + self + } + + /// Sets the destination stream for `console.error`. + pub fn error_stream(&mut self, stream: LogStream) -> &mut Self { + self.console.error_stream = stream; + self + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/console/index.js b/JS/wasm/crates/arakoo-core/src/apis/console/index.js new file mode 100644 index 000000000..7d765b24d --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/console/index.js @@ -0,0 +1,31 @@ +globalThis.process = { + env: {}, +}; + +console.debug = function (...msg) { + let str = "QUICKJS ENGINE DEBUG - "; + if (process.env.JS_LOG == "debug") { + for (let i = 0; i < msg.length; i++) { + str += msg[i]; + } + console.log(str); + } +}; + +console.info = function (...msg) { + let str = "QUICKJS ENGINE INFO - "; + if (process.env.JS_LOG == "debug" || process.env.JS_LOG == "info") { + for (let i = 0; i < msg.length; i++) { + str += msg[i]; + } + console.log(str); + } +}; + +console.error = function (...msg) { + let str = "QUICKJS ENGINE ERROR - "; + for (let i = 0; i < msg.length; i++) { + str += msg[i]; + } + console.log(str); +}; diff --git a/JS/wasm/crates/arakoo-core/src/apis/console/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/console/mod.rs new file mode 100644 index 000000000..dc9aeff79 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/console/mod.rs @@ -0,0 +1,245 @@ +use std::{env, io::Write}; + +use anyhow::Result; +use javy::{ + quickjs::{JSContextRef, JSValue, JSValueRef}, + Runtime, +}; +use log::debug; +use quickjs_wasm_rs::{from_qjs_value, to_qjs_value}; + +use super::{APIConfig, JSApiSet}; + +pub(super) use config::ConsoleConfig; +pub use config::LogStream; + +mod config; + +pub(super) struct Console {} + +impl Console { + pub(super) fn new() -> Self { + Console {} + } +} + +impl JSApiSet for Console { + fn register(&self, runtime: &Runtime, config: &APIConfig) -> Result<()> { + let result = register_console( + runtime.context(), + config.console.log_stream.to_stream(), + config.console.error_stream.to_stream(), + ); + let context = runtime.context(); + context.eval_global("console.js", include_str!("index.js"))?; + let global = context.global_object()?; + let env = global.get_property("process")?.get_property("env")?; + debug!("env: {:?}", env::vars().collect::>()); + for (key, value) in env::vars() { + env.set_property(key, to_qjs_value(context, &JSValue::String(value)).unwrap())?; + } + result + } +} + +fn register_console(context: &JSContextRef, log_stream: T, error_stream: U) -> Result<()> +where + T: Write + 'static, + U: Write + 'static, +{ + let console_log_callback = context.wrap_callback(console_log_to(log_stream))?; + let console_error_callback = context.wrap_callback(console_log_to(error_stream))?; + let console_object = context.object_value()?; + console_object.set_property("log", console_log_callback)?; + console_object.set_property("error", console_error_callback)?; + context + .global_object()? + .set_property("console", console_object)?; + Ok(()) +} + +fn console_log_to( + mut stream: T, +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> Result +where + T: Write + 'static, +{ + move |_ctx: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]| { + // Write full string to in-memory destination before writing to stream since each write call to the stream + // will invoke a hostcall. + let mut log_line = String::new(); + for (i, arg) in args.iter().enumerate() { + let val: JSValue = from_qjs_value(*arg)?; + if i != 0 { + log_line.push(' '); + } + if !arg.is_undefined() { + let proto = arg.get_property("__proto__").unwrap().to_string(); + if proto.contains("rror") { + log_line.push_str(&format!( + "__proto__ is {} Error in js evaluation : {:?}", + proto, val + )); + } else { + let line: String = log_js_value(&val); + log_line.push_str(&line); + } + } else { + let line: String = log_js_value(&val); + log_line.push_str(&line); + } + } + + writeln!(stream, "{log_line}")?; + + Ok(JSValue::Undefined) + } +} + +fn log_js_value(arg: &JSValue) -> String { + match arg { + JSValue::String(s) => s.to_string(), + JSValue::Int(n) => n.to_string(), + JSValue::Bool(b) => b.to_string(), + JSValue::Object(o) => { + let flatten_obj = o + .iter() + .map(|(k, v)| format!("{}: {}", k, log_js_value(v))) + .collect::>() + .join(", "); + format!("Object = {{ {} }}", flatten_obj) + } + JSValue::Null => "null".to_string(), + JSValue::Undefined => "undefined".to_string(), + JSValue::Float(f) => f.to_string(), + JSValue::Array(arr) => { + let flatten_vec = arr + .iter() + .map(|v| log_js_value(v)) + .collect::>() + .join(", "); + format!("Array = [{}]", flatten_vec) + } + JSValue::ArrayBuffer(buff) => buff + .iter() + .map(|v| v.to_string()) + .collect::>() + .join(", "), + } +} + +#[cfg(test)] +mod tests { + use anyhow::Result; + use javy::Runtime; + use std::cell::RefCell; + use std::rc::Rc; + use std::{cmp, io}; + + use crate::apis::console::register_console; + + use super::{APIConfig, JSApiSet}; + + use super::Console; + + #[test] + fn test_register() -> Result<()> { + let runtime = Runtime::default(); + Console::new().register(&runtime, &APIConfig::default())?; + let console = runtime.context().global_object()?.get_property("console")?; + assert!(console.get_property("log").is_ok()); + assert!(console.get_property("error").is_ok()); + Ok(()) + } + + #[test] + fn test_console_log() -> Result<()> { + let mut stream = SharedStream::default(); + + let runtime = Runtime::default(); + let ctx = runtime.context(); + register_console(ctx, stream.clone(), stream.clone())?; + + ctx.eval_global("main", "console.log(\"hello world\");")?; + assert_eq!(b"hello world\n", stream.buffer.borrow().as_slice()); + + stream.clear(); + + ctx.eval_global("main", "console.log(\"bonjour\", \"le\", \"monde\")")?; + assert_eq!(b"bonjour le monde\n", stream.buffer.borrow().as_slice()); + + stream.clear(); + + ctx.eval_global( + "main", + "console.log(2.3, true, { foo: 'bar' }, null, undefined)", + )?; + assert_eq!( + b"2.3 true [object Object] null undefined\n", + stream.buffer.borrow().as_slice() + ); + Ok(()) + } + + #[test] + fn test_console_error() -> Result<()> { + let mut stream = SharedStream::default(); + + let runtime = Runtime::default(); + let ctx = runtime.context(); + register_console(ctx, stream.clone(), stream.clone())?; + + ctx.eval_global("main", "console.error(\"hello world\");")?; + assert_eq!(b"hello world\n", stream.buffer.borrow().as_slice()); + + stream.clear(); + + ctx.eval_global("main", "console.error(\"bonjour\", \"le\", \"monde\")")?; + assert_eq!(b"bonjour le monde\n", stream.buffer.borrow().as_slice()); + + stream.clear(); + + ctx.eval_global( + "main", + "console.error(2.3, true, { foo: 'bar' }, null, undefined)", + )?; + assert_eq!( + b"2.3 true [object Object] null undefined\n", + stream.buffer.borrow().as_slice() + ); + Ok(()) + } + + #[derive(Clone)] + struct SharedStream { + buffer: Rc>>, + capacity: usize, + } + + impl Default for SharedStream { + fn default() -> Self { + Self { + buffer: Default::default(), + capacity: usize::MAX, + } + } + } + + impl SharedStream { + fn clear(&mut self) { + (*self.buffer).borrow_mut().clear(); + } + } + + impl io::Write for SharedStream { + fn write(&mut self, buf: &[u8]) -> io::Result { + let available_capacity = self.capacity - (*self.buffer).borrow().len(); + let leftover = cmp::min(available_capacity, buf.len()); + (*self.buffer).borrow_mut().write(&buf[..leftover]) + } + + fn flush(&mut self) -> io::Result<()> { + (*self.buffer).borrow_mut().flush() + } + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/fetch/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/fetch/mod.rs new file mode 100644 index 000000000..473f5d897 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/fetch/mod.rs @@ -0,0 +1,90 @@ +use anyhow::{anyhow, Result}; +use http::{request, HeaderName, HeaderValue}; +use log::debug; +use serde_bytes::ByteBuf; +// use crate::{types::{HttpRequest, HttpResponse}, JSApiSet}; +use javy::quickjs::{JSContextRef, JSValue, JSValueRef}; +use quickjs_wasm_rs::{from_qjs_value, Deserializer, Serializer}; +use serde::{Deserialize, Serialize}; +use std::ops::Deref; +use super::{types::{HttpRequest, HttpResponse}, APIConfig, JSApiSet}; +use super::types::arakoo_http; +use super::wit; +use std::str; + +mod outbound_http; + + +pub(super) struct Fetch; + +impl JSApiSet for Fetch { + fn register(&self, runtime: &javy::Runtime, _config: &APIConfig) -> Result<()> { + let context = runtime.context(); + let global = context.global_object()?; + global.set_property( + "__internal_http_send", + context.wrap_callback( + |context: &JSContextRef, _this: JSValueRef<'_>, args: &[JSValueRef<'_>]| { + send_http_request(context, &_this, args) + }, + )?, + )?; + + Ok(()) + } +} + +fn send_http_request(context: &JSContextRef, _this: &JSValueRef, args: &[JSValueRef]) -> Result { + match args { + [request] => { + debug!("Request recieved in send_http_request: {:?}", from_qjs_value(*request).unwrap()); + let deserializer = &mut Deserializer::from(request.clone()); + let request = HttpRequest::deserialize(deserializer).expect("Unable to deserialize request"); + + let mut builder = request::Builder::new() + .method(request.method.deref()) + .uri(request.uri.deref()); + + if let Some(headers) = builder.headers_mut() { + for (key, value) in &request.headers { + headers.insert( + HeaderName::from_bytes(key.as_bytes()).expect("Unable to convert key to HeaderName"), + HeaderValue::from_bytes(value.as_bytes()).expect("Unable to convert value to HeaderValue"), + ); + } + } + + let outbound_request = builder.body(request.body.map(|buffer| buffer.into_vec().into())).expect("Unable to build request body"); + debug!("outbound_request in wrap_callback: {:?}", outbound_request); + let response = outbound_http::send_request( + outbound_request + )?; + debug!("outbound_response in wrap_callback: {:?}", response); + + let response = HttpResponse { + status: response.status().as_u16(), + headers: response + .headers() + .iter() + .map(|(key, value)| { + Ok(( + key.as_str().to_owned(), + str::from_utf8(value.as_bytes())?.to_owned(), + )) + }) + .collect::>()?, + body: response.clone() + .into_body() + .map(|bytes| ByteBuf::from(bytes.deref())), + status_text: response.status().canonical_reason().unwrap_or("").to_owned(), + }; + + let mut serializer = Serializer::from_context(context)?; + response.serialize(&mut serializer)?; + Ok(from_qjs_value(serializer.value)?) + } + + _ => Err(anyhow!("expected 1 argument, got {}", args.len())), + } +} + diff --git a/JS/wasm/crates/arakoo-core/src/apis/fetch/outbound_http.rs b/JS/wasm/crates/arakoo-core/src/apis/fetch/outbound_http.rs new file mode 100644 index 000000000..e2405ff0b --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/fetch/outbound_http.rs @@ -0,0 +1,83 @@ +use std::ops::Deref; + +use crate::wit::Method; + +use super::arakoo_http::{Request, Response}; +use super::wit::edgechains::http::{Request as OutboundRequest, Response as OutboundResponse}; +use super::wit::edgechains::http_types::HttpError as OutboundHttpError; +use super::wit::edgechains::http::send_request as outbound_send_request; +use http::{header::HeaderName, HeaderValue}; + + +pub fn send_request(req: Request) -> Result { + let (req, body) = req.into_parts(); + + let method = req.method.try_into()?; + + let uri = req.uri.to_string(); + + let params = vec![]; + + let headers = req + .headers + .iter() + .map(try_header_to_strs) + .collect::, OutboundHttpError>>()?; + + let body = body.as_ref().map(|bytes| bytes.as_ref()); + + let out_req = OutboundRequest { + method, + uri, + params, + headers, + body:Some(body.unwrap().to_vec()), + }; + + let OutboundResponse { + status, + headers, + body, + status_text, + } = outbound_send_request(&out_req)?; + + let resp_builder = http::response::Builder::new().status(status); + let resp_builder = headers + .into_iter() + .flatten() + .fold(resp_builder, |b, (k, v)| b.header(k, v)); + resp_builder + .body(body.map(Into::into)) + .map_err(|_| OutboundHttpError::RuntimeError) +} + +fn try_header_to_strs<'k, 'v>( + header: (&'k HeaderName, &'v HeaderValue), +) -> Result<(String, String), OutboundHttpError> { + Ok(( + header.0.as_str().to_string(), + header + .1 + .to_str() + .map_err(|_| OutboundHttpError::InvalidUrl)?.to_string(), + )) +} + +impl TryFrom for Method { + type Error = OutboundHttpError; + + fn try_from(method: http::Method) -> Result { + use http::Method; + use super::wit::Method::*; + Ok(match method { + Method::GET => Get, + Method::POST => Post, + Method::PUT => Put, + Method::DELETE => Delete, + Method::PATCH => Patch, + Method::HEAD => Head, + Method::OPTIONS => Options, + _ => return Err(super::wit::edgechains::http_types::HttpError::RequestError), + }) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/http/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/http/mod.rs new file mode 100644 index 000000000..4cd7ee999 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/http/mod.rs @@ -0,0 +1,15 @@ +use anyhow::Result; +use super::JSApiSet; + +// use crate::{fetch, get_response, get_response_len, http::types::Request, JSApiSet}; + + +pub(super) struct Http; + +impl JSApiSet for Http { + fn register(&self, runtime: &javy::Runtime, _config: &super::APIConfig) -> Result<()> { + let context = runtime.context(); + context.eval_global("http.js", include_str!("shims/dist/index.js"))?; + Ok(()) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/http/shims/.gitignore b/JS/wasm/crates/arakoo-core/src/apis/http/shims/.gitignore new file mode 100644 index 000000000..1eae0cf67 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/http/shims/.gitignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/JS/wasm/crates/arakoo-core/src/apis/http/shims/build.js b/JS/wasm/crates/arakoo-core/src/apis/http/shims/build.js new file mode 100644 index 000000000..4a1f01298 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/http/shims/build.js @@ -0,0 +1,15 @@ +import { build } from "esbuild"; + +// Build for index.js +build({ + entryPoints: ["index.js"], + bundle: true, + outfile: "dist/index.js", + format: "esm", + target: "esnext", + platform: "node", + treeShaking: false, +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/crates/arakoo-core/src/apis/http/shims/index.js b/JS/wasm/crates/arakoo-core/src/apis/http/shims/index.js new file mode 100644 index 000000000..3a51daaf3 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/http/shims/index.js @@ -0,0 +1,438 @@ +import httpStatus from "http-status"; +import Url from "url-parse"; +import _queryString from "query-string"; +import "fast-text-encoding"; + +let encoder = new TextEncoder(); +let decoder = new TextDecoder(); + +class URL { + constructor(urlStr, base = undefined) { + let url = Url(urlStr, base); + this.url = url; + this.protocol = url.protocol; + this.slashes = url.slashes; + this.auth = url.auth; + this.username = url.username; + this.password = url.password; + this.host = url.host; + this.port = url.port; + this.pathname = url.pathname; + this.search = url.query; + this.searchParams = new URLSearchParams(this.search); + this.hash = url.hash; + this.href = url.origin; + this.origin = url.origin; + } + + set(key, value) { + this.url.set(key, value); + } + + toString() { + return this.url.toString(); + } + + toJson() { + return this.url.toString(); + } +} + +class URLSearchParams { + queryParams = {}; + + constructor(val) { + this.queryParams = { + ..._queryString.parse(val), + }; + } + append(key, val) { + this.queryParams[key] = val; + } + delete(key) { + delete this.queryParams[key]; + } + entries() { + let arr = []; + Object.entries(this.queryParams).map((o) => { + if (Array.isArray(o[1])) { + o[1].map((k) => { + arr.push([o[0], k]); + }); + } else { + arr.push([o[0], o[1]]); + } + }); + let iterLength = arr.length; + let iterIndex = 0; + return { + next: function () { + return iterIndex < iterLength + ? { value: arr[iterIndex++], done: false } + : { done: true }; + }, + }; + } + get(key) { + let val = this.queryParams[key]; + if (val) { + if (typeof val == "object") { + return val[0]; + } + return val; + } + return null; + } + getAll(key) { + let val = this.queryParams[key]; + if (val) { + return val; + } + return null; + } + has(key) { + return this.queryParams[key] != undefined ? true : false; + } + keys() { + return Object.keys(this.queryParams); + } + set(key, val) { + this.queryParams[key] = val; + } + toString() { + return _queryString.stringify(this.queryParams); + } + values() { + return Object.keys(this.queryParams).map((k) => this.queryParams[k]); + } + [Symbol.iterator]() { + return this.entries(); + } +} + +globalThis.URL = URL; +globalThis.URLSearchParams = URLSearchParams; + +function atob(b64) { + return Buffer.from(b64, "base64").toString(); +} + +function btoa(data) { + return Buffer.from(data).toString("base64"); +} + +globalThis.btoa = btoa; +globalThis.atob = atob; + +class Headers { + constructor(initialHeaders) { + let headers = {}; + + for (const key in initialHeaders) { + let value = initialHeaders[key]; + + if (typeof value === "string") { + headers[key] = value; + } + } + + this.headers = headers; + } + + append(key, value) { + this.headers[key] = value; + return value; + } + + set(key, value) { + this.append(key, value); + return value; + } + + delete(key) { + let dropValue = delete this.headers[key]; + return dropValue; + } + + get(key) { + return this.headers[key]; + } + + toJSON() { + return this.headers; + } +} + +class Request { + constructor(url, input) { + console.debug("Request constructor called with ", JSON.stringify(url), input); + if (typeof url === "string") { + this.url = url; + } else { + throw new Error("url in Request constructor is not a string"); + } + this.headers = input.headers; + this.method = input.method; + this.body = input.body; + this.params = input.params || {}; + this.geo = input.geo || {}; + } + + defaultEncoding() { + return "utf-8"; + } + + arrayBuffer() { + let parsedBody = this.body; + + if (typeof this.body === "string") { + try { + parsedBody = new TextEncoder().encode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + return parsedBody; + } + + json() { + let parsedBody = this.body; + + if (typeof this.body !== "string") { + try { + parsedBody = new TextDecoder(this.defaultEncoding()).decode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + try { + return Promise.resolve(JSON.parse(parsedBody)); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + text() { + let parsedBody = this.body; + + if (typeof this.body !== "string") { + try { + parsedBody = new TextDecoder(this.defaultEncoding()).decode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + return parsedBody; + } +} + +class Response { + constructor(body, options = {}) { + if (body instanceof String) { + this.body = body.toString(); + } else { + this.body = body; + } + + if (options.headers instanceof Headers) { + this.headers = options.headers; + } else if (options.headers instanceof Object) { + this.headers = new Headers(options.headers); + } else { + this.headers = new Headers({}); + } + + this.status = options.status || 200; + this.statusText = options.statusText || httpStatus[this.status]; + } + + static redirect(url, status = 307) { + return new Response(`Redirecting to ${url}`, { + status, + headers: { + Location: url, + }, + }); + } + + get ok() { + return this.status >= 200 && this.status < 300; + } + + defaultEncoding() { + return "utf-8"; + } + + arrayBuffer() { + let parsedBody = this.body; + + if (typeof this.body === "string") { + try { + parsedBody = new TextEncoder().encode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + return parsedBody; + } + + json() { + let parsedBody = this.body; + + if (typeof this.body !== "string") { + try { + parsedBody = new TextDecoder(this.defaultEncoding()).decode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + try { + return Promise.resolve(JSON.parse(parsedBody)); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + text() { + let parsedBody = this.body; + + if (typeof this.body !== "string") { + try { + parsedBody = new TextDecoder(this.defaultEncoding()).decode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + return parsedBody; + } + + toString() { + return this.body; + } +} + +let handlerFunction; +globalThis.addEventListener = (_eventName, handler) => { + handlerFunction = handler; +}; + +const requestToHandler = (inputReq) => { + const request = new Request(inputReq.uri, inputReq); + console.debug("Request recieved ", JSON.stringify(request)); + const event = { + request, + response: {}, + respondWith(res) { + console.debug(res.constructor.name); + this.response = res; + }, + }; + + try { + handlerFunction(event); + + Promise.resolve(event.response) + .then((res) => { + console.log("Successfully responded to request"); + result = { + body: res.body, + headers: res.headers.headers, + status: res.status, + statusText: res.statusText, + }; + }) + .catch((err) => { + error = `err: \n${err}`; + }); + } catch (err) { + error = `err: ${err}\n${err.stack}`; + } +}; + +globalThis.entrypoint = requestToHandler; +globalThis.result = {}; +globalThis.error = null; + +// globalThis.fetch = async (resource, options = { method: "GET" }) => { +// let response = await fetch_internal(resource, options); +// return Promise.resolve(new Response(response.body, response)); +// }; + +function encodeBody(body) { + if (typeof body == "string") { + return encoder.encode(body).buffer; + } else if (ArrayBuffer.isView(body)) { + return body.buffer; + } else { + return body; + } +} + +// globalThis.requestToEvent = (inputReq) => { +// const request = new Request(inputReq); +// const event = { +// request, +// response: {}, +// respondWith(res) { +// console.log("Response recieved ", res); +// this.response = res; +// }, +// }; +// console.log("event: ", JSON.stringify(event)) +// return event; +// } + +function fetch(uri, options) { + console.info("constructor name of uri ", uri.constructor.name); + console.info("uri is ", JSON.stringify(uri)); + if (uri.constructor.name == "Request") { + console.info("uri is instance of Request"); + options = {}; + options.headers = uri.headers; + options.method = uri.method; + options.params = uri.params; + options.body = uri.body; + options.geo = uri.geo; + uri = uri.url; + } + console.info("In fetch function", uri, options); + let encodedBodyData = + options && options.body ? encodeBody(options.body) : new Uint8Array().buffer; + const { status, headers, body } = __internal_http_send({ + method: (options && options.method) || "GET", + uri: uri instanceof URL ? uri.toString() : uri, + headers: (options && options.headers) || {}, + body: encodedBodyData, + params: (options && options.params) || {}, + }); + console.info("Response from fetch", status, headers, body); + let obj; + try { + obj = { + status, + headers: { + entries: () => Object.entries(headers || {}), + get: (key) => (headers && headers[key]) || null, + has: (key) => (headers && headers[key] ? true : false), + }, + arrayBuffer: () => Promise.resolve(body), + ok: status > 199 && status < 300, + statusText: httpStatus[status], + text: () => Promise.resolve(new TextDecoder().decode(body || new Uint8Array())), + json: () => { + let text = new TextDecoder().decode(body || new Uint8Array()); + return Promise.resolve(JSON.parse(text)); + }, + }; + } catch (error) { + console.log("Error occured in sending response from fetch"); + console.log(error); + } + return Promise.resolve(obj); +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/http/shims/package.json b/JS/wasm/crates/arakoo-core/src/apis/http/shims/package.json new file mode 100644 index 000000000..a4166608e --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/http/shims/package.json @@ -0,0 +1,19 @@ +{ + "name": "shims", + "version": "1.0.0", + "description": "Shims for http", + "main": "index.js", + "type": "module", + "license": "MIT", + "scripts": { + "build": "node build.js" + }, + "dependencies": { + "@sinonjs/text-encoding": "^0.7.2", + "esbuild": "^0.20.0", + "fast-text-encoding": "^1.0.6", + "http-status": "^1.7.3", + "query-string": "^8.1.0", + "url-parse": "^1.5.10" + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/jsonnet/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/jsonnet/mod.rs new file mode 100644 index 000000000..9609a899b --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/jsonnet/mod.rs @@ -0,0 +1,297 @@ +use std::{ + collections::HashMap, + ops::Deref, + sync::{Arc, Mutex}, +}; + +use crate::apis::{console, jsonnet}; + +use super::{wit::edgechains, APIConfig, JSApiSet}; +use arakoo_jsonnet::{self}; +use javy::quickjs::{JSContextRef, JSValue, JSValueRef}; +use jrsonnet_evaluator::{ + function::builtin::{NativeCallback, NativeCallbackHandler}, + Error, Val, +}; +use log::debug; +use quickjs_wasm_rs::{from_qjs_value, to_qjs_value}; +// use jrsonnet_evaluator::function:: + +pub(super) struct Jsonnet; + +impl JSApiSet for Jsonnet { + fn register(&self, runtime: &javy::Runtime, _config: &APIConfig) -> anyhow::Result<()> { + let context = runtime.context(); + let global = context.global_object()?; + + global.set_property( + "__jsonnet_make", + context.wrap_callback(jsonnet_make_closure())?, + )?; + global.set_property( + "__jsonnet_ext_string", + context.wrap_callback(jsonnet_ext_string_closure())?, + )?; + global.set_property( + "__jsonnet_evaluate_snippet", + context.wrap_callback(jsonnet_evaluate_snippet_closure())?, + )?; + global.set_property( + "__jsonnet_evaluate_file", + context.wrap_callback(jsonnet_evaluate_file_closure())?, + )?; + let jsonnet_func_map = JSValue::Object(HashMap::new()); + global.set_property( + "__jsonnet_func_map", + to_qjs_value(context, &jsonnet_func_map)?, + )?; + global.set_property( + "__jsonnet_register_func", + context.wrap_callback(jsonnet_register_func_closure())?, + )?; + global.set_property( + "__jsonnet_destroy", + context.wrap_callback(jsonnet_destroy_closure())?, + )?; + Ok(()) + } +} + +#[derive(jrsonnet_gcmodule::Trace)] +pub struct NativeJSCallback(String); + +impl NativeCallbackHandler for NativeJSCallback { + fn call( + &self, + args: &[jrsonnet_evaluator::Val], + ) -> jrsonnet_evaluator::Result { + debug!("NativeJSCallback called: {:?}", self.0); + let super_context = **super::CONTEXT.get().unwrap(); + let global = super_context + .global_object() + .expect("Unable to get super context"); + let func_map = global + .get_property("__jsonnet_func_map") + .expect("Unable to get global object"); + let func = func_map + .get_property(self.0.clone()) + .expect("Unable to get property"); + // debug!( + // "func: {:?}", + // from_qjs_value(func).expect("Unable to convert map ref to map") + // ); + let result; + if args.len() > 0 { + let args_str = serde_json::to_string(args).expect("Error converting args to JSON"); + let args_str = JSValue::String(args_str); + debug!( + "Calling function: {} with args = {}", + self.0, + args_str.to_string() + ); + result = func + .call( + &to_qjs_value(super_context, &JSValue::Undefined) + .expect("Unable to convert undefined"), + &[to_qjs_value(super_context, &args_str) + .expect("Unable to convert string to qjs value")], + ) + .expect("Unable to call function"); + // let result = from_qjs_value(result).expect("Unable to convert qjs value to value"); + // debug!("Result of calling JS function: {}", result.as_str().unwrap()); + } else { + let emtpy_str = JSValue::String("".to_string()); + let context = **super::CONTEXT.get().unwrap(); + result = func + .call( + &to_qjs_value(context, &JSValue::Undefined) + .expect("Unable to convert undefined"), + &[to_qjs_value(context, &emtpy_str) + .expect("Unable to convert string to qjs value")], + ) + .expect("Unable to call function"); + // let result = from_qjs_value(result).expect("Unable to convert qjs value to value"); + } + if result.is_object() { + debug!("Result is object"); + let constructor = result + .get_property("constructor") + .expect("Unable to get constructor"); + if !constructor.is_null_or_undefined() { + let constructor_name = constructor + .get_property("name") + .expect("Unable to find name in constructor") + .to_string(); + if constructor_name == "Promise" { + let resolved_result: Arc>> = Arc::new(Mutex::new(None)); + let resolved_error: Arc>> = Arc::new(Mutex::new(None)); + let then_func = result + .get_property("then") + .expect("Unable to find then on promise"); + if then_func.is_function() { + let resolved_result = resolved_result.clone(); + let resolved_error = resolved_error.clone(); + then_func + .call( + &result, + &[ + super_context + .wrap_callback(move |context, _this, args| { + resolved_result + .lock() + .unwrap() + .replace(args.get(0).unwrap().to_string()); + Ok(JSValue::Undefined) + }) + .expect("unable to wrap callback"), + super_context + .wrap_callback(move |context, _this, args| { + // resolvedError.replace(Some(args.get(0).unwrap().to_string())); + resolved_error + .lock() + .unwrap() + .replace(args.get(0).unwrap().to_string()); + Ok(JSValue::Undefined) + }) + .expect("Unable to wrap callback"), + ], + ) + .expect("Unable to call then function"); + super_context + .execute_pending() + .expect("Unable to execute pending tasks"); + } else { + panic!("then is not a function"); + } + + let result = resolved_result.lock().unwrap(); + let error = resolved_error.lock().unwrap(); + if result.is_some() { + Ok(Val::Str(result.as_ref().unwrap().into())) + } else { + Ok(Val::Str(error.as_ref().unwrap().into())) + } + } else { + Ok(Val::Str( + "Unable to find constructor property of returned type from function".into(), + )) + } + } else { + Ok(Val::Str("Result is an object but retuned object does not contain constructor function".into())) + } + } else if result.is_str() { + Ok(Val::Str(result.as_str().unwrap().into())) + } else { + // debug!("Result is unknown"); + Ok(Val::Str("Function does not return any result or promise".into())) + } + } +} + +fn jsonnet_make_closure( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx, _this, args| { + let ptr = arakoo_jsonnet::jsonnet_make(); + Ok(JSValue::from(ptr as u64 as f64)) + } +} + +fn jsonnet_ext_string_closure( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx, _this, args| { + // check the number of arguments + if args.len() != 3 { + return Err(anyhow::anyhow!( + "Expected 2 arguments, got {}", + args.len() - 1 + )); + } + let vm = args.get(0).unwrap().as_f64()?; + let key = args.get(1).unwrap().to_string(); + let value = args.get(2).unwrap().to_string(); + // edgechains::jsonnet::jsonnet_ext_string(vm as u64, &key, &value); + let ptr = vm as u64; + arakoo_jsonnet::jsonnet_ext_string(ptr as *mut arakoo_jsonnet::VM, &key, &value); + Ok(JSValue::Undefined) + } +} + +fn jsonnet_evaluate_snippet_closure( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx, _this, args| { + // check the number of arguments + if args.len() != 2 { + return Err(anyhow::anyhow!("Expected 2 arguments, got {}", args.len())); + } + let vm = args.get(0).unwrap().as_f64()?; + let code = args.get(1).unwrap().to_string(); + let code = code.as_str(); + // let out = edgechains::jsonnet::jsonnet_evaluate_snippet(vm as u64, "snippet", code); + let out = arakoo_jsonnet::jsonnet_evaluate_snippet( + vm as u64 as *mut arakoo_jsonnet::VM, + "snippet", + code, + ); + debug!("Result of evaluating snippet: {}", out.to_string()); + Ok(out.into()) + } +} + +fn jsonnet_evaluate_file_closure( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx, _this, args| { + // check the number of arguments + if args.len() != 2 { + return Err(anyhow::anyhow!("Expected 2 arguments, got {}", args.len())); + } + let vm = args.get(0).unwrap().as_f64()?; + let path = args.get(1).unwrap().to_string(); + let code = edgechains::utils::read_file(path.as_str()); + let out = arakoo_jsonnet::jsonnet_evaluate_snippet( + vm as u64 as *mut arakoo_jsonnet::VM, + "snippet", + &code, + ); + Ok(out.into()) + } +} + +fn jsonnet_register_func_closure( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx, _this, args| { + // check the number of arguments + if args.len() != 3 { + return Err(anyhow::anyhow!("Expected 3 arguments, got {}", args.len())); + } + let vm = args.get(0).unwrap().as_f64().unwrap(); + let func_name = args.get(1).unwrap().to_string(); + let args_num = args.get(2).unwrap().as_f64().unwrap(); + // edgechains::jsonnet::jsonnet_register_func(vm as u64, &func_name, args_num as u32); + let vm = unsafe { &*(vm as u64 as *mut arakoo_jsonnet::VM) }; + let any_resolver = vm.state.context_initializer(); + let args_vec = vec![String::from("x"); args_num as usize]; + any_resolver + .as_any() + .downcast_ref::() + .expect("only arakoo context initializer supported") + .add_native( + func_name.clone(), + NativeCallback::new(args_vec, NativeJSCallback(func_name.clone())), + ); + debug!("Registered function: {}", func_name); + Ok(JSValue::Undefined) + } +} + +fn jsonnet_destroy_closure( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx, _this, args| { + // check the number of arguments + if args.len() != 1 { + return Err(anyhow::anyhow!("Expected 1 arguments, got {}", args.len())); + } + let vm = args.get(0).unwrap().as_f64()?; + arakoo_jsonnet::jsonnet_destroy(vm as u64 as *mut arakoo_jsonnet::VM); + Ok(JSValue::Undefined) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/mod.rs new file mode 100644 index 000000000..e4e4d645c --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/mod.rs @@ -0,0 +1,95 @@ +//! JS APIs for Javy. +//! +//! This crate provides JS APIs you can add to Javy. +//! +//! Example usage: +//! ``` +//! # use anyhow::{anyhow, Error, Result}; +//! use javy::{quickjs::JSValue, Runtime}; +//! use javy_apis::RuntimeExt; +//! +//! let runtime = Runtime::new_with_defaults()?; +//! let context = runtime.context(); +//! context.global_object()?.set_property( +//! "print", +//! context.wrap_callback(move |_ctx, _this, args| { +//! let str = args +//! .first() +//! .ok_or(anyhow!("Need to pass an argument"))? +//! .to_string(); +//! println!("{str}"); +//! Ok(JSValue::Undefined) +//! })?, +//! )?; +//! context.eval_global("hello.js", "print('hello!');")?; +//! # Ok::<(), Error>(()) +//! ``` +//! +//! If you want to customize the runtime or the APIs, you can use the +//! [`Runtime::new_with_apis`] method instead to provide a [`javy::Config`] +//! for the underlying [`Runtime`] or an [`APIConfig`] for the APIs. +//! +//! ## Features +//! * `console` - Registers an implementation of the `console` API. +//! * `text_encoding` - Registers implementations of `TextEncoder` and `TextDecoder`. +//! * `random` - Overrides the implementation of `Math.random` to one that +//! seeds the RNG on first call to `Math.random`. This is helpful to enable +//! when using Wizer to snapshot a [`javy::Runtime`] so that the output of +//! `Math.random` relies on the WASI context used at runtime and not the +//! WASI context used when Wizening. Enabling this feature will increase the +//! size of the Wasm module that includes the Javy Runtime and will +//! introduce an additional hostcall invocation when `Math.random` is +//! invoked for the first time. +//! * `stream_io` - Registers implementations of `Javy.IO.readSync` and `Javy.IO.writeSync`. + +use super::wit; +use anyhow::Result; +use javy::Runtime; + +pub use api_config::APIConfig; +pub use console::LogStream; +pub use runtime_ext::RuntimeExt; + +use super::CONTEXT; + +pub mod http; +pub mod types; + +mod api_config; +mod axios; +mod console; +mod fetch; +mod jsonnet; +mod pdfparse; +mod random; +mod runtime_ext; +mod stream_io; +mod text_encoding; + +pub(crate) trait JSApiSet { + fn register(&self, runtime: &Runtime, config: &APIConfig) -> Result<()>; +} + +/// Adds enabled JS APIs to the provided [`Runtime`]. +/// +/// ## Example +/// ``` +/// # use anyhow::Error; +/// # use javy::Runtime; +/// # use javy_apis::APIConfig; +/// let runtime = Runtime::default(); +/// javy_apis::add_to_runtime(&runtime, APIConfig::default())?; +/// # Ok::<(), Error>(()) +/// ``` +pub fn add_to_runtime(runtime: &Runtime, config: APIConfig) -> Result<()> { + console::Console::new().register(runtime, &config)?; + random::Random.register(runtime, &config)?; + stream_io::StreamIO.register(runtime, &config)?; + text_encoding::TextEncoding.register(runtime, &config)?; + http::Http.register(runtime, &config)?; + jsonnet::Jsonnet.register(runtime, &config)?; + pdfparse::PDFPARSER.register(runtime, &config)?; + fetch::Fetch.register(runtime, &config)?; + axios::Axios.register(runtime, &config)?; + Ok(()) +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/pdfparse/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/pdfparse/mod.rs new file mode 100644 index 000000000..7ff29f852 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/pdfparse/mod.rs @@ -0,0 +1,40 @@ +use super::{APIConfig, JSApiSet}; +use anyhow::Result; +use javy::{ + quickjs::{from_qjs_value, to_qjs_value, JSContextRef, JSValue, JSValueRef}, + Runtime, +}; + +pub struct PDFPARSER; + +impl JSApiSet for PDFPARSER { + fn register(&self, runtime: &Runtime, _config: &APIConfig) -> Result<()> { + let context = runtime.context(); + context + .global_object()? + .set_property("setImmediate", context.wrap_callback(set_immediate_api()).expect("unable to get result")).expect("unable to set property"); + Ok(()) + } +} + +fn set_immediate_api( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> Result { + move |context: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]| { + let callback = args.get(0).unwrap(); + if callback.is_function() { + let mut argsvec: Vec = vec![]; + for n in 1..args.len() { + argsvec.push(args.get(n).unwrap().to_owned()) + } + let result = callback + .call( + &to_qjs_value(context.to_owned(), &JSValue::Undefined).unwrap(), + args, + ) + .expect("Failed to call callback"); + return Ok(from_qjs_value(result).expect("Unable to convert result into")); + } + Ok(JSValue::Undefined) + } +} + diff --git a/JS/wasm/crates/arakoo-core/src/apis/random/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/random/mod.rs new file mode 100644 index 000000000..65346115e --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/random/mod.rs @@ -0,0 +1,39 @@ +use anyhow::Result; +use javy::{quickjs::JSValue, Runtime}; + +use super::{APIConfig, JSApiSet}; + +pub struct Random; + +impl JSApiSet for Random { + fn register(&self, runtime: &Runtime, _config: &APIConfig) -> Result<()> { + let ctx = runtime.context(); + ctx.global_object()?.get_property("Math")?.set_property( + "random", + // TODO figure out if we can lazily initialize the PRNG + ctx.wrap_callback(|_ctx, _this, _args| Ok(JSValue::Float(fastrand::f64())))?, + )?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use crate::apis::random::Random; + + use super::{ APIConfig, JSApiSet}; + use anyhow::Result; + use javy::Runtime; + + #[test] + fn test_random() -> Result<()> { + let runtime = Runtime::default(); + Random.register(&runtime, &APIConfig::default())?; + let ctx = runtime.context(); + ctx.eval_global("test.js", "result = Math.random()")?; + let result = ctx.global_object()?.get_property("result")?.as_f64()?; + assert!(result >= 0.0); + assert!(result < 1.0); + Ok(()) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/runtime_ext.rs b/JS/wasm/crates/arakoo-core/src/apis/runtime_ext.rs new file mode 100644 index 000000000..703767685 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/runtime_ext.rs @@ -0,0 +1,35 @@ +use anyhow::Result; +use javy::{Config, Runtime}; + +use super::APIConfig; + +/// A extension trait for [`Runtime`] that creates a [`Runtime`] with APIs +/// provided in this crate. +/// +/// ## Example +/// ``` +/// # use anyhow::Error; +/// use javy::Runtime; +/// use javy_apis::RuntimeExt; +/// let runtime = Runtime::new_with_defaults()?; +/// # Ok::<(), Error>(()) +/// ``` +pub trait RuntimeExt { + /// Creates a [`Runtime`] configured by the provided [`Config`] with JS + /// APIs added configured according to the [`APIConfig`]. + fn new_with_apis(config: Config, api_config: APIConfig) -> Result; + /// Creates a [`Runtime`] with JS APIs added with a default configuration. + fn new_with_defaults() -> Result; +} + +impl RuntimeExt for Runtime { + fn new_with_apis(config: Config, api_config: APIConfig) -> Result { + let runtime = Runtime::new(config)?; + super::add_to_runtime(&runtime, api_config)?; + Ok(runtime) + } + + fn new_with_defaults() -> Result { + Self::new_with_apis(Config::default(), APIConfig::default()) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/stream_io/io.js b/JS/wasm/crates/arakoo-core/src/apis/stream_io/io.js new file mode 100644 index 000000000..c6aefb664 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/stream_io/io.js @@ -0,0 +1,21 @@ +(function () { + const __javy_io_readSync = globalThis.__javy_io_readSync; + const __javy_io_writeSync = globalThis.__javy_io_writeSync; + globalThis.Javy.IO = { + readSync(fd, data) { + if (!(data instanceof Uint8Array)) { + throw TypeError("Data needs to be an Uint8Array"); + } + return __javy_io_readSync(fd, data.buffer, data.byteOffset, data.byteLength); + }, + writeSync(fd, data) { + if (!(data instanceof Uint8Array)) { + throw TypeError("Data needs to be an Uint8Array"); + } + return __javy_io_writeSync(fd, data.buffer, data.byteOffset, data.byteLength); + }, + }; + + Reflect.deleteProperty(globalThis, "__javy_io_readSync"); + Reflect.deleteProperty(globalThis, "__javy_io_writeSync"); +})(); diff --git a/JS/wasm/crates/arakoo-core/src/apis/stream_io/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/stream_io/mod.rs new file mode 100644 index 000000000..d6afd6726 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/stream_io/mod.rs @@ -0,0 +1,68 @@ +use anyhow::Result; +use std::io::{Read, Write}; + +use javy::Runtime; + +use super::{APIConfig, JSApiSet}; + +pub(super) struct StreamIO; + +impl JSApiSet for StreamIO { + fn register(&self, runtime: &Runtime, _config: &APIConfig) -> Result<()> { + let context = runtime.context(); + let global = context.global_object()?; + + let mut javy_object = global.get_property("Javy")?; + if javy_object.is_undefined() { + javy_object = context.object_value()?; + global.set_property("Javy", javy_object)?; + } + + global.set_property( + "__javy_io_writeSync", + context.wrap_callback(|_, _this_arg, args| { + let [fd, data, offset, length, ..] = args else { + anyhow::bail!("Invalid number of parameters"); + }; + + let mut fd: Box = match fd.try_into()? { + 1 => Box::new(std::io::stdout()), + 2 => Box::new(std::io::stderr()), + _ => anyhow::bail!("Only stdout and stderr are supported"), + }; + let data: Vec = data.try_into()?; + let offset: usize = offset.try_into()?; + let length: usize = length.try_into()?; + let data = &data[offset..(offset + length)]; + let n = fd.write(data)?; + fd.flush()?; + Ok(n.into()) + })?, + )?; + + global.set_property( + "__javy_io_readSync", + context.wrap_callback(|_, _this_arg, args| { + let [fd, data, offset, length, ..] = args else { + anyhow::bail!("Invalid number of parameters"); + }; + let mut fd: Box = match fd.try_into()? { + 0 => Box::new(std::io::stdin()), + _ => anyhow::bail!("Only stdin is supported"), + }; + let offset: usize = offset.try_into()?; + let length: usize = length.try_into()?; + if !data.is_array_buffer() { + anyhow::bail!("Data needs to be an ArrayBuffer"); + } + let data = data.as_bytes_mut()?; + let data = &mut data[offset..(offset + length)]; + let n = fd.read(data)?; + Ok(n.into()) + })?, + )?; + + context.eval_global("io.js", include_str!("io.js"))?; + Ok(()) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/text_encoding/mod.rs b/JS/wasm/crates/arakoo-core/src/apis/text_encoding/mod.rs new file mode 100644 index 000000000..ae595b1e3 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/text_encoding/mod.rs @@ -0,0 +1,102 @@ +use std::{borrow::Cow, str}; + +use anyhow::{anyhow, Result}; +use javy::{ + quickjs::{JSContextRef, JSError, JSValue, JSValueRef}, + Runtime, +}; + +use super::{APIConfig, JSApiSet}; + +pub(super) struct TextEncoding; + +impl JSApiSet for TextEncoding { + fn register(&self, runtime: &Runtime, _config: &APIConfig) -> Result<()> { + let context = runtime.context(); + let global = context.global_object()?; + global.set_property( + "__javy_decodeUtf8BufferToString", + context.wrap_callback(decode_utf8_buffer_to_js_string())?, + )?; + global.set_property( + "__javy_encodeStringToUtf8Buffer", + context.wrap_callback(encode_js_string_to_utf8_buffer())?, + )?; + + context.eval_global("text-encoding.js", include_str!("./text-encoding.js"))?; + Ok(()) + } +} + +fn decode_utf8_buffer_to_js_string( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]| { + if args.len() != 5 { + return Err(anyhow!("Expecting 5 arguments, received {}", args.len())); + } + + let buffer: Vec = args[0].try_into()?; + let byte_offset: usize = args[1].try_into()?; + let byte_length: usize = args[2].try_into()?; + let fatal: bool = args[3].try_into()?; + let ignore_bom: bool = args[4].try_into()?; + + let mut view = buffer + .get(byte_offset..(byte_offset + byte_length)) + .ok_or_else(|| { + anyhow!("Provided offset and length is not valid for provided buffer") + })?; + + if !ignore_bom { + view = match view { + // [0xEF, 0xBB, 0xBF] is the UTF-8 BOM which we want to strip + [0xEF, 0xBB, 0xBF, rest @ ..] => rest, + _ => view, + }; + } + + let str = + if fatal { + Cow::from(str::from_utf8(view).map_err(|_| { + JSError::Type("The encoded data was not valid utf-8".to_string()) + })?) + } else { + String::from_utf8_lossy(view) + }; + Ok(str.to_string().into()) + } +} + +fn encode_js_string_to_utf8_buffer( +) -> impl FnMut(&JSContextRef, JSValueRef, &[JSValueRef]) -> anyhow::Result { + move |_ctx: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]| { + if args.len() != 1 { + return Err(anyhow!("Expecting 1 argument, got {}", args.len())); + } + + let js_string: String = args[0].try_into()?; + Ok(js_string.into_bytes().into()) + } +} + +#[cfg(test)] +mod tests { + use super::{APIConfig, JSApiSet}; + use anyhow::Result; + use javy::Runtime; + + use super::TextEncoding; + + #[test] + fn test_text_encoder_decoder() -> Result<()> { + let runtime = Runtime::default(); + let context = runtime.context(); + TextEncoding.register(&runtime, &APIConfig::default())?; + let result = context.eval_global( + "main", + "let encoder = new TextEncoder(); let buffer = encoder.encode('hello'); let decoder = new TextDecoder(); decoder.decode(buffer) == 'hello';" + )?; + assert!(result.as_bool()?); + Ok(()) + } +} diff --git a/JS/wasm/crates/arakoo-core/src/apis/text_encoding/text-encoding.js b/JS/wasm/crates/arakoo-core/src/apis/text_encoding/text-encoding.js new file mode 100644 index 000000000..53fbe795b --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/text_encoding/text-encoding.js @@ -0,0 +1,81 @@ +(function () { + const __javy_decodeUtf8BufferToString = globalThis.__javy_decodeUtf8BufferToString; + const __javy_encodeStringToUtf8Buffer = globalThis.__javy_encodeStringToUtf8Buffer; + + class TextDecoder { + constructor(label = "utf-8", options = {}) { + label = label.trim().toLowerCase(); + const acceptedLabels = [ + "utf-8", + "utf8", + "unicode-1-1-utf-8", + "unicode11utf8", + "unicode20utf8", + "x-unicode20utf8", + ]; + if (!acceptedLabels.includes(label)) { + // Not spec-compliant behaviour + throw new RangeError("The encoding label provided must be utf-8"); + } + Object.defineProperties(this, { + encoding: { value: "utf-8", enumerable: true, writable: false }, + fatal: { value: !!options.fatal, enumerable: true, writable: false }, + ignoreBOM: { value: !!options.ignoreBOM, enumerable: true, writable: false }, + }); + } + + decode(input, options = {}) { + if (input === undefined) { + return ""; + } + + if (options.stream) { + throw new Error("Streaming decode is not supported"); + } + + // backing buffer would not have byteOffset and may have different byteLength + let byteOffset = input.byteOffset || 0; + let byteLength = input.byteLength; + if (ArrayBuffer.isView(input)) { + input = input.buffer; + } + + if (!(input instanceof ArrayBuffer)) { + throw new TypeError( + "The provided value is not of type '(ArrayBuffer or ArrayBufferView)'" + ); + } + + return __javy_decodeUtf8BufferToString( + input, + byteOffset, + byteLength, + this.fatal, + this.ignoreBOM + ); + } + } + + class TextEncoder { + constructor() { + Object.defineProperties(this, { + encoding: { value: "utf-8", enumerable: true, writable: false }, + }); + } + + encode(input = "") { + input = input.toString(); // non-string inputs are converted to strings + return new Uint8Array(__javy_encodeStringToUtf8Buffer(input)); + } + + encodeInto(source, destination) { + throw new Error("encodeInto is not supported"); + } + } + + globalThis.TextDecoder = TextDecoder; + globalThis.TextEncoder = TextEncoder; + + Reflect.deleteProperty(globalThis, "__javy_decodeUtf8BufferToString"); + Reflect.deleteProperty(globalThis, "__javy_encodeStringToUtf8Buffer"); +})(); diff --git a/JS/wasm/crates/arakoo-core/src/apis/types.rs b/JS/wasm/crates/arakoo-core/src/apis/types.rs new file mode 100644 index 000000000..3a9dc761e --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/apis/types.rs @@ -0,0 +1,48 @@ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; +use serde_bytes::ByteBuf; + +#[derive(Serialize, Deserialize, Debug)] +pub struct HttpRequest { + pub method: String, + pub uri: String, + #[serde(default)] + pub headers: HashMap, + pub params: HashMap, + pub body: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct HttpResponse { + pub status: u16, + #[serde(default)] + pub headers: HashMap, + pub body: Option, + pub status_text: String, + +} + +pub mod arakoo_http { + use anyhow::Result; + + /// The Arakoo HTTP request. + pub type Request = http::Request>; + + /// The Arakoo HTTP response. + pub type Response = http::Response>; + + /// Helper function to return a 404 Not Found response. + pub fn not_found() -> Result { + Ok(http::Response::builder() + .status(404) + .body(Some("Not Found".into()))?) + } + + /// Helper function to return a 500 Internal Server Error response. + pub fn internal_server_error() -> Result { + Ok(http::Response::builder() + .status(500) + .body(Some("Internal Server Error".into()))?) + } +} \ No newline at end of file diff --git a/JS/wasm/crates/arakoo-core/src/execution.rs b/JS/wasm/crates/arakoo-core/src/execution.rs new file mode 100644 index 000000000..c79e7407a --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/execution.rs @@ -0,0 +1,86 @@ +// use std::process; + +// use anyhow::{bail, Error, Result}; +// use apis::http::types::Response; +// use javy::{json, quickjs::JSContextRef, Runtime}; + +// pub fn run_bytecode(runtime: &Runtime, bytecode: &[u8]) { +// let context = runtime.context(); + +// context +// .eval_binary(bytecode) +// .and_then(|_| process_event_loop(context)) +// .unwrap_or_else(handle_error); +// } + +// #[allow(dead_code)] +// pub fn invoke_entrypoint( +// runtime: &Runtime, +// bytecode: &[u8], +// input: String, +// ) -> anyhow::Result { +// let context = runtime.context(); + +// match context.eval_binary(bytecode) { +// Ok(_) => {} +// Err(e) => { +// eprintln!("error"); +// eprintln!("Error while running bytecode: {e}"); +// return Err(e); +// } +// } +// let global = context.global_object().unwrap(); +// let entry_point = global.get_property("entrypoint").unwrap(); + +// let request = input; +// let input_bytes = request.as_bytes(); +// let input_value = json::transcode_input(context, input_bytes).unwrap_or_else(|e| { +// eprintln!("Error when transcoding input: {e}"); +// process::abort(); +// }); +// entry_point +// .call(&global, &[input_value]) +// .and_then(|_| process_event_loop(context)) +// .unwrap_or_else(handle_error); + +// let global = context.global_object().unwrap(); + +// let error = global.get_property("error").unwrap(); +// let output = global.get_property("result").unwrap(); + +// if !error.is_null_or_undefined() { +// let error = error.to_string(); +// eprintln!("Error while running JS: {error}"); +// process::abort(); +// } +// let output = json::transcode_output(output).unwrap(); +// let response: Response = serde_json::from_slice(&output).unwrap(); +// Ok(response) +// } + +// pub fn invoke_function(runtime: &Runtime, fn_module: &str, fn_name: &str) { +// let context = runtime.context(); +// let js = if fn_name == "default" { +// format!("import {{ default as defaultFn }} from '{fn_module}'; defaultFn();") +// } else { +// format!("import {{ {fn_name} }} from '{fn_module}'; {fn_name}();") +// }; +// context +// .eval_module("runtime.mjs", &js) +// .and_then(|_| process_event_loop(context)) +// .unwrap_or_else(handle_error); +// } + +// fn process_event_loop(context: &JSContextRef) -> Result<()> { +// if cfg!(feature = "experimental_event_loop") { +// context.execute_pending()?; +// } else if context.is_pending() { +// bail!("Adding tasks to the event queue is not supported"); +// } +// Ok(()) +// } + +// fn handle_error(e: Error) { +// eprintln!("Error while running JS: {e}"); +// process::abort(); +// } diff --git a/JS/wasm/crates/arakoo-core/src/lib.rs b/JS/wasm/crates/arakoo-core/src/lib.rs new file mode 100644 index 000000000..084472fc5 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/lib.rs @@ -0,0 +1,289 @@ +use anyhow::anyhow; +use anyhow::Result; +use javy::quickjs::from_qjs_value; +use javy::quickjs::to_qjs_value; +use javy::quickjs::JSContextRef; +use javy::quickjs::JSValue; +use javy::quickjs::JSValueRef; +use javy::Runtime; +use log::debug; +use log::info; +use once_cell::sync::OnceCell; +use send_wrapper::SendWrapper; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::io; +use std::io::Read; +use serde_bytes::ByteBuf; + +use crate::apis::types::HttpRequest; + +pub mod wit { + use wit_bindgen::generate; + + generate!({ + path:"../../wit", + world:"reactor", + }); + + use super::Guest; + export!(Guest); + + pub use self::arakoo::edgechains; + pub use self::arakoo::edgechains::http_types::{Method, Request, Response}; + pub use self::exports::arakoo::edgechains::inbound_http; +} + +struct Guest; + +// mod execution; +mod apis; +mod runtime; + +// const FUNCTION_MODULE_NAME: &str = "function.mjs"; + +// static mut COMPILE_SRC_RET_AREA: [u32; 2] = [0; 2]; +// static mut RUNTIME: OnceCell = OnceCell::new(); +static CONTEXT: OnceCell> = OnceCell::new(); +static HANDLER: OnceCell> = OnceCell::new(); +static GLOBAL: OnceCell> = OnceCell::new(); +static mut RUNTIME_INSTANCE: Option = None; +// static ON_RESOLVE: OnceCell> = OnceCell::new(); +// static ON_REJECT: OnceCell> = OnceCell::new(); +// static RESPONSE: Mutex> = Mutex::new(None); +// static EXCEPTION: Mutex> = Mutex::new(None); + +// fn on_resolve(context: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]) -> Result { +// // (*args).clone_into(&mut cloned_args); +// let mut qjs_value = Option::None; +// if args.len() > 0 { +// for arg in args { +// qjs_value = Some(from_qjs_value(*arg).unwrap()); +// // println!("Arg resolve: {:?}", qjs_value.as_ref().unwrap()); +// } +// RESPONSE.lock().unwrap().replace(qjs_value.unwrap()); +// Ok(JSValue::Undefined) +// } else { +// Err(anyhow!("expected 1 argument, got {}", args.len())) +// } +// } + +// fn on_reject(context: &JSContextRef, _this: JSValueRef, args: &[JSValueRef]) -> Result { +// // (*args).clone_into(&mut cloned_args); +// let mut qjs_value = Option::None; +// if args.len() > 0 { +// for arg in args { +// qjs_value = Some(from_qjs_value(*arg).unwrap()); +// println!("Arg reject : {:?}", qjs_value.as_ref().unwrap()); +// } +// EXCEPTION.lock().unwrap().replace(qjs_value.unwrap()); +// Ok(JSValue::Undefined) +// } else { +// Err(anyhow!("expected 1 argument, got {}", args.len())) +// } +// } + +/// Used by Wizer to preinitialize the module +#[export_name = "wizer.initialize"] +pub extern "C" fn init() { + let mut contents = String::new(); + let res = io::stdin().read_to_string(&mut contents); + env_logger::init(); + match res { + Ok(len) => println!("Read {} bytes", len), + Err(err) => println!( + "Error : no input file specified or corrupted input js file supplied \n{}", + err + ), + } + // println!("Contents : {}",contents); + unsafe { + if RUNTIME_INSTANCE.is_none() { + RUNTIME_INSTANCE = Some(runtime::new_runtime().unwrap()); + } + } + let runtime = unsafe { RUNTIME_INSTANCE.as_ref().unwrap() }; + let context = runtime.context(); + CONTEXT.set(SendWrapper::new(context)).unwrap(); + match context.eval_global("javascriptCode.js", &contents) { + Ok(_) => (), + Err(err) => panic!("Error in evaluating script function.js : {:?}", err), + }; + + let global = context + .global_object() + .expect("Unable to get global object"); + GLOBAL.set(SendWrapper::new(global)).unwrap(); + + // let hono = global.get_property("_export").unwrap(); + let entrypoint = global + .get_property("entrypoint") + .expect("Entrypoint not found"); + HANDLER.set(SendWrapper::new(entrypoint)).unwrap(); + + // let on_resolve = context.wrap_callback(on_resolve).unwrap(); + // ON_RESOLVE.set(SendWrapper::new(on_resolve)).unwrap(); + // let on_reject = context.wrap_callback(on_reject).unwrap(); + // ON_REJECT.set(SendWrapper::new(on_reject)).unwrap(); +} + +impl wit::inbound_http::Guest for Guest { + fn handle_request(req: wit::Request) -> wit::Response { + debug!("{:?}", req); + let context = **CONTEXT.get().unwrap(); + let mut serializer = + javy::quickjs::Serializer::from_context(context).expect("Unable to create serializer"); + // let handler = **HANDLER.get().unwrap(); + let request = HttpRequest { + method: match req.method { + wit::Method::Get => "GET".to_string(), + wit::Method::Post => "POST".to_string(), + wit::Method::Put => "PUT".to_string(), + wit::Method::Delete => "DELETE".to_string(), + wit::Method::Patch => "PATCH".to_string(), + wit::Method::Head => "HEAD".to_string(), + wit::Method::Options => "OPTIONS".to_string(), + }, + uri: req.uri, + headers: req + .headers + .iter() + .map(|(k, v)| Ok((k.as_str().to_owned(), v.as_str().to_owned()))) + .collect::>>() + .unwrap(), + params: req + .params + .iter() + .map(|(k, v)| Ok((k.as_str().to_owned(), v.as_str().to_owned()))) + .collect::>>() + .unwrap(), + body: req.body.map(|bytes| ByteBuf::from::>(bytes)), + }; + // let hono_event = + // hono_event.serialize(&mut serializer).unwrap(); + request + .serialize(&mut serializer) + .expect("unable to serialize httprequest"); + let request_value = serializer.value; + // println!("body of httpRequest : {:?}", from_qjs_value(request_value).unwrap()); + let global = GLOBAL.get().unwrap(); + // let entrypoint = global + // .get_property("entrypoint") + // .expect("Unable to get entrypoint"); + let entrypoint = **HANDLER.get().unwrap(); + entrypoint + .call(global, &[request_value]) + .expect("Unable to call handler"); + + context + .execute_pending() + .expect("Unable to execute pending tasks"); + + let result = global.get_property("result").unwrap(); + let error = global.get_property("error").unwrap(); + let response = from_qjs_value(result).unwrap(); + let error = from_qjs_value(error).unwrap(); + debug!("Result : {:?}", response); + if error.to_string() != "null"{ + println!("Error : {:?}", error); + } + // let response = to_qjs_value(context, &RESPONSE.lock().unwrap().take().unwrap()).unwrap(); + // let response = RESPONSE.lock().unwrap().take().unwrap(); + + // let deserializer = &mut Deserializer::from(response); + // let response = HttpResponse::deserialize(deserializer).unwrap(); + // println!("Http Response {:?}", response); + if let JSValue::Object(obj) = response { + let status_code_ref = to_qjs_value(context, obj.get("status").unwrap()).unwrap(); + let status_code = status_code_ref.as_i32_unchecked(); + let status_text_ref = to_qjs_value(context, obj.get("statusText").unwrap()).unwrap(); + let status_text = status_text_ref.as_str().unwrap(); + let body_ref = to_qjs_value(context, obj.get("body").unwrap()).unwrap(); + let headers_obj = obj.get("headers").unwrap(); + let mut headers_vec = Vec::new(); + // let headers_obj = match headers { + // JSValue::Object(obj) => obj, + // _ => panic!("Headers is not object {:?}", headers), + // }; + if let JSValue::Object(headers_obj) = headers_obj { + for (k, v) in headers_obj.iter() { + let key = k.clone(); + let value = (*v).to_string(); + headers_vec.push((key.to_string(), value.to_string())); + } + } + wit::Response { + status: status_code as u16, + headers: Some(headers_vec), + body: Some(body_ref.as_str().unwrap().as_bytes().to_vec()), + status_text: status_text.to_string(), + } + } else { + panic!("Response is not object {:?}", response); + } + } +} + +/// Compiles JS source code to QuickJS bytecode. +/// +/// Returns a pointer to a buffer containing a 32-bit pointer to the bytecode byte array and the +/// u32 length of the bytecode byte array. +/// +/// # Arguments +/// +/// * `js_src_ptr` - A pointer to the start of a byte array containing UTF-8 JS source code +/// * `js_src_len` - The length of the byte array containing JS source code +/// +/// # Safety +/// +/// * `js_src_ptr` must reference a valid array of unsigned bytes of `js_src_len` length +// #[export_name = "compile_src"] +// pub unsafe extern "C" fn compile_src(js_src_ptr: *const u8, js_src_len: usize) -> *const u32 { +// // Use fresh runtime to avoid depending on Wizened runtime +// let runtime = runtime::new_runtime().unwrap(); +// let js_src = str::from_utf8(slice::from_raw_parts(js_src_ptr, js_src_len)).unwrap(); +// let bytecode = runtime +// .context() +// .compile_module(FUNCTION_MODULE_NAME, js_src) +// .unwrap(); +// let bytecode_len = bytecode.len(); +// // We need the bytecode buffer to live longer than this function so it can be read from memory +// let bytecode_ptr = Box::leak(bytecode.into_boxed_slice()).as_ptr(); +// COMPILE_SRC_RET_AREA[0] = bytecode_ptr as u32; +// COMPILE_SRC_RET_AREA[1] = bytecode_len.try_into().unwrap(); +// COMPILE_SRC_RET_AREA.as_ptr() +// } + +/// Evaluates QuickJS bytecode +/// +/// # Safety +/// +/// * `bytecode_ptr` must reference a valid array of unsigned bytes of `bytecode_len` length +// #[export_name = "eval_bytecode"] +// pub unsafe extern "C" fn eval_bytecode(bytecode_ptr: *const u8, bytecode_len: usize) { +// let runtime = RUNTIME.get().unwrap(); +// let bytecode = slice::from_raw_parts(bytecode_ptr, bytecode_len); +// execution::run_bytecode(runtime, bytecode); +// } + +/// Evaluates QuickJS bytecode and invokes the exported JS function name. +/// +/// # Safety +/// +/// * `bytecode_ptr` must reference a valid array of bytes of `bytecode_len` +/// length. +/// * `fn_name_ptr` must reference a UTF-8 string with `fn_name_len` byte +/// length. +#[export_name = "invoke"] +pub unsafe extern "C" fn invoke( + bytecode_ptr: *const u8, + bytecode_len: usize, + fn_name_ptr: *const u8, + fn_name_len: usize, +) { + // let runtime = RUNTIME.get().unwrap(); + // let bytecode = slice::from_raw_parts(bytecode_ptr, bytecode_len); + // let fn_name = str::from_utf8_unchecked(slice::from_raw_parts(fn_name_ptr, fn_name_len)); + // execution::run_bytecode(runtime, bytecode); + // execution::invoke_function(runtime, FUNCTION_MODULE_NAME, fn_name); +} diff --git a/JS/wasm/crates/arakoo-core/src/runtime.rs b/JS/wasm/crates/arakoo-core/src/runtime.rs new file mode 100644 index 000000000..1fd3745d6 --- /dev/null +++ b/JS/wasm/crates/arakoo-core/src/runtime.rs @@ -0,0 +1,9 @@ +use anyhow::Result; +use javy::{Config, Runtime}; +use super::apis::{APIConfig, LogStream, RuntimeExt}; + +pub fn new_runtime() -> Result { + let mut api_config = APIConfig::default(); + api_config.log_stream(LogStream::StdErr); + Runtime::new_with_apis(Config::default(), api_config) +} diff --git a/JS/wasm/crates/cli/Cargo.toml b/JS/wasm/crates/cli/Cargo.toml new file mode 100644 index 000000000..28e1403e7 --- /dev/null +++ b/JS/wasm/crates/cli/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "cli" +edition.workspace = true +version.workspace = true +build = "build.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[[bin]] +name = "arakoo-compiler" +path = "src/main.rs" + +[dependencies] +wizer = { workspace = true } +anyhow = { workspace = true } +clap = { version = "4.1.4", features = ["derive"] } +binaryen = { git = "https://github.com/pepyakin/binaryen-rs" } +wit-component = { version = "0.208.1" } + +[build-dependencies] +anyhow = "1.0.79" +wizer = { workspace = true } diff --git a/JS/wasm/crates/cli/build.rs b/JS/wasm/crates/cli/build.rs new file mode 100644 index 000000000..4fa2cd1ee --- /dev/null +++ b/JS/wasm/crates/cli/build.rs @@ -0,0 +1,98 @@ +use std::env; +use std::fs; +use std::io::{Read, Write}; + +use std::path::{Path, PathBuf}; + +use anyhow::Result; + +fn main() -> Result<()> { + let out_dir = PathBuf::from(env::var("OUT_DIR")?); + // copy wasi_snapshot_preview1.reactor.wasm file from current directory to OUT_DIR + fs::copy("wasi_snapshot_preview1.reactor.wasm", out_dir.join("adapter.wasm"))?; + println!("cargo:rerun-if-changed=wasi_snapshot_preview1.reactor.wasm"); + println!("cargo:warning=copied wasi_snapshot_preview1.reactor.wasm to adapter.wasm in OUT_DIR"); + if let Ok("cargo-clippy") = env::var("CARGO_CFG_FEATURE").as_ref().map(String::as_str) { + stub_javy_core_for_clippy() + } else { + copy_javy_core() + } +} + +// When using clippy, we need to write stubbed engine.wasm and provider.wasm files to ensure +// compilation succeeds. This skips building the actual engine.wasm and provider.wasm that would +// be injected into the CLI binary. +fn stub_javy_core_for_clippy() -> Result<()> { + let out_dir = PathBuf::from(env::var("OUT_DIR")?); + let engine_path = out_dir.join("engine.wasm"); + // let provider_path = out_dir.join("provider.wasm"); + + if !engine_path.exists() { + std::fs::write(engine_path, [])?; + println!("cargo:warning=using stubbed engine.wasm for static analysis purposes..."); + } + + // if !provider_path.exists() { + // std::fs::write(provider_path, [])?; + // println!("cargo:warning=using stubbed provider.wasm for static analysis purposes..."); + // } + Ok(()) +} + +// fn read_file(path: impl AsRef) -> Result> { +// let mut buf: Vec = vec![]; +// fs::File::open(path.as_ref())?.read_to_end(&mut buf)?; +// Ok(buf) +// } + +// Copy the engine binary build from the `core` crate +fn copy_javy_core() -> Result<()> { + let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR")?; + // let if build mode is release or debug + + let module_path = if cfg!(debug_assertions) { + PathBuf::from(&cargo_manifest_dir) + .parent() + .unwrap() + .parent() + .unwrap() + .join("../../target/wasm32-wasip1/debug/") + } else { + println!("cargo:warning=using release build for arakoo_js_engine..."); + PathBuf::from(&cargo_manifest_dir) + .parent() + .unwrap() + .parent() + .unwrap() + .join("../../target/wasm32-wasip1/release/") + }; + + let engine_path = module_path.join("arakoo_js_engine.wasm"); + // let quickjs_provider_path = module_path.join("javy_quickjs_provider.wasm"); + // let quickjs_provider_wizened_path = module_path.join("javy_quickjs_provider_wizened.wasm"); + + // let mut wizer = wizer::Wizer::new(); + // let wizened = wizer + // .allow_wasi(true)? + // .wasm_bulk_memory(true) + // .run(read_file(&quickjs_provider_path)?.as_slice())?; + // fs::File::create(&quickjs_provider_wizened_path)?.write_all(&wizened)?; + + println!("cargo:rerun-if-changed={}", engine_path.to_str().unwrap()); + // println!( + // "cargo:rerun-if-changed={}", + // quickjs_provider_path.to_str().unwrap() + // ); + println!("cargo:rerun-if-changed=build.rs"); + + if engine_path.exists() { + let out_dir = env::var("OUT_DIR")?; + let copied_engine_path = Path::new(&out_dir).join("engine.wasm"); + // let copied_provider_path = Path::new(&out_dir).join("provider.wasm"); + + fs::copy(&engine_path, copied_engine_path)?; + println!("cargo:warning=copied engine.wasm to OUT_DIR"); + // fs::copy(&quickjs_provider_wizened_path, copied_provider_path)?; + } + Ok(()) +} diff --git a/JS/wasm/crates/cli/src/main.rs b/JS/wasm/crates/cli/src/main.rs new file mode 100644 index 000000000..9ed87efd8 --- /dev/null +++ b/JS/wasm/crates/cli/src/main.rs @@ -0,0 +1,109 @@ +use anyhow::bail; +use anyhow::Context; +use anyhow::Result; +use binaryen::CodegenConfig; +use binaryen::Module; +use clap::Parser; +use std::fs; +use std::io::Read; +use std::process::Command; +use std::{env, fs::File, path::PathBuf}; +use wit_component::ComponentEncoder; +use wizer::Wizer; + +const VERSION: &str = env!("CARGO_PKG_VERSION"); + +#[derive(Debug, Parser)] +#[clap( + about = "A utility to convert js to arakoo runtime compatible wasm component", + version = VERSION +)] +pub struct Options { + pub input: PathBuf, + #[arg(short = 'o', default_value = "index.wasm")] + pub output: PathBuf, +} + +fn main() -> Result<()> { + let opts = Options::parse(); + if env::var("EDECHAINS_JS_WIZEN").eq(&Ok("1".into())) { + env::remove_var("EDECHAINS_JS_WIZEN"); + // remove unnecessary env var except RUST_LOG + for (key, _) in env::vars() { + if key.eq("RUST_LOG") || key.eq("JS_LOG") { + } else { + env::remove_var(&key); + } + } + + println!("\nStarting to build arakoo compatible module"); + // let wasm: Vec = + // if let Ok(wasm_bytes) = std::fs::read(concat!(env!("OUT_DIR"), "/engine.wasm")) { + // wasm_bytes + // } else { + // // Provide a fallback wasm binary if the file is not found + // panic!("Engine wasm not found"); + // }; + let wasm: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/engine.wasm")); + + println!("Preinitializing using Wizer"); + let mut wasm = Wizer::new() + .allow_wasi(true)? + .inherit_stdio(true) + .wasm_bulk_memory(true) + .inherit_env(true) + .run(wasm)?; + + let codegen_config = CodegenConfig { + optimization_level: 3, + shrink_level: 0, + debug_info: false, + }; + + println!("Optimizing wasm binary using wasm-opt"); + + if let Ok(mut module) = Module::read(&wasm) { + module.optimize(&codegen_config); + module + .run_optimization_passes(vec!["strip"], &codegen_config) + .expect("Unable to optimize"); + wasm = module.write(); + } else { + bail!("Unable to read wasm binary for wasm-opt optimizations"); + } + + println!("Adapting module for component model"); + wasm = ComponentEncoder::default() + .validate(true) + .module(&wasm)? + .adapter( + "wasi_snapshot_preview1", + include_bytes!(concat!(env!("OUT_DIR"), "/adapter.wasm")) + )? + .encode()?; + + fs::write(&opts.output, wasm)?; + return Ok(()); + } + + let script = File::open(&opts.input) + .with_context(|| format!("Failed to open input file {}", opts.input.display()))?; + + let self_cmd = env::args().next().expect("No self command"); + env::set_var("EDECHAINS_JS_WIZEN", "1"); + + let status = Command::new(self_cmd) + .arg(&opts.input) + .arg("-o") + .arg(&opts.output) + .stdin(script) + .status()?; + + if !status.success() { + anyhow::bail!("Failed to convert js to wasm"); + } + + println!("Arakoo compatible module built successfully"); + + Ok(()) +} diff --git a/JS/wasm/crates/cli/wasi_snapshot_preview1.reactor.wasm b/JS/wasm/crates/cli/wasi_snapshot_preview1.reactor.wasm new file mode 100644 index 000000000..8149eb955 Binary files /dev/null and b/JS/wasm/crates/cli/wasi_snapshot_preview1.reactor.wasm differ diff --git a/JS/wasm/crates/serve/Cargo.toml b/JS/wasm/crates/serve/Cargo.toml new file mode 100644 index 000000000..474b2b344 --- /dev/null +++ b/JS/wasm/crates/serve/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "serve" +edition.workspace = true +version.workspace = true + +[[bin]] +name = "arakoo" +path = "src/main.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies] +wasmtime = { workspace = true } +wasmtime-wasi = { workspace = true } +anyhow = { workspace = true } +serde = { workspace = true } +serde_json = "1" +tokio = { version = "1.21.2", features = ["full"] } +tracing = { version = "0.1.37" , features = ["log"] } +hyper = { version = "0.14.26", features = ["full"] } +futures = "0.3.24" +tracing-subscriber = { version = "^0.3.18", features = ["env-filter", "fmt"] } +jrsonnet-evaluator = { version = "0.5.0-pre95" } +jrsonnet-parser = { version = "0.5.0-pre95" } +jrsonnet-stdlib = { version = "0.5.0-pre95" } + +arakoo-jsonnet = { path = "../../../jsonnet" } +async-trait = "0.1.80" +http = {workspace = true} +reqwest = {workspace = true} diff --git a/JS/wasm/crates/serve/src/binding.rs b/JS/wasm/crates/serve/src/binding.rs new file mode 100644 index 000000000..b4be01074 --- /dev/null +++ b/JS/wasm/crates/serve/src/binding.rs @@ -0,0 +1,149 @@ +use super::http_types::{Headers, HttpError, Method, Response}; +use async_trait::async_trait; +use http::HeaderMap; +use reqwest::Url; + +// use std::{ +// env, +// sync::{Arc, Mutex}, +// }; + +// use arakoo_jsonnet::{ +// ext_string, jsonnet_destroy, jsonnet_evaluate_file, jsonnet_evaluate_snippet, jsonnet_make, +// }; +use jrsonnet_evaluator::{ + function::TlaArg, gc::GcHashMap, manifest::ManifestFormat, trace::TraceFormat, State, +}; +use jrsonnet_parser::IStr; + +use std::{fs, io}; +// use tokio::runtime::Builder; +use tracing::error; +// use wasmtime::*; + + +#[async_trait] +impl super::utils::Host for super::Host { + async fn read_file(&mut self, path: String) -> wasmtime::Result { + let code = fs::read_to_string(&path).map_err(|e| { + error!("Failed to read file {}: {}", path, e); + io::Error::new(io::ErrorKind::Other, e) + })?; + Ok(code) + } +} + +#[async_trait] +impl super::outbound_http::Host for super::Host { + async fn send_request( + &mut self, + req: super::http_types::Request, + ) -> wasmtime::Result> { + // println!("Sending request: {:?}", request); + Ok(async { + tracing::log::trace!("Attempting to send outbound HTTP request to {}", req.uri); + + let method = method_from(req.method); + let url = Url::parse(&req.uri).map_err(|_| HttpError::InvalidUrl)?; + let headers = request_headers(req.headers).map_err(|_| HttpError::RuntimeError)?; + let body = req.body.unwrap_or_default().to_vec(); + + if !req.params.is_empty() { + tracing::log::warn!("HTTP params field is deprecated"); + } + + // Allow reuse of Client's internal connection pool for multiple requests + // in a single component execution + let client = self.client.get_or_insert_with(Default::default); + + let resp = client + .request(method, url) + .headers(headers) + .body(body) + .send() + .await + .map_err(log_reqwest_error)?; + tracing::log::trace!("Returning response from outbound request to {}", req.uri); + response_from_reqwest(resp).await + } + .await) + } +} + +pub fn log_reqwest_error(err: reqwest::Error) -> HttpError { + let error_desc = if err.is_timeout() { + "timeout error" + } else if err.is_connect() { + "connection error" + } else if err.is_body() || err.is_decode() { + "message body error" + } else if err.is_request() { + "request error" + } else { + "error" + }; + tracing::warn!( + "Outbound HTTP {}: URL {}, error detail {:?}", + error_desc, + err.url() + .map(|u| u.to_string()) + .unwrap_or_else(|| "".to_owned()), + err + ); + HttpError::RuntimeError +} + +pub fn method_from(m: Method) -> http::Method { + match m { + Method::Get => http::Method::GET, + Method::Post => http::Method::POST, + Method::Put => http::Method::PUT, + Method::Delete => http::Method::DELETE, + Method::Patch => http::Method::PATCH, + Method::Head => http::Method::HEAD, + Method::Options => http::Method::OPTIONS, + } +} + +pub async fn response_from_reqwest(res: reqwest::Response) -> Result { + let status = res.status().as_u16(); + let headers = response_headers(res.headers()).map_err(|_| HttpError::RuntimeError)?; + let status_text = (&res.status().canonical_reason().unwrap_or("")).to_string(); + let body = Some( + res.bytes() + .await + .map_err(|_| HttpError::RuntimeError)? + .to_vec(), + ); + + Ok(Response { + status, + headers, + body, + status_text, + }) +} + +pub fn request_headers(h: Headers) -> anyhow::Result { + let mut res = HeaderMap::new(); + for (k, v) in h { + res.insert( + http::header::HeaderName::try_from(k)?, + http::header::HeaderValue::try_from(v)?, + ); + } + Ok(res) +} + +pub fn response_headers(h: &HeaderMap) -> anyhow::Result>> { + let mut res: Vec<(String, String)> = vec![]; + + for (k, v) in h { + res.push(( + k.to_string(), + std::str::from_utf8(v.as_bytes())?.to_string(), + )); + } + + Ok(Some(res)) +} diff --git a/JS/wasm/crates/serve/src/io.rs b/JS/wasm/crates/serve/src/io.rs new file mode 100644 index 000000000..30668a23c --- /dev/null +++ b/JS/wasm/crates/serve/src/io.rs @@ -0,0 +1,147 @@ +use std::collections::HashMap; + +use hyper::{header::HOST, http::request::Parts, HeaderMap, Uri}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize,Deserialize,Debug,Clone)] +pub enum Method { + GET, + POST, + PUT, + DELETE, + PATCH, + HEAD, + OPTIONS, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct WasmInput { + pub uri: String, + pub method: Method, + pub headers: Vec<(String, String)>, + pub body: Option>, + pub params: Vec<(String, String)>, +} + +#[derive(Deserialize, Debug, Clone, Serialize)] +pub struct WasmOutput { + pub headers: HashMap, + pub status: u16, + #[serde(rename = "statusText")] + pub status_text: String, + pub body: Option, +} + +impl WasmInput { + pub fn new(request: &Parts, body: String) -> Self { + let mut params: Vec<(String, String)> = vec![]; + + if let Some(query) = request.uri.query() { + for pair in query.split('&') { + let mut parts = pair.split('='); + let key = parts.next().unwrap(); + let value = parts.next().unwrap(); + params.push((key.to_string(), value.to_string())); + } + } + + let uri = Self::build_uri(request); + + Self { + uri, + method: Self::build_method(&request.method), + headers: Self::build_headers(&request.headers), + body: Self::build_body(body), + params, + } + } + + + fn build_uri(request: &Parts) -> String { + Uri::builder() + .scheme("http") + .authority(request.headers.get(HOST).unwrap().to_str().unwrap()) + .path_and_query(request.uri.path_and_query().unwrap().clone()) + .build() + .unwrap() + .to_string() + } + + fn build_headers(req_headers: &HeaderMap) -> Vec<(String, String)> { + let mut headers: Vec<(String, String)> = vec![]; + + for (key, value) in req_headers.iter() { + headers.push(( + String::from(key.as_str()), + String::from(value.to_str().unwrap().to_string()), + )); + } + + headers + } + + fn build_method(method: &hyper::Method) -> Method { + let method: Method = match method { + &hyper::Method::GET => Method::GET, + &hyper::Method::POST => Method::POST, + &hyper::Method::PUT => Method::PUT, + &hyper::Method::DELETE => Method::DELETE, + &hyper::Method::PATCH => Method::PATCH, + &hyper::Method::HEAD => Method::HEAD, + &hyper::Method::OPTIONS => Method::OPTIONS, + _ => Method::GET, + }; + method + } + + fn build_body(body:String) -> Option> { + if body.is_empty() { + None + } else { + Some(body.into_bytes()) + } + } +} + + +impl WasmOutput { + pub fn body(&self) -> String { + self.body.clone().unwrap_or_default() + } + + pub(crate) fn new() -> Self { + Self { + headers: HashMap::new(), + status: 200, + status_text: "OK".to_string(), + body: Some(String::new()), + } + } + + pub async fn from_reqwest_response(response: reqwest::Response) -> anyhow::Result { + let headers = response.headers().clone(); + let status = response.status().as_u16(); + let status_text = response.status().to_string(); + let body = response.text().await?; + + Ok(Self { + headers: Self::build_headers_hash(&headers), + status, + status_text, + body: Some(body), + }) + } + + fn build_headers_hash(headers: &reqwest::header::HeaderMap) -> HashMap { + let mut parsed_headers = HashMap::new(); + + for (key, value) in headers.iter() { + parsed_headers.insert( + key.as_str().to_string(), + value.to_str().unwrap_or_default().to_string(), + ); + } + + parsed_headers + } +} diff --git a/JS/wasm/crates/serve/src/lib.rs b/JS/wasm/crates/serve/src/lib.rs new file mode 100644 index 000000000..2592f7718 --- /dev/null +++ b/JS/wasm/crates/serve/src/lib.rs @@ -0,0 +1,431 @@ +// mod binding; +use wit::arakoo::edgechains::http as outbound_http; +use wit::arakoo::edgechains::http_types::HttpError; + +mod binding; +mod io; + +use std::{ + collections::HashMap, + convert::Infallible, + env, + future::Future, + net::SocketAddr, + path::Path, + pin::Pin, + str::FromStr, + sync::{Arc, Mutex}, + task::{self, Poll}, +}; + +use anyhow::Context; +// use binding::add_fetch_to_linker; +// use binding::add_exports_to_linker; +use futures::future::{self, Ready}; +use hyper::{ + header::{HeaderName, HeaderValue}, + http::request::Parts, + server::conn::AddrStream, + service::Service, + Body, Request, Response, +}; + +use tracing::{error, event, info, Level}; +use tracing_subscriber::{filter::EnvFilter, FmtSubscriber}; +// use wasi_common::WasiCtx; +use wasmtime_wasi::{bindings, ResourceTable, WasiCtx, WasiCtxBuilder, WasiView}; + +use wasmtime::component::{Component, Linker}; +use wasmtime::{Config, Engine, Store, WasmBacktraceDetails}; +use wit::arakoo::edgechains::http_types; +use wit::arakoo::edgechains::utils; +use wit::exports::arakoo::edgechains::inbound_http::{self}; + +use crate::{ + // binding::add_jsonnet_to_linker, + io::{WasmInput, WasmOutput}, +}; + +mod wit { + wasmtime::component::bindgen!({ + path:"../../wit", + world:"reactor", + async:true + }); +} + +#[derive(Clone)] +pub struct RequestService { + worker_ctx: WorkerCtx, +} + +impl RequestService { + /// Create a new request service. + fn new(ctx: WorkerCtx) -> Self { + Self { worker_ctx: ctx } + } +} + +#[derive(Clone)] +pub struct WorkerCtx { + engine: Engine, + component: Component, +} + +struct Host { + table: ResourceTable, + wasi: WasiCtx, + client: Option, +} + +impl WasiView for Host { + fn table(&mut self) -> &mut ResourceTable { + &mut self.table + } + + fn ctx(&mut self) -> &mut wasmtime_wasi::WasiCtx { + &mut self.wasi + } +} + +impl http_types::Host for Host {} + +impl WorkerCtx { + pub fn new(component_path: impl AsRef) -> anyhow::Result { + tracing_subscriber(); + info!("Loading Component from {:?}", component_path.as_ref()); + let mut binding = Config::default(); + let config = binding.async_support(true).wasm_component_model(true); + // check if env has debug flag + if env::var("DEBUG").is_ok() { + config + .debug_info(true) + .wasm_backtrace(true) + .coredump_on_trap(true) // Enable core dumps on trap + .wasm_backtrace_details(WasmBacktraceDetails::Enable); + } + + let engine = Engine::new(&config)?; + let component = Component::from_file(&engine, component_path) + .with_context(|| format!("Failed to load component : invalid path"))?; + + Ok(Self { engine, component }) + } + + pub fn component(&self) -> &Component { + &self.component + } + + pub fn engine(&self) -> &Engine { + &self.engine + } + + pub async fn serve(self, addr: SocketAddr) -> Result<(), hyper::Error> { + info!("Starting server ..."); + let server = hyper::Server::bind(&addr).serve(self); + event!(Level::INFO, "Listening on http://{}", server.local_addr()); + server.await?; + Ok(()) + } + + pub async fn handle_request( + &self, + request: hyper::Request, + ) -> anyhow::Result<(Response, Option)> { + let (parts, body) = request.into_parts(); + info!("Handling request: {:?} {:?}", parts.method, parts.uri); + let body = hyper::body::to_bytes(body).await.unwrap(); + let body_str = String::from_utf8_lossy(&body).to_string(); + let result = self.run(&parts, body_str).await; + + match result { + Ok(output) => { + let mut response = Response::builder(); + response = response.status(output.status); + + let headers = output.headers.clone(); + let headers_vec: Vec<(String, String)> = headers + .into_iter() + .map(|(k, v)| (k.to_owned(), v.to_owned())) + .collect(); + headers_vec.iter().for_each(|(key, value)| { + response.headers_mut().unwrap().insert( + HeaderName::from_str(key).unwrap(), + HeaderValue::from_str(value).unwrap(), + ); + }); + + let response = response.body(Body::from(output.body())).unwrap(); + Ok((response, None)) + } + + Err(e) => { + error!("Error: {:?}", e); + let response = Response::builder() + .status(500) + .body(Body::from("Internal Server Error")) + .unwrap(); + Ok((response, Some(e))) + } + } + } + + /// Runs the WebAssembly module with the provided request parts and body. + /// + /// This function sets up the necessary state and memory management for running the WebAssembly + /// module, including setting up the input and output buffers, and wrapping the necessary + /// functions to be called from WebAssembly. + async fn run(&self, parts: &Parts, body: String) -> anyhow::Result { + // Serialize the request parts and body into a JSON input for the WebAssembly module. + // let input = serde_json::to_vec(&WasmInput::new(parts, body)).unwrap(); + // let mem_len = input.len() as i32; + + // Create a new linker with the WASI context. + let mut linker = Linker::new(self.engine()); + // wasmtime_wasi::add_to_linker(&mut linker, |ctx| ctx)?; + bindings::cli::environment::add_to_linker(&mut linker, |x| x) + .expect("Unable to add environment"); + bindings::cli::exit::add_to_linker(&mut linker, |x| x).expect("Unable to add cli"); + bindings::io::error::add_to_linker(&mut linker, |x| x).expect("Unable to add io error"); + // bindings::sync::io::streams::add_to_linker(&mut linker, |x| x) + // .expect("Unable to add io streams"); + bindings::io::poll::add_to_linker(&mut linker, |x| x).expect("unable to add io poll"); + bindings::io::streams::add_to_linker(&mut linker, |x| x).expect("Unable to add io streams"); + bindings::cli::stdin::add_to_linker(&mut linker, |x| x).expect("Unable to add cli stdin"); + bindings::cli::stdout::add_to_linker(&mut linker, |x| x).expect("Unable to add cli stdout"); + bindings::cli::stderr::add_to_linker(&mut linker, |x| x).expect("Unable to add cli stderr"); + bindings::cli::terminal_input::add_to_linker(&mut linker, |x| x) + .expect("Unable to add cli terminal input"); + bindings::cli::terminal_output::add_to_linker(&mut linker, |x| x) + .expect("Unable to add cli terminal output"); + bindings::cli::terminal_stdin::add_to_linker(&mut linker, |x| x) + .expect("Unable to add cli terminal stdin"); + bindings::cli::terminal_stdout::add_to_linker(&mut linker, |x| x) + .expect("Unable to add cli terminal stdout"); + bindings::cli::terminal_stderr::add_to_linker(&mut linker, |x| x) + .expect("Unable to add cli terminal stderr"); + bindings::clocks::monotonic_clock::add_to_linker(&mut linker, |x| x) + .expect("Unable to add clocks monotonic clock"); + bindings::clocks::wall_clock::add_to_linker(&mut linker, |x| x) + .expect("Unable to add clocks wallclock"); + // bindings::sync::filesystem::types::add_to_linker(&mut linker, |x| x) + // .expect("Unable to add filesystem types"); + bindings::filesystem::types::add_to_linker(&mut linker, |x| x) + .expect("Unable to add filesystem types"); + bindings::filesystem::preopens::add_to_linker(&mut linker, |x| x) + .expect("Unable to add filesystem preopens"); + bindings::random::random::add_to_linker(&mut linker, |x| x).expect("Unable to add random"); + + // Wrap the `get_request_len` function to be called from WebAssembly. + // This function returns the length of the input buffer. + // linker.func_wrap("arakoo", "get_request_len", move || -> i32 { mem_len })?; + + // Wrap the `get_request` function to be called from WebAssembly. + // This function writes the input buffer to the specified memory location. + // match linker.func_wrap( + // "arakoo", + // "get_request", + // move |mut caller: Caller<'_, WasiCtx>, ptr: i32| { + // let mem = match caller.get_export("memory") { + // Some(Extern::Memory(mem)) => mem, + // _ => return Err(Trap::NullReference.into()), + // }; + // let offset = ptr as u32 as usize; + // match mem.write(&mut caller, offset, &input) { + // Ok(_) => {} + // _ => return Err(Trap::MemoryOutOfBounds.into()), + // }; + // Ok(()) + // }, + // ) { + // Ok(_) => {} + // Err(e) => { + // println!("Error adding get_request: {}", e); + // } + // } + + // Create a shared output buffer that will be used to store the result of the WebAssembly execution. + // let output: Arc> = Arc::new(Mutex::new(WasmOutput::new())); + // let output_clone = output.clone(); + + // Wrap the `set_output` function to be called from WebAssembly. + // This function reads the output buffer from the specified memory location and updates the shared output buffer. + // linker.func_wrap( + // "arakoo", + // "set_output", + // move |mut caller: Caller<'_, WasiCtx>, ptr: i32, len: i32| { + // let output = output_clone.clone(); + // let mem = match caller.get_export("memory") { + // Some(Extern::Memory(mem)) => mem, + // _ => return Err(Trap::NullReference.into()), + // }; + // let offset = ptr as u32 as usize; + // let mut buffer = vec![0; len as usize]; + // match mem.read(&caller, offset, &mut buffer) { + // Ok(_) => match serde_json::from_slice::(&buffer) { + // Ok(parsed_output) => { + // let mut output = output.lock().unwrap(); + // *output = parsed_output; + // Ok(()) + // } + // Err(_e) => Err(Trap::BadSignature.into()), + // }, + // _ => Err(Trap::MemoryOutOfBounds.into()), + // } + // }, + // )?; + + // Add additional exports to the linker, such as Jsonnet evaluation functions. + // add_jsonnet_to_linker(&mut linker)?; + // add_fetch_to_linker(&mut linker)?; + + // Create a WASI context builder with inherited standard output and error streams. + let wasi = WasiCtxBuilder::new() + .inherit_stdout() + .inherit_stderr() + .build(); + + let table: ResourceTable = ResourceTable::new(); + + // Create a new store with the WASI context. + let mut store = Store::new( + self.engine(), + Host { + table, + wasi, + client: None, + }, + ); + + // Instantiate the WebAssembly module with the linker and store. + // linker.module(&mut store, "", self.module())?; + + // Get the entrypoint function from the WebAssembly instance and call it. + // let instance = linker + // .instantiate_async(&mut store, self.module()) + // .await + // .map_err(anyhow::Error::msg)?; + // let run_entrypoint_fn = instance.get_typed_func::<(), ()>(&mut store, "run_entrypoint")?; + // run_entrypoint_fn + // .call_async(&mut store, ()) + // .await + // .map_err(anyhow::Error::msg)?; + let wasm_input = WasmInput::new(parts, body); + let request = inbound_http::Request { + method: match wasm_input.method { + io::Method::GET => http_types::Method::Get, + io::Method::POST => http_types::Method::Post, + io::Method::PUT => http_types::Method::Put, + io::Method::DELETE => http_types::Method::Delete, + io::Method::PATCH => http_types::Method::Patch, + io::Method::HEAD => http_types::Method::Head, + io::Method::OPTIONS => http_types::Method::Options, + }, + uri: wasm_input.uri, + headers: wasm_input.headers, + params: wasm_input.params, + body: wasm_input.body, + }; + wit::Reactor::add_to_linker(&mut linker, |x| x)?; + let (reactor, instance) = + wit::Reactor::instantiate_async(&mut store, self.component(), &linker).await?; + let guest = reactor.arakoo_edgechains_inbound_http(); + let result: Result = + guest.call_handle_request(&mut store, &request).await; + let mut wasm_output = WasmOutput::new(); + // println!("Result of guest calling: {:?}", &result); + match result { + Ok(res) => { + wasm_output.status = res.status; + wasm_output.status_text = res.status_text; + let mut headers_map = HashMap::new(); + for (key, val) in res.headers.unwrap().iter() { + headers_map.insert(key.to_owned(), val.to_owned()); + } + wasm_output.headers = headers_map; + let body_vec = res.body.unwrap(); + if body_vec.len() > 0 { + wasm_output.body = Some(String::from_utf8(body_vec).unwrap()); + } + } + Err(err) => println!("Error occured : {:?}", err), + }; + + // Drop the store to release resources. + drop(store); + Ok(wasm_output) + } + fn make_service(&self) -> RequestService { + RequestService::new(self.clone()) + } +} + +impl<'addr> Service<&'addr AddrStream> for WorkerCtx { + type Response = RequestService; + type Error = Infallible; + type Future = Ready>; + + fn poll_ready(&mut self, _cx: &mut task::Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _addr: &'addr AddrStream) -> Self::Future { + future::ok(self.make_service()) + } +} + +impl Service> for RequestService { + type Response = Response; + type Error = anyhow::Error; + #[allow(clippy::type_complexity)] + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, _cx: &mut task::Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Request) -> Self::Future { + let ctx = self.worker_ctx.clone(); + + Box::pin(async move { ctx.handle_request(req).await.map(|result| result.0) }) + } +} + +fn tracing_subscriber() { + let verbosity = match env::var("RUST_LOG_VERBOSITY") { + Ok(s) => s.parse().unwrap_or(0), + Err(_) => 0, + }; + + if env::var("RUST_LOG").ok().is_none() { + match verbosity { + 0 => env::set_var("RUST_LOG", "info"), + 1 => env::set_var("RUST_LOG", "debug"), + _ => env::set_var("RUST_LOG", "trace"), + } + } + + // Build a subscriber, using the default `RUST_LOG` environment variable for our filter. + let builder = FmtSubscriber::builder() + .with_writer(std::io::stderr) + .with_env_filter(EnvFilter::from_default_env()) + .with_ansi(true) + .with_target(false); + + match env::var("RUST_LOG_PRETTY") { + // If the `RUST_LOG_PRETTY` environment variable is set to "true", we should emit logs in a + // pretty, human-readable output format. + Ok(s) if s == "true" => builder + .pretty() + // Show levels, because ANSI escape sequences are normally used to indicate this. + .with_level(true) + .init(), + // Otherwise, we should install the subscriber without any further additions. + _ => builder.with_ansi(false).init(), + } + event!( + Level::DEBUG, + "RUST_LOG set to '{}'", + env::var("RUST_LOG").unwrap_or_else(|_| String::from("")) + ); +} diff --git a/JS/wasm/crates/serve/src/main.rs b/JS/wasm/crates/serve/src/main.rs new file mode 100644 index 000000000..cb6f461f9 --- /dev/null +++ b/JS/wasm/crates/serve/src/main.rs @@ -0,0 +1,20 @@ +use anyhow::{Ok, Result}; +use serve::WorkerCtx; +use std::env; + +#[tokio::main] +async fn main() -> Result<()> { + let wasm_path = env::args().nth(1).expect("Expected path to wasm file"); + let path = std::path::Path::new(&wasm_path); + if !path.exists() { + panic!("File not found: {}", wasm_path); + } + let addr = env::args().nth(2).unwrap_or("127.0.0.1".to_string()); + let port = env::args().nth(3).unwrap_or("8080".to_string()); + let addr = format!("{}:{}", addr, port) + .parse() + .expect("Invalid address"); + WorkerCtx::new(path)?.serve(addr).await?; + + Ok(()) +} diff --git a/JS/wasm/examples/ec-wasmjs-hono/.gitignore b/JS/wasm/examples/ec-wasmjs-hono/.gitignore new file mode 100644 index 000000000..a198a78d5 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/.gitignore @@ -0,0 +1,2 @@ +bin/ +node_modules/ \ No newline at end of file diff --git a/JS/wasm/examples/ec-wasmjs-hono/Dockerfile b/JS/wasm/examples/ec-wasmjs-hono/Dockerfile new file mode 100644 index 000000000..c1eacd0aa --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/Dockerfile @@ -0,0 +1,18 @@ +FROM node:20 as builder + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY build.js ./ +COPY src ./src + +RUN npm run build + +FROM tanjim/wasmjs:latest + +COPY --from=builder --chown=cnb:cnb --chmod=0777 /app/bin /app + +ENTRYPOINT [ "wasmjs-runtime", "/app" ] diff --git a/JS/wasm/examples/ec-wasmjs-hono/build.js b/JS/wasm/examples/ec-wasmjs-hono/build.js new file mode 100644 index 000000000..2b7a8559b --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/build.js @@ -0,0 +1,50 @@ +import { build } from "esbuild"; +import textReplace from "esbuild-plugin-text-replace"; +import fs from "fs"; +let runtime = process.argv[2]; + +// let jsonnetLoadPlugin = { +// name: "jsonnet-load", +// setup(build) { +// build.onLoad({ filter: /\.jsonnet$/ }, async (args) => { +// let code = await fs.promises.readFile(args.path, "utf-8"); +// return { +// contents: code, +// loader: "text", +// }; +// }) +// } +// } + +build({ + entryPoints: ["src/index.js", "src/example.jsonnet"], + // entryPoints: ["src/index.js"], + bundle: true, + // minify: true, + minifySyntax: true, + // outfile: "bin/app.js", + outdir: "bin", + // inject:["shim.js"], + // define:{ + // "export":"_export" + // }, + plugins: [ + textReplace({ + include: /src\/index.js$/, + pattern: [["export default", "_export = "]], + }), + ], + format: "cjs", + target: "esnext", + platform: "node", + // external: ["arakoo"], + loader: { + ".jsonnet": "copy", + }, + define: { + "process.env.arakoo": JSON.stringify(runtime === "arakoo"), + }, +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/examples/ec-wasmjs-hono/package.json b/JS/wasm/examples/ec-wasmjs-hono/package.json new file mode 100644 index 000000000..5bf433976 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/package.json @@ -0,0 +1,28 @@ +{ + "name": "ec-hono", + "type": "module", + "main": "bin/app.js", + "scripts": { + "build": "webpack && ../../../../target/release/arakoo-compiler bin/webpack.js", + "debug": "JS_LOG=debug RUST_LOG=debug ../../../../target/release/arakoo-compiler bin/webpack.js && RUST_LOG=debug RUST_BACKTRACE=1 ../../../../target/release/arakoo index.wasm", + "run": "../../../../target/release/arakoo index.wasm" + }, + "devDependencies": { + "@planetscale/database": "^1.4.0", + "esbuild": "^0.19", + "esbuild-plugin-text-replace": "^1.3.0", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "@arakoodev/edgechains.js": "link:../../../edgechains/arakoodev", + "@arakoodev/jsonnet": "link:../../../jsonnet", + "@hono/node-server": "^1.3.1", + "axios": "^1.6.2", + "crypto": "^1.0.1", + "hono": "^3.9", + "http": "^0.0.1-security", + "stream": "^0.0.2", + "zod": "^3.23.8" + } +} diff --git a/JS/wasm/examples/ec-wasmjs-hono/src/example.jsonnet b/JS/wasm/examples/ec-wasmjs-hono/src/example.jsonnet new file mode 100644 index 000000000..be87c119c --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/src/example.jsonnet @@ -0,0 +1,11 @@ +local name = 'bob'; +{ + p1: { + name: std.extVar('extName'), + age: 20, + }, + p2: { + name: name, + age: 30, + }, +} diff --git a/JS/wasm/examples/ec-wasmjs-hono/src/index.js b/JS/wasm/examples/ec-wasmjs-hono/src/index.js new file mode 100644 index 000000000..8aaed2dc3 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/src/index.js @@ -0,0 +1,129 @@ +import { Hono } from "hono"; +import { connect } from "@planetscale/database"; +import Jsonnet from "@arakoodev/jsonnet"; + +let jsonnet = new Jsonnet(); + +const app = new Hono(); + +function greet() { + return "Hello from JS"; +} + +const env = {}; + +app.get("/hello", (c) => { + return c.text("Hello World!"); +}); + +app.get("/xtz", async (c) => { + let result = jsonnet.extString("id", id).javascriptCallback("getAtodo", asyncGetAtodo) + .evaluateSnippet(` +local todo = std.parseJson(arakoo.native("getAtodo")(std.extVar("id"))); +{ +result : todo.title +}`); +}); + +app.get("/async-func/:id", async (c) => { + let id = c.req.param("id"); + async function asyncGetAtodo(id) { + try { + let response = await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`); + let body = await response.json(); + return JSON.stringify(body); + } catch (error) { + console.log("error occured"); + console.log(error); + return c.json(output); + } + } + + let result = jsonnet.extString("id", id).javascriptCallback("getAtodo", asyncGetAtodo) + .evaluateSnippet(` + local todo = std.parseJson(arakoo.native("getAtodo")(std.extVar("id"))); + { + result : todo.title + }`); + return c.json(JSON.parse(result)); +}); + +app.post("/question", async (c) => { + let body = await c.req.json(); + console.log(body); + return c.json(body); +}); + +app.get("/add", (c) => { + function add(arg1, arg2, arg3) { + console.log("Args recieved: ", arg1, arg2, arg3); + return arg1 + arg2 + arg3; + } + const code = ` + local username = std.extVar('name'); + local Person(name='Alice') = { + name: name, + welcome: 'Hello ' + name + '!', + }; + { + person1: Person(username), + person2: Person('Bob'), + result : arakoo.native("add")(1,2,3) + }`; + let result = jsonnet + .extString("name", "ll") + .javascriptCallback("add", add) + .evaluateSnippet(code); + return c.json(JSON.parse(result)); +}); + +app.get("/file", (c) => { + try { + let result = jsonnet + .extString("extName", "Mohan") + .evaluateFile( + "/home/afshan/EdgeChains/JS/wasm/examples/ec-wasmjs-hono/src/example.jsonnet" + ); + return c.json(JSON.parse(result)); + } catch (error) { + console.log("Error occured"); + console.log(error); + return c.json("Unable to evaluate File"); + } +}); + +app.get("/:username", (c) => { + const { username } = c.req.param(); + // redirect to /hello/:username + return c.redirect(`/hello/${username}`); +}); + +app.get("/hello/:name", async (c) => { + const name = c.req.param("name"); + return c.text(`Async Hello ${name}!`); +}); + +app.get("/env/:key", async (c) => { + const key = c.req.param("key"); + return c.text(env[key]); +}); + +const config = { + host: env["PLANETSCALE_HOST"], + username: env["PLANETSCALE_USERNAME"], + password: env["PLANETSCALE_PASSWORD"], +}; +const conn = connect(config); + +app.get("/db", async (c) => { + const result = await conn.execute("SHOW TABLES"); + + return c.json(result); +}); + +app.notFound((c) => { + return c.text("404 not found", 404); +}); + +app.fire(); +// // globalThis._export = app; diff --git a/JS/wasm/examples/ec-wasmjs-hono/webpack.config.cjs b/JS/wasm/examples/ec-wasmjs-hono/webpack.config.cjs new file mode 100644 index 000000000..af6a11641 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/webpack.config.cjs @@ -0,0 +1,24 @@ +const { optimize } = require("webpack"); +const webpack = require("webpack"); + +let definePlugin = new webpack.DefinePlugin({ + "process.env.arakoo": JSON.stringify(true), +}); + +console.log("starting build"); + +const config = { + entry: "./src/index.js", + output: { + path: __dirname + "/bin", + filename: "webpack.js", + iife: false, + }, + mode: "production", + optimization: { + minimize: false, + }, + plugins: [definePlugin], +}; + +module.exports = config; diff --git a/JS/wasm/examples/hono-fetch/build.js b/JS/wasm/examples/hono-fetch/build.js new file mode 100644 index 000000000..993562656 --- /dev/null +++ b/JS/wasm/examples/hono-fetch/build.js @@ -0,0 +1,20 @@ +import { build } from "esbuild"; + +let runtime = process.argv[2]; + +build({ + entryPoints: ["src/index.js"], + bundle: true, + minify: false, + outfile: "bin/index.js", + format: "esm", + target: "esnext", + platform: "node", + // external: ["arakoo"], + define: { + "process.env.arakoo": JSON.stringify(runtime === "arakoo"), + }, +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/examples/hono-fetch/package.json b/JS/wasm/examples/hono-fetch/package.json new file mode 100644 index 000000000..57b90a323 --- /dev/null +++ b/JS/wasm/examples/hono-fetch/package.json @@ -0,0 +1,19 @@ +{ + "name": "hono-fetch", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "axios": "^1.6.8", + "esbuild": "^0.20.2", + "hono": "^3.9", + "javy": "^0.1.2" + }, + "type": "module" +} diff --git a/JS/wasm/examples/hono-fetch/src/index.js b/JS/wasm/examples/hono-fetch/src/index.js new file mode 100644 index 000000000..e78bc3997 --- /dev/null +++ b/JS/wasm/examples/hono-fetch/src/index.js @@ -0,0 +1,86 @@ +import { Hono } from "hono"; +import { readFileSync, writeFileSync, STDIO } from "javy/fs"; +const app = new Hono(); + +// function writeOutput(output) { +// const encodedOutput = new TextEncoder().encode(output); +// const buffer = new Uint8Array(encodedOutput); +// // Stdout file descriptor +// writeFileSync(STDIO.Stdout, buffer); +// } + +app.get("/hello", (c) => { + return c.text("Hello World"); +}); + +app.get("/post", async (c) => { + try { + let response = await fetch("https://dummy.restapiexample.com/api/v1/create", { + method: "POST", + body: JSON.stringify({ + name: "test", + salary: "123", + age: "23", + }), + headers: { + "Content-type": "application/json", + }, + }); + let data = await response.json(); + console.log("data", data); + return c.json(data); + } catch (error) { + console.log("error occured"); + console.log(error); + return c.json(output); + } +}); + +app.get("/get", async (c) => { + try { + let response = await fetch("https://fakerestapi.azurewebsites.net/api/v1/Activities"); + let body = await response.json(); + return c.json(body); + } catch (error) { + console.log("error occured"); + console.log(error); + return c.json(error); + } +}); + +app.get("/put", async (c) => { + try { + let response = await fetch("https://jsonplaceholder.typicode.com/posts/1", { + method: "PUT", + body: JSON.stringify({ + id: 1, + title: "foo", + body: "bar", + userId: 1, + }), + headers: { + "Content-type": "application/json; charset=UTF-8", + }, + }); + return c.json(response); + } catch (error) { + console.log("error occured"); + console.log(error); + return c.json(output); + } +}); + +app.get("/delete", async (c) => { + try { + let response = await fetch("https://jsonplaceholder.typicode.com/posts/1", { + method: "DELETE", + }); + return c.json(response); + } catch (error) { + console.log("error occured"); + console.log(error); + return c.json(output); + } +}); + +app.fire(); diff --git a/JS/wasm/examples/hono-pdf/build.js b/JS/wasm/examples/hono-pdf/build.js new file mode 100644 index 000000000..7cd40f407 --- /dev/null +++ b/JS/wasm/examples/hono-pdf/build.js @@ -0,0 +1,20 @@ +import { build } from "esbuild"; + +let runtime = process.argv[2]; + +build({ + entryPoints: ["src/index.js"], + bundle: true, + // minify: true, + outfile: "bin/app.js", + format: "esm", + target: "esnext", + platform: "node", + // external: ["arakoo"], + define: { + "process.env.arakoo": JSON.stringify(runtime === "arakoo"), + }, +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/examples/hono-pdf/package.json b/JS/wasm/examples/hono-pdf/package.json new file mode 100644 index 000000000..45498284b --- /dev/null +++ b/JS/wasm/examples/hono-pdf/package.json @@ -0,0 +1,20 @@ +{ + "name": "hono-pdf", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "esbuild": "^0.20.2", + "hono": "^3.9", + "http": "0.0.1-security", + "javy": "^0.1.2", + "pdf-parse": "^1.1.1" + }, + "type": "module" +} diff --git a/JS/wasm/examples/hono-pdf/src/index.js b/JS/wasm/examples/hono-pdf/src/index.js new file mode 100644 index 000000000..714abead5 --- /dev/null +++ b/JS/wasm/examples/hono-pdf/src/index.js @@ -0,0 +1,23831 @@ +import { Hono } from "hono"; +const app = new Hono(); +// import {pdf} from 'pdf-parse/lib/pdf-parse'; +import pdf from "pdf-parse/lib/pdf-parse.js"; + +// let buffer = readFileSync(STDIO.Stdin) +let buffer = { + type: "Buffer", + data: [ + 37, 80, 68, 70, 45, 49, 46, 54, 13, 37, 226, 227, 207, 211, 13, 10, 51, 52, 56, 32, 48, 32, + 111, 98, 106, 13, 60, 60, 47, 76, 105, 110, 101, 97, 114, 105, 122, 101, 100, 32, 49, 47, + 76, 32, 52, 55, 50, 52, 49, 53, 47, 79, 32, 51, 53, 48, 47, 69, 32, 54, 48, 50, 56, 57, 47, + 78, 32, 53, 56, 47, 84, 32, 52, 55, 49, 55, 49, 49, 47, 72, 32, 91, 32, 52, 57, 49, 32, 55, + 50, 57, 93, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 13, 10, 51, 54, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 68, 101, 99, + 111, 100, 101, 80, 97, 114, 109, 115, 60, 60, 47, 67, 111, 108, 117, 109, 110, 115, 32, 52, + 47, 80, 114, 101, 100, 105, 99, 116, 111, 114, 32, 49, 50, 62, 62, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 73, 68, 91, 60, 51, 66, + 67, 70, 66, 55, 57, 65, 68, 56, 67, 54, 68, 69, 52, 50, 66, 65, 69, 54, 49, 68, 54, 51, 49, + 55, 52, 55, 52, 69, 70, 65, 62, 60, 53, 65, 70, 70, 48, 55, 49, 56, 56, 57, 55, 55, 48, 49, + 52, 49, 66, 57, 69, 70, 70, 57, 56, 67, 65, 48, 69, 54, 49, 69, 51, 52, 62, 93, 47, 73, 110, + 100, 101, 120, 91, 51, 52, 56, 32, 50, 52, 93, 47, 73, 110, 102, 111, 32, 51, 52, 55, 32, + 48, 32, 82, 47, 76, 101, 110, 103, 116, 104, 32, 56, 50, 47, 80, 114, 101, 118, 32, 52, 55, + 49, 55, 49, 50, 47, 82, 111, 111, 116, 32, 51, 52, 57, 32, 48, 32, 82, 47, 83, 105, 122, + 101, 32, 51, 55, 50, 47, 84, 121, 112, 101, 47, 88, 82, 101, 102, 47, 87, 91, 49, 32, 50, + 32, 49, 93, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 98, 98, 100, 16, 96, 96, + 98, 96, 217, 2, 36, 24, 179, 64, 196, 127, 32, 193, 108, 0, 36, 132, 18, 64, 196, 99, 16, + 241, 14, 72, 8, 119, 1, 9, 17, 46, 16, 183, 4, 196, 125, 11, 98, 61, 7, 18, 12, 145, 64, 66, + 247, 39, 72, 111, 12, 144, 48, 5, 18, 140, 140, 175, 65, 18, 12, 140, 88, 137, 255, 12, 61, + 191, 1, 2, 12, 0, 58, 94, 14, 30, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, + 101, 110, 100, 111, 98, 106, 13, 115, 116, 97, 114, 116, 120, 114, 101, 102, 13, 10, 48, 13, + 10, 37, 37, 69, 79, 70, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 13, 10, 51, 55, 49, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 67, 32, 49, 49, 49, 53, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 73, 32, 49, 49, 51, 55, 47, 76, + 101, 110, 103, 116, 104, 32, 54, 51, 48, 47, 79, 32, 49, 48, 57, 57, 47, 83, 32, 49, 48, 48, + 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 98, 96, 96, 96, 2, 162, 80, 6, + 22, 6, 6, 134, 125, 12, 2, 12, 8, 32, 192, 192, 202, 192, 6, 20, 231, 56, 160, 128, 36, 234, + 128, 196, 54, 96, 96, 96, 126, 58, 21, 168, 82, 141, 193, 147, 83, 140, 155, 139, 75, 128, + 187, 136, 211, 132, 59, 149, 43, 136, 227, 32, 231, 10, 206, 7, 156, 113, 156, 76, 92, 83, + 185, 170, 56, 51, 57, 77, 185, 68, 57, 187, 184, 166, 114, 42, 113, 113, 114, 110, 182, 204, + 226, 140, 225, 96, 99, 117, 228, 228, 231, 228, 102, 95, 200, 149, 198, 217, 192, 153, 196, + 29, 194, 113, 149, 135, 129, 183, 156, 251, 30, 215, 55, 158, 56, 30, 41, 158, 106, 110, 9, + 30, 7, 110, 89, 110, 14, 30, 153, 170, 20, 238, 157, 44, 47, 185, 255, 115, 179, 114, 7, + 112, 79, 81, 63, 196, 33, 198, 178, 246, 121, 116, 88, 241, 82, 237, 40, 191, 169, 75, 245, + 108, 36, 166, 171, 170, 123, 93, 122, 178, 54, 219, 50, 108, 202, 212, 244, 196, 59, 65, 75, + 94, 103, 29, 96, 18, 158, 22, 234, 114, 201, 81, 244, 124, 203, 211, 169, 129, 38, 51, 147, + 128, 92, 183, 8, 95, 181, 91, 173, 169, 1, 174, 45, 151, 82, 151, 202, 148, 110, 94, 104, + 153, 26, 226, 40, 225, 23, 25, 42, 224, 58, 77, 216, 11, 172, 32, 119, 185, 172, 175, 6, 80, + 68, 216, 115, 154, 116, 22, 88, 4, 164, 125, 154, 34, 80, 101, 106, 219, 45, 48, 27, 42, + 158, 187, 228, 18, 132, 155, 105, 2, 50, 39, 181, 229, 18, 134, 74, 97, 207, 109, 11, 145, + 185, 94, 226, 211, 109, 32, 226, 44, 137, 32, 241, 142, 56, 219, 105, 34, 161, 41, 151, 44, + 89, 162, 114, 203, 23, 198, 124, 6, 58, 88, 48, 181, 3, 104, 187, 100, 226, 182, 121, 173, + 197, 231, 192, 14, 131, 89, 183, 2, 34, 14, 54, 176, 3, 137, 221, 118, 11, 236, 96, 16, 183, + 18, 164, 5, 200, 152, 224, 134, 208, 34, 157, 57, 77, 161, 14, 234, 96, 65, 144, 51, 182, + 77, 112, 5, 59, 18, 44, 11, 98, 56, 138, 161, 24, 158, 187, 12, 228, 229, 32, 144, 150, 91, + 64, 41, 176, 22, 184, 99, 20, 33, 206, 134, 58, 21, 236, 47, 144, 74, 15, 176, 118, 176, + 167, 192, 225, 9, 100, 71, 67, 156, 237, 40, 6, 115, 30, 75, 66, 13, 67, 7, 8, 112, 0, 113, + 3, 156, 5, 229, 112, 116, 192, 69, 17, 108, 14, 168, 16, 154, 14, 152, 88, 3, 134, 72, 71, + 67, 4, 220, 68, 54, 136, 97, 29, 72, 150, 114, 116, 160, 42, 198, 48, 186, 193, 2, 85, 5, + 186, 173, 28, 200, 106, 59, 80, 5, 26, 224, 170, 152, 96, 222, 104, 64, 181, 7, 213, 127, 3, + 145, 113, 128, 121, 182, 158, 129, 229, 115, 54, 144, 230, 3, 98, 37, 112, 46, 14, 100, 224, + 103, 140, 225, 174, 153, 80, 41, 169, 100, 188, 164, 207, 243, 206, 36, 101, 85, 11, 183, 8, + 6, 167, 83, 13, 140, 25, 108, 12, 108, 210, 103, 24, 24, 255, 119, 85, 190, 96, 240, 105, + 108, 96, 126, 125, 145, 129, 229, 247, 60, 6, 134, 171, 30, 192, 130, 224, 172, 120, 67, + 102, 173, 28, 3, 147, 110, 5, 172, 64, 152, 204, 192, 254, 109, 21, 144, 102, 4, 162, 84, + 32, 61, 133, 129, 253, 7, 63, 144, 6, 22, 46, 194, 136, 66, 100, 22, 3, 135, 148, 51, 68, + 21, 195, 85, 128, 0, 3, 0, 47, 31, 131, 110, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, + 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 52, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 77, 101, 116, 97, 100, 97, 116, 97, 32, 49, 53, 50, 32, 48, 32, 82, 47, 79, 117, 116, + 108, 105, 110, 101, 115, 32, 50, 48, 51, 32, 48, 32, 82, 47, 80, 97, 103, 101, 115, 32, 51, + 51, 51, 32, 48, 32, 82, 47, 83, 116, 114, 117, 99, 116, 84, 114, 101, 101, 82, 111, 111, + 116, 32, 50, 49, 50, 32, 48, 32, 82, 47, 84, 121, 112, 101, 47, 67, 97, 116, 97, 108, 111, + 103, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 51, 53, 48, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 91, 51, 53, 50, 32, 48, 32, 82, 32, 51, + 53, 51, 32, 48, 32, 82, 32, 51, 53, 52, 32, 48, 32, 82, 32, 51, 53, 53, 32, 48, 32, 82, 32, + 51, 53, 54, 32, 48, 32, 82, 32, 51, 53, 55, 32, 48, 32, 82, 32, 51, 53, 56, 32, 48, 32, 82, + 32, 51, 53, 57, 32, 48, 32, 82, 93, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, + 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, + 47, 84, 84, 48, 32, 51, 54, 55, 32, 48, 32, 82, 47, 84, 84, 49, 32, 51, 55, 48, 32, 48, 32, + 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, + 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, + 114, 101, 110, 116, 115, 32, 48, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 51, 53, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, + 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 70, 105, + 114, 115, 116, 32, 53, 48, 47, 76, 101, 110, 103, 116, 104, 32, 55, 50, 48, 47, 78, 32, 54, + 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 104, 222, 212, 149, 221, 107, 219, 48, 16, 192, 255, 21, 189, 143, 96, 125, 203, + 134, 18, 72, 210, 133, 21, 70, 31, 150, 176, 21, 74, 31, 188, 198, 164, 134, 212, 41, 177, + 11, 219, 127, 191, 187, 179, 164, 200, 38, 109, 74, 71, 25, 123, 56, 244, 113, 31, 62, 157, + 78, 63, 43, 107, 24, 103, 202, 90, 38, 57, 142, 142, 9, 169, 20, 76, 114, 38, 148, 43, 96, + 82, 48, 97, 114, 203, 148, 227, 76, 90, 97, 216, 197, 69, 54, 107, 239, 171, 166, 99, 214, + 185, 108, 113, 117, 185, 170, 58, 48, 227, 16, 230, 91, 182, 40, 159, 190, 84, 245, 246, + 161, 87, 94, 86, 189, 225, 68, 10, 155, 45, 119, 229, 182, 133, 16, 82, 56, 88, 236, 155, + 110, 62, 223, 255, 186, 157, 40, 157, 131, 30, 190, 36, 56, 36, 80, 72, 117, 71, 202, 101, + 189, 171, 36, 132, 21, 20, 22, 119, 174, 203, 199, 42, 91, 94, 175, 87, 243, 213, 167, 117, + 253, 88, 181, 147, 249, 126, 183, 201, 174, 186, 114, 87, 223, 207, 154, 237, 174, 98, 60, + 91, 117, 213, 227, 119, 38, 172, 201, 214, 191, 159, 42, 242, 195, 36, 14, 245, 83, 183, 63, + 100, 55, 62, 55, 173, 237, 116, 122, 171, 164, 99, 255, 82, 164, 129, 130, 67, 173, 141, 49, + 204, 192, 217, 81, 168, 8, 57, 108, 74, 151, 147, 146, 12, 80, 137, 229, 247, 14, 56, 162, + 62, 56, 157, 147, 24, 199, 241, 163, 96, 177, 21, 103, 78, 74, 102, 225, 214, 113, 12, 115, + 43, 4, 115, 16, 31, 69, 229, 5, 217, 226, 28, 117, 133, 214, 189, 45, 174, 131, 29, 172, + 141, 177, 131, 56, 116, 144, 52, 168, 74, 14, 101, 114, 17, 19, 163, 36, 193, 89, 67, 224, + 48, 166, 251, 209, 199, 207, 115, 63, 15, 250, 232, 3, 137, 170, 68, 71, 73, 249, 2, 144, + 190, 208, 76, 74, 78, 163, 193, 209, 248, 226, 152, 36, 143, 112, 3, 105, 229, 250, 13, 136, + 26, 23, 232, 66, 71, 50, 71, 247, 52, 68, 8, 221, 27, 71, 47, 159, 32, 38, 134, 22, 218, 87, + 82, 142, 18, 8, 130, 201, 134, 28, 156, 134, 175, 5, 157, 59, 238, 209, 225, 194, 30, 247, + 18, 138, 160, 143, 29, 211, 239, 247, 254, 206, 28, 197, 36, 151, 52, 150, 120, 131, 212, + 18, 137, 208, 65, 18, 137, 78, 190, 101, 82, 193, 196, 66, 139, 140, 5, 219, 39, 222, 228, + 9, 65, 27, 44, 210, 88, 176, 11, 82, 137, 157, 112, 42, 142, 111, 245, 208, 41, 81, 142, 62, + 119, 0, 180, 121, 217, 86, 200, 138, 19, 124, 249, 220, 220, 239, 55, 117, 179, 205, 126, + 212, 205, 172, 105, 235, 184, 94, 214, 135, 182, 91, 60, 148, 7, 192, 206, 144, 51, 128, 45, + 67, 216, 250, 90, 122, 11, 105, 76, 182, 122, 254, 217, 33, 147, 214, 135, 231, 138, 224, + 20, 9, 5, 161, 55, 221, 67, 75, 20, 6, 183, 233, 244, 5, 196, 202, 55, 35, 86, 106, 62, 64, + 172, 6, 125, 161, 88, 81, 88, 86, 8, 55, 36, 172, 58, 67, 216, 30, 176, 3, 206, 78, 132, + 249, 255, 72, 139, 32, 75, 72, 139, 28, 113, 190, 131, 62, 26, 180, 185, 26, 190, 162, 244, + 85, 133, 151, 19, 64, 27, 0, 156, 39, 47, 139, 64, 235, 125, 8, 180, 201, 26, 237, 130, 15, + 202, 128, 179, 142, 15, 57, 235, 89, 24, 153, 56, 226, 108, 56, 171, 12, 175, 119, 244, 170, + 194, 139, 151, 94, 135, 49, 40, 167, 16, 15, 245, 240, 63, 39, 206, 234, 254, 245, 191, 143, + 179, 248, 155, 33, 204, 226, 137, 254, 10, 179, 184, 198, 40, 177, 7, 206, 96, 86, 218, 254, + 204, 150, 219, 243, 152, 117, 189, 237, 0, 179, 252, 52, 102, 199, 20, 13, 82, 248, 26, 190, + 153, 178, 39, 132, 40, 251, 2, 97, 137, 178, 175, 244, 236, 71, 82, 54, 233, 181, 215, 41, + 235, 25, 243, 62, 214, 230, 239, 99, 109, 209, 179, 246, 143, 0, 3, 0, 46, 136, 97, 135, 13, + 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 53, + 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, + 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 52, 54, 51, 50, + 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 116, 87, 219, 174, 28, 183, 17, 124, + 223, 175, 152, 199, 221, 32, 51, 226, 165, 121, 3, 12, 3, 186, 217, 86, 96, 201, 134, 116, + 146, 60, 4, 126, 176, 79, 156, 188, 200, 1, 44, 36, 8, 242, 247, 169, 170, 230, 236, 206, + 30, 217, 16, 180, 167, 139, 236, 33, 155, 205, 238, 234, 230, 179, 239, 127, 252, 244, 239, + 229, 139, 47, 158, 189, 125, 249, 230, 213, 18, 150, 47, 191, 124, 241, 234, 229, 114, 122, + 241, 112, 10, 11, 255, 125, 250, 231, 233, 217, 195, 67, 88, 198, 214, 109, 121, 248, 199, + 41, 108, 99, 140, 174, 169, 184, 36, 11, 91, 75, 75, 25, 125, 203, 105, 121, 248, 229, 244, + 183, 243, 215, 151, 53, 157, 191, 227, 207, 95, 46, 235, 56, 191, 190, 244, 243, 251, 75, + 180, 243, 59, 162, 183, 151, 181, 105, 72, 232, 1, 194, 114, 105, 195, 213, 191, 186, 68, + 71, 111, 46, 107, 116, 133, 87, 252, 17, 124, 126, 249, 225, 225, 79, 110, 72, 108, 91, 73, + 180, 100, 77, 101, 171, 189, 44, 107, 140, 117, 131, 109, 127, 199, 238, 47, 46, 171, 157, + 255, 204, 159, 87, 252, 145, 49, 175, 41, 61, 240, 103, 57, 172, 50, 54, 211, 121, 122, 216, + 250, 168, 56, 141, 190, 79, 151, 181, 158, 3, 127, 32, 197, 126, 206, 20, 215, 125, 20, 3, + 18, 237, 176, 78, 134, 13, 110, 141, 109, 163, 202, 154, 190, 117, 95, 237, 195, 101, 45, + 231, 239, 47, 107, 134, 13, 17, 7, 127, 121, 73, 231, 111, 244, 45, 116, 66, 176, 101, 77, + 121, 11, 211, 244, 239, 46, 5, 62, 248, 220, 192, 53, 6, 40, 167, 180, 240, 188, 201, 117, + 223, 65, 247, 13, 45, 121, 15, 225, 45, 254, 63, 199, 255, 111, 249, 179, 96, 203, 126, 254, + 160, 201, 135, 111, 56, 242, 126, 78, 239, 106, 239, 14, 123, 196, 173, 85, 238, 81, 194, + 22, 27, 76, 119, 215, 114, 135, 183, 218, 129, 247, 208, 244, 247, 195, 69, 62, 172, 244, + 38, 183, 109, 216, 41, 21, 24, 205, 139, 91, 121, 115, 197, 133, 253, 163, 231, 248, 207, + 191, 47, 47, 188, 241, 185, 101, 188, 249, 43, 218, 86, 45, 99, 207, 92, 182, 56, 55, 253, + 234, 103, 172, 242, 211, 101, 237, 231, 79, 88, 247, 63, 244, 222, 143, 59, 250, 159, 31, + 174, 231, 115, 228, 208, 31, 47, 54, 161, 255, 38, 14, 6, 254, 72, 202, 218, 241, 245, 195, + 233, 215, 83, 106, 149, 49, 90, 83, 192, 134, 139, 37, 129, 186, 37, 91, 62, 253, 124, 250, + 235, 31, 150, 127, 33, 164, 123, 68, 4, 108, 21, 118, 132, 45, 245, 196, 160, 255, 124, 240, + 253, 215, 39, 186, 41, 46, 255, 93, 78, 191, 34, 248, 103, 10, 180, 142, 193, 178, 212, 134, + 219, 73, 101, 121, 252, 69, 137, 131, 223, 45, 227, 195, 2, 61, 238, 24, 183, 72, 169, 151, + 66, 17, 81, 251, 120, 138, 184, 85, 128, 28, 10, 39, 26, 196, 17, 56, 27, 114, 89, 18, 214, + 146, 74, 138, 4, 250, 42, 87, 138, 157, 223, 52, 91, 24, 56, 92, 37, 97, 225, 2, 196, 189, + 243, 150, 7, 126, 106, 197, 15, 98, 218, 54, 163, 65, 39, 131, 21, 101, 129, 121, 88, 30, + 99, 109, 169, 91, 54, 14, 24, 36, 235, 208, 168, 91, 196, 92, 221, 42, 15, 130, 152, 224, + 239, 200, 75, 147, 165, 109, 11, 212, 105, 219, 160, 12, 227, 58, 164, 169, 49, 182, 48, + 246, 69, 6, 140, 133, 156, 26, 70, 155, 150, 3, 62, 136, 212, 56, 142, 227, 26, 176, 254, + 65, 194, 121, 21, 135, 149, 1, 129, 216, 204, 133, 70, 14, 156, 1, 160, 87, 130, 108, 212, + 130, 67, 18, 143, 194, 124, 3, 240, 195, 180, 40, 80, 236, 160, 214, 178, 102, 50, 195, 46, + 233, 108, 112, 208, 81, 134, 22, 208, 184, 78, 228, 80, 62, 151, 165, 116, 156, 209, 7, 150, + 110, 43, 89, 46, 115, 169, 43, 4, 40, 121, 58, 19, 178, 21, 57, 111, 76, 189, 220, 225, 197, + 208, 150, 93, 36, 143, 49, 53, 240, 33, 220, 88, 166, 86, 31, 78, 187, 200, 149, 136, 51, + 194, 59, 169, 18, 148, 44, 64, 147, 30, 153, 72, 195, 4, 57, 90, 232, 92, 186, 49, 82, 182, + 90, 38, 128, 94, 81, 28, 238, 83, 61, 149, 235, 71, 184, 145, 44, 80, 181, 32, 226, 64, 138, + 22, 73, 182, 217, 246, 169, 59, 0, 189, 39, 115, 105, 104, 69, 7, 189, 79, 249, 145, 92, + 103, 215, 25, 20, 10, 109, 5, 110, 131, 204, 112, 136, 65, 225, 9, 189, 33, 211, 0, 7, 231, + 16, 192, 252, 134, 246, 13, 223, 2, 104, 76, 197, 86, 132, 27, 220, 134, 188, 78, 105, 87, + 189, 3, 72, 142, 39, 115, 185, 237, 219, 1, 180, 171, 133, 9, 73, 23, 181, 96, 95, 32, 231, + 118, 91, 60, 226, 211, 219, 206, 128, 189, 151, 235, 130, 73, 247, 237, 158, 2, 48, 173, + 104, 74, 110, 192, 234, 183, 84, 76, 154, 230, 254, 70, 230, 130, 243, 231, 109, 206, 69, + 243, 205, 91, 41, 123, 40, 200, 65, 119, 64, 122, 135, 57, 155, 78, 21, 43, 152, 135, 153, + 95, 39, 52, 11, 210, 242, 26, 34, 64, 230, 238, 114, 80, 43, 131, 172, 141, 169, 217, 27, + 33, 210, 38, 33, 112, 43, 147, 27, 150, 30, 101, 104, 221, 207, 140, 8, 185, 153, 203, 13, + 178, 184, 42, 129, 39, 72, 25, 180, 7, 196, 145, 25, 239, 72, 230, 163, 44, 165, 227, 76, + 50, 207, 41, 138, 73, 204, 224, 251, 145, 120, 128, 176, 94, 106, 51, 189, 193, 221, 71, 89, + 74, 199, 153, 210, 197, 15, 93, 187, 215, 1, 57, 236, 107, 33, 236, 157, 43, 124, 198, 116, + 100, 202, 70, 18, 105, 211, 46, 114, 31, 82, 171, 114, 166, 117, 136, 200, 181, 4, 110, 55, + 138, 153, 58, 60, 52, 0, 77, 71, 168, 114, 161, 192, 69, 225, 60, 17, 171, 156, 48, 72, 208, + 166, 123, 160, 60, 138, 47, 148, 195, 92, 127, 40, 224, 114, 100, 176, 192, 244, 182, 64, + 172, 129, 166, 227, 187, 156, 184, 108, 161, 131, 161, 3, 250, 18, 128, 78, 214, 215, 133, + 213, 250, 40, 67, 9, 171, 59, 149, 99, 236, 227, 61, 4, 0, 183, 20, 175, 15, 230, 182, 119, + 30, 4, 21, 23, 212, 163, 179, 178, 248, 178, 80, 64, 49, 139, 54, 113, 60, 177, 79, 158, + 107, 108, 131, 19, 102, 101, 214, 21, 183, 65, 158, 135, 146, 215, 141, 188, 64, 200, 240, + 150, 2, 36, 183, 89, 180, 154, 235, 116, 118, 56, 42, 97, 16, 41, 225, 136, 55, 73, 10, 183, + 209, 206, 156, 81, 132, 18, 168, 28, 38, 215, 129, 47, 144, 61, 26, 31, 157, 21, 19, 133, + 39, 15, 69, 211, 42, 0, 45, 240, 4, 1, 162, 202, 20, 236, 107, 228, 101, 29, 101, 20, 195, + 251, 25, 137, 157, 18, 23, 66, 66, 119, 215, 97, 59, 132, 35, 112, 195, 193, 34, 190, 102, + 21, 19, 110, 49, 4, 252, 30, 157, 172, 137, 59, 45, 67, 165, 129, 60, 220, 204, 130, 203, + 95, 205, 115, 151, 135, 108, 130, 35, 209, 67, 29, 30, 90, 229, 240, 59, 0, 197, 198, 112, + 89, 85, 2, 63, 210, 193, 99, 16, 129, 52, 239, 17, 100, 146, 231, 170, 122, 235, 238, 95, + 125, 72, 215, 130, 204, 89, 27, 99, 247, 42, 147, 2, 178, 162, 108, 2, 221, 113, 141, 135, + 57, 178, 18, 16, 99, 247, 30, 41, 206, 138, 182, 174, 217, 195, 236, 138, 32, 179, 73, 112, + 139, 17, 156, 40, 87, 180, 176, 233, 171, 172, 50, 179, 42, 199, 1, 200, 57, 79, 129, 165, + 59, 197, 66, 83, 242, 60, 39, 85, 178, 71, 36, 80, 47, 211, 146, 44, 56, 60, 196, 17, 196, + 243, 164, 10, 241, 85, 29, 138, 212, 216, 77, 1, 194, 82, 128, 14, 53, 16, 85, 46, 247, 64, + 138, 135, 57, 101, 6, 0, 252, 146, 217, 207, 45, 43, 58, 156, 234, 190, 66, 241, 88, 21, 11, + 158, 52, 43, 9, 53, 248, 55, 38, 148, 226, 113, 103, 242, 116, 210, 118, 99, 56, 172, 79, + 145, 43, 31, 102, 217, 146, 225, 1, 161, 78, 13, 160, 104, 29, 228, 67, 58, 92, 23, 218, 26, + 220, 232, 204, 207, 117, 246, 66, 158, 188, 68, 181, 77, 93, 36, 20, 113, 79, 183, 219, 100, + 131, 162, 28, 206, 81, 192, 139, 228, 117, 41, 227, 65, 120, 236, 225, 104, 204, 79, 185, + 80, 153, 237, 230, 244, 16, 48, 24, 154, 190, 99, 236, 2, 41, 16, 90, 148, 220, 155, 159, + 140, 203, 175, 177, 170, 235, 201, 206, 137, 132, 142, 116, 180, 54, 41, 64, 249, 67, 40, + 162, 201, 30, 218, 128, 172, 119, 128, 69, 175, 188, 206, 115, 75, 217, 28, 102, 177, 97, + 236, 2, 53, 74, 53, 204, 185, 153, 9, 78, 73, 28, 232, 145, 244, 218, 179, 35, 52, 23, 64, + 133, 159, 14, 118, 59, 82, 205, 84, 101, 203, 64, 11, 147, 186, 172, 43, 68, 115, 222, 133, + 156, 118, 163, 202, 252, 154, 216, 160, 115, 50, 39, 129, 238, 32, 248, 212, 112, 77, 86, + 232, 21, 29, 0, 219, 14, 39, 126, 62, 251, 156, 250, 51, 23, 181, 253, 210, 162, 250, 137, + 21, 101, 53, 178, 98, 52, 46, 218, 60, 11, 244, 146, 88, 81, 130, 252, 92, 160, 43, 58, 30, + 152, 155, 1, 90, 117, 152, 246, 82, 67, 48, 146, 235, 14, 233, 142, 185, 39, 51, 134, 127, + 178, 106, 15, 246, 200, 254, 134, 144, 1, 164, 94, 14, 176, 155, 230, 120, 118, 148, 239, + 129, 220, 117, 152, 155, 126, 207, 147, 49, 51, 31, 4, 68, 125, 38, 247, 112, 164, 136, 97, + 206, 172, 24, 203, 94, 150, 146, 64, 235, 30, 50, 70, 166, 53, 185, 97, 230, 54, 227, 40, + 41, 184, 232, 112, 254, 77, 123, 226, 84, 31, 232, 202, 134, 36, 228, 29, 0, 255, 20, 135, + 215, 212, 49, 243, 1, 159, 102, 102, 103, 61, 2, 239, 128, 52, 111, 240, 163, 160, 236, 117, + 210, 189, 33, 27, 229, 154, 42, 185, 206, 110, 106, 146, 4, 56, 60, 58, 163, 14, 89, 209, + 100, 123, 246, 167, 204, 234, 5, 81, 202, 59, 70, 58, 114, 141, 236, 136, 220, 211, 212, 90, + 172, 44, 112, 126, 225, 205, 195, 8, 3, 10, 116, 127, 153, 173, 166, 214, 51, 171, 157, 34, + 240, 242, 62, 97, 148, 79, 128, 138, 42, 15, 47, 94, 176, 118, 33, 111, 237, 166, 113, 171, + 37, 21, 18, 20, 35, 115, 84, 132, 24, 159, 198, 126, 213, 203, 10, 94, 124, 132, 236, 91, + 105, 48, 28, 101, 184, 179, 91, 53, 2, 234, 179, 2, 41, 6, 13, 30, 234, 210, 37, 73, 17, 54, + 255, 148, 73, 107, 85, 79, 93, 121, 130, 175, 59, 14, 164, 49, 73, 208, 170, 78, 72, 23, + 115, 134, 111, 208, 157, 215, 0, 21, 72, 145, 106, 93, 5, 120, 167, 12, 192, 73, 17, 169, + 79, 232, 137, 158, 110, 170, 73, 141, 225, 106, 123, 222, 71, 37, 230, 90, 148, 114, 170, + 230, 247, 34, 154, 58, 243, 108, 43, 145, 181, 224, 227, 19, 60, 91, 128, 18, 110, 125, 241, + 4, 143, 39, 175, 42, 130, 137, 93, 47, 122, 77, 2, 36, 2, 15, 36, 217, 104, 48, 226, 41, + 184, 77, 172, 6, 10, 82, 1, 53, 134, 165, 58, 10, 52, 119, 250, 163, 179, 227, 49, 85, 28, + 63, 116, 86, 95, 2, 49, 250, 11, 192, 153, 14, 142, 74, 30, 249, 214, 252, 209, 65, 78, 160, + 115, 77, 183, 31, 149, 112, 188, 22, 181, 90, 2, 166, 35, 68, 105, 16, 137, 161, 35, 219, + 24, 93, 61, 223, 25, 162, 59, 243, 215, 110, 228, 163, 141, 64, 230, 5, 189, 143, 24, 63, + 108, 144, 2, 91, 70, 2, 228, 78, 80, 253, 102, 224, 53, 127, 237, 233, 242, 137, 201, 61, + 209, 171, 3, 81, 94, 156, 22, 17, 206, 222, 44, 239, 166, 240, 117, 54, 47, 139, 61, 25, + 159, 52, 36, 49, 2, 115, 61, 5, 58, 91, 52, 173, 200, 56, 159, 13, 218, 29, 160, 230, 253, + 92, 242, 36, 197, 147, 212, 235, 89, 222, 59, 164, 232, 213, 153, 77, 25, 28, 169, 220, 70, + 18, 204, 222, 150, 114, 21, 199, 43, 73, 197, 10, 8, 76, 15, 189, 153, 221, 153, 71, 39, + 104, 174, 152, 39, 11, 225, 205, 178, 43, 122, 75, 168, 2, 72, 118, 84, 255, 201, 60, 32, + 45, 178, 147, 85, 171, 53, 187, 126, 115, 91, 253, 83, 234, 237, 116, 141, 104, 179, 109, + 184, 204, 186, 229, 85, 58, 203, 102, 5, 77, 240, 185, 164, 136, 178, 56, 81, 189, 198, 23, + 249, 188, 74, 213, 191, 11, 243, 121, 242, 27, 50, 149, 110, 168, 170, 227, 115, 25, 49, 38, + 70, 83, 177, 124, 60, 77, 146, 34, 172, 140, 254, 148, 29, 36, 202, 230, 51, 93, 149, 207, + 219, 76, 85, 165, 165, 41, 212, 88, 254, 244, 81, 145, 108, 195, 213, 116, 124, 116, 231, + 62, 53, 84, 213, 184, 47, 239, 19, 162, 30, 162, 186, 73, 150, 63, 18, 27, 8, 109, 168, 138, + 14, 136, 42, 225, 109, 58, 79, 52, 204, 90, 91, 251, 117, 49, 227, 133, 186, 1, 40, 209, 74, + 205, 166, 187, 64, 249, 142, 220, 199, 107, 121, 212, 59, 117, 234, 193, 80, 169, 121, 67, + 16, 148, 110, 205, 171, 124, 80, 75, 113, 5, 169, 250, 33, 230, 103, 169, 30, 214, 248, 12, + 252, 174, 226, 189, 44, 181, 189, 111, 161, 99, 217, 108, 253, 22, 248, 76, 241, 247, 192, + 245, 54, 0, 67, 228, 253, 170, 131, 26, 170, 12, 149, 117, 129, 32, 41, 229, 212, 190, 19, + 134, 161, 185, 232, 173, 88, 189, 147, 169, 118, 156, 73, 46, 131, 175, 42, 249, 147, 178, + 147, 86, 209, 139, 15, 152, 33, 90, 213, 0, 166, 124, 141, 80, 116, 142, 125, 72, 75, 221, + 43, 42, 78, 225, 156, 55, 182, 149, 76, 112, 7, 168, 40, 162, 143, 85, 245, 106, 62, 35, + 208, 158, 162, 206, 121, 130, 161, 197, 45, 158, 110, 42, 182, 104, 136, 153, 253, 187, 162, + 152, 111, 82, 108, 156, 52, 232, 143, 64, 106, 50, 16, 144, 147, 146, 163, 18, 189, 122, + 191, 61, 95, 62, 71, 56, 223, 58, 68, 172, 221, 74, 24, 118, 245, 106, 147, 157, 48, 1, 67, + 209, 42, 230, 175, 1, 82, 255, 62, 23, 116, 143, 180, 147, 84, 59, 216, 95, 207, 71, 215, + 80, 107, 103, 122, 50, 142, 153, 36, 179, 209, 214, 187, 197, 191, 232, 234, 67, 204, 169, + 179, 43, 251, 169, 54, 223, 71, 157, 106, 83, 110, 162, 145, 42, 89, 239, 214, 194, 16, 88, + 61, 145, 157, 83, 84, 184, 138, 247, 202, 251, 131, 179, 168, 147, 246, 87, 223, 124, 181, + 232, 57, 232, 237, 80, 97, 189, 19, 9, 113, 225, 194, 98, 236, 203, 138, 70, 236, 255, 108, + 87, 57, 146, 228, 56, 12, 244, 231, 21, 245, 129, 233, 224, 41, 137, 239, 25, 103, 12, 205, + 255, 221, 197, 197, 68, 178, 98, 163, 141, 86, 146, 68, 34, 129, 226, 1, 216, 239, 248, 251, + 242, 235, 44, 26, 196, 49, 227, 39, 178, 22, 19, 29, 224, 156, 145, 134, 132, 218, 196, 160, + 85, 180, 109, 38, 38, 126, 213, 174, 104, 47, 229, 105, 186, 205, 241, 26, 199, 183, 190, + 146, 235, 49, 244, 136, 181, 213, 167, 191, 237, 237, 109, 122, 93, 235, 103, 179, 69, 90, + 67, 10, 210, 210, 214, 75, 9, 111, 152, 162, 97, 152, 250, 100, 233, 83, 161, 183, 142, 151, + 169, 213, 58, 161, 97, 167, 138, 191, 237, 141, 90, 134, 70, 188, 114, 162, 89, 63, 253, + 222, 84, 181, 250, 134, 90, 45, 211, 45, 157, 197, 75, 105, 45, 152, 162, 36, 241, 26, 91, + 151, 53, 59, 180, 150, 111, 191, 18, 5, 232, 143, 123, 0, 93, 248, 127, 115, 250, 203, 20, + 207, 70, 139, 11, 71, 176, 190, 86, 246, 18, 232, 183, 238, 96, 123, 84, 188, 249, 176, 206, + 193, 86, 249, 38, 213, 210, 189, 120, 225, 82, 180, 194, 47, 254, 186, 21, 63, 243, 10, 247, + 124, 137, 63, 209, 242, 41, 132, 254, 254, 210, 206, 49, 106, 24, 249, 247, 79, 241, 0, 20, + 160, 183, 77, 20, 110, 137, 134, 109, 186, 196, 154, 65, 216, 137, 115, 34, 53, 41, 218, + 172, 94, 60, 171, 183, 14, 236, 2, 128, 52, 112, 184, 220, 134, 46, 135, 180, 154, 250, 97, + 247, 20, 196, 235, 91, 157, 203, 135, 85, 58, 224, 74, 24, 174, 114, 64, 133, 164, 173, 106, + 4, 177, 7, 32, 103, 122, 208, 92, 43, 108, 183, 17, 104, 247, 64, 184, 13, 83, 151, 148, + 122, 45, 0, 57, 62, 133, 211, 223, 253, 52, 198, 242, 174, 151, 3, 152, 128, 194, 17, 176, + 202, 72, 67, 149, 152, 180, 174, 191, 251, 235, 136, 217, 62, 201, 176, 207, 147, 181, 79, + 246, 185, 13, 93, 15, 169, 53, 253, 114, 24, 88, 126, 251, 89, 180, 184, 52, 38, 10, 4, 55, + 129, 85, 195, 54, 83, 113, 96, 116, 229, 205, 238, 23, 204, 141, 53, 201, 106, 163, 224, + 204, 1, 115, 9, 211, 58, 63, 135, 80, 83, 94, 181, 102, 99, 229, 133, 54, 126, 195, 190, 11, + 166, 13, 225, 105, 15, 184, 144, 66, 155, 31, 196, 30, 64, 181, 235, 34, 39, 175, 60, 51, 0, + 193, 10, 108, 78, 211, 176, 206, 207, 33, 55, 244, 151, 201, 169, 175, 216, 118, 190, 188, + 87, 166, 10, 4, 71, 129, 93, 69, 43, 44, 176, 76, 206, 127, 241, 134, 197, 39, 139, 151, + 231, 97, 152, 40, 104, 115, 192, 188, 194, 212, 5, 145, 92, 11, 160, 160, 123, 242, 0, 202, + 222, 120, 213, 108, 199, 60, 168, 54, 132, 171, 61, 224, 74, 250, 36, 145, 155, 119, 71, 80, + 242, 242, 145, 7, 27, 103, 6, 223, 206, 9, 24, 30, 203, 197, 114, 72, 171, 170, 95, 218, + 216, 66, 251, 194, 198, 19, 184, 126, 146, 102, 127, 111, 15, 228, 123, 44, 18, 213, 233, + 178, 89, 86, 160, 237, 153, 154, 87, 77, 130, 77, 87, 233, 162, 129, 153, 73, 232, 199, 53, + 243, 120, 77, 176, 229, 62, 218, 254, 4, 146, 42, 61, 229, 2, 184, 3, 64, 113, 14, 27, 81, + 149, 116, 38, 88, 74, 201, 220, 50, 74, 148, 54, 109, 30, 116, 109, 146, 171, 158, 251, 225, + 208, 167, 130, 165, 17, 105, 124, 177, 244, 221, 131, 26, 238, 222, 119, 6, 83, 34, 119, + 147, 88, 36, 144, 161, 136, 35, 90, 83, 46, 184, 78, 158, 205, 100, 39, 0, 43, 37, 155, 12, + 93, 79, 59, 111, 23, 237, 152, 26, 201, 47, 251, 169, 212, 213, 197, 90, 73, 80, 37, 12, 79, + 57, 160, 58, 96, 170, 10, 65, 235, 242, 237, 137, 199, 84, 93, 108, 85, 215, 23, 105, 93, + 135, 211, 78, 122, 82, 171, 138, 151, 62, 142, 158, 209, 127, 138, 239, 220, 253, 130, 158, + 188, 215, 19, 185, 159, 196, 162, 130, 12, 69, 33, 209, 154, 122, 193, 99, 240, 108, 188, + 147, 110, 24, 0, 172, 129, 195, 231, 24, 172, 135, 212, 154, 254, 199, 75, 193, 45, 255, + 217, 239, 164, 174, 126, 172, 9, 221, 76, 64, 225, 7, 88, 69, 192, 78, 229, 129, 211, 181, + 63, 94, 71, 238, 185, 253, 72, 186, 217, 70, 32, 221, 3, 225, 115, 46, 146, 147, 82, 77, + 251, 237, 61, 7, 137, 47, 141, 86, 215, 193, 68, 117, 156, 126, 234, 32, 21, 5, 59, 133, 72, + 93, 253, 237, 109, 20, 102, 47, 156, 151, 4, 65, 10, 108, 46, 211, 176, 206, 207, 169, 53, + 212, 151, 78, 226, 111, 46, 223, 4, 53, 206, 67, 66, 184, 106, 148, 198, 155, 107, 198, 36, + 246, 0, 46, 235, 21, 98, 238, 194, 67, 169, 118, 137, 130, 54, 7, 204, 45, 76, 93, 82, 234, + 181, 0, 164, 109, 226, 123, 71, 112, 199, 173, 42, 96, 116, 38, 26, 253, 244, 51, 58, 169, + 232, 149, 4, 86, 190, 117, 4, 211, 27, 219, 230, 126, 38, 213, 14, 32, 72, 129, 195, 37, 61, + 162, 167, 86, 83, 175, 109, 33, 137, 215, 54, 9, 171, 181, 90, 167, 52, 36, 132, 167, 73, + 89, 132, 169, 43, 236, 116, 235, 8, 108, 52, 85, 46, 182, 42, 215, 23, 105, 185, 14, 167, + 141, 244, 244, 243, 214, 209, 218, 152, 83, 47, 221, 40, 221, 58, 3, 59, 207, 152, 18, 134, + 167, 28, 80, 33, 105, 171, 34, 147, 217, 3, 24, 222, 40, 97, 182, 13, 50, 108, 227, 164, + 109, 131, 189, 246, 193, 146, 72, 176, 149, 52, 178, 213, 252, 177, 209, 122, 230, 250, 89, + 174, 232, 83, 101, 47, 239, 80, 196, 130, 96, 84, 51, 57, 160, 178, 211, 82, 234, 169, 79, + 146, 42, 250, 163, 188, 251, 58, 241, 217, 253, 219, 184, 101, 63, 170, 108, 96, 243, 11, + 75, 34, 117, 225, 247, 62, 35, 42, 252, 150, 75, 48, 150, 61, 218, 247, 194, 30, 40, 216, + 129, 205, 55, 204, 76, 23, 24, 67, 245, 45, 205, 43, 207, 246, 155, 45, 251, 125, 166, 35, + 112, 100, 43, 44, 137, 212, 85, 27, 87, 136, 94, 114, 146, 99, 213, 202, 98, 77, 237, 19, 6, + 125, 14, 152, 119, 88, 154, 178, 205, 25, 178, 159, 40, 217, 124, 106, 20, 178, 75, 136, + 116, 236, 129, 200, 214, 181, 147, 24, 50, 109, 155, 247, 125, 106, 117, 143, 75, 123, 101, + 159, 242, 49, 51, 209, 137, 98, 23, 2, 171, 227, 109, 164, 172, 201, 230, 122, 155, 116, 82, + 128, 2, 238, 204, 114, 162, 32, 5, 54, 151, 219, 144, 40, 93, 175, 52, 55, 207, 150, 219, + 126, 218, 242, 69, 13, 87, 139, 27, 143, 47, 234, 113, 56, 118, 171, 208, 228, 116, 161, + 183, 254, 60, 25, 76, 69, 225, 99, 118, 245, 171, 48, 162, 1, 243, 186, 109, 147, 212, 21, + 75, 223, 113, 111, 197, 53, 182, 168, 174, 238, 167, 113, 255, 38, 239, 167, 243, 10, 157, + 96, 12, 209, 101, 215, 197, 62, 183, 55, 182, 217, 37, 12, 222, 28, 48, 191, 219, 54, 73, + 125, 47, 175, 40, 54, 84, 180, 212, 106, 123, 73, 59, 109, 219, 55, 119, 59, 125, 99, 235, + 130, 47, 246, 177, 180, 30, 147, 230, 246, 13, 18, 7, 224, 44, 88, 104, 32, 14, 208, 133, + 147, 21, 34, 227, 248, 89, 105, 176, 236, 142, 255, 247, 133, 95, 164, 201, 177, 252, 70, + 211, 103, 235, 77, 64, 118, 134, 237, 151, 128, 122, 41, 189, 132, 159, 145, 41, 91, 250, + 20, 166, 19, 1, 127, 126, 29, 240, 181, 187, 241, 198, 82, 121, 18, 64, 2, 160, 30, 196, + 110, 67, 241, 255, 38, 18, 105, 73, 81, 226, 16, 103, 76, 81, 217, 23, 123, 3, 100, 168, 68, + 109, 207, 3, 111, 150, 218, 62, 160, 165, 118, 204, 215, 202, 168, 141, 40, 204, 247, 128, + 28, 199, 151, 241, 114, 107, 35, 155, 226, 197, 172, 205, 151, 163, 63, 191, 78, 252, 90, + 245, 125, 1, 107, 249, 77, 84, 4, 197, 147, 21, 213, 55, 73, 121, 121, 160, 154, 181, 113, + 101, 24, 28, 102, 212, 217, 207, 162, 76, 156, 216, 248, 202, 0, 22, 84, 23, 145, 7, 240, + 44, 36, 182, 36, 36, 12, 225, 202, 19, 65, 185, 147, 157, 129, 3, 190, 86, 250, 183, 73, + 107, 39, 209, 0, 121, 248, 128, 17, 61, 112, 53, 75, 127, 31, 67, 251, 17, 89, 84, 186, 94, + 111, 32, 248, 115, 224, 205, 74, 30, 20, 165, 79, 226, 223, 40, 18, 144, 3, 158, 129, 196, + 166, 61, 200, 34, 174, 240, 133, 36, 28, 216, 92, 107, 207, 136, 197, 227, 100, 26, 157, + 119, 65, 226, 200, 67, 14, 84, 179, 158, 119, 6, 113, 6, 25, 21, 179, 189, 77, 200, 195, + 129, 95, 43, 191, 123, 18, 68, 245, 237, 220, 0, 145, 3, 96, 79, 1, 224, 114, 75, 229, 137, + 152, 220, 9, 226, 103, 104, 134, 163, 78, 90, 219, 14, 154, 246, 80, 244, 128, 17, 60, 176, + 235, 51, 158, 212, 78, 145, 69, 189, 61, 218, 177, 9, 206, 129, 55, 171, 234, 160, 152, 216, + 86, 202, 159, 40, 18, 144, 3, 158, 129, 196, 171, 100, 205, 30, 113, 133, 47, 36, 225, 192, + 102, 220, 46, 90, 92, 7, 19, 5, 242, 36, 0, 70, 18, 128, 93, 100, 187, 56, 0, 14, 48, 234, + 246, 246, 28, 73, 56, 7, 94, 171, 236, 105, 215, 8, 156, 79, 38, 33, 81, 36, 33, 7, 60, 9, + 137, 151, 91, 143, 220, 235, 219, 23, 146, 112, 96, 51, 174, 37, 87, 247, 40, 81, 131, 42, + 161, 231, 33, 113, 36, 34, 7, 92, 169, 113, 101, 24, 28, 166, 189, 136, 253, 231, 158, 156, + 138, 175, 129, 87, 7, 22, 165, 66, 30, 158, 50, 225, 128, 144, 167, 130, 6, 44, 21, 132, 85, + 255, 38, 243, 224, 182, 175, 157, 138, 19, 155, 235, 185, 104, 241, 56, 153, 198, 164, 76, + 16, 246, 76, 208, 64, 53, 235, 153, 215, 225, 87, 144, 150, 136, 246, 115, 113, 26, 24, 190, + 10, 239, 60, 72, 130, 112, 237, 226, 59, 226, 223, 208, 163, 223, 104, 185, 213, 141, 35, + 239, 252, 8, 156, 144, 89, 209, 126, 17, 212, 235, 100, 150, 13, 61, 238, 196, 17, 119, 14, + 184, 60, 222, 200, 71, 88, 22, 118, 149, 142, 144, 227, 62, 240, 171, 248, 162, 211, 35, 48, + 10, 27, 229, 6, 136, 216, 129, 61, 120, 192, 229, 150, 87, 158, 245, 112, 131, 248, 25, 154, + 101, 123, 104, 105, 61, 104, 234, 69, 209, 3, 70, 240, 192, 174, 175, 61, 44, 125, 124, 197, + 46, 117, 75, 57, 246, 254, 57, 240, 234, 192, 200, 167, 68, 208, 85, 50, 179, 137, 34, 252, + 28, 240, 248, 19, 47, 183, 30, 120, 225, 182, 39, 36, 224, 192, 102, 91, 41, 91, 197, 252, + 19, 83, 41, 188, 5, 18, 71, 22, 114, 192, 133, 86, 254, 9, 207, 32, 53, 17, 178, 140, 211, + 112, 192, 87, 96, 39, 44, 133, 54, 152, 241, 237, 9, 0, 180, 240, 129, 150, 89, 245, 124, + 222, 156, 127, 135, 254, 249, 79, 128, 1, 0, 96, 245, 9, 219, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 53, 51, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, + 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 52, 53, 48, 55, 62, 62, 115, 116, + 114, 101, 97, 109, 13, 10, 72, 137, 92, 151, 57, 122, 108, 59, 8, 132, 115, 175, 162, 55, + 112, 251, 211, 60, 172, 199, 201, 11, 218, 251, 79, 31, 84, 149, 134, 211, 137, 221, 255, + 145, 144, 0, 33, 64, 243, 29, 235, 235, 95, 13, 239, 16, 95, 159, 159, 241, 158, 99, 227, + 120, 251, 239, 50, 223, 51, 212, 3, 189, 191, 126, 127, 54, 165, 82, 33, 38, 140, 46, 53, 5, + 193, 196, 38, 150, 23, 252, 254, 252, 247, 211, 223, 115, 158, 47, 127, 95, 236, 75, 197, + 126, 120, 188, 211, 188, 86, 94, 224, 187, 186, 18, 139, 77, 167, 207, 133, 212, 23, 235, + 208, 18, 109, 66, 248, 253, 121, 224, 199, 112, 148, 107, 106, 187, 86, 57, 4, 179, 15, 210, + 238, 195, 209, 37, 177, 140, 52, 127, 218, 229, 150, 231, 252, 206, 246, 161, 189, 51, 12, + 127, 160, 65, 77, 21, 216, 43, 16, 75, 245, 119, 204, 38, 235, 83, 59, 185, 180, 87, 78, + 239, 153, 72, 205, 60, 109, 216, 51, 199, 224, 21, 227, 154, 57, 156, 2, 135, 35, 49, 212, + 51, 187, 193, 60, 204, 238, 69, 27, 23, 31, 29, 9, 208, 40, 42, 42, 73, 115, 197, 41, 67, + 139, 14, 8, 25, 10, 135, 73, 26, 84, 56, 21, 96, 76, 24, 124, 88, 122, 192, 221, 146, 154, + 78, 220, 100, 162, 59, 198, 62, 148, 200, 15, 121, 188, 82, 125, 115, 79, 155, 158, 242, + 155, 91, 206, 236, 178, 134, 89, 142, 136, 5, 163, 35, 8, 167, 83, 37, 100, 63, 242, 84, + 222, 73, 156, 76, 216, 86, 13, 199, 71, 70, 57, 145, 38, 22, 110, 248, 236, 31, 220, 149, + 134, 109, 212, 61, 158, 108, 253, 65, 135, 251, 220, 139, 236, 119, 25, 52, 46, 99, 222, + 236, 116, 109, 28, 88, 118, 192, 232, 127, 165, 98, 224, 194, 92, 128, 9, 144, 58, 151, 157, + 19, 104, 126, 77, 30, 103, 28, 75, 88, 183, 14, 202, 21, 250, 65, 219, 214, 119, 235, 24, + 206, 244, 112, 122, 252, 198, 188, 208, 247, 89, 155, 85, 157, 71, 54, 97, 34, 131, 102, + 251, 214, 62, 4, 126, 24, 243, 117, 147, 131, 69, 225, 10, 85, 76, 29, 141, 131, 25, 163, + 179, 108, 163, 23, 153, 106, 156, 57, 151, 230, 116, 100, 160, 89, 153, 122, 199, 92, 47, + 15, 172, 201, 133, 167, 219, 24, 184, 217, 111, 162, 235, 211, 24, 34, 81, 115, 47, 246, + 227, 123, 208, 29, 95, 8, 57, 115, 238, 235, 95, 182, 171, 89, 16, 112, 55, 186, 175, 253, + 66, 24, 230, 182, 207, 208, 168, 246, 235, 8, 141, 123, 195, 153, 249, 213, 112, 108, 13, + 84, 30, 115, 75, 229, 96, 225, 92, 115, 143, 83, 228, 97, 107, 151, 24, 20, 27, 145, 178, + 129, 187, 222, 10, 29, 80, 6, 117, 201, 238, 87, 237, 239, 65, 227, 29, 18, 193, 51, 145, + 209, 32, 77, 102, 75, 184, 33, 15, 228, 1, 83, 166, 146, 34, 166, 230, 65, 42, 19, 83, 11, + 192, 110, 251, 224, 193, 103, 100, 120, 131, 41, 208, 146, 77, 98, 211, 179, 115, 147, 181, + 25, 43, 118, 90, 206, 121, 126, 116, 244, 11, 101, 1, 241, 53, 183, 39, 127, 127, 166, 142, + 63, 220, 117, 35, 88, 42, 240, 223, 141, 80, 139, 102, 78, 114, 107, 215, 204, 54, 236, 55, + 47, 121, 80, 104, 154, 46, 19, 56, 94, 209, 190, 165, 122, 96, 100, 254, 246, 252, 106, 56, + 19, 209, 92, 20, 163, 221, 47, 163, 8, 111, 26, 117, 78, 157, 80, 211, 216, 140, 5, 7, 140, + 50, 72, 3, 206, 211, 145, 167, 56, 58, 231, 142, 177, 108, 213, 66, 6, 22, 222, 90, 197, 61, + 7, 69, 99, 226, 213, 204, 244, 98, 180, 228, 213, 112, 116, 22, 50, 15, 176, 169, 95, 99, + 131, 191, 3, 164, 6, 71, 82, 230, 68, 133, 134, 21, 167, 5, 118, 87, 7, 102, 54, 81, 228, + 76, 79, 88, 206, 221, 214, 76, 200, 35, 136, 41, 95, 245, 137, 176, 170, 41, 204, 194, 244, + 42, 248, 223, 79, 156, 112, 184, 251, 172, 88, 76, 26, 186, 34, 32, 251, 13, 223, 218, 111, + 247, 237, 166, 10, 91, 54, 122, 32, 29, 177, 222, 94, 215, 146, 189, 113, 106, 171, 215, 96, + 109, 183, 156, 104, 45, 42, 212, 142, 173, 30, 93, 142, 154, 191, 79, 189, 253, 82, 88, 42, + 176, 232, 43, 155, 141, 216, 82, 196, 119, 26, 55, 97, 159, 139, 61, 255, 45, 209, 100, 53, + 239, 236, 4, 130, 78, 229, 176, 81, 138, 71, 242, 194, 101, 192, 98, 219, 118, 139, 82, 167, + 47, 149, 31, 86, 216, 5, 161, 13, 121, 163, 193, 96, 104, 207, 177, 225, 24, 0, 76, 94, 193, + 182, 84, 242, 84, 118, 233, 223, 228, 253, 120, 141, 14, 255, 43, 193, 5, 75, 121, 33, 54, + 220, 98, 174, 202, 67, 77, 232, 61, 80, 207, 60, 236, 172, 214, 253, 125, 241, 199, 25, 109, + 143, 179, 95, 174, 193, 30, 201, 227, 46, 19, 171, 226, 27, 229, 213, 62, 76, 94, 176, 16, + 43, 197, 231, 202, 177, 244, 114, 80, 234, 206, 46, 60, 174, 108, 5, 225, 251, 3, 164, 251, + 154, 62, 125, 126, 207, 36, 207, 48, 50, 114, 103, 239, 216, 217, 146, 241, 82, 126, 156, + 149, 122, 19, 21, 15, 253, 161, 248, 101, 38, 28, 209, 149, 155, 59, 14, 240, 129, 88, 44, + 233, 34, 91, 121, 49, 42, 26, 44, 30, 251, 108, 81, 28, 91, 144, 33, 57, 203, 74, 186, 112, + 174, 68, 108, 80, 148, 142, 104, 67, 150, 123, 218, 114, 193, 253, 225, 115, 206, 99, 194, + 21, 134, 113, 165, 238, 14, 74, 39, 197, 199, 134, 252, 168, 106, 243, 113, 30, 253, 212, + 34, 83, 211, 47, 135, 91, 52, 95, 15, 251, 96, 191, 21, 108, 101, 191, 4, 7, 60, 24, 139, + 161, 116, 218, 150, 22, 124, 141, 249, 111, 65, 107, 154, 217, 116, 18, 67, 7, 213, 19, 157, + 55, 101, 195, 72, 60, 10, 122, 103, 82, 171, 169, 154, 240, 56, 70, 50, 143, 145, 151, 199, + 163, 216, 168, 119, 141, 38, 167, 86, 246, 74, 112, 64, 84, 49, 236, 69, 74, 135, 118, 165, + 116, 111, 67, 64, 153, 116, 89, 8, 31, 84, 247, 42, 66, 106, 194, 7, 15, 254, 56, 43, 228, + 172, 103, 50, 24, 178, 202, 187, 2, 195, 169, 112, 76, 52, 163, 176, 100, 165, 70, 43, 170, + 234, 103, 134, 21, 109, 236, 210, 234, 99, 243, 174, 173, 95, 31, 40, 157, 118, 177, 141, + 124, 101, 96, 184, 189, 86, 100, 234, 70, 187, 138, 241, 196, 11, 116, 46, 237, 68, 84, 100, + 219, 135, 216, 140, 192, 203, 66, 249, 32, 114, 47, 119, 206, 223, 23, 99, 189, 85, 249, + 253, 93, 17, 217, 56, 227, 64, 218, 89, 222, 71, 35, 77, 137, 170, 254, 114, 67, 214, 225, + 206, 180, 175, 145, 234, 186, 163, 82, 174, 68, 15, 82, 180, 51, 31, 99, 106, 82, 69, 137, + 112, 65, 92, 51, 51, 125, 144, 250, 238, 64, 62, 151, 9, 157, 26, 7, 237, 90, 136, 151, 125, + 240, 64, 65, 67, 128, 10, 149, 221, 3, 15, 254, 128, 251, 174, 12, 21, 233, 7, 123, 119, + 172, 150, 52, 55, 173, 112, 70, 7, 232, 169, 89, 119, 33, 101, 49, 236, 200, 227, 65, 125, + 87, 212, 223, 159, 39, 211, 5, 44, 140, 131, 65, 180, 86, 242, 43, 113, 109, 212, 187, 34, + 33, 197, 93, 223, 224, 133, 208, 78, 189, 43, 124, 20, 160, 98, 60, 45, 84, 20, 4, 86, 151, + 22, 21, 5, 23, 115, 177, 194, 90, 84, 120, 236, 145, 164, 160, 202, 128, 180, 204, 136, 154, + 27, 219, 157, 76, 245, 97, 199, 51, 235, 242, 10, 138, 196, 39, 200, 147, 33, 92, 38, 55, + 198, 228, 204, 122, 95, 2, 61, 194, 90, 202, 55, 153, 7, 99, 160, 232, 108, 84, 58, 169, + 128, 206, 121, 226, 32, 161, 249, 125, 90, 40, 31, 64, 173, 140, 176, 249, 251, 98, 44, 151, + 245, 168, 169, 60, 122, 13, 251, 157, 246, 199, 150, 255, 206, 237, 62, 201, 228, 189, 221, + 109, 67, 87, 54, 160, 17, 173, 95, 185, 33, 33, 189, 64, 246, 254, 0, 233, 94, 182, 89, 62, + 156, 110, 194, 202, 25, 85, 14, 46, 64, 73, 181, 15, 115, 80, 231, 238, 46, 42, 94, 10, 246, + 101, 205, 172, 15, 15, 251, 84, 19, 144, 62, 109, 122, 103, 73, 56, 136, 181, 240, 46, 51, + 244, 24, 106, 44, 237, 70, 126, 109, 61, 213, 38, 98, 94, 102, 116, 122, 36, 175, 180, 158, + 185, 91, 162, 213, 147, 195, 17, 101, 45, 72, 147, 52, 89, 20, 47, 70, 77, 140, 146, 197, + 13, 30, 252, 137, 186, 60, 100, 80, 93, 5, 161, 102, 40, 49, 84, 14, 138, 148, 178, 221, 92, + 197, 74, 194, 125, 186, 173, 147, 245, 104, 140, 43, 90, 158, 191, 47, 102, 121, 69, 212, + 87, 132, 162, 247, 237, 164, 84, 94, 171, 244, 26, 197, 172, 194, 30, 165, 90, 31, 42, 236, + 25, 216, 208, 190, 229, 121, 2, 105, 236, 99, 105, 77, 178, 247, 7, 200, 50, 186, 122, 191, + 103, 15, 244, 84, 12, 249, 188, 158, 74, 43, 139, 154, 214, 229, 206, 192, 117, 69, 91, 88, + 248, 122, 26, 168, 166, 136, 197, 184, 225, 153, 241, 247, 253, 129, 193, 56, 201, 12, 101, + 60, 212, 24, 117, 171, 116, 87, 132, 57, 236, 80, 188, 68, 245, 69, 163, 80, 213, 9, 171, + 231, 9, 197, 137, 229, 48, 166, 214, 253, 226, 207, 105, 133, 37, 107, 195, 131, 81, 61, 78, + 147, 105, 152, 146, 220, 23, 164, 115, 88, 174, 239, 252, 16, 235, 105, 13, 23, 62, 77, 84, + 115, 175, 5, 10, 35, 225, 193, 236, 114, 129, 25, 103, 57, 34, 32, 157, 22, 119, 175, 21, + 189, 147, 149, 110, 244, 223, 244, 192, 133, 79, 104, 119, 81, 72, 226, 221, 59, 209, 80, + 234, 186, 242, 253, 117, 248, 115, 30, 29, 219, 240, 166, 8, 182, 162, 123, 81, 150, 112, + 93, 122, 125, 14, 101, 188, 16, 18, 173, 225, 219, 230, 178, 205, 173, 247, 55, 214, 25, + 255, 251, 226, 15, 222, 107, 253, 150, 159, 90, 57, 223, 196, 247, 129, 207, 173, 39, 45, + 124, 238, 15, 94, 63, 47, 116, 7, 248, 86, 225, 32, 223, 123, 215, 135, 207, 121, 104, 29, + 1, 249, 215, 253, 233, 163, 233, 184, 27, 242, 45, 238, 163, 134, 120, 211, 97, 231, 192, + 249, 199, 148, 167, 161, 112, 69, 220, 145, 147, 188, 53, 120, 242, 199, 57, 105, 57, 207, + 106, 134, 168, 41, 180, 222, 41, 239, 171, 2, 93, 250, 58, 44, 106, 210, 215, 209, 46, 53, + 17, 238, 62, 143, 215, 125, 244, 37, 119, 24, 146, 51, 174, 4, 224, 239, 201, 177, 239, 191, + 15, 45, 239, 162, 170, 153, 14, 77, 121, 105, 20, 42, 140, 55, 85, 97, 46, 55, 172, 241, 86, + 248, 178, 14, 246, 39, 37, 208, 138, 238, 242, 239, 251, 195, 199, 63, 164, 73, 54, 135, + 167, 164, 42, 80, 253, 230, 27, 49, 195, 122, 178, 129, 46, 105, 92, 151, 122, 59, 15, 121, + 205, 40, 158, 156, 231, 99, 125, 103, 72, 202, 30, 134, 236, 202, 123, 53, 98, 122, 73, 20, + 206, 199, 42, 172, 251, 235, 42, 54, 217, 140, 142, 194, 184, 75, 73, 203, 194, 70, 181, 72, + 201, 2, 157, 111, 3, 225, 132, 204, 166, 195, 138, 200, 128, 15, 30, 252, 113, 102, 140, + 178, 193, 48, 244, 103, 215, 34, 43, 211, 121, 151, 32, 24, 210, 85, 191, 134, 12, 105, 204, + 131, 118, 49, 93, 241, 113, 138, 228, 25, 139, 18, 61, 8, 201, 33, 247, 5, 136, 14, 21, 84, + 158, 228, 236, 87, 69, 53, 157, 10, 235, 98, 153, 212, 184, 230, 93, 201, 125, 176, 168, 46, + 130, 46, 235, 96, 127, 97, 28, 35, 82, 255, 158, 136, 181, 230, 125, 161, 51, 131, 21, 185, + 216, 160, 61, 195, 49, 241, 193, 230, 205, 75, 87, 248, 48, 68, 146, 171, 239, 106, 179, + 147, 180, 148, 234, 67, 236, 238, 90, 151, 236, 197, 16, 141, 17, 92, 43, 35, 79, 43, 219, + 147, 205, 40, 115, 110, 247, 138, 144, 88, 118, 248, 184, 50, 253, 87, 160, 153, 134, 69, + 237, 60, 111, 222, 109, 154, 76, 47, 243, 232, 251, 247, 253, 1, 171, 169, 85, 49, 101, 12, + 86, 132, 227, 20, 246, 78, 49, 201, 130, 194, 198, 47, 55, 26, 32, 37, 93, 200, 13, 96, 203, + 104, 65, 234, 183, 42, 238, 22, 25, 146, 23, 243, 214, 117, 54, 240, 19, 179, 243, 192, 160, + 34, 174, 174, 185, 136, 224, 84, 244, 100, 179, 237, 135, 84, 150, 13, 94, 247, 13, 107, 61, + 253, 230, 151, 133, 242, 2, 2, 207, 3, 142, 62, 56, 136, 229, 26, 223, 25, 30, 7, 190, 90, + 57, 186, 20, 54, 58, 126, 202, 52, 131, 119, 205, 46, 65, 212, 25, 178, 60, 242, 201, 227, + 102, 105, 188, 209, 9, 50, 178, 202, 125, 23, 159, 212, 99, 119, 255, 117, 45, 100, 129, + 126, 237, 131, 247, 141, 219, 164, 167, 83, 238, 84, 185, 142, 205, 70, 61, 156, 93, 111, + 235, 150, 245, 47, 127, 47, 54, 5, 192, 38, 218, 14, 95, 91, 22, 134, 233, 17, 191, 39, 45, + 111, 11, 104, 185, 158, 172, 97, 41, 159, 245, 162, 13, 215, 121, 91, 18, 60, 161, 124, 100, + 47, 102, 224, 247, 181, 167, 124, 16, 80, 11, 20, 95, 62, 0, 163, 249, 250, 225, 75, 23, + 202, 102, 206, 117, 39, 111, 31, 132, 55, 96, 91, 37, 155, 253, 206, 228, 233, 135, 249, + 247, 68, 44, 132, 48, 207, 19, 119, 173, 224, 221, 105, 160, 240, 241, 18, 232, 164, 220, + 43, 253, 216, 57, 185, 238, 84, 177, 244, 125, 195, 3, 78, 203, 47, 63, 149, 176, 247, 20, + 178, 221, 65, 100, 187, 41, 79, 39, 220, 111, 246, 135, 139, 228, 144, 196, 92, 55, 2, 181, + 75, 85, 249, 121, 82, 251, 200, 131, 241, 7, 68, 158, 72, 254, 183, 97, 202, 245, 232, 15, + 242, 64, 134, 252, 251, 254, 128, 213, 58, 208, 51, 219, 74, 112, 217, 251, 190, 215, 74, + 171, 70, 243, 50, 129, 190, 56, 9, 219, 216, 62, 175, 108, 238, 13, 16, 32, 106, 104, 215, + 237, 235, 3, 132, 171, 132, 61, 55, 70, 220, 57, 131, 206, 98, 233, 255, 116, 30, 240, 128, + 55, 67, 174, 71, 222, 21, 138, 156, 218, 67, 77, 127, 42, 124, 89, 168, 178, 223, 221, 72, + 235, 238, 35, 139, 254, 65, 156, 225, 152, 64, 127, 14, 29, 154, 108, 0, 240, 42, 178, 197, + 228, 129, 66, 103, 23, 85, 124, 52, 24, 244, 183, 106, 186, 107, 205, 227, 143, 50, 162, 86, + 185, 224, 254, 0, 105, 133, 214, 115, 186, 159, 99, 100, 172, 235, 204, 79, 174, 48, 181, + 218, 184, 174, 155, 113, 101, 149, 111, 66, 111, 176, 31, 6, 170, 239, 235, 26, 143, 145, + 125, 223, 197, 60, 202, 65, 78, 43, 112, 237, 119, 222, 117, 216, 247, 97, 235, 54, 121, 55, + 130, 122, 62, 127, 32, 185, 150, 17, 109, 158, 156, 145, 217, 186, 54, 29, 112, 234, 234, + 92, 15, 67, 182, 174, 176, 142, 171, 97, 244, 152, 70, 195, 248, 63, 221, 85, 146, 229, 74, + 14, 2, 247, 62, 133, 79, 224, 167, 121, 56, 143, 183, 191, 238, 191, 109, 136, 0, 13, 89, + 213, 43, 59, 4, 137, 144, 196, 16, 120, 20, 58, 199, 72, 221, 156, 227, 165, 71, 250, 106, + 145, 150, 15, 112, 28, 203, 184, 63, 77, 53, 240, 185, 159, 231, 2, 252, 160, 219, 13, 129, + 72, 250, 41, 64, 67, 58, 124, 198, 97, 205, 185, 185, 38, 135, 127, 154, 120, 252, 80, 54, + 215, 247, 188, 180, 73, 64, 225, 57, 57, 16, 99, 128, 153, 201, 79, 172, 0, 166, 39, 190, + 139, 158, 129, 248, 44, 154, 123, 211, 174, 156, 187, 52, 37, 192, 235, 18, 219, 135, 195, + 199, 121, 54, 155, 252, 202, 176, 165, 108, 163, 223, 185, 0, 63, 192, 38, 109, 193, 71, 50, + 181, 95, 15, 216, 49, 123, 126, 183, 186, 248, 215, 252, 123, 59, 118, 136, 156, 225, 178, + 29, 179, 113, 32, 28, 27, 126, 95, 143, 5, 124, 159, 239, 15, 178, 229, 65, 224, 64, 153, + 247, 149, 227, 243, 48, 232, 142, 123, 239, 183, 193, 1, 50, 223, 103, 57, 207, 106, 247, + 225, 199, 203, 172, 4, 204, 27, 133, 169, 210, 214, 144, 130, 104, 255, 181, 133, 146, 234, + 24, 86, 110, 177, 178, 77, 230, 138, 121, 92, 153, 65, 113, 178, 105, 247, 90, 226, 178, + 232, 104, 61, 144, 91, 246, 5, 108, 107, 95, 194, 157, 203, 213, 203, 247, 138, 50, 136, 90, + 206, 216, 224, 130, 248, 56, 155, 213, 170, 185, 208, 121, 132, 105, 211, 11, 194, 213, 62, + 46, 253, 51, 142, 51, 116, 134, 157, 56, 2, 46, 71, 161, 22, 216, 245, 161, 163, 117, 0, 98, + 238, 106, 223, 153, 71, 15, 143, 245, 16, 205, 72, 190, 4, 110, 147, 35, 92, 176, 41, 187, + 181, 222, 223, 217, 74, 163, 38, 195, 247, 213, 233, 77, 68, 236, 119, 237, 181, 127, 2, 85, + 188, 100, 198, 50, 146, 170, 109, 38, 209, 73, 47, 131, 150, 82, 179, 140, 253, 187, 142, + 137, 222, 219, 85, 205, 186, 112, 214, 239, 189, 35, 151, 234, 190, 145, 135, 124, 95, 140, + 61, 40, 202, 166, 143, 19, 29, 64, 143, 47, 143, 25, 249, 109, 3, 253, 82, 108, 243, 66, 0, + 169, 209, 215, 230, 200, 144, 255, 192, 130, 26, 239, 94, 147, 79, 80, 237, 139, 108, 126, + 85, 23, 132, 77, 91, 171, 10, 75, 227, 222, 58, 29, 62, 32, 148, 19, 143, 84, 81, 143, 196, + 183, 172, 37, 5, 125, 51, 192, 183, 252, 233, 39, 197, 187, 177, 160, 76, 87, 74, 7, 178, + 168, 30, 72, 1, 193, 78, 194, 165, 186, 11, 106, 252, 159, 234, 13, 160, 121, 201, 64, 146, + 50, 210, 91, 17, 7, 196, 138, 18, 154, 139, 177, 164, 140, 72, 86, 127, 19, 19, 171, 153, + 221, 249, 182, 169, 239, 240, 160, 106, 189, 85, 97, 103, 142, 198, 180, 45, 55, 212, 11, + 88, 70, 225, 144, 5, 109, 167, 2, 193, 234, 26, 158, 91, 80, 130, 157, 57, 169, 154, 26, 96, + 167, 104, 114, 143, 113, 3, 42, 94, 50, 142, 145, 210, 48, 115, 49, 242, 44, 68, 61, 83, + 115, 240, 24, 229, 45, 169, 18, 58, 21, 235, 13, 68, 175, 162, 53, 200, 241, 179, 54, 66, + 249, 108, 58, 87, 39, 90, 253, 228, 1, 117, 3, 171, 49, 218, 32, 116, 255, 182, 219, 171, + 57, 170, 125, 59, 174, 35, 145, 226, 92, 224, 212, 164, 44, 198, 85, 183, 237, 202, 212, + 102, 181, 27, 141, 70, 156, 122, 225, 91, 237, 216, 186, 17, 250, 180, 146, 162, 197, 186, + 126, 30, 216, 209, 196, 4, 40, 200, 9, 113, 198, 139, 4, 101, 35, 206, 187, 4, 229, 19, 212, + 184, 16, 84, 123, 218, 210, 200, 102, 194, 227, 68, 100, 191, 209, 126, 81, 141, 94, 37, + 116, 146, 17, 84, 18, 3, 60, 165, 7, 130, 238, 45, 29, 205, 230, 184, 156, 248, 130, 98, + 140, 86, 37, 206, 7, 21, 245, 210, 146, 62, 185, 75, 115, 90, 173, 33, 212, 83, 89, 31, 248, + 255, 254, 159, 90, 76, 228, 101, 38, 124, 178, 225, 100, 13, 118, 118, 95, 72, 139, 108, + 159, 152, 188, 244, 248, 32, 187, 197, 92, 86, 75, 6, 142, 140, 159, 222, 8, 131, 61, 117, + 49, 172, 14, 41, 44, 167, 253, 1, 181, 39, 150, 219, 154, 68, 145, 79, 50, 242, 122, 119, + 220, 172, 243, 143, 65, 241, 164, 105, 113, 64, 95, 200, 98, 36, 159, 143, 43, 28, 120, 238, + 167, 239, 48, 112, 35, 232, 222, 210, 120, 176, 231, 73, 146, 75, 59, 95, 141, 197, 102, 62, + 232, 44, 240, 119, 104, 186, 195, 152, 53, 91, 225, 82, 230, 200, 117, 47, 36, 45, 72, 117, + 237, 45, 48, 27, 237, 96, 11, 147, 133, 82, 119, 178, 10, 28, 109, 79, 21, 23, 130, 242, 41, + 109, 139, 130, 78, 5, 197, 70, 174, 134, 62, 37, 11, 206, 192, 181, 21, 8, 116, 190, 174, + 51, 198, 3, 66, 125, 248, 20, 134, 119, 124, 44, 28, 230, 52, 99, 20, 118, 159, 255, 184, + 153, 117, 197, 68, 229, 97, 3, 110, 110, 191, 32, 212, 167, 117, 202, 209, 109, 179, 115, + 65, 189, 107, 43, 83, 84, 56, 234, 145, 86, 169, 163, 125, 44, 185, 180, 251, 73, 168, 28, + 71, 96, 39, 125, 136, 209, 180, 103, 94, 121, 150, 6, 123, 251, 66, 236, 4, 17, 183, 39, + 202, 195, 233, 142, 94, 143, 32, 176, 93, 233, 87, 58, 168, 92, 8, 186, 3, 168, 98, 168, + 146, 90, 104, 210, 54, 13, 215, 213, 220, 158, 88, 2, 137, 181, 93, 72, 137, 74, 198, 234, + 115, 180, 107, 20, 50, 97, 87, 114, 53, 184, 51, 242, 110, 57, 10, 217, 114, 148, 44, 168, + 69, 10, 39, 254, 23, 54, 184, 224, 65, 29, 217, 1, 19, 143, 53, 41, 213, 144, 191, 209, 247, + 245, 75, 218, 200, 20, 237, 190, 232, 154, 48, 36, 154, 13, 198, 35, 37, 67, 5, 21, 110, + 130, 72, 159, 172, 118, 13, 19, 2, 116, 59, 165, 144, 225, 125, 59, 186, 197, 141, 168, 185, + 49, 43, 188, 82, 211, 70, 96, 52, 182, 78, 203, 236, 98, 254, 229, 248, 62, 144, 214, 52, + 129, 13, 59, 206, 121, 84, 12, 243, 207, 132, 85, 95, 235, 252, 15, 189, 223, 146, 146, 143, + 221, 171, 240, 6, 42, 70, 227, 216, 141, 47, 48, 218, 190, 245, 7, 196, 185, 158, 242, 96, + 144, 151, 16, 15, 219, 126, 125, 66, 2, 50, 202, 142, 109, 36, 47, 111, 69, 136, 236, 2, + 154, 213, 166, 149, 210, 15, 67, 69, 203, 184, 86, 183, 106, 36, 106, 208, 229, 100, 129, + 151, 246, 121, 178, 118, 243, 27, 65, 245, 33, 69, 112, 15, 252, 47, 201, 35, 157, 213, 53, + 49, 242, 245, 87, 175, 153, 104, 196, 27, 240, 185, 104, 82, 178, 236, 223, 13, 117, 7, 115, + 60, 230, 245, 161, 156, 162, 179, 51, 196, 190, 201, 159, 114, 224, 183, 205, 88, 23, 248, + 122, 191, 225, 241, 255, 221, 208, 155, 39, 111, 74, 27, 91, 166, 77, 219, 98, 14, 103, 148, + 106, 212, 31, 39, 215, 39, 132, 242, 67, 78, 74, 208, 112, 87, 145, 244, 175, 97, 32, 133, + 178, 50, 15, 193, 67, 207, 53, 45, 127, 244, 76, 145, 193, 58, 140, 130, 112, 8, 43, 249, + 237, 157, 80, 21, 217, 9, 123, 100, 50, 249, 238, 52, 24, 199, 234, 162, 219, 149, 3, 65, + 247, 148, 38, 61, 29, 106, 134, 242, 178, 96, 119, 60, 135, 145, 243, 84, 22, 53, 205, 54, + 232, 44, 250, 221, 44, 26, 82, 166, 110, 169, 94, 253, 150, 165, 164, 83, 134, 236, 129, 76, + 199, 48, 128, 7, 169, 140, 150, 72, 247, 112, 232, 191, 16, 159, 249, 144, 6, 223, 35, 49, + 174, 108, 254, 233, 209, 210, 185, 245, 77, 195, 150, 52, 48, 185, 187, 179, 101, 87, 158, + 221, 102, 179, 14, 249, 52, 250, 103, 132, 192, 166, 165, 88, 45, 83, 209, 76, 117, 56, 100, + 41, 11, 156, 39, 251, 47, 196, 34, 120, 72, 7, 58, 160, 239, 188, 122, 134, 143, 153, 94, + 236, 131, 37, 125, 181, 141, 67, 3, 44, 109, 51, 93, 129, 153, 188, 89, 226, 211, 118, 81, + 18, 221, 188, 125, 8, 200, 238, 66, 52, 198, 31, 217, 39, 180, 226, 57, 141, 210, 14, 194, + 79, 73, 52, 5, 59, 229, 80, 90, 106, 29, 81, 183, 137, 218, 60, 167, 89, 202, 145, 205, 179, + 103, 226, 0, 105, 29, 52, 44, 35, 197, 141, 160, 123, 75, 209, 164, 5, 165, 213, 194, 141, + 115, 129, 1, 104, 141, 119, 90, 213, 81, 149, 100, 19, 169, 104, 2, 66, 38, 112, 178, 48, + 204, 133, 49, 23, 55, 80, 58, 26, 201, 67, 198, 62, 203, 65, 123, 228, 236, 144, 198, 77, + 197, 46, 4, 54, 69, 197, 8, 162, 122, 193, 84, 56, 179, 52, 92, 135, 32, 63, 25, 74, 99, + 210, 106, 98, 28, 15, 210, 139, 241, 221, 80, 73, 162, 78, 167, 180, 214, 193, 17, 111, 172, + 8, 214, 101, 51, 159, 107, 245, 127, 99, 154, 117, 123, 74, 78, 82, 147, 255, 231, 9, 130, + 37, 239, 220, 54, 16, 221, 141, 209, 157, 253, 40, 44, 193, 98, 113, 112, 111, 200, 248, + 188, 13, 185, 244, 128, 112, 157, 67, 203, 118, 253, 194, 138, 182, 235, 204, 251, 229, 122, + 194, 123, 45, 215, 15, 199, 47, 183, 151, 211, 219, 227, 36, 183, 126, 120, 204, 154, 101, + 30, 39, 139, 6, 243, 248, 134, 240, 88, 106, 113, 95, 43, 63, 15, 44, 168, 218, 150, 217, + 91, 135, 58, 179, 106, 37, 163, 82, 170, 144, 14, 58, 12, 23, 41, 120, 27, 4, 155, 194, 0, + 105, 69, 64, 162, 15, 227, 24, 113, 154, 222, 51, 109, 70, 243, 112, 174, 186, 46, 168, 82, + 247, 132, 112, 31, 140, 67, 181, 213, 247, 13, 180, 164, 133, 186, 246, 12, 254, 248, 99, + 55, 24, 164, 154, 181, 17, 139, 190, 141, 216, 211, 13, 250, 233, 243, 229, 118, 242, 75, + 166, 197, 102, 94, 115, 183, 78, 84, 56, 108, 157, 16, 99, 16, 185, 159, 174, 12, 29, 130, + 78, 104, 84, 134, 113, 161, 132, 164, 172, 52, 251, 190, 222, 255, 9, 48, 0, 249, 20, 11, + 80, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, + 51, 53, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, + 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 52, 53, + 49, 56, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 108, 87, 73, 154, 36, 173, 14, + 219, 215, 41, 234, 2, 157, 31, 243, 112, 158, 218, 188, 69, 245, 253, 183, 207, 150, 4, 1, + 209, 255, 42, 83, 216, 1, 182, 241, 32, 114, 248, 164, 242, 253, 39, 247, 79, 158, 245, 59, + 135, 79, 237, 64, 181, 29, 32, 181, 239, 159, 175, 5, 219, 103, 66, 214, 240, 127, 12, 124, + 149, 123, 5, 108, 147, 154, 177, 17, 215, 4, 113, 160, 114, 190, 254, 255, 124, 253, 239, + 43, 230, 79, 205, 223, 127, 74, 251, 4, 59, 254, 239, 11, 27, 154, 185, 2, 166, 233, 104, + 224, 127, 245, 111, 13, 181, 73, 89, 47, 46, 171, 19, 96, 204, 27, 64, 243, 146, 197, 114, + 124, 37, 176, 182, 20, 76, 167, 98, 44, 55, 128, 221, 233, 83, 96, 89, 253, 204, 14, 195, + 239, 5, 131, 157, 198, 134, 12, 212, 232, 85, 50, 217, 15, 148, 101, 187, 29, 108, 8, 225, + 115, 155, 226, 11, 65, 247, 150, 34, 180, 238, 12, 128, 34, 50, 169, 25, 181, 43, 207, 76, + 73, 8, 170, 169, 211, 2, 237, 25, 235, 105, 222, 203, 246, 19, 194, 221, 104, 127, 109, 165, + 124, 70, 114, 103, 79, 104, 234, 33, 3, 20, 250, 50, 1, 58, 207, 129, 233, 197, 213, 13, + 204, 140, 93, 195, 116, 224, 153, 227, 40, 13, 133, 100, 20, 224, 82, 79, 105, 29, 12, 102, + 162, 108, 74, 183, 38, 138, 75, 122, 28, 173, 238, 226, 141, 160, 123, 74, 227, 103, 52, + 162, 232, 142, 27, 28, 203, 190, 31, 184, 21, 105, 252, 252, 190, 125, 60, 129, 7, 196, 12, + 211, 54, 30, 143, 250, 105, 113, 33, 251, 79, 77, 251, 105, 72, 118, 255, 15, 31, 155, 155, + 203, 216, 76, 175, 20, 236, 87, 175, 255, 63, 95, 183, 100, 70, 30, 19, 60, 42, 225, 83, 58, + 61, 73, 149, 230, 6, 185, 230, 25, 98, 48, 165, 195, 209, 172, 8, 182, 34, 229, 170, 132, + 132, 106, 174, 59, 139, 78, 224, 231, 251, 89, 42, 144, 223, 175, 241, 73, 97, 9, 127, 191, + 186, 47, 34, 225, 154, 161, 166, 91, 66, 254, 57, 204, 76, 242, 98, 171, 47, 216, 60, 52, + 56, 125, 120, 84, 58, 77, 27, 10, 75, 144, 151, 205, 214, 45, 233, 100, 120, 207, 142, 70, + 144, 204, 52, 119, 156, 203, 48, 73, 233, 245, 9, 250, 115, 29, 126, 61, 201, 239, 233, 79, + 177, 22, 49, 236, 122, 78, 100, 169, 132, 207, 172, 179, 120, 191, 147, 41, 197, 126, 189, + 113, 125, 114, 33, 140, 214, 170, 62, 69, 138, 201, 255, 79, 10, 82, 130, 94, 45, 204, 248, + 105, 162, 166, 111, 186, 127, 35, 193, 228, 118, 165, 238, 251, 50, 32, 79, 76, 229, 2, 80, + 60, 101, 73, 1, 40, 48, 48, 31, 87, 110, 214, 151, 93, 80, 137, 55, 234, 233, 116, 252, 117, + 165, 99, 189, 72, 191, 90, 48, 147, 66, 102, 238, 117, 238, 86, 38, 60, 236, 195, 133, 149, + 238, 182, 252, 2, 171, 1, 32, 215, 92, 82, 213, 2, 142, 133, 221, 81, 172, 81, 38, 66, 69, + 47, 169, 53, 101, 30, 85, 198, 211, 14, 121, 240, 141, 160, 123, 75, 167, 118, 106, 156, 8, + 33, 235, 198, 88, 4, 60, 208, 23, 114, 130, 156, 37, 230, 126, 95, 0, 170, 89, 183, 216, + 146, 103, 232, 107, 193, 231, 4, 147, 232, 248, 175, 238, 180, 96, 198, 96, 80, 11, 49, 51, + 47, 0, 189, 57, 159, 236, 181, 35, 10, 35, 217, 61, 163, 12, 218, 134, 11, 79, 96, 20, 69, + 27, 215, 127, 251, 40, 105, 215, 225, 118, 217, 125, 169, 64, 60, 212, 60, 101, 208, 28, 88, + 80, 219, 190, 226, 27, 49, 60, 186, 202, 90, 96, 144, 197, 19, 183, 54, 10, 209, 208, 45, + 90, 107, 122, 99, 191, 137, 66, 148, 226, 30, 33, 9, 46, 160, 163, 176, 151, 38, 4, 201, 32, + 43, 43, 33, 153, 95, 80, 61, 115, 144, 63, 148, 138, 166, 41, 232, 78, 253, 222, 208, 114, + 159, 36, 97, 122, 105, 139, 75, 176, 4, 44, 178, 145, 216, 42, 163, 162, 45, 231, 234, 13, + 187, 161, 165, 187, 32, 178, 171, 160, 140, 12, 122, 233, 54, 86, 152, 19, 150, 250, 70, + 174, 11, 175, 73, 109, 126, 111, 56, 172, 31, 218, 255, 225, 181, 210, 121, 187, 121, 122, + 116, 126, 172, 27, 226, 174, 141, 253, 152, 133, 3, 69, 229, 104, 248, 71, 25, 97, 180, 14, + 237, 51, 124, 176, 208, 162, 39, 193, 252, 68, 74, 114, 191, 254, 163, 243, 3, 248, 221, + 255, 94, 104, 117, 254, 136, 51, 12, 205, 166, 239, 214, 77, 148, 12, 92, 49, 170, 58, 65, + 225, 80, 56, 16, 84, 79, 233, 170, 90, 29, 147, 216, 178, 141, 219, 45, 150, 80, 232, 174, + 104, 1, 89, 222, 228, 5, 39, 204, 102, 135, 33, 174, 9, 142, 176, 13, 43, 9, 100, 34, 138, + 43, 35, 128, 55, 66, 94, 14, 236, 221, 53, 45, 94, 11, 158, 243, 130, 141, 105, 237, 25, + 127, 124, 221, 7, 119, 43, 44, 214, 76, 52, 0, 162, 236, 234, 65, 37, 192, 150, 225, 252, + 245, 224, 22, 59, 4, 67, 87, 213, 82, 61, 56, 139, 5, 170, 125, 111, 162, 198, 92, 127, 193, + 131, 200, 73, 30, 85, 184, 44, 24, 67, 249, 105, 145, 8, 62, 38, 116, 194, 88, 55, 132, 105, + 150, 113, 155, 55, 130, 238, 45, 29, 106, 123, 188, 226, 64, 158, 162, 75, 13, 42, 114, 80, + 176, 105, 233, 184, 219, 231, 5, 60, 197, 14, 56, 44, 125, 217, 26, 70, 116, 212, 215, 188, + 3, 201, 26, 232, 32, 107, 88, 176, 10, 56, 12, 59, 233, 180, 245, 242, 136, 34, 0, 51, 182, + 48, 58, 223, 25, 180, 57, 250, 255, 198, 163, 226, 226, 62, 131, 243, 32, 122, 253, 249, 75, + 66, 227, 165, 237, 201, 1, 182, 190, 57, 83, 36, 25, 32, 153, 98, 79, 232, 59, 4, 63, 95, + 69, 69, 192, 32, 20, 255, 88, 19, 185, 232, 97, 80, 208, 129, 92, 179, 46, 22, 149, 93, 168, + 214, 106, 246, 184, 198, 38, 23, 182, 97, 56, 137, 71, 38, 95, 14, 0, 73, 196, 26, 244, 191, + 110, 78, 148, 138, 11, 163, 8, 147, 39, 110, 97, 26, 59, 235, 14, 231, 225, 13, 87, 148, 55, + 99, 10, 193, 209, 162, 119, 101, 128, 5, 76, 122, 62, 157, 4, 12, 221, 232, 152, 190, 105, + 140, 123, 76, 249, 158, 107, 108, 121, 151, 41, 222, 112, 196, 89, 10, 59, 210, 186, 195, + 42, 130, 200, 218, 50, 164, 251, 46, 9, 72, 119, 21, 143, 104, 38, 191, 193, 170, 121, 131, + 231, 133, 25, 215, 240, 159, 85, 94, 213, 214, 153, 240, 139, 158, 177, 217, 171, 53, 239, + 82, 170, 248, 69, 165, 53, 15, 104, 100, 11, 139, 56, 92, 253, 140, 145, 103, 204, 34, 226, + 90, 240, 202, 3, 225, 62, 254, 66, 235, 89, 71, 60, 146, 83, 101, 69, 45, 121, 186, 121, 12, + 135, 36, 209, 227, 139, 118, 150, 60, 219, 242, 46, 84, 81, 179, 54, 87, 231, 93, 172, 15, + 102, 94, 224, 97, 132, 146, 69, 154, 0, 58, 183, 4, 1, 181, 109, 243, 53, 178, 251, 231, + 125, 203, 193, 135, 249, 5, 16, 104, 13, 141, 22, 188, 239, 221, 88, 113, 9, 186, 161, 216, + 0, 98, 103, 210, 169, 23, 227, 42, 209, 103, 12, 181, 248, 70, 80, 189, 164, 81, 109, 219, + 200, 165, 50, 98, 55, 71, 214, 141, 239, 186, 138, 33, 128, 79, 93, 0, 25, 71, 35, 101, 243, + 131, 248, 223, 247, 67, 158, 238, 131, 252, 27, 25, 225, 105, 233, 164, 196, 250, 179, 165, + 192, 249, 31, 229, 113, 72, 166, 6, 128, 219, 137, 18, 51, 144, 50, 60, 66, 237, 27, 100, + 57, 30, 68, 226, 2, 160, 170, 213, 91, 17, 72, 65, 7, 83, 189, 112, 100, 97, 58, 4, 231, + 107, 24, 222, 14, 7, 167, 69, 243, 182, 102, 251, 61, 154, 100, 18, 47, 248, 131, 125, 43, + 23, 26, 185, 220, 137, 35, 232, 59, 40, 70, 116, 192, 209, 217, 208, 105, 28, 138, 195, 96, + 146, 122, 137, 137, 185, 228, 127, 32, 92, 42, 34, 61, 219, 167, 123, 33, 122, 170, 28, 78, + 85, 31, 63, 135, 79, 98, 157, 238, 212, 210, 148, 83, 55, 252, 193, 198, 135, 75, 7, 114, + 82, 58, 31, 143, 10, 103, 219, 242, 168, 32, 87, 151, 67, 5, 181, 190, 252, 185, 16, 220, + 33, 73, 125, 188, 185, 176, 233, 135, 248, 248, 82, 216, 181, 30, 103, 236, 40, 186, 34, 61, + 121, 114, 33, 50, 246, 114, 222, 206, 133, 157, 36, 148, 237, 75, 246, 87, 233, 118, 197, + 80, 122, 92, 17, 127, 94, 190, 220, 16, 206, 128, 42, 31, 206, 92, 56, 166, 149, 124, 141, + 207, 162, 121, 186, 162, 183, 77, 110, 91, 79, 206, 92, 104, 63, 159, 182, 47, 39, 244, 135, + 216, 120, 238, 69, 207, 178, 229, 140, 56, 250, 242, 134, 93, 124, 123, 115, 67, 189, 243, + 82, 187, 50, 237, 94, 112, 254, 24, 143, 76, 3, 75, 58, 60, 138, 206, 196, 225, 80, 220, 60, + 125, 189, 14, 226, 149, 104, 241, 73, 32, 248, 116, 225, 136, 62, 186, 124, 10, 104, 70, + 203, 37, 67, 241, 241, 200, 20, 251, 225, 209, 13, 225, 81, 192, 176, 120, 28, 186, 176, 33, + 165, 30, 220, 97, 23, 62, 252, 9, 108, 98, 109, 43, 202, 157, 11, 65, 47, 204, 211, 155, 11, + 179, 217, 202, 27, 54, 229, 229, 205, 4, 53, 92, 222, 152, 98, 218, 198, 95, 192, 61, 17, + 95, 219, 158, 220, 120, 234, 77, 67, 79, 38, 187, 207, 242, 99, 114, 250, 153, 31, 115, 63, + 125, 210, 168, 47, 228, 164, 111, 150, 199, 139, 19, 141, 79, 221, 46, 240, 57, 35, 15, 134, + 158, 106, 190, 209, 88, 189, 216, 77, 190, 128, 219, 223, 125, 128, 111, 235, 79, 52, 56, + 219, 104, 250, 80, 159, 89, 182, 219, 108, 192, 9, 75, 139, 182, 94, 192, 89, 104, 31, 71, + 252, 47, 216, 245, 244, 128, 237, 6, 142, 190, 101, 227, 165, 63, 225, 239, 24, 187, 203, + 228, 27, 185, 3, 28, 138, 110, 216, 228, 3, 54, 200, 108, 199, 21, 220, 222, 159, 165, 243, + 249, 159, 139, 230, 49, 161, 63, 152, 214, 87, 77, 19, 83, 169, 221, 167, 216, 98, 57, 133, + 50, 181, 142, 3, 112, 207, 13, 131, 79, 238, 90, 30, 67, 46, 43, 221, 108, 209, 76, 119, 4, + 118, 147, 61, 9, 90, 31, 111, 123, 219, 13, 170, 166, 190, 96, 15, 139, 131, 122, 16, 235, + 102, 174, 66, 206, 126, 122, 174, 135, 180, 42, 250, 61, 156, 136, 187, 62, 216, 143, 124, + 190, 116, 107, 110, 83, 85, 190, 160, 229, 185, 128, 94, 255, 125, 47, 232, 77, 101, 168, + 102, 7, 49, 3, 244, 206, 30, 227, 116, 42, 147, 99, 57, 210, 125, 217, 234, 141, 216, 86, + 250, 130, 191, 55, 124, 154, 132, 191, 100, 249, 140, 244, 93, 71, 89, 61, 66, 6, 249, 211, + 194, 97, 35, 116, 230, 255, 130, 154, 24, 19, 11, 121, 106, 96, 140, 254, 248, 163, 247, + 168, 27, 61, 94, 8, 131, 160, 233, 112, 119, 233, 247, 189, 224, 144, 32, 31, 96, 100, 125, + 170, 216, 20, 23, 85, 237, 59, 246, 171, 150, 34, 62, 106, 7, 253, 153, 245, 148, 150, 114, + 162, 84, 52, 154, 214, 78, 161, 65, 187, 150, 19, 233, 204, 144, 168, 203, 203, 206, 152, + 123, 14, 39, 97, 159, 255, 64, 170, 223, 242, 81, 30, 148, 97, 192, 161, 157, 217, 170, 183, + 184, 13, 158, 20, 223, 136, 186, 151, 20, 19, 197, 80, 39, 26, 117, 67, 40, 143, 114, 88, + 93, 62, 203, 223, 116, 3, 112, 147, 164, 203, 142, 157, 252, 169, 236, 88, 189, 160, 131, + 88, 119, 30, 56, 75, 162, 176, 244, 123, 39, 207, 235, 197, 189, 252, 5, 248, 125, 200, 218, + 172, 183, 178, 37, 237, 99, 211, 132, 110, 156, 59, 35, 54, 123, 2, 213, 54, 199, 86, 37, + 253, 131, 24, 163, 44, 251, 6, 9, 84, 209, 190, 41, 86, 46, 4, 41, 120, 19, 253, 103, 193, + 211, 156, 151, 159, 211, 247, 149, 243, 40, 130, 46, 155, 35, 104, 245, 223, 247, 130, 65, + 62, 91, 34, 203, 168, 43, 2, 17, 229, 244, 227, 234, 165, 112, 97, 80, 94, 164, 238, 101, + 211, 249, 242, 148, 16, 218, 93, 226, 6, 101, 176, 148, 232, 84, 255, 1, 57, 81, 115, 36, + 64, 235, 125, 199, 103, 65, 223, 101, 34, 169, 182, 78, 72, 131, 107, 150, 46, 237, 41, 207, + 151, 80, 206, 84, 142, 56, 243, 229, 235, 9, 17, 158, 230, 55, 45, 123, 255, 222, 208, 64, + 135, 119, 86, 139, 25, 40, 2, 180, 200, 247, 11, 82, 59, 173, 215, 78, 47, 64, 230, 148, 1, + 144, 42, 3, 89, 79, 157, 153, 136, 233, 92, 24, 220, 117, 32, 130, 104, 157, 198, 119, 229, + 42, 187, 165, 61, 123, 113, 228, 84, 29, 27, 15, 189, 17, 183, 189, 164, 163, 177, 44, 117, + 72, 60, 11, 209, 110, 185, 28, 221, 163, 175, 102, 30, 198, 13, 160, 122, 201, 86, 241, 32, + 213, 76, 54, 142, 226, 233, 107, 12, 180, 211, 49, 142, 201, 229, 89, 65, 16, 233, 26, 241, + 232, 151, 50, 90, 168, 249, 210, 206, 162, 80, 8, 213, 109, 117, 43, 232, 176, 23, 248, 249, + 122, 203, 202, 115, 166, 163, 186, 107, 251, 121, 114, 22, 60, 69, 13, 69, 133, 186, 11, 86, + 194, 146, 168, 28, 121, 49, 1, 143, 204, 193, 112, 166, 120, 3, 60, 250, 192, 31, 237, 187, + 92, 249, 60, 61, 176, 161, 26, 215, 174, 6, 120, 69, 109, 242, 67, 142, 20, 245, 195, 7, 14, + 190, 45, 135, 204, 155, 210, 158, 109, 117, 60, 51, 46, 164, 221, 34, 92, 212, 247, 228, + 160, 234, 113, 45, 50, 23, 19, 232, 248, 15, 189, 90, 119, 59, 131, 229, 202, 17, 143, 207, + 27, 239, 199, 173, 218, 106, 245, 140, 133, 61, 100, 230, 202, 46, 182, 216, 161, 17, 209, + 240, 124, 156, 101, 199, 67, 138, 22, 59, 250, 88, 26, 75, 161, 17, 146, 191, 91, 189, 181, + 195, 143, 228, 239, 90, 119, 121, 9, 35, 174, 43, 176, 252, 210, 121, 91, 254, 208, 122, + 110, 54, 174, 220, 74, 249, 236, 81, 77, 212, 52, 122, 5, 191, 43, 254, 1, 104, 15, 22, 26, + 54, 176, 238, 221, 161, 232, 113, 21, 65, 77, 28, 182, 167, 51, 22, 111, 12, 56, 180, 105, + 2, 176, 116, 18, 26, 172, 193, 80, 30, 87, 179, 183, 79, 160, 206, 25, 192, 82, 78, 56, 192, + 71, 194, 36, 156, 209, 17, 106, 1, 153, 120, 232, 102, 190, 144, 242, 170, 123, 103, 123, + 62, 118, 132, 210, 50, 130, 216, 3, 189, 102, 159, 125, 137, 241, 85, 215, 33, 67, 186, 163, + 29, 70, 20, 16, 91, 135, 53, 240, 190, 37, 77, 124, 178, 85, 189, 105, 34, 230, 95, 21, 61, + 241, 247, 231, 247, 206, 44, 5, 242, 198, 39, 186, 190, 108, 137, 186, 89, 29, 221, 174, + 205, 143, 117, 16, 80, 28, 126, 230, 36, 44, 245, 168, 189, 0, 135, 86, 197, 64, 232, 168, + 18, 213, 42, 221, 25, 159, 133, 85, 79, 15, 234, 58, 71, 186, 11, 42, 217, 194, 127, 195, + 178, 50, 170, 61, 11, 191, 239, 133, 19, 242, 251, 60, 158, 179, 212, 149, 130, 55, 10, 124, + 90, 228, 5, 251, 153, 64, 224, 62, 39, 252, 249, 250, 15, 185, 124, 14, 60, 167, 140, 7, 66, + 221, 103, 252, 159, 52, 61, 175, 254, 79, 119, 181, 100, 55, 14, 195, 176, 125, 79, 145, 11, + 76, 159, 173, 191, 206, 147, 109, 115, 255, 237, 16, 0, 105, 75, 238, 235, 42, 134, 197, + 200, 18, 69, 1, 32, 191, 69, 214, 5, 174, 92, 183, 203, 132, 189, 200, 253, 23, 6, 41, 79, + 130, 83, 122, 195, 185, 134, 184, 68, 234, 104, 40, 223, 132, 13, 116, 212, 144, 38, 67, 71, + 8, 1, 150, 149, 58, 200, 40, 12, 71, 66, 43, 73, 89, 40, 4, 197, 103, 213, 71, 108, 29, 35, + 216, 61, 217, 207, 188, 114, 145, 42, 202, 239, 62, 3, 195, 89, 188, 11, 238, 72, 208, 34, + 50, 0, 167, 41, 207, 68, 100, 186, 153, 88, 252, 169, 91, 178, 161, 123, 107, 215, 40, 122, + 148, 116, 124, 75, 97, 52, 207, 1, 138, 210, 121, 116, 193, 122, 43, 204, 57, 101, 173, 156, + 224, 13, 230, 40, 244, 83, 248, 228, 117, 236, 122, 46, 180, 172, 51, 192, 219, 237, 44, + 254, 54, 47, 91, 108, 168, 51, 80, 169, 180, 19, 174, 110, 38, 225, 67, 12, 247, 87, 60, 39, + 186, 47, 167, 148, 148, 188, 193, 145, 139, 79, 160, 13, 114, 200, 100, 122, 156, 37, 78, + 207, 86, 15, 219, 155, 135, 82, 139, 253, 132, 11, 182, 115, 168, 66, 89, 71, 36, 122, 146, + 17, 54, 104, 29, 73, 120, 124, 59, 250, 117, 181, 147, 204, 120, 79, 108, 5, 122, 30, 245, + 26, 135, 61, 107, 191, 224, 123, 165, 95, 28, 253, 143, 220, 237, 28, 247, 69, 51, 138, 30, + 188, 9, 244, 131, 182, 49, 43, 64, 215, 212, 218, 87, 212, 232, 7, 110, 108, 44, 98, 168, + 205, 16, 195, 13, 48, 178, 149, 85, 41, 109, 63, 128, 149, 212, 110, 120, 186, 35, 7, 119, + 25, 78, 112, 207, 132, 92, 39, 224, 169, 97, 54, 189, 94, 74, 222, 232, 26, 74, 253, 242, + 58, 134, 142, 104, 123, 177, 72, 30, 101, 52, 173, 6, 154, 155, 20, 112, 38, 198, 36, 144, + 221, 67, 61, 95, 184, 213, 152, 214, 121, 213, 202, 109, 71, 239, 175, 223, 163, 126, 78, + 230, 154, 47, 196, 11, 170, 88, 199, 70, 81, 254, 21, 59, 125, 232, 64, 172, 200, 106, 131, + 150, 208, 48, 4, 7, 181, 147, 57, 90, 85, 116, 166, 180, 49, 148, 120, 25, 25, 154, 57, 122, + 50, 253, 83, 109, 16, 114, 133, 43, 185, 195, 55, 82, 76, 50, 195, 11, 101, 28, 212, 242, + 79, 153, 182, 243, 0, 153, 27, 0, 231, 199, 105, 169, 242, 121, 122, 220, 171, 21, 59, 149, + 120, 200, 102, 164, 66, 161, 49, 72, 53, 74, 197, 141, 214, 144, 174, 217, 142, 26, 171, + 130, 199, 97, 123, 207, 237, 129, 24, 187, 142, 118, 56, 122, 36, 49, 105, 222, 35, 139, 31, + 197, 213, 3, 23, 132, 236, 233, 163, 229, 166, 222, 71, 29, 211, 122, 36, 63, 161, 202, 11, + 246, 193, 139, 115, 222, 47, 126, 126, 191, 176, 63, 157, 96, 118, 236, 220, 155, 189, 13, + 3, 149, 251, 30, 159, 172, 158, 84, 195, 160, 159, 20, 122, 158, 236, 228, 48, 253, 139, 65, + 44, 205, 32, 58, 10, 212, 132, 220, 130, 173, 244, 240, 171, 141, 225, 67, 204, 55, 233, + 213, 14, 231, 230, 17, 94, 232, 32, 119, 225, 5, 254, 244, 27, 198, 84, 103, 245, 112, 56, + 30, 72, 130, 134, 165, 82, 157, 219, 181, 133, 192, 226, 164, 70, 118, 224, 178, 115, 242, + 243, 43, 28, 78, 126, 186, 144, 140, 147, 221, 160, 157, 124, 202, 177, 199, 86, 215, 132, + 48, 5, 150, 151, 237, 25, 249, 111, 178, 202, 106, 218, 62, 55, 180, 124, 118, 185, 111, + 153, 170, 22, 221, 128, 234, 180, 209, 135, 209, 197, 15, 12, 102, 57, 113, 35, 163, 245, + 249, 253, 85, 191, 189, 253, 49, 244, 179, 161, 202, 142, 210, 141, 63, 60, 141, 238, 123, + 209, 159, 198, 203, 155, 69, 255, 75, 166, 164, 153, 210, 184, 127, 28, 77, 171, 40, 233, + 114, 114, 247, 78, 210, 107, 219, 21, 182, 57, 68, 33, 39, 83, 255, 217, 225, 20, 143, 198, + 3, 237, 217, 188, 44, 224, 96, 105, 193, 114, 215, 7, 120, 127, 109, 112, 178, 240, 225, + 131, 179, 61, 39, 153, 228, 193, 108, 77, 73, 160, 38, 159, 206, 138, 39, 229, 114, 71, 8, + 221, 71, 155, 22, 181, 60, 182, 166, 56, 135, 3, 95, 171, 90, 6, 42, 100, 186, 175, 52, 63, + 155, 21, 24, 134, 214, 92, 60, 4, 74, 233, 68, 34, 119, 244, 254, 234, 223, 211, 29, 55, + 249, 220, 120, 112, 94, 163, 15, 216, 213, 108, 208, 172, 247, 104, 33, 219, 169, 89, 216, + 178, 20, 168, 122, 99, 211, 201, 102, 170, 227, 132, 106, 33, 200, 83, 167, 231, 149, 82, + 11, 198, 146, 215, 70, 101, 164, 107, 197, 96, 156, 58, 50, 202, 72, 163, 134, 2, 20, 198, + 101, 9, 80, 85, 96, 232, 143, 181, 27, 240, 116, 124, 198, 99, 234, 247, 127, 176, 194, 178, + 80, 78, 247, 70, 163, 96, 247, 195, 165, 26, 93, 1, 15, 120, 228, 75, 165, 38, 107, 208, + 213, 113, 122, 41, 74, 177, 144, 230, 104, 27, 209, 40, 70, 210, 89, 208, 83, 42, 153, 73, + 162, 188, 246, 222, 196, 193, 147, 28, 223, 126, 220, 157, 132, 210, 93, 173, 164, 29, 206, + 16, 70, 151, 193, 16, 50, 212, 233, 220, 1, 35, 151, 49, 40, 153, 252, 70, 90, 128, 184, + 252, 130, 141, 220, 215, 162, 136, 130, 8, 81, 205, 221, 9, 71, 203, 204, 247, 140, 73, 70, + 242, 196, 59, 103, 9, 69, 186, 92, 231, 28, 92, 4, 218, 200, 245, 129, 238, 89, 175, 209, + 222, 34, 77, 78, 226, 40, 191, 162, 200, 96, 1, 80, 199, 6, 1, 156, 8, 178, 72, 187, 175, + 119, 35, 166, 61, 96, 142, 33, 31, 89, 73, 133, 255, 12, 20, 121, 115, 108, 140, 158, 18, + 70, 41, 94, 38, 109, 120, 94, 236, 0, 35, 203, 32, 33, 227, 211, 55, 66, 119, 105, 8, 13, + 90, 184, 3, 131, 236, 171, 66, 122, 13, 146, 156, 209, 229, 250, 255, 104, 21, 24, 121, 228, + 219, 116, 199, 39, 193, 27, 175, 80, 198, 203, 117, 187, 14, 194, 47, 87, 6, 91, 38, 254, + 65, 215, 203, 2, 178, 246, 15, 1, 132, 218, 214, 26, 121, 53, 212, 198, 149, 114, 67, 37, + 47, 74, 225, 221, 10, 206, 57, 11, 150, 249, 64, 12, 166, 101, 54, 220, 47, 189, 194, 87, + 88, 142, 168, 84, 91, 128, 168, 100, 199, 64, 2, 42, 227, 222, 137, 228, 164, 15, 158, 26, + 176, 157, 187, 161, 170, 255, 149, 124, 201, 45, 246, 24, 106, 108, 54, 14, 120, 190, 252, + 26, 89, 54, 210, 180, 43, 54, 250, 213, 59, 144, 28, 189, 229, 0, 181, 76, 81, 134, 161, + 241, 154, 254, 75, 238, 174, 202, 46, 140, 138, 93, 244, 41, 52, 192, 208, 50, 45, 39, 179, + 137, 73, 229, 178, 120, 177, 203, 148, 107, 50, 50, 180, 63, 185, 147, 104, 67, 114, 16, 61, + 2, 152, 54, 154, 128, 115, 5, 181, 41, 80, 150, 255, 120, 97, 159, 87, 235, 122, 129, 115, + 42, 170, 148, 26, 55, 119, 168, 127, 4, 21, 164, 151, 127, 40, 99, 181, 138, 68, 51, 162, + 122, 239, 234, 69, 224, 120, 15, 144, 219, 232, 53, 174, 56, 152, 47, 224, 212, 160, 174, + 141, 81, 135, 63, 91, 61, 38, 151, 130, 116, 193, 191, 193, 35, 208, 215, 145, 112, 199, + 131, 73, 169, 135, 88, 98, 29, 151, 34, 194, 185, 74, 214, 218, 246, 44, 67, 66, 49, 19, + 207, 195, 144, 72, 15, 27, 170, 229, 7, 112, 92, 163, 176, 130, 238, 121, 248, 106, 226, 15, + 184, 90, 222, 117, 116, 252, 195, 48, 117, 171, 66, 242, 1, 92, 10, 112, 100, 15, 248, 70, + 240, 156, 247, 139, 31, 78, 47, 140, 250, 120, 98, 67, 218, 164, 214, 243, 88, 203, 91, 203, + 235, 237, 138, 255, 60, 48, 220, 155, 226, 77, 204, 193, 22, 83, 128, 58, 97, 184, 9, 22, + 70, 118, 69, 218, 254, 55, 192, 192, 109, 140, 21, 138, 53, 212, 101, 206, 35, 43, 50, 164, + 116, 48, 148, 46, 197, 115, 97, 174, 172, 173, 169, 200, 162, 99, 31, 221, 215, 189, 33, + 238, 211, 214, 224, 159, 61, 216, 161, 62, 94, 44, 16, 23, 219, 238, 207, 81, 215, 189, 86, + 245, 57, 246, 2, 126, 18, 77, 73, 251, 19, 50, 252, 49, 62, 29, 98, 123, 176, 250, 181, 46, + 187, 174, 168, 45, 86, 64, 231, 104, 241, 125, 165, 39, 98, 236, 58, 42, 179, 77, 131, 145, + 9, 71, 89, 182, 141, 77, 29, 203, 119, 255, 220, 242, 225, 205, 142, 49, 133, 106, 27, 78, + 224, 179, 67, 108, 98, 220, 9, 106, 108, 226, 152, 33, 124, 169, 73, 54, 205, 79, 13, 140, + 181, 243, 222, 252, 134, 24, 186, 142, 118, 120, 0, 162, 243, 229, 61, 14, 191, 49, 61, 118, + 248, 117, 186, 167, 245, 35, 222, 16, 23, 223, 163, 92, 76, 92, 62, 59, 92, 102, 182, 148, + 99, 40, 221, 121, 121, 35, 182, 248, 197, 168, 137, 139, 170, 62, 142, 70, 22, 13, 80, 187, + 33, 195, 231, 188, 135, 33, 20, 245, 218, 195, 134, 44, 246, 57, 122, 250, 204, 232, 110, + 49, 152, 31, 11, 209, 129, 170, 147, 0, 212, 22, 214, 101, 92, 199, 219, 47, 63, 169, 76, + 46, 251, 93, 129, 39, 135, 126, 188, 144, 63, 62, 15, 108, 40, 235, 67, 208, 26, 100, 195, + 73, 38, 151, 253, 59, 172, 178, 33, 111, 237, 23, 111, 67, 220, 239, 62, 90, 202, 69, 110, + 6, 252, 118, 231, 136, 45, 195, 157, 115, 199, 48, 219, 81, 121, 219, 29, 49, 246, 49, 42, + 208, 180, 34, 101, 181, 208, 159, 42, 141, 10, 125, 253, 218, 232, 130, 152, 152, 152, 183, + 65, 222, 63, 15, 28, 235, 87, 93, 15, 183, 191, 81, 7, 175, 255, 2, 12, 0, 92, 138, 253, + 205, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 51, 53, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 52, + 54, 55, 52, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 116, 87, 59, 182, 229, 56, + 14, 203, 107, 21, 111, 3, 229, 163, 255, 103, 61, 157, 76, 80, 179, 255, 116, 8, 128, 146, + 37, 87, 79, 116, 47, 76, 90, 166, 36, 18, 4, 211, 120, 230, 172, 63, 191, 115, 123, 102, + 169, 63, 105, 62, 161, 254, 95, 248, 207, 47, 123, 16, 9, 179, 193, 63, 55, 116, 80, 159, + 105, 175, 164, 241, 140, 82, 55, 180, 55, 199, 211, 66, 61, 237, 217, 191, 155, 202, 7, 253, + 243, 235, 63, 191, 114, 124, 90, 198, 147, 252, 212, 84, 127, 254, 251, 125, 0, 216, 0, 11, + 223, 52, 216, 135, 32, 188, 254, 129, 251, 152, 196, 8, 35, 103, 126, 120, 132, 235, 175, + 121, 157, 207, 159, 162, 8, 66, 6, 200, 147, 166, 222, 229, 247, 184, 107, 77, 48, 166, 164, + 157, 196, 94, 191, 144, 206, 151, 61, 61, 93, 145, 132, 4, 80, 167, 118, 49, 18, 157, 211, + 83, 162, 30, 180, 72, 231, 228, 187, 44, 153, 48, 68, 34, 11, 135, 155, 210, 46, 25, 206, + 191, 156, 200, 1, 113, 136, 201, 118, 223, 237, 73, 122, 230, 192, 25, 222, 56, 213, 39, + 243, 70, 12, 70, 34, 143, 44, 54, 94, 88, 125, 74, 87, 36, 9, 214, 158, 100, 157, 177, 126, + 33, 157, 103, 90, 155, 180, 188, 176, 83, 76, 190, 116, 249, 11, 27, 210, 158, 147, 237, 25, + 168, 103, 46, 149, 34, 86, 234, 79, 232, 90, 186, 143, 31, 67, 49, 233, 184, 202, 13, 232, + 121, 217, 202, 84, 2, 36, 4, 216, 121, 126, 128, 101, 84, 57, 103, 221, 66, 239, 176, 166, + 72, 48, 51, 125, 67, 86, 170, 192, 177, 61, 195, 19, 11, 9, 134, 232, 162, 47, 212, 63, 136, + 206, 183, 181, 234, 16, 178, 222, 116, 84, 85, 58, 27, 119, 30, 65, 205, 158, 35, 55, 160, + 99, 106, 130, 161, 235, 240, 162, 127, 100, 168, 234, 170, 57, 40, 252, 116, 193, 208, 234, + 95, 216, 80, 44, 202, 138, 14, 16, 66, 125, 19, 10, 9, 81, 133, 145, 178, 159, 252, 184, + 144, 231, 83, 99, 36, 86, 92, 77, 249, 212, 132, 224, 92, 135, 76, 93, 43, 201, 210, 148, + 75, 6, 139, 172, 69, 214, 158, 29, 246, 253, 157, 240, 180, 238, 185, 100, 73, 244, 219, + 232, 4, 105, 105, 174, 184, 87, 67, 168, 82, 44, 52, 137, 82, 242, 117, 13, 25, 181, 208, + 132, 216, 236, 54, 91, 62, 64, 28, 242, 35, 180, 235, 42, 244, 172, 118, 36, 30, 148, 253, + 76, 44, 105, 169, 220, 61, 237, 35, 97, 26, 44, 10, 132, 146, 112, 162, 94, 16, 201, 182, + 27, 229, 72, 66, 51, 156, 123, 221, 214, 240, 164, 15, 216, 107, 198, 249, 52, 191, 176, 23, + 186, 107, 28, 34, 92, 5, 227, 136, 129, 51, 173, 95, 115, 230, 139, 193, 30, 34, 98, 45, + 147, 120, 151, 118, 195, 136, 199, 48, 14, 53, 137, 42, 44, 132, 216, 62, 200, 124, 19, 202, + 192, 225, 159, 95, 135, 57, 225, 144, 15, 120, 161, 28, 245, 238, 200, 132, 60, 203, 68, + 158, 181, 143, 163, 192, 241, 83, 136, 234, 80, 72, 96, 64, 156, 180, 85, 106, 66, 34, 25, + 176, 132, 244, 101, 11, 175, 196, 23, 173, 126, 97, 97, 194, 150, 138, 144, 241, 156, 29, + 240, 212, 45, 243, 202, 35, 211, 4, 41, 96, 213, 177, 108, 19, 223, 197, 205, 36, 153, 90, + 63, 92, 45, 179, 184, 202, 202, 93, 124, 233, 3, 229, 124, 219, 201, 248, 88, 159, 72, 164, + 100, 140, 37, 58, 9, 143, 19, 49, 200, 49, 62, 7, 133, 123, 62, 44, 38, 226, 202, 139, 139, + 114, 166, 189, 12, 81, 6, 67, 174, 181, 158, 44, 1, 138, 223, 236, 243, 231, 151, 111, 16, + 181, 159, 117, 83, 201, 23, 255, 23, 108, 40, 167, 189, 180, 29, 105, 63, 185, 74, 247, 230, + 140, 232, 23, 230, 36, 114, 35, 94, 220, 109, 205, 30, 36, 249, 146, 165, 65, 34, 83, 118, + 219, 45, 207, 115, 225, 248, 55, 200, 109, 121, 190, 20, 109, 171, 22, 34, 227, 167, 11, + 208, 241, 178, 117, 5, 222, 24, 75, 111, 47, 89, 231, 213, 91, 33, 98, 188, 202, 197, 169, + 199, 255, 93, 255, 203, 18, 218, 238, 4, 5, 130, 99, 29, 183, 234, 45, 188, 247, 1, 246, 9, + 111, 27, 249, 64, 186, 127, 237, 222, 59, 130, 226, 169, 46, 74, 130, 179, 21, 123, 144, + 213, 109, 222, 95, 150, 16, 184, 17, 93, 47, 235, 155, 93, 5, 140, 182, 244, 129, 214, 44, + 206, 224, 138, 32, 123, 46, 218, 38, 177, 213, 82, 15, 10, 95, 167, 167, 54, 108, 139, 143, + 151, 251, 243, 106, 195, 121, 177, 137, 203, 1, 244, 13, 251, 156, 127, 165, 43, 3, 78, 72, + 239, 143, 61, 173, 151, 181, 180, 139, 133, 152, 142, 124, 81, 45, 45, 142, 176, 74, 11, 7, + 10, 75, 88, 188, 15, 112, 180, 224, 144, 233, 37, 221, 197, 62, 153, 168, 122, 138, 75, 20, + 110, 231, 161, 26, 30, 241, 139, 222, 122, 216, 86, 189, 106, 37, 212, 79, 84, 115, 61, 87, + 78, 108, 248, 32, 47, 223, 82, 96, 217, 85, 223, 125, 92, 222, 217, 79, 182, 44, 138, 194, + 209, 136, 73, 250, 82, 105, 195, 11, 190, 198, 131, 73, 148, 64, 153, 124, 243, 129, 98, + 135, 211, 158, 216, 41, 93, 71, 37, 150, 21, 9, 204, 99, 240, 147, 42, 226, 116, 198, 8, + 145, 222, 62, 72, 244, 123, 89, 219, 80, 91, 205, 218, 107, 23, 253, 78, 63, 54, 231, 230, + 41, 254, 135, 240, 115, 189, 117, 35, 58, 159, 86, 59, 31, 127, 53, 149, 19, 149, 149, 68, + 235, 1, 251, 242, 11, 231, 223, 240, 114, 119, 59, 83, 80, 113, 30, 168, 196, 35, 65, 13, + 215, 70, 182, 25, 58, 155, 152, 62, 72, 228, 115, 89, 37, 206, 252, 28, 87, 93, 108, 181, + 98, 117, 89, 148, 176, 109, 179, 83, 4, 15, 95, 128, 142, 195, 229, 118, 18, 181, 59, 17, + 37, 246, 109, 226, 172, 203, 76, 14, 219, 60, 176, 205, 68, 129, 66, 9, 9, 21, 57, 18, 5, + 215, 70, 122, 240, 231, 251, 0, 49, 18, 88, 113, 32, 124, 23, 43, 184, 112, 182, 68, 32, + 236, 112, 130, 13, 8, 26, 167, 184, 145, 136, 214, 192, 55, 92, 229, 176, 148, 39, 9, 23, + 205, 242, 252, 223, 228, 249, 194, 3, 244, 250, 65, 90, 180, 121, 156, 153, 223, 239, 20, + 13, 69, 190, 68, 197, 149, 219, 134, 99, 104, 33, 106, 134, 122, 255, 215, 215, 79, 75, 35, + 208, 43, 188, 63, 104, 191, 41, 199, 28, 5, 249, 233, 50, 245, 90, 174, 31, 68, 87, 226, + 250, 52, 31, 118, 95, 8, 141, 161, 101, 202, 187, 12, 40, 218, 223, 163, 152, 17, 105, 172, + 47, 38, 18, 28, 43, 236, 183, 171, 13, 250, 134, 225, 231, 91, 249, 149, 193, 86, 66, 125, + 21, 255, 229, 1, 50, 88, 87, 103, 35, 140, 129, 48, 164, 227, 138, 79, 57, 237, 16, 136, 93, + 189, 1, 226, 113, 174, 161, 199, 0, 114, 68, 131, 86, 35, 110, 107, 6, 131, 45, 212, 15, + 210, 148, 243, 98, 14, 36, 173, 106, 221, 161, 81, 166, 73, 119, 134, 92, 247, 48, 99, 80, + 105, 223, 120, 173, 136, 49, 84, 154, 33, 30, 34, 50, 128, 190, 227, 144, 201, 141, 13, 201, + 96, 147, 231, 76, 117, 31, 21, 130, 232, 58, 212, 218, 228, 220, 104, 246, 180, 89, 159, + 201, 124, 108, 144, 53, 172, 150, 171, 153, 202, 181, 231, 80, 16, 74, 9, 144, 194, 178, + 105, 56, 160, 47, 229, 142, 230, 194, 229, 219, 213, 95, 125, 58, 149, 250, 228, 33, 78, 21, + 63, 76, 163, 236, 177, 69, 0, 134, 238, 135, 77, 172, 129, 200, 174, 45, 207, 163, 105, 15, + 10, 227, 45, 212, 60, 37, 150, 168, 152, 75, 94, 213, 9, 224, 218, 107, 172, 242, 20, 29, + 213, 135, 53, 78, 165, 80, 145, 233, 206, 87, 142, 88, 241, 181, 31, 70, 201, 206, 202, 99, + 2, 81, 52, 34, 222, 131, 183, 79, 201, 37, 145, 136, 127, 16, 12, 228, 186, 80, 122, 73, 93, + 219, 67, 7, 24, 75, 89, 229, 232, 237, 168, 122, 110, 130, 7, 125, 213, 154, 96, 238, 81, + 159, 28, 55, 160, 103, 113, 189, 105, 84, 254, 231, 131, 177, 142, 154, 107, 227, 70, 102, + 222, 226, 136, 161, 151, 67, 121, 24, 12, 229, 232, 151, 206, 59, 198, 169, 163, 189, 172, + 225, 20, 187, 202, 22, 31, 80, 165, 114, 158, 50, 24, 251, 121, 212, 17, 77, 23, 111, 186, + 115, 140, 92, 88, 160, 37, 39, 173, 170, 239, 68, 241, 48, 239, 101, 163, 226, 65, 68, 167, + 226, 230, 179, 5, 148, 14, 142, 56, 74, 150, 228, 247, 188, 35, 101, 62, 157, 71, 117, 133, + 19, 232, 76, 185, 135, 180, 208, 110, 53, 40, 205, 121, 113, 247, 192, 168, 181, 72, 88, + 185, 135, 152, 162, 122, 237, 10, 162, 168, 36, 172, 23, 120, 12, 232, 64, 126, 233, 85, + 181, 148, 186, 124, 103, 84, 169, 205, 248, 90, 53, 137, 124, 224, 27, 241, 107, 159, 4, 81, + 1, 31, 13, 237, 31, 180, 56, 30, 238, 239, 24, 120, 5, 108, 113, 40, 32, 62, 96, 210, 196, + 42, 100, 236, 225, 81, 70, 116, 38, 191, 122, 242, 80, 98, 31, 195, 209, 52, 162, 26, 15, + 48, 124, 7, 132, 153, 41, 234, 81, 24, 106, 122, 79, 95, 76, 210, 148, 136, 136, 203, 70, + 18, 204, 74, 107, 131, 72, 161, 15, 84, 238, 118, 226, 148, 60, 117, 55, 244, 209, 146, 225, + 255, 184, 238, 132, 41, 168, 234, 148, 30, 244, 197, 202, 118, 94, 89, 16, 188, 231, 170, 1, + 97, 133, 232, 238, 36, 82, 251, 169, 52, 135, 78, 212, 181, 116, 230, 134, 194, 138, 169, + 33, 15, 236, 65, 86, 204, 69, 251, 173, 172, 38, 118, 151, 104, 98, 36, 202, 87, 49, 22, 49, + 67, 164, 20, 52, 52, 230, 251, 102, 121, 55, 155, 154, 112, 174, 239, 237, 108, 103, 29, 28, + 166, 32, 63, 200, 32, 156, 218, 229, 237, 112, 89, 131, 95, 17, 51, 223, 162, 28, 226, 43, + 133, 220, 69, 87, 7, 218, 212, 246, 90, 115, 247, 55, 89, 65, 169, 10, 81, 8, 74, 212, 241, + 108, 84, 227, 51, 10, 229, 23, 37, 146, 163, 202, 88, 56, 228, 85, 62, 126, 29, 139, 73, + 144, 21, 171, 143, 67, 68, 249, 109, 162, 18, 39, 47, 218, 228, 47, 62, 217, 116, 237, 189, + 122, 188, 169, 19, 215, 182, 169, 56, 134, 149, 140, 39, 212, 65, 88, 16, 243, 149, 120, 47, + 220, 71, 28, 112, 15, 119, 237, 160, 154, 32, 0, 112, 20, 166, 165, 138, 21, 211, 5, 23, + 240, 9, 83, 194, 129, 156, 170, 110, 5, 94, 228, 232, 215, 33, 30, 240, 95, 114, 131, 90, + 216, 166, 31, 184, 13, 202, 140, 223, 154, 103, 77, 119, 99, 105, 75, 151, 245, 28, 105, + 225, 61, 114, 2, 89, 147, 195, 202, 184, 214, 202, 99, 187, 145, 190, 123, 89, 217, 134, 42, + 4, 169, 26, 109, 133, 16, 209, 135, 7, 144, 41, 111, 251, 31, 253, 157, 233, 65, 84, 140, + 112, 244, 74, 124, 199, 74, 15, 20, 40, 175, 200, 80, 27, 95, 175, 190, 11, 140, 57, 6, 33, + 55, 64, 143, 6, 76, 25, 140, 235, 63, 253, 78, 11, 2, 232, 146, 89, 102, 144, 197, 123, 253, + 64, 97, 25, 28, 140, 110, 240, 127, 145, 227, 116, 71, 223, 5, 103, 217, 206, 215, 93, 4, + 216, 54, 249, 31, 153, 242, 123, 248, 116, 54, 52, 157, 13, 234, 146, 245, 185, 65, 217, + 245, 218, 90, 245, 143, 251, 171, 16, 51, 190, 168, 189, 81, 174, 255, 250, 248, 182, 72, + 160, 246, 103, 75, 224, 1, 201, 193, 164, 110, 131, 139, 13, 215, 177, 5, 169, 23, 230, 245, + 95, 154, 250, 176, 216, 17, 219, 127, 85, 137, 114, 117, 30, 178, 198, 51, 27, 39, 211, 84, + 20, 241, 6, 12, 110, 168, 214, 82, 112, 9, 124, 96, 173, 106, 32, 215, 173, 142, 12, 197, + 37, 136, 82, 93, 149, 7, 99, 17, 2, 169, 121, 152, 17, 106, 217, 27, 58, 14, 114, 50, 205, + 124, 208, 152, 164, 215, 11, 236, 33, 68, 112, 73, 140, 129, 236, 91, 13, 120, 162, 60, 94, + 118, 9, 36, 90, 159, 67, 72, 247, 231, 127, 233, 142, 175, 37, 130, 248, 36, 72, 176, 55, + 151, 28, 18, 218, 70, 58, 91, 113, 0, 112, 192, 226, 64, 107, 104, 38, 143, 81, 123, 77, + 156, 233, 44, 45, 188, 139, 21, 101, 9, 21, 20, 186, 69, 127, 115, 25, 190, 129, 214, 148, + 47, 244, 18, 157, 124, 189, 17, 149, 246, 179, 170, 197, 15, 216, 214, 213, 137, 142, 232, + 190, 201, 15, 92, 183, 234, 132, 212, 210, 230, 14, 156, 77, 125, 107, 56, 134, 85, 67, 137, + 89, 211, 226, 7, 104, 209, 203, 54, 1, 178, 210, 59, 168, 20, 102, 117, 254, 232, 186, 154, + 250, 210, 199, 160, 140, 3, 146, 107, 24, 107, 82, 154, 200, 249, 70, 27, 149, 67, 167, 50, + 122, 81, 90, 210, 221, 113, 20, 81, 150, 44, 107, 222, 96, 21, 244, 134, 109, 155, 140, 85, + 52, 54, 20, 18, 83, 95, 75, 146, 123, 43, 58, 35, 36, 87, 228, 255, 169, 161, 167, 147, 179, + 134, 143, 104, 145, 68, 58, 21, 102, 152, 206, 170, 238, 87, 120, 25, 154, 156, 50, 29, 173, + 63, 99, 50, 26, 2, 233, 157, 155, 10, 39, 31, 185, 54, 145, 118, 123, 151, 9, 237, 157, 109, + 182, 167, 237, 120, 0, 230, 180, 54, 80, 208, 68, 207, 255, 212, 108, 137, 253, 30, 249, + 147, 51, 52, 91, 210, 224, 6, 108, 93, 201, 68, 150, 35, 52, 54, 131, 177, 46, 161, 98, 5, + 147, 119, 59, 78, 176, 21, 215, 41, 148, 138, 55, 164, 243, 199, 94, 87, 107, 239, 64, 253, + 227, 60, 165, 241, 76, 159, 99, 120, 146, 45, 227, 63, 135, 47, 232, 31, 74, 223, 162, 124, + 207, 212, 148, 236, 141, 80, 33, 173, 223, 128, 43, 50, 133, 98, 101, 242, 253, 249, 62, + 216, 176, 97, 96, 88, 241, 52, 172, 174, 151, 167, 48, 110, 69, 211, 11, 16, 46, 240, 70, + 116, 190, 173, 60, 163, 246, 72, 22, 226, 198, 244, 13, 170, 192, 225, 33, 80, 170, 39, 231, + 136, 74, 142, 130, 115, 33, 114, 205, 152, 121, 163, 182, 33, 35, 249, 125, 49, 5, 100, 227, + 163, 40, 80, 92, 231, 39, 25, 69, 97, 136, 136, 36, 41, 91, 122, 223, 204, 108, 170, 140, + 162, 207, 173, 184, 252, 163, 20, 114, 23, 160, 99, 86, 64, 113, 242, 4, 47, 236, 19, 16, + 163, 31, 148, 180, 169, 158, 209, 155, 172, 245, 136, 52, 64, 78, 151, 151, 105, 108, 253, + 75, 181, 40, 45, 237, 217, 0, 117, 107, 176, 56, 27, 78, 6, 88, 93, 74, 247, 230, 225, 183, + 149, 162, 12, 121, 184, 25, 212, 126, 103, 183, 231, 123, 213, 125, 228, 170, 116, 127, 225, + 206, 253, 142, 182, 180, 206, 165, 147, 130, 244, 161, 78, 60, 228, 155, 121, 228, 104, 225, + 63, 235, 40, 6, 7, 187, 87, 223, 15, 142, 79, 216, 16, 206, 127, 50, 181, 214, 214, 39, 37, + 180, 78, 38, 250, 131, 248, 179, 229, 190, 209, 98, 169, 95, 120, 140, 3, 219, 174, 222, 96, + 16, 32, 235, 171, 213, 167, 129, 44, 19, 58, 3, 80, 211, 230, 52, 26, 104, 114, 0, 63, 250, + 178, 137, 48, 84, 90, 41, 184, 98, 163, 230, 217, 119, 103, 73, 60, 125, 123, 33, 170, 28, + 254, 71, 119, 213, 164, 75, 142, 194, 176, 125, 159, 162, 46, 208, 239, 35, 252, 4, 56, 207, + 108, 102, 81, 117, 255, 237, 88, 146, 13, 164, 186, 103, 243, 94, 84, 144, 0, 198, 150, 165, + 118, 184, 155, 155, 220, 243, 5, 221, 24, 106, 211, 141, 155, 254, 124, 255, 128, 221, 248, + 122, 173, 108, 115, 161, 213, 229, 89, 185, 183, 194, 248, 92, 126, 71, 181, 108, 191, 215, + 93, 65, 133, 173, 236, 114, 49, 161, 199, 173, 113, 220, 219, 91, 244, 159, 165, 228, 235, + 62, 51, 148, 13, 23, 149, 241, 160, 199, 180, 253, 184, 69, 201, 199, 1, 93, 67, 24, 76, 90, + 100, 122, 217, 246, 217, 142, 184, 171, 16, 194, 146, 53, 150, 232, 113, 240, 26, 147, 233, + 209, 26, 84, 249, 159, 97, 57, 33, 35, 25, 107, 87, 166, 234, 231, 215, 58, 84, 69, 173, 98, + 248, 222, 107, 251, 145, 68, 47, 219, 230, 52, 138, 219, 9, 9, 196, 111, 75, 236, 53, 127, + 81, 238, 192, 229, 21, 62, 212, 66, 99, 130, 42, 151, 149, 170, 46, 93, 150, 71, 83, 97, + 123, 224, 42, 5, 206, 19, 113, 238, 115, 212, 253, 231, 60, 130, 26, 223, 253, 55, 84, 174, + 253, 2, 90, 252, 112, 79, 62, 197, 202, 233, 253, 133, 93, 124, 21, 230, 76, 28, 174, 48, + 248, 58, 78, 139, 126, 18, 32, 243, 222, 160, 197, 188, 169, 141, 208, 98, 172, 221, 28, + 202, 146, 149, 157, 221, 57, 204, 164, 185, 119, 200, 43, 149, 81, 134, 231, 10, 65, 85, 36, + 32, 31, 104, 107, 166, 2, 237, 245, 166, 177, 242, 139, 179, 120, 190, 195, 182, 225, 252, + 253, 27, 202, 63, 161, 27, 245, 45, 141, 60, 57, 13, 182, 33, 216, 105, 12, 91, 85, 22, 107, + 234, 129, 52, 247, 49, 122, 212, 3, 198, 188, 176, 238, 234, 26, 171, 10, 119, 138, 37, 117, + 64, 219, 150, 11, 178, 3, 110, 241, 22, 227, 99, 21, 244, 44, 15, 216, 195, 232, 196, 15, + 119, 218, 62, 72, 253, 54, 2, 119, 83, 31, 30, 26, 182, 209, 150, 184, 222, 181, 92, 12, + 203, 136, 38, 227, 158, 236, 242, 54, 120, 243, 54, 138, 210, 231, 146, 244, 108, 222, 84, + 102, 62, 172, 150, 183, 193, 48, 41, 134, 198, 137, 98, 238, 80, 202, 167, 186, 220, 78, 37, + 255, 63, 145, 166, 254, 109, 244, 30, 203, 207, 121, 62, 51, 195, 45, 213, 92, 116, 140, + 234, 41, 126, 233, 166, 39, 83, 143, 137, 216, 241, 207, 125, 147, 211, 245, 74, 68, 94, 22, + 206, 226, 100, 62, 20, 237, 19, 234, 172, 207, 241, 54, 255, 130, 234, 116, 187, 42, 120, + 73, 163, 71, 155, 112, 72, 178, 186, 185, 250, 62, 45, 197, 13, 128, 103, 37, 182, 231, 231, + 170, 173, 157, 246, 241, 150, 74, 247, 147, 41, 101, 159, 65, 240, 184, 12, 63, 94, 21, 199, + 165, 186, 154, 85, 176, 154, 101, 28, 158, 147, 118, 59, 235, 65, 112, 150, 7, 55, 41, 229, + 18, 249, 23, 213, 185, 148, 193, 216, 108, 216, 252, 135, 73, 75, 38, 194, 155, 178, 52, 79, + 120, 16, 226, 26, 207, 142, 246, 113, 142, 47, 147, 46, 7, 153, 17, 168, 181, 213, 147, 190, + 160, 102, 63, 199, 155, 247, 233, 162, 183, 119, 40, 188, 151, 70, 255, 87, 35, 93, 104, + 117, 248, 73, 31, 103, 48, 119, 193, 22, 210, 33, 187, 208, 24, 62, 110, 151, 151, 141, 120, + 217, 85, 47, 62, 187, 214, 73, 208, 90, 192, 247, 245, 242, 158, 138, 137, 206, 218, 248, + 138, 193, 75, 51, 171, 190, 217, 219, 30, 196, 18, 247, 162, 255, 249, 115, 251, 71, 175, + 164, 193, 202, 86, 149, 252, 205, 170, 55, 175, 216, 252, 21, 189, 194, 175, 111, 78, 94, + 122, 87, 188, 147, 250, 122, 94, 87, 199, 185, 253, 62, 194, 144, 254, 246, 236, 45, 133, + 149, 76, 37, 198, 114, 75, 85, 155, 191, 212, 80, 54, 92, 4, 97, 57, 53, 15, 254, 152, 50, + 30, 193, 46, 82, 113, 168, 147, 214, 254, 15, 30, 108, 195, 13, 191, 181, 147, 18, 234, 108, + 178, 244, 159, 63, 4, 9, 74, 230, 129, 217, 252, 192, 210, 24, 139, 111, 45, 231, 232, 87, + 91, 127, 185, 22, 5, 113, 119, 207, 251, 26, 115, 199, 170, 10, 244, 146, 73, 132, 240, 63, + 81, 212, 30, 250, 49, 222, 249, 4, 209, 208, 14, 189, 31, 72, 237, 172, 96, 97, 124, 196, + 90, 132, 181, 211, 181, 90, 254, 17, 169, 154, 49, 252, 126, 84, 39, 220, 191, 219, 49, 243, + 98, 23, 16, 18, 243, 94, 228, 242, 202, 63, 45, 104, 39, 35, 23, 197, 161, 214, 154, 189, + 81, 99, 122, 103, 245, 90, 155, 148, 179, 57, 159, 69, 9, 129, 92, 170, 152, 173, 200, 145, + 111, 220, 255, 74, 77, 244, 130, 215, 25, 128, 243, 153, 193, 233, 188, 14, 86, 206, 231, + 129, 20, 131, 11, 201, 225, 55, 41, 89, 175, 187, 231, 62, 169, 60, 140, 222, 97, 77, 130, + 6, 50, 197, 199, 162, 23, 186, 17, 44, 138, 240, 116, 103, 173, 120, 230, 172, 115, 100, 86, + 5, 29, 187, 199, 207, 35, 29, 133, 163, 89, 168, 148, 142, 80, 171, 106, 10, 183, 59, 103, + 148, 99, 198, 46, 249, 254, 196, 64, 173, 146, 81, 23, 89, 90, 17, 78, 24, 40, 210, 84, 38, + 250, 237, 57, 57, 215, 147, 51, 212, 49, 44, 31, 164, 130, 253, 236, 41, 58, 245, 139, 220, + 17, 226, 7, 58, 254, 59, 104, 241, 124, 242, 126, 162, 105, 252, 124, 97, 68, 175, 0, 148, + 107, 183, 24, 9, 222, 93, 97, 34, 32, 236, 143, 83, 199, 181, 196, 69, 162, 23, 227, 76, + 242, 226, 218, 48, 43, 43, 185, 128, 115, 208, 98, 170, 227, 92, 247, 209, 114, 91, 116, + 112, 172, 110, 235, 217, 218, 211, 59, 67, 82, 217, 78, 242, 105, 66, 141, 49, 154, 150, + 170, 23, 85, 141, 95, 210, 95, 192, 186, 192, 53, 214, 248, 189, 251, 142, 121, 201, 237, + 157, 114, 150, 28, 251, 71, 160, 14, 228, 188, 167, 62, 254, 83, 187, 170, 122, 67, 28, 5, + 130, 138, 71, 221, 97, 29, 253, 232, 77, 137, 157, 13, 7, 184, 20, 158, 235, 9, 180, 105, + 15, 212, 251, 4, 96, 96, 237, 197, 91, 178, 66, 127, 59, 109, 203, 173, 144, 37, 11, 127, + 253, 45, 191, 20, 77, 94, 157, 35, 60, 199, 79, 239, 212, 235, 104, 91, 72, 70, 151, 75, 86, + 90, 161, 198, 169, 138, 172, 192, 120, 44, 116, 57, 3, 53, 116, 75, 102, 11, 197, 121, 215, + 207, 25, 79, 77, 25, 205, 172, 200, 200, 49, 209, 123, 139, 21, 191, 162, 181, 129, 83, 130, + 250, 97, 184, 148, 7, 134, 198, 6, 42, 56, 142, 1, 28, 42, 131, 145, 72, 148, 73, 43, 118, + 86, 66, 226, 169, 186, 132, 57, 140, 105, 166, 16, 224, 196, 90, 116, 172, 44, 157, 62, 136, + 160, 10, 79, 32, 238, 213, 76, 188, 249, 118, 191, 152, 253, 84, 20, 82, 141, 27, 16, 25, + 234, 121, 230, 69, 13, 182, 205, 43, 123, 106, 221, 132, 161, 156, 38, 145, 24, 17, 90, 214, + 192, 24, 126, 53, 184, 142, 130, 20, 71, 252, 49, 177, 138, 47, 252, 54, 42, 19, 75, 53, + 162, 53, 208, 44, 212, 136, 45, 44, 91, 110, 11, 44, 185, 189, 199, 248, 253, 196, 44, 191, + 116, 165, 189, 199, 218, 235, 254, 92, 222, 217, 217, 242, 19, 136, 54, 23, 12, 93, 97, 9, + 164, 164, 91, 241, 161, 186, 202, 204, 168, 66, 103, 244, 121, 66, 0, 221, 229, 85, 136, + 170, 174, 143, 109, 207, 160, 175, 113, 227, 179, 133, 114, 69, 247, 96, 64, 187, 118, 126, + 46, 234, 207, 60, 146, 1, 184, 78, 3, 168, 114, 159, 233, 237, 166, 240, 54, 44, 126, 233, + 230, 114, 109, 199, 22, 139, 87, 161, 172, 197, 33, 56, 43, 83, 184, 240, 152, 6, 224, 176, + 12, 64, 210, 84, 247, 160, 86, 141, 112, 126, 49, 243, 98, 160, 23, 152, 247, 113, 93, 254, + 38, 47, 182, 48, 62, 216, 73, 126, 173, 144, 140, 152, 70, 245, 94, 152, 245, 127, 196, 107, + 129, 127, 148, 140, 136, 138, 54, 243, 121, 194, 184, 150, 198, 207, 169, 55, 25, 168, 33, + 168, 161, 235, 27, 205, 14, 26, 212, 239, 155, 181, 115, 62, 43, 29, 42, 63, 49, 71, 147, + 156, 59, 176, 115, 69, 3, 147, 172, 231, 213, 124, 5, 83, 141, 38, 83, 153, 171, 174, 242, + 205, 190, 221, 59, 223, 170, 183, 73, 218, 129, 10, 51, 138, 252, 58, 35, 231, 213, 83, 131, + 192, 31, 167, 220, 192, 213, 124, 225, 101, 13, 229, 155, 107, 118, 225, 34, 46, 244, 245, + 13, 85, 237, 166, 93, 126, 151, 122, 213, 63, 108, 194, 50, 178, 67, 173, 78, 59, 221, 234, + 184, 178, 101, 29, 129, 86, 49, 116, 130, 214, 14, 66, 110, 82, 61, 100, 241, 6, 201, 225, + 116, 236, 164, 141, 215, 111, 169, 84, 187, 152, 70, 212, 196, 34, 32, 177, 219, 211, 87, + 170, 226, 119, 15, 201, 126, 17, 228, 176, 5, 176, 148, 154, 70, 0, 49, 121, 225, 47, 222, + 159, 203, 158, 152, 181, 44, 58, 44, 15, 15, 67, 185, 226, 18, 192, 71, 82, 217, 81, 177, + 84, 201, 250, 70, 241, 188, 89, 207, 180, 185, 11, 21, 142, 64, 202, 175, 152, 239, 11, 113, + 70, 104, 252, 97, 14, 17, 194, 66, 69, 229, 141, 72, 170, 64, 97, 2, 35, 146, 236, 79, 8, + 222, 230, 13, 143, 234, 133, 119, 109, 187, 210, 167, 81, 145, 55, 164, 187, 129, 62, 218, + 17, 129, 59, 17, 73, 184, 224, 164, 184, 4, 74, 139, 21, 171, 169, 59, 133, 67, 235, 212, + 102, 12, 41, 237, 81, 255, 81, 102, 240, 78, 187, 132, 30, 7, 134, 232, 46, 220, 218, 88, + 198, 174, 19, 185, 231, 235, 120, 110, 211, 151, 198, 106, 67, 124, 38, 179, 56, 112, 82, + 143, 157, 53, 207, 152, 7, 9, 111, 56, 105, 176, 241, 110, 7, 157, 152, 181, 82, 238, 130, + 211, 16, 3, 235, 86, 53, 24, 170, 99, 42, 158, 57, 169, 58, 165, 166, 161, 156, 217, 180, + 230, 167, 63, 1, 103, 246, 186, 34, 245, 254, 194, 198, 163, 73, 33, 30, 249, 68, 183, 56, + 214, 17, 25, 171, 172, 84, 22, 247, 218, 207, 69, 179, 208, 144, 111, 17, 127, 137, 154, 1, + 173, 56, 211, 243, 162, 69, 217, 76, 130, 94, 94, 235, 121, 232, 165, 68, 138, 105, 206, + 236, 105, 101, 159, 239, 192, 211, 239, 129, 34, 255, 84, 70, 16, 102, 159, 47, 140, 182, + 163, 128, 139, 236, 121, 236, 225, 194, 193, 48, 123, 245, 80, 226, 41, 37, 141, 50, 211, + 23, 248, 231, 215, 235, 63, 1, 6, 0, 101, 92, 249, 9, 13, 10, 101, 110, 100, 115, 116, 114, + 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 53, 54, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, + 101, 47, 76, 101, 110, 103, 116, 104, 32, 53, 48, 53, 56, 62, 62, 115, 116, 114, 101, 97, + 109, 13, 10, 72, 137, 108, 87, 77, 154, 108, 43, 10, 156, 191, 85, 228, 6, 42, 63, 21, 21, + 93, 207, 157, 244, 160, 122, 255, 211, 38, 34, 240, 252, 220, 126, 147, 42, 34, 225, 40, 34, + 4, 104, 237, 91, 234, 231, 103, 127, 189, 140, 143, 213, 175, 175, 1, 180, 6, 209, 52, 34, + 223, 227, 243, 231, 159, 192, 93, 90, 167, 178, 55, 130, 94, 158, 168, 218, 49, 5, 94, 223, + 53, 169, 29, 19, 96, 106, 85, 175, 0, 182, 210, 114, 25, 96, 89, 212, 237, 5, 80, 231, 199, + 26, 254, 254, 248, 87, 123, 183, 175, 97, 65, 255, 122, 135, 106, 108, 130, 29, 187, 189, + 209, 159, 127, 254, 3, 227, 157, 222, 132, 226, 191, 127, 97, 179, 111, 217, 116, 141, 114, + 235, 144, 247, 224, 46, 246, 181, 13, 187, 48, 8, 121, 116, 200, 54, 95, 242, 101, 85, 203, + 183, 198, 87, 191, 88, 222, 35, 34, 248, 97, 205, 255, 195, 112, 111, 2, 85, 4, 26, 231, + 112, 170, 118, 201, 115, 225, 148, 48, 173, 227, 115, 163, 225, 68, 173, 17, 89, 147, 105, + 155, 90, 182, 80, 249, 60, 211, 11, 49, 6, 61, 78, 150, 214, 133, 65, 232, 95, 51, 253, 176, + 27, 188, 236, 223, 186, 228, 87, 120, 244, 139, 83, 249, 34, 220, 58, 213, 11, 35, 2, 180, + 14, 15, 27, 16, 110, 29, 202, 181, 20, 17, 132, 49, 224, 244, 80, 82, 114, 131, 89, 53, 153, + 181, 157, 241, 109, 107, 220, 199, 13, 168, 96, 184, 182, 72, 135, 71, 79, 227, 153, 97, 52, + 110, 233, 60, 224, 158, 47, 153, 118, 79, 13, 239, 111, 198, 253, 245, 72, 41, 38, 235, 228, + 106, 25, 143, 72, 109, 255, 252, 21, 156, 191, 96, 134, 15, 30, 242, 188, 39, 124, 231, 135, + 18, 39, 27, 223, 210, 9, 250, 228, 247, 71, 55, 86, 110, 54, 54, 49, 171, 202, 224, 26, 208, + 156, 111, 64, 231, 95, 186, 213, 238, 117, 112, 130, 45, 216, 206, 178, 166, 31, 158, 91, + 214, 151, 3, 245, 28, 32, 98, 191, 62, 81, 120, 240, 253, 146, 17, 241, 216, 33, 238, 99, + 102, 29, 84, 102, 1, 179, 107, 59, 16, 115, 116, 210, 168, 76, 102, 22, 10, 181, 144, 17, + 148, 175, 22, 8, 222, 198, 29, 55, 104, 172, 139, 43, 38, 64, 233, 89, 213, 51, 82, 183, 32, + 45, 80, 253, 112, 14, 119, 206, 143, 112, 229, 25, 104, 19, 251, 132, 63, 216, 168, 80, 163, + 146, 182, 35, 211, 104, 246, 91, 163, 218, 250, 246, 250, 6, 127, 254, 249, 91, 183, 144, + 190, 223, 169, 98, 153, 12, 44, 157, 20, 155, 48, 15, 149, 120, 199, 137, 185, 94, 242, 195, + 61, 104, 34, 215, 113, 167, 42, 77, 145, 24, 66, 122, 243, 162, 56, 207, 24, 195, 235, 155, + 250, 88, 141, 17, 248, 97, 4, 127, 95, 232, 47, 25, 116, 11, 80, 135, 190, 114, 194, 182, + 168, 155, 4, 163, 241, 35, 135, 188, 102, 122, 129, 251, 250, 9, 114, 170, 242, 98, 16, 237, + 13, 96, 11, 114, 171, 121, 55, 133, 139, 116, 81, 14, 130, 27, 187, 249, 69, 141, 21, 12, + 193, 220, 28, 140, 251, 164, 134, 197, 200, 61, 1, 58, 193, 172, 167, 82, 129, 152, 8, 89, + 226, 5, 155, 29, 2, 40, 17, 25, 218, 157, 111, 76, 94, 3, 117, 93, 42, 85, 227, 228, 24, 9, + 61, 190, 18, 181, 77, 45, 152, 68, 231, 251, 83, 50, 97, 153, 126, 201, 233, 145, 105, 69, + 213, 40, 114, 2, 141, 228, 33, 152, 191, 83, 132, 51, 67, 220, 183, 112, 209, 12, 192, 239, + 1, 17, 74, 147, 53, 11, 164, 95, 98, 59, 231, 165, 209, 49, 137, 224, 233, 228, 65, 152, + 237, 166, 58, 84, 12, 8, 2, 229, 89, 41, 227, 88, 201, 195, 2, 172, 105, 36, 207, 165, 139, + 246, 22, 223, 96, 185, 129, 220, 139, 56, 169, 80, 6, 201, 223, 116, 218, 17, 255, 66, 102, + 188, 59, 26, 164, 37, 155, 116, 164, 101, 220, 185, 83, 209, 251, 39, 40, 132, 100, 17, 245, + 78, 62, 164, 13, 88, 37, 92, 18, 15, 90, 136, 104, 243, 226, 203, 32, 18, 79, 247, 119, 172, + 62, 152, 145, 198, 139, 25, 223, 158, 41, 226, 7, 232, 174, 214, 81, 69, 222, 76, 168, 134, + 122, 190, 97, 57, 101, 18, 243, 155, 94, 132, 8, 87, 152, 190, 8, 181, 101, 79, 45, 162, 74, + 46, 110, 226, 23, 217, 218, 161, 20, 0, 221, 185, 41, 109, 26, 59, 184, 150, 81, 233, 107, + 39, 255, 168, 229, 134, 188, 45, 100, 27, 87, 61, 176, 191, 178, 4, 12, 132, 184, 183, 28, + 45, 184, 205, 93, 46, 51, 241, 130, 106, 138, 58, 146, 72, 33, 59, 243, 218, 69, 135, 50, + 62, 155, 138, 223, 232, 122, 228, 94, 205, 237, 163, 42, 180, 80, 3, 57, 238, 179, 157, 136, + 50, 199, 164, 114, 79, 77, 99, 158, 140, 38, 105, 148, 175, 172, 220, 197, 185, 154, 151, + 50, 135, 27, 178, 64, 57, 153, 132, 70, 94, 231, 165, 44, 28, 207, 148, 196, 55, 247, 167, + 148, 253, 33, 106, 118, 144, 3, 216, 33, 88, 209, 131, 83, 214, 41, 246, 65, 206, 121, 130, + 187, 143, 18, 254, 190, 33, 218, 144, 192, 80, 79, 226, 14, 121, 49, 157, 244, 57, 145, 188, + 81, 18, 63, 51, 40, 140, 153, 12, 162, 159, 103, 194, 12, 88, 49, 201, 33, 220, 147, 89, 23, + 58, 206, 162, 51, 110, 142, 168, 46, 25, 162, 46, 176, 83, 163, 78, 96, 106, 201, 93, 121, + 50, 207, 37, 61, 79, 230, 208, 145, 89, 14, 136, 248, 253, 116, 140, 156, 180, 67, 251, 161, + 151, 198, 180, 13, 217, 213, 133, 121, 40, 150, 38, 207, 49, 55, 225, 228, 129, 57, 33, 71, + 49, 53, 85, 111, 5, 205, 174, 211, 173, 217, 148, 35, 126, 28, 24, 90, 33, 24, 220, 25, 36, + 17, 160, 88, 158, 122, 136, 144, 253, 212, 61, 40, 190, 92, 65, 36, 139, 156, 242, 62, 196, + 221, 57, 84, 31, 130, 137, 58, 14, 121, 214, 164, 158, 197, 245, 156, 42, 145, 189, 235, 27, + 57, 81, 114, 57, 161, 126, 15, 41, 217, 61, 114, 133, 96, 180, 108, 4, 156, 75, 58, 167, 3, + 99, 165, 254, 136, 64, 152, 69, 156, 118, 68, 181, 141, 209, 45, 253, 144, 198, 79, 242, + 214, 11, 201, 244, 173, 93, 175, 236, 59, 153, 201, 76, 141, 123, 194, 30, 221, 145, 168, + 25, 171, 206, 78, 254, 11, 12, 187, 196, 166, 91, 207, 203, 121, 2, 70, 185, 211, 87, 12, + 45, 250, 208, 207, 181, 254, 5, 35, 161, 226, 98, 144, 11, 6, 185, 213, 60, 83, 44, 50, 65, + 87, 199, 237, 137, 155, 69, 218, 245, 151, 76, 179, 91, 227, 160, 96, 212, 129, 65, 174, + 138, 80, 38, 167, 243, 222, 98, 57, 84, 170, 99, 206, 197, 78, 139, 96, 182, 59, 57, 61, 19, + 18, 228, 108, 139, 237, 230, 28, 121, 101, 22, 15, 166, 210, 226, 147, 161, 131, 222, 66, + 198, 140, 106, 236, 216, 15, 153, 86, 248, 198, 192, 82, 191, 47, 20, 50, 195, 192, 193, 60, + 0, 223, 92, 39, 93, 100, 23, 220, 98, 218, 150, 89, 229, 111, 89, 46, 216, 200, 100, 252, + 125, 67, 44, 207, 60, 221, 92, 125, 104, 206, 217, 43, 191, 115, 63, 69, 97, 27, 123, 166, + 225, 67, 166, 25, 230, 58, 149, 7, 151, 159, 202, 245, 246, 47, 24, 198, 218, 28, 121, 117, + 214, 49, 22, 201, 214, 156, 18, 245, 3, 205, 144, 204, 154, 227, 243, 225, 71, 125, 131, + 134, 103, 30, 115, 42, 153, 253, 85, 15, 152, 252, 144, 188, 77, 211, 206, 247, 78, 68, 143, + 155, 71, 107, 196, 88, 180, 41, 107, 16, 210, 124, 14, 204, 46, 80, 121, 79, 77, 227, 14, + 91, 130, 162, 204, 201, 153, 118, 101, 157, 1, 202, 244, 194, 197, 240, 252, 4, 57, 147, 92, + 24, 195, 175, 35, 111, 114, 6, 205, 37, 228, 241, 117, 141, 234, 213, 184, 16, 158, 181, 62, + 69, 26, 61, 126, 31, 12, 120, 147, 125, 91, 39, 22, 218, 116, 165, 153, 163, 114, 176, 139, + 143, 55, 160, 217, 75, 215, 239, 89, 60, 16, 31, 7, 149, 47, 27, 154, 242, 229, 68, 166, + 153, 138, 117, 209, 60, 51, 249, 88, 212, 156, 160, 14, 48, 175, 200, 104, 230, 64, 172, + 171, 154, 202, 208, 8, 234, 178, 172, 253, 154, 72, 57, 21, 169, 225, 98, 44, 203, 201, 178, + 137, 14, 171, 62, 171, 122, 211, 97, 116, 207, 102, 172, 183, 164, 192, 53, 66, 97, 197, + 113, 47, 83, 191, 34, 108, 46, 162, 198, 174, 69, 251, 149, 46, 253, 28, 118, 171, 119, 48, + 173, 74, 77, 106, 87, 10, 150, 161, 30, 48, 174, 55, 192, 57, 207, 25, 203, 131, 86, 4, 61, + 219, 157, 167, 14, 141, 240, 97, 55, 25, 141, 84, 37, 243, 52, 52, 71, 48, 141, 61, 10, 219, + 249, 166, 209, 251, 32, 41, 73, 13, 0, 220, 53, 15, 215, 115, 69, 182, 133, 174, 135, 78, + 92, 143, 154, 95, 231, 93, 141, 91, 69, 211, 158, 202, 126, 124, 60, 178, 139, 176, 109, + 230, 61, 38, 241, 54, 205, 6, 93, 175, 22, 130, 74, 194, 110, 167, 145, 215, 243, 217, 213, + 172, 187, 34, 112, 250, 3, 218, 69, 11, 39, 27, 6, 229, 22, 237, 162, 97, 178, 0, 136, 143, + 32, 115, 224, 140, 172, 184, 100, 190, 75, 46, 132, 46, 215, 28, 99, 26, 79, 28, 34, 62, + 236, 89, 98, 208, 96, 118, 197, 166, 241, 73, 28, 169, 99, 48, 195, 134, 180, 34, 85, 7, + 154, 28, 150, 193, 122, 1, 48, 150, 177, 243, 92, 242, 116, 153, 9, 197, 117, 132, 28, 83, + 118, 244, 156, 58, 94, 50, 173, 158, 154, 18, 27, 79, 28, 44, 100, 138, 221, 210, 42, 214, + 159, 124, 26, 98, 221, 80, 57, 203, 9, 159, 120, 200, 147, 89, 219, 6, 147, 208, 57, 245, 6, + 24, 31, 22, 115, 72, 24, 72, 23, 87, 167, 21, 114, 219, 153, 92, 176, 154, 33, 183, 120, + 227, 96, 12, 250, 184, 58, 125, 0, 140, 139, 90, 57, 64, 231, 23, 24, 147, 2, 56, 87, 19, + 65, 224, 43, 15, 228, 88, 42, 88, 75, 29, 37, 100, 220, 41, 137, 133, 59, 142, 99, 18, 227, + 205, 150, 111, 65, 165, 169, 68, 6, 110, 38, 158, 124, 216, 124, 153, 52, 100, 66, 200, 174, + 16, 24, 137, 94, 116, 220, 26, 143, 40, 202, 5, 224, 73, 101, 215, 200, 146, 142, 223, 66, + 158, 45, 53, 13, 93, 45, 100, 61, 182, 26, 222, 28, 177, 88, 16, 119, 136, 32, 234, 35, 247, + 231, 142, 96, 237, 90, 80, 245, 241, 57, 194, 21, 128, 143, 12, 12, 114, 112, 121, 228, 150, + 72, 159, 203, 181, 138, 120, 236, 241, 150, 105, 22, 20, 179, 144, 174, 173, 146, 240, 212, + 31, 3, 224, 232, 108, 156, 97, 245, 64, 33, 227, 185, 75, 166, 14, 121, 240, 247, 60, 64, + 165, 151, 27, 116, 128, 213, 230, 217, 190, 42, 128, 233, 153, 172, 142, 215, 160, 44, 128, + 40, 210, 144, 35, 203, 174, 163, 86, 38, 224, 70, 179, 130, 134, 155, 46, 249, 22, 5, 65, + 159, 101, 149, 160, 21, 140, 229, 114, 172, 96, 8, 221, 154, 218, 15, 24, 29, 191, 195, 213, + 12, 95, 97, 186, 8, 252, 249, 167, 110, 12, 189, 183, 106, 42, 252, 250, 153, 162, 108, 118, + 128, 194, 223, 55, 93, 66, 13, 95, 160, 247, 92, 234, 134, 1, 226, 108, 186, 240, 144, 35, + 147, 117, 12, 154, 13, 172, 6, 58, 15, 217, 123, 198, 11, 95, 44, 156, 220, 211, 74, 55, + 137, 252, 171, 139, 137, 174, 225, 0, 96, 51, 103, 25, 176, 128, 136, 240, 230, 99, 54, 0, + 54, 178, 254, 144, 104, 114, 255, 106, 20, 23, 109, 177, 2, 62, 151, 141, 117, 230, 158, 65, + 131, 179, 79, 8, 141, 46, 109, 80, 119, 141, 58, 69, 164, 64, 231, 213, 249, 254, 81, 220, + 2, 244, 126, 123, 238, 184, 11, 150, 20, 190, 160, 162, 202, 10, 32, 111, 48, 208, 98, 173, + 96, 94, 208, 39, 98, 133, 234, 204, 245, 172, 215, 68, 27, 115, 90, 157, 96, 61, 93, 207, + 68, 9, 109, 18, 67, 24, 5, 39, 49, 4, 241, 104, 13, 121, 50, 84, 8, 74, 157, 204, 182, 141, + 68, 12, 179, 193, 199, 37, 221, 12, 153, 142, 197, 240, 245, 16, 105, 83, 207, 74, 29, 220, + 126, 196, 193, 20, 207, 253, 158, 48, 0, 235, 23, 207, 93, 83, 249, 15, 221, 179, 33, 107, + 242, 80, 157, 61, 150, 147, 245, 83, 230, 90, 79, 141, 61, 228, 74, 214, 35, 7, 94, 86, 96, + 218, 0, 136, 73, 68, 163, 254, 5, 104, 248, 210, 97, 82, 153, 60, 229, 145, 201, 116, 181, + 179, 49, 78, 12, 126, 208, 176, 57, 248, 113, 32, 223, 189, 181, 243, 185, 51, 81, 66, 58, + 218, 17, 227, 92, 147, 60, 172, 83, 6, 192, 157, 24, 24, 149, 47, 152, 106, 124, 170, 78, + 230, 36, 109, 110, 120, 3, 126, 130, 203, 162, 76, 179, 206, 54, 5, 118, 13, 128, 78, 161, + 134, 125, 129, 86, 114, 61, 228, 32, 27, 98, 53, 206, 26, 124, 159, 134, 60, 208, 77, 219, + 217, 53, 106, 139, 143, 85, 58, 169, 97, 9, 98, 135, 125, 201, 112, 197, 68, 100, 164, 64, + 68, 28, 237, 59, 35, 135, 64, 88, 146, 23, 34, 49, 161, 178, 19, 199, 142, 6, 19, 242, 68, + 95, 174, 245, 14, 41, 81, 100, 145, 169, 71, 87, 116, 159, 143, 198, 71, 102, 23, 138, 76, + 227, 75, 128, 225, 232, 164, 180, 114, 68, 113, 123, 166, 115, 188, 168, 28, 25, 30, 98, 89, + 234, 137, 200, 101, 207, 198, 39, 27, 182, 62, 52, 140, 138, 102, 251, 209, 107, 74, 75, 45, + 206, 5, 220, 208, 179, 196, 179, 22, 88, 126, 79, 153, 107, 61, 53, 90, 23, 197, 137, 186, + 34, 209, 171, 107, 4, 68, 203, 204, 82, 84, 11, 179, 241, 146, 105, 116, 107, 156, 35, 37, + 218, 45, 234, 152, 100, 211, 154, 170, 218, 60, 219, 126, 200, 165, 255, 139, 76, 171, 151, + 134, 174, 160, 40, 224, 8, 154, 89, 59, 197, 223, 160, 49, 21, 252, 152, 210, 64, 228, 4, + 178, 246, 77, 17, 142, 151, 171, 140, 156, 252, 138, 243, 178, 71, 151, 150, 145, 64, 10, + 99, 52, 139, 208, 237, 91, 116, 150, 78, 75, 22, 97, 85, 32, 12, 131, 250, 65, 106, 229, + 117, 114, 140, 212, 69, 59, 146, 97, 209, 40, 250, 91, 36, 140, 110, 10, 99, 47, 191, 186, + 210, 193, 192, 180, 131, 121, 103, 156, 162, 229, 134, 229, 92, 6, 23, 99, 10, 67, 16, 39, + 83, 187, 157, 163, 98, 30, 60, 23, 173, 248, 196, 196, 161, 163, 111, 78, 165, 98, 221, 202, + 61, 244, 154, 64, 228, 187, 198, 210, 100, 109, 35, 193, 61, 100, 49, 248, 67, 227, 89, 7, + 33, 142, 117, 165, 187, 163, 237, 106, 90, 197, 229, 182, 172, 52, 39, 223, 117, 70, 85, 41, + 131, 10, 233, 114, 24, 197, 222, 89, 254, 47, 112, 93, 226, 165, 139, 45, 58, 31, 112, 184, + 43, 67, 128, 107, 174, 70, 130, 112, 109, 26, 39, 153, 124, 92, 61, 229, 115, 198, 75, 51, + 57, 189, 154, 62, 217, 174, 161, 150, 13, 175, 95, 60, 180, 112, 212, 129, 227, 65, 196, + 134, 125, 203, 230, 0, 244, 71, 231, 68, 221, 216, 58, 17, 206, 28, 175, 3, 21, 88, 205, + 117, 182, 24, 39, 253, 35, 68, 199, 200, 49, 30, 15, 252, 130, 18, 193, 110, 197, 159, 162, + 74, 231, 254, 221, 21, 143, 117, 82, 191, 243, 9, 123, 93, 206, 255, 216, 174, 114, 44, 59, + 114, 24, 150, 207, 41, 124, 129, 223, 79, 251, 114, 30, 39, 14, 186, 239, 159, 14, 1, 144, + 42, 149, 103, 50, 162, 196, 210, 66, 81, 32, 216, 160, 39, 113, 57, 76, 179, 166, 235, 121, + 0, 253, 182, 136, 49, 115, 195, 105, 6, 75, 226, 17, 250, 4, 220, 252, 65, 10, 67, 163, 114, + 207, 139, 36, 213, 120, 77, 138, 214, 230, 189, 14, 142, 149, 230, 89, 124, 219, 154, 237, + 26, 201, 200, 194, 166, 63, 42, 146, 187, 93, 115, 85, 46, 236, 210, 198, 220, 146, 64, 237, + 247, 108, 220, 116, 225, 166, 119, 117, 6, 6, 3, 249, 103, 234, 36, 144, 151, 78, 102, 154, + 137, 161, 49, 154, 114, 187, 59, 225, 4, 154, 58, 218, 70, 163, 83, 36, 130, 200, 188, 117, + 250, 130, 131, 252, 236, 123, 238, 72, 163, 49, 227, 44, 234, 122, 24, 90, 220, 245, 128, + 172, 128, 77, 22, 247, 100, 11, 91, 94, 76, 61, 138, 182, 73, 85, 48, 208, 161, 232, 29, 13, + 108, 66, 239, 200, 193, 107, 90, 187, 48, 150, 255, 20, 34, 15, 241, 153, 60, 5, 20, 95, + 198, 208, 126, 219, 210, 130, 103, 100, 123, 157, 69, 137, 223, 42, 205, 169, 186, 154, 69, + 36, 36, 114, 25, 149, 180, 142, 191, 85, 173, 208, 197, 117, 63, 177, 204, 235, 164, 153, 6, + 106, 20, 43, 253, 86, 41, 247, 54, 94, 59, 251, 220, 203, 164, 79, 0, 72, 250, 238, 153, 96, + 118, 37, 160, 19, 90, 130, 101, 160, 103, 12, 32, 232, 21, 132, 122, 219, 116, 186, 71, 86, + 19, 29, 161, 185, 96, 81, 110, 165, 63, 94, 77, 109, 101, 246, 135, 155, 232, 215, 146, 243, + 181, 86, 44, 254, 110, 125, 47, 29, 61, 131, 247, 55, 30, 46, 44, 51, 157, 64, 212, 108, + 233, 130, 111, 155, 29, 213, 98, 230, 112, 168, 178, 216, 41, 93, 12, 120, 26, 12, 111, 229, + 70, 147, 36, 131, 201, 117, 144, 115, 6, 166, 11, 3, 58, 5, 64, 79, 88, 93, 183, 21, 176, + 120, 72, 184, 179, 34, 6, 10, 162, 208, 163, 159, 219, 56, 84, 214, 222, 55, 249, 203, 91, + 179, 250, 196, 132, 118, 155, 154, 72, 10, 170, 232, 132, 160, 25, 187, 32, 154, 188, 217, + 212, 252, 132, 38, 174, 10, 57, 6, 107, 123, 125, 186, 76, 250, 128, 160, 253, 122, 139, + 110, 221, 40, 5, 102, 243, 18, 40, 175, 64, 102, 43, 205, 108, 43, 176, 81, 95, 230, 114, + 47, 112, 141, 146, 211, 247, 210, 33, 195, 176, 226, 115, 66, 11, 73, 245, 107, 179, 168, + 47, 119, 241, 175, 213, 207, 183, 73, 214, 86, 67, 206, 60, 137, 203, 141, 165, 18, 253, + 236, 201, 88, 16, 102, 9, 170, 211, 164, 178, 185, 218, 170, 103, 168, 249, 139, 40, 141, + 165, 38, 168, 210, 32, 135, 24, 104, 183, 173, 28, 195, 139, 219, 200, 85, 78, 121, 105, + 135, 102, 182, 26, 251, 107, 224, 28, 175, 7, 165, 57, 29, 87, 124, 223, 122, 139, 248, 152, + 131, 214, 233, 83, 73, 121, 149, 233, 209, 183, 75, 211, 199, 78, 190, 241, 7, 26, 104, 211, + 203, 59, 50, 173, 158, 215, 101, 143, 122, 249, 91, 246, 93, 21, 223, 149, 236, 216, 22, 80, + 70, 177, 130, 13, 222, 182, 93, 199, 97, 51, 250, 222, 56, 96, 246, 72, 169, 22, 83, 90, 26, + 72, 70, 213, 100, 50, 69, 20, 100, 69, 130, 209, 102, 50, 95, 116, 69, 83, 146, 191, 98, + 247, 133, 78, 73, 143, 203, 182, 145, 208, 146, 34, 19, 42, 204, 72, 208, 131, 144, 60, 5, + 246, 134, 9, 169, 238, 51, 25, 81, 20, 95, 33, 179, 45, 210, 194, 25, 180, 147, 153, 138, + 116, 162, 90, 96, 50, 184, 87, 215, 11, 58, 182, 166, 90, 58, 45, 40, 98, 241, 124, 85, 111, + 11, 21, 35, 14, 120, 67, 188, 161, 26, 118, 85, 103, 200, 13, 232, 134, 24, 73, 63, 124, 58, + 241, 178, 75, 105, 207, 170, 200, 61, 67, 179, 71, 36, 11, 53, 246, 109, 159, 168, 250, 16, + 250, 160, 11, 88, 185, 185, 252, 14, 242, 69, 11, 115, 195, 73, 171, 240, 79, 231, 163, 202, + 196, 105, 78, 14, 53, 100, 101, 241, 208, 83, 152, 238, 233, 151, 82, 244, 255, 101, 199, 5, + 157, 145, 126, 164, 44, 110, 139, 249, 21, 110, 153, 107, 103, 69, 44, 51, 74, 246, 58, 111, + 251, 184, 157, 145, 230, 25, 153, 145, 25, 52, 197, 221, 248, 62, 85, 45, 242, 49, 103, 36, + 176, 138, 5, 110, 117, 235, 130, 79, 64, 51, 107, 12, 247, 167, 82, 193, 224, 12, 177, 103, + 153, 17, 168, 196, 51, 211, 54, 183, 244, 117, 13, 52, 156, 40, 209, 204, 248, 218, 188, 94, + 66, 94, 21, 40, 5, 179, 27, 69, 59, 111, 251, 6, 244, 123, 141, 145, 123, 171, 234, 47, 203, + 48, 73, 77, 117, 186, 122, 178, 186, 50, 194, 129, 36, 185, 182, 219, 148, 25, 124, 90, 67, + 90, 132, 93, 130, 116, 222, 13, 142, 106, 60, 99, 80, 196, 92, 9, 26, 127, 159, 59, 82, 107, + 230, 155, 27, 224, 227, 2, 42, 131, 170, 31, 221, 143, 125, 84, 189, 61, 192, 30, 74, 190, + 120, 107, 198, 204, 126, 220, 18, 179, 144, 237, 103, 138, 171, 71, 115, 53, 177, 186, 119, + 93, 124, 184, 220, 127, 71, 195, 132, 135, 162, 175, 137, 175, 143, 62, 104, 83, 18, 235, + 41, 102, 194, 16, 170, 238, 109, 107, 185, 1, 183, 237, 173, 86, 113, 162, 129, 61, 207, + 131, 188, 145, 55, 94, 122, 144, 56, 21, 95, 123, 143, 246, 108, 42, 15, 123, 196, 194, 162, + 231, 173, 108, 126, 68, 123, 41, 254, 203, 177, 217, 92, 33, 106, 49, 211, 100, 169, 55, + 248, 220, 74, 94, 209, 71, 100, 215, 187, 234, 6, 68, 172, 49, 85, 25, 209, 120, 101, 60, 4, + 181, 18, 184, 238, 164, 14, 16, 35, 34, 70, 180, 134, 60, 252, 137, 133, 237, 55, 177, 164, + 248, 229, 37, 62, 135, 203, 166, 215, 61, 162, 211, 227, 193, 197, 247, 58, 206, 154, 159, + 68, 249, 199, 45, 39, 158, 195, 188, 237, 227, 233, 185, 22, 80, 233, 71, 249, 219, 223, + 212, 244, 80, 31, 246, 175, 231, 180, 61, 234, 68, 253, 99, 54, 54, 172, 163, 216, 75, 226, + 121, 107, 242, 215, 38, 154, 196, 219, 192, 117, 6, 99, 94, 54, 159, 110, 201, 126, 219, + 210, 152, 74, 16, 241, 183, 182, 18, 108, 46, 228, 154, 36, 161, 51, 148, 216, 72, 46, 5, + 33, 108, 252, 59, 75, 85, 98, 73, 7, 67, 51, 239, 212, 126, 150, 166, 115, 160, 54, 146, + 248, 69, 207, 76, 196, 32, 251, 174, 155, 81, 241, 233, 42, 80, 46, 37, 148, 62, 100, 122, + 202, 199, 160, 247, 117, 152, 69, 63, 23, 82, 60, 231, 202, 104, 185, 168, 79, 59, 31, 92, + 213, 49, 236, 153, 116, 9, 106, 122, 45, 214, 124, 59, 165, 217, 147, 45, 19, 131, 117, 3, + 250, 81, 39, 224, 169, 14, 242, 141, 107, 134, 193, 199, 26, 90, 61, 16, 164, 97, 25, 124, + 223, 14, 58, 25, 54, 234, 70, 87, 225, 36, 247, 1, 204, 96, 3, 7, 126, 212, 0, 61, 199, 12, + 111, 155, 153, 31, 32, 165, 115, 80, 189, 124, 95, 37, 146, 236, 129, 203, 23, 26, 0, 187, + 157, 223, 62, 57, 244, 92, 231, 237, 124, 178, 118, 214, 208, 110, 126, 178, 106, 89, 99, + 150, 124, 10, 91, 70, 233, 153, 77, 220, 169, 174, 152, 214, 234, 90, 161, 123, 50, 192, 44, + 151, 99, 13, 245, 191, 132, 208, 210, 178, 142, 126, 40, 188, 152, 77, 8, 11, 160, 202, 111, + 163, 219, 122, 219, 71, 253, 124, 212, 233, 72, 156, 198, 124, 82, 235, 134, 246, 80, 73, + 28, 242, 44, 59, 164, 174, 129, 177, 188, 89, 49, 187, 111, 151, 214, 11, 72, 162, 27, 212, + 102, 160, 170, 169, 65, 74, 126, 212, 12, 168, 200, 62, 216, 30, 214, 74, 66, 170, 112, 163, + 199, 106, 122, 141, 133, 203, 85, 85, 63, 205, 218, 229, 233, 39, 232, 209, 128, 110, 32, 8, + 125, 20, 199, 225, 147, 168, 77, 53, 219, 155, 222, 141, 139, 255, 48, 103, 189, 235, 252, + 80, 220, 162, 206, 9, 232, 26, 193, 36, 194, 100, 226, 131, 176, 19, 160, 250, 246, 29, 195, + 131, 9, 58, 210, 121, 192, 244, 78, 85, 205, 25, 148, 181, 207, 253, 68, 204, 88, 156, 196, + 142, 118, 234, 92, 15, 56, 188, 156, 251, 54, 100, 101, 76, 185, 160, 18, 16, 121, 1, 196, + 203, 199, 118, 190, 223, 240, 241, 116, 240, 164, 147, 19, 182, 207, 56, 80, 13, 195, 111, + 48, 81, 29, 137, 127, 243, 179, 145, 193, 88, 86, 170, 158, 193, 214, 4, 105, 82, 229, 232, + 87, 94, 234, 175, 7, 52, 18, 58, 159, 142, 66, 119, 106, 155, 97, 151, 3, 40, 36, 31, 123, + 68, 245, 13, 116, 186, 255, 25, 27, 235, 40, 135, 79, 103, 235, 168, 200, 14, 98, 13, 174, + 114, 121, 62, 128, 87, 5, 70, 53, 140, 0, 127, 255, 35, 69, 243, 233, 84, 7, 127, 65, 92, + 165, 124, 33, 115, 22, 82, 198, 236, 221, 148, 70, 118, 163, 31, 43, 231, 172, 38, 198, 33, + 255, 181, 153, 190, 86, 90, 12, 25, 211, 127, 7, 210, 78, 8, 243, 179, 240, 141, 80, 158, + 152, 245, 171, 49, 151, 171, 94, 196, 106, 62, 167, 191, 23, 31, 157, 248, 173, 212, 183, + 77, 63, 84, 123, 108, 165, 104, 254, 7, 94, 64, 10, 181, 60, 136, 101, 171, 191, 70, 145, + 147, 58, 196, 11, 232, 205, 123, 212, 185, 134, 149, 15, 130, 221, 255, 66, 40, 114, 250, + 79, 172, 132, 8, 232, 174, 78, 131, 104, 176, 139, 218, 206, 237, 188, 128, 26, 16, 37, 85, + 198, 244, 237, 75, 89, 197, 114, 167, 142, 21, 15, 178, 144, 58, 21, 177, 93, 131, 101, 207, + 252, 200, 58, 216, 200, 165, 96, 234, 134, 59, 35, 113, 55, 50, 5, 90, 180, 46, 18, 108, 18, + 204, 29, 178, 94, 179, 171, 236, 29, 190, 98, 253, 0, 24, 47, 59, 42, 203, 25, 209, 19, 67, + 127, 57, 190, 46, 94, 183, 135, 162, 135, 216, 134, 234, 225, 66, 53, 48, 253, 6, 183, 201, + 210, 144, 213, 5, 240, 183, 130, 87, 12, 55, 150, 20, 246, 107, 55, 208, 132, 247, 24, 41, + 230, 32, 107, 15, 62, 167, 233, 27, 124, 23, 174, 110, 6, 137, 201, 200, 119, 18, 52, 86, + 183, 17, 142, 228, 34, 163, 226, 246, 235, 1, 148, 6, 225, 89, 178, 28, 53, 9, 50, 108, 160, + 133, 49, 155, 245, 123, 226, 83, 242, 55, 49, 209, 232, 36, 222, 87, 129, 84, 165, 102, 223, + 4, 137, 160, 111, 95, 118, 159, 110, 17, 155, 165, 110, 217, 58, 136, 237, 220, 187, 196, + 63, 255, 248, 82, 147, 53, 252, 7, 112, 14, 100, 218, 210, 110, 51, 236, 173, 57, 114, 5, + 24, 33, 35, 118, 98, 74, 150, 114, 42, 186, 157, 160, 255, 5, 158, 218, 63, 84, 30, 59, 171, + 222, 100, 181, 136, 218, 111, 231, 112, 207, 7, 186, 164, 50, 128, 102, 210, 193, 162, 80, + 57, 98, 205, 48, 199, 114, 167, 189, 234, 89, 92, 64, 219, 92, 103, 204, 147, 98, 169, 195, + 125, 33, 165, 200, 53, 170, 156, 93, 158, 49, 73, 251, 154, 43, 178, 164, 0, 118, 197, 133, + 212, 9, 98, 124, 3, 58, 14, 30, 118, 107, 117, 108, 34, 144, 174, 235, 120, 222, 16, 158, + 235, 111, 199, 137, 98, 240, 251, 186, 46, 150, 172, 63, 248, 211, 42, 200, 39, 39, 188, + 174, 31, 66, 99, 224, 156, 81, 202, 190, 15, 76, 136, 10, 220, 43, 234, 166, 119, 23, 63, + 64, 139, 26, 31, 176, 46, 111, 74, 80, 128, 15, 144, 128, 118, 168, 236, 244, 191, 62, 202, + 66, 205, 232, 224, 55, 166, 100, 241, 58, 131, 216, 232, 249, 15, 224, 204, 25, 144, 235, + 233, 55, 223, 201, 181, 73, 228, 104, 109, 10, 53, 206, 244, 243, 66, 102, 27, 53, 200, 236, + 80, 45, 197, 111, 179, 118, 74, 2, 19, 92, 16, 223, 118, 181, 148, 231, 150, 218, 102, 83, + 32, 242, 162, 204, 111, 176, 227, 33, 105, 96, 15, 252, 39, 195, 108, 37, 132, 49, 183, 74, + 225, 98, 193, 100, 104, 154, 4, 176, 89, 108, 62, 86, 86, 136, 10, 91, 20, 171, 128, 8, 215, + 98, 75, 39, 255, 7, 112, 174, 217, 188, 207, 248, 126, 161, 179, 10, 166, 134, 132, 113, + 101, 205, 93, 238, 237, 29, 162, 217, 214, 219, 169, 45, 186, 109, 122, 225, 50, 49, 171, + 91, 149, 69, 2, 60, 130, 168, 118, 156, 63, 49, 20, 12, 208, 152, 49, 141, 130, 229, 193, + 191, 193, 9, 228, 25, 43, 209, 169, 90, 232, 215, 56, 110, 191, 254, 21, 96, 0, 26, 70, 243, + 152, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 51, 53, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 52, + 54, 53, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 108, 87, 57, 118, 44, 49, + 14, 203, 255, 41, 250, 2, 174, 167, 125, 57, 143, 147, 9, 220, 247, 79, 135, 0, 40, 149, + 170, 102, 18, 91, 104, 177, 36, 18, 92, 149, 203, 85, 70, 253, 132, 171, 204, 250, 201, 11, + 228, 137, 117, 230, 239, 173, 126, 126, 255, 25, 74, 217, 80, 173, 148, 138, 5, 235, 136, + 101, 24, 182, 236, 211, 133, 130, 125, 19, 175, 96, 223, 228, 124, 205, 108, 235, 82, 181, + 158, 182, 110, 91, 108, 24, 210, 133, 169, 125, 210, 21, 226, 185, 252, 253, 247, 159, 127, + 177, 218, 151, 159, 113, 149, 252, 249, 2, 52, 173, 109, 213, 3, 126, 79, 184, 72, 160, 219, + 225, 56, 119, 195, 222, 63, 252, 162, 95, 181, 80, 170, 84, 95, 83, 40, 199, 122, 111, 197, + 121, 127, 161, 245, 62, 12, 112, 95, 132, 143, 150, 6, 75, 49, 232, 153, 10, 153, 27, 87, + 51, 226, 190, 128, 97, 98, 183, 215, 79, 202, 87, 205, 216, 202, 137, 96, 100, 30, 143, 211, + 77, 140, 74, 180, 244, 73, 245, 10, 212, 218, 56, 181, 117, 52, 186, 218, 53, 10, 132, 236, + 214, 0, 84, 185, 211, 140, 212, 122, 141, 129, 117, 141, 88, 215, 228, 82, 220, 137, 141, + 103, 213, 79, 185, 154, 253, 245, 115, 151, 84, 185, 102, 179, 163, 74, 230, 78, 194, 186, + 154, 198, 246, 123, 229, 141, 147, 236, 108, 45, 115, 90, 234, 55, 184, 206, 214, 101, 138, + 39, 10, 153, 241, 131, 187, 182, 78, 180, 209, 65, 199, 198, 44, 186, 49, 149, 207, 188, + 114, 225, 45, 13, 203, 185, 86, 161, 56, 11, 205, 153, 123, 208, 248, 0, 36, 185, 113, 249, + 147, 198, 53, 38, 88, 126, 224, 212, 175, 212, 13, 204, 107, 192, 238, 78, 95, 253, 228, + 112, 37, 132, 18, 112, 23, 110, 216, 172, 93, 235, 78, 209, 70, 209, 136, 224, 166, 104, 43, + 194, 102, 40, 208, 52, 144, 174, 170, 99, 75, 34, 202, 126, 106, 20, 140, 118, 130, 233, 99, + 126, 225, 119, 145, 32, 233, 208, 78, 43, 155, 157, 38, 5, 70, 162, 172, 145, 4, 68, 102, + 224, 6, 162, 208, 36, 107, 212, 194, 148, 222, 176, 151, 244, 93, 208, 29, 185, 86, 238, + 149, 88, 15, 89, 227, 64, 7, 157, 148, 60, 16, 41, 172, 215, 12, 248, 165, 211, 225, 223, + 247, 15, 246, 133, 101, 30, 63, 224, 122, 93, 229, 90, 69, 234, 33, 53, 184, 183, 40, 52, + 29, 165, 255, 148, 32, 226, 0, 182, 135, 177, 45, 181, 26, 32, 187, 215, 94, 143, 146, 165, + 61, 153, 41, 239, 241, 189, 40, 124, 32, 198, 248, 115, 55, 139, 96, 165, 143, 131, 216, 61, + 27, 18, 245, 233, 43, 208, 97, 198, 212, 87, 77, 70, 5, 151, 44, 157, 6, 167, 66, 209, 230, + 108, 140, 248, 66, 30, 129, 160, 39, 78, 86, 184, 239, 11, 187, 43, 12, 33, 110, 204, 48, + 114, 31, 24, 143, 183, 165, 41, 242, 108, 99, 140, 103, 103, 134, 197, 11, 82, 250, 181, 47, + 95, 152, 74, 99, 19, 163, 208, 160, 17, 180, 176, 49, 109, 81, 62, 10, 181, 46, 227, 9, 40, + 121, 236, 33, 241, 232, 249, 184, 214, 58, 193, 115, 18, 48, 42, 111, 17, 164, 184, 156, 31, + 161, 204, 3, 40, 91, 236, 63, 178, 7, 95, 156, 12, 102, 68, 196, 86, 52, 93, 125, 184, 166, + 61, 18, 103, 21, 167, 17, 69, 73, 206, 55, 178, 152, 170, 46, 204, 31, 140, 208, 217, 40, + 93, 68, 118, 97, 37, 172, 141, 96, 57, 28, 231, 198, 193, 10, 246, 63, 110, 57, 16, 221, + 152, 89, 153, 249, 117, 129, 27, 243, 21, 146, 112, 253, 252, 121, 101, 3, 66, 76, 252, 225, + 3, 139, 171, 33, 95, 78, 250, 253, 129, 161, 126, 151, 226, 44, 3, 22, 158, 77, 176, 170, + 204, 39, 40, 9, 43, 3, 92, 153, 156, 48, 139, 131, 254, 66, 148, 173, 81, 252, 133, 65, 101, + 158, 63, 24, 108, 89, 208, 42, 198, 222, 44, 168, 67, 252, 90, 209, 237, 206, 176, 237, 41, + 87, 233, 226, 82, 136, 106, 150, 108, 210, 102, 151, 26, 147, 14, 71, 152, 65, 225, 72, 84, + 152, 207, 214, 164, 163, 194, 205, 106, 250, 54, 239, 255, 32, 202, 62, 119, 81, 46, 81, 2, + 202, 193, 147, 98, 155, 194, 57, 239, 160, 118, 78, 11, 6, 6, 0, 89, 57, 146, 4, 67, 87, 28, + 73, 50, 100, 5, 21, 148, 141, 100, 111, 178, 68, 89, 1, 242, 28, 179, 179, 224, 30, 156, 24, + 143, 21, 135, 10, 171, 218, 115, 229, 233, 23, 48, 205, 186, 112, 236, 170, 211, 134, 64, + 165, 69, 20, 42, 124, 10, 154, 72, 12, 150, 59, 68, 13, 81, 17, 102, 244, 3, 80, 242, 216, + 179, 134, 159, 182, 254, 216, 114, 107, 38, 35, 210, 126, 72, 73, 230, 198, 126, 223, 169, + 76, 195, 183, 157, 36, 41, 124, 13, 143, 92, 183, 87, 13, 162, 117, 128, 239, 241, 70, 20, + 126, 238, 150, 201, 140, 183, 233, 4, 102, 231, 186, 157, 67, 217, 224, 94, 255, 220, 107, + 236, 197, 198, 4, 100, 61, 128, 96, 67, 59, 249, 81, 233, 140, 16, 217, 234, 97, 171, 81, + 245, 192, 238, 180, 191, 52, 83, 7, 79, 29, 117, 167, 255, 134, 17, 237, 88, 10, 172, 146, + 89, 183, 10, 145, 99, 194, 186, 51, 176, 13, 75, 135, 163, 54, 172, 79, 183, 15, 111, 7, + 211, 227, 89, 137, 160, 18, 252, 125, 225, 152, 233, 135, 109, 109, 190, 154, 170, 126, 64, + 158, 24, 204, 130, 22, 171, 55, 72, 131, 146, 204, 168, 113, 73, 167, 204, 113, 114, 245, + 98, 156, 51, 119, 255, 124, 34, 10, 63, 119, 49, 112, 174, 121, 192, 32, 72, 245, 126, 138, + 115, 119, 3, 53, 16, 132, 80, 89, 159, 200, 68, 19, 21, 195, 15, 86, 30, 255, 128, 75, 174, + 126, 210, 11, 70, 20, 101, 117, 233, 4, 208, 242, 158, 50, 120, 80, 25, 52, 5, 122, 65, 52, + 17, 97, 142, 127, 34, 234, 23, 102, 221, 81, 246, 39, 194, 225, 225, 85, 144, 191, 239, 31, + 236, 136, 236, 89, 150, 230, 186, 124, 183, 74, 195, 163, 223, 97, 178, 142, 79, 176, 233, + 137, 142, 203, 215, 110, 246, 246, 19, 68, 86, 214, 94, 92, 154, 230, 169, 136, 179, 89, + 113, 251, 43, 172, 48, 56, 225, 225, 79, 223, 47, 44, 239, 59, 228, 228, 35, 67, 45, 221, + 97, 226, 6, 189, 172, 125, 66, 31, 196, 240, 75, 167, 98, 124, 48, 192, 226, 78, 91, 188, + 157, 55, 196, 31, 54, 34, 215, 83, 109, 25, 201, 240, 83, 213, 232, 45, 132, 80, 54, 26, 70, + 108, 128, 130, 117, 211, 108, 142, 214, 99, 8, 181, 52, 99, 240, 249, 233, 106, 2, 39, 160, + 224, 177, 87, 69, 165, 148, 122, 104, 232, 195, 15, 134, 60, 170, 194, 209, 39, 235, 114, + 159, 74, 1, 10, 42, 2, 202, 249, 36, 208, 27, 202, 15, 170, 122, 0, 241, 5, 98, 160, 81, 48, + 107, 103, 250, 67, 167, 210, 236, 60, 247, 60, 36, 14, 142, 139, 169, 8, 51, 243, 71, 175, + 141, 239, 19, 174, 225, 125, 136, 33, 60, 240, 62, 63, 214, 230, 213, 111, 58, 223, 177, 63, + 211, 175, 176, 233, 218, 214, 73, 115, 239, 13, 56, 125, 181, 136, 67, 122, 83, 255, 215, + 60, 57, 81, 167, 190, 107, 102, 36, 130, 175, 112, 95, 12, 108, 23, 16, 156, 130, 140, 78, + 96, 193, 126, 79, 215, 17, 93, 106, 89, 101, 64, 169, 139, 186, 27, 143, 147, 108, 80, 150, + 174, 237, 32, 120, 162, 159, 174, 81, 220, 85, 175, 8, 64, 216, 116, 46, 127, 111, 45, 97, + 235, 90, 23, 133, 215, 54, 198, 233, 44, 196, 150, 212, 100, 19, 47, 66, 131, 124, 82, 113, + 109, 42, 49, 46, 37, 104, 40, 77, 177, 201, 174, 5, 28, 185, 11, 55, 196, 160, 232, 209, 36, + 185, 62, 165, 202, 252, 97, 114, 150, 184, 81, 63, 1, 53, 242, 131, 92, 89, 191, 100, 178, + 174, 157, 170, 186, 234, 120, 243, 129, 237, 232, 161, 112, 96, 204, 237, 174, 254, 0, 232, + 84, 200, 82, 63, 233, 22, 217, 22, 217, 202, 241, 146, 107, 130, 254, 124, 60, 161, 94, 122, + 231, 190, 226, 197, 80, 223, 175, 44, 3, 57, 173, 232, 169, 117, 251, 249, 173, 211, 129, + 188, 18, 12, 126, 140, 214, 255, 125, 194, 21, 4, 75, 201, 5, 173, 56, 175, 55, 133, 126, + 192, 224, 192, 136, 74, 4, 105, 62, 129, 222, 19, 247, 94, 101, 43, 193, 57, 61, 239, 128, + 136, 24, 38, 125, 162, 47, 218, 77, 71, 128, 27, 111, 10, 240, 19, 122, 93, 224, 112, 227, + 212, 208, 11, 232, 29, 246, 61, 134, 176, 193, 30, 105, 96, 118, 165, 231, 92, 250, 254, + 222, 159, 90, 129, 212, 164, 62, 71, 189, 133, 159, 80, 196, 250, 15, 8, 10, 207, 204, 230, + 12, 32, 107, 190, 239, 31, 86, 150, 217, 32, 169, 19, 145, 127, 133, 147, 15, 45, 157, 172, + 203, 133, 133, 116, 195, 202, 38, 248, 130, 135, 248, 222, 23, 139, 69, 175, 128, 149, 250, + 5, 35, 215, 126, 131, 250, 101, 62, 173, 65, 145, 50, 254, 7, 30, 85, 13, 154, 230, 187, + 170, 9, 238, 96, 85, 11, 2, 193, 235, 170, 188, 10, 155, 238, 154, 253, 166, 205, 244, 106, + 245, 13, 149, 137, 18, 174, 42, 67, 122, 11, 89, 237, 214, 211, 169, 166, 125, 145, 199, + 103, 172, 254, 125, 18, 193, 7, 222, 116, 111, 18, 22, 69, 57, 123, 161, 202, 132, 98, 95, + 21, 174, 33, 31, 79, 112, 199, 103, 99, 239, 64, 161, 76, 218, 108, 254, 78, 108, 68, 203, + 13, 131, 103, 14, 190, 3, 75, 213, 133, 109, 174, 158, 101, 160, 44, 7, 179, 163, 217, 15, + 73, 14, 198, 187, 230, 246, 223, 97, 136, 71, 114, 159, 82, 190, 123, 32, 43, 233, 43, 2, + 122, 145, 172, 123, 61, 143, 27, 94, 144, 42, 15, 82, 31, 33, 177, 195, 186, 237, 176, 62, + 224, 17, 246, 123, 95, 245, 162, 169, 13, 175, 164, 230, 69, 106, 12, 109, 27, 181, 121, + 171, 170, 136, 15, 149, 221, 95, 138, 67, 113, 247, 221, 129, 232, 212, 154, 43, 226, 242, + 65, 101, 91, 250, 193, 188, 236, 45, 99, 16, 217, 125, 123, 205, 18, 192, 87, 38, 30, 19, + 161, 158, 21, 194, 102, 226, 248, 57, 80, 43, 123, 136, 192, 158, 122, 169, 58, 190, 79, + 232, 152, 103, 234, 225, 217, 39, 164, 244, 99, 127, 229, 24, 92, 255, 178, 140, 198, 38, + 229, 209, 158, 163, 30, 216, 144, 37, 207, 79, 83, 39, 177, 210, 183, 70, 34, 14, 62, 44, + 37, 208, 18, 90, 180, 134, 245, 124, 3, 42, 212, 3, 7, 138, 200, 105, 140, 77, 100, 216, + 148, 78, 208, 234, 26, 60, 52, 156, 113, 14, 73, 247, 109, 157, 51, 16, 102, 211, 72, 68, + 185, 36, 155, 58, 173, 193, 144, 219, 136, 80, 152, 31, 234, 211, 192, 117, 232, 104, 62, + 39, 222, 208, 153, 157, 84, 3, 192, 199, 135, 84, 30, 76, 6, 56, 220, 16, 38, 33, 180, 36, + 209, 158, 125, 106, 241, 225, 163, 92, 254, 49, 227, 215, 201, 153, 60, 225, 137, 238, 225, + 210, 38, 19, 236, 85, 181, 238, 76, 128, 18, 114, 143, 91, 142, 57, 70, 249, 124, 58, 16, + 79, 167, 17, 52, 210, 5, 53, 89, 124, 129, 179, 55, 238, 252, 80, 150, 100, 202, 63, 232, + 182, 253, 158, 46, 209, 108, 100, 24, 251, 11, 31, 20, 203, 102, 99, 127, 69, 98, 142, 119, + 251, 132, 205, 249, 238, 115, 154, 132, 113, 78, 146, 238, 222, 224, 199, 248, 44, 139, 87, + 27, 94, 234, 70, 166, 162, 12, 85, 207, 166, 157, 185, 106, 51, 72, 54, 205, 53, 131, 72, + 82, 67, 82, 231, 149, 89, 62, 177, 252, 124, 114, 224, 172, 232, 86, 68, 136, 124, 175, 38, + 96, 146, 209, 154, 223, 19, 175, 52, 203, 124, 156, 172, 64, 69, 29, 111, 50, 125, 117, 140, + 204, 183, 194, 240, 221, 208, 95, 136, 58, 74, 229, 204, 185, 238, 239, 159, 199, 50, 104, + 107, 222, 117, 101, 176, 154, 196, 247, 9, 225, 221, 182, 219, 67, 225, 140, 202, 146, 235, + 15, 24, 62, 64, 189, 94, 45, 95, 54, 205, 151, 203, 209, 109, 205, 140, 10, 148, 181, 189, + 248, 168, 24, 255, 158, 136, 90, 179, 211, 240, 218, 63, 36, 25, 155, 4, 109, 114, 149, 211, + 188, 107, 238, 247, 253, 195, 242, 191, 21, 26, 127, 38, 121, 101, 12, 229, 208, 68, 21, + 112, 201, 14, 13, 224, 15, 180, 223, 84, 107, 215, 21, 233, 236, 194, 55, 170, 94, 10, 248, + 134, 100, 253, 93, 192, 123, 136, 213, 174, 185, 17, 79, 93, 45, 49, 51, 34, 99, 119, 116, + 4, 217, 106, 48, 44, 140, 252, 220, 42, 149, 202, 226, 70, 32, 174, 114, 141, 232, 217, 225, + 58, 88, 62, 196, 35, 79, 158, 172, 35, 75, 225, 201, 123, 78, 64, 237, 107, 241, 111, 245, + 78, 50, 67, 48, 90, 12, 62, 222, 190, 79, 136, 246, 192, 55, 8, 146, 14, 59, 195, 31, 39, + 191, 255, 236, 0, 139, 14, 20, 20, 59, 206, 121, 243, 249, 255, 137, 40, 250, 220, 245, 226, + 140, 225, 195, 244, 18, 104, 36, 215, 96, 225, 35, 14, 6, 26, 192, 8, 49, 224, 206, 123, + 189, 228, 110, 152, 2, 231, 90, 20, 231, 65, 193, 137, 117, 112, 57, 246, 15, 36, 150, 179, + 135, 110, 50, 1, 24, 183, 93, 153, 27, 135, 234, 74, 199, 19, 240, 77, 193, 13, 232, 165, + 192, 7, 33, 184, 135, 151, 14, 132, 181, 236, 28, 145, 122, 120, 121, 14, 73, 154, 180, 224, + 181, 162, 209, 108, 127, 106, 161, 203, 216, 245, 67, 85, 165, 118, 103, 172, 173, 90, 143, + 221, 207, 122, 168, 28, 75, 72, 221, 191, 203, 81, 64, 17, 160, 31, 197, 247, 151, 62, 189, + 59, 199, 146, 245, 179, 233, 70, 127, 15, 242, 102, 212, 223, 137, 146, 188, 148, 156, 44, + 193, 160, 178, 45, 183, 201, 30, 181, 213, 41, 87, 77, 245, 213, 65, 127, 108, 78, 156, 177, + 74, 10, 171, 102, 155, 128, 46, 0, 209, 64, 217, 44, 206, 192, 191, 161, 194, 238, 168, 71, + 77, 224, 136, 15, 62, 59, 182, 220, 6, 171, 35, 241, 162, 237, 129, 221, 216, 4, 35, 155, + 195, 250, 193, 96, 139, 15, 56, 82, 61, 197, 19, 92, 178, 216, 78, 120, 242, 212, 93, 223, + 19, 130, 136, 212, 181, 149, 47, 126, 22, 107, 116, 226, 64, 198, 78, 225, 9, 95, 110, 248, + 187, 147, 118, 157, 213, 229, 213, 66, 80, 243, 65, 244, 154, 40, 236, 7, 155, 111, 113, + 173, 84, 10, 129, 199, 66, 200, 12, 159, 146, 140, 203, 37, 80, 189, 41, 149, 104, 216, 100, + 10, 166, 34, 18, 186, 188, 21, 180, 87, 73, 178, 77, 154, 78, 151, 173, 163, 179, 165, 86, + 206, 167, 68, 96, 82, 15, 142, 143, 166, 117, 246, 65, 73, 236, 243, 132, 130, 13, 214, 237, + 161, 231, 198, 233, 78, 247, 47, 92, 169, 252, 163, 127, 103, 90, 208, 207, 236, 124, 17, + 69, 246, 123, 140, 101, 197, 21, 105, 189, 174, 203, 35, 134, 188, 165, 149, 155, 73, 245, + 197, 192, 80, 172, 169, 30, 23, 22, 165, 90, 95, 64, 172, 246, 85, 105, 192, 191, 226, 167, + 146, 255, 153, 156, 69, 85, 204, 181, 145, 153, 65, 136, 192, 86, 95, 136, 130, 207, 221, + 152, 87, 181, 90, 199, 47, 190, 146, 70, 234, 161, 153, 217, 93, 56, 56, 95, 56, 240, 89, + 82, 110, 235, 106, 144, 206, 129, 21, 165, 254, 70, 10, 236, 113, 108, 166, 93, 191, 22, + 151, 4, 116, 214, 127, 185, 174, 146, 107, 201, 113, 24, 150, 202, 79, 224, 207, 179, 118, + 57, 158, 190, 118, 231, 127, 29, 2, 32, 181, 248, 84, 70, 73, 182, 196, 13, 4, 109, 138, + 132, 6, 205, 12, 144, 7, 32, 43, 92, 59, 58, 8, 23, 232, 216, 135, 75, 116, 160, 127, 223, + 63, 130, 160, 209, 135, 167, 184, 169, 73, 90, 20, 39, 178, 199, 37, 88, 83, 229, 87, 23, + 108, 249, 139, 196, 231, 215, 234, 12, 237, 6, 198, 200, 75, 160, 208, 2, 146, 39, 100, 32, + 83, 81, 19, 83, 161, 196, 126, 40, 59, 129, 90, 248, 165, 248, 242, 100, 234, 192, 75, 0, + 76, 178, 94, 150, 176, 225, 214, 153, 136, 241, 65, 248, 94, 115, 153, 23, 201, 129, 20, + 153, 99, 53, 211, 155, 107, 136, 115, 102, 176, 9, 52, 88, 164, 103, 126, 216, 147, 178, + 107, 245, 17, 167, 72, 200, 204, 32, 145, 215, 213, 90, 23, 107, 4, 132, 176, 179, 52, 154, + 167, 236, 243, 239, 150, 32, 28, 78, 23, 48, 238, 253, 32, 229, 92, 217, 123, 131, 232, 10, + 90, 62, 208, 144, 210, 12, 122, 112, 31, 50, 71, 18, 163, 7, 119, 155, 123, 144, 77, 10, 6, + 58, 36, 131, 49, 210, 146, 177, 232, 175, 121, 233, 234, 19, 112, 231, 134, 136, 233, 169, + 185, 31, 22, 58, 53, 183, 111, 245, 213, 212, 87, 90, 26, 26, 55, 88, 217, 12, 164, 188, 79, + 126, 68, 223, 85, 96, 240, 109, 30, 180, 243, 143, 229, 4, 163, 16, 15, 120, 81, 154, 229, + 131, 250, 179, 166, 164, 229, 162, 68, 130, 0, 205, 34, 227, 138, 51, 73, 93, 9, 232, 177, + 47, 232, 221, 59, 64, 79, 72, 170, 81, 151, 39, 115, 164, 245, 144, 200, 123, 234, 113, 250, + 130, 233, 217, 139, 9, 198, 174, 44, 144, 205, 106, 60, 133, 184, 77, 178, 220, 60, 140, + 138, 52, 72, 65, 233, 206, 151, 240, 116, 89, 102, 37, 105, 251, 11, 169, 32, 174, 213, 150, + 216, 120, 84, 72, 222, 87, 223, 199, 211, 64, 117, 7, 66, 249, 137, 168, 96, 42, 66, 15, + 240, 158, 233, 157, 58, 133, 94, 121, 88, 231, 221, 195, 153, 110, 112, 232, 32, 174, 5, + 183, 56, 104, 238, 2, 78, 137, 139, 150, 148, 77, 80, 53, 37, 82, 242, 2, 20, 56, 215, 90, + 245, 34, 177, 176, 66, 237, 248, 196, 213, 179, 107, 33, 159, 170, 32, 43, 167, 102, 132, + 197, 124, 7, 146, 42, 204, 231, 106, 122, 47, 154, 60, 89, 147, 204, 42, 85, 106, 255, 64, + 127, 253, 251, 224, 229, 164, 138, 198, 138, 106, 112, 150, 93, 133, 212, 197, 54, 41, 239, + 189, 54, 115, 21, 178, 33, 159, 155, 87, 71, 247, 249, 108, 204, 21, 149, 102, 159, 217, + 181, 210, 118, 3, 209, 37, 109, 175, 218, 42, 86, 125, 54, 91, 40, 18, 126, 195, 208, 35, + 93, 100, 17, 18, 105, 125, 54, 242, 173, 177, 216, 162, 200, 26, 37, 202, 9, 196, 169, 231, + 90, 59, 174, 158, 80, 22, 180, 241, 188, 170, 134, 80, 239, 97, 224, 178, 188, 84, 162, 161, + 17, 125, 69, 245, 216, 250, 246, 100, 129, 146, 242, 9, 34, 104, 207, 96, 242, 55, 27, 21, + 109, 170, 17, 1, 136, 108, 241, 119, 62, 167, 20, 5, 0, 169, 48, 132, 114, 253, 160, 53, + 252, 192, 40, 77, 63, 201, 221, 170, 49, 131, 163, 4, 166, 192, 122, 140, 22, 194, 43, 107, + 186, 25, 96, 160, 234, 57, 68, 127, 248, 127, 61, 63, 234, 199, 239, 114, 26, 247, 189, 58, + 188, 106, 128, 138, 216, 160, 75, 133, 249, 209, 165, 66, 166, 123, 155, 186, 51, 242, 70, + 158, 193, 84, 42, 118, 114, 159, 202, 96, 97, 171, 162, 106, 227, 226, 141, 215, 217, 44, + 63, 220, 171, 4, 144, 57, 253, 88, 171, 190, 145, 179, 151, 228, 250, 248, 207, 29, 84, 94, + 162, 135, 19, 142, 91, 62, 223, 109, 57, 111, 179, 45, 151, 39, 57, 209, 134, 191, 78, 32, + 171, 187, 176, 241, 246, 223, 61, 131, 192, 213, 213, 135, 144, 3, 47, 162, 235, 100, 123, + 19, 200, 186, 67, 157, 81, 68, 109, 93, 35, 212, 198, 5, 6, 165, 210, 18, 108, 134, 33, 142, + 87, 207, 165, 183, 110, 180, 11, 206, 124, 98, 87, 60, 209, 162, 123, 206, 109, 209, 124, + 166, 184, 46, 116, 38, 184, 115, 110, 169, 12, 95, 125, 209, 209, 245, 137, 255, 126, 112, + 180, 2, 6, 224, 88, 74, 239, 41, 207, 197, 138, 171, 60, 205, 180, 210, 190, 240, 207, 114, + 232, 64, 191, 250, 123, 67, 31, 2, 252, 203, 193, 88, 147, 26, 142, 231, 36, 217, 87, 55, + 129, 189, 26, 132, 46, 164, 173, 199, 234, 195, 94, 249, 235, 45, 37, 166, 20, 100, 73, 245, + 43, 85, 194, 44, 49, 146, 221, 188, 170, 73, 243, 209, 37, 36, 253, 80, 10, 74, 194, 238, + 227, 108, 94, 254, 247, 173, 38, 160, 189, 215, 177, 109, 119, 77, 143, 154, 88, 61, 87, + 238, 172, 242, 130, 122, 117, 69, 35, 30, 166, 93, 74, 11, 175, 59, 81, 37, 31, 232, 108, 8, + 120, 133, 36, 199, 23, 113, 222, 208, 5, 55, 226, 245, 109, 224, 60, 86, 89, 244, 122, 117, + 81, 128, 190, 123, 64, 85, 17, 94, 212, 125, 174, 203, 250, 168, 48, 20, 154, 174, 57, 161, + 43, 140, 85, 253, 175, 120, 122, 116, 146, 158, 54, 206, 234, 253, 184, 234, 75, 165, 171, + 85, 54, 193, 33, 222, 125, 9, 114, 117, 222, 155, 179, 173, 168, 6, 141, 76, 42, 168, 243, + 6, 188, 17, 198, 24, 213, 34, 52, 244, 191, 239, 31, 10, 25, 144, 105, 50, 0, 133, 81, 3, + 39, 174, 53, 118, 210, 30, 176, 115, 115, 45, 17, 115, 238, 141, 4, 49, 243, 58, 20, 245, + 175, 55, 147, 27, 217, 214, 239, 42, 73, 213, 220, 76, 208, 60, 222, 89, 59, 213, 141, 38, + 107, 205, 251, 233, 175, 203, 32, 177, 215, 46, 192, 245, 178, 95, 183, 43, 84, 204, 195, + 11, 236, 43, 152, 165, 47, 44, 73, 110, 215, 35, 225, 116, 122, 200, 189, 248, 72, 52, 216, + 36, 70, 31, 230, 226, 106, 99, 249, 161, 49, 188, 56, 251, 221, 237, 133, 126, 169, 226, 96, + 36, 76, 87, 157, 144, 11, 227, 250, 203, 219, 23, 70, 175, 20, 170, 66, 195, 9, 151, 131, + 12, 60, 33, 186, 126, 104, 104, 74, 234, 126, 249, 6, 252, 104, 205, 75, 208, 40, 204, 171, + 21, 158, 86, 185, 153, 178, 75, 178, 129, 134, 54, 9, 186, 39, 109, 157, 104, 99, 88, 230, + 219, 33, 207, 212, 191, 46, 28, 223, 174, 84, 143, 225, 125, 235, 178, 221, 77, 173, 99, + 247, 224, 190, 90, 114, 191, 129, 50, 96, 175, 53, 205, 166, 13, 77, 3, 46, 144, 223, 147, + 27, 42, 38, 175, 76, 210, 56, 65, 99, 237, 141, 184, 121, 106, 14, 68, 194, 224, 230, 73, + 102, 91, 227, 248, 56, 193, 253, 178, 6, 179, 226, 241, 215, 132, 5, 33, 21, 9, 160, 121, + 42, 12, 207, 17, 127, 55, 221, 230, 149, 231, 200, 96, 125, 252, 3, 21, 215, 123, 189, 190, + 130, 166, 82, 16, 195, 61, 140, 105, 179, 84, 188, 197, 15, 185, 224, 35, 13, 220, 127, 33, + 149, 134, 79, 64, 85, 254, 152, 186, 114, 73, 63, 183, 117, 145, 238, 72, 26, 176, 145, 204, + 165, 127, 94, 52, 156, 85, 29, 160, 206, 31, 175, 17, 14, 50, 110, 173, 166, 21, 141, 68, + 202, 194, 53, 145, 92, 72, 33, 59, 86, 27, 133, 204, 6, 235, 130, 180, 84, 173, 245, 1, 225, + 134, 31, 30, 18, 226, 141, 184, 151, 165, 98, 220, 188, 50, 6, 242, 134, 207, 45, 172, 226, + 233, 144, 236, 32, 161, 31, 21, 228, 239, 75, 237, 122, 26, 239, 222, 224, 4, 212, 249, 58, + 221, 49, 97, 243, 96, 69, 107, 146, 26, 208, 65, 30, 250, 137, 98, 81, 142, 117, 160, 38, + 94, 163, 159, 38, 7, 208, 27, 41, 71, 242, 185, 74, 26, 91, 136, 179, 235, 177, 247, 192, + 145, 47, 214, 98, 194, 189, 251, 120, 214, 195, 208, 132, 233, 68, 58, 88, 77, 113, 94, 135, + 60, 100, 229, 102, 55, 80, 117, 125, 152, 123, 35, 186, 67, 185, 83, 48, 139, 252, 35, 194, + 5, 138, 216, 207, 13, 43, 152, 194, 156, 99, 11, 133, 143, 26, 68, 5, 76, 106, 37, 16, 128, + 191, 25, 210, 38, 18, 208, 242, 250, 137, 157, 9, 80, 137, 12, 47, 102, 14, 32, 118, 109, + 254, 223, 221, 192, 133, 130, 229, 76, 249, 169, 18, 216, 205, 201, 234, 155, 87, 113, 27, + 60, 39, 173, 29, 222, 179, 2, 154, 158, 57, 68, 149, 201, 210, 121, 110, 58, 31, 149, 137, + 251, 127, 38, 158, 50, 61, 42, 117, 23, 114, 70, 217, 99, 224, 194, 44, 193, 103, 227, 254, + 243, 217, 118, 221, 43, 163, 46, 27, 42, 26, 19, 142, 97, 170, 22, 151, 32, 190, 175, 246, + 176, 206, 247, 209, 54, 126, 46, 237, 93, 15, 159, 17, 29, 12, 133, 122, 127, 22, 125, 110, + 195, 3, 244, 27, 92, 27, 185, 166, 78, 66, 38, 1, 87, 234, 70, 170, 251, 162, 172, 204, 156, + 59, 241, 222, 138, 231, 5, 120, 199, 172, 20, 65, 90, 152, 155, 160, 39, 35, 125, 234, 127, + 141, 96, 116, 223, 138, 218, 113, 12, 244, 10, 205, 3, 204, 164, 157, 150, 31, 88, 42, 80, + 237, 232, 197, 136, 50, 142, 250, 66, 4, 138, 207, 34, 84, 171, 113, 123, 190, 98, 214, 52, + 87, 217, 15, 94, 66, 139, 90, 209, 109, 60, 117, 211, 116, 139, 94, 67, 178, 181, 212, 152, + 95, 36, 74, 44, 196, 232, 154, 127, 151, 166, 209, 169, 95, 28, 95, 182, 190, 169, 226, 103, + 17, 87, 126, 114, 235, 33, 196, 101, 29, 100, 77, 44, 183, 15, 18, 253, 36, 98, 204, 142, + 24, 233, 220, 90, 39, 240, 127, 192, 26, 43, 65, 3, 225, 182, 113, 72, 67, 168, 155, 95, 47, + 112, 180, 89, 95, 138, 48, 14, 41, 144, 151, 209, 232, 77, 2, 170, 50, 221, 235, 207, 30, + 107, 171, 119, 151, 97, 59, 25, 197, 162, 33, 131, 52, 176, 144, 111, 117, 68, 117, 82, 37, + 156, 56, 230, 196, 113, 182, 49, 72, 158, 209, 113, 237, 23, 213, 54, 20, 129, 203, 208, 63, + 50, 29, 221, 215, 184, 241, 13, 211, 217, 35, 38, 27, 56, 45, 31, 162, 206, 26, 229, 62, + 162, 172, 155, 120, 147, 178, 235, 231, 127, 1, 6, 0, 79, 13, 247, 172, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 53, 56, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 52, 55, 55, 51, 62, 62, + 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 140, 87, 73, 114, 28, 49, 14, 188, 251, 21, + 253, 1, 85, 112, 95, 222, 163, 203, 28, 236, 255, 95, 7, 153, 9, 46, 37, 123, 34, 230, 34, + 33, 27, 40, 16, 196, 206, 88, 159, 88, 63, 95, 253, 233, 181, 126, 98, 121, 202, 231, 107, + 60, 165, 221, 228, 247, 47, 3, 57, 30, 70, 32, 61, 154, 125, 144, 159, 81, 236, 243, 249, + 100, 202, 229, 167, 13, 160, 81, 192, 154, 193, 88, 49, 60, 181, 75, 114, 110, 68, 149, 161, + 138, 221, 120, 112, 202, 142, 146, 159, 13, 81, 9, 186, 156, 137, 213, 39, 117, 232, 47, + 129, 160, 7, 158, 29, 34, 5, 95, 120, 163, 77, 141, 103, 14, 200, 253, 231, 87, 156, 79, + 133, 45, 79, 176, 163, 255, 188, 161, 129, 222, 1, 74, 255, 164, 240, 68, 144, 53, 219, 103, + 6, 10, 60, 21, 159, 102, 218, 12, 77, 241, 218, 139, 54, 185, 104, 190, 162, 92, 253, 252, + 6, 42, 141, 40, 149, 191, 177, 161, 20, 111, 96, 39, 155, 50, 58, 8, 122, 50, 96, 79, 96, + 213, 84, 1, 90, 164, 32, 79, 48, 131, 146, 4, 67, 39, 76, 5, 182, 244, 143, 153, 157, 235, + 77, 210, 250, 235, 247, 98, 242, 1, 113, 55, 58, 53, 208, 193, 175, 24, 10, 20, 197, 64, 71, + 12, 157, 18, 219, 79, 244, 253, 235, 47, 110, 117, 148, 0, 50, 233, 60, 37, 152, 104, 120, + 35, 99, 146, 51, 250, 27, 32, 40, 169, 152, 70, 88, 210, 44, 36, 0, 244, 197, 168, 244, 218, + 13, 13, 40, 90, 36, 219, 142, 220, 55, 196, 10, 125, 27, 35, 88, 113, 254, 19, 152, 156, + 229, 34, 179, 205, 124, 75, 245, 153, 249, 102, 54, 254, 68, 70, 167, 224, 193, 4, 61, 168, + 163, 86, 41, 201, 116, 86, 159, 228, 213, 234, 215, 52, 186, 59, 169, 163, 198, 98, 152, + 121, 179, 234, 138, 55, 77, 195, 59, 195, 80, 50, 44, 176, 12, 181, 100, 109, 252, 172, 51, + 67, 111, 104, 158, 107, 178, 169, 36, 5, 134, 46, 104, 73, 17, 140, 114, 193, 200, 200, 19, + 37, 226, 104, 47, 154, 41, 115, 115, 186, 50, 50, 195, 163, 233, 9, 195, 189, 107, 114, 105, + 5, 137, 151, 76, 172, 93, 228, 157, 208, 184, 178, 53, 63, 33, 213, 85, 55, 233, 153, 242, + 175, 25, 245, 2, 84, 121, 241, 220, 213, 104, 20, 208, 96, 126, 75, 172, 50, 202, 53, 28, + 109, 226, 73, 71, 199, 255, 129, 78, 201, 25, 238, 8, 32, 90, 202, 102, 255, 102, 174, 22, + 226, 17, 254, 198, 40, 248, 8, 80, 153, 186, 85, 156, 22, 149, 187, 89, 54, 244, 72, 193, + 212, 8, 250, 15, 240, 141, 0, 37, 29, 9, 252, 251, 7, 142, 221, 2, 199, 171, 53, 208, 67, + 58, 67, 242, 47, 173, 102, 188, 171, 24, 8, 115, 229, 249, 11, 80, 240, 197, 83, 115, 176, + 182, 107, 52, 115, 163, 46, 49, 74, 117, 10, 93, 89, 115, 3, 54, 193, 78, 247, 100, 21, 220, + 141, 96, 60, 188, 204, 72, 24, 40, 195, 232, 52, 93, 123, 71, 11, 97, 150, 1, 216, 175, 81, + 163, 99, 176, 69, 9, 200, 33, 27, 154, 242, 158, 161, 227, 69, 126, 227, 80, 28, 177, 227, + 114, 67, 3, 86, 94, 89, 90, 186, 53, 104, 24, 23, 167, 127, 54, 136, 26, 89, 199, 238, 139, + 230, 13, 173, 16, 161, 194, 107, 40, 35, 206, 134, 50, 102, 81, 163, 190, 118, 147, 26, 95, + 231, 119, 16, 35, 113, 114, 161, 50, 50, 252, 64, 153, 200, 67, 34, 57, 129, 246, 166, 155, + 164, 204, 245, 59, 82, 40, 177, 229, 110, 144, 212, 67, 161, 114, 59, 83, 103, 179, 44, 64, + 195, 5, 60, 87, 102, 17, 38, 217, 155, 73, 235, 124, 184, 224, 137, 195, 197, 144, 214, 234, + 79, 24, 175, 229, 195, 126, 231, 179, 117, 53, 201, 23, 52, 192, 212, 126, 138, 9, 227, 127, + 93, 163, 52, 187, 41, 149, 243, 42, 177, 13, 226, 103, 12, 42, 100, 51, 133, 18, 28, 26, 57, + 176, 121, 17, 43, 63, 35, 173, 118, 44, 239, 125, 109, 224, 239, 165, 104, 183, 136, 219, + 19, 104, 200, 70, 215, 229, 136, 57, 164, 118, 145, 215, 114, 145, 53, 230, 128, 140, 174, + 138, 72, 103, 6, 52, 57, 97, 71, 217, 163, 94, 42, 122, 41, 234, 129, 97, 183, 187, 25, 42, + 203, 253, 106, 95, 7, 100, 55, 33, 143, 15, 103, 22, 72, 48, 114, 59, 100, 118, 17, 7, 255, + 38, 255, 95, 145, 148, 63, 1, 63, 70, 142, 143, 160, 59, 36, 117, 214, 181, 70, 21, 141, + 123, 119, 149, 47, 23, 23, 169, 5, 106, 104, 52, 73, 74, 235, 148, 239, 79, 65, 35, 204, 3, + 158, 197, 66, 155, 53, 52, 185, 223, 248, 190, 119, 0, 35, 202, 77, 194, 155, 81, 93, 67, + 19, 254, 100, 74, 124, 237, 148, 188, 144, 167, 136, 143, 245, 250, 232, 34, 10, 71, 108, + 168, 4, 159, 24, 0, 28, 25, 54, 231, 111, 154, 98, 150, 168, 24, 38, 145, 98, 81, 246, 134, + 32, 212, 247, 228, 54, 84, 196, 67, 17, 26, 234, 113, 77, 100, 3, 83, 227, 185, 171, 71, + 200, 5, 137, 125, 33, 106, 220, 229, 68, 160, 59, 150, 40, 185, 148, 124, 108, 129, 214, 36, + 180, 133, 15, 96, 110, 95, 236, 94, 181, 124, 99, 29, 105, 79, 49, 180, 247, 178, 7, 220, + 141, 208, 237, 228, 14, 92, 217, 53, 106, 152, 242, 46, 163, 173, 32, 55, 110, 157, 74, 211, + 182, 162, 159, 37, 149, 184, 173, 13, 114, 2, 83, 150, 78, 231, 182, 84, 87, 224, 154, 129, + 38, 6, 156, 40, 14, 66, 19, 234, 45, 22, 195, 46, 0, 133, 205, 5, 11, 43, 46, 112, 21, 80, + 143, 96, 51, 10, 202, 152, 204, 130, 242, 106, 107, 76, 230, 186, 122, 78, 109, 142, 216, + 50, 55, 121, 106, 16, 69, 57, 181, 99, 116, 214, 237, 31, 131, 115, 98, 33, 143, 230, 103, + 171, 128, 89, 215, 219, 34, 240, 68, 3, 141, 234, 231, 67, 49, 12, 76, 190, 41, 108, 183, + 199, 5, 38, 182, 41, 208, 77, 66, 40, 97, 131, 152, 184, 147, 11, 245, 228, 62, 176, 232, + 22, 37, 38, 52, 201, 169, 84, 102, 171, 181, 145, 157, 175, 139, 156, 40, 212, 162, 30, 27, + 147, 231, 68, 6, 57, 114, 86, 191, 17, 100, 111, 60, 208, 246, 14, 152, 2, 61, 239, 147, 99, + 66, 31, 27, 15, 107, 54, 241, 156, 23, 248, 254, 245, 131, 167, 111, 172, 166, 232, 154, 47, + 116, 145, 68, 169, 62, 137, 236, 165, 53, 180, 232, 32, 92, 13, 159, 212, 41, 84, 92, 95, + 29, 130, 133, 204, 236, 204, 94, 151, 202, 130, 165, 231, 251, 23, 230, 230, 102, 117, 45, + 71, 208, 57, 12, 184, 70, 155, 197, 148, 59, 208, 42, 128, 102, 216, 211, 169, 171, 68, 53, + 206, 32, 22, 178, 120, 105, 126, 26, 99, 101, 23, 233, 3, 244, 36, 205, 78, 216, 184, 74, + 192, 75, 3, 7, 133, 68, 22, 218, 225, 11, 80, 223, 205, 235, 73, 94, 42, 99, 219, 138, 125, + 144, 23, 142, 11, 14, 220, 81, 171, 123, 98, 13, 12, 47, 123, 33, 202, 102, 217, 66, 103, 7, + 119, 189, 69, 106, 168, 115, 36, 166, 26, 4, 47, 216, 209, 39, 182, 201, 185, 201, 254, 150, + 100, 102, 202, 132, 185, 27, 47, 21, 241, 98, 3, 152, 202, 169, 38, 57, 125, 103, 37, 13, + 86, 247, 103, 239, 86, 30, 56, 152, 32, 199, 93, 20, 53, 145, 86, 32, 2, 59, 110, 87, 167, + 11, 79, 246, 155, 72, 61, 74, 110, 112, 226, 2, 213, 126, 50, 34, 112, 183, 96, 70, 92, 216, + 51, 9, 207, 193, 149, 190, 129, 118, 67, 176, 172, 179, 195, 86, 58, 177, 65, 14, 110, 15, + 70, 243, 217, 198, 44, 85, 113, 119, 60, 57, 188, 218, 60, 72, 211, 93, 216, 217, 51, 190, + 120, 134, 90, 0, 202, 29, 121, 131, 188, 27, 190, 91, 14, 77, 48, 168, 28, 124, 105, 97, + 135, 190, 73, 136, 92, 191, 151, 76, 53, 202, 109, 169, 175, 18, 106, 130, 204, 129, 161, + 147, 241, 207, 170, 178, 128, 238, 69, 229, 107, 107, 162, 127, 180, 56, 150, 214, 23, 9, + 85, 215, 239, 56, 175, 99, 224, 24, 78, 108, 102, 117, 110, 247, 119, 230, 190, 39, 25, 70, + 133, 27, 110, 67, 201, 29, 202, 25, 220, 144, 181, 110, 96, 179, 68, 161, 133, 20, 203, 83, + 54, 77, 10, 161, 47, 101, 80, 214, 244, 38, 51, 22, 180, 183, 29, 244, 174, 198, 33, 226, + 237, 170, 177, 243, 79, 46, 103, 174, 118, 221, 175, 65, 163, 123, 161, 210, 238, 23, 96, + 211, 185, 121, 221, 190, 41, 88, 168, 6, 183, 112, 163, 107, 57, 189, 9, 251, 220, 199, 44, + 196, 254, 229, 233, 147, 181, 178, 140, 253, 228, 162, 59, 223, 32, 174, 39, 212, 37, 167, + 46, 196, 179, 19, 3, 255, 2, 60, 48, 8, 118, 63, 41, 49, 49, 22, 181, 45, 79, 222, 113, 135, + 166, 245, 76, 135, 30, 89, 98, 195, 199, 177, 38, 134, 70, 255, 77, 179, 151, 207, 139, 35, + 58, 211, 195, 11, 248, 172, 161, 143, 93, 174, 156, 245, 72, 35, 137, 107, 4, 167, 200, 2, + 172, 19, 156, 142, 125, 54, 112, 231, 62, 235, 86, 240, 46, 97, 163, 156, 220, 169, 27, 199, + 246, 6, 38, 169, 177, 242, 165, 39, 148, 26, 9, 124, 248, 1, 99, 108, 127, 82, 48, 229, 245, + 128, 69, 103, 162, 235, 177, 87, 71, 134, 118, 61, 80, 46, 132, 102, 134, 79, 50, 119, 63, + 112, 34, 81, 26, 174, 16, 58, 124, 239, 142, 218, 129, 54, 50, 227, 28, 240, 54, 52, 217, + 153, 28, 168, 75, 169, 95, 60, 115, 98, 194, 63, 131, 58, 19, 167, 234, 156, 215, 71, 233, + 232, 167, 74, 110, 66, 155, 59, 9, 108, 136, 220, 180, 142, 222, 28, 11, 85, 68, 166, 38, + 209, 149, 105, 219, 252, 214, 89, 89, 12, 255, 193, 252, 140, 196, 79, 10, 141, 137, 124, + 97, 255, 149, 62, 238, 36, 132, 104, 165, 84, 209, 96, 44, 215, 24, 76, 84, 37, 131, 172, + 213, 74, 129, 210, 45, 152, 132, 190, 144, 232, 19, 102, 3, 57, 163, 243, 182, 69, 138, 199, + 185, 110, 245, 6, 248, 198, 152, 15, 108, 1, 129, 75, 18, 218, 249, 87, 219, 247, 141, 222, + 129, 144, 96, 149, 100, 172, 187, 31, 216, 132, 201, 215, 102, 212, 61, 147, 75, 91, 93, + 235, 166, 217, 81, 58, 64, 91, 105, 204, 46, 247, 90, 217, 248, 176, 210, 132, 65, 203, 44, + 120, 88, 113, 110, 120, 247, 94, 145, 178, 142, 158, 21, 252, 80, 93, 207, 247, 254, 176, + 235, 133, 27, 184, 65, 3, 13, 128, 238, 44, 247, 192, 129, 136, 234, 160, 146, 202, 104, 5, + 113, 212, 143, 60, 122, 186, 233, 42, 143, 198, 252, 122, 35, 213, 132, 26, 104, 100, 182, + 51, 7, 216, 23, 99, 228, 3, 20, 96, 85, 207, 133, 145, 237, 236, 134, 232, 236, 168, 18, 15, + 61, 175, 100, 149, 216, 217, 15, 113, 160, 181, 160, 178, 243, 239, 6, 20, 12, 167, 158, 76, + 11, 222, 91, 254, 188, 141, 156, 46, 9, 131, 229, 8, 38, 150, 152, 235, 103, 137, 115, 111, + 244, 223, 41, 87, 249, 21, 54, 100, 240, 148, 249, 65, 31, 53, 214, 82, 73, 18, 156, 157, + 60, 219, 114, 245, 234, 68, 85, 180, 23, 173, 247, 104, 225, 197, 82, 222, 239, 208, 194, + 68, 60, 40, 174, 101, 63, 43, 177, 121, 107, 190, 106, 49, 32, 36, 26, 199, 149, 243, 90, + 92, 81, 105, 147, 118, 97, 116, 89, 94, 219, 77, 181, 9, 26, 61, 220, 72, 229, 117, 28, 224, + 212, 244, 79, 160, 91, 223, 188, 172, 177, 87, 228, 253, 36, 214, 40, 146, 140, 202, 91, 92, + 11, 62, 142, 76, 203, 55, 205, 88, 223, 28, 102, 8, 71, 230, 1, 165, 221, 233, 195, 78, 190, + 250, 171, 22, 182, 55, 58, 221, 119, 115, 153, 178, 200, 42, 102, 179, 22, 215, 120, 170, + 61, 207, 186, 159, 12, 27, 178, 19, 161, 194, 95, 207, 146, 121, 86, 193, 137, 101, 247, + 139, 61, 212, 107, 148, 5, 172, 182, 149, 248, 248, 105, 171, 161, 169, 69, 189, 0, 229, 42, + 223, 79, 97, 122, 119, 27, 74, 200, 187, 192, 189, 226, 135, 47, 205, 177, 170, 228, 47, + 236, 245, 225, 215, 139, 90, 38, 85, 38, 10, 67, 90, 27, 181, 103, 58, 50, 50, 214, 31, 72, + 85, 55, 244, 238, 145, 247, 211, 94, 211, 223, 7, 210, 36, 207, 73, 28, 158, 97, 82, 94, 91, + 119, 97, 250, 214, 182, 119, 117, 36, 168, 63, 0, 252, 222, 217, 31, 38, 73, 111, 94, 59, + 80, 175, 148, 188, 11, 105, 61, 178, 192, 203, 132, 81, 101, 150, 134, 184, 168, 31, 79, 56, + 168, 115, 217, 236, 207, 14, 218, 156, 80, 112, 254, 248, 59, 96, 184, 87, 14, 220, 246, 45, + 219, 175, 139, 241, 170, 149, 27, 156, 183, 86, 187, 170, 181, 37, 173, 253, 104, 245, 246, + 8, 243, 39, 11, 214, 61, 160, 112, 174, 102, 39, 21, 4, 145, 15, 200, 8, 110, 242, 139, 255, + 133, 40, 122, 115, 179, 109, 79, 183, 15, 249, 212, 224, 22, 64, 81, 62, 134, 60, 101, 139, + 63, 63, 149, 178, 7, 245, 228, 38, 200, 166, 197, 102, 212, 3, 27, 248, 251, 110, 30, 216, + 94, 244, 174, 77, 138, 107, 85, 0, 236, 124, 120, 218, 31, 158, 157, 158, 10, 121, 163, 43, + 172, 101, 121, 92, 96, 168, 245, 160, 219, 224, 161, 155, 87, 0, 92, 22, 155, 186, 183, 41, + 29, 138, 132, 92, 180, 218, 231, 230, 100, 205, 91, 101, 7, 222, 185, 178, 52, 38, 79, 171, + 238, 161, 152, 236, 174, 195, 51, 167, 191, 193, 37, 169, 88, 95, 208, 123, 232, 241, 128, + 39, 64, 185, 130, 250, 231, 231, 15, 6, 217, 7, 221, 200, 250, 56, 24, 26, 102, 149, 17, + 228, 85, 51, 220, 95, 5, 44, 10, 246, 183, 204, 5, 24, 168, 3, 33, 30, 47, 7, 30, 232, 30, + 60, 63, 196, 126, 18, 196, 145, 253, 43, 50, 98, 38, 9, 103, 191, 82, 38, 183, 59, 151, 227, + 229, 13, 149, 48, 205, 29, 217, 149, 35, 81, 16, 49, 91, 247, 75, 104, 127, 188, 158, 170, + 144, 120, 187, 66, 115, 226, 135, 163, 60, 191, 6, 79, 179, 239, 138, 18, 236, 194, 48, 120, + 10, 77, 143, 140, 245, 88, 84, 220, 244, 16, 179, 51, 218, 15, 145, 194, 209, 81, 24, 7, 85, + 62, 201, 52, 38, 131, 126, 64, 95, 0, 28, 68, 152, 75, 111, 244, 189, 243, 188, 242, 157, 1, + 71, 185, 25, 184, 220, 219, 70, 222, 194, 27, 72, 197, 191, 63, 39, 157, 109, 156, 142, 221, + 209, 42, 167, 197, 106, 97, 109, 165, 233, 11, 251, 38, 178, 80, 226, 246, 10, 53, 107, 134, + 186, 218, 188, 167, 237, 178, 73, 235, 8, 89, 154, 203, 157, 200, 71, 177, 163, 246, 121, + 89, 234, 217, 172, 54, 89, 248, 222, 96, 54, 231, 38, 60, 16, 177, 150, 151, 248, 22, 85, + 52, 24, 108, 165, 66, 211, 84, 95, 153, 211, 180, 27, 122, 175, 107, 43, 243, 149, 171, 248, + 1, 205, 195, 123, 150, 113, 79, 54, 55, 239, 59, 248, 97, 42, 146, 245, 36, 65, 99, 237, 90, + 85, 200, 160, 87, 51, 243, 160, 22, 127, 99, 174, 154, 185, 144, 132, 47, 46, 92, 197, 238, + 52, 63, 63, 156, 224, 33, 229, 118, 20, 59, 155, 234, 159, 159, 63, 120, 35, 234, 107, 72, + 100, 2, 172, 36, 39, 123, 218, 243, 95, 182, 171, 36, 75, 98, 20, 135, 238, 235, 20, 113, + 129, 200, 135, 177, 153, 206, 83, 235, 188, 255, 182, 249, 131, 0, 103, 215, 38, 158, 20, + 198, 24, 132, 248, 131, 154, 231, 209, 70, 235, 125, 244, 78, 5, 4, 9, 229, 83, 57, 198, 18, + 152, 250, 143, 128, 135, 180, 217, 217, 131, 71, 3, 119, 95, 13, 210, 78, 151, 184, 126, + 101, 91, 101, 122, 38, 227, 105, 87, 175, 27, 138, 215, 188, 175, 124, 209, 104, 227, 97, + 162, 231, 70, 137, 141, 110, 29, 135, 42, 88, 127, 31, 103, 234, 126, 173, 65, 53, 65, 208, + 21, 142, 38, 64, 223, 111, 190, 203, 137, 146, 15, 180, 57, 88, 236, 154, 229, 62, 18, 11, + 40, 196, 118, 173, 202, 158, 45, 174, 196, 132, 97, 16, 45, 119, 32, 211, 14, 149, 98, 185, + 181, 53, 76, 53, 119, 28, 67, 111, 152, 39, 205, 234, 167, 133, 246, 176, 95, 255, 157, 208, + 165, 61, 139, 43, 198, 79, 46, 158, 102, 238, 105, 172, 233, 231, 176, 21, 119, 208, 225, + 87, 128, 211, 231, 161, 31, 146, 101, 184, 182, 148, 92, 118, 137, 186, 176, 118, 134, 75, + 156, 73, 108, 2, 227, 160, 54, 135, 49, 182, 183, 119, 66, 133, 122, 62, 107, 121, 207, 94, + 37, 39, 242, 197, 97, 85, 146, 177, 85, 235, 88, 24, 50, 58, 215, 35, 225, 184, 203, 98, + 153, 174, 180, 237, 99, 57, 206, 203, 184, 206, 75, 139, 43, 39, 88, 223, 105, 224, 68, 161, + 48, 120, 40, 188, 151, 163, 240, 253, 192, 109, 33, 238, 246, 101, 40, 110, 52, 209, 182, + 143, 186, 99, 133, 253, 231, 130, 207, 236, 38, 187, 23, 26, 169, 81, 79, 29, 240, 200, 230, + 190, 22, 114, 38, 94, 245, 45, 79, 90, 122, 209, 178, 143, 28, 95, 233, 244, 48, 105, 95, + 185, 6, 234, 17, 140, 183, 237, 111, 178, 206, 235, 111, 150, 108, 154, 30, 217, 89, 147, + 131, 179, 210, 23, 59, 212, 105, 58, 108, 215, 228, 161, 76, 59, 52, 115, 224, 134, 119, + 242, 111, 232, 237, 10, 123, 26, 146, 117, 149, 237, 216, 2, 55, 57, 113, 88, 21, 111, 1, + 248, 16, 125, 149, 119, 213, 122, 80, 19, 205, 226, 22, 189, 202, 45, 86, 49, 106, 229, 162, + 240, 176, 33, 25, 210, 141, 108, 140, 70, 11, 74, 98, 184, 149, 79, 4, 11, 112, 109, 36, + 107, 124, 77, 89, 29, 193, 33, 59, 143, 181, 53, 247, 201, 173, 122, 55, 195, 247, 165, 145, + 101, 124, 222, 155, 120, 103, 209, 127, 60, 157, 236, 246, 3, 174, 54, 122, 138, 71, 254, + 175, 161, 183, 44, 171, 1, 125, 110, 149, 135, 70, 171, 47, 73, 48, 118, 32, 8, 214, 127, + 68, 255, 14, 175, 26, 97, 9, 220, 245, 116, 1, 193, 141, 13, 29, 231, 213, 200, 2, 146, 46, + 89, 21, 27, 75, 174, 113, 181, 103, 108, 34, 114, 249, 116, 147, 206, 212, 108, 30, 223, + 171, 8, 167, 249, 83, 143, 161, 32, 29, 55, 218, 176, 60, 100, 29, 206, 132, 3, 143, 103, + 211, 242, 201, 184, 166, 107, 121, 199, 110, 143, 145, 197, 245, 157, 124, 245, 119, 21, 59, + 241, 146, 33, 56, 100, 108, 127, 223, 105, 92, 20, 66, 206, 122, 18, 250, 70, 40, 71, 76, + 15, 50, 73, 54, 1, 59, 161, 55, 165, 76, 210, 179, 224, 160, 200, 218, 85, 94, 67, 143, 92, + 60, 129, 4, 149, 190, 36, 80, 4, 246, 28, 138, 131, 215, 114, 118, 210, 248, 26, 110, 197, + 176, 198, 53, 39, 14, 221, 152, 63, 187, 219, 137, 251, 240, 209, 52, 213, 141, 184, 211, + 80, 6, 41, 122, 128, 29, 2, 43, 214, 162, 151, 110, 230, 173, 133, 134, 76, 63, 35, 149, + 157, 212, 80, 144, 123, 22, 41, 237, 216, 225, 43, 147, 46, 228, 62, 244, 241, 178, 55, 113, + 174, 11, 235, 238, 80, 127, 208, 67, 19, 80, 127, 255, 97, 163, 35, 155, 26, 96, 198, 221, + 206, 3, 188, 148, 100, 81, 106, 22, 63, 220, 97, 82, 200, 15, 53, 196, 214, 17, 46, 182, + 153, 25, 72, 18, 238, 44, 84, 186, 185, 85, 74, 25, 3, 91, 90, 130, 126, 64, 245, 80, 232, + 221, 159, 97, 93, 193, 4, 227, 44, 147, 111, 44, 175, 143, 178, 147, 182, 71, 29, 201, 188, + 37, 22, 178, 15, 72, 184, 94, 91, 17, 119, 54, 189, 151, 48, 66, 207, 220, 253, 21, 175, 79, + 250, 73, 182, 239, 232, 109, 189, 211, 32, 111, 49, 157, 170, 213, 112, 69, 61, 119, 131, + 243, 235, 63, 79, 168, 62, 140, 122, 66, 20, 126, 250, 18, 132, 104, 131, 102, 231, 81, 117, + 214, 2, 88, 166, 253, 179, 147, 113, 151, 149, 73, 94, 97, 40, 89, 192, 162, 180, 201, 223, + 76, 12, 62, 67, 140, 42, 235, 111, 235, 58, 96, 238, 188, 202, 138, 139, 166, 218, 89, 39, + 219, 51, 187, 102, 66, 31, 217, 96, 84, 177, 139, 146, 244, 104, 94, 43, 34, 15, 226, 222, + 119, 60, 138, 118, 123, 164, 195, 22, 98, 14, 68, 226, 184, 12, 183, 147, 190, 244, 172, 26, + 55, 170, 133, 144, 67, 51, 179, 26, 106, 170, 43, 207, 172, 165, 85, 241, 193, 182, 90, 167, + 49, 164, 131, 227, 160, 90, 117, 161, 159, 165, 95, 42, 111, 17, 133, 211, 103, 249, 154, + 121, 123, 194, 158, 60, 103, 214, 186, 117, 101, 246, 178, 37, 65, 189, 180, 9, 196, 239, + 236, 208, 149, 178, 13, 51, 243, 82, 27, 146, 39, 116, 183, 135, 22, 23, 186, 113, 104, 237, + 123, 100, 211, 118, 107, 55, 108, 37, 247, 216, 60, 134, 249, 180, 183, 221, 21, 127, 82, + 206, 251, 247, 185, 172, 10, 45, 91, 130, 254, 229, 190, 155, 7, 39, 223, 38, 212, 113, 237, + 180, 200, 116, 8, 114, 108, 21, 143, 37, 139, 141, 13, 86, 134, 141, 181, 202, 169, 247, + 110, 47, 59, 11, 98, 82, 195, 211, 199, 200, 49, 255, 124, 103, 28, 74, 94, 178, 86, 92, + 144, 62, 209, 41, 203, 131, 248, 233, 253, 104, 244, 145, 7, 85, 72, 160, 155, 211, 150, 44, + 15, 62, 184, 185, 177, 181, 70, 74, 100, 100, 197, 162, 187, 69, 161, 179, 61, 67, 94, 62, + 132, 210, 34, 122, 233, 182, 215, 93, 250, 124, 0, 35, 179, 226, 121, 106, 35, 54, 140, 91, + 16, 102, 20, 23, 106, 225, 109, 238, 159, 19, 123, 77, 167, 132, 187, 217, 3, 98, 83, 54, + 127, 162, 228, 10, 58, 77, 210, 97, 153, 2, 232, 123, 81, 243, 201, 218, 241, 35, 212, 58, + 115, 40, 81, 38, 56, 228, 193, 87, 188, 96, 112, 56, 107, 58, 107, 71, 211, 167, 105, 76, + 189, 60, 213, 169, 249, 15, 29, 128, 54, 10, 90, 198, 194, 206, 69, 122, 209, 112, 123, 9, + 250, 244, 119, 103, 105, 249, 192, 68, 221, 167, 100, 198, 54, 151, 76, 110, 123, 212, 20, + 154, 152, 113, 15, 133, 69, 197, 135, 213, 72, 130, 95, 82, 142, 58, 165, 139, 138, 126, 73, + 231, 204, 91, 168, 87, 50, 187, 230, 149, 172, 233, 252, 236, 134, 11, 188, 229, 15, 51, + 215, 119, 147, 64, 215, 182, 149, 170, 167, 118, 252, 236, 97, 179, 126, 121, 102, 0, 43, + 203, 34, 44, 100, 199, 53, 54, 161, 180, 248, 75, 141, 75, 56, 67, 137, 156, 140, 79, 178, + 78, 243, 74, 180, 35, 193, 139, 183, 229, 200, 133, 251, 181, 86, 83, 184, 133, 170, 118, + 46, 29, 241, 237, 59, 196, 39, 146, 51, 154, 172, 235, 21, 190, 46, 99, 9, 171, 119, 125, + 30, 2, 19, 204, 92, 157, 241, 244, 152, 110, 253, 217, 158, 186, 231, 181, 42, 1, 4, 36, + 134, 23, 169, 252, 137, 216, 88, 59, 95, 206, 129, 180, 15, 177, 239, 140, 201, 240, 131, + 139, 74, 38, 255, 155, 109, 72, 48, 206, 166, 139, 35, 137, 48, 239, 240, 50, 88, 171, 204, + 137, 223, 203, 184, 212, 70, 163, 76, 106, 229, 198, 38, 235, 206, 38, 229, 246, 193, 100, + 255, 23, 199, 238, 243, 79, 94, 53, 190, 232, 34, 133, 85, 243, 108, 47, 163, 34, 111, 16, + 204, 130, 191, 162, 182, 67, 53, 48, 215, 245, 120, 152, 22, 35, 198, 26, 67, 95, 161, 160, + 244, 247, 196, 85, 254, 187, 174, 1, 245, 41, 123, 196, 164, 182, 57, 35, 139, 130, 255, + 117, 123, 249, 247, 101, 11, 53, 32, 234, 0, 145, 248, 27, 141, 55, 209, 51, 70, 80, 246, + 73, 109, 210, 189, 169, 252, 23, 207, 151, 39, 148, 232, 66, 89, 195, 7, 183, 140, 143, 9, + 109, 137, 32, 40, 6, 72, 156, 120, 17, 130, 82, 236, 253, 254, 24, 135, 230, 155, 25, 15, + 158, 163, 66, 73, 247, 128, 197, 75, 81, 234, 47, 238, 183, 186, 86, 56, 82, 202, 194, 229, + 36, 17, 109, 0, 79, 225, 81, 120, 197, 210, 143, 31, 221, 107, 153, 4, 239, 11, 253, 41, 58, + 201, 168, 194, 158, 96, 1, 3, 64, 7, 166, 145, 23, 15, 198, 118, 141, 194, 27, 89, 168, 128, + 235, 29, 197, 176, 194, 247, 218, 4, 141, 9, 194, 241, 140, 23, 104, 198, 147, 204, 2, 164, + 64, 175, 189, 254, 149, 230, 207, 9, 139, 103, 12, 200, 148, 170, 73, 252, 253, 69, 198, + 157, 222, 80, 49, 15, 171, 9, 158, 153, 105, 130, 18, 166, 58, 26, 241, 17, 13, 254, 178, + 252, 3, 63, 51, 108, 110, 14, 63, 233, 60, 253, 187, 146, 43, 118, 100, 161, 45, 61, 245, + 147, 66, 181, 71, 179, 228, 5, 252, 71, 34, 47, 245, 5, 138, 108, 129, 65, 1, 17, 247, 236, + 139, 122, 242, 196, 193, 9, 217, 20, 95, 68, 42, 173, 29, 102, 75, 147, 72, 11, 36, 32, 192, + 25, 47, 149, 16, 79, 38, 30, 65, 66, 237, 118, 75, 214, 74, 119, 117, 166, 43, 149, 136, + 175, 103, 65, 205, 73, 55, 113, 175, 217, 150, 206, 2, 50, 249, 239, 80, 126, 169, 19, 78, + 91, 240, 208, 29, 180, 59, 136, 185, 1, 231, 43, 131, 148, 104, 4, 184, 76, 126, 202, 31, + 168, 148, 205, 52, 143, 57, 117, 146, 239, 12, 23, 17, 43, 142, 6, 125, 38, 29, 125, 220, + 132, 211, 38, 81, 17, 193, 71, 20, 107, 123, 164, 23, 178, 230, 46, 46, 132, 103, 220, 162, + 27, 241, 181, 141, 47, 92, 22, 111, 10, 102, 173, 190, 53, 136, 31, 15, 234, 183, 161, 60, + 163, 173, 110, 211, 250, 170, 19, 235, 38, 37, 164, 143, 252, 242, 118, 119, 175, 5, 32, + 215, 102, 108, 72, 230, 168, 110, 104, 171, 72, 218, 240, 145, 204, 144, 162, 123, 130, 74, + 145, 196, 69, 167, 21, 44, 134, 0, 86, 168, 241, 40, 156, 138, 252, 132, 142, 175, 0, 146, + 253, 55, 209, 177, 120, 231, 86, 89, 143, 52, 22, 201, 166, 246, 35, 90, 20, 244, 250, 55, + 162, 26, 16, 125, 69, 93, 18, 138, 174, 202, 39, 204, 249, 4, 220, 95, 248, 218, 195, 54, + 143, 216, 164, 176, 171, 130, 50, 217, 255, 228, 68, 174, 250, 253, 147, 119, 86, 250, 155, + 103, 153, 111, 75, 188, 25, 183, 44, 71, 52, 143, 243, 155, 111, 108, 176, 131, 180, 191, + 185, 80, 91, 191, 18, 58, 44, 165, 9, 143, 192, 43, 72, 24, 43, 124, 56, 221, 231, 127, 2, + 12, 0, 172, 88, 231, 135, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, + 100, 111, 98, 106, 13, 51, 53, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, + 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, + 116, 104, 32, 52, 53, 49, 49, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 148, 87, + 59, 150, 44, 185, 10, 244, 123, 21, 181, 129, 204, 163, 255, 103, 61, 229, 92, 167, 247, + 239, 62, 34, 2, 41, 149, 119, 102, 140, 231, 116, 67, 137, 148, 16, 130, 32, 24, 119, 10, + 245, 115, 165, 114, 207, 82, 63, 253, 158, 83, 90, 28, 166, 140, 105, 114, 190, 91, 170, + 159, 239, 143, 169, 166, 165, 187, 181, 250, 25, 119, 168, 176, 139, 119, 136, 127, 107, + 223, 159, 113, 167, 12, 61, 220, 35, 217, 98, 30, 174, 4, 152, 214, 32, 109, 86, 152, 254, + 249, 169, 55, 190, 141, 229, 30, 182, 239, 239, 91, 173, 119, 207, 84, 106, 50, 121, 104, + 161, 23, 124, 88, 239, 217, 169, 206, 1, 59, 42, 245, 14, 243, 211, 238, 216, 42, 149, 156, + 205, 174, 225, 31, 180, 218, 109, 105, 20, 202, 179, 215, 183, 2, 187, 67, 237, 119, 192, 5, + 98, 187, 43, 54, 156, 81, 138, 133, 131, 134, 209, 180, 126, 71, 44, 53, 46, 245, 187, 230, + 250, 151, 6, 203, 247, 106, 234, 84, 114, 129, 156, 180, 18, 229, 163, 69, 219, 15, 88, 238, + 219, 199, 252, 232, 212, 104, 121, 232, 245, 46, 121, 251, 108, 10, 229, 62, 24, 157, 215, + 202, 43, 164, 135, 130, 248, 183, 187, 112, 203, 108, 78, 224, 1, 236, 206, 201, 245, 10, 7, + 122, 162, 146, 243, 161, 180, 68, 95, 92, 27, 138, 216, 212, 190, 41, 153, 146, 7, 229, 82, + 148, 56, 45, 107, 173, 117, 100, 88, 210, 249, 25, 95, 13, 185, 153, 134, 12, 187, 158, 177, + 115, 173, 118, 189, 227, 124, 201, 48, 123, 52, 127, 13, 127, 94, 197, 219, 182, 43, 244, + 175, 232, 164, 137, 128, 71, 121, 212, 99, 125, 43, 79, 76, 203, 157, 177, 71, 116, 95, 67, + 162, 165, 95, 120, 200, 112, 107, 150, 86, 93, 81, 74, 249, 243, 14, 33, 130, 218, 237, 234, + 124, 95, 134, 180, 227, 11, 104, 150, 205, 246, 103, 212, 181, 228, 193, 176, 122, 137, 44, + 155, 192, 200, 143, 187, 33, 50, 93, 242, 156, 111, 229, 187, 182, 155, 76, 82, 59, 137, + 251, 153, 214, 160, 165, 73, 37, 70, 26, 62, 90, 135, 163, 56, 22, 117, 119, 186, 7, 119, + 39, 31, 192, 29, 249, 125, 171, 83, 17, 30, 38, 244, 166, 95, 51, 159, 117, 234, 253, 205, + 219, 105, 107, 10, 253, 184, 135, 125, 249, 214, 96, 249, 94, 77, 133, 94, 229, 6, 37, 20, + 185, 159, 26, 67, 224, 151, 137, 197, 160, 98, 186, 23, 72, 135, 183, 134, 61, 67, 163, 90, + 43, 118, 137, 203, 53, 248, 114, 120, 175, 12, 111, 118, 245, 140, 116, 96, 122, 23, 40, + 176, 49, 217, 174, 86, 24, 57, 79, 30, 203, 217, 164, 164, 176, 58, 50, 173, 246, 21, 173, + 106, 81, 135, 140, 66, 48, 101, 12, 6, 24, 43, 202, 5, 123, 21, 84, 128, 125, 72, 152, 179, + 194, 190, 84, 230, 196, 67, 174, 132, 94, 23, 28, 90, 238, 166, 141, 134, 150, 240, 93, 118, + 135, 58, 88, 33, 230, 194, 228, 237, 115, 162, 98, 5, 226, 72, 92, 128, 77, 86, 10, 184, + 204, 60, 37, 22, 200, 254, 181, 240, 182, 149, 174, 167, 194, 223, 91, 166, 77, 24, 12, 10, + 114, 121, 199, 231, 16, 21, 57, 43, 171, 11, 229, 201, 200, 181, 6, 5, 69, 221, 148, 11, 86, + 118, 115, 33, 233, 186, 132, 105, 157, 151, 69, 93, 224, 189, 47, 34, 159, 163, 168, 208, 5, + 199, 71, 70, 174, 193, 199, 172, 192, 13, 102, 38, 177, 66, 0, 188, 82, 189, 123, 166, 79, + 202, 141, 114, 79, 52, 27, 186, 139, 133, 226, 26, 236, 100, 186, 151, 37, 101, 92, 40, 174, + 168, 242, 198, 143, 170, 139, 142, 187, 108, 41, 8, 51, 160, 216, 25, 43, 57, 228, 220, 41, + 19, 88, 2, 15, 103, 233, 231, 40, 127, 137, 240, 145, 247, 24, 14, 43, 121, 231, 131, 41, + 65, 183, 199, 129, 129, 185, 145, 231, 198, 148, 202, 22, 235, 70, 22, 97, 130, 212, 14, + 189, 94, 34, 208, 177, 226, 24, 29, 21, 37, 250, 153, 234, 10, 133, 154, 157, 154, 248, 246, + 147, 217, 215, 240, 208, 184, 47, 32, 19, 21, 48, 188, 143, 250, 75, 178, 240, 26, 57, 128, + 201, 194, 136, 104, 14, 176, 204, 16, 187, 156, 160, 20, 130, 59, 69, 166, 124, 34, 46, 133, + 219, 3, 172, 149, 201, 158, 153, 185, 144, 54, 42, 7, 150, 217, 106, 200, 147, 175, 189, + 100, 70, 133, 129, 52, 84, 160, 77, 90, 103, 139, 2, 200, 91, 133, 201, 148, 92, 69, 1, 140, + 22, 248, 109, 101, 214, 189, 45, 62, 50, 172, 6, 195, 99, 41, 162, 162, 131, 204, 20, 126, + 34, 42, 30, 146, 20, 45, 156, 244, 251, 83, 196, 132, 44, 145, 10, 54, 108, 116, 135, 62, + 12, 186, 89, 154, 54, 167, 159, 157, 141, 117, 70, 93, 51, 80, 25, 186, 116, 90, 61, 38, 72, + 47, 113, 93, 21, 10, 234, 162, 248, 138, 71, 167, 106, 151, 166, 36, 157, 84, 70, 121, 216, + 69, 244, 219, 187, 101, 180, 239, 234, 222, 37, 146, 100, 189, 181, 205, 47, 34, 64, 107, + 121, 230, 10, 46, 182, 237, 42, 170, 134, 39, 244, 197, 45, 192, 211, 76, 78, 77, 62, 214, + 40, 187, 83, 183, 72, 133, 157, 5, 5, 208, 52, 225, 247, 215, 66, 216, 24, 42, 228, 170, 33, + 23, 178, 20, 111, 112, 132, 25, 113, 47, 36, 148, 30, 141, 223, 183, 90, 111, 15, 6, 232, + 95, 108, 242, 39, 201, 131, 68, 79, 19, 86, 114, 215, 37, 248, 10, 135, 178, 82, 36, 38, 18, + 83, 62, 150, 201, 17, 23, 31, 60, 37, 137, 36, 190, 84, 37, 134, 201, 93, 15, 153, 180, 50, + 243, 78, 38, 52, 250, 238, 219, 101, 32, 236, 33, 122, 78, 172, 223, 131, 142, 68, 182, 88, + 156, 252, 16, 177, 29, 80, 48, 249, 147, 16, 182, 168, 181, 72, 75, 197, 32, 209, 202, 95, + 11, 70, 18, 235, 75, 132, 9, 187, 121, 100, 143, 48, 22, 227, 111, 31, 59, 52, 98, 62, 194, + 54, 117, 102, 154, 43, 162, 246, 89, 221, 57, 249, 10, 187, 63, 203, 172, 219, 119, 240, + 242, 232, 30, 14, 92, 61, 87, 197, 33, 35, 150, 213, 217, 207, 232, 30, 115, 231, 83, 129, + 105, 212, 22, 45, 220, 114, 121, 101, 81, 225, 255, 202, 30, 137, 143, 118, 216, 178, 222, + 122, 229, 87, 166, 139, 203, 209, 204, 194, 85, 28, 72, 194, 96, 200, 222, 140, 183, 98, 90, + 86, 119, 216, 218, 214, 251, 54, 184, 159, 58, 116, 66, 21, 252, 66, 65, 152, 168, 13, 6, + 238, 194, 38, 135, 236, 77, 139, 195, 145, 104, 172, 40, 25, 92, 92, 252, 246, 158, 50, 74, + 60, 151, 21, 108, 32, 202, 107, 221, 99, 207, 20, 124, 105, 118, 163, 68, 13, 9, 55, 125, + 47, 214, 46, 145, 147, 185, 130, 202, 157, 244, 50, 196, 207, 22, 83, 125, 228, 46, 27, 57, + 95, 192, 46, 121, 120, 38, 213, 120, 41, 132, 231, 177, 152, 143, 32, 16, 196, 32, 46, 226, + 146, 65, 231, 216, 113, 183, 70, 158, 145, 25, 77, 53, 223, 236, 195, 146, 8, 141, 86, 150, + 60, 210, 35, 207, 53, 6, 106, 171, 129, 72, 102, 18, 17, 3, 6, 103, 64, 34, 37, 135, 85, + 110, 31, 181, 112, 147, 99, 250, 28, 15, 228, 99, 10, 7, 71, 251, 138, 13, 48, 247, 165, + 109, 185, 197, 151, 252, 253, 121, 175, 160, 57, 243, 189, 214, 244, 117, 143, 221, 106, 34, + 179, 170, 193, 135, 43, 220, 121, 75, 209, 241, 19, 128, 29, 8, 100, 13, 77, 41, 144, 132, + 178, 207, 4, 81, 174, 202, 226, 139, 140, 56, 6, 11, 136, 237, 144, 144, 157, 207, 175, 224, + 17, 145, 252, 151, 44, 46, 226, 15, 1, 193, 68, 99, 120, 234, 61, 240, 239, 145, 190, 63, + 143, 44, 170, 165, 124, 33, 19, 77, 187, 35, 206, 110, 202, 224, 239, 241, 147, 137, 38, + 143, 4, 131, 37, 23, 12, 155, 153, 23, 43, 8, 74, 6, 223, 224, 33, 182, 152, 217, 157, 173, + 94, 59, 228, 18, 222, 50, 199, 203, 173, 137, 214, 218, 166, 211, 251, 57, 95, 143, 84, 42, + 226, 247, 192, 222, 133, 188, 73, 206, 188, 44, 179, 18, 31, 250, 235, 195, 231, 202, 252, + 138, 0, 245, 250, 18, 189, 209, 173, 223, 27, 162, 213, 139, 230, 190, 199, 2, 148, 11, 152, + 239, 252, 92, 245, 134, 20, 79, 232, 7, 43, 171, 233, 25, 9, 98, 22, 125, 65, 69, 2, 182, + 246, 30, 69, 60, 78, 248, 1, 114, 163, 226, 42, 122, 66, 125, 160, 5, 85, 182, 208, 182, + 251, 179, 103, 231, 172, 177, 239, 133, 249, 28, 11, 209, 154, 10, 83, 62, 34, 2, 139, 198, + 70, 2, 49, 1, 33, 242, 179, 39, 46, 113, 172, 110, 174, 212, 34, 141, 139, 164, 24, 95, 141, + 50, 129, 228, 67, 44, 110, 201, 8, 118, 0, 236, 45, 52, 10, 156, 146, 8, 0, 6, 240, 156, + 104, 18, 126, 77, 85, 14, 27, 230, 7, 62, 148, 143, 55, 129, 253, 146, 28, 93, 191, 59, 97, + 15, 254, 154, 246, 10, 171, 26, 90, 222, 38, 230, 156, 253, 20, 62, 226, 248, 23, 79, 114, + 108, 179, 42, 57, 161, 81, 163, 106, 81, 21, 38, 30, 85, 5, 129, 201, 15, 19, 92, 123, 164, + 39, 145, 146, 99, 80, 208, 55, 85, 195, 98, 96, 23, 98, 16, 45, 166, 147, 53, 13, 20, 41, + 11, 77, 97, 84, 242, 210, 6, 103, 23, 24, 113, 190, 98, 55, 194, 7, 156, 59, 199, 194, 236, + 193, 65, 15, 7, 78, 40, 100, 72, 214, 252, 182, 85, 16, 158, 129, 191, 224, 142, 52, 194, + 24, 4, 224, 104, 27, 208, 64, 119, 97, 133, 240, 68, 238, 106, 253, 100, 1, 202, 228, 127, + 144, 195, 207, 20, 158, 248, 20, 203, 95, 71, 145, 9, 30, 61, 112, 251, 89, 60, 73, 232, + 129, 220, 164, 59, 76, 140, 137, 79, 241, 96, 108, 8, 135, 136, 93, 206, 223, 39, 202, 161, + 124, 240, 175, 56, 142, 15, 38, 101, 75, 238, 96, 34, 245, 167, 233, 106, 27, 147, 89, 146, + 229, 107, 165, 136, 44, 155, 14, 29, 44, 140, 137, 213, 194, 142, 172, 75, 168, 22, 116, 58, + 129, 143, 174, 76, 65, 205, 16, 245, 108, 136, 226, 168, 146, 214, 109, 42, 154, 171, 133, + 109, 10, 93, 23, 239, 239, 238, 238, 163, 49, 180, 228, 175, 143, 68, 11, 202, 115, 253, 58, + 210, 150, 114, 125, 12, 70, 222, 59, 128, 249, 29, 226, 99, 162, 223, 255, 33, 193, 64, 140, + 91, 13, 178, 177, 23, 244, 85, 170, 105, 119, 228, 198, 78, 203, 1, 143, 127, 136, 212, 154, + 220, 72, 181, 193, 253, 195, 116, 114, 173, 75, 85, 167, 73, 115, 211, 163, 250, 144, 163, + 194, 130, 41, 120, 238, 130, 73, 139, 45, 165, 186, 82, 216, 44, 106, 126, 4, 246, 19, 241, + 160, 230, 172, 169, 144, 168, 20, 103, 237, 110, 99, 101, 93, 192, 159, 68, 7, 51, 107, 55, + 179, 146, 173, 59, 176, 26, 51, 251, 101, 102, 30, 36, 142, 15, 217, 211, 170, 35, 149, 24, + 120, 118, 98, 202, 76, 49, 151, 162, 172, 184, 203, 214, 216, 186, 26, 172, 43, 251, 89, + 101, 107, 136, 164, 12, 145, 57, 36, 92, 95, 114, 58, 36, 88, 36, 110, 64, 52, 202, 236, + 209, 9, 197, 38, 148, 25, 228, 105, 91, 157, 196, 190, 208, 55, 232, 108, 37, 31, 118, 2, + 135, 0, 40, 187, 216, 127, 15, 17, 70, 199, 239, 78, 212, 170, 3, 181, 227, 26, 251, 183, + 201, 9, 23, 143, 58, 154, 114, 210, 145, 153, 215, 7, 235, 9, 196, 114, 76, 0, 16, 213, 250, + 210, 6, 244, 8, 90, 174, 234, 78, 200, 4, 76, 3, 135, 132, 77, 158, 95, 91, 89, 75, 189, + 187, 61, 12, 192, 84, 253, 119, 36, 57, 169, 99, 198, 49, 83, 79, 25, 129, 31, 234, 241, + 120, 93, 209, 209, 83, 134, 209, 185, 194, 134, 99, 29, 55, 171, 13, 11, 122, 68, 222, 16, + 136, 76, 4, 20, 88, 158, 50, 108, 94, 43, 20, 149, 85, 124, 192, 180, 114, 139, 79, 29, 153, + 123, 49, 252, 155, 76, 183, 213, 2, 219, 94, 200, 188, 66, 0, 29, 224, 196, 34, 162, 193, + 151, 192, 117, 145, 238, 2, 179, 69, 18, 78, 77, 57, 105, 55, 36, 67, 168, 195, 69, 24, 149, + 253, 115, 225, 62, 85, 9, 29, 49, 36, 241, 1, 134, 123, 229, 6, 129, 22, 149, 164, 35, 100, + 237, 209, 138, 63, 105, 186, 249, 230, 51, 190, 68, 152, 224, 109, 2, 89, 214, 146, 59, 145, + 120, 32, 153, 123, 112, 163, 165, 112, 228, 88, 185, 83, 250, 145, 84, 105, 55, 30, 37, 216, + 165, 86, 242, 82, 86, 242, 237, 181, 14, 177, 169, 126, 241, 99, 215, 105, 115, 155, 100, + 52, 31, 108, 91, 248, 94, 204, 103, 127, 8, 117, 61, 102, 70, 71, 18, 19, 212, 17, 4, 85, + 34, 167, 48, 85, 70, 18, 54, 81, 110, 139, 245, 94, 206, 75, 78, 173, 170, 171, 155, 76, + 116, 183, 132, 85, 143, 93, 108, 244, 82, 48, 217, 71, 188, 142, 79, 217, 169, 245, 94, 153, + 114, 6, 165, 90, 80, 181, 232, 222, 73, 102, 133, 26, 252, 35, 1, 116, 190, 113, 202, 184, + 226, 185, 162, 218, 31, 217, 141, 188, 204, 50, 201, 226, 165, 198, 153, 49, 1, 96, 20, 1, + 10, 27, 79, 184, 146, 183, 171, 178, 231, 47, 159, 4, 174, 197, 183, 31, 153, 40, 173, 81, + 44, 9, 221, 53, 0, 169, 113, 238, 113, 147, 161, 88, 74, 213, 148, 148, 212, 70, 129, 49, + 87, 118, 98, 97, 99, 136, 182, 70, 7, 51, 152, 184, 120, 3, 197, 52, 139, 88, 236, 35, 20, + 32, 128, 254, 85, 60, 116, 165, 64, 222, 209, 218, 90, 65, 246, 67, 30, 171, 181, 95, 92, + 230, 29, 11, 181, 54, 252, 246, 20, 21, 147, 66, 102, 134, 112, 81, 105, 217, 241, 228, 226, + 187, 8, 102, 46, 14, 34, 171, 126, 175, 10, 170, 162, 146, 48, 57, 146, 134, 100, 136, 197, + 31, 71, 90, 93, 147, 133, 201, 122, 3, 34, 121, 85, 172, 78, 237, 191, 228, 191, 173, 16, + 191, 189, 25, 231, 195, 74, 30, 184, 218, 159, 171, 255, 173, 252, 95, 134, 188, 68, 47, + 171, 211, 154, 50, 86, 182, 145, 20, 48, 197, 34, 20, 14, 84, 8, 166, 134, 89, 197, 88, 212, + 130, 209, 111, 208, 226, 80, 155, 191, 196, 108, 148, 96, 117, 37, 206, 80, 156, 10, 184, + 134, 69, 215, 196, 196, 233, 21, 51, 35, 2, 94, 196, 71, 146, 30, 131, 52, 196, 144, 7, 143, + 84, 76, 156, 74, 144, 50, 68, 241, 45, 151, 47, 242, 5, 205, 125, 23, 31, 84, 254, 92, 36, + 137, 107, 120, 177, 252, 156, 93, 140, 232, 34, 29, 208, 28, 115, 17, 111, 191, 63, 127, + 208, 67, 202, 202, 251, 223, 151, 166, 22, 1, 101, 172, 41, 243, 82, 160, 22, 2, 169, 255, + 100, 160, 199, 150, 245, 73, 245, 140, 27, 101, 125, 195, 236, 203, 228, 93, 135, 184, 34, + 188, 22, 64, 226, 46, 78, 106, 107, 215, 168, 74, 199, 155, 152, 194, 118, 83, 247, 45, 79, + 119, 117, 153, 32, 124, 176, 162, 251, 125, 105, 132, 91, 187, 180, 96, 220, 97, 195, 81, + 185, 113, 105, 112, 201, 72, 39, 66, 22, 213, 41, 36, 178, 107, 109, 141, 101, 237, 95, 159, + 50, 19, 74, 231, 213, 180, 226, 197, 193, 87, 193, 226, 168, 73, 163, 236, 8, 102, 247, 17, + 154, 164, 176, 107, 199, 41, 198, 31, 35, 60, 6, 236, 23, 137, 195, 239, 169, 168, 53, 200, + 46, 252, 143, 253, 106, 215, 141, 228, 6, 130, 249, 126, 197, 198, 7, 12, 64, 14, 223, 169, + 13, 195, 209, 5, 182, 3, 127, 192, 194, 186, 11, 214, 6, 172, 196, 191, 111, 118, 85, 53, + 103, 36, 173, 113, 6, 20, 40, 57, 8, 144, 166, 197, 25, 178, 217, 143, 170, 106, 161, 97, + 162, 66, 26, 73, 121, 37, 165, 233, 186, 196, 93, 161, 36, 180, 29, 193, 49, 73, 244, 109, + 96, 184, 40, 52, 4, 161, 113, 150, 83, 230, 161, 18, 137, 96, 128, 96, 67, 48, 237, 52, 176, + 48, 134, 180, 12, 209, 104, 186, 195, 26, 46, 131, 209, 85, 69, 131, 125, 71, 246, 234, 86, + 176, 40, 167, 143, 130, 234, 77, 178, 96, 35, 186, 51, 35, 201, 217, 49, 173, 116, 235, 24, + 134, 237, 133, 1, 66, 38, 28, 207, 219, 72, 10, 50, 131, 51, 130, 202, 163, 82, 127, 50, + 161, 45, 55, 74, 55, 232, 65, 11, 146, 116, 66, 192, 74, 118, 133, 167, 148, 237, 62, 212, + 118, 215, 27, 155, 11, 27, 176, 56, 135, 69, 22, 82, 228, 136, 134, 88, 27, 71, 250, 205, + 92, 161, 192, 127, 13, 184, 209, 176, 120, 147, 228, 110, 174, 116, 253, 201, 214, 193, 237, + 84, 129, 248, 102, 67, 250, 168, 107, 72, 148, 86, 15, 29, 95, 116, 8, 149, 206, 253, 7, 52, + 142, 215, 146, 213, 217, 15, 159, 46, 191, 204, 31, 163, 122, 43, 168, 10, 29, 191, 79, 47, + 159, 191, 92, 254, 190, 206, 77, 231, 207, 236, 134, 158, 13, 161, 106, 44, 16, 14, 179, 34, + 231, 191, 255, 188, 108, 156, 3, 194, 245, 110, 143, 5, 39, 25, 157, 220, 109, 93, 79, 95, + 47, 83, 6, 52, 187, 75, 175, 252, 164, 118, 26, 119, 25, 88, 62, 140, 138, 207, 220, 42, + 116, 28, 215, 155, 250, 74, 17, 14, 128, 130, 155, 189, 213, 57, 93, 96, 73, 162, 35, 100, + 23, 9, 38, 135, 44, 59, 150, 61, 138, 169, 137, 26, 247, 139, 146, 73, 211, 250, 164, 158, + 140, 74, 25, 180, 190, 131, 240, 154, 240, 138, 207, 2, 98, 106, 18, 115, 93, 121, 195, 192, + 0, 115, 95, 94, 240, 2, 44, 21, 55, 231, 149, 109, 135, 140, 223, 133, 153, 114, 63, 163, + 17, 7, 206, 235, 213, 21, 217, 252, 40, 1, 196, 3, 68, 10, 204, 98, 3, 87, 65, 171, 86, 197, + 138, 189, 57, 159, 81, 251, 214, 30, 77, 165, 0, 143, 7, 7, 158, 93, 86, 214, 110, 20, 46, + 212, 135, 155, 68, 110, 196, 196, 64, 0, 131, 142, 196, 39, 137, 241, 94, 119, 97, 236, 213, + 3, 24, 177, 240, 13, 202, 7, 8, 20, 147, 84, 178, 63, 147, 13, 220, 106, 85, 158, 197, 180, + 234, 96, 86, 23, 166, 148, 179, 133, 192, 220, 85, 61, 50, 190, 94, 158, 102, 177, 158, 235, + 178, 204, 162, 108, 230, 240, 81, 148, 248, 32, 172, 79, 165, 158, 144, 130, 216, 4, 50, + 110, 169, 116, 71, 42, 47, 30, 173, 212, 84, 196, 245, 225, 177, 13, 245, 244, 230, 104, + 134, 142, 215, 67, 16, 95, 239, 67, 143, 56, 131, 193, 213, 81, 221, 196, 233, 129, 74, 27, + 226, 142, 234, 119, 227, 148, 101, 104, 146, 245, 27, 117, 95, 216, 235, 254, 7, 136, 81, + 79, 207, 93, 175, 65, 21, 199, 120, 108, 180, 202, 125, 84, 231, 212, 27, 66, 69, 238, 205, + 10, 122, 194, 170, 146, 165, 74, 163, 66, 101, 96, 7, 229, 171, 218, 56, 80, 29, 52, 93, 35, + 113, 53, 121, 147, 215, 5, 179, 140, 113, 56, 252, 216, 57, 119, 236, 46, 167, 3, 27, 158, + 147, 224, 97, 243, 82, 227, 28, 143, 142, 16, 69, 225, 128, 70, 148, 35, 84, 1, 130, 45, 66, + 46, 211, 184, 41, 252, 48, 30, 100, 117, 4, 48, 102, 141, 25, 20, 116, 174, 168, 184, 102, + 43, 6, 7, 198, 80, 44, 192, 200, 1, 196, 46, 164, 157, 198, 240, 145, 135, 6, 147, 81, 143, + 165, 193, 153, 108, 215, 229, 81, 117, 28, 31, 20, 153, 64, 81, 74, 22, 194, 40, 166, 231, + 117, 105, 205, 184, 118, 193, 187, 160, 106, 90, 197, 219, 171, 21, 153, 228, 40, 126, 70, + 28, 154, 49, 220, 233, 82, 3, 221, 101, 6, 217, 242, 68, 216, 242, 231, 46, 207, 205, 18, + 93, 242, 155, 233, 114, 119, 122, 217, 77, 213, 226, 181, 121, 12, 156, 34, 86, 146, 191, + 155, 160, 43, 165, 87, 22, 69, 31, 171, 107, 188, 178, 214, 155, 51, 104, 233, 108, 37, 56, + 146, 221, 220, 77, 218, 237, 76, 186, 161, 68, 200, 206, 156, 189, 169, 48, 64, 163, 125, + 21, 142, 10, 2, 148, 194, 186, 37, 141, 92, 189, 23, 7, 98, 175, 209, 146, 24, 215, 23, 128, + 145, 35, 89, 168, 4, 214, 238, 69, 27, 160, 104, 206, 156, 212, 142, 14, 93, 150, 42, 130, + 66, 101, 99, 90, 181, 24, 136, 238, 1, 101, 148, 132, 205, 55, 160, 71, 233, 229, 97, 193, + 70, 96, 235, 71, 32, 224, 200, 128, 4, 40, 130, 23, 130, 160, 174, 125, 68, 100, 233, 132, + 1, 97, 33, 68, 103, 84, 186, 251, 165, 118, 232, 108, 135, 200, 213, 10, 240, 74, 108, 96, + 78, 30, 39, 130, 46, 26, 105, 24, 50, 61, 122, 103, 52, 11, 96, 20, 107, 215, 6, 110, 186, + 251, 215, 65, 34, 156, 109, 150, 234, 245, 4, 215, 204, 115, 92, 33, 144, 5, 73, 136, 202, + 141, 227, 181, 133, 94, 96, 176, 195, 107, 203, 223, 68, 56, 94, 24, 223, 14, 113, 65, 208, + 62, 40, 187, 61, 227, 100, 155, 100, 207, 71, 207, 192, 137, 223, 118, 222, 46, 156, 18, + 202, 127, 62, 218, 175, 153, 234, 124, 64, 151, 113, 109, 7, 109, 240, 128, 46, 201, 10, + 134, 199, 54, 7, 213, 124, 200, 149, 18, 93, 175, 3, 144, 167, 220, 71, 242, 41, 6, 57, 11, + 32, 70, 129, 34, 201, 192, 117, 35, 198, 190, 181, 118, 118, 35, 212, 80, 90, 48, 95, 118, + 55, 213, 169, 60, 131, 66, 125, 35, 42, 161, 225, 243, 33, 35, 137, 242, 11, 148, 10, 49, + 197, 97, 134, 38, 17, 54, 151, 51, 155, 9, 156, 195, 208, 155, 129, 14, 118, 48, 25, 89, + 171, 133, 69, 45, 52, 224, 51, 134, 72, 218, 247, 139, 195, 71, 147, 193, 87, 169, 218, 248, + 26, 70, 0, 125, 211, 35, 226, 181, 19, 16, 201, 35, 90, 116, 34, 225, 134, 244, 203, 121, + 16, 243, 203, 230, 122, 220, 253, 40, 237, 88, 105, 124, 45, 146, 134, 227, 49, 0, 233, 13, + 70, 204, 103, 151, 90, 142, 231, 33, 94, 98, 128, 37, 147, 3, 197, 39, 125, 110, 234, 214, + 155, 215, 255, 204, 3, 192, 115, 165, 196, 18, 217, 78, 249, 97, 69, 208, 92, 234, 181, 29, + 34, 181, 4, 214, 141, 106, 109, 127, 92, 194, 99, 242, 252, 71, 52, 99, 10, 213, 42, 240, + 205, 201, 9, 205, 16, 8, 67, 120, 252, 175, 246, 153, 53, 38, 181, 201, 28, 57, 207, 230, + 126, 104, 165, 28, 86, 185, 106, 64, 152, 12, 153, 213, 21, 204, 140, 203, 157, 8, 202, 139, + 227, 108, 249, 56, 85, 86, 183, 110, 24, 58, 212, 160, 216, 6, 188, 153, 92, 74, 117, 68, + 103, 111, 171, 246, 97, 220, 214, 84, 229, 107, 131, 178, 20, 12, 73, 209, 97, 185, 3, 74, + 239, 3, 255, 171, 94, 17, 198, 21, 217, 143, 100, 93, 97, 32, 18, 245, 238, 3, 199, 175, 54, + 219, 40, 57, 86, 9, 47, 191, 215, 132, 162, 98, 106, 60, 167, 37, 87, 205, 243, 180, 177, + 116, 250, 154, 18, 69, 106, 44, 84, 104, 133, 53, 238, 37, 221, 172, 53, 17, 149, 197, 189, + 185, 38, 86, 179, 201, 98, 147, 244, 181, 232, 71, 106, 48, 108, 221, 35, 204, 160, 50, 46, + 53, 138, 107, 205, 151, 92, 14, 99, 87, 163, 208, 10, 120, 173, 37, 79, 239, 26, 64, 114, + 84, 219, 237, 146, 82, 84, 87, 227, 152, 118, 87, 45, 209, 124, 91, 165, 198, 21, 31, 210, + 31, 49, 2, 39, 222, 41, 219, 243, 255, 83, 237, 223, 69, 251, 119, 209, 254, 46, 209, 158, + 226, 142, 146, 121, 212, 41, 94, 248, 106, 209, 115, 175, 244, 242, 162, 89, 250, 209, 34, + 47, 158, 190, 217, 43, 121, 166, 230, 193, 225, 212, 191, 44, 1, 87, 194, 175, 169, 100, + 119, 196, 131, 179, 140, 123, 74, 114, 48, 212, 5, 136, 150, 190, 124, 150, 54, 57, 235, 55, + 219, 41, 30, 17, 22, 214, 187, 4, 144, 209, 79, 52, 160, 89, 64, 123, 73, 99, 241, 116, 82, + 201, 109, 133, 43, 25, 225, 176, 207, 177, 42, 24, 151, 104, 204, 112, 145, 193, 37, 248, + 143, 42, 215, 169, 1, 87, 177, 114, 53, 213, 211, 220, 66, 40, 102, 148, 195, 225, 7, 107, + 72, 21, 231, 214, 244, 63, 171, 242, 100, 151, 5, 29, 43, 36, 221, 105, 239, 118, 89, 183, + 15, 71, 180, 230, 5, 137, 68, 77, 207, 183, 139, 139, 192, 49, 30, 230, 181, 98, 183, 15, + 129, 223, 98, 216, 248, 206, 89, 33, 96, 183, 95, 127, 54, 53, 154, 175, 255, 92, 247, 235, + 231, 235, 89, 125, 181, 106, 238, 215, 94, 103, 143, 31, 103, 4, 236, 255, 155, 249, 51, + 159, 91, 26, 22, 188, 73, 205, 19, 62, 230, 4, 51, 209, 242, 249, 143, 203, 239, 159, 174, + 127, 93, 162, 181, 35, 220, 121, 254, 50, 253, 9, 115, 178, 234, 254, 126, 12, 97, 152, 236, + 92, 95, 60, 105, 191, 216, 13, 40, 184, 93, 111, 115, 204, 245, 221, 44, 22, 237, 180, 91, + 182, 247, 248, 54, 54, 155, 123, 251, 251, 79, 151, 159, 62, 255, 120, 157, 27, 94, 255, 21, + 96, 0, 227, 162, 215, 67, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, + 100, 111, 98, 106, 13, 51, 54, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, + 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, + 116, 104, 32, 49, 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 83, 96, 212, + 99, 144, 255, 252, 190, 129, 1, 7, 0, 0, 75, 110, 2, 209, 13, 10, 101, 110, 100, 115, 116, + 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 54, 49, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, + 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, 49, 52, 50, 54, 47, 76, 101, 110, + 103, 116, 104, 49, 32, 50, 49, 48, 57, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, + 156, 237, 124, 123, 124, 91, 197, 149, 240, 25, 221, 171, 135, 37, 89, 190, 178, 101, 73, + 150, 44, 251, 94, 93, 191, 229, 71, 28, 197, 15, 57, 78, 172, 216, 114, 18, 199, 129, 152, + 16, 82, 41, 20, 176, 19, 59, 47, 28, 146, 146, 7, 80, 90, 48, 187, 80, 90, 39, 244, 17, 158, + 45, 229, 213, 22, 8, 176, 20, 93, 41, 78, 236, 208, 6, 7, 76, 160, 52, 129, 208, 134, 87, + 129, 134, 80, 186, 105, 187, 97, 91, 246, 107, 183, 203, 38, 145, 190, 51, 115, 37, 63, 19, + 54, 251, 251, 125, 127, 236, 239, 247, 173, 175, 231, 204, 153, 51, 103, 238, 204, 61, 231, + 204, 153, 51, 115, 175, 13, 4, 0, 50, 97, 0, 56, 232, 90, 118, 121, 205, 236, 142, 208, 218, + 133, 72, 249, 0, 211, 202, 53, 155, 122, 182, 24, 127, 154, 157, 4, 32, 179, 1, 248, 215, + 215, 236, 216, 38, 110, 251, 237, 13, 203, 0, 116, 88, 173, 9, 175, 221, 178, 110, 83, 203, + 170, 191, 109, 1, 48, 132, 1, 204, 187, 215, 245, 223, 180, 246, 199, 155, 43, 86, 3, 216, + 254, 4, 80, 17, 90, 223, 215, 211, 123, 120, 108, 241, 31, 0, 90, 170, 177, 65, 253, 122, + 36, 88, 114, 117, 155, 176, 220, 139, 229, 162, 245, 155, 182, 221, 248, 171, 83, 210, 237, + 88, 254, 38, 222, 147, 239, 223, 188, 166, 167, 165, 97, 179, 17, 160, 125, 23, 0, 199, 111, + 234, 185, 113, 139, 110, 190, 161, 6, 96, 241, 119, 145, 95, 188, 174, 103, 83, 223, 109, + 185, 191, 124, 4, 203, 81, 0, 253, 221, 91, 54, 111, 221, 150, 172, 135, 181, 0, 93, 109, + 180, 126, 203, 245, 125, 91, 10, 227, 223, 184, 15, 203, 107, 112, 124, 4, 8, 183, 81, 243, + 51, 208, 130, 69, 251, 3, 173, 31, 159, 162, 88, 205, 185, 71, 97, 173, 38, 155, 104, 53, + 26, 3, 167, 215, 106, 53, 28, 15, 211, 126, 22, 119, 137, 34, 224, 117, 70, 163, 189, 54, + 177, 144, 248, 245, 55, 147, 131, 72, 190, 59, 85, 173, 1, 194, 114, 27, 74, 13, 49, 77, 1, + 232, 52, 70, 74, 32, 144, 170, 153, 248, 33, 200, 157, 110, 245, 197, 63, 36, 197, 197, 1, + 143, 99, 214, 129, 30, 12, 144, 1, 70, 48, 129, 25, 53, 100, 129, 44, 16, 192, 10, 217, 144, + 131, 253, 230, 130, 29, 28, 224, 132, 60, 112, 129, 27, 242, 193, 3, 5, 80, 136, 35, 150, + 192, 11, 50, 20, 65, 49, 148, 64, 41, 148, 65, 57, 84, 128, 15, 42, 161, 10, 170, 161, 6, + 102, 65, 45, 204, 6, 63, 204, 129, 58, 168, 135, 6, 104, 132, 0, 52, 193, 92, 104, 134, 121, + 48, 31, 90, 32, 8, 11, 160, 21, 218, 32, 4, 237, 176, 16, 22, 193, 98, 232, 128, 37, 208, 9, + 75, 225, 18, 184, 20, 150, 65, 23, 92, 6, 203, 225, 114, 88, 1, 87, 192, 74, 248, 18, 132, + 33, 2, 171, 224, 74, 248, 50, 92, 5, 87, 195, 53, 208, 141, 227, 191, 23, 238, 135, 31, 192, + 15, 225, 39, 240, 20, 60, 7, 251, 96, 47, 12, 195, 207, 224, 0, 28, 132, 67, 240, 18, 188, + 8, 99, 240, 50, 188, 10, 175, 192, 47, 224, 53, 56, 2, 175, 195, 81, 120, 3, 222, 132, 99, + 240, 22, 28, 135, 183, 225, 29, 178, 2, 182, 195, 26, 232, 133, 245, 100, 37, 220, 12, 49, + 216, 10, 253, 164, 27, 110, 130, 13, 164, 31, 30, 128, 103, 200, 6, 216, 65, 54, 145, 235, + 80, 235, 95, 37, 171, 73, 31, 233, 37, 157, 100, 35, 108, 130, 91, 73, 15, 188, 0, 191, 134, + 157, 176, 26, 54, 147, 245, 100, 1, 185, 150, 172, 129, 235, 96, 128, 124, 9, 101, 122, 23, + 234, 110, 15, 41, 32, 133, 100, 41, 185, 132, 92, 70, 150, 147, 75, 201, 50, 248, 21, 217, + 12, 191, 33, 77, 112, 27, 244, 145, 8, 89, 69, 190, 78, 110, 33, 87, 144, 117, 164, 139, 92, + 78, 194, 240, 61, 120, 8, 190, 3, 15, 195, 131, 240, 40, 60, 6, 63, 130, 71, 224, 9, 120, + 18, 159, 240, 113, 120, 22, 126, 10, 255, 4, 135, 73, 43, 150, 182, 145, 118, 178, 144, 44, + 130, 175, 147, 37, 100, 49, 105, 3, 94, 131, 182, 9, 123, 112, 70, 233, 80, 254, 183, 32, + 246, 44, 60, 143, 18, 248, 57, 142, 110, 20, 101, 240, 34, 74, 97, 12, 14, 195, 9, 248, 8, + 78, 194, 199, 240, 59, 248, 4, 254, 25, 254, 5, 146, 104, 174, 132, 104, 8, 71, 120, 162, + 39, 102, 98, 33, 57, 196, 78, 220, 56, 98, 47, 145, 137, 143, 204, 34, 181, 164, 129, 204, + 199, 62, 46, 193, 241, 93, 73, 122, 216, 211, 95, 75, 182, 226, 152, 119, 107, 94, 209, 252, + 66, 243, 33, 55, 42, 218, 68, 151, 88, 32, 122, 197, 18, 113, 150, 216, 36, 134, 196, 109, + 226, 63, 73, 94, 169, 196, 171, 241, 234, 188, 89, 222, 108, 111, 174, 215, 229, 45, 240, + 250, 188, 139, 189, 221, 222, 190, 226, 215, 254, 252, 249, 95, 52, 103, 52, 201, 36, 157, + 61, 248, 148, 79, 225, 115, 209, 145, 30, 156, 52, 210, 151, 81, 87, 19, 35, 253, 61, 156, + 130, 211, 147, 70, 170, 197, 145, 102, 146, 44, 28, 169, 3, 165, 75, 71, 90, 65, 170, 113, + 164, 245, 36, 128, 26, 88, 138, 35, 189, 140, 92, 141, 35, 93, 67, 54, 146, 235, 200, 141, + 56, 210, 195, 56, 210, 119, 113, 164, 57, 162, 83, 204, 23, 69, 54, 210, 192, 140, 145, 90, + 113, 164, 121, 227, 35, 237, 197, 145, 126, 250, 23, 114, 134, 36, 147, 201, 143, 147, 135, + 146, 47, 37, 95, 78, 190, 154, 124, 45, 121, 36, 121, 52, 249, 122, 242, 141, 228, 177, 228, + 155, 201, 95, 37, 127, 157, 60, 158, 124, 43, 249, 118, 242, 157, 228, 187, 201, 247, 146, + 191, 73, 190, 159, 252, 32, 249, 97, 242, 183, 201, 19, 201, 143, 146, 39, 89, 126, 146, 97, + 39, 24, 254, 30, 242, 221, 139, 173, 222, 196, 246, 71, 146, 191, 196, 244, 26, 131, 175, + 38, 15, 39, 95, 76, 62, 151, 248, 90, 226, 230, 196, 166, 115, 59, 79, 6, 78, 214, 159, 172, + 59, 57, 231, 100, 237, 201, 178, 147, 226, 73, 199, 71, 127, 248, 72, 249, 104, 254, 71, + 115, 79, 116, 159, 184, 234, 196, 21, 39, 86, 252, 182, 255, 196, 165, 39, 58, 79, 180, 156, + 144, 79, 152, 79, 100, 188, 255, 184, 245, 31, 173, 95, 211, 221, 50, 195, 11, 252, 127, + 252, 35, 128, 254, 102, 253, 205, 218, 183, 180, 235, 181, 119, 106, 111, 195, 107, 61, 0, + 77, 124, 147, 118, 128, 139, 114, 175, 106, 244, 154, 151, 201, 207, 16, 139, 114, 237, 92, + 149, 198, 143, 87, 145, 218, 50, 249, 73, 242, 84, 242, 189, 196, 170, 68, 107, 162, 85, + 179, 151, 220, 165, 93, 175, 169, 213, 62, 159, 190, 47, 185, 137, 220, 164, 89, 207, 151, + 67, 136, 116, 194, 183, 48, 133, 240, 90, 128, 249, 21, 232, 149, 58, 137, 135, 120, 160, + 131, 8, 68, 70, 234, 42, 248, 87, 244, 67, 127, 64, 159, 116, 0, 61, 220, 51, 88, 251, 223, + 227, 222, 72, 170, 216, 181, 128, 228, 97, 139, 163, 88, 251, 1, 140, 158, 159, 138, 237, + 91, 96, 11, 94, 77, 56, 167, 67, 232, 97, 7, 241, 30, 69, 23, 160, 250, 207, 123, 213, 226, + 195, 169, 105, 234, 85, 142, 87, 41, 210, 233, 90, 186, 55, 117, 245, 195, 187, 201, 119, + 49, 255, 37, 222, 251, 79, 88, 130, 84, 234, 135, 235, 225, 31, 176, 167, 111, 162, 31, 127, + 12, 110, 192, 107, 17, 210, 183, 49, 193, 45, 192, 52, 27, 61, 63, 174, 200, 227, 151, 15, + 47, 102, 179, 228, 74, 76, 95, 34, 184, 166, 226, 44, 110, 70, 194, 135, 172, 205, 110, 182, + 180, 173, 210, 220, 135, 30, 136, 193, 47, 80, 56, 91, 9, 131, 157, 75, 58, 22, 47, 90, 216, + 30, 106, 107, 93, 16, 108, 153, 63, 175, 121, 110, 83, 160, 177, 161, 190, 110, 142, 127, + 118, 237, 172, 154, 234, 170, 74, 95, 69, 121, 89, 105, 73, 113, 145, 236, 149, 196, 194, 2, + 79, 190, 219, 149, 231, 116, 216, 115, 109, 57, 217, 86, 33, 203, 146, 105, 54, 25, 51, 12, + 122, 157, 150, 231, 112, 29, 175, 140, 230, 250, 170, 42, 197, 133, 131, 131, 29, 209, 129, + 213, 221, 85, 149, 209, 130, 182, 48, 137, 18, 223, 224, 32, 130, 30, 49, 10, 93, 225, 40, + 233, 142, 172, 143, 114, 62, 183, 164, 254, 68, 176, 65, 20, 174, 8, 71, 53, 197, 214, 70, + 196, 150, 135, 235, 220, 82, 164, 206, 157, 174, 27, 108, 109, 19, 20, 176, 13, 110, 177, + 13, 161, 51, 3, 98, 251, 75, 78, 115, 184, 6, 89, 114, 108, 162, 146, 153, 28, 188, 66, 110, + 91, 37, 70, 45, 114, 107, 184, 93, 110, 239, 70, 219, 236, 150, 195, 125, 17, 133, 231, 138, + 229, 226, 142, 94, 89, 28, 28, 236, 237, 233, 29, 134, 67, 93, 97, 89, 104, 162, 119, 141, + 168, 61, 71, 226, 26, 66, 192, 46, 12, 138, 205, 61, 125, 178, 208, 28, 22, 135, 9, 92, 17, + 181, 180, 125, 121, 21, 142, 209, 46, 136, 163, 110, 73, 140, 97, 151, 29, 178, 189, 49, 34, + 179, 46, 221, 88, 161, 14, 171, 243, 242, 112, 156, 96, 56, 146, 187, 56, 183, 3, 159, 54, + 245, 104, 3, 171, 215, 43, 60, 228, 202, 141, 81, 146, 27, 35, 192, 91, 115, 26, 176, 69, + 36, 253, 44, 109, 114, 155, 56, 168, 94, 50, 182, 90, 130, 89, 143, 194, 107, 75, 228, 18, + 124, 206, 225, 100, 114, 69, 88, 146, 162, 224, 198, 250, 133, 131, 11, 187, 7, 23, 13, 46, + 234, 238, 137, 138, 107, 152, 132, 72, 183, 220, 190, 33, 84, 85, 217, 46, 47, 148, 177, + 183, 146, 158, 40, 95, 34, 47, 94, 204, 8, 221, 88, 238, 78, 151, 113, 100, 29, 98, 116, 96, + 121, 88, 25, 8, 14, 226, 147, 173, 254, 250, 6, 167, 220, 190, 203, 45, 181, 71, 176, 191, + 144, 44, 133, 112, 56, 237, 161, 246, 16, 222, 54, 234, 68, 238, 168, 158, 170, 71, 239, + 147, 123, 54, 244, 33, 71, 99, 163, 123, 92, 49, 237, 74, 185, 205, 39, 183, 74, 85, 149, + 49, 49, 147, 180, 202, 161, 231, 209, 75, 8, 24, 214, 240, 161, 10, 197, 43, 13, 134, 100, + 28, 81, 231, 101, 114, 231, 242, 85, 120, 51, 91, 187, 28, 138, 217, 136, 173, 189, 27, 169, + 196, 154, 141, 203, 69, 13, 200, 45, 85, 149, 35, 56, 221, 122, 219, 47, 11, 203, 209, 238, + 203, 195, 98, 123, 180, 123, 103, 200, 205, 212, 128, 93, 224, 243, 83, 69, 201, 61, 40, 60, + 113, 48, 140, 250, 119, 163, 40, 35, 97, 58, 146, 62, 54, 20, 250, 248, 109, 84, 0, 131, + 114, 43, 242, 119, 84, 248, 124, 206, 17, 92, 217, 146, 119, 220, 181, 143, 112, 44, 110, + 11, 133, 176, 199, 176, 198, 205, 69, 12, 214, 236, 0, 224, 88, 72, 15, 26, 78, 85, 165, + 250, 36, 70, 28, 78, 71, 239, 26, 228, 1, 53, 163, 165, 193, 65, 44, 12, 174, 217, 133, 69, + 197, 204, 23, 183, 222, 25, 117, 182, 133, 163, 34, 10, 196, 220, 43, 247, 238, 28, 14, 194, + 106, 185, 93, 140, 118, 119, 133, 37, 183, 24, 125, 20, 179, 232, 192, 26, 247, 134, 104, + 176, 167, 59, 18, 113, 183, 71, 20, 79, 205, 96, 200, 77, 33, 138, 210, 151, 86, 159, 59, + 234, 241, 209, 1, 11, 244, 110, 146, 82, 3, 109, 158, 175, 254, 222, 25, 173, 240, 185, 209, + 18, 151, 140, 104, 6, 32, 24, 117, 183, 237, 220, 181, 166, 9, 185, 36, 58, 160, 30, 57, + 140, 79, 188, 51, 130, 245, 141, 85, 149, 178, 40, 162, 34, 81, 167, 61, 81, 216, 213, 200, + 30, 68, 166, 186, 199, 154, 168, 228, 195, 76, 41, 198, 218, 118, 163, 82, 90, 134, 153, + 169, 170, 210, 172, 148, 20, 83, 61, 100, 42, 101, 165, 170, 62, 194, 223, 160, 146, 93, + 130, 221, 172, 145, 5, 54, 161, 118, 186, 229, 190, 93, 216, 31, 206, 35, 109, 27, 29, 101, + 115, 179, 155, 10, 248, 147, 79, 220, 159, 140, 69, 176, 162, 92, 8, 139, 163, 53, 238, 234, + 8, 194, 113, 182, 102, 169, 217, 93, 254, 9, 109, 22, 149, 219, 195, 88, 56, 77, 45, 38, + 210, 238, 97, 54, 22, 13, 186, 163, 3, 17, 23, 14, 8, 56, 100, 22, 5, 189, 165, 89, 114, 11, + 146, 140, 61, 170, 130, 32, 43, 194, 196, 13, 17, 214, 129, 160, 114, 73, 212, 244, 145, + 177, 217, 157, 226, 154, 196, 198, 248, 14, 98, 40, 221, 203, 28, 104, 16, 115, 95, 251, + 142, 246, 13, 206, 157, 173, 109, 114, 251, 234, 214, 88, 134, 161, 124, 24, 205, 104, 16, + 31, 171, 77, 238, 65, 229, 162, 199, 8, 163, 188, 218, 197, 112, 212, 208, 182, 38, 154, + 209, 214, 29, 9, 181, 15, 182, 15, 134, 87, 227, 20, 162, 150, 31, 81, 205, 151, 26, 17, + 197, 152, 185, 213, 86, 251, 124, 241, 190, 154, 242, 218, 214, 138, 104, 45, 98, 179, 41, + 86, 85, 185, 160, 5, 250, 224, 171, 232, 15, 215, 17, 194, 32, 245, 141, 235, 32, 201, 96, + 130, 193, 115, 12, 158, 101, 240, 12, 131, 255, 201, 224, 231, 12, 254, 7, 131, 199, 25, + 252, 53, 131, 191, 98, 240, 77, 6, 143, 49, 248, 6, 131, 175, 51, 120, 148, 193, 35, 12, + 254, 18, 125, 253, 95, 48, 127, 141, 149, 126, 193, 224, 171, 12, 190, 194, 224, 97, 6, 95, + 102, 112, 140, 193, 151, 24, 124, 145, 193, 67, 12, 142, 50, 248, 2, 131, 116, 11, 212, 135, + 193, 57, 133, 48, 3, 254, 148, 193, 103, 25, 252, 39, 6, 159, 97, 240, 105, 6, 159, 98, 112, + 207, 5, 218, 142, 48, 56, 204, 224, 126, 6, 247, 49, 56, 196, 224, 94, 6, 227, 147, 248, + 191, 194, 224, 117, 56, 73, 251, 224, 90, 134, 111, 100, 112, 3, 163, 172, 99, 56, 46, 97, + 208, 75, 156, 12, 218, 25, 116, 51, 152, 71, 33, 187, 207, 84, 248, 0, 131, 247, 51, 120, + 31, 131, 247, 50, 120, 15, 131, 119, 51, 184, 251, 2, 109, 127, 204, 224, 143, 24, 124, 140, + 193, 71, 25, 124, 132, 193, 135, 25, 124, 136, 193, 155, 112, 132, 83, 219, 110, 103, 112, + 27, 131, 91, 25, 188, 158, 193, 45, 12, 110, 102, 112, 19, 107, 213, 207, 240, 245, 12, 239, + 99, 56, 222, 67, 181, 215, 112, 116, 142, 59, 234, 143, 248, 38, 219, 164, 28, 3, 196, 112, + 105, 192, 25, 209, 30, 114, 227, 98, 85, 209, 190, 6, 125, 207, 6, 121, 112, 13, 117, 222, + 116, 210, 116, 15, 67, 97, 247, 224, 96, 207, 48, 136, 61, 131, 98, 251, 224, 206, 193, 93, + 136, 238, 148, 209, 250, 55, 244, 244, 70, 203, 219, 187, 168, 99, 21, 119, 134, 36, 183, + 28, 162, 51, 73, 146, 98, 229, 164, 188, 173, 155, 206, 147, 230, 206, 229, 56, 103, 163, + 112, 89, 88, 146, 233, 2, 51, 72, 29, 27, 44, 31, 28, 92, 142, 75, 29, 224, 20, 140, 68, + 144, 77, 108, 167, 211, 86, 102, 235, 194, 2, 95, 216, 23, 142, 206, 245, 225, 175, 186, + 120, 165, 87, 235, 137, 149, 1, 114, 219, 232, 13, 196, 168, 157, 185, 229, 92, 71, 219, 96, + 231, 229, 171, 232, 125, 112, 184, 183, 81, 208, 19, 229, 150, 227, 178, 206, 28, 152, 40, + 80, 202, 242, 176, 72, 154, 69, 104, 166, 94, 109, 56, 249, 105, 126, 36, 34, 161, 15, 84, + 2, 134, 98, 217, 23, 6, 116, 112, 131, 74, 6, 197, 73, 212, 75, 81, 92, 25, 125, 110, 69, + 95, 80, 17, 137, 218, 219, 38, 241, 121, 39, 248, 104, 19, 227, 133, 248, 88, 229, 196, 253, + 46, 200, 231, 157, 224, 147, 206, 211, 47, 10, 118, 96, 53, 250, 181, 163, 33, 25, 99, 132, + 85, 184, 142, 137, 209, 187, 66, 114, 68, 140, 126, 202, 240, 75, 24, 254, 93, 134, 103, 50, + 92, 236, 162, 56, 32, 78, 159, 143, 9, 154, 249, 64, 158, 186, 85, 244, 126, 99, 232, 237, + 170, 42, 209, 87, 31, 0, 43, 148, 192, 165, 237, 189, 203, 91, 15, 64, 54, 238, 246, 187, + 84, 52, 7, 188, 176, 140, 162, 207, 227, 98, 187, 24, 175, 37, 232, 237, 123, 176, 28, 175, + 8, 148, 7, 218, 91, 169, 113, 244, 180, 6, 253, 57, 141, 182, 6, 205, 226, 185, 182, 37, 24, + 54, 46, 228, 22, 47, 182, 182, 88, 131, 154, 142, 80, 118, 23, 92, 98, 189, 52, 103, 25, + 191, 184, 51, 187, 30, 230, 167, 78, 11, 234, 116, 139, 3, 218, 118, 116, 118, 212, 103, + 138, 97, 49, 90, 222, 182, 58, 90, 209, 182, 166, 59, 90, 64, 29, 186, 182, 120, 135, 184, + 30, 199, 142, 250, 18, 187, 7, 119, 237, 116, 70, 34, 81, 109, 137, 36, 110, 64, 69, 162, + 23, 13, 209, 62, 233, 106, 50, 66, 15, 48, 220, 35, 184, 17, 45, 140, 48, 45, 87, 202, 173, + 221, 209, 42, 185, 53, 186, 176, 130, 9, 203, 215, 214, 61, 40, 182, 173, 10, 43, 24, 241, + 12, 238, 148, 219, 118, 69, 240, 73, 135, 97, 22, 250, 105, 186, 44, 179, 40, 100, 56, 249, + 89, 190, 26, 0, 12, 195, 125, 19, 21, 173, 147, 42, 22, 104, 232, 212, 138, 105, 52, 142, + 10, 106, 36, 34, 132, 14, 96, 200, 74, 32, 203, 23, 94, 96, 195, 245, 33, 8, 234, 207, 244, + 124, 226, 199, 8, 22, 159, 251, 0, 152, 17, 185, 248, 70, 102, 181, 81, 38, 34, 231, 111, + 20, 60, 79, 163, 76, 181, 81, 22, 34, 23, 223, 40, 75, 109, 36, 32, 146, 110, 52, 112, 129, + 70, 19, 185, 160, 54, 178, 210, 102, 23, 221, 200, 170, 54, 178, 33, 50, 181, 81, 240, 11, + 26, 217, 212, 70, 14, 68, 212, 70, 3, 23, 209, 147, 67, 109, 228, 68, 100, 162, 81, 112, + 218, 53, 253, 38, 78, 108, 20, 73, 255, 84, 169, 231, 111, 154, 0, 255, 159, 192, 129, 30, + 248, 40, 248, 188, 36, 245, 67, 233, 0, 231, 94, 161, 14, 149, 224, 226, 130, 60, 112, 70, + 135, 249, 125, 103, 112, 89, 229, 103, 163, 121, 172, 34, 87, 107, 150, 106, 150, 98, 219, + 69, 184, 27, 9, 43, 132, 195, 184, 62, 152, 65, 12, 24, 174, 23, 36, 129, 224, 226, 21, 227, + 178, 120, 159, 66, 72, 148, 67, 186, 153, 104, 73, 154, 78, 4, 222, 7, 10, 197, 183, 198, + 56, 77, 168, 101, 244, 236, 104, 237, 172, 72, 142, 148, 43, 173, 34, 255, 150, 176, 104, + 150, 254, 43, 61, 247, 171, 77, 158, 226, 222, 208, 222, 134, 6, 146, 71, 236, 211, 250, + 112, 77, 235, 35, 35, 213, 135, 123, 188, 143, 12, 218, 199, 243, 144, 143, 107, 175, 27, + 246, 199, 117, 230, 2, 147, 79, 49, 47, 107, 81, 116, 141, 45, 67, 57, 249, 186, 76, 183, + 89, 56, 45, 156, 158, 183, 63, 67, 224, 236, 130, 93, 103, 198, 136, 54, 80, 51, 86, 51, + 230, 36, 113, 142, 203, 200, 16, 70, 133, 99, 180, 249, 125, 216, 252, 177, 120, 6, 135, + 205, 247, 10, 249, 25, 118, 55, 54, 34, 181, 179, 20, 161, 201, 119, 0, 183, 158, 65, 168, + 222, 23, 204, 204, 9, 10, 118, 183, 207, 23, 205, 109, 11, 199, 117, 25, 66, 206, 48, 84, 7, + 205, 66, 142, 46, 71, 200, 104, 198, 164, 107, 244, 69, 88, 29, 167, 203, 177, 179, 58, 59, + 214, 217, 185, 121, 152, 113, 233, 58, 224, 236, 121, 106, 93, 30, 228, 217, 185, 249, 152, + 32, 93, 151, 97, 206, 20, 212, 123, 102, 34, 150, 209, 130, 89, 6, 214, 69, 180, 94, 176, + 10, 224, 159, 77, 161, 92, 55, 187, 158, 203, 46, 145, 189, 58, 46, 219, 238, 215, 192, 43, + 137, 255, 32, 134, 87, 94, 37, 250, 196, 231, 175, 174, 170, 35, 164, 110, 85, 152, 194, + 112, 30, 217, 77, 106, 72, 19, 121, 36, 209, 147, 56, 156, 120, 51, 113, 93, 211, 103, 228, + 126, 242, 248, 231, 159, 39, 174, 76, 108, 248, 12, 53, 43, 3, 112, 191, 70, 185, 75, 112, + 88, 149, 186, 37, 45, 117, 239, 184, 212, 45, 76, 234, 198, 168, 133, 73, 93, 30, 151, 186, + 145, 105, 214, 220, 217, 162, 20, 52, 182, 196, 4, 139, 89, 56, 62, 26, 11, 10, 162, 235, + 85, 215, 8, 218, 234, 179, 177, 2, 173, 110, 4, 23, 113, 179, 112, 118, 84, 56, 13, 138, + 187, 64, 24, 27, 129, 12, 98, 82, 100, 157, 192, 162, 223, 79, 34, 68, 1, 139, 112, 60, 10, + 66, 212, 125, 92, 113, 185, 200, 33, 56, 164, 184, 220, 58, 75, 212, 117, 148, 208, 201, + 133, 33, 137, 112, 58, 152, 65, 143, 177, 241, 130, 98, 95, 211, 144, 217, 8, 70, 83, 169, + 15, 101, 239, 201, 24, 193, 216, 209, 40, 156, 110, 11, 11, 205, 110, 105, 52, 130, 134, 69, + 108, 122, 29, 169, 149, 102, 215, 55, 248, 245, 250, 90, 169, 174, 14, 232, 198, 155, 74, + 74, 47, 215, 215, 251, 103, 59, 236, 220, 192, 3, 155, 18, 71, 72, 199, 93, 87, 151, 205, + 170, 170, 62, 251, 12, 105, 31, 184, 245, 206, 205, 203, 238, 40, 109, 90, 118, 242, 238, + 167, 250, 251, 121, 248, 81, 252, 182, 196, 63, 55, 108, 124, 247, 61, 135, 147, 44, 123, + 225, 224, 125, 219, 191, 187, 122, 229, 175, 222, 236, 239, 71, 121, 73, 104, 167, 7, 81, + 94, 213, 112, 84, 149, 87, 126, 90, 94, 53, 227, 242, 202, 103, 242, 178, 171, 21, 102, 50, + 107, 92, 96, 118, 38, 48, 99, 99, 139, 146, 183, 172, 101, 4, 138, 97, 36, 154, 39, 156, + 142, 103, 91, 243, 140, 212, 32, 21, 159, 47, 80, 19, 204, 168, 12, 250, 42, 241, 162, 207, + 26, 173, 172, 137, 211, 66, 44, 207, 104, 70, 11, 228, 48, 194, 52, 10, 103, 149, 194, 60, + 97, 76, 209, 27, 133, 49, 18, 205, 23, 162, 249, 111, 83, 168, 63, 174, 232, 116, 76, 124, + 58, 61, 138, 79, 119, 148, 40, 118, 187, 112, 108, 4, 202, 224, 129, 211, 138, 47, 95, 56, + 30, 179, 103, 91, 71, 71, 133, 206, 104, 193, 101, 225, 232, 194, 29, 145, 104, 230, 113, + 220, 243, 85, 194, 253, 167, 169, 216, 84, 17, 149, 82, 17, 217, 115, 81, 134, 250, 90, 59, + 61, 145, 0, 201, 91, 82, 55, 135, 18, 29, 118, 187, 127, 54, 21, 101, 105, 93, 125, 189, 38, + 180, 163, 183, 227, 134, 217, 190, 208, 153, 127, 248, 241, 11, 235, 164, 242, 190, 224, + 170, 196, 35, 137, 191, 237, 122, 252, 146, 6, 127, 119, 91, 69, 155, 180, 186, 255, 141, + 95, 221, 127, 3, 111, 232, 185, 254, 138, 176, 115, 103, 244, 158, 91, 6, 86, 186, 29, 213, + 139, 214, 238, 254, 36, 241, 102, 239, 202, 89, 109, 13, 109, 21, 37, 183, 110, 219, 125, + 116, 158, 183, 250, 6, 58, 255, 75, 209, 14, 143, 106, 191, 134, 110, 219, 65, 190, 172, 74, + 86, 147, 150, 172, 115, 92, 178, 26, 38, 217, 204, 180, 100, 243, 198, 37, 155, 201, 36, + 171, 69, 201, 102, 118, 182, 4, 51, 28, 130, 144, 169, 205, 182, 102, 107, 5, 195, 40, 143, + 162, 173, 25, 85, 50, 244, 163, 163, 49, 142, 100, 13, 195, 230, 179, 136, 5, 57, 106, 166, + 138, 209, 60, 58, 58, 164, 211, 105, 121, 94, 43, 140, 210, 31, 162, 232, 50, 133, 227, 195, + 176, 165, 93, 209, 241, 29, 203, 195, 177, 32, 79, 25, 221, 10, 175, 17, 70, 81, 100, 66, + 92, 111, 214, 101, 234, 155, 155, 163, 25, 99, 241, 108, 33, 203, 130, 172, 74, 166, 238, + 78, 231, 89, 39, 6, 32, 4, 123, 64, 190, 209, 145, 36, 254, 40, 14, 110, 24, 190, 18, 227, + 185, 124, 31, 114, 24, 98, 217, 156, 199, 199, 17, 18, 235, 206, 206, 233, 16, 123, 7, 113, + 215, 78, 87, 254, 97, 192, 61, 122, 44, 59, 219, 106, 144, 27, 99, 57, 57, 118, 204, 216, + 62, 62, 2, 177, 110, 135, 125, 6, 163, 195, 33, 80, 70, 187, 61, 103, 130, 49, 170, 93, 24, + 205, 94, 216, 21, 86, 240, 121, 155, 35, 180, 148, 67, 75, 57, 172, 68, 22, 70, 185, 133, + 203, 195, 10, 71, 176, 68, 21, 141, 83, 130, 248, 253, 214, 90, 127, 174, 92, 107, 149, 172, + 117, 181, 214, 218, 90, 162, 175, 213, 148, 38, 64, 115, 243, 138, 21, 255, 248, 143, 137, + 15, 19, 43, 56, 82, 122, 253, 86, 110, 203, 217, 93, 39, 19, 239, 145, 210, 147, 154, 200, + 185, 103, 120, 212, 82, 54, 128, 246, 118, 237, 29, 224, 129, 34, 50, 159, 105, 9, 32, 173, + 165, 98, 240, 82, 101, 36, 159, 142, 1, 213, 18, 93, 99, 152, 146, 74, 8, 163, 195, 170, 24, + 207, 148, 164, 169, 111, 217, 87, 36, 59, 53, 25, 206, 206, 150, 49, 106, 246, 67, 28, 167, + 33, 76, 108, 248, 51, 130, 203, 105, 223, 144, 40, 106, 156, 69, 57, 244, 220, 161, 230, 52, + 196, 69, 171, 104, 141, 57, 53, 102, 223, 144, 96, 149, 100, 139, 136, 74, 21, 70, 65, 113, + 228, 13, 147, 252, 24, 113, 150, 248, 70, 192, 5, 175, 40, 121, 229, 136, 216, 225, 85, 197, + 81, 238, 219, 7, 196, 69, 128, 216, 125, 251, 114, 172, 246, 34, 17, 17, 12, 70, 25, 123, 6, + 101, 215, 195, 75, 138, 129, 178, 155, 224, 69, 197, 136, 236, 60, 167, 231, 120, 202, 110, + 17, 76, 178, 132, 8, 81, 8, 8, 199, 208, 76, 102, 185, 62, 112, 237, 229, 109, 54, 2, 75, + 66, 95, 253, 171, 83, 41, 2, 37, 7, 55, 107, 27, 98, 4, 242, 125, 49, 43, 120, 124, 49, 17, + 1, 167, 184, 64, 24, 85, 236, 57, 8, 100, 94, 177, 240, 195, 176, 62, 198, 241, 200, 34, + 240, 200, 34, 241, 148, 69, 207, 99, 173, 201, 34, 208, 5, 176, 1, 149, 64, 236, 118, 71, + 174, 36, 225, 124, 42, 45, 173, 149, 106, 245, 58, 44, 202, 114, 93, 125, 67, 61, 225, 176, + 204, 213, 142, 146, 223, 231, 123, 200, 223, 203, 218, 66, 137, 88, 66, 185, 115, 110, 89, + 87, 162, 161, 124, 222, 156, 187, 223, 255, 160, 221, 43, 145, 231, 14, 145, 111, 190, 114, + 140, 31, 58, 211, 121, 85, 51, 239, 247, 243, 205, 87, 141, 93, 119, 207, 85, 26, 196, 10, + 10, 184, 72, 194, 65, 254, 136, 147, 10, 61, 59, 240, 127, 213, 174, 135, 2, 240, 65, 35, + 249, 55, 117, 110, 141, 107, 45, 0, 146, 86, 157, 66, 76, 107, 196, 150, 210, 90, 19, 41, + 48, 171, 116, 27, 211, 26, 42, 107, 175, 195, 233, 114, 182, 250, 148, 89, 181, 35, 184, 31, + 117, 162, 83, 87, 116, 129, 150, 189, 6, 157, 86, 135, 212, 178, 178, 17, 220, 225, 234, + 144, 26, 111, 108, 212, 57, 169, 234, 70, 176, 239, 61, 167, 227, 141, 82, 163, 20, 115, + 234, 204, 190, 184, 87, 106, 104, 196, 165, 118, 116, 175, 144, 149, 37, 53, 34, 139, 128, + 250, 118, 195, 65, 197, 69, 117, 193, 195, 11, 138, 182, 220, 199, 199, 160, 113, 86, 199, + 229, 97, 101, 86, 176, 175, 49, 18, 131, 50, 137, 22, 202, 130, 141, 145, 120, 237, 172, + 178, 50, 218, 158, 196, 11, 197, 202, 170, 97, 232, 141, 163, 142, 81, 236, 116, 246, 161, + 237, 104, 233, 205, 222, 87, 100, 80, 23, 151, 40, 132, 165, 49, 92, 98, 34, 244, 214, 31, + 40, 50, 153, 65, 46, 134, 221, 113, 147, 201, 54, 103, 24, 118, 43, 168, 97, 225, 216, 105, + 225, 248, 177, 211, 28, 122, 200, 229, 236, 44, 6, 34, 74, 177, 136, 189, 171, 132, 81, 122, + 56, 163, 152, 138, 59, 46, 11, 35, 89, 104, 142, 22, 171, 244, 1, 119, 52, 24, 105, 140, 68, + 38, 55, 155, 83, 53, 173, 153, 109, 14, 109, 54, 167, 10, 155, 205, 153, 218, 12, 195, 11, + 231, 68, 120, 49, 80, 92, 134, 191, 233, 240, 194, 96, 42, 46, 99, 161, 64, 113, 153, 161, + 172, 216, 212, 140, 201, 128, 161, 192, 56, 243, 156, 90, 252, 77, 51, 219, 28, 181, 115, + 24, 243, 156, 90, 196, 108, 45, 152, 217, 104, 220, 208, 96, 165, 62, 91, 170, 149, 68, 126, + 146, 99, 231, 101, 164, 48, 83, 67, 87, 48, 91, 93, 34, 245, 58, 171, 213, 102, 247, 167, + 138, 242, 91, 161, 45, 36, 66, 202, 49, 68, 52, 221, 191, 244, 43, 59, 123, 158, 77, 28, + 251, 60, 241, 92, 226, 201, 45, 94, 47, 233, 44, 254, 193, 192, 250, 235, 154, 156, 142, + 192, 252, 204, 155, 182, 63, 241, 140, 116, 140, 123, 245, 202, 185, 122, 255, 99, 15, 238, + 249, 82, 165, 221, 217, 208, 243, 108, 252, 125, 191, 190, 192, 195, 95, 146, 8, 220, 254, + 200, 206, 127, 112, 58, 206, 189, 120, 238, 220, 252, 192, 143, 158, 124, 240, 62, 250, 182, + 183, 55, 249, 158, 246, 86, 237, 157, 184, 225, 73, 168, 22, 169, 75, 91, 164, 4, 5, 188, + 106, 121, 58, 102, 145, 66, 84, 199, 44, 210, 59, 110, 145, 2, 179, 72, 174, 11, 151, 80, + 15, 196, 79, 43, 192, 225, 114, 152, 81, 223, 66, 131, 142, 61, 167, 135, 130, 38, 41, 39, + 43, 67, 56, 126, 4, 253, 54, 186, 115, 29, 93, 4, 93, 240, 144, 146, 193, 221, 121, 154, 68, + 5, 33, 10, 199, 21, 81, 100, 75, 165, 8, 184, 84, 138, 71, 41, 117, 40, 104, 179, 88, 179, + 37, 215, 225, 183, 135, 225, 161, 79, 71, 224, 33, 200, 22, 62, 117, 65, 76, 204, 161, 22, + 16, 135, 160, 136, 230, 136, 6, 57, 53, 26, 28, 112, 184, 240, 119, 34, 26, 116, 184, 152, + 6, 92, 14, 196, 116, 243, 48, 155, 20, 13, 186, 60, 106, 157, 135, 243, 184, 116, 243, 49, + 209, 104, 48, 66, 116, 188, 44, 210, 144, 78, 170, 119, 216, 235, 27, 26, 252, 232, 143, + 229, 146, 34, 217, 171, 177, 10, 217, 168, 137, 6, 237, 173, 119, 36, 62, 221, 147, 120, 33, + 177, 150, 252, 128, 44, 248, 90, 108, 73, 167, 203, 48, 103, 246, 210, 68, 226, 174, 159, + 143, 30, 249, 197, 55, 62, 222, 65, 248, 31, 126, 135, 124, 151, 204, 37, 237, 228, 97, 178, + 84, 180, 55, 231, 36, 10, 70, 63, 73, 236, 79, 28, 72, 188, 156, 120, 241, 198, 111, 160, + 223, 246, 160, 223, 190, 3, 125, 64, 46, 250, 237, 185, 211, 60, 64, 241, 52, 15, 96, 26, + 247, 219, 105, 121, 155, 152, 188, 13, 129, 22, 197, 210, 201, 230, 187, 161, 213, 183, 215, + 146, 101, 181, 224, 180, 151, 196, 97, 216, 19, 53, 80, 103, 144, 135, 207, 30, 143, 90, 16, + 29, 159, 203, 35, 184, 98, 28, 84, 172, 229, 190, 120, 158, 75, 18, 217, 212, 141, 21, 73, + 246, 233, 51, 87, 123, 193, 25, 154, 125, 190, 249, 76, 20, 147, 137, 42, 213, 131, 211, + 150, 192, 157, 167, 185, 24, 120, 236, 168, 164, 216, 128, 201, 67, 103, 153, 199, 46, 52, + 43, 158, 160, 58, 183, 38, 43, 75, 244, 224, 239, 196, 220, 242, 136, 76, 33, 30, 209, 32, + 122, 76, 205, 152, 12, 105, 101, 153, 44, 41, 101, 121, 92, 136, 153, 90, 48, 51, 77, 157, + 74, 76, 99, 169, 25, 84, 204, 230, 76, 182, 85, 208, 200, 24, 67, 229, 190, 186, 96, 35, + 233, 194, 48, 249, 42, 242, 64, 98, 7, 206, 151, 151, 18, 209, 141, 146, 72, 58, 3, 243, + 115, 15, 30, 62, 254, 90, 70, 83, 13, 157, 43, 205, 58, 127, 226, 193, 196, 27, 137, 189, + 137, 175, 250, 117, 5, 5, 11, 231, 7, 208, 231, 250, 72, 61, 105, 175, 105, 162, 113, 38, + 106, 76, 66, 141, 205, 33, 175, 169, 250, 226, 211, 250, 170, 27, 215, 23, 207, 244, 85, 19, + 229, 153, 190, 234, 199, 245, 85, 67, 245, 21, 247, 119, 26, 3, 45, 45, 123, 193, 95, 235, + 111, 69, 17, 248, 96, 29, 248, 133, 179, 123, 205, 198, 12, 35, 45, 231, 192, 90, 26, 75, + 198, 139, 138, 140, 126, 213, 89, 187, 160, 15, 139, 174, 34, 87, 204, 143, 209, 230, 254, + 82, 95, 73, 145, 211, 229, 200, 161, 90, 163, 215, 8, 8, 196, 168, 200, 57, 233, 200, 29, + 189, 59, 177, 40, 114, 209, 68, 217, 67, 50, 21, 217, 53, 81, 174, 166, 145, 190, 111, 162, + 76, 208, 22, 128, 26, 133, 1, 173, 35, 131, 121, 250, 146, 82, 58, 185, 124, 193, 82, 117, + 114, 197, 192, 225, 164, 132, 156, 160, 35, 216, 216, 152, 46, 185, 130, 78, 181, 58, 66, + 226, 37, 78, 71, 41, 53, 31, 45, 175, 229, 39, 59, 126, 66, 13, 133, 159, 97, 63, 6, 106, + 86, 218, 105, 228, 152, 104, 174, 33, 194, 216, 152, 130, 209, 27, 41, 140, 129, 185, 196, + 23, 207, 17, 60, 194, 8, 156, 129, 172, 137, 205, 132, 82, 80, 56, 76, 196, 24, 136, 88, 93, + 36, 121, 164, 17, 72, 130, 56, 81, 29, 119, 121, 60, 158, 17, 72, 64, 193, 4, 109, 168, 182, + 6, 106, 102, 225, 222, 196, 87, 237, 169, 166, 123, 147, 154, 41, 123, 19, 63, 174, 244, + 117, 105, 19, 170, 205, 205, 149, 75, 74, 152, 197, 48, 15, 220, 224, 183, 90, 25, 161, 54, + 229, 131, 213, 13, 76, 173, 180, 37, 132, 126, 56, 169, 121, 120, 182, 227, 229, 99, 95, + 106, 170, 41, 218, 245, 205, 220, 250, 250, 220, 111, 237, 44, 10, 204, 159, 245, 246, 153, + 174, 64, 121, 197, 185, 229, 126, 253, 220, 43, 85, 7, 124, 244, 245, 145, 135, 107, 154, + 18, 190, 93, 143, 39, 246, 36, 158, 124, 230, 123, 9, 251, 252, 192, 227, 135, 126, 125, 92, + 181, 41, 254, 105, 180, 169, 42, 242, 211, 105, 62, 160, 122, 154, 15, 48, 164, 124, 64, + 205, 184, 77, 25, 152, 77, 233, 2, 101, 157, 45, 233, 37, 159, 30, 205, 172, 165, 43, 126, + 92, 20, 117, 101, 170, 13, 217, 169, 13, 137, 118, 209, 30, 43, 195, 5, 127, 200, 43, 218, + 236, 57, 89, 105, 251, 49, 83, 251, 201, 154, 108, 47, 104, 63, 226, 68, 57, 143, 218, 143, + 61, 93, 86, 74, 203, 89, 192, 86, 70, 3, 182, 10, 52, 157, 114, 106, 58, 37, 104, 58, 165, + 147, 162, 5, 18, 247, 218, 114, 228, 243, 133, 2, 21, 231, 15, 5, 74, 168, 69, 200, 23, 23, + 33, 144, 120, 126, 190, 1, 232, 147, 41, 38, 35, 51, 21, 3, 218, 66, 150, 217, 99, 166, 166, + 98, 154, 100, 42, 46, 55, 51, 149, 124, 172, 22, 153, 89, 36, 33, 127, 146, 169, 216, 243, + 60, 121, 212, 84, 92, 19, 52, 92, 89, 204, 121, 104, 221, 4, 237, 207, 69, 157, 87, 208, + 227, 69, 231, 21, 204, 16, 217, 235, 96, 187, 62, 216, 39, 59, 208, 228, 169, 221, 52, 92, + 148, 205, 168, 161, 100, 67, 253, 91, 204, 92, 6, 169, 185, 180, 53, 213, 88, 210, 230, 98, + 9, 109, 73, 60, 153, 120, 2, 23, 239, 99, 23, 176, 148, 106, 74, 165, 139, 54, 74, 114, 105, + 242, 61, 157, 17, 215, 231, 42, 210, 60, 237, 52, 166, 122, 124, 125, 86, 79, 99, 44, 169, + 211, 152, 9, 91, 177, 176, 245, 66, 87, 223, 162, 64, 87, 139, 82, 236, 162, 225, 34, 238, + 226, 199, 232, 126, 158, 134, 136, 184, 68, 27, 36, 193, 172, 83, 151, 104, 165, 168, 100, + 152, 120, 98, 164, 152, 234, 185, 20, 245, 92, 66, 213, 43, 163, 122, 139, 202, 125, 49, 16, + 138, 105, 248, 39, 160, 55, 39, 10, 199, 81, 183, 239, 192, 181, 92, 135, 110, 95, 177, 160, + 255, 126, 72, 169, 176, 8, 199, 79, 11, 180, 41, 234, 187, 98, 134, 98, 101, 170, 88, 113, + 26, 25, 87, 169, 161, 160, 213, 100, 201, 154, 188, 222, 103, 225, 122, 63, 109, 193, 176, + 57, 240, 55, 189, 96, 112, 58, 155, 131, 45, 10, 14, 27, 98, 220, 60, 204, 38, 157, 231, + 164, 86, 126, 135, 11, 92, 14, 110, 62, 38, 96, 103, 54, 234, 66, 49, 251, 60, 75, 59, 106, + 170, 190, 142, 109, 167, 37, 41, 87, 71, 21, 170, 227, 230, 36, 70, 18, 215, 144, 239, 147, + 224, 192, 190, 206, 142, 92, 93, 253, 236, 165, 73, 216, 249, 194, 139, 135, 95, 90, 56, + 191, 162, 122, 217, 0, 185, 134, 92, 179, 169, 237, 247, 165, 233, 213, 190, 179, 208, 209, + 108, 101, 139, 253, 115, 137, 120, 226, 96, 226, 0, 177, 24, 131, 181, 111, 173, 106, 70, + 53, 90, 230, 174, 72, 188, 117, 35, 106, 210, 7, 160, 203, 102, 43, 201, 161, 105, 179, 190, + 110, 218, 172, 119, 167, 102, 125, 61, 145, 50, 85, 186, 155, 106, 114, 40, 87, 23, 16, 107, + 112, 179, 214, 50, 22, 47, 43, 211, 213, 168, 51, 61, 147, 206, 244, 178, 204, 178, 204, 88, + 13, 13, 237, 45, 153, 165, 44, 52, 87, 180, 122, 166, 77, 93, 9, 243, 243, 163, 138, 126, + 210, 100, 85, 108, 118, 86, 153, 75, 43, 29, 168, 106, 59, 173, 204, 193, 64, 204, 134, 149, + 213, 179, 216, 124, 175, 161, 149, 181, 88, 57, 139, 86, 86, 97, 101, 53, 86, 22, 74, 172, + 82, 164, 149, 94, 188, 173, 68, 43, 11, 240, 182, 133, 212, 7, 152, 204, 229, 21, 231, 243, + 1, 6, 248, 80, 145, 77, 23, 187, 29, 168, 61, 191, 199, 168, 130, 223, 206, 52, 172, 184, + 144, 85, 82, 76, 187, 116, 185, 93, 238, 201, 93, 122, 105, 151, 197, 51, 110, 82, 64, 187, + 116, 207, 32, 59, 104, 151, 174, 25, 228, 28, 218, 165, 48, 141, 60, 225, 8, 82, 246, 34, + 213, 78, 46, 166, 29, 0, 174, 48, 180, 102, 194, 31, 156, 96, 97, 252, 170, 45, 33, 242, + 199, 52, 150, 114, 5, 161, 132, 99, 186, 83, 160, 11, 73, 162, 155, 60, 154, 198, 207, 54, + 166, 49, 114, 52, 225, 31, 119, 16, 40, 231, 114, 0, 205, 191, 161, 93, 217, 225, 212, 52, + 187, 114, 128, 148, 156, 176, 43, 130, 142, 127, 138, 106, 72, 28, 9, 230, 3, 244, 136, 4, + 204, 184, 168, 88, 59, 113, 27, 217, 50, 205, 112, 14, 78, 53, 28, 33, 155, 169, 223, 90, + 194, 236, 229, 160, 146, 77, 43, 179, 176, 82, 80, 213, 79, 239, 77, 151, 24, 3, 149, 231, + 69, 43, 60, 231, 252, 10, 207, 162, 220, 230, 255, 66, 250, 19, 242, 253, 67, 199, 14, 210, + 75, 250, 118, 116, 116, 236, 72, 252, 48, 241, 224, 142, 226, 34, 148, 37, 155, 131, 250, + 230, 85, 103, 27, 85, 172, 160, 128, 202, 172, 20, 163, 58, 55, 202, 204, 3, 231, 166, 69, + 117, 5, 211, 162, 58, 103, 42, 170, 43, 36, 5, 22, 149, 238, 100, 43, 112, 126, 42, 170, + 203, 119, 229, 99, 244, 45, 216, 70, 48, 172, 203, 103, 33, 183, 131, 70, 91, 182, 25, 209, + 150, 146, 97, 98, 114, 53, 82, 209, 153, 145, 102, 154, 20, 129, 17, 37, 75, 152, 22, 77, + 145, 33, 151, 19, 156, 121, 24, 195, 216, 28, 30, 7, 141, 97, 156, 19, 139, 214, 5, 227, 44, + 51, 37, 103, 93, 92, 248, 53, 53, 16, 74, 75, 115, 82, 196, 83, 202, 34, 30, 102, 168, 129, + 249, 133, 71, 207, 68, 230, 99, 136, 115, 245, 68, 136, 195, 228, 42, 206, 15, 236, 127, + 251, 212, 41, 42, 85, 52, 71, 253, 85, 40, 213, 26, 141, 83, 149, 170, 49, 45, 213, 89, 227, + 82, 53, 50, 169, 22, 68, 141, 76, 170, 181, 227, 30, 174, 128, 74, 53, 38, 107, 209, 189, + 41, 2, 238, 112, 156, 152, 42, 59, 91, 134, 42, 202, 107, 170, 181, 2, 61, 158, 10, 4, 134, + 170, 170, 42, 125, 190, 74, 245, 128, 42, 158, 83, 101, 243, 49, 79, 151, 101, 101, 130, 21, + 168, 96, 45, 112, 88, 201, 66, 97, 219, 243, 24, 45, 117, 38, 117, 144, 158, 73, 41, 188, + 142, 217, 174, 86, 61, 120, 122, 89, 209, 81, 5, 112, 216, 128, 199, 74, 111, 17, 171, 148, + 105, 101, 49, 250, 181, 34, 90, 41, 161, 118, 188, 229, 116, 230, 232, 32, 24, 247, 20, 24, + 77, 75, 122, 7, 7, 151, 244, 238, 90, 222, 26, 179, 214, 192, 48, 108, 220, 107, 50, 154, + 116, 70, 161, 45, 220, 236, 30, 139, 140, 111, 162, 44, 240, 187, 243, 89, 191, 30, 62, 86, + 100, 227, 12, 50, 71, 185, 103, 236, 173, 98, 246, 242, 50, 52, 137, 189, 158, 2, 143, 174, + 96, 106, 7, 177, 202, 2, 122, 78, 189, 223, 230, 203, 9, 86, 249, 42, 13, 46, 225, 213, 119, + 93, 108, 218, 185, 168, 250, 61, 231, 57, 95, 65, 95, 88, 54, 131, 44, 81, 171, 40, 152, 78, + 102, 71, 166, 213, 86, 122, 110, 150, 99, 205, 247, 169, 229, 156, 42, 90, 174, 170, 78, + 151, 43, 236, 244, 232, 205, 102, 79, 151, 109, 62, 90, 246, 85, 228, 251, 72, 103, 212, + 217, 21, 86, 202, 124, 29, 74, 21, 116, 208, 79, 188, 68, 197, 87, 53, 216, 40, 211, 45, + 123, 164, 216, 150, 58, 90, 27, 55, 187, 90, 82, 139, 191, 254, 153, 190, 147, 200, 50, 218, + 199, 172, 75, 110, 57, 125, 122, 75, 104, 209, 86, 246, 173, 239, 99, 228, 193, 36, 1, 230, + 55, 159, 75, 60, 183, 37, 116, 238, 92, 126, 254, 185, 179, 201, 29, 151, 26, 208, 24, 47, + 189, 129, 219, 120, 195, 165, 122, 255, 217, 38, 238, 240, 84, 151, 201, 27, 206, 148, 241, + 81, 246, 214, 224, 125, 237, 15, 209, 66, 75, 72, 239, 52, 11, 45, 157, 102, 161, 82, 202, + 66, 203, 198, 45, 84, 162, 22, 186, 223, 166, 237, 116, 7, 138, 209, 66, 71, 91, 90, 70, 21, + 111, 87, 203, 16, 70, 129, 146, 228, 85, 141, 114, 154, 45, 190, 200, 108, 241, 11, 237, + 206, 149, 207, 26, 184, 105, 165, 7, 43, 243, 105, 101, 30, 86, 186, 152, 67, 53, 154, 140, + 232, 15, 148, 98, 106, 107, 84, 249, 138, 181, 24, 247, 238, 116, 253, 134, 141, 113, 81, + 18, 37, 213, 91, 28, 35, 212, 229, 140, 254, 247, 76, 140, 118, 248, 241, 204, 152, 140, + 118, 255, 187, 241, 248, 127, 98, 161, 181, 22, 103, 153, 216, 124, 51, 25, 13, 170, 210, + 139, 153, 145, 216, 208, 72, 20, 81, 74, 209, 108, 50, 165, 21, 201, 249, 190, 105, 218, 46, + 65, 109, 251, 253, 84, 219, 76, 241, 126, 63, 83, 56, 213, 113, 45, 169, 86, 149, 220, 217, + 46, 191, 243, 142, 230, 205, 75, 110, 249, 221, 239, 122, 231, 231, 123, 206, 110, 74, 82, + 117, 250, 245, 151, 220, 200, 61, 178, 106, 174, 198, 127, 246, 30, 205, 38, 70, 209, 93, + 122, 227, 153, 235, 249, 48, 125, 95, 177, 56, 249, 158, 246, 51, 140, 143, 47, 240, 190, + 146, 191, 192, 251, 74, 243, 180, 247, 149, 123, 192, 13, 241, 244, 251, 74, 12, 150, 49, + 104, 254, 239, 188, 175, 220, 141, 205, 31, 250, 31, 251, 190, 82, 141, 125, 85, 88, 167, + 158, 143, 168, 161, 47, 151, 159, 120, 49, 177, 145, 208, 239, 105, 91, 200, 125, 137, 141, + 137, 67, 67, 251, 246, 13, 237, 221, 183, 111, 239, 120, 104, 155, 88, 157, 120, 62, 241, + 114, 2, 131, 150, 133, 164, 149, 254, 213, 66, 58, 196, 69, 217, 211, 125, 236, 17, 156, 77, + 110, 40, 37, 55, 77, 139, 61, 202, 46, 112, 154, 85, 62, 237, 52, 203, 222, 217, 50, 249, + 244, 186, 168, 104, 252, 244, 218, 227, 209, 217, 213, 16, 55, 11, 226, 103, 227, 158, 44, + 79, 86, 204, 206, 66, 220, 44, 143, 135, 25, 98, 174, 131, 77, 44, 59, 157, 59, 78, 116, + 242, 14, 58, 119, 108, 24, 168, 230, 78, 14, 89, 138, 138, 144, 149, 182, 32, 74, 169, 117, + 90, 112, 26, 207, 2, 33, 127, 116, 84, 24, 35, 244, 14, 231, 13, 66, 108, 52, 4, 180, 94, + 108, 36, 35, 193, 110, 118, 40, 70, 207, 194, 164, 82, 245, 44, 76, 162, 103, 97, 82, 169, + 208, 172, 72, 193, 25, 231, 204, 65, 79, 209, 128, 84, 52, 113, 22, 38, 21, 49, 21, 74, 69, + 134, 34, 201, 212, 140, 105, 210, 89, 152, 71, 82, 235, 60, 136, 153, 90, 48, 51, 205, 56, + 86, 230, 165, 41, 91, 80, 50, 126, 164, 172, 203, 85, 79, 145, 107, 137, 137, 216, 19, 239, + 38, 94, 104, 27, 143, 56, 73, 167, 248, 196, 183, 54, 223, 160, 30, 135, 161, 199, 124, 62, + 254, 250, 193, 196, 234, 116, 136, 169, 153, 119, 119, 236, 135, 223, 171, 105, 66, 125, + 215, 97, 212, 116, 136, 122, 79, 240, 147, 111, 79, 211, 247, 156, 11, 232, 187, 110, 252, + 213, 160, 170, 111, 105, 170, 190, 103, 213, 140, 235, 27, 183, 52, 82, 250, 0, 12, 245, 93, + 230, 42, 115, 197, 36, 122, 120, 145, 39, 100, 185, 212, 247, 13, 232, 96, 115, 37, 97, 76, + 17, 189, 76, 241, 82, 9, 219, 160, 30, 164, 107, 52, 253, 112, 231, 144, 34, 78, 82, 60, 85, + 221, 139, 212, 20, 176, 19, 170, 124, 127, 254, 116, 229, 187, 192, 93, 154, 82, 190, 124, + 126, 229, 23, 82, 229, 231, 95, 172, 242, 43, 211, 202, 143, 9, 212, 85, 142, 198, 114, 173, + 166, 137, 151, 144, 104, 123, 247, 33, 37, 223, 199, 41, 54, 171, 48, 138, 6, 82, 233, 87, + 13, 164, 146, 26, 72, 165, 31, 13, 164, 242, 60, 6, 82, 86, 51, 80, 89, 51, 97, 32, 149, 53, + 204, 8, 42, 107, 12, 53, 149, 166, 102, 76, 134, 243, 190, 91, 96, 175, 180, 100, 137, 212, + 158, 223, 30, 168, 65, 168, 187, 16, 250, 135, 3, 69, 63, 108, 239, 33, 139, 218, 219, 202, + 22, 36, 30, 72, 92, 217, 50, 201, 50, 186, 126, 114, 231, 45, 119, 102, 142, 155, 198, 254, + 231, 126, 190, 198, 151, 151, 152, 125, 77, 179, 198, 175, 25, 72, 116, 141, 27, 201, 178, + 239, 60, 123, 255, 93, 104, 36, 40, 221, 197, 201, 119, 121, 183, 118, 16, 26, 200, 59, 170, + 141, 84, 164, 109, 164, 113, 220, 31, 87, 164, 78, 44, 42, 152, 141, 4, 166, 156, 88, 236, + 29, 176, 84, 4, 26, 217, 135, 231, 43, 194, 123, 253, 169, 194, 146, 158, 203, 195, 35, 80, + 145, 28, 69, 1, 129, 98, 69, 23, 93, 85, 223, 114, 0, 21, 20, 71, 183, 118, 122, 40, 152, + 35, 185, 29, 86, 245, 32, 131, 190, 159, 223, 3, 85, 194, 233, 120, 137, 209, 90, 197, 222, + 108, 6, 107, 164, 6, 127, 85, 234, 85, 68, 204, 89, 86, 33, 140, 142, 5, 51, 116, 193, 10, + 29, 94, 244, 5, 63, 137, 234, 106, 136, 98, 208, 9, 163, 177, 188, 133, 21, 194, 142, 49, + 103, 52, 79, 24, 10, 230, 219, 243, 92, 147, 143, 38, 92, 194, 167, 174, 216, 28, 179, 133, + 53, 247, 6, 45, 94, 188, 212, 230, 222, 154, 88, 221, 66, 11, 107, 88, 135, 13, 97, 118, 93, + 189, 218, 112, 55, 54, 220, 13, 245, 216, 112, 132, 126, 247, 219, 190, 225, 242, 240, 48, + 116, 43, 22, 47, 61, 81, 53, 150, 88, 42, 216, 0, 141, 37, 244, 50, 232, 58, 162, 2, 253, + 88, 60, 90, 34, 211, 83, 214, 24, 241, 230, 211, 83, 23, 111, 62, 218, 134, 23, 109, 35, 70, + 64, 71, 9, 56, 99, 154, 21, 64, 2, 196, 132, 18, 55, 165, 184, 217, 75, 58, 161, 193, 72, + 11, 13, 193, 105, 239, 71, 226, 3, 222, 66, 87, 202, 132, 44, 214, 66, 47, 51, 33, 111, 33, + 98, 150, 22, 204, 44, 19, 239, 178, 226, 3, 58, 46, 205, 89, 81, 197, 233, 24, 167, 142, 67, + 172, 98, 30, 102, 21, 236, 85, 73, 9, 115, 40, 54, 135, 221, 145, 122, 133, 229, 45, 45, + 209, 233, 245, 104, 106, 181, 254, 212, 215, 9, 165, 37, 244, 162, 95, 44, 76, 188, 78, 225, + 246, 212, 188, 125, 199, 218, 175, 47, 8, 62, 123, 106, 109, 95, 226, 211, 63, 13, 60, 81, + 91, 157, 169, 109, 105, 246, 158, 122, 112, 219, 183, 67, 109, 67, 111, 95, 115, 245, 95, + 223, 216, 244, 221, 166, 198, 108, 253, 92, 238, 232, 179, 71, 55, 173, 90, 57, 175, 121, + 201, 154, 235, 54, 221, 123, 228, 207, 115, 179, 115, 42, 172, 228, 236, 225, 207, 110, 219, + 184, 114, 222, 188, 75, 175, 234, 191, 246, 251, 7, 126, 67, 26, 29, 214, 234, 236, 68, 27, + 90, 93, 11, 250, 38, 7, 250, 38, 137, 20, 78, 243, 76, 19, 223, 207, 164, 118, 193, 142, + 233, 187, 96, 7, 56, 38, 118, 193, 166, 64, 62, 61, 90, 205, 52, 101, 152, 90, 113, 239, + 101, 39, 220, 8, 172, 5, 19, 122, 40, 250, 82, 92, 79, 12, 138, 204, 77, 108, 238, 172, 180, + 60, 190, 217, 83, 220, 30, 230, 152, 242, 75, 216, 161, 200, 65, 197, 83, 206, 246, 31, 47, + 40, 110, 140, 230, 98, 25, 180, 207, 49, 197, 238, 160, 145, 90, 193, 249, 61, 142, 139, + 186, 22, 199, 244, 131, 114, 27, 100, 116, 132, 98, 153, 54, 135, 240, 137, 162, 55, 176, + 19, 208, 140, 18, 31, 70, 10, 30, 221, 8, 124, 14, 250, 73, 39, 160, 66, 22, 171, 206, 196, + 106, 155, 213, 99, 165, 213, 194, 148, 195, 239, 98, 107, 45, 251, 8, 167, 161, 129, 30, + 106, 215, 58, 28, 51, 14, 46, 53, 186, 140, 253, 207, 57, 22, 112, 156, 102, 173, 102, 45, + 199, 45, 112, 60, 183, 223, 176, 244, 235, 137, 221, 137, 239, 125, 189, 164, 228, 24, 31, + 126, 244, 249, 163, 175, 31, 125, 253, 249, 71, 207, 236, 137, 52, 99, 224, 109, 80, 247, + 212, 18, 70, 98, 52, 182, 150, 201, 102, 85, 3, 250, 180, 6, 138, 198, 215, 6, 61, 155, 247, + 114, 84, 207, 230, 125, 241, 120, 108, 45, 171, 95, 48, 225, 158, 175, 0, 19, 215, 133, 51, + 59, 23, 103, 54, 39, 156, 86, 76, 153, 44, 64, 54, 171, 17, 245, 168, 146, 73, 69, 106, 68, + 145, 226, 254, 89, 241, 20, 178, 202, 2, 90, 41, 98, 244, 92, 72, 43, 243, 49, 122, 246, + 208, 61, 181, 53, 155, 110, 160, 116, 122, 157, 78, 47, 140, 214, 48, 159, 175, 228, 57, + 105, 228, 140, 254, 94, 22, 142, 49, 138, 54, 6, 121, 86, 234, 135, 157, 121, 86, 161, 185, + 57, 238, 12, 230, 5, 27, 27, 35, 180, 179, 15, 207, 183, 240, 27, 169, 130, 244, 51, 200, + 34, 13, 165, 103, 30, 103, 231, 211, 80, 58, 111, 198, 198, 123, 202, 225, 102, 110, 54, + 254, 78, 28, 110, 102, 231, 178, 57, 151, 157, 203, 229, 102, 235, 230, 99, 154, 20, 252, + 229, 58, 89, 157, 19, 235, 156, 208, 130, 25, 59, 220, 36, 217, 52, 186, 155, 190, 143, 159, + 157, 218, 98, 169, 145, 54, 127, 150, 36, 254, 150, 248, 115, 226, 92, 226, 15, 45, 107, + 201, 114, 178, 124, 75, 232, 123, 247, 255, 236, 167, 151, 220, 242, 241, 199, 107, 230, + 145, 191, 98, 205, 191, 19, 227, 191, 107, 94, 72, 111, 153, 206, 205, 57, 50, 246, 193, + 159, 53, 171, 217, 214, 10, 227, 109, 152, 180, 123, 114, 147, 170, 105, 223, 156, 228, 67, + 129, 142, 126, 115, 242, 68, 234, 155, 19, 103, 106, 245, 247, 144, 130, 44, 170, 225, 229, + 234, 169, 137, 226, 194, 253, 82, 142, 54, 96, 54, 185, 132, 35, 71, 90, 70, 121, 182, 55, + 242, 140, 239, 141, 94, 74, 239, 141, 94, 164, 123, 163, 125, 224, 230, 220, 236, 219, 17, + 163, 73, 111, 50, 210, 111, 71, 178, 109, 140, 61, 135, 178, 231, 194, 43, 244, 184, 146, + 126, 168, 242, 42, 61, 135, 218, 231, 204, 203, 205, 115, 178, 111, 71, 204, 86, 179, 5, + 145, 33, 183, 219, 149, 151, 231, 74, 125, 80, 20, 119, 231, 57, 129, 125, 222, 149, 231, + 238, 232, 141, 150, 116, 133, 227, 193, 188, 18, 183, 128, 75, 66, 68, 49, 129, 98, 4, 186, + 115, 113, 3, 93, 160, 245, 184, 235, 82, 56, 250, 33, 137, 217, 169, 88, 156, 116, 111, 155, + 231, 164, 21, 185, 78, 164, 89, 45, 244, 253, 105, 183, 217, 52, 227, 171, 32, 179, 217, 66, + 191, 10, 50, 225, 22, 41, 253, 85, 16, 253, 198, 178, 36, 173, 24, 7, 221, 237, 212, 167, + 149, 162, 199, 45, 238, 27, 101, 173, 33, 178, 146, 124, 233, 27, 77, 37, 164, 129, 232, + 231, 214, 239, 126, 255, 131, 69, 11, 138, 19, 82, 190, 135, 127, 32, 253, 57, 201, 57, 78, + 243, 228, 189, 95, 214, 48, 252, 76, 27, 251, 27, 185, 82, 224, 163, 197, 145, 155, 175, + 201, 106, 254, 27, 152, 12, 236, 107, 83, 69, 190, 181, 59, 157, 159, 107, 60, 55, 102, 0, + 253, 26, 228, 53, 164, 254, 14, 20, 161, 126, 73, 162, 30, 10, 13, 144, 120, 42, 49, 100, + 152, 241, 87, 226, 228, 54, 205, 67, 42, 70, 63, 82, 213, 60, 13, 79, 240, 95, 129, 167, + 121, 0, 3, 166, 185, 200, 159, 208, 61, 13, 183, 106, 2, 240, 3, 172, 187, 26, 83, 3, 210, + 183, 242, 223, 129, 16, 242, 119, 97, 121, 21, 230, 43, 52, 129, 228, 49, 164, 215, 98, 186, + 3, 147, 140, 73, 194, 84, 138, 169, 10, 83, 32, 69, 163, 121, 29, 182, 217, 67, 19, 222, + 163, 133, 222, 135, 229, 0, 219, 245, 95, 129, 15, 181, 175, 64, 182, 118, 37, 122, 142, 87, + 160, 23, 147, 135, 226, 252, 239, 64, 210, 5, 96, 41, 38, 31, 231, 129, 114, 228, 213, 33, + 62, 15, 235, 74, 245, 119, 33, 207, 43, 172, 126, 113, 138, 111, 49, 150, 235, 248, 173, + 152, 175, 132, 22, 90, 71, 19, 62, 71, 105, 10, 47, 68, 122, 0, 251, 255, 22, 142, 249, 117, + 204, 91, 249, 39, 224, 62, 94, 125, 118, 1, 115, 63, 182, 149, 185, 187, 88, 238, 167, 57, + 210, 61, 108, 236, 91, 65, 66, 57, 72, 154, 167, 147, 187, 16, 175, 162, 56, 202, 70, 66, + 220, 151, 106, 87, 138, 105, 33, 182, 153, 139, 227, 164, 237, 202, 105, 27, 172, 243, 97, + 191, 53, 152, 231, 81, 185, 96, 189, 143, 43, 133, 42, 242, 18, 220, 137, 249, 102, 190, 28, + 230, 166, 100, 191, 7, 235, 55, 81, 126, 30, 146, 71, 48, 221, 66, 121, 168, 108, 176, 207, + 115, 0, 231, 26, 81, 29, 59, 180, 255, 137, 50, 92, 155, 76, 34, 189, 134, 233, 1, 117, 144, + 170, 187, 143, 214, 209, 103, 225, 252, 176, 157, 213, 173, 197, 251, 174, 5, 29, 242, 68, + 113, 44, 33, 126, 57, 211, 243, 10, 44, 239, 68, 122, 64, 243, 19, 40, 70, 254, 6, 178, 50, + 241, 20, 43, 175, 133, 28, 29, 176, 156, 38, 208, 65, 242, 255, 176, 246, 42, 157, 62, 195, + 87, 176, 31, 166, 39, 128, 228, 229, 106, 158, 216, 147, 202, 119, 78, 45, 39, 171, 105, + 142, 178, 199, 223, 100, 57, 211, 41, 213, 237, 164, 68, 245, 57, 57, 33, 143, 57, 173, 207, + 233, 9, 159, 103, 117, 74, 191, 210, 180, 84, 72, 117, 79, 229, 79, 199, 70, 117, 65, 199, + 166, 230, 137, 61, 169, 124, 231, 212, 114, 178, 132, 230, 216, 54, 68, 199, 70, 245, 60, + 61, 49, 93, 7, 146, 71, 82, 249, 126, 154, 82, 122, 86, 245, 61, 61, 81, 91, 86, 235, 165, + 41, 9, 212, 177, 209, 28, 251, 127, 33, 37, 163, 23, 82, 227, 249, 69, 170, 252, 139, 212, + 184, 182, 167, 100, 183, 61, 53, 190, 94, 58, 150, 148, 76, 123, 105, 78, 203, 116, 110, + 160, 206, 111, 163, 243, 86, 171, 192, 50, 42, 55, 106, 175, 76, 166, 140, 63, 121, 11, 197, + 105, 206, 248, 83, 244, 116, 78, 231, 19, 181, 105, 108, 46, 80, 28, 249, 110, 164, 101, + 170, 3, 77, 125, 242, 67, 150, 7, 84, 253, 208, 185, 70, 237, 157, 206, 55, 74, 155, 156, + 115, 235, 80, 103, 43, 161, 2, 101, 67, 109, 130, 205, 133, 233, 57, 211, 157, 250, 172, 10, + 197, 49, 63, 64, 203, 104, 20, 85, 200, 67, 83, 29, 157, 51, 211, 115, 58, 135, 233, 60, + 154, 158, 51, 91, 90, 73, 99, 191, 100, 57, 157, 99, 20, 231, 246, 131, 144, 234, 79, 250, + 130, 156, 205, 125, 58, 255, 166, 231, 234, 252, 79, 158, 83, 19, 216, 48, 149, 98, 122, 9, + 211, 205, 152, 126, 137, 244, 143, 48, 253, 148, 255, 45, 108, 161, 188, 6, 117, 190, 126, + 7, 211, 143, 104, 66, 90, 43, 38, 79, 42, 117, 99, 250, 178, 230, 40, 44, 70, 190, 61, 152, + 44, 200, 179, 30, 83, 32, 53, 207, 114, 212, 127, 251, 145, 248, 54, 38, 206, 64, 253, 230, + 111, 161, 143, 59, 11, 151, 105, 187, 160, 88, 255, 119, 120, 89, 255, 119, 242, 40, 218, + 83, 25, 157, 171, 218, 67, 208, 136, 101, 183, 254, 239, 154, 191, 96, 254, 48, 166, 251, + 49, 61, 70, 19, 127, 55, 220, 146, 26, 103, 105, 106, 220, 139, 213, 241, 226, 252, 102, 99, + 103, 207, 244, 209, 164, 103, 19, 82, 190, 192, 131, 41, 63, 157, 227, 96, 10, 190, 240, 90, + 70, 47, 98, 194, 235, 199, 154, 101, 156, 247, 130, 215, 89, 237, 34, 109, 66, 247, 142, + 129, 100, 56, 50, 206, 154, 202, 76, 47, 210, 203, 188, 41, 243, 160, 229, 201, 172, 62, + 225, 42, 225, 42, 235, 150, 236, 103, 114, 250, 109, 87, 229, 122, 255, 247, 250, 223, 235, + 127, 210, 197, 254, 207, 192, 109, 240, 93, 92, 244, 250, 128, 126, 111, 221, 139, 179, 180, + 19, 16, 229, 234, 49, 58, 165, 75, 116, 189, 230, 219, 227, 241, 211, 92, 128, 241, 24, 75, + 139, 165, 244, 255, 208, 225, 49, 190, 87, 113, 14, 154, 112, 117, 81, 113, 30, 183, 16, + 233, 255, 205, 161, 69, 223, 253, 205, 20, 174, 67, 250, 227, 244, 127, 249, 240, 180, 7, + 11, 60, 151, 194, 121, 220, 19, 254, 156, 225, 90, 164, 27, 225, 157, 20, 206, 131, 29, 78, + 50, 92, 199, 248, 255, 158, 194, 145, 159, 104, 25, 174, 71, 186, 129, 20, 166, 112, 30, + 108, 164, 148, 225, 25, 216, 219, 14, 50, 55, 133, 19, 48, 18, 37, 133, 83, 254, 231, 83, + 56, 7, 219, 48, 230, 80, 113, 108, 171, 105, 72, 225, 90, 104, 210, 116, 166, 112, 29, 210, + 239, 96, 184, 145, 142, 65, 243, 253, 20, 142, 99, 208, 60, 201, 112, 19, 253, 90, 93, 115, + 40, 133, 243, 80, 160, 249, 53, 195, 205, 180, 47, 205, 103, 41, 156, 222, 255, 115, 134, + 91, 144, 46, 112, 153, 41, 156, 135, 124, 244, 243, 20, 23, 232, 125, 184, 64, 10, 199, 251, + 112, 234, 24, 114, 144, 174, 227, 54, 164, 112, 30, 121, 54, 51, 220, 70, 199, 195, 221, + 150, 194, 113, 60, 220, 119, 24, 158, 139, 116, 27, 247, 84, 10, 231, 65, 228, 84, 217, 218, + 25, 255, 135, 41, 156, 242, 255, 11, 195, 243, 40, 63, 175, 77, 225, 200, 143, 144, 226, 30, + 218, 47, 31, 72, 225, 216, 47, 223, 194, 240, 66, 170, 35, 254, 178, 20, 142, 58, 226, 175, + 100, 56, 253, 203, 47, 11, 198, 211, 42, 142, 247, 231, 111, 165, 184, 129, 245, 203, 127, + 63, 133, 83, 58, 147, 155, 153, 201, 147, 63, 148, 194, 41, 253, 13, 134, 51, 185, 241, 127, + 76, 225, 40, 55, 254, 179, 182, 205, 91, 110, 186, 126, 195, 186, 245, 219, 196, 178, 53, + 229, 98, 109, 32, 48, 187, 42, 208, 32, 46, 238, 187, 161, 191, 111, 219, 182, 170, 174, + 158, 53, 215, 246, 92, 223, 91, 45, 46, 232, 239, 23, 25, 219, 86, 241, 250, 190, 173, 125, + 215, 239, 232, 235, 173, 94, 177, 97, 83, 223, 214, 214, 205, 253, 189, 211, 184, 155, 68, + 86, 35, 210, 170, 38, 113, 101, 223, 245, 91, 55, 108, 190, 78, 172, 173, 246, 139, 101, + 211, 56, 203, 39, 24, 255, 107, 182, 42, 202, 6, 151, 178, 191, 142, 190, 30, 54, 192, 54, + 232, 129, 21, 152, 111, 66, 202, 86, 220, 66, 79, 175, 217, 78, 50, 225, 58, 248, 227, 20, + 158, 9, 234, 98, 228, 233, 135, 29, 176, 22, 107, 122, 167, 240, 76, 173, 89, 136, 112, 27, + 94, 147, 57, 210, 180, 54, 216, 12, 91, 224, 38, 214, 231, 58, 88, 143, 20, 17, 202, 96, 13, + 148, 99, 94, 139, 65, 81, 0, 102, 67, 21, 194, 6, 118, 215, 62, 184, 1, 239, 171, 182, 172, + 130, 46, 236, 101, 13, 92, 139, 240, 122, 236, 165, 26, 57, 22, 176, 127, 122, 34, 78, 186, + 219, 86, 86, 162, 125, 246, 97, 190, 131, 141, 167, 122, 210, 72, 90, 177, 255, 126, 164, + 125, 241, 189, 155, 216, 115, 79, 140, 62, 221, 138, 210, 87, 178, 59, 111, 197, 218, 205, + 40, 21, 58, 234, 106, 12, 140, 232, 83, 124, 241, 61, 203, 207, 123, 199, 255, 23, 119, 171, + 26, 191, 219, 197, 106, 122, 41, 230, 235, 49, 223, 129, 237, 40, 101, 251, 20, 222, 153, + 181, 139, 176, 101, 15, 214, 77, 230, 74, 211, 22, 162, 101, 244, 227, 184, 254, 29, 249, + 255, 136, 180, 169, 90, 159, 90, 151, 110, 179, 53, 245, 84, 155, 207, 123, 199, 137, 218, + 149, 12, 155, 204, 163, 82, 38, 219, 219, 182, 11, 90, 226, 54, 148, 217, 102, 246, 212, + 219, 97, 117, 74, 194, 83, 165, 114, 190, 250, 201, 146, 218, 124, 65, 25, 110, 230, 11, + 249, 249, 252, 92, 190, 141, 175, 231, 27, 249, 32, 63, 143, 239, 68, 231, 52, 137, 251, + 188, 245, 11, 103, 140, 87, 165, 116, 210, 81, 147, 90, 236, 127, 114, 221, 4, 245, 98, 245, + 122, 145, 99, 191, 232, 251, 125, 145, 222, 57, 117, 45, 78, 250, 217, 255, 92, 152, 241, + 179, 192, 130, 161, 43, 64, 33, 46, 201, 17, 156, 167, 62, 124, 210, 10, 148, 119, 57, 8, + 184, 136, 181, 85, 40, 5, 206, 206, 203, 91, 21, 78, 115, 77, 144, 123, 60, 64, 182, 5, 185, + 43, 2, 100, 251, 53, 177, 64, 40, 208, 46, 251, 66, 251, 103, 47, 159, 187, 56, 20, 208, 25, + 42, 20, 142, 187, 38, 168, 191, 179, 247, 190, 222, 63, 244, 114, 91, 131, 250, 197, 189, + 123, 122, 63, 239, 231, 182, 5, 51, 194, 125, 95, 237, 221, 222, 247, 110, 47, 191, 253, 26, + 122, 140, 219, 219, 222, 122, 0, 7, 185, 1, 174, 163, 255, 182, 163, 125, 24, 214, 183, 31, + 32, 78, 20, 160, 155, 149, 159, 7, 61, 78, 144, 74, 100, 11, 181, 42, 179, 234, 124, 97, + 159, 91, 98, 223, 184, 33, 129, 245, 225, 185, 189, 255, 246, 135, 111, 191, 251, 246, 71, + 110, 191, 231, 246, 71, 111, 191, 247, 84, 255, 169, 135, 79, 221, 125, 234, 145, 83, 247, + 156, 122, 244, 212, 189, 150, 173, 65, 247, 162, 135, 23, 221, 189, 232, 145, 69, 247, 44, + 122, 116, 209, 189, 235, 250, 215, 61, 188, 238, 238, 117, 143, 172, 187, 103, 221, 163, + 235, 238, 205, 220, 22, 109, 186, 58, 200, 153, 183, 144, 173, 209, 140, 171, 175, 25, 134, + 254, 246, 13, 242, 106, 113, 112, 205, 224, 224, 154, 17, 226, 36, 238, 193, 232, 162, 29, + 27, 66, 242, 134, 144, 115, 4, 103, 86, 182, 111, 4, 135, 73, 225, 38, 6, 175, 67, 168, 56, + 69, 148, 199, 190, 252, 32, 59, 66, 163, 255, 154, 164, 181, 77, 110, 91, 221, 74, 255, 57, + 137, 226, 32, 233, 87, 25, 171, 90, 135, 161, 39, 198, 173, 170, 247, 209, 156, 191, 146, + 230, 37, 49, 237, 151, 235, 241, 54, 69, 48, 59, 164, 100, 2, 114, 88, 59, 151, 135, 163, + 75, 124, 145, 33, 147, 12, 70, 25, 58, 47, 151, 219, 175, 108, 85, 33, 253, 239, 43, 113, + 47, 238, 78, 67, 33, 247, 144, 215, 27, 146, 164, 208, 142, 246, 13, 44, 57, 35, 49, 79, 80, + 223, 214, 190, 97, 69, 43, 251, 87, 62, 11, 156, 240, 125, 212, 216, 15, 48, 61, 136, 233, + 39, 152, 30, 199, 244, 4, 166, 231, 48, 69, 49, 41, 152, 14, 96, 122, 30, 211, 207, 160, 43, + 52, 233, 39, 242, 127, 1, 79, 131, 119, 140, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, + 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 54, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, + 76, 101, 110, 103, 116, 104, 32, 50, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, + 156, 83, 96, 178, 97, 96, 104, 96, 96, 144, 100, 224, 20, 96, 192, 2, 0, 29, 84, 1, 17, 13, + 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 54, + 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, + 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 56, 50, 49, 49, + 47, 76, 101, 110, 103, 116, 104, 49, 32, 49, 52, 51, 56, 48, 62, 62, 115, 116, 114, 101, 97, + 109, 13, 10, 120, 156, 237, 122, 121, 124, 91, 197, 181, 240, 25, 221, 43, 201, 150, 183, + 107, 91, 150, 23, 73, 246, 149, 174, 45, 47, 242, 38, 203, 155, 28, 39, 86, 180, 24, 39, 14, + 137, 179, 96, 164, 4, 130, 215, 36, 46, 206, 66, 156, 132, 176, 165, 1, 10, 20, 37, 161, 44, + 5, 82, 104, 104, 72, 95, 89, 66, 129, 123, 101, 18, 236, 80, 192, 64, 8, 107, 32, 208, 144, + 210, 210, 54, 164, 164, 60, 94, 27, 150, 126, 63, 250, 40, 133, 232, 190, 51, 35, 57, 49, + 129, 208, 254, 190, 143, 255, 190, 167, 155, 115, 230, 204, 204, 153, 153, 51, 103, 155, + 185, 206, 5, 2, 0, 105, 176, 25, 56, 232, 154, 183, 176, 166, 174, 35, 176, 108, 11, 182, + 252, 30, 161, 187, 127, 101, 239, 26, 195, 35, 89, 42, 0, 169, 3, 224, 95, 235, 223, 176, + 78, 92, 121, 223, 90, 30, 64, 135, 221, 154, 208, 178, 53, 203, 87, 62, 254, 164, 226, 6, + 72, 10, 1, 24, 110, 91, 62, 124, 217, 178, 155, 172, 219, 7, 0, 178, 254, 10, 144, 177, 117, + 197, 96, 239, 192, 129, 253, 29, 79, 1, 216, 47, 197, 1, 141, 43, 176, 161, 230, 203, 107, + 37, 172, 63, 140, 245, 226, 21, 43, 215, 109, 124, 80, 253, 243, 32, 214, 223, 192, 57, 249, + 225, 213, 253, 189, 186, 52, 231, 213, 0, 101, 111, 1, 112, 252, 202, 222, 141, 107, 116, + 51, 244, 243, 1, 156, 191, 69, 126, 113, 85, 239, 202, 193, 188, 237, 59, 112, 126, 231, + 231, 184, 222, 162, 53, 171, 71, 214, 169, 165, 176, 12, 167, 62, 151, 246, 175, 89, 59, + 184, 134, 44, 56, 126, 59, 214, 87, 162, 204, 79, 3, 225, 230, 104, 126, 5, 90, 72, 215, + 222, 165, 117, 67, 37, 41, 97, 229, 28, 110, 39, 44, 211, 100, 17, 173, 70, 147, 196, 233, + 180, 218, 100, 14, 119, 244, 213, 95, 71, 151, 40, 130, 13, 196, 47, 52, 218, 139, 99, 237, + 196, 173, 95, 74, 112, 23, 112, 91, 162, 91, 3, 132, 149, 70, 212, 26, 82, 154, 66, 208, + 105, 12, 180, 129, 64, 162, 231, 244, 143, 32, 247, 228, 168, 111, 255, 145, 4, 23, 7, 60, + 202, 172, 3, 61, 36, 65, 50, 24, 32, 5, 82, 209, 66, 233, 144, 1, 2, 100, 66, 22, 100, 227, + 186, 57, 96, 130, 92, 200, 131, 124, 40, 0, 51, 88, 192, 10, 133, 80, 4, 84, 102, 59, 72, + 80, 12, 37, 224, 128, 82, 40, 131, 114, 168, 0, 39, 84, 66, 21, 84, 67, 13, 212, 130, 11, + 234, 192, 13, 245, 208, 0, 141, 208, 4, 205, 224, 129, 22, 152, 6, 173, 48, 29, 102, 64, 27, + 120, 97, 38, 248, 192, 15, 1, 8, 66, 59, 156, 3, 29, 48, 11, 102, 67, 39, 204, 129, 115, 97, + 46, 204, 131, 46, 152, 15, 11, 96, 33, 44, 130, 243, 160, 27, 206, 135, 16, 132, 97, 49, 44, + 129, 11, 224, 66, 88, 10, 23, 65, 15, 202, 127, 59, 220, 9, 119, 193, 79, 225, 63, 224, 65, + 120, 20, 246, 194, 99, 48, 6, 191, 130, 125, 240, 20, 60, 3, 207, 193, 179, 176, 31, 158, + 135, 23, 225, 5, 120, 9, 94, 134, 87, 225, 53, 56, 8, 175, 195, 27, 112, 8, 222, 130, 195, + 112, 4, 126, 67, 22, 193, 122, 232, 135, 1, 88, 65, 186, 225, 10, 136, 194, 8, 12, 147, 30, + 184, 12, 134, 200, 48, 108, 135, 135, 200, 16, 108, 32, 43, 201, 42, 180, 250, 229, 164, + 143, 12, 146, 1, 210, 73, 190, 7, 43, 225, 251, 164, 23, 158, 134, 95, 195, 22, 232, 131, + 213, 100, 5, 153, 73, 46, 38, 253, 176, 10, 54, 147, 243, 81, 167, 219, 208, 118, 15, 144, + 66, 82, 68, 230, 144, 115, 201, 124, 178, 128, 204, 37, 243, 224, 77, 178, 26, 126, 71, 90, + 224, 106, 24, 36, 97, 178, 152, 92, 69, 54, 145, 243, 200, 114, 210, 69, 22, 146, 16, 220, + 2, 59, 224, 71, 112, 15, 220, 13, 59, 225, 94, 216, 5, 63, 131, 251, 224, 126, 220, 225, 47, + 224, 97, 120, 4, 126, 9, 7, 136, 15, 107, 235, 72, 144, 180, 147, 115, 224, 42, 50, 155, + 116, 16, 63, 240, 26, 25, 91, 31, 192, 136, 210, 161, 254, 55, 33, 245, 48, 60, 129, 26, + 120, 18, 165, 155, 64, 29, 60, 139, 90, 216, 15, 7, 224, 40, 188, 11, 199, 224, 79, 240, 30, + 28, 135, 247, 225, 175, 160, 18, 32, 132, 104, 8, 71, 120, 162, 39, 169, 36, 157, 100, 19, + 19, 49, 163, 196, 118, 34, 17, 39, 169, 37, 46, 210, 68, 102, 224, 26, 231, 162, 124, 75, + 72, 47, 219, 253, 197, 100, 4, 101, 190, 85, 243, 130, 230, 37, 205, 31, 184, 9, 209, 40, + 22, 136, 133, 162, 93, 116, 136, 181, 98, 139, 24, 16, 215, 137, 191, 180, 217, 109, 14, + 187, 198, 174, 179, 103, 216, 179, 236, 57, 246, 2, 123, 161, 221, 105, 239, 176, 247, 216, + 7, 75, 94, 254, 248, 243, 79, 52, 95, 104, 84, 149, 70, 15, 238, 242, 65, 220, 23, 149, 244, + 169, 41, 146, 62, 143, 182, 58, 45, 233, 159, 225, 63, 225, 196, 20, 73, 181, 40, 105, 26, + 201, 64, 73, 115, 81, 187, 84, 210, 10, 82, 141, 146, 54, 18, 15, 90, 96, 14, 74, 58, 159, + 44, 69, 73, 251, 201, 247, 200, 42, 178, 17, 37, 61, 128, 146, 190, 141, 146, 102, 139, 121, + 162, 69, 20, 153, 164, 158, 175, 73, 154, 137, 146, 230, 159, 146, 116, 0, 37, 253, 240, 19, + 242, 5, 81, 85, 245, 79, 234, 51, 234, 115, 234, 243, 234, 139, 234, 203, 234, 171, 234, 65, + 245, 53, 245, 117, 245, 144, 250, 134, 250, 166, 250, 107, 245, 176, 250, 150, 122, 68, 253, + 141, 250, 182, 250, 91, 245, 119, 234, 59, 234, 239, 213, 63, 168, 127, 84, 143, 170, 239, + 170, 199, 88, 121, 140, 81, 71, 25, 253, 91, 228, 187, 29, 71, 189, 129, 227, 95, 85, 95, + 65, 120, 153, 225, 23, 213, 3, 234, 179, 234, 163, 177, 43, 99, 87, 196, 86, 158, 220, 114, + 204, 115, 172, 241, 88, 195, 177, 250, 99, 174, 99, 101, 199, 196, 99, 185, 239, 126, 240, + 174, 242, 238, 140, 119, 167, 29, 237, 57, 122, 225, 209, 243, 142, 46, 250, 227, 240, 209, + 185, 71, 59, 143, 182, 29, 149, 142, 166, 30, 77, 126, 231, 23, 153, 215, 102, 94, 169, 219, + 244, 181, 44, 240, 255, 241, 79, 0, 253, 82, 253, 82, 237, 243, 218, 237, 218, 43, 180, 27, + 181, 235, 181, 139, 1, 40, 240, 86, 237, 149, 220, 40, 23, 213, 36, 107, 222, 34, 191, 230, + 238, 196, 167, 155, 171, 215, 184, 240, 41, 140, 143, 84, 255, 140, 207, 239, 99, 75, 99, + 190, 152, 79, 179, 148, 172, 209, 46, 214, 56, 249, 127, 78, 206, 75, 118, 145, 159, 106, + 114, 249, 114, 8, 146, 42, 248, 49, 177, 99, 206, 242, 129, 143, 20, 99, 102, 90, 136, 185, + 237, 35, 244, 84, 63, 188, 79, 180, 136, 187, 49, 191, 236, 193, 220, 176, 21, 99, 113, 38, + 122, 121, 19, 142, 136, 115, 231, 96, 182, 232, 102, 220, 239, 96, 142, 123, 159, 100, 96, + 123, 55, 214, 226, 220, 163, 56, 150, 114, 55, 161, 57, 63, 133, 79, 73, 58, 252, 13, 35, + 55, 138, 109, 87, 192, 221, 223, 220, 138, 227, 91, 48, 115, 44, 194, 242, 113, 4, 63, 102, + 0, 63, 102, 100, 218, 186, 8, 219, 107, 89, 107, 117, 162, 213, 253, 141, 143, 7, 55, 215, + 132, 112, 102, 187, 13, 159, 18, 108, 15, 34, 140, 96, 132, 222, 140, 16, 1, 122, 146, 110, + 128, 63, 96, 150, 126, 11, 115, 46, 96, 230, 141, 255, 250, 80, 150, 245, 152, 245, 188, + 164, 26, 251, 174, 130, 139, 81, 159, 251, 88, 207, 116, 6, 211, 191, 178, 2, 157, 155, 249, + 44, 169, 64, 104, 197, 44, 12, 240, 7, 146, 143, 116, 58, 27, 35, 179, 163, 173, 70, 179, + 152, 228, 196, 241, 20, 3, 235, 241, 153, 250, 99, 243, 120, 59, 103, 207, 234, 56, 167, 61, + 24, 240, 251, 102, 122, 219, 102, 76, 111, 157, 214, 226, 105, 110, 106, 108, 168, 119, 215, + 185, 106, 107, 170, 171, 42, 157, 21, 229, 101, 165, 142, 146, 98, 201, 110, 19, 139, 10, + 173, 22, 115, 65, 126, 94, 174, 41, 199, 152, 157, 149, 41, 100, 164, 167, 165, 166, 24, + 146, 147, 244, 58, 45, 207, 105, 8, 84, 202, 57, 206, 170, 74, 177, 61, 18, 153, 37, 111, + 238, 235, 169, 170, 148, 11, 253, 33, 34, 19, 103, 36, 130, 168, 87, 148, 161, 43, 36, 147, + 158, 240, 10, 153, 115, 154, 109, 241, 95, 24, 7, 200, 112, 94, 72, 214, 148, 100, 54, 35, + 181, 32, 212, 96, 182, 133, 27, 204, 147, 125, 17, 159, 95, 80, 192, 24, 89, 99, 220, 67, + 143, 104, 98, 252, 36, 187, 53, 84, 131, 44, 217, 70, 81, 73, 83, 35, 231, 73, 254, 197, + 162, 156, 46, 249, 66, 65, 41, 216, 35, 115, 193, 30, 41, 52, 24, 86, 120, 174, 68, 42, 153, + 53, 32, 137, 145, 200, 64, 239, 192, 24, 60, 211, 21, 146, 132, 22, 58, 107, 56, 190, 114, + 120, 84, 67, 8, 152, 132, 136, 216, 218, 59, 40, 9, 173, 33, 113, 140, 192, 121, 114, 186, + 255, 130, 197, 40, 163, 73, 16, 39, 204, 54, 49, 138, 249, 115, 150, 100, 106, 14, 75, 108, + 73, 51, 118, 196, 197, 234, 92, 24, 26, 37, 120, 29, 201, 233, 200, 153, 133, 187, 77, 108, + 109, 115, 223, 10, 133, 135, 28, 169, 89, 38, 57, 81, 2, 124, 102, 118, 19, 142, 8, 79, 238, + 197, 47, 249, 197, 72, 252, 145, 112, 212, 108, 44, 122, 21, 94, 235, 144, 28, 184, 207, 49, + 85, 93, 20, 178, 217, 100, 48, 99, 127, 123, 164, 189, 39, 114, 78, 228, 156, 158, 94, 89, + 236, 103, 26, 34, 61, 82, 112, 40, 80, 85, 25, 148, 218, 37, 92, 205, 209, 43, 243, 14, 169, + 163, 131, 53, 244, 96, 189, 103, 178, 142, 146, 205, 18, 229, 205, 11, 66, 202, 102, 111, 4, + 119, 214, 119, 213, 80, 158, 20, 220, 106, 182, 5, 195, 184, 94, 64, 178, 5, 80, 156, 96, + 32, 24, 192, 105, 229, 60, 228, 150, 245, 212, 60, 122, 167, 212, 59, 52, 136, 28, 205, 205, + 230, 83, 134, 9, 42, 229, 70, 167, 228, 179, 33, 39, 156, 66, 198, 160, 20, 136, 26, 137, + 49, 216, 131, 226, 144, 204, 44, 60, 21, 106, 64, 106, 171, 170, 28, 71, 63, 31, 8, 206, 15, + 73, 114, 207, 194, 144, 24, 148, 123, 182, 4, 204, 76, 219, 56, 19, 110, 147, 218, 67, 234, + 69, 29, 137, 145, 16, 154, 217, 140, 26, 11, 135, 232, 130, 131, 108, 69, 186, 75, 63, 221, + 103, 68, 242, 33, 255, 172, 10, 167, 51, 111, 28, 15, 48, 245, 186, 109, 123, 9, 199, 174, + 103, 129, 0, 174, 24, 210, 152, 185, 112, 82, 102, 150, 7, 80, 22, 210, 139, 254, 81, 85, + 25, 23, 216, 128, 226, 204, 26, 232, 71, 30, 136, 23, 180, 22, 137, 96, 37, 210, 191, 21, + 171, 74, 42, 95, 226, 187, 65, 206, 243, 135, 100, 17, 247, 157, 58, 32, 13, 108, 25, 243, + 66, 159, 20, 20, 229, 158, 174, 144, 205, 44, 202, 59, 177, 144, 55, 247, 155, 135, 100, + 111, 111, 79, 56, 108, 14, 134, 21, 107, 77, 36, 96, 166, 24, 53, 230, 156, 180, 146, 89, + 182, 58, 169, 192, 2, 157, 205, 166, 212, 128, 223, 122, 249, 159, 243, 228, 10, 167, 25, + 29, 110, 246, 184, 102, 51, 120, 101, 179, 127, 203, 214, 254, 22, 228, 178, 81, 129, 122, + 165, 16, 238, 120, 75, 24, 251, 155, 171, 42, 37, 81, 68, 123, 161, 233, 122, 101, 216, 218, + 204, 54, 34, 81, 19, 99, 143, 108, 115, 98, 161, 148, 96, 111, 208, 160, 148, 150, 97, 145, + 82, 85, 153, 170, 56, 74, 34, 1, 41, 144, 166, 148, 149, 210, 18, 245, 112, 61, 213, 236, + 108, 92, 166, 95, 18, 88, 220, 108, 49, 75, 131, 91, 113, 61, 12, 23, 173, 159, 74, 217, + 218, 106, 166, 10, 62, 126, 220, 124, 124, 127, 24, 59, 202, 133, 144, 56, 81, 99, 174, 14, + 35, 62, 197, 214, 106, 107, 53, 151, 31, 167, 195, 100, 41, 24, 194, 202, 9, 234, 24, 225, + 160, 149, 185, 146, 236, 53, 203, 155, 195, 5, 40, 16, 112, 200, 44, 10, 250, 244, 86, 155, + 89, 176, 73, 184, 98, 92, 17, 100, 81, 136, 152, 33, 204, 22, 16, 226, 92, 54, 234, 225, + 200, 216, 106, 78, 112, 77, 97, 99, 124, 79, 225, 141, 121, 0, 239, 188, 229, 120, 147, 29, + 0, 103, 112, 67, 112, 40, 111, 139, 207, 47, 5, 251, 124, 209, 228, 164, 242, 49, 116, 163, + 8, 110, 203, 47, 245, 162, 113, 49, 49, 132, 80, 95, 65, 49, 36, 39, 249, 251, 229, 100, + 127, 79, 56, 16, 140, 4, 35, 161, 62, 140, 20, 234, 224, 225, 184, 151, 82, 39, 162, 20, + 115, 55, 87, 181, 211, 57, 58, 88, 83, 238, 242, 85, 200, 46, 164, 234, 40, 85, 85, 57, 179, + 13, 6, 225, 114, 76, 123, 203, 9, 97, 152, 166, 192, 229, 160, 50, 28, 99, 248, 36, 195, 95, + 50, 252, 5, 195, 255, 100, 248, 115, 134, 255, 193, 240, 97, 134, 127, 205, 240, 155, 12, + 191, 193, 240, 33, 134, 95, 103, 248, 53, 134, 15, 50, 252, 42, 195, 175, 0, 204, 252, 4, + 203, 151, 89, 237, 37, 134, 95, 100, 248, 5, 134, 15, 48, 252, 60, 195, 251, 25, 126, 142, + 225, 103, 25, 126, 134, 225, 9, 134, 159, 102, 152, 190, 233, 12, 226, 29, 156, 98, 248, 26, + 126, 132, 225, 135, 25, 254, 37, 195, 15, 49, 188, 155, 225, 7, 25, 126, 224, 44, 99, 199, + 25, 30, 99, 248, 113, 134, 247, 50, 188, 135, 225, 199, 24, 30, 157, 194, 127, 9, 195, 171, + 48, 72, 7, 233, 249, 133, 248, 123, 12, 15, 177, 150, 229, 140, 198, 183, 63, 180, 53, 253, + 13, 16, 211, 20, 58, 255, 52, 253, 21, 188, 157, 225, 59, 25, 190, 131, 225, 219, 25, 254, + 49, 195, 183, 49, 124, 235, 89, 198, 254, 156, 225, 93, 12, 223, 203, 240, 78, 134, 127, + 198, 240, 61, 12, 239, 96, 248, 50, 148, 240, 171, 99, 215, 51, 188, 142, 225, 17, 134, 215, + 50, 188, 134, 225, 213, 12, 175, 100, 163, 134, 25, 189, 130, 209, 131, 140, 198, 57, 226, + 254, 26, 146, 235, 205, 178, 59, 236, 156, 234, 147, 82, 20, 144, 194, 19, 0, 35, 34, 24, + 48, 227, 153, 84, 17, 236, 199, 220, 51, 36, 69, 250, 105, 142, 166, 65, 211, 51, 6, 69, 61, + 145, 72, 239, 24, 136, 189, 17, 49, 24, 217, 18, 217, 138, 228, 22, 9, 189, 127, 168, 119, + 64, 46, 15, 118, 209, 196, 42, 110, 9, 216, 204, 82, 128, 70, 146, 205, 22, 45, 39, 229, + 254, 30, 26, 39, 173, 157, 11, 48, 102, 101, 152, 31, 178, 73, 244, 28, 137, 208, 196, 6, + 11, 34, 145, 5, 120, 162, 1, 134, 96, 56, 140, 108, 98, 144, 134, 173, 196, 210, 255, 76, + 103, 200, 25, 146, 167, 57, 241, 95, 252, 140, 154, 60, 148, 79, 31, 0, 144, 227, 167, 19, + 136, 178, 137, 165, 229, 156, 92, 127, 164, 115, 225, 98, 58, 15, 138, 123, 53, 69, 189, 50, + 183, 0, 79, 111, 150, 192, 68, 129, 182, 44, 8, 137, 164, 85, 132, 86, 154, 213, 198, 212, + 15, 45, 225, 176, 13, 115, 160, 226, 73, 42, 145, 156, 33, 192, 4, 23, 81, 146, 41, 77, 100, + 59, 37, 241, 0, 116, 154, 21, 125, 97, 69, 88, 54, 249, 167, 240, 217, 79, 243, 209, 33, + 134, 179, 241, 177, 206, 211, 243, 157, 149, 207, 126, 154, 207, 246, 13, 235, 162, 98, 55, + 247, 97, 94, 59, 24, 144, 240, 42, 176, 24, 207, 49, 81, 222, 22, 144, 194, 162, 252, 33, + 163, 207, 101, 244, 205, 140, 78, 99, 180, 216, 69, 105, 64, 154, 238, 143, 41, 154, 229, + 64, 158, 166, 85, 204, 126, 251, 49, 219, 85, 85, 98, 174, 222, 7, 153, 120, 139, 156, 27, + 28, 88, 224, 219, 7, 89, 120, 173, 236, 138, 147, 217, 216, 58, 143, 146, 79, 128, 17, 95, + 226, 59, 96, 54, 102, 251, 94, 172, 143, 86, 120, 202, 61, 65, 31, 117, 142, 94, 159, 215, + 157, 221, 108, 108, 210, 116, 76, 51, 206, 198, 119, 253, 118, 174, 163, 35, 179, 45, 211, + 171, 153, 21, 200, 234, 130, 115, 51, 231, 102, 207, 227, 59, 58, 179, 26, 97, 70, 226, 143, + 2, 13, 186, 14, 143, 54, 136, 201, 142, 230, 76, 49, 36, 202, 229, 254, 62, 185, 194, 223, + 223, 35, 23, 210, 132, 174, 45, 217, 32, 174, 64, 217, 209, 94, 98, 79, 100, 235, 150, 188, + 112, 88, 214, 58, 108, 226, 16, 26, 18, 179, 104, 128, 174, 73, 79, 147, 113, 250, 119, 10, + 243, 56, 190, 111, 22, 133, 153, 149, 43, 37, 95, 143, 92, 37, 249, 228, 246, 10, 166, 44, + 167, 191, 39, 34, 250, 23, 135, 20, 188, 216, 68, 182, 72, 254, 173, 97, 220, 233, 24, 212, + 98, 158, 166, 199, 50, 187, 108, 140, 169, 127, 179, 196, 47, 0, 99, 112, 199, 233, 14, 223, + 148, 142, 153, 26, 12, 45, 18, 213, 104, 114, 43, 232, 237, 130, 216, 170, 226, 127, 128, + 209, 120, 240, 21, 130, 195, 43, 43, 47, 131, 211, 78, 18, 63, 218, 14, 112, 242, 5, 26, + 106, 4, 211, 14, 125, 205, 248, 66, 135, 229, 29, 95, 96, 194, 229, 235, 128, 168, 215, 199, + 126, 68, 74, 9, 253, 211, 75, 39, 94, 71, 67, 10, 1, 188, 216, 121, 147, 73, 18, 166, 157, + 66, 21, 200, 152, 250, 199, 40, 100, 240, 78, 133, 232, 100, 218, 158, 74, 95, 137, 89, 251, + 7, 81, 157, 192, 59, 31, 227, 22, 37, 103, 119, 66, 219, 225, 19, 163, 186, 11, 83, 128, 8, + 251, 79, 184, 106, 195, 165, 245, 141, 238, 58, 188, 246, 234, 244, 174, 82, 87, 99, 19, 62, + 142, 210, 82, 71, 238, 60, 239, 188, 158, 87, 158, 48, 63, 232, 74, 77, 54, 88, 27, 242, 42, + 175, 8, 46, 90, 190, 232, 134, 143, 206, 171, 11, 207, 207, 46, 40, 172, 114, 100, 58, 112, + 55, 146, 250, 103, 238, 160, 118, 61, 218, 184, 4, 174, 142, 203, 196, 77, 202, 228, 72, + 200, 116, 107, 148, 99, 50, 165, 201, 28, 147, 169, 52, 46, 83, 44, 22, 77, 67, 153, 224, 9, + 176, 96, 22, 55, 195, 227, 163, 6, 99, 97, 138, 83, 49, 206, 107, 83, 12, 205, 109, 123, + 172, 22, 67, 142, 217, 40, 156, 16, 78, 144, 81, 61, 39, 164, 9, 19, 194, 33, 202, 123, 7, + 242, 222, 59, 154, 198, 33, 239, 222, 60, 139, 32, 154, 13, 198, 27, 40, 19, 238, 68, 107, + 119, 52, 52, 212, 55, 54, 101, 1, 221, 144, 73, 167, 215, 232, 117, 82, 105, 93, 86, 118, + 99, 99, 189, 67, 178, 107, 56, 157, 206, 104, 114, 147, 229, 183, 140, 90, 114, 231, 147, + 233, 143, 109, 217, 77, 236, 150, 246, 159, 220, 57, 170, 239, 186, 102, 176, 222, 85, 93, + 55, 255, 218, 254, 102, 87, 77, 131, 249, 163, 9, 126, 230, 216, 34, 82, 70, 134, 254, 249, + 234, 188, 223, 15, 196, 212, 29, 59, 26, 137, 158, 172, 122, 74, 221, 53, 59, 246, 143, 216, + 45, 175, 252, 115, 71, 16, 147, 163, 1, 128, 91, 132, 187, 207, 129, 59, 217, 222, 97, 138, + 61, 108, 108, 239, 79, 197, 237, 1, 41, 167, 236, 17, 111, 127, 37, 154, 66, 247, 174, 8, + 157, 109, 74, 50, 110, 86, 155, 12, 201, 250, 82, 231, 56, 240, 240, 146, 162, 45, 119, 42, + 25, 153, 99, 196, 18, 37, 130, 3, 219, 178, 224, 41, 37, 179, 28, 137, 116, 120, 90, 201, + 40, 119, 18, 197, 144, 50, 6, 107, 70, 9, 138, 32, 76, 220, 112, 249, 167, 121, 19, 68, 73, + 54, 8, 19, 138, 150, 32, 202, 194, 70, 37, 61, 69, 152, 64, 141, 148, 100, 55, 58, 244, 13, + 212, 168, 46, 162, 51, 229, 234, 109, 54, 106, 95, 146, 244, 89, 78, 232, 135, 59, 214, 174, + 253, 89, 108, 175, 105, 254, 77, 105, 177, 93, 177, 93, 105, 235, 92, 181, 159, 112, 63, + 236, 172, 202, 172, 205, 203, 49, 73, 95, 116, 118, 121, 120, 183, 59, 197, 81, 130, 126, + 135, 199, 58, 183, 13, 247, 41, 193, 129, 248, 62, 51, 38, 247, 89, 28, 183, 49, 64, 52, + 131, 217, 56, 69, 206, 96, 251, 44, 73, 248, 221, 143, 19, 251, 76, 195, 125, 138, 205, 109, + 209, 204, 140, 52, 225, 240, 68, 212, 155, 41, 22, 188, 88, 48, 14, 249, 240, 112, 84, 212, + 233, 199, 241, 240, 73, 19, 190, 156, 16, 78, 128, 98, 21, 133, 253, 227, 96, 32, 41, 138, + 164, 23, 216, 173, 237, 120, 152, 224, 138, 194, 97, 25, 4, 217, 122, 88, 177, 88, 200, 51, + 240, 140, 98, 177, 234, 210, 101, 203, 65, 178, 15, 76, 244, 40, 21, 78, 120, 147, 117, 144, + 161, 195, 7, 74, 156, 45, 123, 210, 82, 32, 37, 181, 212, 57, 170, 55, 88, 13, 227, 120, + 231, 73, 17, 78, 248, 67, 66, 171, 217, 54, 17, 70, 181, 16, 163, 94, 71, 244, 46, 91, 93, + 99, 147, 91, 143, 101, 83, 19, 65, 181, 148, 58, 208, 73, 116, 250, 210, 70, 140, 135, 92, + 19, 183, 109, 197, 242, 216, 247, 151, 18, 127, 207, 166, 162, 150, 249, 243, 79, 102, 235, + 147, 136, 243, 133, 37, 139, 9, 233, 95, 50, 103, 75, 115, 85, 251, 241, 31, 221, 220, 219, + 195, 91, 238, 185, 230, 154, 216, 19, 243, 22, 46, 60, 112, 192, 98, 37, 117, 175, 110, 191, + 243, 170, 21, 35, 23, 132, 44, 187, 30, 238, 239, 195, 64, 86, 255, 132, 17, 114, 27, 234, + 174, 1, 14, 198, 227, 163, 120, 82, 119, 141, 137, 248, 120, 39, 90, 204, 116, 103, 141, + 119, 164, 226, 91, 125, 188, 99, 36, 106, 101, 202, 75, 111, 110, 83, 108, 243, 218, 198, + 161, 18, 198, 101, 155, 112, 98, 52, 63, 207, 150, 142, 175, 9, 30, 165, 174, 206, 83, 227, + 77, 118, 123, 235, 220, 248, 208, 125, 203, 238, 154, 81, 90, 137, 218, 210, 83, 157, 251, + 64, 135, 183, 164, 116, 225, 75, 165, 212, 38, 236, 87, 12, 233, 194, 126, 34, 23, 11, 114, + 241, 17, 138, 13, 135, 149, 228, 100, 166, 202, 100, 3, 170, 50, 249, 32, 81, 172, 86, 225, + 208, 56, 212, 192, 246, 19, 74, 93, 177, 112, 56, 106, 205, 207, 155, 152, 16, 58, 229, 194, + 249, 33, 185, 125, 67, 88, 206, 60, 140, 239, 45, 110, 184, 147, 102, 13, 210, 216, 216, 84, + 159, 208, 87, 19, 75, 32, 58, 157, 158, 62, 46, 83, 174, 73, 143, 250, 149, 48, 24, 89, 102, + 49, 153, 220, 117, 141, 13, 232, 135, 77, 141, 141, 154, 107, 116, 122, 210, 219, 53, 115, + 189, 167, 106, 225, 240, 234, 43, 175, 220, 77, 244, 186, 156, 238, 242, 249, 181, 246, 69, + 156, 252, 200, 71, 215, 222, 218, 214, 80, 25, 152, 49, 205, 17, 222, 66, 30, 190, 131, 191, + 237, 53, 238, 173, 220, 122, 99, 87, 239, 156, 121, 150, 31, 4, 219, 127, 177, 209, 216, + 156, 51, 167, 197, 92, 102, 174, 30, 188, 234, 157, 93, 247, 118, 207, 173, 159, 81, 187, + 162, 250, 224, 15, 182, 239, 214, 84, 155, 174, 164, 218, 126, 31, 240, 230, 175, 93, 12, + 85, 100, 214, 25, 17, 89, 13, 54, 45, 85, 234, 190, 68, 68, 38, 37, 34, 178, 134, 20, 166, + 210, 108, 180, 54, 154, 68, 149, 61, 170, 243, 148, 117, 182, 181, 61, 150, 164, 211, 234, + 124, 168, 65, 1, 111, 119, 58, 225, 203, 81, 81, 212, 149, 161, 202, 107, 198, 209, 221, 6, + 177, 106, 18, 77, 209, 50, 93, 170, 115, 143, 93, 52, 154, 178, 5, 76, 78, 248, 140, 67, 42, + 49, 40, 146, 48, 233, 183, 227, 96, 37, 233, 138, 36, 158, 174, 231, 147, 52, 69, 50, 77, + 214, 149, 210, 114, 22, 229, 101, 52, 202, 43, 48, 202, 203, 105, 148, 59, 48, 202, 75, 203, + 89, 46, 120, 154, 230, 2, 50, 106, 55, 102, 75, 248, 230, 48, 53, 224, 39, 38, 180, 74, 5, + 13, 116, 135, 132, 136, 199, 184, 39, 163, 22, 75, 18, 80, 25, 247, 164, 36, 65, 146, 1, + 157, 95, 72, 181, 166, 142, 227, 85, 127, 138, 243, 239, 41, 176, 128, 197, 140, 125, 162, + 213, 106, 29, 199, 215, 3, 203, 233, 190, 81, 83, 190, 53, 127, 28, 95, 22, 10, 190, 18, 44, + 77, 152, 67, 74, 155, 108, 46, 155, 75, 175, 151, 48, 72, 74, 29, 58, 61, 231, 114, 211, + 216, 225, 56, 169, 209, 33, 73, 46, 238, 116, 110, 185, 235, 211, 66, 207, 218, 116, 242, + 161, 230, 28, 103, 197, 244, 180, 112, 247, 11, 205, 53, 25, 87, 37, 63, 248, 208, 52, 247, + 220, 185, 238, 220, 213, 15, 39, 95, 89, 232, 185, 36, 45, 118, 40, 118, 40, 237, 28, 187, + 237, 19, 238, 242, 85, 157, 188, 251, 233, 167, 239, 239, 60, 135, 35, 197, 77, 177, 150, + 139, 54, 197, 222, 139, 253, 105, 231, 101, 177, 233, 180, 195, 173, 199, 4, 4, 26, 245, 8, + 70, 209, 253, 92, 20, 79, 153, 122, 248, 244, 140, 115, 166, 1, 10, 147, 226, 150, 101, 231, + 12, 100, 37, 206, 153, 70, 98, 207, 164, 237, 163, 209, 44, 22, 70, 214, 185, 109, 10, 32, + 100, 122, 49, 231, 122, 219, 168, 162, 31, 82, 146, 209, 162, 123, 105, 250, 16, 78, 40, 54, + 16, 222, 86, 210, 147, 133, 183, 163, 94, 71, 205, 172, 133, 33, 197, 81, 35, 180, 70, 55, + 39, 59, 102, 205, 71, 218, 219, 108, 142, 110, 174, 1, 74, 215, 120, 7, 155, 195, 225, 48, + 25, 213, 113, 153, 89, 244, 92, 26, 199, 247, 189, 157, 74, 102, 214, 13, 39, 136, 146, 102, + 31, 131, 225, 104, 102, 86, 150, 192, 12, 37, 215, 77, 112, 163, 57, 120, 64, 6, 2, 81, 176, + 151, 227, 180, 209, 205, 229, 58, 58, 75, 185, 93, 104, 85, 202, 113, 42, 197, 72, 2, 56, + 119, 150, 157, 182, 230, 16, 188, 253, 134, 229, 156, 96, 72, 169, 43, 71, 134, 58, 111, 51, + 53, 66, 46, 139, 166, 166, 70, 160, 169, 41, 215, 213, 228, 106, 66, 157, 83, 27, 228, 234, + 88, 168, 53, 53, 185, 144, 200, 182, 227, 137, 167, 203, 53, 178, 158, 70, 71, 116, 96, 99, + 102, 122, 43, 9, 220, 182, 194, 174, 215, 56, 222, 123, 49, 135, 55, 23, 204, 114, 59, 207, + 159, 51, 107, 225, 162, 22, 27, 87, 84, 178, 233, 55, 51, 30, 117, 101, 101, 145, 234, 154, + 57, 183, 207, 168, 178, 152, 35, 35, 142, 229, 181, 175, 147, 192, 144, 41, 255, 234, 244, + 147, 243, 103, 77, 15, 206, 182, 220, 56, 189, 117, 211, 37, 41, 245, 149, 119, 113, 151, + 197, 254, 190, 123, 122, 111, 177, 167, 249, 131, 35, 119, 221, 76, 173, 114, 28, 173, 114, + 147, 118, 59, 30, 200, 53, 196, 22, 143, 55, 243, 164, 85, 106, 193, 158, 76, 181, 255, 151, + 168, 153, 101, 183, 76, 217, 204, 172, 226, 34, 133, 2, 109, 15, 70, 51, 153, 85, 242, 208, + 34, 233, 212, 26, 37, 176, 91, 73, 183, 140, 227, 155, 88, 30, 179, 70, 82, 67, 155, 226, + 180, 96, 222, 162, 28, 134, 36, 52, 77, 69, 137, 176, 63, 234, 45, 177, 80, 211, 148, 88, + 168, 105, 210, 75, 168, 202, 74, 152, 105, 44, 121, 148, 182, 196, 77, 179, 135, 199, 16, + 208, 209, 3, 149, 195, 3, 149, 167, 65, 100, 204, 4, 115, 220, 86, 69, 240, 99, 20, 20, 109, + 37, 155, 5, 74, 140, 67, 50, 12, 163, 173, 100, 180, 150, 97, 66, 169, 174, 152, 152, 98, + 178, 34, 39, 51, 153, 177, 136, 206, 94, 228, 68, 139, 20, 121, 39, 45, 230, 52, 127, 213, + 98, 209, 10, 103, 145, 208, 218, 58, 90, 225, 117, 162, 24, 40, 136, 146, 148, 140, 209, + 201, 1, 59, 139, 9, 75, 129, 244, 40, 230, 92, 77, 147, 87, 174, 184, 245, 74, 181, 212, 94, + 141, 13, 52, 161, 210, 20, 74, 141, 104, 34, 25, 249, 85, 67, 25, 151, 157, 31, 190, 124, + 60, 245, 134, 27, 135, 54, 165, 167, 182, 62, 49, 246, 124, 120, 135, 131, 204, 8, 63, 87, + 101, 52, 214, 215, 7, 219, 91, 220, 174, 188, 84, 131, 192, 223, 118, 129, 155, 120, 82, + 211, 210, 242, 78, 46, 17, 30, 253, 209, 198, 226, 165, 149, 191, 191, 231, 158, 105, 181, + 101, 31, 223, 215, 113, 137, 211, 239, 91, 223, 247, 211, 189, 221, 11, 5, 51, 222, 216, 12, + 104, 179, 26, 140, 36, 43, 186, 236, 221, 103, 68, 82, 69, 34, 146, 148, 196, 141, 45, 53, + 17, 73, 206, 132, 205, 170, 163, 169, 204, 102, 52, 138, 88, 4, 21, 194, 131, 74, 114, 238, + 56, 125, 111, 102, 54, 51, 131, 176, 127, 79, 86, 166, 93, 130, 100, 122, 62, 121, 60, 100, + 79, 105, 170, 100, 207, 204, 26, 131, 123, 162, 92, 22, 39, 92, 255, 37, 193, 212, 37, 76, + 200, 169, 130, 108, 62, 172, 20, 20, 176, 3, 168, 192, 140, 7, 80, 193, 65, 50, 74, 89, 5, + 100, 72, 220, 229, 18, 14, 111, 202, 201, 49, 81, 173, 232, 114, 140, 9, 151, 71, 71, 215, + 225, 185, 221, 72, 255, 154, 235, 32, 254, 200, 163, 169, 6, 15, 233, 122, 108, 233, 58, + 242, 208, 173, 191, 54, 4, 2, 173, 171, 125, 45, 225, 61, 151, 183, 221, 80, 153, 189, 105, + 241, 42, 155, 89, 217, 90, 180, 72, 122, 147, 148, 13, 116, 113, 183, 140, 244, 217, 167, + 85, 46, 88, 112, 126, 159, 253, 246, 235, 184, 27, 95, 221, 53, 219, 122, 254, 197, 183, 20, + 23, 211, 211, 227, 8, 222, 115, 114, 184, 81, 40, 131, 159, 199, 189, 185, 108, 82, 51, 229, + 113, 111, 198, 123, 78, 25, 203, 49, 38, 185, 140, 105, 166, 130, 20, 178, 28, 99, 143, 154, + 80, 51, 68, 49, 149, 9, 251, 65, 73, 110, 107, 83, 178, 189, 109, 123, 178, 109, 25, 201, + 165, 157, 109, 194, 139, 47, 10, 114, 209, 126, 37, 63, 27, 189, 185, 4, 231, 148, 162, 164, + 212, 225, 156, 122, 233, 123, 133, 37, 250, 61, 217, 38, 67, 122, 113, 9, 230, 143, 81, 188, + 123, 150, 157, 74, 245, 152, 220, 101, 147, 32, 155, 142, 196, 111, 121, 52, 219, 163, 134, + 164, 236, 211, 14, 165, 67, 20, 63, 134, 209, 117, 168, 67, 57, 152, 39, 105, 80, 73, 146, + 84, 241, 116, 94, 201, 146, 140, 117, 231, 45, 186, 116, 4, 205, 210, 226, 24, 26, 108, 247, + 154, 210, 60, 229, 121, 21, 153, 41, 121, 250, 252, 242, 217, 55, 122, 245, 87, 92, 169, + 121, 178, 187, 134, 52, 165, 164, 165, 230, 198, 238, 182, 164, 218, 87, 183, 222, 191, 98, + 94, 93, 67, 174, 73, 200, 110, 232, 141, 61, 254, 215, 2, 60, 123, 138, 212, 227, 220, 199, + 232, 59, 13, 240, 124, 92, 63, 149, 167, 239, 50, 241, 104, 31, 139, 86, 50, 253, 8, 114, + 101, 226, 42, 51, 153, 131, 5, 230, 57, 13, 168, 153, 244, 64, 155, 226, 64, 15, 42, 152, + 219, 22, 117, 216, 11, 48, 38, 101, 126, 66, 73, 73, 27, 35, 21, 81, 72, 71, 189, 184, 26, + 160, 193, 77, 245, 82, 139, 122, 113, 209, 216, 173, 170, 196, 183, 207, 137, 27, 20, 106, + 130, 225, 203, 191, 204, 155, 24, 181, 89, 83, 12, 84, 79, 233, 66, 186, 64, 245, 244, 37, + 59, 18, 163, 0, 41, 24, 174, 163, 86, 67, 10, 96, 32, 182, 122, 13, 130, 55, 221, 107, 245, + 26, 188, 41, 222, 102, 250, 11, 43, 13, 244, 208, 172, 173, 138, 71, 36, 203, 161, 77, 13, + 120, 149, 105, 114, 185, 221, 174, 83, 41, 53, 158, 81, 107, 29, 46, 23, 139, 207, 82, 116, + 197, 166, 83, 218, 38, 159, 252, 6, 223, 84, 22, 110, 117, 159, 95, 42, 109, 220, 248, 164, + 137, 207, 207, 235, 104, 168, 12, 223, 189, 56, 212, 36, 154, 50, 109, 226, 238, 173, 23, + 151, 100, 102, 95, 147, 95, 118, 81, 198, 134, 243, 187, 55, 114, 209, 147, 57, 142, 242, + 79, 200, 121, 239, 92, 127, 233, 201, 181, 157, 222, 142, 115, 173, 91, 174, 92, 119, 197, + 124, 82, 95, 249, 215, 118, 91, 93, 125, 59, 121, 126, 82, 241, 212, 7, 189, 177, 37, 92, + 17, 234, 184, 5, 246, 197, 117, 108, 156, 212, 241, 52, 40, 52, 208, 155, 202, 11, 81, 35, + 211, 177, 91, 54, 50, 29, 183, 146, 194, 236, 248, 187, 159, 155, 233, 216, 130, 231, 91, + 173, 183, 109, 111, 177, 36, 88, 0, 230, 183, 177, 72, 220, 147, 135, 231, 126, 1, 85, 106, + 46, 38, 196, 188, 114, 231, 94, 163, 144, 43, 24, 137, 201, 185, 87, 146, 44, 146, 132, 4, + 121, 12, 15, 116, 193, 40, 76, 236, 71, 13, 73, 70, 252, 55, 6, 43, 163, 70, 193, 226, 228, + 20, 11, 189, 101, 228, 98, 159, 146, 230, 86, 202, 220, 99, 176, 42, 218, 228, 182, 56, 163, + 146, 219, 234, 84, 36, 41, 41, 154, 134, 4, 167, 85, 232, 107, 26, 42, 150, 67, 245, 57, + 168, 55, 82, 117, 98, 98, 163, 151, 6, 116, 201, 82, 166, 191, 58, 188, 32, 210, 51, 204, + 69, 107, 216, 213, 84, 31, 247, 91, 250, 232, 36, 95, 227, 44, 66, 102, 54, 148, 15, 148, + 23, 52, 228, 86, 152, 114, 117, 146, 148, 87, 156, 219, 56, 75, 232, 110, 243, 134, 180, + 110, 193, 158, 155, 149, 145, 84, 230, 232, 202, 106, 110, 37, 62, 215, 186, 156, 222, 25, + 51, 93, 109, 119, 169, 215, 198, 150, 116, 52, 214, 77, 15, 218, 109, 211, 196, 37, 246, + 255, 124, 228, 178, 155, 22, 99, 70, 76, 50, 164, 100, 239, 12, 110, 191, 250, 194, 85, 105, + 193, 57, 119, 71, 138, 203, 90, 154, 102, 255, 159, 55, 126, 184, 110, 113, 207, 201, 99, + 236, 63, 137, 74, 129, 191, 216, 42, 114, 23, 101, 180, 254, 29, 240, 214, 68, 127, 138, + 244, 253, 158, 201, 242, 100, 219, 201, 251, 245, 159, 233, 187, 241, 20, 73, 74, 252, 135, + 42, 98, 253, 236, 88, 35, 20, 37, 65, 108, 121, 108, 88, 255, 217, 85, 96, 175, 131, 41, 63, + 114, 181, 102, 71, 156, 162, 47, 251, 156, 21, 110, 228, 47, 33, 185, 60, 168, 79, 34, 188, + 173, 219, 13, 93, 58, 15, 24, 52, 30, 162, 211, 236, 6, 143, 102, 183, 122, 63, 15, 112, 29, + 255, 35, 8, 104, 64, 189, 30, 219, 120, 44, 63, 214, 120, 212, 77, 216, 46, 33, 24, 112, + 220, 203, 8, 127, 74, 192, 95, 176, 173, 6, 225, 123, 244, 43, 24, 172, 127, 128, 99, 106, + 112, 158, 215, 112, 142, 54, 58, 15, 43, 1, 118, 233, 30, 128, 171, 181, 221, 234, 70, 132, + 67, 218, 110, 240, 105, 95, 80, 127, 142, 244, 203, 8, 239, 107, 95, 0, 167, 206, 163, 30, + 226, 172, 234, 211, 56, 7, 109, 63, 194, 191, 167, 30, 214, 91, 213, 3, 200, 247, 50, 246, + 55, 97, 157, 149, 216, 119, 128, 31, 1, 158, 127, 15, 150, 97, 253, 70, 156, 235, 58, 189, + 21, 174, 163, 243, 98, 219, 29, 200, 247, 23, 92, 127, 15, 202, 172, 98, 121, 19, 174, 127, + 35, 253, 158, 5, 229, 122, 4, 231, 62, 130, 112, 156, 219, 166, 126, 70, 105, 110, 27, 238, + 125, 119, 12, 247, 172, 222, 201, 143, 168, 239, 107, 60, 184, 95, 79, 12, 247, 170, 190, + 73, 105, 148, 233, 56, 182, 255, 29, 235, 95, 32, 164, 224, 60, 26, 148, 241, 8, 194, 239, + 112, 254, 191, 160, 28, 69, 56, 135, 13, 101, 176, 81, 185, 113, 94, 47, 246, 61, 168, 121, + 9, 223, 25, 159, 131, 27, 52, 47, 197, 62, 199, 245, 87, 39, 116, 95, 138, 227, 187, 145, + 143, 238, 241, 85, 164, 3, 148, 7, 203, 217, 40, 219, 37, 0, 39, 219, 0, 98, 87, 105, 255, + 9, 211, 53, 54, 58, 31, 228, 243, 191, 133, 21, 212, 6, 137, 190, 251, 104, 31, 221, 11, + 231, 134, 221, 204, 70, 203, 80, 222, 101, 32, 105, 118, 19, 43, 255, 83, 245, 122, 156, + 119, 43, 174, 133, 99, 212, 11, 177, 125, 58, 194, 8, 157, 135, 116, 199, 238, 79, 212, 243, + 117, 0, 233, 9, 154, 215, 81, 219, 210, 241, 137, 118, 158, 253, 103, 104, 236, 48, 181, 19, + 128, 218, 22, 47, 99, 74, 162, 60, 154, 40, 183, 37, 202, 47, 104, 169, 223, 166, 110, 66, + 250, 125, 102, 211, 184, 61, 79, 1, 181, 231, 84, 64, 91, 62, 59, 105, 207, 51, 1, 247, 211, + 151, 160, 111, 156, 10, 9, 155, 162, 207, 197, 150, 163, 76, 205, 212, 110, 88, 118, 196, + 203, 152, 146, 40, 159, 74, 148, 191, 75, 244, 123, 105, 137, 107, 125, 134, 109, 39, 208, + 46, 135, 168, 173, 167, 66, 220, 214, 147, 160, 158, 164, 37, 179, 243, 105, 123, 127, 21, + 168, 47, 179, 126, 40, 154, 10, 212, 230, 212, 55, 104, 137, 107, 141, 38, 116, 51, 154, + 144, 231, 137, 68, 253, 129, 132, 92, 63, 72, 232, 246, 102, 38, 31, 234, 140, 250, 98, 92, + 151, 224, 163, 37, 173, 211, 216, 64, 186, 146, 198, 173, 86, 163, 190, 71, 245, 22, 231, + 71, 157, 110, 163, 127, 233, 81, 87, 81, 26, 203, 43, 104, 125, 178, 253, 84, 137, 241, 68, + 125, 154, 141, 71, 154, 242, 211, 58, 181, 1, 221, 231, 212, 146, 197, 26, 250, 59, 141, 55, + 166, 3, 90, 54, 170, 183, 210, 146, 107, 3, 51, 150, 47, 210, 191, 5, 82, 187, 81, 221, 124, + 189, 68, 219, 161, 94, 216, 222, 95, 160, 255, 81, 31, 27, 167, 117, 253, 54, 168, 193, 122, + 42, 141, 87, 26, 51, 172, 204, 87, 239, 157, 172, 211, 24, 166, 113, 116, 102, 73, 125, 137, + 198, 54, 181, 27, 202, 113, 46, 165, 185, 124, 48, 50, 95, 64, 125, 159, 173, 156, 140, 125, + 26, 127, 95, 43, 65, 157, 135, 113, 180, 0, 97, 23, 194, 48, 194, 67, 24, 51, 253, 8, 60, + 210, 173, 8, 125, 8, 231, 243, 127, 132, 53, 200, 251, 104, 18, 2, 246, 209, 156, 248, 18, + 198, 18, 230, 10, 88, 25, 7, 117, 43, 150, 251, 16, 140, 154, 131, 128, 105, 24, 22, 36, + 209, 120, 218, 13, 62, 4, 99, 34, 206, 242, 105, 110, 68, 249, 127, 130, 64, 121, 124, 56, + 239, 32, 247, 37, 204, 215, 118, 65, 137, 254, 51, 120, 94, 255, 25, 217, 137, 177, 221, 65, + 99, 85, 251, 12, 52, 99, 221, 172, 255, 76, 243, 9, 150, 247, 32, 220, 137, 112, 47, 5, 254, + 54, 216, 20, 151, 19, 62, 70, 56, 132, 240, 122, 92, 94, 140, 239, 221, 164, 30, 233, 207, + 17, 20, 132, 39, 17, 126, 129, 240, 62, 203, 5, 35, 177, 239, 35, 92, 59, 89, 162, 27, 20, + 126, 203, 179, 60, 241, 188, 79, 22, 147, 127, 104, 30, 253, 119, 30, 238, 238, 255, 155, + 135, 95, 166, 245, 178, 231, 181, 179, 61, 186, 165, 244, 209, 11, 137, 231, 192, 255, 62, + 255, 251, 124, 55, 15, 251, 96, 231, 106, 248, 33, 232, 96, 45, 158, 168, 26, 24, 192, 40, + 238, 4, 74, 46, 196, 27, 21, 61, 162, 27, 53, 55, 157, 250, 80, 109, 26, 192, 169, 59, 150, + 22, 107, 147, 31, 163, 166, 128, 55, 65, 115, 48, 19, 199, 199, 105, 30, 50, 97, 107, 130, + 214, 226, 219, 236, 142, 4, 173, 3, 1, 246, 209, 143, 98, 121, 186, 66, 33, 188, 156, 160, + 121, 168, 128, 15, 24, 173, 197, 246, 2, 146, 149, 160, 121, 112, 144, 74, 70, 235, 176, + 221, 66, 22, 36, 104, 30, 202, 200, 42, 70, 235, 177, 221, 68, 238, 72, 208, 60, 216, 201, + 47, 25, 157, 140, 171, 109, 32, 175, 37, 104, 130, 231, 91, 32, 65, 35, 191, 102, 110, 130, + 230, 224, 26, 205, 64, 130, 198, 177, 154, 247, 19, 180, 22, 90, 184, 164, 4, 173, 3, 145, + 243, 49, 218, 64, 101, 230, 250, 18, 52, 202, 204, 109, 102, 116, 10, 182, 151, 113, 187, + 19, 52, 15, 245, 220, 155, 140, 78, 165, 123, 65, 105, 227, 52, 238, 133, 23, 25, 157, 206, + 218, 219, 19, 52, 109, 239, 97, 180, 128, 237, 118, 254, 250, 4, 205, 67, 53, 255, 0, 163, + 179, 169, 204, 252, 145, 4, 141, 114, 242, 39, 24, 109, 164, 58, 209, 166, 39, 104, 212, + 137, 182, 130, 209, 57, 216, 94, 172, 93, 144, 160, 121, 168, 213, 110, 96, 180, 137, 202, + 175, 189, 47, 65, 163, 252, 218, 253, 140, 206, 167, 235, 106, 63, 74, 208, 184, 174, 78, + 96, 180, 21, 219, 141, 186, 25, 9, 154, 7, 81, 23, 159, 179, 8, 219, 243, 116, 107, 19, 52, + 15, 197, 186, 8, 163, 233, 255, 160, 21, 234, 30, 73, 208, 56, 191, 238, 85, 74, 39, 177, + 117, 117, 255, 157, 160, 177, 93, 207, 62, 140, 78, 101, 250, 212, 207, 72, 208, 180, 253, + 2, 70, 51, 189, 233, 175, 79, 208, 168, 31, 253, 78, 255, 234, 53, 151, 173, 29, 90, 190, + 98, 157, 88, 214, 95, 46, 186, 60, 158, 186, 42, 79, 147, 216, 49, 120, 233, 240, 224, 186, + 117, 85, 93, 189, 253, 23, 247, 174, 29, 168, 22, 103, 14, 15, 139, 140, 109, 68, 92, 59, + 56, 50, 184, 118, 195, 224, 64, 245, 162, 161, 149, 131, 35, 190, 213, 195, 3, 226, 172, + 117, 189, 195, 67, 253, 103, 12, 106, 17, 25, 131, 56, 133, 163, 69, 236, 30, 92, 59, 50, + 180, 122, 149, 232, 170, 118, 139, 101, 103, 12, 40, 255, 26, 255, 191, 230, 174, 162, 220, + 113, 102, 152, 203, 62, 77, 88, 11, 67, 176, 14, 122, 65, 4, 63, 172, 199, 218, 8, 214, 55, + 96, 125, 17, 150, 43, 145, 99, 4, 123, 254, 21, 231, 122, 146, 6, 171, 224, 191, 176, 167, + 147, 245, 92, 14, 31, 126, 109, 142, 179, 115, 117, 32, 12, 35, 181, 12, 57, 7, 78, 245, + 198, 103, 159, 58, 195, 183, 241, 181, 99, 219, 58, 124, 206, 62, 250, 155, 57, 252, 176, + 26, 214, 192, 101, 108, 111, 203, 97, 5, 235, 47, 131, 126, 40, 199, 210, 5, 30, 124, 234, + 160, 10, 113, 19, 91, 127, 16, 46, 69, 9, 226, 243, 84, 65, 23, 202, 211, 15, 23, 35, 94, + 139, 242, 84, 35, 199, 76, 236, 29, 198, 242, 244, 108, 35, 172, 70, 37, 24, 196, 114, 3, + 147, 188, 122, 138, 92, 62, 92, 127, 152, 237, 102, 22, 211, 237, 48, 246, 244, 255, 139, + 149, 90, 152, 54, 79, 239, 236, 155, 231, 160, 92, 221, 108, 85, 186, 211, 213, 168, 121, + 186, 163, 106, 112, 179, 29, 126, 251, 10, 229, 255, 198, 252, 223, 197, 220, 85, 167, 230, + 158, 58, 243, 119, 229, 151, 115, 176, 92, 129, 229, 6, 92, 131, 114, 172, 63, 195, 246, + 147, 173, 83, 103, 252, 119, 199, 156, 131, 45, 189, 108, 196, 105, 201, 47, 193, 246, 193, + 175, 204, 118, 118, 174, 118, 140, 131, 97, 212, 201, 127, 227, 156, 255, 133, 92, 34, 190, + 115, 206, 199, 150, 117, 103, 248, 236, 217, 184, 38, 103, 30, 73, 104, 121, 53, 219, 253, + 234, 41, 114, 126, 147, 28, 103, 231, 238, 102, 61, 83, 53, 72, 63, 88, 154, 58, 199, 55, + 115, 76, 141, 201, 111, 139, 190, 111, 227, 235, 194, 245, 169, 21, 215, 67, 95, 194, 155, + 122, 167, 112, 92, 134, 190, 244, 85, 171, 255, 59, 252, 83, 61, 99, 117, 66, 255, 199, 18, + 254, 181, 250, 172, 62, 244, 53, 78, 190, 136, 159, 193, 79, 227, 253, 124, 35, 223, 204, + 123, 249, 233, 124, 39, 239, 1, 145, 47, 192, 22, 47, 63, 19, 219, 234, 166, 206, 245, 111, + 112, 183, 255, 11, 61, 125, 83, 127, 39, 213, 29, 113, 209, 40, 35, 181, 167, 252, 232, 226, + 175, 140, 59, 27, 207, 119, 21, 75, 223, 145, 62, 191, 51, 121, 254, 95, 227, 143, 195, 55, + 239, 191, 33, 184, 217, 103, 121, 95, 251, 205, 76, 7, 250, 105, 127, 17, 222, 41, 195, 152, + 213, 157, 104, 151, 10, 244, 187, 114, 188, 53, 234, 192, 95, 161, 20, 230, 117, 46, 244, + 41, 28, 119, 145, 87, 187, 204, 243, 182, 71, 179, 206, 203, 229, 4, 200, 250, 139, 162, + 158, 128, 39, 40, 57, 3, 143, 215, 45, 152, 214, 17, 240, 232, 146, 42, 24, 19, 119, 233, 0, + 118, 142, 67, 1, 12, 4, 125, 251, 80, 188, 33, 88, 69, 191, 224, 12, 142, 193, 138, 224, 62, + 146, 135, 166, 51, 179, 250, 19, 160, 199, 100, 88, 137, 108, 1, 159, 82, 219, 224, 12, 57, + 205, 182, 240, 56, 230, 73, 108, 136, 207, 116, 223, 48, 25, 241, 154, 83, 6, 12, 59, 12, + 183, 150, 14, 151, 222, 83, 122, 91, 233, 207, 74, 127, 92, 186, 179, 244, 246, 45, 3, 55, + 238, 184, 241, 214, 52, 20, 229, 29, 186, 218, 24, 12, 7, 135, 164, 62, 49, 210, 31, 137, + 244, 143, 147, 60, 98, 142, 200, 231, 108, 24, 10, 72, 67, 129, 188, 113, 204, 113, 89, 206, + 113, 20, 131, 226, 149, 12, 175, 66, 172, 228, 137, 184, 175, 189, 22, 175, 217, 92, 144, + 159, 79, 191, 66, 245, 249, 37, 127, 159, 143, 126, 135, 170, 228, 194, 56, 253, 90, 53, 56, + 180, 112, 177, 111, 12, 122, 163, 220, 226, 70, 39, 45, 249, 37, 180, 116, 68, 181, 23, 52, + 226, 52, 197, 80, 23, 80, 210, 192, 183, 39, 69, 2, 131, 4, 157, 11, 165, 224, 18, 95, 28, + 211, 207, 107, 71, 237, 96, 131, 64, 192, 188, 199, 110, 15, 216, 108, 129, 13, 193, 33, 6, + 121, 225, 168, 213, 171, 247, 7, 135, 22, 249, 216, 39, 217, 51, 243, 224, 39, 168, 239, + 187, 16, 238, 70, 248, 15, 132, 95, 32, 220, 135, 240, 40, 130, 140, 160, 32, 236, 67, 120, + 2, 225, 87, 208, 21, 152, 242, 11, 255, 15, 225, 135, 0, 135, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 50, 32, 48, 32, 82, 47, 67, 114, + 111, 112, 66, 111, 120, 91, 48, 46, 48, 32, 48, 46, 48, 32, 53, 57, 53, 46, 48, 32, 56, 52, + 50, 46, 48, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 46, 48, 32, 48, 46, 48, 32, + 53, 57, 53, 46, 48, 32, 56, 52, 50, 46, 48, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, + 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 62, 62, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 76, 101, 110, + 103, 116, 104, 32, 48, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 13, 10, 101, 110, 100, + 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 52, 32, 48, 32, 82, 47, 67, + 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, 49, 55, 54, 32, 48, + 32, 82, 47, 84, 84, 48, 32, 49, 55, 52, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 54, 56, 32, + 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 48, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 50, + 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, + 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, + 116, 80, 97, 114, 101, 110, 116, 115, 32, 49, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, + 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, + 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, + 101, 110, 103, 116, 104, 32, 50, 54, 50, 56, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 72, 137, 204, 87, 109, 111, 220, 184, 17, 254, 238, 95, 161, 143, 226, 1, 82, 248, 38, 138, + 42, 130, 0, 177, 157, 30, 210, 158, 123, 105, 178, 215, 162, 184, 22, 69, 18, 59, 137, 11, + 103, 227, 216, 107, 167, 247, 239, 59, 51, 124, 221, 53, 215, 89, 177, 42, 80, 4, 27, 175, + 150, 154, 33, 231, 225, 51, 51, 207, 60, 121, 245, 246, 102, 211, 60, 125, 250, 228, 236, + 228, 229, 105, 195, 155, 103, 207, 142, 79, 79, 154, 163, 227, 213, 17, 111, 240, 223, 205, + 199, 163, 39, 171, 21, 111, 132, 234, 39, 217, 172, 62, 28, 241, 126, 154, 38, 75, 107, 162, + 145, 102, 234, 71, 211, 140, 90, 246, 131, 105, 86, 159, 143, 126, 109, 79, 88, 55, 180, 63, + 51, 213, 254, 9, 62, 43, 124, 120, 193, 134, 240, 32, 101, 251, 134, 117, 83, 219, 176, 127, + 172, 254, 224, 29, 243, 158, 91, 116, 44, 134, 222, 106, 221, 116, 210, 244, 2, 124, 157, + 131, 175, 87, 204, 182, 207, 153, 224, 237, 107, 214, 89, 231, 172, 99, 157, 134, 223, 148, + 246, 62, 94, 172, 142, 190, 130, 169, 232, 101, 99, 236, 212, 75, 219, 12, 61, 215, 141, + 144, 205, 205, 197, 209, 95, 127, 104, 214, 24, 10, 108, 36, 210, 70, 91, 17, 120, 211, 73, + 80, 120, 159, 143, 192, 237, 234, 95, 232, 245, 207, 224, 87, 15, 60, 120, 85, 166, 159, + 204, 67, 183, 124, 143, 91, 178, 140, 78, 93, 36, 111, 89, 103, 218, 143, 0, 66, 123, 193, + 36, 236, 35, 4, 192, 210, 141, 237, 23, 68, 164, 15, 209, 208, 190, 150, 118, 243, 91, 139, + 222, 216, 195, 3, 10, 182, 165, 136, 4, 96, 44, 155, 145, 11, 114, 11, 22, 189, 182, 232, + 22, 192, 87, 42, 173, 208, 207, 219, 107, 112, 2, 191, 168, 132, 238, 141, 206, 150, 181, + 182, 189, 218, 103, 139, 139, 201, 116, 130, 27, 206, 22, 49, 144, 19, 249, 207, 125, 24, + 138, 193, 224, 171, 102, 180, 248, 7, 34, 121, 202, 249, 104, 159, 65, 48, 16, 190, 76, 70, + 26, 184, 39, 192, 2, 40, 227, 98, 221, 70, 7, 152, 171, 181, 114, 235, 191, 182, 47, 17, + 236, 53, 19, 237, 6, 62, 55, 72, 171, 47, 64, 205, 115, 120, 184, 99, 82, 183, 239, 145, 99, + 184, 116, 137, 239, 225, 210, 154, 201, 33, 231, 154, 54, 200, 83, 56, 149, 65, 202, 207, + 35, 91, 180, 133, 123, 165, 171, 17, 57, 217, 70, 222, 91, 91, 233, 56, 216, 6, 199, 187, + 119, 110, 172, 69, 175, 133, 59, 247, 43, 229, 59, 247, 139, 251, 238, 188, 108, 235, 238, + 60, 152, 214, 221, 57, 0, 53, 154, 165, 238, 252, 57, 27, 221, 197, 126, 10, 23, 123, 129, + 89, 120, 207, 164, 114, 223, 62, 51, 225, 191, 5, 102, 220, 50, 44, 82, 157, 144, 244, 237, + 210, 145, 38, 240, 131, 222, 116, 171, 146, 153, 150, 195, 71, 192, 71, 195, 231, 119, 240, + 161, 204, 254, 9, 169, 69, 47, 190, 101, 126, 171, 203, 64, 189, 143, 76, 88, 111, 143, 143, + 95, 152, 52, 254, 209, 17, 78, 96, 129, 16, 254, 167, 119, 244, 8, 126, 62, 225, 254, 209, + 199, 57, 83, 69, 90, 26, 133, 127, 234, 104, 105, 140, 79, 52, 8, 235, 33, 47, 171, 60, 7, + 219, 232, 57, 17, 243, 64, 38, 12, 10, 119, 92, 136, 9, 127, 193, 238, 65, 24, 198, 107, + 245, 57, 174, 61, 220, 31, 240, 13, 252, 237, 134, 137, 33, 245, 41, 149, 109, 136, 181, + 204, 230, 220, 250, 12, 13, 238, 38, 248, 219, 184, 122, 129, 190, 254, 200, 196, 132, 85, + 31, 255, 3, 130, 93, 5, 103, 217, 241, 160, 113, 142, 114, 10, 206, 128, 57, 178, 253, 187, + 148, 38, 17, 12, 217, 147, 29, 143, 136, 241, 25, 190, 242, 246, 154, 168, 163, 218, 111, + 184, 74, 12, 185, 137, 156, 59, 79, 22, 206, 129, 200, 127, 218, 161, 243, 21, 62, 222, 121, + 210, 95, 50, 161, 219, 123, 207, 112, 225, 169, 71, 175, 5, 110, 18, 93, 41, 99, 126, 131, + 216, 11, 20, 132, 142, 10, 4, 169, 163, 32, 220, 182, 203, 251, 86, 21, 40, 88, 229, 57, + 216, 70, 207, 179, 41, 168, 57, 22, 187, 133, 40, 248, 10, 85, 0, 221, 148, 167, 159, 204, + 31, 137, 61, 169, 68, 165, 50, 68, 239, 17, 57, 221, 51, 22, 169, 84, 17, 220, 123, 112, 93, + 199, 172, 83, 116, 151, 231, 84, 103, 66, 177, 2, 183, 182, 116, 85, 10, 90, 107, 229, 77, + 65, 26, 184, 188, 108, 135, 194, 77, 213, 56, 246, 166, 201, 241, 246, 69, 61, 162, 225, 70, + 133, 242, 194, 72, 75, 171, 168, 183, 46, 147, 166, 218, 189, 43, 203, 31, 185, 171, 9, 8, + 38, 31, 104, 5, 159, 38, 144, 25, 41, 77, 96, 233, 62, 43, 211, 167, 120, 53, 244, 236, 146, + 231, 42, 212, 150, 107, 188, 36, 151, 177, 180, 28, 58, 76, 131, 25, 228, 174, 164, 19, 6, + 8, 166, 154, 206, 181, 89, 218, 155, 54, 216, 27, 197, 216, 203, 131, 163, 120, 237, 78, + 230, 59, 145, 239, 131, 121, 43, 201, 218, 145, 99, 213, 86, 255, 161, 70, 134, 150, 24, + 118, 86, 220, 206, 208, 35, 85, 139, 43, 71, 215, 40, 147, 58, 129, 130, 77, 239, 9, 135, + 76, 74, 49, 77, 189, 50, 114, 238, 205, 80, 70, 220, 60, 56, 34, 253, 114, 23, 110, 110, 19, + 212, 157, 47, 144, 49, 182, 84, 27, 233, 62, 116, 242, 155, 180, 129, 243, 41, 226, 21, 70, + 145, 64, 77, 251, 209, 120, 239, 255, 219, 48, 127, 193, 157, 174, 98, 53, 8, 33, 58, 25, 3, + 199, 93, 135, 36, 167, 220, 79, 151, 23, 138, 55, 213, 26, 36, 225, 38, 252, 236, 143, 238, + 107, 12, 58, 188, 114, 183, 31, 120, 200, 109, 206, 67, 12, 225, 65, 185, 195, 249, 226, 80, + 242, 253, 8, 168, 137, 12, 247, 120, 8, 58, 223, 143, 76, 100, 34, 252, 155, 175, 105, 227, + 22, 174, 219, 105, 113, 191, 55, 37, 230, 224, 250, 55, 156, 41, 113, 203, 59, 150, 96, 115, + 148, 136, 144, 229, 109, 149, 148, 64, 74, 87, 201, 225, 60, 186, 112, 174, 189, 220, 22, + 162, 31, 228, 161, 167, 251, 61, 104, 200, 152, 156, 129, 162, 68, 228, 112, 105, 198, 145, + 194, 157, 248, 13, 83, 60, 107, 211, 155, 208, 162, 225, 216, 59, 237, 153, 230, 40, 35, 7, + 82, 246, 115, 42, 190, 55, 180, 190, 13, 30, 92, 152, 131, 37, 241, 42, 89, 114, 128, 78, + 246, 18, 160, 59, 245, 191, 172, 126, 216, 253, 66, 239, 164, 23, 14, 49, 217, 105, 229, + 157, 2, 11, 14, 156, 64, 203, 201, 32, 182, 75, 244, 239, 120, 59, 152, 137, 132, 184, 203, + 162, 206, 119, 224, 179, 144, 169, 225, 246, 168, 188, 22, 199, 12, 57, 109, 223, 15, 238, + 211, 12, 130, 70, 31, 183, 251, 140, 59, 242, 198, 216, 119, 169, 3, 74, 154, 72, 188, 119, + 215, 154, 21, 144, 48, 248, 159, 219, 155, 189, 173, 119, 159, 49, 224, 235, 145, 180, 35, + 58, 27, 56, 239, 133, 105, 228, 68, 199, 223, 245, 188, 79, 99, 69, 99, 217, 251, 214, 253, + 138, 89, 80, 213, 144, 160, 175, 177, 48, 172, 98, 121, 59, 206, 131, 81, 64, 41, 27, 182, + 44, 199, 178, 111, 199, 96, 234, 55, 204, 66, 17, 0, 13, 6, 41, 209, 169, 200, 71, 90, 161, + 84, 90, 217, 25, 119, 113, 13, 18, 202, 47, 42, 87, 20, 210, 178, 214, 148, 54, 101, 91, 92, + 76, 166, 19, 10, 171, 180, 248, 21, 92, 83, 254, 104, 192, 72, 207, 149, 83, 193, 118, 226, + 91, 185, 23, 200, 96, 234, 61, 7, 219, 146, 103, 7, 161, 158, 38, 116, 91, 128, 208, 175, + 148, 33, 244, 139, 251, 32, 44, 219, 58, 8, 131, 105, 1, 66, 218, 118, 164, 155, 29, 113, + 245, 96, 162, 4, 83, 178, 34, 106, 190, 132, 65, 111, 77, 58, 224, 156, 254, 191, 132, 1, + 232, 6, 243, 249, 2, 11, 238, 123, 250, 109, 227, 26, 5, 86, 230, 21, 102, 254, 91, 108, 40, + 255, 134, 100, 188, 160, 238, 157, 113, 88, 76, 164, 116, 253, 217, 102, 113, 56, 154, 134, + 179, 237, 92, 46, 21, 3, 231, 184, 174, 144, 228, 81, 99, 37, 25, 11, 149, 228, 177, 131, + 127, 167, 144, 20, 15, 126, 216, 52, 166, 141, 198, 49, 97, 161, 105, 236, 113, 125, 66, + 181, 28, 197, 192, 187, 160, 184, 174, 162, 142, 197, 62, 251, 91, 18, 189, 121, 139, 213, + 134, 26, 78, 93, 86, 193, 120, 85, 55, 166, 234, 129, 170, 200, 66, 192, 188, 32, 6, 7, 105, + 159, 9, 233, 40, 215, 214, 113, 136, 160, 181, 91, 166, 84, 174, 146, 182, 0, 25, 56, 246, + 238, 58, 64, 32, 44, 187, 91, 102, 14, 68, 68, 81, 81, 248, 223, 35, 34, 134, 12, 136, 92, + 159, 9, 89, 66, 67, 141, 212, 76, 171, 208, 208, 220, 95, 242, 124, 52, 164, 233, 71, 185, + 20, 26, 39, 126, 14, 241, 194, 198, 85, 67, 72, 144, 109, 69, 132, 26, 137, 50, 105, 103, + 210, 242, 163, 9, 25, 167, 129, 13, 89, 229, 231, 83, 63, 130, 146, 98, 218, 130, 54, 248, + 117, 100, 43, 102, 159, 212, 216, 83, 171, 208, 149, 163, 39, 204, 124, 116, 197, 98, 68, + 139, 10, 146, 64, 241, 147, 64, 24, 70, 92, 103, 185, 142, 211, 44, 98, 118, 30, 230, 219, + 72, 201, 219, 61, 204, 67, 69, 92, 139, 13, 116, 229, 177, 36, 255, 15, 192, 134, 139, 94, + 46, 86, 178, 127, 194, 176, 17, 158, 119, 105, 140, 236, 210, 28, 9, 201, 247, 45, 22, 240, + 83, 214, 233, 108, 106, 114, 60, 117, 197, 203, 113, 17, 136, 84, 226, 144, 154, 112, 156, + 172, 4, 138, 215, 161, 164, 172, 5, 24, 150, 66, 137, 242, 43, 245, 181, 52, 62, 134, 177, + 55, 166, 230, 153, 19, 48, 148, 137, 34, 171, 94, 183, 184, 88, 128, 198, 26, 84, 103, 85, + 208, 40, 59, 121, 34, 204, 71, 7, 196, 134, 93, 54, 197, 242, 152, 99, 89, 41, 178, 1, 68, + 203, 84, 89, 176, 213, 104, 252, 173, 206, 15, 25, 164, 152, 88, 180, 96, 227, 221, 187, 28, + 184, 134, 176, 3, 19, 66, 46, 16, 30, 231, 88, 71, 92, 145, 121, 141, 201, 67, 117, 5, 51, + 237, 93, 120, 3, 218, 157, 41, 129, 100, 196, 124, 53, 24, 76, 85, 173, 26, 84, 3, 95, 80, + 244, 32, 70, 148, 36, 31, 67, 183, 241, 25, 228, 137, 66, 173, 138, 158, 246, 37, 7, 12, 35, + 181, 66, 7, 67, 121, 32, 116, 194, 0, 163, 212, 176, 95, 51, 60, 62, 192, 40, 24, 4, 31, 72, + 134, 116, 226, 26, 199, 209, 182, 232, 217, 111, 43, 21, 230, 58, 4, 101, 230, 31, 89, 14, + 152, 112, 52, 125, 156, 178, 157, 65, 43, 206, 89, 248, 63, 85, 176, 149, 187, 173, 52, 103, + 153, 157, 65, 203, 18, 191, 252, 137, 36, 12, 16, 114, 206, 145, 130, 117, 56, 83, 105, 214, + 242, 190, 235, 134, 173, 60, 92, 5, 17, 240, 194, 176, 21, 224, 172, 153, 182, 138, 71, 63, + 48, 191, 4, 222, 199, 146, 85, 247, 13, 4, 72, 95, 156, 158, 246, 74, 14, 191, 150, 53, 98, + 106, 235, 31, 176, 30, 249, 236, 115, 210, 50, 54, 180, 245, 78, 21, 39, 113, 88, 172, 82, + 66, 84, 192, 24, 108, 85, 53, 140, 156, 227, 159, 133, 75, 57, 126, 174, 83, 89, 246, 178, + 104, 67, 179, 106, 4, 70, 150, 96, 144, 19, 105, 141, 58, 24, 80, 205, 85, 161, 32, 45, 13, + 62, 11, 161, 128, 68, 10, 221, 155, 130, 223, 64, 188, 29, 114, 228, 151, 107, 167, 236, 74, + 163, 168, 180, 67, 95, 25, 184, 180, 84, 220, 171, 34, 31, 113, 38, 89, 40, 240, 231, 80, + 12, 49, 194, 120, 245, 223, 211, 47, 114, 148, 216, 89, 234, 130, 30, 7, 127, 103, 243, 131, + 54, 52, 109, 44, 20, 245, 49, 235, 84, 222, 137, 147, 26, 25, 124, 253, 136, 242, 149, 216, + 64, 45, 60, 13, 152, 126, 140, 18, 240, 187, 176, 222, 0, 19, 228, 3, 19, 211, 182, 61, 52, + 17, 237, 234, 15, 137, 230, 80, 94, 222, 163, 221, 254, 234, 115, 91, 174, 55, 210, 144, 62, + 169, 131, 30, 240, 171, 19, 203, 82, 211, 248, 178, 16, 242, 164, 3, 11, 149, 37, 31, 22, + 46, 29, 253, 166, 98, 5, 178, 37, 96, 244, 136, 173, 175, 14, 152, 129, 123, 98, 205, 71, + 70, 209, 244, 178, 16, 50, 63, 35, 50, 24, 237, 167, 173, 42, 188, 175, 244, 40, 221, 143, + 149, 18, 89, 170, 209, 223, 232, 252, 144, 101, 104, 91, 139, 205, 149, 121, 168, 37, 54, + 80, 246, 188, 12, 25, 231, 211, 8, 22, 221, 236, 65, 3, 169, 75, 185, 21, 138, 59, 151, 115, + 197, 236, 145, 181, 112, 73, 237, 175, 185, 160, 76, 37, 159, 246, 107, 128, 199, 133, 169, + 4, 249, 80, 20, 129, 110, 215, 26, 199, 193, 182, 236, 217, 109, 43, 166, 17, 125, 106, 221, + 207, 62, 177, 152, 166, 222, 88, 167, 45, 159, 35, 218, 107, 186, 131, 117, 184, 9, 64, 94, + 113, 152, 242, 240, 49, 42, 236, 109, 245, 60, 142, 208, 49, 253, 17, 102, 130, 230, 77, + 195, 17, 74, 202, 217, 59, 174, 83, 206, 121, 116, 168, 156, 135, 130, 114, 126, 244, 228, + 223, 81, 206, 197, 163, 31, 150, 118, 194, 26, 204, 246, 5, 123, 62, 230, 210, 58, 20, 26, + 108, 82, 119, 240, 224, 7, 84, 41, 179, 38, 134, 9, 153, 4, 116, 166, 143, 100, 104, 149, + 199, 76, 242, 253, 77, 208, 85, 179, 152, 164, 212, 121, 239, 72, 152, 75, 189, 219, 87, + 221, 43, 168, 197, 162, 28, 33, 83, 74, 250, 79, 44, 248, 144, 52, 214, 24, 250, 171, 152, + 240, 66, 13, 159, 52, 83, 210, 167, 126, 7, 194, 146, 139, 6, 222, 39, 157, 133, 113, 83, + 27, 233, 105, 117, 23, 61, 203, 31, 65, 111, 234, 5, 212, 142, 12, 188, 80, 122, 186, 48, + 99, 64, 40, 59, 191, 109, 146, 106, 196, 35, 7, 100, 133, 171, 105, 91, 141, 109, 29, 145, + 200, 81, 39, 169, 141, 143, 167, 136, 39, 189, 72, 242, 132, 118, 32, 64, 50, 200, 178, 210, + 23, 167, 26, 49, 70, 36, 76, 15, 19, 31, 64, 225, 234, 88, 132, 98, 47, 30, 35, 65, 247, + 127, 136, 71, 222, 9, 206, 233, 125, 161, 131, 175, 3, 97, 209, 188, 208, 27, 132, 69, 73, + 93, 85, 107, 133, 37, 237, 241, 48, 171, 201, 82, 160, 203, 7, 73, 45, 6, 44, 166, 80, 129, + 119, 38, 128, 23, 103, 39, 205, 209, 127, 4, 24, 0, 57, 218, 172, 21, 13, 10, 101, 110, 100, + 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, + 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 50, 48, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 72, 137, 92, 80, 189, 106, 195, 48, 16, 222, 245, 20, 55, 166, 147, 156, + 44, 201, 96, 60, 52, 161, 224, 161, 63, 212, 125, 1, 69, 58, 57, 130, 248, 36, 206, 242, + 224, 183, 207, 73, 53, 41, 244, 64, 130, 239, 79, 124, 58, 125, 238, 47, 61, 133, 12, 250, + 139, 163, 29, 48, 131, 15, 228, 24, 231, 184, 176, 69, 184, 226, 24, 72, 237, 15, 224, 130, + 205, 27, 170, 183, 157, 76, 82, 90, 194, 195, 58, 103, 156, 122, 242, 81, 181, 45, 232, 111, + 17, 231, 204, 43, 236, 134, 232, 243, 221, 144, 123, 1, 253, 201, 14, 57, 208, 8, 187, 222, + 33, 229, 144, 87, 33, 135, 37, 165, 59, 78, 130, 161, 129, 174, 3, 135, 94, 30, 124, 55, + 233, 195, 76, 40, 242, 22, 255, 227, 127, 214, 132, 112, 168, 120, 255, 91, 197, 70, 135, + 115, 50, 22, 217, 208, 136, 170, 109, 100, 58, 104, 223, 100, 58, 133, 228, 254, 233, 91, + 234, 234, 237, 205, 112, 113, 31, 79, 197, 221, 188, 30, 171, 123, 227, 75, 174, 124, 238, + 89, 197, 46, 204, 210, 178, 110, 160, 22, 41, 21, 2, 225, 115, 73, 41, 166, 146, 170, 231, + 33, 192, 0, 248, 214, 112, 46, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, + 110, 100, 111, 98, 106, 13, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 70, 105, 114, 115, 116, + 32, 51, 51, 47, 76, 101, 110, 103, 116, 104, 32, 49, 48, 49, 49, 47, 78, 32, 52, 47, 84, + 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 104, 222, 212, 87, 109, 178, 36, 41, 8, 188, 138, 71, 80, 17, 212, 179, 76, 188, 251, 95, + 99, 51, 65, 171, 237, 234, 158, 157, 158, 216, 23, 49, 59, 63, 50, 252, 4, 17, 82, 138, 42, + 106, 41, 167, 162, 61, 149, 92, 13, 157, 145, 106, 214, 138, 206, 76, 146, 71, 75, 63, 52, + 247, 244, 39, 81, 97, 150, 0, 77, 70, 106, 115, 248, 92, 175, 51, 245, 172, 169, 138, 36, + 41, 213, 193, 53, 162, 226, 10, 146, 45, 85, 235, 144, 201, 159, 159, 211, 205, 177, 245, + 56, 76, 210, 64, 107, 208, 167, 86, 146, 226, 92, 131, 206, 54, 176, 166, 236, 119, 160, + 248, 89, 130, 86, 27, 206, 172, 144, 233, 45, 25, 215, 161, 79, 165, 38, 27, 148, 151, 212, + 58, 48, 21, 107, 146, 116, 150, 52, 169, 87, 169, 23, 58, 59, 236, 174, 234, 54, 123, 187, + 108, 144, 140, 181, 217, 160, 7, 186, 203, 240, 86, 51, 239, 13, 91, 123, 204, 215, 6, 219, + 21, 50, 35, 123, 127, 20, 137, 125, 178, 246, 3, 130, 117, 153, 136, 106, 139, 49, 109, 233, + 77, 253, 30, 212, 35, 19, 123, 90, 67, 95, 163, 157, 15, 127, 111, 191, 250, 156, 104, 234, + 165, 60, 124, 148, 11, 184, 99, 213, 21, 82, 144, 151, 247, 133, 62, 158, 130, 226, 10, 68, + 3, 107, 126, 34, 136, 13, 50, 29, 14, 8, 227, 32, 223, 36, 46, 14, 131, 232, 152, 139, 0, + 135, 49, 187, 117, 20, 77, 67, 112, 102, 161, 179, 231, 114, 154, 249, 30, 153, 208, 219, + 130, 28, 34, 4, 116, 193, 96, 6, 67, 105, 151, 113, 175, 192, 182, 234, 118, 81, 222, 96, + 167, 33, 56, 61, 87, 39, 0, 131, 255, 14, 29, 142, 34, 33, 156, 12, 7, 72, 134, 19, 230, 58, + 131, 12, 119, 208, 46, 27, 197, 9, 113, 130, 247, 38, 113, 148, 65, 157, 237, 45, 120, 190, + 19, 2, 246, 159, 112, 50, 28, 216, 4, 8, 50, 60, 195, 125, 217, 218, 177, 103, 147, 163, + 237, 246, 235, 255, 147, 1, 114, 121, 100, 0, 4, 221, 70, 197, 90, 241, 0, 18, 15, 178, 229, + 200, 0, 8, 170, 12, 251, 252, 28, 11, 66, 188, 102, 0, 56, 163, 207, 229, 40, 4, 168, 232, + 145, 1, 16, 188, 26, 4, 146, 50, 227, 37, 3, 3, 129, 51, 56, 223, 240, 48, 180, 128, 4, 120, + 28, 74, 98, 243, 181, 13, 140, 65, 74, 5, 57, 6, 8, 170, 37, 230, 154, 147, 177, 187, 205, + 114, 16, 188, 130, 140, 141, 231, 51, 43, 84, 137, 214, 73, 142, 182, 23, 31, 87, 16, 177, + 146, 252, 26, 253, 62, 99, 191, 214, 190, 90, 190, 106, 60, 48, 232, 18, 137, 113, 131, 205, + 244, 99, 19, 218, 5, 31, 34, 51, 73, 1, 185, 44, 71, 251, 146, 1, 242, 122, 112, 124, 32, + 249, 145, 161, 32, 87, 178, 132, 67, 4, 70, 12, 91, 198, 219, 120, 10, 138, 43, 40, 161, + 224, 41, 3, 96, 158, 233, 60, 140, 131, 252, 58, 136, 138, 233, 152, 95, 101, 0, 153, 18, + 25, 32, 211, 217, 245, 150, 1, 154, 235, 140, 12, 0, 61, 216, 87, 39, 95, 22, 28, 63, 22, + 73, 114, 164, 208, 86, 67, 222, 132, 175, 19, 129, 229, 11, 99, 166, 160, 243, 223, 160, + 115, 141, 206, 187, 103, 0, 232, 60, 97, 245, 65, 134, 59, 60, 3, 88, 115, 66, 156, 224, + 189, 73, 28, 6, 144, 193, 127, 135, 206, 207, 73, 149, 103, 194, 210, 215, 36, 195, 129, 77, + 128, 32, 195, 51, 220, 151, 79, 123, 54, 57, 100, 183, 95, 63, 58, 3, 244, 7, 81, 241, 41, + 33, 248, 13, 83, 53, 199, 24, 120, 125, 32, 90, 113, 210, 72, 0, 115, 138, 162, 197, 247, + 98, 188, 229, 182, 204, 175, 112, 237, 135, 142, 11, 152, 47, 153, 233, 134, 185, 220, 88, + 124, 84, 135, 143, 241, 33, 236, 16, 224, 216, 5, 241, 177, 230, 188, 27, 8, 3, 124, 111, + 31, 33, 183, 246, 93, 114, 171, 63, 145, 86, 182, 110, 206, 111, 35, 136, 102, 211, 117, + 241, 50, 151, 161, 56, 227, 52, 248, 234, 211, 6, 50, 56, 103, 111, 199, 41, 179, 224, 122, + 114, 126, 200, 161, 223, 151, 204, 134, 191, 16, 139, 150, 14, 16, 141, 243, 216, 186, 254, + 165, 167, 228, 195, 144, 107, 194, 188, 20, 90, 3, 138, 240, 74, 108, 183, 56, 113, 197, + 107, 169, 142, 205, 151, 206, 53, 160, 99, 124, 199, 82, 187, 163, 250, 18, 53, 203, 151, + 13, 157, 149, 78, 95, 118, 209, 248, 53, 167, 252, 192, 83, 55, 115, 224, 62, 157, 186, 122, + 124, 32, 207, 57, 49, 93, 1, 108, 23, 120, 139, 43, 72, 55, 184, 209, 87, 100, 15, 156, 145, + 172, 43, 250, 155, 17, 119, 208, 216, 126, 238, 57, 89, 182, 152, 241, 51, 218, 242, 41, + 156, 172, 184, 211, 249, 163, 103, 0, 199, 188, 61, 99, 235, 205, 249, 111, 175, 4, 198, + 247, 86, 2, 12, 206, 199, 149, 0, 107, 254, 22, 149, 0, 146, 125, 84, 2, 245, 131, 74, 160, + 189, 84, 2, 90, 154, 195, 203, 93, 182, 61, 42, 129, 61, 255, 90, 9, 108, 25, 185, 246, 72, + 139, 92, 233, 149, 0, 117, 224, 227, 116, 85, 2, 173, 127, 71, 37, 80, 255, 91, 37, 48, 86, + 37, 177, 14, 255, 237, 74, 128, 63, 99, 159, 86, 2, 172, 133, 191, 163, 18, 168, 245, 195, + 74, 32, 200, 112, 135, 87, 2, 252, 247, 248, 151, 74, 96, 7, 240, 142, 174, 65, 8, 255, 231, + 58, 240, 182, 18, 184, 200, 240, 140, 171, 18, 184, 233, 38, 33, 86, 251, 245, 143, 0, 3, 0, + 26, 22, 2, 72, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, + 98, 106, 13, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, + 115, 32, 56, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 46, 48, 32, 48, + 46, 48, 32, 53, 57, 53, 46, 48, 32, 56, 52, 50, 46, 48, 93, 47, 77, 101, 100, 105, 97, 66, + 111, 120, 91, 48, 46, 48, 32, 48, 46, 48, 32, 53, 57, 53, 46, 48, 32, 56, 52, 50, 46, 48, + 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, + 117, 114, 99, 101, 115, 60, 60, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, + 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 50, 47, 84, 121, 112, 101, 47, 80, + 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 56, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, + 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, + 10, 72, 137, 210, 15, 72, 44, 42, 81, 176, 177, 209, 247, 117, 246, 116, 81, 48, 80, 176, + 179, 115, 114, 113, 86, 224, 114, 245, 5, 18, 0, 1, 6, 0, 105, 48, 6, 137, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 57, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 49, 48, 32, 48, 32, 82, + 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, + 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, + 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 55, 32, + 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, + 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, + 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 51, + 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, + 49, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 50, 50, + 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 221, 111, 20, 71, 12, + 127, 207, 95, 113, 143, 183, 85, 119, 217, 157, 153, 253, 146, 16, 106, 19, 90, 149, 86, 20, + 84, 78, 234, 3, 237, 67, 146, 35, 151, 192, 229, 136, 46, 57, 34, 250, 215, 215, 246, 216, + 158, 143, 221, 3, 36, 132, 46, 236, 204, 120, 108, 143, 63, 126, 182, 79, 87, 39, 79, 94, + 159, 239, 31, 22, 79, 159, 62, 121, 121, 246, 226, 249, 162, 94, 60, 123, 118, 250, 252, + 108, 113, 82, 47, 240, 223, 126, 115, 242, 100, 181, 170, 23, 141, 173, 70, 179, 88, 93, + 157, 212, 213, 56, 142, 3, 157, 53, 11, 227, 134, 202, 45, 122, 103, 42, 11, 135, 183, 39, + 111, 151, 167, 69, 57, 44, 15, 133, 89, 174, 225, 183, 193, 197, 59, 248, 120, 128, 223, + 162, 104, 150, 166, 40, 155, 122, 89, 23, 29, 127, 217, 98, 92, 150, 69, 233, 38, 7, 142, + 254, 46, 138, 127, 87, 191, 163, 252, 38, 200, 111, 77, 53, 52, 205, 162, 52, 182, 170, 221, + 98, 181, 62, 1, 170, 213, 251, 76, 201, 210, 12, 160, 81, 23, 81, 189, 93, 190, 41, 250, + 229, 29, 232, 241, 14, 88, 59, 210, 234, 178, 112, 203, 107, 210, 172, 108, 218, 229, 199, + 194, 46, 175, 230, 4, 118, 85, 215, 54, 240, 220, 99, 178, 6, 36, 232, 73, 150, 25, 188, + 172, 63, 129, 215, 13, 112, 223, 23, 101, 191, 188, 5, 17, 231, 69, 217, 45, 183, 176, 67, + 31, 94, 32, 42, 132, 68, 104, 156, 107, 161, 161, 27, 244, 165, 215, 118, 64, 109, 130, 45, + 76, 16, 109, 171, 193, 37, 111, 124, 137, 183, 145, 39, 220, 241, 26, 220, 227, 206, 3, 72, + 122, 135, 102, 6, 238, 13, 57, 226, 35, 174, 174, 138, 178, 165, 213, 175, 40, 70, 175, 157, + 227, 31, 250, 186, 244, 230, 50, 54, 72, 143, 30, 222, 86, 125, 7, 142, 112, 117, 197, 175, + 38, 54, 104, 216, 11, 248, 209, 67, 14, 201, 179, 62, 23, 3, 137, 107, 192, 205, 63, 130, + 38, 253, 145, 152, 40, 251, 196, 243, 222, 202, 141, 237, 43, 91, 15, 32, 175, 173, 58, 47, + 239, 55, 224, 254, 177, 64, 3, 185, 229, 63, 198, 248, 235, 23, 176, 216, 22, 3, 233, 13, + 108, 208, 204, 240, 230, 187, 194, 249, 157, 115, 92, 125, 192, 135, 211, 18, 13, 210, 128, + 50, 35, 250, 68, 196, 214, 96, 211, 14, 226, 122, 245, 28, 132, 192, 190, 233, 251, 118, + 249, 2, 99, 153, 28, 231, 136, 219, 94, 100, 128, 133, 71, 255, 181, 35, 103, 146, 77, 65, + 93, 254, 190, 22, 201, 124, 247, 20, 66, 227, 0, 123, 107, 248, 109, 244, 234, 67, 1, 49, + 201, 20, 87, 112, 130, 207, 218, 23, 42, 208, 192, 210, 91, 168, 67, 251, 52, 144, 52, 126, + 225, 224, 87, 69, 154, 173, 96, 125, 77, 209, 117, 3, 183, 73, 53, 62, 201, 215, 179, 202, + 161, 104, 36, 220, 11, 177, 62, 231, 155, 52, 199, 171, 104, 132, 56, 86, 125, 160, 58, 87, + 141, 110, 244, 73, 244, 118, 249, 51, 62, 225, 22, 89, 236, 193, 133, 120, 139, 185, 224, + 181, 82, 136, 33, 64, 32, 194, 252, 141, 63, 40, 138, 56, 139, 178, 208, 48, 77, 101, 59, + 39, 188, 171, 34, 78, 150, 90, 194, 135, 137, 74, 51, 86, 173, 241, 148, 47, 40, 116, 32, + 204, 31, 200, 216, 37, 66, 64, 137, 192, 85, 226, 59, 41, 252, 233, 125, 152, 26, 124, 182, + 11, 1, 50, 146, 110, 24, 33, 13, 249, 128, 5, 90, 22, 56, 130, 56, 147, 129, 134, 42, 12, + 128, 225, 90, 81, 216, 187, 108, 234, 160, 99, 230, 206, 76, 59, 225, 222, 217, 202, 246, + 86, 184, 95, 115, 48, 105, 2, 76, 98, 0, 79, 121, 141, 185, 115, 96, 85, 182, 148, 25, 235, + 66, 157, 43, 153, 246, 181, 248, 65, 186, 3, 133, 224, 142, 181, 167, 156, 35, 122, 100, + 252, 17, 147, 35, 230, 228, 37, 17, 17, 158, 71, 34, 67, 60, 29, 23, 153, 228, 226, 39, 76, + 133, 27, 226, 231, 213, 112, 242, 94, 138, 172, 17, 188, 50, 80, 92, 73, 12, 28, 51, 50, 8, + 18, 80, 96, 253, 229, 49, 126, 107, 162, 74, 239, 20, 121, 14, 178, 237, 85, 67, 101, 228, + 33, 146, 78, 189, 231, 133, 122, 19, 243, 71, 220, 223, 41, 119, 111, 70, 52, 19, 99, 0, + 236, 17, 254, 136, 18, 55, 114, 241, 39, 204, 136, 134, 208, 1, 201, 235, 8, 14, 224, 206, + 223, 197, 24, 43, 168, 32, 197, 102, 226, 120, 243, 78, 233, 34, 249, 231, 190, 76, 224, + 167, 152, 23, 9, 136, 90, 3, 105, 127, 204, 204, 181, 90, 24, 179, 35, 55, 158, 13, 110, + 189, 164, 26, 32, 38, 83, 93, 62, 249, 174, 193, 171, 109, 143, 189, 156, 221, 67, 236, 80, + 145, 157, 178, 127, 20, 223, 32, 237, 37, 21, 87, 57, 154, 184, 205, 82, 21, 132, 88, 221, + 179, 22, 30, 140, 128, 74, 242, 196, 250, 136, 190, 82, 30, 107, 185, 30, 244, 220, 106, 88, + 223, 17, 179, 91, 84, 112, 82, 18, 108, 20, 168, 244, 132, 84, 55, 218, 218, 82, 230, 13, + 57, 249, 38, 248, 73, 146, 39, 210, 47, 51, 49, 250, 96, 245, 3, 152, 254, 82, 193, 149, 83, + 239, 63, 173, 123, 202, 33, 152, 49, 160, 131, 186, 88, 24, 176, 106, 104, 102, 84, 238, + 179, 47, 149, 98, 154, 3, 135, 136, 223, 161, 67, 217, 86, 123, 7, 49, 143, 130, 57, 177, + 145, 208, 104, 129, 228, 74, 48, 3, 185, 6, 50, 45, 74, 129, 242, 21, 28, 14, 148, 196, 103, + 40, 246, 190, 128, 6, 32, 156, 190, 137, 141, 252, 206, 99, 187, 7, 56, 109, 16, 66, 80, + 158, 113, 227, 213, 68, 133, 47, 1, 204, 212, 208, 198, 37, 209, 46, 181, 224, 155, 68, 226, + 107, 177, 51, 89, 249, 186, 195, 248, 112, 145, 32, 180, 100, 113, 55, 173, 101, 181, 86, + 49, 148, 104, 190, 175, 250, 104, 114, 29, 199, 181, 30, 36, 180, 161, 232, 246, 220, 254, + 65, 149, 30, 134, 113, 209, 42, 150, 66, 13, 135, 171, 89, 113, 238, 170, 222, 64, 147, 24, + 168, 60, 79, 138, 146, 144, 9, 28, 62, 99, 146, 107, 189, 128, 96, 20, 96, 57, 16, 42, 206, + 70, 129, 180, 46, 34, 168, 147, 22, 54, 130, 243, 185, 55, 114, 84, 10, 228, 38, 197, 111, + 116, 68, 29, 98, 195, 95, 209, 228, 188, 228, 54, 148, 146, 116, 23, 87, 242, 56, 196, 102, + 4, 83, 77, 26, 250, 170, 107, 250, 164, 40, 205, 3, 94, 84, 8, 19, 177, 59, 158, 94, 56, + 163, 36, 57, 145, 46, 81, 89, 55, 248, 27, 58, 230, 6, 108, 114, 193, 198, 69, 57, 244, 130, + 235, 184, 139, 109, 93, 148, 14, 234, 42, 106, 182, 199, 164, 241, 124, 5, 206, 63, 40, 146, + 242, 38, 170, 120, 208, 34, 168, 6, 219, 101, 18, 102, 130, 129, 37, 196, 186, 103, 143, + 118, 242, 100, 211, 40, 208, 51, 229, 198, 119, 150, 190, 104, 145, 103, 213, 242, 105, 51, + 108, 230, 75, 86, 200, 66, 69, 78, 50, 109, 232, 99, 50, 236, 136, 251, 40, 235, 66, 38, 71, + 168, 17, 21, 129, 94, 9, 163, 90, 42, 240, 169, 241, 170, 70, 18, 43, 75, 37, 140, 56, 197, + 45, 163, 117, 106, 148, 224, 172, 108, 24, 74, 74, 96, 174, 22, 31, 152, 9, 219, 108, 57, + 87, 67, 165, 218, 106, 0, 101, 38, 140, 12, 65, 150, 20, 23, 110, 50, 108, 13, 229, 111, 10, + 173, 19, 185, 6, 70, 134, 224, 151, 247, 194, 151, 109, 137, 167, 95, 202, 147, 155, 100, + 126, 19, 35, 227, 173, 249, 25, 10, 79, 230, 214, 156, 150, 184, 228, 226, 41, 55, 67, 164, + 240, 121, 132, 109, 184, 60, 246, 32, 131, 47, 106, 56, 113, 231, 187, 34, 149, 182, 141, + 163, 124, 205, 254, 143, 187, 73, 164, 220, 196, 148, 23, 133, 59, 82, 207, 167, 137, 128, + 166, 35, 90, 237, 207, 56, 240, 253, 196, 224, 35, 93, 1, 135, 139, 48, 10, 209, 6, 115, 93, + 244, 52, 171, 54, 116, 62, 234, 197, 168, 146, 250, 106, 168, 155, 254, 243, 49, 193, 27, 5, + 26, 167, 211, 146, 142, 0, 90, 16, 4, 250, 39, 128, 169, 113, 128, 221, 102, 0, 15, 84, 40, + 69, 204, 108, 6, 203, 61, 164, 248, 37, 83, 206, 62, 205, 172, 120, 64, 154, 27, 86, 198, + 89, 156, 53, 109, 220, 178, 209, 45, 29, 11, 208, 254, 31, 194, 44, 210, 78, 205, 22, 85, + 59, 109, 221, 242, 216, 107, 197, 176, 109, 134, 103, 145, 13, 163, 208, 108, 156, 54, 48, + 89, 156, 40, 46, 133, 73, 41, 234, 199, 162, 215, 210, 61, 239, 11, 105, 205, 57, 211, 91, + 193, 74, 180, 126, 234, 228, 117, 104, 106, 35, 141, 47, 146, 25, 42, 47, 80, 45, 41, 173, + 157, 166, 52, 10, 164, 4, 7, 77, 243, 213, 14, 202, 126, 95, 7, 133, 17, 137, 230, 211, 73, + 87, 227, 169, 207, 43, 240, 209, 49, 46, 110, 232, 145, 138, 145, 179, 201, 122, 251, 152, + 228, 81, 92, 153, 212, 182, 73, 151, 129, 20, 82, 145, 123, 55, 227, 162, 252, 96, 203, 174, + 136, 246, 189, 23, 213, 246, 220, 73, 233, 243, 162, 225, 110, 42, 63, 214, 86, 114, 38, + 136, 160, 14, 200, 118, 85, 93, 247, 138, 245, 107, 25, 26, 49, 150, 239, 138, 172, 209, 82, + 147, 77, 27, 244, 102, 172, 103, 205, 11, 120, 154, 183, 19, 163, 75, 39, 48, 45, 6, 1, 101, + 103, 102, 184, 201, 245, 248, 229, 35, 187, 231, 192, 77, 167, 22, 242, 0, 227, 113, 198, + 24, 229, 244, 24, 151, 9, 101, 29, 99, 75, 194, 59, 63, 152, 175, 231, 120, 146, 184, 51, + 158, 160, 142, 180, 61, 143, 194, 73, 58, 25, 27, 53, 190, 210, 236, 240, 120, 38, 3, 222, + 164, 99, 12, 4, 210, 75, 243, 230, 183, 121, 198, 218, 80, 85, 231, 250, 251, 176, 59, 223, + 222, 91, 171, 153, 225, 81, 75, 176, 43, 61, 75, 179, 6, 15, 180, 125, 160, 236, 141, 184, + 37, 45, 84, 240, 37, 159, 106, 97, 228, 181, 216, 101, 175, 77, 12, 193, 250, 68, 123, 111, + 84, 138, 54, 201, 10, 197, 62, 178, 41, 238, 138, 33, 20, 59, 175, 180, 133, 193, 11, 83, + 248, 172, 168, 196, 125, 5, 238, 254, 34, 147, 209, 91, 16, 84, 91, 120, 93, 75, 255, 227, + 38, 148, 81, 139, 149, 210, 147, 48, 18, 83, 199, 212, 19, 205, 26, 207, 239, 57, 210, 192, + 193, 72, 65, 135, 7, 60, 216, 18, 190, 119, 68, 121, 39, 27, 194, 232, 210, 71, 96, 233, + 133, 221, 147, 247, 189, 30, 141, 11, 241, 8, 138, 74, 195, 231, 190, 15, 151, 253, 68, 162, + 147, 99, 19, 199, 165, 12, 38, 81, 173, 79, 171, 183, 198, 9, 59, 12, 238, 148, 108, 118, + 205, 252, 141, 111, 205, 178, 10, 135, 183, 103, 59, 133, 219, 164, 20, 204, 32, 8, 171, 19, + 102, 222, 244, 240, 78, 157, 191, 213, 122, 40, 136, 152, 215, 98, 233, 101, 124, 55, 121, + 23, 135, 240, 12, 174, 113, 83, 231, 59, 138, 28, 146, 101, 40, 229, 132, 105, 117, 176, 74, + 210, 95, 99, 206, 176, 47, 156, 173, 186, 97, 20, 95, 188, 193, 64, 167, 72, 186, 192, 63, + 31, 56, 114, 59, 41, 15, 175, 49, 88, 246, 133, 49, 126, 247, 51, 176, 167, 143, 123, 97, + 43, 46, 238, 186, 106, 236, 173, 176, 229, 219, 251, 196, 2, 7, 126, 173, 246, 58, 137, 115, + 250, 184, 107, 207, 116, 238, 218, 170, 15, 204, 127, 231, 209, 130, 38, 7, 213, 244, 180, + 176, 56, 28, 176, 126, 27, 252, 227, 195, 68, 182, 246, 228, 146, 92, 237, 190, 26, 173, + 203, 212, 62, 90, 60, 53, 167, 67, 159, 53, 153, 58, 181, 75, 56, 112, 149, 188, 139, 66, + 77, 171, 64, 159, 204, 166, 228, 90, 227, 28, 164, 208, 56, 231, 91, 207, 32, 148, 42, 228, + 144, 78, 57, 184, 220, 9, 132, 169, 58, 18, 115, 77, 214, 70, 40, 110, 175, 195, 237, 36, + 235, 26, 23, 104, 124, 147, 55, 73, 24, 38, 11, 69, 50, 129, 244, 25, 245, 180, 131, 254, + 236, 49, 43, 243, 191, 80, 164, 77, 112, 50, 3, 54, 205, 177, 54, 45, 111, 35, 56, 213, 117, + 106, 152, 147, 246, 165, 225, 203, 187, 228, 151, 151, 103, 139, 147, 95, 86, 39, 255, 11, + 48, 0, 153, 101, 192, 89, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, + 100, 111, 98, 106, 13, 49, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, + 101, 110, 116, 115, 32, 49, 50, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, + 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, + 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, + 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, + 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, + 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, + 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, 80, 114, + 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, + 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, + 32, 52, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, + 55, 49, 51, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 109, 111, 28, + 183, 17, 254, 174, 95, 177, 31, 111, 131, 236, 122, 201, 125, 59, 166, 65, 0, 71, 114, 93, + 199, 113, 97, 32, 215, 6, 133, 92, 160, 58, 157, 79, 82, 34, 201, 242, 157, 157, 180, 249, + 245, 229, 188, 114, 184, 187, 178, 131, 166, 8, 46, 214, 146, 195, 225, 112, 94, 158, 121, + 230, 219, 205, 201, 147, 215, 23, 135, 15, 197, 215, 95, 63, 121, 117, 250, 226, 172, 104, + 138, 111, 190, 249, 246, 236, 180, 56, 105, 10, 248, 239, 112, 117, 242, 100, 179, 105, 10, + 231, 139, 205, 254, 164, 169, 67, 8, 107, 220, 112, 133, 15, 235, 186, 89, 23, 163, 247, + 117, 87, 108, 238, 78, 86, 190, 220, 252, 4, 210, 174, 112, 109, 29, 240, 192, 80, 55, 141, + 139, 210, 155, 221, 201, 170, 128, 237, 202, 173, 215, 117, 112, 235, 162, 114, 67, 221, + 250, 180, 65, 231, 240, 144, 91, 199, 99, 237, 88, 84, 67, 223, 212, 67, 55, 149, 17, 221, + 149, 202, 61, 174, 170, 41, 134, 222, 213, 67, 177, 57, 59, 57, 95, 61, 148, 221, 234, 80, + 174, 87, 239, 202, 97, 181, 47, 43, 215, 175, 110, 226, 215, 109, 252, 189, 45, 43, 31, 207, + 86, 46, 116, 184, 118, 44, 171, 32, 223, 219, 120, 10, 247, 47, 75, 191, 186, 136, 107, 171, + 143, 113, 5, 37, 236, 49, 82, 218, 201, 103, 218, 255, 165, 172, 248, 2, 184, 27, 21, 192, + 149, 44, 135, 223, 160, 25, 126, 160, 227, 14, 22, 192, 82, 16, 82, 91, 174, 227, 2, 238, + 160, 162, 251, 248, 245, 161, 172, 122, 218, 251, 170, 28, 69, 27, 88, 6, 155, 112, 238, 61, + 190, 240, 163, 88, 207, 18, 191, 194, 49, 184, 231, 192, 79, 223, 37, 155, 193, 132, 91, + 177, 17, 85, 91, 63, 236, 88, 239, 21, 172, 193, 31, 104, 1, 191, 167, 114, 46, 202, 253, + 115, 243, 93, 244, 120, 229, 198, 186, 247, 201, 229, 96, 194, 22, 31, 4, 82, 112, 18, 46, + 2, 173, 164, 240, 30, 13, 221, 115, 112, 210, 229, 168, 31, 150, 64, 1, 28, 193, 133, 143, + 40, 125, 144, 160, 125, 89, 6, 86, 133, 159, 53, 56, 27, 45, 196, 191, 210, 238, 83, 80, + 139, 186, 225, 29, 224, 206, 11, 90, 113, 20, 151, 36, 121, 90, 86, 99, 244, 80, 88, 85, + 248, 249, 99, 25, 216, 202, 142, 5, 240, 32, 25, 189, 211, 197, 191, 197, 255, 175, 87, 175, + 203, 170, 93, 189, 128, 155, 255, 196, 65, 81, 125, 3, 37, 194, 141, 113, 121, 71, 75, 89, + 10, 200, 85, 184, 136, 15, 190, 225, 140, 77, 6, 236, 212, 5, 176, 151, 242, 139, 3, 128, + 37, 7, 65, 24, 7, 168, 137, 243, 204, 124, 76, 18, 56, 14, 11, 15, 114, 17, 59, 222, 83, + 106, 106, 69, 200, 31, 222, 102, 9, 198, 70, 107, 97, 90, 61, 11, 206, 145, 51, 15, 146, + 138, 248, 63, 216, 101, 39, 121, 215, 101, 181, 73, 150, 104, 196, 167, 143, 68, 141, 36, + 91, 185, 214, 24, 105, 10, 152, 159, 11, 154, 247, 165, 149, 214, 210, 185, 41, 77, 85, 38, + 227, 189, 75, 185, 149, 82, 209, 62, 67, 178, 241, 58, 61, 207, 10, 66, 8, 54, 95, 68, 175, + 107, 88, 175, 185, 112, 18, 26, 136, 133, 87, 162, 123, 100, 163, 174, 109, 181, 142, 112, + 79, 252, 71, 145, 224, 78, 115, 24, 133, 167, 238, 208, 144, 77, 68, 36, 14, 35, 95, 152, + 92, 124, 43, 240, 34, 217, 63, 50, 202, 40, 238, 28, 165, 216, 147, 247, 88, 238, 251, 168, + 161, 193, 173, 63, 163, 174, 103, 49, 150, 70, 13, 93, 0, 242, 230, 250, 191, 150, 189, 26, + 231, 243, 204, 78, 6, 177, 236, 95, 162, 231, 254, 3, 165, 147, 178, 29, 100, 175, 20, 87, + 201, 22, 117, 247, 43, 9, 234, 212, 110, 210, 143, 112, 80, 148, 18, 33, 219, 211, 138, 202, + 7, 5, 172, 62, 202, 215, 34, 226, 89, 36, 212, 237, 224, 109, 23, 51, 29, 198, 15, 177, 69, + 245, 180, 121, 190, 58, 35, 136, 234, 180, 58, 109, 152, 251, 133, 40, 247, 203, 0, 17, 129, + 178, 138, 43, 46, 254, 66, 252, 145, 160, 150, 107, 170, 47, 84, 163, 33, 131, 108, 227, 24, + 244, 12, 245, 230, 30, 245, 154, 166, 177, 102, 13, 199, 200, 26, 152, 146, 136, 54, 224, + 224, 59, 53, 69, 220, 106, 212, 107, 110, 189, 5, 76, 61, 78, 222, 156, 142, 106, 63, 221, + 149, 94, 34, 88, 181, 64, 20, 134, 12, 181, 174, 203, 212, 207, 80, 55, 88, 139, 25, 193, + 79, 28, 249, 137, 218, 139, 184, 34, 53, 251, 232, 111, 197, 171, 235, 204, 95, 98, 249, + 152, 27, 56, 26, 247, 60, 224, 15, 92, 125, 43, 87, 147, 196, 222, 250, 206, 40, 34, 82, 1, + 154, 224, 183, 83, 115, 212, 124, 178, 75, 242, 34, 94, 228, 195, 178, 13, 154, 14, 22, 162, + 226, 250, 26, 203, 176, 81, 57, 120, 215, 1, 251, 170, 244, 116, 99, 142, 0, 46, 41, 56, 74, + 124, 52, 5, 150, 26, 246, 158, 195, 156, 174, 244, 120, 229, 90, 175, 68, 239, 137, 30, 245, + 251, 81, 123, 46, 73, 105, 82, 103, 128, 123, 175, 156, 100, 90, 27, 248, 102, 184, 72, 242, + 82, 222, 7, 0, 168, 188, 72, 51, 29, 53, 46, 16, 162, 69, 103, 146, 15, 150, 51, 63, 5, 148, + 194, 6, 38, 236, 108, 30, 101, 32, 54, 118, 230, 9, 202, 79, 216, 160, 79, 32, 154, 162, 84, + 162, 133, 16, 57, 11, 20, 168, 205, 166, 119, 152, 84, 112, 48, 189, 90, 251, 29, 183, 59, + 38, 141, 146, 170, 147, 44, 159, 132, 128, 157, 254, 101, 220, 111, 88, 7, 37, 180, 164, 17, + 158, 164, 13, 39, 80, 232, 138, 145, 105, 183, 11, 62, 178, 238, 117, 209, 99, 206, 236, + 232, 81, 109, 188, 64, 37, 157, 161, 254, 85, 18, 35, 141, 223, 105, 19, 187, 231, 2, 79, + 93, 87, 74, 204, 57, 72, 187, 1, 243, 28, 254, 109, 49, 44, 201, 47, 90, 222, 225, 179, 229, + 29, 242, 108, 8, 159, 43, 111, 68, 35, 7, 147, 77, 27, 180, 48, 118, 92, 24, 179, 154, 119, + 110, 94, 244, 240, 197, 91, 182, 238, 157, 41, 0, 222, 182, 134, 57, 215, 101, 12, 140, 8, + 53, 46, 63, 21, 103, 165, 20, 121, 87, 58, 202, 73, 84, 140, 75, 23, 28, 52, 231, 178, 180, + 53, 215, 61, 100, 180, 145, 82, 125, 158, 125, 44, 124, 205, 175, 146, 146, 76, 137, 123, + 205, 181, 34, 195, 131, 18, 164, 204, 23, 7, 251, 130, 57, 183, 113, 93, 106, 31, 255, 134, + 107, 165, 122, 97, 39, 113, 13, 75, 107, 181, 57, 0, 76, 161, 169, 137, 164, 25, 6, 223, + 247, 169, 109, 72, 135, 84, 4, 133, 77, 228, 232, 175, 164, 177, 197, 133, 231, 240, 0, 85, + 3, 222, 216, 114, 59, 140, 155, 47, 83, 80, 146, 155, 239, 211, 190, 6, 71, 73, 59, 108, 68, + 156, 248, 7, 39, 196, 79, 89, 190, 107, 230, 194, 217, 55, 171, 152, 182, 201, 28, 180, 227, + 37, 42, 132, 195, 111, 202, 210, 43, 162, 130, 248, 38, 46, 102, 212, 193, 246, 116, 173, + 111, 11, 15, 115, 120, 79, 14, 87, 54, 46, 142, 210, 52, 152, 226, 99, 215, 74, 72, 120, + 190, 133, 5, 124, 209, 150, 83, 65, 209, 80, 201, 85, 91, 56, 87, 55, 29, 226, 133, 119, + 117, 55, 116, 76, 159, 254, 53, 161, 79, 231, 162, 208, 83, 29, 116, 125, 151, 56, 236, 207, + 166, 171, 131, 12, 117, 59, 155, 187, 214, 70, 37, 3, 84, 61, 204, 37, 97, 103, 139, 105, + 105, 101, 183, 165, 105, 153, 150, 200, 208, 102, 167, 181, 0, 223, 179, 244, 133, 197, 83, + 205, 64, 117, 191, 86, 186, 148, 47, 129, 9, 191, 223, 130, 201, 115, 233, 197, 121, 143, 7, + 77, 11, 176, 93, 151, 206, 184, 118, 153, 183, 62, 135, 52, 18, 204, 44, 34, 207, 126, 13, + 154, 15, 212, 64, 144, 142, 1, 0, 1, 105, 140, 114, 176, 114, 15, 127, 92, 194, 61, 241, + 169, 195, 234, 171, 248, 42, 60, 247, 3, 85, 227, 128, 66, 111, 137, 94, 244, 120, 20, 79, + 92, 129, 48, 200, 125, 192, 108, 100, 101, 176, 128, 59, 183, 37, 130, 134, 7, 151, 183, + 224, 12, 90, 42, 136, 248, 15, 36, 164, 215, 239, 84, 40, 211, 120, 32, 92, 172, 160, 65, + 202, 149, 184, 1, 82, 151, 132, 65, 86, 59, 252, 84, 167, 222, 112, 44, 187, 38, 213, 64, + 116, 149, 96, 199, 240, 199, 40, 254, 11, 112, 172, 12, 66, 51, 74, 207, 56, 233, 70, 179, + 221, 166, 30, 205, 50, 212, 120, 29, 19, 233, 125, 82, 134, 29, 227, 150, 89, 196, 86, 32, + 69, 198, 162, 62, 77, 158, 186, 174, 253, 94, 27, 123, 178, 67, 230, 177, 165, 193, 195, 9, + 242, 165, 164, 193, 181, 215, 20, 129, 181, 81, 115, 195, 72, 175, 215, 92, 202, 108, 102, + 173, 6, 169, 148, 206, 246, 141, 218, 63, 224, 27, 177, 195, 9, 41, 34, 226, 63, 102, 197, + 33, 232, 13, 10, 223, 43, 219, 50, 147, 6, 248, 134, 154, 217, 131, 97, 171, 140, 93, 176, + 124, 111, 225, 76, 12, 157, 79, 34, 104, 147, 86, 110, 238, 196, 220, 95, 2, 248, 93, 138, + 190, 64, 38, 33, 250, 27, 239, 125, 25, 236, 212, 147, 112, 234, 214, 224, 84, 15, 135, 0, + 28, 146, 70, 98, 142, 147, 153, 240, 87, 177, 244, 160, 120, 150, 102, 52, 229, 143, 68, 53, + 165, 229, 154, 49, 176, 114, 163, 241, 213, 65, 207, 43, 210, 112, 95, 153, 55, 136, 31, + 203, 48, 27, 168, 186, 176, 132, 129, 179, 197, 140, 119, 193, 182, 201, 109, 248, 140, 62, + 82, 58, 217, 113, 105, 57, 23, 234, 70, 154, 195, 249, 234, 239, 241, 4, 150, 245, 49, 154, + 240, 17, 254, 216, 113, 241, 243, 58, 37, 89, 47, 160, 129, 122, 95, 162, 32, 135, 63, 250, + 251, 14, 130, 176, 213, 35, 63, 151, 200, 136, 100, 3, 35, 53, 161, 170, 174, 109, 235, 49, + 102, 33, 91, 193, 101, 211, 77, 25, 120, 55, 165, 224, 178, 200, 137, 228, 58, 195, 14, 133, + 75, 216, 33, 71, 21, 80, 244, 177, 0, 124, 239, 235, 113, 116, 89, 5, 92, 232, 172, 179, + 181, 153, 44, 211, 133, 214, 19, 27, 218, 246, 105, 214, 51, 197, 65, 121, 55, 172, 170, + 248, 187, 44, 253, 172, 89, 65, 82, 80, 186, 224, 67, 90, 233, 234, 9, 68, 36, 207, 133, + 215, 180, 109, 94, 67, 122, 100, 199, 130, 57, 110, 72, 53, 180, 126, 88, 4, 54, 29, 143, + 80, 209, 4, 217, 164, 133, 63, 142, 109, 148, 227, 106, 131, 25, 211, 38, 118, 206, 233, + 227, 94, 238, 129, 75, 19, 101, 80, 79, 227, 222, 7, 19, 251, 62, 141, 13, 9, 53, 12, 171, + 55, 132, 200, 148, 123, 111, 75, 85, 56, 173, 41, 85, 184, 243, 146, 219, 167, 150, 103, + 194, 208, 91, 133, 144, 135, 199, 136, 1, 120, 79, 158, 248, 40, 55, 120, 154, 181, 205, 27, + 238, 150, 191, 16, 129, 193, 186, 29, 83, 255, 132, 46, 124, 164, 120, 247, 137, 54, 36, + 182, 32, 237, 222, 163, 97, 208, 56, 92, 252, 117, 165, 82, 136, 42, 150, 193, 247, 204, 29, + 176, 0, 241, 162, 57, 129, 192, 175, 119, 226, 168, 119, 244, 48, 195, 39, 182, 242, 161, + 86, 51, 103, 80, 50, 180, 249, 34, 62, 110, 252, 99, 221, 124, 74, 170, 3, 39, 218, 239, 38, + 103, 19, 228, 15, 172, 10, 50, 108, 63, 237, 78, 70, 72, 27, 171, 244, 83, 99, 192, 220, + 181, 180, 174, 213, 145, 12, 51, 55, 222, 151, 102, 182, 165, 234, 198, 117, 174, 137, 144, + 219, 67, 43, 147, 90, 163, 69, 169, 9, 106, 76, 240, 215, 111, 90, 9, 122, 137, 57, 255, + 120, 39, 223, 138, 99, 241, 245, 169, 158, 216, 128, 88, 165, 239, 75, 162, 7, 74, 103, 102, + 109, 123, 58, 124, 180, 157, 41, 86, 116, 196, 20, 101, 151, 0, 193, 204, 102, 29, 223, 3, + 58, 246, 38, 242, 109, 214, 176, 250, 212, 225, 81, 239, 156, 82, 200, 104, 214, 206, 39, + 179, 182, 99, 8, 158, 188, 246, 178, 228, 121, 245, 193, 106, 51, 150, 217, 132, 80, 156, + 48, 180, 64, 51, 224, 152, 222, 138, 50, 18, 214, 249, 228, 39, 144, 167, 189, 218, 52, 32, + 66, 29, 106, 41, 224, 142, 12, 190, 118, 248, 2, 34, 230, 25, 148, 230, 227, 221, 186, 169, + 215, 97, 152, 76, 119, 45, 215, 218, 172, 248, 76, 97, 158, 99, 118, 163, 23, 67, 252, 99, + 196, 32, 23, 101, 191, 48, 254, 177, 171, 123, 204, 186, 57, 218, 85, 161, 169, 125, 191, + 86, 204, 3, 221, 235, 255, 31, 201, 159, 17, 157, 163, 118, 34, 218, 149, 220, 176, 115, + 100, 104, 40, 75, 240, 91, 73, 131, 237, 218, 75, 164, 42, 100, 4, 19, 252, 127, 35, 206, + 72, 198, 112, 79, 1, 142, 71, 4, 208, 244, 20, 169, 154, 176, 144, 43, 206, 229, 9, 102, 48, + 34, 201, 77, 32, 67, 228, 39, 160, 245, 155, 165, 69, 140, 44, 164, 142, 45, 241, 191, 11, + 22, 166, 149, 11, 195, 129, 195, 113, 68, 9, 218, 88, 7, 12, 79, 215, 214, 190, 9, 69, 175, + 74, 0, 157, 214, 241, 145, 19, 42, 55, 212, 97, 136, 100, 42, 201, 177, 90, 75, 91, 224, + 187, 159, 95, 225, 187, 120, 182, 255, 223, 175, 208, 188, 61, 8, 104, 164, 108, 193, 235, + 89, 206, 248, 84, 45, 203, 38, 179, 246, 81, 254, 47, 152, 3, 34, 192, 212, 237, 145, 229, + 238, 0, 59, 26, 182, 12, 201, 246, 252, 175, 130, 18, 183, 52, 79, 21, 168, 243, 29, 91, + 124, 39, 184, 149, 226, 156, 46, 218, 165, 231, 8, 65, 37, 49, 78, 130, 181, 175, 155, 8, + 18, 54, 9, 100, 116, 83, 227, 12, 197, 21, 170, 196, 220, 54, 71, 188, 222, 240, 209, 222, + 50, 244, 91, 116, 85, 60, 10, 132, 247, 19, 77, 220, 90, 172, 218, 108, 179, 24, 83, 140, + 210, 116, 133, 122, 18, 47, 204, 167, 93, 214, 36, 176, 45, 19, 172, 206, 150, 218, 204, + 196, 224, 233, 136, 53, 125, 85, 78, 25, 119, 220, 37, 169, 232, 167, 87, 43, 21, 210, 14, + 173, 109, 241, 192, 132, 251, 17, 238, 2, 33, 27, 161, 122, 229, 145, 220, 170, 92, 44, 233, + 45, 223, 105, 136, 138, 179, 248, 167, 168, 50, 78, 97, 102, 52, 115, 192, 222, 118, 20, + 120, 84, 34, 1, 146, 51, 57, 202, 192, 233, 4, 68, 121, 240, 148, 36, 176, 220, 167, 103, + 10, 135, 97, 132, 36, 20, 23, 74, 182, 167, 71, 104, 61, 141, 147, 122, 26, 151, 234, 41, + 111, 172, 194, 174, 209, 175, 58, 5, 229, 243, 194, 231, 138, 206, 59, 27, 140, 126, 82, 95, + 120, 114, 113, 164, 234, 141, 203, 122, 99, 1, 172, 112, 174, 245, 171, 31, 96, 229, 211, + 19, 139, 95, 24, 89, 206, 36, 66, 243, 81, 100, 120, 108, 16, 129, 115, 207, 165, 226, 52, + 76, 214, 197, 109, 203, 206, 123, 246, 234, 180, 56, 121, 182, 57, 249, 175, 0, 3, 0, 104, + 229, 64, 7, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, + 115, 32, 49, 52, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, + 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, + 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, + 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, + 32, 82, 47, 84, 84, 52, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 53, 32, 49, 57, 53, 32, + 48, 32, 82, 47, 84, 84, 54, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, + 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, + 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 53, + 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, + 49, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 52, 51, + 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 109, 111, 28, 199, 13, + 254, 174, 95, 177, 31, 119, 139, 220, 122, 103, 118, 246, 45, 9, 130, 214, 150, 91, 56, 142, + 147, 0, 190, 20, 40, 220, 2, 181, 116, 214, 139, 45, 203, 194, 201, 23, 193, 253, 245, 29, + 190, 14, 103, 119, 207, 78, 225, 194, 144, 177, 55, 195, 153, 33, 31, 146, 15, 201, 199, + 219, 147, 71, 191, 190, 222, 127, 44, 190, 255, 254, 209, 139, 39, 207, 78, 139, 166, 248, + 225, 135, 199, 167, 79, 138, 147, 166, 128, 127, 251, 203, 147, 71, 219, 109, 83, 56, 95, + 108, 47, 78, 154, 122, 154, 166, 17, 55, 92, 225, 167, 177, 110, 198, 98, 240, 190, 14, 197, + 246, 253, 73, 217, 86, 219, 183, 32, 237, 10, 215, 214, 19, 30, 232, 235, 166, 113, 81, 122, + 187, 59, 41, 11, 216, 222, 184, 113, 172, 39, 55, 22, 27, 215, 215, 173, 79, 27, 116, 14, + 15, 185, 49, 30, 107, 135, 98, 211, 119, 77, 221, 135, 185, 140, 220, 189, 81, 185, 229, 85, + 170, 112, 209, 119, 174, 238, 139, 237, 233, 201, 171, 114, 170, 250, 178, 174, 254, 181, + 253, 17, 36, 60, 75, 76, 117, 219, 123, 171, 161, 81, 196, 247, 241, 249, 142, 54, 95, 149, + 219, 120, 252, 170, 10, 229, 155, 106, 227, 163, 232, 102, 224, 207, 243, 202, 151, 31, 226, + 222, 109, 181, 113, 29, 126, 189, 143, 95, 229, 167, 40, 193, 98, 112, 234, 53, 172, 221, + 87, 155, 137, 215, 206, 170, 217, 113, 60, 100, 238, 142, 7, 188, 227, 239, 155, 184, 231, + 80, 234, 99, 181, 233, 120, 17, 15, 192, 218, 190, 26, 245, 224, 20, 202, 139, 120, 179, 44, + 163, 12, 221, 116, 19, 127, 94, 199, 63, 212, 1, 197, 119, 81, 144, 142, 204, 149, 211, 27, + 225, 174, 27, 249, 1, 154, 226, 251, 124, 218, 139, 170, 215, 168, 222, 109, 37, 154, 161, + 144, 64, 5, 66, 128, 249, 166, 133, 96, 232, 163, 183, 134, 186, 243, 4, 233, 211, 106, 40, + 127, 173, 54, 109, 249, 87, 80, 224, 151, 202, 177, 62, 9, 11, 252, 82, 172, 246, 162, 63, + 92, 14, 198, 220, 169, 9, 199, 208, 80, 93, 208, 198, 91, 149, 223, 49, 74, 135, 10, 124, 1, + 158, 35, 128, 200, 146, 80, 94, 50, 26, 114, 5, 200, 210, 79, 31, 191, 6, 253, 5, 160, 192, + 147, 31, 226, 201, 54, 61, 254, 77, 53, 89, 108, 225, 70, 134, 59, 226, 3, 167, 191, 137, + 203, 77, 25, 226, 87, 195, 127, 246, 62, 113, 247, 204, 152, 29, 155, 141, 202, 193, 7, 170, + 38, 254, 117, 3, 67, 221, 32, 200, 3, 135, 253, 157, 24, 143, 17, 153, 160, 5, 157, 240, 60, + 59, 158, 108, 188, 64, 45, 57, 73, 218, 194, 185, 186, 9, 152, 201, 109, 221, 14, 45, 39, + 202, 191, 57, 81, 90, 78, 148, 69, 230, 152, 172, 122, 85, 186, 120, 45, 128, 214, 163, 89, + 69, 252, 2, 168, 81, 165, 119, 226, 29, 120, 254, 60, 174, 12, 107, 96, 194, 166, 250, 49, + 129, 115, 16, 55, 201, 5, 191, 197, 0, 194, 112, 122, 86, 109, 70, 92, 73, 254, 132, 95, 30, + 145, 134, 171, 61, 170, 4, 95, 181, 136, 210, 159, 79, 198, 11, 135, 108, 6, 95, 15, 109, + 40, 54, 126, 210, 192, 117, 236, 179, 5, 157, 184, 46, 90, 222, 30, 227, 19, 160, 179, 112, + 140, 79, 92, 51, 133, 148, 117, 23, 24, 147, 224, 99, 136, 136, 107, 129, 66, 157, 6, 7, + 156, 163, 112, 64, 159, 222, 217, 84, 93, 241, 50, 226, 141, 95, 215, 138, 32, 167, 3, 94, + 148, 156, 79, 154, 8, 117, 16, 124, 49, 118, 252, 160, 123, 24, 49, 160, 151, 234, 159, 30, + 196, 61, 14, 127, 20, 126, 160, 55, 199, 228, 66, 75, 8, 67, 70, 8, 224, 210, 91, 14, 242, + 223, 193, 51, 121, 218, 163, 58, 25, 145, 89, 171, 36, 110, 216, 170, 54, 179, 169, 181, 48, + 236, 37, 135, 240, 122, 203, 105, 34, 171, 148, 115, 91, 169, 83, 196, 33, 41, 105, 216, + 204, 118, 133, 226, 91, 195, 162, 184, 118, 96, 255, 172, 189, 6, 183, 222, 46, 126, 81, 62, + 192, 25, 56, 123, 47, 57, 159, 112, 33, 241, 157, 104, 152, 54, 110, 16, 139, 30, 99, 98, + 37, 20, 98, 204, 251, 49, 227, 10, 192, 31, 184, 226, 165, 176, 168, 173, 70, 150, 24, 186, + 37, 185, 119, 95, 14, 7, 16, 82, 224, 113, 249, 91, 72, 83, 210, 32, 22, 249, 113, 194, 236, + 2, 198, 130, 40, 0, 43, 53, 179, 2, 39, 79, 23, 183, 221, 145, 196, 114, 161, 118, 146, 117, + 148, 156, 14, 147, 51, 226, 65, 76, 157, 147, 75, 206, 171, 142, 188, 39, 140, 146, 234, 35, + 173, 66, 68, 1, 158, 187, 100, 191, 39, 68, 40, 143, 52, 231, 114, 46, 149, 72, 86, 239, + 192, 147, 176, 129, 16, 63, 104, 40, 18, 108, 16, 90, 87, 149, 15, 200, 142, 143, 171, 86, + 226, 201, 19, 100, 18, 229, 158, 104, 234, 133, 196, 59, 190, 166, 129, 33, 25, 205, 81, + 217, 75, 158, 197, 6, 173, 235, 115, 254, 186, 230, 28, 90, 160, 60, 70, 134, 58, 214, 14, + 97, 231, 165, 40, 79, 130, 112, 175, 8, 31, 169, 92, 93, 249, 19, 178, 242, 223, 4, 27, 106, + 121, 36, 85, 53, 195, 180, 191, 200, 83, 249, 40, 164, 9, 83, 32, 254, 183, 128, 209, 91, + 37, 173, 132, 176, 22, 27, 42, 185, 196, 243, 4, 76, 87, 135, 216, 223, 173, 1, 179, 10, 78, + 44, 134, 126, 60, 138, 78, 22, 131, 158, 107, 94, 179, 18, 126, 139, 218, 246, 4, 10, 51, + 128, 134, 25, 124, 109, 130, 13, 23, 52, 78, 232, 18, 161, 135, 227, 132, 222, 241, 35, 146, + 178, 14, 127, 53, 172, 18, 133, 252, 145, 190, 5, 196, 239, 22, 237, 214, 204, 25, 194, 238, + 129, 193, 116, 222, 32, 234, 155, 37, 162, 104, 198, 255, 8, 103, 22, 108, 129, 123, 46, 12, + 184, 241, 75, 41, 221, 81, 23, 240, 130, 234, 100, 87, 254, 104, 74, 25, 100, 26, 172, 157, + 174, 245, 133, 142, 136, 95, 151, 222, 201, 13, 198, 5, 18, 186, 18, 141, 182, 26, 228, 41, + 215, 101, 164, 182, 142, 193, 88, 135, 230, 143, 69, 20, 246, 52, 234, 130, 67, 21, 18, 51, + 80, 177, 240, 137, 209, 134, 160, 99, 69, 94, 69, 121, 211, 142, 8, 188, 4, 8, 135, 60, 165, + 245, 158, 213, 56, 193, 221, 181, 80, 233, 109, 214, 162, 212, 17, 46, 196, 61, 235, 41, 92, + 64, 126, 204, 204, 123, 167, 8, 171, 191, 8, 230, 237, 159, 34, 46, 192, 150, 218, 4, 241, + 102, 103, 187, 110, 241, 248, 74, 76, 160, 50, 169, 118, 154, 80, 96, 129, 79, 146, 153, + 202, 75, 176, 245, 143, 184, 0, 139, 194, 54, 222, 165, 132, 164, 220, 232, 204, 242, 46, + 41, 188, 150, 31, 154, 243, 95, 147, 31, 200, 32, 169, 255, 184, 146, 190, 142, 195, 51, + 139, 20, 148, 184, 152, 187, 34, 235, 0, 151, 237, 255, 24, 234, 198, 13, 127, 180, 253, + 119, 77, 12, 127, 111, 185, 16, 195, 74, 216, 199, 133, 213, 9, 0, 55, 62, 19, 111, 46, 31, + 197, 68, 229, 101, 132, 199, 141, 172, 7, 8, 233, 192, 241, 241, 10, 118, 47, 196, 139, 123, + 9, 40, 27, 220, 126, 18, 55, 78, 161, 238, 134, 105, 181, 115, 93, 212, 251, 60, 236, 158, + 199, 173, 102, 214, 190, 74, 196, 189, 212, 8, 126, 175, 255, 101, 2, 63, 35, 67, 73, 125, + 184, 210, 134, 180, 174, 218, 114, 101, 108, 137, 125, 149, 11, 25, 7, 253, 157, 90, 5, 204, + 38, 135, 31, 31, 168, 49, 196, 102, 172, 131, 30, 55, 208, 210, 158, 20, 230, 59, 59, 233, + 193, 226, 0, 211, 137, 91, 255, 18, 15, 188, 175, 192, 71, 24, 192, 208, 25, 245, 98, 99, + 116, 221, 235, 106, 192, 191, 155, 185, 98, 93, 91, 55, 157, 147, 91, 160, 225, 249, 167, + 247, 61, 121, 161, 7, 131, 251, 164, 208, 155, 10, 123, 201, 33, 18, 77, 92, 65, 205, 30, + 16, 96, 214, 16, 62, 118, 34, 156, 142, 234, 18, 168, 133, 43, 231, 212, 22, 67, 19, 17, + 127, 169, 249, 191, 195, 221, 111, 42, 175, 143, 161, 92, 2, 229, 3, 55, 179, 67, 100, 2, + 175, 131, 139, 107, 218, 122, 88, 204, 131, 238, 43, 231, 193, 95, 170, 196, 123, 49, 30, + 67, 108, 237, 149, 27, 22, 61, 30, 11, 208, 80, 98, 168, 60, 200, 156, 99, 38, 75, 86, 169, + 215, 228, 28, 235, 174, 241, 201, 141, 20, 107, 83, 188, 194, 167, 249, 134, 239, 122, 142, + 160, 226, 127, 234, 72, 81, 191, 235, 99, 52, 24, 71, 226, 129, 52, 188, 0, 222, 144, 104, + 7, 155, 21, 82, 22, 84, 79, 237, 252, 174, 56, 129, 192, 24, 153, 95, 112, 70, 139, 200, + 151, 155, 248, 131, 152, 124, 207, 205, 89, 202, 122, 3, 199, 130, 245, 137, 116, 27, 23, + 11, 105, 150, 173, 200, 58, 242, 26, 182, 138, 218, 198, 131, 170, 60, 27, 58, 124, 87, 59, + 130, 52, 25, 200, 228, 54, 153, 206, 85, 60, 163, 211, 19, 214, 14, 150, 122, 144, 242, 241, + 209, 208, 29, 108, 224, 157, 202, 209, 114, 199, 165, 12, 145, 19, 149, 88, 128, 240, 12, + 77, 186, 97, 243, 169, 247, 97, 17, 160, 45, 194, 221, 77, 43, 29, 65, 54, 170, 78, 25, 74, + 33, 91, 3, 20, 93, 80, 77, 206, 248, 101, 209, 209, 11, 162, 88, 119, 211, 163, 193, 190, + 41, 29, 170, 182, 222, 241, 210, 201, 78, 85, 218, 229, 75, 212, 34, 69, 147, 212, 22, 153, + 131, 249, 93, 180, 74, 19, 210, 181, 248, 40, 57, 159, 228, 20, 85, 205, 21, 50, 119, 30, + 249, 125, 204, 91, 167, 69, 83, 218, 66, 36, 13, 121, 146, 134, 47, 137, 249, 75, 248, 143, + 8, 87, 150, 36, 75, 138, 121, 58, 12, 177, 86, 118, 154, 205, 170, 146, 160, 121, 16, 191, + 94, 217, 18, 43, 170, 5, 95, 15, 126, 146, 195, 47, 185, 27, 1, 31, 196, 255, 222, 241, 44, + 35, 58, 242, 54, 146, 236, 166, 151, 167, 204, 182, 115, 217, 105, 23, 72, 90, 242, 97, 24, + 234, 48, 117, 152, 16, 82, 25, 176, 74, 129, 105, 120, 238, 147, 16, 241, 253, 220, 200, + 214, 71, 202, 26, 44, 121, 43, 228, 68, 161, 18, 111, 201, 225, 218, 36, 103, 97, 193, 94, + 71, 162, 49, 174, 210, 234, 133, 15, 245, 11, 146, 245, 95, 73, 178, 219, 120, 222, 80, 99, + 140, 233, 44, 133, 101, 204, 209, 36, 166, 209, 234, 188, 82, 97, 52, 224, 50, 51, 110, 151, + 186, 210, 136, 173, 237, 174, 225, 172, 61, 119, 44, 148, 37, 143, 36, 239, 225, 192, 50, + 166, 121, 99, 94, 20, 210, 236, 71, 156, 135, 66, 162, 3, 188, 168, 57, 156, 49, 48, 72, 37, + 131, 231, 143, 106, 103, 4, 255, 233, 120, 215, 246, 117, 211, 12, 25, 147, 102, 106, 170, + 13, 248, 200, 183, 21, 49, 148, 75, 12, 165, 99, 2, 30, 19, 78, 178, 157, 87, 98, 16, 170, + 30, 74, 154, 118, 220, 205, 209, 106, 93, 48, 109, 19, 240, 165, 146, 57, 239, 146, 157, + 176, 115, 87, 5, 211, 90, 226, 117, 210, 185, 241, 75, 222, 56, 231, 222, 188, 112, 145, + 157, 228, 197, 115, 91, 50, 225, 227, 63, 90, 211, 180, 213, 54, 86, 166, 75, 117, 112, 146, + 27, 104, 94, 184, 65, 187, 199, 84, 59, 156, 250, 164, 109, 109, 61, 71, 10, 214, 233, 228, + 80, 25, 215, 241, 123, 243, 110, 153, 44, 56, 104, 21, 33, 151, 0, 196, 204, 210, 110, 222, + 57, 208, 238, 94, 119, 83, 17, 188, 51, 238, 180, 126, 73, 161, 200, 182, 127, 71, 33, 224, + 230, 5, 64, 132, 168, 78, 39, 141, 239, 48, 244, 228, 26, 141, 244, 157, 230, 140, 245, 187, + 251, 82, 249, 228, 102, 89, 195, 2, 159, 87, 159, 223, 39, 169, 25, 80, 151, 212, 13, 141, + 169, 59, 48, 101, 27, 208, 111, 148, 59, 79, 163, 27, 102, 245, 180, 163, 185, 144, 42, 168, + 12, 159, 50, 214, 160, 10, 199, 32, 251, 46, 254, 242, 243, 241, 149, 174, 20, 142, 103, 24, + 8, 163, 157, 122, 187, 155, 33, 161, 17, 120, 169, 203, 234, 214, 91, 117, 188, 193, 170, + 51, 227, 70, 26, 193, 198, 216, 0, 109, 220, 231, 154, 28, 203, 143, 86, 9, 188, 232, 140, + 195, 100, 150, 201, 24, 182, 204, 255, 179, 50, 216, 182, 93, 61, 250, 49, 213, 23, 36, 52, + 183, 54, 222, 144, 232, 178, 13, 111, 255, 15, 21, 34, 133, 66, 10, 219, 189, 52, 157, 212, + 126, 249, 52, 56, 206, 243, 38, 157, 73, 121, 183, 224, 98, 147, 82, 121, 92, 220, 231, 193, + 203, 228, 204, 179, 174, 153, 15, 226, 138, 198, 217, 65, 211, 230, 86, 148, 16, 6, 89, 70, + 247, 51, 48, 66, 98, 139, 252, 135, 15, 255, 25, 10, 62, 32, 216, 224, 159, 239, 77, 94, 62, + 40, 173, 209, 239, 51, 121, 70, 250, 209, 69, 91, 246, 197, 122, 145, 146, 0, 174, 28, 150, + 99, 11, 46, 10, 118, 66, 140, 154, 145, 139, 8, 206, 196, 45, 78, 19, 45, 125, 150, 253, 37, + 175, 148, 199, 51, 250, 135, 155, 207, 43, 159, 178, 146, 215, 206, 102, 202, 106, 250, 169, + 32, 222, 144, 250, 129, 209, 100, 153, 62, 149, 53, 179, 112, 205, 142, 251, 238, 189, 166, + 205, 220, 76, 153, 217, 156, 142, 67, 182, 61, 111, 20, 112, 96, 167, 231, 175, 245, 73, + 211, 119, 13, 44, 251, 244, 197, 147, 226, 228, 233, 246, 228, 191, 2, 12, 0, 120, 185, 72, + 187, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 49, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, + 32, 49, 54, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, 82, 47, + 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, + 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, + 84, 84, 50, 32, 49, 57, 50, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, + 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, + 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 54, 47, 84, 121, 112, + 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 49, 54, 32, 48, 32, + 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, + 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 56, 52, 49, 62, 62, 115, + 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 109, 111, 28, 183, 17, 254, 126, 191, 98, + 63, 238, 22, 217, 245, 145, 203, 189, 221, 13, 130, 0, 241, 75, 91, 167, 117, 106, 212, 215, + 6, 133, 221, 15, 82, 206, 119, 146, 37, 43, 103, 89, 87, 213, 249, 245, 225, 12, 103, 134, + 67, 114, 207, 40, 80, 4, 114, 164, 229, 112, 56, 175, 207, 60, 243, 116, 187, 122, 242, 250, + 226, 254, 161, 250, 238, 187, 39, 175, 158, 189, 124, 94, 173, 171, 239, 191, 127, 250, 252, + 89, 181, 90, 87, 240, 223, 253, 97, 245, 100, 187, 93, 87, 198, 86, 219, 253, 106, 221, 205, + 243, 60, 225, 129, 169, 236, 60, 117, 235, 169, 26, 173, 237, 92, 181, 253, 184, 170, 93, + 179, 253, 0, 210, 166, 50, 125, 55, 227, 133, 77, 183, 94, 27, 47, 189, 221, 173, 234, 10, + 142, 91, 51, 77, 221, 108, 166, 170, 53, 155, 174, 183, 241, 32, 220, 195, 75, 102, 242, + 215, 250, 177, 106, 55, 195, 186, 219, 184, 92, 134, 117, 183, 34, 247, 21, 85, 174, 51, + 155, 190, 218, 12, 166, 219, 128, 192, 219, 218, 52, 155, 250, 93, 211, 252, 123, 251, 35, + 200, 89, 146, 155, 187, 201, 89, 109, 167, 114, 218, 152, 110, 176, 116, 248, 182, 126, 209, + 140, 245, 47, 77, 107, 235, 95, 225, 159, 187, 166, 237, 195, 111, 31, 155, 118, 172, 175, + 155, 33, 28, 86, 77, 107, 140, 67, 97, 60, 56, 138, 220, 99, 227, 234, 247, 141, 173, 239, + 155, 118, 8, 103, 240, 23, 234, 121, 240, 166, 209, 69, 20, 221, 55, 173, 227, 15, 63, 123, + 205, 241, 157, 112, 133, 124, 136, 97, 115, 93, 63, 140, 108, 232, 183, 254, 109, 186, 252, + 28, 222, 122, 15, 183, 223, 7, 163, 93, 189, 243, 63, 23, 254, 180, 254, 2, 250, 240, 183, + 219, 102, 226, 11, 63, 192, 223, 32, 246, 0, 55, 81, 228, 87, 111, 220, 194, 37, 186, 240, + 47, 127, 10, 18, 31, 224, 219, 5, 223, 246, 191, 88, 16, 1, 67, 91, 54, 175, 53, 163, 143, + 103, 176, 241, 39, 239, 21, 74, 227, 59, 215, 222, 0, 80, 114, 199, 207, 220, 130, 114, 126, + 226, 239, 222, 231, 147, 255, 117, 240, 161, 155, 22, 206, 255, 10, 215, 255, 211, 180, 83, + 112, 18, 188, 185, 198, 243, 171, 198, 161, 90, 31, 62, 211, 163, 15, 116, 227, 21, 63, 250, + 185, 105, 231, 240, 79, 48, 1, 228, 238, 162, 220, 21, 219, 131, 34, 244, 17, 63, 248, 92, + 155, 17, 207, 225, 34, 190, 27, 45, 224, 151, 122, 7, 201, 246, 134, 188, 167, 252, 81, 132, + 192, 141, 27, 48, 1, 255, 186, 244, 210, 183, 172, 132, 222, 192, 247, 78, 254, 224, 23, + 239, 59, 252, 224, 33, 89, 107, 214, 20, 217, 53, 134, 116, 244, 245, 253, 220, 135, 20, + 244, 96, 122, 64, 199, 224, 194, 123, 224, 254, 37, 90, 9, 118, 132, 208, 76, 245, 111, 193, + 127, 248, 4, 222, 30, 216, 187, 193, 161, 109, 69, 176, 39, 62, 125, 132, 139, 160, 19, 149, + 83, 77, 129, 48, 157, 131, 114, 170, 30, 27, 4, 233, 96, 194, 208, 154, 248, 225, 150, 181, + 99, 32, 174, 68, 137, 179, 245, 27, 209, 13, 66, 123, 10, 230, 232, 234, 63, 115, 32, 66, + 250, 143, 116, 226, 181, 253, 9, 60, 184, 167, 42, 130, 184, 193, 25, 134, 171, 131, 172, + 144, 212, 207, 205, 28, 163, 28, 188, 177, 161, 14, 110, 37, 60, 58, 178, 80, 172, 16, 89, + 233, 157, 197, 124, 13, 3, 117, 203, 21, 54, 56, 231, 73, 31, 31, 206, 154, 167, 239, 83, + 184, 6, 202, 2, 42, 160, 98, 179, 168, 124, 241, 49, 250, 120, 199, 127, 255, 23, 74, 0, 69, + 232, 4, 223, 121, 144, 114, 59, 228, 198, 193, 179, 251, 168, 29, 143, 224, 69, 110, 72, 73, + 119, 40, 24, 56, 10, 65, 218, 254, 129, 99, 131, 199, 71, 146, 125, 20, 204, 1, 47, 116, + 161, 56, 177, 203, 104, 55, 116, 96, 208, 186, 171, 152, 216, 61, 42, 133, 218, 17, 101, + 203, 176, 65, 242, 202, 25, 168, 24, 169, 50, 184, 157, 120, 14, 194, 71, 245, 248, 14, 43, + 144, 91, 78, 204, 39, 201, 212, 1, 57, 13, 10, 32, 42, 2, 38, 177, 0, 148, 69, 247, 82, 88, + 24, 51, 142, 238, 45, 86, 222, 20, 67, 254, 32, 5, 25, 193, 68, 202, 164, 167, 246, 131, 99, + 137, 29, 29, 44, 215, 74, 175, 16, 12, 21, 114, 123, 30, 148, 78, 178, 218, 163, 89, 124, + 51, 111, 125, 144, 147, 39, 57, 85, 120, 81, 16, 127, 23, 223, 140, 41, 255, 200, 253, 34, + 90, 181, 55, 217, 221, 18, 209, 98, 186, 165, 249, 98, 14, 233, 65, 155, 229, 113, 159, 52, + 161, 130, 246, 141, 26, 76, 28, 120, 132, 75, 70, 8, 208, 180, 245, 98, 210, 89, 12, 166, + 118, 144, 200, 51, 74, 80, 92, 224, 68, 220, 131, 191, 71, 23, 175, 223, 82, 129, 144, 181, + 4, 112, 32, 178, 152, 70, 59, 40, 216, 63, 226, 143, 237, 163, 149, 36, 17, 122, 97, 31, + 175, 72, 170, 30, 67, 107, 149, 232, 149, 53, 141, 164, 226, 90, 39, 153, 243, 50, 39, 105, + 33, 155, 231, 188, 15, 105, 74, 137, 235, 168, 56, 213, 30, 174, 237, 146, 108, 92, 115, 19, + 130, 246, 111, 188, 142, 53, 137, 125, 242, 127, 159, 146, 236, 72, 116, 208, 121, 45, 123, + 217, 40, 167, 195, 240, 217, 53, 60, 121, 224, 175, 195, 162, 43, 142, 62, 45, 76, 225, 232, + 66, 222, 31, 129, 144, 65, 81, 133, 72, 72, 7, 167, 16, 12, 215, 200, 231, 17, 242, 198, + 211, 179, 196, 21, 188, 151, 204, 165, 49, 22, 93, 64, 146, 37, 36, 28, 139, 210, 0, 165, + 140, 44, 15, 203, 211, 124, 116, 4, 201, 144, 53, 142, 105, 224, 45, 194, 89, 80, 235, 55, + 13, 203, 167, 110, 125, 129, 106, 165, 19, 41, 89, 61, 41, 225, 64, 151, 255, 24, 126, 61, + 55, 43, 165, 158, 198, 100, 224, 73, 80, 209, 24, 136, 146, 84, 165, 6, 107, 246, 61, 159, + 30, 121, 6, 24, 115, 185, 245, 20, 154, 169, 161, 193, 68, 79, 35, 181, 30, 194, 102, 112, + 10, 207, 239, 19, 68, 94, 180, 32, 167, 53, 139, 3, 71, 143, 85, 73, 104, 132, 75, 229, 193, + 87, 203, 84, 103, 13, 132, 47, 26, 51, 157, 231, 133, 57, 137, 29, 98, 206, 100, 172, 193, + 215, 220, 159, 33, 230, 66, 19, 154, 97, 17, 190, 6, 37, 115, 118, 142, 12, 57, 23, 9, 213, + 59, 213, 109, 73, 139, 6, 38, 77, 237, 20, 89, 69, 214, 159, 186, 234, 85, 242, 134, 250, + 157, 181, 198, 135, 231, 31, 13, 35, 68, 40, 125, 171, 32, 76, 82, 224, 101, 109, 131, 253, + 104, 184, 26, 61, 8, 117, 189, 95, 63, 91, 59, 203, 194, 98, 255, 207, 237, 241, 53, 56, + 226, 247, 14, 172, 174, 222, 227, 202, 63, 225, 241, 151, 94, 235, 103, 136, 196, 21, 172, + 129, 143, 33, 83, 155, 250, 6, 255, 165, 69, 209, 216, 240, 17, 238, 249, 169, 249, 23, 127, + 229, 135, 6, 32, 197, 223, 136, 119, 81, 228, 182, 177, 3, 203, 189, 9, 155, 154, 119, 23, + 23, 199, 143, 180, 184, 65, 241, 25, 81, 246, 174, 110, 124, 252, 200, 54, 47, 74, 159, 197, + 54, 126, 12, 149, 69, 247, 121, 241, 180, 195, 166, 51, 189, 201, 22, 79, 208, 240, 71, 94, + 62, 168, 166, 225, 155, 16, 43, 201, 215, 137, 176, 124, 9, 143, 66, 34, 232, 1, 189, 58, + 226, 77, 169, 44, 198, 254, 133, 222, 214, 12, 198, 14, 78, 151, 156, 94, 255, 100, 72, 48, + 22, 136, 172, 154, 28, 150, 186, 87, 222, 221, 179, 15, 120, 75, 230, 60, 35, 15, 163, 151, + 229, 62, 21, 18, 193, 20, 74, 127, 227, 64, 221, 32, 255, 75, 41, 71, 201, 18, 206, 66, 31, + 28, 74, 183, 179, 241, 5, 46, 48, 47, 16, 14, 151, 79, 61, 168, 78, 105, 39, 230, 169, 26, + 115, 64, 32, 37, 150, 12, 114, 189, 137, 3, 58, 36, 34, 25, 101, 76, 255, 65, 76, 86, 28, + 222, 49, 208, 95, 162, 242, 32, 176, 79, 134, 28, 125, 124, 9, 175, 177, 107, 194, 96, 120, + 152, 130, 196, 22, 159, 45, 72, 28, 28, 73, 1, 104, 115, 35, 72, 203, 10, 149, 192, 150, 98, + 96, 37, 182, 138, 178, 189, 190, 43, 95, 101, 226, 245, 233, 116, 233, 83, 68, 110, 177, + 229, 54, 177, 36, 193, 250, 71, 65, 201, 155, 4, 47, 227, 100, 16, 175, 51, 222, 170, 30, + 144, 106, 87, 223, 18, 106, 215, 23, 21, 163, 225, 146, 2, 49, 198, 106, 15, 87, 248, 44, + 174, 29, 145, 252, 81, 195, 244, 161, 16, 36, 252, 121, 217, 162, 27, 75, 101, 41, 122, 153, + 213, 71, 96, 72, 193, 67, 70, 247, 210, 40, 118, 17, 38, 78, 233, 119, 233, 215, 48, 59, 24, + 126, 148, 119, 122, 135, 116, 30, 254, 216, 61, 189, 142, 112, 148, 224, 58, 248, 121, 37, + 236, 149, 135, 184, 171, 159, 226, 72, 145, 240, 166, 52, 68, 37, 47, 199, 202, 37, 135, + 250, 64, 193, 249, 201, 56, 71, 149, 252, 53, 87, 71, 2, 60, 92, 247, 138, 104, 29, 217, 36, + 200, 99, 172, 174, 130, 174, 232, 64, 12, 82, 178, 30, 78, 4, 54, 178, 121, 126, 215, 40, + 148, 167, 91, 123, 106, 111, 69, 110, 22, 43, 1, 79, 66, 176, 204, 148, 240, 178, 37, 186, + 82, 208, 169, 240, 172, 231, 182, 71, 61, 92, 164, 139, 193, 216, 223, 146, 26, 229, 4, 152, + 124, 237, 163, 111, 130, 6, 106, 177, 74, 105, 106, 234, 129, 34, 193, 138, 44, 79, 138, 42, + 139, 249, 68, 141, 161, 134, 52, 203, 45, 8, 56, 71, 38, 229, 203, 240, 39, 165, 218, 151, + 27, 119, 9, 156, 37, 80, 92, 104, 11, 223, 62, 201, 62, 146, 196, 102, 97, 215, 226, 165, + 99, 145, 145, 143, 229, 136, 28, 93, 134, 9, 33, 70, 145, 243, 231, 155, 84, 10, 165, 231, + 9, 253, 236, 148, 151, 0, 238, 59, 90, 23, 211, 141, 138, 235, 125, 118, 50, 209, 34, 42, + 17, 153, 204, 23, 129, 100, 217, 155, 207, 86, 230, 12, 57, 29, 139, 97, 92, 222, 160, 143, + 175, 224, 227, 27, 184, 237, 89, 149, 171, 95, 4, 94, 4, 39, 152, 34, 137, 230, 41, 187, + 199, 85, 133, 2, 108, 159, 20, 234, 92, 20, 106, 137, 158, 220, 18, 104, 250, 145, 90, 79, + 74, 185, 196, 206, 49, 237, 242, 165, 162, 49, 186, 16, 150, 107, 222, 156, 41, 122, 157, + 139, 176, 121, 178, 215, 187, 236, 1, 38, 1, 130, 105, 163, 83, 76, 46, 44, 157, 60, 75, + 224, 140, 193, 80, 218, 137, 49, 128, 56, 129, 21, 230, 39, 230, 243, 130, 17, 162, 194, + 123, 192, 67, 214, 221, 151, 84, 91, 108, 136, 144, 65, 33, 65, 138, 188, 73, 153, 11, 232, + 161, 132, 16, 201, 108, 236, 203, 21, 240, 62, 86, 66, 130, 154, 138, 111, 34, 212, 222, 44, + 132, 85, 72, 160, 20, 116, 8, 5, 15, 37, 169, 106, 197, 61, 111, 152, 93, 5, 215, 49, 91, + 210, 208, 187, 198, 165, 232, 111, 83, 244, 183, 188, 145, 194, 55, 73, 29, 175, 81, 42, + 122, 204, 202, 14, 60, 32, 226, 108, 96, 28, 28, 117, 91, 114, 73, 69, 219, 63, 81, 252, 99, + 52, 233, 146, 26, 188, 12, 56, 140, 169, 96, 229, 62, 33, 46, 178, 80, 220, 169, 84, 130, + 188, 224, 128, 30, 40, 12, 81, 103, 76, 115, 68, 130, 161, 6, 225, 55, 113, 46, 95, 89, 80, + 67, 192, 117, 201, 140, 102, 91, 37, 232, 105, 244, 150, 0, 63, 224, 22, 112, 77, 159, 131, + 121, 244, 192, 204, 189, 192, 105, 62, 51, 189, 231, 51, 235, 195, 28, 54, 147, 80, 3, 9, + 176, 135, 195, 50, 200, 51, 197, 236, 150, 204, 185, 108, 204, 156, 54, 216, 236, 20, 51, + 162, 45, 134, 98, 88, 128, 243, 236, 206, 151, 72, 162, 81, 40, 202, 23, 90, 94, 205, 18, + 130, 197, 77, 49, 69, 193, 124, 52, 9, 6, 128, 7, 10, 37, 74, 144, 144, 212, 135, 213, 148, + 67, 29, 199, 163, 160, 241, 24, 209, 88, 152, 80, 9, 133, 160, 64, 189, 145, 150, 95, 156, + 69, 106, 201, 64, 57, 161, 60, 2, 221, 12, 120, 26, 32, 19, 168, 22, 40, 125, 19, 103, 175, + 139, 237, 125, 106, 92, 218, 239, 36, 253, 12, 94, 141, 203, 72, 172, 127, 10, 176, 157, + 117, 127, 255, 239, 186, 105, 41, 9, 244, 26, 162, 32, 46, 37, 195, 218, 213, 127, 107, 140, + 103, 202, 125, 48, 36, 59, 123, 100, 240, 76, 11, 64, 177, 90, 157, 228, 80, 53, 40, 5, 119, + 142, 5, 193, 50, 42, 176, 177, 13, 66, 185, 75, 57, 38, 148, 32, 197, 239, 51, 155, 198, + 163, 196, 140, 214, 53, 35, 0, 105, 167, 130, 57, 74, 133, 9, 9, 225, 17, 141, 199, 84, 95, + 28, 117, 223, 21, 93, 191, 113, 85, 107, 103, 4, 141, 157, 87, 211, 123, 249, 119, 13, 30, + 63, 217, 110, 109, 101, 124, 213, 239, 87, 115, 55, 57, 91, 173, 65, 196, 223, 221, 126, + 128, 179, 53, 157, 25, 227, 91, 131, 14, 223, 250, 188, 160, 75, 45, 20, 121, 11, 83, 16, + 237, 192, 150, 50, 62, 210, 164, 215, 208, 93, 183, 238, 166, 245, 196, 119, 191, 37, 42, + 179, 192, 153, 35, 31, 63, 17, 108, 202, 140, 146, 210, 230, 241, 19, 16, 91, 205, 17, 181, + 204, 201, 26, 147, 38, 253, 179, 198, 55, 78, 63, 190, 144, 142, 194, 44, 180, 76, 33, 194, + 165, 48, 37, 210, 93, 107, 39, 223, 226, 131, 177, 23, 120, 162, 168, 71, 149, 173, 49, 245, + 113, 60, 99, 218, 40, 106, 12, 74, 59, 6, 37, 117, 87, 47, 70, 194, 121, 177, 242, 162, 189, + 84, 125, 190, 125, 82, 60, 138, 246, 233, 162, 41, 210, 114, 159, 22, 255, 117, 26, 232, 11, + 166, 183, 161, 123, 5, 191, 15, 89, 164, 153, 70, 70, 108, 144, 228, 22, 56, 90, 52, 204, + 101, 90, 34, 145, 15, 48, 21, 75, 0, 41, 146, 186, 76, 217, 130, 251, 152, 45, 242, 92, 90, + 172, 168, 74, 147, 3, 187, 168, 228, 10, 48, 142, 182, 148, 48, 229, 39, 52, 70, 194, 100, + 194, 82, 122, 202, 25, 146, 145, 90, 62, 195, 41, 185, 9, 8, 180, 105, 162, 39, 180, 198, + 100, 85, 64, 159, 62, 224, 44, 12, 195, 54, 181, 164, 28, 207, 198, 228, 212, 94, 114, 206, + 220, 34, 153, 35, 60, 216, 40, 134, 97, 122, 65, 88, 143, 41, 145, 139, 102, 193, 33, 60, + 228, 1, 29, 219, 152, 179, 145, 44, 66, 67, 154, 184, 65, 13, 112, 9, 72, 232, 36, 88, 2, + 120, 94, 132, 161, 15, 2, 82, 192, 189, 227, 255, 189, 38, 108, 34, 210, 165, 217, 209, 64, + 54, 51, 112, 210, 147, 122, 145, 9, 204, 219, 126, 189, 120, 72, 48, 219, 92, 148, 195, 73, + 241, 246, 186, 122, 111, 84, 47, 16, 125, 4, 1, 222, 49, 148, 69, 124, 94, 146, 63, 180, 65, + 44, 250, 204, 3, 72, 123, 53, 11, 239, 230, 189, 23, 223, 84, 171, 110, 78, 243, 216, 152, + 217, 45, 192, 33, 238, 28, 122, 225, 164, 44, 217, 34, 77, 86, 149, 69, 68, 218, 18, 82, + 103, 141, 232, 244, 33, 130, 83, 188, 89, 78, 254, 57, 206, 139, 59, 94, 135, 4, 180, 98, + 171, 37, 203, 17, 114, 150, 33, 121, 177, 36, 127, 7, 38, 122, 169, 74, 80, 180, 192, 35, + 43, 63, 248, 52, 11, 23, 134, 118, 33, 35, 40, 27, 11, 112, 163, 160, 246, 65, 9, 164, 255, + 82, 104, 7, 21, 188, 171, 91, 100, 35, 186, 6, 227, 242, 23, 163, 195, 74, 210, 174, 9, 229, + 147, 206, 73, 230, 156, 71, 69, 26, 12, 197, 226, 197, 171, 103, 213, 234, 197, 118, 245, + 187, 0, 3, 0, 56, 228, 7, 123, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, + 110, 100, 111, 98, 106, 13, 49, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, + 116, 101, 110, 116, 115, 32, 49, 56, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, + 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, + 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, + 51, 54, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, + 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, + 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 51, 32, + 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, 80, + 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, + 115, 32, 55, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, + 98, 106, 13, 49, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, + 50, 50, 52, 51, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 91, 111, 219, + 70, 22, 126, 215, 175, 224, 211, 130, 83, 132, 140, 102, 200, 225, 165, 40, 10, 52, 118, 54, + 72, 187, 105, 131, 141, 118, 23, 139, 100, 31, 236, 168, 178, 213, 200, 138, 43, 89, 53, + 242, 239, 119, 206, 117, 134, 20, 229, 58, 112, 97, 136, 38, 103, 206, 156, 57, 247, 243, + 157, 23, 139, 217, 243, 183, 23, 187, 187, 236, 187, 239, 158, 191, 57, 123, 125, 158, 205, + 179, 239, 191, 127, 113, 126, 150, 205, 230, 25, 252, 237, 174, 102, 207, 23, 139, 121, 102, + 93, 182, 88, 205, 230, 101, 223, 247, 29, 110, 216, 204, 245, 93, 57, 239, 178, 214, 185, + 178, 206, 22, 55, 179, 220, 155, 197, 111, 64, 109, 51, 91, 149, 61, 30, 104, 202, 249, 220, + 6, 234, 197, 114, 150, 103, 176, 93, 216, 174, 43, 123, 219, 101, 133, 109, 202, 202, 197, + 13, 58, 135, 135, 108, 23, 142, 85, 109, 86, 52, 126, 94, 54, 245, 152, 70, 120, 23, 74, + 247, 0, 171, 186, 180, 77, 149, 53, 222, 150, 13, 16, 188, 207, 107, 211, 228, 31, 140, 249, + 223, 226, 71, 160, 115, 76, 215, 151, 93, 237, 82, 57, 19, 165, 173, 45, 189, 227, 205, 247, + 249, 43, 83, 84, 249, 206, 20, 62, 255, 213, 56, 252, 109, 97, 37, 51, 133, 181, 117, 178, + 251, 217, 20, 46, 191, 55, 117, 126, 23, 46, 188, 150, 251, 68, 174, 247, 249, 183, 166, + 149, 67, 255, 49, 125, 96, 20, 200, 249, 251, 34, 252, 11, 76, 186, 184, 88, 213, 249, 58, + 124, 223, 192, 198, 109, 120, 248, 124, 35, 219, 184, 134, 111, 91, 188, 44, 92, 13, 164, + 240, 113, 101, 138, 94, 120, 34, 25, 50, 134, 157, 47, 166, 208, 219, 111, 195, 247, 14, 94, + 65, 100, 91, 209, 41, 184, 29, 169, 111, 244, 129, 119, 236, 19, 150, 171, 112, 240, 115, + 80, 14, 104, 121, 73, 207, 34, 177, 74, 149, 161, 250, 243, 224, 168, 54, 152, 50, 91, 156, + 7, 253, 225, 244, 33, 252, 144, 8, 180, 121, 22, 88, 204, 69, 219, 147, 140, 112, 87, 191, + 225, 197, 33, 29, 30, 64, 181, 158, 153, 254, 17, 92, 60, 201, 175, 166, 70, 21, 215, 104, + 6, 53, 221, 159, 113, 2, 63, 240, 62, 30, 7, 99, 92, 226, 42, 120, 96, 131, 204, 224, 13, + 157, 242, 21, 178, 133, 93, 98, 3, 246, 33, 153, 192, 64, 75, 253, 82, 9, 247, 81, 204, 104, + 225, 182, 33, 11, 171, 183, 151, 196, 215, 63, 116, 169, 103, 171, 254, 206, 110, 1, 185, + 33, 50, 142, 194, 203, 121, 209, 194, 215, 83, 87, 220, 98, 84, 64, 32, 129, 204, 192, 230, + 99, 248, 106, 241, 109, 16, 66, 254, 40, 130, 68, 6, 88, 94, 169, 29, 63, 134, 20, 147, 195, + 73, 144, 19, 61, 136, 138, 12, 37, 85, 60, 113, 92, 13, 181, 146, 88, 25, 133, 74, 162, 4, + 220, 2, 155, 112, 120, 79, 166, 197, 104, 60, 14, 220, 63, 76, 209, 197, 184, 89, 243, 25, + 21, 36, 240, 172, 45, 223, 6, 76, 97, 115, 203, 122, 6, 99, 58, 171, 74, 49, 101, 20, 31, + 22, 239, 168, 118, 144, 77, 112, 171, 132, 251, 152, 118, 129, 181, 164, 78, 12, 41, 122, + 215, 15, 101, 223, 112, 23, 184, 223, 195, 53, 119, 38, 44, 95, 71, 138, 196, 248, 209, 47, + 40, 80, 170, 153, 222, 191, 225, 16, 225, 245, 24, 154, 100, 181, 197, 55, 193, 88, 42, 205, + 146, 227, 138, 188, 57, 8, 98, 8, 249, 150, 118, 212, 172, 20, 255, 100, 59, 73, 179, 182, + 214, 202, 118, 71, 245, 151, 21, 68, 233, 134, 137, 198, 244, 20, 136, 28, 12, 176, 128, 20, + 170, 1, 47, 178, 241, 33, 74, 71, 222, 178, 3, 110, 23, 232, 190, 36, 220, 109, 47, 229, + 147, 172, 138, 161, 177, 230, 84, 29, 214, 203, 86, 66, 154, 236, 10, 6, 224, 229, 13, 149, + 90, 103, 99, 112, 254, 106, 108, 159, 23, 209, 138, 200, 69, 237, 163, 165, 63, 51, 254, + 180, 207, 125, 254, 91, 172, 73, 36, 45, 169, 5, 2, 223, 38, 162, 176, 217, 192, 57, 91, 77, + 58, 237, 35, 81, 11, 142, 67, 43, 197, 38, 233, 144, 69, 229, 67, 122, 132, 70, 236, 122, + 172, 62, 208, 39, 223, 2, 249, 142, 216, 112, 55, 212, 47, 104, 137, 240, 31, 186, 231, 30, + 164, 204, 132, 36, 216, 136, 132, 167, 174, 25, 154, 41, 208, 41, 205, 139, 3, 44, 45, 225, + 17, 20, 111, 144, 193, 221, 184, 183, 218, 144, 172, 85, 87, 157, 232, 230, 133, 108, 131, + 176, 222, 145, 176, 54, 220, 6, 192, 160, 20, 94, 149, 240, 242, 101, 213, 140, 89, 201, 69, + 14, 208, 73, 45, 192, 96, 144, 155, 84, 89, 94, 152, 42, 216, 21, 108, 186, 148, 96, 199, + 221, 164, 128, 161, 71, 151, 38, 186, 102, 144, 111, 126, 34, 98, 125, 26, 73, 27, 109, 52, + 154, 213, 227, 238, 239, 211, 18, 131, 17, 58, 170, 251, 17, 0, 80, 49, 131, 148, 145, 210, + 118, 58, 14, 224, 228, 64, 229, 164, 162, 74, 221, 163, 122, 7, 252, 79, 195, 21, 231, 57, + 158, 138, 10, 192, 98, 171, 181, 22, 108, 138, 132, 90, 159, 175, 57, 176, 129, 53, 155, + 165, 147, 178, 78, 9, 229, 199, 29, 201, 199, 211, 108, 116, 94, 97, 11, 251, 35, 251, 114, + 0, 212, 18, 0, 46, 72, 229, 188, 56, 249, 131, 115, 54, 116, 191, 119, 220, 3, 192, 101, 5, + 11, 131, 159, 59, 110, 86, 251, 240, 187, 134, 5, 248, 8, 135, 220, 56, 72, 125, 93, 58, + 111, 133, 109, 22, 52, 66, 127, 29, 52, 3, 39, 186, 61, 136, 155, 244, 153, 68, 118, 41, 64, + 7, 33, 21, 83, 13, 180, 155, 82, 47, 4, 120, 59, 215, 24, 254, 129, 209, 94, 175, 138, 168, + 213, 126, 66, 253, 240, 1, 206, 44, 39, 20, 170, 251, 33, 212, 175, 192, 163, 77, 123, 148, + 105, 143, 131, 223, 49, 157, 67, 77, 81, 248, 253, 26, 44, 191, 229, 70, 2, 130, 168, 65, + 64, 218, 24, 222, 32, 242, 185, 118, 137, 184, 190, 97, 75, 77, 98, 27, 76, 202, 70, 226, + 209, 133, 153, 33, 152, 166, 112, 149, 22, 53, 247, 68, 233, 255, 105, 220, 68, 76, 143, 50, + 246, 56, 38, 125, 254, 143, 24, 180, 234, 145, 55, 146, 155, 156, 92, 182, 154, 144, 92, + 236, 94, 253, 85, 118, 95, 113, 184, 141, 4, 218, 177, 43, 52, 211, 14, 76, 167, 42, 112, + 102, 74, 53, 132, 37, 101, 26, 253, 19, 57, 142, 189, 227, 134, 142, 241, 3, 245, 30, 63, + 213, 77, 171, 247, 47, 67, 121, 166, 117, 42, 170, 247, 72, 15, 189, 133, 166, 164, 149, + 105, 84, 225, 214, 98, 176, 13, 117, 178, 83, 94, 242, 79, 84, 227, 213, 105, 52, 240, 106, + 2, 254, 161, 14, 253, 3, 241, 222, 60, 81, 158, 255, 134, 243, 82, 151, 212, 100, 3, 107, + 221, 139, 181, 156, 76, 1, 221, 3, 246, 105, 159, 40, 207, 223, 105, 202, 35, 103, 106, 171, + 136, 3, 138, 226, 43, 144, 241, 157, 6, 96, 2, 204, 169, 57, 22, 62, 159, 0, 65, 208, 191, + 186, 65, 181, 251, 51, 16, 244, 133, 202, 141, 199, 178, 248, 173, 96, 159, 215, 4, 123, 43, + 16, 12, 42, 22, 36, 83, 248, 218, 147, 240, 30, 178, 165, 69, 232, 195, 69, 46, 12, 42, 240, + 165, 203, 27, 185, 235, 22, 142, 221, 200, 50, 178, 132, 91, 179, 24, 132, 115, 21, 247, + 156, 139, 179, 255, 139, 97, 80, 21, 240, 0, 198, 158, 2, 100, 29, 196, 182, 211, 53, 24, + 219, 101, 175, 24, 168, 98, 136, 114, 173, 173, 81, 106, 248, 158, 216, 130, 75, 136, 160, + 86, 16, 82, 13, 230, 192, 113, 211, 107, 187, 210, 247, 141, 72, 28, 155, 249, 37, 60, 62, + 105, 51, 103, 62, 113, 255, 194, 216, 74, 226, 24, 171, 237, 104, 159, 207, 219, 122, 112, + 254, 223, 134, 96, 64, 100, 188, 63, 130, 172, 85, 200, 185, 128, 125, 20, 14, 224, 193, + 107, 9, 82, 54, 5, 161, 164, 186, 43, 43, 139, 40, 73, 178, 116, 101, 146, 33, 118, 173, + 136, 80, 219, 55, 238, 197, 178, 196, 195, 75, 101, 99, 93, 163, 12, 120, 176, 157, 34, 189, + 206, 53, 95, 211, 80, 225, 96, 156, 174, 134, 33, 48, 6, 171, 213, 104, 144, 196, 5, 148, + 231, 214, 212, 49, 25, 225, 216, 74, 1, 18, 172, 60, 51, 122, 158, 205, 193, 3, 85, 148, + 105, 135, 184, 44, 176, 74, 104, 239, 41, 171, 155, 129, 232, 16, 103, 207, 48, 173, 52, 73, + 24, 147, 66, 146, 96, 136, 141, 138, 90, 43, 60, 155, 170, 206, 127, 9, 189, 4, 144, 255, + 25, 16, 238, 225, 33, 204, 112, 251, 93, 218, 250, 213, 33, 4, 252, 180, 253, 176, 143, 128, + 30, 217, 140, 186, 109, 108, 149, 201, 189, 143, 100, 12, 159, 124, 98, 161, 179, 40, 24, + 244, 114, 48, 180, 10, 99, 95, 51, 20, 229, 112, 248, 162, 226, 168, 223, 112, 208, 212, 37, + 230, 157, 0, 113, 186, 17, 45, 25, 42, 164, 61, 70, 248, 50, 47, 108, 121, 14, 186, 161, 74, + 39, 190, 213, 170, 12, 63, 201, 112, 91, 213, 177, 121, 16, 201, 39, 253, 228, 86, 2, 52, + 113, 246, 209, 42, 190, 230, 144, 221, 74, 172, 179, 174, 118, 40, 118, 45, 107, 199, 97, + 171, 189, 92, 186, 5, 210, 157, 30, 164, 96, 13, 175, 78, 165, 95, 177, 182, 137, 176, 71, + 195, 30, 44, 66, 156, 109, 1, 254, 104, 246, 193, 137, 225, 101, 40, 94, 130, 5, 93, 50, + 109, 166, 14, 88, 124, 51, 203, 63, 228, 92, 192, 165, 30, 86, 161, 207, 234, 40, 242, 135, + 225, 34, 181, 133, 199, 71, 232, 73, 58, 200, 72, 15, 108, 105, 19, 114, 168, 38, 171, 127, + 150, 186, 91, 71, 6, 50, 66, 124, 49, 60, 55, 112, 49, 26, 215, 190, 121, 83, 86, 181, 222, + 31, 218, 187, 131, 25, 83, 216, 13, 250, 73, 2, 40, 97, 111, 92, 32, 11, 113, 224, 70, 82, + 253, 51, 181, 187, 16, 196, 26, 221, 9, 42, 82, 122, 122, 221, 199, 9, 44, 166, 218, 69, 10, + 25, 6, 245, 51, 122, 144, 170, 91, 50, 154, 21, 28, 53, 241, 154, 31, 53, 71, 110, 244, 113, + 144, 92, 12, 251, 127, 11, 239, 138, 124, 236, 188, 47, 251, 0, 105, 210, 34, 255, 211, 16, + 145, 222, 136, 88, 96, 18, 138, 95, 154, 18, 66, 217, 91, 138, 89, 62, 165, 144, 235, 40, + 33, 167, 80, 236, 207, 198, 39, 129, 43, 173, 174, 205, 139, 176, 86, 231, 47, 205, 81, 37, + 42, 9, 176, 121, 245, 211, 90, 76, 15, 139, 80, 6, 15, 156, 76, 49, 32, 165, 49, 88, 242, + 202, 129, 79, 81, 62, 45, 211, 1, 151, 108, 120, 36, 174, 54, 127, 149, 27, 95, 86, 70, 92, + 50, 80, 0, 41, 89, 78, 55, 1, 220, 134, 24, 232, 135, 192, 237, 138, 194, 151, 129, 26, 162, + 48, 68, 96, 27, 134, 109, 248, 177, 163, 106, 163, 195, 13, 99, 182, 37, 60, 96, 233, 140, + 106, 128, 75, 160, 24, 80, 239, 20, 5, 220, 33, 46, 96, 168, 182, 149, 99, 25, 161, 64, 78, + 214, 247, 140, 239, 214, 34, 149, 32, 71, 228, 176, 49, 94, 208, 116, 71, 66, 93, 138, 152, + 42, 248, 0, 80, 174, 128, 249, 46, 193, 33, 8, 12, 88, 215, 131, 66, 206, 105, 29, 241, 112, + 196, 176, 176, 244, 181, 198, 178, 109, 170, 26, 192, 205, 230, 137, 112, 243, 92, 10, 250, + 149, 128, 150, 152, 181, 163, 210, 12, 113, 118, 137, 51, 158, 84, 205, 143, 70, 139, 44, + 101, 56, 68, 218, 227, 7, 92, 160, 78, 43, 210, 137, 162, 142, 140, 174, 100, 252, 162, 123, + 165, 94, 108, 68, 224, 3, 223, 154, 242, 186, 39, 221, 164, 203, 36, 234, 92, 226, 221, 41, + 237, 48, 145, 186, 152, 99, 213, 168, 68, 14, 154, 92, 210, 224, 20, 95, 109, 21, 50, 211, + 68, 211, 14, 202, 144, 86, 85, 17, 24, 236, 129, 231, 184, 137, 58, 63, 201, 15, 215, 71, + 85, 85, 218, 44, 126, 0, 175, 101, 36, 29, 247, 97, 88, 139, 192, 48, 130, 32, 182, 243, + 209, 173, 234, 193, 203, 33, 254, 97, 218, 24, 15, 180, 59, 138, 8, 32, 185, 18, 77, 225, 7, + 82, 112, 9, 193, 205, 137, 106, 135, 235, 247, 18, 142, 137, 195, 96, 93, 45, 49, 45, 19, + 88, 251, 229, 155, 179, 108, 246, 114, 49, 251, 191, 0, 3, 0, 183, 242, 205, 87, 13, 10, + 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 57, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 50, 48, 32, + 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 54, 32, 48, 32, 82, 47, 82, 101, 115, + 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, + 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, + 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 52, + 32, 49, 57, 53, 32, 48, 32, 82, 47, 84, 84, 53, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, + 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, + 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, + 116, 115, 32, 56, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, + 111, 98, 106, 13, 50, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, + 32, 50, 55, 57, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 219, 110, + 27, 71, 18, 125, 215, 87, 240, 45, 156, 69, 102, 60, 221, 115, 225, 204, 34, 8, 160, 216, + 206, 198, 11, 8, 48, 16, 2, 251, 16, 47, 176, 146, 105, 137, 178, 37, 138, 75, 145, 86, 188, + 95, 191, 93, 247, 154, 38, 229, 24, 48, 12, 11, 156, 238, 234, 234, 234, 186, 156, 83, 245, + 203, 242, 236, 197, 219, 203, 221, 126, 246, 211, 79, 47, 46, 94, 190, 121, 53, 171, 103, + 63, 255, 252, 203, 171, 151, 179, 179, 122, 6, 255, 118, 55, 103, 47, 150, 203, 122, 22, + 226, 108, 121, 125, 86, 87, 227, 56, 14, 184, 17, 102, 113, 28, 170, 122, 152, 45, 98, 172, + 218, 217, 242, 254, 108, 222, 23, 203, 143, 32, 29, 102, 161, 169, 70, 60, 208, 87, 117, 29, + 146, 244, 114, 117, 54, 159, 193, 118, 25, 134, 161, 26, 195, 48, 43, 67, 95, 53, 209, 54, + 232, 28, 30, 10, 67, 58, 214, 44, 102, 101, 223, 213, 85, 223, 230, 50, 162, 187, 84, 185, + 231, 85, 213, 179, 190, 11, 85, 63, 91, 190, 58, 251, 99, 126, 91, 12, 243, 77, 209, 206, + 223, 23, 113, 126, 87, 148, 33, 204, 15, 233, 235, 177, 40, 71, 220, 250, 92, 148, 195, 252, + 67, 81, 198, 249, 143, 197, 152, 52, 149, 77, 59, 191, 78, 2, 151, 73, 116, 190, 75, 2, 247, + 240, 3, 4, 98, 250, 12, 253, 188, 44, 122, 212, 133, 103, 64, 241, 190, 40, 187, 180, 5, + 154, 65, 33, 236, 145, 26, 188, 227, 33, 109, 52, 233, 226, 1, 175, 69, 89, 144, 162, 229, + 141, 88, 66, 7, 112, 119, 157, 214, 118, 40, 209, 227, 145, 27, 216, 135, 197, 36, 211, 209, + 22, 94, 125, 39, 63, 240, 5, 201, 220, 24, 204, 28, 210, 39, 79, 191, 78, 151, 117, 168, 80, + 31, 132, 207, 59, 97, 141, 179, 28, 149, 239, 196, 69, 242, 52, 92, 117, 54, 131, 175, 232, + 56, 136, 206, 138, 127, 47, 255, 153, 252, 95, 134, 69, 213, 69, 10, 0, 156, 146, 7, 109, + 209, 146, 116, 50, 46, 218, 244, 209, 226, 43, 204, 118, 248, 127, 139, 158, 220, 200, 203, + 89, 22, 237, 133, 197, 21, 25, 25, 199, 22, 157, 130, 230, 224, 38, 104, 82, 7, 254, 152, + 86, 106, 57, 123, 43, 143, 166, 219, 197, 22, 139, 188, 232, 196, 123, 210, 75, 222, 39, + 185, 69, 246, 218, 71, 103, 12, 94, 3, 42, 248, 251, 56, 95, 216, 66, 9, 0, 93, 172, 9, 128, + 186, 56, 221, 224, 188, 120, 136, 178, 108, 85, 208, 65, 20, 157, 60, 196, 57, 129, 220, + 104, 206, 94, 100, 217, 142, 87, 28, 56, 149, 244, 156, 60, 73, 147, 61, 120, 55, 130, 7, + 183, 228, 10, 88, 207, 35, 139, 139, 211, 96, 170, 172, 249, 73, 115, 234, 100, 154, 245, + 201, 12, 48, 221, 93, 111, 114, 160, 247, 19, 200, 162, 54, 201, 227, 224, 252, 184, 215, + 93, 176, 21, 254, 195, 206, 141, 102, 171, 127, 163, 191, 35, 207, 30, 88, 83, 15, 109, 53, + 64, 82, 33, 254, 106, 242, 66, 207, 5, 126, 42, 191, 241, 122, 241, 201, 19, 28, 213, 52, + 156, 21, 164, 244, 154, 127, 163, 29, 44, 79, 120, 145, 110, 5, 64, 177, 135, 129, 249, 92, + 237, 193, 30, 190, 210, 4, 50, 39, 195, 149, 95, 138, 114, 97, 154, 237, 133, 157, 147, 83, + 223, 238, 211, 86, 201, 168, 178, 21, 85, 21, 84, 1, 92, 22, 249, 113, 19, 224, 7, 28, 79, + 153, 140, 111, 93, 165, 183, 158, 39, 205, 201, 126, 116, 7, 196, 180, 131, 90, 137, 73, 99, + 9, 24, 7, 47, 239, 233, 99, 71, 15, 138, 104, 203, 185, 200, 225, 159, 15, 8, 196, 180, 187, + 99, 3, 123, 60, 249, 64, 136, 131, 206, 239, 230, 191, 130, 221, 168, 108, 3, 127, 86, 98, + 157, 18, 70, 219, 84, 117, 63, 122, 158, 113, 182, 151, 178, 237, 205, 15, 233, 146, 69, + 250, 95, 137, 174, 40, 186, 186, 170, 233, 155, 76, 149, 92, 20, 129, 143, 90, 218, 4, 23, + 176, 167, 193, 105, 169, 40, 207, 93, 76, 13, 38, 15, 24, 48, 197, 36, 169, 68, 42, 62, 127, + 18, 132, 53, 101, 21, 211, 181, 106, 25, 106, 124, 21, 166, 147, 191, 34, 98, 30, 24, 49, + 87, 102, 76, 74, 191, 72, 181, 70, 84, 119, 103, 103, 174, 184, 204, 245, 122, 3, 249, 125, + 170, 20, 159, 24, 156, 250, 30, 230, 224, 192, 164, 196, 136, 158, 4, 79, 45, 177, 81, 136, + 15, 92, 102, 174, 193, 100, 7, 207, 151, 13, 180, 8, 131, 34, 23, 248, 245, 100, 194, 178, + 235, 52, 91, 129, 115, 82, 166, 194, 91, 56, 245, 211, 55, 255, 22, 194, 244, 212, 1, 155, + 57, 81, 179, 139, 183, 46, 36, 184, 253, 129, 50, 153, 86, 31, 157, 2, 41, 66, 248, 108, + 104, 219, 33, 107, 84, 47, 131, 172, 218, 46, 196, 148, 182, 39, 117, 6, 66, 203, 100, 169, + 162, 46, 175, 113, 182, 79, 34, 10, 235, 79, 2, 158, 130, 120, 118, 81, 12, 6, 180, 254, + 122, 134, 47, 112, 244, 242, 111, 201, 179, 87, 108, 172, 188, 227, 134, 122, 159, 156, 102, + 91, 237, 24, 32, 170, 27, 198, 61, 233, 46, 28, 140, 27, 113, 242, 169, 28, 94, 121, 45, + 217, 119, 93, 228, 60, 178, 18, 174, 188, 210, 10, 241, 170, 184, 103, 234, 125, 199, 20, + 61, 123, 88, 34, 180, 157, 71, 231, 65, 150, 4, 64, 185, 41, 144, 42, 208, 48, 91, 150, 62, + 186, 135, 43, 133, 107, 45, 186, 183, 112, 186, 197, 133, 247, 234, 233, 38, 209, 146, 71, + 2, 158, 10, 233, 13, 252, 20, 82, 25, 79, 199, 116, 108, 173, 141, 81, 39, 208, 186, 197, + 47, 15, 217, 56, 73, 78, 33, 83, 56, 185, 146, 244, 218, 233, 33, 146, 56, 102, 154, 141, + 198, 231, 142, 189, 124, 35, 205, 49, 225, 197, 163, 221, 230, 33, 97, 116, 21, 165, 25, + 128, 178, 62, 42, 146, 157, 227, 49, 28, 8, 82, 182, 30, 39, 39, 136, 114, 231, 72, 23, 157, + 46, 69, 171, 161, 210, 164, 156, 118, 107, 194, 253, 230, 31, 234, 233, 124, 101, 6, 135, + 128, 192, 55, 162, 155, 124, 1, 14, 60, 48, 214, 77, 51, 95, 123, 179, 83, 228, 75, 125, + 153, 40, 3, 235, 133, 255, 245, 152, 203, 126, 3, 106, 167, 52, 173, 115, 238, 60, 75, 199, + 130, 153, 175, 139, 5, 145, 227, 26, 254, 32, 143, 226, 39, 242, 44, 176, 51, 126, 33, 97, + 147, 81, 194, 204, 15, 148, 225, 233, 243, 160, 242, 192, 192, 112, 230, 51, 60, 235, 150, + 201, 252, 139, 156, 197, 19, 105, 144, 160, 238, 2, 15, 60, 200, 41, 229, 110, 188, 78, 247, + 237, 166, 45, 173, 231, 4, 62, 214, 85, 135, 131, 229, 105, 2, 231, 237, 156, 192, 135, 239, + 36, 240, 37, 90, 75, 205, 123, 231, 232, 65, 65, 99, 210, 69, 178, 148, 182, 116, 126, 113, + 26, 228, 111, 207, 24, 60, 108, 125, 161, 153, 241, 39, 236, 187, 162, 74, 121, 88, 34, 22, + 202, 29, 147, 177, 168, 107, 115, 210, 148, 137, 202, 27, 41, 100, 189, 215, 206, 84, 20, + 201, 4, 210, 49, 34, 249, 83, 25, 68, 89, 25, 18, 117, 47, 180, 3, 6, 143, 226, 221, 43, 46, + 250, 109, 97, 51, 40, 104, 186, 148, 121, 168, 147, 34, 20, 104, 55, 227, 25, 169, 248, 185, + 87, 18, 8, 171, 207, 149, 57, 138, 67, 4, 229, 227, 86, 141, 166, 68, 251, 212, 7, 112, 175, + 6, 216, 88, 206, 235, 220, 22, 121, 68, 25, 101, 228, 108, 158, 10, 6, 22, 7, 9, 139, 19, + 123, 75, 213, 213, 58, 162, 19, 156, 50, 137, 216, 40, 22, 102, 68, 203, 230, 43, 242, 189, + 229, 10, 119, 157, 145, 54, 45, 202, 57, 107, 198, 25, 223, 47, 37, 12, 124, 55, 79, 151, + 162, 2, 251, 243, 174, 72, 107, 218, 252, 91, 79, 114, 235, 154, 31, 107, 63, 132, 69, 165, + 159, 108, 29, 227, 185, 128, 208, 22, 101, 156, 16, 202, 157, 192, 245, 213, 100, 198, 242, + 45, 133, 207, 110, 82, 65, 178, 54, 7, 90, 126, 106, 185, 146, 224, 95, 177, 176, 17, 65, + 86, 42, 222, 201, 101, 56, 234, 97, 108, 204, 3, 172, 133, 49, 207, 70, 49, 40, 243, 225, + 185, 65, 236, 122, 242, 202, 41, 7, 109, 117, 138, 219, 203, 144, 147, 77, 161, 173, 163, + 131, 156, 205, 186, 28, 35, 212, 21, 143, 194, 215, 230, 196, 206, 21, 207, 206, 112, 8, + 116, 159, 98, 202, 238, 184, 172, 58, 114, 167, 58, 247, 147, 94, 169, 198, 223, 77, 154, + 146, 79, 234, 219, 172, 197, 170, 138, 166, 63, 193, 102, 10, 236, 175, 120, 176, 4, 26, + 185, 135, 215, 25, 145, 1, 13, 33, 141, 92, 77, 89, 78, 135, 196, 223, 168, 85, 66, 106, 47, + 59, 229, 176, 111, 153, 74, 95, 98, 114, 210, 183, 221, 8, 59, 111, 193, 89, 119, 69, 231, + 150, 247, 69, 111, 91, 70, 108, 55, 106, 12, 138, 222, 83, 22, 100, 60, 23, 155, 54, 189, + 115, 241, 28, 207, 201, 118, 206, 115, 227, 119, 242, 220, 191, 10, 155, 198, 154, 197, 51, + 147, 196, 162, 181, 2, 61, 104, 227, 47, 173, 33, 75, 104, 109, 240, 247, 185, 22, 144, 165, + 200, 134, 177, 3, 82, 133, 170, 119, 237, 75, 147, 79, 190, 4, 7, 41, 67, 229, 122, 223, 82, + 192, 92, 59, 41, 68, 162, 187, 59, 223, 162, 42, 142, 232, 8, 180, 152, 182, 168, 13, 207, + 189, 15, 76, 249, 86, 179, 127, 65, 102, 6, 198, 183, 83, 8, 107, 29, 24, 30, 209, 122, 215, + 76, 104, 29, 62, 87, 30, 82, 143, 58, 207, 14, 249, 238, 218, 79, 162, 248, 135, 81, 11, 20, + 252, 151, 187, 10, 215, 15, 159, 188, 87, 168, 127, 234, 186, 201, 200, 199, 146, 22, 51, + 207, 189, 244, 28, 101, 80, 150, 205, 230, 43, 88, 90, 107, 231, 234, 25, 15, 118, 158, 229, + 224, 99, 48, 93, 59, 189, 174, 133, 7, 166, 253, 250, 60, 0, 102, 132, 198, 117, 243, 68, + 52, 142, 240, 60, 190, 79, 154, 115, 238, 98, 153, 174, 113, 95, 29, 166, 240, 77, 225, 35, + 46, 227, 210, 107, 102, 33, 84, 117, 139, 213, 215, 119, 213, 176, 224, 10, 155, 255, 39, + 43, 191, 63, 210, 153, 126, 30, 241, 10, 136, 96, 76, 95, 53, 126, 213, 140, 30, 80, 87, + 214, 94, 104, 204, 43, 28, 179, 142, 16, 178, 164, 235, 154, 9, 50, 252, 67, 64, 13, 241, + 231, 74, 17, 17, 150, 20, 16, 17, 236, 174, 4, 206, 176, 107, 127, 208, 142, 28, 150, 46, + 224, 200, 45, 66, 120, 167, 32, 184, 167, 10, 9, 243, 191, 83, 155, 207, 230, 180, 2, 61, 9, + 123, 22, 117, 35, 240, 242, 46, 198, 0, 58, 127, 199, 214, 25, 81, 16, 159, 51, 210, 31, + 184, 229, 28, 39, 144, 30, 255, 95, 166, 81, 37, 29, 137, 57, 56, 246, 77, 21, 154, 28, 208, + 204, 3, 139, 161, 26, 154, 126, 226, 1, 114, 235, 183, 98, 99, 119, 18, 27, 147, 37, 13, 24, + 255, 6, 140, 222, 128, 51, 86, 228, 145, 129, 188, 9, 25, 45, 133, 59, 240, 23, 110, 236, + 139, 208, 242, 55, 254, 92, 195, 162, 160, 108, 39, 5, 83, 66, 110, 114, 45, 83, 117, 71, + 90, 221, 64, 242, 42, 168, 177, 168, 192, 5, 54, 8, 0, 84, 33, 210, 175, 3, 5, 118, 16, 206, + 139, 104, 209, 255, 172, 176, 203, 94, 134, 59, 56, 125, 145, 3, 188, 177, 53, 188, 66, 64, + 133, 153, 96, 77, 119, 165, 251, 31, 221, 196, 128, 205, 50, 54, 48, 104, 109, 217, 227, + 238, 129, 201, 109, 76, 118, 201, 3, 168, 223, 144, 55, 61, 143, 167, 215, 8, 96, 108, 255, + 94, 111, 102, 216, 137, 226, 224, 228, 140, 141, 190, 153, 219, 170, 104, 80, 231, 110, 75, + 251, 252, 148, 198, 249, 27, 255, 172, 216, 25, 77, 107, 143, 194, 231, 28, 188, 3, 25, 59, + 69, 82, 72, 190, 247, 199, 173, 225, 4, 71, 114, 151, 217, 91, 84, 169, 177, 243, 225, 107, + 218, 169, 216, 189, 235, 191, 162, 6, 32, 37, 94, 107, 160, 232, 185, 123, 49, 86, 125, 215, + 75, 130, 34, 152, 41, 1, 173, 244, 138, 223, 120, 154, 163, 78, 13, 11, 106, 68, 90, 242, + 99, 95, 163, 100, 41, 116, 97, 157, 49, 7, 74, 174, 19, 80, 134, 59, 47, 60, 99, 40, 105, + 77, 73, 162, 50, 242, 124, 182, 151, 131, 2, 13, 223, 217, 188, 0, 146, 250, 6, 102, 116, + 189, 132, 91, 211, 89, 204, 173, 113, 193, 68, 18, 206, 122, 81, 169, 189, 81, 102, 61, 106, + 39, 86, 69, 8, 72, 11, 210, 28, 71, 161, 188, 241, 104, 52, 128, 37, 163, 243, 247, 147, + 128, 152, 132, 82, 203, 215, 141, 176, 150, 126, 155, 83, 162, 250, 156, 36, 173, 177, 96, + 175, 10, 178, 53, 117, 98, 137, 24, 39, 184, 60, 38, 88, 78, 200, 182, 158, 228, 172, 143, + 127, 211, 134, 116, 104, 152, 84, 234, 57, 143, 0, 92, 13, 152, 201, 167, 32, 59, 14, 85, + 215, 247, 22, 169, 148, 100, 54, 227, 240, 231, 81, 96, 130, 12, 147, 242, 198, 59, 206, + 107, 157, 65, 147, 128, 143, 56, 124, 115, 151, 39, 132, 249, 196, 126, 11, 193, 71, 224, + 51, 19, 79, 204, 251, 4, 51, 228, 139, 56, 216, 98, 192, 219, 174, 93, 131, 207, 31, 114, + 231, 198, 122, 72, 57, 171, 206, 253, 29, 242, 228, 164, 87, 241, 248, 41, 15, 254, 144, + 187, 175, 75, 149, 210, 68, 231, 62, 201, 39, 201, 191, 181, 217, 195, 205, 98, 102, 84, 91, + 87, 67, 61, 100, 1, 248, 8, 162, 8, 72, 79, 69, 112, 56, 68, 88, 73, 65, 111, 22, 85, 236, + 167, 240, 188, 147, 233, 231, 70, 8, 144, 193, 21, 116, 94, 233, 43, 62, 82, 42, 179, 172, + 19, 249, 196, 109, 26, 131, 246, 94, 63, 157, 140, 158, 187, 47, 66, 77, 40, 203, 160, 27, + 154, 211, 10, 13, 147, 111, 64, 102, 115, 194, 182, 236, 226, 79, 2, 94, 185, 136, 17, 3, + 254, 226, 237, 17, 92, 93, 122, 254, 198, 63, 22, 54, 167, 230, 82, 77, 16, 130, 160, 4, 28, + 116, 232, 27, 73, 134, 83, 57, 139, 119, 211, 54, 85, 87, 143, 18, 174, 101, 202, 184, 245, + 36, 21, 63, 192, 248, 170, 117, 73, 194, 30, 151, 117, 144, 178, 76, 7, 27, 26, 94, 229, + 223, 27, 30, 20, 238, 101, 80, 153, 192, 88, 160, 102, 35, 25, 41, 217, 142, 173, 124, 171, + 51, 73, 12, 214, 117, 175, 77, 196, 20, 109, 68, 248, 154, 217, 129, 27, 139, 244, 0, 241, + 21, 89, 20, 39, 96, 25, 186, 246, 43, 15, 48, 245, 236, 254, 118, 242, 180, 141, 233, 16, + 124, 49, 104, 156, 142, 128, 52, 26, 241, 225, 173, 31, 61, 5, 109, 65, 203, 67, 17, 173, + 222, 59, 42, 127, 155, 49, 252, 164, 34, 100, 38, 19, 16, 177, 4, 13, 6, 64, 253, 220, 120, + 132, 70, 61, 108, 228, 33, 134, 198, 14, 35, 34, 195, 149, 69, 92, 49, 175, 165, 14, 148, + 126, 162, 197, 160, 3, 243, 118, 195, 23, 63, 161, 30, 165, 247, 149, 76, 115, 174, 13, 121, + 146, 220, 247, 209, 107, 140, 225, 104, 100, 93, 121, 52, 62, 129, 208, 156, 16, 135, 19, + 23, 60, 186, 94, 102, 160, 40, 210, 192, 54, 233, 134, 86, 234, 146, 205, 244, 42, 136, 178, + 204, 170, 162, 205, 166, 80, 138, 156, 196, 15, 34, 240, 250, 226, 229, 236, 236, 245, 242, + 236, 255, 2, 12, 0, 100, 250, 83, 35, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, + 13, 101, 110, 100, 111, 98, 106, 13, 50, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, + 111, 110, 116, 101, 110, 116, 115, 32, 50, 50, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, + 116, 32, 51, 51, 54, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, + 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, + 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 55, 32, 48, 32, 82, 47, 84, + 84, 51, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 57, 32, 48, 32, 82, 62, + 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, + 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, + 101, 110, 116, 115, 32, 57, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, + 110, 100, 111, 98, 106, 13, 50, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, + 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, + 116, 104, 32, 50, 53, 50, 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, + 109, 111, 28, 55, 14, 254, 190, 191, 98, 62, 181, 171, 162, 51, 25, 105, 222, 129, 160, 64, + 234, 228, 208, 28, 224, 67, 209, 44, 80, 20, 201, 1, 151, 205, 198, 246, 54, 182, 179, 216, + 216, 201, 181, 191, 254, 68, 82, 164, 40, 205, 172, 147, 75, 16, 120, 51, 122, 161, 68, 241, + 229, 225, 195, 159, 55, 171, 71, 191, 190, 62, 222, 21, 143, 31, 63, 58, 63, 123, 254, 180, + 168, 139, 159, 126, 250, 249, 233, 89, 177, 170, 11, 248, 119, 188, 92, 61, 218, 108, 234, + 194, 186, 98, 115, 177, 170, 171, 105, 154, 70, 92, 176, 133, 155, 198, 170, 30, 139, 193, + 185, 170, 45, 54, 55, 171, 245, 96, 54, 127, 194, 110, 91, 216, 166, 154, 80, 160, 175, 234, + 218, 250, 221, 155, 221, 106, 93, 192, 114, 105, 199, 177, 154, 236, 88, 148, 182, 175, 26, + 23, 23, 72, 14, 133, 236, 232, 197, 154, 161, 40, 251, 174, 174, 250, 54, 223, 195, 103, + 151, 178, 239, 244, 81, 117, 209, 119, 182, 234, 139, 205, 211, 213, 203, 245, 133, 105, + 215, 175, 77, 105, 215, 71, 51, 174, 111, 224, 227, 173, 41, 29, 142, 62, 152, 114, 242, + 194, 165, 29, 218, 245, 222, 143, 111, 253, 214, 48, 124, 3, 255, 173, 223, 155, 30, 39, + 239, 76, 217, 121, 137, 210, 90, 220, 183, 245, 83, 247, 60, 189, 199, 105, 216, 117, 169, + 142, 195, 37, 16, 215, 227, 43, 191, 9, 47, 15, 147, 50, 70, 253, 174, 253, 201, 178, 45, + 236, 128, 19, 46, 226, 240, 34, 8, 56, 220, 124, 141, 55, 195, 150, 79, 32, 38, 154, 59, 84, + 50, 40, 55, 174, 255, 134, 15, 188, 6, 148, 212, 111, 134, 119, 252, 101, 202, 129, 199, + 248, 0, 48, 140, 156, 201, 86, 153, 61, 77, 84, 199, 243, 194, 163, 254, 189, 249, 39, 184, + 193, 137, 27, 252, 254, 170, 115, 228, 135, 87, 206, 89, 51, 173, 95, 152, 114, 244, 210, + 101, 239, 47, 114, 36, 24, 164, 187, 245, 19, 48, 195, 45, 172, 225, 207, 107, 248, 241, 98, + 206, 139, 85, 124, 56, 251, 184, 111, 171, 110, 104, 40, 200, 94, 122, 105, 215, 71, 5, 56, + 112, 203, 176, 169, 116, 83, 53, 244, 180, 211, 249, 167, 193, 159, 28, 216, 112, 252, 117, + 85, 211, 55, 58, 106, 213, 109, 14, 66, 178, 229, 219, 254, 101, 186, 212, 236, 153, 191, + 91, 138, 51, 244, 234, 59, 177, 62, 173, 60, 135, 247, 131, 73, 119, 134, 130, 14, 119, 209, + 154, 250, 68, 131, 71, 7, 111, 57, 136, 105, 138, 246, 92, 133, 48, 220, 250, 17, 235, 1, + 17, 242, 222, 127, 53, 232, 71, 154, 251, 62, 119, 140, 29, 198, 202, 218, 158, 159, 115, + 218, 37, 32, 189, 228, 148, 239, 115, 111, 116, 163, 55, 180, 227, 3, 127, 52, 147, 54, 75, + 18, 246, 238, 132, 5, 56, 247, 148, 133, 48, 180, 36, 140, 241, 67, 178, 78, 69, 92, 233, 6, + 87, 245, 83, 39, 209, 6, 42, 232, 196, 105, 215, 231, 49, 81, 41, 113, 70, 58, 224, 142, 29, + 104, 215, 191, 241, 211, 99, 64, 11, 106, 64, 74, 93, 161, 145, 227, 203, 126, 241, 115, + 152, 59, 59, 201, 201, 35, 191, 69, 188, 181, 203, 35, 210, 182, 96, 249, 83, 65, 86, 141, + 163, 101, 27, 250, 216, 114, 244, 240, 152, 234, 116, 243, 86, 155, 51, 88, 9, 236, 114, 64, + 13, 15, 134, 80, 227, 200, 38, 195, 173, 59, 21, 34, 94, 51, 103, 35, 14, 44, 57, 169, 93, + 159, 193, 211, 4, 52, 2, 254, 141, 122, 135, 178, 112, 211, 174, 159, 153, 97, 253, 95, 144, + 121, 195, 118, 212, 134, 166, 83, 100, 41, 248, 205, 118, 80, 89, 18, 183, 93, 40, 237, 3, + 220, 160, 162, 87, 26, 196, 151, 17, 119, 155, 32, 210, 157, 66, 68, 48, 137, 248, 6, 148, + 144, 152, 122, 147, 56, 157, 157, 59, 180, 241, 173, 39, 163, 65, 48, 89, 162, 119, 23, 231, + 162, 225, 121, 243, 109, 120, 88, 76, 105, 212, 125, 159, 220, 163, 79, 212, 15, 88, 44, 30, + 12, 205, 241, 174, 99, 152, 137, 242, 251, 128, 229, 50, 203, 113, 4, 246, 223, 252, 224, + 13, 46, 169, 240, 17, 178, 78, 28, 87, 193, 8, 32, 153, 254, 162, 144, 166, 5, 130, 171, 0, + 239, 79, 252, 198, 75, 194, 16, 188, 184, 131, 18, 234, 124, 96, 150, 141, 63, 177, 243, + 250, 244, 52, 56, 146, 190, 132, 248, 103, 254, 46, 153, 216, 193, 242, 30, 247, 2, 128, 21, + 57, 200, 76, 182, 114, 118, 204, 146, 71, 176, 62, 172, 130, 78, 28, 77, 128, 243, 205, 55, + 98, 253, 198, 203, 39, 166, 239, 166, 96, 75, 169, 150, 28, 73, 247, 152, 100, 215, 26, 171, + 146, 156, 1, 73, 226, 21, 50, 205, 16, 40, 222, 134, 61, 56, 144, 112, 187, 148, 8, 76, 54, + 73, 121, 78, 225, 1, 150, 182, 185, 186, 28, 42, 160, 164, 92, 141, 23, 196, 240, 142, 8, + 193, 233, 217, 0, 141, 27, 146, 244, 84, 85, 46, 88, 180, 45, 172, 173, 234, 22, 141, 234, + 170, 73, 140, 250, 159, 204, 168, 80, 162, 169, 240, 214, 193, 185, 100, 169, 88, 35, 41, + 165, 58, 101, 161, 88, 199, 132, 33, 124, 74, 170, 1, 103, 97, 43, 184, 65, 110, 104, 53, + 186, 113, 252, 131, 120, 200, 85, 120, 233, 222, 184, 70, 149, 105, 182, 96, 39, 85, 21, + 143, 16, 36, 167, 4, 7, 65, 208, 7, 129, 159, 224, 162, 67, 31, 226, 30, 194, 37, 89, 87, + 23, 182, 98, 222, 14, 85, 221, 51, 249, 148, 200, 138, 228, 50, 194, 65, 72, 66, 87, 47, 48, + 27, 52, 182, 75, 162, 253, 31, 164, 67, 7, 194, 22, 234, 85, 131, 89, 37, 249, 8, 131, 15, + 198, 233, 236, 7, 127, 180, 223, 152, 32, 191, 155, 73, 69, 219, 44, 48, 71, 158, 15, 222, + 246, 165, 231, 62, 224, 161, 6, 210, 78, 177, 159, 142, 150, 241, 80, 161, 88, 157, 170, + 116, 91, 227, 253, 90, 122, 189, 113, 134, 143, 193, 253, 145, 224, 7, 33, 77, 4, 252, 240, + 87, 48, 203, 185, 58, 244, 92, 146, 237, 206, 112, 53, 253, 203, 88, 151, 168, 243, 66, 226, + 4, 207, 63, 196, 250, 158, 170, 253, 135, 191, 12, 46, 252, 83, 246, 223, 198, 29, 167, 146, + 106, 57, 166, 135, 207, 224, 128, 192, 71, 86, 14, 34, 142, 199, 58, 24, 141, 34, 5, 99, + 214, 95, 44, 228, 115, 59, 84, 227, 144, 229, 115, 27, 98, 96, 222, 190, 89, 255, 32, 97, + 128, 189, 63, 23, 242, 163, 198, 132, 167, 63, 213, 159, 44, 102, 247, 98, 223, 116, 129, + 121, 195, 80, 154, 22, 66, 69, 18, 228, 113, 129, 127, 49, 16, 235, 163, 231, 229, 31, 109, + 149, 244, 74, 179, 90, 76, 6, 162, 220, 13, 164, 101, 170, 26, 223, 138, 230, 172, 101, 41, + 165, 199, 204, 242, 63, 250, 81, 173, 16, 43, 145, 161, 233, 232, 190, 136, 26, 76, 136, 18, + 146, 210, 106, 48, 219, 137, 252, 13, 129, 192, 152, 192, 40, 119, 37, 223, 25, 230, 144, + 120, 84, 142, 126, 156, 172, 109, 22, 43, 242, 154, 131, 0, 160, 104, 62, 103, 79, 244, 172, + 144, 39, 188, 31, 116, 136, 79, 83, 79, 13, 215, 143, 232, 98, 181, 200, 73, 77, 136, 65, + 193, 109, 25, 8, 211, 198, 18, 165, 192, 156, 108, 82, 144, 101, 103, 70, 230, 153, 186, + 151, 193, 155, 206, 143, 244, 45, 188, 22, 169, 172, 164, 121, 10, 224, 57, 27, 235, 148, + 33, 225, 173, 177, 227, 195, 157, 21, 90, 245, 65, 238, 116, 70, 233, 224, 232, 231, 144, + 32, 55, 246, 91, 64, 158, 246, 216, 116, 130, 95, 196, 8, 1, 252, 159, 6, 36, 239, 190, 17, + 201, 177, 128, 40, 246, 221, 76, 100, 83, 121, 89, 140, 230, 60, 28, 97, 107, 52, 238, 129, + 141, 195, 118, 207, 130, 44, 148, 71, 148, 154, 69, 162, 20, 141, 102, 154, 147, 107, 152, + 75, 173, 45, 52, 90, 113, 220, 92, 123, 247, 37, 234, 47, 93, 5, 198, 200, 49, 39, 114, 225, + 37, 48, 255, 18, 229, 210, 228, 225, 235, 184, 192, 137, 225, 102, 12, 62, 209, 184, 91, + 104, 11, 96, 18, 175, 76, 211, 141, 251, 130, 229, 50, 0, 66, 162, 81, 24, 115, 199, 4, 231, + 220, 112, 84, 136, 62, 186, 243, 130, 221, 160, 236, 251, 80, 249, 14, 70, 161, 95, 218, + 136, 4, 133, 188, 51, 160, 116, 11, 179, 154, 83, 208, 19, 41, 206, 215, 112, 43, 117, 19, + 57, 215, 27, 164, 53, 229, 64, 206, 91, 232, 103, 88, 181, 101, 19, 12, 109, 124, 165, 28, + 160, 218, 32, 216, 240, 36, 148, 249, 97, 129, 156, 12, 129, 70, 176, 113, 196, 156, 120, + 129, 34, 132, 37, 86, 20, 168, 123, 129, 146, 248, 241, 25, 44, 125, 129, 249, 72, 238, 86, + 228, 62, 9, 59, 96, 207, 13, 145, 7, 167, 225, 190, 147, 10, 79, 102, 101, 220, 89, 102, 30, + 141, 119, 76, 248, 63, 70, 51, 39, 70, 212, 73, 192, 186, 201, 170, 118, 163, 218, 158, 19, + 49, 175, 197, 40, 128, 237, 192, 147, 82, 148, 63, 112, 242, 68, 6, 143, 27, 102, 156, 197, + 9, 154, 217, 106, 28, 25, 205, 94, 57, 103, 125, 174, 188, 8, 85, 6, 186, 56, 255, 131, 95, + 239, 4, 88, 143, 198, 137, 54, 47, 146, 250, 100, 91, 37, 122, 67, 173, 30, 129, 217, 14, + 102, 118, 198, 59, 3, 79, 132, 41, 127, 151, 203, 187, 85, 127, 66, 213, 213, 13, 171, 195, + 161, 4, 55, 109, 130, 183, 191, 216, 90, 132, 54, 182, 175, 154, 177, 153, 55, 100, 87, 38, + 205, 224, 238, 33, 35, 6, 252, 88, 130, 143, 175, 65, 15, 47, 115, 149, 100, 50, 205, 201, + 75, 210, 183, 65, 4, 113, 42, 116, 109, 146, 47, 18, 231, 89, 132, 237, 36, 224, 57, 255, + 133, 130, 223, 207, 8, 138, 188, 88, 167, 14, 0, 132, 10, 161, 180, 39, 240, 163, 30, 19, + 171, 17, 198, 10, 163, 90, 53, 170, 115, 56, 194, 38, 130, 239, 75, 17, 159, 95, 7, 241, + 131, 144, 113, 73, 161, 51, 10, 51, 185, 23, 114, 138, 250, 49, 181, 165, 50, 197, 20, 204, + 6, 92, 16, 243, 237, 180, 153, 98, 124, 218, 0, 11, 9, 193, 57, 193, 102, 189, 196, 171, + 181, 223, 135, 218, 163, 110, 120, 5, 158, 242, 202, 24, 9, 251, 101, 84, 176, 170, 66, 134, + 241, 87, 180, 28, 246, 225, 150, 163, 105, 186, 202, 214, 121, 207, 193, 25, 245, 146, 143, + 112, 193, 87, 64, 120, 44, 190, 191, 87, 190, 42, 249, 20, 157, 40, 177, 235, 232, 163, 81, + 57, 39, 125, 165, 127, 14, 159, 234, 109, 186, 216, 72, 223, 41, 78, 123, 32, 188, 38, 52, + 160, 155, 91, 112, 106, 115, 26, 68, 147, 209, 102, 184, 252, 206, 12, 164, 220, 85, 128, + 242, 107, 132, 156, 54, 176, 217, 163, 202, 243, 5, 210, 66, 231, 185, 41, 87, 115, 70, 211, + 167, 83, 37, 143, 214, 182, 156, 168, 111, 189, 58, 37, 50, 242, 107, 206, 77, 140, 15, 165, + 67, 172, 57, 145, 26, 165, 117, 102, 41, 226, 188, 172, 107, 66, 176, 73, 254, 50, 18, 193, + 202, 172, 148, 177, 7, 150, 1, 2, 68, 78, 117, 129, 57, 105, 113, 77, 142, 126, 55, 74, 37, + 93, 204, 96, 188, 141, 108, 22, 90, 42, 74, 184, 24, 223, 97, 87, 162, 162, 100, 32, 193, + 20, 119, 65, 135, 240, 164, 164, 16, 130, 240, 146, 129, 56, 56, 97, 253, 137, 177, 227, 34, + 18, 201, 99, 103, 100, 81, 83, 97, 4, 79, 210, 61, 165, 25, 15, 208, 180, 82, 51, 170, 184, + 35, 88, 118, 198, 221, 104, 175, 174, 66, 131, 178, 92, 238, 128, 33, 82, 204, 183, 212, + 242, 168, 46, 35, 131, 125, 29, 7, 186, 16, 128, 23, 192, 222, 130, 47, 4, 191, 182, 71, + 122, 41, 32, 38, 193, 173, 120, 222, 107, 174, 32, 212, 160, 42, 237, 220, 196, 102, 246, + 204, 222, 38, 8, 18, 113, 171, 83, 26, 156, 36, 109, 110, 110, 205, 144, 53, 32, 242, 57, + 188, 14, 206, 71, 86, 180, 216, 58, 234, 190, 175, 255, 198, 190, 239, 119, 51, 205, 208, + 202, 217, 118, 153, 92, 192, 130, 248, 31, 158, 129, 100, 106, 39, 49, 78, 6, 129, 81, 64, + 26, 103, 117, 150, 235, 137, 125, 232, 245, 66, 148, 66, 160, 75, 65, 61, 132, 76, 138, 217, + 57, 43, 38, 142, 75, 82, 248, 62, 72, 190, 235, 66, 53, 203, 104, 43, 125, 150, 77, 207, + 186, 55, 20, 149, 97, 24, 35, 5, 183, 11, 145, 250, 104, 172, 101, 194, 154, 119, 129, 0, + 120, 96, 209, 93, 132, 12, 151, 41, 46, 49, 114, 178, 19, 180, 157, 46, 10, 20, 102, 34, + 117, 153, 112, 232, 208, 124, 73, 60, 139, 83, 196, 157, 8, 226, 194, 61, 59, 226, 158, 185, + 79, 97, 254, 83, 172, 102, 228, 19, 2, 115, 92, 19, 152, 188, 70, 16, 163, 46, 13, 87, 46, + 98, 226, 194, 254, 232, 168, 99, 118, 188, 126, 80, 159, 96, 189, 157, 81, 209, 125, 224, + 141, 176, 56, 232, 102, 20, 44, 177, 11, 196, 143, 45, 203, 244, 56, 197, 197, 188, 46, 186, + 110, 78, 179, 65, 97, 184, 234, 239, 36, 56, 245, 70, 193, 116, 238, 248, 62, 139, 151, 32, + 78, 250, 242, 233, 18, 1, 146, 64, 250, 189, 156, 49, 247, 12, 142, 87, 81, 223, 72, 100, + 175, 77, 122, 3, 113, 69, 137, 93, 230, 219, 7, 163, 141, 197, 105, 200, 220, 115, 222, 185, + 137, 38, 146, 117, 51, 0, 194, 61, 28, 50, 218, 220, 155, 31, 188, 149, 255, 239, 110, 161, + 89, 206, 252, 70, 149, 43, 129, 72, 154, 191, 200, 163, 58, 250, 109, 137, 226, 144, 80, 76, + 41, 92, 145, 55, 234, 18, 212, 36, 9, 159, 180, 149, 162, 15, 125, 10, 162, 192, 219, 46, + 141, 173, 245, 85, 183, 33, 28, 111, 184, 46, 138, 21, 150, 78, 61, 69, 18, 192, 79, 220, 8, + 208, 40, 167, 9, 96, 243, 103, 231, 103, 197, 234, 217, 102, 245, 63, 1, 6, 0, 17, 58, 27, + 100, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 50, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, + 32, 50, 52, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 54, 32, 48, 32, 82, 47, + 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, + 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, + 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, + 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, + 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 49, 48, 47, 84, 121, + 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 50, 52, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 49, 53, 49, 62, 62, + 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 91, 111, 219, 54, 20, 126, 247, 175, + 208, 211, 96, 13, 149, 106, 74, 162, 46, 64, 81, 160, 77, 50, 172, 195, 178, 21, 173, 129, + 61, 20, 123, 72, 227, 230, 178, 56, 142, 145, 52, 75, 251, 239, 199, 115, 39, 101, 57, 77, + 209, 161, 112, 42, 146, 135, 135, 135, 231, 242, 157, 143, 175, 151, 179, 231, 111, 79, 110, + 63, 103, 47, 94, 60, 63, 62, 120, 115, 152, 45, 178, 151, 47, 95, 31, 30, 100, 179, 69, 6, + 255, 110, 207, 103, 207, 151, 203, 69, 230, 170, 108, 121, 54, 91, 148, 195, 48, 244, 184, + 224, 178, 106, 232, 203, 69, 159, 117, 85, 85, 54, 217, 242, 122, 54, 239, 243, 229, 63, 32, + 237, 50, 87, 151, 3, 110, 104, 203, 197, 194, 5, 233, 229, 106, 54, 207, 96, 185, 112, 125, + 95, 14, 174, 207, 10, 215, 150, 117, 101, 11, 180, 15, 55, 185, 62, 108, 171, 187, 172, 104, + 253, 162, 108, 155, 177, 140, 232, 46, 84, 110, 191, 170, 69, 214, 122, 87, 182, 217, 242, + 112, 246, 97, 126, 154, 87, 243, 155, 188, 197, 223, 54, 111, 230, 159, 242, 162, 154, 223, + 230, 253, 252, 36, 47, 220, 252, 115, 24, 249, 249, 101, 24, 254, 155, 23, 61, 45, 102, 121, + 209, 184, 102, 126, 151, 23, 3, 238, 2, 13, 32, 129, 139, 97, 131, 231, 81, 75, 34, 207, + 242, 1, 183, 212, 13, 234, 191, 13, 106, 29, 74, 92, 195, 1, 120, 10, 28, 247, 53, 47, 58, + 81, 125, 22, 38, 73, 11, 106, 184, 136, 205, 138, 229, 190, 105, 66, 81, 85, 36, 196, 27, + 240, 180, 77, 80, 183, 10, 63, 158, 131, 79, 156, 191, 68, 203, 198, 103, 144, 127, 10, 87, + 127, 151, 135, 254, 94, 254, 22, 220, 92, 184, 174, 244, 21, 249, 249, 9, 182, 138, 169, 52, + 179, 33, 19, 131, 9, 247, 225, 11, 70, 18, 42, 59, 232, 86, 118, 174, 208, 99, 176, 117, + 155, 71, 215, 60, 13, 31, 29, 250, 15, 167, 240, 94, 98, 181, 183, 227, 70, 110, 241, 116, + 2, 24, 177, 70, 159, 172, 229, 178, 231, 176, 99, 159, 169, 158, 125, 161, 225, 130, 169, + 141, 12, 190, 192, 217, 120, 44, 76, 251, 112, 13, 248, 31, 45, 194, 117, 77, 4, 212, 92, + 130, 1, 89, 94, 55, 236, 203, 184, 220, 178, 162, 26, 202, 142, 211, 247, 87, 178, 8, 247, + 183, 193, 80, 48, 162, 13, 38, 20, 117, 72, 60, 182, 225, 40, 239, 192, 65, 117, 112, 100, + 248, 115, 202, 167, 181, 40, 121, 25, 214, 111, 96, 102, 3, 107, 236, 140, 150, 70, 43, 153, + 122, 15, 86, 94, 129, 232, 154, 127, 151, 120, 181, 176, 124, 158, 123, 11, 119, 176, 203, + 99, 201, 125, 152, 255, 1, 215, 193, 243, 110, 217, 213, 46, 222, 84, 208, 245, 15, 194, + 125, 241, 116, 209, 11, 55, 193, 85, 248, 184, 147, 171, 75, 225, 246, 85, 89, 117, 62, 70, + 142, 4, 123, 156, 243, 165, 27, 134, 54, 107, 25, 14, 174, 103, 125, 152, 241, 188, 227, 3, + 167, 211, 142, 71, 11, 150, 138, 237, 175, 130, 111, 58, 186, 215, 99, 240, 22, 210, 107, + 81, 246, 67, 29, 82, 189, 238, 209, 172, 146, 193, 166, 98, 229, 117, 89, 215, 67, 108, 114, + 116, 159, 10, 144, 172, 17, 235, 254, 204, 157, 165, 75, 48, 213, 15, 13, 230, 146, 164, 63, + 229, 120, 148, 242, 141, 72, 113, 254, 194, 114, 52, 123, 22, 62, 169, 166, 225, 11, 83, + 239, 107, 56, 162, 16, 96, 66, 45, 86, 75, 27, 219, 169, 86, 60, 80, 190, 234, 228, 61, 2, + 24, 231, 168, 100, 254, 57, 3, 12, 8, 73, 137, 90, 221, 160, 158, 157, 186, 65, 225, 7, 41, + 254, 53, 255, 120, 254, 35, 31, 47, 64, 82, 212, 208, 49, 58, 133, 19, 112, 150, 41, 195, + 139, 161, 7, 96, 31, 168, 217, 5, 206, 149, 98, 9, 25, 77, 96, 17, 36, 4, 221, 42, 116, 203, + 154, 210, 209, 213, 56, 111, 64, 113, 137, 243, 173, 109, 116, 145, 241, 40, 113, 161, 7, + 232, 80, 194, 232, 98, 0, 80, 211, 88, 47, 120, 41, 246, 97, 16, 118, 225, 32, 143, 217, 7, + 134, 208, 92, 104, 21, 149, 179, 171, 128, 22, 181, 144, 92, 77, 114, 6, 214, 226, 210, 61, + 238, 23, 163, 190, 211, 131, 6, 235, 130, 63, 73, 38, 192, 241, 138, 124, 80, 65, 11, 180, + 5, 110, 212, 132, 95, 25, 197, 116, 7, 208, 164, 79, 188, 39, 55, 121, 194, 169, 43, 1, 5, + 65, 11, 248, 94, 163, 253, 235, 156, 160, 244, 149, 160, 202, 137, 224, 198, 181, 168, 56, + 17, 156, 57, 194, 16, 11, 112, 233, 186, 109, 155, 134, 194, 99, 88, 130, 105, 132, 47, 197, + 48, 22, 26, 129, 147, 27, 66, 118, 182, 163, 74, 87, 136, 225, 213, 49, 196, 244, 232, 22, + 214, 36, 144, 17, 96, 172, 110, 235, 39, 97, 198, 43, 176, 41, 196, 51, 52, 138, 99, 73, 72, + 12, 137, 198, 133, 242, 182, 97, 33, 12, 245, 13, 54, 31, 24, 126, 34, 236, 237, 141, 143, + 72, 40, 45, 249, 37, 143, 131, 248, 123, 145, 128, 64, 95, 193, 162, 166, 24, 9, 28, 104, + 59, 51, 0, 160, 149, 87, 210, 98, 81, 49, 138, 232, 121, 39, 118, 9, 72, 64, 97, 31, 97, 72, + 57, 4, 217, 3, 121, 212, 169, 221, 83, 200, 81, 27, 112, 240, 144, 219, 118, 229, 18, 6, + 145, 164, 52, 164, 100, 255, 8, 204, 188, 1, 120, 228, 174, 157, 84, 125, 116, 176, 212, + 210, 70, 80, 246, 68, 46, 102, 2, 56, 245, 160, 139, 10, 226, 138, 180, 22, 52, 171, 100, + 149, 154, 66, 162, 70, 136, 101, 68, 144, 82, 22, 166, 64, 205, 48, 33, 182, 220, 9, 240, + 169, 126, 54, 133, 72, 231, 4, 36, 193, 137, 103, 138, 112, 28, 134, 200, 72, 88, 39, 101, + 149, 64, 158, 18, 69, 98, 141, 160, 58, 206, 21, 69, 226, 125, 176, 185, 139, 52, 35, 2, 6, + 219, 60, 91, 41, 54, 128, 31, 182, 172, 210, 55, 140, 132, 103, 54, 177, 0, 225, 130, 209, + 104, 161, 248, 234, 155, 189, 60, 140, 151, 99, 91, 125, 195, 73, 5, 138, 207, 196, 98, 112, + 133, 149, 203, 202, 100, 113, 210, 72, 255, 199, 92, 182, 75, 64, 124, 51, 202, 137, 19, 6, + 155, 74, 223, 14, 42, 99, 52, 128, 103, 165, 223, 222, 227, 36, 44, 91, 107, 95, 43, 127, + 29, 119, 106, 181, 235, 66, 31, 36, 226, 190, 115, 65, 253, 41, 14, 111, 221, 189, 143, 138, + 11, 174, 36, 25, 240, 200, 147, 128, 93, 35, 94, 163, 224, 220, 74, 3, 85, 62, 109, 185, + 230, 173, 159, 112, 105, 85, 222, 14, 33, 247, 121, 110, 141, 114, 195, 180, 191, 154, 219, + 83, 206, 190, 195, 247, 71, 109, 48, 198, 61, 79, 46, 217, 125, 119, 192, 254, 107, 5, 51, + 45, 254, 132, 190, 11, 55, 222, 219, 237, 142, 165, 103, 33, 215, 214, 182, 167, 100, 30, + 206, 127, 135, 94, 168, 168, 255, 40, 213, 71, 90, 141, 194, 23, 212, 174, 70, 237, 104, 88, + 148, 13, 210, 214, 201, 118, 196, 171, 227, 118, 52, 252, 96, 59, 250, 69, 159, 180, 242, + 202, 147, 230, 98, 57, 145, 240, 144, 110, 196, 200, 186, 113, 2, 167, 197, 69, 18, 8, 202, + 216, 106, 176, 231, 189, 67, 122, 0, 11, 191, 43, 137, 137, 244, 143, 32, 155, 201, 82, 151, + 118, 139, 142, 99, 137, 10, 86, 17, 255, 132, 21, 156, 196, 224, 39, 200, 110, 217, 31, 35, + 91, 7, 233, 13, 183, 145, 146, 0, 158, 217, 88, 117, 219, 245, 180, 234, 165, 43, 145, 100, + 212, 2, 199, 93, 9, 160, 16, 220, 188, 101, 42, 78, 103, 75, 142, 159, 230, 210, 248, 118, + 223, 3, 1, 75, 182, 90, 235, 90, 153, 147, 77, 222, 114, 122, 63, 213, 172, 159, 64, 53, 73, + 236, 76, 90, 62, 200, 223, 107, 31, 224, 215, 136, 54, 250, 81, 69, 194, 212, 86, 159, 59, + 212, 147, 246, 91, 108, 46, 213, 68, 137, 156, 31, 4, 32, 67, 126, 10, 79, 159, 67, 206, 33, + 33, 66, 22, 134, 107, 198, 220, 33, 50, 219, 116, 236, 34, 161, 214, 188, 1, 112, 99, 216, + 116, 78, 228, 107, 212, 73, 253, 196, 235, 72, 19, 214, 224, 48, 109, 246, 41, 130, 126, 59, + 139, 168, 142, 118, 32, 46, 110, 184, 27, 77, 207, 145, 75, 47, 245, 249, 179, 65, 106, 228, + 34, 88, 153, 134, 175, 183, 160, 224, 66, 89, 52, 98, 210, 117, 238, 42, 99, 222, 111, 232, + 217, 84, 211, 159, 27, 126, 114, 118, 251, 89, 247, 24, 198, 250, 210, 237, 71, 49, 92, 140, + 65, 172, 102, 194, 248, 127, 112, 106, 223, 53, 198, 207, 30, 56, 117, 96, 114, 203, 177, 6, + 23, 42, 255, 176, 52, 178, 2, 98, 249, 152, 116, 143, 247, 163, 48, 124, 36, 73, 13, 82, 79, + 68, 12, 143, 0, 229, 250, 56, 216, 190, 139, 163, 221, 76, 199, 90, 186, 254, 102, 188, 135, + 82, 232, 49, 236, 185, 200, 35, 206, 98, 184, 169, 237, 250, 94, 154, 97, 132, 30, 204, 120, + 148, 85, 25, 139, 151, 90, 136, 8, 81, 12, 205, 174, 142, 105, 245, 149, 186, 73, 248, 88, + 221, 48, 174, 108, 109, 130, 201, 141, 0, 200, 4, 185, 81, 246, 148, 118, 239, 148, 56, 179, + 54, 162, 36, 194, 186, 228, 217, 244, 5, 210, 88, 53, 36, 32, 40, 192, 128, 3, 230, 2, 120, + 224, 95, 121, 196, 94, 67, 121, 221, 137, 65, 17, 188, 10, 200, 238, 130, 142, 242, 158, 59, + 97, 36, 168, 166, 25, 163, 17, 84, 240, 46, 30, 217, 185, 77, 132, 77, 43, 110, 37, 49, 105, + 234, 21, 153, 157, 75, 179, 23, 46, 47, 137, 101, 200, 100, 123, 85, 125, 31, 135, 231, 137, + 153, 236, 220, 84, 231, 130, 89, 105, 200, 209, 153, 107, 14, 235, 118, 138, 133, 85, 35, + 75, 36, 116, 242, 248, 209, 199, 137, 176, 20, 138, 46, 101, 107, 240, 56, 123, 127, 249, + 51, 231, 187, 53, 33, 233, 9, 151, 163, 30, 54, 126, 215, 9, 135, 87, 42, 88, 72, 31, 121, + 156, 10, 222, 3, 8, 2, 241, 19, 104, 84, 94, 120, 71, 21, 86, 84, 56, 218, 138, 28, 12, 54, + 41, 0, 127, 21, 236, 61, 165, 247, 23, 22, 100, 81, 211, 162, 146, 200, 59, 66, 57, 15, 119, + 111, 72, 234, 150, 66, 136, 156, 186, 251, 22, 43, 197, 37, 144, 65, 56, 87, 25, 82, 173, + 157, 131, 174, 40, 79, 56, 64, 103, 247, 131, 232, 124, 152, 60, 178, 18, 122, 178, 243, + 254, 170, 133, 214, 221, 51, 73, 51, 22, 42, 155, 49, 70, 20, 116, 24, 110, 19, 70, 181, + 137, 113, 46, 184, 181, 234, 68, 107, 250, 238, 82, 192, 72, 184, 109, 221, 197, 60, 66, + 152, 83, 55, 205, 176, 192, 128, 232, 93, 131, 114, 105, 218, 203, 85, 119, 206, 216, 129, + 209, 232, 40, 1, 210, 106, 2, 209, 165, 103, 162, 46, 240, 208, 150, 127, 146, 228, 59, 254, + 236, 146, 210, 246, 49, 16, 166, 15, 175, 241, 131, 211, 199, 144, 147, 138, 225, 71, 210, + 48, 164, 41, 221, 217, 230, 164, 131, 202, 141, 84, 70, 176, 78, 187, 231, 4, 101, 175, 218, + 17, 103, 191, 84, 87, 141, 107, 25, 246, 219, 43, 20, 70, 120, 202, 149, 189, 35, 196, 213, + 177, 111, 124, 252, 130, 216, 104, 67, 2, 69, 15, 81, 103, 217, 135, 237, 41, 225, 4, 186, + 118, 198, 200, 172, 14, 50, 242, 158, 122, 144, 120, 191, 79, 210, 202, 224, 172, 138, 211, + 202, 71, 49, 53, 190, 184, 81, 254, 41, 168, 202, 4, 54, 134, 237, 103, 57, 113, 216, 11, + 213, 205, 221, 180, 106, 230, 69, 222, 26, 254, 174, 148, 131, 142, 253, 1, 151, 72, 222, 3, + 19, 87, 75, 248, 242, 4, 137, 125, 74, 47, 97, 200, 37, 204, 159, 128, 221, 80, 1, 46, 98, + 141, 4, 56, 71, 199, 7, 217, 236, 104, 57, 251, 79, 128, 1, 0, 101, 58, 170, 171, 13, 10, + 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 50, 53, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 50, 54, 32, + 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 54, 32, 48, 32, 82, 47, 82, 101, 115, + 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, + 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, + 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, + 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, + 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 49, 49, 47, 84, 121, 112, 101, 47, 80, + 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 50, 54, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, + 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 51, 56, 50, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 72, 137, 172, 87, 91, 111, 27, 69, 20, 126, 247, 175, 216, 71, 47, 98, 183, + 158, 217, 139, 189, 168, 66, 106, 147, 114, 169, 218, 82, 81, 131, 132, 128, 135, 58, 110, + 236, 180, 137, 99, 156, 148, 2, 191, 158, 57, 103, 206, 109, 118, 215, 73, 80, 81, 149, 202, + 59, 115, 230, 204, 185, 127, 223, 60, 93, 78, 30, 189, 126, 123, 184, 205, 30, 63, 126, 244, + 242, 228, 251, 211, 108, 150, 125, 253, 245, 211, 211, 147, 108, 50, 203, 224, 223, 97, 51, + 121, 180, 92, 206, 50, 231, 179, 229, 249, 100, 86, 118, 93, 183, 192, 13, 151, 249, 110, + 81, 206, 22, 217, 220, 251, 178, 206, 150, 87, 147, 105, 151, 47, 223, 131, 180, 203, 92, + 85, 118, 120, 160, 45, 103, 51, 23, 164, 151, 235, 201, 52, 131, 237, 194, 45, 22, 101, 231, + 22, 89, 225, 218, 178, 242, 186, 17, 207, 225, 33, 183, 8, 199, 170, 121, 86, 180, 205, 172, + 108, 235, 190, 12, 235, 46, 68, 110, 168, 74, 12, 206, 218, 198, 149, 109, 182, 60, 157, + 252, 58, 93, 230, 69, 51, 125, 151, 251, 233, 219, 188, 104, 167, 103, 121, 225, 167, 219, + 188, 168, 112, 233, 0, 123, 55, 121, 225, 166, 191, 121, 239, 97, 43, 203, 155, 120, 2, 183, + 240, 200, 69, 88, 218, 193, 9, 249, 177, 201, 221, 60, 72, 254, 190, 124, 30, 174, 42, 124, + 87, 54, 62, 222, 85, 229, 237, 212, 135, 191, 18, 247, 130, 69, 158, 157, 107, 202, 170, + 173, 108, 72, 140, 231, 30, 252, 173, 227, 38, 216, 219, 6, 219, 10, 180, 215, 5, 123, 193, + 220, 58, 174, 28, 242, 5, 88, 219, 69, 107, 187, 160, 168, 104, 187, 122, 122, 27, 237, 93, + 196, 19, 23, 225, 71, 176, 210, 53, 244, 171, 14, 230, 22, 34, 251, 9, 100, 97, 227, 146, + 254, 104, 125, 197, 119, 208, 55, 168, 11, 223, 206, 77, 11, 182, 7, 84, 253, 153, 23, 11, + 60, 142, 102, 192, 143, 235, 176, 189, 227, 195, 235, 240, 195, 26, 181, 69, 59, 14, 36, + 246, 145, 109, 217, 170, 24, 219, 24, 45, 6, 41, 188, 2, 61, 185, 101, 91, 113, 137, 172, + 131, 192, 22, 21, 84, 88, 27, 74, 96, 94, 206, 219, 24, 182, 189, 181, 1, 143, 227, 85, 160, + 17, 127, 252, 157, 23, 243, 233, 151, 49, 104, 190, 169, 49, 176, 96, 16, 24, 119, 64, 71, + 225, 166, 184, 10, 166, 64, 108, 96, 255, 10, 84, 209, 153, 52, 208, 96, 54, 134, 65, 18, + 69, 6, 131, 50, 14, 11, 223, 56, 143, 55, 242, 178, 145, 132, 79, 184, 232, 58, 124, 85, + 248, 235, 134, 242, 5, 87, 238, 147, 8, 158, 179, 147, 40, 50, 200, 65, 48, 196, 59, 206, + 42, 156, 94, 179, 188, 70, 240, 146, 228, 247, 236, 155, 228, 246, 22, 206, 144, 193, 84, + 218, 33, 190, 92, 218, 160, 10, 238, 218, 179, 129, 146, 29, 240, 235, 3, 124, 132, 75, 27, + 71, 187, 28, 90, 189, 24, 19, 128, 123, 20, 19, 144, 149, 64, 82, 229, 192, 218, 247, 112, + 228, 4, 164, 161, 21, 104, 17, 46, 66, 115, 247, 146, 29, 212, 58, 112, 161, 233, 213, 14, + 199, 166, 4, 173, 164, 108, 137, 161, 222, 154, 146, 135, 213, 83, 62, 162, 238, 129, 7, + 236, 226, 173, 113, 17, 77, 220, 13, 34, 129, 63, 62, 178, 29, 154, 40, 58, 197, 25, 140, + 225, 93, 126, 17, 162, 250, 44, 159, 163, 235, 112, 232, 44, 247, 137, 237, 182, 140, 64, + 195, 72, 180, 216, 21, 211, 252, 92, 82, 253, 230, 111, 146, 222, 7, 41, 170, 147, 38, 109, + 254, 251, 171, 6, 22, 188, 49, 1, 47, 190, 209, 107, 100, 70, 172, 168, 6, 98, 89, 74, 126, + 162, 20, 219, 247, 240, 8, 218, 0, 194, 23, 238, 254, 5, 117, 2, 145, 19, 51, 165, 52, 118, + 20, 83, 51, 56, 48, 230, 231, 121, 212, 116, 64, 255, 27, 59, 169, 36, 251, 176, 190, 199, + 188, 112, 251, 237, 233, 20, 110, 163, 74, 170, 40, 116, 136, 147, 154, 128, 16, 32, 195, + 156, 80, 232, 21, 4, 9, 225, 228, 54, 143, 144, 114, 29, 109, 12, 112, 130, 203, 151, 168, + 168, 129, 42, 116, 51, 20, 216, 48, 248, 192, 137, 68, 230, 69, 240, 10, 54, 86, 112, 90, + 129, 10, 127, 253, 13, 191, 64, 232, 28, 172, 186, 142, 176, 81, 196, 115, 39, 193, 143, 45, + 35, 25, 40, 91, 139, 2, 64, 67, 52, 6, 228, 80, 27, 126, 173, 121, 233, 9, 75, 95, 199, 56, + 199, 19, 55, 113, 242, 21, 94, 207, 223, 198, 24, 57, 13, 136, 192, 92, 91, 151, 179, 166, + 15, 130, 28, 174, 130, 183, 25, 79, 215, 132, 167, 213, 103, 226, 233, 19, 26, 224, 161, 98, + 94, 229, 199, 166, 3, 174, 106, 67, 200, 40, 216, 240, 136, 213, 201, 162, 82, 47, 98, 183, + 165, 101, 14, 191, 112, 212, 69, 153, 180, 216, 138, 218, 11, 162, 95, 80, 19, 134, 255, + 214, 82, 101, 82, 184, 71, 27, 30, 151, 214, 130, 23, 82, 237, 88, 151, 82, 238, 210, 108, + 55, 253, 178, 244, 109, 91, 122, 119, 44, 116, 85, 8, 171, 227, 200, 141, 113, 133, 225, + 180, 208, 134, 0, 0, 65, 186, 0, 13, 188, 151, 65, 87, 84, 179, 166, 108, 22, 78, 224, 100, + 61, 104, 194, 176, 19, 67, 37, 80, 122, 33, 35, 42, 141, 190, 100, 206, 206, 54, 199, 113, + 81, 238, 192, 102, 199, 164, 172, 76, 188, 141, 70, 206, 147, 147, 217, 2, 121, 160, 133, + 63, 104, 44, 43, 168, 142, 158, 91, 73, 42, 64, 195, 7, 34, 148, 169, 89, 103, 185, 23, 8, + 15, 155, 190, 75, 68, 54, 18, 64, 33, 43, 50, 207, 33, 138, 91, 154, 230, 154, 102, 2, 80, + 56, 124, 105, 217, 200, 134, 145, 87, 249, 79, 255, 208, 16, 216, 85, 108, 151, 215, 90, + 132, 22, 184, 198, 80, 90, 10, 47, 5, 137, 135, 0, 124, 138, 47, 140, 175, 22, 138, 213, + 254, 157, 29, 187, 9, 229, 176, 162, 240, 125, 6, 85, 52, 198, 142, 86, 20, 191, 97, 10, 45, + 39, 120, 35, 213, 165, 117, 54, 8, 196, 104, 71, 184, 164, 37, 52, 192, 60, 250, 19, 48, 98, + 30, 44, 25, 214, 240, 83, 132, 28, 147, 231, 235, 200, 126, 224, 59, 233, 177, 134, 87, 181, + 205, 240, 147, 107, 69, 137, 22, 135, 202, 206, 45, 144, 228, 72, 12, 39, 215, 69, 63, 253, + 32, 222, 239, 85, 101, 247, 76, 6, 152, 36, 195, 150, 134, 207, 216, 37, 101, 192, 211, 15, + 23, 208, 210, 129, 124, 191, 100, 28, 63, 91, 112, 3, 140, 88, 231, 190, 30, 173, 101, 42, + 74, 55, 86, 148, 160, 169, 26, 209, 94, 69, 11, 185, 63, 169, 38, 11, 231, 180, 78, 73, 76, + 95, 86, 231, 54, 131, 41, 93, 100, 38, 71, 76, 38, 25, 236, 164, 231, 92, 70, 6, 71, 180, + 74, 234, 216, 143, 85, 113, 50, 239, 170, 94, 6, 120, 241, 78, 128, 211, 167, 1, 136, 62, 0, + 226, 64, 236, 69, 56, 55, 59, 82, 44, 52, 6, 133, 88, 165, 179, 195, 86, 122, 234, 83, 121, + 7, 95, 226, 76, 2, 234, 215, 255, 7, 242, 175, 41, 213, 226, 97, 74, 172, 201, 95, 134, 134, + 228, 149, 216, 107, 68, 248, 94, 17, 40, 40, 139, 166, 50, 242, 92, 184, 244, 155, 159, 151, + 151, 150, 212, 218, 66, 0, 33, 195, 103, 225, 83, 182, 9, 227, 153, 145, 74, 234, 141, 97, + 84, 198, 32, 98, 44, 232, 155, 123, 69, 172, 211, 69, 96, 122, 151, 187, 57, 111, 153, 225, + 225, 7, 61, 30, 97, 187, 45, 103, 179, 185, 140, 50, 136, 104, 210, 202, 210, 30, 87, 12, + 184, 103, 65, 1, 224, 127, 124, 73, 202, 147, 141, 93, 174, 12, 106, 80, 47, 31, 123, 173, + 160, 40, 231, 73, 27, 129, 2, 48, 86, 254, 15, 175, 254, 32, 249, 52, 175, 250, 160, 29, 55, + 244, 57, 245, 49, 121, 155, 232, 197, 248, 48, 221, 14, 74, 192, 144, 55, 200, 201, 111, + 222, 251, 92, 97, 94, 174, 108, 31, 122, 33, 77, 183, 144, 129, 148, 55, 245, 199, 87, 69, + 212, 37, 141, 7, 205, 149, 138, 233, 217, 241, 94, 36, 169, 241, 167, 97, 213, 99, 123, 21, + 191, 186, 20, 205, 220, 194, 12, 185, 113, 64, 131, 83, 182, 48, 225, 91, 39, 46, 184, 47, + 60, 96, 221, 187, 108, 204, 91, 137, 244, 62, 55, 245, 180, 75, 223, 111, 91, 149, 103, 6, + 177, 3, 91, 139, 17, 208, 224, 86, 5, 197, 177, 34, 25, 55, 163, 103, 66, 177, 14, 82, 63, + 90, 224, 232, 88, 74, 194, 163, 200, 133, 212, 118, 252, 22, 179, 105, 222, 30, 25, 66, 218, + 38, 177, 102, 239, 165, 117, 241, 192, 32, 80, 245, 244, 89, 62, 215, 211, 151, 226, 151, + 13, 79, 63, 49, 253, 182, 82, 218, 17, 119, 239, 101, 24, 214, 3, 190, 240, 62, 146, 65, 36, + 76, 80, 4, 27, 12, 44, 98, 142, 133, 186, 87, 152, 10, 158, 80, 253, 46, 135, 34, 218, 245, + 216, 130, 100, 103, 171, 27, 48, 33, 190, 133, 75, 127, 200, 93, 66, 113, 68, 112, 192, 70, + 62, 113, 128, 224, 222, 15, 102, 131, 71, 86, 143, 83, 41, 113, 20, 67, 33, 64, 242, 100, + 232, 198, 89, 164, 16, 31, 225, 43, 134, 254, 217, 30, 20, 193, 62, 187, 58, 240, 229, 180, + 97, 192, 37, 241, 80, 138, 96, 140, 171, 178, 83, 6, 45, 53, 218, 84, 242, 202, 173, 152, + 63, 3, 128, 44, 105, 182, 65, 250, 157, 70, 39, 109, 35, 41, 21, 141, 146, 224, 143, 69, 59, + 67, 23, 129, 212, 139, 17, 82, 97, 190, 179, 37, 118, 87, 204, 121, 114, 187, 136, 113, 230, + 6, 127, 228, 10, 113, 73, 203, 95, 8, 93, 44, 4, 99, 132, 105, 107, 215, 8, 226, 155, 136, + 113, 233, 112, 181, 25, 240, 174, 9, 227, 199, 152, 44, 31, 195, 238, 21, 121, 176, 242, + 159, 244, 141, 146, 54, 0, 223, 82, 87, 199, 102, 58, 236, 112, 61, 121, 94, 232, 13, 117, + 208, 118, 247, 35, 165, 174, 100, 116, 128, 48, 173, 196, 169, 206, 147, 109, 48, 213, 229, + 58, 171, 211, 121, 164, 12, 242, 218, 77, 145, 65, 53, 218, 66, 212, 210, 169, 171, 7, 208, + 38, 51, 92, 148, 16, 165, 53, 211, 75, 127, 147, 58, 215, 220, 49, 23, 27, 243, 154, 74, + 112, 80, 205, 30, 204, 58, 201, 249, 81, 250, 251, 26, 4, 15, 49, 129, 104, 135, 215, 175, + 219, 16, 174, 80, 218, 45, 94, 238, 195, 199, 87, 145, 79, 55, 211, 31, 17, 218, 49, 16, 45, + 212, 53, 60, 181, 138, 10, 15, 237, 224, 199, 134, 79, 129, 10, 220, 2, 105, 88, 120, 193, + 167, 110, 98, 108, 162, 216, 75, 88, 185, 64, 23, 11, 135, 190, 87, 90, 172, 193, 90, 158, + 26, 64, 214, 155, 207, 36, 235, 175, 65, 57, 167, 34, 161, 141, 46, 92, 253, 146, 107, 185, + 135, 243, 105, 22, 73, 248, 103, 174, 167, 247, 92, 84, 250, 218, 68, 89, 252, 175, 71, 209, + 224, 224, 134, 231, 174, 142, 184, 3, 21, 146, 90, 4, 95, 50, 103, 93, 173, 168, 193, 205, + 140, 171, 233, 27, 239, 10, 167, 141, 109, 32, 144, 25, 62, 225, 82, 79, 235, 158, 159, 230, + 205, 133, 162, 81, 127, 156, 241, 125, 198, 206, 124, 113, 73, 115, 36, 18, 142, 85, 94, 39, + 83, 46, 116, 15, 62, 146, 64, 199, 57, 239, 69, 81, 59, 179, 198, 9, 198, 24, 5, 63, 149, + 124, 12, 113, 105, 60, 132, 85, 130, 84, 170, 34, 204, 100, 205, 194, 37, 113, 249, 125, 47, + 19, 225, 105, 122, 84, 207, 171, 92, 135, 47, 153, 218, 225, 168, 1, 98, 132, 150, 141, 84, + 144, 242, 181, 31, 153, 38, 111, 152, 231, 48, 91, 11, 77, 236, 153, 177, 12, 9, 186, 193, + 193, 238, 222, 137, 72, 82, 140, 231, 140, 57, 91, 27, 187, 189, 76, 79, 42, 113, 243, 90, + 99, 234, 202, 137, 234, 61, 1, 187, 145, 36, 17, 51, 128, 74, 120, 47, 145, 36, 124, 27, 0, + 188, 202, 83, 92, 195, 87, 232, 27, 23, 14, 206, 200, 47, 157, 188, 160, 132, 9, 134, 125, + 203, 29, 177, 66, 112, 210, 62, 122, 96, 67, 158, 147, 66, 171, 177, 85, 225, 74, 2, 115, + 178, 73, 31, 30, 99, 8, 250, 159, 155, 185, 238, 76, 51, 11, 144, 154, 104, 31, 146, 201, + 196, 72, 56, 230, 94, 109, 221, 24, 27, 89, 67, 26, 76, 167, 76, 172, 225, 243, 9, 14, 142, + 95, 194, 226, 79, 129, 177, 190, 1, 149, 223, 133, 48, 83, 28, 64, 226, 27, 148, 72, 152, + 125, 130, 106, 122, 131, 57, 244, 36, 118, 51, 219, 165, 168, 200, 4, 107, 200, 12, 191, + 179, 165, 38, 115, 132, 39, 130, 25, 77, 13, 239, 128, 246, 24, 164, 38, 54, 245, 91, 142, + 8, 73, 251, 121, 90, 43, 209, 192, 38, 186, 249, 33, 206, 65, 102, 46, 108, 88, 99, 70, 204, + 253, 243, 129, 82, 195, 138, 159, 147, 159, 94, 113, 30, 239, 218, 162, 173, 111, 229, 90, + 33, 86, 198, 155, 90, 124, 145, 7, 138, 82, 148, 148, 123, 142, 240, 178, 7, 2, 127, 196, + 200, 192, 84, 226, 143, 103, 47, 79, 178, 201, 179, 229, 228, 95, 1, 6, 0, 212, 166, 177, + 196, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 50, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, + 32, 50, 56, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 55, 32, 48, 32, 82, 47, + 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, + 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, + 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, + 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, + 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, + 101, 110, 116, 115, 32, 49, 50, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 50, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, + 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, + 103, 116, 104, 32, 50, 52, 50, 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, + 172, 87, 109, 111, 27, 55, 18, 254, 238, 95, 177, 31, 119, 139, 106, 179, 228, 114, 223, + 128, 162, 64, 28, 7, 65, 91, 24, 8, 90, 93, 139, 34, 45, 112, 78, 28, 89, 142, 109, 217, 80, + 172, 203, 229, 223, 31, 231, 149, 195, 149, 148, 186, 151, 162, 144, 155, 37, 135, 195, 225, + 188, 60, 243, 204, 233, 242, 228, 217, 235, 139, 237, 99, 241, 221, 119, 207, 206, 95, 252, + 112, 86, 52, 197, 247, 223, 159, 158, 189, 40, 78, 154, 2, 254, 219, 94, 157, 60, 91, 46, + 155, 194, 249, 98, 185, 58, 105, 234, 105, 154, 70, 220, 112, 133, 159, 66, 61, 245, 197, + 224, 125, 29, 138, 229, 221, 201, 155, 210, 85, 125, 217, 84, 127, 46, 127, 132, 51, 174, + 112, 109, 61, 225, 49, 231, 107, 31, 124, 60, 180, 188, 60, 41, 139, 106, 249, 225, 100, + 225, 38, 95, 55, 237, 88, 44, 92, 95, 183, 62, 109, 208, 65, 58, 53, 246, 81, 100, 40, 22, + 125, 215, 212, 125, 152, 203, 136, 242, 133, 202, 237, 171, 82, 187, 139, 190, 115, 117, 95, + 44, 207, 162, 149, 207, 171, 174, 252, 88, 45, 92, 249, 80, 45, 218, 242, 58, 126, 109, 171, + 69, 87, 94, 84, 139, 190, 124, 140, 47, 128, 149, 251, 106, 225, 203, 13, 236, 227, 242, + 109, 92, 42, 42, 215, 148, 103, 241, 92, 131, 18, 168, 1, 196, 241, 48, 172, 188, 131, 51, + 176, 130, 91, 69, 197, 42, 81, 203, 37, 252, 129, 165, 211, 91, 209, 142, 226, 55, 42, 251, + 186, 90, 140, 164, 11, 119, 175, 224, 104, 178, 235, 174, 90, 12, 244, 231, 125, 229, 167, + 120, 0, 156, 220, 212, 77, 227, 138, 133, 159, 234, 14, 159, 253, 166, 108, 227, 237, 125, + 252, 213, 18, 4, 47, 190, 236, 234, 182, 111, 109, 4, 140, 163, 61, 184, 55, 208, 230, 155, + 242, 180, 106, 203, 93, 21, 226, 147, 198, 248, 238, 133, 115, 209, 120, 250, 218, 196, 255, + 71, 187, 224, 250, 69, 23, 192, 78, 215, 226, 34, 125, 63, 130, 181, 235, 248, 249, 30, 30, + 64, 107, 31, 65, 28, 180, 189, 171, 60, 254, 112, 15, 87, 63, 90, 77, 125, 185, 250, 162, + 158, 231, 224, 38, 60, 241, 192, 198, 108, 227, 239, 130, 98, 128, 254, 31, 81, 11, 88, 19, + 87, 189, 139, 166, 143, 124, 246, 76, 4, 240, 60, 138, 195, 97, 88, 137, 49, 112, 3, 45, 25, + 115, 94, 67, 176, 182, 172, 17, 31, 172, 151, 221, 233, 31, 52, 238, 219, 106, 58, 98, 52, + 248, 127, 209, 198, 196, 108, 32, 49, 135, 122, 232, 201, 187, 175, 64, 29, 232, 253, 15, + 196, 27, 133, 183, 236, 218, 164, 22, 190, 80, 97, 212, 221, 186, 128, 122, 47, 212, 3, 188, + 8, 199, 222, 83, 34, 249, 217, 49, 120, 251, 103, 72, 22, 16, 109, 3, 126, 227, 121, 136, + 68, 204, 71, 215, 225, 33, 53, 247, 146, 124, 15, 90, 179, 119, 120, 89, 61, 234, 126, 127, + 216, 255, 142, 51, 135, 143, 67, 74, 209, 2, 200, 192, 213, 55, 214, 229, 32, 242, 100, 159, + 139, 115, 27, 116, 43, 36, 62, 212, 52, 232, 220, 247, 234, 60, 105, 167, 80, 118, 152, 180, + 13, 2, 85, 207, 107, 111, 209, 35, 183, 124, 249, 158, 121, 81, 98, 133, 18, 247, 88, 237, + 35, 175, 225, 118, 202, 64, 112, 237, 60, 39, 229, 197, 92, 35, 206, 101, 169, 62, 133, 121, + 53, 228, 81, 188, 22, 109, 183, 122, 103, 124, 136, 255, 123, 233, 35, 134, 170, 40, 30, + 164, 220, 183, 213, 72, 162, 120, 29, 108, 72, 36, 108, 165, 130, 215, 151, 223, 68, 103, + 223, 73, 42, 129, 97, 106, 234, 131, 122, 81, 234, 214, 69, 141, 144, 90, 160, 8, 207, 80, + 194, 92, 87, 46, 160, 141, 114, 177, 155, 102, 64, 177, 102, 127, 77, 179, 180, 135, 5, 77, + 218, 84, 230, 154, 179, 92, 142, 158, 245, 239, 196, 15, 91, 140, 196, 181, 181, 150, 194, + 2, 22, 243, 33, 55, 153, 98, 216, 105, 141, 28, 134, 152, 111, 177, 13, 88, 19, 53, 101, + 197, 181, 59, 117, 71, 150, 30, 148, 194, 230, 206, 79, 140, 241, 124, 11, 199, 137, 138, + 71, 61, 174, 181, 254, 81, 224, 67, 244, 229, 81, 20, 189, 1, 115, 76, 210, 31, 181, 167, + 178, 55, 121, 69, 215, 72, 170, 110, 216, 253, 96, 244, 78, 226, 99, 179, 56, 185, 139, 171, + 227, 70, 28, 67, 170, 40, 81, 59, 116, 33, 26, 149, 178, 148, 170, 11, 106, 239, 225, 112, + 174, 138, 94, 10, 43, 44, 19, 42, 117, 177, 60, 109, 26, 36, 216, 38, 195, 71, 182, 107, + 101, 235, 47, 71, 122, 73, 171, 189, 64, 196, 62, 57, 178, 155, 51, 178, 0, 45, 117, 96, + 182, 144, 250, 50, 54, 98, 108, 228, 235, 202, 245, 166, 185, 131, 33, 231, 240, 149, 150, + 50, 98, 160, 237, 253, 87, 160, 16, 75, 88, 126, 37, 231, 136, 80, 196, 166, 14, 190, 194, + 238, 94, 42, 67, 64, 126, 34, 77, 63, 233, 213, 235, 148, 134, 224, 31, 67, 91, 252, 152, + 64, 146, 217, 193, 25, 179, 131, 225, 43, 217, 193, 50, 158, 191, 39, 228, 236, 40, 195, + 238, 152, 74, 185, 78, 81, 35, 133, 221, 176, 0, 193, 86, 170, 163, 152, 162, 139, 184, 192, + 13, 12, 194, 41, 181, 197, 104, 225, 157, 150, 18, 41, 17, 136, 167, 212, 128, 235, 76, 65, + 91, 164, 253, 91, 196, 226, 65, 146, 139, 106, 78, 43, 157, 74, 216, 180, 206, 173, 102, + 184, 116, 214, 120, 26, 31, 42, 98, 27, 209, 172, 105, 152, 26, 203, 17, 86, 32, 188, 45, + 35, 37, 154, 239, 140, 251, 174, 13, 9, 94, 168, 134, 118, 21, 117, 98, 5, 198, 40, 242, 71, + 25, 77, 198, 54, 250, 107, 124, 53, 196, 233, 149, 130, 247, 31, 85, 149, 64, 167, 53, 221, + 22, 239, 129, 66, 91, 39, 156, 8, 34, 117, 174, 208, 164, 85, 42, 54, 90, 61, 217, 117, 188, + 113, 166, 88, 54, 135, 128, 254, 24, 0, 216, 75, 149, 173, 105, 201, 219, 54, 218, 50, 106, + 206, 129, 7, 119, 222, 230, 28, 44, 167, 9, 51, 34, 20, 246, 105, 80, 13, 230, 2, 39, 25, 2, + 62, 106, 205, 56, 170, 92, 165, 195, 203, 189, 220, 62, 26, 166, 211, 61, 129, 20, 72, 234, + 181, 221, 17, 239, 193, 198, 74, 130, 145, 234, 224, 150, 29, 159, 117, 108, 144, 53, 224, + 46, 52, 174, 51, 225, 124, 203, 246, 63, 230, 109, 230, 112, 197, 240, 227, 76, 101, 113, + 39, 6, 111, 28, 135, 225, 228, 103, 1, 77, 125, 128, 20, 252, 237, 126, 7, 206, 94, 18, 230, + 179, 2, 95, 28, 186, 25, 5, 8, 153, 147, 87, 166, 152, 3, 63, 91, 186, 163, 154, 169, 12, + 144, 11, 32, 32, 152, 128, 233, 90, 153, 54, 243, 97, 251, 82, 225, 44, 117, 70, 237, 117, + 228, 236, 43, 99, 208, 225, 30, 62, 102, 15, 72, 29, 109, 246, 134, 205, 177, 8, 237, 211, + 141, 253, 132, 54, 0, 28, 14, 192, 47, 95, 232, 45, 181, 59, 60, 133, 129, 200, 35, 77, 159, + 189, 124, 27, 58, 20, 142, 146, 33, 67, 161, 252, 140, 158, 205, 216, 153, 53, 196, 120, + 163, 205, 217, 154, 79, 32, 99, 110, 146, 73, 211, 220, 180, 213, 20, 102, 16, 243, 195, + 177, 43, 244, 113, 138, 67, 179, 190, 131, 46, 100, 120, 110, 34, 58, 187, 12, 157, 109, + 231, 81, 144, 87, 66, 113, 109, 73, 53, 174, 96, 131, 96, 75, 7, 119, 168, 68, 97, 85, 211, + 61, 145, 149, 11, 234, 227, 134, 181, 189, 229, 222, 34, 73, 14, 7, 83, 45, 229, 216, 10, + 43, 107, 29, 84, 224, 103, 110, 19, 238, 5, 219, 15, 92, 37, 91, 75, 78, 55, 243, 150, 106, + 43, 84, 80, 113, 144, 89, 112, 147, 52, 167, 25, 77, 42, 207, 64, 186, 166, 45, 210, 216, + 212, 142, 153, 128, 180, 133, 115, 117, 19, 144, 131, 180, 245, 228, 133, 131, 252, 155, 57, + 72, 203, 28, 100, 143, 148, 184, 166, 30, 27, 47, 164, 196, 69, 189, 52, 216, 129, 215, 105, + 184, 147, 49, 143, 231, 46, 26, 106, 36, 99, 182, 198, 165, 176, 251, 41, 97, 226, 45, 131, + 237, 126, 59, 65, 73, 153, 99, 92, 34, 185, 188, 131, 139, 24, 17, 13, 163, 182, 155, 61, + 34, 128, 39, 108, 189, 193, 55, 23, 179, 167, 106, 166, 48, 163, 252, 145, 110, 233, 14, 80, + 26, 88, 124, 66, 11, 117, 105, 58, 56, 164, 73, 185, 138, 15, 245, 224, 59, 197, 118, 112, + 182, 86, 192, 127, 33, 205, 197, 24, 111, 85, 168, 123, 197, 42, 216, 253, 76, 68, 86, 160, + 97, 107, 154, 42, 108, 75, 226, 168, 91, 25, 64, 253, 161, 87, 194, 226, 147, 41, 70, 238, + 53, 47, 41, 156, 21, 112, 66, 24, 22, 193, 222, 172, 241, 51, 27, 43, 173, 48, 153, 210, + 142, 155, 248, 139, 220, 147, 81, 140, 93, 158, 12, 212, 107, 76, 149, 44, 57, 65, 41, 31, + 53, 1, 109, 33, 30, 157, 90, 164, 47, 188, 172, 134, 242, 230, 182, 226, 161, 5, 71, 139, + 207, 60, 161, 192, 93, 61, 13, 16, 247, 124, 127, 171, 115, 7, 204, 22, 63, 99, 131, 240, + 105, 170, 80, 9, 29, 65, 174, 69, 179, 156, 249, 5, 110, 120, 7, 234, 214, 32, 131, 138, + 239, 41, 34, 48, 163, 76, 210, 188, 8, 91, 217, 208, 75, 158, 73, 198, 175, 156, 73, 126, 0, + 167, 72, 136, 134, 67, 177, 24, 130, 77, 91, 231, 83, 54, 12, 95, 76, 219, 238, 120, 218, + 74, 39, 26, 66, 234, 168, 25, 77, 182, 151, 27, 186, 170, 232, 2, 235, 42, 71, 240, 68, 179, + 132, 98, 48, 11, 145, 139, 4, 221, 70, 68, 183, 94, 176, 77, 31, 144, 76, 204, 18, 46, 43, + 179, 33, 107, 141, 41, 237, 236, 72, 34, 101, 174, 237, 233, 129, 127, 89, 199, 0, 208, 216, + 235, 92, 0, 237, 60, 109, 57, 250, 151, 156, 161, 149, 125, 176, 10, 113, 30, 133, 135, 133, + 244, 160, 184, 134, 201, 11, 178, 90, 127, 88, 225, 24, 137, 11, 234, 212, 11, 129, 57, 105, + 115, 90, 254, 180, 247, 115, 70, 114, 192, 163, 42, 164, 65, 162, 250, 202, 38, 173, 89, + 201, 82, 31, 5, 3, 111, 103, 97, 151, 199, 171, 143, 149, 1, 40, 219, 36, 169, 22, 115, 59, + 238, 117, 250, 60, 125, 213, 13, 249, 35, 197, 33, 231, 118, 199, 134, 66, 66, 157, 206, + 120, 127, 103, 113, 83, 223, 39, 128, 225, 255, 10, 44, 126, 147, 106, 134, 210, 126, 79, + 141, 146, 202, 58, 130, 93, 160, 58, 214, 165, 51, 228, 162, 91, 242, 125, 220, 216, 65, + 189, 95, 193, 233, 181, 160, 3, 136, 189, 134, 55, 39, 169, 141, 64, 136, 5, 24, 60, 5, 80, + 194, 34, 190, 183, 48, 8, 158, 155, 254, 65, 100, 232, 14, 36, 96, 71, 126, 75, 196, 96, 39, + 209, 91, 155, 150, 209, 5, 38, 78, 66, 176, 55, 70, 197, 209, 250, 207, 162, 5, 58, 180, + 216, 175, 82, 71, 54, 93, 167, 19, 146, 182, 170, 112, 170, 130, 133, 159, 24, 115, 100, 6, + 73, 4, 60, 37, 16, 254, 139, 211, 178, 123, 178, 49, 105, 168, 210, 10, 153, 85, 243, 166, + 50, 202, 142, 227, 196, 23, 57, 221, 80, 251, 113, 206, 233, 36, 82, 111, 112, 20, 138, 245, + 0, 149, 1, 246, 183, 202, 217, 136, 189, 193, 108, 48, 5, 133, 70, 114, 142, 69, 86, 216, + 221, 99, 110, 252, 68, 216, 179, 220, 13, 190, 213, 239, 137, 48, 176, 239, 219, 73, 102, + 15, 166, 99, 176, 240, 175, 202, 25, 194, 108, 57, 9, 236, 158, 198, 157, 158, 171, 87, 249, + 160, 186, 154, 133, 144, 69, 164, 236, 250, 160, 60, 78, 201, 71, 186, 60, 187, 59, 207, 55, + 6, 23, 80, 99, 88, 39, 70, 132, 93, 108, 199, 149, 255, 107, 176, 128, 222, 112, 39, 82, 52, + 24, 201, 237, 60, 64, 193, 6, 61, 69, 48, 233, 74, 103, 216, 35, 60, 234, 80, 191, 193, 213, + 21, 182, 185, 60, 104, 115, 240, 4, 185, 157, 186, 159, 23, 164, 66, 116, 65, 31, 11, 70, + 173, 42, 51, 231, 218, 151, 229, 89, 125, 163, 232, 104, 204, 73, 233, 197, 239, 149, 120, + 94, 107, 245, 221, 200, 43, 217, 76, 175, 180, 38, 195, 237, 79, 122, 89, 106, 204, 160, + 136, 185, 91, 95, 254, 5, 28, 35, 116, 34, 63, 3, 176, 124, 30, 127, 159, 232, 93, 61, 81, + 50, 88, 253, 29, 33, 243, 3, 223, 212, 19, 190, 94, 16, 112, 176, 69, 81, 35, 212, 40, 104, + 148, 246, 250, 53, 80, 10, 172, 212, 66, 231, 52, 4, 69, 76, 42, 29, 237, 107, 216, 168, 89, + 100, 198, 2, 96, 9, 139, 226, 156, 147, 31, 22, 144, 142, 39, 175, 73, 100, 96, 235, 119, + 158, 100, 63, 232, 216, 197, 25, 236, 157, 136, 48, 116, 121, 61, 163, 101, 63, 207, 40, + 216, 212, 170, 95, 87, 97, 31, 231, 128, 13, 59, 33, 215, 9, 237, 250, 122, 36, 39, 64, 244, + 64, 61, 191, 176, 43, 251, 184, 208, 107, 103, 159, 225, 68, 103, 244, 154, 17, 164, 147, + 106, 119, 61, 42, 212, 10, 231, 163, 208, 95, 15, 162, 169, 243, 245, 232, 195, 12, 78, 91, + 142, 214, 94, 248, 166, 24, 90, 47, 209, 27, 176, 153, 10, 135, 76, 24, 219, 112, 187, 38, + 144, 21, 156, 82, 144, 229, 148, 157, 165, 107, 63, 212, 253, 20, 108, 214, 188, 60, 127, + 81, 156, 188, 92, 158, 252, 79, 128, 1, 0, 22, 196, 92, 208, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 50, 57, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 51, 48, 32, 48, 32, 82, 47, + 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 51, 55, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, + 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, + 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, + 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, + 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 49, 51, + 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, + 51, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 50, 57, + 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 219, 110, 28, 199, 17, + 125, 223, 175, 152, 167, 96, 38, 240, 140, 182, 123, 238, 129, 97, 192, 34, 21, 71, 1, 12, + 8, 241, 190, 81, 1, 66, 114, 185, 36, 165, 37, 195, 44, 185, 86, 156, 175, 79, 215, 181, + 171, 103, 134, 27, 43, 130, 64, 97, 187, 167, 171, 186, 186, 46, 167, 78, 189, 221, 172, + 222, 124, 184, 60, 188, 100, 223, 127, 255, 230, 231, 179, 247, 231, 217, 58, 251, 225, 135, + 183, 231, 103, 217, 106, 157, 193, 191, 195, 237, 234, 205, 102, 179, 206, 156, 207, 54, + 187, 213, 186, 26, 199, 113, 192, 15, 46, 243, 99, 83, 141, 93, 214, 123, 95, 53, 217, 230, + 97, 117, 145, 187, 162, 11, 127, 127, 223, 252, 21, 100, 92, 230, 234, 106, 68, 49, 231, 43, + 223, 248, 32, 180, 217, 174, 242, 172, 216, 124, 90, 149, 110, 244, 213, 186, 30, 178, 210, + 117, 85, 237, 227, 7, 18, 36, 169, 161, 11, 71, 250, 172, 236, 218, 117, 213, 53, 211, 51, + 162, 188, 212, 115, 115, 85, 106, 119, 214, 181, 174, 234, 178, 205, 121, 176, 242, 237, 93, + 81, 214, 249, 101, 81, 118, 249, 161, 40, 91, 250, 245, 18, 76, 207, 138, 54, 255, 165, 40, + 251, 124, 114, 224, 166, 240, 249, 22, 182, 224, 192, 223, 194, 2, 54, 158, 96, 227, 159, + 69, 233, 243, 231, 162, 116, 249, 125, 248, 4, 58, 112, 7, 165, 126, 3, 121, 144, 192, 173, + 93, 81, 54, 184, 122, 31, 14, 61, 130, 44, 138, 93, 235, 113, 80, 128, 58, 65, 203, 189, + 136, 197, 147, 32, 251, 49, 47, 202, 65, 237, 119, 117, 98, 127, 116, 59, 62, 217, 55, 46, + 56, 125, 176, 78, 55, 14, 241, 193, 161, 142, 190, 93, 208, 155, 255, 82, 148, 35, 62, 14, + 12, 252, 88, 20, 14, 204, 5, 157, 165, 111, 234, 106, 24, 198, 172, 244, 67, 53, 144, 68, + 131, 129, 238, 242, 74, 110, 245, 18, 179, 182, 170, 187, 122, 114, 169, 154, 4, 97, 108, + 228, 214, 143, 222, 187, 98, 204, 223, 22, 117, 240, 119, 3, 175, 112, 225, 61, 3, 253, 120, + 129, 135, 101, 193, 164, 6, 172, 243, 46, 61, 114, 3, 174, 9, 17, 113, 114, 134, 130, 82, + 66, 84, 154, 224, 184, 14, 92, 54, 6, 47, 14, 164, 40, 184, 18, 157, 53, 64, 80, 122, 150, + 161, 205, 93, 209, 240, 250, 61, 248, 246, 49, 44, 81, 246, 186, 240, 40, 112, 31, 78, 57, + 84, 251, 66, 81, 26, 88, 80, 79, 134, 119, 248, 240, 14, 82, 242, 133, 14, 129, 204, 62, 28, + 221, 227, 47, 250, 116, 21, 4, 192, 70, 207, 107, 20, 70, 163, 205, 99, 143, 225, 208, 147, + 154, 68, 138, 30, 117, 125, 137, 174, 160, 223, 219, 162, 65, 107, 110, 147, 151, 162, 139, + 228, 86, 140, 94, 29, 138, 99, 13, 197, 209, 87, 235, 134, 60, 175, 158, 82, 121, 245, 59, + 236, 130, 171, 197, 79, 125, 147, 63, 192, 254, 177, 176, 6, 195, 10, 183, 191, 163, 135, + 247, 250, 112, 54, 227, 142, 76, 238, 27, 142, 210, 220, 80, 248, 241, 31, 181, 216, 248, + 182, 51, 239, 133, 213, 78, 85, 201, 55, 52, 129, 182, 246, 98, 247, 103, 115, 235, 200, + 153, 2, 103, 33, 140, 247, 146, 49, 143, 18, 69, 18, 134, 253, 73, 188, 193, 111, 176, 109, + 226, 13, 91, 114, 51, 158, 76, 133, 105, 165, 143, 150, 0, 131, 235, 215, 136, 72, 3, 129, + 206, 142, 221, 13, 158, 70, 53, 108, 72, 107, 86, 104, 245, 173, 122, 185, 130, 132, 132, + 19, 89, 225, 214, 172, 51, 193, 52, 46, 200, 115, 41, 225, 35, 224, 194, 147, 254, 23, 161, + 72, 192, 13, 65, 40, 110, 103, 2, 57, 184, 53, 221, 119, 93, 4, 38, 68, 160, 8, 72, 55, 5, + 159, 124, 46, 124, 19, 95, 235, 199, 170, 245, 100, 15, 0, 132, 255, 70, 128, 248, 51, 93, + 218, 161, 207, 130, 159, 67, 191, 225, 250, 134, 250, 51, 31, 106, 71, 31, 110, 232, 5, 236, + 224, 105, 208, 188, 148, 231, 29, 99, 4, 239, 165, 168, 194, 234, 76, 120, 233, 90, 200, 98, + 194, 131, 19, 234, 53, 237, 182, 36, 10, 154, 160, 86, 30, 81, 28, 191, 2, 10, 236, 205, + 101, 32, 198, 24, 149, 90, 4, 9, 179, 67, 57, 121, 233, 54, 218, 179, 152, 111, 182, 212, + 91, 79, 62, 84, 183, 60, 10, 126, 238, 165, 2, 185, 196, 69, 63, 65, 70, 155, 170, 198, 157, + 43, 17, 141, 184, 6, 219, 184, 245, 192, 137, 17, 2, 66, 15, 101, 219, 190, 11, 91, 107, 60, + 166, 158, 253, 87, 1, 206, 16, 52, 152, 193, 120, 203, 37, 34, 136, 103, 74, 56, 60, 8, 101, + 212, 126, 45, 27, 130, 75, 80, 32, 192, 127, 144, 231, 193, 153, 87, 208, 184, 85, 44, 150, + 18, 224, 224, 130, 130, 95, 161, 234, 238, 217, 221, 228, 94, 248, 101, 138, 209, 191, 82, + 140, 99, 213, 35, 195, 160, 180, 78, 235, 225, 3, 136, 107, 57, 197, 82, 19, 218, 160, 100, + 161, 14, 139, 63, 205, 184, 2, 22, 110, 108, 246, 207, 132, 153, 92, 160, 88, 246, 215, 212, + 72, 58, 90, 41, 109, 1, 45, 127, 40, 38, 218, 126, 133, 200, 195, 87, 213, 243, 32, 59, 143, + 196, 64, 164, 123, 108, 254, 200, 181, 92, 127, 99, 45, 107, 115, 69, 247, 222, 48, 109, 98, + 220, 123, 40, 220, 20, 161, 165, 170, 92, 157, 212, 34, 44, 85, 21, 228, 139, 54, 174, 168, + 13, 182, 142, 12, 253, 47, 228, 159, 38, 169, 111, 80, 50, 173, 84, 215, 18, 132, 28, 180, + 191, 111, 139, 38, 85, 3, 102, 68, 235, 89, 15, 124, 165, 174, 252, 36, 57, 43, 45, 199, 22, + 25, 158, 85, 10, 51, 211, 114, 73, 4, 15, 127, 107, 75, 59, 72, 207, 228, 147, 175, 149, + 184, 246, 103, 173, 108, 234, 96, 144, 212, 123, 70, 44, 70, 70, 38, 35, 45, 248, 52, 60, + 241, 97, 110, 184, 180, 199, 182, 49, 52, 135, 214, 74, 20, 160, 74, 190, 80, 91, 65, 168, + 96, 26, 214, 38, 94, 141, 155, 120, 247, 131, 144, 139, 61, 43, 64, 199, 224, 110, 26, 120, + 174, 51, 16, 252, 145, 96, 16, 52, 189, 80, 62, 51, 188, 211, 231, 41, 80, 193, 158, 130, + 194, 149, 26, 113, 148, 19, 91, 125, 201, 147, 86, 118, 100, 120, 96, 211, 54, 161, 26, 59, + 126, 131, 180, 242, 158, 203, 251, 98, 126, 115, 221, 68, 47, 74, 82, 197, 103, 67, 0, 192, + 183, 76, 150, 76, 166, 105, 74, 69, 18, 100, 84, 74, 222, 47, 151, 204, 204, 115, 82, 50, + 245, 82, 75, 91, 10, 159, 232, 191, 157, 8, 226, 250, 82, 44, 127, 140, 224, 7, 39, 54, 65, + 122, 242, 116, 96, 240, 71, 126, 117, 76, 88, 201, 164, 186, 49, 228, 230, 179, 62, 81, 11, + 60, 9, 164, 235, 19, 135, 11, 122, 106, 195, 68, 37, 210, 7, 123, 155, 163, 215, 50, 1, 240, + 151, 197, 151, 112, 82, 250, 126, 210, 115, 123, 3, 36, 177, 40, 248, 203, 81, 251, 139, 21, + 181, 62, 128, 77, 110, 27, 144, 74, 218, 130, 142, 220, 147, 148, 60, 243, 89, 176, 21, 243, + 159, 90, 27, 181, 37, 171, 204, 240, 94, 63, 126, 117, 34, 88, 15, 24, 136, 131, 189, 79, + 66, 169, 174, 76, 114, 35, 200, 203, 188, 19, 221, 60, 227, 228, 166, 5, 150, 142, 152, 246, + 107, 141, 144, 2, 103, 27, 161, 212, 206, 25, 249, 185, 35, 226, 41, 237, 15, 119, 246, 69, + 251, 181, 125, 170, 19, 38, 194, 61, 17, 86, 91, 109, 128, 160, 93, 117, 40, 179, 197, 230, + 187, 147, 22, 123, 11, 178, 7, 30, 18, 125, 40, 140, 6, 213, 222, 129, 18, 210, 29, 120, 12, + 222, 182, 149, 173, 79, 122, 250, 10, 182, 248, 226, 101, 14, 220, 124, 99, 223, 60, 3, 243, + 117, 50, 155, 142, 121, 88, 148, 46, 25, 20, 127, 127, 142, 184, 49, 102, 39, 238, 105, 231, + 209, 166, 197, 185, 167, 181, 58, 198, 41, 214, 92, 121, 107, 62, 75, 170, 82, 102, 167, 9, + 21, 231, 71, 105, 186, 99, 99, 172, 196, 47, 58, 154, 130, 49, 214, 142, 157, 18, 255, 67, + 124, 246, 172, 18, 205, 166, 37, 154, 91, 147, 237, 75, 45, 244, 55, 74, 18, 49, 84, 110, + 72, 169, 71, 195, 141, 158, 126, 31, 180, 107, 124, 17, 127, 146, 115, 212, 232, 38, 144, + 38, 176, 183, 38, 144, 113, 211, 190, 67, 123, 138, 91, 73, 104, 240, 167, 23, 128, 226, + 244, 169, 51, 231, 170, 117, 67, 25, 84, 87, 67, 239, 56, 133, 254, 49, 73, 161, 11, 198, + 93, 23, 164, 215, 116, 187, 37, 22, 159, 197, 107, 98, 129, 132, 74, 248, 51, 217, 200, 237, + 202, 225, 212, 228, 73, 66, 90, 153, 54, 125, 199, 51, 149, 36, 18, 97, 217, 86, 149, 95, + 21, 113, 70, 33, 151, 116, 132, 35, 181, 218, 149, 76, 110, 203, 78, 241, 26, 60, 122, 120, + 18, 188, 8, 150, 109, 254, 19, 100, 211, 57, 24, 244, 1, 74, 83, 17, 75, 186, 150, 201, 230, + 133, 233, 96, 152, 24, 29, 199, 28, 248, 70, 141, 1, 110, 139, 57, 155, 12, 76, 154, 237, + 42, 171, 16, 26, 43, 80, 111, 159, 207, 89, 166, 24, 253, 188, 26, 91, 147, 140, 109, 238, + 49, 181, 32, 184, 16, 228, 17, 216, 92, 25, 126, 120, 142, 184, 52, 108, 130, 105, 231, 243, + 147, 3, 11, 65, 85, 251, 141, 80, 181, 224, 227, 178, 29, 39, 156, 44, 186, 78, 219, 147, + 58, 201, 130, 90, 155, 96, 201, 180, 53, 61, 27, 90, 156, 28, 229, 165, 158, 94, 172, 46, + 56, 97, 43, 222, 145, 122, 107, 243, 244, 13, 115, 61, 135, 5, 131, 45, 167, 208, 245, 132, + 216, 44, 193, 15, 2, 168, 206, 158, 90, 11, 112, 215, 2, 116, 127, 244, 222, 135, 210, 84, + 243, 56, 131, 118, 133, 128, 100, 23, 25, 136, 57, 148, 24, 215, 68, 157, 58, 149, 76, 89, + 212, 41, 202, 111, 153, 52, 124, 139, 0, 254, 122, 68, 231, 140, 164, 77, 8, 137, 108, 157, + 100, 34, 66, 247, 34, 151, 166, 227, 9, 24, 111, 139, 218, 135, 114, 152, 243, 72, 91, 65, + 52, 32, 157, 102, 225, 237, 255, 197, 193, 201, 182, 118, 250, 92, 123, 165, 6, 251, 30, + 187, 83, 196, 200, 86, 102, 193, 22, 31, 166, 204, 49, 246, 51, 97, 99, 122, 214, 146, 92, + 105, 201, 41, 66, 225, 9, 25, 188, 174, 36, 222, 20, 23, 131, 65, 212, 222, 192, 154, 100, + 60, 216, 138, 190, 170, 240, 205, 105, 194, 119, 145, 191, 43, 122, 226, 86, 248, 31, 240, + 174, 107, 26, 6, 186, 148, 141, 193, 197, 39, 169, 32, 65, 87, 139, 10, 255, 77, 252, 39, + 28, 82, 234, 183, 181, 34, 71, 101, 124, 164, 122, 194, 199, 44, 200, 117, 95, 13, 114, 206, + 87, 163, 124, 188, 152, 141, 63, 163, 140, 153, 66, 53, 20, 118, 4, 109, 24, 61, 46, 117, + 172, 152, 146, 56, 136, 25, 157, 251, 122, 158, 63, 166, 156, 99, 137, 18, 133, 189, 51, 5, + 187, 4, 190, 148, 52, 185, 20, 240, 216, 98, 42, 182, 7, 225, 158, 58, 131, 45, 88, 98, 73, + 221, 255, 48, 73, 90, 81, 233, 135, 170, 246, 93, 130, 131, 79, 220, 68, 147, 234, 64, 171, + 210, 226, 7, 222, 224, 24, 27, 117, 34, 212, 129, 212, 45, 144, 197, 218, 157, 192, 21, 193, + 14, 163, 154, 132, 119, 113, 131, 67, 56, 143, 160, 87, 128, 171, 93, 99, 186, 83, 108, 81, + 9, 16, 123, 235, 15, 121, 235, 81, 72, 244, 93, 188, 240, 39, 129, 222, 180, 79, 62, 23, + 193, 216, 18, 171, 137, 6, 218, 6, 87, 63, 202, 140, 187, 141, 26, 24, 240, 225, 33, 92, 13, + 161, 241, 184, 196, 225, 191, 168, 23, 38, 208, 247, 12, 83, 143, 144, 8, 31, 80, 118, 154, + 247, 176, 23, 26, 145, 11, 80, 71, 37, 79, 78, 79, 179, 95, 129, 213, 74, 253, 142, 137, 6, + 142, 113, 221, 247, 145, 30, 10, 22, 169, 200, 209, 112, 46, 47, 109, 145, 197, 35, 41, 196, + 229, 172, 42, 212, 146, 215, 203, 2, 142, 216, 178, 128, 53, 100, 246, 145, 237, 184, 53, + 17, 118, 77, 82, 3, 94, 154, 29, 126, 9, 48, 102, 8, 152, 97, 241, 182, 57, 41, 137, 175, + 25, 119, 102, 64, 52, 6, 144, 242, 130, 67, 192, 250, 148, 75, 247, 216, 213, 219, 19, 12, + 223, 115, 174, 73, 73, 160, 177, 210, 167, 190, 164, 3, 147, 229, 247, 109, 108, 5, 123, 37, + 202, 176, 109, 121, 125, 203, 83, 110, 176, 164, 101, 75, 166, 147, 78, 107, 25, 148, 31, + 236, 160, 179, 68, 223, 253, 148, 191, 211, 95, 200, 73, 114, 227, 187, 159, 207, 178, 213, + 187, 205, 234, 191, 2, 12, 0, 107, 237, 2, 122, 13, 10, 101, 110, 100, 115, 116, 114, 101, + 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 51, 50, 32, 48, 32, 82, 47, 67, 114, 111, + 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, + 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, + 101, 110, 116, 32, 51, 51, 55, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, + 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, + 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, + 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 55, 32, 48, + 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, + 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, + 97, 114, 101, 110, 116, 115, 32, 49, 52, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, + 62, 13, 101, 110, 100, 111, 98, 106, 13, 51, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, + 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, + 101, 110, 103, 116, 104, 32, 50, 49, 57, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 72, 137, 172, 87, 91, 111, 212, 70, 20, 126, 223, 95, 225, 199, 117, 133, 141, 103, 60, 182, + 215, 18, 66, 130, 0, 133, 150, 168, 21, 236, 91, 84, 169, 33, 203, 38, 33, 155, 139, 76, 66, + 10, 191, 190, 115, 174, 51, 99, 239, 146, 64, 80, 213, 176, 158, 203, 153, 115, 253, 190, + 115, 158, 47, 103, 143, 255, 62, 28, 174, 179, 39, 79, 30, 239, 239, 189, 121, 145, 85, 217, + 211, 167, 207, 95, 236, 101, 179, 42, 131, 255, 134, 227, 217, 227, 229, 178, 202, 140, 205, + 150, 235, 89, 85, 246, 125, 191, 192, 13, 147, 217, 222, 149, 125, 155, 117, 214, 150, 46, + 91, 158, 207, 14, 230, 38, 111, 231, 54, 255, 103, 249, 7, 220, 49, 153, 169, 203, 30, 175, + 25, 91, 90, 103, 253, 165, 229, 106, 54, 207, 242, 229, 167, 89, 97, 122, 91, 86, 245, 34, + 43, 76, 91, 214, 54, 108, 208, 69, 186, 181, 104, 253, 145, 46, 43, 218, 166, 42, 91, 55, + 62, 35, 194, 11, 61, 55, 21, 165, 122, 103, 109, 99, 202, 54, 91, 190, 240, 90, 190, 207, + 139, 110, 126, 147, 23, 245, 252, 74, 255, 92, 230, 133, 157, 15, 121, 209, 204, 175, 189, + 13, 89, 78, 255, 226, 42, 124, 224, 21, 88, 57, 204, 139, 22, 127, 124, 204, 105, 231, 119, + 189, 253, 5, 206, 192, 50, 138, 185, 128, 245, 115, 89, 194, 47, 184, 246, 57, 47, 12, 222, + 91, 231, 133, 139, 94, 133, 165, 189, 124, 65, 242, 81, 163, 83, 214, 1, 87, 54, 57, 29, + 121, 227, 23, 80, 150, 62, 134, 2, 175, 253, 159, 233, 107, 214, 249, 59, 16, 140, 42, 43, + 108, 95, 54, 150, 204, 119, 94, 70, 231, 255, 47, 37, 80, 86, 252, 221, 148, 117, 91, 199, + 81, 138, 130, 97, 33, 4, 142, 54, 15, 188, 30, 197, 194, 31, 41, 76, 227, 230, 39, 185, 3, + 37, 13, 232, 180, 240, 239, 163, 203, 112, 103, 229, 119, 240, 251, 200, 43, 117, 234, 173, + 211, 5, 248, 193, 135, 174, 193, 252, 75, 116, 58, 126, 195, 217, 75, 180, 231, 34, 231, 93, + 184, 10, 31, 55, 114, 61, 190, 122, 18, 47, 118, 110, 222, 120, 81, 85, 110, 22, 243, 194, + 255, 248, 74, 46, 241, 187, 168, 225, 144, 47, 228, 152, 200, 68, 25, 31, 41, 14, 172, 189, + 119, 105, 79, 235, 252, 206, 218, 159, 211, 221, 88, 129, 141, 95, 188, 164, 24, 89, 131, + 226, 118, 24, 21, 68, 30, 114, 188, 26, 17, 4, 65, 40, 106, 159, 193, 21, 100, 112, 87, 118, + 45, 185, 248, 24, 174, 128, 136, 224, 214, 129, 117, 62, 7, 25, 184, 162, 22, 224, 3, 254, + 177, 154, 180, 133, 123, 108, 108, 67, 95, 23, 145, 155, 106, 20, 225, 53, 150, 99, 209, + 198, 196, 99, 133, 49, 188, 21, 27, 85, 179, 77, 87, 24, 22, 111, 99, 244, 156, 184, 54, 40, + 30, 204, 103, 213, 77, 23, 84, 39, 105, 116, 9, 4, 141, 191, 197, 251, 168, 79, 144, 4, 75, + 144, 16, 144, 47, 184, 16, 212, 136, 204, 193, 75, 240, 212, 42, 146, 205, 134, 64, 142, + 105, 129, 120, 207, 75, 129, 136, 254, 32, 57, 245, 50, 236, 160, 85, 240, 227, 91, 20, 68, + 95, 95, 227, 116, 36, 15, 243, 22, 197, 4, 30, 100, 55, 193, 226, 17, 100, 34, 58, 20, 189, + 2, 174, 220, 136, 246, 91, 66, 172, 25, 236, 67, 100, 59, 17, 114, 165, 146, 225, 46, 232, + 5, 106, 99, 20, 249, 4, 222, 99, 47, 89, 178, 65, 18, 2, 189, 249, 40, 104, 116, 43, 70, + 170, 41, 65, 70, 48, 6, 111, 193, 41, 76, 81, 144, 3, 31, 107, 116, 176, 40, 160, 126, 71, + 73, 155, 72, 107, 240, 247, 242, 55, 239, 102, 181, 78, 1, 36, 113, 186, 64, 4, 165, 239, + 77, 44, 10, 15, 179, 137, 18, 200, 117, 46, 104, 231, 65, 171, 206, 140, 41, 43, 7, 184, + 213, 183, 165, 235, 123, 6, 181, 127, 71, 160, 118, 224, 175, 180, 200, 90, 37, 68, 181, + 230, 148, 136, 94, 57, 139, 28, 97, 72, 187, 1, 29, 40, 177, 68, 93, 75, 130, 67, 204, 175, + 46, 168, 33, 236, 83, 176, 18, 130, 194, 80, 222, 47, 243, 142, 112, 250, 4, 254, 32, 200, + 227, 231, 17, 200, 3, 236, 199, 175, 99, 88, 103, 35, 237, 78, 186, 66, 46, 187, 136, 73, 3, + 254, 85, 118, 216, 65, 55, 40, 104, 160, 136, 55, 68, 40, 19, 118, 83, 69, 198, 124, 211, + 110, 225, 54, 186, 0, 110, 194, 165, 132, 175, 240, 253, 129, 211, 184, 13, 82, 6, 174, 92, + 54, 92, 173, 25, 168, 184, 156, 157, 199, 20, 214, 181, 129, 194, 22, 15, 164, 176, 165, + 191, 159, 112, 71, 227, 2, 72, 222, 70, 89, 219, 201, 238, 8, 202, 48, 63, 62, 112, 209, 66, + 222, 227, 150, 138, 140, 40, 14, 217, 18, 100, 223, 31, 202, 92, 2, 100, 32, 228, 21, 220, + 17, 104, 226, 114, 129, 138, 211, 130, 225, 115, 239, 21, 57, 36, 89, 63, 146, 103, 99, 8, + 57, 21, 37, 98, 154, 211, 234, 223, 32, 232, 111, 114, 165, 248, 160, 175, 214, 62, 107, + 111, 164, 234, 98, 10, 147, 28, 199, 107, 27, 20, 72, 16, 83, 79, 152, 240, 76, 65, 244, + 132, 105, 139, 30, 215, 78, 97, 144, 183, 248, 62, 193, 76, 196, 111, 118, 39, 155, 217, + 134, 224, 145, 56, 76, 177, 123, 194, 192, 40, 226, 30, 164, 21, 131, 177, 222, 2, 209, 76, + 252, 246, 65, 180, 101, 91, 122, 226, 81, 222, 139, 242, 129, 136, 128, 40, 54, 124, 115, + 165, 64, 11, 123, 199, 228, 155, 41, 139, 233, 219, 167, 28, 128, 91, 117, 58, 38, 53, 99, + 63, 62, 102, 140, 120, 137, 187, 25, 10, 192, 248, 72, 96, 216, 15, 105, 14, 242, 254, 207, + 24, 31, 18, 221, 138, 152, 136, 179, 169, 132, 106, 161, 185, 150, 140, 208, 196, 120, 228, + 55, 43, 185, 118, 43, 80, 45, 28, 36, 176, 109, 132, 191, 146, 146, 50, 32, 52, 233, 24, 86, + 252, 198, 57, 121, 77, 34, 123, 15, 42, 211, 108, 189, 146, 31, 162, 254, 56, 107, 154, 168, + 183, 37, 16, 22, 183, 18, 146, 72, 166, 30, 229, 150, 41, 39, 109, 75, 133, 11, 7, 62, 19, + 118, 136, 131, 38, 220, 147, 2, 231, 107, 56, 137, 8, 60, 112, 98, 67, 3, 98, 186, 192, 30, + 223, 224, 7, 192, 250, 74, 48, 124, 31, 142, 167, 168, 173, 83, 14, 236, 191, 205, 137, 176, + 116, 87, 249, 10, 65, 255, 87, 208, 0, 166, 216, 246, 73, 166, 255, 197, 52, 224, 115, 237, + 117, 30, 141, 11, 152, 12, 33, 102, 105, 227, 199, 9, 234, 239, 236, 107, 113, 133, 108, + 215, 52, 165, 35, 111, 35, 216, 212, 182, 23, 226, 185, 86, 41, 17, 81, 72, 102, 254, 40, + 85, 216, 74, 112, 92, 48, 124, 35, 45, 188, 71, 148, 15, 169, 165, 122, 81, 155, 218, 192, + 126, 35, 3, 225, 166, 144, 97, 93, 133, 162, 216, 141, 254, 40, 224, 63, 184, 162, 85, 49, + 72, 107, 233, 133, 56, 157, 245, 184, 226, 206, 5, 172, 174, 169, 175, 17, 29, 68, 95, 215, + 76, 102, 27, 215, 69, 54, 76, 133, 113, 241, 121, 13, 86, 185, 27, 35, 38, 202, 155, 76, + 144, 164, 149, 192, 45, 193, 70, 74, 124, 235, 8, 97, 2, 149, 196, 93, 53, 139, 9, 67, 225, + 42, 44, 134, 46, 57, 129, 22, 122, 242, 78, 76, 79, 96, 53, 152, 120, 43, 131, 25, 236, 157, + 73, 93, 162, 198, 55, 172, 109, 220, 177, 128, 6, 155, 144, 50, 205, 132, 83, 185, 154, 156, + 84, 147, 113, 165, 149, 114, 58, 152, 63, 227, 199, 123, 32, 173, 32, 28, 4, 253, 121, 168, + 88, 177, 17, 41, 82, 118, 141, 41, 235, 78, 100, 120, 176, 178, 209, 75, 218, 40, 155, 182, + 41, 219, 186, 86, 204, 130, 179, 239, 200, 209, 212, 212, 110, 252, 255, 183, 228, 185, 22, + 242, 17, 48, 196, 110, 5, 135, 198, 155, 83, 61, 16, 28, 158, 81, 251, 140, 100, 124, 148, + 215, 228, 192, 171, 137, 75, 165, 189, 105, 238, 152, 85, 244, 196, 174, 97, 197, 84, 182, + 108, 42, 243, 157, 105, 5, 69, 88, 25, 88, 28, 219, 200, 235, 91, 167, 22, 219, 236, 28, 91, + 120, 87, 231, 47, 237, 179, 98, 164, 80, 6, 75, 58, 42, 202, 118, 133, 13, 165, 186, 85, 56, + 56, 157, 121, 183, 20, 28, 130, 135, 169, 23, 222, 236, 69, 130, 30, 239, 164, 188, 190, + 215, 190, 240, 220, 5, 52, 41, 56, 174, 32, 75, 203, 39, 90, 111, 199, 73, 119, 158, 224, + 176, 113, 17, 10, 198, 168, 125, 215, 240, 89, 152, 201, 131, 84, 245, 31, 242, 209, 77, 2, + 209, 158, 98, 101, 92, 0, 13, 173, 98, 27, 75, 153, 224, 210, 125, 52, 65, 81, 218, 188, 69, + 48, 47, 184, 66, 95, 22, 147, 6, 226, 2, 131, 111, 157, 251, 66, 44, 182, 96, 13, 108, 58, + 73, 52, 120, 192, 78, 235, 53, 109, 46, 222, 34, 0, 251, 87, 143, 165, 90, 149, 223, 225, + 227, 136, 252, 190, 187, 90, 205, 3, 171, 245, 175, 220, 132, 9, 142, 39, 151, 19, 236, 175, + 28, 195, 240, 164, 221, 227, 83, 84, 31, 210, 123, 105, 108, 24, 226, 109, 50, 11, 41, 13, + 43, 120, 99, 220, 174, 146, 108, 143, 199, 42, 241, 254, 207, 115, 186, 105, 66, 175, 42, + 77, 250, 167, 100, 204, 195, 107, 73, 187, 62, 37, 75, 211, 69, 8, 145, 230, 127, 51, 105, + 186, 119, 145, 186, 176, 159, 142, 101, 81, 13, 41, 129, 111, 98, 221, 3, 203, 211, 104, + 160, 17, 82, 189, 117, 50, 83, 231, 71, 73, 61, 54, 66, 60, 33, 107, 83, 203, 195, 131, 12, + 206, 224, 178, 176, 57, 234, 207, 240, 207, 6, 103, 137, 62, 122, 50, 109, 87, 66, 51, 197, + 253, 159, 77, 134, 144, 168, 246, 211, 193, 37, 6, 65, 80, 40, 172, 31, 19, 127, 70, 35, + 154, 102, 82, 164, 102, 234, 39, 49, 249, 243, 174, 246, 64, 129, 60, 0, 153, 23, 214, 239, + 0, 243, 222, 165, 208, 173, 83, 10, 117, 57, 130, 155, 90, 43, 2, 4, 189, 75, 155, 102, 9, + 86, 239, 166, 157, 231, 98, 172, 0, 125, 6, 234, 60, 211, 64, 4, 173, 32, 253, 175, 194, + 236, 22, 181, 85, 125, 60, 179, 157, 38, 132, 54, 201, 157, 160, 206, 34, 192, 169, 152, 45, + 179, 93, 112, 84, 72, 139, 184, 117, 12, 232, 221, 11, 115, 235, 228, 151, 82, 55, 69, 130, + 160, 80, 153, 187, 102, 156, 154, 0, 87, 239, 65, 205, 10, 110, 117, 94, 46, 224, 31, 36, + 18, 1, 115, 165, 188, 222, 112, 107, 184, 133, 189, 67, 222, 73, 250, 132, 198, 245, 70, + 225, 110, 75, 79, 57, 234, 57, 226, 238, 238, 7, 53, 55, 168, 57, 104, 69, 186, 183, 145, + 254, 99, 221, 91, 213, 92, 154, 78, 23, 193, 217, 57, 117, 90, 205, 40, 190, 95, 176, 79, + 12, 109, 182, 182, 172, 24, 46, 97, 196, 129, 177, 58, 4, 178, 204, 183, 118, 151, 181, 45, + 251, 69, 171, 196, 35, 125, 6, 140, 179, 202, 89, 151, 60, 52, 212, 210, 199, 82, 107, 187, + 71, 1, 224, 45, 252, 3, 215, 116, 92, 133, 171, 95, 32, 245, 224, 7, 44, 124, 69, 219, 119, + 113, 157, 125, 32, 215, 189, 18, 216, 88, 75, 142, 42, 102, 10, 152, 175, 24, 136, 18, 74, + 11, 147, 108, 220, 185, 234, 29, 170, 12, 240, 231, 22, 62, 27, 243, 139, 34, 128, 0, 227, + 93, 200, 220, 184, 168, 139, 11, 241, 28, 70, 74, 232, 34, 65, 102, 202, 123, 161, 58, 21, + 44, 167, 236, 149, 58, 1, 139, 60, 26, 181, 32, 224, 26, 154, 109, 36, 167, 44, 121, 161, + 46, 20, 192, 224, 50, 106, 2, 128, 75, 18, 18, 187, 173, 2, 138, 55, 1, 127, 54, 10, 137, + 176, 28, 131, 161, 137, 152, 94, 57, 48, 160, 18, 153, 211, 76, 123, 105, 174, 250, 115, 25, + 72, 130, 131, 84, 74, 162, 174, 62, 114, 76, 115, 172, 156, 30, 101, 66, 195, 253, 142, 80, + 252, 131, 8, 156, 9, 163, 238, 147, 42, 96, 136, 196, 244, 126, 185, 191, 151, 205, 94, 46, + 103, 255, 11, 48, 0, 241, 191, 3, 24, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, + 13, 101, 110, 100, 111, 98, 106, 13, 51, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, + 111, 110, 116, 101, 110, 116, 115, 32, 51, 52, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, + 116, 32, 51, 51, 55, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, + 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, + 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, + 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 55, 32, 48, 32, 82, 62, + 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, + 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, + 101, 110, 116, 115, 32, 49, 53, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 51, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, + 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, + 103, 116, 104, 32, 50, 53, 57, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, + 164, 87, 109, 111, 28, 183, 17, 254, 174, 95, 177, 31, 143, 65, 119, 125, 228, 190, 221, 22, + 65, 128, 90, 114, 26, 7, 117, 19, 196, 23, 244, 67, 92, 160, 146, 206, 39, 169, 62, 201, + 234, 74, 178, 234, 252, 250, 114, 94, 57, 220, 93, 169, 14, 12, 195, 246, 45, 57, 28, 206, + 203, 51, 207, 12, 95, 110, 143, 94, 252, 124, 58, 222, 23, 223, 126, 251, 226, 205, 241, + 235, 147, 98, 93, 124, 247, 221, 203, 147, 227, 226, 104, 93, 192, 159, 241, 226, 232, 197, + 118, 187, 46, 124, 40, 182, 251, 163, 117, 53, 12, 195, 6, 55, 124, 17, 134, 166, 26, 186, + 162, 15, 161, 106, 138, 237, 245, 209, 111, 43, 239, 186, 85, 237, 254, 185, 253, 17, 206, + 248, 194, 215, 213, 128, 199, 124, 168, 66, 19, 226, 161, 237, 238, 104, 85, 184, 237, 191, + 143, 74, 63, 132, 106, 93, 111, 138, 210, 119, 85, 29, 210, 6, 29, 164, 83, 155, 46, 138, + 244, 69, 217, 181, 235, 170, 107, 166, 50, 162, 188, 84, 185, 185, 42, 181, 187, 232, 90, + 95, 117, 197, 246, 36, 90, 249, 214, 149, 253, 234, 193, 149, 245, 234, 206, 149, 126, 117, + 31, 141, 62, 117, 101, 183, 186, 114, 237, 234, 6, 150, 241, 235, 12, 126, 29, 226, 210, + 123, 23, 162, 190, 118, 117, 236, 54, 40, 2, 242, 87, 188, 30, 21, 4, 143, 187, 31, 227, + 175, 213, 222, 149, 13, 126, 109, 93, 201, 75, 215, 112, 25, 254, 26, 97, 109, 212, 141, 71, + 87, 131, 44, 4, 107, 93, 148, 97, 168, 218, 64, 230, 181, 24, 196, 110, 85, 73, 32, 131, + 196, 163, 173, 234, 174, 182, 81, 52, 193, 10, 16, 162, 134, 54, 209, 69, 112, 44, 222, 117, + 170, 191, 222, 195, 173, 209, 224, 33, 158, 45, 125, 223, 208, 214, 141, 107, 86, 59, 215, + 200, 218, 121, 116, 234, 42, 58, 138, 39, 224, 199, 236, 212, 163, 236, 28, 226, 183, 143, + 255, 110, 100, 231, 44, 170, 1, 241, 128, 11, 29, 159, 133, 11, 64, 107, 116, 218, 215, 49, + 236, 77, 140, 193, 134, 238, 190, 0, 181, 40, 100, 44, 184, 167, 8, 117, 248, 61, 52, 120, + 66, 140, 36, 237, 163, 216, 135, 74, 62, 168, 111, 172, 64, 174, 0, 115, 212, 69, 86, 118, + 27, 127, 30, 228, 250, 152, 107, 223, 226, 46, 184, 3, 255, 71, 131, 194, 192, 73, 41, 235, + 136, 170, 53, 0, 180, 175, 250, 142, 194, 58, 74, 64, 246, 81, 24, 108, 132, 133, 107, 208, + 37, 17, 170, 235, 121, 92, 117, 13, 194, 160, 129, 133, 227, 32, 100, 79, 90, 223, 245, 123, + 76, 246, 178, 244, 236, 118, 22, 135, 181, 7, 116, 106, 164, 172, 192, 226, 243, 25, 5, 9, + 241, 126, 122, 251, 187, 16, 188, 27, 72, 244, 65, 238, 78, 129, 151, 99, 248, 113, 198, + 129, 149, 68, 124, 217, 205, 112, 217, 30, 13, 214, 66, 136, 209, 150, 66, 80, 123, 208, 71, + 113, 120, 68, 216, 193, 23, 34, 49, 26, 25, 162, 145, 149, 43, 209, 227, 152, 255, 109, 220, + 186, 228, 164, 202, 101, 113, 25, 149, 160, 5, 121, 48, 105, 87, 179, 186, 231, 147, 231, 0, + 166, 100, 181, 198, 135, 196, 53, 28, 226, 111, 47, 206, 52, 252, 197, 40, 11, 25, 18, 250, + 38, 65, 8, 143, 231, 69, 1, 1, 75, 123, 127, 114, 98, 28, 26, 44, 248, 95, 253, 199, 209, + 253, 147, 202, 94, 86, 111, 1, 145, 171, 167, 136, 111, 191, 137, 129, 182, 120, 138, 106, + 54, 90, 68, 16, 233, 105, 25, 193, 174, 164, 126, 175, 186, 79, 181, 8, 20, 179, 15, 92, + 248, 184, 32, 46, 82, 5, 179, 107, 155, 254, 73, 136, 19, 110, 252, 122, 85, 70, 187, 40, + 74, 35, 242, 239, 52, 31, 150, 62, 54, 67, 162, 137, 213, 39, 64, 4, 254, 58, 112, 181, 65, + 241, 39, 20, 168, 6, 99, 140, 110, 92, 90, 167, 53, 110, 59, 3, 85, 12, 28, 138, 224, 69, + 90, 17, 148, 119, 10, 219, 149, 50, 164, 150, 193, 103, 104, 7, 208, 33, 12, 73, 144, 82, + 94, 18, 12, 38, 159, 119, 169, 198, 64, 50, 81, 239, 92, 169, 129, 160, 95, 36, 66, 185, + 106, 194, 129, 112, 5, 133, 161, 157, 131, 214, 55, 28, 61, 144, 188, 53, 80, 209, 196, 222, + 168, 97, 139, 165, 222, 78, 28, 74, 183, 28, 56, 96, 92, 189, 94, 80, 153, 117, 110, 232, + 141, 61, 183, 238, 55, 208, 153, 177, 61, 127, 208, 110, 125, 1, 159, 207, 52, 104, 234, + 207, 35, 129, 37, 208, 233, 29, 28, 252, 44, 7, 177, 109, 167, 30, 13, 75, 120, 17, 206, 8, + 120, 7, 168, 59, 7, 1, 248, 113, 171, 51, 2, 140, 7, 32, 253, 242, 35, 1, 39, 174, 239, 104, + 174, 240, 225, 201, 222, 222, 124, 101, 111, 23, 126, 27, 17, 214, 194, 31, 216, 75, 47, 41, + 99, 129, 59, 93, 162, 202, 91, 169, 138, 113, 130, 25, 148, 77, 156, 254, 95, 179, 122, 33, + 12, 146, 42, 105, 180, 148, 159, 149, 6, 16, 186, 111, 166, 13, 82, 50, 158, 181, 72, 208, + 61, 67, 63, 174, 74, 133, 83, 43, 222, 196, 218, 7, 240, 237, 157, 41, 76, 234, 41, 224, + 214, 141, 56, 205, 135, 115, 74, 38, 156, 165, 62, 222, 107, 103, 129, 16, 130, 22, 45, 113, + 16, 77, 147, 136, 233, 9, 210, 161, 19, 229, 47, 141, 21, 195, 215, 210, 161, 33, 250, 212, + 116, 150, 123, 230, 147, 227, 151, 153, 190, 248, 83, 108, 34, 149, 57, 227, 193, 30, 38, + 21, 126, 252, 62, 101, 209, 201, 12, 198, 186, 48, 133, 57, 168, 18, 46, 204, 169, 75, 49, + 227, 74, 123, 245, 82, 111, 135, 72, 104, 0, 118, 220, 115, 239, 165, 250, 30, 121, 74, 102, + 248, 168, 226, 148, 249, 20, 150, 9, 201, 116, 74, 49, 104, 241, 67, 54, 227, 165, 248, 222, + 74, 22, 15, 108, 98, 139, 1, 164, 59, 133, 252, 80, 53, 115, 83, 203, 127, 159, 165, 167, + 95, 161, 124, 144, 67, 206, 148, 35, 144, 21, 224, 236, 107, 199, 31, 72, 55, 163, 243, 13, + 9, 232, 35, 100, 36, 100, 68, 9, 164, 154, 123, 199, 12, 164, 212, 5, 90, 78, 162, 244, 26, + 191, 62, 193, 101, 240, 227, 32, 207, 15, 36, 166, 107, 89, 198, 187, 238, 29, 81, 220, 247, + 28, 140, 218, 176, 84, 97, 94, 106, 204, 51, 117, 124, 64, 249, 9, 11, 137, 171, 165, 108, + 11, 161, 237, 152, 208, 218, 175, 36, 180, 191, 65, 66, 178, 49, 190, 158, 130, 137, 214, + 126, 137, 94, 189, 118, 49, 93, 39, 176, 137, 46, 113, 237, 212, 121, 77, 198, 207, 95, 157, + 95, 44, 215, 208, 69, 21, 165, 212, 107, 243, 199, 171, 149, 212, 159, 168, 185, 95, 60, + 103, 208, 65, 78, 68, 99, 59, 44, 204, 218, 171, 120, 25, 216, 140, 198, 37, 255, 222, 57, + 39, 87, 154, 202, 223, 112, 221, 63, 197, 111, 150, 11, 188, 183, 213, 146, 168, 94, 38, + 118, 29, 147, 53, 216, 210, 247, 189, 201, 194, 200, 190, 77, 91, 141, 247, 11, 195, 176, + 247, 217, 52, 12, 159, 183, 46, 209, 59, 21, 233, 210, 4, 131, 162, 73, 149, 38, 192, 12, + 167, 32, 161, 15, 13, 137, 161, 121, 191, 13, 153, 154, 203, 233, 184, 178, 207, 235, 222, + 12, 31, 120, 104, 233, 237, 0, 235, 11, 177, 199, 117, 251, 228, 157, 147, 28, 130, 64, 193, + 183, 252, 228, 173, 73, 137, 4, 224, 9, 228, 255, 93, 198, 195, 217, 243, 145, 157, 217, + 176, 224, 15, 49, 100, 146, 39, 29, 164, 109, 104, 162, 204, 75, 87, 39, 171, 62, 152, 17, + 120, 233, 237, 170, 190, 75, 184, 248, 174, 54, 239, 56, 245, 20, 6, 79, 186, 119, 203, 207, + 23, 139, 191, 115, 5, 249, 36, 72, 169, 229, 231, 157, 48, 197, 90, 168, 215, 182, 172, 224, + 155, 188, 193, 204, 159, 74, 1, 113, 43, 237, 122, 54, 33, 227, 62, 133, 14, 22, 190, 156, + 40, 68, 163, 189, 39, 117, 45, 94, 216, 98, 151, 81, 159, 164, 75, 226, 94, 72, 46, 204, 38, + 241, 80, 19, 66, 73, 161, 153, 115, 80, 188, 70, 173, 198, 253, 39, 230, 8, 197, 251, 208, + 175, 222, 106, 96, 38, 33, 210, 97, 109, 14, 126, 99, 236, 243, 240, 207, 50, 40, 160, 212, + 48, 206, 42, 33, 208, 8, 17, 82, 26, 7, 83, 234, 249, 16, 58, 209, 192, 167, 199, 204, 79, + 123, 163, 206, 169, 234, 87, 111, 199, 53, 16, 189, 198, 104, 39, 59, 242, 26, 132, 69, 188, + 143, 146, 165, 101, 130, 130, 86, 169, 225, 189, 101, 69, 209, 41, 143, 77, 83, 155, 111, + 95, 13, 216, 21, 99, 111, 173, 252, 166, 41, 90, 229, 113, 8, 199, 38, 30, 159, 244, 233, + 174, 26, 186, 216, 134, 147, 28, 95, 246, 61, 186, 32, 21, 63, 27, 210, 37, 75, 101, 29, 54, + 149, 111, 186, 172, 101, 28, 67, 133, 114, 28, 60, 253, 163, 36, 168, 68, 34, 164, 51, 225, + 139, 187, 196, 45, 143, 138, 32, 195, 21, 11, 114, 40, 130, 175, 13, 189, 69, 161, 154, 49, + 57, 115, 138, 76, 236, 120, 46, 53, 87, 220, 75, 214, 88, 18, 144, 75, 119, 174, 209, 174, + 108, 250, 240, 169, 204, 179, 210, 153, 68, 38, 117, 166, 57, 107, 204, 88, 110, 84, 7, 159, + 125, 82, 196, 137, 141, 66, 191, 253, 38, 134, 250, 49, 141, 179, 155, 4, 112, 112, 182, + 151, 167, 17, 13, 170, 57, 106, 23, 233, 28, 143, 204, 64, 134, 171, 11, 211, 132, 150, 62, + 236, 255, 195, 13, 10, 11, 90, 73, 73, 209, 247, 162, 82, 91, 118, 23, 135, 24, 23, 82, 147, + 203, 70, 184, 205, 106, 137, 165, 81, 14, 75, 249, 84, 16, 118, 144, 72, 75, 67, 96, 13, + 140, 249, 186, 240, 190, 90, 55, 0, 251, 166, 173, 186, 245, 192, 35, 229, 191, 38, 35, 229, + 111, 140, 22, 168, 173, 53, 50, 33, 192, 98, 173, 95, 107, 30, 132, 41, 178, 146, 112, 75, + 213, 60, 165, 152, 188, 182, 134, 130, 111, 184, 109, 161, 187, 133, 62, 76, 211, 44, 3, + 226, 247, 54, 179, 250, 48, 185, 69, 158, 17, 42, 162, 47, 122, 104, 36, 32, 85, 174, 246, + 171, 217, 235, 162, 100, 151, 237, 196, 253, 236, 27, 227, 173, 243, 193, 44, 93, 161, 77, + 29, 173, 220, 99, 231, 224, 167, 194, 141, 51, 156, 205, 218, 79, 120, 158, 239, 190, 114, + 158, 255, 139, 140, 36, 50, 40, 13, 255, 255, 101, 235, 135, 249, 236, 225, 45, 220, 176, + 104, 110, 164, 248, 120, 119, 54, 154, 112, 111, 130, 189, 108, 6, 22, 112, 43, 47, 158, 97, + 22, 20, 110, 230, 198, 61, 231, 167, 179, 189, 149, 80, 37, 88, 98, 73, 65, 139, 210, 0, 57, + 26, 230, 115, 191, 31, 236, 139, 32, 163, 10, 26, 48, 100, 8, 202, 158, 164, 79, 77, 247, + 59, 103, 39, 250, 3, 15, 33, 59, 97, 133, 217, 196, 87, 103, 93, 9, 62, 19, 238, 148, 21, + 237, 24, 38, 76, 154, 15, 137, 119, 70, 223, 108, 76, 204, 148, 166, 38, 48, 154, 57, 186, + 158, 18, 180, 124, 115, 67, 231, 66, 83, 154, 155, 141, 186, 124, 102, 214, 182, 189, 236, + 216, 121, 27, 100, 104, 250, 135, 140, 89, 150, 157, 216, 49, 39, 169, 164, 70, 50, 37, 33, + 125, 31, 41, 181, 196, 39, 130, 96, 196, 42, 110, 61, 155, 0, 27, 154, 36, 225, 92, 216, + 125, 229, 122, 212, 195, 217, 15, 121, 127, 150, 96, 182, 134, 91, 96, 79, 91, 14, 239, 153, + 121, 76, 144, 207, 59, 22, 243, 173, 207, 123, 27, 178, 46, 156, 82, 203, 102, 215, 65, 164, + 198, 164, 77, 27, 175, 86, 235, 141, 69, 203, 222, 32, 23, 138, 251, 15, 191, 128, 82, 69, + 152, 90, 105, 13, 86, 91, 52, 17, 44, 226, 247, 67, 107, 179, 187, 99, 153, 132, 54, 85, + 241, 168, 232, 77, 147, 5, 39, 35, 44, 208, 108, 78, 129, 63, 67, 160, 70, 242, 146, 217, + 146, 191, 122, 228, 208, 207, 64, 166, 112, 75, 19, 63, 254, 236, 74, 178, 2, 105, 25, 73, + 247, 224, 224, 50, 166, 225, 59, 48, 226, 82, 184, 24, 247, 47, 228, 252, 61, 33, 169, 70, + 105, 88, 192, 155, 63, 146, 39, 29, 174, 226, 1, 33, 110, 84, 120, 32, 188, 235, 48, 1, 132, + 221, 127, 49, 97, 55, 139, 132, 253, 46, 132, 26, 110, 253, 43, 141, 205, 56, 8, 122, 192, + 71, 217, 113, 171, 75, 59, 159, 156, 150, 54, 154, 7, 205, 37, 194, 6, 127, 157, 67, 48, 76, + 59, 165, 46, 184, 225, 47, 110, 142, 101, 103, 69, 210, 204, 240, 217, 117, 86, 240, 35, + 191, 24, 233, 29, 36, 91, 124, 33, 118, 51, 101, 7, 10, 124, 7, 110, 4, 55, 152, 27, 111, + 97, 117, 196, 199, 71, 148, 185, 144, 47, 230, 78, 178, 77, 71, 162, 102, 245, 19, 8, 60, + 136, 20, 173, 225, 161, 39, 28, 191, 54, 207, 84, 15, 105, 242, 205, 2, 107, 3, 171, 64, + 144, 77, 48, 232, 129, 86, 54, 164, 24, 213, 92, 103, 172, 151, 0, 43, 57, 8, 211, 184, 4, + 227, 95, 72, 22, 82, 129, 151, 157, 60, 94, 59, 129, 155, 188, 40, 115, 109, 163, 75, 227, + 66, 135, 230, 221, 106, 132, 199, 212, 201, 208, 59, 106, 101, 170, 6, 79, 236, 50, 229, 81, + 12, 221, 74, 190, 61, 144, 164, 156, 199, 131, 103, 4, 227, 196, 155, 170, 114, 7, 130, 215, + 169, 135, 177, 27, 119, 18, 22, 181, 118, 154, 124, 236, 201, 115, 246, 121, 84, 196, 49, + 75, 53, 244, 5, 169, 149, 183, 202, 71, 26, 167, 130, 244, 184, 141, 236, 50, 37, 246, 10, + 6, 108, 27, 190, 153, 64, 184, 110, 200, 161, 216, 26, 250, 105, 242, 224, 36, 131, 196, 51, + 70, 117, 34, 168, 27, 83, 56, 187, 169, 85, 250, 130, 218, 187, 102, 146, 13, 22, 67, 211, + 184, 165, 251, 229, 234, 170, 53, 19, 62, 8, 202, 226, 75, 36, 21, 140, 21, 202, 58, 238, + 239, 106, 3, 202, 193, 36, 29, 139, 171, 153, 190, 67, 235, 102, 83, 181, 173, 176, 8, 107, + 67, 198, 213, 233, 126, 231, 66, 42, 10, 18, 183, 163, 204, 15, 88, 156, 212, 222, 177, 124, + 203, 104, 224, 228, 33, 128, 188, 88, 155, 119, 89, 234, 27, 176, 249, 134, 27, 84, 26, 164, + 38, 156, 63, 82, 149, 75, 175, 127, 245, 230, 184, 56, 122, 181, 61, 250, 159, 0, 3, 0, 127, + 31, 244, 91, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, + 106, 13, 51, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, + 115, 32, 51, 54, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 55, 32, 48, 32, + 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, + 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, + 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 55, 32, 48, + 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, + 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, + 97, 114, 101, 110, 116, 115, 32, 49, 54, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, + 62, 13, 101, 110, 100, 111, 98, 106, 13, 51, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, + 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, + 101, 110, 103, 116, 104, 32, 50, 53, 56, 48, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 72, 137, 172, 87, 109, 111, 28, 55, 14, 254, 238, 95, 49, 31, 103, 14, 153, 201, 74, 243, + 14, 20, 5, 26, 59, 23, 164, 190, 180, 1, 186, 61, 32, 72, 238, 131, 157, 141, 237, 92, 118, + 109, 223, 58, 62, 215, 247, 235, 79, 124, 21, 165, 89, 7, 45, 90, 4, 49, 118, 36, 146, 162, + 40, 242, 225, 195, 23, 235, 163, 231, 111, 207, 246, 95, 139, 239, 190, 123, 254, 230, 248, + 245, 73, 177, 42, 190, 255, 254, 197, 201, 113, 113, 180, 42, 224, 223, 254, 242, 232, 249, + 122, 189, 42, 156, 47, 214, 23, 71, 171, 102, 158, 231, 9, 55, 92, 225, 231, 174, 153, 135, + 98, 244, 190, 233, 138, 245, 238, 232, 125, 233, 170, 161, 236, 170, 127, 173, 127, 4, 29, + 87, 184, 182, 153, 81, 205, 249, 198, 119, 62, 40, 173, 55, 71, 101, 81, 173, 255, 125, 84, + 187, 217, 55, 171, 118, 42, 106, 55, 52, 173, 143, 27, 164, 72, 90, 211, 16, 68, 198, 162, + 30, 250, 85, 51, 116, 185, 140, 24, 175, 85, 110, 105, 74, 253, 46, 134, 222, 53, 67, 177, + 62, 9, 94, 190, 169, 234, 161, 252, 92, 245, 229, 93, 85, 59, 250, 3, 95, 55, 85, 237, 203, + 235, 170, 110, 131, 118, 95, 158, 134, 171, 156, 129, 224, 190, 170, 251, 114, 87, 213, 35, + 125, 62, 194, 31, 20, 189, 36, 51, 126, 10, 242, 112, 229, 85, 81, 251, 185, 233, 61, 29, + 210, 7, 253, 41, 252, 111, 36, 28, 94, 110, 213, 55, 237, 208, 218, 88, 152, 43, 123, 184, + 104, 71, 155, 239, 203, 95, 43, 23, 28, 234, 202, 77, 248, 255, 9, 142, 220, 87, 112, 88, + 237, 92, 7, 151, 232, 195, 233, 19, 248, 63, 211, 31, 248, 186, 9, 71, 134, 59, 184, 94, + 228, 78, 207, 224, 126, 160, 184, 131, 31, 248, 245, 8, 183, 1, 201, 75, 81, 123, 86, 205, + 162, 112, 12, 155, 159, 40, 22, 93, 249, 21, 142, 1, 109, 88, 241, 86, 238, 23, 176, 132, + 219, 103, 250, 11, 213, 208, 23, 22, 194, 45, 185, 2, 175, 201, 173, 162, 187, 180, 213, + 118, 229, 58, 124, 242, 69, 131, 40, 158, 11, 82, 104, 251, 6, 68, 116, 233, 240, 73, 209, + 81, 122, 146, 186, 13, 153, 177, 130, 204, 24, 155, 113, 160, 160, 198, 48, 124, 145, 16, + 130, 7, 151, 108, 203, 247, 75, 175, 97, 237, 179, 68, 240, 22, 163, 187, 21, 31, 112, 45, + 13, 215, 33, 147, 31, 43, 79, 102, 111, 43, 182, 255, 49, 252, 25, 227, 245, 30, 131, 64, + 29, 174, 127, 30, 246, 239, 241, 8, 216, 130, 99, 54, 250, 149, 27, 5, 91, 32, 17, 236, 121, + 114, 248, 14, 28, 225, 221, 139, 240, 13, 241, 229, 164, 241, 189, 61, 243, 191, 85, 61, + 241, 9, 16, 105, 86, 193, 128, 106, 166, 161, 140, 198, 2, 189, 68, 129, 6, 214, 89, 3, 94, + 236, 74, 210, 83, 235, 32, 132, 91, 234, 0, 253, 5, 55, 208, 154, 218, 6, 139, 7, 66, 23, + 172, 6, 163, 87, 18, 35, 121, 96, 121, 147, 173, 228, 59, 24, 164, 117, 190, 191, 11, 65, + 235, 56, 243, 33, 214, 234, 19, 63, 97, 124, 85, 174, 13, 126, 82, 61, 249, 19, 151, 244, + 140, 238, 101, 41, 29, 141, 196, 250, 218, 98, 38, 66, 240, 174, 227, 253, 65, 68, 75, 230, + 140, 144, 101, 98, 133, 252, 5, 211, 7, 228, 227, 46, 80, 84, 158, 13, 35, 244, 44, 252, 89, + 113, 108, 3, 84, 180, 12, 21, 109, 55, 54, 83, 43, 80, 1, 198, 95, 129, 225, 159, 1, 149, + 214, 88, 43, 82, 3, 36, 40, 143, 2, 210, 167, 140, 108, 152, 190, 179, 0, 27, 226, 218, 40, + 184, 22, 81, 28, 143, 235, 125, 51, 57, 39, 199, 49, 14, 180, 115, 39, 197, 57, 200, 55, + 220, 105, 207, 165, 173, 89, 182, 49, 33, 2, 33, 120, 34, 42, 232, 69, 213, 220, 107, 4, + 238, 171, 78, 51, 0, 148, 180, 230, 180, 214, 15, 7, 22, 100, 201, 56, 248, 114, 107, 202, + 0, 15, 162, 3, 4, 129, 244, 236, 4, 81, 192, 4, 213, 143, 128, 142, 241, 33, 130, 199, 85, + 230, 33, 156, 115, 193, 25, 134, 177, 231, 168, 217, 216, 255, 225, 130, 152, 59, 131, 52, + 146, 49, 96, 224, 81, 145, 58, 241, 61, 123, 147, 185, 195, 64, 222, 74, 128, 52, 51, 237, + 155, 136, 142, 150, 13, 68, 132, 175, 61, 243, 29, 21, 46, 9, 50, 180, 22, 73, 36, 199, 76, + 14, 32, 67, 157, 231, 82, 217, 90, 68, 207, 138, 140, 148, 110, 197, 3, 112, 223, 98, 173, + 155, 16, 31, 193, 86, 222, 157, 192, 50, 88, 37, 120, 179, 40, 52, 114, 203, 87, 232, 181, + 217, 105, 96, 24, 238, 205, 176, 70, 49, 143, 245, 22, 41, 68, 222, 222, 231, 63, 217, 222, + 255, 14, 231, 27, 132, 118, 110, 236, 226, 221, 20, 4, 225, 35, 70, 208, 38, 122, 84, 136, + 104, 41, 161, 196, 61, 202, 199, 78, 191, 55, 92, 11, 121, 197, 224, 38, 117, 158, 46, 114, + 9, 197, 181, 72, 49, 180, 255, 143, 156, 173, 226, 126, 114, 172, 166, 18, 251, 239, 193, + 131, 131, 77, 89, 138, 162, 229, 112, 130, 253, 21, 214, 220, 42, 124, 173, 40, 131, 157, + 52, 80, 56, 44, 235, 193, 159, 171, 41, 141, 82, 74, 12, 124, 107, 2, 25, 11, 78, 182, 206, + 229, 134, 28, 117, 225, 77, 176, 167, 183, 162, 254, 123, 143, 246, 33, 87, 108, 71, 64, + 201, 5, 201, 129, 197, 29, 246, 228, 69, 120, 96, 43, 15, 15, 157, 234, 14, 182, 207, 150, + 131, 210, 97, 56, 36, 48, 96, 169, 23, 64, 228, 182, 165, 13, 18, 54, 199, 5, 14, 251, 41, + 178, 69, 203, 188, 52, 84, 253, 147, 145, 234, 151, 129, 234, 100, 67, 65, 132, 98, 35, 244, + 140, 110, 47, 73, 196, 174, 73, 153, 254, 47, 233, 171, 194, 38, 192, 218, 162, 34, 144, + 198, 72, 248, 21, 193, 21, 165, 98, 233, 39, 217, 220, 231, 104, 102, 23, 193, 138, 166, + 249, 215, 42, 56, 93, 31, 0, 140, 243, 132, 130, 36, 79, 222, 118, 223, 194, 240, 101, 50, + 74, 205, 4, 189, 7, 11, 118, 223, 136, 120, 155, 145, 19, 186, 39, 28, 184, 209, 14, 169, + 246, 141, 95, 203, 91, 135, 197, 31, 153, 240, 50, 69, 228, 147, 255, 201, 48, 128, 247, 3, + 149, 7, 133, 100, 77, 137, 160, 252, 162, 106, 51, 204, 183, 71, 221, 48, 207, 192, 21, 212, + 77, 91, 216, 70, 43, 42, 236, 67, 10, 123, 67, 76, 210, 68, 127, 98, 236, 176, 89, 237, 3, + 205, 255, 65, 250, 201, 1, 58, 234, 34, 29, 213, 155, 241, 58, 92, 227, 158, 43, 244, 82, + 95, 84, 58, 44, 72, 216, 114, 17, 202, 16, 223, 222, 218, 66, 151, 248, 119, 74, 152, 23, + 52, 2, 68, 12, 6, 195, 103, 12, 80, 140, 181, 36, 247, 66, 215, 246, 113, 248, 38, 142, 155, + 51, 33, 125, 66, 171, 149, 145, 242, 245, 223, 66, 140, 229, 94, 177, 231, 38, 236, 43, 65, + 144, 180, 121, 116, 74, 200, 246, 60, 47, 244, 82, 246, 222, 112, 98, 5, 104, 164, 38, 252, + 48, 89, 31, 117, 161, 139, 78, 195, 96, 59, 100, 45, 107, 210, 97, 55, 152, 16, 4, 110, 193, + 114, 27, 124, 4, 76, 64, 175, 49, 66, 228, 193, 13, 120, 16, 240, 161, 195, 175, 151, 213, + 88, 254, 198, 45, 29, 75, 35, 148, 246, 182, 234, 241, 191, 26, 226, 61, 8, 139, 235, 73, + 247, 134, 145, 164, 71, 43, 63, 84, 88, 110, 190, 199, 51, 63, 87, 44, 4, 63, 62, 18, 49, + 234, 137, 47, 111, 137, 41, 132, 208, 188, 166, 251, 147, 151, 96, 123, 139, 203, 32, 0, + 210, 200, 167, 115, 7, 234, 33, 86, 65, 184, 180, 192, 206, 192, 93, 239, 47, 165, 21, 182, + 153, 233, 27, 51, 16, 251, 37, 125, 118, 7, 82, 8, 23, 149, 205, 115, 19, 17, 76, 186, 142, + 0, 148, 19, 96, 51, 175, 184, 214, 55, 94, 222, 253, 125, 249, 193, 251, 22, 108, 191, 97, + 216, 25, 136, 95, 218, 243, 176, 214, 95, 75, 123, 112, 130, 137, 245, 32, 223, 184, 135, + 11, 27, 154, 89, 38, 178, 196, 219, 248, 155, 183, 25, 166, 194, 234, 31, 57, 240, 129, 65, + 110, 196, 89, 233, 11, 195, 5, 236, 240, 112, 64, 27, 204, 107, 220, 48, 53, 126, 236, 18, + 98, 243, 148, 139, 225, 250, 29, 53, 135, 108, 206, 10, 81, 234, 86, 26, 37, 152, 43, 204, + 107, 232, 51, 234, 44, 213, 29, 36, 196, 249, 52, 35, 131, 12, 151, 115, 203, 239, 250, 27, + 92, 64, 245, 35, 196, 171, 57, 221, 163, 113, 245, 66, 71, 41, 194, 0, 48, 132, 49, 211, + 206, 76, 73, 113, 193, 8, 76, 156, 192, 64, 75, 84, 227, 184, 116, 6, 139, 182, 216, 102, + 40, 195, 34, 70, 231, 110, 72, 23, 141, 243, 132, 53, 123, 110, 82, 182, 181, 240, 28, 26, + 125, 135, 243, 3, 205, 66, 220, 150, 176, 207, 18, 171, 54, 67, 27, 62, 65, 159, 60, 163, 2, + 241, 45, 69, 176, 235, 187, 216, 124, 239, 217, 197, 56, 207, 88, 130, 69, 157, 151, 97, 21, + 244, 164, 222, 152, 128, 176, 56, 143, 166, 157, 141, 99, 194, 209, 164, 205, 129, 137, 127, + 196, 90, 222, 84, 221, 162, 130, 237, 41, 226, 96, 60, 13, 30, 11, 241, 153, 37, 101, 164, + 60, 83, 224, 214, 134, 118, 103, 12, 62, 196, 241, 111, 178, 215, 185, 21, 10, 163, 73, 160, + 115, 195, 222, 94, 58, 15, 115, 218, 254, 99, 31, 233, 146, 152, 126, 101, 136, 114, 93, + 138, 81, 25, 65, 210, 227, 136, 113, 40, 72, 209, 220, 52, 241, 29, 45, 89, 164, 103, 177, + 177, 112, 121, 19, 142, 65, 222, 99, 50, 123, 172, 65, 161, 115, 134, 251, 70, 242, 182, 53, + 12, 130, 132, 64, 141, 159, 21, 123, 74, 109, 1, 55, 248, 83, 99, 207, 224, 76, 138, 105, + 79, 202, 201, 216, 42, 181, 145, 167, 218, 34, 83, 140, 110, 156, 74, 150, 20, 87, 3, 164, + 61, 1, 127, 156, 91, 126, 1, 175, 55, 11, 57, 146, 131, 18, 137, 29, 179, 33, 16, 187, 19, + 90, 76, 161, 54, 217, 188, 156, 55, 64, 94, 2, 193, 159, 139, 166, 3, 139, 26, 255, 140, + 239, 240, 182, 109, 56, 81, 30, 227, 184, 55, 241, 186, 103, 151, 185, 202, 64, 94, 109, + 242, 131, 130, 178, 30, 174, 33, 97, 159, 64, 193, 200, 153, 216, 62, 149, 208, 74, 236, 98, + 225, 161, 86, 50, 19, 229, 177, 30, 59, 205, 88, 13, 92, 204, 71, 65, 128, 241, 48, 207, 29, + 15, 215, 232, 216, 101, 243, 33, 102, 171, 222, 32, 29, 200, 72, 94, 55, 233, 243, 19, 209, + 44, 194, 127, 101, 125, 234, 96, 50, 186, 244, 89, 23, 29, 141, 134, 82, 234, 199, 202, 121, + 19, 23, 206, 35, 55, 229, 199, 111, 212, 133, 107, 134, 132, 125, 101, 144, 82, 94, 48, 225, + 184, 255, 97, 201, 132, 232, 160, 10, 215, 185, 60, 39, 8, 237, 120, 52, 138, 147, 81, 142, + 1, 145, 246, 78, 177, 13, 113, 196, 123, 69, 53, 34, 160, 121, 254, 246, 156, 153, 250, 138, + 91, 4, 40, 28, 121, 177, 99, 101, 204, 120, 165, 252, 23, 18, 232, 39, 246, 13, 232, 250, + 136, 68, 242, 134, 250, 97, 32, 145, 134, 128, 246, 229, 73, 16, 92, 137, 228, 32, 12, 168, + 47, 95, 129, 228, 13, 227, 211, 136, 12, 116, 79, 240, 140, 22, 2, 29, 200, 25, 113, 95, + 190, 133, 103, 187, 33, 95, 251, 72, 122, 31, 115, 150, 226, 134, 182, 25, 93, 206, 71, 229, + 34, 181, 108, 11, 181, 221, 48, 181, 117, 127, 146, 218, 66, 218, 243, 56, 228, 70, 25, 135, + 32, 196, 79, 15, 68, 32, 23, 159, 233, 154, 25, 76, 172, 1, 3, 80, 53, 134, 68, 181, 242, + 52, 116, 243, 239, 107, 16, 172, 14, 181, 173, 173, 101, 92, 224, 0, 101, 242, 204, 156, 4, + 238, 64, 172, 68, 17, 252, 144, 7, 178, 166, 168, 173, 45, 104, 39, 216, 130, 203, 207, 48, + 37, 172, 134, 80, 155, 161, 89, 173, 198, 132, 218, 252, 84, 245, 79, 51, 23, 67, 218, 66, + 105, 156, 168, 247, 241, 30, 180, 243, 74, 106, 37, 130, 193, 222, 2, 93, 206, 226, 130, + 202, 91, 74, 207, 33, 233, 107, 166, 23, 47, 88, 222, 116, 128, 227, 57, 250, 140, 189, 233, + 94, 186, 232, 149, 52, 159, 116, 124, 197, 37, 1, 82, 119, 24, 72, 93, 2, 164, 226, 0, 109, + 40, 39, 101, 252, 78, 146, 207, 52, 94, 184, 76, 138, 23, 108, 125, 217, 41, 148, 91, 22, + 242, 18, 146, 165, 215, 146, 66, 250, 186, 17, 169, 55, 10, 88, 27, 241, 38, 62, 74, 67, + 222, 124, 19, 95, 126, 1, 195, 80, 225, 59, 248, 113, 11, 175, 33, 53, 159, 78, 188, 138, + 44, 41, 6, 21, 242, 133, 210, 240, 117, 138, 46, 11, 232, 60, 48, 42, 190, 195, 175, 123, + 88, 223, 211, 123, 244, 229, 113, 184, 10, 174, 220, 145, 223, 3, 169, 236, 18, 156, 2, 193, + 15, 37, 60, 21, 24, 126, 7, 58, 31, 42, 122, 185, 158, 252, 221, 243, 120, 230, 209, 81, 66, + 177, 59, 6, 0, 131, 175, 138, 37, 131, 111, 194, 20, 250, 20, 104, 201, 118, 14, 90, 254, + 47, 0, 45, 203, 106, 66, 73, 158, 190, 11, 107, 199, 156, 235, 163, 240, 43, 170, 60, 155, + 53, 237, 239, 104, 238, 231, 169, 105, 84, 0, 169, 157, 112, 71, 169, 175, 172, 25, 197, + 230, 170, 72, 34, 204, 213, 16, 75, 75, 186, 35, 150, 192, 207, 48, 193, 186, 42, 178, 44, + 60, 247, 11, 3, 218, 185, 164, 100, 132, 73, 176, 31, 84, 124, 37, 166, 150, 99, 80, 58, + 212, 144, 20, 241, 59, 33, 176, 135, 240, 139, 253, 144, 122, 145, 80, 120, 27, 139, 132, + 224, 192, 142, 76, 168, 120, 174, 196, 216, 143, 9, 230, 65, 220, 162, 199, 186, 121, 171, + 3, 164, 188, 24, 23, 60, 204, 186, 87, 212, 221, 39, 209, 200, 223, 62, 158, 45, 193, 77, + 224, 145, 1, 60, 206, 139, 122, 139, 148, 118, 81, 175, 218, 71, 25, 237, 75, 151, 66, 59, + 149, 207, 43, 188, 216, 129, 206, 143, 79, 1, 44, 223, 147, 93, 80, 14, 196, 59, 38, 217, + 224, 61, 94, 190, 57, 46, 142, 94, 174, 143, 254, 47, 192, 0, 98, 92, 203, 209, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 55, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 51, 56, 32, 48, + 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, + 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, + 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 56, 32, 48, 32, 82, 47, 82, 101, 115, 111, + 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, + 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, + 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, + 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, + 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 49, 55, 47, 84, 121, 112, 101, 47, 80, + 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 51, 56, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, + 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 51, 49, 57, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 72, 137, 180, 87, 109, 111, 27, 185, 17, 254, 174, 95, 177, 31, 181, 69, + 119, 35, 114, 223, 180, 232, 225, 128, 198, 206, 1, 105, 155, 54, 104, 116, 5, 138, 164, 31, + 156, 83, 101, 187, 231, 216, 170, 108, 53, 189, 254, 250, 114, 94, 57, 228, 174, 98, 59, + 105, 17, 56, 88, 145, 195, 225, 112, 94, 158, 103, 230, 229, 102, 241, 226, 237, 197, 225, + 161, 248, 238, 187, 23, 111, 206, 94, 159, 23, 171, 226, 251, 239, 95, 158, 159, 21, 139, + 85, 1, 255, 14, 151, 139, 23, 155, 205, 170, 112, 190, 216, 236, 22, 171, 122, 28, 199, 53, + 110, 184, 194, 143, 109, 61, 246, 197, 224, 125, 221, 22, 155, 79, 139, 247, 75, 87, 246, + 203, 174, 252, 219, 230, 119, 112, 198, 21, 174, 169, 71, 60, 230, 124, 237, 91, 31, 14, + 109, 182, 139, 101, 81, 110, 254, 177, 168, 220, 232, 235, 85, 179, 46, 42, 215, 215, 141, + 143, 27, 116, 144, 78, 173, 251, 32, 50, 20, 85, 223, 173, 234, 190, 205, 101, 68, 121, 165, + 114, 167, 85, 173, 138, 190, 115, 117, 95, 108, 206, 131, 149, 127, 47, 43, 191, 188, 45, + 219, 229, 79, 165, 95, 222, 5, 147, 143, 225, 251, 80, 174, 151, 23, 101, 229, 150, 151, + 101, 53, 146, 200, 54, 44, 23, 97, 105, 108, 151, 15, 101, 213, 5, 209, 202, 53, 178, 114, + 21, 54, 81, 254, 95, 101, 181, 38, 121, 222, 193, 85, 254, 254, 253, 95, 131, 250, 179, 178, + 26, 100, 225, 30, 180, 255, 2, 11, 248, 133, 122, 241, 240, 39, 115, 106, 23, 116, 131, 77, + 55, 193, 38, 248, 251, 197, 40, 64, 237, 40, 172, 207, 8, 75, 222, 45, 63, 242, 1, 107, 10, + 155, 221, 203, 239, 120, 14, 255, 195, 109, 43, 10, 143, 178, 231, 111, 229, 183, 250, 3, + 173, 230, 93, 242, 199, 14, 189, 4, 49, 95, 133, 8, 12, 117, 231, 201, 203, 231, 160, 240, + 58, 24, 132, 14, 133, 15, 188, 2, 237, 7, 59, 139, 178, 91, 190, 6, 223, 193, 37, 160, 250, + 90, 34, 80, 135, 203, 60, 235, 180, 185, 87, 84, 126, 172, 7, 14, 226, 159, 202, 10, 236, + 171, 154, 96, 155, 71, 101, 247, 112, 246, 33, 60, 246, 14, 140, 221, 195, 150, 46, 227, + 210, 77, 248, 117, 132, 101, 16, 186, 46, 59, 90, 189, 21, 193, 29, 104, 196, 165, 3, 249, + 165, 67, 161, 173, 220, 113, 27, 143, 86, 174, 197, 175, 16, 152, 30, 5, 47, 224, 3, 5, 182, + 162, 14, 151, 182, 186, 116, 160, 72, 123, 178, 231, 190, 116, 96, 116, 79, 246, 236, 85, + 10, 15, 137, 121, 168, 239, 210, 148, 19, 186, 193, 119, 193, 199, 67, 82, 76, 198, 73, 149, + 108, 131, 175, 58, 44, 134, 247, 203, 62, 40, 108, 194, 95, 45, 186, 188, 84, 88, 87, 55, + 125, 147, 169, 210, 139, 160, 232, 90, 218, 124, 191, 252, 173, 228, 167, 107, 49, 163, 110, + 109, 170, 184, 214, 164, 51, 236, 238, 185, 116, 100, 131, 82, 5, 194, 14, 121, 253, 64, + 169, 17, 182, 85, 21, 11, 135, 24, 56, 210, 112, 192, 20, 9, 167, 168, 52, 241, 42, 170, 87, + 208, 36, 213, 75, 74, 64, 175, 102, 207, 105, 229, 184, 125, 139, 55, 108, 227, 42, 24, 180, + 215, 69, 171, 130, 82, 243, 82, 50, 158, 31, 78, 38, 242, 2, 8, 109, 197, 19, 183, 244, 52, + 223, 197, 108, 215, 202, 141, 215, 67, 178, 147, 6, 8, 70, 213, 4, 236, 90, 13, 90, 57, 224, + 106, 20, 220, 114, 85, 232, 227, 209, 143, 82, 126, 93, 35, 198, 224, 59, 186, 174, 85, 123, + 73, 59, 252, 66, 100, 18, 11, 143, 10, 20, 224, 45, 171, 7, 65, 1, 239, 20, 21, 82, 168, 62, + 46, 89, 64, 132, 219, 0, 109, 228, 113, 160, 4, 239, 66, 37, 7, 12, 134, 184, 255, 136, 214, + 216, 235, 46, 41, 31, 122, 3, 156, 7, 190, 36, 133, 53, 65, 39, 56, 148, 33, 115, 12, 191, + 117, 206, 175, 203, 113, 22, 137, 212, 133, 168, 64, 128, 53, 70, 90, 210, 77, 177, 45, 137, + 85, 203, 75, 143, 105, 73, 40, 163, 205, 158, 193, 9, 193, 169, 17, 77, 38, 217, 207, 34, + 34, 128, 79, 203, 31, 109, 137, 181, 230, 84, 4, 82, 1, 253, 107, 49, 255, 10, 253, 157, + 217, 114, 20, 224, 158, 228, 116, 59, 3, 211, 127, 0, 127, 128, 119, 127, 214, 103, 29, 212, + 166, 123, 141, 193, 193, 102, 24, 136, 179, 169, 209, 255, 2, 213, 153, 51, 59, 194, 18, + 205, 114, 101, 82, 202, 184, 3, 115, 195, 5, 225, 36, 26, 218, 97, 162, 199, 124, 18, 101, + 167, 10, 158, 73, 6, 150, 8, 198, 167, 85, 234, 86, 89, 149, 214, 240, 22, 144, 166, 63, 58, + 155, 83, 80, 168, 85, 151, 64, 235, 89, 208, 113, 199, 252, 61, 208, 127, 41, 171, 188, 68, + 132, 191, 167, 242, 234, 34, 99, 49, 13, 84, 142, 137, 176, 159, 37, 26, 102, 37, 248, 128, + 29, 37, 166, 34, 103, 5, 215, 118, 181, 247, 227, 41, 86, 144, 237, 156, 21, 218, 111, 100, + 133, 31, 136, 92, 21, 174, 27, 55, 211, 73, 52, 13, 229, 242, 36, 13, 167, 184, 214, 60, 61, + 207, 103, 225, 194, 234, 209, 130, 253, 39, 222, 45, 168, 168, 203, 92, 31, 106, 178, 182, + 119, 96, 239, 124, 123, 215, 184, 216, 222, 193, 247, 91, 10, 25, 87, 67, 4, 210, 219, 50, + 7, 128, 211, 104, 143, 197, 0, 245, 99, 187, 81, 139, 127, 67, 187, 252, 35, 118, 46, 252, + 98, 129, 5, 45, 203, 32, 240, 97, 25, 14, 163, 53, 168, 14, 228, 63, 148, 97, 137, 32, 17, + 36, 38, 81, 25, 218, 236, 0, 173, 205, 97, 209, 144, 98, 209, 96, 66, 105, 61, 57, 180, 73, + 209, 158, 186, 85, 222, 249, 73, 59, 89, 195, 211, 195, 60, 167, 74, 129, 239, 184, 79, 180, + 168, 52, 164, 109, 67, 44, 220, 205, 175, 4, 124, 210, 183, 68, 134, 60, 217, 154, 130, 216, + 23, 90, 117, 183, 182, 143, 52, 68, 44, 199, 246, 98, 191, 176, 84, 98, 120, 244, 215, 179, + 201, 112, 120, 34, 23, 50, 154, 129, 252, 38, 168, 191, 226, 235, 141, 213, 39, 3, 13, 206, + 57, 112, 173, 89, 178, 24, 248, 73, 49, 198, 38, 168, 182, 51, 154, 50, 240, 150, 209, 59, + 83, 25, 48, 152, 174, 123, 12, 25, 126, 83, 14, 145, 19, 82, 90, 214, 232, 193, 254, 231, + 152, 41, 39, 169, 148, 184, 228, 130, 170, 46, 24, 201, 62, 128, 51, 105, 38, 228, 172, 222, + 197, 108, 62, 16, 234, 7, 184, 56, 202, 107, 174, 88, 70, 167, 63, 51, 141, 161, 64, 50, + 248, 164, 80, 145, 82, 25, 30, 169, 75, 103, 80, 62, 29, 129, 196, 171, 63, 66, 110, 34, 89, + 76, 136, 66, 167, 144, 31, 132, 120, 110, 120, 156, 225, 161, 130, 231, 150, 183, 144, 38, + 7, 70, 63, 200, 86, 156, 245, 148, 157, 122, 91, 73, 192, 23, 221, 255, 154, 47, 100, 138, + 132, 0, 105, 55, 113, 186, 9, 111, 230, 232, 37, 155, 83, 35, 178, 183, 220, 54, 192, 5, + 241, 194, 152, 186, 123, 241, 251, 97, 218, 201, 25, 89, 136, 241, 71, 170, 72, 238, 136, + 99, 102, 94, 99, 38, 40, 124, 233, 123, 118, 250, 251, 94, 131, 31, 43, 154, 118, 228, 113, + 233, 208, 19, 83, 67, 61, 32, 51, 207, 252, 216, 0, 109, 22, 248, 86, 123, 89, 202, 190, 45, + 151, 252, 174, 36, 55, 40, 184, 76, 48, 197, 125, 5, 14, 185, 103, 245, 228, 149, 225, 77, + 108, 34, 67, 229, 79, 144, 213, 13, 116, 23, 201, 24, 80, 13, 191, 62, 120, 239, 130, 166, + 31, 75, 42, 152, 83, 136, 26, 36, 57, 225, 227, 88, 8, 95, 89, 207, 139, 188, 119, 224, 200, + 105, 235, 26, 131, 26, 110, 243, 229, 211, 155, 243, 41, 222, 197, 20, 195, 183, 85, 204, + 234, 144, 111, 2, 204, 65, 197, 59, 48, 245, 200, 110, 187, 210, 23, 208, 195, 236, 92, 155, + 85, 64, 234, 154, 248, 194, 52, 217, 103, 243, 168, 215, 44, 18, 31, 199, 186, 208, 220, 64, + 249, 35, 195, 156, 149, 23, 91, 116, 20, 240, 84, 0, 120, 213, 222, 180, 104, 59, 101, 216, + 44, 58, 51, 169, 110, 230, 32, 201, 243, 118, 154, 50, 115, 77, 67, 94, 20, 136, 82, 251, + 50, 190, 203, 178, 58, 56, 137, 146, 241, 169, 52, 161, 125, 166, 66, 4, 63, 134, 110, 236, + 98, 102, 40, 36, 193, 42, 92, 158, 96, 20, 148, 146, 7, 52, 238, 159, 86, 50, 211, 225, 103, + 31, 203, 87, 70, 154, 52, 73, 180, 96, 57, 115, 245, 36, 49, 220, 149, 161, 95, 77, 119, 74, + 196, 71, 40, 230, 47, 132, 113, 29, 224, 194, 0, 86, 245, 145, 90, 238, 9, 24, 200, 89, 42, + 136, 171, 87, 32, 243, 153, 92, 215, 167, 83, 78, 96, 125, 15, 102, 246, 228, 230, 126, 249, + 231, 146, 40, 71, 8, 10, 190, 145, 203, 10, 33, 181, 59, 126, 58, 121, 253, 13, 168, 124, 7, + 230, 224, 215, 171, 114, 144, 11, 242, 145, 104, 116, 245, 106, 56, 61, 18, 225, 246, 26, + 159, 43, 16, 10, 20, 215, 127, 35, 197, 189, 6, 191, 114, 14, 143, 20, 223, 172, 99, 66, + 248, 163, 93, 83, 202, 99, 27, 27, 19, 129, 155, 163, 54, 99, 66, 27, 35, 37, 41, 130, 39, + 253, 124, 3, 142, 65, 40, 193, 47, 246, 199, 200, 187, 150, 20, 198, 150, 80, 246, 223, 112, + 88, 187, 211, 163, 160, 186, 185, 66, 170, 77, 17, 95, 9, 18, 118, 146, 73, 107, 36, 166, + 17, 184, 200, 225, 106, 156, 33, 236, 176, 118, 6, 38, 40, 223, 72, 199, 127, 122, 72, 50, + 21, 176, 54, 148, 8, 135, 226, 136, 51, 226, 90, 71, 143, 29, 218, 244, 80, 156, 61, 230, + 122, 234, 132, 180, 79, 204, 45, 59, 69, 22, 153, 68, 112, 83, 1, 96, 110, 20, 210, 241, + 134, 34, 153, 221, 170, 129, 189, 49, 253, 135, 159, 118, 61, 67, 26, 71, 30, 199, 162, 215, + 226, 11, 226, 75, 51, 204, 136, 198, 71, 102, 240, 78, 17, 232, 9, 76, 38, 185, 34, 17, 64, + 139, 48, 15, 57, 2, 109, 55, 79, 150, 176, 110, 199, 71, 248, 61, 199, 53, 66, 99, 214, 143, + 32, 107, 159, 174, 191, 53, 54, 210, 50, 200, 45, 82, 25, 109, 147, 116, 53, 220, 96, 124, + 185, 169, 1, 29, 249, 136, 1, 107, 207, 237, 142, 148, 140, 224, 97, 162, 75, 143, 69, 86, + 250, 121, 210, 226, 218, 217, 141, 224, 142, 166, 55, 161, 83, 5, 118, 227, 104, 33, 1, 98, + 10, 1, 140, 73, 113, 17, 21, 129, 144, 73, 59, 153, 122, 240, 231, 206, 142, 57, 148, 79, + 12, 184, 179, 0, 195, 102, 250, 225, 212, 156, 2, 168, 250, 255, 33, 17, 38, 146, 38, 33, + 146, 119, 4, 107, 144, 83, 61, 254, 221, 112, 211, 146, 15, 61, 103, 132, 31, 158, 150, 31, + 168, 164, 59, 186, 230, 39, 74, 74, 44, 216, 134, 150, 110, 56, 18, 231, 65, 221, 42, 154, + 183, 7, 129, 35, 105, 0, 87, 233, 216, 52, 33, 34, 223, 53, 181, 239, 220, 41, 34, 146, 109, + 225, 93, 33, 162, 225, 27, 137, 8, 50, 135, 203, 166, 25, 219, 188, 39, 197, 255, 180, 119, + 96, 153, 39, 224, 254, 81, 56, 74, 170, 219, 140, 26, 120, 197, 158, 217, 32, 98, 162, 80, + 69, 147, 18, 30, 252, 124, 78, 101, 249, 78, 78, 229, 53, 250, 92, 77, 115, 83, 148, 120, + 254, 235, 74, 150, 33, 176, 105, 24, 2, 175, 202, 124, 224, 50, 189, 51, 72, 17, 252, 194, + 174, 64, 185, 245, 183, 87, 247, 178, 172, 35, 181, 218, 137, 110, 163, 38, 3, 11, 248, 59, + 127, 64, 236, 26, 113, 91, 102, 13, 141, 161, 230, 128, 190, 72, 51, 162, 105, 103, 204, 78, + 52, 69, 106, 83, 55, 25, 87, 92, 148, 190, 159, 101, 21, 140, 209, 29, 150, 232, 90, 13, + 126, 72, 94, 40, 56, 238, 186, 71, 82, 247, 196, 124, 42, 199, 228, 189, 86, 214, 169, 230, + 185, 22, 62, 158, 125, 40, 93, 150, 108, 73, 0, 224, 220, 127, 114, 230, 119, 131, 77, 253, + 233, 148, 115, 130, 36, 93, 70, 146, 240, 91, 124, 175, 153, 1, 30, 163, 241, 67, 166, 70, + 189, 153, 193, 56, 186, 90, 192, 151, 248, 99, 154, 38, 243, 51, 80, 147, 153, 1, 146, 219, + 210, 78, 102, 118, 199, 242, 109, 163, 131, 41, 216, 183, 43, 147, 126, 77, 168, 253, 210, + 24, 128, 223, 138, 47, 90, 110, 38, 179, 191, 34, 236, 112, 236, 11, 222, 151, 231, 224, + 174, 118, 72, 18, 220, 188, 237, 2, 103, 16, 26, 198, 25, 51, 205, 227, 137, 138, 100, 172, + 99, 215, 24, 163, 35, 54, 197, 153, 51, 34, 98, 151, 207, 141, 176, 244, 8, 182, 214, 76, + 211, 96, 219, 171, 55, 103, 197, 226, 213, 102, 241, 95, 1, 6, 0, 220, 101, 180, 226, 13, + 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 51, 57, + 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 52, 48, + 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 56, 32, 48, 32, 82, 47, 82, 101, + 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, + 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, + 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, + 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, + 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, + 116, 115, 32, 49, 56, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, + 100, 111, 98, 106, 13, 52, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 50, 50, 53, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 105, + 111, 27, 71, 18, 253, 206, 95, 49, 31, 57, 65, 102, 60, 221, 115, 3, 129, 129, 216, 114, + 130, 28, 202, 6, 107, 238, 2, 134, 179, 192, 234, 8, 41, 217, 148, 76, 80, 98, 20, 255, 251, + 237, 58, 187, 122, 56, 244, 58, 112, 32, 80, 152, 153, 174, 174, 174, 235, 189, 170, 126, + 177, 90, 60, 251, 245, 98, 255, 152, 125, 243, 205, 179, 243, 151, 63, 156, 101, 85, 246, + 252, 249, 139, 179, 151, 217, 162, 202, 224, 111, 191, 89, 60, 91, 173, 170, 204, 249, 108, + 181, 94, 84, 229, 56, 142, 3, 46, 184, 204, 143, 77, 57, 118, 89, 239, 125, 217, 100, 171, + 187, 197, 219, 165, 203, 187, 101, 151, 255, 103, 245, 35, 236, 113, 153, 171, 203, 17, 183, + 57, 95, 250, 198, 135, 77, 171, 235, 197, 50, 203, 87, 239, 22, 133, 27, 125, 89, 213, 67, + 86, 184, 174, 172, 125, 92, 160, 141, 180, 107, 232, 130, 72, 159, 21, 93, 91, 149, 93, 51, + 149, 17, 229, 133, 202, 29, 171, 82, 187, 179, 174, 117, 101, 151, 173, 206, 130, 149, 175, + 243, 162, 95, 62, 6, 83, 47, 242, 162, 195, 135, 223, 115, 31, 182, 180, 180, 114, 200, 139, + 122, 185, 211, 127, 31, 242, 194, 47, 247, 121, 209, 162, 36, 72, 157, 195, 182, 219, 240, + 240, 144, 23, 142, 254, 193, 27, 10, 222, 195, 150, 204, 132, 128, 60, 9, 1, 24, 124, 109, + 3, 96, 140, 43, 100, 185, 240, 99, 217, 162, 3, 111, 67, 24, 187, 229, 16, 126, 165, 232, + 242, 162, 171, 45, 235, 110, 170, 74, 14, 242, 16, 168, 134, 22, 223, 46, 87, 97, 255, 77, + 222, 4, 247, 10, 240, 175, 104, 27, 240, 208, 5, 71, 130, 55, 23, 250, 52, 93, 62, 132, 45, + 59, 254, 125, 8, 42, 246, 249, 64, 130, 36, 115, 14, 143, 183, 225, 91, 240, 124, 164, 127, + 240, 22, 220, 119, 117, 240, 191, 97, 49, 216, 185, 166, 183, 190, 89, 254, 18, 2, 244, 67, + 94, 12, 104, 19, 62, 144, 212, 183, 112, 32, 154, 242, 17, 98, 15, 155, 54, 160, 145, 86, + 159, 228, 168, 45, 255, 232, 243, 101, 234, 211, 85, 216, 78, 91, 225, 244, 71, 217, 3, 47, + 7, 150, 244, 203, 107, 53, 108, 141, 110, 129, 177, 123, 210, 88, 123, 218, 4, 161, 130, 79, + 168, 154, 118, 81, 38, 139, 58, 20, 88, 5, 5, 214, 151, 125, 71, 177, 69, 115, 81, 18, 173, + 223, 75, 60, 160, 64, 214, 38, 112, 25, 85, 70, 56, 237, 192, 234, 195, 137, 14, 140, 246, + 40, 179, 13, 111, 14, 125, 67, 101, 240, 89, 61, 248, 3, 226, 196, 142, 114, 154, 64, 245, + 58, 108, 105, 211, 204, 232, 209, 248, 6, 75, 79, 154, 99, 16, 2, 239, 85, 6, 2, 19, 179, + 127, 139, 6, 72, 244, 240, 59, 217, 4, 162, 59, 180, 25, 222, 40, 197, 157, 121, 83, 51, + 209, 48, 212, 94, 230, 110, 136, 213, 31, 193, 39, 133, 13, 232, 251, 103, 238, 17, 111, 15, + 84, 106, 1, 46, 219, 60, 98, 235, 5, 98, 18, 215, 64, 232, 154, 224, 212, 46, 191, 19, 148, + 33, 192, 80, 8, 159, 174, 224, 108, 253, 190, 129, 239, 51, 232, 235, 202, 238, 8, 50, 6, + 125, 180, 60, 69, 223, 248, 55, 160, 239, 3, 186, 85, 212, 206, 20, 237, 35, 113, 137, 0, + 79, 138, 208, 97, 240, 189, 211, 90, 167, 170, 129, 130, 56, 134, 42, 72, 99, 196, 117, 25, + 212, 92, 229, 62, 145, 216, 39, 201, 1, 91, 14, 88, 58, 137, 44, 151, 5, 110, 56, 134, 134, + 169, 212, 59, 180, 110, 135, 26, 162, 35, 130, 180, 141, 81, 115, 45, 174, 198, 2, 222, 114, + 249, 64, 65, 221, 81, 118, 145, 45, 27, 97, 150, 41, 206, 36, 19, 247, 162, 11, 255, 105, + 29, 127, 157, 227, 105, 174, 111, 34, 118, 197, 117, 248, 8, 158, 136, 105, 24, 31, 120, 32, + 162, 152, 90, 12, 226, 134, 172, 224, 21, 143, 80, 187, 83, 96, 90, 17, 248, 168, 39, 71, + 183, 30, 140, 230, 57, 10, 131, 239, 151, 19, 131, 69, 149, 26, 187, 81, 27, 192, 105, 227, + 175, 64, 149, 95, 113, 3, 63, 239, 208, 107, 33, 20, 16, 180, 38, 95, 138, 122, 229, 108, + 14, 101, 225, 42, 206, 64, 165, 28, 7, 80, 93, 51, 99, 113, 246, 29, 83, 215, 111, 222, 187, + 124, 228, 56, 66, 53, 236, 152, 105, 31, 115, 183, 44, 130, 108, 122, 144, 250, 16, 246, + 121, 62, 203, 16, 85, 162, 51, 173, 88, 208, 185, 205, 29, 11, 23, 40, 248, 41, 221, 64, 64, + 150, 0, 226, 212, 82, 85, 46, 193, 247, 171, 112, 14, 88, 250, 146, 112, 230, 137, 136, 180, + 203, 63, 144, 179, 19, 30, 105, 154, 0, 239, 241, 20, 141, 240, 170, 61, 165, 15, 170, 170, + 47, 100, 17, 36, 190, 216, 76, 138, 177, 109, 108, 39, 144, 124, 67, 249, 40, 23, 27, 88, + 161, 60, 198, 235, 90, 144, 71, 27, 238, 25, 32, 24, 70, 20, 134, 3, 108, 91, 152, 180, 244, + 49, 237, 233, 240, 250, 78, 166, 133, 168, 228, 214, 82, 11, 23, 237, 24, 106, 239, 87, 136, + 239, 205, 36, 119, 33, 157, 144, 132, 154, 170, 96, 230, 0, 3, 109, 247, 9, 142, 200, 194, + 174, 152, 81, 30, 35, 34, 213, 217, 14, 25, 102, 68, 215, 112, 91, 163, 194, 126, 167, 176, + 77, 32, 14, 98, 1, 187, 222, 130, 151, 186, 34, 173, 37, 248, 237, 234, 6, 69, 46, 36, 32, + 196, 54, 145, 28, 176, 147, 185, 68, 115, 27, 155, 232, 13, 163, 185, 115, 6, 255, 162, 151, + 124, 225, 88, 232, 33, 56, 126, 100, 12, 90, 42, 111, 51, 156, 196, 48, 114, 225, 213, 153, + 115, 101, 213, 240, 44, 222, 12, 82, 123, 255, 157, 212, 30, 197, 178, 199, 188, 67, 246, + 42, 124, 170, 184, 142, 1, 183, 196, 161, 123, 173, 14, 69, 108, 73, 67, 157, 115, 199, 248, + 43, 240, 76, 159, 96, 35, 109, 232, 50, 132, 99, 59, 191, 145, 166, 255, 154, 102, 44, 30, + 191, 255, 128, 183, 91, 50, 193, 140, 16, 71, 48, 29, 124, 89, 215, 221, 41, 152, 242, 234, + 20, 166, 238, 239, 128, 169, 116, 150, 216, 170, 165, 6, 32, 153, 181, 237, 43, 123, 25, + 239, 18, 192, 104, 145, 214, 177, 123, 241, 43, 206, 204, 240, 78, 133, 116, 43, 133, 192, + 203, 10, 45, 59, 51, 226, 138, 22, 170, 82, 3, 47, 172, 101, 75, 108, 139, 219, 116, 184, + 155, 204, 29, 215, 113, 239, 37, 26, 65, 69, 72, 95, 164, 76, 101, 194, 173, 173, 165, 27, + 105, 56, 81, 237, 54, 202, 81, 251, 0, 217, 75, 36, 124, 177, 225, 42, 159, 27, 192, 37, + 107, 18, 31, 105, 82, 145, 88, 148, 205, 72, 169, 194, 90, 204, 147, 232, 120, 19, 101, 138, + 193, 22, 55, 69, 203, 221, 152, 76, 10, 176, 33, 94, 88, 32, 28, 26, 118, 157, 193, 152, + 243, 64, 20, 57, 239, 156, 9, 5, 62, 252, 168, 146, 156, 6, 248, 120, 38, 12, 48, 93, 120, + 195, 243, 227, 187, 100, 23, 62, 152, 67, 254, 157, 119, 204, 232, 58, 117, 113, 87, 133, + 213, 159, 222, 8, 37, 154, 45, 166, 148, 26, 41, 36, 47, 64, 90, 125, 21, 98, 59, 185, 37, + 66, 4, 223, 155, 65, 66, 141, 145, 138, 8, 223, 254, 21, 24, 26, 29, 70, 237, 165, 145, 54, + 115, 48, 188, 106, 25, 162, 22, 202, 248, 144, 140, 66, 52, 104, 74, 207, 179, 43, 223, 225, + 202, 167, 97, 54, 198, 164, 222, 235, 69, 9, 81, 145, 54, 183, 20, 40, 253, 103, 130, 243, + 255, 205, 157, 58, 22, 202, 176, 107, 23, 137, 150, 169, 15, 196, 105, 75, 46, 70, 215, 124, + 107, 132, 221, 135, 249, 49, 89, 175, 112, 17, 234, 23, 66, 60, 218, 26, 8, 155, 38, 168, + 173, 105, 249, 240, 118, 38, 33, 80, 88, 254, 28, 4, 43, 61, 252, 253, 228, 110, 210, 78, + 110, 156, 52, 177, 73, 144, 35, 202, 53, 100, 244, 233, 16, 175, 147, 67, 100, 182, 19, 19, + 113, 210, 80, 249, 244, 63, 161, 110, 119, 249, 164, 222, 148, 138, 164, 225, 204, 13, 124, + 201, 141, 243, 85, 222, 199, 46, 115, 203, 151, 205, 143, 52, 41, 98, 52, 194, 72, 10, 159, + 241, 246, 8, 15, 63, 99, 254, 10, 110, 71, 239, 181, 3, 101, 113, 186, 68, 152, 64, 227, + 240, 95, 216, 56, 190, 53, 168, 15, 19, 15, 217, 218, 196, 50, 197, 7, 33, 218, 182, 153, + 75, 222, 169, 188, 129, 248, 92, 176, 219, 116, 122, 105, 109, 233, 203, 252, 211, 210, 68, + 191, 83, 195, 214, 92, 157, 81, 181, 14, 126, 70, 17, 232, 253, 152, 59, 186, 129, 246, 68, + 126, 175, 115, 55, 208, 19, 56, 103, 81, 212, 154, 169, 105, 47, 46, 77, 180, 233, 41, 82, + 111, 17, 139, 15, 185, 222, 91, 108, 131, 144, 33, 232, 136, 165, 234, 201, 45, 107, 63, + 211, 237, 142, 248, 168, 110, 108, 63, 177, 163, 46, 62, 113, 17, 162, 28, 16, 221, 141, 29, + 171, 249, 251, 108, 193, 215, 147, 17, 82, 206, 129, 24, 63, 169, 57, 123, 101, 118, 171, + 48, 218, 32, 25, 137, 119, 177, 141, 145, 155, 139, 0, 238, 53, 33, 24, 52, 176, 118, 231, + 231, 115, 209, 49, 143, 201, 253, 52, 54, 242, 123, 227, 168, 31, 109, 213, 136, 126, 37, + 122, 8, 207, 71, 234, 87, 116, 83, 196, 13, 79, 9, 213, 170, 186, 72, 225, 92, 149, 32, 171, + 171, 74, 20, 250, 32, 61, 112, 180, 163, 189, 157, 192, 97, 37, 178, 42, 5, 7, 156, 160, 81, + 247, 96, 210, 0, 146, 58, 237, 171, 10, 155, 142, 71, 61, 225, 168, 123, 192, 102, 245, 120, + 19, 111, 186, 182, 69, 197, 233, 218, 236, 84, 230, 185, 180, 172, 248, 254, 184, 53, 196, + 164, 83, 141, 36, 189, 42, 242, 250, 4, 96, 210, 36, 44, 196, 88, 107, 154, 123, 141, 91, + 234, 30, 131, 193, 11, 42, 79, 50, 114, 27, 76, 250, 254, 243, 167, 252, 201, 128, 223, 118, + 229, 48, 186, 83, 3, 62, 175, 194, 113, 194, 4, 61, 95, 50, 191, 132, 167, 255, 145, 187, + 164, 142, 29, 12, 26, 55, 28, 191, 216, 7, 53, 173, 2, 57, 16, 219, 234, 140, 117, 105, 145, + 12, 75, 19, 90, 197, 111, 90, 179, 177, 190, 183, 92, 134, 52, 83, 196, 76, 109, 172, 46, + 204, 252, 142, 89, 123, 171, 197, 11, 24, 227, 186, 194, 70, 55, 40, 66, 19, 75, 102, 234, + 128, 181, 207, 178, 172, 140, 225, 156, 74, 225, 243, 207, 189, 225, 156, 104, 77, 253, 95, + 110, 77, 125, 114, 83, 106, 13, 69, 104, 131, 76, 24, 193, 207, 114, 158, 209, 18, 201, 85, + 171, 252, 16, 235, 94, 210, 96, 195, 215, 26, 234, 166, 87, 173, 2, 202, 250, 150, 79, 156, + 118, 75, 185, 192, 181, 134, 181, 158, 216, 203, 222, 220, 106, 212, 82, 222, 59, 207, 185, + 107, 13, 129, 212, 201, 46, 25, 219, 216, 21, 248, 116, 207, 93, 106, 6, 195, 177, 53, 95, + 234, 20, 119, 178, 255, 170, 255, 216, 31, 224, 32, 173, 221, 109, 202, 92, 234, 174, 105, + 71, 146, 172, 59, 170, 91, 153, 90, 63, 208, 116, 214, 243, 61, 32, 101, 30, 218, 182, 99, + 212, 196, 27, 64, 66, 77, 58, 117, 74, 119, 110, 99, 115, 254, 125, 202, 76, 181, 31, 202, + 161, 235, 78, 144, 64, 93, 118, 149, 19, 14, 48, 35, 118, 243, 137, 74, 134, 26, 17, 192, + 212, 190, 108, 130, 114, 139, 24, 185, 29, 164, 221, 139, 195, 84, 59, 142, 83, 188, 4, 217, + 58, 133, 229, 19, 124, 110, 131, 93, 87, 157, 101, 3, 137, 236, 17, 31, 176, 217, 211, 130, + 174, 43, 78, 46, 36, 255, 10, 238, 46, 210, 32, 213, 188, 7, 99, 16, 62, 147, 189, 218, 55, + 37, 89, 176, 14, 7, 106, 232, 98, 229, 236, 249, 100, 248, 221, 233, 146, 246, 125, 216, + 185, 75, 57, 21, 20, 41, 142, 200, 112, 104, 146, 132, 253, 8, 10, 160, 125, 0, 197, 218, + 78, 57, 119, 114, 79, 210, 112, 202, 73, 237, 204, 133, 146, 146, 40, 184, 141, 216, 51, + 117, 232, 204, 96, 168, 149, 141, 150, 205, 192, 14, 78, 193, 53, 44, 236, 72, 49, 177, 254, + 77, 250, 102, 122, 184, 206, 62, 90, 218, 118, 108, 225, 24, 171, 175, 122, 141, 154, 173, + 129, 225, 168, 2, 142, 72, 173, 60, 6, 201, 88, 186, 234, 20, 72, 124, 57, 12, 73, 63, 126, + 117, 254, 50, 91, 188, 90, 45, 254, 39, 192, 0, 145, 121, 243, 166, 13, 10, 101, 110, 100, + 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 52, 49, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 52, 50, 32, 48, 32, 82, + 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 80, 97, 114, 101, 110, 116, 32, 51, 51, 56, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, + 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, + 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, + 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 55, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 57, + 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, + 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, + 116, 80, 97, 114, 101, 110, 116, 115, 32, 49, 57, 47, 84, 121, 112, 101, 47, 80, 97, 103, + 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 52, 50, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 50, 52, 54, 55, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 72, 137, 172, 87, 91, 111, 219, 70, 22, 126, 247, 175, 224, 211, 130, 92, 44, 25, + 206, 144, 67, 138, 69, 209, 135, 196, 217, 166, 139, 100, 107, 160, 2, 246, 33, 41, 208, + 216, 242, 45, 181, 21, 67, 150, 27, 116, 127, 253, 206, 153, 115, 29, 138, 74, 178, 72, 17, + 88, 145, 230, 114, 230, 92, 191, 243, 157, 231, 235, 147, 103, 103, 239, 119, 251, 226, 251, + 239, 159, 189, 121, 241, 211, 105, 209, 22, 63, 252, 240, 252, 244, 69, 113, 210, 22, 240, + 111, 119, 125, 242, 108, 189, 110, 11, 231, 139, 245, 213, 73, 219, 76, 211, 180, 74, 27, + 174, 240, 83, 223, 76, 67, 49, 122, 223, 244, 197, 250, 254, 228, 109, 233, 170, 161, 28, + 171, 95, 215, 255, 130, 59, 174, 112, 93, 51, 165, 107, 206, 55, 190, 247, 241, 210, 122, + 115, 82, 22, 213, 250, 195, 73, 237, 38, 223, 180, 221, 170, 168, 221, 208, 116, 94, 55, + 240, 34, 222, 90, 13, 241, 200, 88, 212, 67, 104, 155, 161, 159, 159, 97, 225, 181, 156, 59, + 20, 37, 122, 23, 67, 112, 205, 80, 172, 79, 163, 150, 175, 43, 95, 190, 175, 234, 161, 60, + 175, 234, 46, 30, 13, 229, 143, 240, 101, 87, 213, 161, 252, 88, 213, 190, 252, 84, 245, + 229, 150, 247, 78, 171, 218, 181, 229, 109, 252, 150, 238, 220, 87, 245, 136, 167, 182, 149, + 27, 202, 13, 28, 123, 52, 38, 163, 230, 237, 208, 172, 188, 179, 6, 27, 101, 106, 222, 174, + 253, 212, 132, 164, 240, 219, 232, 182, 161, 236, 227, 95, 195, 178, 60, 203, 10, 77, 55, + 116, 51, 81, 252, 144, 7, 199, 244, 184, 25, 13, 139, 26, 186, 104, 85, 31, 207, 213, 110, + 236, 193, 174, 41, 218, 181, 138, 10, 15, 209, 170, 104, 223, 86, 55, 79, 225, 247, 109, + 220, 76, 183, 238, 225, 3, 142, 193, 137, 77, 252, 123, 132, 187, 116, 244, 93, 25, 93, 246, + 58, 73, 59, 141, 223, 222, 85, 241, 131, 182, 64, 128, 61, 154, 132, 209, 247, 61, 188, 112, + 9, 190, 186, 136, 23, 110, 146, 87, 251, 244, 200, 29, 233, 116, 13, 55, 255, 172, 227, 183, + 116, 15, 223, 174, 93, 176, 210, 183, 230, 222, 31, 85, 77, 250, 238, 89, 251, 24, 11, 215, + 65, 48, 218, 18, 228, 224, 117, 176, 25, 54, 211, 249, 75, 140, 22, 138, 5, 239, 214, 93, + 76, 152, 22, 18, 102, 108, 198, 1, 125, 151, 14, 37, 39, 164, 111, 32, 32, 41, 199, 26, 92, + 147, 141, 93, 32, 215, 136, 93, 123, 204, 155, 33, 221, 161, 19, 159, 88, 187, 180, 121, + 131, 78, 135, 13, 248, 122, 203, 178, 205, 186, 62, 255, 16, 23, 217, 61, 127, 66, 178, 169, + 82, 160, 71, 18, 72, 151, 30, 200, 43, 234, 231, 109, 229, 123, 117, 77, 114, 20, 200, 106, + 192, 13, 116, 105, 29, 47, 192, 195, 233, 188, 90, 98, 245, 128, 119, 146, 231, 64, 8, 167, + 15, 44, 206, 85, 113, 99, 244, 57, 120, 180, 77, 190, 132, 92, 134, 2, 187, 138, 155, 28, 1, + 227, 252, 13, 89, 150, 172, 138, 239, 5, 76, 52, 155, 130, 126, 57, 7, 217, 163, 236, 189, + 11, 200, 14, 118, 31, 121, 53, 137, 208, 120, 227, 6, 8, 123, 168, 140, 75, 46, 176, 246, + 61, 250, 101, 166, 141, 201, 65, 150, 172, 47, 113, 132, 226, 85, 35, 8, 228, 212, 206, 205, + 37, 73, 216, 141, 46, 201, 24, 173, 53, 179, 243, 64, 254, 98, 109, 37, 3, 69, 109, 13, 22, + 102, 240, 250, 239, 209, 205, 73, 150, 212, 30, 22, 137, 214, 198, 19, 9, 149, 36, 192, 67, + 115, 143, 59, 41, 32, 227, 114, 206, 23, 135, 233, 2, 122, 225, 47, 137, 61, 152, 143, 23, + 179, 119, 174, 109, 62, 57, 173, 95, 172, 74, 73, 124, 17, 3, 146, 159, 44, 216, 176, 51, + 192, 167, 31, 83, 57, 247, 233, 128, 20, 218, 173, 108, 49, 148, 161, 148, 43, 249, 197, 56, + 133, 117, 226, 108, 185, 166, 143, 77, 254, 222, 44, 232, 226, 221, 228, 155, 180, 121, 81, + 117, 146, 121, 219, 172, 114, 64, 194, 161, 136, 180, 38, 168, 64, 191, 119, 28, 69, 107, + 145, 120, 138, 92, 37, 0, 128, 174, 149, 20, 160, 35, 27, 126, 92, 146, 132, 31, 205, 226, + 146, 242, 240, 31, 85, 174, 158, 168, 1, 238, 155, 213, 126, 58, 176, 163, 164, 190, 81, 27, + 150, 236, 146, 215, 180, 212, 238, 76, 234, 46, 130, 149, 34, 196, 72, 45, 248, 154, 27, + 147, 60, 65, 71, 131, 66, 39, 22, 40, 168, 11, 203, 231, 90, 76, 33, 190, 196, 32, 47, 77, + 1, 110, 176, 110, 158, 20, 14, 121, 20, 122, 73, 27, 147, 161, 154, 59, 225, 160, 106, 67, + 249, 19, 136, 78, 31, 80, 7, 20, 243, 144, 46, 104, 136, 112, 133, 19, 220, 66, 80, 192, 88, + 228, 78, 182, 21, 6, 38, 119, 29, 185, 40, 227, 43, 204, 13, 78, 137, 27, 132, 111, 228, 6, + 166, 142, 39, 205, 198, 229, 116, 156, 22, 0, 108, 98, 44, 252, 200, 142, 224, 204, 156, + 178, 2, 156, 250, 89, 116, 176, 244, 103, 53, 188, 50, 168, 67, 153, 58, 245, 4, 204, 44, + 196, 194, 0, 119, 58, 197, 80, 66, 52, 84, 213, 47, 151, 154, 36, 198, 37, 178, 58, 209, + 119, 217, 58, 175, 80, 36, 121, 115, 143, 181, 51, 103, 13, 204, 218, 216, 123, 233, 60, + 225, 127, 208, 196, 214, 198, 12, 203, 10, 90, 33, 7, 169, 240, 25, 136, 202, 10, 130, 59, + 205, 172, 32, 150, 145, 86, 58, 148, 106, 193, 117, 172, 199, 65, 210, 25, 112, 88, 73, 207, + 189, 2, 231, 243, 170, 251, 170, 42, 73, 170, 10, 38, 25, 194, 215, 121, 155, 232, 16, 240, + 195, 76, 143, 62, 205, 153, 240, 25, 220, 216, 161, 209, 68, 200, 229, 215, 30, 73, 209, + 144, 36, 66, 73, 124, 87, 213, 253, 140, 194, 95, 166, 76, 246, 202, 224, 23, 216, 253, 62, + 145, 160, 57, 107, 143, 131, 204, 212, 134, 163, 172, 157, 182, 65, 87, 102, 141, 80, 153, + 195, 55, 86, 230, 171, 212, 74, 49, 53, 222, 121, 239, 211, 188, 113, 78, 92, 137, 35, 28, + 185, 240, 25, 153, 225, 156, 246, 10, 179, 253, 134, 211, 100, 43, 25, 160, 169, 44, 140, 2, + 207, 10, 95, 226, 46, 54, 246, 202, 118, 45, 103, 238, 105, 147, 91, 200, 104, 136, 225, 35, + 95, 48, 205, 56, 214, 209, 28, 27, 225, 78, 52, 171, 3, 129, 175, 177, 123, 255, 19, 164, + 189, 172, 70, 88, 239, 97, 157, 32, 96, 60, 188, 73, 55, 174, 178, 182, 171, 213, 54, 115, + 209, 21, 193, 196, 142, 218, 198, 177, 178, 133, 183, 103, 36, 215, 178, 138, 133, 38, 198, + 237, 52, 72, 103, 199, 108, 78, 43, 146, 255, 204, 133, 104, 93, 26, 111, 232, 13, 185, 85, + 255, 46, 51, 123, 23, 114, 70, 179, 192, 202, 65, 217, 25, 47, 247, 115, 73, 130, 146, 150, + 154, 186, 192, 212, 13, 47, 38, 205, 17, 215, 57, 146, 25, 29, 11, 61, 161, 14, 236, 126, + 49, 8, 84, 235, 135, 3, 65, 234, 160, 76, 36, 132, 125, 194, 3, 211, 108, 130, 156, 122, + 157, 68, 141, 177, 118, 2, 115, 147, 13, 244, 10, 241, 17, 91, 199, 142, 72, 128, 156, 226, + 74, 216, 97, 193, 248, 156, 168, 187, 165, 116, 117, 11, 253, 129, 138, 187, 147, 250, 109, + 155, 201, 115, 253, 198, 36, 118, 21, 196, 191, 78, 83, 44, 56, 54, 126, 92, 0, 48, 221, + 200, 218, 61, 18, 30, 175, 67, 97, 42, 245, 25, 2, 13, 190, 233, 157, 8, 38, 101, 230, 44, + 204, 19, 213, 79, 186, 237, 1, 20, 96, 238, 253, 111, 86, 230, 220, 13, 169, 175, 169, 119, + 206, 197, 220, 173, 208, 221, 218, 15, 93, 211, 117, 62, 43, 17, 77, 80, 137, 207, 82, 193, + 199, 4, 1, 145, 50, 250, 180, 165, 143, 155, 109, 252, 27, 211, 43, 45, 42, 18, 114, 66, 28, + 122, 77, 51, 113, 51, 249, 63, 216, 230, 4, 191, 132, 43, 106, 119, 81, 96, 210, 182, 215, + 207, 186, 183, 34, 165, 229, 11, 249, 148, 7, 233, 129, 139, 210, 180, 216, 54, 105, 254, + 220, 74, 197, 10, 31, 114, 230, 42, 110, 89, 224, 54, 60, 72, 5, 28, 164, 120, 138, 136, 87, + 252, 84, 46, 17, 99, 104, 185, 79, 100, 143, 142, 74, 66, 142, 207, 201, 204, 91, 161, 2, + 25, 85, 64, 229, 209, 170, 64, 213, 204, 92, 76, 89, 42, 172, 103, 108, 7, 15, 107, 82, 132, + 227, 62, 55, 91, 32, 38, 213, 158, 84, 75, 214, 235, 225, 244, 84, 126, 129, 217, 126, 166, + 107, 191, 130, 119, 82, 175, 223, 152, 254, 29, 129, 234, 26, 214, 178, 163, 111, 96, 229, + 22, 137, 136, 195, 15, 161, 14, 219, 138, 73, 71, 154, 234, 198, 148, 153, 223, 78, 165, 45, + 121, 116, 134, 80, 43, 143, 22, 32, 158, 35, 206, 29, 39, 15, 198, 134, 167, 54, 145, 104, + 0, 236, 223, 85, 48, 20, 238, 54, 107, 82, 54, 171, 225, 236, 143, 71, 203, 4, 118, 95, 241, + 92, 184, 201, 120, 181, 166, 152, 57, 43, 76, 98, 185, 234, 185, 21, 198, 147, 66, 77, 37, + 5, 114, 204, 194, 76, 60, 214, 133, 185, 219, 136, 151, 210, 45, 219, 170, 180, 13, 82, 180, + 250, 194, 185, 166, 237, 33, 38, 253, 212, 244, 204, 213, 126, 155, 197, 235, 45, 11, 112, + 81, 192, 20, 255, 64, 231, 49, 1, 147, 1, 37, 110, 134, 59, 41, 89, 113, 223, 163, 97, 37, + 112, 108, 54, 148, 74, 135, 191, 226, 64, 104, 15, 213, 126, 169, 109, 216, 206, 1, 202, 33, + 190, 136, 34, 130, 178, 11, 148, 224, 96, 132, 113, 159, 69, 49, 235, 85, 139, 196, 216, + 225, 77, 49, 83, 184, 208, 187, 140, 76, 16, 45, 25, 39, 180, 141, 168, 126, 157, 34, 177, + 218, 122, 104, 86, 210, 130, 221, 106, 39, 181, 165, 41, 20, 14, 108, 216, 64, 153, 46, 48, + 169, 54, 149, 33, 69, 243, 75, 86, 49, 215, 27, 208, 203, 243, 153, 195, 232, 48, 140, 88, + 141, 73, 142, 217, 17, 166, 253, 144, 241, 132, 100, 77, 146, 100, 172, 153, 55, 106, 88, + 75, 119, 211, 198, 239, 89, 14, 184, 44, 130, 110, 92, 164, 77, 28, 73, 240, 140, 184, 118, + 103, 225, 100, 180, 60, 62, 125, 60, 101, 252, 149, 206, 104, 76, 24, 105, 182, 98, 14, 71, + 255, 154, 240, 54, 23, 108, 205, 25, 213, 28, 98, 19, 106, 147, 144, 215, 209, 204, 45, 73, + 130, 132, 106, 39, 141, 143, 219, 224, 131, 2, 134, 105, 249, 162, 240, 77, 62, 200, 208, + 150, 88, 185, 21, 36, 147, 35, 214, 102, 93, 0, 155, 37, 231, 65, 11, 195, 83, 83, 83, 248, + 185, 114, 134, 186, 7, 83, 184, 176, 178, 208, 134, 141, 78, 33, 47, 39, 147, 211, 132, 11, + 158, 112, 145, 57, 234, 86, 127, 225, 15, 204, 232, 167, 57, 164, 247, 201, 61, 138, 77, + 182, 68, 22, 218, 1, 94, 81, 144, 8, 101, 144, 17, 133, 32, 61, 125, 172, 147, 162, 193, + 178, 182, 32, 156, 173, 35, 120, 236, 6, 97, 46, 206, 160, 239, 114, 15, 199, 97, 42, 182, + 226, 203, 132, 165, 117, 192, 14, 157, 90, 55, 8, 95, 19, 27, 11, 194, 142, 59, 237, 209, + 251, 106, 176, 189, 218, 123, 45, 132, 248, 4, 179, 34, 128, 238, 213, 95, 212, 181, 109, + 62, 197, 52, 249, 44, 225, 130, 3, 26, 133, 65, 231, 69, 73, 106, 146, 116, 216, 158, 92, + 59, 52, 43, 239, 102, 13, 170, 39, 213, 14, 116, 117, 109, 211, 174, 132, 249, 119, 241, 45, + 12, 31, 192, 75, 59, 111, 92, 227, 209, 190, 133, 155, 118, 58, 98, 35, 152, 6, 106, 214, + 104, 237, 40, 54, 171, 240, 247, 12, 122, 121, 39, 187, 19, 145, 92, 177, 58, 206, 42, 247, + 94, 24, 108, 31, 43, 215, 114, 115, 113, 193, 55, 147, 115, 25, 25, 144, 42, 250, 148, 21, + 159, 161, 183, 9, 52, 69, 168, 64, 74, 142, 91, 238, 255, 233, 173, 68, 255, 143, 97, 183, + 29, 178, 228, 160, 157, 179, 216, 147, 210, 119, 32, 22, 80, 88, 31, 196, 126, 83, 173, 171, + 185, 171, 190, 208, 58, 190, 194, 212, 28, 227, 24, 194, 14, 66, 10, 71, 169, 222, 253, 114, + 167, 17, 202, 183, 181, 21, 50, 239, 55, 129, 240, 133, 7, 140, 51, 172, 122, 246, 16, 87, + 137, 224, 63, 245, 162, 8, 122, 112, 250, 111, 21, 254, 159, 147, 90, 29, 80, 76, 126, 5, + 100, 179, 218, 218, 8, 141, 146, 164, 111, 2, 163, 95, 192, 18, 0, 157, 143, 20, 66, 66, 37, + 25, 42, 200, 174, 149, 25, 56, 62, 240, 124, 114, 129, 166, 2, 145, 24, 142, 226, 212, 244, + 23, 224, 20, 37, 85, 103, 231, 89, 165, 245, 84, 214, 221, 2, 9, 236, 190, 134, 3, 118, 25, + 69, 58, 34, 134, 218, 108, 215, 25, 21, 222, 35, 106, 175, 116, 254, 128, 172, 186, 51, 224, + 211, 25, 202, 166, 217, 206, 20, 3, 81, 104, 1, 28, 240, 230, 3, 75, 21, 125, 168, 66, 58, + 132, 105, 221, 219, 155, 34, 132, 236, 116, 220, 54, 150, 198, 12, 76, 137, 163, 101, 212, + 67, 78, 184, 156, 32, 164, 151, 174, 51, 70, 65, 199, 210, 181, 89, 80, 238, 37, 77, 241, + 224, 242, 84, 52, 131, 85, 97, 7, 135, 213, 218, 103, 101, 6, 191, 251, 52, 194, 212, 17, + 65, 91, 234, 212, 109, 222, 220, 125, 40, 255, 19, 125, 245, 170, 242, 185, 14, 128, 80, + 119, 50, 148, 224, 214, 185, 29, 26, 12, 159, 122, 168, 184, 79, 176, 27, 212, 196, 141, 24, + 241, 41, 61, 54, 179, 14, 92, 255, 242, 205, 139, 226, 228, 229, 250, 228, 127, 2, 12, 0, + 221, 197, 203, 237, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 52, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, + 110, 116, 115, 32, 52, 52, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, + 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, + 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 56, 32, + 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, + 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, + 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, + 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, + 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, + 116, 80, 97, 114, 101, 110, 116, 115, 32, 50, 48, 47, 84, 121, 112, 101, 47, 80, 97, 103, + 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 52, 52, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 50, 51, 52, 48, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 72, 137, 164, 87, 91, 111, 219, 198, 18, 126, 215, 175, 224, 163, 182, 8, 25, 238, + 242, 34, 17, 40, 10, 56, 78, 90, 164, 168, 219, 32, 213, 105, 31, 146, 2, 141, 163, 216, 86, + 107, 169, 134, 108, 53, 104, 126, 253, 217, 185, 238, 44, 201, 184, 231, 32, 48, 36, 139, + 203, 217, 217, 217, 185, 124, 243, 205, 179, 205, 226, 233, 171, 119, 199, 135, 226, 235, + 175, 159, 94, 156, 191, 124, 94, 212, 197, 55, 223, 60, 123, 126, 94, 44, 234, 2, 254, 142, + 215, 139, 167, 155, 77, 93, 248, 80, 108, 174, 22, 117, 53, 12, 195, 26, 95, 248, 34, 12, + 109, 53, 244, 197, 42, 132, 170, 45, 54, 251, 197, 155, 165, 119, 253, 114, 237, 126, 219, + 124, 15, 123, 124, 225, 155, 106, 192, 109, 62, 84, 161, 13, 113, 211, 102, 187, 88, 22, + 110, 243, 199, 162, 244, 67, 168, 234, 102, 93, 148, 190, 175, 154, 144, 94, 208, 70, 218, + 181, 238, 163, 200, 170, 40, 251, 174, 174, 250, 118, 44, 35, 202, 75, 149, 251, 188, 170, + 186, 232, 59, 95, 245, 197, 230, 121, 180, 242, 151, 104, 229, 206, 173, 151, 239, 92, 233, + 151, 151, 241, 171, 195, 199, 219, 248, 129, 255, 15, 174, 236, 150, 255, 184, 114, 21, 181, + 148, 190, 105, 151, 223, 185, 114, 32, 225, 59, 215, 202, 226, 183, 240, 124, 138, 207, 135, + 248, 217, 170, 18, 120, 186, 6, 249, 202, 149, 107, 145, 61, 3, 89, 254, 189, 141, 2, 31, + 92, 25, 232, 24, 212, 42, 135, 227, 242, 54, 29, 113, 133, 90, 143, 98, 233, 30, 190, 80, + 230, 35, 108, 253, 43, 222, 2, 222, 253, 9, 15, 217, 14, 122, 83, 122, 61, 243, 149, 43, 27, + 180, 117, 47, 151, 24, 31, 245, 51, 188, 120, 176, 106, 241, 72, 188, 9, 202, 90, 77, 240, + 26, 196, 254, 80, 131, 222, 59, 190, 207, 61, 108, 40, 48, 3, 234, 24, 143, 85, 213, 5, 242, + 57, 154, 44, 23, 133, 79, 225, 240, 246, 193, 227, 19, 238, 3, 157, 176, 124, 201, 6, 6, + 124, 186, 138, 79, 127, 193, 233, 120, 238, 94, 220, 126, 43, 54, 226, 185, 122, 31, 113, + 123, 96, 43, 108, 238, 22, 101, 24, 170, 21, 39, 193, 235, 104, 242, 135, 248, 57, 192, 141, + 224, 199, 199, 184, 59, 42, 236, 33, 35, 154, 168, 190, 195, 85, 176, 224, 133, 91, 37, 177, + 35, 28, 119, 13, 114, 255, 192, 151, 188, 255, 27, 242, 5, 183, 191, 135, 195, 79, 32, 142, + 143, 15, 152, 108, 224, 215, 18, 14, 91, 39, 239, 68, 99, 196, 59, 235, 40, 84, 199, 79, 37, + 54, 7, 41, 129, 174, 106, 250, 198, 22, 142, 73, 234, 0, 85, 209, 210, 203, 55, 203, 77, + 220, 127, 35, 161, 141, 30, 232, 186, 118, 249, 18, 188, 1, 41, 153, 156, 116, 116, 49, 47, + 202, 40, 139, 46, 79, 73, 152, 36, 96, 111, 195, 91, 52, 19, 64, 201, 61, 104, 219, 75, 198, + 226, 126, 252, 218, 113, 62, 28, 40, 159, 224, 96, 92, 199, 26, 186, 119, 190, 54, 202, 247, + 92, 10, 32, 68, 145, 165, 116, 227, 37, 148, 249, 27, 206, 121, 231, 252, 26, 243, 234, 68, + 113, 97, 11, 103, 206, 82, 251, 182, 105, 13, 19, 247, 136, 5, 13, 117, 64, 111, 192, 183, + 101, 19, 177, 162, 94, 105, 110, 130, 231, 164, 110, 147, 149, 186, 125, 238, 96, 40, 49, + 40, 135, 142, 172, 191, 178, 11, 0, 128, 13, 38, 43, 47, 32, 118, 252, 234, 6, 124, 94, 181, + 168, 244, 3, 165, 66, 107, 138, 153, 161, 168, 77, 56, 192, 251, 51, 217, 128, 219, 175, + 213, 183, 44, 3, 126, 148, 154, 220, 99, 73, 241, 139, 31, 226, 67, 77, 186, 183, 226, 69, + 132, 139, 27, 174, 252, 40, 99, 10, 19, 60, 69, 165, 137, 111, 108, 25, 226, 2, 68, 67, 124, + 159, 178, 7, 78, 62, 161, 15, 20, 5, 12, 186, 60, 130, 4, 15, 201, 146, 132, 157, 24, 123, + 220, 159, 78, 72, 192, 167, 81, 42, 92, 199, 206, 111, 83, 161, 55, 133, 247, 85, 221, 66, + 105, 196, 206, 212, 173, 6, 174, 155, 223, 71, 117, 243, 6, 47, 212, 46, 3, 87, 221, 147, + 248, 84, 47, 87, 252, 84, 115, 248, 232, 62, 132, 163, 146, 165, 26, 153, 86, 13, 126, 15, + 113, 69, 183, 157, 230, 27, 129, 104, 202, 47, 64, 122, 49, 34, 130, 134, 120, 97, 80, 114, + 199, 159, 132, 122, 230, 206, 176, 244, 185, 91, 7, 95, 199, 95, 225, 145, 107, 67, 123, 6, + 13, 79, 98, 70, 82, 158, 214, 124, 109, 50, 19, 238, 66, 169, 36, 71, 163, 217, 21, 192, + 217, 4, 80, 203, 166, 110, 171, 62, 40, 172, 66, 45, 125, 71, 13, 162, 36, 244, 84, 128, 5, + 237, 231, 81, 155, 190, 217, 194, 42, 224, 226, 3, 159, 253, 10, 2, 127, 164, 14, 68, 21, + 216, 211, 35, 162, 232, 30, 210, 29, 191, 226, 102, 211, 97, 70, 24, 234, 191, 16, 67, 177, + 169, 27, 72, 106, 76, 1, 74, 246, 159, 242, 174, 124, 45, 8, 104, 2, 14, 251, 164, 122, 48, + 195, 81, 18, 83, 91, 96, 100, 164, 229, 86, 207, 131, 99, 116, 139, 234, 68, 77, 79, 156, + 40, 127, 199, 40, 42, 228, 68, 3, 165, 214, 210, 203, 115, 240, 216, 209, 5, 83, 146, 187, + 148, 78, 229, 184, 161, 231, 176, 183, 207, 73, 7, 201, 143, 250, 56, 145, 140, 4, 172, 235, + 12, 88, 213, 7, 208, 144, 61, 81, 37, 56, 71, 1, 245, 74, 203, 197, 18, 18, 16, 77, 204, + 202, 66, 31, 191, 84, 228, 176, 202, 169, 75, 183, 226, 102, 176, 76, 238, 117, 16, 234, 51, + 6, 17, 220, 248, 118, 25, 93, 206, 126, 144, 98, 79, 48, 166, 160, 102, 59, 207, 91, 135, + 149, 194, 10, 144, 222, 169, 156, 50, 144, 248, 70, 122, 178, 246, 75, 94, 159, 97, 67, 184, + 78, 102, 75, 182, 229, 214, 130, 184, 166, 208, 39, 177, 47, 44, 231, 48, 86, 119, 234, 134, + 127, 113, 5, 39, 161, 116, 0, 233, 46, 189, 180, 242, 83, 6, 249, 202, 90, 15, 146, 168, + 227, 214, 213, 167, 190, 12, 17, 230, 192, 194, 170, 166, 42, 170, 75, 48, 167, 77, 69, 239, + 57, 209, 53, 27, 10, 113, 107, 207, 29, 203, 154, 46, 37, 75, 77, 241, 206, 86, 213, 46, 51, + 131, 58, 128, 245, 164, 208, 68, 185, 165, 148, 78, 180, 44, 144, 71, 97, 69, 185, 201, 173, + 9, 176, 111, 153, 216, 26, 78, 210, 144, 123, 192, 24, 48, 42, 17, 95, 146, 191, 84, 222, + 190, 253, 172, 109, 172, 87, 212, 10, 233, 104, 83, 33, 80, 252, 100, 70, 225, 56, 147, 119, + 47, 89, 45, 137, 100, 25, 100, 85, 111, 53, 90, 10, 19, 59, 237, 6, 7, 123, 89, 186, 83, 30, + 76, 194, 53, 90, 213, 252, 189, 79, 144, 152, 248, 158, 204, 38, 38, 187, 8, 247, 232, 86, + 211, 132, 158, 198, 95, 51, 91, 87, 210, 113, 92, 130, 210, 39, 38, 51, 128, 104, 197, 158, + 115, 1, 253, 5, 8, 49, 62, 193, 88, 112, 22, 145, 228, 71, 56, 240, 44, 246, 165, 11, 66, + 10, 208, 179, 249, 138, 219, 76, 248, 194, 54, 243, 54, 132, 6, 140, 69, 208, 185, 16, 48, + 30, 254, 95, 52, 30, 38, 20, 26, 150, 94, 103, 158, 159, 206, 116, 51, 108, 86, 26, 203, + 192, 88, 150, 40, 233, 148, 174, 38, 218, 111, 118, 253, 200, 116, 140, 162, 47, 41, 134, + 82, 55, 159, 197, 94, 216, 56, 73, 232, 49, 71, 23, 94, 113, 150, 95, 255, 214, 165, 86, + 106, 111, 22, 38, 19, 2, 144, 238, 196, 20, 145, 199, 94, 136, 79, 242, 62, 194, 62, 132, + 13, 208, 75, 244, 254, 42, 21, 195, 214, 26, 106, 206, 32, 46, 152, 57, 195, 156, 69, 157, + 206, 170, 210, 213, 136, 104, 233, 201, 169, 154, 187, 54, 69, 140, 159, 19, 209, 252, 223, + 58, 130, 236, 251, 89, 131, 61, 154, 239, 20, 167, 166, 179, 211, 180, 240, 254, 227, 18, + 94, 102, 227, 79, 104, 168, 189, 165, 230, 124, 116, 90, 144, 33, 229, 92, 94, 153, 188, + 145, 239, 200, 115, 18, 172, 220, 41, 31, 98, 192, 30, 247, 97, 150, 75, 200, 105, 71, 90, + 211, 137, 114, 207, 216, 173, 87, 25, 149, 120, 72, 45, 216, 64, 98, 48, 42, 173, 193, 227, + 25, 51, 48, 195, 75, 230, 168, 132, 198, 105, 107, 93, 165, 13, 212, 90, 52, 102, 243, 8, + 48, 66, 0, 81, 112, 47, 157, 150, 187, 134, 87, 206, 213, 233, 125, 236, 117, 36, 25, 243, + 140, 208, 219, 84, 255, 2, 136, 200, 222, 127, 114, 101, 187, 124, 6, 216, 247, 90, 136, + 250, 13, 124, 33, 17, 87, 54, 127, 79, 136, 140, 4, 55, 46, 1, 167, 23, 126, 222, 103, 252, + 92, 58, 41, 0, 103, 243, 133, 192, 217, 233, 140, 70, 229, 49, 180, 9, 152, 62, 50, 172, + 192, 98, 172, 84, 239, 162, 107, 19, 144, 37, 48, 212, 26, 25, 70, 181, 54, 112, 73, 163, + 128, 54, 58, 91, 253, 129, 16, 15, 36, 239, 92, 155, 135, 29, 229, 180, 180, 134, 41, 131, + 85, 124, 25, 152, 180, 255, 20, 75, 235, 153, 107, 8, 218, 200, 213, 109, 78, 253, 229, 54, + 64, 80, 113, 139, 90, 133, 201, 157, 145, 153, 79, 146, 207, 60, 51, 232, 148, 52, 71, 204, + 225, 104, 48, 231, 90, 149, 138, 26, 200, 51, 234, 204, 96, 218, 142, 9, 177, 15, 216, 33, + 207, 116, 224, 145, 66, 37, 209, 188, 229, 60, 74, 3, 162, 244, 115, 241, 168, 30, 28, 233, + 180, 156, 138, 114, 211, 18, 48, 68, 101, 142, 59, 251, 17, 230, 218, 94, 149, 32, 80, 72, + 106, 214, 155, 236, 224, 225, 39, 13, 213, 83, 164, 211, 96, 144, 35, 211, 156, 191, 115, + 252, 132, 171, 8, 255, 134, 223, 52, 247, 105, 230, 36, 42, 36, 54, 11, 103, 61, 40, 37, + 196, 35, 145, 214, 202, 104, 225, 205, 104, 145, 46, 170, 183, 207, 157, 36, 144, 192, 111, + 242, 17, 131, 94, 159, 108, 154, 178, 92, 64, 108, 178, 197, 230, 165, 111, 169, 81, 201, + 53, 35, 106, 144, 57, 149, 131, 35, 29, 36, 229, 156, 230, 132, 12, 97, 56, 174, 66, 222, + 97, 178, 107, 86, 248, 71, 203, 205, 114, 119, 4, 80, 219, 48, 243, 251, 165, 187, 95, 155, + 66, 93, 69, 163, 186, 132, 1, 119, 121, 132, 102, 107, 91, 142, 208, 82, 151, 230, 117, 57, + 83, 190, 57, 145, 74, 55, 127, 146, 208, 100, 50, 47, 192, 98, 51, 137, 192, 32, 35, 13, + 188, 72, 132, 80, 144, 70, 217, 176, 204, 64, 176, 129, 146, 185, 169, 147, 2, 8, 33, 92, + 47, 159, 233, 24, 162, 162, 43, 161, 210, 245, 30, 54, 156, 99, 114, 46, 200, 254, 56, 22, + 174, 108, 99, 166, 103, 133, 93, 59, 123, 174, 249, 165, 248, 54, 245, 239, 123, 176, 10, + 69, 231, 137, 100, 198, 240, 184, 185, 52, 133, 247, 85, 221, 98, 127, 105, 187, 42, 132, + 129, 27, 204, 239, 220, 96, 26, 110, 48, 147, 142, 227, 235, 170, 94, 7, 233, 56, 158, 221, + 15, 193, 170, 243, 238, 179, 162, 104, 28, 117, 64, 210, 24, 75, 157, 246, 253, 242, 37, + 255, 92, 205, 3, 215, 202, 204, 80, 89, 63, 31, 57, 202, 60, 222, 112, 164, 141, 127, 77, + 58, 174, 120, 136, 200, 217, 43, 189, 128, 202, 18, 211, 218, 134, 76, 59, 184, 32, 94, 139, + 225, 141, 157, 216, 251, 172, 83, 200, 148, 43, 208, 208, 54, 54, 7, 5, 230, 83, 150, 112, + 82, 183, 194, 153, 224, 119, 228, 153, 92, 95, 109, 67, 165, 156, 104, 152, 81, 57, 137, 43, + 188, 200, 33, 129, 23, 49, 13, 56, 219, 100, 96, 29, 145, 92, 150, 156, 231, 232, 237, 136, + 163, 131, 100, 194, 6, 84, 34, 13, 142, 178, 94, 6, 84, 139, 107, 45, 82, 74, 1, 105, 5, + 114, 189, 249, 173, 162, 239, 92, 95, 144, 30, 51, 237, 192, 159, 114, 202, 190, 211, 244, + 58, 72, 189, 198, 83, 58, 235, 4, 208, 243, 167, 222, 124, 220, 152, 68, 62, 103, 200, 18, + 57, 91, 124, 211, 121, 0, 178, 198, 98, 55, 9, 141, 16, 92, 83, 170, 94, 126, 43, 221, 49, + 165, 176, 244, 51, 113, 191, 54, 185, 217, 105, 45, 31, 214, 48, 76, 224, 97, 146, 242, 107, + 196, 166, 116, 241, 212, 112, 102, 173, 71, 175, 71, 238, 51, 205, 104, 173, 31, 141, 245, + 142, 193, 251, 68, 9, 144, 89, 70, 184, 215, 177, 101, 242, 116, 169, 13, 101, 198, 178, + 131, 179, 93, 193, 84, 70, 199, 88, 15, 85, 144, 51, 139, 244, 180, 51, 3, 173, 166, 51, + 241, 125, 53, 156, 231, 129, 32, 193, 99, 188, 61, 57, 105, 96, 119, 134, 200, 112, 65, 117, + 211, 114, 144, 89, 194, 84, 67, 55, 154, 197, 116, 194, 220, 106, 225, 194, 47, 142, 122, + 35, 233, 109, 102, 138, 146, 157, 206, 228, 95, 88, 189, 29, 53, 104, 229, 197, 197, 121, + 177, 120, 177, 89, 252, 87, 128, 1, 0, 206, 24, 247, 127, 13, 10, 101, 110, 100, 115, 116, + 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 52, 53, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 52, 54, 32, 48, 32, 82, 47, 67, + 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 51, 56, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, + 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, + 32, 82, 47, 84, 84, 51, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, + 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, + 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 50, 49, + 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, + 52, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 54, 48, + 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 221, 111, 35, 183, 17, + 127, 247, 95, 177, 79, 133, 182, 200, 234, 68, 238, 114, 181, 2, 130, 0, 103, 251, 218, 58, + 169, 147, 195, 157, 208, 60, 36, 125, 176, 44, 203, 86, 45, 75, 170, 100, 215, 105, 255, + 250, 112, 62, 57, 92, 173, 115, 64, 15, 7, 249, 150, 228, 204, 112, 56, 159, 191, 57, 159, + 159, 189, 251, 120, 115, 120, 46, 190, 253, 246, 221, 245, 197, 213, 101, 49, 41, 190, 251, + 238, 252, 242, 162, 56, 155, 20, 240, 239, 112, 127, 246, 110, 62, 159, 20, 206, 23, 243, + 213, 217, 100, 60, 155, 205, 58, 60, 112, 133, 159, 53, 227, 89, 91, 76, 189, 31, 55, 197, + 252, 233, 236, 151, 145, 43, 219, 209, 172, 252, 231, 252, 123, 224, 113, 133, 171, 199, 51, + 100, 115, 126, 236, 27, 31, 153, 230, 203, 179, 81, 81, 206, 255, 117, 86, 185, 153, 31, 79, + 234, 174, 168, 92, 59, 174, 125, 58, 32, 70, 226, 234, 218, 72, 50, 45, 170, 54, 76, 198, + 109, 211, 167, 17, 225, 149, 210, 157, 138, 82, 189, 139, 54, 184, 113, 91, 204, 47, 163, + 150, 231, 15, 101, 85, 143, 110, 202, 170, 29, 29, 202, 42, 140, 158, 163, 214, 235, 50, + 140, 254, 11, 59, 184, 93, 196, 213, 199, 178, 234, 232, 28, 183, 30, 75, 55, 163, 37, 144, + 10, 203, 35, 80, 254, 16, 23, 40, 242, 174, 244, 241, 164, 114, 53, 158, 193, 209, 57, 124, + 236, 74, 231, 70, 85, 220, 111, 70, 87, 145, 116, 11, 164, 123, 248, 243, 2, 127, 64, 20, + 144, 126, 138, 204, 32, 224, 24, 9, 35, 75, 229, 233, 24, 175, 188, 133, 37, 28, 2, 225, 69, + 217, 225, 119, 148, 227, 137, 29, 105, 136, 55, 217, 30, 223, 237, 67, 51, 110, 130, 35, + 203, 255, 130, 236, 5, 42, 88, 8, 165, 88, 168, 18, 210, 202, 207, 198, 193, 19, 125, 23, + 133, 55, 241, 55, 22, 106, 47, 174, 9, 227, 186, 173, 173, 67, 237, 165, 224, 173, 70, 238, + 252, 169, 116, 163, 255, 128, 45, 239, 224, 17, 135, 168, 60, 104, 48, 109, 192, 82, 33, + 218, 173, 161, 3, 222, 220, 202, 250, 183, 178, 154, 18, 9, 159, 212, 104, 167, 202, 133, 6, + 28, 53, 37, 170, 27, 48, 22, 200, 140, 86, 155, 141, 190, 41, 103, 66, 253, 74, 38, 73, 130, + 95, 201, 117, 221, 104, 195, 63, 222, 95, 197, 11, 81, 202, 109, 180, 159, 156, 195, 255, + 207, 236, 122, 71, 95, 86, 150, 99, 85, 226, 39, 112, 69, 243, 59, 112, 89, 139, 154, 220, + 129, 114, 125, 225, 112, 240, 4, 31, 106, 4, 84, 216, 90, 98, 151, 132, 34, 203, 50, 242, + 194, 222, 190, 108, 196, 14, 224, 132, 170, 142, 193, 62, 129, 96, 159, 142, 167, 45, 153, + 120, 43, 215, 32, 221, 75, 92, 193, 13, 184, 195, 47, 29, 208, 197, 59, 124, 38, 240, 222, + 131, 46, 99, 240, 17, 145, 254, 133, 66, 176, 21, 111, 89, 103, 173, 123, 198, 102, 115, 76, + 226, 239, 155, 200, 54, 193, 47, 249, 209, 249, 121, 220, 111, 145, 113, 87, 198, 136, 173, + 226, 193, 21, 92, 6, 87, 239, 193, 163, 168, 178, 248, 58, 50, 80, 42, 84, 158, 46, 2, 69, + 228, 77, 183, 114, 66, 132, 23, 26, 8, 91, 145, 192, 46, 240, 106, 224, 55, 124, 31, 183, + 23, 38, 246, 226, 18, 25, 112, 253, 28, 211, 164, 226, 91, 193, 252, 244, 84, 176, 254, 36, + 218, 222, 161, 237, 37, 69, 40, 0, 58, 19, 142, 207, 114, 155, 154, 22, 228, 139, 91, 249, + 59, 119, 25, 217, 166, 77, 187, 27, 216, 5, 21, 54, 34, 58, 165, 144, 60, 32, 74, 89, 162, + 245, 212, 37, 106, 0, 216, 129, 215, 169, 93, 145, 17, 34, 138, 25, 49, 22, 215, 24, 183, + 242, 128, 29, 93, 9, 85, 106, 37, 134, 57, 72, 30, 144, 241, 128, 28, 190, 254, 167, 34, 15, + 73, 23, 212, 27, 30, 96, 174, 217, 139, 160, 164, 222, 154, 189, 72, 151, 47, 147, 11, 134, + 205, 139, 138, 170, 104, 120, 79, 150, 176, 38, 224, 69, 57, 99, 245, 144, 202, 9, 18, 190, + 74, 158, 129, 218, 143, 176, 144, 160, 151, 236, 202, 90, 134, 84, 66, 232, 25, 215, 208, 3, + 160, 122, 127, 134, 144, 251, 27, 200, 159, 3, 219, 85, 233, 167, 162, 60, 50, 76, 185, 201, + 64, 233, 12, 95, 89, 58, 207, 203, 26, 31, 151, 172, 191, 228, 149, 13, 173, 89, 163, 177, + 67, 43, 77, 174, 20, 30, 104, 176, 95, 189, 247, 49, 146, 143, 137, 15, 63, 225, 6, 176, + 229, 109, 150, 117, 134, 74, 46, 164, 21, 138, 90, 177, 35, 118, 216, 76, 242, 156, 235, 21, + 78, 27, 219, 92, 51, 162, 148, 168, 139, 139, 139, 107, 165, 221, 162, 174, 248, 166, 3, + 115, 164, 144, 239, 189, 107, 157, 194, 178, 238, 39, 93, 159, 105, 197, 101, 148, 2, 228, + 180, 134, 74, 160, 125, 6, 41, 15, 74, 172, 185, 102, 195, 74, 196, 214, 117, 19, 67, 128, + 111, 94, 168, 145, 123, 15, 23, 11, 2, 245, 159, 74, 39, 159, 243, 178, 77, 1, 141, 239, + 149, 108, 213, 92, 103, 74, 125, 47, 120, 6, 212, 74, 29, 4, 101, 163, 63, 161, 228, 178, + 89, 129, 231, 154, 130, 50, 50, 226, 131, 64, 203, 185, 212, 91, 67, 246, 154, 39, 53, 151, + 20, 56, 89, 244, 222, 153, 30, 245, 168, 89, 207, 193, 0, 199, 82, 34, 121, 105, 99, 34, + 217, 123, 162, 150, 190, 60, 73, 233, 183, 61, 238, 106, 18, 189, 145, 248, 213, 26, 223, + 15, 46, 184, 143, 117, 2, 38, 169, 160, 220, 148, 109, 174, 184, 122, 8, 119, 212, 96, 226, + 168, 34, 146, 35, 119, 10, 100, 129, 3, 219, 30, 131, 9, 218, 101, 186, 90, 116, 129, 109, + 222, 66, 81, 218, 139, 21, 209, 240, 227, 244, 97, 12, 109, 178, 199, 130, 224, 12, 216, + 136, 231, 68, 123, 211, 122, 250, 16, 11, 236, 62, 255, 115, 52, 183, 22, 243, 244, 176, + 147, 128, 99, 249, 193, 24, 39, 129, 154, 23, 177, 223, 3, 169, 25, 82, 64, 130, 146, 249, + 197, 247, 218, 68, 37, 112, 197, 104, 193, 196, 86, 170, 198, 119, 132, 108, 83, 80, 5, 142, + 225, 191, 130, 160, 31, 25, 23, 127, 40, 167, 180, 129, 65, 157, 180, 197, 254, 255, 30, + 246, 144, 231, 35, 0, 230, 247, 220, 101, 3, 227, 24, 80, 223, 180, 165, 112, 218, 169, 2, + 37, 125, 30, 23, 201, 138, 19, 197, 90, 16, 189, 111, 67, 146, 35, 163, 168, 47, 246, 146, + 247, 241, 85, 79, 160, 121, 54, 78, 64, 187, 186, 196, 116, 238, 141, 39, 56, 11, 216, 61, + 151, 249, 23, 26, 77, 251, 149, 141, 230, 231, 114, 102, 28, 51, 28, 131, 16, 127, 206, 64, + 72, 77, 134, 168, 49, 198, 64, 94, 2, 5, 98, 59, 182, 103, 74, 48, 148, 134, 16, 62, 101, + 25, 146, 60, 193, 203, 236, 93, 26, 235, 2, 26, 56, 2, 225, 76, 91, 87, 175, 231, 152, 102, + 5, 100, 11, 230, 166, 196, 220, 112, 157, 209, 178, 123, 43, 85, 92, 212, 173, 27, 237, 177, + 121, 96, 107, 226, 224, 85, 168, 190, 128, 7, 231, 76, 173, 126, 187, 195, 100, 232, 153, + 32, 167, 90, 58, 25, 33, 61, 135, 72, 108, 135, 108, 228, 101, 113, 255, 135, 181, 226, 88, + 128, 9, 55, 90, 84, 145, 55, 129, 243, 147, 106, 23, 247, 62, 210, 96, 73, 46, 75, 77, 197, + 92, 40, 86, 204, 161, 101, 6, 249, 108, 101, 3, 178, 101, 6, 148, 99, 168, 213, 18, 106, 77, + 61, 238, 186, 153, 196, 90, 236, 90, 53, 200, 249, 145, 90, 197, 148, 188, 156, 41, 27, 163, + 252, 174, 116, 83, 187, 185, 43, 157, 87, 47, 183, 6, 196, 111, 97, 249, 82, 70, 231, 62, + 129, 58, 11, 98, 70, 61, 189, 38, 119, 188, 101, 85, 122, 117, 142, 104, 100, 103, 168, 79, + 20, 9, 45, 137, 57, 146, 99, 90, 145, 226, 16, 44, 153, 24, 23, 95, 97, 143, 195, 99, 50, + 89, 213, 202, 26, 111, 125, 233, 201, 136, 89, 96, 79, 144, 158, 81, 187, 143, 65, 165, 204, + 104, 3, 84, 224, 72, 47, 245, 206, 220, 128, 82, 14, 82, 119, 148, 140, 65, 126, 82, 129, + 45, 199, 243, 104, 220, 152, 98, 22, 16, 44, 229, 216, 141, 187, 63, 75, 213, 49, 150, 203, + 37, 75, 255, 153, 53, 198, 192, 43, 113, 224, 193, 84, 121, 32, 241, 56, 253, 193, 77, 48, + 25, 54, 58, 25, 14, 129, 1, 235, 113, 123, 53, 121, 238, 213, 68, 157, 215, 152, 16, 151, + 110, 37, 18, 216, 112, 129, 174, 134, 98, 248, 171, 159, 4, 188, 51, 70, 91, 35, 1, 41, 181, + 207, 77, 194, 184, 107, 157, 4, 36, 113, 254, 29, 234, 66, 191, 28, 132, 30, 246, 122, 178, + 13, 197, 160, 208, 222, 200, 25, 26, 204, 56, 148, 148, 65, 154, 208, 36, 241, 175, 154, + 216, 169, 22, 246, 218, 228, 93, 57, 53, 109, 241, 6, 202, 163, 84, 134, 48, 144, 217, 193, + 162, 221, 46, 57, 73, 208, 21, 227, 39, 47, 13, 170, 18, 67, 216, 42, 5, 132, 43, 186, 179, + 153, 229, 157, 254, 168, 189, 253, 32, 229, 113, 24, 230, 51, 47, 43, 0, 88, 200, 234, 149, + 192, 177, 4, 33, 16, 3, 74, 181, 143, 129, 189, 123, 233, 181, 121, 41, 134, 43, 82, 213, + 82, 84, 200, 76, 195, 208, 22, 78, 246, 198, 22, 79, 144, 82, 169, 237, 219, 91, 115, 187, + 130, 164, 67, 146, 65, 206, 23, 196, 255, 111, 158, 73, 9, 139, 153, 166, 252, 127, 155, + 205, 53, 134, 130, 94, 32, 23, 104, 136, 0, 145, 193, 105, 221, 16, 74, 235, 213, 96, 23, + 98, 63, 170, 53, 228, 223, 115, 48, 207, 48, 175, 52, 144, 89, 246, 165, 230, 164, 150, 64, + 204, 55, 187, 213, 75, 169, 206, 141, 187, 208, 138, 120, 46, 23, 141, 192, 5, 254, 70, 253, + 165, 141, 115, 199, 55, 189, 39, 123, 86, 178, 16, 159, 24, 183, 138, 107, 249, 100, 209, + 115, 64, 229, 235, 105, 44, 239, 93, 86, 222, 181, 211, 201, 68, 209, 187, 95, 163, 136, + 139, 40, 77, 52, 140, 12, 251, 216, 58, 13, 70, 54, 98, 97, 83, 167, 132, 223, 192, 96, 162, + 191, 33, 135, 200, 209, 228, 180, 156, 88, 4, 18, 78, 87, 200, 97, 217, 119, 84, 231, 96, + 77, 15, 182, 195, 161, 224, 81, 100, 79, 48, 220, 60, 99, 47, 111, 84, 99, 152, 40, 51, 243, + 220, 49, 99, 174, 27, 174, 9, 52, 211, 104, 136, 167, 218, 252, 7, 160, 145, 35, 193, 79, + 166, 25, 236, 230, 241, 8, 183, 213, 252, 234, 118, 202, 47, 59, 59, 32, 225, 66, 211, 110, + 7, 237, 190, 138, 203, 47, 128, 53, 120, 87, 130, 107, 86, 23, 42, 244, 4, 130, 22, 101, + 154, 219, 26, 165, 72, 168, 71, 26, 195, 35, 1, 43, 234, 100, 169, 159, 161, 49, 24, 226, + 130, 39, 186, 168, 89, 155, 56, 95, 116, 150, 82, 44, 245, 68, 57, 17, 216, 41, 240, 170, + 125, 191, 62, 190, 224, 246, 31, 182, 153, 96, 173, 69, 17, 27, 248, 209, 54, 46, 108, 142, + 133, 222, 124, 166, 6, 179, 5, 73, 230, 62, 153, 98, 109, 245, 166, 72, 9, 12, 164, 193, + 102, 189, 150, 25, 12, 208, 239, 183, 76, 113, 223, 192, 107, 184, 19, 212, 245, 233, 236, + 84, 77, 34, 146, 118, 58, 64, 65, 50, 95, 208, 237, 10, 80, 80, 247, 86, 144, 33, 233, 252, + 153, 43, 86, 141, 3, 214, 30, 62, 246, 178, 218, 194, 199, 61, 121, 129, 33, 73, 148, 46, + 19, 30, 12, 84, 211, 175, 28, 168, 112, 48, 221, 145, 78, 174, 63, 162, 36, 112, 113, 148, + 130, 13, 214, 128, 24, 216, 227, 183, 184, 240, 94, 10, 126, 247, 70, 87, 11, 121, 245, 131, + 245, 94, 227, 77, 93, 144, 119, 185, 52, 244, 38, 221, 6, 0, 133, 200, 59, 141, 149, 123, + 157, 223, 8, 129, 43, 206, 88, 153, 73, 77, 220, 155, 247, 231, 48, 84, 5, 66, 195, 143, 2, + 61, 45, 226, 147, 49, 119, 104, 152, 146, 232, 206, 198, 165, 186, 73, 15, 94, 218, 202, 44, + 37, 172, 225, 21, 67, 110, 83, 177, 80, 78, 47, 11, 189, 206, 81, 117, 195, 85, 162, 77, 70, + 162, 109, 42, 139, 194, 68, 123, 251, 210, 218, 246, 152, 101, 220, 125, 6, 6, 180, 194, 55, + 121, 237, 20, 217, 77, 234, 21, 107, 177, 252, 131, 216, 51, 233, 214, 3, 3, 144, 150, 61, + 56, 0, 84, 56, 245, 165, 63, 111, 219, 235, 20, 165, 107, 244, 153, 215, 7, 170, 185, 107, + 177, 226, 66, 67, 119, 99, 7, 37, 14, 20, 174, 60, 55, 210, 130, 165, 172, 164, 58, 183, 60, + 13, 125, 174, 10, 224, 91, 103, 6, 75, 169, 12, 19, 45, 10, 160, 227, 63, 200, 178, 62, 37, + 253, 45, 60, 7, 234, 193, 93, 73, 197, 239, 19, 182, 20, 79, 133, 96, 83, 242, 44, 121, 75, + 173, 24, 209, 192, 20, 63, 176, 62, 112, 80, 13, 215, 135, 238, 43, 235, 195, 39, 105, 110, + 2, 71, 208, 48, 148, 56, 253, 236, 231, 238, 13, 84, 41, 119, 247, 218, 180, 54, 140, 137, + 94, 20, 221, 175, 25, 35, 27, 1, 169, 61, 62, 152, 36, 221, 148, 167, 131, 203, 218, 132, + 165, 77, 215, 116, 170, 48, 42, 107, 88, 74, 104, 114, 157, 122, 155, 226, 25, 115, 98, 210, + 49, 176, 162, 57, 42, 146, 206, 55, 96, 136, 212, 81, 223, 46, 15, 166, 31, 19, 182, 214, + 98, 136, 241, 40, 131, 71, 29, 17, 196, 21, 124, 111, 75, 93, 175, 24, 211, 31, 108, 184, + 231, 141, 242, 20, 160, 0, 163, 45, 49, 110, 8, 31, 186, 97, 63, 64, 187, 84, 79, 48, 157, + 66, 101, 189, 51, 225, 132, 190, 89, 128, 62, 15, 7, 241, 175, 20, 105, 160, 24, 128, 186, + 107, 173, 22, 90, 223, 151, 73, 127, 186, 38, 129, 190, 188, 34, 156, 151, 84, 99, 150, 89, + 77, 19, 15, 187, 88, 89, 124, 52, 199, 36, 254, 60, 222, 224, 202, 232, 175, 74, 151, 112, + 152, 160, 84, 205, 94, 224, 111, 5, 130, 201, 90, 124, 98, 240, 234, 134, 231, 30, 197, 31, + 39, 29, 142, 25, 226, 152, 167, 181, 77, 230, 181, 30, 3, 19, 83, 45, 39, 172, 34, 253, 73, + 82, 193, 245, 48, 56, 172, 135, 156, 68, 55, 103, 41, 203, 109, 14, 56, 190, 232, 126, 123, + 93, 31, 117, 127, 184, 190, 40, 206, 62, 204, 207, 126, 23, 96, 0, 65, 105, 168, 49, 13, 10, + 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 52, 55, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 52, 56, 32, + 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 57, 32, 48, 32, 82, 47, 82, 101, 115, + 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, + 49, 57, 54, 32, 48, 32, 82, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, + 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, + 51, 32, 49, 56, 55, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 57, 50, 32, 48, 32, 82, 62, 62, + 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, + 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, + 110, 116, 115, 32, 50, 50, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, + 110, 100, 111, 98, 106, 13, 52, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, + 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, + 116, 104, 32, 50, 50, 49, 49, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, + 91, 107, 28, 55, 20, 126, 223, 95, 49, 143, 171, 146, 153, 172, 52, 183, 157, 16, 2, 137, + 109, 74, 90, 156, 26, 178, 4, 130, 91, 138, 227, 173, 237, 141, 237, 205, 178, 94, 215, 77, + 126, 125, 117, 174, 146, 230, 82, 74, 83, 130, 195, 172, 116, 116, 116, 174, 223, 249, 244, + 102, 53, 123, 126, 118, 177, 63, 100, 47, 95, 62, 63, 61, 122, 123, 156, 45, 178, 87, 175, + 222, 28, 31, 101, 179, 69, 6, 255, 246, 215, 179, 231, 171, 213, 34, 179, 46, 91, 93, 205, + 22, 69, 215, 117, 75, 220, 176, 153, 235, 170, 162, 107, 178, 214, 185, 162, 202, 86, 247, + 179, 243, 185, 51, 205, 124, 97, 126, 91, 253, 4, 103, 108, 102, 203, 162, 195, 99, 214, 21, + 174, 114, 254, 208, 106, 61, 155, 103, 102, 245, 121, 150, 219, 206, 21, 139, 114, 153, 229, + 182, 41, 74, 23, 54, 232, 32, 157, 90, 54, 94, 164, 205, 242, 166, 94, 20, 77, 213, 151, 17, + 229, 185, 202, 77, 171, 90, 100, 77, 109, 139, 38, 91, 29, 123, 43, 15, 38, 175, 231, 55, + 166, 154, 255, 97, 114, 231, 69, 115, 87, 87, 243, 35, 147, 183, 180, 176, 245, 59, 40, 178, + 55, 203, 249, 133, 201, 237, 252, 206, 127, 176, 216, 143, 38, 239, 230, 95, 188, 155, 127, + 154, 124, 73, 242, 32, 6, 103, 238, 65, 52, 213, 80, 128, 16, 159, 124, 15, 219, 184, 122, + 161, 95, 40, 253, 96, 236, 66, 132, 158, 96, 117, 227, 21, 222, 241, 31, 175, 171, 25, 15, + 114, 63, 111, 124, 234, 185, 225, 247, 93, 55, 127, 244, 171, 59, 254, 251, 226, 143, 150, + 104, 100, 184, 114, 237, 215, 249, 192, 134, 173, 135, 159, 109, 133, 114, 40, 2, 71, 239, + 36, 0, 151, 254, 191, 86, 69, 175, 193, 6, 62, 14, 166, 220, 249, 93, 203, 58, 33, 247, 11, + 159, 137, 182, 168, 29, 69, 59, 4, 10, 66, 14, 58, 46, 141, 67, 213, 236, 61, 42, 227, 168, + 128, 122, 82, 196, 11, 24, 212, 79, 254, 191, 26, 157, 82, 139, 182, 184, 4, 154, 130, 22, + 142, 182, 95, 207, 164, 6, 181, 110, 51, 31, 150, 162, 229, 2, 56, 3, 193, 61, 133, 186, + 134, 0, 185, 240, 235, 224, 29, 250, 106, 242, 6, 77, 104, 252, 143, 23, 38, 39, 123, 62, + 162, 224, 163, 201, 75, 20, 186, 129, 15, 88, 71, 109, 184, 247, 132, 201, 0, 101, 37, 155, + 80, 54, 93, 209, 180, 85, 82, 249, 178, 6, 22, 213, 88, 174, 231, 243, 165, 87, 216, 249, + 191, 66, 12, 119, 210, 3, 117, 81, 54, 101, 124, 62, 170, 106, 7, 109, 193, 202, 207, 231, + 43, 127, 94, 42, 163, 228, 184, 96, 248, 168, 10, 26, 42, 46, 45, 89, 20, 163, 141, 71, 12, + 102, 180, 248, 21, 154, 129, 118, 170, 208, 46, 188, 217, 75, 20, 174, 105, 55, 65, 130, + 118, 97, 125, 216, 106, 126, 241, 87, 231, 172, 248, 89, 170, 43, 182, 176, 141, 21, 95, 94, + 115, 238, 59, 111, 149, 195, 162, 65, 77, 172, 224, 12, 66, 143, 26, 185, 154, 115, 76, 71, + 227, 5, 3, 246, 160, 218, 166, 46, 218, 182, 20, 173, 254, 98, 103, 58, 209, 162, 165, 174, + 205, 5, 247, 124, 211, 32, 141, 186, 0, 34, 123, 172, 119, 74, 112, 94, 46, 92, 209, 85, 86, + 75, 30, 238, 129, 192, 164, 218, 49, 15, 88, 164, 207, 76, 151, 52, 123, 220, 188, 112, 11, + 138, 115, 207, 248, 158, 227, 157, 43, 78, 33, 104, 69, 93, 73, 51, 140, 54, 246, 40, 202, + 189, 51, 49, 252, 128, 51, 160, 117, 107, 170, 1, 208, 157, 248, 223, 164, 239, 81, 91, 109, + 252, 36, 31, 192, 164, 4, 56, 144, 70, 199, 82, 138, 156, 22, 79, 96, 15, 156, 192, 160, + 244, 109, 39, 213, 185, 118, 114, 138, 40, 120, 228, 182, 143, 148, 9, 58, 61, 243, 135, 17, + 84, 91, 246, 108, 173, 72, 184, 147, 146, 142, 47, 109, 57, 76, 96, 21, 137, 109, 217, 78, + 31, 109, 23, 188, 33, 209, 29, 154, 54, 244, 117, 211, 3, 53, 144, 213, 52, 132, 224, 249, + 141, 142, 2, 193, 224, 10, 39, 65, 143, 184, 49, 54, 37, 72, 219, 103, 88, 132, 139, 63, + 113, 116, 96, 241, 210, 184, 94, 185, 69, 57, 18, 95, 162, 88, 136, 17, 45, 71, 95, 83, 43, + 160, 236, 36, 97, 109, 21, 163, 237, 122, 144, 17, 1, 212, 126, 225, 162, 189, 53, 105, 79, + 103, 81, 51, 62, 137, 44, 77, 50, 45, 8, 73, 102, 136, 166, 206, 9, 208, 65, 250, 36, 9, + 170, 17, 142, 147, 169, 26, 197, 52, 37, 60, 33, 192, 9, 25, 86, 131, 33, 33, 85, 22, 134, + 196, 5, 64, 203, 26, 202, 251, 198, 216, 134, 126, 110, 9, 253, 155, 249, 41, 252, 10, 75, + 7, 180, 135, 103, 9, 220, 244, 179, 225, 109, 28, 28, 15, 16, 36, 156, 28, 184, 118, 199, + 66, 31, 200, 231, 122, 126, 139, 203, 40, 21, 70, 206, 103, 99, 171, 232, 138, 11, 153, 78, + 21, 14, 12, 96, 92, 182, 97, 111, 86, 63, 120, 203, 59, 92, 251, 190, 97, 130, 221, 172, 4, + 8, 178, 164, 57, 230, 106, 178, 190, 56, 78, 181, 80, 35, 210, 36, 29, 193, 50, 63, 95, 8, + 94, 97, 10, 110, 122, 88, 3, 34, 31, 176, 74, 225, 204, 173, 42, 148, 22, 130, 253, 143, 60, + 217, 176, 250, 245, 186, 11, 138, 18, 74, 80, 40, 124, 194, 22, 52, 0, 97, 237, 9, 176, 132, + 33, 66, 186, 139, 183, 168, 123, 164, 175, 96, 69, 177, 148, 106, 136, 154, 74, 209, 115, + 29, 92, 62, 160, 214, 47, 225, 154, 49, 52, 138, 231, 131, 231, 166, 139, 54, 25, 15, 122, + 215, 173, 96, 131, 56, 91, 90, 234, 145, 43, 186, 15, 126, 78, 142, 98, 216, 84, 186, 168, + 27, 17, 157, 3, 129, 193, 16, 128, 69, 109, 172, 191, 64, 183, 160, 65, 34, 174, 112, 18, + 159, 251, 170, 20, 25, 173, 223, 11, 29, 45, 12, 186, 139, 50, 0, 224, 30, 220, 126, 49, + 144, 35, 219, 205, 115, 73, 27, 129, 86, 106, 24, 215, 23, 227, 235, 22, 205, 135, 208, 69, + 48, 174, 97, 17, 137, 181, 114, 65, 188, 91, 245, 160, 113, 99, 216, 180, 147, 82, 81, 152, + 80, 255, 213, 131, 27, 189, 26, 164, 229, 214, 178, 135, 126, 85, 178, 26, 160, 31, 77, 157, + 120, 1, 240, 137, 56, 169, 101, 197, 124, 58, 165, 94, 97, 16, 106, 53, 148, 99, 25, 230, + 13, 117, 66, 11, 52, 62, 214, 187, 143, 130, 39, 94, 76, 6, 47, 189, 49, 233, 26, 216, 145, + 183, 134, 27, 157, 202, 41, 223, 212, 54, 87, 56, 255, 150, 96, 190, 188, 140, 172, 215, + 187, 66, 54, 29, 106, 20, 214, 30, 64, 58, 233, 193, 16, 92, 22, 25, 123, 43, 217, 114, 226, + 173, 100, 203, 138, 135, 123, 255, 233, 198, 155, 26, 207, 39, 78, 155, 170, 186, 134, 247, + 89, 124, 177, 232, 121, 228, 70, 25, 102, 14, 164, 98, 202, 198, 75, 111, 225, 98, 97, 206, + 211, 89, 0, 209, 8, 208, 92, 2, 238, 194, 17, 110, 99, 102, 96, 235, 184, 166, 214, 147, + 141, 4, 114, 72, 173, 209, 18, 89, 228, 103, 95, 160, 21, 240, 165, 211, 19, 188, 125, 72, + 56, 21, 104, 9, 217, 144, 36, 5, 106, 177, 79, 136, 199, 180, 14, 52, 2, 144, 2, 10, 32, + 217, 41, 253, 194, 177, 228, 161, 37, 238, 176, 143, 56, 222, 65, 161, 125, 224, 97, 91, 41, + 253, 14, 54, 132, 228, 68, 129, 24, 246, 54, 172, 106, 209, 92, 233, 61, 81, 244, 199, 169, + 103, 204, 45, 242, 186, 174, 226, 167, 88, 93, 15, 71, 68, 212, 87, 176, 61, 6, 241, 204, + 238, 106, 101, 204, 224, 202, 62, 156, 9, 249, 13, 92, 106, 207, 241, 136, 41, 32, 72, 141, + 81, 252, 186, 173, 6, 76, 74, 174, 136, 184, 84, 53, 197, 164, 52, 93, 53, 167, 107, 129, + 199, 121, 225, 189, 78, 183, 81, 135, 147, 62, 216, 232, 16, 24, 67, 111, 21, 253, 103, 55, + 7, 239, 24, 154, 192, 245, 252, 72, 103, 86, 196, 80, 82, 150, 94, 143, 67, 94, 173, 120, + 23, 184, 44, 254, 98, 92, 175, 153, 217, 82, 166, 234, 192, 229, 165, 151, 82, 218, 186, 86, + 94, 10, 249, 188, 138, 71, 16, 97, 106, 52, 50, 92, 71, 17, 28, 123, 7, 196, 181, 230, 34, + 54, 174, 204, 85, 137, 157, 208, 90, 44, 220, 247, 16, 135, 91, 160, 152, 119, 252, 7, 70, + 189, 53, 204, 41, 145, 221, 110, 76, 29, 200, 229, 49, 38, 24, 150, 174, 97, 9, 62, 14, 66, + 101, 229, 56, 82, 228, 59, 57, 117, 192, 166, 201, 177, 88, 29, 145, 224, 123, 97, 160, 66, + 50, 173, 55, 211, 86, 77, 143, 130, 138, 165, 185, 108, 139, 55, 107, 102, 179, 246, 59, + 217, 108, 127, 194, 116, 85, 148, 143, 107, 153, 80, 33, 220, 92, 171, 93, 242, 42, 228, + 140, 98, 183, 6, 224, 14, 179, 41, 60, 235, 34, 216, 239, 210, 238, 151, 242, 10, 228, 65, + 1, 140, 132, 199, 167, 111, 151, 14, 95, 185, 71, 6, 80, 194, 242, 194, 84, 179, 49, 205, + 83, 26, 36, 125, 23, 19, 219, 110, 130, 104, 116, 85, 95, 247, 144, 213, 66, 167, 38, 172, + 54, 101, 208, 210, 30, 4, 169, 73, 179, 72, 15, 109, 163, 214, 144, 175, 200, 186, 58, 129, + 147, 16, 193, 37, 151, 112, 30, 115, 155, 141, 88, 193, 53, 60, 145, 98, 23, 186, 156, 58, + 88, 173, 71, 137, 56, 137, 247, 140, 77, 117, 15, 136, 95, 24, 171, 111, 200, 35, 247, 187, + 212, 112, 185, 44, 150, 203, 101, 150, 151, 88, 122, 47, 125, 148, 150, 175, 168, 52, 43, + 150, 24, 212, 42, 6, 81, 107, 85, 193, 10, 205, 129, 180, 211, 200, 79, 230, 57, 33, 74, + 204, 140, 162, 220, 122, 193, 220, 255, 162, 154, 9, 36, 44, 9, 105, 234, 75, 208, 32, 81, + 153, 26, 89, 227, 188, 162, 30, 9, 4, 213, 70, 9, 145, 40, 92, 245, 31, 131, 33, 108, 7, 46, + 140, 10, 32, 137, 195, 88, 229, 198, 125, 25, 18, 12, 41, 13, 143, 24, 165, 110, 32, 30, 24, + 50, 148, 45, 8, 63, 38, 53, 149, 220, 136, 207, 94, 44, 74, 252, 58, 49, 109, 76, 46, 164, + 192, 164, 209, 166, 66, 83, 125, 95, 104, 174, 36, 185, 96, 240, 38, 193, 148, 222, 220, 24, + 216, 175, 199, 224, 47, 76, 21, 13, 6, 158, 34, 254, 82, 79, 13, 207, 157, 62, 92, 84, 0, + 63, 18, 82, 124, 163, 253, 188, 227, 180, 224, 242, 4, 175, 31, 29, 109, 241, 120, 168, 155, + 162, 241, 99, 1, 166, 131, 160, 206, 59, 174, 92, 26, 63, 27, 4, 26, 52, 199, 207, 179, 100, + 86, 189, 166, 86, 47, 233, 191, 61, 65, 55, 11, 202, 209, 75, 122, 79, 161, 37, 22, 140, + 167, 153, 136, 39, 116, 222, 237, 41, 56, 100, 121, 75, 95, 195, 187, 25, 182, 90, 210, 137, + 170, 64, 241, 61, 85, 95, 111, 42, 58, 187, 44, 58, 87, 77, 77, 69, 217, 238, 79, 69, 247, + 63, 76, 197, 232, 121, 68, 36, 91, 8, 35, 62, 146, 32, 115, 10, 51, 225, 101, 214, 133, 186, + 218, 201, 110, 168, 246, 32, 69, 4, 41, 16, 204, 38, 76, 43, 22, 139, 42, 77, 159, 61, 45, + 255, 172, 171, 128, 202, 183, 209, 80, 2, 185, 49, 202, 172, 155, 82, 239, 172, 68, 183, + 181, 88, 99, 119, 2, 30, 224, 69, 90, 186, 242, 80, 240, 34, 58, 70, 84, 1, 20, 240, 33, + 192, 94, 60, 14, 37, 65, 111, 76, 217, 235, 140, 171, 152, 77, 123, 213, 37, 63, 20, 246, + 226, 228, 86, 94, 132, 9, 59, 100, 201, 48, 40, 215, 35, 187, 60, 242, 240, 59, 154, 244, + 94, 58, 247, 55, 140, 241, 109, 21, 127, 103, 82, 172, 152, 122, 49, 148, 45, 191, 29, 119, + 38, 60, 200, 82, 112, 144, 167, 94, 232, 230, 62, 0, 224, 141, 103, 212, 129, 132, 199, 216, + 254, 252, 224, 116, 49, 149, 39, 170, 16, 94, 4, 196, 110, 207, 9, 119, 39, 16, 228, 223, + 145, 121, 24, 141, 225, 125, 40, 100, 34, 230, 67, 182, 74, 139, 171, 48, 37, 219, 114, 114, + 122, 148, 205, 78, 86, 179, 191, 5, 24, 0, 127, 102, 180, 80, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 52, 57, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 53, 48, 32, 48, 32, 82, 47, + 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 51, 57, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, + 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, + 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, + 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, + 97, 114, 101, 110, 116, 115, 32, 50, 51, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, + 62, 13, 101, 110, 100, 111, 98, 106, 13, 53, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, + 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, + 101, 110, 103, 116, 104, 32, 50, 52, 55, 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 72, 137, 172, 87, 109, 143, 19, 71, 18, 254, 238, 95, 49, 31, 103, 78, 204, 224, 238, 121, + 143, 162, 72, 129, 37, 17, 167, 67, 135, 132, 147, 124, 128, 251, 0, 107, 188, 75, 176, 29, + 203, 176, 225, 248, 247, 215, 85, 93, 111, 61, 51, 222, 205, 29, 39, 180, 200, 211, 93, 93, + 93, 93, 47, 207, 83, 245, 100, 179, 122, 252, 242, 237, 249, 115, 246, 253, 247, 143, 95, + 60, 125, 126, 149, 173, 179, 31, 126, 120, 114, 245, 52, 91, 173, 51, 248, 119, 190, 89, 61, + 222, 108, 214, 153, 243, 217, 102, 183, 90, 87, 227, 56, 14, 184, 225, 50, 63, 54, 213, 216, + 101, 189, 247, 85, 147, 109, 14, 171, 215, 185, 47, 186, 220, 21, 255, 218, 252, 29, 206, + 184, 204, 213, 213, 136, 199, 156, 175, 124, 227, 195, 161, 205, 118, 149, 103, 197, 230, + 247, 85, 233, 70, 95, 173, 235, 33, 43, 93, 87, 213, 94, 55, 226, 193, 120, 106, 232, 130, + 72, 159, 149, 93, 187, 174, 186, 102, 42, 195, 202, 75, 145, 155, 171, 18, 187, 179, 174, + 117, 85, 151, 109, 174, 130, 149, 155, 162, 108, 243, 63, 138, 210, 231, 119, 69, 89, 231, + 103, 248, 252, 80, 180, 249, 167, 162, 116, 249, 161, 112, 77, 56, 14, 111, 88, 87, 235, + 181, 203, 74, 63, 86, 45, 106, 125, 157, 143, 225, 125, 117, 248, 171, 248, 141, 158, 77, + 109, 171, 186, 171, 237, 3, 205, 59, 60, 88, 223, 196, 205, 215, 249, 111, 197, 24, 110, 27, + 242, 207, 112, 237, 109, 1, 151, 149, 174, 105, 155, 252, 45, 92, 127, 12, 255, 181, 178, 4, + 114, 199, 32, 130, 178, 239, 193, 226, 155, 162, 28, 131, 197, 67, 148, 214, 245, 237, 92, + 81, 163, 139, 61, 171, 2, 229, 176, 243, 71, 120, 196, 159, 69, 105, 213, 128, 0, 46, 161, + 190, 68, 215, 41, 156, 128, 63, 184, 23, 78, 134, 69, 239, 242, 235, 194, 163, 253, 143, + 194, 131, 18, 241, 160, 206, 135, 55, 68, 39, 150, 117, 8, 206, 26, 130, 211, 87, 125, 23, + 93, 176, 47, 232, 22, 20, 255, 4, 79, 66, 19, 178, 16, 132, 54, 232, 95, 135, 63, 248, 13, + 246, 163, 156, 138, 176, 71, 172, 221, 165, 115, 104, 22, 172, 163, 36, 156, 253, 194, 210, + 123, 220, 135, 43, 209, 200, 252, 29, 43, 205, 98, 200, 199, 248, 37, 54, 193, 179, 166, + 126, 109, 53, 90, 103, 185, 238, 46, 124, 97, 56, 110, 73, 230, 58, 108, 245, 248, 133, 214, + 233, 197, 168, 233, 200, 226, 114, 249, 1, 164, 64, 147, 188, 179, 2, 255, 195, 214, 115, + 248, 113, 36, 189, 168, 109, 139, 241, 132, 248, 73, 242, 124, 192, 112, 148, 174, 22, 201, + 207, 148, 217, 97, 137, 82, 24, 253, 14, 233, 11, 137, 175, 238, 62, 241, 141, 242, 90, 114, + 92, 168, 75, 114, 34, 60, 143, 67, 76, 235, 122, 158, 22, 64, 13, 236, 127, 45, 202, 62, + 110, 128, 77, 112, 138, 60, 48, 176, 36, 172, 113, 140, 142, 179, 203, 41, 247, 252, 160, + 143, 67, 149, 156, 90, 65, 1, 166, 38, 236, 158, 89, 226, 46, 117, 116, 114, 17, 59, 229, + 226, 85, 247, 220, 68, 78, 132, 0, 131, 187, 225, 62, 144, 181, 105, 138, 114, 55, 236, 37, + 216, 77, 83, 245, 81, 144, 88, 83, 8, 54, 127, 11, 158, 191, 37, 49, 147, 47, 101, 237, 26, + 163, 52, 41, 90, 252, 56, 147, 90, 118, 56, 200, 239, 176, 118, 225, 117, 231, 232, 219, + 116, 145, 147, 105, 166, 253, 204, 89, 136, 255, 37, 1, 7, 193, 41, 98, 192, 154, 113, 3, + 103, 125, 234, 6, 252, 245, 198, 123, 31, 93, 231, 199, 209, 148, 19, 248, 251, 142, 32, 99, + 209, 211, 114, 109, 82, 159, 114, 241, 173, 86, 41, 46, 202, 3, 164, 158, 20, 190, 8, 33, 1, + 115, 212, 227, 15, 228, 58, 222, 22, 0, 235, 139, 125, 229, 158, 60, 30, 183, 12, 80, 192, + 39, 86, 171, 148, 162, 217, 192, 53, 181, 38, 98, 14, 125, 188, 35, 173, 44, 222, 55, 82, 5, + 230, 176, 126, 254, 88, 128, 189, 144, 118, 39, 89, 147, 64, 196, 79, 80, 21, 209, 68, 144, + 230, 72, 165, 106, 140, 250, 43, 73, 76, 202, 242, 127, 67, 88, 196, 75, 44, 42, 160, 37, + 154, 9, 157, 20, 87, 122, 34, 212, 103, 69, 111, 168, 3, 20, 96, 164, 227, 21, 127, 17, 196, + 135, 137, 99, 190, 164, 15, 184, 55, 52, 114, 133, 26, 177, 23, 108, 148, 135, 109, 83, 167, + 115, 254, 243, 119, 252, 201, 56, 117, 96, 222, 139, 233, 169, 101, 99, 174, 61, 241, 19, + 224, 208, 71, 41, 98, 2, 249, 64, 5, 149, 230, 217, 38, 232, 188, 77, 173, 222, 17, 15, 115, + 169, 24, 131, 96, 121, 71, 157, 192, 28, 198, 47, 62, 183, 67, 147, 208, 116, 137, 158, 16, + 171, 213, 217, 222, 155, 31, 135, 232, 142, 246, 114, 12, 90, 137, 128, 23, 221, 71, 209, + 189, 165, 135, 169, 33, 105, 232, 225, 193, 194, 107, 66, 39, 20, 114, 121, 78, 68, 132, 84, + 170, 157, 0, 32, 10, 11, 174, 46, 176, 160, 133, 160, 9, 114, 153, 108, 54, 141, 98, 221, + 185, 208, 75, 166, 173, 42, 175, 77, 59, 193, 230, 27, 59, 193, 87, 226, 31, 65, 38, 112, + 27, 33, 187, 103, 0, 63, 133, 234, 18, 41, 120, 200, 78, 218, 128, 232, 73, 21, 253, 168, + 13, 17, 187, 48, 126, 73, 243, 65, 210, 83, 192, 135, 53, 155, 50, 222, 80, 6, 119, 126, + 178, 31, 227, 206, 174, 253, 196, 148, 6, 6, 157, 184, 125, 5, 133, 91, 145, 253, 47, 18, + 21, 79, 46, 55, 111, 222, 116, 111, 62, 183, 237, 229, 32, 245, 177, 165, 250, 144, 6, 87, + 43, 55, 65, 231, 164, 105, 238, 83, 144, 133, 111, 170, 107, 110, 232, 4, 16, 211, 14, 185, + 95, 96, 43, 71, 24, 15, 150, 254, 62, 143, 112, 218, 102, 75, 246, 247, 92, 244, 205, 101, + 197, 161, 231, 8, 116, 235, 2, 69, 92, 73, 165, 124, 100, 41, 99, 251, 143, 140, 93, 130, + 177, 180, 161, 199, 36, 104, 202, 223, 160, 158, 129, 153, 24, 219, 71, 115, 47, 205, 8, 23, + 249, 128, 193, 78, 170, 14, 72, 156, 162, 154, 20, 125, 221, 40, 85, 222, 145, 193, 220, + 115, 218, 8, 213, 205, 236, 156, 37, 206, 122, 50, 167, 232, 108, 193, 109, 69, 76, 156, + 175, 133, 243, 244, 57, 111, 50, 154, 252, 101, 156, 6, 35, 90, 104, 114, 198, 205, 23, 150, + 184, 82, 56, 17, 214, 51, 170, 41, 28, 233, 77, 174, 167, 181, 3, 167, 226, 150, 74, 208, + 246, 8, 117, 244, 129, 56, 6, 47, 50, 47, 39, 253, 190, 91, 36, 135, 164, 90, 119, 74, 234, + 212, 34, 183, 68, 151, 15, 227, 51, 138, 206, 160, 52, 105, 3, 15, 204, 155, 237, 180, 224, + 200, 27, 109, 191, 52, 195, 158, 31, 152, 225, 226, 120, 185, 87, 21, 147, 86, 148, 225, + 156, 130, 36, 44, 27, 172, 248, 41, 142, 84, 166, 65, 94, 54, 1, 177, 240, 156, 228, 182, + 201, 55, 105, 34, 255, 23, 166, 45, 155, 49, 169, 229, 102, 156, 102, 27, 29, 107, 242, 146, + 96, 66, 195, 108, 147, 94, 14, 206, 95, 110, 154, 184, 134, 102, 30, 30, 141, 98, 55, 145, + 204, 137, 52, 146, 140, 203, 214, 208, 34, 33, 11, 114, 146, 22, 106, 218, 188, 209, 224, + 210, 48, 148, 200, 152, 34, 187, 166, 42, 49, 53, 3, 54, 187, 4, 155, 95, 113, 191, 52, 245, + 70, 248, 101, 176, 104, 9, 44, 116, 96, 160, 11, 25, 242, 22, 65, 132, 145, 91, 60, 202, + 105, 18, 196, 127, 41, 148, 252, 108, 186, 46, 14, 31, 77, 254, 107, 184, 7, 156, 249, 78, + 90, 37, 59, 118, 180, 116, 242, 87, 204, 186, 148, 180, 108, 63, 104, 209, 222, 96, 13, 60, + 34, 205, 198, 131, 252, 135, 135, 30, 137, 75, 238, 155, 200, 168, 20, 231, 88, 204, 185, + 191, 163, 4, 82, 151, 202, 96, 24, 211, 69, 24, 138, 83, 141, 60, 32, 163, 41, 8, 113, 251, + 247, 54, 181, 113, 206, 25, 246, 189, 173, 229, 115, 118, 143, 104, 89, 8, 167, 105, 239, + 99, 199, 103, 216, 88, 29, 44, 249, 189, 88, 195, 12, 214, 220, 148, 190, 75, 26, 71, 19, + 121, 54, 6, 75, 252, 225, 240, 93, 104, 27, 235, 177, 114, 195, 144, 182, 141, 180, 102, + 219, 198, 95, 96, 46, 58, 66, 236, 63, 96, 163, 218, 193, 164, 212, 225, 253, 47, 224, 199, + 91, 248, 111, 95, 64, 175, 61, 106, 56, 73, 193, 21, 245, 157, 237, 255, 163, 239, 92, 242, + 220, 180, 23, 215, 136, 13, 18, 153, 94, 218, 175, 210, 246, 140, 60, 55, 233, 56, 49, 113, + 30, 247, 90, 9, 167, 196, 5, 69, 62, 83, 78, 119, 196, 229, 82, 248, 222, 77, 170, 87, 226, + 207, 195, 166, 35, 150, 166, 180, 50, 157, 99, 221, 152, 62, 120, 169, 208, 227, 174, 194, + 128, 22, 200, 196, 69, 113, 27, 94, 43, 29, 71, 154, 135, 156, 221, 218, 156, 246, 9, 0, + 154, 14, 223, 17, 131, 192, 82, 130, 233, 174, 17, 26, 23, 158, 230, 58, 142, 222, 159, 96, + 207, 101, 154, 96, 138, 38, 163, 83, 178, 50, 85, 14, 2, 169, 105, 243, 254, 51, 130, 136, + 58, 82, 80, 144, 249, 135, 137, 155, 122, 141, 135, 28, 53, 24, 173, 233, 221, 39, 201, 34, + 121, 63, 252, 80, 120, 225, 86, 193, 208, 66, 4, 244, 88, 238, 115, 24, 68, 103, 200, 189, + 252, 164, 180, 235, 158, 53, 221, 204, 169, 42, 137, 101, 113, 20, 241, 127, 134, 84, 68, + 38, 132, 31, 8, 233, 92, 66, 97, 243, 77, 78, 53, 113, 52, 78, 236, 35, 235, 164, 52, 206, + 17, 35, 8, 14, 111, 36, 208, 167, 91, 39, 10, 78, 2, 255, 176, 9, 234, 38, 8, 254, 166, 40, + 188, 81, 241, 51, 92, 244, 156, 232, 175, 79, 115, 43, 158, 110, 244, 172, 121, 192, 116, + 72, 36, 107, 82, 31, 157, 77, 190, 167, 157, 104, 210, 15, 240, 163, 35, 136, 11, 62, 236, + 76, 30, 143, 203, 47, 155, 218, 70, 239, 26, 231, 246, 141, 144, 74, 224, 8, 147, 76, 227, + 52, 153, 4, 230, 183, 210, 36, 129, 138, 27, 122, 246, 72, 181, 127, 82, 214, 241, 226, 123, + 188, 192, 167, 201, 202, 96, 193, 134, 222, 138, 45, 169, 155, 225, 178, 69, 71, 167, 221, + 226, 104, 154, 156, 189, 60, 97, 230, 118, 110, 89, 164, 83, 189, 7, 211, 221, 154, 73, 139, + 75, 195, 18, 215, 80, 53, 235, 9, 111, 197, 37, 75, 91, 47, 225, 252, 57, 82, 2, 98, 183, + 215, 175, 132, 196, 250, 240, 241, 93, 232, 16, 241, 227, 167, 136, 91, 109, 36, 60, 164, + 54, 252, 117, 29, 107, 171, 85, 182, 3, 233, 87, 128, 226, 239, 131, 119, 174, 35, 19, 116, + 124, 143, 41, 232, 96, 18, 23, 52, 16, 97, 247, 141, 68, 8, 85, 203, 136, 25, 89, 130, 17, + 209, 39, 160, 116, 176, 109, 104, 171, 243, 196, 133, 81, 178, 101, 160, 28, 204, 56, 179, + 132, 147, 124, 171, 18, 160, 100, 135, 73, 49, 29, 118, 181, 3, 75, 25, 237, 88, 152, 249, + 203, 78, 85, 131, 25, 92, 226, 33, 120, 174, 94, 23, 215, 76, 250, 213, 118, 72, 226, 116, + 62, 74, 81, 237, 165, 54, 177, 94, 136, 120, 47, 81, 157, 0, 64, 98, 132, 107, 205, 184, + 203, 93, 65, 107, 56, 140, 190, 39, 46, 156, 121, 80, 25, 164, 181, 190, 0, 137, 61, 54, + 181, 244, 208, 116, 182, 36, 121, 117, 18, 45, 160, 168, 176, 149, 216, 199, 205, 119, 107, + 154, 82, 60, 150, 78, 179, 162, 213, 13, 22, 144, 248, 25, 147, 158, 123, 122, 76, 227, 113, + 230, 136, 49, 27, 88, 167, 73, 207, 186, 39, 186, 80, 183, 194, 57, 12, 198, 35, 219, 54, + 26, 44, 70, 169, 201, 152, 121, 17, 123, 174, 11, 175, 151, 163, 188, 33, 5, 27, 38, 26, 61, + 207, 54, 154, 66, 242, 23, 49, 250, 36, 53, 113, 102, 89, 126, 110, 140, 149, 96, 47, 237, + 121, 159, 132, 207, 37, 5, 40, 160, 127, 111, 185, 57, 3, 166, 88, 205, 50, 186, 126, 148, + 136, 40, 42, 243, 168, 24, 132, 55, 225, 226, 91, 75, 216, 113, 249, 73, 81, 99, 134, 109, + 153, 58, 108, 251, 42, 160, 108, 25, 224, 36, 69, 164, 17, 144, 249, 200, 56, 53, 14, 60, + 140, 74, 139, 160, 223, 78, 32, 199, 134, 180, 53, 83, 153, 198, 59, 25, 233, 236, 19, 91, + 250, 243, 115, 102, 72, 225, 246, 105, 65, 4, 0, 8, 189, 181, 3, 12, 40, 248, 25, 22, 238, + 4, 229, 207, 196, 67, 132, 247, 32, 245, 30, 243, 137, 39, 186, 178, 49, 36, 34, 195, 15, + 50, 0, 254, 122, 22, 198, 140, 79, 66, 112, 243, 9, 168, 255, 70, 224, 255, 199, 164, 34, + 35, 104, 127, 141, 12, 196, 158, 3, 135, 81, 253, 135, 77, 238, 159, 218, 105, 151, 114, 34, + 240, 213, 40, 104, 187, 36, 62, 87, 100, 62, 216, 110, 216, 118, 30, 45, 207, 167, 84, 141, + 237, 2, 179, 244, 179, 130, 227, 204, 55, 207, 184, 225, 136, 107, 145, 73, 21, 42, 254, 24, + 178, 18, 236, 147, 171, 52, 135, 148, 206, 162, 113, 218, 118, 44, 33, 62, 142, 95, 216, + 138, 224, 175, 24, 70, 83, 80, 78, 253, 200, 109, 187, 25, 80, 132, 47, 78, 52, 251, 153, + 193, 46, 97, 7, 3, 43, 71, 177, 236, 142, 190, 18, 216, 52, 62, 76, 33, 191, 153, 150, 86, + 92, 188, 28, 48, 112, 244, 100, 144, 125, 192, 111, 65, 226, 11, 131, 91, 50, 141, 242, 229, + 168, 94, 241, 39, 238, 224, 79, 240, 247, 142, 149, 198, 158, 32, 116, 113, 209, 239, 207, + 94, 60, 205, 86, 207, 54, 171, 255, 8, 48, 0, 238, 159, 30, 184, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, 49, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 53, 50, 32, 48, 32, 82, 47, + 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 51, 57, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, 49, 57, 54, 32, 48, + 32, 82, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, + 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, + 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 55, 32, 48, 32, 82, 47, 84, 84, 53, 32, 49, 57, + 50, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, + 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, + 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 50, 52, 47, 84, 121, 112, 101, 47, 80, 97, + 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 53, 50, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, + 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 51, 52, 52, 62, 62, 115, 116, 114, 101, 97, + 109, 13, 10, 72, 137, 172, 87, 91, 111, 27, 199, 21, 126, 231, 175, 216, 71, 110, 225, 93, + 115, 102, 103, 111, 133, 97, 192, 150, 156, 192, 45, 18, 20, 22, 159, 106, 20, 173, 101, + 133, 182, 106, 74, 97, 41, 177, 105, 254, 125, 231, 92, 231, 204, 238, 210, 114, 154, 194, + 144, 193, 157, 203, 185, 159, 239, 124, 243, 122, 187, 122, 254, 151, 15, 199, 199, 226, + 197, 139, 231, 63, 92, 188, 189, 44, 54, 197, 203, 151, 175, 47, 47, 138, 213, 166, 128, + 127, 199, 79, 171, 231, 219, 237, 166, 112, 190, 216, 238, 86, 155, 122, 28, 199, 1, 55, 92, + 225, 199, 80, 143, 93, 209, 123, 95, 135, 98, 123, 183, 122, 191, 246, 101, 23, 255, 254, + 182, 253, 19, 220, 113, 133, 107, 234, 17, 175, 57, 95, 251, 224, 227, 165, 237, 205, 106, + 93, 148, 219, 127, 174, 42, 55, 250, 122, 211, 12, 69, 229, 186, 186, 241, 105, 131, 46, + 210, 173, 161, 139, 71, 250, 162, 234, 218, 77, 221, 133, 233, 25, 17, 94, 233, 185, 243, + 162, 54, 69, 215, 186, 186, 43, 182, 151, 209, 202, 93, 25, 214, 199, 114, 88, 255, 28, 173, + 189, 43, 43, 23, 79, 87, 77, 88, 187, 100, 120, 207, 162, 27, 31, 245, 246, 69, 91, 183, 40, + 246, 253, 250, 33, 158, 108, 214, 143, 198, 69, 60, 23, 245, 111, 92, 81, 165, 115, 36, 241, + 21, 8, 63, 160, 182, 202, 185, 245, 109, 212, 185, 47, 157, 232, 243, 113, 177, 89, 111, 48, + 100, 221, 186, 137, 127, 180, 254, 88, 86, 237, 250, 115, 220, 108, 213, 202, 83, 148, 241, + 169, 172, 198, 184, 28, 224, 84, 27, 80, 216, 125, 252, 2, 103, 96, 251, 1, 182, 111, 81, + 15, 220, 184, 167, 131, 190, 137, 95, 160, 102, 87, 182, 241, 155, 205, 246, 133, 115, 245, + 38, 96, 140, 219, 80, 59, 39, 169, 249, 7, 135, 205, 179, 95, 179, 56, 142, 245, 32, 121, + 124, 191, 30, 163, 158, 103, 229, 24, 93, 16, 71, 54, 234, 196, 199, 184, 214, 179, 223, 96, + 15, 120, 242, 83, 180, 135, 183, 197, 250, 204, 227, 96, 79, 144, 0, 185, 122, 192, 112, + 168, 159, 117, 89, 13, 124, 110, 27, 79, 192, 85, 144, 136, 123, 180, 252, 11, 136, 164, + 128, 131, 9, 251, 114, 96, 247, 43, 191, 137, 73, 133, 108, 185, 94, 211, 133, 122, 193, + 158, 15, 144, 177, 235, 248, 99, 111, 237, 237, 121, 227, 38, 110, 220, 160, 37, 32, 249, + 81, 84, 80, 132, 245, 58, 233, 194, 91, 201, 137, 100, 6, 158, 193, 187, 40, 255, 40, 75, + 177, 50, 134, 117, 21, 127, 5, 45, 80, 60, 96, 173, 192, 26, 56, 137, 34, 189, 10, 170, 147, + 68, 252, 239, 134, 131, 219, 231, 169, 208, 61, 117, 128, 15, 129, 141, 59, 188, 51, 175, + 17, 63, 12, 117, 219, 12, 223, 90, 35, 216, 152, 141, 20, 137, 231, 146, 24, 67, 242, 254, + 139, 228, 91, 45, 244, 75, 165, 194, 89, 198, 172, 53, 49, 107, 161, 195, 164, 245, 29, 73, + 254, 14, 68, 157, 56, 84, 121, 9, 193, 202, 179, 184, 189, 137, 215, 219, 89, 121, 181, 168, + 16, 84, 97, 193, 112, 24, 90, 237, 148, 112, 246, 22, 5, 114, 88, 12, 99, 11, 53, 231, 231, + 69, 215, 98, 61, 73, 22, 93, 200, 5, 128, 253, 96, 13, 47, 64, 109, 201, 149, 95, 203, 170, + 199, 143, 24, 51, 79, 85, 41, 88, 160, 42, 29, 154, 12, 191, 14, 214, 119, 82, 164, 114, + 181, 62, 56, 162, 57, 20, 48, 210, 245, 117, 215, 117, 146, 181, 130, 204, 157, 192, 92, 60, + 50, 100, 40, 110, 38, 67, 196, 197, 182, 110, 34, 88, 86, 126, 212, 190, 250, 17, 82, 20, + 205, 239, 162, 250, 46, 70, 6, 99, 12, 246, 84, 13, 45, 239, 75, 242, 3, 115, 9, 251, 105, + 11, 127, 125, 132, 227, 183, 20, 131, 116, 250, 109, 201, 219, 187, 178, 10, 36, 242, 8, + 238, 221, 65, 196, 206, 168, 131, 123, 239, 48, 32, 30, 218, 136, 182, 31, 168, 23, 59, 186, + 254, 235, 212, 95, 55, 182, 181, 107, 199, 115, 30, 203, 182, 245, 24, 48, 113, 136, 127, + 181, 200, 106, 68, 86, 140, 78, 215, 76, 68, 137, 34, 15, 243, 45, 72, 240, 95, 241, 76, + 138, 41, 84, 80, 49, 96, 211, 205, 160, 134, 33, 131, 208, 95, 55, 239, 185, 180, 110, 169, + 237, 188, 61, 78, 248, 11, 213, 182, 227, 178, 130, 178, 185, 227, 116, 169, 186, 201, 52, + 177, 197, 251, 137, 230, 205, 96, 122, 8, 246, 184, 104, 225, 168, 129, 224, 193, 168, 158, + 116, 3, 94, 199, 111, 129, 35, 71, 93, 113, 80, 157, 184, 241, 51, 225, 72, 118, 3, 20, 254, + 27, 74, 250, 167, 210, 137, 86, 52, 255, 161, 196, 214, 215, 203, 212, 198, 120, 134, 208, + 4, 6, 118, 159, 141, 128, 121, 179, 24, 100, 38, 219, 27, 227, 254, 129, 195, 246, 32, 97, + 96, 35, 161, 29, 179, 56, 184, 144, 225, 10, 46, 236, 116, 134, 76, 146, 5, 248, 114, 155, + 212, 86, 196, 21, 156, 51, 135, 4, 35, 242, 85, 202, 179, 128, 206, 94, 51, 62, 53, 37, 149, + 8, 229, 157, 204, 133, 181, 89, 238, 83, 169, 201, 180, 5, 1, 52, 110, 197, 124, 25, 184, + 46, 165, 59, 217, 96, 172, 223, 137, 155, 185, 157, 26, 183, 201, 76, 164, 44, 109, 20, 237, + 47, 101, 68, 239, 74, 169, 244, 65, 75, 27, 54, 76, 214, 0, 185, 90, 58, 181, 103, 31, 126, + 49, 235, 105, 206, 225, 39, 77, 158, 193, 194, 175, 26, 5, 212, 134, 143, 37, 14, 167, 156, + 17, 126, 88, 139, 85, 235, 211, 105, 29, 228, 120, 202, 6, 216, 1, 27, 39, 52, 65, 139, 74, + 50, 96, 76, 49, 133, 16, 172, 218, 124, 156, 217, 73, 144, 12, 123, 18, 30, 40, 101, 41, + 248, 208, 28, 151, 68, 123, 71, 147, 169, 107, 118, 51, 203, 33, 150, 153, 148, 74, 104, + 131, 194, 24, 252, 190, 151, 166, 151, 92, 192, 162, 114, 172, 28, 75, 44, 73, 226, 121, + 202, 77, 78, 129, 14, 161, 87, 134, 132, 231, 48, 31, 73, 186, 160, 217, 23, 163, 106, 121, + 52, 227, 86, 84, 238, 71, 188, 148, 180, 28, 19, 61, 133, 35, 138, 33, 182, 230, 67, 255, + 245, 242, 225, 187, 7, 28, 242, 176, 35, 180, 146, 242, 0, 87, 41, 212, 219, 63, 196, 8, 91, + 58, 175, 142, 229, 208, 74, 82, 224, 30, 46, 9, 243, 65, 221, 137, 236, 76, 235, 195, 205, + 73, 74, 59, 129, 138, 25, 46, 183, 120, 25, 63, 180, 20, 49, 71, 154, 198, 92, 248, 61, 83, + 166, 68, 119, 239, 133, 169, 159, 216, 233, 73, 155, 79, 71, 75, 155, 166, 133, 6, 123, 70, + 194, 188, 14, 241, 215, 101, 19, 73, 64, 204, 86, 93, 122, 67, 102, 244, 149, 170, 35, 249, + 82, 120, 226, 55, 115, 139, 43, 40, 99, 32, 9, 31, 105, 38, 117, 134, 95, 204, 56, 196, 9, + 228, 236, 69, 196, 156, 116, 60, 80, 11, 76, 105, 69, 240, 145, 41, 13, 103, 105, 5, 111, + 131, 15, 194, 117, 129, 86, 140, 191, 147, 86, 108, 209, 23, 156, 162, 33, 142, 178, 212, + 53, 217, 244, 13, 75, 239, 49, 88, 212, 220, 115, 1, 248, 144, 90, 161, 89, 120, 64, 4, 125, + 14, 248, 186, 221, 116, 25, 185, 185, 131, 139, 71, 6, 31, 171, 249, 207, 165, 27, 41, 152, + 156, 148, 73, 232, 218, 174, 14, 206, 25, 150, 10, 151, 166, 37, 175, 46, 24, 111, 119, 96, + 175, 25, 65, 2, 4, 231, 71, 144, 122, 117, 144, 209, 114, 43, 20, 9, 138, 250, 46, 165, 54, + 86, 102, 136, 79, 158, 54, 227, 19, 57, 81, 146, 54, 88, 26, 176, 60, 207, 105, 32, 12, 249, + 194, 44, 19, 95, 5, 243, 115, 115, 38, 49, 38, 69, 15, 2, 73, 144, 145, 141, 57, 80, 13, + 182, 18, 86, 73, 128, 8, 171, 120, 96, 158, 105, 113, 56, 59, 107, 242, 249, 4, 107, 26, 3, + 109, 44, 83, 43, 75, 57, 24, 238, 226, 127, 250, 208, 21, 22, 51, 153, 129, 20, 171, 249, + 196, 218, 137, 204, 164, 13, 204, 17, 12, 102, 208, 36, 242, 210, 159, 157, 15, 176, 149, + 241, 85, 252, 6, 157, 71, 246, 13, 156, 199, 12, 127, 54, 4, 4, 142, 101, 164, 181, 95, 200, + 164, 27, 167, 188, 98, 193, 125, 190, 108, 88, 11, 124, 78, 107, 11, 12, 58, 87, 93, 97, 93, + 9, 101, 193, 237, 47, 178, 125, 47, 150, 179, 208, 217, 224, 24, 205, 188, 211, 68, 79, 110, + 234, 252, 210, 3, 215, 82, 22, 112, 242, 134, 111, 76, 179, 216, 154, 97, 169, 206, 112, + 109, 250, 220, 122, 148, 85, 151, 205, 57, 148, 23, 126, 232, 226, 249, 13, 255, 205, 80, + 210, 187, 136, 146, 225, 12, 74, 186, 16, 81, 178, 89, 64, 73, 239, 140, 43, 24, 193, 131, + 134, 26, 150, 32, 35, 209, 33, 223, 107, 117, 187, 89, 209, 105, 223, 186, 5, 234, 102, 222, + 83, 52, 82, 79, 204, 201, 236, 173, 212, 113, 137, 14, 240, 150, 37, 179, 217, 73, 54, 214, + 246, 240, 4, 38, 108, 3, 248, 223, 248, 126, 244, 238, 9, 72, 57, 255, 202, 122, 10, 21, + 133, 187, 105, 241, 47, 63, 35, 155, 217, 51, 82, 5, 255, 139, 195, 152, 26, 41, 129, 122, + 98, 45, 147, 39, 37, 248, 160, 53, 58, 121, 198, 74, 151, 155, 231, 233, 7, 102, 182, 124, + 51, 139, 56, 69, 0, 213, 105, 183, 223, 219, 158, 200, 184, 172, 181, 28, 55, 228, 69, 163, + 68, 57, 79, 179, 20, 216, 127, 192, 62, 237, 206, 199, 188, 167, 27, 121, 231, 230, 144, + 248, 237, 19, 73, 187, 142, 201, 124, 212, 250, 157, 188, 121, 248, 81, 17, 220, 18, 45, + 230, 130, 202, 54, 81, 165, 196, 51, 228, 9, 181, 84, 220, 4, 211, 196, 11, 78, 40, 25, 53, + 186, 21, 111, 208, 153, 79, 90, 141, 121, 60, 50, 97, 124, 83, 24, 182, 102, 141, 215, 15, + 92, 56, 215, 89, 143, 243, 232, 11, 169, 125, 97, 247, 70, 137, 14, 130, 223, 83, 145, 181, + 197, 7, 243, 75, 139, 66, 13, 213, 31, 201, 9, 137, 62, 92, 216, 70, 81, 77, 130, 33, 75, 6, + 82, 135, 223, 17, 207, 101, 97, 118, 192, 218, 106, 247, 125, 72, 1, 149, 246, 150, 5, 159, + 221, 152, 242, 14, 2, 1, 136, 211, 97, 246, 148, 249, 74, 25, 177, 82, 8, 139, 128, 31, 103, + 147, 176, 2, 101, 99, 241, 107, 11, 166, 231, 193, 41, 73, 73, 21, 45, 152, 255, 155, 43, + 122, 241, 1, 68, 86, 180, 137, 53, 225, 209, 4, 14, 217, 195, 104, 175, 96, 40, 113, 75, + 211, 12, 174, 160, 116, 208, 87, 99, 173, 126, 245, 97, 242, 61, 60, 17, 222, 198, 75, 216, + 92, 91, 121, 97, 232, 10, 62, 69, 46, 172, 28, 25, 89, 97, 168, 195, 120, 238, 253, 64, 155, + 162, 232, 198, 204, 70, 247, 127, 155, 141, 109, 170, 225, 207, 165, 84, 134, 12, 12, 13, + 214, 53, 183, 84, 12, 168, 31, 21, 160, 102, 20, 167, 77, 196, 92, 211, 166, 96, 184, 208, + 25, 112, 195, 62, 59, 191, 135, 69, 124, 14, 114, 32, 59, 142, 163, 172, 92, 193, 127, 23, + 16, 77, 2, 168, 118, 129, 141, 17, 48, 128, 119, 9, 150, 52, 161, 19, 214, 19, 73, 108, 234, + 195, 52, 235, 79, 165, 65, 115, 83, 180, 75, 131, 112, 105, 170, 77, 107, 45, 209, 233, 47, + 138, 34, 96, 197, 31, 9, 76, 49, 143, 23, 254, 239, 146, 248, 248, 108, 12, 67, 124, 54, 54, + 155, 218, 7, 208, 242, 34, 42, 29, 94, 82, 66, 91, 62, 52, 127, 35, 154, 244, 191, 95, 95, + 170, 162, 125, 214, 91, 121, 79, 101, 212, 177, 37, 56, 208, 88, 41, 82, 63, 152, 19, 11, + 205, 63, 200, 222, 60, 23, 113, 241, 10, 43, 234, 77, 217, 175, 255, 90, 246, 178, 248, 42, + 43, 19, 123, 93, 186, 53, 126, 47, 165, 253, 149, 12, 236, 133, 243, 232, 26, 150, 27, 44, + 166, 174, 198, 205, 27, 125, 17, 49, 58, 36, 122, 243, 191, 14, 87, 16, 248, 12, 30, 183, + 243, 12, 86, 156, 140, 223, 149, 194, 43, 173, 76, 84, 188, 152, 52, 63, 82, 74, 14, 60, + 147, 198, 196, 105, 224, 183, 114, 21, 189, 163, 213, 192, 39, 178, 174, 152, 160, 31, 31, + 193, 60, 108, 121, 232, 136, 80, 228, 1, 19, 86, 118, 103, 52, 75, 15, 114, 121, 192, 82, + 30, 217, 156, 243, 28, 207, 194, 189, 245, 106, 249, 165, 40, 67, 228, 131, 48, 183, 131, + 33, 6, 105, 28, 9, 227, 84, 230, 32, 147, 201, 154, 125, 182, 230, 132, 97, 143, 129, 118, + 76, 65, 179, 121, 177, 202, 149, 93, 126, 86, 239, 101, 166, 47, 160, 159, 17, 137, 192, + 119, 37, 152, 247, 35, 34, 136, 217, 126, 135, 76, 255, 117, 217, 144, 125, 75, 182, 232, + 230, 211, 241, 146, 74, 199, 227, 239, 98, 19, 34, 86, 160, 151, 70, 188, 0, 211, 155, 31, + 46, 138, 213, 155, 237, 234, 191, 2, 12, 0, 103, 30, 95, 70, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, 51, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 53, 52, 32, 48, 32, 82, 47, + 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 51, 57, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, 49, 57, 54, 32, 48, + 32, 82, 47, 67, 50, 95, 49, 32, 49, 57, 55, 32, 48, 32, 82, 47, 84, 84, 48, 32, 49, 56, 54, + 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 57, + 50, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, + 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, + 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, + 32, 50, 53, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 53, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, + 48, 52, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 109, 111, 219, + 70, 12, 254, 238, 95, 161, 143, 210, 48, 169, 186, 211, 139, 45, 160, 8, 144, 151, 110, 200, + 128, 12, 65, 235, 1, 195, 186, 97, 72, 226, 216, 201, 226, 184, 158, 19, 183, 104, 127, 253, + 142, 60, 146, 199, 147, 228, 174, 107, 135, 162, 142, 116, 226, 145, 60, 190, 60, 124, 238, + 100, 62, 121, 113, 121, 181, 123, 78, 94, 190, 124, 113, 113, 122, 126, 150, 148, 201, 209, + 209, 201, 217, 105, 50, 41, 19, 248, 183, 91, 77, 94, 204, 231, 101, 98, 108, 50, 95, 78, + 202, 162, 235, 186, 25, 126, 48, 137, 237, 234, 162, 107, 147, 169, 181, 69, 157, 204, 31, + 39, 111, 83, 155, 181, 105, 149, 253, 49, 255, 9, 246, 152, 196, 84, 69, 135, 219, 140, 45, + 108, 109, 221, 166, 249, 98, 146, 38, 217, 252, 175, 73, 110, 58, 91, 148, 213, 44, 201, 77, + 91, 84, 54, 124, 240, 27, 253, 174, 89, 235, 68, 166, 73, 222, 54, 101, 209, 214, 125, 25, + 86, 158, 139, 92, 95, 213, 169, 253, 147, 29, 175, 157, 143, 179, 46, 105, 27, 83, 24, 20, + 121, 89, 150, 211, 217, 145, 87, 102, 73, 104, 224, 129, 53, 69, 229, 12, 163, 223, 111, + 211, 203, 44, 175, 210, 219, 44, 183, 233, 46, 155, 165, 143, 89, 110, 210, 123, 247, 240, + 156, 229, 141, 255, 129, 183, 77, 86, 167, 171, 44, 239, 156, 174, 188, 234, 234, 244, 10, + 196, 110, 50, 155, 254, 237, 62, 236, 221, 139, 23, 123, 2, 17, 217, 13, 15, 239, 220, 183, + 10, 183, 211, 206, 165, 8, 195, 34, 234, 217, 224, 18, 104, 235, 155, 170, 77, 157, 94, 187, + 247, 143, 89, 62, 101, 5, 231, 89, 147, 254, 0, 219, 222, 192, 207, 169, 250, 114, 146, 85, + 172, 176, 78, 31, 14, 185, 254, 75, 198, 22, 197, 209, 39, 245, 249, 157, 75, 182, 247, 49, + 193, 148, 151, 46, 1, 211, 98, 218, 38, 243, 51, 23, 172, 101, 230, 37, 32, 84, 24, 51, 208, + 129, 218, 233, 136, 228, 112, 236, 6, 234, 255, 62, 67, 27, 83, 210, 171, 211, 152, 99, 70, + 154, 36, 175, 202, 175, 76, 226, 171, 108, 234, 173, 224, 121, 208, 58, 184, 177, 118, 222, + 73, 94, 238, 220, 66, 63, 32, 157, 33, 95, 233, 25, 5, 247, 153, 63, 132, 100, 115, 33, 225, + 66, 89, 56, 60, 103, 4, 54, 249, 144, 225, 241, 187, 170, 70, 95, 126, 5, 185, 243, 44, 159, + 165, 23, 224, 16, 9, 14, 19, 68, 31, 116, 88, 105, 9, 15, 178, 99, 147, 11, 39, 0, 241, 182, + 238, 115, 69, 17, 156, 127, 231, 14, 78, 137, 48, 105, 78, 78, 220, 187, 23, 163, 107, 171, + 166, 202, 226, 229, 149, 79, 70, 222, 30, 76, 68, 13, 137, 112, 173, 253, 149, 185, 56, 6, + 187, 216, 71, 88, 33, 96, 115, 49, 18, 122, 107, 106, 31, 161, 94, 49, 31, 83, 58, 224, 251, + 49, 183, 217, 51, 5, 203, 14, 131, 101, 57, 109, 33, 245, 248, 4, 89, 196, 7, 150, 229, 148, + 193, 134, 173, 251, 184, 195, 246, 108, 211, 247, 224, 68, 212, 189, 176, 186, 225, 2, 136, + 172, 66, 51, 43, 187, 82, 14, 215, 116, 64, 103, 208, 170, 180, 41, 24, 104, 169, 233, 92, + 228, 77, 25, 245, 86, 99, 125, 111, 245, 242, 53, 115, 213, 11, 57, 91, 143, 150, 29, 57, + 39, 184, 37, 135, 128, 205, 184, 170, 155, 174, 83, 213, 176, 160, 74, 165, 37, 220, 8, 238, + 249, 66, 31, 105, 17, 191, 101, 207, 21, 181, 166, 26, 173, 3, 8, 172, 124, 215, 192, 241, + 214, 7, 142, 206, 54, 189, 20, 251, 33, 238, 251, 143, 88, 4, 208, 62, 191, 101, 124, 202, + 184, 2, 134, 193, 99, 96, 82, 199, 251, 151, 194, 254, 202, 170, 126, 205, 113, 5, 103, 224, + 76, 130, 122, 112, 200, 79, 35, 104, 219, 80, 189, 64, 229, 44, 185, 154, 238, 162, 50, 66, + 133, 32, 169, 130, 1, 57, 191, 231, 140, 198, 161, 196, 37, 217, 195, 230, 66, 241, 131, 74, + 200, 83, 220, 124, 26, 226, 169, 65, 228, 45, 24, 89, 139, 97, 95, 32, 48, 144, 92, 128, 37, + 125, 49, 30, 73, 70, 80, 83, 1, 90, 28, 48, 217, 144, 26, 219, 81, 106, 36, 172, 146, 138, + 182, 42, 102, 77, 133, 34, 141, 245, 193, 61, 195, 188, 94, 1, 40, 61, 59, 123, 87, 30, 157, + 26, 172, 133, 71, 40, 249, 107, 24, 210, 184, 252, 68, 254, 27, 215, 11, 166, 141, 12, 114, + 35, 25, 167, 162, 116, 255, 129, 183, 20, 204, 91, 170, 145, 172, 14, 185, 73, 237, 24, 73, + 197, 41, 71, 96, 82, 72, 83, 79, 107, 201, 126, 168, 99, 9, 204, 61, 39, 148, 97, 3, 228, + 215, 194, 1, 96, 215, 232, 80, 6, 177, 1, 186, 192, 34, 119, 227, 42, 98, 21, 186, 9, 189, + 71, 131, 52, 121, 11, 224, 224, 62, 224, 82, 35, 224, 1, 187, 208, 71, 216, 180, 166, 154, + 161, 141, 80, 4, 17, 252, 17, 130, 192, 158, 15, 32, 66, 229, 23, 22, 60, 82, 49, 90, 249, + 124, 228, 149, 227, 110, 229, 84, 58, 116, 65, 212, 65, 106, 39, 192, 91, 124, 174, 103, + 101, 162, 81, 16, 119, 144, 141, 249, 35, 110, 169, 100, 53, 121, 33, 249, 59, 238, 44, 216, + 184, 35, 31, 27, 168, 56, 109, 146, 56, 128, 84, 156, 9, 44, 6, 157, 144, 209, 160, 19, 28, + 156, 129, 231, 31, 97, 49, 12, 180, 121, 230, 75, 120, 108, 196, 81, 191, 88, 225, 66, 161, + 59, 112, 168, 159, 187, 189, 88, 246, 91, 40, 251, 157, 31, 98, 206, 238, 123, 88, 187, 207, + 160, 238, 220, 250, 138, 187, 228, 71, 120, 11, 2, 183, 25, 192, 136, 155, 78, 27, 105, 26, + 124, 186, 1, 9, 248, 72, 48, 64, 203, 11, 248, 241, 158, 210, 138, 104, 121, 242, 241, 105, + 189, 242, 157, 159, 193, 141, 99, 204, 198, 40, 175, 64, 0, 164, 111, 248, 229, 62, 163, 47, + 27, 86, 125, 143, 196, 80, 94, 79, 130, 245, 135, 12, 153, 85, 255, 72, 111, 216, 5, 81, 74, + 46, 152, 153, 102, 63, 220, 233, 213, 55, 118, 250, 28, 13, 180, 56, 214, 167, 190, 99, 176, + 8, 60, 77, 224, 158, 208, 240, 235, 198, 252, 24, 211, 165, 15, 43, 238, 174, 176, 101, 23, + 51, 254, 90, 6, 181, 104, 235, 79, 104, 88, 243, 2, 176, 120, 55, 182, 87, 59, 12, 235, 206, + 156, 213, 53, 26, 241, 31, 92, 249, 221, 90, 235, 59, 26, 212, 107, 26, 20, 90, 79, 192, 61, + 134, 3, 61, 124, 117, 131, 51, 136, 139, 83, 187, 168, 165, 67, 143, 228, 21, 29, 97, 72, + 14, 15, 79, 44, 216, 36, 199, 80, 175, 210, 215, 126, 237, 11, 238, 62, 117, 152, 225, 43, + 166, 249, 159, 165, 43, 21, 210, 15, 27, 241, 143, 238, 91, 125, 64, 0, 120, 231, 27, 220, + 23, 152, 108, 233, 227, 203, 144, 229, 244, 249, 112, 211, 47, 154, 62, 232, 193, 202, 235, + 136, 17, 198, 140, 145, 132, 152, 46, 73, 119, 148, 142, 255, 151, 38, 97, 178, 100, 76, + 105, 74, 183, 48, 109, 75, 211, 158, 150, 101, 89, 29, 197, 237, 244, 182, 7, 189, 136, 122, + 154, 249, 11, 192, 246, 34, 42, 103, 136, 232, 208, 22, 21, 113, 101, 250, 55, 120, 10, 39, + 0, 189, 69, 102, 196, 121, 197, 47, 208, 121, 69, 47, 124, 239, 199, 20, 225, 20, 93, 194, + 0, 23, 93, 215, 205, 220, 73, 221, 254, 196, 152, 198, 109, 181, 221, 172, 152, 37, 243, + 199, 137, 177, 133, 109, 108, 196, 84, 182, 130, 169, 55, 126, 168, 52, 136, 78, 31, 25, + 184, 78, 246, 32, 0, 203, 107, 164, 117, 244, 18, 163, 155, 172, 12, 161, 110, 47, 136, 207, + 170, 225, 47, 129, 177, 245, 33, 188, 0, 61, 232, 3, 10, 62, 220, 98, 48, 45, 199, 34, 31, + 113, 155, 129, 178, 254, 255, 128, 146, 240, 207, 19, 161, 48, 207, 9, 188, 26, 15, 82, 87, + 81, 145, 123, 170, 50, 224, 35, 77, 77, 213, 195, 59, 151, 194, 93, 24, 236, 70, 224, 136, + 170, 134, 57, 68, 196, 188, 70, 208, 20, 209, 78, 87, 213, 146, 123, 36, 30, 240, 158, 133, + 121, 246, 36, 84, 75, 233, 85, 112, 214, 140, 192, 64, 163, 47, 102, 224, 249, 94, 70, 136, + 156, 123, 172, 207, 199, 0, 21, 17, 66, 154, 227, 65, 240, 89, 67, 145, 81, 183, 38, 192, + 159, 115, 79, 45, 96, 253, 67, 136, 153, 230, 103, 240, 233, 90, 121, 108, 232, 145, 240, + 136, 91, 45, 144, 61, 233, 76, 138, 164, 17, 64, 134, 72, 249, 5, 185, 191, 4, 84, 9, 204, + 119, 171, 134, 7, 8, 247, 239, 141, 53, 249, 214, 99, 128, 225, 132, 33, 16, 28, 125, 61, + 94, 96, 235, 70, 92, 83, 121, 247, 96, 36, 7, 220, 100, 92, 89, 60, 17, 245, 8, 30, 130, + 237, 38, 171, 69, 242, 81, 221, 154, 156, 134, 81, 51, 141, 190, 138, 69, 229, 39, 57, 92, + 48, 171, 38, 121, 237, 14, 103, 135, 166, 62, 202, 238, 51, 213, 70, 35, 61, 0, 242, 50, + 254, 149, 31, 131, 178, 132, 197, 159, 179, 102, 68, 145, 175, 246, 58, 186, 86, 128, 180, + 32, 120, 56, 147, 20, 176, 220, 23, 180, 122, 61, 0, 112, 225, 141, 204, 244, 255, 208, 7, + 165, 116, 0, 164, 224, 66, 66, 57, 210, 1, 241, 149, 118, 48, 3, 223, 17, 1, 151, 106, 227, + 171, 27, 86, 221, 70, 96, 235, 83, 116, 229, 64, 93, 31, 34, 179, 172, 213, 199, 106, 73, + 111, 82, 241, 43, 42, 145, 91, 79, 175, 249, 56, 190, 122, 27, 170, 15, 48, 228, 123, 43, + 180, 69, 168, 234, 195, 39, 25, 114, 42, 208, 180, 20, 157, 113, 113, 4, 235, 116, 195, 48, + 35, 55, 140, 225, 32, 132, 249, 129, 227, 232, 57, 163, 145, 130, 195, 5, 6, 24, 93, 149, + 92, 235, 226, 18, 8, 92, 241, 20, 187, 4, 27, 225, 26, 32, 215, 139, 39, 58, 146, 25, 153, + 124, 227, 230, 252, 165, 132, 252, 228, 193, 19, 13, 102, 59, 53, 69, 103, 19, 211, 76, 139, + 186, 134, 209, 44, 115, 42, 140, 253, 166, 45, 166, 141, 25, 29, 123, 205, 55, 142, 189, 99, + 207, 94, 114, 203, 4, 46, 166, 170, 59, 38, 56, 212, 63, 32, 118, 233, 7, 185, 159, 53, 55, + 17, 5, 147, 89, 163, 169, 225, 103, 84, 11, 211, 175, 4, 212, 25, 206, 149, 65, 141, 233, + 240, 30, 198, 144, 244, 236, 150, 46, 22, 85, 141, 101, 236, 203, 112, 23, 84, 44, 195, 212, + 11, 93, 47, 229, 71, 66, 187, 168, 107, 183, 4, 146, 130, 20, 218, 5, 213, 135, 253, 25, 7, + 32, 203, 151, 134, 47, 99, 195, 185, 233, 20, 176, 133, 91, 217, 158, 131, 120, 71, 128, + 216, 169, 251, 17, 197, 209, 246, 114, 20, 247, 125, 128, 240, 174, 119, 207, 90, 72, 203, + 134, 49, 179, 82, 238, 40, 218, 2, 175, 56, 252, 34, 94, 162, 157, 212, 231, 88, 30, 156, + 45, 93, 173, 218, 123, 77, 49, 8, 179, 183, 83, 37, 32, 193, 24, 236, 163, 1, 28, 248, 216, + 16, 90, 217, 245, 37, 133, 58, 46, 81, 232, 85, 207, 236, 24, 141, 168, 12, 252, 148, 26, + 187, 102, 28, 188, 216, 68, 78, 137, 246, 248, 42, 83, 32, 214, 128, 151, 175, 46, 78, 147, + 201, 171, 249, 228, 31, 1, 6, 0, 170, 163, 44, 158, 13, 10, 101, 110, 100, 115, 116, 114, + 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, 53, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 49, 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 72, 137, 106, 96, 192, 15, 20, 144, 57, 28, 76, 0, 1, 6, 0, 25, 161, 0, 171, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, 54, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 57, 52, 52, 56, 47, 76, + 101, 110, 103, 116, 104, 49, 32, 50, 53, 48, 55, 54, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 72, 137, 172, 87, 123, 112, 84, 87, 25, 255, 238, 189, 251, 74, 54, 75, 54, 105, + 192, 12, 139, 244, 44, 135, 221, 134, 73, 150, 32, 225, 109, 154, 172, 217, 221, 144, 52, + 165, 228, 133, 115, 111, 160, 118, 55, 155, 13, 27, 37, 52, 2, 133, 64, 1, 215, 82, 155, + 244, 82, 20, 69, 170, 181, 21, 176, 42, 248, 42, 156, 133, 210, 108, 20, 91, 168, 88, 159, + 69, 68, 103, 234, 140, 35, 3, 142, 58, 214, 49, 117, 58, 78, 235, 88, 155, 172, 223, 57, + 247, 110, 178, 201, 0, 127, 245, 238, 125, 124, 191, 223, 247, 56, 223, 249, 190, 115, 207, + 238, 130, 4, 0, 78, 72, 129, 2, 75, 214, 119, 84, 47, 221, 146, 220, 150, 65, 230, 2, 94, + 209, 248, 206, 29, 228, 204, 145, 145, 255, 2, 72, 243, 0, 172, 133, 189, 3, 155, 251, 223, + 125, 119, 93, 17, 128, 205, 15, 80, 48, 119, 243, 150, 221, 189, 101, 47, 180, 246, 1, 20, + 7, 145, 235, 78, 38, 98, 61, 127, 110, 60, 243, 87, 128, 217, 207, 163, 255, 138, 36, 18, + 174, 211, 206, 90, 196, 127, 64, 188, 48, 217, 191, 99, 48, 144, 184, 241, 119, 196, 239, 3, + 148, 60, 190, 229, 225, 120, 12, 62, 52, 239, 24, 192, 61, 41, 196, 195, 253, 177, 193, 129, + 10, 73, 113, 1, 172, 118, 160, 61, 217, 26, 235, 79, 220, 255, 159, 166, 9, 196, 21, 0, 150, + 75, 3, 219, 18, 3, 217, 127, 252, 237, 6, 192, 189, 111, 98, 56, 39, 40, 22, 187, 116, 24, + 172, 224, 176, 62, 99, 173, 193, 44, 231, 27, 79, 229, 42, 60, 33, 131, 3, 228, 98, 171, 44, + 203, 22, 69, 182, 156, 0, 249, 95, 65, 32, 143, 130, 121, 172, 235, 32, 4, 144, 248, 159, + 197, 6, 19, 32, 93, 182, 31, 147, 253, 4, 224, 56, 215, 41, 35, 214, 89, 124, 116, 172, 8, + 216, 49, 183, 137, 35, 144, 127, 180, 194, 39, 97, 59, 214, 43, 5, 79, 192, 33, 56, 2, 175, + 192, 31, 161, 27, 14, 160, 244, 12, 156, 128, 147, 240, 93, 96, 112, 9, 126, 1, 111, 192, 7, + 120, 76, 236, 182, 246, 67, 145, 50, 2, 54, 184, 11, 32, 251, 94, 118, 108, 226, 36, 94, 25, + 204, 116, 138, 57, 130, 232, 46, 11, 153, 98, 178, 238, 236, 91, 51, 184, 183, 38, 142, 100, + 221, 19, 25, 91, 41, 20, 10, 95, 151, 124, 13, 217, 127, 75, 227, 217, 247, 228, 122, 142, + 179, 43, 56, 150, 135, 80, 46, 22, 30, 111, 219, 143, 77, 156, 153, 56, 53, 163, 6, 109, + 208, 5, 27, 97, 19, 60, 8, 81, 136, 225, 252, 123, 32, 9, 125, 88, 153, 79, 193, 22, 232, + 135, 173, 2, 109, 69, 221, 102, 188, 247, 34, 122, 8, 173, 226, 104, 197, 229, 41, 171, 135, + 97, 0, 175, 109, 176, 3, 30, 129, 157, 248, 25, 64, 121, 187, 137, 184, 238, 211, 2, 63, 2, + 187, 240, 51, 8, 187, 97, 15, 60, 10, 123, 97, 159, 121, 223, 37, 152, 189, 168, 217, 35, + 240, 32, 94, 251, 225, 51, 216, 153, 207, 194, 99, 66, 202, 61, 13, 230, 0, 60, 14, 159, + 195, 174, 13, 193, 48, 60, 121, 71, 244, 228, 164, 164, 195, 65, 120, 10, 251, 252, 121, + 248, 194, 109, 229, 67, 211, 208, 97, 252, 124, 17, 190, 132, 235, 225, 203, 112, 20, 158, + 134, 175, 226, 186, 120, 22, 158, 155, 193, 126, 69, 240, 95, 131, 99, 184, 230, 78, 10, + 221, 81, 100, 142, 11, 137, 107, 47, 192, 107, 112, 30, 78, 195, 25, 120, 73, 212, 50, 142, + 85, 51, 42, 146, 171, 75, 175, 168, 225, 0, 214, 96, 47, 206, 240, 64, 94, 198, 70, 253, + 118, 77, 86, 107, 63, 206, 157, 207, 77, 55, 103, 58, 136, 252, 99, 121, 30, 59, 205, 58, + 114, 203, 3, 104, 105, 68, 49, 250, 192, 163, 236, 155, 81, 137, 195, 56, 7, 67, 158, 154, + 145, 129, 142, 138, 249, 79, 177, 249, 85, 185, 19, 155, 171, 199, 115, 121, 149, 121, 86, + 32, 46, 205, 100, 111, 39, 63, 13, 95, 199, 55, 240, 27, 120, 231, 85, 229, 210, 243, 40, + 27, 210, 113, 33, 231, 243, 199, 38, 109, 79, 8, 252, 77, 248, 22, 124, 27, 123, 113, 74, + 72, 185, 167, 193, 156, 68, 249, 20, 124, 7, 223, 237, 239, 193, 247, 225, 7, 248, 153, 146, + 243, 37, 227, 121, 26, 94, 16, 157, 99, 144, 134, 179, 112, 14, 94, 196, 78, 190, 4, 35, + 144, 17, 252, 157, 116, 183, 226, 207, 153, 252, 217, 73, 102, 20, 126, 8, 63, 194, 21, 242, + 50, 92, 196, 157, 230, 85, 252, 228, 152, 31, 35, 247, 138, 201, 94, 22, 156, 129, 95, 133, + 159, 32, 230, 86, 6, 122, 13, 126, 134, 59, 212, 47, 225, 87, 240, 107, 248, 13, 252, 20, + 209, 21, 113, 255, 57, 162, 171, 112, 13, 126, 7, 111, 72, 46, 148, 126, 11, 111, 226, 125, + 28, 174, 6, 215, 246, 60, 244, 137, 7, 55, 109, 236, 210, 212, 13, 157, 29, 237, 109, 173, + 235, 31, 88, 119, 127, 203, 125, 205, 77, 107, 27, 35, 225, 80, 195, 199, 130, 245, 117, + 247, 214, 126, 116, 205, 234, 85, 43, 87, 44, 175, 94, 28, 168, 170, 240, 251, 22, 210, 5, + 119, 151, 151, 149, 184, 139, 93, 206, 194, 2, 135, 221, 102, 197, 125, 88, 130, 170, 8, + 109, 140, 18, 230, 143, 50, 139, 159, 54, 53, 5, 56, 166, 49, 36, 98, 121, 68, 148, 17, 164, + 26, 167, 219, 48, 18, 21, 102, 100, 186, 101, 16, 45, 123, 103, 88, 6, 13, 203, 224, 164, + 165, 228, 38, 181, 80, 27, 168, 34, 17, 74, 216, 235, 97, 74, 50, 82, 87, 155, 138, 242, + 161, 48, 213, 8, 27, 19, 242, 58, 33, 91, 252, 2, 184, 16, 120, 189, 232, 65, 34, 229, 201, + 48, 97, 82, 148, 68, 88, 227, 206, 164, 30, 137, 134, 49, 94, 218, 89, 24, 162, 161, 68, 97, + 160, 10, 210, 133, 78, 20, 157, 40, 177, 10, 58, 144, 150, 42, 234, 36, 33, 200, 21, 145, + 53, 105, 252, 22, 114, 241, 97, 153, 226, 139, 196, 122, 88, 107, 155, 26, 9, 123, 188, 94, + 77, 112, 16, 18, 177, 152, 45, 196, 236, 34, 22, 233, 227, 57, 195, 65, 146, 174, 186, 168, + 63, 149, 113, 67, 119, 180, 178, 168, 135, 246, 196, 54, 169, 76, 137, 161, 147, 174, 68, + 116, 125, 136, 149, 84, 178, 69, 52, 204, 22, 237, 249, 75, 57, 78, 57, 193, 170, 104, 56, + 194, 42, 41, 6, 107, 105, 159, 28, 64, 98, 86, 159, 155, 18, 253, 29, 192, 228, 233, 216, + 63, 167, 51, 49, 147, 177, 249, 220, 239, 0, 23, 249, 20, 39, 203, 132, 250, 156, 12, 152, + 27, 102, 136, 243, 243, 122, 121, 46, 7, 51, 65, 232, 70, 192, 82, 109, 170, 129, 9, 116, + 123, 206, 66, 176, 186, 82, 99, 114, 148, 107, 46, 230, 52, 179, 55, 112, 77, 42, 167, 153, + 116, 143, 82, 47, 111, 85, 36, 106, 158, 59, 147, 229, 44, 213, 77, 2, 85, 88, 125, 113, + 250, 240, 68, 61, 97, 138, 63, 218, 29, 79, 242, 103, 44, 161, 211, 112, 216, 168, 91, 167, + 202, 130, 97, 20, 130, 49, 115, 174, 145, 244, 146, 106, 180, 143, 69, 113, 18, 125, 188, + 12, 109, 42, 171, 166, 3, 172, 140, 54, 24, 6, 72, 16, 222, 131, 190, 14, 85, 184, 152, 110, + 172, 44, 196, 240, 103, 142, 233, 197, 170, 35, 97, 158, 23, 137, 232, 209, 176, 145, 32, + 143, 69, 219, 212, 81, 168, 201, 222, 72, 47, 35, 158, 115, 53, 176, 12, 52, 158, 7, 155, + 19, 194, 166, 248, 35, 186, 218, 211, 203, 238, 142, 122, 122, 112, 125, 246, 18, 213, 227, + 101, 65, 13, 203, 167, 81, 53, 161, 241, 46, 81, 55, 91, 116, 3, 135, 243, 138, 17, 133, 23, + 206, 109, 134, 117, 206, 152, 207, 220, 238, 115, 16, 85, 246, 40, 26, 239, 22, 18, 164, 17, + 111, 180, 161, 22, 21, 110, 108, 151, 128, 188, 163, 13, 181, 68, 149, 60, 144, 51, 195, 81, + 76, 11, 46, 77, 139, 131, 64, 241, 133, 154, 184, 74, 225, 174, 161, 38, 143, 87, 243, 26, + 199, 29, 82, 242, 152, 57, 89, 125, 204, 145, 23, 203, 141, 196, 100, 78, 198, 56, 183, 77, + 205, 176, 230, 9, 45, 34, 145, 68, 56, 47, 193, 105, 65, 173, 102, 130, 102, 180, 91, 231, + 41, 243, 90, 152, 3, 163, 135, 131, 183, 179, 41, 167, 82, 124, 248, 230, 34, 39, 99, 24, + 65, 241, 46, 150, 19, 6, 173, 68, 165, 9, 170, 81, 92, 67, 193, 86, 149, 207, 141, 215, 90, + 244, 183, 165, 131, 182, 180, 117, 169, 162, 219, 230, 42, 233, 156, 134, 12, 253, 42, 3, + 49, 240, 162, 58, 7, 228, 16, 174, 193, 198, 74, 79, 174, 173, 2, 175, 21, 120, 18, 54, 205, + 80, 55, 231, 212, 68, 119, 208, 150, 14, 157, 7, 167, 102, 64, 32, 248, 6, 225, 164, 109, + 254, 230, 216, 193, 85, 165, 203, 240, 213, 108, 196, 221, 141, 54, 198, 40, 113, 147, 70, + 61, 150, 201, 166, 186, 245, 116, 48, 168, 15, 68, 162, 201, 53, 60, 6, 109, 238, 209, 105, + 135, 90, 235, 17, 185, 182, 171, 251, 60, 123, 248, 80, 165, 208, 34, 181, 116, 54, 4, 170, + 112, 239, 105, 72, 83, 105, 184, 45, 29, 148, 134, 59, 186, 212, 81, 55, 254, 166, 29, 238, + 84, 207, 202, 146, 28, 138, 54, 104, 233, 133, 168, 83, 71, 241, 87, 111, 80, 176, 50, 103, + 57, 201, 1, 225, 128, 71, 106, 71, 224, 16, 246, 158, 81, 252, 141, 159, 18, 90, 139, 32, 4, + 142, 103, 36, 16, 156, 35, 199, 73, 16, 207, 200, 6, 231, 206, 113, 50, 114, 22, 131, 11, + 10, 142, 31, 216, 164, 242, 36, 150, 24, 183, 219, 8, 233, 225, 237, 217, 171, 37, 245, 168, + 198, 95, 46, 152, 131, 173, 196, 83, 98, 18, 173, 3, 38, 211, 186, 180, 36, 219, 138, 88, + 33, 77, 52, 48, 39, 109, 224, 124, 61, 231, 235, 13, 222, 198, 121, 59, 46, 12, 105, 142, + 132, 197, 225, 123, 146, 30, 165, 184, 79, 225, 130, 82, 193, 35, 25, 75, 81, 225, 33, 73, + 38, 155, 237, 84, 189, 175, 123, 198, 52, 47, 46, 181, 77, 120, 117, 169, 172, 160, 18, 247, + 126, 171, 239, 62, 180, 91, 203, 175, 40, 210, 107, 89, 42, 30, 227, 121, 192, 6, 149, 251, + 218, 125, 205, 113, 13, 151, 109, 46, 32, 154, 52, 179, 2, 140, 80, 96, 70, 64, 139, 70, + 225, 195, 151, 35, 58, 197, 177, 55, 216, 64, 225, 159, 66, 192, 82, 26, 211, 42, 249, 160, + 106, 159, 38, 150, 179, 155, 65, 19, 93, 131, 109, 55, 98, 90, 253, 124, 160, 106, 77, 47, + 165, 75, 197, 187, 137, 175, 66, 161, 111, 136, 63, 10, 48, 55, 232, 80, 13, 198, 131, 16, + 7, 211, 140, 34, 217, 139, 48, 243, 56, 69, 85, 60, 74, 176, 218, 22, 136, 119, 224, 82, 55, + 246, 210, 66, 143, 193, 36, 112, 75, 180, 248, 19, 226, 42, 244, 152, 74, 224, 211, 82, 124, + 78, 87, 33, 43, 88, 140, 1, 241, 228, 178, 115, 49, 127, 37, 173, 62, 187, 166, 25, 201, 11, + 52, 100, 26, 224, 216, 110, 230, 196, 140, 252, 121, 165, 52, 29, 176, 58, 168, 106, 230, + 185, 224, 57, 132, 169, 114, 211, 75, 60, 76, 91, 6, 218, 233, 32, 238, 44, 60, 105, 17, + 201, 142, 106, 230, 242, 53, 199, 112, 243, 55, 252, 157, 200, 208, 85, 57, 103, 7, 223, 35, + 156, 102, 140, 203, 6, 107, 231, 51, 47, 194, 186, 43, 190, 206, 76, 246, 20, 221, 237, 205, + 59, 2, 85, 148, 127, 57, 240, 133, 9, 158, 81, 92, 216, 160, 233, 51, 9, 182, 177, 50, 80, + 229, 152, 201, 186, 4, 173, 235, 14, 215, 173, 29, 140, 122, 57, 92, 147, 79, 78, 146, 8, + 126, 107, 224, 191, 79, 152, 216, 174, 92, 195, 127, 83, 10, 216, 97, 53, 172, 131, 7, 96, + 227, 5, 112, 73, 237, 48, 7, 214, 72, 231, 207, 207, 14, 135, 29, 1, 251, 203, 82, 8, 95, 3, + 34, 117, 226, 255, 82, 73, 10, 5, 139, 45, 178, 107, 100, 238, 220, 122, 58, 178, 220, 118, + 72, 41, 105, 206, 72, 129, 23, 235, 237, 135, 100, 25, 234, 199, 175, 143, 95, 169, 30, 191, + 62, 86, 186, 186, 122, 76, 170, 254, 211, 205, 235, 55, 221, 111, 95, 41, 89, 93, 93, 115, + 243, 247, 55, 63, 178, 68, 42, 241, 150, 136, 171, 108, 150, 108, 183, 151, 217, 232, 130, + 197, 242, 242, 123, 252, 43, 106, 106, 150, 214, 201, 203, 151, 249, 233, 130, 89, 178, 224, + 150, 173, 88, 89, 167, 212, 44, 157, 47, 43, 101, 57, 166, 78, 230, 88, 82, 174, 189, 223, + 165, 172, 31, 183, 201, 251, 105, 253, 199, 107, 172, 243, 231, 22, 151, 185, 108, 86, 121, + 94, 121, 105, 160, 214, 231, 238, 216, 232, 171, 93, 252, 97, 187, 98, 183, 41, 86, 135, + 189, 98, 101, 195, 130, 255, 51, 94, 38, 176, 81, 92, 103, 28, 255, 222, 204, 236, 236, 174, + 119, 237, 189, 216, 245, 174, 111, 175, 239, 3, 155, 53, 107, 99, 99, 108, 47, 198, 152, 24, + 124, 97, 12, 53, 142, 109, 112, 76, 140, 160, 14, 9, 33, 28, 34, 52, 205, 193, 17, 90, 168, + 74, 228, 136, 56, 45, 1, 211, 86, 202, 225, 160, 114, 36, 181, 72, 171, 66, 229, 168, 105, + 138, 104, 90, 1, 61, 35, 65, 170, 34, 66, 65, 33, 81, 32, 5, 236, 157, 254, 223, 204, 216, + 192, 26, 41, 30, 233, 55, 223, 123, 223, 124, 239, 205, 206, 127, 190, 121, 223, 219, 69, + 125, 243, 253, 255, 48, 58, 18, 221, 158, 68, 167, 201, 228, 76, 244, 184, 19, 29, 198, 177, + 127, 26, 98, 238, 124, 101, 136, 185, 59, 79, 234, 187, 219, 47, 202, 229, 29, 85, 233, 226, + 107, 81, 38, 65, 146, 229, 225, 36, 175, 47, 183, 60, 181, 110, 153, 205, 101, 151, 44, 46, + 187, 195, 99, 50, 58, 29, 214, 236, 154, 142, 177, 157, 238, 4, 62, 71, 130, 219, 173, 205, + 53, 214, 0, 221, 134, 136, 36, 6, 5, 147, 40, 143, 74, 233, 163, 80, 92, 178, 215, 206, 26, + 146, 237, 54, 126, 138, 198, 201, 107, 197, 41, 197, 130, 211, 176, 80, 16, 202, 142, 115, + 135, 112, 221, 29, 194, 117, 183, 219, 146, 207, 131, 243, 121, 112, 62, 15, 206, 231, 193, + 249, 60, 56, 255, 164, 80, 132, 255, 176, 167, 222, 67, 155, 50, 103, 14, 43, 87, 142, 35, + 18, 246, 198, 113, 155, 110, 163, 85, 123, 235, 184, 85, 181, 87, 142, 91, 184, 21, 236, + 161, 232, 67, 150, 83, 22, 193, 18, 151, 245, 117, 32, 96, 76, 31, 102, 230, 99, 246, 197, + 193, 97, 102, 57, 106, 108, 165, 170, 235, 85, 234, 187, 41, 99, 133, 157, 151, 242, 248, + 81, 116, 46, 79, 107, 192, 157, 151, 87, 166, 181, 241, 170, 166, 197, 72, 105, 169, 254, + 204, 98, 71, 176, 100, 102, 42, 148, 119, 243, 119, 150, 36, 178, 96, 129, 144, 150, 230, + 224, 47, 204, 117, 175, 41, 177, 228, 210, 166, 158, 245, 117, 225, 35, 177, 57, 57, 177, + 44, 243, 153, 254, 158, 34, 79, 222, 220, 220, 226, 142, 249, 217, 225, 177, 184, 210, 246, + 133, 199, 70, 230, 181, 148, 248, 26, 51, 22, 124, 119, 241, 217, 59, 229, 109, 243, 50, + 217, 134, 138, 213, 45, 149, 185, 238, 228, 44, 233, 197, 172, 228, 252, 214, 173, 13, 5, + 173, 11, 74, 157, 81, 197, 45, 235, 4, 86, 88, 95, 156, 16, 238, 76, 43, 111, 26, 251, 116, + 118, 219, 156, 228, 112, 105, 194, 172, 22, 164, 96, 135, 114, 93, 172, 18, 63, 166, 153, + 72, 238, 95, 134, 82, 108, 213, 201, 213, 133, 213, 162, 197, 28, 27, 180, 66, 132, 32, 87, + 48, 232, 181, 240, 150, 205, 206, 234, 241, 204, 223, 132, 98, 40, 43, 203, 70, 204, 74, 92, + 99, 154, 205, 117, 67, 232, 108, 174, 87, 180, 110, 45, 154, 61, 193, 199, 204, 30, 22, 76, + 161, 105, 142, 216, 15, 41, 104, 15, 10, 229, 167, 130, 140, 130, 44, 24, 44, 152, 155, 59, + 204, 226, 67, 182, 79, 252, 204, 239, 151, 18, 175, 22, 44, 172, 248, 151, 181, 65, 162, 66, + 93, 207, 206, 235, 14, 126, 94, 223, 213, 137, 172, 87, 37, 28, 201, 235, 234, 44, 43, 180, + 171, 237, 162, 178, 192, 140, 174, 206, 140, 105, 50, 18, 62, 51, 179, 184, 88, 150, 39, 82, + 122, 102, 49, 23, 113, 34, 237, 43, 37, 158, 228, 110, 35, 247, 184, 167, 121, 102, 22, 149, + 204, 18, 171, 236, 9, 241, 113, 201, 49, 229, 251, 22, 47, 216, 176, 120, 122, 229, 51, 111, + 174, 217, 230, 9, 52, 150, 85, 116, 215, 5, 172, 38, 171, 89, 50, 198, 87, 47, 235, 13, 118, + 191, 220, 154, 249, 243, 189, 53, 171, 170, 147, 151, 55, 207, 125, 178, 194, 107, 181, 202, + 178, 213, 218, 94, 85, 155, 81, 219, 59, 183, 254, 169, 133, 25, 181, 193, 230, 226, 248, + 196, 180, 68, 147, 221, 103, 243, 37, 198, 165, 37, 186, 242, 151, 62, 215, 58, 18, 59, 189, + 42, 167, 118, 73, 117, 13, 106, 223, 128, 114, 71, 220, 102, 88, 143, 93, 226, 171, 33, 107, + 85, 9, 203, 9, 176, 64, 200, 201, 26, 2, 195, 202, 39, 170, 56, 104, 92, 228, 170, 193, 94, + 229, 42, 170, 125, 168, 23, 248, 64, 200, 34, 63, 89, 149, 27, 106, 152, 85, 79, 78, 171, + 158, 156, 86, 93, 100, 235, 48, 251, 95, 40, 206, 51, 125, 58, 241, 228, 167, 16, 46, 145, + 199, 111, 49, 100, 215, 37, 212, 58, 234, 13, 245, 84, 133, 195, 89, 134, 212, 28, 65, 34, + 22, 218, 191, 84, 181, 187, 168, 39, 100, 39, 4, 212, 100, 202, 98, 142, 241, 85, 193, 161, + 47, 11, 110, 7, 211, 214, 11, 247, 52, 217, 200, 152, 199, 35, 110, 51, 185, 252, 113, 241, + 105, 94, 155, 28, 222, 110, 114, 166, 248, 188, 41, 46, 163, 209, 149, 226, 245, 165, 56, + 77, 172, 213, 228, 244, 249, 189, 62, 191, 219, 28, 109, 11, 159, 100, 235, 162, 45, 113, + 38, 171, 73, 18, 141, 209, 102, 246, 85, 56, 218, 100, 49, 73, 18, 78, 134, 82, 238, 149, + 112, 26, 253, 11, 219, 20, 21, 109, 22, 69, 163, 197, 108, 245, 218, 195, 39, 195, 25, 14, + 55, 233, 154, 29, 66, 70, 22, 81, 127, 200, 230, 180, 227, 41, 93, 252, 84, 21, 100, 185, + 46, 46, 3, 190, 89, 151, 254, 205, 186, 116, 89, 92, 186, 44, 46, 93, 22, 23, 151, 37, 62, + 201, 98, 71, 172, 133, 167, 176, 133, 167, 170, 37, 10, 33, 22, 158, 204, 22, 92, 255, 149, + 166, 86, 146, 125, 152, 201, 161, 168, 233, 11, 115, 125, 233, 117, 62, 93, 50, 103, 89, 21, + 146, 174, 80, 255, 138, 181, 140, 203, 67, 198, 117, 82, 94, 94, 198, 61, 161, 120, 154, + 201, 198, 201, 202, 185, 75, 74, 84, 43, 30, 130, 76, 170, 60, 222, 130, 186, 25, 149, 219, + 106, 198, 85, 147, 157, 9, 177, 158, 68, 187, 177, 126, 127, 67, 251, 179, 245, 169, 190, + 113, 117, 4, 91, 67, 87, 77, 122, 219, 210, 177, 31, 142, 123, 196, 237, 38, 11, 52, 50, 91, + 76, 155, 151, 54, 85, 244, 238, 94, 201, 21, 34, 94, 101, 206, 21, 214, 73, 43, 108, 115, + 110, 146, 207, 68, 252, 248, 224, 191, 219, 206, 112, 123, 186, 250, 138, 121, 52, 16, 222, + 96, 126, 223, 248, 6, 186, 102, 124, 227, 124, 4, 144, 41, 76, 108, 36, 170, 17, 87, 247, + 152, 223, 87, 189, 247, 29, 82, 183, 20, 115, 175, 199, 254, 4, 207, 32, 165, 77, 21, 57, + 94, 57, 195, 145, 218, 105, 72, 170, 161, 238, 135, 114, 13, 215, 174, 209, 126, 73, 161, + 120, 142, 120, 133, 134, 192, 124, 221, 214, 234, 244, 128, 21, 224, 5, 221, 63, 36, 190, + 75, 67, 6, 43, 61, 26, 137, 52, 138, 249, 128, 33, 68, 41, 130, 68, 67, 130, 164, 44, 132, + 205, 134, 45, 3, 1, 208, 12, 154, 192, 179, 240, 39, 129, 44, 233, 21, 196, 237, 37, 163, + 176, 87, 121, 75, 202, 198, 120, 32, 118, 170, 188, 32, 62, 166, 183, 159, 162, 4, 169, 139, + 134, 228, 191, 98, 238, 220, 135, 96, 4, 245, 212, 243, 173, 52, 105, 200, 95, 80, 143, 228, + 199, 189, 128, 225, 49, 180, 219, 208, 214, 88, 194, 45, 158, 111, 129, 142, 27, 120, 39, + 250, 151, 201, 118, 63, 6, 63, 189, 61, 85, 164, 31, 144, 223, 152, 68, 21, 145, 72, 89, 52, + 3, 115, 37, 77, 226, 183, 84, 174, 19, 167, 218, 175, 201, 62, 85, 12, 29, 202, 103, 28, 73, + 162, 65, 241, 143, 244, 196, 195, 144, 30, 167, 65, 176, 86, 218, 76, 69, 28, 241, 121, 196, + 62, 143, 223, 162, 217, 20, 157, 124, 144, 3, 170, 117, 255, 160, 216, 140, 113, 47, 82, + 223, 36, 182, 192, 191, 133, 246, 72, 7, 40, 196, 174, 209, 32, 187, 166, 180, 193, 250, 96, + 31, 1, 89, 96, 41, 104, 1, 235, 225, 119, 0, 175, 20, 79, 131, 66, 37, 145, 80, 169, 236, + 17, 255, 128, 185, 129, 112, 81, 101, 151, 112, 89, 111, 223, 192, 111, 59, 79, 131, 178, + 140, 249, 247, 77, 48, 0, 182, 168, 237, 94, 240, 54, 245, 126, 43, 39, 53, 48, 79, 175, + 248, 33, 238, 5, 164, 163, 104, 95, 71, 91, 99, 190, 106, 155, 168, 78, 67, 185, 9, 110, 77, + 244, 151, 83, 130, 184, 92, 9, 107, 22, 249, 184, 151, 14, 130, 159, 234, 118, 63, 216, 168, + 183, 39, 33, 142, 81, 170, 92, 73, 179, 34, 17, 207, 80, 137, 248, 18, 222, 89, 36, 107, + 168, 70, 199, 164, 218, 243, 212, 17, 65, 210, 67, 124, 42, 114, 161, 134, 20, 164, 1, 124, + 63, 237, 58, 141, 224, 59, 227, 125, 227, 147, 212, 46, 127, 10, 152, 6, 98, 87, 74, 123, + 192, 90, 16, 164, 110, 241, 46, 117, 78, 5, 97, 61, 101, 200, 175, 83, 134, 233, 60, 101, + 72, 239, 160, 253, 19, 189, 61, 39, 130, 166, 8, 116, 191, 188, 41, 130, 221, 17, 232, 254, + 7, 226, 205, 184, 199, 188, 251, 230, 126, 233, 222, 53, 233, 186, 134, 193, 69, 25, 198, + 108, 202, 16, 71, 168, 56, 18, 245, 89, 39, 51, 32, 5, 149, 119, 165, 121, 202, 109, 118, + 129, 118, 176, 11, 202, 58, 88, 27, 108, 59, 72, 1, 79, 131, 54, 176, 26, 126, 7, 24, 16, + 79, 209, 14, 41, 137, 94, 102, 87, 149, 243, 58, 61, 226, 207, 224, 215, 225, 49, 32, 87, + 72, 80, 237, 34, 118, 151, 18, 132, 49, 26, 144, 87, 241, 123, 61, 64, 163, 106, 15, 43, 7, + 84, 91, 138, 247, 241, 32, 77, 147, 124, 115, 52, 228, 51, 234, 187, 27, 159, 103, 165, 240, + 49, 13, 104, 40, 183, 97, 215, 137, 169, 180, 88, 3, 121, 155, 170, 140, 141, 247, 13, 71, + 52, 48, 215, 0, 251, 18, 241, 71, 40, 85, 24, 1, 220, 254, 154, 50, 165, 203, 148, 42, 109, + 156, 26, 208, 58, 213, 184, 8, 249, 253, 247, 169, 129, 223, 217, 15, 126, 164, 219, 157, + 160, 1, 236, 214, 219, 253, 247, 35, 30, 32, 191, 97, 152, 138, 35, 17, 55, 99, 77, 58, 72, + 254, 73, 228, 208, 114, 29, 163, 106, 75, 233, 105, 177, 155, 86, 137, 91, 144, 171, 67, 84, + 35, 252, 135, 250, 132, 70, 213, 62, 34, 12, 211, 2, 118, 154, 210, 133, 253, 120, 71, 159, + 83, 31, 235, 161, 110, 246, 132, 242, 55, 244, 251, 88, 23, 214, 179, 101, 136, 189, 172, + 50, 95, 29, 135, 49, 236, 22, 236, 12, 170, 102, 255, 166, 52, 62, 70, 216, 65, 201, 226, + 23, 148, 47, 60, 135, 26, 183, 147, 146, 133, 89, 84, 45, 180, 98, 61, 219, 8, 250, 121, + 213, 30, 195, 86, 96, 244, 138, 176, 108, 178, 15, 191, 143, 196, 21, 64, 245, 141, 30, 4, + 171, 35, 124, 7, 192, 26, 166, 160, 255, 58, 56, 12, 222, 84, 253, 143, 131, 149, 98, 58, + 230, 187, 9, 95, 45, 88, 173, 250, 15, 129, 231, 196, 44, 244, 235, 192, 218, 137, 57, 190, + 39, 90, 209, 183, 1, 135, 234, 195, 191, 185, 209, 183, 132, 125, 24, 255, 26, 56, 164, 250, + 62, 7, 159, 9, 216, 99, 8, 191, 3, 239, 33, 246, 52, 184, 132, 61, 135, 186, 251, 24, 109, + 1, 1, 118, 22, 251, 144, 11, 224, 172, 6, 158, 165, 129, 131, 103, 219, 14, 187, 85, 248, + 190, 106, 55, 177, 111, 104, 187, 16, 24, 223, 175, 40, 187, 249, 30, 68, 92, 130, 250, 186, + 157, 102, 107, 123, 136, 240, 239, 121, 77, 211, 246, 11, 225, 55, 120, 109, 214, 246, 11, + 225, 99, 216, 27, 180, 168, 251, 128, 87, 41, 125, 188, 222, 67, 227, 37, 90, 13, 87, 60, + 234, 24, 212, 109, 241, 29, 236, 77, 180, 58, 140, 122, 25, 94, 199, 173, 236, 194, 61, 81, + 79, 101, 162, 31, 27, 154, 169, 203, 208, 28, 190, 173, 213, 68, 101, 35, 175, 133, 194, 93, + 181, 198, 164, 105, 181, 44, 252, 103, 190, 182, 106, 117, 43, 124, 78, 58, 65, 189, 90, + 221, 10, 255, 6, 53, 170, 85, 173, 71, 151, 200, 49, 94, 119, 196, 93, 212, 165, 213, 18, + 165, 156, 143, 81, 107, 200, 163, 180, 72, 173, 7, 234, 186, 29, 62, 204, 173, 1, 74, 241, + 117, 221, 208, 70, 187, 120, 125, 145, 142, 42, 171, 81, 251, 187, 85, 66, 248, 78, 139, + 144, 143, 175, 160, 246, 205, 64, 220, 47, 144, 163, 64, 248, 8, 107, 64, 61, 174, 113, 230, + 98, 61, 218, 66, 178, 128, 221, 182, 80, 164, 92, 3, 91, 129, 77, 93, 87, 78, 224, 249, 122, + 97, 247, 35, 215, 5, 106, 16, 69, 124, 59, 227, 107, 194, 255, 217, 175, 19, 232, 168, 170, + 59, 12, 224, 255, 251, 150, 25, 136, 52, 42, 107, 210, 66, 120, 130, 10, 37, 152, 132, 32, + 145, 34, 123, 140, 144, 196, 80, 72, 8, 139, 32, 97, 146, 76, 146, 33, 201, 12, 204, 76, 2, + 162, 32, 160, 88, 17, 177, 212, 2, 22, 40, 164, 82, 181, 165, 101, 13, 10, 168, 212, 173, + 104, 139, 212, 214, 186, 148, 182, 182, 82, 138, 109, 221, 176, 22, 75, 21, 26, 137, 223, + 91, 62, 204, 105, 169, 135, 234, 57, 158, 122, 58, 112, 190, 220, 223, 123, 243, 102, 242, + 102, 222, 157, 119, 191, 212, 73, 95, 163, 163, 52, 226, 249, 83, 113, 253, 167, 235, 169, + 162, 27, 165, 178, 210, 203, 2, 164, 171, 153, 35, 165, 230, 149, 82, 138, 247, 221, 209, + 220, 44, 171, 204, 187, 164, 210, 142, 182, 204, 185, 150, 73, 248, 172, 236, 107, 157, 163, + 153, 114, 247, 153, 92, 140, 121, 223, 42, 97, 59, 206, 245, 44, 146, 173, 206, 245, 156, + 237, 165, 17, 215, 168, 143, 232, 109, 186, 99, 192, 87, 131, 223, 241, 140, 20, 154, 118, + 191, 242, 226, 245, 193, 241, 118, 215, 59, 211, 183, 142, 138, 238, 59, 133, 28, 114, 123, + 163, 95, 255, 168, 199, 25, 39, 221, 235, 108, 247, 84, 118, 47, 188, 79, 55, 123, 113, 95, + 88, 229, 94, 107, 179, 59, 142, 57, 129, 68, 37, 238, 59, 142, 215, 72, 131, 223, 148, 243, + 125, 41, 24, 71, 34, 229, 114, 157, 17, 144, 114, 127, 59, 120, 14, 250, 93, 43, 158, 127, + 28, 221, 13, 19, 219, 153, 27, 111, 203, 38, 167, 39, 117, 246, 210, 7, 215, 123, 145, 36, + 183, 233, 67, 253, 205, 121, 88, 131, 23, 201, 100, 99, 25, 30, 91, 38, 107, 144, 213, 94, + 199, 41, 181, 251, 11, 222, 235, 61, 118, 112, 109, 149, 51, 95, 230, 121, 157, 100, 51, 50, + 203, 155, 43, 118, 239, 98, 143, 216, 128, 57, 187, 1, 157, 59, 19, 239, 35, 201, 157, 47, + 198, 157, 120, 78, 8, 199, 157, 146, 122, 95, 111, 244, 157, 60, 108, 151, 73, 55, 243, 102, + 236, 123, 13, 121, 85, 106, 245, 119, 208, 95, 178, 225, 86, 172, 239, 101, 210, 211, 168, + 64, 240, 13, 196, 26, 174, 156, 253, 88, 255, 141, 92, 124, 46, 246, 220, 122, 9, 247, 245, + 253, 94, 96, 204, 137, 124, 244, 188, 110, 246, 58, 209, 118, 13, 199, 235, 15, 71, 39, 40, + 52, 74, 48, 247, 74, 208, 169, 74, 176, 166, 185, 107, 96, 212, 94, 215, 244, 221, 120, 46, + 98, 116, 145, 174, 62, 77, 58, 153, 33, 41, 51, 198, 96, 29, 235, 235, 173, 85, 3, 144, 126, + 31, 173, 103, 78, 199, 176, 215, 153, 84, 73, 178, 215, 58, 239, 222, 156, 162, 63, 47, 189, + 140, 211, 216, 143, 123, 55, 230, 226, 90, 99, 160, 179, 134, 142, 54, 95, 148, 181, 230, + 105, 108, 23, 72, 146, 57, 17, 251, 158, 68, 150, 99, 110, 175, 192, 185, 61, 13, 31, 148, + 193, 70, 73, 235, 73, 123, 109, 198, 245, 78, 209, 195, 120, 111, 94, 48, 87, 239, 179, 163, + 173, 87, 73, 218, 122, 121, 204, 142, 254, 160, 44, 69, 102, 56, 121, 5, 115, 123, 166, 28, + 67, 118, 234, 149, 50, 31, 107, 65, 25, 230, 113, 63, 123, 78, 35, 143, 216, 243, 219, 188, + 85, 214, 96, 223, 29, 246, 126, 142, 184, 70, 183, 33, 233, 28, 189, 125, 233, 218, 110, + 137, 35, 143, 115, 52, 82, 209, 249, 82, 241, 125, 240, 70, 189, 155, 40, 237, 48, 214, 132, + 237, 234, 118, 189, 69, 109, 195, 246, 121, 216, 190, 76, 139, 97, 13, 65, 244, 22, 244, 73, + 196, 63, 92, 86, 183, 13, 246, 157, 212, 91, 228, 137, 51, 223, 185, 122, 89, 138, 204, 215, + 226, 120, 79, 113, 185, 86, 187, 69, 38, 33, 13, 218, 72, 220, 87, 71, 98, 127, 129, 236, + 64, 170, 255, 211, 113, 120, 173, 141, 200, 92, 100, 30, 210, 104, 236, 144, 90, 99, 24, + 250, 64, 139, 204, 66, 134, 169, 253, 178, 92, 31, 36, 203, 77, 172, 73, 38, 214, 38, 255, + 123, 8, 214, 13, 255, 80, 119, 244, 109, 149, 237, 118, 240, 247, 231, 34, 243, 94, 25, 97, + 110, 145, 34, 188, 95, 193, 115, 71, 24, 187, 48, 143, 146, 241, 121, 180, 224, 251, 144, + 236, 116, 167, 41, 240, 67, 72, 1, 182, 75, 48, 214, 227, 179, 72, 135, 47, 215, 223, 197, + 90, 221, 132, 239, 239, 163, 248, 251, 177, 9, 199, 53, 161, 167, 93, 36, 249, 237, 6, 226, + 94, 209, 130, 251, 251, 81, 204, 241, 11, 165, 135, 177, 74, 202, 180, 131, 184, 47, 191, + 37, 229, 200, 4, 204, 143, 94, 250, 33, 140, 57, 178, 80, 111, 70, 103, 203, 193, 253, 32, + 7, 115, 59, 89, 198, 34, 219, 144, 40, 82, 141, 88, 72, 16, 169, 69, 42, 144, 98, 39, 185, + 248, 108, 86, 72, 170, 190, 24, 247, 193, 24, 238, 135, 91, 228, 82, 189, 6, 231, 177, 7, + 159, 65, 190, 100, 98, 110, 20, 234, 251, 164, 24, 231, 51, 30, 89, 129, 4, 145, 114, 100, + 8, 82, 237, 156, 115, 19, 230, 79, 19, 230, 43, 142, 249, 183, 243, 235, 123, 206, 231, 151, + 117, 182, 243, 195, 247, 99, 172, 122, 31, 29, 98, 135, 20, 106, 91, 101, 148, 246, 178, 92, + 162, 221, 143, 57, 114, 88, 166, 97, 93, 206, 214, 142, 96, 255, 97, 244, 148, 55, 100, 2, + 198, 9, 218, 115, 50, 89, 237, 147, 153, 200, 148, 79, 243, 92, 109, 131, 12, 86, 39, 100, + 128, 86, 44, 67, 181, 124, 204, 203, 2, 233, 172, 93, 141, 231, 76, 144, 44, 109, 176, 244, + 210, 38, 227, 181, 138, 240, 218, 231, 122, 220, 206, 214, 66, 189, 147, 92, 101, 150, 33, + 88, 75, 205, 110, 222, 152, 129, 148, 32, 7, 100, 156, 147, 106, 25, 99, 238, 65, 54, 33, + 207, 74, 31, 115, 129, 228, 193, 121, 88, 219, 237, 62, 55, 182, 221, 56, 25, 139, 125, 211, + 253, 7, 112, 189, 90, 176, 174, 183, 200, 53, 200, 76, 36, 29, 153, 225, 121, 42, 130, 239, + 16, 174, 149, 251, 120, 41, 50, 201, 158, 207, 230, 235, 210, 223, 48, 101, 144, 239, 5, 9, + 225, 218, 7, 180, 99, 232, 127, 45, 210, 206, 238, 27, 118, 15, 176, 215, 76, 95, 16, 247, + 226, 137, 50, 205, 232, 42, 5, 248, 206, 173, 67, 214, 32, 7, 156, 36, 203, 118, 127, 178, + 26, 194, 49, 105, 156, 172, 243, 13, 198, 223, 110, 85, 210, 215, 169, 63, 162, 70, 127, + 250, 160, 93, 39, 146, 72, 34, 159, 227, 24, 29, 18, 249, 60, 196, 28, 121, 110, 241, 149, + 39, 146, 72, 34, 137, 36, 146, 72, 34, 137, 36, 146, 72, 34, 255, 131, 81, 104, 246, 1, 217, + 42, 126, 217, 130, 104, 114, 129, 100, 74, 80, 164, 119, 138, 90, 34, 134, 253, 168, 36, 11, + 254, 66, 19, 93, 236, 127, 149, 206, 79, 219, 126, 57, 133, 45, 37, 238, 191, 108, 53, 195, + 179, 46, 201, 106, 165, 103, 3, 222, 232, 217, 7, 111, 241, 236, 151, 5, 234, 97, 28, 169, + 140, 246, 246, 107, 106, 87, 120, 86, 210, 93, 91, 239, 89, 147, 100, 109, 143, 103, 29, + 251, 159, 242, 108, 192, 71, 60, 251, 224, 15, 60, 227, 124, 244, 84, 217, 44, 150, 100, 75, + 22, 254, 231, 64, 69, 18, 146, 10, 137, 74, 68, 98, 72, 149, 196, 177, 47, 23, 138, 202, + 108, 231, 103, 0, 123, 66, 80, 88, 50, 240, 200, 40, 169, 195, 127, 75, 138, 177, 175, 90, + 106, 240, 88, 204, 217, 10, 98, 12, 226, 232, 70, 252, 172, 196, 145, 185, 120, 94, 29, 142, + 41, 199, 190, 16, 142, 8, 57, 199, 5, 49, 198, 241, 44, 251, 72, 11, 71, 88, 24, 131, 120, + 29, 251, 209, 184, 179, 215, 126, 182, 5, 219, 191, 183, 18, 91, 245, 24, 163, 82, 139, 125, + 145, 51, 207, 57, 251, 163, 85, 255, 213, 123, 177, 207, 40, 236, 188, 150, 125, 54, 150, + 148, 98, 43, 228, 156, 131, 253, 251, 75, 160, 128, 179, 21, 115, 126, 103, 24, 123, 51, + 189, 51, 136, 180, 121, 7, 21, 216, 106, 192, 163, 113, 231, 93, 218, 71, 103, 108, 182, + 178, 179, 178, 114, 172, 162, 80, 69, 52, 18, 139, 84, 197, 173, 220, 72, 116, 118, 36, 26, + 136, 135, 34, 225, 12, 107, 84, 93, 157, 85, 28, 170, 174, 137, 199, 172, 226, 96, 44, 24, + 109, 12, 86, 102, 20, 141, 207, 207, 207, 43, 77, 207, 13, 212, 133, 202, 163, 161, 143, + 219, 242, 6, 43, 20, 179, 130, 161, 120, 77, 48, 106, 5, 172, 104, 176, 58, 20, 139, 7, 163, + 193, 74, 43, 30, 13, 84, 6, 235, 3, 209, 90, 43, 98, 63, 210, 102, 179, 234, 236, 231, 99, + 133, 194, 22, 94, 198, 42, 13, 135, 226, 120, 126, 73, 60, 16, 15, 198, 172, 64, 184, 50, + 19, 47, 16, 113, 126, 65, 69, 164, 33, 28, 143, 134, 130, 177, 140, 207, 100, 218, 20, 201, + 120, 201, 199, 255, 60, 92, 144, 244, 127, 153, 68, 197, 206, 84, 105, 192, 30, 251, 162, + 127, 220, 145, 159, 244, 177, 255, 219, 73, 219, 220, 94, 183, 246, 106, 183, 60, 208, 62, + 69, 21, 0, 55, 19, 75, 136, 197, 196, 34, 226, 38, 98, 33, 177, 128, 184, 145, 184, 129, + 152, 79, 92, 79, 204, 35, 230, 18, 141, 68, 3, 17, 39, 98, 196, 28, 98, 54, 17, 33, 194, 68, + 61, 81, 71, 212, 18, 179, 136, 16, 81, 67, 84, 19, 85, 68, 144, 168, 36, 42, 136, 114, 34, + 64, 204, 36, 202, 136, 25, 196, 117, 196, 116, 98, 26, 113, 45, 49, 149, 152, 66, 76, 38, + 38, 17, 165, 196, 68, 162, 132, 40, 38, 38, 16, 227, 137, 175, 18, 227, 136, 34, 226, 26, + 162, 144, 40, 32, 242, 137, 177, 196, 24, 226, 106, 34, 143, 184, 138, 200, 37, 70, 19, 163, + 136, 145, 196, 8, 98, 56, 49, 140, 24, 74, 92, 73, 12, 33, 190, 66, 12, 38, 174, 32, 114, + 136, 65, 196, 229, 196, 64, 34, 155, 24, 64, 100, 17, 153, 68, 6, 113, 25, 209, 159, 72, 39, + 250, 17, 95, 38, 250, 18, 125, 136, 75, 137, 75, 136, 139, 137, 222, 68, 47, 226, 34, 194, + 34, 122, 18, 105, 68, 15, 162, 59, 241, 37, 226, 139, 68, 42, 145, 66, 116, 35, 186, 18, 93, + 136, 206, 68, 39, 162, 35, 113, 33, 113, 1, 113, 62, 145, 76, 124, 129, 232, 64, 156, 71, + 36, 17, 237, 137, 118, 132, 159, 240, 17, 38, 97, 16, 58, 161, 17, 138, 16, 15, 170, 149, + 56, 77, 124, 64, 180, 16, 255, 36, 78, 17, 39, 137, 247, 137, 247, 136, 127, 16, 39, 136, + 191, 19, 239, 18, 199, 137, 191, 17, 239, 16, 127, 37, 222, 38, 142, 17, 111, 17, 111, 18, + 111, 16, 175, 19, 175, 17, 127, 33, 254, 76, 252, 137, 120, 149, 56, 74, 252, 145, 56, 66, + 252, 129, 56, 76, 188, 66, 252, 158, 248, 29, 241, 50, 241, 91, 226, 55, 196, 175, 137, 67, + 196, 175, 136, 151, 136, 23, 137, 23, 136, 231, 137, 95, 18, 207, 17, 191, 32, 126, 78, 60, + 75, 252, 140, 56, 72, 60, 67, 28, 32, 126, 74, 252, 132, 120, 154, 120, 138, 216, 79, 252, + 152, 120, 146, 120, 130, 120, 156, 120, 140, 120, 148, 248, 17, 177, 143, 120, 132, 120, + 152, 120, 136, 216, 75, 236, 33, 118, 19, 15, 18, 15, 16, 187, 136, 102, 98, 39, 177, 131, + 216, 78, 108, 35, 182, 18, 91, 136, 31, 18, 63, 32, 54, 19, 223, 39, 190, 71, 220, 79, 220, + 71, 220, 75, 124, 151, 216, 68, 220, 67, 124, 135, 104, 34, 54, 18, 27, 136, 111, 19, 235, + 137, 117, 196, 90, 226, 91, 196, 221, 196, 26, 98, 53, 177, 138, 248, 38, 113, 23, 241, 13, + 98, 37, 241, 117, 226, 78, 98, 5, 113, 7, 177, 156, 184, 157, 88, 70, 220, 70, 124, 141, + 184, 149, 88, 74, 176, 246, 40, 214, 30, 197, 218, 163, 88, 123, 20, 107, 143, 98, 237, 81, + 172, 61, 138, 181, 71, 177, 246, 40, 214, 30, 197, 218, 163, 88, 123, 20, 107, 143, 98, 237, + 81, 172, 61, 138, 181, 71, 177, 246, 40, 214, 30, 21, 37, 216, 127, 20, 251, 143, 98, 255, + 81, 236, 63, 138, 253, 71, 177, 255, 40, 246, 31, 197, 254, 163, 216, 127, 20, 251, 143, 98, + 255, 81, 236, 63, 138, 253, 71, 177, 255, 40, 246, 31, 197, 254, 163, 216, 127, 20, 251, + 143, 98, 255, 81, 236, 63, 138, 253, 71, 177, 255, 40, 246, 31, 197, 254, 163, 216, 127, 20, + 251, 143, 98, 255, 81, 236, 63, 138, 253, 71, 177, 255, 40, 246, 31, 197, 254, 163, 88, 123, + 20, 107, 143, 98, 237, 81, 108, 59, 138, 109, 71, 177, 237, 40, 182, 29, 197, 182, 163, 216, + 118, 20, 219, 142, 98, 219, 81, 108, 59, 42, 119, 151, 13, 180, 230, 230, 180, 225, 61, 209, + 153, 155, 211, 186, 96, 88, 226, 110, 45, 110, 78, 27, 130, 97, 145, 187, 117, 147, 59, 44, + 108, 78, 235, 128, 97, 129, 187, 117, 163, 59, 220, 224, 14, 243, 221, 225, 250, 230, 30, + 163, 48, 204, 107, 238, 145, 139, 97, 174, 59, 52, 186, 67, 131, 251, 88, 220, 221, 138, + 185, 67, 212, 221, 57, 167, 185, 199, 104, 12, 179, 221, 33, 226, 14, 97, 247, 144, 122, + 119, 168, 115, 135, 218, 230, 238, 31, 82, 91, 223, 113, 77, 157, 11, 24, 199, 207, 73, 80, + 145, 16, 78, 130, 73, 24, 1, 15, 110, 49, 162, 224, 140, 171, 68, 70, 28, 145, 37, 188, 202, + 16, 80, 64, 192, 173, 129, 184, 163, 184, 110, 189, 247, 214, 209, 189, 91, 59, 172, 109, + 211, 17, 94, 109, 107, 91, 91, 237, 222, 181, 123, 217, 86, 187, 119, 181, 173, 117, 43, + 125, 194, 115, 255, 238, 191, 247, 94, 244, 151, 239, 121, 39, 137, 31, 106, 205, 7, 243, + 201, 60, 210, 76, 154, 72, 163, 76, 201, 3, 115, 57, 106, 32, 245, 164, 142, 204, 33, 179, + 73, 45, 169, 225, 185, 106, 142, 102, 145, 42, 82, 73, 42, 72, 57, 153, 73, 102, 16, 65, + 202, 72, 41, 153, 78, 74, 72, 49, 41, 34, 133, 164, 128, 76, 35, 62, 50, 85, 58, 167, 128, + 41, 100, 178, 116, 78, 5, 147, 136, 87, 58, 125, 32, 95, 58, 167, 129, 60, 146, 75, 114, + 184, 54, 145, 231, 60, 36, 155, 231, 46, 35, 19, 200, 120, 238, 28, 71, 198, 242, 248, 24, + 226, 38, 163, 201, 40, 50, 146, 151, 141, 32, 195, 121, 203, 48, 146, 69, 50, 121, 217, 80, + 50, 132, 231, 50, 200, 96, 226, 34, 131, 72, 58, 25, 72, 6, 240, 234, 254, 164, 31, 239, + 236, 75, 250, 144, 222, 188, 186, 23, 73, 227, 57, 157, 244, 36, 169, 36, 133, 56, 73, 178, + 76, 46, 4, 73, 36, 81, 38, 23, 129, 4, 226, 224, 164, 157, 216, 56, 217, 131, 196, 19, 43, + 215, 44, 68, 227, 100, 28, 49, 147, 88, 174, 153, 72, 12, 233, 206, 181, 104, 210, 141, 116, + 149, 73, 197, 160, 139, 76, 42, 1, 81, 196, 200, 73, 3, 71, 42, 81, 58, 81, 59, 200, 165, + 206, 45, 234, 69, 142, 46, 144, 243, 228, 28, 215, 206, 114, 116, 134, 156, 38, 167, 200, + 159, 50, 177, 12, 156, 148, 137, 165, 224, 15, 142, 126, 39, 191, 145, 19, 92, 59, 206, 209, + 175, 228, 23, 242, 51, 215, 126, 34, 63, 114, 242, 7, 242, 61, 249, 142, 124, 203, 45, 223, + 112, 244, 53, 71, 95, 113, 244, 37, 249, 130, 28, 227, 218, 81, 242, 57, 39, 63, 35, 159, + 146, 35, 228, 19, 110, 249, 152, 163, 143, 200, 135, 50, 97, 38, 248, 64, 38, 204, 0, 239, + 147, 247, 56, 249, 46, 121, 135, 188, 77, 222, 226, 150, 195, 228, 77, 78, 190, 65, 94, 39, + 175, 145, 87, 185, 229, 21, 242, 50, 39, 95, 34, 47, 146, 23, 200, 243, 228, 57, 238, 124, + 150, 163, 103, 200, 33, 114, 144, 107, 79, 147, 167, 56, 121, 128, 60, 73, 158, 32, 143, + 147, 253, 220, 249, 24, 71, 143, 146, 71, 200, 62, 178, 87, 58, 178, 129, 148, 142, 42, 208, + 78, 194, 228, 97, 242, 16, 121, 144, 60, 64, 66, 228, 126, 233, 192, 223, 215, 234, 125, + 188, 229, 94, 178, 135, 107, 247, 144, 221, 228, 110, 114, 23, 185, 147, 220, 65, 118, 145, + 219, 121, 217, 109, 188, 229, 86, 114, 11, 215, 110, 38, 55, 145, 27, 201, 13, 60, 112, 61, + 71, 215, 145, 107, 201, 53, 92, 187, 154, 183, 92, 69, 174, 228, 218, 78, 178, 131, 108, 39, + 219, 200, 21, 220, 249, 111, 142, 254, 69, 254, 73, 182, 146, 203, 201, 63, 164, 125, 14, + 216, 34, 237, 117, 96, 51, 217, 36, 237, 141, 96, 35, 217, 32, 237, 2, 180, 73, 59, 254, 50, + 86, 215, 75, 251, 40, 176, 142, 4, 121, 124, 45, 207, 173, 33, 171, 165, 189, 1, 172, 226, + 241, 149, 100, 5, 89, 78, 2, 164, 149, 180, 240, 106, 63, 143, 47, 35, 75, 165, 189, 30, 44, + 225, 101, 139, 185, 115, 17, 89, 72, 22, 144, 249, 100, 30, 207, 53, 147, 38, 190, 179, 70, + 30, 159, 75, 26, 184, 179, 158, 212, 145, 57, 100, 54, 169, 37, 53, 252, 208, 213, 124, 103, + 179, 72, 21, 63, 116, 37, 175, 174, 224, 55, 42, 39, 51, 249, 118, 103, 240, 27, 9, 222, 82, + 70, 74, 201, 116, 82, 34, 109, 30, 80, 44, 109, 145, 239, 80, 36, 109, 145, 31, 239, 66, + 105, 219, 4, 10, 164, 45, 3, 76, 227, 22, 31, 153, 42, 109, 248, 119, 129, 58, 133, 163, + 201, 100, 18, 39, 189, 210, 182, 14, 228, 75, 219, 229, 32, 79, 218, 214, 131, 92, 105, 107, + 3, 57, 50, 222, 11, 38, 18, 15, 201, 38, 151, 201, 120, 252, 255, 93, 157, 192, 209, 120, + 105, 173, 0, 227, 200, 88, 105, 141, 252, 104, 140, 33, 110, 105, 157, 4, 70, 75, 107, 57, + 24, 37, 173, 149, 96, 36, 215, 70, 144, 225, 210, 58, 24, 12, 227, 206, 44, 105, 141, 124, + 176, 76, 105, 141, 252, 183, 57, 148, 12, 225, 241, 12, 126, 135, 193, 196, 197, 203, 6, + 145, 116, 94, 54, 144, 12, 32, 253, 73, 63, 105, 141, 252, 41, 245, 37, 125, 120, 103, 111, + 222, 217, 139, 151, 165, 241, 22, 157, 244, 228, 185, 84, 146, 66, 156, 36, 153, 36, 73, 75, + 53, 72, 148, 150, 26, 144, 32, 45, 181, 192, 65, 236, 196, 70, 122, 144, 120, 30, 176, 242, + 128, 133, 147, 26, 137, 35, 102, 18, 203, 157, 38, 238, 140, 225, 100, 119, 18, 77, 186, + 145, 174, 220, 217, 133, 59, 163, 56, 105, 36, 6, 162, 18, 197, 211, 161, 213, 233, 145, 46, + 105, 245, 250, 69, 173, 65, 191, 128, 231, 243, 232, 28, 58, 139, 185, 51, 152, 59, 141, 78, + 161, 63, 209, 73, 204, 255, 129, 126, 199, 218, 111, 24, 159, 64, 199, 209, 175, 232, 23, + 204, 255, 140, 126, 194, 218, 143, 24, 255, 128, 190, 71, 223, 161, 111, 227, 154, 244, 111, + 226, 154, 245, 175, 209, 87, 232, 75, 244, 5, 230, 142, 193, 163, 232, 115, 244, 25, 198, + 159, 194, 35, 232, 19, 244, 49, 250, 200, 188, 64, 255, 208, 156, 165, 127, 0, 223, 55, 47, + 212, 223, 51, 247, 215, 223, 69, 239, 224, 249, 109, 179, 75, 127, 11, 29, 70, 111, 98, 253, + 13, 204, 189, 110, 94, 164, 191, 134, 231, 87, 241, 252, 10, 158, 95, 54, 207, 215, 95, 50, + 207, 211, 95, 52, 55, 235, 47, 152, 155, 244, 231, 113, 246, 57, 220, 247, 44, 122, 6, 121, + 58, 14, 225, 245, 32, 122, 26, 61, 21, 187, 76, 63, 16, 235, 215, 159, 140, 109, 209, 159, + 136, 109, 213, 31, 71, 251, 209, 99, 152, 127, 20, 61, 130, 181, 125, 88, 219, 139, 57, 137, + 218, 81, 24, 61, 108, 90, 165, 63, 100, 90, 173, 63, 104, 90, 171, 63, 96, 10, 234, 33, 211, + 58, 253, 126, 116, 31, 186, 23, 237, 65, 247, 160, 221, 166, 12, 253, 110, 120, 23, 186, 19, + 103, 238, 128, 187, 76, 11, 244, 219, 241, 124, 27, 158, 111, 69, 183, 224, 249, 102, 220, + 117, 19, 238, 186, 17, 119, 221, 128, 185, 235, 209, 117, 232, 90, 116, 13, 186, 26, 93, + 133, 115, 87, 226, 190, 157, 49, 133, 250, 142, 152, 34, 125, 123, 76, 147, 190, 45, 102, + 183, 126, 69, 204, 30, 125, 139, 177, 159, 190, 217, 232, 214, 55, 169, 110, 125, 163, 104, + 19, 27, 66, 109, 98, 189, 8, 138, 117, 161, 160, 48, 5, 85, 83, 208, 25, 244, 5, 215, 4, 67, + 193, 35, 65, 79, 65, 215, 152, 181, 98, 181, 88, 19, 90, 45, 86, 137, 21, 98, 101, 104, 133, + 88, 30, 10, 136, 168, 128, 45, 208, 26, 48, 158, 12, 168, 161, 128, 154, 23, 80, 51, 3, 170, + 65, 9, 88, 2, 105, 1, 99, 108, 171, 240, 139, 150, 144, 95, 40, 254, 98, 127, 155, 63, 236, + 143, 26, 23, 246, 31, 243, 27, 20, 191, 26, 179, 191, 227, 208, 94, 191, 179, 167, 23, 122, + 214, 250, 205, 22, 239, 50, 177, 68, 44, 13, 45, 17, 139, 27, 23, 137, 249, 120, 91, 243, + 220, 77, 162, 57, 212, 36, 26, 221, 13, 98, 110, 168, 65, 212, 187, 235, 196, 28, 247, 108, + 81, 235, 174, 22, 53, 161, 106, 49, 203, 93, 41, 170, 66, 149, 162, 194, 93, 46, 102, 98, + 255, 12, 119, 153, 16, 161, 50, 81, 234, 46, 17, 211, 67, 37, 162, 200, 93, 40, 10, 49, 95, + 224, 246, 137, 105, 33, 159, 152, 234, 158, 44, 166, 132, 38, 139, 73, 110, 175, 200, 199, + 71, 86, 82, 44, 41, 105, 41, 70, 75, 228, 13, 20, 166, 224, 157, 40, 78, 53, 39, 211, 233, + 113, 30, 115, 158, 112, 70, 41, 206, 176, 243, 144, 211, 24, 175, 37, 235, 201, 134, 116, + 45, 73, 205, 45, 74, 82, 151, 36, 173, 79, 218, 145, 100, 212, 18, 15, 39, 26, 60, 137, 233, + 131, 189, 90, 194, 225, 132, 163, 9, 199, 19, 162, 122, 120, 18, 210, 135, 120, 21, 135, + 197, 145, 230, 48, 218, 35, 159, 205, 81, 80, 230, 237, 52, 59, 143, 102, 141, 236, 252, + 172, 5, 142, 62, 253, 189, 154, 93, 213, 236, 186, 221, 144, 175, 219, 85, 197, 122, 204, + 122, 194, 106, 180, 31, 180, 28, 182, 24, 52, 77, 213, 180, 14, 205, 224, 209, 176, 93, 139, + 211, 227, 12, 145, 151, 142, 56, 163, 39, 46, 107, 180, 87, 51, 235, 102, 67, 228, 165, 195, + 108, 116, 120, 204, 152, 137, 220, 56, 32, 182, 184, 204, 171, 153, 116, 147, 65, 100, 155, + 138, 76, 6, 143, 41, 59, 215, 235, 49, 101, 100, 122, 21, 163, 154, 166, 170, 138, 106, 1, + 198, 104, 236, 221, 167, 218, 117, 175, 241, 0, 166, 20, 165, 139, 162, 170, 59, 219, 203, + 74, 93, 46, 223, 254, 104, 101, 186, 47, 28, 93, 92, 21, 86, 183, 134, 251, 149, 70, 94, 61, + 37, 149, 225, 174, 91, 195, 138, 168, 172, 42, 111, 87, 213, 237, 21, 237, 170, 33, 183, 44, + 108, 243, 149, 84, 114, 188, 101, 219, 54, 37, 53, 199, 23, 78, 45, 45, 151, 198, 93, 187, + 82, 115, 42, 124, 225, 182, 200, 179, 199, 211, 249, 220, 17, 121, 86, 176, 165, 194, 85, + 211, 18, 104, 113, 185, 90, 107, 240, 82, 211, 210, 234, 234, 252, 141, 145, 26, 136, 140, + 92, 145, 201, 200, 239, 150, 86, 140, 35, 191, 2, 157, 99, 197, 245, 183, 95, 220, 6, 106, + 91, 240, 213, 250, 159, 185, 214, 191, 63, 244, 191, 254, 165, 254, 183, 223, 192, 255, 255, + 87, 187, 130, 31, 211, 242, 137, 29, 134, 205, 74, 131, 97, 19, 218, 136, 54, 160, 54, 180, + 30, 173, 67, 65, 180, 22, 173, 65, 171, 209, 42, 180, 18, 173, 64, 203, 81, 0, 181, 162, 22, + 180, 12, 45, 69, 75, 208, 98, 180, 8, 45, 68, 11, 208, 124, 52, 15, 53, 163, 38, 212, 136, + 230, 162, 6, 84, 143, 234, 208, 28, 52, 27, 213, 162, 26, 84, 141, 102, 161, 42, 84, 137, + 42, 80, 57, 154, 137, 102, 32, 129, 202, 80, 41, 154, 142, 74, 80, 49, 42, 66, 133, 168, 0, + 77, 67, 62, 52, 21, 77, 65, 147, 209, 36, 228, 69, 249, 40, 15, 229, 162, 28, 52, 17, 121, + 80, 54, 186, 12, 77, 64, 227, 209, 56, 52, 22, 141, 65, 110, 52, 26, 141, 66, 35, 209, 8, + 52, 28, 13, 67, 89, 40, 19, 13, 69, 67, 80, 6, 26, 140, 92, 104, 16, 74, 71, 3, 209, 0, 212, + 31, 245, 67, 125, 81, 31, 212, 27, 245, 66, 105, 72, 71, 61, 81, 42, 74, 65, 78, 148, 140, + 146, 80, 34, 74, 64, 14, 100, 71, 54, 212, 3, 197, 35, 43, 178, 32, 13, 197, 33, 51, 138, + 69, 38, 20, 131, 186, 163, 104, 212, 13, 117, 69, 93, 80, 212, 196, 14, 188, 26, 145, 1, + 169, 72, 81, 26, 84, 204, 169, 151, 208, 69, 116, 1, 157, 71, 231, 208, 89, 116, 6, 157, 70, + 167, 254, 162, 166, 78, 182, 122, 0, 192, 48, 14, 247, 222, 69, 183, 211, 101, 216, 104, + 227, 10, 186, 130, 54, 81, 81, 148, 208, 36, 74, 134, 6, 33, 52, 79, 8, 77, 138, 20, 146, + 33, 36, 83, 166, 134, 125, 207, 93, 252, 79, 223, 57, 207, 254, 219, 188, 63, 246, 217, 99, + 151, 29, 254, 243, 143, 191, 252, 225, 55, 219, 252, 226, 39, 63, 248, 206, 55, 182, 248, + 202, 38, 95, 248, 204, 39, 54, 248, 200, 7, 222, 243, 142, 117, 222, 178, 198, 27, 94, 243, + 138, 85, 86, 120, 201, 50, 47, 120, 206, 18, 139, 60, 99, 129, 121, 230, 152, 101, 134, 167, + 60, 225, 49, 211, 60, 226, 33, 15, 152, 98, 146, 9, 198, 25, 99, 148, 17, 134, 25, 98, 144, + 1, 238, 115, 143, 187, 244, 115, 135, 219, 220, 162, 143, 155, 244, 210, 67, 55, 93, 220, + 224, 58, 215, 184, 74, 39, 87, 232, 160, 157, 203, 92, 162, 141, 139, 180, 210, 66, 51, 77, + 52, 114, 129, 243, 156, 163, 129, 179, 212, 83, 199, 25, 78, 83, 75, 13, 167, 56, 73, 53, + 85, 84, 114, 130, 227, 84, 20, 29, 43, 41, 143, 253, 199, 254, 99, 255, 177, 255, 216, 127, + 236, 63, 246, 31, 251, 143, 253, 199, 254, 99, 255, 177, 255, 216, 127, 236, 63, 246, 31, + 251, 143, 253, 199, 254, 83, 134, 6, 68, 3, 162, 1, 209, 128, 104, 64, 52, 32, 26, 16, 13, + 136, 6, 68, 3, 162, 1, 209, 128, 104, 64, 52, 32, 26, 16, 13, 136, 6, 68, 3, 162, 1, 209, + 128, 104, 64, 52, 32, 26, 16, 13, 136, 6, 68, 3, 162, 1, 209, 128, 104, 64, 52, 32, 26, 16, + 13, 136, 253, 199, 254, 99, 255, 177, 253, 216, 126, 108, 63, 182, 31, 219, 143, 237, 199, + 246, 99, 251, 177, 253, 216, 126, 161, 59, 124, 200, 239, 72, 161, 31, 56, 228, 87, 92, 122, + 244, 64, 128, 1, 0, 29, 190, 176, 167, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, + 13, 101, 110, 100, 111, 98, 106, 13, 53, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, + 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, + 110, 103, 116, 104, 32, 50, 53, 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, + 92, 144, 77, 75, 196, 48, 16, 134, 239, 249, 21, 115, 220, 61, 44, 73, 170, 214, 75, 41, + 172, 85, 161, 7, 63, 176, 250, 3, 210, 100, 90, 3, 54, 9, 105, 122, 232, 191, 119, 154, 46, + 43, 56, 144, 192, 195, 188, 239, 124, 241, 166, 125, 108, 157, 77, 192, 223, 163, 215, 29, + 38, 24, 172, 51, 17, 103, 191, 68, 141, 208, 227, 104, 29, 147, 5, 24, 171, 211, 133, 242, + 175, 39, 21, 24, 39, 115, 183, 206, 9, 167, 214, 13, 158, 85, 21, 240, 15, 74, 206, 41, 174, + 112, 56, 27, 223, 227, 145, 241, 183, 104, 48, 90, 55, 194, 225, 171, 233, 142, 192, 187, + 37, 132, 31, 156, 208, 37, 16, 80, 215, 96, 112, 160, 66, 47, 42, 188, 170, 9, 129, 103, + 219, 169, 53, 148, 183, 105, 61, 145, 231, 79, 241, 185, 6, 132, 34, 179, 220, 135, 209, + 222, 224, 28, 148, 198, 168, 220, 136, 172, 18, 20, 53, 84, 207, 20, 53, 67, 103, 254, 229, + 239, 118, 87, 63, 232, 111, 21, 73, 45, 69, 65, 106, 33, 74, 89, 103, 239, 77, 166, 66, 100, + 146, 50, 211, 109, 177, 145, 44, 155, 93, 249, 144, 233, 190, 220, 233, 41, 119, 185, 212, + 219, 250, 209, 89, 224, 186, 140, 94, 98, 164, 61, 242, 237, 242, 2, 219, 232, 214, 225, + 245, 188, 193, 7, 32, 215, 246, 216, 175, 0, 3, 0, 158, 136, 122, 122, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, 56, 32, 48, 32, + 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, + 101, 99, 111, 100, 101, 47, 70, 105, 114, 115, 116, 32, 51, 48, 47, 76, 101, 110, 103, 116, + 104, 32, 50, 52, 56, 48, 47, 78, 32, 52, 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, + 109, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 156, 152, 75, 111, 92, 185, 17, + 133, 255, 10, 151, 54, 6, 131, 230, 163, 248, 2, 6, 6, 108, 43, 147, 104, 49, 147, 192, 154, + 196, 3, 92, 112, 33, 219, 29, 141, 0, 189, 32, 247, 0, 241, 191, 207, 119, 234, 182, 147, + 56, 64, 54, 89, 180, 200, 75, 178, 200, 226, 169, 83, 15, 42, 181, 24, 98, 72, 45, 133, 154, + 105, 114, 200, 179, 210, 150, 96, 35, 151, 240, 195, 15, 135, 63, 63, 127, 58, 62, 223, 62, + 220, 188, 184, 252, 116, 124, 56, 221, 158, 190, 188, 60, 188, 59, 222, 220, 126, 62, 61, + 127, 121, 241, 250, 211, 227, 135, 227, 203, 195, 213, 239, 79, 79, 119, 199, 123, 166, 67, + 124, 245, 10, 153, 215, 159, 63, 234, 99, 214, 124, 120, 123, 121, 113, 117, 60, 133, 90, + 57, 229, 221, 225, 237, 245, 211, 159, 142, 183, 55, 191, 157, 66, 43, 249, 112, 113, 220, + 215, 125, 159, 166, 29, 126, 188, 187, 190, 249, 28, 104, 31, 31, 78, 111, 222, 60, 254, 99, + 251, 222, 122, 243, 169, 144, 114, 50, 109, 182, 124, 242, 199, 235, 251, 219, 187, 47, 47, + 222, 94, 223, 221, 126, 120, 190, 125, 185, 143, 221, 222, 29, 115, 168, 205, 15, 209, 192, + 207, 215, 247, 199, 195, 79, 127, 185, 188, 252, 195, 95, 191, 59, 175, 244, 241, 171, 211, + 243, 241, 244, 241, 183, 195, 207, 143, 207, 247, 215, 119, 62, 244, 126, 87, 200, 98, 60, + 92, 158, 88, 250, 241, 245, 195, 205, 221, 49, 196, 195, 213, 233, 120, 255, 183, 48, 226, + 225, 151, 47, 79, 71, 95, 42, 133, 159, 111, 159, 78, 143, 207, 135, 95, 207, 247, 176, 214, + 253, 202, 111, 174, 63, 31, 181, 228, 191, 15, 213, 253, 191, 124, 102, 167, 203, 135, 191, + 63, 2, 108, 220, 113, 184, 188, 248, 229, 241, 143, 151, 23, 63, 93, 63, 29, 190, 226, 122, + 184, 120, 31, 82, 68, 139, 111, 79, 114, 219, 72, 230, 234, 247, 15, 39, 41, 130, 172, 86, + 72, 169, 252, 111, 213, 14, 239, 183, 184, 213, 216, 87, 10, 153, 229, 101, 203, 185, 45, + 160, 179, 80, 251, 12, 73, 54, 13, 29, 179, 166, 190, 85, 179, 149, 70, 192, 188, 181, 148, + 144, 45, 228, 26, 26, 43, 114, 11, 185, 135, 198, 87, 30, 161, 116, 24, 64, 51, 54, 171, + 115, 149, 25, 172, 96, 179, 20, 204, 130, 177, 28, 97, 107, 91, 171, 156, 209, 133, 123, + 134, 61, 149, 173, 123, 90, 117, 132, 58, 67, 73, 51, 112, 89, 231, 21, 77, 14, 162, 148, + 122, 182, 89, 222, 187, 86, 98, 168, 214, 194, 168, 117, 181, 25, 58, 7, 240, 213, 109, 107, + 121, 172, 94, 195, 96, 0, 193, 97, 172, 160, 71, 211, 182, 209, 250, 26, 61, 160, 89, 77, + 52, 115, 107, 189, 172, 25, 195, 228, 50, 104, 8, 89, 38, 170, 114, 62, 72, 242, 19, 141, + 59, 45, 64, 128, 68, 51, 40, 158, 234, 86, 217, 36, 129, 71, 66, 137, 129, 48, 252, 218, + 106, 154, 43, 101, 230, 65, 193, 101, 128, 34, 161, 160, 181, 65, 155, 0, 146, 187, 139, + 139, 218, 67, 88, 116, 228, 204, 128, 60, 175, 4, 34, 169, 178, 182, 51, 95, 89, 43, 48, 76, + 168, 131, 119, 197, 2, 64, 146, 170, 76, 0, 120, 133, 126, 171, 155, 37, 140, 208, 208, 129, + 125, 170, 219, 5, 185, 142, 156, 116, 239, 5, 36, 209, 81, 251, 13, 153, 136, 179, 6, 103, + 165, 130, 225, 216, 103, 0, 248, 208, 24, 58, 2, 133, 1, 93, 26, 200, 113, 151, 34, 249, + 153, 182, 2, 114, 234, 151, 134, 33, 97, 64, 175, 200, 78, 228, 192, 5, 43, 209, 114, 231, + 26, 87, 142, 184, 124, 98, 76, 231, 36, 198, 19, 58, 76, 181, 101, 147, 140, 92, 47, 67, 14, + 147, 76, 106, 91, 29, 141, 177, 30, 178, 12, 168, 117, 89, 63, 48, 211, 58, 48, 203, 194, + 204, 217, 197, 56, 152, 85, 44, 155, 45, 111, 54, 231, 202, 166, 187, 244, 208, 209, 61, 27, + 204, 234, 149, 49, 230, 193, 201, 138, 90, 113, 17, 125, 197, 68, 48, 203, 109, 184, 238, + 89, 123, 128, 83, 231, 158, 185, 163, 119, 70, 14, 172, 114, 215, 90, 141, 141, 109, 230, 9, + 77, 198, 18, 46, 121, 36, 238, 171, 54, 107, 45, 58, 64, 23, 217, 68, 114, 194, 142, 16, + 103, 147, 253, 103, 219, 74, 132, 104, 172, 73, 34, 137, 64, 24, 28, 174, 143, 85, 64, 70, + 179, 149, 157, 75, 108, 252, 38, 14, 35, 102, 131, 114, 74, 251, 56, 104, 21, 208, 25, 17, + 87, 129, 81, 98, 253, 0, 157, 2, 58, 5, 100, 124, 28, 86, 21, 57, 155, 214, 103, 219, 52, + 214, 185, 41, 236, 44, 171, 100, 45, 30, 231, 201, 9, 53, 205, 251, 44, 90, 165, 32, 136, + 135, 54, 109, 92, 112, 139, 130, 11, 204, 202, 56, 223, 22, 221, 36, 197, 244, 235, 186, 26, + 237, 216, 170, 246, 4, 210, 34, 248, 180, 103, 157, 155, 1, 95, 77, 200, 225, 140, 5, 170, + 101, 93, 130, 115, 10, 244, 51, 104, 41, 138, 148, 118, 94, 223, 230, 150, 155, 121, 31, 19, + 17, 6, 44, 116, 76, 167, 182, 244, 177, 159, 211, 209, 19, 179, 8, 206, 2, 212, 101, 168, + 207, 30, 162, 223, 60, 3, 51, 243, 54, 160, 87, 193, 49, 203, 172, 187, 28, 244, 43, 184, + 167, 244, 35, 218, 242, 171, 190, 222, 0, 215, 34, 180, 72, 26, 227, 14, 162, 17, 84, 41, + 69, 119, 106, 231, 150, 8, 146, 242, 50, 81, 49, 203, 165, 100, 250, 234, 152, 76, 141, 35, + 99, 69, 177, 132, 189, 20, 187, 206, 152, 152, 104, 70, 230, 48, 157, 9, 205, 186, 228, 43, + 49, 8, 156, 116, 119, 133, 10, 141, 91, 147, 171, 239, 186, 154, 98, 20, 198, 55, 12, 103, + 236, 95, 244, 83, 102, 84, 60, 148, 91, 129, 125, 78, 110, 76, 199, 49, 201, 253, 250, 240, + 111, 185, 113, 53, 206, 131, 134, 6, 155, 180, 222, 112, 221, 76, 136, 200, 162, 175, 108, + 39, 236, 165, 199, 204, 255, 34, 144, 168, 156, 193, 162, 68, 241, 1, 121, 176, 178, 217, + 131, 156, 108, 108, 89, 43, 207, 51, 53, 114, 66, 84, 140, 175, 177, 108, 174, 111, 86, 88, + 238, 204, 52, 198, 186, 207, 140, 111, 103, 68, 215, 228, 50, 184, 117, 86, 168, 242, 159, + 98, 185, 102, 193, 10, 151, 213, 236, 220, 220, 98, 93, 150, 152, 66, 120, 85, 167, 174, + 105, 22, 188, 11, 33, 208, 216, 13, 188, 153, 217, 121, 203, 76, 137, 219, 206, 4, 244, 28, + 101, 41, 175, 212, 226, 50, 5, 25, 180, 112, 172, 8, 235, 149, 240, 39, 39, 82, 228, 71, + 166, 138, 189, 88, 151, 81, 177, 212, 8, 110, 53, 198, 165, 172, 80, 205, 111, 130, 253, 20, + 94, 224, 227, 34, 92, 97, 247, 61, 220, 184, 59, 99, 55, 141, 216, 86, 252, 214, 197, 111, + 152, 77, 105, 204, 86, 109, 10, 172, 201, 211, 95, 109, 89, 89, 15, 205, 145, 108, 154, 83, + 80, 104, 158, 225, 72, 6, 120, 8, 154, 41, 72, 160, 131, 82, 91, 237, 113, 35, 245, 44, 5, + 202, 42, 171, 121, 118, 35, 0, 231, 232, 223, 100, 44, 207, 85, 88, 112, 249, 254, 88, 91, + 169, 170, 142, 180, 185, 60, 136, 26, 193, 168, 14, 197, 148, 238, 9, 165, 142, 65, 64, 149, + 39, 42, 24, 115, 71, 121, 10, 118, 85, 98, 171, 74, 95, 66, 118, 170, 95, 149, 84, 176, 65, + 81, 96, 103, 157, 242, 233, 244, 196, 209, 98, 36, 123, 182, 213, 224, 64, 139, 123, 178, + 104, 176, 128, 189, 25, 35, 193, 193, 0, 37, 139, 22, 185, 147, 228, 193, 147, 32, 238, 1, + 223, 44, 45, 60, 8, 47, 42, 30, 231, 90, 226, 62, 98, 191, 230, 208, 137, 160, 205, 60, 103, + 120, 102, 22, 14, 220, 165, 41, 240, 43, 249, 50, 135, 5, 85, 27, 144, 0, 104, 245, 83, 226, + 87, 189, 160, 168, 147, 156, 35, 38, 187, 229, 178, 40, 238, 200, 247, 156, 143, 55, 226, + 161, 27, 145, 137, 49, 246, 129, 253, 21, 239, 108, 133, 82, 161, 184, 254, 140, 79, 79, + 204, 216, 140, 182, 108, 238, 149, 120, 162, 172, 141, 215, 174, 6, 15, 154, 71, 34, 246, + 194, 139, 155, 88, 160, 58, 165, 42, 129, 177, 206, 195, 114, 118, 86, 150, 209, 87, 211, + 153, 194, 89, 17, 163, 97, 71, 24, 211, 196, 116, 116, 238, 68, 85, 225, 173, 123, 53, 60, + 172, 53, 18, 64, 218, 189, 12, 182, 46, 37, 245, 166, 196, 130, 189, 41, 44, 136, 132, 172, + 151, 94, 96, 32, 175, 105, 189, 237, 145, 79, 44, 166, 138, 106, 244, 219, 216, 43, 153, + 134, 237, 77, 209, 90, 227, 194, 23, 236, 197, 175, 166, 170, 5, 123, 81, 28, 48, 206, 247, + 140, 126, 223, 134, 253, 219, 60, 159, 53, 241, 100, 10, 144, 134, 22, 77, 209, 82, 5, 6, + 201, 169, 113, 167, 129, 62, 206, 55, 120, 53, 122, 91, 157, 189, 122, 204, 206, 183, 142, + 237, 27, 81, 202, 61, 216, 241, 150, 15, 117, 214, 144, 98, 226, 30, 149, 137, 170, 91, 213, + 153, 179, 59, 247, 28, 111, 241, 24, 156, 6, 156, 87, 1, 164, 234, 175, 139, 191, 178, 163, + 13, 247, 189, 161, 123, 250, 185, 170, 14, 135, 219, 219, 156, 163, 30, 127, 86, 103, 109, + 87, 134, 18, 199, 74, 241, 200, 64, 33, 195, 184, 190, 187, 243, 181, 83, 62, 182, 225, 69, + 207, 234, 240, 178, 91, 118, 206, 116, 238, 215, 241, 199, 236, 99, 117, 35, 105, 51, 175, + 218, 175, 123, 17, 213, 149, 201, 224, 147, 115, 23, 142, 244, 170, 132, 158, 157, 183, 140, + 109, 242, 126, 231, 109, 55, 47, 60, 196, 221, 94, 149, 86, 21, 205, 193, 5, 187, 43, 110, + 53, 21, 35, 189, 186, 95, 43, 114, 40, 162, 118, 157, 47, 191, 228, 188, 54, 166, 219, 200, + 134, 251, 50, 5, 134, 41, 254, 132, 61, 254, 12, 183, 179, 10, 9, 141, 155, 219, 93, 177, + 80, 126, 137, 78, 236, 209, 199, 158, 161, 58, 54, 46, 117, 143, 140, 42, 246, 148, 25, 59, + 184, 118, 246, 84, 161, 209, 177, 175, 159, 133, 111, 116, 236, 219, 101, 11, 50, 119, 247, + 185, 233, 217, 118, 224, 219, 100, 230, 37, 174, 12, 101, 31, 21, 188, 242, 109, 178, 162, + 238, 15, 247, 20, 77, 209, 101, 231, 191, 240, 169, 57, 173, 33, 142, 36, 47, 110, 104, 139, + 87, 215, 202, 170, 248, 130, 103, 110, 149, 35, 3, 251, 41, 203, 13, 226, 187, 117, 217, 82, + 54, 41, 238, 35, 158, 37, 85, 126, 163, 67, 55, 221, 209, 253, 130, 59, 202, 255, 184, 43, + 118, 234, 202, 132, 194, 70, 5, 157, 228, 224, 234, 192, 198, 67, 239, 2, 233, 142, 29, 135, + 233, 153, 50, 76, 5, 187, 98, 61, 236, 34, 178, 15, 89, 20, 111, 30, 202, 195, 100, 134, 97, + 42, 211, 136, 210, 32, 48, 240, 96, 229, 114, 229, 89, 188, 107, 141, 106, 206, 116, 149, + 125, 228, 241, 109, 247, 12, 141, 243, 77, 36, 151, 7, 14, 61, 8, 20, 149, 146, 198, 218, + 158, 203, 176, 190, 51, 89, 245, 16, 26, 185, 199, 200, 234, 73, 45, 150, 193, 186, 42, 133, + 61, 199, 79, 189, 105, 252, 123, 13, 178, 213, 80, 142, 38, 106, 14, 189, 50, 198, 94, 22, + 142, 161, 239, 25, 166, 74, 195, 169, 39, 66, 218, 199, 177, 230, 152, 123, 54, 24, 211, + 107, 49, 100, 185, 27, 145, 100, 112, 31, 101, 161, 225, 235, 84, 24, 82, 151, 192, 164, + 137, 53, 85, 142, 78, 44, 58, 89, 171, 242, 115, 70, 243, 189, 37, 59, 163, 190, 119, 217, + 137, 215, 206, 120, 150, 197, 234, 147, 72, 173, 115, 167, 34, 245, 144, 245, 227, 154, 100, + 176, 169, 236, 226, 227, 202, 141, 170, 159, 96, 199, 80, 68, 96, 15, 215, 197, 252, 12, + 218, 53, 177, 195, 204, 178, 20, 99, 138, 212, 170, 179, 56, 91, 209, 65, 88, 105, 31, 101, + 40, 141, 123, 63, 122, 221, 180, 38, 204, 159, 231, 249, 105, 254, 178, 220, 231, 197, 180, + 120, 142, 4, 94, 55, 141, 53, 177, 241, 180, 157, 97, 211, 230, 214, 245, 172, 137, 249, 12, + 166, 82, 48, 23, 171, 93, 133, 211, 92, 147, 176, 51, 85, 188, 233, 209, 86, 81, 200, 84, + 32, 137, 210, 80, 142, 148, 59, 49, 240, 84, 248, 151, 226, 184, 192, 236, 197, 15, 156, 74, + 191, 80, 79, 21, 182, 66, 139, 233, 45, 42, 163, 186, 220, 185, 40, 209, 27, 147, 183, 221, + 28, 122, 6, 150, 93, 161, 137, 220, 215, 179, 1, 103, 206, 243, 217, 115, 120, 58, 255, 207, + 179, 121, 51, 102, 61, 28, 247, 211, 233, 168, 72, 79, 251, 249, 116, 200, 99, 122, 240, + 120, 69, 218, 246, 170, 144, 139, 20, 20, 241, 135, 150, 170, 156, 22, 207, 143, 46, 219, + 219, 170, 77, 245, 146, 140, 212, 74, 122, 54, 209, 153, 255, 231, 54, 122, 120, 70, 189, + 160, 124, 27, 158, 158, 197, 235, 100, 252, 5, 31, 97, 192, 71, 135, 51, 140, 14, 101, 60, + 40, 48, 117, 46, 45, 207, 229, 235, 55, 34, 85, 34, 245, 171, 72, 253, 31, 34, 82, 114, 40, + 7, 238, 49, 72, 57, 220, 91, 229, 229, 214, 216, 166, 75, 49, 204, 212, 137, 60, 116, 120, + 168, 224, 124, 29, 18, 247, 168, 208, 81, 149, 2, 189, 239, 207, 123, 253, 43, 34, 22, 207, + 139, 50, 46, 242, 122, 209, 198, 185, 243, 139, 14, 101, 18, 196, 83, 9, 52, 234, 254, 47, + 10, 127, 168, 136, 124, 158, 186, 205, 75, 3, 133, 77, 15, 71, 41, 241, 150, 199, 91, 248, + 83, 220, 173, 146, 158, 250, 252, 209, 127, 9, 244, 222, 199, 75, 146, 46, 210, 185, 148, + 94, 188, 235, 213, 171, 77, 255, 232, 138, 225, 221, 250, 167, 0, 3, 0, 162, 224, 242, 236, + 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 53, + 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 54, + 48, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, + 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, + 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 57, 32, 48, 32, 82, 47, 82, 101, + 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, + 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, + 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, + 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, + 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, + 116, 115, 32, 50, 54, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, + 100, 111, 98, 106, 13, 54, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 50, 50, 57, 52, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 109, + 111, 212, 56, 16, 254, 190, 191, 34, 31, 55, 39, 18, 98, 199, 78, 54, 18, 66, 42, 45, 72, + 220, 9, 9, 29, 251, 13, 157, 68, 233, 178, 109, 185, 238, 182, 90, 90, 122, 229, 215, 159, + 231, 213, 118, 54, 219, 34, 129, 80, 209, 198, 30, 143, 103, 198, 51, 207, 60, 243, 106, 57, + 123, 254, 254, 116, 119, 91, 188, 120, 241, 252, 221, 241, 219, 147, 162, 41, 94, 190, 124, + 117, 114, 92, 204, 154, 2, 254, 237, 206, 103, 207, 151, 203, 166, 48, 182, 88, 174, 103, + 77, 61, 12, 195, 2, 55, 76, 97, 7, 87, 15, 93, 209, 91, 91, 187, 98, 185, 153, 125, 156, + 219, 178, 155, 187, 242, 159, 229, 159, 112, 198, 20, 166, 173, 7, 60, 102, 108, 109, 157, + 13, 135, 150, 171, 217, 188, 40, 151, 95, 103, 149, 25, 108, 221, 180, 139, 162, 50, 93, + 221, 218, 184, 65, 7, 233, 212, 162, 11, 34, 125, 81, 117, 190, 169, 59, 55, 150, 17, 229, + 149, 202, 237, 171, 82, 187, 139, 206, 155, 186, 43, 150, 39, 193, 202, 191, 75, 59, 255, + 18, 254, 206, 202, 202, 206, 175, 74, 63, 63, 45, 171, 110, 126, 25, 126, 108, 202, 170, + 199, 31, 219, 178, 106, 231, 231, 176, 92, 132, 175, 107, 16, 92, 151, 149, 195, 175, 111, + 101, 101, 230, 23, 32, 128, 231, 118, 101, 229, 131, 186, 5, 173, 23, 162, 14, 53, 172, 224, + 63, 88, 194, 31, 160, 248, 187, 220, 128, 43, 96, 69, 20, 100, 5, 49, 124, 20, 133, 190, + 175, 219, 16, 230, 102, 210, 177, 138, 182, 125, 81, 217, 161, 246, 232, 252, 199, 185, 9, + 207, 208, 132, 191, 46, 252, 213, 162, 207, 242, 9, 107, 234, 54, 4, 179, 153, 14, 185, 11, + 129, 110, 105, 243, 227, 252, 13, 24, 116, 93, 130, 143, 139, 32, 90, 217, 222, 5, 219, 43, + 99, 130, 209, 14, 92, 89, 4, 15, 66, 104, 130, 225, 195, 252, 22, 226, 32, 194, 184, 194, + 39, 116, 131, 191, 97, 31, 143, 157, 149, 16, 254, 5, 196, 203, 4, 189, 11, 8, 191, 17, 169, + 187, 240, 219, 227, 61, 137, 152, 77, 228, 80, 197, 170, 116, 114, 0, 175, 188, 8, 223, 168, + 78, 47, 73, 45, 193, 29, 80, 185, 66, 229, 122, 147, 195, 197, 27, 57, 11, 87, 136, 226, + 193, 225, 79, 88, 66, 127, 201, 125, 88, 66, 237, 164, 204, 201, 45, 16, 234, 170, 13, 217, + 216, 64, 54, 246, 117, 223, 81, 32, 215, 37, 185, 13, 81, 16, 39, 77, 203, 161, 185, 96, + 101, 86, 86, 223, 194, 69, 79, 69, 152, 101, 95, 151, 61, 26, 112, 199, 129, 66, 7, 130, + 160, 245, 104, 51, 72, 111, 197, 89, 144, 79, 66, 224, 100, 237, 125, 16, 111, 213, 190, 91, + 202, 103, 126, 31, 252, 34, 77, 65, 22, 79, 242, 41, 76, 14, 138, 29, 232, 79, 244, 29, 201, + 142, 186, 71, 135, 225, 6, 80, 133, 203, 15, 80, 8, 124, 224, 94, 46, 209, 3, 188, 129, 102, + 160, 201, 24, 0, 252, 124, 86, 14, 137, 51, 214, 168, 127, 16, 252, 6, 195, 14, 117, 0, 133, + 14, 42, 183, 98, 7, 30, 62, 7, 53, 59, 201, 185, 184, 78, 214, 123, 10, 253, 178, 164, 178, + 191, 201, 44, 71, 97, 60, 118, 133, 225, 247, 98, 54, 36, 4, 44, 93, 225, 47, 216, 248, 44, + 233, 1, 31, 163, 247, 67, 13, 32, 112, 197, 209, 208, 188, 85, 67, 106, 86, 196, 133, 27, + 49, 76, 106, 28, 124, 59, 9, 66, 13, 34, 201, 185, 160, 215, 109, 176, 27, 177, 7, 48, 13, + 174, 126, 15, 222, 224, 202, 3, 252, 135, 232, 166, 144, 3, 210, 211, 136, 19, 224, 116, 49, + 244, 135, 0, 135, 119, 167, 240, 166, 255, 69, 188, 57, 145, 60, 192, 103, 186, 156, 8, 122, + 120, 221, 164, 80, 49, 135, 34, 24, 232, 83, 75, 205, 131, 48, 36, 49, 85, 129, 75, 234, 98, + 203, 37, 195, 175, 132, 146, 180, 203, 64, 5, 11, 107, 76, 44, 17, 87, 204, 128, 45, 205, + 216, 85, 86, 188, 130, 49, 103, 37, 85, 15, 170, 191, 41, 77, 124, 123, 107, 20, 211, 112, + 179, 134, 39, 226, 163, 90, 247, 252, 109, 49, 172, 144, 127, 240, 203, 226, 47, 201, 254, + 126, 4, 30, 82, 79, 135, 16, 72, 179, 12, 252, 67, 235, 65, 203, 162, 119, 234, 31, 152, + 164, 168, 57, 170, 57, 145, 133, 195, 107, 54, 112, 17, 160, 177, 231, 38, 35, 251, 55, 26, + 13, 129, 168, 69, 31, 157, 77, 94, 104, 124, 185, 124, 227, 166, 214, 231, 86, 144, 85, 131, + 122, 27, 75, 78, 30, 149, 31, 219, 76, 34, 192, 24, 238, 194, 21, 67, 56, 103, 200, 230, + 196, 98, 49, 56, 49, 55, 179, 54, 183, 181, 103, 108, 214, 204, 212, 92, 146, 247, 236, 25, + 32, 181, 194, 21, 156, 175, 244, 34, 92, 191, 227, 206, 115, 195, 111, 163, 80, 67, 50, 235, + 100, 153, 86, 244, 217, 85, 53, 173, 175, 52, 91, 15, 87, 15, 59, 12, 119, 18, 4, 65, 32, + 65, 18, 172, 75, 189, 4, 85, 210, 180, 98, 46, 232, 235, 72, 183, 193, 5, 234, 212, 154, 58, + 244, 12, 203, 63, 66, 244, 181, 74, 174, 248, 15, 158, 121, 175, 36, 125, 194, 41, 178, 154, + 204, 211, 67, 234, 65, 42, 161, 45, 77, 63, 175, 244, 211, 33, 246, 96, 240, 165, 14, 14, + 98, 231, 81, 192, 198, 31, 74, 224, 148, 155, 1, 100, 254, 37, 24, 10, 31, 71, 66, 9, 119, + 100, 37, 65, 44, 236, 188, 3, 17, 148, 67, 34, 136, 4, 81, 1, 21, 215, 191, 83, 61, 238, + 137, 130, 22, 229, 156, 176, 255, 1, 4, 79, 21, 159, 55, 165, 177, 9, 131, 4, 137, 87, 248, + 137, 108, 149, 105, 167, 105, 213, 146, 136, 241, 183, 37, 147, 209, 176, 223, 132, 189, 46, + 86, 68, 240, 189, 103, 242, 43, 88, 189, 248, 189, 220, 208, 131, 125, 225, 65, 148, 225, + 68, 88, 222, 164, 146, 177, 239, 198, 71, 63, 167, 36, 246, 68, 28, 126, 104, 210, 10, 241, + 194, 119, 33, 236, 84, 169, 13, 145, 188, 160, 254, 50, 22, 12, 6, 155, 15, 11, 214, 197, + 134, 128, 203, 88, 182, 4, 162, 44, 72, 185, 37, 249, 248, 37, 44, 87, 114, 44, 231, 154, + 36, 184, 149, 12, 189, 151, 59, 81, 249, 134, 31, 62, 167, 2, 17, 141, 23, 10, 75, 138, 198, + 209, 30, 73, 115, 12, 132, 148, 180, 119, 17, 56, 20, 229, 163, 53, 220, 8, 130, 84, 238, + 179, 148, 155, 248, 22, 4, 62, 168, 109, 241, 101, 20, 24, 199, 34, 143, 26, 116, 76, 12, + 130, 225, 82, 99, 180, 230, 123, 25, 227, 108, 202, 172, 162, 157, 35, 52, 160, 8, 193, 70, + 66, 151, 224, 51, 218, 183, 202, 55, 162, 125, 76, 211, 133, 121, 101, 156, 74, 186, 241, + 126, 51, 24, 97, 169, 104, 164, 159, 104, 241, 61, 49, 236, 1, 83, 224, 65, 157, 213, 137, + 130, 68, 179, 158, 17, 155, 209, 74, 163, 41, 152, 158, 104, 102, 90, 145, 61, 215, 142, 67, + 118, 161, 162, 121, 199, 247, 17, 210, 96, 19, 104, 233, 24, 247, 243, 176, 82, 60, 98, 96, + 165, 93, 175, 71, 77, 206, 187, 24, 90, 233, 59, 223, 178, 166, 65, 66, 235, 82, 249, 12, + 212, 118, 188, 100, 143, 197, 39, 78, 39, 238, 50, 186, 180, 133, 49, 117, 227, 0, 67, 66, + 91, 152, 127, 98, 92, 105, 25, 87, 246, 129, 198, 4, 180, 178, 2, 52, 150, 249, 197, 224, + 226, 91, 255, 155, 206, 9, 67, 58, 148, 242, 66, 206, 141, 120, 113, 43, 238, 228, 53, 61, + 8, 203, 95, 199, 243, 247, 226, 68, 206, 46, 51, 113, 161, 56, 131, 139, 29, 119, 167, 57, + 169, 28, 116, 144, 38, 62, 58, 35, 185, 103, 77, 58, 160, 108, 243, 28, 165, 219, 58, 166, + 162, 188, 144, 68, 100, 34, 71, 211, 139, 35, 218, 38, 150, 128, 157, 255, 233, 57, 161, + 181, 8, 85, 28, 249, 148, 56, 238, 207, 80, 218, 233, 35, 39, 0, 24, 156, 152, 170, 96, 57, + 165, 140, 142, 39, 132, 144, 210, 62, 153, 177, 82, 198, 232, 39, 233, 151, 223, 27, 17, + 201, 104, 31, 103, 1, 6, 36, 230, 247, 227, 57, 205, 142, 230, 203, 85, 202, 109, 104, 63, + 59, 2, 86, 223, 100, 19, 131, 52, 8, 46, 72, 147, 228, 247, 52, 201, 248, 144, 77, 91, 151, + 168, 20, 163, 199, 30, 29, 35, 120, 16, 165, 184, 20, 66, 162, 242, 223, 198, 67, 89, 111, + 235, 161, 247, 135, 134, 50, 222, 157, 26, 202, 134, 95, 108, 244, 2, 59, 73, 15, 140, 8, + 141, 121, 164, 109, 18, 32, 96, 19, 123, 106, 130, 49, 240, 92, 147, 40, 99, 82, 22, 186, + 17, 198, 156, 236, 174, 245, 172, 148, 4, 119, 43, 206, 17, 33, 189, 121, 125, 113, 171, 82, + 93, 240, 227, 71, 86, 100, 137, 166, 180, 239, 101, 156, 68, 75, 137, 5, 15, 180, 98, 146, + 56, 64, 118, 63, 151, 46, 107, 73, 233, 112, 38, 79, 165, 70, 93, 72, 54, 103, 51, 34, 53, + 22, 207, 161, 216, 113, 50, 114, 160, 247, 49, 182, 239, 234, 133, 145, 76, 249, 52, 122, + 91, 31, 10, 219, 200, 211, 22, 60, 10, 121, 140, 93, 129, 204, 116, 31, 97, 189, 64, 58, 9, + 237, 95, 232, 219, 218, 183, 230, 192, 133, 116, 75, 139, 135, 27, 46, 250, 253, 91, 106, + 172, 179, 189, 138, 10, 135, 186, 218, 64, 180, 152, 193, 74, 98, 75, 114, 255, 74, 98, 131, + 93, 203, 48, 44, 100, 201, 221, 255, 100, 118, 247, 63, 211, 66, 65, 234, 177, 236, 238, + 167, 90, 67, 207, 20, 33, 155, 144, 46, 152, 220, 72, 191, 5, 169, 183, 144, 177, 146, 40, + 156, 17, 214, 100, 174, 28, 73, 214, 138, 8, 248, 144, 142, 181, 32, 244, 120, 106, 31, 202, + 217, 169, 116, 111, 115, 46, 215, 186, 201, 204, 134, 36, 30, 229, 54, 136, 210, 184, 41, + 100, 234, 96, 118, 27, 211, 214, 77, 215, 62, 146, 109, 160, 204, 229, 125, 6, 150, 38, 201, + 67, 251, 4, 95, 233, 218, 186, 51, 227, 203, 14, 18, 151, 161, 238, 26, 229, 45, 195, 147, + 55, 239, 189, 125, 235, 36, 135, 50, 24, 18, 86, 203, 34, 167, 79, 61, 106, 155, 128, 72, + 26, 223, 28, 61, 140, 157, 142, 111, 111, 106, 227, 15, 193, 135, 196, 119, 208, 120, 85, + 173, 239, 107, 23, 202, 63, 77, 142, 71, 97, 100, 58, 210, 45, 32, 83, 255, 216, 181, 1, 76, + 13, 179, 98, 105, 28, 83, 183, 140, 27, 134, 159, 127, 197, 186, 184, 198, 62, 187, 200, + 105, 5, 77, 43, 121, 48, 225, 184, 10, 213, 229, 68, 163, 175, 216, 216, 180, 221, 190, 161, + 234, 198, 113, 16, 9, 51, 82, 178, 46, 24, 169, 147, 105, 71, 43, 216, 223, 241, 215, 57, + 252, 7, 45, 127, 147, 113, 133, 219, 178, 109, 226, 0, 195, 200, 119, 146, 222, 17, 124, + 116, 72, 28, 30, 224, 7, 15, 43, 164, 10, 21, 43, 201, 0, 97, 214, 73, 219, 59, 106, 130, + 150, 204, 188, 101, 64, 70, 125, 186, 5, 127, 18, 97, 102, 45, 209, 240, 130, 41, 203, 181, + 16, 60, 228, 57, 176, 130, 50, 114, 207, 55, 2, 170, 232, 131, 208, 34, 65, 111, 243, 155, + 105, 73, 107, 220, 136, 54, 82, 21, 237, 210, 226, 49, 194, 128, 97, 103, 45, 130, 15, 176, + 125, 120, 226, 107, 57, 213, 174, 201, 71, 129, 48, 222, 73, 167, 59, 248, 142, 164, 120, + 68, 134, 133, 76, 128, 144, 162, 97, 186, 56, 214, 244, 121, 228, 29, 202, 234, 236, 153, + 21, 188, 113, 218, 46, 248, 243, 172, 100, 39, 110, 148, 33, 69, 163, 100, 70, 124, 148, + 143, 96, 243, 203, 174, 91, 241, 240, 128, 138, 238, 152, 65, 139, 133, 233, 36, 154, 112, + 116, 169, 184, 169, 249, 182, 5, 22, 93, 97, 162, 193, 167, 98, 54, 201, 106, 19, 76, 199, + 140, 116, 170, 165, 47, 109, 143, 151, 201, 236, 227, 51, 58, 38, 35, 25, 109, 164, 97, 237, + 71, 35, 146, 159, 152, 28, 125, 116, 28, 213, 159, 149, 201, 8, 164, 228, 50, 9, 191, 31, + 205, 147, 254, 169, 164, 120, 86, 218, 33, 214, 10, 191, 3, 212, 10, 152, 122, 151, 188, + 179, 77, 199, 198, 240, 123, 60, 252, 168, 208, 125, 204, 255, 43, 13, 1, 239, 165, 254, + 195, 55, 1, 31, 216, 59, 122, 227, 209, 224, 67, 80, 201, 113, 180, 131, 75, 14, 241, 194, + 147, 169, 15, 66, 146, 16, 105, 24, 109, 82, 12, 178, 127, 158, 156, 201, 223, 4, 36, 118, + 209, 12, 109, 135, 154, 150, 89, 142, 171, 143, 92, 13, 46, 171, 5, 245, 8, 130, 255, 250, + 221, 113, 49, 123, 189, 156, 253, 47, 192, 0, 217, 157, 13, 162, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 54, 49, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 54, 50, 32, 48, 32, 82, 47, + 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 52, 48, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, 49, 57, 54, 32, 48, + 32, 82, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, + 48, 32, 82, 47, 84, 84, 50, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, + 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, + 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, + 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, + 50, 55, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 54, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, + 57, 50, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 180, 87, 89, 111, 28, 55, + 12, 126, 223, 95, 49, 143, 59, 69, 102, 60, 210, 72, 115, 20, 65, 30, 108, 167, 23, 16, 32, + 72, 182, 79, 105, 209, 58, 89, 95, 141, 157, 26, 187, 118, 147, 252, 251, 138, 20, 73, 73, + 115, 236, 174, 235, 6, 134, 129, 29, 137, 146, 120, 124, 36, 63, 30, 175, 22, 71, 175, 207, + 54, 247, 217, 243, 231, 71, 175, 78, 126, 62, 205, 170, 236, 197, 139, 227, 211, 147, 108, + 81, 101, 240, 183, 185, 92, 28, 173, 86, 85, 166, 116, 182, 186, 88, 84, 101, 223, 247, 29, + 110, 168, 76, 247, 166, 236, 155, 172, 213, 186, 52, 217, 234, 118, 241, 110, 169, 243, 102, + 105, 243, 223, 87, 191, 192, 25, 149, 169, 186, 236, 241, 152, 210, 165, 54, 218, 29, 90, + 173, 23, 203, 44, 95, 253, 181, 40, 84, 175, 203, 170, 238, 178, 66, 53, 101, 173, 195, 134, + 63, 232, 79, 117, 141, 19, 105, 179, 162, 177, 85, 217, 152, 161, 12, 95, 94, 136, 220, 252, + 85, 85, 214, 88, 85, 54, 217, 234, 212, 105, 121, 158, 23, 122, 249, 37, 47, 218, 229, 93, + 110, 252, 215, 39, 247, 99, 237, 254, 175, 243, 110, 121, 159, 23, 118, 249, 224, 62, 54, + 238, 3, 119, 203, 188, 232, 220, 149, 69, 107, 150, 175, 243, 162, 94, 158, 229, 133, 194, + 93, 20, 221, 230, 69, 79, 187, 127, 59, 251, 47, 220, 166, 165, 111, 220, 191, 226, 71, 88, + 166, 80, 53, 222, 143, 187, 55, 238, 26, 188, 239, 43, 40, 228, 69, 62, 195, 6, 168, 114, + 227, 54, 20, 138, 248, 13, 39, 168, 253, 247, 54, 215, 248, 154, 95, 127, 31, 61, 209, 27, + 20, 184, 198, 163, 96, 215, 71, 184, 13, 119, 193, 194, 72, 49, 56, 255, 204, 137, 85, 145, + 246, 27, 60, 38, 175, 169, 72, 5, 216, 254, 224, 158, 197, 229, 251, 137, 75, 189, 229, 225, + 150, 103, 121, 63, 229, 7, 208, 18, 32, 82, 185, 128, 181, 165, 213, 62, 40, 23, 185, 87, + 32, 125, 79, 60, 1, 134, 92, 146, 163, 149, 193, 192, 113, 136, 238, 228, 89, 140, 4, 42, + 133, 191, 190, 207, 85, 67, 111, 29, 157, 232, 63, 24, 195, 198, 193, 181, 115, 192, 171, + 43, 7, 74, 64, 203, 243, 170, 106, 187, 23, 30, 48, 154, 132, 198, 96, 52, 165, 106, 106, + 15, 225, 119, 203, 183, 224, 3, 112, 198, 134, 195, 7, 26, 221, 33, 130, 216, 239, 164, 174, + 141, 204, 242, 190, 178, 126, 11, 150, 255, 1, 100, 161, 198, 27, 50, 242, 22, 46, 19, 76, + 162, 227, 224, 68, 16, 188, 34, 152, 126, 112, 130, 45, 58, 42, 88, 252, 12, 239, 31, 26, + 92, 160, 238, 250, 105, 22, 255, 154, 123, 200, 3, 212, 208, 224, 79, 62, 238, 20, 12, 129, + 49, 44, 127, 194, 136, 12, 194, 102, 37, 159, 180, 4, 27, 86, 208, 224, 45, 203, 208, 29, + 112, 158, 157, 117, 198, 190, 190, 247, 96, 0, 71, 194, 97, 184, 155, 172, 110, 191, 149, + 213, 63, 192, 219, 108, 136, 216, 231, 93, 63, 132, 165, 181, 81, 201, 152, 179, 16, 165, + 248, 36, 124, 182, 1, 200, 67, 215, 194, 222, 32, 241, 180, 84, 3, 184, 231, 61, 61, 178, + 22, 127, 7, 40, 144, 136, 36, 58, 125, 163, 46, 248, 72, 40, 11, 177, 168, 20, 171, 219, 92, + 117, 228, 213, 213, 119, 206, 19, 12, 118, 201, 121, 41, 149, 159, 249, 9, 169, 136, 112, 9, + 151, 51, 101, 34, 95, 248, 218, 98, 189, 22, 15, 9, 82, 224, 126, 31, 219, 187, 92, 74, 79, + 71, 55, 176, 161, 92, 166, 41, 236, 83, 217, 93, 80, 0, 159, 20, 246, 159, 168, 186, 62, + 240, 91, 35, 44, 199, 181, 174, 139, 242, 32, 228, 58, 27, 69, 46, 182, 210, 108, 188, 31, + 183, 92, 2, 124, 194, 240, 150, 183, 153, 64, 207, 102, 135, 228, 247, 229, 4, 26, 200, 38, + 22, 220, 230, 110, 37, 115, 146, 228, 59, 29, 181, 39, 174, 64, 220, 151, 108, 84, 48, 125, + 163, 8, 122, 250, 7, 80, 53, 60, 27, 74, 253, 53, 225, 48, 74, 58, 196, 152, 254, 86, 153, + 119, 2, 248, 73, 94, 68, 61, 192, 172, 7, 76, 65, 29, 20, 75, 34, 3, 133, 42, 192, 10, 101, + 8, 139, 118, 249, 74, 140, 186, 193, 238, 218, 177, 45, 106, 183, 25, 79, 177, 129, 235, 53, + 188, 230, 19, 85, 210, 136, 242, 220, 241, 168, 144, 247, 235, 193, 218, 58, 103, 202, 144, + 150, 122, 129, 150, 180, 9, 92, 254, 77, 107, 77, 145, 17, 34, 0, 149, 133, 223, 37, 234, + 194, 0, 77, 234, 197, 156, 30, 156, 237, 151, 156, 9, 247, 137, 27, 157, 84, 173, 66, 81, + 187, 160, 106, 118, 38, 85, 47, 10, 28, 168, 33, 161, 75, 56, 22, 19, 145, 192, 12, 90, 162, + 107, 145, 74, 243, 9, 255, 68, 180, 189, 21, 160, 15, 216, 141, 228, 195, 21, 87, 37, 209, + 56, 36, 150, 239, 83, 194, 141, 238, 82, 244, 69, 142, 178, 243, 220, 51, 57, 146, 120, 198, + 23, 151, 240, 18, 124, 141, 163, 47, 46, 191, 145, 42, 43, 56, 137, 138, 58, 147, 11, 220, + 43, 243, 90, 242, 55, 112, 252, 194, 54, 101, 227, 104, 153, 139, 61, 198, 32, 234, 131, + 120, 39, 52, 227, 2, 77, 133, 2, 226, 75, 202, 41, 70, 239, 60, 135, 198, 87, 24, 148, 68, + 33, 248, 113, 143, 97, 195, 186, 69, 219, 240, 245, 22, 124, 0, 91, 120, 15, 252, 128, 211, + 91, 82, 158, 80, 224, 52, 96, 126, 168, 156, 4, 252, 195, 136, 81, 178, 202, 53, 169, 172, + 85, 89, 187, 1, 161, 154, 30, 35, 140, 27, 30, 246, 71, 218, 213, 208, 138, 188, 27, 241, + 239, 110, 208, 133, 162, 136, 36, 117, 68, 200, 106, 204, 137, 89, 40, 180, 193, 107, 46, + 57, 2, 150, 112, 253, 154, 175, 191, 16, 26, 233, 155, 162, 20, 242, 49, 14, 106, 244, 134, + 235, 14, 214, 183, 120, 234, 66, 194, 40, 71, 104, 1, 152, 221, 231, 106, 250, 182, 31, 65, + 51, 116, 208, 41, 60, 248, 218, 243, 231, 177, 220, 103, 110, 242, 220, 59, 174, 132, 119, + 22, 181, 155, 197, 170, 86, 168, 61, 184, 188, 74, 149, 180, 123, 84, 140, 88, 239, 244, 32, + 148, 134, 194, 134, 62, 16, 249, 222, 50, 243, 41, 176, 51, 90, 105, 206, 33, 72, 155, 52, + 81, 112, 77, 106, 83, 218, 217, 247, 208, 58, 154, 15, 187, 113, 46, 33, 117, 122, 131, 182, + 105, 104, 227, 109, 72, 34, 88, 89, 195, 52, 9, 26, 188, 116, 20, 118, 235, 241, 216, 160, + 200, 45, 200, 14, 83, 67, 123, 117, 33, 5, 42, 52, 76, 99, 66, 56, 162, 86, 160, 154, 240, + 89, 187, 95, 156, 212, 69, 229, 98, 161, 146, 68, 230, 52, 170, 159, 152, 70, 43, 119, 62, + 30, 108, 93, 155, 120, 195, 33, 68, 186, 34, 72, 143, 19, 194, 73, 145, 165, 125, 136, 90, + 160, 164, 113, 217, 5, 217, 8, 117, 253, 144, 159, 70, 107, 32, 54, 106, 73, 125, 20, 53, 1, + 215, 53, 142, 139, 113, 191, 12, 15, 165, 215, 83, 236, 227, 217, 53, 166, 230, 125, 224, + 164, 32, 185, 145, 161, 100, 60, 176, 70, 207, 136, 79, 178, 92, 71, 96, 49, 153, 82, 101, + 101, 176, 246, 142, 210, 103, 249, 39, 197, 193, 204, 117, 50, 109, 75, 99, 44, 7, 6, 48, + 96, 56, 225, 106, 170, 10, 181, 141, 38, 180, 143, 108, 16, 239, 48, 181, 15, 196, 146, 58, + 114, 47, 34, 113, 254, 195, 247, 160, 2, 192, 56, 20, 223, 56, 10, 149, 170, 77, 45, 44, 55, + 148, 51, 145, 61, 3, 16, 127, 225, 145, 161, 182, 7, 4, 15, 171, 181, 52, 139, 130, 188, 16, + 215, 157, 184, 93, 171, 73, 119, 39, 128, 223, 235, 104, 165, 93, 108, 116, 236, 104, 169, + 108, 189, 119, 180, 174, 103, 252, 12, 27, 193, 205, 13, 105, 213, 112, 229, 192, 253, 97, + 74, 193, 218, 1, 57, 5, 98, 7, 39, 21, 8, 71, 177, 132, 207, 81, 172, 100, 113, 50, 175, 96, + 247, 60, 119, 241, 158, 34, 49, 102, 158, 194, 192, 185, 24, 255, 51, 240, 175, 93, 64, 154, + 71, 193, 191, 119, 39, 36, 40, 134, 202, 91, 20, 20, 59, 131, 252, 189, 184, 55, 9, 187, 35, + 196, 199, 227, 234, 149, 76, 84, 67, 31, 126, 51, 50, 232, 47, 143, 252, 56, 152, 20, 31, + 48, 63, 234, 105, 176, 119, 85, 89, 183, 237, 161, 104, 79, 252, 218, 166, 21, 101, 236, 83, + 246, 132, 247, 41, 87, 67, 241, 41, 225, 220, 210, 63, 56, 151, 126, 153, 229, 152, 128, + 234, 190, 47, 171, 190, 23, 254, 23, 55, 46, 243, 63, 55, 46, 117, 88, 231, 82, 143, 105, + 93, 170, 231, 153, 237, 34, 156, 30, 231, 217, 14, 78, 232, 153, 9, 158, 59, 128, 22, 106, + 149, 228, 22, 30, 107, 56, 98, 134, 40, 16, 174, 142, 152, 87, 31, 168, 87, 194, 189, 200, + 6, 192, 127, 161, 100, 1, 9, 34, 113, 67, 199, 92, 124, 166, 12, 105, 31, 83, 13, 25, 95, + 147, 166, 234, 45, 144, 238, 24, 49, 181, 102, 38, 149, 142, 29, 158, 253, 228, 184, 230, + 83, 113, 23, 177, 7, 198, 101, 0, 65, 59, 130, 227, 196, 40, 132, 244, 237, 248, 1, 108, 69, + 170, 118, 9, 132, 236, 28, 57, 98, 179, 139, 183, 197, 227, 12, 221, 207, 237, 66, 99, 56, + 106, 104, 95, 133, 124, 114, 140, 112, 236, 17, 206, 54, 132, 190, 125, 34, 244, 79, 64, 55, + 240, 243, 173, 159, 230, 186, 56, 12, 160, 99, 20, 136, 84, 101, 164, 149, 45, 41, 220, 144, + 186, 161, 78, 142, 219, 253, 174, 14, 162, 14, 102, 102, 106, 7, 51, 83, 51, 204, 172, 126, + 60, 51, 83, 209, 13, 97, 114, 27, 26, 53, 55, 221, 236, 48, 212, 154, 249, 18, 191, 163, 85, + 194, 185, 152, 187, 232, 228, 178, 253, 72, 103, 27, 248, 26, 74, 148, 113, 71, 80, 173, 3, + 153, 109, 14, 230, 63, 112, 46, 225, 63, 210, 22, 52, 129, 102, 158, 103, 78, 241, 159, 129, + 185, 193, 255, 19, 170, 86, 186, 236, 59, 245, 8, 85, 117, 151, 176, 2, 187, 79, 195, 89, + 34, 28, 130, 95, 153, 178, 107, 84, 82, 228, 196, 16, 12, 139, 196, 88, 230, 72, 136, 17, + 118, 21, 92, 134, 151, 191, 2, 24, 164, 24, 13, 218, 145, 26, 179, 228, 54, 2, 22, 49, 100, + 59, 153, 64, 0, 244, 97, 10, 217, 17, 144, 236, 227, 80, 100, 247, 64, 72, 155, 198, 121, + 186, 255, 79, 164, 66, 203, 28, 26, 141, 42, 211, 225, 57, 132, 88, 4, 82, 129, 95, 92, 79, + 95, 190, 58, 201, 22, 47, 87, 139, 127, 5, 24, 0, 95, 106, 149, 233, 13, 10, 101, 110, 100, + 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 54, 51, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 54, 52, 32, 48, 32, 82, + 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 80, 97, 114, 101, 110, 116, 32, 51, 52, 48, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, + 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, + 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, + 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, + 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, + 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 50, + 56, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, + 13, 54, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, + 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, 50, + 52, 51, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 219, 110, 220, 54, + 16, 125, 223, 175, 224, 163, 24, 84, 178, 72, 145, 146, 8, 4, 121, 176, 55, 8, 92, 32, 64, + 128, 10, 232, 67, 80, 160, 73, 183, 118, 46, 246, 198, 80, 178, 117, 243, 247, 229, 12, 135, + 67, 82, 146, 227, 24, 133, 225, 197, 146, 156, 203, 225, 204, 153, 225, 236, 249, 180, 59, + 123, 243, 110, 254, 38, 158, 63, 63, 123, 125, 113, 185, 23, 173, 120, 241, 226, 124, 127, + 33, 118, 173, 128, 191, 249, 122, 119, 54, 77, 173, 80, 90, 76, 87, 187, 182, 113, 206, 141, + 120, 160, 132, 118, 166, 113, 189, 24, 180, 110, 140, 152, 110, 119, 111, 43, 45, 251, 170, + 151, 127, 76, 191, 130, 142, 18, 170, 107, 28, 170, 41, 221, 104, 163, 189, 210, 116, 216, + 85, 66, 78, 159, 118, 181, 114, 186, 105, 187, 81, 212, 170, 111, 58, 157, 14, 130, 98, 208, + 26, 123, 47, 50, 136, 186, 183, 109, 211, 155, 165, 76, 52, 94, 179, 220, 218, 20, 227, 22, + 189, 85, 77, 47, 166, 189, 71, 169, 60, 74, 133, 72, 251, 170, 137, 104, 53, 73, 106, 213, + 116, 222, 87, 187, 141, 200, 120, 28, 93, 56, 124, 91, 77, 94, 255, 131, 52, 213, 223, 178, + 214, 94, 180, 214, 157, 169, 174, 252, 250, 163, 28, 171, 175, 178, 118, 213, 95, 82, 87, + 239, 100, 173, 170, 27, 255, 161, 162, 200, 33, 170, 4, 89, 56, 1, 65, 208, 250, 38, 107, + 27, 197, 216, 10, 173, 81, 5, 55, 80, 10, 142, 111, 253, 63, 218, 199, 29, 20, 0, 227, 164, + 128, 155, 95, 60, 70, 90, 191, 95, 64, 181, 120, 253, 122, 172, 28, 201, 88, 83, 221, 69, + 153, 217, 155, 38, 57, 0, 7, 123, 186, 58, 74, 83, 64, 4, 227, 87, 201, 225, 43, 0, 183, + 135, 243, 55, 178, 238, 130, 109, 58, 186, 132, 239, 199, 36, 122, 11, 168, 191, 75, 5, 96, + 32, 1, 117, 231, 83, 216, 66, 10, 135, 198, 234, 16, 222, 115, 217, 85, 39, 25, 226, 117, + 13, 166, 17, 88, 244, 63, 152, 234, 55, 48, 194, 136, 241, 3, 176, 126, 8, 110, 134, 144, + 12, 192, 72, 151, 113, 6, 9, 218, 250, 127, 237, 85, 59, 79, 2, 213, 87, 53, 47, 225, 240, + 23, 233, 72, 249, 146, 224, 251, 175, 96, 17, 227, 124, 240, 31, 209, 59, 110, 192, 149, + 142, 232, 5, 12, 156, 104, 21, 35, 22, 179, 49, 80, 216, 200, 142, 86, 249, 45, 238, 57, + 119, 97, 13, 23, 186, 137, 137, 61, 150, 6, 40, 155, 67, 112, 1, 43, 74, 137, 14, 132, 128, + 213, 41, 75, 115, 238, 56, 164, 48, 132, 187, 197, 64, 15, 84, 15, 119, 241, 122, 44, 43, + 128, 149, 69, 126, 97, 185, 197, 109, 173, 16, 44, 73, 228, 168, 80, 42, 196, 5, 36, 64, + 241, 80, 56, 10, 212, 15, 226, 16, 86, 10, 61, 216, 129, 132, 225, 29, 80, 58, 36, 21, 68, + 226, 29, 175, 169, 46, 64, 22, 69, 126, 128, 176, 0, 152, 213, 94, 176, 183, 85, 125, 32, + 200, 197, 2, 202, 128, 241, 62, 59, 52, 177, 114, 108, 200, 7, 236, 221, 113, 136, 231, 50, + 30, 104, 37, 175, 156, 104, 254, 187, 207, 79, 145, 15, 32, 254, 158, 186, 104, 32, 105, + 239, 61, 212, 170, 37, 142, 134, 142, 69, 22, 238, 99, 19, 88, 38, 109, 25, 143, 144, 36, + 144, 4, 96, 112, 29, 114, 140, 18, 169, 161, 164, 120, 31, 18, 184, 50, 104, 112, 157, 152, + 203, 99, 70, 179, 200, 149, 127, 32, 38, 121, 251, 128, 131, 130, 128, 219, 209, 250, 136, + 49, 6, 166, 128, 171, 216, 55, 64, 238, 119, 233, 10, 61, 174, 196, 228, 42, 191, 54, 168, + 179, 171, 64, 34, 229, 98, 21, 50, 152, 80, 69, 24, 119, 223, 116, 84, 209, 116, 24, 109, + 222, 126, 35, 226, 178, 72, 50, 190, 114, 173, 102, 174, 46, 179, 107, 48, 159, 57, 97, 140, + 112, 209, 191, 73, 129, 250, 99, 202, 65, 12, 121, 146, 228, 85, 138, 222, 113, 243, 162, + 76, 184, 25, 217, 190, 85, 67, 155, 57, 122, 122, 49, 141, 63, 44, 165, 71, 107, 9, 174, 16, + 242, 50, 61, 163, 182, 148, 145, 201, 62, 80, 77, 121, 155, 178, 203, 55, 8, 182, 178, 90, + 179, 84, 91, 177, 219, 91, 169, 70, 95, 92, 96, 36, 150, 23, 179, 47, 246, 202, 98, 250, 65, + 186, 104, 135, 173, 243, 144, 141, 18, 195, 255, 28, 37, 132, 215, 135, 113, 130, 50, 230, + 76, 22, 211, 163, 100, 130, 193, 22, 71, 33, 200, 173, 82, 231, 30, 29, 66, 220, 79, 205, + 32, 46, 30, 16, 171, 240, 245, 132, 192, 197, 214, 212, 197, 174, 100, 112, 155, 202, 225, + 1, 72, 220, 46, 114, 102, 32, 203, 17, 27, 164, 248, 51, 83, 59, 131, 240, 62, 123, 194, + 103, 126, 48, 184, 249, 49, 145, 169, 84, 31, 154, 37, 174, 100, 40, 66, 80, 190, 165, 6, + 169, 7, 179, 120, 145, 138, 9, 106, 160, 230, 200, 157, 239, 84, 148, 16, 151, 94, 154, 203, + 64, 171, 31, 210, 133, 120, 216, 26, 30, 152, 222, 226, 237, 55, 157, 167, 19, 230, 97, 39, + 148, 106, 90, 131, 220, 106, 157, 159, 117, 227, 72, 253, 39, 145, 171, 35, 114, 173, 217, + 166, 155, 65, 51, 219, 148, 28, 144, 181, 200, 245, 145, 166, 191, 65, 167, 177, 227, 115, + 246, 166, 104, 154, 54, 102, 110, 51, 225, 110, 58, 13, 120, 94, 98, 53, 11, 15, 33, 119, + 220, 51, 182, 25, 140, 249, 210, 254, 7, 68, 107, 236, 42, 97, 11, 242, 3, 12, 47, 178, 110, + 96, 118, 209, 173, 45, 193, 248, 23, 138, 158, 187, 8, 120, 93, 5, 26, 100, 139, 86, 105, + 211, 16, 131, 249, 225, 134, 104, 205, 38, 137, 96, 31, 29, 167, 108, 222, 208, 51, 155, + 159, 166, 55, 43, 160, 135, 48, 228, 188, 69, 201, 213, 43, 98, 3, 247, 203, 122, 154, 23, + 166, 65, 226, 68, 200, 56, 178, 120, 194, 173, 204, 174, 242, 195, 77, 22, 65, 196, 75, 125, + 205, 16, 217, 199, 170, 211, 62, 181, 54, 237, 170, 50, 236, 211, 202, 194, 62, 90, 19, 125, + 211, 143, 234, 103, 107, 194, 23, 80, 175, 83, 73, 244, 233, 7, 145, 161, 151, 221, 80, 207, + 92, 214, 132, 221, 44, 136, 26, 43, 194, 68, 86, 171, 209, 63, 23, 93, 95, 60, 23, 52, 19, + 216, 20, 164, 64, 22, 112, 18, 250, 167, 165, 159, 19, 24, 71, 109, 121, 23, 163, 82, 206, + 88, 176, 157, 113, 151, 94, 188, 48, 238, 205, 169, 145, 91, 252, 33, 213, 240, 204, 147, + 189, 103, 202, 2, 68, 68, 24, 234, 46, 196, 200, 79, 163, 157, 246, 175, 19, 76, 163, 28, + 53, 175, 211, 53, 14, 213, 252, 213, 124, 135, 237, 6, 20, 51, 197, 235, 198, 150, 141, 105, + 90, 237, 242, 183, 239, 229, 235, 11, 177, 123, 57, 237, 254, 19, 96, 0, 54, 6, 118, 57, 13, + 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 54, 53, + 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 54, 54, + 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 48, 32, 48, 32, 82, 47, 82, 101, + 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, + 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, + 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, + 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, + 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, + 116, 115, 32, 50, 57, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, + 100, 111, 98, 106, 13, 54, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 50, 50, 49, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 219, + 110, 219, 70, 16, 125, 215, 87, 240, 81, 44, 74, 134, 187, 188, 3, 65, 128, 36, 14, 2, 23, + 48, 16, 180, 122, 51, 10, 52, 138, 170, 216, 173, 111, 149, 237, 166, 254, 251, 238, 92, + 119, 150, 164, 28, 3, 129, 33, 89, 228, 238, 206, 206, 245, 204, 153, 119, 155, 213, 171, + 79, 159, 15, 15, 217, 235, 215, 175, 206, 222, 159, 158, 100, 85, 246, 230, 205, 187, 147, + 247, 217, 170, 202, 224, 239, 240, 117, 245, 106, 179, 169, 50, 231, 179, 205, 126, 85, 149, + 227, 56, 14, 184, 224, 50, 63, 54, 229, 216, 101, 189, 247, 101, 147, 109, 174, 87, 231, + 107, 159, 119, 235, 62, 255, 125, 243, 11, 156, 113, 153, 171, 203, 17, 143, 57, 95, 250, + 198, 135, 67, 155, 221, 106, 157, 229, 155, 191, 86, 133, 27, 125, 89, 213, 67, 86, 184, + 174, 172, 125, 92, 160, 131, 116, 106, 232, 194, 150, 62, 43, 186, 182, 42, 187, 102, 186, + 71, 132, 23, 186, 111, 46, 74, 244, 118, 221, 16, 182, 52, 89, 215, 186, 178, 131, 29, 231, + 235, 79, 121, 49, 172, 223, 230, 237, 250, 215, 220, 175, 55, 121, 209, 134, 67, 237, 250, + 93, 94, 135, 255, 96, 1, 72, 27, 170, 38, 43, 106, 207, 151, 159, 175, 79, 131, 125, 55, + 121, 81, 175, 119, 240, 117, 25, 246, 31, 224, 224, 159, 65, 194, 151, 188, 240, 235, 135, + 176, 14, 82, 80, 220, 231, 188, 232, 214, 255, 229, 133, 195, 245, 251, 188, 81, 193, 65, 9, + 95, 103, 133, 239, 84, 176, 11, 7, 225, 51, 132, 79, 41, 14, 244, 172, 188, 119, 101, 29, + 54, 86, 203, 78, 106, 130, 144, 154, 22, 207, 215, 103, 112, 241, 83, 94, 244, 97, 95, 225, + 92, 19, 116, 28, 130, 198, 77, 80, 24, 126, 135, 87, 65, 227, 33, 40, 84, 128, 198, 160, 48, + 218, 141, 91, 31, 88, 105, 7, 74, 171, 128, 187, 112, 16, 142, 220, 134, 199, 26, 159, 110, + 131, 142, 247, 121, 49, 210, 222, 171, 176, 134, 79, 188, 31, 95, 194, 173, 215, 225, 14, + 151, 200, 190, 69, 239, 176, 212, 224, 5, 150, 219, 241, 86, 248, 245, 64, 238, 12, 218, + 241, 70, 252, 141, 250, 200, 213, 7, 180, 2, 55, 226, 189, 63, 231, 122, 247, 150, 183, 168, + 134, 214, 188, 29, 47, 94, 83, 68, 10, 111, 182, 128, 190, 33, 128, 174, 151, 16, 213, 33, + 163, 42, 200, 168, 190, 236, 57, 95, 240, 28, 90, 7, 254, 124, 12, 159, 125, 206, 230, 170, + 39, 31, 209, 89, 160, 159, 248, 253, 235, 68, 69, 188, 24, 22, 46, 228, 48, 60, 128, 0, 107, + 245, 14, 221, 243, 188, 182, 186, 249, 95, 72, 100, 141, 5, 168, 96, 69, 225, 194, 78, 51, + 96, 16, 17, 160, 228, 45, 165, 115, 184, 106, 73, 67, 184, 2, 118, 60, 106, 172, 80, 22, 90, + 100, 111, 192, 23, 154, 85, 122, 124, 42, 14, 127, 192, 54, 220, 255, 148, 59, 207, 206, + 174, 208, 205, 109, 200, 230, 147, 224, 102, 245, 201, 14, 101, 180, 228, 1, 208, 99, 139, + 122, 128, 9, 87, 234, 226, 7, 205, 247, 18, 42, 50, 195, 12, 227, 242, 137, 152, 85, 85, 46, + 84, 219, 136, 119, 216, 106, 27, 127, 176, 218, 222, 130, 106, 193, 78, 95, 55, 20, 30, 206, + 123, 135, 201, 10, 209, 128, 23, 123, 213, 27, 93, 64, 118, 225, 153, 121, 197, 169, 36, 92, + 58, 112, 60, 39, 249, 53, 168, 251, 97, 251, 55, 73, 9, 220, 113, 17, 165, 239, 197, 233, + 223, 180, 168, 224, 236, 179, 119, 107, 148, 185, 16, 67, 69, 220, 231, 174, 146, 229, 11, + 17, 9, 182, 129, 141, 82, 249, 176, 40, 41, 111, 68, 169, 193, 100, 5, 20, 152, 41, 12, 63, + 46, 148, 155, 196, 72, 178, 207, 184, 83, 130, 126, 180, 108, 182, 120, 147, 100, 235, 46, + 111, 102, 217, 56, 201, 174, 0, 105, 77, 26, 180, 131, 22, 6, 150, 85, 82, 198, 199, 113, + 178, 170, 98, 157, 93, 11, 0, 222, 112, 193, 217, 120, 130, 240, 232, 223, 75, 198, 63, 216, + 89, 194, 117, 124, 195, 169, 249, 29, 241, 183, 75, 209, 215, 26, 62, 133, 215, 137, 239, + 193, 35, 198, 87, 177, 232, 0, 219, 160, 232, 52, 117, 68, 232, 216, 40, 202, 161, 61, 219, + 88, 192, 96, 2, 237, 128, 11, 41, 185, 233, 121, 43, 144, 166, 181, 32, 152, 10, 171, 160, + 192, 99, 110, 211, 91, 195, 43, 89, 52, 54, 154, 44, 15, 182, 145, 141, 243, 196, 20, 64, + 20, 77, 160, 57, 113, 156, 71, 14, 23, 117, 2, 88, 216, 201, 181, 12, 115, 172, 123, 106, + 181, 181, 76, 87, 56, 95, 162, 141, 241, 122, 12, 190, 134, 241, 74, 60, 110, 180, 50, 201, + 70, 2, 142, 160, 157, 2, 168, 0, 251, 35, 163, 7, 215, 188, 36, 52, 202, 103, 19, 90, 170, + 239, 152, 174, 215, 140, 69, 33, 161, 61, 26, 237, 40, 29, 106, 205, 14, 120, 73, 47, 96, + 169, 70, 236, 163, 60, 11, 175, 222, 218, 56, 212, 168, 187, 23, 121, 135, 196, 54, 163, + 156, 215, 198, 81, 55, 51, 111, 210, 25, 31, 229, 185, 4, 186, 218, 73, 165, 196, 214, 78, + 7, 192, 15, 28, 1, 239, 98, 13, 38, 62, 78, 65, 103, 166, 3, 221, 114, 60, 43, 33, 28, 155, + 159, 24, 107, 142, 164, 38, 200, 157, 166, 229, 101, 226, 15, 241, 192, 104, 240, 8, 23, + 238, 231, 250, 142, 115, 4, 130, 119, 234, 215, 3, 39, 128, 166, 158, 246, 203, 153, 28, + 193, 13, 43, 34, 37, 12, 188, 162, 173, 1, 95, 38, 245, 38, 203, 130, 165, 194, 31, 118, + 218, 177, 44, 246, 213, 163, 1, 26, 44, 77, 99, 191, 250, 114, 139, 168, 23, 90, 6, 8, 196, + 93, 34, 121, 234, 178, 150, 99, 171, 126, 85, 245, 167, 221, 62, 45, 173, 118, 94, 88, 45, + 62, 125, 22, 16, 191, 200, 167, 37, 28, 50, 221, 9, 255, 126, 134, 26, 80, 191, 175, 240, + 141, 96, 227, 71, 32, 22, 74, 243, 225, 115, 67, 84, 163, 5, 182, 141, 16, 227, 65, 91, 154, + 7, 174, 242, 22, 255, 195, 36, 240, 164, 21, 207, 23, 156, 48, 247, 128, 49, 169, 250, 65, + 238, 177, 97, 158, 11, 136, 223, 178, 149, 216, 178, 224, 229, 37, 183, 63, 94, 132, 8, 196, + 18, 208, 167, 229, 48, 195, 1, 66, 118, 61, 63, 233, 120, 73, 46, 202, 246, 155, 184, 125, + 203, 8, 193, 205, 23, 46, 209, 94, 60, 209, 42, 178, 127, 233, 115, 4, 26, 147, 2, 50, 167, + 52, 208, 9, 33, 82, 250, 203, 187, 190, 234, 124, 146, 204, 8, 45, 244, 86, 132, 152, 99, + 180, 35, 109, 183, 194, 194, 147, 134, 219, 167, 253, 182, 183, 67, 74, 172, 177, 59, 201, + 193, 233, 22, 48, 91, 105, 129, 145, 73, 209, 152, 245, 190, 62, 113, 111, 120, 250, 8, 231, + 126, 131, 43, 112, 202, 44, 152, 23, 240, 220, 5, 0, 186, 211, 189, 132, 116, 9, 141, 74, + 193, 124, 230, 226, 190, 225, 10, 30, 98, 199, 232, 103, 254, 20, 233, 94, 117, 139, 41, 66, + 58, 220, 196, 128, 155, 222, 71, 229, 102, 220, 157, 194, 183, 66, 149, 146, 161, 134, 243, + 156, 53, 113, 212, 245, 98, 75, 60, 210, 194, 149, 55, 205, 200, 156, 38, 98, 188, 81, 93, + 131, 239, 53, 173, 52, 193, 39, 244, 234, 200, 192, 195, 20, 193, 53, 2, 97, 160, 178, 184, + 114, 105, 96, 145, 156, 124, 17, 51, 114, 71, 243, 195, 29, 75, 63, 95, 79, 73, 230, 148, + 132, 8, 194, 105, 54, 154, 250, 69, 73, 75, 208, 48, 225, 62, 74, 176, 151, 42, 60, 241, 91, + 171, 222, 230, 106, 167, 142, 63, 104, 149, 184, 126, 6, 60, 10, 85, 119, 10, 85, 49, 209, + 166, 229, 190, 192, 247, 44, 56, 70, 32, 226, 183, 232, 39, 92, 146, 150, 43, 246, 18, 6, + 129, 110, 234, 229, 214, 84, 206, 63, 154, 130, 112, 192, 112, 109, 201, 1, 38, 103, 164, + 12, 205, 92, 115, 234, 23, 175, 23, 166, 189, 151, 50, 62, 58, 239, 185, 212, 67, 113, 198, + 228, 58, 16, 157, 136, 183, 143, 1, 28, 96, 211, 52, 3, 204, 48, 64, 137, 121, 21, 19, 160, + 101, 205, 35, 25, 107, 35, 131, 194, 91, 98, 216, 133, 178, 166, 205, 89, 51, 57, 113, 74, + 107, 74, 189, 101, 7, 107, 143, 80, 123, 35, 9, 38, 134, 214, 82, 225, 226, 38, 9, 16, 173, + 165, 164, 160, 204, 95, 210, 221, 207, 215, 31, 242, 30, 59, 52, 116, 241, 47, 84, 237, 29, + 245, 246, 91, 174, 98, 234, 226, 95, 72, 178, 96, 78, 130, 94, 70, 156, 244, 114, 247, 131, + 189, 60, 33, 223, 154, 176, 211, 180, 155, 178, 239, 99, 69, 131, 46, 99, 246, 40, 176, 3, + 91, 18, 80, 235, 37, 219, 147, 186, 186, 76, 166, 44, 120, 138, 254, 159, 54, 252, 189, 77, + 247, 25, 241, 134, 151, 31, 165, 42, 163, 144, 131, 222, 25, 121, 170, 182, 15, 211, 165, + 99, 19, 137, 188, 84, 202, 119, 9, 149, 146, 251, 101, 198, 181, 253, 29, 176, 14, 92, 253, + 9, 66, 172, 180, 112, 206, 48, 66, 79, 56, 83, 132, 249, 94, 97, 138, 119, 19, 109, 234, + 180, 247, 4, 165, 181, 95, 160, 140, 107, 253, 178, 243, 28, 28, 35, 104, 36, 242, 43, 46, + 184, 178, 213, 143, 162, 193, 13, 23, 121, 99, 42, 58, 93, 23, 254, 34, 64, 248, 200, 78, + 228, 144, 74, 71, 52, 124, 205, 52, 97, 16, 113, 10, 209, 138, 236, 90, 115, 130, 151, 173, + 243, 124, 66, 253, 237, 40, 161, 89, 187, 236, 231, 186, 225, 252, 17, 174, 37, 195, 86, 80, + 167, 149, 201, 116, 208, 9, 150, 36, 138, 234, 22, 17, 107, 129, 226, 155, 220, 240, 7, 51, + 32, 198, 106, 144, 233, 102, 162, 71, 204, 119, 243, 188, 85, 234, 71, 13, 55, 204, 51, 10, + 47, 117, 230, 92, 89, 53, 88, 227, 181, 43, 135, 161, 231, 34, 255, 99, 82, 228, 231, 108, + 16, 192, 3, 216, 2, 161, 30, 49, 46, 21, 15, 0, 98, 29, 32, 90, 140, 218, 196, 190, 88, 167, + 244, 76, 211, 3, 108, 4, 193, 13, 100, 24, 225, 60, 60, 182, 42, 149, 155, 47, 49, 39, 44, + 7, 210, 182, 75, 8, 88, 205, 240, 101, 249, 226, 178, 38, 61, 165, 210, 4, 49, 12, 29, 60, + 234, 105, 86, 189, 159, 248, 154, 145, 203, 130, 131, 235, 22, 221, 236, 154, 161, 116, 238, + 136, 151, 219, 80, 219, 78, 144, 148, 196, 122, 84, 30, 220, 221, 163, 75, 228, 169, 82, + 207, 85, 47, 53, 89, 128, 40, 218, 48, 131, 186, 158, 16, 57, 38, 186, 49, 112, 175, 222, + 210, 185, 133, 42, 4, 46, 213, 202, 186, 226, 86, 11, 39, 158, 148, 199, 49, 132, 15, 202, + 134, 251, 148, 13, 99, 76, 93, 91, 151, 67, 58, 194, 236, 185, 232, 151, 248, 241, 192, 41, + 169, 108, 13, 191, 148, 252, 70, 42, 190, 211, 2, 136, 80, 21, 141, 163, 62, 236, 159, 47, + 49, 83, 78, 187, 4, 77, 12, 45, 5, 75, 44, 255, 23, 212, 167, 231, 37, 138, 4, 66, 158, 39, + 73, 245, 148, 36, 125, 15, 87, 25, 54, 47, 212, 100, 29, 94, 236, 240, 72, 200, 232, 83, 50, + 39, 20, 250, 5, 99, 227, 18, 33, 182, 199, 22, 71, 20, 75, 0, 188, 178, 61, 92, 53, 29, 63, + 241, 155, 240, 230, 239, 77, 20, 156, 5, 243, 129, 162, 109, 150, 26, 132, 78, 73, 51, 218, + 222, 46, 210, 118, 77, 56, 33, 236, 222, 37, 141, 134, 173, 215, 36, 79, 208, 196, 144, 246, + 38, 157, 32, 19, 10, 45, 242, 238, 172, 29, 42, 3, 233, 177, 180, 232, 191, 149, 181, 242, + 146, 142, 22, 49, 191, 181, 69, 235, 233, 33, 150, 133, 21, 107, 84, 107, 172, 188, 152, + 207, 154, 226, 146, 184, 246, 234, 57, 89, 114, 2, 9, 226, 120, 245, 32, 53, 89, 188, 60, + 210, 248, 38, 29, 128, 158, 25, 14, 93, 26, 203, 196, 37, 170, 70, 156, 24, 154, 208, 73, + 186, 89, 105, 26, 242, 107, 96, 198, 204, 16, 195, 210, 4, 17, 103, 159, 231, 38, 8, 81, 38, + 157, 33, 230, 51, 136, 186, 28, 94, 79, 216, 158, 220, 178, 8, 157, 67, 194, 225, 63, 156, + 189, 207, 86, 31, 54, 171, 255, 5, 24, 0, 92, 171, 16, 67, 13, 10, 101, 110, 100, 115, 116, + 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 54, 55, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 54, 56, 32, 48, 32, 82, 47, 67, + 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, + 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, + 97, 114, 101, 110, 116, 32, 51, 52, 48, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, + 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, + 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, + 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, + 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, + 97, 114, 101, 110, 116, 115, 32, 51, 48, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, + 62, 13, 101, 110, 100, 111, 98, 106, 13, 54, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, + 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, + 101, 110, 103, 116, 104, 32, 50, 50, 50, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 72, 137, 172, 87, 221, 111, 19, 71, 16, 127, 247, 95, 113, 143, 190, 138, 51, 190, 189, 175, + 172, 132, 120, 128, 80, 68, 5, 18, 82, 173, 246, 1, 250, 64, 48, 78, 40, 142, 99, 57, 73, + 105, 251, 215, 119, 231, 115, 103, 247, 206, 110, 16, 8, 5, 249, 118, 103, 103, 103, 103, + 126, 51, 243, 155, 103, 171, 217, 227, 183, 31, 14, 119, 197, 147, 39, 143, 223, 60, 127, + 117, 94, 44, 139, 167, 79, 159, 157, 63, 47, 102, 203, 2, 254, 29, 46, 103, 143, 87, 171, + 101, 81, 187, 98, 181, 153, 45, 23, 222, 251, 51, 220, 168, 11, 231, 219, 133, 239, 139, + 193, 185, 69, 91, 172, 174, 103, 239, 230, 174, 236, 231, 103, 229, 31, 171, 95, 224, 76, + 93, 212, 205, 194, 227, 177, 218, 45, 92, 235, 194, 161, 213, 122, 54, 47, 202, 213, 159, + 179, 170, 246, 110, 177, 108, 206, 138, 170, 238, 23, 141, 139, 27, 116, 144, 78, 157, 245, + 65, 100, 40, 170, 190, 91, 46, 250, 54, 151, 17, 229, 149, 202, 141, 85, 169, 221, 69, 223, + 213, 139, 190, 88, 157, 7, 43, 235, 96, 165, 227, 191, 133, 88, 235, 88, 210, 213, 139, 38, + 220, 181, 156, 182, 168, 13, 118, 52, 180, 249, 110, 254, 107, 89, 213, 243, 207, 229, 217, + 252, 90, 126, 108, 195, 223, 135, 178, 114, 245, 252, 192, 95, 255, 148, 213, 48, 127, 84, + 250, 160, 170, 26, 218, 249, 93, 89, 117, 243, 155, 112, 47, 125, 238, 195, 193, 14, 101, + 97, 237, 26, 79, 194, 47, 20, 251, 20, 62, 89, 238, 175, 178, 66, 197, 53, 234, 188, 47, 91, + 187, 137, 235, 235, 176, 6, 127, 96, 5, 158, 254, 28, 86, 73, 217, 46, 44, 147, 36, 173, + 197, 111, 180, 27, 143, 195, 26, 168, 221, 148, 172, 239, 99, 233, 64, 143, 235, 112, 25, + 44, 52, 55, 222, 148, 110, 64, 81, 243, 40, 220, 222, 138, 28, 26, 12, 182, 220, 150, 149, + 199, 31, 55, 65, 107, 131, 247, 224, 82, 116, 201, 43, 16, 45, 48, 12, 85, 19, 2, 185, 4, + 76, 12, 139, 206, 145, 147, 247, 124, 61, 188, 132, 220, 5, 191, 80, 135, 88, 228, 234, 212, + 177, 240, 173, 22, 175, 249, 101, 240, 160, 209, 129, 43, 227, 73, 88, 188, 144, 231, 171, + 217, 112, 140, 55, 225, 231, 189, 216, 175, 247, 93, 171, 56, 139, 201, 133, 40, 129, 225, + 231, 13, 19, 139, 218, 183, 248, 48, 188, 235, 32, 33, 179, 90, 64, 152, 61, 44, 159, 123, + 49, 118, 23, 215, 245, 85, 91, 198, 219, 49, 29, 77, 59, 95, 133, 207, 223, 48, 10, 228, + 237, 37, 250, 121, 224, 164, 80, 115, 118, 114, 141, 81, 215, 89, 255, 118, 156, 56, 33, + 108, 29, 61, 207, 216, 118, 64, 136, 129, 144, 154, 182, 35, 103, 56, 58, 2, 175, 111, 217, + 130, 164, 176, 44, 151, 117, 81, 57, 175, 129, 127, 81, 14, 193, 4, 0, 150, 11, 186, 42, + 128, 99, 15, 234, 1, 218, 29, 173, 4, 123, 123, 148, 41, 76, 205, 65, 117, 109, 120, 216, + 144, 37, 177, 92, 85, 209, 166, 189, 75, 42, 66, 243, 157, 21, 1, 92, 204, 32, 244, 6, 131, + 156, 76, 29, 34, 10, 34, 34, 176, 240, 148, 176, 224, 33, 204, 24, 118, 225, 100, 218, 144, + 184, 137, 169, 63, 130, 53, 111, 33, 122, 224, 122, 161, 38, 228, 233, 236, 77, 216, 215, + 170, 88, 3, 7, 231, 224, 78, 58, 6, 177, 69, 233, 75, 155, 127, 254, 33, 149, 36, 222, 44, + 47, 190, 36, 108, 197, 196, 31, 146, 196, 207, 50, 32, 173, 47, 170, 148, 108, 202, 50, 245, + 139, 248, 26, 69, 2, 84, 234, 33, 166, 122, 150, 61, 87, 88, 83, 180, 138, 43, 250, 209, + 155, 182, 84, 125, 83, 209, 128, 27, 127, 124, 217, 16, 63, 76, 59, 226, 44, 189, 187, 246, + 205, 200, 17, 206, 186, 1, 222, 77, 238, 95, 253, 20, 252, 45, 187, 71, 92, 1, 26, 155, 54, + 214, 116, 254, 190, 40, 197, 164, 44, 172, 42, 77, 40, 2, 163, 20, 118, 209, 91, 90, 162, + 249, 192, 70, 97, 166, 78, 226, 157, 33, 214, 156, 90, 245, 239, 245, 118, 208, 205, 139, + 227, 194, 195, 27, 236, 124, 170, 128, 184, 2, 121, 223, 197, 147, 223, 166, 206, 164, 13, + 185, 50, 94, 114, 37, 144, 192, 47, 222, 161, 64, 70, 175, 47, 21, 238, 80, 127, 53, 48, + 201, 57, 31, 51, 240, 115, 86, 225, 61, 120, 75, 250, 33, 219, 235, 115, 136, 222, 102, 121, + 250, 57, 85, 176, 79, 220, 13, 95, 105, 115, 141, 5, 193, 246, 215, 186, 142, 113, 207, 75, + 29, 249, 34, 105, 184, 81, 201, 134, 233, 78, 30, 223, 176, 5, 213, 119, 89, 186, 214, 24, + 150, 68, 194, 31, 9, 196, 132, 105, 20, 84, 127, 68, 83, 130, 119, 171, 174, 145, 254, 148, + 119, 38, 237, 20, 16, 166, 231, 65, 201, 21, 8, 67, 91, 186, 134, 196, 24, 119, 163, 91, + 122, 86, 71, 43, 59, 144, 94, 195, 127, 176, 244, 150, 202, 188, 233, 102, 55, 148, 198, + 149, 123, 168, 94, 109, 159, 100, 217, 144, 177, 218, 246, 59, 123, 216, 185, 178, 185, 93, + 130, 226, 164, 113, 72, 76, 27, 70, 129, 162, 14, 107, 197, 150, 99, 70, 73, 226, 136, 181, + 10, 142, 175, 20, 180, 91, 230, 10, 40, 152, 32, 179, 105, 99, 201, 76, 238, 235, 98, 77, + 97, 185, 172, 186, 43, 21, 135, 235, 148, 49, 103, 71, 35, 72, 211, 70, 137, 198, 47, 202, + 83, 93, 9, 200, 206, 43, 225, 49, 93, 155, 209, 211, 60, 127, 88, 232, 14, 236, 16, 132, + 118, 108, 233, 223, 112, 89, 180, 121, 47, 181, 159, 101, 142, 82, 81, 216, 124, 64, 79, 1, + 177, 201, 158, 2, 27, 150, 138, 118, 102, 104, 80, 134, 198, 116, 81, 250, 129, 85, 250, 85, + 122, 10, 133, 143, 221, 11, 59, 234, 110, 20, 55, 239, 197, 111, 48, 100, 207, 127, 84, 132, + 149, 248, 70, 55, 37, 221, 117, 92, 36, 129, 19, 166, 5, 118, 199, 62, 103, 51, 154, 48, 80, + 60, 11, 235, 125, 236, 144, 49, 224, 121, 135, 2, 225, 183, 144, 115, 18, 64, 220, 56, 148, + 60, 106, 93, 235, 127, 18, 203, 102, 24, 147, 37, 88, 75, 184, 78, 116, 141, 186, 53, 38, + 145, 213, 20, 105, 149, 154, 110, 12, 182, 221, 0, 185, 225, 132, 248, 38, 113, 101, 174, + 67, 201, 36, 62, 139, 195, 175, 229, 79, 65, 175, 15, 82, 160, 41, 85, 21, 152, 8, 44, 58, + 112, 110, 51, 13, 203, 135, 161, 242, 24, 40, 59, 193, 89, 189, 228, 207, 73, 48, 117, 166, + 241, 228, 209, 236, 78, 13, 125, 28, 172, 20, 250, 93, 22, 181, 40, 148, 2, 97, 29, 33, 9, + 155, 224, 245, 45, 211, 234, 232, 125, 52, 211, 204, 116, 84, 218, 198, 115, 214, 198, 20, + 12, 233, 127, 48, 157, 113, 199, 114, 134, 134, 72, 84, 221, 49, 22, 226, 154, 108, 240, + 109, 90, 59, 155, 157, 253, 16, 133, 145, 218, 127, 177, 8, 118, 205, 17, 58, 188, 230, 140, + 140, 153, 35, 120, 104, 18, 158, 222, 28, 243, 36, 28, 126, 80, 85, 15, 122, 157, 159, 79, + 213, 137, 88, 232, 219, 99, 101, 62, 152, 48, 68, 114, 165, 37, 56, 118, 179, 36, 19, 226, + 116, 38, 185, 16, 14, 255, 12, 135, 36, 37, 83, 95, 192, 10, 207, 13, 195, 132, 159, 134, + 19, 245, 125, 248, 174, 68, 26, 18, 132, 179, 46, 25, 2, 215, 169, 9, 136, 242, 173, 56, 68, + 1, 97, 103, 52, 18, 180, 117, 38, 226, 26, 203, 72, 218, 166, 73, 60, 61, 156, 143, 134, 80, + 137, 143, 15, 135, 134, 83, 154, 1, 80, 202, 218, 94, 235, 120, 28, 221, 164, 250, 71, 0, + 41, 15, 89, 43, 189, 181, 164, 33, 109, 105, 195, 9, 22, 236, 82, 246, 49, 164, 201, 49, + 156, 98, 193, 163, 250, 195, 35, 194, 112, 108, 198, 25, 210, 17, 39, 25, 205, 178, 252, + 237, 70, 201, 91, 35, 47, 73, 230, 155, 46, 175, 4, 253, 136, 10, 79, 233, 9, 7, 220, 20, 9, + 14, 68, 168, 86, 186, 9, 68, 232, 13, 176, 82, 164, 166, 7, 74, 146, 142, 152, 238, 39, 68, + 113, 7, 161, 106, 12, 193, 69, 2, 124, 15, 255, 125, 164, 12, 3, 7, 59, 211, 229, 13, 199, + 22, 38, 219, 125, 39, 147, 69, 158, 198, 81, 119, 83, 105, 8, 139, 91, 169, 242, 49, 217, + 120, 103, 83, 70, 40, 43, 126, 165, 87, 88, 106, 9, 194, 255, 40, 155, 51, 245, 159, 43, + 128, 75, 178, 128, 210, 11, 182, 119, 153, 41, 145, 75, 66, 8, 45, 134, 208, 44, 65, 44, + 136, 18, 210, 234, 134, 11, 165, 140, 128, 154, 224, 235, 255, 121, 245, 149, 38, 18, 22, + 129, 116, 94, 188, 139, 35, 198, 20, 5, 142, 236, 85, 82, 37, 33, 114, 181, 105, 159, 176, + 137, 124, 81, 141, 200, 199, 71, 245, 193, 70, 45, 186, 211, 3, 121, 139, 135, 147, 90, 58, + 64, 191, 246, 24, 23, 123, 48, 203, 153, 140, 135, 207, 145, 23, 96, 49, 58, 47, 67, 128, + 141, 46, 8, 102, 59, 145, 202, 217, 27, 77, 189, 58, 113, 163, 83, 34, 183, 147, 218, 109, + 70, 143, 74, 175, 4, 250, 45, 185, 60, 110, 112, 27, 6, 199, 116, 231, 9, 42, 122, 111, 28, + 204, 108, 217, 69, 8, 139, 77, 32, 54, 50, 84, 207, 30, 13, 50, 72, 124, 123, 235, 220, 37, + 40, 19, 215, 245, 105, 169, 135, 207, 60, 89, 206, 146, 84, 1, 137, 135, 164, 202, 163, 176, + 183, 156, 228, 96, 123, 139, 33, 53, 148, 186, 46, 160, 80, 107, 194, 65, 71, 28, 233, 175, + 144, 60, 183, 146, 50, 98, 157, 186, 128, 239, 213, 52, 141, 131, 102, 210, 164, 221, 144, + 246, 32, 55, 156, 224, 181, 49, 221, 79, 16, 91, 231, 165, 239, 115, 159, 129, 83, 145, 175, + 229, 23, 131, 254, 189, 165, 15, 214, 146, 141, 9, 184, 190, 227, 24, 167, 19, 215, 65, 34, + 77, 1, 53, 239, 254, 237, 3, 122, 127, 146, 75, 157, 184, 27, 30, 150, 57, 156, 222, 74, + 116, 2, 15, 171, 75, 22, 165, 84, 48, 219, 196, 146, 46, 243, 154, 168, 100, 31, 60, 95, 81, + 195, 124, 153, 182, 172, 175, 152, 163, 188, 119, 142, 96, 130, 46, 135, 103, 174, 193, 161, + 55, 4, 234, 48, 108, 98, 119, 11, 253, 76, 146, 21, 187, 182, 180, 177, 254, 71, 181, 177, + 53, 55, 164, 15, 76, 25, 186, 20, 69, 50, 206, 152, 17, 102, 203, 53, 88, 201, 38, 215, 52, + 238, 123, 177, 95, 105, 227, 56, 168, 128, 41, 160, 102, 182, 179, 197, 89, 122, 216, 101, + 102, 128, 216, 74, 75, 123, 37, 143, 91, 142, 158, 230, 207, 164, 10, 10, 61, 195, 184, 107, + 99, 251, 77, 176, 98, 95, 211, 73, 162, 169, 115, 16, 31, 194, 131, 215, 148, 152, 78, 50, + 51, 239, 107, 194, 104, 164, 160, 37, 117, 153, 76, 188, 176, 185, 146, 39, 168, 103, 251, + 46, 244, 161, 42, 74, 187, 90, 96, 21, 228, 159, 194, 143, 74, 223, 41, 13, 33, 41, 230, + 183, 81, 187, 169, 142, 83, 229, 218, 39, 193, 134, 251, 243, 112, 203, 169, 123, 77, 162, + 29, 39, 116, 44, 206, 7, 21, 189, 16, 250, 76, 159, 40, 162, 218, 238, 229, 98, 233, 85, 65, + 226, 247, 210, 199, 146, 127, 53, 109, 168, 50, 61, 34, 146, 134, 78, 40, 244, 0, 40, 138, + 74, 245, 52, 189, 200, 116, 242, 172, 177, 39, 199, 153, 183, 27, 115, 70, 110, 100, 96, + 249, 49, 176, 196, 55, 252, 86, 26, 116, 64, 48, 201, 187, 107, 236, 163, 25, 182, 98, 179, + 57, 22, 161, 8, 245, 211, 51, 169, 79, 115, 90, 154, 161, 198, 106, 156, 50, 222, 76, 37, + 95, 149, 162, 8, 27, 36, 224, 79, 85, 230, 215, 10, 90, 238, 31, 47, 71, 172, 109, 23, 55, + 207, 37, 30, 83, 249, 21, 94, 174, 13, 36, 200, 190, 159, 135, 76, 122, 141, 234, 206, 53, + 6, 239, 75, 26, 111, 157, 31, 87, 9, 199, 175, 86, 246, 237, 137, 179, 208, 104, 7, 15, 86, + 63, 155, 221, 123, 113, 130, 18, 219, 132, 24, 112, 183, 82, 111, 38, 168, 5, 81, 98, 88, + 189, 124, 70, 33, 56, 242, 175, 246, 78, 222, 214, 160, 154, 240, 128, 83, 95, 188, 121, 94, + 204, 94, 172, 102, 255, 9, 48, 0, 227, 219, 149, 144, 13, 10, 101, 110, 100, 115, 116, 114, + 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 54, 57, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 55, 48, 32, 48, 32, 82, 47, 67, 114, 111, + 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, + 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, + 101, 110, 116, 32, 51, 52, 48, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, + 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, + 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, + 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, + 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, + 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 51, 49, 47, 84, + 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 55, 48, + 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, 56, 53, 49, 62, + 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 219, 110, 220, 54, 16, 125, 223, + 175, 208, 227, 170, 136, 100, 145, 186, 173, 128, 32, 15, 177, 131, 34, 5, 210, 6, 141, 222, + 156, 2, 141, 179, 89, 199, 173, 237, 24, 235, 164, 73, 254, 190, 60, 51, 156, 33, 41, 105, + 179, 70, 93, 24, 107, 136, 183, 225, 92, 206, 156, 25, 62, 31, 87, 39, 175, 223, 237, 63, + 103, 79, 159, 158, 188, 58, 125, 121, 150, 85, 217, 179, 103, 207, 207, 78, 179, 85, 149, + 225, 111, 127, 185, 58, 25, 199, 42, 51, 54, 27, 119, 171, 170, 28, 134, 97, 67, 11, 38, + 179, 67, 83, 14, 93, 214, 91, 91, 54, 217, 120, 179, 58, 95, 219, 188, 91, 15, 249, 31, 227, + 47, 56, 99, 50, 83, 151, 3, 29, 51, 182, 180, 141, 117, 135, 198, 237, 106, 157, 229, 227, + 95, 171, 194, 12, 182, 172, 234, 77, 86, 152, 174, 172, 109, 88, 224, 131, 124, 106, 211, + 185, 45, 125, 86, 116, 109, 85, 118, 205, 116, 143, 8, 47, 116, 223, 97, 81, 85, 214, 181, + 166, 236, 178, 241, 204, 105, 249, 201, 105, 121, 151, 55, 244, 251, 148, 23, 166, 94, 239, + 243, 205, 250, 115, 94, 180, 235, 47, 110, 234, 214, 253, 174, 100, 226, 123, 94, 244, 235, + 39, 185, 233, 156, 200, 162, 109, 214, 47, 243, 98, 227, 63, 239, 220, 209, 150, 142, 178, + 64, 140, 240, 117, 159, 23, 195, 250, 67, 94, 88, 191, 143, 228, 96, 129, 135, 56, 64, 171, + 91, 119, 15, 238, 123, 159, 219, 120, 251, 133, 155, 122, 231, 132, 177, 28, 40, 130, 13, + 110, 173, 231, 173, 56, 66, 75, 42, 247, 70, 119, 179, 4, 17, 28, 12, 224, 121, 236, 133, + 113, 60, 10, 106, 170, 54, 145, 12, 189, 69, 23, 121, 30, 250, 4, 25, 116, 195, 71, 55, 164, + 93, 88, 219, 59, 93, 140, 91, 5, 6, 42, 23, 145, 190, 108, 45, 123, 157, 180, 36, 195, 110, + 189, 126, 59, 177, 20, 102, 169, 251, 213, 63, 165, 119, 245, 224, 197, 197, 48, 204, 10, + 59, 148, 61, 197, 147, 99, 205, 51, 114, 215, 107, 28, 221, 67, 226, 7, 39, 250, 61, 43, 7, + 103, 21, 240, 95, 81, 195, 52, 104, 217, 174, 95, 229, 69, 71, 155, 62, 59, 231, 188, 195, + 224, 218, 205, 222, 147, 133, 184, 116, 252, 201, 137, 51, 110, 13, 208, 238, 221, 175, 20, + 93, 172, 215, 197, 154, 178, 118, 224, 172, 150, 33, 220, 56, 224, 214, 188, 120, 190, 62, + 69, 44, 142, 196, 175, 118, 110, 61, 19, 95, 208, 150, 43, 113, 72, 188, 37, 138, 101, 237, + 67, 142, 41, 113, 158, 149, 5, 117, 184, 15, 97, 221, 71, 8, 195, 238, 84, 40, 146, 97, 23, + 196, 94, 98, 17, 114, 175, 221, 206, 45, 33, 60, 200, 181, 169, 96, 205, 8, 236, 37, 241, + 170, 189, 4, 252, 134, 14, 249, 205, 95, 57, 60, 206, 46, 141, 56, 187, 188, 168, 93, 58, + 87, 189, 130, 7, 158, 19, 41, 64, 138, 110, 15, 89, 18, 131, 180, 110, 162, 85, 134, 35, 52, + 186, 82, 207, 224, 60, 239, 243, 240, 133, 210, 87, 177, 43, 24, 154, 58, 133, 75, 73, 26, + 228, 8, 42, 235, 192, 5, 53, 56, 67, 178, 159, 204, 226, 201, 101, 130, 176, 85, 202, 16, + 117, 202, 16, 53, 46, 134, 210, 193, 92, 140, 150, 12, 78, 140, 104, 226, 185, 132, 1, 230, + 248, 73, 225, 35, 193, 84, 18, 100, 206, 113, 238, 39, 131, 227, 163, 33, 171, 251, 110, + 154, 213, 219, 84, 133, 84, 45, 141, 217, 206, 103, 184, 226, 126, 209, 3, 180, 21, 250, + 125, 204, 35, 8, 199, 68, 249, 16, 195, 133, 250, 252, 60, 204, 218, 121, 218, 73, 149, 186, + 141, 93, 21, 71, 218, 46, 132, 90, 215, 239, 37, 57, 36, 218, 77, 20, 235, 102, 94, 10, 150, + 2, 125, 4, 213, 166, 95, 164, 210, 153, 229, 158, 152, 201, 161, 11, 85, 237, 88, 89, 192, + 230, 73, 97, 128, 56, 24, 249, 15, 12, 247, 222, 98, 102, 47, 148, 110, 228, 14, 90, 126, + 146, 15, 190, 72, 45, 210, 75, 74, 69, 158, 72, 218, 104, 227, 17, 228, 45, 20, 82, 31, 8, + 104, 133, 115, 196, 85, 135, 74, 147, 64, 77, 120, 71, 235, 251, 199, 249, 129, 192, 93, + 108, 15, 231, 10, 171, 172, 37, 97, 194, 140, 13, 21, 147, 153, 133, 45, 69, 35, 38, 68, 59, + 99, 68, 3, 160, 153, 205, 161, 34, 39, 49, 63, 84, 168, 162, 98, 171, 37, 49, 84, 172, 205, + 35, 43, 214, 232, 206, 123, 143, 55, 102, 82, 177, 175, 18, 110, 37, 135, 5, 215, 9, 50, + 113, 138, 102, 9, 72, 244, 37, 208, 162, 193, 133, 79, 204, 16, 199, 4, 158, 56, 142, 251, + 125, 77, 194, 112, 47, 71, 133, 105, 49, 25, 104, 40, 220, 190, 247, 154, 165, 9, 27, 89, + 194, 5, 211, 163, 26, 147, 179, 188, 194, 164, 115, 113, 21, 73, 165, 127, 215, 92, 66, 116, + 153, 38, 181, 139, 145, 66, 204, 41, 113, 168, 164, 209, 153, 111, 176, 51, 32, 244, 46, 38, + 162, 136, 163, 141, 47, 73, 83, 230, 196, 252, 243, 188, 94, 238, 23, 177, 248, 144, 142, 3, + 251, 210, 142, 227, 123, 110, 84, 194, 68, 139, 153, 247, 49, 233, 189, 111, 54, 15, 241, + 190, 216, 34, 94, 74, 101, 204, 219, 67, 123, 168, 63, 140, 20, 220, 69, 233, 153, 82, 37, + 57, 224, 119, 119, 254, 103, 92, 255, 91, 206, 93, 223, 155, 20, 41, 26, 83, 142, 88, 155, + 150, 8, 134, 8, 174, 81, 71, 102, 148, 122, 190, 53, 80, 151, 220, 105, 214, 79, 187, 46, + 19, 94, 21, 56, 241, 183, 222, 124, 237, 225, 215, 134, 38, 67, 65, 136, 27, 227, 162, 106, + 154, 184, 75, 105, 41, 117, 184, 163, 17, 70, 185, 148, 37, 8, 147, 192, 205, 73, 199, 119, + 75, 117, 167, 37, 238, 135, 204, 35, 92, 50, 60, 146, 75, 222, 72, 242, 223, 76, 88, 192, + 247, 30, 24, 249, 231, 22, 3, 101, 198, 226, 126, 146, 173, 147, 162, 165, 93, 1, 57, 70, + 147, 64, 204, 87, 252, 249, 195, 72, 23, 2, 197, 153, 0, 184, 77, 40, 6, 67, 75, 150, 58, + 190, 106, 115, 171, 183, 222, 169, 187, 247, 65, 154, 94, 46, 158, 142, 37, 222, 6, 137, 18, + 16, 126, 118, 14, 115, 65, 75, 104, 210, 211, 62, 236, 118, 137, 78, 192, 248, 240, 238, 98, + 91, 2, 130, 18, 152, 76, 81, 66, 139, 19, 160, 204, 113, 162, 109, 181, 242, 99, 36, 90, 45, + 167, 59, 167, 201, 121, 144, 81, 31, 86, 15, 54, 190, 192, 60, 186, 30, 152, 230, 63, 212, + 131, 57, 147, 132, 94, 46, 118, 218, 54, 110, 118, 188, 150, 109, 132, 80, 14, 120, 164, 1, + 39, 114, 104, 22, 177, 73, 58, 51, 69, 211, 62, 206, 243, 175, 225, 149, 194, 190, 111, 195, + 141, 242, 214, 107, 35, 139, 57, 132, 242, 18, 83, 157, 194, 52, 70, 209, 211, 199, 135, + 166, 69, 139, 225, 169, 145, 190, 94, 228, 125, 32, 186, 229, 10, 87, 230, 70, 48, 121, 144, + 62, 78, 217, 76, 170, 112, 61, 56, 178, 230, 225, 23, 124, 221, 226, 223, 22, 255, 208, 218, + 208, 7, 174, 4, 97, 211, 250, 133, 254, 251, 64, 185, 161, 125, 18, 53, 97, 96, 166, 218, + 253, 170, 255, 161, 203, 73, 30, 18, 113, 23, 27, 149, 213, 194, 244, 178, 252, 158, 52, + 252, 97, 93, 197, 182, 229, 247, 72, 31, 161, 54, 233, 150, 234, 33, 125, 154, 209, 69, 184, + 85, 133, 203, 203, 226, 11, 133, 78, 16, 152, 100, 170, 136, 231, 45, 176, 227, 34, 0, 208, + 119, 59, 216, 147, 60, 121, 251, 230, 112, 61, 57, 68, 57, 71, 159, 47, 133, 141, 10, 32, + 247, 47, 82, 74, 181, 131, 105, 40, 138, 21, 178, 52, 164, 198, 36, 91, 36, 47, 38, 52, 155, + 18, 146, 27, 190, 181, 214, 56, 114, 5, 125, 183, 104, 203, 82, 129, 132, 159, 106, 34, 82, + 36, 214, 126, 158, 145, 77, 219, 60, 158, 234, 204, 152, 178, 106, 8, 82, 214, 58, 227, 123, + 143, 169, 63, 39, 152, 58, 247, 34, 24, 145, 200, 235, 19, 7, 101, 170, 245, 66, 185, 166, + 145, 108, 14, 205, 128, 2, 47, 126, 106, 137, 229, 113, 140, 12, 191, 36, 160, 225, 215, + 164, 205, 114, 102, 91, 103, 182, 148, 205, 240, 130, 177, 210, 19, 21, 172, 121, 147, 52, + 160, 119, 49, 117, 185, 131, 195, 129, 183, 209, 112, 232, 109, 148, 130, 117, 104, 66, 189, + 77, 154, 181, 184, 2, 15, 2, 77, 192, 77, 224, 25, 219, 236, 101, 166, 117, 35, 172, 165, + 138, 132, 155, 175, 231, 233, 244, 141, 91, 137, 130, 67, 62, 164, 96, 25, 66, 6, 67, 248, + 133, 10, 226, 135, 205, 134, 102, 57, 245, 244, 153, 22, 226, 147, 84, 203, 212, 5, 63, 238, + 70, 231, 116, 64, 109, 70, 150, 31, 109, 194, 78, 169, 120, 17, 146, 252, 243, 111, 207, + 150, 242, 131, 16, 63, 124, 59, 172, 152, 238, 224, 139, 16, 200, 52, 143, 228, 202, 95, + 243, 248, 153, 183, 208, 105, 121, 134, 49, 131, 127, 125, 104, 248, 233, 67, 123, 191, 132, + 17, 117, 243, 164, 23, 129, 44, 37, 162, 212, 245, 254, 212, 244, 225, 18, 228, 189, 93, 59, + 127, 64, 91, 18, 28, 90, 190, 183, 185, 127, 30, 165, 240, 197, 144, 50, 77, 249, 71, 160, + 176, 243, 201, 154, 144, 172, 137, 176, 66, 218, 37, 37, 153, 181, 9, 88, 188, 95, 38, 82, + 201, 68, 74, 187, 64, 156, 224, 227, 8, 210, 161, 196, 240, 130, 94, 66, 128, 84, 134, 136, + 233, 182, 142, 50, 69, 183, 107, 145, 105, 216, 79, 129, 174, 163, 118, 3, 171, 52, 119, 41, + 109, 164, 71, 40, 22, 70, 98, 53, 33, 47, 57, 209, 78, 74, 137, 116, 55, 66, 245, 82, 178, + 98, 45, 57, 65, 84, 79, 159, 149, 117, 92, 132, 50, 109, 145, 143, 24, 219, 114, 78, 225, + 154, 224, 72, 156, 219, 134, 231, 154, 136, 118, 134, 219, 126, 49, 53, 181, 251, 148, 135, + 158, 247, 120, 235, 50, 6, 86, 119, 92, 20, 186, 184, 62, 197, 111, 183, 244, 21, 224, 157, + 54, 73, 105, 179, 113, 177, 175, 55, 154, 216, 146, 108, 47, 94, 157, 102, 171, 23, 227, + 234, 95, 1, 6, 0, 51, 48, 230, 64, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, + 101, 110, 100, 111, 98, 106, 13, 55, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, + 110, 116, 101, 110, 116, 115, 32, 55, 50, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, + 51, 52, 50, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, + 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, + 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, + 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, + 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, + 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, + 116, 115, 32, 51, 50, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, + 100, 111, 98, 106, 13, 55, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 50, 53, 52, 56, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 109, + 111, 220, 70, 14, 254, 190, 191, 66, 31, 87, 135, 74, 209, 140, 52, 210, 10, 9, 10, 92, 236, + 28, 144, 59, 24, 13, 218, 5, 250, 193, 45, 208, 36, 27, 167, 190, 216, 27, 99, 179, 174, + 219, 254, 250, 146, 28, 146, 195, 209, 74, 177, 15, 61, 24, 94, 72, 243, 66, 241, 245, 225, + 195, 103, 111, 222, 30, 142, 197, 139, 23, 207, 46, 206, 94, 159, 23, 77, 241, 237, 183, 47, + 207, 207, 138, 213, 203, 237, 170, 41, 240, 239, 240, 113, 245, 108, 187, 109, 10, 231, 139, + 237, 213, 170, 169, 199, 113, 220, 208, 134, 43, 252, 216, 213, 99, 95, 12, 222, 215, 93, + 177, 189, 93, 93, 174, 219, 178, 95, 55, 229, 207, 219, 127, 227, 29, 87, 184, 182, 30, 233, + 154, 243, 181, 239, 60, 92, 218, 238, 86, 235, 162, 220, 254, 119, 85, 185, 209, 215, 77, + 187, 41, 42, 215, 215, 173, 79, 27, 241, 98, 188, 181, 233, 225, 200, 80, 84, 125, 104, 234, + 190, 155, 158, 17, 225, 149, 158, 59, 21, 213, 76, 68, 245, 193, 213, 189, 209, 162, 109, + 234, 110, 211, 195, 205, 161, 14, 116, 243, 114, 125, 94, 86, 174, 89, 95, 151, 97, 125, 40, + 171, 176, 254, 80, 250, 245, 251, 178, 242, 235, 35, 216, 86, 192, 234, 22, 87, 223, 150, + 85, 191, 254, 29, 78, 210, 254, 151, 178, 133, 45, 52, 187, 114, 33, 212, 33, 184, 162, 242, + 99, 61, 244, 81, 162, 131, 155, 232, 25, 15, 255, 181, 120, 199, 179, 102, 222, 213, 45, + 216, 214, 204, 123, 160, 3, 187, 219, 184, 121, 185, 126, 93, 86, 27, 56, 82, 249, 182, 91, + 239, 203, 110, 253, 25, 228, 61, 160, 54, 188, 246, 30, 84, 193, 181, 219, 168, 23, 232, + 204, 27, 71, 60, 244, 153, 244, 167, 119, 58, 240, 71, 89, 13, 178, 176, 131, 133, 0, 54, + 111, 192, 230, 77, 188, 138, 194, 142, 70, 248, 145, 205, 118, 104, 182, 94, 188, 163, 139, + 120, 9, 197, 199, 55, 124, 250, 82, 86, 99, 60, 125, 3, 123, 244, 86, 27, 237, 183, 112, + 228, 87, 176, 128, 190, 68, 187, 86, 221, 59, 216, 137, 34, 43, 215, 210, 219, 130, 72, 62, + 79, 139, 168, 60, 217, 149, 219, 140, 18, 56, 52, 45, 164, 64, 51, 100, 177, 166, 11, 122, + 29, 125, 154, 204, 148, 21, 144, 167, 190, 69, 105, 122, 74, 14, 220, 171, 243, 104, 89, + 252, 42, 138, 225, 145, 157, 202, 33, 189, 211, 71, 222, 193, 6, 222, 68, 147, 230, 36, 160, + 225, 87, 122, 121, 18, 3, 122, 82, 85, 240, 40, 126, 235, 155, 210, 247, 124, 254, 74, 181, + 59, 136, 236, 95, 233, 149, 188, 141, 107, 70, 41, 117, 32, 58, 92, 244, 65, 9, 95, 55, 8, + 165, 136, 34, 62, 215, 4, 150, 189, 83, 81, 54, 204, 24, 143, 70, 35, 113, 14, 145, 248, 13, + 179, 131, 228, 28, 248, 60, 74, 185, 47, 59, 141, 116, 208, 204, 168, 156, 163, 93, 186, + 163, 162, 237, 151, 237, 29, 155, 252, 33, 116, 41, 195, 119, 228, 157, 24, 90, 73, 63, 189, + 160, 217, 201, 139, 0, 1, 110, 72, 213, 21, 125, 132, 138, 92, 139, 253, 251, 82, 78, 217, + 123, 239, 248, 35, 248, 213, 157, 200, 220, 83, 16, 190, 41, 141, 93, 182, 140, 232, 11, + 248, 112, 140, 0, 180, 160, 154, 56, 114, 251, 15, 240, 31, 203, 229, 35, 106, 163, 148, + 146, 110, 211, 67, 202, 9, 213, 62, 26, 131, 248, 70, 190, 187, 163, 188, 196, 165, 131, + 205, 76, 220, 103, 99, 81, 66, 204, 130, 176, 20, 150, 93, 242, 97, 56, 197, 143, 164, 165, + 215, 28, 161, 211, 87, 36, 91, 239, 124, 102, 220, 141, 190, 85, 85, 162, 118, 127, 170, + 135, 98, 216, 225, 98, 93, 58, 241, 76, 214, 184, 154, 102, 30, 149, 219, 255, 7, 42, 11, + 82, 142, 29, 133, 135, 236, 4, 109, 26, 94, 123, 39, 158, 80, 85, 227, 250, 73, 170, 141, 9, + 197, 53, 143, 147, 231, 52, 190, 112, 114, 232, 146, 48, 117, 52, 157, 34, 255, 75, 245, + 112, 145, 143, 25, 148, 44, 124, 153, 44, 217, 151, 11, 141, 100, 140, 176, 157, 181, 0, 88, + 59, 215, 8, 220, 137, 225, 10, 54, 233, 126, 212, 220, 117, 95, 193, 98, 91, 167, 174, 203, + 225, 72, 42, 131, 76, 19, 133, 220, 140, 66, 176, 246, 6, 96, 41, 46, 18, 112, 41, 212, 49, + 38, 132, 245, 15, 170, 21, 46, 107, 182, 42, 12, 8, 120, 184, 24, 183, 63, 98, 62, 225, 235, + 109, 201, 29, 232, 147, 197, 255, 143, 233, 124, 230, 56, 139, 163, 6, 33, 188, 53, 32, 69, + 141, 190, 106, 190, 53, 133, 90, 199, 217, 160, 224, 160, 0, 129, 81, 148, 230, 10, 167, + 190, 43, 157, 137, 188, 2, 196, 105, 255, 110, 67, 151, 98, 54, 227, 171, 159, 188, 247, 17, + 162, 228, 36, 126, 82, 131, 171, 173, 152, 15, 100, 204, 129, 30, 174, 197, 189, 10, 183, + 124, 244, 45, 247, 105, 124, 78, 45, 152, 244, 210, 176, 163, 9, 183, 230, 156, 237, 132, + 240, 58, 48, 159, 226, 215, 27, 241, 241, 39, 241, 200, 84, 43, 210, 89, 252, 98, 123, 4, + 158, 178, 189, 126, 162, 223, 46, 243, 208, 115, 120, 202, 112, 215, 102, 103, 158, 65, 169, + 223, 177, 229, 98, 172, 120, 81, 129, 221, 84, 163, 70, 61, 174, 247, 132, 77, 224, 193, + 192, 253, 43, 38, 144, 124, 112, 34, 101, 106, 171, 128, 124, 214, 17, 205, 199, 174, 83, + 85, 224, 122, 74, 1, 173, 226, 231, 229, 192, 155, 9, 89, 52, 73, 104, 233, 163, 37, 111, + 161, 123, 204, 31, 211, 154, 225, 27, 42, 83, 154, 120, 116, 89, 162, 9, 8, 218, 72, 19, + 150, 155, 183, 56, 121, 232, 184, 129, 100, 221, 148, 119, 70, 98, 112, 45, 59, 115, 152, + 70, 87, 157, 49, 100, 41, 17, 101, 166, 37, 211, 1, 241, 243, 166, 135, 110, 228, 248, 140, + 47, 121, 199, 177, 10, 192, 140, 42, 208, 3, 187, 80, 151, 244, 201, 200, 202, 216, 209, + 118, 255, 20, 117, 179, 121, 64, 178, 180, 18, 4, 224, 238, 103, 208, 118, 10, 47, 32, 2, + 213, 8, 177, 224, 135, 73, 88, 226, 146, 250, 122, 15, 105, 97, 250, 144, 41, 205, 97, 166, + 179, 12, 79, 169, 66, 56, 244, 160, 157, 196, 230, 245, 240, 104, 78, 217, 240, 147, 24, + 238, 30, 89, 158, 239, 117, 223, 39, 143, 15, 29, 243, 97, 219, 45, 179, 97, 5, 78, 252, 88, + 142, 86, 153, 108, 80, 48, 29, 56, 114, 150, 121, 103, 103, 81, 21, 90, 222, 89, 82, 126, + 226, 235, 73, 251, 203, 184, 213, 28, 112, 104, 45, 11, 171, 180, 35, 212, 13, 79, 24, 113, + 61, 174, 221, 27, 46, 97, 32, 47, 116, 137, 38, 18, 32, 31, 65, 30, 38, 106, 42, 244, 189, + 213, 118, 126, 6, 137, 130, 206, 240, 190, 150, 160, 98, 95, 58, 64, 132, 99, 171, 126, 249, + 94, 98, 123, 146, 37, 113, 255, 95, 81, 2, 106, 127, 136, 238, 241, 110, 118, 152, 184, 50, + 189, 10, 97, 220, 205, 141, 175, 184, 186, 208, 254, 120, 215, 50, 177, 228, 248, 61, 123, + 59, 50, 215, 172, 167, 179, 239, 219, 153, 246, 205, 107, 222, 76, 175, 156, 16, 162, 7, + 183, 48, 175, 248, 175, 106, 203, 193, 108, 124, 204, 88, 253, 71, 93, 214, 84, 154, 10, + 177, 21, 137, 139, 116, 69, 32, 151, 54, 210, 8, 150, 140, 114, 195, 227, 48, 172, 47, 169, + 36, 13, 28, 90, 22, 136, 50, 77, 151, 195, 146, 209, 188, 165, 83, 92, 118, 179, 4, 158, + 200, 187, 68, 248, 162, 172, 122, 36, 114, 67, 124, 122, 85, 18, 26, 58, 25, 80, 48, 102, + 192, 2, 119, 248, 131, 75, 111, 80, 238, 33, 250, 18, 76, 130, 6, 129, 206, 240, 241, 14, + 253, 92, 151, 184, 23, 103, 179, 54, 138, 184, 137, 195, 16, 10, 117, 146, 103, 212, 243, + 101, 114, 232, 254, 230, 228, 112, 129, 10, 17, 27, 165, 39, 54, 34, 166, 144, 161, 210, 26, + 53, 19, 52, 133, 122, 141, 109, 60, 144, 103, 132, 96, 85, 70, 107, 219, 156, 75, 117, 211, + 81, 65, 164, 216, 236, 215, 34, 166, 58, 17, 112, 108, 69, 194, 133, 212, 191, 37, 39, 19, + 133, 18, 94, 226, 129, 132, 106, 154, 0, 83, 37, 31, 68, 168, 49, 241, 171, 179, 131, 5, + 140, 28, 43, 217, 50, 215, 70, 220, 189, 99, 70, 221, 106, 125, 185, 54, 37, 92, 91, 56, 87, + 55, 29, 134, 107, 216, 212, 62, 244, 28, 203, 95, 38, 177, 188, 20, 25, 76, 67, 241, 113, + 137, 156, 185, 118, 134, 208, 183, 6, 57, 114, 86, 29, 103, 219, 125, 58, 151, 58, 32, 130, + 223, 85, 22, 82, 229, 85, 49, 88, 88, 84, 90, 126, 58, 202, 44, 248, 51, 249, 224, 73, 206, + 51, 121, 179, 236, 75, 47, 195, 208, 156, 71, 43, 114, 105, 80, 48, 49, 126, 109, 217, 175, + 39, 69, 51, 66, 65, 121, 169, 25, 36, 194, 141, 14, 137, 179, 180, 159, 145, 219, 82, 105, + 103, 9, 172, 113, 49, 55, 197, 57, 140, 228, 233, 47, 239, 120, 194, 2, 165, 113, 186, 220, + 39, 232, 14, 161, 158, 41, 64, 58, 201, 220, 73, 25, 228, 131, 145, 81, 128, 27, 148, 243, + 11, 125, 213, 140, 121, 175, 211, 163, 229, 71, 50, 166, 125, 177, 188, 124, 210, 72, 244, + 74, 198, 42, 240, 59, 59, 54, 84, 240, 183, 138, 190, 183, 165, 166, 14, 201, 198, 149, 41, + 13, 199, 124, 184, 225, 230, 18, 251, 180, 186, 77, 115, 50, 115, 222, 105, 170, 140, 125, + 61, 180, 227, 66, 241, 5, 200, 30, 39, 57, 193, 194, 218, 185, 58, 20, 178, 160, 174, 112, + 89, 251, 217, 149, 155, 217, 143, 247, 248, 241, 238, 177, 202, 31, 136, 49, 247, 214, 224, + 211, 108, 108, 165, 67, 114, 58, 40, 177, 70, 37, 103, 210, 1, 165, 16, 204, 50, 155, 112, + 211, 232, 205, 102, 235, 44, 197, 113, 203, 20, 7, 84, 161, 66, 165, 40, 187, 126, 172, 61, + 152, 107, 227, 252, 32, 159, 56, 205, 166, 96, 10, 140, 118, 196, 84, 59, 131, 106, 70, 92, + 51, 220, 231, 193, 15, 51, 13, 206, 17, 249, 20, 62, 206, 11, 183, 57, 233, 179, 103, 213, + 11, 89, 169, 3, 121, 14, 145, 183, 208, 33, 51, 199, 84, 212, 198, 85, 255, 68, 224, 142, + 216, 243, 181, 182, 2, 55, 180, 12, 196, 79, 49, 81, 194, 19, 52, 60, 21, 181, 17, 90, 209, + 194, 191, 227, 255, 100, 1, 99, 199, 252, 164, 240, 21, 74, 224, 93, 54, 201, 120, 103, 192, + 36, 81, 44, 205, 30, 62, 242, 72, 60, 248, 148, 1, 49, 127, 146, 51, 73, 248, 62, 11, 35, + 59, 192, 27, 48, 242, 79, 65, 35, 63, 73, 104, 47, 37, 41, 99, 138, 146, 27, 222, 20, 84, + 162, 135, 123, 70, 27, 182, 93, 32, 204, 120, 229, 202, 184, 187, 114, 249, 132, 32, 4, 54, + 205, 55, 154, 31, 210, 154, 21, 168, 164, 37, 106, 202, 141, 41, 0, 168, 193, 189, 98, 125, + 70, 135, 249, 164, 81, 10, 95, 159, 230, 82, 206, 95, 218, 166, 211, 106, 58, 239, 100, 64, + 48, 76, 129, 224, 150, 135, 56, 220, 145, 239, 219, 132, 192, 245, 135, 236, 198, 255, 162, + 33, 11, 80, 194, 54, 55, 121, 145, 0, 13, 207, 125, 57, 137, 44, 43, 18, 230, 44, 148, 250, + 19, 193, 139, 220, 255, 44, 2, 187, 143, 63, 119, 88, 187, 31, 8, 239, 43, 230, 254, 71, 48, + 61, 241, 249, 25, 226, 30, 254, 38, 113, 215, 193, 86, 114, 92, 65, 97, 218, 182, 49, 11, + 101, 18, 107, 51, 223, 209, 251, 91, 14, 24, 62, 39, 110, 130, 158, 186, 183, 227, 90, 123, + 58, 8, 190, 155, 236, 203, 104, 21, 65, 77, 230, 58, 69, 103, 205, 78, 229, 238, 45, 87, + 173, 209, 46, 150, 11, 29, 85, 61, 80, 202, 159, 98, 143, 14, 22, 124, 33, 78, 14, 82, 5, + 188, 248, 6, 3, 146, 184, 125, 74, 164, 83, 250, 30, 25, 224, 101, 154, 31, 246, 165, 241, + 81, 62, 49, 252, 228, 189, 47, 199, 140, 209, 146, 42, 168, 3, 107, 43, 248, 174, 76, 213, + 230, 82, 39, 108, 210, 215, 110, 24, 37, 146, 32, 181, 197, 47, 252, 192, 206, 239, 193, 91, + 240, 243, 73, 115, 233, 80, 42, 129, 255, 50, 33, 244, 233, 206, 109, 28, 203, 60, 115, 40, + 88, 217, 169, 168, 107, 81, 64, 83, 169, 25, 234, 182, 113, 70, 131, 14, 133, 74, 59, 153, + 155, 20, 66, 100, 91, 17, 237, 172, 7, 114, 162, 137, 70, 223, 156, 80, 203, 73, 242, 224, + 187, 88, 253, 30, 43, 90, 145, 66, 89, 174, 214, 175, 189, 158, 146, 75, 72, 195, 56, 214, + 221, 38, 235, 94, 202, 111, 174, 25, 20, 45, 87, 246, 131, 192, 178, 116, 154, 161, 227, 33, + 19, 23, 23, 75, 201, 231, 20, 152, 47, 62, 232, 134, 29, 103, 252, 9, 36, 242, 226, 68, 51, + 73, 206, 37, 221, 38, 57, 227, 155, 77, 189, 233, 116, 6, 249, 39, 106, 150, 197, 92, 229, + 0, 142, 254, 135, 82, 130, 126, 110, 98, 222, 118, 211, 20, 184, 212, 222, 57, 228, 61, 125, + 160, 224, 251, 136, 138, 166, 25, 205, 251, 32, 167, 29, 115, 182, 227, 119, 95, 109, 87, + 173, 7, 75, 58, 7, 54, 20, 125, 83, 52, 245, 224, 139, 195, 135, 213, 213, 234, 229, 214, + 106, 213, 212, 227, 56, 110, 192, 72, 128, 93, 96, 194, 161, 70, 100, 236, 49, 198, 219, 91, + 80, 57, 21, 114, 34, 126, 89, 139, 228, 196, 12, 19, 6, 32, 124, 46, 113, 128, 152, 214, 82, + 241, 184, 143, 111, 132, 27, 202, 9, 217, 163, 1, 157, 13, 254, 136, 254, 10, 66, 52, 12, + 237, 251, 13, 68, 179, 181, 65, 240, 148, 187, 233, 141, 104, 38, 100, 98, 102, 92, 75, 99, + 16, 186, 49, 227, 43, 138, 129, 106, 152, 101, 22, 81, 141, 169, 195, 131, 214, 148, 111, + 214, 21, 117, 8, 145, 187, 208, 35, 108, 177, 158, 246, 211, 228, 52, 45, 74, 161, 165, 53, + 102, 88, 65, 69, 205, 97, 126, 117, 113, 86, 172, 254, 18, 96, 0, 24, 7, 27, 52, 13, 10, + 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 55, 51, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 55, 52, 32, + 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, + 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 50, 32, 48, 32, 82, 47, 82, 101, 115, + 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, + 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, + 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, + 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, + 115, 32, 51, 51, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, + 111, 98, 106, 13, 55, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, + 32, 50, 51, 51, 48, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 109, 111, + 220, 54, 18, 254, 190, 191, 66, 31, 165, 67, 165, 136, 164, 180, 90, 1, 69, 129, 198, 201, + 1, 41, 80, 160, 184, 236, 225, 62, 52, 5, 154, 116, 187, 177, 175, 142, 227, 219, 216, 231, + 228, 223, 31, 231, 149, 67, 74, 27, 167, 205, 193, 88, 67, 162, 56, 195, 225, 204, 51, 207, + 204, 60, 221, 111, 158, 252, 244, 250, 116, 87, 125, 251, 237, 147, 31, 47, 94, 60, 171, + 250, 234, 187, 239, 158, 62, 187, 168, 54, 125, 5, 127, 167, 183, 155, 39, 251, 125, 95, 57, + 95, 237, 143, 155, 190, 155, 231, 121, 135, 31, 92, 229, 231, 161, 155, 183, 213, 228, 125, + 55, 84, 251, 119, 155, 159, 235, 208, 108, 107, 215, 252, 178, 255, 1, 100, 92, 229, 66, 55, + 163, 152, 243, 157, 31, 124, 20, 218, 31, 54, 117, 213, 236, 255, 189, 105, 221, 236, 187, + 62, 236, 170, 214, 109, 187, 224, 211, 7, 18, 36, 169, 221, 54, 110, 153, 170, 118, 59, 246, + 221, 118, 40, 247, 136, 242, 86, 247, 45, 85, 169, 221, 213, 118, 116, 221, 182, 218, 63, + 139, 86, 186, 104, 37, 88, 186, 141, 191, 78, 172, 245, 188, 211, 187, 46, 196, 179, 250, + 117, 139, 134, 104, 71, 160, 143, 63, 215, 127, 111, 90, 87, 95, 53, 187, 250, 20, 127, 31, + 154, 118, 174, 239, 154, 118, 172, 191, 105, 230, 40, 216, 142, 67, 125, 211, 12, 245, 239, + 77, 235, 235, 7, 88, 167, 181, 223, 26, 95, 191, 111, 156, 171, 219, 40, 61, 196, 199, 109, + 125, 43, 219, 64, 207, 107, 80, 138, 122, 64, 243, 127, 155, 118, 71, 223, 80, 63, 169, 192, + 175, 151, 81, 40, 237, 181, 186, 183, 245, 59, 88, 199, 127, 40, 10, 102, 192, 39, 124, 161, + 157, 248, 17, 197, 225, 227, 125, 252, 29, 69, 223, 111, 241, 223, 68, 90, 97, 29, 108, 2, + 75, 96, 223, 219, 100, 3, 111, 245, 133, 169, 240, 160, 43, 171, 118, 195, 135, 235, 40, + 236, 248, 127, 133, 1, 104, 67, 12, 97, 15, 33, 156, 186, 209, 147, 123, 9, 76, 16, 162, + 168, 56, 200, 131, 143, 15, 125, 252, 249, 40, 29, 234, 33, 62, 69, 229, 110, 30, 232, 32, + 245, 202, 53, 30, 179, 147, 143, 104, 57, 218, 35, 238, 130, 85, 117, 164, 120, 6, 22, 223, + 200, 187, 70, 15, 92, 163, 23, 227, 93, 224, 102, 88, 231, 87, 60, 147, 159, 225, 88, 248, + 140, 65, 215, 184, 218, 35, 113, 247, 199, 166, 157, 100, 245, 132, 174, 72, 225, 180, 246, + 20, 39, 129, 71, 198, 198, 235, 123, 6, 30, 94, 211, 96, 195, 21, 238, 224, 129, 49, 169, + 166, 74, 84, 96, 225, 74, 208, 75, 161, 232, 99, 32, 28, 6, 98, 218, 82, 32, 110, 25, 6, 41, + 158, 86, 249, 136, 23, 254, 68, 183, 225, 187, 33, 22, 94, 75, 122, 92, 11, 172, 223, 196, + 127, 180, 157, 47, 56, 146, 130, 247, 24, 197, 113, 145, 47, 99, 134, 83, 144, 45, 144, 234, + 45, 78, 193, 133, 5, 82, 71, 70, 179, 38, 197, 173, 200, 146, 186, 28, 165, 93, 163, 120, + 204, 168, 163, 245, 51, 130, 210, 114, 199, 244, 149, 220, 241, 82, 179, 83, 146, 22, 204, + 62, 52, 67, 242, 230, 55, 141, 163, 40, 15, 245, 11, 240, 39, 61, 74, 48, 136, 56, 224, 18, + 240, 148, 162, 66, 187, 140, 91, 75, 33, 205, 211, 131, 5, 254, 144, 216, 160, 202, 136, 9, + 126, 239, 49, 215, 78, 146, 2, 224, 238, 27, 155, 19, 159, 4, 202, 139, 131, 209, 174, 123, + 9, 8, 30, 33, 56, 21, 186, 242, 99, 164, 194, 237, 121, 34, 244, 75, 38, 116, 253, 103, 104, + 195, 90, 224, 39, 58, 69, 17, 8, 154, 222, 113, 174, 194, 71, 197, 3, 94, 33, 167, 76, 84, + 36, 137, 2, 155, 19, 24, 173, 235, 224, 75, 121, 230, 153, 107, 131, 41, 234, 102, 43, 175, + 144, 62, 137, 125, 236, 6, 192, 180, 53, 225, 216, 80, 100, 216, 137, 122, 246, 101, 161, + 48, 243, 228, 21, 170, 1, 177, 3, 133, 87, 118, 164, 156, 73, 17, 94, 222, 8, 73, 65, 93, + 12, 73, 144, 40, 132, 113, 23, 83, 44, 189, 174, 120, 49, 42, 141, 58, 63, 53, 142, 121, + 201, 2, 33, 126, 16, 78, 119, 88, 148, 227, 38, 170, 141, 142, 243, 140, 54, 101, 188, 53, + 241, 245, 144, 68, 245, 178, 146, 66, 87, 9, 169, 144, 32, 202, 93, 29, 167, 81, 148, 222, + 71, 189, 151, 77, 70, 126, 109, 206, 133, 103, 206, 80, 210, 193, 55, 118, 104, 1, 129, 233, + 11, 50, 110, 17, 185, 232, 54, 239, 50, 119, 79, 220, 175, 60, 72, 221, 84, 1, 37, 90, 120, + 144, 235, 17, 204, 149, 210, 142, 89, 42, 31, 147, 148, 167, 234, 136, 97, 82, 238, 184, + 211, 80, 71, 202, 10, 149, 115, 93, 63, 32, 107, 245, 115, 231, 189, 180, 110, 191, 50, 167, + 5, 230, 180, 5, 201, 205, 145, 0, 189, 112, 156, 195, 176, 2, 176, 160, 252, 244, 250, 214, + 51, 221, 19, 55, 139, 151, 108, 148, 28, 91, 190, 32, 227, 136, 215, 93, 55, 238, 130, 114, + 242, 193, 112, 242, 238, 43, 57, 57, 97, 2, 210, 226, 196, 1, 51, 124, 60, 47, 233, 248, + 181, 182, 90, 159, 101, 90, 41, 54, 182, 139, 114, 166, 109, 24, 20, 140, 111, 165, 141, + 201, 138, 250, 192, 221, 146, 242, 87, 214, 143, 216, 16, 175, 132, 144, 59, 237, 191, 18, + 66, 79, 128, 14, 67, 162, 208, 63, 18, 8, 229, 194, 133, 169, 137, 0, 222, 81, 213, 95, 236, + 40, 104, 140, 107, 65, 202, 240, 75, 116, 24, 115, 188, 15, 83, 55, 20, 36, 175, 153, 116, + 203, 154, 80, 76, 157, 82, 54, 157, 156, 151, 163, 169, 114, 156, 185, 99, 234, 215, 244, + 147, 145, 150, 152, 165, 254, 218, 26, 41, 235, 112, 67, 169, 129, 241, 245, 167, 232, 48, + 237, 155, 83, 209, 56, 165, 54, 9, 118, 125, 15, 107, 24, 109, 217, 10, 234, 239, 181, 69, + 202, 58, 112, 237, 105, 73, 246, 2, 212, 196, 210, 57, 253, 217, 41, 130, 196, 95, 74, 234, + 195, 137, 74, 24, 139, 190, 221, 107, 75, 152, 177, 255, 171, 58, 74, 225, 29, 241, 10, 104, + 11, 106, 124, 213, 52, 254, 188, 155, 217, 43, 25, 138, 173, 95, 66, 126, 183, 137, 187, 2, + 32, 140, 63, 113, 181, 53, 175, 2, 203, 220, 115, 38, 175, 149, 133, 133, 201, 4, 62, 160, + 232, 127, 96, 72, 178, 24, 208, 208, 2, 18, 207, 180, 12, 36, 43, 4, 76, 96, 242, 122, 33, + 140, 130, 79, 155, 144, 142, 251, 195, 0, 118, 189, 255, 78, 14, 71, 223, 224, 21, 193, 48, + 60, 31, 116, 161, 52, 122, 159, 43, 156, 70, 238, 209, 62, 118, 254, 127, 244, 177, 25, 43, + 49, 81, 120, 10, 236, 130, 61, 131, 97, 189, 240, 24, 237, 133, 21, 222, 115, 134, 248, 130, + 48, 223, 153, 226, 21, 134, 206, 237, 166, 47, 101, 62, 215, 119, 187, 94, 169, 47, 112, 19, + 27, 40, 239, 79, 89, 151, 164, 125, 115, 88, 146, 89, 160, 238, 2, 163, 243, 210, 92, 85, + 154, 124, 163, 116, 65, 38, 240, 97, 89, 238, 15, 22, 129, 15, 58, 65, 94, 167, 3, 139, 25, + 174, 117, 187, 190, 155, 231, 109, 198, 153, 202, 195, 139, 33, 41, 245, 130, 235, 237, 138, + 100, 68, 49, 174, 81, 255, 30, 97, 89, 246, 239, 143, 37, 42, 227, 125, 133, 129, 244, 197, + 201, 72, 134, 120, 46, 161, 76, 41, 98, 90, 128, 151, 0, 177, 59, 34, 113, 136, 68, 11, 166, + 238, 208, 176, 127, 82, 251, 214, 66, 154, 184, 34, 201, 162, 6, 73, 50, 72, 136, 129, 251, + 208, 175, 73, 136, 231, 145, 185, 52, 221, 21, 42, 210, 22, 144, 119, 180, 253, 23, 106, 81, + 8, 80, 235, 113, 75, 96, 200, 227, 10, 175, 26, 154, 187, 18, 4, 136, 67, 153, 6, 79, 186, + 38, 169, 134, 120, 3, 30, 132, 207, 50, 191, 169, 137, 152, 160, 175, 98, 155, 215, 204, + 246, 52, 51, 158, 2, 238, 111, 24, 231, 156, 135, 96, 40, 233, 164, 221, 138, 150, 47, 38, + 67, 105, 199, 163, 240, 191, 26, 29, 95, 207, 205, 117, 151, 50, 35, 101, 148, 47, 35, 103, + 106, 77, 244, 12, 211, 36, 195, 54, 88, 186, 23, 67, 86, 122, 146, 212, 66, 229, 61, 76, + 202, 209, 123, 19, 68, 245, 211, 106, 55, 195, 45, 181, 216, 117, 194, 136, 81, 69, 3, 37, + 183, 166, 201, 112, 90, 121, 188, 86, 75, 87, 206, 6, 210, 54, 112, 159, 104, 221, 224, 228, + 195, 27, 99, 133, 157, 47, 93, 105, 116, 86, 10, 203, 44, 203, 75, 61, 54, 186, 118, 170, + 82, 127, 142, 57, 54, 221, 52, 40, 62, 30, 132, 157, 199, 226, 26, 108, 142, 33, 182, 188, + 211, 102, 61, 218, 105, 158, 164, 46, 36, 219, 239, 140, 110, 3, 79, 238, 255, 208, 77, 105, + 95, 106, 65, 89, 162, 12, 212, 120, 38, 82, 97, 61, 82, 35, 83, 230, 181, 150, 130, 55, 18, + 12, 170, 82, 139, 98, 151, 218, 10, 72, 77, 185, 227, 168, 108, 238, 31, 107, 1, 4, 252, 31, + 212, 13, 114, 97, 138, 202, 100, 230, 86, 174, 45, 230, 237, 70, 25, 1, 193, 146, 19, 178, + 41, 71, 81, 228, 63, 156, 29, 105, 62, 84, 154, 17, 240, 205, 118, 218, 17, 105, 25, 102, + 230, 33, 117, 0, 7, 6, 204, 53, 194, 206, 5, 110, 82, 197, 42, 33, 34, 112, 96, 74, 51, 210, + 33, 183, 91, 80, 212, 85, 6, 97, 97, 142, 57, 205, 98, 115, 62, 123, 101, 115, 129, 57, 128, + 11, 152, 223, 102, 120, 135, 34, 0, 120, 199, 141, 31, 169, 150, 88, 42, 225, 200, 77, 101, + 94, 210, 218, 65, 80, 144, 132, 232, 3, 81, 74, 234, 38, 9, 238, 228, 3, 111, 186, 9, 50, + 86, 222, 214, 194, 148, 116, 28, 179, 189, 121, 188, 19, 197, 103, 126, 157, 44, 71, 126, + 76, 209, 84, 18, 84, 186, 56, 114, 154, 103, 67, 212, 148, 15, 81, 211, 153, 164, 113, 146, + 53, 96, 171, 205, 27, 54, 58, 53, 24, 156, 146, 235, 72, 135, 182, 203, 97, 13, 142, 113, + 237, 185, 75, 197, 23, 207, 47, 21, 76, 38, 185, 77, 33, 194, 43, 19, 204, 132, 6, 121, 97, + 201, 23, 230, 249, 200, 184, 63, 217, 126, 203, 86, 134, 224, 44, 176, 100, 26, 89, 64, 171, + 180, 200, 207, 165, 216, 178, 173, 130, 109, 147, 95, 66, 202, 63, 30, 27, 222, 101, 106, + 150, 159, 181, 165, 228, 214, 155, 43, 187, 159, 86, 169, 221, 114, 225, 67, 22, 202, 131, + 146, 2, 25, 126, 212, 119, 169, 231, 120, 243, 15, 57, 51, 139, 132, 37, 21, 176, 71, 235, + 149, 178, 133, 201, 70, 99, 255, 60, 164, 46, 72, 77, 193, 173, 151, 108, 233, 53, 219, 150, + 178, 232, 109, 126, 112, 161, 105, 1, 208, 237, 42, 173, 207, 2, 207, 157, 5, 167, 106, 41, + 90, 154, 116, 57, 164, 197, 212, 33, 156, 26, 15, 229, 208, 245, 236, 237, 253, 223, 162, + 147, 147, 85, 227, 87, 39, 127, 209, 124, 231, 4, 5, 43, 11, 131, 118, 66, 150, 102, 58, + 202, 167, 65, 225, 189, 239, 113, 8, 104, 3, 253, 251, 157, 96, 4, 30, 7, 22, 112, 9, 63, + 197, 0, 57, 104, 202, 253, 245, 126, 121, 207, 179, 3, 245, 129, 26, 244, 3, 231, 37, 248, + 74, 0, 19, 86, 232, 55, 12, 58, 117, 40, 83, 235, 11, 8, 75, 245, 10, 25, 70, 164, 53, 190, + 109, 140, 124, 170, 125, 166, 9, 78, 1, 161, 247, 11, 208, 167, 64, 209, 154, 135, 145, 71, + 49, 91, 91, 51, 34, 145, 130, 184, 104, 145, 185, 91, 8, 137, 153, 194, 35, 197, 236, 115, + 125, 178, 101, 161, 209, 56, 228, 22, 43, 178, 112, 176, 184, 69, 58, 20, 233, 30, 239, 165, + 232, 18, 113, 59, 158, 136, 122, 4, 40, 237, 255, 129, 234, 63, 44, 72, 225, 17, 137, 241, + 51, 254, 17, 202, 40, 253, 227, 19, 82, 73, 195, 162, 194, 225, 45, 32, 9, 84, 81, 230, 16, + 59, 6, 141, 137, 180, 188, 216, 139, 155, 208, 16, 221, 153, 118, 83, 204, 75, 24, 24, 20, + 72, 225, 24, 211, 144, 34, 222, 63, 211, 166, 41, 131, 153, 147, 220, 80, 168, 229, 0, 57, + 195, 244, 102, 240, 16, 98, 54, 235, 137, 140, 20, 69, 0, 111, 165, 138, 114, 42, 50, 29, + 225, 114, 70, 146, 143, 66, 160, 110, 80, 90, 164, 55, 174, 36, 110, 133, 229, 151, 3, 79, + 96, 235, 64, 8, 150, 20, 67, 114, 140, 25, 95, 242, 41, 75, 239, 136, 219, 239, 181, 75, + 184, 105, 150, 3, 210, 53, 151, 180, 20, 163, 67, 82, 189, 108, 229, 78, 214, 75, 248, 144, + 123, 233, 192, 172, 105, 102, 17, 69, 225, 42, 151, 70, 32, 120, 33, 247, 5, 145, 18, 43, + 18, 213, 69, 230, 167, 135, 231, 63, 94, 84, 155, 231, 251, 205, 255, 4, 24, 0, 215, 20, + 147, 214, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, + 106, 13, 55, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, + 115, 32, 55, 54, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, + 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 50, 32, 48, 32, + 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, + 47, 67, 50, 95, 48, 32, 49, 57, 54, 32, 48, 32, 82, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, + 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, + 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 57, 50, + 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, + 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, + 116, 80, 97, 114, 101, 110, 116, 115, 32, 51, 52, 47, 84, 121, 112, 101, 47, 80, 97, 103, + 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 55, 54, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 50, 50, 55, 53, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 72, 137, 172, 87, 109, 143, 220, 52, 16, 254, 190, 191, 34, 31, 215, 136, 164, 177, + 19, 39, 27, 174, 170, 212, 222, 93, 81, 17, 5, 212, 46, 159, 16, 130, 227, 182, 123, 61, + 216, 123, 209, 30, 71, 225, 223, 227, 121, 181, 157, 100, 23, 104, 81, 181, 215, 196, 177, + 199, 227, 241, 204, 243, 60, 243, 98, 189, 120, 242, 221, 197, 254, 247, 226, 233, 211, 39, + 175, 79, 95, 157, 21, 117, 241, 236, 217, 139, 179, 211, 98, 81, 23, 240, 111, 127, 181, + 120, 178, 94, 215, 133, 117, 197, 122, 187, 168, 171, 97, 24, 86, 248, 193, 22, 110, 104, + 171, 161, 43, 122, 231, 170, 182, 88, 223, 44, 126, 88, 54, 166, 91, 58, 243, 227, 250, 43, + 88, 99, 11, 219, 84, 3, 46, 179, 174, 114, 173, 11, 139, 214, 155, 197, 178, 48, 235, 95, + 23, 165, 29, 92, 85, 55, 171, 162, 180, 93, 213, 184, 248, 129, 22, 210, 170, 85, 23, 166, + 244, 69, 217, 249, 186, 234, 218, 241, 28, 49, 94, 234, 188, 169, 41, 245, 187, 232, 188, + 173, 186, 98, 125, 22, 188, 124, 241, 206, 184, 229, 239, 193, 85, 248, 193, 243, 222, 148, + 62, 44, 241, 56, 112, 97, 202, 142, 70, 174, 224, 73, 230, 94, 135, 207, 183, 166, 108, 104, + 20, 38, 223, 153, 210, 45, 183, 166, 108, 195, 91, 105, 219, 184, 248, 207, 240, 138, 51, + 46, 97, 6, 78, 195, 149, 248, 10, 246, 30, 96, 2, 254, 185, 22, 59, 56, 225, 193, 88, 88, 8, + 241, 171, 139, 210, 13, 149, 119, 228, 177, 13, 166, 91, 140, 109, 183, 172, 36, 190, 142, + 207, 230, 108, 213, 132, 232, 212, 243, 49, 108, 67, 228, 26, 250, 248, 195, 242, 37, 236, + 121, 103, 224, 124, 43, 240, 186, 239, 219, 229, 47, 166, 13, 78, 149, 112, 202, 210, 211, + 31, 124, 77, 166, 224, 224, 5, 172, 133, 193, 16, 128, 33, 89, 113, 29, 134, 110, 131, 13, + 28, 230, 5, 176, 197, 214, 180, 211, 245, 33, 52, 189, 140, 94, 26, 135, 19, 97, 49, 60, + 163, 201, 7, 176, 130, 127, 192, 174, 124, 126, 16, 219, 190, 37, 59, 48, 184, 137, 27, 224, + 82, 180, 141, 79, 55, 48, 229, 222, 180, 209, 193, 204, 208, 231, 166, 227, 40, 151, 77, + 200, 156, 26, 50, 167, 175, 250, 142, 98, 84, 132, 175, 175, 76, 73, 135, 111, 209, 204, + 158, 45, 220, 7, 187, 30, 159, 30, 52, 6, 52, 11, 55, 186, 67, 187, 37, 31, 237, 66, 156, + 160, 161, 141, 132, 121, 131, 70, 30, 249, 208, 137, 135, 165, 109, 208, 71, 154, 191, 197, + 125, 75, 75, 247, 117, 67, 41, 53, 178, 13, 134, 96, 109, 140, 239, 206, 136, 223, 120, 29, + 23, 148, 99, 171, 60, 136, 45, 135, 3, 150, 211, 187, 76, 249, 3, 206, 29, 239, 1, 237, 226, + 214, 239, 40, 71, 249, 160, 249, 34, 122, 131, 24, 197, 149, 240, 77, 79, 124, 155, 222, 68, + 112, 201, 129, 159, 101, 154, 234, 33, 252, 146, 234, 239, 13, 185, 247, 40, 30, 75, 148, + 93, 40, 49, 24, 148, 171, 79, 147, 20, 190, 197, 201, 7, 226, 42, 231, 135, 201, 158, 11, + 138, 95, 199, 57, 229, 154, 56, 229, 37, 135, 222, 89, 189, 102, 87, 179, 235, 161, 208, + 154, 194, 218, 170, 110, 177, 214, 134, 166, 234, 237, 192, 149, 248, 51, 87, 98, 195, 149, + 56, 45, 205, 0, 128, 181, 147, 210, 132, 18, 175, 163, 71, 151, 4, 75, 86, 202, 21, 158, + 240, 112, 21, 167, 38, 76, 122, 46, 110, 223, 33, 152, 5, 223, 222, 207, 4, 38, 102, 48, 68, + 226, 158, 167, 63, 104, 126, 236, 226, 212, 15, 18, 53, 54, 70, 25, 130, 149, 226, 106, 95, + 245, 206, 234, 93, 129, 207, 122, 213, 55, 146, 103, 59, 186, 97, 43, 251, 15, 144, 38, 224, + 187, 230, 192, 36, 147, 6, 202, 36, 185, 157, 33, 47, 166, 240, 10, 54, 179, 77, 70, 43, 5, + 63, 180, 78, 36, 99, 134, 57, 228, 25, 254, 3, 90, 208, 244, 109, 130, 0, 82, 135, 67, 14, + 12, 10, 95, 92, 225, 109, 122, 156, 4, 12, 19, 143, 113, 194, 35, 70, 120, 47, 65, 75, 145, + 208, 113, 224, 215, 159, 133, 64, 203, 165, 81, 217, 128, 9, 152, 118, 157, 149, 28, 16, + 206, 248, 254, 90, 28, 141, 85, 13, 59, 253, 197, 129, 8, 215, 13, 19, 174, 5, 209, 179, + 217, 154, 24, 143, 146, 80, 21, 174, 208, 180, 143, 196, 10, 60, 213, 51, 179, 190, 33, 108, + 234, 148, 49, 239, 140, 37, 106, 195, 209, 157, 241, 56, 138, 212, 55, 154, 7, 89, 113, 140, + 250, 154, 79, 164, 190, 117, 88, 159, 85, 135, 226, 74, 223, 198, 148, 157, 12, 242, 51, + 220, 12, 132, 2, 239, 95, 24, 51, 86, 89, 78, 121, 14, 105, 67, 110, 118, 134, 56, 52, 186, + 10, 73, 41, 128, 106, 13, 205, 210, 171, 27, 177, 13, 45, 133, 180, 200, 215, 72, 14, 243, + 94, 146, 55, 113, 255, 185, 108, 215, 99, 19, 22, 38, 229, 159, 16, 229, 124, 245, 67, 138, + 74, 165, 110, 149, 153, 148, 172, 120, 55, 1, 52, 176, 159, 34, 25, 18, 238, 193, 66, 134, + 25, 105, 124, 5, 177, 31, 165, 104, 223, 107, 124, 247, 122, 82, 61, 95, 44, 145, 207, 141, + 18, 192, 47, 92, 81, 68, 71, 123, 166, 171, 148, 34, 56, 14, 96, 120, 19, 247, 205, 252, 83, + 68, 58, 174, 90, 114, 118, 18, 244, 18, 62, 187, 143, 198, 193, 41, 46, 207, 41, 49, 70, 70, + 142, 1, 213, 0, 188, 51, 182, 31, 19, 188, 8, 176, 118, 68, 13, 52, 246, 189, 145, 211, 205, + 169, 15, 122, 23, 9, 216, 46, 223, 234, 150, 113, 243, 196, 216, 214, 76, 151, 100, 155, + 202, 196, 123, 172, 35, 41, 141, 140, 139, 18, 115, 100, 106, 155, 8, 148, 137, 42, 136, + 172, 114, 149, 220, 108, 170, 179, 34, 234, 237, 50, 242, 59, 168, 103, 100, 215, 54, 11, + 191, 64, 155, 0, 238, 225, 180, 178, 77, 82, 153, 136, 196, 105, 18, 192, 215, 177, 204, + 128, 49, 116, 83, 168, 83, 75, 63, 106, 236, 241, 14, 115, 54, 20, 58, 174, 76, 131, 33, 58, + 2, 33, 137, 169, 164, 17, 24, 89, 65, 106, 58, 106, 230, 136, 55, 7, 111, 160, 195, 248, + 143, 110, 110, 108, 104, 46, 245, 241, 99, 166, 234, 52, 106, 56, 34, 148, 38, 56, 145, 136, + 159, 27, 166, 26, 59, 215, 222, 36, 120, 144, 74, 144, 127, 16, 77, 202, 241, 185, 40, 236, + 210, 42, 78, 145, 235, 168, 220, 24, 27, 155, 19, 27, 228, 159, 68, 237, 32, 66, 142, 180, + 78, 10, 175, 223, 26, 59, 171, 15, 85, 96, 196, 48, 253, 154, 183, 136, 169, 254, 191, 224, + 182, 149, 146, 35, 23, 252, 133, 145, 4, 161, 162, 245, 113, 191, 36, 180, 158, 73, 5, 134, + 116, 125, 114, 177, 41, 61, 192, 236, 136, 206, 56, 243, 139, 144, 222, 172, 64, 78, 221, + 79, 34, 65, 236, 42, 80, 83, 91, 148, 13, 50, 253, 211, 64, 83, 171, 103, 164, 4, 218, 131, + 210, 155, 150, 176, 52, 120, 35, 234, 237, 70, 206, 174, 233, 149, 166, 105, 51, 204, 32, + 41, 12, 50, 13, 200, 5, 41, 37, 178, 96, 112, 118, 178, 58, 143, 221, 123, 69, 207, 29, 243, + 80, 152, 223, 42, 231, 89, 233, 86, 243, 110, 3, 4, 249, 208, 217, 127, 221, 109, 180, 85, + 91, 55, 121, 183, 1, 91, 66, 13, 208, 83, 205, 29, 200, 147, 48, 82, 178, 218, 67, 183, 39, + 232, 14, 190, 129, 158, 58, 131, 243, 188, 229, 44, 133, 153, 243, 218, 193, 185, 26, 101, + 154, 192, 233, 134, 225, 52, 107, 22, 40, 126, 91, 97, 192, 81, 240, 253, 56, 187, 47, 68, + 136, 17, 116, 102, 164, 207, 112, 224, 231, 37, 149, 155, 32, 153, 79, 75, 216, 39, 92, 24, + 237, 222, 198, 43, 247, 180, 236, 34, 19, 0, 106, 237, 68, 235, 42, 77, 209, 82, 114, 52, + 252, 239, 218, 143, 76, 211, 111, 140, 143, 141, 94, 8, 184, 231, 132, 210, 83, 30, 134, + 106, 47, 176, 33, 39, 203, 91, 130, 137, 114, 153, 136, 8, 207, 182, 38, 105, 218, 199, 142, + 38, 197, 65, 47, 180, 191, 155, 84, 121, 68, 85, 41, 22, 248, 116, 108, 15, 223, 230, 96, + 65, 150, 175, 89, 64, 36, 225, 152, 74, 54, 159, 16, 236, 108, 103, 53, 19, 8, 214, 253, 62, + 193, 59, 120, 83, 41, 123, 207, 110, 199, 140, 220, 49, 84, 198, 196, 144, 152, 156, 132, + 23, 60, 92, 119, 48, 43, 154, 79, 203, 10, 5, 175, 13, 183, 40, 34, 84, 50, 134, 181, 51, + 208, 5, 180, 59, 169, 98, 152, 185, 55, 171, 25, 153, 103, 145, 157, 210, 174, 230, 38, 89, + 211, 48, 132, 144, 98, 179, 204, 160, 89, 151, 100, 109, 236, 110, 37, 97, 92, 230, 29, 39, + 15, 56, 230, 16, 140, 84, 30, 80, 3, 149, 48, 215, 172, 181, 70, 62, 80, 30, 151, 209, 153, + 67, 232, 161, 233, 201, 80, 85, 135, 208, 218, 12, 168, 132, 250, 247, 81, 251, 229, 44, 85, + 230, 205, 73, 120, 59, 55, 253, 242, 59, 240, 230, 165, 100, 210, 7, 41, 74, 189, 132, 141, + 70, 18, 125, 249, 48, 201, 165, 200, 39, 240, 118, 171, 13, 206, 173, 177, 0, 207, 29, 237, + 240, 28, 150, 124, 195, 96, 157, 228, 232, 67, 174, 31, 79, 76, 31, 51, 90, 240, 217, 30, + 79, 201, 143, 204, 199, 53, 53, 85, 105, 160, 103, 58, 205, 20, 101, 243, 211, 206, 202, + 155, 169, 48, 114, 20, 216, 215, 26, 55, 248, 246, 155, 230, 43, 131, 130, 95, 126, 45, 165, + 16, 191, 109, 120, 207, 51, 29, 81, 197, 166, 48, 38, 61, 10, 120, 21, 195, 88, 153, 166, + 142, 92, 172, 49, 107, 186, 16, 128, 190, 40, 221, 160, 89, 243, 109, 32, 201, 96, 169, 131, + 206, 180, 9, 22, 32, 109, 131, 217, 7, 85, 183, 97, 174, 168, 91, 224, 226, 150, 127, 149, + 24, 119, 108, 220, 89, 164, 78, 34, 249, 25, 78, 239, 90, 229, 244, 67, 34, 207, 207, 171, + 59, 74, 0, 207, 74, 87, 114, 58, 83, 186, 154, 144, 218, 196, 68, 180, 207, 36, 158, 82, + 227, 75, 188, 25, 153, 163, 233, 150, 66, 175, 95, 190, 8, 50, 142, 46, 124, 167, 228, 125, + 144, 174, 125, 52, 206, 24, 1, 121, 51, 191, 123, 20, 42, 210, 76, 113, 43, 54, 230, 252, + 47, 160, 136, 142, 100, 255, 71, 75, 73, 40, 125, 76, 252, 232, 185, 54, 129, 135, 8, 54, + 118, 185, 247, 241, 226, 68, 120, 192, 20, 230, 178, 33, 195, 153, 126, 2, 106, 52, 152, + 229, 50, 62, 108, 85, 114, 227, 2, 185, 203, 62, 7, 221, 158, 74, 12, 24, 68, 250, 57, 153, + 57, 180, 249, 213, 192, 138, 203, 96, 116, 92, 222, 41, 227, 76, 173, 191, 2, 166, 69, 68, + 68, 174, 57, 5, 151, 185, 1, 11, 95, 191, 132, 117, 113, 202, 218, 8, 97, 214, 138, 198, 80, + 43, 167, 162, 13, 115, 161, 167, 46, 200, 189, 83, 174, 54, 193, 138, 197, 170, 10, 118, 65, + 218, 54, 242, 226, 84, 241, 2, 209, 120, 124, 59, 33, 2, 249, 255, 33, 49, 2, 205, 165, 113, + 44, 118, 87, 185, 118, 164, 70, 103, 199, 159, 98, 241, 37, 208, 153, 194, 37, 221, 146, + 232, 156, 172, 214, 35, 242, 39, 125, 213, 120, 61, 29, 191, 15, 71, 239, 194, 239, 185, + 240, 120, 154, 96, 115, 245, 133, 247, 67, 245, 12, 183, 79, 54, 83, 160, 246, 35, 248, 135, + 17, 180, 174, 190, 156, 24, 123, 56, 200, 159, 40, 144, 159, 11, 92, 37, 149, 159, 82, 203, + 85, 68, 49, 37, 202, 61, 119, 162, 156, 74, 101, 35, 237, 14, 49, 190, 240, 50, 119, 161, + 155, 132, 241, 225, 236, 145, 243, 119, 138, 160, 120, 1, 35, 254, 141, 193, 141, 154, 1, + 63, 168, 34, 30, 193, 221, 149, 0, 6, 107, 99, 75, 21, 169, 201, 65, 121, 3, 9, 16, 5, 108, + 52, 24, 175, 68, 9, 45, 7, 111, 233, 190, 30, 77, 180, 203, 17, 114, 2, 140, 40, 143, 53, 7, + 162, 127, 5, 183, 33, 146, 38, 152, 20, 152, 226, 128, 235, 248, 38, 32, 175, 248, 255, 27, + 93, 125, 38, 66, 40, 123, 143, 8, 227, 246, 19, 74, 14, 197, 145, 200, 5, 237, 0, 232, 168, + 163, 116, 240, 8, 218, 231, 40, 212, 207, 217, 197, 24, 202, 120, 238, 199, 136, 136, 163, + 134, 17, 243, 14, 173, 73, 71, 19, 47, 37, 171, 77, 132, 182, 188, 118, 171, 216, 47, 142, + 21, 197, 42, 81, 20, 116, 220, 243, 215, 167, 197, 226, 124, 189, 248, 91, 128, 1, 0, 59, + 219, 58, 135, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, + 98, 106, 13, 55, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, + 116, 115, 32, 55, 56, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, + 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, + 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 50, 32, 48, + 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, + 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, + 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, + 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, + 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, + 116, 80, 97, 114, 101, 110, 116, 115, 32, 51, 53, 47, 84, 121, 112, 101, 47, 80, 97, 103, + 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 55, 56, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 50, 55, 57, 56, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 72, 137, 172, 87, 219, 110, 220, 56, 18, 125, 247, 87, 232, 177, 181, 136, 104, 241, + 38, 137, 131, 193, 0, 147, 203, 67, 22, 200, 96, 128, 237, 55, 99, 129, 137, 199, 118, 236, + 196, 142, 189, 29, 123, 147, 252, 253, 178, 138, 85, 20, 41, 145, 237, 182, 189, 24, 56, + 211, 98, 145, 172, 203, 169, 58, 85, 60, 254, 243, 227, 238, 190, 249, 245, 215, 227, 15, + 111, 222, 191, 109, 250, 230, 183, 223, 94, 191, 125, 211, 28, 189, 222, 30, 245, 13, 252, + 183, 251, 116, 116, 188, 221, 246, 141, 84, 205, 246, 226, 168, 23, 206, 185, 9, 5, 178, 81, + 206, 8, 55, 52, 163, 82, 194, 52, 219, 155, 163, 147, 141, 110, 7, 255, 247, 239, 237, 63, + 225, 140, 108, 164, 22, 14, 143, 73, 37, 148, 81, 254, 208, 246, 236, 104, 211, 180, 219, + 207, 71, 157, 116, 74, 244, 122, 106, 58, 57, 8, 173, 102, 65, 56, 24, 78, 77, 131, 223, 50, + 54, 221, 96, 123, 49, 152, 229, 30, 190, 188, 139, 251, 214, 87, 69, 187, 155, 193, 74, 49, + 52, 219, 183, 222, 202, 63, 219, 110, 218, 156, 183, 106, 179, 107, 59, 187, 249, 214, 118, + 114, 115, 219, 118, 106, 243, 181, 237, 244, 230, 99, 219, 13, 155, 235, 214, 250, 43, 236, + 230, 189, 247, 7, 87, 255, 6, 57, 110, 186, 105, 187, 17, 15, 131, 124, 11, 23, 224, 137, + 31, 173, 210, 126, 9, 92, 239, 155, 78, 57, 97, 85, 80, 38, 253, 21, 198, 255, 89, 255, 39, + 56, 52, 138, 204, 82, 82, 104, 239, 88, 95, 118, 223, 120, 167, 117, 16, 158, 108, 254, 240, + 234, 110, 253, 29, 223, 65, 229, 171, 214, 145, 125, 222, 147, 198, 59, 96, 188, 133, 10, + 229, 55, 224, 206, 57, 88, 10, 27, 238, 97, 183, 183, 91, 106, 252, 196, 195, 151, 173, 1, + 155, 101, 16, 194, 50, 110, 255, 111, 136, 74, 7, 97, 153, 54, 63, 193, 205, 91, 116, 223, + 240, 117, 160, 230, 202, 203, 124, 196, 220, 124, 29, 94, 5, 203, 120, 29, 252, 128, 35, + 159, 194, 30, 56, 114, 225, 63, 225, 38, 31, 109, 41, 253, 154, 82, 155, 14, 5, 157, 95, + 108, 252, 223, 29, 169, 80, 180, 5, 239, 103, 221, 120, 253, 117, 59, 37, 250, 97, 121, 229, + 110, 226, 47, 30, 249, 1, 14, 136, 16, 31, 8, 20, 170, 134, 240, 119, 218, 103, 75, 15, 217, + 50, 138, 113, 8, 193, 141, 33, 153, 131, 224, 213, 41, 50, 30, 116, 174, 4, 168, 24, 207, + 124, 14, 9, 52, 96, 220, 72, 138, 2, 176, 243, 43, 57, 255, 64, 191, 193, 238, 115, 202, 35, + 194, 9, 150, 239, 41, 19, 29, 95, 64, 192, 13, 248, 221, 167, 234, 190, 128, 228, 188, 149, + 35, 111, 229, 144, 164, 39, 47, 219, 12, 42, 20, 128, 121, 168, 16, 177, 193, 187, 96, 233, + 204, 111, 165, 56, 225, 182, 173, 87, 122, 201, 160, 227, 249, 84, 25, 96, 5, 167, 224, 242, + 217, 166, 176, 2, 216, 93, 115, 238, 196, 90, 240, 97, 230, 90, 56, 229, 107, 99, 82, 113, + 120, 99, 42, 134, 92, 125, 32, 45, 1, 243, 136, 78, 48, 215, 95, 222, 113, 33, 112, 216, + 191, 132, 220, 3, 11, 146, 236, 179, 193, 196, 43, 242, 210, 31, 149, 22, 45, 140, 245, 225, + 235, 218, 251, 6, 75, 168, 0, 221, 197, 127, 68, 43, 29, 249, 144, 209, 72, 169, 180, 135, + 23, 150, 118, 22, 113, 112, 217, 206, 121, 183, 99, 16, 41, 66, 40, 92, 213, 165, 157, 11, + 34, 75, 178, 29, 165, 6, 167, 1, 108, 140, 105, 112, 154, 241, 0, 46, 113, 30, 192, 190, 55, + 16, 104, 6, 34, 30, 138, 201, 26, 129, 14, 92, 132, 71, 98, 234, 129, 33, 148, 58, 179, 133, + 223, 153, 31, 226, 54, 18, 84, 107, 154, 55, 128, 21, 119, 180, 95, 199, 218, 144, 204, 73, + 17, 38, 221, 72, 41, 122, 131, 77, 33, 169, 114, 27, 122, 194, 95, 4, 130, 38, 16, 214, 168, + 72, 191, 85, 49, 42, 54, 20, 159, 28, 205, 156, 31, 95, 82, 203, 71, 131, 89, 197, 236, 138, + 11, 92, 238, 17, 173, 49, 88, 142, 167, 169, 46, 112, 49, 18, 68, 92, 116, 143, 5, 98, 52, + 75, 122, 163, 213, 57, 239, 105, 225, 52, 181, 226, 18, 179, 158, 36, 176, 122, 141, 219, + 207, 230, 237, 209, 150, 100, 45, 166, 215, 247, 196, 147, 178, 250, 156, 87, 34, 49, 204, + 252, 17, 179, 202, 111, 166, 142, 133, 68, 76, 241, 78, 137, 152, 233, 229, 22, 219, 2, 24, + 190, 78, 165, 156, 28, 23, 61, 33, 26, 51, 215, 243, 242, 96, 86, 106, 251, 235, 33, 236, + 184, 158, 249, 78, 201, 148, 174, 22, 182, 172, 179, 80, 58, 41, 70, 156, 151, 14, 74, 64, + 231, 41, 35, 230, 223, 216, 142, 137, 254, 85, 250, 233, 140, 248, 117, 217, 183, 53, 138, + 69, 16, 247, 99, 40, 66, 239, 236, 146, 222, 240, 192, 156, 18, 138, 31, 209, 84, 189, 20, + 114, 72, 10, 238, 36, 54, 246, 153, 197, 152, 161, 152, 144, 108, 230, 133, 45, 120, 81, + 202, 69, 91, 242, 194, 238, 247, 130, 104, 170, 198, 67, 99, 154, 70, 208, 19, 86, 245, 151, + 243, 80, 48, 65, 1, 244, 74, 22, 177, 87, 126, 224, 212, 90, 30, 138, 189, 236, 69, 63, 37, + 224, 15, 164, 165, 8, 126, 240, 66, 5, 55, 174, 99, 227, 13, 146, 37, 7, 141, 166, 50, 223, + 216, 85, 246, 118, 106, 144, 194, 72, 181, 66, 49, 229, 47, 187, 34, 175, 210, 220, 101, + 113, 180, 91, 119, 80, 207, 202, 50, 118, 209, 179, 164, 139, 142, 255, 231, 46, 234, 164, + 73, 234, 63, 109, 143, 68, 115, 46, 25, 103, 2, 137, 223, 165, 173, 43, 29, 60, 93, 90, 34, + 17, 145, 153, 39, 56, 157, 221, 130, 156, 28, 15, 138, 243, 8, 98, 104, 0, 145, 60, 5, 131, + 101, 133, 1, 132, 78, 115, 82, 158, 165, 115, 40, 223, 246, 16, 144, 81, 193, 206, 192, 181, + 245, 33, 23, 240, 136, 15, 6, 157, 36, 5, 211, 126, 82, 140, 232, 196, 28, 24, 86, 22, 7, + 139, 48, 74, 37, 173, 63, 169, 98, 89, 36, 35, 77, 217, 50, 147, 51, 191, 7, 80, 166, 188, + 113, 61, 234, 10, 191, 6, 127, 121, 39, 251, 189, 247, 173, 217, 205, 154, 236, 49, 49, 237, + 121, 74, 216, 71, 11, 62, 234, 205, 201, 82, 239, 231, 153, 210, 220, 91, 99, 156, 111, 124, + 156, 47, 127, 156, 133, 248, 84, 204, 152, 211, 132, 77, 89, 56, 91, 189, 171, 189, 203, 70, + 24, 49, 1, 67, 238, 182, 55, 109, 50, 239, 166, 45, 108, 28, 133, 118, 195, 19, 104, 204, + 206, 61, 76, 97, 77, 251, 148, 163, 97, 170, 56, 75, 241, 120, 48, 79, 7, 157, 51, 135, 76, + 2, 99, 94, 108, 99, 200, 207, 203, 88, 20, 209, 223, 229, 129, 69, 127, 89, 129, 28, 166, + 147, 105, 20, 206, 78, 25, 21, 206, 209, 5, 211, 184, 34, 112, 129, 39, 101, 190, 87, 231, + 47, 51, 93, 123, 153, 233, 71, 186, 47, 109, 57, 77, 70, 197, 236, 72, 90, 154, 75, 144, + 117, 105, 228, 209, 52, 23, 192, 161, 27, 206, 160, 216, 165, 105, 3, 132, 244, 98, 182, + 188, 158, 114, 122, 193, 120, 240, 205, 111, 151, 172, 217, 128, 32, 25, 52, 21, 143, 237, + 219, 127, 248, 184, 62, 50, 193, 45, 252, 178, 43, 167, 86, 13, 8, 150, 80, 246, 35, 114, + 14, 250, 122, 199, 220, 118, 21, 185, 45, 0, 100, 169, 141, 198, 224, 103, 175, 82, 242, 48, + 12, 250, 133, 26, 153, 124, 215, 28, 15, 174, 145, 108, 204, 211, 113, 140, 173, 86, 134, + 205, 122, 91, 240, 119, 201, 125, 197, 8, 236, 170, 157, 42, 161, 135, 115, 95, 248, 191, + 248, 15, 85, 116, 205, 115, 176, 19, 206, 248, 137, 64, 247, 66, 153, 103, 56, 216, 251, 57, + 182, 243, 246, 215, 29, 229, 146, 147, 166, 23, 195, 48, 241, 193, 63, 218, 56, 223, 48, 53, + 189, 219, 250, 145, 186, 23, 90, 53, 166, 199, 170, 236, 133, 153, 194, 63, 187, 243, 163, + 139, 199, 133, 19, 203, 164, 116, 208, 24, 103, 169, 70, 230, 170, 28, 213, 33, 30, 36, 156, + 180, 80, 153, 212, 153, 186, 214, 189, 66, 178, 87, 251, 255, 141, 36, 148, 131, 200, 45, + 170, 8, 195, 181, 101, 225, 235, 237, 2, 197, 94, 56, 135, 207, 16, 63, 134, 53, 210, 249, + 217, 96, 106, 244, 56, 193, 209, 237, 205, 211, 51, 54, 0, 58, 60, 14, 168, 82, 194, 40, + 203, 7, 45, 10, 134, 244, 89, 16, 38, 0, 59, 15, 22, 52, 124, 40, 181, 66, 28, 92, 245, 9, + 88, 4, 149, 100, 53, 80, 203, 71, 9, 84, 18, 86, 64, 173, 107, 5, 225, 168, 133, 49, 53, + 220, 202, 66, 186, 182, 40, 60, 12, 55, 24, 209, 205, 51, 112, 27, 8, 55, 247, 56, 110, 62, + 142, 214, 24, 62, 40, 113, 34, 155, 50, 236, 184, 91, 20, 160, 147, 107, 232, 70, 37, 220, + 80, 129, 46, 200, 170, 208, 21, 143, 50, 116, 65, 88, 131, 174, 170, 21, 132, 118, 128, 215, + 106, 5, 186, 178, 144, 174, 45, 10, 15, 131, 206, 104, 225, 158, 83, 114, 142, 160, 3, 36, + 84, 21, 190, 185, 61, 21, 0, 180, 47, 2, 208, 90, 49, 76, 21, 0, 131, 172, 10, 96, 241, 40, + 3, 24, 132, 53, 0, 171, 90, 65, 168, 39, 49, 112, 5, 141, 112, 89, 166, 181, 34, 165, 139, + 203, 210, 195, 48, 84, 3, 156, 125, 58, 134, 1, 187, 41, 226, 104, 9, 47, 123, 56, 142, 234, + 197, 133, 232, 29, 151, 181, 66, 12, 178, 42, 142, 197, 163, 140, 99, 16, 214, 112, 172, + 106, 5, 161, 146, 62, 74, 181, 66, 44, 11, 233, 218, 162, 48, 128, 200, 8, 20, 17, 236, 1, + 23, 64, 240, 100, 243, 59, 207, 179, 48, 190, 166, 243, 234, 122, 18, 210, 90, 12, 253, 184, + 152, 241, 88, 207, 9, 98, 114, 8, 172, 157, 233, 157, 197, 97, 232, 101, 72, 42, 143, 89, + 173, 34, 131, 172, 138, 100, 241, 40, 35, 25, 132, 53, 36, 171, 90, 65, 216, 27, 8, 239, 2, + 143, 40, 244, 225, 171, 30, 172, 200, 38, 18, 85, 61, 41, 106, 140, 194, 194, 173, 236, 37, + 202, 106, 78, 150, 111, 101, 97, 233, 214, 61, 178, 125, 249, 40, 173, 80, 141, 154, 122, + 80, 7, 132, 194, 252, 209, 243, 238, 166, 83, 232, 249, 246, 45, 17, 136, 241, 127, 147, + 255, 19, 156, 160, 138, 182, 98, 45, 16, 81, 172, 120, 72, 26, 79, 89, 154, 89, 132, 31, 19, + 233, 43, 212, 154, 240, 144, 160, 121, 219, 79, 101, 215, 225, 49, 232, 5, 119, 244, 178, + 141, 37, 114, 133, 27, 206, 146, 55, 165, 165, 167, 36, 166, 251, 103, 248, 7, 54, 239, 226, + 21, 241, 77, 55, 63, 178, 240, 147, 158, 152, 54, 127, 67, 90, 122, 41, 46, 13, 89, 189, + 112, 216, 58, 92, 251, 25, 95, 122, 187, 220, 49, 126, 61, 242, 37, 190, 115, 94, 230, 182, + 47, 31, 83, 153, 201, 159, 248, 5, 138, 30, 226, 18, 189, 203, 96, 219, 239, 225, 73, 27, + 159, 179, 157, 246, 28, 227, 105, 162, 147, 56, 239, 99, 192, 217, 128, 51, 10, 186, 15, + 162, 154, 240, 23, 172, 60, 180, 209, 93, 188, 84, 234, 4, 139, 248, 208, 37, 193, 199, 160, + 110, 253, 253, 117, 190, 73, 101, 87, 177, 242, 191, 253, 231, 136, 17, 158, 253, 160, 45, + 176, 24, 144, 40, 61, 109, 173, 176, 118, 73, 123, 213, 142, 231, 75, 111, 234, 147, 177, + 101, 96, 29, 235, 199, 237, 210, 213, 12, 109, 144, 156, 38, 32, 193, 119, 68, 228, 63, 228, + 107, 200, 195, 184, 124, 54, 95, 154, 102, 19, 124, 231, 73, 146, 184, 13, 145, 1, 149, 63, + 113, 239, 80, 12, 65, 7, 125, 67, 91, 151, 96, 250, 196, 214, 111, 176, 47, 12, 155, 87, + 173, 243, 172, 15, 125, 160, 71, 254, 31, 54, 199, 254, 171, 199, 145, 128, 114, 202, 82, + 121, 118, 210, 166, 5, 154, 125, 192, 236, 23, 140, 135, 93, 193, 124, 116, 203, 66, 247, + 25, 14, 126, 99, 225, 198, 91, 180, 39, 192, 111, 75, 138, 195, 6, 110, 77, 151, 139, 102, + 5, 182, 236, 75, 177, 232, 214, 123, 248, 113, 31, 234, 107, 161, 1, 145, 129, 31, 12, 165, + 138, 133, 1, 54, 223, 135, 12, 1, 55, 24, 178, 57, 6, 23, 241, 75, 97, 144, 29, 215, 33, + 246, 248, 180, 10, 147, 136, 160, 225, 218, 20, 35, 2, 69, 157, 168, 225, 12, 189, 228, 12, + 130, 109, 150, 36, 41, 141, 96, 66, 205, 145, 130, 111, 116, 112, 65, 53, 41, 140, 121, 78, + 67, 224, 31, 136, 33, 242, 64, 132, 173, 148, 211, 52, 69, 148, 146, 90, 7, 26, 8, 123, 208, + 234, 87, 45, 43, 138, 148, 251, 170, 45, 143, 55, 106, 240, 163, 230, 104, 14, 45, 116, 39, + 38, 147, 188, 44, 7, 202, 235, 82, 134, 59, 206, 111, 197, 129, 249, 23, 88, 29, 41, 245, + 42, 22, 62, 122, 179, 139, 159, 232, 215, 43, 172, 16, 2, 85, 141, 78, 24, 105, 17, 87, 104, + 139, 160, 124, 73, 137, 51, 219, 114, 42, 83, 211, 202, 232, 86, 61, 131, 111, 237, 158, 84, + 71, 27, 19, 54, 45, 83, 137, 28, 140, 112, 82, 31, 204, 166, 112, 78, 229, 175, 56, 194, + 255, 113, 78, 5, 59, 30, 136, 33, 184, 95, 31, 198, 172, 28, 183, 10, 179, 170, 26, 181, + 234, 77, 198, 172, 9, 57, 89, 170, 209, 50, 189, 142, 86, 56, 107, 159, 68, 175, 56, 226, + 37, 145, 25, 3, 209, 216, 96, 151, 171, 197, 134, 72, 131, 57, 17, 54, 202, 144, 187, 142, + 62, 87, 188, 9, 139, 75, 158, 208, 180, 158, 114, 39, 124, 175, 216, 51, 108, 202, 21, 94, + 150, 52, 132, 188, 130, 211, 160, 43, 167, 80, 174, 0, 216, 247, 145, 30, 3, 240, 59, 131, + 39, 33, 75, 21, 76, 152, 65, 152, 237, 184, 72, 190, 21, 21, 237, 83, 29, 199, 66, 164, 248, + 167, 252, 122, 145, 140, 137, 55, 204, 232, 177, 158, 40, 221, 108, 248, 129, 243, 91, 140, + 83, 66, 240, 160, 231, 19, 247, 5, 192, 240, 138, 113, 60, 141, 177, 157, 103, 72, 60, 248, + 19, 195, 63, 68, 255, 42, 115, 140, 159, 203, 36, 76, 245, 207, 104, 223, 144, 94, 64, 108, + 19, 194, 61, 98, 35, 7, 72, 44, 81, 92, 32, 188, 99, 111, 177, 79, 66, 179, 76, 117, 30, + 230, 253, 162, 21, 102, 112, 56, 211, 115, 208, 120, 166, 119, 47, 156, 233, 63, 132, 72, + 80, 31, 224, 110, 193, 83, 254, 142, 184, 143, 100, 243, 64, 15, 118, 223, 181, 33, 55, 16, + 138, 116, 16, 213, 122, 209, 174, 252, 119, 72, 160, 100, 184, 207, 116, 197, 94, 200, 205, + 47, 94, 71, 204, 62, 197, 62, 164, 82, 131, 32, 205, 226, 46, 60, 152, 234, 140, 28, 156, + 156, 40, 170, 140, 41, 12, 155, 191, 241, 216, 206, 205, 124, 158, 90, 232, 242, 229, 184, + 206, 13, 101, 230, 120, 126, 175, 60, 196, 225, 125, 145, 163, 200, 118, 23, 204, 128, 55, + 220, 214, 146, 145, 44, 114, 100, 80, 127, 136, 101, 212, 180, 249, 234, 108, 170, 136, 236, + 126, 73, 168, 81, 165, 161, 224, 61, 61, 75, 130, 74, 0, 170, 130, 114, 202, 253, 203, 81, + 121, 174, 79, 148, 196, 120, 46, 167, 235, 52, 248, 89, 79, 137, 143, 169, 11, 202, 190, + 123, 230, 127, 155, 147, 16, 196, 255, 221, 246, 232, 221, 135, 55, 205, 209, 255, 4, 24, 0, + 232, 174, 198, 213, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 55, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, + 110, 116, 115, 32, 56, 48, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, + 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, + 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 50, 32, + 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, + 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, + 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, + 32, 48, 32, 82, 47, 84, 84, 52, 32, 50, 48, 48, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, + 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, + 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, + 51, 54, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 56, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, + 49, 52, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 219, 110, 220, + 54, 16, 125, 223, 175, 208, 227, 170, 136, 100, 145, 162, 68, 17, 8, 2, 52, 113, 128, 166, + 168, 129, 2, 93, 160, 15, 110, 129, 198, 113, 109, 167, 113, 182, 139, 77, 182, 219, 244, + 235, 203, 33, 103, 134, 67, 93, 214, 110, 220, 4, 9, 86, 188, 12, 231, 126, 206, 188, 220, + 172, 206, 126, 124, 187, 255, 92, 60, 127, 126, 118, 241, 234, 205, 121, 209, 20, 47, 94, + 188, 60, 127, 85, 172, 154, 2, 254, 238, 111, 87, 103, 155, 77, 83, 40, 93, 108, 110, 86, + 77, 237, 156, 27, 194, 134, 42, 180, 51, 181, 235, 11, 171, 117, 109, 138, 205, 199, 213, + 229, 186, 45, 251, 181, 41, 127, 221, 124, 15, 119, 84, 161, 218, 218, 133, 107, 74, 215, + 218, 104, 127, 105, 115, 189, 90, 23, 229, 230, 143, 85, 165, 156, 174, 155, 118, 40, 42, + 213, 215, 173, 78, 27, 241, 98, 188, 53, 244, 254, 136, 45, 170, 190, 107, 234, 222, 140, + 207, 144, 240, 138, 207, 45, 139, 106, 138, 190, 83, 117, 95, 108, 206, 189, 150, 159, 202, + 202, 173, 63, 151, 85, 183, 126, 91, 86, 106, 189, 45, 205, 250, 218, 255, 11, 31, 251, 114, + 8, 31, 133, 255, 232, 226, 250, 239, 101, 165, 195, 143, 3, 172, 173, 223, 149, 58, 94, 126, + 239, 143, 254, 233, 13, 222, 134, 101, 188, 16, 118, 96, 85, 126, 223, 161, 20, 77, 171, 91, + 18, 123, 132, 109, 121, 52, 40, 241, 119, 89, 89, 90, 5, 133, 194, 209, 91, 208, 26, 222, + 252, 8, 71, 194, 82, 93, 86, 3, 157, 123, 93, 218, 120, 249, 157, 255, 207, 134, 39, 113, + 39, 152, 27, 182, 238, 253, 109, 182, 242, 61, 10, 214, 210, 222, 29, 107, 10, 71, 194, 205, + 104, 34, 159, 56, 146, 233, 104, 153, 176, 29, 189, 25, 87, 32, 9, 26, 31, 18, 91, 119, 58, + 186, 29, 46, 129, 32, 112, 32, 8, 77, 118, 192, 125, 19, 214, 110, 74, 135, 119, 125, 240, + 116, 161, 84, 221, 24, 136, 159, 15, 158, 106, 21, 38, 208, 111, 24, 92, 141, 193, 157, 68, + 219, 213, 109, 143, 217, 118, 185, 86, 94, 120, 187, 238, 188, 240, 224, 174, 46, 196, 166, + 75, 190, 248, 32, 237, 128, 216, 193, 113, 176, 30, 190, 130, 142, 105, 9, 181, 237, 146, + 23, 238, 253, 94, 116, 44, 44, 115, 180, 15, 165, 234, 163, 251, 96, 121, 33, 225, 248, 70, + 124, 0, 62, 175, 130, 30, 225, 25, 206, 145, 27, 255, 131, 29, 30, 15, 153, 245, 151, 82, + 205, 58, 74, 107, 239, 240, 190, 255, 42, 79, 129, 107, 116, 80, 229, 153, 15, 67, 23, 126, + 53, 126, 173, 241, 95, 222, 119, 122, 72, 47, 82, 63, 168, 180, 179, 181, 81, 174, 240, 63, + 106, 219, 147, 199, 251, 32, 171, 9, 62, 199, 27, 45, 222, 208, 202, 63, 105, 100, 43, 144, + 21, 111, 124, 157, 183, 164, 207, 5, 24, 252, 133, 106, 193, 154, 224, 9, 200, 146, 67, 25, + 235, 130, 221, 141, 251, 236, 221, 173, 56, 184, 229, 170, 13, 222, 76, 89, 7, 135, 62, 83, + 253, 89, 195, 249, 137, 159, 84, 10, 211, 74, 240, 207, 104, 138, 121, 118, 51, 150, 222, + 52, 183, 237, 108, 113, 227, 69, 204, 146, 240, 157, 23, 123, 214, 144, 232, 141, 91, 113, + 92, 52, 23, 101, 49, 56, 85, 235, 155, 97, 99, 185, 242, 192, 145, 119, 120, 63, 220, 165, + 102, 4, 15, 247, 201, 1, 106, 86, 71, 21, 117, 10, 139, 97, 27, 95, 10, 59, 71, 122, 30, + 100, 131, 131, 41, 20, 42, 119, 166, 162, 96, 64, 32, 246, 232, 54, 149, 26, 193, 1, 35, + 230, 31, 208, 241, 0, 7, 189, 209, 185, 143, 252, 45, 19, 178, 20, 171, 217, 6, 192, 81, 13, + 109, 238, 82, 253, 140, 30, 146, 33, 111, 83, 231, 244, 187, 27, 47, 131, 172, 144, 15, 141, + 191, 131, 19, 176, 33, 244, 121, 44, 212, 124, 44, 54, 223, 156, 114, 190, 75, 206, 207, + 253, 53, 66, 13, 92, 59, 18, 178, 236, 67, 219, 137, 89, 81, 199, 189, 55, 100, 78, 76, 219, + 61, 34, 211, 14, 203, 32, 60, 38, 68, 97, 211, 81, 10, 191, 57, 237, 34, 202, 9, 135, 45, + 171, 51, 50, 139, 221, 46, 13, 195, 206, 71, 229, 74, 41, 194, 121, 125, 59, 210, 107, 156, + 106, 188, 113, 35, 140, 10, 17, 136, 203, 64, 55, 108, 169, 9, 109, 124, 222, 171, 44, 239, + 179, 18, 142, 87, 198, 169, 48, 114, 73, 143, 159, 58, 180, 48, 39, 124, 250, 72, 57, 15, + 199, 81, 96, 191, 202, 206, 97, 229, 41, 61, 142, 202, 44, 242, 115, 240, 102, 211, 87, 164, + 11, 120, 159, 210, 101, 36, 152, 163, 115, 159, 224, 101, 106, 196, 108, 118, 8, 6, 4, 48, + 145, 161, 62, 199, 129, 0, 33, 34, 187, 0, 60, 225, 18, 196, 216, 212, 118, 216, 80, 120, + 234, 99, 104, 181, 124, 79, 54, 167, 110, 62, 93, 58, 25, 202, 206, 167, 8, 168, 231, 98, + 77, 246, 50, 146, 149, 138, 130, 167, 145, 196, 230, 48, 130, 58, 52, 203, 227, 28, 165, 23, + 225, 156, 122, 34, 206, 253, 16, 140, 72, 133, 115, 79, 29, 240, 89, 204, 64, 55, 147, 72, + 46, 6, 141, 157, 37, 8, 2, 236, 69, 143, 135, 190, 56, 229, 8, 174, 173, 135, 206, 141, 40, + 2, 169, 118, 137, 18, 218, 88, 11, 248, 142, 100, 74, 6, 215, 9, 141, 177, 40, 220, 28, 128, + 56, 212, 56, 124, 39, 252, 221, 17, 244, 38, 14, 109, 132, 230, 204, 168, 241, 245, 112, 49, + 200, 253, 11, 66, 35, 124, 192, 129, 131, 40, 38, 55, 222, 197, 212, 201, 128, 62, 20, 91, + 64, 72, 229, 99, 56, 120, 142, 36, 91, 69, 174, 4, 167, 60, 43, 201, 43, 243, 252, 129, 93, + 78, 18, 34, 3, 137, 165, 225, 43, 186, 242, 155, 183, 196, 33, 146, 17, 123, 44, 180, 69, + 161, 15, 112, 119, 42, 106, 242, 4, 58, 23, 188, 23, 137, 41, 60, 247, 133, 125, 159, 138, + 62, 222, 57, 198, 120, 169, 65, 46, 242, 67, 152, 144, 74, 198, 27, 30, 78, 177, 76, 175, + 139, 142, 225, 78, 96, 97, 82, 133, 77, 129, 30, 211, 66, 195, 29, 144, 107, 70, 116, 199, + 212, 135, 173, 99, 150, 251, 212, 151, 218, 185, 238, 218, 78, 112, 105, 22, 110, 253, 177, + 43, 194, 161, 79, 212, 92, 223, 149, 44, 99, 71, 155, 204, 67, 218, 188, 41, 46, 61, 142, + 33, 214, 143, 143, 49, 27, 136, 202, 216, 217, 138, 109, 117, 83, 219, 198, 156, 42, 89, 16, + 212, 162, 3, 193, 121, 228, 204, 38, 36, 225, 25, 244, 130, 42, 180, 115, 162, 137, 65, 100, + 155, 245, 233, 29, 169, 201, 244, 200, 33, 183, 32, 195, 185, 237, 64, 114, 109, 165, 245, + 110, 58, 26, 242, 149, 204, 87, 124, 60, 58, 148, 200, 249, 62, 171, 243, 156, 177, 100, + 135, 113, 225, 63, 87, 147, 122, 68, 57, 133, 253, 103, 192, 59, 51, 235, 241, 119, 34, 128, + 184, 16, 185, 22, 213, 89, 198, 182, 146, 135, 152, 36, 58, 102, 25, 113, 218, 227, 170, 72, + 227, 195, 41, 55, 8, 232, 28, 65, 189, 0, 2, 157, 33, 1, 99, 161, 234, 103, 211, 74, 53, 30, + 164, 60, 168, 157, 74, 43, 226, 66, 189, 120, 44, 71, 131, 58, 62, 54, 158, 12, 131, 240, + 89, 188, 212, 79, 196, 203, 159, 75, 145, 27, 74, 240, 201, 209, 34, 14, 105, 60, 187, 225, + 78, 226, 27, 31, 40, 97, 79, 144, 249, 36, 81, 16, 183, 84, 187, 15, 141, 126, 39, 199, 170, + 37, 118, 39, 237, 250, 244, 144, 90, 215, 244, 125, 67, 93, 107, 194, 232, 198, 74, 232, 83, + 195, 226, 105, 218, 25, 171, 65, 123, 203, 191, 195, 233, 237, 200, 228, 43, 175, 68, 236, + 224, 112, 20, 18, 155, 211, 242, 125, 233, 139, 248, 31, 190, 4, 206, 35, 27, 117, 43, 154, + 72, 4, 176, 251, 114, 144, 82, 8, 166, 81, 18, 213, 216, 65, 248, 68, 183, 57, 155, 215, 8, + 10, 196, 31, 244, 48, 61, 122, 55, 186, 79, 229, 60, 199, 81, 230, 228, 39, 110, 242, 54, + 146, 177, 145, 234, 227, 71, 2, 77, 230, 214, 123, 238, 189, 126, 37, 241, 141, 195, 153, + 213, 114, 236, 27, 75, 60, 26, 106, 19, 52, 138, 84, 63, 54, 202, 69, 214, 188, 28, 95, 51, + 173, 228, 134, 139, 248, 92, 20, 113, 251, 196, 34, 254, 150, 120, 32, 87, 47, 165, 171, + 157, 159, 247, 236, 216, 141, 169, 57, 98, 170, 217, 212, 174, 237, 168, 91, 211, 247, 184, + 31, 216, 7, 219, 129, 53, 233, 66, 86, 161, 54, 250, 59, 215, 9, 25, 141, 165, 134, 192, + 137, 199, 34, 51, 14, 102, 71, 69, 222, 153, 20, 149, 84, 77, 152, 120, 86, 114, 144, 165, + 234, 157, 142, 87, 252, 60, 103, 86, 72, 133, 67, 73, 61, 168, 93, 24, 120, 2, 54, 81, 184, + 205, 255, 17, 110, 238, 101, 29, 218, 141, 191, 31, 24, 72, 187, 140, 92, 195, 231, 82, 34, + 224, 246, 78, 164, 79, 134, 202, 121, 14, 16, 199, 148, 26, 228, 94, 151, 125, 101, 70, 141, + 32, 238, 10, 31, 56, 132, 162, 243, 124, 89, 205, 98, 173, 238, 116, 221, 116, 39, 161, 182, + 139, 12, 110, 152, 48, 184, 158, 182, 99, 82, 145, 105, 25, 228, 153, 126, 253, 139, 214, + 61, 19, 44, 51, 171, 133, 239, 126, 131, 87, 195, 10, 218, 199, 202, 104, 84, 102, 26, 201, + 166, 238, 122, 77, 145, 4, 21, 109, 166, 34, 180, 165, 134, 199, 197, 57, 29, 25, 134, 36, + 137, 70, 236, 202, 166, 43, 232, 241, 98, 252, 25, 181, 175, 241, 252, 194, 169, 125, 189, + 52, 234, 170, 190, 173, 141, 29, 19, 231, 71, 90, 170, 130, 149, 64, 6, 115, 50, 77, 118, + 106, 65, 254, 198, 244, 35, 31, 136, 18, 82, 69, 139, 225, 235, 107, 108, 30, 12, 5, 89, 78, + 112, 17, 45, 7, 2, 28, 103, 24, 77, 8, 107, 42, 53, 152, 186, 115, 121, 171, 184, 193, 196, + 221, 211, 180, 68, 32, 39, 16, 5, 103, 47, 200, 108, 122, 133, 118, 219, 199, 85, 77, 94, + 52, 92, 51, 32, 49, 86, 13, 88, 188, 64, 79, 59, 91, 187, 78, 63, 54, 120, 174, 238, 27, + 145, 165, 118, 18, 187, 30, 213, 38, 158, 29, 1, 53, 175, 162, 41, 255, 168, 148, 194, 173, + 171, 220, 174, 96, 201, 117, 153, 178, 216, 71, 78, 231, 116, 33, 145, 80, 248, 199, 211, + 36, 130, 14, 156, 186, 18, 190, 133, 151, 224, 87, 34, 71, 215, 145, 94, 15, 28, 198, 222, + 135, 175, 51, 89, 24, 55, 94, 202, 29, 122, 93, 180, 181, 41, 67, 232, 80, 65, 70, 45, 238, + 134, 25, 45, 56, 25, 203, 153, 156, 1, 31, 110, 229, 43, 98, 58, 233, 230, 195, 45, 231, 5, + 25, 111, 55, 64, 79, 122, 116, 184, 91, 217, 148, 64, 141, 142, 219, 18, 181, 36, 234, 157, + 50, 232, 169, 88, 103, 0, 242, 48, 19, 181, 110, 1, 32, 43, 221, 12, 181, 210, 106, 118, + 200, 233, 158, 8, 152, 23, 224, 37, 80, 148, 56, 55, 244, 255, 159, 136, 52, 165, 17, 241, + 3, 39, 11, 114, 15, 62, 23, 27, 43, 36, 149, 0, 186, 35, 156, 100, 90, 121, 135, 68, 81, + 130, 106, 191, 0, 170, 71, 226, 188, 251, 192, 48, 67, 178, 89, 41, 250, 141, 80, 116, 52, + 14, 37, 226, 68, 61, 16, 206, 77, 24, 29, 94, 126, 89, 70, 122, 114, 157, 113, 38, 73, 7, + 36, 255, 206, 248, 0, 230, 158, 118, 51, 20, 41, 194, 221, 101, 154, 145, 110, 137, 109, 4, + 91, 153, 103, 211, 96, 195, 59, 72, 141, 149, 77, 41, 96, 40, 102, 182, 169, 157, 242, 5, + 169, 135, 122, 8, 81, 253, 6, 254, 140, 67, 91, 165, 115, 109, 173, 135, 20, 126, 101, 76, + 221, 104, 39, 51, 226, 245, 197, 171, 98, 245, 122, 179, 250, 87, 128, 1, 0, 132, 191, 35, + 141, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 56, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, + 32, 56, 50, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, + 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 51, 32, 48, 32, 82, 47, + 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, + 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, + 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, + 47, 84, 84, 52, 32, 49, 57, 50, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, + 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, + 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 51, 55, 47, 84, + 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 56, 50, + 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 57, 53, 56, 62, + 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 221, 110, 29, 55, 14, 190, 63, + 79, 49, 151, 103, 130, 142, 50, 250, 29, 205, 162, 40, 208, 252, 237, 166, 104, 218, 108, + 114, 186, 93, 32, 89, 96, 227, 56, 78, 210, 117, 108, 175, 147, 52, 205, 219, 47, 73, 137, + 146, 102, 70, 51, 199, 46, 22, 129, 29, 15, 41, 82, 20, 191, 143, 20, 117, 247, 233, 171, + 235, 79, 205, 183, 223, 222, 125, 114, 255, 241, 131, 166, 111, 190, 251, 238, 222, 131, + 251, 205, 238, 222, 97, 215, 55, 248, 239, 250, 237, 238, 238, 225, 208, 55, 82, 53, 135, + 179, 93, 47, 198, 113, 244, 164, 144, 141, 26, 141, 24, 93, 51, 40, 37, 76, 115, 248, 176, + 123, 177, 215, 173, 219, 219, 246, 95, 135, 31, 208, 70, 54, 82, 139, 145, 204, 164, 18, + 202, 40, 48, 58, 156, 238, 246, 77, 123, 248, 109, 215, 201, 81, 137, 94, 251, 166, 147, 78, + 104, 149, 21, 193, 48, 88, 121, 7, 75, 134, 166, 115, 182, 23, 206, 204, 215, 176, 243, 46, + 173, 91, 186, 226, 184, 157, 18, 126, 212, 141, 179, 82, 56, 92, 240, 98, 255, 125, 107, + 247, 23, 109, 167, 195, 175, 55, 173, 218, 255, 209, 118, 114, 255, 25, 191, 174, 219, 206, + 146, 168, 129, 69, 159, 224, 76, 151, 109, 23, 62, 158, 182, 157, 223, 191, 106, 59, 23, + 214, 160, 14, 197, 247, 240, 23, 45, 58, 107, 59, 147, 204, 222, 177, 107, 90, 67, 174, 79, + 241, 215, 91, 116, 128, 114, 182, 127, 222, 118, 195, 254, 138, 87, 227, 207, 107, 116, 70, + 246, 13, 132, 101, 246, 10, 86, 246, 240, 163, 224, 75, 67, 158, 149, 221, 119, 233, 211, + 180, 3, 44, 195, 180, 43, 45, 148, 55, 77, 167, 56, 97, 225, 160, 31, 208, 63, 186, 189, 72, + 49, 76, 69, 24, 200, 71, 60, 63, 70, 147, 142, 127, 14, 31, 116, 88, 84, 191, 231, 132, 81, + 244, 139, 204, 60, 0, 235, 158, 22, 37, 115, 58, 3, 31, 241, 128, 82, 114, 70, 121, 70, 253, + 71, 12, 33, 196, 253, 240, 176, 251, 47, 176, 68, 9, 233, 26, 103, 0, 78, 223, 12, 66, 53, + 210, 0, 179, 174, 223, 236, 126, 189, 211, 92, 32, 37, 215, 152, 152, 44, 71, 48, 2, 38, + 194, 161, 1, 127, 112, 250, 119, 114, 59, 10, 157, 220, 90, 49, 184, 91, 248, 141, 166, 209, + 239, 139, 189, 160, 227, 196, 144, 201, 187, 182, 2, 44, 163, 119, 41, 173, 48, 230, 230, + 254, 217, 56, 249, 39, 130, 61, 131, 228, 252, 140, 68, 250, 71, 219, 141, 251, 199, 176, + 101, 200, 46, 254, 245, 19, 102, 239, 175, 129, 24, 49, 171, 136, 240, 63, 113, 37, 74, 208, + 246, 33, 240, 225, 71, 248, 255, 49, 177, 3, 191, 30, 149, 33, 43, 40, 39, 155, 18, 162, + 144, 41, 55, 13, 56, 153, 114, 162, 155, 34, 209, 202, 2, 251, 82, 38, 212, 32, 156, 191, + 133, 227, 96, 155, 18, 241, 11, 146, 131, 14, 27, 206, 142, 167, 120, 22, 75, 137, 196, 40, + 248, 149, 106, 35, 21, 38, 175, 161, 114, 162, 4, 210, 74, 204, 207, 143, 209, 244, 80, 38, + 66, 251, 94, 120, 159, 152, 225, 196, 205, 19, 145, 76, 83, 192, 85, 20, 8, 40, 132, 237, 9, + 50, 255, 97, 222, 60, 184, 86, 53, 215, 70, 3, 245, 125, 37, 199, 82, 98, 132, 206, 245, + 194, 192, 218, 244, 11, 162, 61, 59, 170, 195, 88, 131, 82, 15, 82, 88, 85, 168, 141, 247, + 171, 166, 91, 186, 184, 165, 246, 72, 32, 18, 43, 41, 188, 153, 24, 214, 149, 185, 212, 161, + 95, 65, 57, 42, 104, 207, 186, 90, 237, 114, 171, 218, 21, 29, 43, 38, 31, 112, 22, 200, 1, + 73, 5, 218, 201, 193, 108, 254, 119, 160, 246, 108, 160, 15, 81, 255, 34, 217, 5, 127, 127, + 193, 170, 138, 194, 79, 177, 111, 73, 236, 91, 3, 75, 175, 91, 31, 150, 190, 69, 196, 223, + 195, 215, 135, 208, 213, 178, 183, 51, 240, 118, 217, 58, 90, 26, 69, 143, 49, 64, 220, 229, + 20, 126, 208, 232, 119, 20, 224, 31, 40, 248, 12, 63, 180, 209, 121, 182, 128, 111, 37, 147, + 9, 10, 71, 179, 255, 27, 144, 235, 151, 86, 78, 139, 90, 123, 131, 89, 142, 25, 149, 189, + 92, 233, 115, 213, 140, 38, 227, 156, 209, 111, 218, 145, 131, 192, 0, 49, 4, 74, 5, 116, + 119, 41, 233, 96, 33, 230, 78, 90, 104, 244, 42, 28, 157, 131, 4, 163, 19, 248, 243, 107, + 145, 49, 50, 46, 50, 62, 171, 132, 58, 208, 214, 19, 208, 82, 138, 62, 78, 24, 143, 48, 65, + 28, 16, 101, 11, 255, 72, 1, 96, 237, 17, 23, 94, 211, 237, 26, 97, 156, 95, 159, 248, 23, + 159, 47, 28, 239, 35, 23, 238, 69, 68, 237, 75, 182, 189, 106, 77, 113, 234, 171, 184, 128, + 44, 138, 67, 219, 176, 221, 37, 109, 128, 159, 39, 249, 172, 118, 113, 122, 75, 86, 248, + 161, 136, 40, 1, 103, 100, 0, 130, 31, 3, 183, 155, 52, 35, 182, 55, 45, 237, 134, 201, 236, + 52, 116, 49, 104, 99, 93, 40, 180, 120, 247, 115, 89, 168, 80, 22, 218, 228, 223, 86, 47, + 36, 92, 23, 8, 106, 145, 22, 84, 31, 97, 60, 172, 248, 18, 206, 239, 34, 41, 206, 137, 214, + 248, 87, 80, 39, 106, 147, 211, 203, 16, 143, 53, 57, 79, 8, 25, 138, 231, 126, 39, 185, 99, + 33, 167, 143, 179, 39, 211, 174, 8, 20, 35, 127, 163, 184, 67, 161, 34, 108, 177, 84, 65, + 70, 137, 251, 25, 106, 236, 105, 28, 193, 32, 208, 151, 251, 24, 224, 20, 204, 64, 141, 128, + 129, 198, 233, 2, 7, 81, 155, 32, 72, 139, 19, 89, 17, 216, 112, 86, 184, 214, 58, 162, 24, + 19, 43, 58, 244, 97, 49, 153, 166, 54, 65, 186, 151, 45, 86, 83, 36, 47, 204, 148, 173, 166, + 40, 31, 7, 46, 216, 188, 9, 103, 62, 150, 195, 15, 248, 139, 206, 194, 180, 177, 137, 54, + 49, 230, 42, 109, 244, 146, 54, 210, 204, 37, 156, 175, 139, 86, 229, 154, 215, 185, 111, + 108, 117, 59, 21, 56, 17, 171, 81, 151, 205, 13, 60, 102, 241, 2, 16, 189, 1, 136, 159, 51, + 167, 200, 61, 202, 67, 246, 195, 4, 29, 144, 191, 105, 242, 85, 17, 210, 44, 249, 40, 42, + 250, 189, 114, 243, 204, 135, 37, 220, 96, 34, 69, 137, 53, 88, 184, 83, 214, 124, 225, 221, + 207, 233, 7, 25, 198, 217, 124, 27, 107, 50, 53, 213, 203, 124, 227, 21, 61, 167, 118, 121, + 77, 122, 244, 24, 48, 96, 128, 38, 92, 158, 118, 236, 178, 19, 172, 222, 147, 199, 110, 196, + 49, 164, 189, 68, 2, 101, 204, 252, 79, 243, 43, 247, 214, 167, 234, 18, 165, 251, 148, 202, + 7, 144, 202, 202, 33, 9, 160, 249, 157, 164, 162, 16, 55, 14, 25, 143, 153, 58, 114, 184, + 88, 80, 184, 140, 56, 59, 105, 37, 229, 38, 211, 91, 35, 40, 175, 210, 230, 215, 101, 103, + 188, 72, 59, 39, 246, 198, 226, 193, 184, 74, 22, 164, 235, 153, 239, 225, 69, 7, 29, 150, + 56, 111, 230, 32, 103, 208, 133, 4, 166, 194, 162, 56, 248, 182, 123, 169, 148, 70, 225, + 244, 118, 60, 139, 116, 73, 55, 216, 124, 128, 177, 33, 242, 87, 225, 26, 231, 211, 164, + 235, 151, 125, 132, 62, 115, 18, 251, 196, 71, 206, 122, 98, 30, 73, 38, 86, 76, 93, 91, + 137, 104, 102, 130, 158, 56, 203, 112, 12, 195, 212, 50, 101, 251, 12, 193, 206, 211, 63, + 43, 193, 25, 127, 143, 48, 177, 50, 17, 6, 178, 156, 199, 158, 120, 243, 225, 178, 86, 74, + 201, 140, 98, 197, 141, 254, 147, 130, 154, 151, 116, 110, 113, 41, 144, 226, 28, 101, 130, + 10, 253, 69, 186, 215, 203, 193, 142, 23, 190, 166, 155, 169, 220, 109, 150, 205, 44, 59, + 203, 9, 3, 147, 34, 29, 213, 248, 48, 145, 135, 59, 229, 85, 74, 155, 164, 24, 120, 244, + 200, 237, 210, 179, 156, 11, 226, 34, 159, 140, 41, 247, 185, 108, 42, 122, 214, 116, 244, + 172, 233, 232, 237, 86, 170, 171, 173, 212, 79, 76, 223, 205, 252, 45, 155, 232, 145, 97, + 133, 251, 12, 174, 139, 141, 198, 85, 119, 153, 247, 153, 148, 191, 217, 213, 131, 244, 221, + 230, 119, 113, 135, 47, 90, 11, 151, 204, 106, 111, 145, 149, 131, 107, 83, 237, 38, 184, + 54, 247, 19, 36, 217, 117, 100, 224, 89, 26, 69, 139, 160, 23, 67, 14, 10, 55, 218, 10, 215, + 105, 217, 88, 208, 240, 120, 107, 97, 203, 114, 198, 163, 84, 134, 30, 227, 111, 209, 97, + 84, 26, 218, 242, 196, 81, 20, 27, 138, 120, 56, 92, 12, 164, 146, 111, 37, 95, 204, 117, + 219, 93, 194, 134, 47, 74, 72, 172, 148, 217, 147, 132, 254, 200, 92, 70, 119, 161, 132, + 211, 117, 63, 121, 221, 112, 142, 146, 41, 185, 14, 22, 239, 162, 252, 107, 242, 70, 74, + 116, 41, 90, 206, 91, 199, 99, 78, 117, 208, 52, 237, 144, 135, 203, 226, 183, 45, 190, 245, + 254, 121, 219, 133, 87, 210, 9, 67, 151, 203, 242, 162, 76, 104, 122, 108, 4, 235, 148, 43, + 20, 189, 231, 143, 204, 135, 201, 132, 99, 38, 232, 6, 62, 214, 94, 124, 53, 246, 111, 145, + 95, 230, 162, 87, 229, 251, 242, 88, 187, 47, 218, 91, 242, 57, 117, 199, 222, 108, 136, + 241, 156, 19, 16, 178, 4, 175, 140, 213, 57, 115, 113, 225, 205, 218, 28, 19, 45, 247, 227, + 204, 244, 244, 222, 72, 95, 43, 243, 228, 95, 218, 206, 196, 16, 6, 97, 140, 4, 10, 40, 97, + 93, 136, 224, 64, 51, 184, 43, 54, 14, 176, 217, 48, 87, 231, 155, 101, 62, 216, 88, 156, + 255, 209, 231, 221, 195, 65, 55, 82, 138, 30, 206, 116, 182, 115, 163, 240, 214, 52, 61, + 122, 223, 255, 187, 61, 252, 134, 122, 217, 72, 133, 74, 28, 225, 131, 196, 68, 201, 40, + 180, 83, 113, 117, 51, 91, 45, 165, 23, 214, 71, 95, 47, 246, 207, 248, 206, 253, 84, 92, + 171, 54, 188, 66, 174, 166, 248, 135, 81, 140, 4, 137, 150, 176, 117, 140, 150, 247, 30, + 148, 24, 180, 45, 55, 127, 120, 216, 73, 215, 139, 222, 55, 122, 84, 2, 118, 22, 198, 135, + 95, 215, 111, 118, 103, 71, 117, 144, 211, 160, 147, 222, 8, 173, 10, 173, 54, 70, 248, 21, + 75, 109, 44, 36, 129, 45, 251, 81, 148, 134, 198, 154, 236, 118, 102, 184, 165, 227, 80, + 157, 103, 157, 50, 211, 80, 150, 26, 246, 183, 212, 220, 59, 148, 184, 244, 98, 28, 71, 216, + 12, 254, 129, 200, 225, 160, 170, 173, 3, 155, 195, 7, 128, 9, 31, 143, 169, 185, 134, 11, + 221, 194, 59, 22, 219, 7, 118, 224, 30, 36, 125, 229, 171, 159, 163, 3, 68, 114, 210, 172, + 81, 195, 14, 98, 180, 138, 169, 241, 83, 203, 227, 199, 204, 137, 212, 66, 245, 122, 5, 98, + 7, 62, 212, 26, 142, 65, 185, 10, 100, 213, 150, 145, 140, 182, 43, 80, 174, 110, 139, 49, + 129, 123, 233, 98, 242, 181, 24, 220, 116, 215, 186, 150, 29, 215, 181, 199, 177, 211, 10, + 237, 8, 188, 71, 124, 111, 164, 106, 223, 70, 47, 32, 231, 246, 50, 226, 28, 65, 71, 49, + 126, 58, 16, 127, 3, 95, 253, 205, 97, 151, 106, 20, 210, 184, 53, 220, 123, 37, 122, 238, + 23, 118, 214, 75, 176, 189, 202, 21, 172, 141, 22, 206, 175, 97, 29, 148, 171, 88, 87, 109, + 25, 235, 104, 187, 130, 245, 234, 182, 24, 147, 28, 19, 17, 42, 88, 215, 181, 236, 184, 174, + 61, 142, 117, 79, 228, 219, 192, 218, 253, 89, 172, 199, 255, 55, 214, 163, 23, 35, 23, 184, + 36, 39, 11, 115, 161, 140, 90, 1, 28, 18, 100, 86, 155, 116, 80, 174, 2, 94, 181, 101, 192, + 163, 237, 10, 224, 171, 219, 66, 76, 106, 180, 73, 57, 235, 198, 53, 85, 116, 89, 83, 29, + 197, 89, 121, 141, 70, 27, 56, 143, 127, 22, 103, 20, 171, 202, 242, 233, 215, 2, 172, 5, + 188, 74, 121, 24, 25, 92, 137, 176, 189, 13, 194, 106, 52, 98, 116, 43, 8, 71, 229, 26, 194, + 117, 219, 136, 48, 219, 214, 17, 94, 223, 22, 99, 26, 164, 88, 173, 232, 186, 146, 221, 86, + 149, 199, 113, 182, 24, 228, 6, 204, 146, 16, 81, 11, 124, 202, 74, 117, 113, 85, 211, 194, + 175, 201, 181, 29, 228, 118, 177, 126, 250, 181, 44, 76, 35, 161, 174, 253, 74, 93, 123, 39, + 252, 56, 48, 238, 234, 182, 149, 173, 134, 94, 12, 107, 215, 118, 84, 174, 226, 94, 181, + 101, 220, 163, 237, 10, 238, 171, 219, 98, 76, 198, 37, 82, 84, 128, 175, 107, 217, 113, 93, + 123, 28, 122, 77, 68, 36, 236, 191, 231, 215, 6, 2, 247, 59, 206, 237, 105, 60, 14, 117, + 117, 235, 214, 236, 149, 208, 122, 245, 22, 134, 132, 13, 125, 106, 206, 58, 186, 81, 241, + 145, 81, 96, 5, 103, 51, 107, 215, 110, 84, 174, 98, 85, 181, 101, 172, 162, 237, 10, 86, + 171, 219, 98, 76, 240, 248, 97, 57, 247, 211, 172, 90, 55, 90, 59, 133, 218, 160, 91, 101, + 171, 172, 90, 59, 154, 90, 231, 96, 197, 95, 86, 173, 60, 15, 42, 154, 45, 110, 41, 26, 6, + 149, 164, 213, 64, 174, 0, 126, 15, 111, 70, 45, 96, 224, 62, 60, 96, 186, 9, 164, 153, 165, + 70, 209, 89, 115, 228, 247, 51, 126, 142, 209, 91, 21, 71, 245, 244, 70, 77, 15, 180, 176, + 18, 117, 252, 134, 197, 191, 137, 205, 239, 233, 29, 139, 34, 124, 226, 22, 175, 84, 180, + 248, 2, 94, 194, 248, 79, 110, 222, 181, 188, 105, 106, 101, 243, 183, 109, 222, 167, 147, + 225, 169, 56, 127, 220, 226, 10, 220, 234, 170, 116, 166, 184, 49, 46, 95, 189, 202, 106, + 209, 75, 30, 62, 231, 207, 222, 23, 209, 135, 61, 210, 134, 251, 86, 202, 184, 244, 148, 66, + 187, 76, 233, 189, 136, 197, 93, 100, 234, 138, 83, 241, 21, 66, 27, 98, 88, 157, 146, 3, + 140, 193, 186, 1, 115, 225, 77, 40, 80, 90, 133, 30, 96, 37, 46, 132, 229, 166, 72, 202, 31, + 133, 148, 115, 204, 121, 72, 43, 121, 0, 32, 9, 94, 51, 180, 226, 132, 99, 160, 53, 201, + 104, 12, 78, 24, 71, 146, 95, 19, 134, 209, 193, 73, 62, 142, 74, 144, 161, 34, 108, 115, + 78, 4, 193, 12, 68, 113, 58, 193, 68, 26, 240, 35, 239, 95, 98, 94, 38, 209, 189, 101, 178, + 101, 104, 137, 181, 113, 221, 99, 252, 251, 83, 97, 136, 75, 137, 160, 33, 151, 61, 37, 209, + 5, 206, 99, 182, 249, 118, 189, 74, 224, 208, 106, 114, 124, 26, 206, 48, 76, 30, 190, 221, + 144, 9, 253, 26, 140, 134, 28, 27, 157, 40, 155, 23, 166, 239, 138, 244, 31, 207, 53, 172, + 56, 139, 201, 188, 14, 228, 62, 230, 103, 187, 4, 199, 106, 9, 42, 159, 44, 230, 21, 184, + 133, 117, 206, 34, 82, 17, 211, 184, 136, 76, 7, 211, 9, 136, 122, 27, 195, 176, 130, 142, + 17, 211, 172, 139, 35, 231, 20, 205, 20, 100, 203, 21, 160, 67, 180, 217, 126, 94, 96, 122, + 90, 96, 67, 233, 45, 86, 141, 228, 80, 48, 188, 179, 128, 255, 98, 67, 212, 69, 96, 244, 86, + 75, 210, 115, 166, 44, 90, 146, 78, 4, 85, 204, 208, 195, 29, 72, 105, 238, 83, 182, 228, + 94, 165, 73, 193, 192, 237, 221, 86, 143, 146, 102, 63, 28, 29, 246, 28, 22, 145, 210, 220, + 112, 156, 17, 253, 8, 253, 70, 201, 212, 111, 242, 253, 224, 98, 126, 165, 41, 255, 211, + 102, 38, 124, 158, 48, 43, 10, 157, 146, 175, 194, 76, 27, 171, 11, 215, 50, 201, 84, 98, + 35, 54, 112, 50, 14, 215, 4, 30, 255, 162, 77, 59, 225, 103, 0, 103, 153, 17, 9, 83, 183, + 31, 236, 74, 74, 96, 200, 113, 146, 135, 156, 184, 187, 109, 135, 149, 1, 42, 29, 116, 218, + 46, 53, 83, 53, 129, 253, 138, 7, 245, 247, 204, 241, 211, 28, 109, 174, 61, 108, 49, 197, + 5, 56, 41, 62, 21, 60, 5, 100, 226, 182, 139, 22, 201, 163, 152, 132, 97, 168, 113, 218, + 227, 189, 62, 159, 97, 64, 7, 195, 72, 84, 106, 200, 134, 157, 140, 29, 222, 111, 154, 154, + 102, 28, 210, 219, 212, 26, 26, 144, 75, 165, 171, 189, 148, 182, 85, 16, 77, 208, 173, 4, + 179, 178, 97, 84, 214, 188, 110, 168, 30, 62, 185, 223, 236, 254, 39, 192, 0, 209, 70, 216, + 4, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, + 56, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, + 56, 52, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, + 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, + 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 51, 32, 48, 32, 82, 47, 82, + 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, + 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, + 84, 50, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 57, 50, 32, 48, 32, 82, 47, + 84, 84, 52, 32, 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, + 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, + 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 51, 56, 47, 84, 121, + 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 56, 52, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 51, 51, 51, 62, 62, + 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 156, 87, 89, 143, 220, 54, 18, 126, 239, 95, + 161, 199, 150, 145, 86, 68, 82, 212, 1, 4, 1, 226, 35, 187, 9, 114, 57, 238, 192, 15, 246, + 2, 177, 61, 30, 207, 108, 198, 147, 201, 196, 19, 39, 255, 126, 235, 96, 21, 139, 146, 186, + 221, 179, 48, 166, 45, 137, 197, 98, 241, 171, 235, 171, 207, 127, 122, 117, 251, 161, 250, + 226, 139, 207, 191, 127, 244, 205, 227, 170, 173, 190, 252, 242, 225, 227, 71, 213, 230, + 225, 126, 211, 86, 248, 239, 246, 221, 230, 243, 253, 190, 173, 156, 175, 246, 231, 155, + 182, 153, 166, 105, 164, 5, 87, 249, 169, 107, 166, 190, 26, 188, 111, 186, 106, 255, 126, + 243, 98, 27, 234, 126, 219, 215, 255, 217, 127, 139, 123, 92, 229, 66, 51, 209, 54, 231, 27, + 223, 121, 216, 180, 63, 219, 108, 171, 122, 255, 223, 205, 206, 77, 190, 105, 195, 88, 237, + 92, 223, 4, 159, 23, 120, 35, 239, 26, 123, 16, 25, 170, 93, 31, 219, 166, 239, 230, 50, + 162, 124, 167, 114, 51, 85, 79, 246, 155, 63, 54, 46, 142, 141, 235, 171, 126, 28, 154, 208, + 87, 110, 116, 77, 63, 86, 174, 3, 139, 111, 223, 110, 158, 63, 168, 174, 241, 170, 230, 208, + 226, 134, 178, 121, 106, 155, 110, 228, 43, 158, 213, 221, 246, 109, 189, 243, 244, 112, 7, + 127, 111, 106, 191, 253, 80, 239, 226, 246, 178, 30, 183, 191, 215, 59, 23, 182, 215, 240, + 185, 130, 167, 110, 123, 14, 79, 183, 240, 228, 96, 165, 223, 190, 135, 39, 179, 240, 10, + 95, 233, 219, 37, 137, 92, 129, 130, 127, 234, 221, 144, 68, 110, 228, 36, 84, 247, 103, + 189, 155, 210, 9, 189, 209, 127, 7, 191, 145, 36, 249, 157, 12, 65, 145, 138, 188, 0, 8, 60, + 77, 247, 243, 149, 115, 77, 219, 45, 174, 24, 194, 212, 140, 157, 185, 226, 246, 87, 197, + 46, 116, 17, 65, 75, 216, 249, 102, 60, 29, 57, 217, 154, 213, 138, 75, 158, 146, 226, 17, + 2, 66, 157, 18, 238, 163, 151, 119, 26, 143, 56, 184, 110, 132, 191, 207, 0, 129, 118, 219, + 194, 19, 255, 161, 39, 62, 171, 167, 132, 12, 98, 71, 32, 242, 235, 27, 248, 29, 200, 127, + 183, 176, 128, 127, 10, 53, 97, 56, 243, 5, 185, 234, 74, 189, 132, 8, 127, 68, 177, 20, 9, + 232, 132, 5, 226, 71, 35, 106, 232, 40, 162, 209, 126, 241, 168, 61, 210, 71, 14, 46, 252, + 46, 17, 231, 201, 204, 180, 72, 70, 94, 72, 132, 164, 143, 168, 137, 141, 60, 227, 136, 192, + 143, 122, 183, 119, 18, 66, 20, 114, 244, 169, 169, 119, 170, 241, 27, 124, 38, 181, 233, + 131, 69, 12, 223, 111, 18, 88, 120, 10, 62, 227, 255, 180, 174, 233, 96, 109, 227, 32, 220, + 249, 65, 193, 27, 75, 232, 86, 47, 146, 245, 217, 229, 143, 101, 84, 183, 144, 233, 17, 131, + 118, 255, 248, 30, 9, 153, 174, 18, 15, 226, 26, 23, 160, 70, 146, 163, 23, 49, 217, 29, 7, + 20, 247, 232, 117, 233, 68, 52, 187, 33, 159, 176, 241, 187, 0, 197, 170, 133, 98, 229, 29, + 93, 225, 12, 174, 80, 129, 204, 87, 184, 139, 252, 49, 208, 69, 229, 52, 126, 178, 111, 207, + 80, 146, 19, 31, 77, 193, 235, 94, 72, 53, 193, 15, 239, 44, 134, 174, 155, 85, 12, 180, + 247, 58, 161, 164, 53, 233, 45, 110, 217, 193, 27, 33, 64, 154, 254, 230, 72, 92, 194, 149, + 234, 25, 46, 189, 38, 35, 126, 151, 125, 23, 53, 27, 200, 152, 35, 2, 146, 25, 81, 65, 59, + 128, 154, 235, 249, 84, 57, 104, 142, 189, 47, 181, 172, 43, 153, 165, 57, 162, 77, 96, 143, + 26, 47, 103, 169, 92, 180, 28, 156, 182, 200, 166, 220, 114, 140, 76, 89, 12, 178, 234, 243, + 21, 28, 177, 144, 88, 36, 87, 76, 209, 18, 242, 58, 229, 205, 95, 232, 232, 36, 155, 218, + 165, 41, 208, 174, 155, 154, 208, 78, 169, 95, 254, 58, 107, 139, 47, 146, 194, 200, 201, + 80, 84, 199, 118, 104, 58, 168, 142, 16, 91, 40, 11, 213, 101, 231, 124, 235, 204, 125, 209, + 43, 100, 201, 111, 217, 99, 106, 93, 70, 159, 123, 75, 119, 184, 179, 148, 6, 79, 177, 25, + 134, 79, 217, 235, 212, 8, 68, 88, 42, 137, 186, 52, 151, 106, 41, 232, 165, 135, 114, 224, + 81, 26, 121, 104, 48, 237, 56, 21, 174, 61, 236, 57, 216, 55, 119, 29, 70, 230, 60, 9, 238, + 235, 58, 78, 201, 21, 7, 58, 168, 242, 109, 56, 8, 136, 133, 2, 195, 103, 1, 70, 225, 20, + 180, 244, 255, 115, 11, 180, 236, 233, 83, 110, 241, 108, 75, 176, 110, 193, 252, 93, 113, + 140, 207, 142, 9, 247, 76, 157, 29, 121, 32, 247, 73, 40, 127, 96, 101, 235, 11, 255, 29, + 170, 77, 132, 199, 80, 186, 101, 184, 87, 70, 141, 1, 2, 116, 56, 134, 196, 160, 72, 12, + 130, 132, 208, 54, 235, 149, 97, 153, 42, 83, 225, 147, 225, 19, 62, 113, 109, 219, 184, + 153, 33, 62, 25, 178, 100, 192, 45, 196, 120, 226, 205, 47, 4, 250, 161, 140, 154, 53, 95, + 177, 149, 190, 48, 19, 190, 33, 61, 31, 84, 137, 77, 172, 209, 92, 124, 225, 192, 65, 106, + 159, 113, 159, 155, 128, 126, 71, 78, 191, 254, 4, 239, 249, 153, 251, 252, 253, 252, 7, + 116, 111, 26, 198, 147, 97, 243, 205, 224, 195, 12, 54, 63, 172, 71, 184, 203, 44, 104, 152, + 179, 160, 21, 163, 79, 99, 65, 131, 33, 54, 236, 9, 171, 115, 73, 222, 6, 158, 8, 36, 218, + 230, 114, 229, 33, 226, 130, 22, 130, 122, 53, 127, 208, 10, 124, 6, 76, 253, 72, 79, 194, + 141, 44, 55, 241, 147, 132, 75, 128, 20, 253, 55, 64, 243, 11, 128, 241, 53, 74, 152, 239, + 196, 75, 126, 132, 133, 159, 224, 93, 62, 190, 220, 38, 31, 151, 55, 73, 166, 7, 87, 222, + 222, 9, 253, 8, 78, 162, 163, 35, 182, 33, 24, 234, 102, 18, 254, 64, 237, 62, 217, 159, 98, + 226, 101, 93, 123, 107, 213, 195, 58, 144, 81, 223, 36, 215, 133, 149, 22, 166, 214, 127, + 139, 63, 201, 124, 68, 110, 255, 0, 176, 90, 161, 53, 163, 205, 95, 235, 158, 169, 91, 18, + 193, 225, 56, 17, 204, 137, 72, 126, 147, 65, 131, 19, 247, 48, 93, 3, 121, 37, 187, 119, + 52, 19, 24, 54, 15, 139, 175, 141, 85, 162, 59, 143, 145, 102, 133, 30, 137, 195, 105, 74, + 223, 148, 41, 93, 122, 104, 109, 193, 4, 27, 65, 54, 187, 201, 81, 218, 153, 224, 201, 186, + 117, 101, 226, 112, 150, 106, 66, 162, 92, 152, 48, 39, 211, 7, 19, 21, 220, 243, 233, 235, + 122, 123, 17, 204, 46, 117, 60, 187, 178, 155, 174, 75, 146, 154, 190, 146, 97, 55, 84, 182, + 113, 89, 103, 47, 169, 5, 40, 131, 41, 193, 74, 233, 110, 229, 144, 98, 149, 157, 14, 76, + 137, 229, 69, 61, 27, 142, 80, 95, 63, 149, 110, 166, 15, 166, 243, 210, 251, 162, 247, 226, + 199, 117, 120, 112, 133, 107, 139, 212, 60, 249, 250, 41, 30, 132, 50, 175, 32, 142, 15, + 149, 104, 152, 117, 255, 216, 116, 99, 95, 69, 160, 157, 161, 175, 124, 211, 85, 142, 230, + 218, 219, 183, 155, 231, 15, 170, 235, 205, 195, 189, 45, 203, 5, 85, 165, 125, 208, 223, + 186, 17, 121, 42, 151, 112, 80, 248, 52, 237, 49, 181, 191, 216, 230, 34, 48, 171, 190, 234, + 38, 58, 7, 119, 174, 118, 243, 73, 187, 249, 116, 144, 215, 136, 171, 65, 98, 15, 178, 23, + 117, 89, 236, 39, 77, 69, 220, 197, 201, 56, 42, 15, 179, 115, 160, 29, 60, 77, 201, 88, 43, + 35, 4, 112, 158, 175, 180, 102, 224, 246, 247, 212, 39, 88, 238, 64, 238, 56, 118, 165, 244, + 31, 218, 202, 27, 82, 47, 149, 80, 191, 51, 17, 0, 171, 29, 124, 242, 60, 136, 142, 154, + 104, 26, 139, 247, 32, 114, 134, 218, 36, 130, 234, 115, 11, 191, 43, 101, 3, 157, 51, 173, + 18, 249, 195, 231, 104, 2, 118, 219, 31, 116, 150, 204, 194, 69, 75, 153, 79, 186, 156, 172, + 121, 214, 93, 201, 75, 4, 232, 64, 201, 90, 208, 254, 220, 234, 209, 134, 181, 102, 159, 9, + 81, 43, 76, 232, 49, 0, 90, 182, 242, 40, 145, 32, 206, 177, 157, 60, 114, 144, 73, 147, + 175, 244, 202, 166, 90, 71, 11, 123, 212, 226, 192, 219, 231, 125, 204, 207, 79, 237, 236, + 13, 81, 7, 135, 49, 155, 30, 143, 54, 177, 166, 214, 249, 102, 23, 122, 160, 235, 64, 55, + 96, 180, 20, 186, 65, 205, 149, 252, 53, 234, 80, 176, 254, 27, 210, 243, 147, 122, 80, 138, + 72, 94, 208, 50, 152, 15, 181, 17, 23, 164, 87, 136, 50, 146, 80, 255, 105, 83, 62, 83, 129, + 43, 185, 14, 9, 21, 179, 90, 40, 120, 122, 40, 131, 57, 240, 216, 217, 234, 27, 103, 35, + 174, 114, 137, 84, 52, 37, 64, 22, 182, 205, 78, 212, 20, 46, 162, 44, 216, 166, 125, 37, + 34, 183, 210, 126, 132, 226, 104, 87, 86, 7, 8, 254, 134, 238, 37, 147, 114, 125, 240, 146, + 161, 165, 27, 211, 138, 177, 214, 219, 242, 165, 59, 244, 203, 186, 51, 252, 60, 195, 188, + 155, 123, 242, 200, 113, 150, 7, 226, 123, 62, 232, 70, 121, 14, 110, 33, 24, 104, 209, 42, + 59, 78, 56, 253, 33, 194, 105, 14, 158, 167, 42, 130, 136, 185, 58, 183, 99, 60, 98, 197, + 236, 74, 75, 26, 15, 31, 31, 233, 78, 197, 78, 35, 225, 42, 155, 251, 47, 132, 171, 108, + 170, 18, 209, 135, 209, 183, 227, 1, 188, 62, 211, 6, 177, 108, 21, 62, 220, 247, 12, 75, + 177, 125, 89, 12, 181, 83, 100, 86, 89, 194, 38, 70, 198, 238, 32, 175, 142, 166, 28, 191, + 174, 93, 75, 3, 0, 211, 97, 77, 131, 59, 73, 47, 185, 69, 76, 158, 231, 176, 67, 139, 200, + 74, 94, 225, 58, 153, 252, 17, 57, 20, 147, 42, 127, 68, 151, 164, 57, 85, 47, 250, 17, 157, + 67, 225, 225, 193, 238, 71, 221, 154, 39, 92, 20, 228, 88, 83, 54, 74, 5, 113, 22, 33, 5, + 255, 163, 193, 69, 74, 97, 166, 94, 59, 9, 241, 204, 17, 176, 112, 135, 52, 201, 168, 25, + 233, 35, 93, 232, 165, 247, 65, 243, 184, 168, 247, 139, 109, 32, 218, 233, 56, 149, 36, + 138, 150, 190, 22, 213, 46, 216, 113, 34, 71, 25, 71, 142, 235, 68, 230, 58, 245, 48, 197, + 233, 60, 49, 42, 190, 60, 6, 132, 54, 247, 144, 57, 151, 61, 230, 19, 244, 200, 89, 4, 243, + 216, 35, 220, 163, 72, 151, 201, 231, 206, 122, 89, 76, 94, 180, 106, 42, 215, 117, 254, + 102, 121, 55, 190, 31, 141, 119, 219, 121, 252, 180, 72, 152, 146, 196, 186, 169, 109, 198, + 128, 44, 22, 74, 247, 58, 103, 69, 29, 33, 245, 31, 215, 229, 172, 248, 77, 174, 97, 231, + 220, 124, 207, 204, 83, 242, 112, 178, 78, 169, 80, 150, 226, 206, 110, 102, 171, 33, 31, + 83, 159, 103, 67, 167, 162, 209, 100, 34, 212, 167, 121, 105, 78, 132, 186, 57, 77, 41, 232, + 148, 38, 190, 146, 158, 149, 88, 65, 181, 151, 137, 167, 229, 43, 94, 42, 255, 186, 94, 30, + 18, 15, 198, 101, 97, 209, 133, 234, 78, 238, 137, 169, 223, 104, 124, 225, 195, 58, 203, + 93, 122, 210, 71, 224, 121, 209, 29, 241, 100, 159, 198, 53, 102, 174, 113, 197, 147, 201, + 35, 73, 121, 72, 123, 187, 169, 241, 162, 87, 230, 33, 231, 122, 152, 170, 134, 214, 53, 67, + 95, 209, 180, 68, 63, 48, 96, 157, 127, 114, 109, 28, 101, 49, 12, 174, 137, 222, 44, 119, + 227, 120, 112, 235, 177, 53, 62, 50, 132, 180, 16, 250, 136, 66, 102, 219, 234, 18, 143, + 116, 237, 218, 24, 232, 188, 199, 121, 46, 120, 26, 230, 94, 108, 31, 54, 201, 179, 207, + 208, 169, 63, 214, 59, 236, 168, 35, 132, 109, 191, 253, 17, 139, 227, 19, 192, 209, 211, + 39, 90, 251, 1, 97, 165, 167, 239, 235, 93, 79, 98, 143, 18, 253, 125, 78, 174, 68, 198, + 249, 29, 68, 212, 215, 92, 237, 227, 246, 103, 170, 3, 248, 25, 133, 104, 23, 190, 124, 37, + 71, 254, 130, 63, 63, 195, 14, 252, 250, 76, 92, 212, 37, 219, 189, 243, 141, 111, 195, 170, + 147, 66, 136, 10, 242, 194, 17, 105, 241, 128, 35, 14, 111, 133, 53, 151, 183, 0, 74, 118, + 215, 202, 202, 31, 155, 132, 168, 159, 250, 166, 7, 179, 129, 54, 142, 149, 235, 26, 90, + 127, 254, 160, 186, 62, 193, 27, 126, 154, 208, 119, 217, 33, 142, 112, 128, 155, 62, 197, + 3, 194, 216, 192, 113, 114, 192, 212, 76, 254, 244, 3, 100, 175, 28, 160, 24, 146, 230, 56, + 26, 211, 163, 111, 238, 97, 185, 108, 205, 150, 255, 132, 73, 118, 203, 169, 204, 197, 123, + 224, 167, 15, 112, 163, 75, 42, 66, 187, 0, 236, 220, 92, 205, 59, 80, 170, 6, 120, 186, + 223, 137, 6, 232, 214, 213, 155, 121, 23, 154, 172, 23, 64, 56, 253, 102, 178, 53, 95, 76, + 236, 127, 207, 141, 9, 89, 79, 68, 198, 202, 137, 115, 131, 183, 122, 133, 111, 244, 73, + 133, 232, 182, 31, 184, 110, 187, 84, 28, 123, 6, 68, 51, 1, 181, 190, 97, 210, 38, 176, + 225, 26, 105, 163, 253, 103, 248, 163, 233, 249, 190, 118, 158, 23, 175, 168, 204, 241, 68, + 201, 41, 170, 199, 225, 217, 164, 142, 12, 187, 229, 162, 30, 217, 10, 92, 251, 211, 58, + 160, 3, 167, 107, 104, 13, 205, 233, 129, 37, 27, 87, 208, 231, 93, 110, 61, 106, 6, 140, + 94, 63, 6, 252, 143, 192, 85, 98, 6, 173, 160, 27, 50, 231, 158, 243, 89, 92, 179, 253, 14, + 223, 185, 55, 74, 167, 84, 110, 82, 16, 115, 221, 87, 206, 104, 87, 50, 1, 170, 170, 212, + 232, 255, 97, 160, 23, 116, 93, 198, 208, 53, 59, 180, 167, 189, 169, 189, 154, 147, 214, + 204, 56, 116, 150, 111, 73, 218, 50, 251, 66, 107, 184, 69, 166, 145, 9, 147, 214, 50, 130, + 210, 22, 197, 69, 136, 130, 246, 218, 76, 73, 100, 178, 24, 186, 162, 219, 250, 88, 16, 39, + 122, 103, 45, 50, 16, 222, 36, 170, 48, 167, 27, 36, 154, 110, 206, 157, 86, 149, 241, 245, + 100, 30, 184, 211, 203, 42, 181, 139, 247, 0, 24, 133, 51, 50, 115, 53, 22, 122, 111, 103, + 28, 60, 253, 98, 49, 117, 246, 102, 232, 188, 23, 124, 9, 186, 143, 18, 57, 202, 210, 47, + 107, 13, 87, 63, 172, 205, 164, 226, 115, 186, 195, 235, 122, 6, 127, 57, 178, 248, 147, + 134, 30, 164, 141, 29, 188, 34, 89, 125, 88, 135, 172, 199, 204, 99, 7, 109, 41, 7, 18, 165, + 166, 67, 30, 8, 116, 114, 227, 144, 201, 224, 97, 240, 33, 122, 234, 131, 179, 36, 61, 51, + 212, 178, 197, 115, 165, 171, 183, 137, 23, 24, 15, 229, 137, 32, 158, 28, 15, 145, 125, 32, + 51, 7, 103, 137, 208, 77, 51, 63, 196, 52, 135, 230, 84, 194, 45, 31, 103, 131, 67, 52, 230, + 154, 18, 16, 243, 236, 162, 70, 36, 149, 6, 188, 59, 54, 89, 15, 161, 237, 126, 176, 67, + 146, 222, 234, 50, 149, 48, 157, 192, 230, 179, 0, 126, 208, 232, 18, 125, 248, 125, 156, + 138, 177, 8, 229, 202, 67, 215, 238, 5, 235, 157, 13, 153, 180, 139, 141, 103, 224, 111, 41, + 53, 187, 92, 112, 146, 216, 107, 249, 70, 128, 219, 218, 128, 171, 171, 112, 209, 74, 158, + 34, 210, 135, 229, 32, 59, 157, 144, 246, 70, 155, 25, 230, 8, 204, 163, 201, 231, 214, 2, + 222, 173, 23, 251, 180, 146, 171, 138, 140, 44, 121, 238, 177, 88, 162, 44, 207, 183, 69, + 33, 75, 141, 232, 224, 193, 223, 203, 193, 25, 111, 244, 72, 42, 196, 40, 241, 44, 213, 5, + 95, 148, 125, 213, 90, 152, 102, 149, 38, 227, 100, 170, 66, 219, 88, 139, 1, 11, 233, 243, + 161, 10, 39, 179, 215, 162, 198, 197, 237, 99, 21, 255, 11, 163, 83, 123, 163, 116, 130, 85, + 143, 197, 69, 85, 241, 121, 186, 18, 186, 176, 11, 64, 133, 219, 161, 2, 59, 181, 141, 17, + 185, 245, 169, 209, 193, 184, 16, 58, 26, 4, 222, 41, 223, 185, 44, 8, 213, 7, 170, 80, 196, + 158, 122, 102, 64, 68, 150, 46, 80, 0, 169, 140, 114, 173, 207, 164, 6, 224, 32, 216, 166, + 129, 208, 23, 67, 159, 240, 145, 128, 99, 210, 88, 52, 87, 41, 132, 247, 106, 87, 73, 14, + 65, 214, 226, 77, 15, 8, 116, 198, 82, 210, 19, 92, 121, 158, 186, 77, 226, 42, 228, 190, + 220, 211, 230, 6, 16, 194, 239, 208, 77, 215, 41, 240, 179, 82, 27, 142, 40, 251, 136, 169, + 118, 159, 92, 205, 180, 72, 203, 122, 18, 162, 137, 140, 195, 186, 179, 45, 29, 243, 95, + 242, 122, 97, 141, 248, 85, 9, 73, 207, 144, 157, 100, 157, 214, 145, 104, 202, 170, 32, + 192, 53, 250, 170, 46, 113, 114, 196, 40, 112, 69, 210, 188, 27, 86, 14, 187, 41, 114, 247, + 162, 30, 100, 239, 51, 194, 245, 13, 52, 73, 197, 51, 251, 206, 100, 98, 142, 19, 44, 111, + 158, 249, 132, 203, 220, 200, 171, 225, 55, 106, 51, 74, 30, 36, 71, 110, 198, 77, 92, 66, + 214, 130, 72, 121, 74, 155, 254, 230, 192, 21, 235, 110, 76, 80, 133, 69, 160, 184, 244, + 153, 36, 232, 214, 255, 99, 188, 138, 113, 24, 6, 97, 224, 222, 87, 240, 2, 20, 99, 55, 37, + 115, 219, 177, 159, 232, 80, 169, 75, 213, 255, 79, 53, 80, 192, 16, 131, 178, 68, 34, 103, + 155, 19, 78, 184, 115, 77, 143, 60, 178, 198, 112, 204, 173, 185, 203, 20, 173, 46, 10, 129, + 205, 109, 138, 202, 87, 136, 89, 178, 11, 143, 239, 191, 102, 101, 162, 186, 128, 144, 41, + 76, 14, 138, 147, 169, 153, 217, 238, 74, 34, 221, 118, 187, 179, 235, 197, 233, 104, 111, + 182, 174, 55, 27, 77, 37, 118, 100, 30, 212, 66, 170, 234, 29, 254, 121, 91, 213, 14, 75, + 181, 94, 104, 98, 142, 139, 1, 201, 181, 6, 162, 79, 217, 147, 119, 225, 254, 17, 86, 152, + 167, 50, 128, 149, 199, 53, 4, 176, 11, 153, 197, 146, 79, 15, 30, 244, 94, 17, 243, 62, + 131, 120, 1, 123, 118, 2, 38, 239, 167, 169, 100, 120, 8, 92, 211, 75, 199, 81, 68, 29, 6, + 110, 152, 166, 67, 76, 38, 97, 3, 46, 250, 126, 5, 219, 23, 157, 64, 247, 199, 213, 156, + 126, 2, 12, 0, 166, 216, 230, 244, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, + 101, 110, 100, 111, 98, 106, 13, 56, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, + 110, 116, 101, 110, 116, 115, 32, 56, 54, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, + 51, 52, 51, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, + 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, + 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, + 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, + 115, 32, 51, 57, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, + 111, 98, 106, 13, 56, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, + 32, 50, 57, 52, 56, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 156, 87, 109, 111, + 28, 55, 14, 254, 190, 191, 98, 62, 238, 20, 153, 201, 72, 35, 205, 11, 80, 20, 72, 226, 220, + 33, 7, 180, 215, 107, 22, 56, 20, 65, 129, 115, 178, 177, 227, 198, 94, 59, 126, 169, 211, + 127, 127, 34, 69, 82, 212, 188, 216, 78, 16, 172, 179, 43, 137, 20, 69, 62, 36, 31, 62, 255, + 245, 248, 250, 182, 248, 241, 199, 231, 63, 191, 122, 115, 84, 52, 197, 79, 63, 189, 60, + 122, 85, 108, 94, 238, 54, 77, 1, 255, 174, 79, 55, 207, 119, 187, 166, 48, 182, 216, 157, + 108, 154, 122, 28, 199, 1, 55, 76, 97, 71, 87, 143, 93, 209, 91, 91, 187, 98, 119, 177, 121, + 183, 109, 203, 110, 219, 151, 127, 236, 254, 5, 50, 166, 48, 109, 61, 162, 152, 177, 181, + 117, 54, 8, 237, 246, 155, 109, 81, 238, 254, 220, 84, 102, 180, 117, 211, 14, 69, 101, 186, + 186, 181, 105, 35, 10, 70, 169, 161, 11, 71, 250, 162, 234, 124, 83, 119, 110, 122, 134, + 149, 87, 114, 110, 162, 234, 245, 110, 243, 101, 99, 252, 80, 155, 174, 232, 134, 190, 110, + 187, 162, 181, 67, 221, 12, 133, 113, 193, 226, 235, 143, 155, 255, 254, 80, 28, 224, 169, + 234, 210, 236, 133, 44, 60, 54, 181, 27, 226, 19, 47, 202, 202, 108, 143, 225, 207, 190, + 116, 219, 143, 101, 101, 195, 101, 85, 235, 221, 246, 125, 248, 253, 119, 89, 245, 252, 251, + 83, 56, 228, 183, 103, 229, 16, 101, 104, 245, 50, 124, 111, 183, 215, 97, 149, 22, 110, + 203, 202, 135, 179, 81, 151, 40, 123, 5, 138, 80, 251, 161, 164, 51, 32, 131, 23, 159, 135, + 63, 162, 239, 159, 101, 53, 6, 165, 221, 246, 175, 178, 26, 162, 4, 28, 4, 41, 188, 54, 215, + 161, 239, 140, 150, 136, 177, 14, 77, 189, 1, 117, 180, 246, 86, 228, 81, 247, 177, 122, + 197, 47, 225, 123, 20, 0, 47, 240, 75, 163, 89, 16, 254, 224, 250, 255, 60, 197, 177, 189, + 195, 192, 130, 99, 81, 253, 135, 210, 226, 7, 30, 116, 23, 52, 139, 225, 117, 89, 57, 210, + 173, 224, 88, 181, 33, 242, 33, 158, 149, 53, 245, 128, 0, 121, 183, 125, 89, 7, 217, 150, + 93, 100, 92, 235, 182, 191, 5, 141, 31, 195, 231, 188, 4, 43, 61, 126, 63, 137, 10, 125, 80, + 223, 129, 43, 208, 245, 30, 222, 111, 194, 205, 85, 187, 61, 45, 171, 14, 140, 234, 130, 63, + 209, 115, 62, 88, 86, 69, 211, 42, 146, 217, 94, 193, 73, 80, 135, 103, 240, 52, 232, 131, + 75, 254, 138, 17, 180, 81, 37, 136, 227, 149, 215, 240, 11, 101, 47, 34, 86, 124, 84, 130, + 178, 120, 20, 20, 192, 242, 158, 117, 227, 65, 220, 63, 148, 166, 11, 235, 214, 36, 87, 176, + 123, 91, 95, 247, 29, 164, 147, 23, 79, 188, 129, 168, 113, 216, 71, 142, 175, 105, 232, + 231, 85, 233, 16, 42, 240, 32, 248, 14, 255, 99, 248, 49, 228, 16, 215, 120, 78, 0, 122, 28, + 173, 19, 125, 39, 36, 68, 96, 14, 43, 40, 14, 113, 59, 133, 47, 120, 62, 109, 198, 184, 154, + 145, 188, 23, 47, 21, 192, 38, 229, 96, 102, 2, 51, 170, 124, 86, 142, 217, 157, 42, 133, + 70, 74, 58, 60, 44, 55, 50, 140, 213, 51, 207, 232, 169, 73, 142, 178, 160, 163, 159, 47, + 64, 184, 134, 139, 127, 15, 107, 248, 37, 122, 185, 9, 197, 43, 115, 172, 13, 251, 77, 248, + 152, 240, 233, 130, 84, 131, 79, 50, 88, 252, 192, 52, 50, 183, 237, 163, 207, 79, 162, 43, + 225, 39, 26, 120, 208, 133, 34, 44, 74, 33, 129, 47, 224, 61, 240, 20, 185, 2, 96, 12, 38, + 30, 146, 142, 15, 136, 100, 244, 88, 0, 130, 212, 23, 29, 53, 56, 54, 137, 14, 44, 225, 145, + 175, 112, 179, 184, 254, 128, 169, 187, 167, 236, 199, 75, 239, 200, 97, 82, 219, 122, 183, + 86, 245, 122, 71, 198, 129, 18, 114, 150, 120, 234, 40, 120, 234, 138, 94, 4, 250, 192, 110, + 129, 81, 2, 90, 208, 99, 219, 168, 135, 28, 101, 205, 67, 72, 130, 195, 185, 26, 18, 121, + 207, 150, 73, 201, 163, 141, 189, 20, 226, 27, 81, 6, 14, 60, 23, 239, 222, 195, 187, 197, + 129, 207, 48, 164, 36, 44, 17, 211, 191, 175, 80, 35, 60, 238, 156, 144, 5, 143, 99, 8, 91, + 47, 96, 99, 207, 160, 104, 114, 34, 71, 95, 155, 109, 201, 129, 187, 31, 86, 187, 140, 201, + 49, 107, 38, 205, 131, 214, 94, 136, 99, 146, 147, 49, 237, 241, 231, 25, 53, 135, 83, 242, + 92, 16, 248, 119, 105, 208, 245, 39, 132, 130, 15, 165, 77, 121, 73, 88, 14, 199, 238, 227, + 93, 240, 160, 100, 0, 234, 148, 112, 68, 175, 70, 188, 41, 16, 113, 69, 191, 64, 196, 70, + 76, 128, 154, 91, 113, 123, 246, 26, 107, 245, 34, 27, 172, 148, 24, 189, 31, 129, 51, 5, + 96, 23, 241, 183, 228, 31, 49, 235, 156, 191, 164, 246, 166, 27, 165, 113, 20, 231, 235, + 236, 28, 135, 22, 192, 121, 147, 156, 184, 80, 132, 226, 70, 76, 211, 19, 86, 44, 142, 213, + 187, 236, 55, 194, 34, 1, 104, 18, 38, 73, 137, 152, 72, 4, 44, 147, 234, 199, 98, 1, 25, + 168, 92, 18, 132, 77, 60, 112, 165, 196, 31, 130, 148, 93, 205, 234, 107, 5, 124, 229, 92, + 198, 208, 87, 113, 199, 94, 46, 78, 213, 200, 211, 187, 175, 74, 174, 207, 156, 137, 169, + 240, 71, 57, 175, 105, 149, 159, 197, 211, 127, 51, 255, 241, 4, 150, 104, 76, 100, 9, 126, + 234, 91, 71, 125, 217, 205, 98, 207, 118, 170, 232, 251, 165, 216, 215, 76, 131, 190, 108, + 220, 96, 235, 97, 40, 188, 119, 248, 95, 237, 45, 240, 207, 238, 73, 4, 84, 100, 145, 125, + 10, 173, 101, 110, 181, 72, 203, 77, 224, 227, 129, 91, 249, 192, 141, 194, 127, 200, 173, + 144, 19, 185, 140, 19, 189, 137, 213, 169, 141, 164, 230, 58, 66, 211, 42, 26, 2, 28, 230, + 32, 68, 136, 10, 47, 112, 147, 79, 176, 40, 2, 120, 22, 151, 46, 99, 78, 17, 113, 33, 1, + 166, 92, 200, 97, 206, 136, 110, 209, 30, 242, 161, 75, 185, 158, 86, 95, 17, 100, 221, 119, + 177, 44, 177, 146, 41, 29, 46, 220, 35, 42, 125, 50, 127, 47, 111, 64, 109, 247, 84, 223, + 91, 23, 221, 145, 188, 240, 41, 190, 69, 10, 243, 76, 19, 26, 136, 132, 145, 121, 219, 14, + 212, 30, 97, 15, 121, 155, 164, 167, 84, 173, 95, 167, 106, 62, 167, 226, 94, 83, 53, 72, + 229, 85, 178, 230, 243, 100, 246, 156, 195, 7, 174, 207, 239, 169, 99, 201, 168, 225, 133, + 150, 1, 169, 229, 36, 157, 16, 179, 117, 94, 182, 120, 103, 42, 96, 146, 173, 123, 178, 63, + 102, 253, 125, 122, 167, 180, 77, 233, 35, 113, 253, 142, 10, 67, 118, 65, 28, 87, 200, 153, + 33, 137, 76, 221, 56, 244, 167, 105, 234, 128, 105, 26, 47, 255, 55, 153, 34, 223, 129, 146, + 64, 84, 90, 37, 95, 181, 205, 88, 143, 141, 205, 98, 240, 161, 180, 194, 135, 53, 255, 241, + 170, 9, 133, 159, 110, 116, 50, 10, 185, 101, 246, 73, 59, 247, 236, 53, 241, 67, 124, 195, + 157, 106, 50, 112, 78, 136, 203, 180, 232, 59, 77, 169, 225, 212, 159, 82, 209, 164, 194, + 235, 248, 187, 113, 58, 218, 193, 202, 46, 188, 231, 8, 86, 223, 42, 171, 21, 167, 204, 110, + 209, 189, 69, 129, 126, 250, 16, 21, 80, 138, 167, 244, 127, 34, 206, 145, 66, 45, 206, 107, + 61, 206, 107, 157, 26, 215, 124, 86, 154, 126, 141, 32, 179, 177, 252, 96, 46, 158, 83, 202, + 253, 29, 107, 145, 159, 215, 14, 191, 146, 185, 30, 101, 47, 101, 15, 117, 62, 15, 164, 230, + 182, 236, 84, 5, 192, 229, 27, 98, 93, 93, 212, 197, 53, 230, 146, 136, 114, 155, 70, 57, + 60, 116, 90, 26, 50, 79, 106, 101, 54, 192, 93, 73, 145, 145, 10, 72, 243, 100, 228, 11, + 157, 30, 42, 131, 170, 111, 172, 119, 118, 251, 205, 67, 96, 159, 87, 150, 254, 137, 67, 96, + 159, 231, 120, 207, 139, 24, 243, 188, 203, 38, 137, 164, 101, 194, 70, 4, 120, 225, 144, + 197, 9, 170, 219, 142, 225, 131, 240, 100, 140, 246, 217, 68, 208, 47, 48, 221, 158, 152, + 174, 104, 95, 52, 84, 191, 79, 232, 219, 62, 87, 179, 56, 224, 46, 14, 126, 247, 153, 17, + 217, 144, 212, 166, 170, 0, 223, 229, 138, 204, 169, 146, 67, 116, 74, 7, 35, 106, 136, 25, + 200, 164, 42, 138, 207, 242, 28, 142, 42, 90, 52, 187, 60, 81, 42, 153, 14, 165, 54, 77, + 100, 66, 57, 198, 106, 163, 233, 220, 29, 117, 9, 154, 6, 153, 2, 75, 134, 147, 116, 0, 174, + 233, 147, 19, 212, 12, 105, 179, 234, 113, 195, 12, 13, 116, 159, 241, 113, 84, 206, 198, + 116, 99, 54, 171, 118, 170, 196, 246, 198, 101, 124, 147, 95, 99, 243, 231, 128, 72, 236, + 100, 65, 109, 76, 164, 89, 31, 203, 166, 179, 212, 201, 244, 133, 11, 190, 128, 231, 43, + 111, 184, 153, 47, 72, 216, 154, 44, 1, 104, 208, 80, 2, 200, 243, 99, 157, 19, 223, 8, 76, + 146, 57, 231, 42, 27, 23, 25, 172, 76, 141, 50, 177, 124, 86, 27, 39, 25, 157, 190, 96, 86, + 100, 92, 2, 31, 35, 78, 102, 82, 188, 225, 130, 9, 130, 158, 80, 108, 70, 219, 241, 231, + 177, 82, 121, 46, 23, 137, 45, 68, 163, 52, 178, 45, 79, 21, 120, 232, 179, 160, 153, 143, + 139, 213, 195, 204, 102, 186, 76, 252, 181, 132, 4, 1, 130, 141, 192, 254, 142, 88, 218, 4, + 236, 241, 33, 96, 123, 62, 162, 48, 13, 103, 151, 81, 221, 10, 170, 169, 187, 181, 10, 215, + 240, 61, 141, 151, 244, 30, 187, 148, 168, 130, 108, 219, 174, 115, 180, 106, 137, 164, 89, + 237, 186, 53, 159, 60, 154, 235, 70, 33, 141, 11, 208, 50, 184, 249, 248, 119, 161, 90, 64, + 109, 124, 6, 106, 147, 215, 186, 37, 32, 63, 142, 227, 156, 194, 153, 37, 226, 249, 172, + 100, 93, 7, 97, 106, 19, 228, 137, 205, 218, 61, 214, 112, 124, 98, 99, 75, 125, 239, 75, + 25, 137, 44, 137, 129, 111, 185, 176, 179, 224, 61, 119, 43, 142, 195, 62, 229, 4, 33, 129, + 203, 120, 210, 75, 150, 114, 78, 159, 36, 145, 89, 147, 20, 61, 232, 149, 120, 81, 69, 14, + 214, 229, 68, 245, 90, 248, 57, 161, 131, 178, 206, 81, 156, 102, 187, 70, 57, 54, 78, 236, + 154, 129, 225, 29, 233, 26, 183, 218, 10, 251, 44, 58, 253, 202, 88, 48, 39, 47, 60, 202, + 196, 53, 181, 145, 119, 244, 164, 119, 105, 122, 48, 46, 76, 15, 195, 240, 200, 244, 96, + 133, 81, 156, 115, 122, 124, 230, 75, 152, 241, 134, 205, 127, 192, 6, 167, 197, 237, 132, + 45, 128, 127, 40, 118, 223, 198, 143, 0, 138, 192, 144, 118, 98, 68, 132, 231, 10, 59, 226, + 180, 175, 248, 105, 154, 194, 204, 56, 211, 148, 134, 60, 121, 218, 108, 103, 147, 223, 123, + 133, 188, 118, 149, 30, 146, 142, 56, 99, 76, 181, 180, 186, 42, 174, 146, 182, 118, 133, + 180, 193, 70, 28, 63, 151, 73, 154, 42, 191, 25, 69, 131, 11, 151, 73, 154, 56, 199, 142, + 25, 182, 193, 157, 0, 110, 81, 127, 197, 166, 156, 229, 89, 156, 213, 46, 85, 255, 205, 248, + 52, 158, 38, 50, 147, 210, 13, 109, 103, 82, 188, 243, 98, 108, 27, 22, 127, 164, 159, 153, + 167, 246, 51, 147, 179, 180, 249, 107, 38, 221, 108, 229, 53, 241, 138, 75, 24, 130, 170, + 84, 95, 159, 218, 211, 244, 232, 241, 184, 75, 150, 250, 89, 47, 101, 1, 118, 211, 192, 18, + 35, 177, 216, 211, 250, 7, 122, 26, 231, 200, 114, 87, 235, 51, 170, 6, 23, 126, 78, 59, + 147, 89, 101, 214, 215, 250, 135, 250, 218, 132, 73, 170, 192, 244, 179, 2, 78, 185, 214, + 103, 21, 220, 234, 202, 56, 169, 172, 12, 150, 25, 174, 147, 166, 137, 241, 194, 215, 215, + 128, 48, 33, 236, 43, 49, 124, 26, 75, 163, 22, 17, 157, 176, 8, 234, 222, 61, 101, 238, + 232, 39, 4, 173, 103, 38, 255, 84, 202, 25, 65, 45, 12, 32, 104, 121, 132, 161, 45, 77, 31, + 198, 172, 251, 226, 129, 4, 31, 50, 89, 197, 206, 204, 202, 236, 33, 2, 223, 199, 207, 214, + 166, 14, 147, 87, 57, 172, 145, 117, 211, 152, 172, 237, 204, 135, 143, 241, 241, 225, 99, + 100, 94, 64, 168, 179, 227, 3, 196, 13, 54, 15, 82, 201, 105, 97, 198, 218, 156, 208, 54, + 85, 137, 30, 33, 110, 46, 167, 109, 177, 92, 218, 49, 117, 31, 80, 169, 212, 38, 176, 47, + 242, 182, 118, 194, 219, 198, 149, 246, 157, 145, 168, 41, 137, 115, 58, 54, 158, 248, 91, + 116, 147, 95, 164, 111, 115, 246, 198, 167, 117, 6, 248, 69, 182, 102, 179, 166, 232, 179, + 160, 248, 69, 178, 230, 179, 130, 98, 86, 168, 154, 95, 36, 106, 115, 138, 102, 93, 95, 91, + 55, 62, 64, 209, 58, 38, 104, 102, 133, 160, 249, 164, 184, 33, 185, 202, 14, 109, 109, 125, + 95, 132, 104, 9, 78, 95, 214, 196, 184, 98, 91, 115, 129, 0, 252, 134, 193, 135, 20, 129, + 87, 121, 252, 30, 124, 237, 232, 1, 29, 244, 0, 12, 26, 58, 222, 224, 82, 184, 31, 157, 10, + 7, 130, 155, 170, 72, 188, 161, 81, 132, 63, 55, 177, 84, 70, 109, 7, 88, 137, 110, 172, + 172, 146, 187, 166, 58, 213, 165, 83, 167, 240, 11, 142, 226, 237, 151, 212, 6, 124, 96, 60, + 78, 9, 238, 89, 33, 46, 161, 160, 44, 221, 196, 132, 179, 104, 35, 124, 230, 186, 81, 45, + 94, 32, 111, 76, 75, 240, 235, 156, 87, 110, 40, 230, 81, 227, 77, 105, 108, 242, 49, 199, + 166, 245, 117, 223, 245, 89, 37, 0, 18, 171, 71, 148, 201, 248, 20, 91, 140, 192, 237, 12, + 67, 161, 72, 113, 62, 172, 152, 105, 18, 11, 97, 136, 248, 188, 211, 109, 65, 141, 144, 185, + 138, 140, 66, 106, 176, 38, 88, 171, 93, 31, 100, 141, 160, 45, 171, 242, 233, 57, 49, 145, + 39, 243, 173, 36, 136, 180, 16, 148, 252, 68, 153, 118, 46, 29, 150, 167, 161, 211, 148, 64, + 39, 50, 148, 102, 131, 86, 200, 139, 204, 187, 169, 218, 220, 70, 244, 85, 115, 109, 125, + 122, 127, 154, 32, 148, 71, 244, 0, 6, 70, 114, 37, 251, 88, 246, 138, 46, 105, 131, 134, + 56, 200, 138, 68, 58, 197, 53, 39, 165, 125, 170, 2, 15, 50, 143, 148, 198, 95, 33, 108, + 122, 240, 144, 203, 53, 227, 153, 76, 122, 162, 2, 212, 159, 50, 173, 127, 95, 170, 224, 42, + 150, 112, 155, 89, 127, 155, 202, 69, 78, 246, 1, 77, 87, 241, 138, 49, 171, 225, 163, 52, + 2, 8, 13, 181, 130, 105, 93, 167, 181, 71, 65, 0, 42, 246, 26, 85, 236, 157, 49, 139, 210, + 138, 122, 206, 37, 236, 21, 66, 222, 14, 106, 10, 145, 67, 16, 187, 149, 156, 81, 10, 53, + 207, 11, 63, 115, 176, 206, 44, 201, 38, 69, 46, 8, 200, 163, 86, 222, 141, 203, 53, 240, + 144, 136, 243, 23, 165, 25, 116, 206, 48, 253, 74, 135, 167, 204, 68, 117, 145, 73, 211, 89, + 193, 82, 62, 89, 228, 181, 229, 152, 221, 118, 69, 80, 57, 203, 238, 158, 231, 34, 219, 253, + 8, 208, 141, 147, 52, 100, 98, 199, 169, 165, 161, 77, 228, 44, 13, 46, 177, 254, 169, 236, + 21, 127, 206, 130, 207, 19, 165, 224, 230, 76, 230, 19, 214, 46, 8, 34, 66, 5, 11, 61, 149, + 178, 145, 16, 146, 10, 159, 198, 30, 108, 159, 148, 60, 36, 9, 192, 104, 39, 129, 135, 225, + 23, 207, 49, 135, 88, 96, 192, 202, 237, 118, 82, 144, 71, 153, 95, 88, 227, 167, 201, 206, + 52, 95, 113, 148, 236, 36, 63, 5, 78, 225, 252, 27, 248, 174, 71, 93, 133, 17, 240, 229, + 235, 221, 198, 152, 174, 118, 69, 223, 152, 208, 171, 138, 166, 118, 67, 252, 115, 253, 113, + 115, 242, 232, 222, 48, 240, 102, 219, 155, 218, 91, 181, 237, 134, 97, 85, 244, 161, 189, + 120, 165, 105, 6, 89, 246, 99, 32, 42, 211, 221, 85, 177, 21, 51, 97, 103, 197, 198, 181, + 187, 100, 119, 217, 252, 133, 141, 215, 63, 191, 42, 54, 255, 23, 96, 0, 111, 110, 238, 209, + 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 56, + 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 56, + 56, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, + 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, + 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 51, 32, 48, 32, 82, 47, 82, 101, + 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, + 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 62, 62, 47, 80, + 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, + 115, 32, 52, 48, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, + 111, 98, 106, 13, 56, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, + 32, 50, 55, 50, 56, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 87, 223, 111, + 28, 55, 14, 126, 223, 191, 98, 30, 119, 138, 236, 100, 165, 25, 205, 15, 160, 40, 208, 216, + 105, 145, 3, 10, 180, 215, 5, 238, 225, 114, 15, 89, 175, 215, 118, 179, 118, 156, 181, 221, + 36, 255, 253, 137, 164, 72, 81, 154, 153, 181, 115, 135, 192, 193, 142, 36, 146, 34, 69, + 126, 252, 248, 250, 247, 15, 199, 199, 226, 199, 31, 95, 255, 118, 246, 238, 188, 88, 23, + 63, 253, 244, 230, 252, 172, 88, 188, 217, 44, 214, 5, 252, 59, 94, 45, 94, 111, 54, 235, + 194, 216, 98, 179, 95, 172, 171, 97, 24, 122, 220, 48, 133, 29, 154, 106, 104, 139, 206, + 218, 170, 41, 54, 183, 139, 127, 47, 235, 178, 93, 246, 229, 127, 54, 255, 0, 25, 83, 152, + 186, 26, 80, 204, 216, 202, 54, 214, 11, 109, 118, 139, 101, 81, 110, 254, 90, 172, 204, 96, + 171, 117, 221, 23, 43, 211, 86, 181, 141, 27, 36, 72, 82, 125, 235, 143, 116, 197, 170, 117, + 235, 170, 109, 242, 51, 172, 124, 37, 231, 50, 85, 111, 55, 139, 207, 11, 227, 250, 202, + 180, 69, 219, 119, 85, 221, 22, 117, 83, 173, 251, 194, 52, 254, 194, 199, 203, 197, 191, + 126, 40, 238, 192, 83, 101, 51, 113, 144, 101, 135, 117, 213, 244, 228, 225, 125, 217, 44, + 143, 101, 191, 252, 228, 61, 189, 47, 87, 198, 225, 175, 7, 244, 217, 219, 251, 3, 44, 14, + 224, 45, 91, 52, 125, 93, 181, 47, 183, 24, 100, 149, 197, 203, 114, 101, 151, 59, 111, 182, + 40, 221, 242, 177, 92, 145, 197, 194, 219, 110, 150, 55, 254, 38, 119, 126, 235, 162, 180, + 120, 43, 60, 251, 193, 111, 249, 27, 173, 6, 250, 20, 177, 235, 146, 4, 112, 139, 228, 193, + 27, 60, 4, 194, 55, 126, 201, 160, 242, 204, 218, 202, 212, 248, 105, 252, 214, 90, 190, + 190, 149, 171, 78, 25, 60, 178, 230, 74, 199, 162, 238, 92, 213, 75, 44, 90, 72, 151, 151, + 134, 130, 69, 37, 20, 242, 168, 127, 4, 177, 201, 164, 52, 62, 27, 225, 205, 218, 30, 83, 6, + 34, 248, 166, 242, 23, 239, 208, 59, 116, 187, 110, 150, 111, 203, 110, 249, 21, 174, 253, + 232, 183, 46, 125, 244, 238, 202, 85, 13, 247, 55, 62, 12, 232, 115, 88, 242, 2, 117, 215, + 208, 194, 190, 92, 53, 188, 176, 131, 77, 239, 120, 43, 26, 230, 78, 130, 62, 84, 117, 1, + 59, 159, 74, 211, 249, 88, 249, 184, 222, 195, 218, 39, 10, 190, 255, 20, 93, 99, 251, 174, + 33, 133, 241, 112, 80, 13, 102, 15, 254, 56, 136, 92, 129, 60, 252, 216, 150, 166, 197, 85, + 117, 169, 7, 118, 21, 173, 160, 138, 71, 74, 34, 216, 125, 2, 67, 247, 202, 91, 109, 205, + 128, 35, 240, 162, 107, 95, 95, 248, 34, 155, 115, 204, 74, 75, 1, 132, 31, 183, 144, 10, + 168, 96, 202, 129, 33, 40, 80, 15, 93, 187, 170, 107, 59, 81, 184, 243, 10, 207, 36, 157, + 32, 147, 30, 67, 72, 140, 164, 184, 191, 154, 37, 79, 6, 181, 27, 206, 218, 229, 202, 27, + 126, 42, 41, 163, 57, 193, 225, 188, 156, 2, 213, 150, 87, 209, 206, 1, 115, 190, 135, 200, + 13, 33, 249, 183, 94, 250, 192, 117, 4, 103, 7, 8, 70, 131, 69, 113, 228, 4, 146, 107, 192, + 234, 45, 197, 96, 37, 170, 227, 221, 190, 130, 71, 97, 117, 27, 10, 205, 162, 47, 151, 148, + 35, 84, 142, 143, 225, 65, 45, 230, 10, 216, 216, 71, 119, 165, 112, 81, 228, 155, 210, 56, + 114, 12, 223, 200, 131, 135, 73, 194, 170, 17, 130, 42, 25, 100, 238, 209, 39, 254, 250, 64, + 217, 177, 114, 41, 214, 108, 227, 77, 25, 231, 142, 42, 54, 62, 49, 12, 66, 31, 63, 8, 200, + 252, 12, 170, 8, 35, 193, 19, 176, 126, 192, 95, 175, 48, 13, 220, 210, 162, 213, 181, 23, + 180, 254, 15, 250, 69, 85, 174, 250, 160, 111, 227, 63, 197, 217, 23, 32, 20, 28, 128, 47, + 186, 96, 129, 149, 192, 238, 174, 124, 157, 241, 149, 239, 19, 7, 162, 187, 81, 223, 221, + 164, 62, 8, 233, 230, 7, 31, 69, 116, 242, 41, 132, 241, 154, 206, 206, 164, 81, 239, 227, + 6, 210, 58, 141, 230, 242, 118, 58, 109, 187, 20, 166, 187, 70, 5, 148, 218, 78, 19, 154, + 14, 67, 252, 78, 110, 164, 251, 195, 16, 211, 78, 223, 23, 211, 50, 190, 54, 120, 190, 227, + 99, 81, 17, 72, 114, 186, 117, 141, 196, 72, 41, 155, 192, 255, 228, 14, 212, 39, 36, 132, + 91, 157, 247, 223, 155, 75, 252, 244, 16, 212, 87, 254, 215, 58, 228, 18, 247, 35, 248, 213, + 168, 92, 98, 203, 170, 73, 172, 106, 79, 18, 214, 30, 115, 172, 241, 253, 24, 107, 3, 251, + 66, 159, 244, 133, 95, 5, 148, 1, 65, 119, 164, 137, 192, 242, 19, 55, 83, 232, 29, 140, + 175, 23, 88, 124, 143, 101, 0, 213, 8, 123, 0, 130, 23, 44, 49, 163, 245, 159, 94, 1, 43, + 129, 80, 248, 140, 189, 41, 77, 207, 72, 26, 3, 120, 26, 57, 39, 170, 134, 170, 157, 158, + 236, 111, 136, 137, 148, 208, 3, 103, 169, 202, 250, 154, 179, 190, 81, 69, 119, 205, 9, 32, + 18, 160, 20, 159, 250, 80, 114, 193, 94, 49, 12, 82, 145, 199, 170, 204, 120, 10, 133, 44, + 92, 3, 244, 224, 62, 241, 40, 112, 243, 46, 96, 225, 69, 201, 30, 252, 58, 167, 153, 130, + 22, 212, 224, 143, 155, 0, 104, 12, 164, 38, 128, 35, 103, 54, 45, 97, 24, 216, 70, 142, + 153, 73, 60, 39, 2, 134, 250, 34, 229, 202, 24, 84, 228, 131, 51, 133, 233, 207, 221, 133, + 61, 117, 201, 44, 70, 219, 244, 9, 37, 66, 177, 196, 114, 136, 22, 79, 213, 125, 194, 77, + 93, 148, 151, 88, 224, 169, 189, 198, 211, 217, 96, 61, 127, 219, 120, 161, 212, 144, 60, + 174, 42, 125, 49, 192, 128, 98, 92, 19, 179, 233, 94, 247, 193, 144, 95, 92, 146, 46, 164, + 88, 194, 4, 2, 203, 12, 93, 195, 113, 219, 0, 208, 77, 30, 199, 239, 124, 225, 75, 63, 9, + 38, 179, 147, 93, 250, 118, 190, 143, 91, 19, 125, 150, 135, 112, 145, 100, 199, 188, 136, + 56, 21, 219, 255, 29, 103, 160, 182, 175, 200, 11, 124, 82, 218, 205, 21, 2, 212, 35, 59, + 65, 253, 75, 197, 16, 5, 62, 151, 13, 118, 11, 56, 129, 183, 145, 114, 76, 175, 80, 148, 12, + 192, 251, 208, 203, 39, 10, 181, 58, 9, 145, 92, 12, 136, 145, 67, 130, 145, 239, 232, 166, + 53, 227, 86, 64, 60, 166, 126, 127, 83, 95, 176, 68, 58, 51, 244, 132, 212, 1, 249, 95, 96, + 239, 79, 56, 121, 70, 84, 249, 121, 152, 147, 194, 63, 132, 104, 73, 6, 37, 189, 220, 247, + 6, 166, 139, 46, 193, 53, 235, 136, 203, 81, 42, 112, 190, 11, 87, 116, 105, 138, 195, 247, + 59, 8, 49, 223, 212, 16, 67, 13, 91, 128, 142, 73, 233, 217, 144, 210, 207, 48, 88, 151, 18, + 68, 99, 121, 53, 180, 102, 19, 52, 220, 114, 101, 4, 223, 34, 94, 163, 65, 98, 83, 40, 8, + 123, 251, 76, 59, 119, 131, 17, 196, 133, 198, 39, 176, 114, 58, 148, 177, 65, 212, 41, 238, + 193, 119, 214, 207, 153, 75, 114, 225, 192, 17, 96, 119, 134, 187, 50, 53, 106, 33, 124, + 212, 187, 199, 44, 16, 228, 54, 120, 52, 31, 87, 97, 103, 87, 54, 57, 20, 206, 92, 47, 197, + 101, 166, 127, 35, 100, 134, 163, 250, 217, 19, 207, 242, 242, 123, 1, 115, 202, 213, 141, + 130, 208, 78, 135, 192, 233, 16, 52, 148, 116, 79, 193, 133, 236, 73, 143, 200, 129, 134, + 112, 114, 132, 173, 33, 74, 18, 15, 1, 152, 56, 225, 60, 113, 94, 233, 155, 43, 180, 98, + 246, 144, 204, 54, 53, 85, 79, 164, 161, 183, 161, 39, 214, 249, 148, 162, 194, 198, 229, + 183, 231, 196, 189, 158, 32, 127, 181, 81, 113, 60, 6, 54, 29, 225, 77, 42, 32, 226, 111, + 152, 204, 146, 134, 32, 126, 130, 119, 39, 96, 25, 4, 211, 29, 177, 155, 60, 164, 137, 250, + 147, 23, 53, 161, 171, 220, 232, 151, 9, 122, 229, 49, 194, 247, 132, 251, 249, 36, 149, + 132, 107, 91, 42, 29, 31, 217, 10, 124, 92, 113, 83, 169, 233, 249, 152, 48, 73, 131, 198, + 18, 48, 170, 251, 112, 110, 28, 56, 17, 184, 119, 39, 197, 1, 133, 54, 79, 91, 178, 108, 54, + 117, 198, 82, 106, 61, 82, 76, 224, 86, 162, 204, 64, 12, 60, 58, 195, 245, 65, 203, 95, + 242, 70, 138, 51, 76, 218, 60, 137, 171, 217, 164, 166, 153, 239, 78, 218, 233, 52, 138, 86, + 42, 254, 47, 105, 131, 38, 204, 27, 107, 156, 174, 106, 162, 181, 95, 201, 13, 116, 189, 99, + 234, 78, 157, 48, 78, 3, 163, 25, 2, 103, 0, 144, 146, 110, 121, 96, 1, 84, 113, 203, 203, + 210, 90, 65, 202, 187, 141, 84, 134, 86, 174, 101, 170, 56, 146, 123, 46, 88, 134, 38, 155, + 52, 224, 203, 146, 102, 20, 154, 86, 170, 242, 101, 115, 5, 182, 63, 121, 151, 108, 42, 205, + 249, 211, 124, 18, 101, 83, 105, 46, 24, 120, 57, 179, 18, 201, 173, 238, 153, 220, 202, + 102, 152, 41, 51, 99, 222, 217, 105, 144, 3, 134, 53, 130, 57, 145, 99, 32, 146, 241, 39, + 41, 195, 105, 107, 214, 204, 205, 20, 219, 16, 158, 157, 190, 77, 29, 177, 48, 86, 172, 53, + 17, 159, 35, 90, 66, 120, 36, 145, 79, 40, 216, 10, 192, 136, 19, 252, 14, 110, 116, 56, + 129, 204, 8, 162, 162, 153, 123, 186, 42, 67, 137, 215, 45, 87, 32, 202, 133, 32, 105, 218, + 16, 90, 20, 8, 190, 95, 98, 172, 71, 67, 133, 134, 19, 18, 206, 161, 46, 76, 51, 24, 82, 38, + 48, 231, 170, 202, 37, 37, 210, 167, 126, 95, 210, 28, 201, 19, 0, 83, 9, 16, 187, 150, 118, + 231, 255, 239, 82, 38, 103, 194, 142, 220, 74, 26, 5, 173, 103, 228, 31, 197, 224, 236, 65, + 231, 138, 244, 193, 216, 88, 85, 220, 157, 206, 188, 180, 121, 201, 251, 206, 245, 231, 173, + 74, 158, 145, 86, 238, 10, 92, 68, 54, 100, 141, 142, 30, 100, 227, 57, 15, 100, 212, 186, + 207, 164, 188, 164, 211, 201, 44, 119, 16, 229, 49, 9, 73, 234, 79, 105, 204, 19, 108, 172, + 89, 254, 156, 77, 130, 176, 54, 217, 52, 115, 238, 192, 10, 238, 133, 167, 195, 101, 198, + 216, 34, 76, 143, 123, 44, 117, 1, 248, 126, 144, 121, 81, 130, 42, 131, 47, 6, 47, 175, + 229, 9, 254, 2, 107, 119, 73, 14, 236, 148, 5, 77, 120, 99, 132, 177, 251, 112, 193, 74, 65, + 141, 128, 195, 229, 133, 133, 83, 137, 102, 5, 10, 35, 15, 252, 18, 119, 50, 179, 36, 10, + 95, 113, 51, 2, 45, 130, 158, 145, 39, 29, 20, 56, 79, 80, 162, 96, 41, 51, 12, 22, 164, + 174, 152, 238, 193, 141, 163, 222, 25, 93, 233, 188, 101, 194, 68, 148, 244, 223, 248, 122, + 124, 119, 137, 157, 224, 41, 102, 138, 148, 6, 196, 92, 83, 43, 230, 103, 126, 45, 180, 142, + 62, 12, 181, 18, 173, 171, 113, 158, 12, 137, 155, 240, 153, 142, 45, 97, 81, 88, 32, 170, + 160, 12, 20, 181, 226, 68, 146, 61, 195, 20, 7, 231, 69, 169, 1, 130, 55, 185, 112, 2, 227, + 19, 151, 195, 0, 71, 163, 41, 77, 29, 69, 14, 52, 30, 195, 95, 116, 251, 158, 243, 65, 93, + 34, 37, 209, 46, 4, 128, 30, 204, 69, 172, 188, 100, 148, 150, 154, 224, 252, 72, 88, 167, + 211, 140, 192, 241, 16, 105, 141, 92, 38, 212, 91, 134, 236, 78, 74, 68, 244, 100, 205, 56, + 230, 215, 17, 81, 27, 54, 111, 82, 84, 114, 163, 0, 163, 111, 54, 143, 111, 85, 74, 133, + 142, 40, 94, 59, 77, 241, 140, 166, 120, 191, 132, 151, 32, 242, 132, 36, 235, 80, 70, 178, + 133, 59, 204, 247, 144, 171, 93, 193, 74, 240, 201, 34, 243, 58, 210, 19, 134, 195, 114, 16, + 206, 60, 208, 19, 183, 116, 70, 148, 129, 212, 21, 31, 190, 8, 184, 24, 72, 227, 13, 139, + 137, 34, 161, 144, 162, 109, 204, 30, 31, 200, 226, 243, 164, 111, 131, 44, 21, 73, 141, + 237, 168, 74, 36, 208, 55, 82, 102, 18, 227, 49, 252, 131, 212, 73, 194, 222, 240, 169, 116, + 108, 203, 52, 93, 49, 122, 94, 148, 162, 54, 153, 107, 89, 89, 76, 232, 168, 47, 199, 39, + 211, 48, 230, 12, 172, 75, 15, 79, 54, 227, 182, 246, 165, 220, 214, 166, 52, 48, 97, 126, + 45, 197, 83, 82, 150, 177, 248, 75, 48, 218, 4, 120, 12, 60, 13, 34, 43, 37, 19, 182, 247, + 101, 4, 134, 47, 18, 69, 197, 233, 154, 46, 65, 92, 144, 145, 199, 130, 191, 39, 198, 253, + 41, 36, 211, 142, 128, 36, 95, 48, 18, 186, 4, 66, 155, 122, 12, 194, 141, 226, 29, 66, 134, + 100, 216, 36, 167, 132, 75, 113, 11, 21, 216, 146, 134, 197, 177, 22, 180, 186, 41, 83, 200, + 141, 188, 50, 116, 97, 107, 26, 29, 89, 222, 143, 65, 34, 134, 111, 99, 86, 214, 77, 146, + 126, 102, 138, 120, 192, 170, 60, 73, 140, 64, 216, 161, 64, 155, 46, 177, 207, 64, 109, + 233, 42, 87, 66, 62, 50, 4, 207, 166, 21, 91, 39, 15, 199, 159, 194, 57, 196, 228, 36, 203, + 64, 221, 156, 24, 50, 184, 12, 68, 16, 197, 253, 143, 83, 237, 10, 78, 77, 145, 103, 155, + 13, 74, 195, 12, 97, 51, 83, 237, 206, 12, 138, 216, 143, 90, 198, 115, 247, 178, 114, 49, + 94, 60, 69, 137, 243, 177, 111, 200, 249, 212, 144, 76, 13, 24, 175, 103, 166, 5, 160, 184, + 46, 88, 5, 59, 146, 196, 232, 198, 231, 146, 114, 124, 68, 119, 64, 70, 207, 128, 206, 137, + 229, 149, 171, 191, 19, 222, 156, 123, 1, 188, 249, 174, 52, 9, 111, 126, 41, 32, 27, 168, + 1, 201, 144, 87, 137, 91, 113, 248, 145, 192, 100, 153, 250, 61, 25, 220, 51, 109, 198, 19, + 31, 197, 49, 134, 139, 190, 206, 40, 172, 174, 198, 126, 114, 30, 80, 245, 9, 7, 28, 133, + 21, 126, 126, 147, 33, 69, 16, 80, 219, 81, 149, 212, 159, 12, 188, 47, 222, 44, 240, 9, 24, + 253, 79, 189, 197, 47, 85, 112, 44, 180, 131, 119, 240, 91, 26, 203, 192, 74, 137, 80, 216, + 65, 193, 150, 224, 100, 216, 120, 89, 199, 25, 210, 164, 179, 76, 22, 225, 155, 125, 216, + 171, 204, 22, 1, 61, 222, 192, 162, 160, 239, 94, 133, 94, 113, 245, 136, 185, 98, 248, 83, + 89, 175, 101, 214, 146, 200, 189, 183, 214, 148, 195, 119, 165, 187, 251, 191, 194, 237, 13, + 90, 111, 208, 51, 187, 112, 141, 183, 155, 133, 49, 109, 213, 20, 221, 218, 120, 66, 83, + 172, 171, 166, 167, 255, 142, 151, 139, 253, 179, 123, 125, 207, 155, 117, 103, 42, 103, + 213, 118, 211, 247, 179, 162, 167, 246, 200, 228, 208, 202, 106, 187, 118, 149, 205, 54, + 231, 132, 102, 238, 56, 204, 222, 111, 198, 14, 111, 78, 95, 124, 188, 254, 246, 183, 179, + 98, 241, 95, 1, 6, 0, 62, 107, 7, 155, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, + 13, 101, 110, 100, 111, 98, 106, 13, 56, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, + 111, 110, 116, 101, 110, 116, 115, 32, 57, 48, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, + 116, 32, 51, 52, 51, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, + 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, + 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, + 84, 51, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 57, 32, 48, 32, 82, 62, + 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, + 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, + 101, 110, 116, 115, 32, 52, 49, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 57, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, + 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, + 103, 116, 104, 32, 51, 48, 53, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, + 156, 87, 89, 111, 28, 71, 14, 126, 159, 95, 209, 143, 211, 70, 186, 221, 117, 244, 5, 4, 1, + 44, 91, 1, 188, 72, 118, 19, 236, 0, 121, 48, 22, 88, 217, 35, 89, 222, 213, 140, 229, 177, + 38, 178, 243, 235, 183, 200, 34, 89, 172, 238, 30, 29, 139, 192, 202, 116, 21, 111, 178, + 200, 143, 47, 127, 187, 56, 220, 21, 63, 254, 248, 242, 215, 215, 111, 223, 20, 77, 241, + 211, 79, 103, 111, 94, 23, 171, 179, 205, 170, 41, 224, 191, 195, 199, 213, 203, 205, 166, + 41, 140, 45, 54, 87, 171, 166, 30, 199, 113, 192, 11, 83, 216, 209, 215, 99, 87, 244, 214, + 214, 190, 216, 236, 86, 239, 214, 174, 236, 214, 99, 249, 175, 205, 223, 128, 199, 20, 198, + 213, 35, 178, 25, 91, 91, 111, 3, 211, 102, 187, 90, 23, 229, 230, 63, 171, 202, 140, 182, + 110, 220, 80, 84, 166, 171, 157, 77, 23, 145, 49, 114, 13, 93, 32, 233, 139, 170, 107, 155, + 186, 243, 83, 26, 22, 94, 9, 221, 68, 212, 249, 102, 245, 37, 168, 182, 181, 233, 138, 110, + 232, 107, 215, 21, 225, 163, 25, 10, 227, 131, 193, 135, 203, 213, 31, 47, 138, 61, 120, + 122, 202, 65, 230, 29, 155, 218, 15, 209, 195, 179, 58, 184, 104, 194, 63, 139, 110, 6, 21, + 191, 131, 18, 239, 131, 131, 172, 36, 90, 246, 100, 37, 196, 43, 74, 196, 120, 148, 220, 14, + 202, 124, 103, 77, 61, 248, 167, 139, 38, 102, 101, 63, 152, 222, 134, 127, 69, 89, 245, + 126, 125, 91, 86, 110, 125, 89, 218, 245, 161, 172, 90, 58, 251, 80, 86, 22, 207, 246, 112, + 121, 39, 180, 120, 254, 25, 254, 224, 133, 144, 125, 45, 43, 19, 255, 124, 42, 91, 69, 112, + 81, 86, 221, 250, 166, 100, 177, 32, 8, 143, 190, 1, 105, 58, 67, 6, 182, 198, 116, 209, 18, + 60, 220, 133, 195, 248, 11, 232, 64, 85, 36, 219, 179, 209, 247, 165, 167, 163, 93, 105, + 108, 148, 142, 151, 71, 248, 115, 85, 86, 62, 158, 125, 96, 25, 120, 142, 10, 192, 212, 61, + 168, 251, 8, 4, 153, 131, 42, 173, 126, 104, 36, 242, 152, 216, 39, 198, 29, 249, 82, 62, + 43, 201, 231, 19, 106, 173, 247, 88, 234, 144, 43, 244, 61, 79, 17, 250, 3, 174, 128, 3, + 127, 66, 128, 98, 92, 218, 152, 1, 228, 64, 63, 224, 30, 174, 128, 246, 123, 9, 1, 79, 175, + 18, 149, 187, 182, 238, 59, 120, 51, 45, 84, 84, 120, 51, 239, 214, 111, 203, 106, 8, 81, + 225, 160, 126, 46, 33, 27, 195, 122, 27, 78, 46, 65, 38, 124, 112, 226, 48, 73, 170, 140, + 76, 139, 215, 112, 182, 139, 150, 116, 145, 234, 50, 229, 23, 191, 175, 89, 90, 60, 11, 241, + 31, 133, 243, 30, 8, 132, 42, 89, 113, 165, 18, 29, 100, 135, 32, 88, 131, 134, 30, 195, 63, + 184, 188, 128, 227, 15, 232, 110, 96, 62, 138, 57, 159, 74, 112, 8, 190, 80, 79, 148, 17, + 15, 189, 100, 29, 146, 110, 187, 144, 37, 44, 70, 227, 130, 59, 202, 97, 20, 125, 23, 107, + 102, 128, 144, 15, 120, 103, 41, 162, 13, 188, 93, 29, 196, 175, 160, 232, 50, 230, 193, + 166, 64, 129, 168, 31, 74, 52, 193, 145, 189, 225, 103, 235, 209, 18, 36, 191, 167, 39, 232, + 216, 166, 80, 210, 85, 160, 139, 33, 120, 138, 77, 196, 141, 22, 0, 79, 40, 4, 211, 35, 201, + 101, 124, 1, 129, 225, 59, 212, 76, 164, 131, 192, 177, 105, 24, 87, 164, 218, 98, 184, 34, + 5, 220, 238, 179, 111, 8, 15, 149, 65, 75, 110, 128, 152, 148, 105, 186, 12, 196, 13, 53, + 202, 26, 204, 107, 144, 211, 243, 167, 13, 63, 26, 108, 162, 112, 12, 83, 227, 135, 240, + 171, 225, 152, 74, 64, 223, 132, 128, 222, 115, 61, 128, 35, 16, 25, 170, 13, 219, 122, 242, + 80, 138, 46, 121, 1, 81, 253, 192, 142, 127, 165, 220, 3, 7, 23, 208, 172, 126, 108, 86, 64, + 158, 202, 167, 50, 145, 240, 163, 18, 17, 99, 6, 55, 116, 112, 139, 228, 112, 0, 87, 91, + 148, 11, 65, 19, 121, 159, 176, 190, 193, 213, 125, 178, 253, 125, 248, 201, 217, 128, 111, + 135, 4, 42, 98, 29, 6, 70, 197, 11, 238, 225, 151, 199, 95, 49, 86, 155, 23, 33, 68, 226, + 207, 54, 138, 119, 109, 252, 73, 47, 212, 97, 153, 129, 69, 242, 42, 233, 20, 25, 177, 126, + 46, 98, 3, 31, 66, 199, 30, 248, 86, 61, 61, 33, 222, 43, 171, 225, 16, 99, 43, 197, 9, 30, + 131, 144, 43, 212, 38, 149, 167, 204, 74, 47, 18, 104, 37, 87, 39, 138, 185, 77, 21, 170, + 220, 18, 153, 199, 210, 115, 144, 45, 71, 153, 43, 150, 31, 27, 233, 12, 118, 218, 81, 199, + 236, 150, 114, 28, 31, 23, 7, 39, 189, 94, 178, 217, 228, 205, 206, 196, 188, 177, 129, 134, + 162, 114, 67, 129, 147, 38, 54, 17, 33, 161, 43, 178, 7, 173, 138, 163, 83, 215, 19, 133, + 183, 220, 224, 56, 238, 76, 130, 135, 223, 210, 33, 181, 5, 147, 105, 141, 63, 67, 148, 172, + 104, 145, 200, 163, 183, 248, 71, 27, 33, 30, 69, 214, 188, 225, 100, 189, 15, 223, 105, 23, + 159, 169, 42, 22, 19, 184, 20, 206, 48, 228, 131, 238, 15, 198, 248, 133, 2, 160, 11, 177, + 104, 23, 139, 18, 94, 214, 13, 91, 161, 4, 100, 113, 10, 223, 210, 41, 146, 185, 116, 67, + 21, 48, 242, 247, 137, 186, 199, 15, 200, 239, 77, 153, 138, 112, 73, 19, 55, 237, 212, 181, + 225, 244, 100, 111, 89, 108, 45, 3, 55, 22, 169, 203, 188, 239, 197, 33, 64, 157, 77, 106, + 96, 79, 141, 48, 229, 175, 230, 201, 110, 105, 178, 183, 33, 39, 163, 209, 96, 59, 96, 15, + 19, 176, 177, 47, 250, 198, 132, 169, 95, 32, 50, 193, 63, 1, 204, 92, 61, 122, 55, 12, 124, + 233, 122, 83, 183, 86, 93, 251, 97, 56, 201, 250, 208, 93, 84, 217, 122, 3, 72, 25, 143, 77, + 59, 130, 235, 138, 243, 212, 173, 96, 250, 214, 246, 117, 19, 208, 48, 44, 23, 207, 197, + 244, 173, 107, 224, 127, 136, 179, 94, 135, 120, 214, 152, 92, 13, 233, 29, 8, 100, 21, 67, + 221, 63, 3, 209, 71, 86, 165, 225, 188, 236, 215, 175, 2, 34, 251, 103, 166, 161, 117, 117, + 224, 38, 21, 163, 121, 214, 210, 64, 188, 19, 29, 0, 4, 255, 1, 184, 247, 231, 244, 244, + 193, 59, 60, 251, 21, 176, 227, 111, 80, 244, 191, 132, 210, 122, 27, 28, 6, 147, 254, 14, + 148, 64, 115, 158, 108, 139, 138, 221, 226, 206, 231, 91, 176, 54, 41, 158, 84, 24, 36, 205, + 251, 19, 85, 68, 151, 39, 170, 232, 52, 107, 184, 51, 99, 77, 69, 20, 87, 32, 205, 183, 120, + 151, 170, 164, 241, 152, 60, 232, 84, 207, 45, 146, 166, 199, 231, 168, 139, 196, 228, 69, + 210, 67, 113, 147, 10, 27, 108, 88, 82, 97, 150, 139, 132, 88, 89, 197, 210, 218, 71, 130, + 157, 237, 255, 143, 181, 79, 91, 15, 197, 129, 187, 195, 215, 8, 145, 176, 179, 121, 231, + 105, 17, 170, 28, 127, 227, 242, 0, 91, 27, 82, 195, 45, 174, 97, 66, 198, 251, 18, 208, + 110, 121, 53, 217, 202, 210, 37, 171, 150, 222, 5, 173, 72, 79, 219, 33, 29, 160, 150, 180, + 232, 29, 226, 2, 16, 217, 255, 146, 45, 114, 42, 48, 151, 135, 139, 30, 29, 220, 202, 134, + 7, 118, 129, 31, 115, 23, 80, 228, 129, 192, 112, 246, 234, 31, 175, 8, 31, 222, 40, 6, 20, + 196, 127, 139, 157, 153, 130, 128, 178, 49, 18, 160, 41, 95, 55, 47, 167, 219, 87, 215, 212, + 189, 179, 186, 71, 87, 214, 215, 99, 215, 102, 187, 196, 43, 61, 199, 252, 232, 5, 180, 164, + 238, 63, 27, 160, 64, 166, 145, 61, 29, 125, 192, 112, 168, 121, 183, 227, 31, 26, 222, 2, + 229, 133, 32, 105, 22, 33, 48, 229, 47, 65, 29, 203, 176, 22, 216, 21, 14, 96, 189, 52, 248, + 97, 140, 39, 220, 162, 182, 176, 153, 103, 55, 52, 32, 119, 8, 203, 153, 50, 130, 116, 32, + 34, 32, 148, 237, 95, 93, 12, 25, 242, 35, 38, 18, 200, 1, 188, 41, 86, 248, 139, 192, 161, + 89, 216, 73, 205, 116, 98, 11, 42, 253, 196, 161, 80, 56, 44, 3, 22, 143, 65, 69, 16, 41, + 24, 134, 65, 192, 4, 41, 126, 198, 186, 81, 120, 136, 36, 136, 242, 107, 129, 30, 140, 132, + 64, 15, 224, 215, 41, 60, 92, 242, 138, 16, 95, 88, 181, 52, 0, 228, 79, 69, 157, 202, 71, + 16, 179, 94, 88, 218, 108, 135, 101, 168, 146, 129, 203, 67, 74, 48, 83, 67, 74, 52, 238, + 78, 96, 127, 43, 132, 19, 45, 51, 79, 194, 217, 89, 233, 144, 93, 98, 9, 220, 117, 201, 44, + 111, 65, 106, 210, 204, 158, 200, 230, 144, 246, 87, 157, 174, 150, 110, 83, 152, 148, 70, + 101, 133, 97, 53, 218, 145, 5, 68, 205, 229, 217, 52, 38, 123, 211, 122, 169, 50, 188, 193, + 46, 189, 204, 233, 234, 233, 204, 243, 222, 38, 239, 163, 20, 9, 231, 252, 84, 119, 30, 219, + 204, 103, 199, 117, 247, 232, 83, 34, 98, 169, 79, 245, 173, 239, 99, 180, 216, 166, 91, + 106, 80, 179, 117, 139, 204, 178, 45, 53, 22, 85, 126, 210, 29, 196, 255, 108, 87, 244, 253, + 66, 177, 192, 97, 44, 78, 238, 82, 219, 82, 217, 58, 11, 82, 106, 96, 240, 160, 72, 192, 83, + 219, 1, 208, 166, 245, 118, 81, 59, 239, 13, 39, 183, 86, 226, 186, 103, 77, 226, 209, 162, + 135, 58, 101, 18, 167, 39, 167, 109, 204, 31, 192, 152, 247, 171, 113, 214, 175, 32, 86, + 179, 142, 181, 208, 178, 198, 252, 17, 143, 106, 17, 53, 203, 189, 34, 107, 22, 35, 119, + 250, 212, 45, 56, 75, 179, 126, 49, 87, 53, 43, 129, 17, 250, 69, 101, 186, 165, 142, 81, + 217, 172, 193, 253, 172, 31, 86, 90, 230, 164, 21, 247, 179, 201, 10, 71, 92, 151, 86, 170, + 154, 222, 37, 37, 87, 191, 97, 160, 87, 143, 16, 62, 49, 27, 71, 10, 198, 117, 58, 127, 114, + 26, 129, 88, 7, 193, 228, 101, 98, 68, 226, 69, 105, 6, 213, 160, 72, 72, 232, 253, 233, 83, + 6, 64, 75, 154, 174, 121, 239, 132, 14, 117, 147, 156, 86, 149, 34, 225, 155, 131, 19, 112, + 137, 231, 28, 115, 88, 137, 61, 241, 42, 196, 85, 185, 46, 244, 203, 190, 8, 217, 231, 121, + 206, 176, 219, 78, 17, 20, 140, 252, 198, 105, 4, 165, 4, 1, 18, 15, 91, 74, 19, 101, 188, + 141, 207, 139, 208, 169, 160, 195, 132, 135, 167, 232, 54, 194, 183, 235, 12, 75, 34, 33, + 30, 125, 102, 136, 188, 141, 72, 180, 157, 227, 204, 187, 146, 36, 195, 45, 226, 211, 4, + 111, 225, 232, 118, 46, 26, 193, 226, 46, 230, 59, 252, 98, 200, 251, 39, 156, 68, 188, 30, + 197, 162, 213, 223, 168, 56, 151, 161, 113, 27, 37, 162, 183, 215, 12, 79, 119, 44, 40, 164, + 124, 76, 161, 231, 112, 86, 2, 164, 120, 80, 233, 49, 218, 61, 48, 71, 187, 54, 181, 236, + 142, 15, 78, 140, 210, 78, 129, 133, 29, 35, 130, 27, 233, 44, 200, 144, 129, 8, 226, 145, + 139, 109, 178, 103, 166, 83, 247, 10, 104, 184, 50, 39, 238, 98, 160, 147, 184, 61, 61, 212, + 61, 132, 162, 162, 249, 157, 172, 189, 166, 86, 156, 225, 75, 14, 11, 10, 59, 104, 99, 145, + 103, 62, 36, 184, 201, 105, 192, 105, 39, 147, 210, 78, 38, 165, 53, 57, 174, 184, 69, 75, + 22, 39, 165, 157, 192, 77, 22, 197, 225, 147, 151, 56, 207, 130, 93, 66, 136, 217, 97, 254, + 140, 175, 41, 92, 55, 148, 125, 162, 158, 163, 116, 228, 215, 190, 164, 118, 9, 105, 121, + 176, 87, 64, 11, 148, 146, 200, 39, 173, 116, 37, 231, 83, 95, 17, 219, 119, 113, 163, 77, + 36, 186, 193, 58, 175, 86, 14, 236, 166, 211, 245, 69, 102, 63, 244, 188, 105, 123, 119, + 220, 179, 216, 87, 108, 228, 17, 54, 188, 199, 210, 181, 46, 211, 29, 145, 248, 145, 211, + 158, 80, 220, 4, 29, 230, 29, 220, 69, 205, 156, 245, 93, 236, 28, 244, 66, 125, 97, 76, 29, + 154, 89, 120, 164, 174, 25, 107, 111, 121, 109, 252, 55, 53, 61, 126, 194, 239, 88, 150, 45, + 121, 171, 173, 152, 67, 87, 48, 87, 7, 59, 26, 61, 12, 188, 125, 86, 81, 115, 245, 222, 213, + 182, 25, 31, 210, 30, 134, 173, 139, 229, 216, 51, 180, 61, 165, 105, 250, 164, 199, 121, + 181, 84, 60, 30, 101, 2, 130, 233, 144, 134, 136, 207, 166, 96, 100, 212, 143, 7, 58, 192, + 213, 60, 240, 179, 151, 25, 213, 68, 129, 143, 38, 192, 90, 91, 183, 182, 125, 36, 4, 109, + 16, 209, 8, 168, 18, 108, 255, 95, 133, 229, 82, 168, 19, 202, 61, 223, 172, 190, 172, 252, + 208, 65, 199, 177, 125, 95, 251, 240, 191, 218, 116, 133, 241, 117, 231, 139, 195, 229, 234, + 143, 23, 197, 126, 117, 182, 209, 42, 155, 122, 28, 199, 33, 216, 19, 38, 95, 193, 188, 67, + 83, 183, 97, 124, 238, 104, 46, 6, 185, 191, 19, 155, 114, 37, 227, 52, 237, 0, 154, 108, + 231, 235, 222, 34, 231, 114, 113, 249, 117, 31, 252, 106, 101, 193, 157, 251, 86, 195, 131, + 141, 151, 27, 156, 161, 169, 195, 184, 167, 53, 40, 70, 150, 122, 48, 236, 120, 55, 18, 44, + 38, 24, 25, 72, 52, 56, 145, 85, 19, 18, 26, 199, 203, 144, 176, 17, 247, 125, 184, 156, 92, + 176, 109, 241, 75, 79, 4, 155, 90, 231, 82, 231, 156, 237, 101, 71, 66, 250, 202, 216, 197, + 38, 136, 92, 216, 81, 240, 143, 4, 228, 163, 12, 148, 187, 210, 36, 61, 57, 118, 92, 90, + 119, 250, 7, 45, 81, 229, 46, 170, 18, 2, 207, 187, 237, 86, 148, 192, 175, 163, 76, 214, + 41, 160, 61, 97, 197, 247, 8, 54, 42, 181, 63, 208, 4, 28, 179, 64, 247, 126, 54, 122, 125, + 160, 172, 2, 40, 77, 218, 193, 17, 126, 197, 118, 212, 1, 228, 57, 126, 199, 184, 42, 129, + 102, 65, 16, 202, 157, 22, 99, 55, 29, 43, 173, 180, 23, 134, 52, 109, 226, 94, 72, 227, 21, + 201, 154, 250, 221, 42, 68, 146, 102, 206, 13, 73, 148, 12, 203, 48, 167, 116, 180, 167, + 146, 113, 155, 229, 237, 37, 107, 60, 82, 135, 99, 223, 147, 43, 7, 132, 202, 207, 131, 213, + 142, 91, 173, 129, 237, 242, 188, 236, 35, 180, 188, 195, 144, 19, 160, 68, 152, 59, 133, + 200, 241, 37, 116, 9, 95, 198, 163, 4, 60, 17, 144, 222, 230, 183, 51, 36, 12, 135, 91, 166, + 193, 31, 71, 193, 233, 75, 200, 54, 230, 32, 124, 163, 164, 100, 69, 2, 197, 242, 30, 35, + 52, 86, 86, 33, 223, 49, 2, 111, 124, 224, 88, 28, 118, 129, 195, 33, 160, 71, 250, 123, + 204, 111, 102, 239, 212, 254, 61, 135, 231, 6, 63, 85, 121, 30, 168, 10, 58, 138, 167, 95, + 207, 96, 183, 107, 235, 190, 235, 231, 184, 155, 107, 206, 187, 28, 32, 194, 119, 14, 16, + 253, 50, 60, 244, 46, 135, 135, 240, 157, 45, 114, 112, 126, 175, 180, 92, 80, 244, 252, 28, + 50, 221, 242, 18, 152, 158, 53, 1, 164, 37, 45, 240, 243, 125, 169, 133, 168, 7, 15, 4, 242, + 184, 14, 220, 208, 227, 72, 247, 212, 205, 165, 35, 100, 184, 221, 11, 178, 123, 0, 156, + 203, 110, 194, 93, 107, 130, 200, 97, 216, 238, 5, 44, 168, 110, 58, 206, 156, 142, 135, + 201, 14, 5, 71, 184, 179, 130, 253, 122, 83, 25, 243, 96, 208, 236, 151, 64, 235, 192, 141, + 25, 206, 28, 99, 151, 78, 195, 44, 158, 201, 150, 145, 5, 98, 228, 25, 198, 134, 231, 240, + 153, 43, 101, 70, 118, 207, 253, 234, 19, 153, 125, 93, 102, 213, 58, 247, 127, 82, 123, 78, + 205, 141, 47, 20, 95, 184, 151, 67, 42, 189, 73, 77, 32, 42, 206, 80, 192, 233, 44, 77, 196, + 28, 49, 215, 12, 18, 117, 252, 120, 19, 144, 190, 185, 132, 232, 3, 160, 55, 225, 107, 12, + 255, 124, 248, 247, 75, 160, 109, 214, 103, 165, 91, 191, 162, 90, 207, 151, 5, 183, 48, + 203, 194, 217, 171, 108, 179, 75, 14, 17, 116, 144, 248, 129, 96, 5, 252, 135, 37, 216, 15, + 237, 126, 67, 121, 23, 218, 212, 228, 107, 170, 106, 133, 204, 108, 232, 16, 221, 80, 24, + 103, 161, 214, 5, 211, 133, 22, 226, 168, 133, 216, 128, 14, 13, 33, 82, 198, 123, 198, 116, + 181, 47, 90, 51, 214, 129, 166, 169, 253, 16, 255, 4, 12, 121, 133, 119, 195, 192, 151, 174, + 55, 1, 209, 170, 107, 63, 12, 15, 178, 6, 8, 217, 4, 147, 226, 169, 55, 14, 184, 39, 151, + 15, 49, 158, 180, 135, 46, 79, 216, 115, 66, 103, 186, 156, 203, 125, 232, 238, 252, 215, + 215, 197, 234, 127, 2, 12, 0, 140, 171, 146, 175, 13, 10, 101, 110, 100, 115, 116, 114, 101, + 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 57, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 57, 50, 32, 48, 32, 82, 47, 67, 114, 111, + 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, + 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, + 101, 110, 116, 32, 51, 52, 52, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, + 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, + 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, + 82, 47, 84, 84, 51, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, + 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, + 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 52, 50, 47, 84, + 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 57, 50, + 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 57, 57, 54, 62, + 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 172, 87, 219, 142, 28, 183, 17, 125, 159, + 175, 232, 167, 96, 90, 112, 183, 154, 183, 190, 0, 134, 129, 232, 226, 196, 70, 148, 216, + 209, 32, 10, 32, 7, 200, 174, 86, 179, 90, 123, 119, 36, 175, 181, 89, 201, 95, 31, 86, 145, + 85, 44, 178, 187, 103, 71, 65, 32, 72, 154, 230, 181, 88, 60, 231, 212, 225, 227, 31, 206, + 110, 63, 86, 95, 127, 253, 248, 197, 211, 239, 158, 85, 93, 245, 205, 55, 79, 158, 61, 173, + 54, 79, 118, 155, 174, 130, 63, 183, 151, 155, 199, 187, 93, 87, 41, 93, 237, 246, 155, 174, + 157, 166, 105, 196, 14, 85, 233, 201, 182, 83, 95, 13, 90, 183, 182, 218, 221, 108, 94, 111, + 109, 221, 111, 187, 250, 95, 187, 239, 97, 142, 170, 148, 105, 39, 156, 166, 116, 171, 173, + 246, 147, 118, 23, 155, 109, 85, 239, 126, 222, 52, 106, 210, 109, 103, 198, 170, 81, 125, + 107, 116, 234, 8, 19, 195, 172, 177, 247, 67, 134, 170, 233, 93, 215, 246, 182, 28, 67, 139, + 55, 60, 174, 88, 234, 249, 110, 243, 171, 223, 90, 183, 170, 175, 250, 113, 104, 77, 15, + 147, 172, 173, 148, 245, 1, 223, 190, 221, 188, 122, 84, 29, 224, 164, 107, 7, 164, 185, 83, + 215, 218, 49, 156, 240, 89, 221, 168, 110, 219, 250, 115, 86, 120, 78, 191, 199, 143, 176, + 139, 113, 109, 218, 196, 135, 235, 243, 114, 242, 46, 97, 174, 216, 228, 85, 237, 182, 223, + 249, 45, 194, 102, 207, 235, 97, 251, 87, 255, 11, 155, 240, 199, 159, 234, 198, 248, 253, + 221, 246, 15, 254, 203, 225, 175, 52, 20, 254, 254, 80, 55, 227, 177, 121, 127, 171, 27, + 187, 253, 22, 154, 224, 107, 39, 79, 162, 125, 50, 157, 56, 202, 8, 25, 56, 245, 40, 52, 89, + 156, 229, 143, 126, 131, 127, 214, 205, 132, 59, 61, 129, 175, 151, 117, 3, 81, 54, 74, 99, + 27, 52, 97, 116, 225, 8, 161, 169, 81, 54, 52, 238, 234, 38, 228, 130, 134, 254, 3, 214, + 194, 248, 83, 134, 120, 137, 167, 53, 28, 155, 79, 19, 34, 213, 75, 145, 90, 107, 219, 65, + 139, 72, 25, 50, 202, 163, 200, 86, 67, 167, 218, 161, 175, 176, 23, 255, 241, 167, 223, 63, + 216, 55, 142, 212, 105, 6, 213, 58, 45, 186, 237, 56, 174, 78, 61, 214, 23, 182, 236, 135, + 9, 208, 142, 205, 90, 181, 163, 149, 19, 87, 58, 19, 246, 123, 215, 118, 30, 245, 120, 55, + 11, 87, 169, 142, 97, 191, 71, 0, 16, 246, 157, 135, 190, 135, 150, 202, 177, 63, 98, 42, + 227, 46, 211, 10, 195, 150, 119, 161, 185, 180, 11, 95, 3, 174, 28, 208, 23, 87, 54, 122, + 108, 187, 241, 244, 165, 105, 114, 58, 192, 119, 16, 251, 71, 56, 69, 85, 55, 218, 67, 236, + 202, 227, 229, 183, 0, 78, 252, 254, 80, 219, 237, 173, 111, 123, 239, 161, 5, 191, 225, + 127, 236, 127, 235, 251, 183, 23, 190, 37, 14, 196, 69, 222, 35, 44, 241, 27, 251, 63, 1, + 176, 177, 7, 63, 15, 126, 120, 57, 229, 93, 29, 199, 66, 163, 9, 253, 248, 141, 255, 220, 0, + 134, 203, 173, 32, 70, 88, 234, 141, 239, 28, 112, 207, 52, 44, 174, 114, 6, 13, 111, 106, + 141, 127, 33, 254, 187, 58, 54, 94, 251, 143, 56, 40, 156, 173, 81, 10, 215, 248, 15, 164, + 130, 143, 127, 21, 207, 124, 136, 122, 82, 48, 232, 104, 126, 157, 70, 209, 133, 252, 194, + 214, 24, 23, 108, 139, 251, 227, 161, 233, 4, 151, 49, 211, 102, 200, 19, 8, 223, 24, 6, + 132, 141, 135, 251, 77, 140, 132, 65, 251, 144, 14, 248, 196, 254, 16, 107, 76, 221, 103, + 72, 123, 236, 77, 247, 0, 169, 72, 153, 133, 124, 46, 133, 177, 143, 237, 240, 63, 134, 36, + 23, 227, 27, 131, 237, 32, 54, 12, 11, 207, 37, 238, 22, 70, 134, 188, 194, 144, 15, 217, + 133, 226, 132, 175, 162, 174, 65, 82, 59, 95, 164, 28, 48, 116, 247, 76, 230, 139, 131, 133, + 88, 240, 106, 36, 10, 166, 16, 39, 1, 243, 38, 232, 182, 223, 209, 166, 21, 248, 26, 25, 81, + 7, 58, 18, 37, 211, 47, 115, 79, 215, 49, 59, 26, 177, 98, 178, 24, 12, 37, 120, 182, 108, + 192, 87, 126, 183, 239, 253, 151, 193, 225, 97, 1, 121, 183, 83, 4, 98, 248, 121, 136, 59, + 138, 221, 224, 243, 54, 110, 112, 133, 105, 60, 16, 120, 161, 57, 52, 1, 158, 252, 205, 232, + 33, 166, 113, 247, 72, 102, 239, 200, 217, 161, 106, 204, 15, 13, 173, 56, 110, 143, 120, + 223, 211, 52, 56, 57, 79, 219, 103, 124, 185, 161, 98, 169, 146, 189, 25, 200, 221, 152, + 174, 117, 99, 95, 57, 80, 124, 239, 62, 94, 67, 68, 198, 248, 165, 146, 19, 194, 129, 222, + 166, 116, 170, 106, 210, 184, 202, 175, 12, 197, 78, 144, 19, 2, 189, 198, 95, 95, 213, 120, + 109, 254, 150, 53, 218, 170, 222, 255, 15, 137, 54, 254, 87, 27, 42, 57, 172, 239, 85, 65, + 183, 110, 178, 85, 19, 180, 31, 23, 78, 82, 173, 107, 196, 179, 50, 147, 205, 245, 79, 77, + 185, 254, 193, 247, 73, 250, 167, 166, 185, 254, 113, 138, 56, 207, 114, 160, 84, 189, 180, + 205, 49, 41, 18, 128, 42, 183, 83, 19, 107, 27, 65, 3, 122, 238, 243, 77, 181, 11, 131, 62, + 69, 62, 67, 115, 18, 135, 164, 182, 31, 8, 41, 73, 2, 151, 118, 133, 68, 27, 184, 190, 129, + 9, 12, 105, 102, 13, 186, 151, 68, 115, 16, 160, 26, 131, 208, 48, 30, 1, 92, 87, 25, 100, + 195, 208, 152, 95, 53, 112, 222, 124, 35, 73, 73, 248, 34, 229, 10, 95, 120, 139, 36, 64, + 87, 196, 70, 177, 24, 132, 124, 45, 165, 152, 68, 205, 5, 33, 33, 202, 133, 22, 162, 251, + 53, 2, 111, 44, 152, 112, 197, 215, 68, 181, 33, 28, 47, 215, 64, 151, 130, 193, 8, 112, + 106, 160, 239, 184, 61, 175, 109, 146, 152, 249, 122, 73, 22, 251, 160, 138, 73, 240, 221, + 114, 130, 87, 185, 89, 130, 205, 69, 130, 83, 254, 56, 236, 80, 75, 57, 119, 1, 73, 48, 254, + 51, 163, 131, 21, 8, 154, 3, 241, 2, 5, 123, 79, 64, 179, 109, 226, 111, 27, 200, 136, 201, + 68, 67, 139, 148, 68, 168, 244, 43, 140, 52, 107, 140, 44, 8, 121, 42, 31, 19, 82, 33, 72, + 209, 144, 17, 96, 58, 249, 138, 226, 218, 241, 182, 167, 7, 29, 136, 31, 1, 243, 63, 167, + 141, 104, 185, 72, 232, 32, 234, 176, 94, 194, 190, 56, 36, 71, 194, 83, 62, 214, 202, 242, + 136, 97, 144, 248, 95, 144, 148, 21, 110, 190, 171, 11, 156, 178, 169, 200, 61, 69, 42, 80, + 38, 68, 125, 136, 105, 162, 107, 241, 205, 84, 41, 175, 101, 145, 137, 20, 242, 221, 63, + 109, 35, 135, 178, 208, 228, 8, 238, 224, 136, 66, 59, 93, 9, 107, 96, 86, 194, 194, 37, + 196, 58, 96, 210, 69, 164, 107, 10, 36, 72, 105, 21, 49, 11, 150, 27, 97, 20, 68, 105, 132, + 246, 123, 10, 12, 214, 6, 214, 135, 250, 56, 247, 42, 89, 169, 48, 194, 94, 242, 202, 216, + 114, 33, 144, 160, 204, 12, 136, 248, 11, 224, 193, 74, 243, 83, 93, 107, 26, 44, 245, 119, + 61, 182, 165, 117, 99, 107, 25, 36, 76, 186, 139, 28, 154, 103, 64, 74, 35, 31, 9, 111, 2, + 2, 9, 184, 229, 251, 184, 72, 123, 159, 75, 23, 35, 98, 18, 48, 85, 198, 150, 96, 16, 206, + 101, 13, 154, 46, 2, 51, 80, 207, 69, 52, 146, 130, 177, 51, 9, 104, 4, 178, 23, 120, 36, + 21, 59, 19, 30, 58, 250, 31, 174, 5, 215, 81, 210, 242, 49, 201, 121, 45, 235, 104, 140, 88, + 63, 24, 178, 160, 190, 158, 56, 35, 51, 222, 187, 69, 214, 147, 66, 66, 127, 85, 27, 114, + 123, 65, 78, 199, 21, 57, 181, 107, 114, 170, 93, 241, 192, 115, 167, 62, 240, 92, 97, 112, + 220, 220, 57, 195, 121, 47, 226, 98, 152, 202, 123, 177, 235, 252, 169, 231, 190, 204, 125, + 232, 193, 102, 53, 14, 238, 250, 166, 86, 188, 214, 206, 15, 197, 12, 188, 140, 210, 165, + 221, 50, 216, 151, 209, 190, 162, 152, 9, 255, 103, 100, 229, 248, 33, 151, 113, 54, 184, + 82, 201, 214, 101, 109, 26, 231, 202, 228, 240, 204, 184, 36, 6, 147, 42, 73, 230, 217, 243, + 181, 175, 235, 177, 40, 92, 226, 186, 92, 98, 192, 57, 147, 141, 23, 163, 132, 132, 102, 92, + 160, 173, 141, 62, 9, 89, 78, 32, 235, 85, 61, 149, 111, 8, 111, 241, 203, 7, 24, 191, 254, + 196, 75, 162, 49, 170, 120, 238, 170, 132, 195, 52, 21, 2, 157, 99, 34, 189, 5, 227, 68, 28, + 75, 90, 152, 128, 148, 153, 74, 24, 151, 124, 94, 16, 5, 108, 60, 176, 112, 28, 192, 159, + 54, 177, 66, 156, 244, 128, 164, 42, 100, 138, 226, 168, 152, 100, 122, 154, 67, 171, 15, + 57, 205, 105, 7, 220, 89, 36, 158, 41, 18, 85, 88, 22, 46, 57, 165, 231, 143, 74, 31, 45, + 27, 28, 152, 140, 77, 177, 250, 158, 19, 0, 3, 238, 185, 134, 208, 3, 84, 248, 1, 225, 110, + 141, 21, 161, 22, 21, 22, 86, 76, 78, 34, 247, 21, 20, 102, 102, 120, 76, 114, 220, 124, + 221, 203, 214, 139, 203, 69, 46, 213, 140, 49, 50, 167, 231, 124, 40, 88, 244, 151, 204, 40, + 75, 47, 141, 203, 192, 222, 201, 199, 145, 221, 97, 222, 221, 227, 203, 169, 0, 186, 139, + 119, 246, 165, 128, 117, 71, 157, 99, 11, 38, 79, 210, 112, 88, 161, 97, 47, 104, 248, 45, + 76, 23, 206, 102, 72, 128, 38, 153, 160, 66, 70, 172, 241, 67, 46, 25, 61, 5, 89, 34, 168, + 135, 28, 211, 67, 94, 55, 134, 242, 193, 186, 90, 56, 134, 28, 191, 83, 94, 111, 162, 199, + 203, 92, 69, 152, 148, 195, 50, 180, 237, 240, 59, 19, 249, 97, 14, 205, 97, 221, 97, 145, + 124, 243, 201, 62, 67, 93, 89, 87, 127, 41, 185, 206, 166, 20, 82, 86, 148, 172, 130, 7, + 225, 147, 225, 255, 75, 9, 113, 69, 47, 68, 57, 117, 86, 19, 185, 17, 214, 200, 30, 20, 208, + 35, 152, 164, 22, 202, 175, 93, 40, 190, 44, 15, 98, 137, 219, 244, 121, 90, 68, 194, 123, + 219, 149, 88, 196, 60, 69, 249, 68, 158, 238, 69, 66, 30, 122, 106, 2, 56, 22, 30, 155, 244, + 148, 244, 189, 47, 8, 73, 76, 59, 6, 145, 176, 123, 17, 193, 211, 130, 39, 152, 108, 164, + 51, 49, 253, 154, 177, 151, 158, 105, 228, 77, 227, 232, 34, 201, 52, 147, 211, 166, 22, + 210, 54, 137, 182, 92, 34, 210, 179, 41, 223, 56, 96, 157, 76, 35, 228, 239, 249, 110, 243, + 235, 198, 142, 125, 171, 109, 101, 92, 215, 218, 74, 183, 170, 175, 148, 109, 123, 91, 221, + 190, 221, 188, 122, 84, 29, 54, 79, 118, 155, 199, 187, 157, 170, 148, 174, 118, 251, 77, + 215, 78, 211, 52, 86, 157, 255, 163, 42, 158, 106, 90, 231, 123, 111, 54, 126, 221, 221, + 207, 176, 236, 143, 113, 154, 169, 148, 106, 59, 59, 155, 169, 220, 8, 59, 25, 51, 180, 253, + 136, 51, 255, 13, 51, 197, 70, 175, 163, 108, 43, 127, 146, 206, 255, 133, 148, 119, 248, + 27, 78, 1, 191, 232, 214, 204, 92, 160, 68, 25, 192, 36, 229, 246, 8, 17, 144, 222, 119, 32, + 206, 73, 102, 82, 217, 184, 151, 80, 72, 69, 137, 74, 199, 239, 208, 253, 59, 121, 188, 220, + 10, 60, 44, 126, 38, 2, 249, 35, 232, 241, 155, 240, 24, 51, 39, 92, 41, 68, 162, 211, 25, + 33, 106, 102, 114, 4, 145, 166, 235, 205, 243, 239, 201, 178, 146, 100, 117, 44, 203, 51, + 103, 51, 82, 211, 12, 250, 236, 148, 248, 165, 149, 158, 62, 216, 73, 37, 56, 22, 63, 157, + 84, 237, 78, 32, 27, 70, 210, 131, 70, 26, 158, 163, 75, 159, 81, 77, 12, 69, 83, 62, 50, + 151, 156, 32, 14, 191, 172, 85, 23, 46, 138, 179, 157, 174, 45, 66, 134, 181, 166, 35, 103, + 245, 204, 103, 237, 36, 69, 14, 22, 249, 142, 139, 120, 42, 146, 151, 52, 224, 44, 100, 206, + 69, 17, 163, 126, 33, 99, 154, 68, 76, 43, 126, 68, 46, 43, 152, 58, 205, 94, 15, 33, 9, + 106, 178, 71, 255, 131, 203, 205, 84, 122, 18, 194, 159, 232, 4, 143, 32, 149, 107, 117, + 156, 252, 20, 130, 36, 100, 64, 227, 158, 29, 40, 149, 135, 89, 99, 144, 69, 56, 48, 102, + 232, 144, 86, 228, 11, 146, 64, 119, 162, 10, 83, 182, 136, 51, 122, 74, 91, 216, 114, 87, + 97, 248, 238, 106, 225, 98, 197, 163, 144, 220, 77, 156, 81, 58, 0, 189, 96, 246, 87, 42, + 124, 226, 63, 217, 106, 222, 79, 148, 77, 220, 154, 79, 153, 162, 89, 124, 169, 225, 12, + 105, 150, 224, 59, 119, 251, 43, 94, 137, 183, 138, 92, 80, 110, 198, 74, 39, 128, 40, 105, + 185, 52, 245, 28, 115, 40, 71, 184, 212, 89, 88, 102, 222, 107, 241, 52, 249, 45, 37, 194, + 65, 22, 129, 113, 95, 12, 0, 190, 127, 162, 166, 188, 123, 244, 108, 249, 104, 255, 15, 143, + 73, 112, 158, 203, 168, 210, 83, 171, 108, 239, 171, 152, 191, 221, 101, 65, 133, 37, 4, + 205, 174, 137, 54, 191, 144, 184, 83, 229, 130, 222, 151, 116, 30, 62, 216, 53, 19, 254, 54, + 126, 201, 130, 165, 166, 194, 12, 60, 64, 207, 252, 60, 235, 244, 12, 8, 72, 222, 160, 161, + 131, 74, 44, 203, 91, 194, 13, 74, 174, 106, 243, 63, 112, 117, 90, 99, 20, 54, 206, 156, + 15, 52, 126, 200, 148, 117, 14, 247, 185, 46, 193, 103, 72, 215, 69, 4, 118, 73, 123, 114, + 0, 135, 52, 65, 148, 99, 234, 189, 35, 253, 126, 151, 134, 93, 115, 111, 60, 95, 241, 148, + 220, 11, 106, 222, 80, 206, 35, 232, 11, 235, 10, 51, 151, 84, 223, 235, 145, 172, 16, 120, + 82, 150, 43, 252, 193, 229, 242, 42, 238, 196, 227, 120, 246, 154, 96, 128, 216, 173, 75, + 134, 41, 120, 111, 228, 203, 114, 38, 26, 36, 170, 140, 191, 133, 233, 231, 117, 46, 43, + 236, 230, 92, 26, 35, 212, 35, 201, 43, 102, 115, 89, 67, 190, 136, 233, 211, 156, 25, 115, + 166, 79, 222, 12, 15, 227, 42, 209, 79, 102, 248, 159, 163, 190, 222, 51, 45, 229, 115, 98, + 148, 196, 94, 168, 85, 37, 229, 254, 79, 245, 113, 97, 203, 148, 230, 38, 30, 189, 124, 168, + 230, 84, 164, 32, 31, 102, 35, 239, 23, 136, 71, 117, 52, 174, 130, 22, 11, 250, 254, 242, + 119, 31, 32, 107, 82, 70, 9, 194, 98, 185, 23, 28, 137, 45, 97, 70, 255, 194, 149, 216, 217, + 59, 110, 20, 227, 211, 244, 48, 150, 1, 123, 23, 57, 146, 246, 38, 30, 179, 111, 36, 147, + 175, 225, 89, 216, 120, 71, 185, 224, 23, 249, 66, 194, 75, 76, 50, 113, 34, 203, 250, 96, + 237, 158, 200, 52, 71, 38, 77, 82, 16, 194, 35, 102, 44, 143, 179, 244, 90, 20, 109, 11, 37, + 67, 196, 21, 242, 23, 180, 140, 222, 186, 89, 221, 96, 3, 55, 19, 55, 197, 78, 96, 90, 48, + 2, 106, 197, 8, 76, 133, 84, 248, 113, 154, 31, 35, 75, 174, 160, 88, 217, 45, 44, 235, 153, + 168, 137, 223, 13, 217, 179, 69, 103, 60, 214, 1, 136, 38, 30, 21, 19, 243, 41, 62, 34, 156, + 149, 181, 193, 137, 234, 17, 110, 143, 111, 88, 26, 59, 39, 223, 129, 164, 78, 148, 96, 185, + 70, 90, 86, 74, 163, 139, 184, 70, 212, 6, 149, 190, 138, 79, 81, 137, 139, 33, 204, 250, + 156, 34, 165, 173, 18, 220, 243, 122, 33, 222, 32, 77, 225, 28, 57, 129, 188, 131, 136, 55, + 3, 132, 139, 93, 84, 74, 223, 137, 170, 183, 96, 131, 215, 19, 161, 114, 229, 22, 98, 134, + 35, 178, 35, 139, 114, 83, 214, 199, 37, 30, 5, 193, 188, 165, 187, 193, 20, 177, 52, 167, + 71, 78, 86, 25, 103, 159, 167, 214, 201, 2, 188, 51, 119, 156, 97, 70, 176, 34, 205, 79, 84, + 92, 170, 71, 166, 179, 109, 175, 213, 81, 231, 105, 183, 170, 32, 76, 67, 211, 228, 101, + 144, 90, 100, 94, 78, 50, 229, 249, 110, 163, 84, 223, 218, 170, 31, 166, 214, 218, 170, + 107, 237, 24, 254, 185, 125, 187, 217, 99, 223, 56, 82, 167, 25, 84, 235, 180, 232, 182, + 227, 120, 116, 170, 173, 38, 3, 177, 96, 171, 27, 65, 38, 243, 62, 211, 175, 78, 91, 238, + 242, 193, 132, 190, 149, 88, 150, 247, 227, 190, 249, 162, 71, 186, 158, 191, 120, 90, 109, + 254, 43, 192, 0, 123, 34, 40, 30, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, + 101, 110, 100, 111, 98, 106, 13, 57, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, + 110, 116, 101, 110, 116, 115, 32, 57, 52, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, + 51, 52, 52, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, + 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, + 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 51, + 32, 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, + 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, + 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 52, 51, 47, 84, 121, 112, 101, 47, + 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 57, 52, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, + 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 48, 57, 51, 62, 62, 115, 116, 114, + 101, 97, 109, 13, 10, 72, 137, 156, 87, 109, 143, 20, 185, 17, 254, 62, 191, 162, 63, 78, + 163, 155, 166, 237, 182, 251, 69, 58, 157, 116, 44, 40, 2, 1, 225, 114, 147, 16, 9, 78, 10, + 100, 152, 101, 97, 217, 44, 203, 18, 238, 254, 125, 92, 229, 170, 114, 217, 221, 189, 204, + 69, 72, 203, 180, 93, 111, 174, 215, 167, 238, 191, 120, 115, 115, 91, 253, 248, 227, 253, + 103, 103, 143, 31, 86, 109, 245, 211, 79, 15, 30, 158, 85, 155, 7, 251, 77, 91, 193, 191, + 155, 243, 205, 253, 253, 190, 173, 140, 173, 246, 199, 77, 219, 76, 211, 52, 226, 133, 169, + 236, 228, 154, 169, 175, 6, 107, 27, 87, 237, 63, 109, 94, 109, 93, 221, 111, 77, 253, 219, + 254, 9, 240, 152, 202, 116, 205, 132, 108, 198, 54, 214, 217, 192, 180, 63, 108, 182, 85, + 189, 255, 176, 217, 153, 201, 54, 109, 55, 86, 59, 211, 55, 157, 77, 23, 145, 49, 114, 141, + 125, 32, 25, 170, 93, 239, 219, 166, 119, 37, 13, 11, 223, 9, 93, 33, 234, 209, 126, 243, + 57, 168, 182, 141, 233, 171, 126, 28, 154, 174, 175, 2, 133, 15, 127, 93, 48, 248, 230, 221, + 230, 229, 189, 234, 10, 94, 170, 116, 102, 15, 100, 222, 169, 109, 220, 24, 95, 248, 176, + 222, 249, 109, 83, 239, 198, 237, 132, 239, 12, 58, 126, 1, 45, 221, 216, 12, 86, 180, 76, + 141, 115, 167, 107, 33, 94, 209, 34, 214, 163, 100, 63, 42, 251, 59, 59, 54, 237, 120, 186, + 104, 98, 86, 15, 216, 135, 16, 189, 175, 221, 246, 93, 189, 179, 65, 209, 206, 118, 110, + 123, 81, 239, 140, 217, 94, 133, 211, 127, 215, 118, 251, 159, 64, 241, 41, 156, 100, 36, + 199, 112, 224, 183, 55, 245, 152, 174, 233, 6, 127, 191, 9, 191, 13, 94, 127, 4, 7, 33, 231, + 45, 252, 34, 162, 203, 112, 147, 180, 36, 154, 67, 248, 34, 146, 3, 27, 245, 150, 127, 0, + 41, 10, 249, 42, 202, 241, 252, 75, 189, 155, 146, 233, 99, 250, 246, 110, 123, 29, 120, + 216, 202, 107, 100, 131, 95, 72, 81, 42, 68, 209, 112, 75, 223, 172, 23, 222, 44, 161, 61, + 193, 185, 131, 195, 228, 4, 231, 162, 200, 55, 224, 144, 223, 235, 221, 160, 53, 210, 49, + 153, 234, 227, 15, 136, 3, 24, 0, 6, 223, 238, 194, 143, 91, 113, 12, 28, 145, 151, 61, 70, + 5, 217, 225, 117, 240, 98, 214, 19, 124, 14, 158, 5, 154, 115, 16, 136, 68, 64, 0, 174, 19, + 93, 120, 74, 209, 240, 241, 135, 202, 0, 207, 162, 193, 89, 160, 32, 197, 74, 244, 190, 165, + 99, 206, 8, 19, 157, 156, 4, 167, 184, 52, 181, 29, 201, 129, 187, 46, 212, 101, 200, 214, + 96, 102, 51, 98, 249, 234, 250, 49, 225, 189, 45, 26, 191, 27, 39, 183, 125, 12, 103, 156, + 50, 198, 228, 145, 133, 239, 60, 178, 110, 57, 174, 64, 168, 227, 90, 50, 254, 23, 180, 128, + 228, 131, 42, 1, 32, 58, 162, 196, 157, 233, 144, 148, 14, 81, 252, 172, 28, 86, 101, 34, + 249, 5, 157, 170, 8, 44, 90, 245, 73, 135, 234, 34, 70, 219, 154, 36, 71, 107, 187, 169, + 149, 130, 143, 202, 71, 74, 40, 56, 156, 253, 109, 188, 248, 91, 138, 6, 173, 148, 178, 250, + 170, 227, 127, 40, 15, 72, 44, 120, 3, 62, 225, 14, 152, 14, 82, 32, 32, 21, 5, 98, 6, 64, + 102, 0, 77, 74, 135, 232, 4, 224, 191, 162, 236, 143, 95, 71, 250, 74, 173, 32, 55, 75, 222, + 3, 10, 254, 128, 18, 106, 106, 99, 78, 78, 39, 179, 146, 78, 216, 39, 166, 224, 62, 211, + 210, 231, 73, 201, 84, 244, 136, 238, 132, 84, 98, 150, 247, 153, 59, 226, 197, 183, 172, + 240, 110, 84, 57, 117, 68, 140, 53, 140, 127, 226, 173, 25, 84, 89, 167, 58, 139, 28, 96, + 195, 145, 178, 62, 89, 134, 4, 146, 91, 16, 21, 238, 213, 221, 66, 146, 75, 103, 30, 241, + 78, 119, 191, 133, 92, 202, 26, 203, 215, 90, 245, 0, 30, 29, 146, 180, 131, 83, 221, 247, + 18, 163, 13, 220, 64, 115, 81, 182, 113, 32, 126, 189, 165, 193, 115, 59, 115, 18, 81, 228, + 110, 189, 162, 135, 135, 139, 191, 215, 102, 251, 20, 195, 253, 34, 60, 104, 251, 186, 174, + 197, 4, 169, 25, 177, 56, 235, 21, 131, 147, 74, 149, 79, 221, 1, 6, 82, 118, 228, 204, 44, + 109, 82, 80, 103, 32, 48, 98, 199, 177, 241, 1, 214, 248, 198, 219, 232, 181, 47, 96, 213, + 173, 2, 69, 72, 231, 155, 161, 55, 213, 46, 145, 145, 200, 159, 185, 205, 223, 136, 211, + 162, 251, 126, 8, 127, 91, 174, 4, 64, 94, 118, 154, 178, 232, 88, 236, 167, 61, 254, 223, + 209, 84, 27, 230, 3, 82, 250, 185, 228, 48, 5, 141, 12, 180, 149, 49, 77, 235, 192, 198, 33, + 224, 146, 128, 57, 34, 106, 251, 87, 1, 206, 94, 177, 64, 79, 186, 124, 204, 37, 148, 255, + 145, 131, 245, 67, 45, 138, 57, 123, 150, 33, 134, 143, 217, 25, 95, 157, 65, 12, 207, 81, + 130, 116, 186, 228, 190, 64, 55, 146, 21, 121, 1, 43, 48, 16, 19, 112, 92, 79, 63, 32, 252, + 198, 77, 139, 228, 129, 42, 114, 53, 57, 1, 60, 221, 71, 71, 47, 150, 106, 16, 168, 75, 213, + 184, 197, 113, 177, 94, 157, 64, 5, 223, 215, 164, 123, 169, 189, 231, 209, 49, 157, 109, + 124, 123, 103, 120, 64, 134, 167, 54, 142, 31, 243, 0, 233, 73, 39, 213, 21, 51, 238, 50, + 13, 194, 183, 117, 254, 30, 252, 45, 16, 135, 158, 116, 205, 101, 130, 253, 152, 40, 25, + 110, 150, 211, 92, 60, 62, 211, 117, 37, 125, 131, 122, 39, 134, 129, 95, 171, 51, 94, 138, + 147, 123, 23, 6, 152, 59, 174, 206, 14, 182, 157, 207, 18, 68, 139, 135, 249, 123, 138, 231, + 232, 137, 30, 201, 175, 51, 48, 60, 27, 4, 210, 97, 124, 62, 64, 74, 139, 216, 36, 180, 6, + 117, 2, 33, 79, 219, 91, 72, 77, 162, 144, 220, 145, 38, 123, 193, 19, 88, 119, 52, 239, + 178, 169, 187, 168, 16, 188, 217, 138, 27, 31, 6, 55, 202, 252, 74, 99, 70, 101, 134, 30, + 51, 148, 201, 9, 3, 8, 64, 226, 30, 218, 185, 229, 41, 33, 86, 234, 220, 152, 65, 62, 74, + 10, 78, 8, 149, 20, 9, 235, 138, 74, 73, 23, 167, 147, 69, 81, 175, 102, 70, 68, 151, 140, + 64, 78, 152, 102, 230, 180, 105, 102, 39, 242, 239, 254, 30, 77, 203, 213, 225, 227, 83, + 106, 93, 74, 17, 192, 113, 135, 48, 102, 54, 86, 250, 182, 177, 97, 82, 228, 83, 101, 97, + 172, 192, 208, 46, 198, 74, 191, 125, 38, 41, 127, 67, 86, 199, 14, 71, 205, 57, 188, 46, + 205, 14, 200, 30, 176, 161, 129, 169, 197, 181, 215, 218, 198, 246, 119, 224, 46, 187, 130, + 187, 38, 174, 251, 136, 187, 166, 19, 113, 215, 148, 151, 205, 164, 43, 68, 160, 98, 162, + 253, 115, 88, 124, 90, 128, 65, 83, 49, 149, 174, 9, 16, 75, 140, 98, 79, 58, 79, 34, 86, + 55, 50, 105, 101, 129, 104, 117, 37, 99, 199, 196, 170, 89, 65, 91, 162, 34, 31, 107, 67, + 86, 146, 240, 249, 129, 59, 7, 139, 100, 247, 195, 165, 20, 119, 106, 22, 151, 202, 255, + 218, 167, 166, 203, 56, 11, 45, 9, 147, 48, 175, 160, 33, 228, 146, 169, 60, 228, 209, 99, + 12, 18, 139, 42, 96, 28, 74, 246, 175, 106, 161, 200, 248, 222, 23, 135, 171, 221, 209, 235, + 106, 59, 173, 67, 250, 164, 34, 189, 5, 68, 158, 243, 252, 3, 154, 88, 33, 220, 231, 62, + 151, 219, 17, 254, 64, 57, 64, 72, 13, 205, 171, 88, 177, 140, 44, 245, 98, 195, 57, 104, + 191, 173, 237, 75, 36, 114, 200, 246, 158, 1, 235, 175, 95, 42, 191, 46, 149, 223, 203, 122, + 162, 113, 203, 77, 84, 154, 152, 203, 243, 35, 95, 66, 208, 68, 233, 143, 49, 218, 146, 185, + 140, 151, 139, 233, 66, 184, 32, 174, 107, 160, 142, 139, 240, 155, 200, 79, 156, 170, 96, + 160, 148, 22, 75, 198, 44, 148, 166, 33, 59, 128, 63, 70, 130, 217, 19, 64, 190, 226, 0, + 178, 145, 189, 226, 6, 130, 79, 73, 241, 172, 81, 16, 179, 244, 238, 133, 74, 124, 195, 27, + 148, 159, 55, 176, 229, 34, 0, 74, 121, 241, 85, 194, 193, 112, 46, 227, 0, 156, 247, 65, + 234, 79, 15, 168, 174, 0, 14, 44, 46, 87, 70, 241, 225, 57, 166, 232, 56, 241, 14, 185, 175, + 47, 36, 229, 37, 43, 121, 171, 64, 86, 141, 242, 88, 148, 32, 70, 241, 163, 14, 108, 199, + 232, 133, 242, 94, 202, 81, 242, 252, 64, 213, 35, 207, 203, 83, 29, 106, 188, 99, 232, 63, + 206, 128, 255, 234, 206, 96, 101, 179, 232, 84, 255, 165, 239, 204, 243, 116, 38, 121, 166, + 241, 3, 92, 232, 71, 71, 97, 150, 151, 13, 126, 127, 204, 185, 25, 186, 179, 157, 238, 226, + 248, 57, 111, 96, 93, 50, 62, 171, 49, 184, 72, 29, 86, 252, 86, 228, 186, 203, 103, 217, + 66, 20, 21, 74, 227, 156, 255, 78, 210, 39, 132, 43, 179, 84, 3, 163, 66, 48, 94, 101, 200, + 8, 173, 57, 234, 212, 103, 28, 97, 74, 7, 72, 123, 1, 39, 255, 1, 237, 156, 233, 50, 76, + 200, 249, 49, 171, 101, 243, 157, 65, 27, 65, 147, 56, 111, 101, 222, 50, 228, 180, 37, 228, + 180, 38, 223, 75, 172, 57, 17, 160, 88, 83, 204, 56, 243, 221, 157, 32, 99, 147, 69, 75, 91, + 50, 207, 29, 195, 19, 115, 158, 61, 57, 48, 183, 235, 93, 178, 204, 157, 178, 248, 76, 234, + 183, 133, 55, 85, 14, 185, 147, 51, 8, 210, 186, 220, 37, 5, 200, 195, 229, 108, 187, 203, + 202, 136, 1, 194, 56, 135, 7, 107, 213, 117, 39, 60, 40, 202, 44, 235, 41, 223, 155, 130, + 92, 186, 171, 29, 16, 30, 162, 252, 149, 86, 168, 27, 122, 178, 236, 6, 236, 219, 18, 36, + 172, 117, 73, 155, 47, 157, 33, 129, 205, 184, 0, 6, 150, 193, 184, 75, 104, 96, 31, 62, + 231, 197, 152, 150, 36, 51, 59, 92, 154, 50, 46, 31, 50, 194, 155, 150, 155, 132, 136, 190, + 168, 210, 101, 23, 124, 20, 71, 171, 238, 36, 17, 144, 190, 114, 206, 153, 10, 205, 226, + 114, 201, 216, 239, 41, 140, 77, 208, 74, 23, 188, 33, 3, 4, 220, 205, 56, 142, 245, 172, + 117, 126, 227, 36, 139, 27, 30, 228, 227, 123, 21, 106, 5, 15, 8, 139, 241, 2, 26, 248, 139, + 241, 43, 181, 151, 70, 199, 18, 236, 147, 126, 27, 216, 165, 108, 216, 74, 61, 150, 165, + 218, 226, 249, 18, 70, 243, 240, 38, 174, 48, 122, 149, 63, 185, 57, 20, 131, 133, 25, 175, + 100, 254, 197, 195, 89, 29, 250, 211, 230, 68, 164, 92, 152, 122, 133, 207, 45, 33, 113, + 128, 111, 88, 112, 40, 147, 177, 149, 158, 30, 130, 165, 46, 21, 4, 48, 217, 88, 54, 148, + 89, 226, 188, 85, 248, 221, 43, 22, 213, 51, 140, 206, 255, 25, 16, 145, 233, 98, 138, 114, + 187, 16, 72, 156, 0, 240, 172, 143, 207, 52, 157, 52, 255, 83, 15, 47, 90, 144, 26, 102, 94, + 181, 109, 160, 93, 155, 101, 62, 27, 100, 38, 195, 67, 170, 65, 29, 37, 103, 196, 133, 138, + 223, 178, 0, 159, 193, 169, 32, 237, 121, 56, 194, 153, 251, 180, 65, 51, 239, 239, 247, 93, + 101, 108, 181, 63, 110, 204, 224, 26, 59, 248, 170, 133, 50, 10, 228, 251, 15, 155, 71, 251, + 141, 49, 125, 227, 170, 161, 53, 205, 208, 87, 109, 227, 198, 248, 231, 230, 221, 230, 248, + 221, 187, 113, 228, 203, 110, 48, 141, 183, 234, 218, 141, 227, 42, 235, 93, 119, 81, 165, + 29, 210, 177, 235, 76, 99, 51, 206, 181, 219, 207, 27, 99, 109, 99, 250, 202, 122, 104, 22, + 6, 77, 50, 46, 112, 132, 235, 151, 247, 170, 171, 205, 131, 61, 56, 164, 37, 135, 180, 205, + 52, 77, 65, 78, 248, 103, 42, 97, 29, 155, 33, 220, 126, 10, 209, 125, 20, 54, 194, 6, 221, + 12, 158, 12, 190, 250, 5, 84, 116, 93, 211, 143, 172, 34, 80, 247, 238, 116, 29, 204, 155, + 116, 60, 14, 242, 159, 213, 187, 126, 251, 2, 130, 246, 183, 144, 136, 127, 173, 119, 110, + 251, 15, 200, 26, 184, 123, 14, 249, 249, 151, 0, 252, 49, 216, 103, 33, 31, 240, 62, 177, + 60, 13, 44, 64, 248, 115, 184, 70, 226, 51, 172, 131, 71, 184, 205, 250, 116, 252, 144, 22, + 15, 245, 20, 59, 217, 166, 179, 226, 173, 174, 105, 79, 127, 138, 240, 166, 167, 236, 33, + 175, 65, 223, 63, 185, 34, 224, 35, 234, 69, 123, 229, 61, 240, 227, 87, 232, 46, 200, 2, + 143, 6, 74, 252, 128, 43, 124, 225, 243, 100, 105, 52, 163, 91, 50, 195, 181, 190, 233, 116, + 212, 138, 188, 14, 169, 178, 146, 184, 112, 179, 146, 181, 43, 76, 225, 194, 141, 144, 35, + 120, 28, 225, 128, 230, 90, 190, 76, 73, 25, 130, 31, 50, 53, 56, 120, 28, 151, 220, 108, + 238, 202, 202, 14, 212, 171, 164, 68, 232, 145, 101, 229, 0, 209, 35, 29, 65, 189, 89, 204, + 252, 101, 29, 204, 75, 58, 196, 133, 40, 216, 143, 202, 248, 206, 142, 77, 251, 39, 172, + 103, 102, 177, 254, 101, 173, 26, 235, 251, 4, 137, 243, 1, 115, 205, 61, 77, 150, 216, 149, + 29, 64, 216, 178, 109, 247, 168, 6, 155, 158, 57, 197, 180, 93, 192, 244, 113, 136, 3, 221, + 65, 15, 46, 189, 175, 208, 102, 53, 172, 110, 17, 102, 130, 173, 135, 198, 87, 142, 121, 5, + 208, 18, 239, 131, 186, 67, 149, 130, 12, 15, 117, 177, 36, 28, 213, 196, 81, 181, 112, 167, + 183, 109, 219, 248, 62, 186, 251, 87, 153, 154, 104, 8, 254, 17, 164, 183, 176, 80, 208, 98, + 217, 169, 205, 47, 125, 178, 23, 186, 19, 151, 182, 46, 143, 87, 193, 182, 184, 176, 117, + 107, 251, 90, 167, 112, 226, 12, 92, 47, 109, 42, 124, 166, 118, 136, 224, 200, 93, 80, 124, + 153, 2, 97, 77, 249, 206, 132, 79, 211, 114, 214, 6, 0, 106, 16, 128, 50, 254, 79, 43, 144, + 184, 239, 80, 39, 16, 116, 158, 160, 164, 128, 51, 134, 98, 113, 243, 27, 243, 252, 10, 151, + 67, 158, 89, 62, 143, 128, 207, 173, 138, 168, 83, 139, 139, 103, 9, 187, 125, 228, 183, + 223, 109, 207, 27, 94, 55, 175, 49, 207, 162, 107, 64, 71, 89, 58, 37, 108, 214, 129, 29, + 102, 182, 226, 195, 126, 135, 167, 92, 147, 91, 116, 125, 219, 73, 67, 168, 36, 215, 103, + 239, 161, 69, 229, 88, 20, 17, 239, 117, 109, 96, 131, 229, 11, 91, 97, 139, 124, 150, 63, + 225, 7, 220, 91, 60, 54, 2, 148, 224, 137, 95, 211, 174, 170, 176, 83, 238, 204, 144, 42, + 96, 79, 79, 114, 149, 154, 190, 84, 194, 122, 163, 170, 88, 62, 62, 161, 100, 94, 103, 20, + 240, 83, 9, 57, 80, 62, 194, 155, 228, 88, 185, 146, 4, 81, 49, 132, 100, 189, 196, 61, 247, + 174, 204, 76, 96, 87, 34, 205, 176, 49, 5, 37, 249, 147, 239, 215, 240, 169, 223, 118, 228, + 75, 229, 231, 105, 217, 207, 29, 30, 115, 179, 218, 225, 222, 54, 84, 193, 108, 222, 219, + 100, 114, 89, 194, 232, 190, 139, 16, 158, 151, 57, 83, 102, 14, 153, 197, 72, 56, 217, 77, + 212, 243, 189, 200, 56, 69, 47, 179, 68, 218, 19, 58, 229, 146, 234, 165, 203, 218, 191, + 167, 149, 33, 173, 141, 201, 141, 177, 144, 98, 39, 70, 66, 85, 55, 164, 156, 36, 67, 108, + 100, 147, 52, 234, 126, 181, 71, 24, 236, 108, 214, 235, 177, 152, 122, 62, 123, 81, 133, + 248, 12, 188, 35, 43, 145, 228, 12, 106, 149, 197, 133, 171, 74, 183, 24, 23, 84, 189, 222, + 34, 216, 66, 235, 65, 75, 105, 63, 201, 121, 93, 7, 50, 26, 6, 174, 152, 6, 206, 228, 227, + 192, 25, 110, 31, 105, 34, 192, 215, 226, 76, 112, 197, 16, 119, 106, 217, 3, 38, 217, 106, + 225, 254, 64, 43, 25, 135, 133, 25, 222, 208, 8, 5, 203, 228, 145, 223, 162, 121, 210, 87, + 144, 72, 170, 253, 189, 244, 245, 49, 61, 134, 155, 109, 63, 232, 141, 147, 14, 102, 185, 5, + 135, 178, 197, 2, 225, 71, 114, 8, 92, 168, 68, 130, 207, 39, 64, 19, 27, 10, 7, 252, 86, + 81, 159, 24, 194, 184, 114, 170, 32, 222, 175, 69, 4, 198, 240, 80, 187, 178, 60, 114, 78, + 149, 149, 202, 53, 255, 119, 6, 133, 13, 114, 251, 42, 156, 63, 225, 61, 35, 174, 154, 80, + 195, 58, 177, 230, 101, 161, 211, 234, 55, 213, 42, 131, 233, 142, 48, 14, 71, 135, 14, 99, + 195, 187, 67, 86, 162, 51, 177, 152, 138, 74, 77, 157, 144, 40, 37, 139, 150, 106, 219, 49, + 213, 202, 132, 214, 99, 43, 45, 23, 110, 128, 117, 110, 101, 191, 136, 151, 107, 43, 198, + 42, 171, 171, 166, 9, 86, 26, 60, 53, 97, 167, 8, 91, 150, 190, 28, 65, 248, 50, 223, 218, + 85, 56, 141, 119, 43, 198, 172, 40, 164, 203, 37, 169, 119, 92, 61, 122, 118, 86, 109, 254, + 39, 192, 0, 62, 87, 101, 241, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, + 110, 100, 111, 98, 106, 13, 57, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, + 116, 101, 110, 116, 115, 32, 57, 54, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, + 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, + 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, + 52, 52, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, + 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, + 56, 50, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, + 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, + 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 52, 52, 47, 84, 121, 112, 101, 47, 80, + 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 57, 54, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, + 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 55, 54, 50, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 72, 137, 156, 87, 219, 110, 27, 71, 18, 125, 231, 87, 204, 35, 39, 8, 199, + 236, 158, 233, 185, 0, 65, 128, 68, 118, 22, 9, 16, 32, 139, 37, 144, 135, 100, 31, 164, + 165, 41, 41, 150, 104, 155, 182, 86, 201, 126, 253, 118, 117, 87, 85, 87, 245, 244, 80, 140, + 97, 88, 224, 244, 165, 186, 174, 167, 78, 189, 250, 229, 250, 244, 185, 250, 230, 155, 87, + 63, 95, 253, 248, 186, 218, 86, 223, 126, 251, 253, 235, 171, 106, 245, 253, 110, 181, 173, + 224, 223, 233, 118, 245, 106, 183, 219, 86, 198, 86, 187, 195, 106, 219, 76, 211, 52, 134, + 13, 83, 217, 169, 107, 166, 190, 26, 172, 109, 186, 106, 247, 184, 250, 109, 221, 213, 253, + 218, 214, 255, 222, 253, 4, 119, 76, 101, 218, 102, 10, 215, 140, 109, 108, 103, 253, 165, + 221, 126, 181, 174, 234, 221, 31, 171, 141, 153, 108, 179, 109, 199, 106, 99, 250, 166, 181, + 105, 35, 94, 140, 183, 198, 222, 31, 25, 170, 77, 239, 182, 77, 223, 229, 103, 72, 248, 134, + 207, 101, 162, 222, 236, 86, 31, 87, 198, 141, 141, 233, 171, 126, 28, 154, 182, 175, 90, + 59, 54, 219, 177, 50, 157, 215, 248, 244, 118, 245, 235, 87, 213, 17, 76, 21, 143, 42, 11, + 233, 242, 180, 109, 186, 49, 154, 248, 161, 238, 214, 215, 245, 198, 172, 63, 213, 155, 41, + 254, 121, 91, 111, 236, 122, 239, 215, 171, 122, 51, 116, 235, 27, 255, 235, 47, 255, 11, + 63, 223, 123, 159, 156, 234, 17, 191, 158, 235, 141, 91, 223, 251, 207, 207, 240, 227, 142, + 47, 241, 103, 16, 22, 215, 194, 51, 240, 222, 7, 255, 195, 5, 33, 32, 236, 191, 245, 102, + 140, 123, 15, 44, 246, 189, 255, 108, 215, 7, 22, 23, 182, 143, 250, 243, 169, 230, 103, 64, + 92, 212, 107, 99, 76, 82, 71, 104, 125, 67, 170, 60, 224, 171, 65, 241, 101, 93, 65, 57, + 126, 244, 93, 58, 75, 138, 193, 139, 85, 200, 12, 31, 149, 127, 94, 226, 243, 161, 11, 49, + 7, 159, 255, 4, 130, 65, 9, 208, 244, 72, 102, 248, 7, 38, 255, 194, 21, 40, 13, 155, 143, + 112, 42, 252, 129, 99, 41, 60, 247, 193, 2, 80, 227, 72, 58, 131, 182, 13, 184, 81, 202, + 224, 157, 32, 253, 154, 4, 161, 23, 167, 41, 26, 201, 78, 9, 7, 194, 81, 25, 255, 73, 58, + 127, 143, 102, 135, 213, 255, 212, 54, 168, 9, 27, 41, 109, 62, 250, 175, 39, 82, 139, 77, + 187, 143, 242, 45, 132, 24, 34, 20, 61, 183, 245, 25, 238, 154, 209, 59, 229, 181, 119, 202, + 53, 155, 203, 119, 65, 7, 189, 18, 164, 133, 215, 170, 26, 109, 98, 35, 120, 229, 129, 220, + 5, 234, 193, 170, 206, 183, 15, 156, 46, 121, 182, 131, 162, 160, 222, 17, 191, 56, 49, 56, + 0, 222, 118, 35, 252, 118, 11, 107, 172, 5, 8, 193, 40, 180, 104, 226, 166, 245, 165, 236, + 11, 212, 155, 30, 12, 221, 123, 67, 223, 212, 67, 60, 214, 198, 116, 55, 174, 237, 214, 63, + 194, 2, 165, 129, 211, 47, 186, 46, 84, 205, 137, 227, 14, 95, 37, 253, 225, 100, 144, 17, + 143, 197, 5, 86, 54, 70, 15, 130, 3, 161, 163, 92, 119, 133, 252, 119, 193, 237, 150, 242, + 5, 174, 193, 175, 71, 170, 186, 240, 131, 238, 138, 61, 184, 111, 133, 198, 152, 129, 84, + 147, 81, 171, 164, 42, 107, 246, 145, 53, 131, 99, 180, 124, 214, 42, 170, 103, 139, 142, + 14, 126, 30, 56, 161, 246, 136, 108, 10, 99, 238, 49, 70, 185, 112, 9, 112, 11, 238, 8, 107, + 10, 19, 130, 239, 15, 178, 0, 117, 164, 224, 49, 240, 51, 149, 220, 109, 10, 38, 40, 4, 55, + 15, 236, 89, 14, 72, 146, 131, 22, 247, 248, 89, 130, 232, 79, 181, 217, 210, 167, 25, 164, + 186, 135, 90, 225, 180, 74, 160, 62, 75, 4, 46, 80, 194, 148, 4, 109, 187, 175, 188, 27, 73, + 91, 40, 136, 61, 151, 14, 220, 124, 186, 164, 60, 169, 142, 99, 229, 144, 55, 14, 2, 178, + 49, 121, 18, 254, 196, 34, 36, 108, 1, 73, 7, 85, 192, 49, 55, 97, 189, 245, 95, 219, 232, + 35, 19, 159, 9, 82, 66, 48, 89, 13, 225, 73, 183, 54, 225, 70, 204, 35, 87, 186, 209, 212, + 237, 160, 138, 119, 40, 23, 111, 247, 37, 197, 219, 95, 82, 186, 125, 225, 218, 44, 127, 85, + 160, 193, 156, 20, 106, 209, 102, 241, 172, 108, 174, 116, 32, 65, 23, 197, 36, 168, 36, + 172, 224, 235, 71, 242, 82, 4, 111, 213, 90, 93, 74, 180, 189, 44, 134, 204, 252, 50, 195, + 176, 221, 188, 122, 251, 232, 103, 89, 147, 173, 185, 184, 43, 246, 178, 39, 198, 78, 19, + 174, 255, 190, 246, 249, 250, 93, 201, 49, 86, 244, 139, 223, 235, 218, 210, 13, 72, 110, + 202, 221, 8, 24, 232, 97, 216, 164, 122, 85, 253, 213, 88, 217, 95, 225, 88, 178, 21, 11, + 205, 58, 165, 39, 57, 9, 206, 42, 198, 3, 11, 51, 24, 130, 197, 96, 66, 18, 38, 202, 148, 9, + 142, 172, 125, 186, 58, 21, 196, 77, 221, 220, 33, 145, 9, 20, 216, 64, 60, 191, 227, 76, 3, + 43, 110, 24, 70, 68, 130, 8, 30, 146, 213, 197, 164, 235, 98, 234, 138, 205, 26, 214, 99, + 226, 19, 6, 204, 42, 38, 113, 19, 93, 50, 83, 177, 100, 64, 204, 94, 155, 205, 174, 72, 70, + 10, 71, 74, 170, 105, 205, 66, 122, 227, 222, 83, 112, 129, 76, 19, 185, 59, 11, 191, 203, + 184, 27, 158, 179, 254, 133, 222, 255, 111, 163, 29, 182, 237, 4, 232, 134, 19, 179, 224, + 217, 44, 23, 28, 45, 190, 64, 231, 205, 164, 219, 221, 162, 240, 95, 124, 190, 113, 164, + 143, 216, 42, 224, 55, 62, 144, 81, 185, 224, 185, 80, 163, 68, 151, 56, 23, 225, 213, 246, + 11, 10, 152, 93, 105, 156, 106, 102, 44, 236, 142, 219, 231, 139, 111, 217, 203, 209, 2, + 238, 207, 26, 151, 19, 107, 228, 58, 56, 200, 53, 166, 2, 172, 251, 186, 236, 107, 103, 155, + 108, 41, 201, 140, 41, 96, 252, 66, 53, 127, 98, 68, 79, 77, 89, 236, 112, 194, 83, 137, + 159, 41, 66, 120, 246, 70, 75, 63, 211, 85, 98, 58, 220, 0, 7, 121, 208, 160, 35, 64, 41, + 246, 123, 178, 226, 239, 2, 19, 38, 91, 17, 153, 216, 137, 59, 116, 98, 44, 122, 120, 251, + 28, 56, 253, 16, 217, 44, 17, 11, 173, 70, 76, 135, 175, 107, 130, 42, 30, 41, 139, 64, 118, + 233, 124, 81, 64, 44, 221, 96, 35, 164, 102, 78, 60, 132, 138, 34, 243, 115, 62, 105, 140, + 66, 139, 73, 82, 178, 71, 154, 51, 5, 115, 133, 7, 246, 232, 26, 34, 82, 5, 174, 183, 105, + 161, 228, 55, 62, 164, 100, 22, 21, 79, 191, 222, 248, 47, 88, 1, 15, 255, 193, 143, 45, 96, + 28, 247, 56, 34, 127, 56, 66, 182, 138, 83, 96, 62, 182, 17, 103, 56, 204, 51, 194, 203, + 178, 114, 77, 173, 184, 144, 159, 189, 132, 239, 248, 99, 207, 114, 218, 3, 137, 119, 44, + 31, 147, 31, 84, 47, 146, 170, 164, 130, 53, 170, 184, 183, 158, 215, 152, 156, 215, 240, + 180, 154, 120, 239, 94, 46, 43, 194, 154, 151, 135, 131, 226, 176, 151, 87, 135, 195, 178, + 160, 33, 44, 150, 5, 181, 45, 89, 24, 134, 216, 216, 89, 222, 235, 150, 120, 175, 205, 136, + 175, 157, 49, 223, 197, 178, 176, 25, 249, 181, 132, 183, 122, 186, 216, 83, 238, 192, 254, + 98, 115, 237, 83, 142, 193, 57, 19, 26, 43, 100, 163, 77, 194, 99, 246, 136, 83, 243, 30, + 232, 58, 116, 52, 139, 71, 52, 128, 157, 125, 150, 4, 228, 92, 89, 152, 112, 238, 153, 212, + 66, 249, 41, 49, 10, 243, 106, 178, 40, 72, 61, 233, 44, 236, 204, 188, 47, 117, 138, 100, + 192, 59, 255, 131, 119, 158, 106, 209, 153, 80, 235, 206, 104, 23, 179, 184, 148, 58, 176, + 243, 140, 193, 236, 74, 188, 128, 239, 192, 3, 188, 251, 94, 165, 215, 44, 182, 157, 145, 3, + 111, 42, 46, 213, 226, 75, 218, 33, 171, 246, 207, 189, 43, 129, 125, 134, 15, 252, 118, + 186, 70, 172, 133, 212, 239, 53, 82, 246, 228, 60, 174, 34, 162, 56, 82, 77, 60, 184, 71, + 67, 83, 197, 10, 170, 15, 7, 130, 128, 63, 129, 26, 176, 56, 238, 42, 84, 17, 112, 142, 32, + 92, 218, 196, 47, 192, 198, 45, 89, 147, 12, 65, 144, 233, 153, 11, 8, 114, 207, 64, 22, 59, + 68, 132, 108, 225, 38, 89, 129, 7, 210, 172, 204, 131, 178, 97, 8, 19, 167, 245, 117, 30, + 168, 52, 171, 242, 164, 8, 26, 227, 108, 129, 55, 193, 90, 74, 8, 56, 205, 115, 44, 7, 70, + 222, 215, 51, 16, 162, 188, 74, 195, 52, 133, 181, 121, 219, 253, 123, 214, 161, 136, 89, + 56, 84, 142, 81, 85, 128, 178, 239, 56, 146, 204, 93, 89, 51, 244, 151, 137, 100, 81, 246, + 130, 19, 50, 102, 142, 85, 130, 102, 233, 60, 74, 160, 176, 11, 183, 137, 167, 96, 98, 60, + 241, 68, 52, 107, 255, 133, 58, 53, 212, 186, 65, 119, 2, 131, 20, 135, 120, 66, 249, 58, + 150, 130, 61, 3, 63, 26, 125, 16, 57, 205, 18, 125, 228, 106, 134, 55, 242, 78, 72, 120, + 199, 101, 132, 217, 226, 58, 89, 84, 212, 2, 64, 135, 104, 13, 89, 50, 31, 77, 157, 140, 60, + 183, 130, 84, 171, 89, 119, 32, 249, 2, 12, 28, 113, 69, 162, 71, 140, 39, 145, 143, 208, + 48, 58, 131, 55, 161, 52, 156, 100, 140, 32, 213, 134, 46, 133, 230, 225, 140, 173, 179, 32, + 186, 142, 73, 115, 44, 247, 51, 100, 205, 205, 24, 168, 172, 150, 32, 26, 167, 22, 39, 167, + 191, 18, 185, 88, 164, 93, 248, 233, 227, 16, 214, 48, 65, 91, 2, 27, 201, 25, 250, 140, 50, + 244, 130, 50, 252, 107, 137, 47, 114, 96, 218, 208, 180, 33, 113, 6, 191, 184, 245, 255, + 195, 52, 128, 59, 146, 247, 149, 220, 214, 58, 156, 30, 80, 188, 229, 190, 221, 10, 159, + 107, 80, 74, 185, 180, 79, 146, 25, 169, 246, 153, 244, 31, 120, 156, 100, 2, 21, 211, 70, + 246, 154, 92, 13, 165, 133, 69, 187, 172, 164, 37, 109, 162, 79, 118, 90, 38, 9, 23, 50, + 170, 249, 160, 145, 141, 115, 225, 6, 164, 252, 141, 98, 194, 12, 107, 220, 226, 207, 75, + 85, 108, 61, 205, 94, 135, 148, 100, 241, 146, 24, 63, 197, 24, 117, 141, 129, 165, 161, 5, + 228, 82, 241, 81, 19, 150, 239, 195, 172, 195, 157, 143, 213, 60, 165, 66, 154, 230, 179, + 110, 100, 55, 240, 87, 148, 142, 116, 134, 109, 99, 91, 77, 24, 123, 148, 245, 207, 201, + 149, 216, 103, 219, 201, 42, 10, 223, 140, 141, 248, 29, 171, 143, 1, 255, 62, 43, 195, 112, + 70, 49, 222, 52, 127, 80, 76, 31, 209, 57, 124, 244, 46, 83, 58, 162, 235, 73, 166, 232, 9, + 13, 197, 125, 46, 149, 153, 12, 43, 13, 121, 210, 28, 226, 56, 111, 164, 194, 117, 236, 127, + 194, 165, 52, 88, 41, 191, 229, 192, 75, 243, 160, 104, 27, 113, 132, 161, 137, 151, 131, + 45, 217, 135, 161, 198, 45, 88, 69, 198, 21, 219, 84, 214, 97, 249, 196, 96, 77, 157, 83, + 21, 166, 30, 74, 184, 202, 99, 217, 233, 9, 66, 116, 103, 201, 187, 132, 5, 139, 64, 169, 7, + 151, 207, 53, 207, 86, 140, 220, 73, 18, 123, 180, 44, 210, 108, 203, 34, 67, 21, 57, 209, + 70, 28, 241, 14, 147, 171, 4, 123, 207, 42, 133, 248, 77, 216, 98, 44, 72, 253, 222, 81, 65, + 66, 216, 82, 73, 130, 87, 102, 69, 249, 66, 77, 26, 53, 22, 58, 172, 53, 106, 87, 75, 181, + 214, 249, 214, 65, 37, 27, 123, 203, 88, 158, 71, 135, 165, 121, 84, 191, 11, 159, 23, 98, + 167, 164, 84, 10, 177, 140, 130, 123, 162, 81, 52, 253, 236, 165, 111, 99, 166, 197, 10, 52, + 221, 23, 165, 12, 191, 153, 120, 12, 161, 135, 209, 112, 142, 166, 149, 196, 39, 147, 242, + 81, 84, 17, 16, 46, 51, 209, 119, 198, 89, 223, 97, 235, 82, 69, 39, 249, 2, 109, 12, 52, + 240, 158, 26, 91, 180, 192, 26, 238, 241, 154, 54, 167, 250, 162, 208, 16, 240, 45, 80, 91, + 118, 209, 210, 219, 165, 75, 156, 161, 15, 244, 35, 205, 52, 210, 221, 109, 193, 141, 158, + 242, 188, 16, 37, 196, 117, 73, 158, 237, 72, 188, 55, 184, 209, 83, 162, 215, 186, 240, + 167, 130, 162, 83, 135, 109, 143, 96, 88, 205, 177, 247, 177, 207, 90, 30, 8, 167, 110, 254, + 46, 109, 136, 224, 78, 170, 181, 208, 240, 117, 199, 155, 177, 24, 63, 160, 71, 51, 118, + 157, 58, 127, 169, 200, 73, 207, 244, 38, 197, 116, 234, 4, 92, 60, 36, 200, 128, 37, 196, + 246, 73, 250, 122, 217, 35, 57, 168, 241, 124, 187, 229, 4, 5, 215, 206, 171, 132, 218, 155, + 228, 171, 97, 81, 193, 132, 109, 181, 226, 220, 205, 243, 161, 198, 170, 214, 1, 201, 255, + 1, 155, 194, 172, 220, 84, 187, 85, 16, 98, 185, 91, 9, 50, 177, 12, 219, 146, 23, 204, 145, + 59, 236, 166, 59, 165, 177, 13, 78, 196, 248, 82, 197, 40, 158, 192, 29, 41, 73, 89, 162, + 229, 88, 212, 173, 228, 172, 23, 149, 222, 119, 33, 101, 89, 172, 132, 77, 194, 201, 83, + 109, 240, 245, 143, 220, 28, 56, 38, 140, 89, 186, 57, 71, 57, 113, 104, 75, 150, 89, 209, + 87, 23, 109, 210, 84, 36, 90, 21, 225, 138, 39, 141, 11, 13, 147, 99, 134, 240, 38, 135, + 157, 17, 78, 34, 54, 163, 7, 110, 164, 204, 229, 248, 124, 237, 191, 182, 180, 63, 127, 27, + 1, 63, 25, 60, 7, 100, 67, 252, 240, 144, 22, 34, 13, 190, 143, 179, 164, 73, 142, 149, 84, + 141, 184, 19, 233, 151, 121, 162, 77, 47, 163, 223, 41, 86, 240, 117, 43, 204, 125, 169, + 217, 153, 49, 131, 209, 192, 116, 242, 148, 20, 68, 126, 68, 216, 115, 178, 247, 33, 74, + 253, 9, 37, 159, 64, 75, 229, 58, 241, 118, 39, 73, 187, 139, 167, 159, 249, 10, 200, 14, + 45, 129, 5, 243, 68, 50, 239, 89, 8, 38, 134, 136, 241, 134, 6, 181, 18, 65, 25, 151, 8, + 138, 29, 50, 228, 25, 114, 138, 178, 4, 47, 67, 54, 60, 12, 50, 137, 222, 177, 77, 184, 21, + 86, 117, 223, 2, 65, 133, 78, 38, 53, 201, 31, 8, 39, 31, 137, 182, 195, 70, 114, 30, 214, + 28, 95, 83, 147, 138, 95, 188, 226, 46, 37, 88, 250, 152, 2, 187, 56, 237, 254, 131, 240, + 55, 133, 134, 72, 99, 153, 46, 117, 147, 214, 28, 190, 23, 92, 195, 91, 243, 169, 19, 138, + 128, 65, 121, 6, 134, 228, 165, 110, 146, 173, 90, 62, 46, 237, 119, 70, 100, 176, 166, 250, + 251, 148, 143, 225, 238, 17, 29, 43, 74, 49, 234, 99, 157, 78, 101, 240, 214, 155, 221, 202, + 152, 190, 233, 170, 97, 107, 154, 161, 175, 182, 77, 55, 198, 63, 167, 183, 171, 195, 139, + 123, 227, 72, 155, 237, 96, 26, 103, 197, 118, 55, 142, 139, 87, 207, 237, 197, 39, 167, + 158, 87, 251, 173, 107, 108, 182, 185, 116, 105, 65, 199, 105, 81, 191, 133, 119, 104, 179, + 172, 248, 124, 253, 205, 207, 87, 213, 234, 255, 2, 12, 0, 41, 151, 228, 238, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 57, 55, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 57, 56, 32, 48, + 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, + 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, + 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 52, 32, 48, 32, 82, 47, 82, 101, 115, 111, + 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, + 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, + 56, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 52, 32, + 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, + 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, + 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 52, 53, 47, 84, 121, 112, 101, 47, 80, + 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 57, 56, 32, 48, 32, 111, 98, 106, + 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, + 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 48, 50, 50, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 72, 137, 180, 87, 109, 111, 220, 184, 17, 254, 190, 191, 66, 31, 87, 65, + 164, 136, 20, 165, 149, 128, 195, 1, 121, 187, 54, 69, 211, 123, 201, 162, 247, 225, 90, + 160, 177, 215, 27, 59, 231, 108, 124, 123, 113, 125, 247, 239, 203, 25, 206, 12, 135, 148, + 180, 222, 124, 40, 2, 59, 22, 201, 33, 231, 245, 153, 103, 158, 253, 240, 254, 248, 165, + 248, 230, 155, 103, 111, 95, 190, 121, 85, 52, 197, 183, 223, 190, 120, 245, 178, 88, 189, + 216, 174, 154, 2, 254, 29, 63, 172, 158, 109, 183, 77, 97, 108, 177, 221, 175, 154, 122, 28, + 199, 1, 55, 76, 97, 71, 87, 143, 125, 177, 177, 182, 118, 197, 246, 211, 234, 151, 181, 43, + 251, 117, 91, 254, 123, 251, 55, 144, 49, 133, 105, 235, 17, 197, 140, 173, 173, 179, 94, + 104, 187, 91, 173, 139, 114, 251, 113, 85, 153, 209, 214, 77, 59, 20, 149, 233, 235, 214, + 198, 141, 32, 24, 164, 134, 222, 31, 217, 20, 85, 223, 53, 117, 239, 242, 51, 124, 121, 37, + 231, 178, 171, 94, 111, 87, 191, 173, 76, 55, 212, 166, 47, 250, 97, 83, 183, 125, 97, 154, + 161, 118, 67, 97, 156, 215, 248, 120, 181, 250, 249, 73, 113, 0, 83, 213, 163, 137, 133, 44, + 60, 54, 32, 133, 38, 254, 94, 86, 227, 250, 178, 180, 235, 235, 210, 173, 175, 202, 202, + 174, 63, 149, 149, 9, 127, 225, 94, 81, 86, 109, 235, 214, 199, 114, 8, 139, 31, 96, 241, + 61, 156, 129, 165, 157, 151, 186, 241, 255, 31, 252, 255, 31, 212, 241, 43, 244, 154, 215, + 248, 71, 175, 179, 237, 123, 176, 151, 116, 110, 235, 254, 108, 133, 89, 82, 20, 94, 87, + 228, 9, 188, 119, 211, 248, 56, 240, 189, 214, 124, 197, 189, 36, 169, 28, 241, 79, 31, 107, + 52, 16, 204, 2, 147, 246, 100, 26, 56, 7, 237, 253, 82, 86, 157, 95, 169, 140, 89, 127, 246, + 135, 193, 228, 167, 165, 88, 252, 42, 236, 14, 193, 107, 119, 126, 243, 222, 255, 160, 12, + 94, 75, 199, 126, 242, 183, 69, 231, 194, 61, 183, 94, 70, 142, 194, 5, 159, 253, 19, 109, + 126, 253, 115, 208, 0, 188, 253, 223, 178, 26, 130, 62, 112, 226, 146, 174, 131, 251, 197, + 227, 103, 100, 192, 198, 97, 6, 130, 225, 160, 17, 188, 127, 139, 118, 131, 117, 18, 76, + 212, 145, 148, 112, 172, 4, 152, 118, 199, 201, 130, 138, 220, 162, 20, 157, 17, 213, 64, + 89, 90, 251, 193, 219, 16, 206, 195, 134, 63, 97, 13, 62, 135, 38, 255, 89, 86, 27, 253, 72, + 244, 117, 126, 35, 158, 164, 69, 241, 150, 164, 171, 77, 182, 192, 179, 244, 173, 31, 54, + 235, 11, 255, 171, 195, 215, 57, 44, 112, 230, 130, 13, 66, 225, 24, 181, 35, 153, 6, 190, + 109, 124, 69, 118, 245, 224, 221, 246, 202, 187, 77, 222, 190, 35, 223, 101, 197, 115, 224, + 144, 234, 220, 209, 193, 45, 202, 142, 190, 246, 244, 133, 238, 190, 167, 168, 94, 235, 197, + 83, 5, 90, 227, 65, 80, 176, 106, 61, 112, 52, 30, 56, 172, 65, 53, 119, 94, 205, 215, 229, + 198, 159, 240, 41, 51, 250, 199, 11, 176, 221, 91, 251, 6, 22, 216, 197, 182, 115, 49, 111, + 233, 27, 108, 58, 162, 182, 61, 254, 13, 255, 227, 62, 62, 75, 145, 133, 131, 218, 215, 118, + 195, 73, 132, 158, 241, 49, 190, 41, 211, 103, 240, 111, 177, 67, 47, 38, 145, 228, 157, 61, + 190, 12, 30, 58, 6, 229, 195, 34, 196, 239, 158, 20, 60, 224, 151, 168, 127, 157, 194, 145, + 21, 131, 64, 197, 125, 84, 27, 99, 66, 127, 11, 178, 161, 34, 247, 120, 225, 145, 238, 72, + 222, 132, 59, 116, 62, 176, 183, 41, 41, 192, 219, 114, 23, 62, 240, 187, 212, 16, 69, 203, + 52, 225, 115, 38, 75, 234, 50, 148, 144, 143, 206, 119, 176, 203, 6, 166, 46, 131, 21, 6, 5, + 151, 184, 183, 77, 131, 200, 101, 115, 203, 107, 159, 75, 211, 211, 198, 89, 193, 205, 234, + 168, 117, 19, 97, 136, 11, 130, 209, 13, 245, 1, 129, 57, 21, 232, 164, 152, 219, 24, 156, + 240, 37, 208, 74, 207, 155, 77, 112, 82, 240, 239, 246, 137, 247, 232, 195, 196, 126, 126, + 198, 199, 37, 106, 45, 13, 41, 150, 78, 181, 81, 177, 5, 63, 68, 93, 180, 161, 155, 168, 84, + 154, 111, 24, 164, 229, 226, 173, 178, 178, 225, 172, 138, 248, 28, 192, 84, 94, 158, 2, 15, + 139, 236, 67, 18, 216, 46, 26, 25, 118, 141, 119, 126, 231, 127, 200, 157, 32, 31, 54, 222, + 10, 176, 68, 155, 227, 110, 72, 246, 240, 45, 142, 156, 160, 168, 25, 157, 244, 56, 65, 199, + 208, 83, 42, 31, 136, 27, 214, 251, 150, 128, 99, 36, 209, 212, 223, 148, 141, 176, 27, 112, + 157, 188, 67, 11, 161, 103, 237, 164, 74, 149, 43, 251, 172, 25, 144, 208, 93, 140, 53, 184, + 143, 207, 50, 230, 152, 164, 150, 131, 13, 124, 249, 94, 55, 92, 27, 11, 140, 14, 238, 216, + 72, 52, 131, 227, 6, 59, 130, 29, 98, 176, 82, 72, 90, 131, 238, 2, 125, 104, 2, 201, 121, + 208, 235, 33, 79, 175, 12, 61, 134, 60, 115, 4, 243, 39, 45, 61, 9, 38, 223, 117, 144, 187, + 196, 147, 114, 158, 66, 177, 240, 226, 60, 34, 241, 231, 12, 34, 61, 43, 187, 19, 120, 102, + 54, 39, 164, 141, 211, 101, 17, 193, 21, 84, 125, 90, 34, 42, 79, 27, 42, 56, 129, 121, 131, + 174, 131, 86, 215, 57, 220, 48, 95, 142, 109, 40, 23, 135, 107, 131, 160, 150, 114, 31, 226, + 146, 75, 250, 15, 115, 26, 185, 22, 91, 101, 216, 72, 154, 228, 227, 240, 154, 162, 43, 147, + 196, 71, 240, 213, 106, 128, 5, 37, 4, 45, 98, 246, 239, 85, 205, 158, 130, 214, 188, 185, + 74, 229, 11, 33, 21, 15, 106, 122, 75, 74, 17, 122, 24, 206, 20, 97, 164, 215, 9, 40, 74, + 13, 11, 138, 204, 182, 71, 92, 70, 10, 121, 44, 21, 91, 149, 200, 233, 113, 65, 158, 188, + 195, 107, 116, 119, 138, 88, 122, 171, 47, 206, 203, 149, 97, 150, 182, 3, 208, 114, 136, + 97, 5, 249, 39, 171, 159, 66, 220, 221, 4, 131, 252, 249, 151, 96, 220, 181, 224, 10, 94, + 53, 1, 84, 60, 4, 90, 98, 246, 127, 10, 136, 175, 171, 90, 195, 156, 78, 104, 130, 176, 248, + 69, 234, 113, 192, 25, 4, 66, 255, 184, 211, 176, 20, 206, 203, 168, 33, 229, 73, 249, 107, + 187, 236, 230, 191, 72, 218, 37, 74, 100, 247, 165, 50, 100, 188, 163, 247, 201, 120, 167, + 119, 191, 210, 234, 72, 153, 208, 113, 241, 185, 142, 77, 129, 19, 185, 49, 105, 70, 117, + 143, 218, 226, 75, 215, 50, 117, 8, 76, 120, 152, 103, 194, 0, 19, 141, 228, 83, 99, 254, + 111, 124, 56, 19, 156, 37, 75, 57, 27, 149, 58, 61, 232, 184, 39, 37, 151, 242, 89, 48, 215, + 79, 123, 182, 48, 166, 110, 28, 12, 124, 214, 217, 218, 54, 48, 241, 121, 187, 215, 255, 41, + 183, 31, 245, 56, 248, 11, 95, 1, 196, 2, 90, 70, 67, 238, 104, 233, 183, 114, 129, 48, 230, + 102, 134, 135, 106, 11, 114, 127, 41, 178, 97, 24, 139, 124, 116, 122, 175, 151, 77, 8, 115, + 66, 62, 32, 240, 151, 56, 141, 50, 7, 151, 101, 5, 128, 41, 133, 156, 140, 20, 220, 46, 178, + 217, 107, 105, 58, 155, 235, 18, 145, 81, 156, 193, 139, 88, 7, 82, 151, 24, 16, 170, 32, + 218, 127, 137, 89, 206, 165, 161, 58, 137, 80, 0, 96, 26, 82, 81, 217, 32, 26, 219, 198, 69, + 236, 7, 243, 124, 4, 70, 218, 49, 166, 94, 236, 244, 160, 10, 163, 160, 176, 26, 186, 24, + 36, 228, 244, 93, 194, 31, 148, 246, 26, 183, 221, 215, 241, 71, 56, 206, 71, 99, 128, 196, + 82, 233, 55, 169, 155, 72, 48, 244, 167, 123, 21, 102, 88, 213, 197, 198, 218, 164, 109, 89, + 159, 142, 176, 51, 229, 30, 231, 164, 97, 140, 5, 160, 209, 141, 12, 159, 251, 50, 222, 61, + 153, 25, 82, 91, 186, 73, 172, 237, 137, 96, 119, 58, 212, 221, 36, 211, 59, 173, 45, 120, + 28, 222, 97, 18, 197, 185, 109, 28, 53, 240, 30, 157, 194, 200, 19, 242, 192, 207, 156, 236, + 142, 71, 1, 211, 44, 3, 230, 116, 16, 58, 11, 46, 51, 180, 100, 212, 72, 107, 52, 158, 93, + 228, 128, 146, 40, 254, 144, 245, 95, 27, 212, 182, 15, 157, 74, 93, 252, 21, 215, 197, 81, + 138, 47, 236, 253, 207, 139, 18, 193, 177, 109, 51, 78, 62, 129, 160, 46, 101, 149, 150, + 105, 3, 250, 120, 147, 224, 95, 210, 47, 198, 217, 126, 1, 126, 79, 58, 198, 152, 79, 170, + 74, 54, 4, 247, 68, 239, 24, 167, 222, 104, 77, 250, 110, 234, 154, 229, 194, 132, 187, 30, + 180, 237, 177, 47, 136, 162, 162, 184, 212, 38, 220, 39, 106, 209, 235, 26, 210, 253, 231, + 214, 191, 129, 196, 224, 93, 128, 51, 97, 14, 2, 80, 183, 211, 162, 164, 244, 235, 180, 75, + 187, 4, 154, 79, 32, 115, 26, 120, 141, 118, 240, 245, 107, 164, 173, 112, 0, 108, 170, 203, + 46, 169, 156, 205, 114, 229, 64, 10, 169, 177, 66, 255, 166, 50, 50, 252, 157, 141, 24, 103, + 149, 81, 155, 150, 81, 123, 170, 140, 22, 250, 165, 56, 33, 10, 69, 5, 164, 223, 179, 151, + 226, 93, 147, 44, 108, 99, 71, 184, 77, 232, 236, 135, 104, 84, 218, 106, 137, 248, 171, + 167, 178, 222, 138, 159, 31, 36, 102, 121, 7, 121, 180, 182, 50, 83, 25, 168, 243, 33, 179, + 155, 78, 138, 83, 97, 44, 106, 144, 252, 200, 137, 188, 19, 166, 0, 201, 164, 129, 127, 98, + 247, 87, 77, 85, 254, 60, 35, 121, 10, 217, 97, 15, 144, 136, 98, 11, 239, 199, 128, 223, + 200, 145, 116, 172, 13, 107, 15, 73, 199, 189, 46, 115, 46, 21, 232, 139, 170, 183, 153, + 248, 131, 202, 148, 1, 198, 176, 13, 60, 30, 152, 102, 237, 188, 23, 59, 230, 145, 112, 98, + 199, 133, 143, 182, 113, 118, 195, 206, 94, 165, 247, 39, 122, 26, 55, 38, 190, 79, 238, + 209, 125, 24, 119, 18, 12, 98, 115, 96, 67, 154, 45, 248, 225, 154, 81, 221, 200, 196, 19, + 144, 85, 134, 69, 30, 129, 76, 90, 136, 240, 157, 204, 38, 33, 26, 112, 4, 17, 90, 23, 35, + 156, 61, 197, 207, 166, 150, 141, 132, 2, 7, 138, 134, 164, 207, 114, 50, 129, 204, 247, + 165, 65, 255, 237, 147, 4, 76, 230, 45, 60, 167, 71, 40, 92, 152, 213, 32, 22, 25, 254, 226, + 104, 227, 145, 169, 141, 99, 6, 12, 232, 40, 238, 11, 140, 116, 112, 106, 139, 121, 144, 63, + 150, 180, 132, 136, 170, 202, 248, 172, 207, 4, 59, 66, 158, 133, 24, 78, 9, 220, 191, 172, + 53, 126, 150, 249, 107, 25, 2, 131, 102, 92, 7, 241, 190, 149, 169, 21, 238, 184, 167, 172, + 195, 183, 188, 152, 5, 74, 195, 231, 116, 220, 251, 54, 103, 147, 159, 57, 175, 123, 1, 103, + 86, 117, 17, 158, 251, 136, 207, 74, 248, 66, 249, 4, 190, 67, 250, 199, 234, 226, 225, 139, + 163, 48, 119, 93, 175, 148, 180, 65, 203, 91, 209, 231, 33, 84, 189, 84, 178, 56, 61, 86, + 143, 240, 213, 132, 252, 170, 134, 8, 202, 168, 106, 82, 248, 8, 159, 132, 129, 76, 145, + 197, 115, 172, 126, 36, 63, 25, 77, 11, 165, 175, 7, 140, 100, 113, 185, 121, 192, 153, 211, + 253, 34, 148, 110, 108, 221, 203, 104, 34, 112, 157, 140, 9, 51, 102, 30, 40, 176, 135, 178, + 53, 235, 106, 134, 138, 224, 5, 55, 186, 165, 8, 255, 198, 173, 26, 101, 158, 109, 183, 109, + 97, 108, 177, 221, 175, 220, 80, 55, 166, 104, 160, 71, 249, 71, 182, 31, 87, 175, 183, 43, + 99, 250, 218, 21, 155, 198, 212, 155, 190, 104, 106, 55, 132, 95, 199, 171, 213, 254, 209, + 189, 97, 224, 205, 118, 99, 234, 206, 170, 109, 55, 12, 139, 162, 167, 246, 194, 147, 182, + 111, 234, 222, 133, 101, 231, 76, 237, 213, 87, 146, 75, 187, 191, 173, 140, 181, 181, 233, + 11, 235, 58, 184, 218, 152, 218, 14, 133, 113, 94, 196, 239, 255, 252, 164, 56, 172, 94, + 108, 193, 31, 13, 249, 163, 169, 199, 113, 244, 175, 251, 127, 166, 16, 217, 1, 236, 218, + 126, 242, 158, 254, 14, 194, 84, 99, 186, 131, 39, 189, 183, 126, 132, 71, 218, 182, 118, + 142, 31, 233, 235, 141, 61, 255, 13, 22, 229, 55, 214, 63, 81, 24, 240, 98, 215, 40, 237, + 135, 30, 62, 206, 190, 153, 101, 163, 246, 207, 61, 81, 220, 66, 50, 188, 241, 22, 124, 239, + 39, 209, 245, 63, 192, 30, 88, 254, 59, 78, 109, 176, 254, 14, 224, 105, 238, 164, 24, 28, + 30, 117, 115, 143, 90, 219, 215, 173, 213, 230, 164, 89, 5, 129, 50, 75, 153, 67, 155, 11, + 153, 179, 44, 234, 247, 218, 1, 158, 197, 229, 64, 125, 181, 224, 252, 102, 204, 13, 139, + 33, 240, 126, 237, 221, 156, 119, 205, 169, 220, 240, 246, 118, 125, 146, 27, 200, 180, 147, + 228, 240, 198, 241, 35, 254, 253, 118, 54, 132, 243, 143, 144, 40, 191, 33, 206, 196, 123, + 187, 65, 105, 223, 90, 95, 201, 179, 169, 61, 127, 51, 11, 71, 245, 97, 208, 201, 219, 99, + 10, 44, 52, 191, 48, 28, 46, 207, 170, 177, 73, 242, 116, 166, 230, 170, 20, 244, 179, 219, + 243, 182, 12, 127, 48, 105, 138, 0, 126, 81, 50, 180, 222, 206, 17, 86, 107, 156, 198, 248, + 217, 199, 79, 189, 126, 151, 176, 196, 116, 120, 209, 231, 84, 239, 203, 106, 227, 164, 207, + 77, 3, 0, 129, 62, 7, 225, 200, 105, 132, 191, 196, 94, 194, 253, 223, 118, 160, 146, 161, + 125, 33, 57, 151, 68, 49, 50, 46, 74, 253, 25, 132, 82, 197, 229, 25, 158, 230, 110, 146, + 39, 73, 102, 71, 109, 70, 143, 178, 184, 193, 253, 135, 157, 16, 180, 82, 77, 16, 194, 33, + 81, 232, 82, 118, 32, 223, 215, 19, 122, 66, 187, 106, 0, 72, 14, 95, 149, 134, 9, 44, 182, + 187, 11, 74, 10, 233, 118, 7, 78, 151, 232, 29, 8, 81, 58, 224, 25, 162, 58, 168, 48, 72, + 252, 26, 9, 94, 210, 217, 91, 117, 102, 23, 101, 227, 73, 161, 242, 71, 118, 253, 129, 82, + 20, 149, 16, 214, 217, 18, 157, 150, 156, 201, 72, 157, 17, 230, 198, 12, 103, 194, 220, + 172, 214, 64, 123, 19, 190, 241, 181, 63, 192, 221, 49, 184, 153, 210, 201, 112, 69, 239, + 38, 126, 20, 161, 132, 5, 147, 198, 93, 250, 164, 38, 32, 222, 172, 202, 255, 113, 134, 67, + 59, 197, 173, 153, 31, 178, 191, 40, 119, 45, 147, 166, 14, 87, 227, 12, 118, 167, 175, 191, + 73, 10, 246, 41, 81, 101, 127, 74, 87, 74, 23, 234, 53, 150, 47, 44, 41, 134, 219, 165, 73, + 28, 184, 45, 83, 61, 41, 158, 90, 13, 159, 149, 7, 225, 166, 233, 11, 191, 2, 147, 211, 46, + 65, 122, 91, 98, 174, 155, 174, 115, 8, 160, 175, 224, 210, 119, 176, 13, 79, 105, 80, 236, + 206, 129, 149, 142, 18, 150, 69, 212, 28, 69, 65, 121, 31, 73, 50, 31, 138, 30, 87, 206, 51, + 209, 224, 132, 241, 211, 13, 193, 17, 204, 123, 15, 165, 79, 180, 10, 35, 188, 76, 37, 51, + 69, 85, 66, 5, 61, 35, 253, 150, 59, 68, 64, 225, 66, 39, 96, 101, 121, 40, 64, 7, 111, 100, + 132, 218, 205, 204, 166, 93, 172, 181, 152, 235, 83, 127, 89, 255, 213, 136, 165, 106, 48, + 12, 67, 167, 114, 168, 168, 246, 180, 28, 41, 185, 25, 86, 210, 228, 79, 148, 136, 33, 248, + 131, 173, 153, 213, 171, 50, 26, 205, 58, 178, 86, 252, 146, 14, 55, 26, 102, 31, 79, 223, + 108, 172, 146, 236, 32, 212, 233, 18, 200, 145, 82, 79, 96, 71, 163, 206, 137, 105, 209, + 184, 188, 252, 105, 188, 225, 198, 171, 102, 187, 106, 118, 182, 113, 143, 67, 76, 149, 77, + 57, 110, 234, 99, 89, 156, 241, 223, 159, 241, 72, 92, 156, 139, 157, 92, 114, 195, 147, + 166, 218, 72, 21, 200, 235, 184, 74, 232, 132, 184, 84, 186, 0, 228, 212, 53, 5, 154, 131, + 126, 137, 116, 122, 90, 139, 112, 62, 212, 221, 46, 38, 103, 136, 91, 244, 127, 70, 172, 2, + 143, 194, 22, 216, 123, 106, 9, 159, 163, 255, 171, 247, 63, 207, 83, 13, 247, 49, 221, 178, + 196, 197, 131, 114, 175, 134, 183, 72, 205, 219, 13, 148, 223, 2, 53, 15, 155, 75, 212, 124, + 81, 212, 21, 227, 8, 140, 23, 87, 141, 39, 226, 217, 38, 142, 9, 243, 114, 75, 91, 126, 53, + 236, 45, 40, 179, 240, 32, 109, 206, 221, 122, 98, 235, 245, 219, 151, 197, 234, 127, 2, 12, + 0, 55, 217, 42, 133, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 57, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, + 110, 116, 115, 32, 49, 48, 48, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, + 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, + 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 52, + 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, + 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, + 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, + 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, + 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, + 52, 54, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 48, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, + 50, 55, 53, 51, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 148, 87, 105, 111, 28, + 199, 17, 253, 190, 191, 98, 62, 238, 24, 218, 225, 244, 53, 7, 96, 24, 176, 72, 57, 81, 0, + 39, 62, 22, 8, 16, 41, 64, 72, 83, 75, 42, 94, 174, 233, 149, 104, 89, 249, 245, 233, 170, + 238, 170, 174, 238, 153, 89, 174, 96, 152, 218, 233, 163, 186, 206, 87, 175, 46, 126, 184, + 62, 126, 172, 190, 254, 250, 226, 251, 203, 215, 87, 85, 91, 125, 243, 205, 203, 171, 203, + 106, 245, 114, 187, 106, 43, 248, 239, 120, 183, 186, 216, 110, 219, 74, 233, 106, 187, 91, + 181, 205, 56, 142, 3, 110, 168, 74, 143, 182, 25, 187, 170, 215, 186, 177, 213, 246, 97, + 245, 102, 109, 235, 206, 255, 255, 239, 237, 223, 224, 142, 170, 148, 105, 70, 188, 166, + 116, 163, 173, 246, 151, 182, 183, 171, 117, 85, 111, 255, 187, 218, 168, 81, 55, 173, 25, + 170, 141, 234, 26, 163, 211, 70, 184, 24, 110, 13, 157, 63, 210, 87, 155, 206, 181, 77, 103, + 203, 51, 36, 124, 195, 231, 10, 81, 175, 182, 171, 223, 253, 211, 186, 81, 93, 213, 13, 125, + 99, 186, 74, 89, 16, 228, 255, 218, 234, 248, 110, 245, 207, 175, 170, 3, 88, 42, 222, 204, + 12, 164, 187, 99, 219, 216, 33, 88, 248, 93, 189, 81, 235, 166, 222, 12, 107, 131, 118, 250, + 55, 126, 132, 87, 76, 215, 12, 244, 136, 86, 241, 169, 243, 30, 9, 87, 249, 13, 214, 29, + 229, 186, 65, 104, 111, 244, 208, 180, 195, 249, 146, 227, 101, 161, 254, 183, 160, 254, + 199, 122, 227, 252, 43, 27, 101, 215, 143, 181, 93, 31, 235, 97, 253, 174, 222, 232, 245, + 135, 122, 51, 134, 95, 7, 191, 44, 78, 225, 207, 123, 191, 134, 155, 97, 109, 235, 67, 125, + 5, 235, 63, 131, 200, 176, 6, 146, 174, 249, 5, 113, 248, 55, 127, 24, 100, 134, 175, 79, + 176, 251, 222, 159, 101, 185, 183, 181, 184, 140, 219, 248, 107, 239, 151, 146, 128, 29, 11, + 248, 200, 39, 254, 172, 55, 125, 248, 117, 227, 119, 247, 100, 137, 63, 102, 236, 250, 151, + 90, 227, 197, 7, 216, 7, 75, 73, 141, 57, 27, 119, 254, 175, 67, 37, 226, 21, 13, 86, 113, + 136, 207, 112, 115, 143, 185, 133, 110, 126, 85, 247, 233, 213, 125, 148, 249, 25, 116, 197, + 167, 147, 183, 223, 106, 173, 235, 17, 85, 232, 237, 250, 7, 191, 110, 88, 135, 63, 32, 203, + 192, 77, 183, 133, 202, 218, 209, 5, 204, 198, 39, 191, 122, 64, 39, 130, 5, 113, 7, 163, 2, + 14, 224, 176, 161, 62, 28, 147, 209, 162, 232, 131, 188, 115, 96, 23, 249, 67, 27, 255, 195, + 235, 99, 66, 202, 252, 29, 125, 20, 207, 129, 88, 244, 121, 74, 24, 252, 21, 183, 65, 174, + 252, 54, 94, 82, 235, 127, 26, 90, 120, 36, 149, 142, 254, 155, 188, 220, 54, 109, 171, 124, + 9, 187, 102, 192, 74, 127, 131, 207, 228, 145, 194, 186, 3, 33, 94, 151, 215, 240, 155, 227, + 167, 138, 103, 69, 106, 131, 69, 20, 252, 164, 240, 109, 76, 38, 202, 38, 216, 141, 223, 92, + 15, 112, 6, 156, 203, 138, 136, 151, 228, 203, 165, 0, 141, 6, 135, 79, 147, 153, 203, 218, + 79, 109, 123, 17, 211, 192, 95, 72, 190, 21, 15, 30, 146, 194, 240, 84, 94, 146, 66, 114, + 10, 162, 106, 125, 16, 209, 181, 236, 214, 43, 239, 86, 25, 84, 48, 193, 45, 198, 179, 169, + 49, 230, 32, 98, 227, 65, 170, 109, 61, 196, 122, 108, 163, 248, 36, 40, 180, 62, 221, 225, + 121, 231, 98, 226, 113, 213, 161, 176, 143, 84, 239, 105, 9, 229, 191, 72, 153, 95, 84, 116, + 92, 221, 69, 91, 200, 188, 49, 185, 34, 171, 109, 153, 213, 18, 41, 186, 40, 147, 124, 215, + 71, 119, 93, 99, 117, 131, 212, 61, 102, 224, 123, 138, 56, 61, 228, 15, 166, 106, 69, 17, + 133, 10, 50, 191, 185, 60, 101, 190, 36, 4, 188, 77, 143, 239, 167, 248, 24, 74, 224, 133, + 255, 219, 70, 87, 147, 167, 69, 37, 124, 162, 96, 191, 71, 149, 5, 200, 77, 193, 80, 174, + 102, 249, 129, 63, 4, 16, 195, 41, 56, 144, 101, 27, 44, 6, 239, 192, 51, 124, 13, 207, 128, + 33, 159, 197, 19, 55, 36, 157, 19, 57, 110, 60, 214, 36, 132, 208, 11, 54, 76, 150, 199, 81, + 71, 157, 247, 21, 88, 205, 125, 14, 106, 80, 120, 56, 62, 112, 108, 38, 62, 17, 30, 192, + 137, 219, 175, 168, 217, 165, 4, 57, 196, 70, 147, 175, 80, 33, 155, 2, 66, 204, 4, 66, 0, + 41, 103, 65, 196, 20, 24, 96, 84, 72, 221, 107, 194, 224, 247, 89, 166, 165, 128, 101, 109, + 18, 110, 161, 104, 74, 161, 251, 66, 122, 140, 177, 210, 228, 96, 37, 156, 112, 44, 84, 47, + 245, 1, 129, 156, 126, 177, 22, 185, 195, 5, 128, 232, 2, 62, 192, 201, 12, 2, 51, 184, 147, + 5, 230, 40, 203, 192, 51, 194, 119, 110, 66, 14, 96, 27, 204, 63, 228, 247, 56, 240, 46, + 139, 36, 156, 156, 139, 187, 59, 17, 116, 115, 22, 80, 57, 1, 84, 127, 141, 129, 185, 3, + 165, 75, 36, 117, 37, 193, 185, 96, 210, 115, 9, 58, 16, 233, 113, 75, 164, 199, 197, 8, 65, + 168, 2, 9, 200, 128, 70, 226, 159, 11, 46, 222, 81, 43, 118, 51, 132, 203, 137, 182, 20, 50, + 10, 196, 61, 198, 232, 76, 146, 185, 232, 194, 164, 76, 248, 153, 58, 132, 14, 109, 126, + 199, 1, 220, 151, 149, 22, 117, 67, 231, 225, 43, 212, 130, 157, 77, 168, 244, 91, 108, 238, + 11, 232, 53, 1, 25, 161, 3, 41, 236, 66, 197, 60, 197, 130, 59, 212, 194, 0, 246, 67, 44, + 55, 103, 167, 41, 151, 57, 8, 133, 74, 81, 97, 95, 116, 6, 52, 139, 18, 114, 182, 149, 76, + 206, 63, 50, 63, 228, 32, 136, 10, 33, 89, 119, 73, 157, 140, 90, 51, 151, 3, 161, 160, 154, + 208, 123, 182, 211, 76, 251, 54, 119, 178, 232, 6, 237, 102, 240, 91, 83, 168, 239, 160, + 253, 163, 54, 172, 3, 126, 77, 51, 85, 231, 166, 234, 60, 245, 213, 144, 137, 45, 222, 159, + 212, 67, 46, 44, 14, 130, 186, 82, 170, 105, 45, 16, 103, 221, 90, 255, 75, 197, 73, 240, + 63, 197, 192, 247, 134, 68, 184, 200, 160, 160, 66, 90, 166, 143, 145, 83, 209, 27, 49, 69, + 225, 243, 129, 72, 7, 27, 75, 121, 10, 187, 25, 85, 212, 142, 82, 139, 59, 238, 134, 180, + 146, 89, 123, 38, 246, 143, 57, 212, 142, 49, 85, 177, 21, 7, 204, 133, 212, 120, 170, 5, + 77, 8, 199, 168, 32, 137, 170, 230, 40, 30, 105, 120, 0, 132, 49, 171, 53, 166, 153, 50, + 253, 199, 105, 73, 101, 84, 246, 119, 44, 46, 42, 154, 0, 177, 167, 205, 8, 160, 144, 170, + 40, 43, 184, 251, 252, 22, 85, 168, 150, 221, 247, 100, 57, 154, 44, 231, 204, 51, 188, 206, + 72, 42, 24, 70, 134, 205, 66, 183, 84, 147, 74, 93, 44, 189, 121, 18, 17, 54, 2, 125, 17, + 217, 174, 102, 240, 110, 163, 168, 244, 133, 200, 44, 12, 1, 215, 173, 232, 100, 73, 220, + 141, 160, 83, 37, 97, 203, 28, 121, 201, 74, 50, 196, 115, 207, 217, 199, 198, 248, 23, 74, + 154, 63, 24, 169, 201, 219, 179, 116, 231, 249, 134, 252, 143, 90, 197, 28, 32, 3, 126, 1, + 18, 139, 191, 226, 211, 33, 18, 241, 113, 92, 251, 31, 3, 11, 10, 148, 56, 227, 4, 251, 19, + 239, 101, 100, 90, 112, 74, 70, 182, 125, 116, 97, 19, 20, 79, 61, 126, 196, 30, 223, 33, + 144, 124, 7, 64, 210, 54, 227, 56, 14, 30, 90, 218, 74, 85, 214, 184, 198, 116, 149, 237, + 117, 51, 84, 219, 7, 127, 167, 237, 155, 222, 154, 116, 233, 77, 192, 136, 78, 80, 130, 124, + 166, 116, 133, 118, 238, 108, 66, 168, 92, 49, 20, 58, 27, 189, 199, 20, 236, 200, 124, 96, + 39, 243, 64, 246, 254, 4, 213, 229, 14, 207, 59, 4, 203, 140, 127, 79, 112, 68, 50, 1, 197, + 128, 28, 193, 132, 239, 128, 174, 62, 91, 244, 144, 144, 61, 27, 116, 221, 236, 84, 230, + 108, 98, 159, 130, 221, 171, 156, 113, 32, 19, 104, 27, 59, 228, 76, 32, 163, 149, 79, 242, + 193, 91, 82, 207, 88, 129, 125, 224, 45, 158, 56, 104, 35, 221, 202, 177, 1, 106, 146, 230, + 3, 114, 55, 35, 201, 99, 124, 48, 86, 101, 217, 174, 205, 140, 115, 141, 236, 235, 114, 96, + 147, 20, 142, 167, 7, 91, 144, 114, 252, 117, 83, 219, 124, 92, 35, 16, 190, 240, 37, 240, + 33, 189, 173, 189, 154, 6, 13, 176, 254, 215, 75, 36, 179, 68, 189, 168, 11, 48, 28, 76, 75, + 21, 252, 145, 88, 0, 47, 75, 162, 206, 33, 14, 101, 246, 20, 89, 233, 109, 150, 102, 89, 10, + 159, 226, 83, 13, 238, 159, 67, 184, 251, 165, 234, 210, 69, 117, 233, 73, 117, 217, 249, + 218, 210, 69, 109, 193, 119, 106, 185, 201, 142, 130, 169, 20, 169, 204, 225, 153, 25, 205, + 40, 227, 102, 136, 209, 36, 73, 180, 75, 45, 235, 16, 122, 139, 30, 185, 48, 56, 97, 146, + 143, 67, 74, 209, 241, 40, 225, 237, 186, 214, 169, 177, 114, 43, 146, 157, 96, 134, 87, 23, + 243, 197, 16, 101, 115, 54, 112, 7, 18, 175, 73, 174, 116, 32, 13, 209, 96, 72, 201, 112, + 96, 94, 145, 57, 86, 251, 16, 80, 128, 24, 14, 126, 190, 173, 107, 58, 155, 122, 246, 112, + 90, 180, 32, 195, 49, 148, 74, 48, 236, 108, 16, 45, 72, 246, 220, 160, 180, 35, 249, 2, + 206, 184, 122, 176, 63, 114, 99, 121, 146, 101, 36, 235, 69, 80, 11, 192, 145, 123, 185, + 188, 168, 191, 147, 137, 233, 34, 135, 216, 199, 177, 138, 232, 66, 48, 33, 181, 233, 4, 35, + 228, 42, 150, 150, 56, 17, 181, 142, 192, 35, 137, 138, 9, 95, 184, 136, 19, 33, 174, 166, + 245, 115, 93, 86, 194, 40, 51, 75, 75, 70, 53, 220, 154, 116, 215, 165, 130, 30, 22, 219, + 229, 164, 151, 159, 85, 206, 170, 232, 148, 66, 187, 89, 8, 85, 69, 10, 162, 64, 8, 244, + 177, 14, 44, 239, 49, 216, 165, 39, 169, 175, 168, 73, 236, 248, 155, 57, 120, 64, 68, 154, + 58, 243, 126, 242, 144, 14, 37, 42, 197, 121, 7, 15, 220, 198, 127, 247, 92, 219, 24, 21, + 65, 238, 74, 246, 186, 80, 209, 25, 249, 45, 90, 86, 158, 250, 115, 132, 17, 22, 23, 211, + 187, 96, 220, 98, 232, 8, 174, 203, 7, 4, 78, 151, 108, 82, 36, 14, 204, 27, 247, 76, 223, + 243, 120, 240, 60, 3, 6, 137, 4, 137, 145, 78, 236, 153, 203, 52, 179, 156, 17, 74, 182, + 167, 44, 160, 169, 37, 182, 232, 64, 79, 232, 174, 138, 153, 141, 105, 255, 45, 219, 121, + 27, 171, 88, 48, 111, 39, 128, 236, 145, 57, 7, 220, 79, 163, 65, 86, 147, 89, 133, 231, + 232, 19, 128, 240, 24, 25, 249, 243, 114, 147, 191, 26, 188, 243, 124, 241, 141, 75, 197, + 55, 78, 166, 193, 231, 138, 79, 181, 243, 99, 223, 73, 23, 22, 163, 235, 40, 146, 51, 155, + 215, 70, 234, 71, 3, 181, 136, 76, 213, 162, 47, 144, 196, 88, 167, 254, 243, 103, 248, 124, + 229, 141, 253, 87, 52, 184, 40, 80, 33, 171, 80, 255, 38, 170, 95, 214, 203, 56, 109, 21, + 92, 131, 67, 86, 131, 210, 1, 211, 22, 36, 224, 45, 48, 106, 58, 250, 128, 96, 47, 16, 12, + 105, 198, 163, 176, 52, 129, 237, 60, 24, 221, 209, 8, 23, 54, 138, 215, 36, 122, 192, 119, + 138, 37, 200, 230, 72, 177, 198, 226, 42, 249, 98, 82, 125, 175, 145, 253, 19, 81, 226, 193, + 14, 83, 45, 156, 216, 226, 233, 108, 228, 32, 195, 115, 226, 84, 96, 147, 156, 56, 82, 149, + 130, 139, 161, 76, 83, 95, 19, 69, 255, 206, 207, 155, 27, 255, 49, 157, 57, 244, 12, 23, + 37, 215, 19, 137, 50, 5, 155, 84, 98, 122, 252, 64, 142, 141, 7, 83, 132, 193, 184, 101, + 162, 89, 180, 38, 184, 122, 35, 60, 161, 169, 33, 196, 105, 10, 84, 154, 223, 35, 15, 39, + 86, 70, 57, 241, 89, 152, 184, 227, 6, 46, 187, 4, 146, 22, 112, 20, 79, 142, 162, 170, 138, + 49, 198, 165, 66, 149, 3, 214, 114, 55, 164, 47, 151, 165, 108, 82, 99, 210, 221, 103, 162, + 230, 239, 193, 56, 208, 158, 5, 96, 202, 223, 107, 35, 25, 106, 61, 136, 93, 209, 100, 65, + 142, 235, 76, 238, 244, 206, 132, 7, 153, 115, 177, 185, 89, 150, 119, 38, 233, 7, 159, 122, + 204, 125, 134, 231, 184, 169, 237, 98, 182, 159, 100, 202, 157, 41, 74, 20, 22, 14, 53, 143, + 167, 14, 179, 245, 6, 189, 197, 154, 253, 58, 215, 171, 187, 56, 162, 210, 58, 159, 14, 188, + 142, 235, 110, 255, 133, 228, 128, 229, 188, 47, 121, 180, 138, 169, 202, 12, 100, 110, 190, + 133, 197, 159, 50, 184, 200, 225, 68, 158, 131, 145, 52, 55, 50, 110, 72, 74, 97, 98, 83, + 154, 0, 202, 139, 154, 181, 146, 232, 173, 138, 162, 85, 230, 92, 206, 88, 36, 9, 124, 167, + 106, 251, 85, 80, 150, 9, 67, 224, 153, 39, 7, 74, 252, 195, 156, 94, 16, 183, 107, 230, 35, + 217, 80, 153, 175, 148, 200, 94, 16, 90, 6, 34, 48, 22, 147, 34, 213, 160, 152, 51, 32, 201, + 3, 98, 194, 198, 201, 244, 37, 252, 93, 74, 96, 216, 159, 105, 0, 51, 188, 49, 174, 125, 75, + 60, 76, 212, 251, 39, 134, 141, 120, 99, 9, 206, 75, 129, 78, 184, 83, 130, 4, 246, 157, + 243, 48, 66, 9, 140, 200, 136, 78, 159, 167, 76, 127, 102, 198, 244, 121, 80, 250, 194, 191, + 71, 238, 99, 59, 81, 53, 189, 240, 85, 242, 114, 216, 40, 40, 12, 29, 77, 125, 139, 135, + 151, 188, 79, 226, 41, 241, 0, 177, 26, 6, 238, 36, 48, 25, 193, 129, 41, 32, 202, 31, 210, + 254, 107, 96, 246, 35, 170, 177, 159, 25, 16, 22, 128, 101, 18, 252, 222, 138, 180, 11, 223, + 159, 184, 168, 196, 60, 123, 142, 31, 194, 226, 82, 95, 154, 51, 169, 116, 53, 183, 239, + 167, 24, 105, 46, 221, 121, 23, 126, 177, 15, 33, 225, 70, 68, 122, 235, 127, 1, 36, 134, + 245, 51, 188, 137, 221, 57, 247, 95, 0, 187, 114, 54, 160, 177, 131, 49, 3, 127, 164, 74, + 142, 246, 186, 136, 242, 160, 12, 216, 181, 71, 242, 29, 10, 207, 205, 51, 26, 149, 177, 18, + 234, 62, 116, 133, 17, 2, 175, 128, 58, 77, 93, 244, 234, 225, 68, 29, 234, 165, 58, 180, 5, + 118, 219, 115, 177, 219, 22, 216, 109, 231, 176, 91, 245, 180, 245, 229, 248, 107, 229, 52, + 202, 21, 206, 161, 151, 141, 121, 78, 23, 124, 252, 79, 158, 209, 184, 217, 206, 228, 14, + 184, 240, 213, 118, 165, 84, 215, 216, 170, 111, 85, 211, 119, 85, 219, 216, 33, 252, 57, + 190, 91, 237, 158, 221, 27, 6, 218, 52, 189, 106, 156, 22, 219, 118, 24, 22, 175, 158, 218, + 11, 79, 142, 182, 49, 81, 90, 215, 246, 141, 181, 217, 166, 129, 112, 207, 223, 91, 218, + 242, 154, 134, 189, 5, 69, 23, 30, 140, 155, 115, 82, 79, 108, 189, 250, 254, 178, 90, 253, + 95, 128, 1, 0, 54, 10, 126, 99, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, + 110, 100, 111, 98, 106, 13, 49, 48, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, + 110, 116, 101, 110, 116, 115, 32, 49, 48, 50, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, + 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, + 116, 32, 51, 52, 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, + 47, 70, 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, 49, 57, 54, 32, 48, 32, 82, 47, 84, + 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, + 84, 84, 50, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, 32, 48, 32, 82, + 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, + 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, + 101, 110, 116, 115, 32, 52, 55, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 49, 48, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, + 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, + 110, 103, 116, 104, 32, 50, 55, 48, 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, + 137, 180, 87, 109, 111, 28, 183, 17, 254, 126, 191, 98, 63, 222, 26, 190, 245, 242, 109, 95, + 32, 195, 128, 45, 187, 105, 10, 4, 169, 235, 11, 242, 161, 41, 10, 43, 242, 197, 106, 36, + 85, 150, 173, 184, 237, 175, 47, 103, 200, 25, 14, 185, 220, 147, 236, 32, 8, 172, 220, 146, + 156, 225, 112, 158, 121, 121, 230, 201, 95, 223, 222, 126, 106, 158, 62, 125, 242, 221, 233, + 183, 47, 155, 190, 121, 246, 236, 197, 203, 211, 102, 243, 98, 191, 233, 27, 248, 239, 246, + 151, 205, 147, 253, 190, 111, 148, 110, 246, 135, 77, 223, 205, 243, 60, 225, 134, 106, 244, + 108, 187, 121, 104, 70, 173, 59, 219, 236, 175, 54, 127, 223, 218, 118, 216, 186, 246, 31, + 251, 191, 128, 140, 106, 148, 233, 102, 20, 83, 186, 211, 86, 123, 161, 253, 249, 102, 219, + 180, 251, 127, 109, 118, 106, 214, 93, 111, 166, 102, 167, 134, 206, 232, 180, 17, 4, 131, + 212, 52, 248, 35, 99, 179, 27, 92, 223, 13, 182, 60, 67, 202, 119, 124, 174, 80, 245, 106, + 191, 249, 176, 81, 110, 234, 212, 208, 12, 211, 216, 153, 161, 209, 218, 117, 147, 109, 148, + 245, 22, 223, 190, 219, 252, 248, 168, 185, 134, 167, 138, 75, 179, 23, 146, 240, 220, 119, + 118, 10, 79, 188, 105, 237, 246, 182, 157, 182, 255, 246, 79, 253, 173, 221, 77, 219, 11, + 255, 113, 238, 23, 223, 181, 59, 173, 241, 87, 211, 186, 237, 167, 118, 231, 240, 12, 124, + 252, 220, 238, 212, 184, 125, 239, 183, 222, 250, 95, 40, 14, 82, 120, 6, 87, 206, 252, 31, + 183, 189, 244, 107, 160, 37, 41, 184, 245, 235, 106, 123, 231, 5, 63, 182, 187, 57, 172, + 225, 47, 56, 129, 146, 215, 126, 143, 238, 4, 157, 215, 217, 89, 190, 5, 84, 196, 21, 208, + 8, 134, 93, 231, 150, 2, 104, 222, 97, 175, 189, 203, 140, 247, 80, 244, 215, 0, 0, 63, 212, + 91, 40, 199, 174, 98, 12, 94, 163, 204, 169, 254, 103, 53, 136, 200, 197, 195, 136, 112, 94, + 109, 158, 246, 253, 56, 61, 11, 40, 235, 170, 196, 96, 186, 97, 18, 18, 203, 192, 241, 1, + 57, 153, 16, 110, 247, 32, 230, 101, 189, 235, 109, 132, 8, 16, 88, 66, 244, 223, 118, 55, + 210, 185, 228, 57, 252, 76, 16, 254, 71, 28, 138, 216, 69, 52, 113, 27, 151, 174, 224, 23, + 174, 93, 19, 30, 117, 181, 44, 11, 182, 135, 176, 80, 65, 8, 140, 66, 124, 33, 154, 88, 95, + 93, 225, 33, 41, 252, 185, 213, 184, 4, 138, 111, 48, 216, 56, 168, 26, 132, 190, 247, 217, + 99, 187, 201, 35, 247, 210, 187, 108, 17, 90, 193, 62, 144, 131, 175, 204, 60, 60, 139, 46, + 170, 62, 15, 100, 119, 202, 68, 99, 32, 200, 41, 0, 249, 18, 52, 227, 137, 223, 59, 107, + 109, 60, 13, 55, 220, 242, 201, 207, 20, 203, 112, 250, 23, 56, 141, 34, 39, 168, 18, 171, + 141, 136, 46, 95, 14, 186, 190, 55, 254, 61, 174, 83, 88, 13, 106, 17, 85, 41, 54, 94, 202, + 82, 204, 172, 33, 8, 238, 52, 9, 46, 128, 134, 163, 195, 175, 79, 88, 255, 224, 1, 113, 225, + 134, 194, 12, 116, 197, 53, 192, 162, 2, 154, 89, 128, 118, 222, 166, 155, 146, 9, 101, 6, + 163, 36, 186, 30, 207, 100, 129, 109, 44, 165, 183, 176, 137, 253, 30, 86, 241, 192, 251, + 138, 157, 236, 131, 188, 254, 72, 45, 34, 128, 246, 143, 40, 110, 224, 205, 20, 183, 193, + 88, 120, 177, 124, 192, 36, 226, 233, 36, 184, 175, 142, 162, 253, 125, 40, 194, 45, 232, + 25, 78, 101, 111, 188, 25, 109, 241, 102, 88, 156, 69, 210, 129, 11, 225, 205, 193, 192, + 243, 86, 184, 76, 42, 9, 121, 180, 168, 44, 232, 147, 28, 164, 232, 38, 148, 162, 91, 116, + 42, 54, 168, 148, 111, 150, 38, 134, 6, 194, 214, 5, 192, 64, 46, 100, 81, 150, 18, 81, 238, + 140, 204, 5, 167, 255, 74, 230, 206, 20, 92, 33, 133, 83, 198, 67, 91, 133, 140, 199, 235, + 177, 134, 225, 175, 43, 2, 178, 64, 204, 2, 94, 243, 31, 133, 23, 85, 169, 171, 208, 19, 45, + 63, 48, 56, 12, 202, 71, 40, 230, 228, 220, 210, 233, 147, 204, 23, 173, 208, 85, 162, 85, + 18, 156, 89, 13, 67, 231, 221, 197, 120, 13, 98, 148, 4, 182, 56, 197, 55, 113, 106, 212, + 162, 218, 70, 89, 50, 30, 110, 67, 169, 0, 95, 170, 146, 129, 26, 104, 145, 74, 184, 252, + 177, 245, 157, 232, 4, 77, 56, 230, 101, 223, 157, 191, 206, 203, 104, 0, 152, 122, 30, 61, + 12, 37, 39, 86, 49, 183, 72, 141, 104, 123, 128, 6, 236, 191, 145, 123, 121, 109, 199, 147, + 188, 15, 34, 65, 61, 248, 253, 66, 102, 23, 28, 142, 216, 17, 148, 151, 133, 55, 101, 254, + 156, 180, 247, 149, 136, 175, 118, 198, 189, 228, 192, 167, 84, 120, 0, 181, 79, 191, 54, + 219, 135, 116, 62, 16, 21, 21, 125, 172, 177, 133, 49, 107, 253, 163, 44, 171, 41, 32, 36, + 237, 131, 51, 132, 153, 144, 16, 250, 171, 21, 123, 132, 110, 162, 195, 101, 49, 200, 88, + 221, 117, 108, 51, 226, 236, 162, 142, 251, 87, 106, 194, 0, 43, 253, 33, 10, 37, 143, 60, + 184, 130, 132, 227, 120, 197, 129, 246, 101, 239, 153, 99, 65, 75, 111, 103, 21, 178, 216, + 69, 16, 30, 82, 127, 241, 174, 203, 47, 177, 20, 162, 186, 176, 53, 209, 33, 88, 42, 222, + 175, 184, 86, 232, 126, 187, 171, 48, 170, 47, 240, 142, 91, 247, 141, 19, 122, 110, 56, + 173, 110, 19, 11, 41, 51, 242, 129, 215, 134, 70, 172, 254, 168, 186, 206, 254, 135, 27, 17, + 63, 122, 105, 110, 45, 91, 149, 215, 72, 153, 127, 0, 107, 88, 131, 30, 77, 13, 184, 96, + 198, 228, 24, 17, 46, 46, 235, 127, 142, 73, 24, 138, 167, 188, 12, 82, 116, 232, 144, 241, + 209, 43, 78, 205, 147, 118, 189, 5, 254, 78, 226, 9, 118, 21, 83, 200, 46, 171, 208, 16, + 124, 92, 163, 51, 98, 58, 87, 120, 205, 108, 235, 78, 197, 128, 173, 164, 15, 184, 151, 171, + 159, 140, 246, 18, 1, 202, 129, 59, 238, 199, 247, 99, 176, 147, 36, 43, 142, 165, 18, 193, + 112, 66, 134, 4, 124, 95, 176, 246, 140, 30, 16, 37, 88, 171, 72, 113, 232, 73, 77, 157, 93, + 80, 90, 229, 190, 172, 118, 57, 155, 6, 48, 14, 236, 75, 190, 180, 172, 166, 46, 17, 129, + 52, 99, 222, 197, 90, 66, 104, 184, 10, 116, 110, 13, 58, 183, 82, 248, 74, 220, 156, 205, + 2, 56, 224, 182, 100, 126, 9, 69, 10, 253, 108, 198, 92, 228, 81, 192, 236, 38, 190, 160, + 74, 96, 221, 81, 152, 59, 65, 66, 189, 145, 93, 175, 20, 26, 100, 67, 6, 252, 9, 52, 118, + 240, 40, 229, 95, 103, 98, 125, 237, 253, 107, 190, 133, 69, 102, 224, 34, 218, 194, 167, + 116, 202, 77, 68, 33, 53, 81, 162, 214, 5, 179, 182, 43, 67, 130, 173, 87, 8, 157, 194, 39, + 156, 226, 246, 18, 33, 82, 80, 254, 135, 196, 194, 107, 6, 132, 108, 10, 19, 70, 240, 162, + 120, 197, 33, 155, 42, 174, 98, 115, 55, 86, 104, 2, 203, 106, 145, 137, 3, 40, 128, 221, + 251, 181, 111, 18, 79, 55, 131, 175, 48, 35, 214, 165, 201, 166, 201, 136, 38, 205, 74, 236, + 249, 181, 231, 52, 67, 224, 230, 99, 172, 120, 176, 254, 153, 206, 194, 229, 176, 255, 158, + 213, 84, 7, 162, 172, 162, 208, 59, 213, 178, 129, 218, 60, 126, 67, 200, 136, 151, 106, 91, + 60, 53, 127, 194, 57, 71, 250, 117, 22, 149, 57, 17, 16, 207, 141, 1, 160, 162, 99, 239, 98, + 125, 73, 175, 161, 188, 72, 99, 131, 152, 118, 123, 246, 38, 165, 80, 129, 216, 146, 72, + 203, 145, 32, 84, 130, 172, 150, 85, 122, 212, 146, 138, 159, 115, 29, 190, 206, 90, 83, + 135, 143, 193, 132, 34, 176, 181, 98, 176, 243, 140, 178, 107, 25, 165, 92, 158, 82, 202, + 61, 48, 167, 148, 43, 124, 122, 111, 133, 146, 66, 139, 62, 6, 59, 159, 179, 167, 115, 53, + 137, 187, 252, 189, 196, 104, 229, 29, 231, 241, 224, 226, 118, 97, 50, 17, 105, 50, 159, + 175, 142, 195, 91, 112, 250, 99, 112, 221, 50, 177, 134, 224, 234, 90, 44, 25, 115, 159, + 197, 198, 28, 233, 41, 176, 121, 38, 76, 55, 89, 45, 224, 130, 37, 50, 226, 144, 180, 162, + 50, 44, 221, 130, 222, 20, 179, 1, 156, 75, 13, 48, 159, 113, 203, 94, 9, 103, 25, 69, 140, + 221, 140, 27, 199, 50, 193, 55, 11, 206, 108, 28, 13, 46, 169, 250, 99, 223, 150, 145, 194, + 53, 55, 134, 215, 130, 68, 124, 76, 76, 34, 21, 144, 196, 72, 106, 211, 83, 250, 188, 106, + 213, 180, 156, 210, 230, 114, 144, 97, 172, 238, 211, 86, 155, 249, 200, 136, 160, 68, 17, + 99, 227, 120, 34, 143, 36, 86, 35, 200, 145, 104, 45, 115, 86, 151, 160, 90, 188, 47, 29, 7, + 206, 202, 122, 140, 34, 255, 175, 48, 193, 74, 16, 202, 145, 166, 204, 145, 57, 166, 225, + 69, 140, 197, 52, 64, 157, 173, 156, 226, 75, 249, 226, 203, 152, 245, 73, 174, 70, 99, 133, + 174, 231, 194, 231, 62, 207, 10, 159, 87, 8, 229, 247, 173, 226, 160, 167, 150, 84, 76, 147, + 159, 242, 87, 36, 34, 132, 110, 172, 85, 217, 5, 175, 73, 197, 89, 76, 104, 95, 22, 26, 78, + 132, 153, 251, 218, 32, 83, 64, 159, 112, 240, 72, 19, 133, 154, 167, 78, 79, 97, 128, 8, + 211, 197, 171, 253, 70, 169, 193, 19, 170, 177, 87, 221, 56, 52, 125, 103, 167, 240, 231, + 246, 221, 230, 112, 239, 158, 159, 89, 227, 166, 25, 85, 231, 180, 216, 182, 211, 180, 42, + 122, 108, 47, 92, 105, 252, 95, 23, 247, 204, 228, 58, 45, 5, 87, 54, 63, 108, 148, 214, + 157, 242, 182, 120, 197, 195, 212, 40, 211, 89, 219, 32, 93, 244, 251, 63, 62, 106, 174, 55, + 47, 246, 224, 14, 26, 195, 250, 110, 158, 103, 112, 135, 95, 104, 88, 214, 118, 83, 179, + 191, 242, 112, 123, 94, 100, 68, 191, 244, 174, 122, 13, 119, 24, 40, 225, 241, 10, 219, + 119, 253, 244, 240, 43, 162, 40, 223, 240, 125, 187, 179, 219, 61, 128, 254, 103, 128, 240, + 85, 59, 110, 255, 230, 131, 242, 77, 186, 47, 104, 51, 85, 109, 163, 3, 19, 88, 93, 1, 40, + 56, 169, 159, 86, 64, 139, 155, 43, 160, 173, 139, 218, 70, 207, 182, 211, 54, 44, 7, 226, + 32, 4, 87, 54, 25, 24, 61, 206, 157, 25, 154, 0, 95, 197, 107, 234, 8, 48, 122, 210, 160, + 150, 144, 153, 137, 166, 100, 208, 76, 221, 168, 249, 150, 121, 5, 254, 250, 45, 81, 150, + 111, 97, 119, 162, 102, 55, 9, 251, 141, 158, 86, 96, 175, 171, 142, 194, 226, 1, 25, 155, + 210, 197, 128, 162, 179, 9, 5, 136, 219, 42, 159, 210, 105, 72, 129, 115, 113, 165, 156, 83, + 52, 95, 115, 255, 100, 160, 29, 140, 6, 67, 28, 15, 162, 152, 232, 208, 161, 179, 36, 101, + 37, 51, 141, 6, 128, 240, 161, 176, 81, 214, 111, 109, 228, 144, 139, 250, 239, 90, 91, 22, + 54, 241, 30, 73, 6, 68, 102, 28, 117, 248, 48, 224, 232, 122, 69, 108, 235, 216, 195, 29, + 50, 222, 62, 190, 250, 126, 126, 157, 15, 61, 176, 34, 198, 29, 232, 27, 137, 214, 57, 217, + 231, 119, 58, 200, 39, 86, 14, 95, 151, 12, 53, 247, 44, 209, 153, 156, 224, 0, 240, 117, + 200, 24, 61, 183, 177, 46, 216, 182, 198, 237, 83, 210, 232, 86, 99, 99, 85, 102, 46, 137, + 125, 193, 135, 31, 74, 235, 115, 138, 60, 18, 73, 84, 90, 52, 70, 65, 33, 232, 60, 250, 5, + 143, 133, 197, 196, 45, 19, 107, 188, 105, 109, 53, 80, 151, 211, 217, 27, 58, 206, 56, 7, + 22, 25, 222, 84, 216, 251, 67, 155, 56, 39, 187, 58, 25, 245, 107, 141, 210, 170, 101, 40, + 10, 94, 79, 126, 38, 205, 76, 115, 32, 138, 21, 214, 249, 136, 24, 71, 186, 220, 22, 67, 42, + 124, 34, 44, 41, 229, 46, 40, 75, 226, 246, 79, 91, 236, 19, 126, 1, 174, 251, 193, 255, + 152, 252, 5, 67, 16, 251, 169, 109, 53, 29, 20, 140, 6, 66, 40, 50, 51, 216, 49, 104, 79, + 79, 28, 65, 53, 99, 55, 7, 150, 48, 154, 206, 40, 215, 56, 232, 13, 248, 36, 207, 38, 124, + 44, 243, 193, 144, 114, 67, 55, 15, 170, 217, 165, 83, 81, 239, 27, 174, 6, 12, 93, 66, 243, + 76, 186, 155, 6, 36, 20, 211, 152, 126, 131, 255, 63, 152, 101, 252, 47, 140, 85, 233, 14, + 233, 174, 172, 96, 42, 49, 11, 197, 170, 20, 50, 11, 115, 65, 77, 125, 167, 61, 209, 16, + 195, 87, 30, 213, 224, 224, 106, 92, 143, 69, 92, 11, 102, 254, 150, 94, 115, 41, 38, 206, + 177, 82, 233, 252, 218, 41, 71, 52, 147, 188, 91, 194, 51, 2, 226, 79, 125, 67, 229, 244, + 55, 120, 43, 59, 9, 68, 234, 3, 132, 91, 88, 119, 29, 19, 148, 65, 63, 8, 26, 189, 98, 92, + 149, 194, 194, 70, 8, 72, 109, 37, 3, 70, 211, 222, 82, 233, 75, 98, 101, 45, 205, 171, 103, + 250, 90, 80, 111, 153, 85, 162, 86, 158, 135, 71, 107, 154, 67, 41, 5, 82, 214, 176, 3, 217, + 5, 145, 197, 23, 234, 214, 114, 164, 107, 83, 128, 28, 45, 150, 102, 181, 88, 218, 162, 111, + 91, 83, 150, 203, 213, 192, 178, 38, 199, 206, 58, 81, 137, 192, 57, 97, 84, 5, 237, 220, + 200, 41, 234, 66, 204, 192, 202, 255, 36, 98, 22, 59, 170, 94, 22, 51, 173, 228, 180, 104, + 169, 157, 115, 239, 242, 198, 105, 182, 95, 84, 33, 176, 41, 99, 18, 249, 112, 21, 224, 142, + 116, 192, 86, 186, 116, 165, 52, 146, 225, 31, 112, 126, 36, 80, 243, 8, 76, 141, 77, 82, 0, + 57, 131, 134, 38, 26, 225, 126, 56, 171, 129, 2, 51, 250, 127, 131, 255, 247, 28, 221, 146, + 209, 139, 227, 92, 37, 8, 136, 126, 143, 171, 229, 56, 43, 200, 17, 10, 211, 180, 153, 219, + 22, 79, 28, 48, 84, 0, 79, 246, 114, 220, 81, 203, 154, 108, 60, 155, 213, 158, 204, 164, + 106, 251, 17, 166, 147, 79, 203, 162, 220, 247, 162, 40, 7, 18, 187, 51, 218, 15, 73, 131, + 203, 176, 120, 78, 221, 242, 22, 65, 161, 184, 122, 220, 82, 171, 171, 22, 100, 34, 24, 60, + 102, 232, 217, 172, 207, 134, 113, 115, 101, 204, 88, 23, 245, 180, 221, 224, 240, 134, 203, + 106, 232, 59, 163, 243, 93, 237, 155, 207, 154, 228, 218, 222, 52, 209, 230, 138, 65, 107, + 151, 210, 110, 77, 241, 177, 189, 99, 20, 85, 193, 216, 170, 124, 197, 177, 145, 161, 2, + 246, 227, 72, 201, 211, 251, 106, 212, 35, 123, 125, 25, 65, 84, 214, 118, 189, 158, 189, + 52, 227, 234, 65, 120, 245, 221, 105, 179, 249, 191, 0, 3, 0, 126, 13, 75, 68, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 48, 51, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 49, 48, 52, + 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 53, 32, 48, 32, 82, 47, 82, 101, + 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, + 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, + 32, 49, 55, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, + 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, + 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 52, 56, 47, 84, 121, 112, 101, 47, + 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 49, 48, 52, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, + 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 48, 48, 55, 62, 62, 115, 116, + 114, 101, 97, 109, 13, 10, 72, 137, 156, 87, 91, 111, 20, 199, 18, 126, 223, 95, 49, 143, + 59, 71, 153, 97, 187, 167, 231, 166, 68, 145, 192, 6, 66, 20, 56, 72, 222, 228, 60, 36, 231, + 193, 216, 24, 115, 100, 27, 107, 109, 112, 224, 215, 159, 174, 107, 87, 207, 204, 194, 18, + 69, 94, 50, 221, 85, 213, 117, 253, 170, 234, 209, 235, 211, 221, 125, 241, 211, 79, 143, + 94, 30, 189, 56, 46, 54, 197, 207, 63, 63, 57, 62, 42, 86, 79, 182, 171, 77, 1, 255, 237, + 222, 173, 30, 109, 183, 155, 194, 249, 98, 123, 177, 218, 212, 227, 56, 14, 120, 225, 10, + 63, 134, 122, 236, 138, 222, 251, 58, 20, 219, 235, 213, 159, 235, 80, 118, 235, 174, 252, + 239, 246, 87, 224, 113, 133, 107, 234, 17, 217, 156, 175, 125, 240, 145, 105, 123, 190, 90, + 23, 229, 246, 127, 171, 202, 141, 190, 222, 52, 67, 81, 185, 174, 110, 124, 186, 32, 70, + 226, 26, 186, 72, 210, 23, 85, 215, 110, 234, 46, 76, 105, 68, 120, 165, 116, 115, 81, 162, + 119, 231, 235, 97, 108, 138, 174, 117, 117, 7, 4, 127, 174, 31, 151, 237, 250, 166, 172, 26, + 250, 121, 91, 250, 245, 223, 101, 229, 214, 31, 225, 107, 87, 86, 45, 30, 21, 145, 232, 62, + 218, 244, 161, 172, 232, 227, 117, 89, 13, 235, 211, 178, 234, 136, 6, 238, 224, 248, 9, + 252, 32, 209, 69, 89, 5, 101, 187, 20, 209, 72, 131, 162, 207, 225, 231, 29, 8, 128, 115, + 225, 63, 41, 171, 126, 125, 43, 212, 240, 119, 6, 194, 144, 191, 136, 106, 133, 181, 143, + 148, 155, 248, 231, 227, 87, 179, 110, 74, 223, 174, 43, 253, 12, 101, 31, 201, 192, 237, + 110, 136, 17, 9, 69, 229, 197, 97, 100, 232, 53, 200, 7, 177, 55, 170, 67, 126, 4, 138, 220, + 129, 253, 160, 141, 154, 127, 21, 63, 208, 88, 184, 126, 47, 14, 67, 237, 103, 158, 121, 17, + 63, 146, 244, 247, 86, 12, 218, 114, 143, 154, 2, 229, 22, 206, 81, 44, 122, 28, 40, 238, + 74, 188, 3, 11, 170, 193, 213, 67, 219, 25, 19, 40, 152, 109, 237, 7, 23, 79, 155, 248, 111, + 50, 172, 102, 7, 254, 22, 133, 60, 141, 94, 120, 30, 159, 106, 80, 23, 116, 41, 28, 63, 150, + 39, 225, 244, 143, 178, 26, 145, 144, 188, 122, 84, 14, 235, 95, 224, 8, 136, 94, 129, 54, + 207, 65, 123, 32, 64, 126, 49, 236, 149, 184, 6, 24, 126, 135, 27, 188, 70, 177, 255, 134, + 136, 191, 4, 115, 148, 69, 158, 253, 15, 134, 150, 203, 193, 115, 42, 122, 31, 106, 191, + 105, 109, 49, 60, 221, 174, 156, 195, 90, 234, 154, 190, 238, 98, 125, 213, 129, 127, 118, + 111, 87, 23, 223, 186, 108, 235, 16, 228, 178, 233, 163, 131, 204, 109, 24, 6, 112, 227, 50, + 235, 87, 47, 229, 209, 40, 222, 177, 196, 88, 232, 49, 50, 25, 235, 242, 109, 68, 143, 125, + 160, 225, 60, 18, 119, 155, 6, 24, 17, 53, 36, 144, 174, 28, 57, 46, 224, 196, 244, 151, 78, + 220, 230, 31, 164, 51, 39, 174, 111, 150, 234, 82, 178, 0, 139, 19, 89, 52, 171, 81, 164, + 74, 129, 119, 57, 145, 187, 245, 15, 148, 245, 192, 236, 226, 231, 136, 176, 7, 249, 237, + 11, 131, 126, 104, 124, 244, 109, 8, 128, 77, 65, 43, 242, 132, 210, 190, 130, 202, 192, + 194, 0, 29, 135, 248, 40, 84, 16, 152, 90, 53, 84, 240, 45, 102, 55, 124, 253, 181, 142, 60, + 61, 226, 235, 99, 224, 254, 171, 36, 237, 227, 21, 176, 222, 65, 14, 211, 231, 155, 40, 1, + 101, 191, 143, 116, 14, 5, 190, 75, 183, 167, 192, 124, 173, 239, 195, 237, 185, 48, 156, + 235, 219, 168, 210, 7, 125, 156, 126, 145, 230, 111, 240, 201, 25, 66, 3, 248, 204, 112, 19, + 209, 25, 194, 87, 252, 220, 197, 251, 40, 198, 183, 244, 36, 40, 153, 108, 3, 170, 83, 242, + 53, 66, 68, 164, 71, 29, 225, 73, 96, 4, 106, 60, 53, 118, 193, 93, 4, 87, 215, 50, 78, 108, + 212, 165, 199, 209, 165, 32, 81, 252, 119, 142, 84, 239, 73, 129, 220, 181, 241, 81, 239, + 80, 119, 8, 30, 107, 2, 102, 224, 67, 106, 54, 58, 72, 222, 6, 50, 176, 18, 200, 144, 226, + 51, 149, 57, 94, 36, 167, 188, 45, 99, 124, 144, 241, 86, 8, 237, 203, 86, 218, 69, 252, + 222, 241, 221, 53, 229, 23, 158, 35, 211, 165, 113, 168, 115, 221, 250, 83, 25, 163, 136, + 206, 186, 98, 207, 76, 236, 251, 76, 29, 7, 37, 220, 10, 179, 120, 17, 158, 224, 184, 58, + 116, 34, 36, 169, 117, 227, 246, 95, 209, 123, 40, 231, 193, 4, 61, 214, 62, 153, 137, 194, + 240, 245, 157, 164, 217, 15, 92, 165, 142, 141, 2, 191, 128, 27, 47, 249, 25, 199, 89, 54, + 37, 6, 47, 128, 120, 117, 13, 184, 1, 254, 205, 179, 97, 209, 105, 206, 164, 185, 62, 106, + 147, 86, 40, 110, 210, 231, 142, 147, 136, 114, 117, 250, 0, 248, 193, 16, 223, 79, 140, + 191, 166, 89, 32, 32, 175, 178, 229, 130, 212, 209, 146, 85, 80, 111, 198, 171, 146, 205, + 144, 191, 45, 21, 38, 213, 228, 126, 49, 154, 155, 77, 224, 116, 212, 139, 172, 208, 90, + 246, 49, 86, 141, 24, 74, 63, 121, 113, 163, 12, 244, 216, 143, 212, 244, 128, 21, 20, 123, + 195, 182, 129, 89, 40, 101, 159, 131, 180, 4, 91, 42, 129, 84, 97, 170, 56, 223, 138, 255, + 115, 171, 184, 236, 84, 54, 56, 192, 148, 227, 130, 223, 190, 215, 50, 206, 49, 47, 97, 84, + 174, 220, 164, 4, 40, 134, 193, 226, 198, 39, 152, 237, 114, 249, 75, 201, 232, 77, 170, 17, + 18, 130, 254, 130, 133, 115, 212, 5, 250, 7, 17, 166, 37, 206, 23, 187, 76, 49, 45, 95, 237, + 11, 214, 46, 78, 79, 248, 254, 189, 116, 113, 38, 105, 151, 189, 166, 38, 128, 148, 69, 203, + 67, 43, 202, 14, 248, 230, 149, 70, 5, 125, 156, 252, 54, 101, 250, 199, 33, 30, 68, 2, 37, + 214, 46, 203, 186, 27, 86, 229, 11, 15, 134, 11, 121, 8, 249, 102, 211, 24, 68, 221, 50, + 140, 2, 29, 198, 78, 74, 52, 53, 148, 172, 137, 132, 86, 186, 72, 176, 142, 179, 41, 144, + 218, 128, 6, 235, 227, 82, 46, 100, 125, 196, 75, 53, 42, 233, 37, 67, 221, 14, 93, 145, + 117, 162, 164, 17, 91, 2, 220, 248, 45, 24, 58, 201, 117, 77, 187, 172, 254, 66, 86, 125, + 112, 247, 12, 56, 4, 114, 204, 0, 128, 126, 96, 164, 3, 186, 45, 147, 204, 64, 5, 46, 95, + 195, 20, 4, 66, 4, 26, 64, 41, 108, 4, 63, 70, 114, 111, 221, 118, 164, 237, 65, 19, 98, 10, + 98, 0, 164, 207, 165, 175, 167, 234, 146, 148, 185, 150, 199, 85, 128, 109, 43, 75, 238, + 112, 125, 214, 18, 46, 37, 191, 52, 250, 182, 238, 168, 17, 57, 213, 228, 19, 175, 110, 182, + 145, 134, 172, 141, 246, 66, 154, 178, 36, 53, 131, 204, 181, 182, 107, 168, 22, 211, 118, + 194, 13, 213, 119, 217, 196, 50, 12, 52, 177, 236, 107, 175, 156, 22, 218, 193, 42, 92, 189, + 134, 52, 90, 164, 10, 154, 149, 168, 62, 157, 156, 118, 171, 169, 56, 164, 135, 172, 173, + 44, 219, 231, 164, 139, 162, 117, 70, 35, 21, 206, 23, 58, 52, 191, 9, 229, 154, 137, 154, + 246, 234, 52, 33, 88, 217, 50, 21, 164, 215, 77, 64, 40, 215, 231, 163, 95, 54, 243, 220, + 137, 138, 83, 236, 113, 220, 129, 19, 76, 38, 252, 73, 80, 33, 206, 111, 76, 72, 237, 184, + 167, 243, 203, 229, 164, 2, 39, 67, 162, 159, 22, 187, 225, 151, 196, 106, 2, 213, 208, 183, + 198, 207, 175, 212, 61, 235, 233, 15, 83, 116, 210, 102, 117, 10, 121, 224, 210, 27, 5, 223, + 105, 58, 132, 239, 139, 44, 223, 116, 184, 23, 98, 105, 117, 135, 180, 193, 49, 240, 239, + 11, 168, 67, 132, 5, 220, 131, 182, 212, 213, 198, 144, 160, 91, 203, 121, 154, 53, 83, 63, + 168, 35, 70, 118, 225, 190, 165, 42, 89, 212, 196, 239, 184, 76, 249, 117, 15, 255, 83, 150, + 176, 85, 209, 141, 93, 48, 224, 251, 128, 224, 168, 47, 193, 8, 173, 46, 202, 98, 16, 196, + 161, 142, 194, 112, 105, 83, 197, 184, 166, 70, 217, 30, 193, 193, 61, 238, 123, 209, 72, + 83, 112, 123, 211, 109, 220, 131, 61, 227, 158, 85, 101, 204, 82, 111, 60, 104, 239, 89, + 136, 8, 196, 212, 198, 100, 220, 159, 154, 135, 69, 68, 29, 8, 126, 240, 152, 9, 173, 46, + 41, 1, 191, 166, 75, 81, 123, 72, 96, 218, 137, 195, 225, 36, 185, 186, 227, 199, 234, 50, + 91, 39, 253, 70, 49, 229, 68, 219, 239, 130, 234, 58, 188, 57, 148, 6, 146, 32, 120, 71, + 236, 107, 153, 15, 181, 113, 55, 132, 60, 220, 147, 135, 217, 112, 136, 1, 204, 135, 91, + 245, 230, 185, 36, 228, 210, 20, 56, 159, 25, 41, 68, 23, 6, 12, 244, 1, 43, 131, 200, 210, + 147, 124, 39, 125, 17, 47, 180, 49, 178, 9, 38, 127, 224, 83, 102, 182, 27, 45, 197, 37, + 108, 214, 206, 169, 45, 254, 210, 54, 141, 134, 16, 102, 151, 143, 159, 6, 78, 39, 91, 18, + 195, 161, 69, 209, 54, 240, 30, 41, 139, 213, 108, 12, 16, 44, 167, 174, 148, 198, 221, 125, + 171, 167, 221, 12, 81, 65, 219, 204, 248, 201, 219, 210, 182, 176, 59, 233, 93, 211, 119, + 47, 140, 147, 178, 145, 145, 32, 90, 112, 213, 212, 14, 97, 52, 222, 191, 161, 40, 250, 222, + 214, 73, 74, 76, 212, 24, 127, 180, 74, 23, 22, 36, 173, 23, 245, 174, 6, 55, 87, 93, 130, + 84, 67, 165, 23, 165, 206, 122, 143, 182, 219, 77, 225, 124, 177, 189, 88, 85, 77, 95, 135, + 48, 104, 161, 156, 71, 125, 30, 71, 249, 181, 214, 110, 213, 52, 232, 183, 198, 5, 188, 185, + 166, 25, 7, 244, 169, 96, 94, 136, 63, 249, 209, 125, 100, 187, 227, 152, 55, 88, 55, 45, + 92, 248, 70, 14, 128, 224, 18, 40, 129, 133, 207, 110, 225, 123, 71, 181, 208, 2, 52, 245, + 200, 119, 71, 134, 33, 126, 176, 120, 43, 122, 71, 89, 4, 141, 10, 151, 12, 68, 214, 24, 0, + 126, 178, 129, 192, 169, 13, 247, 52, 228, 120, 107, 140, 42, 252, 30, 92, 4, 99, 217, 113, + 20, 176, 137, 72, 36, 102, 161, 98, 115, 121, 145, 223, 80, 130, 132, 207, 165, 107, 216, + 191, 226, 83, 46, 26, 240, 105, 108, 79, 241, 1, 120, 146, 216, 142, 99, 67, 128, 78, 53, + 196, 214, 160, 16, 56, 144, 126, 40, 82, 53, 3, 243, 208, 78, 116, 10, 26, 9, 234, 128, 197, + 83, 181, 218, 185, 78, 124, 78, 207, 195, 11, 127, 64, 114, 44, 188, 142, 130, 83, 72, 225, + 232, 4, 50, 6, 207, 99, 189, 4, 84, 4, 31, 66, 241, 167, 165, 227, 128, 157, 151, 142, 30, + 121, 9, 151, 111, 75, 230, 185, 163, 237, 73, 194, 10, 231, 119, 101, 211, 167, 20, 116, + 156, 130, 147, 26, 88, 4, 231, 59, 241, 123, 136, 112, 223, 73, 59, 109, 233, 11, 219, 2, + 31, 49, 129, 224, 118, 14, 44, 77, 152, 117, 158, 234, 192, 137, 173, 9, 223, 152, 7, 154, + 233, 60, 64, 103, 202, 96, 222, 123, 131, 124, 139, 173, 163, 249, 86, 231, 200, 236, 32, + 180, 153, 172, 189, 58, 2, 146, 154, 179, 222, 177, 228, 4, 56, 20, 85, 18, 50, 219, 21, + 206, 219, 233, 153, 213, 240, 190, 75, 107, 29, 120, 140, 218, 150, 219, 211, 93, 242, 87, + 211, 32, 193, 215, 183, 37, 45, 71, 186, 87, 42, 158, 89, 8, 7, 207, 225, 33, 99, 26, 178, + 110, 17, 80, 88, 176, 53, 116, 230, 125, 61, 188, 74, 123, 133, 238, 114, 232, 194, 125, 93, + 189, 221, 179, 107, 78, 186, 153, 244, 246, 54, 61, 139, 151, 98, 217, 188, 189, 107, 174, + 163, 124, 60, 190, 74, 235, 28, 110, 156, 188, 121, 168, 3, 225, 24, 9, 193, 187, 23, 51, + 97, 208, 107, 164, 9, 15, 146, 202, 222, 241, 192, 4, 126, 76, 137, 14, 103, 191, 130, 9, + 26, 220, 143, 165, 241, 155, 106, 65, 131, 150, 12, 91, 45, 14, 90, 94, 86, 143, 3, 251, 73, + 67, 253, 196, 145, 1, 233, 79, 78, 190, 163, 187, 64, 232, 187, 132, 127, 36, 99, 210, 87, + 218, 245, 51, 233, 30, 59, 222, 61, 29, 210, 16, 182, 69, 161, 103, 224, 54, 229, 192, 199, + 16, 176, 174, 202, 86, 122, 147, 203, 250, 70, 59, 235, 93, 14, 225, 195, 49, 210, 233, 19, + 31, 184, 117, 247, 210, 174, 218, 152, 164, 21, 163, 236, 142, 34, 222, 18, 172, 226, 143, + 152, 127, 70, 9, 211, 37, 92, 22, 199, 211, 42, 177, 0, 159, 11, 205, 38, 171, 7, 192, 139, + 8, 131, 207, 100, 68, 216, 73, 230, 43, 74, 197, 219, 19, 129, 174, 203, 50, 27, 82, 63, + 150, 102, 97, 96, 90, 59, 177, 234, 247, 244, 185, 131, 48, 181, 157, 129, 170, 160, 149, + 128, 106, 155, 163, 170, 215, 53, 11, 110, 166, 123, 150, 106, 100, 39, 117, 248, 150, 154, + 158, 21, 181, 86, 253, 1, 160, 59, 78, 64, 23, 14, 68, 220, 25, 174, 156, 90, 241, 105, 138, + 228, 44, 25, 23, 188, 52, 82, 121, 78, 240, 195, 44, 106, 217, 212, 202, 235, 29, 89, 177, + 19, 48, 56, 149, 160, 222, 228, 58, 210, 92, 186, 216, 167, 156, 147, 193, 58, 61, 58, 93, + 17, 31, 4, 146, 12, 226, 192, 249, 87, 49, 71, 125, 57, 1, 30, 199, 204, 155, 180, 160, 13, + 249, 135, 71, 67, 229, 136, 81, 162, 151, 233, 218, 52, 156, 222, 78, 220, 140, 222, 66, + 172, 91, 9, 37, 46, 217, 157, 218, 94, 255, 221, 17, 232, 131, 93, 13, 251, 131, 252, 207, + 60, 217, 75, 94, 118, 140, 62, 24, 166, 157, 174, 43, 228, 207, 180, 180, 162, 15, 213, 249, + 243, 248, 248, 81, 215, 148, 56, 234, 241, 129, 238, 46, 170, 26, 95, 216, 30, 188, 108, + 239, 226, 141, 157, 189, 184, 229, 137, 190, 168, 199, 50, 37, 139, 90, 76, 31, 191, 148, + 63, 121, 211, 2, 146, 165, 228, 129, 243, 229, 197, 49, 183, 48, 175, 230, 180, 10, 229, + 195, 76, 157, 246, 160, 141, 182, 169, 227, 5, 212, 236, 21, 52, 193, 244, 25, 108, 246, + 203, 168, 25, 50, 204, 244, 54, 240, 41, 89, 103, 169, 216, 31, 134, 152, 125, 6, 152, 121, + 6, 73, 2, 206, 166, 208, 49, 7, 196, 254, 171, 3, 104, 111, 7, 49, 40, 75, 248, 210, 193, + 197, 226, 97, 191, 48, 132, 110, 180, 13, 29, 219, 81, 138, 247, 139, 132, 176, 110, 17, 97, + 93, 48, 181, 196, 28, 96, 8, 161, 43, 40, 177, 75, 67, 23, 35, 131, 20, 165, 140, 74, 89, + 226, 201, 40, 246, 75, 36, 194, 88, 189, 210, 121, 3, 144, 134, 16, 7, 180, 247, 60, 21, 44, + 182, 1, 144, 146, 159, 221, 243, 56, 161, 83, 104, 104, 23, 51, 234, 149, 204, 105, 15, 105, + 44, 179, 16, 48, 204, 0, 0, 40, 82, 169, 221, 100, 195, 50, 221, 206, 70, 90, 183, 15, 20, + 29, 132, 18, 196, 30, 16, 76, 55, 105, 235, 193, 6, 15, 110, 151, 58, 156, 157, 122, 131, + 89, 192, 30, 36, 187, 193, 6, 41, 15, 18, 195, 17, 2, 3, 65, 93, 50, 149, 174, 180, 28, 232, + 240, 86, 87, 29, 242, 68, 2, 200, 61, 73, 134, 218, 36, 149, 24, 116, 29, 39, 149, 230, 154, + 198, 79, 92, 79, 218, 156, 149, 126, 63, 168, 129, 16, 114, 160, 105, 162, 215, 130, 253, + 87, 106, 14, 235, 209, 175, 171, 200, 251, 166, 12, 217, 32, 96, 156, 237, 166, 69, 38, 176, + 161, 101, 139, 60, 236, 81, 125, 12, 52, 250, 2, 183, 95, 178, 28, 210, 149, 65, 55, 63, + 102, 202, 144, 105, 178, 116, 197, 249, 18, 187, 135, 98, 102, 202, 240, 115, 19, 57, 201, + 194, 148, 97, 81, 118, 96, 253, 249, 61, 174, 196, 164, 55, 147, 76, 215, 197, 224, 166, + 192, 39, 227, 168, 145, 153, 38, 151, 153, 31, 130, 51, 229, 190, 183, 5, 139, 32, 177, 215, + 143, 41, 164, 98, 209, 121, 86, 87, 70, 124, 74, 31, 13, 167, 236, 182, 178, 66, 129, 195, + 158, 110, 87, 209, 191, 245, 216, 21, 29, 101, 226, 166, 142, 19, 56, 254, 236, 222, 174, + 46, 226, 101, 27, 103, 114, 185, 108, 250, 166, 246, 230, 54, 12, 3, 28, 239, 99, 69, 185, + 110, 227, 106, 207, 231, 173, 107, 234, 166, 155, 92, 111, 234, 97, 47, 235, 226, 29, 106, + 68, 119, 123, 20, 218, 247, 166, 94, 47, 200, 253, 218, 221, 211, 151, 71, 197, 234, 255, 2, + 12, 0, 118, 23, 122, 199, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, + 100, 111, 98, 106, 13, 49, 48, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, + 116, 101, 110, 116, 115, 32, 49, 48, 54, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, + 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, + 51, 52, 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, + 111, 110, 116, 60, 60, 47, 67, 50, 95, 48, 32, 49, 57, 54, 32, 48, 32, 82, 47, 84, 84, 48, + 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, + 50, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, + 84, 52, 32, 49, 56, 57, 32, 48, 32, 82, 47, 84, 84, 53, 32, 50, 48, 49, 32, 48, 32, 82, 62, + 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, + 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, + 101, 110, 116, 115, 32, 52, 57, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, + 101, 110, 100, 111, 98, 106, 13, 49, 48, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, + 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, + 110, 103, 116, 104, 32, 51, 49, 49, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, + 137, 180, 87, 109, 111, 28, 185, 13, 254, 190, 191, 98, 62, 238, 20, 157, 201, 72, 35, 205, + 11, 18, 4, 72, 28, 95, 234, 67, 239, 122, 64, 22, 237, 135, 92, 209, 38, 177, 125, 155, 203, + 38, 54, 214, 246, 57, 185, 95, 95, 145, 34, 41, 106, 94, 156, 92, 139, 34, 240, 102, 36, 81, + 20, 69, 82, 15, 31, 62, 250, 233, 205, 241, 182, 120, 242, 228, 209, 15, 39, 103, 47, 138, + 166, 120, 250, 244, 249, 139, 147, 98, 243, 124, 183, 105, 10, 248, 119, 252, 101, 243, 104, + 183, 107, 10, 99, 139, 221, 229, 166, 169, 199, 113, 28, 112, 193, 20, 118, 116, 245, 216, + 21, 189, 181, 181, 43, 118, 31, 55, 175, 183, 174, 236, 182, 125, 249, 207, 221, 247, 176, + 199, 20, 166, 173, 71, 220, 102, 108, 109, 157, 13, 155, 118, 231, 155, 109, 81, 238, 126, + 221, 84, 102, 180, 117, 211, 14, 69, 101, 186, 186, 181, 105, 33, 110, 140, 187, 134, 46, + 136, 244, 69, 213, 249, 166, 238, 220, 84, 134, 149, 87, 34, 183, 174, 202, 217, 186, 183, + 99, 209, 121, 83, 27, 148, 120, 189, 189, 46, 221, 246, 88, 14, 219, 171, 96, 243, 121, 89, + 25, 191, 189, 11, 51, 239, 74, 187, 189, 45, 43, 191, 189, 41, 171, 113, 251, 231, 114, 12, + 170, 42, 235, 93, 28, 127, 9, 223, 219, 79, 65, 12, 69, 246, 225, 227, 2, 102, 112, 244, 62, + 232, 130, 221, 32, 223, 186, 160, 210, 225, 212, 155, 160, 122, 251, 17, 126, 224, 160, 79, + 120, 16, 172, 101, 250, 91, 56, 184, 50, 61, 202, 160, 54, 252, 137, 59, 92, 16, 171, 76, + 195, 130, 151, 124, 42, 24, 127, 11, 198, 225, 57, 135, 32, 99, 240, 235, 119, 216, 74, 18, + 48, 71, 251, 126, 129, 3, 143, 108, 209, 57, 107, 161, 213, 59, 52, 12, 150, 113, 22, 101, + 104, 41, 93, 17, 174, 87, 151, 213, 16, 86, 32, 198, 77, 240, 184, 195, 192, 188, 8, 254, + 220, 5, 99, 247, 116, 105, 188, 92, 216, 110, 194, 246, 251, 232, 28, 176, 228, 32, 118, + 210, 26, 30, 115, 224, 13, 112, 93, 90, 96, 215, 90, 92, 133, 80, 193, 130, 143, 218, 163, + 19, 73, 18, 13, 91, 188, 150, 33, 103, 225, 66, 116, 111, 238, 40, 220, 138, 171, 18, 192, + 20, 35, 82, 240, 54, 40, 8, 81, 239, 245, 56, 57, 228, 118, 238, 106, 16, 2, 77, 98, 137, + 164, 75, 244, 193, 37, 185, 8, 124, 169, 207, 134, 53, 142, 55, 221, 21, 134, 151, 100, 12, + 248, 123, 247, 167, 224, 230, 60, 243, 64, 114, 164, 43, 130, 105, 176, 229, 55, 136, 144, + 94, 149, 187, 226, 36, 230, 162, 206, 62, 16, 193, 228, 152, 220, 43, 186, 154, 214, 72, 14, + 172, 62, 176, 179, 193, 235, 162, 91, 156, 52, 186, 236, 30, 108, 29, 90, 133, 95, 49, 8, + 195, 170, 254, 20, 3, 24, 161, 81, 104, 46, 254, 164, 32, 169, 236, 81, 247, 196, 219, 93, + 227, 110, 16, 75, 111, 68, 185, 16, 66, 115, 199, 81, 33, 187, 125, 114, 44, 131, 194, 29, + 219, 182, 199, 171, 120, 117, 133, 163, 228, 16, 11, 74, 198, 59, 52, 77, 222, 49, 200, 196, + 24, 126, 45, 232, 164, 129, 50, 18, 102, 206, 233, 92, 178, 140, 33, 74, 4, 229, 181, 198, + 11, 177, 199, 162, 90, 229, 217, 8, 56, 247, 146, 1, 7, 10, 128, 232, 22, 199, 225, 50, 189, + 112, 211, 165, 103, 110, 155, 201, 51, 239, 84, 92, 40, 213, 226, 225, 123, 142, 139, 156, + 159, 4, 65, 230, 134, 29, 42, 193, 99, 75, 18, 0, 38, 83, 96, 158, 211, 36, 134, 49, 98, 4, + 93, 4, 222, 146, 192, 161, 32, 119, 140, 194, 165, 138, 100, 80, 104, 13, 110, 107, 194, + 200, 132, 63, 188, 99, 3, 175, 117, 235, 121, 104, 113, 8, 18, 54, 252, 181, 113, 218, 145, + 19, 84, 13, 172, 218, 190, 118, 110, 64, 175, 12, 67, 44, 38, 207, 130, 238, 58, 236, 112, + 9, 194, 30, 250, 15, 196, 63, 66, 226, 93, 148, 0, 16, 85, 11, 21, 168, 157, 76, 221, 150, + 26, 81, 124, 156, 20, 212, 131, 40, 132, 241, 69, 41, 88, 247, 138, 119, 191, 3, 119, 92, + 69, 236, 97, 213, 90, 6, 215, 101, 55, 46, 223, 193, 207, 1, 253, 106, 245, 25, 87, 12, 35, + 126, 249, 204, 147, 224, 97, 220, 123, 19, 179, 154, 118, 224, 69, 110, 168, 134, 128, 220, + 142, 160, 22, 94, 36, 38, 156, 135, 87, 225, 226, 143, 114, 202, 187, 8, 65, 29, 148, 60, + 187, 88, 102, 32, 122, 35, 210, 140, 46, 132, 46, 214, 197, 68, 56, 48, 64, 28, 31, 218, + 117, 174, 138, 19, 195, 98, 116, 133, 73, 153, 115, 133, 193, 79, 175, 78, 36, 98, 90, 202, + 94, 198, 142, 3, 189, 61, 214, 246, 243, 54, 40, 57, 45, 251, 237, 103, 184, 250, 12, 128, + 48, 43, 189, 67, 59, 20, 118, 114, 65, 128, 191, 159, 203, 232, 86, 159, 151, 80, 93, 115, + 102, 47, 187, 226, 26, 154, 158, 12, 95, 65, 172, 141, 82, 196, 39, 224, 146, 106, 27, 195, + 48, 170, 147, 186, 215, 78, 248, 13, 7, 2, 193, 51, 175, 105, 92, 2, 244, 35, 135, 215, 7, + 46, 202, 44, 57, 18, 76, 167, 210, 14, 22, 88, 35, 60, 41, 171, 4, 14, 195, 156, 63, 200, + 56, 127, 207, 120, 37, 22, 198, 121, 25, 38, 120, 141, 11, 241, 206, 151, 115, 65, 169, 144, + 110, 251, 29, 151, 165, 35, 59, 94, 41, 160, 44, 176, 235, 57, 64, 130, 152, 2, 103, 128, + 36, 84, 132, 248, 240, 99, 217, 218, 121, 21, 154, 164, 2, 151, 9, 149, 10, 0, 41, 148, 218, + 150, 83, 219, 215, 118, 232, 53, 145, 62, 221, 109, 140, 137, 60, 188, 49, 117, 223, 21, 77, + 29, 114, 31, 127, 142, 23, 155, 203, 175, 45, 250, 240, 84, 120, 177, 237, 219, 218, 170, + 85, 55, 12, 240, 128, 150, 183, 62, 184, 72, 135, 250, 240, 18, 13, 105, 52, 29, 190, 70, + 189, 119, 109, 57, 244, 30, 107, 45, 135, 177, 40, 237, 173, 71, 30, 15, 61, 199, 243, 154, + 74, 194, 95, 233, 5, 190, 4, 60, 58, 11, 147, 8, 118, 48, 11, 200, 178, 67, 255, 195, 244, + 223, 33, 192, 32, 8, 155, 0, 192, 254, 2, 19, 32, 243, 35, 132, 3, 183, 195, 242, 43, 102, + 6, 176, 233, 71, 41, 33, 184, 142, 107, 187, 152, 36, 94, 206, 248, 71, 248, 123, 197, 33, + 107, 185, 139, 9, 141, 78, 184, 193, 114, 204, 124, 219, 193, 181, 151, 195, 66, 139, 43, + 97, 89, 219, 26, 245, 6, 13, 158, 54, 89, 236, 121, 178, 173, 203, 171, 223, 224, 247, 166, + 133, 141, 201, 239, 134, 124, 255, 2, 145, 88, 138, 143, 128, 60, 22, 2, 41, 94, 88, 0, 14, + 101, 92, 194, 242, 128, 51, 128, 247, 48, 195, 37, 203, 184, 21, 76, 239, 51, 76, 207, 1, + 124, 66, 225, 25, 247, 12, 149, 114, 203, 208, 103, 156, 38, 88, 204, 244, 157, 162, 50, 11, + 218, 146, 88, 212, 7, 186, 6, 193, 164, 41, 196, 156, 192, 165, 95, 130, 62, 52, 113, 39, + 130, 207, 24, 74, 20, 188, 68, 20, 60, 230, 80, 242, 86, 144, 55, 245, 59, 10, 28, 191, 6, + 249, 68, 236, 91, 167, 201, 211, 164, 81, 17, 28, 202, 10, 1, 14, 184, 221, 148, 46, 116, + 66, 128, 90, 27, 120, 15, 129, 208, 235, 32, 215, 109, 171, 105, 184, 186, 144, 45, 86, 167, + 252, 163, 19, 251, 175, 68, 160, 198, 186, 237, 128, 64, 97, 238, 5, 153, 39, 77, 211, 15, + 79, 65, 44, 65, 29, 237, 75, 58, 81, 218, 241, 177, 210, 242, 73, 177, 148, 118, 214, 47, + 160, 60, 76, 126, 100, 241, 79, 165, 52, 11, 193, 247, 0, 229, 31, 137, 171, 100, 123, 143, + 89, 97, 219, 11, 158, 31, 168, 189, 35, 249, 44, 252, 162, 0, 109, 251, 76, 77, 17, 204, + 166, 160, 113, 207, 32, 129, 33, 137, 203, 140, 53, 208, 36, 117, 91, 100, 39, 108, 137, + 181, 136, 91, 10, 170, 155, 118, 204, 216, 18, 240, 82, 96, 75, 215, 138, 5, 231, 25, 46, + 13, 80, 204, 114, 102, 63, 112, 106, 207, 221, 196, 164, 130, 83, 135, 11, 235, 179, 236, + 134, 201, 72, 185, 185, 167, 33, 151, 82, 98, 184, 194, 152, 186, 113, 8, 136, 222, 213, + 198, 24, 202, 142, 127, 79, 162, 252, 26, 181, 169, 38, 82, 34, 216, 59, 34, 99, 71, 177, + 88, 63, 27, 88, 167, 124, 237, 22, 207, 29, 92, 237, 198, 126, 229, 88, 31, 170, 152, 73, + 41, 157, 180, 221, 39, 149, 100, 130, 157, 25, 128, 79, 166, 101, 38, 90, 89, 231, 66, 126, + 143, 25, 88, 161, 149, 159, 35, 251, 166, 166, 246, 90, 133, 159, 188, 167, 98, 223, 47, + 144, 48, 152, 4, 145, 196, 20, 228, 253, 139, 214, 32, 53, 178, 148, 163, 145, 60, 17, 252, + 185, 211, 45, 154, 222, 151, 105, 143, 227, 196, 56, 127, 3, 98, 115, 133, 72, 61, 164, 93, + 76, 249, 122, 97, 102, 32, 47, 134, 115, 166, 171, 107, 138, 9, 215, 248, 7, 71, 65, 138, + 127, 1, 239, 46, 18, 254, 116, 21, 194, 192, 43, 236, 50, 58, 204, 76, 69, 57, 147, 239, + 188, 74, 117, 152, 65, 211, 23, 205, 206, 182, 49, 240, 194, 140, 220, 224, 113, 217, 114, + 50, 105, 4, 35, 44, 10, 214, 255, 111, 8, 150, 241, 73, 29, 11, 179, 72, 85, 91, 71, 205, + 74, 55, 229, 152, 137, 112, 79, 128, 97, 100, 109, 83, 252, 225, 7, 46, 181, 200, 172, 188, + 224, 21, 91, 12, 135, 47, 135, 201, 188, 63, 32, 65, 1, 107, 49, 74, 171, 97, 0, 141, 105, + 55, 7, 49, 31, 108, 105, 226, 11, 108, 99, 222, 196, 7, 65, 97, 107, 149, 231, 244, 193, + 126, 210, 251, 176, 2, 131, 199, 41, 165, 62, 41, 253, 6, 157, 234, 105, 181, 75, 88, 223, + 230, 174, 214, 193, 97, 45, 115, 155, 230, 79, 189, 125, 200, 107, 237, 228, 165, 134, 49, + 180, 72, 62, 124, 181, 139, 143, 104, 114, 63, 191, 120, 59, 169, 247, 145, 42, 121, 36, 59, + 141, 52, 97, 48, 163, 244, 196, 106, 176, 164, 233, 241, 255, 233, 193, 72, 41, 98, 12, 78, + 53, 156, 19, 158, 200, 12, 216, 6, 83, 191, 11, 237, 129, 84, 27, 85, 80, 143, 216, 66, 218, + 68, 33, 168, 248, 25, 5, 158, 203, 0, 43, 216, 49, 16, 168, 94, 107, 179, 98, 35, 23, 33, + 55, 198, 242, 60, 41, 78, 143, 52, 207, 54, 182, 44, 26, 142, 38, 221, 149, 46, 103, 53, 32, + 131, 29, 38, 38, 2, 118, 136, 68, 243, 100, 229, 87, 216, 72, 189, 99, 78, 239, 248, 80, + 194, 16, 148, 254, 0, 190, 33, 233, 16, 150, 44, 177, 65, 72, 128, 250, 45, 124, 84, 51, 2, + 177, 66, 145, 89, 61, 228, 78, 208, 14, 245, 154, 166, 179, 140, 149, 19, 190, 65, 95, 226, + 220, 150, 168, 116, 59, 37, 221, 237, 42, 235, 110, 167, 180, 155, 189, 230, 227, 155, 105, + 176, 139, 1, 93, 125, 248, 210, 117, 28, 221, 39, 181, 3, 83, 169, 134, 51, 42, 205, 47, 60, + 101, 106, 16, 14, 38, 125, 37, 157, 195, 131, 52, 93, 203, 233, 12, 247, 124, 203, 97, 70, + 211, 32, 29, 184, 16, 172, 112, 179, 188, 98, 217, 57, 8, 163, 193, 249, 123, 156, 86, 3, + 171, 123, 160, 47, 76, 81, 77, 158, 248, 89, 189, 84, 199, 37, 70, 64, 19, 231, 165, 34, 24, + 145, 155, 166, 174, 6, 100, 51, 228, 210, 199, 208, 112, 175, 21, 40, 215, 115, 89, 148, 59, + 164, 231, 247, 184, 140, 89, 101, 230, 129, 168, 200, 201, 137, 124, 253, 209, 184, 200, + 235, 228, 166, 40, 117, 99, 130, 200, 183, 10, 88, 188, 26, 73, 85, 22, 183, 205, 74, 177, + 203, 24, 13, 110, 152, 168, 60, 10, 126, 73, 111, 6, 162, 41, 188, 239, 169, 1, 137, 70, + 101, 232, 244, 184, 244, 15, 251, 4, 138, 234, 31, 247, 201, 37, 99, 43, 28, 125, 192, 52, + 205, 178, 78, 21, 143, 46, 49, 176, 40, 116, 77, 100, 143, 104, 94, 159, 132, 51, 62, 145, + 154, 213, 188, 15, 154, 120, 232, 189, 208, 19, 16, 173, 169, 86, 77, 58, 212, 170, 183, + 117, 223, 250, 140, 129, 63, 175, 195, 30, 75, 230, 197, 3, 227, 215, 124, 228, 183, 223, + 209, 161, 29, 180, 28, 128, 234, 30, 193, 217, 225, 215, 109, 80, 130, 107, 240, 113, 81, + 90, 142, 78, 139, 208, 128, 27, 174, 40, 25, 250, 248, 115, 129, 5, 171, 242, 113, 145, 183, + 132, 123, 186, 40, 121, 228, 2, 140, 210, 239, 75, 18, 60, 82, 57, 230, 19, 32, 214, 225, + 20, 62, 22, 151, 175, 97, 230, 24, 61, 131, 110, 55, 184, 118, 83, 246, 201, 45, 28, 211, + 182, 175, 157, 235, 51, 175, 60, 19, 170, 34, 152, 1, 153, 149, 207, 160, 227, 185, 238, 49, + 191, 209, 189, 87, 235, 228, 145, 204, 18, 190, 117, 42, 132, 231, 42, 226, 222, 233, 194, + 251, 80, 61, 80, 0, 40, 252, 45, 17, 194, 105, 133, 139, 154, 236, 122, 105, 201, 21, 89, + 73, 139, 21, 118, 167, 105, 153, 128, 211, 114, 181, 113, 179, 106, 67, 147, 154, 238, 193, + 88, 92, 139, 198, 191, 165, 215, 193, 158, 1, 137, 200, 21, 178, 71, 134, 30, 21, 164, 212, + 120, 161, 26, 9, 218, 62, 105, 179, 156, 34, 69, 178, 135, 35, 234, 22, 156, 232, 230, 173, + 6, 63, 202, 27, 54, 99, 22, 161, 68, 224, 209, 71, 19, 110, 124, 205, 215, 253, 18, 159, + 196, 212, 138, 49, 119, 147, 55, 58, 113, 62, 196, 219, 70, 54, 225, 21, 88, 72, 225, 124, + 19, 6, 194, 82, 210, 209, 26, 169, 113, 227, 130, 103, 4, 151, 80, 64, 165, 0, 12, 169, 231, + 180, 243, 166, 211, 235, 190, 232, 72, 233, 117, 199, 169, 191, 79, 42, 78, 75, 3, 12, 10, + 105, 121, 221, 52, 38, 123, 129, 152, 73, 226, 230, 244, 240, 142, 186, 0, 195, 251, 255, + 91, 57, 41, 45, 233, 126, 49, 0, 202, 155, 62, 146, 176, 211, 128, 2, 168, 63, 236, 53, 113, + 77, 49, 71, 175, 57, 158, 139, 244, 49, 127, 51, 132, 212, 54, 225, 250, 132, 64, 179, 151, + 53, 43, 64, 240, 50, 189, 122, 183, 76, 17, 22, 0, 28, 45, 168, 161, 168, 21, 165, 85, 229, + 92, 144, 28, 49, 107, 40, 42, 219, 228, 72, 222, 126, 35, 146, 63, 99, 84, 21, 248, 60, 135, + 159, 124, 234, 150, 200, 162, 195, 47, 65, 220, 87, 32, 132, 72, 188, 7, 41, 16, 199, 205, + 119, 240, 115, 32, 72, 6, 193, 179, 176, 235, 12, 175, 123, 70, 102, 161, 14, 4, 120, 24, + 157, 132, 203, 191, 132, 77, 168, 113, 199, 174, 125, 198, 64, 127, 27, 169, 167, 229, 74, + 152, 136, 105, 23, 104, 169, 174, 112, 25, 148, 15, 89, 34, 253, 4, 7, 8, 52, 227, 7, 103, + 106, 239, 136, 221, 242, 104, 160, 186, 9, 223, 152, 41, 111, 84, 239, 0, 147, 10, 15, 136, + 137, 227, 174, 46, 237, 129, 16, 67, 218, 168, 77, 247, 115, 72, 10, 11, 99, 122, 172, 9, + 225, 37, 125, 52, 112, 245, 19, 122, 25, 198, 175, 24, 77, 133, 43, 68, 131, 238, 4, 210, + 248, 152, 32, 124, 6, 121, 148, 126, 226, 164, 122, 206, 253, 90, 151, 208, 47, 55, 9, 130, + 100, 121, 60, 58, 238, 186, 238, 25, 0, 5, 5, 104, 225, 130, 162, 111, 124, 106, 34, 117, + 73, 0, 153, 75, 5, 26, 248, 234, 137, 14, 243, 57, 248, 40, 26, 42, 78, 56, 136, 86, 64, + 224, 96, 125, 76, 118, 104, 216, 132, 241, 7, 113, 44, 254, 92, 39, 195, 166, 207, 215, 250, + 68, 235, 62, 37, 49, 5, 170, 148, 6, 24, 185, 55, 153, 143, 116, 65, 197, 229, 71, 244, 248, + 242, 222, 51, 147, 23, 250, 186, 64, 234, 41, 59, 109, 175, 48, 154, 35, 79, 243, 89, 82, + 103, 130, 26, 204, 115, 181, 36, 169, 155, 142, 94, 80, 221, 140, 51, 84, 135, 213, 197, + 216, 240, 249, 244, 157, 138, 170, 92, 83, 154, 28, 58, 79, 186, 23, 41, 153, 154, 255, 128, + 212, 148, 6, 175, 213, 206, 69, 154, 32, 145, 146, 136, 114, 195, 49, 41, 10, 92, 221, 150, + 114, 37, 118, 106, 16, 67, 152, 204, 237, 57, 82, 139, 133, 130, 236, 221, 184, 65, 95, 23, + 86, 151, 174, 11, 155, 245, 133, 229, 248, 253, 124, 210, 254, 87, 183, 101, 74, 35, 151, + 146, 219, 6, 52, 53, 141, 118, 40, 119, 153, 186, 54, 103, 156, 147, 99, 219, 234, 100, 63, + 164, 84, 66, 117, 235, 124, 115, 157, 83, 180, 83, 86, 121, 47, 177, 21, 152, 220, 151, 201, + 133, 201, 164, 116, 0, 165, 235, 156, 131, 32, 243, 6, 156, 33, 200, 113, 226, 6, 197, 205, + 115, 167, 191, 167, 68, 137, 107, 123, 225, 117, 137, 122, 68, 183, 157, 238, 54, 38, 148, + 151, 177, 43, 188, 241, 117, 227, 138, 166, 14, 21, 7, 127, 142, 23, 155, 208, 33, 134, 89, + 231, 120, 177, 237, 219, 218, 170, 85, 55, 12, 80, 153, 214, 182, 162, 222, 177, 129, 95, + 156, 118, 214, 213, 205, 108, 149, 55, 45, 237, 92, 90, 67, 131, 226, 218, 138, 61, 43, 71, + 166, 213, 185, 218, 135, 214, 78, 127, 56, 41, 54, 255, 17, 96, 0, 78, 249, 151, 51, 13, 10, + 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 48, 55, + 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, 53, 62, 62, 115, + 116, 114, 101, 97, 109, 13, 10, 120, 156, 99, 96, 128, 1, 5, 6, 108, 0, 0, 2, 224, 0, 33, + 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, + 48, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 55, 54, + 48, 56, 47, 76, 101, 110, 103, 116, 104, 49, 32, 55, 52, 56, 51, 54, 62, 62, 115, 116, 114, + 101, 97, 109, 13, 10, 120, 156, 236, 189, 119, 96, 84, 69, 215, 63, 62, 125, 230, 222, 89, + 32, 64, 232, 37, 155, 132, 208, 123, 147, 18, 32, 84, 65, 122, 47, 10, 38, 36, 1, 2, 33, + 129, 16, 122, 239, 16, 144, 222, 65, 164, 8, 74, 17, 66, 239, 77, 64, 5, 233, 93, 169, 34, + 136, 130, 40, 42, 96, 33, 100, 127, 231, 222, 189, 11, 33, 226, 235, 251, 124, 159, 247, + 143, 223, 31, 201, 250, 217, 51, 125, 206, 156, 57, 115, 230, 204, 220, 197, 139, 48, 66, + 40, 19, 26, 133, 40, 106, 209, 188, 117, 153, 242, 89, 74, 118, 154, 9, 41, 215, 0, 225, + 145, 189, 35, 250, 140, 184, 151, 173, 59, 66, 56, 20, 161, 192, 165, 145, 3, 18, 221, 107, + 51, 71, 251, 35, 20, 244, 53, 66, 114, 106, 183, 62, 221, 123, 111, 202, 86, 185, 60, 66, + 197, 187, 33, 196, 175, 116, 143, 29, 220, 173, 51, 42, 120, 31, 161, 178, 53, 17, 34, 174, + 30, 209, 17, 81, 167, 147, 70, 87, 65, 168, 124, 19, 104, 175, 114, 15, 72, 48, 55, 100, + 122, 7, 226, 99, 32, 94, 168, 71, 239, 196, 65, 43, 38, 119, 141, 132, 248, 106, 132, 74, + 119, 136, 141, 143, 140, 168, 244, 23, 178, 186, 78, 69, 168, 92, 88, 239, 136, 65, 125, + 252, 86, 203, 50, 8, 205, 130, 246, 144, 59, 46, 162, 119, 244, 196, 115, 141, 21, 196, 187, + 32, 100, 214, 239, 19, 223, 47, 113, 228, 232, 77, 139, 16, 90, 178, 18, 161, 225, 168, 79, + 66, 116, 159, 189, 203, 166, 7, 32, 156, 7, 226, 230, 38, 68, 216, 73, 60, 3, 113, 164, 248, + 34, 94, 1, 70, 81, 192, 75, 105, 4, 234, 70, 178, 113, 78, 36, 53, 8, 225, 132, 177, 91, + 168, 184, 231, 32, 26, 84, 23, 122, 49, 172, 254, 219, 52, 173, 235, 70, 97, 200, 237, 73, + 97, 247, 82, 71, 32, 36, 214, 144, 238, 97, 8, 123, 60, 30, 168, 221, 149, 205, 178, 184, + 65, 12, 190, 169, 131, 252, 200, 146, 35, 242, 235, 4, 49, 8, 101, 13, 71, 204, 15, 120, + 198, 225, 16, 145, 40, 28, 141, 192, 30, 226, 38, 149, 73, 109, 210, 145, 124, 66, 238, 208, + 96, 218, 156, 198, 211, 254, 116, 8, 29, 65, 147, 232, 84, 186, 156, 158, 162, 79, 89, 38, + 214, 156, 77, 96, 167, 216, 159, 60, 11, 255, 156, 223, 231, 143, 5, 21, 57, 68, 62, 17, 32, + 170, 137, 46, 194, 35, 123, 23, 232, 89, 160, 87, 129, 195, 5, 71, 22, 156, 91, 112, 113, + 193, 95, 10, 254, 25, 144, 35, 160, 64, 64, 253, 128, 166, 1, 237, 3, 58, 6, 188, 29, 208, + 57, 96, 120, 192, 214, 128, 35, 1, 231, 3, 174, 6, 252, 28, 240, 56, 32, 213, 157, 197, 157, + 195, 29, 228, 46, 236, 46, 235, 174, 232, 174, 230, 14, 117, 215, 116, 215, 115, 119, 113, + 143, 116, 207, 113, 111, 11, 228, 129, 217, 3, 115, 6, 6, 5, 22, 14, 44, 29, 216, 38, 176, + 75, 224, 220, 192, 143, 131, 72, 144, 8, 202, 18, 148, 45, 40, 71, 80, 222, 160, 128, 160, + 98, 65, 37, 130, 26, 6, 69, 4, 69, 7, 147, 96, 191, 224, 192, 16, 20, 66, 66, 92, 33, 126, + 33, 254, 33, 185, 67, 242, 135, 20, 10, 41, 25, 82, 49, 36, 52, 36, 54, 100, 84, 200, 184, + 144, 73, 33, 83, 67, 102, 135, 44, 15, 89, 31, 178, 57, 100, 119, 200, 222, 144, 35, 33, 39, + 66, 78, 135, 124, 21, 242, 93, 225, 208, 194, 97, 133, 235, 20, 14, 47, 28, 89, 184, 91, + 225, 94, 133, 227, 75, 231, 122, 70, 158, 85, 126, 22, 250, 172, 230, 179, 218, 207, 234, + 61, 219, 244, 236, 135, 103, 158, 20, 35, 37, 115, 74, 182, 148, 242, 41, 245, 82, 154, 167, + 116, 76, 233, 154, 210, 51, 165, 79, 74, 255, 148, 233, 41, 51, 83, 230, 164, 172, 78, 249, + 56, 101, 109, 202, 250, 148, 228, 148, 75, 41, 87, 82, 174, 63, 47, 251, 188, 214, 243, 73, + 207, 127, 125, 158, 146, 26, 156, 154, 146, 234, 241, 164, 88, 179, 2, 243, 177, 140, 32, + 18, 72, 170, 144, 22, 164, 19, 217, 64, 126, 164, 133, 104, 11, 154, 104, 75, 120, 28, 72, + 120, 26, 93, 73, 207, 208, 223, 89, 102, 214, 130, 77, 98, 103, 56, 226, 51, 249, 25, 254, + 72, 32, 161, 65, 194, 5, 69, 160, 8, 19, 225, 178, 69, 1, 4, 18, 142, 45, 136, 10, 142, 42, + 56, 191, 224, 178, 130, 191, 6, 160, 128, 220, 1, 238, 128, 134, 1, 45, 28, 9, 191, 27, 48, + 42, 96, 123, 192, 103, 1, 151, 2, 174, 7, 252, 26, 240, 212, 237, 114, 103, 115, 231, 178, + 37, 92, 222, 93, 53, 141, 132, 103, 184, 151, 189, 34, 225, 214, 129, 111, 7, 206, 120, 33, + 225, 172, 32, 225, 60, 65, 5, 29, 9, 135, 7, 69, 217, 18, 118, 255, 131, 132, 91, 188, 144, + 240, 140, 144, 101, 33, 107, 95, 72, 248, 56, 72, 248, 10, 72, 184, 218, 11, 9, 71, 23, 238, + 105, 75, 24, 63, 43, 240, 172, 10, 72, 56, 236, 89, 221, 103, 13, 158, 157, 127, 150, 146, + 162, 108, 9, 151, 75, 169, 149, 210, 44, 165, 67, 74, 23, 144, 112, 239, 148, 126, 41, 211, + 108, 9, 47, 121, 33, 225, 99, 32, 225, 175, 65, 194, 161, 142, 132, 221, 169, 163, 188, 18, + 246, 124, 139, 16, 123, 236, 93, 30, 236, 178, 165, 235, 108, 35, 96, 49, 155, 159, 178, 12, + 161, 212, 24, 59, 165, 14, 132, 138, 35, 251, 143, 238, 65, 40, 229, 76, 202, 151, 92, 2, + 61, 135, 94, 252, 61, 92, 130, 208, 79, 157, 239, 255, 130, 208, 253, 7, 223, 17, 248, 158, + 120, 127, 252, 253, 177, 247, 71, 223, 31, 121, 127, 196, 253, 225, 247, 135, 221, 31, 122, + 127, 240, 253, 65, 247, 7, 222, 239, 127, 63, 241, 126, 194, 253, 190, 183, 45, 75, 132, + 110, 141, 191, 53, 23, 190, 199, 221, 250, 243, 155, 143, 111, 13, 124, 112, 248, 214, 142, + 7, 176, 6, 111, 37, 221, 26, 254, 77, 255, 155, 61, 111, 14, 190, 181, 251, 219, 18, 183, + 166, 221, 252, 248, 230, 188, 27, 243, 110, 172, 184, 49, 5, 161, 27, 171, 173, 122, 55, + 115, 221, 232, 123, 227, 93, 136, 149, 189, 17, 118, 163, 194, 141, 66, 215, 26, 92, 171, + 127, 45, 244, 90, 213, 107, 149, 175, 85, 184, 86, 246, 90, 177, 107, 65, 215, 242, 93, 243, + 191, 134, 175, 254, 116, 245, 193, 213, 239, 175, 222, 189, 122, 219, 170, 117, 245, 179, + 171, 7, 174, 238, 191, 186, 3, 66, 71, 175, 174, 186, 186, 241, 106, 253, 171, 117, 174, + 214, 190, 90, 232, 106, 208, 213, 192, 171, 5, 239, 224, 27, 254, 124, 63, 44, 235, 37, 114, + 177, 92, 36, 23, 122, 199, 37, 203, 200, 18, 178, 168, 52, 69, 170, 120, 34, 30, 138, 31, + 196, 109, 113, 75, 220, 16, 159, 137, 163, 226, 176, 216, 43, 246, 136, 221, 98, 151, 216, + 14, 150, 100, 137, 88, 44, 26, 137, 154, 252, 41, 127, 47, 211, 27, 174, 86, 28, 177, 84, + 22, 107, 217, 12, 12, 54, 141, 229, 245, 74, 145, 181, 98, 208, 3, 119, 100, 201, 187, 2, + 98, 57, 140, 152, 127, 7, 45, 248, 137, 97, 18, 108, 160, 236, 224, 244, 108, 241, 114, 70, + 158, 83, 76, 133, 25, 96, 171, 140, 237, 86, 170, 177, 217, 254, 190, 130, 254, 245, 207, + 56, 98, 28, 183, 233, 181, 116, 233, 231, 94, 87, 218, 201, 187, 109, 193, 184, 227, 196, + 110, 253, 123, 47, 47, 106, 238, 52, 118, 191, 8, 111, 255, 31, 202, 45, 123, 17, 58, 110, + 46, 51, 79, 252, 239, 90, 55, 215, 255, 99, 22, 69, 43, 209, 56, 52, 158, 117, 71, 243, 208, + 119, 104, 2, 154, 134, 166, 160, 247, 209, 26, 244, 33, 242, 67, 73, 32, 254, 177, 104, 54, + 122, 132, 126, 65, 239, 161, 249, 104, 18, 198, 176, 3, 254, 140, 150, 162, 181, 232, 55, + 244, 43, 122, 140, 86, 160, 245, 232, 11, 244, 25, 250, 4, 117, 69, 145, 104, 6, 138, 66, + 199, 81, 52, 250, 28, 29, 67, 167, 208, 151, 232, 4, 58, 137, 238, 161, 110, 232, 44, 58, + 141, 206, 160, 13, 168, 59, 250, 9, 205, 68, 23, 208, 57, 116, 30, 245, 64, 63, 160, 7, 104, + 50, 234, 137, 98, 80, 47, 212, 27, 197, 162, 56, 180, 12, 197, 163, 190, 168, 15, 74, 64, + 253, 80, 127, 148, 136, 6, 160, 129, 232, 123, 52, 8, 13, 65, 131, 209, 80, 216, 200, 134, + 161, 29, 104, 57, 26, 137, 70, 192, 190, 60, 26, 221, 71, 63, 162, 93, 120, 30, 158, 143, 9, + 166, 152, 97, 142, 158, 161, 20, 188, 0, 47, 196, 139, 240, 98, 244, 28, 165, 98, 129, 37, + 86, 200, 131, 151, 224, 247, 241, 82, 252, 1, 94, 134, 151, 99, 3, 155, 88, 99, 23, 94, 129, + 87, 162, 167, 232, 119, 252, 33, 94, 133, 87, 227, 143, 240, 199, 120, 13, 94, 139, 215, + 225, 245, 248, 19, 188, 1, 111, 196, 201, 120, 19, 222, 140, 183, 160, 63, 208, 69, 156, + 132, 167, 224, 173, 120, 27, 222, 142, 119, 224, 157, 56, 19, 206, 140, 119, 225, 221, 56, + 11, 246, 195, 89, 113, 54, 116, 11, 125, 131, 179, 99, 127, 188, 7, 239, 197, 57, 112, 78, + 60, 21, 239, 195, 251, 241, 1, 124, 16, 31, 194, 159, 226, 92, 56, 55, 218, 136, 146, 113, + 30, 156, 23, 31, 198, 71, 112, 62, 156, 31, 23, 192, 5, 241, 81, 252, 25, 250, 19, 253, 133, + 110, 163, 111, 113, 0, 118, 227, 64, 28, 132, 63, 199, 95, 224, 99, 248, 56, 254, 18, 159, + 192, 39, 241, 41, 28, 140, 11, 225, 16, 92, 24, 159, 198, 103, 240, 89, 124, 14, 159, 199, + 23, 208, 110, 92, 4, 23, 197, 197, 112, 113, 116, 7, 221, 197, 23, 197, 116, 49, 67, 204, + 20, 179, 196, 108, 49, 71, 204, 21, 243, 196, 124, 177, 64, 44, 20, 139, 96, 53, 45, 17, + 239, 243, 32, 177, 84, 124, 128, 86, 139, 101, 98, 185, 88, 33, 86, 138, 15, 197, 42, 177, + 90, 124, 36, 62, 22, 107, 196, 90, 177, 78, 172, 103, 49, 172, 167, 248, 68, 108, 16, 27, + 69, 178, 216, 36, 54, 139, 45, 98, 171, 216, 38, 182, 139, 29, 98, 167, 216, 197, 122, 177, + 88, 88, 161, 123, 96, 165, 238, 19, 251, 197, 1, 113, 80, 28, 18, 159, 194, 202, 61, 2, 235, + 247, 51, 241, 185, 248, 66, 28, 19, 199, 197, 151, 226, 132, 56, 41, 78, 137, 211, 226, 140, + 56, 43, 206, 137, 243, 226, 130, 184, 200, 254, 98, 207, 88, 10, 123, 14, 235, 216, 3, 187, + 10, 230, 132, 83, 206, 56, 231, 130, 75, 174, 184, 33, 46, 137, 203, 226, 138, 248, 90, 92, + 21, 215, 196, 117, 176, 9, 55, 193, 50, 124, 3, 246, 225, 91, 113, 71, 220, 21, 223, 137, + 123, 226, 123, 176, 23, 247, 197, 3, 241, 35, 88, 142, 159, 196, 207, 226, 145, 248, 69, + 252, 42, 126, 195, 151, 240, 101, 124, 5, 127, 133, 191, 198, 87, 205, 65, 50, 135, 204, 41, + 115, 201, 220, 50, 143, 204, 43, 243, 201, 252, 178, 128, 44, 40, 221, 50, 80, 6, 201, 96, + 89, 72, 134, 200, 194, 178, 136, 57, 216, 28, 98, 14, 5, 59, 84, 76, 22, 7, 123, 84, 82, + 150, 146, 165, 193, 50, 149, 229, 193, 230, 48, 115, 184, 28, 47, 39, 200, 137, 114, 146, + 156, 44, 147, 228, 20, 57, 85, 190, 39, 167, 201, 233, 114, 134, 156, 41, 103, 201, 217, + 114, 142, 156, 43, 231, 201, 249, 114, 129, 92, 40, 23, 161, 75, 232, 166, 92, 140, 174, + 128, 149, 123, 95, 46, 149, 31, 200, 101, 114, 185, 92, 33, 87, 202, 15, 229, 42, 185, 90, + 126, 36, 63, 150, 107, 208, 87, 232, 107, 116, 21, 221, 64, 151, 209, 117, 185, 86, 174, + 147, 235, 229, 39, 114, 131, 220, 40, 147, 229, 38, 185, 89, 110, 49, 71, 152, 35, 205, 81, + 230, 104, 115, 140, 57, 214, 28, 103, 142, 55, 39, 152, 19, 205, 73, 230, 100, 51, 201, 156, + 98, 78, 53, 223, 51, 167, 177, 153, 108, 150, 220, 202, 6, 203, 109, 114, 187, 220, 33, 119, + 202, 93, 172, 159, 220, 45, 247, 200, 189, 114, 159, 220, 47, 15, 200, 131, 242, 144, 252, + 84, 30, 150, 71, 228, 81, 249, 153, 252, 92, 126, 33, 143, 201, 227, 242, 75, 121, 66, 158, + 148, 167, 228, 105, 176, 123, 103, 229, 57, 54, 199, 156, 110, 206, 48, 103, 154, 179, 204, + 217, 230, 28, 115, 174, 57, 79, 215, 209, 117, 117, 61, 93, 95, 55, 48, 231, 155, 11, 204, + 133, 210, 163, 144, 194, 138, 40, 10, 86, 146, 43, 161, 164, 82, 202, 80, 166, 210, 202, + 165, 50, 169, 204, 248, 103, 252, 8, 255, 130, 175, 225, 95, 241, 111, 248, 49, 126, 138, + 127, 199, 127, 224, 63, 241, 95, 184, 4, 126, 134, 83, 240, 115, 156, 138, 75, 130, 7, 135, + 8, 38, 132, 80, 194, 192, 105, 20, 68, 18, 69, 12, 98, 226, 82, 68, 19, 23, 201, 68, 50, + 147, 44, 196, 143, 100, 37, 217, 72, 118, 226, 143, 75, 147, 28, 36, 39, 46, 131, 203, 146, + 92, 36, 55, 201, 67, 242, 146, 124, 36, 63, 41, 64, 10, 146, 0, 240, 4, 167, 130, 167, 18, + 132, 203, 225, 242, 36, 24, 87, 32, 133, 72, 8, 41, 76, 138, 144, 162, 164, 24, 41, 78, 74, + 152, 139, 204, 197, 186, 162, 174, 164, 43, 235, 55, 117, 67, 221, 72, 191, 165, 170, 146, + 146, 164, 20, 41, 77, 202, 144, 178, 164, 28, 41, 79, 42, 144, 138, 164, 18, 248, 147, 111, + 168, 106, 170, 58, 25, 66, 134, 146, 97, 100, 56, 25, 65, 70, 146, 81, 100, 52, 25, 67, 198, + 146, 113, 100, 188, 10, 37, 19, 200, 68, 85, 67, 213, 84, 181, 84, 152, 170, 173, 234, 168, + 186, 170, 158, 170, 175, 26, 168, 55, 85, 67, 213, 72, 189, 165, 26, 171, 38, 170, 169, 106, + 166, 154, 171, 22, 170, 165, 106, 165, 90, 171, 54, 170, 173, 106, 167, 218, 171, 14, 170, + 163, 234, 164, 222, 81, 157, 85, 23, 245, 174, 10, 87, 17, 170, 171, 138, 84, 81, 42, 90, + 117, 83, 221, 85, 15, 21, 163, 122, 170, 94, 42, 150, 76, 34, 147, 121, 102, 158, 69, 245, + 86, 113, 220, 143, 103, 85, 241, 170, 15, 207, 198, 179, 115, 127, 158, 67, 245, 85, 9, 170, + 159, 74, 228, 57, 121, 46, 213, 95, 13, 80, 3, 213, 32, 53, 88, 13, 81, 67, 213, 48, 53, 92, + 141, 224, 185, 121, 30, 158, 151, 231, 227, 249, 121, 1, 53, 82, 141, 82, 163, 213, 24, 94, + 144, 7, 112, 55, 15, 84, 99, 213, 56, 53, 94, 77, 80, 19, 213, 36, 53, 89, 37, 169, 41, 106, + 170, 122, 79, 77, 83, 211, 213, 12, 53, 83, 205, 82, 179, 213, 28, 53, 87, 205, 87, 11, 212, + 66, 181, 72, 45, 86, 75, 212, 251, 106, 41, 15, 226, 193, 234, 3, 181, 76, 45, 87, 43, 212, + 74, 245, 161, 90, 165, 86, 171, 143, 212, 199, 106, 141, 90, 171, 214, 169, 245, 188, 16, + 15, 81, 159, 168, 13, 106, 163, 74, 86, 155, 212, 102, 181, 69, 109, 85, 219, 212, 118, 181, + 67, 237, 212, 141, 117, 19, 181, 75, 237, 86, 95, 170, 19, 234, 164, 58, 165, 78, 171, 51, + 234, 172, 58, 167, 206, 171, 11, 234, 162, 186, 164, 46, 171, 43, 234, 43, 245, 181, 186, + 170, 155, 170, 107, 234, 186, 186, 161, 110, 170, 91, 234, 27, 117, 91, 125, 171, 238, 168, + 187, 234, 59, 117, 79, 125, 79, 222, 35, 211, 200, 116, 50, 131, 204, 36, 179, 200, 108, 50, + 135, 204, 37, 243, 116, 51, 50, 159, 44, 32, 11, 201, 34, 178, 152, 44, 33, 239, 147, 165, + 228, 3, 245, 131, 110, 174, 91, 232, 150, 186, 21, 249, 81, 187, 180, 214, 153, 116, 102, + 157, 69, 251, 233, 172, 58, 27, 47, 170, 91, 147, 159, 200, 207, 116, 52, 29, 75, 199, 211, + 137, 116, 50, 125, 143, 78, 167, 179, 233, 92, 186, 144, 190, 15, 103, 133, 85, 116, 13, 93, + 71, 63, 161, 27, 233, 38, 186, 141, 238, 162, 251, 232, 33, 122, 148, 30, 163, 39, 201, 35, + 122, 150, 94, 164, 95, 209, 235, 244, 27, 122, 151, 254, 64, 31, 210, 159, 233, 47, 228, 23, + 242, 43, 249, 141, 60, 38, 79, 200, 83, 242, 59, 249, 131, 9, 42, 105, 118, 157, 93, 251, + 235, 28, 186, 141, 110, 171, 219, 233, 246, 186, 131, 238, 72, 254, 36, 127, 145, 103, 36, + 133, 60, 39, 169, 196, 67, 17, 197, 148, 80, 74, 25, 248, 210, 156, 181, 224, 251, 169, 160, + 5, 120, 73, 94, 154, 74, 94, 150, 151, 231, 21, 121, 101, 94, 133, 135, 242, 48, 94, 143, + 55, 164, 1, 188, 9, 111, 193, 219, 240, 14, 252, 29, 30, 206, 163, 104, 17, 222, 3, 124, + 150, 56, 222, 135, 39, 240, 68, 62, 128, 15, 226, 67, 248, 48, 62, 130, 143, 226, 99, 248, + 56, 62, 129, 79, 226, 73, 180, 4, 159, 202, 167, 241, 89, 124, 30, 156, 203, 150, 242, 21, + 124, 53, 95, 203, 55, 240, 205, 52, 152, 111, 231, 187, 249, 65, 254, 41, 45, 197, 143, 240, + 47, 248, 9, 240, 212, 47, 208, 114, 252, 10, 191, 198, 111, 241, 59, 252, 123, 254, 35, 127, + 196, 31, 243, 63, 120, 10, 248, 239, 76, 40, 225, 162, 15, 192, 47, 242, 23, 57, 69, 94, + 145, 31, 188, 121, 183, 8, 18, 133, 68, 97, 81, 84, 20, 23, 37, 105, 37, 81, 90, 148, 21, + 21, 69, 101, 56, 71, 133, 138, 154, 34, 140, 42, 81, 71, 212, 21, 245, 68, 125, 209, 64, + 188, 41, 26, 130, 71, 246, 150, 104, 44, 154, 136, 166, 162, 153, 104, 78, 13, 209, 66, 180, + 20, 173, 68, 107, 209, 70, 180, 21, 237, 68, 123, 209, 65, 231, 210, 121, 124, 242, 161, 38, + 213, 212, 229, 149, 143, 232, 40, 58, 139, 8, 17, 45, 186, 233, 2, 250, 109, 253, 174, 142, + 212, 221, 117, 47, 29, 175, 251, 233, 129, 122, 168, 30, 169, 71, 235, 177, 122, 188, 158, + 172, 223, 211, 51, 245, 92, 189, 80, 191, 175, 151, 235, 85, 122, 141, 254, 68, 111, 210, + 219, 244, 46, 189, 79, 31, 210, 135, 245, 81, 253, 6, 190, 142, 111, 224, 155, 248, 22, 254, + 6, 223, 54, 250, 26, 9, 70, 63, 35, 209, 232, 111, 12, 48, 6, 26, 131, 140, 193, 198, 16, + 99, 168, 49, 204, 24, 110, 140, 48, 70, 26, 163, 240, 183, 248, 14, 123, 204, 158, 176, 167, + 236, 119, 246, 7, 251, 83, 151, 64, 155, 208, 102, 146, 132, 43, 162, 109, 104, 59, 58, 140, + 239, 162, 45, 104, 43, 58, 162, 75, 162, 49, 232, 16, 154, 136, 223, 195, 211, 116, 41, 49, + 86, 140, 19, 227, 209, 19, 124, 79, 76, 16, 19, 241, 27, 98, 146, 152, 76, 14, 178, 225, + 104, 175, 72, 18, 83, 196, 84, 241, 158, 152, 230, 42, 226, 42, 234, 42, 230, 42, 142, 22, + 162, 135, 232, 83, 180, 10, 205, 194, 181, 208, 116, 92, 27, 15, 192, 51, 241, 44, 60, 27, + 15, 68, 59, 241, 48, 179, 175, 24, 40, 6, 137, 33, 228, 51, 29, 160, 221, 58, 80, 7, 233, + 96, 93, 72, 135, 232, 194, 186, 8, 249, 156, 124, 65, 142, 145, 227, 228, 75, 114, 130, 156, + 36, 167, 200, 105, 114, 134, 156, 37, 231, 200, 121, 114, 131, 220, 36, 183, 200, 55, 228, + 54, 249, 150, 220, 33, 119, 201, 119, 228, 30, 45, 64, 11, 130, 6, 213, 230, 117, 120, 93, + 26, 64, 221, 52, 144, 6, 129, 30, 181, 228, 173, 120, 107, 208, 173, 26, 188, 38, 175, 5, + 154, 213, 148, 55, 227, 205, 65, 219, 170, 242, 106, 188, 58, 156, 158, 11, 209, 16, 90, 24, + 116, 100, 15, 223, 203, 247, 129, 190, 69, 240, 174, 60, 18, 52, 175, 51, 239, 194, 223, + 165, 69, 104, 81, 90, 140, 22, 7, 13, 140, 225, 61, 121, 47, 208, 190, 129, 160, 131, 253, + 65, 7, 7, 131, 78, 246, 166, 37, 104, 73, 208, 196, 145, 180, 20, 45, 77, 203, 208, 178, + 180, 28, 45, 79, 43, 208, 138, 160, 89, 119, 249, 119, 252, 30, 104, 217, 117, 126, 131, + 223, 4, 221, 194, 160, 93, 92, 8, 33, 65, 183, 114, 136, 92, 160, 95, 185, 69, 30, 250, 128, + 222, 7, 252, 8, 186, 84, 3, 180, 169, 22, 104, 231, 89, 126, 142, 159, 7, 141, 11, 1, 189, + 11, 6, 189, 43, 194, 43, 138, 146, 162, 20, 232, 97, 32, 232, 96, 49, 208, 188, 55, 68, 21, + 81, 21, 252, 250, 214, 180, 18, 173, 76, 127, 163, 143, 105, 119, 218, 131, 198, 208, 158, + 180, 23, 141, 165, 189, 105, 28, 141, 167, 125, 104, 95, 154, 64, 251, 209, 44, 112, 26, 16, + 200, 123, 165, 0, 127, 176, 233, 32, 68, 210, 249, 179, 144, 73, 25, 23, 82, 25, 166, 118, + 101, 202, 156, 197, 47, 107, 182, 236, 254, 57, 114, 230, 202, 157, 39, 111, 190, 252, 5, + 10, 6, 184, 3, 131, 130, 11, 133, 20, 46, 82, 180, 88, 241, 18, 37, 75, 149, 46, 83, 182, + 92, 249, 10, 21, 43, 85, 126, 163, 74, 213, 106, 213, 67, 107, 212, 172, 21, 86, 187, 78, + 221, 122, 245, 27, 188, 217, 176, 209, 91, 141, 155, 52, 109, 214, 188, 69, 203, 86, 173, + 219, 180, 109, 215, 190, 67, 199, 78, 111, 191, 211, 185, 203, 187, 225, 17, 168, 107, 100, + 84, 116, 183, 238, 61, 98, 122, 246, 138, 237, 29, 23, 223, 167, 111, 66, 191, 196, 254, 3, + 6, 14, 26, 60, 100, 232, 176, 225, 35, 70, 142, 26, 61, 102, 236, 184, 241, 19, 38, 78, 154, + 156, 52, 101, 234, 123, 211, 166, 207, 152, 57, 107, 246, 156, 185, 243, 230, 47, 88, 184, + 8, 45, 121, 127, 233, 7, 203, 150, 175, 88, 249, 225, 170, 213, 31, 125, 188, 102, 237, 58, + 186, 254, 147, 13, 27, 147, 55, 109, 222, 178, 117, 219, 246, 29, 59, 119, 237, 222, 179, + 119, 223, 254, 3, 7, 15, 161, 195, 71, 142, 126, 246, 249, 23, 199, 142, 127, 121, 226, 228, + 169, 211, 103, 208, 217, 115, 231, 47, 92, 188, 116, 25, 125, 245, 245, 213, 107, 215, 111, + 220, 204, 184, 67, 201, 184, 67, 201, 184, 67, 201, 184, 67, 201, 184, 67, 73, 87, 51, 227, + 14, 37, 227, 14, 37, 227, 14, 37, 227, 14, 37, 227, 14, 37, 227, 14, 37, 227, 14, 37, 227, + 14, 37, 227, 14, 37, 227, 14, 37, 227, 14, 37, 221, 29, 10, 187, 7, 103, 128, 89, 40, 31, + 208, 130, 180, 43, 42, 136, 144, 231, 166, 131, 219, 214, 111, 58, 172, 252, 212, 231, 30, + 15, 177, 78, 98, 109, 28, 120, 255, 218, 192, 103, 174, 253, 221, 6, 55, 245, 82, 240, 86, + 47, 128, 231, 57, 19, 60, 219, 54, 184, 2, 62, 5, 94, 111, 24, 202, 2, 233, 23, 64, 133, 17, + 238, 128, 66, 193, 247, 29, 136, 46, 162, 182, 158, 95, 32, 53, 16, 60, 229, 159, 81, 73, + 84, 21, 245, 240, 164, 162, 172, 224, 135, 166, 226, 225, 104, 37, 134, 237, 15, 106, 85, 1, + 159, 54, 26, 205, 32, 161, 180, 4, 123, 0, 231, 150, 226, 184, 44, 93, 135, 199, 160, 82, + 208, 74, 27, 240, 173, 115, 161, 211, 208, 98, 113, 143, 9, 241, 45, 176, 223, 133, 66, 173, + 54, 232, 75, 250, 174, 42, 233, 41, 235, 249, 21, 31, 100, 199, 60, 93, 209, 10, 28, 74, 46, + 177, 13, 224, 57, 63, 196, 65, 12, 165, 142, 245, 76, 241, 44, 246, 44, 65, 153, 209, 99, + 90, 224, 249, 97, 79, 57, 79, 111, 168, 213, 22, 133, 131, 127, 60, 12, 56, 24, 5, 190, 248, + 73, 220, 145, 212, 32, 7, 60, 147, 129, 167, 14, 192, 195, 72, 240, 146, 191, 196, 37, 24, + 98, 225, 40, 27, 106, 5, 165, 199, 161, 5, 104, 23, 218, 15, 94, 248, 21, 240, 25, 49, 120, + 174, 69, 241, 40, 203, 155, 228, 232, 249, 145, 212, 35, 158, 70, 158, 174, 158, 120, 84, + 31, 53, 67, 45, 208, 40, 200, 45, 0, 94, 103, 109, 210, 137, 118, 2, 91, 122, 249, 249, 183, + 169, 183, 60, 5, 161, 237, 54, 224, 143, 15, 2, 63, 124, 58, 248, 249, 235, 192, 183, 249, + 10, 93, 133, 133, 110, 146, 54, 164, 45, 253, 4, 229, 67, 53, 80, 39, 56, 5, 204, 4, 153, + 45, 5, 73, 30, 67, 55, 177, 194, 21, 113, 53, 28, 134, 39, 224, 245, 100, 0, 163, 207, 143, + 192, 105, 131, 161, 28, 32, 193, 134, 182, 244, 103, 162, 197, 32, 211, 85, 224, 31, 31, + 129, 243, 193, 89, 104, 243, 23, 144, 41, 5, 95, 185, 4, 110, 139, 223, 193, 195, 241, 120, + 60, 13, 207, 1, 15, 125, 61, 248, 228, 15, 192, 187, 184, 2, 118, 119, 52, 251, 140, 61, 72, + 189, 228, 49, 61, 139, 60, 107, 160, 223, 124, 40, 63, 114, 163, 98, 48, 51, 85, 80, 19, + 152, 207, 147, 232, 62, 140, 175, 56, 120, 38, 181, 240, 57, 82, 130, 148, 132, 195, 129, + 235, 121, 106, 106, 5, 207, 155, 158, 145, 158, 163, 158, 203, 40, 24, 21, 129, 178, 53, 80, + 61, 24, 115, 83, 212, 30, 184, 30, 12, 231, 156, 61, 112, 142, 57, 9, 159, 83, 112, 14, 250, + 29, 164, 68, 225, 164, 144, 13, 100, 225, 6, 63, 188, 21, 110, 141, 251, 219, 103, 131, 159, + 241, 115, 146, 19, 230, 175, 10, 137, 37, 155, 201, 5, 88, 51, 39, 89, 123, 182, 225, 249, + 214, 212, 28, 169, 155, 83, 127, 78, 245, 120, 214, 121, 146, 61, 135, 61, 39, 236, 249, + 173, 12, 253, 212, 133, 25, 232, 12, 167, 154, 126, 246, 140, 109, 131, 126, 142, 130, 239, + 254, 3, 216, 27, 12, 39, 148, 0, 224, 181, 33, 110, 12, 227, 93, 0, 237, 223, 196, 41, 160, + 78, 10, 60, 150, 245, 176, 211, 212, 160, 51, 232, 49, 150, 135, 45, 72, 109, 150, 218, 59, + 117, 65, 234, 22, 79, 69, 79, 83, 208, 45, 138, 56, 202, 131, 42, 194, 167, 26, 104, 83, 91, + 212, 17, 218, 30, 3, 210, 92, 9, 231, 178, 117, 96, 225, 78, 128, 151, 250, 19, 206, 13, + 167, 140, 178, 184, 17, 110, 135, 59, 224, 112, 220, 3, 199, 227, 62, 184, 47, 30, 138, 135, + 129, 84, 215, 192, 121, 102, 15, 248, 209, 87, 241, 79, 224, 181, 9, 240, 201, 74, 192, 39, + 18, 60, 164, 217, 100, 43, 57, 66, 46, 145, 59, 96, 199, 91, 211, 14, 176, 242, 134, 194, + 14, 187, 149, 158, 161, 223, 51, 63, 86, 146, 149, 101, 77, 89, 56, 27, 204, 134, 128, 79, + 79, 69, 78, 117, 34, 37, 87, 74, 239, 231, 93, 159, 47, 122, 126, 56, 181, 116, 106, 189, + 212, 94, 169, 83, 82, 15, 165, 94, 74, 189, 237, 209, 158, 3, 158, 187, 72, 160, 178, 192, + 99, 71, 56, 251, 245, 131, 19, 220, 72, 251, 132, 249, 1, 232, 199, 90, 224, 241, 27, 56, + 29, 62, 128, 57, 255, 21, 100, 65, 225, 100, 150, 23, 56, 14, 176, 231, 173, 46, 240, 221, + 20, 56, 111, 143, 59, 226, 110, 240, 233, 129, 123, 130, 252, 71, 193, 249, 108, 51, 156, + 178, 172, 147, 213, 49, 56, 37, 157, 3, 207, 244, 103, 240, 61, 115, 128, 7, 88, 154, 84, + 135, 85, 208, 150, 116, 131, 49, 44, 34, 235, 72, 50, 249, 10, 62, 79, 200, 159, 180, 48, + 45, 105, 219, 177, 154, 52, 28, 70, 51, 145, 78, 130, 241, 204, 167, 215, 232, 93, 70, 88, + 14, 86, 142, 181, 102, 35, 217, 231, 112, 54, 137, 130, 253, 118, 177, 189, 175, 222, 135, + 61, 243, 109, 199, 70, 180, 121, 229, 176, 124, 130, 28, 98, 53, 105, 44, 156, 84, 91, 128, + 11, 112, 31, 172, 119, 40, 30, 78, 158, 225, 143, 72, 1, 124, 8, 122, 43, 64, 91, 208, 22, + 164, 46, 169, 14, 46, 241, 30, 208, 242, 222, 200, 95, 46, 6, 91, 23, 72, 252, 145, 159, 12, + 183, 218, 0, 127, 167, 20, 109, 207, 10, 83, 23, 156, 112, 91, 64, 188, 19, 120, 163, 225, + 104, 53, 222, 139, 158, 145, 134, 160, 105, 3, 192, 95, 89, 70, 222, 165, 139, 217, 44, 86, + 19, 95, 70, 35, 161, 79, 68, 50, 225, 167, 168, 54, 170, 141, 107, 194, 220, 157, 71, 125, + 97, 134, 74, 209, 141, 236, 148, 213, 34, 87, 52, 133, 247, 38, 153, 60, 19, 217, 61, 78, + 232, 57, 176, 131, 53, 48, 161, 199, 113, 39, 252, 16, 183, 0, 111, 251, 16, 174, 78, 166, + 161, 96, 136, 251, 225, 135, 64, 27, 193, 10, 252, 10, 52, 127, 23, 110, 143, 170, 176, 91, + 116, 42, 121, 139, 92, 133, 180, 88, 52, 27, 31, 130, 49, 238, 65, 177, 100, 15, 94, 1, 243, + 82, 5, 214, 99, 2, 110, 129, 151, 208, 114, 104, 4, 238, 11, 210, 168, 138, 122, 146, 57, + 40, 136, 244, 33, 65, 160, 207, 109, 209, 111, 120, 12, 206, 1, 43, 247, 25, 204, 77, 33, + 210, 13, 49, 154, 137, 68, 162, 11, 164, 35, 204, 250, 25, 156, 141, 148, 198, 35, 64, 79, + 123, 163, 41, 56, 9, 149, 132, 19, 195, 65, 116, 130, 204, 68, 149, 113, 52, 221, 159, 146, + 231, 121, 81, 130, 83, 30, 226, 77, 180, 33, 218, 132, 159, 177, 99, 236, 24, 97, 208, 210, + 33, 144, 102, 89, 176, 30, 97, 160, 33, 43, 193, 70, 180, 133, 149, 25, 72, 11, 131, 214, + 84, 65, 156, 148, 4, 253, 239, 12, 22, 176, 9, 202, 74, 158, 224, 97, 36, 22, 197, 224, 5, + 244, 7, 188, 138, 212, 70, 205, 81, 52, 237, 71, 26, 224, 121, 169, 79, 88, 109, 90, 1, 36, + 182, 27, 172, 73, 93, 81, 85, 33, 216, 53, 11, 176, 138, 48, 227, 247, 80, 77, 208, 198, + 238, 8, 137, 30, 236, 38, 31, 99, 133, 233, 121, 250, 216, 211, 209, 19, 152, 250, 46, 207, + 156, 122, 13, 13, 1, 233, 52, 4, 235, 54, 5, 214, 82, 67, 244, 53, 156, 233, 187, 224, 150, + 204, 67, 26, 51, 143, 167, 29, 90, 71, 54, 178, 107, 158, 92, 216, 133, 3, 209, 89, 15, 172, + 176, 212, 109, 56, 20, 23, 242, 184, 113, 95, 143, 198, 45, 65, 195, 187, 136, 53, 207, 23, + 178, 41, 108, 60, 235, 207, 134, 193, 222, 244, 12, 172, 230, 4, 52, 11, 45, 2, 207, 225, + 34, 250, 16, 246, 173, 34, 32, 199, 38, 32, 205, 119, 192, 246, 196, 192, 30, 81, 22, 149, + 71, 149, 96, 116, 53, 81, 29, 176, 74, 141, 32, 175, 5, 106, 7, 246, 52, 28, 172, 100, 55, + 20, 135, 250, 130, 229, 125, 31, 173, 7, 111, 38, 12, 53, 6, 121, 116, 129, 122, 221, 80, + 79, 72, 239, 7, 59, 212, 80, 52, 2, 214, 255, 68, 52, 21, 108, 192, 60, 180, 26, 157, 37, + 107, 201, 7, 52, 16, 206, 32, 71, 201, 0, 18, 3, 167, 209, 175, 233, 231, 52, 12, 183, 67, + 23, 216, 100, 54, 18, 181, 70, 133, 80, 75, 156, 29, 122, 126, 3, 102, 41, 0, 234, 77, 245, + 156, 135, 222, 138, 161, 124, 96, 253, 43, 194, 42, 5, 189, 247, 60, 240, 92, 242, 124, 252, + 252, 52, 180, 183, 26, 120, 159, 37, 234, 160, 7, 162, 46, 42, 138, 154, 227, 167, 44, 47, + 230, 97, 181, 219, 132, 213, 170, 89, 35, 180, 122, 181, 170, 85, 222, 168, 84, 177, 66, + 249, 114, 101, 203, 148, 46, 85, 178, 68, 241, 98, 69, 139, 20, 14, 41, 20, 28, 20, 232, 14, + 40, 88, 32, 127, 190, 188, 121, 114, 231, 202, 153, 195, 63, 123, 182, 172, 126, 89, 50, + 103, 114, 105, 211, 80, 82, 112, 70, 9, 70, 37, 235, 7, 55, 8, 119, 39, 23, 14, 79, 102, + 133, 131, 27, 54, 44, 101, 197, 131, 35, 32, 33, 34, 77, 66, 120, 178, 27, 146, 26, 188, 90, + 38, 217, 29, 110, 23, 115, 191, 90, 50, 12, 74, 118, 75, 87, 50, 204, 91, 50, 236, 69, 73, + 236, 231, 14, 69, 161, 165, 74, 186, 235, 7, 187, 147, 79, 214, 11, 118, 239, 196, 157, 90, + 118, 128, 240, 123, 245, 130, 59, 186, 147, 31, 218, 225, 166, 118, 120, 134, 29, 206, 4, + 225, 192, 64, 168, 224, 174, 159, 187, 71, 61, 119, 50, 14, 119, 215, 79, 110, 48, 160, 71, + 82, 253, 240, 122, 208, 220, 38, 109, 214, 13, 174, 27, 109, 150, 42, 137, 54, 153, 26, 130, + 26, 66, 201, 185, 130, 251, 108, 194, 185, 106, 98, 59, 64, 114, 213, 175, 182, 137, 32, + 149, 9, 152, 74, 206, 27, 92, 175, 126, 114, 158, 224, 122, 22, 7, 201, 52, 164, 126, 68, + 84, 114, 139, 150, 29, 234, 215, 203, 23, 24, 216, 177, 84, 201, 100, 92, 55, 50, 184, 107, + 50, 10, 174, 147, 156, 165, 132, 93, 4, 213, 181, 187, 73, 22, 117, 147, 165, 221, 141, 59, + 198, 26, 13, 154, 226, 222, 84, 242, 96, 210, 212, 157, 126, 168, 107, 120, 9, 87, 84, 112, + 84, 196, 59, 29, 146, 105, 68, 71, 171, 143, 172, 37, 160, 223, 122, 201, 185, 134, 220, + 201, 253, 50, 10, 141, 103, 171, 219, 97, 98, 218, 220, 124, 52, 169, 126, 238, 24, 183, 21, + 77, 74, 154, 232, 78, 94, 214, 178, 67, 218, 220, 64, 235, 187, 99, 71, 104, 3, 234, 146, + 144, 6, 225, 73, 13, 160, 235, 169, 32, 196, 198, 173, 221, 208, 27, 25, 223, 177, 67, 50, + 30, 15, 93, 186, 173, 145, 88, 163, 242, 142, 47, 58, 184, 190, 149, 18, 222, 211, 157, 108, + 4, 215, 9, 238, 145, 212, 51, 28, 166, 38, 111, 82, 50, 106, 53, 56, 112, 115, 222, 188, 97, + 187, 60, 183, 80, 222, 250, 238, 164, 54, 29, 130, 3, 147, 107, 229, 11, 238, 24, 81, 47, + 255, 38, 127, 148, 212, 106, 240, 150, 60, 97, 238, 60, 175, 230, 148, 42, 185, 201, 47, + 171, 87, 176, 155, 50, 103, 113, 2, 174, 76, 105, 3, 209, 47, 242, 236, 144, 93, 220, 10, + 53, 110, 245, 66, 178, 216, 226, 40, 184, 17, 40, 68, 178, 59, 210, 13, 156, 116, 8, 134, + 49, 85, 177, 190, 162, 171, 160, 164, 200, 42, 80, 12, 254, 58, 98, 168, 149, 28, 5, 51, 18, + 147, 108, 212, 13, 79, 242, 171, 102, 165, 91, 245, 147, 121, 136, 95, 176, 59, 233, 9, 2, + 13, 8, 126, 248, 227, 171, 41, 17, 78, 138, 8, 241, 123, 130, 172, 160, 165, 39, 47, 84, 13, + 242, 125, 225, 228, 18, 37, 146, 139, 23, 183, 84, 68, 214, 133, 57, 5, 30, 107, 218, 241, + 74, 165, 74, 14, 216, 73, 98, 130, 251, 248, 185, 129, 128, 248, 80, 11, 144, 109, 68, 199, + 106, 101, 64, 252, 129, 129, 214, 4, 79, 217, 25, 134, 186, 66, 36, 121, 84, 203, 14, 222, + 184, 27, 117, 205, 183, 25, 133, 149, 41, 209, 49, 153, 132, 91, 57, 7, 125, 57, 57, 218, + 90, 57, 163, 124, 57, 47, 170, 135, 7, 131, 38, 111, 181, 159, 67, 230, 72, 86, 133, 95, + 252, 151, 197, 47, 103, 246, 250, 61, 170, 37, 227, 156, 255, 67, 118, 180, 55, 191, 113, + 235, 224, 198, 45, 59, 117, 112, 215, 79, 10, 119, 100, 219, 184, 205, 43, 49, 111, 126, + 149, 23, 121, 78, 40, 57, 123, 221, 14, 52, 31, 113, 66, 36, 31, 181, 115, 65, 41, 223, 121, + 81, 216, 138, 116, 112, 37, 179, 16, 248, 79, 216, 74, 29, 181, 83, 42, 208, 74, 59, 5, 187, + 27, 36, 251, 133, 55, 244, 126, 119, 52, 3, 3, 255, 151, 149, 118, 122, 30, 89, 181, 108, + 242, 178, 154, 195, 102, 114, 181, 18, 175, 198, 171, 191, 18, 127, 133, 61, 87, 18, 5, 134, + 89, 97, 210, 184, 77, 167, 164, 36, 243, 149, 188, 6, 96, 129, 146, 146, 26, 4, 187, 27, 36, + 133, 39, 69, 236, 244, 140, 234, 26, 236, 246, 11, 78, 218, 5, 14, 72, 225, 164, 62, 245, + 195, 125, 51, 186, 211, 179, 123, 74, 190, 228, 6, 83, 59, 194, 32, 122, 224, 106, 160, 173, + 4, 213, 217, 20, 140, 39, 181, 220, 20, 134, 39, 181, 238, 212, 97, 151, 31, 66, 238, 73, + 109, 58, 108, 6, 215, 166, 110, 120, 157, 142, 155, 10, 65, 94, 135, 93, 110, 132, 194, 236, + 84, 242, 34, 213, 138, 185, 173, 24, 106, 140, 65, 211, 55, 131, 231, 104, 101, 229, 219, + 21, 134, 208, 40, 59, 151, 217, 9, 118, 60, 114, 39, 70, 118, 154, 242, 165, 97, 20, 185, + 147, 120, 211, 252, 236, 52, 248, 43, 5, 126, 43, 236, 141, 172, 59, 183, 158, 13, 72, 212, + 96, 147, 144, 59, 177, 107, 43, 152, 107, 206, 172, 0, 69, 166, 224, 16, 216, 78, 41, 201, + 107, 72, 43, 109, 59, 70, 121, 84, 243, 161, 185, 75, 52, 243, 123, 28, 218, 244, 121, 104, + 51, 191, 167, 161, 77, 253, 158, 135, 162, 90, 161, 207, 67, 45, 148, 43, 91, 33, 107, 96, + 214, 144, 192, 172, 129, 221, 25, 74, 113, 211, 131, 41, 97, 214, 109, 189, 155, 29, 132, + 222, 102, 122, 110, 178, 80, 58, 10, 105, 148, 11, 55, 12, 171, 146, 45, 39, 203, 233, 159, + 43, 39, 61, 134, 143, 233, 139, 228, 42, 191, 46, 47, 106, 209, 75, 198, 100, 37, 209, 36, + 154, 197, 168, 24, 179, 103, 166, 216, 172, 209, 217, 187, 229, 82, 57, 2, 105, 150, 64, + 131, 106, 67, 186, 2, 209, 78, 207, 193, 45, 89, 242, 212, 178, 105, 230, 92, 54, 13, 203, + 148, 163, 82, 50, 194, 126, 176, 189, 134, 195, 96, 118, 146, 137, 97, 185, 179, 5, 138, 48, + 40, 38, 194, 160, 76, 188, 56, 32, 78, 139, 91, 226, 17, 156, 101, 119, 226, 219, 91, 114, + 23, 255, 36, 247, 78, 92, 114, 124, 9, 191, 167, 157, 113, 137, 18, 15, 159, 119, 238, 91, + 194, 162, 168, 86, 45, 191, 135, 126, 15, 203, 149, 69, 141, 147, 117, 235, 198, 201, 133, + 64, 75, 246, 160, 156, 158, 199, 200, 223, 243, 120, 171, 159, 127, 102, 255, 92, 187, 61, + 183, 81, 118, 207, 237, 45, 153, 10, 102, 45, 88, 197, 249, 235, 136, 58, 227, 190, 157, 81, + 95, 80, 206, 48, 157, 211, 223, 47, 95, 45, 127, 235, 43, 235, 78, 207, 211, 176, 236, 89, + 10, 214, 210, 254, 240, 165, 76, 248, 146, 214, 23, 164, 255, 24, 86, 32, 155, 174, 37, 253, + 117, 54, 200, 132, 175, 156, 254, 89, 115, 213, 244, 183, 190, 178, 251, 103, 241, 183, 74, + 28, 9, 203, 6, 1, 211, 116, 249, 65, 77, 248, 34, 52, 75, 64, 40, 46, 129, 74, 188, 250, + 215, 17, 251, 163, 224, 32, 84, 169, 34, 170, 80, 30, 201, 138, 133, 131, 131, 68, 14, 255, + 156, 21, 202, 87, 102, 161, 169, 15, 63, 61, 146, 250, 19, 206, 118, 228, 83, 156, 189, 237, + 55, 203, 150, 125, 99, 1, 111, 60, 152, 250, 8, 103, 61, 112, 16, 103, 77, 125, 116, 104, + 233, 141, 155, 239, 47, 185, 117, 211, 118, 121, 45, 75, 0, 170, 112, 97, 83, 190, 189, 239, + 102, 9, 125, 162, 12, 101, 39, 175, 12, 105, 25, 97, 209, 67, 117, 190, 47, 224, 145, 127, + 205, 96, 207, 84, 9, 235, 161, 20, 148, 199, 222, 90, 150, 15, 4, 85, 179, 123, 164, 231, + 28, 123, 246, 226, 135, 15, 190, 39, 82, 215, 217, 73, 75, 207, 64, 211, 78, 250, 128, 31, + 0, 76, 8, 239, 1, 220, 113, 104, 42, 164, 125, 195, 78, 146, 206, 64, 75, 65, 252, 54, 96, + 6, 132, 75, 0, 221, 13, 244, 36, 208, 239, 0, 119, 157, 58, 235, 0, 135, 1, 151, 0, 71, 32, + 63, 27, 208, 243, 128, 123, 16, 206, 238, 45, 143, 171, 64, 188, 43, 32, 26, 48, 199, 155, + 142, 46, 3, 178, 2, 218, 3, 70, 2, 150, 2, 58, 0, 62, 0, 140, 2, 244, 114, 250, 176, 218, + 239, 232, 164, 229, 6, 148, 6, 244, 0, 108, 113, 168, 85, 103, 23, 96, 58, 160, 53, 192, 15, + 16, 2, 104, 1, 136, 4, 92, 132, 177, 212, 0, 250, 45, 244, 27, 234, 240, 108, 141, 125, 175, + 119, 92, 168, 148, 211, 199, 8, 167, 15, 139, 175, 225, 128, 182, 128, 125, 128, 173, 128, + 3, 142, 108, 114, 0, 98, 1, 51, 157, 122, 163, 156, 186, 167, 1, 179, 0, 111, 3, 170, 3, + 170, 56, 99, 157, 11, 120, 8, 125, 1, 37, 208, 55, 158, 227, 180, 147, 213, 193, 72, 135, + 127, 223, 152, 90, 59, 60, 189, 14, 235, 156, 254, 210, 98, 119, 58, 248, 120, 75, 143, 183, + 211, 33, 5, 120, 105, 233, 200, 98, 152, 87, 118, 56, 62, 141, 172, 125, 58, 194, 32, 29, + 248, 197, 181, 156, 241, 100, 115, 228, 218, 219, 225, 169, 171, 119, 62, 109, 218, 9, 144, + 12, 176, 244, 164, 50, 224, 35, 0, 232, 17, 46, 10, 40, 12, 225, 26, 206, 220, 244, 241, + 234, 143, 165, 123, 246, 124, 78, 6, 108, 114, 228, 210, 218, 153, 179, 145, 78, 127, 62, + 57, 245, 112, 104, 54, 239, 120, 60, 191, 56, 243, 127, 21, 218, 121, 14, 8, 113, 248, 89, + 236, 200, 220, 106, 163, 59, 64, 50, 91, 143, 72, 27, 160, 153, 1, 150, 222, 61, 115, 116, + 210, 226, 243, 150, 195, 87, 86, 103, 30, 124, 212, 194, 221, 116, 232, 145, 6, 173, 211, + 96, 183, 87, 175, 236, 113, 90, 180, 26, 244, 103, 233, 23, 140, 9, 91, 121, 160, 15, 248, + 130, 163, 123, 237, 156, 113, 238, 114, 116, 230, 162, 87, 63, 44, 221, 240, 192, 56, 208, + 104, 135, 247, 185, 206, 248, 74, 121, 199, 133, 129, 119, 60, 0, 0, 58, 137, 35, 211, 204, + 143, 5, 223, 122, 25, 238, 240, 233, 107, 123, 164, 51, 159, 62, 10, 250, 237, 129, 124, + 114, 196, 25, 231, 140, 52, 116, 169, 147, 255, 220, 25, 251, 168, 52, 116, 148, 195, 115, + 122, 90, 218, 209, 55, 31, 237, 225, 232, 90, 7, 167, 63, 31, 245, 241, 99, 173, 207, 89, + 105, 168, 37, 187, 183, 211, 80, 71, 22, 47, 232, 72, 103, 14, 59, 57, 250, 181, 13, 198, + 158, 15, 232, 2, 192, 25, 192, 80, 239, 120, 44, 123, 99, 167, 91, 243, 107, 253, 91, 181, + 225, 127, 167, 190, 48, 90, 227, 232, 213, 66, 239, 184, 73, 1, 200, 115, 228, 104, 133, 45, + 248, 194, 105, 105, 122, 88, 237, 217, 117, 125, 109, 167, 201, 251, 79, 211, 255, 95, 64, + 186, 167, 75, 35, 14, 178, 164, 163, 27, 152, 119, 125, 91, 235, 143, 58, 176, 100, 82, 27, + 232, 78, 103, 46, 137, 51, 127, 160, 71, 56, 139, 35, 111, 131, 121, 215, 138, 213, 23, 118, + 214, 215, 30, 167, 158, 85, 63, 198, 11, 171, 125, 219, 110, 248, 244, 40, 189, 206, 165, + 215, 165, 180, 58, 53, 252, 53, 212, 178, 249, 109, 29, 90, 147, 121, 245, 121, 207, 63, + 208, 125, 78, 31, 150, 125, 182, 108, 214, 1, 71, 175, 210, 235, 231, 40, 246, 170, 126, + 166, 215, 211, 180, 250, 57, 132, 253, 93, 47, 211, 83, 75, 22, 150, 125, 247, 173, 83, 223, + 62, 102, 141, 223, 178, 79, 150, 141, 179, 108, 100, 31, 103, 175, 244, 149, 79, 79, 157, + 250, 182, 253, 178, 108, 195, 36, 71, 246, 46, 167, 61, 13, 0, 189, 38, 202, 177, 31, 150, + 252, 33, 140, 194, 64, 239, 83, 156, 249, 129, 249, 240, 60, 5, 90, 28, 40, 148, 65, 191, + 178, 151, 123, 106, 180, 51, 198, 139, 236, 229, 94, 218, 209, 209, 13, 223, 62, 58, 219, + 145, 71, 20, 243, 218, 155, 35, 142, 28, 34, 157, 49, 88, 250, 31, 234, 212, 181, 210, 186, + 58, 107, 109, 138, 151, 31, 171, 31, 12, 123, 4, 106, 0, 180, 157, 55, 221, 106, 135, 88, + 125, 44, 245, 242, 135, 44, 219, 251, 22, 228, 215, 119, 228, 126, 220, 145, 183, 197, 163, + 181, 14, 173, 244, 254, 94, 251, 105, 167, 205, 116, 104, 127, 246, 210, 38, 143, 116, 176, + 139, 189, 180, 199, 214, 220, 5, 51, 175, 254, 91, 101, 6, 2, 74, 58, 99, 241, 201, 192, + 231, 91, 188, 229, 109, 203, 3, 182, 31, 37, 0, 138, 58, 24, 232, 180, 145, 219, 145, 81, + 90, 89, 140, 116, 100, 81, 50, 141, 60, 44, 249, 21, 99, 246, 190, 104, 195, 183, 238, 172, + 126, 44, 219, 157, 211, 145, 175, 165, 11, 150, 222, 129, 141, 178, 237, 85, 39, 39, 238, + 239, 228, 85, 115, 48, 8, 80, 1, 16, 224, 244, 63, 211, 161, 62, 159, 100, 181, 35, 255, + 129, 206, 124, 54, 245, 202, 26, 5, 58, 104, 236, 240, 110, 149, 27, 3, 40, 4, 24, 235, 244, + 53, 205, 233, 219, 231, 159, 88, 235, 197, 242, 17, 182, 122, 251, 244, 252, 196, 188, 107, + 108, 144, 211, 71, 47, 103, 204, 86, 29, 107, 111, 44, 231, 149, 7, 1, 125, 197, 214, 252, + 53, 242, 130, 64, 31, 120, 135, 131, 5, 94, 216, 105, 141, 189, 148, 88, 123, 255, 54, 39, + 29, 218, 165, 83, 188, 243, 134, 79, 48, 175, 221, 6, 189, 192, 150, 31, 181, 18, 176, 12, + 194, 3, 189, 237, 218, 107, 23, 250, 195, 253, 152, 119, 93, 89, 124, 30, 100, 94, 95, 99, + 188, 179, 255, 229, 135, 112, 115, 39, 221, 210, 245, 191, 0, 55, 0, 43, 0, 71, 1, 235, 1, + 39, 188, 237, 218, 107, 121, 188, 83, 215, 178, 13, 191, 51, 239, 250, 253, 222, 105, 127, + 46, 123, 105, 63, 15, 58, 245, 118, 165, 161, 103, 210, 32, 61, 207, 209, 142, 79, 251, 58, + 126, 199, 167, 225, 211, 199, 227, 107, 248, 179, 198, 109, 175, 145, 173, 78, 25, 200, 35, + 117, 33, 125, 42, 32, 28, 96, 201, 244, 115, 47, 44, 159, 197, 178, 195, 246, 222, 115, 13, + 48, 223, 161, 22, 86, 58, 20, 214, 21, 182, 252, 161, 175, 0, 81, 142, 207, 246, 24, 40, + 204, 41, 134, 53, 136, 223, 240, 218, 15, 12, 62, 17, 46, 2, 121, 243, 156, 182, 193, 23, + 35, 214, 252, 158, 5, 252, 6, 200, 228, 205, 199, 89, 157, 53, 251, 186, 253, 15, 250, 34, + 212, 203, 147, 69, 49, 140, 15, 127, 8, 0, 93, 195, 48, 95, 184, 149, 83, 110, 9, 160, 171, + 119, 60, 182, 221, 11, 73, 211, 142, 101, 223, 68, 154, 54, 253, 28, 121, 248, 242, 103, 56, + 58, 239, 219, 183, 124, 233, 166, 3, 95, 124, 45, 243, 250, 148, 143, 0, 243, 29, 250, 200, + 105, 203, 194, 129, 151, 176, 101, 226, 243, 167, 211, 150, 183, 228, 9, 235, 6, 95, 116, + 100, 254, 177, 119, 140, 118, 251, 5, 156, 245, 80, 226, 53, 241, 244, 233, 255, 229, 190, + 254, 127, 5, 91, 238, 75, 210, 156, 225, 172, 116, 127, 103, 47, 183, 100, 247, 165, 163, + 67, 214, 248, 143, 120, 245, 214, 58, 15, 225, 63, 210, 200, 211, 231, 107, 32, 39, 61, 221, + 252, 225, 47, 0, 227, 94, 51, 175, 233, 203, 165, 155, 215, 127, 141, 91, 107, 173, 229, 75, + 250, 66, 15, 124, 84, 188, 170, 55, 127, 139, 255, 27, 92, 233, 244, 39, 93, 28, 231, 117, + 214, 239, 63, 196, 211, 235, 173, 109, 123, 47, 165, 137, 91, 235, 185, 74, 154, 250, 214, + 158, 221, 55, 77, 124, 179, 23, 47, 202, 195, 121, 219, 182, 213, 190, 252, 223, 28, 185, + 250, 242, 157, 249, 121, 49, 47, 22, 29, 144, 38, 223, 242, 5, 173, 125, 212, 178, 255, 203, + 1, 48, 239, 182, 79, 226, 80, 146, 199, 89, 219, 142, 189, 64, 17, 128, 38, 142, 142, 92, + 117, 236, 70, 38, 199, 6, 172, 116, 116, 2, 244, 6, 185, 1, 220, 89, 15, 199, 29, 92, 116, + 214, 198, 88, 167, 174, 111, 44, 75, 188, 192, 247, 1, 79, 188, 176, 247, 111, 216, 83, 176, + 181, 23, 88, 118, 200, 58, 127, 131, 31, 74, 34, 29, 93, 179, 206, 138, 214, 126, 99, 249, + 8, 144, 142, 111, 57, 101, 44, 192, 222, 132, 15, 57, 60, 126, 238, 232, 194, 82, 103, 92, + 22, 172, 251, 134, 83, 0, 235, 28, 215, 19, 144, 232, 200, 208, 242, 183, 246, 58, 114, 180, + 246, 52, 203, 46, 79, 118, 108, 160, 229, 19, 88, 123, 222, 46, 167, 140, 5, 203, 254, 45, + 242, 242, 138, 39, 0, 58, 59, 216, 239, 192, 226, 19, 242, 241, 205, 215, 235, 246, 223, + 116, 193, 103, 83, 124, 250, 236, 179, 21, 190, 185, 125, 211, 129, 229, 215, 192, 60, 163, + 175, 189, 107, 203, 94, 95, 167, 156, 114, 62, 255, 212, 241, 55, 109, 57, 192, 252, 218, + 123, 173, 117, 191, 98, 173, 93, 107, 189, 90, 254, 224, 81, 199, 230, 90, 251, 43, 244, 99, + 239, 25, 224, 15, 224, 46, 128, 122, 176, 247, 90, 62, 245, 23, 105, 250, 183, 124, 124, + 240, 3, 240, 42, 0, 200, 240, 197, 62, 94, 34, 13, 138, 166, 129, 231, 53, 56, 226, 232, + 192, 63, 229, 191, 14, 117, 156, 182, 29, 250, 183, 243, 231, 255, 53, 253, 167, 115, 199, + 255, 150, 90, 254, 229, 110, 246, 242, 156, 145, 254, 236, 240, 127, 77, 255, 237, 204, 241, + 79, 212, 119, 6, 73, 79, 125, 114, 240, 141, 227, 63, 236, 7, 151, 1, 88, 190, 234, 19, 135, + 58, 126, 161, 237, 63, 91, 113, 203, 119, 25, 148, 134, 246, 114, 208, 213, 233, 223, 71, + 45, 159, 217, 178, 217, 150, 207, 220, 128, 189, 60, 223, 213, 113, 228, 236, 240, 101, 219, + 7, 203, 239, 177, 250, 110, 200, 108, 127, 205, 70, 195, 52, 24, 152, 102, 47, 242, 217, + 196, 244, 182, 241, 95, 246, 162, 255, 235, 248, 127, 188, 183, 253, 151, 123, 225, 255, + 154, 206, 119, 232, 98, 246, 250, 61, 244, 63, 165, 255, 182, 231, 254, 151, 123, 240, 191, + 238, 177, 255, 109, 220, 183, 71, 167, 167, 220, 129, 175, 92, 122, 95, 51, 221, 94, 254, + 175, 241, 244, 190, 233, 127, 25, 255, 155, 239, 240, 31, 198, 211, 251, 22, 255, 109, 252, + 111, 250, 233, 248, 42, 246, 93, 231, 111, 105, 210, 157, 184, 77, 173, 253, 39, 253, 122, + 253, 79, 169, 117, 166, 182, 246, 210, 116, 190, 233, 43, 235, 63, 173, 79, 228, 139, 119, + 122, 21, 190, 51, 142, 253, 108, 2, 108, 189, 125, 86, 177, 246, 210, 101, 96, 91, 64, 238, + 246, 89, 206, 223, 59, 7, 196, 186, 123, 1, 157, 196, 189, 156, 50, 144, 103, 157, 97, 45, + 95, 195, 198, 39, 204, 62, 35, 251, 124, 5, 171, 188, 85, 238, 223, 214, 66, 122, 93, 183, + 125, 242, 205, 105, 116, 207, 130, 117, 166, 183, 124, 170, 29, 236, 111, 254, 220, 63, 81, + 155, 191, 106, 204, 123, 47, 7, 103, 80, 146, 205, 203, 147, 45, 7, 107, 14, 255, 100, 182, + 159, 247, 226, 94, 196, 242, 83, 124, 247, 42, 214, 217, 214, 186, 15, 178, 238, 175, 44, + 251, 102, 217, 12, 235, 238, 131, 57, 212, 119, 23, 157, 211, 169, 91, 42, 13, 245, 181, + 177, 206, 185, 63, 246, 149, 177, 236, 59, 248, 126, 246, 158, 154, 224, 140, 215, 74, 171, + 238, 244, 103, 237, 77, 224, 235, 189, 184, 187, 179, 238, 147, 106, 59, 121, 86, 89, 223, + 157, 157, 229, 199, 205, 116, 218, 45, 229, 240, 226, 187, 179, 179, 124, 17, 235, 222, 201, + 186, 59, 232, 204, 94, 222, 47, 91, 117, 90, 167, 145, 187, 239, 78, 121, 121, 26, 92, 245, + 242, 108, 235, 208, 12, 167, 110, 41, 231, 57, 13, 232, 135, 101, 247, 236, 103, 20, 202, + 129, 233, 200, 199, 10, 91, 251, 171, 116, 96, 58, 227, 114, 246, 92, 107, 239, 252, 219, + 125, 160, 149, 159, 246, 158, 211, 55, 230, 244, 126, 128, 197, 23, 236, 131, 182, 93, 73, + 219, 175, 175, 158, 233, 200, 192, 119, 183, 249, 111, 126, 79, 90, 63, 102, 247, 107, 250, + 75, 127, 87, 159, 222, 31, 72, 127, 119, 191, 206, 65, 218, 123, 90, 240, 155, 173, 245, + 244, 66, 198, 233, 121, 241, 237, 241, 69, 95, 211, 191, 143, 250, 252, 22, 43, 110, 61, + 135, 43, 206, 94, 222, 129, 245, 116, 210, 124, 207, 231, 154, 177, 151, 103, 120, 171, 252, + 68, 7, 195, 29, 88, 117, 62, 116, 218, 181, 120, 236, 238, 96, 159, 115, 47, 233, 187, 67, + 182, 252, 231, 108, 14, 191, 57, 210, 192, 167, 123, 213, 156, 54, 172, 254, 250, 59, 225, + 126, 105, 96, 245, 99, 233, 208, 53, 39, 60, 205, 129, 37, 175, 77, 105, 112, 214, 145, 157, + 239, 249, 160, 181, 166, 173, 245, 225, 123, 78, 88, 219, 201, 179, 100, 247, 145, 51, 255, + 150, 109, 89, 235, 232, 193, 90, 167, 125, 107, 172, 67, 157, 177, 250, 230, 192, 154, 159, + 56, 230, 189, 179, 27, 149, 166, 142, 153, 14, 93, 95, 147, 182, 198, 219, 167, 253, 252, + 36, 155, 99, 11, 65, 230, 184, 184, 3, 75, 254, 223, 123, 109, 134, 109, 163, 172, 123, 35, + 231, 89, 155, 69, 73, 102, 47, 236, 231, 91, 97, 236, 229, 179, 192, 33, 94, 88, 247, 128, + 246, 25, 101, 175, 19, 14, 245, 134, 109, 56, 231, 130, 23, 109, 44, 72, 131, 80, 175, 61, + 182, 159, 121, 85, 0, 52, 5, 192, 122, 193, 149, 188, 253, 216, 249, 161, 94, 217, 251, 194, + 246, 115, 32, 223, 115, 183, 90, 206, 190, 83, 221, 155, 103, 247, 125, 209, 137, 87, 115, + 224, 27, 7, 128, 230, 73, 195, 87, 90, 30, 238, 189, 158, 55, 223, 188, 250, 250, 177, 239, + 231, 173, 231, 124, 23, 210, 140, 51, 240, 37, 111, 47, 250, 116, 158, 15, 90, 250, 101, + 243, 155, 38, 110, 207, 251, 119, 78, 127, 86, 29, 152, 71, 92, 144, 217, 103, 52, 226, 43, + 191, 215, 145, 103, 81, 135, 119, 245, 178, 63, 59, 255, 162, 195, 99, 218, 243, 155, 117, + 54, 222, 193, 94, 221, 131, 138, 56, 121, 101, 1, 224, 159, 91, 103, 114, 156, 11, 80, 21, + 64, 157, 53, 113, 214, 209, 5, 75, 71, 159, 56, 178, 79, 59, 151, 204, 209, 225, 222, 78, + 155, 189, 157, 245, 81, 158, 121, 207, 213, 190, 117, 61, 210, 89, 15, 31, 56, 176, 244, + 100, 138, 163, 227, 143, 210, 172, 185, 180, 118, 165, 191, 163, 215, 22, 172, 103, 34, 135, + 217, 203, 231, 236, 214, 29, 251, 61, 167, 15, 95, 218, 86, 167, 63, 43, 12, 123, 156, 109, + 119, 138, 58, 249, 214, 26, 182, 246, 243, 121, 204, 123, 95, 94, 149, 189, 244, 63, 253, + 156, 53, 104, 197, 45, 31, 208, 58, 163, 180, 72, 19, 31, 204, 188, 123, 164, 229, 119, 212, + 79, 51, 166, 188, 78, 189, 188, 233, 234, 15, 118, 242, 29, 255, 193, 158, 83, 95, 223, 35, + 29, 62, 183, 58, 186, 108, 205, 113, 77, 47, 16, 118, 80, 212, 225, 215, 146, 107, 55, 246, + 114, 207, 181, 246, 227, 138, 204, 187, 135, 90, 54, 207, 119, 230, 130, 57, 179, 239, 251, + 125, 207, 200, 173, 62, 37, 251, 251, 51, 56, 203, 118, 175, 118, 198, 236, 98, 47, 207, 98, + 22, 207, 89, 210, 208, 187, 175, 57, 223, 89, 207, 70, 42, 176, 151, 231, 59, 31, 124, 109, + 88, 126, 74, 128, 87, 191, 255, 182, 23, 249, 246, 62, 223, 62, 224, 156, 249, 94, 244, 225, + 27, 207, 97, 71, 31, 124, 227, 247, 209, 244, 123, 132, 53, 247, 214, 29, 151, 245, 60, 102, + 238, 107, 168, 143, 39, 226, 240, 101, 221, 9, 141, 112, 120, 40, 200, 94, 238, 213, 150, + 111, 211, 201, 9, 251, 246, 87, 127, 246, 82, 159, 28, 121, 217, 247, 42, 141, 153, 125, + 103, 102, 63, 3, 217, 201, 188, 247, 38, 87, 0, 53, 156, 240, 29, 135, 2, 168, 245, 12, 227, + 182, 183, 45, 203, 39, 193, 35, 156, 245, 232, 148, 177, 127, 11, 241, 173, 83, 190, 157, + 211, 254, 29, 167, 204, 42, 175, 30, 225, 71, 206, 179, 148, 50, 14, 124, 235, 248, 58, 96, + 40, 123, 213, 183, 72, 239, 135, 165, 245, 199, 172, 113, 56, 207, 244, 255, 149, 254, 111, + 239, 68, 172, 245, 123, 153, 189, 254, 89, 237, 255, 68, 125, 119, 40, 62, 31, 196, 231, + 251, 164, 167, 86, 187, 175, 251, 157, 129, 143, 90, 115, 154, 227, 53, 52, 253, 239, 16, + 254, 233, 119, 9, 255, 68, 125, 235, 204, 71, 211, 251, 68, 255, 244, 123, 134, 127, 163, + 233, 127, 239, 240, 111, 191, 127, 248, 39, 234, 179, 83, 62, 154, 254, 57, 178, 239, 142, + 197, 71, 125, 190, 84, 250, 223, 83, 248, 104, 91, 167, 255, 42, 78, 185, 25, 206, 188, 118, + 253, 23, 252, 195, 121, 198, 147, 207, 11, 252, 15, 248, 199, 59, 128, 41, 255, 130, 127, + 233, 143, 88, 207, 169, 238, 58, 190, 194, 188, 52, 212, 58, 199, 253, 83, 159, 22, 124, + 246, 54, 253, 111, 164, 124, 240, 245, 179, 196, 193, 17, 47, 94, 156, 155, 254, 9, 86, 157, + 68, 7, 214, 184, 251, 255, 11, 172, 242, 63, 2, 218, 57, 24, 225, 192, 26, 159, 124, 41, + 247, 23, 114, 116, 228, 130, 71, 121, 109, 199, 11, 126, 125, 253, 251, 218, 253, 47, 231, + 241, 191, 157, 151, 255, 171, 113, 191, 22, 190, 189, 206, 247, 220, 61, 171, 87, 15, 44, + 159, 196, 214, 7, 199, 94, 190, 150, 111, 146, 14, 214, 185, 222, 119, 207, 95, 212, 235, + 247, 88, 119, 157, 47, 116, 23, 57, 122, 228, 251, 189, 129, 83, 47, 109, 157, 191, 233, + 192, 113, 7, 190, 120, 164, 3, 95, 159, 200, 235, 183, 217, 190, 91, 209, 127, 144, 79, 122, + 62, 67, 189, 101, 173, 241, 217, 207, 121, 122, 189, 70, 254, 190, 223, 41, 22, 118, 252, + 55, 107, 255, 180, 126, 163, 233, 252, 78, 192, 126, 62, 187, 194, 217, 111, 238, 120, 253, + 86, 219, 159, 172, 238, 192, 26, 191, 245, 44, 229, 135, 116, 240, 249, 176, 141, 188, 245, + 108, 255, 212, 242, 101, 247, 165, 105, 43, 183, 55, 253, 21, 126, 124, 182, 212, 178, 87, + 214, 125, 191, 101, 171, 44, 155, 232, 251, 45, 130, 15, 150, 237, 177, 158, 63, 88, 235, + 113, 169, 147, 22, 192, 94, 158, 189, 198, 56, 212, 170, 103, 217, 54, 240, 71, 172, 103, + 28, 47, 116, 223, 242, 107, 198, 58, 176, 194, 237, 28, 25, 89, 123, 195, 90, 246, 242, 140, + 245, 208, 233, 43, 217, 169, 183, 192, 201, 235, 229, 212, 179, 124, 60, 203, 207, 129, 61, + 218, 186, 23, 180, 159, 125, 91, 200, 233, 248, 198, 185, 216, 203, 103, 231, 221, 188, 122, + 98, 255, 142, 208, 242, 193, 172, 223, 221, 252, 194, 188, 119, 74, 150, 14, 53, 230, 217, + 113, 19, 128, 229, 39, 7, 99, 141, 174, 227, 162, 240, 161, 232, 156, 253, 47, 45, 203, 226, + 74, 184, 28, 124, 40, 110, 129, 139, 162, 179, 184, 58, 46, 140, 67, 1, 133, 33, 183, 58, + 206, 133, 155, 160, 203, 232, 9, 174, 140, 59, 162, 231, 184, 33, 118, 227, 226, 80, 174, + 20, 206, 5, 105, 86, 74, 57, 43, 37, 205, 191, 142, 115, 227, 188, 120, 2, 158, 133, 7, 67, + 221, 206, 228, 45, 188, 159, 228, 197, 111, 227, 165, 184, 37, 154, 129, 162, 95, 20, 171, + 134, 50, 33, 19, 21, 68, 197, 81, 1, 148, 19, 232, 12, 116, 19, 109, 6, 142, 74, 160, 45, + 168, 214, 203, 31, 8, 3, 70, 162, 220, 40, 0, 105, 244, 38, 124, 172, 127, 111, 187, 14, + 141, 66, 211, 209, 105, 244, 16, 13, 162, 83, 240, 10, 156, 15, 47, 131, 82, 193, 144, 227, + 253, 44, 192, 235, 240, 2, 82, 8, 15, 196, 11, 208, 53, 188, 8, 223, 198, 7, 224, 3, 235, 3, + 127, 13, 124, 134, 192, 199, 250, 251, 15, 41, 246, 67, 75, 95, 161, 48, 158, 23, 99, 18, + 240, 177, 210, 242, 226, 252, 175, 163, 192, 187, 120, 133, 82, 251, 255, 44, 255, 55, 138, + 55, 227, 205, 105, 41, 74, 69, 211, 94, 71, 177, 66, 125, 237, 184, 213, 119, 154, 254, 225, + 175, 62, 218, 15, 223, 161, 128, 197, 232, 93, 212, 17, 181, 7, 41, 53, 195, 121, 208, 54, + 72, 249, 22, 221, 65, 165, 80, 59, 84, 25, 190, 71, 192, 140, 102, 65, 7, 208, 30, 148, 3, + 197, 66, 124, 29, 200, 115, 19, 170, 14, 109, 61, 68, 157, 96, 78, 70, 192, 28, 84, 129, + 182, 37, 218, 7, 121, 155, 160, 246, 84, 208, 142, 170, 56, 11, 46, 4, 243, 29, 5, 31, 138, + 11, 226, 22, 164, 44, 238, 15, 159, 174, 184, 31, 14, 133, 249, 59, 130, 206, 162, 139, 144, + 238, 15, 186, 227, 143, 219, 224, 102, 182, 246, 52, 196, 217, 113, 86, 208, 149, 190, 246, + 167, 34, 174, 107, 105, 22, 254, 17, 52, 12, 214, 56, 232, 94, 97, 208, 190, 74, 48, 167, + 126, 168, 3, 204, 222, 110, 212, 245, 213, 15, 180, 228, 253, 184, 188, 31, 24, 211, 43, 31, + 204, 225, 147, 54, 125, 9, 140, 109, 159, 35, 143, 184, 12, 252, 95, 128, 152, 25, 200, 64, + 6, 50, 144, 129, 12, 100, 32, 3, 25, 200, 64, 6, 50, 144, 129, 12, 100, 32, 3, 25, 200, 64, + 6, 50, 144, 129, 12, 100, 32, 3, 25, 200, 64, 6, 50, 144, 129, 12, 100, 32, 3, 25, 200, 64, + 6, 50, 144, 129, 12, 100, 32, 3, 25, 200, 64, 6, 50, 144, 129, 12, 100, 224, 255, 135, 192, + 8, 185, 154, 227, 32, 212, 8, 141, 69, 28, 17, 228, 135, 202, 160, 182, 8, 209, 15, 120, + 123, 196, 32, 142, 80, 53, 178, 223, 254, 183, 43, 214, 95, 79, 231, 223, 177, 88, 255, 207, + 255, 156, 118, 204, 10, 19, 148, 25, 151, 117, 194, 20, 117, 194, 53, 157, 48, 75, 83, 134, + 163, 220, 120, 129, 19, 22, 40, 63, 78, 118, 194, 18, 125, 246, 162, 140, 66, 101, 209, 106, + 39, 108, 64, 153, 19, 78, 56, 19, 89, 132, 191, 127, 241, 78, 129, 74, 108, 140, 19, 198, + 72, 179, 29, 78, 152, 32, 201, 243, 58, 97, 138, 74, 241, 64, 39, 204, 210, 148, 225, 200, + 197, 155, 57, 97, 129, 50, 243, 78, 78, 88, 162, 200, 23, 101, 20, 202, 205, 46, 58, 97, 3, + 202, 244, 112, 194, 153, 112, 83, 62, 0, 90, 198, 140, 66, 95, 46, 113, 216, 14, 219, 18, + 19, 231, 237, 176, 176, 211, 191, 181, 195, 210, 78, 255, 217, 14, 43, 59, 236, 177, 195, + 134, 35, 67, 111, 216, 43, 67, 111, 216, 43, 67, 111, 216, 43, 67, 111, 152, 165, 41, 227, + 149, 161, 55, 236, 149, 161, 55, 236, 149, 161, 55, 236, 149, 161, 55, 236, 149, 161, 55, + 236, 149, 161, 21, 54, 211, 240, 175, 45, 222, 100, 22, 59, 236, 74, 147, 158, 217, 10, 203, + 0, 59, 236, 103, 241, 38, 203, 216, 225, 236, 16, 206, 38, 107, 216, 97, 255, 52, 229, 115, + 216, 99, 244, 134, 115, 166, 73, 207, 99, 215, 109, 110, 135, 243, 217, 125, 121, 219, 44, + 144, 166, 76, 64, 154, 112, 33, 187, 124, 103, 59, 92, 220, 14, 247, 178, 195, 165, 236, + 240, 96, 43, 172, 210, 240, 175, 210, 244, 229, 74, 147, 238, 242, 141, 101, 13, 114, 163, + 242, 32, 145, 178, 168, 50, 132, 218, 160, 30, 40, 26, 104, 83, 20, 143, 226, 0, 137, 104, + 48, 234, 99, 167, 212, 133, 88, 2, 132, 173, 239, 8, 72, 143, 177, 75, 148, 134, 156, 218, + 40, 22, 62, 110, 212, 10, 210, 186, 67, 253, 68, 212, 207, 142, 69, 3, 141, 134, 210, 3, + 224, 59, 10, 74, 90, 45, 244, 135, 120, 140, 157, 234, 70, 205, 128, 14, 4, 26, 99, 151, + 143, 0, 36, 218, 109, 71, 65, 122, 111, 160, 9, 168, 23, 164, 197, 163, 110, 255, 15, 124, + 89, 173, 198, 217, 45, 122, 235, 181, 133, 88, 12, 196, 44, 78, 220, 168, 53, 132, 34, 236, + 152, 183, 231, 56, 72, 45, 99, 183, 224, 182, 219, 238, 225, 112, 24, 105, 115, 28, 103, + 243, 21, 99, 151, 46, 109, 143, 171, 59, 164, 198, 218, 28, 166, 231, 167, 218, 63, 140, + 178, 154, 45, 5, 235, 61, 238, 62, 254, 42, 64, 91, 229, 64, 234, 110, 84, 20, 90, 137, 129, + 190, 18, 32, 167, 159, 61, 222, 68, 84, 12, 181, 75, 87, 190, 18, 148, 183, 102, 233, 213, + 246, 189, 173, 183, 128, 17, 89, 239, 240, 108, 8, 121, 3, 109, 190, 172, 81, 54, 134, 188, + 68, 248, 196, 218, 37, 59, 218, 245, 220, 182, 100, 7, 3, 237, 111, 207, 142, 87, 66, 222, + 25, 232, 102, 247, 148, 104, 75, 196, 138, 247, 177, 235, 245, 182, 229, 230, 147, 92, 87, + 187, 174, 79, 170, 245, 65, 174, 77, 96, 254, 189, 117, 19, 210, 228, 244, 177, 71, 19, 5, + 189, 68, 218, 45, 122, 103, 99, 160, 221, 87, 36, 124, 191, 190, 95, 111, 220, 42, 27, 9, + 92, 247, 183, 53, 33, 202, 46, 27, 15, 223, 81, 118, 126, 31, 91, 242, 131, 95, 204, 155, + 183, 175, 24, 167, 133, 72, 167, 173, 104, 251, 219, 210, 78, 247, 223, 70, 110, 149, 136, + 181, 67, 69, 161, 94, 49, 160, 150, 190, 117, 125, 209, 215, 235, 248, 138, 251, 91, 219, + 255, 123, 41, 189, 108, 61, 202, 110, 169, 59, 164, 37, 216, 218, 228, 213, 171, 200, 23, + 90, 251, 250, 209, 191, 212, 228, 87, 249, 170, 158, 70, 6, 214, 72, 188, 99, 73, 180, 251, + 243, 173, 7, 171, 125, 239, 88, 163, 108, 221, 176, 70, 30, 111, 175, 177, 215, 143, 212, + 43, 233, 136, 87, 164, 26, 237, 172, 139, 244, 171, 195, 146, 106, 34, 148, 235, 111, 215, + 180, 184, 29, 96, 143, 38, 250, 69, 59, 86, 201, 88, 40, 241, 63, 206, 209, 26, 119, 249, + 178, 101, 43, 187, 219, 244, 136, 118, 55, 141, 143, 139, 79, 28, 220, 39, 218, 93, 55, 62, + 161, 79, 124, 66, 68, 98, 76, 124, 92, 105, 119, 237, 216, 88, 119, 171, 152, 238, 61, 18, + 251, 185, 91, 69, 247, 139, 78, 24, 16, 29, 85, 186, 110, 124, 255, 132, 152, 232, 4, 119, + 179, 232, 129, 238, 152, 126, 238, 8, 119, 98, 66, 68, 84, 116, 239, 136, 132, 94, 238, 248, + 110, 255, 216, 150, 59, 38, 206, 157, 8, 121, 109, 227, 98, 18, 163, 163, 220, 173, 19, 35, + 18, 163, 161, 114, 92, 84, 153, 248, 4, 119, 60, 228, 36, 184, 35, 227, 251, 199, 37, 66, + 211, 253, 74, 183, 138, 238, 222, 63, 54, 34, 193, 215, 78, 181, 52, 93, 86, 27, 16, 157, + 208, 207, 106, 175, 66, 233, 114, 101, 221, 69, 155, 198, 68, 38, 196, 247, 139, 239, 150, + 88, 172, 157, 147, 94, 169, 116, 217, 178, 78, 121, 40, 222, 162, 117, 211, 54, 13, 227, 7, + 70, 36, 68, 185, 27, 71, 39, 38, 198, 70, 39, 116, 140, 239, 239, 238, 29, 49, 216, 221, + 191, 95, 52, 48, 4, 3, 232, 22, 31, 151, 232, 142, 232, 231, 238, 19, 157, 208, 59, 38, 209, + 98, 174, 235, 96, 155, 213, 250, 109, 155, 212, 134, 220, 4, 59, 210, 39, 33, 62, 170, 127, + 100, 162, 53, 140, 129, 61, 98, 34, 123, 164, 169, 11, 52, 38, 46, 50, 182, 127, 20, 84, 77, + 140, 119, 71, 197, 244, 235, 19, 11, 29, 192, 216, 160, 86, 12, 20, 136, 132, 82, 209, 113, + 137, 165, 221, 110, 95, 231, 241, 113, 177, 131, 221, 69, 99, 138, 185, 163, 123, 119, 181, + 106, 189, 108, 43, 206, 87, 250, 181, 44, 217, 197, 163, 98, 226, 186, 187, 19, 162, 251, + 129, 172, 34, 45, 209, 166, 233, 222, 22, 178, 211, 86, 117, 155, 131, 162, 49, 208, 75, 98, + 116, 111, 107, 30, 18, 98, 160, 215, 168, 248, 129, 113, 177, 241, 17, 105, 59, 5, 166, 35, + 188, 172, 130, 140, 95, 76, 71, 124, 255, 196, 62, 253, 19, 221, 81, 209, 3, 98, 34, 163, + 173, 50, 61, 162, 99, 251, 164, 27, 17, 24, 193, 120, 123, 9, 70, 128, 178, 197, 129, 178, + 199, 91, 11, 16, 103, 2, 5, 235, 9, 241, 31, 108, 3, 237, 203, 247, 154, 126, 107, 209, 216, + 102, 146, 46, 162, 155, 232, 62, 122, 0, 176, 139, 238, 166, 235, 211, 180, 101, 149, 142, + 121, 17, 255, 198, 110, 59, 250, 149, 190, 162, 95, 105, 205, 110, 143, 21, 100, 229, 88, + 99, 246, 38, 171, 1, 223, 85, 161, 116, 4, 44, 10, 107, 185, 121, 55, 137, 30, 56, 25, 47, + 167, 200, 54, 2, 181, 161, 124, 130, 179, 189, 68, 216, 110, 36, 252, 165, 6, 219, 47, 88, + 77, 247, 114, 40, 219, 1, 37, 152, 98, 102, 191, 48, 152, 131, 107, 35, 193, 141, 49, 144, + 137, 52, 114, 161, 76, 40, 51, 202, 2, 110, 105, 86, 148, 13, 101, 71, 254, 40, 7, 56, 68, + 185, 80, 110, 148, 7, 229, 181, 95, 6, 92, 0, 21, 68, 1, 176, 240, 2, 81, 16, 10, 70, 133, + 80, 8, 42, 140, 138, 128, 201, 40, 134, 138, 163, 18, 168, 36, 42, 5, 134, 178, 12, 108, 45, + 229, 192, 17, 168, 128, 42, 194, 86, 83, 25, 189, 129, 170, 160, 170, 176, 109, 85, 71, 161, + 168, 6, 170, 137, 106, 161, 48, 224, 184, 14, 108, 63, 214, 75, 130, 27, 160, 55, 97, 179, + 105, 132, 222, 130, 77, 166, 9, 108, 61, 205, 80, 115, 216, 132, 90, 194, 230, 216, 218, + 126, 29, 115, 59, 212, 30, 117, 0, 195, 219, 9, 189, 141, 222, 65, 157, 81, 23, 244, 46, 10, + 135, 81, 118, 133, 197, 111, 25, 138, 110, 182, 163, 16, 3, 243, 211, 11, 228, 216, 219, + 150, 78, 31, 212, 215, 222, 240, 18, 65, 38, 3, 192, 84, 13, 130, 153, 28, 130, 134, 162, + 97, 104, 56, 26, 97, 191, 218, 121, 52, 26, 3, 46, 248, 56, 52, 30, 77, 64, 19, 209, 36, 52, + 25, 37, 161, 41, 104, 42, 122, 15, 77, 179, 95, 194, 60, 19, 205, 66, 179, 209, 28, 52, 23, + 205, 195, 28, 45, 64, 11, 209, 34, 44, 208, 18, 244, 62, 90, 138, 37, 90, 134, 150, 163, 21, + 104, 37, 250, 16, 173, 2, 247, 239, 35, 172, 236, 151, 238, 174, 67, 159, 160, 13, 104, 35, + 74, 182, 94, 140, 110, 191, 12, 221, 122, 49, 250, 14, 180, 19, 237, 66, 187, 209, 30, 180, + 23, 27, 104, 63, 58, 128, 14, 162, 67, 232, 83, 116, 24, 29, 65, 71, 193, 149, 252, 28, 125, + 129, 142, 161, 227, 232, 75, 116, 194, 126, 65, 242, 105, 251, 117, 205, 231, 209, 5, 116, + 17, 93, 66, 151, 209, 21, 244, 21, 250, 26, 93, 69, 215, 208, 117, 116, 3, 221, 68, 183, 64, + 127, 110, 219, 255, 236, 252, 46, 250, 14, 221, 67, 223, 131, 86, 222, 71, 15, 208, 143, + 232, 33, 250, 9, 253, 140, 30, 217, 47, 253, 253, 13, 61, 70, 79, 208, 83, 244, 59, 250, 3, + 253, 137, 254, 66, 207, 80, 10, 122, 142, 82, 145, 7, 35, 108, 98, 141, 93, 56, 19, 206, + 140, 179, 96, 63, 156, 21, 103, 195, 217, 177, 63, 206, 129, 115, 226, 92, 56, 55, 206, 131, + 243, 226, 124, 56, 63, 46, 96, 191, 48, 216, 141, 3, 113, 16, 14, 198, 133, 112, 8, 46, 140, + 139, 224, 162, 184, 24, 46, 142, 75, 224, 146, 184, 20, 46, 141, 203, 224, 178, 184, 28, 46, + 143, 43, 224, 138, 184, 18, 174, 140, 223, 192, 85, 112, 85, 92, 13, 87, 199, 161, 184, 6, + 174, 137, 107, 225, 48, 92, 27, 215, 193, 117, 113, 61, 92, 31, 55, 192, 111, 226, 134, 184, + 17, 126, 11, 55, 198, 77, 112, 83, 220, 12, 55, 199, 45, 112, 75, 251, 5, 208, 109, 112, 91, + 251, 149, 196, 29, 112, 71, 220, 9, 191, 141, 223, 193, 157, 113, 23, 252, 46, 14, 199, 17, + 184, 43, 142, 196, 81, 56, 26, 119, 195, 221, 113, 15, 28, 131, 123, 226, 94, 56, 22, 247, + 198, 113, 206, 107, 151, 19, 112, 63, 156, 136, 251, 227, 1, 120, 32, 30, 132, 7, 227, 33, + 246, 139, 152, 135, 227, 17, 120, 36, 30, 133, 71, 227, 49, 120, 44, 30, 135, 199, 227, 9, + 120, 34, 158, 132, 39, 227, 36, 60, 5, 79, 181, 94, 79, 143, 167, 227, 25, 206, 43, 230, + 231, 224, 185, 120, 30, 158, 143, 23, 224, 133, 120, 17, 94, 140, 151, 224, 247, 241, 82, + 252, 1, 94, 134, 151, 227, 21, 120, 37, 254, 16, 175, 194, 171, 241, 71, 248, 99, 188, 6, + 175, 197, 235, 236, 215, 85, 111, 192, 27, 97, 13, 110, 194, 155, 241, 22, 188, 21, 111, + 195, 219, 241, 14, 188, 19, 239, 194, 187, 241, 30, 188, 23, 239, 195, 251, 241, 1, 251, + 117, 202, 159, 226, 195, 248, 8, 62, 138, 63, 195, 159, 227, 47, 240, 49, 124, 28, 127, 137, + 79, 224, 147, 248, 20, 62, 141, 207, 224, 179, 248, 156, 245, 186, 112, 124, 17, 95, 194, + 151, 241, 21, 252, 21, 254, 26, 95, 197, 215, 240, 117, 124, 3, 223, 196, 183, 240, 55, 248, + 54, 254, 22, 223, 193, 119, 241, 119, 248, 30, 254, 30, 255, 128, 239, 227, 7, 248, 71, 252, + 16, 255, 132, 127, 198, 143, 240, 47, 248, 87, 252, 27, 126, 140, 159, 224, 167, 248, 119, + 252, 7, 254, 19, 255, 133, 159, 225, 20, 252, 28, 167, 98, 15, 65, 4, 19, 66, 40, 97, 132, + 19, 65, 36, 81, 196, 32, 38, 209, 196, 69, 50, 145, 204, 36, 11, 241, 35, 89, 73, 54, 146, + 157, 248, 147, 28, 36, 39, 201, 133, 62, 32, 185, 73, 30, 146, 151, 228, 35, 249, 73, 1, 82, + 144, 4, 16, 55, 9, 36, 65, 36, 152, 20, 34, 33, 164, 48, 154, 79, 138, 144, 162, 164, 24, + 41, 110, 189, 252, 155, 148, 34, 165, 73, 25, 82, 150, 148, 35, 229, 73, 5, 82, 145, 84, 34, + 149, 201, 27, 164, 10, 169, 74, 170, 145, 234, 36, 148, 212, 32, 53, 73, 45, 18, 70, 106, + 147, 58, 164, 46, 169, 71, 234, 147, 6, 228, 77, 210, 144, 52, 34, 111, 145, 198, 164, 9, + 105, 74, 154, 145, 230, 164, 5, 105, 73, 90, 145, 214, 214, 203, 206, 73, 59, 210, 158, 116, + 32, 29, 73, 39, 242, 54, 121, 135, 116, 38, 93, 200, 187, 36, 156, 68, 144, 174, 36, 146, + 68, 145, 104, 210, 141, 116, 39, 61, 72, 12, 233, 73, 122, 145, 88, 210, 155, 196, 145, 120, + 210, 135, 244, 37, 9, 164, 31, 73, 36, 253, 201, 0, 50, 144, 12, 34, 131, 201, 16, 50, 148, + 12, 35, 195, 201, 8, 50, 146, 140, 34, 163, 201, 24, 50, 150, 140, 35, 227, 201, 4, 50, 145, + 76, 34, 147, 73, 18, 153, 66, 166, 146, 247, 200, 52, 50, 157, 204, 32, 51, 201, 44, 50, + 155, 204, 65, 139, 201, 92, 50, 143, 204, 39, 11, 200, 66, 178, 136, 44, 38, 75, 200, 251, + 100, 41, 249, 128, 44, 35, 203, 201, 10, 178, 146, 124, 72, 86, 145, 213, 228, 35, 242, 49, + 89, 67, 214, 146, 117, 100, 61, 249, 132, 108, 32, 27, 73, 50, 217, 68, 54, 147, 45, 100, + 43, 217, 70, 182, 147, 29, 100, 39, 217, 69, 118, 147, 61, 100, 47, 217, 71, 246, 147, 3, + 228, 32, 57, 68, 62, 37, 135, 201, 17, 114, 148, 124, 70, 62, 39, 95, 144, 99, 228, 56, 249, + 146, 156, 32, 39, 201, 41, 114, 154, 156, 33, 103, 201, 57, 114, 158, 92, 32, 23, 201, 37, + 114, 153, 92, 33, 95, 145, 175, 201, 85, 114, 141, 92, 39, 55, 200, 77, 114, 139, 124, 67, + 110, 147, 111, 201, 29, 114, 151, 124, 71, 238, 145, 239, 201, 15, 228, 62, 121, 64, 126, + 36, 15, 201, 79, 228, 103, 242, 136, 252, 66, 126, 37, 191, 145, 199, 228, 9, 121, 74, 126, + 39, 127, 144, 63, 201, 95, 228, 25, 73, 33, 207, 73, 42, 241, 80, 68, 49, 37, 148, 82, 70, + 57, 21, 84, 82, 69, 13, 106, 82, 77, 93, 52, 19, 205, 76, 179, 80, 63, 154, 149, 102, 163, + 217, 169, 63, 205, 65, 115, 210, 92, 52, 55, 205, 67, 243, 210, 124, 52, 63, 45, 64, 11, + 210, 0, 234, 166, 129, 52, 136, 6, 211, 66, 52, 132, 22, 166, 69, 104, 81, 90, 140, 22, 167, + 37, 104, 73, 90, 138, 150, 166, 101, 104, 89, 90, 206, 126, 13, 120, 69, 90, 137, 86, 166, + 111, 208, 42, 180, 42, 173, 70, 171, 211, 80, 90, 131, 214, 164, 181, 104, 24, 173, 77, 235, + 208, 186, 180, 30, 173, 79, 27, 208, 55, 105, 67, 218, 136, 190, 69, 27, 211, 38, 180, 41, + 109, 70, 155, 211, 22, 180, 37, 109, 69, 91, 211, 54, 180, 45, 109, 71, 219, 211, 14, 180, + 35, 237, 68, 223, 166, 239, 208, 206, 180, 11, 125, 151, 134, 211, 8, 218, 149, 70, 210, 40, + 26, 77, 187, 209, 238, 180, 7, 141, 161, 61, 105, 47, 26, 75, 123, 211, 56, 26, 79, 251, + 208, 190, 52, 129, 246, 163, 137, 180, 63, 29, 64, 7, 210, 65, 116, 48, 29, 66, 135, 210, + 97, 116, 56, 29, 65, 71, 210, 81, 116, 52, 29, 67, 199, 210, 113, 116, 60, 157, 96, 191, + 166, 124, 50, 77, 162, 83, 232, 84, 250, 30, 157, 70, 167, 211, 25, 116, 38, 157, 69, 103, + 211, 57, 116, 46, 157, 71, 231, 211, 5, 116, 33, 236, 230, 139, 233, 18, 250, 62, 93, 74, + 63, 160, 203, 232, 114, 186, 130, 174, 164, 31, 210, 85, 116, 53, 253, 136, 126, 76, 215, + 208, 181, 116, 29, 93, 79, 63, 161, 27, 232, 70, 154, 12, 59, 255, 102, 186, 133, 110, 165, + 219, 232, 118, 186, 131, 238, 180, 61, 128, 61, 116, 47, 248, 2, 251, 193, 35, 56, 72, 15, + 209, 79, 233, 97, 122, 132, 30, 165, 159, 209, 207, 233, 23, 244, 24, 61, 78, 191, 164, 39, + 232, 73, 122, 138, 158, 166, 103, 232, 89, 122, 142, 158, 167, 23, 232, 69, 122, 137, 94, + 166, 87, 232, 87, 244, 107, 122, 149, 94, 163, 215, 233, 13, 122, 147, 222, 162, 223, 208, + 219, 244, 91, 122, 135, 222, 165, 223, 209, 123, 244, 123, 250, 3, 189, 79, 31, 208, 31, + 233, 67, 250, 19, 253, 153, 62, 162, 191, 208, 95, 233, 111, 244, 49, 125, 66, 159, 210, + 223, 233, 31, 244, 79, 250, 23, 125, 70, 83, 232, 115, 154, 74, 61, 12, 49, 204, 8, 163, + 140, 49, 206, 4, 147, 76, 49, 131, 153, 76, 51, 23, 203, 196, 50, 179, 44, 204, 143, 101, + 101, 217, 88, 118, 230, 207, 114, 176, 156, 44, 23, 203, 205, 242, 176, 188, 44, 31, 203, + 207, 10, 128, 23, 18, 192, 220, 44, 144, 5, 177, 96, 86, 136, 133, 176, 194, 172, 8, 43, + 202, 138, 177, 226, 172, 4, 43, 201, 74, 177, 210, 172, 12, 43, 11, 158, 74, 121, 86, 129, + 85, 100, 149, 88, 101, 246, 6, 171, 194, 170, 178, 106, 172, 58, 11, 5, 223, 165, 38, 171, + 197, 194, 88, 109, 86, 135, 213, 101, 245, 88, 125, 214, 0, 60, 154, 134, 172, 17, 123, 11, + 188, 154, 38, 172, 41, 107, 198, 154, 179, 22, 172, 37, 107, 197, 90, 179, 54, 172, 45, 107, + 199, 218, 179, 14, 172, 35, 235, 196, 222, 102, 239, 176, 206, 172, 11, 123, 151, 133, 179, + 8, 214, 149, 69, 178, 40, 22, 205, 186, 177, 238, 172, 7, 139, 97, 61, 89, 47, 22, 203, 122, + 179, 56, 180, 143, 197, 179, 62, 172, 47, 75, 96, 253, 88, 34, 235, 207, 6, 176, 129, 108, + 16, 27, 204, 134, 176, 161, 108, 24, 27, 206, 70, 176, 145, 108, 20, 27, 205, 198, 176, 177, + 108, 28, 27, 207, 38, 176, 137, 108, 18, 155, 204, 146, 216, 20, 54, 149, 189, 199, 166, + 177, 233, 108, 6, 155, 201, 102, 177, 217, 108, 14, 155, 203, 230, 177, 249, 108, 1, 91, + 200, 22, 177, 197, 108, 9, 123, 159, 45, 101, 31, 176, 101, 108, 57, 91, 193, 86, 178, 15, + 217, 42, 182, 154, 125, 196, 62, 102, 107, 216, 90, 182, 142, 173, 103, 159, 176, 13, 108, + 35, 75, 102, 155, 216, 102, 182, 133, 109, 101, 219, 216, 118, 182, 131, 237, 100, 187, 216, + 110, 182, 135, 237, 101, 251, 216, 126, 118, 128, 29, 100, 135, 216, 167, 236, 48, 59, 194, + 142, 178, 207, 216, 231, 236, 11, 118, 140, 29, 103, 95, 178, 19, 236, 36, 59, 197, 78, 179, + 51, 236, 44, 59, 199, 206, 179, 11, 236, 34, 187, 196, 46, 179, 43, 236, 43, 246, 53, 187, + 202, 174, 177, 235, 236, 6, 187, 201, 110, 177, 111, 216, 109, 246, 45, 187, 195, 238, 178, + 239, 216, 61, 246, 61, 251, 129, 221, 103, 15, 216, 143, 236, 33, 251, 137, 253, 204, 30, + 177, 95, 216, 175, 236, 55, 246, 152, 61, 97, 79, 217, 239, 236, 15, 246, 39, 251, 139, 61, + 99, 41, 236, 57, 75, 101, 30, 142, 56, 230, 132, 83, 206, 56, 231, 130, 75, 174, 184, 193, + 77, 174, 185, 139, 103, 226, 153, 121, 22, 238, 199, 179, 242, 108, 60, 59, 247, 231, 57, + 120, 78, 158, 139, 231, 230, 121, 120, 94, 158, 143, 231, 231, 5, 120, 65, 30, 192, 221, 60, + 144, 7, 241, 96, 94, 136, 135, 240, 194, 188, 8, 47, 202, 139, 241, 226, 188, 4, 47, 201, + 75, 241, 210, 188, 12, 47, 203, 203, 241, 242, 188, 2, 175, 200, 43, 241, 202, 252, 13, 94, + 133, 87, 229, 213, 120, 117, 30, 202, 107, 240, 154, 188, 22, 15, 227, 181, 121, 29, 94, + 151, 215, 227, 245, 121, 3, 254, 38, 111, 200, 27, 241, 183, 120, 99, 222, 132, 55, 229, + 205, 120, 115, 222, 130, 183, 228, 173, 120, 107, 222, 134, 183, 229, 237, 120, 123, 222, + 129, 119, 228, 157, 248, 219, 252, 29, 222, 153, 119, 225, 239, 242, 112, 30, 193, 187, 242, + 72, 30, 197, 163, 121, 55, 222, 157, 247, 224, 49, 188, 39, 239, 197, 99, 121, 111, 30, 199, + 227, 121, 31, 222, 151, 39, 240, 126, 60, 145, 247, 231, 3, 248, 64, 62, 136, 15, 230, 67, + 248, 80, 62, 140, 15, 231, 35, 248, 72, 62, 138, 143, 230, 99, 248, 88, 62, 142, 143, 231, + 19, 248, 68, 62, 137, 79, 230, 73, 124, 10, 159, 202, 223, 227, 211, 248, 116, 62, 131, 207, + 228, 179, 248, 108, 62, 135, 207, 229, 243, 248, 124, 190, 128, 47, 228, 139, 248, 98, 190, + 132, 191, 207, 151, 242, 15, 248, 50, 190, 156, 175, 224, 43, 249, 135, 124, 21, 95, 205, + 63, 226, 31, 243, 53, 124, 45, 95, 199, 215, 243, 79, 248, 6, 190, 145, 39, 243, 77, 124, + 51, 223, 194, 183, 242, 109, 124, 59, 223, 193, 119, 242, 93, 124, 55, 223, 195, 247, 242, + 125, 124, 63, 63, 192, 15, 242, 67, 252, 83, 126, 152, 31, 225, 71, 249, 103, 252, 115, 254, + 5, 63, 198, 143, 243, 47, 249, 9, 126, 146, 159, 226, 167, 249, 25, 126, 150, 159, 227, 231, + 249, 5, 126, 145, 95, 226, 151, 249, 21, 254, 21, 255, 154, 95, 229, 215, 248, 117, 126, + 131, 223, 228, 183, 248, 55, 252, 54, 255, 150, 223, 225, 119, 249, 119, 252, 30, 255, 158, + 255, 192, 239, 243, 7, 252, 71, 254, 144, 255, 196, 127, 230, 143, 248, 47, 252, 87, 254, + 27, 127, 204, 159, 240, 167, 252, 119, 254, 7, 255, 147, 255, 197, 159, 241, 20, 254, 156, + 167, 114, 143, 64, 2, 11, 34, 168, 96, 130, 11, 33, 164, 80, 194, 16, 166, 208, 194, 37, 50, + 137, 204, 34, 139, 240, 19, 89, 69, 54, 145, 93, 248, 139, 28, 34, 167, 200, 37, 114, 139, + 60, 34, 175, 200, 39, 242, 139, 2, 162, 160, 8, 16, 110, 17, 40, 130, 68, 176, 40, 36, 66, + 68, 97, 81, 68, 20, 21, 197, 68, 113, 81, 66, 148, 20, 165, 68, 105, 81, 70, 148, 21, 229, + 68, 121, 81, 65, 84, 20, 149, 68, 101, 241, 134, 168, 34, 170, 138, 106, 162, 186, 8, 21, + 53, 68, 77, 81, 75, 132, 137, 218, 162, 142, 168, 43, 234, 137, 250, 162, 129, 120, 83, 52, + 20, 141, 196, 91, 162, 177, 104, 34, 154, 138, 102, 162, 185, 104, 33, 90, 138, 86, 162, + 181, 104, 35, 218, 138, 118, 162, 189, 232, 32, 58, 138, 78, 226, 109, 241, 142, 232, 44, + 186, 136, 119, 69, 184, 136, 16, 93, 69, 164, 136, 18, 209, 162, 155, 232, 46, 122, 136, 24, + 209, 83, 244, 18, 177, 162, 183, 136, 19, 241, 162, 143, 232, 43, 18, 68, 63, 145, 40, 250, + 139, 1, 98, 160, 24, 36, 6, 139, 33, 98, 168, 24, 38, 134, 139, 17, 98, 164, 24, 37, 70, + 139, 49, 98, 172, 24, 39, 198, 139, 9, 98, 162, 152, 36, 38, 139, 36, 49, 69, 76, 21, 239, + 137, 105, 98, 186, 152, 33, 102, 138, 89, 98, 182, 152, 35, 230, 138, 121, 98, 190, 88, 32, + 22, 138, 69, 98, 177, 88, 34, 222, 23, 75, 197, 7, 98, 153, 88, 46, 86, 136, 149, 226, 67, + 177, 74, 172, 22, 31, 137, 143, 197, 26, 177, 86, 172, 19, 235, 197, 39, 98, 131, 216, 40, + 146, 197, 38, 177, 89, 108, 17, 91, 197, 54, 177, 93, 236, 16, 59, 197, 46, 177, 91, 236, + 17, 123, 197, 62, 177, 95, 28, 16, 7, 197, 33, 241, 169, 56, 44, 142, 136, 163, 226, 51, + 241, 185, 248, 66, 28, 19, 199, 197, 151, 226, 132, 56, 41, 78, 137, 211, 226, 140, 56, 43, + 206, 137, 243, 226, 130, 184, 40, 46, 137, 203, 226, 138, 248, 74, 124, 45, 174, 138, 107, + 226, 186, 184, 33, 110, 138, 91, 226, 27, 113, 91, 124, 43, 238, 136, 187, 226, 59, 113, 79, + 124, 47, 126, 16, 247, 197, 3, 241, 163, 120, 40, 126, 18, 63, 139, 71, 226, 23, 241, 171, + 248, 77, 60, 22, 79, 196, 83, 241, 187, 248, 67, 252, 41, 254, 18, 207, 68, 138, 120, 46, + 82, 133, 71, 34, 137, 37, 145, 84, 50, 201, 165, 144, 82, 42, 105, 72, 83, 106, 233, 146, + 153, 100, 102, 153, 69, 250, 201, 172, 50, 155, 204, 46, 253, 101, 14, 153, 83, 230, 146, + 185, 101, 30, 153, 87, 230, 147, 249, 101, 1, 89, 80, 6, 72, 183, 12, 148, 65, 50, 88, 22, + 146, 33, 178, 176, 44, 34, 139, 202, 98, 178, 184, 44, 33, 75, 202, 82, 178, 180, 44, 35, + 203, 202, 114, 178, 188, 172, 32, 43, 202, 74, 178, 178, 124, 67, 86, 145, 85, 101, 53, 89, + 93, 134, 202, 26, 178, 166, 172, 37, 195, 100, 109, 89, 71, 214, 149, 245, 100, 125, 217, + 64, 190, 41, 27, 202, 70, 242, 45, 217, 88, 54, 145, 77, 101, 51, 217, 92, 182, 144, 45, + 101, 43, 217, 90, 182, 145, 109, 101, 59, 217, 94, 118, 144, 29, 101, 39, 249, 182, 124, 71, + 118, 150, 93, 228, 187, 50, 92, 70, 200, 174, 50, 82, 70, 201, 104, 217, 77, 118, 151, 61, + 100, 140, 236, 41, 123, 201, 88, 217, 91, 198, 201, 120, 217, 71, 246, 149, 9, 178, 159, 76, + 148, 253, 229, 0, 57, 80, 14, 146, 131, 229, 16, 57, 84, 14, 147, 195, 229, 8, 57, 82, 142, + 146, 163, 229, 24, 57, 86, 142, 147, 227, 229, 4, 57, 81, 78, 146, 147, 101, 146, 156, 34, + 167, 202, 247, 228, 52, 57, 93, 206, 144, 51, 229, 44, 57, 91, 206, 145, 115, 229, 60, 57, + 95, 46, 144, 11, 229, 34, 185, 88, 46, 145, 239, 203, 165, 242, 3, 185, 76, 46, 151, 43, + 228, 74, 249, 161, 92, 37, 87, 203, 143, 228, 199, 114, 141, 92, 43, 215, 201, 245, 242, 19, + 185, 65, 110, 148, 201, 114, 147, 220, 44, 183, 200, 173, 114, 155, 220, 46, 119, 200, 157, + 114, 151, 220, 45, 247, 200, 189, 114, 159, 220, 47, 15, 200, 131, 242, 144, 252, 84, 30, + 150, 71, 228, 81, 249, 153, 252, 92, 126, 33, 143, 201, 227, 242, 75, 121, 66, 158, 148, + 167, 228, 105, 121, 70, 158, 149, 231, 228, 121, 121, 65, 94, 148, 151, 228, 101, 121, 69, + 126, 37, 191, 150, 87, 229, 53, 121, 93, 222, 144, 55, 229, 45, 249, 141, 188, 45, 191, 149, + 119, 228, 93, 249, 157, 188, 39, 191, 151, 63, 200, 251, 242, 129, 252, 81, 62, 148, 63, + 201, 159, 229, 35, 249, 139, 252, 85, 254, 38, 31, 203, 39, 242, 169, 252, 93, 254, 33, 255, + 148, 127, 201, 103, 50, 69, 62, 151, 169, 210, 163, 144, 194, 138, 40, 170, 152, 226, 74, + 40, 169, 148, 50, 148, 169, 180, 114, 169, 76, 42, 179, 202, 162, 252, 84, 86, 149, 77, 101, + 87, 254, 42, 135, 202, 169, 114, 169, 220, 42, 143, 202, 171, 242, 169, 252, 170, 128, 42, + 168, 2, 148, 91, 5, 170, 32, 21, 172, 10, 169, 16, 85, 88, 21, 81, 69, 85, 49, 85, 92, 149, + 80, 37, 85, 41, 85, 90, 149, 81, 101, 85, 57, 85, 94, 85, 80, 21, 85, 37, 85, 89, 189, 161, + 170, 168, 170, 170, 154, 170, 174, 66, 85, 13, 85, 83, 213, 82, 97, 170, 182, 170, 163, 234, + 170, 122, 170, 190, 106, 160, 222, 84, 13, 85, 35, 245, 150, 106, 172, 154, 168, 166, 170, + 153, 106, 174, 90, 168, 150, 170, 149, 106, 173, 218, 168, 182, 170, 157, 106, 175, 58, 168, + 142, 170, 147, 122, 91, 189, 163, 58, 171, 46, 234, 93, 21, 174, 34, 84, 87, 21, 169, 162, + 84, 180, 234, 166, 186, 171, 30, 42, 70, 245, 84, 189, 84, 172, 234, 173, 226, 84, 188, 234, + 163, 250, 170, 4, 213, 79, 37, 170, 254, 106, 128, 26, 168, 6, 169, 193, 106, 136, 26, 170, + 134, 169, 225, 106, 132, 26, 169, 70, 169, 209, 106, 140, 26, 171, 198, 169, 241, 106, 130, + 154, 168, 38, 169, 201, 42, 73, 77, 81, 83, 213, 123, 106, 154, 154, 174, 102, 168, 153, + 106, 150, 154, 173, 230, 168, 185, 106, 158, 154, 175, 22, 168, 133, 106, 145, 90, 172, 150, + 168, 247, 213, 82, 245, 129, 90, 166, 150, 171, 21, 106, 165, 250, 80, 173, 82, 171, 213, + 71, 234, 99, 181, 70, 173, 85, 235, 212, 122, 245, 137, 218, 160, 54, 170, 100, 181, 73, + 109, 86, 91, 212, 86, 181, 77, 109, 87, 59, 212, 78, 181, 75, 237, 86, 123, 212, 94, 181, + 79, 237, 87, 7, 212, 65, 117, 72, 125, 170, 14, 171, 35, 234, 168, 250, 76, 125, 174, 190, + 80, 199, 212, 113, 245, 165, 58, 161, 78, 170, 83, 234, 180, 58, 163, 206, 170, 115, 234, + 188, 186, 160, 46, 170, 75, 234, 178, 186, 162, 190, 82, 95, 171, 171, 234, 154, 186, 174, + 110, 168, 155, 234, 150, 250, 70, 221, 86, 223, 170, 59, 234, 174, 250, 78, 221, 83, 223, + 171, 31, 212, 125, 245, 64, 253, 168, 30, 170, 159, 212, 207, 234, 145, 250, 69, 253, 170, + 126, 83, 143, 213, 19, 245, 84, 253, 174, 254, 80, 127, 170, 191, 212, 51, 149, 162, 158, + 171, 84, 229, 49, 144, 129, 13, 98, 80, 131, 25, 220, 16, 134, 52, 148, 97, 24, 166, 161, + 13, 151, 145, 201, 200, 108, 100, 49, 252, 140, 172, 70, 54, 35, 187, 225, 111, 228, 48, + 114, 26, 185, 140, 220, 70, 30, 35, 175, 145, 207, 200, 111, 20, 48, 10, 26, 1, 134, 219, 8, + 52, 130, 140, 96, 163, 144, 17, 98, 20, 54, 138, 24, 69, 141, 98, 70, 113, 163, 132, 81, + 210, 40, 101, 148, 54, 202, 24, 101, 141, 114, 70, 121, 163, 130, 81, 209, 168, 100, 84, 54, + 222, 48, 170, 24, 85, 141, 106, 70, 117, 35, 212, 168, 97, 212, 52, 106, 25, 97, 70, 109, + 163, 142, 81, 215, 168, 103, 212, 55, 26, 24, 111, 26, 13, 141, 70, 198, 91, 70, 99, 163, + 137, 209, 212, 104, 102, 52, 55, 90, 24, 45, 141, 86, 70, 107, 163, 141, 209, 214, 104, 103, + 180, 55, 58, 24, 29, 141, 78, 198, 219, 198, 59, 70, 103, 163, 139, 241, 174, 17, 110, 68, + 24, 93, 141, 72, 35, 202, 136, 54, 186, 25, 221, 141, 30, 70, 140, 209, 211, 232, 101, 196, + 26, 189, 141, 56, 35, 222, 232, 99, 244, 53, 18, 140, 126, 70, 162, 209, 223, 24, 96, 12, + 52, 6, 25, 131, 141, 33, 198, 80, 99, 152, 49, 220, 24, 97, 140, 52, 70, 25, 163, 141, 49, + 198, 88, 99, 156, 49, 222, 152, 96, 76, 52, 38, 25, 147, 141, 36, 99, 138, 49, 213, 120, + 207, 152, 102, 76, 55, 102, 24, 51, 141, 89, 198, 108, 99, 142, 49, 215, 152, 103, 204, 55, + 22, 24, 11, 141, 69, 198, 98, 99, 137, 241, 190, 177, 212, 248, 192, 88, 102, 44, 55, 86, + 24, 43, 141, 15, 141, 85, 198, 106, 227, 35, 227, 99, 99, 141, 177, 214, 88, 103, 172, 55, + 62, 49, 54, 24, 27, 141, 100, 99, 147, 177, 217, 216, 98, 108, 53, 182, 25, 219, 141, 29, + 198, 78, 99, 151, 177, 219, 216, 99, 236, 53, 246, 25, 251, 141, 3, 198, 65, 227, 144, 241, + 169, 113, 216, 56, 98, 28, 53, 62, 51, 62, 55, 190, 48, 142, 25, 199, 141, 47, 141, 19, 198, + 73, 227, 148, 113, 218, 56, 99, 156, 53, 206, 25, 231, 141, 11, 198, 69, 227, 146, 113, 217, + 184, 98, 124, 101, 124, 109, 92, 53, 174, 25, 215, 141, 27, 198, 77, 227, 150, 241, 141, + 113, 219, 248, 214, 184, 99, 220, 53, 190, 51, 238, 25, 223, 27, 63, 24, 247, 141, 7, 198, + 143, 198, 67, 227, 39, 227, 103, 227, 145, 241, 139, 241, 171, 241, 155, 241, 216, 120, 98, + 60, 53, 126, 55, 254, 48, 254, 52, 254, 50, 158, 25, 41, 198, 115, 35, 213, 240, 152, 200, + 196, 38, 49, 169, 201, 76, 110, 10, 83, 154, 202, 52, 76, 211, 212, 166, 203, 204, 100, 102, + 54, 179, 152, 126, 102, 86, 51, 155, 153, 221, 244, 55, 115, 152, 57, 205, 92, 102, 110, 51, + 143, 153, 215, 204, 103, 230, 55, 11, 152, 5, 205, 0, 211, 109, 6, 154, 65, 102, 176, 89, + 200, 12, 49, 11, 155, 69, 204, 162, 102, 49, 179, 184, 89, 194, 44, 105, 150, 50, 75, 155, + 101, 204, 178, 102, 57, 179, 188, 89, 193, 172, 104, 86, 50, 43, 155, 111, 152, 85, 204, + 170, 102, 53, 179, 186, 25, 106, 214, 48, 107, 154, 181, 204, 48, 179, 182, 89, 199, 172, + 107, 214, 51, 235, 155, 13, 204, 55, 205, 134, 102, 35, 243, 45, 179, 177, 217, 196, 108, + 106, 54, 51, 155, 155, 45, 204, 150, 102, 43, 179, 181, 217, 198, 108, 107, 182, 51, 219, + 155, 29, 204, 142, 102, 39, 243, 109, 243, 29, 179, 179, 217, 197, 124, 215, 12, 55, 35, + 204, 174, 102, 164, 25, 101, 70, 155, 221, 204, 238, 102, 15, 51, 198, 236, 105, 246, 50, + 99, 205, 222, 102, 156, 25, 111, 246, 49, 251, 154, 9, 102, 63, 51, 209, 236, 111, 14, 48, + 7, 154, 131, 204, 193, 230, 16, 115, 168, 57, 204, 28, 110, 142, 48, 71, 154, 163, 204, 209, + 230, 24, 115, 172, 57, 206, 28, 111, 78, 48, 39, 154, 147, 204, 201, 102, 146, 57, 197, 156, + 106, 190, 103, 78, 51, 167, 155, 51, 204, 153, 230, 44, 115, 182, 57, 199, 156, 107, 206, + 51, 231, 155, 11, 204, 133, 230, 34, 115, 177, 185, 196, 124, 223, 92, 106, 126, 96, 46, 51, + 151, 155, 43, 204, 149, 230, 135, 230, 42, 115, 181, 249, 145, 249, 177, 185, 198, 92, 107, + 174, 51, 215, 155, 159, 152, 27, 204, 141, 102, 178, 185, 201, 220, 108, 110, 49, 183, 154, + 219, 204, 237, 230, 14, 115, 167, 185, 203, 220, 109, 238, 49, 247, 154, 251, 204, 253, 230, + 1, 243, 160, 121, 200, 252, 212, 60, 108, 30, 49, 143, 154, 159, 153, 159, 155, 95, 152, + 199, 204, 227, 230, 151, 230, 9, 243, 164, 121, 202, 60, 109, 158, 49, 207, 154, 231, 204, + 243, 230, 5, 243, 162, 121, 201, 188, 108, 94, 49, 191, 50, 191, 54, 175, 154, 215, 204, + 235, 230, 13, 243, 166, 121, 203, 252, 198, 188, 109, 126, 107, 222, 49, 239, 154, 223, 153, + 247, 204, 239, 205, 31, 204, 251, 230, 3, 243, 71, 243, 161, 249, 147, 249, 179, 249, 200, + 252, 197, 252, 213, 252, 205, 124, 108, 62, 49, 159, 154, 191, 155, 127, 152, 127, 154, 127, + 153, 207, 204, 20, 243, 185, 153, 106, 122, 52, 210, 88, 19, 77, 53, 211, 92, 11, 45, 181, + 210, 134, 54, 181, 214, 46, 157, 73, 103, 214, 89, 180, 159, 206, 170, 179, 233, 236, 218, + 95, 231, 208, 57, 117, 46, 157, 91, 231, 209, 121, 117, 62, 157, 95, 23, 208, 5, 117, 128, + 118, 235, 64, 29, 164, 131, 117, 33, 29, 162, 11, 235, 34, 186, 168, 46, 166, 139, 235, 18, + 186, 164, 46, 165, 75, 235, 50, 186, 172, 46, 167, 203, 235, 10, 186, 162, 174, 164, 43, + 235, 55, 116, 21, 93, 85, 87, 211, 213, 117, 168, 174, 161, 107, 234, 90, 58, 76, 215, 214, + 117, 116, 93, 93, 79, 215, 215, 13, 244, 155, 186, 161, 110, 164, 223, 210, 141, 117, 19, + 221, 84, 55, 211, 205, 117, 11, 221, 82, 183, 210, 173, 117, 27, 221, 86, 183, 211, 237, + 117, 7, 221, 81, 119, 210, 111, 235, 119, 116, 103, 221, 69, 191, 171, 195, 117, 132, 238, + 170, 35, 117, 148, 142, 214, 221, 116, 119, 221, 67, 199, 232, 158, 186, 151, 142, 213, 189, + 117, 156, 142, 215, 125, 116, 95, 157, 160, 251, 233, 68, 221, 95, 15, 208, 3, 245, 32, 61, + 88, 15, 209, 67, 245, 48, 61, 92, 143, 208, 35, 245, 40, 61, 90, 143, 209, 99, 245, 56, 61, + 94, 79, 208, 19, 245, 36, 61, 89, 39, 233, 41, 122, 170, 126, 79, 79, 211, 211, 245, 12, 61, + 83, 207, 210, 179, 245, 28, 61, 87, 207, 211, 243, 245, 2, 189, 80, 47, 210, 139, 245, 18, + 253, 190, 94, 170, 63, 208, 203, 244, 114, 189, 66, 175, 212, 31, 234, 85, 122, 181, 254, + 72, 127, 172, 215, 232, 181, 122, 157, 94, 175, 63, 209, 27, 244, 70, 157, 172, 55, 233, + 205, 122, 139, 222, 170, 183, 233, 237, 122, 135, 222, 169, 119, 233, 221, 122, 143, 222, + 171, 247, 233, 253, 250, 128, 62, 168, 15, 233, 79, 245, 97, 125, 68, 31, 213, 159, 233, + 207, 245, 23, 250, 152, 62, 174, 191, 212, 39, 244, 73, 125, 74, 159, 214, 103, 244, 89, + 125, 78, 159, 215, 23, 244, 69, 125, 73, 95, 214, 87, 244, 87, 250, 107, 125, 85, 95, 211, + 215, 245, 13, 125, 83, 223, 210, 223, 232, 219, 250, 91, 125, 71, 223, 213, 223, 233, 123, + 250, 123, 253, 131, 190, 175, 31, 232, 31, 245, 67, 253, 147, 254, 89, 63, 210, 191, 232, + 95, 245, 111, 250, 177, 126, 162, 159, 234, 223, 245, 31, 250, 79, 253, 151, 126, 166, 83, + 244, 115, 157, 170, 61, 46, 228, 194, 46, 226, 162, 46, 230, 226, 46, 225, 146, 46, 229, 50, + 92, 166, 75, 187, 92, 174, 76, 174, 204, 174, 44, 46, 63, 87, 86, 87, 54, 87, 118, 151, 191, + 43, 135, 43, 167, 43, 151, 43, 183, 43, 143, 43, 175, 43, 159, 43, 191, 171, 128, 171, 160, + 43, 192, 229, 118, 5, 186, 130, 92, 193, 174, 66, 174, 16, 87, 97, 87, 17, 87, 81, 87, 49, + 87, 113, 87, 9, 87, 73, 87, 41, 87, 105, 87, 25, 87, 89, 87, 57, 87, 121, 87, 5, 87, 69, 87, + 37, 87, 101, 215, 27, 174, 42, 174, 170, 174, 106, 174, 234, 174, 80, 87, 13, 87, 77, 87, + 45, 87, 152, 171, 182, 171, 142, 171, 174, 171, 158, 171, 190, 171, 129, 235, 77, 87, 67, + 87, 35, 215, 91, 174, 198, 174, 38, 174, 166, 174, 102, 174, 230, 174, 22, 174, 150, 174, + 86, 174, 214, 174, 54, 8, 137, 238, 177, 131, 251, 244, 40, 203, 75, 199, 245, 143, 141, + 245, 139, 139, 143, 179, 30, 197, 197, 196, 117, 79, 136, 78, 236, 159, 16, 71, 123, 247, + 47, 71, 251, 196, 148, 163, 205, 123, 244, 150, 253, 227, 98, 202, 151, 47, 91, 153, 213, + 239, 159, 16, 47, 163, 122, 71, 68, 38, 196, 195, 102, 96, 61, 81, 139, 140, 79, 136, 22, + 189, 99, 162, 162, 226, 19, 69, 237, 174, 9, 209, 3, 162, 69, 132, 77, 100, 237, 248, 238, + 241, 113, 209, 189, 100, 132, 151, 138, 122, 145, 17, 80, 75, 68, 121, 73, 189, 126, 177, + 17, 253, 122, 200, 250, 78, 161, 104, 167, 80, 125, 111, 110, 180, 151, 52, 137, 136, 236, + 159, 24, 45, 98, 189, 164, 137, 55, 49, 214, 38, 172, 9, 244, 200, 98, 173, 110, 155, 121, + 179, 227, 188, 164, 153, 183, 84, 156, 77, 140, 230, 81, 93, 189, 181, 141, 120, 95, 72, + 180, 242, 146, 4, 39, 230, 45, 159, 224, 37, 173, 189, 137, 253, 108, 162, 218, 68, 70, 71, + 197, 196, 198, 254, 127, 141, 157, 77, 144, 28, 199, 149, 223, 123, 166, 231, 123, 48, 4, + 72, 49, 180, 92, 201, 34, 0, 66, 90, 146, 2, 105, 118, 101, 102, 125, 45, 33, 1, 221, 157, + 157, 16, 136, 93, 129, 43, 18, 34, 32, 33, 68, 54, 48, 141, 153, 22, 7, 211, 131, 233, 30, + 80, 228, 97, 41, 219, 177, 17, 235, 160, 184, 148, 15, 118, 132, 131, 140, 144, 142, 27, 14, + 51, 8, 130, 138, 53, 200, 181, 77, 29, 237, 147, 124, 210, 197, 7, 233, 96, 159, 117, 243, + 193, 23, 58, 171, 234, 151, 175, 10, 16, 194, 177, 24, 86, 189, 215, 89, 89, 239, 255, 242, + 101, 229, 251, 200, 234, 25, 14, 87, 102, 48, 75, 47, 87, 221, 102, 37, 89, 188, 184, 239, + 205, 181, 120, 80, 156, 87, 47, 10, 210, 129, 32, 253, 160, 34, 111, 149, 100, 225, 7, 133, + 198, 111, 249, 211, 226, 217, 225, 141, 27, 195, 197, 151, 183, 71, 179, 97, 251, 197, 237, + 241, 226, 112, 103, 111, 123, 184, 184, 57, 218, 153, 13, 151, 71, 123, 211, 241, 142, 151, + 61, 29, 111, 221, 24, 182, 103, 195, 131, 246, 222, 246, 120, 227, 96, 119, 19, 99, 123, + 225, 171, 163, 159, 92, 219, 25, 222, 40, 184, 221, 233, 193, 222, 104, 127, 60, 217, 95, + 218, 27, 77, 189, 184, 213, 225, 254, 254, 228, 141, 157, 209, 245, 217, 114, 201, 29, 236, + 173, 149, 116, 191, 120, 23, 91, 93, 44, 222, 227, 85, 220, 213, 201, 108, 123, 149, 110, + 155, 187, 135, 132, 187, 58, 29, 173, 77, 246, 103, 219, 197, 156, 12, 119, 14, 149, 175, + 247, 166, 163, 242, 149, 225, 250, 232, 230, 193, 248, 214, 112, 103, 180, 123, 109, 180, + 184, 61, 57, 152, 142, 54, 252, 100, 239, 76, 182, 198, 215, 134, 59, 187, 147, 217, 90, + 209, 121, 107, 127, 184, 51, 219, 19, 246, 234, 108, 229, 37, 23, 117, 138, 127, 5, 19, 193, + 116, 132, 209, 129, 81, 129, 49, 129, 201, 2, 147, 7, 38, 9, 76, 26, 152, 24, 198, 4, 57, + 42, 220, 30, 7, 136, 56, 72, 214, 65, 142, 10, 45, 42, 244, 81, 65, 78, 28, 84, 53, 161, + 179, 14, 106, 40, 97, 2, 186, 10, 250, 104, 97, 194, 37, 19, 32, 34, 1, 13, 146, 85, 80, + 213, 72, 231, 32, 217, 4, 125, 140, 140, 43, 72, 54, 225, 246, 88, 6, 40, 114, 202, 150, + 229, 131, 189, 171, 59, 147, 107, 175, 47, 251, 57, 44, 232, 98, 245, 105, 231, 122, 69, + 247, 103, 124, 158, 77, 183, 135, 155, 163, 197, 242, 188, 188, 249, 122, 73, 87, 175, 251, + 7, 220, 63, 93, 147, 159, 172, 85, 220, 190, 159, 241, 229, 217, 254, 120, 184, 117, 176, + 87, 209, 125, 62, 111, 238, 86, 116, 231, 250, 210, 181, 241, 254, 181, 157, 209, 234, 120, + 247, 214, 85, 239, 68, 70, 179, 130, 163, 109, 122, 99, 236, 159, 195, 225, 181, 145, 127, + 128, 110, 201, 135, 246, 244, 96, 119, 233, 250, 232, 134, 127, 132, 22, 138, 211, 226, 116, + 207, 131, 47, 92, 219, 57, 184, 186, 184, 61, 26, 122, 136, 205, 241, 240, 198, 100, 119, + 115, 253, 198, 193, 148, 135, 106, 244, 80, 131, 247, 79, 253, 252, 185, 23, 230, 199, 63, + 94, 223, 29, 238, 77, 166, 179, 253, 201, 222, 118, 225, 129, 118, 203, 117, 59, 186, 230, + 111, 93, 29, 94, 31, 143, 147, 72, 153, 44, 112, 89, 190, 244, 29, 63, 227, 169, 94, 250, + 78, 148, 197, 166, 34, 113, 84, 18, 173, 215, 38, 123, 163, 221, 74, 255, 229, 110, 229, + 220, 150, 135, 21, 93, 239, 23, 163, 57, 184, 113, 125, 103, 244, 147, 245, 107, 53, 191, + 208, 47, 22, 243, 53, 127, 90, 30, 112, 199, 168, 162, 75, 131, 202, 11, 142, 74, 178, 48, + 40, 250, 141, 252, 105, 253, 108, 67, 210, 86, 67, 210, 217, 162, 199, 150, 63, 173, 156, + 13, 238, 102, 11, 102, 253, 59, 141, 123, 182, 27, 247, 124, 231, 234, 112, 127, 97, 219, + 159, 150, 206, 205, 198, 59, 155, 163, 165, 113, 73, 150, 207, 161, 203, 24, 93, 206, 85, + 186, 140, 43, 143, 124, 14, 103, 59, 174, 232, 250, 11, 13, 233, 63, 174, 249, 149, 243, 65, + 143, 215, 97, 14, 189, 238, 131, 194, 104, 119, 103, 184, 187, 57, 190, 182, 242, 23, 225, + 242, 78, 96, 190, 27, 152, 93, 152, 246, 96, 119, 171, 61, 218, 221, 90, 190, 128, 66, 19, + 20, 186, 80, 41, 52, 41, 201, 202, 247, 194, 125, 251, 97, 192, 47, 53, 84, 154, 54, 6, 252, + 114, 49, 224, 89, 49, 224, 139, 213, 128, 15, 170, 1, 95, 68, 254, 1, 242, 47, 86, 242, 15, + 170, 1, 95, 100, 192, 7, 12, 248, 149, 134, 244, 55, 26, 252, 229, 6, 255, 102, 205, 47, + 122, 63, 188, 53, 93, 235, 22, 254, 189, 116, 225, 222, 151, 6, 118, 185, 59, 168, 232, 112, + 84, 210, 245, 11, 101, 64, 171, 248, 73, 205, 175, 14, 139, 135, 118, 103, 52, 30, 46, 189, + 226, 157, 161, 215, 237, 141, 138, 188, 82, 197, 134, 55, 170, 94, 175, 108, 142, 71, 251, + 163, 233, 120, 186, 250, 70, 224, 150, 46, 87, 29, 223, 44, 201, 198, 205, 3, 47, 167, 24, + 149, 119, 197, 155, 171, 251, 195, 205, 98, 65, 140, 126, 82, 62, 225, 157, 44, 55, 209, + 234, 104, 58, 243, 243, 238, 87, 200, 170, 31, 236, 168, 112, 248, 219, 135, 102, 219, 126, + 226, 42, 126, 186, 126, 125, 124, 43, 240, 135, 166, 94, 210, 110, 184, 112, 109, 226, 227, + 209, 240, 218, 181, 209, 238, 236, 72, 25, 105, 26, 13, 139, 179, 201, 238, 100, 186, 17, + 180, 42, 63, 173, 117, 139, 128, 85, 178, 135, 6, 85, 188, 42, 63, 172, 12, 102, 85, 235, + 234, 185, 9, 220, 161, 11, 55, 138, 111, 218, 84, 215, 15, 93, 108, 116, 94, 187, 112, 99, + 180, 85, 117, 122, 120, 236, 187, 223, 131, 176, 88, 34, 44, 244, 124, 72, 91, 180, 101, 92, + 4, 103, 225, 7, 69, 208, 244, 56, 11, 5, 196, 226, 249, 225, 222, 222, 208, 231, 9, 55, 174, + 110, 14, 231, 255, 242, 96, 254, 187, 7, 243, 151, 198, 203, 96, 206, 191, 56, 110, 127, + 111, 123, 178, 248, 82, 25, 74, 95, 30, 30, 44, 131, 223, 238, 111, 143, 219, 47, 78, 199, + 135, 206, 53, 112, 15, 115, 49, 124, 94, 27, 214, 131, 28, 53, 7, 57, 10, 131, 28, 135, 65, + 62, 122, 112, 239, 173, 101, 227, 194, 213, 66, 249, 173, 34, 212, 47, 188, 85, 40, 93, 124, + 156, 21, 49, 127, 161, 184, 113, 241, 245, 82, 245, 157, 74, 245, 221, 131, 249, 159, 140, + 253, 42, 41, 245, 110, 239, 111, 79, 150, 202, 248, 31, 45, 35, 185, 125, 205, 107, 236, + 217, 197, 73, 97, 180, 67, 77, 123, 29, 190, 15, 252, 208, 164, 105, 241, 131, 166, 197, 39, + 98, 241, 242, 177, 241, 145, 70, 233, 192, 197, 145, 112, 74, 184, 250, 170, 17, 46, 22, 46, + 17, 46, 21, 46, 19, 46, 15, 92, 210, 17, 78, 48, 146, 128, 17, 25, 145, 23, 137, 148, 72, + 164, 68, 34, 69, 137, 20, 37, 82, 148, 104, 170, 68, 63, 37, 242, 148, 232, 167, 68, 178, + 18, 201, 74, 36, 107, 145, 172, 69, 178, 22, 201, 90, 108, 160, 5, 67, 11, 134, 22, 12, 45, + 24, 90, 48, 180, 96, 24, 193, 48, 130, 97, 4, 195, 8, 134, 17, 140, 218, 46, 70, 48, 140, + 96, 24, 193, 48, 181, 157, 229, 142, 68, 238, 72, 228, 142, 68, 238, 72, 228, 142, 84, 180, + 74, 69, 151, 84, 116, 73, 69, 151, 84, 36, 167, 34, 57, 21, 201, 169, 72, 78, 69, 114, 38, + 146, 51, 25, 111, 38, 24, 153, 96, 100, 130, 145, 9, 70, 38, 24, 153, 96, 100, 130, 145, 9, + 70, 46, 24, 185, 96, 228, 130, 145, 11, 70, 46, 24, 185, 96, 228, 130, 145, 215, 227, 168, + 165, 4, 12, 207, 11, 23, 9, 39, 207, 110, 71, 11, 103, 132, 139, 133, 75, 132, 75, 133, 203, + 132, 19, 140, 72, 48, 106, 157, 227, 122, 108, 213, 29, 197, 2, 8, 233, 140, 142, 149, 207, + 221, 70, 183, 134, 107, 222, 63, 13, 175, 79, 71, 91, 147, 157, 138, 221, 243, 167, 237, + 245, 146, 189, 233, 51, 152, 217, 116, 113, 123, 188, 63, 190, 185, 56, 155, 122, 223, 176, + 88, 118, 92, 44, 251, 44, 133, 203, 19, 239, 128, 150, 110, 30, 92, 61, 152, 77, 151, 54, + 135, 91, 163, 233, 246, 226, 141, 145, 207, 219, 23, 111, 12, 111, 14, 175, 47, 236, 15, + 175, 143, 252, 29, 211, 209, 205, 229, 233, 246, 120, 183, 40, 183, 166, 37, 89, 153, 78, + 60, 218, 244, 224, 230, 130, 143, 66, 215, 219, 222, 215, 45, 110, 141, 111, 140, 118, 22, + 55, 253, 231, 217, 252, 246, 168, 125, 107, 120, 107, 241, 173, 225, 155, 227, 221, 182, + 247, 121, 237, 153, 63, 222, 156, 108, 174, 92, 31, 251, 146, 226, 245, 225, 245, 182, 63, + 22, 61, 246, 136, 166, 27, 163, 27, 109, 127, 84, 31, 118, 15, 118, 219, 254, 240, 101, 216, + 141, 209, 235, 219, 11, 133, 144, 229, 242, 194, 222, 104, 126, 111, 180, 86, 178, 179, 169, + 247, 128, 139, 229, 185, 125, 115, 226, 53, 245, 170, 47, 20, 58, 250, 154, 233, 214, 234, + 230, 228, 224, 234, 142, 183, 208, 173, 37, 127, 120, 92, 26, 60, 183, 180, 85, 184, 201, + 237, 85, 79, 124, 136, 126, 115, 124, 99, 99, 119, 244, 134, 183, 230, 205, 209, 142, 119, + 185, 187, 107, 190, 63, 35, 221, 8, 186, 150, 182, 126, 40, 124, 170, 44, 183, 86, 234, 94, + 154, 239, 72, 205, 86, 22, 92, 246, 218, 21, 58, 175, 23, 130, 16, 182, 86, 242, 37, 251, + 112, 217, 84, 246, 228, 226, 145, 70, 75, 217, 176, 90, 24, 181, 156, 168, 181, 130, 171, + 32, 203, 198, 27, 195, 189, 241, 205, 85, 111, 238, 170, 251, 122, 105, 116, 248, 210, 244, + 21, 191, 178, 61, 170, 152, 85, 63, 30, 46, 151, 147, 65, 235, 44, 116, 92, 245, 38, 169, + 56, 25, 32, 23, 132, 91, 47, 199, 71, 171, 159, 35, 56, 63, 65, 21, 119, 168, 154, 166, 234, + 195, 6, 243, 132, 26, 129, 89, 47, 39, 138, 59, 253, 116, 85, 220, 90, 49, 19, 176, 181, 9, + 86, 102, 168, 188, 226, 117, 47, 205, 186, 236, 199, 91, 60, 137, 203, 94, 167, 130, 250, + 98, 183, 32, 165, 65, 74, 229, 30, 121, 107, 228, 107, 215, 241, 230, 108, 123, 119, 178, + 251, 227, 201, 120, 119, 180, 127, 88, 154, 248, 92, 20, 197, 179, 73, 89, 8, 23, 27, 29, + 135, 75, 110, 54, 41, 154, 139, 207, 229, 218, 138, 83, 141, 167, 137, 83, 195, 234, 46, + 184, 84, 184, 60, 112, 120, 116, 207, 17, 57, 11, 78, 9, 39, 247, 18, 57, 11, 46, 22, 46, + 17, 78, 36, 199, 1, 87, 231, 74, 56, 45, 156, 17, 46, 22, 46, 17, 46, 21, 174, 150, 34, 154, + 118, 68, 211, 78, 36, 163, 20, 157, 137, 201, 137, 142, 146, 90, 151, 112, 111, 108, 130, 6, + 177, 150, 113, 160, 75, 162, 50, 174, 22, 92, 221, 86, 233, 151, 24, 133, 133, 10, 46, 96, + 228, 98, 13, 77, 52, 40, 174, 170, 112, 175, 104, 21, 119, 164, 95, 18, 116, 209, 105, 71, + 56, 25, 71, 42, 182, 74, 197, 86, 169, 220, 155, 214, 182, 146, 241, 166, 245, 200, 145, + 167, 148, 216, 62, 198, 103, 39, 42, 167, 173, 224, 176, 179, 231, 82, 233, 23, 139, 206, + 185, 112, 169, 112, 181, 188, 208, 150, 7, 59, 123, 41, 185, 180, 117, 164, 159, 160, 37, + 97, 68, 113, 82, 223, 203, 136, 148, 6, 183, 224, 18, 185, 183, 150, 87, 223, 17, 11, 39, + 253, 98, 185, 23, 121, 137, 55, 144, 22, 174, 110, 203, 3, 151, 200, 213, 92, 198, 155, 135, + 185, 204, 106, 157, 201, 120, 124, 27, 177, 204, 183, 201, 172, 230, 100, 45, 197, 213, 32, + 47, 83, 53, 23, 112, 51, 45, 109, 245, 211, 148, 213, 207, 134, 60, 107, 89, 125, 181, 158, + 133, 68, 238, 173, 185, 48, 142, 140, 104, 90, 112, 162, 61, 107, 181, 224, 98, 225, 18, 25, + 185, 244, 203, 164, 159, 146, 126, 89, 205, 201, 200, 115, 193, 205, 101, 188, 121, 125, 53, + 232, 146, 119, 58, 194, 201, 170, 232, 40, 225, 180, 112, 70, 184, 88, 184, 68, 184, 32, 57, + 143, 68, 94, 36, 22, 87, 65, 131, 220, 200, 83, 167, 69, 3, 89, 181, 77, 78, 36, 155, 122, + 5, 136, 126, 166, 94, 11, 162, 159, 216, 180, 209, 79, 108, 218, 236, 39, 146, 99, 209, 89, + 158, 176, 176, 2, 10, 14, 41, 38, 228, 187, 158, 11, 119, 152, 80, 77, 120, 46, 220, 97, 58, + 245, 138, 18, 159, 19, 101, 178, 82, 130, 255, 83, 193, 255, 37, 42, 173, 189, 114, 20, 73, + 155, 248, 53, 177, 95, 90, 123, 234, 240, 196, 250, 54, 241, 217, 145, 145, 182, 92, 184, + 84, 56, 137, 31, 81, 120, 58, 83, 89, 231, 38, 74, 164, 77, 36, 203, 56, 82, 89, 251, 38, + 18, 121, 73, 173, 95, 38, 109, 245, 213, 26, 163, 214, 79, 180, 74, 101, 228, 73, 125, 175, + 196, 5, 37, 87, 83, 209, 37, 21, 93, 196, 179, 26, 85, 183, 137, 246, 169, 216, 64, 124, + 172, 81, 98, 191, 180, 214, 64, 52, 77, 197, 46, 74, 208, 50, 177, 139, 18, 121, 117, 100, + 82, 50, 182, 172, 214, 69, 52, 200, 100, 46, 149, 96, 100, 245, 213, 90, 94, 173, 159, 216, + 64, 124, 118, 154, 213, 247, 214, 250, 201, 213, 92, 70, 148, 139, 173, 234, 72, 162, 235, + 54, 209, 52, 151, 177, 73, 196, 54, 90, 236, 151, 139, 6, 185, 104, 42, 177, 219, 104, 241, + 117, 157, 250, 14, 137, 46, 117, 20, 215, 226, 9, 59, 226, 9, 59, 245, 189, 98, 23, 93, 95, + 149, 200, 84, 199, 45, 137, 31, 70, 124, 68, 237, 189, 107, 223, 158, 53, 50, 30, 193, 144, + 85, 145, 69, 245, 189, 50, 71, 117, 86, 16, 213, 207, 164, 72, 142, 100, 62, 106, 47, 47, + 79, 108, 38, 207, 125, 22, 201, 124, 24, 209, 89, 158, 176, 76, 158, 221, 76, 201, 124, 136, + 231, 18, 79, 173, 36, 206, 168, 16, 103, 138, 126, 130, 161, 4, 35, 173, 229, 201, 124, 136, + 215, 203, 84, 109, 3, 209, 84, 215, 249, 159, 220, 91, 207, 140, 204, 121, 86, 207, 106, 61, + 31, 90, 244, 211, 162, 179, 22, 173, 180, 224, 106, 65, 51, 130, 225, 103, 171, 124, 111, + 231, 203, 208, 104, 189, 210, 192, 103, 105, 207, 170, 245, 160, 141, 105, 240, 209, 179, + 74, 122, 199, 194, 37, 225, 122, 26, 53, 250, 102, 13, 62, 173, 249, 188, 41, 47, 111, 240, + 113, 131, 87, 53, 142, 31, 101, 224, 4, 81, 87, 136, 101, 236, 230, 174, 50, 219, 107, 240, + 73, 131, 215, 13, 62, 110, 240, 74, 16, 125, 126, 216, 64, 79, 26, 188, 174, 53, 241, 207, + 67, 224, 210, 134, 165, 116, 195, 82, 186, 97, 41, 29, 122, 199, 98, 225, 88, 53, 44, 165, + 27, 150, 210, 13, 75, 233, 134, 165, 116, 195, 82, 186, 97, 41, 221, 176, 148, 224, 248, + 168, 16, 56, 65, 76, 84, 195, 82, 186, 97, 41, 221, 176, 148, 110, 88, 74, 55, 44, 165, 27, + 150, 210, 13, 75, 233, 134, 165, 116, 195, 82, 162, 73, 42, 54, 75, 117, 195, 82, 166, 97, + 41, 211, 176, 148, 204, 176, 247, 238, 129, 203, 26, 150, 50, 13, 75, 153, 134, 165, 76, + 195, 82, 166, 97, 41, 211, 176, 148, 105, 88, 74, 112, 50, 153, 201, 76, 16, 179, 172, 97, + 41, 211, 176, 148, 105, 88, 202, 52, 44, 101, 26, 150, 50, 13, 75, 153, 134, 165, 76, 195, + 82, 166, 97, 41, 209, 196, 123, 240, 192, 229, 112, 197, 30, 81, 224, 34, 225, 148, 112, 90, + 56, 35, 92, 44, 92, 34, 92, 42, 92, 38, 156, 96, 68, 130, 17, 9, 70, 36, 24, 145, 96, 68, + 130, 17, 9, 70, 36, 24, 145, 96, 68, 130, 17, 9, 134, 18, 12, 37, 24, 74, 48, 148, 96, 40, + 193, 16, 159, 18, 169, 164, 248, 142, 128, 115, 174, 191, 120, 97, 123, 178, 191, 187, 56, + 41, 207, 23, 203, 243, 65, 113, 14, 61, 181, 200, 17, 79, 17, 233, 184, 188, 187, 211, 73, + 160, 41, 52, 127, 228, 218, 228, 198, 213, 241, 238, 120, 119, 107, 123, 50, 121, 125, 120, + 117, 114, 107, 84, 93, 138, 58, 80, 13, 141, 160, 125, 104, 252, 168, 220, 90, 190, 42, 170, + 222, 102, 4, 68, 241, 13, 145, 1, 75, 245, 87, 54, 139, 215, 61, 227, 173, 221, 149, 201, + 238, 104, 182, 61, 222, 223, 92, 157, 189, 49, 41, 153, 41, 250, 136, 213, 98, 25, 69, 108, + 184, 230, 0, 86, 80, 218, 35, 198, 20, 129, 19, 101, 208, 28, 218, 133, 246, 160, 3, 40, + 242, 20, 3, 85, 12, 80, 169, 122, 96, 229, 155, 161, 106, 96, 117, 99, 249, 66, 169, 106, + 68, 146, 125, 88, 46, 110, 78, 102, 87, 71, 59, 147, 55, 144, 133, 241, 20, 186, 40, 116, + 81, 232, 162, 24, 131, 98, 126, 152, 229, 142, 10, 54, 99, 44, 202, 66, 209, 93, 161, 187, + 143, 145, 221, 128, 184, 58, 12, 220, 90, 87, 230, 114, 109, 40, 236, 145, 110, 253, 226, + 173, 28, 194, 145, 225, 253, 13, 141, 30, 229, 200, 155, 61, 202, 134, 71, 27, 61, 68, 240, + 163, 195, 7, 52, 54, 101, 149, 143, 71, 83, 86, 217, 240, 165, 70, 143, 160, 249, 151, 134, + 127, 220, 182, 94, 125, 235, 165, 122, 241, 55, 108, 240, 85, 123, 169, 23, 237, 37, 127, + 184, 106, 23, 77, 14, 15, 239, 253, 204, 125, 165, 14, 220, 87, 242, 15, 85, 237, 1, 246, + 161, 225, 61, 31, 87, 7, 194, 73, 219, 218, 160, 182, 115, 45, 127, 105, 80, 189, 64, 173, + 164, 30, 25, 220, 111, 228, 209, 253, 13, 131, 251, 173, 62, 186, 223, 234, 131, 7, 89, 125, + 244, 32, 171, 15, 238, 183, 250, 232, 126, 171, 15, 30, 96, 245, 209, 31, 183, 173, 157, + 171, 199, 54, 22, 118, 245, 156, 88, 97, 44, 220, 5, 225, 38, 114, 247, 133, 250, 238, 73, + 173, 221, 133, 251, 135, 62, 185, 191, 225, 194, 253, 182, 152, 220, 111, 139, 11, 15, 178, + 197, 228, 65, 182, 184, 112, 191, 45, 38, 247, 219, 226, 194, 3, 108, 49, 121, 128, 45, 74, + 143, 91, 189, 160, 158, 212, 108, 217, 90, 42, 85, 181, 150, 236, 67, 101, 171, 40, 241, + 208, 228, 158, 143, 213, 61, 37, 120, 117, 79, 201, 110, 148, 173, 1, 109, 99, 210, 252, + 180, 122, 81, 184, 3, 209, 231, 98, 45, 240, 160, 102, 47, 214, 170, 29, 212, 236, 197, 90, + 203, 131, 90, 203, 139, 247, 106, 121, 112, 175, 150, 23, 107, 45, 15, 106, 45, 47, 222, + 163, 229, 193, 61, 90, 94, 22, 238, 77, 209, 242, 114, 45, 240, 205, 122, 117, 92, 174, 86, + 199, 155, 37, 193, 199, 251, 212, 64, 184, 72, 184, 210, 207, 123, 231, 218, 129, 70, 208, + 208, 174, 161, 6, 26, 67, 19, 104, 10, 205, 160, 57, 180, 11, 237, 65, 251, 32, 170, 188, + 35, 92, 36, 156, 18, 174, 194, 51, 185, 130, 134, 207, 9, 52, 133, 118, 161, 61, 104, 31, + 106, 43, 218, 229, 254, 46, 247, 119, 7, 80, 87, 209, 94, 7, 26, 65, 233, 223, 163, 127, 47, + 131, 230, 80, 240, 122, 140, 39, 171, 228, 168, 152, 235, 3, 250, 15, 66, 30, 162, 37, 55, + 209, 146, 155, 104, 201, 77, 180, 228, 38, 90, 114, 19, 93, 197, 177, 78, 146, 214, 45, 49, + 45, 90, 90, 82, 90, 98, 105, 201, 105, 9, 185, 128, 214, 17, 45, 169, 180, 4, 201, 162, 147, + 142, 87, 170, 150, 252, 249, 50, 200, 245, 146, 20, 154, 65, 131, 216, 42, 152, 246, 98, 71, + 123, 7, 26, 64, 122, 92, 215, 80, 3, 13, 170, 135, 137, 215, 70, 204, 32, 15, 162, 142, 131, + 20, 43, 45, 50, 212, 216, 8, 23, 100, 5, 29, 192, 74, 192, 74, 184, 158, 161, 91, 28, 116, + 234, 67, 45, 215, 197, 232, 137, 152, 47, 17, 179, 37, 152, 54, 19, 243, 39, 162, 113, 42, + 26, 167, 104, 156, 161, 67, 138, 221, 82, 236, 150, 98, 183, 12, 221, 210, 208, 47, 124, 14, + 186, 138, 6, 181, 86, 53, 114, 198, 132, 101, 65, 58, 35, 15, 35, 204, 130, 22, 160, 102, 1, + 85, 52, 206, 67, 143, 174, 180, 4, 153, 61, 105, 9, 186, 96, 167, 44, 124, 182, 124, 14, + 119, 12, 248, 28, 44, 228, 144, 96, 58, 244, 144, 69, 109, 58, 200, 168, 240, 253, 61, 216, + 94, 150, 184, 233, 160, 107, 30, 102, 218, 68, 232, 154, 27, 105, 9, 114, 99, 105, 9, 114, + 19, 105, 65, 155, 60, 149, 150, 32, 57, 88, 193, 168, 32, 185, 43, 45, 130, 42, 5, 128, 9, + 203, 44, 239, 73, 139, 200, 84, 153, 112, 65, 122, 120, 162, 139, 45, 177, 192, 201, 232, + 194, 82, 203, 173, 180, 200, 24, 180, 232, 174, 131, 238, 3, 105, 17, 157, 141, 216, 210, 4, + 237, 197, 222, 70, 180, 55, 162, 189, 65, 251, 110, 125, 159, 104, 111, 68, 123, 131, 246, + 93, 209, 57, 174, 57, 209, 62, 70, 251, 110, 221, 34, 218, 199, 162, 125, 140, 246, 93, 209, + 38, 22, 237, 101, 59, 192, 4, 15, 209, 21, 9, 137, 244, 79, 68, 251, 176, 118, 187, 9, 107, + 153, 39, 61, 229, 73, 15, 235, 45, 17, 27, 132, 150, 174, 140, 50, 13, 90, 203, 104, 195, + 42, 235, 202, 188, 167, 117, 239, 186, 87, 176, 137, 204, 187, 172, 69, 35, 107, 209, 132, + 85, 208, 149, 121, 151, 181, 107, 164, 164, 55, 97, 109, 116, 89, 59, 150, 245, 94, 5, 76, + 79, 19, 174, 203, 140, 215, 207, 127, 253, 220, 135, 21, 217, 19, 43, 214, 79, 183, 20, 237, + 38, 71, 239, 30, 107, 44, 199, 223, 229, 172, 99, 130, 96, 210, 11, 99, 136, 165, 84, 143, + 165, 84, 143, 59, 104, 220, 195, 67, 229, 248, 154, 28, 159, 34, 40, 65, 187, 88, 10, 244, + 36, 170, 219, 130, 198, 130, 32, 229, 121, 44, 33, 48, 14, 43, 179, 39, 232, 18, 0, 99, 9, + 128, 113, 8, 128, 61, 145, 32, 165, 121, 172, 234, 59, 131, 222, 34, 93, 133, 167, 47, 214, + 29, 225, 120, 74, 122, 245, 53, 45, 156, 104, 175, 131, 246, 68, 57, 89, 105, 177, 22, 233, + 58, 232, 142, 149, 187, 88, 189, 74, 49, 60, 13, 90, 135, 231, 35, 54, 162, 181, 20, 232, + 177, 9, 90, 91, 105, 17, 205, 36, 30, 198, 33, 30, 246, 68, 15, 137, 135, 177, 196, 195, 56, + 196, 195, 62, 107, 164, 27, 62, 7, 205, 88, 75, 93, 102, 178, 203, 8, 250, 98, 233, 4, 157, + 251, 34, 61, 172, 195, 190, 160, 132, 120, 216, 231, 9, 30, 160, 91, 31, 233, 164, 120, 73, + 159, 231, 134, 20, 48, 233, 131, 106, 251, 124, 206, 185, 63, 96, 134, 53, 25, 135, 245, + 215, 199, 178, 214, 241, 89, 108, 20, 214, 94, 127, 32, 45, 98, 91, 89, 123, 113, 88, 123, + 125, 177, 90, 136, 135, 22, 11, 13, 194, 24, 208, 125, 192, 29, 86, 158, 194, 176, 242, 108, + 152, 85, 116, 177, 172, 14, 18, 197, 196, 6, 251, 36, 157, 208, 194, 202, 182, 65, 38, 118, + 176, 65, 7, 236, 68, 42, 156, 4, 187, 88, 86, 169, 29, 64, 65, 28, 116, 160, 200, 31, 40, + 40, 182, 24, 160, 233, 0, 220, 48, 22, 82, 208, 100, 0, 238, 0, 220, 1, 184, 3, 112, 7, 224, + 186, 48, 15, 137, 172, 173, 68, 226, 94, 162, 144, 230, 130, 111, 76, 100, 109, 37, 18, 247, + 18, 141, 110, 174, 47, 45, 98, 31, 137, 123, 137, 70, 83, 23, 144, 7, 114, 37, 172, 129, 68, + 162, 94, 34, 175, 6, 18, 163, 132, 19, 207, 35, 113, 47, 145, 85, 150, 200, 42, 75, 36, 242, + 37, 18, 249, 18, 89, 103, 137, 172, 179, 68, 98, 95, 34, 177, 47, 145, 149, 150, 132, 28, + 54, 194, 151, 71, 162, 111, 204, 179, 30, 57, 105, 17, 233, 18, 249, 18, 217, 8, 79, 18, + 145, 46, 177, 47, 145, 216, 151, 72, 22, 154, 36, 165, 133, 84, 167, 219, 129, 70, 80, 5, + 141, 161, 161, 95, 6, 205, 161, 22, 58, 128, 186, 138, 246, 144, 199, 211, 27, 101, 148, + 121, 89, 248, 76, 153, 199, 58, 139, 50, 202, 60, 50, 193, 40, 163, 204, 99, 133, 69, 25, + 101, 30, 235, 43, 202, 40, 243, 178, 80, 22, 245, 161, 22, 90, 61, 219, 81, 14, 46, 89, 105, + 68, 46, 26, 229, 224, 177, 250, 34, 202, 188, 136, 50, 47, 202, 193, 35, 22, 69, 148, 125, + 17, 101, 95, 68, 217, 23, 17, 241, 162, 60, 224, 85, 107, 41, 162, 12, 140, 240, 209, 81, + 23, 60, 60, 102, 212, 5, 175, 11, 94, 23, 60, 60, 102, 212, 5, 175, 11, 94, 23, 188, 46, + 120, 148, 149, 81, 176, 47, 101, 100, 68, 25, 25, 245, 192, 235, 129, 215, 3, 175, 7, 30, + 101, 102, 68, 153, 25, 81, 102, 70, 161, 204, 236, 129, 215, 3, 175, 23, 240, 24, 95, 31, + 187, 246, 193, 239, 131, 223, 7, 191, 15, 126, 31, 252, 62, 248, 125, 240, 251, 224, 247, + 193, 239, 131, 223, 7, 191, 15, 126, 31, 252, 62, 248, 226, 105, 83, 50, 198, 8, 175, 21, + 225, 181, 34, 188, 86, 52, 8, 215, 209, 4, 239, 21, 225, 189, 34, 188, 87, 132, 247, 138, + 240, 94, 17, 222, 43, 194, 123, 69, 120, 175, 8, 239, 21, 13, 208, 100, 128, 37, 28, 248, + 14, 124, 7, 190, 3, 223, 129, 239, 192, 119, 224, 59, 240, 29, 248, 174, 194, 87, 157, 14, + 52, 130, 42, 168, 134, 26, 104, 12, 77, 160, 41, 52, 131, 6, 121, 93, 104, 15, 218, 135, 90, + 232, 0, 202, 198, 66, 4, 62, 181, 145, 138, 192, 167, 50, 82, 17, 248, 228, 95, 42, 2, 159, + 170, 72, 69, 224, 147, 121, 169, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 124, 5, 190, 2, + 151, 220, 76, 41, 112, 169, 153, 148, 2, 151, 172, 76, 17, 55, 20, 213, 146, 82, 224, 170, + 16, 71, 50, 145, 132, 6, 10, 13, 20, 26, 40, 52, 208, 104, 64, 38, 167, 136, 53, 138, 10, + 75, 197, 92, 39, 103, 82, 108, 101, 169, 56, 92, 71, 83, 178, 37, 21, 163, 41, 213, 139, + 138, 209, 52, 70, 195, 24, 203, 196, 232, 197, 174, 129, 138, 209, 43, 70, 175, 4, 92, 234, + 27, 149, 128, 75, 78, 165, 18, 112, 201, 168, 84, 2, 46, 249, 148, 74, 192, 101, 135, 69, + 37, 224, 39, 224, 39, 224, 39, 224, 39, 224, 39, 224, 167, 224, 83, 7, 169, 20, 124, 170, + 32, 149, 130, 79, 13, 164, 82, 240, 83, 240, 83, 240, 201, 190, 84, 10, 126, 10, 126, 10, + 126, 10, 126, 10, 126, 10, 62, 49, 68, 17, 67, 20, 49, 68, 17, 67, 20, 49, 68, 17, 67, 20, + 49, 68, 17, 67, 20, 49, 68, 17, 67, 20, 49, 68, 17, 67, 20, 49, 68, 17, 67, 20, 49, 68, 133, + 45, 55, 98, 137, 34, 150, 40, 182, 10, 195, 214, 161, 34, 166, 40, 98, 138, 34, 166, 40, 98, + 138, 34, 166, 40, 98, 138, 34, 166, 40, 98, 138, 34, 166, 40, 98, 138, 34, 166, 40, 98, 138, + 234, 130, 223, 5, 159, 24, 163, 136, 49, 138, 24, 163, 136, 49, 138, 24, 163, 136, 49, 138, + 24, 163, 136, 49, 138, 24, 163, 136, 49, 138, 24, 163, 136, 49, 138, 173, 74, 69, 140, 81, + 196, 24, 69, 140, 81, 196, 24, 69, 140, 81, 196, 24, 69, 140, 81, 196, 24, 69, 140, 81, 196, + 24, 69, 140, 81, 196, 24, 213, 11, 120, 140, 151, 24, 163, 136, 49, 138, 24, 163, 136, 49, + 138, 24, 163, 136, 49, 138, 24, 163, 136, 41, 138, 88, 162, 136, 37, 138, 88, 162, 136, 37, + 138, 88, 162, 250, 224, 176, 5, 173, 216, 130, 86, 108, 65, 43, 182, 160, 21, 91, 208, 138, + 45, 104, 69, 222, 173, 200, 187, 21, 121, 180, 34, 143, 86, 68, 36, 69, 68, 82, 68, 36, 69, + 68, 82, 68, 36, 69, 100, 81, 68, 22, 69, 100, 209, 120, 124, 141, 167, 215, 120, 122, 141, + 167, 215, 120, 122, 141, 167, 215, 120, 120, 141, 135, 215, 120, 120, 141, 135, 215, 157, + 32, 183, 210, 79, 227, 225, 53, 30, 94, 227, 225, 53, 30, 94, 227, 225, 53, 30, 94, 227, + 225, 53, 30, 94, 227, 225, 53, 30, 94, 227, 225, 53, 30, 94, 227, 225, 53, 30, 94, 227, 225, + 53, 30, 94, 227, 225, 53, 123, 100, 26, 79, 175, 241, 240, 97, 243, 89, 227, 225, 195, 214, + 179, 198, 195, 135, 141, 103, 141, 135, 215, 10, 92, 252, 186, 198, 175, 107, 252, 186, 198, + 175, 107, 252, 122, 216, 166, 214, 248, 245, 176, 73, 173, 53, 248, 212, 230, 154, 234, 65, + 179, 103, 166, 53, 248, 212, 229, 90, 131, 175, 193, 215, 224, 107, 240, 53, 248, 26, 124, + 3, 62, 187, 107, 218, 128, 111, 192, 55, 224, 179, 175, 166, 13, 248, 84, 240, 218, 128, + 207, 142, 154, 54, 224, 27, 240, 13, 248, 6, 124, 3, 190, 1, 159, 248, 161, 137, 31, 154, + 248, 161, 137, 31, 154, 248, 161, 137, 31, 154, 248, 17, 246, 167, 53, 241, 67, 19, 63, 52, + 241, 67, 19, 63, 52, 241, 67, 19, 63, 52, 241, 67, 19, 63, 52, 241, 65, 19, 31, 52, 254, 95, + 179, 254, 52, 235, 79, 179, 254, 52, 235, 79, 179, 254, 52, 235, 79, 179, 254, 52, 235, 79, + 83, 247, 106, 234, 94, 109, 131, 92, 244, 162, 238, 213, 212, 189, 154, 245, 170, 89, 175, + 154, 245, 170, 89, 175, 154, 245, 170, 89, 175, 154, 245, 170, 201, 32, 53, 25, 164, 38, + 131, 212, 100, 144, 154, 12, 82, 147, 65, 106, 50, 72, 205, 58, 215, 172, 115, 29, 214, 57, + 25, 164, 38, 131, 212, 100, 144, 154, 12, 82, 147, 65, 106, 50, 72, 77, 6, 169, 201, 32, 13, + 153, 162, 97, 157, 27, 242, 18, 67, 254, 96, 152, 239, 176, 31, 106, 152, 111, 195, 124, 27, + 230, 59, 236, 132, 26, 230, 219, 48, 223, 134, 249, 54, 204, 183, 97, 190, 13, 243, 109, + 152, 111, 147, 4, 60, 94, 117, 49, 223, 134, 124, 33, 236, 155, 26, 242, 133, 176, 107, 106, + 120, 30, 194, 158, 169, 33, 95, 48, 228, 11, 134, 124, 33, 236, 150, 26, 158, 23, 67, 190, + 96, 200, 23, 76, 120, 135, 227, 83, 212, 208, 19, 77, 200, 28, 12, 153, 131, 33, 115, 48, + 100, 14, 97, 135, 213, 144, 57, 24, 50, 7, 67, 230, 96, 200, 24, 12, 25, 131, 33, 99, 48, + 100, 12, 134, 140, 193, 144, 49, 24, 50, 6, 67, 198, 96, 200, 8, 194, 238, 170, 33, 3, 8, + 251, 168, 134, 8, 111, 136, 240, 134, 8, 111, 136, 240, 134, 136, 110, 136, 232, 134, 136, + 110, 136, 232, 134, 136, 110, 136, 232, 134, 136, 110, 136, 232, 134, 136, 110, 136, 232, + 134, 136, 109, 136, 216, 134, 136, 109, 136, 216, 134, 136, 108, 122, 161, 63, 250, 17, 145, + 13, 17, 217, 16, 145, 13, 17, 217, 16, 145, 13, 17, 217, 16, 145, 13, 85, 159, 161, 234, 51, + 68, 104, 67, 213, 103, 136, 212, 134, 72, 109, 136, 212, 134, 72, 109, 194, 238, 155, 10, + 245, 184, 193, 87, 24, 124, 133, 193, 87, 24, 124, 133, 193, 87, 24, 124, 133, 193, 87, 24, + 124, 133, 193, 55, 24, 124, 131, 193, 55, 24, 124, 131, 193, 55, 24, 124, 131, 193, 55, 24, + 124, 131, 193, 55, 24, 124, 131, 193, 55, 24, 124, 131, 193, 55, 24, 124, 131, 193, 23, 24, + 124, 129, 193, 23, 24, 124, 129, 193, 23, 24, 124, 129, 193, 23, 24, 124, 129, 193, 23, 24, + 124, 129, 193, 23, 24, 124, 129, 161, 122, 52, 84, 143, 49, 62, 33, 166, 122, 140, 201, 37, + 98, 170, 199, 152, 156, 34, 38, 167, 136, 201, 41, 194, 158, 124, 76, 78, 17, 119, 130, 188, + 46, 180, 7, 237, 67, 45, 116, 0, 173, 244, 143, 201, 141, 99, 114, 227, 152, 220, 56, 102, + 37, 132, 221, 206, 152, 220, 56, 38, 55, 142, 153, 223, 152, 149, 17, 147, 27, 199, 228, + 198, 49, 185, 113, 76, 110, 28, 179, 114, 98, 86, 78, 204, 202, 137, 89, 57, 49, 57, 113, + 204, 10, 138, 89, 65, 49, 43, 40, 102, 5, 197, 172, 160, 152, 21, 20, 179, 130, 98, 86, 80, + 204, 10, 138, 89, 65, 49, 251, 46, 113, 151, 125, 8, 95, 118, 70, 194, 41, 225, 180, 112, + 70, 184, 88, 184, 68, 184, 84, 184, 82, 143, 104, 80, 205, 159, 167, 17, 84, 65, 53, 212, + 64, 99, 104, 2, 77, 161, 65, 78, 14, 237, 66, 123, 208, 62, 212, 66, 7, 80, 87, 209, 8, 252, + 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, 252, 8, + 252, 8, 252, 8, 252, 8, 124, 5, 190, 2, 95, 129, 175, 192, 87, 224, 43, 240, 21, 248, 10, + 124, 5, 190, 2, 95, 129, 175, 192, 87, 224, 43, 240, 21, 248, 10, 124, 13, 190, 6, 95, 131, + 175, 193, 215, 224, 107, 240, 53, 248, 26, 124, 13, 190, 6, 95, 131, 175, 193, 215, 224, + 107, 240, 53, 248, 26, 124, 3, 190, 1, 223, 128, 111, 192, 55, 224, 27, 240, 13, 248, 6, + 124, 3, 190, 1, 223, 128, 111, 192, 55, 224, 27, 240, 13, 248, 6, 252, 24, 252, 24, 252, 24, + 252, 24, 252, 24, 252, 24, 252, 24, 252, 24, 252, 24, 252, 24, 252, 24, 252, 24, 252, 24, + 252, 24, 252, 24, 252, 24, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, + 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 4, 252, 20, 252, 20, 252, 20, + 252, 20, 252, 20, 252, 20, 252, 20, 252, 20, 252, 20, 252, 20, 252, 20, 252, 20, 252, 20, + 252, 20, 252, 20, 252, 20, 252, 12, 121, 25, 242, 130, 95, 200, 144, 151, 33, 47, 67, 94, + 134, 188, 12, 121, 25, 242, 50, 228, 229, 140, 39, 103, 60, 57, 227, 201, 25, 79, 206, 120, + 194, 247, 29, 148, 9, 79, 122, 142, 6, 57, 26, 228, 104, 144, 163, 65, 229, 153, 35, 135, + 199, 114, 120, 44, 135, 199, 114, 120, 44, 135, 199, 114, 120, 44, 135, 199, 114, 120, 44, + 135, 199, 114, 120, 44, 135, 199, 114, 157, 32, 191, 15, 181, 208, 1, 180, 26, 161, 195, 99, + 57, 60, 150, 195, 99, 57, 60, 150, 195, 99, 57, 60, 150, 195, 67, 57, 60, 148, 195, 67, 57, + 60, 148, 195, 67, 57, 60, 148, 195, 35, 57, 60, 146, 195, 35, 57, 60, 146, 195, 35, 57, 60, + 146, 195, 35, 57, 60, 146, 195, 35, 57, 60, 146, 195, 35, 57, 60, 146, 195, 35, 57, 21, 240, + 24, 31, 30, 201, 225, 145, 28, 30, 201, 225, 145, 28, 243, 228, 240, 72, 14, 143, 228, 240, + 72, 14, 143, 228, 240, 72, 14, 143, 228, 240, 72, 14, 143, 228, 240, 72, 14, 143, 228, 240, + 72, 14, 143, 228, 240, 72, 14, 143, 228, 240, 72, 14, 143, 228, 240, 72, 14, 143, 228, 240, + 64, 14, 15, 228, 240, 64, 14, 15, 228, 240, 64, 14, 15, 228, 240, 56, 14, 143, 227, 240, 56, + 14, 143, 227, 240, 56, 14, 143, 227, 240, 56, 14, 143, 227, 240, 52, 14, 15, 227, 226, 32, + 23, 253, 241, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, + 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, + 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, + 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 240, 40, 14, 143, 226, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 240, 56, 14, 143, 227, 240, 56, 14, 143, 227, 240, + 56, 14, 143, 227, 240, 56, 46, 11, 120, 140, 23, 143, 227, 240, 56, 14, 143, 227, 240, 56, + 14, 143, 227, 240, 56, 46, 7, 63, 7, 31, 127, 227, 240, 55, 14, 127, 227, 240, 55, 46, 248, + 155, 28, 252, 28, 252, 28, 252, 28, 252, 46, 248, 93, 240, 187, 224, 119, 193, 239, 130, + 223, 5, 191, 11, 126, 23, 252, 46, 248, 93, 240, 187, 224, 119, 193, 239, 130, 223, 5, 191, + 11, 126, 23, 252, 30, 248, 61, 240, 123, 224, 247, 192, 239, 129, 223, 3, 183, 7, 110, 15, + 220, 30, 184, 61, 112, 123, 224, 246, 192, 237, 129, 219, 3, 183, 7, 110, 31, 220, 62, 184, + 125, 112, 251, 224, 246, 193, 237, 131, 219, 7, 183, 15, 110, 31, 220, 62, 184, 125, 112, + 251, 224, 246, 193, 237, 131, 219, 7, 215, 130, 107, 193, 181, 224, 90, 112, 45, 120, 22, + 60, 11, 158, 5, 207, 130, 103, 193, 179, 224, 88, 112, 44, 56, 3, 112, 6, 224, 12, 192, 25, + 128, 51, 96, 124, 3, 230, 117, 0, 238, 0, 220, 1, 184, 3, 112, 7, 224, 14, 192, 29, 48, 206, + 1, 248, 3, 240, 7, 224, 59, 240, 28, 120, 14, 60, 7, 142, 3, 199, 129, 227, 192, 113, 224, + 56, 112, 28, 56, 14, 28, 87, 189, 57, 79, 42, 127, 161, 226, 202, 222, 142, 76, 216, 145, 9, + 59, 50, 97, 79, 67, 109, 33, 95, 170, 245, 92, 120, 231, 21, 222, 88, 177, 195, 204, 78, + 166, 210, 225, 77, 0, 59, 213, 221, 176, 83, 13, 165, 234, 84, 84, 157, 138, 170, 83, 81, + 117, 42, 170, 78, 69, 213, 169, 216, 129, 82, 188, 195, 84, 84, 161, 42, 188, 195, 116, 236, + 192, 59, 118, 224, 29, 59, 221, 124, 15, 67, 57, 244, 112, 236, 128, 177, 115, 21, 190, 149, + 171, 121, 163, 166, 121, 163, 166, 121, 163, 22, 190, 143, 171, 121, 163, 166, 121, 163, + 166, 217, 241, 210, 188, 49, 211, 113, 216, 89, 227, 58, 115, 98, 201, 85, 44, 185, 138, 37, + 87, 177, 228, 42, 150, 92, 197, 146, 171, 88, 114, 21, 75, 174, 98, 59, 65, 78, 14, 237, 66, + 123, 208, 62, 212, 66, 7, 208, 234, 25, 178, 228, 42, 150, 92, 197, 146, 171, 88, 114, 21, + 75, 174, 98, 201, 85, 44, 213, 149, 165, 186, 178, 228, 46, 150, 220, 197, 146, 187, 88, + 114, 23, 75, 238, 98, 201, 93, 44, 213, 149, 165, 186, 178, 228, 50, 150, 92, 198, 146, 203, + 88, 114, 25, 75, 46, 99, 201, 101, 44, 185, 140, 37, 151, 177, 228, 50, 150, 92, 198, 146, + 203, 88, 114, 25, 75, 46, 99, 201, 101, 44, 185, 140, 37, 151, 177, 228, 50, 150, 92, 198, + 146, 203, 88, 114, 25, 75, 46, 99, 201, 101, 44, 185, 140, 37, 151, 177, 228, 50, 150, 92, + 198, 146, 203, 88, 114, 25, 75, 46, 99, 201, 101, 44, 185, 140, 37, 151, 177, 228, 50, 150, + 92, 198, 146, 203, 88, 114, 25, 75, 46, 99, 201, 101, 44, 213, 149, 165, 186, 178, 228, 54, + 150, 220, 198, 146, 219, 88, 114, 27, 75, 110, 99, 201, 109, 44, 213, 149, 165, 186, 178, + 228, 58, 150, 92, 199, 146, 235, 88, 114, 29, 75, 174, 99, 201, 117, 44, 185, 142, 37, 215, + 177, 84, 87, 150, 156, 199, 82, 93, 89, 114, 31, 75, 117, 101, 201, 129, 44, 213, 149, 37, + 23, 178, 228, 66, 150, 92, 200, 146, 11, 89, 114, 33, 75, 46, 100, 201, 133, 44, 185, 144, + 37, 23, 178, 228, 66, 150, 92, 200, 178, 35, 156, 176, 235, 36, 223, 76, 99, 215, 41, 9, + 223, 210, 102, 183, 40, 97, 183, 40, 97, 183, 40, 225, 77, 84, 18, 190, 135, 205, 155, 168, + 36, 124, 11, 155, 55, 81, 9, 235, 61, 9, 223, 255, 141, 131, 231, 203, 3, 242, 32, 236, 20, + 102, 38, 180, 56, 105, 81, 194, 105, 225, 144, 236, 234, 94, 124, 67, 15, 127, 219, 195, + 223, 246, 248, 37, 191, 30, 191, 204, 215, 227, 151, 249, 122, 42, 244, 231, 155, 89, 252, + 50, 95, 47, 124, 39, 84, 101, 225, 123, 203, 158, 75, 133, 227, 251, 83, 17, 223, 175, 138, + 248, 190, 84, 248, 246, 154, 202, 18, 209, 54, 17, 109, 147, 250, 106, 44, 92, 133, 111, + 241, 173, 26, 223, 171, 241, 189, 154, 120, 99, 195, 219, 125, 222, 94, 41, 246, 200, 21, + 111, 175, 148, 14, 215, 241, 209, 188, 189, 82, 188, 189, 82, 188, 189, 82, 216, 85, 133, + 183, 87, 124, 139, 65, 243, 139, 40, 154, 111, 51, 104, 190, 205, 160, 227, 160, 87, 160, + 248, 104, 124, 191, 118, 97, 199, 147, 29, 83, 23, 118, 228, 216, 57, 228, 109, 113, 204, + 94, 114, 204, 94, 114, 204, 94, 114, 194, 142, 100, 194, 219, 197, 4, 61, 18, 244, 72, 208, + 35, 65, 143, 36, 252, 46, 70, 60, 144, 103, 167, 146, 40, 191, 158, 164, 242, 78, 253, 92, + 133, 89, 204, 121, 70, 229, 87, 151, 84, 30, 126, 113, 216, 115, 90, 56, 67, 175, 250, 90, + 34, 92, 42, 92, 70, 47, 185, 79, 9, 182, 18, 249, 188, 15, 77, 195, 247, 110, 125, 75, 205, + 197, 194, 37, 43, 85, 175, 248, 121, 105, 18, 245, 229, 33, 204, 117, 80, 95, 212, 209, 162, + 162, 22, 53, 116, 80, 95, 84, 213, 117, 255, 186, 45, 168, 47, 56, 70, 212, 55, 162, 190, 9, + 234, 139, 14, 38, 72, 239, 74, 75, 48, 125, 79, 90, 130, 236, 126, 104, 169, 167, 165, 54, + 125, 28, 100, 91, 105, 17, 211, 196, 98, 154, 56, 72, 151, 169, 174, 53, 174, 181, 74, 130, + 101, 156, 180, 136, 101, 100, 233, 229, 188, 36, 75, 19, 209, 38, 17, 203, 36, 98, 25, 94, + 149, 165, 137, 104, 154, 74, 255, 180, 110, 67, 251, 26, 39, 21, 237, 83, 209, 158, 215, 96, + 105, 173, 131, 36, 122, 121, 42, 218, 243, 74, 43, 21, 215, 144, 203, 246, 115, 46, 219, + 207, 121, 22, 180, 23, 233, 178, 249, 156, 203, 230, 115, 158, 5, 237, 229, 90, 46, 218, + 231, 162, 125, 30, 180, 151, 251, 114, 193, 150, 237, 163, 60, 15, 218, 139, 206, 121, 205, + 161, 189, 238, 116, 130, 246, 117, 139, 18, 78, 11, 23, 180, 239, 74, 75, 34, 92, 42, 92, + 208, 190, 23, 90, 194, 146, 77, 250, 210, 18, 116, 183, 210, 98, 132, 139, 133, 11, 225, + 142, 48, 74, 73, 111, 41, 233, 45, 37, 189, 165, 164, 183, 148, 244, 150, 146, 222, 82, 210, + 91, 74, 122, 75, 73, 111, 41, 233, 45, 37, 189, 165, 164, 183, 148, 244, 150, 146, 222, 82, + 210, 91, 74, 122, 75, 73, 111, 217, 36, 180, 108, 18, 90, 74, 124, 75, 137, 111, 41, 241, + 45, 37, 190, 165, 196, 183, 148, 248, 150, 18, 223, 82, 226, 91, 74, 124, 75, 137, 111, 41, + 241, 45, 37, 190, 165, 196, 183, 148, 248, 150, 18, 223, 82, 226, 91, 74, 124, 75, 137, 111, + 41, 241, 45, 37, 190, 165, 196, 183, 148, 248, 150, 18, 223, 82, 226, 91, 74, 124, 75, 137, + 111, 41, 241, 45, 37, 190, 165, 196, 183, 148, 248, 150, 18, 223, 82, 226, 91, 74, 124, 75, + 137, 111, 41, 241, 45, 37, 190, 165, 196, 183, 148, 248, 150, 18, 223, 82, 226, 91, 74, 124, + 75, 137, 111, 41, 241, 45, 37, 190, 165, 196, 183, 148, 248, 150, 18, 223, 82, 226, 91, 74, + 124, 75, 137, 111, 41, 241, 45, 37, 190, 165, 196, 183, 61, 240, 41, 245, 45, 165, 190, 165, + 212, 183, 148, 250, 150, 82, 223, 82, 234, 91, 74, 125, 75, 169, 111, 41, 245, 45, 165, 190, + 165, 212, 183, 148, 250, 150, 82, 223, 86, 165, 190, 234, 196, 124, 25, 59, 231, 75, 216, + 57, 95, 234, 206, 73, 58, 114, 250, 85, 243, 164, 58, 61, 218, 123, 180, 247, 66, 123, 245, + 229, 239, 65, 8, 96, 90, 254, 22, 134, 142, 26, 109, 153, 112, 97, 53, 203, 223, 194, 208, + 242, 183, 48, 180, 252, 45, 12, 45, 127, 11, 67, 203, 223, 194, 208, 242, 183, 48, 60, 39, + 24, 74, 48, 148, 96, 40, 193, 208, 130, 161, 5, 67, 11, 134, 22, 12, 45, 24, 90, 48, 180, + 96, 104, 193, 208, 130, 161, 5, 195, 8, 134, 17, 12, 35, 24, 70, 48, 140, 96, 24, 193, 48, + 130, 97, 4, 195, 8, 134, 201, 63, 107, 189, 252, 197, 175, 219, 191, 190, 115, 81, 159, 185, + 235, 201, 159, 151, 228, 147, 135, 190, 174, 126, 90, 208, 245, 141, 146, 222, 89, 213, 167, + 187, 207, 181, 127, 221, 218, 243, 199, 71, 254, 248, 141, 63, 22, 90, 175, 250, 243, 219, + 180, 180, 91, 71, 253, 249, 180, 63, 138, 214, 247, 202, 235, 191, 108, 255, 99, 235, 182, + 63, 126, 237, 143, 255, 225, 143, 162, 229, 51, 223, 242, 153, 111, 249, 204, 183, 124, 230, + 91, 78, 183, 239, 182, 230, 218, 255, 169, 253, 15, 119, 190, 126, 212, 67, 255, 234, 147, + 63, 253, 186, 250, 67, 247, 43, 237, 79, 90, 95, 248, 99, 190, 253, 111, 218, 239, 180, 142, + 123, 217, 63, 130, 190, 10, 125, 207, 211, 111, 122, 250, 115, 232, 187, 237, 119, 238, 60, + 127, 244, 112, 119, 213, 127, 158, 107, 253, 193, 159, 191, 240, 199, 188, 31, 219, 7, 119, + 206, 94, 80, 159, 150, 76, 122, 170, 100, 222, 15, 45, 239, 127, 226, 91, 142, 118, 255, + 180, 253, 129, 215, 234, 3, 175, 213, 7, 94, 171, 15, 188, 86, 127, 240, 231, 57, 47, 245, + 125, 223, 254, 190, 111, 127, 223, 183, 191, 95, 182, 191, 223, 154, 43, 69, 29, 127, 26, + 81, 48, 31, 220, 57, 252, 101, 90, 60, 211, 93, 107, 95, 110, 127, 191, 165, 188, 136, 75, + 208, 87, 218, 223, 191, 163, 142, 126, 222, 125, 173, 125, 209, 139, 254, 168, 60, 255, 178, + 253, 178, 63, 191, 87, 158, 95, 45, 207, 23, 202, 243, 219, 229, 213, 183, 75, 126, 82, 242, + 147, 146, 63, 93, 242, 167, 225, 139, 243, 115, 141, 243, 209, 242, 124, 184, 56, 23, 255, + 127, 224, 214, 211, 190, 229, 175, 218, 47, 148, 244, 197, 246, 160, 245, 13, 79, 47, 248, + 207, 5, 253, 110, 251, 92, 73, 255, 178, 125, 182, 164, 127, 225, 219, 31, 243, 244, 188, + 239, 247, 136, 167, 47, 180, 93, 249, 249, 156, 255, 108, 61, 253, 142, 255, 92, 208, 179, + 109, 119, 199, 30, 237, 116, 247, 252, 231, 87, 253, 181, 121, 143, 87, 180, 91, 175, 131, + 245, 58, 89, 111, 164, 162, 229, 61, 127, 252, 210, 31, 191, 43, 91, 94, 245, 231, 183, 253, + 241, 27, 127, 180, 203, 158, 115, 109, 235, 127, 250, 254, 167, 219, 238, 250, 59, 206, 120, + 25, 103, 252, 149, 51, 173, 118, 251, 140, 255, 57, 237, 127, 190, 221, 254, 182, 191, 242, + 45, 223, 247, 91, 254, 124, 166, 125, 170, 28, 227, 41, 223, 235, 148, 71, 58, 229, 109, + 117, 202, 75, 62, 229, 167, 231, 148, 159, 158, 83, 173, 229, 246, 41, 127, 62, 214, 142, + 91, 29, 127, 156, 241, 199, 139, 254, 120, 205, 31, 139, 94, 206, 51, 254, 190, 103, 188, + 94, 207, 120, 132, 103, 218, 207, 182, 190, 238, 101, 29, 159, 255, 89, 235, 81, 79, 143, + 65, 143, 206, 191, 211, 122, 220, 211, 199, 231, 223, 185, 243, 248, 209, 51, 221, 213, 249, + 95, 181, 94, 244, 199, 107, 254, 216, 243, 199, 79, 231, 127, 117, 103, 241, 145, 195, 221, + 71, 125, 191, 162, 239, 115, 254, 184, 224, 143, 87, 253, 241, 182, 63, 126, 225, 143, 143, + 252, 177, 210, 58, 93, 93, 57, 179, 62, 127, 122, 254, 116, 251, 194, 252, 133, 246, 130, + 127, 186, 159, 254, 228, 212, 41, 85, 82, 157, 84, 244, 159, 125, 173, 162, 135, 190, 162, + 14, 119, 247, 219, 79, 123, 51, 61, 221, 250, 133, 63, 218, 94, 229, 167, 189, 202, 79, 251, + 161, 134, 79, 71, 253, 49, 239, 31, 157, 39, 91, 159, 251, 227, 55, 254, 248, 157, 63, 10, + 131, 63, 233, 141, 241, 164, 55, 198, 147, 126, 128, 79, 250, 251, 159, 44, 123, 45, 149, + 253, 254, 224, 143, 47, 252, 209, 246, 15, 209, 147, 94, 254, 189, 125, 22, 203, 187, 143, + 250, 227, 185, 134, 148, 162, 245, 41, 223, 242, 148, 255, 244, 148, 191, 231, 41, 223, 247, + 41, 223, 250, 59, 127, 158, 43, 239, 40, 174, 191, 232, 143, 247, 252, 241, 57, 215, 158, + 40, 31, 230, 39, 202, 135, 243, 9, 47, 235, 9, 175, 237, 115, 254, 124, 186, 228, 14, 251, + 243, 209, 246, 19, 119, 230, 87, 15, 223, 245, 246, 157, 251, 243, 195, 221, 212, 219, 253, + 130, 63, 252, 197, 249, 119, 189, 53, 223, 245, 118, 123, 183, 120, 66, 230, 139, 69, 252, + 156, 191, 114, 154, 30, 239, 249, 227, 35, 127, 44, 182, 63, 245, 63, 79, 251, 159, 39, 203, + 255, 179, 246, 83, 237, 39, 252, 207, 113, 255, 115, 204, 255, 248, 25, 108, 63, 238, 103, + 239, 231, 254, 231, 61, 255, 243, 119, 254, 231, 93, 255, 243, 51, 255, 243, 142, 159, 141, + 71, 63, 58, 249, 249, 201, 249, 87, 227, 73, 252, 118, 252, 94, 252, 139, 248, 163, 248, + 243, 120, 249, 31, 231, 135, 254, 231, 181, 249, 215, 206, 172, 181, 190, 252, 229, 86, 171, + 245, 200, 195, 43, 95, 233, 30, 153, 95, 104, 93, 105, 109, 204, 253, 223, 242, 252, 97, + 121, 222, 47, 207, 103, 202, 243, 159, 156, 249, 202, 149, 141, 255, 117, 101, 227, 191, 93, + 217, 248, 247, 87, 54, 254, 237, 149, 141, 75, 87, 54, 190, 123, 101, 195, 93, 217, 120, + 238, 202, 198, 221, 185, 171, 103, 254, 228, 228, 198, 255, 60, 185, 241, 243, 147, 27, 223, + 63, 185, 145, 156, 220, 136, 79, 110, 232, 147, 27, 79, 159, 220, 232, 62, 60, 119, 121, + 238, 149, 214, 70, 235, 191, 150, 231, 94, 121, 86, 229, 249, 137, 242, 252, 181, 185, 87, + 238, 108, 180, 86, 255, 243, 220, 15, 91, 199, 87, 252, 19, 63, 247, 228, 175, 142, 255, + 139, 163, 255, 251, 248, 221, 133, 185, 59, 71, 255, 213, 241, 187, 43, 158, 252, 203, 234, + 211, 15, 43, 242, 124, 209, 248, 15, 71, 59, 199, 183, 142, 62, 83, 181, 252, 89, 69, 190, + 126, 252, 191, 44, 120, 9, 173, 139, 115, 255, 177, 181, 60, 119, 242, 204, 51, 203, 255, + 125, 249, 213, 229, 51, 203, 249, 242, 63, 95, 126, 118, 249, 169, 229, 39, 151, 79, 44, 31, + 93, 126, 116, 229, 145, 149, 35, 43, 15, 173, 28, 90, 89, 91, 89, 89, 89, 90, 89, 88, 153, + 95, 105, 173, 60, 122, 247, 139, 223, 159, 57, 217, 242, 243, 240, 232, 210, 145, 130, 44, + 45, 20, 231, 133, 146, 63, 50, 95, 156, 253, 201, 159, 91, 243, 115, 43, 243, 173, 23, 90, + 183, 191, 212, 62, 63, 127, 254, 165, 222, 220, 249, 219, 191, 190, 214, 58, 127, 245, 216, + 237, 255, 243, 210, 137, 187, 115, 107, 127, 245, 131, 219, 139, 39, 122, 115, 183, 31, 57, + 223, 58, 255, 114, 239, 177, 219, 233, 201, 243, 119, 151, 191, 248, 222, 237, 236, 228, + 249, 219, 171, 47, 254, 240, 210, 199, 115, 115, 127, 119, 217, 127, 186, 61, 255, 183, 119, + 231, 90, 47, 95, 186, 59, 247, 69, 209, 244, 55, 95, 189, 253, 72, 255, 210, 167, 173, 185, + 185, 103, 254, 230, 221, 175, 66, 47, 95, 46, 238, 185, 244, 241, 194, 220, 187, 239, 94, + 110, 125, 249, 214, 233, 199, 78, 63, 242, 237, 135, 115, 103, 31, 112, 122, 141, 243, 201, + 250, 223, 99, 39, 155, 31, 188, 38, 95, 187, 253, 239, 206, 191, 116, 233, 246, 127, 248, + 218, 229, 219, 170, 96, 190, 248, 218, 229, 243, 222, 114, 47, 29, 187, 114, 233, 211, 249, + 108, 62, 25, 216, 79, 231, 211, 130, 92, 190, 244, 233, 218, 79, 231, 179, 193, 247, 138, + 246, 181, 159, 218, 203, 117, 191, 214, 49, 223, 110, 63, 109, 29, 47, 72, 217, 175, 117, + 172, 232, 215, 58, 118, 95, 191, 199, 231, 211, 162, 223, 55, 10, 82, 245, 123, 188, 236, + 247, 248, 61, 253, 62, 254, 214, 241, 129, 253, 248, 248, 241, 208, 231, 91, 101, 159, 111, + 221, 219, 103, 235, 222, 62, 91, 101, 159, 45, 250, 180, 171, 62, 199, 27, 125, 150, 127, + 223, 58, 94, 246, 57, 190, 252, 251, 63, 234, 243, 248, 63, 161, 207, 55, 30, 216, 167, 97, + 205, 81, 239, 228, 255, 231, 223, 220, 167, 173, 23, 230, 126, 251, 113, 255, 173, 193, 232, + 196, 224, 181, 19, 131, 145, 63, 94, 187, 253, 206, 173, 237, 199, 110, 255, 244, 234, 177, + 99, 159, 182, 250, 115, 191, 45, 46, 29, 187, 221, 254, 179, 215, 174, 94, 219, 46, 232, + 112, 116, 119, 238, 183, 39, 70, 246, 118, 255, 132, 61, 246, 241, 11, 111, 253, 241, 245, + 219, 111, 21, 151, 95, 56, 97, 63, 110, 189, 53, 120, 249, 210, 199, 111, 157, 25, 217, 59, + 47, 156, 121, 97, 112, 98, 104, 47, 127, 114, 118, 248, 205, 15, 239, 129, 251, 215, 1, 238, + 227, 111, 14, 31, 32, 108, 88, 8, 251, 102, 129, 117, 246, 195, 7, 92, 254, 176, 184, 124, + 182, 192, 250, 176, 192, 250, 176, 192, 58, 123, 230, 108, 137, 85, 62, 245, 254, 177, 92, + 105, 245, 46, 247, 175, 84, 244, 147, 249, 245, 53, 255, 0, 191, 246, 213, 227, 151, 123, + 95, 62, 178, 247, 237, 242, 105, 126, 254, 248, 99, 127, 253, 213, 207, 22, 90, 115, 127, + 223, 90, 63, 121, 249, 246, 161, 19, 189, 219, 27, 254, 40, 46, 61, 219, 125, 182, 91, 92, + 242, 171, 172, 184, 244, 144, 111, 62, 204, 165, 199, 254, 250, 249, 227, 95, 253, 108, 238, + 239, 185, 116, 196, 55, 63, 124, 162, 215, 122, 108, 48, 182, 254, 191, 233, 20, 230, 159, + 248, 223, 116, 58, 157, 253, 104, 250, 163, 105, 65, 203, 255, 166, 179, 3, 127, 20, 211, + 212, 154, 182, 166, 179, 150, 31, 65, 247, 80, 25, 223, 142, 122, 111, 92, 248, 230, 119, + 252, 241, 179, 210, 71, 183, 167, 211, 203, 179, 86, 57, 167, 211, 131, 86, 33, 109, 86, + 156, 106, 225, 194, 29, 120, 201, 115, 211, 230, 67, 208, 154, 222, 255, 175, 120, 50, 78, + 182, 170, 195, 139, 155, 30, 204, 249, 94, 69, 199, 3, 30, 155, 233, 156, 191, 232, 197, + 180, 10, 37, 171, 182, 255, 7, 25, 56, 86, 209, 13, 10, 101, 110, 100, 115, 116, 114, 101, + 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 48, 57, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 70, 105, 114, 115, 116, 32, 49, 52, 47, 76, 101, 110, 103, 116, 104, 32, 49, 57, 55, 47, + 78, 32, 50, 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, + 101, 97, 109, 13, 10, 104, 222, 236, 142, 65, 11, 130, 64, 16, 133, 255, 202, 220, 67, 102, + 103, 183, 214, 13, 34, 72, 67, 234, 144, 68, 43, 17, 68, 7, 137, 193, 22, 76, 197, 54, 170, + 127, 159, 89, 255, 34, 15, 223, 97, 102, 222, 188, 247, 72, 143, 65, 0, 233, 9, 208, 116, + 10, 179, 25, 46, 110, 103, 174, 60, 104, 82, 24, 175, 151, 150, 61, 144, 8, 59, 201, 14, + 227, 188, 89, 177, 43, 46, 30, 38, 33, 225, 146, 191, 194, 128, 140, 193, 164, 204, 139, 27, + 40, 133, 73, 93, 249, 40, 170, 159, 199, 128, 164, 132, 64, 27, 1, 90, 170, 206, 66, 210, + 169, 63, 38, 174, 100, 217, 205, 166, 183, 252, 108, 210, 252, 202, 152, 164, 153, 141, 236, + 40, 174, 239, 173, 227, 54, 229, 199, 214, 110, 50, 92, 251, 188, 116, 231, 69, 85, 148, 12, + 2, 173, 231, 235, 30, 76, 136, 217, 171, 225, 254, 245, 211, 161, 117, 141, 175, 91, 60, + 252, 170, 141, 165, 154, 207, 143, 90, 116, 185, 3, 3, 3, 255, 200, 233, 45, 192, 0, 101, + 209, 245, 121, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, + 98, 106, 13, 49, 49, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, + 110, 116, 115, 32, 49, 49, 49, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, + 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, + 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 53, + 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, + 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, + 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, + 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, + 116, 80, 97, 114, 101, 110, 116, 115, 32, 53, 48, 47, 84, 121, 112, 101, 47, 80, 97, 103, + 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 49, 49, 49, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, + 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 57, 50, 48, 62, 62, 115, 116, 114, 101, 97, + 109, 13, 10, 72, 137, 172, 87, 219, 110, 220, 70, 18, 125, 215, 87, 240, 113, 184, 240, 208, + 211, 77, 114, 72, 2, 65, 0, 219, 242, 122, 189, 64, 176, 139, 120, 222, 172, 60, 88, 26, + 143, 164, 100, 44, 13, 116, 89, 103, 255, 126, 187, 174, 93, 221, 36, 71, 146, 179, 8, 34, + 15, 187, 171, 171, 171, 235, 114, 234, 212, 235, 127, 127, 185, 123, 40, 126, 250, 233, 245, + 47, 239, 62, 158, 22, 171, 226, 231, 159, 223, 158, 190, 43, 78, 222, 110, 78, 86, 5, 252, + 119, 119, 121, 242, 122, 179, 89, 21, 206, 23, 155, 221, 201, 170, 26, 134, 161, 199, 13, + 87, 248, 161, 169, 134, 117, 209, 121, 95, 53, 197, 230, 219, 201, 231, 69, 83, 174, 23, + 125, 249, 219, 230, 159, 112, 198, 21, 174, 174, 6, 60, 230, 124, 229, 27, 31, 14, 109, 182, + 39, 139, 162, 220, 252, 126, 178, 116, 131, 175, 86, 117, 95, 44, 221, 186, 170, 125, 220, + 160, 131, 116, 170, 95, 7, 145, 174, 88, 174, 219, 85, 181, 110, 114, 25, 81, 190, 84, 185, + 121, 85, 141, 175, 58, 63, 20, 235, 214, 85, 14, 37, 62, 47, 46, 74, 191, 216, 151, 253, + 226, 107, 185, 244, 139, 47, 229, 210, 45, 238, 194, 23, 254, 184, 41, 27, 220, 134, 45, + 191, 120, 85, 14, 65, 95, 48, 184, 89, 220, 134, 247, 61, 134, 205, 135, 114, 217, 46, 238, + 203, 229, 176, 184, 14, 27, 110, 177, 13, 107, 168, 135, 229, 112, 255, 42, 91, 60, 132, + 239, 199, 240, 179, 197, 139, 254, 83, 46, 251, 112, 154, 239, 255, 14, 7, 204, 37, 59, 148, + 227, 133, 15, 112, 209, 39, 48, 108, 19, 182, 42, 56, 200, 59, 31, 225, 55, 88, 171, 71, + 151, 174, 70, 245, 98, 145, 199, 47, 107, 22, 168, 15, 223, 222, 53, 184, 133, 215, 127, 3, + 229, 176, 129, 86, 29, 123, 9, 196, 118, 21, 60, 221, 96, 64, 78, 131, 31, 225, 38, 241, + 203, 121, 226, 27, 80, 17, 110, 81, 151, 110, 217, 80, 89, 195, 91, 225, 8, 184, 225, 18, + 78, 144, 123, 224, 19, 181, 168, 123, 172, 58, 53, 26, 79, 104, 224, 182, 172, 7, 46, 186, + 52, 226, 168, 232, 75, 25, 130, 244, 103, 185, 236, 72, 94, 238, 220, 99, 240, 244, 186, + 255, 130, 0, 31, 163, 32, 168, 189, 247, 100, 29, 165, 197, 85, 92, 199, 115, 73, 222, 220, + 171, 85, 32, 170, 207, 0, 125, 186, 253, 58, 108, 55, 236, 204, 205, 223, 130, 15, 199, 242, + 154, 30, 51, 142, 168, 201, 157, 96, 18, 92, 79, 105, 152, 188, 189, 158, 74, 195, 154, 210, + 16, 191, 233, 92, 207, 73, 35, 193, 9, 18, 171, 96, 171, 147, 76, 131, 143, 78, 62, 60, 138, + 202, 126, 71, 153, 164, 55, 113, 102, 185, 182, 89, 212, 185, 10, 254, 240, 160, 99, 173, + 43, 3, 234, 147, 2, 99, 227, 238, 240, 45, 154, 141, 96, 34, 151, 154, 216, 170, 142, 204, + 93, 168, 185, 1, 9, 222, 81, 62, 226, 119, 158, 25, 176, 41, 107, 224, 247, 88, 56, 135, + 210, 150, 17, 106, 197, 199, 161, 26, 118, 18, 156, 78, 106, 41, 124, 99, 50, 163, 248, 31, + 42, 110, 69, 109, 24, 124, 107, 243, 228, 154, 179, 151, 165, 193, 128, 20, 142, 238, 141, + 209, 168, 2, 18, 115, 39, 250, 198, 105, 99, 239, 222, 113, 130, 128, 165, 104, 162, 113, + 217, 177, 56, 67, 140, 192, 9, 206, 46, 115, 144, 254, 129, 14, 91, 19, 104, 225, 101, 241, + 90, 184, 203, 196, 243, 134, 193, 129, 63, 53, 62, 132, 111, 144, 189, 22, 24, 106, 113, + 253, 46, 46, 112, 253, 46, 185, 126, 77, 158, 228, 206, 131, 117, 116, 213, 149, 108, 238, + 177, 198, 213, 238, 243, 172, 18, 80, 6, 77, 87, 85, 123, 241, 57, 200, 238, 77, 54, 129, + 188, 20, 25, 65, 115, 68, 194, 190, 39, 36, 132, 72, 196, 128, 37, 245, 10, 104, 251, 61, + 73, 131, 36, 85, 107, 131, 146, 130, 66, 62, 62, 222, 245, 250, 120, 88, 213, 247, 221, 151, + 110, 149, 156, 7, 139, 85, 49, 174, 108, 51, 141, 231, 165, 163, 190, 70, 127, 184, 119, + 248, 25, 151, 250, 90, 202, 132, 219, 145, 183, 65, 196, 199, 29, 70, 121, 200, 98, 6, 65, + 125, 61, 66, 80, 223, 44, 166, 154, 201, 143, 226, 41, 222, 218, 13, 205, 203, 145, 20, 14, + 69, 36, 149, 126, 96, 177, 162, 155, 106, 232, 221, 48, 137, 164, 235, 160, 139, 93, 5, 18, + 79, 85, 24, 236, 66, 190, 51, 146, 234, 77, 84, 5, 166, 84, 231, 240, 52, 47, 213, 129, 97, + 86, 90, 181, 161, 110, 203, 186, 171, 154, 38, 176, 36, 47, 100, 234, 243, 226, 109, 21, + 228, 27, 188, 156, 216, 70, 195, 191, 198, 95, 237, 226, 87, 98, 68, 174, 11, 54, 66, 187, + 95, 2, 68, 6, 99, 111, 224, 23, 8, 132, 162, 134, 116, 105, 67, 26, 182, 248, 47, 238, 4, + 55, 146, 126, 60, 129, 75, 91, 248, 243, 181, 244, 116, 30, 246, 62, 192, 202, 39, 200, 211, + 13, 45, 121, 23, 95, 32, 36, 78, 30, 192, 249, 2, 15, 64, 86, 52, 134, 193, 36, 59, 192, + 177, 212, 145, 58, 219, 110, 112, 13, 190, 193, 103, 175, 194, 175, 21, 175, 54, 232, 19, + 10, 0, 124, 231, 252, 37, 4, 169, 13, 34, 158, 98, 54, 36, 153, 30, 196, 223, 193, 43, 82, + 202, 70, 27, 111, 146, 212, 180, 55, 142, 225, 86, 111, 246, 177, 169, 121, 94, 157, 109, + 106, 157, 229, 85, 90, 222, 202, 77, 183, 6, 184, 48, 169, 146, 166, 61, 42, 108, 45, 69, + 184, 198, 22, 55, 244, 247, 93, 41, 112, 184, 103, 137, 132, 123, 180, 57, 139, 181, 218, + 81, 79, 44, 183, 188, 138, 21, 198, 35, 242, 199, 6, 156, 62, 45, 165, 154, 57, 13, 17, 80, + 228, 223, 210, 160, 61, 119, 18, 48, 26, 215, 192, 148, 111, 70, 208, 148, 181, 192, 193, + 109, 233, 163, 255, 70, 125, 42, 117, 232, 85, 105, 222, 170, 237, 163, 99, 24, 78, 167, 13, + 181, 125, 186, 83, 227, 250, 152, 196, 117, 17, 177, 190, 150, 174, 179, 107, 153, 187, 120, + 199, 146, 217, 78, 130, 215, 79, 135, 110, 44, 62, 105, 128, 190, 80, 155, 100, 108, 164, + 26, 154, 92, 214, 68, 62, 142, 45, 65, 128, 34, 175, 110, 124, 118, 244, 3, 64, 49, 47, 233, + 230, 240, 174, 31, 227, 93, 251, 76, 188, 251, 136, 32, 18, 112, 233, 0, 127, 16, 189, 30, + 24, 22, 90, 130, 169, 47, 0, 109, 127, 82, 172, 218, 80, 248, 61, 1, 26, 32, 27, 66, 28, 96, + 224, 3, 223, 134, 224, 120, 203, 105, 69, 23, 128, 28, 158, 62, 8, 30, 70, 116, 188, 70, + 115, 82, 160, 5, 9, 56, 167, 31, 128, 179, 104, 3, 200, 233, 173, 5, 222, 10, 134, 222, 82, + 192, 200, 52, 68, 215, 128, 225, 195, 226, 255, 0, 172, 132, 54, 130, 86, 103, 11, 108, 11, + 224, 216, 179, 178, 20, 156, 250, 33, 88, 164, 181, 107, 83, 27, 127, 9, 241, 228, 118, 11, + 12, 200, 177, 125, 44, 54, 37, 8, 91, 147, 227, 54, 239, 99, 22, 70, 235, 224, 158, 3, 23, + 225, 3, 48, 250, 17, 14, 36, 156, 181, 35, 222, 163, 149, 32, 211, 170, 209, 58, 75, 93, + 135, 72, 163, 141, 248, 121, 106, 236, 60, 151, 245, 99, 50, 59, 196, 55, 208, 233, 103, 80, + 186, 46, 227, 230, 29, 71, 33, 64, 99, 109, 70, 72, 19, 53, 48, 248, 142, 158, 32, 207, 83, + 182, 164, 62, 191, 40, 125, 198, 199, 228, 32, 96, 175, 241, 233, 185, 117, 193, 21, 217, + 208, 26, 203, 69, 145, 207, 230, 160, 173, 138, 158, 27, 42, 220, 198, 222, 208, 142, 102, + 140, 209, 0, 224, 89, 46, 33, 124, 247, 244, 250, 53, 147, 99, 102, 21, 173, 242, 124, 88, + 148, 23, 70, 123, 211, 150, 206, 139, 143, 165, 241, 143, 53, 217, 122, 2, 190, 101, 2, 105, + 12, 40, 78, 101, 124, 59, 199, 35, 147, 17, 40, 191, 89, 7, 41, 110, 240, 38, 128, 174, 253, + 1, 106, 237, 218, 172, 79, 196, 66, 154, 98, 12, 73, 243, 110, 105, 204, 177, 64, 32, 172, + 66, 34, 3, 123, 151, 58, 29, 24, 136, 130, 55, 91, 246, 39, 15, 77, 60, 101, 30, 118, 129, + 243, 44, 156, 130, 197, 67, 217, 152, 175, 81, 67, 77, 187, 20, 216, 3, 199, 175, 69, 116, + 31, 213, 142, 139, 42, 161, 165, 112, 228, 92, 179, 100, 175, 92, 3, 47, 147, 60, 77, 136, + 211, 206, 218, 30, 89, 161, 68, 45, 231, 63, 109, 82, 229, 74, 171, 230, 64, 221, 144, 27, + 192, 117, 226, 198, 109, 228, 82, 73, 245, 235, 101, 9, 47, 168, 25, 230, 149, 194, 232, 76, + 121, 195, 177, 20, 127, 36, 180, 41, 39, 198, 3, 246, 172, 148, 20, 215, 60, 216, 72, 54, + 63, 103, 176, 89, 63, 179, 209, 99, 103, 188, 130, 214, 137, 205, 244, 142, 252, 146, 143, + 47, 183, 20, 130, 37, 157, 213, 253, 172, 175, 127, 163, 23, 83, 75, 190, 150, 99, 55, 165, + 123, 94, 219, 125, 35, 196, 143, 178, 21, 221, 245, 93, 248, 194, 209, 240, 53, 124, 204, + 49, 195, 233, 195, 255, 70, 155, 205, 132, 185, 102, 236, 38, 154, 177, 203, 106, 240, 72, + 51, 54, 183, 164, 96, 31, 203, 135, 82, 181, 37, 234, 118, 171, 183, 42, 142, 141, 144, 151, + 5, 210, 222, 40, 67, 9, 95, 174, 140, 6, 147, 201, 146, 215, 137, 28, 173, 163, 145, 187, + 164, 208, 101, 60, 152, 68, 18, 232, 75, 40, 255, 136, 101, 66, 244, 85, 74, 87, 141, 227, + 39, 246, 198, 81, 90, 199, 211, 166, 104, 105, 95, 10, 34, 68, 238, 171, 238, 75, 160, 121, + 52, 158, 152, 54, 212, 140, 99, 93, 79, 192, 232, 152, 144, 167, 111, 34, 103, 174, 170, + 213, 202, 37, 185, 105, 218, 129, 140, 86, 7, 60, 112, 192, 128, 9, 126, 65, 246, 228, 126, + 52, 248, 82, 103, 163, 225, 19, 94, 72, 49, 120, 90, 155, 132, 144, 190, 95, 50, 59, 90, + 123, 26, 243, 21, 89, 221, 119, 85, 116, 199, 12, 209, 220, 242, 200, 36, 48, 117, 64, 196, + 252, 200, 9, 38, 41, 205, 24, 64, 77, 127, 138, 47, 16, 46, 103, 2, 72, 23, 131, 15, 246, + 236, 17, 148, 148, 195, 54, 93, 178, 44, 140, 188, 68, 103, 204, 134, 131, 145, 144, 13, + 199, 117, 173, 254, 210, 116, 60, 18, 13, 151, 197, 22, 75, 219, 57, 195, 163, 20, 90, 238, + 202, 8, 92, 196, 106, 46, 104, 112, 24, 12, 201, 65, 126, 113, 139, 64, 42, 76, 209, 153, + 40, 141, 28, 250, 62, 136, 45, 195, 70, 12, 154, 188, 124, 32, 71, 136, 43, 165, 75, 187, + 132, 228, 12, 166, 89, 153, 131, 9, 235, 180, 220, 97, 152, 9, 215, 146, 159, 44, 1, 27, 26, + 91, 160, 195, 4, 20, 12, 66, 66, 184, 111, 226, 159, 244, 204, 193, 196, 168, 55, 215, 193, + 69, 156, 103, 3, 115, 79, 101, 17, 76, 59, 229, 153, 249, 35, 50, 239, 161, 185, 248, 238, + 251, 210, 173, 242, 194, 225, 199, 180, 6, 93, 90, 225, 208, 173, 65, 207, 155, 178, 73, + 243, 133, 199, 81, 47, 196, 164, 77, 73, 40, 85, 79, 202, 149, 100, 84, 34, 87, 170, 248, + 54, 239, 252, 65, 193, 230, 247, 249, 254, 223, 61, 179, 255, 191, 161, 7, 116, 225, 22, 79, + 77, 125, 11, 127, 210, 37, 232, 231, 247, 242, 92, 238, 254, 200, 70, 90, 90, 6, 193, 11, + 202, 132, 164, 241, 47, 107, 190, 209, 179, 53, 23, 196, 134, 91, 162, 9, 143, 32, 160, 10, + 96, 255, 108, 1, 89, 239, 152, 191, 156, 149, 240, 53, 230, 31, 31, 17, 245, 62, 192, 105, + 164, 47, 27, 33, 9, 111, 228, 10, 176, 227, 21, 121, 89, 200, 212, 58, 168, 133, 99, 93, + 233, 214, 51, 116, 164, 79, 32, 31, 121, 130, 50, 247, 116, 88, 40, 224, 253, 13, 152, 235, + 173, 181, 186, 97, 80, 213, 63, 197, 61, 85, 138, 156, 20, 146, 101, 116, 254, 35, 248, 97, + 68, 89, 96, 103, 196, 89, 124, 157, 118, 60, 47, 237, 42, 237, 0, 249, 208, 228, 51, 2, 237, + 109, 107, 210, 81, 103, 228, 0, 83, 85, 174, 179, 245, 164, 250, 119, 165, 244, 100, 194, + 94, 55, 253, 254, 198, 165, 173, 40, 148, 243, 153, 247, 181, 152, 43, 108, 36, 148, 230, + 82, 138, 249, 200, 204, 74, 42, 106, 67, 98, 246, 90, 81, 88, 159, 124, 133, 190, 144, 198, + 24, 216, 62, 88, 178, 174, 189, 50, 216, 210, 168, 222, 134, 71, 23, 129, 201, 68, 147, 162, + 151, 58, 205, 210, 196, 122, 2, 0, 133, 112, 248, 36, 251, 4, 18, 41, 88, 210, 183, 166, 92, + 55, 36, 158, 235, 178, 87, 49, 91, 149, 167, 73, 154, 116, 249, 161, 216, 203, 50, 87, 241, + 179, 59, 203, 29, 45, 26, 63, 201, 29, 77, 99, 225, 100, 107, 107, 252, 21, 150, 189, 51, + 177, 60, 23, 142, 43, 105, 230, 236, 249, 139, 210, 60, 8, 65, 90, 82, 188, 179, 141, 76, + 51, 48, 229, 121, 66, 155, 99, 62, 39, 19, 171, 203, 105, 187, 70, 207, 92, 201, 12, 196, 9, + 123, 214, 222, 233, 24, 200, 35, 153, 148, 129, 55, 42, 181, 199, 103, 155, 170, 179, 84, + 89, 189, 198, 27, 121, 147, 244, 46, 158, 85, 43, 185, 27, 58, 103, 171, 110, 91, 54, 17, + 191, 212, 29, 74, 140, 220, 12, 163, 24, 241, 129, 238, 136, 233, 29, 145, 12, 189, 70, 146, + 37, 62, 126, 50, 92, 212, 221, 27, 166, 68, 144, 54, 187, 241, 161, 44, 225, 187, 38, 18, + 127, 147, 32, 70, 191, 69, 178, 78, 46, 128, 215, 37, 133, 73, 101, 101, 18, 60, 11, 171, + 40, 154, 0, 154, 200, 115, 180, 42, 51, 39, 9, 15, 84, 111, 254, 43, 208, 55, 196, 241, 83, + 144, 70, 220, 254, 149, 27, 198, 240, 116, 246, 177, 88, 116, 85, 242, 142, 12, 203, 135, + 148, 249, 250, 41, 110, 39, 218, 244, 206, 124, 150, 2, 1, 33, 216, 233, 88, 147, 223, 101, + 70, 46, 248, 188, 41, 5, 77, 218, 103, 129, 181, 98, 32, 226, 95, 223, 23, 155, 83, 153, 15, + 212, 184, 59, 235, 105, 9, 81, 120, 138, 239, 152, 18, 219, 136, 215, 250, 220, 56, 40, 61, + 34, 51, 147, 242, 124, 209, 216, 89, 207, 59, 106, 98, 140, 147, 136, 121, 84, 61, 221, 4, + 38, 72, 112, 203, 41, 160, 67, 79, 54, 109, 61, 3, 152, 234, 4, 104, 205, 48, 171, 125, 5, + 252, 250, 116, 72, 93, 18, 81, 55, 97, 172, 155, 47, 12, 219, 129, 69, 204, 48, 238, 44, + 142, 50, 188, 98, 82, 86, 68, 246, 224, 216, 223, 133, 113, 41, 221, 79, 224, 134, 65, 142, + 153, 142, 180, 52, 215, 68, 76, 183, 248, 144, 96, 59, 254, 249, 3, 78, 152, 137, 210, 38, + 15, 3, 173, 242, 62, 177, 120, 151, 142, 146, 41, 74, 179, 9, 243, 195, 237, 209, 98, 51, + 163, 210, 139, 147, 115, 48, 88, 168, 190, 223, 27, 116, 79, 235, 115, 104, 50, 93, 118, + 188, 201, 152, 196, 144, 121, 98, 196, 128, 7, 38, 192, 154, 146, 194, 128, 81, 143, 183, + 138, 62, 41, 249, 156, 35, 192, 3, 241, 223, 6, 115, 194, 184, 210, 146, 194, 16, 112, 36, + 229, 35, 38, 92, 79, 49, 225, 90, 2, 175, 97, 130, 167, 112, 199, 135, 19, 118, 20, 171, + 165, 40, 213, 193, 211, 197, 81, 215, 89, 183, 169, 21, 92, 94, 22, 61, 175, 234, 142, 162, + 48, 8, 100, 109, 169, 206, 241, 195, 91, 127, 29, 184, 9, 19, 11, 17, 162, 102, 227, 214, + 26, 159, 182, 163, 84, 109, 19, 28, 130, 154, 221, 178, 100, 24, 172, 220, 236, 64, 84, 161, + 16, 88, 241, 126, 115, 18, 24, 69, 53, 172, 139, 110, 229, 170, 110, 93, 172, 170, 48, 88, + 225, 159, 187, 175, 39, 187, 167, 54, 219, 48, 135, 201, 102, 221, 213, 149, 55, 187, 77, + 223, 3, 142, 77, 31, 61, 186, 201, 151, 186, 213, 170, 170, 89, 227, 58, 8, 134, 171, 236, + 246, 48, 84, 125, 51, 115, 116, 102, 15, 205, 165, 189, 25, 107, 231, 238, 228, 237, 73, + 189, 199, 246, 222, 255, 242, 174, 56, 249, 159, 0, 3, 0, 93, 29, 240, 241, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 49, 50, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 49, 49, 51, + 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, + 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 53, 32, 48, 32, 82, 47, 82, 101, + 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, + 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 62, 62, 47, 80, + 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, + 115, 32, 53, 49, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, + 111, 98, 106, 13, 49, 49, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 49, 49, 55, 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 140, 87, 75, + 111, 220, 54, 16, 190, 235, 87, 240, 72, 6, 37, 45, 82, 164, 30, 64, 16, 160, 182, 131, 34, + 1, 130, 26, 168, 110, 118, 15, 113, 214, 118, 83, 172, 119, 141, 141, 147, 32, 255, 190, 51, + 195, 183, 86, 235, 26, 11, 45, 200, 121, 243, 27, 206, 140, 116, 118, 245, 249, 240, 204, + 222, 190, 61, 251, 116, 241, 225, 146, 181, 236, 221, 187, 243, 203, 11, 214, 156, 207, 77, + 203, 240, 119, 120, 104, 206, 230, 185, 101, 218, 176, 249, 190, 105, 213, 52, 77, 35, 49, + 52, 51, 147, 85, 83, 207, 6, 99, 148, 101, 243, 99, 115, 205, 173, 232, 249, 36, 254, 158, + 63, 162, 142, 102, 186, 83, 19, 169, 105, 163, 140, 53, 160, 52, 111, 26, 206, 196, 252, + 111, 35, 245, 100, 84, 219, 141, 76, 234, 94, 117, 38, 51, 188, 162, 215, 26, 123, 16, 25, + 152, 236, 93, 171, 122, 187, 148, 137, 198, 101, 146, 59, 54, 21, 227, 118, 202, 140, 154, + 245, 78, 43, 77, 2, 215, 252, 92, 65, 172, 35, 60, 76, 56, 120, 164, 182, 97, 117, 188, 115, + 252, 79, 33, 45, 223, 9, 217, 241, 45, 236, 190, 194, 67, 155, 59, 16, 28, 72, 32, 145, 238, + 81, 114, 47, 164, 225, 7, 33, 29, 127, 20, 114, 224, 159, 133, 236, 249, 51, 184, 66, 41, + 226, 145, 40, 234, 17, 139, 118, 155, 72, 162, 69, 82, 161, 197, 109, 34, 125, 3, 143, 224, + 214, 100, 229, 47, 104, 143, 254, 144, 76, 124, 250, 99, 194, 184, 34, 16, 148, 167, 5, 74, + 161, 97, 218, 96, 64, 72, 248, 145, 194, 220, 134, 19, 39, 71, 36, 71, 124, 20, 46, 28, 25, + 20, 204, 169, 38, 152, 187, 65, 89, 139, 57, 181, 33, 95, 215, 252, 2, 85, 183, 98, 68, 243, + 154, 127, 23, 22, 77, 79, 252, 206, 131, 124, 195, 193, 150, 134, 112, 6, 120, 110, 68, 192, + 19, 57, 123, 32, 0, 152, 58, 166, 195, 107, 249, 195, 226, 9, 40, 250, 145, 196, 118, 2, + 179, 37, 59, 203, 13, 229, 19, 87, 94, 221, 6, 229, 15, 66, 142, 252, 15, 180, 240, 23, 70, + 49, 123, 49, 96, 252, 142, 219, 100, 208, 171, 162, 89, 242, 230, 69, 110, 193, 10, 249, + 253, 10, 91, 77, 206, 30, 50, 151, 78, 245, 232, 193, 242, 137, 213, 152, 194, 160, 178, 73, + 17, 144, 253, 125, 10, 239, 0, 62, 72, 226, 7, 70, 150, 60, 18, 169, 80, 248, 39, 26, 242, + 72, 183, 9, 217, 75, 64, 54, 121, 193, 115, 162, 9, 239, 28, 87, 11, 120, 2, 138, 195, 2, + 85, 216, 223, 24, 211, 9, 91, 136, 97, 166, 188, 173, 228, 89, 78, 54, 145, 188, 238, 158, + 238, 207, 232, 207, 77, 8, 4, 135, 8, 80, 145, 145, 33, 224, 147, 81, 241, 68, 92, 101, 53, + 90, 221, 70, 82, 133, 131, 55, 96, 124, 138, 240, 33, 6, 137, 196, 12, 133, 67, 97, 56, 126, + 151, 160, 37, 227, 135, 112, 158, 12, 54, 121, 217, 82, 168, 30, 213, 249, 13, 128, 153, + 221, 162, 70, 202, 74, 237, 19, 208, 178, 57, 178, 50, 165, 165, 95, 66, 5, 233, 100, 229, + 110, 161, 80, 164, 20, 105, 232, 32, 34, 182, 9, 121, 4, 57, 115, 116, 187, 167, 234, 78, + 247, 109, 242, 103, 146, 110, 8, 31, 79, 22, 243, 245, 16, 174, 53, 161, 36, 117, 23, 245, + 79, 68, 67, 167, 36, 128, 208, 64, 78, 24, 209, 177, 118, 159, 232, 137, 23, 229, 23, 214, + 118, 184, 154, 170, 109, 117, 85, 248, 69, 221, 140, 85, 213, 184, 193, 46, 243, 24, 106, + 199, 230, 139, 27, 178, 52, 150, 126, 72, 51, 181, 145, 4, 255, 226, 22, 150, 133, 231, 242, + 13, 180, 37, 45, 151, 50, 229, 8, 173, 108, 203, 180, 87, 225, 2, 242, 143, 17, 146, 93, 72, + 81, 244, 105, 124, 144, 193, 44, 162, 137, 161, 229, 136, 98, 237, 229, 234, 29, 71, 95, + 189, 209, 90, 142, 57, 93, 188, 99, 52, 226, 61, 80, 200, 102, 254, 47, 180, 222, 56, 225, + 100, 236, 189, 166, 77, 41, 160, 25, 55, 189, 114, 198, 93, 161, 217, 109, 53, 86, 226, 160, + 217, 251, 46, 35, 109, 30, 13, 223, 113, 36, 61, 165, 63, 212, 251, 133, 122, 213, 48, 132, + 25, 212, 102, 75, 52, 73, 210, 76, 11, 66, 88, 132, 193, 91, 61, 224, 96, 1, 202, 235, 19, + 102, 168, 46, 218, 21, 186, 58, 4, 148, 234, 126, 26, 170, 83, 187, 186, 90, 113, 159, 174, + 244, 173, 208, 45, 151, 162, 127, 197, 132, 209, 78, 251, 137, 53, 250, 105, 101, 162, 177, + 114, 218, 184, 23, 102, 21, 86, 224, 46, 203, 225, 224, 51, 57, 164, 133, 149, 163, 2, 69, + 226, 137, 73, 230, 86, 70, 25, 18, 171, 89, 230, 236, 90, 81, 234, 136, 242, 113, 9, 167, + 234, 74, 51, 229, 168, 194, 186, 206, 86, 80, 227, 62, 247, 241, 64, 168, 134, 95, 156, 229, + 79, 49, 20, 140, 25, 29, 224, 209, 99, 165, 39, 173, 242, 252, 157, 25, 72, 43, 189, 77, + 248, 238, 172, 163, 66, 129, 95, 10, 43, 55, 45, 155, 91, 201, 111, 160, 220, 70, 49, 116, + 125, 8, 79, 110, 75, 85, 116, 41, 131, 85, 71, 207, 46, 115, 141, 203, 99, 16, 83, 103, 38, + 187, 201, 212, 174, 154, 129, 203, 139, 166, 23, 253, 90, 175, 188, 17, 16, 241, 33, 98, + 143, 207, 38, 190, 93, 165, 3, 162, 72, 244, 134, 219, 206, 79, 156, 197, 164, 77, 55, 4, + 164, 127, 86, 94, 18, 40, 47, 197, 176, 10, 116, 28, 186, 38, 142, 230, 213, 51, 189, 106, + 236, 174, 189, 252, 44, 186, 186, 203, 145, 126, 161, 151, 72, 180, 242, 20, 154, 117, 158, + 146, 207, 241, 85, 184, 204, 155, 123, 109, 20, 225, 85, 165, 192, 196, 133, 23, 137, 61, + 245, 48, 179, 62, 133, 92, 49, 110, 112, 71, 37, 236, 67, 143, 239, 107, 164, 167, 150, 45, + 221, 232, 65, 13, 198, 150, 159, 77, 239, 231, 6, 96, 163, 175, 174, 86, 171, 161, 103, 173, + 130, 158, 79, 127, 135, 187, 230, 254, 255, 152, 14, 154, 103, 100, 118, 67, 167, 76, 193, + 181, 227, 136, 232, 174, 171, 190, 200, 12, 78, 157, 25, 19, 93, 163, 241, 35, 246, 105, + 197, 19, 161, 34, 231, 68, 156, 167, 188, 101, 246, 137, 51, 172, 112, 224, 99, 247, 212, + 55, 46, 6, 98, 152, 131, 47, 75, 16, 134, 111, 92, 159, 6, 109, 173, 106, 205, 180, 200, + 204, 251, 79, 23, 172, 249, 79, 128, 1, 0, 203, 128, 63, 119, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 49, 52, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 49, 49, 53, 32, 48, 32, + 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, + 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, + 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 54, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, + 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, + 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, + 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 57, 50, 32, 48, 32, 82, 62, 62, 47, 80, 114, + 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, + 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, + 32, 53, 50, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 49, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, + 50, 57, 54, 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 196, 87, 109, 111, 20, + 71, 18, 254, 238, 95, 49, 31, 119, 78, 183, 195, 244, 219, 188, 72, 81, 36, 130, 73, 142, + 68, 112, 232, 216, 59, 233, 100, 231, 3, 196, 6, 115, 178, 13, 7, 241, 37, 252, 251, 171, + 183, 238, 233, 217, 173, 50, 6, 20, 34, 132, 119, 183, 159, 174, 234, 170, 234, 122, 170, + 170, 239, 61, 125, 254, 238, 215, 230, 155, 111, 238, 61, 126, 240, 232, 184, 233, 155, 111, + 191, 253, 238, 248, 65, 115, 244, 221, 238, 168, 111, 240, 223, 187, 87, 71, 247, 118, 187, + 190, 113, 190, 217, 189, 60, 234, 187, 121, 158, 39, 2, 92, 227, 231, 216, 205, 67, 51, 122, + 223, 197, 102, 119, 117, 116, 178, 73, 237, 176, 233, 219, 159, 119, 63, 162, 140, 107, 92, + 232, 102, 18, 115, 190, 243, 209, 131, 208, 238, 236, 104, 211, 180, 187, 255, 28, 109, 221, + 236, 187, 62, 76, 205, 214, 13, 93, 240, 11, 192, 130, 44, 53, 13, 176, 101, 108, 182, 67, + 234, 187, 33, 238, 239, 201, 202, 183, 101, 223, 161, 170, 108, 247, 216, 249, 222, 53, 67, + 114, 221, 80, 217, 192, 171, 91, 23, 69, 251, 201, 230, 65, 59, 109, 186, 118, 235, 60, 236, + 0, 19, 199, 72, 43, 255, 108, 183, 227, 230, 25, 254, 217, 181, 219, 180, 249, 123, 187, + 141, 155, 199, 237, 118, 224, 181, 166, 245, 105, 115, 12, 219, 123, 222, 72, 123, 254, 221, + 180, 105, 243, 143, 214, 111, 238, 195, 39, 173, 60, 108, 113, 107, 34, 133, 127, 107, 183, + 51, 33, 79, 64, 108, 243, 67, 187, 13, 4, 63, 107, 40, 118, 125, 49, 233, 88, 44, 221, 253, + 165, 216, 54, 108, 28, 200, 56, 178, 50, 160, 149, 41, 69, 58, 232, 28, 254, 159, 161, 166, + 27, 252, 243, 75, 187, 245, 155, 95, 97, 247, 107, 56, 229, 13, 254, 184, 198, 101, 216, 31, + 34, 173, 85, 63, 95, 224, 215, 231, 232, 207, 123, 52, 7, 81, 18, 103, 148, 190, 146, 78, + 66, 81, 231, 155, 214, 141, 155, 43, 244, 149, 150, 120, 223, 114, 54, 110, 249, 208, 186, + 172, 158, 37, 138, 190, 119, 24, 12, 197, 88, 92, 170, 205, 115, 195, 230, 237, 74, 37, 222, + 136, 152, 67, 234, 138, 57, 244, 229, 175, 203, 9, 164, 248, 92, 66, 242, 54, 255, 168, 28, + 254, 31, 154, 78, 14, 95, 194, 81, 55, 178, 3, 197, 49, 252, 126, 130, 44, 26, 86, 105, 65, + 123, 73, 45, 253, 65, 3, 15, 99, 155, 45, 152, 215, 46, 195, 79, 178, 129, 252, 166, 69, + 138, 220, 155, 124, 65, 226, 55, 108, 195, 111, 191, 163, 47, 180, 159, 54, 144, 144, 56, + 63, 215, 206, 147, 142, 226, 91, 54, 38, 127, 146, 131, 197, 105, 252, 66, 49, 90, 5, 106, + 165, 142, 206, 41, 55, 83, 146, 135, 183, 149, 116, 41, 106, 139, 89, 229, 30, 121, 231, + 126, 14, 108, 7, 137, 41, 37, 112, 185, 48, 18, 95, 167, 233, 77, 9, 145, 196, 195, 195, 93, + 147, 64, 142, 35, 46, 44, 73, 42, 11, 117, 160, 241, 247, 139, 18, 185, 117, 138, 8, 124, + 86, 224, 171, 236, 74, 217, 82, 167, 61, 238, 189, 42, 73, 114, 93, 188, 122, 137, 204, 167, + 53, 197, 240, 215, 88, 7, 104, 239, 43, 118, 156, 212, 228, 235, 169, 85, 159, 180, 113, + 243, 91, 27, 203, 149, 93, 192, 114, 168, 5, 232, 28, 250, 83, 93, 7, 243, 189, 68, 147, + 224, 189, 164, 194, 250, 210, 131, 66, 15, 255, 59, 170, 197, 249, 59, 10, 123, 90, 201, + 223, 2, 252, 255, 153, 133, 80, 231, 214, 141, 93, 31, 99, 179, 245, 99, 23, 6, 78, 123, 42, + 111, 93, 155, 47, 113, 27, 129, 24, 235, 122, 249, 164, 220, 80, 151, 203, 190, 207, 213, + 123, 236, 146, 143, 117, 205, 175, 234, 49, 52, 132, 209, 135, 102, 236, 98, 85, 120, 23, + 63, 22, 134, 172, 248, 246, 97, 255, 140, 52, 117, 253, 236, 173, 51, 6, 232, 58, 35, 108, + 117, 157, 159, 248, 148, 239, 209, 220, 58, 102, 37, 164, 91, 218, 229, 193, 125, 223, 37, + 113, 255, 116, 211, 110, 167, 133, 100, 36, 215, 228, 44, 41, 236, 66, 195, 78, 219, 125, + 203, 226, 212, 197, 217, 48, 44, 76, 221, 52, 77, 77, 117, 210, 174, 152, 148, 173, 1, 199, + 250, 240, 199, 89, 243, 112, 119, 228, 28, 117, 239, 52, 187, 14, 54, 245, 93, 156, 248, + 207, 187, 243, 163, 151, 31, 3, 19, 222, 155, 128, 193, 225, 143, 10, 141, 3, 184, 103, 137, + 70, 202, 46, 1, 125, 31, 240, 106, 22, 56, 112, 163, 215, 101, 67, 162, 85, 1, 135, 185, + 108, 33, 52, 250, 30, 102, 12, 67, 20, 193, 113, 17, 197, 248, 215, 232, 52, 119, 150, 175, + 183, 97, 57, 72, 49, 117, 227, 192, 235, 240, 21, 220, 91, 197, 65, 71, 179, 167, 58, 154, + 157, 49, 80, 182, 73, 7, 97, 112, 179, 230, 53, 7, 212, 30, 192, 162, 16, 80, 144, 6, 182, + 71, 84, 28, 246, 178, 101, 0, 149, 206, 34, 213, 4, 134, 9, 171, 79, 104, 132, 161, 98, 39, + 5, 48, 85, 211, 194, 165, 144, 86, 10, 100, 174, 222, 184, 140, 105, 251, 20, 179, 153, 150, + 23, 158, 175, 91, 194, 251, 131, 138, 210, 67, 225, 25, 156, 145, 199, 16, 131, 156, 75, + 135, 169, 202, 160, 149, 170, 186, 168, 164, 42, 131, 102, 170, 170, 178, 57, 85, 25, 180, + 82, 85, 21, 205, 169, 42, 162, 122, 170, 26, 190, 114, 32, 60, 214, 86, 94, 231, 242, 177, + 242, 85, 71, 69, 175, 14, 114, 74, 57, 61, 165, 48, 89, 154, 228, 200, 104, 74, 41, 167, + 165, 20, 70, 96, 191, 78, 151, 49, 31, 12, 131, 90, 39, 41, 245, 148, 11, 220, 22, 219, 158, + 199, 148, 113, 80, 216, 34, 165, 204, 19, 26, 214, 176, 233, 67, 178, 149, 236, 200, 153, + 153, 98, 55, 134, 253, 180, 93, 206, 152, 187, 209, 149, 188, 117, 210, 27, 123, 25, 43, + 105, 158, 136, 125, 74, 212, 21, 123, 121, 0, 224, 1, 85, 130, 121, 124, 196, 88, 9, 198, + 160, 149, 96, 186, 168, 36, 24, 131, 102, 130, 169, 178, 57, 193, 24, 180, 18, 76, 21, 205, + 9, 38, 162, 122, 130, 25, 190, 82, 32, 226, 60, 23, 47, 97, 223, 218, 85, 29, 20, 95, 116, + 80, 172, 53, 64, 178, 71, 199, 62, 158, 151, 113, 226, 9, 3, 243, 210, 127, 89, 94, 126, + 207, 79, 163, 9, 7, 198, 25, 38, 182, 88, 205, 137, 142, 19, 150, 146, 245, 18, 182, 8, 2, + 19, 154, 195, 182, 142, 229, 113, 90, 109, 127, 142, 223, 41, 175, 49, 159, 95, 182, 145, + 101, 127, 161, 89, 145, 103, 99, 151, 72, 234, 188, 26, 27, 81, 19, 235, 92, 198, 97, 183, + 249, 175, 104, 121, 206, 131, 44, 213, 225, 9, 171, 104, 24, 215, 227, 98, 100, 101, 231, + 92, 110, 247, 2, 225, 93, 55, 197, 253, 105, 45, 71, 194, 247, 137, 90, 194, 50, 174, 33, + 129, 210, 65, 125, 198, 164, 177, 162, 57, 192, 37, 167, 12, 38, 1, 151, 142, 211, 247, 70, + 93, 143, 243, 132, 31, 58, 237, 4, 52, 104, 103, 136, 50, 237, 4, 180, 104, 167, 203, 10, + 237, 4, 52, 104, 167, 139, 10, 237, 178, 168, 74, 59, 203, 87, 14, 196, 224, 74, 191, 15, + 99, 231, 215, 174, 170, 96, 246, 69, 5, 179, 181, 58, 200, 246, 168, 216, 29, 104, 23, 231, + 50, 97, 132, 47, 163, 221, 79, 72, 2, 76, 232, 75, 42, 211, 153, 93, 193, 228, 93, 96, 62, + 189, 161, 119, 206, 187, 189, 237, 165, 157, 220, 153, 118, 33, 211, 46, 230, 159, 95, 159, + 116, 254, 171, 115, 110, 112, 246, 44, 37, 160, 197, 57, 93, 84, 56, 199, 160, 201, 57, 85, + 54, 115, 142, 65, 139, 115, 170, 104, 230, 156, 136, 234, 156, 51, 124, 229, 64, 248, 0, 55, + 84, 8, 0, 14, 175, 124, 213, 209, 236, 141, 142, 102, 131, 13, 148, 109, 210, 193, 59, 16, + 207, 97, 70, 49, 241, 226, 31, 208, 239, 32, 253, 47, 133, 143, 111, 137, 43, 248, 237, 172, + 96, 200, 148, 215, 53, 79, 11, 25, 75, 11, 84, 152, 136, 122, 52, 46, 198, 21, 19, 215, 68, + 252, 83, 120, 152, 155, 31, 207, 136, 159, 66, 196, 52, 118, 46, 207, 166, 119, 38, 114, + 197, 71, 200, 135, 96, 246, 64, 6, 45, 62, 234, 162, 194, 71, 6, 77, 62, 170, 178, 153, 143, + 12, 90, 124, 84, 69, 51, 31, 69, 84, 231, 163, 225, 43, 5, 34, 76, 67, 231, 172, 30, 168, + 131, 226, 139, 14, 138, 181, 6, 72, 246, 232, 216, 199, 169, 24, 198, 136, 114, 68, 197, + 244, 101, 84, 188, 159, 251, 219, 43, 164, 98, 221, 237, 92, 138, 252, 96, 202, 93, 114, + 105, 138, 130, 158, 110, 224, 115, 36, 2, 160, 12, 183, 197, 204, 173, 211, 182, 229, 141, + 99, 205, 83, 121, 14, 185, 152, 62, 179, 105, 226, 185, 50, 171, 134, 84, 211, 240, 86, 202, + 122, 122, 227, 125, 132, 169, 208, 209, 226, 108, 71, 13, 194, 22, 194, 210, 49, 191, 58, + 81, 195, 148, 186, 193, 106, 156, 2, 26, 68, 53, 68, 153, 168, 2, 90, 68, 213, 101, 133, + 168, 2, 26, 68, 213, 69, 133, 168, 89, 84, 37, 170, 229, 43, 7, 34, 78, 101, 253, 144, 168, + 42, 152, 125, 81, 193, 108, 173, 14, 178, 61, 42, 118, 7, 162, 134, 1, 85, 19, 81, 135, 47, + 35, 234, 227, 156, 205, 215, 57, 139, 145, 22, 53, 97, 135, 252, 106, 195, 29, 210, 56, 7, + 104, 102, 255, 162, 206, 57, 49, 31, 104, 195, 85, 238, 191, 215, 178, 203, 85, 84, 39, 221, + 87, 244, 136, 196, 45, 191, 183, 219, 145, 215, 168, 89, 203, 238, 125, 70, 23, 26, 222, + 141, 213, 235, 246, 235, 234, 246, 155, 228, 1, 123, 27, 149, 183, 98, 193, 45, 100, 118, 1, + 158, 59, 152, 89, 106, 104, 167, 169, 11, 97, 250, 83, 222, 156, 33, 154, 28, 142, 54, 129, + 21, 33, 97, 111, 188, 133, 186, 135, 82, 153, 183, 209, 38, 237, 161, 80, 102, 108, 52, 233, + 170, 249, 196, 222, 186, 190, 75, 75, 135, 219, 27, 114, 13, 52, 155, 175, 163, 217, 78, 3, + 101, 131, 116, 240, 86, 194, 142, 29, 20, 127, 63, 79, 40, 8, 132, 221, 140, 114, 167, 193, + 186, 211, 154, 170, 88, 30, 98, 166, 234, 3, 164, 12, 38, 248, 141, 16, 177, 110, 94, 212, + 103, 145, 177, 31, 112, 23, 230, 115, 33, 115, 197, 72, 220, 249, 146, 154, 95, 53, 223, + 226, 34, 170, 36, 34, 214, 58, 247, 4, 51, 7, 253, 221, 91, 171, 175, 57, 92, 147, 241, 33, + 108, 243, 48, 144, 199, 66, 191, 11, 18, 92, 26, 254, 59, 250, 54, 208, 24, 79, 62, 157, 21, + 205, 108, 151, 176, 42, 199, 17, 46, 104, 28, 45, 98, 58, 40, 152, 174, 31, 27, 200, 158, + 65, 168, 57, 82, 221, 220, 78, 11, 63, 179, 38, 160, 141, 243, 193, 234, 182, 17, 248, 89, + 186, 173, 255, 4, 37, 21, 87, 33, 141, 122, 147, 174, 12, 90, 140, 213, 69, 133, 180, 12, + 154, 188, 85, 101, 51, 117, 25, 180, 216, 171, 138, 102, 2, 139, 168, 206, 97, 195, 87, 10, + 132, 31, 125, 145, 57, 104, 185, 58, 40, 190, 232, 160, 88, 107, 128, 100, 143, 142, 221, + 129, 193, 3, 157, 139, 12, 158, 62, 155, 193, 199, 200, 16, 98, 216, 245, 170, 5, 113, 231, + 242, 83, 110, 58, 68, 185, 152, 132, 225, 180, 229, 162, 245, 194, 3, 105, 203, 8, 51, 25, + 47, 133, 65, 204, 150, 76, 238, 203, 60, 20, 199, 97, 168, 251, 234, 156, 133, 15, 40, 31, + 11, 229, 247, 102, 96, 173, 249, 122, 139, 248, 190, 52, 224, 148, 39, 106, 151, 232, 151, + 232, 134, 95, 103, 109, 62, 222, 245, 44, 205, 13, 255, 245, 122, 244, 72, 160, 29, 95, 2, + 23, 185, 214, 149, 1, 3, 79, 45, 27, 201, 137, 238, 128, 128, 35, 204, 197, 41, 89, 52, 6, + 138, 204, 110, 169, 7, 165, 213, 222, 229, 82, 19, 150, 26, 159, 47, 245, 137, 184, 118, + 121, 96, 1, 156, 209, 27, 37, 0, 211, 48, 26, 21, 128, 49, 163, 0, 232, 130, 204, 127, 198, + 44, 250, 171, 146, 194, 126, 198, 12, 242, 171, 130, 194, 125, 17, 84, 169, 111, 248, 200, + 254, 7, 250, 48, 26, 184, 129, 102, 71, 116, 52, 91, 107, 160, 108, 146, 14, 50, 253, 123, + 107, 226, 70, 173, 222, 163, 32, 77, 220, 143, 32, 171, 31, 213, 83, 119, 40, 83, 247, 208, + 239, 207, 117, 253, 50, 117, 167, 161, 158, 186, 113, 120, 78, 196, 53, 200, 109, 108, 212, + 60, 102, 35, 113, 19, 164, 244, 222, 204, 24, 3, 60, 92, 102, 35, 151, 192, 41, 115, 250, + 19, 208, 202, 38, 93, 84, 210, 137, 65, 51, 159, 84, 217, 156, 80, 12, 90, 25, 165, 138, + 230, 148, 18, 81, 61, 167, 12, 95, 57, 16, 206, 97, 169, 166, 117, 184, 47, 24, 184, 86, + 190, 234, 168, 232, 213, 193, 143, 247, 5, 55, 207, 248, 129, 125, 193, 125, 118, 95, 184, + 159, 43, 41, 214, 145, 92, 254, 71, 25, 234, 202, 123, 172, 30, 249, 16, 197, 162, 126, 73, + 227, 96, 61, 208, 81, 53, 124, 155, 219, 139, 140, 120, 184, 253, 116, 3, 7, 112, 65, 197, + 189, 88, 202, 151, 167, 219, 107, 170, 191, 215, 237, 50, 244, 189, 202, 173, 2, 68, 95, + 240, 12, 230, 71, 233, 10, 125, 3, 79, 37, 140, 233, 238, 24, 172, 255, 173, 116, 53, 148, + 37, 185, 139, 172, 28, 21, 204, 50, 58, 102, 11, 139, 15, 115, 204, 189, 173, 122, 97, 10, + 48, 195, 102, 28, 209, 228, 231, 219, 250, 117, 42, 107, 101, 200, 189, 222, 59, 173, 110, + 59, 139, 185, 88, 232, 209, 220, 85, 239, 200, 65, 199, 110, 196, 143, 83, 108, 59, 28, 89, + 140, 200, 205, 234, 65, 154, 175, 135, 78, 61, 109, 15, 70, 80, 215, 77, 248, 60, 208, 111, + 60, 194, 228, 56, 204, 240, 20, 232, 224, 125, 247, 201, 45, 7, 216, 224, 252, 151, 141, + 157, 152, 227, 209, 108, 58, 12, 90, 117, 66, 23, 149, 58, 193, 160, 89, 39, 84, 217, 92, + 39, 24, 132, 225, 42, 151, 101, 38, 165, 243, 52, 201, 170, 162, 8, 166, 114, 44, 180, 249, + 62, 30, 214, 9, 195, 87, 10, 132, 131, 6, 30, 228, 184, 68, 7, 213, 190, 26, 168, 120, 99, + 160, 98, 176, 133, 146, 77, 6, 120, 107, 243, 137, 232, 169, 196, 121, 213, 124, 212, 6, 4, + 70, 140, 7, 47, 151, 94, 73, 141, 147, 205, 15, 185, 241, 92, 225, 76, 249, 30, 249, 128, + 153, 79, 29, 136, 154, 210, 25, 254, 193, 165, 31, 121, 70, 244, 192, 243, 72, 159, 216, + 160, 240, 63, 183, 45, 160, 221, 7, 20, 194, 173, 207, 80, 215, 57, 151, 25, 28, 11, 7, 124, + 203, 225, 166, 189, 110, 230, 66, 232, 70, 120, 142, 169, 105, 234, 210, 82, 249, 15, 210, + 84, 64, 35, 77, 13, 81, 14, 159, 128, 86, 154, 234, 178, 146, 166, 2, 26, 105, 170, 139, 74, + 154, 10, 168, 167, 169, 229, 43, 7, 2, 30, 173, 193, 108, 103, 6, 42, 122, 117, 240, 214, + 118, 54, 224, 102, 204, 184, 224, 57, 213, 156, 62, 227, 56, 191, 63, 227, 184, 101, 198, + 153, 250, 146, 97, 207, 48, 167, 168, 82, 150, 87, 205, 251, 220, 83, 230, 88, 61, 73, 74, + 65, 63, 124, 145, 204, 75, 63, 170, 59, 201, 222, 91, 228, 240, 41, 18, 73, 237, 210, 212, + 94, 85, 7, 239, 119, 7, 122, 226, 224, 118, 4, 110, 242, 230, 11, 62, 210, 113, 139, 37, + 253, 47, 218, 121, 179, 133, 61, 165, 43, 163, 0, 53, 191, 235, 242, 198, 57, 163, 111, 229, + 29, 83, 250, 30, 26, 193, 17, 56, 120, 36, 184, 110, 156, 172, 166, 49, 79, 221, 48, 44, + 175, 148, 19, 40, 248, 35, 55, 229, 148, 170, 135, 7, 57, 135, 138, 43, 22, 133, 212, 77, + 86, 177, 23, 208, 98, 145, 46, 42, 44, 98, 208, 100, 145, 42, 155, 89, 196, 160, 49, 20, + 234, 162, 50, 20, 102, 81, 117, 40, 180, 124, 165, 64, 64, 8, 227, 225, 59, 67, 176, 177, + 12, 125, 135, 114, 58, 70, 241, 99, 204, 8, 159, 126, 160, 96, 170, 82, 142, 44, 99, 86, 96, + 85, 173, 25, 211, 180, 74, 204, 25, 51, 66, 174, 42, 205, 152, 166, 84, 110, 67, 148, 170, + 151, 161, 235, 100, 72, 85, 105, 67, 15, 31, 63, 104, 142, 254, 47, 192, 0, 63, 168, 47, + 106, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 49, 49, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, + 115, 32, 49, 49, 55, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, + 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, + 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 54, 32, 48, + 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, + 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, + 32, 82, 47, 84, 84, 50, 32, 49, 57, 50, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, + 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, + 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 53, 51, + 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, + 49, 49, 55, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, + 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 55, + 50, 56, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 196, 87, 219, 110, 28, 199, + 17, 125, 223, 175, 152, 199, 25, 195, 51, 156, 190, 205, 5, 48, 12, 200, 146, 146, 40, 128, + 19, 5, 89, 200, 15, 116, 30, 200, 144, 20, 229, 144, 180, 178, 164, 98, 248, 239, 83, 183, + 238, 233, 153, 237, 34, 25, 41, 176, 33, 44, 181, 219, 167, 171, 186, 170, 187, 234, 84, + 213, 201, 219, 179, 195, 67, 245, 205, 55, 39, 223, 191, 124, 243, 170, 234, 171, 111, 191, + 253, 238, 213, 203, 106, 247, 221, 126, 215, 87, 248, 239, 240, 126, 119, 178, 223, 247, + 149, 177, 213, 254, 106, 215, 119, 243, 60, 79, 4, 152, 202, 206, 190, 155, 135, 106, 180, + 182, 243, 213, 254, 118, 119, 90, 135, 102, 168, 77, 243, 143, 253, 159, 81, 198, 84, 198, + 117, 51, 137, 25, 219, 89, 111, 65, 104, 127, 177, 171, 171, 102, 255, 211, 174, 53, 179, + 237, 122, 55, 85, 173, 25, 58, 103, 23, 128, 5, 89, 106, 26, 96, 203, 88, 181, 67, 232, 187, + 193, 111, 247, 68, 229, 109, 218, 119, 172, 42, 218, 61, 119, 198, 218, 106, 8, 166, 51, + 180, 225, 180, 126, 3, 166, 190, 107, 218, 185, 238, 50, 123, 249, 88, 215, 121, 239, 114, + 99, 51, 69, 198, 131, 37, 2, 158, 214, 47, 155, 169, 62, 107, 218, 161, 254, 216, 180, 174, + 254, 208, 132, 250, 1, 212, 210, 202, 13, 252, 168, 224, 243, 71, 68, 126, 110, 90, 203, + 127, 46, 240, 231, 125, 227, 0, 195, 99, 95, 239, 119, 198, 240, 45, 246, 166, 27, 135, 170, + 239, 252, 196, 127, 14, 151, 187, 171, 167, 192, 0, 150, 70, 208, 25, 252, 145, 161, 126, + 232, 166, 73, 19, 245, 99, 231, 146, 94, 231, 241, 125, 50, 216, 79, 115, 167, 157, 250, 24, + 38, 230, 14, 227, 132, 255, 209, 58, 4, 199, 218, 160, 50, 200, 90, 203, 24, 196, 98, 246, + 60, 171, 16, 52, 118, 192, 189, 195, 48, 160, 28, 197, 160, 129, 23, 72, 111, 106, 87, 239, + 223, 151, 195, 12, 204, 234, 211, 147, 254, 189, 105, 13, 60, 167, 175, 47, 241, 185, 254, + 217, 88, 120, 214, 169, 190, 130, 5, 252, 31, 23, 241, 17, 61, 104, 105, 173, 243, 180, 225, + 140, 69, 90, 19, 104, 207, 67, 211, 6, 94, 187, 129, 63, 134, 118, 218, 177, 126, 143, 193, + 246, 51, 24, 135, 31, 212, 112, 143, 11, 39, 16, 34, 183, 184, 151, 4, 80, 219, 117, 82, + 116, 23, 173, 56, 192, 143, 95, 155, 118, 36, 85, 193, 147, 53, 168, 229, 0, 193, 100, 36, + 146, 122, 8, 127, 79, 89, 242, 10, 188, 88, 84, 162, 146, 79, 13, 203, 164, 51, 200, 68, 92, + 61, 136, 79, 168, 121, 102, 165, 87, 236, 28, 60, 37, 216, 63, 45, 30, 45, 118, 161, 224, + 109, 51, 215, 45, 172, 240, 181, 160, 220, 29, 203, 205, 124, 39, 124, 81, 168, 0, 63, 188, + 126, 69, 26, 216, 240, 184, 246, 41, 94, 4, 11, 176, 47, 251, 175, 192, 133, 120, 3, 176, + 111, 128, 139, 62, 143, 246, 147, 49, 244, 231, 232, 110, 112, 95, 230, 2, 254, 164, 61, 55, + 209, 203, 228, 251, 65, 60, 147, 231, 179, 38, 153, 186, 213, 21, 67, 129, 79, 90, 44, 184, + 148, 108, 54, 33, 55, 250, 63, 77, 43, 71, 93, 75, 196, 224, 9, 55, 203, 45, 135, 250, 199, + 26, 132, 198, 250, 117, 51, 2, 255, 12, 236, 252, 143, 141, 68, 10, 42, 130, 96, 233, 194, + 16, 42, 207, 4, 135, 65, 249, 2, 143, 165, 157, 188, 5, 40, 15, 226, 221, 167, 39, 199, 61, + 103, 49, 112, 241, 195, 47, 135, 58, 83, 128, 158, 203, 242, 37, 29, 207, 122, 166, 177, 27, + 204, 84, 101, 90, 254, 210, 240, 27, 167, 208, 53, 241, 81, 218, 17, 204, 177, 85, 107, 251, + 180, 25, 92, 177, 244, 130, 31, 233, 194, 229, 89, 240, 214, 162, 153, 204, 150, 185, 153, + 142, 74, 4, 166, 40, 220, 84, 15, 95, 92, 252, 97, 225, 75, 15, 7, 58, 250, 230, 225, 3, + 215, 34, 36, 249, 111, 32, 8, 143, 228, 62, 216, 9, 46, 167, 10, 157, 141, 102, 3, 69, 252, + 240, 85, 117, 247, 24, 75, 68, 89, 160, 200, 97, 66, 150, 96, 14, 0, 189, 127, 203, 41, 43, + 82, 217, 17, 195, 10, 168, 48, 172, 34, 202, 12, 43, 160, 237, 29, 90, 188, 192, 142, 75, + 90, 89, 214, 113, 157, 18, 112, 64, 242, 202, 9, 24, 94, 192, 106, 162, 8, 142, 139, 232, + 132, 6, 110, 185, 91, 243, 149, 47, 34, 158, 53, 12, 71, 142, 22, 160, 232, 71, 1, 138, 118, + 150, 32, 182, 163, 128, 240, 43, 22, 219, 13, 99, 3, 150, 156, 161, 239, 153, 232, 149, 234, + 221, 195, 83, 111, 169, 190, 95, 168, 222, 217, 68, 245, 216, 2, 236, 49, 98, 49, 116, 169, + 104, 223, 97, 117, 166, 18, 141, 75, 152, 162, 88, 198, 47, 27, 100, 142, 214, 82, 113, 63, + 52, 198, 115, 41, 191, 139, 53, 159, 176, 123, 204, 49, 228, 13, 137, 253, 204, 36, 96, 134, + 20, 112, 233, 150, 77, 23, 172, 22, 110, 12, 106, 225, 86, 22, 149, 112, 99, 80, 13, 183, + 162, 108, 12, 55, 6, 181, 112, 43, 138, 198, 112, 19, 209, 114, 184, 41, 190, 210, 69, 132, + 105, 105, 61, 236, 140, 70, 231, 190, 42, 40, 235, 85, 192, 167, 187, 133, 48, 146, 71, 191, + 117, 183, 208, 143, 88, 26, 145, 124, 175, 163, 0, 149, 233, 172, 14, 113, 25, 74, 141, 1, + 51, 248, 3, 70, 220, 178, 93, 202, 0, 235, 187, 106, 172, 214, 10, 192, 245, 169, 173, 128, + 61, 238, 5, 176, 144, 29, 26, 187, 180, 3, 33, 80, 156, 3, 29, 75, 57, 197, 133, 183, 216, + 245, 164, 125, 224, 74, 11, 103, 175, 140, 143, 119, 144, 154, 151, 88, 35, 73, 254, 15, + 141, 153, 98, 221, 70, 223, 14, 169, 78, 37, 47, 99, 189, 233, 187, 190, 55, 171, 210, 241, + 182, 49, 220, 61, 253, 130, 38, 95, 44, 221, 81, 86, 58, 3, 248, 29, 48, 28, 130, 148, 206, + 49, 150, 151, 192, 61, 135, 119, 99, 200, 171, 92, 44, 169, 3, 12, 49, 198, 165, 155, 251, + 157, 202, 91, 112, 99, 247, 153, 213, 45, 120, 74, 197, 98, 117, 11, 211, 35, 243, 131, 128, + 10, 221, 40, 162, 76, 55, 2, 106, 116, 83, 150, 21, 186, 17, 80, 161, 155, 178, 168, 208, + 77, 20, 45, 210, 141, 230, 43, 95, 4, 68, 198, 32, 235, 1, 6, 208, 141, 175, 101, 52, 122, + 83, 70, 163, 193, 10, 202, 54, 149, 193, 103, 80, 149, 25, 165, 101, 57, 165, 176, 249, 2, + 170, 162, 236, 73, 105, 122, 19, 155, 217, 11, 226, 42, 204, 64, 110, 235, 185, 138, 121, + 200, 213, 125, 51, 13, 156, 97, 210, 50, 91, 17, 17, 156, 154, 210, 196, 96, 41, 223, 5, 37, + 102, 252, 68, 61, 39, 42, 199, 20, 186, 94, 90, 120, 179, 222, 252, 8, 141, 61, 54, 209, 60, + 131, 198, 130, 12, 4, 204, 65, 129, 236, 32, 153, 67, 156, 107, 132, 79, 195, 138, 236, 2, + 233, 140, 99, 205, 93, 78, 240, 66, 2, 184, 151, 14, 186, 111, 198, 13, 251, 100, 116, 240, + 25, 236, 243, 59, 54, 215, 126, 34, 230, 249, 44, 250, 241, 19, 52, 149, 10, 251, 96, 117, + 214, 200, 135, 48, 141, 123, 138, 130, 66, 61, 132, 169, 204, 83, 146, 140, 196, 67, 152, + 198, 59, 37, 193, 72, 59, 44, 88, 102, 157, 178, 143, 228, 191, 92, 43, 173, 243, 80, 151, + 59, 169, 160, 226, 136, 130, 138, 181, 26, 74, 38, 41, 224, 211, 164, 227, 71, 186, 84, 34, + 29, 247, 101, 164, 243, 178, 105, 71, 206, 55, 202, 95, 169, 215, 25, 145, 56, 147, 166, 82, + 75, 121, 22, 219, 27, 4, 82, 186, 75, 11, 133, 107, 31, 54, 121, 155, 22, 239, 36, 85, 48, + 101, 150, 13, 39, 143, 229, 60, 201, 22, 185, 7, 90, 246, 83, 210, 68, 59, 35, 85, 153, 116, + 148, 180, 52, 184, 176, 37, 38, 132, 158, 215, 97, 25, 231, 87, 236, 68, 234, 82, 51, 165, + 92, 152, 28, 105, 13, 137, 94, 164, 35, 111, 82, 191, 153, 121, 192, 218, 23, 66, 35, 117, + 76, 200, 184, 127, 145, 76, 215, 131, 59, 23, 245, 231, 169, 56, 164, 55, 98, 18, 69, 57, + 164, 243, 200, 144, 151, 11, 149, 101, 61, 152, 149, 70, 202, 62, 147, 5, 151, 249, 8, 73, + 165, 48, 161, 18, 101, 48, 166, 80, 70, 89, 144, 41, 131, 49, 141, 50, 138, 146, 66, 25, + 140, 41, 148, 81, 20, 20, 202, 16, 193, 34, 101, 40, 62, 178, 255, 206, 162, 184, 210, 167, + 40, 104, 116, 164, 140, 70, 107, 21, 148, 77, 42, 131, 207, 160, 12, 27, 155, 207, 83, 42, + 46, 191, 205, 72, 133, 19, 133, 158, 220, 193, 143, 121, 114, 79, 81, 34, 38, 172, 253, 188, + 137, 136, 242, 213, 133, 109, 154, 37, 139, 239, 54, 249, 102, 83, 191, 133, 217, 235, 179, + 156, 196, 95, 123, 248, 245, 142, 106, 58, 254, 74, 206, 164, 142, 227, 70, 146, 202, 193, + 155, 248, 33, 111, 45, 2, 245, 29, 173, 31, 32, 151, 54, 9, 182, 201, 37, 120, 84, 235, 181, + 100, 98, 80, 203, 166, 178, 168, 164, 19, 131, 106, 62, 21, 101, 99, 66, 49, 168, 101, 84, + 81, 52, 166, 148, 136, 150, 115, 74, 241, 149, 46, 194, 205, 161, 235, 5, 132, 57, 107, 93, + 134, 203, 160, 248, 82, 6, 197, 90, 5, 36, 123, 202, 24, 231, 83, 95, 206, 39, 234, 166, + 220, 228, 80, 142, 242, 233, 29, 198, 243, 27, 122, 97, 138, 161, 121, 246, 245, 107, 120, + 252, 27, 8, 178, 203, 6, 83, 132, 90, 116, 42, 96, 212, 153, 98, 12, 182, 14, 210, 37, 48, + 134, 209, 248, 130, 105, 219, 241, 159, 27, 138, 54, 220, 0, 209, 54, 240, 118, 218, 138, + 250, 238, 83, 139, 185, 196, 144, 155, 125, 23, 180, 1, 82, 64, 37, 134, 20, 81, 142, 33, 1, + 181, 24, 42, 203, 74, 12, 9, 168, 196, 80, 89, 84, 98, 40, 138, 22, 99, 72, 243, 149, 47, + 98, 92, 166, 75, 107, 187, 141, 171, 69, 80, 180, 22, 177, 167, 153, 213, 133, 25, 229, 40, + 18, 204, 151, 49, 235, 159, 98, 7, 32, 67, 88, 75, 77, 135, 29, 125, 26, 118, 62, 44, 76, + 101, 103, 79, 52, 149, 145, 39, 238, 44, 146, 167, 198, 157, 11, 117, 162, 104, 70, 124, + 248, 115, 225, 198, 245, 104, 133, 98, 104, 7, 196, 163, 27, 115, 150, 253, 23, 162, 169, + 253, 195, 253, 215, 37, 206, 189, 166, 195, 113, 223, 237, 138, 73, 127, 197, 86, 244, 158, + 237, 225, 62, 5, 34, 208, 174, 40, 53, 14, 73, 50, 151, 2, 201, 227, 141, 7, 89, 217, 100, + 4, 188, 167, 213, 90, 20, 1, 181, 140, 40, 139, 74, 70, 48, 168, 102, 68, 81, 54, 102, 4, + 131, 90, 70, 20, 69, 99, 70, 136, 104, 57, 35, 20, 95, 249, 34, 156, 199, 70, 65, 97, 213, + 34, 24, 125, 41, 130, 209, 218, 50, 200, 246, 20, 177, 71, 89, 213, 210, 129, 150, 122, 154, + 53, 171, 190, 201, 147, 170, 148, 56, 41, 171, 162, 106, 99, 193, 239, 148, 85, 127, 133, + 80, 33, 250, 189, 70, 22, 69, 2, 61, 112, 23, 178, 81, 201, 106, 178, 0, 114, 174, 83, 25, + 149, 48, 45, 124, 138, 130, 18, 61, 132, 169, 193, 83, 146, 140, 177, 67, 152, 22, 58, 37, + 193, 24, 57, 44, 88, 14, 156, 178, 143, 236, 191, 233, 99, 251, 123, 76, 164, 37, 76, 84, + 150, 160, 167, 105, 212, 206, 96, 224, 255, 133, 69, 127, 104, 230, 165, 225, 188, 205, 166, + 50, 28, 150, 120, 182, 66, 166, 139, 211, 153, 128, 60, 44, 193, 200, 71, 98, 197, 169, 242, + 54, 54, 190, 145, 114, 137, 231, 104, 87, 166, 8, 79, 33, 42, 147, 223, 164, 234, 72, 10, + 121, 110, 206, 201, 51, 181, 167, 233, 248, 56, 186, 85, 200, 179, 43, 118, 134, 2, 72, 63, + 145, 220, 151, 142, 154, 190, 165, 230, 244, 66, 250, 113, 252, 254, 94, 26, 110, 39, 172, + 206, 158, 68, 84, 8, 26, 73, 57, 141, 160, 178, 121, 169, 47, 173, 51, 185, 181, 169, 16, + 156, 229, 154, 120, 18, 205, 78, 12, 228, 22, 154, 121, 32, 40, 94, 131, 92, 239, 176, 98, + 250, 213, 68, 234, 86, 76, 239, 231, 39, 198, 81, 12, 58, 103, 181, 100, 101, 80, 203, 214, + 178, 168, 164, 43, 131, 106, 190, 22, 101, 99, 194, 50, 168, 101, 108, 81, 52, 166, 172, + 136, 150, 115, 86, 241, 149, 46, 194, 134, 41, 173, 131, 25, 147, 95, 249, 170, 160, 226, + 141, 130, 138, 193, 26, 74, 54, 41, 224, 51, 210, 222, 211, 127, 148, 247, 246, 203, 242, + 254, 93, 227, 7, 142, 222, 107, 137, 125, 12, 231, 212, 191, 80, 204, 125, 221, 80, 34, 152, + 105, 206, 18, 51, 155, 99, 49, 72, 243, 73, 54, 37, 54, 10, 80, 172, 167, 156, 195, 56, 166, + 60, 98, 214, 56, 79, 241, 31, 79, 180, 219, 244, 78, 164, 180, 228, 236, 73, 99, 67, 106, + 238, 86, 252, 146, 101, 102, 158, 228, 226, 192, 16, 237, 71, 115, 206, 113, 68, 104, 41, + 173, 76, 31, 219, 40, 248, 246, 208, 152, 60, 223, 239, 133, 5, 134, 217, 175, 105, 98, 155, + 215, 164, 225, 208, 216, 252, 226, 64, 110, 116, 190, 254, 5, 241, 77, 87, 71, 128, 240, + 163, 205, 9, 18, 47, 99, 177, 225, 98, 217, 44, 20, 105, 199, 184, 112, 39, 50, 112, 188, + 229, 44, 223, 60, 66, 235, 194, 218, 204, 168, 85, 28, 149, 198, 115, 69, 118, 65, 220, 124, + 159, 184, 28, 97, 126, 231, 66, 76, 224, 254, 171, 198, 174, 26, 106, 92, 123, 88, 185, 44, + 139, 11, 173, 77, 56, 176, 153, 144, 211, 218, 178, 141, 57, 27, 225, 255, 209, 248, 237, + 19, 157, 52, 33, 214, 147, 229, 110, 121, 95, 226, 236, 20, 89, 124, 127, 177, 201, 70, 124, + 153, 39, 112, 37, 134, 215, 215, 176, 218, 139, 150, 44, 152, 124, 253, 19, 110, 95, 55, + 253, 188, 75, 2, 31, 227, 61, 115, 40, 198, 111, 94, 118, 228, 176, 88, 108, 17, 162, 35, + 186, 117, 127, 31, 134, 161, 26, 129, 91, 57, 131, 95, 100, 97, 138, 59, 32, 237, 128, 211, + 124, 213, 102, 35, 192, 89, 76, 146, 143, 84, 205, 39, 57, 36, 121, 121, 46, 203, 96, 190, + 137, 211, 201, 52, 118, 131, 153, 242, 65, 226, 209, 98, 2, 100, 166, 84, 18, 68, 148, 50, + 82, 18, 226, 26, 130, 136, 86, 64, 10, 82, 82, 61, 16, 81, 74, 71, 65, 72, 234, 6, 9, 21, + 139, 70, 209, 39, 242, 214, 12, 114, 4, 124, 95, 175, 155, 46, 104, 101, 70, 3, 233, 150, 4, + 84, 46, 234, 248, 188, 184, 94, 84, 201, 119, 40, 160, 118, 141, 71, 58, 211, 122, 73, 167, + 220, 176, 128, 202, 37, 31, 169, 76, 235, 37, 149, 114, 255, 81, 101, 241, 9, 142, 53, 202, + 114, 81, 225, 35, 216, 99, 115, 20, 188, 0, 152, 17, 122, 172, 168, 92, 47, 251, 10, 74, 17, + 36, 90, 181, 127, 37, 43, 144, 180, 105, 214, 121, 253, 253, 203, 106, 247, 95, 1, 6, 0, + 160, 200, 161, 155, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 49, 49, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, + 101, 110, 116, 115, 32, 49, 49, 57, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, + 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, + 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, + 54, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, + 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, + 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 49, 57, + 50, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 57, 32, 48, 32, 82, 62, 62, 47, 80, 114, + 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, + 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, + 32, 53, 52, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 49, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, + 50, 55, 55, 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 228, 87, 109, 111, 28, + 183, 17, 254, 126, 191, 98, 63, 238, 186, 89, 122, 249, 186, 187, 64, 16, 160, 145, 210, + 194, 9, 28, 216, 237, 33, 254, 224, 4, 168, 17, 89, 182, 90, 73, 150, 79, 86, 13, 253, 251, + 206, 11, 201, 125, 27, 158, 20, 164, 110, 81, 20, 134, 206, 119, 124, 56, 228, 12, 57, 243, + 204, 195, 167, 47, 222, 28, 62, 85, 95, 127, 253, 244, 249, 201, 179, 211, 170, 171, 190, + 249, 230, 219, 211, 147, 106, 247, 237, 126, 215, 85, 248, 239, 240, 110, 247, 116, 191, + 239, 42, 109, 170, 253, 249, 174, 83, 227, 56, 14, 4, 232, 202, 140, 78, 141, 161, 234, 141, + 81, 174, 218, 95, 237, 94, 215, 190, 9, 181, 105, 126, 217, 127, 143, 54, 186, 210, 86, 141, + 100, 166, 141, 50, 206, 128, 209, 254, 108, 87, 87, 205, 254, 239, 187, 86, 143, 70, 117, + 118, 168, 90, 29, 148, 53, 19, 192, 134, 108, 53, 4, 152, 210, 87, 109, 240, 157, 10, 110, + 61, 39, 45, 222, 230, 121, 219, 165, 178, 223, 85, 240, 90, 133, 106, 127, 10, 94, 158, 52, + 67, 173, 200, 211, 86, 91, 248, 214, 106, 13, 6, 240, 57, 186, 250, 25, 140, 95, 55, 173, + 173, 127, 109, 90, 83, 31, 154, 214, 215, 111, 27, 83, 191, 105, 218, 80, 223, 194, 28, 250, + 85, 53, 190, 190, 128, 63, 154, 136, 63, 112, 197, 59, 252, 65, 83, 62, 193, 26, 31, 208, + 252, 170, 105, 123, 30, 194, 73, 103, 56, 129, 102, 225, 132, 123, 92, 17, 135, 95, 55, 174, + 254, 12, 115, 120, 73, 132, 222, 167, 101, 113, 175, 243, 166, 117, 252, 129, 191, 200, 171, + 79, 228, 55, 78, 160, 113, 114, 114, 218, 15, 199, 59, 138, 46, 80, 148, 29, 205, 78, 177, + 242, 120, 151, 163, 183, 240, 237, 23, 240, 160, 130, 8, 42, 186, 57, 173, 76, 213, 26, 171, + 204, 128, 39, 249, 186, 254, 43, 46, 138, 134, 184, 240, 143, 24, 12, 237, 165, 104, 242, + 119, 251, 221, 199, 157, 118, 94, 57, 87, 133, 224, 148, 15, 85, 80, 110, 168, 180, 83, 58, + 84, 135, 183, 187, 87, 79, 170, 107, 76, 38, 184, 11, 35, 229, 80, 182, 237, 241, 63, 72, + 34, 190, 58, 88, 247, 101, 52, 19, 83, 79, 251, 126, 105, 198, 183, 58, 157, 2, 125, 208, + 79, 58, 246, 116, 180, 247, 120, 96, 85, 202, 208, 236, 17, 4, 172, 213, 224, 48, 61, 54, + 169, 99, 204, 168, 186, 46, 84, 113, 6, 30, 201, 95, 82, 70, 224, 146, 41, 33, 104, 179, + 115, 94, 127, 125, 217, 23, 241, 50, 111, 215, 59, 135, 81, 217, 222, 205, 11, 3, 34, 215, + 221, 72, 193, 245, 3, 150, 87, 135, 231, 73, 31, 112, 156, 231, 15, 131, 80, 20, 17, 196, + 138, 155, 32, 200, 255, 9, 90, 219, 121, 44, 225, 136, 153, 78, 43, 61, 55, 181, 222, 42, + 95, 50, 181, 62, 27, 106, 235, 96, 149, 9, 114, 195, 160, 74, 158, 30, 195, 82, 136, 62, + 164, 229, 128, 97, 124, 88, 198, 33, 130, 201, 83, 17, 140, 91, 138, 216, 145, 84, 131, 251, + 65, 51, 231, 18, 201, 253, 9, 107, 96, 94, 116, 84, 140, 120, 177, 64, 33, 80, 54, 88, 62, + 70, 197, 234, 249, 185, 110, 218, 161, 190, 193, 68, 192, 4, 32, 51, 204, 15, 42, 100, 28, + 185, 78, 57, 242, 115, 179, 78, 14, 7, 254, 142, 243, 220, 152, 185, 104, 3, 28, 92, 95, 77, + 27, 237, 179, 67, 201, 151, 1, 210, 214, 126, 49, 95, 102, 121, 234, 61, 222, 200, 38, 165, + 226, 61, 73, 96, 190, 39, 25, 204, 107, 134, 144, 211, 131, 175, 208, 116, 56, 32, 219, 57, + 168, 80, 87, 54, 141, 183, 47, 250, 26, 3, 209, 29, 38, 4, 141, 3, 45, 217, 85, 198, 201, + 104, 10, 69, 70, 147, 195, 5, 148, 125, 146, 193, 99, 236, 103, 122, 21, 134, 202, 143, 3, + 26, 82, 82, 62, 35, 182, 111, 181, 161, 78, 214, 107, 71, 124, 248, 62, 221, 53, 209, 225, + 69, 186, 107, 226, 174, 75, 248, 117, 219, 164, 116, 153, 93, 39, 184, 211, 13, 37, 102, 97, + 80, 100, 22, 217, 142, 153, 133, 177, 34, 179, 136, 166, 148, 7, 140, 148, 242, 64, 180, 75, + 121, 80, 48, 205, 103, 46, 7, 9, 150, 126, 232, 209, 171, 2, 243, 20, 80, 94, 183, 0, 242, + 93, 106, 249, 46, 3, 104, 163, 202, 247, 30, 13, 233, 46, 53, 221, 101, 44, 64, 27, 141, 70, + 56, 57, 179, 34, 3, 157, 91, 20, 4, 19, 187, 8, 53, 108, 212, 32, 80, 220, 247, 120, 235, 7, + 200, 131, 183, 120, 235, 215, 13, 106, 8, 18, 35, 184, 182, 129, 141, 7, 231, 147, 149, 105, + 250, 196, 28, 212, 252, 61, 200, 41, 23, 85, 23, 81, 135, 169, 255, 128, 171, 116, 156, 104, + 3, 233, 8, 100, 15, 218, 238, 85, 51, 242, 23, 96, 142, 54, 243, 33, 232, 50, 221, 147, 24, + 72, 235, 152, 100, 237, 179, 222, 104, 49, 151, 205, 99, 118, 243, 180, 35, 249, 14, 83, + 245, 194, 100, 227, 133, 219, 36, 54, 222, 77, 231, 10, 137, 29, 65, 41, 177, 11, 118, 148, + 216, 17, 43, 37, 182, 108, 138, 137, 29, 145, 66, 98, 203, 118, 49, 177, 75, 166, 57, 1, + 229, 32, 209, 210, 65, 47, 136, 227, 46, 41, 180, 41, 78, 25, 77, 161, 200, 104, 114, 184, + 128, 178, 79, 50, 248, 136, 162, 176, 29, 26, 82, 81, 152, 223, 87, 20, 63, 145, 10, 27, + 168, 8, 168, 44, 46, 163, 236, 71, 74, 52, 64, 148, 46, 142, 124, 128, 137, 7, 250, 134, + 211, 207, 184, 102, 88, 225, 93, 69, 241, 11, 249, 141, 203, 224, 204, 43, 126, 18, 240, 83, + 225, 255, 183, 178, 156, 81, 197, 194, 34, 76, 172, 43, 209, 138, 203, 138, 160, 98, 85, 73, + 134, 84, 84, 4, 148, 106, 74, 178, 74, 37, 37, 27, 230, 236, 45, 21, 148, 131, 14, 156, 198, + 29, 189, 71, 231, 1, 22, 208, 24, 69, 1, 141, 222, 150, 80, 114, 169, 0, 62, 172, 24, 220, + 64, 175, 179, 172, 24, 158, 45, 20, 195, 139, 70, 243, 251, 246, 19, 213, 128, 118, 172, 39, + 73, 50, 28, 87, 18, 86, 111, 114, 194, 141, 37, 13, 129, 136, 148, 15, 146, 5, 101, 3, 2, + 165, 92, 16, 140, 48, 19, 112, 184, 144, 7, 130, 69, 204, 2, 209, 40, 29, 120, 41, 3, 122, + 122, 191, 22, 180, 66, 1, 141, 139, 202, 224, 81, 90, 236, 105, 213, 96, 227, 171, 23, 164, + 2, 147, 94, 34, 196, 0, 154, 95, 151, 8, 17, 15, 44, 179, 210, 143, 112, 133, 111, 176, 162, + 111, 160, 160, 145, 254, 72, 49, 224, 23, 28, 29, 100, 42, 211, 51, 42, 115, 170, 55, 37, + 42, 67, 246, 202, 4, 163, 203, 116, 150, 212, 39, 52, 173, 160, 251, 135, 232, 12, 110, 201, + 2, 254, 104, 62, 243, 242, 182, 49, 79, 63, 194, 53, 244, 10, 78, 19, 52, 55, 148, 6, 188, + 220, 226, 254, 112, 11, 175, 158, 84, 215, 199, 46, 34, 89, 14, 138, 138, 41, 191, 136, 94, + 78, 105, 225, 10, 15, 91, 202, 10, 2, 197, 26, 144, 237, 184, 12, 24, 43, 86, 130, 104, 74, + 197, 192, 72, 169, 30, 68, 187, 84, 18, 5, 211, 152, 192, 165, 32, 209, 146, 143, 149, 179, + 123, 132, 182, 183, 140, 83, 70, 83, 40, 50, 154, 28, 46, 160, 236, 147, 12, 30, 165, 70, + 135, 181, 231, 172, 69, 195, 25, 53, 134, 252, 168, 234, 136, 34, 157, 71, 138, 132, 12, 35, + 106, 68, 46, 36, 10, 68, 46, 36, 158, 188, 67, 138, 188, 101, 25, 224, 235, 231, 200, 140, + 137, 76, 231, 15, 46, 191, 165, 74, 240, 89, 124, 147, 198, 131, 50, 114, 170, 136, 86, 156, + 41, 4, 21, 19, 69, 50, 164, 60, 33, 160, 148, 38, 146, 85, 202, 18, 217, 48, 95, 136, 24, + 28, 218, 153, 220, 90, 225, 219, 42, 60, 9, 139, 75, 74, 208, 195, 106, 210, 241, 137, 206, + 158, 88, 109, 79, 23, 27, 224, 58, 137, 28, 80, 241, 93, 194, 223, 63, 241, 150, 163, 170, + 67, 246, 105, 225, 230, 137, 105, 46, 72, 24, 162, 248, 67, 209, 200, 130, 241, 14, 126, + 161, 76, 156, 176, 119, 77, 59, 70, 171, 91, 252, 122, 108, 217, 27, 18, 158, 3, 83, 49, 81, + 48, 77, 56, 35, 149, 133, 19, 62, 227, 24, 174, 144, 249, 153, 199, 105, 19, 22, 163, 151, + 36, 84, 91, 157, 50, 203, 2, 151, 117, 97, 193, 147, 172, 106, 105, 83, 211, 75, 187, 78, + 222, 99, 60, 87, 153, 161, 251, 250, 171, 102, 76, 102, 8, 225, 20, 242, 9, 151, 227, 253, + 239, 82, 204, 185, 141, 196, 249, 171, 93, 147, 254, 142, 63, 233, 108, 40, 218, 43, 62, + 124, 99, 234, 150, 2, 232, 178, 239, 167, 224, 59, 161, 228, 105, 114, 239, 60, 118, 41, + 186, 5, 218, 16, 71, 243, 67, 55, 157, 69, 139, 21, 123, 78, 74, 29, 221, 68, 156, 214, 162, + 141, 99, 88, 56, 101, 130, 227, 192, 116, 24, 113, 224, 134, 86, 196, 112, 40, 244, 252, 42, + 56, 196, 71, 4, 58, 189, 127, 2, 190, 158, 55, 83, 212, 87, 139, 62, 106, 72, 249, 179, 90, + 163, 43, 233, 133, 14, 199, 237, 187, 220, 83, 103, 93, 49, 9, 118, 112, 29, 110, 219, 46, + 140, 254, 136, 81, 62, 195, 121, 167, 232, 238, 9, 38, 250, 182, 47, 247, 11, 225, 175, 241, + 97, 102, 31, 167, 252, 123, 136, 194, 46, 130, 193, 122, 234, 102, 13, 189, 213, 192, 189, + 93, 169, 87, 163, 27, 169, 69, 31, 241, 21, 23, 114, 106, 88, 157, 8, 10, 23, 174, 168, 244, + 128, 19, 132, 197, 246, 141, 18, 169, 42, 18, 209, 24, 150, 44, 107, 152, 115, 180, 234, + 195, 138, 105, 81, 53, 39, 83, 162, 183, 49, 60, 10, 196, 135, 84, 17, 132, 86, 147, 48, 61, + 142, 220, 176, 18, 138, 44, 109, 74, 235, 62, 0, 58, 226, 57, 14, 38, 132, 53, 87, 119, 160, + 216, 86, 166, 2, 56, 138, 44, 111, 102, 203, 110, 88, 94, 135, 210, 178, 19, 40, 44, 11, 96, + 112, 5, 48, 222, 154, 13, 64, 240, 113, 220, 15, 11, 121, 13, 135, 150, 81, 124, 222, 77, + 104, 60, 164, 2, 26, 67, 45, 161, 236, 113, 1, 125, 184, 201, 88, 15, 190, 114, 143, 49, + 191, 169, 199, 248, 72, 91, 137, 61, 222, 18, 249, 70, 246, 128, 128, 220, 152, 68, 120, + 152, 132, 245, 127, 135, 56, 208, 1, 157, 21, 246, 151, 32, 143, 14, 78, 220, 30, 9, 199, + 37, 87, 236, 130, 195, 132, 99, 56, 26, 209, 68, 37, 233, 32, 97, 231, 110, 48, 199, 3, 129, + 203, 220, 176, 139, 13, 243, 36, 94, 177, 11, 38, 147, 43, 145, 75, 182, 148, 248, 35, 130, + 166, 235, 240, 215, 134, 6, 100, 219, 72, 3, 188, 107, 129, 5, 100, 75, 44, 197, 88, 86, + 130, 101, 170, 12, 209, 223, 120, 12, 157, 133, 39, 90, 177, 92, 19, 42, 151, 171, 140, 38, + 135, 11, 104, 116, 74, 70, 31, 80, 253, 29, 62, 17, 232, 100, 179, 234, 255, 9, 165, 129, + 98, 37, 160, 157, 117, 245, 159, 81, 212, 163, 140, 191, 194, 204, 201, 234, 158, 4, 253, + 53, 98, 103, 248, 129, 67, 223, 179, 156, 49, 32, 17, 248, 117, 128, 122, 31, 255, 240, 251, + 1, 147, 239, 30, 141, 98, 195, 234, 167, 7, 4, 62, 16, 62, 48, 17, 96, 82, 205, 8, 70, 135, + 94, 117, 189, 227, 194, 207, 143, 204, 124, 214, 89, 5, 111, 51, 174, 35, 250, 42, 165, 92, + 180, 148, 218, 89, 1, 227, 108, 148, 49, 108, 102, 12, 149, 122, 153, 104, 120, 28, 227, 20, + 230, 48, 74, 57, 220, 77, 189, 97, 221, 172, 38, 75, 225, 73, 178, 56, 185, 117, 122, 203, + 139, 114, 171, 146, 193, 120, 31, 166, 135, 224, 11, 143, 25, 17, 99, 103, 68, 232, 225, 62, + 99, 32, 53, 66, 225, 45, 67, 156, 119, 72, 79, 6, 36, 56, 126, 173, 196, 126, 115, 27, 159, + 39, 118, 100, 173, 122, 206, 58, 23, 127, 190, 192, 100, 206, 58, 250, 87, 122, 241, 204, + 85, 254, 220, 244, 121, 126, 172, 208, 54, 164, 199, 113, 143, 60, 39, 73, 252, 187, 248, + 92, 122, 63, 237, 243, 134, 101, 184, 238, 202, 47, 150, 248, 190, 9, 241, 117, 227, 234, + 167, 80, 56, 197, 231, 20, 74, 65, 156, 176, 126, 216, 24, 159, 95, 29, 233, 93, 147, 244, + 186, 49, 22, 178, 200, 87, 179, 61, 205, 166, 17, 193, 13, 13, 37, 21, 187, 21, 162, 82, + 179, 41, 201, 88, 90, 194, 52, 153, 16, 150, 61, 198, 208, 101, 38, 87, 7, 173, 180, 237, + 129, 172, 176, 96, 178, 167, 254, 139, 120, 74, 69, 184, 113, 116, 217, 41, 201, 97, 179, + 238, 138, 118, 211, 21, 49, 183, 181, 40, 237, 98, 77, 104, 148, 149, 43, 130, 154, 160, + 181, 157, 55, 42, 175, 105, 58, 157, 167, 100, 58, 241, 37, 83, 224, 147, 132, 108, 40, 193, + 80, 196, 178, 93, 84, 181, 37, 211, 92, 192, 114, 144, 104, 105, 189, 138, 24, 11, 158, 69, + 152, 34, 152, 2, 17, 193, 228, 173, 12, 178, 63, 34, 246, 8, 70, 129, 122, 48, 5, 229, 74, + 153, 114, 149, 228, 235, 84, 239, 153, 96, 176, 80, 175, 169, 190, 169, 17, 106, 174, 203, + 207, 153, 34, 46, 99, 238, 224, 15, 86, 188, 247, 220, 74, 169, 18, 29, 100, 91, 151, 245, + 45, 87, 33, 23, 6, 83, 207, 33, 235, 51, 136, 1, 218, 140, 86, 240, 180, 132, 48, 76, 175, + 6, 23, 98, 123, 252, 27, 182, 71, 198, 41, 70, 238, 151, 179, 160, 91, 139, 109, 99, 153, + 220, 46, 238, 133, 127, 200, 31, 255, 64, 143, 223, 177, 8, 128, 144, 191, 106, 198, 153, + 38, 181, 102, 169, 12, 41, 60, 100, 181, 68, 177, 239, 169, 243, 67, 184, 91, 113, 127, 49, + 49, 99, 20, 204, 193, 45, 21, 110, 90, 136, 118, 207, 43, 29, 112, 165, 104, 227, 33, 207, + 230, 54, 89, 17, 124, 132, 164, 241, 244, 152, 116, 129, 218, 158, 199, 12, 226, 121, 112, + 251, 175, 158, 84, 215, 199, 18, 32, 25, 251, 142, 175, 255, 183, 19, 135, 159, 211, 89, + 228, 128, 151, 71, 183, 12, 148, 199, 26, 114, 213, 198, 54, 150, 30, 62, 210, 69, 107, 3, + 179, 237, 99, 47, 122, 132, 53, 77, 202, 38, 71, 25, 148, 242, 233, 102, 118, 174, 153, 94, + 225, 217, 5, 22, 203, 219, 248, 225, 29, 95, 150, 192, 205, 233, 33, 163, 177, 194, 221, + 230, 62, 224, 1, 56, 140, 224, 122, 143, 172, 48, 35, 235, 255, 76, 66, 135, 255, 161, 132, + 166, 204, 101, 189, 6, 44, 131, 41, 75, 4, 251, 232, 188, 77, 166, 46, 74, 248, 92, 15, 71, + 83, 207, 89, 124, 227, 253, 158, 108, 167, 120, 149, 115, 255, 182, 54, 105, 29, 234, 217, + 66, 155, 100, 80, 108, 147, 178, 29, 183, 73, 198, 138, 109, 82, 52, 165, 54, 201, 72, 169, + 77, 138, 118, 169, 77, 22, 76, 99, 91, 42, 5, 137, 212, 3, 194, 58, 129, 218, 154, 13, 102, + 54, 114, 253, 65, 16, 206, 39, 130, 210, 209, 201, 27, 78, 152, 176, 38, 29, 107, 196, 74, + 199, 42, 46, 59, 195, 182, 203, 226, 145, 71, 164, 112, 228, 226, 154, 51, 108, 187, 102, + 188, 142, 210, 178, 116, 29, 242, 170, 25, 18, 22, 61, 130, 125, 247, 252, 164, 218, 253, + 75, 128, 1, 0, 115, 44, 217, 219, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, + 101, 110, 100, 111, 98, 106, 13, 49, 50, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, + 111, 110, 116, 101, 110, 116, 115, 32, 49, 50, 49, 32, 48, 32, 82, 47, 67, 114, 111, 112, + 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, + 66, 111, 120, 91, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, + 116, 32, 51, 52, 54, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, + 47, 70, 111, 110, 116, 60, 60, 47, 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, + 49, 32, 49, 56, 50, 32, 48, 32, 82, 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, + 84, 51, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 52, 32, 49, 56, 57, 32, 48, 32, 82, 47, + 84, 84, 53, 32, 49, 56, 55, 32, 48, 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, + 47, 80, 68, 70, 47, 84, 101, 120, 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, + 47, 83, 116, 114, 117, 99, 116, 80, 97, 114, 101, 110, 116, 115, 32, 53, 53, 47, 84, 121, + 112, 101, 47, 80, 97, 103, 101, 62, 62, 13, 101, 110, 100, 111, 98, 106, 13, 49, 50, 49, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 56, 51, 53, 62, + 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 204, 87, 109, 111, 220, 70, 14, 254, 238, + 95, 161, 143, 171, 92, 53, 209, 188, 74, 66, 139, 2, 141, 157, 2, 185, 160, 189, 107, 187, + 215, 124, 72, 15, 56, 39, 78, 210, 92, 109, 55, 181, 227, 20, 249, 247, 199, 183, 25, 105, + 87, 156, 181, 29, 32, 197, 33, 128, 163, 157, 103, 200, 33, 57, 228, 67, 206, 195, 127, 158, + 94, 189, 111, 190, 250, 234, 225, 119, 199, 79, 78, 154, 190, 249, 250, 235, 71, 39, 199, + 205, 209, 163, 237, 81, 223, 224, 191, 171, 55, 71, 15, 183, 219, 190, 177, 174, 217, 190, + 62, 234, 205, 52, 77, 35, 1, 182, 113, 83, 48, 83, 106, 6, 231, 76, 104, 182, 23, 71, 207, + 55, 177, 77, 27, 223, 254, 123, 251, 119, 148, 177, 141, 245, 102, 34, 49, 235, 140, 11, 14, + 132, 182, 103, 71, 155, 166, 221, 254, 247, 168, 179, 147, 51, 189, 31, 155, 206, 38, 227, + 221, 12, 176, 32, 75, 141, 9, 182, 12, 77, 151, 98, 111, 82, 216, 223, 147, 149, 119, 101, + 223, 90, 85, 182, 219, 26, 215, 164, 104, 141, 37, 248, 249, 230, 167, 182, 27, 54, 6, 172, + 109, 218, 184, 249, 190, 237, 236, 230, 247, 182, 115, 176, 130, 182, 63, 222, 30, 253, 113, + 100, 67, 52, 33, 52, 105, 28, 140, 79, 77, 50, 97, 108, 108, 48, 54, 53, 87, 175, 142, 158, + 61, 104, 46, 49, 66, 112, 128, 211, 2, 147, 101, 167, 30, 220, 198, 200, 176, 61, 160, 247, + 7, 17, 83, 227, 105, 227, 176, 43, 246, 124, 115, 220, 142, 108, 217, 5, 26, 76, 127, 232, + 231, 89, 219, 249, 205, 91, 176, 253, 61, 248, 240, 177, 237, 2, 156, 32, 97, 47, 22, 53, + 29, 92, 76, 63, 54, 219, 147, 117, 60, 156, 155, 76, 223, 167, 70, 118, 96, 72, 126, 108, + 221, 230, 180, 237, 18, 169, 124, 5, 63, 48, 52, 116, 216, 107, 214, 31, 249, 212, 27, 252, + 131, 123, 240, 120, 220, 119, 189, 127, 114, 154, 140, 31, 194, 242, 182, 193, 115, 219, 79, + 232, 220, 208, 91, 51, 164, 166, 199, 120, 210, 31, 8, 231, 235, 219, 65, 184, 105, 1, 49, + 141, 102, 8, 174, 116, 134, 246, 229, 34, 230, 165, 96, 174, 167, 203, 159, 81, 31, 189, + 137, 53, 81, 31, 139, 160, 245, 1, 180, 204, 80, 24, 71, 83, 179, 244, 16, 38, 46, 166, 97, + 196, 154, 161, 117, 8, 254, 174, 31, 58, 40, 150, 234, 32, 31, 169, 99, 7, 82, 13, 238, 7, + 197, 82, 66, 49, 202, 180, 111, 177, 8, 174, 218, 46, 230, 124, 179, 94, 114, 170, 179, 80, + 61, 163, 163, 116, 138, 137, 147, 229, 151, 77, 219, 141, 155, 119, 152, 10, 152, 2, 36, + 135, 25, 242, 18, 101, 113, 229, 50, 103, 201, 47, 237, 126, 122, 4, 176, 120, 90, 102, 199, + 194, 72, 143, 6, 13, 205, 226, 164, 109, 49, 41, 91, 51, 66, 230, 250, 207, 103, 205, 156, + 171, 24, 213, 124, 135, 171, 156, 211, 193, 197, 93, 105, 96, 209, 201, 129, 95, 100, 142, + 235, 113, 65, 151, 11, 206, 46, 204, 89, 137, 150, 12, 80, 108, 21, 71, 188, 47, 201, 15, + 212, 228, 211, 174, 39, 58, 154, 93, 209, 209, 108, 112, 5, 101, 155, 116, 240, 16, 3, 186, + 136, 165, 147, 28, 51, 53, 230, 229, 207, 109, 55, 1, 47, 15, 112, 57, 157, 141, 49, 108, + 190, 129, 139, 45, 28, 52, 115, 35, 125, 189, 200, 180, 120, 190, 207, 77, 185, 167, 76, + 209, 184, 169, 118, 223, 222, 97, 155, 209, 233, 71, 64, 141, 126, 42, 114, 68, 63, 130, + 213, 232, 71, 23, 165, 68, 97, 164, 150, 40, 170, 92, 78, 148, 138, 168, 92, 74, 205, 73, + 148, 132, 255, 124, 230, 17, 15, 85, 191, 235, 167, 142, 138, 94, 29, 228, 203, 182, 250, + 101, 15, 168, 53, 78, 212, 97, 177, 75, 90, 97, 3, 159, 27, 9, 84, 186, 221, 99, 138, 172, + 202, 97, 252, 34, 131, 152, 37, 1, 155, 22, 164, 192, 175, 109, 128, 12, 24, 161, 246, 29, + 100, 193, 200, 139, 144, 59, 206, 6, 228, 9, 71, 224, 37, 108, 2, 114, 176, 3, 109, 185, + 129, 95, 103, 152, 93, 5, 123, 131, 73, 135, 9, 55, 5, 82, 176, 80, 133, 122, 223, 35, 193, + 92, 193, 10, 31, 132, 122, 100, 243, 7, 36, 162, 186, 29, 215, 168, 23, 56, 168, 88, 196, 7, + 226, 209, 204, 110, 208, 180, 97, 202, 192, 89, 231, 132, 167, 20, 203, 130, 23, 248, 245, + 182, 157, 54, 29, 124, 132, 205, 211, 214, 78, 100, 232, 239, 80, 3, 120, 194, 111, 173, + 103, 75, 193, 17, 238, 213, 39, 204, 155, 105, 243, 39, 126, 92, 202, 42, 69, 128, 212, 62, + 165, 13, 96, 11, 91, 31, 161, 203, 59, 212, 215, 1, 239, 163, 107, 116, 34, 174, 155, 54, + 27, 231, 32, 230, 131, 75, 141, 88, 136, 113, 247, 112, 64, 15, 59, 103, 118, 142, 38, 245, + 1, 216, 185, 47, 123, 232, 204, 191, 161, 109, 94, 6, 46, 50, 224, 25, 120, 67, 31, 100, 67, + 30, 96, 70, 111, 250, 8, 13, 160, 223, 57, 34, 238, 28, 49, 25, 87, 61, 226, 251, 150, 111, + 241, 28, 36, 108, 237, 176, 220, 217, 22, 165, 223, 143, 102, 84, 233, 147, 242, 158, 64, + 181, 244, 117, 57, 46, 125, 198, 170, 165, 175, 138, 82, 233, 51, 82, 43, 125, 85, 46, 151, + 126, 69, 84, 74, 180, 230, 36, 72, 198, 52, 24, 17, 9, 118, 191, 242, 117, 80, 28, 209, 65, + 177, 182, 2, 146, 61, 58, 118, 7, 198, 136, 144, 100, 68, 24, 238, 51, 18, 134, 165, 242, + 196, 44, 226, 226, 161, 133, 99, 110, 53, 137, 203, 227, 29, 0, 69, 228, 125, 107, 165, 4, + 113, 233, 35, 110, 20, 161, 71, 45, 77, 205, 54, 103, 230, 200, 4, 34, 232, 191, 90, 43, 20, + 240, 118, 15, 161, 172, 166, 19, 81, 3, 238, 43, 229, 138, 217, 187, 125, 0, 126, 72, 213, + 166, 185, 102, 191, 104, 167, 204, 46, 184, 78, 10, 209, 71, 50, 13, 119, 9, 85, 21, 224, + 20, 165, 178, 143, 0, 16, 97, 136, 45, 142, 183, 8, 66, 182, 60, 65, 138, 251, 150, 217, + 129, 86, 47, 248, 249, 132, 38, 184, 69, 248, 148, 35, 102, 158, 35, 219, 209, 35, 42, 202, + 19, 113, 26, 30, 148, 155, 64, 140, 146, 192, 141, 206, 246, 244, 213, 11, 199, 248, 188, + 133, 207, 226, 250, 166, 133, 165, 197, 197, 96, 87, 184, 187, 48, 122, 166, 247, 210, 19, + 166, 64, 215, 126, 154, 47, 147, 62, 152, 208, 139, 58, 185, 201, 98, 181, 238, 110, 180, + 149, 136, 34, 224, 201, 250, 217, 151, 68, 128, 231, 195, 95, 182, 69, 193, 30, 5, 203, 234, + 187, 108, 177, 180, 29, 55, 202, 30, 228, 56, 104, 8, 124, 247, 216, 196, 86, 17, 190, 165, + 29, 193, 1, 192, 55, 179, 185, 220, 59, 104, 77, 188, 100, 83, 220, 238, 126, 213, 79, 4, + 28, 81, 117, 190, 45, 241, 19, 129, 133, 159, 248, 115, 199, 79, 190, 199, 98, 242, 153, 24, + 58, 247, 75, 169, 169, 110, 218, 243, 149, 59, 218, 93, 58, 46, 231, 18, 191, 103, 231, 212, + 137, 106, 222, 68, 28, 34, 109, 92, 214, 78, 121, 123, 112, 3, 140, 205, 0, 243, 13, 211, + 72, 90, 245, 191, 193, 244, 161, 214, 156, 146, 244, 191, 253, 182, 228, 246, 250, 210, 8, + 143, 179, 105, 167, 9, 14, 171, 115, 62, 67, 19, 68, 62, 206, 157, 106, 213, 4, 5, 212, 154, + 96, 69, 142, 154, 160, 96, 181, 38, 168, 139, 98, 19, 20, 164, 210, 4, 117, 57, 105, 130, + 53, 209, 210, 116, 116, 39, 65, 50, 12, 52, 185, 210, 250, 228, 205, 24, 118, 252, 172, 160, + 226, 74, 5, 21, 131, 107, 40, 217, 84, 1, 111, 239, 132, 33, 81, 223, 196, 86, 232, 63, 185, + 21, 62, 110, 7, 117, 188, 197, 220, 201, 245, 68, 149, 126, 46, 221, 107, 238, 109, 3, 147, + 113, 97, 40, 162, 10, 218, 59, 119, 195, 51, 33, 37, 216, 14, 165, 175, 245, 221, 60, 135, + 207, 157, 119, 88, 79, 198, 68, 14, 247, 110, 191, 248, 96, 84, 219, 175, 139, 25, 230, 254, + 27, 50, 15, 216, 148, 1, 181, 253, 50, 87, 15, 97, 213, 120, 157, 45, 52, 83, 204, 189, 87, + 255, 205, 81, 170, 245, 179, 122, 3, 254, 208, 194, 77, 149, 27, 186, 89, 52, 56, 105, 207, + 110, 175, 97, 221, 161, 65, 243, 67, 4, 166, 69, 122, 136, 236, 119, 234, 88, 111, 211, 227, + 14, 87, 66, 110, 7, 99, 211, 167, 144, 37, 158, 146, 9, 243, 255, 144, 44, 195, 224, 76, + 237, 193, 192, 152, 70, 149, 186, 20, 49, 37, 67, 53, 162, 84, 5, 145, 39, 25, 168, 208, + 164, 42, 37, 44, 89, 17, 20, 66, 170, 56, 135, 114, 189, 44, 38, 200, 143, 93, 231, 214, 72, + 182, 126, 141, 100, 11, 21, 132, 77, 80, 142, 201, 6, 12, 168, 179, 18, 122, 6, 213, 216, + 235, 114, 28, 124, 198, 170, 209, 87, 69, 41, 252, 140, 212, 226, 175, 202, 229, 11, 168, + 136, 138, 251, 154, 36, 119, 132, 94, 239, 8, 193, 64, 200, 252, 20, 81, 14, 58, 2, 190, + 113, 96, 246, 121, 2, 197, 96, 132, 117, 2, 140, 156, 255, 104, 59, 172, 251, 132, 115, 141, + 7, 54, 64, 78, 130, 154, 190, 94, 229, 119, 143, 197, 121, 32, 202, 0, 214, 162, 172, 200, + 149, 40, 3, 118, 40, 202, 107, 209, 28, 101, 64, 14, 68, 121, 45, 183, 136, 178, 38, 90, + 162, 172, 59, 9, 146, 30, 153, 69, 214, 157, 51, 49, 237, 248, 89, 65, 89, 111, 5, 60, 212, + 208, 61, 206, 148, 30, 234, 46, 140, 124, 123, 150, 46, 14, 47, 101, 209, 213, 39, 8, 156, + 91, 118, 117, 184, 176, 63, 200, 36, 16, 78, 147, 241, 232, 227, 224, 26, 224, 238, 68, 83, + 196, 179, 7, 205, 229, 193, 115, 89, 180, 156, 91, 180, 254, 112, 88, 106, 160, 8, 45, 204, + 197, 30, 153, 167, 5, 234, 190, 251, 99, 120, 220, 236, 14, 209, 50, 125, 248, 61, 178, 78, + 198, 5, 75, 205, 135, 169, 154, 13, 234, 92, 130, 54, 18, 23, 235, 251, 173, 130, 105, 28, + 41, 252, 156, 178, 61, 110, 190, 65, 246, 166, 102, 73, 93, 235, 120, 126, 199, 241, 108, + 180, 212, 69, 106, 188, 210, 109, 132, 255, 179, 241, 163, 53, 126, 128, 140, 243, 152, 2, + 197, 254, 248, 23, 219, 143, 181, 180, 178, 126, 238, 99, 99, 246, 194, 221, 222, 198, 32, + 83, 43, 53, 142, 136, 86, 224, 154, 4, 85, 55, 2, 181, 210, 86, 132, 176, 174, 113, 185, 82, + 212, 138, 132, 84, 180, 42, 148, 203, 174, 86, 203, 46, 226, 127, 180, 30, 199, 85, 45, 235, + 104, 182, 93, 71, 179, 157, 21, 148, 13, 210, 193, 219, 121, 192, 122, 148, 163, 194, 114, + 247, 230, 1, 219, 27, 239, 62, 141, 7, 202, 185, 247, 227, 129, 133, 185, 91, 48, 23, 135, + 77, 226, 128, 107, 236, 64, 208, 121, 224, 174, 243, 136, 25, 224, 65, 16, 242, 218, 187, + 60, 122, 94, 229, 97, 119, 41, 129, 106, 94, 207, 155, 9, 87, 85, 83, 37, 173, 134, 237, 50, + 109, 23, 225, 3, 147, 46, 150, 18, 78, 186, 85, 139, 226, 194, 156, 40, 250, 181, 87, 211, + 72, 251, 46, 203, 123, 227, 101, 203, 245, 173, 88, 143, 37, 185, 207, 138, 139, 170, 222, + 31, 151, 107, 204, 50, 192, 131, 49, 85, 152, 101, 61, 220, 106, 172, 34, 36, 132, 135, 64, + 238, 140, 189, 43, 195, 127, 182, 227, 22, 90, 28, 70, 227, 32, 185, 23, 179, 254, 254, 12, + 254, 151, 24, 63, 192, 152, 111, 119, 108, 191, 211, 112, 31, 214, 172, 8, 195, 84, 230, + 151, 53, 49, 50, 168, 114, 163, 46, 199, 244, 200, 88, 149, 33, 85, 81, 34, 73, 70, 106, 60, + 169, 202, 101, 170, 172, 136, 10, 57, 213, 156, 4, 73, 151, 176, 97, 21, 230, 218, 117, 83, + 7, 197, 17, 29, 20, 107, 43, 32, 217, 163, 99, 204, 62, 190, 206, 149, 46, 114, 238, 92, 80, + 51, 134, 225, 214, 204, 9, 177, 96, 69, 23, 51, 37, 122, 147, 198, 61, 74, 212, 213, 139, + 92, 86, 127, 47, 74, 68, 49, 172, 5, 180, 138, 210, 20, 75, 255, 2, 83, 14, 25, 6, 127, 220, + 192, 255, 153, 14, 153, 78, 206, 132, 92, 126, 132, 2, 64, 244, 5, 85, 216, 11, 193, 129, + 91, 136, 174, 150, 135, 185, 100, 205, 184, 60, 140, 109, 180, 240, 224, 245, 56, 215, 114, + 17, 216, 59, 213, 226, 246, 129, 124, 132, 209, 64, 21, 185, 201, 56, 41, 34, 71, 35, 78, + 18, 18, 196, 41, 130, 137, 85, 122, 82, 104, 172, 197, 41, 26, 34, 33, 229, 204, 125, 233, + 63, 168, 140, 113, 10, 19, 107, 95, 196, 173, 115, 112, 210, 184, 91, 253, 60, 14, 166, 205, + 67, 56, 235, 55, 172, 241, 55, 200, 148, 6, 75, 254, 139, 118, 146, 67, 193, 4, 168, 116, + 191, 35, 248, 103, 38, 248, 76, 186, 185, 13, 108, 62, 160, 176, 68, 144, 71, 35, 220, 34, + 180, 78, 156, 151, 160, 95, 238, 106, 59, 23, 30, 39, 173, 34, 91, 246, 207, 60, 225, 82, + 196, 100, 210, 121, 66, 64, 141, 39, 42, 114, 196, 19, 130, 213, 120, 66, 23, 69, 158, 16, + 164, 194, 19, 186, 156, 240, 68, 77, 84, 234, 178, 230, 36, 74, 194, 11, 42, 155, 185, 30, + 172, 42, 104, 118, 69, 71, 179, 193, 21, 148, 109, 210, 193, 91, 201, 194, 78, 224, 11, 87, + 101, 168, 115, 133, 157, 28, 7, 226, 254, 116, 81, 14, 184, 23, 91, 160, 20, 162, 104, 215, + 227, 118, 80, 7, 11, 108, 96, 203, 129, 226, 233, 219, 60, 161, 188, 4, 108, 152, 243, 253, + 82, 104, 132, 104, 39, 87, 196, 5, 189, 6, 46, 243, 158, 143, 109, 40, 131, 135, 131, 66, + 47, 92, 49, 208, 180, 9, 5, 19, 75, 137, 15, 16, 0, 183, 162, 11, 96, 30, 103, 221, 114, 94, + 177, 119, 122, 9, 45, 138, 167, 79, 136, 84, 138, 135, 65, 181, 120, 116, 57, 46, 30, 198, + 170, 197, 163, 138, 82, 241, 48, 82, 43, 30, 85, 46, 23, 79, 69, 84, 18, 181, 230, 36, 94, + 251, 48, 24, 47, 50, 204, 183, 187, 104, 194, 57, 166, 38, 90, 3, 33, 66, 2, 106, 193, 171, + 29, 153, 81, 85, 43, 133, 86, 176, 90, 104, 43, 138, 11, 170, 41, 198, 192, 11, 82, 9, 124, + 69, 107, 65, 53, 173, 114, 45, 53, 197, 116, 45, 53, 189, 2, 170, 106, 15, 96, 135, 42, 220, + 70, 164, 5, 224, 80, 47, 196, 243, 96, 230, 28, 16, 138, 229, 69, 55, 6, 151, 171, 112, 53, + 231, 226, 236, 218, 77, 126, 211, 65, 141, 17, 8, 109, 49, 1, 41, 56, 161, 4, 160, 178, 27, + 92, 57, 207, 156, 112, 147, 241, 87, 45, 112, 3, 10, 7, 86, 120, 137, 0, 62, 99, 16, 60, + 197, 31, 215, 89, 230, 138, 230, 14, 88, 121, 217, 218, 184, 82, 67, 70, 163, 154, 147, 214, + 150, 206, 42, 205, 145, 219, 37, 208, 205, 59, 220, 127, 129, 173, 82, 168, 8, 134, 133, + 247, 252, 202, 65, 209, 227, 22, 72, 136, 144, 107, 106, 193, 227, 230, 203, 54, 91, 247, + 19, 90, 247, 12, 124, 235, 249, 19, 86, 7, 120, 35, 57, 151, 228, 232, 65, 246, 208, 65, + 228, 50, 250, 126, 154, 221, 102, 45, 172, 160, 24, 245, 154, 159, 115, 59, 161, 160, 9, 2, + 195, 109, 119, 90, 62, 233, 46, 254, 146, 254, 95, 241, 87, 22, 119, 28, 243, 87, 249, 226, + 242, 109, 195, 184, 52, 13, 50, 242, 228, 9, 167, 207, 19, 14, 131, 48, 220, 97, 139, 42, + 59, 122, 90, 25, 241, 197, 89, 72, 241, 241, 119, 199, 205, 209, 255, 4, 24, 0, 0, 117, 194, + 1, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, + 49, 50, 50, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, + 32, 49, 50, 51, 32, 48, 32, 82, 47, 67, 114, 111, 112, 66, 111, 120, 91, 48, 32, 48, 32, 53, + 57, 53, 32, 56, 52, 50, 93, 47, 77, 101, 100, 105, 97, 66, 111, 120, 91, 48, 32, 48, 32, 53, + 57, 53, 32, 56, 52, 50, 93, 47, 80, 97, 114, 101, 110, 116, 32, 51, 52, 54, 32, 48, 32, 82, + 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, 60, 47, 70, 111, 110, 116, 60, 60, 47, + 84, 84, 48, 32, 49, 56, 54, 32, 48, 32, 82, 47, 84, 84, 49, 32, 49, 56, 50, 32, 48, 32, 82, + 47, 84, 84, 50, 32, 49, 55, 57, 32, 48, 32, 82, 47, 84, 84, 51, 32, 50, 48, 50, 32, 48, 32, + 82, 47, 84, 84, 52, 32, 49, 57, 50, 32, 48, 32, 82, 47, 84, 84, 53, 32, 50, 48, 48, 32, 48, + 32, 82, 62, 62, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 47, 84, 101, 120, + 116, 93, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 83, 116, 114, 117, 99, 116, 80, + 97, 114, 101, 110, 116, 115, 32, 53, 54, 47, 84, 121, 112, 101, 47, 80, 97, 103, 101, 62, + 62, 13, 101, 110, 100, 111, 98, 106, 13, 49, 50, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, + 76, 101, 110, 103, 116, 104, 32, 50, 52, 54, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, + 10, 72, 137, 220, 87, 107, 111, 220, 182, 18, 253, 190, 191, 66, 31, 165, 32, 98, 196, 167, + 36, 160, 40, 112, 99, 187, 105, 138, 166, 189, 72, 246, 195, 5, 220, 0, 117, 226, 71, 220, + 218, 78, 107, 59, 77, 243, 239, 59, 103, 248, 144, 86, 75, 122, 227, 184, 64, 209, 155, 96, + 215, 75, 14, 103, 56, 28, 158, 51, 51, 124, 242, 223, 163, 235, 219, 234, 171, 175, 158, + 188, 216, 123, 190, 95, 117, 213, 215, 95, 63, 221, 223, 171, 86, 79, 215, 171, 174, 194, + 255, 235, 179, 213, 147, 245, 186, 171, 164, 170, 214, 167, 171, 78, 140, 227, 56, 176, 64, + 86, 106, 52, 98, 116, 85, 175, 148, 48, 213, 250, 114, 117, 88, 219, 198, 213, 166, 121, + 189, 254, 14, 58, 178, 146, 90, 140, 172, 38, 149, 80, 70, 145, 210, 250, 120, 85, 87, 205, + 250, 151, 85, 43, 71, 37, 58, 61, 84, 173, 116, 66, 171, 73, 224, 21, 189, 214, 224, 104, + 73, 95, 181, 206, 118, 194, 153, 229, 154, 104, 188, 77, 235, 182, 77, 37, 191, 43, 103, + 165, 112, 213, 122, 159, 188, 220, 111, 90, 217, 213, 162, 233, 105, 25, 41, 247, 166, 222, + 107, 134, 250, 219, 166, 29, 235, 255, 52, 182, 254, 129, 38, 235, 103, 77, 171, 235, 3, 90, + 242, 170, 105, 177, 206, 214, 207, 233, 108, 44, 194, 96, 143, 126, 72, 150, 243, 212, 186, + 105, 109, 253, 178, 81, 172, 255, 61, 253, 133, 97, 195, 242, 255, 193, 44, 236, 67, 159, + 141, 29, 120, 35, 83, 148, 130, 135, 45, 197, 113, 72, 30, 90, 114, 176, 29, 106, 73, 90, + 162, 145, 122, 82, 136, 71, 210, 116, 232, 174, 247, 49, 61, 244, 110, 96, 27, 124, 252, 1, + 225, 167, 255, 245, 1, 135, 185, 37, 75, 159, 154, 214, 241, 252, 53, 54, 56, 194, 8, 211, + 39, 236, 177, 229, 207, 251, 166, 85, 245, 85, 99, 104, 224, 194, 49, 207, 105, 250, 12, + 107, 89, 129, 85, 161, 1, 205, 168, 125, 179, 60, 142, 52, 163, 136, 222, 109, 221, 134, + 162, 219, 148, 209, 243, 67, 218, 235, 35, 237, 99, 121, 31, 24, 124, 7, 119, 225, 11, 44, + 159, 54, 173, 241, 95, 24, 189, 133, 119, 183, 180, 218, 47, 224, 121, 118, 136, 221, 190, + 140, 119, 213, 145, 21, 197, 145, 115, 244, 27, 171, 227, 72, 241, 40, 202, 53, 143, 94, 67, + 119, 235, 66, 100, 175, 132, 182, 166, 112, 132, 86, 187, 142, 14, 168, 8, 116, 102, 3, 155, + 206, 10, 53, 234, 170, 53, 86, 104, 231, 79, 232, 47, 193, 135, 137, 110, 137, 207, 192, 78, + 227, 192, 191, 197, 187, 57, 159, 130, 31, 142, 207, 35, 62, 98, 21, 111, 128, 167, 248, + 235, 24, 171, 82, 216, 85, 116, 186, 83, 194, 118, 178, 224, 244, 72, 244, 237, 135, 74, + 119, 196, 70, 239, 26, 48, 187, 5, 131, 205, 125, 49, 251, 103, 242, 27, 94, 242, 41, 226, + 98, 246, 99, 6, 176, 133, 67, 148, 34, 180, 30, 231, 254, 28, 172, 201, 203, 81, 24, 83, 57, + 194, 136, 163, 100, 34, 76, 248, 186, 62, 89, 157, 238, 22, 18, 235, 131, 80, 25, 77, 156, + 158, 164, 218, 106, 97, 85, 65, 21, 119, 25, 36, 82, 27, 202, 88, 147, 200, 12, 131, 40, + 237, 120, 151, 44, 186, 170, 122, 65, 167, 229, 121, 226, 176, 117, 155, 222, 228, 165, 193, + 110, 94, 72, 217, 183, 148, 116, 117, 15, 223, 157, 180, 208, 227, 164, 251, 13, 174, 99, + 78, 130, 148, 45, 128, 205, 97, 208, 49, 179, 208, 13, 252, 84, 227, 10, 186, 234, 44, 100, + 247, 151, 207, 200, 186, 234, 93, 245, 145, 76, 255, 66, 159, 239, 42, 236, 172, 43, 41, 69, + 103, 152, 171, 213, 250, 186, 162, 48, 39, 80, 253, 236, 45, 100, 106, 3, 86, 90, 209, 187, + 68, 109, 164, 16, 198, 55, 192, 194, 30, 2, 49, 146, 73, 57, 125, 188, 175, 228, 225, 32, + 103, 108, 58, 244, 48, 139, 204, 96, 240, 253, 202, 83, 63, 53, 75, 144, 105, 41, 84, 231, + 10, 160, 39, 34, 186, 110, 164, 184, 225, 170, 216, 240, 58, 197, 42, 132, 73, 81, 105, 160, + 211, 230, 194, 244, 255, 16, 140, 25, 227, 148, 131, 197, 45, 102, 4, 160, 230, 133, 73, + 205, 57, 148, 251, 25, 53, 84, 135, 137, 188, 158, 161, 160, 154, 178, 106, 64, 127, 78, 51, + 248, 106, 221, 36, 116, 221, 134, 167, 57, 81, 112, 38, 43, 226, 205, 114, 18, 207, 51, 153, + 227, 153, 36, 134, 209, 78, 214, 95, 1, 120, 246, 99, 131, 27, 160, 123, 123, 215, 160, 24, + 113, 18, 31, 248, 18, 211, 236, 17, 174, 196, 23, 79, 46, 78, 92, 212, 134, 250, 130, 62, + 183, 190, 108, 250, 212, 47, 125, 23, 241, 182, 81, 44, 63, 67, 143, 112, 228, 105, 60, 248, + 69, 188, 124, 210, 185, 193, 138, 199, 205, 24, 242, 179, 11, 198, 49, 186, 136, 42, 216, + 151, 45, 37, 119, 124, 23, 130, 249, 247, 92, 171, 25, 115, 128, 75, 151, 176, 133, 110, + 131, 181, 255, 68, 237, 132, 67, 60, 58, 241, 37, 198, 176, 123, 201, 48, 182, 115, 100, + 201, 54, 190, 139, 184, 132, 203, 151, 17, 128, 38, 132, 113, 176, 98, 212, 203, 210, 63, + 85, 85, 74, 120, 214, 86, 51, 104, 171, 4, 255, 133, 33, 57, 80, 157, 90, 22, 224, 104, 136, + 18, 178, 74, 220, 242, 181, 252, 179, 76, 76, 100, 0, 32, 164, 43, 84, 152, 32, 44, 84, 152, + 188, 42, 168, 18, 36, 5, 170, 228, 245, 2, 85, 74, 170, 9, 189, 121, 103, 161, 169, 134, + 164, 67, 121, 78, 109, 250, 154, 21, 70, 135, 242, 66, 191, 101, 86, 182, 155, 50, 212, 133, + 247, 234, 223, 75, 25, 187, 131, 15, 240, 100, 198, 8, 0, 110, 253, 136, 206, 154, 33, 70, + 120, 44, 188, 225, 141, 63, 144, 206, 109, 76, 251, 11, 78, 222, 181, 103, 140, 200, 6, 11, + 251, 212, 216, 110, 243, 48, 245, 130, 78, 10, 107, 85, 137, 136, 29, 73, 205, 146, 135, + 246, 225, 60, 28, 239, 205, 67, 194, 153, 41, 117, 122, 65, 88, 226, 97, 86, 149, 121, 232, + 37, 37, 30, 102, 245, 34, 15, 11, 170, 137, 20, 121, 103, 73, 211, 140, 220, 40, 68, 198, + 208, 204, 220, 217, 130, 52, 184, 84, 146, 242, 174, 5, 225, 78, 46, 154, 126, 228, 206, 37, + 181, 137, 57, 106, 13, 129, 88, 173, 236, 239, 67, 173, 137, 86, 230, 139, 234, 208, 46, + 158, 109, 32, 30, 250, 229, 202, 19, 17, 175, 232, 101, 99, 204, 178, 17, 140, 241, 209, + 120, 118, 246, 17, 170, 134, 44, 153, 135, 161, 29, 206, 200, 251, 162, 221, 208, 35, 204, + 150, 170, 78, 16, 22, 208, 158, 87, 5, 218, 131, 164, 128, 246, 188, 94, 64, 123, 73, 53, + 224, 174, 228, 44, 52, 227, 131, 104, 251, 205, 147, 19, 69, 103, 114, 34, 191, 89, 70, 178, + 27, 225, 180, 242, 159, 135, 247, 61, 107, 70, 182, 139, 162, 87, 72, 168, 22, 102, 94, 43, + 166, 118, 109, 24, 124, 187, 246, 16, 30, 161, 114, 160, 106, 116, 119, 242, 72, 118, 86, + 232, 65, 150, 42, 135, 237, 69, 79, 63, 131, 75, 255, 40, 153, 92, 15, 184, 21, 200, 228, + 133, 37, 50, 101, 85, 153, 76, 94, 82, 34, 83, 86, 47, 146, 169, 160, 26, 240, 93, 114, 22, + 154, 148, 186, 186, 161, 88, 58, 242, 210, 232, 82, 65, 234, 119, 205, 11, 119, 19, 139, + 226, 78, 122, 255, 66, 110, 245, 225, 61, 113, 31, 110, 197, 167, 208, 223, 193, 173, 187, + 107, 212, 103, 115, 43, 182, 101, 54, 112, 203, 126, 57, 183, 220, 151, 60, 143, 140, 26, + 69, 177, 78, 177, 172, 196, 172, 156, 34, 19, 139, 5, 37, 94, 229, 180, 34, 173, 242, 138, + 30, 223, 37, 55, 73, 79, 143, 74, 76, 93, 211, 230, 179, 40, 43, 11, 190, 228, 101, 188, 93, + 86, 180, 147, 76, 122, 32, 141, 187, 159, 68, 195, 189, 158, 54, 11, 80, 245, 184, 237, 82, + 223, 35, 7, 45, 134, 62, 53, 62, 125, 0, 195, 3, 240, 52, 124, 254, 75, 97, 194, 147, 166, + 30, 118, 44, 229, 234, 32, 44, 32, 42, 175, 10, 72, 5, 73, 1, 83, 121, 189, 0, 170, 146, + 106, 184, 230, 146, 179, 208, 116, 163, 144, 42, 245, 42, 11, 95, 179, 194, 232, 80, 94, + 232, 183, 204, 202, 118, 67, 139, 50, 6, 132, 192, 214, 30, 242, 212, 3, 242, 48, 139, 49, + 129, 60, 201, 234, 192, 36, 62, 239, 67, 78, 99, 53, 100, 80, 172, 184, 73, 153, 250, 60, + 214, 133, 148, 92, 243, 56, 149, 174, 19, 82, 150, 159, 164, 74, 140, 195, 70, 214, 234, 30, + 214, 84, 184, 244, 30, 69, 149, 240, 9, 127, 134, 72, 55, 32, 203, 22, 16, 233, 133, 37, 68, + 102, 85, 25, 145, 94, 82, 66, 100, 86, 47, 34, 178, 160, 26, 224, 81, 114, 22, 154, 198, + 165, 34, 63, 235, 158, 147, 212, 150, 83, 100, 73, 134, 16, 176, 172, 20, 129, 252, 150, 73, + 154, 49, 203, 225, 97, 65, 41, 58, 121, 155, 73, 154, 177, 25, 67, 151, 55, 235, 35, 87, + 176, 26, 132, 57, 163, 101, 145, 231, 99, 119, 7, 31, 181, 9, 125, 147, 135, 230, 250, 209, + 54, 70, 105, 238, 176, 222, 7, 77, 68, 211, 14, 181, 34, 132, 138, 134, 58, 135, 42, 34, 61, + 218, 215, 228, 121, 151, 50, 247, 143, 77, 11, 118, 57, 42, 29, 173, 38, 134, 161, 116, 132, + 54, 229, 45, 232, 198, 211, 68, 91, 71, 93, 9, 253, 58, 195, 47, 172, 186, 1, 147, 177, 234, + 156, 62, 44, 194, 96, 143, 51, 131, 242, 19, 176, 202, 198, 88, 253, 162, 241, 86, 15, 154, + 30, 189, 143, 244, 230, 207, 61, 255, 37, 184, 77, 253, 30, 22, 28, 18, 221, 63, 210, 200, + 155, 78, 174, 249, 198, 73, 81, 94, 33, 135, 249, 235, 132, 243, 136, 79, 67, 210, 47, 224, + 249, 107, 159, 113, 72, 112, 137, 220, 133, 121, 80, 222, 71, 36, 62, 84, 166, 145, 10, 41, + 65, 241, 8, 85, 236, 117, 35, 187, 41, 110, 49, 192, 109, 8, 92, 203, 137, 148, 131, 247, + 28, 145, 190, 226, 68, 215, 42, 237, 187, 60, 36, 199, 227, 205, 50, 204, 178, 148, 7, 195, + 248, 55, 62, 34, 22, 96, 146, 251, 186, 212, 36, 178, 46, 214, 169, 222, 167, 221, 148, 113, + 83, 71, 27, 172, 156, 134, 230, 147, 231, 47, 56, 35, 61, 246, 183, 206, 226, 212, 95, 94, + 197, 28, 10, 75, 71, 220, 187, 94, 76, 190, 109, 54, 164, 72, 188, 156, 134, 147, 27, 180, + 228, 120, 222, 229, 126, 242, 113, 93, 232, 158, 132, 144, 75, 58, 155, 153, 114, 56, 78, + 21, 61, 86, 118, 178, 30, 244, 223, 68, 239, 23, 157, 47, 162, 207, 152, 134, 177, 24, 166, + 63, 16, 240, 243, 89, 132, 125, 211, 76, 166, 236, 102, 132, 173, 55, 60, 123, 4, 32, 218, + 233, 94, 142, 67, 140, 104, 25, 215, 183, 116, 5, 113, 179, 169, 158, 77, 145, 152, 118, + 250, 161, 177, 190, 148, 165, 250, 20, 194, 154, 162, 74, 139, 158, 165, 122, 25, 143, 107, + 253, 125, 249, 195, 0, 108, 151, 158, 68, 16, 240, 154, 201, 121, 150, 192, 48, 46, 228, 93, + 218, 120, 42, 172, 233, 192, 169, 229, 243, 115, 71, 225, 113, 226, 209, 4, 11, 225, 234, + 149, 157, 7, 117, 195, 47, 105, 54, 110, 69, 6, 131, 191, 135, 43, 159, 159, 75, 166, 48, + 123, 202, 165, 137, 185, 27, 50, 28, 254, 21, 20, 215, 254, 76, 210, 112, 108, 61, 244, 226, + 13, 210, 124, 96, 77, 0, 8, 173, 122, 74, 223, 46, 0, 103, 218, 99, 17, 204, 39, 156, 107, + 62, 235, 226, 40, 171, 28, 207, 140, 235, 240, 186, 123, 159, 220, 218, 190, 39, 105, 82, + 127, 146, 120, 115, 20, 159, 171, 87, 75, 228, 201, 249, 131, 49, 19, 17, 53, 143, 251, 2, + 148, 102, 14, 73, 32, 180, 138, 7, 3, 196, 158, 45, 83, 183, 51, 66, 107, 29, 83, 183, 104, + 250, 96, 186, 101, 129, 226, 212, 68, 165, 136, 165, 200, 179, 72, 112, 158, 193, 29, 121, + 197, 169, 126, 13, 215, 190, 197, 65, 177, 224, 37, 29, 243, 85, 35, 205, 118, 182, 235, 98, + 158, 195, 11, 118, 205, 73, 120, 150, 211, 210, 77, 143, 241, 74, 151, 179, 167, 113, 249, + 71, 95, 78, 120, 50, 37, 184, 41, 54, 33, 67, 66, 250, 150, 75, 192, 187, 136, 184, 148, 11, + 230, 189, 101, 50, 19, 88, 128, 225, 101, 194, 20, 84, 60, 106, 102, 102, 175, 162, 193, 64, + 214, 152, 118, 217, 44, 215, 74, 4, 136, 98, 240, 77, 100, 205, 76, 57, 93, 207, 28, 4, 184, + 236, 139, 57, 97, 198, 184, 237, 204, 171, 109, 86, 140, 200, 73, 216, 253, 67, 184, 247, + 233, 116, 183, 62, 72, 184, 3, 10, 188, 52, 232, 202, 56, 242, 243, 228, 231, 43, 6, 126, + 221, 36, 200, 38, 55, 30, 55, 236, 138, 233, 51, 59, 99, 50, 148, 221, 62, 88, 185, 136, + 249, 106, 51, 58, 83, 240, 98, 138, 55, 206, 214, 47, 82, 77, 186, 156, 135, 40, 233, 31, + 167, 83, 197, 132, 134, 29, 131, 56, 230, 221, 48, 187, 5, 129, 24, 109, 51, 206, 8, 156, + 40, 194, 9, 63, 109, 20, 194, 196, 134, 222, 112, 118, 138, 214, 179, 161, 100, 198, 29, 55, + 126, 83, 48, 58, 185, 184, 89, 19, 211, 187, 133, 101, 188, 219, 167, 216, 57, 188, 153, + 226, 56, 193, 70, 77, 240, 198, 84, 114, 123, 226, 112, 170, 69, 162, 177, 19, 185, 108, + 124, 108, 244, 163, 208, 210, 18, 197, 164, 24, 12, 63, 57, 30, 225, 95, 124, 221, 30, 188, + 216, 171, 86, 127, 9, 48, 0, 2, 50, 155, 124, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, + 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 50, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, + 76, 101, 110, 103, 116, 104, 32, 49, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, + 156, 99, 96, 128, 0, 1, 6, 236, 0, 0, 1, 160, 0, 17, 13, 10, 101, 110, 100, 115, 116, 114, + 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 50, 53, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, + 101, 47, 76, 101, 110, 103, 116, 104, 32, 54, 56, 50, 48, 47, 76, 101, 110, 103, 116, 104, + 49, 32, 49, 51, 52, 57, 48, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 237, 58, + 11, 120, 19, 85, 186, 255, 228, 159, 73, 75, 95, 148, 82, 64, 222, 67, 177, 60, 36, 180, + 165, 21, 144, 2, 74, 218, 166, 37, 208, 151, 73, 202, 195, 69, 36, 77, 38, 109, 164, 121, + 144, 164, 148, 138, 8, 202, 34, 2, 42, 40, 90, 21, 145, 69, 68, 87, 81, 145, 69, 68, 4, 92, + 69, 68, 68, 68, 87, 17, 95, 248, 192, 85, 87, 93, 89, 95, 171, 94, 183, 226, 244, 254, 231, + 204, 36, 77, 11, 34, 223, 119, 239, 253, 238, 222, 239, 187, 132, 51, 231, 156, 255, 252, + 239, 199, 57, 103, 96, 64, 0, 128, 84, 88, 2, 8, 213, 85, 246, 220, 252, 29, 87, 124, 239, + 34, 200, 123, 212, 166, 185, 124, 206, 224, 230, 253, 159, 111, 4, 16, 242, 1, 112, 134, + 107, 126, 68, 110, 59, 218, 127, 28, 128, 184, 146, 96, 167, 60, 193, 58, 223, 103, 59, 190, + 125, 30, 192, 120, 61, 225, 175, 170, 107, 104, 246, 76, 168, 24, 243, 46, 64, 66, 55, 154, + 159, 168, 87, 156, 238, 47, 135, 61, 217, 133, 230, 223, 210, 124, 76, 61, 1, 210, 45, 137, + 126, 128, 196, 161, 52, 63, 191, 222, 23, 89, 144, 224, 188, 241, 50, 154, 79, 37, 158, 57, + 13, 1, 151, 179, 36, 239, 86, 90, 74, 105, 6, 48, 244, 241, 57, 23, 4, 165, 50, 163, 13, 32, + 109, 45, 1, 101, 191, 211, 167, 216, 77, 63, 13, 166, 249, 227, 0, 3, 206, 11, 6, 194, 145, + 239, 20, 103, 15, 0, 211, 97, 194, 95, 28, 12, 41, 193, 241, 92, 84, 238, 20, 0, 169, 30, 4, + 49, 77, 88, 3, 18, 136, 82, 153, 248, 50, 128, 90, 164, 245, 6, 59, 172, 54, 120, 18, 13, + 134, 100, 35, 98, 162, 104, 48, 136, 75, 0, 30, 75, 7, 153, 168, 180, 63, 69, 222, 72, 24, + 38, 129, 252, 179, 193, 152, 169, 102, 10, 235, 18, 124, 194, 199, 4, 22, 244, 101, 131, 62, + 202, 36, 175, 209, 72, 232, 67, 205, 216, 190, 44, 32, 199, 233, 248, 135, 22, 81, 148, 140, + 9, 137, 93, 146, 146, 83, 82, 211, 186, 166, 119, 203, 232, 158, 217, 163, 103, 175, 243, + 122, 247, 233, 219, 175, 255, 128, 129, 242, 160, 172, 193, 231, 103, 15, 25, 58, 108, 248, + 5, 35, 76, 35, 115, 114, 243, 70, 229, 23, 92, 56, 122, 204, 216, 139, 198, 21, 142, 159, + 48, 241, 226, 75, 38, 153, 139, 138, 75, 44, 165, 101, 147, 173, 83, 166, 150, 87, 84, 86, + 85, 95, 106, 179, 59, 106, 166, 77, 159, 49, 243, 178, 223, 205, 186, 124, 246, 21, 115, + 156, 80, 235, 114, 43, 158, 186, 122, 239, 149, 115, 27, 124, 254, 64, 112, 94, 40, 28, 105, + 156, 223, 180, 160, 249, 170, 133, 87, 47, 186, 102, 241, 146, 107, 175, 91, 250, 251, 101, + 215, 47, 191, 97, 197, 202, 85, 55, 222, 116, 243, 234, 53, 183, 220, 186, 246, 182, 219, + 91, 238, 184, 243, 174, 117, 119, 175, 191, 103, 195, 31, 54, 222, 187, 233, 190, 205, 247, + 63, 240, 199, 7, 31, 218, 242, 240, 35, 143, 110, 125, 108, 219, 159, 182, 63, 190, 227, + 137, 157, 79, 238, 122, 106, 247, 158, 189, 79, 255, 249, 153, 103, 247, 61, 183, 255, 249, + 3, 47, 28, 124, 241, 208, 75, 135, 95, 62, 242, 202, 171, 127, 121, 13, 94, 63, 250, 198, + 177, 55, 223, 122, 251, 157, 119, 143, 191, 247, 254, 7, 31, 158, 0, 209, 112, 49, 89, 90, + 8, 50, 136, 208, 7, 174, 129, 54, 33, 65, 232, 38, 12, 20, 70, 9, 69, 130, 93, 112, 10, 11, + 132, 107, 132, 91, 13, 7, 13, 239, 227, 67, 248, 172, 60, 68, 206, 147, 11, 229, 71, 6, 101, + 101, 25, 179, 6, 100, 141, 200, 154, 156, 165, 100, 191, 244, 179, 161, 173, 141, 197, 26, + 54, 10, 70, 33, 69, 24, 32, 228, 9, 102, 193, 38, 204, 38, 218, 69, 68, 251, 130, 225, 109, + 78, 219, 157, 104, 199, 113, 90, 67, 86, 87, 78, 59, 135, 104, 133, 182, 182, 54, 138, 83, + 219, 15, 212, 222, 166, 182, 177, 109, 54, 61, 139, 219, 234, 219, 50, 89, 8, 78, 253, 120, + 234, 56, 165, 101, 203, 137, 101, 39, 166, 125, 120, 37, 131, 124, 48, 239, 131, 43, 0, 222, + 253, 90, 122, 134, 7, 239, 34, 106, 223, 51, 68, 30, 177, 86, 61, 114, 173, 218, 92, 136, + 69, 84, 144, 133, 97, 188, 47, 210, 1, 143, 192, 125, 240, 123, 88, 6, 79, 67, 11, 124, 6, + 215, 195, 205, 176, 10, 238, 129, 135, 96, 51, 49, 93, 9, 239, 192, 82, 88, 11, 223, 194, + 119, 112, 19, 220, 1, 55, 192, 126, 120, 31, 190, 129, 13, 176, 5, 254, 73, 210, 126, 128, + 77, 240, 40, 28, 130, 131, 176, 21, 106, 193, 5, 107, 192, 13, 135, 65, 129, 23, 225, 37, + 120, 21, 94, 134, 35, 240, 10, 124, 14, 30, 120, 29, 254, 2, 175, 193, 99, 80, 7, 95, 195, + 45, 112, 12, 142, 194, 27, 80, 15, 127, 135, 147, 176, 2, 174, 4, 47, 204, 5, 31, 52, 128, + 31, 54, 66, 0, 230, 65, 16, 66, 16, 134, 70, 136, 192, 124, 104, 130, 47, 96, 1, 92, 5, 205, + 176, 16, 22, 193, 213, 176, 11, 238, 133, 197, 20, 157, 37, 112, 45, 124, 9, 255, 128, 221, + 240, 11, 168, 186, 37, 109, 240, 19, 188, 9, 255, 34, 155, 63, 134, 79, 224, 45, 56, 1, 239, + 194, 113, 218, 13, 62, 132, 183, 225, 3, 216, 14, 143, 235, 120, 59, 225, 73, 160, 186, 135, + 29, 240, 4, 28, 160, 254, 58, 120, 14, 150, 235, 107, 15, 195, 157, 250, 232, 65, 88, 71, + 207, 187, 224, 43, 62, 219, 171, 123, 79, 128, 251, 245, 245, 91, 97, 181, 62, 186, 13, 110, + 23, 70, 147, 102, 135, 233, 183, 143, 60, 179, 94, 120, 128, 102, 30, 90, 153, 71, 144, 141, + 134, 237, 228, 221, 70, 130, 236, 23, 14, 11, 43, 12, 35, 9, 246, 0, 249, 240, 40, 97, 46, + 135, 195, 184, 69, 4, 97, 10, 20, 16, 20, 224, 29, 201, 0, 223, 11, 14, 210, 108, 189, 48, + 78, 200, 20, 198, 37, 24, 69, 16, 43, 197, 29, 162, 77, 220, 37, 126, 38, 30, 129, 177, 98, + 88, 60, 34, 206, 17, 195, 66, 1, 110, 146, 166, 73, 15, 80, 27, 135, 7, 12, 25, 20, 133, + 129, 176, 75, 248, 144, 60, 183, 27, 191, 192, 2, 220, 43, 150, 136, 105, 240, 33, 30, 193, + 45, 240, 41, 73, 17, 137, 255, 97, 210, 121, 51, 121, 114, 23, 100, 10, 1, 88, 108, 88, 104, + 176, 17, 228, 160, 116, 132, 108, 93, 71, 190, 63, 12, 71, 132, 13, 194, 81, 210, 110, 183, + 176, 148, 226, 116, 39, 138, 134, 201, 176, 65, 56, 70, 118, 29, 134, 31, 97, 41, 58, 12, + 139, 105, 47, 40, 48, 120, 72, 255, 131, 196, 235, 8, 209, 175, 131, 176, 8, 210, 49, 33, 9, + 84, 195, 8, 130, 145, 246, 36, 171, 150, 63, 251, 227, 72, 233, 24, 255, 125, 67, 113, 91, + 8, 14, 216, 108, 220, 101, 204, 76, 24, 76, 82, 152, 199, 30, 16, 246, 11, 39, 141, 107, 41, + 242, 71, 113, 22, 206, 195, 227, 194, 50, 113, 176, 248, 160, 56, 25, 86, 107, 30, 192, 57, + 176, 154, 120, 175, 99, 52, 70, 143, 208, 76, 182, 179, 223, 66, 198, 221, 208, 36, 206, 17, + 182, 192, 23, 226, 156, 132, 90, 226, 125, 128, 89, 196, 226, 106, 176, 145, 69, 30, 138, + 153, 7, 154, 140, 233, 100, 211, 120, 97, 25, 174, 32, 77, 217, 106, 127, 56, 146, 48, 69, + 204, 37, 122, 226, 144, 176, 136, 172, 6, 8, 224, 104, 202, 195, 0, 173, 111, 165, 60, 25, + 137, 45, 180, 199, 46, 212, 236, 53, 142, 149, 126, 36, 202, 245, 226, 71, 100, 243, 106, + 225, 38, 195, 143, 112, 4, 75, 96, 56, 120, 196, 175, 200, 215, 180, 141, 238, 52, 74, 34, + 26, 4, 48, 201, 233, 219, 12, 217, 86, 247, 182, 73, 151, 206, 144, 95, 156, 57, 104, 164, + 169, 211, 84, 78, 79, 144, 183, 65, 245, 182, 212, 102, 121, 87, 91, 91, 245, 12, 177, 175, + 52, 115, 155, 212, 111, 27, 102, 39, 110, 19, 179, 7, 127, 244, 107, 139, 31, 141, 52, 77, + 173, 158, 33, 111, 251, 197, 82, 162, 115, 181, 204, 41, 33, 152, 125, 6, 13, 217, 140, 192, + 4, 183, 148, 140, 164, 141, 219, 163, 182, 136, 30, 105, 51, 109, 238, 9, 208, 103, 82, 138, + 248, 51, 24, 127, 22, 18, 165, 197, 6, 17, 114, 159, 127, 227, 228, 40, 72, 127, 227, 228, + 27, 39, 243, 186, 119, 27, 212, 45, 123, 80, 183, 65, 30, 17, 78, 133, 177, 239, 169, 79, + 213, 150, 132, 180, 159, 190, 11, 25, 135, 131, 208, 118, 146, 14, 180, 174, 210, 49, 74, + 74, 232, 62, 168, 135, 49, 97, 80, 207, 94, 131, 122, 246, 48, 142, 16, 140, 9, 244, 27, + 220, 35, 179, 151, 208, 35, 115, 132, 0, 19, 133, 177, 61, 11, 228, 177, 99, 70, 15, 202, + 26, 61, 166, 96, 208, 232, 33, 67, 135, 140, 16, 70, 143, 169, 192, 231, 106, 146, 213, 182, + 209, 221, 133, 12, 105, 150, 97, 187, 241, 98, 219, 212, 27, 151, 92, 34, 28, 151, 94, 251, + 229, 101, 67, 126, 177, 48, 161, 34, 229, 151, 231, 197, 43, 12, 194, 11, 67, 131, 213, 147, + 212, 89, 210, 49, 195, 210, 46, 23, 207, 20, 112, 101, 153, 91, 25, 80, 108, 72, 178, 254, + 178, 191, 175, 104, 184, 5, 151, 73, 9, 71, 6, 200, 226, 74, 67, 149, 169, 143, 180, 66, 63, + 136, 216, 225, 244, 202, 179, 67, 78, 92, 209, 117, 194, 15, 48, 48, 145, 87, 224, 238, 167, + 190, 217, 197, 250, 23, 61, 11, 95, 82, 87, 168, 253, 147, 202, 19, 124, 52, 77, 212, 79, + 53, 122, 38, 248, 212, 254, 0, 73, 123, 105, 117, 69, 82, 121, 236, 180, 139, 110, 138, 201, + 226, 17, 94, 176, 96, 88, 165, 53, 28, 45, 140, 198, 173, 112, 192, 184, 3, 54, 72, 189, 96, + 75, 194, 58, 152, 103, 156, 8, 215, 26, 10, 224, 0, 14, 132, 109, 212, 54, 83, 69, 77, 164, + 245, 119, 8, 127, 131, 225, 99, 112, 83, 127, 156, 138, 29, 8, 127, 57, 181, 143, 168, 181, + 80, 91, 79, 205, 77, 141, 241, 89, 77, 237, 65, 106, 171, 168, 93, 75, 184, 223, 80, 219, + 192, 120, 68, 155, 120, 9, 172, 37, 155, 150, 75, 205, 144, 46, 45, 130, 67, 82, 11, 132, + 41, 38, 135, 164, 52, 56, 36, 174, 131, 67, 198, 2, 154, 139, 112, 200, 48, 139, 181, 182, + 22, 233, 18, 130, 55, 18, 252, 51, 194, 57, 69, 125, 57, 21, 227, 81, 173, 151, 86, 19, 44, + 19, 150, 139, 31, 183, 181, 74, 199, 97, 59, 227, 153, 240, 5, 148, 72, 11, 97, 34, 193, 78, + 81, 63, 139, 217, 194, 116, 166, 254, 32, 151, 15, 109, 39, 121, 251, 12, 22, 18, 237, 110, + 209, 3, 243, 168, 159, 39, 158, 132, 121, 134, 215, 32, 151, 141, 165, 12, 216, 109, 24, 7, + 251, 12, 227, 218, 142, 139, 155, 180, 113, 194, 97, 216, 205, 224, 226, 167, 28, 127, 55, + 195, 195, 41, 52, 31, 65, 197, 53, 24, 198, 210, 218, 86, 113, 47, 249, 107, 21, 76, 163, + 126, 60, 27, 139, 5, 48, 67, 234, 37, 128, 97, 187, 32, 178, 158, 201, 231, 118, 179, 70, + 118, 51, 155, 163, 54, 49, 253, 153, 78, 103, 108, 30, 77, 191, 248, 70, 58, 173, 33, 253, + 14, 82, 251, 128, 218, 247, 81, 221, 58, 55, 166, 87, 124, 163, 152, 142, 163, 182, 159, + 226, 243, 8, 139, 17, 141, 103, 137, 187, 132, 2, 30, 191, 36, 216, 77, 41, 213, 87, 111, + 67, 105, 227, 166, 141, 15, 222, 98, 122, 147, 253, 137, 164, 167, 199, 184, 5, 222, 143, + 143, 39, 209, 217, 168, 109, 21, 7, 67, 189, 228, 134, 222, 198, 52, 218, 74, 118, 182, 125, + 68, 126, 201, 197, 3, 16, 166, 54, 199, 216, 31, 42, 19, 142, 147, 29, 159, 194, 100, 138, + 255, 106, 150, 123, 156, 182, 55, 76, 36, 218, 129, 124, 124, 89, 91, 43, 173, 111, 160, + 182, 143, 242, 227, 36, 193, 33, 234, 43, 230, 159, 196, 213, 212, 114, 201, 38, 158, 246, + 84, 191, 217, 36, 147, 26, 229, 36, 107, 219, 25, 15, 252, 30, 140, 220, 239, 20, 123, 97, + 154, 186, 130, 120, 204, 198, 2, 216, 64, 109, 31, 217, 150, 203, 26, 179, 159, 231, 241, + 42, 141, 62, 105, 47, 249, 136, 201, 97, 177, 136, 246, 105, 60, 255, 54, 81, 254, 169, 212, + 27, 169, 141, 103, 58, 68, 27, 207, 53, 189, 177, 220, 32, 158, 172, 237, 164, 118, 140, + 218, 65, 242, 219, 58, 234, 191, 162, 126, 48, 245, 223, 80, 95, 206, 113, 22, 183, 125, + 103, 40, 5, 3, 207, 89, 202, 27, 150, 159, 44, 71, 88, 126, 80, 222, 39, 241, 152, 145, 238, + 220, 134, 183, 120, 110, 239, 214, 252, 44, 244, 166, 13, 124, 5, 181, 217, 212, 106, 19, + 246, 193, 10, 189, 213, 178, 122, 97, 185, 200, 234, 37, 198, 151, 114, 139, 231, 117, 180, + 103, 235, 122, 253, 50, 191, 178, 152, 234, 177, 37, 157, 133, 20, 234, 95, 101, 141, 120, + 95, 194, 244, 23, 216, 197, 32, 235, 223, 226, 23, 252, 255, 223, 191, 217, 143, 189, 82, + 165, 64, 5, 157, 190, 151, 81, 34, 25, 32, 157, 94, 197, 18, 40, 167, 122, 208, 43, 29, 127, + 225, 130, 158, 66, 90, 236, 252, 41, 4, 136, 157, 81, 105, 96, 214, 199, 6, 162, 40, 212, + 199, 8, 125, 99, 112, 49, 14, 71, 162, 151, 148, 89, 250, 216, 72, 47, 193, 243, 245, 113, + 2, 228, 209, 117, 87, 27, 39, 66, 90, 226, 29, 250, 56, 25, 206, 163, 171, 188, 54, 78, 237, + 210, 29, 238, 102, 218, 136, 244, 122, 11, 145, 46, 91, 245, 177, 0, 253, 146, 242, 244, + 177, 1, 210, 146, 178, 244, 49, 194, 152, 24, 92, 140, 195, 145, 224, 194, 36, 143, 62, 54, + 66, 159, 164, 117, 250, 56, 1, 230, 36, 207, 214, 199, 137, 208, 175, 207, 123, 250, 56, 25, + 242, 146, 118, 232, 227, 212, 140, 33, 73, 159, 20, 7, 130, 205, 33, 111, 93, 125, 68, 30, + 230, 26, 46, 231, 231, 229, 21, 200, 181, 205, 50, 123, 129, 141, 132, 20, 167, 207, 36, 91, + 253, 174, 28, 217, 220, 208, 32, 219, 24, 86, 88, 182, 41, 97, 37, 52, 95, 113, 231, 216, + 148, 186, 198, 6, 103, 200, 214, 24, 84, 20, 185, 52, 16, 114, 186, 189, 78, 127, 225, 52, + 37, 20, 246, 6, 252, 114, 126, 78, 94, 94, 252, 88, 158, 210, 216, 208, 44, 143, 26, 99, 34, + 25, 163, 242, 56, 81, 148, 166, 62, 18, 9, 22, 230, 230, 54, 53, 53, 229, 212, 70, 229, 230, + 184, 2, 190, 115, 82, 45, 53, 233, 76, 186, 165, 38, 197, 208, 100, 210, 194, 41, 123, 195, + 178, 83, 142, 144, 60, 197, 231, 12, 205, 149, 3, 158, 211, 249, 164, 38, 85, 43, 33, 159, + 55, 204, 85, 38, 252, 122, 37, 164, 144, 188, 186, 144, 211, 31, 81, 220, 38, 217, 19, 34, + 59, 137, 208, 85, 239, 12, 213, 41, 38, 57, 18, 144, 157, 254, 102, 57, 72, 70, 18, 65, 160, + 54, 226, 244, 250, 189, 254, 58, 146, 227, 34, 197, 25, 102, 164, 94, 145, 61, 1, 63, 41, + 230, 116, 145, 61, 65, 66, 103, 8, 145, 122, 226, 222, 224, 117, 41, 254, 176, 34, 15, 203, + 42, 101, 24, 89, 195, 137, 153, 91, 118, 134, 195, 1, 151, 215, 73, 242, 100, 119, 192, 213, + 232, 83, 252, 17, 103, 132, 233, 227, 241, 54, 40, 97, 121, 24, 227, 200, 9, 100, 123, 192, + 19, 105, 114, 134, 148, 172, 225, 92, 147, 144, 18, 12, 5, 220, 141, 46, 133, 179, 113, 123, + 201, 52, 111, 109, 99, 68, 225, 58, 116, 32, 48, 201, 94, 191, 171, 161, 209, 205, 52, 105, + 242, 70, 234, 3, 141, 17, 82, 198, 231, 213, 5, 49, 252, 144, 230, 77, 98, 219, 24, 38, 124, + 102, 142, 73, 246, 41, 220, 234, 96, 99, 109, 131, 55, 92, 111, 138, 147, 97, 98, 50, 115, + 3, 33, 57, 172, 80, 40, 8, 219, 75, 170, 234, 230, 119, 18, 205, 148, 35, 182, 65, 230, 232, + 136, 238, 58, 46, 168, 169, 62, 224, 59, 157, 128, 133, 193, 211, 24, 242, 147, 64, 133, 19, + 186, 3, 114, 56, 96, 146, 195, 141, 181, 87, 42, 174, 8, 131, 104, 62, 110, 104, 8, 52, 49, + 131, 92, 1, 191, 219, 203, 236, 8, 23, 178, 128, 58, 104, 209, 89, 27, 152, 175, 112, 27, + 180, 92, 226, 42, 196, 18, 193, 31, 136, 80, 32, 194, 26, 148, 197, 37, 216, 158, 3, 218, + 154, 28, 174, 119, 146, 89, 181, 138, 238, 55, 82, 196, 235, 151, 157, 29, 44, 13, 248, 41, + 51, 66, 178, 47, 16, 82, 206, 104, 184, 28, 105, 14, 42, 30, 39, 9, 202, 137, 170, 213, 113, + 221, 231, 108, 102, 18, 124, 1, 183, 215, 227, 101, 201, 230, 108, 136, 80, 250, 209, 128, + 216, 58, 221, 110, 110, 189, 230, 62, 18, 30, 116, 134, 72, 51, 86, 124, 92, 148, 91, 9, + 123, 235, 252, 92, 145, 186, 134, 230, 96, 125, 152, 17, 177, 44, 117, 186, 136, 73, 152, + 81, 68, 53, 10, 119, 150, 164, 101, 157, 91, 115, 154, 179, 225, 204, 12, 116, 154, 168, 30, + 237, 220, 72, 61, 63, 85, 181, 183, 67, 170, 147, 57, 33, 133, 253, 91, 27, 199, 101, 131, + 48, 115, 37, 139, 77, 180, 68, 20, 202, 59, 69, 83, 190, 41, 16, 114, 135, 229, 172, 88, 53, + 102, 49, 217, 209, 5, 57, 139, 21, 111, 150, 238, 52, 138, 78, 185, 94, 53, 181, 10, 213, + 19, 227, 219, 72, 113, 96, 38, 204, 15, 120, 99, 170, 41, 11, 34, 84, 55, 178, 51, 24, 164, + 34, 115, 214, 54, 40, 108, 65, 179, 158, 120, 119, 10, 76, 189, 51, 34, 215, 59, 195, 196, + 81, 241, 119, 244, 10, 137, 107, 207, 113, 183, 220, 232, 119, 235, 42, 103, 117, 220, 91, + 178, 52, 27, 207, 30, 217, 112, 160, 129, 85, 55, 15, 29, 11, 148, 83, 110, 96, 187, 8, 213, + 76, 20, 49, 232, 116, 205, 117, 214, 145, 105, 84, 143, 254, 64, 108, 15, 57, 247, 212, 234, + 32, 138, 54, 46, 82, 82, 105, 240, 104, 106, 77, 182, 200, 165, 85, 149, 14, 217, 94, 85, + 234, 152, 110, 182, 89, 100, 171, 93, 174, 182, 85, 77, 179, 150, 88, 74, 228, 44, 179, 157, + 230, 89, 38, 121, 186, 213, 49, 185, 170, 198, 33, 19, 134, 205, 92, 233, 152, 41, 87, 149, + 202, 230, 202, 153, 242, 84, 107, 101, 137, 73, 182, 204, 168, 182, 89, 236, 118, 185, 202, + 38, 91, 43, 170, 203, 173, 22, 130, 89, 43, 139, 203, 107, 74, 172, 149, 101, 114, 17, 209, + 85, 86, 57, 228, 114, 107, 133, 213, 65, 76, 29, 85, 156, 84, 103, 101, 181, 216, 25, 179, + 10, 139, 173, 120, 50, 77, 205, 69, 214, 114, 171, 99, 166, 73, 46, 181, 58, 42, 25, 207, + 82, 98, 106, 150, 171, 205, 54, 135, 181, 184, 166, 220, 108, 147, 171, 107, 108, 213, 85, + 118, 11, 241, 40, 33, 182, 149, 214, 202, 82, 27, 73, 177, 84, 88, 200, 8, 98, 84, 92, 85, + 61, 211, 102, 45, 155, 236, 48, 17, 145, 131, 128, 38, 217, 97, 51, 151, 88, 42, 204, 182, + 169, 38, 166, 97, 21, 153, 108, 147, 57, 74, 14, 105, 73, 60, 100, 203, 52, 70, 108, 159, + 108, 46, 47, 151, 139, 172, 14, 187, 195, 102, 49, 87, 48, 92, 230, 157, 178, 202, 170, 10, + 230, 163, 154, 202, 18, 179, 195, 90, 85, 41, 23, 89, 200, 20, 115, 81, 185, 69, 211, 141, + 76, 41, 46, 55, 91, 43, 76, 114, 137, 185, 194, 92, 102, 177, 183, 11, 97, 104, 186, 57, + 237, 238, 96, 4, 101, 150, 74, 139, 205, 92, 110, 146, 237, 213, 150, 98, 43, 27, 144, 31, + 173, 54, 75, 177, 131, 99, 146, 239, 201, 19, 229, 92, 221, 226, 170, 74, 187, 229, 210, 26, + 2, 16, 94, 84, 4, 5, 100, 178, 133, 139, 32, 3, 204, 244, 183, 152, 107, 198, 205, 175, 36, + 115, 25, 31, 71, 149, 205, 17, 83, 101, 186, 213, 110, 49, 201, 102, 155, 213, 206, 84, 40, + 181, 85, 145, 186, 44, 158, 68, 193, 108, 172, 33, 127, 178, 224, 85, 234, 250, 178, 24, 49, + 216, 233, 217, 65, 88, 140, 90, 55, 176, 196, 98, 46, 39, 134, 118, 166, 198, 105, 184, 60, + 191, 44, 11, 92, 74, 48, 194, 242, 91, 47, 114, 109, 147, 228, 27, 170, 182, 139, 154, 120, + 230, 106, 155, 1, 165, 113, 153, 159, 202, 87, 131, 241, 33, 229, 52, 213, 23, 63, 129, 180, + 93, 174, 189, 196, 216, 225, 108, 210, 55, 97, 182, 141, 80, 134, 211, 169, 164, 109, 194, + 238, 249, 10, 237, 132, 97, 182, 165, 80, 141, 4, 216, 166, 210, 228, 13, 243, 122, 167, + 227, 208, 23, 208, 207, 191, 176, 179, 129, 132, 17, 85, 12, 139, 246, 76, 103, 3, 145, 133, + 99, 106, 118, 44, 170, 232, 193, 24, 12, 121, 137, 164, 41, 228, 141, 208, 150, 34, 59, 27, + 9, 26, 242, 94, 165, 31, 201, 33, 253, 200, 234, 108, 1, 147, 210, 89, 255, 144, 18, 14, + 210, 137, 229, 157, 175, 52, 52, 231, 176, 219, 18, 59, 215, 184, 38, 94, 191, 39, 16, 242, + 233, 166, 115, 247, 185, 34, 133, 209, 189, 52, 34, 215, 113, 230, 110, 50, 60, 16, 170, + 203, 129, 98, 8, 208, 13, 183, 25, 66, 224, 133, 58, 168, 135, 8, 200, 48, 12, 92, 48, 156, + 250, 124, 186, 119, 230, 65, 1, 141, 106, 9, 67, 134, 34, 194, 137, 64, 152, 90, 8, 20, 112, + 130, 15, 76, 4, 181, 130, 159, 240, 115, 104, 100, 134, 6, 250, 201, 96, 139, 241, 10, 243, + 153, 66, 189, 66, 52, 243, 233, 233, 38, 76, 6, 169, 131, 70, 194, 117, 18, 212, 70, 163, + 32, 65, 20, 194, 45, 37, 109, 66, 4, 117, 19, 7, 39, 241, 45, 132, 105, 156, 50, 76, 243, 0, + 205, 153, 78, 57, 92, 171, 95, 131, 203, 48, 133, 115, 102, 250, 142, 130, 49, 92, 67, 102, + 199, 40, 106, 237, 146, 58, 203, 97, 186, 70, 104, 173, 16, 114, 233, 215, 196, 127, 57, + 100, 117, 103, 123, 115, 200, 210, 0, 245, 255, 125, 94, 75, 133, 164, 115, 246, 27, 195, + 61, 157, 155, 172, 251, 194, 73, 35, 47, 167, 100, 163, 136, 110, 159, 66, 24, 204, 203, + 115, 9, 22, 0, 207, 57, 233, 195, 90, 53, 231, 233, 227, 28, 219, 189, 172, 241, 175, 231, + 107, 138, 110, 95, 29, 151, 228, 39, 126, 76, 75, 198, 203, 195, 87, 149, 152, 68, 23, 81, + 48, 29, 234, 8, 102, 226, 186, 5, 184, 150, 126, 78, 31, 212, 35, 169, 73, 8, 16, 215, 8, + 173, 121, 105, 198, 90, 157, 110, 143, 75, 247, 120, 148, 103, 132, 107, 193, 100, 5, 184, + 108, 205, 110, 151, 30, 159, 160, 206, 61, 202, 129, 97, 107, 186, 55, 80, 239, 34, 74, 63, + 247, 45, 139, 90, 22, 207, 6, 141, 71, 22, 143, 32, 163, 117, 243, 62, 204, 245, 114, 241, + 44, 209, 236, 147, 169, 49, 72, 35, 73, 81, 56, 21, 91, 137, 250, 199, 67, 163, 6, 30, 55, + 198, 57, 170, 99, 187, 4, 25, 236, 92, 255, 8, 229, 151, 147, 123, 137, 73, 108, 247, 9, + 131, 176, 255, 42, 9, 144, 148, 70, 174, 103, 187, 54, 110, 110, 65, 132, 231, 92, 45, 255, + 175, 20, 37, 206, 15, 191, 46, 193, 196, 227, 198, 162, 219, 64, 84, 238, 152, 79, 154, 120, + 30, 212, 19, 118, 35, 167, 99, 158, 241, 113, 88, 188, 69, 81, 254, 161, 14, 185, 169, 105, + 219, 200, 125, 104, 138, 139, 14, 27, 251, 120, 60, 163, 177, 14, 18, 86, 45, 231, 29, 38, + 106, 211, 175, 216, 97, 138, 217, 153, 203, 43, 83, 230, 156, 181, 170, 208, 120, 123, 117, + 175, 118, 140, 254, 217, 173, 142, 122, 78, 211, 54, 24, 203, 232, 72, 167, 172, 107, 183, + 168, 137, 251, 195, 119, 78, 18, 162, 213, 224, 33, 27, 66, 60, 91, 195, 156, 166, 93, 162, + 155, 63, 153, 12, 19, 239, 153, 39, 174, 36, 12, 23, 231, 167, 225, 196, 231, 49, 179, 55, + 192, 227, 162, 69, 200, 197, 101, 187, 185, 198, 94, 93, 211, 194, 88, 133, 58, 116, 74, 39, + 113, 13, 240, 61, 162, 61, 14, 241, 251, 82, 187, 23, 78, 223, 17, 252, 132, 31, 209, 43, + 34, 220, 1, 55, 90, 47, 237, 94, 139, 223, 7, 226, 233, 100, 110, 183, 83, 143, 86, 173, + 238, 153, 246, 124, 211, 60, 226, 229, 116, 206, 179, 196, 148, 113, 214, 246, 140, 16, 207, + 162, 128, 238, 229, 115, 141, 56, 195, 105, 230, 250, 122, 248, 78, 192, 120, 231, 156, 230, + 173, 179, 209, 51, 191, 52, 199, 108, 240, 241, 42, 244, 242, 154, 142, 238, 108, 76, 255, + 136, 190, 251, 105, 16, 77, 91, 230, 87, 119, 92, 236, 227, 179, 79, 179, 60, 200, 165, 104, + 62, 139, 158, 124, 237, 86, 185, 185, 182, 44, 102, 254, 56, 143, 212, 241, 115, 44, 72, 56, + 225, 152, 164, 232, 94, 234, 228, 89, 164, 229, 112, 84, 70, 103, 31, 133, 127, 211, 166, + 248, 189, 206, 221, 33, 211, 156, 60, 78, 231, 174, 65, 71, 57, 157, 253, 113, 38, 221, 76, + 122, 204, 181, 179, 218, 123, 150, 93, 61, 164, 239, 64, 10, 215, 203, 215, 129, 111, 20, + 18, 142, 101, 101, 180, 110, 58, 159, 34, 138, 190, 223, 41, 29, 60, 223, 196, 173, 114, + 115, 250, 172, 51, 156, 141, 89, 49, 187, 59, 83, 48, 252, 232, 201, 155, 213, 41, 211, 180, + 218, 41, 239, 116, 214, 212, 242, 218, 15, 196, 233, 219, 168, 215, 67, 52, 10, 243, 105, + 213, 123, 6, 175, 41, 176, 128, 251, 218, 175, 87, 52, 251, 87, 73, 237, 36, 115, 242, 221, + 85, 137, 81, 196, 199, 94, 211, 251, 236, 21, 83, 207, 119, 123, 153, 247, 97, 93, 71, 133, + 103, 211, 175, 231, 138, 102, 221, 153, 246, 113, 182, 218, 200, 177, 58, 122, 249, 76, 158, + 149, 227, 188, 23, 31, 199, 255, 74, 205, 134, 249, 46, 26, 61, 187, 219, 171, 46, 90, 81, + 236, 38, 209, 16, 187, 139, 132, 116, 138, 142, 28, 131, 60, 179, 231, 210, 179, 78, 143, + 154, 118, 62, 250, 185, 127, 59, 223, 67, 254, 39, 118, 173, 95, 183, 170, 86, 175, 149, + 136, 126, 62, 122, 58, 120, 107, 50, 88, 184, 172, 42, 168, 164, 25, 147, 85, 69, 51, 7, 76, + 167, 27, 166, 141, 175, 89, 9, 38, 211, 221, 206, 70, 43, 211, 104, 86, 66, 208, 18, 30, 31, + 51, 95, 97, 235, 89, 188, 50, 167, 211, 152, 113, 172, 130, 26, 206, 75, 227, 97, 163, 39, + 227, 61, 147, 32, 140, 183, 204, 231, 108, 54, 149, 240, 43, 137, 23, 163, 181, 192, 12, 46, + 195, 66, 220, 236, 28, 211, 198, 121, 87, 16, 180, 156, 122, 139, 142, 199, 40, 138, 9, 82, + 67, 115, 54, 46, 3, 118, 59, 213, 228, 85, 18, 149, 131, 215, 16, 163, 99, 186, 104, 154, + 58, 8, 222, 46, 181, 163, 86, 86, 46, 49, 170, 89, 5, 205, 108, 196, 127, 178, 190, 106, 38, + 222, 86, 206, 143, 233, 111, 226, 158, 98, 227, 202, 152, 158, 165, 186, 166, 102, 238, 35, + 198, 153, 241, 44, 38, 141, 202, 249, 140, 65, 107, 168, 175, 38, 60, 59, 247, 167, 153, + 219, 172, 105, 91, 201, 109, 40, 165, 117, 205, 22, 11, 215, 64, 139, 132, 166, 81, 49, 245, + 213, 36, 155, 97, 148, 145, 94, 14, 174, 5, 147, 228, 208, 49, 77, 220, 66, 102, 79, 9, 167, + 103, 82, 167, 114, 168, 166, 89, 149, 30, 101, 54, 110, 231, 146, 163, 251, 82, 211, 131, + 249, 127, 90, 76, 178, 157, 219, 95, 78, 63, 153, 219, 239, 32, 136, 131, 199, 198, 76, 252, + 163, 124, 163, 185, 83, 198, 57, 84, 196, 242, 168, 134, 219, 103, 230, 126, 168, 226, 18, + 138, 248, 26, 243, 34, 243, 103, 121, 12, 211, 22, 23, 149, 98, 238, 47, 22, 55, 166, 121, + 9, 151, 100, 230, 30, 177, 159, 209, 146, 40, 183, 142, 209, 57, 83, 118, 68, 37, 148, 113, + 251, 44, 220, 83, 229, 28, 219, 78, 126, 180, 16, 190, 53, 6, 209, 242, 209, 202, 109, 45, + 214, 125, 171, 241, 212, 242, 94, 203, 137, 242, 56, 239, 22, 115, 27, 89, 100, 47, 37, 169, + 22, 61, 167, 204, 220, 119, 29, 173, 208, 42, 132, 233, 223, 110, 133, 22, 1, 179, 254, 44, + 142, 243, 89, 123, 244, 43, 245, 232, 22, 199, 98, 93, 197, 179, 236, 116, 175, 76, 231, + 181, 104, 225, 88, 102, 30, 107, 123, 204, 11, 165, 188, 126, 43, 116, 205, 107, 226, 50, + 44, 26, 199, 26, 61, 63, 171, 98, 154, 117, 244, 111, 180, 142, 162, 120, 231, 178, 119, + 104, 188, 162, 178, 59, 70, 176, 132, 231, 83, 185, 174, 161, 61, 230, 141, 223, 230, 219, + 190, 127, 89, 232, 140, 115, 241, 247, 159, 72, 108, 255, 238, 120, 146, 199, 223, 36, 219, + 111, 168, 241, 119, 81, 83, 220, 158, 27, 127, 51, 208, 118, 227, 50, 142, 235, 235, 132, + 215, 14, 213, 246, 105, 237, 252, 106, 127, 7, 138, 191, 203, 157, 233, 20, 139, 190, 57, + 107, 119, 252, 246, 155, 112, 244, 54, 162, 237, 225, 218, 187, 82, 252, 77, 216, 205, 239, + 236, 218, 157, 48, 28, 187, 165, 104, 231, 72, 32, 118, 83, 105, 226, 171, 237, 231, 187, + 246, 118, 232, 227, 24, 241, 239, 127, 97, 46, 87, 179, 172, 81, 167, 232, 204, 75, 187, + 103, 58, 249, 205, 129, 73, 11, 159, 193, 155, 103, 59, 169, 58, 191, 49, 6, 249, 217, 175, + 73, 105, 226, 227, 136, 126, 75, 97, 246, 53, 234, 184, 12, 126, 85, 167, 183, 228, 80, 167, + 183, 172, 223, 138, 65, 212, 150, 223, 242, 127, 136, 199, 59, 168, 191, 99, 121, 185, 135, + 217, 253, 50, 7, 162, 255, 182, 20, 125, 95, 107, 247, 9, 243, 128, 135, 175, 249, 58, 69, + 189, 61, 251, 24, 183, 66, 232, 124, 47, 101, 62, 168, 139, 211, 220, 173, 71, 60, 192, 239, + 23, 57, 209, 79, 110, 219, 70, 196, 62, 43, 236, 248, 133, 82, 10, 255, 63, 98, 3, 32, 136, + 32, 129, 17, 18, 32, 17, 186, 80, 37, 36, 67, 10, 85, 68, 26, 116, 133, 116, 232, 6, 25, + 208, 29, 50, 161, 7, 244, 132, 94, 112, 30, 244, 134, 62, 208, 23, 250, 65, 127, 24, 0, 3, + 73, 214, 32, 58, 175, 7, 195, 249, 144, 13, 67, 96, 40, 12, 131, 225, 112, 1, 140, 32, 237, + 71, 146, 252, 92, 254, 239, 94, 249, 80, 0, 23, 194, 104, 24, 3, 99, 225, 34, 24, 71, 118, + 140, 135, 9, 48, 17, 46, 134, 75, 96, 18, 223, 23, 138, 121, 253, 150, 242, 211, 196, 10, + 83, 232, 196, 41, 167, 10, 175, 228, 167, 213, 165, 84, 165, 236, 196, 168, 161, 51, 101, + 58, 157, 235, 51, 225, 50, 248, 29, 204, 130, 203, 97, 54, 92, 1, 115, 248, 253, 211, 197, + 243, 202, 195, 223, 56, 189, 244, 134, 59, 151, 124, 238, 227, 126, 9, 194, 60, 254, 126, + 16, 33, 159, 179, 15, 63, 23, 80, 44, 174, 130, 133, 112, 53, 44, 130, 107, 96, 49, 255, + 228, 243, 58, 88, 202, 63, 86, 189, 30, 150, 195, 13, 176, 2, 86, 194, 42, 184, 17, 110, + 130, 155, 201, 107, 107, 224, 22, 184, 21, 214, 178, 207, 49, 161, 5, 238, 128, 59, 225, 46, + 88, 7, 119, 195, 122, 184, 7, 54, 192, 31, 96, 35, 220, 11, 155, 224, 62, 216, 12, 247, 195, + 3, 240, 71, 120, 16, 30, 130, 45, 240, 48, 60, 2, 143, 194, 86, 120, 12, 182, 193, 159, 248, + 71, 162, 236, 179, 80, 246, 137, 232, 46, 120, 10, 118, 195, 30, 216, 11, 79, 195, 159, 225, + 25, 120, 22, 246, 193, 115, 176, 31, 158, 135, 3, 240, 2, 28, 132, 23, 225, 16, 188, 4, 135, + 245, 207, 92, 95, 229, 159, 184, 178, 15, 91, 143, 193, 155, 240, 22, 188, 13, 239, 232, + 159, 159, 190, 15, 31, 192, 135, 112, 2, 62, 130, 191, 242, 15, 83, 63, 133, 191, 193, 103, + 240, 57, 124, 1, 127, 135, 47, 225, 36, 252, 3, 190, 130, 175, 225, 27, 254, 145, 237, 63, + 225, 7, 248, 30, 126, 132, 159, 248, 103, 172, 63, 195, 41, 254, 121, 107, 155, 0, 130, 32, + 24, 96, 191, 128, 130, 40, 72, 130, 81, 72, 16, 18, 133, 46, 66, 146, 144, 44, 164, 116, 9, + 123, 34, 245, 205, 193, 122, 197, 47, 90, 26, 67, 1, 201, 53, 230, 194, 209, 227, 216, 115, + 76, 30, 127, 142, 226, 207, 124, 254, 44, 224, 207, 49, 252, 57, 150, 63, 47, 226, 207, 113, + 187, 12, 75, 38, 181, 253, 172, 98, 107, 38, 254, 43, 27, 127, 202, 199, 255, 104, 193, 31, + 211, 240, 7, 21, 191, 87, 241, 159, 217, 248, 93, 26, 126, 219, 130, 223, 100, 227, 215, 43, + 205, 210, 215, 42, 126, 213, 130, 255, 104, 193, 147, 173, 248, 101, 43, 254, 93, 197, 47, + 10, 241, 243, 34, 252, 76, 197, 191, 229, 227, 167, 159, 216, 165, 79, 91, 240, 19, 66, 252, + 196, 142, 31, 255, 53, 87, 250, 184, 21, 255, 154, 139, 31, 169, 120, 66, 197, 15, 243, 241, + 131, 76, 124, 191, 5, 223, 83, 241, 120, 6, 190, 187, 8, 223, 217, 131, 111, 171, 248, 38, + 161, 191, 185, 8, 143, 189, 81, 38, 29, 91, 132, 111, 148, 225, 209, 215, 251, 74, 71, 85, + 124, 189, 47, 190, 166, 226, 95, 84, 124, 85, 197, 87, 84, 60, 210, 130, 47, 31, 30, 32, + 189, 172, 226, 225, 1, 248, 82, 62, 30, 82, 241, 133, 101, 221, 164, 23, 250, 225, 129, 158, + 248, 188, 138, 251, 85, 124, 78, 197, 125, 42, 62, 171, 226, 51, 42, 254, 89, 197, 167, 85, + 220, 171, 226, 30, 21, 119, 119, 195, 167, 174, 207, 150, 158, 82, 113, 215, 147, 123, 164, + 93, 42, 62, 185, 243, 114, 233, 201, 61, 248, 228, 18, 113, 231, 19, 217, 210, 206, 203, 39, + 181, 225, 206, 73, 226, 19, 217, 184, 67, 197, 199, 91, 112, 187, 138, 127, 82, 113, 155, + 138, 143, 169, 184, 213, 141, 143, 166, 225, 35, 15, 103, 75, 143, 184, 241, 225, 45, 25, + 210, 195, 217, 184, 37, 3, 31, 34, 165, 31, 106, 197, 7, 85, 252, 163, 138, 15, 168, 120, + 127, 6, 110, 86, 241, 190, 77, 105, 210, 125, 249, 184, 41, 13, 239, 117, 227, 70, 66, 217, + 216, 130, 127, 80, 113, 195, 61, 41, 210, 6, 21, 239, 73, 193, 245, 119, 247, 150, 214, 187, + 241, 238, 117, 233, 210, 221, 189, 113, 93, 58, 222, 149, 132, 119, 170, 120, 71, 75, 170, + 116, 135, 138, 45, 169, 120, 59, 17, 221, 222, 130, 183, 173, 77, 147, 110, 27, 134, 107, + 211, 240, 214, 86, 188, 101, 205, 30, 233, 22, 21, 215, 172, 190, 92, 90, 179, 7, 215, 44, + 17, 87, 223, 156, 45, 173, 190, 28, 87, 79, 18, 111, 206, 198, 155, 84, 188, 113, 85, 142, + 116, 163, 138, 171, 114, 112, 37, 153, 185, 210, 140, 43, 110, 72, 150, 86, 100, 226, 13, + 201, 184, 156, 0, 203, 221, 120, 61, 121, 234, 250, 108, 92, 214, 13, 127, 175, 226, 210, + 235, 186, 73, 75, 85, 188, 174, 27, 94, 171, 226, 18, 21, 23, 171, 56, 169, 237, 154, 69, + 139, 164, 107, 84, 92, 180, 8, 175, 118, 227, 66, 71, 15, 105, 97, 54, 94, 165, 98, 179, + 138, 11, 210, 176, 41, 5, 231, 39, 97, 163, 138, 145, 86, 12, 183, 98, 168, 21, 231, 181, + 98, 80, 197, 128, 138, 126, 21, 27, 6, 225, 92, 21, 175, 236, 86, 36, 93, 105, 71, 175, 138, + 245, 139, 176, 142, 38, 30, 21, 21, 21, 221, 42, 186, 84, 172, 85, 209, 89, 136, 115, 90, + 113, 118, 10, 94, 174, 226, 239, 84, 188, 76, 197, 153, 51, 146, 164, 153, 173, 56, 35, 9, + 167, 247, 236, 45, 77, 207, 199, 105, 42, 214, 144, 228, 154, 34, 116, 244, 64, 187, 144, + 46, 217, 207, 67, 91, 38, 94, 58, 165, 187, 116, 169, 138, 213, 201, 88, 165, 98, 101, 69, + 186, 84, 169, 98, 69, 58, 150, 171, 56, 149, 86, 166, 170, 56, 197, 154, 46, 77, 233, 142, + 214, 254, 169, 146, 53, 29, 39, 167, 98, 153, 138, 165, 45, 104, 105, 193, 18, 21, 139, 13, + 35, 165, 226, 86, 44, 218, 131, 230, 169, 56, 73, 197, 75, 84, 188, 120, 98, 134, 116, 113, + 38, 78, 156, 208, 85, 154, 152, 129, 19, 198, 167, 74, 19, 38, 181, 117, 197, 241, 169, 88, + 168, 226, 56, 21, 47, 26, 155, 41, 93, 212, 138, 99, 199, 164, 75, 99, 51, 113, 204, 232, + 100, 105, 76, 58, 142, 78, 198, 11, 7, 96, 65, 42, 230, 143, 74, 150, 242, 85, 28, 149, 140, + 121, 185, 201, 82, 94, 42, 230, 38, 99, 206, 200, 46, 82, 78, 58, 142, 236, 130, 166, 124, + 28, 113, 65, 182, 52, 194, 141, 23, 12, 207, 144, 46, 200, 198, 225, 25, 56, 108, 104, 182, + 52, 204, 140, 67, 179, 113, 72, 118, 178, 52, 164, 43, 102, 39, 227, 249, 42, 14, 86, 49, + 171, 43, 14, 34, 59, 7, 101, 160, 236, 198, 129, 173, 56, 128, 76, 24, 224, 198, 254, 169, + 216, 143, 60, 216, 79, 197, 190, 173, 216, 167, 8, 123, 211, 164, 183, 138, 231, 185, 177, + 23, 121, 170, 151, 138, 61, 137, 168, 103, 111, 236, 161, 98, 166, 138, 221, 85, 204, 32, + 132, 12, 21, 187, 145, 173, 221, 138, 48, 125, 17, 118, 117, 99, 154, 138, 169, 41, 61, 165, + 84, 21, 83, 8, 59, 165, 39, 38, 171, 152, 148, 142, 93, 84, 76, 36, 180, 68, 21, 19, 50, + 209, 232, 70, 145, 22, 69, 202, 128, 30, 72, 80, 84, 209, 64, 115, 195, 72, 20, 210, 17, 84, + 20, 118, 9, 238, 101, 55, 9, 35, 254, 47, 252, 129, 255, 109, 5, 206, 250, 167, 255, 127, 2, + 49, 83, 66, 244, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, + 98, 106, 13, 49, 50, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 70, 105, 114, 115, 116, 32, + 49, 52, 47, 76, 101, 110, 103, 116, 104, 32, 52, 57, 55, 47, 78, 32, 50, 47, 84, 121, 112, + 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, + 196, 147, 75, 107, 220, 48, 16, 199, 191, 202, 220, 219, 160, 231, 232, 1, 33, 144, 77, 48, + 205, 37, 135, 108, 40, 133, 144, 131, 73, 196, 214, 224, 172, 151, 141, 11, 237, 183, 239, + 204, 200, 90, 156, 52, 135, 220, 122, 248, 49, 178, 230, 161, 209, 232, 111, 19, 2, 104, 48, + 33, 130, 213, 9, 206, 207, 213, 229, 235, 83, 217, 207, 16, 131, 86, 87, 55, 215, 219, 50, + 131, 177, 158, 66, 238, 212, 85, 127, 248, 86, 134, 221, 207, 234, 188, 46, 53, 240, 204, + 122, 173, 186, 177, 223, 189, 130, 13, 214, 196, 160, 186, 105, 63, 111, 54, 211, 239, 135, + 51, 147, 28, 249, 93, 160, 18, 41, 66, 182, 233, 81, 156, 221, 48, 22, 75, 123, 40, 101, + 121, 231, 182, 127, 41, 170, 187, 189, 223, 110, 182, 95, 238, 126, 29, 74, 233, 166, 99, + 255, 60, 244, 251, 175, 155, 105, 124, 86, 55, 115, 63, 14, 79, 151, 251, 221, 88, 64, 171, + 237, 92, 94, 190, 83, 203, 168, 238, 255, 28, 138, 228, 115, 51, 199, 225, 48, 79, 71, 245, + 99, 233, 17, 181, 185, 184, 120, 8, 90, 195, 255, 196, 153, 4, 94, 27, 240, 65, 67, 114, 9, + 2, 13, 35, 163, 134, 152, 52, 216, 136, 224, 178, 22, 80, 87, 63, 199, 187, 96, 170, 117, + 81, 226, 63, 3, 199, 50, 92, 163, 129, 206, 128, 209, 220, 72, 242, 4, 5, 230, 4, 49, 210, + 183, 179, 128, 116, 120, 100, 208, 130, 205, 40, 4, 12, 128, 72, 69, 130, 131, 232, 41, 150, + 30, 45, 104, 87, 45, 251, 29, 97, 12, 68, 202, 231, 154, 57, 101, 178, 117, 143, 173, 92, + 134, 27, 201, 245, 50, 124, 41, 38, 24, 39, 185, 136, 122, 169, 65, 177, 116, 174, 172, 157, + 167, 65, 36, 1, 99, 22, 155, 163, 151, 253, 96, 90, 12, 130, 167, 51, 208, 210, 96, 178, 21, + 31, 146, 77, 52, 36, 182, 130, 197, 211, 32, 216, 202, 249, 89, 203, 154, 45, 15, 84, 214, + 100, 101, 40, 184, 194, 56, 95, 79, 242, 252, 161, 105, 68, 146, 74, 87, 98, 219, 210, 25, + 108, 44, 111, 118, 42, 85, 23, 212, 96, 45, 97, 93, 13, 177, 117, 58, 77, 6, 31, 61, 27, + 174, 43, 248, 104, 228, 218, 162, 133, 96, 222, 182, 202, 155, 34, 38, 66, 230, 218, 170, + 152, 58, 107, 241, 45, 5, 114, 200, 39, 88, 8, 85, 3, 255, 34, 179, 206, 73, 52, 177, 166, + 105, 162, 33, 90, 89, 52, 241, 30, 238, 75, 214, 148, 183, 70, 116, 161, 249, 93, 22, 13, + 124, 64, 78, 182, 234, 194, 224, 27, 154, 38, 26, 85, 11, 139, 38, 222, 33, 63, 86, 243, + 175, 192, 92, 95, 149, 236, 227, 95, 1, 6, 0, 32, 177, 0, 27, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 50, 55, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, + 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 51, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 120, 156, 147, 96, 72, 232, 96, 96, 100, 96, 96, 17, 96, 84, 226, 96, 192, + 4, 0, 35, 51, 1, 65, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 49, 50, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 55, 49, 49, 49, 47, 76, 101, 110, 103, 116, 104, 49, 32, 49, 50, 48, 57, 54, 62, + 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 228, 86, 91, 112, 20, 85, 26, 254, 230, + 154, 73, 152, 132, 225, 158, 132, 219, 9, 55, 185, 78, 18, 238, 132, 17, 18, 32, 64, 128, + 73, 98, 50, 68, 193, 32, 118, 122, 122, 102, 154, 244, 76, 183, 221, 61, 25, 198, 43, 160, + 40, 32, 42, 94, 137, 136, 130, 10, 10, 136, 232, 2, 34, 160, 136, 15, 251, 184, 15, 91, 181, + 22, 47, 238, 195, 110, 21, 181, 181, 251, 176, 165, 15, 214, 62, 172, 80, 236, 127, 206, + 244, 224, 168, 171, 75, 237, 211, 86, 109, 119, 117, 247, 119, 254, 243, 223, 255, 255, 244, + 57, 112, 1, 168, 196, 14, 120, 208, 217, 209, 93, 63, 119, 211, 233, 111, 58, 128, 81, 27, + 136, 218, 35, 167, 37, 99, 79, 217, 152, 235, 128, 103, 36, 224, 254, 167, 60, 96, 179, 153, + 191, 253, 126, 55, 205, 31, 3, 124, 222, 132, 145, 76, 111, 105, 250, 171, 7, 168, 61, 65, + 227, 35, 73, 45, 159, 200, 177, 193, 243, 36, 251, 71, 122, 206, 166, 20, 41, 254, 213, 169, + 230, 189, 0, 91, 75, 227, 133, 41, 34, 12, 61, 234, 217, 73, 227, 29, 52, 158, 146, 74, 219, + 219, 115, 157, 109, 203, 104, 76, 250, 220, 55, 52, 93, 150, 170, 35, 213, 17, 192, 117, + 128, 158, 93, 105, 105, 187, 225, 174, 241, 47, 2, 38, 31, 37, 126, 150, 145, 210, 202, 159, + 67, 157, 253, 128, 63, 4, 12, 141, 24, 186, 101, 215, 184, 70, 175, 167, 249, 47, 129, 64, + 185, 97, 42, 70, 207, 201, 227, 203, 129, 89, 191, 35, 159, 45, 184, 145, 4, 188, 73, 31, + 13, 80, 134, 165, 205, 19, 252, 101, 178, 219, 69, 158, 203, 30, 84, 248, 125, 178, 199, + 227, 174, 45, 47, 243, 202, 46, 212, 4, 102, 44, 174, 158, 213, 30, 250, 46, 18, 189, 25, + 105, 15, 253, 35, 18, 13, 221, 140, 96, 121, 228, 102, 132, 63, 141, 13, 243, 134, 213, 13, + 155, 90, 55, 172, 46, 233, 197, 13, 230, 249, 242, 70, 179, 15, 223, 131, 121, 201, 44, 207, + 223, 31, 220, 95, 123, 206, 96, 8, 234, 46, 193, 227, 58, 223, 92, 85, 94, 134, 218, 74, + 127, 77, 176, 242, 155, 58, 174, 118, 86, 251, 245, 208, 95, 176, 60, 250, 247, 198, 6, 215, + 72, 255, 228, 73, 211, 22, 204, 95, 56, 111, 238, 104, 247, 215, 215, 14, 14, 94, 187, 54, + 120, 240, 154, 187, 165, 240, 189, 6, 126, 205, 253, 63, 187, 55, 253, 143, 221, 252, 114, + 139, 186, 2, 35, 169, 115, 232, 114, 213, 210, 227, 135, 67, 164, 47, 167, 22, 7, 197, 139, + 198, 30, 175, 207, 95, 22, 40, 175, 24, 18, 172, 172, 26, 26, 26, 54, 124, 196, 200, 81, + 163, 199, 84, 215, 212, 142, 29, 55, 126, 194, 68, 86, 55, 105, 242, 148, 169, 211, 238, + 154, 62, 99, 230, 172, 217, 115, 194, 245, 13, 141, 115, 231, 205, 95, 176, 112, 209, 226, + 37, 77, 75, 35, 119, 47, 91, 222, 220, 178, 98, 229, 170, 214, 213, 107, 214, 182, 173, 91, + 191, 33, 218, 222, 209, 121, 79, 87, 119, 108, 99, 207, 189, 247, 109, 218, 124, 127, 239, + 150, 7, 182, 62, 40, 225, 63, 94, 125, 114, 92, 73, 36, 83, 234, 182, 126, 45, 157, 209, + 141, 135, 76, 203, 206, 14, 228, 182, 231, 31, 126, 228, 209, 199, 30, 127, 98, 199, 206, + 93, 79, 62, 181, 251, 233, 103, 246, 236, 221, 247, 236, 254, 231, 158, 127, 225, 192, 139, + 47, 189, 252, 202, 171, 175, 29, 28, 124, 253, 208, 27, 135, 223, 124, 235, 200, 209, 183, + 223, 121, 247, 216, 241, 247, 222, 63, 113, 242, 212, 7, 167, 63, 60, 243, 209, 199, 56, + 123, 238, 252, 39, 23, 62, 189, 120, 233, 242, 103, 159, 95, 249, 226, 42, 45, 38, 215, 159, + 200, 138, 151, 110, 138, 246, 219, 91, 183, 110, 209, 155, 241, 55, 141, 189, 224, 235, 204, + 11, 31, 252, 180, 218, 2, 40, 71, 5, 173, 137, 32, 253, 93, 170, 48, 20, 33, 12, 195, 112, + 140, 160, 140, 142, 194, 104, 140, 65, 53, 106, 80, 139, 177, 24, 135, 241, 152, 128, 137, + 96, 168, 195, 36, 76, 198, 20, 76, 197, 52, 220, 133, 233, 152, 129, 153, 152, 133, 217, + 152, 131, 48, 234, 209, 128, 70, 234, 149, 121, 152, 143, 5, 88, 136, 69, 88, 140, 37, 104, + 194, 82, 68, 112, 55, 150, 97, 57, 154, 209, 130, 21, 88, 137, 85, 104, 197, 106, 172, 193, + 90, 180, 97, 29, 214, 99, 3, 162, 104, 71, 7, 58, 113, 15, 186, 208, 141, 24, 54, 162, 7, + 247, 226, 62, 170, 244, 102, 220, 143, 94, 108, 193, 3, 216, 138, 7, 113, 7, 233, 189, 131, + 171, 15, 50, 226, 80, 144, 160, 127, 79, 10, 42, 182, 161, 31, 26, 210, 200, 64, 135, 129, + 135, 96, 194, 130, 141, 44, 6, 144, 195, 118, 228, 241, 48, 30, 193, 163, 120, 12, 143, 227, + 9, 250, 11, 239, 196, 46, 60, 137, 167, 176, 27, 79, 227, 25, 236, 193, 94, 236, 195, 179, + 216, 143, 231, 240, 60, 94, 192, 1, 188, 136, 151, 240, 50, 94, 193, 171, 120, 13, 7, 49, + 136, 215, 113, 8, 111, 224, 48, 222, 196, 91, 56, 130, 163, 120, 27, 239, 224, 93, 28, 195, + 113, 188, 135, 247, 113, 2, 39, 113, 10, 31, 224, 52, 62, 196, 25, 124, 132, 143, 201, 191, + 179, 56, 135, 243, 248, 4, 23, 240, 41, 46, 226, 18, 46, 227, 51, 124, 142, 43, 248, 2, 87, + 157, 8, 230, 187, 7, 110, 247, 118, 47, 138, 125, 238, 162, 170, 42, 14, 118, 83, 125, 119, + 59, 216, 67, 117, 234, 117, 176, 183, 132, 199, 71, 149, 223, 239, 96, 63, 117, 195, 160, + 131, 3, 212, 3, 71, 29, 92, 78, 53, 63, 231, 224, 10, 23, 195, 87, 14, 30, 130, 185, 174, + 239, 28, 28, 196, 60, 247, 52, 7, 87, 186, 14, 186, 55, 57, 184, 10, 97, 207, 183, 124, 117, + 122, 61, 228, 79, 208, 59, 65, 96, 31, 225, 144, 55, 44, 176, 95, 208, 151, 9, 92, 38, 232, + 235, 4, 14, 8, 188, 89, 224, 114, 210, 116, 209, 187, 205, 193, 46, 4, 125, 243, 29, 236, + 70, 149, 207, 118, 176, 7, 93, 190, 73, 14, 246, 150, 240, 248, 80, 237, 219, 229, 96, 63, + 66, 190, 67, 14, 14, 96, 154, 239, 148, 131, 203, 177, 194, 247, 123, 7, 87, 184, 155, 253, + 195, 29, 60, 4, 241, 64, 151, 131, 131, 72, 4, 46, 56, 184, 210, 125, 189, 124, 156, 131, + 171, 208, 27, 132, 192, 21, 37, 49, 14, 225, 254, 7, 123, 5, 14, 150, 208, 171, 56, 14, 106, + 2, 135, 184, 255, 193, 71, 5, 30, 65, 120, 120, 112, 159, 192, 35, 75, 248, 71, 137, 60, 20, + 240, 232, 18, 122, 141, 144, 61, 44, 240, 88, 97, 171, 160, 115, 124, 9, 207, 196, 18, 60, + 69, 240, 23, 226, 157, 35, 240, 69, 142, 3, 37, 62, 7, 74, 244, 7, 75, 232, 65, 199, 255, + 88, 222, 80, 18, 146, 172, 176, 147, 44, 150, 82, 88, 84, 207, 232, 54, 145, 216, 74, 221, + 52, 116, 83, 178, 85, 61, 195, 12, 77, 14, 179, 85, 146, 45, 253, 26, 83, 139, 166, 177, 46, + 53, 153, 178, 45, 214, 165, 88, 138, 57, 160, 196, 139, 124, 77, 221, 249, 116, 159, 174, + 177, 166, 1, 197, 180, 56, 111, 99, 120, 81, 3, 155, 30, 85, 101, 83, 183, 244, 132, 61, + 163, 75, 73, 102, 53, 201, 236, 113, 166, 23, 132, 27, 26, 10, 34, 209, 216, 109, 91, 228, + 168, 158, 52, 37, 35, 149, 47, 37, 41, 108, 149, 41, 229, 212, 76, 146, 117, 36, 18, 42, + 133, 209, 184, 100, 241, 146, 88, 74, 181, 88, 66, 207, 216, 76, 166, 151, 164, 102, 44, 22, + 83, 211, 138, 197, 218, 149, 28, 235, 210, 211, 82, 134, 173, 49, 21, 165, 159, 201, 146, + 161, 218, 146, 102, 49, 41, 19, 103, 154, 158, 83, 76, 89, 178, 148, 217, 44, 161, 38, 179, + 166, 82, 32, 247, 73, 150, 42, 51, 35, 155, 145, 237, 108, 33, 82, 91, 79, 42, 118, 74, 49, + 89, 78, 181, 83, 76, 34, 35, 154, 166, 200, 98, 74, 79, 176, 180, 68, 115, 244, 82, 101, 73, + 99, 150, 154, 204, 20, 212, 36, 149, 140, 98, 18, 197, 200, 82, 202, 44, 133, 117, 170, 76, + 78, 73, 166, 36, 219, 20, 116, 152, 177, 141, 68, 75, 232, 38, 179, 20, 219, 230, 225, 252, + 72, 13, 87, 96, 201, 170, 146, 177, 85, 10, 146, 229, 116, 179, 95, 208, 36, 75, 152, 79, + 27, 26, 133, 71, 225, 218, 58, 35, 41, 102, 137, 220, 241, 20, 100, 137, 73, 205, 48, 203, + 38, 110, 201, 140, 139, 164, 88, 225, 148, 109, 27, 77, 245, 245, 185, 92, 46, 156, 118, + 114, 25, 38, 45, 245, 41, 59, 173, 213, 167, 109, 126, 216, 171, 79, 91, 91, 11, 106, 194, + 156, 122, 135, 18, 57, 69, 35, 170, 34, 68, 218, 59, 98, 109, 171, 219, 86, 182, 196, 218, + 58, 218, 89, 199, 106, 182, 161, 109, 101, 107, 123, 119, 43, 107, 89, 211, 213, 218, 26, + 109, 109, 143, 85, 86, 84, 86, 220, 17, 211, 38, 61, 75, 233, 200, 179, 44, 165, 200, 190, + 93, 90, 138, 221, 80, 204, 180, 106, 219, 10, 21, 41, 47, 2, 111, 221, 184, 161, 69, 100, + 145, 15, 12, 83, 143, 103, 101, 155, 199, 159, 75, 169, 114, 170, 68, 150, 190, 106, 70, + 214, 178, 113, 18, 165, 156, 197, 85, 203, 208, 200, 0, 79, 169, 97, 170, 78, 223, 80, 66, + 169, 46, 69, 227, 122, 70, 203, 179, 233, 234, 12, 166, 164, 251, 184, 212, 15, 186, 50, 69, + 238, 127, 235, 146, 96, 143, 243, 138, 82, 67, 217, 166, 42, 250, 164, 196, 60, 137, 223, + 214, 181, 84, 120, 48, 93, 37, 43, 182, 146, 230, 43, 203, 84, 201, 106, 92, 207, 101, 52, + 93, 42, 53, 74, 78, 75, 5, 87, 169, 13, 41, 94, 93, 244, 163, 158, 181, 141, 172, 205, 226, + 202, 0, 95, 9, 196, 147, 82, 52, 227, 39, 17, 253, 106, 37, 249, 168, 94, 35, 225, 140, 85, + 40, 34, 237, 223, 58, 237, 155, 105, 218, 161, 53, 218, 71, 243, 52, 234, 67, 222, 85, 73, + 123, 205, 54, 26, 255, 77, 236, 173, 197, 249, 110, 218, 93, 37, 162, 196, 233, 109, 34, + 238, 57, 228, 249, 141, 231, 138, 231, 42, 61, 151, 60, 151, 61, 167, 105, 255, 207, 211, + 62, 204, 247, 103, 137, 118, 106, 133, 206, 29, 39, 233, 137, 209, 94, 205, 113, 148, 52, + 113, 109, 182, 195, 197, 232, 68, 193, 117, 27, 226, 45, 17, 93, 21, 28, 140, 40, 26, 201, + 135, 9, 173, 18, 116, 233, 191, 214, 212, 66, 154, 52, 250, 118, 17, 133, 159, 25, 108, 58, + 33, 240, 145, 66, 95, 133, 120, 7, 232, 29, 255, 153, 190, 38, 138, 52, 79, 49, 247, 17, + 141, 75, 55, 9, 62, 126, 186, 40, 234, 109, 36, 239, 22, 209, 185, 137, 209, 89, 42, 74, 84, + 153, 102, 117, 154, 215, 41, 118, 155, 118, 109, 110, 33, 73, 39, 17, 77, 100, 170, 231, 39, + 210, 11, 72, 186, 129, 238, 82, 43, 81, 138, 238, 231, 113, 21, 50, 170, 147, 46, 30, 151, + 65, 17, 228, 127, 145, 75, 17, 249, 226, 124, 57, 178, 148, 33, 25, 70, 103, 179, 4, 221, + 170, 83, 141, 70, 58, 215, 241, 179, 93, 76, 156, 158, 120, 38, 18, 66, 151, 77, 72, 118, + 144, 36, 100, 45, 161, 85, 37, 239, 20, 129, 219, 233, 155, 19, 153, 211, 69, 47, 240, 40, + 214, 144, 45, 133, 238, 126, 33, 205, 189, 83, 133, 188, 38, 36, 10, 125, 194, 104, 164, + 147, 36, 143, 159, 243, 240, 172, 207, 22, 118, 85, 145, 31, 211, 209, 95, 228, 238, 19, 60, + 220, 95, 222, 5, 89, 162, 202, 226, 68, 87, 90, 83, 91, 228, 67, 161, 111, 74, 232, 101, 34, + 94, 62, 98, 162, 83, 100, 145, 79, 141, 230, 228, 18, 41, 94, 25, 38, 124, 47, 200, 165, 29, + 157, 178, 240, 152, 9, 171, 73, 39, 242, 162, 55, 220, 74, 70, 216, 40, 240, 24, 194, 99, + 67, 84, 154, 231, 179, 147, 100, 184, 189, 148, 168, 178, 36, 236, 21, 42, 205, 123, 151, + 209, 105, 184, 192, 151, 16, 125, 201, 196, 200, 22, 86, 11, 213, 249, 101, 111, 138, 30, + 88, 68, 81, 133, 23, 124, 54, 225, 100, 38, 39, 244, 245, 151, 240, 73, 142, 223, 133, 232, + 211, 98, 5, 21, 170, 87, 168, 46, 207, 25, 115, 108, 113, 173, 63, 244, 93, 177, 11, 178, + 142, 38, 85, 100, 203, 250, 241, 74, 255, 23, 235, 197, 2, 220, 196, 117, 220, 125, 239, 78, + 18, 254, 96, 25, 2, 198, 159, 192, 169, 135, 77, 192, 63, 40, 132, 248, 3, 70, 32, 203, 38, + 136, 143, 109, 25, 144, 12, 161, 18, 146, 193, 38, 132, 184, 193, 129, 184, 33, 173, 39, 12, + 13, 21, 159, 208, 148, 129, 22, 90, 32, 148, 144, 166, 76, 203, 137, 132, 84, 158, 182, 224, + 144, 230, 51, 83, 104, 153, 116, 194, 116, 18, 146, 6, 66, 9, 67, 67, 234, 73, 147, 80, 154, + 72, 215, 189, 39, 89, 182, 92, 218, 102, 58, 213, 234, 222, 189, 125, 187, 239, 237, 127, + 239, 110, 80, 166, 24, 182, 181, 9, 43, 58, 168, 46, 202, 9, 54, 10, 40, 163, 19, 83, 243, + 178, 44, 161, 75, 185, 224, 127, 128, 100, 149, 211, 216, 73, 60, 126, 161, 153, 129, 173, + 167, 175, 131, 193, 218, 148, 37, 121, 255, 191, 50, 140, 12, 92, 155, 224, 109, 29, 36, + 197, 248, 122, 105, 166, 175, 153, 58, 186, 28, 212, 45, 140, 249, 34, 90, 53, 42, 167, 142, + 198, 249, 98, 221, 73, 43, 110, 26, 141, 126, 82, 79, 53, 224, 36, 88, 32, 86, 155, 233, 11, + 44, 77, 92, 94, 225, 195, 120, 76, 187, 232, 254, 112, 34, 246, 157, 183, 169, 181, 120, + 180, 58, 68, 174, 60, 32, 114, 183, 83, 244, 33, 35, 255, 187, 6, 197, 201, 73, 25, 52, 159, + 100, 14, 100, 80, 63, 165, 67, 244, 155, 32, 73, 9, 136, 19, 227, 81, 219, 40, 100, 5, 68, + 37, 220, 78, 110, 28, 111, 23, 85, 181, 150, 246, 6, 19, 82, 227, 217, 17, 20, 244, 14, 209, + 179, 186, 6, 229, 150, 33, 171, 125, 72, 151, 136, 231, 85, 60, 203, 135, 90, 110, 112, 172, + 21, 179, 187, 104, 223, 68, 186, 183, 138, 248, 246, 203, 186, 157, 94, 235, 254, 229, 236, + 47, 239, 165, 129, 211, 131, 201, 202, 138, 247, 149, 78, 161, 249, 64, 23, 184, 189, 245, + 237, 137, 174, 50, 84, 175, 234, 65, 62, 48, 44, 137, 219, 210, 41, 228, 245, 63, 105, 140, + 243, 227, 182, 6, 69, 159, 91, 39, 250, 157, 255, 223, 90, 26, 247, 180, 63, 197, 171, 241, + 30, 246, 96, 98, 28, 232, 106, 134, 87, 59, 69, 207, 233, 20, 231, 183, 210, 83, 168, 191, + 147, 199, 207, 105, 19, 89, 221, 241, 95, 98, 244, 191, 87, 82, 63, 173, 92, 116, 147, 128, + 56, 113, 253, 144, 250, 233, 127, 59, 240, 11, 158, 126, 252, 146, 120, 155, 104, 77, 121, + 187, 104, 77, 121, 127, 16, 125, 69, 26, 43, 77, 145, 92, 82, 189, 52, 147, 198, 74, 226, + 246, 147, 141, 134, 247, 12, 205, 102, 19, 199, 67, 162, 47, 25, 187, 80, 58, 135, 187, 232, + 171, 208, 34, 239, 147, 167, 2, 96, 97, 252, 206, 15, 193, 42, 54, 34, 131, 203, 50, 50, 52, + 155, 152, 108, 134, 33, 191, 230, 5, 14, 5, 236, 125, 74, 95, 76, 222, 30, 171, 195, 169, + 150, 116, 60, 211, 157, 164, 202, 247, 193, 20, 121, 62, 140, 163, 171, 128, 239, 134, 124, + 0, 253, 82, 226, 186, 18, 243, 234, 55, 228, 251, 65, 141, 173, 209, 47, 78, 200, 34, 230, + 23, 18, 87, 252, 231, 135, 66, 88, 65, 57, 49, 15, 206, 64, 31, 156, 194, 73, 244, 60, 232, + 213, 207, 147, 159, 60, 108, 35, 148, 210, 250, 147, 240, 11, 232, 133, 119, 233, 169, 28, + 164, 111, 177, 60, 220, 4, 138, 254, 67, 216, 14, 69, 176, 25, 14, 65, 165, 148, 167, 159, + 164, 250, 190, 102, 201, 130, 209, 48, 30, 170, 240, 65, 250, 210, 29, 69, 249, 123, 0, 47, + 82, 223, 113, 209, 25, 213, 212, 111, 190, 67, 94, 168, 135, 70, 90, 191, 137, 21, 68, 65, + 234, 54, 247, 145, 244, 221, 176, 31, 78, 193, 239, 224, 79, 144, 75, 39, 150, 193, 5, 52, + 227, 77, 253, 151, 212, 175, 220, 164, 195, 163, 208, 3, 239, 202, 115, 228, 109, 48, 18, + 190, 11, 207, 210, 251, 211, 75, 240, 103, 44, 195, 35, 120, 157, 127, 164, 159, 212, 207, + 234, 127, 161, 93, 19, 233, 157, 96, 58, 44, 163, 250, 89, 9, 79, 193, 211, 196, 247, 44, + 252, 150, 169, 252, 199, 122, 158, 254, 168, 254, 19, 253, 117, 40, 32, 237, 143, 145, 213, + 47, 193, 43, 36, 235, 51, 84, 112, 9, 6, 216, 81, 222, 21, 251, 135, 190, 78, 63, 70, 126, + 200, 32, 157, 73, 123, 130, 217, 100, 205, 66, 138, 214, 51, 196, 121, 1, 62, 199, 97, 4, + 143, 51, 133, 205, 98, 129, 88, 182, 158, 3, 102, 24, 71, 249, 89, 76, 250, 45, 166, 156, + 248, 38, 108, 133, 29, 100, 197, 62, 56, 8, 199, 225, 26, 206, 194, 54, 60, 135, 31, 177, + 76, 214, 205, 78, 203, 13, 230, 133, 230, 133, 195, 78, 71, 223, 212, 235, 245, 207, 72, 70, + 6, 216, 72, 219, 165, 244, 212, 123, 132, 118, 62, 5, 223, 131, 61, 180, 243, 105, 146, 245, + 27, 130, 62, 136, 226, 116, 172, 198, 26, 188, 23, 155, 240, 73, 252, 54, 62, 131, 127, 103, + 197, 236, 109, 246, 57, 31, 206, 179, 120, 9, 247, 114, 31, 223, 196, 47, 243, 91, 22, 57, + 186, 40, 182, 55, 118, 94, 111, 208, 31, 33, 95, 34, 249, 60, 141, 34, 233, 32, 59, 155, 97, + 57, 229, 251, 122, 170, 143, 77, 208, 77, 218, 237, 36, 216, 69, 222, 59, 70, 160, 145, 63, + 79, 19, 188, 12, 239, 192, 251, 4, 87, 225, 26, 124, 72, 57, 39, 147, 141, 105, 56, 137, 96, + 50, 65, 53, 218, 113, 30, 46, 198, 175, 225, 106, 92, 143, 123, 241, 69, 140, 224, 41, 124, + 5, 175, 227, 39, 108, 26, 155, 206, 42, 217, 34, 214, 196, 86, 179, 14, 214, 201, 118, 49, + 141, 133, 217, 105, 118, 133, 253, 141, 180, 172, 226, 78, 190, 158, 127, 139, 31, 227, 103, + 248, 235, 252, 13, 254, 150, 4, 210, 60, 201, 47, 181, 75, 15, 75, 187, 37, 77, 122, 83, + 234, 147, 62, 145, 98, 50, 200, 42, 65, 153, 236, 151, 15, 69, 15, 199, 92, 177, 101, 122, + 145, 94, 173, 175, 212, 119, 232, 187, 8, 174, 145, 143, 199, 146, 53, 69, 48, 129, 236, + 105, 160, 168, 6, 168, 251, 172, 38, 171, 58, 224, 235, 4, 93, 228, 187, 45, 100, 209, 30, + 56, 64, 190, 51, 188, 247, 34, 68, 224, 87, 148, 165, 103, 40, 190, 175, 194, 121, 120, 139, + 236, 123, 7, 46, 195, 77, 184, 69, 206, 49, 236, 27, 133, 54, 44, 197, 41, 228, 223, 153, + 88, 79, 208, 66, 113, 218, 128, 155, 176, 27, 119, 226, 62, 242, 115, 24, 79, 18, 244, 226, + 69, 178, 50, 70, 22, 46, 97, 94, 182, 130, 109, 96, 155, 216, 14, 182, 151, 237, 103, 61, + 172, 151, 93, 160, 72, 232, 220, 68, 145, 24, 195, 235, 185, 139, 47, 229, 203, 248, 10, + 222, 201, 247, 240, 239, 243, 31, 240, 3, 252, 32, 143, 240, 94, 254, 170, 196, 164, 42, + 169, 65, 122, 72, 218, 44, 237, 146, 14, 75, 199, 165, 215, 164, 63, 72, 23, 229, 201, 114, + 181, 28, 34, 208, 228, 147, 242, 175, 229, 171, 166, 17, 166, 124, 211, 52, 147, 219, 20, + 49, 155, 44, 93, 150, 15, 44, 49, 120, 30, 94, 131, 48, 156, 28, 90, 251, 184, 21, 173, 24, + 134, 159, 225, 7, 92, 226, 221, 236, 44, 243, 176, 116, 118, 1, 31, 151, 126, 143, 19, 40, + 2, 51, 16, 228, 157, 212, 95, 62, 38, 13, 239, 196, 55, 216, 61, 184, 148, 7, 176, 133, 252, + 247, 56, 174, 194, 101, 240, 35, 94, 192, 15, 243, 121, 112, 86, 94, 135, 110, 222, 128, 65, + 112, 75, 123, 225, 11, 249, 101, 240, 203, 33, 118, 130, 51, 57, 196, 163, 120, 139, 29, + 163, 126, 184, 147, 221, 31, 125, 78, 247, 226, 112, 112, 227, 17, 118, 148, 50, 230, 49, + 152, 1, 19, 165, 60, 184, 192, 42, 165, 30, 44, 100, 19, 217, 105, 243, 207, 49, 2, 53, 102, + 19, 175, 228, 85, 150, 44, 194, 142, 240, 247, 73, 77, 183, 37, 11, 175, 131, 159, 95, 166, + 250, 185, 68, 181, 213, 196, 142, 82, 79, 184, 138, 23, 205, 139, 72, 187, 40, 63, 78, 60, + 143, 65, 13, 30, 137, 101, 195, 115, 178, 151, 249, 176, 128, 29, 193, 249, 209, 205, 209, + 63, 242, 253, 250, 65, 204, 101, 151, 1, 162, 217, 209, 217, 204, 65, 25, 183, 88, 255, 41, + 59, 5, 127, 133, 189, 177, 91, 210, 123, 112, 138, 189, 13, 139, 169, 107, 4, 68, 229, 124, + 76, 181, 183, 145, 58, 205, 18, 248, 130, 101, 82, 61, 185, 141, 247, 118, 187, 189, 121, + 86, 205, 204, 25, 213, 85, 149, 21, 247, 220, 61, 109, 234, 87, 167, 76, 46, 47, 43, 45, 41, + 158, 52, 241, 174, 9, 69, 133, 227, 213, 175, 216, 148, 113, 99, 239, 44, 200, 207, 203, 29, + 147, 51, 122, 212, 29, 35, 71, 100, 91, 179, 134, 103, 102, 164, 167, 13, 179, 152, 77, 178, + 196, 25, 66, 137, 83, 173, 243, 41, 90, 145, 79, 147, 138, 212, 185, 115, 75, 13, 92, 245, + 211, 130, 127, 208, 130, 79, 163, 79, 90, 173, 46, 149, 71, 83, 124, 130, 77, 73, 229, 180, + 19, 231, 170, 33, 156, 246, 56, 167, 61, 201, 137, 86, 101, 6, 204, 40, 45, 81, 156, 170, + 162, 157, 171, 85, 149, 8, 182, 52, 122, 104, 190, 163, 86, 245, 42, 218, 13, 49, 95, 32, + 230, 82, 145, 64, 50, 9, 177, 217, 104, 135, 226, 28, 211, 86, 171, 104, 232, 83, 156, 90, + 221, 134, 182, 144, 211, 87, 75, 231, 133, 211, 211, 28, 170, 163, 53, 173, 180, 4, 194, + 105, 233, 52, 77, 167, 153, 150, 163, 118, 132, 49, 167, 6, 197, 132, 229, 56, 171, 194, 12, + 44, 153, 164, 149, 150, 167, 214, 58, 181, 92, 181, 214, 80, 65, 227, 133, 78, 127, 80, 107, + 104, 244, 56, 107, 243, 109, 54, 111, 105, 137, 134, 142, 128, 186, 82, 3, 117, 142, 150, + 85, 44, 88, 192, 33, 196, 104, 38, 135, 102, 22, 98, 148, 118, 195, 28, 216, 166, 132, 75, + 122, 67, 219, 35, 86, 88, 233, 43, 206, 8, 170, 65, 255, 114, 143, 198, 253, 94, 67, 70, + 118, 49, 201, 173, 213, 114, 190, 113, 101, 204, 0, 74, 135, 143, 112, 120, 158, 24, 76, + 205, 231, 33, 231, 152, 118, 197, 64, 67, 161, 39, 20, 237, 80, 163, 103, 48, 213, 102, 140, + 94, 47, 157, 65, 123, 89, 97, 157, 47, 84, 71, 162, 183, 147, 23, 93, 110, 133, 164, 177, + 45, 94, 143, 134, 91, 72, 164, 98, 88, 98, 88, 21, 183, 175, 85, 117, 26, 43, 190, 53, 138, + 54, 76, 157, 163, 182, 133, 214, 248, 40, 54, 121, 33, 13, 154, 186, 108, 39, 242, 242, 236, + 61, 250, 123, 144, 231, 84, 66, 205, 30, 213, 166, 205, 202, 87, 189, 254, 218, 130, 240, + 29, 16, 106, 234, 122, 62, 215, 174, 228, 166, 82, 74, 75, 194, 214, 236, 184, 99, 195, 195, + 179, 18, 147, 140, 204, 193, 147, 214, 36, 77, 204, 4, 187, 49, 115, 53, 37, 61, 139, 134, + 70, 234, 189, 148, 17, 154, 18, 80, 72, 19, 143, 74, 54, 85, 24, 67, 107, 5, 132, 2, 21, + 196, 70, 63, 47, 210, 46, 45, 72, 17, 105, 215, 134, 57, 124, 33, 107, 149, 177, 110, 236, + 215, 228, 66, 171, 170, 132, 62, 5, 202, 0, 245, 198, 135, 169, 43, 254, 196, 138, 169, 208, + 250, 41, 24, 83, 35, 79, 146, 185, 70, 244, 254, 185, 86, 92, 172, 77, 154, 100, 164, 136, + 217, 65, 49, 37, 29, 107, 4, 126, 119, 105, 201, 134, 8, 155, 173, 118, 88, 21, 186, 145, + 251, 160, 129, 124, 235, 247, 86, 149, 147, 251, 109, 54, 35, 192, 219, 34, 118, 88, 73, + 136, 214, 221, 232, 137, 227, 244, 86, 155, 127, 2, 236, 229, 197, 94, 141, 249, 12, 74, + 111, 63, 101, 212, 98, 131, 210, 221, 79, 73, 110, 247, 169, 148, 201, 47, 208, 3, 12, 96, + 148, 102, 41, 74, 254, 179, 172, 163, 71, 58, 219, 170, 52, 28, 253, 31, 200, 173, 113, 186, + 203, 173, 186, 26, 91, 60, 138, 51, 228, 75, 248, 214, 213, 156, 130, 197, 233, 21, 73, 90, + 98, 166, 141, 116, 120, 120, 62, 75, 204, 88, 62, 23, 84, 74, 202, 229, 73, 102, 3, 241, + 100, 104, 82, 33, 253, 77, 34, 169, 131, 17, 179, 133, 178, 82, 172, 160, 82, 167, 89, 125, + 115, 227, 163, 55, 205, 102, 251, 146, 155, 34, 122, 159, 177, 75, 220, 6, 182, 37, 212, + 212, 170, 138, 83, 241, 234, 20, 60, 69, 189, 140, 16, 39, 133, 165, 34, 230, 106, 110, 9, + 133, 210, 82, 104, 84, 224, 115, 194, 42, 110, 109, 12, 219, 113, 171, 187, 197, 211, 99, 5, + 80, 182, 54, 123, 78, 48, 100, 14, 223, 28, 111, 120, 60, 209, 60, 61, 10, 128, 93, 172, + 178, 228, 170, 129, 41, 6, 6, 46, 164, 132, 61, 193, 44, 130, 148, 223, 99, 7, 232, 22, 84, + 73, 44, 8, 60, 16, 65, 16, 107, 255, 100, 187, 234, 131, 163, 186, 170, 248, 61, 239, 123, + 179, 73, 10, 33, 166, 20, 196, 165, 133, 144, 198, 0, 105, 160, 54, 4, 24, 154, 132, 143, + 64, 150, 143, 64, 2, 77, 164, 180, 125, 187, 123, 179, 251, 200, 219, 247, 30, 239, 35, 36, + 40, 58, 45, 98, 171, 21, 187, 136, 50, 126, 84, 91, 91, 108, 21, 106, 77, 129, 169, 65, 105, + 197, 191, 252, 203, 191, 152, 209, 25, 255, 106, 7, 177, 254, 85, 29, 7, 113, 166, 227, 176, + 254, 238, 219, 205, 135, 51, 125, 59, 231, 158, 143, 123, 207, 189, 231, 220, 123, 238, 221, + 115, 140, 25, 25, 177, 236, 180, 84, 145, 45, 136, 101, 248, 214, 176, 248, 12, 85, 198, 86, + 191, 180, 180, 255, 233, 251, 54, 255, 219, 88, 102, 196, 255, 110, 175, 239, 188, 190, 73, + 224, 223, 247, 117, 169, 229, 242, 189, 45, 248, 39, 76, 130, 77, 198, 227, 227, 191, 63, + 198, 140, 228, 189, 45, 104, 15, 221, 187, 244, 223, 181, 198, 71, 179, 61, 51, 223, 251, + 202, 31, 145, 29, 136, 239, 19, 134, 20, 21, 112, 145, 253, 85, 189, 202, 76, 133, 177, 102, + 37, 199, 246, 107, 23, 89, 159, 214, 197, 118, 202, 167, 216, 70, 244, 13, 1, 214, 160, 239, + 44, 250, 154, 49, 222, 169, 226, 179, 82, 87, 185, 12, 121, 63, 224, 159, 128, 213, 128, 65, + 192, 114, 64, 6, 48, 2, 216, 13, 248, 50, 96, 191, 212, 197, 222, 2, 188, 8, 221, 205, 66, + 95, 96, 249, 12, 27, 22, 180, 250, 7, 214, 168, 30, 98, 15, 1, 55, 40, 183, 217, 18, 229, + 22, 107, 209, 150, 178, 157, 202, 77, 182, 2, 178, 85, 88, 127, 189, 90, 203, 246, 130, 110, + 86, 79, 178, 70, 125, 153, 208, 41, 255, 29, 252, 110, 173, 25, 99, 62, 134, 13, 1, 91, 165, + 92, 103, 27, 160, 187, 73, 61, 205, 154, 96, 123, 31, 250, 54, 168, 173, 172, 87, 123, 18, + 235, 221, 98, 77, 152, 231, 77, 237, 35, 58, 10, 220, 175, 110, 131, 140, 149, 255, 161, 48, + 249, 47, 152, 123, 8, 118, 76, 2, 118, 200, 119, 216, 118, 232, 238, 82, 218, 88, 159, 220, + 15, 255, 110, 178, 53, 210, 107, 108, 43, 240, 118, 244, 127, 6, 208, 161, 188, 12, 159, + 218, 216, 195, 160, 133, 253, 157, 160, 71, 128, 45, 140, 217, 11, 221, 54, 244, 247, 97, + 63, 123, 96, 235, 128, 252, 47, 118, 24, 184, 29, 243, 30, 150, 255, 204, 110, 210, 15, 217, + 5, 224, 63, 97, 252, 163, 202, 93, 182, 136, 62, 137, 215, 221, 76, 56, 45, 232, 60, 134, + 189, 98, 154, 198, 174, 105, 26, 61, 2, 252, 31, 192, 93, 227, 16, 107, 213, 111, 179, 52, + 230, 63, 50, 131, 229, 245, 108, 84, 236, 29, 50, 21, 171, 186, 167, 147, 208, 31, 197, 58, + 61, 242, 219, 236, 104, 117, 143, 5, 172, 20, 107, 33, 122, 254, 166, 220, 148, 186, 12, 86, + 62, 3, 223, 151, 107, 231, 113, 230, 39, 217, 26, 236, 205, 83, 250, 109, 122, 14, 123, 181, + 55, 134, 243, 204, 4, 222, 35, 0, 243, 109, 0, 116, 2, 54, 85, 97, 163, 122, 149, 106, 0, + 73, 244, 15, 130, 239, 215, 14, 176, 172, 0, 61, 197, 214, 65, 119, 45, 214, 26, 18, 177, + 129, 190, 71, 96, 103, 12, 85, 251, 119, 87, 237, 143, 49, 236, 108, 199, 190, 246, 204, + 232, 107, 253, 236, 243, 208, 105, 147, 27, 216, 224, 60, 96, 179, 112, 7, 121, 211, 29, + 212, 107, 49, 166, 11, 208, 137, 160, 191, 69, 234, 192, 53, 57, 41, 189, 81, 1, 182, 85, + 110, 40, 159, 147, 27, 164, 35, 21, 204, 86, 128, 126, 54, 198, 208, 165, 11, 168, 108, 196, + 109, 184, 129, 248, 87, 227, 27, 32, 177, 5, 168, 116, 15, 130, 250, 88, 125, 165, 42, 137, + 191, 242, 131, 168, 223, 62, 237, 187, 81, 189, 102, 18, 201, 164, 32, 83, 214, 80, 129, 25, + 113, 61, 144, 164, 90, 170, 163, 122, 186, 15, 249, 231, 66, 106, 160, 69, 212, 136, 60, + 186, 137, 238, 167, 197, 244, 0, 45, 161, 165, 244, 89, 90, 70, 159, 163, 20, 234, 169, 7, + 233, 33, 90, 65, 43, 169, 153, 86, 81, 11, 61, 76, 173, 168, 37, 218, 104, 53, 114, 238, + 181, 212, 142, 154, 162, 131, 214, 209, 122, 122, 148, 190, 128, 12, 188, 19, 21, 96, 23, + 109, 68, 157, 177, 25, 217, 248, 22, 212, 76, 221, 212, 67, 189, 180, 149, 182, 209, 118, + 218, 129, 236, 124, 39, 42, 160, 126, 74, 211, 110, 218, 67, 123, 105, 31, 13, 208, 126, 84, + 68, 131, 52, 132, 170, 228, 16, 61, 65, 195, 52, 130, 12, 254, 48, 61, 73, 71, 232, 41, 212, + 41, 207, 224, 255, 44, 67, 89, 202, 17, 71, 206, 155, 71, 110, 111, 209, 81, 26, 35, 155, + 138, 228, 144, 75, 30, 29, 35, 31, 181, 76, 72, 17, 178, 254, 227, 52, 65, 147, 116, 130, + 190, 132, 252, 255, 36, 125, 133, 190, 138, 42, 224, 89, 122, 142, 78, 209, 215, 232, 52, + 170, 174, 231, 145, 113, 127, 131, 190, 73, 47, 210, 183, 232, 12, 234, 131, 151, 168, 68, + 103, 233, 59, 116, 142, 190, 75, 223, 163, 243, 168, 136, 190, 79, 63, 64, 213, 240, 35, + 122, 153, 126, 76, 63, 161, 87, 232, 85, 250, 41, 189, 70, 175, 163, 46, 253, 25, 189, 65, + 111, 210, 207, 233, 23, 116, 145, 46, 209, 91, 244, 75, 122, 155, 126, 69, 83, 168, 47, 46, + 211, 21, 186, 138, 26, 227, 93, 250, 53, 234, 169, 107, 244, 27, 250, 45, 93, 167, 247, 232, + 125, 53, 240, 204, 44, 215, 248, 68, 214, 54, 139, 137, 200, 177, 198, 185, 31, 152, 118, + 141, 19, 21, 51, 160, 172, 188, 147, 228, 19, 86, 16, 114, 39, 180, 76, 91, 247, 184, 159, + 5, 153, 48, 139, 158, 24, 231, 228, 140, 32, 202, 22, 194, 130, 25, 38, 60, 211, 231, 142, + 205, 71, 195, 154, 152, 242, 173, 124, 33, 172, 53, 161, 233, 91, 193, 88, 209, 12, 11, 138, + 103, 71, 129, 154, 117, 139, 69, 83, 45, 90, 78, 20, 104, 152, 195, 114, 115, 106, 96, 155, + 65, 65, 57, 193, 125, 87, 118, 29, 46, 135, 199, 93, 53, 44, 248, 156, 43, 163, 110, 228, + 43, 163, 48, 73, 14, 172, 9, 53, 224, 227, 220, 81, 185, 152, 87, 113, 44, 135, 99, 42, 219, + 117, 18, 1, 47, 90, 49, 165, 216, 60, 8, 84, 126, 44, 130, 157, 121, 159, 155, 88, 217, 56, + 22, 241, 32, 180, 48, 42, 235, 58, 121, 63, 130, 233, 106, 143, 237, 21, 76, 165, 151, 135, + 166, 188, 181, 96, 169, 219, 184, 29, 154, 250, 118, 47, 176, 48, 133, 60, 0, 73, 159, 9, + 11, 229, 237, 161, 169, 236, 114, 67, 83, 11, 11, 24, 218, 161, 166, 77, 207, 51, 181, 221, + 102, 49, 147, 51, 165, 61, 145, 180, 55, 210, 247, 97, 97, 223, 117, 164, 1, 75, 29, 18, + 131, 228, 3, 5, 87, 29, 180, 242, 208, 30, 50, 35, 253, 96, 101, 78, 45, 16, 146, 14, 117, + 95, 145, 231, 77, 105, 216, 146, 7, 2, 75, 249, 34, 134, 39, 51, 190, 153, 29, 227, 161, + 216, 179, 4, 86, 241, 249, 168, 235, 243, 218, 170, 52, 222, 191, 58, 236, 144, 199, 157, + 156, 149, 141, 108, 211, 175, 137, 156, 28, 118, 61, 139, 81, 9, 223, 132, 208, 180, 249, + 132, 106, 198, 254, 100, 196, 250, 89, 88, 159, 139, 253, 225, 85, 127, 60, 72, 242, 177, + 63, 232, 87, 44, 248, 163, 64, 212, 161, 142, 197, 222, 216, 21, 111, 138, 145, 228, 68, + 186, 91, 245, 198, 179, 212, 216, 101, 217, 135, 55, 177, 237, 114, 8, 111, 162, 170, 55, + 174, 112, 163, 67, 141, 145, 52, 97, 201, 16, 227, 232, 66, 51, 33, 236, 230, 194, 23, 57, + 3, 83, 99, 46, 246, 65, 15, 172, 162, 5, 235, 141, 234, 126, 116, 104, 226, 240, 67, 158, + 16, 199, 21, 159, 150, 49, 138, 193, 226, 148, 12, 203, 25, 181, 28, 43, 156, 212, 70, 109, + 215, 183, 28, 37, 107, 71, 25, 61, 103, 153, 69, 215, 201, 169, 5, 110, 250, 161, 136, 215, + 28, 79, 152, 190, 239, 30, 207, 184, 97, 161, 66, 137, 101, 245, 152, 138, 188, 154, 24, + 199, 75, 87, 58, 115, 238, 113, 71, 203, 113, 132, 4, 79, 136, 16, 172, 196, 94, 192, 17, + 18, 185, 218, 106, 160, 84, 236, 40, 70, 118, 104, 121, 246, 100, 173, 231, 187, 158, 235, + 11, 147, 76, 59, 137, 112, 22, 177, 159, 179, 70, 71, 181, 76, 100, 219, 60, 212, 114, 214, + 184, 149, 227, 134, 227, 134, 177, 98, 18, 173, 53, 142, 211, 112, 178, 60, 137, 157, 245, + 221, 137, 202, 132, 220, 182, 45, 120, 29, 36, 99, 67, 112, 181, 66, 62, 81, 27, 211, 5, + 248, 119, 130, 79, 212, 103, 193, 89, 102, 30, 22, 132, 145, 239, 224, 48, 185, 87, 48, 118, + 97, 67, 198, 192, 27, 7, 170, 68, 242, 56, 183, 112, 242, 161, 111, 6, 65, 125, 214, 242, + 179, 54, 159, 177, 181, 166, 194, 10, 199, 12, 94, 244, 194, 201, 128, 135, 181, 150, 3, + 159, 224, 161, 240, 64, 197, 165, 118, 157, 122, 225, 18, 100, 145, 104, 120, 88, 143, 96, + 67, 240, 204, 176, 9, 120, 18, 68, 25, 161, 58, 51, 46, 102, 102, 70, 9, 70, 199, 225, 22, + 113, 129, 106, 132, 215, 21, 82, 53, 157, 188, 205, 141, 188, 8, 70, 176, 117, 62, 207, 139, + 167, 2, 51, 250, 214, 104, 125, 214, 245, 38, 227, 99, 168, 176, 48, 62, 199, 139, 166, 63, + 22, 179, 58, 214, 201, 69, 217, 80, 175, 6, 178, 158, 115, 67, 241, 72, 212, 216, 110, 94, + 240, 88, 100, 134, 196, 43, 147, 168, 146, 174, 95, 217, 189, 92, 198, 22, 135, 63, 203, + 196, 207, 206, 12, 19, 121, 117, 51, 100, 245, 17, 170, 114, 34, 16, 116, 219, 61, 193, 157, + 60, 34, 72, 152, 46, 244, 106, 103, 173, 54, 157, 160, 110, 206, 104, 193, 205, 217, 12, 46, + 17, 68, 184, 72, 98, 75, 147, 179, 111, 93, 232, 205, 209, 124, 98, 142, 206, 132, 117, 243, + 110, 119, 232, 205, 231, 248, 196, 124, 46, 19, 38, 103, 111, 78, 232, 213, 206, 210, 69, + 43, 55, 215, 145, 9, 245, 152, 198, 117, 207, 193, 136, 201, 154, 216, 250, 216, 78, 67, + 156, 53, 78, 192, 174, 153, 33, 66, 111, 150, 228, 19, 179, 100, 6, 71, 59, 251, 46, 99, + 161, 57, 6, 33, 57, 199, 100, 194, 250, 249, 15, 80, 232, 253, 31, 139, 128, 157, 207, 98, + 206, 185, 123, 94, 117, 178, 194, 192, 250, 121, 93, 153, 16, 255, 241, 239, 12, 53, 244, + 52, 74, 45, 248, 173, 146, 86, 49, 151, 154, 144, 60, 60, 29, 183, 251, 226, 246, 241, 184, + 109, 23, 173, 212, 126, 185, 61, 149, 154, 150, 214, 94, 126, 85, 160, 213, 151, 151, 181, + 2, 173, 236, 78, 126, 184, 36, 213, 209, 210, 144, 218, 220, 34, 248, 251, 187, 55, 217, + 173, 169, 15, 46, 62, 144, 250, 16, 112, 169, 101, 93, 234, 133, 205, 235, 82, 167, 0, 237, + 128, 113, 240, 98, 92, 203, 197, 214, 148, 219, 226, 22, 221, 175, 187, 207, 43, 157, 172, + 169, 9, 166, 52, 44, 52, 186, 167, 233, 214, 187, 7, 27, 19, 141, 137, 206, 210, 52, 253, + 174, 187, 75, 47, 189, 167, 151, 174, 232, 165, 188, 94, 202, 233, 165, 39, 244, 210, 14, + 189, 244, 152, 94, 90, 171, 151, 218, 244, 82, 179, 94, 90, 169, 55, 26, 13, 198, 2, 163, + 222, 168, 53, 106, 12, 195, 208, 12, 197, 144, 12, 102, 52, 78, 151, 63, 232, 110, 19, 149, + 66, 163, 182, 64, 32, 77, 17, 173, 18, 211, 11, 36, 209, 74, 149, 66, 66, 34, 67, 98, 253, + 108, 106, 145, 156, 150, 210, 131, 189, 148, 158, 186, 145, 101, 233, 204, 242, 169, 187, + 131, 43, 166, 169, 6, 213, 149, 186, 162, 151, 166, 26, 210, 44, 61, 212, 187, 120, 106, 67, + 91, 122, 90, 47, 31, 152, 234, 108, 75, 79, 233, 3, 135, 135, 223, 33, 250, 246, 8, 164, 83, + 210, 11, 168, 122, 134, 134, 167, 169, 44, 68, 167, 151, 162, 240, 26, 190, 198, 136, 202, + 167, 207, 44, 173, 226, 145, 17, 214, 52, 254, 248, 226, 199, 27, 182, 44, 236, 218, 177, + 237, 83, 154, 103, 170, 109, 219, 220, 183, 184, 109, 254, 151, 30, 152, 188, 206, 82, 20, + 49, 29, 109, 120, 69, 79, 157, 211, 133, 116, 16, 210, 82, 44, 45, 9, 105, 233, 127, 2, 139, + 74, 200, 110, 152, 230, 29, 28, 177, 97, 149, 108, 228, 6, 35, 16, 227, 191, 108, 36, 227, + 102, 199, 173, 14, 213, 174, 169, 202, 174, 9, 202, 174, 169, 64, 156, 176, 161, 187, 44, + 67, 98, 67, 67, 146, 130, 194, 70, 135, 173, 32, 9, 133, 13, 204, 106, 9, 73, 201, 25, 32, + 58, 49, 117, 195, 86, 229, 84, 151, 13, 14, 202, 46, 10, 27, 29, 171, 177, 72, 87, 131, 164, + 29, 149, 93, 54, 50, 84, 187, 134, 68, 108, 172, 118, 72, 117, 217, 228, 232, 224, 232, 170, + 156, 232, 18, 185, 147, 193, 143, 49, 105, 163, 86, 31, 138, 117, 157, 48, 235, 118, 50, + 104, 49, 38, 97, 154, 184, 131, 49, 9, 100, 164, 22, 200, 70, 191, 62, 44, 54, 246, 129, + 164, 253, 64, 54, 246, 129, 108, 236, 3, 217, 232, 231, 224, 7, 182, 209, 53, 19, 20, 129, + 1, 17, 27, 57, 24, 156, 34, 157, 99, 32, 244, 102, 38, 110, 46, 96, 92, 36, 72, 43, 70, 58, + 137, 9, 20, 216, 129, 35, 198, 90, 81, 162, 78, 122, 23, 11, 3, 227, 10, 6, 110, 237, 200, + 13, 60, 202, 78, 27, 120, 129, 24, 36, 165, 235, 168, 235, 8, 146, 2, 38, 24, 144, 20, 31, + 80, 152, 31, 42, 37, 81, 103, 173, 40, 189, 139, 113, 5, 84, 74, 0, 40, 44, 168, 236, 196, + 160, 93, 170, 141, 6, 138, 65, 128, 65, 194, 53, 211, 5, 132, 129, 46, 217, 249, 255, 0, 83, + 195, 38, 33, 121, 35, 237, 72, 109, 6, 128, 0, 3, 0, 223, 15, 158, 44, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 50, 57, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, 49, 62, 62, 115, 116, + 114, 101, 97, 109, 13, 10, 120, 156, 19, 96, 192, 15, 0, 2, 32, 0, 17, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 51, 48, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 50, 55, 51, 50, 47, 76, + 101, 110, 103, 116, 104, 49, 32, 56, 51, 56, 52, 52, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 72, 137, 236, 148, 123, 112, 19, 215, 21, 135, 127, 251, 146, 136, 180, 139, 37, 33, + 63, 0, 75, 187, 146, 89, 165, 70, 60, 140, 109, 12, 162, 42, 108, 194, 99, 50, 45, 20, 79, + 128, 4, 3, 126, 16, 27, 99, 252, 192, 230, 17, 2, 153, 16, 60, 196, 1, 2, 132, 113, 66, 160, + 129, 16, 198, 38, 80, 72, 38, 129, 64, 13, 168, 166, 33, 116, 234, 152, 196, 193, 132, 0, + 165, 105, 165, 202, 110, 161, 46, 32, 12, 132, 186, 116, 50, 178, 173, 222, 53, 140, 39, + 157, 76, 38, 249, 163, 127, 222, 149, 191, 187, 231, 220, 61, 199, 218, 251, 237, 93, 129, + 1, 32, 161, 26, 28, 178, 103, 206, 26, 157, 110, 73, 207, 93, 1, 148, 117, 147, 217, 130, + 194, 138, 133, 85, 235, 175, 158, 31, 13, 248, 102, 3, 174, 189, 133, 171, 86, 42, 245, 201, + 127, 138, 0, 229, 11, 0, 195, 236, 226, 170, 197, 21, 231, 214, 228, 236, 6, 150, 127, 72, + 242, 165, 139, 203, 215, 20, 255, 241, 249, 249, 243, 72, 111, 8, 224, 234, 74, 22, 45, 44, + 186, 98, 255, 197, 68, 96, 141, 66, 230, 178, 74, 200, 132, 45, 35, 190, 151, 228, 115, 73, + 62, 172, 164, 98, 229, 234, 251, 121, 177, 40, 201, 95, 0, 50, 47, 151, 87, 22, 46, 196, + 232, 237, 159, 2, 188, 158, 127, 85, 177, 112, 117, 149, 109, 186, 208, 6, 28, 206, 38, 245, + 202, 210, 133, 21, 139, 118, 38, 30, 212, 128, 121, 93, 128, 85, 168, 170, 92, 177, 114, + 250, 93, 233, 19, 114, 189, 10, 120, 117, 86, 213, 242, 69, 85, 234, 149, 25, 31, 131, 249, + 105, 19, 96, 62, 13, 86, 95, 156, 64, 62, 100, 117, 70, 178, 2, 171, 203, 170, 146, 129, 1, + 143, 110, 133, 59, 211, 173, 9, 136, 66, 225, 207, 0, 12, 26, 201, 176, 17, 173, 164, 82, + 213, 146, 88, 63, 76, 172, 63, 31, 149, 88, 135, 35, 224, 235, 200, 245, 58, 190, 254, 205, + 36, 175, 229, 126, 110, 110, 39, 38, 117, 142, 73, 203, 24, 155, 17, 223, 216, 218, 218, + 170, 247, 62, 21, 235, 224, 19, 132, 51, 240, 50, 57, 71, 89, 118, 242, 236, 185, 154, 121, + 112, 146, 38, 73, 236, 156, 164, 100, 48, 129, 216, 25, 205, 43, 146, 132, 73, 77, 49, 73, + 113, 98, 156, 211, 100, 74, 141, 119, 38, 243, 206, 212, 100, 33, 85, 74, 145, 196, 164, + 193, 12, 108, 138, 69, 20, 217, 57, 138, 209, 19, 136, 93, 111, 208, 203, 61, 163, 189, 173, + 250, 159, 254, 129, 205, 55, 105, 146, 165, 211, 210, 105, 243, 141, 238, 108, 182, 52, 219, + 124, 150, 38, 111, 186, 206, 152, 180, 161, 218, 79, 4, 41, 65, 154, 42, 109, 144, 248, 169, + 214, 167, 173, 171, 134, 114, 79, 38, 148, 91, 74, 237, 69, 9, 207, 74, 107, 236, 27, 164, + 205, 246, 87, 134, 30, 144, 76, 130, 194, 5, 98, 237, 154, 217, 44, 74, 3, 121, 35, 67, 190, + 151, 9, 176, 251, 127, 163, 145, 5, 156, 98, 146, 144, 10, 137, 25, 219, 32, 138, 241, 124, + 82, 35, 187, 31, 131, 217, 18, 237, 81, 114, 151, 2, 185, 77, 201, 182, 34, 95, 169, 84, 88, + 37, 73, 146, 12, 115, 148, 106, 227, 10, 143, 230, 74, 201, 76, 243, 48, 240, 88, 60, 44, + 185, 227, 174, 147, 250, 21, 79, 237, 200, 164, 0, 51, 254, 216, 224, 75, 76, 35, 51, 30, + 32, 11, 55, 147, 58, 5, 26, 88, 212, 142, 8, 48, 175, 31, 221, 210, 231, 208, 219, 217, 213, + 105, 185, 239, 205, 93, 70, 2, 111, 159, 208, 73, 157, 61, 215, 172, 250, 226, 44, 61, 185, + 122, 192, 88, 109, 137, 190, 49, 105, 204, 248, 241, 76, 46, 114, 153, 101, 57, 131, 198, + 37, 36, 100, 164, 103, 141, 205, 244, 164, 184, 141, 227, 250, 67, 131, 241, 209, 172, 172, + 140, 244, 132, 132, 120, 187, 193, 168, 143, 72, 113, 123, 158, 106, 144, 119, 148, 173, 59, + 178, 111, 109, 198, 116, 187, 205, 188, 34, 176, 161, 116, 201, 86, 123, 131, 235, 230, 225, + 213, 45, 101, 197, 69, 235, 107, 123, 175, 95, 249, 125, 140, 121, 41, 105, 215, 198, 15, + 215, 191, 80, 111, 223, 203, 174, 94, 91, 184, 190, 166, 70, 57, 126, 118, 241, 177, 162, + 252, 61, 163, 156, 31, 109, 59, 211, 251, 239, 14, 114, 211, 67, 200, 94, 180, 8, 141, 48, + 17, 57, 30, 45, 203, 54, 87, 44, 17, 119, 139, 239, 138, 159, 137, 194, 116, 110, 186, 244, + 6, 207, 217, 24, 118, 0, 68, 3, 103, 20, 76, 102, 206, 8, 81, 148, 164, 22, 142, 183, 115, + 28, 207, 73, 96, 69, 137, 55, 114, 167, 216, 83, 24, 64, 54, 99, 157, 102, 2, 207, 147, 18, + 180, 152, 248, 0, 91, 124, 82, 16, 76, 154, 67, 206, 52, 145, 199, 210, 96, 177, 176, 115, + 72, 208, 209, 160, 111, 27, 18, 220, 110, 208, 141, 154, 2, 204, 56, 77, 50, 106, 238, 148, + 76, 99, 181, 107, 172, 177, 54, 142, 213, 183, 147, 89, 178, 103, 130, 181, 176, 10, 203, + 177, 122, 179, 222, 67, 130, 107, 39, 244, 30, 246, 248, 192, 0, 179, 181, 207, 244, 45, + 175, 55, 151, 248, 246, 122, 187, 188, 228, 240, 91, 58, 44, 61, 126, 144, 141, 212, 229, + 191, 239, 183, 250, 116, 201, 62, 223, 198, 81, 94, 126, 173, 165, 41, 46, 46, 142, 232, + 158, 188, 96, 238, 111, 33, 197, 194, 199, 108, 62, 41, 16, 187, 172, 153, 51, 124, 156, + 123, 164, 143, 227, 29, 14, 191, 254, 47, 114, 200, 195, 32, 53, 154, 93, 212, 204, 62, 177, + 58, 219, 39, 106, 30, 159, 232, 78, 38, 231, 145, 62, 111, 95, 5, 121, 193, 198, 50, 25, + 214, 140, 248, 20, 43, 103, 101, 216, 157, 61, 53, 236, 219, 219, 155, 155, 27, 122, 199, + 50, 249, 7, 184, 19, 221, 63, 63, 208, 91, 207, 242, 236, 142, 158, 50, 60, 56, 134, 255, + 31, 40, 254, 46, 172, 166, 255, 6, 81, 40, 20, 10, 133, 66, 161, 80, 40, 20, 10, 133, 66, + 161, 80, 40, 20, 10, 133, 66, 161, 80, 40, 20, 10, 133, 66, 161, 80, 40, 20, 10, 133, 66, + 161, 80, 40, 20, 10, 133, 66, 161, 80, 40, 20, 202, 255, 2, 238, 33, 201, 96, 200, 8, 203, + 60, 146, 145, 200, 90, 0, 222, 50, 17, 96, 50, 73, 98, 68, 38, 94, 100, 98, 172, 194, 230, + 176, 31, 112, 41, 220, 76, 174, 146, 123, 150, 123, 145, 219, 204, 109, 229, 234, 185, 243, + 220, 125, 94, 226, 103, 242, 27, 132, 65, 194, 89, 225, 166, 208, 101, 224, 12, 241, 134, + 161, 6, 217, 48, 193, 144, 103, 136, 25, 43, 28, 165, 142, 50, 199, 31, 28, 45, 142, 152, + 115, 157, 243, 45, 231, 215, 206, 111, 228, 120, 217, 33, 79, 149, 103, 200, 79, 203, 57, + 242, 124, 57, 87, 94, 43, 55, 200, 77, 242, 37, 57, 40, 223, 145, 187, 228, 94, 37, 78, 113, + 43, 30, 101, 148, 146, 166, 100, 42, 19, 20, 191, 50, 81, 153, 162, 228, 41, 149, 202, 58, + 229, 13, 229, 184, 75, 112, 13, 114, 37, 186, 220, 46, 143, 107, 148, 235, 151, 174, 217, + 174, 60, 87, 141, 107, 135, 235, 144, 155, 117, 27, 220, 113, 110, 155, 59, 222, 61, 196, + 45, 187, 83, 221, 94, 247, 19, 238, 133, 238, 69, 41, 108, 138, 37, 197, 165, 66, 101, 85, + 81, 181, 168, 118, 53, 73, 77, 86, 135, 169, 35, 212, 76, 213, 175, 150, 171, 213, 106, 141, + 186, 73, 221, 170, 110, 87, 235, 213, 247, 213, 99, 106, 163, 250, 59, 181, 73, 61, 167, + 126, 161, 254, 89, 237, 240, 248, 61, 154, 231, 113, 79, 129, 167, 208, 83, 236, 41, 243, + 84, 142, 40, 31, 241, 220, 168, 196, 131, 67, 14, 186, 162, 108, 52, 43, 234, 143, 78, 140, + 62, 22, 157, 18, 61, 26, 189, 17, 141, 117, 63, 211, 51, 169, 231, 94, 79, 119, 111, 74, + 111, 119, 172, 59, 22, 35, 58, 21, 212, 177, 96, 93, 236, 60, 246, 48, 55, 140, 203, 230, + 86, 114, 207, 115, 53, 196, 218, 54, 238, 29, 238, 2, 247, 31, 126, 32, 159, 205, 111, 18, + 94, 19, 46, 8, 119, 13, 48, 152, 137, 53, 167, 193, 101, 208, 12, 5, 198, 108, 7, 136, 181, + 114, 71, 147, 163, 215, 9, 103, 181, 179, 206, 121, 79, 134, 156, 36, 43, 242, 19, 114, 246, + 67, 107, 249, 114, 181, 124, 66, 110, 150, 175, 200, 127, 149, 239, 201, 247, 21, 40, 54, + 98, 109, 56, 177, 150, 174, 248, 250, 173, 149, 18, 107, 181, 74, 93, 159, 181, 132, 135, + 214, 102, 184, 102, 185, 230, 19, 107, 181, 253, 214, 172, 196, 218, 96, 183, 243, 161, 181, + 2, 119, 81, 159, 53, 229, 123, 172, 101, 247, 91, 171, 85, 235, 212, 247, 250, 173, 181, 16, + 107, 95, 17, 107, 19, 250, 173, 45, 242, 148, 18, 107, 5, 35, 86, 18, 107, 137, 7, 149, 40, + 19, 117, 68, 199, 19, 107, 90, 116, 114, 116, 90, 244, 82, 180, 187, 59, 175, 103, 98, 159, + 53, 165, 183, 90, 183, 22, 187, 10, 240, 119, 8, 23, 1, 225, 103, 132, 84, 125, 95, 246, 46, + 209, 71, 254, 2, 137, 134, 163, 239, 232, 190, 208, 253, 185, 80, 79, 206, 23, 209, 127, + 220, 206, 2, 238, 240, 119, 102, 0, 145, 117, 64, 7, 79, 206, 241, 145, 65, 17, 107, 36, 46, + 34, 69, 196, 136, 57, 98, 138, 60, 18, 49, 70, 12, 17, 33, 194, 69, 216, 8, 110, 234, 207, + 8, 237, 47, 19, 118, 16, 106, 218, 191, 249, 219, 161, 246, 231, 110, 149, 146, 248, 228, + 45, 31, 25, 55, 183, 175, 5, 218, 74, 219, 214, 180, 55, 70, 90, 175, 142, 104, 223, 22, + 121, 179, 237, 80, 219, 206, 240, 206, 240, 190, 240, 22, 32, 252, 107, 189, 191, 45, 49, + 188, 44, 156, 79, 178, 180, 176, 22, 206, 8, 15, 11, 77, 11, 77, 13, 249, 67, 190, 80, 86, + 40, 35, 148, 22, 74, 13, 185, 67, 67, 67, 246, 16, 19, 188, 29, 140, 4, 175, 7, 255, 17, + 252, 187, 222, 21, 108, 14, 126, 28, 60, 29, 60, 73, 162, 79, 130, 7, 130, 71, 130, 83, 131, + 143, 7, 31, 11, 14, 11, 186, 131, 174, 160, 243, 218, 174, 246, 143, 218, 79, 132, 79, 21, + 39, 22, 219, 132, 211, 228, 21, 220, 99, 124, 203, 184, 219, 184, 235, 193, 58, 13, 55, 12, + 19, 165, 191, 72, 95, 138, 55, 5, 112, 133, 250, 251, 202, 164, 147, 215, 248, 54, 49, 180, + 128, 24, 155, 66, 168, 22, 54, 145, 241, 117, 33, 64, 170, 69, 66, 150, 97, 159, 49, 240, + 160, 123, 128, 147, 144, 54, 32, 125, 64, 209, 128, 186, 71, 194, 128, 41, 65, 159, 53, 217, + 30, 50, 13, 63, 112, 152, 50, 77, 79, 146, 177, 138, 176, 234, 91, 179, 85, 125, 99, 223, + 140, 105, 207, 247, 246, 110, 208, 49, 109, 122, 152, 213, 252, 208, 119, 125, 171, 115, + 129, 41, 175, 63, 158, 247, 35, 234, 253, 253, 81, 177, 217, 111, 46, 249, 78, 1, 135, 119, + 80, 131, 151, 185, 60, 236, 68, 7, 54, 96, 27, 182, 224, 109, 188, 139, 253, 176, 96, 51, + 81, 250, 18, 182, 227, 46, 190, 198, 171, 248, 21, 54, 49, 12, 66, 184, 131, 189, 120, 15, + 255, 194, 61, 116, 97, 31, 222, 199, 167, 104, 198, 7, 120, 6, 133, 168, 69, 17, 90, 176, 8, + 103, 241, 25, 206, 227, 115, 156, 67, 43, 254, 137, 98, 124, 137, 47, 112, 1, 135, 177, 24, + 183, 241, 26, 46, 227, 34, 46, 161, 4, 55, 16, 193, 43, 40, 197, 18, 148, 161, 2, 229, 88, + 138, 58, 84, 98, 25, 170, 176, 252, 191, 12, 215, 103, 159, 21, 212, 17, 199, 241, 51, 115, + 238, 204, 153, 225, 220, 75, 219, 93, 150, 5, 182, 176, 29, 88, 58, 40, 150, 16, 131, 244, + 222, 81, 84, 52, 38, 49, 9, 150, 36, 138, 152, 160, 34, 189, 119, 88, 122, 239, 125, 233, 8, + 136, 136, 136, 244, 46, 189, 119, 132, 165, 151, 101, 217, 150, 251, 2, 230, 225, 252, 63, + 223, 159, 249, 194, 124, 105, 122, 152, 158, 230, 43, 115, 203, 252, 215, 244, 50, 255, 51, + 95, 155, 111, 205, 55, 102, 163, 153, 99, 190, 51, 189, 77, 31, 211, 215, 220, 54, 217, 102, + 19, 76, 132, 73, 128, 96, 33, 0, 100, 242, 76, 62, 76, 134, 41, 48, 21, 166, 153, 2, 83, 8, + 12, 14, 196, 20, 193, 116, 152, 1, 51, 97, 22, 204, 134, 57, 160, 80, 12, 60, 4, 97, 46, + 204, 51, 207, 76, 14, 204, 135, 5, 176, 16, 22, 193, 98, 88, 2, 75, 97, 25, 44, 135, 21, + 176, 18, 178, 96, 21, 172, 134, 53, 176, 214, 60, 55, 199, 97, 24, 12, 135, 117, 176, 30, + 54, 192, 70, 248, 30, 66, 80, 28, 54, 193, 102, 40, 1, 37, 161, 20, 148, 54, 151, 204, 101, + 136, 128, 72, 216, 2, 63, 64, 20, 148, 129, 17, 176, 21, 126, 132, 109, 240, 19, 108, 135, + 159, 33, 26, 202, 154, 44, 179, 10, 98, 160, 28, 236, 128, 95, 160, 60, 84, 128, 88, 136, + 131, 157, 240, 171, 201, 53, 47, 204, 21, 115, 21, 226, 33, 1, 42, 66, 34, 236, 130, 221, + 176, 7, 246, 194, 62, 216, 15, 7, 224, 32, 36, 65, 50, 164, 64, 42, 28, 130, 195, 112, 4, + 142, 194, 49, 248, 205, 108, 134, 52, 72, 135, 74, 80, 217, 92, 51, 215, 225, 56, 15, 227, + 225, 60, 130, 71, 242, 40, 30, 205, 99, 120, 44, 143, 227, 241, 60, 129, 51, 121, 34, 79, + 226, 201, 148, 204, 83, 120, 170, 89, 200, 211, 120, 58, 207, 224, 153, 60, 139, 103, 243, + 28, 158, 203, 243, 120, 62, 47, 224, 133, 188, 40, 208, 61, 240, 49, 47, 230, 37, 188, 148, + 151, 241, 114, 94, 193, 43, 57, 139, 87, 241, 106, 94, 195, 107, 121, 93, 224, 147, 192, + 167, 188, 158, 55, 240, 70, 254, 158, 55, 241, 102, 222, 194, 63, 240, 86, 254, 145, 183, + 241, 79, 188, 157, 127, 230, 29, 252, 11, 239, 228, 95, 121, 23, 239, 230, 61, 188, 151, + 247, 241, 126, 62, 192, 7, 249, 16, 31, 14, 228, 7, 10, 2, 133, 129, 34, 50, 4, 132, 100, + 41, 64, 68, 76, 142, 132, 148, 138, 145, 231, 35, 124, 148, 143, 241, 113, 62, 193, 39, 249, + 20, 159, 230, 51, 124, 150, 207, 241, 121, 190, 192, 23, 249, 18, 95, 230, 43, 124, 149, + 175, 241, 117, 190, 193, 55, 249, 86, 248, 215, 111, 243, 29, 206, 230, 187, 124, 15, 78, + 192, 73, 56, 5, 167, 225, 12, 156, 245, 165, 93, 73, 87, 202, 149, 118, 17, 46, 210, 69, + 185, 50, 46, 218, 149, 117, 49, 174, 188, 171, 224, 98, 93, 156, 139, 119, 9, 174, 162, 75, + 244, 17, 62, 210, 71, 249, 18, 254, 162, 191, 228, 47, 251, 43, 254, 170, 191, 230, 175, + 251, 27, 254, 166, 191, 21, 124, 26, 124, 22, 204, 9, 62, 15, 230, 6, 95, 4, 243, 130, 249, + 193, 130, 96, 97, 176, 40, 100, 66, 16, 66, 151, 228, 146, 93, 138, 75, 117, 105, 46, 221, + 85, 114, 149, 93, 21, 74, 241, 101, 124, 180, 235, 227, 250, 186, 126, 174, 191, 27, 224, 6, + 186, 65, 110, 176, 27, 226, 134, 186, 97, 110, 184, 27, 225, 70, 186, 81, 110, 180, 27, 227, + 198, 186, 113, 110, 188, 155, 224, 50, 205, 9, 115, 209, 77, 52, 167, 220, 36, 55, 217, 77, + 9, 175, 215, 180, 240, 138, 205, 112, 51, 221, 44, 55, 219, 205, 113, 115, 221, 60, 55, 223, + 156, 54, 103, 204, 89, 115, 193, 156, 52, 231, 221, 2, 183, 208, 45, 114, 139, 221, 18, 183, + 212, 45, 115, 203, 221, 10, 183, 210, 101, 185, 85, 110, 181, 91, 227, 214, 186, 117, 110, + 189, 47, 235, 99, 124, 57, 95, 222, 87, 240, 177, 62, 206, 199, 251, 4, 95, 209, 39, 250, + 36, 159, 236, 83, 124, 170, 79, 243, 233, 129, 113, 129, 241, 210, 32, 208, 75, 222, 148, + 134, 210, 72, 26, 75, 147, 64, 15, 105, 42, 205, 164, 185, 180, 144, 150, 210, 74, 90, 75, + 27, 105, 43, 237, 164, 189, 116, 144, 142, 210, 73, 58, 75, 23, 121, 75, 222, 150, 174, 242, + 142, 188, 43, 239, 73, 55, 121, 95, 62, 8, 100, 250, 74, 190, 178, 175, 226, 51, 124, 85, + 95, 205, 87, 247, 53, 252, 239, 254, 182, 191, 227, 179, 253, 93, 95, 211, 215, 242, 181, + 101, 164, 140, 146, 209, 50, 70, 198, 202, 56, 25, 47, 19, 36, 83, 38, 202, 36, 153, 44, 83, + 100, 170, 76, 147, 233, 50, 43, 100, 67, 129, 16, 153, 56, 184, 15, 15, 224, 33, 156, 131, + 71, 240, 24, 158, 192, 51, 200, 129, 231, 144, 11, 47, 160, 10, 228, 65, 62, 20, 64, 33, + 100, 132, 109, 101, 16, 16, 209, 98, 0, 9, 25, 29, 10, 42, 22, 131, 170, 232, 49, 136, 33, + 44, 142, 37, 176, 36, 150, 194, 210, 24, 129, 145, 80, 13, 163, 176, 12, 84, 135, 26, 24, + 141, 101, 49, 6, 203, 97, 121, 172, 128, 177, 24, 135, 241, 97, 163, 141, 8, 123, 35, 17, + 106, 66, 45, 76, 130, 218, 152, 140, 41, 152, 138, 105, 152, 142, 149, 176, 50, 86, 241, + 117, 124, 93, 127, 214, 159, 243, 231, 253, 61, 127, 223, 63, 240, 15, 101, 23, 102, 96, 85, + 172, 134, 213, 177, 6, 214, 196, 90, 88, 27, 235, 96, 93, 124, 9, 95, 150, 221, 178, 7, 123, + 225, 215, 248, 13, 126, 139, 189, 241, 59, 236, 131, 125, 177, 31, 246, 199, 1, 56, 80, 246, + 226, 32, 28, 44, 251, 100, 191, 28, 144, 131, 114, 72, 14, 203, 17, 57, 42, 199, 228, 55, + 57, 46, 39, 228, 164, 156, 146, 211, 114, 70, 206, 202, 57, 57, 47, 23, 228, 162, 92, 146, + 203, 114, 69, 174, 202, 53, 185, 46, 55, 228, 166, 220, 146, 219, 114, 71, 178, 229, 174, + 220, 147, 251, 242, 64, 30, 202, 35, 121, 44, 79, 228, 169, 60, 147, 28, 121, 46, 185, 242, + 2, 135, 224, 80, 42, 73, 165, 36, 79, 242, 169, 52, 69, 72, 129, 20, 82, 36, 69, 81, 25, + 138, 150, 34, 53, 10, 138, 84, 150, 98, 212, 106, 64, 73, 89, 157, 138, 170, 22, 83, 175, + 65, 42, 71, 229, 169, 2, 197, 82, 28, 197, 107, 72, 139, 107, 9, 45, 73, 9, 84, 145, 18, 41, + 73, 75, 105, 105, 141, 208, 72, 141, 210, 50, 26, 173, 101, 53, 70, 203, 105, 121, 173, 160, + 177, 26, 167, 241, 154, 160, 21, 53, 81, 147, 66, 172, 41, 154, 170, 105, 154, 174, 149, + 180, 178, 86, 209, 12, 74, 166, 20, 173, 170, 213, 180, 186, 214, 208, 154, 90, 75, 107, + 107, 29, 173, 171, 47, 233, 203, 90, 79, 95, 209, 87, 41, 149, 210, 244, 53, 125, 93, 255, + 160, 245, 245, 143, 250, 134, 254, 73, 27, 232, 155, 218, 80, 27, 105, 99, 255, 200, 63, + 214, 38, 218, 52, 228, 66, 18, 210, 80, 177, 144, 15, 5, 181, 153, 54, 215, 22, 218, 82, 91, + 105, 107, 109, 163, 109, 181, 157, 182, 215, 14, 218, 81, 59, 105, 103, 237, 162, 111, 133, + 66, 161, 226, 161, 18, 161, 146, 250, 182, 118, 213, 119, 244, 93, 125, 79, 187, 233, 251, + 250, 129, 254, 89, 63, 212, 191, 232, 95, 245, 111, 250, 145, 254, 93, 255, 161, 255, 244, + 79, 180, 187, 126, 172, 159, 232, 167, 250, 153, 254, 75, 255, 173, 255, 209, 207, 245, 11, + 237, 161, 95, 106, 79, 28, 137, 163, 112, 52, 142, 193, 177, 56, 14, 199, 227, 4, 204, 196, + 137, 254, 41, 78, 194, 201, 56, 5, 167, 226, 52, 156, 142, 51, 112, 38, 206, 210, 175, 252, + 51, 159, 227, 159, 251, 92, 204, 246, 11, 253, 2, 191, 200, 47, 246, 75, 252, 82, 191, 204, + 47, 167, 218, 254, 5, 222, 195, 251, 182, 175, 237, 111, 7, 218, 193, 118, 168, 29, 105, 71, + 219, 241, 54, 211, 78, 177, 51, 194, 13, 176, 192, 46, 177, 203, 236, 10, 155, 101, 87, 219, + 245, 118, 147, 221, 106, 183, 219, 157, 118, 143, 61, 128, 15, 236, 17, 123, 220, 158, 182, + 231, 237, 101, 123, 221, 254, 110, 239, 218, 251, 246, 33, 62, 196, 71, 248, 24, 159, 224, + 83, 124, 134, 57, 248, 156, 234, 209, 43, 244, 170, 95, 225, 87, 250, 44, 159, 231, 243, + 125, 129, 47, 244, 69, 65, 131, 185, 248, 2, 243, 48, 31, 11, 176, 16, 139, 172, 177, 96, + 209, 90, 27, 192, 108, 75, 148, 78, 25, 244, 26, 189, 78, 245, 233, 141, 240, 117, 3, 106, + 72, 141, 169, 41, 53, 167, 214, 212, 158, 58, 83, 87, 27, 79, 221, 232, 67, 250, 136, 186, + 211, 103, 244, 57, 245, 180, 105, 212, 139, 122, 135, 93, 212, 143, 6, 208, 32, 26, 66, 195, + 104, 4, 141, 162, 49, 97, 35, 77, 160, 137, 52, 153, 166, 210, 116, 91, 133, 102, 210, 108, + 154, 79, 139, 105, 57, 173, 162, 117, 180, 129, 54, 211, 22, 218, 70, 59, 194, 101, 179, + 143, 14, 209, 17, 91, 149, 142, 209, 73, 58, 75, 23, 233, 170, 173, 73, 55, 233, 14, 221, + 167, 199, 148, 67, 121, 84, 20, 238, 30, 23, 54, 124, 9, 46, 197, 17, 28, 109, 239, 112, 12, + 199, 134, 43, 40, 33, 44, 250, 68, 78, 230, 84, 78, 231, 202, 156, 193, 213, 184, 134, 173, + 203, 181, 184, 14, 215, 11, 23, 82, 253, 176, 246, 27, 112, 67, 43, 220, 136, 27, 115, 19, + 110, 202, 205, 184, 57, 183, 224, 150, 220, 138, 91, 115, 27, 110, 203, 237, 184, 61, 119, + 224, 142, 220, 137, 59, 115, 23, 254, 63, 227, 101, 2, 21, 197, 145, 6, 224, 255, 175, 154, + 110, 160, 171, 145, 75, 196, 107, 166, 123, 6, 123, 20, 69, 131, 74, 136, 26, 196, 219, 117, + 55, 30, 120, 197, 51, 136, 138, 68, 17, 131, 70, 148, 104, 84, 72, 130, 138, 160, 198, 35, + 158, 81, 131, 247, 17, 239, 251, 62, 34, 160, 34, 114, 170, 137, 206, 56, 140, 183, 50, 70, + 19, 99, 52, 102, 16, 82, 131, 46, 155, 183, 251, 242, 178, 253, 222, 95, 93, 221, 93, 245, + 250, 213, 215, 95, 85, 245, 63, 80, 28, 36, 14, 230, 79, 134, 176, 61, 108, 223, 191, 249, + 80, 137, 50, 42, 191, 230, 35, 14, 21, 163, 197, 24, 113, 180, 56, 134, 29, 144, 137, 44, + 202, 146, 92, 67, 246, 149, 107, 201, 117, 101, 131, 108, 146, 205, 114, 35, 185, 177, 28, + 44, 135, 200, 161, 114, 43, 57, 92, 110, 47, 119, 150, 187, 201, 221, 229, 72, 185, 159, 60, + 80, 30, 42, 71, 203, 49, 242, 104, 57, 78, 142, 103, 54, 207, 218, 158, 117, 240, 6, 218, + 176, 20, 237, 120, 19, 111, 121, 84, 74, 32, 161, 68, 36, 42, 233, 36, 65, 18, 37, 55, 201, + 93, 242, 144, 36, 137, 73, 178, 228, 41, 213, 144, 188, 36, 111, 201, 71, 242, 149, 252, + 164, 154, 120, 27, 239, 232, 158, 235, 94, 232, 126, 211, 189, 212, 253, 174, 115, 178, 124, + 86, 192, 10, 89, 17, 43, 102, 37, 236, 50, 187, 194, 174, 178, 239, 217, 15, 236, 26, 121, + 64, 30, 146, 50, 226, 96, 217, 176, 7, 246, 146, 116, 49, 27, 67, 225, 0, 28, 132, 179, 120, + 23, 246, 193, 126, 200, 98, 57, 240, 57, 156, 129, 217, 180, 39, 207, 59, 251, 240, 28, 170, + 55, 206, 195, 249, 236, 28, 237, 79, 223, 167, 3, 232, 64, 218, 151, 246, 147, 42, 164, 74, + 6, 240, 43, 222, 103, 200, 8, 190, 195, 40, 211, 145, 211, 186, 25, 112, 156, 241, 237, 150, + 185, 49, 111, 230, 35, 231, 203, 5, 114, 161, 92, 68, 50, 216, 117, 88, 1, 63, 194, 119, + 176, 17, 22, 97, 59, 248, 18, 59, 224, 100, 92, 136, 139, 112, 49, 38, 193, 97, 156, 198, + 60, 196, 68, 113, 146, 152, 68, 114, 216, 17, 118, 148, 29, 99, 199, 217, 9, 118, 146, 157, + 98, 167, 217, 25, 114, 142, 156, 39, 23, 72, 46, 185, 72, 242, 200, 37, 146, 79, 10, 72, 33, + 41, 34, 197, 164, 132, 216, 72, 41, 177, 147, 155, 228, 22, 185, 77, 238, 144, 187, 228, 30, + 185, 207, 237, 108, 203, 109, 236, 43, 244, 19, 250, 83, 133, 170, 212, 72, 77, 220, 201, + 145, 66, 140, 48, 138, 123, 218, 75, 136, 20, 122, 115, 75, 135, 9, 209, 194, 112, 110, 238, + 123, 66, 119, 161, 7, 119, 45, 75, 200, 22, 114, 184, 111, 121, 194, 37, 33, 159, 187, 59, + 81, 72, 20, 38, 113, 139, 19, 132, 241, 194, 4, 218, 144, 54, 162, 65, 180, 49, 183, 249, + 83, 97, 154, 48, 157, 155, 60, 135, 251, 60, 155, 251, 156, 193, 253, 78, 166, 77, 104, 48, + 183, 122, 33, 109, 74, 155, 209, 183, 104, 8, 109, 78, 91, 208, 150, 52, 148, 91, 250, 76, + 248, 85, 120, 206, 141, 125, 36, 252, 40, 60, 230, 158, 122, 115, 83, 125, 93, 239, 228, + 158, 26, 196, 56, 238, 234, 88, 49, 158, 58, 104, 25, 143, 71, 220, 203, 14, 220, 204, 78, + 220, 116, 187, 112, 83, 184, 197, 237, 13, 226, 14, 55, 228, 14, 55, 17, 186, 138, 33, 98, + 115, 238, 180, 198, 125, 110, 202, 45, 126, 87, 12, 23, 219, 10, 65, 66, 16, 125, 155, 134, + 209, 95, 232, 51, 158, 145, 136, 224, 74, 76, 170, 14, 190, 181, 1, 144, 255, 250, 255, 230, + 15, 169, 78, 16, 221, 220, 61, 36, 38, 123, 214, 240, 242, 246, 241, 245, 171, 233, 95, 43, + 160, 118, 157, 186, 245, 234, 235, 13, 138, 106, 52, 5, 54, 208, 204, 13, 27, 5, 53, 110, + 18, 220, 180, 217, 91, 33, 205, 91, 180, 12, 125, 59, 236, 157, 86, 173, 219, 188, 27, 222, + 54, 162, 93, 251, 14, 29, 59, 117, 238, 210, 245, 31, 221, 254, 249, 175, 247, 186, 247, + 232, 217, 43, 178, 119, 159, 190, 253, 250, 191, 63, 96, 224, 160, 193, 67, 134, 126, 16, + 53, 44, 122, 56, 140, 24, 25, 51, 42, 246, 195, 209, 99, 226, 198, 198, 143, 251, 40, 97, + 252, 132, 143, 39, 38, 78, 154, 156, 244, 201, 148, 169, 159, 78, 155, 62, 35, 57, 229, 179, + 207, 191, 72, 157, 57, 107, 118, 218, 156, 244, 140, 185, 243, 230, 127, 185, 96, 225, 162, + 197, 95, 45, 89, 186, 108, 249, 138, 149, 176, 106, 245, 154, 111, 50, 215, 174, 91, 191, + 97, 227, 166, 205, 91, 182, 110, 251, 150, 110, 223, 177, 115, 215, 238, 61, 123, 247, 237, + 63, 112, 240, 208, 225, 35, 71, 143, 29, 63, 113, 242, 212, 233, 51, 112, 54, 43, 59, 231, + 220, 249, 11, 185, 23, 243, 46, 229, 23, 20, 66, 81, 113, 201, 229, 43, 87, 191, 135, 107, + 215, 45, 214, 27, 182, 82, 208, 121, 71, 240, 129, 134, 242, 161, 186, 65, 40, 204, 224, + 251, 188, 74, 6, 145, 29, 52, 144, 187, 156, 64, 39, 209, 25, 52, 157, 206, 229, 235, 103, + 62, 125, 174, 243, 212, 245, 210, 205, 18, 252, 248, 74, 83, 38, 60, 227, 107, 137, 191, 88, + 143, 127, 145, 54, 98, 148, 88, 233, 54, 78, 31, 167, 31, 171, 63, 171, 207, 213, 87, 26, + 146, 13, 95, 27, 126, 54, 188, 84, 252, 21, 189, 210, 69, 233, 161, 12, 80, 6, 41, 67, 148, + 15, 148, 233, 202, 126, 37, 75, 41, 81, 44, 202, 19, 229, 153, 82, 161, 122, 169, 38, 213, + 172, 54, 83, 67, 212, 80, 181, 141, 26, 174, 70, 168, 157, 213, 40, 53, 65, 77, 86, 191, 82, + 15, 24, 5, 163, 159, 49, 192, 104, 50, 154, 141, 205, 140, 61, 141, 253, 140, 81, 198, 84, + 227, 18, 227, 22, 19, 49, 137, 38, 47, 147, 175, 201, 223, 84, 215, 164, 152, 130, 76, 77, + 76, 221, 76, 195, 77, 163, 2, 73, 160, 119, 160, 81, 3, 141, 104, 178, 230, 173, 213, 212, + 106, 107, 245, 181, 6, 90, 176, 22, 170, 133, 107, 241, 90, 138, 150, 170, 165, 105, 115, + 181, 197, 218, 90, 109, 187, 182, 87, 59, 170, 29, 215, 178, 180, 60, 173, 64, 187, 166, + 221, 51, 135, 155, 219, 155, 59, 154, 163, 205, 35, 205, 177, 230, 177, 230, 132, 224, 248, + 224, 164, 102, 1, 155, 235, 110, 54, 58, 137, 51, 204, 25, 238, 140, 112, 118, 112, 118, + 118, 238, 113, 62, 116, 86, 150, 143, 120, 213, 238, 213, 211, 87, 229, 21, 129, 21, 229, + 149, 229, 149, 149, 220, 19, 21, 50, 249, 223, 145, 145, 12, 38, 59, 105, 3, 62, 255, 19, + 233, 84, 154, 202, 169, 205, 167, 235, 105, 33, 125, 161, 171, 161, 139, 212, 165, 9, 11, + 133, 66, 225, 39, 17, 248, 250, 91, 143, 187, 108, 228, 246, 70, 187, 69, 234, 129, 83, 139, + 215, 103, 233, 43, 12, 96, 72, 49, 100, 26, 158, 42, 160, 212, 86, 84, 165, 155, 18, 249, + 134, 218, 48, 37, 69, 57, 168, 228, 40, 87, 149, 27, 202, 83, 229, 185, 10, 170, 47, 167, + 214, 152, 83, 107, 161, 182, 174, 166, 22, 199, 169, 45, 80, 51, 171, 168, 213, 122, 67, + 173, 135, 177, 175, 113, 8, 167, 182, 160, 154, 154, 15, 167, 86, 199, 100, 120, 67, 45, + 218, 20, 83, 69, 77, 253, 11, 106, 145, 213, 212, 22, 104, 153, 218, 182, 106, 106, 185, + 156, 218, 15, 156, 90, 155, 106, 106, 163, 204, 113, 156, 90, 116, 112, 34, 167, 22, 176, + 89, 117, 162, 83, 239, 108, 197, 169, 181, 119, 118, 114, 118, 117, 150, 56, 203, 203, 163, + 94, 69, 84, 81, 83, 43, 82, 92, 212, 42, 111, 3, 232, 158, 240, 40, 6, 16, 218, 242, 8, 114, + 77, 184, 138, 49, 174, 82, 87, 200, 107, 141, 95, 79, 193, 242, 194, 242, 139, 194, 90, 126, + 46, 254, 207, 180, 124, 28, 6, 240, 68, 247, 164, 7, 128, 35, 25, 224, 158, 142, 159, 253, + 29, 126, 14, 31, 135, 151, 195, 211, 33, 59, 152, 67, 114, 120, 56, 220, 28, 162, 67, 112, + 80, 7, 113, 64, 153, 235, 27, 129, 125, 38, 143, 37, 60, 82, 237, 47, 111, 110, 177, 39, 61, + 138, 227, 245, 67, 143, 90, 243, 50, 221, 62, 29, 160, 52, 174, 116, 138, 253, 168, 227, + 210, 237, 96, 251, 124, 199, 242, 210, 45, 165, 75, 109, 75, 109, 235, 108, 25, 0, 182, 77, + 174, 254, 165, 1, 182, 9, 182, 97, 252, 42, 196, 214, 222, 214, 210, 214, 192, 218, 213, + 218, 197, 26, 110, 109, 109, 13, 179, 182, 180, 134, 88, 131, 172, 38, 107, 61, 107, 77, 43, + 90, 30, 91, 28, 150, 7, 150, 187, 150, 91, 174, 94, 150, 28, 203, 41, 203, 73, 203, 33, 94, + 203, 182, 108, 180, 236, 178, 116, 177, 116, 180, 116, 176, 52, 176, 152, 44, 70, 139, 225, + 206, 10, 251, 9, 251, 65, 219, 177, 216, 128, 88, 95, 225, 36, 159, 130, 171, 120, 6, 178, + 210, 109, 197, 235, 113, 242, 188, 42, 194, 243, 186, 103, 145, 92, 38, 0, 29, 233, 90, 141, + 176, 5, 95, 145, 30, 115, 66, 67, 57, 177, 206, 60, 82, 132, 52, 94, 46, 18, 14, 243, 214, + 50, 143, 48, 113, 157, 219, 225, 215, 189, 221, 13, 60, 66, 220, 91, 184, 199, 184, 103, + 122, 216, 0, 164, 90, 174, 187, 146, 239, 155, 232, 10, 127, 115, 72, 161, 82, 31, 94, 142, + 231, 49, 249, 79, 119, 199, 87, 149, 85, 119, 164, 85, 127, 217, 119, 150, 43, 164, 180, 55, + 87, 169, 127, 247, 174, 63, 245, 28, 42, 69, 85, 215, 7, 255, 31, 237, 195, 171, 107, 177, + 44, 156, 141, 254, 159, 6, 20, 214, 67, 42, 204, 164, 81, 176, 20, 238, 193, 44, 152, 15, + 25, 176, 26, 182, 194, 6, 240, 134, 116, 142, 244, 11, 88, 12, 63, 193, 207, 48, 15, 150, + 65, 26, 34, 88, 225, 9, 172, 129, 109, 240, 11, 60, 133, 103, 176, 14, 182, 195, 121, 200, + 129, 29, 48, 2, 70, 194, 2, 136, 129, 92, 24, 5, 231, 224, 2, 228, 195, 69, 200, 131, 75, + 112, 31, 98, 161, 8, 10, 160, 16, 118, 194, 135, 240, 24, 22, 194, 101, 40, 134, 18, 24, 13, + 15, 193, 1, 115, 32, 14, 198, 192, 88, 24, 7, 241, 240, 17, 100, 66, 2, 76, 128, 241, 240, + 49, 76, 132, 73, 144, 8, 147, 33, 9, 30, 192, 39, 48, 21, 166, 192, 167, 48, 29, 166, 193, + 33, 88, 11, 201, 48, 3, 82, 224, 51, 40, 131, 71, 112, 4, 151, 226, 50, 36, 72, 81, 135, 2, + 56, 161, 28, 151, 227, 10, 92, 137, 95, 195, 43, 168, 64, 17, 221, 208, 29, 42, 113, 21, + 174, 198, 53, 248, 13, 102, 226, 90, 244, 64, 9, 25, 202, 184, 14, 215, 195, 115, 120, 129, + 27, 112, 35, 110, 194, 205, 184, 5, 183, 226, 54, 252, 22, 183, 227, 14, 220, 137, 187, 112, + 55, 238, 193, 189, 184, 15, 126, 131, 43, 152, 142, 25, 184, 31, 15, 224, 65, 60, 132, 135, + 209, 19, 107, 224, 17, 60, 138, 94, 232, 141, 62, 232, 11, 118, 184, 137, 126, 88, 19, 143, + 225, 113, 244, 199, 90, 56, 23, 79, 224, 73, 60, 133, 167, 241, 12, 126, 135, 1, 88, 27, + 118, 193, 110, 172, 131, 117, 241, 44, 102, 97, 61, 172, 143, 122, 52, 96, 54, 230, 192, 75, + 248, 29, 110, 193, 109, 84, 80, 69, 35, 154, 240, 28, 158, 199, 11, 152, 139, 23, 49, 239, + 15, 154, 235, 59, 186, 203, 234, 12, 224, 248, 123, 159, 251, 222, 231, 62, 207, 251, 188, + 63, 18, 146, 64, 18, 70, 2, 9, 25, 36, 140, 0, 65, 112, 148, 82, 100, 239, 189, 85, 106, + 169, 69, 196, 14, 107, 237, 57, 182, 165, 178, 100, 8, 1, 18, 194, 94, 42, 123, 239, 86, + 212, 42, 85, 68, 84, 70, 88, 33, 132, 176, 195, 134, 48, 147, 64, 72, 210, 247, 28, 79, 255, + 190, 231, 254, 243, 156, 115, 159, 251, 253, 168, 67, 234, 176, 74, 84, 141, 84, 146, 74, + 86, 71, 212, 81, 149, 167, 142, 169, 227, 234, 132, 179, 87, 165, 168, 84, 213, 88, 165, 57, + 87, 156, 98, 117, 18, 103, 224, 71, 56, 19, 103, 97, 22, 206, 198, 57, 56, 23, 179, 49, 7, + 231, 97, 46, 206, 199, 5, 184, 208, 52, 194, 69, 184, 216, 89, 131, 75, 112, 41, 46, 195, + 229, 184, 2, 87, 226, 199, 248, 9, 126, 138, 171, 112, 53, 174, 193, 181, 238, 88, 247, 45, + 92, 135, 235, 113, 3, 110, 196, 77, 184, 25, 183, 224, 86, 220, 134, 219, 113, 7, 238, 196, + 93, 238, 56, 247, 109, 220, 141, 123, 240, 95, 248, 111, 252, 12, 247, 226, 231, 248, 5, + 126, 137, 255, 193, 175, 240, 107, 220, 135, 255, 197, 111, 240, 91, 220, 143, 223, 225, 1, + 252, 30, 15, 226, 15, 248, 35, 254, 132, 135, 240, 48, 30, 193, 163, 238, 51, 183, 210, 173, + 114, 171, 141, 99, 148, 1, 163, 141, 107, 140, 65, 99, 13, 25, 54, 94, 16, 117, 121, 120, + 12, 143, 227, 73, 60, 133, 249, 120, 26, 11, 240, 12, 22, 226, 89, 44, 194, 115, 120, 30, + 47, 224, 69, 188, 132, 151, 241, 10, 22, 227, 85, 188, 134, 215, 131, 183, 126, 19, 111, + 225, 109, 188, 131, 119, 213, 41, 149, 175, 78, 171, 2, 117, 70, 21, 74, 132, 13, 183, 53, + 109, 132, 141, 180, 81, 182, 150, 173, 109, 163, 109, 140, 141, 181, 117, 109, 61, 91, 223, + 198, 217, 120, 219, 192, 54, 180, 9, 18, 41, 81, 82, 75, 194, 228, 188, 92, 144, 139, 114, + 73, 46, 203, 21, 41, 150, 171, 114, 77, 174, 251, 143, 253, 82, 191, 204, 47, 247, 159, 248, + 79, 253, 10, 255, 153, 95, 233, 87, 249, 213, 33, 39, 164, 66, 96, 19, 109, 35, 155, 100, + 147, 109, 138, 77, 181, 141, 109, 154, 77, 55, 73, 82, 91, 162, 237, 7, 118, 130, 157, 104, + 39, 217, 201, 118, 138, 253, 208, 78, 181, 211, 236, 116, 59, 195, 126, 100, 103, 218, 89, + 54, 203, 206, 182, 115, 236, 92, 155, 109, 115, 236, 60, 155, 235, 156, 114, 206, 219, 249, + 206, 105, 187, 192, 46, 180, 139, 130, 237, 181, 36, 216, 98, 203, 236, 114, 187, 194, 174, + 180, 31, 219, 79, 236, 167, 118, 149, 83, 224, 156, 113, 10, 157, 115, 78, 190, 83, 100, 87, + 219, 53, 118, 173, 93, 103, 215, 219, 13, 118, 163, 221, 100, 55, 219, 45, 118, 171, 221, + 102, 183, 219, 29, 118, 167, 221, 101, 119, 75, 140, 196, 74, 29, 169, 43, 245, 164, 190, + 196, 73, 188, 52, 144, 134, 146, 32, 137, 210, 72, 146, 36, 89, 82, 36, 213, 205, 118, 115, + 168, 131, 251, 62, 189, 76, 29, 169, 19, 117, 166, 46, 238, 187, 212, 149, 186, 81, 119, + 234, 65, 61, 169, 23, 245, 166, 62, 212, 151, 250, 81, 127, 26, 64, 3, 105, 16, 13, 166, 33, + 52, 148, 134, 209, 112, 26, 65, 35, 233, 21, 122, 149, 94, 163, 81, 110, 174, 52, 150, 52, + 73, 151, 38, 210, 84, 154, 73, 115, 201, 144, 27, 114, 83, 110, 201, 109, 185, 35, 45, 164, + 165, 180, 162, 89, 148, 69, 179, 105, 14, 205, 165, 108, 202, 161, 121, 148, 75, 243, 105, + 1, 45, 164, 69, 180, 152, 150, 208, 82, 90, 17, 210, 33, 55, 100, 156, 56, 85, 162, 238, + 169, 251, 234, 172, 122, 160, 30, 170, 71, 170, 84, 149, 169, 114, 245, 68, 61, 85, 233, + 170, 66, 61, 83, 149, 170, 74, 53, 9, 218, 202, 129, 32, 52, 65, 131, 11, 6, 16, 44, 16, 48, + 120, 170, 41, 8, 248, 16, 130, 26, 16, 6, 225, 80, 19, 34, 32, 18, 162, 84, 51, 168, 5, 181, + 85, 115, 149, 1, 209, 16, 3, 177, 80, 7, 234, 66, 61, 168, 15, 113, 16, 31, 52, 218, 204, + 160, 55, 18, 84, 11, 213, 18, 18, 85, 43, 104, 4, 73, 144, 12, 41, 144, 10, 141, 33, 13, + 210, 37, 83, 90, 75, 161, 156, 149, 34, 185, 43, 37, 114, 79, 238, 211, 1, 104, 2, 77, 161, + 25, 52, 135, 12, 104, 1, 45, 161, 21, 100, 66, 107, 120, 14, 218, 208, 247, 116, 16, 222, + 135, 191, 193, 223, 225, 31, 48, 30, 254, 9, 31, 192, 4, 152, 8, 147, 96, 50, 76, 161, 31, + 224, 67, 152, 74, 63, 210, 79, 116, 136, 14, 211, 17, 58, 74, 121, 116, 140, 142, 211, 9, + 58, 73, 167, 40, 159, 78, 83, 1, 157, 161, 66, 58, 75, 69, 116, 142, 206, 211, 5, 186, 72, + 151, 232, 50, 93, 161, 98, 186, 74, 215, 232, 58, 221, 164, 91, 116, 155, 238, 208, 93, 42, + 161, 123, 116, 159, 30, 208, 67, 122, 68, 143, 169, 148, 202, 168, 156, 158, 208, 83, 152, + 6, 211, 77, 184, 169, 73, 21, 244, 204, 68, 152, 72, 170, 164, 42, 19, 101, 106, 153, 218, + 38, 154, 170, 217, 97, 197, 96, 98, 76, 44, 107, 118, 217, 48, 178, 101, 98, 102, 143, 133, + 125, 83, 199, 212, 53, 245, 76, 125, 19, 103, 226, 57, 196, 53, 56, 140, 195, 77, 3, 211, + 208, 36, 152, 68, 174, 201, 17, 28, 201, 81, 92, 139, 107, 115, 52, 199, 112, 44, 215, 225, + 186, 92, 143, 235, 115, 28, 199, 115, 3, 110, 200, 9, 156, 24, 66, 78, 226, 100, 78, 225, + 84, 110, 204, 105, 156, 206, 77, 76, 35, 147, 196, 77, 185, 25, 55, 231, 12, 110, 193, 45, + 185, 21, 103, 114, 107, 126, 142, 219, 112, 91, 126, 158, 95, 48, 201, 38, 133, 95, 228, + 151, 248, 23, 220, 142, 127, 201, 237, 249, 87, 220, 129, 95, 230, 142, 220, 137, 59, 203, + 3, 121, 200, 93, 184, 107, 200, 134, 40, 196, 33, 47, 36, 33, 159, 187, 113, 119, 238, 193, + 61, 185, 23, 247, 230, 62, 220, 151, 251, 113, 127, 30, 192, 3, 121, 16, 15, 230, 33, 60, + 52, 20, 10, 213, 8, 133, 133, 194, 121, 24, 15, 231, 17, 60, 146, 95, 225, 87, 249, 53, 30, + 197, 191, 230, 215, 249, 55, 60, 154, 127, 203, 111, 240, 239, 120, 12, 191, 41, 143, 120, + 44, 191, 197, 227, 248, 109, 254, 61, 255, 129, 255, 200, 127, 226, 119, 248, 207, 252, 46, + 255, 133, 223, 131, 89, 144, 5, 179, 97, 14, 204, 133, 108, 200, 129, 121, 144, 11, 243, + 229, 49, 44, 128, 133, 176, 8, 22, 195, 18, 88, 10, 203, 96, 57, 172, 224, 191, 74, 169, + 148, 73, 185, 60, 129, 219, 178, 70, 86, 203, 90, 89, 39, 235, 101, 131, 108, 148, 77, 166, + 149, 60, 133, 187, 80, 162, 39, 232, 73, 122, 138, 158, 170, 167, 235, 89, 122, 182, 206, + 209, 185, 122, 145, 94, 22, 24, 96, 181, 94, 175, 55, 234, 205, 122, 171, 222, 174, 119, + 235, 207, 244, 151, 122, 159, 222, 175, 15, 234, 67, 112, 79, 231, 233, 147, 186, 64, 23, + 233, 139, 186, 88, 223, 208, 119, 116, 137, 190, 15, 247, 225, 1, 60, 132, 71, 240, 24, 74, + 161, 12, 202, 77, 91, 243, 188, 121, 65, 54, 203, 22, 217, 42, 21, 242, 76, 42, 165, 74, + 170, 125, 7, 158, 192, 83, 168, 128, 103, 80, 9, 85, 80, 173, 29, 173, 52, 104, 173, 93, + 184, 173, 141, 73, 53, 77, 204, 139, 129, 82, 219, 153, 246, 193, 237, 14, 166, 163, 233, + 108, 186, 6, 18, 237, 29, 168, 117, 176, 25, 174, 227, 3, 157, 190, 110, 222, 48, 99, 3, + 125, 190, 99, 222, 211, 41, 129, 58, 199, 7, 93, 52, 209, 76, 14, 204, 57, 45, 48, 231, 76, + 147, 21, 104, 51, 219, 204, 51, 243, 205, 66, 179, 216, 44, 213, 233, 102, 185, 89, 105, 86, + 153, 117, 102, 147, 217, 102, 118, 153, 61, 102, 175, 249, 220, 124, 21, 184, 246, 64, 96, + 218, 35, 38, 79, 55, 53, 199, 77, 190, 41, 12, 100, 121, 89, 183, 48, 215, 2, 145, 150, 4, + 58, 45, 51, 21, 166, 58, 112, 143, 13, 26, 62, 44, 144, 105, 36, 70, 235, 91, 24, 27, 216, + 52, 30, 27, 4, 69, 159, 16, 120, 51, 57, 80, 104, 90, 96, 206, 102, 152, 161, 91, 99, 75, + 204, 196, 182, 129, 144, 218, 5, 181, 223, 1, 59, 106, 194, 78, 216, 25, 187, 96, 87, 236, + 134, 221, 177, 7, 246, 196, 94, 216, 27, 251, 96, 95, 236, 135, 253, 113, 0, 14, 196, 65, + 56, 24, 135, 224, 80, 28, 134, 195, 131, 147, 17, 178, 93, 118, 254, 127, 62, 218, 211, 162, + 253, 159, 231, 131, 35, 113, 20, 142, 198, 49, 248, 166, 236, 246, 193, 71, 223, 243, 107, + 248, 17, 126, 109, 191, 142, 31, 231, 39, 248, 201, 126, 170, 159, 230, 55, 241, 51, 252, + 76, 191, 173, 255, 146, 223, 222, 239, 232, 119, 245, 123, 250, 125, 253, 129, 254, 80, 127, + 164, 63, 202, 31, 237, 143, 241, 199, 250, 227, 228, 92, 40, 38, 20, 171, 138, 212, 57, 117, + 94, 93, 80, 23, 213, 37, 174, 246, 28, 79, 121, 224, 105, 207, 245, 140, 135, 158, 245, 200, + 99, 207, 243, 196, 243, 189, 144, 87, 195, 11, 243, 194, 189, 154, 94, 132, 23, 233, 69, + 169, 203, 234, 138, 91, 234, 150, 185, 229, 238, 19, 247, 169, 91, 33, 135, 229, 136, 28, + 149, 60, 57, 38, 199, 229, 132, 156, 148, 83, 146, 47, 167, 165, 0, 174, 195, 13, 184, 9, + 183, 100, 191, 179, 221, 217, 1, 51, 112, 191, 202, 116, 118, 59, 123, 156, 111, 84, 177, + 179, 211, 217, 229, 124, 43, 223, 57, 19, 157, 125, 206, 84, 221, 59, 112, 103, 255, 192, + 80, 253, 212, 44, 149, 37, 7, 244, 32, 61, 88, 15, 209, 67, 245, 0, 61, 208, 171, 242, 170, + 197, 113, 30, 171, 107, 162, 4, 84, 27, 209, 226, 194, 215, 238, 120, 231, 11, 9, 190, 91, + 177, 18, 46, 53, 253, 255, 177, 95, 237, 193, 85, 84, 119, 248, 119, 206, 217, 115, 115, + 195, 77, 82, 6, 173, 2, 86, 61, 96, 171, 4, 36, 36, 177, 88, 30, 90, 137, 177, 58, 142, 68, + 94, 193, 71, 43, 218, 229, 222, 77, 178, 114, 115, 247, 186, 119, 47, 49, 21, 223, 85, 234, + 56, 86, 161, 216, 41, 160, 118, 44, 58, 106, 169, 163, 227, 160, 21, 44, 138, 140, 175, 90, + 195, 67, 251, 116, 58, 242, 176, 85, 180, 96, 153, 86, 203, 84, 37, 219, 111, 127, 187, 9, + 137, 2, 163, 211, 127, 185, 59, 187, 251, 237, 57, 191, 243, 123, 124, 231, 219, 115, 207, + 110, 170, 218, 92, 181, 165, 106, 171, 188, 61, 243, 38, 45, 167, 61, 180, 145, 30, 164, + 165, 226, 44, 186, 83, 52, 137, 133, 98, 137, 88, 42, 126, 34, 186, 232, 105, 177, 40, 83, + 153, 10, 82, 229, 84, 151, 124, 41, 179, 54, 179, 46, 243, 76, 230, 55, 153, 245, 153, 103, + 51, 207, 101, 54, 100, 158, 151, 47, 203, 87, 228, 111, 229, 171, 242, 119, 242, 53, 217, + 35, 55, 201, 205, 114, 139, 220, 42, 95, 151, 111, 200, 183, 228, 54, 185, 93, 238, 144, 59, + 229, 219, 242, 111, 242, 239, 242, 29, 249, 46, 212, 121, 38, 212, 56, 71, 183, 234, 185, + 234, 68, 101, 212, 40, 53, 26, 154, 204, 234, 156, 118, 160, 211, 25, 122, 166, 158, 5, 149, + 94, 161, 191, 175, 109, 40, 247, 2, 61, 93, 183, 64, 107, 47, 232, 23, 245, 75, 208, 219, + 107, 186, 71, 111, 130, 118, 75, 58, 208, 101, 168, 216, 211, 69, 125, 149, 58, 69, 141, 81, + 181, 106, 44, 212, 124, 141, 94, 164, 175, 133, 146, 111, 131, 158, 23, 67, 207, 183, 67, + 223, 215, 171, 113, 234, 84, 168, 122, 137, 26, 175, 234, 212, 4, 85, 175, 26, 84, 163, 58, + 77, 125, 19, 42, 253, 80, 127, 164, 255, 3, 197, 238, 214, 123, 244, 7, 208, 233, 80, 40, + 117, 88, 20, 19, 58, 61, 33, 117, 37, 180, 186, 32, 149, 87, 255, 80, 239, 227, 220, 13, 93, + 54, 65, 153, 205, 80, 250, 118, 189, 67, 239, 132, 122, 107, 161, 225, 83, 160, 225, 113, + 250, 220, 84, 125, 170, 1, 154, 254, 6, 244, 60, 30, 42, 158, 154, 58, 35, 117, 166, 174, + 213, 181, 106, 162, 58, 93, 253, 91, 125, 200, 59, 236, 41, 242, 89, 222, 103, 71, 191, 43, + 147, 61, 55, 62, 85, 104, 8, 63, 69, 88, 82, 13, 118, 187, 49, 86, 116, 57, 102, 58, 198, + 22, 108, 182, 39, 88, 211, 112, 236, 120, 99, 156, 162, 26, 33, 19, 92, 129, 29, 225, 208, + 4, 167, 169, 94, 188, 154, 224, 74, 236, 222, 63, 78, 112, 181, 252, 165, 252, 97, 244, 125, + 196, 191, 137, 186, 46, 193, 130, 180, 206, 38, 88, 82, 133, 238, 72, 176, 162, 9, 218, 75, + 176, 5, 155, 251, 18, 172, 169, 74, 175, 74, 112, 10, 246, 143, 37, 184, 130, 230, 233, 167, + 18, 156, 166, 225, 169, 163, 18, 92, 73, 223, 73, 141, 75, 112, 181, 152, 155, 42, 194, 179, + 176, 20, 98, 85, 85, 188, 200, 88, 3, 15, 173, 216, 202, 56, 197, 237, 59, 24, 87, 112, 251, + 30, 198, 105, 198, 251, 25, 87, 70, 28, 166, 171, 19, 12, 14, 211, 93, 9, 6, 135, 233, 27, + 19, 12, 14, 211, 119, 38, 24, 28, 166, 247, 36, 24, 28, 166, 247, 37, 24, 28, 86, 126, 37, + 193, 224, 176, 242, 248, 4, 131, 195, 202, 63, 37, 24, 28, 14, 169, 72, 48, 56, 28, 178, + 132, 241, 144, 40, 207, 234, 169, 140, 51, 81, 110, 213, 231, 49, 174, 226, 246, 139, 25, + 215, 48, 206, 50, 30, 26, 229, 86, 237, 49, 62, 10, 120, 88, 245, 181, 140, 143, 102, 155, + 56, 207, 175, 178, 159, 149, 140, 143, 225, 246, 213, 140, 71, 240, 216, 95, 51, 62, 142, + 109, 98, 222, 142, 103, 155, 63, 48, 62, 145, 113, 204, 219, 215, 217, 62, 174, 119, 44, + 227, 79, 24, 143, 143, 112, 77, 196, 140, 72, 115, 254, 53, 199, 50, 230, 88, 53, 39, 69, + 184, 42, 110, 159, 192, 152, 107, 169, 153, 138, 239, 64, 67, 141, 84, 143, 227, 116, 160, + 86, 124, 181, 57, 184, 183, 224, 59, 173, 128, 51, 192, 119, 89, 145, 91, 154, 241, 228, 3, + 71, 87, 27, 237, 46, 91, 212, 161, 167, 9, 95, 118, 121, 220, 103, 163, 173, 29, 227, 3, + 124, 219, 69, 79, 14, 238, 14, 172, 23, 226, 154, 131, 101, 19, 176, 139, 177, 121, 238, + 107, 199, 247, 95, 30, 79, 254, 231, 98, 77, 25, 96, 105, 62, 99, 59, 133, 46, 98, 159, 165, + 36, 190, 161, 137, 240, 92, 79, 13, 64, 99, 224, 201, 197, 55, 170, 143, 158, 18, 206, 54, + 120, 172, 29, 224, 235, 80, 35, 15, 88, 180, 160, 254, 129, 177, 93, 174, 196, 198, 25, 112, + 213, 57, 120, 232, 228, 60, 22, 160, 45, 138, 240, 229, 25, 139, 188, 22, 216, 99, 60, 110, + 46, 158, 92, 60, 69, 28, 25, 154, 3, 100, 243, 83, 28, 185, 128, 214, 9, 236, 193, 176, 239, + 14, 174, 193, 160, 74, 15, 156, 20, 56, 47, 151, 173, 235, 190, 116, 38, 159, 183, 107, 237, + 71, 231, 176, 101, 23, 231, 218, 142, 231, 25, 168, 181, 141, 217, 141, 122, 199, 243, 188, + 120, 52, 63, 169, 229, 66, 238, 233, 64, 75, 52, 75, 37, 58, 21, 109, 51, 57, 146, 207, 61, + 46, 115, 56, 7, 215, 50, 87, 20, 207, 131, 1, 247, 147, 105, 18, 212, 119, 41, 87, 99, 152, + 219, 110, 220, 203, 172, 156, 152, 163, 120, 14, 218, 56, 215, 128, 219, 60, 92, 115, 220, + 94, 228, 120, 221, 253, 76, 25, 180, 248, 156, 83, 144, 112, 84, 96, 46, 227, 103, 155, 61, + 21, 57, 122, 39, 115, 222, 199, 250, 124, 246, 209, 55, 35, 249, 164, 206, 66, 127, 22, 241, + 136, 190, 60, 252, 1, 182, 69, 86, 91, 14, 25, 103, 57, 70, 204, 71, 23, 231, 29, 49, 114, + 240, 26, 226, 231, 200, 54, 139, 104, 101, 102, 36, 199, 239, 210, 103, 153, 136, 70, 228, + 25, 141, 129, 125, 45, 238, 145, 2, 231, 39, 121, 31, 220, 119, 225, 255, 168, 253, 128, + 247, 92, 255, 220, 251, 172, 175, 190, 185, 236, 83, 207, 193, 42, 24, 168, 237, 193, 121, + 77, 29, 48, 71, 81, 37, 113, 45, 1, 199, 235, 211, 101, 228, 63, 174, 53, 135, 150, 46, 174, + 220, 227, 183, 238, 112, 74, 176, 7, 205, 186, 147, 188, 41, 159, 125, 95, 34, 86, 3, 216, + 149, 121, 100, 148, 237, 194, 126, 53, 199, 126, 34, 203, 60, 44, 14, 167, 161, 186, 71, 76, + 99, 125, 253, 233, 166, 181, 195, 49, 45, 94, 193, 11, 186, 139, 142, 105, 246, 252, 162, + 231, 219, 129, 235, 21, 234, 76, 83, 62, 111, 102, 187, 237, 29, 65, 201, 204, 118, 74, 142, + 191, 208, 201, 213, 53, 249, 174, 157, 159, 237, 180, 151, 243, 182, 223, 55, 106, 10, 55, + 154, 164, 117, 202, 69, 142, 95, 194, 120, 51, 177, 174, 190, 193, 140, 105, 113, 179, 190, + 87, 242, 218, 130, 90, 182, 26, 216, 201, 13, 45, 173, 241, 104, 183, 100, 108, 19, 248, + 118, 206, 233, 180, 253, 5, 198, 107, 59, 100, 98, 198, 45, 152, 0, 125, 115, 11, 110, 224, + 228, 204, 156, 192, 14, 28, 12, 46, 228, 38, 120, 190, 241, 208, 227, 155, 172, 87, 46, 4, + 190, 235, 148, 234, 14, 229, 164, 191, 173, 53, 186, 156, 227, 219, 93, 110, 161, 221, 204, + 104, 107, 115, 179, 142, 25, 111, 102, 123, 243, 17, 229, 66, 55, 219, 225, 229, 237, 210, + 169, 102, 166, 13, 119, 89, 215, 54, 115, 236, 114, 33, 135, 26, 76, 195, 228, 73, 141, 151, + 122, 101, 211, 105, 119, 155, 114, 201, 65, 70, 168, 160, 205, 43, 4, 38, 240, 76, 206, 45, + 21, 243, 232, 64, 82, 166, 232, 187, 104, 204, 162, 199, 193, 221, 46, 153, 162, 227, 119, + 186, 65, 148, 250, 252, 110, 46, 36, 143, 152, 133, 200, 5, 58, 34, 31, 62, 183, 22, 125, + 47, 87, 206, 6, 81, 181, 93, 29, 72, 100, 64, 4, 220, 221, 66, 54, 95, 206, 97, 66, 76, 95, + 18, 94, 33, 223, 109, 198, 184, 181, 198, 233, 156, 15, 223, 3, 172, 11, 135, 141, 206, 230, + 185, 168, 122, 223, 41, 69, 85, 70, 244, 28, 8, 16, 179, 157, 248, 154, 202, 21, 141, 113, + 17, 37, 112, 58, 35, 46, 125, 23, 81, 115, 94, 87, 33, 239, 217, 185, 193, 36, 216, 113, + 233, 152, 142, 254, 121, 241, 202, 65, 177, 28, 152, 156, 179, 48, 162, 25, 54, 29, 78, 190, + 56, 152, 161, 58, 44, 192, 30, 191, 216, 54, 191, 50, 120, 165, 69, 53, 36, 123, 37, 68, + 251, 30, 47, 241, 125, 125, 241, 223, 75, 244, 26, 70, 175, 91, 78, 173, 192, 103, 236, 122, + 245, 28, 206, 181, 106, 157, 250, 213, 145, 205, 192, 145, 205, 192, 145, 205, 192, 145, + 205, 192, 145, 205, 192, 23, 217, 12, 12, 90, 117, 15, 96, 155, 53, 115, 176, 190, 29, 131, + 236, 242, 240, 51, 112, 61, 230, 21, 249, 16, 62, 243, 176, 233, 30, 248, 108, 157, 96, 53, + 88, 23, 88, 231, 89, 103, 226, 58, 121, 80, 132, 2, 252, 30, 202, 203, 133, 184, 46, 100, + 22, 227, 119, 189, 67, 60, 46, 238, 87, 196, 115, 27, 173, 117, 126, 178, 142, 216, 135, + 241, 112, 112, 140, 159, 82, 63, 18, 119, 145, 166, 180, 94, 161, 79, 35, 18, 199, 197, 119, + 181, 149, 218, 228, 176, 180, 150, 153, 148, 37, 163, 159, 181, 157, 198, 134, 27, 232, 234, + 102, 140, 169, 140, 6, 182, 182, 52, 27, 154, 70, 38, 252, 84, 191, 209, 59, 75, 156, 86, + 241, 109, 241, 196, 52, 18, 97, 24, 18, 89, 39, 235, 103, 96, 98, 200, 210, 235, 104, 4, + 206, 145, 250, 33, 26, 97, 157, 76, 195, 137, 194, 119, 113, 238, 138, 238, 189, 110, 184, + 43, 234, 143, 238, 242, 125, 216, 63, 157, 156, 68, 15, 211, 163, 194, 165, 71, 233, 57, + 218, 40, 246, 98, 212, 99, 180, 150, 214, 208, 43, 116, 44, 150, 181, 123, 104, 17, 45, 163, + 197, 148, 162, 239, 162, 229, 54, 44, 99, 179, 145, 255, 57, 180, 76, 140, 8, 215, 96, 169, + 189, 159, 20, 206, 30, 216, 94, 76, 215, 209, 58, 58, 70, 12, 15, 223, 163, 235, 233, 22, + 245, 6, 70, 221, 66, 213, 52, 26, 180, 205, 4, 13, 119, 136, 233, 97, 153, 46, 163, 109, + 214, 205, 244, 45, 154, 14, 18, 139, 226, 134, 240, 146, 240, 199, 225, 210, 240, 1, 122, + 144, 214, 170, 87, 194, 253, 148, 161, 145, 16, 81, 150, 122, 194, 15, 244, 159, 195, 191, + 98, 233, 188, 140, 238, 166, 229, 180, 77, 44, 173, 124, 18, 12, 92, 76, 55, 192, 242, 94, + 144, 186, 66, 205, 179, 68, 216, 30, 126, 140, 12, 70, 65, 254, 61, 100, 97, 137, 238, 17, + 27, 228, 56, 120, 119, 232, 93, 49, 92, 44, 82, 205, 240, 178, 42, 124, 60, 124, 1, 86, 95, + 163, 121, 144, 237, 10, 90, 39, 38, 138, 243, 228, 40, 125, 89, 216, 18, 246, 208, 49, 136, + 113, 53, 188, 46, 167, 39, 232, 41, 28, 79, 211, 122, 122, 83, 84, 233, 189, 225, 3, 225, + 94, 26, 129, 197, 249, 124, 212, 179, 134, 54, 137, 13, 170, 119, 255, 141, 189, 103, 129, + 49, 13, 150, 106, 177, 24, 159, 143, 186, 158, 165, 151, 105, 139, 56, 73, 60, 47, 61, 93, + 165, 27, 245, 52, 253, 131, 240, 247, 116, 52, 22, 235, 185, 200, 246, 33, 140, 124, 71, + 236, 147, 215, 225, 184, 94, 189, 100, 157, 27, 158, 77, 53, 224, 101, 73, 196, 54, 189, 72, + 59, 196, 72, 49, 65, 204, 16, 23, 201, 90, 233, 201, 251, 148, 79, 105, 68, 108, 192, 17, + 45, 40, 183, 209, 207, 224, 253, 45, 49, 78, 60, 37, 171, 228, 102, 181, 202, 90, 109, 125, + 146, 58, 190, 119, 123, 88, 131, 25, 57, 153, 86, 210, 189, 244, 188, 168, 70, 165, 70, 148, + 196, 77, 226, 143, 226, 109, 217, 44, 175, 144, 43, 229, 78, 181, 204, 122, 196, 122, 189, + 194, 70, 213, 151, 67, 128, 119, 208, 106, 218, 39, 134, 137, 73, 98, 150, 248, 158, 232, + 16, 139, 196, 98, 177, 68, 44, 23, 61, 98, 139, 216, 37, 155, 100, 171, 92, 32, 255, 169, + 58, 212, 85, 106, 189, 117, 54, 142, 57, 86, 201, 186, 89, 223, 170, 111, 79, 237, 234, 189, + 164, 247, 133, 222, 173, 189, 251, 194, 198, 240, 86, 154, 5, 61, 220, 136, 236, 239, 166, + 251, 80, 217, 90, 218, 76, 127, 193, 177, 141, 118, 10, 45, 50, 162, 6, 135, 17, 163, 196, + 92, 113, 13, 142, 235, 196, 29, 226, 23, 226, 97, 241, 136, 88, 131, 40, 91, 196, 78, 241, + 158, 248, 151, 248, 72, 124, 34, 9, 71, 74, 30, 39, 71, 201, 209, 56, 78, 146, 190, 236, + 146, 203, 228, 61, 114, 51, 142, 45, 114, 183, 252, 175, 58, 86, 141, 86, 227, 212, 68, 117, + 134, 186, 84, 121, 200, 106, 177, 186, 11, 199, 147, 106, 135, 53, 210, 218, 108, 133, 224, + 185, 81, 255, 84, 255, 92, 63, 172, 87, 235, 141, 122, 111, 170, 170, 226, 166, 52, 165, 95, + 251, 116, 213, 254, 177, 251, 223, 250, 31, 227, 85, 3, 219, 212, 117, 133, 207, 189, 247, + 249, 57, 132, 164, 49, 13, 33, 36, 134, 242, 220, 71, 2, 228, 135, 80, 50, 74, 18, 210, 96, + 226, 216, 133, 134, 164, 228, 7, 106, 71, 161, 56, 36, 41, 9, 148, 14, 70, 219, 1, 133, 53, + 136, 66, 178, 71, 40, 85, 53, 101, 5, 33, 86, 162, 209, 50, 132, 224, 57, 11, 157, 131, 168, + 70, 139, 86, 52, 177, 130, 212, 253, 176, 110, 26, 208, 65, 196, 52, 149, 194, 164, 129, 38, + 86, 242, 246, 221, 103, 39, 36, 76, 154, 102, 251, 243, 185, 231, 231, 222, 123, 238, 185, + 223, 189, 126, 30, 162, 161, 174, 161, 158, 161, 190, 161, 126, 235, 43, 74, 195, 30, 102, + 162, 10, 211, 168, 20, 217, 203, 75, 100, 45, 246, 187, 7, 140, 59, 73, 191, 101, 73, 168, + 93, 38, 203, 97, 101, 108, 41, 42, 179, 138, 173, 101, 27, 217, 102, 84, 242, 45, 118, 128, + 29, 177, 115, 63, 193, 206, 160, 74, 151, 217, 109, 228, 156, 204, 167, 216, 57, 207, 230, + 243, 120, 57, 127, 30, 239, 23, 121, 43, 223, 200, 223, 225, 239, 242, 126, 254, 7, 126, 95, + 56, 197, 120, 145, 34, 210, 68, 142, 120, 86, 172, 20, 173, 226, 85, 177, 69, 244, 8, 83, + 252, 70, 252, 69, 252, 85, 220, 19, 223, 226, 109, 41, 137, 202, 52, 229, 73, 37, 91, 201, + 197, 245, 180, 74, 121, 77, 57, 164, 220, 84, 110, 58, 26, 29, 23, 28, 131, 106, 162, 186, + 94, 221, 173, 70, 213, 127, 56, 159, 118, 150, 57, 151, 57, 107, 156, 43, 157, 251, 156, 31, + 57, 127, 151, 16, 6, 59, 207, 209, 41, 250, 5, 141, 122, 177, 107, 98, 135, 240, 139, 83, + 244, 54, 47, 84, 50, 248, 69, 126, 17, 124, 94, 133, 7, 215, 42, 14, 166, 242, 163, 172, + 139, 111, 103, 253, 124, 186, 99, 179, 186, 128, 47, 96, 213, 116, 71, 201, 70, 173, 63, + 227, 63, 225, 247, 248, 2, 81, 197, 42, 89, 29, 173, 229, 79, 197, 70, 83, 39, 42, 199, 32, + 74, 149, 115, 116, 75, 57, 131, 181, 93, 196, 200, 155, 213, 36, 246, 3, 126, 91, 77, 162, + 62, 70, 188, 24, 115, 254, 74, 204, 81, 114, 197, 5, 250, 147, 184, 202, 156, 202, 97, 250, + 179, 146, 200, 210, 217, 45, 254, 161, 88, 6, 22, 124, 172, 148, 57, 130, 228, 17, 7, 233, + 132, 216, 200, 182, 211, 41, 238, 39, 74, 252, 119, 66, 55, 120, 92, 205, 142, 225, 94, 168, + 103, 115, 217, 191, 132, 69, 130, 87, 131, 69, 243, 197, 117, 218, 73, 235, 248, 31, 233, + 22, 206, 113, 23, 253, 152, 181, 40, 107, 232, 109, 42, 100, 219, 232, 38, 125, 128, 83, 49, + 203, 241, 138, 154, 163, 166, 177, 95, 243, 118, 197, 224, 169, 172, 159, 184, 242, 51, 172, + 174, 152, 77, 103, 194, 49, 145, 222, 98, 43, 197, 1, 245, 54, 255, 18, 151, 243, 37, 37, + 145, 174, 136, 227, 200, 254, 18, 63, 33, 170, 148, 59, 142, 90, 214, 134, 19, 176, 157, + 118, 211, 70, 107, 7, 109, 113, 4, 149, 47, 216, 26, 18, 108, 5, 101, 225, 162, 253, 17, + 109, 19, 115, 21, 15, 228, 155, 184, 85, 26, 113, 167, 125, 132, 211, 125, 26, 247, 192, 34, + 81, 5, 203, 100, 48, 103, 41, 120, 177, 28, 55, 196, 1, 188, 223, 195, 61, 161, 128, 65, + 237, 56, 227, 47, 224, 22, 187, 72, 253, 106, 61, 143, 210, 26, 199, 99, 12, 183, 14, 238, + 227, 11, 67, 181, 212, 96, 125, 64, 251, 173, 53, 244, 138, 245, 46, 229, 227, 62, 232, 180, + 182, 97, 196, 163, 52, 72, 251, 232, 40, 219, 53, 244, 6, 126, 54, 159, 192, 201, 185, 194, + 150, 58, 2, 252, 146, 35, 96, 229, 115, 131, 127, 201, 235, 120, 207, 216, 253, 69, 181, + 179, 216, 100, 250, 59, 222, 39, 160, 148, 225, 174, 55, 148, 203, 248, 89, 92, 104, 117, + 91, 191, 7, 187, 103, 226, 134, 221, 143, 135, 144, 231, 232, 6, 86, 249, 13, 102, 88, 44, + 206, 82, 225, 80, 53, 143, 88, 1, 177, 1, 235, 189, 74, 53, 214, 135, 214, 52, 150, 72, 109, + 214, 203, 120, 52, 61, 67, 71, 156, 14, 106, 114, 230, 98, 143, 77, 246, 5, 214, 251, 6, + 181, 242, 90, 235, 85, 209, 58, 212, 142, 58, 236, 67, 21, 188, 168, 214, 107, 184, 127, + 126, 232, 245, 45, 175, 95, 228, 93, 88, 246, 76, 233, 130, 146, 226, 162, 249, 243, 190, + 83, 56, 247, 169, 57, 5, 179, 243, 243, 114, 115, 102, 205, 156, 145, 157, 53, 93, 127, 210, + 163, 77, 123, 98, 234, 20, 119, 102, 198, 228, 244, 73, 105, 19, 83, 31, 159, 224, 74, 121, + 44, 57, 105, 124, 226, 184, 4, 167, 234, 80, 4, 103, 148, 231, 215, 3, 97, 205, 204, 14, + 155, 74, 182, 190, 120, 113, 190, 212, 245, 38, 24, 154, 70, 25, 194, 38, 254, 220, 153, + 129, 177, 49, 166, 22, 182, 195, 180, 177, 145, 94, 68, 190, 244, 72, 164, 55, 22, 233, 29, + 137, 100, 46, 173, 148, 74, 243, 243, 52, 191, 174, 153, 159, 87, 232, 90, 148, 53, 212, 4, + 209, 222, 91, 161, 135, 52, 243, 150, 221, 174, 178, 219, 239, 216, 237, 100, 180, 61, 30, + 116, 208, 252, 147, 219, 42, 52, 147, 133, 53, 191, 25, 120, 189, 205, 240, 135, 43, 48, 92, + 100, 124, 162, 79, 247, 181, 38, 230, 231, 81, 36, 113, 60, 154, 227, 209, 50, 211, 245, 13, + 17, 150, 94, 198, 236, 6, 79, 247, 151, 68, 56, 37, 36, 35, 41, 51, 83, 175, 240, 155, 25, + 122, 133, 204, 192, 20, 89, 254, 166, 22, 115, 89, 77, 208, 95, 225, 246, 120, 66, 249, 121, + 38, 243, 53, 235, 171, 77, 210, 203, 205, 148, 92, 59, 132, 124, 246, 52, 166, 234, 51, 157, + 246, 52, 90, 187, 92, 13, 237, 209, 34, 121, 103, 141, 238, 168, 139, 86, 135, 115, 147, 90, + 244, 150, 166, 198, 160, 41, 154, 66, 114, 142, 9, 185, 152, 183, 194, 76, 223, 122, 99, + 242, 67, 21, 131, 63, 238, 11, 118, 142, 246, 186, 133, 225, 159, 220, 174, 73, 213, 48, 58, + 53, 243, 253, 154, 224, 104, 175, 71, 126, 135, 66, 24, 3, 125, 121, 86, 32, 108, 4, 48, + 117, 55, 138, 88, 89, 167, 97, 54, 190, 43, 20, 52, 217, 46, 76, 169, 201, 149, 200, 85, + 197, 214, 215, 170, 251, 165, 37, 188, 86, 51, 199, 233, 229, 122, 155, 177, 54, 140, 173, + 201, 52, 76, 170, 221, 226, 233, 203, 204, 244, 14, 88, 215, 40, 211, 175, 25, 245, 65, 221, + 99, 46, 116, 235, 161, 166, 138, 41, 145, 137, 100, 212, 110, 249, 121, 134, 87, 203, 24, + 235, 201, 207, 139, 184, 38, 196, 10, 27, 121, 44, 37, 222, 72, 74, 30, 221, 104, 29, 241, + 217, 45, 59, 92, 182, 42, 107, 71, 42, 203, 100, 70, 250, 18, 16, 194, 212, 154, 53, 100, + 18, 212, 177, 166, 34, 249, 213, 90, 68, 70, 115, 17, 194, 240, 10, 49, 244, 50, 91, 176, + 35, 237, 230, 56, 95, 216, 112, 149, 72, 187, 236, 111, 58, 178, 92, 186, 102, 220, 37, 48, + 64, 191, 245, 245, 88, 75, 83, 220, 162, 102, 185, 238, 146, 108, 74, 158, 140, 80, 13, 254, + 225, 182, 153, 155, 107, 230, 228, 72, 138, 56, 125, 216, 83, 228, 88, 102, 235, 243, 242, + 243, 94, 143, 114, 93, 223, 224, 210, 32, 80, 62, 90, 134, 218, 54, 133, 74, 10, 80, 126, + 143, 71, 110, 240, 158, 168, 151, 86, 67, 49, 59, 106, 130, 49, 29, 127, 60, 220, 125, 228, + 45, 200, 13, 153, 60, 44, 61, 103, 135, 61, 105, 203, 165, 167, 99, 216, 51, 210, 61, 172, + 131, 201, 253, 196, 112, 105, 164, 153, 9, 217, 35, 159, 20, 215, 164, 84, 127, 91, 137, + 201, 38, 253, 15, 119, 107, 204, 95, 89, 167, 87, 214, 52, 4, 53, 191, 17, 142, 215, 182, + 178, 126, 140, 22, 243, 23, 141, 248, 226, 45, 51, 213, 23, 20, 110, 30, 111, 113, 183, 176, + 189, 32, 101, 227, 72, 176, 84, 130, 73, 166, 146, 133, 143, 106, 147, 186, 37, 234, 76, 0, + 43, 109, 11, 211, 2, 166, 43, 188, 56, 246, 29, 74, 244, 120, 254, 207, 78, 81, 235, 142, + 236, 101, 139, 135, 221, 226, 105, 154, 37, 185, 99, 245, 5, 99, 244, 49, 233, 37, 25, 2, 9, + 227, 167, 178, 178, 190, 193, 48, 18, 199, 248, 64, 181, 216, 132, 75, 226, 2, 140, 167, + 250, 160, 71, 243, 153, 180, 28, 39, 51, 11, 159, 168, 117, 182, 72, 34, 228, 54, 189, 40, + 153, 79, 6, 128, 127, 49, 83, 92, 29, 19, 232, 142, 183, 67, 120, 73, 118, 230, 231, 5, 112, + 209, 25, 70, 64, 215, 2, 70, 216, 104, 138, 90, 29, 171, 117, 205, 165, 27, 3, 252, 83, 254, + 169, 177, 193, 31, 30, 38, 78, 212, 58, 189, 199, 109, 6, 186, 67, 168, 85, 27, 43, 193, + 161, 224, 84, 30, 209, 89, 87, 77, 196, 203, 186, 234, 26, 130, 3, 46, 252, 59, 232, 170, + 15, 246, 113, 198, 125, 225, 242, 80, 100, 58, 124, 193, 1, 141, 200, 107, 91, 185, 180, 74, + 163, 84, 52, 169, 80, 37, 195, 34, 251, 120, 130, 29, 239, 30, 240, 18, 117, 216, 94, 197, + 54, 216, 122, 115, 148, 145, 109, 75, 24, 182, 49, 106, 142, 242, 152, 205, 53, 108, 227, + 176, 41, 49, 155, 215, 182, 201, 151, 188, 99, 124, 245, 193, 209, 236, 177, 143, 100, 40, + 95, 254, 220, 201, 231, 107, 190, 239, 200, 222, 115, 171, 86, 165, 148, 222, 77, 112, 39, + 216, 191, 130, 189, 215, 103, 228, 72, 249, 201, 243, 151, 83, 239, 159, 124, 176, 198, 69, + 9, 73, 246, 191, 35, 102, 247, 176, 251, 57, 203, 134, 170, 201, 231, 162, 251, 39, 239, + 111, 117, 81, 220, 62, 242, 74, 158, 167, 198, 77, 242, 25, 38, 14, 147, 95, 166, 23, 149, + 77, 148, 6, 44, 113, 78, 165, 239, 59, 86, 80, 144, 117, 82, 3, 63, 70, 219, 36, 196, 84, + 242, 42, 199, 233, 123, 136, 61, 6, 125, 17, 228, 105, 217, 23, 241, 203, 129, 171, 64, 41, + 176, 2, 200, 140, 219, 170, 128, 38, 160, 78, 234, 136, 29, 144, 125, 49, 198, 6, 57, 142, + 45, 55, 81, 67, 194, 52, 250, 174, 99, 133, 245, 0, 243, 245, 56, 206, 211, 75, 192, 33, + 180, 123, 149, 235, 116, 84, 45, 166, 245, 208, 127, 138, 126, 191, 84, 136, 230, 203, 24, + 244, 233, 81, 143, 209, 123, 176, 31, 132, 191, 25, 182, 67, 144, 65, 232, 135, 209, 110, + 68, 191, 57, 241, 246, 56, 231, 94, 252, 15, 132, 4, 84, 216, 103, 97, 156, 61, 241, 245, + 206, 16, 159, 208, 211, 202, 38, 235, 43, 172, 37, 132, 49, 159, 3, 118, 99, 142, 101, 144, + 1, 160, 18, 49, 169, 144, 229, 64, 39, 59, 79, 93, 236, 188, 213, 11, 63, 36, 237, 196, 252, + 157, 210, 14, 84, 196, 229, 98, 140, 179, 11, 254, 133, 232, 55, 29, 250, 78, 180, 51, 145, + 135, 10, 153, 2, 120, 128, 153, 252, 56, 21, 243, 137, 116, 6, 178, 0, 235, 127, 33, 182, + 110, 224, 60, 181, 201, 53, 143, 172, 9, 249, 199, 115, 250, 111, 196, 114, 172, 28, 13, + 204, 249, 49, 160, 243, 98, 107, 16, 114, 220, 168, 220, 30, 197, 206, 71, 176, 68, 20, 82, + 7, 228, 58, 192, 13, 212, 240, 207, 105, 189, 178, 148, 24, 234, 181, 223, 49, 72, 66, 2, + 204, 147, 117, 186, 2, 60, 163, 180, 80, 53, 116, 134, 60, 235, 28, 253, 116, 64, 234, 64, + 149, 141, 77, 214, 3, 229, 32, 189, 47, 254, 73, 69, 240, 109, 85, 123, 176, 142, 22, 212, + 27, 79, 213, 252, 30, 21, 240, 175, 41, 95, 205, 162, 55, 193, 175, 10, 140, 191, 3, 56, + 132, 49, 255, 102, 243, 161, 133, 234, 49, 255, 108, 200, 66, 101, 208, 230, 208, 110, 160, + 27, 115, 221, 30, 174, 147, 172, 13, 244, 29, 216, 215, 90, 204, 245, 173, 60, 17, 232, 95, + 7, 60, 139, 125, 233, 0, 94, 150, 249, 96, 254, 2, 89, 115, 185, 239, 108, 197, 80, 49, 98, + 111, 32, 166, 81, 2, 246, 116, 27, 88, 187, 228, 164, 236, 35, 251, 99, 172, 172, 56, 15, + 123, 31, 74, 234, 69, 204, 94, 212, 245, 26, 164, 2, 164, 201, 28, 134, 97, 243, 44, 14, + 248, 62, 195, 56, 25, 128, 10, 76, 5, 102, 3, 131, 64, 47, 176, 14, 40, 1, 42, 129, 153, + 152, 155, 48, 175, 176, 249, 10, 206, 72, 110, 218, 252, 0, 55, 28, 231, 81, 67, 228, 102, + 115, 54, 182, 134, 67, 246, 126, 198, 206, 204, 225, 248, 88, 114, 30, 143, 122, 156, 214, + 197, 225, 145, 99, 202, 243, 34, 57, 139, 92, 34, 195, 99, 203, 51, 37, 57, 51, 44, 109, + 126, 175, 179, 121, 255, 141, 92, 167, 228, 212, 136, 196, 217, 83, 254, 195, 125, 185, 6, + 87, 85, 93, 113, 124, 221, 115, 246, 57, 247, 2, 98, 2, 36, 29, 8, 69, 84, 34, 15, 31, 16, + 194, 64, 181, 82, 147, 34, 6, 12, 173, 136, 152, 196, 70, 42, 8, 41, 181, 6, 124, 224, 99, + 180, 99, 33, 54, 242, 20, 28, 69, 96, 40, 34, 2, 131, 64, 19, 29, 176, 128, 34, 227, 84, + 236, 212, 90, 176, 192, 212, 105, 176, 84, 218, 153, 2, 253, 0, 153, 190, 24, 98, 7, 35, + 156, 254, 214, 190, 231, 196, 203, 9, 49, 6, 237, 151, 222, 153, 255, 252, 207, 94, 119, + 239, 179, 215, 94, 123, 189, 78, 163, 140, 81, 29, 108, 12, 226, 91, 17, 107, 220, 161, 179, + 198, 195, 10, 167, 76, 22, 192, 171, 240, 227, 90, 245, 89, 213, 47, 98, 181, 139, 250, 154, + 181, 9, 49, 17, 242, 200, 140, 179, 22, 216, 24, 129, 93, 145, 126, 161, 175, 215, 70, 28, + 217, 162, 133, 239, 145, 13, 188, 115, 138, 63, 149, 156, 178, 86, 198, 154, 135, 233, 235, + 159, 147, 169, 230, 95, 50, 218, 29, 36, 131, 189, 2, 100, 156, 135, 185, 91, 157, 70, 185, + 45, 69, 207, 207, 93, 142, 103, 252, 179, 24, 175, 84, 36, 27, 18, 247, 122, 187, 57, 103, + 61, 246, 108, 144, 23, 177, 233, 131, 166, 193, 185, 220, 52, 36, 60, 175, 62, 56, 238, 73, + 98, 143, 87, 239, 204, 182, 207, 173, 56, 142, 196, 238, 244, 127, 202, 138, 204, 255, 58, + 42, 191, 16, 56, 7, 189, 122, 114, 102, 125, 112, 194, 107, 8, 2, 206, 179, 84, 99, 34, 217, + 152, 40, 0, 151, 70, 140, 252, 23, 160, 6, 92, 153, 186, 42, 177, 50, 85, 157, 216, 153, 44, + 147, 108, 95, 228, 20, 184, 223, 20, 203, 55, 189, 98, 249, 134, 217, 205, 253, 228, 146, + 231, 137, 5, 228, 101, 222, 95, 229, 109, 119, 137, 44, 52, 13, 193, 161, 68, 141, 212, 56, + 13, 50, 47, 153, 43, 119, 243, 109, 150, 165, 123, 57, 7, 165, 86, 161, 239, 135, 31, 200, + 240, 163, 115, 124, 46, 238, 75, 17, 71, 254, 26, 103, 205, 249, 161, 79, 245, 133, 125, + 226, 111, 127, 136, 99, 33, 62, 6, 77, 248, 209, 56, 124, 178, 151, 214, 6, 205, 207, 182, + 62, 144, 163, 193, 188, 180, 191, 6, 159, 180, 248, 231, 30, 121, 25, 126, 58, 242, 207, + 152, 159, 86, 199, 252, 243, 162, 184, 95, 198, 217, 214, 22, 242, 123, 20, 167, 232, 177, + 48, 58, 191, 230, 71, 205, 113, 154, 35, 53, 207, 105, 158, 137, 230, 199, 57, 99, 253, 34, + 167, 14, 63, 214, 60, 188, 79, 42, 195, 184, 190, 60, 68, 41, 58, 30, 9, 99, 159, 60, 204, + 125, 87, 4, 129, 95, 18, 108, 242, 183, 7, 155, 221, 238, 193, 102, 191, 144, 231, 63, 2, + 47, 216, 196, 185, 31, 107, 169, 169, 119, 4, 103, 195, 122, 58, 40, 170, 165, 105, 185, + 116, 137, 234, 168, 55, 76, 102, 134, 249, 108, 131, 205, 55, 39, 101, 153, 173, 163, 229, + 86, 191, 78, 254, 22, 153, 227, 53, 115, 239, 228, 64, 171, 239, 218, 48, 6, 177, 39, 122, + 87, 155, 41, 216, 124, 149, 44, 230, 28, 189, 220, 249, 196, 35, 114, 48, 73, 109, 98, 239, + 66, 164, 167, 214, 5, 173, 137, 238, 114, 236, 172, 181, 104, 137, 212, 186, 31, 209, 47, + 232, 218, 97, 210, 205, 214, 139, 34, 169, 64, 247, 61, 86, 70, 77, 85, 86, 153, 87, 33, + 235, 253, 70, 41, 52, 101, 228, 218, 221, 82, 165, 119, 165, 231, 80, 125, 244, 238, 83, + 143, 72, 215, 84, 46, 121, 162, 65, 134, 154, 159, 51, 39, 87, 58, 51, 111, 173, 181, 65, + 177, 108, 178, 126, 161, 107, 171, 105, 169, 176, 69, 114, 154, 36, 241, 217, 91, 152, 163, + 239, 91, 103, 215, 20, 75, 247, 208, 30, 27, 172, 45, 236, 122, 122, 17, 245, 97, 181, 5, + 239, 244, 115, 229, 54, 219, 79, 52, 202, 75, 94, 153, 84, 16, 67, 235, 146, 53, 178, 206, + 47, 35, 230, 114, 101, 51, 239, 120, 153, 117, 101, 170, 11, 235, 242, 108, 189, 94, 46, + 119, 18, 95, 11, 200, 77, 11, 200, 57, 98, 253, 191, 50, 104, 118, 235, 57, 207, 99, 228, + 117, 224, 214, 96, 163, 122, 233, 233, 213, 96, 195, 106, 123, 246, 209, 38, 157, 99, 231, + 107, 252, 184, 117, 210, 95, 125, 196, 95, 78, 30, 214, 126, 98, 185, 44, 50, 87, 201, 77, + 126, 181, 44, 65, 182, 196, 35, 79, 178, 239, 211, 200, 158, 34, 126, 11, 136, 221, 133, + 172, 239, 27, 230, 109, 97, 239, 133, 200, 117, 109, 145, 246, 50, 218, 35, 104, 188, 36, + 139, 165, 135, 95, 99, 251, 0, 177, 58, 104, 159, 194, 254, 238, 113, 89, 231, 150, 202, 2, + 252, 248, 219, 169, 229, 216, 97, 174, 208, 145, 38, 180, 105, 188, 4, 12, 77, 195, 142, + 103, 135, 88, 156, 134, 149, 101, 167, 57, 113, 153, 155, 45, 63, 81, 185, 51, 76, 62, 96, + 135, 46, 34, 129, 214, 208, 55, 205, 147, 242, 35, 83, 46, 133, 238, 80, 98, 183, 155, 92, + 99, 126, 79, 172, 158, 150, 23, 220, 44, 153, 108, 246, 202, 11, 102, 167, 44, 214, 177, + 233, 33, 3, 93, 186, 123, 119, 59, 189, 165, 202, 15, 200, 173, 42, 119, 62, 96, 188, 82, + 42, 205, 72, 214, 47, 144, 251, 204, 100, 121, 200, 125, 13, 223, 251, 131, 116, 54, 211, + 185, 107, 214, 121, 207, 224, 39, 249, 172, 63, 201, 123, 67, 36, 142, 74, 165, 91, 78, 108, + 205, 227, 249, 116, 240, 138, 206, 179, 123, 108, 15, 42, 20, 102, 172, 92, 99, 215, 101, + 192, 234, 26, 33, 166, 179, 51, 142, 83, 149, 114, 167, 232, 171, 207, 231, 232, 139, 174, + 45, 122, 70, 58, 158, 71, 63, 123, 78, 125, 47, 235, 116, 142, 121, 65, 70, 98, 167, 195, + 224, 138, 52, 159, 157, 224, 44, 145, 122, 176, 214, 249, 147, 220, 232, 126, 87, 30, 79, + 108, 14, 118, 97, 215, 146, 24, 198, 102, 142, 205, 240, 196, 19, 96, 176, 25, 46, 111, 128, + 39, 121, 190, 26, 254, 37, 216, 146, 30, 211, 187, 13, 151, 143, 192, 92, 222, 253, 14, 188, + 77, 191, 11, 20, 206, 40, 25, 161, 140, 108, 13, 88, 9, 222, 143, 254, 203, 132, 238, 115, + 62, 121, 38, 188, 222, 193, 174, 115, 198, 59, 168, 53, 32, 113, 42, 216, 165, 136, 207, + 199, 206, 35, 216, 111, 132, 249, 86, 176, 75, 129, 47, 150, 42, 252, 57, 146, 147, 124, 84, + 114, 220, 1, 200, 47, 97, 93, 108, 236, 245, 38, 158, 118, 72, 190, 43, 193, 127, 218, 211, + 233, 243, 192, 175, 32, 195, 142, 197, 153, 103, 140, 238, 3, 254, 218, 23, 192, 225, 12, + 190, 84, 57, 172, 13, 23, 172, 219, 133, 130, 251, 157, 3, 190, 111, 237, 251, 15, 201, 77, + 251, 144, 92, 156, 56, 24, 28, 134, 203, 19, 7, 37, 219, 125, 4, 31, 4, 140, 175, 97, 220, + 35, 178, 103, 116, 79, 200, 159, 183, 242, 216, 253, 225, 43, 162, 54, 143, 203, 227, 227, + 248, 189, 182, 55, 118, 182, 201, 228, 76, 68, 126, 208, 226, 15, 75, 229, 6, 133, 41, 98, + 62, 136, 143, 83, 123, 228, 6, 133, 255, 46, 255, 189, 219, 122, 108, 54, 181, 131, 74, 185, + 210, 93, 165, 58, 225, 131, 3, 90, 143, 253, 241, 50, 64, 225, 228, 163, 107, 158, 174, 33, + 230, 64, 203, 248, 0, 57, 2, 232, 92, 187, 190, 171, 140, 81, 104, 236, 42, 156, 237, 124, + 175, 129, 150, 255, 135, 203, 77, 138, 12, 187, 142, 80, 187, 186, 171, 210, 255, 71, 247, + 19, 221, 75, 252, 126, 208, 175, 216, 236, 151, 155, 225, 254, 240, 117, 240, 68, 184, 52, + 226, 204, 152, 141, 199, 109, 92, 22, 229, 146, 243, 205, 137, 197, 70, 65, 91, 239, 252, + 127, 2, 177, 179, 23, 188, 7, 126, 243, 191, 222, 43, 33, 248, 42, 200, 6, 254, 97, 250, + 144, 34, 250, 200, 6, 250, 147, 59, 165, 86, 228, 12, 185, 228, 211, 33, 96, 35, 121, 232, + 118, 248, 67, 100, 84, 239, 179, 131, 64, 87, 158, 187, 33, 251, 33, 252, 162, 72, 115, 19, + 207, 179, 144, 55, 164, 17, 56, 166, 183, 172, 13, 251, 202, 94, 200, 94, 15, 215, 166, 194, + 247, 77, 76, 175, 111, 254, 173, 200, 39, 167, 192, 150, 244, 250, 230, 58, 112, 47, 207, + 255, 6, 212, 243, 230, 63, 195, 239, 192, 43, 153, 127, 130, 117, 79, 193, 191, 74, 255, + 127, 102, 50, 227, 71, 193, 91, 140, 27, 25, 207, 0, 119, 240, 252, 44, 156, 11, 95, 13, + 122, 128, 238, 172, 95, 161, 208, 126, 164, 213, 119, 232, 87, 206, 231, 255, 254, 248, 162, + 76, 207, 50, 13, 61, 251, 194, 187, 224, 39, 226, 223, 16, 95, 152, 163, 251, 108, 135, 227, + 223, 26, 209, 253, 183, 199, 94, 248, 45, 209, 154, 211, 118, 224, 155, 233, 8, 125, 223, + 214, 204, 111, 159, 207, 251, 198, 137, 152, 251, 60, 155, 9, 83, 22, 156, 161, 167, 188, + 72, 251, 104, 237, 101, 181, 127, 182, 253, 99, 200, 246, 251, 205, 246, 177, 236, 43, 146, + 19, 49, 250, 116, 210, 254, 85, 123, 103, 237, 95, 97, 125, 255, 124, 223, 179, 250, 148, + 161, 215, 20, 171, 87, 88, 55, 50, 115, 107, 226, 148, 172, 1, 217, 160, 119, 200, 213, 204, + 57, 237, 12, 8, 246, 147, 123, 178, 240, 239, 38, 190, 141, 54, 40, 24, 95, 12, 202, 211, 8, + 14, 80, 187, 178, 168, 117, 111, 147, 119, 155, 224, 125, 140, 251, 192, 77, 81, 77, 139, + 114, 107, 171, 28, 219, 78, 77, 251, 170, 199, 29, 173, 145, 23, 80, 83, 11, 67, 76, 142, + 161, 45, 121, 132, 107, 67, 220, 172, 136, 215, 226, 142, 162, 189, 218, 125, 193, 181, 188, + 141, 26, 157, 89, 167, 191, 236, 56, 170, 243, 17, 58, 221, 32, 133, 138, 100, 113, 176, 75, + 17, 239, 75, 91, 245, 1, 237, 140, 219, 235, 115, 59, 58, 142, 247, 29, 29, 30, 199, 250, + 146, 104, 28, 71, 171, 255, 227, 190, 23, 245, 51, 121, 146, 215, 130, 88, 220, 117, 20, + 250, 109, 97, 118, 124, 214, 251, 71, 58, 196, 227, 184, 37, 222, 194, 49, 54, 186, 41, 19, + 228, 129, 129, 97, 13, 93, 79, 190, 160, 255, 15, 250, 0, 106, 84, 176, 20, 217, 236, 212, + 167, 82, 152, 122, 85, 10, 25, 239, 0, 212, 205, 179, 127, 135, 171, 244, 63, 248, 165, 196, + 18, 17, 231, 227, 224, 12, 227, 159, 50, 206, 54, 251, 236, 220, 59, 66, 84, 181, 231, 207, + 113, 191, 213, 254, 220, 246, 135, 216, 204, 230, 193, 103, 85, 127, 25, 2, 174, 7, 221, + 193, 107, 96, 102, 116, 215, 250, 13, 201, 222, 135, 28, 170, 174, 126, 231, 154, 202, 160, + 201, 236, 7, 177, 30, 176, 93, 30, 46, 15, 130, 87, 25, 103, 49, 206, 34, 23, 231, 248, 221, + 200, 219, 197, 178, 137, 231, 121, 112, 103, 184, 51, 249, 125, 2, 152, 78, 46, 191, 213, + 123, 47, 56, 227, 255, 216, 206, 41, 229, 191, 18, 243, 176, 140, 37, 207, 223, 103, 26, + 120, 231, 209, 224, 215, 228, 244, 153, 230, 172, 100, 37, 47, 146, 249, 212, 206, 90, 106, + 104, 95, 254, 95, 193, 218, 5, 140, 115, 225, 158, 201, 75, 101, 3, 239, 217, 201, 250, 167, + 181, 6, 248, 39, 169, 131, 21, 212, 195, 78, 90, 59, 216, 183, 92, 214, 128, 106, 230, 142, + 55, 39, 101, 153, 219, 69, 70, 243, 158, 124, 115, 84, 114, 66, 46, 240, 154, 229, 110, 173, + 87, 254, 96, 214, 80, 243, 144, 13, 130, 7, 90, 62, 42, 67, 205, 36, 25, 13, 138, 120, 223, + 72, 173, 53, 110, 61, 62, 242, 55, 214, 82, 127, 156, 28, 121, 203, 189, 69, 222, 50, 175, + 200, 44, 222, 183, 181, 115, 157, 172, 233, 244, 158, 172, 73, 85, 73, 73, 106, 142, 172, + 240, 235, 100, 133, 187, 90, 106, 145, 173, 78, 62, 35, 171, 253, 171, 100, 190, 190, 35, + 170, 171, 90, 19, 163, 103, 154, 169, 68, 178, 143, 173, 249, 51, 25, 231, 133, 60, 42, 58, + 115, 188, 39, 176, 250, 77, 146, 239, 80, 151, 215, 103, 238, 27, 173, 75, 149, 80, 75, 79, + 114, 126, 246, 86, 93, 219, 235, 109, 168, 241, 139, 64, 21, 231, 48, 240, 199, 241, 253, + 212, 70, 78, 93, 240, 187, 52, 203, 61, 97, 141, 127, 180, 165, 230, 151, 203, 36, 244, 44, + 82, 155, 90, 219, 78, 146, 9, 238, 108, 190, 251, 180, 166, 235, 254, 27, 225, 131, 114, + 151, 153, 7, 66, 27, 199, 117, 137, 246, 194, 46, 103, 218, 234, 133, 162, 222, 132, 231, + 10, 48, 86, 239, 217, 66, 164, 135, 250, 149, 245, 165, 52, 202, 188, 227, 246, 190, 110, + 214, 59, 243, 186, 18, 195, 89, 122, 255, 193, 155, 106, 31, 139, 199, 152, 239, 72, 47, + 243, 79, 128, 15, 169, 158, 10, 252, 171, 23, 88, 168, 112, 214, 16, 163, 247, 17, 43, 248, + 160, 121, 158, 158, 169, 78, 158, 10, 193, 220, 96, 163, 93, 55, 195, 174, 27, 237, 79, 4, + 69, 232, 53, 157, 125, 234, 130, 99, 159, 65, 230, 126, 134, 224, 152, 41, 147, 69, 22, 216, + 75, 239, 207, 201, 9, 222, 132, 103, 57, 239, 179, 215, 117, 146, 101, 237, 247, 16, 58, 45, + 230, 158, 167, 208, 15, 137, 228, 97, 71, 61, 119, 79, 51, 16, 185, 250, 231, 237, 128, 251, + 7, 143, 51, 206, 183, 103, 15, 217, 218, 170, 152, 117, 89, 124, 215, 233, 25, 233, 169, + 220, 193, 34, 252, 151, 114, 175, 215, 254, 10, 187, 133, 115, 147, 111, 72, 73, 178, 24, + 127, 237, 34, 37, 222, 54, 201, 119, 239, 167, 127, 217, 77, 174, 251, 58, 119, 87, 202, + 189, 102, 73, 173, 123, 68, 46, 49, 215, 202, 52, 183, 155, 84, 41, 18, 37, 193, 254, 68, + 35, 76, 167, 174, 112, 78, 32, 63, 4, 63, 199, 120, 190, 84, 58, 31, 202, 93, 216, 171, 6, + 204, 0, 139, 56, 119, 179, 197, 94, 122, 5, 64, 188, 60, 16, 226, 7, 10, 167, 46, 113, 25, + 255, 255, 5, 124, 47, 124, 238, 147, 126, 70, 118, 157, 188, 110, 17, 189, 163, 78, 54, 102, + 128, 121, 193, 17, 208, 236, 44, 99, 239, 81, 82, 229, 236, 100, 143, 181, 232, 194, 62, + 110, 54, 241, 23, 3, 107, 166, 134, 24, 24, 238, 51, 198, 84, 16, 99, 231, 226, 198, 56, 88, + 171, 60, 36, 14, 228, 202, 87, 196, 17, 202, 243, 226, 64, 174, 60, 42, 14, 228, 163, 206, + 163, 71, 91, 243, 218, 210, 163, 45, 121, 255, 56, 144, 247, 255, 10, 244, 104, 235, 189, + 253, 226, 64, 222, 239, 115, 244, 27, 23, 7, 242, 113, 29, 208, 163, 45, 59, 231, 199, 129, + 60, 255, 191, 172, 151, 123, 112, 85, 213, 21, 198, 191, 123, 207, 43, 9, 70, 132, 16, 155, + 164, 144, 208, 66, 9, 146, 130, 60, 68, 138, 128, 64, 196, 0, 145, 71, 98, 76, 202, 163, + 154, 34, 33, 128, 10, 214, 66, 209, 2, 229, 37, 24, 40, 161, 10, 81, 10, 17, 24, 144, 71, + 33, 1, 165, 5, 65, 2, 211, 84, 145, 71, 208, 162, 237, 152, 169, 51, 117, 212, 63, 10, 12, + 210, 14, 78, 161, 142, 242, 184, 167, 223, 218, 123, 159, 155, 155, 4, 200, 31, 122, 103, + 126, 179, 238, 62, 103, 191, 206, 126, 172, 245, 173, 91, 204, 99, 76, 83, 248, 124, 76, + 211, 121, 208, 63, 49, 143, 141, 28, 103, 110, 186, 155, 246, 99, 19, 239, 207, 211, 142, + 162, 229, 233, 139, 188, 203, 255, 204, 47, 252, 82, 83, 254, 216, 212, 251, 61, 89, 71, + 214, 147, 203, 36, 219, 64, 159, 231, 23, 179, 78, 25, 237, 191, 201, 14, 146, 223, 64, 164, + 142, 182, 61, 212, 47, 24, 199, 175, 32, 221, 72, 145, 30, 75, 218, 70, 14, 235, 177, 21, + 102, 204, 200, 62, 221, 254, 250, 30, 51, 223, 152, 114, 228, 78, 114, 86, 143, 167, 198, + 22, 223, 91, 67, 219, 137, 84, 154, 250, 203, 205, 184, 123, 245, 220, 35, 21, 13, 245, 229, + 189, 124, 163, 106, 183, 183, 1, 223, 34, 15, 243, 125, 6, 109, 65, 3, 145, 55, 53, 254, 81, + 218, 215, 201, 39, 228, 4, 57, 105, 254, 167, 155, 245, 144, 111, 62, 40, 125, 53, 248, 5, + 92, 177, 43, 81, 46, 254, 80, 98, 181, 87, 5, 168, 152, 61, 15, 163, 148, 207, 253, 160, 81, + 172, 82, 26, 131, 113, 102, 167, 242, 119, 62, 125, 223, 64, 244, 118, 19, 169, 67, 54, 34, + 91, 116, 131, 248, 112, 103, 138, 170, 191, 210, 41, 97, 108, 2, 245, 9, 181, 130, 210, 11, + 159, 195, 177, 143, 33, 213, 57, 131, 98, 123, 38, 134, 89, 7, 168, 139, 135, 211, 223, 114, + 12, 251, 21, 76, 148, 190, 197, 111, 139, 230, 176, 86, 96, 52, 201, 147, 24, 70, 191, 41, + 177, 240, 33, 250, 220, 178, 132, 253, 74, 191, 220, 193, 58, 237, 236, 115, 156, 239, 122, + 212, 50, 103, 91, 238, 140, 67, 43, 241, 231, 94, 15, 150, 95, 226, 183, 108, 193, 115, 206, + 60, 204, 141, 155, 129, 90, 247, 75, 206, 181, 30, 165, 140, 87, 25, 110, 49, 250, 59, 75, + 48, 34, 200, 109, 221, 25, 136, 119, 110, 163, 46, 48, 182, 85, 8, 147, 227, 219, 243, 121, + 21, 227, 238, 89, 12, 139, 47, 163, 174, 251, 16, 121, 92, 179, 126, 193, 216, 209, 117, + 240, 208, 142, 207, 101, 207, 168, 244, 34, 92, 185, 8, 247, 254, 90, 22, 25, 165, 230, 204, + 249, 82, 135, 217, 118, 22, 245, 24, 53, 147, 138, 215, 143, 114, 77, 74, 212, 124, 198, 72, + 252, 180, 119, 193, 182, 22, 1, 206, 69, 198, 238, 145, 232, 234, 197, 83, 123, 221, 141, + 229, 241, 41, 216, 236, 126, 197, 239, 112, 57, 86, 150, 232, 186, 232, 218, 247, 180, 170, + 208, 197, 155, 138, 94, 78, 25, 186, 56, 133, 220, 163, 44, 234, 230, 127, 113, 157, 31, 65, + 66, 96, 233, 219, 107, 189, 201, 240, 156, 9, 254, 85, 106, 183, 45, 246, 52, 165, 23, 219, + 218, 213, 72, 81, 218, 129, 177, 43, 106, 131, 62, 170, 176, 206, 89, 132, 114, 158, 137, + 30, 77, 117, 77, 160, 163, 162, 154, 194, 81, 123, 92, 24, 140, 17, 253, 30, 90, 137, 159, + 209, 239, 55, 54, 70, 111, 168, 117, 231, 243, 92, 59, 25, 89, 78, 50, 207, 14, 117, 71, 51, + 107, 230, 228, 37, 99, 39, 235, 174, 12, 244, 172, 87, 139, 92, 207, 162, 221, 129, 82, 247, + 5, 20, 56, 163, 185, 46, 73, 40, 240, 142, 162, 173, 55, 28, 41, 162, 207, 60, 79, 233, 186, + 25, 18, 163, 157, 111, 168, 69, 11, 208, 133, 103, 255, 1, 115, 223, 159, 37, 114, 151, 134, + 155, 59, 62, 155, 207, 255, 65, 118, 235, 251, 40, 247, 75, 158, 171, 187, 201, 103, 215, + 43, 205, 243, 39, 200, 124, 50, 93, 191, 151, 119, 254, 66, 253, 255, 250, 69, 221, 191, + 122, 55, 95, 215, 191, 206, 123, 232, 151, 115, 217, 194, 162, 71, 13, 159, 105, 84, 30, + 210, 49, 86, 167, 42, 61, 170, 181, 117, 99, 27, 213, 245, 234, 252, 228, 180, 104, 155, + 232, 207, 155, 89, 185, 195, 60, 35, 73, 81, 61, 28, 232, 201, 230, 182, 130, 118, 90, 80, + 166, 206, 251, 140, 119, 116, 13, 219, 118, 36, 110, 160, 163, 155, 90, 214, 93, 75, 141, + 178, 64, 91, 165, 13, 197, 110, 55, 118, 171, 156, 53, 209, 122, 77, 109, 84, 87, 223, 196, + 222, 76, 191, 198, 232, 88, 125, 207, 2, 171, 117, 245, 178, 38, 246, 49, 99, 187, 4, 250, + 186, 37, 27, 213, 223, 141, 172, 239, 155, 242, 237, 81, 189, 222, 146, 45, 66, 188, 210, + 157, 198, 122, 171, 232, 15, 169, 65, 3, 107, 158, 183, 142, 177, 110, 179, 252, 41, 214, + 170, 61, 129, 101, 116, 172, 232, 247, 92, 209, 215, 246, 102, 106, 209, 91, 32, 231, 78, + 112, 151, 240, 12, 52, 166, 72, 176, 86, 227, 241, 27, 225, 50, 146, 8, 222, 83, 141, 49, + 58, 255, 166, 184, 47, 178, 29, 137, 203, 104, 138, 127, 73, 224, 156, 23, 107, 252, 87, 13, + 23, 12, 175, 9, 86, 8, 16, 236, 213, 77, 241, 47, 41, 36, 119, 187, 1, 238, 70, 142, 75, + 226, 186, 107, 188, 58, 141, 210, 255, 183, 128, 107, 0, 143, 55, 56, 174, 173, 178, 174, + 196, 194, 91, 66, 149, 33, 120, 23, 13, 43, 3, 124, 95, 8, 214, 61, 88, 199, 96, 93, 248, + 109, 103, 249, 221, 211, 162, 115, 14, 198, 55, 253, 126, 219, 125, 252, 182, 251, 242, 93, + 125, 247, 173, 230, 30, 11, 239, 228, 25, 18, 88, 87, 184, 225, 188, 185, 63, 138, 75, 26, + 241, 79, 172, 155, 100, 112, 185, 174, 135, 73, 53, 57, 101, 168, 16, 120, 87, 210, 120, + 111, 255, 103, 77, 225, 121, 34, 177, 109, 154, 157, 131, 85, 204, 77, 5, 83, 150, 187, 40, + 184, 84, 118, 94, 138, 190, 7, 204, 145, 190, 208, 96, 252, 141, 214, 199, 155, 162, 207, + 159, 151, 169, 215, 201, 185, 138, 73, 70, 123, 157, 225, 119, 36, 138, 127, 23, 140, 239, + 235, 28, 159, 135, 45, 202, 23, 20, 33, 67, 124, 11, 227, 174, 220, 243, 158, 246, 219, 40, + 109, 172, 249, 252, 2, 158, 155, 84, 185, 27, 140, 147, 14, 235, 183, 113, 102, 35, 39, 252, + 158, 191, 213, 153, 75, 159, 240, 165, 127, 210, 89, 72, 45, 64, 56, 214, 82, 67, 157, 97, + 179, 214, 126, 254, 27, 180, 247, 169, 117, 238, 143, 67, 180, 187, 98, 97, 110, 155, 46, + 72, 29, 142, 55, 139, 108, 55, 122, 91, 116, 236, 47, 53, 145, 115, 250, 121, 195, 188, 2, + 223, 107, 125, 205, 239, 184, 138, 84, 209, 13, 246, 16, 164, 42, 253, 50, 29, 101, 36, 213, + 186, 192, 247, 212, 11, 252, 134, 229, 214, 36, 12, 149, 152, 97, 221, 75, 109, 69, 253, 33, + 122, 65, 221, 5, 32, 201, 254, 148, 86, 147, 200, 117, 201, 179, 118, 198, 220, 239, 44, 44, + 181, 11, 185, 78, 68, 52, 145, 218, 167, 227, 140, 1, 82, 255, 184, 106, 159, 102, 252, 98, + 87, 25, 203, 122, 146, 126, 252, 159, 200, 8, 95, 96, 61, 190, 99, 187, 229, 210, 135, 179, + 31, 115, 69, 23, 89, 204, 40, 156, 177, 60, 23, 249, 172, 155, 239, 255, 205, 90, 71, 59, + 194, 240, 53, 153, 201, 249, 22, 97, 122, 120, 41, 186, 91, 165, 232, 29, 254, 144, 122, 39, + 153, 207, 159, 33, 79, 243, 127, 10, 109, 107, 50, 158, 108, 32, 115, 208, 75, 61, 191, 202, + 115, 114, 133, 245, 137, 101, 179, 252, 62, 173, 131, 18, 210, 59, 252, 141, 161, 92, 35, + 239, 67, 217, 40, 9, 31, 64, 9, 53, 113, 9, 251, 211, 245, 234, 85, 27, 141, 139, 146, 208, + 59, 106, 172, 18, 43, 155, 253, 177, 94, 152, 153, 146, 69, 69, 97, 37, 155, 255, 46, 223, + 47, 99, 187, 90, 42, 16, 246, 23, 186, 160, 251, 82, 239, 130, 58, 241, 13, 117, 156, 255, + 32, 39, 161, 20, 57, 110, 18, 89, 225, 215, 56, 67, 253, 154, 208, 121, 12, 180, 39, 160, + 13, 247, 52, 145, 244, 229, 94, 159, 54, 249, 131, 232, 168, 15, 8, 87, 203, 223, 196, 242, + 169, 240, 62, 20, 11, 214, 121, 228, 42, 42, 253, 26, 43, 147, 24, 235, 236, 193, 116, 103, + 16, 186, 59, 215, 169, 15, 62, 225, 57, 248, 28, 3, 157, 175, 240, 170, 51, 24, 93, 221, 60, + 198, 177, 221, 144, 179, 52, 128, 72, 110, 87, 106, 207, 242, 175, 241, 220, 21, 132, 235, + 253, 211, 161, 157, 156, 75, 12, 238, 56, 36, 199, 31, 195, 112, 238, 33, 120, 63, 16, 216, + 112, 53, 161, 13, 21, 170, 120, 4, 158, 105, 132, 68, 189, 85, 107, 69, 198, 188, 195, 50, + 119, 77, 233, 92, 111, 24, 158, 231, 61, 206, 33, 218, 23, 105, 173, 213, 142, 109, 19, 228, + 238, 241, 255, 88, 21, 99, 183, 163, 131, 214, 113, 146, 67, 69, 184, 90, 190, 220, 135, 2, + 250, 134, 4, 182, 201, 55, 119, 56, 159, 231, 105, 139, 156, 45, 163, 5, 217, 212, 223, 29, + 254, 187, 228, 181, 126, 191, 112, 154, 95, 19, 206, 67, 186, 105, 59, 81, 231, 165, 254, 2, + 242, 50, 201, 101, 191, 27, 152, 199, 220, 39, 132, 46, 251, 107, 133, 152, 114, 141, 240, + 93, 151, 237, 197, 184, 215, 238, 75, 6, 241, 255, 160, 230, 101, 238, 103, 111, 67, 163, + 189, 117, 215, 224, 126, 193, 30, 204, 122, 194, 4, 116, 179, 42, 165, 173, 222, 235, 150, + 202, 238, 88, 100, 10, 225, 206, 28, 35, 237, 6, 229, 133, 204, 235, 230, 48, 55, 148, 182, + 233, 45, 151, 195, 251, 209, 73, 80, 231, 45, 179, 121, 153, 223, 244, 160, 16, 253, 238, + 150, 202, 137, 60, 91, 36, 56, 111, 209, 51, 125, 179, 239, 159, 229, 139, 70, 206, 97, 92, + 169, 117, 171, 252, 122, 150, 15, 146, 213, 244, 175, 219, 4, 27, 190, 207, 119, 135, 140, + 94, 91, 97, 181, 226, 221, 158, 205, 28, 116, 36, 58, 107, 31, 78, 223, 56, 11, 233, 244, + 95, 233, 118, 57, 207, 30, 117, 191, 238, 15, 73, 244, 77, 217, 226, 27, 233, 231, 175, 73, + 140, 48, 241, 175, 140, 253, 94, 21, 93, 106, 165, 208, 255, 139, 47, 163, 86, 52, 253, 75, + 158, 52, 66, 218, 139, 206, 167, 223, 27, 41, 190, 207, 185, 7, 133, 226, 107, 197, 167, + 170, 152, 65, 45, 42, 121, 26, 253, 77, 137, 248, 150, 112, 29, 250, 132, 175, 105, 31, 20, + 170, 87, 64, 124, 145, 213, 134, 190, 35, 155, 115, 204, 86, 86, 253, 15, 119, 51, 62, 37, + 27, 241, 225, 62, 252, 150, 10, 141, 213, 218, 175, 83, 62, 233, 118, 237, 179, 44, 176, + 191, 183, 196, 159, 49, 254, 106, 127, 213, 193, 74, 211, 254, 43, 252, 145, 246, 65, 225, + 79, 89, 39, 224, 50, 249, 2, 189, 121, 23, 142, 104, 36, 230, 68, 118, 169, 216, 116, 69, + 251, 73, 229, 11, 233, 167, 229, 191, 228, 46, 38, 127, 106, 45, 119, 144, 254, 98, 104, 75, + 122, 201, 104, 203, 234, 38, 246, 112, 96, 91, 210, 133, 166, 77, 181, 105, 211, 188, 254, + 4, 20, 216, 167, 121, 78, 54, 115, 239, 36, 38, 159, 192, 93, 206, 56, 180, 138, 230, 93, + 64, 31, 89, 127, 231, 172, 202, 87, 70, 240, 189, 104, 144, 6, 157, 47, 49, 79, 226, 164, + 218, 39, 238, 81, 33, 53, 209, 5, 132, 154, 230, 5, 118, 61, 10, 100, 111, 157, 33, 104, 43, + 177, 139, 235, 116, 156, 124, 20, 99, 139, 53, 42, 78, 203, 58, 158, 163, 46, 75, 96, 220, + 29, 165, 198, 160, 143, 99, 255, 201, 60, 167, 151, 205, 60, 37, 63, 73, 229, 57, 93, 25, + 205, 253, 130, 92, 46, 200, 53, 128, 1, 246, 38, 108, 179, 166, 82, 11, 245, 196, 8, 19, + 239, 143, 196, 228, 183, 219, 4, 57, 103, 160, 86, 79, 236, 139, 255, 98, 32, 54, 194, 163, + 91, 190, 3, 119, 163, 136, 126, 121, 154, 221, 1, 14, 203, 97, 237, 147, 253, 76, 241, 143, + 205, 127, 137, 125, 67, 225, 144, 21, 178, 97, 209, 189, 59, 112, 217, 71, 28, 226, 145, + 128, 86, 184, 13, 137, 184, 29, 173, 217, 99, 27, 180, 69, 18, 218, 33, 25, 119, 226, 123, + 92, 131, 84, 164, 225, 251, 104, 79, 111, 157, 142, 12, 116, 196, 15, 240, 67, 116, 66, 103, + 252, 8, 93, 144, 137, 174, 184, 11, 221, 144, 133, 31, 163, 59, 122, 112, 54, 61, 209, 139, + 103, 173, 15, 238, 1, 125, 30, 250, 225, 39, 232, 79, 157, 51, 128, 51, 30, 132, 251, 49, + 24, 67, 48, 20, 217, 120, 0, 195, 240, 32, 114, 48, 156, 223, 59, 18, 185, 120, 8, 163, 48, + 26, 99, 48, 22, 121, 200, 199, 195, 40, 192, 35, 40, 228, 151, 253, 20, 227, 48, 30, 19, 48, + 17, 63, 195, 163, 120, 12, 197, 248, 57, 38, 225, 113, 76, 70, 9, 166, 80, 187, 77, 197, 52, + 76, 199, 19, 120, 18, 79, 97, 6, 102, 226, 105, 252, 2, 207, 48, 230, 205, 194, 108, 252, + 10, 115, 240, 44, 158, 195, 175, 49, 23, 243, 48, 31, 191, 193, 2, 44, 196, 34, 44, 198, 18, + 60, 143, 165, 88, 134, 23, 80, 198, 53, 93, 129, 223, 98, 37, 202, 177, 10, 191, 195, 139, + 120, 9, 171, 177, 6, 21, 120, 25, 175, 96, 109, 200, 193, 58, 172, 71, 101, 200, 197, 6, + 174, 248, 166, 144, 135, 205, 216, 130, 215, 176, 21, 219, 176, 29, 59, 240, 135, 80, 28, + 118, 161, 42, 20, 143, 61, 120, 29, 111, 96, 47, 254, 136, 63, 97, 31, 246, 227, 77, 28, + 192, 65, 188, 133, 67, 168, 193, 97, 28, 9, 37, 224, 207, 168, 197, 95, 240, 54, 222, 193, + 81, 188, 139, 99, 56, 142, 19, 56, 137, 58, 156, 194, 123, 120, 31, 127, 197, 105, 252, 159, + 225, 114, 208, 22, 235, 0, 128, 224, 93, 84, 177, 109, 219, 86, 99, 219, 54, 26, 219, 182, + 109, 27, 109, 108, 219, 182, 109, 171, 113, 163, 190, 127, 216, 51, 59, 115, 58, 56, 19, + 156, 13, 206, 7, 23, 130, 139, 193, 165, 224, 114, 112, 37, 184, 26, 92, 11, 174, 7, 55, + 130, 155, 193, 173, 224, 118, 112, 39, 184, 27, 220, 11, 238, 7, 15, 130, 135, 193, 163, + 224, 113, 240, 36, 120, 26, 60, 11, 158, 7, 47, 130, 151, 193, 171, 224, 117, 240, 38, 120, + 27, 178, 141, 119, 193, 251, 224, 67, 240, 49, 248, 20, 124, 14, 190, 32, 52, 194, 4, 223, + 130, 239, 193, 143, 224, 39, 2, 132, 69, 56, 132, 71, 4, 68, 68, 36, 68, 70, 20, 68, 69, 52, + 68, 71, 12, 196, 68, 44, 196, 70, 28, 196, 69, 60, 196, 71, 2, 36, 68, 34, 36, 70, 18, 36, + 69, 50, 36, 71, 10, 164, 68, 42, 164, 70, 26, 164, 69, 58, 164, 71, 6, 100, 68, 38, 100, 70, + 22, 100, 69, 54, 100, 71, 14, 228, 68, 46, 228, 70, 30, 228, 69, 62, 252, 137, 252, 40, 128, + 130, 40, 132, 194, 40, 130, 162, 40, 134, 226, 40, 129, 146, 40, 133, 210, 40, 131, 178, 40, + 135, 242, 168, 128, 138, 168, 132, 202, 168, 130, 170, 168, 134, 234, 168, 129, 154, 168, + 133, 218, 168, 131, 186, 168, 135, 250, 104, 128, 134, 104, 132, 198, 104, 130, 166, 104, + 134, 191, 208, 28, 45, 208, 18, 173, 208, 26, 109, 208, 22, 237, 208, 30, 29, 208, 17, 157, + 208, 25, 93, 208, 21, 221, 208, 29, 61, 208, 19, 189, 208, 27, 125, 208, 23, 253, 208, 31, + 3, 48, 16, 131, 48, 24, 67, 48, 20, 195, 48, 28, 35, 48, 18, 163, 48, 26, 99, 48, 22, 227, + 48, 30, 19, 48, 17, 147, 48, 25, 83, 48, 21, 211, 48, 29, 51, 48, 19, 179, 48, 27, 115, 48, + 23, 243, 48, 31, 11, 176, 16, 139, 176, 24, 75, 176, 20, 203, 240, 55, 254, 193, 114, 172, + 192, 74, 172, 194, 106, 172, 193, 90, 172, 195, 122, 108, 192, 70, 108, 194, 102, 108, 193, + 86, 108, 195, 118, 236, 192, 78, 236, 194, 110, 236, 193, 94, 236, 195, 126, 28, 192, 65, + 28, 194, 97, 28, 193, 81, 28, 195, 113, 156, 192, 73, 156, 194, 105, 156, 193, 89, 156, 195, + 121, 92, 192, 69, 92, 194, 101, 92, 193, 85, 92, 195, 117, 220, 192, 77, 220, 194, 109, 220, + 193, 93, 220, 195, 125, 60, 192, 67, 60, 194, 99, 60, 193, 83, 60, 195, 115, 188, 192, 75, + 188, 194, 107, 188, 193, 91, 252, 139, 119, 120, 143, 15, 248, 136, 79, 248, 140, 47, 248, + 15, 95, 241, 13, 223, 241, 3, 63, 67, 48, 0, 146, 162, 249, 11, 127, 229, 111, 252, 61, 88, + 198, 63, 24, 138, 161, 25, 134, 97, 25, 142, 225, 25, 129, 17, 25, 137, 145, 25, 133, 81, + 25, 141, 209, 25, 131, 49, 131, 185, 140, 197, 216, 140, 195, 184, 140, 199, 248, 76, 192, + 132, 76, 196, 196, 76, 194, 164, 76, 198, 228, 76, 17, 76, 101, 74, 166, 98, 106, 166, 97, + 90, 166, 99, 122, 102, 96, 70, 102, 98, 102, 102, 97, 86, 102, 99, 118, 230, 96, 78, 230, + 98, 110, 230, 97, 94, 230, 227, 159, 204, 207, 2, 44, 200, 66, 44, 204, 34, 44, 202, 98, 44, + 206, 18, 44, 201, 82, 44, 205, 50, 44, 203, 114, 44, 207, 10, 172, 200, 74, 172, 204, 42, + 172, 202, 106, 172, 206, 26, 172, 201, 90, 172, 205, 58, 172, 203, 122, 172, 207, 6, 108, + 200, 70, 108, 204, 38, 108, 202, 102, 252, 139, 205, 217, 130, 45, 217, 138, 173, 217, 134, + 109, 217, 142, 237, 217, 129, 29, 217, 137, 157, 217, 133, 93, 217, 141, 221, 217, 131, 61, + 217, 139, 189, 217, 135, 125, 217, 143, 253, 57, 128, 3, 57, 136, 131, 57, 132, 67, 57, 140, + 195, 57, 130, 35, 57, 138, 163, 57, 134, 99, 57, 142, 227, 57, 129, 19, 57, 137, 147, 57, + 37, 152, 201, 169, 156, 198, 233, 156, 193, 153, 156, 197, 217, 156, 195, 185, 156, 199, + 249, 92, 192, 133, 92, 196, 197, 92, 194, 165, 92, 198, 144, 130, 227, 114, 174, 224, 74, + 174, 226, 106, 174, 225, 90, 174, 227, 122, 110, 224, 70, 110, 226, 102, 110, 225, 86, 110, + 227, 118, 238, 224, 78, 238, 226, 110, 238, 225, 94, 238, 227, 126, 30, 224, 65, 30, 226, + 97, 30, 225, 81, 30, 227, 113, 158, 224, 73, 158, 226, 105, 158, 225, 89, 158, 227, 121, 94, + 224, 69, 94, 226, 101, 94, 225, 85, 94, 227, 117, 222, 224, 77, 222, 226, 109, 222, 225, 93, + 222, 227, 125, 62, 224, 67, 62, 226, 99, 62, 225, 83, 62, 227, 115, 190, 224, 75, 190, 226, + 107, 190, 225, 91, 254, 203, 119, 124, 207, 15, 252, 200, 79, 252, 204, 47, 252, 143, 95, + 249, 141, 223, 249, 131, 63, 21, 8, 162, 36, 235, 23, 253, 170, 223, 244, 187, 254, 80, 40, + 133, 86, 24, 133, 85, 56, 133, 87, 4, 69, 84, 36, 69, 86, 20, 69, 85, 52, 69, 87, 12, 197, + 84, 44, 197, 86, 28, 197, 85, 60, 197, 87, 2, 37, 84, 34, 37, 86, 18, 37, 85, 50, 37, 87, + 10, 165, 84, 42, 165, 86, 26, 165, 85, 58, 165, 87, 6, 101, 84, 38, 101, 86, 22, 101, 85, + 54, 101, 87, 14, 229, 84, 46, 229, 86, 30, 229, 85, 62, 253, 169, 252, 42, 160, 130, 42, + 164, 194, 42, 162, 162, 42, 166, 226, 42, 161, 146, 42, 165, 210, 42, 163, 178, 42, 167, + 242, 170, 160, 138, 170, 164, 202, 170, 162, 170, 170, 166, 234, 170, 161, 154, 170, 165, + 218, 170, 163, 186, 170, 167, 250, 106, 160, 134, 106, 164, 198, 106, 162, 166, 33, 255, + 184, 83, 127, 169, 185, 90, 168, 165, 90, 169, 181, 218, 168, 173, 218, 169, 189, 58, 168, + 163, 58, 169, 179, 186, 168, 171, 186, 169, 187, 122, 168, 167, 122, 169, 183, 250, 168, + 175, 250, 169, 191, 6, 104, 160, 6, 105, 176, 134, 104, 168, 134, 105, 184, 70, 104, 164, + 70, 105, 180, 198, 104, 172, 198, 105, 188, 38, 104, 162, 38, 105, 178, 166, 104, 170, 166, + 105, 186, 102, 104, 166, 102, 105, 182, 230, 104, 174, 230, 105, 190, 22, 104, 161, 22, 105, + 177, 150, 104, 169, 150, 233, 111, 253, 163, 229, 90, 161, 149, 90, 165, 213, 90, 163, 181, + 90, 167, 245, 218, 160, 141, 218, 164, 205, 218, 162, 173, 218, 166, 237, 218, 161, 157, + 218, 165, 221, 218, 163, 189, 218, 167, 253, 58, 160, 131, 58, 164, 195, 58, 162, 163, 58, + 166, 227, 58, 161, 147, 58, 165, 211, 58, 163, 179, 58, 167, 243, 186, 160, 139, 186, 164, + 203, 186, 162, 171, 186, 166, 235, 186, 161, 155, 186, 165, 219, 186, 163, 187, 186, 167, + 251, 122, 160, 135, 122, 164, 199, 122, 162, 167, 122, 166, 231, 122, 161, 151, 122, 165, + 215, 122, 163, 183, 250, 87, 239, 244, 94, 31, 244, 81, 159, 244, 89, 95, 244, 159, 190, + 234, 155, 190, 235, 135, 66, 98, 201, 48, 45, 219, 191, 248, 87, 255, 230, 223, 253, 135, + 67, 57, 180, 195, 56, 172, 195, 57, 188, 35, 56, 162, 35, 57, 178, 163, 56, 170, 163, 57, + 186, 99, 56, 166, 99, 57, 182, 227, 56, 174, 227, 57, 190, 19, 56, 161, 19, 57, 177, 147, + 56, 169, 147, 57, 185, 83, 56, 165, 83, 57, 181, 211, 56, 173, 211, 57, 189, 51, 56, 163, + 51, 57, 179, 179, 56, 171, 179, 57, 187, 115, 56, 167, 115, 57, 183, 243, 56, 175, 67, 76, + 222, 249, 93, 192, 5, 93, 200, 133, 93, 196, 69, 93, 204, 197, 93, 194, 37, 93, 202, 165, + 93, 198, 101, 93, 206, 229, 93, 193, 21, 93, 201, 149, 93, 197, 85, 93, 205, 213, 93, 195, + 53, 93, 203, 181, 93, 199, 117, 93, 207, 245, 221, 192, 13, 221, 200, 141, 221, 196, 77, + 221, 44, 196, 115, 154, 187, 133, 91, 186, 149, 91, 187, 141, 219, 186, 157, 219, 187, 131, + 59, 186, 147, 59, 187, 139, 187, 186, 155, 187, 187, 135, 123, 186, 151, 123, 187, 143, 251, + 186, 159, 251, 123, 128, 7, 122, 144, 7, 123, 136, 135, 122, 152, 135, 123, 132, 71, 122, + 148, 71, 123, 140, 199, 122, 156, 199, 123, 130, 39, 122, 146, 39, 123, 138, 167, 122, 154, + 167, 123, 134, 103, 122, 150, 103, 123, 142, 231, 122, 158, 231, 123, 129, 23, 122, 145, 23, + 123, 137, 151, 122, 153, 255, 246, 63, 94, 238, 21, 94, 233, 85, 94, 237, 53, 94, 235, 117, + 94, 239, 13, 222, 232, 77, 222, 236, 45, 222, 234, 109, 222, 238, 29, 222, 233, 93, 222, + 237, 61, 222, 235, 125, 222, 239, 3, 62, 232, 67, 62, 236, 35, 62, 234, 99, 62, 238, 19, 62, + 233, 83, 62, 237, 51, 62, 235, 115, 62, 239, 11, 190, 232, 75, 190, 236, 43, 190, 234, 107, + 190, 238, 27, 190, 249, 63, 65, 240, 0, 0, 212, 1, 64, 1, 48, 252, 135, 108, 219, 45, 219, + 181, 108, 219, 182, 109, 44, 219, 182, 185, 92, 91, 182, 109, 183, 108, 219, 216, 93, 112, + 43, 184, 29, 220, 9, 238, 6, 247, 130, 251, 193, 131, 224, 97, 240, 40, 120, 28, 60, 9, 158, + 6, 207, 130, 231, 193, 139, 224, 101, 240, 42, 120, 29, 188, 9, 222, 6, 239, 130, 247, 193, + 135, 224, 99, 240, 41, 248, 28, 124, 9, 190, 6, 223, 130, 239, 193, 143, 224, 103, 240, 43, + 248, 141, 16, 8, 137, 80, 8, 141, 0, 0, 33, 24, 97, 16, 22, 225, 16, 30, 17, 16, 17, 145, + 16, 25, 81, 16, 21, 209, 16, 29, 49, 16, 19, 177, 16, 27, 113, 16, 23, 241, 16, 31, 9, 144, + 16, 137, 144, 24, 73, 144, 20, 201, 144, 28, 41, 144, 18, 169, 144, 26, 127, 32, 13, 210, + 34, 29, 210, 35, 3, 50, 34, 19, 50, 35, 11, 178, 34, 27, 178, 35, 7, 114, 34, 23, 114, 35, + 15, 242, 34, 31, 242, 163, 0, 254, 68, 65, 20, 66, 97, 20, 65, 81, 20, 67, 113, 148, 64, 73, + 148, 66, 105, 148, 65, 89, 148, 67, 121, 84, 64, 69, 84, 66, 101, 84, 65, 85, 84, 67, 117, + 212, 64, 77, 212, 66, 109, 212, 65, 93, 212, 67, 125, 52, 64, 67, 52, 66, 99, 52, 65, 83, + 52, 67, 115, 180, 64, 75, 180, 66, 107, 180, 65, 91, 180, 67, 123, 116, 64, 71, 116, 66, + 103, 116, 65, 87, 116, 67, 119, 244, 64, 79, 244, 66, 111, 244, 65, 95, 244, 67, 127, 12, + 192, 95, 24, 136, 65, 24, 140, 33, 24, 138, 97, 24, 142, 17, 24, 137, 81, 24, 141, 49, 24, + 139, 113, 24, 143, 9, 152, 136, 73, 152, 140, 41, 152, 138, 105, 152, 142, 25, 152, 137, 89, + 152, 141, 57, 152, 139, 121, 152, 143, 5, 88, 136, 69, 88, 140, 37, 88, 138, 101, 88, 142, + 21, 88, 137, 85, 248, 27, 171, 177, 6, 107, 177, 14, 235, 177, 1, 27, 177, 9, 155, 241, 15, + 254, 197, 22, 108, 197, 54, 108, 199, 14, 236, 196, 46, 236, 198, 30, 236, 197, 62, 236, + 199, 1, 28, 196, 33, 28, 198, 17, 28, 197, 49, 28, 199, 9, 156, 196, 41, 156, 198, 25, 156, + 197, 57, 156, 199, 5, 92, 196, 37, 92, 198, 21, 92, 197, 53, 92, 199, 13, 220, 196, 127, + 184, 133, 219, 184, 131, 187, 184, 135, 251, 120, 128, 135, 120, 132, 199, 120, 130, 167, + 120, 134, 231, 120, 129, 151, 120, 133, 215, 120, 131, 183, 120, 135, 247, 248, 128, 143, + 248, 132, 207, 248, 130, 175, 248, 134, 239, 248, 129, 159, 248, 133, 223, 12, 193, 144, 12, + 197, 208, 12, 8, 146, 162, 25, 134, 97, 25, 142, 225, 25, 129, 17, 25, 137, 145, 25, 133, + 81, 25, 141, 209, 25, 131, 49, 25, 139, 177, 25, 135, 113, 25, 143, 241, 153, 128, 9, 153, + 136, 137, 153, 132, 73, 153, 140, 201, 153, 130, 41, 153, 138, 169, 249, 7, 211, 48, 45, + 211, 49, 61, 51, 48, 35, 51, 49, 51, 179, 48, 43, 179, 49, 59, 115, 48, 39, 115, 49, 55, + 243, 48, 47, 243, 49, 63, 11, 240, 79, 22, 100, 33, 22, 102, 17, 22, 101, 49, 22, 103, 9, + 150, 100, 41, 150, 102, 25, 150, 101, 57, 150, 103, 5, 86, 100, 37, 86, 102, 21, 86, 101, + 53, 86, 103, 13, 214, 100, 45, 214, 102, 29, 214, 101, 61, 214, 103, 3, 54, 100, 35, 54, + 102, 19, 54, 101, 51, 54, 103, 11, 182, 100, 43, 182, 102, 27, 182, 101, 59, 182, 103, 7, + 118, 100, 39, 118, 102, 23, 118, 101, 55, 118, 103, 15, 246, 100, 47, 246, 102, 31, 246, + 101, 63, 246, 231, 0, 254, 197, 129, 28, 196, 193, 28, 194, 161, 28, 198, 225, 28, 193, 145, + 28, 197, 209, 28, 195, 177, 28, 199, 241, 156, 192, 137, 156, 196, 201, 156, 194, 169, 156, + 198, 233, 156, 193, 153, 156, 197, 217, 156, 195, 185, 156, 199, 249, 92, 192, 133, 92, 196, + 197, 92, 194, 165, 92, 198, 229, 92, 193, 149, 92, 197, 191, 185, 154, 107, 184, 150, 235, + 184, 158, 27, 184, 145, 155, 184, 153, 255, 240, 95, 110, 225, 86, 110, 227, 118, 238, 224, + 78, 238, 226, 110, 238, 225, 94, 238, 227, 126, 30, 224, 65, 30, 226, 97, 30, 225, 81, 30, + 227, 113, 158, 224, 73, 158, 226, 105, 158, 225, 89, 158, 227, 121, 94, 224, 69, 94, 226, + 101, 94, 225, 85, 94, 227, 117, 222, 224, 77, 254, 199, 91, 188, 205, 59, 188, 203, 123, + 188, 207, 7, 124, 200, 71, 124, 204, 39, 124, 202, 103, 124, 206, 23, 124, 201, 87, 124, + 205, 55, 124, 203, 119, 124, 207, 15, 252, 200, 79, 252, 204, 47, 252, 202, 111, 252, 206, + 31, 252, 201, 95, 252, 173, 16, 10, 169, 80, 10, 173, 64, 16, 37, 89, 97, 20, 86, 225, 20, + 94, 17, 20, 81, 145, 20, 89, 81, 20, 85, 209, 20, 93, 49, 20, 83, 177, 20, 91, 113, 20, 87, + 241, 20, 95, 9, 148, 80, 137, 148, 88, 73, 148, 84, 201, 148, 92, 41, 148, 82, 169, 148, 90, + 127, 40, 141, 210, 42, 157, 210, 43, 131, 50, 42, 147, 50, 43, 139, 178, 42, 155, 178, 43, + 135, 114, 42, 151, 114, 43, 143, 242, 42, 159, 242, 171, 128, 254, 84, 65, 21, 82, 97, 21, + 81, 81, 21, 83, 113, 149, 80, 73, 149, 82, 105, 149, 81, 89, 149, 83, 121, 85, 80, 69, 85, + 82, 101, 85, 81, 85, 85, 83, 117, 213, 80, 77, 213, 82, 109, 213, 81, 93, 213, 83, 125, 53, + 80, 67, 53, 82, 99, 53, 81, 83, 53, 83, 115, 181, 80, 75, 181, 82, 107, 181, 81, 91, 181, + 83, 123, 117, 80, 71, 117, 82, 103, 117, 81, 87, 117, 83, 119, 245, 80, 79, 245, 82, 111, + 245, 81, 95, 245, 83, 127, 13, 208, 95, 26, 168, 65, 26, 172, 33, 26, 170, 97, 26, 174, 17, + 26, 169, 81, 26, 173, 49, 26, 171, 113, 26, 175, 9, 154, 168, 73, 154, 172, 41, 154, 170, + 105, 154, 174, 25, 154, 169, 89, 154, 173, 57, 154, 171, 121, 154, 175, 5, 90, 168, 69, 90, + 172, 37, 90, 170, 101, 90, 174, 21, 90, 169, 85, 250, 91, 171, 181, 70, 107, 181, 78, 235, + 181, 65, 27, 181, 73, 155, 245, 143, 254, 213, 22, 109, 213, 54, 109, 215, 14, 237, 212, 46, + 237, 214, 30, 237, 213, 62, 237, 215, 1, 29, 212, 33, 29, 214, 17, 29, 213, 49, 29, 215, 9, + 157, 212, 41, 157, 214, 25, 157, 213, 57, 157, 215, 5, 93, 212, 37, 93, 214, 21, 93, 213, + 53, 93, 215, 13, 221, 212, 127, 186, 165, 219, 186, 163, 187, 186, 167, 251, 122, 160, 135, + 122, 164, 199, 122, 162, 167, 122, 166, 231, 122, 161, 151, 122, 165, 215, 122, 163, 183, + 122, 167, 247, 250, 160, 143, 250, 164, 207, 250, 162, 175, 250, 166, 239, 250, 161, 159, + 250, 165, 223, 14, 225, 144, 14, 229, 208, 14, 12, 211, 178, 29, 198, 97, 29, 206, 225, 29, + 193, 17, 29, 201, 145, 29, 197, 81, 29, 205, 209, 29, 195, 49, 29, 203, 177, 29, 199, 113, + 29, 207, 241, 157, 192, 9, 157, 200, 137, 157, 196, 73, 157, 204, 201, 157, 194, 41, 157, + 202, 169, 253, 135, 211, 56, 173, 211, 57, 189, 51, 56, 163, 51, 57, 179, 179, 56, 171, 179, + 57, 187, 115, 56, 167, 115, 57, 183, 243, 56, 175, 243, 57, 191, 11, 248, 79, 23, 116, 33, + 23, 118, 17, 23, 117, 49, 23, 119, 9, 151, 116, 41, 151, 118, 25, 151, 117, 57, 151, 119, 5, + 87, 116, 37, 87, 118, 21, 87, 117, 53, 87, 119, 13, 215, 116, 45, 215, 118, 29, 215, 117, + 61, 215, 119, 3, 55, 116, 35, 55, 118, 19, 55, 117, 51, 55, 119, 11, 183, 116, 43, 183, 118, + 27, 183, 117, 59, 183, 119, 7, 119, 116, 39, 119, 118, 23, 119, 117, 55, 119, 119, 15, 247, + 116, 47, 247, 118, 31, 247, 117, 63, 247, 247, 0, 255, 229, 129, 30, 228, 193, 30, 226, 161, + 30, 230, 225, 30, 225, 145, 30, 229, 209, 30, 227, 177, 30, 231, 241, 158, 224, 137, 158, + 228, 201, 158, 226, 169, 158, 230, 233, 158, 225, 153, 158, 229, 217, 158, 227, 185, 158, + 231, 249, 94, 224, 133, 94, 228, 197, 94, 226, 165, 94, 230, 229, 94, 225, 149, 94, 229, + 191, 189, 218, 107, 188, 214, 235, 188, 222, 27, 188, 209, 155, 188, 217, 255, 248, 95, 111, + 241, 86, 111, 243, 118, 239, 240, 78, 239, 242, 110, 239, 241, 94, 239, 243, 126, 31, 240, + 65, 31, 242, 97, 31, 241, 81, 31, 243, 113, 159, 240, 73, 159, 242, 105, 159, 241, 89, 159, + 243, 121, 95, 240, 69, 95, 242, 101, 95, 241, 85, 95, 243, 117, 223, 240, 77, 255, 79, 16, + 60, 0, 0, 117, 0, 80, 0, 204, 253, 135, 108, 219, 182, 91, 182, 107, 217, 182, 173, 45, 219, + 182, 221, 218, 178, 109, 219, 182, 109, 239, 238, 102, 112, 43, 184, 29, 220, 9, 238, 6, + 247, 130, 251, 193, 131, 224, 97, 240, 40, 120, 28, 60, 9, 158, 6, 207, 130, 231, 193, 139, + 224, 101, 240, 42, 120, 29, 188, 9, 222, 6, 239, 130, 247, 193, 135, 224, 99, 240, 41, 248, + 28, 124, 9, 190, 6, 223, 130, 239, 193, 143, 224, 103, 240, 43, 248, 141, 16, 8, 137, 80, 8, + 141, 48, 8, 139, 112, 8, 143, 0, 0, 33, 24, 17, 16, 17, 145, 16, 25, 81, 16, 21, 209, 16, + 29, 49, 16, 19, 177, 16, 27, 113, 16, 23, 241, 16, 31, 9, 144, 16, 137, 144, 24, 73, 144, + 20, 201, 144, 28, 41, 144, 18, 169, 144, 26, 105, 144, 22, 233, 144, 30, 25, 144, 17, 153, + 144, 25, 89, 144, 21, 217, 144, 29, 57, 144, 19, 185, 144, 27, 121, 144, 23, 249, 144, 31, + 5, 80, 16, 127, 160, 16, 10, 163, 8, 138, 162, 24, 138, 163, 4, 74, 162, 20, 74, 163, 12, + 202, 162, 28, 202, 163, 2, 42, 162, 18, 42, 163, 10, 170, 162, 26, 254, 68, 117, 212, 64, + 77, 212, 66, 109, 212, 65, 93, 212, 67, 125, 52, 64, 67, 52, 66, 99, 52, 65, 83, 52, 67, + 115, 180, 64, 75, 180, 66, 107, 180, 65, 91, 180, 67, 123, 116, 64, 71, 116, 66, 103, 116, + 65, 87, 116, 67, 119, 244, 64, 79, 244, 66, 111, 244, 65, 95, 244, 67, 127, 252, 133, 191, + 49, 0, 3, 49, 8, 131, 49, 4, 67, 49, 12, 195, 49, 2, 35, 49, 10, 163, 49, 6, 99, 49, 14, + 227, 49, 1, 19, 49, 9, 147, 49, 5, 83, 49, 13, 211, 49, 3, 51, 49, 11, 179, 49, 7, 115, 49, + 15, 243, 177, 0, 11, 177, 8, 139, 177, 4, 75, 177, 12, 203, 177, 2, 43, 177, 10, 171, 241, + 15, 214, 224, 95, 252, 135, 181, 88, 135, 245, 216, 128, 141, 216, 132, 205, 216, 130, 173, + 216, 134, 237, 216, 129, 157, 216, 133, 221, 216, 131, 189, 216, 135, 253, 56, 128, 131, 56, + 132, 195, 56, 130, 163, 56, 134, 227, 56, 129, 147, 56, 133, 211, 56, 131, 179, 56, 135, + 243, 184, 128, 139, 184, 132, 203, 184, 130, 171, 184, 134, 235, 184, 129, 155, 184, 133, + 219, 184, 131, 187, 184, 135, 251, 120, 128, 135, 120, 132, 199, 120, 130, 167, 120, 134, + 231, 120, 129, 151, 120, 133, 215, 120, 131, 183, 120, 135, 247, 248, 128, 143, 248, 132, + 207, 248, 130, 175, 248, 134, 239, 248, 129, 159, 248, 133, 223, 12, 193, 144, 12, 197, 208, + 12, 195, 176, 12, 199, 240, 12, 8, 146, 162, 25, 129, 17, 25, 137, 145, 25, 133, 81, 25, + 141, 209, 25, 131, 49, 25, 139, 177, 25, 135, 113, 25, 143, 241, 153, 128, 9, 153, 136, 137, + 153, 132, 73, 153, 140, 201, 153, 130, 41, 153, 138, 169, 153, 134, 105, 153, 142, 233, 153, + 129, 25, 153, 137, 153, 153, 133, 89, 153, 141, 217, 153, 131, 57, 153, 139, 185, 153, 135, + 121, 153, 143, 249, 89, 128, 5, 249, 7, 11, 177, 48, 139, 176, 40, 139, 177, 56, 75, 176, + 36, 75, 177, 52, 203, 176, 44, 203, 177, 60, 43, 176, 34, 43, 177, 50, 171, 176, 42, 171, + 241, 79, 86, 103, 13, 214, 100, 45, 214, 102, 29, 214, 101, 61, 214, 103, 3, 54, 100, 35, + 54, 102, 19, 54, 101, 51, 54, 103, 11, 182, 100, 43, 182, 102, 27, 182, 101, 59, 182, 103, + 7, 118, 100, 39, 118, 102, 23, 118, 101, 55, 118, 103, 15, 246, 100, 47, 246, 102, 31, 246, + 101, 63, 246, 231, 95, 252, 155, 3, 56, 144, 131, 56, 152, 67, 56, 148, 195, 56, 156, 35, + 56, 146, 163, 56, 154, 99, 56, 150, 227, 56, 158, 19, 56, 145, 147, 56, 153, 83, 56, 149, + 211, 56, 157, 51, 56, 147, 179, 56, 155, 115, 56, 151, 243, 56, 159, 11, 184, 144, 139, 184, + 152, 75, 184, 148, 203, 184, 156, 43, 184, 146, 171, 184, 154, 255, 112, 13, 255, 229, 127, + 92, 203, 117, 92, 207, 13, 220, 200, 77, 220, 204, 45, 220, 202, 109, 220, 206, 29, 220, + 201, 93, 220, 205, 61, 220, 203, 125, 220, 207, 3, 60, 200, 67, 60, 204, 35, 60, 202, 99, + 60, 206, 19, 60, 201, 83, 60, 205, 51, 60, 203, 115, 60, 207, 11, 188, 200, 75, 188, 204, + 43, 188, 202, 107, 188, 206, 27, 188, 201, 91, 188, 205, 59, 188, 203, 123, 188, 207, 7, + 124, 200, 71, 124, 204, 39, 124, 202, 103, 124, 206, 23, 124, 201, 87, 124, 205, 55, 124, + 203, 119, 124, 207, 15, 252, 200, 79, 252, 204, 47, 252, 202, 111, 252, 206, 31, 252, 201, + 95, 252, 173, 16, 10, 169, 80, 10, 173, 48, 10, 171, 112, 10, 175, 64, 16, 37, 89, 17, 20, + 81, 145, 20, 89, 81, 20, 85, 209, 20, 93, 49, 20, 83, 177, 20, 91, 113, 20, 87, 241, 20, 95, + 9, 148, 80, 137, 148, 88, 73, 148, 84, 201, 148, 92, 41, 148, 82, 169, 148, 90, 105, 148, + 86, 233, 148, 94, 25, 148, 81, 153, 148, 89, 89, 148, 85, 217, 148, 93, 57, 148, 83, 185, + 148, 91, 121, 148, 87, 249, 148, 95, 5, 84, 80, 127, 168, 144, 10, 171, 136, 138, 170, 152, + 138, 171, 132, 74, 170, 148, 74, 171, 140, 202, 170, 156, 202, 171, 130, 42, 170, 146, 42, + 171, 138, 170, 170, 154, 254, 84, 117, 213, 80, 77, 213, 82, 109, 213, 81, 93, 213, 83, 125, + 53, 80, 67, 53, 82, 99, 53, 81, 83, 53, 83, 115, 181, 80, 75, 181, 82, 107, 181, 81, 91, + 181, 83, 123, 117, 80, 71, 117, 82, 103, 117, 81, 87, 117, 83, 119, 245, 80, 79, 245, 82, + 111, 245, 81, 95, 245, 83, 127, 253, 165, 191, 53, 64, 3, 53, 72, 131, 53, 68, 67, 53, 76, + 195, 53, 66, 35, 53, 74, 163, 53, 70, 99, 53, 78, 227, 53, 65, 19, 53, 73, 147, 53, 69, 83, + 53, 77, 211, 53, 67, 51, 53, 75, 179, 53, 71, 115, 53, 79, 243, 181, 64, 11, 181, 72, 139, + 181, 68, 75, 181, 76, 203, 181, 66, 43, 181, 74, 171, 245, 143, 214, 232, 95, 253, 167, 181, + 90, 167, 245, 218, 160, 141, 218, 164, 205, 218, 162, 173, 218, 166, 237, 218, 161, 157, + 218, 165, 221, 218, 163, 189, 218, 167, 253, 58, 160, 131, 58, 164, 195, 58, 162, 163, 58, + 166, 227, 58, 161, 147, 58, 165, 211, 58, 163, 179, 58, 167, 243, 186, 160, 139, 186, 164, + 203, 186, 162, 171, 186, 166, 235, 186, 161, 155, 186, 165, 219, 186, 163, 187, 186, 167, + 251, 122, 160, 135, 122, 164, 199, 122, 162, 167, 122, 166, 231, 122, 161, 151, 122, 165, + 215, 122, 163, 183, 122, 167, 247, 250, 160, 143, 250, 164, 207, 250, 162, 175, 250, 166, + 239, 250, 161, 159, 250, 165, 223, 14, 225, 144, 14, 229, 208, 14, 227, 176, 14, 231, 240, + 14, 12, 211, 178, 29, 193, 17, 29, 201, 145, 29, 197, 81, 29, 205, 209, 29, 195, 49, 29, + 203, 177, 29, 199, 113, 29, 207, 241, 157, 192, 9, 157, 200, 137, 157, 196, 73, 157, 204, + 201, 157, 194, 41, 157, 202, 169, 157, 198, 105, 157, 206, 233, 157, 193, 25, 157, 201, 153, + 157, 197, 89, 157, 205, 217, 157, 195, 57, 157, 203, 185, 157, 199, 121, 157, 207, 249, 93, + 192, 5, 253, 135, 11, 185, 176, 139, 184, 168, 139, 185, 184, 75, 184, 164, 75, 185, 180, + 203, 184, 172, 203, 185, 188, 43, 184, 162, 43, 185, 178, 171, 184, 170, 171, 249, 79, 87, + 119, 13, 215, 116, 45, 215, 118, 29, 215, 117, 61, 215, 119, 3, 55, 116, 35, 55, 118, 19, + 55, 117, 51, 55, 119, 11, 183, 116, 43, 183, 118, 27, 183, 117, 59, 183, 119, 7, 119, 116, + 39, 119, 118, 23, 119, 117, 55, 119, 119, 15, 247, 116, 47, 247, 118, 31, 247, 117, 63, 247, + 247, 95, 254, 219, 3, 60, 208, 131, 60, 216, 67, 60, 212, 195, 60, 220, 35, 60, 210, 163, + 60, 218, 99, 60, 214, 227, 60, 222, 19, 60, 209, 147, 60, 217, 83, 60, 213, 211, 60, 221, + 51, 60, 211, 179, 60, 219, 115, 60, 215, 243, 60, 223, 11, 188, 208, 139, 188, 216, 75, 188, + 212, 203, 188, 220, 43, 188, 210, 171, 188, 218, 255, 120, 141, 255, 245, 127, 94, 235, 117, + 94, 239, 13, 222, 232, 77, 222, 236, 45, 222, 234, 109, 222, 238, 29, 222, 233, 93, 222, + 237, 61, 222, 235, 125, 222, 239, 3, 62, 232, 67, 62, 236, 35, 62, 234, 99, 62, 238, 19, 62, + 233, 83, 62, 237, 51, 62, 235, 115, 62, 239, 11, 190, 232, 75, 190, 236, 43, 190, 234, 107, + 190, 238, 27, 255, 115, 93, 94, 239, 109, 227, 88, 20, 223, 181, 90, 36, 1, 227, 153, 221, + 217, 222, 123, 207, 138, 13, 162, 182, 60, 200, 34, 153, 241, 76, 54, 206, 151, 196, 95, + 118, 242, 6, 75, 176, 132, 9, 69, 106, 88, 236, 36, 255, 235, 246, 222, 123, 175, 32, 113, + 32, 33, 121, 209, 57, 0, 129, 251, 187, 184, 36, 64, 138, 124, 135, 124, 151, 124, 143, 124, + 159, 252, 128, 252, 144, 252, 136, 252, 152, 252, 132, 252, 148, 252, 140, 252, 156, 252, + 130, 252, 146, 252, 138, 252, 154, 252, 134, 252, 150, 252, 142, 252, 158, 252, 129, 252, + 145, 252, 137, 252, 153, 252, 133, 252, 149, 252, 141, 252, 157, 252, 131, 252, 147, 252, + 139, 252, 155, 252, 135, 252, 151, 252, 143, 190, 131, 190, 147, 30, 209, 14, 237, 210, 30, + 237, 211, 1, 189, 65, 135, 116, 68, 199, 148, 80, 74, 95, 162, 199, 244, 101, 250, 10, 125, + 23, 125, 55, 125, 149, 190, 135, 190, 151, 190, 143, 190, 159, 126, 128, 126, 144, 126, 136, + 126, 152, 126, 132, 126, 148, 126, 140, 126, 156, 126, 130, 126, 146, 126, 138, 126, 154, + 126, 134, 126, 150, 126, 142, 126, 158, 126, 129, 126, 145, 126, 137, 126, 153, 126, 133, + 222, 164, 95, 165, 19, 234, 80, 151, 122, 212, 167, 1, 101, 116, 74, 67, 58, 163, 95, 163, + 95, 167, 223, 160, 223, 236, 175, 211, 167, 187, 205, 164, 155, 213, 105, 122, 180, 184, + 215, 217, 214, 78, 103, 39, 157, 206, 217, 102, 59, 168, 51, 233, 186, 19, 54, 16, 169, 220, + 149, 178, 236, 198, 117, 145, 143, 78, 87, 121, 197, 151, 75, 145, 85, 55, 238, 47, 229, 74, + 166, 41, 239, 175, 150, 69, 206, 171, 97, 126, 37, 138, 114, 153, 23, 162, 191, 149, 43, 53, + 172, 63, 191, 40, 196, 149, 232, 243, 86, 6, 243, 124, 157, 103, 226, 241, 128, 107, 237, + 71, 75, 94, 228, 153, 154, 220, 74, 212, 198, 24, 196, 24, 36, 48, 40, 214, 87, 133, 150, + 219, 124, 89, 87, 162, 159, 106, 185, 173, 59, 211, 86, 186, 183, 21, 177, 155, 54, 216, 59, + 250, 114, 166, 229, 142, 30, 149, 181, 66, 207, 54, 117, 182, 230, 69, 189, 77, 121, 93, + 209, 220, 110, 245, 239, 233, 9, 133, 150, 123, 122, 94, 161, 229, 190, 238, 44, 91, 33, 15, + 150, 249, 118, 203, 117, 25, 72, 101, 53, 250, 15, 244, 240, 170, 149, 222, 121, 33, 179, + 117, 175, 110, 126, 233, 249, 115, 228, 250, 57, 242, 35, 29, 253, 89, 43, 163, 71, 251, 18, + 143, 158, 237, 109, 239, 22, 87, 148, 222, 131, 141, 168, 120, 231, 238, 70, 246, 120, 186, + 219, 240, 222, 74, 164, 21, 31, 8, 117, 127, 82, 197, 43, 229, 122, 203, 59, 21, 175, 59, + 187, 141, 164, 117, 182, 194, 13, 89, 93, 164, 67, 241, 100, 153, 242, 109, 227, 178, 178, + 222, 137, 66, 230, 69, 127, 39, 74, 21, 110, 200, 139, 34, 191, 78, 197, 101, 53, 104, 93, + 189, 27, 181, 90, 200, 245, 166, 210, 23, 87, 249, 117, 166, 221, 69, 94, 109, 134, 24, 182, + 202, 200, 222, 93, 148, 98, 148, 23, 213, 166, 185, 111, 60, 37, 50, 171, 20, 91, 44, 43, + 153, 103, 99, 241, 118, 45, 175, 120, 42, 178, 165, 232, 109, 242, 186, 20, 84, 61, 16, 105, + 190, 150, 75, 158, 102, 121, 53, 106, 6, 175, 11, 158, 86, 187, 189, 189, 168, 218, 199, 47, + 152, 76, 160, 46, 116, 161, 213, 65, 191, 227, 67, 67, 40, 174, 187, 232, 119, 209, 246, + 208, 246, 208, 14, 48, 63, 112, 160, 136, 31, 120, 80, 140, 15, 2, 40, 131, 78, 161, 224, 5, + 51, 232, 28, 122, 2, 53, 156, 8, 26, 67, 19, 173, 12, 124, 6, 62, 3, 159, 129, 207, 192, + 103, 224, 51, 240, 25, 248, 12, 124, 6, 62, 3, 159, 129, 207, 20, 127, 119, 145, 230, 203, + 199, 3, 117, 111, 26, 237, 233, 86, 122, 169, 181, 168, 208, 174, 202, 13, 95, 137, 94, 251, + 59, 88, 61, 110, 117, 120, 169, 246, 181, 122, 106, 242, 39, 35, 237, 10, 117, 39, 7, 85, + 33, 249, 186, 222, 105, 45, 208, 94, 101, 90, 211, 203, 254, 82, 22, 203, 84, 12, 101, 118, + 117, 161, 78, 19, 81, 53, 14, 125, 229, 86, 170, 231, 139, 47, 133, 122, 48, 174, 246, 141, + 78, 89, 103, 253, 75, 177, 85, 143, 70, 183, 249, 233, 149, 59, 5, 239, 46, 211, 250, 162, + 183, 17, 92, 33, 86, 146, 111, 243, 108, 53, 222, 214, 37, 30, 22, 241, 146, 229, 213, 211, + 124, 116, 250, 250, 145, 124, 107, 156, 241, 93, 94, 86, 69, 190, 219, 52, 167, 79, 214, + 238, 85, 177, 84, 83, 219, 114, 56, 19, 93, 70, 199, 65, 121, 231, 40, 251, 28, 101, 155, + 163, 108, 139, 100, 148, 239, 68, 166, 243, 31, 204, 183, 92, 157, 74, 217, 128, 107, 29, + 47, 154, 213, 212, 219, 203, 84, 60, 25, 47, 15, 126, 180, 56, 108, 216, 229, 222, 14, 98, + 204, 22, 90, 251, 177, 62, 13, 69, 43, 163, 248, 48, 71, 236, 237, 248, 150, 69, 88, 91, + 132, 91, 135, 209, 235, 189, 37, 183, 236, 99, 104, 109, 53, 198, 175, 89, 113, 54, 7, 223, + 125, 237, 130, 23, 221, 141, 250, 233, 159, 86, 50, 93, 137, 190, 108, 101, 112, 138, 92, + 37, 114, 61, 213, 185, 74, 125, 114, 159, 226, 80, 150, 90, 199, 175, 91, 209, 223, 58, 120, + 242, 134, 157, 207, 227, 231, 26, 235, 66, 136, 44, 229, 217, 74, 46, 201, 109, 251, 74, + 106, 55, 238, 216, 141, 204, 106, 116, 226, 108, 221, 17, 217, 122, 112, 134, 68, 115, 36, + 122, 166, 19, 205, 91, 33, 247, 236, 249, 133, 93, 144, 251, 86, 202, 165, 85, 144, 7, 77, + 65, 170, 166, 32, 231, 186, 32, 181, 46, 200, 57, 56, 53, 56, 231, 154, 83, 235, 130, 156, + 163, 32, 53, 10, 242, 208, 138, 126, 109, 249, 55, 45, 255, 244, 224, 123, 234, 172, 94, + 151, 163, 121, 243, 94, 208, 71, 62, 223, 219, 193, 60, 214, 202, 69, 171, 227, 179, 50, + 229, 106, 83, 182, 62, 63, 248, 33, 111, 54, 64, 42, 36, 239, 63, 84, 7, 166, 202, 237, 90, + 203, 67, 253, 46, 185, 214, 163, 30, 174, 164, 40, 132, 122, 123, 15, 175, 141, 235, 191, + 169, 7, 62, 109, 133, 190, 93, 171, 56, 205, 170, 212, 113, 189, 26, 22, 124, 213, 108, 46, + 85, 153, 84, 22, 124, 40, 202, 74, 61, 18, 106, 163, 13, 213, 58, 69, 243, 62, 216, 144, + 106, 163, 238, 165, 246, 229, 248, 82, 94, 25, 79, 74, 21, 36, 51, 23, 172, 226, 191, 220, + 190, 136, 172, 142, 94, 149, 103, 121, 73, 77, 66, 109, 107, 52, 111, 222, 103, 173, 37, + 177, 126, 157, 181, 141, 27, 113, 165, 123, 135, 167, 57, 28, 57, 219, 202, 230, 166, 232, + 198, 185, 53, 120, 116, 182, 21, 107, 61, 232, 21, 169, 134, 63, 71, 232, 181, 132, 238, + 137, 122, 227, 13, 64, 232, 62, 106, 222, 166, 138, 208, 109, 130, 247, 222, 224, 187, 29, + 87, 31, 25, 219, 139, 21, 63, 250, 86, 125, 116, 167, 62, 250, 182, 28, 128, 118, 116, 87, + 118, 238, 109, 242, 222, 253, 246, 29, 251, 128, 215, 3, 144, 59, 139, 141, 236, 220, 45, + 37, 57, 181, 136, 199, 184, 104, 218, 35, 126, 88, 158, 176, 151, 39, 204, 242, 164, 89, + 222, 171, 245, 243, 83, 219, 206, 238, 133, 26, 216, 91, 55, 223, 0, 221, 103, 77, 210, 77, + 179, 106, 62, 6, 186, 205, 196, 222, 227, 54, 245, 84, 167, 158, 213, 71, 79, 164, 218, 34, + 109, 222, 157, 98, 147, 247, 219, 15, 3, 117, 230, 33, 227, 165, 202, 88, 217, 94, 222, 148, + 139, 216, 149, 58, 126, 1, 78, 114, 187, 214, 181, 93, 235, 124, 95, 235, 230, 236, 156, + 248, 19, 7, 234, 66, 61, 168, 15, 13, 160, 12, 58, 133, 134, 208, 25, 116, 14, 61, 129, 46, + 160, 49, 52, 209, 170, 63, 1, 148, 130, 235, 128, 235, 128, 235, 128, 235, 128, 235, 128, + 235, 128, 235, 128, 235, 128, 235, 128, 235, 128, 235, 128, 235, 68, 80, 240, 29, 240, 93, + 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, + 240, 93, 240, 93, 240, 93, 240, 93, 240, 93, 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, + 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, 240, 61, + 240, 61, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, + 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 125, 240, 3, 112, + 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, + 240, 2, 240, 102, 88, 239, 76, 127, 59, 76, 28, 243, 77, 161, 227, 7, 39, 19, 168, 3, 117, + 161, 30, 212, 135, 6, 80, 51, 111, 10, 13, 161, 51, 232, 9, 116, 1, 141, 160, 49, 84, 231, + 21, 44, 192, 93, 128, 187, 0, 119, 1, 110, 132, 235, 17, 174, 71, 184, 30, 153, 235, 200, + 43, 66, 94, 17, 242, 138, 144, 87, 132, 188, 34, 228, 21, 205, 161, 200, 47, 66, 126, 17, + 242, 139, 144, 95, 132, 252, 98, 240, 99, 240, 99, 240, 99, 240, 99, 240, 99, 240, 99, 240, + 99, 240, 99, 240, 99, 240, 99, 240, 19, 196, 77, 16, 55, 65, 220, 4, 113, 19, 253, 9, 61, + 153, 207, 199, 88, 95, 83, 27, 248, 121, 115, 191, 44, 31, 194, 47, 154, 250, 31, 31, 124, + 219, 30, 35, 239, 155, 234, 47, 10, 252, 172, 169, 183, 229, 221, 227, 189, 111, 230, 44, + 156, 23, 218, 134, 59, 105, 238, 183, 229, 67, 203, 47, 224, 29, 203, 187, 150, 247, 44, + 239, 91, 62, 176, 60, 179, 124, 104, 249, 153, 229, 231, 150, 63, 177, 252, 194, 242, 241, + 193, 199, 86, 110, 177, 149, 91, 108, 229, 19, 91, 249, 196, 86, 14, 241, 212, 242, 86, 62, + 177, 149, 79, 60, 127, 97, 45, 51, 171, 14, 137, 149, 103, 98, 177, 146, 67, 221, 244, 243, + 231, 78, 38, 70, 35, 104, 12, 213, 207, 33, 195, 123, 132, 225, 124, 103, 56, 199, 25, 206, + 111, 134, 243, 140, 225, 252, 97, 56, 127, 24, 206, 31, 134, 243, 135, 225, 252, 97, 1, 198, + 227, 28, 98, 56, 135, 24, 67, 63, 67, 63, 51, 253, 30, 212, 135, 6, 80, 6, 157, 66, 67, 232, + 12, 58, 135, 34, 47, 22, 221, 88, 167, 79, 119, 155, 233, 212, 55, 6, 145, 162, 192, 116, + 32, 84, 2, 84, 130, 1, 9, 195, 128, 208, 49, 198, 53, 198, 51, 198, 68, 13, 131, 49, 214, + 215, 212, 196, 116, 78, 141, 9, 141, 153, 193, 204, 38, 198, 152, 224, 51, 19, 124, 102, + 130, 207, 252, 49, 106, 221, 236, 37, 211, 105, 178, 154, 153, 224, 51, 148, 96, 26, 19, + 232, 205, 75, 153, 241, 125, 67, 102, 178, 218, 55, 182, 98, 37, 245, 188, 112, 226, 25, + 227, 27, 19, 24, 131, 42, 135, 140, 64, 173, 144, 170, 113, 8, 169, 26, 77, 72, 61, 124, 22, + 18, 104, 59, 92, 119, 206, 103, 4, 106, 197, 80, 141, 67, 12, 213, 56, 196, 152, 39, 232, + 76, 236, 225, 137, 61, 60, 177, 134, 47, 22, 4, 106, 13, 143, 130, 182, 129, 197, 184, 102, + 121, 174, 89, 158, 203, 140, 153, 26, 19, 26, 131, 27, 20, 122, 19, 99, 28, 99, 92, 99, 76, + 225, 60, 19, 217, 51, 145, 61, 19, 217, 51, 145, 189, 208, 122, 48, 22, 150, 143, 44, 31, + 91, 62, 57, 248, 192, 228, 224, 27, 144, 254, 60, 112, 39, 250, 243, 71, 233, 9, 20, 219, + 216, 197, 54, 118, 177, 189, 25, 218, 44, 129, 98, 30, 195, 60, 102, 198, 181, 243, 147, + 137, 254, 156, 84, 122, 2, 93, 64, 205, 245, 54, 94, 146, 36, 11, 36, 196, 76, 102, 204, + 148, 128, 153, 18, 48, 83, 2, 102, 138, 203, 76, 113, 167, 102, 97, 83, 83, 220, 169, 41, + 238, 212, 20, 215, 108, 216, 112, 106, 34, 79, 77, 228, 169, 137, 60, 53, 145, 167, 38, 114, + 104, 34, 155, 77, 27, 154, 77, 27, 154, 77, 27, 154, 77, 27, 134, 38, 114, 104, 34, 155, 29, + 27, 154, 29, 27, 154, 29, 27, 154, 29, 27, 234, 79, 154, 36, 210, 159, 120, 74, 19, 115, + 193, 239, 167, 50, 77, 249, 166, 237, 87, 39, 56, 142, 76, 151, 64, 173, 93, 225, 122, 232, + 244, 236, 78, 31, 157, 254, 255, 217, 174, 154, 230, 182, 113, 36, 122, 217, 100, 199, 142, + 147, 184, 42, 243, 59, 92, 194, 7, 9, 224, 136, 6, 201, 170, 57, 249, 48, 229, 67, 142, 180, + 172, 89, 187, 214, 54, 83, 178, 21, 111, 230, 215, 175, 68, 62, 53, 159, 56, 62, 36, 13, + 180, 31, 241, 26, 221, 175, 1, 129, 157, 21, 156, 21, 59, 209, 152, 150, 27, 211, 114, 99, + 90, 110, 76, 27, 224, 12, 188, 6, 186, 213, 70, 94, 35, 242, 26, 145, 215, 64, 31, 219, 196, + 107, 100, 56, 51, 175, 145, 121, 141, 204, 107, 8, 156, 194, 112, 97, 184, 48, 28, 205, 109, + 185, 185, 247, 19, 130, 23, 134, 55, 112, 54, 12, 111, 24, 222, 48, 28, 231, 165, 229, 243, + 210, 242, 121, 105, 91, 134, 227, 96, 178, 29, 237, 223, 173, 46, 96, 217, 105, 224, 52, + 236, 132, 10, 28, 171, 192, 65, 5, 206, 81, 8, 251, 201, 28, 194, 126, 50, 135, 224, 160, + 15, 231, 25, 238, 25, 238, 25, 14, 229, 184, 138, 225, 21, 195, 43, 134, 67, 83, 142, 53, + 229, 88, 83, 142, 53, 229, 160, 41, 23, 24, 30, 24, 30, 24, 14, 181, 57, 86, 155, 99, 181, + 57, 86, 155, 131, 218, 28, 223, 26, 142, 111, 13, 199, 183, 134, 131, 14, 29, 235, 208, 177, + 14, 29, 235, 208, 163, 66, 222, 16, 124, 63, 153, 225, 251, 9, 193, 81, 59, 111, 25, 110, + 25, 110, 25, 142, 170, 122, 174, 170, 231, 170, 122, 174, 170, 71, 85, 61, 87, 213, 115, 85, + 61, 87, 213, 163, 170, 158, 171, 234, 185, 170, 158, 171, 234, 81, 85, 207, 85, 245, 92, 85, + 207, 85, 245, 168, 170, 231, 147, 66, 208, 41, 210, 146, 211, 163, 160, 158, 47, 123, 143, + 178, 121, 62, 36, 60, 138, 227, 185, 56, 158, 139, 227, 167, 226, 92, 98, 183, 227, 89, 249, + 240, 50, 60, 158, 56, 14, 223, 146, 195, 45, 17, 110, 137, 168, 150, 136, 106, 137, 8, 75, + 196, 180, 235, 179, 241, 60, 55, 43, 107, 116, 100, 117, 228, 116, 228, 117, 84, 233, 168, + 214, 81, 208, 81, 212, 81, 58, 142, 220, 74, 71, 202, 225, 148, 195, 41, 135, 83, 14, 167, + 28, 78, 57, 156, 114, 56, 229, 112, 202, 225, 149, 195, 43, 135, 87, 14, 175, 28, 94, 57, + 188, 114, 120, 229, 240, 202, 225, 149, 195, 43, 71, 165, 28, 149, 114, 84, 202, 81, 41, 71, + 165, 28, 149, 114, 84, 202, 81, 41, 71, 165, 28, 149, 114, 212, 202, 81, 43, 71, 173, 28, + 181, 114, 212, 202, 81, 43, 71, 173, 28, 181, 114, 212, 202, 81, 43, 71, 80, 142, 160, 28, + 65, 57, 130, 114, 4, 229, 8, 202, 17, 148, 35, 40, 71, 80, 142, 160, 28, 81, 57, 162, 114, + 68, 229, 136, 202, 17, 149, 35, 42, 71, 84, 142, 168, 28, 81, 57, 162, 114, 36, 229, 72, + 202, 145, 148, 35, 41, 71, 82, 142, 164, 28, 73, 57, 146, 114, 36, 229, 72, 71, 14, 179, 90, + 233, 200, 232, 200, 234, 200, 233, 200, 235, 168, 210, 81, 173, 163, 160, 163, 168, 35, 229, + 48, 202, 97, 148, 195, 40, 135, 81, 14, 163, 28, 70, 57, 140, 114, 24, 229, 48, 202, 97, + 148, 195, 42, 135, 246, 185, 209, 62, 55, 218, 231, 70, 251, 220, 104, 159, 27, 237, 115, + 163, 125, 110, 180, 207, 141, 77, 31, 174, 239, 135, 237, 243, 135, 97, 252, 255, 102, 252, + 127, 119, 248, 255, 136, 208, 190, 54, 218, 215, 198, 213, 248, 141, 125, 180, 1, 54, 125, + 190, 31, 134, 255, 246, 183, 195, 207, 205, 122, 120, 186, 157, 188, 102, 5, 235, 96, 13, + 44, 126, 177, 239, 243, 241, 250, 240, 120, 55, 126, 113, 100, 208, 94, 54, 62, 78, 40, 91, + 254, 117, 55, 60, 255, 231, 183, 225, 121, 243, 122, 255, 176, 189, 59, 123, 125, 27, 198, + 193, 11, 184, 117, 79, 218, 193, 166, 170, 240, 183, 14, 76, 22, 214, 195, 34, 126, 131, + 248, 13, 184, 76, 130, 197, 27, 195, 224, 141, 97, 90, 88, 172, 103, 177, 51, 139, 29, 29, + 106, 178, 237, 167, 189, 159, 245, 235, 221, 43, 103, 161, 185, 184, 27, 94, 111, 55, 143, + 195, 219, 236, 180, 72, 137, 5, 161, 5, 161, 5, 161, 69, 160, 22, 27, 177, 8, 216, 34, 96, + 123, 76, 14, 30, 61, 22, 1, 90, 4, 232, 16, 224, 254, 232, 206, 71, 246, 179, 254, 56, 58, + 207, 90, 173, 243, 94, 135, 151, 121, 253, 176, 93, 239, 158, 254, 122, 220, 252, 111, 220, + 195, 101, 191, 116, 16, 98, 220, 47, 35, 70, 199, 239, 132, 208, 133, 127, 239, 223, 113, + 242, 90, 163, 10, 120, 173, 209, 241, 141, 16, 199, 200, 191, 245, 255, 244, 125, 202, 183, + 219, 205, 207, 205, 24, 225, 167, 158, 198, 147, 127, 140, 11, 254, 113, 252, 117, 242, 107, + 36, 95, 251, 211, 57, 190, 27, 99, 192, 119, 227, 248, 203, 228, 63, 210, 126, 233, 79, 166, + 103, 173, 142, 212, 119, 222, 206, 121, 158, 215, 255, 216, 142, 203, 125, 156, 86, 189, + 108, 151, 73, 222, 44, 29, 237, 50, 235, 155, 101, 214, 219, 247, 178, 190, 121, 47, 235, + 237, 50, 235, 155, 101, 214, 219, 119, 178, 190, 249, 167, 239, 252, 143, 121, 111, 15, 58, + 60, 251, 67, 179, 240, 160, 163, 107, 29, 13, 250, 245, 245, 252, 245, 48, 71, 119, 189, + 220, 250, 176, 116, 92, 47, 115, 49, 44, 115, 113, 253, 94, 46, 134, 247, 114, 113, 189, + 204, 197, 176, 204, 197, 245, 59, 185, 24, 222, 201, 197, 120, 148, 142, 1, 158, 15, 243, + 112, 244, 142, 65, 77, 222, 113, 248, 101, 244, 106, 16, 95, 134, 147, 233, 244, 205, 72, + 62, 125, 51, 14, 63, 143, 222, 35, 219, 231, 129, 103, 103, 55, 58, 218, 105, 60, 55, 243, + 130, 187, 121, 120, 51, 135, 182, 155, 135, 55, 115, 148, 187, 57, 202, 155, 211, 40, 119, + 167, 81, 222, 204, 81, 238, 230, 40, 111, 78, 162, 220, 157, 68, 249, 93, 71, 191, 52, 202, + 239, 243, 130, 191, 230, 238, 248, 62, 117, 199, 175, 209, 140, 191, 206, 77, 105, 96, 91, + 216, 110, 178, 205, 10, 214, 192, 90, 88, 7, 235, 97, 43, 216, 26, 54, 192, 70, 216, 4, 155, + 97, 5, 182, 124, 61, 88, 183, 255, 93, 228, 86, 254, 106, 221, 255, 192, 5, 99, 147, 163, + 191, 148, 195, 95, 104, 190, 58, 204, 199, 21, 124, 178, 176, 14, 182, 134, 13, 176, 25, 86, + 96, 11, 236, 180, 99, 159, 241, 125, 198, 247, 185, 133, 157, 50, 224, 101, 5, 107, 96, 129, + 23, 224, 37, 194, 38, 88, 240, 9, 118, 24, 167, 117, 108, 133, 191, 183, 192, 183, 211, 188, + 174, 241, 172, 170, 91, 122, 10, 213, 221, 233, 100, 126, 154, 213, 221, 191, 247, 213, 189, + 218, 95, 213, 135, 59, 239, 106, 127, 83, 239, 69, 240, 240, 247, 167, 113, 114, 191, 221, + 108, 118, 63, 62, 235, 248, 110, 120, 123, 254, 4, 216, 207, 205, 246, 245, 183, 195, 248, + 175, 97, 183, 157, 214, 50, 213, 135, 183, 254, 229, 177, 63, 123, 235, 127, 254, 186, 239, + 159, 254, 238, 63, 190, 60, 245, 143, 143, 63, 191, 206, 13, 120, 213, 111, 251, 219, 9, 94, + 57, 88, 15, 59, 213, 188, 14, 43, 88, 115, 1, 75, 207, 190, 96, 225, 180, 236, 116, 112, 58, + 118, 226, 73, 27, 42, 118, 226, 225, 26, 106, 118, 226, 121, 26, 248, 121, 26, 240, 18, 13, + 252, 18, 13, 120, 137, 134, 68, 143, 206, 253, 100, 78, 238, 126, 50, 39, 55, 224, 141, 26, + 248, 141, 26, 248, 141, 26, 50, 195, 5, 78, 97, 184, 48, 92, 24, 94, 224, 44, 12, 47, 12, + 47, 12, 111, 224, 108, 24, 222, 48, 188, 97, 120, 7, 103, 199, 112, 214, 81, 96, 29, 197, + 213, 5, 44, 193, 247, 147, 25, 190, 159, 16, 28, 181, 141, 134, 225, 134, 225, 134, 225, + 168, 122, 180, 12, 183, 12, 183, 12, 135, 30, 162, 99, 184, 99, 184, 99, 184, 135, 211, 51, + 220, 51, 220, 51, 28, 194, 138, 21, 195, 43, 134, 87, 12, 135, 186, 98, 96, 120, 96, 120, + 96, 56, 116, 23, 89, 119, 17, 186, 139, 137, 157, 80, 87, 204, 236, 132, 134, 162, 176, 19, + 74, 137, 133, 157, 208, 67, 108, 216, 137, 211, 35, 182, 236, 132, 20, 98, 71, 206, 132, + 130, 167, 21, 59, 81, 214, 196, 45, 155, 80, 188, 196, 45, 155, 80, 162, 196, 45, 155, 80, + 136, 228, 217, 137, 116, 39, 238, 227, 132, 62, 78, 220, 199, 9, 153, 78, 220, 199, 9, 169, + 75, 156, 186, 132, 212, 37, 110, 204, 196, 141, 153, 184, 49, 19, 146, 154, 184, 49, 19, 55, + 102, 226, 198, 76, 72, 119, 226, 198, 76, 220, 152, 137, 27, 51, 161, 16, 137, 27, 51, 113, + 99, 38, 110, 204, 132, 18, 165, 150, 225, 124, 218, 239, 39, 4, 71, 241, 18, 23, 47, 163, + 120, 153, 187, 53, 115, 183, 102, 238, 214, 108, 96, 81, 201, 204, 109, 152, 185, 13, 51, + 183, 97, 70, 141, 51, 183, 97, 230, 54, 204, 220, 134, 25, 213, 207, 220, 134, 153, 219, 48, + 115, 27, 102, 232, 34, 115, 27, 102, 110, 195, 204, 109, 152, 161, 152, 92, 51, 188, 102, + 120, 205, 112, 104, 41, 179, 150, 50, 122, 51, 115, 111, 102, 104, 41, 179, 150, 50, 107, + 41, 179, 150, 50, 180, 148, 89, 75, 153, 181, 148, 89, 75, 25, 90, 202, 172, 165, 204, 90, + 202, 172, 165, 12, 45, 101, 214, 82, 102, 45, 101, 214, 82, 134, 150, 50, 107, 41, 179, 150, + 50, 107, 73, 32, 27, 97, 217, 8, 203, 70, 88, 54, 130, 211, 64, 248, 144, 223, 79, 8, 206, + 135, 188, 64, 93, 194, 234, 18, 86, 151, 176, 186, 4, 234, 18, 86, 151, 176, 186, 132, 213, + 37, 80, 151, 176, 186, 132, 213, 37, 172, 46, 129, 186, 132, 213, 37, 172, 46, 97, 117, 9, + 212, 37, 172, 46, 97, 117, 9, 171, 75, 160, 46, 225, 59, 65, 248, 78, 16, 190, 19, 4, 186, + 147, 200, 240, 200, 240, 200, 112, 28, 121, 194, 191, 82, 132, 127, 165, 8, 255, 74, 17, 8, + 88, 248, 30, 17, 200, 84, 248, 30, 17, 136, 81, 88, 140, 194, 98, 20, 22, 163, 64, 140, 194, + 55, 140, 224, 60, 18, 254, 93, 33, 252, 187, 66, 248, 119, 69, 129, 228, 10, 75, 174, 176, + 160, 10, 203, 165, 240, 117, 82, 80, 242, 194, 215, 73, 65, 97, 11, 95, 39, 5, 229, 43, 124, + 157, 20, 20, 169, 240, 17, 80, 80, 138, 194, 71, 64, 65, 194, 11, 223, 49, 5, 105, 45, 156, + 214, 130, 180, 22, 78, 107, 65, 158, 10, 231, 169, 160, 53, 11, 183, 102, 225, 214, 44, 220, + 154, 5, 105, 45, 124, 204, 55, 72, 94, 51, 223, 209, 157, 180, 53, 108, 0, 8, 93, 218, 240, + 157, 221, 160, 23, 27, 190, 179, 27, 116, 92, 195, 73, 198, 139, 173, 198, 75, 173, 110, + 142, 203, 70, 88, 188, 75, 240, 82, 171, 241, 82, 171, 155, 2, 219, 192, 182, 176, 211, 251, + 166, 110, 241, 10, 104, 113, 247, 180, 22, 22, 175, 134, 22, 188, 45, 94, 13, 45, 248, 143, + 219, 194, 187, 168, 62, 190, 139, 90, 240, 183, 224, 111, 193, 219, 161, 76, 29, 31, 223, + 251, 201, 156, 231, 142, 143, 239, 14, 5, 236, 248, 248, 238, 248, 248, 238, 248, 248, 238, + 208, 49, 29, 119, 76, 199, 29, 211, 113, 199, 116, 199, 160, 218, 169, 70, 199, 75, 171, + 240, 161, 89, 166, 67, 19, 15, 219, 218, 87, 58, 170, 117, 20, 116, 20, 117, 148, 198, 7, + 239, 120, 1, 12, 219, 97, 189, 30, 190, 29, 231, 135, 208, 224, 155, 120, 77, 3, 219, 158, + 255, 232, 95, 251, 251, 171, 183, 135, 187, 13, 92, 221, 229, 248, 153, 247, 227, 35, 236, + 225, 101, 120, 60, 113, 28, 214, 34, 135, 91, 34, 220, 18, 81, 45, 17, 21, 33, 164, 90, 213, + 54, 16, 2, 14, 66, 212, 75, 68, 189, 68, 132, 37, 34, 44, 17, 113, 137, 136, 138, 64, 149, + 252, 213, 110, 123, 183, 195, 36, 140, 19, 10, 217, 44, 247, 64, 189, 100, 226, 10, 214, + 192, 90, 88, 7, 235, 97, 43, 216, 26, 54, 192, 70, 216, 4, 155, 97, 5, 182, 192, 54, 176, + 83, 39, 153, 4, 222, 4, 222, 4, 190, 4, 190, 4, 190, 4, 190, 4, 190, 4, 190, 4, 190, 4, 190, + 4, 190, 4, 190, 4, 190, 116, 228, 155, 58, 215, 100, 236, 47, 131, 47, 131, 47, 131, 47, + 131, 47, 131, 47, 131, 47, 131, 47, 131, 47, 131, 47, 131, 47, 131, 47, 131, 79, 176, 47, 1, + 159, 128, 79, 192, 39, 224, 19, 240, 9, 248, 4, 124, 2, 62, 1, 159, 128, 79, 192, 39, 224, + 147, 35, 31, 246, 87, 144, 215, 2, 254, 2, 254, 2, 254, 2, 254, 2, 254, 2, 254, 2, 254, 2, + 254, 2, 254, 2, 254, 2, 254, 2, 126, 156, 140, 6, 39, 163, 105, 186, 177, 129, 221, 42, 236, + 255, 249, 171, 117, 255, 99, 242, 227, 164, 52, 56, 41, 13, 78, 74, 131, 147, 210, 224, 164, + 52, 56, 41, 13, 78, 74, 131, 147, 210, 224, 164, 52, 56, 41, 13, 78, 74, 131, 147, 210, 180, + 136, 7, 39, 166, 105, 17, 79, 139, 124, 116, 224, 239, 192, 223, 129, 191, 3, 127, 7, 254, + 14, 252, 29, 248, 59, 240, 119, 224, 239, 38, 126, 187, 90, 193, 26, 88, 11, 235, 96, 61, + 108, 5, 91, 195, 6, 216, 8, 123, 92, 47, 195, 10, 108, 129, 109, 96, 91, 216, 105, 63, 214, + 128, 223, 128, 223, 128, 223, 128, 223, 128, 223, 128, 223, 128, 223, 132, 139, 63, 215, + 195, 211, 83, 223, 175, 215, 155, 231, 215, 139, 23, 154, 0, 129, 72, 12, 34, 49, 136, 196, + 32, 18, 131, 72, 12, 34, 177, 136, 196, 34, 2, 139, 8, 236, 255, 217, 174, 131, 93, 201, + 141, 27, 128, 162, 235, 32, 1, 252, 39, 198, 107, 178, 164, 42, 45, 213, 82, 243, 55, 2, + 199, 9, 18, 35, 19, 216, 112, 188, 241, 223, 103, 60, 239, 8, 80, 10, 189, 24, 16, 28, 73, + 188, 148, 244, 116, 217, 212, 65, 232, 32, 116, 16, 158, 64, 120, 2, 225, 9, 4, 110, 60, + 253, 5, 229, 255, 253, 5, 69, 232, 35, 244, 17, 250, 8, 125, 164, 62, 210, 19, 73, 253, 164, + 126, 22, 199, 23, 199, 23, 199, 151, 235, 184, 126, 23, 253, 46, 250, 93, 244, 187, 232, + 119, 209, 231, 226, 249, 44, 250, 90, 244, 181, 232, 107, 209, 215, 138, 187, 226, 174, 184, + 43, 238, 138, 187, 226, 174, 184, 43, 238, 138, 187, 122, 78, 43, 254, 138, 191, 226, 175, + 248, 43, 254, 138, 223, 241, 59, 126, 199, 239, 248, 29, 191, 227, 119, 252, 142, 223, 241, + 59, 126, 199, 239, 248, 29, 191, 227, 119, 252, 142, 111, 178, 132, 201, 18, 38, 75, 152, + 44, 97, 178, 132, 201, 18, 38, 75, 152, 44, 97, 178, 132, 201, 18, 38, 75, 152, 44, 97, 178, + 132, 201, 18, 38, 75, 12, 124, 19, 38, 76, 152, 216, 240, 77, 154, 48, 105, 194, 164, 9, + 147, 38, 76, 154, 48, 105, 194, 164, 9, 147, 38, 76, 154, 48, 105, 194, 164, 9, 147, 38, 76, + 154, 216, 241, 119, 124, 147, 39, 76, 158, 48, 121, 194, 228, 9, 147, 39, 76, 158, 48, 121, + 194, 228, 9, 147, 39, 76, 158, 48, 121, 194, 228, 137, 39, 158, 201, 19, 38, 79, 152, 60, + 97, 242, 132, 201, 19, 38, 79, 152, 60, 97, 242, 132, 201, 19, 38, 79, 152, 60, 97, 242, + 196, 243, 226, 185, 95, 147, 39, 76, 158, 48, 121, 194, 228, 9, 147, 39, 76, 158, 48, 121, + 194, 164, 9, 19, 38, 76, 152, 48, 97, 226, 192, 57, 112, 14, 156, 19, 231, 196, 57, 113, 78, + 28, 191, 249, 227, 196, 241, 219, 63, 252, 246, 15, 19, 43, 252, 150, 15, 19, 42, 76, 168, + 48, 161, 194, 132, 10, 19, 42, 76, 168, 48, 161, 194, 132, 10, 19, 42, 76, 168, 48, 161, + 194, 132, 10, 19, 42, 76, 168, 120, 189, 190, 83, 207, 191, 117, 202, 251, 148, 143, 41, + 223, 110, 249, 250, 71, 156, 242, 117, 202, 251, 148, 143, 41, 223, 254, 124, 203, 111, 199, + 250, 84, 187, 191, 57, 222, 167, 124, 76, 249, 189, 246, 253, 220, 49, 213, 30, 83, 237, + 241, 230, 252, 49, 229, 247, 218, 247, 99, 219, 84, 123, 155, 106, 111, 83, 237, 237, 205, + 245, 247, 218, 215, 243, 94, 175, 119, 48, 229, 235, 148, 247, 41, 31, 83, 126, 213, 94, + 167, 90, 239, 242, 62, 229, 99, 202, 239, 189, 245, 233, 250, 62, 245, 214, 167, 122, 125, + 170, 215, 167, 222, 238, 231, 142, 169, 246, 152, 106, 143, 55, 231, 143, 41, 191, 215, 190, + 31, 219, 166, 218, 219, 84, 123, 155, 106, 111, 111, 174, 191, 215, 190, 158, 73, 159, 222, + 215, 149, 175, 83, 222, 167, 124, 76, 249, 85, 187, 79, 181, 214, 55, 249, 58, 229, 125, + 202, 199, 148, 223, 107, 223, 175, 157, 89, 239, 142, 143, 41, 191, 223, 247, 152, 174, 31, + 211, 245, 99, 234, 109, 76, 245, 198, 212, 219, 253, 216, 54, 213, 222, 166, 218, 219, 84, + 123, 123, 115, 253, 189, 246, 213, 247, 152, 222, 215, 149, 175, 83, 222, 167, 124, 76, 249, + 85, 123, 76, 181, 214, 55, 249, 58, 229, 125, 202, 199, 148, 223, 107, 223, 175, 237, 83, + 237, 254, 230, 120, 159, 242, 49, 229, 247, 218, 247, 115, 231, 251, 152, 217, 239, 206, + 191, 63, 211, 109, 186, 126, 155, 174, 223, 166, 235, 183, 169, 183, 109, 234, 237, 170, + 189, 77, 239, 235, 202, 215, 41, 239, 83, 62, 166, 252, 170, 189, 77, 181, 214, 55, 249, 58, + 229, 125, 202, 199, 148, 223, 107, 223, 175, 237, 83, 237, 254, 230, 120, 159, 242, 49, 229, + 247, 218, 247, 115, 199, 84, 123, 76, 181, 199, 155, 243, 199, 148, 223, 107, 223, 143, 205, + 207, 104, 190, 175, 185, 151, 111, 215, 127, 251, 221, 145, 54, 213, 180, 161, 166, 13, 53, + 109, 168, 105, 67, 205, 143, 235, 252, 93, 124, 138, 135, 120, 138, 47, 241, 243, 119, 84, + 218, 76, 211, 102, 154, 54, 211, 180, 153, 166, 205, 52, 109, 166, 105, 51, 205, 7, 238, 3, + 247, 177, 137, 248, 246, 209, 180, 143, 166, 125, 52, 237, 163, 105, 31, 77, 251, 104, 6, + 190, 189, 52, 237, 163, 105, 31, 77, 251, 104, 218, 71, 211, 62, 154, 246, 209, 180, 143, + 102, 224, 218, 63, 211, 254, 153, 246, 207, 180, 127, 166, 253, 51, 237, 159, 105, 255, 76, + 251, 103, 38, 126, 226, 39, 126, 226, 39, 126, 226, 39, 126, 226, 39, 126, 226, 39, 126, + 226, 55, 252, 134, 223, 240, 27, 126, 195, 111, 248, 13, 191, 225, 55, 252, 134, 223, 240, + 27, 126, 195, 111, 248, 13, 191, 225, 219, 115, 211, 158, 155, 246, 220, 180, 231, 166, 61, + 55, 237, 185, 105, 207, 77, 123, 110, 218, 115, 211, 158, 155, 246, 220, 180, 231, 166, 61, + 55, 237, 185, 105, 207, 77, 123, 110, 218, 99, 211, 30, 155, 246, 212, 180, 39, 164, 61, 33, + 237, 9, 105, 79, 72, 123, 66, 218, 19, 210, 158, 144, 246, 132, 60, 245, 117, 234, 235, 188, + 234, 234, 235, 212, 215, 169, 47, 123, 69, 218, 43, 210, 94, 145, 246, 138, 180, 87, 164, + 189, 34, 237, 21, 105, 175, 72, 123, 69, 218, 43, 242, 250, 110, 237, 21, 105, 175, 72, 123, + 69, 218, 43, 210, 94, 145, 47, 252, 23, 126, 225, 23, 126, 225, 23, 126, 225, 23, 126, 125, + 242, 219, 199, 135, 248, 89, 183, 45, 242, 69, 238, 125, 55, 239, 187, 121, 223, 205, 251, + 110, 222, 119, 243, 190, 155, 247, 221, 188, 239, 230, 125, 55, 239, 187, 121, 223, 205, + 251, 110, 222, 119, 91, 47, 222, 75, 252, 188, 175, 214, 241, 59, 126, 199, 239, 248, 254, + 30, 154, 191, 135, 214, 241, 59, 126, 199, 239, 248, 254, 94, 90, 199, 239, 248, 253, 252, + 238, 199, 223, 127, 253, 233, 203, 151, 159, 126, 252, 235, 207, 191, 253, 231, 135, 95, + 255, 237, 255, 245, 211, 245, 51, 244, 51, 244, 51, 244, 51, 244, 51, 244, 51, 244, 51, 244, + 51, 244, 49, 244, 49, 244, 49, 244, 49, 244, 49, 60, 135, 129, 59, 112, 55, 117, 55, 117, + 55, 245, 54, 245, 54, 231, 111, 206, 223, 245, 185, 235, 115, 119, 253, 238, 250, 93, 95, + 187, 231, 180, 171, 183, 171, 183, 235, 111, 215, 223, 174, 191, 93, 127, 79, 245, 158, 234, + 61, 213, 123, 170, 247, 116, 254, 243, 58, 95, 127, 79, 253, 29, 250, 59, 244, 119, 120, + 142, 135, 231, 120, 168, 127, 168, 127, 168, 127, 168, 127, 232, 247, 208, 239, 161, 223, + 67, 191, 7, 254, 129, 127, 188, 254, 244, 207, 47, 191, 255, 242, 175, 184, 12, 218, 206, + 43, 234, 128, 49, 26, 99, 52, 198, 104, 140, 209, 24, 163, 49, 70, 99, 136, 198, 16, 141, + 33, 26, 67, 52, 134, 104, 12, 209, 24, 162, 49, 68, 99, 136, 198, 16, 141, 33, 26, 67, 52, + 134, 104, 12, 209, 24, 161, 49, 66, 99, 132, 198, 8, 141, 17, 26, 35, 52, 70, 104, 140, 208, + 24, 161, 49, 66, 99, 132, 198, 8, 173, 60, 209, 250, 124, 162, 11, 51, 44, 31, 15, 49, 196, + 20, 155, 184, 136, 171, 216, 197, 33, 94, 245, 118, 241, 41, 30, 226, 41, 190, 196, 207, + 254, 151, 13, 119, 195, 221, 112, 125, 9, 139, 47, 97, 217, 112, 55, 92, 95, 198, 226, 203, + 88, 54, 220, 13, 119, 195, 221, 112, 125, 57, 139, 47, 103, 241, 229, 44, 190, 156, 101, + 199, 245, 5, 45, 190, 160, 197, 23, 180, 248, 130, 22, 95, 208, 226, 11, 90, 124, 65, 139, + 47, 104, 241, 5, 45, 190, 160, 101, 199, 221, 113, 143, 246, 237, 151, 220, 215, 95, 108, + 95, 255, 125, 124, 255, 227, 15, 191, 220, 242, 199, 45, 207, 55, 249, 184, 229, 143, 63, + 126, 221, 221, 242, 99, 202, 219, 117, 254, 31, 220, 199, 235, 243, 61, 127, 141, 15, 49, + 196, 20, 155, 184, 136, 171, 216, 197, 33, 110, 226, 46, 62, 197, 67, 60, 197, 151, 88, 159, + 241, 129, 255, 192, 127, 224, 63, 240, 31, 248, 15, 252, 7, 254, 3, 255, 129, 255, 192, 127, + 224, 63, 240, 31, 248, 15, 252, 7, 254, 3, 63, 240, 3, 63, 240, 3, 63, 240, 3, 63, 240, 3, + 63, 240, 3, 63, 240, 3, 63, 240, 3, 63, 240, 3, 63, 241, 19, 63, 241, 19, 63, 241, 19, 63, + 241, 19, 63, 241, 19, 63, 241, 19, 63, 241, 19, 63, 241, 19, 191, 225, 55, 252, 134, 223, + 240, 27, 126, 195, 111, 248, 13, 191, 225, 55, 252, 134, 223, 240, 27, 126, 195, 111, 248, + 13, 127, 193, 95, 240, 23, 252, 5, 127, 193, 95, 240, 23, 252, 5, 127, 193, 95, 240, 23, + 252, 5, 127, 193, 95, 240, 23, 252, 5, 127, 197, 95, 241, 87, 252, 21, 127, 197, 95, 241, + 87, 252, 21, 127, 197, 95, 241, 87, 252, 21, 127, 197, 95, 241, 87, 252, 21, 191, 227, 119, + 252, 142, 223, 241, 59, 126, 199, 239, 248, 29, 191, 227, 119, 252, 142, 223, 241, 59, 126, + 199, 239, 248, 29, 127, 168, 55, 212, 27, 234, 13, 245, 134, 122, 67, 189, 161, 222, 80, + 111, 168, 55, 212, 219, 220, 207, 230, 126, 54, 247, 179, 185, 159, 205, 253, 108, 238, 103, + 195, 223, 240, 55, 252, 13, 127, 195, 255, 244, 247, 163, 248, 170, 248, 170, 248, 170, 248, + 170, 248, 170, 248, 170, 248, 170, 248, 170, 248, 170, 248, 170, 248, 170, 62, 174, 250, + 135, 120, 138, 47, 241, 243, 254, 138, 175, 138, 175, 138, 175, 138, 175, 138, 175, 138, + 175, 138, 159, 138, 159, 138, 159, 138, 159, 138, 159, 138, 159, 138, 143, 138, 143, 138, + 143, 138, 143, 138, 143, 138, 143, 138, 143, 138, 143, 138, 143, 138, 143, 138, 143, 138, + 143, 138, 143, 42, 46, 158, 251, 227, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, + 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, + 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 163, 226, 159, + 226, 159, 226, 159, 226, 159, 226, 159, 226, 159, 226, 155, 226, 155, 226, 155, 226, 155, + 226, 155, 226, 155, 226, 155, 226, 155, 226, 153, 226, 151, 90, 174, 186, 250, 231, 147, + 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, + 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, + 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, 226, 147, + 226, 147, 226, 147, 26, 120, 3, 111, 224, 13, 188, 129, 55, 240, 248, 166, 248, 166, 248, + 166, 248, 166, 248, 166, 248, 166, 248, 166, 198, 197, 115, 191, 124, 83, 124, 83, 124, 83, + 124, 83, 124, 83, 124, 83, 124, 83, 124, 83, 124, 83, 124, 83, 124, 83, 124, 83, 151, 111, + 54, 252, 13, 127, 195, 223, 240, 119, 252, 29, 127, 199, 223, 241, 119, 252, 29, 127, 199, + 223, 241, 119, 252, 29, 127, 199, 223, 241, 119, 252, 29, 127, 199, 223, 241, 159, 248, 79, + 252, 39, 254, 19, 255, 137, 255, 196, 125, 226, 62, 113, 159, 184, 79, 220, 39, 238, 19, + 247, 137, 251, 196, 125, 226, 30, 184, 7, 238, 129, 123, 224, 30, 184, 7, 238, 129, 123, + 224, 30, 184, 7, 238, 129, 123, 224, 30, 184, 7, 238, 129, 123, 226, 158, 184, 39, 238, 137, + 123, 226, 157, 120, 39, 222, 137, 119, 226, 157, 120, 39, 206, 137, 115, 226, 188, 112, 94, + 56, 47, 156, 23, 206, 203, 253, 189, 188, 215, 23, 238, 11, 247, 133, 251, 194, 125, 225, + 190, 112, 95, 238, 243, 133, 255, 194, 127, 225, 23, 94, 225, 21, 94, 225, 20, 78, 225, 20, + 78, 225, 20, 78, 225, 20, 78, 125, 227, 196, 199, 231, 223, 237, 215, 248, 16, 67, 92, 196, + 85, 28, 226, 38, 158, 226, 85, 231, 91, 191, 177, 126, 250, 39, 150, 207, 247, 87, 126, 87, + 151, 223, 213, 229, 119, 245, 215, 152, 127, 249, 219, 15, 191, 254, 244, 253, 223, 127, + 254, 237, 203, 63, 254, 251, 63, 170, 171, 46, 54, 142, 171, 10, 223, 185, 227, 152, 164, + 37, 120, 99, 169, 118, 34, 98, 239, 218, 36, 27, 18, 67, 60, 255, 119, 38, 180, 245, 206, + 236, 177, 213, 34, 33, 23, 84, 9, 129, 0, 19, 41, 133, 58, 152, 58, 34, 136, 168, 60, 144, + 169, 196, 27, 168, 174, 250, 128, 248, 145, 112, 212, 7, 222, 170, 68, 107, 4, 14, 169, 228, + 32, 67, 129, 80, 72, 4, 81, 30, 210, 191, 180, 60, 241, 80, 204, 91, 201, 147, 57, 179, 247, + 155, 179, 173, 86, 223, 253, 206, 220, 153, 185, 223, 217, 153, 123, 231, 124, 247, 252, + 190, 179, 117, 100, 135, 43, 144, 150, 157, 206, 94, 16, 128, 109, 217, 97, 142, 193, 118, + 251, 21, 96, 27, 21, 96, 27, 21, 204, 131, 23, 60, 48, 238, 183, 143, 147, 57, 4, 99, 188, + 5, 140, 183, 128, 241, 236, 99, 101, 78, 193, 25, 56, 7, 23, 224, 46, 152, 192, 200, 99, + 193, 234, 135, 182, 204, 48, 251, 224, 0, 28, 130, 35, 112, 12, 78, 192, 6, 76, 224, 121, + 48, 198, 69, 126, 33, 94, 59, 193, 14, 17, 236, 16, 193, 14, 17, 236, 16, 193, 14, 17, 236, + 16, 193, 14, 17, 236, 16, 121, 245, 56, 25, 56, 7, 23, 224, 46, 152, 192, 243, 96, 59, 77, + 9, 118, 136, 96, 135, 8, 118, 136, 96, 135, 8, 118, 136, 96, 135, 8, 219, 55, 194, 246, 141, + 96, 143, 8, 246, 136, 96, 143, 8, 246, 136, 96, 143, 8, 246, 136, 176, 125, 35, 108, 223, 8, + 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, + 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, + 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, + 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, + 8, 118, 137, 96, 151, 8, 118, 137, 96, 151, 8, 219, 55, 194, 246, 141, 96, 159, 8, 246, 137, + 96, 159, 8, 246, 137, 96, 159, 8, 246, 137, 176, 125, 35, 108, 223, 8, 118, 138, 96, 167, 8, + 118, 138, 96, 167, 8, 118, 138, 96, 167, 8, 118, 138, 96, 167, 8, 219, 55, 130, 173, 34, + 108, 223, 8, 246, 138, 176, 125, 35, 216, 44, 194, 246, 141, 96, 183, 8, 118, 139, 96, 183, + 8, 118, 139, 96, 183, 8, 118, 139, 96, 183, 8, 118, 139, 96, 183, 8, 118, 139, 96, 183, 200, + 218, 45, 47, 177, 235, 138, 217, 7, 7, 224, 16, 60, 15, 38, 176, 93, 159, 137, 143, 251, + 124, 220, 231, 227, 62, 31, 247, 217, 245, 224, 37, 88, 239, 9, 214, 123, 18, 167, 251, 190, + 185, 242, 236, 185, 167, 131, 32, 195, 29, 243, 243, 31, 5, 159, 252, 198, 242, 51, 167, + 209, 185, 128, 206, 133, 15, 116, 46, 160, 115, 193, 118, 202, 193, 242, 51, 203, 223, 149, + 131, 111, 63, 117, 102, 185, 186, 156, 13, 130, 15, 14, 192, 33, 56, 2, 199, 224, 4, 108, + 192, 41, 56, 123, 176, 26, 52, 46, 124, 6, 33, 14, 62, 16, 135, 85, 92, 93, 27, 120, 62, + 170, 138, 93, 174, 129, 23, 70, 246, 111, 134, 158, 159, 72, 100, 36, 74, 37, 202, 246, 156, + 94, 89, 57, 253, 244, 158, 239, 44, 63, 123, 122, 197, 222, 235, 161, 52, 120, 168, 88, 30, + 198, 182, 175, 132, 57, 2, 163, 130, 121, 168, 96, 246, 83, 199, 140, 74, 230, 161, 146, + 217, 79, 29, 115, 127, 170, 5, 190, 95, 127, 90, 51, 112, 14, 198, 84, 76, 240, 233, 15, 81, + 26, 66, 148, 134, 16, 165, 33, 172, 207, 163, 52, 132, 40, 13, 33, 74, 67, 136, 210, 20, + 161, 52, 69, 117, 105, 72, 193, 208, 141, 161, 107, 151, 0, 115, 23, 121, 212, 140, 210, + 128, 146, 19, 162, 228, 68, 40, 97, 17, 74, 68, 108, 43, 58, 191, 11, 59, 94, 220, 141, 193, + 9, 24, 83, 207, 254, 127, 158, 154, 152, 210, 200, 35, 65, 30, 9, 242, 72, 144, 71, 130, + 210, 148, 196, 243, 245, 219, 178, 123, 11, 207, 196, 158, 244, 196, 18, 201, 123, 182, 59, + 12, 62, 229, 75, 79, 86, 71, 169, 220, 105, 247, 17, 124, 85, 32, 61, 161, 68, 50, 123, 236, + 110, 130, 175, 26, 156, 147, 89, 148, 202, 44, 178, 123, 10, 190, 74, 238, 203, 68, 59, 147, + 241, 179, 58, 123, 201, 57, 27, 68, 146, 125, 86, 103, 63, 232, 169, 179, 247, 61, 79, 162, + 58, 123, 35, 61, 161, 68, 145, 68, 117, 246, 169, 244, 12, 174, 31, 244, 213, 217, 139, 142, + 95, 143, 158, 75, 79, 157, 123, 33, 61, 245, 216, 93, 233, 145, 177, 101, 125, 249, 126, 61, + 54, 213, 61, 129, 47, 81, 32, 81, 61, 250, 188, 244, 196, 18, 37, 18, 213, 79, 102, 65, 122, + 36, 227, 80, 158, 76, 136, 220, 147, 65, 143, 60, 25, 249, 42, 248, 176, 119, 38, 145, 108, + 66, 201, 62, 148, 236, 177, 242, 76, 34, 153, 70, 114, 125, 52, 232, 67, 246, 137, 232, 68, + 146, 125, 36, 217, 71, 200, 62, 145, 28, 34, 201, 94, 230, 179, 31, 215, 217, 203, 8, 50, + 243, 124, 153, 93, 126, 92, 103, 47, 163, 15, 230, 193, 224, 93, 199, 117, 246, 114, 110, + 240, 111, 7, 255, 40, 169, 179, 151, 251, 6, 218, 131, 241, 147, 58, 123, 201, 121, 16, 25, + 201, 222, 212, 217, 203, 188, 49, 146, 189, 145, 236, 77, 157, 189, 204, 165, 122, 197, 38, + 50, 151, 76, 157, 187, 204, 155, 84, 114, 79, 37, 247, 180, 46, 190, 40, 222, 9, 138, 119, + 130, 226, 157, 160, 120, 27, 20, 111, 131, 226, 109, 80, 188, 13, 238, 55, 40, 222, 6, 197, + 219, 160, 120, 27, 20, 111, 131, 226, 109, 80, 188, 13, 204, 131, 193, 23, 219, 64, 223, 64, + 223, 64, 223, 64, 63, 133, 126, 10, 253, 20, 250, 117, 254, 41, 244, 83, 232, 167, 208, 79, + 161, 159, 66, 63, 133, 126, 10, 253, 20, 250, 41, 244, 83, 232, 167, 208, 79, 161, 159, 65, + 63, 131, 126, 6, 253, 12, 250, 25, 244, 51, 232, 103, 208, 207, 160, 159, 65, 63, 131, 126, + 6, 253, 12, 250, 25, 244, 51, 232, 103, 208, 207, 160, 159, 67, 63, 135, 126, 14, 253, 28, + 250, 57, 244, 115, 232, 231, 208, 207, 161, 159, 67, 63, 135, 126, 14, 253, 28, 250, 57, + 244, 115, 232, 231, 208, 207, 161, 95, 64, 191, 128, 126, 1, 253, 2, 250, 5, 244, 11, 232, + 23, 208, 47, 160, 95, 64, 191, 128, 126, 1, 253, 2, 250, 5, 244, 11, 232, 23, 208, 47, 160, + 223, 133, 126, 23, 250, 93, 232, 119, 225, 40, 98, 236, 113, 51, 56, 143, 12, 206, 35, 131, + 243, 200, 112, 93, 6, 231, 81, 160, 191, 64, 127, 81, 247, 91, 71, 50, 47, 95, 226, 64, 106, + 90, 32, 53, 45, 72, 99, 137, 18, 137, 6, 119, 164, 18, 213, 43, 60, 200, 60, 137, 124, 137, + 2, 137, 68, 35, 19, 13, 169, 108, 129, 84, 182, 32, 19, 141, 76, 52, 164, 182, 133, 82, 219, + 216, 148, 73, 20, 72, 20, 74, 20, 73, 20, 75, 148, 72, 100, 36, 74, 37, 18, 13, 95, 52, 124, + 209, 240, 69, 195, 23, 13, 63, 106, 224, 59, 230, 37, 129, 57, 185, 124, 126, 117, 229, 67, + 29, 98, 137, 3, 187, 13, 98, 14, 193, 17, 56, 6, 39, 96, 3, 134, 167, 139, 224, 233, 34, + 120, 186, 8, 158, 46, 130, 167, 139, 224, 233, 34, 120, 58, 187, 13, 242, 66, 3, 175, 102, + 224, 209, 236, 23, 199, 139, 186, 181, 55, 203, 193, 5, 184, 11, 198, 117, 240, 114, 17, + 188, 92, 140, 109, 68, 140, 138, 31, 99, 27, 17, 251, 88, 25, 93, 172, 140, 46, 86, 70, 23, + 43, 163, 139, 149, 209, 197, 202, 232, 98, 101, 116, 177, 50, 22, 176, 2, 172, 78, 224, 219, + 255, 195, 108, 103, 186, 111, 191, 120, 65, 215, 110, 171, 152, 125, 112, 0, 14, 193, 245, + 117, 49, 56, 1, 27, 112, 10, 206, 192, 57, 184, 0, 119, 45, 27, 140, 99, 48, 142, 193, 56, + 246, 11, 159, 27, 191, 230, 20, 156, 129, 115, 203, 129, 7, 150, 121, 147, 122, 234, 170, + 122, 210, 253, 228, 70, 251, 96, 243, 214, 43, 238, 113, 117, 143, 161, 221, 227, 189, 153, + 137, 230, 85, 247, 152, 59, 209, 251, 76, 179, 179, 233, 126, 98, 99, 244, 161, 96, 36, 255, + 180, 219, 82, 142, 154, 237, 183, 45, 110, 87, 25, 151, 25, 91, 140, 33, 181, 228, 78, 114, + 127, 131, 219, 139, 140, 146, 113, 153, 177, 197, 184, 197, 24, 86, 138, 219, 234, 108, 139, + 177, 202, 88, 103, 220, 171, 206, 184, 19, 238, 225, 94, 171, 217, 200, 143, 185, 135, 248, + 222, 67, 74, 171, 17, 119, 92, 237, 48, 118, 25, 174, 106, 114, 59, 203, 88, 100, 44, 49, + 214, 24, 235, 140, 225, 254, 117, 85, 207, 42, 227, 34, 99, 139, 241, 223, 254, 153, 142, + 59, 222, 123, 49, 228, 220, 199, 123, 63, 234, 211, 198, 217, 149, 160, 127, 120, 218, 30, + 126, 229, 171, 253, 195, 141, 47, 126, 201, 242, 231, 62, 111, 153, 30, 183, 151, 157, 178, + 151, 177, 69, 234, 243, 201, 194, 242, 177, 79, 89, 30, 61, 26, 148, 21, 63, 176, 63, 184, + 158, 143, 185, 99, 252, 39, 199, 56, 241, 115, 220, 58, 250, 15, 106, 196, 113, 84, 83, 93, + 114, 31, 82, 87, 24, 218, 29, 70, 79, 199, 29, 221, 56, 210, 14, 214, 183, 220, 33, 229, + 184, 218, 117, 212, 25, 213, 220, 189, 238, 58, 189, 253, 7, 130, 252, 1, 189, 171, 119, + 212, 168, 106, 234, 255, 232, 247, 236, 25, 253, 222, 198, 199, 14, 4, 235, 249, 103, 245, + 187, 234, 50, 99, 139, 225, 234, 119, 249, 247, 142, 126, 71, 93, 212, 247, 170, 103, 206, + 237, 28, 99, 157, 177, 197, 184, 201, 216, 97, 12, 235, 123, 252, 123, 155, 127, 111, 233, + 183, 212, 136, 126, 83, 205, 50, 230, 24, 75, 140, 117, 198, 22, 99, 135, 241, 17, 253, 38, + 183, 13, 253, 6, 143, 166, 250, 109, 21, 207, 49, 180, 126, 131, 219, 134, 126, 157, 255, + 214, 235, 220, 142, 232, 187, 28, 221, 213, 119, 57, 181, 127, 246, 76, 22, 92, 237, 7, 51, + 179, 8, 154, 71, 17, 140, 127, 28, 193, 232, 88, 176, 169, 255, 209, 187, 127, 156, 103, 84, + 155, 223, 52, 207, 168, 107, 238, 180, 122, 84, 133, 238, 116, 239, 168, 223, 220, 116, 15, + 246, 30, 94, 110, 110, 234, 127, 109, 180, 102, 154, 151, 114, 79, 223, 86, 87, 24, 154, 51, + 185, 205, 202, 183, 85, 139, 241, 4, 227, 235, 140, 115, 140, 97, 142, 238, 112, 116, 71, + 149, 140, 23, 24, 151, 24, 87, 24, 60, 203, 184, 109, 48, 90, 250, 6, 227, 53, 198, 29, 229, + 49, 58, 140, 39, 24, 123, 245, 173, 30, 203, 108, 234, 155, 189, 118, 209, 204, 199, 244, + 223, 245, 159, 212, 56, 63, 241, 191, 233, 63, 247, 249, 53, 253, 106, 159, 255, 170, 255, + 216, 231, 191, 48, 79, 50, 223, 208, 175, 246, 38, 155, 42, 127, 144, 207, 43, 190, 167, + 193, 220, 96, 158, 229, 243, 123, 244, 239, 55, 142, 140, 54, 119, 243, 3, 122, 139, 159, + 93, 147, 219, 89, 198, 28, 99, 145, 177, 196, 88, 99, 12, 235, 45, 61, 221, 59, 211, 28, + 229, 65, 174, 169, 27, 123, 21, 95, 217, 83, 255, 238, 243, 175, 212, 75, 123, 85, 231, 108, + 179, 211, 238, 242, 4, 108, 85, 77, 251, 212, 35, 28, 113, 179, 222, 90, 111, 235, 78, 251, + 39, 63, 227, 195, 170, 105, 63, 255, 34, 71, 85, 211, 254, 225, 143, 57, 170, 154, 246, 247, + 159, 227, 168, 106, 218, 43, 223, 227, 168, 106, 218, 103, 206, 114, 84, 53, 237, 47, 47, + 113, 84, 53, 237, 197, 39, 57, 226, 102, 83, 255, 242, 183, 71, 142, 53, 205, 226, 183, 156, + 86, 62, 162, 47, 240, 83, 186, 192, 79, 233, 2, 63, 165, 11, 106, 72, 95, 168, 126, 234, + 254, 80, 149, 219, 47, 122, 39, 78, 240, 19, 251, 121, 103, 230, 248, 137, 102, 249, 59, + 167, 124, 197, 41, 191, 224, 148, 47, 57, 229, 83, 78, 249, 3, 167, 124, 206, 41, 31, 118, + 202, 175, 57, 229, 140, 83, 30, 118, 202, 73, 167, 236, 56, 229, 53, 39, 229, 71, 81, 58, + 157, 95, 127, 232, 48, 235, 28, 116, 202, 27, 78, 249, 178, 83, 158, 119, 202, 182, 83, 30, + 117, 202, 35, 78, 217, 114, 76, 103, 83, 79, 245, 30, 15, 251, 52, 223, 167, 141, 188, 90, + 116, 204, 143, 60, 202, 95, 159, 17, 61, 197, 79, 116, 138, 231, 252, 20, 127, 19, 182, 184, + 189, 201, 216, 237, 31, 117, 248, 162, 214, 180, 189, 248, 208, 100, 197, 211, 27, 39, 230, + 236, 241, 201, 83, 193, 106, 254, 152, 222, 230, 27, 183, 249, 53, 108, 171, 183, 25, 67, + 252, 130, 182, 121, 26, 109, 243, 32, 219, 60, 192, 8, 183, 115, 140, 37, 198, 117, 198, 14, + 99, 151, 49, 204, 87, 79, 115, 226, 107, 253, 118, 132, 219, 89, 198, 28, 99, 137, 113, 145, + 177, 195, 24, 238, 167, 179, 195, 208, 106, 21, 41, 94, 238, 39, 54, 139, 164, 23, 171, 35, + 189, 205, 191, 105, 254, 77, 233, 169, 206, 68, 227, 112, 99, 166, 241, 152, 187, 118, 216, + 25, 153, 116, 22, 39, 119, 39, 181, 81, 99, 99, 74, 169, 209, 3, 123, 15, 108, 58, 251, 127, + 243, 254, 254, 255, 189, 191, 95, 237, 203, 247, 233, 231, 245, 154, 154, 224, 23, 241, 2, + 120, 173, 119, 127, 162, 185, 233, 252, 180, 215, 254, 63, 163, 101, 244, 218, 182, 17, 199, + 241, 59, 217, 139, 228, 164, 73, 156, 44, 75, 77, 125, 241, 41, 40, 54, 109, 149, 174, 35, + 164, 115, 90, 23, 199, 113, 164, 121, 76, 15, 115, 99, 47, 72, 158, 41, 78, 140, 33, 99, 47, + 3, 217, 125, 91, 200, 30, 2, 11, 163, 123, 25, 116, 208, 191, 160, 172, 12, 206, 14, 24, + 217, 217, 67, 95, 151, 231, 141, 189, 230, 97, 15, 219, 219, 210, 135, 193, 158, 188, 223, + 157, 100, 103, 101, 41, 244, 176, 238, 119, 250, 126, 63, 119, 63, 221, 233, 36, 249, 132, + 110, 188, 131, 191, 71, 137, 48, 236, 58, 124, 23, 165, 112, 18, 226, 26, 114, 197, 249, 29, + 68, 20, 30, 87, 17, 145, 158, 67, 92, 233, 144, 109, 232, 54, 221, 73, 45, 211, 62, 158, + 226, 189, 186, 244, 31, 242, 59, 253, 147, 120, 18, 52, 255, 32, 39, 244, 55, 213, 11, 227, + 14, 253, 21, 148, 231, 93, 250, 11, 57, 162, 63, 223, 246, 20, 80, 126, 74, 121, 24, 66, 95, + 21, 104, 143, 172, 209, 31, 79, 5, 250, 21, 24, 79, 59, 116, 159, 135, 46, 253, 146, 20, + 232, 231, 68, 24, 13, 223, 120, 232, 194, 89, 110, 154, 110, 165, 42, 244, 67, 24, 207, 32, + 187, 52, 231, 194, 152, 93, 186, 78, 30, 210, 251, 62, 117, 135, 247, 233, 210, 247, 224, + 18, 116, 191, 121, 19, 46, 246, 6, 17, 73, 181, 132, 24, 240, 147, 180, 135, 247, 114, 203, + 242, 19, 217, 150, 63, 150, 223, 151, 87, 228, 101, 121, 81, 166, 242, 130, 28, 151, 231, + 148, 89, 37, 170, 76, 41, 87, 148, 113, 69, 81, 198, 148, 176, 34, 41, 72, 153, 243, 6, 103, + 57, 29, 193, 173, 155, 27, 139, 242, 48, 22, 230, 117, 88, 180, 163, 18, 175, 161, 18, 47, + 61, 172, 72, 232, 35, 196, 222, 14, 89, 146, 85, 202, 99, 139, 189, 168, 35, 107, 87, 101, + 127, 151, 52, 15, 143, 63, 168, 176, 183, 180, 60, 102, 179, 22, 178, 202, 121, 182, 166, + 91, 158, 60, 216, 98, 105, 221, 98, 114, 241, 83, 187, 141, 241, 183, 14, 168, 76, 250, 218, + 195, 168, 108, 123, 120, 192, 165, 195, 56, 155, 221, 180, 123, 8, 227, 153, 195, 199, 113, + 30, 175, 31, 62, 118, 28, 20, 155, 127, 180, 30, 91, 159, 205, 206, 220, 253, 192, 184, 164, + 170, 5, 181, 126, 81, 98, 175, 180, 23, 216, 19, 171, 100, 179, 31, 22, 28, 182, 194, 27, + 131, 5, 199, 98, 223, 149, 212, 170, 221, 195, 47, 241, 95, 166, 209, 195, 231, 60, 56, 118, + 47, 148, 197, 47, 205, 45, 174, 135, 178, 134, 227, 88, 30, 222, 22, 28, 82, 241, 57, 112, + 176, 99, 206, 5, 167, 192, 135, 153, 115, 72, 85, 18, 62, 247, 212, 231, 146, 208, 31, 184, + 37, 30, 128, 139, 68, 80, 82, 112, 201, 72, 68, 112, 97, 204, 185, 182, 187, 100, 26, 237, + 165, 37, 193, 92, 85, 145, 43, 24, 247, 170, 250, 95, 230, 52, 9, 76, 50, 41, 152, 249, 3, + 116, 42, 152, 211, 249, 3, 206, 176, 172, 64, 8, 1, 36, 65, 4, 130, 175, 33, 34, 16, 130, + 175, 9, 100, 251, 2, 185, 29, 32, 71, 35, 228, 72, 100, 10, 225, 11, 134, 248, 204, 228, + 217, 144, 153, 60, 3, 70, 127, 211, 210, 200, 235, 58, 62, 206, 56, 245, 170, 217, 208, 204, + 154, 102, 54, 224, 168, 177, 111, 30, 237, 197, 216, 193, 174, 170, 182, 235, 14, 55, 84, + 22, 74, 213, 118, 235, 123, 60, 238, 52, 152, 163, 53, 12, 86, 215, 12, 181, 157, 169, 94, + 98, 87, 185, 157, 209, 140, 54, 170, 154, 101, 187, 93, 205, 53, 140, 78, 38, 151, 49, 181, + 29, 195, 57, 46, 20, 87, 211, 175, 228, 58, 26, 229, 90, 45, 94, 50, 88, 145, 15, 182, 202, + 115, 21, 210, 151, 216, 105, 110, 23, 120, 174, 52, 207, 149, 230, 185, 10, 185, 130, 200, + 133, 196, 30, 47, 218, 109, 5, 229, 157, 205, 170, 31, 143, 165, 137, 113, 216, 175, 181, + 248, 162, 147, 159, 143, 126, 145, 21, 155, 55, 179, 24, 219, 143, 247, 225, 223, 202, 51, + 52, 161, 59, 236, 138, 150, 103, 147, 112, 112, 235, 214, 198, 173, 13, 110, 193, 51, 197, + 173, 41, 144, 167, 3, 43, 182, 159, 89, 140, 247, 241, 179, 192, 138, 130, 60, 163, 229, + 145, 222, 108, 185, 45, 20, 51, 63, 51, 252, 159, 11, 5, 164, 102, 139, 47, 184, 95, 235, + 238, 235, 10, 120, 38, 203, 237, 24, 110, 19, 33, 139, 221, 44, 89, 108, 253, 65, 197, 110, + 203, 50, 168, 53, 62, 37, 118, 111, 168, 77, 76, 152, 222, 224, 133, 47, 190, 11, 226, 61, + 46, 134, 66, 35, 144, 107, 247, 185, 22, 137, 4, 224, 255, 239, 127, 43, 136, 155, 252, 41, + 56, 144, 78, 142, 113, 46, 129, 155, 200, 117, 66, 44, 97, 149, 37, 120, 21, 148, 43, 48, + 215, 106, 197, 238, 195, 127, 41, 254, 121, 112, 29, 152, 160, 139, 117, 236, 14, 199, 8, + 46, 91, 215, 145, 127, 142, 248, 156, 135, 71, 179, 21, 180, 130, 181, 104, 6, 209, 239, 9, + 93, 220, 225, 146, 140, 10, 95, 44, 125, 180, 98, 77, 24, 16, 253, 43, 192, 0, 77, 77, 78, + 211, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 49, 51, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, + 48, 50, 55, 57, 47, 76, 101, 110, 103, 116, 104, 49, 32, 51, 57, 57, 49, 50, 62, 62, 115, + 116, 114, 101, 97, 109, 13, 10, 72, 137, 164, 86, 123, 108, 83, 215, 29, 254, 157, 251, 240, + 125, 216, 190, 190, 246, 245, 189, 126, 38, 190, 55, 126, 38, 142, 227, 196, 118, 226, 56, + 52, 137, 195, 35, 5, 202, 43, 47, 22, 74, 66, 201, 32, 129, 13, 2, 129, 208, 66, 96, 20, + 202, 170, 192, 160, 168, 251, 163, 157, 186, 49, 33, 173, 98, 82, 43, 173, 235, 74, 8, 53, + 140, 77, 140, 165, 168, 221, 196, 38, 77, 93, 165, 181, 165, 210, 170, 181, 157, 166, 153, + 117, 221, 254, 168, 104, 237, 236, 92, 59, 97, 144, 74, 108, 235, 100, 95, 223, 115, 206, + 61, 247, 248, 252, 190, 239, 251, 125, 191, 3, 8, 0, 204, 112, 20, 72, 88, 183, 182, 39, + 158, 216, 185, 99, 239, 147, 0, 95, 95, 138, 71, 55, 111, 25, 29, 26, 219, 219, 249, 206, + 31, 0, 122, 84, 0, 246, 79, 91, 30, 219, 167, 94, 248, 222, 111, 46, 225, 231, 231, 0, 104, + 97, 100, 108, 219, 232, 15, 254, 178, 248, 71, 0, 187, 47, 0, 112, 210, 182, 157, 19, 35, + 215, 126, 113, 172, 2, 191, 251, 46, 64, 246, 202, 246, 225, 161, 173, 239, 47, 127, 249, + 35, 128, 3, 175, 227, 177, 166, 237, 120, 192, 178, 220, 246, 109, 128, 9, 220, 133, 192, + 246, 209, 125, 7, 66, 7, 7, 206, 224, 126, 0, 192, 250, 228, 206, 221, 91, 134, 224, 213, + 174, 159, 0, 116, 60, 135, 251, 39, 70, 135, 14, 140, 9, 55, 72, 10, 224, 228, 11, 120, 190, + 186, 107, 104, 116, 248, 90, 211, 162, 95, 3, 12, 224, 49, 33, 59, 182, 123, 124, 223, 172, + 8, 147, 248, 185, 190, 190, 58, 182, 119, 120, 108, 248, 147, 25, 188, 214, 201, 63, 3, 136, + 5, 160, 1, 138, 227, 228, 219, 180, 128, 163, 99, 96, 17, 244, 193, 122, 88, 59, 29, 83, 98, + 10, 251, 64, 7, 143, 242, 176, 2, 24, 180, 21, 8, 80, 209, 83, 192, 2, 66, 91, 179, 54, 138, + 8, 166, 13, 100, 151, 199, 108, 29, 235, 66, 93, 75, 25, 162, 23, 218, 111, 190, 119, 115, + 240, 189, 155, 55, 240, 253, 6, 138, 223, 204, 191, 149, 23, 11, 111, 229, 109, 153, 76, 60, + 222, 80, 143, 172, 154, 181, 116, 217, 5, 130, 97, 12, 6, 127, 85, 29, 145, 78, 55, 53, 37, + 147, 137, 54, 162, 49, 85, 71, 248, 171, 4, 124, 133, 26, 83, 109, 68, 186, 141, 76, 38, 42, + 137, 210, 212, 242, 204, 210, 40, 158, 172, 143, 146, 111, 127, 190, 145, 92, 91, 48, 16, + 135, 124, 203, 118, 173, 9, 16, 62, 143, 96, 55, 209, 72, 165, 125, 14, 182, 117, 109, 157, + 100, 209, 26, 35, 145, 108, 220, 199, 240, 6, 130, 102, 13, 108, 117, 203, 210, 170, 165, + 155, 90, 220, 197, 105, 146, 49, 50, 188, 170, 40, 110, 129, 166, 24, 19, 203, 169, 46, 201, + 37, 80, 197, 78, 90, 184, 253, 9, 45, 124, 182, 132, 218, 249, 217, 51, 100, 67, 106, 91, + 119, 19, 253, 28, 207, 18, 148, 193, 112, 197, 227, 8, 46, 234, 212, 92, 81, 85, 178, 72, + 162, 73, 160, 37, 197, 102, 96, 36, 155, 49, 212, 186, 178, 112, 138, 117, 184, 29, 12, 207, + 51, 38, 145, 231, 156, 78, 133, 229, 120, 131, 73, 44, 52, 3, 49, 251, 171, 217, 219, 84, + 152, 182, 67, 21, 132, 224, 103, 151, 137, 195, 196, 227, 208, 31, 125, 5, 17, 75, 250, 250, + 179, 45, 78, 81, 66, 171, 131, 38, 115, 192, 108, 86, 66, 70, 222, 207, 251, 171, 156, 129, + 0, 143, 148, 128, 63, 20, 204, 103, 141, 184, 75, 86, 240, 102, 164, 80, 17, 48, 33, 133, + 52, 153, 108, 21, 221, 182, 62, 186, 47, 18, 117, 182, 183, 183, 219, 50, 113, 120, 100, + 211, 96, 212, 145, 177, 57, 50, 73, 247, 234, 124, 194, 154, 68, 241, 153, 68, 198, 21, 79, + 38, 147, 226, 225, 227, 51, 51, 86, 148, 20, 241, 13, 163, 30, 245, 100, 181, 47, 191, 108, + 67, 253, 134, 160, 162, 211, 82, 71, 132, 73, 141, 20, 72, 76, 80, 168, 41, 141, 202, 252, + 56, 24, 63, 210, 168, 0, 73, 74, 145, 42, 69, 181, 178, 168, 190, 240, 193, 139, 180, 217, + 17, 244, 84, 6, 4, 131, 145, 120, 158, 17, 221, 145, 10, 173, 218, 197, 19, 79, 163, 226, + 243, 232, 106, 171, 226, 17, 40, 146, 49, 113, 104, 81, 241, 117, 222, 204, 146, 180, 224, + 81, 168, 243, 70, 129, 37, 73, 214, 98, 60, 93, 56, 4, 88, 129, 189, 0, 148, 7, 107, 177, + 18, 162, 208, 4, 167, 238, 69, 239, 18, 212, 18, 233, 41, 158, 151, 33, 71, 52, 103, 69, 95, + 67, 80, 145, 233, 80, 94, 241, 185, 229, 250, 122, 107, 48, 135, 136, 243, 238, 174, 134, + 28, 162, 166, 178, 214, 94, 61, 48, 28, 72, 59, 214, 96, 60, 131, 117, 152, 207, 160, 248, + 245, 68, 242, 205, 188, 53, 19, 207, 55, 212, 123, 178, 198, 255, 225, 85, 140, 69, 73, 144, + 149, 164, 108, 23, 40, 191, 86, 21, 74, 75, 88, 145, 26, 6, 130, 209, 229, 235, 39, 117, 37, + 147, 169, 208, 92, 139, 242, 104, 173, 95, 73, 215, 172, 72, 85, 120, 51, 125, 123, 79, 15, + 22, 95, 212, 52, 238, 67, 38, 225, 65, 202, 150, 201, 13, 181, 175, 42, 13, 15, 181, 94, + 236, 249, 229, 218, 145, 14, 95, 248, 177, 67, 55, 31, 254, 123, 247, 158, 85, 17, 202, 214, + 58, 58, 208, 233, 96, 107, 218, 215, 167, 26, 119, 12, 245, 180, 85, 105, 65, 234, 88, 216, + 167, 101, 55, 13, 104, 169, 160, 92, 28, 76, 117, 125, 181, 240, 126, 207, 198, 98, 115, + 124, 245, 8, 0, 130, 241, 217, 143, 169, 9, 186, 18, 154, 225, 107, 247, 34, 53, 85, 81, 1, + 98, 142, 232, 187, 24, 163, 220, 148, 91, 230, 114, 168, 230, 124, 170, 71, 206, 161, 218, + 169, 108, 100, 253, 157, 248, 172, 122, 122, 162, 120, 126, 38, 131, 147, 212, 51, 253, 159, + 231, 150, 112, 40, 103, 37, 78, 89, 74, 182, 87, 18, 122, 184, 201, 132, 130, 113, 97, 231, + 146, 149, 210, 245, 65, 77, 8, 14, 179, 16, 202, 14, 175, 234, 61, 185, 187, 55, 237, 141, + 172, 218, 213, 185, 102, 79, 87, 147, 213, 200, 147, 20, 205, 114, 242, 146, 161, 137, 165, + 35, 231, 198, 219, 35, 107, 30, 61, 115, 109, 223, 138, 35, 15, 71, 168, 147, 114, 91, 32, + 24, 13, 182, 239, 120, 234, 187, 223, 239, 92, 119, 120, 125, 173, 63, 234, 23, 69, 156, + 118, 110, 135, 100, 15, 251, 93, 173, 251, 95, 25, 127, 228, 141, 159, 191, 112, 100, 133, + 150, 8, 3, 182, 164, 126, 172, 150, 215, 176, 90, 156, 16, 134, 173, 11, 181, 2, 68, 58, + 203, 185, 84, 159, 104, 17, 45, 156, 47, 135, 232, 243, 82, 151, 154, 67, 129, 169, 44, 119, + 55, 195, 243, 178, 192, 0, 76, 221, 127, 98, 89, 4, 6, 204, 62, 118, 175, 47, 210, 79, 81, + 175, 217, 194, 109, 27, 30, 253, 78, 238, 137, 226, 31, 205, 14, 209, 64, 127, 200, 196, 43, + 145, 245, 217, 153, 111, 118, 92, 172, 238, 255, 214, 158, 11, 111, 156, 63, 120, 238, 241, + 254, 102, 55, 249, 64, 199, 233, 211, 39, 14, 109, 95, 85, 195, 136, 30, 187, 78, 113, 251, + 129, 151, 14, 175, 252, 198, 134, 228, 231, 214, 69, 195, 147, 207, 156, 209, 185, 237, 158, + 189, 77, 222, 194, 177, 133, 225, 236, 2, 15, 17, 56, 89, 97, 241, 71, 83, 205, 102, 80, 49, + 95, 116, 214, 166, 5, 20, 53, 2, 178, 40, 95, 149, 201, 32, 41, 203, 30, 54, 135, 66, 211, + 217, 64, 151, 167, 156, 225, 56, 134, 249, 28, 207, 96, 73, 231, 177, 103, 100, 226, 226, + 245, 100, 162, 100, 25, 56, 246, 75, 192, 125, 153, 117, 202, 152, 224, 140, 32, 181, 146, + 6, 244, 150, 238, 20, 119, 16, 82, 200, 91, 136, 102, 177, 73, 22, 195, 253, 232, 170, 201, + 72, 148, 59, 29, 59, 145, 81, 174, 114, 185, 52, 155, 129, 248, 152, 169, 119, 16, 203, 4, + 142, 250, 171, 193, 238, 114, 43, 230, 226, 114, 171, 133, 149, 29, 110, 187, 185, 240, 1, + 107, 98, 104, 26, 219, 53, 245, 227, 176, 79, 194, 168, 236, 154, 189, 69, 205, 210, 42, + 116, 194, 229, 123, 81, 185, 80, 19, 173, 5, 79, 14, 253, 109, 186, 22, 84, 21, 164, 28, + 145, 190, 152, 137, 58, 25, 198, 105, 250, 41, 10, 67, 22, 194, 136, 204, 90, 188, 158, 90, + 47, 32, 175, 23, 1, 153, 202, 246, 56, 115, 40, 58, 149, 77, 221, 209, 56, 246, 190, 120, + 60, 142, 133, 46, 230, 69, 221, 38, 108, 153, 114, 110, 136, 111, 230, 15, 31, 23, 74, 48, + 77, 255, 223, 75, 206, 35, 118, 79, 10, 53, 165, 37, 173, 84, 254, 40, 29, 50, 134, 52, 24, + 152, 50, 138, 115, 233, 68, 81, 179, 36, 205, 242, 38, 198, 146, 236, 59, 216, 183, 225, + 204, 177, 145, 7, 131, 201, 205, 39, 122, 219, 142, 183, 60, 84, 252, 189, 201, 76, 210, + 156, 201, 194, 161, 51, 94, 23, 179, 149, 50, 179, 220, 138, 221, 167, 86, 29, 187, 62, 217, + 217, 48, 112, 252, 229, 223, 29, 236, 60, 184, 121, 177, 147, 165, 158, 96, 100, 135, 75, + 50, 6, 98, 193, 198, 193, 35, 207, 158, 235, 237, 63, 62, 16, 175, 168, 68, 251, 173, 34, + 227, 112, 58, 37, 99, 72, 45, 10, 146, 131, 227, 252, 1, 207, 146, 163, 23, 199, 119, 252, + 246, 242, 217, 189, 139, 93, 254, 26, 197, 62, 167, 71, 116, 27, 87, 53, 25, 150, 45, 208, + 163, 69, 6, 35, 47, 27, 129, 167, 104, 177, 123, 174, 162, 224, 184, 113, 94, 37, 19, 37, + 163, 253, 226, 51, 189, 182, 204, 203, 164, 92, 79, 24, 4, 200, 168, 84, 57, 221, 42, 86, + 196, 167, 200, 172, 104, 78, 167, 42, 25, 8, 23, 83, 86, 0, 67, 189, 59, 223, 194, 187, 153, + 205, 205, 222, 34, 38, 241, 110, 66, 176, 113, 225, 110, 248, 112, 8, 188, 30, 111, 200, 3, + 20, 173, 117, 43, 216, 206, 166, 178, 229, 127, 158, 35, 164, 180, 49, 241, 134, 190, 53, + 238, 62, 211, 116, 162, 238, 33, 161, 100, 117, 255, 222, 239, 117, 33, 177, 110, 207, 154, + 248, 154, 70, 29, 125, 76, 141, 81, 241, 213, 170, 161, 166, 176, 215, 120, 5, 153, 20, 205, + 229, 80, 109, 44, 66, 205, 15, 78, 244, 39, 44, 46, 89, 96, 156, 110, 175, 98, 177, 88, 45, + 246, 248, 202, 52, 249, 146, 174, 105, 253, 28, 82, 70, 150, 58, 130, 99, 73, 193, 254, 5, + 177, 132, 40, 137, 182, 217, 42, 169, 26, 50, 42, 213, 216, 171, 237, 213, 190, 202, 250, + 238, 74, 187, 141, 150, 106, 162, 190, 106, 206, 21, 232, 118, 245, 153, 231, 75, 184, 35, + 211, 94, 178, 50, 43, 182, 170, 25, 92, 191, 177, 218, 146, 122, 21, 247, 100, 237, 247, + 125, 169, 236, 233, 12, 66, 138, 158, 192, 229, 122, 143, 200, 5, 236, 144, 115, 101, 159, + 58, 34, 43, 133, 143, 80, 15, 199, 176, 146, 223, 227, 245, 203, 70, 170, 120, 246, 104, + 137, 185, 82, 46, 127, 138, 67, 175, 114, 58, 113, 19, 141, 19, 77, 172, 228, 10, 232, 140, + 50, 212, 63, 204, 149, 114, 225, 159, 133, 31, 90, 101, 150, 19, 88, 124, 2, 51, 115, 196, + 100, 97, 226, 78, 122, 191, 51, 79, 110, 225, 42, 209, 198, 153, 25, 92, 34, 76, 115, 170, + 51, 204, 96, 23, 108, 129, 169, 5, 216, 44, 174, 213, 236, 230, 186, 58, 41, 6, 188, 108, + 87, 99, 60, 47, 170, 79, 199, 80, 125, 12, 89, 98, 200, 72, 198, 98, 45, 113, 147, 168, 168, + 169, 174, 186, 152, 89, 2, 94, 81, 99, 38, 217, 94, 27, 215, 90, 4, 79, 8, 155, 153, 120, + 231, 232, 163, 99, 96, 77, 98, 232, 146, 209, 25, 148, 208, 15, 82, 216, 220, 6, 7, 173, + 209, 140, 51, 174, 67, 137, 143, 83, 214, 36, 254, 226, 31, 29, 203, 138, 255, 122, 197, + 187, 53, 238, 71, 122, 209, 12, 133, 73, 255, 221, 192, 150, 206, 81, 82, 242, 95, 204, 87, + 107, 108, 219, 214, 25, 229, 83, 164, 40, 146, 162, 40, 137, 148, 40, 137, 122, 75, 180, 30, + 214, 203, 150, 44, 191, 68, 59, 182, 227, 248, 17, 199, 178, 19, 199, 153, 179, 37, 105, 86, + 167, 121, 185, 177, 179, 13, 8, 90, 180, 43, 10, 20, 104, 146, 22, 93, 218, 172, 193, 218, + 181, 77, 183, 20, 107, 187, 101, 77, 182, 196, 77, 246, 4, 188, 0, 27, 144, 161, 64, 131, + 172, 192, 30, 88, 246, 119, 115, 81, 96, 88, 214, 52, 181, 189, 123, 101, 201, 177, 189, 22, + 72, 129, 253, 24, 9, 144, 247, 146, 151, 23, 188, 231, 126, 223, 119, 206, 65, 171, 77, 138, + 124, 31, 99, 108, 126, 167, 195, 39, 146, 216, 45, 108, 97, 136, 142, 105, 117, 1, 244, 15, + 160, 189, 252, 216, 66, 98, 243, 132, 232, 112, 241, 123, 125, 113, 143, 64, 92, 37, 177, + 78, 179, 26, 78, 186, 167, 205, 14, 11, 73, 220, 203, 148, 201, 187, 47, 240, 156, 153, 5, + 138, 246, 197, 149, 103, 111, 216, 84, 171, 145, 83, 52, 247, 167, 227, 248, 27, 174, 168, + 139, 55, 90, 61, 246, 42, 194, 164, 135, 180, 32, 45, 232, 230, 117, 8, 171, 166, 100, 18, + 205, 120, 90, 80, 12, 188, 20, 241, 22, 77, 16, 188, 186, 77, 205, 151, 205, 66, 82, 75, + 104, 179, 75, 31, 93, 84, 67, 189, 240, 174, 59, 24, 123, 175, 32, 128, 158, 32, 128, 22, + 15, 91, 60, 108, 197, 171, 131, 42, 119, 208, 79, 84, 251, 240, 174, 7, 192, 3, 19, 28, 106, + 130, 67, 109, 42, 106, 74, 196, 121, 65, 243, 182, 100, 88, 103, 96, 216, 185, 213, 48, 186, + 18, 164, 72, 124, 213, 97, 137, 231, 150, 55, 76, 185, 14, 194, 252, 6, 216, 174, 175, 236, + 204, 94, 171, 40, 86, 215, 229, 255, 147, 191, 171, 110, 254, 178, 120, 142, 68, 162, 65, + 80, 209, 87, 19, 227, 242, 214, 75, 146, 156, 203, 231, 87, 146, 140, 72, 224, 162, 172, + 112, 29, 74, 200, 101, 103, 255, 233, 204, 200, 24, 167, 10, 167, 49, 147, 221, 47, 203, 94, + 129, 196, 62, 164, 115, 202, 144, 35, 164, 216, 216, 127, 201, 73, 9, 227, 253, 194, 73, 16, + 25, 94, 135, 236, 181, 24, 208, 141, 54, 183, 72, 179, 158, 84, 16, 187, 208, 119, 170, 175, + 124, 118, 120, 129, 95, 201, 174, 55, 181, 0, 163, 212, 249, 22, 186, 59, 158, 232, 44, 255, + 184, 140, 253, 156, 54, 129, 234, 3, 46, 64, 67, 77, 47, 205, 147, 34, 233, 71, 100, 36, + 133, 140, 173, 141, 128, 95, 2, 13, 85, 4, 226, 42, 132, 141, 32, 44, 226, 65, 163, 23, 172, + 35, 117, 179, 104, 221, 69, 157, 186, 167, 11, 1, 69, 86, 196, 211, 187, 159, 55, 96, 21, + 225, 213, 10, 41, 213, 176, 70, 63, 18, 164, 232, 238, 60, 244, 234, 159, 158, 153, 126, + 123, 166, 89, 237, 158, 122, 237, 131, 19, 71, 222, 154, 105, 158, 245, 245, 28, 45, 239, + 123, 121, 166, 63, 105, 245, 246, 206, 140, 76, 190, 52, 61, 80, 111, 197, 39, 6, 127, 49, + 247, 238, 179, 219, 139, 71, 206, 29, 218, 118, 237, 55, 151, 78, 142, 180, 204, 252, 224, + 88, 207, 215, 70, 83, 131, 143, 188, 252, 234, 233, 194, 198, 153, 114, 178, 255, 216, 119, + 94, 57, 13, 245, 33, 172, 172, 26, 168, 30, 94, 176, 182, 39, 62, 75, 31, 178, 62, 171, 70, + 27, 163, 224, 180, 89, 181, 89, 20, 191, 108, 147, 173, 70, 154, 230, 163, 192, 9, 252, 84, + 151, 135, 249, 213, 170, 167, 42, 156, 174, 87, 69, 19, 234, 16, 170, 11, 215, 238, 231, + 195, 26, 12, 193, 181, 97, 32, 201, 42, 78, 53, 68, 162, 145, 72, 77, 69, 106, 206, 252, + 200, 215, 207, 236, 187, 176, 19, 99, 100, 200, 34, 86, 10, 108, 124, 214, 191, 148, 29, 12, + 229, 199, 90, 125, 151, 218, 116, 71, 179, 255, 236, 131, 175, 111, 220, 211, 151, 243, 153, + 241, 191, 52, 30, 157, 122, 96, 32, 190, 152, 132, 169, 14, 25, 133, 120, 75, 11, 80, 52, + 155, 221, 180, 107, 160, 125, 28, 148, 222, 133, 59, 190, 134, 158, 254, 193, 26, 30, 17, + 128, 71, 6, 105, 71, 206, 173, 197, 227, 146, 44, 209, 44, 169, 1, 103, 53, 170, 115, 89, + 173, 232, 81, 155, 192, 89, 167, 145, 197, 89, 20, 213, 249, 186, 4, 171, 169, 146, 81, 166, + 41, 143, 39, 216, 4, 22, 121, 89, 79, 12, 7, 183, 90, 170, 37, 111, 121, 157, 50, 92, 103, + 113, 45, 66, 11, 150, 226, 141, 235, 21, 29, 240, 206, 23, 159, 170, 102, 187, 64, 158, 88, + 87, 177, 19, 94, 143, 175, 133, 113, 157, 15, 35, 34, 209, 161, 111, 12, 53, 118, 138, 141, + 56, 201, 72, 81, 183, 226, 179, 80, 88, 142, 6, 165, 187, 121, 102, 10, 99, 164, 128, 83, + 246, 139, 20, 246, 17, 157, 246, 160, 206, 137, 227, 95, 78, 93, 113, 228, 70, 138, 23, 183, + 191, 56, 254, 232, 80, 24, 95, 234, 126, 100, 223, 176, 211, 122, 108, 239, 226, 223, 172, + 126, 206, 200, 129, 76, 97, 204, 28, 154, 110, 220, 86, 10, 46, 124, 176, 130, 242, 249, + 168, 55, 212, 253, 213, 137, 64, 115, 76, 90, 28, 72, 15, 237, 133, 181, 148, 88, 154, 199, + 207, 128, 92, 234, 67, 230, 214, 162, 251, 51, 196, 130, 229, 144, 18, 146, 199, 138, 58, + 167, 148, 192, 137, 132, 45, 121, 173, 203, 187, 233, 42, 138, 35, 20, 18, 66, 17, 157, 79, + 32, 148, 64, 97, 44, 78, 37, 168, 68, 134, 5, 6, 228, 66, 215, 8, 176, 164, 218, 69, 221, + 187, 206, 134, 65, 253, 93, 17, 148, 98, 28, 250, 151, 57, 248, 12, 246, 161, 64, 253, 95, + 77, 187, 86, 167, 98, 32, 85, 13, 213, 13, 192, 87, 235, 161, 198, 134, 122, 3, 232, 99, 80, + 164, 226, 103, 48, 146, 98, 56, 218, 20, 109, 27, 45, 180, 77, 180, 123, 163, 165, 225, 209, + 114, 41, 218, 243, 205, 75, 15, 183, 61, 52, 218, 172, 224, 6, 202, 196, 25, 133, 244, 198, + 61, 157, 61, 135, 251, 181, 72, 251, 240, 200, 150, 246, 104, 251, 244, 217, 189, 233, 177, + 158, 172, 72, 19, 111, 211, 80, 162, 178, 138, 71, 9, 151, 182, 196, 19, 157, 249, 116, 182, + 216, 191, 91, 223, 250, 194, 84, 135, 221, 235, 87, 156, 6, 73, 113, 218, 57, 95, 216, 23, + 221, 176, 35, 151, 220, 144, 175, 135, 175, 59, 134, 158, 222, 215, 42, 200, 46, 209, 10, + 247, 224, 117, 16, 227, 51, 32, 198, 3, 200, 122, 62, 51, 34, 52, 237, 176, 25, 173, 180, + 173, 226, 105, 188, 247, 146, 116, 97, 14, 176, 201, 205, 235, 185, 138, 40, 124, 231, 179, + 222, 223, 243, 57, 181, 176, 91, 165, 215, 137, 25, 104, 113, 44, 204, 226, 243, 183, 176, + 138, 171, 129, 26, 246, 175, 139, 167, 121, 6, 136, 118, 214, 204, 224, 79, 114, 12, 241, + 119, 131, 221, 225, 178, 113, 119, 191, 187, 82, 149, 247, 136, 2, 101, 87, 28, 118, 174, + 242, 223, 191, 6, 60, 76, 3, 21, 24, 64, 118, 175, 251, 111, 55, 34, 7, 100, 73, 98, 236, + 140, 195, 228, 41, 3, 229, 33, 7, 76, 118, 7, 189, 70, 80, 151, 96, 20, 84, 84, 202, 50, 15, + 234, 150, 207, 29, 121, 79, 151, 0, 102, 170, 108, 92, 77, 132, 100, 37, 201, 64, 97, 187, + 40, 65, 209, 84, 95, 204, 97, 66, 47, 227, 168, 37, 232, 85, 131, 54, 10, 251, 54, 138, 117, + 144, 156, 20, 86, 189, 33, 222, 192, 170, 38, 158, 198, 113, 218, 108, 34, 174, 88, 29, 44, + 129, 211, 60, 115, 247, 87, 68, 7, 216, 123, 156, 228, 93, 18, 92, 207, 31, 151, 62, 161, + 158, 0, 235, 105, 69, 190, 191, 110, 61, 14, 46, 148, 50, 153, 194, 97, 150, 73, 167, 17, + 36, 19, 114, 176, 25, 54, 147, 109, 117, 4, 175, 162, 151, 0, 13, 5, 176, 180, 238, 214, 29, + 133, 114, 172, 204, 112, 136, 28, 76, 155, 90, 29, 129, 112, 42, 203, 137, 158, 178, 184, + 34, 178, 224, 74, 192, 162, 65, 240, 222, 156, 23, 230, 178, 69, 160, 219, 28, 192, 93, 65, + 4, 132, 235, 181, 43, 4, 66, 185, 159, 137, 86, 99, 18, 68, 215, 161, 99, 175, 162, 179, 22, + 39, 50, 105, 176, 170, 49, 143, 55, 166, 176, 232, 32, 182, 216, 67, 90, 149, 184, 55, 144, + 112, 177, 232, 36, 134, 91, 130, 62, 103, 157, 104, 232, 197, 208, 15, 33, 104, 94, 23, 144, + 116, 104, 25, 67, 111, 19, 172, 28, 118, 123, 2, 188, 193, 24, 230, 45, 70, 28, 55, 10, 28, + 126, 227, 211, 250, 229, 182, 200, 19, 231, 109, 10, 7, 234, 141, 200, 223, 253, 61, 209, + 108, 50, 211, 4, 110, 52, 155, 238, 94, 35, 218, 87, 160, 197, 144, 97, 80, 101, 110, 225, + 191, 3, 222, 167, 5, 57, 121, 5, 123, 12, 123, 124, 5, 219, 139, 70, 15, 173, 206, 162, 231, + 127, 2, 8, 165, 133, 158, 69, 127, 116, 25, 49, 71, 80, 43, 30, 201, 204, 98, 170, 46, 91, + 17, 99, 75, 212, 19, 49, 224, 254, 77, 177, 59, 74, 95, 254, 99, 157, 31, 196, 7, 106, 76, + 85, 170, 186, 163, 121, 40, 169, 254, 60, 15, 49, 132, 117, 1, 130, 40, 221, 199, 135, 16, + 67, 168, 114, 65, 114, 20, 86, 251, 38, 73, 46, 128, 18, 13, 43, 52, 5, 72, 238, 30, 235, + 99, 5, 60, 65, 132, 98, 54, 69, 0, 211, 114, 93, 59, 167, 91, 182, 60, 212, 46, 219, 83, + 253, 251, 79, 140, 143, 63, 150, 181, 18, 17, 205, 230, 18, 8, 244, 253, 212, 161, 174, 252, + 216, 134, 140, 215, 108, 242, 230, 227, 133, 169, 93, 125, 162, 211, 194, 19, 148, 201, 248, + 166, 111, 64, 143, 53, 77, 28, 109, 107, 122, 230, 249, 19, 83, 27, 122, 75, 95, 18, 120, + 28, 164, 215, 63, 186, 187, 115, 163, 7, 166, 15, 39, 130, 221, 197, 96, 219, 193, 111, 109, + 135, 220, 215, 6, 80, 123, 143, 60, 130, 36, 145, 78, 228, 165, 181, 168, 233, 162, 201, + 226, 81, 189, 190, 96, 161, 169, 232, 46, 186, 65, 20, 137, 8, 196, 203, 93, 111, 97, 138, + 77, 1, 130, 202, 221, 137, 246, 185, 69, 139, 137, 224, 229, 30, 126, 160, 245, 99, 157, 26, + 172, 85, 206, 74, 252, 204, 87, 112, 187, 49, 159, 170, 4, 222, 163, 79, 241, 115, 203, 135, + 136, 86, 208, 83, 238, 127, 150, 149, 170, 27, 137, 82, 21, 203, 80, 64, 107, 14, 140, 199, + 169, 74, 147, 168, 170, 39, 128, 167, 36, 65, 197, 128, 191, 39, 101, 250, 14, 28, 31, 219, + 241, 120, 86, 196, 162, 90, 204, 77, 160, 12, 102, 180, 3, 199, 160, 138, 4, 186, 133, 228, + 205, 102, 131, 208, 189, 243, 112, 83, 235, 182, 214, 176, 141, 254, 33, 227, 41, 212, 231, + 31, 222, 213, 111, 241, 167, 14, 118, 53, 140, 118, 101, 253, 22, 236, 201, 214, 231, 78, + 29, 63, 208, 209, 165, 111, 183, 240, 130, 153, 108, 162, 161, 61, 5, 151, 197, 195, 74, 83, + 33, 35, 6, 251, 75, 49, 95, 99, 87, 239, 198, 132, 171, 167, 181, 174, 253, 208, 169, 177, + 115, 221, 157, 233, 45, 147, 71, 166, 65, 166, 15, 0, 100, 183, 225, 191, 69, 26, 145, 167, + 214, 69, 163, 219, 141, 88, 32, 144, 30, 173, 225, 223, 154, 151, 68, 73, 230, 118, 170, + 207, 119, 91, 67, 156, 130, 19, 99, 112, 167, 237, 19, 61, 92, 197, 96, 225, 6, 100, 159, + 248, 124, 9, 52, 192, 13, 68, 225, 92, 49, 5, 193, 115, 127, 209, 79, 171, 162, 161, 74, 92, + 32, 218, 32, 72, 32, 224, 160, 126, 128, 136, 86, 217, 139, 192, 183, 81, 188, 149, 229, + 213, 76, 127, 179, 254, 192, 166, 180, 202, 237, 24, 239, 216, 217, 17, 19, 104, 35, 97, + 228, 28, 173, 67, 19, 153, 215, 94, 177, 103, 55, 79, 159, 222, 173, 245, 117, 52, 122, 40, + 124, 179, 24, 241, 75, 158, 144, 218, 184, 245, 224, 225, 201, 200, 228, 126, 95, 157, 207, + 204, 179, 254, 160, 234, 12, 121, 172, 223, 59, 219, 246, 220, 169, 167, 15, 232, 156, 228, + 87, 68, 100, 57, 75, 137, 34, 121, 8, 73, 0, 218, 95, 135, 139, 206, 248, 147, 165, 0, 120, + 97, 12, 20, 32, 60, 138, 61, 144, 192, 163, 61, 224, 161, 145, 70, 12, 124, 250, 142, 187, + 175, 121, 125, 134, 193, 0, 17, 33, 217, 67, 92, 114, 217, 74, 140, 65, 120, 156, 247, 253, + 233, 127, 229, 39, 81, 227, 113, 185, 102, 64, 208, 90, 130, 74, 203, 249, 153, 196, 67, 49, + 187, 2, 156, 135, 175, 146, 159, 45, 99, 45, 97, 59, 37, 165, 251, 247, 31, 223, 30, 31, + 104, 111, 176, 63, 136, 50, 54, 159, 211, 225, 5, 126, 117, 241, 38, 72, 211, 255, 144, 94, + 237, 177, 109, 220, 117, 252, 222, 103, 223, 157, 99, 159, 207, 190, 243, 219, 241, 35, 78, + 108, 39, 126, 196, 175, 56, 182, 147, 203, 59, 118, 222, 77, 210, 164, 105, 215, 181, 89, + 105, 183, 52, 77, 90, 96, 106, 75, 217, 232, 31, 219, 196, 52, 81, 88, 91, 52, 105, 218, 36, + 16, 67, 128, 182, 161, 161, 142, 209, 137, 9, 254, 137, 144, 64, 136, 173, 168, 218, 127, + 20, 80, 85, 208, 152, 34, 196, 164, 65, 51, 26, 151, 239, 249, 145, 56, 78, 161, 1, 228, 63, + 124, 254, 229, 126, 151, 251, 126, 126, 223, 207, 227, 155, 152, 237, 143, 54, 234, 122, + 243, 181, 36, 253, 190, 107, 164, 219, 239, 140, 15, 228, 11, 206, 206, 111, 188, 248, 194, + 201, 94, 193, 21, 50, 163, 69, 90, 163, 184, 160, 134, 222, 92, 28, 24, 142, 238, 91, 58, + 179, 18, 58, 122, 34, 187, 116, 121, 14, 144, 27, 131, 126, 122, 21, 244, 45, 4, 222, 81, + 135, 220, 59, 129, 246, 20, 69, 32, 234, 235, 88, 131, 172, 246, 240, 156, 3, 55, 24, 60, + 225, 235, 152, 70, 54, 34, 30, 234, 103, 169, 84, 192, 193, 243, 92, 251, 141, 64, 129, 251, + 189, 236, 24, 171, 137, 55, 97, 30, 82, 229, 186, 66, 210, 82, 186, 4, 101, 147, 74, 220, + 20, 246, 176, 171, 218, 81, 48, 196, 237, 232, 38, 140, 174, 213, 57, 37, 130, 250, 74, 188, + 84, 238, 192, 95, 149, 191, 122, 243, 234, 18, 77, 62, 182, 42, 31, 31, 137, 168, 213, 106, + 66, 165, 81, 113, 185, 153, 99, 237, 7, 158, 59, 208, 106, 78, 238, 63, 251, 202, 226, 204, + 147, 35, 238, 31, 76, 22, 122, 142, 141, 165, 248, 227, 79, 124, 109, 214, 131, 221, 25, 88, + 25, 15, 184, 186, 172, 199, 150, 4, 81, 208, 112, 140, 205, 110, 81, 115, 146, 192, 181, 76, + 127, 121, 166, 231, 155, 151, 159, 59, 222, 21, 232, 157, 74, 197, 186, 219, 70, 63, 215, + 97, 105, 203, 34, 232, 253, 92, 241, 10, 30, 37, 207, 33, 179, 200, 165, 58, 246, 233, 29, + 188, 243, 167, 232, 29, 112, 9, 30, 189, 35, 123, 242, 217, 97, 57, 159, 145, 243, 162, 152, + 151, 51, 4, 18, 224, 110, 143, 15, 57, 178, 183, 51, 78, 175, 126, 120, 56, 121, 91, 246, + 78, 84, 11, 95, 131, 110, 217, 92, 83, 70, 187, 53, 9, 98, 97, 88, 65, 33, 93, 10, 134, 101, + 55, 16, 30, 190, 181, 46, 61, 210, 116, 25, 177, 234, 248, 163, 204, 59, 181, 41, 50, 37, + 84, 137, 25, 75, 85, 172, 86, 20, 241, 40, 134, 83, 42, 134, 162, 141, 54, 159, 20, 204, + 181, 58, 88, 254, 151, 172, 134, 160, 212, 108, 3, 253, 171, 215, 249, 206, 153, 149, 129, + 182, 52, 77, 16, 56, 1, 119, 209, 180, 70, 107, 212, 5, 114, 65, 59, 247, 218, 69, 134, 197, + 32, 120, 105, 152, 167, 205, 186, 236, 236, 106, 159, 24, 241, 59, 41, 138, 34, 83, 4, 111, + 148, 12, 156, 74, 173, 178, 164, 102, 210, 11, 90, 158, 53, 73, 70, 29, 115, 239, 141, 153, + 11, 83, 205, 13, 20, 201, 49, 132, 160, 220, 128, 227, 56, 220, 144, 193, 33, 41, 168, 36, + 147, 168, 103, 159, 218, 119, 97, 178, 153, 84, 115, 20, 169, 135, 254, 236, 5, 196, 21, + 255, 205, 34, 83, 200, 219, 117, 204, 214, 196, 226, 217, 108, 110, 106, 210, 110, 203, 217, + 114, 67, 10, 185, 125, 172, 31, 177, 197, 179, 136, 141, 32, 83, 121, 231, 84, 46, 70, 120, + 229, 141, 72, 161, 69, 253, 169, 94, 47, 141, 222, 245, 142, 73, 127, 148, 201, 45, 252, + 148, 238, 68, 214, 131, 21, 210, 42, 174, 18, 11, 175, 173, 175, 85, 60, 133, 71, 99, 250, + 242, 17, 184, 255, 231, 39, 194, 201, 144, 15, 60, 130, 100, 114, 175, 182, 109, 215, 13, + 173, 188, 116, 100, 250, 121, 191, 150, 69, 73, 154, 213, 169, 57, 111, 246, 64, 79, 114, + 174, 199, 207, 240, 110, 86, 55, 120, 104, 37, 61, 242, 120, 183, 173, 44, 20, 187, 172, + 124, 127, 95, 187, 83, 171, 117, 37, 124, 37, 149, 8, 77, 158, 155, 104, 113, 73, 140, 160, + 165, 68, 209, 36, 176, 70, 139, 40, 182, 246, 135, 15, 158, 115, 53, 141, 116, 55, 183, 207, + 157, 29, 232, 4, 103, 58, 213, 91, 107, 238, 237, 211, 203, 103, 86, 219, 130, 195, 49, 71, + 110, 249, 202, 28, 56, 80, 247, 253, 207, 240, 183, 192, 219, 123, 144, 167, 234, 206, 195, + 19, 50, 123, 123, 88, 132, 241, 176, 38, 182, 39, 78, 144, 194, 134, 156, 46, 120, 204, 12, + 226, 13, 81, 14, 255, 160, 99, 148, 28, 221, 142, 129, 202, 232, 169, 64, 30, 94, 131, 16, + 93, 30, 90, 101, 203, 158, 247, 109, 103, 72, 101, 38, 77, 84, 77, 186, 58, 48, 236, 242, + 113, 24, 169, 40, 26, 122, 156, 49, 42, 18, 202, 147, 232, 42, 76, 5, 214, 160, 51, 177, + 250, 232, 8, 63, 137, 49, 6, 151, 201, 12, 203, 88, 213, 204, 157, 252, 150, 153, 247, 31, + 90, 205, 200, 11, 105, 139, 138, 54, 171, 88, 197, 168, 89, 21, 214, 106, 233, 49, 217, 35, + 30, 67, 215, 169, 171, 179, 197, 51, 213, 229, 26, 39, 127, 194, 146, 76, 68, 74, 78, 222, + 212, 179, 16, 247, 246, 123, 20, 151, 2, 228, 208, 191, 146, 97, 68, 64, 252, 200, 210, 78, + 236, 222, 246, 59, 13, 14, 200, 65, 139, 50, 203, 56, 29, 14, 131, 211, 79, 120, 205, 218, + 235, 232, 208, 59, 164, 236, 205, 155, 43, 6, 115, 107, 12, 198, 69, 5, 180, 15, 111, 174, + 43, 233, 7, 48, 251, 201, 67, 238, 85, 180, 161, 2, 74, 25, 136, 234, 175, 45, 27, 250, 136, + 228, 109, 1, 135, 221, 167, 199, 72, 74, 111, 133, 171, 38, 1, 43, 254, 99, 27, 146, 107, + 224, 59, 174, 50, 104, 196, 175, 65, 28, 24, 70, 242, 217, 108, 77, 102, 181, 218, 220, 244, + 207, 104, 181, 118, 252, 25, 186, 92, 59, 13, 149, 222, 207, 20, 175, 96, 88, 169, 210, 12, + 242, 165, 186, 74, 13, 145, 76, 20, 42, 61, 42, 115, 76, 212, 25, 137, 24, 114, 153, 104, + 50, 171, 188, 190, 172, 38, 147, 249, 224, 93, 217, 188, 69, 167, 91, 235, 138, 24, 242, + 177, 24, 136, 227, 239, 182, 75, 222, 219, 158, 7, 87, 190, 91, 12, 171, 56, 220, 163, 120, + 171, 31, 170, 55, 160, 36, 165, 179, 183, 56, 28, 128, 72, 241, 35, 109, 100, 116, 185, 224, + 79, 149, 149, 143, 225, 104, 154, 225, 4, 173, 43, 222, 108, 99, 127, 14, 205, 228, 50, 73, + 141, 15, 194, 229, 179, 191, 143, 95, 152, 109, 227, 20, 149, 35, 5, 96, 26, 135, 161, 152, + 16, 42, 36, 241, 247, 182, 81, 66, 145, 46, 96, 210, 53, 96, 82, 124, 87, 102, 9, 16, 2, + 168, 31, 78, 224, 193, 128, 96, 240, 195, 199, 41, 235, 131, 142, 128, 160, 137, 228, 13, + 14, 61, 25, 116, 250, 105, 179, 119, 208, 60, 170, 169, 33, 70, 41, 176, 172, 173, 89, 128, + 75, 101, 5, 3, 1, 107, 231, 99, 21, 208, 100, 227, 67, 119, 151, 108, 132, 162, 81, 84, 44, + 249, 109, 105, 44, 67, 119, 49, 170, 114, 129, 95, 227, 205, 197, 243, 168, 134, 81, 169, + 140, 30, 139, 173, 209, 192, 16, 197, 63, 60, 86, 130, 4, 90, 133, 194, 80, 118, 155, 72, + 223, 65, 191, 173, 50, 88, 60, 38, 147, 75, 80, 225, 223, 226, 44, 82, 241, 71, 197, 140, + 222, 76, 171, 53, 42, 18, 84, 70, 141, 126, 82, 212, 148, 250, 8, 192, 217, 230, 208, 189, + 223, 162, 231, 213, 26, 26, 199, 105, 182, 172, 58, 232, 223, 0, 43, 35, 50, 84, 135, 149, + 206, 136, 176, 50, 131, 48, 70, 150, 32, 117, 131, 21, 169, 40, 177, 196, 82, 145, 21, 118, + 247, 31, 161, 214, 84, 93, 101, 127, 122, 176, 10, 152, 119, 179, 27, 41, 191, 15, 249, 103, + 240, 165, 131, 200, 247, 234, 222, 39, 221, 223, 214, 22, 74, 75, 162, 219, 53, 238, 62, + 136, 28, 132, 127, 14, 51, 33, 211, 225, 102, 167, 11, 124, 203, 134, 156, 47, 116, 132, 64, + 130, 17, 177, 141, 117, 31, 28, 239, 79, 55, 196, 186, 242, 177, 81, 219, 150, 198, 85, 68, + 14, 124, 29, 180, 49, 188, 6, 97, 155, 135, 99, 212, 167, 215, 224, 235, 23, 202, 129, 42, + 21, 185, 254, 219, 103, 213, 235, 165, 111, 135, 92, 62, 104, 169, 130, 74, 69, 62, 165, + 109, 21, 37, 79, 160, 91, 167, 12, 42, 26, 205, 181, 159, 60, 82, 80, 52, 180, 180, 168, + 163, 208, 85, 154, 108, 207, 198, 150, 202, 139, 85, 72, 127, 140, 170, 5, 187, 193, 104, + 213, 18, 168, 91, 59, 112, 232, 84, 58, 187, 63, 101, 193, 13, 131, 135, 150, 59, 250, 22, + 58, 76, 59, 196, 213, 30, 183, 200, 163, 185, 147, 87, 246, 23, 87, 182, 23, 29, 157, 230, + 92, 126, 231, 34, 254, 44, 52, 12, 174, 248, 212, 27, 110, 24, 78, 93, 233, 137, 176, 103, + 180, 59, 224, 235, 157, 143, 123, 250, 189, 72, 213, 171, 224, 148, 58, 145, 11, 117, 167, + 228, 139, 90, 44, 86, 31, 209, 128, 35, 90, 212, 128, 107, 27, 154, 140, 27, 114, 178, 208, + 100, 109, 32, 44, 218, 168, 79, 213, 24, 204, 55, 142, 170, 119, 218, 142, 194, 46, 56, 14, + 56, 130, 173, 115, 16, 31, 190, 171, 194, 170, 189, 67, 141, 191, 165, 162, 207, 64, 255, + 85, 141, 138, 38, 227, 185, 122, 155, 218, 129, 102, 255, 225, 51, 57, 5, 67, 236, 67, 168, + 122, 243, 55, 219, 144, 57, 59, 197, 220, 200, 127, 132, 204, 223, 55, 15, 190, 52, 14, 51, + 192, 13, 64, 73, 66, 194, 200, 252, 78, 156, 222, 5, 53, 119, 202, 106, 196, 164, 51, 97, 2, + 110, 242, 42, 33, 139, 229, 236, 159, 10, 5, 255, 109, 153, 222, 78, 239, 48, 42, 221, 4, + 108, 214, 21, 80, 152, 221, 127, 174, 73, 168, 219, 249, 189, 58, 50, 150, 132, 152, 192, + 111, 216, 210, 243, 103, 95, 122, 228, 200, 243, 243, 1, 107, 231, 92, 233, 234, 64, 224, + 135, 198, 232, 68, 71, 118, 113, 44, 221, 164, 23, 163, 227, 29, 185, 163, 202, 21, 246, + 133, 194, 203, 95, 127, 250, 112, 42, 52, 127, 113, 170, 240, 242, 165, 175, 28, 78, 133, + 231, 47, 46, 180, 79, 166, 28, 193, 252, 226, 234, 147, 29, 237, 147, 29, 142, 96, 97, 241, + 244, 23, 193, 137, 238, 22, 175, 226, 31, 64, 109, 1, 152, 12, 47, 215, 231, 71, 87, 34, + 201, 105, 18, 154, 132, 73, 35, 153, 16, 165, 52, 91, 80, 226, 146, 9, 23, 65, 71, 54, 124, + 5, 73, 99, 106, 36, 244, 214, 188, 126, 34, 125, 183, 166, 152, 210, 193, 150, 179, 203, + 205, 245, 176, 34, 175, 91, 114, 91, 202, 48, 123, 127, 64, 13, 42, 205, 53, 253, 81, 219, + 12, 116, 53, 217, 208, 162, 88, 66, 233, 131, 114, 208, 107, 43, 116, 197, 197, 89, 76, 13, + 206, 44, 193, 68, 136, 110, 98, 165, 225, 17, 218, 161, 161, 15, 134, 199, 209, 19, 178, + 237, 77, 136, 125, 205, 201, 211, 71, 70, 120, 87, 120, 185, 63, 49, 215, 23, 117, 105, 177, + 103, 58, 95, 188, 250, 194, 114, 143, 190, 49, 104, 41, 78, 86, 245, 140, 248, 11, 164, 61, + 232, 139, 215, 93, 35, 61, 129, 248, 220, 217, 137, 224, 112, 220, 150, 133, 180, 247, 221, + 193, 129, 246, 153, 165, 207, 159, 46, 51, 9, 251, 4, 112, 140, 33, 203, 117, 40, 50, 45, + 60, 111, 215, 219, 16, 187, 141, 187, 142, 154, 100, 157, 220, 86, 208, 219, 248, 22, 123, + 51, 37, 185, 243, 210, 150, 226, 150, 25, 20, 94, 219, 114, 164, 119, 17, 238, 33, 183, 215, + 207, 53, 255, 78, 155, 68, 120, 51, 168, 67, 163, 82, 9, 146, 195, 224, 62, 176, 127, 136, + 159, 216, 153, 95, 42, 92, 113, 73, 221, 133, 169, 102, 222, 227, 144, 40, 10, 127, 133, + 144, 28, 141, 86, 61, 205, 208, 153, 199, 47, 77, 23, 87, 119, 83, 228, 53, 255, 104, 218, + 77, 210, 106, 138, 82, 180, 68, 125, 127, 29, 251, 24, 16, 24, 68, 222, 220, 137, 192, 123, + 32, 33, 155, 16, 116, 226, 88, 131, 28, 20, 51, 240, 65, 60, 218, 184, 108, 29, 120, 191, + 165, 145, 140, 144, 50, 137, 147, 204, 251, 114, 161, 113, 163, 5, 9, 232, 2, 24, 135, 7, + 194, 183, 100, 107, 165, 29, 54, 111, 34, 192, 155, 224, 122, 55, 92, 192, 23, 95, 118, 241, + 52, 76, 130, 202, 12, 168, 52, 148, 247, 255, 121, 86, 25, 66, 172, 10, 33, 144, 141, 216, + 242, 246, 157, 65, 8, 50, 52, 1, 191, 177, 10, 162, 31, 83, 172, 86, 205, 185, 34, 125, 161, + 214, 254, 144, 41, 49, 249, 200, 68, 34, 117, 226, 242, 66, 120, 186, 47, 162, 81, 209, 24, + 69, 51, 12, 205, 185, 83, 251, 114, 169, 137, 184, 57, 62, 113, 104, 34, 17, 127, 244, 217, + 41, 223, 80, 182, 149, 101, 241, 101, 198, 213, 40, 10, 38, 131, 57, 152, 114, 180, 36, 2, + 254, 204, 116, 247, 224, 249, 185, 104, 131, 104, 229, 84, 60, 167, 18, 149, 49, 239, 95, + 140, 87, 109, 108, 83, 215, 25, 62, 231, 220, 111, 223, 79, 223, 123, 109, 95, 219, 113, + 252, 21, 127, 36, 206, 135, 137, 33, 198, 77, 10, 134, 66, 147, 16, 2, 91, 3, 116, 21, 163, + 161, 99, 108, 104, 130, 6, 214, 66, 171, 105, 133, 109, 90, 161, 221, 212, 77, 168, 163, + 213, 52, 177, 253, 96, 85, 213, 173, 19, 195, 73, 71, 70, 64, 219, 90, 211, 31, 211, 210, + 125, 49, 250, 139, 118, 93, 37, 212, 78, 205, 166, 73, 85, 169, 182, 58, 217, 123, 110, 236, + 64, 178, 116, 37, 81, 20, 251, 220, 143, 243, 62, 207, 121, 222, 247, 125, 222, 112, 52, 28, + 238, 232, 139, 183, 173, 202, 181, 149, 70, 202, 235, 15, 141, 116, 42, 166, 95, 246, 80, + 166, 15, 205, 253, 147, 92, 102, 127, 134, 54, 162, 111, 45, 209, 90, 107, 79, 123, 174, + 152, 91, 47, 74, 235, 164, 117, 69, 41, 151, 203, 23, 3, 197, 0, 202, 175, 31, 40, 174, 235, + 19, 219, 223, 150, 114, 241, 158, 1, 253, 195, 114, 124, 33, 215, 128, 130, 153, 238, 233, + 82, 9, 154, 233, 52, 37, 213, 44, 213, 19, 182, 90, 53, 224, 143, 242, 107, 221, 198, 211, + 13, 37, 38, 25, 158, 247, 217, 52, 19, 129, 39, 215, 37, 9, 11, 99, 28, 232, 18, 236, 165, + 75, 97, 161, 216, 80, 40, 220, 69, 46, 19, 222, 35, 107, 210, 245, 189, 44, 159, 203, 135, + 179, 17, 191, 40, 74, 28, 200, 75, 140, 181, 117, 5, 86, 223, 179, 58, 76, 56, 142, 217, + 251, 152, 172, 240, 138, 165, 30, 205, 97, 217, 118, 187, 43, 135, 115, 215, 117, 15, 243, + 180, 228, 243, 251, 189, 158, 89, 143, 111, 165, 183, 208, 37, 121, 36, 89, 87, 163, 205, + 142, 32, 104, 50, 239, 20, 134, 123, 148, 72, 44, 166, 225, 127, 171, 150, 150, 138, 249, + 175, 10, 138, 196, 178, 146, 34, 92, 245, 3, 143, 7, 161, 174, 255, 141, 185, 136, 250, 208, + 225, 37, 60, 38, 100, 7, 173, 232, 235, 94, 145, 108, 9, 58, 72, 118, 90, 86, 4, 147, 125, + 221, 18, 76, 184, 205, 131, 237, 31, 150, 141, 225, 186, 129, 104, 84, 43, 32, 175, 208, 93, + 165, 131, 154, 183, 68, 41, 11, 220, 198, 51, 183, 56, 142, 133, 81, 183, 103, 33, 117, 93, + 30, 151, 56, 112, 166, 29, 123, 204, 136, 207, 14, 235, 28, 137, 27, 27, 119, 141, 149, 54, + 236, 42, 5, 37, 97, 172, 225, 42, 57, 252, 32, 207, 203, 238, 212, 182, 123, 200, 220, 138, + 229, 198, 114, 16, 216, 116, 221, 227, 11, 137, 161, 114, 54, 181, 238, 190, 85, 241, 141, + 73, 178, 178, 145, 199, 181, 63, 133, 86, 71, 154, 87, 180, 216, 119, 238, 63, 245, 25, 252, + 157, 198, 50, 48, 244, 85, 240, 7, 103, 128, 161, 21, 104, 199, 210, 190, 23, 199, 39, 42, + 166, 63, 59, 69, 162, 8, 161, 24, 254, 79, 89, 46, 251, 59, 6, 19, 106, 120, 176, 110, 155, + 77, 42, 42, 64, 123, 101, 198, 184, 230, 38, 170, 180, 244, 114, 189, 245, 67, 109, 157, 39, + 32, 195, 164, 211, 11, 41, 102, 249, 64, 36, 117, 157, 48, 103, 120, 54, 181, 235, 208, 137, + 79, 9, 102, 48, 230, 143, 166, 125, 18, 126, 28, 99, 209, 140, 134, 66, 49, 47, 143, 247, + 115, 189, 159, 219, 54, 148, 97, 100, 112, 218, 78, 179, 87, 96, 158, 3, 63, 123, 224, 205, + 107, 127, 217, 35, 43, 2, 97, 69, 205, 195, 108, 151, 189, 130, 170, 1, 46, 65, 149, 106, + 33, 133, 191, 239, 249, 74, 245, 136, 235, 158, 57, 9, 112, 126, 23, 220, 234, 203, 128, + 115, 8, 125, 115, 41, 206, 14, 252, 147, 137, 230, 132, 101, 230, 167, 240, 71, 224, 147, + 122, 241, 227, 19, 230, 29, 102, 98, 253, 20, 209, 1, 120, 59, 174, 149, 205, 114, 162, 127, + 112, 213, 96, 103, 159, 197, 4, 51, 131, 139, 199, 134, 6, 5, 144, 41, 180, 94, 121, 75, + 117, 46, 140, 143, 127, 98, 41, 43, 171, 24, 220, 248, 176, 152, 158, 186, 49, 95, 196, 20, + 247, 50, 199, 164, 119, 30, 56, 58, 32, 248, 194, 9, 95, 40, 233, 147, 238, 154, 253, 35, + 103, 132, 50, 77, 77, 217, 160, 50, 10, 164, 89, 241, 80, 8, 172, 41, 190, 155, 197, 219, + 89, 143, 217, 28, 128, 254, 40, 226, 77, 92, 231, 103, 119, 12, 199, 136, 226, 75, 132, 192, + 164, 114, 204, 115, 114, 64, 92, 68, 33, 249, 94, 109, 12, 74, 30, 235, 210, 121, 175, 228, + 229, 21, 93, 154, 167, 211, 145, 36, 242, 142, 168, 82, 114, 21, 177, 22, 22, 197, 129, 179, + 191, 249, 237, 3, 13, 114, 129, 93, 31, 120, 12, 170, 162, 60, 218, 183, 152, 221, 241, 164, + 109, 181, 78, 17, 3, 136, 76, 224, 218, 184, 227, 32, 105, 146, 36, 203, 90, 217, 234, 28, + 76, 138, 118, 100, 208, 30, 210, 182, 214, 169, 41, 213, 229, 84, 45, 117, 185, 68, 186, + 137, 166, 44, 123, 223, 77, 6, 231, 71, 218, 52, 228, 213, 34, 238, 10, 117, 190, 252, 204, + 25, 150, 139, 111, 217, 247, 237, 221, 179, 53, 222, 12, 165, 130, 225, 164, 73, 228, 247, + 79, 17, 34, 64, 141, 9, 71, 189, 2, 62, 76, 214, 124, 126, 91, 127, 148, 200, 190, 150, 112, + 71, 51, 243, 99, 57, 224, 217, 121, 249, 245, 191, 127, 125, 246, 71, 48, 152, 177, 156, 98, + 107, 184, 196, 140, 41, 182, 32, 187, 116, 104, 158, 90, 226, 222, 137, 95, 94, 122, 128, + 54, 74, 5, 176, 115, 8, 49, 22, 115, 30, 50, 232, 192, 210, 174, 40, 145, 33, 20, 65, 73, + 178, 169, 28, 228, 34, 78, 134, 83, 51, 240, 139, 28, 36, 38, 63, 232, 28, 72, 72, 31, 148, + 237, 161, 122, 161, 237, 94, 59, 211, 141, 105, 113, 134, 10, 237, 45, 65, 223, 50, 222, 50, + 222, 114, 241, 47, 127, 111, 189, 171, 9, 60, 76, 171, 113, 183, 14, 179, 201, 248, 124, + 237, 165, 82, 193, 243, 159, 217, 2, 92, 99, 44, 194, 178, 132, 15, 250, 103, 25, 124, 90, + 81, 8, 47, 42, 154, 84, 251, 179, 101, 178, 44, 71, 8, 175, 152, 42, 65, 179, 79, 168, 42, + 28, 37, 28, 56, 17, 44, 157, 57, 197, 89, 62, 159, 224, 207, 132, 106, 207, 152, 94, 209, + 239, 15, 152, 178, 207, 20, 252, 1, 155, 19, 85, 175, 99, 144, 47, 121, 77, 201, 31, 8, 120, + 61, 38, 194, 115, 167, 102, 223, 192, 61, 232, 175, 224, 157, 19, 231, 20, 240, 144, 91, 42, + 154, 96, 93, 194, 159, 6, 156, 217, 58, 31, 57, 227, 253, 105, 240, 199, 175, 174, 200, 167, + 224, 212, 32, 232, 250, 145, 213, 37, 141, 123, 10, 93, 227, 106, 27, 24, 92, 145, 17, 46, + 6, 56, 35, 152, 106, 10, 198, 45, 241, 197, 210, 67, 171, 95, 211, 85, 78, 52, 100, 108, 29, + 9, 199, 12, 158, 83, 45, 112, 180, 231, 102, 223, 196, 175, 51, 167, 144, 133, 58, 80, 129, + 250, 243, 253, 21, 79, 194, 158, 36, 155, 43, 45, 145, 214, 41, 216, 185, 19, 113, 120, 91, + 69, 31, 200, 54, 14, 36, 183, 118, 166, 30, 194, 21, 72, 206, 122, 182, 205, 11, 196, 111, + 51, 52, 166, 5, 25, 53, 98, 250, 3, 111, 70, 114, 177, 104, 218, 196, 130, 96, 55, 229, 154, + 99, 25, 239, 241, 149, 93, 21, 193, 240, 135, 45, 203, 39, 178, 194, 148, 195, 233, 206, + 124, 160, 76, 60, 222, 30, 82, 149, 80, 123, 162, 165, 51, 40, 169, 225, 142, 218, 126, 8, + 253, 119, 162, 71, 96, 57, 73, 151, 177, 185, 16, 60, 232, 101, 211, 220, 13, 220, 230, 242, + 21, 189, 8, 177, 127, 25, 41, 200, 194, 219, 43, 194, 230, 91, 163, 133, 80, 41, 89, 139, 7, + 6, 220, 198, 121, 116, 167, 61, 209, 212, 98, 139, 156, 172, 7, 90, 211, 145, 164, 45, 124, + 95, 75, 103, 19, 142, 34, 90, 97, 175, 145, 73, 199, 3, 170, 199, 10, 129, 36, 209, 224, + 220, 13, 246, 69, 244, 134, 59, 211, 244, 163, 210, 175, 80, 158, 140, 65, 35, 116, 200, + 131, 8, 38, 67, 50, 118, 94, 41, 110, 142, 110, 190, 43, 103, 77, 226, 145, 197, 187, 215, + 170, 85, 90, 214, 160, 168, 93, 89, 38, 10, 238, 19, 190, 227, 20, 68, 25, 200, 37, 194, 73, + 91, 228, 61, 186, 63, 155, 138, 36, 108, 1, 191, 194, 73, 134, 191, 61, 222, 148, 240, 9, + 156, 172, 249, 91, 83, 77, 73, 155, 199, 213, 229, 238, 125, 86, 77, 103, 18, 1, 85, 50, 67, + 166, 158, 73, 199, 92, 68, 198, 109, 174, 81, 134, 223, 99, 14, 147, 167, 184, 71, 1, 121, + 228, 156, 162, 77, 146, 225, 9, 100, 9, 253, 183, 0, 4, 37, 212, 64, 140, 22, 180, 227, 34, + 157, 54, 252, 126, 24, 79, 235, 197, 248, 189, 66, 87, 69, 107, 5, 45, 74, 140, 112, 41, + 192, 233, 193, 116, 216, 61, 226, 23, 74, 15, 23, 95, 211, 53, 64, 225, 153, 157, 129, 243, + 244, 242, 96, 86, 232, 110, 199, 96, 183, 24, 236, 22, 68, 17, 170, 197, 45, 47, 25, 154, + 228, 91, 178, 219, 85, 170, 186, 229, 100, 70, 98, 133, 60, 213, 84, 147, 233, 110, 72, 197, + 239, 164, 93, 77, 113, 27, 232, 134, 130, 34, 48, 172, 71, 167, 250, 15, 197, 76, 144, 144, + 13, 211, 234, 187, 204, 35, 204, 117, 23, 95, 23, 202, 157, 107, 73, 79, 146, 187, 43, 14, + 77, 189, 254, 95, 104, 57, 43, 186, 8, 106, 245, 90, 149, 202, 254, 170, 139, 183, 103, 25, + 188, 169, 229, 22, 223, 197, 221, 157, 63, 87, 179, 73, 175, 15, 130, 154, 2, 22, 156, 150, + 176, 19, 181, 4, 188, 247, 214, 11, 23, 130, 172, 123, 33, 102, 10, 204, 79, 75, 15, 21, + 167, 235, 244, 252, 227, 112, 56, 106, 2, 61, 182, 182, 220, 34, 112, 132, 190, 1, 8, 142, + 213, 17, 116, 184, 8, 250, 235, 8, 206, 107, 142, 16, 181, 114, 255, 3, 225, 234, 204, 171, + 6, 197, 128, 249, 101, 10, 8, 183, 220, 34, 115, 12, 98, 61, 171, 45, 2, 209, 228, 52, 91, + 194, 236, 15, 62, 6, 29, 183, 97, 245, 195, 61, 211, 6, 141, 87, 198, 222, 35, 212, 121, 64, + 206, 234, 203, 45, 194, 185, 15, 224, 9, 82, 34, 119, 34, 31, 10, 188, 132, 100, 243, 109, + 241, 102, 200, 93, 144, 191, 211, 244, 196, 23, 170, 178, 91, 137, 73, 9, 243, 162, 12, 78, + 118, 151, 170, 16, 240, 191, 112, 172, 103, 52, 153, 52, 241, 118, 32, 96, 43, 166, 201, 89, + 1, 199, 146, 77, 218, 83, 240, 12, 27, 38, 71, 225, 221, 161, 10, 188, 251, 18, 214, 145, + 120, 179, 154, 126, 204, 235, 217, 48, 67, 235, 179, 252, 209, 26, 29, 94, 47, 41, 134, 204, + 188, 162, 105, 100, 167, 96, 7, 131, 182, 106, 27, 188, 207, 129, 255, 38, 213, 236, 13, + 230, 11, 248, 95, 220, 97, 164, 163, 36, 204, 110, 164, 25, 209, 46, 254, 181, 9, 104, 104, + 75, 132, 59, 67, 205, 12, 166, 212, 210, 169, 211, 149, 137, 128, 31, 101, 98, 45, 102, 64, + 101, 241, 0, 238, 236, 204, 183, 176, 204, 113, 221, 11, 211, 167, 136, 127, 111, 192, 15, + 61, 223, 225, 185, 25, 86, 226, 226, 40, 138, 74, 232, 196, 5, 242, 24, 64, 185, 233, 183, + 122, 231, 126, 93, 150, 116, 50, 12, 78, 75, 103, 208, 5, 146, 71, 177, 185, 119, 38, 96, + 33, 214, 49, 73, 242, 19, 122, 172, 195, 147, 156, 196, 76, 37, 60, 146, 135, 127, 227, 101, + 207, 142, 198, 52, 50, 227, 206, 134, 51, 87, 114, 16, 20, 157, 243, 192, 113, 186, 47, 249, + 255, 79, 0, 0, 184, 217, 29, 95, 132, 121, 36, 148, 177, 198, 128, 178, 50, 157, 76, 128, + 147, 224, 220, 161, 166, 167, 184, 134, 99, 37, 57, 152, 189, 99, 107, 161, 247, 249, 131, + 247, 31, 223, 145, 133, 47, 189, 91, 10, 209, 193, 237, 187, 123, 70, 143, 111, 207, 156, + 29, 221, 215, 59, 154, 205, 174, 201, 199, 124, 158, 221, 95, 236, 27, 205, 100, 214, 230, + 227, 160, 163, 211, 237, 199, 158, 254, 225, 51, 79, 116, 247, 13, 20, 246, 156, 220, 5, 95, + 78, 63, 123, 162, 16, 237, 142, 155, 43, 247, 156, 188, 255, 216, 87, 90, 51, 217, 35, 79, + 158, 60, 49, 150, 164, 31, 51, 143, 60, 121, 242, 248, 65, 122, 14, 163, 80, 168, 71, 184, + 0, 52, 172, 167, 150, 178, 148, 7, 150, 28, 202, 82, 30, 0, 182, 217, 57, 43, 102, 91, 54, + 10, 201, 109, 41, 209, 103, 79, 226, 77, 227, 169, 123, 104, 233, 70, 227, 101, 113, 219, + 60, 218, 90, 117, 109, 109, 26, 172, 3, 238, 170, 194, 196, 70, 167, 60, 111, 161, 193, 147, + 103, 254, 53, 159, 248, 108, 157, 171, 212, 34, 105, 89, 144, 95, 243, 230, 170, 152, 106, + 76, 42, 212, 90, 141, 252, 151, 253, 114, 1, 138, 234, 58, 227, 248, 247, 221, 115, 246, + 253, 98, 95, 176, 15, 96, 239, 222, 101, 23, 100, 87, 22, 88, 80, 17, 133, 69, 80, 1, 197, + 130, 239, 68, 69, 240, 65, 196, 39, 26, 52, 81, 137, 26, 77, 237, 52, 90, 95, 163, 81, 219, + 76, 154, 38, 169, 237, 116, 156, 169, 147, 198, 202, 104, 166, 77, 162, 49, 49, 109, 109, + 218, 73, 59, 29, 103, 218, 25, 23, 39, 157, 58, 218, 166, 38, 157, 182, 26, 160, 223, 221, + 93, 121, 85, 91, 200, 36, 157, 116, 134, 59, 243, 187, 123, 239, 229, 112, 190, 123, 255, + 231, 127, 190, 243, 29, 38, 155, 88, 211, 189, 72, 111, 146, 139, 135, 20, 45, 26, 47, 246, + 252, 49, 197, 102, 80, 40, 116, 22, 35, 54, 40, 12, 22, 167, 217, 233, 49, 51, 140, 221, 52, + 234, 90, 148, 246, 180, 84, 171, 206, 102, 86, 88, 83, 29, 22, 3, 187, 122, 84, 173, 80, + 166, 232, 117, 94, 111, 166, 250, 167, 140, 115, 228, 42, 157, 242, 222, 193, 120, 78, 21, + 73, 151, 247, 200, 63, 149, 112, 106, 168, 46, 83, 239, 187, 103, 42, 125, 80, 148, 12, 115, + 206, 98, 201, 134, 108, 48, 184, 58, 133, 21, 175, 78, 48, 228, 93, 192, 124, 90, 224, 60, + 24, 138, 106, 92, 214, 114, 166, 142, 204, 177, 68, 59, 49, 48, 224, 91, 223, 148, 203, 240, + 238, 15, 104, 22, 197, 203, 246, 112, 152, 42, 247, 164, 80, 103, 227, 221, 142, 160, 143, + 193, 130, 197, 173, 37, 80, 221, 174, 40, 46, 202, 19, 124, 146, 145, 8, 12, 112, 155, 92, + 167, 169, 84, 114, 81, 54, 155, 41, 53, 134, 20, 109, 119, 177, 193, 162, 85, 48, 189, 195, + 142, 117, 179, 54, 214, 229, 185, 212, 38, 127, 85, 81, 201, 170, 185, 37, 58, 173, 158, + 170, 77, 141, 78, 165, 171, 88, 220, 54, 169, 105, 71, 77, 134, 222, 87, 190, 242, 224, 242, + 187, 66, 142, 217, 216, 170, 76, 77, 115, 88, 244, 74, 157, 73, 171, 21, 3, 217, 22, 204, + 170, 122, 226, 177, 5, 213, 165, 105, 142, 241, 249, 162, 52, 134, 138, 110, 181, 149, 42, + 27, 171, 74, 151, 37, 57, 199, 205, 110, 10, 142, 153, 191, 116, 245, 246, 131, 115, 127, + 235, 148, 103, 167, 131, 246, 124, 23, 21, 54, 114, 93, 33, 188, 61, 84, 223, 34, 210, 55, + 95, 214, 183, 136, 132, 40, 180, 89, 195, 214, 160, 90, 147, 171, 209, 88, 115, 195, 97, + 177, 192, 227, 113, 137, 97, 122, 22, 6, 87, 56, 63, 151, 217, 68, 35, 89, 201, 83, 216, + 137, 60, 170, 137, 106, 172, 70, 155, 113, 158, 154, 20, 10, 151, 203, 165, 44, 201, 84, + 120, 137, 234, 117, 82, 138, 18, 150, 44, 52, 93, 39, 141, 105, 142, 164, 60, 245, 181, 75, + 151, 82, 136, 132, 132, 100, 82, 115, 60, 230, 136, 250, 29, 48, 183, 125, 62, 150, 172, + 235, 172, 73, 231, 222, 223, 63, 37, 220, 234, 67, 47, 187, 24, 87, 93, 115, 100, 156, 160, + 77, 245, 58, 200, 154, 74, 86, 220, 125, 211, 102, 162, 108, 172, 53, 104, 132, 54, 101, + 154, 55, 207, 227, 13, 103, 26, 240, 212, 17, 147, 254, 138, 208, 253, 27, 124, 9, 15, 171, + 109, 14, 170, 128, 123, 62, 162, 138, 159, 54, 71, 58, 53, 166, 88, 168, 26, 118, 101, 164, + 187, 116, 204, 74, 121, 79, 78, 187, 154, 79, 47, 219, 133, 95, 119, 87, 202, 238, 205, 232, + 189, 205, 174, 43, 140, 228, 222, 107, 15, 114, 175, 225, 190, 123, 75, 67, 147, 130, 98, + 167, 80, 18, 53, 65, 208, 20, 130, 16, 68, 76, 34, 76, 98, 170, 114, 154, 154, 81, 157, 63, + 39, 199, 29, 10, 134, 253, 126, 85, 105, 39, 230, 190, 26, 110, 208, 95, 192, 2, 72, 5, 55, + 242, 31, 69, 85, 201, 12, 71, 14, 148, 115, 156, 172, 10, 157, 105, 215, 36, 75, 125, 41, + 33, 53, 221, 13, 200, 0, 186, 120, 200, 207, 161, 255, 129, 146, 147, 218, 217, 129, 192, + 253, 202, 47, 82, 88, 38, 36, 124, 47, 47, 197, 241, 229, 162, 111, 111, 194, 228, 181, 131, + 22, 229, 195, 158, 201, 141, 59, 190, 221, 28, 154, 91, 91, 238, 48, 26, 4, 133, 138, 116, + 215, 230, 84, 54, 87, 46, 249, 198, 146, 60, 103, 121, 75, 93, 245, 242, 108, 183, 69, 181, + 90, 233, 207, 16, 38, 27, 141, 52, 94, 122, 179, 174, 39, 163, 218, 87, 234, 95, 127, 178, + 41, 136, 183, 163, 59, 54, 53, 79, 207, 209, 89, 28, 122, 149, 157, 150, 52, 167, 51, 213, + 232, 204, 112, 149, 54, 239, 156, 238, 139, 230, 187, 245, 46, 191, 96, 242, 138, 22, 43, + 141, 15, 45, 118, 61, 199, 56, 15, 215, 175, 35, 207, 175, 166, 21, 201, 170, 16, 33, 2, + 181, 240, 202, 208, 81, 153, 73, 163, 162, 151, 71, 101, 38, 73, 84, 22, 114, 87, 92, 16, + 28, 84, 150, 23, 9, 5, 81, 59, 128, 91, 47, 73, 217, 37, 183, 42, 202, 66, 44, 28, 86, 101, + 223, 182, 207, 169, 234, 68, 236, 215, 40, 161, 80, 90, 137, 124, 150, 197, 239, 219, 189, + 38, 132, 79, 141, 247, 58, 252, 46, 134, 232, 75, 226, 42, 201, 190, 105, 169, 9, 33, 165, + 68, 90, 81, 37, 228, 84, 37, 179, 12, 173, 107, 241, 245, 171, 140, 179, 215, 157, 145, 250, + 246, 227, 77, 139, 158, 170, 247, 105, 157, 99, 107, 90, 246, 157, 221, 88, 209, 26, 112, + 152, 5, 174, 210, 24, 52, 58, 111, 81, 77, 65, 227, 209, 13, 117, 246, 137, 199, 151, 46, + 216, 58, 43, 235, 140, 125, 108, 109, 196, 95, 87, 91, 149, 105, 212, 53, 47, 46, 94, 56, + 45, 34, 153, 5, 97, 252, 246, 45, 107, 102, 231, 23, 55, 238, 153, 149, 221, 113, 242, 123, + 47, 31, 219, 88, 105, 51, 106, 105, 11, 72, 73, 197, 162, 51, 154, 141, 51, 119, 124, 119, + 145, 39, 47, 52, 163, 165, 193, 95, 22, 74, 211, 167, 121, 44, 83, 219, 198, 110, 111, 245, + 150, 204, 152, 51, 79, 158, 1, 167, 122, 239, 242, 26, 154, 1, 30, 216, 56, 84, 107, 47, + 105, 109, 149, 181, 246, 146, 42, 10, 165, 217, 158, 162, 72, 81, 50, 157, 185, 19, 131, + 103, 163, 233, 13, 186, 121, 178, 34, 178, 36, 113, 43, 95, 254, 69, 164, 176, 223, 193, + 241, 127, 121, 104, 235, 126, 225, 4, 21, 222, 47, 180, 113, 96, 129, 84, 163, 208, 88, 12, + 221, 11, 104, 171, 228, 119, 73, 129, 20, 174, 22, 222, 238, 62, 65, 46, 164, 164, 96, 214, + 9, 119, 220, 70, 254, 39, 189, 47, 39, 104, 187, 247, 75, 131, 73, 195, 148, 70, 139, 129, + 215, 218, 204, 202, 52, 167, 203, 110, 32, 35, 196, 15, 172, 31, 140, 176, 127, 228, 176, + 243, 0, 252, 33, 40, 158, 251, 108, 40, 79, 3, 168, 3, 255, 133, 215, 134, 143, 102, 87, 2, + 237, 243, 255, 25, 93, 15, 128, 225, 33, 24, 175, 141, 12, 211, 205, 126, 204, 181, 131, + 177, 92, 125, 48, 214, 189, 159, 29, 219, 124, 0, 251, 153, 81, 70, 25, 57, 169, 31, 142, + 28, 71, 20, 192, 57, 127, 120, 184, 14, 13, 198, 253, 147, 225, 145, 145, 255, 229, 38, 243, + 173, 225, 225, 249, 180, 31, 241, 195, 145, 33, 233, 251, 241, 77, 24, 192, 187, 15, 198, + 191, 30, 32, 112, 244, 225, 100, 183, 141, 140, 156, 206, 126, 198, 156, 31, 76, 48, 107, + 120, 132, 214, 254, 239, 24, 123, 96, 248, 228, 109, 1, 8, 127, 240, 96, 242, 223, 255, 119, + 10, 70, 25, 101, 148, 81, 70, 25, 229, 33, 20, 78, 1, 136, 64, 146, 85, 0, 69, 203, 8, 122, + 94, 60, 165, 159, 113, 156, 120, 247, 243, 99, 124, 86, 146, 103, 190, 36, 220, 24, 229, + 139, 160, 68, 15, 48, 145, 198, 185, 116, 119, 130, 73, 49, 128, 50, 170, 97, 202, 233, 111, + 209, 215, 71, 249, 127, 4, 88, 146, 116, 64, 58, 131, 242, 26, 221, 97, 252, 158, 43, 105, + 15, 4, 29, 16, 5, 5, 76, 130, 29, 184, 19, 143, 96, 175, 224, 22, 222, 17, 174, 8, 191, 103, + 156, 169, 153, 158, 89, 152, 157, 229, 176, 42, 182, 153, 237, 96, 207, 178, 253, 236, 59, + 236, 42, 95, 202, 151, 243, 205, 252, 112, 230, 87, 51, 63, 22, 83, 68, 187, 232, 18, 51, + 69, 73, 12, 136, 249, 226, 68, 113, 178, 88, 37, 182, 137, 7, 196, 211, 94, 133, 215, 234, + 77, 243, 138, 94, 201, 27, 240, 230, 121, 151, 122, 79, 74, 130, 164, 148, 76, 146, 69, 114, + 73, 153, 82, 80, 170, 150, 154, 164, 149, 254, 247, 238, 241, 222, 94, 122, 11, 17, 94, 164, + 232, 119, 5, 135, 112, 153, 162, 255, 142, 1, 83, 50, 109, 60, 122, 128, 162, 183, 83, 244, + 103, 40, 250, 1, 246, 50, 7, 190, 140, 111, 226, 135, 50, 119, 101, 222, 161, 232, 86, 209, + 33, 166, 139, 98, 60, 122, 73, 50, 122, 123, 50, 122, 106, 95, 244, 57, 222, 67, 201, 232, + 102, 201, 217, 23, 125, 5, 69, 135, 120, 116, 16, 220, 16, 63, 122, 171, 32, 121, 244, 102, + 244, 220, 162, 243, 35, 189, 121, 189, 62, 128, 158, 78, 24, 114, 116, 45, 235, 187, 138, + 220, 208, 118, 5, 187, 172, 93, 55, 186, 246, 2, 196, 238, 198, 206, 116, 209, 254, 41, 182, + 59, 182, 147, 158, 166, 203, 45, 98, 51, 98, 181, 177, 120, 207, 177, 188, 152, 239, 250, + 189, 235, 177, 235, 93, 127, 216, 71, 183, 8, 29, 72, 109, 133, 79, 132, 30, 70, 57, 155, + 52, 55, 178, 84, 230, 146, 91, 38, 206, 244, 235, 32, 36, 86, 205, 94, 224, 139, 121, 35, + 95, 193, 91, 120, 27, 0, 111, 227, 237, 252, 73, 222, 49, 240, 141, 120, 123, 242, 247, 165, + 190, 39, 207, 243, 215, 146, 87, 111, 240, 183, 6, 181, 149, 191, 135, 177, 90, 118, 156, + 157, 99, 223, 231, 37, 236, 4, 123, 142, 52, 222, 201, 14, 240, 201, 108, 30, 219, 196, 22, + 178, 181, 236, 22, 187, 205, 254, 204, 254, 194, 62, 98, 127, 101, 119, 216, 199, 236, 19, + 246, 55, 182, 128, 205, 231, 85, 188, 130, 79, 101, 117, 236, 91, 192, 193, 12, 22, 112, + 144, 151, 2, 144, 13, 33, 8, 195, 68, 114, 82, 25, 84, 193, 84, 152, 1, 11, 224, 17, 120, + 20, 26, 97, 5, 172, 130, 199, 161, 29, 182, 194, 54, 216, 201, 118, 177, 54, 246, 52, 59, + 202, 182, 225, 109, 20, 208, 132, 41, 232, 194, 76, 204, 193, 122, 124, 20, 151, 96, 43, + 174, 197, 13, 184, 25, 183, 224, 83, 248, 117, 220, 135, 251, 241, 16, 126, 19, 207, 226, + 27, 248, 38, 94, 198, 119, 240, 231, 108, 55, 91, 207, 246, 176, 99, 244, 246, 51, 216, 15, + 216, 105, 246, 10, 251, 33, 219, 192, 14, 11, 42, 246, 2, 190, 207, 86, 241, 26, 122, 251, + 23, 5, 3, 57, 101, 26, 251, 7, 251, 39, 222, 225, 179, 217, 17, 214, 33, 228, 178, 191, 227, + 175, 88, 43, 15, 241, 92, 94, 200, 102, 145, 231, 149, 160, 2, 53, 104, 64, 15, 38, 72, 131, + 12, 200, 4, 15, 120, 33, 31, 10, 160, 16, 138, 192, 13, 213, 48, 19, 234, 96, 22, 124, 5, + 234, 121, 57, 204, 133, 86, 88, 13, 107, 96, 29, 205, 152, 133, 120, 2, 25, 114, 84, 160, + 18, 85, 168, 69, 3, 218, 209, 131, 34, 122, 209, 135, 141, 184, 20, 155, 112, 25, 102, 224, + 86, 148, 231, 212, 46, 124, 26, 119, 243, 40, 238, 197, 31, 227, 57, 236, 196, 243, 120, 5, + 159, 197, 159, 129, 22, 213, 160, 67, 13, 24, 81, 15, 86, 52, 131, 13, 45, 144, 138, 54, + 176, 163, 21, 156, 232, 6, 23, 166, 131, 132, 89, 224, 67, 63, 100, 97, 0, 252, 152, 13, 34, + 74, 144, 131, 13, 48, 6, 103, 67, 46, 206, 129, 32, 206, 133, 177, 184, 8, 242, 112, 49, 68, + 176, 25, 138, 113, 57, 140, 195, 21, 48, 1, 87, 194, 120, 108, 129, 18, 124, 12, 74, 113, + 13, 76, 198, 117, 184, 30, 202, 177, 13, 42, 112, 19, 68, 113, 35, 84, 98, 59, 76, 193, 199, + 97, 26, 62, 1, 53, 184, 13, 166, 227, 147, 184, 29, 106, 177, 3, 26, 112, 207, 191, 168, + 173, 210, 224, 56, 142, 42, 220, 253, 186, 101, 89, 146, 229, 40, 38, 41, 67, 8, 184, 19, + 66, 89, 178, 173, 149, 124, 72, 118, 228, 196, 137, 45, 124, 97, 249, 192, 142, 13, 182, 19, + 204, 104, 118, 86, 154, 210, 206, 204, 50, 211, 171, 213, 250, 34, 113, 14, 3, 33, 241, 145, + 16, 28, 48, 33, 41, 32, 196, 64, 8, 87, 18, 66, 46, 114, 81, 169, 64, 226, 132, 243, 47, + 191, 40, 126, 240, 131, 162, 138, 74, 85, 48, 199, 235, 215, 189, 171, 149, 45, 40, 168, + 226, 15, 218, 210, 238, 235, 238, 215, 239, 248, 222, 123, 223, 12, 219, 206, 111, 99, 59, + 248, 237, 108, 23, 255, 52, 219, 203, 239, 98, 55, 241, 99, 236, 70, 126, 55, 219, 199, 79, + 176, 79, 240, 147, 108, 152, 223, 203, 60, 126, 15, 43, 240, 211, 44, 224, 95, 98, 35, 252, + 203, 172, 200, 159, 98, 49, 127, 154, 37, 252, 25, 86, 226, 207, 178, 79, 242, 231, 88, 202, + 159, 103, 21, 254, 50, 59, 196, 95, 99, 135, 217, 205, 252, 117, 118, 132, 159, 101, 183, + 240, 55, 248, 253, 172, 157, 183, 177, 14, 62, 155, 237, 228, 71, 153, 207, 63, 111, 108, + 241, 183, 249, 57, 152, 3, 87, 193, 92, 88, 4, 0, 243, 248, 159, 248, 95, 144, 19, 154, 160, + 3, 46, 133, 78, 104, 131, 203, 224, 74, 100, 168, 28, 44, 132, 110, 248, 34, 156, 134, 197, + 240, 0, 244, 195, 213, 112, 13, 124, 24, 182, 193, 17, 232, 133, 37, 176, 20, 150, 65, 31, + 44, 135, 21, 48, 0, 43, 97, 21, 92, 7, 215, 195, 106, 88, 3, 131, 176, 22, 214, 193, 122, + 216, 0, 27, 97, 8, 54, 195, 22, 216, 10, 215, 194, 38, 200, 160, 10, 7, 225, 102, 184, 7, + 82, 208, 48, 14, 21, 152, 128, 253, 112, 0, 14, 193, 167, 224, 86, 184, 13, 110, 135, 59, + 224, 40, 124, 6, 238, 132, 207, 193, 221, 112, 23, 28, 131, 227, 112, 47, 220, 7, 95, 128, + 83, 112, 11, 156, 132, 207, 194, 9, 184, 31, 190, 13, 143, 194, 175, 225, 17, 248, 5, 188, + 8, 63, 128, 31, 194, 227, 240, 20, 60, 3, 191, 129, 39, 225, 251, 240, 10, 188, 6, 95, 131, + 175, 195, 195, 240, 13, 248, 38, 124, 11, 190, 3, 143, 193, 119, 225, 123, 240, 4, 252, 8, + 126, 12, 79, 195, 179, 240, 60, 252, 4, 94, 128, 151, 224, 101, 228, 222, 87, 145, 255, 126, + 6, 63, 135, 215, 225, 13, 56, 11, 111, 194, 91, 240, 75, 248, 21, 50, 113, 187, 184, 72, + 116, 136, 75, 144, 31, 222, 35, 46, 19, 239, 21, 151, 139, 43, 196, 7, 196, 7, 145, 31, 59, + 197, 2, 177, 72, 116, 139, 30, 177, 88, 44, 19, 125, 162, 95, 172, 16, 87, 139, 1, 177, 82, + 92, 35, 174, 21, 171, 196, 245, 98, 181, 152, 43, 222, 45, 214, 136, 139, 197, 117, 34, 39, + 222, 47, 230, 9, 37, 174, 18, 243, 197, 32, 50, 203, 251, 196, 18, 177, 28, 126, 43, 62, 4, + 207, 137, 46, 248, 169, 88, 10, 103, 196, 28, 86, 230, 47, 178, 113, 254, 18, 155, 224, 175, + 176, 3, 252, 85, 100, 224, 113, 49, 33, 246, 136, 189, 98, 88, 124, 92, 236, 19, 190, 56, + 38, 142, 139, 3, 226, 29, 241, 87, 113, 78, 252, 77, 252, 93, 252, 3, 153, 153, 75, 144, 66, + 74, 254, 59, 217, 36, 103, 200, 102, 57, 83, 182, 200, 86, 217, 38, 103, 201, 118, 57, 91, + 94, 36, 59, 228, 197, 114, 142, 124, 151, 120, 66, 124, 69, 46, 148, 189, 178, 91, 46, 150, + 75, 101, 159, 204, 201, 126, 217, 35, 151, 201, 229, 114, 133, 236, 146, 187, 228, 199, 228, + 71, 229, 110, 100, 187, 125, 114, 175, 220, 131, 188, 119, 147, 188, 65, 174, 18, 7, 229, + 86, 190, 144, 231, 248, 122, 190, 130, 111, 98, 51, 160, 149, 17, 133, 218, 231, 90, 195, + 31, 103, 128, 31, 162, 245, 243, 89, 251, 2, 77, 246, 127, 207, 131, 140, 24, 108, 46, 178, + 215, 6, 182, 141, 69, 200, 74, 2, 121, 169, 25, 153, 169, 21, 89, 73, 33, 47, 25, 86, 218, + 135, 188, 100, 88, 169, 138, 140, 116, 24, 57, 233, 8, 178, 210, 147, 200, 72, 200, 71, 88, + 201, 175, 18, 147, 158, 192, 122, 158, 228, 167, 196, 131, 226, 1, 241, 16, 255, 51, 52, + 203, 53, 200, 140, 55, 200, 33, 185, 78, 174, 151, 27, 196, 99, 114, 187, 220, 140, 149, + 216, 1, 119, 202, 45, 252, 77, 254, 150, 252, 8, 50, 223, 29, 98, 139, 216, 36, 55, 202, + 173, 226, 81, 57, 40, 183, 137, 81, 17, 138, 221, 248, 142, 209, 132, 220, 186, 213, 48, 8, + 245, 142, 233, 25, 236, 30, 121, 189, 220, 137, 220, 119, 88, 118, 138, 135, 69, 94, 4, 166, + 154, 216, 71, 7, 177, 171, 124, 57, 128, 124, 60, 15, 89, 249, 10, 228, 98, 203, 193, 189, + 196, 191, 12, 121, 216, 48, 111, 200, 11, 252, 109, 228, 133, 118, 199, 17, 11, 96, 30, 44, + 226, 231, 240, 188, 27, 174, 100, 246, 45, 135, 33, 202, 204, 201, 156, 205, 166, 149, 160, + 78, 152, 37, 22, 176, 218, 219, 208, 42, 243, 180, 37, 89, 178, 203, 233, 73, 107, 228, 38, + 134, 51, 226, 228, 25, 184, 191, 199, 201, 205, 236, 29, 49, 238, 228, 153, 108, 129, 248, + 163, 147, 91, 152, 50, 207, 98, 146, 91, 225, 193, 186, 175, 54, 182, 75, 30, 119, 242, 44, + 182, 64, 254, 222, 201, 237, 112, 170, 169, 195, 201, 179, 89, 177, 249, 145, 122, 231, 46, + 153, 121, 137, 147, 57, 107, 158, 185, 206, 201, 192, 102, 180, 156, 169, 245, 40, 155, 215, + 114, 159, 147, 37, 155, 221, 242, 144, 147, 155, 216, 172, 150, 199, 157, 60, 3, 247, 95, + 112, 114, 51, 59, 212, 114, 214, 201, 51, 217, 165, 173, 173, 78, 110, 97, 29, 173, 67, 78, + 110, 229, 219, 234, 190, 218, 216, 194, 214, 27, 157, 60, 11, 245, 143, 58, 185, 157, 15, + 181, 158, 118, 242, 108, 214, 223, 246, 7, 243, 246, 40, 91, 28, 206, 86, 182, 56, 91, 217, + 226, 108, 101, 139, 179, 149, 45, 206, 86, 182, 56, 91, 217, 226, 108, 101, 139, 179, 149, + 45, 206, 86, 182, 56, 91, 217, 226, 108, 101, 139, 179, 149, 45, 206, 86, 182, 56, 91, 217, + 226, 124, 6, 223, 47, 151, 96, 55, 245, 178, 126, 148, 54, 227, 147, 220, 103, 41, 75, 112, + 26, 19, 86, 192, 137, 84, 108, 16, 165, 148, 149, 232, 219, 195, 157, 16, 165, 152, 229, + 240, 100, 53, 43, 226, 71, 177, 237, 184, 55, 130, 19, 172, 241, 150, 89, 5, 248, 27, 160, + 246, 56, 126, 231, 81, 115, 16, 239, 21, 81, 103, 24, 247, 66, 212, 8, 73, 207, 195, 255, 8, + 109, 229, 73, 55, 198, 85, 134, 123, 49, 157, 217, 251, 33, 70, 160, 240, 223, 67, 189, 16, + 45, 84, 113, 85, 65, 73, 163, 47, 163, 83, 70, 139, 26, 247, 3, 92, 153, 152, 203, 120, 59, + 143, 231, 49, 70, 99, 172, 36, 206, 170, 70, 141, 200, 249, 52, 26, 10, 115, 76, 200, 167, + 241, 146, 81, 46, 27, 41, 215, 2, 238, 152, 28, 203, 184, 31, 208, 141, 148, 118, 138, 20, + 181, 118, 121, 248, 120, 178, 136, 44, 71, 180, 83, 36, 139, 30, 98, 100, 247, 107, 94, 34, + 180, 83, 36, 196, 74, 46, 202, 24, 119, 34, 242, 106, 109, 154, 60, 117, 67, 4, 198, 99, + 137, 114, 177, 120, 215, 208, 182, 177, 27, 79, 9, 34, 160, 48, 127, 139, 184, 137, 42, 66, + 93, 15, 253, 107, 90, 153, 140, 117, 189, 30, 22, 51, 235, 69, 81, 236, 177, 203, 43, 33, + 108, 135, 73, 115, 50, 226, 198, 140, 12, 106, 19, 116, 207, 102, 61, 134, 235, 28, 245, 67, + 99, 53, 231, 147, 181, 136, 44, 84, 9, 135, 178, 171, 124, 35, 222, 166, 98, 54, 255, 128, + 226, 55, 249, 219, 186, 164, 212, 13, 230, 215, 122, 52, 181, 86, 104, 163, 84, 207, 198, + 198, 56, 226, 116, 50, 92, 237, 119, 214, 53, 102, 97, 43, 52, 94, 175, 146, 71, 61, 226, + 225, 110, 52, 37, 175, 90, 55, 251, 24, 137, 71, 254, 125, 231, 63, 55, 77, 215, 15, 92, + 144, 167, 173, 79, 173, 254, 3, 245, 169, 233, 99, 187, 92, 23, 133, 174, 223, 250, 208, + 162, 57, 153, 122, 191, 123, 202, 253, 233, 39, 34, 112, 189, 109, 51, 245, 92, 110, 35, + 116, 106, 99, 13, 28, 154, 38, 254, 60, 117, 181, 201, 101, 140, 234, 89, 187, 51, 253, 105, + 225, 191, 154, 238, 201, 78, 178, 117, 219, 137, 171, 144, 98, 48, 254, 119, 80, 38, 122, + 74, 141, 123, 92, 4, 73, 67, 6, 190, 155, 73, 77, 89, 6, 212, 231, 67, 184, 227, 179, 78, + 170, 127, 23, 234, 228, 201, 254, 122, 138, 202, 222, 213, 248, 41, 33, 194, 61, 248, 169, + 208, 39, 71, 243, 63, 53, 242, 28, 89, 143, 80, 199, 188, 53, 152, 248, 71, 40, 131, 18, 90, + 168, 226, 174, 169, 110, 129, 114, 49, 83, 53, 213, 106, 109, 223, 48, 139, 173, 192, 88, + 221, 222, 110, 138, 217, 118, 116, 149, 58, 49, 163, 8, 53, 205, 92, 70, 28, 97, 111, 43, + 202, 193, 204, 107, 64, 221, 22, 146, 15, 139, 208, 48, 221, 173, 161, 183, 22, 241, 27, 66, + 182, 180, 119, 211, 134, 19, 59, 235, 121, 194, 100, 114, 126, 43, 228, 203, 167, 249, 158, + 206, 175, 93, 27, 93, 31, 187, 168, 76, 24, 230, 235, 243, 144, 167, 115, 195, 56, 54, 131, + 218, 12, 148, 40, 211, 216, 77, 129, 181, 21, 208, 183, 153, 234, 243, 243, 54, 231, 150, + 61, 58, 241, 86, 23, 117, 103, 132, 121, 5, 245, 121, 190, 48, 170, 248, 2, 203, 255, 57, + 70, 147, 214, 107, 12, 174, 28, 7, 219, 238, 241, 167, 112, 225, 133, 185, 79, 246, 235, + 212, 184, 86, 54, 32, 96, 50, 177, 185, 216, 39, 66, 173, 235, 211, 250, 211, 37, 79, 252, + 26, 19, 207, 122, 255, 50, 83, 139, 179, 55, 5, 211, 192, 117, 255, 249, 51, 96, 80, 53, + 157, 87, 166, 155, 121, 226, 42, 147, 77, 80, 183, 99, 52, 139, 196, 119, 255, 174, 66, 255, + 171, 185, 152, 156, 137, 30, 138, 198, 204, 128, 125, 74, 229, 168, 86, 37, 54, 113, 70, 45, + 233, 237, 237, 87, 155, 67, 63, 77, 178, 164, 160, 213, 96, 146, 150, 146, 212, 211, 97, 18, + 231, 212, 234, 98, 81, 109, 15, 71, 70, 117, 166, 182, 7, 89, 144, 142, 7, 249, 220, 160, + 87, 12, 135, 211, 80, 133, 153, 242, 84, 148, 228, 131, 52, 86, 153, 23, 103, 10, 207, 195, + 130, 42, 120, 81, 88, 172, 170, 74, 168, 71, 85, 86, 30, 214, 197, 64, 165, 73, 57, 206, + 135, 241, 72, 166, 18, 84, 213, 65, 132, 55, 227, 188, 242, 147, 52, 14, 210, 44, 167, 54, + 106, 85, 8, 60, 93, 78, 131, 76, 165, 129, 87, 84, 161, 70, 31, 126, 182, 72, 101, 145, 135, + 17, 248, 94, 9, 101, 115, 37, 42, 23, 117, 88, 66, 147, 113, 57, 10, 82, 212, 204, 2, 77, 6, + 50, 85, 74, 19, 140, 219, 132, 141, 214, 139, 197, 164, 162, 70, 49, 112, 21, 70, 37, 207, + 215, 42, 140, 149, 54, 121, 96, 100, 120, 69, 21, 195, 24, 125, 37, 5, 53, 28, 142, 144, 97, + 235, 72, 7, 19, 26, 47, 135, 99, 65, 78, 185, 52, 231, 103, 42, 242, 226, 170, 242, 203, + 152, 188, 141, 91, 143, 162, 255, 160, 162, 82, 15, 115, 73, 67, 76, 27, 47, 122, 145, 42, + 151, 140, 27, 180, 56, 130, 59, 89, 184, 31, 213, 117, 130, 9, 141, 155, 148, 60, 85, 241, + 210, 200, 250, 50, 48, 251, 163, 94, 138, 129, 5, 105, 174, 14, 253, 64, 205, 39, 230, 99, + 242, 31, 48, 165, 233, 219, 133, 16, 97, 82, 170, 47, 215, 219, 235, 206, 187, 237, 121, 67, + 33, 2, 68, 27, 157, 122, 232, 109, 36, 52, 81, 5, 24, 102, 234, 229, 131, 200, 75, 199, 84, + 98, 78, 26, 150, 133, 233, 203, 77, 32, 97, 110, 59, 227, 80, 227, 253, 29, 218, 211, 54, + 227, 30, 52, 144, 144, 3, 31, 43, 169, 211, 48, 200, 114, 67, 101, 191, 211, 203, 186, 84, + 62, 80, 235, 211, 4, 79, 181, 46, 13, 244, 244, 84, 42, 149, 92, 84, 51, 158, 243, 147, 168, + 71, 87, 75, 201, 72, 234, 149, 70, 171, 61, 190, 46, 36, 177, 206, 156, 170, 145, 11, 30, + 38, 48, 102, 244, 118, 39, 101, 4, 186, 170, 202, 89, 128, 65, 96, 74, 230, 88, 121, 88, + 215, 32, 141, 66, 109, 2, 26, 174, 82, 120, 107, 119, 14, 173, 198, 211, 148, 22, 88, 245, + 124, 217, 214, 183, 50, 26, 250, 163, 13, 119, 241, 55, 140, 253, 98, 57, 111, 176, 72, 84, + 62, 204, 74, 69, 116, 96, 42, 80, 74, 67, 84, 240, 81, 43, 136, 117, 78, 213, 124, 39, 49, + 182, 71, 103, 216, 165, 130, 104, 216, 92, 154, 52, 21, 215, 148, 167, 141, 136, 212, 77, + 131, 35, 252, 25, 194, 227, 219, 46, 172, 123, 39, 92, 157, 173, 149, 20, 64, 103, 136, 94, + 112, 16, 12, 244, 169, 25, 151, 124, 82, 137, 139, 137, 215, 232, 20, 99, 246, 108, 164, 8, + 124, 189, 2, 73, 89, 151, 202, 26, 97, 255, 39, 235, 85, 31, 28, 213, 85, 197, 207, 123, + 251, 54, 187, 217, 16, 88, 40, 50, 113, 214, 145, 183, 220, 238, 54, 76, 18, 98, 5, 145, 66, + 10, 107, 118, 55, 31, 132, 208, 124, 161, 239, 165, 80, 118, 147, 44, 77, 42, 118, 210, 194, + 132, 143, 210, 26, 169, 37, 184, 20, 91, 155, 90, 5, 229, 75, 108, 113, 172, 181, 119, 169, + 194, 166, 181, 6, 16, 237, 212, 22, 91, 250, 135, 56, 83, 71, 113, 166, 163, 56, 66, 59, + 106, 233, 31, 72, 179, 254, 238, 125, 111, 55, 187, 107, 170, 252, 97, 178, 191, 189, 231, + 252, 206, 185, 231, 222, 123, 206, 125, 119, 223, 29, 26, 232, 77, 8, 159, 254, 196, 198, + 193, 162, 5, 221, 72, 45, 100, 37, 106, 251, 18, 27, 226, 120, 164, 22, 196, 55, 13, 110, + 37, 135, 230, 84, 30, 23, 247, 85, 231, 62, 231, 66, 92, 193, 62, 105, 181, 142, 55, 105, + 151, 138, 139, 136, 58, 195, 137, 75, 167, 230, 81, 181, 195, 164, 190, 23, 34, 253, 1, 251, + 214, 70, 173, 157, 186, 142, 219, 143, 254, 47, 173, 132, 38, 72, 57, 235, 58, 168, 6, 117, + 162, 67, 242, 194, 246, 178, 115, 38, 26, 93, 220, 246, 92, 7, 137, 38, 70, 41, 255, 175, + 13, 55, 218, 77, 52, 140, 255, 93, 180, 151, 70, 105, 156, 222, 198, 47, 195, 195, 144, 246, + 209, 97, 122, 6, 55, 22, 78, 167, 233, 85, 186, 64, 255, 199, 191, 137, 109, 206, 47, 225, + 126, 118, 18, 183, 174, 155, 136, 50, 215, 50, 87, 38, 158, 1, 210, 206, 233, 121, 204, 40, + 180, 155, 52, 125, 146, 201, 120, 51, 239, 22, 113, 239, 78, 140, 102, 188, 19, 233, 146, + 89, 228, 145, 125, 203, 213, 183, 192, 254, 83, 249, 48, 115, 77, 93, 33, 244, 204, 98, 161, + 171, 35, 144, 103, 200, 30, 127, 119, 29, 156, 120, 126, 226, 88, 193, 116, 86, 226, 125, + 161, 11, 111, 13, 159, 167, 47, 224, 151, 249, 14, 90, 13, 180, 81, 59, 222, 224, 214, 209, + 122, 249, 238, 106, 157, 221, 119, 203, 95, 167, 123, 240, 254, 178, 17, 103, 254, 189, 192, + 6, 121, 119, 184, 79, 190, 145, 138, 123, 204, 16, 228, 205, 54, 99, 233, 91, 241, 59, 176, + 157, 30, 180, 219, 7, 104, 7, 228, 109, 248, 222, 46, 165, 135, 232, 203, 200, 252, 87, 114, + 237, 206, 92, 59, 201, 60, 76, 143, 0, 95, 197, 247, 46, 26, 161, 221, 244, 53, 180, 226, + 187, 144, 43, 212, 146, 180, 135, 30, 69, 61, 191, 78, 143, 229, 228, 199, 166, 100, 133, + 252, 56, 125, 19, 248, 6, 61, 129, 170, 63, 9, 249, 219, 168, 253, 126, 250, 14, 125, 87, + 178, 163, 244, 20, 125, 75, 106, 135, 232, 123, 176, 63, 85, 224, 43, 108, 147, 254, 7, 232, + 32, 188, 14, 211, 17, 120, 30, 197, 238, 57, 86, 228, 43, 60, 15, 209, 207, 232, 101, 236, + 169, 95, 209, 207, 177, 219, 198, 33, 157, 161, 49, 200, 103, 232, 143, 116, 145, 222, 161, + 191, 208, 37, 250, 171, 82, 165, 44, 86, 26, 233, 31, 244, 62, 189, 129, 236, 111, 64, 214, + 55, 202, 119, 136, 141, 246, 237, 244, 238, 92, 198, 183, 32, 183, 217, 204, 62, 132, 140, + 21, 230, 97, 200, 182, 89, 249, 220, 41, 243, 148, 181, 109, 129, 231, 8, 170, 177, 51, 175, + 79, 82, 214, 41, 27, 75, 120, 103, 99, 229, 231, 75, 172, 73, 172, 104, 146, 179, 86, 56, + 154, 99, 38, 215, 93, 216, 203, 242, 203, 207, 89, 97, 6, 247, 75, 166, 208, 90, 156, 217, + 124, 249, 200, 71, 90, 142, 210, 211, 192, 247, 241, 45, 234, 80, 172, 101, 165, 31, 224, 9, + 23, 248, 33, 61, 75, 63, 130, 100, 125, 79, 234, 89, 233, 57, 250, 49, 61, 143, 179, 32, 69, + 47, 208, 79, 233, 4, 157, 164, 116, 78, 255, 9, 180, 73, 251, 113, 201, 100, 125, 166, 230, + 95, 164, 151, 228, 46, 24, 167, 83, 178, 254, 191, 160, 179, 146, 27, 135, 52, 102, 91, 199, + 109, 203, 139, 82, 62, 67, 175, 224, 20, 122, 141, 94, 167, 115, 244, 75, 236, 157, 87, 36, + 94, 163, 223, 96, 127, 156, 167, 183, 112, 106, 253, 158, 254, 96, 239, 160, 223, 202, 29, + 196, 148, 42, 122, 147, 206, 107, 65, 250, 157, 115, 186, 226, 116, 156, 162, 51, 234, 106, + 218, 10, 253, 130, 186, 15, 149, 160, 80, 195, 250, 187, 214, 173, 189, 179, 219, 52, 214, + 116, 117, 118, 180, 183, 221, 177, 186, 117, 85, 203, 202, 230, 166, 198, 134, 104, 36, 92, + 255, 185, 208, 138, 229, 183, 215, 45, 91, 122, 219, 146, 207, 46, 254, 76, 237, 130, 154, + 234, 202, 96, 224, 102, 54, 111, 110, 197, 236, 153, 222, 25, 229, 101, 158, 82, 183, 171, + 196, 169, 57, 84, 133, 170, 163, 172, 33, 166, 243, 96, 140, 107, 65, 214, 212, 84, 35, 116, + 22, 7, 17, 207, 35, 98, 28, 63, 38, 188, 161, 208, 135, 235, 49, 233, 166, 23, 122, 134, + 224, 185, 161, 200, 51, 100, 121, 134, 114, 158, 138, 87, 175, 163, 186, 154, 106, 61, 202, + 116, 126, 46, 194, 244, 180, 210, 221, 110, 64, 222, 27, 97, 166, 206, 175, 72, 185, 85, + 202, 90, 80, 42, 229, 80, 252, 126, 244, 208, 163, 21, 253, 17, 157, 43, 49, 61, 202, 27, + 134, 250, 147, 209, 88, 4, 241, 82, 101, 158, 48, 11, 39, 60, 53, 213, 148, 242, 148, 65, + 44, 131, 196, 43, 217, 96, 74, 169, 92, 174, 72, 65, 173, 140, 46, 77, 225, 167, 168, 92, + 12, 203, 29, 129, 104, 188, 143, 183, 181, 27, 209, 136, 207, 239, 55, 37, 71, 97, 25, 139, + 151, 132, 185, 75, 198, 210, 7, 196, 156, 105, 143, 158, 170, 62, 149, 124, 52, 237, 165, + 158, 88, 213, 180, 62, 214, 23, 95, 107, 112, 71, 28, 157, 146, 142, 104, 50, 57, 194, 103, + 86, 241, 249, 44, 194, 231, 111, 127, 167, 2, 75, 78, 240, 106, 22, 137, 242, 42, 134, 96, + 45, 29, 185, 1, 20, 238, 12, 120, 153, 158, 188, 74, 152, 60, 187, 114, 185, 144, 137, 219, + 76, 73, 192, 123, 149, 132, 40, 150, 152, 75, 19, 236, 89, 153, 48, 55, 204, 16, 235, 243, + 251, 197, 92, 246, 164, 67, 212, 3, 133, 15, 183, 27, 150, 142, 251, 146, 239, 56, 133, 106, + 171, 76, 174, 198, 132, 229, 84, 214, 242, 177, 53, 194, 50, 156, 181, 228, 186, 199, 152, + 95, 148, 42, 26, 179, 63, 67, 253, 21, 124, 184, 71, 175, 169, 70, 246, 229, 39, 128, 15, + 236, 58, 119, 4, 99, 61, 120, 79, 66, 27, 79, 36, 89, 36, 98, 229, 173, 203, 224, 161, 8, + 132, 80, 220, 94, 107, 52, 245, 169, 90, 248, 199, 99, 88, 196, 128, 72, 67, 187, 193, 107, + 217, 32, 159, 205, 234, 45, 7, 16, 186, 168, 193, 64, 167, 33, 187, 216, 221, 248, 236, 48, + 167, 88, 175, 221, 139, 215, 70, 35, 98, 94, 122, 52, 25, 139, 88, 19, 20, 177, 88, 187, 49, + 70, 11, 51, 23, 83, 139, 116, 223, 11, 11, 105, 17, 153, 98, 30, 124, 78, 24, 69, 9, 70, + 147, 70, 223, 6, 62, 55, 230, 235, 195, 254, 220, 160, 27, 62, 63, 15, 153, 72, 159, 201, + 140, 132, 41, 170, 196, 188, 124, 254, 69, 12, 231, 151, 35, 202, 94, 88, 91, 145, 119, 214, + 89, 172, 220, 21, 112, 235, 134, 234, 115, 152, 162, 90, 32, 244, 6, 124, 177, 250, 58, 24, + 188, 40, 151, 84, 69, 69, 235, 235, 116, 67, 241, 81, 214, 13, 163, 216, 30, 66, 42, 136, 3, + 197, 17, 8, 55, 9, 147, 67, 116, 13, 55, 249, 252, 166, 223, 250, 251, 47, 83, 242, 217, + 115, 114, 6, 184, 59, 47, 150, 23, 68, 110, 78, 214, 56, 31, 57, 53, 203, 91, 76, 104, 190, + 30, 77, 68, 242, 38, 88, 16, 212, 105, 79, 208, 142, 54, 245, 60, 85, 145, 11, 123, 96, 244, + 112, 139, 114, 54, 101, 77, 142, 0, 158, 92, 112, 42, 194, 72, 74, 84, 177, 66, 231, 212, + 166, 27, 44, 193, 76, 134, 61, 20, 106, 51, 196, 218, 68, 174, 101, 125, 91, 58, 89, 75, + 123, 183, 33, 171, 109, 239, 146, 174, 2, 205, 178, 47, 177, 52, 78, 126, 152, 179, 138, 26, + 198, 30, 108, 168, 242, 101, 203, 42, 245, 70, 169, 231, 212, 166, 34, 115, 115, 214, 172, + 39, 221, 172, 165, 51, 41, 130, 51, 59, 32, 233, 120, 130, 176, 232, 146, 96, 115, 124, 207, + 146, 89, 139, 240, 104, 54, 224, 116, 99, 13, 113, 166, 123, 245, 134, 100, 60, 157, 25, + 238, 73, 166, 66, 161, 228, 96, 52, 214, 191, 84, 196, 96, 205, 125, 73, 214, 105, 212, 249, + 228, 92, 59, 140, 7, 125, 219, 197, 80, 179, 168, 69, 105, 233, 170, 175, 169, 198, 217, 83, + 159, 98, 202, 238, 246, 84, 72, 217, 221, 217, 109, 140, 121, 241, 98, 187, 187, 203, 56, + 174, 42, 106, 56, 86, 111, 166, 110, 134, 205, 24, 195, 171, 111, 72, 178, 170, 96, 5, 41, + 20, 93, 40, 34, 82, 7, 20, 183, 244, 247, 141, 133, 136, 134, 165, 85, 147, 132, 212, 123, + 211, 10, 73, 206, 157, 229, 20, 234, 77, 171, 22, 231, 205, 114, 42, 56, 205, 226, 66, 146, + 19, 127, 40, 82, 69, 63, 82, 140, 227, 54, 170, 247, 137, 242, 236, 48, 251, 147, 49, 83, + 60, 92, 52, 7, 165, 196, 71, 225, 10, 91, 78, 92, 101, 203, 83, 138, 90, 50, 141, 123, 88, + 162, 158, 151, 177, 122, 193, 175, 16, 252, 10, 139, 47, 17, 188, 11, 27, 67, 153, 163, 32, + 57, 226, 76, 74, 198, 24, 206, 41, 108, 40, 131, 124, 138, 181, 21, 29, 34, 164, 158, 206, + 100, 186, 12, 255, 57, 223, 21, 211, 143, 173, 182, 22, 232, 54, 120, 105, 21, 206, 126, + 103, 96, 37, 252, 26, 5, 98, 160, 27, 249, 112, 111, 92, 204, 131, 214, 24, 162, 175, 43, + 208, 220, 107, 98, 219, 102, 3, 194, 165, 153, 151, 34, 66, 169, 29, 1, 30, 13, 178, 143, + 216, 142, 232, 212, 139, 218, 160, 128, 178, 255, 48, 20, 62, 108, 114, 179, 74, 12, 106, + 12, 152, 114, 59, 123, 57, 53, 177, 165, 40, 187, 21, 211, 25, 20, 3, 213, 154, 201, 89, + 236, 211, 242, 217, 196, 163, 224, 9, 140, 136, 166, 20, 115, 163, 78, 195, 98, 124, 80, 49, + 152, 105, 37, 201, 53, 13, 51, 239, 101, 48, 245, 198, 116, 100, 91, 163, 222, 78, 108, 117, + 235, 44, 245, 248, 44, 38, 129, 35, 81, 11, 38, 36, 60, 62, 219, 72, 98, 89, 142, 64, 89, + 185, 135, 151, 46, 64, 64, 124, 132, 92, 182, 64, 60, 146, 206, 128, 203, 52, 173, 201, 75, + 109, 196, 118, 192, 216, 94, 94, 134, 25, 5, 243, 82, 105, 119, 64, 118, 96, 106, 22, 115, + 193, 103, 4, 83, 21, 174, 167, 69, 152, 246, 52, 117, 176, 173, 56, 89, 196, 164, 101, 36, + 23, 204, 188, 60, 208, 28, 199, 225, 111, 245, 47, 3, 195, 150, 100, 59, 187, 197, 25, 81, + 102, 199, 56, 107, 177, 46, 177, 242, 105, 200, 187, 35, 208, 149, 206, 28, 99, 219, 252, + 121, 127, 53, 213, 76, 252, 56, 136, 141, 73, 190, 49, 108, 108, 50, 147, 197, 4, 191, 179, + 170, 166, 218, 93, 204, 150, 75, 58, 153, 116, 151, 79, 221, 193, 202, 151, 187, 60, 215, + 130, 196, 165, 19, 94, 78, 162, 15, 238, 185, 198, 214, 207, 168, 187, 74, 31, 119, 203, 43, + 210, 75, 127, 219, 241, 186, 104, 79, 215, 95, 42, 187, 126, 235, 196, 166, 210, 19, 184, + 75, 170, 84, 10, 40, 210, 1, 223, 214, 221, 211, 179, 250, 250, 173, 31, 254, 169, 244, 132, + 155, 148, 253, 249, 151, 44, 45, 174, 77, 159, 212, 148, 55, 192, 28, 201, 252, 250, 70, 81, + 226, 203, 108, 22, 208, 186, 169, 75, 91, 64, 155, 166, 192, 102, 237, 50, 25, 18, 25, 90, + 33, 224, 184, 68, 6, 176, 208, 110, 195, 192, 50, 160, 11, 104, 181, 57, 11, 207, 81, 135, + 115, 26, 221, 91, 12, 237, 58, 117, 8, 56, 67, 180, 89, 213, 168, 67, 213, 50, 1, 180, 115, + 208, 222, 6, 212, 0, 171, 129, 85, 192, 22, 240, 62, 180, 7, 180, 39, 224, 183, 55, 147, 6, + 158, 214, 42, 209, 31, 112, 172, 195, 24, 2, 61, 118, 59, 72, 76, 187, 139, 140, 146, 11, + 136, 93, 57, 5, 48, 150, 179, 142, 238, 255, 159, 8, 83, 80, 160, 228, 61, 186, 95, 155, + 135, 177, 230, 81, 187, 179, 13, 178, 1, 217, 66, 157, 104, 29, 7, 73, 179, 144, 249, 0, + 173, 146, 211, 255, 76, 71, 129, 57, 118, 251, 164, 115, 30, 141, 222, 40, 180, 36, 157, + 118, 205, 165, 183, 139, 161, 221, 146, 57, 143, 88, 227, 192, 50, 187, 109, 5, 250, 29, + 227, 153, 75, 5, 120, 63, 115, 242, 6, 113, 194, 185, 54, 179, 71, 64, 211, 168, 217, 241, + 44, 13, 76, 5, 45, 65, 171, 36, 182, 208, 237, 2, 142, 97, 140, 59, 76, 53, 118, 171, 3, + 115, 129, 106, 32, 8, 132, 108, 190, 213, 209, 70, 141, 218, 78, 250, 226, 127, 96, 8, 188, + 192, 1, 50, 149, 203, 212, 168, 92, 206, 132, 209, 126, 2, 109, 19, 112, 11, 176, 6, 232, 0, + 238, 3, 63, 19, 237, 94, 205, 71, 141, 234, 242, 12, 7, 134, 29, 175, 210, 191, 25, 47, 27, + 224, 156, 174, 60, 140, 63, 247, 156, 123, 111, 68, 73, 125, 164, 173, 175, 196, 174, 218, + 165, 104, 41, 109, 106, 17, 241, 49, 161, 121, 73, 154, 104, 80, 181, 205, 7, 77, 34, 42, + 154, 32, 145, 24, 180, 105, 194, 50, 70, 59, 109, 169, 86, 198, 36, 88, 150, 22, 37, 91, + 159, 13, 202, 50, 35, 139, 214, 182, 69, 91, 219, 166, 90, 20, 245, 189, 178, 241, 17, 239, + 217, 231, 222, 115, 19, 153, 183, 102, 214, 59, 243, 155, 231, 220, 243, 158, 123, 239, 121, + 239, 249, 191, 231, 121, 238, 80, 7, 241, 35, 98, 93, 206, 120, 122, 5, 127, 144, 71, 17, + 107, 219, 24, 98, 22, 220, 131, 116, 222, 243, 3, 164, 252, 95, 118, 32, 198, 129, 215, 25, + 39, 247, 242, 94, 123, 17, 109, 174, 64, 138, 252, 133, 109, 77, 180, 171, 81, 16, 26, 117, + 133, 92, 170, 63, 30, 131, 215, 229, 24, 117, 147, 58, 141, 188, 102, 206, 193, 172, 0, 166, + 222, 163, 207, 69, 94, 196, 98, 59, 28, 171, 3, 145, 135, 212, 119, 114, 54, 230, 146, 230, + 158, 54, 38, 173, 100, 166, 186, 218, 16, 51, 12, 9, 1, 244, 185, 71, 159, 139, 29, 140, + 238, 14, 108, 71, 202, 68, 12, 247, 232, 79, 162, 234, 142, 131, 134, 96, 184, 125, 8, 195, + 173, 171, 26, 247, 220, 108, 50, 129, 60, 133, 120, 249, 37, 215, 249, 62, 16, 57, 42, 210, + 46, 86, 145, 141, 118, 169, 72, 243, 35, 213, 222, 46, 98, 123, 39, 219, 253, 2, 120, 46, 0, + 175, 223, 206, 11, 96, 126, 0, 94, 127, 253, 248, 233, 36, 152, 247, 24, 220, 224, 218, 69, + 119, 175, 101, 158, 210, 88, 141, 85, 100, 80, 123, 182, 195, 48, 40, 16, 185, 79, 237, 12, + 132, 253, 81, 46, 93, 16, 107, 28, 67, 148, 113, 76, 57, 220, 32, 241, 164, 45, 153, 76, 18, + 72, 18, 153, 231, 140, 145, 159, 113, 124, 91, 252, 209, 56, 175, 250, 214, 33, 87, 242, 57, + 107, 162, 244, 117, 240, 184, 104, 231, 94, 111, 179, 113, 27, 3, 197, 29, 68, 217, 137, + 222, 189, 238, 210, 213, 213, 133, 234, 154, 171, 109, 17, 23, 64, 143, 223, 244, 245, 227, + 250, 18, 187, 152, 237, 48, 117, 67, 131, 4, 177, 11, 81, 26, 117, 158, 40, 25, 134, 96, + 141, 186, 70, 174, 214, 29, 91, 171, 52, 102, 111, 213, 213, 184, 170, 218, 136, 13, 200, + 17, 251, 200, 6, 164, 138, 10, 116, 49, 207, 32, 199, 204, 189, 63, 172, 150, 200, 9, 26, + 134, 28, 251, 219, 251, 131, 243, 204, 38, 241, 158, 58, 56, 235, 244, 10, 73, 39, 153, 13, + 250, 179, 229, 219, 152, 105, 109, 195, 91, 129, 200, 233, 234, 136, 92, 132, 135, 136, 225, + 169, 67, 168, 124, 12, 150, 7, 92, 157, 130, 28, 153, 138, 66, 153, 143, 23, 197, 55, 248, + 80, 28, 69, 169, 24, 136, 213, 110, 123, 57, 214, 24, 123, 84, 53, 219, 127, 19, 223, 161, + 212, 24, 135, 21, 70, 150, 58, 39, 150, 160, 204, 72, 66, 153, 57, 28, 101, 226, 4, 57, 198, + 177, 199, 145, 71, 62, 52, 174, 240, 184, 7, 138, 140, 159, 241, 41, 191, 219, 35, 230, 224, + 31, 242, 50, 62, 23, 51, 145, 36, 230, 226, 45, 209, 27, 179, 68, 34, 32, 114, 201, 34, 199, + 181, 239, 48, 12, 212, 158, 21, 163, 126, 219, 231, 206, 49, 153, 184, 125, 181, 165, 36, + 35, 160, 111, 25, 201, 52, 20, 143, 153, 11, 228, 10, 178, 198, 237, 79, 35, 41, 178, 35, + 175, 87, 205, 190, 33, 36, 195, 237, 47, 35, 179, 101, 39, 30, 199, 144, 137, 245, 215, 152, + 37, 155, 240, 248, 65, 210, 220, 237, 91, 71, 214, 138, 183, 121, 254, 251, 164, 204, 237, + 59, 71, 126, 18, 204, 24, 98, 47, 217, 204, 177, 123, 200, 73, 102, 14, 55, 125, 212, 142, + 32, 79, 26, 149, 204, 33, 199, 200, 231, 26, 254, 150, 88, 7, 145, 171, 156, 243, 171, 196, + 107, 234, 22, 245, 130, 81, 163, 126, 17, 79, 214, 231, 149, 37, 78, 6, 145, 207, 211, 95, + 139, 233, 99, 110, 134, 240, 239, 119, 60, 77, 231, 5, 255, 22, 230, 133, 41, 58, 47, 248, + 119, 56, 25, 193, 205, 1, 139, 213, 161, 58, 191, 231, 51, 134, 246, 112, 101, 187, 231, + 208, 187, 229, 71, 234, 186, 231, 195, 59, 229, 25, 255, 2, 106, 162, 29, 202, 123, 210, 79, + 109, 96, 55, 125, 189, 137, 21, 239, 175, 246, 60, 177, 192, 241, 66, 113, 219, 241, 24, + 245, 133, 246, 50, 255, 191, 220, 189, 213, 245, 45, 127, 165, 185, 9, 41, 218, 183, 252, + 59, 233, 77, 137, 174, 31, 157, 84, 219, 235, 124, 71, 254, 5, 15, 104, 47, 81, 125, 205, + 124, 30, 59, 30, 50, 86, 221, 112, 125, 161, 8, 69, 178, 200, 191, 146, 218, 204, 226, 147, + 114, 246, 117, 235, 5, 148, 240, 154, 45, 204, 77, 42, 145, 30, 144, 224, 242, 39, 214, 121, + 31, 85, 195, 186, 206, 55, 123, 112, 220, 42, 116, 119, 16, 7, 240, 20, 247, 221, 40, 151, + 124, 12, 48, 7, 98, 146, 232, 137, 52, 209, 83, 125, 79, 102, 136, 158, 254, 203, 206, 158, + 34, 63, 225, 94, 21, 199, 123, 46, 161, 167, 8, 230, 52, 137, 94, 245, 123, 194, 36, 88, + 102, 11, 245, 21, 207, 29, 198, 245, 143, 151, 173, 249, 156, 70, 34, 215, 35, 147, 4, 91, + 125, 185, 223, 71, 192, 199, 223, 157, 103, 173, 229, 127, 235, 29, 140, 114, 16, 243, 221, + 181, 108, 44, 175, 187, 107, 29, 33, 44, 92, 19, 150, 241, 12, 177, 69, 71, 181, 137, 53, + 184, 223, 80, 234, 162, 187, 158, 177, 24, 227, 174, 103, 54, 215, 192, 33, 143, 107, 212, + 73, 101, 54, 200, 142, 137, 246, 4, 238, 61, 255, 132, 100, 238, 25, 81, 135, 151, 7, 227, + 156, 172, 87, 159, 183, 126, 86, 27, 236, 91, 228, 184, 206, 141, 65, 242, 110, 142, 51, + 111, 234, 117, 118, 178, 106, 93, 246, 50, 123, 211, 195, 29, 182, 98, 175, 181, 72, 175, + 181, 213, 142, 249, 182, 154, 76, 193, 46, 251, 26, 18, 131, 194, 217, 254, 21, 203, 237, + 86, 204, 181, 3, 200, 56, 132, 155, 169, 200, 14, 10, 230, 181, 114, 212, 109, 230, 220, 50, + 243, 26, 150, 51, 51, 194, 173, 141, 75, 244, 63, 39, 39, 133, 114, 61, 29, 58, 177, 30, 94, + 87, 211, 27, 228, 161, 110, 86, 190, 250, 149, 26, 98, 206, 231, 119, 30, 94, 198, 25, 233, + 228, 23, 121, 128, 245, 64, 204, 158, 106, 173, 91, 47, 121, 94, 38, 41, 33, 19, 221, 172, + 49, 212, 205, 93, 117, 57, 98, 25, 179, 30, 255, 153, 102, 119, 102, 200, 198, 186, 94, 204, + 55, 225, 51, 51, 185, 54, 183, 176, 212, 126, 20, 62, 59, 154, 199, 201, 152, 97, 21, 113, + 110, 103, 201, 41, 230, 176, 43, 24, 103, 119, 231, 181, 184, 39, 240, 187, 66, 115, 60, + 222, 224, 122, 192, 54, 120, 223, 158, 188, 167, 227, 227, 131, 249, 157, 83, 91, 71, 121, + 173, 24, 102, 56, 194, 125, 47, 202, 81, 243, 105, 119, 223, 29, 212, 208, 195, 109, 159, + 170, 102, 206, 150, 222, 158, 235, 120, 228, 115, 158, 7, 102, 187, 158, 182, 133, 126, 70, + 204, 135, 84, 5, 239, 83, 97, 101, 194, 54, 159, 161, 143, 117, 246, 188, 170, 61, 233, 82, + 231, 101, 172, 77, 39, 99, 208, 99, 28, 159, 179, 35, 152, 149, 220, 189, 153, 222, 243, 37, + 235, 109, 37, 239, 201, 189, 219, 28, 234, 237, 239, 159, 33, 213, 25, 99, 167, 242, 93, + 196, 135, 209, 86, 34, 210, 228, 167, 72, 151, 11, 232, 83, 11, 153, 205, 247, 113, 222, 7, + 213, 105, 115, 24, 98, 29, 111, 54, 59, 33, 67, 78, 230, 111, 243, 96, 173, 174, 114, 16, + 37, 220, 143, 75, 232, 127, 37, 200, 146, 155, 113, 139, 116, 32, 81, 242, 7, 252, 36, 82, + 80, 66, 70, 201, 151, 241, 61, 189, 160, 7, 235, 120, 177, 83, 211, 162, 35, 178, 88, 231, + 62, 107, 14, 98, 88, 223, 23, 200, 107, 68, 145, 119, 184, 70, 231, 200, 27, 164, 150, 44, + 118, 206, 97, 246, 123, 95, 108, 193, 76, 82, 64, 222, 35, 239, 154, 173, 153, 3, 91, 243, + 189, 167, 53, 62, 32, 243, 100, 27, 149, 35, 170, 212, 82, 249, 49, 206, 202, 90, 163, 145, + 108, 137, 67, 162, 10, 123, 197, 84, 60, 75, 210, 101, 45, 61, 169, 22, 109, 130, 250, 99, + 21, 217, 81, 167, 178, 86, 37, 177, 255, 20, 231, 179, 134, 108, 23, 89, 200, 21, 89, 234, + 132, 152, 134, 174, 98, 154, 218, 47, 138, 145, 46, 138, 213, 41, 49, 0, 147, 197, 0, 122, + 187, 143, 253, 62, 30, 103, 97, 30, 199, 93, 226, 184, 254, 28, 247, 13, 199, 21, 112, 92, + 13, 175, 245, 95, 242, 111, 146, 70, 162, 205, 141, 216, 109, 70, 162, 140, 237, 66, 242, + 174, 177, 15, 53, 242, 105, 212, 88, 244, 36, 139, 222, 20, 84, 67, 232, 27, 65, 253, 92, + 13, 181, 215, 163, 210, 129, 239, 159, 23, 173, 191, 226, 152, 181, 14, 11, 248, 123, 193, + 121, 94, 54, 255, 142, 97, 236, 239, 198, 235, 60, 76, 109, 207, 61, 43, 148, 237, 131, 252, + 174, 198, 121, 95, 101, 59, 157, 207, 162, 55, 219, 62, 249, 31, 116, 148, 165, 104, 39, + 119, 49, 211, 150, 242, 183, 151, 178, 174, 155, 96, 82, 163, 199, 185, 111, 240, 57, 216, + 63, 178, 102, 155, 43, 101, 46, 194, 88, 113, 16, 73, 146, 239, 5, 242, 130, 250, 193, 28, + 201, 61, 250, 184, 250, 214, 140, 192, 108, 89, 206, 255, 65, 4, 107, 43, 130, 251, 91, 8, + 247, 198, 16, 36, 147, 223, 153, 33, 234, 58, 57, 76, 46, 242, 120, 34, 153, 78, 158, 224, + 241, 77, 254, 7, 146, 197, 66, 140, 145, 133, 172, 163, 169, 104, 33, 215, 113, 255, 152, + 192, 58, 220, 138, 151, 220, 189, 209, 169, 143, 10, 116, 230, 124, 162, 201, 72, 210, 140, + 180, 37, 161, 158, 198, 147, 98, 242, 40, 233, 192, 249, 77, 228, 252, 22, 234, 249, 161, + 41, 253, 233, 65, 121, 28, 141, 188, 249, 21, 120, 243, 235, 197, 251, 199, 222, 157, 31, + 223, 89, 67, 208, 138, 132, 121, 243, 91, 173, 231, 135, 199, 228, 239, 177, 221, 184, 193, + 218, 216, 136, 98, 177, 30, 133, 204, 18, 69, 98, 53, 230, 176, 86, 14, 208, 151, 119, 138, + 147, 204, 41, 85, 228, 60, 246, 83, 247, 139, 35, 248, 196, 168, 192, 23, 228, 85, 158, 107, + 240, 220, 80, 177, 81, 29, 18, 235, 85, 165, 56, 161, 14, 138, 213, 234, 48, 199, 53, 227, + 185, 150, 56, 73, 239, 173, 34, 231, 209, 148, 125, 77, 197, 17, 85, 203, 243, 30, 49, 42, + 212, 86, 177, 140, 239, 93, 213, 232, 33, 70, 168, 51, 34, 134, 222, 226, 99, 205, 12, 81, + 85, 34, 1, 38, 179, 75, 19, 49, 90, 157, 22, 177, 172, 167, 101, 172, 145, 106, 148, 139, + 17, 152, 32, 98, 248, 44, 125, 204, 79, 67, 152, 13, 19, 48, 151, 227, 222, 20, 163, 145, + 33, 98, 145, 45, 54, 249, 79, 203, 150, 202, 111, 37, 147, 76, 242, 136, 167, 79, 168, 59, + 214, 243, 164, 18, 73, 46, 25, 136, 181, 182, 146, 21, 228, 48, 198, 91, 179, 232, 67, 43, + 72, 23, 245, 53, 243, 92, 106, 163, 56, 164, 90, 133, 24, 31, 116, 152, 107, 86, 235, 146, + 76, 122, 145, 126, 36, 134, 248, 200, 80, 50, 154, 116, 32, 178, 1, 113, 214, 57, 116, 51, + 45, 60, 107, 127, 133, 121, 92, 251, 120, 113, 81, 229, 176, 127, 148, 147, 55, 156, 28, + 224, 120, 166, 157, 134, 229, 102, 162, 218, 109, 62, 140, 73, 252, 207, 45, 37, 239, 145, + 74, 151, 16, 124, 28, 20, 98, 244, 169, 211, 198, 113, 220, 131, 123, 163, 148, 239, 150, + 157, 97, 112, 63, 77, 197, 215, 8, 194, 70, 34, 208, 12, 221, 145, 2, 4, 159, 51, 226, 24, + 142, 12, 72, 64, 49, 135, 169, 86, 152, 139, 123, 124, 54, 5, 203, 109, 98, 70, 121, 120, + 255, 246, 219, 68, 129, 150, 252, 242, 240, 7, 40, 211, 181, 228, 149, 135, 247, 161, 228, + 106, 153, 166, 135, 76, 45, 15, 239, 75, 153, 82, 30, 222, 143, 146, 163, 37, 91, 203, 171, + 229, 225, 145, 148, 201, 90, 178, 244, 9, 147, 180, 188, 82, 30, 54, 144, 50, 81, 75, 102, + 121, 216, 32, 202, 132, 242, 176, 193, 148, 12, 45, 233, 90, 210, 180, 188, 172, 101, 188, + 62, 97, 156, 62, 33, 85, 75, 138, 254, 46, 89, 75, 82, 121, 187, 104, 202, 75, 90, 254, 172, + 101, 172, 150, 23, 181, 140, 209, 242, 130, 150, 209, 90, 70, 105, 25, 169, 37, 81, 203, + 136, 255, 81, 95, 223, 241, 77, 149, 123, 24, 192, 207, 73, 202, 74, 154, 158, 164, 25, 29, + 105, 121, 171, 8, 88, 82, 176, 85, 129, 32, 106, 99, 91, 194, 8, 93, 180, 47, 116, 72, 43, + 80, 160, 160, 136, 164, 141, 200, 8, 84, 144, 43, 222, 43, 195, 61, 16, 193, 129, 168, 113, + 164, 47, 168, 168, 40, 184, 183, 117, 47, 84, 234, 222, 130, 138, 123, 228, 62, 167, 207, + 253, 219, 127, 239, 189, 105, 159, 124, 207, 251, 59, 191, 247, 61, 111, 242, 73, 115, 62, + 37, 181, 164, 134, 84, 147, 42, 149, 87, 1, 42, 57, 154, 74, 34, 100, 10, 153, 76, 38, 145, + 137, 36, 76, 38, 144, 10, 229, 159, 12, 202, 149, 127, 10, 40, 35, 167, 145, 144, 242, 71, + 64, 41, 57, 85, 249, 167, 130, 83, 200, 201, 100, 60, 57, 137, 212, 145, 113, 92, 51, 72, + 198, 114, 177, 49, 100, 52, 57, 145, 107, 158, 64, 142, 231, 188, 18, 82, 76, 142, 35, 163, + 200, 72, 46, 86, 196, 233, 1, 206, 27, 193, 115, 133, 228, 88, 50, 156, 157, 195, 200, 80, + 78, 56, 134, 12, 225, 188, 163, 217, 121, 20, 41, 32, 130, 12, 38, 249, 42, 183, 10, 228, + 17, 191, 202, 173, 6, 185, 36, 135, 100, 243, 92, 22, 241, 177, 232, 37, 30, 226, 230, 185, + 76, 226, 98, 209, 201, 145, 65, 50, 88, 116, 144, 116, 98, 39, 54, 50, 72, 229, 212, 128, + 129, 42, 167, 22, 12, 32, 253, 73, 63, 146, 198, 22, 43, 71, 22, 162, 19, 173, 15, 61, 69, + 254, 34, 127, 246, 77, 208, 255, 224, 232, 119, 242, 27, 249, 149, 252, 66, 126, 38, 63, + 169, 236, 58, 240, 35, 57, 162, 178, 235, 193, 15, 228, 123, 242, 29, 57, 204, 150, 67, 228, + 91, 22, 191, 33, 95, 147, 175, 200, 151, 108, 249, 130, 124, 78, 62, 227, 185, 79, 201, 39, + 228, 99, 242, 17, 91, 62, 36, 31, 176, 216, 75, 14, 146, 247, 201, 123, 42, 107, 58, 120, + 151, 28, 80, 89, 51, 192, 59, 228, 109, 22, 223, 34, 111, 178, 248, 6, 121, 157, 188, 70, + 94, 101, 203, 43, 28, 189, 204, 209, 75, 164, 135, 197, 23, 201, 11, 228, 121, 242, 28, 121, + 150, 157, 207, 144, 167, 89, 124, 138, 60, 73, 158, 32, 143, 43, 31, 190, 151, 244, 199, + 148, 175, 20, 60, 74, 30, 81, 190, 102, 176, 159, 236, 35, 15, 147, 135, 200, 94, 242, 32, + 121, 128, 243, 238, 39, 123, 88, 188, 143, 220, 75, 238, 33, 187, 201, 46, 162, 72, 55, 231, + 37, 185, 151, 187, 57, 186, 139, 220, 201, 150, 59, 72, 130, 220, 78, 110, 35, 183, 114, + 222, 78, 78, 184, 133, 197, 29, 228, 102, 114, 19, 185, 145, 220, 64, 182, 147, 109, 228, + 122, 229, 157, 13, 182, 146, 235, 148, 119, 14, 216, 162, 188, 109, 224, 90, 229, 157, 11, + 174, 81, 222, 121, 224, 106, 114, 21, 185, 146, 92, 65, 46, 39, 151, 145, 75, 149, 119, 22, + 184, 132, 107, 110, 230, 154, 155, 184, 230, 70, 178, 129, 75, 95, 204, 9, 255, 34, 255, + 100, 231, 69, 108, 89, 175, 188, 18, 92, 200, 197, 254, 193, 197, 214, 145, 11, 216, 185, + 150, 171, 172, 225, 244, 243, 73, 23, 89, 77, 86, 145, 56, 89, 73, 86, 144, 229, 202, 139, + 239, 100, 125, 25, 175, 112, 30, 151, 94, 74, 206, 229, 21, 98, 220, 75, 39, 233, 224, 245, + 162, 156, 190, 132, 156, 67, 22, 147, 179, 201, 34, 114, 22, 57, 147, 47, 101, 33, 175, 183, + 128, 180, 43, 239, 24, 48, 159, 204, 83, 158, 53, 96, 174, 242, 152, 159, 221, 54, 229, 89, + 13, 230, 40, 143, 57, 111, 54, 139, 179, 148, 39, 4, 206, 96, 177, 149, 197, 22, 229, 89, 5, + 102, 42, 207, 90, 112, 186, 242, 172, 3, 205, 202, 141, 155, 176, 222, 164, 220, 131, 65, + 35, 105, 80, 110, 27, 152, 65, 166, 43, 55, 110, 243, 186, 84, 110, 220, 223, 245, 122, 82, + 71, 166, 41, 55, 110, 243, 122, 173, 114, 227, 198, 174, 215, 144, 106, 149, 105, 238, 186, + 74, 101, 134, 65, 37, 153, 202, 98, 132, 76, 97, 113, 50, 153, 68, 38, 170, 76, 220, 55, + 245, 48, 91, 38, 176, 88, 65, 202, 149, 107, 34, 40, 83, 46, 243, 143, 242, 52, 229, 106, 0, + 33, 229, 106, 4, 165, 202, 213, 4, 78, 37, 167, 40, 151, 249, 105, 61, 153, 140, 39, 39, + 145, 113, 202, 21, 0, 65, 229, 42, 2, 99, 149, 107, 28, 24, 67, 70, 43, 151, 121, 161, 19, + 121, 161, 19, 200, 241, 202, 101, 190, 131, 37, 164, 88, 185, 204, 55, 242, 56, 50, 138, + 123, 25, 73, 138, 184, 165, 0, 183, 52, 130, 20, 114, 75, 199, 146, 225, 220, 196, 48, 50, + 148, 28, 67, 134, 112, 194, 209, 236, 60, 138, 91, 42, 224, 38, 4, 175, 55, 152, 228, 179, + 51, 143, 248, 57, 61, 151, 228, 144, 108, 118, 102, 17, 31, 55, 232, 37, 30, 238, 211, 205, + 11, 101, 18, 23, 231, 57, 137, 65, 50, 136, 131, 45, 233, 28, 217, 149, 115, 38, 176, 41, + 103, 11, 24, 164, 156, 173, 96, 32, 25, 64, 250, 147, 126, 236, 76, 99, 167, 149, 69, 11, + 209, 137, 22, 74, 193, 20, 250, 254, 130, 127, 34, 127, 32, 191, 35, 191, 161, 246, 43, 38, + 254, 130, 227, 159, 145, 159, 144, 31, 145, 35, 198, 108, 241, 3, 242, 189, 49, 71, 124, + 103, 180, 137, 195, 200, 33, 228, 91, 228, 27, 212, 191, 70, 190, 194, 185, 47, 49, 254, 2, + 249, 28, 249, 12, 249, 20, 245, 79, 144, 143, 113, 252, 17, 252, 16, 249, 0, 125, 189, 24, + 31, 68, 222, 71, 222, 67, 222, 69, 14, 32, 239, 100, 204, 23, 111, 103, 180, 139, 183, 144, + 55, 145, 55, 144, 215, 81, 123, 13, 190, 138, 188, 130, 188, 140, 241, 75, 176, 7, 121, 17, + 121, 1, 121, 30, 121, 14, 121, 22, 121, 6, 121, 218, 113, 166, 120, 202, 113, 150, 120, 210, + 49, 66, 60, 1, 31, 119, 20, 137, 199, 80, 123, 20, 199, 143, 56, 22, 137, 80, 106, 191, 99, + 161, 216, 231, 88, 32, 30, 118, 180, 139, 135, 112, 102, 175, 163, 68, 60, 136, 60, 128, + 220, 159, 190, 68, 236, 73, 143, 138, 251, 210, 59, 196, 189, 233, 157, 226, 30, 100, 55, + 178, 11, 99, 5, 187, 209, 147, 68, 238, 70, 238, 66, 238, 68, 238, 64, 18, 200, 237, 200, + 109, 246, 85, 226, 86, 251, 114, 177, 211, 190, 76, 220, 2, 119, 216, 87, 138, 155, 237, + 113, 113, 19, 234, 55, 34, 55, 32, 219, 145, 109, 200, 245, 200, 86, 228, 58, 100, 11, 114, + 173, 125, 164, 184, 6, 185, 218, 182, 83, 92, 101, 219, 33, 174, 132, 87, 32, 151, 35, 151, + 33, 151, 218, 218, 197, 37, 182, 53, 98, 179, 109, 139, 216, 100, 219, 42, 54, 218, 182, + 137, 13, 168, 95, 140, 172, 179, 14, 21, 23, 88, 131, 98, 173, 30, 20, 107, 100, 151, 60, + 63, 209, 37, 87, 203, 184, 92, 149, 136, 75, 123, 92, 183, 199, 253, 241, 72, 124, 69, 60, + 17, 63, 16, 15, 85, 246, 183, 173, 148, 203, 229, 138, 196, 114, 185, 76, 46, 149, 231, 37, + 150, 202, 115, 19, 49, 153, 22, 243, 196, 58, 99, 214, 35, 49, 61, 17, 211, 43, 98, 122, + 113, 76, 183, 104, 49, 103, 172, 32, 102, 77, 239, 148, 81, 217, 145, 136, 74, 45, 90, 19, + 237, 138, 38, 163, 105, 227, 147, 209, 222, 168, 69, 139, 234, 182, 61, 169, 253, 187, 162, + 254, 193, 97, 24, 90, 25, 117, 56, 195, 75, 228, 98, 121, 78, 98, 177, 60, 123, 222, 34, + 185, 16, 219, 90, 16, 156, 47, 219, 19, 243, 229, 188, 96, 155, 156, 155, 104, 147, 115, + 130, 179, 229, 172, 224, 25, 178, 53, 56, 83, 182, 36, 102, 202, 211, 131, 77, 178, 57, 209, + 36, 27, 131, 13, 114, 6, 250, 167, 7, 235, 165, 76, 212, 203, 186, 96, 173, 156, 150, 168, + 149, 213, 193, 42, 89, 133, 122, 101, 48, 34, 167, 38, 34, 114, 74, 112, 146, 156, 156, 152, + 36, 39, 6, 195, 114, 2, 94, 178, 150, 231, 204, 43, 200, 179, 58, 205, 13, 84, 229, 97, 39, + 154, 95, 47, 43, 246, 135, 252, 189, 254, 195, 254, 52, 205, 159, 244, 239, 247, 91, 51, + 141, 92, 145, 107, 41, 52, 114, 244, 242, 234, 28, 125, 113, 206, 234, 156, 77, 57, 86, 35, + 187, 39, 219, 18, 202, 46, 44, 10, 27, 89, 61, 89, 7, 179, 14, 101, 165, 185, 67, 89, 133, + 163, 194, 154, 207, 233, 43, 240, 89, 189, 230, 107, 243, 85, 214, 135, 251, 44, 173, 160, + 37, 163, 251, 94, 107, 165, 111, 200, 176, 176, 225, 213, 13, 175, 240, 90, 38, 8, 175, 174, + 185, 122, 93, 135, 93, 86, 239, 62, 103, 143, 211, 98, 24, 186, 97, 164, 12, 75, 200, 64, + 187, 145, 33, 50, 44, 230, 83, 42, 195, 26, 202, 40, 25, 27, 54, 28, 194, 97, 49, 159, 82, + 14, 171, 47, 228, 64, 197, 92, 113, 120, 122, 77, 125, 216, 176, 11, 187, 69, 150, 218, 171, + 237, 150, 144, 189, 180, 60, 28, 178, 143, 44, 14, 107, 86, 189, 64, 215, 53, 221, 9, 172, + 3, 209, 187, 91, 247, 138, 176, 117, 175, 110, 254, 167, 217, 79, 211, 245, 205, 221, 245, + 117, 129, 64, 100, 207, 128, 212, 180, 72, 114, 80, 77, 115, 82, 95, 159, 28, 90, 103, 62, + 135, 106, 155, 146, 253, 215, 39, 53, 217, 212, 220, 208, 173, 235, 27, 27, 187, 117, 75, + 121, 125, 210, 19, 169, 109, 226, 120, 221, 134, 13, 90, 126, 89, 36, 153, 95, 215, 160, + 172, 219, 183, 231, 151, 53, 70, 146, 93, 230, 113, 40, 212, 119, 156, 50, 143, 53, 180, 52, + 6, 90, 58, 98, 29, 129, 64, 103, 11, 158, 90, 58, 58, 3, 125, 191, 24, 233, 49, 115, 20, 48, + 139, 230, 111, 71, 39, 198, 230, 79, 172, 111, 172, 5, 254, 246, 193, 54, 208, 218, 129, 71, + 231, 127, 106, 157, 127, 63, 233, 255, 246, 161, 255, 183, 55, 240, 63, 254, 200, 110, 109, + 209, 52, 237, 223, 2, 12, 0, 191, 179, 106, 254, 13, 10, 101, 110, 100, 115, 116, 114, 101, + 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 51, 50, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 49, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 120, 156, 147, 96, 0, 3, 14, 6, 28, 0, 0, 3, 232, 0, 33, 13, 10, 101, 110, 100, 115, 116, + 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 51, 51, 32, 48, 32, 111, 98, + 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, + 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 53, 54, 48, 54, 47, 76, 101, 110, + 103, 116, 104, 49, 32, 52, 57, 55, 53, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, + 137, 140, 86, 123, 108, 83, 215, 25, 255, 206, 189, 215, 190, 215, 190, 215, 143, 235, 235, + 87, 174, 237, 196, 246, 141, 175, 67, 108, 98, 242, 142, 27, 26, 155, 242, 26, 140, 16, 18, + 66, 134, 32, 238, 26, 66, 128, 81, 104, 194, 99, 140, 22, 70, 81, 139, 80, 85, 21, 81, 173, + 168, 218, 58, 81, 109, 163, 157, 40, 171, 200, 242, 90, 220, 178, 209, 180, 226, 143, 77, + 147, 88, 87, 69, 211, 218, 174, 172, 76, 180, 66, 83, 131, 210, 169, 66, 27, 96, 123, 231, + 216, 199, 60, 198, 63, 139, 228, 115, 126, 247, 156, 227, 155, 239, 247, 59, 191, 239, 251, + 12, 8, 0, 44, 112, 20, 88, 88, 215, 181, 62, 209, 176, 107, 199, 222, 44, 192, 15, 223, 192, + 171, 79, 12, 238, 30, 24, 217, 187, 226, 211, 143, 1, 182, 157, 5, 16, 174, 13, 30, 216, 31, + 28, 125, 101, 250, 63, 0, 71, 56, 0, 131, 121, 219, 200, 246, 221, 55, 111, 118, 74, 0, 207, + 219, 1, 76, 234, 246, 93, 79, 111, 251, 120, 231, 153, 173, 248, 187, 127, 3, 232, 125, 108, + 199, 208, 192, 214, 127, 172, 24, 253, 2, 224, 165, 56, 94, 107, 217, 129, 23, 44, 231, 197, + 197, 248, 153, 156, 169, 222, 177, 123, 255, 193, 133, 67, 159, 95, 199, 207, 47, 0, 200, + 199, 118, 13, 15, 14, 192, 95, 127, 245, 35, 128, 13, 65, 252, 252, 194, 238, 129, 131, 35, + 53, 136, 181, 0, 188, 142, 255, 7, 4, 159, 26, 216, 61, 164, 239, 232, 154, 7, 24, 126, 9, + 192, 234, 30, 25, 222, 183, 191, 224, 131, 227, 120, 159, 188, 63, 56, 178, 119, 104, 164, + 240, 207, 47, 63, 199, 207, 107, 240, 235, 69, 48, 0, 228, 247, 177, 31, 25, 172, 152, 29, + 15, 73, 232, 132, 181, 176, 249, 183, 96, 65, 61, 224, 134, 71, 208, 212, 148, 107, 217, 50, + 97, 33, 127, 17, 45, 5, 6, 130, 168, 23, 4, 64, 104, 105, 218, 198, 49, 150, 105, 85, 77, + 105, 211, 205, 198, 19, 172, 188, 42, 139, 22, 78, 166, 248, 19, 12, 3, 169, 220, 149, 220, + 229, 68, 238, 202, 156, 35, 153, 152, 67, 137, 207, 174, 94, 185, 106, 255, 250, 178, 156, + 76, 52, 94, 157, 189, 90, 191, 8, 201, 33, 185, 248, 113, 90, 25, 158, 119, 26, 181, 112, + 29, 211, 28, 213, 91, 26, 27, 27, 58, 152, 230, 38, 93, 11, 91, 153, 226, 90, 83, 75, 107, + 7, 219, 216, 80, 201, 176, 206, 242, 74, 7, 67, 158, 17, 251, 209, 157, 77, 108, 87, 206, + 200, 28, 209, 82, 125, 141, 134, 74, 213, 230, 180, 24, 13, 140, 223, 235, 88, 184, 56, 98, + 95, 191, 57, 178, 184, 46, 192, 179, 188, 145, 53, 8, 124, 77, 235, 99, 225, 111, 239, 90, + 30, 254, 132, 151, 3, 46, 119, 192, 33, 8, 142, 128, 219, 21, 144, 249, 220, 167, 6, 235, + 173, 127, 25, 172, 183, 151, 114, 187, 110, 159, 98, 141, 237, 253, 169, 106, 246, 199, 102, + 129, 225, 140, 198, 108, 165, 183, 162, 182, 61, 180, 170, 207, 166, 216, 57, 81, 177, 203, + 110, 129, 119, 200, 82, 205, 178, 254, 220, 113, 151, 159, 188, 195, 239, 114, 149, 222, + 149, 235, 196, 178, 104, 133, 91, 220, 17, 131, 19, 194, 160, 195, 233, 119, 160, 186, 112, + 125, 82, 178, 163, 53, 90, 150, 2, 61, 91, 152, 159, 20, 49, 16, 203, 192, 140, 65, 90, 37, + 40, 98, 39, 163, 165, 56, 74, 197, 49, 93, 131, 34, 100, 59, 46, 162, 206, 106, 77, 143, + 124, 35, 137, 146, 55, 28, 208, 204, 22, 228, 230, 36, 144, 236, 18, 51, 170, 189, 167, 253, + 73, 99, 53, 73, 147, 28, 129, 30, 199, 6, 195, 6, 72, 165, 82, 142, 100, 50, 145, 200, 100, + 100, 79, 82, 198, 80, 110, 180, 207, 53, 200, 141, 88, 241, 88, 38, 86, 252, 131, 88, 44, + 226, 118, 27, 139, 146, 71, 217, 16, 107, 101, 181, 176, 174, 183, 180, 162, 146, 206, 30, + 94, 99, 67, 220, 247, 5, 100, 143, 84, 85, 69, 20, 19, 55, 156, 251, 114, 39, 107, 86, 52, + 127, 32, 98, 67, 2, 26, 231, 44, 21, 209, 202, 96, 173, 106, 229, 14, 161, 191, 163, 15, 30, + 117, 251, 172, 28, 203, 75, 38, 212, 158, 255, 131, 201, 98, 226, 12, 86, 159, 155, 27, 23, + 173, 2, 203, 10, 54, 241, 68, 238, 16, 96, 79, 189, 13, 192, 33, 236, 174, 74, 136, 65, 27, + 252, 62, 173, 86, 121, 237, 168, 179, 202, 110, 35, 131, 5, 15, 94, 9, 15, 65, 204, 181, 42, + 203, 212, 165, 107, 84, 87, 26, 239, 187, 210, 120, 223, 229, 18, 227, 228, 112, 156, 28, + 142, 147, 195, 113, 114, 56, 78, 14, 199, 223, 101, 26, 0, 10, 51, 83, 24, 131, 222, 136, + 149, 158, 192, 39, 241, 60, 63, 97, 163, 179, 165, 56, 223, 156, 144, 138, 243, 245, 9, 145, + 204, 140, 61, 109, 249, 153, 56, 35, 50, 162, 26, 253, 166, 190, 158, 175, 206, 34, 211, + 184, 189, 187, 41, 139, 196, 49, 190, 23, 82, 115, 169, 162, 111, 147, 40, 145, 185, 90, 20, + 173, 97, 54, 86, 2, 120, 57, 22, 75, 150, 48, 22, 213, 105, 229, 180, 80, 88, 111, 150, 155, + 90, 26, 67, 88, 61, 23, 241, 115, 37, 139, 154, 234, 24, 77, 147, 137, 153, 149, 123, 144, + 67, 85, 109, 93, 131, 123, 86, 229, 207, 123, 22, 44, 240, 32, 125, 255, 169, 193, 6, 119, + 108, 73, 109, 115, 255, 242, 154, 124, 78, 109, 219, 180, 122, 252, 210, 210, 158, 150, 138, + 181, 145, 149, 79, 118, 95, 190, 213, 190, 113, 169, 142, 246, 61, 186, 189, 167, 163, 214, + 85, 21, 229, 158, 139, 86, 197, 123, 159, 233, 172, 235, 93, 217, 230, 48, 55, 247, 60, 197, + 160, 196, 154, 102, 127, 62, 163, 181, 119, 229, 62, 123, 100, 227, 226, 170, 124, 155, 191, + 181, 7, 16, 12, 20, 230, 57, 201, 80, 137, 179, 120, 203, 132, 31, 218, 99, 84, 149, 24, 85, + 5, 207, 95, 17, 85, 240, 124, 131, 168, 18, 163, 170, 196, 46, 50, 141, 96, 5, 47, 74, 64, + 8, 116, 20, 31, 87, 214, 115, 23, 80, 45, 52, 195, 34, 84, 55, 102, 234, 195, 41, 61, 59, + 71, 62, 40, 81, 162, 111, 255, 203, 165, 250, 69, 17, 167, 213, 120, 95, 90, 26, 93, 52, 77, + 73, 2, 187, 156, 149, 12, 225, 77, 108, 197, 73, 140, 65, 112, 166, 191, 123, 104, 213, 145, + 63, 158, 236, 92, 255, 234, 159, 159, 109, 219, 185, 105, 133, 79, 48, 176, 156, 32, 10, + 214, 134, 174, 61, 93, 125, 39, 182, 182, 54, 15, 190, 188, 185, 115, 95, 119, 147, 141, 55, + 27, 217, 105, 187, 215, 97, 117, 46, 136, 250, 122, 223, 248, 250, 244, 207, 239, 140, 246, + 187, 130, 181, 62, 171, 162, 58, 156, 126, 197, 20, 77, 68, 151, 31, 127, 255, 240, 161, + 223, 61, 187, 68, 79, 232, 70, 185, 18, 103, 32, 113, 217, 73, 236, 50, 7, 84, 193, 15, 210, + 129, 84, 8, 41, 196, 57, 10, 113, 142, 226, 196, 156, 21, 7, 38, 172, 120, 49, 91, 229, 2, + 113, 14, 168, 37, 109, 84, 170, 141, 74, 29, 163, 82, 199, 168, 84, 27, 245, 2, 35, 131, 9, + 107, 35, 141, 91, 187, 125, 89, 164, 143, 25, 74, 46, 41, 107, 49, 91, 118, 68, 134, 84, + 180, 7, 44, 193, 223, 103, 128, 147, 125, 111, 206, 255, 50, 127, 163, 120, 253, 145, 179, + 215, 79, 119, 79, 53, 13, 159, 59, 62, 58, 118, 248, 220, 222, 36, 243, 218, 217, 219, 111, + 246, 148, 46, 250, 59, 103, 174, 255, 228, 123, 83, 199, 86, 223, 145, 59, 142, 190, 15, + 248, 78, 49, 51, 246, 48, 102, 22, 135, 3, 99, 106, 148, 222, 104, 148, 70, 29, 165, 81, 71, + 105, 212, 81, 26, 117, 52, 203, 200, 105, 147, 73, 9, 42, 65, 28, 188, 154, 69, 66, 218, + 114, 84, 71, 51, 58, 250, 80, 71, 186, 110, 172, 200, 98, 62, 150, 238, 40, 158, 198, 140, + 119, 93, 159, 217, 179, 23, 211, 74, 20, 203, 136, 157, 186, 191, 120, 207, 204, 67, 78, + 215, 66, 242, 255, 64, 246, 48, 103, 182, 8, 185, 87, 8, 67, 102, 155, 96, 17, 12, 6, 60, + 228, 141, 104, 92, 192, 165, 129, 51, 97, 188, 150, 65, 130, 197, 204, 173, 116, 248, 28, + 66, 137, 173, 224, 240, 57, 29, 62, 89, 200, 239, 52, 217, 253, 138, 67, 181, 243, 249, 122, + 65, 246, 21, 121, 23, 110, 177, 189, 152, 119, 20, 250, 199, 120, 133, 242, 86, 40, 111, + 133, 242, 86, 40, 111, 133, 242, 86, 48, 239, 41, 75, 0, 42, 3, 60, 166, 54, 161, 40, 21, + 198, 44, 170, 153, 8, 119, 87, 144, 2, 73, 59, 82, 226, 146, 156, 188, 203, 14, 61, 68, 166, + 220, 109, 202, 116, 217, 94, 76, 140, 207, 99, 245, 120, 28, 124, 17, 167, 5, 103, 80, 245, + 134, 157, 2, 166, 186, 162, 184, 122, 73, 241, 99, 22, 223, 226, 237, 62, 151, 226, 147, 77, + 185, 47, 120, 11, 111, 48, 224, 129, 59, 79, 88, 6, 8, 163, 205, 133, 27, 220, 65, 67, 16, + 82, 240, 139, 116, 192, 239, 183, 121, 137, 67, 189, 196, 161, 94, 82, 219, 188, 102, 137, + 32, 204, 194, 75, 110, 207, 2, 239, 69, 81, 48, 154, 142, 62, 17, 101, 163, 54, 202, 223, + 70, 249, 219, 104, 38, 219, 104, 38, 219, 40, 127, 91, 150, 105, 152, 76, 52, 161, 38, 111, + 22, 153, 39, 195, 225, 100, 162, 227, 2, 50, 227, 30, 111, 70, 11, 198, 147, 235, 157, 89, + 20, 31, 75, 244, 145, 251, 198, 217, 44, 151, 228, 160, 117, 110, 54, 147, 185, 116, 183, + 208, 81, 93, 30, 200, 230, 150, 86, 153, 184, 128, 100, 123, 81, 45, 153, 84, 192, 123, 249, + 207, 113, 7, 57, 65, 226, 165, 182, 199, 159, 223, 244, 228, 185, 3, 169, 229, 207, 188, 53, + 180, 248, 80, 115, 126, 86, 150, 57, 19, 238, 17, 63, 21, 221, 14, 179, 227, 145, 254, 45, + 91, 235, 95, 253, 234, 76, 95, 230, 173, 185, 151, 87, 63, 55, 180, 92, 53, 115, 143, 43, 1, + 69, 208, 235, 244, 181, 47, 94, 28, 62, 60, 115, 108, 89, 32, 128, 158, 14, 87, 99, 25, 5, + 193, 238, 119, 228, 21, 85, 15, 132, 189, 82, 230, 237, 249, 83, 175, 221, 250, 245, 128, + 170, 45, 80, 195, 37, 127, 112, 235, 112, 207, 77, 64, 118, 50, 85, 143, 52, 137, 74, 36, + 81, 137, 36, 106, 17, 137, 90, 68, 162, 18, 73, 68, 92, 191, 167, 90, 36, 234, 139, 68, 125, + 145, 168, 47, 18, 245, 69, 82, 31, 68, 210, 35, 60, 144, 118, 225, 198, 146, 86, 200, 96, + 151, 209, 26, 72, 227, 125, 240, 100, 11, 51, 19, 120, 131, 204, 191, 193, 123, 158, 218, + 30, 220, 64, 226, 105, 219, 140, 132, 62, 148, 144, 244, 96, 55, 198, 9, 53, 151, 66, 184, + 107, 204, 18, 89, 169, 229, 238, 37, 86, 38, 114, 215, 106, 247, 187, 174, 84, 53, 93, 120, + 173, 12, 185, 117, 130, 51, 228, 85, 131, 78, 33, 55, 129, 81, 5, 113, 158, 224, 12, 123, + 43, 66, 78, 129, 233, 44, 122, 17, 35, 21, 171, 143, 45, 39, 9, 76, 71, 238, 131, 50, 230, + 62, 41, 163, 220, 45, 198, 88, 198, 52, 191, 208, 70, 172, 159, 11, 214, 77, 167, 60, 93, + 158, 81, 15, 11, 84, 66, 160, 18, 2, 149, 16, 168, 132, 64, 37, 132, 119, 113, 77, 52, 23, + 102, 166, 177, 18, 102, 123, 79, 145, 46, 166, 121, 183, 16, 70, 30, 34, 131, 54, 150, 227, + 54, 185, 66, 158, 138, 251, 163, 189, 23, 33, 137, 138, 47, 220, 64, 215, 112, 84, 53, 176, + 241, 29, 220, 222, 255, 255, 112, 2, 56, 28, 25, 117, 6, 172, 90, 143, 233, 2, 106, 0, 5, + 151, 236, 186, 49, 3, 237, 93, 56, 233, 99, 247, 117, 110, 18, 157, 177, 252, 115, 178, 248, + 187, 243, 94, 164, 215, 252, 203, 134, 123, 252, 173, 117, 97, 145, 55, 48, 44, 238, 80, 66, + 133, 86, 87, 21, 94, 20, 180, 151, 40, 40, 38, 180, 162, 243, 232, 166, 122, 147, 77, 150, + 36, 185, 194, 225, 198, 191, 37, 109, 14, 155, 92, 215, 189, 132, 125, 157, 240, 33, 89, 64, + 235, 215, 191, 49, 147, 70, 216, 146, 150, 235, 73, 90, 47, 34, 238, 74, 16, 20, 50, 83, + 165, 205, 148, 154, 153, 82, 51, 83, 106, 102, 74, 205, 252, 95, 202, 171, 53, 182, 169, + 243, 12, 159, 239, 156, 227, 99, 251, 28, 95, 206, 241, 185, 250, 216, 199, 247, 107, 156, + 196, 137, 157, 197, 132, 132, 196, 129, 116, 220, 66, 32, 14, 37, 163, 173, 7, 93, 52, 113, + 169, 74, 161, 148, 2, 210, 198, 208, 182, 118, 63, 232, 86, 81, 162, 174, 116, 215, 254, 24, + 218, 232, 214, 22, 194, 37, 148, 93, 152, 68, 215, 105, 210, 166, 78, 218, 84, 109, 82, 17, + 210, 42, 141, 63, 72, 235, 42, 117, 93, 131, 157, 189, 223, 241, 177, 227, 132, 254, 232, + 156, 200, 231, 203, 177, 29, 249, 121, 222, 247, 125, 222, 231, 193, 205, 234, 146, 211, + 149, 40, 203, 7, 42, 252, 146, 207, 27, 105, 174, 31, 232, 35, 120, 110, 48, 158, 74, 165, + 209, 167, 52, 146, 101, 239, 100, 137, 177, 35, 164, 40, 212, 199, 118, 41, 22, 136, 119, + 42, 246, 122, 98, 101, 55, 161, 63, 48, 188, 26, 213, 245, 136, 104, 119, 251, 234, 83, 232, + 79, 130, 61, 136, 165, 156, 225, 89, 242, 91, 181, 227, 45, 81, 91, 234, 170, 223, 146, 35, + 78, 151, 157, 182, 193, 13, 183, 174, 214, 22, 107, 47, 235, 162, 181, 181, 54, 3, 122, 157, + 216, 112, 141, 144, 27, 96, 101, 11, 172, 108, 129, 149, 45, 176, 178, 5, 86, 6, 176, 151, + 8, 167, 183, 34, 207, 163, 156, 181, 150, 80, 254, 143, 205, 186, 181, 237, 161, 214, 136, + 96, 121, 222, 12, 187, 197, 89, 187, 169, 102, 91, 32, 222, 193, 102, 116, 179, 20, 16, 157, + 176, 101, 94, 107, 126, 213, 133, 87, 156, 66, 208, 234, 124, 38, 7, 155, 101, 136, 248, + 121, 153, 223, 61, 124, 112, 152, 116, 247, 244, 168, 249, 60, 219, 173, 105, 250, 252, 103, + 180, 5, 184, 48, 161, 68, 175, 203, 197, 98, 29, 97, 177, 142, 176, 88, 71, 88, 172, 35, 44, + 174, 52, 139, 219, 18, 28, 106, 217, 143, 123, 52, 209, 63, 201, 105, 170, 59, 175, 245, + 118, 51, 225, 204, 100, 248, 193, 166, 76, 140, 248, 192, 174, 23, 1, 104, 211, 103, 130, + 103, 231, 91, 39, 97, 96, 77, 190, 88, 196, 46, 190, 109, 170, 226, 8, 59, 119, 240, 240, + 40, 190, 108, 91, 153, 38, 30, 21, 113, 189, 77, 126, 152, 156, 67, 10, 251, 213, 168, 232, + 32, 235, 69, 138, 147, 13, 73, 14, 73, 28, 89, 95, 143, 64, 51, 252, 26, 20, 185, 51, 176, + 55, 210, 147, 208, 156, 232, 168, 13, 61, 203, 233, 225, 148, 255, 113, 111, 64, 116, 45, + 13, 231, 158, 133, 89, 59, 107, 167, 104, 48, 101, 16, 147, 206, 182, 238, 159, 235, 72, + 184, 244, 76, 224, 222, 52, 117, 46, 212, 225, 231, 156, 162, 33, 91, 154, 124, 194, 38, 16, + 107, 136, 103, 230, 210, 94, 175, 100, 145, 105, 94, 189, 214, 213, 109, 94, 255, 133, 201, + 148, 44, 50, 37, 147, 204, 16, 219, 221, 93, 192, 100, 22, 52, 47, 126, 130, 55, 22, 120, + 23, 62, 193, 91, 10, 248, 45, 60, 17, 90, 85, 97, 187, 189, 105, 218, 143, 55, 58, 238, 16, + 147, 62, 76, 222, 125, 220, 229, 139, 86, 203, 52, 152, 130, 217, 136, 43, 138, 252, 41, + 124, 133, 40, 181, 152, 106, 235, 42, 250, 132, 91, 214, 221, 37, 61, 29, 143, 203, 245, + 189, 145, 209, 32, 73, 146, 14, 49, 172, 105, 97, 159, 163, 83, 175, 24, 233, 176, 33, 160, + 213, 70, 127, 161, 87, 67, 96, 104, 196, 176, 95, 137, 248, 28, 235, 37, 200, 133, 156, 81, + 72, 147, 183, 7, 190, 58, 184, 225, 197, 77, 247, 62, 108, 77, 203, 249, 76, 140, 85, 179, + 225, 218, 239, 251, 102, 118, 87, 243, 91, 95, 221, 74, 254, 26, 82, 19, 120, 34, 16, 10, + 240, 174, 51, 139, 119, 233, 59, 182, 40, 72, 86, 154, 248, 74, 89, 151, 48, 7, 18, 110, 40, + 9, 27, 87, 9, 27, 87, 73, 107, 208, 84, 44, 59, 35, 68, 15, 113, 18, 114, 85, 200, 34, 55, + 100, 117, 106, 200, 178, 4, 33, 203, 18, 132, 44, 114, 67, 215, 193, 220, 179, 132, 31, 12, + 128, 119, 42, 142, 39, 203, 182, 99, 185, 129, 173, 174, 80, 198, 230, 70, 111, 248, 215, + 54, 55, 79, 223, 217, 116, 230, 214, 236, 11, 127, 61, 53, 182, 105, 246, 214, 236, 243, + 127, 249, 246, 3, 151, 211, 15, 191, 116, 240, 224, 75, 187, 178, 169, 135, 190, 251, 228, + 161, 151, 191, 152, 33, 95, 252, 193, 189, 11, 187, 166, 207, 125, 244, 227, 179, 159, 188, + 190, 107, 199, 79, 62, 252, 217, 129, 95, 157, 154, 216, 254, 220, 245, 61, 79, 222, 56, + 181, 101, 251, 243, 191, 196, 94, 29, 148, 241, 109, 152, 191, 32, 145, 37, 142, 93, 72, 48, + 22, 16, 198, 2, 194, 88, 35, 199, 88, 35, 199, 88, 64, 24, 220, 2, 170, 96, 96, 122, 12, 76, + 143, 193, 187, 220, 104, 220, 192, 105, 208, 0, 223, 115, 145, 16, 146, 224, 122, 230, 24, + 198, 5, 48, 185, 57, 121, 210, 213, 102, 250, 26, 13, 194, 47, 247, 125, 241, 149, 102, 143, + 110, 179, 236, 212, 219, 229, 163, 191, 56, 118, 198, 41, 70, 253, 88, 85, 58, 116, 36, 119, + 108, 217, 247, 248, 120, 246, 242, 224, 116, 181, 243, 71, 223, 155, 216, 243, 249, 4, 117, + 230, 209, 239, 31, 24, 170, 119, 183, 230, 2, 74, 109, 87, 71, 30, 57, 62, 189, 117, 127, + 159, 167, 246, 223, 204, 250, 25, 162, 129, 152, 230, 0, 113, 63, 49, 70, 156, 46, 135, 248, + 110, 161, 228, 128, 111, 93, 194, 40, 74, 38, 138, 18, 70, 85, 194, 85, 46, 65, 149, 175, + 102, 203, 240, 103, 118, 68, 192, 84, 192, 73, 176, 168, 17, 44, 106, 4, 139, 26, 193, 162, + 70, 0, 106, 46, 6, 187, 121, 240, 249, 87, 14, 150, 81, 185, 172, 174, 1, 6, 46, 71, 39, 85, + 75, 100, 76, 119, 143, 67, 237, 125, 153, 118, 192, 154, 18, 60, 36, 84, 55, 117, 31, 37, + 138, 26, 162, 172, 104, 171, 138, 138, 130, 250, 82, 233, 84, 170, 25, 106, 56, 70, 74, 132, + 244, 168, 196, 209, 71, 229, 174, 225, 237, 131, 135, 155, 100, 65, 200, 17, 123, 71, 245, + 205, 135, 39, 210, 241, 181, 143, 12, 68, 250, 186, 50, 210, 83, 30, 71, 189, 54, 182, 205, + 63, 82, 60, 253, 211, 177, 153, 181, 97, 16, 25, 88, 150, 78, 24, 241, 222, 190, 233, 145, + 120, 237, 111, 45, 18, 193, 50, 219, 40, 247, 170, 29, 79, 172, 27, 221, 179, 117, 181, 228, + 201, 13, 77, 244, 214, 255, 145, 48, 168, 103, 198, 247, 169, 118, 166, 62, 30, 29, 220, 6, + 106, 179, 126, 241, 46, 53, 3, 115, 179, 145, 248, 231, 53, 98, 116, 241, 206, 37, 47, 143, + 198, 71, 45, 138, 70, 45, 234, 70, 45, 173, 25, 181, 168, 26, 157, 39, 59, 203, 185, 66, 89, + 148, 208, 120, 161, 12, 142, 33, 81, 72, 20, 92, 1, 13, 127, 54, 128, 5, 60, 192, 243, 248, + 9, 62, 18, 192, 229, 8, 188, 73, 246, 98, 21, 159, 11, 152, 134, 227, 198, 156, 223, 186, + 74, 141, 235, 21, 47, 54, 135, 174, 238, 235, 40, 77, 148, 192, 102, 167, 202, 156, 16, 41, + 161, 82, 153, 115, 161, 113, 168, 207, 141, 50, 139, 79, 37, 161, 36, 40, 67, 144, 73, 46, + 143, 6, 108, 217, 41, 101, 30, 101, 173, 57, 132, 18, 220, 21, 112, 226, 202, 229, 170, 252, + 93, 30, 183, 234, 146, 91, 244, 53, 94, 88, 49, 160, 244, 50, 235, 210, 215, 178, 50, 140, + 188, 220, 180, 51, 212, 204, 186, 163, 175, 84, 71, 159, 152, 30, 84, 57, 176, 37, 14, 79, + 113, 219, 161, 77, 171, 170, 235, 18, 133, 202, 190, 3, 123, 43, 197, 193, 125, 167, 183, + 231, 166, 183, 12, 137, 12, 77, 82, 12, 103, 231, 242, 99, 213, 213, 253, 219, 250, 244, + 194, 212, 254, 3, 251, 167, 138, 232, 177, 135, 191, 51, 83, 80, 34, 49, 45, 25, 86, 12, + 159, 61, 150, 137, 135, 74, 219, 138, 165, 137, 193, 222, 226, 240, 246, 67, 91, 39, 191, + 182, 163, 203, 235, 15, 139, 156, 160, 137, 190, 160, 232, 12, 198, 13, 163, 103, 109, 178, + 127, 98, 168, 80, 92, 51, 117, 8, 106, 228, 133, 89, 127, 23, 58, 63, 70, 124, 249, 170, 86, + 198, 41, 71, 192, 172, 93, 194, 54, 238, 51, 15, 62, 94, 164, 194, 226, 141, 203, 184, 243, + 25, 31, 14, 116, 134, 53, 219, 5, 176, 157, 31, 152, 228, 188, 149, 227, 111, 230, 90, 113, + 110, 201, 88, 55, 229, 204, 180, 10, 239, 154, 49, 116, 182, 233, 122, 224, 100, 197, 84, + 234, 155, 102, 72, 53, 83, 220, 194, 15, 91, 141, 248, 37, 135, 16, 20, 69, 195, 231, 176, + 18, 220, 121, 80, 234, 227, 224, 106, 114, 196, 217, 178, 177, 187, 11, 69, 240, 212, 70, + 240, 20, 71, 112, 235, 68, 240, 238, 143, 224, 174, 137, 224, 12, 33, 180, 103, 8, 232, 52, + 66, 177, 0, 43, 22, 96, 197, 2, 172, 88, 128, 21, 11, 176, 242, 38, 201, 99, 127, 141, 147, + 6, 139, 91, 200, 9, 255, 130, 77, 85, 248, 74, 96, 169, 111, 204, 96, 97, 41, 120, 110, 169, + 69, 170, 232, 126, 3, 40, 173, 52, 185, 244, 241, 7, 78, 206, 31, 121, 236, 141, 19, 99, + 141, 32, 43, 58, 58, 167, 142, 108, 220, 124, 100, 50, 103, 82, 19, 5, 143, 123, 235, 233, + 107, 39, 215, 14, 31, 191, 114, 148, 138, 55, 233, 184, 247, 239, 135, 158, 221, 217, 213, + 249, 133, 175, 79, 83, 106, 187, 103, 143, 129, 186, 237, 5, 86, 18, 196, 129, 178, 145, + 192, 194, 150, 73, 32, 29, 95, 83, 58, 202, 168, 40, 229, 70, 157, 126, 212, 169, 33, 255, + 188, 53, 164, 230, 1, 203, 158, 214, 188, 131, 15, 101, 31, 190, 229, 215, 252, 90, 42, 25, + 174, 104, 54, 95, 35, 89, 248, 6, 70, 4, 31, 106, 12, 2, 70, 72, 84, 171, 168, 90, 173, 230, + 170, 185, 164, 105, 131, 104, 188, 220, 251, 251, 219, 204, 79, 65, 81, 24, 59, 121, 149, + 246, 248, 211, 134, 18, 213, 4, 151, 157, 170, 239, 116, 32, 95, 38, 22, 140, 250, 156, 52, + 58, 140, 208, 62, 202, 1, 210, 21, 78, 184, 41, 71, 136, 243, 56, 40, 4, 14, 150, 115, 208, + 23, 149, 128, 135, 166, 28, 110, 118, 225, 55, 244, 8, 190, 111, 243, 4, 20, 140, 113, 13, + 120, 198, 219, 128, 113, 136, 216, 51, 151, 26, 66, 133, 249, 197, 143, 203, 235, 240, 96, + 39, 161, 5, 29, 248, 144, 201, 163, 36, 111, 222, 73, 162, 152, 134, 15, 217, 24, 210, 34, + 248, 208, 213, 139, 186, 122, 80, 87, 2, 117, 197, 81, 169, 210, 81, 137, 247, 112, 84, 123, + 80, 4, 7, 51, 2, 149, 131, 7, 202, 85, 155, 63, 201, 150, 199, 163, 154, 167, 149, 48, 151, + 3, 182, 125, 131, 230, 131, 217, 80, 56, 23, 244, 208, 245, 15, 200, 79, 40, 143, 158, 141, + 68, 59, 131, 94, 170, 126, 158, 65, 66, 42, 18, 78, 136, 118, 18, 197, 17, 146, 40, 167, + 148, 12, 5, 163, 146, 147, 66, 89, 18, 25, 20, 35, 198, 141, 80, 156, 71, 182, 148, 71, 192, + 190, 68, 240, 80, 127, 190, 151, 111, 158, 233, 87, 85, 29, 179, 226, 225, 22, 110, 210, + 171, 57, 47, 142, 56, 94, 110, 225, 119, 244, 32, 11, 103, 155, 71, 87, 49, 67, 61, 48, 233, + 31, 1, 67, 121, 162, 167, 108, 100, 243, 40, 219, 141, 82, 26, 74, 169, 40, 173, 160, 12, + 129, 178, 149, 56, 39, 24, 21, 161, 45, 194, 192, 180, 86, 205, 71, 18, 190, 62, 211, 128, + 104, 58, 91, 192, 89, 66, 109, 104, 91, 16, 17, 245, 190, 219, 230, 203, 198, 34, 9, 153, + 163, 235, 183, 235, 239, 217, 92, 114, 34, 20, 77, 121, 109, 110, 244, 104, 253, 117, 151, + 157, 7, 129, 74, 41, 44, 131, 20, 36, 217, 88, 49, 102, 132, 211, 2, 237, 170, 191, 49, 172, + 232, 94, 27, 132, 57, 39, 73, 213, 106, 96, 187, 40, 155, 87, 87, 200, 41, 114, 68, 9, 120, + 105, 202, 14, 162, 16, 68, 239, 59, 220, 118, 179, 222, 181, 183, 48, 158, 144, 233, 82, 36, + 162, 131, 216, 249, 255, 37, 81, 23, 12, 174, 138, 182, 184, 240, 224, 66, 67, 111, 113, 37, + 43, 1, 198, 87, 97, 172, 94, 70, 237, 122, 190, 36, 84, 75, 112, 97, 203, 170, 197, 254, + 254, 146, 216, 234, 228, 141, 141, 100, 35, 59, 234, 47, 112, 54, 111, 58, 26, 74, 42, 156, + 109, 206, 95, 208, 73, 181, 215, 127, 137, 226, 196, 152, 158, 200, 242, 54, 14, 253, 167, + 222, 26, 86, 244, 30, 249, 119, 92, 54, 218, 238, 102, 235, 207, 125, 238, 169, 193, 129, + 67, 37, 244, 52, 235, 177, 227, 130, 41, 128, 111, 16, 18, 218, 44, 40, 115, 150, 208, 47, + 196, 132, 121, 148, 154, 11, 76, 186, 210, 243, 40, 125, 193, 134, 147, 87, 1, 126, 219, 50, + 23, 214, 208, 18, 106, 83, 83, 69, 54, 93, 1, 130, 19, 53, 107, 38, 48, 90, 143, 80, 172, + 207, 77, 62, 88, 187, 200, 122, 112, 231, 120, 88, 242, 157, 64, 152, 102, 5, 79, 237, 53, + 242, 152, 224, 219, 32, 6, 124, 142, 72, 60, 233, 86, 252, 97, 153, 58, 247, 63, 186, 171, + 61, 182, 137, 251, 142, 223, 195, 246, 249, 237, 179, 47, 103, 251, 226, 196, 143, 56, 206, + 37, 185, 56, 142, 237, 139, 19, 231, 97, 95, 30, 216, 121, 56, 132, 20, 8, 225, 145, 0, 33, + 97, 218, 38, 74, 210, 194, 160, 144, 141, 242, 40, 29, 162, 147, 168, 186, 78, 138, 214, 63, + 208, 84, 177, 73, 147, 80, 9, 47, 175, 249, 99, 252, 193, 180, 49, 169, 82, 52, 141, 74, + 157, 58, 137, 127, 166, 182, 32, 164, 181, 255, 12, 42, 18, 246, 253, 221, 253, 236, 6, 210, + 74, 241, 157, 239, 28, 59, 254, 126, 242, 249, 126, 30, 70, 167, 207, 133, 66, 115, 32, 40, + 178, 66, 165, 191, 226, 217, 84, 13, 202, 74, 123, 192, 213, 179, 244, 223, 137, 36, 161, + 16, 31, 41, 65, 71, 111, 160, 55, 214, 75, 91, 76, 30, 217, 10, 72, 203, 72, 103, 101, 36, + 177, 50, 139, 116, 67, 46, 146, 255, 83, 236, 132, 40, 58, 8, 210, 74, 32, 37, 38, 58, 176, + 227, 119, 224, 182, 209, 129, 255, 57, 29, 37, 173, 233, 40, 82, 70, 165, 194, 233, 249, 11, + 33, 179, 50, 213, 121, 71, 38, 9, 153, 148, 229, 230, 158, 198, 34, 233, 83, 28, 43, 53, + 100, 77, 141, 174, 250, 97, 243, 80, 247, 231, 214, 17, 29, 17, 67, 97, 89, 205, 79, 78, + 116, 156, 159, 154, 44, 69, 231, 187, 210, 212, 100, 58, 166, 101, 202, 4, 4, 169, 41, 232, + 104, 136, 200, 208, 38, 90, 53, 66, 171, 96, 37, 91, 113, 142, 198, 119, 116, 170, 6, 51, + 154, 73, 187, 147, 137, 84, 27, 157, 101, 171, 124, 149, 1, 123, 231, 187, 99, 249, 215, + 199, 162, 153, 35, 127, 248, 241, 130, 59, 190, 57, 221, 189, 127, 48, 110, 53, 66, 85, 96, + 124, 189, 227, 7, 229, 253, 191, 220, 86, 247, 225, 175, 250, 103, 122, 3, 59, 183, 244, 28, + 238, 246, 90, 173, 144, 117, 173, 187, 178, 185, 72, 238, 96, 79, 97, 110, 40, 146, 147, + 183, 180, 250, 170, 195, 213, 70, 86, 112, 8, 213, 149, 225, 106, 174, 105, 251, 47, 182, + 221, 245, 68, 179, 13, 185, 173, 189, 253, 128, 238, 34, 160, 123, 95, 63, 15, 172, 134, + 142, 118, 19, 76, 196, 28, 74, 97, 18, 167, 48, 169, 83, 24, 47, 116, 173, 226, 149, 42, + 146, 79, 20, 31, 47, 161, 34, 34, 5, 225, 55, 36, 132, 191, 132, 188, 79, 66, 136, 75, 69, + 202, 172, 152, 8, 222, 156, 106, 13, 233, 244, 45, 69, 82, 127, 171, 110, 200, 151, 99, 11, + 105, 120, 122, 77, 63, 162, 186, 21, 64, 232, 73, 151, 123, 218, 119, 152, 149, 253, 74, + 228, 55, 26, 151, 38, 114, 165, 26, 194, 56, 221, 110, 53, 152, 223, 79, 30, 184, 52, 41, + 13, 230, 114, 162, 209, 229, 227, 129, 67, 6, 134, 11, 122, 5, 104, 97, 245, 195, 3, 3, 245, + 211, 23, 119, 212, 95, 229, 229, 113, 37, 152, 81, 54, 137, 253, 11, 125, 153, 137, 54, 129, + 252, 226, 232, 242, 185, 156, 179, 174, 163, 225, 85, 88, 17, 88, 11, 171, 81, 223, 174, 38, + 80, 56, 172, 254, 167, 161, 61, 204, 110, 62, 251, 209, 209, 77, 103, 102, 186, 93, 141, + 189, 137, 181, 197, 173, 59, 186, 14, 156, 132, 61, 217, 5, 136, 5, 233, 123, 68, 43, 113, + 225, 90, 149, 154, 252, 52, 33, 120, 128, 5, 224, 203, 27, 104, 241, 69, 108, 237, 34, 86, + 8, 17, 183, 48, 17, 131, 9, 231, 135, 232, 13, 98, 145, 178, 40, 182, 152, 157, 180, 11, 95, + 4, 20, 179, 109, 32, 80, 91, 36, 169, 27, 220, 16, 253, 40, 142, 114, 145, 201, 54, 16, 111, + 42, 146, 134, 107, 38, 128, 109, 245, 159, 210, 99, 245, 64, 198, 112, 71, 187, 171, 149, + 23, 88, 75, 195, 186, 162, 6, 185, 207, 160, 197, 62, 67, 169, 170, 33, 220, 232, 32, 165, + 103, 132, 174, 225, 137, 216, 254, 223, 204, 182, 246, 204, 47, 238, 148, 198, 250, 91, 189, + 38, 3, 229, 178, 57, 196, 174, 237, 29, 199, 78, 133, 148, 201, 174, 244, 120, 86, 178, 50, + 102, 134, 254, 157, 83, 112, 218, 132, 72, 181, 75, 57, 121, 253, 232, 91, 127, 62, 209, + 201, 86, 214, 120, 237, 156, 215, 37, 6, 66, 245, 161, 219, 87, 119, 156, 157, 144, 106, + 165, 176, 145, 171, 70, 123, 186, 15, 112, 249, 64, 127, 136, 168, 35, 210, 196, 69, 37, + 144, 237, 36, 45, 190, 52, 218, 206, 52, 74, 65, 105, 148, 162, 211, 136, 29, 105, 68, 150, + 244, 50, 249, 148, 32, 136, 152, 134, 90, 12, 131, 21, 195, 96, 197, 240, 198, 198, 48, 88, + 49, 68, 40, 51, 23, 202, 89, 210, 162, 79, 103, 135, 181, 212, 47, 121, 135, 96, 213, 117, + 215, 237, 35, 250, 2, 10, 126, 42, 157, 178, 229, 10, 139, 107, 13, 226, 83, 169, 205, 188, + 176, 130, 80, 99, 202, 172, 162, 161, 191, 172, 43, 181, 109, 244, 7, 140, 179, 170, 130, 7, + 37, 202, 47, 238, 62, 240, 206, 142, 250, 196, 244, 187, 123, 71, 207, 42, 76, 69, 0, 113, + 202, 116, 165, 239, 231, 253, 89, 96, 16, 48, 170, 39, 212, 173, 228, 68, 161, 68, 160, 99, + 35, 227, 35, 103, 175, 77, 31, 89, 62, 151, 223, 212, 71, 89, 24, 27, 146, 94, 27, 179, 186, + 9, 184, 51, 189, 160, 244, 159, 153, 5, 46, 245, 197, 17, 90, 147, 128, 214, 34, 168, 154, + 68, 200, 196, 85, 165, 49, 150, 202, 166, 14, 167, 104, 14, 109, 19, 23, 4, 8, 56, 46, 212, + 132, 58, 71, 19, 66, 171, 9, 193, 216, 164, 234, 27, 112, 225, 233, 205, 126, 233, 67, 137, + 146, 0, 164, 155, 104, 219, 100, 29, 38, 159, 14, 115, 76, 189, 182, 168, 103, 77, 224, 116, + 8, 191, 80, 168, 233, 175, 111, 234, 46, 233, 168, 59, 58, 114, 69, 71, 234, 116, 85, 177, + 207, 235, 134, 188, 15, 247, 217, 231, 236, 148, 221, 244, 176, 74, 37, 216, 36, 214, 182, + 249, 215, 74, 162, 150, 248, 183, 164, 145, 13, 110, 227, 64, 105, 8, 135, 214, 209, 138, + 127, 145, 124, 20, 47, 166, 84, 64, 25, 122, 81, 20, 86, 151, 252, 185, 185, 49, 101, 102, + 48, 102, 101, 44, 6, 154, 162, 25, 75, 106, 124, 94, 57, 252, 251, 215, 58, 186, 230, 47, + 31, 248, 201, 251, 251, 162, 87, 232, 55, 142, 117, 239, 201, 212, 80, 20, 37, 134, 134, + 143, 143, 55, 243, 149, 60, 99, 23, 92, 54, 206, 97, 181, 8, 94, 46, 115, 162, 120, 226, + 200, 159, 78, 111, 234, 127, 253, 183, 19, 220, 153, 95, 55, 23, 102, 219, 144, 31, 71, 158, + 127, 75, 157, 215, 31, 135, 4, 54, 179, 228, 102, 209, 2, 170, 139, 231, 195, 170, 229, 43, + 169, 149, 15, 203, 153, 15, 147, 9, 34, 243, 211, 165, 150, 198, 72, 241, 249, 138, 226, 98, + 161, 172, 69, 204, 143, 83, 249, 202, 186, 199, 45, 3, 193, 2, 59, 128, 194, 8, 50, 59, 176, + 229, 187, 201, 175, 181, 29, 75, 222, 45, 87, 45, 173, 74, 241, 218, 220, 6, 232, 189, 101, + 145, 2, 153, 47, 169, 187, 138, 131, 142, 58, 15, 25, 210, 192, 240, 254, 6, 95, 68, 14, + 218, 239, 65, 218, 208, 187, 28, 247, 140, 32, 77, 222, 32, 103, 60, 197, 178, 72, 106, 78, + 133, 7, 14, 13, 133, 123, 107, 173, 144, 45, 29, 156, 199, 174, 55, 89, 76, 222, 228, 88, + 199, 52, 227, 172, 228, 106, 131, 207, 30, 161, 24, 170, 131, 3, 205, 7, 107, 185, 74, 39, + 51, 57, 245, 246, 120, 131, 205, 97, 229, 124, 96, 216, 68, 235, 218, 123, 244, 5, 250, 111, + 68, 134, 216, 76, 236, 37, 86, 20, 222, 21, 205, 163, 45, 203, 27, 97, 228, 124, 144, 229, + 200, 66, 62, 153, 133, 116, 138, 32, 200, 226, 253, 130, 243, 131, 91, 232, 165, 44, 51, 10, + 79, 21, 155, 195, 69, 22, 70, 125, 58, 71, 11, 157, 100, 24, 196, 30, 86, 197, 235, 142, 98, + 131, 39, 209, 36, 227, 243, 49, 201, 168, 14, 97, 172, 200, 8, 228, 9, 244, 39, 38, 130, 44, + 188, 109, 162, 49, 162, 88, 224, 28, 113, 180, 48, 116, 251, 208, 191, 172, 91, 191, 228, + 249, 125, 237, 244, 87, 93, 3, 141, 193, 222, 207, 218, 135, 118, 127, 22, 28, 37, 52, 203, + 204, 170, 142, 249, 248, 83, 77, 250, 165, 228, 39, 8, 92, 15, 4, 121, 20, 229, 157, 112, + 147, 253, 68, 130, 31, 169, 116, 64, 168, 3, 198, 110, 183, 102, 5, 117, 162, 1, 244, 204, + 237, 241, 248, 233, 178, 55, 160, 24, 2, 246, 42, 167, 212, 163, 182, 217, 16, 65, 72, 185, + 174, 108, 167, 25, 138, 147, 235, 68, 209, 78, 227, 43, 250, 2, 231, 56, 29, 174, 74, 76, + 190, 185, 185, 237, 128, 207, 229, 233, 73, 61, 234, 155, 123, 165, 89, 254, 233, 149, 249, + 67, 139, 211, 77, 108, 40, 30, 140, 199, 18, 145, 64, 173, 188, 231, 116, 161, 33, 31, 32, + 89, 167, 115, 109, 109, 118, 178, 37, 31, 243, 204, 238, 142, 15, 196, 60, 91, 247, 142, + 125, 21, 108, 240, 154, 206, 253, 108, 120, 54, 227, 163, 143, 132, 3, 181, 59, 98, 155, + 143, 111, 109, 170, 118, 187, 154, 253, 225, 102, 202, 76, 133, 186, 119, 118, 102, 230, + 182, 199, 35, 202, 78, 57, 148, 105, 79, 10, 66, 161, 169, 123, 95, 93, 100, 178, 119, 228, + 196, 182, 168, 201, 24, 90, 251, 122, 207, 143, 130, 237, 131, 245, 59, 15, 6, 218, 6, 86, + 167, 58, 178, 148, 81, 136, 54, 212, 243, 61, 125, 213, 45, 25, 196, 239, 69, 200, 155, 151, + 193, 153, 19, 196, 27, 55, 178, 50, 217, 200, 97, 254, 114, 37, 98, 115, 152, 216, 28, 102, + 60, 135, 108, 217, 227, 183, 32, 185, 181, 32, 197, 176, 32, 237, 176, 168, 178, 97, 65, + 175, 153, 9, 5, 101, 83, 127, 163, 192, 130, 163, 220, 142, 14, 213, 230, 132, 130, 42, 159, + 200, 141, 225, 63, 18, 211, 130, 168, 102, 198, 47, 104, 167, 83, 181, 92, 3, 227, 220, 232, + 201, 90, 74, 229, 233, 203, 70, 151, 230, 185, 222, 230, 193, 150, 204, 66, 63, 92, 10, 192, + 115, 166, 100, 197, 249, 75, 131, 187, 78, 22, 66, 66, 137, 207, 148, 99, 100, 170, 191, + 118, 98, 251, 234, 197, 210, 157, 245, 254, 59, 60, 216, 125, 240, 194, 126, 164, 148, 111, + 61, 255, 150, 28, 211, 199, 8, 158, 8, 17, 239, 220, 206, 134, 71, 195, 135, 195, 180, 27, + 103, 57, 55, 198, 64, 189, 230, 212, 179, 74, 94, 55, 102, 186, 27, 131, 230, 94, 166, 230, + 137, 42, 130, 215, 144, 226, 241, 187, 120, 252, 42, 95, 130, 148, 7, 152, 110, 153, 3, 10, + 188, 51, 80, 36, 51, 55, 4, 118, 80, 197, 231, 211, 199, 18, 86, 67, 236, 44, 210, 139, 224, + 96, 44, 56, 100, 187, 136, 140, 192, 66, 50, 243, 50, 0, 92, 83, 103, 135, 132, 30, 101, 8, + 232, 115, 140, 54, 48, 67, 182, 116, 52, 54, 164, 225, 1, 19, 63, 191, 191, 246, 30, 57, 3, + 19, 215, 18, 45, 196, 249, 235, 163, 9, 50, 130, 195, 2, 156, 191, 65, 223, 59, 82, 18, 246, + 8, 26, 211, 130, 110, 80, 115, 75, 146, 149, 192, 191, 183, 174, 134, 104, 115, 149, 251, 8, + 104, 159, 98, 22, 4, 34, 209, 140, 102, 108, 134, 25, 175, 215, 7, 6, 43, 192, 73, 175, 233, + 213, 45, 133, 73, 157, 201, 100, 41, 207, 106, 211, 194, 172, 122, 109, 86, 29, 94, 49, 180, + 70, 63, 48, 246, 152, 95, 153, 201, 7, 163, 94, 147, 142, 164, 25, 19, 99, 8, 123, 66, 49, + 191, 189, 36, 122, 8, 131, 70, 169, 179, 179, 209, 49, 115, 114, 155, 100, 52, 219, 156, 46, + 155, 171, 146, 101, 244, 21, 209, 129, 65, 250, 143, 27, 225, 208, 246, 96, 1, 246, 64, 38, + 222, 87, 172, 217, 20, 217, 16, 39, 227, 138, 139, 28, 129, 120, 180, 162, 14, 23, 199, 246, + 23, 71, 211, 91, 213, 179, 106, 127, 241, 101, 74, 36, 106, 160, 126, 105, 24, 88, 241, 154, + 88, 49, 56, 86, 140, 137, 21, 173, 70, 165, 59, 26, 37, 16, 36, 218, 138, 184, 107, 44, 250, + 250, 193, 170, 156, 179, 180, 30, 80, 79, 201, 24, 132, 45, 72, 247, 170, 39, 36, 30, 148, + 88, 80, 166, 129, 72, 126, 207, 114, 144, 90, 98, 5, 171, 96, 72, 210, 237, 166, 23, 140, + 208, 205, 124, 97, 175, 195, 176, 118, 238, 101, 126, 144, 219, 140, 46, 1, 122, 93, 13, + 111, 178, 57, 214, 62, 38, 95, 181, 89, 42, 209, 66, 64, 29, 53, 145, 223, 172, 217, 54, + 174, 201, 179, 127, 64, 131, 179, 153, 104, 48, 85, 147, 213, 203, 174, 125, 188, 22, 113, + 242, 88, 59, 200, 12, 96, 198, 19, 202, 237, 172, 103, 212, 115, 216, 67, 255, 96, 69, 253, + 142, 35, 228, 147, 27, 102, 54, 167, 78, 140, 9, 240, 189, 44, 223, 200, 108, 97, 227, 87, + 195, 223, 66, 191, 2, 25, 103, 11, 241, 80, 241, 185, 88, 164, 93, 72, 145, 234, 88, 139, + 149, 44, 136, 94, 116, 156, 123, 133, 204, 173, 211, 177, 178, 192, 161, 29, 230, 240, 14, + 115, 152, 213, 170, 190, 249, 253, 110, 120, 234, 247, 39, 204, 72, 230, 204, 72, 230, 204, + 232, 67, 205, 170, 204, 153, 129, 223, 183, 183, 40, 78, 114, 100, 75, 70, 196, 31, 187, 46, + 113, 255, 247, 165, 68, 174, 2, 34, 46, 147, 79, 64, 100, 89, 210, 176, 52, 60, 244, 127, + 198, 171, 54, 182, 141, 179, 142, 223, 115, 119, 246, 189, 248, 98, 223, 249, 124, 118, 108, + 199, 62, 191, 158, 223, 226, 188, 57, 137, 227, 52, 137, 207, 36, 105, 114, 113, 210, 172, + 45, 125, 153, 32, 109, 151, 22, 77, 84, 116, 171, 150, 173, 5, 218, 109, 44, 173, 38, 129, + 132, 128, 169, 2, 1, 149, 248, 4, 5, 137, 173, 116, 43, 237, 186, 13, 177, 15, 147, 248, + 148, 106, 31, 214, 13, 4, 244, 11, 130, 109, 66, 21, 95, 128, 173, 130, 184, 252, 159, 187, + 199, 110, 218, 21, 70, 85, 249, 121, 238, 241, 197, 210, 243, 251, 255, 254, 191, 223, 239, + 15, 225, 219, 109, 118, 53, 22, 166, 182, 151, 199, 172, 242, 98, 120, 75, 253, 177, 133, + 181, 243, 101, 237, 29, 71, 41, 149, 26, 145, 76, 91, 45, 41, 188, 249, 95, 146, 249, 223, + 52, 84, 115, 52, 52, 68, 200, 226, 122, 219, 145, 82, 149, 15, 244, 206, 244, 213, 214, 102, + 113, 247, 132, 146, 42, 23, 236, 157, 238, 171, 61, 217, 81, 86, 183, 191, 39, 20, 140, 201, + 220, 226, 183, 172, 177, 135, 103, 6, 228, 242, 206, 230, 92, 102, 223, 9, 75, 191, 171, + 177, 233, 218, 125, 26, 251, 201, 19, 230, 44, 4, 19, 134, 17, 60, 252, 201, 61, 203, 145, + 254, 70, 126, 112, 166, 168, 130, 248, 46, 182, 61, 8, 42, 56, 68, 157, 51, 125, 78, 5, 241, + 7, 177, 163, 251, 171, 68, 92, 232, 254, 106, 226, 97, 49, 238, 193, 249, 223, 113, 37, 156, + 29, 28, 147, 178, 253, 9, 190, 191, 74, 140, 9, 219, 146, 41, 150, 23, 138, 225, 140, 213, + 134, 30, 167, 134, 142, 51, 17, 107, 106, 163, 253, 127, 216, 147, 246, 105, 246, 212, 1, + 241, 123, 75, 159, 98, 79, 247, 0, 5, 0, 29, 194, 238, 132, 167, 193, 155, 128, 144, 74, + 229, 168, 159, 154, 61, 245, 2, 202, 251, 81, 65, 65, 70, 23, 50, 36, 100, 240, 200, 224, + 80, 145, 65, 5, 26, 197, 201, 144, 19, 39, 128, 197, 137, 108, 197, 73, 106, 143, 19, 192, + 226, 56, 172, 199, 251, 69, 36, 6, 186, 225, 245, 0, 134, 43, 128, 231, 130, 128, 31, 222, + 10, 96, 204, 2, 175, 209, 34, 69, 221, 121, 243, 170, 143, 90, 58, 14, 101, 10, 191, 138, + 208, 203, 190, 133, 52, 76, 142, 151, 92, 75, 148, 195, 212, 21, 2, 89, 123, 84, 196, 90, + 69, 254, 161, 45, 233, 9, 163, 195, 13, 147, 92, 75, 82, 61, 115, 115, 124, 237, 197, 39, + 30, 255, 241, 99, 163, 181, 181, 159, 175, 193, 90, 125, 41, 58, 117, 116, 217, 250, 226, + 76, 50, 90, 63, 186, 60, 127, 116, 38, 129, 254, 252, 216, 181, 231, 155, 159, 121, 230, + 242, 19, 176, 46, 192, 122, 218, 90, 95, 173, 13, 31, 92, 95, 90, 88, 127, 164, 54, 124, 96, + 29, 176, 249, 126, 235, 28, 115, 3, 176, 41, 82, 147, 212, 215, 126, 9, 162, 146, 28, 21, 9, + 75, 68, 194, 18, 177, 173, 62, 34, 185, 189, 104, 135, 24, 173, 132, 47, 92, 194, 23, 46, + 117, 227, 175, 75, 248, 218, 37, 140, 140, 64, 105, 226, 232, 72, 146, 117, 13, 192, 20, + 120, 197, 88, 136, 90, 242, 114, 13, 182, 228, 226, 245, 186, 19, 46, 223, 217, 146, 100, + 236, 49, 176, 125, 231, 220, 3, 56, 226, 244, 93, 27, 5, 78, 9, 58, 57, 241, 70, 229, 240, + 11, 7, 242, 51, 13, 51, 179, 133, 44, 1, 45, 234, 231, 10, 139, 75, 59, 203, 171, 223, 216, + 151, 127, 73, 171, 236, 53, 19, 83, 48, 4, 206, 124, 117, 122, 234, 225, 106, 4, 125, 120, + 226, 141, 51, 115, 114, 106, 56, 221, 154, 106, 107, 33, 251, 33, 112, 134, 97, 128, 61, 95, + 41, 78, 21, 180, 197, 179, 23, 159, 154, 125, 238, 200, 132, 90, 152, 30, 108, 253, 96, 247, + 254, 137, 35, 167, 49, 147, 14, 1, 90, 231, 9, 90, 207, 155, 81, 128, 75, 247, 148, 112, + 195, 148, 68, 27, 6, 12, 128, 45, 114, 165, 215, 209, 109, 120, 171, 226, 208, 166, 66, 232, + 84, 33, 42, 89, 33, 52, 171, 16, 64, 43, 24, 52, 81, 203, 90, 158, 201, 146, 206, 202, 96, + 249, 174, 151, 35, 11, 99, 224, 248, 175, 200, 75, 216, 243, 237, 104, 30, 170, 181, 37, + 159, 36, 156, 123, 48, 27, 81, 188, 204, 86, 190, 132, 58, 163, 30, 99, 24, 91, 137, 83, + 101, 206, 11, 184, 205, 244, 0, 87, 88, 152, 183, 114, 24, 162, 161, 195, 223, 57, 152, 223, + 62, 59, 87, 228, 253, 61, 90, 160, 71, 225, 126, 50, 253, 244, 76, 125, 127, 53, 172, 13, + 239, 109, 36, 39, 1, 186, 214, 229, 54, 82, 104, 163, 80, 75, 251, 150, 206, 92, 90, 125, + 242, 245, 179, 115, 74, 118, 91, 225, 88, 27, 186, 214, 63, 118, 239, 155, 88, 61, 109, 206, + 174, 31, 153, 244, 23, 167, 7, 29, 117, 162, 47, 0, 98, 21, 234, 240, 229, 227, 35, 200, + 240, 17, 82, 249, 200, 213, 125, 109, 114, 249, 8, 235, 124, 152, 92, 126, 202, 84, 177, + 207, 131, 73, 80, 152, 101, 84, 4, 56, 151, 53, 133, 210, 130, 225, 211, 18, 150, 134, 85, + 199, 150, 123, 219, 240, 75, 157, 44, 188, 117, 0, 124, 144, 208, 216, 36, 114, 211, 23, + 104, 183, 192, 243, 161, 88, 70, 11, 15, 140, 140, 167, 239, 151, 153, 108, 99, 188, 22, + 235, 74, 102, 98, 18, 203, 32, 102, 53, 24, 87, 4, 65, 224, 3, 125, 139, 213, 205, 95, 124, + 82, 104, 206, 140, 206, 228, 124, 12, 47, 138, 130, 55, 138, 29, 117, 231, 157, 91, 244, + 117, 184, 177, 69, 93, 55, 165, 254, 102, 189, 185, 220, 124, 182, 121, 177, 233, 106, 144, + 11, 54, 8, 2, 13, 66, 10, 88, 223, 196, 177, 184, 65, 196, 186, 65, 242, 98, 227, 85, 244, + 7, 83, 207, 12, 101, 134, 164, 40, 166, 88, 20, 83, 44, 138, 37, 58, 138, 245, 61, 138, 53, + 39, 250, 26, 250, 39, 22, 25, 83, 196, 177, 72, 50, 237, 168, 4, 143, 6, 252, 94, 93, 186, + 40, 209, 82, 223, 31, 171, 226, 95, 149, 135, 148, 67, 202, 113, 133, 169, 42, 85, 37, 56, + 241, 251, 70, 212, 85, 88, 8, 126, 224, 52, 35, 192, 120, 75, 169, 193, 124, 183, 34, 223, + 146, 109, 73, 42, 17, 227, 44, 249, 241, 241, 221, 44, 141, 238, 201, 151, 14, 153, 70, 134, + 251, 220, 228, 217, 173, 109, 1, 31, 200, 230, 166, 175, 87, 14, 172, 239, 24, 216, 55, 59, + 16, 20, 89, 183, 135, 243, 148, 234, 123, 199, 138, 51, 67, 209, 156, 249, 208, 158, 157, + 102, 174, 176, 235, 212, 174, 204, 252, 120, 65, 227, 24, 72, 71, 162, 91, 72, 141, 90, 253, + 69, 179, 160, 229, 205, 93, 123, 118, 155, 57, 228, 157, 253, 18, 212, 59, 20, 14, 100, 116, + 21, 242, 103, 52, 17, 245, 167, 71, 179, 198, 112, 94, 79, 149, 166, 246, 78, 140, 60, 98, + 245, 74, 126, 77, 150, 124, 65, 89, 9, 203, 92, 48, 28, 84, 211, 3, 61, 185, 145, 124, 34, + 85, 156, 248, 44, 174, 69, 242, 206, 223, 232, 99, 236, 139, 212, 56, 245, 249, 203, 5, 74, + 73, 151, 9, 230, 101, 82, 139, 50, 169, 69, 153, 52, 100, 153, 176, 178, 140, 73, 40, 133, + 186, 202, 183, 210, 243, 177, 174, 91, 161, 249, 65, 156, 190, 57, 71, 182, 55, 48, 237, 42, + 14, 46, 67, 27, 111, 13, 13, 14, 128, 199, 177, 14, 211, 236, 140, 13, 112, 84, 58, 221, + 167, 145, 108, 153, 78, 43, 206, 104, 139, 159, 233, 99, 188, 156, 40, 244, 133, 182, 31, + 49, 99, 207, 248, 252, 46, 190, 139, 127, 186, 29, 212, 222, 231, 37, 129, 245, 251, 222, + 175, 206, 133, 50, 61, 1, 222, 37, 184, 216, 207, 197, 82, 178, 87, 112, 103, 155, 107, 59, + 104, 111, 34, 163, 70, 20, 238, 93, 14, 222, 98, 5, 9, 54, 74, 68, 205, 36, 90, 226, 202, + 65, 65, 20, 92, 222, 110, 124, 239, 115, 224, 120, 231, 153, 55, 32, 19, 188, 96, 234, 144, + 4, 60, 57, 204, 160, 28, 102, 80, 142, 199, 57, 203, 22, 169, 156, 108, 71, 46, 116, 251, + 138, 211, 105, 58, 65, 69, 39, 168, 192, 250, 177, 221, 155, 120, 131, 97, 209, 219, 205, + 170, 19, 142, 234, 120, 86, 17, 212, 178, 149, 243, 184, 194, 22, 4, 51, 215, 43, 222, 37, + 59, 19, 216, 196, 234, 232, 85, 135, 82, 247, 12, 172, 35, 110, 247, 125, 81, 220, 150, 168, + 209, 106, 231, 128, 57, 207, 249, 99, 90, 40, 166, 184, 151, 190, 107, 91, 63, 23, 112, 102, + 148, 80, 255, 252, 192, 212, 169, 89, 46, 160, 67, 231, 250, 133, 78, 34, 56, 185, 103, 199, + 196, 163, 95, 95, 165, 83, 237, 238, 220, 252, 251, 242, 193, 233, 236, 254, 61, 244, 83, + 237, 19, 140, 79, 10, 50, 211, 41, 192, 167, 151, 250, 211, 53, 42, 125, 7, 220, 12, 7, 93, + 157, 199, 159, 89, 29, 197, 157, 77, 28, 5, 201, 61, 53, 178, 6, 238, 198, 95, 123, 245, + 147, 85, 129, 239, 205, 42, 108, 170, 144, 42, 20, 148, 147, 81, 222, 133, 82, 121, 56, 152, + 76, 161, 76, 10, 37, 241, 182, 158, 68, 153, 36, 74, 216, 167, 9, 148, 73, 160, 156, 15, + 157, 72, 162, 36, 204, 72, 166, 160, 104, 243, 201, 4, 116, 45, 60, 125, 96, 10, 64, 197, + 100, 194, 231, 60, 225, 74, 36, 241, 239, 75, 240, 135, 201, 188, 149, 244, 68, 44, 143, 35, + 128, 128, 175, 141, 42, 85, 90, 177, 147, 67, 201, 249, 143, 112, 126, 112, 112, 135, 231, + 82, 9, 55, 46, 135, 28, 123, 200, 161, 45, 22, 161, 134, 170, 170, 227, 171, 204, 41, 68, + 51, 116, 107, 131, 237, 138, 228, 227, 241, 124, 216, 203, 182, 174, 179, 46, 196, 171, 122, + 40, 150, 86, 5, 182, 197, 50, 255, 162, 69, 53, 25, 13, 197, 21, 142, 249, 17, 43, 136, 18, + 247, 239, 159, 121, 188, 60, 195, 242, 94, 145, 217, 39, 249, 5, 6, 102, 66, 26, 62, 132, + 205, 136, 36, 209, 127, 17, 36, 158, 161, 121, 15, 70, 123, 4, 102, 140, 179, 128, 246, 44, + 117, 243, 26, 53, 7, 242, 52, 9, 87, 131, 41, 4, 45, 21, 198, 80, 21, 175, 217, 62, 100, 36, + 145, 145, 64, 134, 142, 140, 56, 50, 98, 40, 215, 131, 242, 44, 42, 48, 104, 124, 27, 218, + 54, 142, 182, 149, 209, 68, 47, 146, 19, 26, 90, 146, 113, 38, 147, 157, 213, 20, 129, 174, + 114, 2, 126, 65, 246, 145, 99, 188, 154, 18, 54, 18, 124, 236, 107, 88, 246, 123, 24, 204, + 186, 188, 44, 63, 46, 63, 43, 179, 178, 233, 15, 206, 203, 21, 43, 107, 141, 127, 187, 23, + 245, 226, 239, 122, 177, 106, 202, 106, 112, 254, 209, 222, 147, 189, 244, 44, 156, 134, 22, + 5, 12, 242, 13, 140, 228, 202, 91, 245, 250, 6, 32, 233, 224, 221, 239, 232, 33, 101, 167, + 180, 78, 94, 115, 128, 118, 119, 112, 102, 114, 28, 211, 134, 220, 48, 30, 0, 249, 150, 173, + 235, 44, 235, 106, 125, 196, 116, 133, 242, 113, 189, 24, 150, 152, 95, 209, 244, 69, 166, + 43, 82, 136, 235, 57, 120, 106, 221, 118, 177, 48, 93, 132, 122, 82, 126, 158, 249, 29, 77, + 255, 134, 22, 252, 64, 123, 221, 207, 211, 239, 209, 232, 93, 90, 80, 147, 145, 238, 24, 46, + 11, 23, 240, 221, 45, 10, 253, 77, 65, 216, 92, 187, 91, 34, 95, 128, 19, 60, 80, 33, 152, + 84, 55, 35, 130, 0, 21, 234, 2, 225, 229, 36, 126, 179, 187, 253, 68, 243, 34, 174, 87, 1, + 186, 163, 9, 245, 234, 167, 158, 51, 149, 196, 32, 234, 199, 146, 209, 135, 197, 98, 91, 31, + 234, 6, 42, 94, 129, 237, 112, 55, 10, 17, 89, 8, 182, 143, 130, 72, 192, 68, 45, 226, 145, + 21, 255, 205, 4, 133, 198, 210, 104, 212, 131, 60, 9, 60, 89, 224, 130, 120, 60, 131, 3, 5, + 43, 237, 81, 98, 150, 210, 153, 30, 106, 117, 197, 143, 96, 76, 115, 80, 69, 24, 113, 66, + 221, 149, 108, 48, 224, 168, 68, 142, 177, 225, 52, 140, 209, 42, 2, 64, 201, 52, 166, 218, + 8, 6, 131, 128, 59, 51, 205, 171, 57, 61, 158, 214, 60, 236, 111, 223, 99, 61, 90, 170, 39, + 150, 85, 144, 128, 186, 91, 31, 241, 72, 205, 37, 98, 233, 128, 200, 110, 188, 205, 138, + 138, 30, 141, 101, 253, 180, 208, 186, 221, 235, 85, 37, 23, 195, 121, 56, 244, 133, 214, + 15, 97, 97, 92, 146, 234, 69, 87, 209, 5, 175, 218, 197, 50, 110, 145, 107, 93, 66, 203, + 176, 48, 172, 39, 224, 107, 29, 176, 149, 3, 18, 224, 105, 192, 38, 67, 237, 186, 70, 69, + 225, 178, 35, 184, 235, 163, 168, 16, 69, 221, 56, 254, 25, 221, 200, 240, 142, 122, 233, + 156, 128, 34, 216, 142, 199, 35, 40, 60, 134, 145, 11, 35, 221, 10, 139, 170, 37, 54, 217, + 101, 170, 73, 6, 214, 58, 180, 109, 201, 105, 88, 220, 184, 73, 198, 185, 107, 85, 53, 12, + 96, 205, 48, 185, 36, 170, 168, 152, 61, 193, 96, 128, 163, 43, 95, 118, 15, 14, 69, 18, 10, + 237, 62, 45, 200, 76, 235, 215, 188, 156, 137, 199, 83, 1, 193, 133, 16, 243, 177, 251, 63, + 148, 87, 91, 112, 19, 215, 25, 62, 103, 175, 90, 237, 106, 111, 146, 118, 181, 146, 172, + 139, 37, 235, 98, 99, 201, 150, 228, 139, 18, 131, 212, 248, 130, 13, 54, 24, 18, 98, 108, + 176, 195, 37, 197, 41, 33, 36, 14, 23, 51, 165, 133, 182, 230, 150, 73, 72, 51, 157, 233, + 37, 36, 109, 167, 37, 19, 250, 210, 7, 8, 38, 102, 104, 27, 152, 201, 52, 73, 91, 147, 161, + 227, 64, 58, 211, 52, 229, 165, 188, 212, 48, 76, 103, 218, 41, 193, 114, 255, 93, 201, 134, + 73, 224, 161, 146, 165, 93, 157, 179, 62, 231, 59, 255, 255, 253, 151, 79, 169, 14, 249, + 163, 10, 83, 154, 148, 21, 90, 112, 137, 56, 79, 169, 118, 114, 163, 219, 35, 210, 164, 77, + 114, 204, 165, 136, 171, 78, 158, 134, 26, 161, 194, 73, 6, 161, 161, 189, 70, 190, 139, + 234, 208, 163, 231, 145, 12, 39, 209, 32, 106, 122, 99, 178, 249, 157, 134, 249, 28, 215, + 193, 17, 92, 141, 2, 130, 229, 29, 163, 91, 138, 91, 194, 5, 128, 207, 102, 224, 15, 250, + 132, 105, 200, 57, 21, 121, 23, 134, 170, 103, 50, 188, 5, 135, 43, 245, 47, 108, 149, 62, + 43, 239, 152, 183, 196, 53, 198, 38, 218, 230, 174, 186, 125, 38, 23, 241, 241, 210, 65, + 217, 73, 113, 14, 142, 160, 120, 69, 96, 205, 177, 210, 30, 252, 182, 205, 193, 49, 93, 78, + 159, 194, 250, 195, 213, 162, 166, 25, 50, 177, 61, 92, 163, 194, 111, 70, 212, 148, 144, + 232, 209, 189, 242, 220, 143, 88, 217, 234, 178, 106, 75, 127, 195, 187, 208, 223, 145, 15, + 217, 207, 240, 186, 31, 201, 51, 211, 86, 29, 38, 88, 182, 28, 117, 45, 206, 133, 152, 195, + 187, 24, 81, 87, 94, 162, 29, 78, 195, 169, 232, 118, 76, 29, 230, 61, 81, 175, 17, 213, + 249, 239, 7, 115, 169, 122, 227, 50, 107, 183, 89, 129, 128, 157, 223, 241, 133, 100, 134, + 145, 67, 102, 175, 223, 93, 250, 28, 31, 39, 127, 8, 170, 49, 141, 194, 167, 163, 174, 11, + 196, 106, 20, 131, 137, 253, 147, 246, 96, 93, 3, 45, 161, 244, 52, 108, 10, 21, 110, 230, + 250, 239, 27, 27, 190, 44, 215, 148, 7, 67, 57, 206, 25, 137, 96, 40, 1, 17, 231, 73, 132, + 130, 9, 131, 99, 28, 186, 114, 140, 118, 168, 134, 106, 65, 155, 16, 244, 168, 225, 1, 104, + 100, 40, 180, 196, 199, 243, 190, 37, 161, 234, 122, 243, 90, 63, 215, 103, 129, 253, 147, + 205, 206, 82, 102, 175, 141, 149, 69, 176, 4, 186, 48, 255, 159, 10, 214, 56, 242, 157, 70, + 174, 41, 98, 255, 187, 246, 64, 196, 232, 165, 165, 110, 84, 152, 46, 76, 155, 13, 75, 230, + 193, 40, 239, 255, 253, 85, 124, 95, 254, 253, 85, 92, 137, 112, 121, 32, 28, 174, 135, 196, + 239, 173, 55, 189, 243, 99, 192, 179, 19, 188, 195, 35, 253, 52, 98, 32, 183, 158, 131, 208, + 103, 56, 18, 226, 29, 160, 212, 93, 50, 93, 197, 88, 189, 18, 48, 92, 195, 59, 211, 203, + 218, 82, 230, 231, 185, 229, 233, 84, 39, 124, 204, 53, 94, 33, 247, 224, 25, 122, 31, 120, + 152, 59, 195, 104, 203, 225, 63, 1, 191, 251, 62, 192, 45, 45, 229, 216, 119, 177, 184, 87, + 240, 68, 13, 211, 163, 101, 79, 11, 78, 67, 85, 117, 158, 162, 186, 14, 250, 66, 10, 195, + 40, 33, 95, 32, 151, 74, 121, 46, 91, 198, 3, 79, 91, 12, 130, 245, 119, 85, 214, 231, 245, + 202, 250, 255, 39, 129, 232, 88, 48, 155, 174, 247, 92, 102, 5, 43, 149, 114, 216, 121, 208, + 27, 82, 25, 70, 181, 24, 116, 140, 28, 39, 83, 214, 14, 45, 200, 113, 150, 169, 214, 50, + 176, 75, 118, 58, 243, 192, 115, 128, 182, 125, 200, 233, 136, 183, 121, 61, 226, 241, 84, + 107, 60, 144, 69, 62, 74, 11, 64, 22, 89, 179, 99, 186, 164, 63, 96, 2, 210, 31, 181, 252, + 64, 5, 133, 55, 144, 5, 206, 76, 47, 28, 187, 52, 251, 144, 9, 19, 109, 29, 57, 78, 92, 89, + 68, 203, 199, 245, 236, 34, 218, 69, 171, 196, 98, 185, 123, 102, 161, 31, 104, 44, 226, + 138, 9, 230, 24, 229, 80, 61, 38, 24, 242, 144, 93, 143, 24, 122, 68, 227, 75, 39, 238, 155, + 0, 248, 148, 53, 99, 162, 167, 227, 65, 64, 227, 153, 182, 241, 38, 181, 193, 138, 10, 88, + 209, 114, 155, 247, 97, 19, 224, 63, 92, 186, 65, 218, 233, 223, 33, 55, 178, 157, 150, 105, + 148, 78, 55, 54, 232, 21, 48, 184, 98, 208, 95, 81, 14, 87, 149, 219, 8, 171, 20, 67, 12, + 83, 14, 103, 192, 13, 13, 54, 69, 223, 118, 72, 54, 138, 117, 56, 29, 204, 126, 135, 196, + 193, 249, 93, 14, 88, 175, 19, 159, 37, 82, 196, 82, 36, 33, 241, 44, 98, 249, 89, 10, 165, + 161, 207, 183, 72, 193, 88, 25, 14, 184, 106, 229, 178, 148, 170, 148, 70, 84, 120, 225, 95, + 66, 198, 162, 241, 127, 227, 129, 96, 44, 22, 96, 20, 47, 194, 243, 255, 198, 179, 20, 65, + 28, 128, 85, 148, 51, 176, 202, 121, 236, 71, 15, 91, 136, 34, 156, 206, 187, 5, 167, 170, + 58, 201, 75, 156, 196, 209, 68, 115, 44, 18, 137, 213, 68, 56, 197, 202, 112, 135, 75, 167, + 240, 191, 232, 151, 81, 4, 85, 23, 221, 164, 89, 125, 73, 83, 242, 145, 86, 130, 38, 221, + 65, 254, 48, 42, 164, 33, 174, 173, 102, 4, 51, 160, 49, 84, 29, 10, 97, 185, 88, 166, 72, + 139, 67, 101, 59, 224, 91, 79, 13, 63, 181, 129, 198, 98, 149, 161, 122, 157, 2, 217, 188, + 182, 213, 31, 204, 175, 205, 98, 78, 246, 107, 186, 95, 38, 232, 45, 31, 149, 6, 175, 94, + 43, 13, 253, 81, 80, 120, 154, 96, 108, 244, 182, 43, 159, 126, 54, 54, 246, 215, 191, 252, + 121, 148, 98, 24, 168, 132, 178, 137, 232, 155, 128, 232, 6, 32, 10, 163, 236, 121, 164, + 150, 59, 98, 181, 162, 168, 204, 235, 164, 137, 76, 69, 102, 184, 155, 29, 128, 215, 94, 70, + 88, 151, 41, 67, 52, 233, 178, 80, 194, 155, 213, 166, 28, 17, 143, 85, 154, 34, 77, 197, + 55, 252, 173, 107, 154, 73, 193, 233, 85, 189, 85, 14, 76, 111, 28, 25, 25, 161, 8, 217, + 175, 187, 253, 138, 141, 24, 221, 67, 24, 99, 159, 125, 122, 101, 27, 109, 99, 8, 26, 74, + 198, 31, 240, 169, 107, 87, 241, 169, 143, 56, 217, 14, 232, 24, 106, 186, 180, 26, 240, + 189, 87, 186, 72, 248, 232, 113, 20, 68, 226, 164, 241, 161, 228, 253, 192, 180, 124, 122, + 118, 193, 240, 11, 74, 35, 188, 40, 200, 44, 190, 250, 36, 113, 30, 9, 154, 202, 243, 170, + 38, 96, 196, 128, 146, 144, 196, 147, 39, 205, 107, 233, 110, 216, 7, 245, 198, 197, 212, + 153, 85, 137, 145, 117, 37, 228, 191, 211, 198, 72, 186, 105, 141, 161, 210, 69, 124, 174, + 178, 155, 252, 161, 33, 125, 192, 84, 118, 51, 227, 34, 178, 40, 4, 239, 73, 66, 115, 91, + 124, 142, 87, 117, 97, 94, 148, 32, 133, 179, 39, 79, 150, 175, 243, 130, 174, 242, 119, 92, + 62, 144, 184, 97, 69, 151, 24, 250, 125, 127, 72, 209, 101, 134, 85, 124, 78, 115, 167, 159, + 17, 111, 146, 3, 244, 49, 168, 67, 158, 162, 24, 72, 4, 227, 105, 157, 149, 100, 198, 206, + 71, 120, 160, 189, 170, 131, 168, 194, 208, 1, 49, 76, 60, 238, 212, 204, 180, 218, 226, + 100, 153, 88, 60, 22, 107, 105, 137, 155, 182, 110, 214, 117, 50, 102, 38, 90, 150, 108, + 105, 214, 128, 36, 44, 75, 246, 136, 132, 174, 87, 9, 159, 248, 201, 80, 42, 21, 34, 253, + 51, 66, 64, 215, 177, 120, 251, 182, 136, 117, 61, 32, 204, 44, 140, 127, 34, 84, 233, 58, + 33, 222, 38, 79, 49, 145, 120, 66, 229, 222, 40, 221, 145, 100, 224, 33, 243, 6, 167, 38, + 226, 17, 230, 217, 237, 108, 36, 30, 87, 185, 19, 152, 150, 225, 85, 250, 226, 4, 140, 199, + 34, 236, 118, 192, 253, 50, 185, 13, 231, 233, 61, 16, 161, 220, 25, 90, 190, 151, 97, 173, + 20, 71, 86, 242, 5, 139, 171, 89, 201, 163, 170, 134, 200, 234, 118, 119, 88, 247, 132, 221, + 28, 38, 143, 216, 4, 83, 208, 65, 77, 254, 216, 188, 35, 57, 51, 71, 81, 8, 205, 223, 164, + 131, 244, 10, 244, 4, 122, 6, 125, 11, 125, 27, 165, 139, 246, 158, 93, 185, 192, 62, 99, + 136, 149, 118, 78, 97, 114, 114, 85, 95, 50, 41, 229, 167, 48, 51, 217, 209, 247, 244, 63, + 165, 46, 104, 87, 10, 179, 106, 62, 13, 95, 166, 153, 156, 102, 80, 148, 99, 195, 114, 135, + 73, 201, 0, 169, 47, 35, 155, 22, 135, 42, 99, 32, 67, 53, 13, 238, 203, 29, 188, 117, 161, + 48, 200, 83, 243, 217, 92, 10, 142, 32, 18, 164, 165, 86, 173, 5, 225, 1, 188, 35, 80, 28, + 237, 73, 228, 107, 228, 218, 225, 31, 60, 179, 254, 187, 235, 234, 98, 79, 76, 12, 87, 247, + 15, 108, 88, 2, 154, 85, 96, 229, 160, 161, 5, 93, 208, 171, 55, 6, 234, 219, 211, 65, 187, + 93, 229, 129, 203, 66, 200, 235, 106, 40, 174, 203, 215, 14, 127, 99, 87, 123, 97, 108, 83, + 111, 19, 72, 31, 41, 88, 31, 236, 217, 218, 230, 115, 167, 186, 26, 155, 122, 210, 218, 238, + 72, 199, 182, 246, 228, 170, 229, 69, 95, 110, 116, 211, 96, 77, 166, 61, 169, 150, 174, + 227, 117, 45, 91, 135, 7, 150, 52, 175, 239, 237, 140, 44, 27, 27, 200, 198, 186, 182, 46, + 125, 116, 203, 198, 13, 153, 228, 224, 208, 64, 194, 215, 217, 215, 159, 140, 218, 29, 28, + 69, 176, 146, 195, 104, 221, 49, 58, 146, 136, 54, 4, 4, 194, 230, 49, 140, 128, 100, 183, + 137, 145, 182, 84, 245, 35, 73, 93, 75, 46, 91, 189, 133, 36, 124, 173, 75, 187, 234, 146, + 157, 197, 98, 180, 170, 41, 233, 241, 213, 183, 205, 37, 114, 79, 22, 34, 74, 85, 82, 175, + 223, 188, 101, 115, 42, 84, 40, 20, 201, 195, 136, 4, 15, 56, 152, 125, 116, 10, 189, 128, + 38, 208, 33, 180, 253, 157, 177, 9, 79, 205, 20, 126, 174, 216, 152, 18, 60, 245, 173, 104, + 191, 103, 157, 103, 29, 234, 218, 186, 251, 122, 48, 17, 108, 60, 112, 83, 25, 186, 217, + 223, 191, 146, 21, 38, 82, 99, 81, 90, 9, 194, 123, 100, 233, 205, 29, 135, 214, 172, 188, + 53, 2, 209, 82, 152, 1, 223, 228, 45, 10, 103, 148, 124, 122, 86, 158, 205, 40, 89, 25, 146, + 229, 165, 247, 205, 225, 75, 242, 149, 171, 74, 62, 127, 29, 62, 22, 113, 168, 251, 124, 1, + 254, 162, 172, 220, 209, 82, 110, 146, 89, 146, 209, 192, 25, 84, 197, 57, 140, 187, 226, + 156, 138, 155, 33, 42, 162, 150, 10, 99, 172, 202, 21, 139, 193, 51, 148, 219, 165, 89, 254, + 195, 204, 62, 37, 182, 108, 104, 188, 47, 217, 213, 92, 195, 38, 86, 118, 119, 134, 235, 30, + 203, 70, 61, 118, 49, 212, 250, 248, 139, 189, 161, 71, 155, 51, 94, 133, 242, 199, 128, + 163, 52, 49, 40, 55, 180, 39, 31, 203, 84, 107, 246, 244, 139, 239, 189, 182, 119, 234, 149, + 167, 59, 107, 53, 54, 123, 96, 230, 23, 61, 123, 7, 154, 237, 12, 228, 113, 76, 177, 66, + 126, 243, 247, 86, 93, 40, 205, 157, 236, 230, 131, 173, 131, 7, 127, 253, 249, 241, 183, + 110, 189, 217, 59, 247, 155, 88, 127, 182, 182, 35, 19, 209, 184, 166, 130, 39, 211, 90, + 136, 125, 113, 151, 196, 29, 175, 30, 25, 31, 202, 58, 163, 249, 154, 68, 62, 42, 43, 225, + 134, 182, 238, 218, 186, 231, 247, 142, 13, 182, 72, 161, 134, 240, 122, 81, 164, 88, 80, + 34, 185, 129, 199, 147, 93, 195, 163, 59, 50, 3, 63, 29, 95, 158, 27, 220, 61, 241, 210, + 193, 23, 226, 207, 79, 29, 89, 161, 56, 21, 86, 210, 21, 81, 149, 4, 187, 203, 37, 174, 127, + 235, 31, 175, 230, 142, 190, 254, 243, 159, 28, 253, 250, 35, 171, 95, 251, 248, 98, 177, + 35, 249, 181, 181, 79, 174, 9, 174, 232, 87, 34, 249, 56, 185, 22, 42, 253, 179, 243, 179, + 228, 111, 233, 16, 202, 161, 110, 244, 250, 121, 180, 98, 254, 98, 81, 151, 136, 190, 77, + 43, 112, 221, 158, 2, 222, 86, 192, 237, 5, 156, 43, 224, 104, 1, 23, 166, 136, 246, 162, + 75, 248, 31, 219, 213, 26, 27, 197, 117, 133, 231, 204, 236, 204, 238, 206, 236, 99, 102, + 95, 222, 135, 119, 189, 207, 241, 218, 107, 175, 215, 143, 93, 123, 215, 175, 193, 216, 37, + 6, 27, 48, 198, 128, 29, 175, 93, 147, 0, 53, 184, 24, 80, 210, 36, 36, 106, 72, 211, 68, + 45, 109, 69, 75, 67, 164, 86, 85, 160, 105, 69, 148, 168, 226, 17, 94, 139, 211, 170, 84, + 162, 141, 212, 10, 169, 106, 80, 202, 79, 242, 163, 146, 139, 132, 148, 62, 148, 68, 16, + 219, 61, 247, 238, 172, 77, 105, 103, 165, 57, 51, 119, 231, 142, 118, 191, 239, 124, 223, + 57, 167, 186, 218, 114, 52, 11, 251, 179, 176, 41, 11, 133, 44, 164, 178, 144, 197, 47, 174, + 30, 98, 128, 20, 226, 210, 202, 93, 82, 1, 48, 46, 94, 195, 215, 48, 25, 11, 88, 74, 43, 15, + 52, 17, 111, 44, 133, 149, 76, 134, 87, 75, 192, 188, 239, 28, 239, 47, 129, 251, 34, 63, + 93, 209, 36, 242, 156, 42, 222, 198, 25, 175, 248, 73, 145, 28, 184, 36, 151, 175, 90, 200, + 88, 164, 59, 69, 133, 105, 161, 210, 28, 17, 233, 25, 245, 2, 175, 43, 209, 168, 147, 205, + 253, 166, 109, 238, 236, 225, 145, 151, 38, 187, 19, 178, 35, 189, 229, 185, 179, 7, 19, 67, + 90, 131, 205, 104, 96, 193, 40, 153, 37, 53, 55, 220, 90, 124, 125, 172, 142, 243, 175, 27, + 222, 209, 60, 251, 195, 113, 245, 92, 85, 110, 162, 47, 177, 113, 160, 215, 31, 233, 157, + 234, 213, 166, 122, 130, 240, 139, 177, 211, 47, 12, 38, 55, 206, 29, 255, 229, 212, 232, + 123, 111, 125, 111, 95, 151, 217, 238, 144, 172, 118, 167, 205, 225, 151, 77, 54, 197, 54, + 116, 236, 221, 73, 123, 200, 107, 207, 239, 249, 238, 87, 11, 211, 125, 113, 107, 85, 141, + 227, 149, 115, 179, 141, 153, 145, 61, 12, 234, 99, 27, 98, 187, 192, 71, 176, 15, 111, 103, + 54, 192, 183, 174, 51, 185, 149, 79, 47, 219, 21, 24, 202, 97, 129, 188, 76, 10, 100, 182, + 164, 175, 100, 43, 43, 109, 149, 149, 182, 202, 74, 43, 169, 170, 10, 12, 183, 234, 213, + 117, 144, 212, 84, 66, 209, 32, 100, 42, 207, 208, 11, 187, 172, 95, 232, 43, 119, 73, 77, + 206, 148, 88, 159, 230, 115, 37, 105, 167, 144, 148, 201, 51, 250, 117, 24, 191, 77, 150, + 88, 175, 230, 15, 217, 99, 33, 252, 23, 48, 236, 162, 167, 144, 43, 36, 118, 208, 103, 58, + 74, 43, 127, 214, 220, 65, 24, 238, 160, 27, 245, 69, 178, 177, 99, 129, 93, 143, 250, 191, + 125, 137, 144, 188, 70, 250, 141, 75, 46, 61, 202, 122, 180, 150, 227, 101, 210, 4, 244, + 225, 143, 211, 68, 242, 142, 190, 12, 190, 180, 175, 242, 163, 251, 42, 63, 186, 79, 255, + 209, 125, 36, 213, 20, 81, 195, 75, 49, 219, 205, 55, 46, 249, 198, 7, 150, 86, 147, 37, + 143, 185, 242, 73, 138, 28, 183, 233, 89, 191, 161, 238, 65, 131, 76, 23, 202, 103, 146, 61, + 76, 74, 63, 30, 29, 121, 254, 215, 250, 57, 154, 65, 212, 45, 170, 114, 57, 103, 27, 245, + 23, 234, 11, 57, 110, 161, 235, 240, 217, 3, 79, 191, 117, 176, 144, 220, 116, 112, 160, + 107, 82, 139, 52, 63, 245, 147, 189, 187, 79, 20, 27, 34, 90, 177, 107, 195, 252, 166, 218, + 59, 193, 142, 209, 236, 220, 124, 32, 191, 179, 107, 207, 92, 125, 116, 96, 95, 127, 239, + 116, 119, 205, 107, 223, 62, 246, 42, 12, 109, 127, 117, 34, 93, 191, 237, 249, 225, 238, + 189, 59, 54, 69, 107, 6, 70, 38, 115, 253, 207, 237, 106, 109, 26, 57, 216, 219, 58, 181, + 125, 48, 28, 219, 56, 54, 205, 78, 215, 247, 103, 124, 187, 199, 106, 215, 119, 229, 107, + 218, 190, 185, 244, 118, 122, 211, 186, 238, 72, 77, 79, 223, 96, 195, 204, 254, 3, 100, 2, + 197, 92, 250, 16, 115, 201, 201, 164, 152, 123, 154, 47, 233, 128, 58, 5, 84, 43, 168, 22, + 80, 77, 144, 48, 66, 61, 7, 117, 44, 52, 34, 214, 90, 130, 100, 71, 35, 184, 188, 72, 130, + 139, 244, 137, 46, 15, 210, 224, 18, 113, 238, 114, 17, 242, 92, 94, 114, 245, 1, 139, 227, + 25, 19, 94, 89, 36, 92, 133, 245, 228, 194, 120, 143, 112, 134, 241, 179, 75, 22, 26, 23, + 201, 188, 22, 15, 67, 184, 196, 54, 106, 102, 49, 204, 100, 24, 141, 225, 68, 194, 165, 25, + 119, 52, 137, 91, 68, 150, 33, 137, 66, 238, 68, 185, 156, 16, 55, 168, 226, 25, 145, 17, + 27, 27, 2, 37, 16, 223, 183, 143, 98, 105, 16, 47, 242, 59, 40, 137, 138, 3, 202, 108, 165, + 138, 169, 34, 10, 61, 181, 70, 88, 153, 178, 162, 126, 60, 62, 164, 162, 202, 13, 68, 229, + 186, 165, 27, 184, 15, 155, 190, 126, 225, 149, 163, 239, 236, 77, 101, 230, 46, 28, 123, + 17, 227, 5, 91, 32, 213, 53, 156, 25, 219, 223, 237, 9, 173, 219, 243, 68, 199, 88, 55, 78, + 172, 236, 241, 83, 159, 93, 156, 217, 249, 238, 231, 103, 222, 248, 156, 198, 95, 205, 252, + 244, 27, 99, 237, 190, 173, 223, 255, 245, 220, 143, 254, 116, 172, 16, 95, 63, 117, 228, + 53, 180, 175, 115, 40, 219, 211, 124, 21, 147, 102, 254, 166, 197, 227, 33, 136, 7, 33, 94, + 13, 177, 0, 196, 253, 16, 247, 129, 234, 5, 181, 10, 234, 40, 246, 142, 176, 76, 212, 133, + 255, 212, 74, 224, 206, 0, 67, 160, 101, 234, 74, 101, 64, 235, 116, 64, 105, 180, 210, 72, + 1, 197, 248, 5, 73, 241, 186, 18, 171, 96, 3, 231, 37, 155, 188, 18, 57, 75, 138, 174, 35, + 140, 84, 87, 138, 174, 163, 71, 214, 111, 144, 87, 40, 20, 122, 220, 113, 70, 1, 197, 233, + 40, 65, 239, 165, 216, 182, 58, 185, 4, 198, 139, 194, 118, 132, 183, 165, 119, 233, 22, 52, + 149, 49, 77, 221, 74, 221, 76, 181, 254, 131, 94, 254, 94, 23, 3, 20, 87, 143, 4, 129, 55, + 82, 193, 55, 130, 125, 173, 64, 43, 35, 219, 158, 40, 187, 170, 155, 246, 197, 220, 105, 65, + 180, 26, 151, 38, 141, 22, 73, 16, 204, 86, 19, 216, 30, 56, 171, 108, 60, 39, 72, 102, 168, + 55, 88, 112, 136, 243, 226, 40, 121, 207, 100, 51, 243, 253, 78, 191, 108, 52, 202, 126, + 167, 195, 175, 152, 185, 59, 167, 68, 131, 53, 84, 165, 120, 101, 139, 240, 91, 206, 96, + 192, 106, 40, 9, 15, 79, 152, 113, 60, 66, 180, 143, 32, 218, 63, 195, 156, 238, 97, 222, + 208, 172, 117, 57, 72, 133, 160, 46, 8, 106, 8, 180, 82, 165, 12, 105, 224, 33, 89, 236, + 161, 206, 227, 33, 48, 121, 48, 13, 175, 182, 38, 240, 195, 228, 117, 172, 243, 11, 236, + 203, 140, 84, 6, 71, 66, 176, 52, 201, 78, 224, 236, 200, 135, 195, 121, 76, 190, 244, 213, + 86, 143, 144, 30, 149, 177, 21, 76, 86, 16, 66, 151, 184, 143, 93, 70, 217, 76, 208, 64, + 110, 145, 116, 164, 9, 72, 49, 42, 194, 227, 224, 180, 59, 215, 154, 61, 61, 33, 133, 85, + 239, 48, 146, 49, 2, 255, 10, 78, 110, 75, 89, 155, 219, 110, 228, 68, 187, 229, 225, 206, + 217, 188, 163, 58, 187, 181, 173, 123, 102, 176, 217, 98, 196, 177, 149, 229, 77, 222, 206, + 241, 3, 157, 83, 63, 40, 166, 61, 27, 94, 159, 191, 197, 182, 154, 236, 18, 191, 209, 81, + 237, 52, 27, 229, 144, 199, 133, 109, 183, 21, 196, 201, 147, 207, 239, 78, 165, 134, 11, + 209, 104, 50, 106, 114, 132, 220, 118, 143, 108, 115, 199, 99, 222, 236, 228, 209, 129, 158, + 23, 79, 156, 63, 242, 177, 217, 65, 167, 194, 125, 232, 9, 39, 17, 191, 93, 192, 95, 103, + 38, 16, 178, 106, 2, 217, 4, 52, 155, 16, 148, 102, 34, 252, 102, 138, 91, 51, 193, 173, + 185, 196, 102, 53, 113, 243, 168, 186, 121, 179, 215, 9, 195, 8, 241, 162, 166, 226, 35, + 106, 24, 79, 26, 174, 170, 26, 103, 11, 144, 157, 1, 178, 51, 64, 119, 6, 200, 206, 128, + 158, 178, 1, 68, 254, 10, 99, 146, 202, 229, 253, 50, 209, 183, 77, 79, 77, 155, 158, 237, + 54, 66, 156, 19, 105, 176, 117, 106, 120, 219, 169, 145, 151, 52, 117, 2, 77, 93, 61, 133, + 203, 21, 160, 83, 233, 84, 60, 185, 18, 72, 216, 181, 143, 54, 252, 43, 28, 230, 7, 71, 61, + 120, 171, 59, 4, 105, 9, 242, 50, 82, 68, 93, 2, 115, 153, 208, 68, 252, 94, 247, 250, 42, + 92, 39, 43, 138, 35, 191, 230, 243, 186, 89, 8, 217, 54, 218, 6, 146, 46, 128, 82, 182, 106, + 32, 171, 43, 255, 143, 68, 55, 86, 128, 147, 61, 207, 188, 119, 96, 221, 225, 93, 5, 187, + 73, 224, 108, 86, 115, 118, 116, 190, 191, 239, 233, 254, 104, 106, 244, 133, 225, 23, 145, + 43, 163, 32, 217, 204, 135, 251, 102, 7, 107, 253, 109, 35, 217, 194, 204, 80, 139, 136, + 196, 114, 172, 96, 114, 22, 198, 230, 181, 137, 239, 60, 217, 24, 238, 153, 232, 92, 63, + 191, 181, 17, 142, 140, 159, 216, 219, 238, 14, 214, 216, 108, 174, 160, 59, 94, 29, 78, + 132, 163, 61, 99, 45, 237, 187, 180, 40, 202, 195, 237, 244, 217, 141, 81, 109, 188, 61, 57, + 152, 171, 137, 37, 99, 188, 61, 224, 33, 141, 155, 19, 121, 78, 111, 127, 118, 67, 247, 236, + 72, 94, 98, 141, 217, 173, 196, 251, 51, 43, 15, 184, 143, 120, 23, 83, 143, 190, 244, 80, + 43, 36, 210, 160, 54, 66, 109, 3, 196, 107, 33, 174, 66, 162, 26, 212, 0, 196, 168, 65, 37, + 188, 144, 168, 2, 213, 3, 170, 27, 84, 23, 168, 50, 32, 197, 113, 30, 226, 6, 72, 5, 128, + 186, 149, 163, 236, 86, 141, 30, 47, 94, 120, 136, 137, 121, 116, 18, 73, 188, 134, 220, + 121, 170, 211, 105, 185, 180, 242, 165, 22, 196, 39, 100, 34, 63, 50, 228, 225, 9, 109, 76, + 38, 69, 68, 150, 49, 7, 228, 15, 88, 5, 59, 27, 67, 217, 171, 12, 88, 0, 136, 252, 12, 68, + 126, 34, 126, 109, 48, 100, 154, 106, 3, 105, 74, 176, 33, 21, 145, 101, 49, 178, 77, 28, + 99, 122, 9, 179, 142, 124, 235, 253, 150, 22, 82, 3, 8, 133, 173, 186, 237, 99, 187, 127, + 139, 198, 53, 5, 62, 118, 128, 75, 136, 197, 148, 74, 69, 80, 86, 165, 9, 107, 94, 229, 129, + 24, 68, 184, 143, 92, 142, 147, 38, 87, 216, 231, 13, 59, 141, 75, 247, 44, 178, 149, 103, + 5, 209, 8, 127, 225, 157, 161, 134, 16, 14, 93, 242, 73, 197, 189, 252, 115, 118, 249, 73, + 120, 7, 14, 69, 212, 229, 79, 77, 18, 153, 48, 37, 19, 200, 130, 28, 242, 58, 67, 190, 42, + 43, 231, 192, 97, 147, 227, 77, 86, 243, 151, 127, 136, 177, 127, 95, 42, 16, 197, 237, 65, + 197, 189, 201, 219, 208, 177, 126, 167, 89, 107, 219, 161, 54, 71, 170, 175, 202, 81, 199, + 186, 90, 54, 172, 118, 221, 149, 218, 73, 87, 35, 97, 170, 183, 47, 32, 82, 73, 132, 62, + 137, 171, 73, 162, 139, 164, 109, 75, 203, 124, 203, 203, 45, 92, 75, 144, 192, 27, 36, 240, + 6, 169, 224, 130, 68, 112, 193, 5, 182, 21, 155, 171, 69, 189, 185, 186, 113, 133, 52, 87, + 154, 19, 175, 174, 145, 118, 201, 233, 244, 162, 112, 26, 52, 75, 67, 225, 223, 225, 40, 68, + 163, 124, 195, 136, 247, 191, 164, 83, 188, 79, 164, 211, 148, 2, 249, 99, 93, 49, 55, 139, + 183, 203, 226, 41, 131, 75, 208, 93, 83, 75, 185, 180, 174, 137, 3, 7, 36, 53, 171, 160, + 136, 34, 84, 27, 66, 44, 162, 148, 7, 43, 238, 205, 175, 28, 187, 56, 215, 53, 183, 61, 103, + 23, 120, 150, 51, 73, 70, 177, 126, 195, 236, 19, 235, 15, 141, 164, 107, 71, 94, 218, 209, + 189, 75, 173, 246, 214, 4, 217, 110, 147, 93, 228, 93, 142, 229, 96, 108, 48, 51, 127, 118, + 62, 15, 103, 190, 246, 246, 124, 65, 241, 121, 109, 22, 197, 239, 80, 2, 138, 201, 23, 244, + 135, 251, 247, 109, 236, 153, 238, 173, 177, 248, 19, 172, 61, 18, 54, 163, 9, 198, 147, + 203, 167, 120, 54, 59, 115, 124, 101, 165, 50, 151, 176, 2, 247, 71, 134, 32, 255, 20, 106, + 224, 60, 34, 95, 195, 252, 245, 58, 163, 160, 119, 137, 74, 4, 134, 20, 185, 92, 31, 23, + 117, 115, 161, 165, 150, 222, 151, 235, 228, 23, 52, 23, 159, 193, 78, 73, 1, 185, 84, 217, + 37, 147, 93, 178, 190, 75, 214, 119, 209, 175, 37, 201, 2, 67, 207, 202, 68, 56, 2, 89, 199, + 205, 145, 10, 179, 17, 120, 164, 177, 189, 67, 27, 90, 183, 94, 145, 221, 228, 93, 146, 30, + 237, 52, 222, 189, 130, 123, 220, 188, 82, 130, 198, 75, 254, 17, 137, 100, 254, 253, 22, + 106, 98, 88, 146, 41, 11, 216, 227, 208, 188, 215, 3, 117, 47, 35, 144, 137, 86, 85, 115, + 237, 16, 137, 170, 229, 162, 76, 112, 63, 207, 241, 102, 97, 57, 205, 219, 171, 226, 254, + 168, 170, 176, 2, 220, 91, 250, 177, 211, 201, 139, 54, 51, 251, 79, 155, 91, 18, 12, 55, + 255, 195, 126, 157, 71, 69, 117, 94, 1, 0, 191, 203, 55, 195, 176, 13, 204, 176, 200, 58, + 188, 25, 246, 125, 83, 4, 71, 100, 64, 68, 150, 184, 129, 49, 46, 196, 5, 209, 168, 65, 37, + 136, 136, 138, 130, 184, 36, 81, 130, 168, 196, 184, 197, 38, 45, 181, 38, 181, 53, 177, 6, + 137, 137, 198, 24, 99, 18, 163, 38, 105, 211, 229, 244, 156, 246, 212, 193, 63, 77, 107, + 141, 49, 169, 38, 208, 111, 134, 81, 36, 104, 11, 253, 163, 77, 207, 225, 157, 243, 155, + 183, 204, 155, 185, 111, 222, 220, 119, 191, 239, 234, 131, 3, 253, 181, 119, 46, 187, 121, + 56, 179, 218, 221, 203, 93, 20, 70, 133, 121, 201, 113, 69, 173, 15, 146, 119, 211, 209, + 137, 200, 187, 121, 81, 222, 77, 178, 239, 31, 146, 35, 71, 18, 228, 192, 41, 139, 87, 116, + 2, 198, 168, 48, 90, 96, 52, 99, 76, 4, 70, 184, 96, 174, 173, 84, 40, 182, 159, 157, 43, + 135, 19, 247, 187, 35, 73, 240, 154, 100, 204, 72, 46, 72, 94, 156, 204, 177, 201, 40, 135, + 148, 56, 139, 51, 104, 181, 10, 84, 2, 245, 180, 1, 61, 237, 192, 113, 91, 198, 154, 109, + 227, 134, 252, 168, 217, 54, 95, 209, 219, 62, 190, 210, 140, 105, 230, 60, 243, 66, 51, + 135, 153, 209, 220, 65, 177, 22, 109, 98, 56, 134, 91, 110, 40, 138, 83, 218, 205, 152, 18, + 153, 197, 154, 215, 157, 166, 221, 215, 20, 218, 219, 65, 153, 190, 242, 54, 57, 58, 194, + 148, 251, 115, 216, 158, 197, 194, 209, 25, 222, 203, 226, 145, 106, 245, 125, 115, 70, 113, + 183, 51, 236, 153, 51, 166, 241, 33, 239, 164, 41, 107, 95, 169, 140, 157, 146, 29, 231, 45, + 111, 150, 171, 198, 53, 42, 179, 56, 117, 222, 182, 233, 113, 52, 162, 117, 110, 197, 174, + 25, 145, 41, 75, 218, 170, 166, 172, 43, 181, 68, 234, 142, 154, 114, 230, 102, 101, 151, + 154, 131, 252, 211, 103, 230, 20, 53, 209, 201, 169, 71, 126, 180, 109, 145, 217, 213, 83, + 175, 15, 9, 240, 13, 208, 170, 60, 244, 30, 69, 235, 15, 149, 134, 36, 153, 23, 54, 149, 76, + 219, 95, 147, 23, 61, 97, 233, 214, 151, 243, 26, 142, 86, 36, 37, 78, 42, 31, 97, 46, 203, + 13, 143, 183, 229, 111, 30, 84, 112, 187, 240, 133, 68, 240, 62, 22, 19, 102, 232, 64, 183, + 99, 110, 106, 61, 36, 166, 94, 250, 238, 82, 106, 114, 146, 253, 97, 52, 246, 175, 109, 114, + 78, 118, 183, 73, 209, 217, 51, 161, 93, 237, 162, 213, 116, 117, 104, 116, 65, 62, 222, + 193, 58, 185, 229, 236, 238, 162, 150, 179, 51, 13, 22, 104, 116, 193, 222, 62, 65, 58, 219, + 150, 187, 171, 138, 44, 94, 129, 122, 77, 87, 171, 172, 106, 42, 149, 173, 180, 85, 104, + 244, 129, 94, 122, 121, 76, 110, 185, 59, 171, 84, 114, 30, 39, 223, 181, 205, 36, 28, 11, + 230, 244, 69, 179, 7, 207, 246, 180, 138, 115, 15, 166, 58, 216, 151, 122, 247, 192, 56, 45, + 2, 208, 180, 247, 231, 124, 171, 151, 75, 211, 192, 185, 78, 235, 225, 54, 213, 225, 250, + 131, 105, 11, 1, 60, 26, 30, 204, 179, 114, 112, 116, 101, 189, 244, 29, 125, 121, 151, 62, + 152, 79, 76, 95, 190, 150, 129, 27, 22, 6, 224, 151, 215, 159, 191, 175, 116, 171, 191, 128, + 230, 33, 67, 122, 4, 94, 27, 188, 96, 3, 128, 33, 109, 96, 66, 202, 251, 82, 14, 13, 140, + 241, 200, 15, 91, 232, 150, 129, 9, 107, 238, 21, 222, 48, 56, 17, 205, 189, 34, 207, 246, + 138, 202, 127, 176, 24, 23, 128, 216, 184, 135, 139, 203, 31, 156, 248, 154, 30, 9, 135, 1, + 18, 247, 245, 149, 28, 49, 48, 41, 134, 255, 158, 212, 49, 3, 55, 92, 254, 135, 105, 165, + 253, 141, 172, 5, 72, 207, 233, 47, 3, 134, 12, 25, 50, 100, 200, 144, 135, 144, 243, 253, + 81, 90, 233, 160, 100, 237, 97, 150, 99, 135, 185, 173, 215, 232, 98, 128, 76, 250, 15, 20, + 63, 196, 30, 7, 235, 192, 140, 169, 6, 200, 242, 150, 26, 165, 107, 131, 103, 105, 251, 55, + 110, 245, 200, 169, 237, 149, 59, 250, 255, 215, 184, 61, 61, 198, 95, 253, 223, 42, 144, + 253, 105, 161, 236, 31, 139, 190, 1, 152, 240, 23, 128, 73, 75, 0, 38, 127, 46, 201, 247, + 138, 77, 82, 10, 64, 73, 219, 144, 127, 101, 106, 206, 15, 11, 176, 67, 16, 160, 124, 5, + 245, 31, 229, 30, 218, 247, 133, 250, 180, 92, 215, 129, 5, 84, 48, 26, 214, 99, 61, 238, + 196, 110, 10, 164, 15, 232, 35, 250, 19, 11, 214, 176, 27, 235, 217, 135, 163, 56, 151, 87, + 242, 122, 222, 202, 77, 252, 50, 95, 22, 115, 196, 124, 177, 82, 236, 48, 108, 54, 124, 169, + 120, 42, 62, 74, 128, 98, 80, 76, 74, 132, 146, 164, 140, 82, 50, 149, 92, 165, 82, 105, 86, + 142, 24, 85, 70, 47, 227, 48, 163, 98, 52, 25, 35, 140, 9, 198, 57, 198, 189, 38, 50, 169, + 77, 30, 38, 189, 41, 192, 100, 48, 197, 154, 242, 77, 115, 77, 11, 194, 47, 220, 17, 221, + 221, 242, 42, 20, 120, 73, 70, 191, 77, 126, 116, 94, 70, 255, 3, 3, 171, 217, 197, 30, 61, + 66, 70, 175, 150, 209, 55, 201, 232, 205, 252, 19, 1, 162, 76, 84, 137, 22, 67, 131, 225, + 134, 140, 238, 165, 248, 41, 65, 138, 98, 143, 158, 225, 136, 94, 237, 136, 238, 123, 47, + 122, 137, 177, 197, 17, 93, 103, 242, 191, 23, 189, 92, 70, 7, 123, 116, 160, 64, 176, 47, + 221, 185, 224, 88, 186, 131, 187, 100, 37, 234, 158, 209, 157, 208, 29, 10, 208, 213, 1, + 223, 91, 58, 203, 238, 109, 165, 94, 117, 233, 140, 237, 244, 234, 188, 218, 41, 123, 49, + 235, 109, 235, 107, 157, 233, 114, 221, 104, 173, 151, 71, 131, 108, 103, 88, 139, 172, 133, + 86, 251, 55, 91, 19, 172, 161, 87, 238, 92, 177, 94, 233, 252, 243, 54, 185, 139, 80, 135, + 242, 92, 186, 73, 93, 44, 228, 223, 36, 88, 203, 190, 28, 96, 59, 179, 231, 85, 174, 253, + 36, 19, 231, 243, 65, 81, 42, 102, 139, 114, 177, 80, 84, 2, 136, 74, 81, 45, 106, 69, 221, + 253, 87, 36, 170, 29, 235, 31, 223, 59, 114, 64, 28, 119, 108, 157, 17, 103, 251, 156, 107, + 251, 61, 204, 133, 252, 2, 159, 224, 195, 34, 131, 247, 240, 110, 121, 143, 235, 185, 89, + 100, 242, 163, 92, 197, 211, 185, 130, 175, 241, 23, 252, 87, 254, 27, 95, 231, 191, 243, + 13, 254, 146, 111, 242, 87, 252, 24, 79, 19, 185, 34, 91, 140, 227, 9, 188, 31, 4, 232, 64, + 15, 126, 50, 151, 34, 32, 18, 226, 32, 17, 70, 201, 76, 26, 3, 185, 48, 14, 138, 224, 49, + 152, 1, 51, 97, 54, 148, 195, 34, 88, 1, 213, 176, 26, 214, 64, 61, 55, 112, 37, 111, 224, + 86, 94, 131, 95, 32, 161, 7, 122, 98, 0, 26, 48, 10, 39, 227, 76, 124, 28, 23, 99, 5, 46, + 199, 149, 88, 131, 235, 240, 89, 220, 134, 77, 216, 130, 251, 240, 13, 60, 131, 239, 226, + 121, 252, 0, 47, 114, 35, 47, 227, 141, 252, 188, 188, 250, 34, 126, 149, 143, 112, 27, 31, + 229, 229, 188, 131, 156, 248, 32, 126, 202, 139, 68, 129, 188, 250, 151, 200, 93, 102, 74, + 30, 127, 195, 255, 192, 27, 162, 152, 119, 114, 29, 197, 240, 215, 248, 25, 47, 22, 113, 34, + 70, 164, 240, 68, 153, 243, 106, 112, 2, 13, 56, 131, 27, 120, 192, 48, 8, 6, 3, 132, 128, + 17, 146, 32, 25, 82, 96, 56, 4, 66, 62, 60, 2, 19, 96, 34, 76, 130, 201, 34, 11, 166, 194, + 98, 88, 2, 79, 194, 82, 249, 196, 76, 199, 61, 200, 40, 80, 133, 106, 116, 66, 23, 116, 71, + 31, 12, 65, 5, 141, 24, 138, 179, 113, 14, 206, 197, 50, 12, 198, 213, 104, 123, 166, 26, + 112, 3, 54, 10, 11, 110, 193, 118, 60, 129, 29, 120, 18, 63, 194, 173, 248, 49, 184, 160, 6, + 92, 209, 25, 180, 232, 6, 94, 168, 3, 111, 212, 131, 47, 122, 131, 15, 122, 129, 63, 6, 66, + 0, 6, 129, 9, 195, 32, 20, 195, 33, 12, 35, 32, 28, 35, 65, 65, 19, 68, 225, 20, 136, 198, + 98, 136, 193, 18, 136, 197, 169, 16, 143, 179, 32, 1, 75, 33, 21, 231, 193, 8, 156, 15, 105, + 88, 14, 233, 184, 0, 70, 226, 66, 200, 192, 39, 192, 140, 79, 66, 38, 46, 197, 101, 144, + 133, 149, 144, 141, 85, 96, 193, 167, 96, 44, 86, 67, 14, 174, 128, 60, 92, 5, 5, 184, 6, + 198, 99, 45, 174, 133, 66, 172, 131, 41, 184, 17, 138, 113, 19, 148, 224, 102, 152, 134, + 207, 192, 44, 124, 14, 30, 199, 237, 80, 138, 205, 48, 7, 119, 192, 92, 220, 9, 101, 216, + 10, 243, 112, 23, 44, 196, 3, 176, 0, 247, 195, 19, 248, 34, 84, 224, 155, 176, 12, 223, + 130, 229, 248, 54, 84, 226, 41, 120, 10, 79, 67, 21, 190, 3, 171, 240, 28, 172, 195, 11, + 176, 30, 26, 240, 18, 52, 226, 39, 176, 1, 47, 227, 94, 112, 71, 87, 240, 68, 45, 60, 138, + 79, 195, 124, 124, 222, 246, 93, 248, 53, 126, 75, 122, 10, 163, 97, 20, 71, 68, 33, 120, + 29, 191, 146, 53, 65, 69, 158, 228, 67, 81, 228, 74, 1, 100, 146, 21, 42, 129, 98, 41, 158, + 246, 209, 1, 74, 166, 131, 148, 70, 25, 52, 154, 10, 105, 50, 53, 82, 18, 165, 80, 42, 13, + 167, 17, 52, 146, 210, 105, 20, 153, 105, 12, 101, 145, 133, 178, 41, 135, 198, 210, 56, + 202, 163, 241, 148, 79, 5, 244, 8, 77, 160, 137, 52, 137, 50, 169, 136, 86, 208, 106, 170, + 163, 6, 218, 69, 85, 84, 77, 53, 180, 138, 106, 105, 13, 173, 165, 117, 84, 79, 27, 105, 19, + 109, 166, 45, 244, 52, 61, 75, 219, 168, 137, 154, 233, 57, 218, 78, 45, 212, 74, 187, 233, + 5, 218, 67, 27, 104, 39, 109, 165, 29, 180, 151, 142, 208, 47, 232, 183, 116, 152, 126, 77, + 103, 233, 87, 116, 156, 222, 160, 55, 233, 109, 250, 29, 157, 160, 99, 244, 62, 93, 160, 54, + 250, 41, 29, 162, 159, 209, 171, 244, 115, 250, 37, 29, 165, 215, 232, 117, 106, 167, 14, + 58, 73, 111, 209, 41, 122, 135, 206, 208, 187, 244, 30, 157, 147, 181, 247, 67, 89, 255, 62, + 166, 139, 116, 137, 46, 211, 39, 244, 41, 125, 70, 191, 161, 207, 101, 37, 118, 103, 15, + 246, 100, 111, 89, 31, 252, 57, 128, 3, 57, 136, 141, 28, 202, 225, 178, 62, 70, 113, 12, + 199, 113, 60, 39, 114, 50, 15, 231, 17, 156, 198, 233, 156, 193, 163, 216, 204, 163, 57, + 147, 199, 176, 133, 179, 121, 24, 251, 113, 14, 235, 56, 139, 19, 216, 192, 33, 172, 112, + 24, 71, 242, 88, 89, 89, 130, 57, 133, 71, 210, 239, 57, 151, 78, 115, 52, 157, 231, 84, + 122, 133, 245, 176, 18, 207, 66, 13, 190, 7, 181, 248, 62, 172, 197, 15, 101, 5, 174, 225, + 90, 158, 201, 179, 184, 140, 103, 243, 28, 158, 207, 219, 185, 133, 215, 242, 109, 190, 195, + 223, 242, 119, 220, 197, 221, 178, 50, 163, 32, 193, 66, 224, 63, 169, 175, 186, 32, 41, + 174, 42, 124, 102, 230, 238, 14, 187, 176, 11, 134, 74, 233, 147, 185, 230, 193, 240, 151, + 217, 149, 8, 226, 70, 19, 200, 74, 0, 89, 254, 127, 12, 16, 196, 222, 238, 158, 217, 14, + 211, 221, 99, 119, 207, 206, 14, 1, 52, 160, 196, 252, 41, 9, 18, 193, 196, 133, 24, 3, 70, + 77, 136, 137, 2, 254, 37, 26, 99, 212, 104, 41, 137, 15, 121, 240, 37, 175, 62, 24, 203, + 159, 42, 45, 52, 187, 126, 247, 220, 59, 51, 189, 187, 64, 197, 170, 188, 56, 93, 51, 115, + 206, 185, 231, 158, 159, 239, 156, 123, 186, 251, 13, 209, 38, 218, 69, 94, 76, 19, 29, 162, + 83, 76, 23, 51, 68, 151, 232, 22, 51, 197, 44, 241, 46, 113, 149, 152, 157, 59, 155, 59, 33, + 230, 139, 94, 113, 189, 248, 128, 184, 65, 44, 18, 5, 177, 88, 244, 136, 15, 138, 15, 137, + 37, 98, 174, 216, 42, 110, 19, 159, 16, 219, 48, 237, 118, 137, 29, 98, 59, 230, 222, 78, + 177, 89, 220, 148, 219, 43, 214, 101, 230, 103, 10, 153, 21, 153, 37, 153, 213, 212, 158, + 237, 36, 30, 161, 250, 190, 150, 250, 100, 40, 139, 139, 199, 250, 228, 169, 61, 69, 147, + 254, 239, 231, 32, 241, 4, 123, 55, 166, 215, 74, 90, 79, 62, 166, 82, 14, 115, 41, 143, + 201, 212, 137, 169, 36, 49, 151, 212, 84, 218, 133, 185, 164, 166, 82, 29, 19, 105, 63, 102, + 210, 1, 76, 165, 115, 152, 72, 152, 71, 168, 228, 227, 60, 73, 31, 68, 61, 31, 202, 28, 203, + 157, 204, 141, 230, 30, 203, 252, 45, 155, 23, 183, 96, 50, 110, 22, 3, 226, 86, 177, 66, + 172, 204, 157, 17, 27, 197, 26, 84, 98, 83, 246, 62, 177, 54, 115, 33, 243, 170, 216, 128, + 201, 119, 40, 183, 54, 183, 90, 172, 18, 235, 114, 79, 137, 126, 177, 62, 55, 148, 243, 114, + 219, 240, 140, 209, 134, 217, 186, 78, 77, 16, 238, 29, 213, 51, 232, 30, 177, 84, 108, 193, + 236, 219, 47, 230, 228, 78, 229, 156, 156, 171, 170, 137, 62, 218, 139, 174, 178, 69, 31, + 230, 241, 53, 152, 202, 239, 195, 44, 214, 51, 184, 151, 231, 47, 97, 14, 171, 201, 235, + 101, 138, 153, 127, 98, 46, 116, 153, 25, 49, 47, 123, 77, 118, 65, 230, 63, 88, 191, 62, + 123, 45, 233, 167, 28, 2, 202, 100, 232, 12, 117, 51, 151, 227, 78, 232, 86, 119, 88, 243, + 52, 212, 139, 14, 215, 180, 72, 233, 180, 17, 206, 136, 161, 219, 83, 242, 60, 93, 204, 109, + 55, 244, 52, 154, 151, 187, 96, 232, 14, 146, 98, 179, 161, 59, 179, 39, 155, 250, 211, 105, + 43, 223, 139, 21, 61, 131, 230, 137, 87, 12, 221, 149, 61, 38, 254, 97, 232, 110, 42, 231, + 239, 111, 118, 238, 194, 252, 191, 12, 157, 161, 252, 180, 121, 134, 206, 82, 190, 99, 79, + 163, 71, 233, 61, 29, 119, 25, 90, 164, 116, 218, 104, 70, 199, 113, 67, 183, 167, 228, 121, + 218, 215, 241, 132, 161, 167, 209, 213, 29, 111, 24, 186, 131, 102, 117, 94, 107, 232, 206, + 204, 250, 166, 254, 116, 154, 223, 185, 208, 208, 51, 232, 234, 206, 157, 134, 238, 202, 12, + 116, 70, 134, 238, 166, 197, 211, 159, 87, 79, 143, 162, 195, 224, 172, 105, 141, 179, 166, + 53, 206, 154, 214, 56, 107, 90, 164, 116, 52, 206, 154, 110, 79, 201, 53, 206, 154, 214, 56, + 107, 90, 227, 172, 105, 141, 179, 166, 53, 206, 154, 214, 56, 107, 90, 227, 172, 105, 141, + 243, 147, 120, 190, 92, 136, 110, 234, 165, 197, 160, 214, 224, 78, 110, 83, 68, 33, 78, 99, + 72, 69, 156, 72, 73, 253, 160, 34, 170, 240, 175, 5, 137, 7, 42, 160, 2, 86, 150, 81, 25, + 151, 164, 141, 144, 149, 112, 130, 19, 236, 82, 156, 139, 127, 23, 218, 195, 248, 117, 160, + 217, 143, 125, 101, 232, 12, 66, 230, 65, 195, 99, 61, 11, 95, 31, 182, 28, 214, 13, 192, + 197, 144, 5, 188, 166, 247, 123, 136, 64, 226, 107, 65, 207, 131, 133, 58, 184, 26, 168, 4, + 190, 148, 78, 21, 22, 19, 200, 93, 112, 42, 230, 42, 118, 59, 88, 15, 16, 141, 178, 18, 26, + 171, 9, 52, 124, 227, 83, 105, 72, 228, 24, 178, 79, 229, 37, 230, 92, 86, 113, 174, 69, 72, + 84, 142, 85, 200, 93, 222, 17, 177, 164, 204, 81, 39, 38, 15, 27, 43, 11, 216, 178, 207, + 146, 50, 91, 180, 128, 145, 150, 55, 188, 248, 176, 83, 102, 196, 42, 38, 202, 0, 18, 159, + 189, 106, 155, 42, 207, 36, 21, 129, 242, 88, 225, 92, 52, 222, 13, 180, 117, 236, 202, 83, + 8, 4, 36, 242, 215, 136, 171, 168, 124, 232, 90, 240, 159, 48, 167, 50, 78, 154, 245, 208, + 152, 105, 47, 146, 99, 15, 76, 94, 33, 99, 59, 200, 154, 173, 136, 211, 25, 41, 212, 70, + 120, 159, 206, 122, 55, 248, 2, 247, 67, 186, 154, 215, 177, 53, 159, 45, 212, 25, 135, 170, + 169, 124, 26, 111, 85, 49, 157, 191, 203, 241, 171, 252, 117, 93, 34, 238, 6, 245, 175, 61, + 170, 90, 75, 216, 168, 52, 179, 209, 49, 150, 140, 78, 12, 110, 143, 177, 158, 32, 11, 93, + 161, 225, 102, 149, 44, 238, 17, 11, 82, 127, 66, 94, 141, 110, 182, 17, 137, 197, 254, 109, + 227, 191, 192, 29, 91, 226, 90, 169, 149, 169, 103, 160, 111, 74, 214, 125, 205, 83, 179, + 136, 182, 154, 46, 242, 76, 191, 45, 130, 69, 181, 114, 233, 174, 119, 77, 255, 234, 108, + 44, 19, 127, 137, 87, 117, 60, 174, 65, 76, 197, 232, 112, 231, 170, 168, 118, 115, 205, 26, + 123, 46, 189, 90, 252, 159, 78, 112, 171, 91, 116, 109, 182, 128, 243, 56, 6, 229, 127, 19, + 119, 123, 50, 161, 142, 61, 38, 130, 48, 149, 129, 109, 206, 93, 194, 89, 186, 220, 203, 3, + 144, 216, 52, 135, 107, 60, 23, 58, 14, 219, 95, 193, 81, 233, 189, 9, 174, 10, 80, 236, + 193, 85, 227, 171, 192, 103, 124, 98, 228, 5, 182, 238, 67, 71, 61, 25, 168, 248, 75, 156, + 65, 5, 22, 234, 144, 170, 10, 22, 57, 23, 117, 114, 38, 90, 109, 200, 213, 244, 208, 21, + 216, 221, 180, 183, 141, 99, 214, 93, 91, 231, 110, 139, 57, 194, 132, 207, 85, 204, 115, + 64, 239, 150, 156, 131, 58, 147, 46, 119, 148, 199, 62, 52, 66, 131, 188, 183, 129, 222, + 114, 224, 55, 128, 137, 168, 247, 70, 169, 21, 125, 158, 29, 198, 164, 117, 70, 107, 236, + 203, 230, 51, 124, 41, 191, 154, 87, 186, 54, 186, 168, 202, 24, 58, 205, 158, 119, 120, + 189, 194, 29, 91, 79, 245, 121, 133, 51, 13, 76, 167, 107, 91, 46, 255, 170, 147, 59, 57, + 111, 181, 174, 39, 196, 28, 236, 154, 203, 221, 233, 35, 47, 183, 121, 102, 167, 70, 21, 76, + 177, 252, 246, 49, 106, 89, 111, 76, 105, 105, 230, 172, 238, 30, 123, 194, 188, 155, 154, + 123, 171, 95, 39, 198, 117, 99, 10, 1, 149, 137, 206, 69, 79, 253, 70, 215, 71, 205, 59, + 136, 195, 51, 52, 224, 89, 106, 93, 54, 83, 141, 179, 53, 1, 83, 215, 116, 255, 228, 51, + 160, 80, 85, 157, 87, 229, 157, 14, 207, 35, 149, 141, 219, 180, 163, 52, 203, 60, 211, 174, + 84, 161, 119, 234, 92, 180, 206, 68, 15, 71, 163, 206, 128, 190, 19, 21, 184, 86, 21, 26, + 121, 82, 46, 236, 237, 93, 44, 215, 120, 118, 20, 198, 97, 49, 145, 253, 97, 84, 9, 35, 43, + 241, 194, 160, 32, 151, 149, 203, 114, 163, 87, 26, 74, 98, 185, 209, 141, 221, 104, 216, + 117, 10, 253, 86, 217, 27, 140, 60, 233, 197, 210, 146, 126, 232, 184, 81, 32, 99, 43, 136, + 37, 214, 189, 162, 44, 90, 190, 87, 174, 203, 154, 151, 12, 201, 184, 58, 152, 148, 93, 25, + 133, 213, 192, 241, 130, 82, 44, 67, 168, 38, 174, 143, 157, 129, 35, 237, 48, 10, 220, 40, + 46, 200, 85, 137, 44, 186, 86, 82, 141, 220, 88, 70, 174, 85, 150, 94, 2, 31, 118, 188, 64, + 198, 190, 133, 8, 108, 171, 2, 90, 109, 241, 171, 229, 196, 171, 192, 100, 80, 245, 221, 8, + 154, 177, 155, 176, 129, 88, 86, 162, 16, 113, 171, 176, 97, 189, 92, 14, 107, 114, 8, 129, + 75, 207, 175, 88, 118, 34, 189, 64, 38, 42, 15, 68, 134, 45, 178, 236, 5, 240, 21, 22, 229, + 160, 87, 98, 195, 218, 81, 226, 142, 36, 216, 236, 237, 118, 11, 210, 164, 121, 93, 44, 125, + 43, 168, 75, 187, 138, 228, 117, 220, 201, 16, 252, 187, 53, 25, 89, 200, 37, 242, 144, 54, + 54, 90, 190, 172, 86, 148, 27, 88, 44, 65, 18, 123, 123, 160, 158, 132, 72, 104, 88, 165, + 100, 201, 154, 21, 249, 218, 151, 130, 217, 30, 178, 34, 4, 230, 70, 133, 141, 110, 169, 90, + 182, 162, 102, 5, 250, 26, 174, 251, 84, 105, 22, 109, 5, 68, 72, 74, 46, 42, 244, 246, 166, + 160, 119, 129, 47, 220, 88, 176, 95, 242, 84, 28, 46, 2, 139, 44, 199, 245, 173, 104, 183, + 12, 213, 74, 138, 45, 94, 186, 192, 12, 11, 178, 217, 18, 120, 9, 246, 111, 74, 172, 68, + 231, 216, 3, 3, 33, 59, 176, 81, 187, 36, 242, 220, 184, 48, 80, 181, 231, 88, 241, 92, 233, + 184, 114, 69, 20, 98, 53, 73, 42, 125, 61, 61, 181, 90, 173, 224, 55, 140, 23, 236, 208, + 239, 73, 234, 149, 176, 20, 89, 149, 161, 122, 143, 157, 20, 195, 32, 137, 141, 170, 162, + 139, 22, 18, 216, 173, 244, 182, 133, 85, 64, 91, 151, 213, 216, 69, 16, 72, 73, 45, 75, 11, + 149, 116, 35, 223, 75, 84, 64, 131, 117, 14, 111, 249, 150, 129, 101, 88, 141, 152, 65, 157, + 157, 170, 174, 104, 109, 200, 179, 135, 82, 123, 241, 239, 5, 118, 185, 234, 40, 44, 66, + 233, 120, 113, 165, 12, 7, 10, 243, 74, 228, 65, 193, 134, 150, 27, 36, 5, 217, 240, 29, 6, + 104, 136, 57, 222, 92, 233, 250, 131, 106, 83, 203, 84, 208, 80, 190, 100, 68, 172, 174, 90, + 26, 240, 199, 128, 199, 214, 125, 215, 244, 206, 184, 26, 91, 55, 114, 0, 115, 60, 120, 65, + 235, 43, 232, 35, 117, 64, 156, 176, 22, 148, 67, 43, 237, 20, 49, 91, 58, 82, 0, 223, 172, + 64, 88, 77, 42, 213, 4, 176, 15, 123, 182, 171, 116, 134, 220, 114, 101, 82, 66, 111, 167, + 22, 92, 137, 30, 199, 45, 90, 56, 68, 5, 43, 174, 140, 168, 183, 19, 145, 207, 28, 86, 239, + 161, 109, 199, 219, 110, 192, 171, 213, 123, 245, 63, 222, 43, 14, 101, 241, 130, 145, 157, + 217, 134, 151, 73, 145, 203, 138, 147, 148, 253, 203, 82, 146, 119, 154, 183, 49, 90, 179, + 73, 74, 130, 224, 223, 162, 157, 198, 40, 243, 82, 126, 52, 251, 126, 73, 116, 130, 95, 196, + 206, 181, 117, 227, 79, 170, 183, 184, 252, 40, 209, 216, 17, 74, 127, 214, 227, 77, 53, + 166, 207, 226, 58, 68, 15, 208, 17, 122, 129, 254, 136, 187, 193, 65, 80, 199, 233, 36, 157, + 194, 155, 200, 51, 244, 51, 250, 53, 189, 78, 239, 224, 103, 172, 222, 230, 211, 140, 220, + 57, 188, 77, 205, 38, 26, 191, 56, 254, 231, 177, 83, 248, 158, 71, 164, 45, 201, 17, 112, + 179, 133, 108, 73, 198, 103, 141, 191, 57, 73, 246, 230, 216, 145, 241, 89, 99, 231, 219, + 175, 162, 78, 222, 219, 149, 125, 13, 210, 191, 103, 222, 26, 191, 152, 189, 89, 241, 227, + 139, 21, 159, 189, 27, 244, 76, 222, 241, 215, 252, 232, 216, 153, 177, 211, 147, 48, 216, + 64, 219, 105, 7, 221, 78, 59, 233, 83, 252, 100, 226, 240, 189, 231, 14, 60, 157, 148, 49, + 209, 3, 230, 2, 172, 149, 240, 91, 4, 183, 139, 159, 84, 29, 166, 91, 90, 173, 247, 131, 42, + 238, 53, 195, 124, 87, 137, 13, 167, 214, 62, 205, 124, 149, 239, 32, 35, 184, 39, 236, 161, + 59, 105, 47, 237, 51, 191, 53, 150, 236, 197, 202, 30, 230, 71, 240, 221, 79, 159, 65, 101, + 238, 162, 3, 76, 53, 254, 181, 228, 32, 125, 142, 62, 143, 170, 221, 77, 95, 160, 123, 174, + 200, 221, 211, 164, 238, 165, 251, 232, 126, 212, 249, 139, 244, 165, 203, 210, 15, 76, 224, + 14, 227, 122, 144, 30, 66, 63, 124, 153, 142, 210, 195, 116, 12, 125, 241, 8, 61, 58, 73, + 250, 21, 150, 127, 149, 70, 209, 115, 167, 120, 237, 40, 36, 39, 152, 82, 171, 63, 166, 151, + 233, 251, 244, 52, 157, 161, 179, 230, 9, 235, 14, 131, 72, 3, 151, 34, 99, 88, 1, 6, 123, + 145, 225, 193, 84, 196, 26, 191, 90, 19, 173, 253, 200, 93, 229, 118, 175, 201, 116, 4, 242, + 3, 169, 29, 195, 6, 71, 165, 121, 16, 154, 218, 138, 174, 131, 178, 178, 111, 18, 18, 135, + 145, 131, 166, 91, 25, 105, 238, 40, 231, 223, 146, 166, 81, 185, 146, 180, 129, 199, 163, + 41, 100, 30, 97, 78, 81, 147, 165, 151, 163, 31, 166, 175, 225, 4, 62, 134, 95, 133, 170, + 162, 190, 14, 90, 83, 39, 152, 78, 203, 71, 155, 186, 39, 153, 127, 156, 190, 65, 79, 160, + 22, 167, 153, 106, 252, 107, 201, 41, 208, 167, 233, 155, 56, 219, 223, 162, 111, 211, 119, + 112, 181, 232, 52, 165, 255, 159, 166, 167, 184, 114, 207, 208, 119, 233, 89, 122, 142, 190, + 135, 74, 158, 165, 115, 116, 158, 229, 87, 90, 187, 148, 252, 57, 35, 127, 182, 41, 249, 1, + 253, 144, 126, 132, 14, 121, 158, 126, 138, 73, 243, 34, 174, 134, 228, 39, 144, 189, 96, + 164, 47, 177, 76, 243, 47, 210, 207, 193, 43, 45, 205, 189, 76, 191, 196, 132, 122, 133, + 126, 67, 191, 165, 223, 211, 47, 192, 253, 142, 127, 127, 5, 238, 2, 189, 70, 127, 160, 215, + 51, 93, 160, 94, 165, 63, 225, 247, 45, 124, 105, 233, 10, 103, 215, 39, 119, 222, 190, 99, + 251, 182, 219, 182, 108, 222, 180, 113, 195, 250, 117, 107, 215, 12, 172, 254, 248, 170, + 149, 43, 110, 93, 254, 177, 254, 91, 150, 45, 189, 249, 166, 143, 126, 228, 198, 190, 15, + 47, 249, 47, 227, 229, 31, 28, 213, 85, 197, 241, 243, 126, 236, 143, 252, 146, 5, 41, 147, + 186, 12, 188, 205, 101, 67, 210, 108, 8, 180, 105, 65, 76, 211, 157, 253, 17, 146, 70, 126, + 228, 7, 245, 189, 148, 150, 183, 217, 36, 36, 12, 173, 128, 3, 69, 108, 107, 106, 161, 192, + 2, 157, 169, 131, 131, 169, 34, 77, 253, 67, 75, 211, 206, 221, 58, 118, 130, 58, 35, 56, + 56, 142, 74, 235, 95, 160, 254, 225, 12, 86, 101, 168, 194, 84, 103, 164, 78, 167, 192, 243, + 123, 239, 123, 187, 77, 54, 209, 102, 103, 63, 123, 238, 57, 247, 220, 115, 207, 253, 241, + 238, 187, 187, 250, 129, 251, 155, 86, 52, 198, 234, 106, 163, 203, 88, 205, 210, 234, 133, + 243, 67, 243, 170, 42, 202, 203, 130, 1, 191, 15, 39, 177, 66, 177, 52, 107, 179, 13, 94, + 107, 115, 189, 150, 181, 183, 55, 10, 157, 101, 96, 200, 76, 49, 216, 28, 239, 18, 222, 54, + 221, 135, 27, 182, 116, 51, 166, 123, 198, 225, 57, 84, 226, 25, 119, 61, 227, 69, 79, 37, + 100, 180, 80, 75, 99, 204, 72, 51, 131, 191, 147, 98, 198, 164, 210, 215, 101, 162, 124, 60, + 197, 44, 131, 223, 144, 229, 245, 178, 172, 215, 74, 165, 10, 74, 36, 130, 22, 70, 186, 122, + 56, 101, 112, 197, 54, 210, 188, 109, 239, 112, 46, 109, 167, 16, 47, 95, 81, 158, 100, 201, + 193, 242, 198, 24, 229, 203, 43, 80, 172, 64, 137, 215, 177, 157, 121, 165, 174, 85, 145, 5, + 181, 46, 189, 54, 143, 247, 80, 149, 232, 150, 107, 209, 116, 102, 128, 111, 234, 50, 211, + 169, 112, 36, 98, 73, 27, 37, 101, 44, 238, 79, 242, 128, 140, 101, 140, 136, 156, 233, 168, + 145, 143, 157, 203, 29, 155, 12, 81, 191, 221, 80, 57, 192, 6, 50, 91, 76, 174, 101, 208, + 40, 167, 165, 115, 185, 67, 124, 126, 3, 175, 103, 41, 94, 191, 255, 175, 213, 24, 242, 32, + 143, 177, 84, 154, 55, 48, 4, 235, 236, 46, 118, 160, 112, 95, 52, 196, 140, 220, 77, 66, + 242, 236, 198, 245, 233, 150, 140, 103, 241, 71, 67, 55, 73, 20, 197, 16, 139, 211, 132, + 250, 66, 153, 144, 27, 50, 196, 248, 34, 17, 145, 203, 209, 201, 56, 245, 67, 225, 163, 93, + 166, 171, 227, 15, 82, 248, 45, 138, 55, 53, 88, 92, 181, 69, 205, 185, 66, 205, 93, 155, + 69, 205, 104, 161, 166, 216, 220, 102, 17, 177, 84, 105, 219, 251, 238, 29, 174, 230, 163, + 253, 70, 99, 12, 179, 47, 191, 81, 124, 81, 111, 112, 173, 214, 238, 199, 53, 9, 50, 51, + 152, 99, 169, 148, 59, 111, 189, 38, 143, 167, 80, 136, 103, 188, 177, 166, 243, 43, 155, + 224, 159, 177, 49, 136, 17, 49, 13, 93, 38, 111, 98, 59, 249, 66, 150, 112, 29, 96, 48, 196, + 26, 140, 244, 152, 178, 137, 215, 140, 47, 76, 114, 178, 179, 94, 43, 222, 148, 78, 137, + 188, 140, 116, 206, 78, 185, 9, 138, 88, 172, 203, 60, 75, 247, 57, 87, 242, 205, 70, 248, + 71, 247, 81, 51, 89, 34, 15, 190, 40, 137, 69, 169, 77, 231, 204, 129, 33, 190, 212, 14, 15, + 96, 127, 14, 25, 102, 56, 194, 227, 22, 166, 207, 98, 230, 160, 37, 86, 137, 133, 120, 253, + 21, 116, 23, 145, 61, 202, 86, 24, 91, 137, 119, 193, 89, 140, 60, 16, 13, 26, 166, 26, 214, + 44, 177, 90, 48, 24, 109, 248, 97, 137, 22, 84, 132, 176, 92, 82, 21, 43, 154, 104, 49, 76, + 37, 76, 5, 55, 244, 226, 121, 136, 210, 180, 56, 80, 180, 104, 178, 93, 84, 105, 162, 105, + 178, 61, 28, 177, 34, 238, 231, 255, 164, 20, 246, 114, 242, 69, 121, 112, 74, 172, 16, 12, + 197, 156, 220, 126, 254, 103, 106, 174, 183, 72, 168, 222, 72, 15, 166, 166, 36, 56, 45, + 168, 207, 75, 208, 139, 54, 123, 158, 170, 152, 11, 175, 99, 180, 8, 138, 229, 108, 47, 84, + 105, 81, 60, 185, 176, 169, 8, 35, 77, 98, 21, 171, 13, 78, 155, 12, 147, 13, 50, 139, 97, + 15, 197, 55, 153, 98, 108, 98, 174, 229, 250, 118, 246, 176, 206, 174, 62, 83, 174, 182, + 183, 75, 122, 167, 105, 110, 253, 26, 87, 227, 20, 65, 117, 65, 81, 147, 216, 131, 109, 13, + 225, 194, 178, 74, 125, 157, 212, 139, 106, 123, 73, 117, 71, 161, 218, 200, 5, 89, 103, 79, + 78, 4, 103, 94, 64, 50, 240, 4, 97, 208, 254, 218, 142, 204, 209, 53, 11, 154, 241, 104, + 182, 225, 116, 99, 109, 25, 102, 132, 140, 182, 92, 102, 210, 25, 237, 207, 229, 227, 241, + 220, 206, 180, 61, 188, 86, 196, 96, 29, 3, 57, 214, 99, 182, 132, 101, 174, 221, 230, 51, + 225, 253, 162, 171, 5, 212, 169, 116, 246, 38, 26, 99, 56, 123, 18, 121, 166, 28, 238, 202, + 199, 149, 195, 61, 125, 230, 217, 16, 110, 181, 135, 123, 205, 183, 84, 69, 77, 218, 9, 43, + 191, 12, 117, 230, 89, 220, 123, 227, 210, 170, 10, 171, 48, 10, 197, 16, 138, 136, 212, 13, + 37, 40, 253, 195, 103, 227, 68, 163, 178, 86, 151, 6, 169, 103, 39, 21, 146, 182, 96, 193, + 166, 80, 118, 82, 117, 109, 161, 130, 77, 133, 77, 119, 109, 113, 105, 19, 31, 44, 82, 245, + 48, 166, 24, 199, 109, 218, 24, 16, 203, 243, 180, 53, 156, 179, 45, 241, 112, 209, 34, 44, + 37, 190, 10, 87, 88, 43, 113, 149, 181, 230, 21, 213, 95, 201, 203, 217, 96, 130, 87, 176, + 132, 176, 63, 36, 236, 15, 185, 118, 191, 176, 7, 176, 49, 148, 69, 10, 38, 71, 156, 73, 57, + 155, 225, 156, 194, 134, 50, 41, 172, 184, 91, 81, 19, 33, 141, 73, 199, 233, 53, 35, 239, + 132, 111, 88, 17, 108, 181, 45, 160, 207, 228, 101, 13, 56, 251, 125, 209, 135, 225, 183, + 78, 96, 195, 188, 142, 143, 102, 51, 34, 15, 218, 108, 138, 182, 129, 104, 71, 214, 194, + 182, 45, 4, 132, 75, 7, 47, 67, 132, 50, 47, 2, 60, 218, 100, 27, 177, 29, 209, 40, 139, + 181, 193, 2, 202, 246, 163, 80, 248, 168, 197, 173, 6, 209, 169, 57, 98, 201, 237, 28, 226, + 212, 206, 214, 98, 217, 221, 152, 190, 90, 209, 81, 147, 149, 91, 192, 238, 149, 207, 38, + 30, 133, 242, 232, 33, 33, 202, 144, 27, 245, 152, 174, 37, 12, 21, 157, 89, 238, 36, 5, 42, + 145, 121, 150, 161, 42, 107, 27, 152, 109, 157, 178, 61, 216, 234, 238, 89, 90, 30, 118, 45, + 131, 56, 18, 245, 218, 65, 73, 121, 216, 171, 36, 49, 44, 45, 90, 81, 85, 206, 203, 86, 32, + 32, 190, 162, 92, 177, 66, 60, 146, 190, 104, 192, 178, 220, 228, 165, 118, 200, 115, 64, + 223, 33, 94, 129, 140, 106, 167, 76, 165, 215, 0, 179, 131, 170, 14, 145, 11, 190, 135, 144, + 170, 112, 61, 47, 194, 116, 77, 82, 55, 219, 135, 147, 69, 36, 45, 35, 5, 80, 205, 171, 162, + 29, 25, 28, 254, 110, 251, 10, 88, 216, 154, 66, 227, 160, 56, 35, 42, 188, 24, 23, 92, 107, + 64, 140, 188, 18, 243, 174, 69, 123, 39, 157, 31, 176, 175, 70, 166, 124, 26, 99, 76, 188, + 28, 196, 198, 164, 240, 89, 108, 108, 178, 114, 165, 6, 254, 104, 67, 99, 44, 88, 106, 173, + 146, 230, 92, 46, 88, 53, 123, 3, 119, 190, 130, 85, 69, 41, 140, 70, 26, 111, 13, 56, 42, + 192, 71, 180, 235, 193, 221, 103, 182, 206, 107, 185, 73, 119, 7, 229, 223, 164, 159, 254, + 227, 233, 139, 66, 158, 79, 92, 43, 187, 181, 234, 206, 87, 202, 222, 22, 255, 39, 169, 12, + 79, 131, 34, 29, 240, 235, 254, 255, 44, 223, 128, 250, 99, 101, 111, 123, 246, 226, 71, + 207, 232, 159, 249, 68, 83, 126, 7, 203, 56, 177, 185, 226, 15, 59, 23, 5, 122, 31, 77, 232, + 41, 202, 204, 202, 117, 212, 93, 167, 147, 186, 67, 97, 129, 118, 141, 38, 64, 218, 147, + 109, 30, 89, 176, 21, 60, 231, 217, 39, 180, 55, 104, 194, 87, 73, 143, 150, 162, 223, 66, + 60, 224, 139, 147, 161, 234, 52, 161, 234, 206, 195, 144, 117, 144, 159, 7, 171, 192, 38, + 176, 17, 124, 13, 246, 37, 96, 185, 254, 77, 248, 29, 167, 128, 122, 220, 121, 77, 175, 67, + 123, 160, 61, 38, 121, 78, 235, 247, 202, 59, 105, 177, 254, 56, 77, 248, 127, 143, 216, + 247, 204, 66, 0, 124, 145, 178, 159, 202, 70, 23, 255, 7, 148, 213, 107, 208, 23, 240, 245, + 163, 108, 162, 236, 210, 35, 36, 198, 183, 206, 227, 46, 80, 93, 212, 175, 210, 188, 169, + 248, 106, 232, 204, 92, 209, 115, 84, 19, 88, 66, 15, 150, 162, 47, 167, 149, 136, 181, 100, + 6, 63, 167, 47, 120, 124, 78, 202, 127, 83, 104, 174, 248, 182, 56, 239, 9, 116, 157, 198, + 181, 223, 210, 19, 179, 161, 15, 210, 56, 216, 174, 63, 69, 247, 10, 180, 81, 248, 142, 34, + 23, 87, 26, 30, 49, 80, 15, 18, 158, 125, 92, 219, 132, 118, 223, 160, 29, 51, 216, 7, 251, + 62, 58, 166, 159, 162, 184, 114, 157, 198, 149, 235, 142, 9, 121, 55, 100, 59, 88, 14, 54, + 131, 110, 176, 11, 246, 249, 160, 90, 15, 211, 184, 218, 74, 164, 182, 58, 199, 180, 95, 35, + 54, 80, 175, 72, 14, 169, 87, 189, 242, 63, 145, 219, 37, 26, 247, 251, 17, 255, 165, 34, + 99, 96, 159, 44, 15, 129, 51, 52, 244, 169, 252, 196, 5, 113, 134, 180, 95, 162, 47, 160, + 231, 81, 190, 129, 178, 75, 90, 202, 141, 212, 225, 226, 220, 4, 31, 22, 117, 139, 22, 107, + 150, 115, 199, 149, 216, 143, 199, 233, 52, 248, 174, 39, 79, 130, 61, 94, 121, 6, 218, 109, + 138, 248, 91, 105, 117, 41, 218, 69, 122, 64, 123, 30, 107, 86, 202, 8, 165, 60, 130, 82, + 94, 162, 45, 37, 44, 153, 197, 38, 241, 55, 185, 232, 205, 52, 134, 231, 167, 207, 99, 3, + 248, 82, 65, 15, 124, 153, 250, 252, 127, 2, 138, 11, 124, 109, 253, 24, 216, 14, 154, 41, + 163, 125, 76, 143, 205, 5, 117, 23, 69, 253, 47, 83, 52, 120, 137, 162, 250, 235, 40, 127, + 199, 43, 183, 148, 176, 177, 4, 207, 238, 223, 91, 194, 145, 18, 60, 251, 52, 255, 50, 244, + 145, 156, 18, 251, 249, 79, 234, 244, 27, 46, 190, 207, 82, 52, 80, 71, 81, 237, 2, 221, 95, + 138, 28, 235, 76, 198, 244, 102, 231, 13, 61, 233, 124, 164, 92, 166, 131, 202, 101, 231, + 73, 200, 121, 144, 125, 192, 0, 187, 129, 9, 182, 193, 62, 31, 140, 105, 231, 232, 160, 190, + 132, 14, 43, 127, 119, 46, 121, 100, 181, 239, 195, 238, 33, 124, 192, 61, 234, 98, 41, 59, + 149, 143, 105, 177, 122, 155, 198, 252, 3, 162, 175, 105, 108, 144, 242, 85, 231, 148, 148, + 107, 176, 30, 211, 217, 56, 195, 214, 226, 226, 191, 40, 215, 174, 16, 199, 86, 127, 67, 99, + 46, 206, 71, 144, 79, 106, 17, 234, 114, 193, 190, 141, 56, 183, 11, 186, 239, 77, 23, 196, + 26, 83, 254, 5, 255, 55, 41, 162, 94, 0, 66, 254, 140, 106, 245, 171, 20, 209, 247, 204, 13, + 204, 117, 36, 208, 137, 253, 253, 199, 185, 129, 60, 79, 128, 23, 61, 249, 2, 88, 15, 142, + 120, 229, 19, 83, 209, 78, 81, 141, 111, 146, 238, 47, 69, 123, 10, 103, 210, 105, 170, 153, + 65, 61, 89, 30, 1, 41, 215, 208, 110, 45, 67, 3, 218, 62, 236, 213, 9, 74, 169, 127, 163, + 29, 234, 6, 41, 219, 213, 73, 90, 167, 156, 167, 101, 234, 73, 172, 209, 251, 180, 67, 201, + 82, 70, 121, 194, 249, 3, 244, 29, 202, 227, 56, 207, 30, 129, 239, 85, 73, 90, 182, 67, 27, + 229, 67, 200, 149, 148, 80, 254, 66, 76, 180, 81, 15, 210, 82, 237, 3, 138, 169, 207, 226, + 29, 247, 2, 45, 85, 87, 83, 66, 237, 197, 121, 182, 7, 156, 16, 111, 237, 219, 184, 12, 220, + 186, 166, 62, 50, 211, 134, 252, 72, 219, 10, 164, 237, 214, 105, 176, 173, 196, 118, 10, + 140, 40, 14, 244, 151, 193, 171, 224, 135, 210, 62, 8, 108, 109, 25, 226, 221, 132, 173, 13, + 108, 147, 246, 87, 192, 179, 218, 114, 232, 29, 96, 123, 49, 198, 51, 90, 37, 244, 121, 96, + 190, 180, 77, 128, 215, 212, 151, 208, 254, 219, 224, 21, 105, 123, 31, 188, 167, 226, 142, + 161, 254, 2, 252, 24, 190, 231, 193, 159, 113, 231, 144, 183, 143, 91, 221, 96, 149, 242, + 46, 238, 33, 151, 193, 187, 46, 24, 203, 122, 1, 198, 118, 0, 114, 191, 250, 117, 41, 247, + 42, 255, 161, 3, 234, 170, 194, 125, 197, 57, 34, 238, 32, 90, 15, 222, 175, 7, 104, 173, + 123, 135, 184, 243, 43, 241, 78, 115, 239, 11, 119, 190, 39, 222, 205, 238, 125, 225, 14, + 254, 94, 56, 221, 242, 30, 240, 45, 90, 86, 120, 223, 99, 142, 123, 220, 119, 184, 179, 72, + 182, 193, 123, 91, 123, 253, 191, 164, 151, 9, 116, 22, 213, 25, 134, 191, 59, 203, 159, 16, + 48, 236, 36, 33, 36, 236, 16, 9, 107, 128, 24, 89, 3, 33, 144, 133, 132, 132, 16, 118, 18, + 18, 150, 176, 203, 18, 32, 162, 32, 160, 128, 136, 88, 74, 89, 10, 20, 83, 169, 216, 210, + 178, 254, 32, 96, 197, 181, 212, 138, 212, 214, 5, 75, 91, 91, 41, 197, 182, 46, 96, 45, + 150, 66, 32, 38, 190, 51, 223, 255, 34, 231, 212, 158, 227, 57, 229, 156, 247, 188, 207, + 220, 153, 59, 204, 252, 247, 155, 251, 189, 65, 54, 209, 62, 140, 126, 89, 51, 207, 243, 64, + 99, 252, 159, 232, 167, 1, 145, 77, 110, 158, 20, 185, 121, 53, 85, 218, 19, 107, 23, 123, + 189, 208, 186, 229, 247, 152, 182, 218, 203, 106, 222, 246, 246, 86, 237, 91, 53, 231, 156, + 99, 50, 93, 251, 86, 205, 11, 232, 81, 163, 252, 126, 116, 81, 26, 178, 239, 216, 235, 164, + 72, 123, 73, 109, 95, 111, 142, 223, 67, 38, 72, 182, 223, 15, 252, 125, 187, 102, 143, 231, + 46, 126, 41, 111, 95, 119, 199, 202, 58, 175, 191, 56, 71, 106, 203, 208, 251, 75, 124, 165, + 226, 59, 77, 66, 61, 110, 70, 239, 235, 142, 235, 246, 162, 70, 33, 235, 117, 236, 1, 195, + 113, 206, 211, 32, 236, 71, 21, 18, 176, 146, 100, 139, 149, 84, 123, 25, 90, 6, 213, 247, + 247, 149, 99, 120, 191, 233, 240, 237, 168, 117, 75, 114, 108, 27, 223, 14, 247, 132, 57, + 146, 224, 52, 146, 37, 152, 63, 14, 235, 63, 209, 142, 17, 219, 41, 148, 77, 33, 45, 135, + 154, 185, 201, 82, 232, 246, 149, 66, 188, 119, 35, 119, 159, 108, 113, 55, 203, 84, 79, + 214, 122, 127, 45, 35, 240, 91, 121, 107, 157, 108, 185, 178, 253, 182, 218, 161, 238, 107, + 101, 158, 39, 127, 61, 115, 228, 128, 191, 158, 243, 67, 90, 130, 53, 234, 40, 246, 29, 217, + 177, 36, 48, 3, 255, 199, 27, 146, 237, 122, 249, 42, 164, 80, 30, 204, 243, 178, 222, 237, + 188, 117, 73, 236, 192, 77, 232, 188, 230, 198, 48, 251, 235, 28, 231, 84, 233, 58, 123, 57, + 149, 217, 11, 239, 169, 58, 137, 125, 97, 139, 174, 181, 219, 2, 215, 92, 131, 22, 74, 121, + 224, 42, 238, 17, 15, 254, 84, 234, 7, 162, 225, 169, 80, 169, 76, 114, 74, 164, 52, 44, 28, + 188, 0, 249, 174, 22, 243, 175, 34, 187, 161, 176, 253, 218, 248, 76, 246, 248, 57, 169, 73, + 72, 29, 177, 222, 43, 37, 242, 142, 60, 212, 217, 173, 64, 15, 94, 41, 99, 156, 245, 56, + 183, 94, 182, 65, 91, 67, 25, 167, 208, 203, 47, 120, 215, 167, 60, 97, 109, 141, 95, 47, + 21, 161, 76, 178, 15, 154, 21, 170, 21, 47, 119, 49, 71, 236, 70, 205, 238, 70, 230, 238, + 134, 247, 136, 208, 122, 113, 158, 192, 156, 153, 184, 238, 166, 204, 13, 180, 69, 222, 73, + 199, 113, 177, 68, 185, 15, 99, 236, 35, 232, 67, 153, 109, 127, 142, 252, 146, 4, 174, 69, + 127, 47, 150, 150, 206, 20, 8, 95, 32, 122, 184, 241, 199, 209, 255, 157, 52, 252, 46, 94, + 109, 189, 135, 125, 253, 116, 72, 96, 212, 68, 38, 114, 94, 148, 215, 39, 238, 236, 225, + 184, 255, 0, 100, 130, 108, 167, 0, 181, 87, 128, 76, 85, 128, 158, 166, 61, 112, 161, 215, + 215, 236, 227, 152, 11, 57, 77, 165, 89, 192, 146, 198, 238, 76, 41, 118, 134, 161, 143, 37, + 132, 122, 85, 15, 168, 211, 215, 253, 204, 207, 24, 94, 159, 137, 145, 8, 175, 215, 133, + 246, 230, 104, 251, 29, 105, 227, 212, 96, 28, 123, 55, 106, 113, 135, 211, 211, 239, 161, + 131, 221, 115, 178, 195, 173, 193, 113, 150, 68, 184, 163, 48, 246, 42, 180, 1, 181, 189, + 17, 207, 246, 26, 248, 172, 164, 56, 5, 181, 85, 94, 111, 198, 122, 71, 219, 243, 240, 110, + 33, 161, 86, 247, 122, 178, 118, 153, 8, 107, 151, 188, 228, 201, 126, 86, 214, 64, 69, 190, + 62, 64, 109, 79, 150, 43, 208, 17, 123, 170, 44, 67, 47, 40, 70, 29, 119, 242, 106, 26, 122, + 222, 171, 111, 119, 173, 108, 195, 216, 227, 222, 56, 29, 107, 244, 40, 148, 72, 15, 141, + 37, 90, 199, 165, 28, 122, 153, 238, 196, 32, 243, 197, 224, 123, 8, 185, 29, 37, 198, 186, + 128, 158, 112, 200, 60, 102, 87, 155, 131, 56, 174, 139, 227, 46, 214, 34, 244, 16, 200, + 174, 70, 158, 132, 194, 6, 200, 214, 59, 133, 177, 42, 187, 90, 94, 185, 253, 205, 205, 149, + 53, 208, 50, 171, 28, 239, 84, 46, 227, 173, 71, 100, 52, 180, 216, 74, 197, 190, 154, 138, + 241, 44, 57, 12, 149, 253, 175, 235, 112, 175, 39, 161, 165, 80, 5, 180, 196, 57, 44, 179, + 157, 254, 200, 3, 213, 50, 11, 234, 111, 78, 203, 6, 187, 183, 108, 112, 209, 147, 92, 244, + 166, 176, 235, 16, 250, 70, 88, 63, 245, 192, 1, 57, 228, 9, 127, 127, 174, 116, 159, 150, + 129, 238, 126, 201, 193, 251, 10, 230, 14, 116, 142, 162, 142, 34, 241, 123, 84, 227, 123, + 136, 244, 179, 211, 88, 240, 115, 80, 22, 142, 11, 224, 115, 241, 91, 36, 130, 123, 217, 95, + 160, 87, 87, 226, 251, 125, 17, 127, 63, 86, 226, 186, 74, 228, 180, 214, 146, 25, 222, 19, + 123, 69, 53, 246, 247, 75, 168, 241, 134, 18, 231, 108, 145, 98, 235, 44, 246, 229, 203, 82, + 10, 229, 163, 62, 218, 216, 231, 225, 201, 178, 194, 14, 34, 179, 37, 99, 63, 72, 70, 109, + 71, 74, 6, 116, 16, 90, 8, 149, 65, 173, 160, 105, 208, 108, 104, 10, 52, 210, 87, 26, 126, + 155, 141, 18, 99, 175, 194, 62, 184, 8, 251, 225, 126, 233, 96, 207, 192, 115, 156, 192, + 111, 144, 41, 221, 80, 27, 217, 246, 41, 25, 137, 231, 201, 131, 54, 66, 211, 160, 82, 168, + 15, 84, 230, 63, 115, 37, 234, 167, 18, 245, 138, 107, 254, 235, 249, 18, 190, 245, 243, + 117, 255, 166, 231, 195, 247, 145, 97, 110, 32, 67, 28, 150, 108, 235, 128, 12, 178, 222, + 151, 246, 214, 51, 168, 145, 11, 50, 1, 125, 57, 201, 186, 136, 241, 11, 200, 41, 159, 72, + 62, 60, 223, 122, 75, 198, 152, 83, 50, 25, 26, 251, 255, 204, 181, 118, 75, 138, 185, 38, + 61, 172, 145, 210, 207, 202, 68, 93, 102, 73, 19, 107, 40, 230, 228, 75, 119, 43, 69, 218, + 88, 99, 112, 175, 28, 220, 251, 219, 94, 119, 164, 54, 219, 110, 44, 67, 220, 98, 8, 189, + 212, 141, 10, 121, 87, 168, 0, 58, 35, 185, 190, 202, 100, 152, 123, 2, 218, 3, 189, 41, 29, + 221, 229, 146, 14, 78, 71, 111, 247, 242, 92, 70, 120, 174, 100, 96, 108, 98, 216, 25, 172, + 87, 53, 250, 122, 181, 12, 135, 38, 67, 137, 80, 81, 136, 199, 65, 248, 134, 176, 86, 122, + 190, 16, 26, 237, 213, 179, 251, 177, 116, 118, 92, 233, 29, 120, 87, 102, 98, 237, 75, 172, + 43, 200, 127, 213, 18, 238, 229, 13, 47, 7, 120, 61, 51, 48, 13, 123, 241, 40, 153, 224, 52, + 147, 44, 124, 115, 59, 161, 109, 208, 25, 95, 145, 114, 40, 44, 210, 244, 161, 71, 228, 202, + 206, 64, 10, 254, 118, 155, 46, 9, 98, 176, 159, 150, 200, 1, 9, 147, 253, 144, 37, 13, 164, + 155, 32, 129, 181, 141, 54, 171, 17, 142, 140, 216, 126, 64, 146, 218, 104, 89, 43, 223, + 240, 47, 88, 199, 110, 117, 210, 122, 228, 88, 157, 104, 147, 5, 120, 152, 176, 154, 176, + 138, 176, 146, 240, 16, 97, 5, 97, 57, 225, 65, 194, 3, 132, 101, 132, 251, 9, 21, 132, 165, + 132, 37, 132, 197, 132, 114, 194, 34, 194, 2, 194, 124, 194, 125, 132, 121, 132, 185, 132, + 57, 132, 217, 132, 89, 132, 153, 132, 25, 132, 50, 194, 116, 194, 52, 194, 84, 194, 20, 66, + 41, 161, 132, 48, 153, 80, 76, 40, 34, 76, 34, 76, 36, 76, 32, 140, 39, 140, 35, 140, 37, + 140, 33, 140, 38, 20, 18, 70, 17, 10, 8, 35, 9, 249, 132, 60, 194, 8, 66, 46, 33, 135, 48, + 156, 144, 77, 200, 34, 100, 18, 50, 8, 195, 8, 67, 9, 233, 132, 33, 132, 52, 194, 96, 194, + 32, 66, 42, 97, 32, 97, 0, 161, 63, 161, 31, 161, 47, 161, 15, 225, 94, 66, 10, 225, 30, 66, + 50, 161, 55, 161, 23, 161, 39, 33, 137, 208, 131, 208, 157, 208, 141, 208, 149, 208, 133, + 208, 153, 144, 72, 232, 68, 184, 155, 144, 64, 232, 72, 232, 64, 104, 79, 104, 71, 104, 75, + 104, 67, 104, 77, 104, 69, 104, 73, 136, 39, 196, 17, 90, 16, 98, 9, 205, 9, 49, 132, 104, + 66, 20, 161, 25, 161, 41, 161, 9, 161, 49, 161, 17, 161, 33, 161, 1, 161, 62, 33, 146, 112, + 23, 161, 30, 161, 46, 33, 130, 80, 135, 16, 78, 8, 35, 4, 8, 46, 193, 33, 216, 4, 139, 96, + 8, 18, 2, 83, 75, 168, 33, 124, 73, 168, 38, 220, 34, 220, 36, 84, 17, 110, 16, 174, 19, + 254, 67, 184, 70, 248, 55, 225, 11, 194, 85, 194, 191, 8, 159, 19, 254, 73, 248, 140, 112, + 133, 112, 153, 240, 41, 225, 19, 194, 199, 132, 143, 8, 255, 32, 252, 157, 240, 55, 194, + 135, 132, 75, 132, 191, 18, 46, 18, 254, 66, 184, 64, 248, 128, 240, 103, 194, 159, 8, 239, + 19, 254, 72, 248, 3, 225, 247, 132, 243, 132, 223, 17, 222, 35, 156, 35, 188, 75, 120, 135, + 240, 54, 225, 45, 194, 111, 9, 191, 33, 188, 73, 248, 53, 225, 44, 225, 13, 194, 25, 194, + 235, 132, 95, 17, 94, 35, 252, 146, 112, 154, 240, 11, 194, 171, 132, 87, 8, 47, 19, 94, 34, + 188, 72, 120, 129, 112, 138, 240, 60, 225, 231, 132, 231, 8, 39, 9, 39, 8, 199, 9, 207, 18, + 142, 17, 142, 18, 130, 132, 35, 132, 195, 132, 67, 132, 131, 132, 3, 132, 253, 132, 159, 17, + 126, 74, 216, 71, 248, 9, 225, 199, 132, 103, 8, 123, 9, 79, 19, 126, 68, 216, 67, 120, 138, + 240, 67, 66, 37, 225, 73, 194, 110, 194, 15, 8, 187, 8, 59, 9, 59, 8, 223, 39, 108, 39, 108, + 35, 108, 37, 108, 33, 124, 143, 176, 153, 240, 93, 194, 38, 194, 119, 8, 79, 16, 54, 18, 30, + 39, 108, 32, 60, 70, 88, 79, 120, 148, 176, 142, 176, 150, 176, 134, 192, 216, 99, 24, 123, + 12, 99, 143, 97, 236, 49, 140, 61, 134, 177, 199, 48, 246, 24, 198, 30, 195, 216, 99, 24, + 123, 12, 99, 143, 97, 236, 49, 140, 61, 134, 177, 199, 48, 246, 24, 198, 30, 195, 216, 99, + 24, 123, 204, 66, 2, 243, 143, 97, 254, 49, 204, 63, 134, 249, 199, 48, 255, 24, 230, 31, + 195, 252, 99, 152, 127, 12, 243, 143, 97, 254, 49, 204, 63, 134, 249, 199, 48, 255, 24, 230, + 31, 195, 252, 99, 152, 127, 12, 243, 143, 97, 254, 49, 204, 63, 134, 249, 199, 48, 255, 24, + 230, 31, 195, 252, 99, 152, 127, 12, 243, 143, 97, 254, 49, 204, 63, 134, 249, 199, 48, 255, + 24, 230, 31, 195, 252, 99, 152, 127, 12, 99, 143, 97, 236, 49, 140, 61, 134, 105, 199, 48, + 237, 24, 166, 29, 195, 180, 99, 152, 118, 12, 211, 142, 97, 218, 49, 76, 59, 134, 105, 199, + 164, 29, 245, 0, 169, 57, 24, 63, 160, 37, 50, 115, 48, 190, 41, 108, 181, 30, 173, 10, 198, + 247, 129, 173, 212, 163, 135, 212, 86, 4, 227, 235, 193, 150, 235, 209, 131, 106, 15, 168, + 45, 83, 187, 63, 24, 55, 8, 86, 17, 140, 75, 131, 45, 85, 91, 162, 182, 88, 207, 149, 235, + 209, 34, 181, 133, 58, 184, 32, 24, 55, 24, 54, 95, 237, 62, 181, 121, 122, 201, 92, 181, + 57, 106, 179, 131, 45, 210, 97, 179, 212, 102, 170, 205, 80, 43, 83, 155, 30, 108, 49, 4, + 54, 77, 143, 166, 170, 77, 81, 43, 85, 43, 81, 155, 172, 86, 172, 86, 164, 243, 38, 233, + 209, 68, 181, 9, 106, 227, 213, 198, 169, 141, 85, 27, 163, 54, 90, 173, 80, 109, 148, 90, + 129, 218, 72, 181, 124, 181, 60, 181, 17, 106, 185, 106, 57, 106, 195, 213, 178, 213, 178, + 130, 177, 153, 176, 76, 181, 140, 96, 108, 22, 108, 152, 218, 208, 96, 108, 54, 44, 61, 24, + 59, 28, 54, 68, 45, 77, 109, 176, 158, 27, 164, 243, 82, 213, 6, 234, 188, 1, 106, 253, 213, + 250, 233, 149, 125, 213, 250, 232, 244, 123, 213, 82, 212, 238, 81, 75, 86, 235, 173, 55, + 235, 165, 214, 83, 239, 146, 164, 214, 67, 173, 187, 222, 172, 155, 90, 87, 157, 215, 69, + 173, 179, 90, 162, 90, 39, 181, 187, 213, 18, 212, 58, 234, 173, 59, 168, 181, 215, 123, + 182, 83, 107, 171, 214, 70, 111, 221, 90, 173, 149, 206, 107, 169, 22, 175, 22, 167, 214, + 66, 45, 86, 173, 121, 176, 121, 46, 44, 70, 45, 58, 216, 124, 4, 44, 74, 173, 153, 14, 54, + 85, 107, 162, 131, 141, 213, 26, 169, 53, 212, 115, 13, 212, 234, 235, 96, 164, 218, 93, + 106, 245, 244, 92, 93, 181, 8, 181, 58, 122, 46, 92, 45, 76, 45, 16, 140, 201, 131, 185, + 193, 152, 124, 152, 163, 102, 235, 160, 165, 71, 70, 77, 124, 51, 181, 106, 53, 254, 37, + 230, 75, 61, 170, 86, 187, 165, 118, 83, 207, 85, 233, 209, 13, 181, 235, 95, 81, 91, 159, + 241, 77, 85, 13, 28, 199, 115, 18, 68, 108, 154, 38, 193, 164, 131, 130, 23, 7, 40, 22, 20, + 156, 113, 18, 86, 0, 43, 179, 189, 208, 22, 41, 2, 133, 50, 68, 36, 109, 68, 70, 161, 10, 8, + 14, 134, 3, 183, 44, 25, 106, 20, 210, 203, 16, 5, 100, 8, 10, 202, 112, 47, 84, 112, 129, + 27, 84, 220, 163, 254, 194, 255, 121, 237, 219, 231, 121, 10, 223, 252, 238, 57, 247, 220, + 211, 132, 79, 15, 160, 252, 172, 252, 228, 228, 22, 147, 99, 78, 110, 17, 249, 81, 163, 31, + 148, 239, 149, 163, 186, 119, 68, 163, 239, 148, 111, 149, 111, 116, 239, 107, 229, 43, 77, + 126, 169, 124, 161, 28, 86, 14, 105, 201, 231, 26, 125, 166, 209, 167, 26, 125, 162, 124, + 172, 28, 212, 189, 3, 202, 71, 154, 252, 80, 249, 64, 217, 175, 188, 175, 37, 239, 105, 244, + 174, 242, 142, 147, 211, 159, 188, 237, 228, 244, 35, 111, 41, 111, 106, 242, 13, 229, 117, + 229, 53, 229, 85, 45, 217, 167, 236, 213, 228, 30, 101, 183, 242, 138, 242, 178, 150, 236, + 82, 118, 106, 242, 37, 229, 69, 101, 135, 178, 93, 121, 65, 43, 183, 105, 180, 85, 217, 162, + 108, 214, 189, 231, 149, 77, 154, 220, 168, 108, 80, 158, 83, 158, 85, 214, 107, 229, 51, + 26, 173, 83, 214, 42, 107, 148, 213, 78, 118, 123, 226, 56, 217, 3, 72, 157, 146, 82, 86, + 41, 43, 149, 167, 149, 167, 148, 164, 242, 164, 147, 205, 223, 215, 230, 9, 237, 242, 184, + 178, 66, 247, 150, 43, 203, 148, 165, 202, 99, 202, 18, 101, 177, 178, 72, 89, 168, 205, 22, + 104, 151, 71, 149, 71, 116, 239, 97, 229, 33, 229, 65, 229, 1, 61, 112, 191, 70, 247, 41, + 243, 149, 123, 117, 239, 30, 237, 114, 183, 114, 151, 238, 205, 83, 230, 42, 115, 148, 217, + 202, 157, 90, 121, 135, 70, 183, 43, 183, 41, 179, 148, 153, 202, 173, 78, 120, 48, 153, + 225, 132, 135, 144, 233, 202, 52, 39, 60, 156, 220, 162, 220, 236, 132, 109, 82, 235, 132, + 249, 203, 216, 76, 117, 194, 23, 145, 41, 74, 141, 30, 159, 172, 231, 38, 41, 19, 157, 112, + 5, 153, 160, 199, 111, 82, 198, 43, 55, 42, 9, 165, 90, 169, 210, 214, 113, 61, 62, 78, 185, + 193, 9, 15, 37, 99, 181, 217, 245, 90, 57, 70, 185, 78, 25, 173, 140, 82, 70, 234, 185, 17, + 74, 165, 222, 217, 112, 61, 62, 76, 169, 208, 202, 161, 202, 16, 101, 176, 114, 173, 50, 72, + 41, 215, 135, 30, 168, 119, 118, 141, 50, 64, 31, 186, 76, 91, 151, 234, 27, 149, 40, 253, + 245, 118, 251, 233, 27, 217, 218, 165, 88, 41, 82, 250, 42, 125, 156, 80, 148, 244, 118, 66, + 233, 239, 208, 203, 9, 165, 127, 188, 123, 58, 161, 105, 164, 135, 19, 106, 67, 174, 214, + 146, 66, 229, 42, 39, 196, 255, 11, 76, 119, 141, 186, 41, 93, 53, 25, 115, 66, 83, 72, 23, + 39, 52, 147, 116, 118, 66, 83, 73, 39, 39, 84, 75, 58, 58, 141, 99, 164, 131, 18, 85, 218, + 43, 87, 58, 141, 249, 247, 221, 92, 161, 209, 229, 78, 176, 148, 92, 166, 92, 234, 4, 211, + 63, 26, 151, 40, 17, 39, 216, 149, 92, 236, 4, 75, 200, 69, 78, 176, 140, 92, 168, 123, 23, + 40, 231, 59, 193, 214, 228, 60, 173, 108, 231, 4, 211, 31, 172, 173, 19, 76, 159, 205, 115, + 149, 115, 244, 120, 27, 125, 135, 214, 74, 129, 54, 59, 91, 105, 165, 205, 206, 82, 206, 84, + 90, 42, 45, 156, 96, 250, 79, 233, 12, 229, 116, 237, 121, 154, 246, 60, 85, 155, 53, 215, + 46, 150, 114, 138, 158, 107, 166, 52, 85, 242, 149, 38, 74, 158, 19, 24, 72, 114, 157, 64, + 57, 201, 113, 2, 131, 72, 182, 18, 86, 66, 202, 201, 74, 99, 61, 16, 212, 3, 1, 77, 250, + 149, 44, 197, 167, 100, 106, 165, 87, 43, 51, 52, 121, 146, 210, 72, 57, 81, 105, 168, 149, + 39, 104, 101, 3, 77, 122, 20, 183, 98, 20, 87, 180, 222, 63, 196, 74, 251, 219, 63, 212, + 250, 203, 95, 97, 253, 201, 245, 31, 248, 29, 191, 49, 247, 43, 115, 191, 224, 103, 252, + 132, 99, 204, 255, 136, 31, 184, 247, 61, 227, 163, 56, 130, 239, 240, 45, 243, 223, 224, + 107, 238, 125, 197, 248, 75, 124, 129, 195, 56, 148, 85, 105, 125, 158, 53, 194, 250, 12, + 159, 226, 19, 124, 204, 220, 65, 122, 0, 31, 225, 67, 198, 31, 208, 253, 120, 31, 239, 225, + 93, 223, 104, 235, 29, 95, 59, 235, 109, 250, 150, 239, 58, 235, 77, 95, 75, 235, 13, 188, + 206, 245, 107, 190, 2, 235, 85, 236, 195, 94, 238, 239, 97, 110, 183, 111, 140, 245, 10, + 215, 47, 115, 189, 139, 235, 157, 190, 81, 214, 75, 190, 145, 214, 139, 190, 17, 214, 14, + 95, 165, 181, 157, 103, 95, 96, 191, 109, 216, 138, 104, 253, 22, 94, 55, 227, 121, 108, + 202, 28, 103, 109, 204, 140, 91, 27, 50, 171, 172, 231, 50, 171, 173, 103, 177, 30, 207, 48, + 191, 14, 107, 185, 183, 134, 123, 171, 153, 115, 80, 135, 20, 86, 121, 39, 88, 43, 189, 19, + 173, 167, 189, 147, 173, 167, 188, 53, 86, 210, 59, 197, 122, 18, 79, 224, 113, 172, 192, + 114, 44, 243, 182, 177, 150, 210, 199, 176, 132, 103, 22, 211, 69, 222, 209, 214, 66, 174, + 23, 112, 253, 40, 30, 225, 250, 97, 246, 122, 136, 189, 30, 100, 175, 7, 152, 187, 31, 247, + 97, 62, 238, 197, 61, 184, 155, 231, 238, 98, 191, 121, 25, 61, 173, 185, 25, 189, 172, 57, + 25, 149, 214, 236, 140, 101, 214, 157, 25, 43, 172, 25, 158, 22, 214, 116, 79, 196, 154, + 102, 34, 214, 45, 118, 173, 125, 115, 178, 214, 158, 106, 215, 216, 83, 146, 53, 182, 183, + 198, 120, 107, 242, 107, 10, 107, 38, 213, 36, 107, 246, 215, 68, 123, 52, 204, 152, 108, + 79, 180, 39, 37, 39, 218, 19, 236, 241, 246, 77, 201, 241, 246, 141, 201, 132, 221, 32, 17, + 74, 84, 39, 60, 199, 18, 38, 153, 48, 157, 19, 166, 109, 194, 184, 93, 137, 64, 162, 121, + 194, 147, 89, 109, 199, 237, 170, 100, 220, 118, 197, 123, 199, 107, 227, 169, 120, 131, + 203, 82, 241, 131, 113, 183, 43, 110, 50, 214, 215, 111, 89, 29, 207, 63, 37, 70, 163, 147, + 227, 190, 64, 108, 156, 61, 214, 190, 33, 57, 214, 190, 126, 248, 24, 123, 20, 111, 107, + 100, 164, 210, 30, 145, 172, 180, 135, 71, 42, 236, 97, 201, 10, 123, 104, 100, 136, 61, 56, + 114, 173, 61, 40, 50, 208, 46, 79, 14, 180, 175, 137, 148, 217, 3, 146, 101, 118, 105, 164, + 196, 238, 207, 250, 126, 145, 98, 219, 78, 22, 219, 69, 145, 62, 118, 223, 100, 31, 187, 87, + 164, 167, 221, 147, 249, 30, 145, 66, 251, 234, 100, 161, 125, 85, 164, 155, 221, 61, 217, + 205, 238, 26, 137, 217, 93, 248, 200, 174, 166, 129, 166, 205, 155, 122, 2, 233, 55, 208, + 179, 41, 239, 196, 149, 111, 58, 182, 205, 143, 230, 31, 204, 63, 154, 223, 192, 149, 159, + 202, 223, 146, 239, 105, 236, 111, 98, 53, 113, 183, 242, 231, 153, 78, 189, 242, 204, 216, + 188, 169, 121, 115, 243, 60, 254, 220, 125, 185, 238, 104, 110, 171, 214, 49, 127, 206, 190, + 156, 3, 57, 71, 114, 26, 156, 28, 205, 105, 117, 78, 204, 149, 29, 200, 110, 158, 237, 9, + 167, 63, 91, 118, 143, 226, 216, 241, 182, 239, 172, 182, 187, 240, 248, 103, 237, 145, 125, + 122, 203, 152, 63, 108, 252, 97, 43, 236, 238, 98, 133, 141, 43, 120, 48, 120, 52, 232, 9, + 111, 14, 236, 11, 184, 253, 126, 227, 247, 215, 251, 221, 81, 63, 203, 253, 89, 86, 150, 59, + 253, 82, 159, 229, 137, 102, 181, 187, 56, 230, 247, 89, 62, 119, 250, 165, 222, 231, 201, + 142, 250, 152, 73, 239, 120, 102, 102, 239, 226, 152, 223, 107, 121, 221, 118, 123, 111, 47, + 175, 59, 234, 109, 223, 41, 22, 245, 182, 105, 27, 115, 121, 76, 115, 99, 92, 38, 64, 60, + 141, 88, 187, 198, 132, 173, 152, 103, 35, 83, 46, 215, 9, 46, 99, 230, 213, 21, 23, 21, 20, + 20, 174, 111, 228, 234, 91, 152, 106, 212, 123, 64, 202, 204, 74, 181, 40, 74, 191, 70, 251, + 148, 165, 26, 206, 74, 185, 236, 178, 1, 37, 117, 198, 204, 41, 173, 51, 238, 78, 197, 169, + 80, 97, 159, 50, 141, 103, 204, 158, 237, 106, 214, 177, 48, 213, 172, 168, 196, 241, 44, + 90, 212, 172, 99, 105, 97, 170, 54, 125, 29, 141, 30, 191, 174, 79, 95, 187, 88, 82, 90, 80, + 94, 149, 168, 42, 40, 168, 46, 231, 165, 188, 170, 186, 224, 248, 111, 70, 38, 145, 30, 21, + 164, 39, 211, 191, 171, 170, 25, 167, 127, 37, 142, 143, 93, 5, 255, 250, 165, 101, 100, 80, + 21, 95, 213, 255, 153, 171, 254, 247, 135, 254, 215, 191, 204, 127, 251, 13, 252, 255, 127, + 213, 185, 248, 49, 45, 233, 80, 239, 158, 238, 170, 112, 79, 195, 45, 184, 25, 181, 152, + 138, 41, 168, 193, 100, 76, 194, 68, 76, 192, 77, 24, 143, 27, 145, 64, 53, 170, 48, 14, 55, + 96, 44, 174, 199, 24, 92, 135, 209, 24, 133, 145, 24, 129, 74, 12, 199, 48, 84, 96, 40, 134, + 96, 48, 174, 197, 32, 148, 99, 32, 174, 193, 0, 148, 161, 20, 37, 232, 143, 126, 176, 81, + 140, 34, 244, 69, 31, 244, 70, 47, 244, 68, 15, 92, 141, 66, 92, 133, 238, 232, 134, 174, + 136, 161, 11, 58, 163, 19, 58, 162, 3, 162, 104, 143, 43, 113, 5, 46, 199, 101, 184, 20, + 151, 32, 130, 139, 113, 17, 46, 196, 5, 56, 31, 231, 161, 29, 218, 226, 92, 156, 131, 54, + 104, 141, 2, 156, 141, 86, 56, 11, 103, 162, 37, 90, 224, 12, 156, 142, 211, 112, 42, 154, + 195, 194, 41, 104, 134, 166, 200, 71, 19, 228, 33, 23, 57, 200, 70, 24, 33, 156, 140, 198, + 8, 34, 0, 63, 178, 224, 67, 38, 188, 200, 192, 73, 104, 132, 19, 209, 16, 39, 160, 65, 135, + 122, 94, 61, 112, 195, 192, 229, 170, 48, 204, 153, 191, 241, 23, 254, 196, 31, 248, 29, + 191, 225, 87, 252, 130, 159, 241, 19, 142, 225, 71, 252, 128, 239, 113, 20, 71, 240, 29, + 190, 197, 55, 248, 26, 95, 225, 75, 124, 129, 195, 56, 132, 207, 241, 25, 62, 197, 39, 248, + 24, 7, 113, 0, 31, 225, 67, 124, 128, 253, 120, 31, 239, 225, 93, 188, 131, 183, 241, 22, + 222, 196, 27, 120, 29, 175, 225, 85, 236, 195, 94, 236, 193, 110, 188, 130, 151, 177, 11, + 59, 241, 18, 94, 196, 14, 108, 199, 11, 216, 134, 173, 216, 130, 205, 120, 30, 155, 176, 17, + 27, 240, 28, 158, 197, 122, 60, 131, 117, 88, 139, 53, 88, 13, 7, 117, 72, 97, 21, 86, 226, + 105, 60, 133, 36, 158, 196, 19, 120, 28, 43, 176, 28, 203, 176, 20, 143, 97, 9, 22, 99, 17, + 22, 98, 1, 30, 197, 35, 120, 24, 15, 225, 65, 60, 128, 251, 113, 31, 230, 227, 94, 220, 131, + 187, 113, 23, 230, 97, 46, 230, 96, 54, 238, 196, 29, 184, 29, 183, 97, 22, 102, 226, 86, + 204, 112, 85, 116, 168, 53, 156, 127, 195, 249, 55, 156, 127, 195, 249, 55, 156, 127, 195, + 249, 55, 156, 127, 195, 249, 55, 156, 127, 195, 249, 55, 156, 127, 195, 249, 55, 156, 127, + 195, 249, 55, 156, 127, 195, 249, 255, 135, 154, 58, 182, 1, 24, 134, 129, 32, 230, 219, + 194, 171, 165, 73, 118, 200, 254, 133, 185, 133, 161, 7, 212, 171, 57, 166, 255, 244, 223, + 239, 24, 16, 3, 98, 64, 12, 136, 1, 49, 32, 6, 196, 128, 24, 16, 3, 98, 64, 12, 136, 1, 49, + 32, 6, 196, 128, 24, 16, 3, 98, 64, 12, 136, 1, 49, 32, 6, 196, 128, 24, 16, 3, 98, 64, 12, + 136, 1, 49, 32, 6, 196, 128, 244, 159, 254, 211, 127, 218, 79, 251, 105, 63, 237, 167, 253, + 180, 159, 246, 211, 126, 218, 79, 251, 183, 29, 30, 190, 231, 246, 3, 195, 183, 191, 119, + 29, 1, 6, 0, 192, 74, 232, 19, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, + 110, 100, 111, 98, 106, 13, 49, 51, 52, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, + 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, + 103, 116, 104, 32, 50, 54, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 147, 96, + 72, 232, 96, 102, 100, 96, 226, 16, 96, 84, 226, 104, 16, 80, 96, 64, 3, 0, 48, 217, 1, 250, + 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, + 51, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 50, 50, 52, + 50, 56, 47, 76, 101, 110, 103, 116, 104, 49, 32, 52, 52, 55, 48, 52, 62, 62, 115, 116, 114, + 101, 97, 109, 13, 10, 72, 137, 180, 86, 123, 108, 83, 215, 25, 255, 206, 189, 215, 215, 241, + 125, 248, 253, 126, 220, 196, 190, 246, 189, 78, 156, 196, 137, 237, 56, 24, 218, 216, 148, + 192, 96, 16, 66, 66, 2, 132, 54, 129, 144, 6, 210, 14, 74, 120, 20, 136, 202, 70, 255, 40, + 101, 15, 208, 88, 129, 170, 148, 82, 214, 118, 244, 49, 209, 14, 156, 0, 46, 32, 134, 88, + 196, 254, 0, 54, 105, 67, 149, 54, 198, 94, 170, 38, 196, 150, 137, 174, 32, 13, 90, 59, 59, + 215, 15, 146, 172, 149, 54, 177, 46, 82, 238, 249, 206, 241, 185, 231, 124, 191, 223, 253, + 125, 15, 64, 0, 192, 195, 243, 64, 194, 162, 214, 197, 225, 200, 51, 47, 111, 254, 20, 96, + 235, 29, 188, 186, 178, 111, 93, 239, 224, 198, 57, 215, 127, 131, 205, 223, 1, 148, 125, + 220, 183, 101, 115, 133, 244, 73, 248, 9, 128, 109, 29, 0, 170, 59, 171, 7, 215, 172, 123, + 227, 214, 99, 199, 0, 190, 53, 23, 64, 99, 90, 179, 118, 104, 245, 222, 109, 157, 135, 241, + 187, 120, 255, 194, 45, 3, 253, 189, 79, 254, 185, 235, 39, 127, 1, 216, 133, 223, 129, 248, + 0, 94, 224, 47, 176, 77, 120, 190, 31, 207, 253, 3, 235, 54, 111, 123, 255, 149, 55, 190, + 129, 231, 25, 0, 195, 11, 107, 215, 247, 245, 194, 175, 175, 252, 29, 160, 21, 159, 111, + 248, 246, 186, 222, 109, 131, 6, 32, 174, 0, 28, 124, 4, 239, 175, 120, 166, 119, 93, 255, + 158, 115, 187, 127, 0, 240, 212, 5, 0, 109, 108, 112, 253, 166, 205, 227, 139, 224, 12, 254, + 93, 57, 191, 98, 112, 99, 255, 160, 225, 226, 63, 223, 198, 243, 237, 0, 22, 31, 168, 0, + 114, 155, 200, 235, 42, 45, 70, 167, 134, 4, 180, 192, 66, 232, 56, 7, 60, 58, 12, 54, 152, + 142, 46, 143, 52, 55, 151, 213, 168, 207, 227, 41, 1, 21, 232, 50, 148, 1, 66, 135, 83, 38, + 138, 224, 93, 174, 164, 216, 64, 239, 38, 219, 12, 243, 146, 234, 221, 68, 7, 36, 179, 191, + 191, 113, 9, 63, 174, 26, 19, 225, 171, 40, 124, 99, 236, 163, 49, 125, 246, 146, 33, 17, + 30, 187, 54, 86, 95, 135, 12, 94, 67, 254, 223, 172, 37, 212, 106, 154, 22, 125, 181, 68, + 131, 44, 197, 163, 209, 72, 19, 209, 16, 147, 68, 159, 150, 200, 175, 197, 226, 141, 77, + 100, 52, 34, 16, 164, 185, 180, 210, 68, 40, 115, 68, 94, 255, 188, 149, 156, 157, 245, 19, + 67, 222, 25, 139, 235, 85, 40, 20, 176, 149, 155, 202, 202, 200, 114, 129, 15, 68, 43, 116, + 243, 91, 196, 120, 208, 169, 162, 202, 104, 82, 85, 166, 150, 227, 143, 137, 157, 91, 191, + 238, 251, 5, 99, 151, 221, 30, 217, 206, 224, 209, 227, 198, 99, 246, 162, 74, 123, 255, 31, + 42, 237, 103, 75, 169, 230, 207, 206, 17, 55, 19, 203, 154, 252, 244, 16, 207, 18, 42, 77, + 217, 225, 160, 96, 241, 215, 187, 31, 157, 207, 235, 120, 149, 214, 101, 115, 186, 213, 101, + 6, 45, 83, 53, 183, 55, 123, 208, 25, 176, 49, 140, 45, 224, 116, 7, 148, 179, 2, 217, 25, + 152, 17, 219, 248, 125, 234, 103, 42, 51, 248, 64, 130, 63, 157, 64, 196, 172, 206, 101, 31, + 130, 127, 252, 230, 8, 171, 67, 11, 196, 204, 248, 205, 148, 160, 88, 1, 142, 23, 237, 60, + 88, 145, 214, 42, 177, 140, 232, 99, 160, 130, 18, 145, 65, 148, 2, 25, 84, 149, 18, 82, 44, + 112, 200, 72, 114, 156, 236, 241, 139, 162, 192, 240, 86, 16, 125, 118, 181, 209, 211, 110, + 236, 84, 117, 130, 61, 153, 76, 26, 109, 137, 105, 134, 168, 1, 51, 187, 162, 167, 59, 234, + 108, 25, 139, 32, 71, 184, 167, 219, 105, 191, 26, 137, 126, 115, 215, 232, 40, 178, 143, + 246, 116, 23, 204, 250, 58, 8, 133, 92, 83, 221, 56, 169, 24, 255, 203, 109, 245, 117, 161, + 80, 87, 192, 106, 45, 124, 55, 153, 244, 170, 181, 164, 232, 147, 164, 120, 35, 42, 124, 44, + 155, 90, 36, 189, 212, 9, 142, 182, 78, 171, 143, 38, 4, 142, 90, 154, 115, 182, 83, 188, + 167, 33, 84, 27, 51, 211, 28, 250, 62, 173, 23, 155, 162, 51, 230, 200, 6, 250, 34, 58, 141, + 214, 175, 242, 87, 89, 84, 164, 70, 207, 35, 42, 171, 53, 177, 20, 109, 171, 18, 169, 237, + 6, 11, 75, 146, 172, 213, 116, 41, 251, 91, 172, 199, 61, 0, 84, 28, 43, 83, 128, 16, 76, + 131, 35, 37, 126, 203, 137, 125, 39, 157, 172, 197, 194, 66, 134, 120, 45, 93, 45, 69, 51, + 196, 80, 154, 117, 202, 25, 68, 14, 215, 215, 171, 253, 153, 34, 112, 127, 6, 5, 82, 26, + 125, 91, 204, 174, 204, 98, 25, 84, 153, 78, 169, 59, 48, 64, 12, 40, 148, 28, 11, 97, 120, + 99, 9, 20, 30, 139, 132, 199, 176, 72, 141, 9, 44, 82, 215, 137, 135, 60, 166, 190, 174, 11, + 11, 155, 18, 189, 62, 169, 193, 16, 139, 71, 189, 152, 18, 139, 162, 116, 129, 68, 177, 90, + 66, 20, 13, 138, 204, 77, 19, 38, 21, 151, 102, 117, 15, 238, 88, 152, 123, 215, 91, 83, + 227, 69, 179, 183, 30, 221, 240, 136, 189, 118, 86, 168, 177, 123, 118, 48, 119, 204, 94, + 55, 239, 209, 157, 251, 18, 205, 53, 214, 89, 194, 244, 229, 115, 95, 59, 223, 56, 191, 177, + 28, 189, 48, 123, 112, 73, 83, 208, 36, 87, 83, 3, 213, 114, 176, 109, 123, 71, 120, 113, + 115, 76, 207, 68, 90, 159, 70, 127, 144, 155, 42, 173, 185, 227, 174, 112, 50, 123, 175, + 230, 107, 117, 206, 220, 94, 91, 205, 44, 0, 4, 173, 227, 127, 165, 56, 149, 136, 35, 251, + 123, 5, 254, 210, 110, 8, 157, 39, 126, 14, 90, 176, 163, 94, 240, 130, 84, 132, 41, 101, + 208, 202, 180, 105, 49, 149, 65, 203, 79, 55, 212, 229, 177, 214, 101, 208, 170, 116, 74, + 179, 36, 143, 53, 27, 186, 54, 150, 84, 30, 152, 177, 107, 88, 100, 174, 115, 15, 123, 0, + 230, 42, 96, 214, 22, 18, 64, 204, 24, 143, 99, 249, 208, 150, 98, 172, 43, 89, 192, 98, 22, + 8, 133, 34, 69, 86, 20, 71, 210, 140, 53, 249, 248, 179, 205, 59, 63, 122, 121, 209, 178, + 215, 111, 236, 140, 63, 217, 217, 236, 98, 104, 146, 98, 180, 26, 93, 237, 188, 254, 57, 45, + 67, 157, 213, 225, 165, 207, 181, 204, 89, 61, 47, 204, 51, 92, 25, 53, 234, 16, 29, 70, + 155, 223, 107, 109, 127, 235, 206, 155, 71, 17, 124, 176, 220, 232, 145, 92, 70, 183, 228, + 22, 170, 156, 156, 24, 18, 147, 207, 190, 61, 176, 241, 157, 181, 13, 222, 96, 69, 153, 61, + 4, 56, 142, 21, 165, 93, 192, 74, 51, 66, 57, 108, 40, 240, 244, 83, 48, 17, 135, 112, 202, + 116, 18, 47, 129, 6, 236, 69, 144, 246, 12, 170, 77, 105, 180, 109, 174, 60, 62, 87, 6, 117, + 164, 83, 170, 73, 98, 64, 133, 100, 135, 195, 239, 191, 125, 163, 160, 28, 98, 138, 114, 84, + 147, 116, 114, 161, 251, 131, 123, 199, 114, 151, 243, 42, 89, 240, 254, 39, 71, 151, 228, + 110, 135, 86, 28, 24, 218, 249, 157, 181, 251, 251, 234, 137, 87, 211, 217, 31, 206, 47, 8, + 162, 237, 200, 173, 183, 158, 120, 125, 243, 204, 207, 247, 78, 219, 240, 46, 254, 242, 24, + 19, 185, 27, 99, 170, 134, 227, 5, 68, 138, 182, 137, 151, 82, 58, 141, 169, 194, 84, 129, + 49, 57, 237, 60, 246, 200, 121, 6, 85, 42, 223, 240, 20, 143, 90, 36, 137, 118, 148, 100, + 239, 200, 251, 205, 183, 201, 121, 191, 113, 84, 212, 166, 83, 244, 84, 217, 135, 20, 188, + 56, 112, 18, 225, 176, 94, 73, 17, 174, 83, 95, 197, 145, 5, 121, 16, 95, 8, 37, 209, 107, + 248, 55, 19, 195, 99, 116, 154, 236, 22, 133, 27, 226, 69, 141, 150, 81, 169, 176, 40, 114, + 17, 180, 75, 163, 83, 108, 157, 38, 55, 132, 126, 165, 216, 107, 112, 1, 96, 11, 52, 49, 14, + 89, 192, 101, 128, 205, 141, 178, 54, 92, 24, 36, 27, 147, 219, 199, 218, 101, 37, 86, 246, + 140, 223, 39, 251, 48, 99, 50, 124, 88, 100, 76, 109, 202, 16, 251, 83, 86, 222, 3, 130, 71, + 29, 212, 161, 22, 181, 157, 227, 209, 2, 181, 158, 197, 230, 25, 180, 20, 76, 227, 183, 79, + 97, 219, 100, 114, 208, 153, 241, 63, 14, 227, 29, 116, 30, 173, 22, 45, 160, 51, 232, 241, + 145, 148, 175, 205, 145, 207, 169, 10, 196, 34, 192, 144, 194, 218, 168, 33, 145, 167, 44, + 101, 248, 10, 207, 125, 160, 165, 201, 76, 149, 170, 104, 137, 75, 12, 145, 197, 44, 117, + 161, 61, 26, 45, 171, 202, 219, 155, 184, 242, 136, 44, 69, 5, 30, 243, 216, 171, 172, 82, + 111, 10, 149, 118, 46, 247, 35, 198, 30, 20, 132, 160, 147, 205, 9, 172, 158, 165, 105, 252, + 160, 14, 84, 203, 172, 163, 10, 179, 53, 111, 252, 22, 117, 72, 229, 135, 36, 92, 47, 176, + 53, 236, 118, 235, 236, 88, 97, 105, 144, 117, 103, 137, 131, 16, 83, 98, 64, 113, 221, 142, + 93, 31, 230, 243, 227, 237, 97, 78, 25, 145, 60, 226, 243, 37, 194, 77, 103, 81, 24, 119, + 32, 76, 81, 31, 12, 70, 150, 210, 36, 22, 155, 243, 250, 48, 103, 208, 138, 116, 42, 188, + 164, 164, 15, 37, 117, 40, 37, 169, 64, 32, 206, 65, 99, 120, 82, 10, 181, 255, 207, 53, 37, + 62, 167, 36, 166, 120, 163, 1, 87, 190, 124, 83, 146, 103, 217, 160, 228, 253, 137, 54, 133, + 194, 164, 104, 120, 13, 63, 125, 229, 206, 101, 61, 175, 172, 157, 62, 227, 233, 3, 203, + 171, 151, 4, 238, 26, 205, 138, 56, 209, 73, 189, 195, 196, 88, 102, 174, 92, 243, 84, 195, + 161, 187, 63, 94, 190, 242, 248, 189, 131, 29, 223, 93, 211, 236, 226, 168, 217, 158, 42, 7, + 227, 175, 242, 207, 220, 250, 78, 255, 250, 247, 54, 78, 55, 155, 81, 117, 77, 220, 45, 217, + 88, 214, 90, 110, 206, 102, 133, 26, 167, 219, 204, 116, 189, 247, 233, 171, 71, 178, 39, + 122, 108, 94, 201, 29, 45, 104, 150, 218, 129, 59, 144, 48, 252, 178, 84, 31, 195, 5, 193, + 4, 138, 194, 241, 23, 71, 182, 56, 50, 197, 17, 240, 56, 130, 71, 145, 203, 16, 251, 210, + 54, 63, 139, 7, 220, 27, 216, 170, 218, 253, 121, 98, 252, 103, 81, 31, 164, 128, 195, 77, + 140, 89, 153, 235, 184, 114, 142, 224, 112, 223, 48, 165, 83, 200, 183, 8, 161, 60, 115, 40, + 124, 109, 44, 162, 47, 244, 10, 202, 159, 43, 165, 121, 232, 179, 74, 73, 32, 47, 220, 201, + 26, 46, 148, 5, 11, 94, 43, 153, 212, 14, 94, 136, 72, 114, 212, 195, 231, 220, 156, 80, + 208, 49, 47, 68, 37, 57, 34, 112, 232, 99, 222, 19, 149, 165, 136, 192, 251, 25, 61, 67, + 211, 248, 65, 176, 217, 187, 37, 155, 186, 84, 178, 114, 1, 116, 189, 100, 23, 88, 69, 7, + 48, 171, 22, 168, 42, 177, 10, 196, 254, 147, 41, 70, 223, 94, 112, 22, 133, 177, 155, 88, + 124, 195, 165, 133, 41, 14, 151, 92, 67, 7, 248, 146, 67, 229, 17, 197, 161, 9, 55, 38, 174, + 86, 50, 15, 57, 254, 55, 194, 133, 239, 11, 66, 215, 164, 251, 70, 60, 90, 177, 93, 147, 65, + 171, 79, 155, 236, 246, 98, 45, 233, 199, 213, 99, 82, 61, 197, 153, 68, 113, 35, 253, 159, + 246, 77, 40, 153, 46, 181, 211, 249, 190, 251, 129, 171, 132, 203, 219, 250, 124, 143, 48, + 163, 222, 207, 149, 209, 4, 169, 230, 25, 141, 93, 8, 186, 92, 149, 46, 45, 239, 137, 73, + 82, 164, 156, 71, 3, 203, 246, 244, 197, 52, 90, 61, 175, 181, 249, 156, 190, 176, 139, 229, + 181, 188, 46, 208, 84, 79, 14, 49, 133, 124, 203, 20, 179, 40, 213, 132, 177, 68, 97, 85, + 169, 146, 214, 17, 251, 113, 163, 192, 16, 251, 48, 161, 62, 226, 210, 112, 117, 181, 69, + 147, 33, 174, 164, 180, 41, 176, 200, 237, 94, 70, 239, 106, 215, 79, 168, 32, 161, 40, 9, + 211, 171, 4, 161, 62, 27, 81, 240, 165, 216, 47, 219, 246, 128, 115, 73, 146, 209, 151, 104, + 164, 216, 154, 90, 204, 180, 26, 33, 171, 149, 106, 98, 203, 227, 149, 51, 19, 14, 117, 110, + 232, 11, 66, 121, 78, 109, 174, 136, 200, 193, 88, 57, 103, 116, 228, 14, 255, 139, 248, + 170, 143, 109, 227, 172, 195, 247, 157, 249, 238, 181, 125, 103, 199, 119, 254, 118, 226, + 243, 183, 155, 59, 127, 197, 142, 211, 36, 190, 180, 105, 187, 108, 113, 155, 58, 233, 7, + 106, 211, 118, 109, 85, 54, 198, 216, 170, 150, 134, 141, 86, 45, 5, 38, 16, 45, 20, 65, + 155, 81, 216, 16, 67, 124, 137, 21, 104, 154, 182, 70, 13, 136, 149, 10, 248, 131, 137, 63, + 152, 128, 33, 42, 90, 186, 127, 58, 22, 49, 49, 164, 73, 109, 114, 225, 189, 59, 159, 227, + 116, 31, 2, 84, 9, 89, 186, 59, 159, 239, 206, 247, 123, 222, 223, 243, 252, 158, 7, 253, + 52, 111, 137, 51, 28, 67, 209, 240, 169, 251, 22, 206, 54, 213, 239, 151, 140, 177, 106, + 204, 194, 107, 88, 204, 202, 209, 4, 60, 75, 115, 145, 184, 42, 47, 92, 78, 250, 26, 83, + 119, 28, 86, 239, 69, 30, 54, 87, 210, 5, 71, 8, 131, 88, 236, 53, 151, 190, 56, 174, 58, + 58, 209, 58, 247, 80, 249, 21, 189, 196, 247, 189, 96, 249, 64, 108, 18, 64, 147, 242, 113, + 13, 244, 133, 31, 119, 118, 53, 234, 176, 162, 83, 218, 82, 124, 44, 152, 244, 1, 56, 238, + 166, 204, 30, 187, 251, 15, 198, 147, 52, 214, 134, 218, 15, 39, 92, 31, 242, 154, 241, 118, + 10, 99, 205, 100, 4, 89, 166, 37, 183, 219, 91, 199, 246, 206, 68, 178, 0, 208, 240, 224, + 50, 18, 41, 110, 244, 0, 198, 125, 5, 237, 130, 204, 149, 22, 223, 154, 97, 69, 108, 36, 11, + 181, 85, 233, 208, 142, 4, 86, 219, 90, 141, 173, 32, 103, 178, 18, 21, 74, 108, 12, 109, + 106, 210, 89, 75, 17, 154, 12, 104, 241, 33, 151, 51, 212, 129, 203, 179, 218, 134, 43, 247, + 203, 249, 60, 151, 135, 101, 95, 188, 191, 255, 178, 140, 134, 34, 170, 133, 20, 24, 87, 80, + 113, 217, 20, 212, 243, 10, 154, 215, 218, 67, 199, 146, 218, 207, 4, 50, 209, 72, 198, 15, + 48, 245, 243, 132, 35, 148, 9, 135, 51, 33, 7, 174, 158, 193, 152, 160, 12, 207, 7, 152, 98, + 215, 75, 210, 170, 76, 7, 64, 221, 4, 26, 182, 134, 146, 61, 209, 243, 190, 184, 167, 133, + 205, 129, 187, 175, 195, 110, 192, 73, 173, 71, 252, 119, 111, 53, 207, 127, 42, 95, 180, + 139, 229, 212, 252, 2, 142, 166, 122, 35, 118, 27, 188, 203, 228, 72, 157, 116, 32, 253, + 200, 69, 99, 29, 46, 197, 237, 180, 100, 183, 183, 215, 177, 194, 116, 80, 202, 193, 221, + 12, 18, 236, 169, 37, 53, 32, 28, 246, 24, 54, 146, 76, 72, 97, 192, 106, 71, 128, 161, 236, + 117, 244, 200, 101, 232, 100, 52, 19, 32, 193, 227, 165, 110, 209, 137, 1, 227, 76, 57, 13, + 103, 88, 121, 73, 147, 101, 206, 128, 123, 250, 62, 60, 211, 196, 216, 128, 22, 114, 79, + 228, 121, 215, 187, 1, 118, 6, 113, 33, 31, 107, 105, 89, 162, 206, 250, 162, 206, 167, 196, + 124, 58, 225, 81, 127, 238, 239, 21, 48, 130, 96, 124, 82, 68, 148, 188, 116, 41, 113, 50, + 86, 72, 70, 156, 243, 124, 58, 17, 115, 160, 56, 14, 252, 82, 36, 44, 121, 232, 237, 2, 156, + 32, 182, 104, 37, 135, 77, 20, 143, 172, 124, 240, 75, 35, 11, 219, 104, 131, 140, 52, 241, + 5, 89, 182, 6, 187, 227, 106, 60, 61, 54, 54, 154, 88, 251, 220, 26, 108, 39, 205, 2, 146, + 4, 80, 84, 49, 100, 116, 241, 54, 233, 33, 163, 136, 19, 250, 185, 166, 167, 111, 199, 174, + 66, 79, 31, 132, 91, 26, 241, 44, 217, 210, 237, 144, 125, 99, 162, 206, 62, 81, 103, 31, + 185, 25, 121, 15, 79, 255, 159, 222, 209, 226, 27, 76, 181, 213, 45, 125, 75, 184, 33, 61, + 163, 47, 220, 254, 218, 212, 205, 51, 15, 195, 253, 217, 175, 220, 156, 170, 170, 111, 118, + 84, 143, 237, 122, 228, 248, 104, 103, 199, 200, 177, 71, 180, 61, 118, 230, 91, 234, 249, + 137, 13, 47, 222, 249, 225, 243, 119, 127, 178, 99, 253, 139, 239, 92, 218, 247, 189, 201, + 193, 225, 103, 190, 189, 237, 35, 63, 248, 68, 229, 193, 195, 223, 209, 146, 11, 236, 36, + 28, 50, 218, 143, 36, 145, 99, 13, 215, 26, 161, 174, 64, 169, 229, 144, 0, 246, 178, 98, + 65, 184, 168, 254, 150, 209, 58, 154, 190, 64, 81, 64, 52, 221, 56, 124, 237, 244, 140, 226, + 218, 8, 154, 62, 82, 119, 61, 90, 199, 52, 220, 252, 127, 119, 163, 89, 180, 120, 175, 227, + 36, 90, 227, 12, 62, 116, 252, 103, 199, 62, 218, 24, 139, 32, 155, 64, 179, 210, 216, 193, + 201, 241, 21, 234, 92, 102, 109, 53, 249, 212, 161, 202, 166, 162, 31, 255, 236, 19, 223, + 63, 208, 167, 238, 105, 178, 232, 132, 44, 183, 9, 3, 59, 143, 238, 30, 218, 154, 98, 212, + 225, 112, 255, 166, 70, 229, 85, 88, 121, 17, 25, 66, 158, 55, 42, 159, 97, 37, 46, 73, 95, + 193, 126, 5, 215, 184, 132, 125, 125, 58, 89, 225, 52, 111, 227, 151, 88, 243, 221, 217, 58, + 26, 189, 160, 40, 66, 191, 121, 162, 191, 142, 38, 47, 41, 157, 27, 5, 83, 80, 154, 245, + 148, 225, 186, 231, 94, 157, 211, 221, 96, 25, 194, 113, 254, 127, 123, 74, 139, 34, 197, + 113, 9, 127, 23, 60, 188, 16, 196, 53, 167, 222, 6, 233, 34, 240, 60, 90, 136, 197, 99, 49, + 19, 173, 234, 3, 193, 222, 92, 42, 23, 0, 196, 65, 87, 34, 171, 164, 106, 38, 112, 48, 12, + 110, 200, 175, 242, 173, 63, 178, 69, 234, 84, 118, 244, 5, 242, 93, 9, 231, 19, 118, 90, + 61, 215, 187, 170, 61, 223, 117, 232, 217, 158, 241, 30, 127, 152, 177, 211, 144, 97, 28, + 64, 59, 179, 35, 121, 175, 234, 108, 226, 57, 181, 34, 78, 224, 76, 113, 203, 100, 117, 240, + 241, 241, 1, 167, 45, 81, 30, 150, 22, 99, 34, 190, 87, 217, 234, 32, 41, 245, 203, 190, + 236, 144, 166, 82, 149, 197, 219, 48, 98, 69, 145, 97, 228, 138, 57, 203, 6, 177, 169, 139, + 145, 92, 36, 7, 124, 117, 236, 27, 211, 8, 144, 52, 225, 46, 33, 52, 218, 117, 137, 43, 193, + 15, 223, 103, 66, 210, 87, 71, 187, 20, 48, 232, 35, 147, 99, 188, 222, 71, 124, 29, 221, + 218, 74, 19, 77, 84, 210, 156, 17, 30, 217, 57, 173, 237, 244, 36, 169, 49, 109, 22, 145, + 238, 211, 99, 151, 152, 72, 44, 243, 61, 133, 166, 15, 162, 92, 203, 29, 62, 133, 159, 24, + 57, 254, 163, 61, 171, 15, 108, 93, 233, 101, 8, 24, 30, 109, 249, 209, 39, 135, 51, 35, + 221, 254, 76, 117, 247, 163, 187, 171, 153, 53, 31, 255, 230, 135, 164, 237, 163, 3, 237, + 109, 164, 230, 147, 24, 38, 179, 118, 123, 41, 173, 164, 93, 242, 134, 189, 143, 238, 93, + 159, 65, 63, 179, 239, 236, 135, 11, 124, 40, 236, 205, 74, 161, 148, 151, 233, 76, 116, 10, + 169, 129, 216, 138, 74, 54, 157, 233, 223, 116, 112, 227, 196, 201, 9, 201, 230, 14, 182, + 219, 4, 209, 27, 72, 120, 129, 191, 211, 231, 138, 22, 2, 105, 227, 247, 3, 16, 119, 0, 115, + 232, 27, 176, 179, 195, 200, 166, 6, 163, 17, 10, 230, 208, 11, 110, 142, 114, 152, 56, 56, + 244, 20, 24, 104, 33, 97, 14, 149, 175, 45, 188, 162, 53, 234, 7, 94, 181, 148, 17, 151, + 252, 181, 169, 83, 186, 167, 120, 3, 122, 10, 139, 58, 171, 57, 10, 205, 33, 169, 179, 180, + 77, 51, 119, 54, 26, 63, 5, 209, 128, 209, 48, 144, 244, 128, 187, 115, 205, 102, 114, 2, + 79, 50, 16, 76, 121, 24, 45, 22, 194, 183, 63, 177, 120, 155, 56, 7, 29, 80, 26, 217, 98, + 188, 253, 44, 210, 129, 157, 130, 140, 228, 97, 190, 0, 116, 172, 198, 214, 124, 250, 202, + 249, 160, 138, 182, 174, 92, 197, 20, 90, 133, 249, 128, 139, 90, 181, 117, 201, 13, 181, + 223, 235, 103, 137, 115, 107, 63, 247, 155, 227, 207, 92, 125, 118, 157, 158, 109, 161, 53, + 138, 173, 219, 211, 63, 176, 123, 40, 10, 180, 194, 178, 208, 242, 253, 109, 114, 246, 248, + 80, 255, 225, 159, 30, 198, 155, 204, 88, 32, 170, 251, 31, 138, 198, 134, 31, 31, 194, 153, + 86, 127, 206, 67, 173, 249, 46, 172, 41, 130, 140, 25, 53, 77, 35, 30, 104, 151, 170, 151, + 148, 136, 167, 3, 120, 132, 186, 102, 241, 20, 171, 39, 84, 115, 147, 142, 70, 34, 112, 64, + 31, 235, 145, 221, 134, 147, 245, 178, 215, 189, 112, 7, 139, 187, 124, 207, 53, 154, 62, + 232, 54, 133, 208, 102, 105, 177, 216, 98, 78, 114, 60, 79, 181, 225, 28, 201, 70, 6, 114, + 137, 114, 194, 195, 89, 8, 245, 40, 32, 61, 125, 69, 169, 224, 103, 72, 116, 37, 138, 118, + 19, 32, 80, 148, 165, 188, 179, 13, 72, 156, 139, 193, 81, 226, 1, 192, 89, 137, 79, 70, 82, + 46, 146, 160, 219, 237, 243, 94, 252, 38, 231, 2, 4, 37, 164, 68, 88, 71, 122, 241, 78, 91, + 59, 172, 163, 15, 57, 218, 240, 127, 22, 153, 6, 72, 95, 38, 3, 160, 231, 168, 42, 116, 31, + 16, 220, 214, 168, 40, 130, 112, 29, 59, 173, 56, 20, 55, 40, 213, 82, 181, 140, 200, 224, + 203, 146, 154, 80, 174, 180, 20, 231, 145, 203, 101, 71, 217, 205, 190, 170, 31, 59, 202, + 134, 94, 42, 246, 247, 189, 181, 89, 51, 148, 68, 17, 55, 77, 90, 179, 122, 103, 222, 105, + 56, 119, 243, 72, 195, 129, 252, 43, 229, 74, 173, 202, 151, 215, 36, 28, 228, 239, 176, + 107, 164, 35, 190, 186, 212, 11, 191, 80, 234, 159, 45, 152, 167, 156, 151, 75, 126, 26, + 191, 133, 190, 73, 88, 67, 197, 174, 76, 57, 100, 35, 254, 133, 221, 194, 105, 127, 65, 94, + 145, 229, 113, 203, 106, 119, 192, 78, 146, 246, 128, 27, 47, 204, 255, 86, 8, 176, 250, 49, + 241, 88, 36, 201, 147, 56, 227, 114, 206, 119, 226, 127, 114, 186, 173, 36, 97, 117, 183, + 207, 39, 240, 191, 176, 130, 149, 36, 249, 116, 20, 98, 214, 9, 215, 126, 8, 98, 38, 155, + 152, 205, 194, 12, 243, 85, 196, 141, 68, 176, 81, 133, 150, 4, 89, 114, 195, 15, 2, 52, + 247, 172, 240, 76, 7, 109, 32, 135, 48, 29, 162, 200, 36, 107, 34, 195, 5, 106, 220, 178, + 116, 227, 145, 243, 178, 215, 13, 59, 162, 58, 215, 232, 11, 168, 86, 112, 99, 8, 22, 108, + 255, 247, 186, 75, 195, 12, 226, 64, 25, 168, 233, 160, 65, 192, 74, 104, 11, 108, 77, 172, + 80, 34, 238, 96, 220, 149, 30, 185, 24, 178, 145, 111, 255, 147, 178, 133, 74, 93, 133, 114, + 59, 112, 162, 69, 245, 134, 195, 42, 12, 148, 229, 82, 135, 149, 186, 117, 157, 178, 194, + 201, 145, 235, 229, 25, 78, 189, 177, 71, 76, 241, 20, 97, 97, 1, 250, 123, 181, 11, 176, + 22, 130, 226, 83, 34, 214, 141, 57, 35, 105, 216, 75, 240, 188, 58, 142, 190, 164, 157, 39, + 249, 84, 100, 225, 45, 136, 12, 11, 145, 113, 67, 100, 82, 72, 213, 156, 15, 2, 118, 122, + 218, 10, 58, 234, 216, 211, 211, 41, 31, 162, 209, 130, 86, 64, 180, 230, 163, 28, 53, 170, + 201, 10, 25, 134, 210, 242, 245, 57, 246, 15, 90, 181, 151, 239, 249, 85, 227, 247, 146, 52, + 181, 84, 199, 243, 66, 190, 88, 44, 53, 139, 196, 158, 51, 66, 79, 8, 168, 47, 56, 25, 97, + 160, 36, 149, 58, 236, 109, 167, 92, 73, 23, 230, 76, 56, 191, 72, 218, 131, 133, 116, 185, + 34, 0, 7, 250, 119, 181, 108, 146, 25, 253, 53, 246, 114, 52, 9, 235, 97, 28, 54, 245, 170, + 180, 175, 167, 184, 79, 66, 251, 88, 39, 32, 72, 87, 42, 2, 93, 197, 58, 56, 243, 14, 225, + 127, 132, 233, 85, 65, 147, 13, 174, 91, 132, 66, 29, 219, 54, 131, 196, 227, 72, 111, 29, + 91, 163, 176, 28, 46, 160, 111, 11, 168, 80, 7, 5, 116, 190, 128, 22, 234, 139, 191, 80, 44, + 192, 138, 142, 20, 10, 210, 96, 170, 142, 186, 21, 223, 141, 48, 138, 31, 9, 159, 12, 99, + 74, 120, 52, 188, 43, 140, 219, 195, 161, 48, 6, 136, 112, 152, 8, 212, 23, 111, 40, 54, 0, + 181, 45, 224, 102, 209, 106, 224, 142, 244, 144, 230, 35, 20, 11, 252, 210, 255, 186, 2, + 170, 4, 226, 150, 77, 39, 169, 153, 136, 157, 59, 38, 38, 38, 118, 78, 104, 62, 68, 78, 79, + 236, 159, 155, 216, 15, 133, 242, 90, 25, 206, 183, 156, 193, 179, 255, 243, 219, 232, 14, + 71, 107, 76, 104, 246, 187, 141, 6, 213, 167, 73, 190, 187, 225, 121, 27, 103, 8, 93, 152, + 219, 140, 57, 203, 231, 115, 197, 18, 126, 168, 61, 157, 234, 74, 114, 165, 147, 155, 215, + 77, 110, 201, 244, 63, 61, 51, 185, 133, 139, 15, 102, 42, 123, 70, 242, 44, 195, 49, 20, + 237, 95, 187, 227, 201, 149, 143, 157, 222, 181, 226, 157, 93, 253, 155, 139, 158, 127, 243, + 94, 37, 177, 109, 92, 103, 248, 189, 153, 161, 40, 14, 41, 46, 26, 205, 112, 39, 197, 125, + 19, 197, 157, 34, 37, 74, 26, 81, 178, 68, 14, 69, 73, 145, 228, 164, 174, 172, 197, 82, 99, + 39, 110, 18, 59, 94, 98, 71, 110, 140, 164, 104, 156, 165, 48, 10, 196, 200, 210, 83, 220, + 164, 151, 162, 135, 184, 162, 163, 176, 113, 18, 31, 236, 75, 0, 231, 226, 26, 110, 218, + 162, 135, 160, 185, 164, 168, 128, 166, 40, 10, 216, 169, 168, 190, 153, 225, 208, 180, 229, + 212, 174, 3, 244, 50, 35, 142, 102, 121, 255, 247, 127, 239, 251, 191, 111, 108, 48, 181, + 171, 219, 174, 214, 202, 229, 90, 245, 88, 95, 222, 83, 124, 162, 48, 113, 184, 228, 78, 7, + 7, 131, 29, 22, 167, 69, 109, 242, 234, 237, 110, 171, 203, 70, 5, 118, 158, 218, 253, 199, + 118, 119, 194, 145, 97, 211, 73, 128, 250, 122, 18, 77, 37, 32, 59, 136, 184, 218, 15, 222, + 168, 247, 149, 116, 164, 47, 96, 75, 128, 6, 33, 236, 39, 200, 40, 211, 100, 58, 229, 32, + 100, 81, 105, 120, 70, 171, 176, 196, 182, 121, 57, 243, 168, 118, 60, 43, 12, 163, 108, 21, + 114, 104, 24, 149, 27, 195, 8, 97, 130, 4, 173, 110, 153, 249, 102, 172, 63, 232, 59, 154, + 198, 154, 143, 222, 62, 223, 68, 61, 148, 66, 132, 92, 199, 48, 130, 63, 4, 201, 229, 159, + 205, 133, 39, 198, 118, 184, 209, 240, 181, 217, 3, 70, 82, 133, 146, 172, 39, 106, 85, 57, + 71, 70, 10, 254, 149, 87, 31, 241, 215, 190, 209, 5, 135, 19, 198, 104, 34, 109, 75, 237, + 73, 197, 70, 194, 29, 240, 111, 199, 62, 57, 85, 208, 121, 123, 3, 123, 4, 135, 72, 106, + 148, 50, 151, 20, 170, 106, 148, 51, 106, 87, 79, 158, 170, 28, 205, 238, 159, 142, 169, + 157, 105, 127, 237, 243, 145, 177, 248, 212, 94, 180, 223, 11, 91, 127, 197, 29, 248, 117, + 144, 146, 252, 246, 154, 5, 248, 62, 193, 142, 0, 53, 48, 64, 59, 176, 3, 119, 189, 106, + 119, 21, 218, 215, 40, 142, 248, 16, 22, 64, 12, 177, 81, 169, 132, 229, 88, 151, 80, 126, + 87, 21, 142, 174, 177, 10, 177, 252, 205, 208, 181, 208, 198, 32, 58, 110, 240, 140, 142, + 11, 206, 239, 187, 190, 73, 244, 219, 45, 77, 217, 11, 57, 188, 22, 209, 224, 181, 72, 233, + 139, 7, 19, 149, 34, 147, 27, 122, 185, 71, 186, 247, 189, 253, 68, 207, 240, 241, 95, 46, + 251, 203, 195, 41, 70, 33, 195, 59, 180, 58, 111, 178, 16, 95, 126, 204, 148, 40, 39, 146, + 165, 140, 183, 77, 161, 146, 19, 231, 76, 46, 131, 70, 239, 48, 105, 217, 231, 206, 31, 57, + 117, 233, 249, 1, 100, 226, 24, 141, 193, 101, 236, 141, 32, 234, 189, 249, 90, 225, 41, + 206, 99, 247, 218, 73, 115, 144, 231, 91, 9, 233, 200, 21, 217, 147, 192, 11, 178, 224, 245, + 58, 90, 74, 115, 246, 2, 182, 128, 156, 80, 4, 59, 196, 146, 148, 99, 84, 153, 245, 153, 9, + 117, 80, 34, 11, 218, 171, 69, 86, 97, 224, 146, 66, 125, 73, 244, 235, 60, 171, 46, 203, + 198, 37, 239, 38, 50, 69, 180, 73, 226, 214, 87, 60, 232, 59, 154, 82, 201, 109, 123, 22, + 197, 145, 6, 233, 112, 148, 67, 154, 18, 107, 15, 126, 133, 52, 4, 108, 157, 126, 163, 114, + 199, 155, 187, 247, 158, 222, 229, 79, 44, 191, 182, 88, 90, 205, 41, 5, 202, 89, 84, 55, + 211, 43, 233, 216, 88, 136, 110, 15, 140, 36, 77, 177, 68, 186, 211, 41, 209, 107, 133, 155, + 70, 140, 90, 225, 105, 215, 223, 7, 255, 34, 113, 109, 51, 57, 82, 136, 77, 63, 154, 202, + 236, 159, 137, 107, 156, 61, 126, 30, 55, 14, 225, 182, 142, 244, 55, 4, 146, 80, 38, 226, + 86, 161, 40, 71, 87, 21, 27, 94, 11, 37, 137, 42, 143, 156, 3, 239, 162, 186, 48, 115, 215, + 37, 130, 151, 58, 125, 27, 44, 3, 66, 75, 96, 227, 83, 196, 18, 129, 157, 37, 206, 17, 24, + 65, 88, 34, 8, 145, 138, 6, 150, 249, 51, 219, 137, 238, 137, 124, 233, 229, 12, 255, 2, + 106, 173, 26, 211, 225, 106, 133, 65, 5, 203, 10, 3, 186, 65, 113, 131, 181, 72, 36, 10, 93, + 67, 242, 182, 81, 87, 186, 249, 167, 23, 230, 67, 27, 11, 243, 124, 14, 252, 51, 26, 210, + 17, 1, 241, 255, 239, 183, 5, 89, 104, 113, 57, 154, 120, 75, 223, 206, 110, 140, 246, 165, + 133, 62, 201, 241, 245, 128, 123, 243, 11, 115, 223, 252, 80, 254, 7, 197, 168, 70, 161, + 106, 197, 49, 162, 181, 173, 247, 251, 71, 242, 199, 42, 199, 251, 6, 158, 249, 213, 254, + 131, 111, 239, 141, 254, 19, 159, 91, 140, 142, 69, 140, 24, 188, 217, 221, 149, 157, 31, + 114, 82, 122, 74, 222, 238, 48, 50, 118, 70, 163, 54, 232, 117, 185, 213, 15, 159, 59, 118, + 241, 197, 209, 252, 209, 179, 11, 157, 251, 159, 117, 247, 207, 68, 208, 222, 55, 110, 221, + 196, 222, 146, 29, 71, 206, 241, 112, 189, 43, 140, 22, 160, 16, 184, 88, 137, 6, 61, 100, + 21, 90, 43, 233, 49, 147, 87, 98, 161, 23, 109, 219, 117, 54, 90, 232, 28, 215, 22, 4, 7, + 35, 68, 143, 65, 180, 205, 47, 39, 54, 47, 39, 46, 35, 36, 127, 139, 210, 221, 253, 61, 212, + 36, 141, 2, 31, 105, 17, 133, 22, 151, 235, 150, 79, 64, 195, 71, 154, 57, 2, 42, 4, 246, + 22, 209, 74, 182, 200, 117, 70, 167, 222, 236, 51, 169, 222, 229, 163, 75, 7, 245, 174, 202, + 18, 119, 187, 99, 86, 229, 65, 138, 146, 161, 75, 7, 220, 229, 99, 15, 249, 70, 253, 106, 5, + 65, 252, 195, 234, 162, 228, 242, 86, 185, 206, 211, 23, 154, 38, 245, 126, 107, 79, 100, + 179, 155, 212, 240, 217, 71, 67, 98, 87, 35, 61, 86, 191, 158, 44, 205, 189, 50, 215, 221, + 166, 105, 51, 250, 0, 14, 204, 181, 51, 248, 59, 248, 239, 192, 0, 152, 0, 139, 16, 171, 59, + 234, 73, 77, 84, 142, 103, 92, 92, 130, 187, 196, 225, 118, 14, 114, 95, 124, 170, 130, 168, + 227, 170, 79, 103, 160, 109, 6, 26, 102, 224, 204, 215, 159, 209, 80, 79, 67, 64, 107, 105, + 76, 67, 211, 75, 25, 252, 70, 174, 16, 236, 236, 202, 127, 148, 199, 64, 30, 230, 63, 203, + 112, 154, 57, 168, 197, 231, 174, 176, 157, 147, 226, 160, 64, 220, 24, 220, 152, 159, 71, + 6, 73, 152, 188, 252, 16, 70, 63, 231, 175, 11, 39, 97, 126, 152, 217, 157, 205, 95, 86, + 114, 240, 222, 31, 191, 245, 237, 92, 254, 74, 30, 35, 242, 80, 243, 95, 191, 191, 112, 107, + 5, 183, 45, 96, 94, 154, 96, 168, 41, 12, 35, 206, 47, 175, 175, 5, 233, 45, 163, 215, 219, + 240, 198, 64, 67, 205, 233, 65, 46, 33, 153, 22, 142, 162, 222, 56, 226, 12, 76, 122, 27, + 174, 96, 0, 163, 146, 94, 159, 79, 141, 215, 127, 225, 239, 48, 218, 199, 25, 42, 185, 231, + 149, 217, 208, 4, 173, 162, 18, 221, 127, 24, 63, 246, 80, 168, 247, 200, 123, 71, 15, 253, + 98, 95, 68, 231, 136, 218, 67, 145, 116, 200, 21, 236, 89, 126, 121, 58, 88, 118, 64, 179, + 142, 174, 125, 60, 85, 244, 100, 60, 237, 83, 99, 222, 140, 135, 234, 43, 12, 86, 76, 118, + 170, 229, 209, 221, 217, 137, 104, 7, 190, 20, 237, 54, 244, 59, 38, 158, 157, 9, 209, 234, + 54, 55, 99, 245, 96, 173, 184, 103, 120, 33, 151, 63, 250, 112, 220, 205, 238, 74, 57, 114, + 61, 113, 189, 126, 50, 210, 183, 199, 231, 90, 46, 78, 156, 216, 25, 38, 21, 93, 181, 27, + 133, 41, 99, 40, 107, 31, 153, 52, 4, 123, 54, 31, 14, 71, 49, 25, 229, 234, 180, 105, 227, + 73, 189, 55, 194, 39, 196, 147, 91, 55, 241, 171, 200, 95, 196, 193, 147, 146, 23, 86, 98, + 139, 107, 241, 96, 71, 21, 91, 170, 216, 130, 70, 173, 68, 115, 109, 21, 150, 89, 5, 27, + 230, 220, 163, 198, 113, 81, 152, 69, 170, 183, 103, 121, 165, 225, 39, 152, 121, 237, 254, + 238, 111, 86, 113, 157, 224, 13, 16, 227, 183, 155, 7, 209, 65, 211, 248, 85, 149, 37, 230, + 246, 196, 44, 42, 202, 157, 245, 70, 151, 83, 146, 87, 144, 206, 67, 47, 21, 231, 158, 43, + 59, 157, 18, 233, 225, 230, 16, 151, 178, 142, 14, 111, 190, 39, 93, 105, 246, 9, 236, 96, + 238, 177, 159, 174, 240, 154, 253, 195, 173, 155, 240, 180, 108, 2, 25, 41, 7, 216, 33, 86, + 127, 17, 48, 216, 69, 96, 1, 52, 242, 87, 36, 176, 195, 19, 239, 179, 70, 109, 81, 92, 253, + 117, 180, 120, 97, 134, 9, 42, 176, 253, 127, 183, 87, 85, 47, 130, 226, 103, 56, 207, 28, + 68, 25, 184, 122, 231, 202, 169, 129, 217, 157, 125, 253, 59, 103, 115, 141, 181, 227, 171, + 104, 238, 160, 149, 162, 42, 162, 227, 189, 153, 226, 120, 95, 22, 96, 91, 127, 170, 157, + 129, 103, 209, 74, 221, 32, 10, 22, 165, 62, 121, 176, 139, 107, 33, 21, 10, 43, 139, 231, + 141, 70, 16, 239, 174, 194, 19, 21, 191, 189, 216, 81, 133, 35, 200, 168, 213, 249, 63, 120, + 125, 67, 151, 72, 240, 54, 69, 88, 119, 229, 30, 55, 222, 170, 129, 168, 243, 156, 231, 242, + 183, 148, 115, 218, 93, 124, 138, 11, 244, 154, 72, 2, 195, 91, 201, 86, 153, 189, 221, 228, + 53, 168, 84, 150, 122, 109, 124, 93, 124, 125, 196, 227, 63, 222, 21, 86, 170, 218, 245, 86, + 189, 197, 195, 144, 50, 173, 171, 39, 135, 159, 217, 94, 102, 157, 141, 23, 16, 27, 147, 96, + 89, 234, 71, 12, 117, 194, 9, 84, 232, 200, 0, 23, 182, 94, 9, 135, 25, 148, 84, 63, 96, + 213, 44, 96, 156, 74, 153, 191, 104, 25, 213, 53, 232, 133, 2, 39, 50, 181, 168, 26, 180, + 209, 55, 180, 155, 241, 47, 133, 88, 122, 183, 219, 154, 154, 229, 131, 119, 225, 30, 20, + 157, 43, 146, 107, 57, 132, 12, 131, 95, 80, 90, 227, 254, 64, 194, 209, 46, 175, 253, 254, + 206, 46, 194, 214, 214, 14, 71, 204, 235, 73, 216, 85, 26, 77, 237, 27, 216, 173, 82, 58, + 72, 141, 130, 15, 159, 109, 240, 122, 205, 191, 157, 133, 255, 254, 26, 174, 168, 218, 133, + 171, 74, 141, 147, 170, 125, 94, 11, 119, 88, 197, 250, 225, 42, 170, 159, 6, 131, 117, 85, + 214, 180, 209, 16, 153, 71, 37, 9, 219, 0, 84, 18, 168, 219, 75, 239, 179, 164, 118, 84, 44, + 133, 143, 164, 168, 173, 66, 182, 153, 55, 87, 164, 203, 119, 101, 226, 118, 246, 57, 183, + 47, 76, 92, 67, 139, 2, 57, 153, 41, 240, 107, 113, 13, 191, 25, 165, 248, 121, 105, 179, + 197, 17, 240, 139, 107, 83, 3, 62, 62, 125, 196, 129, 182, 105, 163, 175, 149, 56, 119, 245, + 150, 247, 45, 163, 246, 12, 113, 3, 163, 225, 76, 49, 60, 110, 108, 198, 93, 50, 115, 136, + 145, 217, 107, 27, 58, 212, 166, 172, 176, 157, 190, 211, 203, 238, 161, 39, 223, 38, 48, + 180, 40, 48, 250, 122, 171, 91, 20, 60, 117, 189, 81, 171, 82, 231, 74, 121, 194, 187, 211, + 8, 39, 55, 143, 147, 206, 153, 118, 119, 239, 110, 200, 14, 105, 10, 216, 59, 131, 122, 146, + 59, 51, 213, 243, 189, 29, 113, 157, 191, 92, 42, 249, 118, 173, 150, 58, 27, 120, 98, 186, + 240, 29, 2, 180, 253, 10, 254, 35, 233, 175, 125, 83, 83, 250, 80, 206, 19, 26, 240, 81, + 185, 125, 175, 150, 27, 170, 140, 122, 16, 7, 47, 212, 123, 16, 164, 120, 208, 109, 130, 56, + 3, 27, 18, 217, 191, 87, 80, 164, 16, 196, 86, 37, 137, 173, 18, 137, 109, 208, 232, 46, 54, + 48, 106, 23, 17, 10, 137, 65, 79, 2, 250, 127, 121, 242, 254, 148, 154, 190, 151, 82, 55, + 32, 251, 249, 204, 61, 148, 250, 54, 88, 16, 28, 123, 144, 78, 23, 182, 190, 34, 8, 132, 6, + 5, 124, 224, 105, 73, 23, 58, 176, 163, 40, 145, 216, 208, 145, 68, 38, 79, 36, 139, 177, + 10, 77, 172, 66, 195, 185, 132, 16, 225, 170, 66, 75, 115, 98, 21, 72, 87, 87, 239, 251, + 125, 162, 201, 195, 73, 190, 85, 10, 179, 82, 190, 32, 136, 220, 106, 245, 196, 177, 115, + 71, 50, 253, 171, 31, 156, 56, 126, 238, 112, 166, 182, 73, 199, 103, 6, 51, 179, 105, 51, + 19, 155, 29, 200, 206, 166, 77, 240, 171, 67, 31, 189, 204, 229, 79, 86, 159, 57, 244, 241, + 75, 220, 208, 201, 234, 11, 249, 3, 211, 221, 129, 201, 3, 99, 232, 28, 14, 76, 28, 64, 85, + 158, 172, 189, 78, 0, 84, 101, 16, 244, 131, 55, 234, 201, 203, 145, 38, 249, 182, 211, 32, + 132, 189, 200, 42, 0, 77, 166, 83, 14, 66, 22, 149, 54, 71, 180, 10, 75, 108, 155, 151, 51, + 23, 181, 147, 89, 161, 130, 108, 21, 114, 205, 21, 12, 138, 185, 73, 36, 128, 144, 189, 214, + 31, 244, 29, 77, 80, 248, 238, 66, 1, 113, 19, 73, 224, 200, 117, 140, 48, 57, 8, 128, 194, + 214, 130, 111, 168, 63, 215, 217, 224, 130, 49, 96, 183, 5, 140, 164, 175, 244, 31, 218, + 171, 45, 198, 141, 171, 12, 159, 203, 92, 236, 153, 241, 92, 108, 207, 216, 30, 219, 107, + 123, 125, 191, 239, 122, 47, 94, 111, 46, 59, 75, 8, 93, 55, 217, 108, 115, 47, 208, 205, 5, + 164, 146, 144, 10, 90, 181, 82, 74, 165, 62, 65, 131, 168, 32, 169, 132, 128, 23, 104, 34, + 164, 230, 1, 30, 80, 118, 211, 196, 105, 138, 26, 145, 40, 5, 209, 21, 208, 68, 169, 104, + 72, 31, 80, 36, 20, 169, 155, 135, 80, 84, 17, 178, 94, 254, 25, 219, 217, 116, 9, 130, 34, + 33, 91, 154, 57, 71, 51, 103, 206, 255, 157, 255, 251, 255, 239, 219, 178, 189, 250, 165, + 151, 119, 231, 218, 119, 181, 252, 134, 90, 8, 156, 87, 223, 200, 190, 225, 193, 141, 37, + 29, 47, 30, 126, 235, 200, 148, 18, 171, 196, 218, 79, 244, 42, 19, 243, 65, 47, 49, 14, + 230, 214, 229, 253, 211, 71, 230, 14, 55, 14, 110, 27, 84, 250, 71, 115, 237, 247, 55, 52, + 107, 91, 159, 236, 240, 134, 156, 7, 12, 135, 208, 211, 93, 222, 100, 20, 168, 152, 150, + 132, 76, 69, 136, 9, 85, 129, 122, 168, 96, 155, 28, 96, 0, 136, 255, 237, 150, 96, 21, 31, + 205, 40, 122, 188, 169, 59, 121, 223, 171, 41, 123, 109, 247, 116, 169, 203, 24, 225, 63, + 63, 191, 74, 234, 63, 140, 34, 14, 62, 28, 57, 15, 206, 70, 112, 249, 67, 125, 94, 189, 80, + 6, 162, 172, 34, 72, 114, 253, 216, 88, 196, 211, 23, 15, 138, 44, 52, 213, 77, 169, 138, + 41, 216, 210, 62, 181, 182, 180, 116, 245, 95, 41, 242, 245, 218, 100, 70, 161, 188, 91, + 144, 244, 2, 68, 223, 92, 190, 69, 238, 64, 244, 77, 116, 171, 167, 17, 38, 73, 229, 245, + 84, 45, 85, 147, 192, 242, 124, 214, 130, 62, 202, 84, 112, 229, 102, 29, 218, 137, 240, 23, + 173, 110, 217, 133, 160, 30, 175, 19, 90, 215, 234, 154, 161, 172, 197, 107, 161, 176, 88, + 97, 59, 11, 214, 222, 156, 12, 179, 249, 71, 13, 85, 242, 224, 205, 200, 192, 42, 99, 220, + 185, 159, 20, 128, 79, 209, 14, 126, 177, 56, 171, 53, 26, 213, 234, 222, 217, 162, 186, 56, + 11, 127, 59, 209, 188, 246, 140, 77, 51, 43, 254, 127, 254, 218, 10, 236, 76, 143, 157, 142, + 92, 25, 174, 112, 221, 49, 167, 63, 232, 192, 252, 112, 0, 119, 26, 7, 142, 110, 175, 125, + 113, 106, 192, 144, 24, 151, 228, 22, 139, 214, 206, 209, 254, 145, 172, 63, 189, 110, 122, + 235, 244, 186, 116, 109, 207, 183, 119, 20, 102, 172, 146, 207, 197, 80, 202, 75, 46, 119, + 166, 177, 105, 160, 191, 22, 87, 51, 235, 103, 182, 206, 172, 207, 224, 190, 205, 207, 109, + 201, 42, 129, 160, 94, 46, 69, 147, 58, 31, 234, 51, 101, 51, 103, 246, 21, 227, 145, 254, + 146, 245, 133, 9, 235, 208, 230, 130, 228, 213, 21, 69, 143, 5, 194, 253, 126, 94, 15, 234, + 178, 153, 244, 199, 10, 241, 72, 162, 100, 125, 30, 78, 41, 176, 252, 33, 57, 202, 156, 66, + 227, 232, 251, 157, 83, 58, 171, 105, 158, 53, 121, 148, 44, 219, 221, 53, 224, 41, 247, + 152, 89, 6, 95, 57, 159, 156, 138, 122, 122, 19, 30, 152, 152, 11, 76, 13, 182, 240, 35, + 115, 22, 223, 5, 7, 200, 185, 224, 148, 182, 161, 165, 218, 165, 154, 237, 112, 156, 164, + 45, 255, 47, 139, 116, 170, 61, 243, 112, 107, 250, 73, 3, 235, 176, 219, 30, 147, 163, 162, + 55, 89, 173, 71, 54, 125, 109, 170, 255, 144, 207, 111, 167, 229, 87, 197, 104, 167, 11, + 252, 74, 112, 220, 235, 197, 202, 26, 127, 60, 164, 241, 156, 200, 177, 47, 148, 170, 62, + 80, 126, 153, 153, 231, 183, 225, 223, 116, 188, 233, 219, 64, 113, 150, 5, 138, 191, 221, + 113, 175, 237, 217, 102, 147, 119, 243, 188, 158, 2, 180, 190, 177, 124, 139, 190, 67, 47, + 67, 39, 60, 212, 101, 180, 8, 242, 99, 15, 148, 254, 24, 217, 107, 41, 190, 114, 51, 43, + 178, 161, 102, 42, 216, 19, 11, 167, 45, 121, 186, 211, 196, 156, 226, 101, 51, 212, 41, + 251, 142, 211, 148, 255, 155, 199, 31, 236, 121, 35, 28, 183, 74, 24, 58, 85, 127, 180, 126, + 127, 130, 190, 99, 23, 180, 68, 62, 8, 205, 109, 219, 19, 47, 78, 39, 156, 224, 129, 210, + 222, 52, 180, 192, 253, 117, 209, 97, 120, 100, 69, 108, 217, 125, 237, 192, 119, 158, 36, + 247, 39, 218, 174, 207, 57, 77, 144, 108, 237, 205, 64, 220, 6, 40, 128, 121, 136, 187, 132, + 118, 118, 123, 129, 154, 136, 181, 200, 183, 206, 88, 122, 34, 206, 37, 146, 45, 50, 107, + 73, 22, 138, 39, 114, 205, 132, 104, 54, 197, 110, 57, 154, 192, 161, 170, 25, 188, 225, 40, + 96, 83, 189, 97, 46, 218, 102, 43, 124, 118, 213, 67, 93, 222, 240, 88, 166, 29, 1, 188, + 210, 221, 2, 190, 64, 221, 215, 169, 229, 116, 30, 83, 150, 105, 127, 196, 106, 217, 13, + 163, 35, 27, 50, 26, 219, 254, 8, 212, 176, 24, 25, 76, 231, 107, 81, 137, 249, 45, 199, + 253, 154, 122, 34, 213, 76, 186, 106, 10, 244, 56, 43, 107, 134, 124, 239, 143, 154, 46, 49, + 172, 164, 171, 52, 235, 143, 203, 28, 4, 195, 176, 110, 77, 90, 122, 38, 20, 34, 199, 36, + 13, 68, 177, 160, 216, 10, 39, 185, 124, 151, 189, 2, 241, 109, 68, 63, 234, 178, 32, 18, + 245, 86, 74, 37, 181, 208, 34, 27, 44, 49, 170, 142, 201, 42, 67, 199, 199, 213, 181, 45, + 82, 180, 60, 22, 85, 39, 155, 67, 77, 117, 64, 84, 166, 198, 91, 203, 191, 159, 135, 107, 9, + 174, 150, 108, 223, 140, 171, 52, 144, 110, 6, 54, 187, 187, 226, 37, 208, 40, 22, 161, 111, + 1, 22, 193, 142, 25, 8, 85, 189, 13, 56, 218, 160, 122, 213, 25, 52, 26, 14, 44, 150, 98, + 175, 249, 144, 183, 39, 58, 8, 113, 60, 237, 2, 68, 179, 43, 183, 153, 204, 67, 176, 122, + 224, 150, 189, 194, 185, 110, 179, 106, 98, 221, 224, 224, 250, 164, 202, 252, 144, 144, + 151, 25, 37, 181, 126, 176, 182, 14, 70, 31, 186, 89, 200, 143, 116, 174, 22, 17, 233, 41, + 66, 78, 82, 143, 89, 77, 167, 43, 97, 145, 206, 81, 242, 51, 226, 120, 167, 106, 88, 160, + 39, 196, 120, 223, 10, 150, 164, 207, 237, 94, 250, 243, 10, 178, 209, 132, 8, 254, 130, 97, + 4, 27, 88, 73, 178, 129, 181, 97, 86, 132, 165, 167, 196, 238, 136, 113, 43, 128, 114, 28, + 178, 232, 123, 128, 114, 21, 125, 183, 131, 242, 155, 168, 159, 188, 140, 130, 40, 69, 10, + 150, 187, 18, 132, 31, 10, 136, 82, 139, 236, 183, 20, 240, 83, 144, 15, 134, 24, 175, 162, + 100, 82, 4, 169, 255, 186, 61, 23, 23, 243, 205, 164, 168, 69, 155, 218, 138, 52, 252, 68, + 150, 217, 208, 154, 65, 245, 6, 20, 105, 59, 219, 156, 226, 175, 130, 216, 112, 156, 215, + 195, 222, 181, 233, 101, 116, 117, 4, 237, 162, 90, 247, 1, 172, 93, 53, 238, 115, 112, 52, + 12, 64, 159, 190, 228, 194, 145, 241, 129, 114, 61, 166, 48, 175, 189, 198, 200, 209, 225, + 66, 105, 56, 136, 221, 31, 223, 116, 99, 179, 49, 88, 26, 233, 147, 217, 227, 175, 82, 201, + 44, 103, 75, 35, 1, 44, 126, 48, 12, 41, 200, 82, 183, 71, 192, 235, 218, 23, 5, 143, 155, + 178, 178, 161, 225, 179, 248, 199, 222, 144, 204, 81, 206, 35, 180, 175, 225, 130, 75, 114, + 49, 140, 28, 242, 183, 15, 217, 60, 107, 255, 128, 158, 6, 132, 82, 232, 64, 7, 161, 51, + 216, 237, 150, 145, 9, 253, 242, 51, 103, 172, 148, 25, 23, 204, 96, 139, 60, 11, 80, 200, + 102, 172, 25, 18, 124, 77, 97, 19, 51, 131, 54, 245, 60, 200, 3, 73, 214, 229, 27, 84, 224, + 5, 59, 120, 233, 161, 143, 67, 244, 9, 218, 41, 42, 117, 95, 38, 147, 197, 153, 225, 94, + 220, 67, 62, 59, 173, 12, 195, 207, 147, 111, 62, 229, 126, 108, 58, 55, 16, 36, 252, 97, + 143, 206, 182, 23, 60, 193, 70, 181, 88, 139, 200, 252, 187, 244, 2, 231, 43, 213, 139, 141, + 176, 171, 125, 41, 100, 240, 106, 80, 195, 69, 46, 36, 211, 225, 100, 90, 119, 81, 41, 20, + 88, 250, 57, 217, 111, 106, 46, 151, 145, 14, 217, 60, 219, 136, 16, 185, 77, 47, 160, 34, + 250, 105, 215, 81, 10, 74, 26, 171, 138, 130, 53, 78, 109, 145, 115, 103, 98, 126, 248, 161, + 76, 139, 252, 114, 206, 157, 214, 122, 93, 66, 107, 225, 168, 37, 132, 166, 148, 172, 83, + 41, 179, 48, 4, 73, 184, 169, 43, 9, 107, 208, 43, 106, 80, 85, 23, 58, 135, 61, 56, 128, + 224, 244, 247, 204, 194, 129, 223, 95, 251, 83, 45, 229, 56, 216, 61, 179, 157, 178, 155, + 128, 190, 99, 51, 172, 142, 19, 221, 14, 148, 112, 154, 143, 83, 176, 236, 91, 114, 155, 19, + 84, 97, 233, 92, 56, 74, 221, 138, 132, 183, 180, 47, 249, 2, 44, 244, 16, 146, 144, 253, + 30, 158, 113, 65, 69, 61, 141, 247, 185, 65, 55, 126, 37, 154, 15, 186, 83, 249, 138, 55, + 26, 142, 104, 132, 25, 24, 137, 102, 3, 2, 167, 70, 244, 65, 127, 44, 18, 81, 151, 150, 92, + 70, 214, 238, 200, 237, 63, 225, 147, 56, 129, 194, 72, 63, 165, 162, 22, 57, 58, 239, 21, + 3, 17, 164, 94, 93, 128, 24, 47, 15, 14, 216, 219, 226, 249, 94, 166, 246, 216, 143, 79, + 186, 188, 17, 253, 8, 175, 5, 251, 205, 104, 74, 197, 236, 11, 106, 255, 112, 58, 89, 75, + 40, 173, 220, 228, 120, 61, 122, 65, 144, 93, 172, 189, 47, 236, 127, 181, 191, 96, 240, + 188, 81, 0, 149, 127, 98, 249, 175, 248, 13, 250, 11, 199, 203, 132, 79, 33, 127, 139, 180, + 206, 10, 125, 73, 48, 94, 202, 20, 154, 88, 152, 128, 79, 14, 45, 2, 32, 171, 93, 135, 182, + 106, 140, 223, 144, 19, 163, 249, 252, 104, 66, 146, 58, 87, 121, 245, 152, 26, 133, 177, + 148, 162, 164, 198, 10, 197, 241, 148, 170, 166, 198, 151, 166, 10, 13, 123, 162, 81, 40, + 172, 177, 175, 107, 236, 252, 120, 17, 246, 115, 18, 231, 144, 136, 220, 115, 110, 186, 25, + 182, 96, 199, 203, 57, 205, 31, 242, 210, 192, 39, 39, 119, 236, 176, 38, 119, 110, 183, 94, + 153, 181, 38, 30, 223, 99, 77, 216, 111, 5, 232, 16, 62, 201, 62, 15, 136, 249, 87, 16, 123, + 4, 77, 116, 1, 195, 159, 18, 48, 86, 206, 118, 17, 115, 138, 26, 32, 246, 147, 254, 66, 128, + 231, 3, 182, 170, 37, 237, 63, 208, 93, 236, 239, 192, 4, 133, 222, 68, 58, 153, 134, 173, + 34, 178, 101, 78, 80, 89, 84, 173, 194, 247, 110, 64, 254, 249, 186, 223, 194, 157, 18, 204, + 223, 99, 213, 104, 49, 145, 31, 14, 51, 28, 217, 197, 168, 145, 114, 188, 48, 100, 50, 108, + 123, 201, 163, 10, 172, 75, 13, 105, 220, 49, 143, 214, 185, 131, 47, 172, 193, 199, 200, + 24, 153, 69, 10, 210, 230, 16, 47, 158, 131, 84, 96, 80, 117, 17, 219, 60, 134, 46, 224, + 100, 36, 128, 225, 228, 222, 152, 17, 108, 239, 11, 25, 70, 8, 159, 144, 52, 137, 197, 31, + 143, 87, 170, 141, 177, 138, 16, 204, 1, 46, 203, 127, 195, 239, 50, 12, 57, 190, 178, 82, + 252, 223, 174, 196, 48, 122, 232, 222, 22, 83, 215, 77, 58, 39, 121, 5, 142, 140, 213, 171, + 213, 250, 88, 85, 8, 101, 109, 132, 15, 181, 143, 147, 8, 251, 10, 74, 162, 254, 183, 144, + 137, 239, 130, 224, 81, 241, 223, 17, 135, 40, 121, 110, 94, 143, 137, 47, 161, 9, 8, 126, + 233, 218, 226, 53, 8, 31, 115, 32, 203, 188, 1, 195, 223, 41, 44, 217, 10, 117, 8, 212, 1, + 131, 4, 118, 236, 218, 189, 141, 51, 202, 185, 72, 46, 172, 208, 209, 199, 70, 204, 240, + 232, 204, 8, 145, 130, 249, 120, 170, 18, 164, 236, 227, 23, 219, 251, 223, 191, 222, 254, + 242, 101, 53, 160, 186, 24, 94, 228, 15, 92, 121, 239, 250, 51, 79, 95, 127, 239, 234, 65, + 214, 197, 83, 94, 54, 96, 63, 251, 97, 63, 94, 216, 79, 2, 165, 206, 1, 254, 207, 206, 121, + 117, 246, 60, 108, 75, 65, 49, 252, 143, 121, 221, 20, 58, 27, 130, 237, 168, 206, 142, 236, + 12, 176, 15, 37, 147, 25, 174, 143, 122, 71, 134, 73, 54, 211, 109, 154, 134, 151, 120, 205, + 145, 153, 81, 170, 132, 115, 145, 124, 217, 224, 182, 239, 222, 181, 147, 165, 161, 114, 58, + 150, 51, 197, 127, 210, 94, 245, 177, 109, 220, 101, 248, 222, 59, 223, 217, 231, 239, 143, + 179, 99, 199, 142, 63, 226, 248, 43, 142, 63, 226, 115, 156, 56, 159, 151, 239, 56, 36, 105, + 18, 39, 93, 147, 52, 9, 205, 210, 172, 161, 77, 219, 44, 5, 58, 186, 242, 49, 24, 160, 106, + 99, 26, 130, 181, 80, 96, 8, 77, 67, 172, 82, 87, 218, 36, 187, 165, 8, 85, 34, 18, 2, 132, + 84, 209, 106, 72, 76, 76, 251, 99, 84, 99, 82, 167, 1, 127, 12, 117, 138, 195, 123, 103, 39, + 105, 203, 254, 0, 52, 124, 146, 239, 116, 119, 250, 253, 222, 123, 158, 231, 125, 223, 231, + 165, 142, 28, 35, 203, 151, 223, 252, 227, 173, 35, 24, 136, 66, 133, 33, 109, 194, 139, + 111, 254, 9, 94, 252, 149, 206, 166, 199, 96, 84, 244, 31, 10, 121, 140, 231, 135, 133, 203, + 100, 7, 253, 13, 194, 67, 56, 175, 18, 86, 135, 72, 214, 172, 171, 29, 119, 12, 229, 119, + 36, 188, 37, 196, 183, 254, 188, 89, 155, 164, 101, 204, 119, 252, 155, 111, 215, 190, 202, + 184, 116, 152, 77, 133, 223, 153, 92, 156, 86, 203, 185, 76, 80, 167, 66, 241, 153, 77, 231, + 207, 75, 231, 127, 166, 194, 106, 206, 107, 99, 82, 86, 175, 149, 101, 173, 149, 229, 124, + 232, 222, 115, 42, 91, 165, 196, 204, 35, 133, 203, 80, 144, 119, 118, 189, 142, 38, 52, 38, + 176, 70, 150, 51, 222, 113, 24, 238, 48, 165, 173, 55, 37, 73, 210, 59, 181, 76, 246, 208, + 187, 110, 90, 142, 1, 10, 58, 220, 178, 240, 91, 147, 153, 102, 117, 170, 11, 23, 138, 103, + 200, 96, 48, 186, 130, 205, 203, 169, 195, 169, 242, 74, 155, 138, 94, 14, 241, 229, 149, + 82, 0, 94, 43, 129, 66, 34, 182, 223, 163, 39, 233, 125, 196, 24, 113, 132, 120, 146, 56, + 75, 156, 17, 12, 185, 149, 211, 232, 168, 186, 186, 210, 110, 199, 164, 162, 117, 252, 151, + 228, 119, 9, 53, 49, 75, 190, 64, 112, 132, 159, 228, 5, 156, 120, 185, 68, 130, 83, 83, + 173, 139, 34, 121, 81, 208, 19, 145, 72, 87, 110, 37, 237, 62, 237, 152, 84, 14, 205, 139, + 224, 191, 102, 56, 59, 114, 92, 132, 200, 213, 161, 193, 172, 8, 99, 63, 239, 26, 36, 218, + 112, 26, 104, 67, 159, 84, 38, 117, 50, 100, 116, 179, 12, 139, 188, 220, 210, 141, 119, 77, + 101, 89, 222, 132, 79, 48, 227, 36, 129, 21, 117, 86, 156, 10, 144, 111, 55, 85, 214, 74, + 213, 237, 141, 11, 197, 123, 124, 10, 123, 26, 94, 23, 237, 147, 124, 82, 0, 186, 104, 233, + 221, 116, 113, 48, 163, 184, 226, 224, 134, 11, 226, 11, 48, 234, 235, 56, 36, 84, 213, 249, + 77, 169, 207, 188, 180, 178, 120, 97, 46, 25, 201, 63, 153, 119, 118, 246, 246, 85, 234, + 172, 6, 86, 229, 72, 4, 252, 232, 152, 244, 206, 176, 221, 207, 87, 217, 85, 26, 139, 150, + 161, 148, 166, 176, 203, 150, 104, 29, 205, 36, 230, 151, 78, 117, 180, 63, 185, 52, 41, 84, + 193, 151, 245, 142, 160, 189, 105, 95, 146, 51, 7, 27, 130, 213, 77, 65, 243, 73, 111, 243, + 68, 163, 187, 41, 203, 219, 98, 83, 251, 247, 121, 252, 9, 183, 190, 240, 35, 88, 108, 120, + 244, 192, 112, 48, 62, 210, 223, 233, 235, 57, 51, 89, 23, 206, 29, 237, 108, 94, 56, 56, + 30, 245, 116, 119, 119, 85, 112, 233, 198, 230, 10, 15, 78, 39, 52, 165, 54, 233, 188, 201, + 185, 233, 241, 128, 179, 202, 170, 210, 87, 249, 3, 213, 156, 78, 163, 241, 240, 97, 47, 95, + 105, 230, 34, 173, 227, 75, 228, 95, 172, 177, 218, 122, 175, 55, 195, 243, 78, 123, 181, + 199, 108, 241, 39, 182, 134, 163, 125, 233, 10, 141, 197, 105, 172, 26, 25, 29, 169, 178, + 37, 146, 41, 234, 44, 102, 16, 49, 134, 147, 205, 77, 186, 138, 72, 19, 125, 196, 59, 197, + 222, 252, 58, 209, 191, 125, 227, 53, 3, 214, 184, 126, 136, 182, 137, 228, 165, 85, 173, + 203, 165, 173, 219, 32, 191, 130, 220, 191, 45, 232, 165, 39, 168, 64, 66, 11, 6, 74, 219, + 184, 211, 96, 27, 69, 104, 189, 150, 76, 210, 65, 113, 251, 131, 107, 26, 24, 12, 238, 60, + 8, 138, 208, 38, 176, 150, 137, 46, 185, 241, 118, 137, 32, 96, 227, 157, 45, 53, 94, 236, + 187, 81, 36, 88, 154, 28, 177, 249, 222, 158, 142, 162, 117, 65, 150, 177, 245, 76, 71, 157, + 107, 24, 128, 129, 250, 164, 118, 192, 114, 128, 91, 76, 148, 90, 154, 2, 5, 162, 64, 129, + 48, 214, 82, 75, 147, 20, 160, 44, 121, 231, 146, 32, 148, 37, 65, 80, 55, 155, 79, 189, + 114, 98, 242, 235, 115, 173, 1, 189, 33, 58, 116, 230, 213, 211, 193, 193, 142, 184, 65, 69, + 147, 148, 74, 175, 214, 6, 51, 185, 228, 200, 201, 30, 47, 216, 178, 157, 67, 53, 115, 207, + 76, 84, 23, 10, 230, 112, 71, 194, 149, 73, 39, 173, 246, 68, 111, 34, 222, 29, 183, 195, + 149, 185, 159, 62, 209, 29, 25, 60, 126, 238, 39, 83, 3, 47, 255, 248, 249, 37, 129, 213, + 155, 117, 70, 139, 139, 243, 68, 202, 212, 58, 163, 182, 249, 177, 111, 14, 232, 49, 243, + 50, 243, 223, 58, 201, 15, 214, 57, 213, 104, 22, 143, 62, 55, 230, 175, 108, 205, 19, 4, + 69, 180, 200, 60, 5, 176, 95, 215, 19, 189, 224, 222, 97, 42, 183, 125, 99, 93, 226, 35, 7, + 201, 235, 228, 9, 204, 183, 48, 121, 66, 80, 187, 13, 126, 55, 135, 135, 186, 97, 131, 188, + 36, 147, 166, 46, 146, 102, 160, 136, 14, 145, 124, 106, 85, 93, 215, 66, 199, 118, 224, + 139, 137, 96, 17, 88, 199, 68, 183, 12, 95, 183, 8, 214, 7, 225, 67, 187, 44, 205, 174, 8, + 158, 196, 14, 166, 33, 254, 21, 189, 53, 114, 36, 228, 216, 78, 96, 59, 128, 109, 7, 149, 0, + 106, 5, 48, 189, 192, 244, 0, 211, 13, 76, 23, 48, 245, 192, 100, 128, 169, 3, 38, 13, 12, + 15, 108, 28, 216, 24, 176, 53, 192, 70, 129, 173, 6, 198, 7, 148, 23, 52, 24, 187, 129, 250, + 47, 227, 41, 114, 73, 204, 76, 63, 244, 3, 249, 127, 226, 126, 219, 242, 239, 229, 1, 100, + 122, 145, 120, 204, 254, 76, 198, 146, 150, 235, 129, 149, 179, 241, 169, 12, 117, 179, 229, + 243, 87, 86, 142, 191, 124, 178, 193, 215, 126, 168, 141, 31, 109, 116, 215, 47, 189, 116, + 236, 232, 247, 230, 18, 158, 134, 209, 116, 203, 167, 59, 252, 133, 183, 184, 104, 91, 116, + 108, 212, 90, 211, 147, 204, 237, 115, 59, 234, 134, 235, 226, 61, 241, 178, 195, 243, 115, + 135, 96, 234, 192, 185, 217, 218, 154, 241, 179, 35, 245, 135, 242, 57, 159, 171, 125, 240, + 96, 102, 232, 75, 211, 169, 248, 216, 103, 123, 19, 19, 195, 189, 21, 222, 190, 252, 12, + 217, 226, 111, 8, 113, 131, 93, 222, 76, 50, 94, 30, 157, 219, 90, 15, 180, 100, 82, 229, + 142, 84, 125, 139, 127, 104, 116, 76, 202, 200, 44, 50, 253, 6, 50, 109, 65, 183, 252, 235, + 29, 158, 99, 37, 158, 99, 192, 109, 96, 117, 37, 182, 111, 223, 71, 169, 247, 186, 92, 112, + 157, 219, 239, 74, 105, 225, 220, 193, 209, 137, 165, 20, 179, 53, 31, 176, 227, 221, 128, + 12, 102, 64, 132, 113, 4, 115, 127, 9, 76, 57, 57, 118, 185, 45, 242, 105, 198, 61, 88, 47, + 176, 106, 32, 57, 32, 165, 245, 165, 5, 255, 167, 133, 103, 101, 126, 112, 217, 137, 135, + 125, 36, 102, 152, 66, 202, 48, 107, 49, 195, 20, 212, 27, 169, 229, 181, 175, 62, 125, 121, + 33, 194, 47, 175, 61, 245, 244, 171, 11, 225, 194, 135, 106, 171, 167, 166, 161, 178, 105, + 48, 102, 182, 37, 250, 211, 161, 230, 152, 219, 162, 36, 159, 185, 120, 239, 202, 204, 212, + 165, 15, 127, 240, 253, 143, 228, 243, 207, 14, 62, 123, 164, 15, 21, 241, 248, 43, 203, + 231, 214, 142, 70, 29, 169, 129, 249, 47, 98, 109, 250, 14, 166, 204, 21, 186, 140, 136, 19, + 107, 165, 121, 67, 199, 70, 128, 13, 131, 42, 4, 96, 134, 164, 184, 125, 67, 96, 17, 63, 33, + 9, 20, 17, 17, 201, 111, 95, 115, 219, 53, 56, 43, 188, 181, 134, 55, 77, 22, 179, 8, 103, + 5, 214, 63, 26, 49, 24, 65, 67, 27, 69, 136, 94, 21, 152, 177, 226, 183, 225, 71, 165, 218, + 182, 208, 98, 70, 127, 191, 201, 111, 161, 163, 154, 157, 142, 18, 178, 240, 156, 130, 61, + 18, 134, 8, 238, 115, 223, 86, 210, 14, 255, 201, 122, 146, 162, 167, 137, 29, 1, 151, 70, + 144, 18, 96, 188, 73, 201, 48, 65, 185, 115, 215, 7, 138, 37, 202, 42, 155, 7, 234, 10, 163, + 209, 179, 91, 25, 149, 94, 195, 208, 120, 245, 183, 155, 101, 21, 38, 134, 84, 233, 181, 96, + 163, 13, 246, 144, 39, 152, 176, 171, 110, 177, 6, 13, 61, 239, 194, 153, 67, 93, 22, 114, + 85, 224, 252, 67, 245, 175, 104, 104, 83, 117, 208, 238, 177, 233, 85, 171, 10, 154, 2, 74, + 169, 101, 63, 186, 165, 177, 75, 115, 200, 1, 196, 238, 23, 168, 191, 86, 48, 151, 176, 211, + 43, 106, 64, 129, 41, 219, 8, 108, 22, 52, 130, 88, 210, 162, 0, 54, 145, 124, 127, 157, 15, + 224, 65, 100, 55, 200, 247, 9, 205, 246, 123, 69, 89, 106, 80, 54, 154, 106, 17, 22, 215, + 77, 13, 89, 175, 55, 251, 113, 18, 90, 20, 116, 188, 141, 137, 231, 141, 89, 89, 65, 216, + 248, 39, 246, 80, 193, 137, 12, 211, 28, 69, 100, 202, 74, 229, 230, 174, 220, 30, 162, 123, + 163, 30, 98, 62, 35, 167, 187, 83, 176, 60, 16, 29, 70, 101, 160, 62, 201, 157, 247, 74, 13, + 60, 76, 76, 125, 253, 158, 121, 40, 169, 155, 217, 173, 51, 74, 201, 99, 33, 144, 210, 144, + 104, 71, 55, 197, 50, 70, 7, 247, 118, 231, 104, 220, 100, 141, 180, 86, 55, 77, 117, 199, + 117, 232, 182, 104, 138, 81, 59, 58, 231, 62, 39, 28, 62, 63, 95, 107, 31, 56, 247, 248, + 121, 40, 168, 77, 90, 230, 104, 69, 164, 92, 163, 42, 171, 241, 251, 208, 102, 88, 63, 232, + 89, 153, 29, 174, 242, 53, 213, 56, 220, 1, 143, 214, 149, 168, 44, 243, 148, 153, 236, 1, + 191, 157, 159, 58, 219, 215, 246, 133, 103, 47, 45, 95, 212, 58, 34, 200, 221, 56, 214, 142, + 117, 228, 238, 0, 180, 23, 185, 123, 77, 213, 11, 234, 30, 208, 76, 238, 144, 54, 9, 181, + 34, 249, 27, 65, 55, 148, 15, 14, 9, 193, 161, 161, 160, 64, 233, 157, 27, 228, 95, 177, + 164, 188, 187, 42, 189, 160, 71, 160, 138, 36, 234, 17, 73, 125, 247, 117, 216, 79, 52, 17, + 44, 204, 172, 155, 154, 240, 176, 101, 74, 128, 102, 118, 0, 205, 72, 169, 159, 203, 215, + 136, 160, 16, 76, 94, 47, 157, 203, 219, 164, 186, 96, 147, 177, 181, 137, 176, 255, 129, + 186, 32, 181, 98, 236, 30, 18, 188, 217, 162, 159, 43, 82, 123, 59, 42, 121, 61, 180, 120, + 38, 115, 118, 143, 96, 167, 160, 43, 125, 0, 6, 110, 160, 254, 255, 193, 236, 177, 189, 83, + 179, 24, 121, 2, 45, 26, 1, 153, 236, 221, 58, 182, 123, 231, 227, 232, 183, 186, 41, 106, + 189, 255, 107, 226, 82, 199, 169, 137, 70, 51, 171, 164, 140, 70, 117, 237, 192, 66, 123, + 253, 88, 83, 133, 191, 123, 177, 247, 164, 206, 172, 165, 105, 141, 73, 187, 220, 56, 217, + 226, 181, 69, 187, 226, 233, 131, 57, 94, 171, 210, 170, 20, 36, 195, 114, 173, 51, 103, + 250, 102, 158, 127, 148, 119, 55, 62, 146, 237, 58, 246, 169, 48, 156, 57, 244, 194, 66, + 157, 197, 229, 54, 114, 206, 72, 69, 50, 224, 244, 56, 203, 19, 157, 145, 88, 31, 239, 82, + 218, 66, 158, 138, 0, 167, 114, 166, 122, 163, 190, 166, 168, 195, 19, 240, 42, 185, 160, + 219, 225, 179, 25, 45, 193, 42, 71, 77, 254, 137, 129, 166, 133, 225, 6, 61, 165, 170, 27, + 62, 140, 253, 165, 106, 251, 30, 245, 14, 205, 17, 213, 88, 29, 255, 81, 202, 112, 78, 25, + 7, 101, 20, 24, 23, 40, 141, 160, 212, 3, 163, 3, 141, 92, 36, 53, 146, 16, 146, 8, 125, + 220, 103, 20, 201, 199, 86, 67, 10, 5, 17, 219, 32, 89, 194, 182, 253, 119, 65, 135, 15, + 109, 206, 120, 72, 6, 55, 132, 224, 174, 42, 240, 43, 163, 34, 28, 94, 21, 124, 163, 234, + 113, 196, 89, 2, 26, 81, 230, 183, 162, 155, 41, 44, 153, 152, 192, 9, 254, 110, 10, 237, + 157, 196, 121, 169, 125, 59, 133, 76, 200, 0, 161, 56, 132, 162, 16, 116, 65, 200, 8, 33, + 61, 4, 255, 197, 126, 153, 0, 69, 121, 158, 113, 252, 121, 158, 247, 221, 93, 88, 150, 93, + 118, 97, 97, 89, 97, 249, 246, 3, 150, 149, 69, 78, 151, 75, 196, 21, 145, 32, 40, 130, 7, + 26, 99, 196, 19, 165, 94, 136, 120, 6, 47, 188, 18, 15, 130, 196, 24, 53, 214, 166, 49, 157, + 73, 83, 51, 205, 132, 24, 73, 76, 213, 58, 54, 153, 152, 52, 77, 51, 182, 227, 116, 26, 167, + 130, 147, 201, 88, 109, 173, 137, 147, 54, 42, 244, 221, 3, 88, 60, 50, 48, 153, 158, 195, + 55, 243, 251, 142, 157, 239, 123, 255, 239, 62, 199, 251, 62, 79, 48, 62, 100, 78, 158, 169, + 244, 95, 209, 235, 205, 190, 85, 130, 240, 171, 232, 189, 186, 171, 62, 167, 179, 39, 153, + 177, 119, 101, 13, 199, 88, 180, 178, 171, 70, 195, 74, 141, 37, 213, 22, 151, 22, 29, 212, + 169, 215, 134, 235, 68, 227, 23, 172, 198, 22, 133, 201, 81, 144, 146, 81, 236, 8, 91, 25, + 18, 209, 89, 67, 157, 63, 195, 105, 88, 159, 225, 188, 166, 214, 169, 21, 10, 113, 186, 166, + 138, 76, 73, 144, 82, 108, 114, 40, 253, 42, 48, 56, 144, 43, 130, 66, 130, 238, 222, 78, + 163, 109, 247, 94, 119, 215, 205, 179, 69, 142, 190, 161, 208, 66, 62, 124, 233, 203, 81, + 69, 38, 42, 156, 125, 22, 214, 172, 54, 210, 156, 176, 167, 219, 211, 181, 209, 239, 210, + 121, 79, 5, 231, 241, 132, 55, 39, 69, 33, 28, 223, 42, 203, 10, 255, 168, 159, 255, 102, + 82, 69, 96, 27, 206, 61, 25, 106, 242, 24, 199, 228, 31, 235, 247, 28, 23, 111, 120, 10, + 167, 20, 111, 182, 93, 244, 21, 114, 126, 121, 22, 154, 152, 137, 137, 89, 232, 155, 138, + 103, 21, 253, 62, 50, 125, 87, 205, 222, 84, 242, 110, 255, 189, 153, 163, 116, 119, 164, + 122, 145, 97, 158, 142, 84, 120, 198, 170, 207, 204, 244, 110, 109, 227, 182, 159, 170, 203, + 91, 82, 153, 165, 23, 117, 54, 15, 212, 4, 168, 135, 142, 153, 61, 38, 183, 170, 32, 206, + 226, 170, 30, 151, 91, 149, 24, 29, 25, 35, 211, 130, 192, 144, 32, 133, 49, 172, 115, 120, + 236, 88, 91, 205, 177, 229, 185, 248, 74, 205, 79, 86, 228, 233, 34, 34, 116, 134, 72, 155, + 57, 42, 193, 164, 142, 136, 138, 48, 57, 203, 179, 83, 75, 135, 155, 53, 209, 9, 148, 110, + 143, 213, 152, 29, 150, 188, 204, 206, 63, 115, 74, 171, 218, 11, 93, 93, 221, 61, 16, 41, + 217, 5, 112, 123, 168, 66, 100, 200, 41, 225, 161, 24, 56, 218, 237, 33, 3, 42, 244, 24, + 100, 237, 246, 144, 21, 69, 54, 124, 212, 170, 84, 26, 245, 167, 200, 253, 145, 177, 219, + 67, 70, 97, 56, 163, 66, 223, 109, 50, 189, 39, 52, 205, 21, 65, 221, 161, 233, 72, 247, + 174, 119, 159, 223, 240, 154, 169, 219, 254, 90, 159, 132, 24, 90, 199, 190, 243, 251, 251, + 150, 40, 21, 122, 123, 218, 44, 180, 202, 158, 18, 193, 99, 74, 118, 138, 171, 52, 1, 157, + 149, 202, 80, 217, 153, 224, 204, 143, 166, 0, 188, 112, 239, 79, 70, 163, 50, 72, 167, 102, + 104, 48, 105, 85, 252, 71, 209, 142, 120, 107, 232, 221, 248, 224, 144, 64, 166, 210, 69, + 232, 217, 173, 172, 60, 139, 35, 74, 163, 50, 37, 9, 155, 248, 250, 13, 97, 147, 143, 193, + 93, 149, 22, 136, 231, 51, 98, 103, 73, 133, 2, 184, 212, 93, 149, 22, 250, 250, 196, 66, + 140, 22, 187, 202, 190, 86, 208, 106, 161, 173, 79, 183, 49, 162, 141, 214, 157, 140, 119, + 121, 98, 197, 213, 134, 246, 86, 73, 82, 249, 199, 83, 162, 43, 48, 113, 114, 79, 40, 137, + 178, 72, 85, 233, 95, 232, 123, 26, 195, 27, 231, 221, 6, 243, 111, 11, 11, 197, 208, 34, + 91, 110, 186, 212, 98, 109, 239, 29, 220, 21, 232, 30, 61, 228, 190, 253, 224, 59, 37, 188, + 26, 126, 189, 33, 247, 245, 134, 61, 113, 154, 165, 84, 250, 85, 174, 188, 187, 55, 244, 86, + 174, 153, 236, 76, 200, 176, 137, 27, 90, 215, 59, 166, 22, 165, 133, 171, 153, 72, 119, 77, + 210, 168, 242, 180, 41, 245, 197, 50, 37, 55, 78, 89, 216, 60, 99, 104, 110, 221, 107, 181, + 51, 118, 206, 25, 29, 175, 235, 188, 99, 74, 45, 78, 77, 41, 28, 22, 30, 58, 180, 32, 37, + 119, 33, 157, 155, 248, 211, 151, 91, 150, 186, 52, 134, 48, 163, 61, 206, 106, 15, 87, 105, + 13, 218, 188, 234, 29, 37, 209, 142, 204, 234, 150, 153, 115, 142, 173, 41, 72, 44, 91, 254, + 244, 209, 244, 197, 205, 149, 113, 214, 188, 73, 105, 206, 10, 167, 57, 22, 186, 15, 204, + 235, 11, 29, 30, 56, 236, 50, 128, 130, 63, 130, 75, 125, 81, 169, 251, 71, 64, 54, 64, 224, + 233, 7, 9, 10, 243, 99, 91, 255, 209, 148, 123, 9, 46, 243, 113, 253, 225, 232, 234, 1, 66, + 46, 61, 28, 253, 233, 129, 97, 104, 235, 37, 204, 220, 23, 99, 203, 195, 9, 47, 239, 75, 68, + 220, 0, 16, 243, 143, 148, 30, 196, 156, 11, 48, 68, 59, 200, 32, 143, 38, 234, 139, 129, + 99, 73, 4, 136, 169, 236, 31, 82, 83, 95, 100, 91, 255, 136, 205, 253, 239, 38, 190, 168, + 127, 216, 10, 252, 184, 62, 48, 18, 46, 246, 98, 247, 99, 232, 244, 135, 147, 248, 71, 0, + 199, 181, 71, 147, 244, 233, 192, 72, 14, 235, 37, 197, 208, 151, 212, 182, 254, 145, 246, + 197, 191, 143, 244, 203, 253, 39, 227, 52, 128, 51, 238, 65, 50, 133, 207, 178, 108, 15, + 146, 93, 50, 200, 32, 131, 12, 50, 200, 32, 143, 224, 109, 47, 57, 98, 15, 201, 105, 240, + 227, 203, 239, 79, 110, 201, 35, 216, 239, 227, 114, 255, 24, 177, 76, 208, 9, 144, 183, 86, + 112, 235, 95, 71, 254, 217, 255, 15, 92, 139, 188, 20, 76, 250, 207, 50, 230, 0, 64, 225, + 103, 0, 69, 162, 134, 46, 126, 19, 160, 36, 29, 160, 244, 188, 64, 212, 131, 227, 69, 143, + 58, 94, 196, 72, 217, 234, 65, 254, 151, 0, 230, 35, 10, 80, 156, 65, 249, 7, 241, 132, 158, + 103, 174, 20, 245, 41, 52, 128, 11, 20, 144, 7, 27, 113, 19, 182, 96, 23, 13, 161, 15, 232, + 67, 250, 156, 113, 22, 192, 52, 204, 192, 140, 204, 206, 10, 217, 42, 182, 145, 237, 98, + 123, 216, 143, 217, 39, 188, 138, 207, 227, 171, 248, 62, 203, 118, 203, 87, 82, 136, 100, + 148, 204, 146, 69, 146, 37, 155, 148, 42, 229, 74, 35, 165, 66, 169, 86, 106, 146, 142, 91, + 21, 214, 80, 107, 132, 85, 178, 202, 86, 155, 53, 217, 90, 101, 61, 36, 147, 172, 148, 117, + 178, 65, 54, 203, 22, 217, 33, 23, 203, 179, 229, 5, 241, 23, 238, 240, 174, 46, 49, 11, 9, + 94, 18, 234, 223, 146, 137, 222, 23, 234, 151, 24, 48, 37, 83, 123, 212, 109, 66, 189, 94, + 168, 111, 19, 234, 77, 236, 24, 7, 62, 151, 215, 241, 102, 203, 102, 203, 45, 161, 30, 42, + 153, 164, 40, 73, 242, 168, 231, 248, 212, 235, 125, 234, 225, 61, 234, 147, 173, 205, 62, + 117, 189, 28, 217, 163, 62, 95, 168, 131, 71, 29, 104, 8, 120, 142, 174, 66, 240, 29, 93, + 209, 157, 162, 59, 234, 122, 188, 43, 185, 43, 22, 160, 179, 13, 238, 59, 58, 230, 246, 220, + 101, 92, 85, 119, 56, 58, 66, 59, 174, 118, 236, 0, 104, 255, 182, 253, 141, 142, 108, 113, + 109, 108, 223, 36, 126, 141, 114, 191, 209, 94, 218, 94, 210, 238, 25, 185, 61, 185, 61, + 246, 202, 157, 43, 237, 87, 58, 46, 239, 22, 143, 8, 13, 40, 222, 165, 175, 169, 147, 113, + 225, 38, 206, 180, 44, 156, 153, 221, 111, 122, 207, 226, 106, 18, 200, 172, 152, 29, 229, + 51, 249, 44, 62, 159, 87, 243, 90, 0, 94, 203, 235, 249, 90, 222, 224, 63, 35, 94, 239, 187, + 190, 220, 243, 203, 17, 254, 150, 239, 238, 44, 63, 215, 231, 93, 247, 255, 97, 172, 132, + 189, 192, 78, 178, 87, 121, 14, 59, 200, 14, 8, 27, 111, 98, 77, 124, 36, 155, 202, 234, + 216, 116, 182, 132, 93, 103, 55, 216, 95, 216, 95, 217, 77, 246, 55, 118, 139, 125, 197, + 190, 102, 183, 217, 52, 86, 201, 11, 249, 104, 62, 150, 77, 96, 47, 2, 7, 61, 24, 192, 36, + 98, 201, 6, 9, 144, 4, 41, 144, 43, 34, 41, 31, 10, 97, 44, 148, 194, 52, 120, 28, 102, 192, + 44, 152, 15, 139, 96, 37, 212, 195, 58, 88, 15, 155, 216, 102, 86, 203, 182, 176, 253, 108, + 61, 222, 64, 66, 29, 134, 160, 25, 45, 104, 199, 114, 156, 129, 79, 98, 13, 46, 193, 229, + 184, 10, 87, 227, 6, 124, 6, 119, 227, 30, 108, 198, 195, 120, 2, 207, 226, 47, 241, 125, + 252, 0, 63, 102, 141, 108, 25, 219, 202, 158, 23, 179, 47, 101, 175, 177, 227, 236, 21, 246, + 115, 182, 156, 237, 35, 21, 59, 138, 159, 178, 69, 124, 156, 152, 253, 75, 20, 44, 34, 165, + 136, 253, 157, 253, 3, 111, 241, 73, 172, 133, 53, 80, 34, 251, 6, 127, 203, 106, 120, 18, + 79, 228, 233, 172, 76, 196, 188, 18, 84, 16, 0, 129, 160, 1, 29, 68, 64, 52, 88, 32, 6, 172, + 144, 10, 105, 144, 14, 195, 97, 8, 20, 195, 120, 152, 0, 101, 48, 17, 202, 249, 40, 152, 2, + 53, 240, 3, 88, 12, 75, 69, 198, 76, 199, 131, 200, 144, 163, 2, 149, 168, 66, 53, 6, 163, + 17, 99, 80, 66, 43, 198, 226, 44, 172, 194, 217, 56, 23, 163, 113, 29, 186, 115, 106, 51, + 110, 193, 70, 238, 194, 29, 248, 54, 158, 196, 54, 124, 23, 63, 196, 93, 248, 17, 168, 49, + 0, 130, 48, 16, 180, 168, 129, 80, 212, 67, 24, 26, 32, 28, 195, 192, 136, 161, 16, 137, 67, + 192, 140, 81, 32, 99, 28, 196, 98, 60, 196, 161, 13, 226, 49, 1, 36, 148, 193, 142, 21, 48, + 20, 39, 65, 34, 78, 6, 7, 78, 129, 97, 248, 4, 36, 227, 76, 200, 192, 57, 224, 196, 121, + 144, 137, 243, 33, 27, 23, 64, 22, 86, 67, 14, 46, 132, 17, 184, 24, 70, 226, 82, 92, 6, + 163, 176, 22, 70, 99, 29, 184, 112, 5, 140, 193, 122, 40, 192, 149, 80, 132, 107, 96, 28, + 174, 135, 199, 112, 45, 62, 5, 37, 216, 0, 21, 184, 21, 38, 225, 54, 152, 140, 219, 161, 18, + 159, 134, 39, 112, 47, 60, 137, 207, 194, 76, 108, 130, 42, 220, 7, 179, 177, 5, 230, 226, + 126, 152, 131, 207, 65, 53, 30, 129, 5, 248, 34, 44, 196, 31, 194, 18, 124, 7, 150, 225, 41, + 88, 142, 239, 65, 45, 254, 2, 86, 224, 105, 168, 195, 51, 176, 6, 207, 195, 6, 188, 0, 27, + 97, 51, 254, 26, 26, 241, 55, 176, 5, 63, 193, 67, 16, 140, 65, 16, 130, 90, 152, 138, 59, + 97, 30, 62, 239, 30, 11, 191, 193, 187, 100, 160, 56, 138, 160, 36, 34, 138, 193, 155, 120, + 91, 172, 9, 10, 10, 33, 35, 217, 41, 136, 204, 36, 139, 21, 42, 153, 28, 52, 140, 14, 211, + 17, 74, 163, 163, 148, 73, 57, 148, 71, 37, 84, 78, 141, 148, 74, 233, 148, 65, 195, 201, + 73, 89, 148, 77, 185, 52, 130, 242, 105, 20, 185, 104, 52, 21, 208, 24, 26, 75, 69, 244, 24, + 21, 211, 56, 26, 79, 19, 168, 140, 38, 210, 72, 42, 165, 149, 180, 142, 26, 104, 51, 61, 71, + 117, 84, 79, 171, 105, 13, 173, 165, 245, 244, 20, 109, 160, 77, 180, 149, 182, 209, 118, + 218, 65, 59, 233, 25, 218, 77, 123, 168, 137, 246, 210, 179, 212, 76, 251, 233, 0, 189, 64, + 7, 105, 11, 181, 208, 46, 218, 71, 135, 232, 56, 189, 78, 191, 163, 87, 233, 51, 58, 71, + 173, 244, 22, 157, 160, 119, 232, 61, 250, 253, 63, 169, 175, 218, 24, 59, 170, 50, 252, + 206, 57, 103, 247, 238, 110, 187, 219, 82, 109, 138, 10, 244, 160, 66, 119, 251, 113, 119, + 105, 217, 165, 110, 181, 180, 93, 177, 52, 108, 105, 109, 105, 181, 16, 173, 179, 115, 231, + 238, 78, 118, 62, 110, 102, 230, 238, 221, 75, 161, 68, 137, 128, 65, 161, 80, 197, 214, + 143, 109, 43, 80, 44, 5, 170, 38, 82, 82, 63, 40, 22, 12, 1, 197, 18, 76, 252, 99, 140, 137, + 254, 193, 132, 72, 240, 135, 73, 139, 187, 62, 231, 156, 185, 119, 239, 182, 171, 193, 132, + 63, 238, 100, 239, 188, 231, 156, 247, 188, 31, 207, 251, 158, 103, 102, 216, 73, 246, 19, + 246, 18, 123, 133, 61, 198, 30, 103, 71, 217, 19, 236, 73, 118, 156, 61, 195, 78, 176, 31, + 177, 31, 179, 103, 217, 115, 236, 20, 251, 25, 251, 5, 123, 158, 157, 102, 47, 176, 51, 236, + 69, 112, 239, 203, 224, 191, 87, 217, 111, 216, 111, 217, 107, 236, 119, 236, 44, 123, 157, + 189, 193, 126, 15, 38, 110, 231, 243, 248, 124, 254, 65, 240, 195, 135, 248, 135, 249, 71, + 248, 101, 252, 74, 254, 49, 126, 21, 248, 177, 147, 47, 229, 203, 249, 10, 222, 205, 175, + 225, 215, 242, 94, 222, 199, 87, 243, 79, 240, 126, 190, 134, 127, 146, 127, 138, 175, 229, + 235, 248, 122, 190, 136, 95, 202, 55, 240, 75, 248, 245, 60, 207, 175, 224, 139, 185, 228, + 31, 231, 75, 248, 0, 152, 229, 114, 190, 146, 95, 199, 254, 192, 63, 205, 126, 201, 187, + 216, 175, 249, 42, 118, 140, 47, 160, 178, 245, 43, 26, 179, 206, 208, 184, 245, 18, 237, + 177, 94, 6, 3, 143, 241, 113, 126, 43, 191, 141, 15, 241, 47, 242, 221, 220, 225, 15, 242, + 125, 124, 15, 63, 199, 207, 243, 119, 249, 191, 248, 36, 159, 2, 51, 91, 130, 9, 46, 132, + 245, 103, 209, 36, 154, 69, 78, 180, 136, 86, 209, 38, 230, 136, 185, 162, 93, 116, 136, + 121, 98, 190, 184, 68, 44, 16, 31, 224, 207, 242, 67, 98, 153, 232, 17, 43, 196, 53, 98, + 149, 232, 21, 121, 209, 39, 186, 197, 181, 226, 58, 177, 90, 116, 137, 157, 226, 243, 226, + 115, 98, 23, 216, 110, 183, 184, 77, 220, 10, 222, 251, 130, 184, 69, 172, 229, 119, 136, + 45, 214, 50, 43, 111, 109, 180, 86, 91, 55, 81, 51, 107, 35, 77, 161, 230, 185, 214, 240, + 103, 17, 195, 165, 105, 253, 66, 214, 190, 72, 147, 254, 239, 121, 144, 52, 131, 45, 2, 123, + 221, 72, 91, 41, 0, 43, 113, 240, 82, 14, 204, 212, 6, 86, 146, 224, 37, 197, 74, 187, 193, + 75, 138, 149, 170, 96, 164, 189, 224, 164, 175, 128, 149, 78, 130, 145, 192, 71, 168, 228, + 163, 154, 73, 31, 66, 61, 31, 182, 14, 240, 195, 124, 130, 31, 177, 222, 97, 57, 177, 1, + 204, 120, 139, 24, 20, 159, 17, 27, 197, 141, 252, 132, 216, 38, 54, 163, 18, 219, 217, 253, + 226, 102, 235, 172, 245, 186, 248, 44, 152, 239, 30, 126, 51, 191, 73, 108, 18, 91, 248, + 211, 98, 64, 108, 229, 35, 220, 227, 187, 240, 142, 209, 4, 110, 221, 162, 24, 68, 247, 142, + 234, 25, 116, 143, 88, 39, 118, 128, 251, 246, 138, 78, 126, 148, 23, 184, 171, 170, 137, + 62, 186, 3, 93, 229, 136, 126, 240, 241, 98, 176, 242, 149, 224, 98, 195, 193, 61, 154, 127, + 241, 226, 169, 153, 215, 179, 138, 214, 63, 193, 11, 237, 25, 71, 44, 101, 139, 217, 114, + 235, 93, 172, 175, 96, 31, 37, 243, 150, 67, 64, 153, 50, 217, 162, 14, 61, 226, 186, 19, + 90, 248, 82, 170, 189, 13, 245, 171, 167, 173, 150, 5, 93, 170, 159, 180, 74, 110, 130, 188, + 54, 147, 155, 33, 239, 204, 228, 28, 157, 227, 97, 38, 183, 208, 82, 254, 215, 76, 110, 37, + 41, 70, 50, 185, 141, 29, 174, 251, 154, 67, 59, 197, 125, 153, 60, 151, 150, 138, 63, 101, + 114, 59, 59, 208, 212, 146, 201, 29, 228, 231, 14, 215, 59, 119, 101, 203, 220, 76, 182, 40, + 215, 178, 54, 147, 25, 137, 214, 35, 181, 30, 165, 203, 91, 31, 200, 100, 65, 115, 91, 15, + 102, 114, 19, 228, 227, 153, 220, 12, 249, 100, 38, 231, 232, 206, 214, 51, 153, 220, 66, + 11, 91, 39, 51, 185, 149, 230, 183, 173, 203, 228, 54, 107, 107, 221, 215, 28, 90, 214, 182, + 53, 147, 231, 210, 194, 182, 61, 153, 220, 110, 13, 182, 237, 203, 228, 14, 234, 155, 243, + 71, 245, 246, 40, 90, 51, 156, 141, 108, 112, 54, 178, 193, 217, 200, 6, 103, 35, 27, 156, + 141, 108, 112, 54, 178, 193, 217, 200, 6, 103, 35, 27, 156, 141, 108, 112, 54, 178, 193, + 217, 200, 6, 103, 35, 27, 156, 141, 108, 112, 54, 178, 193, 249, 24, 222, 47, 87, 162, 155, + 122, 168, 15, 210, 102, 60, 201, 29, 138, 41, 194, 105, 140, 168, 136, 19, 41, 105, 0, 82, + 76, 37, 253, 107, 99, 198, 131, 20, 82, 30, 43, 235, 201, 199, 37, 105, 27, 230, 134, 113, + 130, 83, 236, 82, 35, 23, 119, 23, 218, 99, 248, 45, 64, 115, 0, 251, 124, 232, 12, 97, 206, + 131, 134, 167, 245, 108, 252, 7, 176, 85, 208, 186, 33, 70, 9, 230, 66, 189, 102, 246, 123, + 136, 64, 226, 223, 134, 158, 7, 11, 85, 140, 42, 144, 82, 248, 82, 58, 101, 88, 76, 49, 239, + 98, 164, 98, 46, 99, 119, 1, 235, 33, 162, 81, 86, 162, 204, 106, 10, 141, 32, 243, 169, 52, + 36, 114, 140, 180, 79, 229, 37, 209, 185, 108, 210, 185, 22, 49, 163, 114, 44, 99, 222, 213, + 59, 98, 61, 227, 235, 168, 211, 44, 15, 7, 43, 203, 181, 229, 64, 207, 248, 218, 162, 13, + 140, 204, 124, 205, 75, 0, 59, 190, 70, 172, 148, 69, 25, 98, 38, 208, 94, 141, 77, 149, + 103, 218, 16, 129, 242, 88, 210, 185, 24, 188, 107, 104, 155, 216, 149, 167, 8, 8, 72, 228, + 111, 16, 87, 81, 5, 208, 181, 225, 63, 213, 35, 149, 113, 90, 175, 135, 193, 204, 120, 145, + 58, 246, 48, 203, 43, 210, 216, 14, 105, 205, 233, 136, 27, 51, 82, 168, 141, 235, 125, 38, + 235, 81, 140, 243, 186, 31, 26, 171, 185, 68, 91, 11, 180, 133, 170, 198, 161, 156, 85, 190, + 17, 111, 85, 49, 147, 191, 171, 227, 87, 249, 155, 186, 196, 186, 27, 212, 221, 120, 84, + 181, 150, 176, 81, 170, 103, 99, 98, 28, 206, 116, 18, 140, 110, 207, 172, 167, 200, 194, + 84, 104, 172, 94, 37, 91, 247, 136, 141, 217, 96, 70, 94, 181, 110, 118, 16, 137, 173, 253, + 59, 153, 255, 252, 44, 93, 223, 127, 81, 158, 146, 54, 96, 205, 135, 181, 254, 250, 137, + 233, 165, 157, 89, 7, 121, 89, 175, 245, 194, 154, 90, 153, 185, 119, 69, 125, 239, 236, 39, + 193, 205, 122, 218, 100, 104, 103, 57, 13, 235, 85, 19, 163, 155, 161, 168, 226, 46, 232, + 110, 86, 57, 140, 234, 58, 214, 246, 204, 190, 90, 252, 159, 78, 245, 116, 7, 153, 122, 237, + 192, 200, 211, 49, 40, 255, 219, 245, 9, 72, 103, 212, 182, 59, 139, 32, 106, 200, 192, 201, + 206, 98, 170, 179, 116, 117, 127, 15, 98, 198, 161, 78, 93, 247, 46, 232, 20, 180, 253, 141, + 58, 42, 179, 55, 197, 85, 2, 186, 221, 184, 42, 250, 202, 235, 115, 63, 51, 242, 188, 182, + 30, 64, 71, 189, 45, 168, 248, 135, 117, 6, 37, 88, 168, 98, 86, 85, 181, 168, 115, 81, 167, + 105, 166, 213, 218, 188, 98, 20, 83, 129, 209, 186, 189, 93, 58, 102, 211, 201, 85, 221, + 129, 137, 142, 48, 213, 103, 45, 209, 220, 96, 118, 75, 157, 131, 58, 167, 174, 238, 50, 79, + 251, 48, 8, 13, 233, 189, 53, 244, 110, 0, 126, 131, 96, 73, 179, 55, 110, 88, 49, 103, 188, + 160, 49, 153, 62, 183, 21, 237, 203, 209, 231, 122, 54, 191, 102, 172, 116, 29, 116, 81, 89, + 99, 88, 168, 159, 131, 130, 94, 87, 76, 99, 50, 168, 245, 126, 73, 103, 26, 102, 221, 111, + 108, 185, 250, 87, 157, 230, 11, 243, 86, 235, 134, 53, 58, 177, 171, 75, 119, 103, 128, + 188, 220, 250, 57, 190, 56, 170, 240, 34, 203, 239, 29, 163, 105, 235, 53, 230, 150, 25, + 247, 154, 238, 113, 102, 112, 224, 197, 185, 79, 247, 235, 204, 184, 214, 52, 32, 160, 50, + 49, 185, 152, 39, 65, 173, 235, 227, 250, 83, 165, 160, 121, 53, 212, 252, 106, 255, 199, + 76, 13, 206, 246, 12, 76, 221, 172, 251, 47, 60, 3, 10, 85, 213, 121, 101, 189, 179, 160, + 57, 74, 101, 227, 214, 237, 40, 77, 95, 243, 220, 127, 171, 208, 251, 117, 46, 166, 207, 68, + 183, 142, 70, 157, 1, 243, 116, 202, 235, 90, 149, 104, 252, 152, 92, 217, 211, 211, 39, 55, + 123, 78, 28, 37, 81, 49, 149, 3, 81, 92, 138, 98, 59, 245, 162, 48, 47, 215, 251, 190, 220, + 230, 13, 143, 164, 137, 220, 230, 38, 110, 60, 230, 22, 242, 3, 182, 239, 13, 197, 158, 244, + 18, 105, 203, 32, 42, 184, 113, 40, 19, 59, 76, 36, 214, 189, 162, 44, 218, 129, 231, 87, + 101, 197, 75, 71, 100, 82, 30, 74, 125, 87, 198, 81, 57, 44, 120, 225, 112, 34, 35, 168, + 166, 110, 128, 157, 97, 65, 58, 81, 28, 186, 113, 146, 151, 155, 82, 89, 116, 237, 180, 28, + 187, 137, 140, 93, 219, 151, 94, 10, 31, 78, 178, 92, 38, 129, 141, 8, 28, 187, 4, 89, 109, + 9, 202, 126, 234, 149, 96, 50, 44, 7, 110, 12, 205, 196, 77, 181, 129, 68, 150, 226, 8, 113, + 171, 176, 97, 221, 247, 163, 138, 28, 65, 224, 210, 11, 74, 182, 147, 74, 47, 148, 169, 202, + 3, 145, 97, 139, 244, 189, 16, 190, 162, 162, 28, 242, 134, 181, 97, 227, 40, 117, 199, 83, + 108, 246, 70, 221, 188, 204, 210, 92, 146, 200, 192, 14, 171, 210, 41, 35, 121, 19, 119, 58, + 2, 255, 110, 69, 198, 54, 114, 137, 61, 164, 141, 141, 118, 32, 203, 37, 229, 6, 22, 135, + 49, 147, 120, 183, 67, 61, 141, 144, 208, 152, 74, 201, 150, 21, 59, 14, 140, 47, 5, 179, + 51, 98, 199, 8, 204, 141, 243, 117, 232, 251, 107, 62, 229, 134, 200, 47, 244, 171, 194, + 244, 238, 4, 64, 72, 73, 246, 230, 123, 122, 178, 213, 21, 106, 181, 161, 8, 46, 144, 134, + 67, 27, 158, 134, 61, 21, 145, 139, 16, 99, 187, 224, 6, 118, 60, 42, 35, 181, 210, 48, 44, + 206, 94, 106, 13, 16, 242, 218, 17, 122, 41, 246, 111, 79, 237, 212, 100, 219, 13, 3, 145, + 118, 224, 160, 138, 105, 236, 185, 73, 126, 176, 236, 116, 218, 73, 151, 44, 184, 114, 99, + 28, 97, 53, 77, 75, 253, 221, 221, 149, 74, 37, 31, 212, 140, 231, 157, 40, 232, 78, 171, + 165, 104, 56, 182, 75, 35, 213, 110, 39, 45, 70, 97, 154, 100, 170, 74, 46, 218, 72, 96, 84, + 233, 237, 138, 202, 0, 185, 42, 203, 137, 139, 32, 144, 146, 90, 150, 54, 106, 234, 198, + 129, 151, 170, 128, 134, 170, 58, 188, 27, 118, 12, 174, 199, 106, 172, 7, 168, 120, 161, + 108, 106, 91, 25, 241, 156, 145, 134, 189, 184, 123, 161, 227, 151, 11, 10, 139, 72, 22, + 188, 164, 228, 195, 129, 66, 191, 20, 123, 80, 112, 160, 229, 134, 105, 94, 214, 124, 71, + 33, 90, 163, 211, 235, 146, 110, 48, 164, 54, 77, 155, 10, 107, 202, 179, 70, 164, 213, 85, + 115, 3, 254, 4, 240, 56, 166, 3, 235, 222, 53, 174, 153, 173, 53, 58, 128, 78, 15, 94, 112, + 8, 20, 244, 177, 58, 42, 133, 168, 18, 250, 145, 221, 232, 20, 49, 219, 38, 82, 0, 95, 175, + 64, 84, 78, 75, 229, 20, 176, 143, 121, 142, 171, 116, 70, 92, 191, 116, 65, 66, 239, 165, + 22, 186, 18, 221, 5, 183, 104, 227, 56, 229, 237, 164, 52, 78, 92, 92, 197, 126, 174, 190, + 81, 155, 14, 54, 173, 194, 103, 215, 21, 230, 206, 207, 210, 41, 124, 194, 16, 155, 151, 99, + 92, 8, 206, 196, 97, 98, 127, 95, 71, 114, 79, 246, 165, 70, 155, 183, 75, 9, 6, 147, 231, + 69, 51, 225, 163, 234, 197, 220, 4, 187, 90, 18, 29, 210, 31, 105, 167, 155, 58, 112, 147, + 234, 11, 47, 55, 65, 52, 185, 159, 166, 255, 190, 140, 235, 123, 116, 156, 126, 74, 167, + 232, 5, 122, 133, 222, 160, 127, 88, 109, 244, 37, 250, 42, 61, 79, 127, 161, 191, 209, 59, + 116, 222, 34, 43, 103, 45, 180, 46, 179, 186, 232, 125, 251, 155, 188, 187, 41, 160, 118, + 126, 26, 95, 90, 139, 136, 166, 206, 77, 189, 57, 121, 108, 234, 77, 124, 56, 118, 52, 204, + 236, 199, 104, 145, 184, 122, 122, 102, 106, 193, 212, 91, 23, 206, 77, 238, 159, 124, 110, + 242, 181, 230, 57, 52, 95, 239, 157, 207, 94, 197, 236, 219, 214, 91, 83, 231, 216, 245, + 106, 60, 213, 167, 198, 236, 94, 37, 235, 29, 111, 231, 38, 38, 79, 76, 30, 154, 17, 142, + 122, 10, 148, 241, 198, 93, 197, 251, 237, 30, 186, 147, 246, 210, 93, 116, 55, 221, 67, + 247, 210, 125, 244, 53, 96, 113, 23, 228, 251, 233, 235, 244, 13, 122, 128, 30, 164, 125, + 244, 16, 61, 76, 251, 233, 155, 244, 45, 122, 132, 190, 77, 7, 232, 32, 125, 135, 190, 11, + 28, 191, 79, 19, 192, 220, 172, 169, 241, 4, 174, 71, 244, 170, 90, 249, 1, 29, 197, 55, + 223, 83, 184, 63, 74, 143, 209, 227, 244, 4, 253, 16, 227, 39, 129, 254, 83, 244, 12, 230, + 204, 140, 25, 63, 141, 153, 195, 116, 4, 179, 71, 255, 205, 121, 181, 7, 71, 117, 149, 241, + 239, 236, 189, 251, 78, 96, 65, 72, 147, 222, 1, 238, 114, 217, 12, 76, 18, 130, 37, 200, + 163, 17, 182, 251, 72, 54, 164, 180, 9, 9, 51, 247, 6, 108, 119, 243, 96, 18, 253, 3, 172, + 35, 98, 121, 76, 152, 209, 192, 44, 205, 48, 253, 67, 29, 29, 71, 199, 25, 135, 254, 211, + 202, 89, 234, 212, 100, 168, 29, 64, 90, 232, 80, 168, 218, 86, 45, 214, 138, 12, 149, 150, + 135, 214, 169, 20, 171, 192, 250, 59, 231, 222, 221, 108, 54, 169, 101, 220, 236, 111, 207, + 249, 126, 223, 227, 124, 231, 251, 206, 61, 187, 1, 43, 172, 4, 119, 4, 127, 156, 114, 116, + 148, 158, 167, 159, 163, 103, 182, 92, 144, 198, 232, 56, 189, 64, 191, 192, 56, 142, 110, + 30, 163, 23, 233, 151, 244, 18, 250, 120, 28, 157, 61, 41, 57, 193, 20, 228, 79, 183, 180, + 63, 127, 69, 167, 232, 101, 122, 133, 78, 211, 25, 122, 21, 39, 227, 44, 189, 70, 231, 232, + 60, 189, 254, 127, 105, 94, 46, 50, 66, 250, 53, 253, 134, 126, 139, 179, 246, 38, 189, 69, + 191, 163, 223, 211, 219, 244, 71, 122, 151, 254, 76, 23, 233, 18, 78, 221, 245, 41, 250, 63, + 192, 226, 2, 108, 254, 228, 88, 253, 5, 86, 239, 209, 7, 176, 188, 1, 75, 219, 206, 182, + 121, 71, 106, 223, 151, 17, 222, 132, 239, 69, 186, 204, 124, 116, 147, 185, 232, 63, 148, + 199, 76, 116, 239, 187, 178, 67, 223, 151, 125, 20, 221, 19, 221, 249, 169, 172, 179, 232, + 199, 17, 200, 162, 67, 207, 20, 123, 243, 28, 106, 252, 28, 250, 41, 36, 49, 255, 129, 211, + 141, 159, 193, 54, 135, 10, 22, 234, 55, 125, 213, 206, 59, 221, 177, 235, 253, 34, 108, 68, + 45, 132, 230, 156, 83, 139, 211, 78, 39, 68, 156, 151, 138, 190, 103, 165, 238, 168, 244, + 59, 89, 140, 58, 81, 81, 123, 135, 111, 149, 84, 231, 157, 146, 26, 190, 71, 127, 149, 149, + 177, 171, 103, 107, 39, 170, 39, 44, 46, 195, 70, 84, 89, 196, 152, 92, 219, 75, 240, 181, + 171, 47, 124, 5, 95, 234, 35, 116, 23, 32, 127, 128, 219, 225, 58, 42, 45, 198, 107, 178, + 19, 215, 232, 74, 113, 126, 197, 209, 223, 160, 191, 209, 223, 233, 166, 252, 252, 144, 254, + 129, 251, 228, 35, 250, 39, 228, 143, 193, 124, 8, 105, 42, 91, 206, 220, 194, 223, 191, + 232, 19, 250, 55, 58, 120, 155, 238, 148, 72, 119, 202, 52, 119, 112, 245, 229, 113, 91, 49, + 230, 98, 10, 221, 157, 152, 77, 176, 18, 42, 115, 51, 15, 238, 52, 31, 243, 179, 0, 171, 96, + 149, 108, 6, 155, 201, 66, 96, 38, 107, 130, 69, 205, 172, 41, 154, 138, 105, 116, 126, 201, + 204, 102, 159, 99, 115, 112, 95, 222, 199, 170, 217, 253, 76, 195, 189, 57, 143, 205, 103, + 11, 88, 152, 45, 44, 209, 213, 20, 53, 58, 52, 6, 91, 196, 34, 142, 174, 74, 122, 214, 20, + 125, 23, 192, 226, 190, 18, 219, 37, 108, 25, 251, 6, 62, 235, 216, 82, 214, 136, 249, 231, + 89, 19, 91, 193, 86, 178, 213, 96, 26, 32, 63, 0, 121, 13, 116, 203, 228, 24, 139, 182, 60, + 254, 216, 151, 182, 108, 238, 177, 204, 77, 221, 93, 27, 59, 59, 30, 125, 100, 195, 195, + 237, 235, 219, 82, 173, 45, 201, 68, 60, 246, 80, 116, 221, 218, 47, 54, 63, 184, 102, 245, + 170, 149, 95, 88, 209, 184, 180, 161, 126, 113, 109, 100, 145, 177, 112, 65, 245, 156, 89, + 161, 153, 149, 193, 128, 223, 231, 245, 184, 241, 133, 195, 168, 62, 105, 180, 164, 117, 94, + 155, 230, 106, 173, 145, 74, 53, 8, 217, 200, 128, 200, 148, 16, 105, 142, 47, 76, 222, 50, + 217, 134, 235, 105, 105, 166, 79, 182, 140, 194, 114, 107, 153, 101, 212, 182, 140, 22, 45, + 89, 72, 111, 166, 230, 134, 122, 61, 105, 232, 252, 92, 194, 208, 199, 88, 79, 167, 137, + 249, 104, 194, 176, 116, 126, 67, 206, 55, 200, 185, 90, 43, 133, 74, 8, 225, 48, 60, 244, + 100, 245, 96, 66, 231, 44, 173, 39, 121, 203, 142, 193, 108, 50, 157, 64, 188, 92, 48, 16, + 55, 226, 3, 129, 134, 122, 202, 5, 130, 152, 6, 49, 227, 139, 141, 237, 57, 182, 120, 45, + 147, 19, 215, 226, 228, 154, 28, 190, 110, 43, 197, 178, 92, 137, 36, 51, 253, 188, 163, + 211, 76, 38, 180, 112, 216, 146, 28, 197, 101, 44, 238, 137, 115, 175, 140, 165, 15, 137, + 156, 233, 160, 158, 171, 63, 158, 125, 106, 44, 68, 189, 233, 186, 138, 126, 163, 63, 179, + 197, 228, 74, 6, 78, 89, 37, 153, 205, 238, 231, 179, 234, 248, 18, 35, 193, 151, 60, 121, + 185, 26, 91, 30, 224, 245, 70, 34, 201, 235, 12, 4, 107, 223, 88, 92, 128, 113, 119, 36, + 100, 232, 217, 155, 132, 228, 141, 27, 215, 39, 51, 25, 135, 241, 68, 66, 55, 73, 76, 197, + 22, 139, 101, 130, 190, 48, 39, 228, 134, 12, 177, 191, 112, 88, 228, 114, 112, 44, 74, 189, + 16, 248, 112, 167, 105, 203, 248, 127, 80, 59, 74, 209, 198, 58, 139, 187, 210, 66, 115, + 188, 160, 153, 187, 73, 104, 134, 11, 154, 162, 123, 218, 8, 139, 86, 37, 211, 206, 123, + 199, 96, 53, 31, 238, 213, 27, 234, 81, 125, 249, 142, 224, 13, 189, 206, 149, 218, 116, 47, + 126, 11, 98, 204, 12, 100, 141, 68, 194, 174, 91, 183, 201, 163, 9, 76, 162, 25, 103, 175, + 201, 220, 178, 70, 216, 103, 210, 216, 196, 144, 40, 67, 167, 201, 27, 141, 237, 124, 142, + 17, 179, 13, 64, 232, 162, 7, 67, 93, 166, 116, 113, 220, 248, 156, 56, 167, 116, 159, 227, + 197, 27, 147, 9, 145, 151, 158, 204, 166, 19, 118, 130, 34, 150, 209, 105, 142, 211, 242, + 252, 197, 92, 147, 174, 61, 191, 156, 154, 200, 18, 121, 240, 170, 56, 154, 82, 155, 204, + 154, 253, 91, 249, 130, 180, 214, 143, 243, 185, 85, 55, 181, 48, 143, 90, 40, 159, 101, + 152, 3, 150, 232, 146, 17, 226, 75, 46, 98, 185, 176, 92, 81, 122, 97, 111, 101, 214, 5, 99, + 177, 115, 111, 196, 167, 155, 46, 77, 177, 68, 183, 64, 232, 45, 248, 48, 98, 205, 80, 132, + 208, 46, 41, 138, 142, 198, 154, 117, 147, 105, 84, 48, 195, 42, 142, 133, 152, 77, 138, 3, + 65, 137, 196, 83, 66, 165, 8, 215, 120, 74, 11, 91, 97, 251, 245, 63, 82, 210, 156, 156, + 220, 17, 238, 43, 137, 21, 2, 81, 204, 201, 94, 231, 83, 83, 179, 173, 69, 66, 75, 244, 228, + 64, 162, 36, 193, 73, 65, 221, 78, 130, 78, 180, 233, 243, 116, 137, 90, 56, 11, 195, 195, + 39, 218, 153, 42, 168, 148, 8, 158, 92, 112, 46, 132, 145, 148, 232, 98, 181, 206, 169, 67, + 55, 141, 1, 195, 50, 112, 134, 162, 29, 166, 216, 155, 168, 181, 236, 111, 123, 151, 209, + 222, 217, 99, 202, 110, 59, 167, 164, 123, 146, 100, 235, 87, 217, 18, 167, 48, 212, 5, 193, + 21, 199, 25, 108, 169, 211, 10, 109, 149, 114, 171, 148, 139, 98, 170, 76, 221, 86, 80, 235, + 89, 159, 209, 222, 149, 21, 193, 13, 39, 32, 233, 120, 130, 176, 105, 79, 109, 91, 230, 224, + 170, 217, 77, 120, 52, 91, 112, 187, 25, 45, 25, 67, 15, 233, 45, 217, 204, 88, 126, 184, + 55, 155, 139, 70, 179, 219, 147, 233, 193, 53, 34, 134, 209, 214, 159, 53, 186, 204, 102, + 77, 230, 186, 209, 220, 163, 61, 41, 150, 154, 77, 237, 172, 189, 59, 214, 80, 143, 187, 39, + 150, 51, 216, 129, 206, 92, 148, 29, 232, 234, 49, 199, 241, 187, 85, 63, 208, 109, 30, 117, + 49, 87, 60, 29, 179, 114, 139, 160, 51, 199, 241, 243, 62, 42, 89, 151, 96, 5, 41, 4, 93, 8, + 34, 210, 70, 8, 62, 105, 175, 141, 71, 137, 134, 165, 86, 149, 132, 148, 251, 198, 24, 73, + 206, 87, 224, 24, 245, 141, 185, 108, 46, 84, 224, 92, 224, 84, 155, 139, 74, 78, 188, 208, + 164, 234, 65, 148, 24, 215, 109, 82, 239, 23, 237, 217, 109, 13, 102, 211, 150, 120, 184, + 168, 10, 173, 196, 155, 113, 102, 172, 37, 238, 50, 214, 230, 152, 203, 83, 193, 3, 198, 64, + 140, 7, 141, 152, 224, 215, 9, 126, 157, 205, 123, 4, 239, 197, 193, 192, 247, 30, 138, 35, + 238, 164, 108, 218, 192, 61, 133, 3, 101, 146, 198, 236, 163, 168, 136, 144, 250, 88, 62, + 223, 109, 134, 207, 105, 55, 172, 48, 142, 218, 22, 160, 199, 228, 254, 58, 220, 253, 238, + 200, 122, 216, 181, 10, 164, 65, 183, 242, 225, 190, 140, 200, 131, 54, 153, 194, 215, 27, + 105, 235, 179, 112, 108, 11, 1, 97, 210, 198, 253, 136, 224, 119, 34, 192, 162, 69, 250, + 136, 227, 8, 167, 62, 244, 6, 13, 148, 254, 195, 16, 248, 176, 197, 173, 58, 177, 168, 57, + 100, 201, 227, 28, 226, 148, 50, 214, 160, 237, 118, 76, 119, 173, 88, 168, 209, 202, 206, + 54, 30, 144, 207, 38, 30, 133, 64, 100, 191, 24, 252, 200, 141, 186, 76, 155, 209, 32, 98, + 49, 203, 46, 146, 183, 2, 153, 247, 25, 80, 245, 165, 117, 84, 91, 165, 190, 46, 28, 117, + 251, 46, 13, 104, 54, 51, 128, 43, 81, 173, 29, 144, 8, 104, 142, 146, 196, 182, 148, 72, + 176, 50, 192, 253, 75, 17, 16, 111, 49, 15, 46, 21, 143, 164, 59, 226, 181, 44, 59, 121, 41, + 237, 119, 12, 176, 118, 136, 7, 145, 81, 109, 73, 41, 29, 7, 84, 7, 170, 54, 145, 11, 222, + 251, 145, 170, 48, 61, 33, 194, 116, 142, 209, 70, 99, 39, 110, 22, 145, 180, 140, 228, 133, + 154, 87, 70, 218, 50, 184, 252, 109, 255, 32, 24, 99, 85, 193, 217, 39, 238, 136, 160, 19, + 227, 148, 205, 122, 197, 206, 43, 80, 119, 37, 210, 61, 150, 127, 198, 248, 102, 184, 228, + 213, 80, 111, 136, 47, 7, 113, 48, 73, 27, 199, 193, 38, 43, 91, 78, 240, 205, 117, 13, 245, + 190, 114, 182, 82, 210, 217, 172, 175, 114, 122, 7, 187, 94, 190, 202, 226, 8, 146, 112, + 212, 241, 175, 38, 209, 169, 59, 43, 119, 62, 62, 179, 249, 38, 213, 248, 228, 191, 129, + 199, 174, 237, 126, 77, 140, 39, 98, 239, 7, 110, 207, 188, 251, 53, 255, 85, 239, 143, 96, + 235, 199, 99, 192, 164, 1, 62, 61, 248, 57, 201, 78, 5, 118, 65, 159, 241, 95, 117, 248, + 226, 75, 205, 168, 51, 38, 36, 246, 58, 152, 183, 241, 255, 234, 61, 194, 211, 148, 127, 67, + 64, 221, 77, 163, 106, 51, 61, 58, 29, 220, 65, 26, 149, 152, 71, 51, 5, 148, 43, 52, 10, + 172, 43, 25, 155, 129, 13, 192, 38, 224, 235, 14, 63, 170, 60, 11, 159, 26, 106, 155, 130, + 10, 240, 2, 113, 10, 185, 22, 210, 168, 107, 97, 190, 7, 99, 45, 198, 4, 144, 2, 30, 1, 54, + 3, 195, 224, 23, 2, 243, 213, 87, 97, 119, 152, 20, 215, 225, 252, 17, 53, 141, 92, 1, 165, + 87, 226, 9, 229, 171, 206, 124, 7, 205, 85, 247, 210, 168, 231, 46, 98, 39, 167, 65, 24, 24, + 162, 142, 207, 196, 19, 54, 16, 167, 67, 141, 97, 45, 192, 189, 7, 243, 125, 152, 219, 248, + 178, 24, 149, 51, 216, 187, 141, 5, 128, 81, 148, 63, 166, 138, 82, 184, 87, 211, 83, 247, + 10, 245, 24, 85, 121, 163, 84, 87, 14, 117, 144, 194, 234, 98, 10, 149, 67, 121, 131, 150, + 59, 152, 47, 70, 181, 149, 2, 247, 10, 247, 161, 252, 37, 1, 117, 21, 141, 40, 103, 169, + 103, 58, 168, 79, 211, 8, 176, 79, 61, 76, 181, 2, 202, 33, 216, 30, 162, 69, 206, 168, 59, + 152, 7, 44, 3, 214, 57, 252, 136, 98, 194, 239, 135, 100, 78, 131, 17, 137, 19, 212, 228, + 10, 209, 136, 43, 148, 79, 99, 92, 128, 177, 27, 120, 8, 232, 2, 6, 128, 93, 224, 171, 129, + 42, 117, 27, 236, 134, 136, 92, 67, 249, 159, 168, 110, 248, 2, 174, 219, 18, 223, 86, 42, + 237, 185, 82, 65, 245, 234, 92, 26, 241, 164, 160, 63, 61, 13, 190, 7, 92, 160, 77, 159, + 137, 203, 54, 60, 75, 113, 150, 239, 32, 46, 160, 190, 11, 46, 130, 209, 70, 143, 24, 149, + 109, 20, 119, 192, 0, 79, 81, 222, 69, 26, 224, 115, 70, 77, 125, 150, 190, 117, 207, 88, + 65, 154, 39, 75, 117, 229, 80, 85, 212, 253, 28, 5, 167, 224, 16, 173, 117, 80, 37, 199, + 143, 168, 181, 12, 43, 167, 225, 36, 60, 203, 109, 168, 237, 180, 87, 177, 40, 229, 224, + 193, 146, 121, 202, 187, 7, 240, 81, 202, 51, 195, 6, 108, 219, 213, 87, 128, 81, 160, 157, + 30, 86, 189, 180, 254, 94, 224, 58, 64, 53, 158, 147, 84, 227, 247, 83, 141, 122, 190, 100, + 190, 173, 12, 251, 202, 224, 240, 158, 23, 202, 112, 166, 12, 14, 63, 201, 126, 3, 110, 216, + 239, 148, 196, 190, 58, 161, 115, 87, 57, 72, 82, 141, 247, 49, 170, 193, 57, 215, 202, 33, + 247, 58, 21, 123, 213, 246, 252, 143, 213, 76, 254, 19, 118, 139, 190, 194, 110, 229, 119, + 98, 188, 31, 99, 31, 240, 95, 210, 203, 4, 58, 170, 234, 140, 227, 223, 220, 247, 222, 76, + 136, 148, 173, 96, 32, 27, 187, 165, 16, 8, 32, 36, 36, 236, 33, 33, 37, 16, 66, 66, 34, 33, + 202, 18, 194, 14, 161, 41, 75, 40, 17, 130, 69, 100, 179, 160, 6, 4, 44, 96, 16, 139, 37, + 173, 84, 152, 178, 21, 11, 2, 86, 81, 90, 149, 86, 100, 41, 22, 203, 42, 104, 177, 8, 4, 9, + 198, 25, 255, 247, 254, 103, 40, 69, 122, 202, 57, 205, 57, 191, 243, 123, 239, 206, 189, + 111, 94, 222, 253, 222, 247, 125, 19, 15, 138, 65, 33, 152, 134, 241, 16, 80, 106, 91, 50, + 201, 78, 148, 41, 234, 1, 255, 201, 0, 133, 214, 49, 60, 243, 0, 122, 14, 232, 168, 166, 25, + 247, 84, 145, 82, 223, 202, 151, 82, 247, 60, 253, 93, 255, 65, 129, 241, 45, 255, 74, 227, + 116, 236, 199, 255, 34, 143, 184, 247, 154, 189, 11, 94, 167, 191, 58, 46, 165, 196, 127, + 21, 30, 98, 117, 144, 126, 196, 239, 135, 37, 120, 238, 28, 33, 118, 145, 204, 85, 117, 49, + 255, 109, 9, 83, 23, 129, 246, 81, 137, 112, 234, 160, 134, 188, 118, 127, 56, 189, 36, 204, + 179, 4, 180, 186, 63, 112, 159, 179, 238, 98, 248, 61, 198, 12, 214, 187, 242, 160, 115, 67, + 154, 223, 141, 181, 25, 185, 233, 16, 222, 141, 187, 105, 39, 41, 1, 44, 227, 108, 25, 139, + 119, 53, 199, 218, 40, 131, 212, 27, 18, 167, 42, 37, 79, 37, 75, 23, 56, 81, 29, 148, 68, + 215, 97, 137, 84, 107, 145, 139, 190, 150, 60, 87, 137, 100, 184, 230, 251, 79, 168, 125, + 56, 46, 70, 46, 152, 140, 185, 85, 160, 82, 18, 204, 58, 189, 70, 224, 68, 233, 230, 186, + 133, 117, 88, 163, 54, 34, 246, 34, 164, 137, 170, 0, 175, 224, 217, 37, 34, 247, 141, 67, + 62, 155, 15, 214, 235, 170, 93, 237, 3, 103, 213, 248, 239, 140, 157, 177, 226, 176, 31, + 200, 125, 214, 26, 51, 182, 26, 140, 190, 107, 108, 37, 24, 227, 170, 198, 249, 50, 80, 6, + 86, 154, 241, 73, 96, 188, 149, 137, 243, 218, 160, 16, 44, 50, 227, 139, 65, 161, 213, 24, + 231, 169, 96, 138, 25, 123, 9, 148, 88, 245, 113, 30, 9, 90, 152, 177, 77, 160, 92, 149, + 227, 126, 94, 6, 155, 204, 216, 25, 112, 74, 161, 199, 80, 7, 192, 118, 204, 61, 139, 126, + 163, 1, 72, 49, 159, 163, 23, 170, 174, 237, 194, 44, 196, 178, 24, 159, 209, 227, 223, 244, + 209, 168, 66, 25, 11, 143, 84, 11, 140, 115, 148, 146, 113, 42, 38, 216, 175, 248, 167, 234, + 30, 4, 247, 180, 212, 46, 151, 54, 236, 33, 124, 235, 116, 77, 99, 191, 224, 43, 209, 181, + 153, 253, 130, 111, 57, 122, 131, 12, 211, 7, 236, 147, 240, 96, 189, 183, 174, 72, 58, 107, + 184, 191, 182, 94, 163, 235, 182, 117, 64, 210, 116, 13, 102, 189, 244, 165, 107, 187, 241, + 236, 116, 61, 117, 23, 203, 76, 212, 249, 126, 206, 84, 223, 53, 214, 68, 127, 177, 169, + 133, 245, 144, 231, 107, 73, 83, 214, 50, 223, 46, 157, 91, 89, 183, 124, 7, 237, 27, 146, + 195, 186, 229, 219, 130, 26, 149, 101, 234, 81, 180, 212, 13, 214, 29, 107, 185, 12, 97, 45, + 241, 167, 234, 53, 166, 134, 148, 200, 64, 83, 15, 76, 222, 246, 45, 212, 118, 94, 199, 61, + 32, 175, 59, 199, 101, 138, 125, 26, 243, 79, 251, 75, 237, 221, 200, 169, 154, 97, 120, 79, + 179, 36, 203, 218, 131, 251, 198, 147, 179, 42, 144, 179, 129, 250, 76, 122, 225, 125, 46, + 53, 60, 134, 126, 228, 25, 177, 85, 154, 204, 2, 162, 210, 252, 115, 64, 148, 201, 43, 231, + 112, 109, 228, 15, 235, 45, 196, 122, 3, 212, 133, 104, 73, 190, 157, 19, 54, 72, 19, 187, + 135, 140, 182, 31, 149, 190, 86, 111, 188, 231, 45, 68, 217, 5, 50, 61, 192, 52, 208, 202, + 89, 45, 73, 32, 25, 241, 85, 195, 249, 84, 138, 157, 189, 232, 1, 129, 90, 108, 246, 210, + 182, 174, 155, 189, 142, 83, 45, 100, 206, 109, 58, 227, 189, 169, 35, 217, 26, 179, 159, + 83, 101, 153, 217, 207, 25, 1, 102, 97, 143, 70, 73, 232, 29, 61, 227, 0, 119, 133, 36, 90, + 39, 165, 135, 19, 143, 207, 2, 4, 250, 193, 129, 186, 215, 11, 246, 91, 78, 136, 132, 122, + 90, 75, 168, 217, 103, 236, 171, 39, 230, 142, 62, 46, 148, 251, 172, 251, 212, 96, 239, + 101, 231, 75, 136, 225, 60, 242, 194, 33, 238, 53, 122, 205, 165, 142, 7, 243, 150, 73, 186, + 167, 45, 174, 49, 209, 244, 179, 53, 221, 5, 24, 43, 4, 25, 120, 54, 25, 146, 225, 201, 192, + 241, 106, 233, 133, 250, 80, 211, 169, 13, 194, 177, 94, 199, 70, 164, 44, 50, 177, 209, 52, + 64, 34, 246, 123, 135, 169, 193, 193, 126, 40, 26, 123, 217, 1, 239, 94, 154, 189, 5, 159, + 5, 8, 244, 56, 131, 117, 255, 98, 215, 196, 152, 38, 95, 44, 19, 47, 107, 3, 61, 201, 49, + 176, 42, 16, 43, 186, 239, 10, 246, 17, 71, 37, 76, 131, 253, 14, 199, 253, 155, 120, 65, + 124, 44, 176, 159, 5, 29, 37, 211, 141, 190, 200, 189, 210, 92, 167, 161, 115, 12, 110, 132, + 245, 23, 100, 152, 245, 5, 250, 151, 69, 102, 78, 154, 189, 68, 162, 48, 63, 10, 207, 81, + 220, 125, 240, 189, 147, 49, 7, 245, 31, 207, 76, 76, 108, 85, 34, 175, 31, 13, 112, 5, 49, + 51, 66, 186, 216, 155, 144, 175, 116, 189, 187, 163, 134, 59, 231, 209, 223, 77, 148, 68, + 123, 58, 98, 111, 186, 20, 105, 7, 106, 96, 177, 174, 107, 250, 58, 26, 244, 48, 245, 221, + 113, 82, 207, 217, 206, 56, 118, 231, 5, 106, 85, 63, 208, 247, 223, 245, 204, 244, 24, 186, + 206, 68, 75, 13, 93, 235, 110, 231, 230, 42, 236, 217, 56, 73, 210, 185, 219, 158, 139, 185, + 3, 240, 217, 69, 105, 239, 142, 192, 181, 6, 225, 124, 38, 98, 210, 203, 239, 178, 230, 98, + 191, 159, 144, 52, 183, 27, 199, 213, 232, 147, 10, 253, 85, 186, 54, 219, 189, 165, 174, + 181, 1, 255, 91, 0, 196, 234, 243, 26, 181, 70, 46, 128, 53, 26, 107, 187, 76, 3, 131, 53, + 118, 168, 228, 98, 127, 62, 0, 207, 89, 195, 165, 208, 202, 145, 20, 236, 91, 152, 137, 233, + 206, 178, 94, 53, 151, 57, 206, 86, 153, 141, 177, 73, 102, 60, 96, 236, 209, 232, 64, 159, + 103, 28, 24, 139, 80, 251, 113, 189, 253, 82, 17, 52, 226, 106, 40, 88, 21, 180, 85, 36, + 202, 234, 137, 218, 244, 158, 171, 200, 170, 118, 45, 196, 121, 36, 206, 187, 163, 7, 232, + 170, 177, 170, 253, 149, 26, 79, 15, 121, 242, 78, 48, 86, 133, 255, 115, 197, 237, 119, + 174, 20, 247, 81, 42, 249, 234, 5, 89, 7, 134, 160, 38, 197, 129, 9, 106, 168, 20, 130, 2, + 53, 83, 202, 192, 152, 255, 54, 207, 210, 125, 115, 181, 140, 4, 249, 224, 17, 251, 29, 201, + 194, 158, 13, 193, 113, 52, 72, 112, 157, 66, 109, 157, 39, 179, 28, 228, 127, 167, 88, 36, + 164, 183, 136, 167, 61, 72, 166, 221, 155, 229, 69, 13, 114, 229, 4, 231, 77, 233, 232, 156, + 64, 142, 216, 131, 103, 94, 141, 223, 42, 59, 164, 27, 198, 155, 224, 184, 31, 156, 101, + 231, 202, 0, 28, 87, 128, 100, 156, 235, 227, 2, 196, 69, 3, 28, 71, 89, 159, 72, 91, 171, + 28, 245, 247, 38, 222, 225, 114, 201, 6, 142, 187, 179, 36, 132, 12, 71, 174, 168, 150, 72, + 79, 79, 196, 114, 188, 132, 35, 46, 7, 170, 83, 232, 215, 174, 98, 222, 21, 233, 131, 252, + 31, 109, 93, 194, 111, 212, 36, 212, 239, 189, 18, 107, 247, 146, 116, 28, 167, 226, 154, 9, + 96, 5, 200, 5, 57, 32, 28, 140, 4, 217, 32, 19, 116, 7, 73, 136, 225, 92, 181, 25, 207, 126, + 189, 100, 90, 79, 225, 247, 235, 135, 120, 143, 151, 200, 8, 235, 125, 201, 197, 123, 208, + 210, 58, 130, 252, 244, 49, 242, 100, 57, 250, 232, 114, 60, 139, 114, 25, 4, 6, 3, 125, + 191, 163, 64, 10, 72, 5, 93, 52, 223, 185, 191, 228, 251, 190, 191, 22, 247, 186, 63, 43, + 22, 49, 225, 72, 148, 218, 38, 61, 212, 22, 244, 35, 151, 165, 185, 242, 74, 31, 117, 14, + 61, 220, 58, 105, 135, 243, 110, 56, 142, 83, 199, 16, 55, 135, 77, 175, 210, 223, 117, 80, + 210, 65, 234, 255, 179, 22, 117, 61, 22, 107, 91, 170, 34, 105, 175, 166, 99, 221, 12, 169, + 163, 38, 74, 7, 85, 34, 173, 85, 62, 174, 249, 180, 68, 171, 41, 136, 243, 251, 157, 119, + 220, 223, 206, 138, 145, 46, 206, 66, 176, 2, 244, 9, 56, 15, 148, 129, 91, 168, 55, 154, + 117, 210, 213, 249, 28, 92, 148, 174, 110, 15, 122, 184, 173, 146, 140, 227, 100, 167, 72, + 98, 156, 143, 16, 15, 165, 146, 224, 204, 150, 190, 158, 203, 216, 147, 106, 233, 4, 226, + 65, 54, 104, 6, 6, 7, 142, 51, 117, 140, 129, 177, 32, 5, 228, 232, 216, 6, 177, 206, 37, + 252, 70, 76, 144, 102, 238, 109, 120, 15, 7, 32, 6, 93, 82, 11, 239, 148, 79, 247, 27, 186, + 15, 208, 53, 211, 157, 132, 124, 48, 14, 164, 72, 28, 222, 185, 50, 176, 16, 236, 208, 184, + 119, 74, 177, 123, 167, 43, 36, 232, 208, 199, 165, 204, 253, 144, 204, 177, 199, 74, 43, + 113, 33, 159, 230, 203, 102, 241, 200, 171, 64, 73, 29, 137, 149, 145, 34, 53, 35, 93, 189, + 197, 198, 167, 150, 152, 63, 127, 186, 236, 150, 123, 252, 109, 173, 97, 237, 82, 85, 222, + 232, 168, 198, 187, 212, 77, 111, 116, 27, 232, 43, 111, 116, 12, 116, 131, 170, 164, 174, + 243, 179, 107, 60, 187, 74, 125, 73, 93, 161, 254, 69, 125, 193, 153, 151, 169, 127, 114, + 240, 115, 234, 51, 234, 18, 117, 145, 250, 148, 186, 64, 157, 167, 206, 121, 163, 107, 64, + 103, 121, 118, 134, 58, 237, 141, 170, 7, 253, 195, 27, 213, 8, 250, 196, 27, 21, 11, 157, + 162, 254, 78, 125, 76, 157, 228, 148, 191, 241, 236, 4, 117, 156, 58, 70, 29, 165, 62, 162, + 142, 80, 31, 82, 127, 165, 254, 66, 29, 166, 62, 160, 222, 231, 77, 188, 71, 253, 153, 250, + 19, 117, 136, 95, 251, 46, 103, 190, 67, 29, 164, 222, 166, 222, 162, 254, 72, 189, 73, 29, + 160, 246, 83, 251, 168, 55, 120, 205, 189, 212, 30, 14, 254, 129, 122, 157, 218, 77, 253, + 158, 218, 69, 237, 164, 118, 80, 219, 169, 109, 212, 239, 40, 47, 181, 213, 27, 217, 17, + 218, 66, 189, 230, 141, 124, 24, 250, 45, 181, 153, 122, 149, 250, 13, 245, 107, 111, 100, + 7, 168, 130, 218, 196, 117, 191, 162, 94, 161, 54, 82, 191, 164, 94, 166, 54, 112, 249, 75, + 212, 122, 170, 156, 122, 145, 90, 71, 173, 229, 165, 215, 80, 191, 224, 242, 23, 168, 213, + 212, 42, 106, 37, 245, 60, 215, 173, 160, 150, 83, 101, 212, 115, 212, 179, 212, 51, 212, + 50, 94, 122, 41, 151, 255, 156, 122, 154, 90, 66, 45, 166, 22, 113, 193, 66, 106, 1, 245, + 20, 53, 159, 122, 146, 154, 231, 141, 232, 4, 253, 140, 122, 130, 154, 75, 149, 82, 115, + 168, 217, 212, 227, 84, 9, 53, 139, 250, 41, 53, 147, 42, 166, 102, 80, 211, 169, 105, 212, + 84, 234, 39, 84, 17, 245, 99, 111, 120, 103, 104, 10, 85, 72, 77, 166, 38, 81, 19, 169, 9, + 212, 120, 106, 28, 53, 150, 26, 67, 141, 166, 10, 168, 81, 84, 62, 53, 146, 26, 65, 13, 167, + 134, 81, 143, 81, 143, 82, 121, 212, 80, 111, 163, 120, 40, 151, 26, 66, 61, 66, 229, 80, + 217, 212, 96, 42, 139, 202, 164, 6, 81, 25, 212, 64, 42, 157, 26, 64, 245, 167, 210, 168, + 126, 212, 143, 168, 84, 170, 47, 149, 66, 37, 83, 125, 168, 36, 170, 55, 213, 139, 234, 73, + 245, 160, 186, 83, 221, 168, 174, 84, 34, 149, 224, 109, 152, 0, 117, 161, 226, 169, 56, + 170, 51, 213, 137, 122, 152, 234, 72, 117, 160, 218, 83, 177, 84, 59, 170, 45, 21, 67, 181, + 161, 90, 83, 63, 164, 90, 81, 63, 160, 30, 162, 90, 122, 195, 186, 66, 45, 168, 230, 222, + 48, 29, 201, 205, 188, 97, 137, 80, 83, 14, 54, 161, 26, 83, 209, 84, 20, 21, 73, 69, 80, + 225, 84, 35, 170, 33, 21, 70, 61, 72, 53, 224, 55, 212, 231, 55, 124, 159, 131, 245, 168, + 186, 84, 29, 170, 54, 85, 139, 250, 30, 85, 147, 122, 128, 10, 165, 106, 240, 154, 33, 148, + 135, 131, 110, 202, 161, 108, 202, 162, 20, 229, 162, 196, 200, 229, 167, 124, 212, 55, 84, + 53, 245, 53, 117, 139, 170, 162, 110, 82, 95, 153, 175, 117, 221, 48, 255, 145, 171, 146, + 131, 215, 169, 107, 212, 85, 234, 75, 234, 202, 183, 228, 212, 105, 124, 19, 69, 0, 198, + 225, 221, 108, 1, 219, 38, 89, 82, 147, 104, 11, 105, 80, 65, 193, 234, 130, 136, 138, 162, + 178, 130, 196, 72, 164, 7, 237, 64, 15, 104, 65, 17, 16, 68, 106, 210, 21, 45, 4, 234, 129, + 226, 1, 69, 197, 19, 181, 21, 17, 149, 85, 154, 14, 40, 69, 185, 20, 188, 229, 16, 16, 80, + 64, 81, 81, 14, 143, 226, 125, 27, 223, 229, 253, 236, 103, 63, 152, 95, 255, 121, 146, 205, + 236, 108, 50, 147, 148, 180, 147, 111, 201, 55, 228, 107, 242, 21, 57, 66, 14, 147, 67, 228, + 32, 175, 247, 165, 12, 158, 2, 190, 32, 7, 100, 16, 223, 44, 245, 115, 242, 153, 12, 246, 7, + 159, 146, 253, 50, 56, 24, 124, 34, 131, 151, 130, 143, 201, 62, 178, 87, 6, 135, 128, 61, + 50, 24, 1, 31, 145, 15, 201, 110, 78, 189, 139, 236, 228, 100, 31, 112, 178, 29, 100, 59, + 217, 198, 201, 222, 231, 121, 91, 201, 22, 178, 153, 108, 34, 239, 145, 119, 121, 222, 59, + 156, 250, 109, 242, 22, 223, 252, 155, 228, 13, 94, 239, 117, 25, 28, 4, 54, 242, 132, 13, + 188, 208, 107, 124, 215, 175, 114, 178, 245, 100, 29, 89, 75, 214, 144, 213, 228, 21, 242, + 50, 167, 94, 197, 169, 219, 56, 245, 74, 78, 253, 18, 121, 145, 172, 224, 133, 150, 19, 73, + 90, 121, 217, 20, 105, 33, 203, 56, 245, 11, 228, 121, 98, 147, 165, 228, 57, 25, 192, 63, + 92, 245, 89, 25, 184, 4, 60, 67, 150, 200, 192, 48, 240, 180, 12, 20, 130, 197, 50, 80, 4, + 158, 146, 129, 225, 96, 145, 12, 152, 224, 73, 14, 105, 230, 144, 38, 14, 121, 130, 67, 30, + 231, 107, 143, 113, 228, 66, 62, 123, 148, 35, 31, 33, 15, 243, 132, 135, 200, 131, 50, 80, + 12, 30, 224, 233, 11, 200, 253, 228, 62, 190, 165, 123, 57, 114, 62, 71, 54, 146, 121, 50, + 80, 2, 230, 114, 228, 61, 228, 110, 114, 151, 244, 151, 131, 59, 165, 191, 2, 204, 145, 254, + 81, 224, 14, 233, 31, 13, 110, 151, 254, 161, 96, 182, 244, 87, 129, 219, 248, 218, 173, 28, + 121, 11, 135, 220, 108, 182, 192, 163, 250, 144, 112, 187, 55, 26, 222, 239, 46, 12, 191, + 134, 94, 69, 235, 209, 186, 236, 17, 97, 137, 90, 81, 10, 181, 160, 101, 232, 5, 244, 60, + 178, 209, 82, 244, 28, 122, 22, 61, 131, 150, 160, 167, 209, 98, 244, 20, 90, 132, 158, 68, + 205, 168, 9, 61, 145, 53, 49, 252, 40, 122, 4, 61, 140, 30, 66, 15, 162, 7, 208, 2, 116, 63, + 186, 15, 221, 139, 230, 103, 78, 12, 55, 162, 121, 104, 46, 186, 7, 181, 169, 179, 228, 241, + 206, 175, 111, 166, 204, 113, 190, 73, 117, 36, 33, 125, 206, 55, 41, 78, 174, 39, 181, 100, + 42, 185, 142, 76, 33, 215, 146, 201, 100, 18, 185, 144, 12, 144, 157, 29, 46, 32, 231, 147, + 254, 228, 60, 114, 46, 57, 135, 244, 35, 103, 147, 190, 82, 119, 190, 150, 103, 145, 62, 36, + 135, 248, 72, 103, 162, 19, 47, 241, 72, 236, 65, 155, 234, 38, 217, 36, 139, 100, 146, 227, + 72, 39, 233, 113, 118, 182, 163, 89, 5, 191, 69, 223, 160, 175, 209, 87, 232, 8, 58, 140, + 221, 251, 4, 125, 140, 246, 161, 189, 104, 15, 250, 8, 125, 136, 93, 216, 141, 118, 161, + 181, 104, 13, 90, 141, 94, 65, 47, 163, 199, 177, 242, 143, 101, 57, 43, 221, 192, 149, 174, + 151, 62, 231, 27, 126, 19, 23, 231, 70, 50, 141, 220, 64, 44, 50, 152, 12, 226, 58, 92, 66, + 76, 50, 144, 92, 76, 46, 226, 71, 14, 16, 63, 57, 158, 76, 231, 101, 75, 185, 179, 195, 121, + 245, 18, 82, 76, 138, 72, 33, 25, 70, 174, 32, 49, 50, 148, 92, 78, 162, 228, 50, 18, 33, + 67, 200, 165, 228, 100, 114, 18, 223, 96, 55, 18, 38, 249, 36, 68, 186, 146, 46, 36, 143, + 228, 146, 19, 249, 25, 78, 32, 65, 115, 33, 252, 11, 253, 137, 254, 64, 191, 163, 223, 176, + 137, 191, 162, 95, 208, 207, 232, 39, 244, 35, 250, 1, 59, 247, 61, 250, 14, 29, 68, 95, + 162, 47, 208, 1, 244, 57, 250, 12, 125, 138, 29, 220, 132, 222, 67, 239, 162, 119, 208, 219, + 232, 45, 244, 38, 122, 3, 189, 142, 54, 162, 13, 168, 13, 173, 196, 174, 190, 132, 94, 68, + 43, 208, 114, 180, 240, 216, 14, 39, 185, 198, 51, 200, 53, 210, 103, 128, 137, 100, 2, 215, + 99, 60, 185, 154, 140, 35, 87, 145, 43, 201, 88, 50, 134, 212, 144, 106, 50, 154, 140, 34, + 85, 164, 146, 84, 144, 114, 50, 146, 140, 32, 130, 148, 145, 222, 196, 224, 26, 159, 73, + 206, 32, 5, 228, 116, 210, 139, 244, 36, 167, 145, 83, 73, 15, 110, 74, 119, 114, 10, 233, + 64, 50, 136, 70, 92, 68, 229, 207, 77, 49, 23, 193, 52, 250, 27, 29, 194, 138, 238, 68, 31, + 160, 29, 104, 59, 218, 134, 222, 71, 91, 209, 22, 180, 25, 43, 188, 10, 205, 214, 122, 132, + 111, 211, 140, 240, 173, 170, 17, 190, 37, 218, 32, 110, 182, 27, 196, 172, 104, 82, 204, + 180, 147, 34, 59, 57, 32, 25, 75, 106, 217, 201, 46, 96, 122, 210, 78, 238, 73, 118, 156, + 17, 173, 23, 211, 237, 122, 145, 81, 239, 175, 119, 101, 221, 20, 157, 38, 110, 180, 167, + 137, 236, 105, 170, 251, 134, 168, 37, 202, 172, 3, 214, 143, 150, 230, 183, 202, 172, 113, + 86, 157, 181, 192, 218, 129, 3, 157, 22, 91, 43, 172, 141, 150, 214, 150, 94, 111, 230, 88, + 253, 7, 68, 26, 172, 249, 150, 203, 143, 215, 93, 138, 165, 234, 206, 225, 147, 172, 108, + 111, 164, 46, 26, 23, 9, 59, 46, 50, 226, 253, 226, 174, 1, 7, 226, 234, 214, 184, 234, 234, + 22, 87, 205, 120, 113, 220, 133, 81, 203, 227, 221, 123, 70, 156, 209, 233, 120, 48, 47, + 162, 196, 187, 197, 251, 196, 181, 235, 163, 83, 69, 173, 61, 85, 92, 23, 157, 34, 182, 76, + 81, 39, 227, 163, 76, 194, 71, 186, 198, 152, 32, 38, 218, 19, 196, 120, 99, 156, 184, 218, + 30, 39, 174, 50, 174, 20, 99, 141, 49, 162, 198, 24, 45, 170, 237, 209, 98, 148, 81, 41, + 170, 236, 74, 81, 97, 148, 139, 145, 24, 63, 194, 40, 19, 194, 46, 19, 165, 70, 137, 24, + 110, 151, 136, 34, 163, 80, 20, 226, 248, 48, 35, 38, 174, 176, 99, 98, 168, 17, 21, 151, + 219, 81, 81, 28, 85, 47, 51, 34, 98, 136, 118, 110, 88, 9, 171, 74, 62, 254, 106, 243, 27, + 242, 143, 230, 103, 100, 143, 9, 213, 134, 92, 181, 161, 253, 161, 163, 33, 173, 182, 235, + 209, 174, 174, 89, 93, 84, 61, 111, 86, 94, 99, 158, 166, 227, 206, 197, 187, 220, 112, 110, + 99, 110, 83, 110, 75, 110, 7, 253, 216, 3, 205, 93, 155, 211, 144, 227, 170, 245, 53, 248, + 92, 125, 124, 166, 111, 171, 111, 191, 47, 67, 241, 53, 251, 92, 122, 163, 222, 164, 183, + 232, 90, 145, 94, 163, 183, 235, 105, 61, 163, 69, 87, 91, 188, 235, 188, 91, 188, 230, 24, + 173, 200, 91, 227, 157, 234, 213, 116, 175, 115, 68, 235, 108, 122, 141, 179, 34, 186, 39, + 236, 233, 237, 209, 46, 236, 237, 25, 232, 41, 242, 104, 141, 30, 213, 244, 24, 125, 35, + 166, 167, 251, 105, 145, 129, 238, 34, 119, 141, 91, 107, 114, 171, 166, 251, 212, 94, 145, + 246, 172, 116, 150, 203, 204, 194, 11, 237, 153, 233, 76, 87, 58, 83, 85, 52, 181, 155, 170, + 42, 106, 103, 160, 29, 135, 85, 94, 161, 6, 194, 17, 109, 53, 14, 41, 74, 7, 69, 85, 231, + 183, 150, 149, 22, 20, 196, 218, 58, 165, 135, 199, 82, 153, 197, 85, 41, 117, 78, 170, 71, + 169, 115, 111, 150, 84, 166, 58, 206, 73, 41, 162, 178, 170, 188, 85, 85, 231, 85, 180, 170, + 174, 193, 101, 41, 127, 172, 164, 146, 207, 103, 207, 157, 171, 132, 6, 197, 82, 161, 210, + 114, 169, 53, 55, 135, 6, 85, 196, 82, 13, 206, 99, 211, 60, 246, 56, 237, 60, 86, 48, 164, + 162, 160, 58, 97, 37, 18, 117, 5, 137, 2, 220, 161, 234, 4, 142, 212, 89, 248, 59, 134, 138, + 123, 104, 213, 57, 175, 212, 37, 20, 12, 41, 248, 151, 91, 130, 37, 172, 26, 11, 231, 226, + 73, 117, 34, 225, 204, 106, 21, 56, 207, 156, 156, 43, 252, 127, 111, 234, 127, 253, 6, 254, + 183, 183, 19, 107, 170, 21, 229, 31, 1, 6, 0, 142, 41, 47, 233, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 51, 54, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, + 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, 53, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 120, 156, 99, 96, 64, 1, 13, 12, 104, 0, 0, 8, 160, 0, 129, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 51, 55, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 50, 50, 48, 49, + 47, 76, 101, 110, 103, 116, 104, 49, 32, 56, 53, 54, 49, 48, 62, 62, 115, 116, 114, 101, 97, + 109, 13, 10, 120, 156, 236, 189, 119, 124, 149, 69, 211, 55, 62, 219, 247, 202, 73, 72, 232, + 157, 156, 36, 36, 244, 222, 139, 16, 170, 32, 210, 123, 17, 8, 36, 72, 104, 137, 33, 128, + 160, 2, 34, 8, 132, 94, 165, 139, 40, 189, 133, 162, 34, 160, 130, 162, 52, 105, 82, 68, 64, + 64, 16, 4, 2, 138, 20, 65, 74, 206, 111, 246, 58, 215, 9, 33, 130, 222, 247, 243, 188, 239, + 251, 199, 239, 147, 224, 55, 59, 219, 103, 103, 103, 103, 103, 119, 47, 4, 8, 0, 4, 192, 72, + 96, 208, 162, 121, 235, 50, 229, 179, 190, 210, 245, 125, 76, 57, 131, 232, 222, 179, 127, + 84, 252, 168, 139, 7, 203, 0, 144, 154, 0, 33, 139, 122, 14, 78, 116, 63, 172, 245, 225, 41, + 128, 80, 132, 234, 212, 43, 254, 213, 254, 250, 202, 214, 162, 0, 197, 43, 2, 136, 31, 94, + 237, 55, 180, 87, 254, 161, 69, 45, 128, 178, 46, 172, 223, 175, 119, 76, 84, 244, 137, 174, + 221, 46, 96, 124, 8, 198, 43, 247, 198, 132, 108, 195, 115, 166, 98, 124, 45, 198, 11, 247, + 238, 159, 248, 250, 137, 18, 95, 15, 194, 248, 17, 128, 138, 199, 250, 197, 245, 140, 234, + 2, 230, 39, 102, 41, 198, 79, 246, 143, 122, 61, 62, 199, 25, 62, 24, 96, 222, 91, 152, 232, + 30, 16, 213, 63, 102, 157, 255, 212, 183, 49, 190, 16, 32, 199, 91, 241, 113, 3, 19, 91, + 245, 76, 9, 3, 88, 159, 15, 96, 210, 240, 248, 132, 152, 248, 63, 94, 186, 148, 11, 217, + 157, 3, 144, 245, 123, 96, 236, 24, 221, 14, 2, 180, 152, 39, 42, 224, 40, 242, 123, 67, + 118, 4, 122, 209, 108, 90, 80, 151, 226, 212, 252, 240, 243, 80, 220, 179, 3, 94, 175, 135, + 189, 88, 166, 255, 54, 77, 235, 185, 1, 255, 120, 30, 137, 163, 169, 45, 73, 5, 85, 139, + 108, 140, 4, 226, 241, 120, 0, 120, 132, 216, 106, 184, 1, 142, 191, 153, 131, 2, 96, 228, + 8, 65, 157, 48, 134, 84, 214, 238, 192, 131, 106, 97, 143, 21, 49, 162, 160, 34, 12, 39, 30, + 234, 166, 29, 233, 90, 22, 198, 154, 179, 56, 54, 136, 13, 103, 73, 108, 34, 251, 128, 29, + 100, 127, 242, 0, 222, 156, 191, 43, 178, 139, 221, 226, 154, 184, 35, 153, 204, 41, 243, + 203, 96, 89, 93, 118, 149, 30, 213, 191, 96, 159, 130, 125, 11, 126, 93, 112, 95, 65, 79, + 161, 17, 133, 230, 23, 250, 163, 208, 95, 193, 57, 131, 11, 6, 55, 8, 110, 26, 220, 62, 184, + 99, 112, 231, 224, 87, 130, 223, 10, 222, 28, 188, 43, 248, 104, 240, 233, 224, 223, 131, + 239, 4, 167, 186, 3, 221, 161, 238, 8, 119, 105, 119, 89, 119, 69, 119, 117, 119, 77, 119, + 45, 119, 125, 119, 87, 119, 156, 123, 132, 123, 166, 251, 227, 16, 17, 146, 61, 36, 119, 72, + 104, 72, 68, 72, 233, 144, 102, 33, 109, 66, 186, 134, 140, 14, 153, 21, 178, 34, 148, 134, + 202, 208, 192, 208, 108, 161, 57, 67, 243, 133, 6, 135, 22, 11, 45, 17, 218, 40, 52, 42, 52, + 38, 140, 134, 5, 133, 133, 132, 67, 56, 13, 247, 15, 15, 10, 207, 17, 158, 39, 188, 64, 120, + 225, 240, 146, 225, 21, 195, 107, 134, 247, 11, 31, 25, 62, 58, 124, 92, 248, 196, 240, 25, + 225, 31, 132, 175, 9, 223, 24, 190, 53, 124, 123, 248, 174, 240, 239, 194, 15, 133, 255, 24, + 126, 57, 162, 102, 68, 100, 68, 221, 136, 238, 17, 61, 35, 122, 69, 244, 141, 136, 43, 217, + 175, 228, 144, 210, 185, 151, 231, 91, 30, 242, 144, 62, 172, 252, 176, 230, 195, 90, 15, + 235, 60, 172, 255, 112, 195, 195, 171, 15, 61, 143, 122, 60, 174, 253, 248, 214, 227, 71, + 169, 97, 169, 143, 60, 143, 140, 164, 81, 198, 139, 41, 208, 16, 218, 137, 174, 99, 133, 89, + 11, 150, 200, 134, 177, 209, 40, 181, 201, 236, 67, 118, 152, 221, 227, 89, 120, 11, 62, 78, + 76, 19, 135, 197, 77, 9, 210, 133, 82, 43, 36, 67, 100, 164, 236, 174, 90, 20, 4, 148, 90, + 191, 130, 187, 10, 166, 22, 130, 66, 35, 11, 45, 46, 116, 43, 24, 130, 243, 4, 187, 131, 27, + 5, 183, 112, 164, 214, 45, 120, 100, 240, 39, 193, 223, 6, 159, 8, 254, 41, 248, 86, 240, + 159, 56, 221, 217, 80, 106, 197, 81, 106, 229, 221, 213, 210, 164, 214, 7, 165, 54, 213, + 189, 216, 150, 90, 46, 71, 106, 77, 67, 90, 135, 116, 70, 169, 77, 77, 147, 90, 86, 148, 90, + 222, 208, 66, 142, 212, 186, 135, 70, 219, 82, 115, 63, 71, 106, 45, 210, 164, 54, 53, 124, + 113, 248, 170, 52, 169, 237, 67, 169, 157, 68, 169, 85, 79, 147, 90, 76, 68, 31, 148, 90, + 247, 146, 137, 40, 181, 220, 203, 221, 15, 201, 195, 130, 15, 171, 162, 212, 34, 31, 214, + 123, 216, 240, 225, 209, 135, 143, 30, 117, 125, 92, 203, 150, 154, 59, 117, 164, 145, 154, + 231, 34, 106, 232, 239, 136, 239, 113, 69, 190, 128, 40, 102, 244, 50, 53, 214, 252, 230, + 135, 145, 42, 110, 47, 48, 120, 116, 248, 209, 126, 241, 1, 134, 223, 67, 218, 207, 111, + 149, 1, 126, 231, 191, 55, 5, 72, 25, 1, 112, 25, 245, 59, 37, 103, 74, 246, 148, 172, 41, + 129, 41, 1, 41, 254, 41, 174, 20, 191, 20, 43, 69, 165, 200, 20, 145, 194, 82, 104, 10, 92, + 51, 115, 4, 231, 199, 32, 102, 33, 70, 159, 255, 235, 231, 21, 231, 135, 92, 239, 131, 244, + 167, 215, 171, 225, 239, 164, 243, 184, 110, 207, 245, 57, 55, 244, 252, 214, 148, 3, 23, + 75, 158, 159, 156, 50, 231, 220, 138, 115, 179, 207, 206, 62, 187, 228, 236, 4, 128, 179, + 203, 76, 253, 115, 185, 207, 190, 118, 182, 27, 198, 202, 158, 141, 60, 91, 225, 108, 225, + 51, 13, 207, 52, 56, 83, 243, 76, 181, 51, 149, 207, 84, 56, 83, 246, 76, 177, 51, 161, 103, + 242, 159, 201, 113, 134, 156, 254, 237, 116, 202, 233, 43, 167, 47, 157, 190, 96, 106, 157, + 254, 246, 244, 151, 167, 191, 56, 253, 41, 82, 223, 156, 94, 122, 122, 253, 233, 6, 167, + 235, 158, 174, 115, 186, 240, 233, 208, 211, 33, 167, 11, 253, 50, 247, 252, 231, 231, 63, + 57, 187, 173, 87, 238, 94, 217, 196, 23, 184, 4, 23, 168, 249, 106, 158, 154, 235, 29, 167, + 188, 42, 107, 5, 156, 10, 56, 226, 127, 77, 0, 235, 105, 214, 43, 41, 143, 203, 248, 55, + 148, 16, 154, 31, 81, 31, 49, 82, 140, 195, 223, 211, 197, 22, 44, 237, 143, 168, 44, 151, + 168, 45, 222, 218, 186, 16, 162, 172, 46, 175, 163, 245, 98, 235, 44, 128, 95, 46, 147, 234, + 151, 205, 65, 67, 248, 151, 31, 191, 138, 126, 173, 240, 119, 60, 98, 112, 186, 212, 120, + 251, 183, 157, 226, 183, 224, 185, 117, 223, 53, 240, 27, 231, 196, 70, 255, 91, 95, 233, + 106, 118, 241, 235, 154, 70, 119, 250, 15, 202, 215, 76, 163, 122, 185, 106, 186, 122, 255, + 173, 0, 131, 15, 97, 52, 140, 97, 93, 97, 54, 92, 134, 119, 97, 50, 76, 128, 133, 176, 18, + 62, 130, 32, 72, 66, 145, 190, 3, 51, 224, 38, 252, 1, 147, 224, 61, 24, 71, 8, 238, 40, + 191, 195, 34, 88, 5, 183, 225, 22, 220, 129, 37, 176, 6, 246, 192, 183, 176, 22, 122, 64, + 79, 152, 10, 209, 176, 15, 98, 96, 55, 236, 133, 131, 176, 31, 190, 131, 3, 240, 43, 244, + 130, 35, 112, 8, 14, 195, 58, 120, 21, 126, 131, 105, 112, 12, 190, 135, 163, 208, 27, 174, + 66, 10, 140, 135, 62, 16, 11, 125, 161, 63, 244, 131, 1, 176, 24, 226, 224, 53, 136, 135, 4, + 24, 8, 131, 32, 17, 6, 195, 16, 184, 2, 175, 195, 48, 24, 10, 111, 192, 91, 240, 38, 124, + 10, 31, 192, 8, 24, 142, 251, 220, 219, 112, 13, 174, 195, 103, 100, 54, 121, 143, 80, 194, + 8, 39, 2, 30, 194, 35, 50, 135, 204, 37, 243, 200, 124, 120, 12, 169, 68, 18, 69, 52, 120, + 200, 2, 178, 144, 44, 34, 239, 147, 197, 228, 3, 98, 17, 63, 226, 34, 254, 100, 9, 249, 16, + 254, 132, 123, 228, 35, 178, 148, 44, 35, 203, 201, 10, 178, 146, 172, 34, 171, 201, 26, + 178, 150, 172, 35, 235, 73, 50, 217, 64, 54, 146, 77, 112, 31, 142, 147, 36, 50, 129, 108, + 38, 31, 147, 79, 200, 167, 100, 11, 9, 32, 89, 200, 103, 100, 43, 9, 36, 65, 36, 43, 201, 6, + 231, 225, 103, 146, 157, 228, 32, 219, 200, 118, 146, 147, 228, 34, 19, 201, 231, 228, 11, + 242, 37, 217, 65, 118, 146, 175, 72, 110, 146, 7, 214, 67, 50, 201, 75, 242, 145, 175, 201, + 46, 146, 159, 20, 32, 5, 73, 33, 242, 13, 249, 22, 254, 130, 7, 112, 1, 46, 146, 96, 226, + 38, 33, 36, 148, 236, 38, 123, 200, 94, 178, 143, 236, 39, 223, 145, 3, 228, 32, 9, 35, 133, + 73, 56, 137, 32, 135, 200, 97, 114, 132, 124, 79, 142, 146, 99, 176, 149, 20, 33, 69, 73, + 49, 82, 28, 126, 129, 75, 228, 184, 76, 146, 19, 228, 68, 57, 73, 78, 150, 83, 228, 84, 57, + 77, 78, 151, 51, 228, 76, 57, 75, 206, 150, 239, 201, 57, 162, 176, 156, 43, 231, 193, 50, + 57, 95, 46, 144, 11, 229, 34, 249, 190, 92, 44, 63, 144, 75, 228, 135, 242, 35, 185, 84, 46, + 147, 203, 121, 31, 222, 87, 174, 144, 43, 229, 42, 185, 90, 174, 145, 107, 229, 58, 185, 94, + 38, 203, 13, 114, 163, 220, 36, 55, 243, 126, 188, 191, 252, 88, 126, 34, 63, 149, 91, 228, + 103, 114, 171, 220, 38, 183, 203, 207, 229, 23, 242, 75, 185, 67, 238, 148, 95, 201, 175, + 229, 46, 249, 141, 252, 86, 238, 150, 123, 228, 94, 185, 79, 238, 151, 223, 201, 3, 242, + 160, 60, 36, 15, 243, 71, 252, 49, 79, 229, 30, 1, 130, 8, 42, 152, 224, 66, 8, 41, 148, + 208, 194, 18, 126, 194, 37, 143, 200, 239, 229, 81, 121, 92, 158, 144, 63, 200, 147, 242, + 71, 121, 74, 158, 150, 103, 228, 79, 242, 172, 60, 39, 207, 203, 159, 229, 5, 121, 81, 254, + 34, 47, 201, 203, 242, 87, 121, 5, 215, 250, 53, 153, 34, 175, 203, 27, 242, 55, 114, 130, + 252, 64, 78, 146, 31, 201, 41, 114, 218, 149, 77, 5, 169, 172, 42, 155, 202, 174, 114, 168, + 156, 42, 151, 202, 173, 242, 168, 188, 42, 191, 42, 160, 10, 170, 66, 42, 88, 185, 85, 136, + 10, 117, 101, 119, 229, 112, 229, 116, 5, 186, 206, 185, 206, 187, 126, 118, 93, 112, 93, + 116, 253, 226, 186, 228, 186, 236, 250, 213, 117, 197, 255, 174, 255, 159, 254, 247, 252, + 239, 251, 255, 229, 255, 192, 255, 161, 255, 35, 255, 199, 254, 169, 254, 158, 0, 8, 32, 1, + 84, 133, 169, 194, 42, 92, 69, 168, 34, 170, 168, 42, 166, 138, 171, 18, 34, 220, 149, 203, + 149, 91, 141, 84, 111, 171, 81, 234, 29, 53, 90, 141, 81, 239, 170, 177, 106, 156, 26, 175, + 146, 212, 4, 53, 81, 77, 82, 147, 213, 20, 53, 85, 77, 83, 211, 213, 12, 53, 83, 205, 130, + 19, 112, 78, 205, 134, 147, 234, 61, 53, 71, 205, 69, 235, 53, 31, 173, 216, 66, 181, 72, + 189, 175, 22, 171, 15, 212, 18, 245, 161, 250, 8, 126, 132, 83, 112, 26, 206, 194, 15, 240, + 147, 90, 170, 150, 169, 229, 106, 133, 90, 169, 86, 169, 213, 106, 141, 90, 171, 214, 169, + 245, 42, 89, 109, 80, 27, 213, 38, 181, 89, 125, 236, 202, 227, 202, 235, 202, 231, 202, + 239, 42, 224, 42, 232, 42, 228, 10, 118, 185, 93, 33, 174, 80, 87, 152, 171, 176, 43, 220, + 21, 225, 42, 226, 42, 202, 167, 243, 25, 186, 46, 31, 166, 235, 233, 250, 186, 129, 110, + 168, 95, 228, 137, 186, 145, 110, 172, 95, 210, 77, 244, 203, 186, 169, 110, 166, 155, 235, + 22, 186, 165, 110, 165, 91, 235, 54, 186, 173, 110, 167, 219, 235, 14, 186, 163, 238, 164, + 59, 235, 46, 250, 21, 221, 85, 119, 211, 221, 249, 44, 87, 49, 87, 113, 87, 9, 87, 73, 87, + 41, 87, 105, 87, 25, 87, 89, 215, 85, 215, 53, 87, 138, 235, 186, 235, 134, 171, 156, 171, + 188, 171, 130, 158, 164, 39, 235, 41, 122, 170, 158, 166, 167, 235, 25, 122, 166, 158, 165, + 103, 235, 247, 244, 28, 61, 87, 207, 211, 243, 245, 2, 253, 126, 0, 11, 224, 1, 2, 10, 145, + 223, 201, 77, 242, 7, 57, 67, 110, 145, 219, 228, 14, 249, 147, 220, 35, 247, 201, 95, 228, + 1, 41, 65, 30, 146, 71, 228, 49, 73, 37, 37, 209, 183, 2, 74, 208, 143, 99, 148, 83, 65, 37, + 85, 84, 83, 139, 250, 145, 82, 212, 69, 253, 105, 0, 205, 66, 3, 105, 16, 205, 74, 179, 209, + 236, 52, 7, 41, 77, 115, 210, 92, 164, 12, 41, 75, 115, 211, 60, 52, 47, 205, 71, 243, 211, + 2, 180, 32, 45, 68, 131, 209, 71, 155, 136, 254, 70, 40, 41, 71, 202, 211, 48, 82, 129, 22, + 166, 225, 52, 130, 22, 161, 69, 105, 49, 90, 156, 150, 112, 85, 116, 85, 114, 157, 118, 157, + 113, 253, 228, 250, 205, 245, 187, 235, 166, 235, 15, 189, 155, 150, 164, 165, 104, 105, 90, + 134, 150, 165, 229, 104, 121, 90, 129, 86, 164, 149, 104, 101, 90, 69, 239, 209, 123, 233, + 48, 250, 6, 125, 147, 190, 69, 135, 211, 17, 116, 36, 125, 155, 142, 162, 239, 208, 209, + 116, 140, 222, 71, 223, 165, 99, 245, 126, 253, 157, 62, 160, 15, 234, 67, 250, 176, 62, + 162, 191, 215, 71, 245, 49, 125, 92, 159, 208, 63, 232, 147, 250, 71, 125, 74, 159, 214, + 103, 244, 79, 250, 172, 62, 167, 207, 235, 159, 245, 5, 125, 81, 255, 162, 47, 233, 203, + 250, 87, 125, 69, 95, 211, 41, 250, 186, 190, 161, 127, 211, 191, 235, 155, 250, 15, 125, + 75, 223, 214, 119, 244, 93, 253, 167, 190, 167, 239, 235, 191, 244, 3, 58, 142, 142, 23, 65, + 34, 171, 126, 168, 31, 137, 108, 34, 187, 126, 172, 83, 69, 14, 145, 83, 228, 18, 185, 181, + 199, 2, 139, 88, 84, 228, 17, 121, 45, 102, 113, 75, 88, 210, 82, 150, 182, 44, 203, 207, + 114, 89, 254, 34, 159, 200, 47, 10, 136, 130, 162, 144, 8, 182, 2, 172, 44, 86, 160, 21, 36, + 220, 34, 68, 132, 138, 48, 43, 171, 149, 205, 202, 110, 229, 176, 114, 90, 185, 172, 220, + 86, 30, 43, 175, 149, 207, 202, 111, 21, 176, 10, 90, 133, 172, 96, 203, 109, 133, 88, 161, + 86, 88, 128, 180, 194, 173, 8, 171, 136, 85, 212, 42, 102, 21, 183, 74, 88, 37, 69, 97, 17, + 110, 149, 178, 74, 91, 101, 172, 178, 86, 57, 171, 188, 85, 193, 170, 104, 85, 178, 42, 91, + 85, 172, 170, 86, 53, 171, 186, 136, 16, 69, 172, 26, 86, 77, 235, 5, 171, 150, 85, 219, + 138, 180, 234, 88, 117, 173, 122, 86, 125, 171, 129, 213, 208, 117, 203, 117, 219, 122, 209, + 106, 20, 160, 2, 116, 128, 21, 224, 23, 224, 10, 240, 183, 26, 91, 47, 89, 77, 172, 151, + 173, 166, 86, 51, 171, 185, 213, 194, 106, 105, 181, 178, 90, 91, 109, 172, 182, 86, 59, + 171, 189, 213, 33, 32, 32, 32, 75, 64, 96, 64, 144, 213, 209, 234, 100, 117, 182, 186, 88, + 175, 88, 93, 173, 110, 86, 119, 43, 202, 234, 97, 245, 180, 162, 173, 24, 171, 151, 245, + 170, 213, 219, 138, 117, 221, 177, 250, 88, 125, 173, 126, 86, 127, 107, 128, 21, 103, 197, + 91, 175, 89, 9, 214, 64, 43, 209, 26, 100, 13, 166, 147, 232, 100, 58, 133, 78, 165, 211, + 232, 116, 58, 131, 206, 164, 179, 232, 108, 215, 93, 250, 30, 157, 67, 231, 210, 121, 116, + 62, 93, 64, 23, 210, 69, 244, 125, 107, 136, 235, 79, 215, 61, 215, 125, 215, 95, 244, 186, + 107, 153, 107, 169, 107, 185, 107, 133, 107, 165, 107, 149, 107, 181, 107, 141, 168, 224, + 122, 64, 127, 163, 191, 179, 183, 217, 59, 108, 12, 27, 203, 198, 179, 73, 108, 10, 155, + 193, 102, 177, 185, 108, 33, 158, 1, 150, 178, 149, 108, 53, 91, 203, 214, 179, 13, 236, 99, + 246, 25, 251, 156, 237, 100, 223, 176, 189, 236, 0, 189, 201, 142, 176, 227, 236, 71, 246, + 19, 251, 153, 93, 98, 87, 217, 13, 246, 59, 251, 131, 254, 65, 111, 209, 219, 244, 14, 189, + 75, 255, 164, 247, 232, 125, 81, 85, 84, 19, 213, 93, 107, 93, 235, 92, 235, 93, 15, 93, + 143, 92, 143, 93, 169, 46, 143, 63, 208, 191, 232, 3, 250, 144, 62, 162, 143, 105, 42, 245, + 48, 96, 132, 81, 198, 24, 167, 215, 153, 16, 69, 69, 73, 81, 67, 212, 20, 181, 68, 36, 214, + 174, 43, 234, 139, 134, 162, 145, 120, 73, 52, 19, 173, 68, 59, 209, 137, 5, 139, 174, 162, + 135, 232, 37, 250, 136, 1, 34, 65, 12, 102, 69, 196, 48, 49, 28, 253, 162, 81, 98, 180, 120, + 87, 140, 19, 73, 98, 162, 152, 44, 166, 162, 143, 52, 83, 204, 22, 115, 240, 100, 181, 128, + 149, 16, 139, 196, 98, 241, 145, 88, 33, 214, 136, 100, 177, 89, 124, 34, 182, 138, 109, + 226, 75, 241, 53, 158, 108, 246, 139, 67, 226, 8, 43, 37, 142, 138, 31, 196, 105, 113, 78, + 92, 100, 229, 196, 175, 34, 69, 252, 46, 110, 139, 123, 226, 161, 240, 224, 185, 71, 161, + 15, 31, 40, 179, 202, 236, 50, 55, 75, 145, 121, 101, 65, 60, 5, 185, 209, 163, 15, 149, + 133, 101, 132, 44, 42, 139, 203, 146, 178, 180, 44, 203, 42, 201, 242, 178, 162, 172, 138, + 39, 164, 90, 232, 237, 215, 149, 245, 153, 150, 13, 100, 67, 249, 162, 108, 36, 27, 203, + 151, 100, 19, 249, 178, 108, 42, 155, 201, 230, 178, 133, 108, 41, 91, 201, 214, 178, 141, + 108, 43, 219, 201, 246, 178, 131, 236, 40, 59, 97, 78, 103, 215, 6, 215, 38, 159, 124, 152, + 31, 115, 49, 127, 175, 124, 100, 23, 217, 93, 70, 203, 222, 50, 214, 245, 177, 63, 245, 151, + 254, 126, 254, 89, 252, 179, 249, 231, 242, 207, 231, 95, 200, 63, 212, 63, 194, 191, 168, + 127, 113, 255, 146, 254, 101, 253, 43, 250, 87, 245, 175, 233, 31, 233, 95, 223, 191, 145, + 255, 203, 254, 45, 252, 219, 248, 119, 240, 239, 226, 223, 221, 63, 218, 191, 183, 127, 31, + 255, 126, 174, 179, 1, 121, 2, 242, 146, 159, 200, 89, 114, 142, 156, 39, 63, 147, 11, 150, + 199, 15, 252, 136, 31, 245, 99, 126, 220, 79, 248, 73, 63, 229, 167, 253, 44, 63, 63, 63, + 151, 159, 191, 95, 128, 95, 22, 191, 64, 191, 32, 191, 172, 126, 217, 252, 178, 251, 229, + 32, 23, 201, 47, 252, 79, 126, 143, 223, 231, 127, 241, 7, 252, 161, 235, 160, 235, 144, + 235, 176, 235, 136, 235, 123, 215, 81, 215, 49, 215, 113, 215, 9, 215, 15, 174, 147, 174, + 31, 233, 21, 122, 149, 94, 163, 41, 174, 111, 96, 3, 108, 164, 73, 242, 27, 82, 17, 62, 134, + 79, 224, 107, 114, 9, 54, 193, 102, 216, 229, 250, 22, 70, 193, 78, 24, 203, 154, 225, 185, + 179, 21, 158, 161, 90, 146, 73, 100, 178, 107, 55, 107, 203, 218, 177, 246, 172, 3, 107, + 205, 218, 248, 165, 250, 121, 240, 192, 126, 151, 252, 234, 34, 46, 74, 170, 184, 152, 139, + 211, 29, 124, 56, 108, 119, 225, 118, 235, 82, 174, 32, 87, 86, 255, 131, 254, 135, 252, 15, + 251, 31, 161, 19, 92, 167, 96, 46, 220, 128, 175, 96, 41, 76, 39, 181, 97, 10, 169, 67, 6, + 147, 105, 100, 58, 153, 65, 134, 192, 22, 242, 166, 203, 146, 137, 114, 144, 28, 66, 191, + 117, 125, 230, 218, 234, 218, 230, 218, 238, 250, 220, 245, 133, 235, 75, 215, 14, 215, 78, + 186, 155, 238, 161, 123, 233, 62, 186, 159, 126, 71, 15, 208, 131, 244, 16, 61, 76, 143, + 208, 239, 233, 81, 122, 150, 158, 163, 231, 233, 207, 244, 2, 189, 72, 127, 161, 151, 232, + 101, 250, 43, 106, 231, 11, 168, 141, 173, 69, 27, 209, 150, 5, 51, 55, 11, 97, 161, 168, + 147, 61, 69, 180, 136, 65, 61, 109, 46, 90, 136, 150, 168, 165, 221, 68, 119, 17, 133, 154, + 219, 68, 188, 44, 154, 162, 174, 237, 18, 223, 136, 111, 81, 223, 190, 19, 7, 196, 65, 212, + 221, 129, 34, 81, 12, 66, 45, 142, 19, 241, 226, 53, 86, 132, 21, 101, 197, 88, 113, 212, + 230, 55, 196, 155, 226, 45, 212, 228, 241, 168, 207, 99, 81, 159, 39, 160, 126, 143, 96, 37, + 88, 73, 212, 234, 105, 172, 20, 43, 205, 202, 176, 178, 172, 28, 43, 207, 42, 176, 138, 168, + 165, 119, 196, 93, 241, 39, 106, 236, 117, 113, 67, 252, 134, 122, 26, 132, 154, 154, 205, + 244, 137, 122, 90, 72, 246, 65, 93, 237, 43, 251, 177, 20, 118, 13, 113, 29, 245, 178, 14, + 106, 102, 61, 212, 244, 243, 226, 103, 113, 1, 181, 183, 24, 234, 112, 17, 212, 225, 18, + 162, 161, 44, 43, 203, 161, 78, 135, 163, 62, 151, 66, 45, 174, 33, 107, 202, 23, 68, 49, + 81, 140, 85, 98, 149, 217, 109, 118, 7, 79, 36, 18, 188, 87, 10, 248, 131, 91, 27, 0, 205, + 224, 127, 99, 38, 227, 66, 42, 109, 249, 185, 252, 3, 178, 4, 6, 101, 205, 150, 61, 71, 206, + 92, 185, 243, 228, 205, 151, 191, 64, 193, 66, 193, 238, 144, 208, 176, 194, 225, 17, 69, + 138, 22, 43, 94, 162, 100, 169, 210, 101, 202, 150, 43, 95, 161, 98, 165, 202, 85, 170, 86, + 171, 94, 163, 230, 11, 181, 106, 71, 214, 169, 91, 175, 126, 131, 134, 47, 54, 106, 252, 82, + 147, 151, 155, 54, 107, 222, 162, 101, 171, 214, 109, 218, 182, 107, 223, 161, 99, 167, 206, + 93, 94, 233, 218, 173, 123, 20, 244, 232, 25, 29, 211, 235, 213, 222, 177, 125, 250, 246, + 235, 63, 32, 46, 254, 181, 132, 129, 137, 131, 6, 15, 121, 125, 232, 176, 55, 222, 124, 107, + 248, 136, 145, 111, 143, 122, 103, 244, 152, 119, 199, 142, 27, 159, 52, 97, 226, 164, 201, + 83, 166, 78, 155, 62, 99, 230, 172, 217, 239, 205, 153, 59, 15, 22, 44, 92, 244, 254, 226, + 15, 150, 124, 248, 209, 210, 101, 203, 87, 172, 92, 181, 154, 173, 89, 187, 110, 125, 242, + 134, 141, 155, 54, 127, 252, 201, 167, 91, 62, 219, 186, 109, 251, 231, 95, 124, 185, 99, + 39, 124, 189, 235, 155, 111, 119, 239, 217, 187, 111, 255, 119, 7, 14, 30, 58, 12, 71, 190, + 63, 122, 236, 248, 137, 31, 224, 199, 83, 167, 207, 252, 116, 246, 92, 230, 29, 74, 230, 29, + 74, 230, 29, 74, 230, 29, 202, 51, 110, 39, 50, 239, 80, 50, 239, 80, 50, 239, 80, 50, 239, + 80, 50, 239, 80, 50, 239, 80, 50, 239, 80, 50, 239, 80, 50, 239, 80, 50, 239, 80, 50, 239, + 80, 50, 239, 80, 210, 221, 161, 136, 173, 80, 192, 198, 114, 40, 192, 35, 160, 0, 128, 231, + 23, 31, 82, 99, 61, 191, 152, 60, 19, 210, 107, 120, 118, 41, 232, 133, 243, 179, 17, 61, + 235, 31, 208, 211, 115, 195, 38, 242, 0, 114, 195, 125, 244, 32, 203, 65, 99, 224, 112, 15, + 125, 246, 245, 232, 223, 206, 130, 28, 208, 6, 102, 163, 7, 90, 24, 114, 65, 91, 104, 140, + 62, 112, 94, 82, 2, 38, 146, 249, 158, 193, 158, 171, 240, 2, 76, 135, 37, 158, 79, 201, 40, + 207, 42, 204, 159, 130, 94, 250, 125, 228, 224, 44, 39, 80, 5, 154, 97, 249, 182, 232, 169, + 95, 101, 151, 160, 163, 103, 30, 104, 24, 11, 46, 168, 1, 173, 72, 46, 136, 66, 143, 229, 4, + 220, 69, 30, 102, 192, 76, 248, 130, 188, 233, 185, 143, 189, 230, 64, 253, 155, 14, 53, + 161, 14, 212, 241, 236, 244, 60, 130, 226, 48, 145, 79, 21, 39, 173, 143, 209, 163, 223, 70, + 164, 167, 167, 39, 22, 10, 65, 40, 36, 209, 18, 158, 19, 158, 115, 16, 1, 29, 241, 100, 177, + 6, 121, 42, 65, 118, 240, 70, 16, 130, 94, 254, 24, 152, 67, 242, 178, 111, 145, 154, 133, + 231, 139, 84, 226, 79, 95, 97, 245, 196, 151, 216, 83, 99, 104, 135, 254, 255, 16, 72, 194, + 147, 197, 62, 146, 141, 180, 16, 39, 197, 77, 207, 27, 158, 95, 65, 66, 118, 40, 138, 60, + 197, 194, 85, 82, 137, 52, 165, 75, 185, 191, 167, 150, 231, 20, 116, 134, 207, 96, 15, 142, + 215, 252, 217, 193, 59, 243, 229, 162, 115, 106, 109, 207, 66, 207, 87, 144, 19, 62, 69, 31, + 127, 59, 217, 41, 202, 139, 201, 143, 223, 246, 124, 224, 89, 7, 254, 200, 79, 57, 148, 72, + 51, 236, 167, 7, 158, 105, 118, 226, 9, 229, 15, 184, 69, 71, 120, 70, 64, 35, 104, 141, 61, + 127, 131, 94, 185, 27, 125, 237, 162, 228, 4, 250, 18, 195, 233, 112, 118, 20, 74, 227, 104, + 95, 65, 110, 7, 193, 251, 144, 140, 51, 178, 21, 182, 193, 231, 40, 155, 211, 232, 243, 95, + 66, 143, 63, 63, 121, 137, 244, 192, 53, 115, 11, 189, 147, 104, 122, 136, 205, 103, 155, + 217, 49, 78, 248, 74, 148, 119, 24, 132, 163, 140, 18, 113, 117, 125, 98, 159, 131, 14, 17, + 129, 237, 151, 37, 45, 72, 31, 18, 135, 103, 150, 133, 228, 60, 77, 166, 215, 233, 61, 174, + 249, 59, 252, 33, 127, 44, 34, 82, 207, 167, 62, 244, 52, 243, 220, 133, 60, 144, 15, 94, + 198, 83, 207, 8, 148, 237, 135, 246, 250, 63, 8, 199, 241, 188, 117, 27, 254, 196, 51, 71, + 85, 210, 27, 207, 49, 201, 104, 141, 174, 163, 119, 20, 74, 155, 211, 120, 58, 155, 46, 165, + 107, 209, 54, 76, 99, 59, 121, 37, 94, 151, 247, 229, 7, 248, 41, 92, 15, 19, 84, 148, 74, + 125, 180, 44, 117, 70, 234, 218, 212, 35, 158, 79, 61, 71, 80, 119, 178, 96, 251, 17, 208, + 16, 37, 250, 54, 106, 197, 82, 248, 18, 79, 99, 199, 209, 3, 253, 9, 46, 24, 253, 193, 246, + 107, 144, 78, 164, 43, 246, 50, 144, 140, 35, 51, 241, 60, 244, 13, 158, 62, 174, 225, 40, + 193, 254, 19, 74, 107, 208, 250, 216, 107, 28, 77, 64, 57, 141, 178, 119, 211, 165, 104, 1, + 140, 13, 56, 69, 127, 162, 41, 244, 46, 19, 44, 20, 87, 192, 107, 184, 39, 38, 179, 45, 236, + 48, 187, 204, 131, 120, 4, 47, 205, 203, 241, 230, 188, 19, 158, 9, 202, 227, 159, 23, 209, + 34, 172, 16, 171, 197, 87, 226, 38, 174, 155, 104, 25, 47, 175, 160, 79, 61, 90, 127, 247, + 184, 248, 227, 179, 169, 144, 218, 59, 53, 57, 117, 19, 234, 174, 70, 77, 26, 134, 146, 88, + 132, 167, 205, 245, 40, 139, 109, 120, 198, 252, 14, 37, 242, 35, 206, 194, 29, 156, 133, + 124, 120, 118, 42, 130, 124, 87, 35, 13, 73, 19, 210, 148, 180, 39, 93, 72, 12, 25, 69, 198, + 162, 45, 155, 67, 230, 227, 73, 111, 29, 142, 0, 199, 128, 254, 100, 40, 45, 65, 235, 208, + 214, 52, 138, 198, 160, 255, 54, 22, 189, 130, 205, 248, 103, 43, 218, 178, 19, 244, 36, + 189, 129, 156, 231, 102, 97, 104, 59, 202, 177, 198, 172, 19, 235, 204, 6, 224, 24, 18, 217, + 112, 54, 26, 37, 59, 141, 173, 98, 135, 216, 81, 246, 43, 187, 194, 110, 224, 172, 229, 230, + 133, 248, 32, 62, 140, 207, 229, 203, 249, 102, 126, 4, 45, 72, 127, 252, 179, 4, 247, 201, + 29, 226, 136, 120, 36, 30, 73, 42, 243, 201, 2, 178, 12, 218, 148, 21, 242, 130, 146, 170, + 178, 106, 129, 231, 132, 99, 234, 182, 142, 199, 83, 96, 113, 228, 220, 157, 254, 40, 78, + 243, 226, 26, 44, 68, 87, 209, 28, 124, 4, 185, 129, 9, 5, 9, 135, 64, 28, 121, 9, 156, 135, + 214, 184, 42, 110, 67, 109, 150, 138, 243, 146, 197, 228, 35, 111, 57, 105, 94, 158, 221, + 212, 148, 145, 60, 25, 235, 39, 146, 109, 80, 137, 124, 3, 35, 36, 101, 120, 116, 231, 231, + 97, 35, 57, 67, 207, 243, 175, 233, 11, 120, 138, 237, 78, 242, 242, 229, 108, 128, 216, 71, + 67, 96, 53, 90, 163, 169, 116, 59, 221, 70, 234, 194, 102, 90, 147, 182, 163, 11, 24, 144, + 75, 100, 5, 92, 66, 125, 127, 29, 102, 146, 190, 100, 32, 172, 38, 55, 72, 117, 242, 22, + 169, 66, 70, 192, 49, 154, 139, 181, 38, 163, 161, 166, 103, 9, 229, 120, 138, 110, 76, 110, + 2, 114, 0, 111, 243, 104, 232, 10, 255, 248, 67, 170, 193, 25, 184, 154, 186, 136, 7, 240, + 55, 209, 62, 109, 129, 217, 56, 163, 107, 224, 28, 89, 9, 15, 136, 240, 92, 71, 235, 198, + 208, 26, 69, 161, 149, 153, 136, 250, 62, 6, 140, 213, 123, 5, 215, 217, 8, 92, 143, 121, + 209, 130, 244, 147, 135, 96, 179, 185, 141, 86, 85, 100, 45, 62, 12, 110, 226, 201, 249, + 170, 216, 138, 26, 85, 23, 45, 233, 175, 169, 177, 124, 17, 191, 232, 169, 226, 41, 133, 43, + 12, 87, 25, 172, 192, 117, 215, 27, 94, 196, 21, 115, 9, 181, 228, 115, 140, 155, 88, 23, + 92, 233, 126, 104, 75, 202, 227, 170, 110, 1, 157, 32, 26, 222, 66, 171, 55, 205, 147, 236, + 89, 224, 121, 199, 51, 212, 19, 7, 251, 177, 238, 3, 60, 135, 60, 32, 139, 113, 69, 108, + 193, 26, 53, 97, 15, 254, 153, 2, 63, 146, 9, 184, 14, 95, 252, 247, 251, 150, 103, 253, + 164, 70, 195, 14, 184, 70, 242, 224, 89, 190, 60, 174, 135, 27, 98, 48, 238, 76, 171, 208, + 175, 250, 66, 28, 144, 229, 80, 218, 163, 97, 62, 106, 244, 5, 212, 102, 63, 28, 65, 79, 56, + 2, 215, 224, 30, 209, 56, 55, 121, 161, 36, 84, 68, 126, 171, 34, 239, 29, 160, 31, 237, + 200, 62, 135, 122, 36, 31, 196, 227, 154, 45, 138, 118, 188, 174, 51, 146, 129, 216, 202, + 40, 148, 222, 2, 92, 207, 159, 227, 218, 184, 137, 118, 162, 11, 124, 1, 39, 9, 37, 185, + 113, 68, 61, 177, 127, 141, 237, 52, 65, 57, 119, 195, 210, 203, 112, 6, 223, 33, 155, 48, + 37, 26, 173, 118, 113, 72, 193, 113, 103, 33, 85, 105, 34, 246, 23, 137, 45, 205, 70, 171, + 181, 3, 121, 58, 3, 151, 81, 218, 30, 155, 175, 146, 104, 23, 234, 147, 118, 216, 214, 61, + 104, 15, 209, 216, 67, 101, 104, 65, 54, 224, 12, 124, 2, 213, 208, 178, 214, 103, 223, 161, + 188, 11, 147, 32, 168, 75, 66, 201, 71, 88, 175, 59, 174, 208, 44, 80, 16, 170, 137, 139, + 132, 66, 201, 212, 102, 158, 170, 52, 150, 125, 142, 123, 140, 7, 211, 23, 227, 238, 149, + 31, 94, 32, 175, 33, 23, 129, 56, 142, 199, 144, 147, 52, 135, 74, 169, 173, 144, 135, 163, + 132, 241, 100, 242, 189, 205, 197, 92, 26, 227, 25, 203, 134, 164, 246, 131, 253, 176, 18, + 231, 36, 146, 15, 86, 245, 35, 235, 180, 137, 172, 93, 235, 133, 154, 53, 170, 87, 171, 90, + 165, 82, 197, 10, 229, 203, 149, 45, 83, 186, 84, 201, 18, 197, 139, 21, 45, 18, 17, 94, 56, + 44, 52, 196, 29, 92, 168, 96, 129, 252, 249, 242, 230, 201, 157, 43, 103, 142, 236, 217, + 178, 6, 5, 102, 9, 240, 119, 249, 89, 90, 73, 193, 25, 37, 80, 178, 65, 88, 195, 238, 238, + 228, 136, 238, 201, 60, 34, 172, 81, 163, 82, 38, 30, 22, 133, 9, 81, 233, 18, 186, 39, 187, + 49, 169, 225, 211, 101, 146, 221, 221, 237, 98, 238, 167, 75, 70, 98, 201, 94, 25, 74, 70, + 122, 75, 70, 166, 149, 36, 65, 238, 154, 80, 179, 84, 73, 119, 131, 48, 119, 242, 129, 250, + 97, 238, 45, 164, 83, 203, 14, 72, 79, 170, 31, 214, 209, 157, 124, 195, 166, 155, 218, 244, + 84, 155, 14, 64, 58, 36, 4, 43, 184, 27, 228, 233, 93, 223, 157, 76, 186, 187, 27, 36, 55, + 28, 220, 59, 169, 65, 247, 250, 216, 220, 6, 151, 95, 189, 176, 122, 49, 126, 165, 74, 194, + 6, 63, 23, 146, 46, 164, 146, 115, 135, 197, 111, 32, 185, 107, 17, 155, 160, 185, 27, 84, + 223, 64, 65, 7, 32, 83, 201, 249, 194, 234, 55, 72, 206, 27, 86, 223, 112, 144, 204, 194, + 27, 68, 69, 39, 183, 104, 217, 161, 65, 253, 252, 33, 33, 29, 75, 149, 76, 38, 245, 122, + 134, 245, 72, 134, 176, 186, 201, 129, 37, 236, 34, 80, 207, 238, 38, 89, 214, 75, 86, 118, + 55, 238, 88, 51, 26, 152, 224, 222, 80, 114, 71, 210, 196, 45, 65, 208, 163, 123, 9, 255, + 232, 176, 232, 168, 46, 29, 146, 89, 84, 71, 211, 71, 214, 18, 216, 111, 253, 228, 220, 195, + 126, 201, 243, 36, 138, 141, 103, 171, 215, 97, 108, 250, 220, 252, 44, 169, 65, 158, 88, + 183, 137, 38, 37, 141, 117, 39, 239, 104, 217, 33, 125, 110, 136, 249, 221, 177, 35, 182, + 129, 117, 105, 120, 195, 238, 73, 13, 177, 235, 137, 40, 196, 38, 173, 221, 216, 27, 29, + 211, 177, 67, 50, 25, 131, 93, 186, 205, 72, 204, 168, 188, 227, 139, 9, 107, 96, 82, 186, + 247, 113, 39, 91, 97, 117, 195, 122, 39, 245, 233, 142, 83, 147, 47, 41, 25, 90, 13, 13, + 217, 152, 47, 95, 228, 103, 158, 243, 144, 175, 129, 59, 169, 77, 135, 176, 144, 228, 218, + 249, 195, 58, 70, 213, 47, 176, 33, 7, 36, 181, 26, 186, 41, 111, 164, 59, 239, 211, 57, + 165, 74, 110, 8, 202, 234, 21, 236, 134, 44, 129, 14, 225, 31, 144, 158, 136, 73, 203, 179, + 41, 187, 184, 161, 154, 180, 74, 147, 44, 49, 28, 133, 53, 70, 133, 72, 118, 247, 116, 35, + 39, 29, 194, 112, 76, 85, 205, 175, 152, 170, 144, 212, 179, 42, 22, 195, 159, 142, 4, 107, + 37, 71, 227, 140, 196, 38, 91, 245, 186, 39, 5, 85, 55, 233, 166, 126, 178, 8, 15, 10, 115, + 39, 221, 5, 212, 128, 176, 27, 215, 159, 78, 137, 114, 82, 100, 120, 208, 93, 48, 164, 209, + 147, 52, 85, 195, 124, 31, 157, 92, 162, 68, 114, 241, 226, 70, 69, 84, 61, 156, 83, 228, + 177, 150, 29, 175, 84, 170, 228, 224, 45, 180, 114, 88, 124, 144, 27, 3, 20, 31, 180, 64, + 217, 70, 117, 172, 94, 6, 197, 31, 18, 98, 38, 120, 194, 150, 72, 232, 129, 145, 228, 145, + 45, 59, 120, 227, 110, 232, 145, 127, 35, 68, 150, 41, 209, 49, 153, 118, 55, 57, 59, 124, + 57, 57, 219, 154, 156, 145, 190, 156, 180, 234, 221, 195, 80, 147, 55, 219, 175, 138, 57, + 147, 117, 68, 218, 127, 129, 65, 185, 178, 55, 232, 93, 61, 153, 228, 250, 135, 236, 24, + 111, 126, 147, 214, 97, 77, 90, 118, 234, 224, 110, 144, 212, 221, 145, 109, 147, 54, 79, + 197, 188, 249, 85, 211, 242, 28, 42, 57, 123, 189, 14, 44, 63, 117, 40, 154, 159, 217, 185, + 168, 148, 93, 210, 10, 155, 72, 7, 255, 100, 30, 142, 255, 73, 91, 169, 163, 147, 25, 42, + 165, 157, 64, 220, 13, 147, 131, 186, 55, 242, 254, 238, 232, 23, 18, 242, 220, 58, 91, 148, + 78, 87, 105, 139, 231, 166, 169, 101, 7, 79, 170, 57, 92, 38, 87, 47, 241, 116, 188, 198, + 83, 241, 167, 184, 243, 79, 98, 200, 47, 143, 160, 77, 218, 116, 74, 74, 242, 123, 42, 175, + 33, 26, 160, 164, 164, 134, 97, 238, 134, 73, 221, 147, 162, 182, 120, 70, 246, 8, 115, 7, + 133, 37, 125, 70, 151, 211, 229, 73, 241, 13, 186, 251, 38, 116, 139, 103, 235, 132, 252, + 201, 13, 39, 118, 196, 65, 244, 38, 213, 81, 89, 41, 212, 221, 16, 70, 198, 181, 220, 16, + 73, 198, 181, 238, 212, 225, 179, 32, 0, 247, 184, 54, 29, 54, 82, 66, 235, 117, 175, 219, + 113, 67, 97, 204, 235, 240, 25, 58, 42, 145, 118, 42, 77, 75, 53, 49, 183, 137, 65, 19, 130, + 138, 190, 145, 106, 59, 43, 255, 103, 145, 0, 35, 237, 92, 110, 39, 216, 241, 158, 91, 8, + 216, 105, 218, 151, 70, 160, 231, 22, 234, 77, 11, 178, 211, 240, 167, 20, 80, 51, 247, 2, + 255, 160, 75, 160, 160, 238, 102, 74, 82, 165, 218, 66, 107, 71, 102, 7, 193, 83, 25, 248, + 41, 158, 74, 32, 175, 150, 34, 149, 178, 237, 36, 2, 44, 244, 132, 243, 64, 158, 18, 65, + 127, 214, 124, 92, 179, 89, 208, 157, 154, 77, 31, 215, 132, 218, 72, 7, 61, 194, 95, 229, + 202, 134, 100, 13, 201, 26, 142, 191, 8, 122, 23, 143, 220, 108, 199, 163, 72, 243, 78, 224, + 230, 59, 188, 111, 219, 130, 78, 121, 63, 207, 91, 127, 117, 11, 172, 121, 87, 231, 213, + 246, 118, 189, 228, 98, 77, 251, 24, 182, 179, 249, 15, 225, 15, 30, 60, 122, 28, 4, 58, 39, + 150, 181, 16, 166, 134, 121, 9, 174, 149, 218, 12, 234, 5, 193, 131, 7, 15, 134, 5, 61, 121, + 35, 119, 126, 2, 42, 73, 39, 137, 86, 115, 176, 10, 182, 176, 253, 16, 207, 7, 66, 54, 68, + 67, 85, 16, 58, 138, 221, 208, 137, 252, 10, 93, 48, 175, 47, 162, 30, 43, 136, 71, 196, 53, + 208, 22, 203, 15, 194, 248, 64, 12, 103, 208, 106, 158, 199, 88, 190, 29, 98, 9, 162, 2, + 162, 41, 34, 2, 209, 25, 209, 222, 65, 107, 68, 29, 172, 179, 23, 177, 10, 219, 232, 102, + 218, 177, 195, 139, 208, 71, 29, 128, 23, 176, 47, 64, 204, 70, 68, 33, 102, 138, 118, 48, + 11, 243, 222, 147, 213, 160, 135, 73, 199, 190, 38, 98, 27, 97, 72, 207, 197, 244, 133, 114, + 21, 76, 67, 122, 14, 230, 119, 52, 101, 237, 208, 212, 111, 7, 47, 97, 126, 73, 164, 103, + 136, 118, 30, 143, 154, 4, 10, 211, 0, 233, 199, 152, 158, 11, 251, 159, 110, 120, 198, 48, + 2, 251, 31, 200, 7, 122, 110, 32, 93, 28, 219, 110, 140, 249, 99, 49, 108, 139, 97, 27, 135, + 223, 60, 54, 125, 209, 212, 177, 199, 106, 198, 56, 222, 208, 40, 159, 225, 152, 62, 13, + 209, 10, 49, 1, 209, 25, 229, 99, 234, 151, 197, 122, 193, 24, 159, 132, 180, 11, 249, 178, + 48, 244, 71, 100, 225, 0, 161, 88, 166, 38, 186, 186, 201, 24, 150, 194, 254, 235, 57, 227, + 6, 123, 220, 56, 142, 180, 49, 33, 255, 54, 79, 207, 70, 91, 195, 95, 122, 32, 79, 102, 92, + 87, 17, 7, 16, 135, 211, 241, 150, 17, 147, 158, 194, 64, 116, 138, 42, 216, 243, 103, 198, + 28, 128, 168, 65, 15, 64, 93, 148, 75, 170, 25, 151, 184, 228, 185, 103, 128, 122, 119, 18, + 199, 181, 13, 33, 208, 157, 46, 167, 193, 179, 10, 249, 172, 45, 54, 195, 28, 140, 151, 71, + 212, 180, 49, 16, 8, 95, 0, 113, 236, 14, 206, 193, 102, 24, 38, 103, 195, 7, 152, 14, 180, + 28, 226, 79, 8, 167, 215, 33, 159, 12, 135, 42, 40, 191, 14, 216, 126, 123, 68, 12, 182, + 249, 181, 173, 15, 209, 134, 7, 207, 117, 12, 131, 249, 37, 200, 135, 109, 117, 71, 244, + 193, 190, 247, 250, 228, 100, 100, 131, 241, 70, 56, 175, 29, 176, 236, 35, 179, 30, 80, + 174, 163, 17, 177, 40, 131, 57, 136, 4, 195, 31, 246, 95, 198, 200, 28, 231, 253, 30, 105, + 151, 186, 18, 203, 158, 199, 126, 154, 24, 96, 159, 193, 54, 112, 236, 222, 121, 133, 65, + 88, 255, 53, 108, 139, 216, 253, 120, 231, 193, 27, 34, 48, 191, 15, 202, 116, 29, 226, 75, + 196, 78, 195, 131, 15, 182, 158, 57, 176, 219, 90, 5, 140, 174, 242, 220, 198, 48, 59, 34, + 31, 226, 0, 98, 154, 209, 55, 68, 119, 68, 53, 83, 6, 251, 247, 195, 242, 126, 182, 190, + 162, 206, 24, 221, 52, 250, 97, 116, 67, 236, 182, 117, 181, 181, 225, 221, 59, 6, 123, 45, + 76, 112, 214, 76, 127, 172, 223, 25, 145, 23, 81, 84, 174, 129, 46, 14, 138, 98, 89, 35, + 159, 30, 70, 103, 205, 122, 241, 181, 109, 116, 203, 232, 140, 47, 180, 117, 186, 175, 173, + 247, 123, 204, 56, 141, 78, 165, 11, 103, 138, 29, 208, 210, 240, 96, 247, 139, 186, 229, + 11, 205, 186, 195, 118, 135, 154, 16, 143, 85, 134, 167, 121, 236, 56, 76, 53, 58, 107, 244, + 205, 23, 26, 185, 24, 93, 51, 235, 209, 172, 9, 39, 108, 145, 110, 172, 37, 157, 53, 82, 18, + 235, 23, 178, 117, 29, 117, 209, 23, 250, 100, 145, 22, 30, 130, 121, 216, 102, 59, 57, 13, + 245, 52, 5, 154, 241, 83, 208, 12, 29, 249, 102, 98, 40, 134, 211, 113, 124, 159, 97, 26, + 142, 135, 227, 129, 136, 149, 128, 230, 122, 7, 20, 195, 185, 108, 142, 117, 231, 102, 8, + 231, 24, 168, 227, 164, 15, 246, 53, 133, 175, 70, 89, 28, 135, 133, 182, 92, 143, 211, 80, + 126, 156, 8, 177, 218, 115, 85, 0, 217, 43, 86, 211, 225, 54, 253, 183, 48, 35, 200, 14, + 111, 158, 9, 13, 210, 231, 253, 183, 233, 255, 19, 208, 19, 98, 53, 244, 66, 250, 154, 56, + 238, 241, 224, 120, 166, 155, 53, 161, 82, 72, 89, 132, 219, 23, 98, 250, 70, 196, 72, 68, + 113, 93, 130, 204, 209, 125, 201, 22, 213, 22, 130, 240, 196, 122, 7, 17, 199, 35, 161, 186, + 136, 132, 42, 184, 233, 212, 230, 57, 241, 0, 3, 16, 142, 233, 109, 229, 139, 182, 221, 157, + 138, 237, 239, 38, 41, 48, 9, 231, 235, 93, 149, 19, 194, 216, 85, 180, 141, 216, 23, 61, + 129, 251, 3, 194, 180, 143, 97, 211, 116, 122, 244, 148, 206, 101, 212, 37, 95, 232, 211, + 215, 140, 161, 209, 25, 99, 119, 49, 20, 24, 230, 197, 117, 183, 21, 177, 13, 113, 202, 193, + 207, 136, 11, 168, 143, 141, 16, 47, 154, 189, 193, 216, 103, 123, 127, 64, 27, 141, 152, + 228, 213, 87, 207, 141, 52, 253, 220, 11, 11, 48, 156, 236, 211, 207, 12, 122, 90, 60, 131, + 126, 170, 140, 122, 153, 49, 52, 123, 139, 177, 239, 246, 222, 130, 235, 20, 249, 152, 228, + 27, 191, 177, 143, 198, 198, 25, 27, 105, 236, 156, 217, 251, 124, 229, 51, 134, 233, 234, + 207, 66, 219, 241, 131, 109, 135, 15, 64, 39, 103, 93, 23, 67, 148, 69, 148, 193, 54, 182, + 59, 118, 100, 27, 219, 226, 185, 131, 107, 244, 138, 60, 234, 217, 166, 106, 123, 182, 177, + 125, 158, 109, 114, 174, 103, 153, 234, 235, 217, 35, 55, 123, 22, 224, 184, 139, 165, 237, + 169, 59, 188, 182, 204, 172, 39, 223, 94, 106, 228, 100, 246, 69, 223, 62, 42, 34, 160, 151, + 99, 207, 230, 217, 101, 177, 127, 123, 31, 109, 103, 219, 1, 144, 67, 113, 253, 245, 129, + 30, 216, 238, 119, 102, 95, 53, 235, 144, 45, 192, 117, 135, 242, 196, 246, 70, 241, 21, + 208, 143, 95, 128, 169, 200, 123, 32, 91, 239, 77, 231, 173, 161, 153, 177, 137, 124, 48, + 210, 152, 142, 54, 221, 228, 187, 216, 84, 59, 191, 21, 191, 13, 131, 121, 49, 164, 87, 96, + 56, 31, 178, 74, 5, 131, 229, 87, 166, 142, 231, 128, 157, 118, 209, 155, 103, 210, 68, 39, + 120, 15, 245, 174, 12, 31, 15, 31, 137, 13, 208, 193, 204, 149, 25, 7, 173, 228, 217, 103, + 230, 30, 215, 124, 62, 61, 18, 22, 42, 64, 29, 190, 0, 243, 248, 3, 28, 51, 30, 204, 109, + 25, 236, 128, 249, 182, 62, 153, 186, 155, 60, 15, 204, 248, 84, 13, 200, 45, 24, 142, 207, + 148, 65, 152, 58, 98, 33, 184, 29, 121, 204, 182, 101, 177, 195, 150, 209, 44, 91, 135, 81, + 22, 166, 77, 121, 204, 246, 55, 64, 156, 196, 242, 239, 195, 91, 218, 15, 230, 233, 34, 104, + 159, 238, 66, 62, 133, 182, 196, 238, 107, 3, 180, 215, 145, 182, 220, 185, 189, 95, 255, + 129, 235, 35, 5, 117, 172, 45, 140, 19, 57, 60, 127, 217, 250, 191, 198, 227, 97, 15, 112, + 13, 165, 224, 250, 50, 64, 223, 83, 228, 132, 188, 34, 5, 230, 227, 90, 26, 103, 203, 199, + 27, 78, 48, 235, 135, 165, 64, 78, 163, 35, 56, 190, 54, 182, 63, 145, 130, 58, 190, 20, 18, + 228, 106, 152, 40, 119, 160, 222, 29, 199, 189, 224, 56, 206, 91, 10, 142, 165, 47, 84, 69, + 122, 26, 95, 237, 121, 136, 101, 27, 96, 27, 96, 250, 198, 244, 150, 182, 127, 98, 246, 169, + 72, 207, 97, 179, 94, 212, 14, 200, 163, 34, 177, 127, 243, 49, 23, 242, 96, 251, 127, 216, + 47, 187, 132, 252, 206, 128, 113, 104, 75, 234, 232, 20, 248, 80, 186, 161, 44, 110, 143, + 198, 105, 44, 132, 40, 231, 133, 29, 31, 129, 24, 142, 152, 232, 133, 157, 22, 228, 13, 73, + 8, 182, 97, 254, 82, 234, 68, 26, 3, 123, 144, 11, 10, 224, 33, 102, 45, 240, 149, 184, 246, + 230, 67, 29, 182, 28, 252, 120, 47, 244, 31, 174, 193, 40, 90, 198, 60, 30, 161, 222, 221, + 192, 61, 131, 193, 91, 38, 206, 75, 66, 81, 118, 3, 154, 176, 251, 246, 254, 51, 86, 248, + 65, 21, 187, 92, 46, 220, 199, 175, 64, 11, 222, 17, 235, 239, 128, 104, 190, 17, 162, 153, + 7, 233, 60, 136, 89, 168, 143, 88, 79, 108, 129, 78, 162, 39, 250, 89, 93, 177, 29, 7, 180, + 50, 214, 177, 160, 133, 156, 128, 116, 25, 207, 26, 83, 206, 238, 227, 190, 39, 151, 1, 31, + 10, 229, 237, 122, 233, 96, 243, 234, 131, 225, 121, 73, 58, 158, 103, 225, 168, 222, 70, + 125, 48, 252, 34, 157, 158, 95, 195, 107, 26, 159, 14, 143, 207, 226, 207, 30, 167, 105, 23, + 235, 217, 101, 78, 67, 29, 148, 211, 25, 68, 184, 55, 76, 109, 73, 39, 193, 106, 196, 98, + 122, 10, 253, 240, 29, 48, 156, 204, 246, 152, 191, 94, 219, 48, 3, 26, 165, 143, 243, 225, + 100, 28, 162, 5, 130, 243, 225, 176, 8, 195, 82, 24, 94, 67, 28, 71, 44, 48, 207, 110, 136, + 223, 120, 37, 24, 131, 109, 239, 196, 112, 147, 57, 23, 24, 208, 47, 208, 118, 97, 136, 249, + 75, 17, 159, 35, 206, 250, 242, 210, 195, 244, 243, 172, 244, 244, 224, 151, 61, 91, 211, + 199, 69, 121, 168, 102, 64, 75, 162, 77, 47, 249, 116, 158, 93, 126, 17, 84, 228, 175, 163, + 29, 46, 235, 217, 106, 192, 6, 131, 159, 129, 204, 2, 197, 148, 134, 98, 244, 2, 166, 183, + 195, 122, 25, 226, 162, 40, 188, 199, 227, 176, 108, 43, 96, 255, 198, 211, 63, 1, 127, 202, + 166, 147, 99, 100, 250, 49, 250, 230, 3, 195, 92, 255, 1, 206, 164, 11, 221, 38, 196, 245, + 85, 202, 236, 207, 255, 27, 254, 254, 39, 192, 249, 29, 129, 120, 213, 150, 255, 98, 40, + 109, 235, 208, 21, 244, 201, 149, 231, 107, 178, 29, 186, 146, 243, 158, 7, 104, 207, 165, + 129, 55, 14, 249, 108, 121, 46, 130, 172, 190, 121, 194, 244, 113, 118, 122, 134, 249, 67, + 93, 169, 108, 100, 158, 49, 29, 233, 154, 6, 190, 120, 198, 121, 253, 183, 56, 182, 27, 155, + 30, 62, 61, 240, 65, 149, 135, 72, 3, 126, 22, 203, 35, 50, 198, 113, 63, 136, 52, 144, 70, + 199, 74, 254, 61, 158, 214, 239, 243, 208, 6, 42, 162, 156, 26, 242, 54, 200, 203, 133, 191, + 199, 101, 16, 148, 49, 160, 241, 24, 159, 131, 249, 151, 161, 136, 65, 90, 188, 13, 20, 51, + 48, 101, 13, 80, 182, 97, 6, 40, 235, 173, 6, 244, 2, 132, 24, 176, 86, 152, 215, 202, 46, + 95, 203, 32, 157, 92, 59, 24, 185, 178, 29, 166, 174, 93, 223, 158, 31, 159, 158, 103, 156, + 31, 172, 11, 124, 23, 218, 163, 95, 208, 103, 110, 3, 249, 50, 134, 233, 215, 108, 198, 117, + 155, 49, 205, 103, 75, 158, 85, 38, 195, 218, 40, 251, 188, 54, 255, 255, 4, 92, 59, 251, + 16, 187, 17, 223, 254, 95, 237, 7, 245, 156, 0, 234, 42, 34, 8, 208, 167, 59, 138, 254, 70, + 50, 250, 170, 31, 226, 25, 115, 63, 76, 2, 120, 60, 14, 224, 225, 78, 128, 71, 221, 208, 14, + 225, 30, 252, 104, 45, 166, 181, 69, 58, 2, 195, 63, 16, 121, 48, 45, 22, 67, 220, 141, 30, + 158, 71, 58, 30, 243, 142, 33, 14, 32, 22, 243, 252, 240, 186, 227, 87, 230, 197, 120, 3, + 111, 221, 199, 203, 156, 246, 194, 189, 245, 77, 189, 7, 232, 237, 60, 172, 236, 173, 255, + 112, 44, 98, 62, 210, 7, 17, 168, 101, 15, 191, 198, 112, 38, 134, 119, 177, 124, 50, 214, + 235, 136, 33, 250, 0, 143, 70, 97, 88, 17, 227, 45, 16, 168, 15, 143, 142, 96, 188, 22, 2, + 247, 253, 71, 213, 17, 87, 17, 200, 231, 35, 116, 99, 30, 149, 193, 250, 139, 16, 131, 141, + 63, 242, 140, 115, 232, 255, 217, 240, 57, 231, 143, 255, 52, 244, 222, 1, 192, 43, 182, + 207, 137, 252, 102, 60, 67, 252, 199, 161, 111, 62, 255, 37, 204, 120, 214, 240, 205, 255, + 191, 133, 190, 179, 196, 223, 66, 71, 14, 232, 243, 237, 51, 72, 119, 246, 249, 199, 51, + 142, 47, 196, 249, 252, 203, 193, 29, 196, 239, 124, 188, 231, 49, 250, 148, 202, 246, 163, + 209, 151, 181, 125, 110, 227, 63, 58, 161, 237, 111, 31, 183, 253, 73, 226, 220, 41, 218, + 161, 241, 157, 141, 255, 106, 124, 103, 227, 191, 98, 184, 192, 62, 231, 29, 66, 126, 6, + 194, 203, 230, 156, 111, 243, 229, 219, 71, 210, 217, 86, 90, 18, 98, 16, 185, 28, 160, 221, + 131, 122, 88, 230, 123, 228, 231, 38, 218, 158, 64, 220, 95, 239, 162, 111, 57, 213, 192, + 185, 232, 236, 234, 133, 103, 63, 238, 93, 129, 104, 115, 191, 36, 219, 61, 119, 49, 60, + 128, 241, 130, 184, 151, 89, 190, 61, 205, 103, 91, 255, 102, 99, 255, 190, 167, 253, 95, + 141, 255, 183, 123, 228, 255, 96, 79, 109, 238, 32, 54, 3, 124, 233, 189, 28, 100, 204, 47, + 227, 32, 212, 32, 227, 94, 252, 223, 226, 223, 246, 238, 255, 241, 94, 254, 156, 61, 58, + 253, 62, 253, 191, 141, 251, 246, 121, 31, 172, 90, 80, 222, 64, 69, 34, 223, 145, 127, 247, + 75, 51, 250, 1, 255, 22, 255, 55, 63, 247, 191, 141, 103, 244, 59, 210, 197, 55, 24, 252, + 67, 190, 29, 207, 232, 151, 248, 226, 25, 241, 183, 252, 191, 235, 158, 215, 159, 201, 135, + 235, 205, 135, 12, 235, 238, 191, 5, 174, 211, 186, 60, 206, 243, 163, 111, 189, 250, 120, + 200, 184, 142, 211, 214, 155, 19, 151, 35, 160, 62, 162, 129, 47, 36, 43, 160, 40, 218, 145, + 98, 136, 137, 206, 185, 43, 12, 105, 220, 3, 61, 195, 204, 254, 166, 31, 65, 121, 189, 22, + 202, 99, 252, 99, 251, 115, 2, 219, 230, 120, 58, 122, 247, 62, 207, 68, 178, 25, 125, 233, + 123, 246, 167, 20, 99, 48, 174, 248, 1, 187, 108, 7, 7, 29, 255, 77, 159, 51, 234, 173, 241, + 207, 109, 255, 16, 101, 102, 243, 62, 21, 231, 226, 14, 148, 65, 212, 64, 100, 67, 108, 64, + 244, 79, 155, 107, 60, 67, 98, 223, 123, 24, 238, 188, 230, 156, 203, 126, 241, 220, 197, + 182, 238, 62, 207, 23, 124, 94, 136, 231, 188, 4, 115, 222, 195, 120, 32, 198, 3, 209, 22, + 231, 151, 27, 160, 144, 185, 215, 176, 207, 223, 59, 240, 252, 122, 17, 237, 226, 110, 136, + 125, 114, 199, 231, 121, 44, 55, 217, 101, 186, 216, 119, 203, 167, 160, 25, 218, 249, 94, + 120, 38, 142, 227, 23, 61, 107, 236, 55, 156, 60, 120, 212, 72, 240, 189, 163, 216, 119, + 107, 115, 157, 183, 148, 252, 230, 110, 72, 253, 110, 222, 126, 60, 107, 157, 251, 185, 118, + 42, 15, 238, 131, 183, 161, 173, 172, 3, 133, 236, 119, 8, 239, 93, 124, 52, 150, 237, 105, + 238, 166, 232, 207, 230, 51, 36, 251, 14, 57, 143, 19, 150, 50, 247, 83, 102, 191, 146, 197, + 236, 61, 38, 75, 186, 123, 228, 234, 136, 142, 188, 50, 20, 71, 84, 115, 222, 169, 58, 179, + 7, 216, 246, 18, 187, 238, 4, 251, 77, 230, 33, 36, 243, 181, 208, 206, 188, 133, 249, 173, + 130, 153, 214, 110, 152, 169, 113, 60, 86, 59, 88, 168, 10, 192, 66, 158, 0, 51, 252, 170, + 195, 28, 109, 238, 144, 11, 192, 52, 179, 95, 249, 246, 85, 148, 125, 234, 51, 238, 254, + 204, 93, 102, 225, 116, 119, 154, 246, 152, 51, 250, 4, 54, 127, 149, 209, 174, 86, 243, 44, + 73, 223, 175, 175, 158, 174, 135, 178, 105, 229, 125, 27, 114, 238, 217, 255, 209, 183, 193, + 118, 170, 32, 74, 33, 238, 32, 46, 63, 251, 190, 211, 115, 192, 185, 247, 28, 233, 236, 241, + 175, 166, 237, 249, 25, 239, 233, 23, 65, 105, 94, 204, 238, 207, 123, 39, 139, 123, 182, + 240, 199, 118, 252, 109, 222, 109, 25, 103, 228, 197, 215, 23, 202, 229, 241, 243, 124, 33, + 159, 111, 226, 220, 81, 153, 119, 182, 81, 206, 27, 92, 69, 68, 14, 39, 173, 141, 237, 23, + 212, 129, 151, 113, 190, 154, 155, 59, 51, 49, 22, 242, 240, 36, 104, 69, 87, 121, 118, 165, + 149, 65, 159, 201, 190, 99, 60, 104, 235, 108, 146, 225, 147, 123, 223, 237, 242, 59, 58, + 55, 131, 174, 192, 53, 250, 35, 228, 176, 239, 36, 143, 217, 111, 120, 99, 28, 12, 71, 61, + 93, 102, 191, 153, 165, 216, 119, 97, 173, 228, 106, 132, 185, 119, 244, 64, 43, 148, 213, + 229, 39, 192, 181, 149, 6, 207, 101, 190, 26, 251, 50, 176, 223, 253, 60, 187, 28, 204, 231, + 45, 109, 253, 204, 235, 232, 102, 126, 126, 31, 26, 243, 21, 182, 206, 100, 115, 222, 4, 3, + 249, 52, 132, 145, 93, 60, 234, 104, 101, 7, 3, 205, 219, 155, 253, 190, 103, 135, 182, 172, + 82, 80, 238, 73, 208, 220, 30, 163, 185, 155, 91, 141, 122, 139, 242, 97, 139, 236, 251, + 193, 206, 190, 178, 186, 54, 180, 81, 227, 81, 95, 215, 163, 238, 140, 194, 126, 27, 66, + 176, 156, 131, 184, 3, 121, 100, 37, 244, 15, 147, 112, 220, 13, 176, 238, 40, 24, 71, 255, + 128, 242, 6, 100, 178, 231, 2, 229, 72, 35, 35, 6, 12, 160, 60, 71, 207, 28, 109, 15, 152, + 183, 95, 243, 38, 236, 188, 171, 13, 66, 204, 196, 241, 152, 183, 173, 219, 166, 156, 93, + 214, 251, 150, 107, 80, 220, 128, 174, 34, 33, 206, 59, 161, 143, 206, 238, 165, 237, 180, + 125, 14, 110, 59, 88, 150, 14, 88, 206, 243, 51, 226, 33, 189, 97, 110, 14, 177, 125, 138, + 124, 253, 230, 229, 137, 5, 161, 174, 102, 0, 214, 233, 225, 128, 33, 10, 154, 55, 64, 222, + 30, 101, 245, 52, 234, 101, 4, 214, 53, 97, 153, 140, 192, 116, 19, 134, 103, 132, 147, 158, + 47, 35, 48, 221, 132, 117, 51, 2, 211, 235, 62, 131, 143, 231, 149, 123, 30, 31, 207, 75, + 143, 200, 8, 76, 143, 248, 63, 192, 199, 243, 218, 13, 203, 8, 76, 15, 251, 7, 254, 154, + 100, 4, 166, 55, 249, 47, 248, 120, 158, 156, 11, 103, 4, 166, 23, 254, 7, 62, 154, 101, 4, + 166, 55, 203, 200, 7, 218, 167, 245, 136, 47, 241, 140, 250, 177, 217, 63, 113, 175, 126, + 29, 67, 243, 201, 224, 11, 24, 198, 33, 214, 33, 141, 231, 94, 79, 47, 39, 190, 199, 41, + 215, 251, 9, 204, 143, 39, 216, 65, 125, 132, 57, 75, 227, 126, 236, 185, 142, 88, 128, 104, + 249, 4, 166, 47, 79, 78, 231, 179, 75, 167, 31, 79, 95, 164, 111, 97, 248, 162, 183, 47, 83, + 55, 117, 155, 183, 111, 27, 78, 159, 169, 203, 28, 94, 63, 69, 124, 150, 46, 110, 120, 199, + 190, 83, 47, 120, 251, 179, 251, 70, 62, 82, 183, 122, 253, 24, 207, 60, 167, 124, 13, 167, + 223, 229, 94, 190, 83, 115, 99, 152, 232, 45, 111, 242, 205, 24, 237, 122, 203, 159, 192, + 131, 203, 207, 131, 118, 252, 177, 25, 91, 235, 39, 48, 188, 167, 226, 217, 223, 243, 129, + 215, 103, 74, 221, 226, 200, 114, 137, 183, 223, 199, 120, 78, 244, 228, 69, 148, 114, 242, + 199, 61, 177, 11, 176, 199, 126, 43, 50, 111, 59, 184, 87, 107, 10, 96, 66, 99, 107, 109, + 155, 27, 11, 57, 210, 237, 85, 190, 55, 235, 247, 140, 189, 147, 200, 13, 175, 9, 5, 37, + 250, 112, 216, 134, 159, 241, 27, 140, 13, 183, 207, 147, 104, 247, 237, 243, 228, 15, 246, + 187, 122, 180, 141, 194, 184, 143, 28, 195, 248, 207, 216, 198, 98, 212, 195, 44, 104, 55, + 71, 67, 81, 211, 135, 253, 46, 51, 208, 124, 207, 226, 89, 98, 124, 14, 118, 12, 90, 26, + 216, 190, 198, 14, 123, 175, 174, 99, 246, 3, 191, 23, 160, 163, 172, 142, 60, 221, 129, + 124, 216, 126, 126, 117, 16, 38, 202, 174, 230, 251, 18, 123, 207, 115, 169, 222, 24, 127, + 21, 253, 14, 243, 70, 166, 96, 176, 94, 4, 19, 213, 73, 204, 103, 208, 16, 247, 171, 122, + 190, 116, 223, 217, 86, 142, 241, 120, 68, 73, 112, 249, 66, 87, 117, 232, 104, 125, 142, + 233, 163, 209, 151, 202, 7, 77, 76, 127, 170, 18, 152, 59, 157, 42, 190, 190, 211, 228, 176, + 198, 156, 115, 237, 121, 55, 242, 95, 133, 88, 11, 240, 168, 4, 226, 101, 155, 103, 228, 23, + 195, 172, 24, 230, 247, 125, 55, 96, 203, 100, 47, 158, 201, 25, 148, 180, 223, 156, 46, 96, + 62, 129, 0, 153, 27, 215, 213, 35, 40, 170, 44, 244, 47, 62, 129, 113, 22, 133, 185, 170, + 155, 125, 118, 143, 226, 239, 63, 245, 189, 64, 41, 243, 254, 36, 191, 135, 146, 226, 29, + 200, 233, 59, 187, 203, 83, 40, 215, 254, 232, 75, 59, 161, 185, 27, 241, 221, 7, 136, 133, + 48, 143, 239, 193, 182, 22, 130, 219, 126, 215, 114, 238, 3, 210, 66, 95, 27, 230, 189, 45, + 5, 230, 155, 111, 37, 50, 250, 53, 62, 63, 42, 205, 191, 113, 238, 8, 210, 250, 112, 198, + 99, 66, 179, 119, 166, 27, 191, 29, 166, 243, 55, 188, 119, 10, 27, 160, 189, 121, 27, 51, + 239, 120, 182, 223, 145, 33, 244, 241, 100, 222, 241, 204, 91, 26, 182, 211, 213, 246, 191, + 106, 65, 87, 53, 12, 247, 214, 181, 208, 80, 238, 130, 122, 162, 30, 250, 233, 47, 65, 61, + 157, 15, 220, 106, 41, 228, 53, 254, 153, 234, 133, 186, 105, 252, 53, 115, 135, 227, 134, + 82, 98, 62, 224, 26, 247, 212, 195, 249, 217, 139, 225, 16, 68, 178, 179, 190, 219, 57, 107, + 238, 7, 196, 26, 199, 118, 180, 242, 166, 219, 107, 19, 211, 30, 207, 115, 210, 251, 32, + 222, 68, 196, 122, 243, 77, 158, 103, 132, 151, 126, 252, 187, 183, 125, 59, 239, 77, 111, + 249, 199, 198, 86, 153, 55, 56, 106, 238, 104, 28, 60, 246, 222, 219, 216, 107, 246, 190, + 161, 211, 201, 121, 182, 237, 211, 255, 61, 244, 189, 221, 207, 116, 252, 214, 127, 14, 255, + 195, 59, 52, 179, 134, 205, 55, 85, 207, 120, 227, 207, 24, 154, 247, 225, 26, 190, 56, 174, + 207, 239, 189, 48, 190, 156, 231, 160, 207, 143, 206, 24, 122, 223, 251, 109, 31, 214, 188, + 251, 167, 56, 225, 79, 78, 184, 223, 232, 154, 241, 245, 50, 134, 25, 191, 95, 121, 222, + 247, 44, 207, 247, 99, 157, 117, 230, 11, 159, 254, 238, 37, 99, 216, 49, 237, 187, 156, + 127, 9, 121, 186, 239, 100, 158, 21, 254, 167, 119, 119, 246, 123, 61, 218, 41, 95, 248, + 247, 239, 15, 156, 59, 185, 180, 208, 241, 203, 51, 126, 135, 243, 36, 156, 142, 126, 218, + 89, 199, 143, 205, 226, 189, 87, 132, 73, 246, 183, 57, 255, 128, 180, 111, 184, 110, 123, + 110, 201, 219, 233, 67, 180, 145, 8, 243, 77, 207, 179, 32, 11, 97, 185, 66, 0, 106, 157, + 231, 150, 90, 247, 36, 180, 191, 49, 248, 7, 200, 41, 88, 111, 10, 238, 47, 193, 158, 91, + 58, 56, 125, 8, 57, 12, 144, 231, 169, 94, 120, 62, 65, 236, 66, 156, 69, 92, 71, 108, 66, + 236, 96, 196, 115, 203, 254, 75, 42, 211, 60, 183, 208, 87, 79, 23, 226, 222, 49, 205, 62, + 159, 60, 235, 251, 186, 86, 114, 33, 246, 187, 16, 251, 105, 139, 253, 161, 21, 87, 123, + 145, 95, 180, 2, 246, 55, 13, 255, 0, 244, 217, 65, 165, 98, 189, 30, 246, 24, 111, 155, + 189, 240, 31, 113, 16, 251, 65, 111, 65, 191, 139, 253, 188, 139, 117, 30, 96, 63, 15, 236, + 240, 182, 129, 79, 238, 62, 57, 250, 228, 130, 99, 251, 213, 158, 47, 31, 207, 190, 254, + 157, 118, 255, 183, 243, 136, 109, 78, 252, 39, 60, 127, 94, 60, 183, 13, 254, 79, 141, 251, + 159, 120, 23, 187, 61, 71, 16, 63, 25, 26, 215, 210, 25, 231, 92, 114, 198, 251, 237, 30, + 182, 241, 52, 207, 147, 109, 190, 47, 227, 24, 17, 170, 189, 23, 246, 183, 52, 171, 60, 183, + 28, 220, 70, 185, 94, 66, 156, 54, 54, 202, 193, 87, 206, 55, 75, 87, 140, 110, 49, 212, 1, + 3, 236, 199, 1, 246, 147, 81, 15, 110, 59, 112, 226, 222, 239, 111, 60, 143, 229, 101, 207, + 73, 245, 146, 231, 39, 179, 14, 204, 183, 63, 6, 198, 151, 122, 150, 124, 84, 140, 231, 8, + 234, 224, 79, 106, 54, 134, 7, 177, 78, 31, 251, 140, 100, 124, 47, 243, 254, 108, 238, 110, + 204, 55, 182, 81, 142, 237, 11, 177, 14, 224, 254, 53, 201, 190, 147, 113, 155, 189, 94, 39, + 163, 110, 3, 218, 159, 157, 208, 235, 105, 159, 207, 211, 218, 177, 193, 230, 59, 88, 243, + 77, 81, 54, 185, 9, 218, 176, 84, 104, 143, 231, 229, 105, 220, 31, 109, 210, 9, 207, 101, + 3, 236, 107, 180, 131, 189, 14, 166, 121, 125, 63, 207, 55, 136, 175, 157, 111, 36, 77, 250, + 202, 244, 96, 165, 161, 144, 1, 210, 213, 177, 63, 236, 197, 179, 208, 241, 183, 141, 31, + 155, 224, 69, 234, 175, 222, 244, 39, 124, 165, 125, 35, 137, 158, 48, 158, 117, 1, 199, 22, + 133, 243, 29, 104, 251, 47, 115, 145, 183, 185, 120, 6, 39, 48, 209, 248, 11, 246, 30, 17, + 136, 231, 241, 193, 48, 25, 125, 202, 44, 246, 55, 55, 206, 185, 223, 190, 123, 248, 3, 67, + 47, 66, 80, 46, 109, 248, 116, 251, 155, 209, 214, 54, 174, 98, 57, 243, 93, 13, 194, 254, + 38, 199, 251, 157, 82, 75, 89, 24, 90, 242, 243, 246, 247, 53, 222, 111, 126, 205, 183, 190, + 231, 16, 183, 176, 238, 117, 244, 57, 219, 62, 249, 182, 198, 180, 97, 252, 65, 227, 23, + 177, 139, 40, 71, 180, 41, 108, 9, 158, 113, 209, 115, 102, 31, 98, 216, 214, 11, 206, 48, + 124, 19, 207, 232, 9, 232, 163, 158, 69, 58, 25, 81, 8, 211, 67, 49, 28, 130, 120, 29, 233, + 8, 12, 135, 33, 58, 35, 214, 56, 233, 111, 64, 121, 145, 3, 219, 18, 72, 27, 224, 89, 154, + 127, 226, 13, 153, 115, 174, 182, 207, 214, 135, 188, 96, 110, 236, 3, 211, 233, 62, 44, 55, + 26, 42, 210, 91, 152, 214, 8, 225, 135, 104, 236, 192, 148, 217, 142, 62, 158, 201, 171, + 107, 151, 43, 79, 175, 98, 31, 47, 131, 31, 203, 239, 208, 245, 48, 239, 20, 66, 123, 207, + 239, 246, 189, 194, 45, 39, 207, 87, 166, 238, 147, 50, 226, 6, 52, 244, 155, 131, 62, 85, + 118, 196, 120, 207, 86, 81, 199, 179, 149, 92, 133, 66, 188, 141, 249, 126, 200, 19, 128, + 192, 153, 76, 53, 231, 161, 79, 29, 63, 10, 87, 171, 167, 57, 98, 145, 185, 127, 253, 219, + 119, 1, 190, 119, 114, 39, 20, 123, 160, 154, 152, 14, 229, 101, 46, 24, 37, 242, 66, 19, + 60, 11, 212, 145, 129, 184, 15, 119, 128, 162, 104, 127, 204, 247, 215, 109, 189, 103, 162, + 84, 115, 182, 235, 109, 190, 39, 54, 223, 18, 179, 227, 222, 123, 111, 231, 126, 220, 166, + 229, 97, 40, 109, 141, 198, 115, 47, 122, 89, 206, 55, 199, 118, 72, 87, 123, 255, 159, 115, + 164, 173, 189, 119, 218, 223, 210, 19, 227, 189, 173, 246, 122, 100, 246, 247, 211, 184, + 214, 124, 126, 174, 234, 14, 147, 212, 7, 232, 75, 126, 0, 157, 29, 91, 20, 229, 220, 117, + 101, 53, 251, 58, 210, 213, 236, 59, 161, 98, 80, 215, 251, 13, 149, 167, 174, 215, 199, + 247, 152, 245, 208, 26, 109, 67, 218, 221, 171, 9, 205, 55, 109, 70, 183, 28, 95, 208, 148, + 95, 195, 114, 153, 111, 174, 60, 85, 204, 91, 5, 123, 193, 124, 175, 101, 215, 109, 132, + 104, 140, 24, 238, 200, 240, 37, 108, 119, 81, 186, 247, 167, 79, 12, 50, 126, 179, 241, + 255, 250, 125, 43, 227, 251, 212, 243, 222, 139, 254, 237, 219, 140, 127, 251, 86, 227, 111, + 241, 255, 242, 77, 37, 227, 183, 27, 255, 246, 45, 199, 191, 197, 255, 246, 6, 243, 47, 239, + 101, 252, 162, 103, 167, 241, 161, 141, 29, 85, 5, 13, 237, 57, 142, 248, 134, 33, 109, 128, + 186, 236, 193, 188, 83, 168, 75, 33, 88, 238, 29, 122, 19, 215, 236, 25, 220, 31, 30, 66, + 176, 115, 39, 154, 31, 211, 115, 160, 253, 202, 193, 239, 219, 250, 55, 214, 219, 30, 250, + 231, 225, 246, 157, 171, 185, 155, 143, 79, 247, 247, 28, 38, 160, 239, 218, 203, 248, 165, + 108, 171, 103, 151, 177, 115, 246, 119, 136, 96, 223, 89, 54, 78, 119, 87, 91, 39, 237, 158, + 182, 22, 180, 180, 109, 45, 218, 84, 231, 174, 118, 146, 57, 167, 217, 54, 200, 207, 134, + 52, 118, 198, 216, 32, 114, 19, 252, 16, 96, 236, 140, 125, 47, 153, 136, 241, 16, 175, 93, + 50, 52, 29, 140, 171, 97, 50, 210, 45, 48, 191, 177, 215, 78, 25, 27, 196, 186, 97, 157, + 110, 152, 246, 192, 107, 179, 108, 155, 105, 108, 155, 89, 135, 104, 175, 88, 36, 162, 43, + 198, 175, 57, 64, 27, 68, 127, 193, 16, 193, 190, 240, 242, 65, 175, 152, 183, 154, 212, + 233, 94, 152, 61, 39, 245, 125, 179, 55, 217, 182, 147, 122, 219, 181, 239, 33, 145, 118, + 254, 62, 138, 217, 251, 204, 119, 235, 81, 88, 174, 206, 191, 249, 75, 142, 127, 233, 243, + 49, 119, 101, 140, 255, 155, 95, 136, 101, 246, 166, 71, 198, 252, 180, 55, 156, 115, 230, + 91, 127, 244, 23, 118, 67, 46, 239, 223, 121, 113, 206, 93, 206, 183, 209, 178, 130, 125, + 94, 177, 237, 14, 206, 101, 254, 116, 247, 239, 21, 157, 59, 231, 138, 246, 124, 141, 135, + 172, 104, 83, 242, 255, 237, 92, 192, 32, 206, 204, 173, 239, 76, 143, 114, 250, 214, 249, + 182, 196, 23, 118, 243, 194, 222, 167, 141, 28, 127, 181, 109, 37, 129, 87, 236, 62, 208, + 198, 57, 122, 39, 109, 191, 198, 156, 239, 204, 217, 97, 149, 247, 45, 194, 57, 251, 249, + 206, 114, 185, 28, 221, 42, 138, 99, 155, 141, 251, 224, 56, 243, 157, 191, 179, 223, 111, + 55, 239, 45, 14, 62, 50, 48, 124, 59, 111, 254, 253, 50, 145, 137, 76, 100, 34, 19, 153, + 200, 68, 38, 50, 145, 137, 76, 100, 34, 19, 153, 200, 68, 38, 50, 145, 137, 76, 100, 34, 19, + 153, 200, 68, 38, 50, 145, 137, 76, 100, 34, 19, 153, 200, 68, 38, 50, 145, 137, 76, 100, + 34, 19, 153, 200, 68, 38, 50, 145, 137, 76, 100, 34, 19, 153, 200, 68, 38, 50, 145, 137, 76, + 100, 226, 255, 25, 136, 249, 23, 155, 224, 22, 212, 132, 41, 32, 129, 66, 16, 148, 49, 127, + 115, 85, 62, 160, 95, 129, 176, 255, 250, 105, 107, 118, 13, 236, 255, 81, 22, 254, 244, + 177, 127, 27, 154, 128, 159, 29, 51, 52, 5, 13, 137, 14, 205, 160, 3, 188, 233, 208, 230, + 159, 205, 61, 230, 208, 2, 242, 192, 21, 135, 150, 144, 135, 248, 218, 81, 176, 149, 228, + 113, 104, 13, 101, 201, 247, 14, 109, 65, 18, 165, 14, 29, 64, 87, 209, 137, 224, 251, 119, + 166, 42, 137, 202, 14, 77, 64, 136, 190, 14, 77, 129, 139, 120, 135, 54, 255, 246, 66, 162, + 67, 115, 240, 19, 139, 29, 90, 128, 191, 88, 229, 208, 18, 233, 79, 28, 90, 193, 43, 226, + 43, 135, 214, 144, 71, 6, 59, 180, 5, 13, 100, 21, 135, 14, 32, 109, 229, 155, 216, 50, 225, + 12, 251, 202, 162, 142, 56, 52, 135, 124, 234, 156, 77, 27, 105, 249, 169, 191, 28, 154, 67, + 46, 205, 108, 218, 72, 85, 234, 188, 14, 205, 33, 155, 14, 182, 105, 101, 228, 166, 203, 57, + 52, 202, 74, 87, 179, 105, 141, 233, 254, 186, 169, 67, 115, 200, 163, 59, 218, 180, 101, + 228, 175, 95, 115, 104, 148, 191, 62, 237, 208, 166, 157, 75, 14, 141, 242, 215, 55, 28, 26, + 219, 180, 26, 56, 52, 202, 223, 242, 181, 131, 242, 183, 124, 237, 160, 252, 173, 241, 14, + 141, 242, 247, 171, 231, 208, 40, 127, 191, 129, 14, 141, 242, 247, 123, 108, 211, 126, 102, + 236, 1, 203, 29, 26, 199, 30, 240, 177, 77, 187, 48, 61, 91, 192, 33, 135, 230, 80, 40, 224, + 103, 155, 246, 55, 188, 5, 120, 28, 26, 249, 201, 162, 108, 58, 139, 209, 180, 44, 249, 29, + 154, 67, 129, 44, 37, 108, 58, 200, 180, 147, 229, 69, 135, 198, 118, 178, 120, 121, 206, + 110, 100, 152, 101, 136, 67, 163, 12, 179, 188, 101, 211, 57, 12, 63, 89, 166, 56, 52, 242, + 147, 101, 161, 77, 231, 196, 244, 28, 89, 62, 117, 104, 14, 238, 44, 251, 109, 58, 151, 93, + 62, 197, 161, 77, 121, 239, 124, 229, 53, 229, 3, 179, 59, 52, 150, 15, 44, 98, 211, 249, + 205, 156, 6, 190, 232, 208, 56, 167, 129, 45, 109, 186, 160, 225, 39, 240, 85, 135, 70, 126, + 2, 251, 219, 116, 176, 93, 126, 132, 67, 155, 242, 94, 217, 22, 54, 115, 26, 248, 190, 67, + 227, 156, 6, 174, 182, 233, 226, 70, 62, 129, 95, 59, 52, 202, 39, 208, 203, 103, 41, 187, + 157, 115, 14, 109, 218, 185, 106, 104, 109, 203, 63, 208, 227, 208, 200, 127, 80, 128, 77, + 219, 227, 10, 42, 226, 208, 38, 189, 146, 161, 253, 237, 242, 65, 205, 29, 218, 164, 191, + 98, 211, 246, 188, 4, 13, 113, 104, 236, 55, 104, 4, 172, 4, 55, 148, 135, 178, 248, 167, + 50, 82, 109, 160, 55, 196, 96, 216, 20, 226, 96, 0, 34, 17, 134, 66, 188, 157, 82, 15, 99, + 9, 72, 155, 223, 81, 152, 30, 107, 151, 40, 141, 57, 117, 208, 158, 244, 195, 176, 21, 166, + 189, 138, 245, 19, 97, 160, 29, 139, 193, 48, 6, 75, 15, 198, 223, 209, 246, 63, 43, 157, + 128, 37, 162, 176, 108, 93, 172, 219, 15, 211, 50, 246, 82, 61, 93, 25, 119, 90, 169, 234, + 208, 206, 110, 103, 160, 211, 167, 27, 42, 97, 107, 101, 161, 28, 82, 69, 177, 141, 88, 232, + 137, 185, 113, 152, 31, 7, 189, 176, 173, 98, 207, 108, 229, 121, 109, 60, 41, 91, 42, 29, + 95, 109, 158, 106, 35, 214, 30, 81, 20, 34, 209, 30, 125, 52, 182, 213, 31, 195, 4, 232, + 139, 105, 166, 215, 255, 94, 114, 166, 213, 1, 118, 139, 222, 122, 109, 49, 22, 139, 49, 35, + 43, 55, 180, 70, 42, 202, 142, 121, 123, 30, 128, 169, 101, 236, 22, 220, 118, 219, 189, + 237, 209, 184, 113, 228, 113, 48, 8, 115, 19, 109, 110, 77, 233, 210, 255, 53, 39, 127, 47, + 215, 38, 141, 170, 111, 151, 28, 98, 243, 250, 42, 198, 155, 227, 88, 123, 217, 18, 55, 185, + 165, 236, 121, 142, 131, 30, 206, 88, 154, 217, 57, 189, 109, 41, 70, 33, 47, 37, 49, 173, + 133, 221, 83, 130, 157, 19, 107, 203, 176, 53, 254, 30, 100, 143, 200, 59, 35, 110, 156, + 133, 106, 80, 21, 181, 176, 163, 61, 26, 183, 45, 219, 161, 24, 14, 178, 53, 200, 43, 35, + 239, 28, 244, 178, 121, 77, 180, 211, 226, 240, 119, 180, 157, 30, 111, 247, 55, 52, 77, 82, + 110, 76, 73, 176, 121, 74, 116, 100, 52, 192, 150, 165, 55, 30, 101, 183, 20, 111, 247, 222, + 223, 150, 185, 79, 234, 61, 236, 54, 124, 51, 210, 207, 25, 231, 128, 52, 46, 188, 53, 124, + 124, 36, 164, 43, 27, 111, 107, 96, 52, 114, 220, 211, 238, 195, 43, 143, 33, 54, 223, 70, + 34, 207, 30, 131, 55, 110, 202, 246, 196, 222, 6, 217, 18, 137, 182, 215, 84, 70, 73, 152, + 26, 253, 108, 170, 40, 150, 47, 134, 161, 209, 192, 30, 14, 223, 207, 110, 123, 192, 255, + 98, 236, 79, 90, 143, 78, 155, 251, 4, 91, 191, 124, 115, 233, 211, 158, 103, 141, 32, 189, + 110, 63, 205, 87, 141, 116, 115, 100, 70, 226, 29, 75, 162, 221, 159, 79, 47, 77, 251, 222, + 177, 70, 99, 202, 16, 123, 228, 113, 246, 170, 251, 39, 77, 136, 122, 106, 214, 99, 156, + 149, 146, 113, 189, 24, 169, 38, 98, 185, 65, 118, 77, 195, 237, 224, 52, 109, 246, 182, 99, + 74, 246, 195, 18, 255, 164, 67, 165, 87, 186, 203, 151, 45, 91, 217, 221, 166, 119, 140, + 187, 105, 220, 128, 184, 196, 161, 241, 49, 238, 122, 113, 9, 241, 113, 9, 81, 137, 177, + 113, 3, 74, 187, 235, 244, 235, 231, 110, 21, 251, 106, 239, 196, 129, 238, 86, 49, 3, 99, + 18, 6, 199, 68, 151, 174, 147, 16, 27, 213, 175, 110, 92, 191, 104, 95, 149, 234, 118, 138, + 219, 36, 85, 111, 23, 147, 48, 16, 107, 186, 43, 149, 46, 91, 206, 93, 180, 105, 108, 207, + 132, 184, 129, 113, 189, 18, 139, 61, 41, 146, 190, 132, 157, 90, 202, 110, 171, 141, 183, + 68, 236, 64, 119, 148, 59, 49, 33, 42, 58, 166, 127, 84, 66, 95, 119, 92, 175, 231, 50, 231, + 142, 29, 224, 78, 196, 188, 182, 3, 98, 19, 99, 162, 221, 173, 19, 163, 18, 99, 176, 242, + 128, 232, 50, 113, 9, 238, 56, 204, 73, 112, 247, 140, 27, 52, 32, 49, 33, 54, 102, 96, 233, + 231, 53, 146, 150, 214, 198, 252, 170, 159, 16, 53, 36, 118, 192, 171, 238, 230, 189, 122, + 197, 246, 140, 113, 151, 114, 183, 138, 235, 129, 189, 52, 139, 237, 217, 59, 174, 95, 212, + 192, 146, 238, 22, 81, 216, 92, 207, 216, 40, 119, 235, 168, 65, 3, 162, 113, 32, 238, 114, + 213, 170, 150, 239, 24, 55, 200, 221, 63, 106, 168, 123, 208, 192, 24, 228, 8, 71, 208, 43, + 110, 64, 162, 59, 49, 206, 29, 29, 59, 48, 190, 31, 102, 32, 83, 238, 248, 132, 88, 76, 236, + 137, 57, 49, 24, 70, 13, 116, 199, 199, 36, 244, 143, 77, 52, 172, 247, 24, 106, 15, 164, + 31, 246, 57, 192, 52, 129, 25, 166, 141, 4, 59, 53, 62, 33, 46, 122, 80, 207, 68, 51, 218, + 33, 189, 145, 145, 116, 61, 96, 24, 59, 160, 103, 191, 65, 209, 56, 41, 110, 31, 19, 113, 3, + 250, 13, 117, 23, 141, 45, 230, 142, 233, 223, 3, 219, 78, 87, 122, 192, 63, 246, 110, 23, + 143, 54, 163, 79, 136, 25, 104, 70, 105, 196, 243, 164, 3, 175, 180, 157, 182, 106, 216, 35, + 42, 26, 139, 189, 36, 198, 244, 55, 178, 76, 136, 197, 94, 163, 227, 134, 12, 232, 23, 23, + 21, 253, 180, 16, 162, 188, 67, 199, 233, 72, 155, 151, 184, 65, 137, 241, 131, 18, 221, + 209, 49, 131, 141, 152, 177, 76, 239, 152, 126, 241, 79, 75, 168, 52, 26, 225, 24, 92, 174, + 102, 177, 154, 45, 36, 253, 54, 246, 116, 78, 34, 12, 34, 1, 168, 206, 87, 159, 42, 243, 36, + 181, 151, 189, 148, 211, 231, 121, 83, 26, 218, 245, 19, 159, 202, 113, 210, 216, 56, 246, + 57, 219, 197, 190, 196, 223, 27, 210, 231, 63, 149, 158, 233, 112, 100, 58, 28, 153, 14, 71, + 166, 195, 145, 233, 112, 252, 23, 14, 71, 154, 237, 142, 125, 174, 85, 247, 230, 188, 140, + 97, 111, 12, 7, 99, 125, 147, 50, 232, 169, 178, 127, 207, 125, 209, 150, 192, 192, 167, 74, + 249, 210, 26, 226, 46, 208, 15, 45, 206, 159, 88, 254, 42, 166, 61, 109, 241, 159, 206, 243, + 213, 25, 232, 236, 14, 113, 207, 108, 241, 73, 110, 59, 155, 74, 95, 198, 155, 210, 200, + 142, 13, 182, 247, 154, 167, 243, 159, 206, 105, 129, 109, 152, 81, 15, 178, 109, 129, 145, + 213, 208, 167, 74, 63, 43, 63, 189, 164, 226, 158, 43, 195, 56, 30, 204, 107, 241, 26, 188, + 30, 175, 204, 171, 242, 72, 254, 2, 111, 194, 171, 165, 47, 253, 204, 252, 54, 207, 220, 77, + 159, 164, 54, 252, 219, 120, 188, 41, 77, 76, 140, 148, 195, 50, 233, 243, 158, 164, 54, + 177, 87, 65, 60, 74, 58, 46, 67, 137, 180, 116, 146, 21, 46, 176, 48, 212, 231, 116, 249, + 105, 105, 47, 219, 86, 34, 54, 131, 206, 60, 73, 253, 79, 245, 234, 63, 148, 221, 127, 220, + 222, 63, 233, 29, 245, 222, 248, 121, 138, 192, 15, 240, 140, 159, 128, 74, 132, 18, 239, + 165, 35, 7, 1, 18, 20, 104, 176, 192, 15, 92, 224, 15, 1, 144, 5, 2, 33, 8, 178, 66, 54, + 200, 14, 57, 32, 39, 228, 130, 220, 144, 7, 242, 66, 62, 200, 15, 5, 160, 32, 20, 130, 96, + 236, 43, 4, 66, 33, 12, 10, 67, 56, 68, 64, 17, 180, 12, 197, 160, 56, 148, 192, 253, 163, + 20, 174, 181, 50, 246, 62, 93, 30, 42, 64, 69, 220, 181, 43, 67, 21, 220, 43, 170, 161, 87, + 80, 3, 106, 194, 11, 80, 11, 106, 67, 36, 242, 93, 23, 119, 183, 250, 208, 0, 231, 241, 69, + 212, 205, 198, 240, 18, 206, 201, 203, 184, 183, 53, 195, 61, 171, 5, 180, 196, 125, 170, + 53, 206, 127, 91, 212, 235, 246, 208, 1, 237, 107, 39, 232, 12, 93, 224, 21, 232, 10, 221, + 160, 59, 142, 179, 7, 174, 113, 99, 15, 122, 217, 62, 76, 44, 244, 193, 185, 236, 135, 51, + 102, 118, 198, 120, 120, 205, 222, 169, 204, 10, 29, 140, 22, 233, 117, 212, 222, 97, 240, + 6, 188, 9, 111, 193, 112, 24, 1, 35, 225, 109, 24, 5, 239, 192, 104, 24, 3, 239, 194, 88, + 24, 7, 227, 33, 9, 38, 192, 68, 152, 4, 147, 97, 10, 76, 133, 105, 48, 29, 102, 192, 76, + 152, 5, 179, 9, 135, 57, 48, 23, 230, 17, 1, 11, 96, 33, 44, 34, 18, 22, 195, 7, 176, 4, 62, + 132, 143, 96, 41, 44, 131, 229, 68, 161, 87, 182, 138, 104, 88, 11, 235, 96, 61, 36, 195, 6, + 216, 8, 155, 96, 51, 124, 12, 159, 192, 167, 176, 5, 62, 131, 173, 176, 13, 182, 19, 11, + 190, 128, 47, 97, 7, 236, 36, 126, 240, 53, 236, 130, 111, 224, 91, 216, 13, 123, 96, 47, + 236, 131, 253, 240, 29, 28, 128, 131, 112, 8, 14, 195, 17, 56, 10, 199, 224, 56, 156, 192, + 25, 60, 9, 63, 194, 41, 56, 13, 103, 224, 39, 56, 11, 231, 224, 60, 252, 12, 23, 224, 34, + 252, 2, 151, 224, 50, 252, 10, 87, 112, 117, 92, 131, 20, 184, 14, 55, 224, 55, 248, 29, + 110, 194, 31, 112, 11, 110, 195, 29, 184, 139, 214, 229, 30, 220, 135, 191, 136, 139, 248, + 195, 35, 120, 12, 169, 230, 255, 71, 72, 2, 72, 22, 18, 72, 130, 72, 86, 146, 141, 100, 39, + 57, 72, 78, 146, 139, 228, 38, 121, 72, 94, 146, 143, 228, 39, 5, 72, 65, 82, 136, 4, 19, + 55, 9, 33, 161, 36, 140, 20, 38, 225, 36, 130, 20, 33, 69, 73, 49, 82, 156, 148, 32, 37, 73, + 41, 82, 154, 148, 33, 101, 73, 57, 82, 158, 84, 32, 21, 73, 37, 82, 153, 84, 33, 85, 73, 53, + 82, 157, 212, 32, 53, 201, 11, 164, 22, 169, 77, 34, 73, 29, 82, 151, 212, 35, 245, 73, 3, + 210, 144, 188, 72, 26, 145, 198, 228, 37, 210, 132, 188, 76, 154, 146, 102, 164, 57, 105, + 65, 90, 146, 86, 164, 53, 105, 67, 218, 146, 118, 164, 61, 233, 64, 58, 146, 78, 164, 51, + 233, 66, 94, 33, 93, 73, 55, 210, 157, 68, 145, 30, 164, 39, 137, 38, 49, 164, 23, 121, 149, + 244, 38, 177, 164, 15, 233, 75, 250, 145, 254, 100, 0, 137, 35, 241, 228, 53, 146, 64, 6, + 146, 68, 50, 136, 12, 38, 67, 200, 235, 100, 40, 25, 70, 222, 32, 111, 146, 183, 200, 112, + 50, 130, 140, 36, 111, 147, 81, 228, 29, 50, 154, 140, 33, 239, 146, 177, 100, 28, 25, 79, + 146, 200, 4, 50, 145, 76, 34, 147, 201, 20, 50, 149, 76, 35, 211, 201, 12, 50, 147, 204, 34, + 179, 201, 123, 100, 14, 153, 75, 230, 145, 249, 100, 1, 89, 72, 22, 145, 247, 201, 98, 242, + 1, 89, 66, 62, 36, 31, 145, 165, 100, 25, 89, 78, 86, 144, 149, 100, 21, 89, 77, 214, 144, + 181, 100, 29, 89, 79, 146, 201, 6, 178, 145, 108, 34, 155, 201, 199, 228, 19, 242, 41, 217, + 66, 62, 35, 91, 201, 54, 178, 157, 124, 78, 190, 32, 95, 146, 29, 100, 39, 249, 138, 124, + 77, 118, 145, 111, 200, 183, 100, 55, 217, 67, 246, 146, 125, 100, 63, 249, 142, 28, 32, 7, + 201, 33, 114, 152, 28, 33, 223, 147, 163, 228, 24, 57, 78, 78, 144, 31, 200, 73, 242, 35, + 57, 69, 78, 147, 51, 228, 39, 114, 150, 156, 35, 231, 201, 207, 228, 2, 185, 72, 126, 33, + 151, 200, 101, 242, 43, 185, 66, 174, 146, 107, 36, 133, 92, 39, 55, 200, 111, 228, 119, + 114, 147, 252, 65, 110, 145, 219, 228, 14, 185, 75, 254, 36, 247, 200, 125, 242, 23, 121, + 64, 30, 146, 71, 228, 49, 73, 37, 30, 10, 148, 80, 74, 25, 229, 84, 80, 73, 21, 213, 176, + 130, 90, 212, 143, 186, 168, 63, 13, 160, 89, 104, 32, 13, 162, 89, 105, 54, 154, 157, 230, + 160, 57, 105, 46, 154, 155, 230, 161, 121, 225, 125, 154, 143, 230, 167, 5, 104, 65, 90, + 136, 6, 83, 55, 13, 161, 161, 52, 140, 22, 166, 225, 52, 130, 22, 161, 69, 225, 61, 90, 140, + 22, 167, 37, 104, 73, 90, 138, 150, 166, 101, 104, 89, 90, 142, 150, 167, 21, 104, 69, 90, + 137, 86, 166, 85, 104, 85, 90, 141, 86, 167, 53, 104, 77, 250, 2, 173, 69, 107, 211, 72, 90, + 135, 214, 165, 245, 104, 125, 218, 128, 54, 164, 47, 210, 70, 180, 49, 125, 137, 54, 161, + 47, 211, 166, 180, 25, 109, 78, 91, 208, 150, 180, 21, 109, 77, 219, 208, 182, 180, 29, 109, + 79, 59, 208, 142, 180, 19, 237, 76, 187, 208, 87, 104, 87, 218, 141, 118, 167, 81, 180, 7, + 237, 73, 163, 105, 12, 237, 69, 95, 165, 189, 105, 44, 237, 67, 251, 210, 126, 180, 63, 29, + 64, 227, 104, 60, 125, 141, 38, 208, 129, 52, 145, 14, 162, 131, 233, 16, 250, 58, 29, 74, + 135, 209, 55, 232, 155, 244, 45, 58, 156, 142, 160, 35, 233, 219, 116, 20, 125, 135, 142, + 166, 99, 232, 187, 116, 44, 29, 71, 199, 211, 36, 58, 129, 78, 164, 147, 232, 100, 58, 133, + 78, 165, 211, 232, 116, 58, 131, 206, 164, 179, 232, 108, 152, 79, 223, 163, 115, 232, 92, + 58, 143, 206, 167, 11, 232, 66, 186, 136, 190, 79, 23, 211, 15, 232, 18, 250, 33, 253, 136, + 46, 165, 203, 232, 114, 186, 130, 174, 164, 171, 232, 106, 186, 134, 174, 165, 235, 232, + 122, 154, 76, 55, 208, 141, 116, 19, 221, 76, 63, 166, 159, 208, 79, 233, 22, 250, 25, 221, + 74, 183, 209, 237, 244, 115, 250, 5, 253, 146, 238, 160, 59, 233, 87, 244, 107, 186, 139, + 126, 67, 191, 165, 187, 233, 30, 186, 151, 238, 163, 251, 233, 119, 244, 0, 61, 72, 15, 209, + 195, 244, 8, 253, 158, 30, 165, 199, 232, 113, 122, 130, 254, 64, 79, 210, 31, 233, 41, 122, + 154, 158, 161, 63, 209, 179, 244, 28, 61, 79, 127, 166, 23, 232, 69, 250, 11, 189, 68, 47, + 211, 95, 233, 21, 122, 149, 94, 163, 41, 244, 58, 189, 65, 127, 163, 191, 211, 155, 244, 15, + 122, 139, 222, 166, 119, 232, 93, 250, 39, 189, 71, 239, 211, 191, 232, 3, 250, 144, 62, + 162, 143, 105, 42, 245, 48, 96, 132, 81, 198, 24, 103, 130, 73, 166, 152, 102, 22, 243, 99, + 46, 230, 207, 2, 88, 22, 22, 200, 130, 88, 86, 150, 141, 101, 103, 57, 88, 78, 150, 139, + 229, 102, 121, 88, 94, 150, 143, 229, 103, 5, 88, 65, 86, 136, 5, 51, 55, 11, 97, 161, 44, + 140, 21, 102, 225, 44, 130, 21, 97, 69, 89, 49, 86, 156, 149, 96, 37, 89, 41, 86, 154, 149, + 97, 101, 89, 57, 86, 158, 85, 96, 21, 89, 37, 86, 153, 85, 97, 85, 89, 53, 86, 157, 213, 96, + 53, 217, 11, 172, 22, 171, 205, 34, 89, 29, 86, 151, 213, 99, 245, 89, 3, 214, 144, 189, + 200, 26, 177, 198, 236, 37, 214, 132, 189, 204, 154, 178, 102, 172, 57, 107, 193, 90, 178, + 86, 172, 53, 107, 195, 218, 178, 118, 172, 61, 235, 192, 58, 178, 78, 172, 51, 235, 194, 94, + 97, 93, 89, 55, 214, 157, 69, 177, 30, 172, 39, 139, 102, 49, 172, 23, 123, 21, 62, 103, + 189, 89, 44, 235, 195, 250, 178, 126, 172, 63, 27, 192, 226, 88, 60, 123, 141, 37, 176, 129, + 44, 145, 13, 98, 131, 217, 16, 246, 58, 27, 202, 134, 177, 55, 216, 155, 236, 45, 54, 156, + 141, 96, 35, 217, 219, 108, 20, 123, 135, 141, 102, 99, 216, 187, 108, 44, 158, 166, 199, + 179, 36, 54, 129, 77, 100, 147, 216, 100, 54, 133, 77, 101, 211, 216, 116, 54, 131, 205, + 100, 179, 216, 108, 246, 30, 155, 195, 230, 178, 121, 108, 62, 91, 192, 22, 178, 69, 236, + 125, 182, 152, 125, 192, 150, 176, 15, 217, 71, 108, 41, 91, 198, 150, 179, 21, 108, 37, 91, + 197, 86, 179, 53, 108, 45, 91, 199, 214, 179, 100, 182, 129, 109, 100, 155, 216, 102, 246, + 49, 251, 132, 125, 202, 182, 176, 207, 216, 86, 182, 141, 109, 199, 243, 250, 23, 120, 106, + 223, 193, 118, 178, 175, 216, 215, 120, 130, 255, 134, 125, 203, 118, 179, 61, 108, 47, 219, + 199, 246, 179, 239, 216, 1, 118, 144, 29, 98, 135, 217, 17, 246, 61, 59, 202, 142, 177, 227, + 236, 4, 251, 129, 157, 100, 63, 178, 83, 236, 52, 59, 195, 126, 98, 103, 217, 57, 118, 158, + 253, 204, 46, 176, 139, 236, 23, 118, 137, 93, 102, 191, 178, 43, 236, 42, 187, 198, 82, + 216, 117, 118, 131, 253, 198, 126, 103, 55, 217, 31, 236, 22, 187, 205, 238, 176, 187, 236, + 79, 118, 143, 221, 103, 127, 177, 7, 236, 33, 123, 196, 30, 179, 84, 230, 225, 192, 9, 167, + 156, 113, 206, 5, 151, 92, 113, 205, 45, 238, 199, 93, 220, 159, 7, 240, 44, 60, 144, 7, + 241, 172, 60, 27, 207, 206, 115, 240, 156, 60, 23, 207, 205, 243, 240, 188, 60, 31, 207, + 207, 11, 240, 130, 188, 16, 122, 107, 110, 30, 194, 67, 121, 24, 47, 204, 195, 121, 4, 47, + 194, 139, 242, 98, 188, 56, 47, 193, 75, 242, 82, 188, 52, 47, 195, 203, 242, 114, 188, 60, + 175, 192, 43, 242, 74, 232, 211, 85, 65, 175, 174, 26, 175, 142, 30, 94, 77, 244, 237, 106, + 241, 218, 232, 227, 213, 225, 117, 209, 223, 171, 207, 27, 240, 134, 252, 69, 222, 136, 55, + 230, 47, 161, 215, 247, 50, 111, 202, 155, 241, 230, 188, 5, 111, 201, 91, 241, 214, 188, + 13, 111, 203, 219, 241, 246, 188, 3, 239, 200, 59, 241, 206, 188, 11, 127, 133, 119, 229, + 221, 120, 119, 30, 197, 123, 240, 158, 60, 154, 199, 240, 94, 252, 85, 222, 155, 199, 242, + 62, 188, 47, 239, 199, 251, 243, 1, 60, 142, 199, 243, 215, 120, 2, 31, 200, 19, 249, 32, + 62, 152, 15, 225, 175, 243, 161, 124, 24, 127, 131, 191, 201, 223, 226, 195, 249, 8, 62, + 146, 191, 205, 71, 241, 119, 248, 104, 62, 134, 191, 203, 199, 242, 113, 124, 60, 79, 226, + 19, 248, 68, 62, 137, 79, 230, 83, 248, 84, 62, 141, 79, 231, 51, 248, 76, 62, 139, 207, + 230, 239, 241, 57, 124, 46, 159, 199, 231, 243, 5, 124, 33, 95, 196, 223, 231, 139, 249, 7, + 124, 9, 255, 144, 127, 196, 151, 242, 101, 124, 57, 95, 193, 87, 242, 85, 124, 53, 95, 195, + 215, 242, 117, 124, 61, 79, 230, 27, 248, 70, 190, 137, 111, 230, 31, 243, 79, 248, 167, + 124, 11, 255, 140, 111, 229, 219, 248, 118, 254, 57, 255, 130, 127, 201, 119, 240, 157, 252, + 43, 254, 53, 223, 197, 191, 225, 223, 242, 221, 124, 15, 223, 203, 247, 241, 253, 252, 59, + 126, 128, 31, 228, 135, 248, 97, 126, 132, 127, 207, 143, 242, 99, 252, 56, 63, 193, 127, + 224, 39, 249, 143, 252, 20, 63, 205, 207, 240, 159, 248, 89, 126, 142, 159, 231, 63, 243, + 11, 252, 34, 255, 133, 95, 226, 151, 249, 175, 252, 10, 191, 202, 175, 241, 20, 126, 157, + 223, 224, 191, 241, 223, 249, 77, 254, 7, 191, 197, 111, 243, 59, 252, 46, 255, 147, 223, + 227, 247, 249, 95, 252, 1, 127, 200, 31, 241, 199, 60, 149, 123, 4, 8, 34, 168, 96, 130, 11, + 33, 164, 80, 66, 11, 75, 248, 9, 151, 240, 23, 1, 34, 139, 8, 20, 65, 34, 171, 200, 38, 178, + 139, 28, 34, 167, 200, 37, 114, 139, 60, 34, 175, 200, 39, 242, 139, 2, 162, 160, 40, 36, + 130, 133, 91, 132, 136, 80, 17, 38, 10, 139, 112, 17, 33, 138, 136, 162, 162, 152, 40, 46, + 74, 136, 146, 162, 148, 40, 45, 202, 136, 178, 162, 156, 40, 47, 42, 136, 138, 162, 146, + 168, 44, 170, 136, 170, 162, 154, 168, 46, 106, 136, 154, 226, 5, 81, 75, 212, 22, 145, 162, + 142, 168, 43, 234, 137, 250, 162, 129, 104, 40, 94, 20, 141, 68, 99, 241, 146, 104, 34, 94, + 22, 77, 69, 51, 209, 92, 180, 16, 45, 69, 43, 209, 90, 180, 17, 109, 69, 59, 209, 94, 116, + 16, 29, 69, 39, 209, 89, 116, 17, 175, 136, 174, 162, 155, 232, 46, 162, 68, 15, 209, 83, + 68, 139, 24, 209, 75, 188, 42, 122, 139, 88, 209, 71, 244, 21, 253, 68, 127, 49, 64, 196, + 137, 120, 241, 154, 72, 16, 3, 69, 162, 24, 36, 6, 139, 33, 226, 117, 49, 84, 12, 19, 111, + 136, 55, 197, 91, 98, 184, 24, 33, 70, 138, 183, 197, 40, 241, 142, 24, 45, 198, 136, 119, + 197, 88, 49, 78, 140, 23, 73, 98, 130, 152, 40, 38, 137, 201, 98, 138, 152, 42, 166, 137, + 233, 98, 134, 152, 41, 102, 137, 217, 226, 61, 49, 71, 204, 21, 243, 196, 124, 177, 64, 44, + 20, 139, 196, 251, 98, 177, 248, 64, 44, 17, 31, 138, 143, 196, 82, 177, 76, 44, 23, 43, + 196, 74, 177, 74, 172, 22, 107, 196, 90, 177, 78, 172, 23, 201, 98, 131, 216, 40, 54, 137, + 205, 226, 99, 241, 137, 248, 84, 108, 17, 159, 137, 173, 98, 155, 216, 46, 62, 23, 95, 136, + 47, 197, 14, 177, 83, 124, 37, 190, 22, 187, 196, 55, 226, 91, 177, 91, 236, 17, 123, 197, + 62, 177, 95, 124, 39, 14, 136, 131, 226, 144, 56, 44, 142, 136, 239, 197, 81, 113, 76, 28, + 23, 39, 196, 15, 226, 164, 248, 81, 156, 18, 167, 197, 25, 241, 147, 56, 43, 206, 137, 243, + 226, 103, 113, 65, 92, 20, 191, 136, 75, 226, 178, 248, 85, 92, 17, 87, 197, 53, 145, 34, + 174, 139, 27, 226, 55, 241, 187, 184, 41, 254, 16, 183, 196, 109, 113, 71, 220, 21, 127, + 138, 123, 226, 190, 248, 75, 60, 16, 15, 197, 35, 241, 88, 164, 10, 143, 4, 73, 36, 149, 76, + 114, 41, 164, 148, 74, 106, 105, 73, 63, 233, 146, 254, 50, 64, 102, 145, 129, 50, 72, 102, + 149, 217, 100, 118, 153, 67, 230, 148, 185, 100, 110, 153, 71, 230, 149, 249, 100, 126, 89, + 64, 22, 148, 133, 100, 176, 116, 203, 16, 25, 42, 195, 100, 97, 25, 46, 35, 100, 17, 89, 84, + 22, 147, 197, 101, 9, 89, 82, 150, 146, 165, 101, 25, 89, 86, 150, 147, 229, 101, 5, 89, 81, + 86, 146, 149, 101, 21, 89, 85, 86, 147, 213, 101, 13, 89, 83, 190, 32, 107, 201, 218, 50, + 82, 214, 145, 117, 101, 61, 89, 95, 54, 144, 13, 229, 139, 178, 145, 108, 44, 95, 146, 77, + 228, 203, 178, 169, 108, 38, 155, 203, 22, 178, 165, 108, 37, 91, 203, 54, 178, 173, 108, + 39, 219, 203, 14, 178, 163, 236, 36, 59, 203, 46, 242, 21, 217, 85, 118, 147, 221, 101, 148, + 236, 33, 123, 202, 104, 25, 35, 123, 201, 87, 101, 111, 25, 43, 251, 200, 190, 178, 159, + 236, 47, 7, 200, 56, 25, 47, 95, 147, 9, 114, 160, 76, 148, 131, 228, 96, 57, 68, 190, 46, + 135, 202, 97, 242, 13, 249, 166, 124, 75, 14, 151, 35, 228, 72, 249, 182, 28, 37, 223, 145, + 163, 229, 24, 249, 174, 28, 43, 199, 201, 241, 50, 73, 78, 144, 19, 229, 36, 57, 89, 78, + 145, 83, 229, 52, 57, 93, 206, 144, 51, 229, 44, 57, 91, 190, 39, 231, 200, 185, 114, 158, + 156, 47, 23, 200, 133, 114, 145, 124, 95, 46, 150, 31, 200, 37, 242, 67, 249, 145, 92, 42, + 151, 201, 229, 114, 133, 92, 41, 87, 201, 213, 114, 141, 92, 43, 215, 201, 245, 50, 89, 110, + 144, 27, 229, 38, 185, 89, 126, 44, 63, 145, 159, 202, 45, 242, 51, 185, 85, 110, 147, 219, + 229, 231, 242, 11, 249, 165, 220, 33, 119, 202, 175, 228, 215, 114, 151, 252, 70, 126, 43, + 119, 203, 61, 114, 175, 220, 39, 247, 203, 239, 228, 1, 121, 80, 30, 146, 135, 229, 17, 249, + 189, 60, 42, 143, 201, 227, 242, 132, 252, 65, 158, 148, 63, 202, 83, 242, 180, 60, 35, 127, + 146, 103, 229, 57, 121, 94, 254, 44, 47, 200, 139, 242, 23, 121, 73, 94, 150, 191, 202, 43, + 242, 170, 188, 38, 83, 228, 117, 121, 67, 254, 38, 127, 151, 55, 229, 31, 242, 150, 188, 45, + 239, 200, 187, 242, 79, 121, 79, 222, 151, 127, 201, 7, 242, 161, 124, 36, 31, 203, 84, 233, + 81, 160, 136, 162, 138, 41, 174, 132, 146, 74, 41, 173, 44, 229, 167, 92, 202, 95, 5, 168, + 44, 42, 80, 5, 169, 172, 42, 155, 202, 174, 114, 168, 156, 42, 151, 202, 173, 242, 168, 188, + 42, 159, 202, 175, 10, 168, 130, 170, 144, 10, 86, 110, 21, 162, 66, 85, 152, 42, 172, 194, + 85, 132, 42, 162, 138, 170, 98, 170, 184, 42, 161, 74, 170, 82, 170, 180, 42, 163, 202, 170, + 114, 170, 188, 170, 160, 42, 170, 74, 170, 178, 170, 162, 170, 170, 106, 170, 186, 170, 161, + 106, 170, 23, 84, 45, 85, 91, 69, 170, 58, 170, 174, 170, 167, 234, 171, 6, 170, 161, 122, + 81, 53, 82, 141, 213, 75, 170, 137, 122, 89, 53, 85, 205, 84, 115, 213, 66, 181, 84, 173, + 84, 107, 213, 70, 181, 85, 237, 84, 123, 213, 65, 117, 84, 157, 84, 103, 213, 69, 189, 162, + 186, 170, 110, 170, 187, 138, 82, 61, 84, 79, 21, 173, 98, 84, 47, 245, 170, 234, 173, 98, + 85, 31, 213, 87, 245, 83, 253, 213, 0, 21, 167, 226, 213, 107, 42, 65, 13, 84, 137, 106, + 144, 26, 172, 134, 168, 215, 213, 80, 53, 76, 189, 161, 222, 84, 111, 169, 225, 106, 132, + 26, 169, 222, 86, 163, 212, 59, 106, 180, 26, 163, 222, 85, 99, 213, 56, 53, 94, 37, 169, 9, + 106, 162, 154, 164, 38, 171, 41, 106, 170, 154, 166, 166, 171, 25, 106, 166, 154, 165, 102, + 171, 247, 212, 28, 53, 87, 205, 83, 243, 213, 2, 181, 80, 45, 82, 239, 171, 197, 234, 3, + 181, 68, 125, 168, 62, 82, 75, 213, 50, 181, 92, 173, 80, 43, 213, 42, 181, 90, 173, 81, + 107, 213, 58, 181, 94, 37, 171, 13, 106, 163, 218, 164, 54, 171, 143, 213, 39, 234, 83, 181, + 69, 125, 166, 182, 170, 109, 106, 187, 250, 92, 125, 161, 190, 84, 59, 212, 78, 245, 149, + 250, 90, 237, 82, 223, 168, 111, 213, 110, 181, 71, 237, 85, 251, 212, 126, 245, 157, 58, + 160, 14, 170, 67, 234, 176, 58, 162, 190, 87, 71, 213, 49, 117, 92, 157, 80, 63, 168, 147, + 234, 71, 117, 74, 157, 86, 103, 212, 79, 234, 172, 58, 167, 206, 171, 159, 213, 5, 117, 81, + 253, 162, 46, 169, 203, 234, 87, 117, 69, 93, 85, 215, 84, 138, 186, 174, 110, 168, 223, + 212, 239, 234, 166, 250, 67, 221, 82, 183, 213, 29, 117, 87, 253, 169, 238, 169, 251, 234, + 47, 245, 64, 61, 84, 143, 212, 99, 149, 170, 60, 26, 52, 209, 84, 51, 205, 181, 208, 82, 43, + 173, 181, 165, 253, 180, 75, 251, 235, 0, 157, 69, 7, 234, 32, 157, 85, 103, 211, 217, 117, + 14, 157, 83, 231, 210, 185, 117, 30, 157, 87, 231, 211, 249, 117, 1, 93, 80, 23, 210, 193, + 218, 173, 67, 116, 168, 14, 211, 133, 117, 184, 142, 208, 69, 116, 81, 93, 76, 23, 215, 37, + 116, 73, 93, 74, 151, 214, 101, 116, 89, 93, 78, 151, 215, 21, 116, 69, 93, 73, 87, 214, 85, + 116, 85, 93, 77, 87, 215, 53, 116, 77, 253, 130, 174, 165, 107, 235, 72, 93, 71, 215, 213, + 245, 116, 125, 221, 64, 55, 212, 47, 234, 70, 186, 177, 126, 73, 55, 209, 47, 235, 166, 186, + 153, 110, 174, 91, 232, 150, 186, 149, 110, 173, 219, 232, 182, 186, 157, 110, 175, 59, 232, + 142, 186, 147, 238, 172, 187, 232, 87, 116, 87, 221, 77, 119, 215, 81, 186, 135, 238, 169, + 163, 117, 140, 238, 165, 95, 213, 189, 117, 172, 238, 163, 251, 234, 126, 186, 191, 30, 160, + 227, 116, 188, 126, 77, 39, 232, 129, 58, 81, 15, 210, 131, 245, 16, 253, 186, 30, 170, 135, + 233, 55, 244, 155, 250, 45, 61, 92, 143, 208, 35, 245, 219, 122, 148, 126, 71, 143, 214, 99, + 244, 187, 122, 172, 30, 167, 199, 235, 36, 61, 65, 79, 212, 147, 244, 100, 61, 69, 79, 213, + 211, 244, 116, 61, 67, 207, 212, 179, 244, 108, 253, 158, 158, 163, 231, 234, 121, 122, 190, + 94, 160, 23, 234, 69, 250, 125, 189, 88, 127, 160, 151, 232, 15, 245, 71, 122, 169, 94, 166, + 151, 235, 21, 122, 165, 94, 165, 87, 235, 53, 122, 173, 94, 167, 215, 235, 100, 189, 65, + 111, 212, 155, 244, 102, 253, 177, 254, 68, 127, 170, 183, 232, 207, 244, 86, 189, 77, 111, + 215, 159, 235, 47, 244, 151, 122, 135, 222, 169, 191, 210, 95, 235, 93, 250, 27, 253, 173, + 222, 173, 247, 232, 189, 122, 159, 222, 175, 191, 211, 7, 244, 65, 125, 72, 31, 214, 71, + 244, 247, 250, 168, 62, 166, 143, 235, 19, 250, 7, 125, 82, 255, 168, 79, 233, 211, 250, + 140, 254, 73, 159, 213, 231, 244, 121, 253, 179, 190, 160, 47, 234, 95, 244, 37, 125, 89, + 255, 170, 175, 232, 171, 250, 154, 78, 209, 215, 245, 13, 253, 155, 254, 93, 223, 212, 127, + 232, 91, 250, 182, 190, 163, 239, 234, 63, 245, 61, 125, 95, 255, 165, 31, 232, 135, 250, + 145, 126, 172, 83, 181, 199, 2, 139, 88, 212, 98, 22, 183, 132, 37, 45, 101, 105, 203, 178, + 252, 44, 151, 229, 111, 5, 88, 89, 172, 64, 43, 200, 202, 106, 101, 179, 178, 91, 57, 172, + 156, 86, 46, 43, 183, 149, 199, 202, 107, 229, 179, 242, 91, 5, 172, 130, 86, 33, 43, 216, + 114, 91, 33, 86, 168, 21, 102, 21, 182, 194, 173, 8, 171, 136, 85, 212, 42, 102, 21, 183, + 74, 88, 37, 173, 82, 86, 105, 171, 140, 85, 214, 42, 103, 149, 183, 42, 88, 21, 173, 74, 86, + 101, 171, 138, 85, 213, 170, 102, 85, 183, 106, 88, 53, 173, 23, 172, 90, 86, 109, 43, 210, + 170, 99, 213, 181, 234, 89, 245, 173, 6, 86, 67, 235, 69, 171, 145, 213, 216, 122, 201, 106, + 98, 189, 108, 53, 181, 154, 89, 205, 173, 22, 86, 75, 171, 149, 213, 218, 106, 99, 181, 181, + 218, 89, 237, 173, 14, 86, 71, 171, 147, 213, 217, 234, 98, 189, 98, 117, 181, 186, 89, 221, + 173, 40, 171, 135, 213, 211, 138, 182, 98, 172, 94, 214, 171, 86, 111, 43, 214, 234, 99, + 245, 181, 250, 89, 253, 173, 1, 86, 156, 21, 111, 189, 102, 37, 88, 3, 173, 68, 107, 144, + 53, 216, 26, 98, 189, 110, 13, 181, 134, 89, 111, 88, 111, 90, 111, 89, 195, 173, 17, 214, + 72, 235, 109, 107, 148, 245, 142, 53, 218, 26, 99, 189, 107, 141, 181, 198, 89, 227, 173, + 36, 107, 130, 53, 209, 154, 100, 77, 182, 166, 88, 83, 173, 105, 214, 116, 107, 134, 53, + 211, 154, 101, 205, 182, 222, 179, 230, 88, 115, 173, 121, 214, 124, 107, 129, 181, 208, 90, + 100, 189, 111, 45, 182, 62, 176, 150, 88, 31, 90, 31, 89, 75, 173, 101, 214, 114, 107, 133, + 181, 210, 90, 101, 173, 182, 214, 88, 107, 173, 117, 214, 122, 43, 217, 218, 96, 109, 180, + 54, 253, 127, 165, 125, 121, 156, 28, 69, 217, 255, 236, 204, 94, 83, 85, 147, 44, 16, 66, + 228, 154, 133, 144, 4, 18, 19, 166, 171, 170, 47, 81, 178, 61, 83, 211, 136, 81, 19, 33, + 209, 4, 245, 53, 147, 205, 144, 93, 217, 236, 172, 187, 59, 9, 160, 2, 234, 203, 251, 10, + 188, 34, 158, 175, 199, 171, 68, 124, 65, 94, 81, 217, 236, 42, 38, 2, 18, 197, 251, 34, + 222, 120, 71, 197, 27, 197, 251, 246, 229, 87, 221, 253, 237, 158, 202, 184, 255, 188, 159, + 95, 160, 231, 121, 170, 186, 158, 250, 214, 249, 84, 213, 83, 85, 189, 197, 247, 23, 63, 80, + 188, 167, 248, 193, 226, 161, 226, 225, 226, 135, 138, 247, 22, 239, 43, 222, 95, 252, 112, + 241, 129, 226, 145, 226, 71, 138, 31, 45, 62, 88, 252, 88, 241, 227, 197, 79, 20, 63, 89, + 252, 84, 241, 211, 197, 207, 20, 63, 91, 252, 92, 241, 243, 197, 47, 20, 31, 42, 30, 45, + 126, 177, 248, 165, 226, 151, 139, 95, 41, 126, 181, 248, 181, 226, 215, 139, 15, 23, 191, + 81, 252, 102, 241, 91, 197, 111, 23, 191, 83, 252, 110, 241, 123, 197, 99, 197, 239, 23, + 127, 80, 252, 97, 241, 145, 226, 143, 138, 63, 46, 254, 164, 248, 211, 226, 207, 138, 63, + 47, 254, 162, 248, 104, 241, 151, 197, 95, 21, 31, 43, 254, 186, 248, 155, 226, 111, 139, + 191, 43, 254, 190, 248, 135, 226, 31, 139, 127, 42, 254, 185, 248, 151, 226, 95, 139, 127, + 43, 254, 189, 248, 143, 226, 255, 22, 31, 39, 57, 210, 67, 242, 164, 64, 122, 73, 31, 233, + 39, 3, 100, 144, 20, 9, 33, 148, 48, 82, 34, 75, 200, 82, 50, 68, 78, 32, 39, 146, 147, 200, + 50, 114, 50, 89, 78, 78, 33, 43, 200, 19, 200, 169, 228, 52, 114, 58, 57, 131, 156, 73, 202, + 100, 152, 156, 69, 206, 38, 43, 201, 57, 100, 21, 89, 77, 214, 144, 115, 201, 121, 100, 45, + 89, 71, 158, 72, 214, 147, 13, 228, 124, 82, 33, 22, 225, 68, 16, 73, 108, 226, 16, 151, + 120, 196, 39, 79, 34, 23, 144, 39, 147, 167, 144, 11, 201, 70, 50, 66, 2, 82, 37, 53, 162, + 72, 157, 132, 228, 34, 242, 84, 114, 49, 121, 26, 217, 68, 158, 78, 158, 65, 158, 73, 54, + 147, 45, 228, 89, 228, 18, 114, 41, 217, 74, 182, 145, 103, 147, 231, 144, 237, 100, 7, 185, + 140, 60, 151, 60, 143, 60, 159, 252, 11, 121, 1, 217, 73, 26, 100, 23, 25, 37, 187, 73, 147, + 92, 78, 246, 144, 49, 50, 78, 94, 72, 174, 32, 19, 100, 47, 153, 36, 45, 50, 69, 94, 68, + 166, 201, 12, 153, 37, 109, 178, 143, 236, 39, 87, 146, 171, 200, 213, 228, 197, 228, 37, + 228, 165, 228, 26, 114, 45, 185, 142, 188, 140, 188, 156, 188, 130, 252, 43, 185, 158, 252, + 27, 249, 119, 242, 74, 114, 3, 185, 145, 220, 68, 254, 131, 188, 138, 220, 76, 94, 77, 110, + 33, 175, 33, 175, 37, 175, 35, 175, 39, 111, 32, 111, 36, 255, 73, 222, 68, 222, 76, 222, + 66, 222, 74, 254, 139, 188, 141, 188, 157, 220, 74, 14, 144, 119, 144, 219, 200, 59, 201, + 127, 147, 219, 201, 29, 228, 93, 228, 78, 242, 63, 228, 221, 228, 46, 242, 30, 242, 94, 242, + 62, 114, 55, 153, 35, 7, 201, 60, 89, 32, 239, 39, 31, 32, 247, 144, 15, 146, 67, 228, 48, + 249, 16, 185, 151, 220, 71, 238, 39, 31, 38, 15, 144, 35, 228, 35, 228, 163, 228, 65, 242, + 49, 242, 113, 242, 9, 242, 73, 242, 41, 242, 105, 242, 25, 242, 89, 242, 57, 242, 121, 242, + 5, 242, 16, 57, 74, 190, 72, 190, 68, 190, 76, 190, 66, 190, 74, 190, 70, 190, 78, 30, 38, + 223, 32, 223, 36, 223, 34, 223, 38, 223, 33, 223, 37, 223, 35, 199, 200, 247, 201, 15, 200, + 15, 201, 35, 228, 71, 228, 199, 228, 39, 228, 167, 228, 103, 228, 231, 228, 23, 228, 81, + 242, 75, 242, 43, 242, 24, 249, 53, 249, 13, 249, 45, 249, 29, 249, 61, 249, 3, 249, 35, + 249, 19, 249, 51, 249, 11, 249, 43, 249, 27, 249, 59, 249, 7, 249, 95, 242, 56, 205, 209, + 30, 154, 167, 5, 218, 75, 251, 104, 63, 29, 160, 131, 180, 72, 9, 165, 148, 209, 18, 93, 66, + 151, 210, 33, 122, 2, 61, 145, 158, 68, 151, 209, 147, 233, 114, 122, 10, 93, 65, 159, 64, + 79, 165, 167, 209, 211, 233, 25, 244, 76, 90, 166, 195, 244, 44, 122, 54, 93, 73, 207, 161, + 171, 232, 106, 186, 134, 158, 75, 207, 163, 107, 233, 58, 250, 68, 186, 158, 110, 160, 231, + 211, 10, 181, 40, 167, 130, 74, 106, 83, 135, 186, 212, 163, 62, 125, 18, 189, 128, 62, 153, + 62, 133, 94, 72, 55, 210, 17, 26, 208, 42, 173, 81, 69, 235, 52, 164, 23, 209, 167, 210, + 139, 233, 211, 232, 38, 250, 116, 250, 12, 250, 76, 186, 153, 110, 161, 207, 162, 151, 208, + 75, 233, 86, 186, 141, 62, 155, 62, 135, 110, 167, 59, 232, 101, 244, 185, 244, 121, 244, + 249, 244, 95, 232, 11, 232, 78, 218, 160, 187, 232, 40, 221, 77, 155, 244, 114, 186, 135, + 142, 209, 113, 250, 66, 122, 5, 157, 160, 123, 233, 36, 109, 209, 41, 250, 34, 58, 77, 103, + 232, 44, 109, 211, 125, 116, 63, 189, 146, 94, 69, 175, 166, 47, 166, 47, 161, 47, 165, 215, + 208, 107, 233, 117, 244, 101, 244, 229, 244, 21, 244, 95, 233, 245, 244, 223, 232, 191, 211, + 87, 210, 27, 232, 141, 244, 38, 250, 31, 244, 85, 244, 102, 250, 106, 122, 11, 125, 13, 125, + 45, 125, 29, 125, 61, 125, 3, 125, 35, 253, 79, 250, 38, 250, 102, 250, 22, 250, 86, 250, + 95, 244, 109, 244, 237, 244, 86, 122, 128, 190, 131, 222, 70, 223, 73, 255, 155, 222, 78, + 239, 160, 239, 162, 119, 210, 255, 161, 239, 166, 119, 209, 247, 208, 247, 210, 247, 209, + 187, 233, 28, 61, 72, 231, 233, 2, 125, 63, 253, 0, 189, 135, 126, 144, 30, 162, 135, 233, + 135, 232, 189, 244, 62, 122, 63, 253, 48, 125, 128, 30, 161, 31, 161, 31, 165, 15, 210, 143, + 209, 143, 211, 79, 208, 79, 210, 79, 209, 79, 211, 207, 208, 207, 210, 207, 209, 207, 211, + 47, 208, 135, 232, 81, 250, 69, 250, 37, 250, 101, 250, 21, 250, 85, 250, 53, 250, 117, 250, + 48, 253, 6, 253, 38, 253, 22, 253, 54, 253, 14, 253, 46, 253, 30, 61, 70, 191, 79, 127, 64, + 127, 72, 31, 161, 63, 162, 63, 166, 63, 161, 63, 165, 63, 163, 63, 167, 191, 160, 143, 210, + 95, 210, 95, 209, 199, 232, 175, 233, 111, 232, 111, 233, 239, 232, 239, 233, 31, 232, 31, + 233, 159, 232, 159, 233, 95, 232, 95, 233, 223, 232, 223, 233, 63, 232, 255, 210, 199, 89, + 142, 245, 176, 60, 43, 176, 94, 214, 199, 250, 217, 0, 27, 100, 69, 70, 24, 101, 140, 149, + 216, 18, 182, 148, 13, 177, 19, 216, 137, 236, 36, 182, 140, 157, 204, 150, 179, 83, 216, + 10, 246, 4, 118, 42, 59, 141, 157, 206, 206, 96, 103, 178, 50, 27, 102, 103, 177, 179, 217, + 74, 118, 14, 91, 197, 86, 179, 53, 236, 92, 118, 30, 91, 203, 214, 177, 39, 178, 245, 108, + 3, 59, 159, 85, 152, 197, 56, 19, 76, 50, 155, 57, 204, 101, 30, 243, 217, 147, 216, 5, 236, + 201, 236, 41, 236, 66, 182, 145, 141, 176, 128, 85, 89, 141, 41, 86, 103, 33, 187, 136, 61, + 149, 93, 204, 158, 198, 54, 177, 167, 179, 103, 176, 103, 178, 205, 108, 11, 123, 22, 187, + 132, 93, 202, 182, 178, 109, 236, 217, 236, 57, 108, 59, 219, 193, 46, 99, 207, 101, 207, + 99, 207, 103, 255, 194, 94, 192, 118, 178, 6, 219, 197, 70, 217, 110, 214, 100, 151, 179, + 61, 108, 140, 141, 179, 23, 178, 43, 216, 4, 219, 203, 38, 89, 139, 77, 177, 23, 177, 105, + 54, 195, 102, 89, 155, 237, 99, 251, 217, 149, 236, 42, 118, 53, 123, 49, 123, 9, 123, 41, + 187, 134, 93, 203, 174, 99, 47, 99, 47, 103, 175, 96, 255, 202, 174, 103, 255, 198, 254, + 157, 189, 146, 221, 192, 110, 100, 55, 177, 255, 96, 175, 98, 55, 179, 87, 179, 91, 216, + 107, 216, 107, 217, 235, 216, 235, 217, 27, 216, 27, 217, 127, 178, 55, 177, 55, 179, 183, + 176, 183, 178, 255, 98, 111, 99, 111, 103, 183, 178, 3, 236, 29, 236, 54, 246, 78, 246, 223, + 236, 118, 118, 7, 123, 23, 187, 147, 253, 15, 123, 55, 187, 139, 189, 135, 189, 151, 189, + 143, 221, 205, 230, 216, 65, 54, 207, 22, 216, 251, 217, 7, 216, 61, 236, 131, 236, 16, 59, + 204, 62, 196, 238, 101, 247, 177, 251, 217, 135, 217, 3, 236, 8, 251, 8, 251, 40, 123, 144, + 125, 140, 125, 156, 125, 130, 125, 146, 125, 138, 125, 154, 125, 134, 125, 150, 125, 142, + 125, 158, 125, 129, 61, 196, 142, 178, 47, 178, 47, 177, 47, 179, 175, 176, 175, 178, 175, + 177, 175, 179, 135, 217, 55, 216, 55, 217, 183, 216, 183, 217, 119, 216, 119, 217, 247, 216, + 49, 246, 125, 246, 3, 246, 67, 246, 8, 251, 17, 251, 49, 251, 9, 251, 41, 251, 25, 251, 57, + 251, 5, 123, 148, 253, 146, 253, 138, 61, 198, 126, 205, 126, 195, 126, 203, 126, 199, 126, + 207, 254, 192, 254, 200, 254, 196, 254, 204, 254, 194, 254, 202, 254, 198, 254, 206, 254, + 193, 254, 151, 61, 94, 202, 149, 122, 74, 249, 82, 161, 212, 91, 234, 43, 245, 151, 6, 74, + 131, 165, 98, 137, 148, 104, 137, 149, 74, 165, 37, 165, 165, 165, 161, 210, 9, 165, 19, 75, + 39, 149, 150, 149, 78, 46, 45, 47, 157, 82, 90, 81, 122, 66, 233, 212, 210, 105, 165, 211, + 75, 103, 148, 206, 44, 149, 75, 195, 165, 179, 74, 103, 151, 86, 150, 206, 41, 173, 42, 173, + 46, 173, 41, 157, 91, 58, 175, 180, 182, 180, 174, 244, 196, 210, 250, 210, 134, 210, 249, + 165, 74, 201, 42, 241, 146, 40, 201, 146, 93, 114, 74, 110, 201, 43, 249, 165, 39, 149, 46, + 40, 61, 185, 244, 148, 254, 61, 19, 87, 77, 141, 241, 222, 74, 165, 178, 187, 176, 183, 109, + 21, 166, 198, 173, 194, 230, 177, 189, 3, 237, 201, 113, 206, 43, 206, 64, 115, 98, 124, + 106, 102, 124, 166, 183, 222, 158, 110, 145, 125, 187, 27, 123, 246, 52, 167, 119, 239, 154, + 32, 23, 239, 110, 205, 54, 70, 71, 155, 147, 179, 131, 151, 142, 142, 239, 30, 159, 152, + 104, 244, 239, 30, 157, 110, 53, 102, 139, 173, 125, 205, 233, 153, 209, 214, 116, 179, 127, + 239, 248, 110, 29, 172, 63, 216, 53, 221, 220, 215, 236, 111, 196, 100, 32, 104, 237, 105, + 77, 54, 175, 24, 104, 36, 180, 95, 141, 54, 166, 91, 147, 90, 56, 38, 42, 142, 99, 160, 142, + 64, 77, 4, 170, 39, 111, 155, 9, 121, 122, 99, 180, 61, 219, 236, 159, 72, 200, 211, 19, + 207, 137, 152, 244, 62, 93, 35, 246, 78, 68, 176, 207, 76, 94, 79, 38, 228, 153, 73, 168, + 201, 152, 148, 54, 143, 181, 39, 247, 52, 166, 219, 123, 39, 26, 237, 217, 82, 203, 116, + 245, 95, 146, 8, 76, 39, 228, 146, 68, 110, 58, 33, 151, 38, 158, 51, 49, 97, 91, 71, 91, + 123, 247, 54, 146, 98, 96, 179, 134, 163, 127, 107, 18, 124, 54, 38, 125, 219, 166, 199, 39, + 247, 244, 181, 163, 223, 210, 182, 227, 144, 219, 199, 33, 95, 150, 196, 126, 117, 76, 200, + 101, 89, 17, 147, 171, 51, 182, 239, 162, 134, 70, 233, 219, 58, 214, 156, 109, 20, 182, + 140, 141, 247, 53, 38, 166, 198, 26, 125, 187, 155, 19, 179, 141, 129, 166, 174, 170, 9, + 141, 55, 51, 190, 103, 111, 163, 48, 219, 104, 23, 166, 198, 198, 75, 201, 137, 180, 168, + 66, 116, 197, 21, 155, 87, 142, 78, 52, 246, 70, 220, 228, 76, 123, 170, 57, 61, 222, 154, + 238, 159, 106, 206, 232, 232, 138, 141, 233, 233, 214, 254, 137, 230, 229, 179, 3, 49, 215, + 158, 34, 49, 157, 142, 206, 249, 37, 47, 163, 147, 92, 9, 183, 171, 53, 59, 86, 68, 176, + 221, 147, 44, 227, 118, 205, 52, 73, 107, 122, 118, 44, 170, 183, 198, 4, 139, 15, 120, 205, + 52, 227, 67, 99, 180, 249, 162, 246, 248, 190, 198, 68, 115, 114, 180, 217, 55, 214, 106, + 207, 52, 75, 186, 65, 76, 180, 246, 140, 143, 54, 38, 38, 91, 179, 36, 10, 188, 103, 186, + 49, 49, 59, 149, 177, 187, 102, 227, 150, 104, 87, 42, 160, 28, 180, 150, 80, 11, 254, 150, + 4, 245, 64, 241, 158, 195, 159, 195, 45, 224, 22, 112, 219, 144, 183, 45, 80, 196, 111, 11, + 80, 132, 183, 109, 80, 7, 212, 5, 5, 158, 237, 131, 6, 160, 85, 208, 20, 71, 129, 214, 65, + 195, 132, 58, 192, 119, 128, 239, 0, 223, 1, 190, 3, 124, 7, 248, 14, 240, 29, 224, 59, 192, + 119, 128, 239, 0, 223, 1, 190, 163, 241, 167, 118, 77, 180, 70, 175, 24, 208, 117, 19, 209, + 190, 196, 53, 113, 121, 66, 167, 103, 225, 158, 157, 25, 107, 236, 110, 246, 197, 191, 3, + 187, 175, 136, 105, 241, 114, 221, 175, 117, 171, 105, 93, 73, 18, 110, 90, 215, 228, 192, + 236, 244, 120, 99, 79, 123, 42, 161, 211, 112, 239, 158, 76, 232, 196, 229, 253, 163, 227, + 211, 163, 19, 205, 226, 248, 228, 190, 93, 109, 45, 52, 27, 113, 240, 155, 217, 59, 174, + 219, 87, 99, 180, 169, 27, 198, 190, 204, 81, 152, 105, 79, 246, 95, 222, 220, 171, 155, 70, + 111, 244, 211, 55, 51, 165, 193, 123, 71, 39, 218, 187, 250, 198, 154, 13, 13, 177, 123, + 188, 177, 183, 53, 185, 155, 238, 109, 207, 160, 177, 52, 151, 24, 188, 110, 205, 249, 139, + 159, 150, 31, 127, 33, 157, 108, 76, 181, 102, 102, 167, 91, 83, 99, 145, 246, 153, 140, + 251, 106, 115, 84, 139, 198, 197, 97, 85, 146, 98, 180, 44, 20, 111, 128, 98, 15, 80, 108, + 1, 138, 173, 22, 146, 214, 84, 115, 50, 73, 255, 64, 176, 183, 161, 181, 210, 228, 64, 35, + 161, 180, 22, 229, 166, 189, 247, 242, 137, 230, 149, 116, 180, 195, 147, 90, 167, 195, 142, + 102, 236, 64, 29, 210, 205, 132, 246, 215, 19, 109, 216, 140, 9, 169, 119, 100, 154, 25, 75, + 47, 50, 16, 246, 24, 8, 23, 117, 66, 239, 201, 88, 118, 145, 169, 134, 246, 24, 14, 250, 84, + 35, 158, 177, 14, 223, 251, 212, 93, 141, 233, 222, 49, 253, 211, 127, 241, 236, 248, 196, + 238, 102, 255, 120, 76, 6, 46, 70, 90, 199, 145, 214, 139, 147, 180, 142, 39, 154, 251, 98, + 40, 229, 241, 132, 210, 167, 25, 177, 191, 176, 195, 179, 77, 102, 122, 174, 56, 206, 177, + 103, 186, 217, 156, 156, 104, 76, 238, 30, 31, 101, 79, 55, 223, 76, 152, 142, 103, 154, + 142, 73, 195, 81, 168, 79, 238, 41, 52, 39, 247, 12, 108, 70, 66, 91, 72, 232, 230, 36, 161, + 173, 152, 176, 75, 76, 249, 105, 179, 64, 46, 53, 146, 60, 99, 20, 200, 214, 168, 64, 102, + 163, 2, 217, 150, 20, 72, 59, 41, 144, 109, 192, 105, 3, 103, 91, 130, 211, 78, 10, 100, 27, + 10, 164, 141, 2, 121, 142, 17, 251, 126, 131, 223, 97, 240, 87, 117, 248, 62, 173, 171, 247, + 204, 144, 32, 26, 23, 18, 149, 223, 200, 216, 129, 160, 158, 208, 70, 51, 166, 116, 243, + 204, 68, 67, 119, 202, 152, 111, 117, 248, 98, 35, 234, 0, 19, 205, 241, 70, 255, 115, 180, + 194, 212, 105, 219, 159, 144, 231, 36, 99, 201, 254, 36, 212, 115, 118, 143, 55, 167, 155, + 122, 32, 47, 238, 79, 185, 254, 29, 73, 192, 171, 98, 82, 122, 81, 91, 199, 19, 229, 74, + 171, 235, 221, 197, 233, 198, 238, 168, 115, 233, 146, 153, 24, 159, 110, 20, 155, 51, 179, + 186, 73, 232, 142, 86, 212, 249, 108, 70, 227, 193, 24, 155, 29, 211, 117, 153, 240, 51, + 244, 242, 241, 125, 41, 207, 102, 116, 36, 147, 233, 11, 163, 240, 135, 226, 129, 200, 240, + 232, 155, 109, 77, 182, 102, 74, 105, 130, 98, 23, 9, 162, 241, 44, 102, 89, 61, 25, 206, + 98, 199, 96, 125, 54, 241, 45, 94, 220, 2, 199, 54, 239, 141, 142, 145, 39, 239, 217, 54, + 35, 48, 217, 188, 183, 185, 39, 9, 116, 194, 184, 14, 126, 28, 66, 95, 140, 208, 91, 213, + 35, 222, 0, 16, 122, 47, 139, 70, 83, 141, 208, 27, 69, 222, 183, 169, 49, 53, 213, 208, + 147, 140, 189, 187, 118, 55, 242, 207, 104, 231, 159, 217, 206, 111, 31, 31, 0, 90, 126, + 203, 120, 225, 146, 177, 86, 223, 165, 241, 24, 187, 181, 209, 30, 0, 114, 161, 54, 54, 94, + 216, 50, 51, 206, 46, 54, 16, 151, 226, 101, 234, 38, 141, 78, 246, 154, 102, 246, 154, 105, + 246, 198, 211, 236, 45, 107, 31, 47, 26, 123, 246, 238, 210, 1, 251, 246, 68, 115, 128, 222, + 171, 163, 68, 71, 206, 217, 104, 50, 208, 27, 9, 246, 93, 17, 39, 125, 34, 73, 250, 100, 59, + 127, 229, 184, 238, 34, 113, 186, 11, 211, 99, 173, 254, 120, 98, 160, 117, 30, 82, 60, 170, + 83, 172, 217, 190, 86, 84, 92, 204, 44, 169, 165, 93, 224, 172, 101, 150, 117, 219, 44, 235, + 86, 86, 214, 145, 238, 172, 200, 138, 5, 202, 65, 5, 168, 4, 181, 65, 29, 80, 23, 212, 3, + 245, 65, 3, 208, 42, 104, 13, 180, 14, 26, 38, 52, 153, 2, 104, 10, 92, 11, 184, 22, 112, + 45, 224, 90, 192, 181, 128, 107, 1, 215, 2, 174, 5, 92, 11, 184, 22, 112, 45, 224, 90, 10, + 20, 248, 22, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, + 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 5, 240, 5, 240, 5, + 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, + 5, 240, 5, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, + 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 109, 224, 218, 192, 181, + 129, 107, 3, 215, 6, 174, 13, 92, 27, 184, 54, 112, 109, 224, 218, 192, 181, 129, 107, 3, + 215, 6, 158, 13, 60, 31, 249, 245, 147, 185, 67, 197, 74, 231, 20, 73, 252, 118, 181, 2, + 106, 129, 114, 80, 1, 42, 65, 109, 208, 84, 206, 5, 245, 64, 125, 208, 42, 104, 13, 84, 129, + 214, 65, 147, 116, 217, 53, 224, 214, 128, 91, 3, 110, 13, 184, 10, 239, 21, 222, 43, 188, + 87, 233, 123, 164, 75, 33, 93, 10, 233, 82, 72, 151, 66, 186, 20, 210, 165, 2, 80, 164, 79, + 33, 125, 10, 233, 83, 72, 159, 66, 250, 234, 192, 175, 3, 191, 14, 252, 58, 240, 235, 192, + 175, 3, 191, 14, 252, 58, 240, 235, 192, 175, 3, 191, 14, 252, 16, 241, 134, 136, 55, 68, + 188, 33, 226, 13, 147, 41, 116, 37, 8, 40, 242, 23, 149, 13, 248, 32, 170, 47, 131, 247, + 192, 215, 162, 242, 95, 218, 225, 99, 55, 69, 186, 55, 232, 37, 10, 120, 63, 42, 111, 131, + 231, 75, 51, 62, 146, 169, 89, 93, 238, 20, 183, 18, 213, 183, 193, 123, 6, 95, 3, 111, 25, + 60, 55, 120, 97, 240, 210, 224, 109, 131, 119, 12, 222, 51, 120, 223, 224, 3, 131, 175, 26, + 124, 205, 224, 235, 29, 190, 110, 164, 173, 110, 164, 173, 110, 164, 167, 110, 164, 167, + 110, 164, 161, 238, 26, 188, 145, 158, 186, 145, 158, 122, 208, 149, 23, 223, 40, 135, 208, + 72, 103, 104, 96, 133, 157, 114, 75, 218, 31, 175, 84, 82, 170, 64, 235, 160, 73, 59, 116, + 48, 142, 56, 208, 239, 14, 244, 184, 3, 253, 237, 64, 159, 57, 208, 63, 14, 244, 143, 3, + 253, 227, 64, 255, 56, 208, 63, 142, 141, 240, 208, 67, 14, 244, 144, 227, 192, 223, 129, + 191, 147, 250, 11, 80, 9, 106, 131, 58, 160, 46, 168, 7, 234, 131, 6, 160, 72, 151, 163, 6, + 99, 227, 141, 235, 202, 148, 65, 76, 202, 78, 61, 16, 85, 8, 168, 16, 1, 66, 7, 1, 60, 43, + 101, 120, 202, 136, 148, 73, 99, 245, 108, 138, 252, 69, 101, 146, 122, 186, 41, 227, 165, + 140, 15, 198, 175, 164, 76, 26, 185, 159, 70, 238, 167, 145, 251, 146, 162, 172, 163, 190, + 148, 122, 166, 169, 242, 211, 200, 125, 20, 129, 91, 103, 160, 27, 46, 31, 159, 108, 100, + 142, 241, 201, 241, 217, 204, 177, 183, 185, 123, 60, 145, 243, 42, 34, 101, 100, 202, 216, + 41, 131, 82, 246, 28, 6, 106, 68, 169, 29, 157, 40, 181, 35, 138, 50, 9, 238, 123, 12, 52, + 14, 158, 120, 6, 62, 3, 53, 226, 208, 142, 78, 28, 218, 209, 137, 35, 8, 225, 25, 154, 193, + 67, 51, 120, 104, 4, 175, 213, 24, 168, 17, 92, 217, 177, 3, 153, 225, 105, 246, 120, 154, + 61, 238, 164, 140, 155, 50, 94, 202, 160, 130, 60, 81, 73, 25, 43, 101, 120, 202, 164, 5, + 39, 210, 152, 69, 26, 179, 72, 99, 22, 105, 204, 194, 51, 26, 70, 205, 224, 149, 193, 215, + 13, 62, 236, 240, 118, 154, 6, 153, 2, 37, 211, 3, 94, 73, 166, 63, 154, 86, 65, 209, 141, + 57, 186, 49, 44, 57, 21, 7, 110, 39, 4, 133, 28, 44, 31, 21, 39, 13, 23, 203, 135, 149, 100, + 58, 169, 105, 21, 180, 6, 154, 190, 143, 227, 11, 195, 176, 134, 4, 57, 105, 202, 156, 180, + 8, 156, 180, 8, 156, 180, 8, 156, 180, 112, 157, 180, 112, 221, 52, 99, 110, 90, 184, 110, + 90, 184, 110, 90, 184, 105, 135, 245, 220, 52, 102, 55, 141, 217, 77, 99, 118, 211, 152, + 221, 52, 102, 47, 141, 57, 237, 180, 94, 218, 105, 189, 180, 211, 122, 105, 167, 245, 188, + 52, 102, 47, 141, 57, 237, 177, 94, 218, 99, 189, 180, 199, 122, 105, 143, 245, 146, 41, 77, + 168, 146, 41, 158, 166, 97, 250, 66, 246, 79, 68, 38, 222, 177, 216, 95, 107, 112, 168, 76, + 206, 64, 141, 94, 193, 5, 60, 133, 233, 41, 225, 41, 77, 79, 27, 158, 182, 233, 137, 142, + 201, 205, 142, 201, 205, 142, 201, 205, 142, 201, 93, 120, 186, 102, 28, 232, 173, 220, 51, + 227, 240, 204, 56, 60, 51, 14, 244, 99, 238, 155, 113, 4, 240, 12, 204, 56, 2, 51, 142, 192, + 140, 163, 10, 207, 170, 25, 188, 106, 6, 175, 154, 193, 209, 185, 185, 217, 185, 181, 195, + 8, 94, 51, 131, 43, 120, 42, 51, 184, 50, 131, 43, 51, 56, 244, 37, 55, 245, 37, 55, 245, + 37, 175, 155, 193, 161, 152, 120, 104, 228, 95, 84, 24, 168, 233, 105, 193, 211, 50, 61, + 209, 10, 132, 217, 10, 4, 90, 129, 16, 70, 18, 180, 163, 147, 4, 237, 232, 36, 65, 160, 125, + 8, 105, 6, 151, 102, 112, 105, 6, 71, 203, 17, 182, 25, 220, 54, 131, 219, 102, 112, 180, + 41, 97, 182, 41, 97, 182, 41, 97, 182, 41, 129, 54, 37, 92, 51, 184, 107, 6, 119, 205, 224, + 104, 109, 194, 108, 109, 194, 108, 109, 194, 108, 109, 2, 173, 77, 152, 163, 134, 48, 71, + 13, 97, 142, 26, 2, 237, 80, 152, 237, 80, 152, 237, 80, 152, 237, 80, 162, 134, 164, 101, + 4, 215, 142, 78, 112, 237, 48, 130, 163, 238, 36, 55, 131, 115, 51, 56, 55, 131, 163, 86, + 165, 89, 171, 210, 172, 85, 105, 214, 170, 68, 173, 74, 179, 86, 165, 89, 171, 210, 172, 85, + 137, 90, 149, 102, 173, 74, 179, 86, 165, 89, 171, 18, 181, 42, 205, 90, 149, 102, 173, 74, + 179, 86, 37, 106, 85, 154, 154, 162, 138, 158, 82, 173, 27, 158, 18, 21, 42, 205, 193, 94, + 162, 218, 164, 169, 36, 36, 42, 71, 154, 149, 35, 205, 202, 145, 73, 229, 12, 33, 183, 177, + 174, 28, 159, 105, 77, 28, 231, 17, 201, 26, 30, 162, 59, 132, 232, 14, 97, 119, 135, 176, + 187, 67, 184, 221, 33, 146, 92, 23, 99, 125, 110, 85, 184, 149, 113, 60, 227, 68, 198, 201, + 140, 179, 51, 206, 201, 56, 55, 227, 188, 140, 243, 83, 78, 84, 50, 46, 195, 16, 25, 134, + 200, 48, 68, 134, 33, 50, 12, 145, 97, 136, 12, 67, 100, 24, 34, 195, 144, 25, 134, 204, 48, + 100, 134, 33, 51, 12, 153, 97, 200, 12, 67, 102, 24, 50, 195, 144, 25, 134, 204, 48, 236, + 12, 195, 206, 48, 236, 12, 195, 206, 48, 236, 12, 195, 206, 48, 236, 12, 195, 206, 48, 236, + 12, 195, 206, 48, 156, 12, 195, 201, 48, 156, 12, 195, 201, 48, 156, 12, 195, 201, 48, 156, + 12, 195, 201, 48, 156, 12, 195, 201, 48, 220, 12, 195, 205, 48, 220, 12, 195, 205, 48, 220, + 12, 195, 205, 48, 220, 12, 195, 205, 48, 220, 12, 195, 205, 48, 188, 12, 195, 203, 48, 188, + 12, 195, 203, 48, 188, 12, 195, 203, 48, 188, 12, 195, 203, 48, 188, 12, 195, 203, 48, 252, + 12, 195, 207, 48, 252, 12, 195, 207, 48, 252, 12, 195, 207, 48, 252, 12, 195, 207, 48, 252, + 12, 195, 79, 49, 172, 74, 37, 227, 172, 140, 227, 25, 39, 50, 78, 102, 156, 157, 113, 78, + 198, 185, 25, 231, 101, 92, 134, 97, 101, 24, 86, 134, 97, 101, 24, 86, 134, 97, 101, 24, + 86, 134, 97, 101, 24, 86, 134, 97, 101, 24, 86, 134, 193, 51, 140, 172, 159, 91, 89, 63, + 183, 178, 126, 110, 101, 253, 220, 202, 250, 185, 149, 245, 115, 43, 235, 231, 86, 214, 207, + 45, 238, 247, 109, 30, 107, 77, 79, 246, 181, 226, 223, 109, 241, 111, 59, 250, 77, 67, 100, + 253, 218, 202, 250, 181, 149, 152, 28, 245, 28, 59, 165, 46, 168, 95, 26, 107, 181, 174, + 104, 236, 106, 237, 107, 142, 182, 246, 238, 74, 124, 19, 131, 174, 166, 2, 212, 2, 197, + 140, 93, 151, 71, 188, 57, 19, 73, 164, 8, 89, 95, 182, 18, 115, 98, 168, 215, 9, 189, 187, + 91, 147, 123, 6, 91, 147, 205, 217, 177, 241, 233, 221, 197, 217, 253, 173, 152, 153, 1, + 118, 150, 167, 172, 7, 91, 137, 169, 48, 132, 169, 64, 35, 113, 80, 9, 138, 244, 91, 72, + 191, 5, 172, 196, 116, 172, 41, 214, 24, 22, 214, 24, 137, 169, 88, 83, 196, 199, 145, 51, + 142, 28, 69, 117, 18, 109, 190, 196, 57, 137, 55, 106, 140, 82, 80, 108, 119, 107, 118, 87, + 115, 162, 181, 191, 227, 201, 81, 36, 28, 128, 28, 128, 28, 128, 28, 9, 229, 200, 8, 71, + 130, 57, 18, 204, 211, 194, 193, 162, 135, 35, 129, 28, 9, 20, 72, 160, 86, 221, 65, 138, + 94, 108, 164, 28, 9, 178, 218, 34, 141, 140, 29, 10, 58, 59, 90, 113, 30, 134, 26, 221, 30, + 70, 136, 56, 191, 102, 136, 216, 99, 153, 17, 34, 139, 120, 89, 99, 17, 79, 51, 174, 184, + 21, 152, 113, 197, 30, 39, 25, 33, 210, 148, 159, 212, 248, 103, 63, 154, 28, 75, 73, 118, + 212, 26, 6, 159, 248, 199, 233, 130, 127, 204, 47, 77, 252, 179, 148, 44, 109, 28, 239, 134, + 92, 156, 6, 200, 197, 252, 146, 196, 63, 133, 93, 210, 56, 206, 89, 172, 103, 92, 230, 71, + 234, 157, 114, 238, 196, 223, 95, 79, 118, 38, 147, 88, 135, 234, 221, 133, 220, 236, 246, + 168, 119, 151, 122, 179, 187, 212, 235, 139, 149, 122, 115, 177, 82, 175, 119, 151, 122, + 179, 187, 212, 235, 139, 148, 122, 243, 159, 253, 200, 197, 157, 188, 141, 103, 108, 241, + 226, 172, 20, 198, 51, 110, 115, 198, 181, 50, 233, 205, 29, 233, 86, 39, 117, 155, 187, + 179, 222, 234, 246, 216, 220, 93, 22, 173, 238, 178, 216, 188, 88, 89, 180, 22, 43, 139, + 205, 221, 101, 209, 234, 46, 139, 205, 139, 148, 69, 107, 145, 178, 136, 85, 105, 178, 243, + 219, 234, 176, 177, 111, 156, 168, 196, 55, 102, 151, 196, 190, 89, 34, 150, 180, 142, 115, + 38, 50, 49, 120, 34, 19, 179, 165, 216, 55, 69, 43, 181, 76, 87, 113, 91, 198, 181, 179, + 244, 108, 235, 68, 216, 238, 176, 219, 58, 73, 107, 119, 216, 109, 157, 84, 182, 59, 169, + 220, 118, 124, 42, 219, 199, 167, 114, 91, 39, 149, 237, 78, 42, 183, 29, 151, 202, 246, + 113, 169, 220, 145, 113, 87, 101, 169, 220, 209, 137, 240, 170, 78, 239, 216, 145, 244, 142, + 171, 146, 125, 251, 104, 222, 107, 213, 20, 104, 29, 52, 177, 216, 90, 216, 9, 177, 176, 19, + 98, 97, 39, 196, 194, 78, 136, 133, 157, 16, 11, 59, 33, 22, 118, 66, 44, 236, 132, 88, 216, + 9, 177, 176, 19, 98, 97, 39, 196, 194, 78, 136, 165, 106, 177, 213, 95, 232, 121, 145, 168, + 200, 13, 163, 141, 41, 12, 48, 220, 23, 198, 155, 90, 244, 198, 112, 87, 34, 119, 28, 131, + 244, 177, 151, 229, 99, 47, 203, 199, 222, 149, 143, 189, 43, 31, 123, 85, 62, 246, 170, + 124, 236, 85, 249, 216, 35, 11, 32, 31, 64, 62, 192, 30, 86, 128, 61, 44, 236, 81, 73, 236, + 81, 73, 236, 81, 73, 236, 81, 73, 236, 65, 73, 236, 65, 201, 42, 240, 176, 23, 101, 121, 73, + 60, 60, 221, 59, 195, 222, 140, 172, 167, 182, 106, 44, 171, 28, 211, 230, 224, 132, 199, + 59, 58, 75, 51, 39, 28, 208, 181, 187, 65, 15, 213, 209, 152, 183, 65, 143, 212, 186, 17, + 140, 95, 77, 99, 71, 116, 204, 160, 61, 85, 202, 248, 232, 12, 26, 69, 176, 125, 205, 233, + 217, 193, 136, 191, 188, 213, 158, 78, 226, 178, 236, 190, 253, 141, 153, 137, 70, 113, 127, + 99, 223, 85, 99, 141, 189, 87, 55, 250, 103, 246, 54, 38, 38, 246, 45, 237, 116, 192, 13, + 141, 233, 198, 174, 36, 56, 118, 11, 29, 236, 22, 58, 216, 45, 116, 92, 152, 184, 92, 172, + 167, 93, 211, 226, 225, 98, 213, 236, 154, 22, 15, 23, 107, 99, 215, 180, 123, 185, 88, 210, + 186, 166, 137, 203, 197, 194, 213, 117, 76, 79, 44, 79, 93, 115, 121, 234, 98, 37, 234, 154, + 43, 81, 23, 43, 81, 215, 52, 32, 184, 166, 1, 193, 53, 13, 8, 46, 214, 168, 174, 185, 70, + 117, 205, 53, 170, 107, 26, 16, 92, 24, 178, 92, 211, 144, 229, 154, 134, 44, 215, 52, 100, + 185, 48, 100, 185, 166, 33, 203, 53, 13, 89, 174, 105, 200, 114, 97, 200, 114, 77, 67, 150, + 107, 26, 178, 92, 211, 144, 229, 194, 50, 229, 154, 38, 115, 215, 108, 71, 174, 217, 142, + 60, 216, 172, 188, 138, 105, 212, 175, 152, 70, 253, 138, 25, 28, 117, 235, 153, 182, 18, + 207, 180, 149, 120, 166, 173, 196, 67, 173, 123, 166, 173, 196, 51, 109, 37, 158, 105, 43, + 241, 208, 30, 60, 211, 86, 226, 153, 182, 18, 207, 180, 149, 120, 176, 149, 120, 166, 173, + 196, 51, 109, 37, 158, 105, 43, 241, 208, 176, 60, 211, 86, 226, 153, 182, 18, 207, 180, + 149, 120, 104, 93, 158, 105, 210, 210, 14, 35, 184, 105, 210, 242, 208, 238, 60, 179, 221, + 121, 104, 119, 158, 105, 1, 241, 208, 186, 188, 192, 244, 68, 27, 242, 170, 166, 39, 90, + 138, 87, 51, 61, 209, 30, 60, 101, 122, 66, 123, 120, 166, 81, 198, 67, 83, 240, 76, 35, + 165, 143, 10, 247, 77, 35, 165, 143, 106, 245, 205, 46, 235, 163, 242, 124, 179, 203, 250, + 168, 34, 223, 236, 178, 62, 42, 194, 55, 77, 213, 62, 138, 219, 55, 251, 177, 143, 126, 236, + 155, 253, 216, 71, 73, 251, 102, 63, 246, 81, 116, 190, 89, 116, 62, 138, 206, 55, 59, 166, + 111, 118, 76, 223, 236, 152, 62, 10, 213, 55, 59, 166, 111, 118, 76, 223, 236, 152, 62, 138, + 219, 55, 59, 166, 111, 118, 76, 223, 236, 152, 62, 42, 194, 55, 59, 166, 111, 118, 76, 223, + 236, 152, 62, 170, 200, 55, 45, 204, 190, 169, 237, 125, 211, 194, 236, 163, 242, 124, 179, + 242, 2, 84, 94, 96, 246, 214, 192, 236, 173, 129, 217, 91, 3, 236, 163, 6, 168, 201, 192, + 236, 134, 129, 217, 13, 3, 179, 27, 6, 168, 227, 192, 236, 134, 129, 217, 13, 3, 179, 27, 6, + 168, 253, 192, 236, 134, 129, 217, 13, 3, 179, 27, 6, 104, 23, 129, 217, 13, 3, 179, 27, 6, + 102, 55, 12, 208, 98, 2, 211, 100, 25, 152, 38, 203, 192, 52, 89, 6, 104, 75, 129, 217, 150, + 2, 244, 205, 224, 184, 173, 72, 180, 165, 192, 108, 75, 129, 217, 150, 2, 179, 45, 5, 104, + 75, 129, 217, 150, 2, 179, 45, 5, 102, 91, 10, 208, 150, 2, 179, 45, 5, 102, 91, 10, 204, + 182, 20, 160, 45, 5, 102, 91, 10, 204, 182, 20, 152, 109, 41, 64, 91, 10, 204, 182, 20, 152, + 109, 41, 48, 219, 82, 21, 205, 166, 106, 54, 155, 170, 217, 108, 170, 102, 179, 169, 66, 27, + 84, 77, 37, 95, 53, 149, 124, 213, 84, 242, 85, 180, 174, 170, 217, 186, 170, 102, 235, 170, + 154, 173, 171, 138, 214, 85, 53, 91, 87, 213, 108, 93, 85, 179, 117, 85, 209, 186, 170, 102, + 235, 170, 154, 173, 171, 106, 182, 174, 42, 90, 87, 213, 108, 93, 85, 179, 117, 85, 205, + 214, 85, 69, 235, 170, 154, 173, 171, 106, 182, 174, 170, 217, 186, 170, 104, 93, 85, 115, + 76, 208, 14, 35, 184, 57, 38, 84, 209, 238, 170, 230, 54, 71, 213, 220, 230, 168, 154, 219, + 28, 85, 168, 188, 170, 57, 75, 169, 154, 179, 148, 170, 57, 75, 169, 162, 1, 87, 205, 113, + 164, 138, 102, 90, 53, 199, 145, 42, 26, 99, 213, 108, 140, 85, 179, 49, 86, 205, 198, 88, + 69, 99, 172, 154, 35, 76, 21, 250, 168, 106, 206, 43, 170, 230, 188, 162, 122, 220, 86, 60, + 154, 92, 205, 108, 114, 53, 179, 65, 213, 204, 230, 82, 51, 135, 147, 26, 170, 188, 102, 14, + 39, 53, 84, 108, 205, 28, 78, 106, 168, 190, 154, 57, 156, 212, 80, 73, 53, 83, 5, 212, 80, + 21, 53, 83, 5, 212, 80, 224, 53, 115, 140, 169, 161, 88, 107, 102, 177, 214, 80, 172, 53, + 179, 88, 107, 40, 167, 154, 89, 78, 53, 116, 205, 154, 217, 53, 107, 102, 215, 172, 153, 93, + 179, 134, 98, 173, 153, 106, 94, 161, 240, 84, 103, 140, 14, 171, 201, 225, 46, 77, 113, 66, + 69, 161, 151, 42, 115, 204, 86, 232, 139, 202, 28, 179, 21, 122, 156, 50, 11, 25, 43, 54, 7, + 43, 53, 71, 165, 209, 226, 0, 9, 86, 106, 14, 86, 106, 14, 86, 106, 14, 206, 172, 57, 56, + 179, 230, 224, 204, 154, 131, 51, 107, 14, 206, 172, 57, 56, 179, 230, 224, 204, 154, 131, + 51, 107, 14, 206, 172, 57, 56, 179, 230, 224, 204, 154, 147, 102, 11, 235, 34, 39, 93, 23, + 225, 204, 154, 83, 7, 126, 29, 184, 33, 170, 41, 52, 213, 119, 104, 170, 239, 208, 84, 223, + 33, 42, 48, 52, 213, 119, 104, 170, 239, 208, 84, 223, 33, 122, 76, 104, 246, 152, 208, 236, + 49, 161, 217, 99, 194, 52, 81, 137, 113, 176, 154, 14, 90, 53, 83, 105, 214, 18, 165, 137, + 133, 173, 147, 237, 175, 56, 217, 254, 138, 147, 217, 100, 157, 108, 127, 197, 145, 201, + 161, 186, 120, 0, 104, 77, 183, 70, 71, 91, 39, 165, 238, 40, 105, 240, 75, 112, 147, 3, + 183, 154, 214, 201, 84, 99, 182, 49, 182, 97, 255, 120, 178, 178, 215, 94, 97, 103, 103, + 203, 237, 222, 80, 115, 187, 55, 212, 220, 238, 13, 53, 183, 123, 67, 205, 237, 222, 80, + 115, 205, 13, 181, 170, 221, 181, 161, 6, 15, 35, 132, 211, 29, 194, 233, 14, 225, 118, 135, + 112, 187, 67, 120, 221, 33, 188, 44, 4, 106, 73, 110, 104, 79, 239, 110, 195, 225, 198, 14, + 35, 201, 86, 119, 30, 140, 190, 100, 225, 200, 134, 229, 193, 230, 225, 193, 230, 225, 193, + 230, 225, 193, 230, 225, 193, 230, 225, 193, 230, 225, 193, 230, 225, 193, 230, 225, 193, + 230, 225, 193, 230, 225, 165, 22, 129, 26, 40, 108, 46, 30, 108, 46, 56, 45, 107, 249, 192, + 133, 69, 195, 242, 129, 231, 3, 15, 22, 14, 11, 22, 14, 11, 71, 191, 44, 31, 120, 176, 120, + 88, 176, 120, 88, 176, 120, 88, 176, 120, 88, 126, 138, 7, 27, 15, 44, 32, 22, 44, 32, 86, + 0, 188, 0, 120, 1, 240, 2, 224, 5, 192, 11, 128, 23, 0, 47, 0, 94, 0, 188, 0, 120, 176, 168, + 88, 176, 160, 88, 176, 160, 88, 176, 160, 88, 56, 229, 107, 225, 148, 175, 133, 83, 190, 22, + 78, 249, 90, 176, 176, 88, 176, 176, 88, 176, 176, 88, 169, 133, 5, 167, 125, 45, 156, 246, + 181, 170, 41, 30, 242, 135, 211, 190, 22, 78, 251, 90, 56, 237, 107, 225, 180, 175, 85, 3, + 126, 13, 248, 53, 224, 215, 128, 95, 3, 126, 13, 248, 53, 224, 215, 128, 95, 3, 62, 52, 163, + 5, 205, 104, 169, 16, 22, 43, 55, 181, 109, 37, 254, 208, 148, 22, 52, 165, 5, 77, 105, 65, + 83, 90, 208, 148, 22, 52, 165, 5, 77, 105, 65, 83, 90, 208, 148, 22, 52, 165, 5, 77, 105, + 65, 83, 90, 117, 164, 7, 26, 211, 170, 35, 61, 117, 148, 7, 78, 1, 91, 56, 5, 108, 225, 20, + 176, 133, 83, 192, 22, 142, 64, 90, 56, 2, 105, 133, 192, 15, 129, 31, 2, 63, 76, 240, 121, + 114, 225, 80, 83, 11, 148, 131, 10, 80, 9, 106, 131, 58, 160, 46, 168, 7, 154, 198, 23, 128, + 86, 65, 107, 160, 10, 180, 14, 10, 203, 26, 110, 53, 112, 220, 106, 224, 184, 213, 192, 113, + 171, 129, 227, 86, 3, 199, 173, 6, 142, 211, 231, 220, 114, 217, 165, 230, 237, 167, 25, + 195, 129, 16, 72, 9, 206, 191, 114, 220, 111, 224, 184, 223, 192, 113, 191, 129, 227, 92, + 44, 199, 253, 6, 142, 123, 13, 28, 247, 26, 56, 238, 53, 112, 220, 107, 224, 184, 215, 192, + 113, 175, 129, 227, 94, 3, 199, 189, 6, 142, 123, 13, 156, 87, 209, 130, 196, 113, 45, 136, + 227, 158, 3, 199, 61, 7, 142, 123, 14, 28, 247, 28, 56, 238, 57, 112, 220, 115, 224, 184, + 231, 192, 113, 207, 129, 227, 28, 46, 199, 57, 92, 142, 115, 184, 220, 78, 223, 35, 189, + 176, 240, 113, 220, 7, 224, 184, 15, 192, 113, 31, 128, 227, 30, 0, 199, 61, 0, 142, 123, 0, + 220, 70, 186, 112, 31, 128, 227, 62, 0, 199, 57, 95, 142, 115, 190, 28, 231, 124, 57, 206, + 249, 114, 156, 243, 229, 56, 231, 203, 113, 206, 151, 227, 156, 47, 199, 57, 95, 142, 115, + 190, 28, 231, 124, 57, 206, 249, 114, 7, 248, 14, 240, 29, 224, 59, 192, 135, 165, 146, 187, + 192, 119, 129, 239, 2, 223, 5, 62, 78, 7, 115, 23, 248, 56, 28, 204, 93, 224, 187, 192, 119, + 129, 239, 2, 223, 5, 190, 11, 124, 23, 248, 46, 240, 49, 178, 112, 140, 44, 28, 35, 11, 199, + 200, 194, 49, 178, 112, 140, 44, 28, 35, 11, 199, 200, 194, 49, 178, 112, 140, 44, 28, 35, + 11, 199, 200, 194, 49, 178, 112, 140, 44, 28, 35, 11, 79, 109, 208, 24, 97, 56, 70, 24, 14, + 219, 57, 199, 72, 195, 49, 210, 112, 140, 52, 28, 35, 13, 199, 72, 195, 49, 210, 112, 140, + 52, 28, 35, 13, 199, 72, 195, 49, 210, 112, 140, 52, 28, 35, 13, 199, 72, 195, 3, 224, 195, + 62, 193, 49, 242, 112, 140, 60, 28, 35, 15, 199, 200, 195, 49, 242, 112, 140, 60, 28, 35, + 15, 199, 200, 195, 49, 242, 112, 140, 60, 28, 35, 15, 199, 200, 195, 97, 187, 231, 24, 121, + 56, 70, 30, 142, 145, 135, 99, 228, 225, 24, 121, 56, 70, 30, 142, 145, 135, 99, 228, 225, + 24, 121, 56, 70, 30, 142, 145, 135, 99, 228, 225, 213, 20, 15, 249, 197, 200, 195, 49, 242, + 112, 140, 60, 28, 35, 15, 199, 200, 195, 49, 242, 112, 140, 60, 28, 35, 13, 199, 8, 195, 49, + 194, 112, 140, 48, 28, 187, 52, 28, 187, 52, 28, 187, 52, 28, 187, 52, 28, 187, 52, 28, 187, + 52, 28, 187, 52, 28, 115, 126, 142, 93, 26, 142, 185, 63, 199, 220, 159, 99, 196, 226, 152, + 203, 115, 140, 80, 28, 35, 20, 199, 8, 197, 49, 66, 113, 140, 80, 28, 35, 20, 199, 8, 197, + 49, 66, 113, 140, 80, 28, 35, 20, 199, 8, 197, 49, 66, 113, 140, 80, 28, 35, 20, 175, 215, + 151, 34, 62, 60, 78, 151, 219, 237, 114, 123, 93, 110, 223, 112, 59, 17, 237, 114, 59, 93, + 110, 183, 203, 237, 117, 185, 147, 251, 20, 255, 156, 22, 183, 43, 110, 119, 145, 247, 110, + 151, 219, 235, 114, 155, 113, 155, 97, 189, 174, 184, 189, 174, 184, 189, 69, 194, 123, 93, + 110, 51, 110, 243, 157, 223, 21, 183, 223, 21, 183, 223, 21, 183, 191, 136, 188, 25, 119, + 90, 222, 78, 90, 7, 93, 110, 167, 203, 237, 118, 185, 189, 46, 119, 26, 183, 211, 21, 215, + 98, 110, 183, 203, 237, 117, 185, 205, 180, 185, 93, 242, 110, 87, 218, 220, 174, 248, 220, + 174, 248, 220, 174, 180, 153, 97, 189, 174, 184, 189, 174, 184, 189, 69, 194, 123, 93, 110, + 51, 110, 243, 157, 223, 21, 183, 223, 21, 183, 223, 21, 183, 191, 136, 188, 25, 119, 90, 38, + 110, 87, 125, 165, 110, 167, 203, 237, 118, 185, 189, 46, 119, 26, 183, 219, 21, 151, 179, + 136, 219, 233, 114, 187, 93, 110, 175, 203, 109, 198, 109, 202, 118, 99, 45, 246, 222, 235, + 114, 155, 249, 246, 186, 228, 189, 46, 121, 175, 43, 109, 94, 87, 124, 94, 87, 218, 204, + 119, 126, 87, 220, 126, 87, 220, 126, 87, 220, 254, 34, 242, 102, 220, 105, 186, 189, 174, + 250, 74, 221, 78, 151, 219, 237, 114, 123, 93, 238, 52, 110, 175, 43, 46, 103, 17, 183, 211, + 229, 118, 187, 220, 94, 151, 219, 140, 219, 148, 117, 187, 226, 118, 23, 121, 239, 118, 185, + 189, 46, 183, 25, 183, 25, 182, 59, 31, 221, 216, 139, 133, 55, 203, 212, 239, 146, 247, + 187, 228, 253, 46, 121, 191, 43, 109, 126, 87, 218, 210, 184, 253, 174, 250, 74, 221, 78, + 151, 219, 237, 114, 123, 93, 238, 52, 110, 191, 43, 46, 103, 17, 183, 211, 229, 118, 187, + 220, 94, 151, 219, 140, 219, 148, 117, 187, 226, 118, 23, 121, 239, 118, 185, 189, 46, 183, + 25, 183, 25, 214, 235, 138, 219, 235, 138, 219, 91, 36, 188, 215, 229, 54, 227, 54, 223, + 117, 151, 81, 119, 190, 186, 211, 18, 203, 199, 243, 14, 129, 149, 170, 192, 10, 85, 96, + 133, 42, 176, 66, 21, 88, 161, 138, 74, 26, 62, 0, 173, 130, 214, 64, 21, 104, 29, 52, 153, + 71, 9, 172, 76, 5, 86, 166, 2, 43, 83, 129, 149, 169, 192, 202, 84, 96, 101, 42, 176, 50, + 21, 184, 111, 47, 112, 223, 94, 224, 190, 189, 192, 122, 84, 96, 61, 42, 176, 30, 21, 88, + 143, 10, 172, 71, 5, 214, 163, 2, 235, 81, 129, 251, 154, 2, 235, 82, 129, 245, 168, 192, + 122, 84, 96, 61, 42, 176, 30, 21, 88, 143, 10, 172, 71, 5, 214, 163, 2, 247, 236, 5, 214, + 159, 2, 235, 79, 129, 245, 167, 192, 250, 83, 96, 253, 41, 176, 254, 20, 88, 127, 10, 172, + 63, 5, 238, 217, 11, 220, 179, 23, 184, 103, 47, 112, 207, 94, 224, 158, 189, 192, 61, 123, + 129, 123, 246, 2, 247, 236, 5, 238, 217, 11, 220, 179, 23, 184, 103, 47, 112, 207, 94, 224, + 94, 170, 192, 61, 123, 129, 123, 246, 2, 247, 236, 5, 238, 217, 11, 220, 179, 23, 184, 103, + 47, 112, 207, 94, 224, 158, 189, 192, 61, 123, 129, 123, 246, 2, 247, 92, 5, 238, 185, 10, + 220, 115, 21, 184, 231, 42, 112, 207, 85, 96, 157, 43, 176, 206, 21, 88, 231, 10, 172, 115, + 5, 214, 185, 2, 235, 92, 129, 117, 174, 192, 58, 87, 96, 157, 43, 176, 206, 21, 88, 231, 10, + 172, 115, 5, 214, 185, 2, 235, 92, 129, 117, 174, 192, 58, 87, 96, 29, 43, 176, 142, 21, 88, + 167, 10, 172, 19, 4, 214, 9, 2, 235, 4, 129, 117, 130, 192, 58, 65, 96, 157, 32, 176, 78, + 16, 88, 39, 8, 236, 17, 8, 236, 17, 8, 149, 198, 139, 116, 97, 143, 64, 192, 18, 38, 176, + 174, 16, 88, 87, 8, 172, 43, 4, 214, 21, 2, 235, 10, 129, 117, 133, 192, 186, 66, 96, 93, + 33, 176, 174, 16, 88, 87, 136, 180, 223, 98, 93, 33, 176, 174, 16, 88, 87, 8, 172, 43, 4, + 214, 21, 2, 150, 47, 1, 203, 151, 128, 229, 75, 192, 242, 37, 96, 249, 18, 176, 124, 9, 88, + 190, 4, 44, 95, 34, 76, 191, 187, 129, 51, 96, 232, 231, 18, 246, 19, 9, 59, 135, 68, 125, + 75, 212, 183, 68, 125, 75, 212, 183, 68, 125, 75, 212, 183, 68, 125, 75, 212, 183, 68, 125, + 75, 212, 183, 68, 125, 75, 212, 183, 68, 125, 75, 39, 197, 195, 25, 53, 212, 183, 132, 93, + 67, 194, 174, 33, 97, 215, 144, 176, 107, 72, 180, 7, 137, 246, 32, 97, 215, 144, 176, 107, + 72, 216, 53, 36, 236, 26, 18, 237, 69, 194, 174, 33, 97, 215, 144, 174, 90, 58, 122, 213, + 244, 248, 196, 196, 248, 232, 11, 90, 179, 209, 95, 23, 133, 63, 210, 3, 59, 135, 132, 157, + 67, 194, 206, 33, 97, 231, 144, 176, 115, 72, 216, 57, 36, 236, 28, 18, 118, 14, 9, 251, + 134, 132, 125, 67, 194, 190, 33, 97, 223, 144, 176, 111, 72, 216, 55, 36, 236, 27, 210, 75, + 191, 55, 129, 120, 97, 191, 144, 176, 87, 72, 216, 43, 36, 236, 17, 18, 246, 8, 9, 123, 132, + 132, 61, 66, 194, 254, 32, 97, 127, 144, 176, 63, 72, 216, 31, 36, 236, 15, 18, 246, 7, 9, + 251, 131, 132, 253, 65, 194, 254, 32, 97, 127, 144, 176, 47, 72, 216, 23, 36, 236, 11, 18, + 246, 5, 9, 251, 129, 172, 166, 225, 145, 62, 216, 15, 36, 236, 7, 18, 246, 3, 9, 251, 129, + 132, 253, 64, 194, 126, 32, 97, 63, 144, 176, 92, 75, 88, 174, 37, 236, 9, 18, 150, 107, 9, + 187, 130, 132, 93, 65, 194, 174, 32, 97, 87, 144, 181, 122, 178, 249, 196, 83, 13, 42, 85, + 74, 145, 2, 104, 12, 9, 141, 33, 161, 49, 36, 52, 134, 132, 198, 144, 208, 24, 18, 26, 66, + 66, 67, 72, 104, 8, 9, 13, 33, 161, 33, 36, 52, 132, 132, 134, 144, 208, 16, 18, 26, 66, 66, + 67, 72, 104, 8, 9, 13, 33, 161, 33, 36, 52, 132, 132, 70, 144, 208, 8, 18, 26, 65, 66, 35, + 72, 104, 4, 9, 141, 32, 161, 17, 36, 52, 130, 132, 70, 144, 208, 8, 18, 26, 65, 66, 35, 72, + 216, 190, 37, 108, 223, 248, 216, 158, 166, 248, 162, 6, 102, 20, 54, 108, 223, 54, 102, 22, + 54, 102, 22, 54, 102, 22, 54, 102, 22, 54, 102, 22, 118, 37, 141, 15, 95, 234, 192, 12, 3, + 31, 239, 211, 20, 95, 10, 193, 12, 195, 198, 12, 195, 134, 37, 207, 134, 37, 207, 134, 37, + 207, 70, 79, 176, 209, 19, 108, 88, 242, 108, 88, 242, 108, 244, 12, 27, 61, 195, 134, 37, + 207, 134, 37, 207, 134, 37, 207, 134, 37, 207, 70, 207, 177, 209, 115, 108, 244, 28, 124, + 21, 78, 83, 224, 162, 7, 217, 232, 65, 54, 122, 144, 141, 30, 100, 163, 7, 217, 232, 65, + 248, 154, 92, 5, 95, 147, 211, 20, 184, 232, 65, 54, 246, 142, 236, 32, 253, 114, 139, 132, + 69, 92, 166, 167, 128, 13, 183, 101, 184, 197, 34, 110, 207, 112, 71, 183, 239, 92, 195, 93, + 235, 114, 203, 52, 124, 132, 107, 213, 147, 122, 214, 212, 2, 229, 160, 2, 84, 130, 218, + 160, 14, 168, 11, 234, 129, 250, 160, 1, 104, 21, 180, 6, 170, 64, 235, 160, 97, 66, 45, + 224, 91, 192, 183, 128, 111, 1, 223, 2, 190, 5, 124, 11, 248, 22, 240, 45, 224, 91, 192, + 183, 128, 111, 1, 223, 2, 190, 5, 124, 11, 248, 22, 240, 57, 240, 57, 240, 57, 240, 57, 240, + 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, 57, 240, + 57, 240, 57, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, + 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 5, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, + 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, 240, 37, + 240, 37, 240, 109, 224, 219, 192, 183, 129, 111, 3, 223, 6, 190, 13, 124, 27, 248, 54, 240, + 109, 224, 219, 192, 183, 129, 111, 3, 223, 6, 190, 13, 124, 27, 248, 54, 240, 29, 224, 59, + 192, 119, 128, 239, 0, 223, 1, 190, 3, 124, 7, 248, 14, 240, 29, 224, 59, 192, 119, 128, + 239, 0, 223, 1, 190, 3, 124, 7, 248, 14, 240, 93, 224, 187, 192, 119, 129, 239, 2, 223, 5, + 190, 11, 124, 23, 248, 46, 240, 93, 224, 187, 192, 119, 129, 239, 2, 223, 5, 190, 11, 124, + 23, 248, 46, 240, 61, 196, 231, 33, 62, 15, 241, 121, 136, 207, 67, 124, 30, 226, 243, 16, + 159, 135, 248, 60, 196, 231, 33, 62, 31, 249, 241, 145, 31, 31, 249, 241, 145, 31, 31, 249, + 241, 145, 31, 31, 248, 62, 240, 125, 224, 251, 192, 247, 129, 159, 232, 111, 43, 132, 190, + 10, 161, 175, 66, 232, 171, 16, 250, 42, 132, 190, 10, 161, 175, 66, 232, 171, 16, 250, 42, + 132, 190, 10, 161, 175, 66, 232, 171, 176, 146, 198, 95, 3, 85, 160, 117, 208, 36, 127, 33, + 244, 85, 8, 125, 21, 66, 95, 133, 208, 87, 33, 244, 85, 8, 125, 21, 66, 63, 133, 208, 79, + 33, 244, 83, 8, 253, 20, 66, 63, 133, 208, 79, 33, 244, 81, 8, 125, 20, 66, 31, 133, 208, + 71, 33, 244, 81, 8, 125, 20, 66, 31, 133, 208, 71, 33, 244, 81, 8, 125, 20, 66, 31, 133, + 208, 71, 33, 244, 81, 200, 83, 60, 228, 15, 250, 40, 132, 62, 10, 161, 143, 66, 232, 163, + 16, 250, 40, 132, 62, 10, 161, 143, 66, 232, 163, 16, 250, 40, 132, 62, 10, 161, 143, 66, + 232, 163, 16, 250, 40, 132, 62, 10, 161, 143, 66, 232, 163, 16, 250, 40, 132, 62, 10, 161, + 143, 66, 232, 163, 16, 250, 40, 132, 62, 10, 161, 143, 66, 232, 159, 16, 250, 39, 132, 254, + 9, 161, 127, 66, 232, 159, 16, 250, 39, 132, 190, 9, 161, 111, 66, 232, 155, 16, 250, 38, + 132, 190, 9, 161, 111, 66, 232, 155, 16, 250, 38, 132, 158, 9, 161, 95, 66, 59, 141, 23, + 233, 135, 62, 9, 161, 79, 66, 232, 147, 16, 250, 36, 132, 62, 9, 161, 79, 66, 232, 147, 16, + 250, 36, 132, 62, 9, 161, 79, 66, 232, 147, 16, 250, 36, 132, 62, 9, 161, 79, 66, 232, 147, + 16, 250, 36, 132, 62, 9, 161, 79, 66, 232, 147, 16, 250, 36, 132, 62, 9, 161, 79, 66, 232, + 147, 16, 250, 36, 132, 62, 9, 161, 79, 66, 232, 147, 16, 250, 36, 132, 62, 9, 161, 79, 66, + 15, 120, 30, 240, 60, 224, 121, 192, 243, 128, 231, 1, 15, 250, 38, 132, 190, 9, 161, 111, + 66, 232, 155, 16, 250, 38, 132, 190, 9, 161, 111, 66, 47, 197, 67, 126, 161, 111, 66, 232, + 155, 16, 250, 38, 132, 190, 9, 161, 111, 66, 232, 155, 16, 250, 38, 132, 190, 9, 161, 111, + 66, 232, 155, 16, 250, 38, 132, 190, 9, 83, 125, 227, 3, 223, 7, 190, 15, 124, 31, 248, 1, + 240, 3, 224, 7, 192, 15, 128, 31, 0, 63, 0, 126, 0, 252, 0, 248, 1, 240, 3, 224, 7, 192, 15, + 128, 31, 0, 63, 0, 126, 0, 252, 0, 248, 85, 224, 87, 129, 95, 5, 126, 21, 248, 85, 224, 87, + 129, 91, 5, 110, 21, 184, 85, 224, 86, 129, 91, 5, 110, 21, 184, 85, 224, 86, 129, 91, 5, + 110, 13, 184, 53, 224, 214, 128, 91, 3, 110, 13, 184, 53, 224, 214, 128, 91, 3, 110, 13, + 184, 53, 224, 214, 128, 91, 3, 110, 13, 184, 53, 224, 214, 128, 171, 128, 171, 128, 171, + 128, 171, 128, 171, 128, 167, 128, 167, 128, 167, 128, 167, 128, 167, 128, 167, 128, 163, + 128, 163, 128, 83, 7, 78, 29, 56, 117, 224, 212, 129, 83, 71, 254, 234, 168, 215, 58, 112, + 235, 192, 173, 3, 183, 14, 220, 58, 112, 235, 192, 173, 35, 159, 117, 224, 215, 129, 95, 7, + 126, 8, 188, 16, 120, 33, 240, 66, 224, 132, 192, 9, 129, 19, 2, 39, 4, 78, 8, 156, 16, 56, + 33, 112, 66, 124, 50, 43, 105, 183, 154, 226, 11, 150, 73, 187, 213, 20, 159, 224, 74, 218, + 169, 166, 30, 168, 15, 138, 79, 113, 5, 105, 60, 201, 167, 183, 28, 124, 130, 203, 78, 234, + 47, 196, 188, 58, 196, 188, 58, 196, 188, 90, 83, 193, 118, 53, 166, 199, 55, 236, 110, 205, + 78, 52, 103, 102, 138, 47, 76, 185, 36, 186, 42, 146, 149, 30, 108, 224, 233, 65, 31, 108, + 204, 195, 176, 202, 69, 122, 128, 2, 27, 252, 65, 186, 193, 15, 138, 229, 47, 199, 242, 151, + 99, 249, 203, 177, 252, 229, 88, 254, 114, 44, 127, 57, 12, 98, 28, 71, 193, 56, 150, 195, + 60, 61, 10, 22, 98, 163, 63, 196, 70, 127, 136, 141, 126, 156, 147, 229, 33, 210, 17, 194, + 32, 7, 67, 154, 192, 65, 36, 129, 131, 72, 2, 7, 145, 4, 14, 34, 9, 28, 68, 18, 56, 136, 36, + 112, 16, 73, 192, 0, 39, 112, 208, 72, 216, 169, 161, 15, 239, 81, 237, 10, 211, 33, 133, + 233, 144, 194, 116, 72, 97, 58, 164, 48, 29, 82, 152, 14, 41, 76, 135, 20, 166, 67, 170, + 146, 198, 227, 131, 6, 160, 85, 208, 26, 168, 2, 173, 131, 38, 205, 84, 97, 58, 164, 48, 29, + 82, 152, 14, 41, 76, 135, 20, 166, 67, 10, 211, 33, 133, 229, 155, 194, 242, 77, 97, 122, + 164, 48, 61, 82, 152, 30, 41, 76, 143, 20, 166, 71, 10, 211, 35, 133, 229, 155, 194, 242, + 77, 97, 186, 164, 48, 93, 82, 152, 46, 41, 76, 151, 20, 166, 75, 10, 211, 37, 133, 233, 146, + 194, 116, 73, 97, 186, 164, 48, 93, 82, 152, 46, 41, 76, 151, 20, 166, 75, 10, 211, 37, 133, + 233, 146, 194, 116, 73, 97, 186, 164, 48, 93, 82, 152, 46, 41, 76, 151, 20, 166, 75, 10, + 211, 37, 133, 233, 146, 194, 116, 73, 97, 186, 164, 48, 93, 82, 152, 46, 41, 76, 151, 20, + 166, 75, 10, 211, 37, 124, 149, 77, 83, 224, 99, 186, 164, 48, 93, 82, 152, 46, 41, 76, 151, + 20, 166, 75, 10, 211, 37, 133, 229, 155, 194, 242, 77, 97, 250, 164, 48, 125, 82, 152, 62, + 41, 76, 159, 20, 166, 79, 10, 211, 39, 133, 229, 155, 194, 242, 77, 97, 58, 165, 48, 157, + 82, 152, 78, 41, 76, 167, 20, 166, 83, 10, 211, 41, 133, 233, 148, 194, 116, 74, 97, 249, + 166, 48, 173, 82, 88, 190, 41, 76, 175, 20, 150, 111, 10, 211, 44, 133, 229, 155, 194, 116, + 75, 97, 186, 165, 48, 221, 82, 152, 110, 41, 76, 183, 20, 166, 91, 10, 211, 45, 133, 233, + 150, 194, 116, 75, 97, 186, 165, 48, 221, 82, 233, 7, 54, 97, 254, 114, 96, 254, 114, 96, + 254, 114, 96, 254, 114, 96, 174, 114, 96, 190, 114, 210, 15, 139, 98, 99, 204, 193, 198, + 152, 131, 141, 49, 7, 27, 99, 142, 149, 94, 49, 198, 37, 1, 244, 119, 39, 253, 50, 16, 247, + 253, 244, 122, 1, 174, 93, 212, 205, 11, 144, 117, 92, 174, 168, 155, 151, 43, 66, 120, 134, + 230, 69, 150, 208, 188, 200, 18, 118, 46, 178, 232, 9, 130, 5, 202, 65, 5, 168, 4, 181, 65, + 113, 61, 3, 223, 13, 169, 226, 187, 33, 85, 142, 111, 178, 86, 163, 111, 178, 42, 240, 220, + 224, 69, 250, 125, 98, 142, 143, 167, 112, 124, 252, 132, 103, 31, 124, 18, 149, 244, 51, + 54, 154, 115, 51, 206, 203, 56, 191, 175, 17, 125, 106, 176, 111, 122, 252, 170, 198, 68, + 34, 139, 63, 255, 81, 169, 96, 196, 194, 159, 1, 169, 36, 85, 162, 41, 190, 241, 139, 191, + 239, 128, 15, 205, 112, 124, 104, 70, 83, 140, 100, 21, 140, 100, 137, 170, 227, 248, 24, + 36, 183, 210, 189, 73, 168, 124, 1, 149, 47, 48, 146, 170, 244, 44, 38, 246, 240, 56, 246, + 240, 56, 246, 240, 184, 72, 223, 99, 104, 192, 30, 30, 199, 30, 30, 199, 30, 30, 135, 5, + 154, 167, 123, 120, 56, 115, 42, 112, 143, 94, 224, 236, 169, 192, 217, 83, 129, 179, 167, + 34, 76, 41, 134, 6, 12, 57, 34, 76, 45, 190, 176, 24, 135, 169, 69, 50, 253, 230, 52, 44, + 145, 176, 165, 219, 176, 165, 219, 176, 165, 59, 149, 244, 27, 184, 104, 210, 72, 135, 131, + 116, 56, 72, 135, 131, 116, 56, 24, 154, 28, 187, 78, 80, 91, 174, 184, 96, 48, 242, 114, + 237, 202, 5, 105, 13, 166, 31, 144, 18, 217, 7, 164, 52, 231, 34, 152, 213, 9, 230, 167, 92, + 250, 253, 40, 205, 89, 8, 198, 179, 96, 233, 231, 163, 68, 246, 249, 40, 205, 217, 8, 38, + 58, 193, 178, 166, 228, 101, 77, 201, 243, 17, 76, 102, 193, 210, 143, 71, 137, 236, 227, + 81, 154, 19, 8, 102, 119, 130, 101, 89, 240, 179, 44, 248, 105, 22, 156, 78, 176, 52, 11, + 217, 167, 163, 52, 151, 102, 193, 189, 32, 243, 18, 25, 39, 51, 46, 205, 130, 215, 9, 230, + 102, 156, 151, 113, 105, 22, 252, 11, 80, 228, 150, 101, 165, 69, 30, 116, 252, 178, 106, + 168, 118, 252, 236, 212, 175, 150, 65, 100, 29, 46, 251, 110, 148, 230, 82, 8, 149, 5, 75, + 63, 27, 37, 178, 207, 70, 105, 46, 45, 165, 122, 39, 152, 157, 113, 78, 198, 165, 165, 20, + 118, 130, 101, 165, 36, 178, 82, 18, 40, 37, 39, 107, 54, 150, 200, 74, 41, 83, 21, 150, 64, + 41, 57, 86, 39, 88, 150, 5, 145, 101, 65, 32, 11, 78, 214, 108, 44, 153, 101, 65, 102, 89, + 144, 200, 130, 35, 58, 193, 178, 44, 200, 44, 11, 18, 89, 112, 100, 39, 88, 150, 5, 59, 203, + 130, 157, 102, 33, 107, 54, 150, 157, 101, 193, 206, 178, 96, 167, 89, 112, 58, 193, 178, + 44, 216, 89, 22, 208, 245, 92, 39, 123, 231, 100, 57, 112, 178, 28, 56, 105, 14, 58, 173, + 198, 201, 114, 224, 100, 57, 112, 210, 28, 248, 157, 96, 89, 14, 220, 44, 7, 110, 154, 131, + 32, 11, 230, 102, 57, 112, 179, 28, 184, 105, 14, 58, 109, 203, 117, 209, 182, 156, 90, 199, + 207, 79, 253, 58, 13, 201, 203, 242, 224, 101, 121, 240, 210, 241, 25, 227, 59, 204, 25, 10, + 230, 12, 5, 115, 134, 130, 57, 67, 193, 156, 161, 96, 206, 80, 48, 103, 40, 152, 51, 20, + 204, 25, 10, 230, 12, 5, 115, 134, 130, 57, 67, 193, 156, 161, 96, 206, 80, 48, 103, 40, + 152, 51, 20, 204, 25, 10, 230, 81, 5, 243, 168, 130, 121, 67, 193, 188, 161, 96, 222, 80, + 105, 250, 97, 222, 80, 48, 111, 40, 152, 55, 20, 204, 27, 10, 230, 13, 5, 243, 134, 130, + 121, 67, 193, 188, 161, 96, 222, 80, 48, 111, 40, 152, 55, 20, 204, 27, 10, 230, 13, 5, 243, + 134, 130, 121, 67, 193, 188, 161, 96, 222, 80, 48, 111, 40, 152, 55, 20, 204, 27, 10, 230, + 13, 5, 243, 134, 130, 121, 67, 193, 188, 161, 96, 222, 80, 48, 111, 40, 152, 55, 20, 204, + 27, 10, 230, 13, 5, 243, 134, 130, 121, 67, 193, 188, 161, 96, 222, 80, 48, 111, 40, 152, + 55, 20, 204, 27, 10, 230, 13, 5, 243, 134, 130, 121, 67, 193, 188, 161, 96, 222, 80, 48, + 111, 40, 152, 55, 20, 204, 27, 10, 230, 13, 5, 243, 134, 130, 121, 67, 193, 188, 161, 96, + 222, 80, 85, 224, 195, 204, 161, 96, 230, 80, 48, 115, 40, 152, 57, 20, 204, 28, 10, 102, + 14, 5, 51, 135, 130, 153, 67, 193, 204, 161, 96, 230, 80, 48, 115, 40, 152, 57, 20, 204, 28, + 170, 134, 73, 7, 254, 150, 87, 197, 199, 228, 36, 253, 131, 16, 62, 38, 39, 62, 194, 249, + 152, 156, 84, 225, 95, 133, 127, 53, 245, 79, 38, 45, 245, 76, 55, 243, 108, 200, 227, 217, + 144, 199, 211, 47, 38, 106, 206, 201, 184, 142, 132, 151, 113, 105, 63, 231, 233, 23, 19, + 53, 103, 101, 28, 207, 184, 12, 195, 207, 48, 178, 81, 143, 103, 163, 30, 247, 51, 12, 63, + 195, 200, 134, 61, 145, 13, 123, 34, 253, 98, 162, 230, 120, 198, 137, 140, 147, 25, 103, + 103, 156, 147, 113, 110, 198, 121, 25, 151, 97, 88, 25, 134, 149, 97, 88, 25, 134, 149, 97, + 88, 114, 8, 218, 236, 248, 139, 148, 169, 71, 54, 107, 230, 56, 58, 197, 113, 116, 138, 227, + 232, 20, 199, 209, 41, 142, 163, 83, 28, 71, 167, 56, 142, 78, 113, 28, 157, 226, 56, 58, + 197, 113, 116, 138, 227, 232, 20, 199, 209, 41, 142, 163, 83, 60, 61, 58, 133, 35, 39, 2, + 71, 78, 132, 155, 30, 77, 72, 167, 111, 216, 224, 135, 133, 65, 98, 186, 39, 49, 221, 147, + 152, 238, 73, 76, 247, 240, 87, 239, 52, 197, 70, 53, 86, 26, 118, 186, 242, 134, 1, 78, + 213, 208, 51, 96, 136, 83, 48, 196, 41, 24, 226, 20, 12, 113, 10, 134, 56, 21, 162, 7, 36, + 56, 220, 74, 242, 163, 105, 210, 210, 113, 73, 148, 215, 240, 87, 235, 106, 248, 171, 117, + 53, 252, 213, 186, 26, 254, 106, 93, 205, 73, 195, 217, 160, 14, 168, 11, 234, 129, 250, + 160, 1, 104, 21, 52, 249, 118, 123, 205, 69, 60, 46, 226, 113, 17, 79, 162, 225, 3, 215, 74, + 169, 7, 234, 131, 6, 9, 77, 44, 4, 154, 102, 237, 198, 171, 28, 220, 122, 93, 80, 42, 188, + 39, 119, 183, 126, 242, 185, 33, 253, 59, 172, 159, 3, 250, 41, 228, 70, 10, 239, 89, 24, + 40, 241, 145, 67, 154, 158, 184, 44, 166, 243, 203, 215, 241, 195, 143, 31, 209, 204, 147, + 68, 236, 191, 254, 245, 252, 186, 251, 10, 119, 229, 94, 144, 19, 218, 251, 174, 249, 109, + 145, 247, 93, 11, 35, 138, 199, 84, 92, 144, 208, 243, 173, 152, 206, 15, 38, 175, 7, 150, + 241, 114, 112, 170, 22, 59, 95, 63, 249, 220, 82, 112, 155, 245, 243, 106, 253, 220, 170, + 159, 7, 244, 211, 175, 19, 116, 87, 238, 123, 250, 121, 92, 63, 133, 194, 157, 133, 219, + 230, 195, 178, 142, 225, 118, 29, 209, 210, 96, 89, 225, 246, 92, 143, 78, 229, 237, 185, + 135, 244, 243, 184, 126, 10, 58, 245, 183, 235, 188, 220, 158, 123, 12, 62, 189, 58, 85, + 239, 92, 40, 178, 8, 254, 157, 177, 212, 105, 133, 119, 106, 169, 165, 250, 119, 72, 63, + 215, 233, 231, 110, 253, 60, 164, 159, 190, 92, 75, 255, 222, 170, 159, 199, 245, 83, 208, + 220, 109, 250, 221, 109, 185, 124, 225, 182, 194, 59, 230, 135, 202, 67, 1, 41, 188, 61, + 119, 173, 126, 242, 133, 183, 228, 150, 246, 244, 228, 202, 58, 246, 55, 45, 12, 197, 101, + 243, 230, 133, 165, 39, 241, 145, 96, 168, 240, 134, 220, 22, 253, 228, 115, 115, 133, 103, + 228, 142, 232, 39, 175, 163, 125, 141, 22, 123, 77, 46, 175, 131, 111, 154, 95, 111, 197, + 69, 184, 105, 129, 44, 225, 67, 58, 252, 77, 58, 209, 55, 233, 132, 220, 164, 33, 15, 232, + 223, 158, 216, 61, 162, 159, 40, 252, 77, 11, 39, 45, 143, 162, 127, 197, 252, 210, 19, 98, + 185, 23, 207, 87, 100, 194, 44, 12, 173, 224, 91, 116, 41, 92, 153, 235, 41, 52, 11, 147, + 185, 149, 185, 114, 225, 26, 77, 207, 212, 116, 84, 211, 51, 52, 221, 85, 216, 157, 43, 197, + 233, 28, 89, 88, 58, 196, 175, 211, 120, 27, 117, 240, 141, 133, 147, 115, 231, 233, 215, + 65, 97, 121, 142, 107, 170, 10, 167, 230, 78, 139, 131, 181, 231, 151, 36, 56, 237, 249, + 115, 215, 114, 157, 227, 90, 97, 69, 28, 100, 105, 161, 148, 147, 154, 14, 22, 6, 230, 121, + 121, 248, 222, 194, 72, 92, 248, 175, 92, 40, 210, 40, 125, 175, 156, 31, 58, 153, 223, 95, + 184, 190, 48, 144, 91, 166, 67, 93, 167, 67, 157, 82, 94, 122, 127, 129, 232, 154, 37, 113, + 78, 182, 46, 20, 75, 252, 150, 128, 21, 182, 234, 108, 110, 213, 197, 82, 214, 105, 236, + 209, 165, 60, 25, 71, 52, 57, 175, 35, 10, 78, 40, 212, 11, 167, 231, 150, 235, 119, 87, 20, + 206, 200, 157, 172, 105, 88, 56, 51, 166, 239, 42, 188, 35, 23, 106, 250, 182, 133, 213, + 167, 151, 143, 220, 91, 120, 93, 44, 245, 218, 40, 82, 13, 127, 97, 210, 180, 46, 92, 40, + 45, 225, 71, 130, 98, 225, 66, 253, 118, 174, 112, 179, 174, 128, 155, 99, 240, 91, 22, 86, + 123, 60, 23, 172, 46, 156, 155, 171, 232, 39, 175, 203, 248, 90, 205, 93, 27, 55, 250, 27, + 53, 119, 163, 174, 181, 27, 117, 77, 221, 168, 107, 234, 70, 157, 168, 27, 117, 235, 203, + 21, 110, 208, 111, 110, 208, 97, 206, 47, 92, 157, 155, 42, 236, 207, 221, 162, 159, 91, 53, + 31, 53, 171, 147, 231, 117, 129, 30, 142, 153, 115, 206, 229, 135, 11, 79, 40, 172, 208, 5, + 51, 116, 175, 46, 202, 30, 237, 123, 234, 66, 113, 73, 148, 178, 21, 243, 39, 158, 20, 7, + 91, 177, 192, 150, 240, 141, 247, 23, 102, 116, 59, 159, 209, 113, 142, 20, 102, 23, 78, 89, + 193, 91, 247, 22, 214, 198, 89, 121, 226, 194, 138, 211, 34, 129, 169, 121, 221, 92, 239, + 47, 156, 146, 84, 141, 22, 92, 30, 85, 201, 253, 133, 211, 117, 65, 68, 5, 115, 70, 225, + 204, 249, 147, 203, 115, 65, 89, 187, 163, 134, 92, 206, 245, 228, 63, 147, 63, 26, 21, 82, + 254, 203, 249, 175, 70, 213, 157, 127, 72, 187, 35, 250, 89, 208, 207, 131, 126, 33, 161, + 143, 31, 201, 31, 77, 58, 69, 254, 75, 17, 61, 22, 156, 158, 255, 145, 142, 236, 5, 249, + 239, 228, 110, 213, 92, 62, 127, 111, 254, 193, 92, 69, 11, 124, 51, 127, 40, 74, 69, 254, + 27, 249, 195, 185, 141, 154, 62, 172, 221, 187, 53, 61, 172, 169, 208, 244, 67, 243, 103, + 125, 170, 124, 40, 127, 104, 65, 19, 157, 246, 183, 206, 151, 150, 71, 153, 205, 63, 56, + 191, 238, 124, 48, 229, 85, 96, 78, 57, 13, 204, 137, 203, 121, 176, 42, 255, 209, 252, 71, + 114, 167, 235, 40, 190, 174, 233, 57, 154, 126, 36, 127, 36, 119, 182, 166, 15, 104, 186, + 66, 211, 35, 249, 217, 220, 167, 52, 253, 64, 222, 206, 93, 160, 233, 251, 65, 63, 150, 191, + 47, 106, 226, 249, 15, 230, 239, 201, 121, 154, 46, 204, 47, 137, 146, 48, 55, 63, 16, 145, + 187, 231, 251, 35, 242, 190, 249, 92, 226, 218, 114, 126, 249, 190, 252, 251, 242, 119, 229, + 78, 213, 65, 223, 59, 191, 250, 84, 237, 123, 231, 194, 234, 115, 202, 75, 239, 213, 241, + 245, 228, 111, 207, 207, 206, 159, 81, 62, 49, 32, 249, 119, 244, 108, 239, 249, 189, 14, + 116, 32, 247, 112, 68, 115, 39, 230, 111, 155, 119, 163, 72, 110, 153, 191, 111, 184, 124, + 56, 127, 75, 254, 150, 145, 21, 238, 200, 170, 145, 245, 35, 119, 20, 42, 171, 42, 235, 43, + 119, 20, 134, 87, 13, 175, 31, 118, 135, 239, 24, 14, 134, 242, 55, 107, 5, 114, 107, 94, + 247, 223, 252, 77, 250, 215, 205, 13, 231, 117, 235, 209, 207, 136, 126, 110, 201, 223, 48, + 223, 235, 206, 5, 255, 208, 121, 138, 242, 149, 207, 93, 167, 127, 15, 196, 220, 78, 253, + 59, 21, 115, 57, 253, 59, 148, 189, 253, 117, 204, 109, 204, 95, 159, 219, 172, 159, 188, + 142, 227, 26, 253, 92, 171, 159, 235, 244, 243, 178, 92, 175, 254, 189, 90, 63, 47, 214, + 207, 75, 244, 243, 210, 216, 103, 86, 63, 109, 253, 236, 215, 218, 100, 74, 75, 76, 105, + 137, 41, 45, 49, 21, 75, 76, 105, 137, 41, 45, 49, 165, 37, 166, 98, 137, 169, 24, 189, 173, + 159, 72, 98, 167, 150, 216, 169, 37, 118, 106, 137, 157, 177, 196, 78, 45, 177, 83, 75, 236, + 212, 18, 59, 99, 137, 40, 189, 59, 181, 196, 206, 88, 98, 139, 150, 216, 162, 37, 182, 104, + 137, 45, 177, 196, 22, 45, 177, 69, 75, 108, 209, 18, 91, 98, 137, 45, 90, 98, 139, 150, + 216, 18, 75, 140, 104, 137, 17, 45, 49, 162, 37, 70, 98, 137, 17, 45, 49, 162, 37, 70, 180, + 196, 72, 44, 49, 162, 37, 70, 180, 196, 72, 44, 81, 209, 18, 21, 45, 81, 209, 18, 149, 88, + 162, 162, 37, 42, 90, 162, 162, 37, 42, 177, 68, 69, 75, 84, 180, 68, 37, 150, 24, 214, 18, + 195, 90, 98, 88, 75, 12, 199, 18, 195, 90, 98, 88, 75, 12, 107, 137, 225, 88, 98, 88, 75, + 12, 107, 137, 225, 88, 98, 72, 75, 12, 105, 137, 33, 45, 49, 20, 75, 12, 105, 137, 33, 45, + 49, 164, 37, 134, 98, 137, 161, 184, 126, 218, 250, 137, 36, 142, 105, 137, 99, 90, 226, + 152, 150, 56, 22, 75, 28, 211, 18, 199, 180, 196, 49, 45, 113, 44, 150, 56, 166, 37, 142, + 105, 137, 99, 249, 253, 7, 11, 71, 131, 143, 107, 145, 163, 90, 228, 168, 22, 57, 26, 139, + 28, 213, 34, 71, 181, 200, 81, 45, 114, 52, 22, 57, 170, 69, 142, 106, 145, 163, 200, 250, + 108, 92, 24, 121, 221, 108, 174, 209, 207, 181, 250, 185, 78, 63, 145, 236, 17, 45, 123, 68, + 203, 30, 209, 178, 71, 98, 217, 35, 113, 243, 106, 235, 39, 146, 157, 211, 18, 115, 90, 98, + 78, 75, 204, 197, 18, 115, 90, 98, 78, 75, 204, 105, 137, 185, 88, 98, 78, 75, 204, 105, + 137, 185, 88, 226, 128, 150, 56, 160, 37, 14, 104, 137, 3, 177, 196, 1, 45, 113, 64, 75, 28, + 208, 18, 7, 98, 137, 3, 113, 195, 109, 235, 39, 146, 248, 191, 55, 202, 255, 115, 213, 228, + 95, 214, 179, 125, 80, 143, 181, 249, 235, 122, 206, 139, 233, 181, 185, 71, 99, 122, 77, + 238, 225, 152, 190, 52, 119, 48, 166, 47, 201, 221, 17, 211, 23, 231, 94, 30, 211, 171, 115, + 110, 76, 247, 231, 86, 199, 84, 199, 23, 211, 217, 92, 121, 176, 103, 190, 236, 46, 13, 150, + 107, 21, 176, 89, 63, 47, 208, 79, 75, 63, 183, 234, 231, 110, 253, 60, 160, 159, 129, 152, + 123, 72, 63, 223, 211, 207, 227, 121, 123, 228, 236, 222, 165, 3, 155, 7, 110, 29, 184, 123, + 224, 129, 129, 190, 187, 7, 142, 13, 228, 151, 246, 111, 238, 191, 181, 255, 238, 254, 7, + 250, 251, 238, 238, 63, 214, 159, 31, 14, 78, 203, 151, 98, 61, 170, 85, 75, 238, 213, 241, + 239, 181, 250, 247, 49, 253, 232, 65, 68, 255, 110, 140, 185, 141, 121, 169, 113, 165, 214, + 179, 182, 254, 79, 230, 229, 200, 9, 191, 28, 126, 108, 109, 207, 67, 107, 123, 30, 88, 219, + 115, 247, 218, 158, 87, 175, 237, 9, 138, 249, 139, 122, 122, 99, 77, 55, 156, 115, 243, 58, + 225, 61, 219, 71, 216, 234, 11, 203, 15, 235, 199, 93, 189, 230, 66, 173, 153, 110, 190, + 231, 209, 83, 202, 243, 171, 157, 242, 161, 158, 251, 18, 114, 222, 200, 58, 77, 31, 213, + 207, 65, 253, 220, 161, 159, 151, 235, 199, 213, 15, 215, 207, 122, 253, 172, 210, 79, 57, + 246, 91, 171, 195, 111, 31, 57, 27, 81, 222, 167, 159, 53, 250, 57, 75, 63, 195, 17, 68, + 110, 249, 242, 92, 46, 119, 226, 9, 131, 35, 135, 243, 165, 158, 59, 22, 62, 94, 202, 21, + 35, 156, 53, 231, 106, 185, 123, 231, 215, 84, 52, 57, 52, 191, 102, 179, 38, 31, 156, 95, + 179, 171, 28, 20, 123, 238, 201, 173, 137, 102, 69, 61, 31, 208, 53, 119, 151, 166, 119, + 207, 151, 31, 209, 175, 223, 155, 144, 247, 204, 151, 239, 213, 228, 206, 249, 178, 212, + 228, 249, 243, 107, 54, 104, 242, 220, 249, 53, 159, 47, 7, 165, 158, 109, 185, 114, 111, + 36, 186, 21, 244, 82, 157, 239, 136, 94, 50, 95, 126, 182, 14, 246, 172, 249, 242, 121, 154, + 172, 155, 95, 179, 58, 10, 189, 86, 3, 173, 210, 111, 207, 235, 217, 158, 123, 68, 211, 85, + 144, 58, 39, 65, 90, 57, 95, 190, 64, 147, 179, 231, 203, 126, 20, 122, 48, 183, 38, 170, + 248, 158, 254, 220, 250, 56, 121, 125, 250, 137, 104, 97, 65, 39, 232, 177, 195, 61, 219, + 123, 123, 70, 104, 249, 151, 229, 215, 149, 31, 213, 226, 191, 208, 5, 171, 155, 199, 55, + 134, 15, 245, 106, 242, 208, 170, 67, 61, 207, 30, 33, 229, 251, 214, 191, 93, 7, 14, 202, + 243, 1, 137, 194, 235, 241, 225, 32, 232, 92, 68, 63, 80, 190, 99, 213, 13, 229, 183, 234, + 184, 122, 86, 221, 83, 126, 115, 121, 67, 249, 230, 245, 135, 6, 181, 247, 171, 116, 186, + 111, 136, 33, 230, 203, 47, 31, 62, 148, 191, 107, 228, 164, 242, 117, 229, 74, 121, 118, + 253, 35, 229, 153, 242, 211, 202, 141, 242, 37, 229, 231, 175, 210, 254, 243, 229, 231, 149, + 239, 139, 146, 153, 219, 209, 179, 61, 127, 215, 61, 229, 45, 58, 194, 139, 117, 46, 86, + 205, 151, 47, 90, 117, 40, 78, 98, 88, 190, 170, 60, 82, 94, 83, 246, 135, 239, 139, 202, + 55, 231, 37, 241, 186, 235, 239, 139, 74, 32, 199, 19, 244, 39, 234, 242, 93, 187, 234, 80, + 212, 198, 183, 185, 135, 122, 78, 24, 89, 59, 240, 235, 129, 91, 6, 158, 59, 80, 29, 184, + 96, 96, 229, 192, 217, 3, 103, 14, 156, 49, 176, 108, 240, 196, 193, 161, 193, 37, 131, 108, + 144, 12, 14, 14, 246, 15, 246, 14, 230, 7, 115, 131, 203, 14, 61, 126, 108, 100, 93, 78, 55, + 219, 101, 253, 67, 17, 233, 239, 141, 126, 123, 99, 126, 40, 31, 253, 234, 31, 253, 155, + 203, 247, 12, 230, 115, 79, 203, 205, 157, 84, 216, 148, 223, 116, 105, 181, 103, 211, 220, + 145, 209, 220, 166, 93, 195, 115, 127, 188, 116, 229, 161, 30, 242, 172, 203, 230, 250, 86, + 86, 123, 230, 78, 220, 148, 219, 180, 181, 58, 231, 173, 219, 116, 104, 224, 241, 75, 230, + 220, 117, 155, 230, 6, 182, 60, 119, 251, 193, 158, 158, 155, 119, 104, 223, 185, 252, 43, + 15, 245, 228, 182, 110, 63, 212, 243, 120, 228, 117, 253, 105, 115, 39, 214, 244, 203, 220, + 245, 175, 58, 237, 112, 174, 167, 231, 9, 215, 191, 106, 199, 142, 220, 138, 229, 251, 54, + 174, 216, 120, 226, 133, 39, 248, 161, 90, 228, 103, 39, 126, 215, 117, 254, 173, 48, 217, + 51, 230, 222, 184, 233, 210, 237, 115, 239, 62, 99, 199, 28, 143, 152, 199, 207, 216, 177, + 105, 238, 101, 151, 14, 63, 111, 251, 225, 252, 210, 124, 169, 174, 14, 231, 151, 68, 100, + 199, 246, 195, 189, 83, 249, 165, 245, 75, 34, 255, 222, 41, 181, 67, 7, 123, 36, 14, 166, + 91, 243, 18, 29, 44, 183, 38, 34, 58, 216, 96, 53, 55, 28, 5, 211, 250, 164, 26, 5, 211, + 117, 148, 132, 91, 173, 197, 117, 184, 179, 34, 162, 195, 145, 82, 110, 117, 28, 110, 53, + 41, 197, 225, 122, 123, 162, 112, 7, 31, 30, 174, 171, 131, 195, 195, 113, 152, 85, 185, + 220, 195, 113, 152, 135, 87, 229, 140, 48, 186, 197, 104, 89, 117, 112, 245, 234, 56, 212, + 202, 225, 158, 237, 81, 168, 158, 237, 43, 135, 227, 132, 157, 23, 71, 84, 46, 235, 32, 235, + 203, 113, 144, 30, 61, 175, 139, 35, 42, 247, 196, 96, 115, 231, 119, 130, 172, 66, 16, 59, + 11, 98, 199, 88, 133, 158, 78, 152, 114, 18, 102, 217, 185, 105, 152, 101, 231, 234, 48, + 235, 254, 63, 255, 53, 171, 235, 122, 22, 172, 246, 53, 15, 214, 155, 43, 235, 59, 87, 214, + 155, 250, 217, 57, 119, 211, 190, 177, 21, 115, 215, 237, 26, 30, 62, 120, 77, 59, 122, 49, + 60, 87, 88, 189, 115, 215, 232, 88, 68, 27, 205, 185, 246, 202, 166, 154, 187, 102, 165, 26, + 62, 104, 61, 184, 200, 235, 7, 163, 215, 214, 74, 117, 48, 247, 96, 125, 235, 246, 131, 15, + 142, 52, 213, 188, 53, 98, 213, 87, 54, 212, 142, 133, 141, 79, 222, 30, 28, 135, 117, 67, + 134, 181, 253, 201, 139, 68, 246, 228, 40, 178, 237, 17, 214, 198, 96, 145, 215, 65, 244, + 122, 99, 132, 21, 68, 88, 65, 132, 181, 113, 100, 99, 140, 85, 31, 143, 218, 253, 150, 237, + 7, 7, 115, 213, 29, 181, 231, 37, 116, 33, 79, 137, 110, 195, 59, 79, 59, 107, 71, 117, 249, + 208, 212, 133, 81, 131, 62, 124, 193, 89, 43, 174, 57, 237, 67, 189, 185, 158, 59, 115, 116, + 221, 142, 57, 182, 178, 58, 87, 210, 79, 244, 106, 125, 176, 62, 136, 94, 233, 126, 22, 189, + 90, 162, 189, 151, 226, 213, 138, 107, 46, 56, 235, 180, 15, 245, 220, 137, 87, 67, 218, + 251, 132, 149, 213, 92, 90, 180, 185, 40, 208, 166, 57, 251, 89, 155, 230, 206, 186, 244, + 178, 237, 81, 83, 153, 27, 105, 44, 94, 103, 51, 209, 191, 248, 245, 138, 92, 125, 92, 233, + 255, 181, 123, 54, 126, 244, 127, 102, 200, 220, 204, 162, 255, 102, 23, 251, 215, 110, 183, + 103, 162, 159, 246, 186, 153, 92, 110, 211, 220, 218, 75, 55, 205, 57, 207, 210, 41, 25, 24, + 208, 80, 59, 213, 14, 237, 183, 33, 245, 43, 20, 98, 191, 131, 197, 98, 253, 208, 227, 71, + 244, 203, 117, 58, 17, 61, 179, 17, 92, 196, 173, 235, 89, 167, 75, 112, 132, 232, 85, 215, + 64, 254, 64, 255, 129, 129, 124, 180, 84, 152, 93, 56, 245, 12, 222, 186, 95, 143, 224, 215, + 234, 71, 175, 227, 242, 251, 231, 207, 143, 151, 207, 249, 253, 11, 103, 175, 138, 214, 47, + 179, 11, 231, 219, 9, 213, 203, 213, 136, 206, 159, 122, 22, 215, 8, 11, 174, 22, 141, 232, + 170, 132, 142, 156, 176, 94, 51, 183, 172, 186, 101, 253, 45, 238, 129, 85, 7, 214, 31, 112, + 251, 181, 239, 61, 119, 104, 207, 242, 29, 209, 80, 58, 127, 254, 29, 133, 220, 236, 186, + 153, 180, 32, 52, 59, 187, 67, 23, 182, 78, 86, 132, 247, 142, 249, 211, 207, 136, 129, 15, + 68, 204, 186, 117, 59, 214, 205, 244, 196, 229, 245, 207, 133, 221, 147, 22, 122, 86, 176, + 51, 136, 117, 38, 142, 126, 54, 173, 144, 196, 127, 6, 145, 232, 154, 72, 208, 219, 169, 88, + 27, 66, 241, 203, 118, 44, 148, 68, 146, 184, 178, 159, 206, 63, 237, 250, 127, 109, 194, + 23, 10, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, + 13, 49, 51, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, + 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 49, + 49, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 19, 96, 192, 15, 0, 2, 32, 0, 17, + 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, + 51, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, + 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 54, 56, 50, + 48, 47, 76, 101, 110, 103, 116, 104, 49, 32, 49, 51, 52, 57, 48, 62, 62, 115, 116, 114, 101, + 97, 109, 13, 10, 120, 156, 237, 58, 11, 120, 19, 85, 186, 255, 228, 159, 73, 75, 95, 148, + 82, 64, 222, 67, 177, 60, 36, 180, 165, 21, 144, 2, 74, 218, 166, 37, 208, 151, 73, 202, + 195, 69, 36, 77, 38, 109, 164, 121, 144, 164, 148, 138, 8, 202, 34, 2, 42, 40, 90, 21, 145, + 69, 68, 87, 81, 145, 69, 68, 4, 92, 69, 68, 68, 68, 87, 17, 95, 248, 192, 85, 87, 93, 89, + 95, 171, 94, 183, 226, 244, 254, 231, 204, 36, 77, 11, 34, 223, 119, 239, 253, 238, 222, + 239, 187, 132, 51, 231, 156, 255, 252, 239, 199, 57, 103, 96, 64, 0, 128, 84, 88, 2, 8, 213, + 85, 246, 220, 252, 29, 87, 124, 239, 34, 200, 123, 212, 166, 185, 124, 206, 224, 230, 253, + 159, 111, 4, 16, 242, 1, 112, 134, 107, 126, 68, 110, 59, 218, 127, 28, 128, 184, 146, 96, + 167, 60, 193, 58, 223, 103, 59, 190, 125, 30, 192, 120, 61, 225, 175, 170, 107, 104, 246, + 76, 168, 24, 243, 46, 64, 66, 55, 154, 159, 168, 87, 156, 238, 47, 135, 61, 217, 133, 230, + 223, 210, 124, 76, 61, 1, 210, 45, 137, 126, 128, 196, 161, 52, 63, 191, 222, 23, 89, 144, + 224, 188, 241, 50, 154, 79, 37, 158, 57, 13, 1, 151, 211, 50, 234, 86, 90, 74, 105, 6, 48, + 244, 241, 57, 23, 4, 165, 50, 163, 13, 32, 109, 45, 1, 101, 191, 211, 167, 216, 77, 63, 13, + 166, 249, 227, 0, 3, 206, 11, 6, 194, 145, 239, 20, 103, 15, 0, 211, 97, 194, 95, 28, 12, + 41, 193, 241, 92, 84, 238, 20, 0, 169, 30, 4, 49, 77, 88, 3, 18, 136, 82, 153, 248, 50, 128, + 90, 164, 245, 6, 59, 172, 54, 120, 18, 13, 134, 100, 35, 98, 162, 104, 48, 136, 75, 0, 30, + 75, 7, 153, 168, 180, 63, 69, 222, 72, 24, 38, 129, 252, 179, 193, 152, 169, 102, 10, 235, + 18, 124, 194, 199, 4, 22, 244, 101, 131, 62, 202, 36, 175, 209, 72, 232, 67, 205, 216, 190, + 44, 32, 199, 233, 248, 135, 22, 81, 148, 140, 9, 137, 93, 146, 146, 83, 82, 211, 186, 166, + 119, 203, 232, 158, 217, 163, 103, 175, 243, 122, 247, 233, 219, 175, 255, 128, 129, 242, + 160, 172, 193, 231, 103, 15, 25, 58, 108, 248, 5, 35, 76, 35, 115, 114, 243, 70, 229, 23, + 92, 56, 122, 204, 216, 139, 198, 21, 142, 159, 48, 241, 226, 75, 38, 153, 139, 138, 75, 44, + 165, 101, 147, 173, 83, 166, 150, 87, 84, 86, 85, 95, 106, 179, 59, 106, 166, 77, 159, 49, + 243, 178, 223, 205, 186, 124, 246, 21, 115, 156, 80, 235, 114, 43, 158, 186, 122, 239, 149, + 115, 27, 124, 254, 64, 112, 94, 40, 28, 105, 156, 223, 180, 160, 249, 170, 133, 87, 47, 186, + 102, 241, 146, 107, 175, 91, 250, 251, 101, 215, 47, 191, 97, 197, 202, 85, 55, 222, 116, + 243, 234, 53, 183, 220, 186, 246, 182, 219, 91, 238, 184, 243, 174, 117, 119, 175, 191, 103, + 195, 31, 54, 222, 187, 233, 190, 205, 247, 63, 240, 199, 7, 31, 218, 242, 240, 35, 143, 110, + 125, 108, 219, 159, 182, 63, 190, 227, 137, 157, 79, 238, 122, 106, 247, 158, 189, 79, 255, + 249, 153, 103, 247, 61, 183, 255, 249, 3, 47, 28, 124, 241, 208, 75, 135, 95, 62, 242, 202, + 171, 127, 121, 13, 94, 63, 250, 198, 177, 55, 223, 122, 251, 157, 119, 143, 191, 247, 254, + 7, 31, 158, 0, 209, 112, 49, 89, 90, 8, 50, 136, 208, 7, 174, 129, 54, 33, 65, 232, 38, 12, + 20, 70, 9, 69, 130, 93, 112, 10, 11, 132, 107, 132, 91, 13, 7, 13, 239, 227, 67, 248, 172, + 60, 68, 206, 147, 11, 229, 71, 6, 101, 101, 25, 179, 6, 100, 141, 200, 154, 156, 165, 100, + 191, 244, 179, 161, 173, 141, 197, 26, 54, 10, 70, 33, 69, 24, 32, 228, 9, 102, 193, 38, + 204, 38, 218, 69, 68, 251, 130, 225, 109, 78, 219, 157, 104, 199, 113, 90, 67, 86, 87, 78, + 59, 135, 104, 133, 182, 182, 54, 138, 83, 219, 15, 212, 222, 166, 182, 177, 109, 54, 61, + 139, 219, 234, 219, 50, 89, 8, 78, 253, 120, 234, 56, 165, 101, 203, 137, 101, 39, 166, 125, + 120, 37, 131, 124, 48, 239, 131, 43, 0, 222, 253, 90, 122, 134, 7, 239, 34, 106, 223, 51, + 68, 30, 177, 86, 61, 114, 173, 218, 92, 136, 69, 84, 144, 133, 97, 188, 47, 210, 1, 143, + 192, 125, 240, 123, 88, 6, 79, 67, 11, 124, 6, 215, 195, 205, 176, 10, 238, 129, 135, 96, + 51, 49, 93, 9, 239, 192, 82, 88, 11, 223, 194, 119, 112, 19, 220, 1, 55, 192, 126, 120, 31, + 190, 129, 13, 176, 5, 254, 73, 210, 126, 128, 77, 240, 40, 28, 130, 131, 176, 21, 106, 193, + 5, 107, 192, 13, 135, 65, 129, 23, 225, 37, 120, 21, 94, 134, 35, 240, 10, 124, 14, 30, 120, + 29, 254, 2, 175, 193, 99, 80, 7, 95, 195, 45, 112, 12, 142, 194, 27, 80, 15, 127, 135, 147, + 176, 2, 174, 4, 47, 204, 5, 31, 52, 128, 31, 54, 66, 0, 230, 65, 16, 66, 16, 134, 70, 136, + 192, 124, 104, 130, 47, 96, 1, 92, 5, 205, 176, 16, 22, 193, 213, 176, 11, 238, 133, 197, + 20, 157, 37, 112, 45, 124, 9, 255, 128, 221, 240, 11, 168, 186, 37, 109, 240, 19, 188, 9, + 255, 34, 155, 63, 134, 79, 224, 45, 56, 1, 239, 194, 113, 218, 13, 62, 132, 183, 225, 3, + 216, 14, 143, 235, 120, 59, 225, 73, 160, 186, 135, 29, 240, 4, 28, 160, 254, 58, 120, 14, + 150, 235, 107, 15, 195, 157, 250, 232, 65, 88, 71, 207, 187, 224, 43, 62, 219, 171, 123, 79, + 128, 251, 245, 245, 91, 97, 181, 62, 186, 13, 110, 23, 70, 147, 102, 135, 233, 183, 143, 60, + 179, 94, 120, 128, 102, 30, 90, 153, 71, 144, 141, 134, 237, 228, 221, 70, 130, 236, 23, 14, + 11, 43, 12, 35, 9, 246, 0, 249, 240, 40, 97, 46, 135, 195, 184, 69, 4, 97, 10, 20, 16, 20, + 224, 29, 201, 0, 223, 11, 14, 210, 108, 189, 48, 78, 200, 20, 198, 37, 24, 69, 16, 43, 197, + 29, 162, 77, 220, 37, 126, 38, 30, 129, 177, 98, 88, 60, 34, 206, 17, 195, 66, 1, 110, 146, + 166, 73, 15, 80, 27, 135, 7, 12, 25, 20, 133, 129, 176, 75, 248, 144, 60, 183, 27, 191, 192, + 2, 220, 43, 150, 136, 105, 240, 33, 30, 193, 45, 240, 41, 73, 17, 137, 255, 97, 210, 121, + 51, 121, 114, 23, 100, 10, 1, 88, 108, 88, 104, 176, 17, 228, 160, 116, 132, 108, 93, 71, + 190, 63, 12, 71, 132, 13, 194, 81, 210, 110, 183, 176, 148, 226, 116, 39, 138, 134, 201, + 176, 65, 56, 70, 118, 29, 134, 31, 97, 41, 58, 12, 139, 105, 47, 40, 48, 120, 72, 255, 131, + 196, 235, 8, 209, 175, 131, 176, 8, 210, 49, 33, 9, 84, 195, 8, 130, 145, 246, 36, 171, 150, + 63, 251, 227, 72, 233, 24, 255, 125, 67, 113, 91, 8, 14, 216, 108, 220, 101, 204, 76, 24, + 76, 82, 152, 199, 30, 16, 246, 11, 39, 141, 107, 41, 242, 71, 113, 22, 206, 195, 227, 194, + 50, 113, 176, 248, 160, 56, 25, 86, 107, 30, 192, 57, 176, 154, 120, 175, 99, 52, 70, 143, + 208, 76, 182, 179, 223, 66, 198, 221, 208, 36, 206, 17, 182, 192, 23, 226, 156, 132, 90, + 226, 125, 128, 89, 196, 226, 106, 176, 145, 69, 30, 138, 153, 7, 154, 140, 233, 100, 211, + 120, 97, 25, 174, 32, 77, 217, 106, 127, 56, 146, 48, 69, 204, 37, 122, 226, 144, 176, 136, + 172, 6, 8, 224, 104, 202, 195, 0, 173, 111, 165, 60, 25, 137, 45, 180, 199, 46, 212, 236, + 53, 142, 149, 126, 36, 202, 245, 226, 71, 100, 243, 106, 225, 38, 195, 143, 112, 4, 75, 96, + 56, 120, 196, 175, 200, 215, 180, 141, 238, 52, 74, 34, 26, 4, 48, 201, 233, 219, 12, 217, + 86, 247, 182, 73, 151, 206, 144, 95, 156, 57, 104, 164, 169, 211, 84, 78, 79, 144, 183, 65, + 245, 182, 212, 102, 121, 87, 91, 91, 245, 12, 177, 175, 52, 115, 155, 212, 111, 27, 102, 39, + 110, 19, 179, 7, 127, 244, 107, 139, 31, 141, 52, 77, 173, 158, 33, 111, 251, 197, 82, 162, + 115, 181, 204, 41, 33, 152, 125, 6, 13, 217, 140, 192, 4, 183, 148, 140, 164, 141, 219, 163, + 182, 136, 30, 105, 51, 109, 238, 9, 208, 103, 82, 138, 248, 51, 24, 127, 22, 18, 165, 197, + 6, 17, 114, 159, 127, 227, 228, 40, 72, 127, 227, 228, 27, 39, 243, 186, 119, 27, 212, 45, + 123, 80, 183, 65, 30, 17, 78, 133, 177, 239, 169, 79, 213, 150, 132, 180, 159, 190, 11, 25, + 135, 131, 208, 118, 146, 14, 180, 174, 210, 49, 74, 74, 232, 62, 168, 135, 49, 97, 80, 207, + 94, 131, 122, 246, 48, 142, 16, 140, 9, 244, 27, 220, 35, 179, 151, 208, 35, 115, 132, 0, + 19, 133, 177, 61, 11, 228, 177, 99, 70, 15, 202, 26, 61, 166, 96, 208, 232, 33, 67, 135, + 140, 16, 70, 143, 169, 192, 231, 106, 146, 213, 182, 209, 221, 133, 12, 105, 150, 97, 187, + 241, 98, 219, 212, 27, 151, 92, 34, 28, 151, 94, 251, 229, 101, 67, 126, 177, 48, 161, 34, + 229, 151, 231, 197, 43, 12, 194, 11, 67, 131, 213, 147, 212, 89, 210, 49, 195, 210, 46, 23, + 207, 20, 112, 101, 153, 91, 25, 80, 108, 72, 178, 254, 178, 191, 175, 104, 184, 5, 151, 73, + 9, 71, 6, 200, 226, 74, 67, 149, 169, 143, 180, 66, 63, 136, 216, 225, 244, 202, 179, 67, + 78, 92, 209, 117, 194, 15, 48, 48, 145, 87, 224, 238, 167, 190, 217, 197, 250, 23, 61, 11, + 95, 82, 87, 168, 253, 147, 202, 19, 124, 52, 77, 212, 79, 53, 122, 38, 248, 212, 254, 0, 73, + 123, 105, 117, 69, 82, 121, 236, 180, 139, 110, 138, 201, 226, 17, 94, 176, 96, 88, 165, 53, + 28, 45, 140, 198, 173, 112, 192, 184, 3, 54, 72, 189, 96, 75, 194, 58, 152, 103, 156, 8, + 215, 26, 10, 224, 0, 14, 132, 109, 212, 54, 83, 69, 77, 164, 245, 119, 8, 127, 131, 225, 99, + 112, 83, 127, 156, 138, 29, 8, 127, 57, 181, 143, 168, 181, 80, 91, 79, 205, 77, 141, 241, + 89, 77, 237, 65, 106, 171, 168, 93, 75, 184, 223, 80, 219, 192, 120, 68, 155, 120, 9, 172, + 37, 155, 150, 75, 205, 144, 46, 45, 130, 67, 82, 11, 132, 41, 38, 135, 164, 52, 56, 36, 174, + 131, 67, 198, 2, 154, 139, 112, 200, 48, 139, 181, 182, 22, 233, 18, 130, 55, 18, 252, 51, + 194, 57, 69, 125, 57, 21, 227, 81, 173, 151, 86, 19, 44, 19, 150, 139, 31, 183, 181, 74, + 199, 97, 59, 227, 153, 240, 5, 148, 72, 11, 97, 34, 193, 78, 81, 63, 139, 217, 194, 116, + 166, 254, 32, 151, 15, 109, 39, 121, 251, 12, 22, 18, 237, 110, 209, 3, 243, 168, 159, 39, + 158, 132, 121, 134, 215, 32, 151, 141, 165, 12, 216, 109, 24, 7, 251, 12, 227, 218, 142, + 139, 155, 180, 113, 194, 97, 216, 205, 224, 226, 167, 28, 127, 55, 195, 195, 41, 52, 31, 65, + 197, 53, 24, 198, 210, 218, 86, 113, 47, 249, 107, 21, 76, 163, 126, 60, 27, 139, 5, 48, 67, + 234, 37, 128, 97, 187, 32, 178, 158, 201, 231, 118, 179, 70, 118, 51, 155, 163, 54, 49, 253, + 153, 78, 103, 108, 30, 77, 191, 248, 70, 58, 173, 33, 253, 14, 82, 251, 128, 218, 247, 81, + 221, 58, 55, 166, 87, 124, 163, 152, 142, 163, 182, 159, 226, 243, 8, 139, 17, 141, 103, + 137, 187, 132, 2, 30, 191, 36, 216, 77, 41, 213, 87, 111, 67, 105, 227, 166, 141, 15, 222, + 98, 122, 147, 253, 137, 164, 167, 199, 184, 5, 222, 143, 143, 39, 209, 217, 168, 109, 21, 7, + 67, 189, 228, 134, 222, 198, 52, 218, 74, 118, 182, 125, 68, 126, 201, 197, 3, 16, 166, 54, + 199, 216, 31, 42, 19, 142, 147, 29, 159, 194, 100, 138, 255, 106, 150, 123, 156, 182, 55, + 76, 36, 218, 129, 124, 124, 89, 91, 43, 173, 111, 160, 182, 143, 242, 227, 36, 193, 33, 234, + 43, 230, 159, 196, 213, 212, 114, 201, 38, 158, 246, 84, 191, 217, 36, 147, 26, 229, 36, + 107, 219, 25, 15, 252, 30, 140, 220, 239, 20, 123, 97, 154, 186, 130, 120, 204, 198, 2, 216, + 64, 109, 31, 217, 150, 203, 26, 179, 159, 231, 241, 42, 141, 62, 105, 47, 249, 136, 201, 97, + 177, 136, 246, 105, 60, 255, 54, 81, 254, 169, 212, 27, 169, 141, 103, 58, 68, 27, 207, 53, + 189, 177, 220, 32, 158, 172, 237, 164, 118, 140, 218, 65, 242, 219, 58, 234, 191, 162, 126, + 48, 245, 223, 80, 95, 206, 113, 22, 183, 125, 103, 40, 5, 3, 207, 89, 202, 27, 150, 159, 44, + 71, 88, 126, 80, 222, 39, 241, 152, 145, 238, 220, 134, 183, 120, 110, 239, 214, 252, 44, + 244, 166, 13, 124, 5, 181, 217, 212, 106, 19, 246, 193, 10, 189, 213, 178, 122, 97, 185, + 200, 234, 37, 198, 151, 114, 139, 231, 117, 180, 103, 235, 122, 253, 50, 191, 178, 152, 234, + 177, 37, 157, 133, 20, 234, 95, 101, 141, 120, 95, 194, 244, 23, 216, 197, 32, 235, 223, + 226, 23, 252, 255, 223, 191, 217, 143, 189, 82, 165, 64, 5, 157, 190, 151, 81, 34, 25, 32, + 157, 94, 197, 18, 40, 167, 122, 208, 43, 29, 127, 225, 130, 158, 66, 90, 236, 252, 41, 4, + 136, 157, 81, 105, 96, 214, 199, 6, 162, 40, 212, 199, 8, 125, 99, 112, 49, 14, 71, 162, + 151, 148, 89, 250, 216, 72, 47, 193, 243, 245, 113, 2, 228, 209, 117, 87, 27, 39, 66, 90, + 226, 29, 250, 56, 25, 206, 163, 171, 188, 54, 78, 237, 210, 29, 238, 102, 218, 136, 244, + 122, 11, 145, 46, 91, 245, 177, 0, 253, 146, 242, 244, 177, 1, 210, 146, 178, 244, 49, 194, + 152, 24, 92, 140, 195, 145, 224, 194, 36, 143, 62, 54, 66, 159, 164, 117, 250, 56, 1, 230, + 36, 207, 214, 199, 137, 208, 175, 207, 123, 250, 56, 25, 242, 146, 118, 232, 227, 212, 140, + 33, 73, 159, 20, 7, 130, 205, 33, 111, 93, 125, 68, 30, 230, 26, 46, 231, 231, 229, 21, 200, + 181, 205, 50, 123, 129, 141, 132, 20, 167, 207, 36, 91, 253, 174, 28, 217, 220, 208, 32, + 219, 24, 86, 88, 182, 41, 97, 37, 52, 95, 113, 231, 216, 148, 186, 198, 6, 103, 200, 214, + 24, 84, 20, 185, 52, 16, 114, 186, 189, 78, 127, 225, 52, 37, 20, 246, 6, 252, 114, 126, 78, + 94, 94, 252, 88, 158, 210, 216, 208, 44, 143, 26, 99, 34, 25, 163, 242, 56, 81, 148, 166, + 62, 18, 9, 22, 230, 230, 54, 53, 53, 229, 212, 70, 229, 230, 184, 2, 190, 115, 82, 45, 53, + 233, 76, 186, 165, 38, 197, 208, 100, 210, 194, 41, 123, 195, 178, 83, 142, 144, 60, 197, + 231, 12, 205, 149, 3, 158, 211, 249, 164, 38, 85, 43, 33, 159, 55, 204, 85, 38, 252, 122, + 37, 164, 144, 188, 186, 144, 211, 31, 81, 220, 38, 217, 19, 34, 59, 137, 208, 85, 239, 12, + 213, 41, 38, 57, 18, 144, 157, 254, 102, 57, 72, 70, 18, 65, 160, 54, 226, 244, 250, 189, + 254, 58, 146, 227, 34, 197, 25, 102, 164, 94, 145, 61, 1, 63, 41, 230, 116, 145, 61, 65, 66, + 103, 8, 145, 122, 226, 222, 224, 117, 41, 254, 176, 34, 15, 203, 42, 101, 24, 89, 195, 137, + 153, 91, 118, 134, 195, 1, 151, 215, 73, 242, 100, 119, 192, 213, 232, 83, 252, 17, 103, + 132, 233, 227, 241, 54, 40, 97, 121, 24, 227, 200, 9, 100, 123, 192, 19, 105, 114, 134, 148, + 172, 225, 92, 147, 144, 18, 12, 5, 220, 141, 46, 133, 179, 113, 123, 201, 52, 111, 109, 99, + 68, 225, 58, 116, 32, 48, 201, 94, 191, 171, 161, 209, 205, 52, 105, 242, 70, 234, 3, 141, + 17, 82, 198, 231, 213, 5, 49, 252, 144, 230, 77, 98, 219, 24, 38, 124, 102, 142, 73, 246, + 41, 220, 234, 96, 99, 109, 131, 55, 92, 111, 138, 147, 97, 98, 50, 115, 3, 33, 57, 172, 80, + 40, 8, 219, 75, 170, 234, 230, 119, 18, 205, 148, 35, 182, 65, 230, 232, 136, 238, 58, 46, + 168, 169, 62, 224, 59, 157, 128, 133, 193, 211, 24, 242, 147, 64, 133, 19, 186, 3, 114, 56, + 96, 146, 195, 141, 181, 87, 42, 174, 8, 131, 104, 62, 110, 104, 8, 52, 49, 131, 92, 1, 191, + 219, 203, 236, 8, 23, 178, 128, 58, 104, 209, 89, 27, 152, 175, 112, 27, 180, 92, 226, 42, + 196, 18, 193, 31, 136, 80, 32, 194, 26, 148, 197, 37, 216, 158, 3, 218, 154, 28, 174, 119, + 146, 89, 181, 138, 238, 55, 82, 196, 235, 151, 157, 29, 44, 13, 248, 41, 51, 66, 178, 47, + 16, 82, 206, 104, 184, 28, 105, 14, 42, 30, 39, 9, 202, 137, 170, 213, 113, 221, 231, 108, + 102, 18, 124, 1, 183, 215, 227, 101, 201, 230, 108, 136, 80, 250, 209, 128, 216, 58, 221, + 110, 110, 189, 230, 62, 18, 30, 116, 134, 72, 51, 86, 124, 92, 148, 91, 9, 123, 235, 252, + 92, 145, 186, 134, 230, 96, 125, 152, 17, 177, 44, 117, 186, 136, 73, 152, 81, 68, 53, 10, + 119, 150, 164, 101, 157, 91, 115, 154, 179, 225, 204, 12, 116, 154, 168, 30, 237, 220, 72, + 61, 63, 85, 181, 183, 67, 170, 147, 57, 33, 133, 253, 91, 27, 199, 101, 131, 48, 115, 37, + 139, 77, 180, 68, 20, 202, 59, 69, 83, 190, 41, 16, 114, 135, 229, 172, 88, 53, 102, 49, + 217, 209, 5, 57, 139, 21, 111, 150, 238, 52, 138, 78, 185, 94, 53, 181, 10, 213, 19, 227, + 219, 72, 113, 96, 38, 204, 15, 120, 99, 170, 41, 11, 34, 84, 55, 178, 51, 24, 164, 34, 115, + 214, 54, 40, 108, 65, 179, 158, 120, 119, 10, 76, 189, 51, 34, 215, 59, 195, 196, 81, 241, + 119, 244, 10, 137, 107, 207, 113, 183, 220, 232, 119, 235, 42, 103, 117, 220, 91, 178, 52, + 27, 207, 30, 217, 112, 160, 129, 85, 55, 15, 29, 11, 148, 83, 110, 96, 187, 8, 213, 76, 20, + 49, 232, 116, 205, 117, 214, 145, 105, 84, 143, 254, 64, 108, 15, 57, 247, 212, 234, 32, + 138, 54, 46, 82, 82, 105, 240, 104, 106, 77, 182, 200, 165, 85, 149, 14, 217, 94, 85, 234, + 152, 110, 182, 89, 100, 171, 93, 174, 182, 85, 77, 179, 150, 88, 74, 228, 44, 179, 157, 230, + 89, 38, 121, 186, 213, 49, 185, 170, 198, 33, 19, 134, 205, 92, 233, 152, 41, 87, 149, 202, + 230, 202, 153, 242, 84, 107, 101, 137, 73, 182, 204, 168, 182, 89, 236, 118, 185, 202, 38, + 91, 43, 170, 203, 173, 22, 130, 89, 43, 139, 203, 107, 74, 172, 149, 101, 114, 17, 209, 85, + 86, 57, 228, 114, 107, 133, 213, 65, 76, 29, 85, 156, 84, 103, 101, 181, 216, 25, 179, 10, + 139, 173, 120, 50, 77, 205, 69, 214, 114, 171, 99, 166, 73, 46, 181, 58, 42, 25, 207, 82, + 98, 106, 150, 171, 205, 54, 135, 181, 184, 166, 220, 108, 147, 171, 107, 108, 213, 85, 118, + 11, 241, 40, 33, 182, 149, 214, 202, 82, 27, 73, 177, 84, 88, 200, 8, 98, 84, 92, 85, 61, + 211, 102, 45, 155, 236, 48, 17, 145, 131, 128, 38, 217, 97, 51, 151, 88, 42, 204, 182, 169, + 38, 166, 97, 21, 153, 108, 147, 57, 74, 14, 105, 73, 60, 100, 203, 52, 70, 108, 159, 108, + 46, 47, 151, 139, 172, 14, 187, 195, 102, 49, 87, 48, 92, 230, 157, 178, 202, 170, 10, 230, + 163, 154, 202, 18, 179, 195, 90, 85, 41, 23, 89, 200, 20, 115, 81, 185, 69, 211, 141, 76, + 41, 46, 55, 91, 43, 76, 114, 137, 185, 194, 92, 102, 177, 183, 11, 97, 104, 186, 57, 237, + 238, 96, 4, 101, 150, 74, 139, 205, 92, 110, 146, 237, 213, 150, 98, 43, 27, 144, 31, 173, + 54, 75, 177, 131, 99, 146, 239, 201, 19, 229, 92, 221, 226, 170, 74, 187, 229, 210, 26, 2, + 16, 94, 84, 4, 5, 100, 178, 133, 139, 32, 3, 204, 244, 183, 152, 107, 198, 205, 175, 36, + 115, 25, 31, 71, 149, 205, 17, 83, 101, 186, 213, 110, 49, 201, 102, 155, 213, 206, 84, 40, + 181, 85, 145, 186, 44, 158, 68, 193, 108, 172, 33, 127, 178, 224, 85, 234, 250, 178, 24, 49, + 216, 233, 217, 65, 88, 140, 90, 55, 176, 196, 98, 46, 39, 134, 118, 166, 198, 105, 184, 60, + 191, 44, 11, 92, 74, 48, 194, 242, 91, 47, 114, 109, 147, 228, 27, 170, 182, 139, 154, 120, + 230, 106, 155, 1, 165, 113, 153, 159, 202, 87, 131, 241, 33, 229, 52, 213, 23, 63, 129, 180, + 93, 174, 189, 196, 216, 225, 108, 210, 55, 97, 182, 141, 80, 134, 211, 169, 164, 109, 194, + 238, 249, 10, 237, 132, 97, 182, 165, 80, 141, 4, 216, 166, 210, 228, 13, 243, 122, 167, + 227, 208, 23, 208, 207, 191, 176, 179, 129, 132, 17, 85, 12, 139, 246, 76, 103, 3, 145, 133, + 99, 106, 118, 44, 170, 232, 193, 24, 12, 121, 137, 164, 41, 228, 141, 208, 150, 34, 59, 27, + 9, 26, 242, 94, 165, 31, 201, 33, 253, 200, 234, 108, 1, 147, 210, 89, 255, 144, 18, 14, + 210, 137, 229, 157, 175, 52, 52, 231, 176, 219, 18, 59, 215, 184, 38, 94, 191, 39, 16, 242, + 233, 166, 115, 247, 185, 34, 133, 209, 189, 52, 34, 215, 113, 230, 110, 50, 60, 16, 170, + 203, 129, 98, 8, 208, 13, 183, 25, 66, 224, 133, 58, 168, 135, 8, 200, 48, 12, 92, 48, 156, + 250, 124, 186, 119, 230, 65, 1, 141, 106, 9, 67, 134, 34, 194, 137, 64, 152, 90, 8, 20, 112, + 130, 15, 76, 4, 181, 130, 159, 240, 115, 104, 100, 134, 6, 250, 201, 96, 139, 241, 10, 243, + 153, 66, 189, 66, 52, 243, 233, 233, 38, 76, 6, 169, 131, 70, 194, 117, 18, 212, 70, 163, + 32, 65, 20, 194, 45, 37, 109, 66, 4, 117, 19, 7, 39, 241, 45, 132, 105, 156, 50, 76, 243, 0, + 205, 153, 78, 57, 92, 171, 95, 131, 203, 48, 133, 115, 102, 250, 142, 130, 49, 92, 67, 102, + 199, 40, 106, 237, 146, 58, 203, 97, 186, 70, 104, 173, 16, 114, 233, 215, 196, 127, 57, + 100, 117, 103, 123, 115, 200, 210, 0, 245, 255, 125, 94, 75, 133, 164, 115, 246, 27, 195, + 61, 157, 155, 172, 251, 194, 73, 35, 47, 167, 100, 163, 136, 110, 159, 66, 24, 204, 203, + 115, 9, 22, 0, 207, 57, 233, 195, 90, 53, 231, 233, 227, 28, 219, 189, 172, 241, 175, 231, + 107, 138, 110, 95, 29, 151, 228, 39, 126, 76, 75, 198, 203, 195, 87, 149, 152, 68, 23, 81, + 48, 29, 234, 8, 102, 226, 186, 5, 184, 150, 126, 78, 31, 212, 35, 169, 73, 8, 16, 215, 8, + 173, 121, 105, 198, 90, 157, 110, 143, 75, 247, 120, 148, 103, 132, 107, 193, 100, 5, 184, + 108, 205, 110, 151, 30, 159, 160, 206, 61, 202, 129, 97, 107, 186, 55, 80, 239, 34, 74, 63, + 247, 45, 139, 90, 22, 207, 6, 141, 71, 22, 143, 32, 163, 117, 243, 62, 204, 245, 114, 241, + 44, 209, 236, 147, 169, 49, 72, 35, 73, 81, 56, 21, 91, 137, 250, 199, 67, 163, 6, 30, 55, + 198, 57, 170, 99, 187, 4, 25, 236, 92, 255, 8, 229, 151, 147, 123, 137, 73, 108, 247, 9, + 131, 176, 255, 42, 9, 144, 148, 70, 174, 103, 187, 54, 110, 110, 65, 132, 231, 92, 45, 255, + 175, 20, 37, 206, 15, 191, 46, 193, 196, 227, 198, 162, 219, 64, 84, 238, 152, 79, 154, 120, + 30, 212, 19, 118, 35, 167, 99, 158, 241, 113, 88, 188, 69, 81, 254, 161, 14, 185, 169, 105, + 219, 200, 125, 104, 138, 139, 14, 27, 251, 120, 60, 163, 177, 14, 18, 86, 45, 231, 29, 38, + 106, 211, 175, 216, 97, 138, 217, 153, 203, 43, 83, 230, 156, 181, 170, 208, 120, 123, 117, + 175, 118, 140, 254, 217, 173, 142, 122, 78, 211, 54, 24, 203, 232, 72, 167, 172, 107, 183, + 168, 137, 251, 195, 119, 78, 18, 162, 213, 224, 33, 27, 66, 60, 91, 195, 156, 166, 93, 162, + 155, 63, 153, 12, 19, 239, 153, 39, 174, 36, 12, 23, 231, 167, 225, 196, 231, 49, 179, 55, + 192, 227, 162, 69, 200, 197, 101, 187, 185, 198, 94, 93, 211, 194, 88, 133, 58, 116, 74, 39, + 113, 13, 240, 61, 162, 61, 14, 241, 251, 82, 187, 23, 78, 223, 17, 252, 132, 31, 209, 43, + 34, 220, 1, 55, 90, 47, 237, 94, 139, 223, 7, 226, 233, 100, 110, 183, 83, 143, 86, 173, + 238, 153, 246, 124, 211, 60, 226, 229, 116, 206, 179, 196, 148, 113, 214, 246, 140, 16, 207, + 162, 128, 238, 229, 115, 141, 56, 195, 105, 230, 250, 122, 248, 78, 192, 120, 231, 156, 230, + 173, 179, 209, 51, 191, 52, 199, 108, 240, 241, 42, 244, 242, 154, 142, 238, 108, 76, 255, + 136, 190, 251, 105, 16, 77, 91, 230, 87, 119, 92, 236, 227, 179, 79, 179, 60, 200, 165, 104, + 62, 139, 158, 124, 237, 86, 185, 185, 182, 44, 102, 254, 56, 143, 212, 241, 115, 44, 72, 56, + 225, 152, 164, 232, 94, 234, 228, 89, 164, 229, 112, 84, 70, 103, 31, 133, 127, 211, 166, + 248, 189, 206, 221, 33, 211, 156, 60, 78, 231, 174, 65, 71, 57, 157, 253, 113, 38, 221, 76, + 122, 204, 181, 179, 218, 123, 150, 93, 61, 164, 239, 64, 10, 215, 203, 215, 129, 111, 20, + 18, 142, 101, 101, 180, 110, 58, 159, 34, 138, 190, 223, 41, 29, 60, 223, 196, 173, 114, + 115, 250, 172, 51, 156, 141, 89, 49, 187, 59, 83, 48, 252, 232, 201, 155, 213, 41, 211, 180, + 218, 41, 239, 116, 214, 212, 242, 218, 15, 196, 233, 219, 168, 215, 67, 52, 10, 243, 105, + 213, 123, 6, 175, 41, 176, 128, 251, 218, 175, 87, 52, 251, 87, 73, 237, 36, 115, 242, 221, + 85, 137, 81, 196, 199, 94, 211, 251, 236, 21, 83, 207, 119, 123, 153, 247, 97, 93, 71, 133, + 103, 211, 175, 231, 138, 102, 221, 153, 246, 113, 182, 218, 200, 177, 58, 122, 249, 76, 158, + 149, 227, 188, 23, 31, 199, 255, 74, 205, 134, 249, 46, 26, 61, 187, 219, 171, 46, 90, 81, + 236, 38, 209, 16, 187, 139, 132, 116, 138, 142, 28, 131, 60, 179, 231, 210, 179, 78, 143, + 154, 118, 62, 250, 185, 127, 59, 223, 67, 254, 39, 118, 173, 95, 183, 170, 86, 175, 149, + 136, 126, 62, 122, 58, 120, 107, 50, 88, 184, 172, 42, 168, 164, 25, 147, 85, 69, 51, 7, 76, + 167, 27, 166, 141, 175, 89, 9, 38, 211, 221, 206, 70, 43, 211, 104, 86, 66, 208, 18, 30, 31, + 51, 95, 97, 235, 89, 188, 50, 167, 211, 152, 113, 172, 130, 26, 206, 75, 227, 97, 163, 39, + 227, 61, 147, 32, 140, 183, 204, 231, 108, 54, 149, 240, 43, 137, 23, 163, 181, 192, 12, 46, + 195, 66, 220, 236, 28, 211, 198, 121, 87, 16, 180, 156, 122, 139, 142, 199, 40, 138, 9, 82, + 67, 115, 54, 46, 3, 118, 59, 213, 228, 85, 18, 149, 131, 215, 16, 163, 99, 186, 104, 154, + 58, 8, 222, 46, 181, 163, 86, 86, 46, 49, 170, 89, 5, 205, 108, 196, 127, 178, 190, 106, 38, + 222, 86, 206, 143, 233, 111, 226, 158, 98, 227, 202, 152, 158, 165, 186, 166, 102, 238, 35, + 198, 153, 241, 44, 38, 141, 202, 249, 140, 65, 107, 168, 175, 38, 60, 59, 247, 167, 153, + 219, 172, 105, 91, 201, 109, 40, 165, 117, 205, 22, 11, 215, 64, 139, 132, 166, 81, 49, 245, + 213, 36, 155, 97, 148, 145, 94, 14, 174, 5, 147, 228, 208, 49, 77, 220, 66, 102, 79, 9, 167, + 103, 82, 167, 114, 168, 166, 89, 149, 30, 101, 54, 110, 231, 146, 163, 251, 82, 211, 131, + 249, 127, 90, 76, 178, 157, 219, 95, 78, 63, 153, 219, 239, 32, 136, 131, 199, 198, 76, 252, + 163, 124, 163, 185, 83, 198, 57, 84, 196, 242, 168, 134, 219, 103, 230, 126, 168, 226, 18, + 138, 248, 26, 243, 34, 243, 103, 121, 12, 211, 22, 23, 149, 98, 238, 47, 22, 55, 166, 121, + 9, 151, 100, 230, 30, 177, 159, 209, 146, 40, 183, 142, 209, 57, 83, 118, 68, 37, 148, 113, + 251, 44, 220, 83, 229, 28, 219, 78, 126, 180, 16, 190, 53, 6, 209, 242, 209, 202, 109, 45, + 214, 125, 171, 241, 212, 242, 94, 203, 137, 242, 56, 239, 22, 115, 27, 89, 100, 47, 37, 169, + 22, 61, 167, 204, 220, 119, 29, 173, 208, 42, 132, 233, 223, 110, 133, 22, 1, 179, 254, 44, + 142, 243, 89, 123, 244, 43, 245, 232, 22, 199, 98, 93, 197, 179, 236, 116, 175, 76, 231, + 181, 104, 225, 88, 102, 30, 107, 123, 204, 11, 165, 188, 126, 43, 116, 205, 107, 226, 50, + 44, 26, 199, 26, 61, 63, 171, 98, 154, 117, 244, 111, 180, 142, 162, 120, 231, 178, 119, + 104, 188, 162, 178, 59, 70, 176, 132, 231, 83, 185, 174, 161, 61, 230, 141, 223, 230, 219, + 190, 127, 89, 232, 140, 115, 241, 247, 159, 72, 108, 255, 238, 120, 146, 199, 223, 36, 219, + 111, 168, 241, 119, 81, 83, 220, 158, 27, 127, 51, 208, 118, 227, 50, 142, 235, 235, 132, + 215, 14, 213, 246, 105, 237, 252, 106, 127, 7, 138, 191, 203, 157, 233, 20, 139, 190, 57, + 107, 119, 252, 246, 155, 112, 244, 54, 162, 237, 225, 218, 187, 82, 252, 77, 216, 205, 239, + 236, 218, 157, 48, 28, 187, 165, 104, 231, 72, 32, 118, 83, 105, 226, 171, 237, 231, 187, + 246, 118, 232, 227, 24, 241, 239, 127, 97, 46, 87, 179, 172, 81, 167, 232, 204, 75, 187, + 103, 58, 249, 205, 129, 73, 11, 159, 193, 155, 103, 59, 169, 58, 191, 49, 6, 249, 217, 175, + 73, 105, 226, 227, 136, 126, 75, 97, 246, 53, 234, 184, 12, 126, 85, 167, 183, 228, 80, 167, + 183, 172, 223, 138, 65, 212, 150, 223, 242, 127, 136, 199, 59, 168, 191, 99, 121, 185, 135, + 217, 253, 50, 7, 162, 255, 182, 20, 125, 95, 107, 247, 9, 243, 128, 135, 175, 249, 58, 69, + 189, 61, 251, 24, 183, 66, 232, 124, 47, 101, 62, 168, 139, 211, 220, 173, 71, 60, 192, 239, + 23, 57, 209, 79, 110, 219, 70, 196, 62, 43, 236, 248, 133, 82, 10, 255, 63, 98, 3, 32, 136, + 32, 129, 17, 18, 32, 17, 186, 80, 37, 36, 67, 10, 85, 68, 26, 116, 133, 116, 232, 6, 25, + 208, 29, 50, 161, 7, 244, 132, 94, 112, 30, 244, 134, 62, 208, 23, 250, 65, 127, 24, 0, 3, + 73, 214, 32, 58, 175, 7, 195, 249, 144, 13, 67, 96, 40, 12, 131, 225, 112, 1, 140, 32, 237, + 71, 146, 252, 92, 254, 239, 94, 249, 80, 0, 23, 194, 104, 24, 3, 99, 225, 34, 24, 71, 118, + 140, 135, 9, 48, 17, 46, 134, 75, 96, 18, 223, 23, 138, 121, 253, 150, 242, 211, 196, 10, + 83, 232, 196, 41, 167, 10, 175, 228, 167, 213, 165, 84, 165, 236, 196, 168, 161, 51, 101, + 58, 157, 235, 51, 225, 50, 248, 29, 204, 130, 203, 97, 54, 92, 1, 115, 248, 253, 211, 197, + 243, 202, 195, 223, 56, 189, 244, 134, 59, 151, 124, 238, 227, 126, 9, 194, 60, 254, 126, + 16, 33, 159, 179, 15, 63, 23, 80, 44, 174, 130, 133, 112, 53, 44, 130, 107, 96, 49, 255, + 228, 243, 58, 88, 202, 63, 86, 189, 30, 150, 195, 13, 176, 2, 86, 194, 42, 184, 17, 110, + 130, 155, 201, 107, 107, 224, 22, 184, 21, 214, 178, 207, 49, 161, 5, 238, 128, 59, 225, 46, + 88, 7, 119, 195, 122, 184, 7, 54, 192, 31, 96, 35, 220, 11, 155, 224, 62, 216, 12, 247, 195, + 3, 240, 71, 120, 16, 30, 130, 45, 240, 48, 60, 2, 143, 194, 86, 120, 12, 182, 193, 159, 248, + 71, 162, 236, 179, 80, 246, 137, 232, 46, 120, 10, 118, 195, 30, 216, 11, 79, 195, 159, 225, + 25, 120, 22, 246, 193, 115, 176, 31, 158, 135, 3, 240, 2, 28, 132, 23, 225, 16, 188, 4, 135, + 245, 207, 92, 95, 229, 159, 184, 178, 15, 91, 143, 193, 155, 240, 22, 188, 13, 239, 232, + 159, 159, 190, 15, 31, 192, 135, 112, 2, 62, 130, 191, 242, 15, 83, 63, 133, 191, 193, 103, + 240, 57, 124, 1, 127, 135, 47, 225, 36, 252, 3, 190, 130, 175, 225, 27, 254, 145, 237, 63, + 225, 7, 248, 30, 126, 132, 159, 248, 103, 172, 63, 195, 41, 254, 121, 107, 155, 0, 130, 32, + 24, 96, 191, 128, 130, 40, 72, 130, 81, 72, 16, 18, 133, 46, 66, 146, 144, 44, 164, 116, 9, + 123, 34, 245, 205, 193, 122, 197, 47, 90, 26, 67, 1, 201, 53, 230, 194, 209, 227, 216, 115, + 76, 30, 127, 142, 226, 207, 124, 254, 44, 224, 207, 49, 252, 57, 150, 63, 47, 226, 207, 113, + 187, 12, 75, 38, 181, 253, 172, 98, 107, 38, 254, 43, 27, 127, 202, 199, 255, 104, 193, 31, + 211, 240, 7, 21, 191, 87, 241, 159, 217, 248, 93, 26, 126, 219, 130, 223, 100, 227, 215, 43, + 205, 210, 215, 42, 126, 213, 130, 255, 104, 193, 147, 173, 248, 101, 43, 254, 93, 197, 47, + 10, 241, 243, 34, 252, 76, 197, 191, 229, 227, 167, 159, 216, 165, 79, 91, 240, 19, 66, 252, + 196, 142, 31, 255, 53, 87, 250, 184, 21, 255, 154, 139, 31, 169, 120, 66, 197, 15, 243, 241, + 131, 76, 124, 191, 5, 223, 83, 241, 120, 6, 190, 187, 8, 223, 217, 131, 111, 171, 248, 38, + 161, 191, 185, 8, 143, 189, 81, 38, 29, 91, 132, 111, 148, 225, 209, 215, 251, 74, 71, 85, + 124, 189, 47, 190, 166, 226, 95, 84, 124, 85, 197, 87, 84, 60, 210, 130, 47, 31, 30, 32, + 189, 172, 226, 225, 1, 248, 82, 62, 30, 82, 241, 133, 101, 221, 164, 23, 250, 225, 129, 158, + 248, 188, 138, 251, 85, 124, 78, 197, 125, 42, 62, 171, 226, 51, 42, 254, 89, 197, 167, 85, + 220, 171, 226, 30, 21, 119, 119, 195, 167, 174, 207, 150, 158, 82, 113, 215, 147, 123, 164, + 93, 42, 62, 185, 243, 114, 233, 201, 61, 248, 228, 18, 113, 231, 19, 217, 210, 206, 203, 39, + 181, 225, 206, 73, 226, 19, 217, 184, 67, 197, 199, 91, 112, 187, 138, 127, 82, 113, 155, + 138, 143, 169, 184, 213, 141, 143, 166, 225, 35, 15, 103, 75, 143, 184, 241, 225, 45, 25, + 210, 195, 217, 184, 37, 3, 31, 34, 165, 31, 106, 197, 7, 85, 252, 163, 138, 15, 168, 120, + 127, 6, 110, 86, 241, 190, 77, 105, 210, 125, 249, 184, 41, 13, 239, 117, 227, 70, 66, 217, + 216, 130, 127, 80, 113, 195, 61, 41, 210, 6, 21, 239, 73, 193, 245, 119, 247, 150, 214, 187, + 241, 238, 117, 233, 210, 221, 189, 113, 93, 58, 222, 149, 132, 119, 170, 120, 71, 75, 170, + 116, 135, 138, 45, 169, 120, 59, 17, 221, 222, 130, 183, 173, 77, 147, 110, 27, 134, 107, + 211, 240, 214, 86, 188, 101, 205, 30, 233, 22, 21, 215, 172, 190, 92, 90, 179, 7, 215, 44, + 17, 87, 223, 156, 45, 173, 190, 28, 87, 79, 18, 111, 206, 198, 155, 84, 188, 113, 85, 142, + 116, 163, 138, 171, 114, 112, 37, 153, 185, 210, 140, 43, 110, 72, 150, 86, 100, 226, 13, + 201, 184, 156, 0, 203, 221, 120, 61, 121, 234, 250, 108, 92, 214, 13, 127, 175, 226, 210, + 235, 186, 73, 75, 85, 188, 174, 27, 94, 171, 226, 18, 21, 23, 171, 56, 169, 237, 154, 69, + 139, 164, 107, 84, 92, 180, 8, 175, 118, 227, 66, 71, 15, 105, 97, 54, 94, 165, 98, 179, + 138, 11, 210, 176, 41, 5, 231, 39, 97, 163, 138, 145, 86, 12, 183, 98, 168, 21, 231, 181, + 98, 80, 197, 128, 138, 126, 21, 27, 6, 225, 92, 21, 175, 236, 86, 36, 93, 105, 71, 175, 138, + 245, 139, 176, 142, 38, 30, 21, 21, 21, 221, 42, 186, 84, 172, 85, 209, 89, 136, 115, 90, + 113, 118, 10, 94, 174, 226, 239, 84, 188, 76, 197, 153, 51, 146, 164, 153, 173, 56, 35, 9, + 167, 247, 236, 45, 77, 207, 199, 105, 42, 214, 144, 228, 154, 34, 116, 244, 64, 187, 144, + 46, 217, 207, 67, 91, 38, 94, 58, 165, 187, 116, 169, 138, 213, 201, 88, 165, 98, 101, 69, + 186, 84, 169, 98, 69, 58, 150, 171, 56, 149, 86, 166, 170, 56, 197, 154, 46, 77, 233, 142, + 214, 254, 169, 146, 53, 29, 39, 167, 98, 153, 138, 165, 45, 104, 105, 193, 18, 21, 139, 13, + 35, 165, 226, 86, 44, 218, 131, 230, 169, 56, 73, 197, 75, 84, 188, 120, 98, 134, 116, 113, + 38, 78, 156, 208, 85, 154, 152, 129, 19, 198, 167, 74, 19, 38, 181, 117, 197, 241, 169, 88, + 168, 226, 56, 21, 47, 26, 155, 41, 93, 212, 138, 99, 199, 164, 75, 99, 51, 113, 204, 232, + 100, 105, 76, 58, 142, 78, 198, 11, 7, 96, 65, 42, 230, 143, 74, 150, 242, 85, 28, 149, 140, + 121, 185, 201, 82, 94, 42, 230, 38, 99, 206, 200, 46, 82, 78, 58, 142, 236, 130, 166, 124, + 28, 113, 65, 182, 52, 194, 141, 23, 12, 207, 144, 46, 200, 198, 225, 25, 56, 108, 104, 182, + 52, 204, 140, 67, 179, 113, 72, 118, 178, 52, 164, 43, 102, 39, 227, 249, 42, 14, 86, 49, + 171, 43, 14, 34, 59, 7, 101, 160, 236, 198, 129, 173, 56, 128, 76, 24, 224, 198, 254, 169, + 216, 143, 60, 216, 79, 197, 190, 173, 216, 167, 8, 123, 211, 164, 183, 138, 231, 185, 177, + 23, 121, 170, 151, 138, 61, 137, 168, 103, 111, 236, 161, 98, 166, 138, 221, 85, 204, 32, + 132, 12, 21, 187, 145, 173, 221, 138, 48, 125, 17, 118, 117, 99, 154, 138, 169, 41, 61, 165, + 84, 21, 83, 8, 59, 165, 39, 38, 171, 152, 148, 142, 93, 84, 76, 36, 180, 68, 21, 19, 50, + 209, 232, 70, 145, 22, 69, 202, 128, 30, 72, 80, 84, 209, 64, 115, 195, 72, 20, 210, 17, 84, + 20, 118, 9, 238, 101, 55, 9, 35, 254, 47, 252, 129, 255, 109, 5, 206, 250, 167, 255, 127, 2, + 153, 150, 66, 246, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 49, 52, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 49, 53, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 19, 96, 128, 0, 1, + 6, 236, 0, 0, 3, 160, 0, 33, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, + 110, 100, 111, 98, 106, 13, 49, 52, 49, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, + 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, + 103, 116, 104, 32, 49, 55, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 147, 96, + 0, 3, 14, 32, 102, 98, 192, 2, 0, 4, 18, 0, 35, 13, 10, 101, 110, 100, 115, 116, 114, 101, + 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 52, 50, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 76, 101, 110, 103, 116, 104, 32, 49, 51, 52, 48, 48, 47, 76, 101, 110, 103, 116, 104, + 49, 32, 50, 57, 52, 49, 57, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 237, 156, + 7, 92, 213, 87, 182, 239, 215, 222, 251, 127, 10, 135, 222, 59, 252, 225, 0, 130, 84, 1, 65, + 16, 229, 72, 19, 123, 65, 12, 104, 84, 142, 112, 84, 34, 45, 112, 16, 107, 98, 122, 98, 18, + 77, 98, 122, 209, 100, 210, 199, 100, 60, 98, 76, 72, 55, 137, 209, 244, 50, 233, 51, 169, + 106, 122, 76, 76, 207, 24, 229, 255, 214, 254, 175, 63, 136, 196, 185, 147, 185, 159, 251, + 222, 187, 239, 221, 0, 63, 190, 187, 151, 181, 215, 46, 39, 241, 3, 48, 0, 240, 133, 245, + 32, 96, 230, 140, 154, 236, 220, 182, 171, 221, 71, 48, 229, 93, 84, 67, 99, 171, 179, 163, + 179, 250, 239, 239, 0, 176, 18, 0, 235, 39, 141, 43, 220, 234, 244, 13, 83, 70, 2, 216, 18, + 1, 204, 55, 46, 233, 88, 218, 122, 203, 23, 101, 247, 0, 4, 60, 6, 224, 21, 188, 180, 101, + 213, 146, 89, 123, 222, 190, 12, 32, 242, 85, 76, 107, 90, 230, 114, 54, 237, 159, 191, 253, + 51, 128, 145, 133, 216, 94, 193, 50, 76, 240, 159, 23, 180, 25, 227, 173, 24, 79, 90, 214, + 234, 94, 121, 247, 229, 113, 187, 49, 126, 57, 64, 224, 185, 45, 237, 141, 206, 9, 95, 97, + 14, 148, 132, 98, 252, 194, 86, 231, 202, 142, 192, 189, 252, 121, 128, 105, 55, 97, 162, + 218, 230, 108, 117, 101, 68, 172, 107, 196, 248, 163, 0, 126, 243, 59, 218, 187, 220, 90, + 37, 60, 4, 112, 106, 132, 204, 239, 232, 116, 117, 172, 220, 59, 51, 24, 227, 99, 0, 194, + 118, 130, 80, 146, 248, 35, 96, 2, 171, 233, 58, 83, 30, 206, 34, 142, 40, 94, 129, 135, 56, + 88, 129, 251, 91, 184, 80, 20, 27, 87, 110, 6, 254, 141, 3, 212, 53, 96, 124, 77, 171, 81, + 85, 72, 0, 245, 87, 197, 12, 253, 192, 246, 88, 182, 240, 20, 21, 96, 171, 204, 19, 187, 77, + 126, 178, 55, 180, 24, 12, 42, 6, 164, 29, 193, 252, 55, 140, 49, 61, 174, 152, 209, 38, + 176, 22, 28, 216, 127, 9, 156, 193, 206, 100, 87, 48, 141, 71, 243, 125, 252, 89, 254, 158, + 80, 132, 85, 248, 136, 32, 17, 42, 82, 69, 133, 232, 22, 103, 136, 13, 226, 18, 113, 139, + 120, 73, 89, 164, 52, 42, 221, 202, 229, 113, 231, 197, 125, 175, 6, 168, 161, 106, 148, 26, + 167, 38, 170, 41, 106, 142, 90, 172, 142, 83, 43, 212, 14, 117, 163, 122, 79, 130, 41, 33, + 56, 33, 60, 65, 77, 72, 76, 72, 73, 200, 74, 88, 148, 112, 93, 34, 79, 52, 39, 250, 39, 6, + 37, 70, 37, 198, 37, 166, 39, 86, 39, 54, 36, 186, 146, 159, 251, 85, 209, 52, 125, 172, 55, + 99, 239, 71, 120, 4, 223, 139, 189, 191, 45, 64, 152, 133, 77, 239, 61, 5, 123, 119, 99, + 239, 231, 98, 239, 27, 197, 173, 10, 40, 139, 149, 78, 229, 178, 184, 245, 113, 223, 97, + 239, 193, 106, 132, 26, 163, 170, 122, 239, 69, 70, 239, 110, 163, 247, 176, 193, 222, 107, + 18, 46, 51, 122, 15, 76, 140, 28, 236, 189, 9, 123, 7, 189, 119, 224, 209, 100, 85, 173, 98, + 192, 190, 90, 108, 63, 174, 179, 86, 175, 101, 105, 118, 128, 254, 62, 24, 246, 117, 96, + 241, 96, 40, 239, 160, 237, 64, 250, 129, 224, 3, 7, 15, 156, 15, 176, 255, 200, 126, 207, + 1, 92, 219, 253, 103, 239, 63, 19, 83, 99, 100, 137, 253, 83, 246, 79, 222, 175, 183, 188, + 63, 107, 191, 253, 163, 95, 63, 218, 255, 209, 129, 247, 47, 198, 40, 131, 181, 12, 203, + 242, 31, 120, 191, 80, 112, 153, 20, 225, 39, 194, 68, 148, 190, 134, 81, 212, 186, 64, 191, + 17, 137, 162, 90, 108, 81, 78, 85, 22, 42, 77, 202, 18, 165, 3, 64, 233, 80, 220, 202, 74, + 101, 237, 208, 17, 41, 110, 131, 127, 26, 76, 185, 81, 185, 207, 8, 237, 86, 158, 60, 161, + 172, 156, 143, 16, 147, 197, 53, 226, 1, 113, 151, 82, 36, 174, 21, 87, 163, 141, 207, 20, + 27, 149, 113, 162, 86, 116, 138, 58, 209, 34, 190, 18, 135, 196, 215, 226, 27, 113, 88, 124, + 43, 190, 19, 223, 139, 31, 196, 143, 226, 20, 49, 87, 169, 80, 38, 40, 149, 98, 154, 184, 1, + 20, 8, 132, 32, 136, 64, 95, 74, 129, 17, 144, 1, 217, 80, 140, 158, 52, 30, 42, 160, 18, + 166, 192, 41, 80, 15, 243, 96, 33, 52, 193, 50, 232, 2, 55, 172, 130, 213, 112, 166, 88, 47, + 58, 196, 89, 226, 74, 177, 154, 29, 98, 156, 249, 179, 0, 22, 197, 226, 88, 42, 155, 201, + 230, 177, 5, 172, 153, 181, 176, 118, 214, 205, 86, 176, 117, 236, 34, 118, 49, 187, 132, + 93, 198, 174, 103, 187, 216, 110, 246, 4, 219, 203, 246, 177, 23, 196, 217, 162, 77, 156, + 35, 174, 194, 209, 79, 17, 127, 22, 247, 136, 219, 196, 118, 209, 46, 46, 231, 22, 177, 133, + 189, 34, 150, 41, 147, 112, 244, 55, 115, 95, 244, 148, 42, 241, 139, 248, 7, 251, 78, 153, + 45, 174, 16, 107, 249, 72, 241, 51, 123, 85, 52, 43, 25, 202, 72, 37, 87, 76, 71, 159, 55, + 131, 5, 183, 152, 23, 248, 128, 63, 132, 67, 44, 196, 65, 60, 238, 168, 28, 24, 5, 185, 144, + 15, 209, 80, 13, 83, 97, 26, 76, 135, 25, 48, 83, 41, 133, 57, 208, 12, 167, 193, 114, 104, + 197, 29, 83, 199, 174, 101, 130, 41, 204, 196, 204, 204, 194, 108, 204, 151, 133, 178, 120, + 166, 178, 4, 102, 103, 11, 217, 34, 214, 192, 22, 179, 88, 182, 138, 201, 61, 181, 158, 157, + 197, 206, 86, 28, 236, 124, 118, 63, 123, 128, 245, 177, 135, 216, 179, 108, 3, 123, 30, + 108, 204, 10, 222, 204, 11, 252, 152, 15, 4, 179, 64, 8, 97, 65, 16, 198, 66, 32, 148, 5, + 67, 36, 139, 134, 40, 22, 3, 137, 44, 9, 236, 44, 25, 146, 88, 10, 36, 179, 17, 160, 178, + 68, 72, 101, 179, 32, 141, 205, 134, 145, 172, 6, 210, 217, 28, 200, 100, 243, 33, 139, 157, + 10, 121, 204, 9, 163, 89, 35, 20, 176, 38, 24, 195, 92, 80, 200, 150, 64, 17, 91, 10, 99, + 217, 114, 24, 199, 90, 89, 27, 148, 178, 14, 152, 192, 58, 193, 193, 78, 135, 114, 230, 134, + 50, 214, 5, 85, 172, 7, 38, 177, 213, 48, 145, 173, 100, 107, 96, 50, 91, 11, 179, 216, 57, + 48, 155, 157, 11, 53, 236, 60, 152, 203, 46, 132, 249, 236, 82, 88, 192, 54, 193, 169, 108, + 35, 44, 98, 151, 67, 3, 187, 2, 22, 179, 43, 193, 201, 54, 195, 18, 118, 35, 184, 216, 13, + 176, 148, 221, 4, 45, 236, 65, 104, 99, 15, 67, 59, 123, 4, 58, 216, 163, 112, 58, 123, 12, + 58, 217, 227, 208, 195, 246, 192, 58, 246, 28, 156, 1, 235, 217, 139, 112, 54, 123, 25, 206, + 98, 47, 177, 235, 192, 151, 121, 67, 0, 243, 131, 90, 118, 1, 52, 178, 171, 100, 91, 236, + 103, 118, 148, 7, 241, 36, 30, 206, 51, 56, 231, 241, 236, 48, 251, 17, 207, 4, 19, 15, 224, + 161, 60, 149, 123, 243, 40, 158, 136, 39, 84, 22, 79, 231, 153, 252, 122, 126, 35, 31, 197, + 183, 240, 2, 94, 196, 75, 248, 100, 62, 147, 159, 205, 115, 120, 46, 207, 227, 249, 124, 52, + 47, 228, 99, 120, 49, 31, 203, 199, 243, 82, 238, 224, 19, 120, 25, 47, 231, 149, 188, 138, + 79, 228, 213, 124, 18, 159, 202, 167, 241, 233, 124, 6, 31, 199, 167, 240, 46, 190, 138, + 175, 229, 235, 249, 102, 222, 201, 221, 124, 5, 239, 225, 43, 249, 106, 190, 134, 175, 227, + 103, 242, 115, 248, 185, 252, 60, 126, 62, 191, 128, 95, 196, 47, 230, 151, 240, 141, 252, + 82, 190, 137, 95, 198, 175, 228, 87, 243, 107, 248, 181, 252, 44, 126, 5, 223, 192, 47, 231, + 215, 241, 123, 248, 189, 252, 13, 126, 23, 255, 43, 127, 146, 239, 228, 247, 241, 93, 252, + 65, 254, 8, 127, 147, 63, 192, 123, 249, 211, 252, 57, 126, 27, 191, 157, 223, 193, 239, + 228, 127, 230, 219, 248, 95, 248, 118, 238, 225, 59, 248, 253, 188, 143, 63, 196, 31, 230, + 143, 242, 199, 249, 110, 254, 4, 127, 138, 239, 193, 179, 247, 25, 60, 255, 158, 231, 47, + 240, 23, 249, 75, 252, 101, 254, 10, 127, 149, 191, 198, 95, 199, 147, 216, 87, 248, 139, 0, + 17, 130, 231, 67, 164, 136, 18, 209, 34, 70, 36, 8, 187, 72, 198, 243, 49, 85, 140, 20, 25, + 34, 83, 100, 139, 81, 34, 95, 140, 22, 5, 98, 140, 40, 18, 197, 98, 172, 40, 17, 227, 196, + 120, 225, 16, 19, 68, 184, 136, 16, 101, 34, 80, 148, 138, 44, 17, 39, 226, 133, 42, 146, + 196, 8, 81, 142, 39, 75, 172, 200, 21, 133, 252, 45, 81, 193, 31, 19, 105, 124, 175, 200, + 227, 119, 139, 32, 232, 102, 79, 194, 10, 246, 20, 172, 100, 79, 195, 26, 246, 12, 158, 192, + 43, 196, 74, 49, 79, 204, 23, 139, 197, 66, 177, 72, 52, 138, 77, 226, 50, 177, 70, 28, 17, + 191, 138, 163, 226, 152, 232, 23, 26, 158, 204, 76, 225, 10, 94, 87, 236, 67, 197, 164, 152, + 21, 139, 98, 85, 188, 20, 155, 226, 173, 248, 40, 190, 138, 159, 226, 175, 4, 40, 129, 74, + 144, 18, 44, 238, 23, 91, 149, 116, 37, 71, 201, 84, 70, 41, 121, 202, 104, 37, 75, 41, 80, + 178, 149, 124, 165, 80, 25, 163, 164, 41, 115, 149, 58, 229, 20, 165, 30, 79, 187, 69, 202, + 124, 101, 30, 158, 123, 11, 148, 57, 202, 120, 177, 86, 153, 193, 210, 89, 22, 155, 200, + 198, 176, 41, 96, 230, 62, 160, 31, 161, 116, 175, 13, 249, 98, 192, 241, 91, 63, 214, 135, + 159, 218, 191, 41, 9, 255, 207, 159, 131, 160, 159, 96, 225, 120, 122, 85, 195, 76, 104, + 197, 83, 73, 224, 185, 100, 193, 147, 201, 134, 167, 146, 138, 231, 146, 60, 149, 22, 225, + 185, 36, 79, 165, 85, 120, 34, 157, 129, 103, 210, 217, 120, 42, 61, 128, 39, 18, 158, 71, + 184, 146, 183, 234, 39, 233, 229, 184, 158, 87, 176, 107, 197, 205, 98, 139, 184, 133, 125, + 199, 45, 74, 25, 158, 140, 115, 148, 169, 74, 149, 50, 81, 169, 22, 219, 149, 217, 202, 52, + 92, 137, 26, 126, 177, 50, 157, 189, 194, 94, 85, 102, 225, 201, 119, 190, 152, 46, 166, 40, + 147, 148, 25, 226, 94, 165, 92, 153, 41, 150, 137, 102, 81, 143, 111, 12, 124, 211, 224, + 201, 137, 39, 136, 238, 59, 210, 103, 208, 123, 20, 135, 82, 139, 103, 223, 25, 74, 170, + 184, 67, 52, 9, 151, 92, 77, 244, 163, 181, 232, 85, 141, 74, 49, 158, 199, 241, 120, 42, + 39, 224, 89, 76, 103, 112, 142, 126, 254, 2, 158, 195, 242, 228, 109, 102, 75, 216, 207, + 120, 46, 248, 26, 103, 196, 72, 30, 207, 51, 216, 81, 185, 132, 150, 45, 120, 71, 111, 30, + 178, 178, 29, 112, 22, 220, 8, 219, 96, 23, 190, 189, 158, 128, 231, 224, 53, 248, 158, 217, + 160, 1, 206, 131, 199, 225, 0, 124, 1, 223, 193, 175, 12, 208, 74, 161, 44, 134, 165, 253, + 11, 47, 249, 55, 190, 250, 207, 49, 181, 130, 175, 216, 141, 179, 8, 199, 215, 195, 17, 237, + 243, 254, 187, 181, 207, 1, 240, 61, 118, 60, 101, 51, 198, 194, 149, 148, 227, 41, 90, 144, + 118, 104, 120, 90, 255, 230, 254, 190, 254, 151, 204, 120, 70, 234, 117, 3, 248, 243, 152, + 122, 152, 29, 210, 142, 240, 82, 25, 215, 10, 100, 156, 95, 32, 195, 122, 141, 195, 150, 45, + 253, 219, 251, 183, 158, 48, 156, 69, 56, 227, 54, 104, 71, 107, 156, 14, 139, 97, 41, 198, + 58, 97, 37, 122, 223, 26, 88, 135, 231, 241, 153, 248, 166, 62, 7, 45, 114, 62, 92, 0, 23, + 225, 239, 75, 224, 82, 216, 8, 155, 224, 114, 184, 2, 54, 195, 149, 112, 21, 92, 13, 215, + 192, 181, 112, 29, 92, 15, 55, 160, 53, 111, 130, 45, 152, 126, 53, 198, 183, 232, 185, 160, + 231, 220, 12, 127, 130, 59, 224, 46, 248, 51, 220, 3, 247, 194, 95, 224, 22, 140, 223, 10, + 183, 193, 237, 112, 39, 166, 222, 141, 233, 219, 48, 126, 167, 94, 98, 155, 81, 102, 11, + 166, 220, 129, 105, 119, 27, 181, 182, 131, 7, 118, 24, 121, 20, 238, 133, 157, 112, 31, + 174, 222, 246, 97, 241, 7, 160, 15, 30, 132, 251, 13, 62, 4, 15, 195, 35, 240, 40, 60, 134, + 171, 186, 27, 215, 249, 73, 227, 55, 229, 12, 77, 255, 231, 53, 94, 128, 167, 96, 15, 60, + 13, 123, 97, 31, 60, 3, 207, 162, 175, 60, 143, 105, 47, 194, 75, 240, 242, 111, 210, 79, + 150, 54, 80, 246, 159, 183, 242, 10, 188, 10, 127, 69, 15, 124, 29, 222, 128, 55, 225, 109, + 120, 7, 254, 6, 127, 135, 247, 225, 3, 216, 143, 190, 120, 16, 190, 210, 75, 80, 238, 187, + 240, 30, 230, 124, 136, 169, 251, 225, 179, 97, 53, 223, 26, 172, 75, 165, 62, 192, 114, 31, + 25, 109, 124, 2, 159, 98, 249, 207, 225, 16, 124, 61, 164, 14, 149, 127, 23, 75, 125, 6, 63, + 193, 207, 232, 243, 86, 60, 101, 98, 153, 31, 190, 49, 126, 132, 95, 48, 238, 203, 194, 48, + 231, 8, 243, 194, 80, 2, 27, 193, 50, 113, 71, 102, 179, 124, 54, 154, 141, 101, 19, 88, 25, + 155, 141, 177, 28, 125, 247, 93, 134, 126, 113, 37, 174, 62, 249, 195, 245, 232, 15, 61, + 232, 71, 23, 97, 154, 244, 22, 90, 241, 59, 112, 215, 221, 61, 184, 202, 219, 113, 221, 228, + 170, 221, 128, 54, 151, 223, 143, 235, 150, 127, 242, 36, 150, 122, 17, 103, 122, 23, 214, + 218, 161, 175, 241, 111, 215, 234, 73, 163, 198, 51, 152, 255, 28, 250, 221, 208, 82, 114, + 37, 159, 58, 161, 53, 105, 241, 63, 235, 35, 144, 126, 243, 16, 150, 216, 109, 212, 126, + 118, 112, 53, 222, 192, 86, 94, 63, 193, 154, 251, 225, 99, 204, 145, 118, 147, 249, 111, + 235, 57, 207, 235, 86, 254, 64, 183, 242, 65, 204, 255, 68, 95, 5, 89, 138, 236, 251, 22, + 174, 239, 155, 131, 45, 236, 193, 241, 126, 132, 117, 255, 138, 235, 242, 87, 189, 148, 92, + 181, 119, 80, 178, 204, 179, 88, 234, 30, 204, 127, 223, 88, 185, 207, 224, 75, 92, 45, 185, + 102, 95, 96, 236, 83, 12, 63, 162, 159, 76, 31, 227, 136, 229, 90, 30, 48, 242, 94, 192, + 156, 195, 120, 94, 253, 128, 43, 251, 13, 124, 139, 161, 239, 49, 44, 191, 159, 192, 148, + 239, 80, 95, 99, 234, 55, 216, 195, 247, 40, 89, 230, 75, 28, 215, 97, 28, 209, 87, 184, + 198, 223, 225, 170, 255, 140, 57, 255, 192, 240, 79, 112, 20, 191, 127, 192, 17, 29, 129, + 95, 49, 36, 115, 254, 134, 57, 63, 233, 113, 252, 40, 132, 31, 36, 53, 60, 21, 25, 222, 71, + 2, 211, 101, 24, 244, 58, 71, 113, 254, 199, 112, 52, 253, 88, 178, 159, 49, 56, 166, 191, + 126, 229, 219, 215, 138, 158, 99, 99, 222, 204, 7, 253, 71, 214, 212, 83, 168, 21, 244, 42, + 142, 165, 100, 158, 85, 79, 209, 203, 195, 47, 131, 229, 229, 157, 23, 200, 130, 88, 48, 11, + 193, 115, 56, 12, 91, 245, 195, 180, 32, 22, 97, 228, 120, 13, 228, 176, 112, 76, 243, 27, + 82, 30, 63, 123, 235, 105, 145, 44, 74, 126, 102, 150, 47, 111, 120, 9, 79, 242, 56, 248, 9, + 253, 59, 6, 61, 28, 95, 202, 152, 203, 89, 44, 174, 243, 27, 120, 255, 141, 192, 155, 53, + 141, 229, 176, 60, 54, 26, 107, 36, 225, 155, 250, 152, 238, 233, 227, 89, 41, 195, 207, + 119, 44, 153, 165, 224, 251, 26, 88, 58, 206, 15, 61, 158, 149, 96, 206, 4, 86, 193, 42, 49, + 87, 99, 25, 172, 0, 247, 195, 120, 86, 117, 178, 51, 159, 95, 135, 59, 64, 255, 194, 243, + 251, 109, 147, 31, 51, 225, 249, 255, 36, 159, 14, 43, 49, 254, 150, 163, 106, 209, 194, 5, + 167, 206, 159, 87, 95, 87, 59, 167, 102, 246, 172, 153, 51, 166, 79, 155, 58, 101, 242, 164, + 234, 137, 85, 149, 21, 229, 101, 19, 28, 165, 227, 199, 149, 140, 45, 46, 26, 83, 88, 48, + 58, 59, 43, 51, 35, 53, 37, 57, 201, 158, 24, 31, 17, 18, 24, 224, 239, 235, 109, 243, 178, + 90, 204, 38, 69, 112, 6, 25, 149, 246, 170, 6, 213, 147, 210, 224, 81, 82, 236, 213, 213, + 153, 50, 110, 119, 98, 130, 115, 72, 66, 131, 71, 197, 164, 170, 19, 203, 120, 212, 6, 189, + 152, 122, 98, 73, 7, 150, 92, 50, 172, 164, 131, 74, 58, 6, 75, 178, 0, 181, 4, 74, 50, 51, + 212, 74, 187, 234, 121, 177, 194, 174, 246, 177, 121, 179, 234, 48, 124, 105, 133, 189, 94, + 245, 28, 210, 195, 211, 244, 176, 146, 162, 71, 124, 49, 146, 144, 128, 53, 212, 202, 136, + 101, 21, 170, 135, 53, 168, 149, 158, 170, 21, 203, 54, 84, 54, 84, 96, 123, 59, 188, 109, + 229, 246, 114, 151, 45, 51, 3, 118, 216, 188, 49, 232, 141, 33, 79, 170, 189, 99, 7, 75, 29, + 207, 244, 0, 79, 173, 44, 222, 193, 193, 234, 43, 187, 245, 136, 228, 74, 103, 147, 103, + 230, 172, 186, 202, 138, 232, 132, 132, 122, 61, 13, 202, 245, 182, 60, 230, 114, 143, 69, + 111, 75, 109, 150, 99, 134, 139, 213, 29, 25, 187, 55, 92, 210, 23, 0, 139, 27, 210, 125, + 154, 236, 77, 206, 83, 235, 60, 194, 137, 149, 54, 136, 202, 13, 27, 46, 240, 4, 166, 123, + 210, 236, 21, 158, 180, 213, 7, 35, 112, 202, 46, 79, 134, 189, 162, 210, 147, 110, 199, + 198, 166, 204, 30, 236, 128, 121, 76, 201, 1, 118, 117, 195, 143, 128, 131, 183, 31, 250, + 234, 196, 20, 167, 145, 98, 78, 14, 248, 17, 100, 80, 78, 113, 208, 76, 152, 63, 16, 6, 28, + 27, 142, 16, 231, 151, 144, 32, 199, 114, 113, 159, 3, 22, 99, 196, 179, 126, 86, 29, 197, + 85, 88, 28, 221, 11, 142, 236, 244, 122, 15, 111, 144, 57, 187, 7, 114, 66, 107, 101, 206, + 250, 129, 156, 193, 234, 13, 246, 4, 185, 84, 149, 13, 198, 207, 138, 101, 17, 158, 245, + 139, 213, 204, 12, 180, 190, 254, 147, 140, 63, 152, 175, 122, 68, 74, 195, 226, 198, 101, + 146, 78, 215, 6, 123, 69, 5, 217, 109, 78, 157, 199, 81, 129, 1, 135, 211, 152, 107, 229, + 142, 156, 108, 44, 239, 108, 192, 73, 52, 75, 51, 204, 170, 243, 100, 219, 59, 60, 33, 246, + 50, 42, 128, 9, 170, 92, 131, 230, 154, 58, 189, 138, 81, 205, 19, 82, 238, 129, 134, 70, + 163, 150, 39, 187, 178, 66, 142, 75, 173, 220, 208, 80, 65, 3, 148, 109, 217, 103, 213, 61, + 8, 121, 218, 135, 59, 242, 213, 232, 157, 121, 248, 156, 171, 151, 227, 240, 132, 149, 227, + 162, 164, 84, 110, 168, 107, 90, 226, 137, 111, 136, 110, 66, 255, 92, 162, 214, 69, 39, + 120, 28, 245, 104, 190, 122, 123, 157, 171, 94, 174, 146, 61, 192, 147, 246, 33, 118, 151, + 160, 247, 168, 215, 194, 185, 13, 43, 61, 80, 88, 206, 220, 146, 108, 85, 235, 120, 180, + 168, 151, 171, 133, 9, 106, 21, 254, 178, 151, 149, 96, 70, 0, 46, 151, 30, 149, 43, 90, 86, + 162, 214, 225, 231, 235, 129, 98, 216, 139, 81, 66, 134, 78, 104, 7, 35, 34, 185, 188, 90, + 102, 9, 89, 181, 188, 58, 58, 161, 62, 129, 190, 254, 131, 33, 69, 27, 99, 50, 37, 123, 172, + 67, 218, 10, 192, 132, 193, 49, 81, 63, 255, 116, 104, 84, 90, 14, 40, 77, 173, 116, 85, 12, + 25, 224, 9, 141, 154, 140, 1, 26, 173, 157, 124, 156, 92, 218, 194, 232, 24, 107, 88, 229, + 114, 86, 15, 100, 137, 100, 220, 185, 152, 198, 177, 25, 61, 73, 174, 98, 132, 234, 129, + 153, 106, 157, 221, 101, 175, 183, 163, 15, 57, 102, 214, 201, 185, 73, 91, 235, 235, 59, + 165, 198, 62, 101, 214, 188, 58, 125, 181, 13, 47, 153, 115, 66, 140, 242, 199, 80, 204, 3, + 9, 152, 61, 16, 225, 229, 232, 131, 85, 233, 209, 3, 203, 170, 199, 39, 234, 241, 193, 104, + 245, 176, 236, 73, 3, 217, 234, 6, 171, 125, 74, 205, 6, 217, 184, 221, 104, 16, 84, 220, + 65, 56, 105, 115, 202, 36, 231, 197, 99, 130, 242, 113, 107, 86, 225, 233, 102, 175, 114, + 218, 213, 0, 181, 106, 131, 179, 79, 91, 191, 120, 195, 14, 135, 99, 67, 71, 101, 195, 178, + 98, 217, 134, 125, 82, 211, 6, 123, 77, 93, 73, 180, 62, 214, 217, 117, 235, 162, 87, 203, + 174, 130, 96, 10, 155, 50, 167, 44, 51, 3, 207, 158, 178, 29, 118, 118, 225, 172, 29, 14, + 118, 97, 205, 188, 186, 7, 241, 125, 173, 94, 56, 167, 174, 151, 51, 94, 222, 80, 86, 191, + 35, 9, 243, 234, 30, 84, 1, 28, 122, 42, 151, 169, 50, 81, 70, 84, 25, 145, 45, 205, 198, + 136, 85, 47, 31, 253, 160, 3, 96, 189, 158, 171, 232, 9, 122, 188, 177, 143, 129, 158, 102, + 29, 72, 99, 208, 216, 199, 41, 45, 96, 32, 141, 99, 154, 66, 105, 14, 61, 77, 126, 225, 34, + 69, 44, 67, 19, 227, 113, 91, 169, 54, 201, 229, 89, 91, 191, 108, 67, 67, 189, 220, 92, 16, + 134, 75, 137, 63, 204, 195, 236, 227, 193, 195, 237, 227, 119, 48, 110, 246, 241, 216, 236, + 174, 50, 143, 183, 189, 76, 166, 151, 202, 244, 82, 74, 55, 203, 116, 11, 58, 6, 222, 178, + 104, 28, 121, 38, 109, 104, 176, 227, 57, 133, 14, 85, 7, 209, 140, 92, 81, 200, 38, 213, + 62, 77, 155, 83, 151, 240, 98, 244, 161, 250, 4, 116, 181, 83, 81, 243, 234, 60, 94, 233, + 120, 246, 155, 146, 39, 99, 185, 137, 82, 13, 152, 60, 209, 179, 190, 209, 41, 199, 1, 181, + 117, 178, 174, 37, 121, 82, 99, 61, 186, 237, 64, 131, 88, 100, 146, 199, 11, 91, 240, 50, + 90, 192, 18, 85, 122, 29, 233, 142, 88, 169, 17, 215, 6, 23, 80, 175, 191, 30, 35, 158, 245, + 245, 158, 250, 116, 217, 105, 93, 115, 189, 238, 206, 1, 30, 168, 182, 23, 227, 178, 83, + 155, 166, 20, 217, 81, 118, 253, 134, 32, 123, 174, 190, 55, 113, 43, 216, 146, 47, 144, + 240, 194, 177, 65, 77, 29, 165, 68, 99, 20, 59, 171, 39, 35, 89, 124, 112, 228, 141, 118, + 204, 106, 108, 80, 209, 218, 10, 52, 214, 160, 171, 211, 89, 106, 139, 166, 20, 23, 30, 137, + 74, 138, 75, 151, 45, 218, 200, 4, 57, 45, 145, 236, 237, 107, 243, 120, 101, 97, 131, 248, + 35, 195, 222, 89, 114, 75, 154, 146, 45, 245, 245, 52, 120, 61, 118, 129, 81, 0, 251, 14, + 240, 120, 227, 136, 82, 134, 152, 210, 168, 128, 214, 193, 172, 73, 114, 44, 248, 115, 1, + 14, 85, 22, 125, 66, 54, 51, 171, 15, 102, 219, 87, 226, 201, 34, 7, 173, 183, 100, 193, + 108, 143, 111, 242, 36, 39, 30, 254, 84, 223, 27, 83, 236, 99, 6, 42, 91, 229, 25, 225, 109, + 180, 177, 135, 82, 45, 114, 230, 62, 104, 119, 145, 60, 167, 79, 187, 211, 190, 42, 97, 200, + 87, 102, 134, 93, 94, 14, 210, 49, 33, 250, 65, 116, 108, 168, 223, 48, 60, 193, 51, 63, 61, + 51, 195, 58, 60, 213, 87, 79, 222, 176, 193, 234, 123, 242, 10, 100, 47, 171, 239, 32, 49, + 17, 76, 248, 65, 185, 75, 124, 136, 31, 108, 5, 126, 228, 31, 11, 181, 48, 23, 102, 236, + 202, 12, 203, 12, 179, 150, 76, 176, 241, 98, 152, 4, 22, 230, 65, 231, 87, 57, 128, 21, + 159, 146, 59, 28, 65, 10, 79, 46, 52, 139, 89, 209, 190, 129, 29, 179, 216, 172, 10, 11, + 159, 3, 165, 239, 189, 255, 222, 130, 247, 223, 123, 17, 249, 34, 203, 126, 239, 208, 155, + 135, 2, 142, 189, 121, 40, 168, 168, 40, 59, 123, 84, 14, 11, 76, 8, 212, 21, 226, 199, 45, + 22, 179, 217, 158, 152, 197, 11, 11, 11, 10, 242, 242, 114, 199, 243, 209, 249, 89, 220, + 158, 232, 135, 74, 25, 157, 63, 158, 23, 142, 23, 121, 185, 113, 92, 47, 74, 37, 245, 84, + 44, 44, 83, 197, 135, 71, 103, 136, 170, 99, 73, 124, 133, 90, 177, 172, 58, 78, 100, 38, + 135, 197, 7, 89, 88, 164, 201, 30, 229, 157, 93, 150, 26, 228, 27, 155, 109, 79, 41, 78, + 139, 50, 91, 45, 138, 217, 102, 177, 142, 40, 44, 75, 172, 92, 90, 145, 216, 255, 188, 98, + 245, 243, 242, 75, 87, 99, 236, 193, 102, 197, 203, 223, 219, 55, 45, 33, 42, 49, 216, 210, + 159, 98, 242, 59, 242, 157, 201, 239, 215, 83, 148, 138, 95, 31, 17, 129, 5, 174, 233, 121, + 230, 85, 190, 222, 220, 228, 101, 189, 51, 33, 58, 46, 103, 108, 92, 72, 114, 108, 160, 175, + 191, 175, 159, 159, 37, 38, 62, 198, 98, 9, 242, 183, 217, 199, 205, 58, 182, 197, 43, 70, + 141, 181, 249, 250, 121, 5, 132, 250, 120, 199, 198, 199, 217, 252, 124, 172, 254, 97, 199, + 18, 128, 107, 187, 181, 35, 202, 114, 83, 8, 36, 66, 10, 244, 61, 36, 170, 196, 68, 168, 75, + 199, 29, 94, 94, 91, 183, 51, 217, 39, 201, 183, 143, 175, 119, 248, 134, 167, 120, 219, + 236, 17, 225, 137, 144, 148, 20, 110, 235, 227, 207, 245, 66, 120, 114, 31, 43, 113, 196, + 58, 236, 137, 17, 2, 91, 134, 112, 37, 213, 223, 39, 222, 135, 251, 10, 31, 159, 160, 216, + 217, 65, 181, 166, 218, 212, 244, 136, 210, 210, 210, 160, 162, 108, 192, 119, 108, 122, + 120, 81, 80, 120, 81, 212, 180, 67, 44, 251, 117, 52, 116, 100, 118, 80, 81, 80, 81, 30, 90, + 60, 34, 224, 80, 96, 81, 209, 168, 28, 92, 250, 228, 255, 92, 139, 163, 114, 234, 147, 195, + 228, 138, 100, 241, 17, 34, 193, 226, 39, 112, 109, 82, 10, 10, 25, 45, 77, 184, 197, 206, + 18, 148, 37, 38, 22, 61, 190, 32, 37, 39, 202, 198, 236, 253, 81, 231, 91, 130, 18, 139, + 210, 179, 242, 2, 125, 131, 185, 219, 22, 146, 92, 154, 55, 182, 50, 197, 135, 127, 200, + 250, 63, 96, 45, 139, 147, 70, 134, 154, 132, 53, 192, 143, 41, 253, 126, 193, 54, 197, 28, + 62, 210, 174, 172, 13, 12, 245, 22, 194, 59, 44, 120, 239, 177, 191, 201, 255, 248, 55, 26, + 173, 182, 15, 173, 150, 15, 151, 158, 104, 51, 199, 72, 37, 216, 20, 20, 20, 39, 148, 145, + 34, 61, 120, 100, 72, 90, 90, 72, 124, 92, 206, 236, 180, 248, 164, 145, 193, 113, 33, 65, + 38, 97, 74, 79, 143, 76, 154, 29, 89, 235, 123, 124, 54, 225, 69, 69, 104, 140, 162, 82, + 150, 189, 55, 47, 55, 16, 67, 123, 114, 3, 243, 144, 248, 43, 15, 13, 227, 8, 255, 157, 245, + 209, 16, 44, 196, 108, 97, 44, 44, 44, 52, 196, 48, 8, 19, 210, 30, 232, 192, 193, 100, 14, + 139, 48, 236, 162, 236, 139, 138, 237, 47, 96, 1, 86, 171, 175, 90, 56, 114, 100, 126, 156, + 159, 210, 255, 245, 42, 30, 144, 144, 151, 50, 98, 84, 140, 77, 252, 192, 48, 56, 34, 5, + 131, 188, 141, 125, 104, 11, 79, 202, 31, 145, 154, 23, 227, 173, 124, 17, 148, 170, 246, + 71, 31, 123, 60, 36, 214, 199, 47, 216, 199, 108, 178, 5, 249, 112, 215, 177, 107, 189, 253, + 189, 77, 38, 252, 165, 236, 243, 246, 183, 153, 76, 54, 127, 239, 99, 111, 241, 100, 159, + 32, 155, 76, 69, 139, 105, 154, 246, 185, 120, 220, 148, 12, 147, 225, 162, 19, 45, 246, 8, + 4, 242, 47, 160, 20, 10, 248, 183, 142, 192, 168, 82, 252, 134, 228, 192, 130, 138, 120, 75, + 134, 37, 99, 148, 79, 31, 43, 237, 173, 168, 25, 213, 199, 58, 118, 58, 226, 231, 202, 41, + 227, 138, 151, 74, 151, 201, 206, 150, 166, 98, 217, 123, 100, 48, 224, 80, 192, 33, 105, + 42, 219, 239, 175, 169, 91, 203, 79, 145, 198, 145, 27, 58, 52, 36, 206, 108, 88, 77, 224, + 30, 86, 164, 141, 140, 13, 111, 150, 123, 26, 227, 138, 120, 92, 152, 189, 124, 3, 188, 252, + 70, 142, 155, 157, 95, 48, 37, 39, 60, 169, 100, 218, 140, 105, 37, 73, 83, 47, 126, 122, + 229, 132, 182, 218, 226, 24, 197, 98, 243, 11, 180, 5, 102, 87, 53, 148, 143, 173, 47, 137, + 79, 26, 59, 101, 250, 148, 177, 73, 213, 235, 123, 151, 231, 206, 155, 156, 31, 226, 165, + 108, 179, 198, 37, 37, 199, 135, 68, 198, 70, 198, 141, 26, 23, 159, 84, 152, 157, 145, 83, + 52, 197, 89, 186, 240, 150, 158, 138, 208, 184, 132, 184, 56, 171, 154, 60, 66, 13, 137, 79, + 86, 227, 242, 43, 211, 146, 199, 100, 143, 204, 25, 51, 101, 241, 132, 121, 215, 182, 142, + 243, 15, 143, 9, 14, 197, 131, 109, 188, 246, 185, 18, 41, 222, 194, 221, 58, 22, 174, 122, + 72, 84, 139, 73, 199, 247, 171, 87, 172, 53, 174, 143, 167, 223, 151, 50, 34, 101, 172, 21, + 3, 189, 144, 50, 170, 143, 223, 237, 240, 9, 246, 26, 59, 34, 22, 63, 83, 138, 132, 73, 35, + 251, 88, 109, 111, 212, 228, 130, 62, 54, 103, 151, 195, 111, 154, 152, 170, 187, 145, 110, + 26, 244, 165, 162, 112, 180, 232, 161, 215, 223, 59, 132, 174, 55, 176, 49, 29, 222, 255, + 70, 109, 185, 25, 7, 142, 76, 242, 60, 50, 102, 88, 184, 113, 40, 90, 88, 74, 10, 218, 91, + 65, 123, 235, 246, 45, 20, 77, 74, 225, 184, 248, 17, 17, 22, 30, 227, 95, 54, 175, 181, + 120, 230, 105, 142, 232, 136, 220, 233, 173, 151, 214, 215, 172, 207, 9, 192, 188, 184, 212, + 112, 43, 239, 127, 213, 94, 59, 102, 100, 85, 65, 90, 180, 175, 87, 68, 106, 124, 198, 169, + 51, 199, 249, 37, 132, 6, 201, 195, 113, 147, 58, 177, 56, 101, 204, 162, 213, 229, 165, 87, + 93, 121, 209, 105, 165, 149, 101, 51, 66, 131, 76, 94, 254, 182, 254, 31, 10, 11, 83, 203, + 235, 22, 57, 211, 226, 10, 70, 70, 142, 158, 191, 170, 82, 254, 103, 253, 177, 232, 135, + 207, 162, 253, 178, 160, 4, 118, 157, 104, 191, 251, 71, 230, 22, 154, 21, 240, 234, 227, + 155, 29, 94, 246, 64, 159, 56, 17, 18, 98, 207, 238, 227, 155, 28, 35, 192, 30, 24, 232, + 147, 251, 197, 200, 194, 189, 169, 96, 14, 48, 59, 204, 51, 205, 13, 102, 143, 121, 183, + 217, 18, 45, 204, 230, 184, 145, 147, 125, 52, 71, 220, 180, 1, 39, 27, 56, 161, 14, 73, 19, + 102, 203, 11, 70, 223, 165, 24, 11, 215, 13, 154, 252, 159, 111, 140, 188, 150, 219, 237, + 102, 244, 214, 48, 105, 64, 180, 173, 244, 91, 203, 80, 107, 163, 153, 243, 165, 149, 185, + 69, 150, 16, 207, 78, 184, 232, 181, 43, 78, 85, 148, 57, 11, 202, 154, 103, 228, 251, 248, + 216, 204, 222, 129, 222, 62, 142, 121, 29, 197, 13, 155, 26, 114, 34, 199, 212, 173, 187, + 173, 121, 254, 57, 115, 210, 126, 46, 45, 201, 157, 81, 146, 238, 59, 103, 102, 75, 89, 28, + 255, 91, 117, 87, 77, 70, 120, 102, 240, 172, 217, 193, 225, 193, 126, 254, 129, 25, 233, + 41, 54, 159, 136, 16, 223, 212, 217, 103, 158, 82, 126, 221, 85, 23, 46, 29, 159, 62, 113, + 126, 121, 234, 232, 164, 113, 53, 217, 161, 73, 163, 240, 84, 76, 209, 142, 136, 79, 76, 29, + 48, 1, 206, 61, 209, 178, 142, 128, 172, 200, 164, 9, 222, 96, 179, 123, 71, 120, 79, 200, + 87, 76, 193, 125, 172, 206, 17, 228, 40, 154, 108, 143, 180, 65, 82, 150, 57, 46, 173, 42, + 110, 170, 105, 170, 113, 164, 133, 23, 201, 153, 7, 73, 95, 204, 150, 103, 225, 139, 121, + 185, 104, 182, 251, 255, 173, 170, 210, 17, 7, 142, 190, 130, 130, 129, 107, 219, 50, 112, + 28, 178, 129, 227, 208, 79, 88, 40, 24, 138, 71, 167, 104, 230, 254, 241, 163, 82, 146, 178, + 163, 188, 248, 114, 197, 236, 21, 162, 134, 165, 213, 207, 24, 239, 59, 11, 147, 115, 147, + 146, 179, 163, 173, 156, 89, 184, 159, 58, 42, 57, 57, 59, 202, 202, 39, 154, 124, 252, 253, + 45, 193, 101, 181, 141, 249, 21, 11, 75, 162, 173, 150, 68, 27, 29, 126, 54, 30, 30, 58, 58, + 52, 44, 57, 218, 63, 127, 222, 202, 242, 254, 182, 129, 100, 147, 221, 22, 224, 109, 54, + 123, 7, 216, 250, 175, 14, 203, 29, 149, 21, 164, 58, 242, 19, 82, 42, 22, 142, 73, 154, + 104, 71, 223, 68, 251, 241, 12, 211, 116, 8, 134, 52, 56, 237, 68, 11, 222, 151, 22, 31, 18, + 7, 125, 130, 57, 188, 109, 241, 113, 113, 33, 241, 105, 74, 82, 164, 127, 31, 187, 234, 126, + 147, 35, 105, 82, 164, 177, 15, 223, 159, 118, 40, 144, 204, 246, 250, 33, 227, 246, 120, + 224, 95, 148, 149, 14, 101, 216, 196, 120, 203, 12, 187, 48, 240, 177, 27, 145, 90, 156, 62, + 114, 116, 180, 98, 29, 8, 137, 254, 159, 143, 91, 100, 135, 180, 89, 178, 30, 84, 158, 75, + 206, 139, 247, 245, 141, 207, 75, 78, 202, 85, 253, 252, 212, 220, 95, 243, 7, 166, 46, 86, + 227, 157, 128, 83, 247, 183, 1, 121, 10, 79, 71, 79, 9, 133, 137, 195, 61, 37, 20, 188, 29, + 54, 176, 133, 122, 43, 166, 128, 42, 99, 93, 245, 57, 69, 145, 27, 56, 188, 127, 155, 57, + 100, 177, 7, 22, 150, 217, 185, 127, 92, 110, 82, 138, 92, 202, 161, 107, 150, 248, 219, + 181, 160, 241, 152, 99, 241, 84, 152, 15, 119, 12, 27, 79, 120, 69, 102, 102, 86, 81, 120, + 88, 98, 194, 244, 196, 249, 243, 177, 239, 49, 137, 222, 53, 147, 3, 83, 165, 23, 198, 56, + 38, 77, 30, 147, 149, 16, 110, 131, 176, 76, 239, 196, 249, 211, 43, 138, 252, 242, 198, 79, + 202, 155, 26, 51, 232, 143, 134, 67, 30, 219, 131, 151, 59, 249, 50, 94, 61, 123, 2, 243, + 114, 113, 46, 250, 242, 236, 252, 207, 180, 53, 220, 183, 83, 78, 112, 237, 147, 37, 25, 70, + 49, 92, 61, 252, 184, 199, 155, 182, 114, 127, 52, 77, 82, 78, 148, 151, 64, 143, 183, 103, + 166, 206, 157, 49, 78, 250, 187, 76, 148, 182, 59, 205, 108, 74, 202, 24, 72, 28, 88, 242, + 157, 220, 55, 58, 61, 46, 126, 68, 152, 133, 199, 134, 86, 213, 55, 143, 41, 174, 45, 140, + 85, 194, 39, 214, 47, 43, 172, 90, 84, 28, 101, 181, 14, 217, 8, 225, 153, 225, 217, 197, + 249, 245, 61, 229, 253, 45, 67, 18, 71, 133, 103, 20, 157, 152, 40, 214, 217, 252, 189, 76, + 242, 224, 222, 108, 159, 84, 156, 28, 95, 56, 57, 61, 169, 186, 56, 121, 68, 229, 130, 2, + 251, 196, 100, 227, 116, 249, 20, 215, 168, 24, 86, 15, 91, 35, 159, 81, 81, 81, 209, 41, + 194, 95, 241, 75, 246, 15, 149, 198, 12, 113, 20, 76, 86, 252, 162, 147, 163, 252, 71, 165, + 88, 213, 244, 73, 234, 84, 175, 19, 15, 136, 227, 7, 139, 190, 10, 15, 66, 232, 239, 169, + 101, 60, 176, 126, 191, 161, 197, 167, 94, 150, 118, 99, 123, 160, 45, 91, 76, 166, 148, + 204, 225, 7, 202, 137, 182, 156, 191, 188, 184, 106, 209, 216, 40, 254, 150, 189, 42, 249, + 216, 59, 199, 13, 22, 145, 27, 156, 89, 252, 31, 26, 44, 173, 106, 129, 177, 179, 132, 15, + 90, 41, 15, 86, 13, 179, 82, 112, 106, 96, 96, 108, 80, 12, 196, 198, 200, 119, 117, 182, + 252, 119, 1, 248, 72, 90, 228, 8, 112, 100, 78, 14, 138, 9, 76, 141, 29, 97, 14, 79, 156, + 20, 62, 184, 169, 228, 140, 229, 205, 35, 109, 37, 15, 19, 195, 82, 62, 255, 162, 202, 176, + 119, 213, 63, 245, 193, 48, 225, 163, 88, 125, 252, 131, 189, 189, 130, 194, 162, 2, 19, + 167, 85, 21, 250, 204, 60, 110, 149, 94, 238, 55, 96, 149, 152, 136, 210, 137, 83, 147, 253, + 227, 163, 67, 205, 102, 113, 143, 37, 41, 39, 47, 3, 63, 217, 88, 242, 107, 79, 31, 223, + 223, 254, 91, 99, 108, 76, 175, 30, 29, 135, 103, 183, 201, 140, 214, 88, 168, 125, 197, 63, + 86, 118, 64, 229, 240, 183, 146, 35, 182, 32, 35, 189, 48, 189, 204, 234, 53, 193, 107, 66, + 161, 87, 122, 122, 78, 97, 120, 97, 56, 228, 148, 85, 23, 78, 40, 177, 102, 244, 177, 212, + 93, 94, 233, 9, 5, 213, 120, 108, 206, 222, 233, 72, 24, 114, 27, 23, 29, 202, 125, 81, 127, + 172, 191, 40, 95, 146, 244, 74, 15, 88, 119, 193, 158, 61, 1, 40, 121, 77, 253, 238, 38, 6, + 44, 101, 23, 255, 252, 50, 71, 187, 25, 31, 53, 243, 242, 10, 7, 44, 136, 165, 112, 86, 22, + 105, 188, 167, 230, 8, 83, 74, 90, 68, 98, 100, 144, 213, 234, 109, 197, 183, 169, 87, 210, + 168, 49, 49, 37, 243, 199, 199, 115, 147, 73, 156, 210, 226, 235, 99, 9, 136, 10, 90, 158, + 170, 59, 161, 220, 229, 60, 245, 137, 64, 31, 113, 149, 45, 62, 41, 41, 54, 184, 127, 129, + 127, 154, 111, 106, 178, 197, 203, 226, 31, 24, 156, 147, 153, 236, 229, 21, 224, 99, 137, + 44, 152, 83, 226, 29, 171, 38, 248, 178, 157, 129, 17, 129, 133, 163, 83, 246, 225, 65, 137, + 207, 248, 0, 219, 190, 48, 233, 97, 123, 68, 30, 223, 110, 90, 41, 255, 225, 211, 14, 31, + 191, 62, 254, 222, 125, 16, 108, 153, 152, 58, 96, 223, 244, 82, 252, 72, 125, 108, 239, + 168, 156, 224, 252, 2, 253, 99, 115, 110, 88, 24, 238, 25, 99, 74, 123, 74, 198, 254, 57, + 104, 76, 110, 172, 221, 79, 120, 121, 240, 197, 109, 207, 199, 219, 22, 63, 110, 244, 76, + 190, 162, 244, 137, 224, 32, 179, 79, 136, 95, 255, 87, 87, 38, 142, 12, 179, 88, 3, 34, + 101, 111, 78, 236, 109, 26, 246, 22, 9, 177, 15, 226, 251, 237, 253, 93, 1, 126, 94, 161, + 195, 122, 123, 19, 157, 78, 110, 204, 193, 207, 126, 193, 134, 169, 248, 180, 241, 69, 219, + 188, 194, 226, 82, 34, 135, 117, 232, 109, 202, 155, 180, 185, 116, 183, 205, 207, 75, 49, + 97, 151, 44, 4, 187, 12, 183, 88, 2, 233, 159, 206, 201, 127, 220, 97, 2, 216, 122, 199, + 235, 207, 45, 242, 47, 249, 17, 34, 173, 122, 242, 195, 95, 174, 125, 65, 242, 137, 178, + 207, 124, 142, 250, 247, 119, 121, 125, 97, 217, 2, 2, 188, 240, 230, 102, 84, 139, 254, 65, + 165, 109, 205, 81, 255, 99, 15, 120, 125, 97, 5, 118, 253, 208, 255, 221, 163, 56, 21, 191, + 227, 49, 246, 50, 166, 188, 163, 237, 254, 189, 50, 231, 107, 171, 165, 148, 181, 80, 136, + 143, 241, 134, 147, 104, 177, 201, 27, 198, 234, 138, 133, 108, 41, 241, 41, 148, 160, 146, + 13, 22, 161, 50, 141, 240, 137, 186, 7, 70, 155, 34, 97, 193, 111, 228, 3, 249, 186, 202, + 97, 22, 79, 132, 124, 158, 168, 165, 35, 99, 144, 21, 168, 114, 212, 84, 212, 92, 212, 90, + 76, 143, 69, 94, 163, 60, 139, 229, 238, 208, 118, 161, 238, 81, 26, 96, 180, 148, 88, 140, + 125, 72, 157, 110, 112, 5, 132, 42, 103, 64, 137, 185, 31, 219, 118, 156, 68, 145, 168, 122, + 88, 244, 47, 181, 28, 210, 165, 176, 157, 69, 74, 25, 228, 163, 242, 48, 190, 72, 57, 11, + 195, 67, 36, 30, 212, 180, 147, 234, 39, 184, 10, 21, 106, 112, 163, 169, 8, 86, 252, 78, + 117, 43, 15, 195, 125, 150, 9, 176, 119, 184, 148, 101, 218, 62, 37, 21, 60, 168, 49, 6, + 107, 81, 46, 241, 154, 246, 241, 80, 41, 19, 181, 157, 191, 83, 189, 166, 77, 218, 37, 82, + 202, 24, 92, 211, 157, 112, 202, 201, 164, 92, 14, 121, 186, 238, 128, 108, 41, 177, 9, 231, + 189, 9, 162, 13, 170, 168, 40, 84, 44, 42, 213, 72, 35, 213, 65, 166, 114, 35, 212, 253, 70, + 215, 96, 186, 212, 19, 80, 202, 3, 32, 147, 7, 104, 213, 200, 84, 228, 28, 212, 4, 84, 13, + 202, 133, 90, 131, 233, 17, 200, 141, 74, 59, 150, 107, 214, 118, 160, 174, 87, 76, 88, 23, + 197, 143, 162, 63, 160, 132, 175, 65, 31, 136, 84, 66, 33, 223, 92, 13, 25, 202, 206, 147, + 232, 26, 212, 179, 48, 251, 95, 234, 32, 148, 74, 153, 179, 160, 70, 252, 138, 126, 253, 43, + 214, 123, 25, 211, 19, 176, 223, 33, 18, 75, 180, 254, 33, 58, 60, 24, 94, 3, 61, 40, 64, + 53, 163, 86, 160, 205, 154, 126, 183, 50, 224, 18, 115, 15, 92, 59, 92, 138, 162, 61, 39, + 158, 131, 245, 168, 36, 131, 153, 168, 12, 177, 73, 251, 102, 168, 148, 34, 24, 255, 123, + 101, 142, 129, 24, 41, 12, 39, 137, 41, 48, 214, 80, 238, 144, 240, 88, 203, 124, 24, 107, + 254, 21, 5, 36, 189, 238, 46, 212, 133, 168, 41, 48, 78, 124, 141, 229, 126, 135, 248, 133, + 218, 100, 243, 14, 109, 178, 245, 23, 109, 178, 242, 146, 54, 198, 188, 29, 195, 63, 98, + 184, 125, 152, 206, 26, 38, 35, 221, 124, 255, 48, 61, 51, 76, 70, 250, 96, 249, 7, 80, 211, + 176, 143, 171, 134, 180, 253, 197, 241, 182, 76, 190, 134, 74, 180, 201, 150, 90, 76, 47, + 130, 130, 225, 18, 207, 107, 183, 13, 23, 238, 147, 20, 93, 147, 161, 132, 253, 12, 41, 236, + 103, 173, 2, 105, 70, 206, 67, 229, 160, 58, 80, 46, 84, 43, 234, 108, 89, 70, 17, 168, 66, + 176, 115, 111, 173, 114, 64, 248, 142, 74, 54, 148, 66, 237, 64, 10, 239, 210, 219, 187, + 147, 199, 192, 40, 225, 132, 20, 115, 155, 209, 215, 112, 29, 210, 62, 52, 194, 37, 255, 82, + 243, 32, 78, 202, 124, 17, 134, 139, 180, 15, 72, 48, 158, 191, 138, 253, 233, 210, 14, 160, + 222, 22, 35, 128, 147, 180, 111, 81, 135, 81, 154, 140, 155, 158, 150, 210, 52, 165, 67, 27, + 205, 3, 181, 145, 124, 47, 44, 228, 159, 161, 246, 66, 57, 127, 19, 162, 77, 1, 176, 80, + 217, 254, 251, 132, 231, 239, 66, 203, 6, 84, 234, 239, 19, 142, 255, 20, 212, 84, 131, 82, + 211, 135, 132, 79, 144, 120, 2, 218, 76, 63, 193, 218, 225, 18, 247, 106, 251, 196, 83, 16, + 130, 18, 6, 73, 89, 218, 247, 39, 232, 2, 60, 71, 215, 64, 187, 184, 29, 102, 242, 175, 224, + 38, 254, 5, 92, 202, 11, 225, 122, 61, 252, 8, 220, 192, 94, 1, 129, 225, 45, 252, 91, 216, + 200, 86, 195, 101, 236, 92, 237, 75, 190, 27, 46, 101, 43, 224, 82, 197, 9, 155, 248, 119, + 176, 145, 127, 137, 249, 95, 130, 11, 117, 19, 59, 138, 105, 197, 176, 150, 29, 129, 191, + 96, 158, 135, 223, 14, 15, 41, 209, 176, 155, 223, 6, 181, 252, 14, 108, 187, 4, 218, 248, + 82, 124, 118, 156, 139, 186, 89, 222, 218, 71, 251, 81, 7, 248, 178, 223, 164, 237, 23, 5, + 120, 150, 52, 163, 110, 208, 211, 174, 69, 53, 13, 75, 187, 26, 229, 146, 255, 236, 80, 108, + 68, 93, 129, 186, 90, 79, 95, 142, 90, 38, 102, 97, 220, 31, 213, 138, 186, 80, 79, 191, 8, + 213, 42, 226, 49, 62, 17, 213, 166, 167, 221, 130, 90, 45, 66, 48, 30, 131, 74, 210, 211, + 238, 66, 109, 229, 91, 113, 60, 183, 162, 238, 210, 211, 246, 163, 222, 231, 248, 198, 224, + 79, 162, 118, 97, 217, 3, 248, 222, 8, 69, 85, 234, 249, 14, 148, 63, 123, 31, 223, 33, 63, + 163, 246, 147, 0, 142, 149, 75, 241, 86, 237, 37, 204, 127, 134, 159, 175, 125, 132, 124, + 133, 115, 237, 121, 158, 49, 248, 94, 57, 83, 190, 65, 112, 76, 249, 202, 86, 237, 61, 122, + 67, 244, 223, 34, 239, 52, 122, 47, 244, 95, 106, 114, 194, 34, 122, 47, 244, 95, 47, 223, + 8, 250, 59, 96, 183, 182, 103, 224, 190, 23, 135, 181, 126, 186, 195, 251, 127, 144, 117, + 228, 221, 45, 158, 212, 142, 201, 123, 24, 239, 202, 123, 149, 212, 254, 121, 242, 222, 52, + 163, 237, 228, 125, 106, 94, 1, 183, 153, 58, 181, 127, 152, 58, 251, 63, 53, 238, 196, 21, + 250, 93, 24, 132, 103, 188, 159, 246, 10, 221, 101, 253, 125, 250, 217, 170, 223, 91, 253, + 15, 42, 223, 162, 143, 232, 247, 86, 191, 7, 239, 166, 217, 250, 125, 20, 167, 61, 56, 112, + 239, 136, 205, 96, 165, 187, 68, 155, 136, 247, 93, 134, 126, 135, 172, 54, 238, 133, 23, + 97, 157, 120, 177, 255, 60, 164, 221, 244, 48, 142, 1, 207, 117, 211, 219, 112, 150, 242, + 17, 8, 229, 35, 173, 73, 185, 23, 207, 85, 169, 83, 96, 129, 82, 175, 189, 47, 30, 133, 22, + 5, 45, 39, 238, 198, 251, 21, 133, 126, 57, 66, 153, 136, 123, 95, 106, 19, 164, 41, 167, + 194, 169, 124, 50, 76, 229, 147, 209, 31, 39, 107, 235, 80, 76, 158, 41, 226, 160, 246, 23, + 165, 77, 251, 64, 60, 141, 62, 29, 10, 118, 17, 135, 101, 7, 206, 132, 63, 105, 191, 42, + 227, 181, 167, 148, 249, 48, 70, 76, 128, 241, 184, 214, 213, 74, 35, 246, 119, 92, 209, + 166, 107, 97, 28, 170, 72, 220, 160, 181, 155, 62, 5, 151, 233, 49, 40, 151, 226, 23, 233, + 107, 169, 136, 31, 244, 181, 46, 224, 73, 240, 54, 79, 98, 209, 200, 67, 124, 180, 182, 5, + 237, 114, 59, 218, 228, 117, 125, 61, 59, 97, 156, 190, 158, 221, 104, 67, 169, 85, 184, 70, + 139, 181, 211, 135, 190, 29, 205, 119, 107, 7, 197, 223, 209, 254, 133, 152, 103, 200, 120, + 15, 78, 149, 111, 189, 129, 119, 150, 201, 170, 221, 111, 25, 169, 221, 175, 175, 51, 174, + 171, 37, 99, 200, 59, 206, 70, 235, 44, 223, 170, 3, 111, 47, 220, 147, 213, 168, 114, 229, + 99, 216, 101, 122, 142, 214, 26, 223, 154, 133, 38, 11, 190, 113, 55, 194, 102, 75, 38, 20, + 90, 78, 195, 120, 44, 92, 105, 110, 68, 155, 180, 162, 102, 128, 13, 181, 208, 50, 19, 219, + 186, 86, 251, 196, 20, 6, 155, 77, 254, 112, 165, 9, 223, 238, 186, 111, 196, 224, 27, 72, + 250, 134, 188, 251, 165, 138, 113, 221, 239, 215, 86, 13, 121, 15, 197, 154, 222, 214, 222, + 193, 189, 167, 40, 30, 244, 5, 67, 198, 27, 167, 70, 190, 95, 20, 43, 166, 73, 57, 181, 123, + 117, 127, 145, 62, 37, 125, 229, 37, 212, 53, 250, 91, 35, 83, 127, 119, 13, 188, 35, 222, + 132, 50, 20, 224, 25, 126, 9, 142, 95, 247, 23, 229, 33, 200, 81, 46, 67, 229, 194, 90, 115, + 59, 228, 152, 175, 198, 240, 141, 208, 101, 122, 11, 223, 103, 145, 56, 190, 79, 32, 28, + 239, 220, 26, 243, 249, 216, 126, 174, 118, 88, 217, 0, 61, 88, 190, 7, 237, 8, 230, 114, + 236, 183, 5, 251, 148, 247, 120, 25, 182, 39, 125, 235, 71, 40, 22, 139, 192, 95, 138, 31, + 70, 223, 65, 42, 213, 242, 190, 192, 59, 112, 200, 29, 110, 222, 138, 119, 195, 105, 218, + 15, 198, 153, 155, 139, 154, 100, 220, 129, 167, 235, 119, 218, 143, 88, 23, 165, 140, 214, + 30, 51, 143, 214, 30, 53, 237, 210, 190, 87, 106, 240, 30, 155, 103, 220, 85, 227, 209, 31, + 170, 140, 59, 12, 239, 33, 253, 141, 129, 119, 140, 188, 231, 204, 11, 160, 158, 206, 102, + 188, 123, 254, 1, 237, 166, 15, 208, 47, 241, 236, 86, 58, 96, 46, 150, 159, 43, 62, 131, + 169, 178, 140, 121, 51, 212, 43, 61, 48, 205, 212, 11, 211, 197, 183, 48, 67, 156, 169, 29, + 17, 235, 241, 45, 163, 96, 223, 71, 181, 183, 148, 102, 236, 7, 239, 102, 101, 2, 182, 247, + 39, 156, 155, 33, 244, 213, 171, 164, 248, 13, 112, 3, 42, 9, 85, 42, 118, 193, 235, 168, + 104, 84, 161, 98, 131, 151, 120, 51, 156, 133, 202, 16, 11, 161, 79, 212, 66, 20, 174, 217, + 57, 186, 79, 143, 134, 185, 220, 142, 159, 99, 60, 144, 135, 107, 185, 7, 229, 68, 189, 133, + 114, 227, 26, 61, 130, 90, 138, 122, 25, 181, 90, 214, 17, 107, 180, 11, 249, 19, 208, 136, + 106, 66, 173, 67, 157, 129, 126, 213, 132, 90, 132, 146, 225, 85, 98, 21, 238, 131, 82, 237, + 106, 60, 7, 94, 22, 71, 225, 128, 88, 2, 239, 138, 82, 120, 3, 223, 0, 99, 81, 245, 152, + 198, 80, 97, 150, 241, 112, 25, 234, 246, 1, 226, 28, 23, 97, 250, 3, 184, 223, 54, 161, + 110, 226, 103, 64, 61, 63, 67, 123, 146, 95, 7, 86, 126, 29, 114, 55, 84, 242, 221, 218, + 219, 188, 30, 211, 235, 145, 61, 224, 199, 123, 180, 131, 88, 174, 5, 203, 189, 129, 229, + 162, 177, 220, 27, 88, 174, 14, 203, 125, 137, 109, 125, 128, 122, 2, 53, 13, 85, 164, 60, + 3, 183, 42, 11, 224, 2, 12, 103, 160, 54, 225, 57, 254, 153, 56, 27, 62, 51, 225, 249, 111, + 90, 1, 96, 157, 0, 96, 201, 65, 85, 232, 12, 53, 223, 11, 15, 73, 225, 231, 207, 215, 77, + 79, 193, 83, 166, 119, 224, 98, 254, 40, 218, 252, 168, 246, 140, 114, 63, 190, 23, 253, 32, + 1, 219, 241, 70, 134, 40, 117, 96, 195, 240, 35, 152, 247, 61, 158, 173, 71, 49, 92, 170, + 76, 67, 63, 242, 195, 247, 206, 7, 16, 35, 182, 66, 144, 248, 5, 188, 145, 28, 149, 101, 78, + 133, 9, 214, 185, 184, 183, 142, 130, 191, 165, 0, 125, 182, 16, 207, 173, 187, 96, 10, 127, + 31, 215, 254, 59, 236, 227, 176, 246, 87, 165, 65, 123, 73, 124, 174, 189, 141, 190, 188, + 84, 60, 134, 111, 89, 7, 164, 43, 101, 218, 49, 108, 51, 7, 85, 133, 178, 97, 95, 7, 81, + 207, 163, 190, 192, 120, 13, 74, 142, 43, 26, 227, 63, 43, 110, 152, 205, 239, 69, 255, 186, + 25, 237, 125, 30, 88, 196, 107, 216, 238, 6, 244, 195, 151, 96, 50, 238, 131, 76, 241, 58, + 4, 138, 119, 97, 132, 28, 15, 106, 188, 216, 138, 231, 203, 86, 240, 69, 153, 80, 225, 168, + 209, 168, 89, 40, 31, 84, 20, 142, 175, 30, 199, 183, 6, 199, 199, 196, 97, 220, 95, 21, + 216, 230, 231, 96, 49, 198, 55, 153, 198, 135, 242, 195, 253, 55, 56, 62, 8, 54, 24, 105, + 140, 239, 52, 26, 31, 250, 116, 54, 190, 31, 76, 248, 110, 184, 15, 125, 203, 3, 43, 249, + 33, 56, 147, 247, 194, 57, 252, 32, 244, 241, 155, 112, 253, 15, 193, 229, 24, 190, 142, + 191, 133, 229, 94, 129, 123, 248, 62, 184, 141, 237, 131, 71, 80, 11, 69, 182, 246, 19, 214, + 181, 242, 251, 208, 47, 60, 218, 110, 126, 72, 219, 199, 123, 241, 190, 61, 136, 247, 246, + 77, 218, 199, 24, 127, 135, 31, 212, 62, 226, 111, 97, 185, 87, 180, 31, 248, 62, 237, 16, + 214, 83, 216, 62, 237, 14, 188, 215, 173, 88, 55, 129, 119, 104, 239, 114, 55, 250, 75, 183, + 246, 26, 63, 77, 251, 128, 227, 61, 198, 157, 218, 247, 252, 98, 12, 183, 105, 95, 99, 185, + 13, 88, 238, 86, 222, 129, 111, 66, 55, 250, 84, 55, 190, 111, 78, 195, 253, 177, 26, 214, + 115, 39, 116, 243, 139, 49, 220, 6, 29, 252, 237, 254, 125, 34, 3, 207, 212, 11, 80, 87, + 226, 125, 94, 110, 112, 158, 118, 192, 116, 5, 234, 8, 76, 213, 117, 19, 140, 55, 125, 137, + 119, 207, 103, 248, 249, 203, 2, 245, 166, 29, 80, 140, 225, 98, 83, 135, 246, 164, 233, 13, + 40, 179, 158, 1, 101, 166, 11, 160, 196, 242, 11, 222, 43, 71, 161, 2, 53, 209, 240, 213, + 28, 84, 177, 161, 113, 168, 26, 84, 50, 74, 65, 153, 12, 57, 76, 159, 227, 153, 136, 231, + 154, 249, 62, 88, 169, 76, 197, 114, 12, 207, 111, 108, 71, 190, 55, 228, 59, 64, 222, 153, + 230, 50, 204, 91, 170, 61, 138, 239, 153, 249, 184, 231, 174, 64, 93, 128, 186, 95, 202, + 252, 0, 172, 48, 63, 192, 172, 3, 180, 173, 129, 43, 204, 41, 176, 78, 89, 2, 169, 198, 127, + 125, 153, 121, 162, 248, 249, 255, 127, 75, 244, 253, 247, 144, 9, 254, 208, 31, 250, 239, + 35, 179, 227, 255, 172, 44, 55, 254, 207, 146, 245, 221, 227, 242, 218, 251, 95, 35, 219, + 220, 147, 203, 251, 8, 128, 175, 250, 191, 71, 126, 89, 255, 57, 249, 159, 253, 135, 254, + 208, 31, 250, 67, 127, 232, 15, 253, 15, 20, 126, 186, 14, 88, 252, 135, 254, 208, 31, 250, + 67, 39, 136, 201, 127, 17, 3, 175, 131, 5, 60, 40, 14, 1, 144, 13, 13, 0, 62, 251, 89, 40, + 40, 250, 191, 168, 201, 228, 137, 64, 127, 130, 12, 160, 73, 255, 45, 195, 12, 252, 244, + 152, 12, 115, 8, 19, 35, 97, 224, 79, 149, 85, 203, 63, 133, 165, 135, 229, 127, 103, 142, + 50, 194, 38, 136, 16, 83, 141, 176, 25, 146, 196, 64, 93, 11, 28, 209, 255, 63, 155, 12, 91, + 97, 164, 232, 55, 194, 94, 160, 42, 103, 27, 97, 27, 191, 121, 176, 47, 111, 152, 171, 255, + 129, 44, 25, 246, 129, 145, 202, 47, 70, 216, 151, 95, 107, 26, 24, 167, 31, 180, 88, 30, + 26, 252, 179, 50, 185, 214, 20, 35, 204, 192, 98, 173, 51, 194, 28, 188, 189, 30, 30, 248, + 3, 50, 144, 228, 117, 151, 17, 86, 32, 216, 107, 167, 17, 54, 129, 143, 215, 11, 70, 216, + 12, 65, 94, 111, 27, 97, 11, 172, 243, 250, 194, 8, 91, 33, 212, 150, 108, 132, 189, 32, + 192, 182, 212, 8, 219, 216, 204, 193, 190, 188, 33, 221, 214, 99, 132, 125, 176, 252, 159, + 140, 176, 47, 155, 106, 123, 192, 8, 251, 65, 129, 143, 144, 127, 218, 77, 241, 50, 236, 76, + 97, 178, 51, 133, 201, 206, 20, 38, 59, 83, 152, 236, 76, 97, 178, 51, 133, 201, 206, 20, + 38, 59, 83, 152, 236, 76, 97, 178, 51, 133, 201, 206, 20, 38, 59, 83, 152, 236, 76, 97, 178, + 51, 133, 201, 206, 119, 131, 10, 185, 144, 131, 223, 5, 24, 154, 6, 205, 208, 8, 157, 208, + 14, 93, 168, 37, 224, 198, 180, 114, 12, 117, 66, 135, 254, 219, 137, 41, 205, 24, 106, 131, + 44, 204, 153, 0, 45, 248, 173, 194, 108, 76, 91, 10, 203, 48, 175, 75, 143, 185, 144, 46, + 44, 189, 2, 127, 55, 97, 201, 114, 172, 215, 130, 101, 22, 99, 90, 51, 150, 104, 214, 203, + 57, 81, 173, 216, 86, 147, 94, 182, 13, 99, 93, 152, 214, 166, 231, 81, 253, 102, 28, 129, + 138, 114, 98, 185, 102, 108, 97, 21, 198, 122, 48, 228, 198, 190, 100, 153, 110, 108, 209, + 141, 233, 46, 140, 201, 49, 119, 99, 237, 38, 204, 111, 195, 209, 200, 86, 218, 141, 86, + 221, 88, 162, 213, 232, 83, 150, 80, 113, 142, 237, 122, 159, 178, 151, 46, 125, 46, 147, + 244, 185, 46, 193, 20, 57, 199, 110, 76, 119, 233, 53, 58, 245, 148, 22, 125, 212, 110, 99, + 30, 141, 152, 147, 161, 183, 220, 170, 167, 180, 232, 45, 58, 209, 70, 148, 62, 208, 75, 43, + 182, 211, 162, 91, 172, 195, 24, 101, 27, 166, 180, 234, 189, 82, 155, 114, 158, 238, 33, + 35, 144, 61, 118, 232, 115, 33, 123, 15, 88, 155, 198, 46, 123, 106, 71, 11, 168, 56, 127, + 178, 184, 28, 85, 43, 150, 117, 98, 255, 110, 61, 38, 103, 236, 30, 92, 15, 178, 25, 245, + 162, 234, 99, 111, 51, 230, 213, 174, 219, 118, 177, 94, 242, 248, 136, 135, 206, 72, 90, + 109, 165, 94, 143, 102, 189, 28, 227, 89, 186, 63, 12, 93, 205, 17, 122, 107, 173, 122, 11, + 171, 116, 59, 116, 27, 43, 63, 212, 222, 114, 197, 104, 254, 46, 125, 252, 114, 254, 180, + 46, 157, 186, 55, 72, 82, 143, 114, 173, 85, 108, 163, 99, 112, 54, 52, 198, 165, 70, 153, + 46, 140, 173, 54, 90, 119, 227, 44, 104, 133, 86, 12, 174, 146, 83, 247, 17, 39, 166, 182, + 158, 48, 175, 1, 111, 110, 196, 145, 56, 245, 254, 27, 141, 254, 179, 78, 226, 245, 197, + 191, 153, 167, 10, 101, 152, 215, 162, 183, 54, 105, 136, 39, 20, 15, 238, 159, 209, 48, + 215, 240, 167, 102, 195, 243, 70, 99, 219, 50, 231, 196, 150, 50, 7, 91, 26, 218, 206, 201, + 247, 136, 203, 240, 118, 154, 187, 211, 152, 237, 82, 61, 151, 70, 239, 50, 236, 43, 103, + 212, 164, 251, 185, 156, 221, 114, 125, 133, 7, 234, 156, 60, 119, 201, 191, 181, 223, 143, + 251, 22, 173, 100, 45, 198, 154, 245, 49, 200, 254, 107, 244, 153, 184, 79, 88, 245, 108, + 99, 4, 237, 67, 102, 208, 104, 236, 82, 183, 62, 75, 151, 238, 249, 83, 49, 165, 17, 82, + 117, 143, 72, 195, 50, 77, 122, 251, 19, 245, 81, 81, 93, 55, 126, 119, 160, 165, 179, 241, + 187, 71, 255, 206, 210, 79, 132, 19, 71, 158, 165, 183, 222, 138, 101, 228, 31, 249, 146, + 227, 95, 170, 207, 160, 3, 91, 88, 133, 169, 114, 189, 151, 232, 115, 145, 251, 236, 196, + 86, 7, 210, 229, 89, 67, 43, 176, 124, 176, 189, 122, 125, 204, 228, 227, 171, 116, 223, + 236, 210, 71, 232, 214, 119, 97, 151, 126, 106, 80, 109, 85, 159, 131, 220, 193, 46, 221, + 255, 154, 245, 62, 200, 66, 139, 245, 186, 3, 214, 171, 68, 251, 77, 197, 243, 147, 234, + 118, 14, 201, 161, 221, 223, 164, 219, 228, 248, 142, 238, 209, 251, 106, 212, 119, 252, + 201, 250, 165, 184, 44, 219, 136, 94, 212, 173, 219, 176, 105, 112, 135, 52, 233, 249, 242, + 12, 162, 25, 12, 236, 138, 14, 125, 166, 109, 198, 190, 160, 182, 92, 250, 111, 185, 207, + 135, 207, 91, 230, 211, 121, 146, 138, 181, 210, 116, 239, 108, 197, 121, 185, 6, 119, 248, + 111, 71, 213, 246, 155, 150, 127, 191, 141, 142, 183, 62, 112, 166, 171, 198, 169, 76, 222, + 211, 120, 194, 233, 248, 219, 185, 31, 247, 215, 19, 199, 53, 118, 136, 5, 228, 76, 104, 46, + 116, 71, 12, 120, 125, 231, 224, 125, 211, 164, 159, 184, 109, 250, 201, 235, 252, 167, 51, + 37, 59, 59, 79, 176, 169, 203, 240, 254, 225, 123, 64, 90, 85, 122, 94, 183, 94, 179, 73, + 63, 189, 228, 108, 92, 131, 237, 200, 146, 45, 250, 9, 248, 31, 173, 208, 127, 213, 190, 56, + 190, 39, 178, 245, 209, 200, 61, 64, 247, 86, 150, 190, 86, 29, 176, 242, 110, 53, 55, 39, + 167, 64, 157, 214, 220, 216, 217, 222, 213, 190, 196, 173, 150, 183, 119, 118, 180, 119, 58, + 221, 205, 237, 109, 89, 234, 132, 150, 22, 117, 118, 243, 210, 101, 238, 46, 117, 182, 171, + 203, 213, 185, 194, 213, 148, 85, 238, 108, 105, 94, 220, 217, 172, 54, 119, 169, 78, 181, + 181, 189, 201, 213, 217, 166, 118, 57, 219, 186, 84, 204, 111, 94, 162, 46, 113, 182, 54, + 183, 172, 82, 123, 154, 221, 203, 212, 174, 238, 197, 238, 22, 151, 218, 217, 222, 221, 214, + 212, 220, 182, 180, 75, 109, 199, 162, 110, 87, 43, 214, 108, 107, 82, 27, 219, 59, 219, 92, + 157, 93, 89, 234, 36, 183, 186, 196, 229, 116, 119, 119, 186, 186, 212, 78, 151, 179, 69, + 109, 118, 99, 31, 141, 93, 25, 106, 87, 171, 19, 71, 208, 232, 236, 192, 176, 172, 210, 218, + 221, 226, 110, 238, 192, 38, 219, 186, 91, 93, 157, 88, 178, 203, 229, 214, 27, 232, 82, 59, + 58, 219, 113, 220, 114, 216, 216, 122, 75, 75, 123, 143, 186, 12, 7, 174, 54, 183, 118, 56, + 27, 221, 106, 115, 155, 234, 150, 243, 192, 145, 97, 21, 181, 165, 185, 13, 251, 106, 95, + 162, 46, 110, 94, 170, 55, 76, 29, 185, 93, 43, 221, 88, 185, 121, 185, 43, 75, 53, 166, 57, + 162, 75, 109, 117, 182, 173, 82, 27, 187, 113, 242, 52, 110, 247, 50, 236, 223, 213, 163, + 118, 58, 113, 46, 157, 205, 56, 109, 172, 232, 108, 85, 187, 59, 100, 55, 216, 226, 82, 76, + 233, 106, 94, 141, 197, 221, 237, 56, 161, 21, 114, 74, 78, 181, 199, 217, 217, 74, 125, 73, + 51, 55, 46, 115, 118, 226, 192, 92, 157, 89, 131, 166, 47, 30, 232, 83, 45, 107, 111, 105, + 194, 73, 73, 35, 20, 203, 245, 25, 61, 23, 237, 132, 51, 83, 71, 103, 229, 228, 24, 133, 50, + 101, 33, 42, 51, 100, 69, 92, 104, 118, 236, 221, 137, 221, 46, 109, 150, 195, 115, 225, + 120, 59, 157, 77, 174, 86, 103, 231, 114, 181, 93, 230, 12, 137, 46, 57, 249, 186, 235, 214, + 194, 73, 214, 182, 53, 187, 177, 126, 141, 219, 233, 166, 169, 103, 99, 3, 237, 122, 7, 141, + 184, 164, 238, 206, 102, 87, 87, 214, 212, 238, 198, 84, 103, 87, 154, 218, 228, 82, 39, + 118, 182, 99, 174, 219, 221, 81, 156, 157, 221, 211, 211, 147, 213, 58, 208, 120, 86, 99, + 123, 107, 182, 123, 85, 71, 251, 210, 78, 103, 199, 178, 85, 217, 141, 238, 37, 237, 109, + 238, 46, 163, 168, 12, 47, 113, 226, 4, 150, 203, 114, 245, 237, 221, 104, 241, 85, 106, + 119, 151, 11, 7, 129, 83, 146, 217, 170, 19, 23, 216, 213, 217, 218, 236, 150, 3, 90, 188, + 74, 31, 94, 101, 237, 212, 9, 152, 219, 169, 71, 112, 249, 155, 186, 105, 161, 123, 150, 53, + 55, 46, 27, 82, 23, 217, 220, 214, 216, 210, 221, 36, 109, 209, 174, 54, 53, 119, 117, 180, + 96, 7, 114, 41, 58, 58, 155, 177, 64, 35, 150, 114, 181, 185, 179, 212, 129, 190, 219, 219, + 208, 79, 82, 155, 211, 84, 87, 235, 98, 89, 233, 120, 83, 109, 3, 133, 79, 58, 34, 189, 184, + 244, 116, 52, 127, 23, 154, 167, 145, 220, 113, 176, 119, 221, 174, 70, 91, 99, 245, 1, 164, + 54, 99, 47, 184, 35, 164, 233, 59, 229, 190, 105, 106, 239, 105, 107, 105, 119, 14, 237, 20, + 199, 236, 164, 145, 162, 225, 7, 87, 160, 189, 219, 221, 209, 237, 70, 179, 175, 104, 110, + 116, 201, 50, 203, 92, 45, 29, 195, 38, 244, 123, 214, 66, 95, 137, 236, 38, 215, 18, 39, + 238, 173, 44, 103, 87, 199, 74, 249, 81, 77, 251, 17, 53, 77, 254, 125, 237, 223, 126, 237, + 240, 18, 125, 252, 214, 222, 232, 252, 248, 62, 126, 67, 111, 212, 104, 196, 70, 66, 103, + 111, 100, 33, 226, 116, 66, 7, 225, 212, 222, 136, 34, 196, 124, 194, 60, 130, 189, 55, 124, + 44, 34, 145, 144, 64, 80, 9, 241, 132, 56, 66, 44, 33, 134, 16, 73, 136, 38, 68, 16, 194, + 123, 195, 170, 226, 251, 216, 71, 132, 15, 9, 31, 16, 222, 39, 188, 71, 120, 151, 240, 119, + 194, 223, 8, 239, 16, 222, 38, 188, 69, 120, 147, 240, 26, 225, 13, 194, 235, 132, 191, 18, + 94, 37, 188, 66, 120, 137, 240, 34, 225, 5, 194, 243, 132, 231, 8, 207, 18, 158, 33, 236, + 35, 236, 37, 236, 33, 60, 69, 120, 146, 240, 4, 225, 161, 222, 80, 137, 151, 123, 67, 107, + 17, 15, 18, 250, 8, 15, 16, 238, 239, 13, 109, 66, 236, 34, 220, 71, 216, 73, 232, 37, 60, + 173, 67, 228, 247, 198, 103, 34, 242, 8, 185, 132, 81, 132, 28, 66, 182, 190, 182, 34, 139, + 98, 190, 189, 113, 217, 8, 111, 29, 252, 215, 222, 216, 28, 196, 17, 194, 47, 132, 159, 9, + 63, 17, 126, 36, 252, 64, 248, 158, 240, 29, 225, 111, 189, 49, 121, 136, 119, 8, 111, 19, + 222, 34, 188, 65, 120, 157, 240, 26, 225, 65, 26, 139, 15, 185, 219, 3, 132, 191, 18, 94, + 37, 220, 79, 184, 143, 208, 71, 174, 248, 39, 194, 45, 132, 155, 9, 187, 8, 91, 8, 111, 18, + 110, 36, 108, 37, 111, 189, 132, 112, 41, 225, 34, 114, 176, 243, 41, 118, 30, 161, 157, 92, + 248, 98, 194, 5, 132, 86, 66, 11, 97, 57, 225, 52, 170, 94, 75, 168, 39, 212, 17, 78, 33, + 204, 37, 108, 32, 212, 16, 102, 17, 110, 34, 76, 39, 92, 72, 152, 73, 152, 65, 152, 70, 152, + 170, 67, 248, 83, 108, 50, 97, 10, 33, 76, 119, 34, 30, 74, 104, 35, 204, 38, 132, 16, 130, + 9, 65, 132, 64, 66, 0, 193, 159, 224, 71, 240, 37, 248, 16, 188, 9, 54, 194, 28, 130, 23, + 57, 237, 110, 242, 186, 199, 201, 235, 226, 200, 151, 98, 9, 49, 132, 104, 66, 36, 33, 130, + 160, 144, 187, 9, 114, 183, 79, 201, 109, 62, 33, 124, 76, 56, 72, 216, 71, 30, 178, 151, + 240, 52, 97, 15, 121, 193, 83, 132, 123, 9, 247, 16, 182, 145, 47, 69, 209, 130, 23, 144, + 121, 70, 19, 26, 245, 81, 139, 48, 26, 68, 40, 33, 132, 16, 76, 8, 34, 4, 18, 2, 8, 140, + 134, 11, 52, 92, 141, 112, 140, 112, 148, 176, 159, 134, 251, 17, 225, 67, 194, 7, 132, 247, + 9, 239, 17, 222, 37, 252, 157, 240, 36, 205, 232, 9, 194, 110, 194, 227, 132, 199, 8, 143, + 18, 30, 33, 60, 76, 120, 136, 112, 55, 77, 250, 46, 194, 157, 132, 59, 8, 183, 19, 110, 35, + 28, 32, 131, 92, 69, 184, 146, 112, 57, 97, 19, 97, 51, 185, 254, 21, 132, 213, 132, 85, + 132, 149, 132, 30, 194, 101, 132, 21, 132, 110, 130, 155, 208, 69, 88, 76, 187, 99, 17, 97, + 33, 97, 1, 193, 73, 200, 167, 85, 201, 35, 228, 18, 70, 17, 114, 8, 13, 132, 108, 66, 22, + 33, 147, 144, 78, 24, 73, 72, 35, 164, 16, 146, 9, 73, 132, 84, 194, 8, 218, 64, 156, 92, + 56, 131, 92, 248, 39, 194, 15, 132, 239, 9, 223, 17, 190, 37, 28, 38, 124, 67, 248, 154, + 112, 136, 240, 21, 225, 75, 194, 23, 132, 207, 9, 159, 17, 62, 37, 124, 66, 248, 152, 240, + 35, 225, 32, 225, 0, 97, 63, 249, 103, 38, 121, 93, 6, 33, 157, 48, 146, 144, 70, 72, 37, + 140, 32, 36, 19, 236, 132, 68, 66, 2, 33, 158, 96, 35, 23, 246, 34, 88, 9, 22, 130, 153, 92, + 248, 91, 242, 200, 195, 132, 111, 8, 95, 19, 14, 17, 190, 34, 124, 65, 248, 156, 240, 25, + 225, 101, 242, 200, 151, 8, 95, 18, 94, 33, 188, 72, 120, 129, 92, 241, 57, 194, 179, 132, + 103, 104, 195, 166, 80, 172, 151, 92, 209, 67, 216, 78, 248, 11, 225, 122, 194, 117, 132, + 107, 9, 207, 19, 254, 172, 67, 152, 200, 249, 174, 38, 156, 67, 88, 79, 56, 139, 112, 38, + 225, 12, 130, 139, 92, 113, 39, 161, 153, 176, 140, 252, 101, 9, 161, 137, 176, 131, 80, 73, + 168, 38, 148, 17, 38, 16, 28, 132, 82, 194, 185, 132, 179, 9, 215, 16, 74, 8, 227, 9, 99, 9, + 197, 132, 34, 194, 36, 194, 68, 66, 21, 97, 12, 161, 144, 96, 37, 23, 182, 16, 198, 17, 204, + 4, 19, 65, 33, 8, 130, 225, 243, 140, 80, 65, 40, 39, 0, 97, 13, 249, 160, 70, 232, 167, + 196, 165, 20, 59, 70, 56, 74, 248, 149, 112, 132, 240, 15, 194, 47, 132, 199, 232, 70, 120, + 148, 240, 8, 225, 97, 194, 142, 222, 144, 139, 17, 30, 29, 124, 29, 45, 192, 90, 29, 44, + 206, 241, 114, 64, 89, 252, 207, 126, 213, 241, 63, 161, 126, 244, 157, 28, 191, 31, 245, + 17, 234, 67, 159, 233, 241, 79, 163, 246, 160, 158, 66, 61, 137, 122, 2, 181, 27, 245, 184, + 247, 220, 248, 199, 80, 247, 161, 118, 162, 122, 81, 59, 80, 30, 212, 118, 212, 95, 80, 247, + 162, 238, 65, 109, 67, 253, 25, 117, 55, 234, 46, 212, 157, 168, 59, 80, 183, 163, 110, 67, + 221, 138, 186, 197, 182, 44, 254, 102, 212, 86, 212, 22, 212, 77, 168, 27, 81, 55, 160, 174, + 71, 93, 135, 186, 22, 117, 13, 234, 106, 212, 85, 94, 61, 241, 151, 163, 46, 67, 109, 66, + 109, 68, 93, 138, 186, 196, 203, 133, 115, 250, 83, 111, 112, 46, 226, 22, 194, 205, 189, + 65, 114, 162, 91, 9, 151, 19, 46, 235, 13, 116, 32, 54, 17, 54, 18, 46, 37, 92, 66, 184, + 152, 176, 129, 112, 17, 225, 66, 194, 5, 132, 233, 132, 105, 189, 104, 194, 62, 54, 149, 48, + 133, 48, 153, 48, 137, 80, 77, 152, 72, 168, 34, 84, 18, 42, 122, 253, 43, 17, 229, 132, 50, + 66, 44, 33, 134, 16, 77, 136, 34, 68, 18, 34, 122, 113, 197, 250, 88, 56, 33, 140, 16, 74, + 8, 33, 4, 19, 130, 122, 113, 61, 251, 88, 160, 227, 20, 228, 15, 168, 239, 81, 223, 161, + 190, 69, 29, 70, 125, 131, 250, 26, 215, 245, 3, 212, 251, 168, 247, 80, 239, 162, 254, 142, + 250, 27, 234, 29, 92, 163, 183, 81, 143, 162, 30, 65, 61, 132, 122, 16, 245, 39, 92, 139, + 43, 209, 238, 125, 236, 58, 50, 246, 181, 132, 102, 50, 204, 50, 194, 82, 194, 18, 130, 139, + 208, 68, 104, 36, 44, 38, 56, 9, 13, 132, 209, 132, 124, 50, 83, 30, 33, 151, 48, 138, 144, + 67, 200, 38, 100, 17, 50, 201, 62, 25, 4, 11, 193, 76, 48, 17, 238, 237, 13, 14, 65, 220, + 211, 27, 28, 141, 216, 70, 248, 115, 111, 176, 29, 113, 55, 225, 46, 194, 157, 52, 163, 59, + 8, 183, 19, 110, 35, 220, 74, 184, 134, 112, 53, 225, 42, 194, 149, 228, 104, 155, 9, 87, + 16, 22, 17, 22, 210, 196, 22, 16, 78, 37, 204, 39, 204, 35, 212, 19, 234, 8, 167, 16, 230, + 18, 106, 9, 115, 8, 53, 132, 217, 132, 89, 132, 153, 132, 25, 132, 116, 194, 72, 50, 79, 26, + 33, 149, 48, 130, 144, 66, 72, 38, 36, 17, 236, 132, 68, 66, 2, 153, 78, 37, 196, 19, 20, + 130, 32, 112, 2, 35, 128, 227, 28, 116, 63, 13, 213, 143, 58, 134, 58, 138, 250, 21, 117, 4, + 253, 237, 31, 168, 95, 80, 95, 161, 190, 68, 125, 129, 250, 28, 245, 25, 234, 83, 212, 39, + 232, 119, 31, 163, 14, 162, 14, 160, 94, 70, 189, 132, 122, 17, 245, 2, 234, 121, 212, 115, + 168, 103, 81, 207, 160, 246, 161, 246, 162, 250, 80, 15, 160, 111, 222, 143, 218, 133, 234, + 99, 219, 105, 69, 254, 66, 216, 66, 184, 137, 112, 35, 173, 200, 13, 132, 235, 9, 231, 19, + 206, 235, 13, 204, 66, 156, 75, 214, 59, 135, 112, 54, 225, 44, 194, 122, 194, 153, 132, 51, + 8, 235, 8, 107, 9, 107, 8, 171, 9, 171, 8, 43, 9, 61, 132, 21, 132, 110, 130, 155, 208, 69, + 232, 36, 156, 78, 232, 32, 180, 19, 218, 8, 173, 132, 22, 194, 4, 130, 131, 22, 173, 148, + 48, 158, 48, 142, 80, 66, 24, 75, 40, 38, 20, 17, 198, 16, 10, 105, 9, 11, 8, 1, 4, 127, + 130, 31, 193, 151, 224, 67, 240, 166, 163, 198, 70, 240, 34, 88, 29, 217, 200, 67, 184, 34, + 111, 161, 222, 68, 189, 129, 122, 29, 245, 26, 234, 175, 168, 87, 81, 175, 224, 42, 109, + 198, 83, 228, 10, 253, 36, 89, 78, 198, 63, 205, 209, 134, 243, 56, 79, 36, 199, 159, 43, + 178, 226, 207, 97, 89, 241, 103, 87, 175, 175, 61, 107, 219, 250, 218, 51, 171, 215, 213, + 158, 177, 109, 93, 173, 247, 186, 177, 235, 166, 172, 19, 222, 235, 162, 17, 107, 214, 109, + 91, 247, 247, 117, 230, 181, 213, 171, 107, 215, 108, 91, 93, 171, 172, 14, 89, 205, 109, + 171, 170, 123, 106, 87, 110, 235, 169, 245, 238, 97, 62, 43, 170, 187, 107, 231, 116, 31, + 236, 254, 161, 91, 132, 116, 207, 233, 110, 234, 118, 119, 95, 217, 253, 58, 38, 88, 110, + 235, 190, 175, 123, 79, 183, 232, 211, 118, 59, 130, 186, 199, 140, 173, 90, 223, 125, 89, + 55, 15, 193, 124, 14, 221, 204, 95, 38, 39, 116, 123, 251, 85, 185, 171, 59, 107, 187, 182, + 117, 214, 42, 157, 249, 157, 124, 236, 193, 78, 246, 74, 39, 227, 106, 39, 115, 116, 206, + 236, 228, 88, 106, 103, 103, 82, 106, 149, 44, 173, 117, 134, 69, 85, 65, 167, 218, 153, + 211, 41, 78, 175, 110, 175, 237, 216, 214, 94, 219, 86, 221, 90, 251, 114, 43, 59, 13, 167, + 211, 156, 181, 180, 118, 217, 182, 165, 181, 75, 178, 154, 106, 93, 219, 154, 106, 27, 179, + 22, 215, 58, 179, 26, 106, 23, 101, 45, 168, 93, 184, 109, 65, 237, 169, 89, 243, 106, 231, + 111, 155, 87, 91, 159, 85, 87, 123, 10, 150, 159, 155, 53, 167, 182, 118, 219, 156, 218, + 154, 172, 89, 181, 179, 183, 205, 170, 157, 145, 53, 189, 118, 58, 166, 79, 203, 154, 82, + 59, 117, 219, 148, 218, 201, 89, 213, 181, 147, 182, 85, 215, 206, 172, 102, 19, 179, 170, + 106, 43, 69, 65, 60, 196, 51, 136, 195, 159, 142, 184, 245, 113, 135, 227, 20, 239, 134, + 216, 142, 88, 222, 17, 251, 97, 236, 225, 88, 209, 17, 115, 56, 134, 159, 25, 205, 252, 163, + 206, 140, 218, 20, 37, 252, 241, 23, 167, 95, 145, 241, 145, 155, 34, 183, 70, 110, 143, 52, + 249, 235, 1, 225, 211, 17, 180, 62, 136, 119, 4, 174, 15, 228, 57, 129, 142, 192, 87, 2, 63, + 12, 84, 32, 240, 230, 64, 238, 191, 201, 127, 171, 255, 118, 127, 49, 195, 127, 145, 255, + 55, 254, 154, 191, 178, 221, 159, 109, 247, 123, 220, 239, 101, 63, 49, 195, 111, 145, 99, + 161, 95, 187, 159, 240, 247, 147, 41, 34, 192, 225, 151, 53, 170, 202, 223, 55, 222, 55, + 219, 87, 148, 100, 251, 150, 250, 206, 240, 21, 155, 124, 153, 195, 55, 43, 183, 202, 225, + 155, 52, 162, 170, 212, 103, 134, 207, 34, 31, 177, 213, 135, 57, 124, 82, 210, 170, 190, + 177, 105, 54, 238, 176, 97, 134, 195, 43, 37, 19, 127, 133, 71, 87, 129, 96, 42, 99, 192, 2, + 16, 194, 138, 54, 190, 143, 133, 198, 87, 137, 71, 244, 63, 245, 111, 2, 198, 46, 219, 49, + 167, 38, 61, 125, 74, 159, 69, 155, 61, 197, 227, 53, 115, 190, 135, 93, 232, 73, 174, 145, + 191, 29, 179, 230, 121, 204, 23, 122, 160, 118, 222, 252, 186, 29, 140, 109, 172, 151, 127, + 131, 103, 142, 39, 68, 254, 57, 102, 61, 126, 222, 165, 151, 66, 108, 217, 20, 79, 108, 77, + 93, 175, 184, 249, 230, 216, 178, 250, 41, 158, 245, 50, 236, 112, 232, 97, 77, 134, 1, 139, + 212, 167, 47, 236, 234, 238, 74, 79, 79, 239, 74, 239, 114, 227, 111, 247, 194, 46, 76, 113, + 119, 227, 143, 14, 134, 191, 145, 221, 110, 153, 227, 238, 2, 89, 240, 228, 95, 212, 72, + 122, 87, 247, 162, 110, 172, 138, 145, 133, 93, 93, 178, 209, 238, 116, 25, 147, 146, 29, + 252, 241, 245, 251, 190, 216, 255, 237, 1, 252, 143, 254, 138, 88, 180, 240, 127, 1, 165, + 162, 213, 223, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, + 98, 106, 13, 49, 52, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, + 32, 50, 50, 48, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 72, 137, 92, 80, 189, 106, 195, + 48, 16, 222, 245, 20, 55, 166, 147, 156, 44, 201, 96, 60, 52, 161, 224, 161, 63, 212, 125, + 1, 69, 58, 57, 130, 248, 36, 206, 242, 224, 183, 207, 73, 53, 41, 244, 64, 130, 239, 79, + 124, 58, 125, 238, 47, 61, 133, 12, 250, 139, 163, 29, 48, 131, 15, 228, 24, 231, 184, 176, + 69, 184, 226, 24, 72, 237, 15, 224, 130, 205, 27, 170, 183, 157, 76, 82, 90, 194, 195, 58, + 103, 156, 122, 242, 81, 181, 45, 232, 111, 17, 231, 204, 43, 236, 134, 232, 243, 221, 144, + 123, 1, 253, 201, 14, 57, 208, 8, 187, 222, 33, 229, 144, 87, 33, 135, 37, 165, 59, 78, 130, + 161, 129, 174, 3, 135, 94, 30, 124, 55, 233, 195, 76, 40, 242, 22, 255, 227, 127, 214, 132, + 112, 168, 120, 255, 91, 197, 70, 135, 115, 50, 22, 217, 208, 136, 170, 109, 100, 58, 104, + 223, 100, 58, 133, 228, 254, 233, 91, 234, 234, 237, 205, 112, 113, 31, 79, 197, 221, 188, + 30, 171, 123, 227, 75, 174, 124, 238, 89, 197, 46, 204, 210, 178, 110, 160, 22, 41, 21, 2, + 225, 115, 73, 41, 166, 146, 170, 231, 33, 192, 0, 248, 214, 112, 46, 13, 10, 101, 110, 100, + 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 52, 52, 32, 48, 32, + 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, + 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, 51, 50, 48, 50, 52, 47, 76, + 101, 110, 103, 116, 104, 49, 32, 56, 52, 50, 49, 49, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 120, 156, 236, 125, 7, 116, 85, 69, 247, 239, 158, 62, 39, 55, 33, 161, 151, 144, + 228, 38, 33, 161, 36, 64, 232, 29, 2, 33, 244, 222, 65, 132, 4, 18, 32, 180, 32, 4, 16, 44, + 160, 72, 49, 116, 164, 11, 8, 42, 69, 16, 12, 85, 192, 134, 5, 21, 144, 38, 2, 82, 164, 8, + 136, 82, 21, 41, 210, 114, 223, 158, 115, 239, 13, 33, 162, 126, 254, 255, 223, 91, 111, + 173, 183, 146, 203, 239, 238, 61, 125, 102, 159, 61, 123, 246, 204, 156, 4, 32, 0, 224, 7, + 99, 129, 65, 155, 214, 237, 203, 87, 204, 31, 223, 37, 25, 99, 78, 34, 18, 122, 15, 74, 28, + 114, 241, 153, 15, 118, 2, 144, 218, 0, 161, 19, 122, 143, 72, 115, 102, 198, 156, 250, 21, + 32, 236, 51, 0, 117, 188, 207, 144, 190, 131, 62, 95, 17, 132, 53, 148, 89, 4, 32, 43, 244, + 29, 56, 170, 207, 254, 182, 39, 26, 0, 196, 236, 5, 160, 109, 250, 37, 39, 38, 29, 57, 218, + 32, 2, 160, 82, 8, 214, 87, 181, 31, 70, 228, 187, 94, 168, 43, 134, 59, 98, 184, 68, 191, + 65, 105, 207, 62, 149, 80, 105, 51, 134, 71, 1, 84, 62, 48, 48, 181, 119, 226, 189, 86, 152, + 2, 253, 154, 98, 248, 187, 65, 137, 207, 14, 201, 191, 83, 174, 5, 88, 28, 132, 145, 206, + 193, 137, 131, 146, 75, 133, 188, 197, 49, 92, 7, 32, 239, 222, 33, 169, 195, 210, 174, 124, + 60, 169, 20, 192, 123, 62, 0, 233, 111, 15, 25, 154, 60, 164, 198, 79, 95, 251, 1, 169, 177, + 14, 192, 63, 30, 24, 171, 66, 102, 128, 0, 45, 22, 138, 74, 56, 138, 8, 55, 101, 75, 161, + 15, 205, 71, 4, 165, 146, 9, 46, 40, 227, 103, 160, 204, 245, 29, 240, 108, 125, 108, 197, + 50, 237, 119, 104, 25, 231, 132, 88, 112, 186, 30, 136, 41, 153, 141, 72, 37, 21, 74, 62, + 136, 5, 226, 114, 185, 176, 244, 108, 209, 194, 244, 6, 176, 31, 40, 53, 55, 138, 131, 145, + 35, 4, 180, 194, 16, 114, 121, 59, 0, 15, 168, 136, 45, 86, 196, 128, 130, 138, 240, 34, + 113, 81, 39, 237, 74, 215, 178, 112, 214, 154, 165, 178, 225, 236, 69, 150, 206, 166, 176, + 101, 108, 31, 187, 205, 253, 120, 107, 62, 65, 228, 23, 95, 137, 75, 226, 166, 100, 178, + 160, 12, 148, 33, 178, 166, 236, 33, 93, 106, 80, 80, 255, 160, 1, 65, 159, 7, 237, 14, 114, + 5, 143, 9, 126, 61, 248, 183, 224, 187, 33, 5, 67, 130, 66, 226, 67, 90, 134, 116, 14, 233, + 26, 242, 84, 200, 211, 33, 47, 132, 108, 10, 249, 34, 228, 80, 200, 137, 144, 235, 33, 55, + 67, 50, 157, 254, 206, 48, 103, 164, 51, 198, 89, 217, 89, 211, 89, 219, 89, 215, 217, 208, + 217, 195, 153, 234, 28, 227, 156, 237, 220, 28, 42, 66, 243, 135, 22, 10, 13, 11, 141, 12, + 45, 23, 218, 42, 180, 67, 104, 143, 208, 87, 66, 231, 132, 174, 10, 163, 97, 50, 204, 63, + 44, 95, 88, 193, 176, 98, 97, 33, 97, 165, 195, 162, 194, 154, 132, 37, 134, 37, 135, 211, + 240, 128, 240, 208, 8, 136, 160, 17, 190, 17, 1, 17, 5, 34, 138, 68, 20, 143, 40, 17, 17, + 29, 81, 57, 162, 118, 196, 192, 136, 177, 17, 175, 68, 76, 138, 152, 18, 241, 90, 196, 178, + 136, 119, 35, 54, 68, 108, 143, 248, 48, 226, 139, 136, 111, 34, 246, 71, 28, 139, 248, 41, + 178, 118, 100, 108, 100, 131, 200, 132, 200, 222, 145, 125, 34, 7, 68, 166, 70, 15, 140, 30, + 89, 174, 240, 202, 98, 43, 67, 239, 211, 251, 85, 239, 215, 190, 95, 247, 126, 253, 251, 13, + 239, 175, 191, 127, 241, 190, 235, 65, 175, 135, 245, 30, 222, 120, 248, 32, 51, 60, 243, + 129, 235, 129, 145, 51, 74, 120, 41, 5, 26, 74, 187, 209, 117, 172, 4, 107, 195, 210, 216, + 104, 246, 10, 202, 108, 26, 123, 139, 29, 96, 119, 120, 30, 222, 134, 79, 18, 51, 197, 1, + 241, 171, 4, 233, 64, 153, 5, 203, 80, 25, 43, 19, 84, 155, 32, 64, 153, 13, 12, 250, 34, + 40, 51, 24, 130, 199, 6, 47, 13, 190, 17, 2, 33, 69, 66, 156, 33, 77, 66, 218, 120, 100, + 214, 51, 100, 108, 200, 150, 144, 47, 67, 142, 132, 252, 16, 114, 35, 228, 182, 19, 156, + 249, 80, 102, 101, 156, 21, 157, 53, 178, 100, 214, 31, 101, 54, 195, 185, 244, 49, 153, + 181, 12, 109, 31, 250, 20, 202, 108, 70, 150, 204, 242, 162, 204, 138, 134, 5, 123, 100, + 150, 16, 150, 100, 203, 204, 249, 23, 50, 107, 147, 37, 179, 25, 17, 75, 35, 86, 103, 201, + 108, 55, 202, 236, 123, 148, 89, 205, 44, 153, 37, 71, 246, 71, 153, 37, 68, 167, 161, 204, + 10, 175, 116, 222, 39, 247, 131, 238, 87, 71, 153, 197, 222, 143, 187, 223, 232, 254, 161, + 251, 15, 30, 244, 120, 88, 215, 150, 153, 51, 115, 172, 145, 153, 235, 28, 0, 191, 142, 248, + 22, 64, 224, 12, 17, 165, 141, 78, 102, 166, 152, 111, 126, 0, 185, 50, 96, 255, 60, 56, + 240, 96, 143, 88, 134, 244, 91, 200, 250, 185, 86, 21, 224, 58, 187, 142, 154, 125, 121, 12, + 192, 79, 168, 219, 151, 11, 94, 206, 127, 57, 239, 101, 255, 203, 126, 151, 125, 47, 59, 46, + 251, 92, 182, 46, 171, 203, 242, 178, 184, 204, 46, 211, 203, 112, 201, 60, 33, 56, 51, 222, + 254, 126, 229, 204, 221, 179, 171, 206, 140, 188, 130, 45, 157, 121, 255, 74, 117, 252, 78, + 63, 243, 194, 217, 225, 167, 251, 159, 30, 117, 102, 251, 229, 111, 206, 69, 159, 153, 118, + 121, 222, 233, 85, 167, 231, 158, 154, 123, 234, 205, 83, 147, 1, 78, 173, 48, 229, 78, 23, + 62, 245, 204, 169, 158, 24, 138, 57, 21, 123, 170, 210, 169, 18, 39, 27, 157, 140, 63, 89, + 251, 100, 141, 147, 85, 79, 86, 58, 25, 115, 178, 244, 201, 176, 147, 129, 39, 11, 156, 36, + 39, 174, 157, 184, 124, 226, 231, 19, 23, 78, 252, 104, 74, 157, 248, 242, 196, 39, 39, 62, + 62, 241, 62, 114, 59, 79, 44, 63, 241, 222, 137, 248, 19, 13, 78, 212, 63, 81, 226, 68, 216, + 137, 208, 19, 193, 231, 23, 156, 249, 240, 204, 230, 83, 219, 251, 20, 234, 147, 87, 124, + 140, 147, 111, 145, 122, 93, 45, 84, 11, 220, 163, 148, 191, 200, 186, 126, 199, 253, 14, + 250, 94, 18, 192, 122, 155, 153, 74, 98, 112, 2, 95, 65, 249, 116, 67, 121, 161, 229, 18, + 47, 138, 9, 248, 61, 67, 108, 193, 220, 104, 85, 100, 101, 185, 84, 109, 113, 151, 214, 197, + 17, 229, 116, 140, 238, 165, 151, 88, 104, 33, 125, 10, 152, 88, 159, 0, 15, 26, 194, 63, + 252, 248, 84, 244, 105, 131, 223, 131, 125, 70, 103, 139, 75, 179, 191, 71, 255, 85, 25, 79, + 174, 9, 6, 62, 147, 60, 161, 87, 254, 169, 165, 108, 37, 187, 251, 244, 200, 226, 187, 253, + 7, 249, 107, 103, 113, 125, 28, 181, 29, 73, 127, 202, 192, 224, 45, 120, 5, 198, 179, 30, + 48, 23, 126, 130, 9, 48, 13, 38, 195, 98, 120, 7, 222, 134, 0, 72, 71, 129, 142, 131, 215, + 224, 87, 248, 13, 166, 194, 60, 152, 68, 8, 174, 36, 215, 97, 9, 172, 134, 223, 225, 6, 220, + 132, 55, 225, 93, 248, 26, 190, 132, 181, 208, 11, 122, 195, 12, 72, 130, 221, 144, 12, 95, + 193, 46, 216, 7, 123, 224, 27, 216, 11, 23, 161, 15, 28, 132, 253, 112, 0, 214, 65, 95, 184, + 6, 51, 225, 59, 248, 22, 14, 65, 63, 248, 5, 46, 195, 171, 208, 31, 82, 96, 0, 12, 130, 129, + 48, 24, 150, 66, 42, 60, 3, 67, 96, 40, 12, 131, 225, 144, 6, 35, 96, 36, 252, 12, 207, 194, + 104, 24, 5, 207, 193, 11, 240, 60, 188, 15, 203, 96, 12, 188, 136, 235, 219, 75, 112, 9, + 174, 192, 54, 50, 151, 204, 35, 148, 48, 194, 137, 128, 251, 240, 128, 204, 39, 11, 200, 66, + 242, 58, 60, 132, 76, 34, 137, 34, 26, 92, 100, 17, 89, 76, 150, 144, 55, 200, 82, 178, 140, + 88, 196, 135, 56, 136, 47, 121, 147, 188, 5, 183, 225, 14, 121, 155, 44, 39, 43, 200, 74, + 178, 138, 188, 67, 86, 147, 53, 228, 93, 178, 150, 172, 35, 239, 145, 12, 178, 158, 108, 32, + 27, 225, 15, 56, 76, 210, 201, 100, 178, 137, 108, 38, 91, 200, 251, 100, 43, 241, 35, 121, + 200, 54, 178, 157, 248, 147, 0, 146, 151, 228, 131, 51, 112, 150, 228, 39, 5, 200, 7, 228, + 67, 82, 144, 20, 34, 83, 200, 71, 228, 99, 242, 9, 217, 65, 62, 37, 159, 145, 194, 164, 8, + 188, 7, 25, 164, 40, 41, 70, 62, 39, 95, 144, 64, 82, 156, 4, 145, 96, 178, 147, 124, 9, + 119, 225, 30, 252, 8, 231, 72, 8, 113, 146, 80, 18, 70, 190, 34, 95, 147, 93, 100, 55, 217, + 67, 190, 33, 123, 201, 62, 18, 78, 74, 144, 8, 18, 73, 246, 147, 3, 228, 32, 249, 150, 28, + 34, 223, 193, 118, 82, 146, 148, 34, 165, 73, 25, 56, 15, 23, 200, 97, 153, 46, 39, 203, 41, + 114, 170, 156, 38, 167, 203, 25, 114, 166, 156, 37, 95, 147, 179, 229, 28, 57, 87, 206, 147, + 243, 69, 9, 185, 64, 46, 132, 21, 242, 117, 185, 72, 46, 150, 75, 228, 27, 114, 169, 92, 38, + 223, 148, 111, 201, 183, 229, 114, 185, 66, 174, 228, 253, 249, 0, 185, 74, 190, 35, 87, + 203, 53, 242, 93, 185, 86, 174, 147, 239, 201, 12, 185, 94, 110, 144, 27, 229, 38, 62, 144, + 15, 146, 155, 229, 22, 249, 190, 220, 42, 183, 201, 237, 242, 3, 249, 161, 252, 72, 126, 44, + 63, 145, 59, 228, 167, 242, 51, 249, 185, 252, 66, 238, 148, 95, 202, 175, 228, 215, 114, + 151, 220, 45, 247, 200, 111, 228, 94, 185, 79, 238, 151, 7, 248, 3, 254, 144, 103, 114, 151, + 0, 129, 75, 179, 48, 43, 179, 16, 82, 40, 161, 133, 37, 124, 132, 67, 30, 148, 223, 202, 67, + 242, 176, 60, 34, 143, 202, 239, 229, 49, 121, 92, 158, 144, 39, 229, 15, 242, 148, 60, 45, + 207, 200, 179, 242, 71, 121, 78, 158, 151, 23, 228, 79, 242, 162, 252, 25, 103, 250, 37, + 121, 89, 94, 145, 87, 229, 53, 114, 132, 28, 37, 223, 147, 99, 228, 56, 57, 225, 200, 167, + 2, 84, 94, 149, 79, 229, 87, 5, 84, 65, 85, 72, 21, 86, 69, 84, 81, 21, 168, 138, 171, 32, + 21, 172, 66, 148, 83, 133, 170, 48, 71, 126, 71, 1, 71, 65, 135, 191, 227, 148, 227, 180, + 227, 140, 227, 172, 227, 71, 199, 57, 199, 121, 199, 5, 199, 79, 142, 139, 190, 55, 125, + 111, 249, 222, 246, 189, 227, 251, 135, 239, 93, 223, 123, 190, 247, 125, 31, 248, 62, 244, + 205, 244, 117, 249, 129, 31, 81, 225, 170, 132, 138, 80, 145, 170, 164, 42, 165, 74, 171, + 50, 42, 74, 68, 56, 10, 57, 10, 171, 177, 234, 37, 245, 178, 26, 167, 94, 81, 227, 213, 4, + 53, 81, 77, 82, 175, 170, 116, 53, 89, 77, 81, 83, 213, 52, 53, 93, 205, 80, 51, 213, 44, + 245, 154, 154, 173, 230, 192, 17, 56, 173, 230, 194, 247, 106, 158, 154, 175, 22, 160, 237, + 122, 29, 109, 216, 98, 181, 68, 189, 161, 150, 170, 101, 234, 77, 245, 150, 122, 27, 142, + 193, 113, 56, 1, 167, 224, 40, 252, 160, 150, 171, 21, 106, 165, 90, 165, 222, 81, 171, 213, + 26, 245, 174, 90, 171, 214, 169, 247, 84, 134, 90, 175, 54, 168, 141, 106, 147, 218, 236, + 40, 226, 40, 234, 40, 230, 8, 116, 20, 119, 4, 57, 130, 29, 33, 14, 167, 35, 212, 17, 230, + 8, 119, 148, 112, 68, 56, 34, 29, 37, 29, 165, 248, 44, 254, 154, 110, 192, 71, 235, 56, + 221, 80, 199, 235, 70, 186, 49, 79, 211, 77, 116, 83, 221, 76, 55, 215, 45, 116, 75, 221, + 74, 183, 214, 109, 116, 91, 221, 78, 183, 215, 29, 116, 71, 221, 73, 119, 214, 93, 116, 87, + 221, 77, 63, 165, 187, 235, 167, 117, 15, 221, 83, 39, 240, 57, 142, 210, 142, 50, 142, 40, + 71, 180, 163, 172, 163, 156, 163, 188, 35, 198, 241, 179, 227, 23, 199, 37, 199, 101, 199, + 21, 71, 5, 71, 69, 71, 37, 61, 85, 79, 211, 211, 245, 12, 61, 83, 207, 210, 175, 233, 217, + 122, 142, 158, 171, 231, 233, 249, 122, 129, 94, 168, 95, 215, 139, 244, 27, 126, 212, 143, + 249, 113, 8, 38, 215, 201, 175, 228, 55, 114, 146, 220, 32, 191, 147, 155, 228, 54, 185, 67, + 254, 32, 119, 201, 61, 18, 69, 238, 147, 7, 228, 33, 201, 36, 209, 232, 83, 1, 37, 148, 82, + 70, 57, 21, 84, 82, 69, 53, 181, 168, 15, 41, 75, 29, 212, 151, 250, 209, 60, 212, 159, 6, + 208, 188, 52, 31, 205, 79, 11, 144, 114, 180, 32, 45, 68, 202, 147, 24, 90, 152, 22, 161, + 69, 105, 49, 26, 72, 139, 211, 32, 26, 76, 67, 208, 55, 155, 130, 158, 70, 24, 169, 64, 42, + 210, 112, 82, 137, 150, 160, 17, 52, 146, 150, 164, 165, 104, 105, 90, 134, 70, 57, 42, 59, + 170, 56, 142, 59, 78, 56, 78, 58, 174, 58, 174, 57, 174, 59, 126, 213, 95, 209, 104, 90, + 150, 150, 163, 229, 105, 12, 173, 64, 43, 210, 74, 180, 50, 173, 66, 171, 210, 106, 250, + 107, 189, 139, 142, 166, 207, 209, 231, 233, 11, 244, 69, 58, 134, 142, 165, 47, 209, 151, + 233, 56, 250, 10, 29, 175, 119, 211, 9, 116, 162, 222, 163, 191, 209, 123, 245, 62, 189, 95, + 31, 208, 7, 245, 183, 250, 144, 254, 78, 31, 214, 71, 244, 81, 253, 189, 62, 166, 143, 235, + 19, 250, 164, 254, 65, 159, 210, 167, 245, 25, 125, 86, 255, 168, 207, 233, 243, 250, 130, + 254, 73, 95, 212, 63, 235, 75, 250, 178, 190, 162, 175, 234, 107, 250, 186, 254, 85, 255, + 166, 111, 232, 223, 245, 77, 125, 75, 223, 214, 119, 244, 31, 250, 174, 190, 71, 39, 209, + 87, 69, 128, 200, 171, 239, 235, 7, 34, 159, 200, 175, 31, 234, 76, 81, 64, 20, 20, 133, 68, + 97, 237, 178, 192, 34, 22, 21, 69, 68, 81, 139, 89, 220, 18, 150, 180, 148, 165, 45, 203, + 242, 177, 28, 150, 175, 40, 38, 2, 69, 113, 17, 36, 130, 69, 136, 229, 103, 229, 177, 252, + 173, 0, 225, 20, 161, 34, 76, 132, 91, 121, 173, 124, 86, 126, 171, 128, 85, 208, 42, 100, + 21, 182, 138, 88, 69, 173, 98, 86, 160, 85, 220, 10, 178, 130, 173, 16, 203, 105, 133, 90, + 97, 86, 184, 159, 176, 34, 172, 72, 171, 164, 85, 202, 42, 109, 149, 177, 162, 172, 104, 81, + 66, 68, 88, 101, 173, 114, 86, 121, 43, 198, 170, 96, 85, 180, 42, 89, 149, 173, 42, 86, 85, + 171, 154, 85, 221, 170, 97, 213, 20, 145, 162, 164, 85, 203, 170, 109, 213, 177, 234, 90, + 245, 172, 88, 171, 190, 213, 192, 138, 179, 26, 90, 241, 86, 35, 199, 111, 142, 27, 86, 99, + 171, 137, 159, 244, 83, 126, 218, 207, 242, 243, 241, 115, 88, 77, 173, 102, 86, 115, 171, + 133, 213, 210, 106, 101, 181, 182, 218, 88, 109, 173, 118, 86, 123, 171, 131, 213, 209, 234, + 100, 117, 182, 186, 248, 249, 250, 249, 249, 229, 241, 243, 183, 186, 90, 221, 172, 167, + 172, 238, 214, 211, 86, 15, 171, 167, 149, 96, 37, 90, 189, 172, 222, 86, 146, 149, 108, + 245, 177, 250, 90, 253, 172, 20, 199, 239, 86, 127, 107, 128, 53, 208, 26, 100, 13, 182, 82, + 173, 33, 214, 51, 214, 80, 107, 152, 149, 102, 13, 183, 70, 208, 169, 116, 26, 157, 78, 103, + 208, 153, 116, 22, 125, 141, 206, 166, 115, 232, 92, 199, 77, 58, 143, 206, 167, 11, 232, + 66, 250, 58, 93, 68, 23, 211, 37, 244, 13, 107, 164, 227, 150, 227, 182, 227, 142, 227, 15, + 122, 197, 177, 194, 177, 220, 177, 210, 177, 202, 241, 142, 99, 181, 99, 141, 227, 93, 81, + 201, 113, 151, 94, 163, 215, 217, 75, 108, 28, 27, 207, 38, 178, 87, 217, 84, 54, 157, 189, + 198, 230, 176, 5, 108, 49, 250, 254, 203, 217, 59, 108, 13, 91, 203, 222, 99, 235, 217, 102, + 182, 141, 125, 196, 62, 101, 59, 217, 46, 182, 151, 254, 202, 14, 178, 195, 236, 24, 251, + 129, 157, 101, 23, 216, 47, 236, 42, 187, 206, 126, 163, 191, 209, 27, 244, 119, 122, 147, + 222, 162, 183, 233, 29, 250, 135, 168, 46, 106, 136, 154, 142, 181, 142, 117, 142, 247, 28, + 247, 28, 247, 29, 15, 28, 15, 29, 153, 14, 23, 189, 75, 239, 209, 251, 244, 1, 125, 72, 51, + 169, 139, 1, 35, 140, 50, 198, 56, 189, 194, 132, 40, 37, 162, 69, 45, 81, 91, 212, 21, 177, + 88, 186, 129, 104, 40, 26, 137, 38, 162, 153, 104, 37, 218, 137, 78, 162, 27, 11, 17, 61, + 68, 47, 209, 71, 244, 23, 131, 197, 80, 49, 130, 149, 20, 163, 209, 39, 26, 43, 94, 22, 175, + 136, 9, 98, 146, 72, 23, 83, 196, 52, 244, 143, 102, 137, 217, 98, 174, 152, 143, 59, 170, + 69, 44, 74, 44, 17, 75, 197, 219, 98, 149, 120, 87, 100, 136, 77, 98, 139, 216, 46, 62, 16, + 159, 136, 207, 113, 71, 179, 71, 236, 23, 7, 89, 89, 113, 72, 28, 21, 39, 196, 105, 113, + 142, 85, 16, 23, 197, 101, 113, 93, 252, 46, 238, 136, 251, 194, 133, 251, 29, 133, 222, + 187, 191, 204, 43, 243, 203, 194, 236, 178, 44, 42, 131, 112, 247, 227, 68, 95, 62, 76, 150, + 144, 145, 178, 148, 44, 35, 163, 101, 57, 25, 195, 170, 200, 138, 232, 143, 85, 199, 157, + 81, 93, 244, 243, 27, 200, 134, 76, 203, 120, 217, 72, 54, 150, 77, 100, 83, 217, 76, 54, + 151, 45, 100, 75, 217, 74, 182, 150, 109, 100, 91, 217, 78, 182, 151, 29, 100, 71, 217, 73, + 118, 150, 93, 100, 87, 217, 13, 83, 158, 114, 172, 119, 108, 244, 202, 135, 249, 48, 7, 243, + 117, 203, 71, 118, 151, 9, 50, 73, 246, 147, 41, 142, 247, 125, 137, 175, 240, 181, 124, + 253, 124, 243, 250, 22, 244, 45, 234, 27, 228, 27, 234, 27, 225, 91, 210, 183, 180, 111, + 148, 111, 121, 223, 74, 190, 213, 124, 107, 249, 214, 243, 141, 243, 109, 236, 219, 220, + 183, 181, 111, 123, 223, 206, 190, 79, 249, 246, 244, 237, 237, 219, 215, 55, 197, 119, 128, + 227, 7, 191, 194, 126, 69, 200, 15, 228, 20, 57, 77, 206, 144, 179, 228, 71, 203, 229, 3, + 62, 196, 135, 250, 48, 31, 238, 35, 124, 164, 143, 242, 209, 62, 150, 143, 143, 143, 195, + 199, 215, 199, 207, 39, 143, 143, 191, 79, 128, 79, 94, 159, 124, 62, 249, 125, 10, 144, + 115, 228, 60, 191, 205, 239, 240, 63, 248, 93, 126, 143, 223, 119, 236, 115, 236, 119, 28, + 112, 28, 116, 124, 235, 56, 228, 248, 206, 113, 216, 113, 196, 113, 212, 241, 189, 227, 24, + 253, 153, 254, 66, 47, 209, 203, 142, 157, 176, 30, 54, 208, 116, 185, 147, 84, 134, 205, + 176, 5, 62, 39, 23, 96, 35, 108, 130, 47, 28, 95, 194, 203, 240, 41, 76, 100, 173, 112, 191, + 217, 14, 119, 79, 109, 29, 71, 97, 39, 153, 74, 166, 57, 190, 98, 29, 89, 39, 214, 153, 117, + 97, 237, 89, 7, 159, 76, 31, 151, 3, 224, 22, 185, 232, 32, 14, 74, 170, 57, 152, 131, 211, + 29, 252, 69, 248, 208, 129, 75, 174, 67, 57, 2, 28, 121, 125, 247, 250, 238, 243, 221, 239, + 123, 0, 22, 192, 85, 248, 12, 150, 195, 44, 82, 15, 166, 147, 250, 100, 4, 153, 73, 102, + 145, 215, 200, 72, 216, 74, 158, 119, 88, 50, 77, 14, 151, 35, 233, 151, 142, 109, 142, 237, + 142, 15, 28, 31, 58, 62, 114, 124, 236, 248, 196, 177, 195, 241, 41, 253, 138, 126, 77, 119, + 209, 221, 116, 15, 253, 134, 238, 165, 251, 232, 126, 122, 128, 30, 164, 223, 210, 67, 244, + 20, 61, 77, 207, 208, 179, 244, 71, 122, 142, 158, 167, 23, 232, 79, 244, 34, 106, 103, 29, + 212, 198, 246, 162, 131, 232, 200, 66, 152, 147, 133, 178, 48, 212, 201, 222, 34, 73, 36, + 163, 158, 182, 22, 109, 68, 91, 212, 210, 158, 34, 65, 36, 162, 230, 54, 23, 45, 68, 75, + 212, 181, 47, 196, 78, 241, 37, 234, 219, 55, 98, 175, 216, 135, 186, 59, 76, 164, 137, 225, + 168, 197, 169, 98, 136, 120, 134, 149, 100, 165, 88, 105, 86, 6, 181, 249, 57, 241, 188, + 120, 1, 53, 249, 85, 212, 231, 137, 168, 207, 147, 81, 191, 199, 176, 40, 22, 141, 90, 61, + 147, 149, 101, 229, 88, 121, 22, 195, 42, 176, 138, 172, 18, 171, 140, 90, 122, 83, 220, 18, + 183, 81, 99, 175, 136, 171, 226, 26, 234, 105, 0, 106, 106, 62, 211, 38, 234, 105, 176, 236, + 143, 186, 58, 64, 14, 100, 151, 217, 37, 196, 21, 212, 203, 250, 168, 153, 113, 168, 233, + 103, 196, 89, 241, 35, 106, 111, 105, 212, 225, 146, 168, 195, 81, 162, 145, 140, 145, 21, + 80, 167, 35, 80, 159, 203, 162, 22, 215, 146, 181, 101, 29, 86, 133, 85, 101, 191, 179, 155, + 184, 23, 145, 224, 62, 70, 192, 31, 92, 214, 0, 104, 14, 223, 27, 19, 25, 23, 82, 105, 203, + 199, 225, 235, 151, 199, 63, 32, 111, 190, 252, 5, 10, 22, 42, 92, 164, 104, 177, 192, 226, + 65, 193, 33, 206, 208, 176, 240, 18, 17, 145, 37, 75, 149, 46, 19, 21, 93, 182, 92, 249, + 152, 10, 21, 43, 85, 174, 82, 181, 90, 245, 26, 53, 107, 213, 174, 83, 183, 94, 108, 253, 6, + 113, 13, 227, 27, 53, 110, 210, 180, 89, 243, 22, 45, 91, 181, 110, 211, 182, 93, 251, 14, + 29, 59, 117, 238, 210, 181, 219, 83, 221, 159, 238, 209, 51, 33, 17, 122, 245, 78, 74, 238, + 211, 183, 95, 74, 255, 1, 3, 7, 13, 78, 29, 242, 204, 208, 97, 105, 195, 71, 140, 124, 118, + 212, 232, 231, 158, 127, 225, 197, 49, 99, 95, 122, 121, 220, 43, 227, 39, 76, 156, 244, + 106, 250, 228, 41, 83, 167, 77, 159, 49, 115, 214, 107, 179, 231, 204, 157, 55, 127, 193, + 66, 88, 180, 120, 201, 27, 75, 151, 189, 249, 214, 219, 203, 87, 172, 92, 245, 206, 234, 53, + 236, 221, 181, 235, 222, 203, 88, 191, 97, 227, 166, 205, 91, 222, 223, 186, 109, 251, 7, + 31, 126, 244, 241, 39, 59, 62, 133, 207, 191, 216, 249, 229, 87, 95, 239, 218, 189, 231, + 155, 189, 251, 246, 31, 128, 131, 223, 30, 250, 238, 240, 145, 163, 112, 236, 248, 137, 147, + 63, 156, 58, 157, 123, 110, 146, 123, 110, 146, 123, 110, 146, 123, 110, 242, 216, 153, 68, + 238, 185, 73, 238, 185, 73, 238, 185, 73, 238, 185, 73, 238, 185, 73, 238, 185, 73, 238, + 185, 73, 238, 185, 73, 238, 185, 73, 238, 185, 73, 238, 185, 73, 238, 185, 137, 125, 110, + 34, 166, 225, 190, 163, 5, 132, 32, 138, 179, 217, 16, 8, 224, 58, 139, 56, 143, 248, 57, + 179, 153, 235, 129, 24, 0, 225, 153, 253, 93, 103, 88, 126, 244, 194, 215, 122, 0, 16, 129, + 126, 248, 27, 80, 2, 126, 37, 21, 240, 217, 236, 128, 102, 176, 2, 234, 67, 27, 152, 13, + 141, 209, 139, 126, 15, 242, 192, 40, 178, 7, 56, 132, 67, 67, 88, 5, 17, 36, 4, 40, 52, + 130, 194, 232, 253, 46, 64, 47, 162, 59, 250, 206, 23, 208, 35, 45, 5, 205, 225, 20, 250, + 166, 37, 32, 30, 253, 233, 66, 80, 195, 245, 11, 126, 55, 135, 73, 174, 109, 152, 203, 7, + 226, 208, 27, 223, 78, 6, 146, 246, 80, 30, 249, 38, 52, 154, 68, 97, 203, 211, 93, 59, 160, + 48, 148, 114, 237, 117, 125, 143, 161, 197, 232, 95, 150, 112, 173, 135, 38, 200, 253, 4, + 121, 161, 36, 122, 222, 51, 33, 31, 122, 236, 187, 93, 15, 176, 167, 37, 208, 231, 95, 73, + 158, 39, 191, 64, 40, 36, 192, 100, 94, 153, 167, 187, 6, 64, 45, 212, 219, 195, 164, 57, + 114, 45, 97, 148, 248, 222, 218, 140, 158, 253, 76, 120, 11, 253, 224, 29, 174, 211, 174, + 139, 240, 49, 39, 184, 67, 24, 131, 218, 60, 9, 123, 188, 1, 118, 208, 114, 44, 78, 44, 5, + 39, 68, 66, 29, 104, 5, 137, 152, 250, 28, 28, 67, 143, 186, 2, 139, 117, 149, 116, 53, 112, + 45, 192, 216, 149, 112, 131, 70, 209, 47, 153, 194, 126, 68, 65, 83, 232, 137, 251, 145, + 101, 40, 141, 35, 232, 5, 223, 66, 127, 190, 10, 122, 248, 107, 240, 115, 144, 92, 19, 223, + 99, 223, 154, 227, 254, 97, 52, 238, 18, 22, 163, 244, 86, 226, 30, 101, 27, 122, 2, 21, + 208, 79, 40, 140, 210, 42, 12, 165, 161, 35, 166, 77, 71, 205, 223, 128, 179, 235, 0, 105, + 78, 186, 26, 111, 157, 45, 23, 49, 153, 245, 92, 5, 92, 5, 93, 23, 93, 46, 40, 3, 93, 176, + 135, 111, 224, 172, 59, 15, 55, 73, 12, 230, 193, 22, 88, 24, 75, 227, 193, 60, 77, 84, 124, + 248, 18, 142, 48, 9, 22, 225, 206, 230, 32, 246, 227, 20, 202, 253, 22, 252, 65, 202, 224, + 231, 172, 241, 19, 92, 157, 93, 171, 92, 23, 176, 47, 26, 66, 160, 58, 180, 133, 110, 184, + 187, 49, 59, 154, 55, 241, 169, 126, 6, 95, 192, 111, 228, 62, 122, 55, 47, 210, 253, 124, + 39, 106, 241, 175, 174, 89, 40, 219, 72, 104, 128, 125, 111, 141, 185, 219, 99, 221, 147, + 241, 41, 109, 128, 173, 248, 57, 130, 163, 204, 139, 187, 132, 10, 164, 58, 105, 69, 218, + 145, 190, 100, 58, 238, 124, 182, 162, 15, 124, 12, 253, 164, 80, 250, 12, 189, 196, 50, + 216, 30, 118, 146, 87, 21, 194, 85, 19, 107, 42, 4, 193, 216, 110, 56, 116, 198, 157, 214, + 64, 220, 49, 77, 130, 89, 56, 222, 85, 176, 19, 118, 225, 46, 37, 146, 148, 197, 17, 29, + 193, 242, 183, 105, 45, 218, 16, 63, 111, 225, 28, 62, 133, 171, 218, 116, 254, 64, 76, 200, + 60, 147, 121, 57, 243, 190, 43, 29, 20, 106, 89, 99, 148, 195, 112, 220, 241, 157, 135, 235, + 184, 187, 113, 226, 222, 163, 63, 25, 70, 206, 97, 207, 103, 208, 77, 44, 15, 11, 96, 225, + 168, 243, 245, 89, 7, 214, 149, 77, 98, 179, 217, 215, 108, 31, 31, 202, 215, 240, 227, 162, + 41, 206, 231, 53, 42, 49, 115, 112, 230, 65, 87, 115, 151, 217, 229, 18, 144, 216, 175, 146, + 16, 13, 149, 161, 26, 234, 79, 31, 212, 166, 1, 216, 191, 33, 246, 174, 239, 121, 220, 213, + 165, 227, 14, 116, 38, 246, 117, 41, 172, 193, 113, 127, 130, 59, 201, 195, 240, 3, 238, + 244, 110, 18, 192, 61, 82, 12, 73, 193, 214, 7, 161, 214, 141, 39, 211, 240, 179, 0, 247, + 107, 159, 226, 94, 106, 23, 90, 230, 219, 230, 67, 195, 240, 83, 10, 253, 182, 122, 52, 142, + 54, 162, 125, 233, 120, 252, 204, 70, 235, 116, 132, 254, 204, 138, 179, 222, 108, 12, 27, + 139, 159, 37, 108, 11, 59, 198, 129, 115, 220, 159, 84, 196, 79, 19, 180, 26, 43, 229, 30, + 244, 242, 155, 168, 94, 250, 155, 7, 87, 31, 150, 121, 216, 245, 225, 169, 76, 200, 44, 150, + 249, 84, 230, 220, 204, 79, 51, 47, 186, 58, 185, 70, 97, 255, 35, 160, 44, 148, 195, 158, + 78, 196, 94, 46, 64, 29, 92, 142, 159, 213, 168, 137, 91, 112, 23, 252, 141, 241, 223, 177, + 175, 55, 112, 71, 42, 204, 206, 15, 119, 112, 101, 208, 175, 173, 64, 234, 145, 198, 164, + 41, 126, 90, 146, 182, 248, 233, 136, 159, 206, 164, 27, 126, 18, 73, 47, 210, 15, 63, 99, + 200, 88, 242, 50, 25, 71, 94, 65, 139, 62, 199, 254, 152, 125, 236, 114, 220, 147, 110, 177, + 119, 157, 219, 241, 115, 24, 87, 160, 159, 200, 37, 114, 3, 189, 100, 64, 31, 185, 48, 250, + 180, 37, 209, 95, 173, 129, 35, 141, 163, 141, 105, 107, 218, 14, 63, 125, 105, 42, 126, + 134, 208, 161, 116, 4, 62, 161, 149, 116, 35, 221, 70, 143, 176, 252, 44, 2, 45, 97, 34, + 123, 6, 61, 149, 117, 236, 51, 246, 29, 187, 203, 41, 143, 230, 229, 121, 109, 222, 137, + 247, 229, 227, 248, 126, 126, 144, 127, 207, 239, 139, 16, 17, 47, 250, 225, 250, 255, 153, + 12, 196, 181, 185, 35, 218, 195, 249, 184, 35, 252, 89, 62, 80, 82, 181, 81, 189, 212, 243, + 234, 59, 229, 210, 17, 104, 173, 190, 194, 113, 111, 126, 236, 44, 161, 188, 220, 79, 134, + 137, 2, 252, 89, 122, 26, 231, 69, 17, 54, 68, 76, 36, 29, 81, 98, 146, 118, 96, 3, 217, 52, + 246, 173, 232, 67, 126, 101, 78, 220, 183, 165, 179, 20, 54, 192, 245, 22, 107, 68, 255, 96, + 169, 164, 19, 253, 132, 132, 161, 167, 82, 147, 245, 129, 41, 184, 95, 95, 131, 235, 199, + 77, 122, 145, 23, 36, 29, 232, 47, 164, 20, 159, 73, 222, 167, 169, 44, 142, 74, 211, 136, + 56, 196, 11, 242, 113, 226, 103, 0, 122, 20, 106, 210, 23, 200, 14, 186, 19, 253, 177, 113, + 174, 143, 160, 166, 88, 66, 78, 139, 37, 244, 32, 56, 249, 25, 154, 31, 78, 227, 172, 158, + 72, 231, 97, 161, 125, 52, 133, 78, 134, 46, 188, 178, 184, 15, 41, 40, 247, 119, 196, 179, + 40, 239, 186, 116, 18, 41, 195, 190, 227, 75, 224, 2, 11, 167, 191, 227, 14, 101, 46, 90, + 141, 189, 164, 25, 47, 65, 123, 208, 26, 100, 13, 90, 220, 135, 36, 24, 174, 146, 103, 96, + 8, 153, 3, 177, 184, 199, 255, 129, 108, 5, 66, 86, 177, 149, 164, 5, 245, 197, 167, 149, + 65, 253, 72, 53, 2, 176, 151, 133, 146, 239, 152, 15, 116, 53, 125, 36, 145, 180, 32, 105, + 67, 127, 165, 29, 217, 135, 242, 0, 171, 66, 8, 90, 137, 111, 97, 52, 97, 36, 6, 117, 199, + 251, 147, 9, 131, 113, 6, 204, 166, 37, 209, 166, 197, 163, 53, 57, 68, 42, 66, 17, 152, + 135, 246, 254, 102, 230, 135, 198, 98, 139, 239, 197, 100, 212, 179, 101, 44, 26, 218, 65, + 12, 60, 77, 247, 64, 77, 156, 27, 23, 240, 211, 5, 38, 64, 69, 216, 142, 58, 56, 9, 98, 232, + 124, 120, 222, 53, 150, 36, 161, 221, 111, 137, 246, 147, 226, 250, 221, 31, 202, 19, 7, 90, + 203, 194, 216, 183, 49, 184, 94, 20, 162, 97, 104, 11, 123, 98, 171, 127, 160, 253, 223, + 141, 86, 191, 57, 185, 6, 35, 137, 19, 103, 214, 14, 40, 197, 77, 202, 20, 30, 143, 150, 41, + 1, 237, 239, 100, 252, 36, 193, 211, 24, 90, 4, 179, 228, 102, 113, 8, 90, 147, 194, 0, 220, + 153, 185, 4, 181, 252, 36, 244, 192, 53, 231, 28, 182, 95, 12, 106, 99, 255, 186, 193, 50, + 30, 141, 189, 118, 162, 101, 126, 6, 75, 44, 202, 108, 2, 177, 248, 153, 0, 123, 8, 133, 23, + 176, 207, 117, 113, 158, 183, 225, 77, 208, 242, 206, 117, 245, 199, 17, 166, 224, 26, 213, + 2, 215, 196, 93, 144, 226, 154, 7, 113, 248, 236, 218, 185, 198, 185, 38, 67, 79, 215, 50, + 87, 119, 232, 11, 237, 93, 171, 208, 254, 142, 112, 109, 128, 170, 48, 81, 116, 165, 157, + 68, 20, 175, 140, 54, 118, 23, 249, 2, 215, 163, 19, 100, 50, 218, 237, 38, 112, 28, 237, + 81, 4, 41, 2, 151, 240, 179, 14, 251, 95, 87, 124, 0, 233, 252, 40, 218, 206, 122, 174, 41, + 174, 195, 80, 16, 229, 17, 134, 18, 234, 133, 171, 232, 121, 24, 4, 215, 80, 110, 77, 216, + 14, 168, 148, 217, 138, 174, 119, 53, 98, 67, 112, 133, 58, 13, 109, 93, 43, 93, 33, 196, 7, + 250, 185, 6, 162, 229, 253, 16, 150, 43, 129, 182, 103, 44, 4, 139, 229, 168, 187, 147, 121, + 31, 26, 131, 253, 45, 13, 184, 215, 196, 216, 238, 226, 141, 216, 6, 29, 59, 196, 214, 171, + 91, 167, 118, 173, 154, 53, 170, 87, 171, 90, 165, 114, 165, 138, 21, 98, 202, 151, 43, 27, + 29, 85, 166, 116, 169, 146, 145, 17, 37, 194, 195, 66, 157, 33, 193, 65, 197, 3, 139, 21, + 45, 82, 184, 80, 129, 252, 249, 242, 6, 248, 231, 241, 243, 117, 248, 88, 90, 73, 193, 25, + 37, 16, 29, 31, 222, 40, 193, 153, 17, 153, 144, 193, 35, 195, 155, 52, 41, 107, 194, 225, + 137, 24, 145, 152, 45, 34, 33, 195, 137, 81, 141, 30, 207, 147, 225, 76, 176, 179, 57, 31, + 207, 25, 139, 57, 251, 228, 200, 25, 235, 206, 25, 155, 149, 147, 4, 56, 107, 67, 237, 178, + 209, 206, 248, 112, 103, 198, 222, 134, 225, 206, 173, 164, 91, 219, 46, 200, 79, 109, 24, + 222, 213, 153, 113, 213, 230, 91, 218, 252, 12, 155, 247, 67, 62, 52, 20, 11, 56, 227, 139, + 244, 107, 232, 204, 32, 9, 206, 248, 140, 70, 35, 250, 165, 199, 39, 52, 196, 234, 214, 59, + 124, 226, 194, 227, 146, 125, 202, 70, 195, 122, 31, 7, 178, 14, 228, 50, 10, 135, 15, 89, + 79, 10, 215, 37, 54, 67, 11, 199, 215, 92, 79, 65, 251, 97, 167, 50, 138, 133, 55, 140, 207, + 40, 26, 222, 208, 244, 32, 131, 69, 196, 39, 38, 101, 180, 105, 219, 37, 190, 97, 96, 104, + 104, 215, 178, 209, 25, 36, 174, 119, 120, 175, 12, 8, 111, 144, 225, 31, 101, 103, 129, 56, + 187, 153, 12, 25, 151, 161, 236, 102, 156, 41, 102, 52, 48, 217, 185, 62, 122, 71, 250, 148, + 173, 1, 208, 43, 33, 202, 55, 41, 60, 41, 177, 123, 151, 12, 150, 216, 213, 180, 145, 55, + 10, 219, 109, 152, 81, 120, 244, 249, 34, 143, 130, 88, 121, 190, 184, 46, 19, 179, 167, 6, + 178, 244, 248, 34, 41, 78, 19, 76, 79, 159, 232, 204, 88, 218, 182, 75, 246, 212, 80, 243, + 221, 181, 43, 214, 145, 65, 35, 26, 37, 164, 55, 194, 134, 167, 160, 8, 155, 183, 119, 98, + 91, 116, 124, 215, 46, 25, 100, 60, 54, 232, 52, 227, 48, 99, 114, 143, 46, 57, 60, 222, + 196, 36, 244, 119, 102, 88, 225, 13, 194, 251, 165, 247, 79, 192, 7, 83, 44, 61, 3, 218, + 141, 10, 221, 80, 172, 88, 236, 54, 215, 25, 40, 22, 239, 76, 239, 208, 37, 60, 52, 163, 94, + 96, 120, 215, 196, 134, 197, 215, 23, 128, 244, 118, 163, 54, 22, 141, 117, 22, 125, 60, + 165, 108, 244, 250, 128, 188, 110, 177, 174, 207, 227, 239, 97, 124, 253, 178, 51, 201, 89, + 105, 54, 103, 103, 55, 92, 243, 118, 89, 114, 37, 166, 71, 225, 77, 81, 29, 50, 156, 189, + 157, 216, 147, 46, 225, 56, 166, 234, 230, 43, 185, 58, 164, 247, 174, 142, 217, 240, 167, + 43, 193, 82, 25, 73, 248, 60, 82, 50, 172, 184, 132, 244, 128, 154, 24, 31, 96, 202, 103, + 136, 136, 128, 112, 103, 250, 45, 192, 231, 31, 126, 245, 202, 227, 49, 137, 158, 24, 25, + 17, 112, 11, 12, 107, 180, 36, 75, 209, 48, 221, 203, 103, 68, 69, 101, 148, 41, 99, 20, 68, + 197, 225, 19, 197, 62, 214, 181, 195, 85, 202, 70, 143, 216, 74, 51, 194, 135, 4, 56, 145, + 160, 248, 160, 13, 202, 54, 177, 107, 205, 242, 40, 252, 208, 80, 243, 120, 39, 111, 141, + 133, 94, 24, 200, 24, 219, 182, 139, 59, 236, 132, 94, 129, 27, 32, 182, 124, 84, 215, 12, + 154, 96, 82, 118, 120, 83, 10, 118, 52, 41, 99, 189, 41, 89, 197, 19, 194, 81, 143, 55, 217, + 23, 153, 5, 51, 116, 100, 214, 63, 255, 128, 66, 249, 227, 251, 213, 204, 32, 133, 254, 38, + 57, 217, 157, 222, 188, 125, 120, 243, 182, 221, 186, 56, 227, 211, 19, 60, 178, 109, 222, + 225, 177, 144, 59, 189, 122, 86, 154, 135, 35, 238, 4, 20, 120, 6, 143, 64, 73, 53, 13, 71, + 213, 107, 215, 173, 139, 137, 192, 127, 34, 162, 81, 120, 124, 74, 66, 19, 156, 106, 216, + 199, 140, 252, 113, 93, 88, 32, 237, 234, 230, 104, 32, 179, 171, 66, 253, 237, 158, 85, + 179, 9, 116, 241, 53, 117, 241, 8, 105, 235, 127, 210, 86, 165, 81, 129, 237, 24, 226, 108, + 148, 17, 144, 208, 196, 253, 221, 213, 39, 52, 244, 63, 44, 180, 213, 245, 171, 41, 101, + 147, 71, 197, 60, 99, 202, 168, 25, 245, 120, 184, 214, 99, 225, 199, 186, 231, 155, 206, + 176, 195, 60, 146, 54, 239, 208, 45, 61, 221, 231, 177, 180, 70, 104, 172, 210, 211, 27, + 133, 59, 27, 165, 39, 164, 39, 110, 117, 141, 237, 21, 238, 12, 8, 79, 223, 134, 219, 215, + 46, 233, 67, 226, 19, 188, 143, 127, 171, 107, 251, 228, 192, 140, 70, 83, 186, 226, 32, + 250, 145, 154, 168, 218, 20, 26, 172, 15, 39, 147, 218, 174, 143, 37, 147, 218, 119, 235, + 178, 45, 0, 192, 57, 169, 67, 151, 13, 148, 208, 184, 132, 6, 93, 215, 151, 192, 180, 46, + 219, 156, 0, 177, 118, 44, 53, 177, 38, 210, 4, 156, 38, 128, 43, 30, 206, 138, 13, 84, 219, + 249, 3, 183, 197, 2, 140, 181, 83, 185, 29, 97, 135, 123, 111, 37, 96, 199, 105, 111, 28, + 129, 222, 91, 169, 59, 46, 192, 27, 71, 49, 142, 187, 227, 98, 237, 56, 243, 99, 44, 69, 92, + 135, 46, 217, 117, 192, 158, 88, 93, 203, 2, 37, 197, 209, 113, 41, 46, 204, 117, 139, 130, + 150, 235, 41, 249, 128, 126, 140, 174, 176, 162, 159, 108, 0, 193, 183, 210, 143, 55, 49, + 240, 81, 134, 217, 76, 160, 168, 150, 226, 19, 76, 167, 192, 72, 105, 176, 200, 0, 210, 3, + 138, 68, 5, 220, 174, 253, 176, 118, 171, 128, 155, 181, 91, 62, 172, 13, 245, 144, 15, 120, + 128, 95, 21, 98, 66, 243, 134, 230, 141, 192, 47, 82, 156, 195, 3, 39, 219, 241, 32, 214, + 92, 132, 56, 249, 14, 236, 249, 76, 218, 6, 157, 176, 105, 232, 60, 92, 138, 157, 90, 176, + 195, 120, 255, 167, 170, 110, 203, 243, 73, 177, 141, 141, 222, 111, 183, 191, 216, 231, + 141, 78, 21, 251, 174, 145, 174, 38, 106, 229, 169, 238, 95, 179, 88, 173, 200, 42, 213, + 170, 54, 170, 212, 78, 23, 8, 10, 8, 11, 168, 93, 160, 126, 129, 6, 5, 226, 162, 3, 163, + 227, 235, 4, 214, 137, 111, 21, 216, 42, 190, 103, 96, 207, 248, 81, 69, 134, 21, 31, 22, + 55, 170, 201, 164, 34, 19, 138, 143, 143, 123, 181, 201, 252, 34, 115, 139, 207, 137, 155, + 223, 100, 117, 145, 21, 197, 151, 199, 173, 105, 186, 59, 114, 119, 53, 103, 219, 166, 113, + 53, 120, 197, 22, 149, 27, 85, 229, 197, 162, 74, 150, 8, 42, 28, 192, 67, 124, 252, 160, + 100, 213, 138, 220, 39, 138, 135, 212, 43, 247, 124, 88, 237, 173, 228, 253, 216, 240, 124, + 149, 91, 63, 175, 0, 230, 251, 29, 46, 88, 57, 228, 112, 201, 249, 85, 15, 215, 171, 231, + 108, 17, 211, 98, 127, 139, 3, 45, 120, 139, 241, 237, 251, 143, 54, 195, 126, 186, 118, + 192, 195, 135, 15, 111, 62, 188, 10, 245, 110, 222, 124, 88, 251, 60, 201, 155, 175, 112, + 141, 188, 249, 106, 212, 240, 80, 47, 91, 1, 29, 36, 242, 204, 211, 81, 36, 178, 100, 100, + 149, 202, 85, 43, 85, 44, 84, 176, 128, 84, 85, 171, 85, 245, 178, 82, 21, 42, 92, 200, 112, + 225, 97, 152, 165, 36, 6, 108, 222, 206, 93, 181, 154, 73, 55, 41, 24, 168, 102, 62, 38, + 139, 167, 158, 66, 228, 26, 47, 18, 86, 161, 68, 72, 185, 42, 178, 90, 116, 195, 6, 97, 161, + 101, 27, 188, 210, 178, 82, 229, 230, 163, 154, 151, 13, 14, 110, 90, 183, 116, 29, 90, 176, + 68, 76, 96, 68, 112, 193, 114, 190, 162, 86, 116, 211, 136, 98, 197, 195, 98, 74, 151, 14, + 76, 168, 91, 171, 106, 243, 231, 130, 202, 150, 13, 14, 109, 54, 152, 23, 136, 111, 216, 43, + 2, 91, 170, 88, 118, 89, 195, 240, 138, 173, 35, 203, 134, 68, 212, 12, 202, 91, 40, 48, 79, + 161, 6, 37, 131, 163, 203, 52, 173, 16, 85, 35, 110, 68, 84, 169, 106, 65, 5, 203, 197, 76, + 172, 84, 177, 100, 76, 187, 66, 1, 229, 138, 23, 173, 150, 207, 183, 128, 95, 209, 64, 255, + 98, 5, 67, 203, 7, 150, 45, 51, 198, 237, 58, 26, 59, 37, 232, 244, 168, 173, 199, 95, 232, + 233, 95, 251, 150, 46, 170, 237, 232, 55, 207, 5, 125, 102, 232, 167, 173, 143, 214, 186, + 159, 246, 112, 74, 0, 232, 60, 96, 126, 121, 132, 216, 37, 204, 219, 11, 161, 153, 241, 208, + 57, 0, 238, 167, 221, 59, 29, 240, 232, 189, 14, 207, 143, 95, 101, 89, 195, 232, 170, 251, + 29, 15, 27, 184, 241, 99, 13, 97, 60, 7, 136, 64, 12, 148, 171, 161, 137, 172, 129, 83, 233, + 25, 104, 139, 105, 29, 16, 229, 48, 126, 38, 31, 7, 17, 152, 127, 48, 134, 219, 35, 157, 73, + 107, 0, 195, 248, 102, 136, 95, 17, 209, 136, 246, 8, 39, 162, 23, 162, 11, 162, 5, 226, + 121, 68, 91, 204, 155, 129, 152, 102, 234, 240, 130, 77, 133, 238, 170, 7, 36, 138, 175, 32, + 64, 116, 130, 48, 68, 51, 228, 195, 249, 57, 40, 195, 135, 65, 40, 242, 77, 76, 24, 219, + 171, 196, 130, 160, 12, 242, 97, 152, 86, 90, 5, 97, 222, 175, 92, 23, 76, 58, 230, 11, 179, + 243, 117, 194, 114, 195, 96, 44, 166, 215, 197, 176, 3, 145, 79, 77, 133, 64, 164, 254, 136, + 252, 24, 95, 12, 235, 89, 101, 250, 140, 180, 57, 251, 212, 140, 213, 117, 29, 249, 17, 216, + 143, 166, 200, 223, 71, 218, 8, 251, 218, 16, 105, 11, 140, 111, 141, 124, 29, 132, 31, 150, + 169, 77, 107, 184, 122, 35, 159, 23, 249, 58, 40, 155, 188, 200, 251, 34, 226, 177, 220, 93, + 83, 6, 243, 251, 97, 31, 147, 48, 189, 0, 134, 169, 201, 139, 237, 250, 33, 13, 52, 121, + 177, 206, 210, 236, 40, 9, 36, 11, 209, 213, 63, 10, 235, 121, 7, 40, 96, 143, 251, 43, 200, + 99, 198, 109, 198, 236, 29, 147, 233, 191, 233, 211, 95, 160, 145, 233, 95, 118, 184, 251, + 103, 195, 244, 149, 62, 234, 219, 159, 64, 115, 32, 153, 85, 178, 159, 213, 75, 158, 177, + 46, 162, 123, 97, 8, 91, 234, 186, 129, 124, 184, 44, 0, 241, 6, 234, 40, 4, 227, 248, 174, + 32, 106, 240, 36, 40, 170, 130, 92, 63, 99, 31, 155, 138, 77, 80, 5, 195, 26, 81, 196, 134, + 169, 115, 17, 76, 96, 55, 33, 22, 211, 162, 228, 92, 212, 155, 36, 168, 75, 43, 96, 66, 21, + 215, 61, 250, 28, 4, 201, 8, 104, 140, 227, 69, 121, 67, 73, 236, 123, 87, 163, 123, 168, + 11, 37, 48, 95, 123, 187, 124, 18, 4, 243, 11, 80, 12, 249, 88, 3, 212, 249, 159, 108, 25, + 185, 209, 4, 159, 125, 115, 164, 113, 40, 247, 107, 26, 92, 87, 177, 142, 56, 3, 172, 103, + 27, 226, 83, 44, 95, 24, 219, 47, 111, 100, 96, 158, 59, 233, 148, 185, 6, 243, 254, 130, + 105, 35, 17, 195, 80, 71, 138, 34, 10, 99, 250, 100, 91, 135, 177, 140, 41, 143, 237, 212, + 55, 109, 184, 159, 3, 4, 216, 58, 136, 48, 186, 135, 168, 232, 133, 231, 249, 120, 225, 240, + 194, 150, 255, 106, 27, 133, 16, 133, 17, 213, 16, 166, 221, 185, 136, 15, 16, 173, 16, 65, + 38, 15, 214, 91, 8, 243, 7, 99, 63, 94, 52, 58, 99, 116, 211, 232, 135, 209, 13, 91, 255, + 81, 159, 108, 157, 53, 207, 113, 24, 202, 198, 232, 152, 123, 206, 44, 167, 125, 96, 18, + 162, 0, 34, 26, 247, 202, 19, 60, 40, 131, 121, 237, 249, 98, 158, 163, 233, 179, 153, 11, + 166, 110, 163, 91, 70, 103, 188, 20, 211, 35, 61, 122, 127, 197, 140, 211, 232, 84, 54, 26, + 46, 162, 237, 182, 237, 57, 104, 116, 43, 27, 45, 109, 116, 223, 80, 22, 107, 143, 161, 52, + 221, 1, 85, 141, 206, 186, 101, 237, 165, 118, 31, 226, 205, 124, 52, 115, 194, 75, 189, + 253, 49, 243, 211, 158, 35, 72, 217, 0, 200, 111, 100, 103, 158, 187, 151, 122, 101, 145, + 69, 151, 66, 4, 166, 181, 16, 199, 160, 49, 175, 0, 157, 217, 78, 212, 255, 238, 200, 183, + 65, 90, 13, 229, 179, 196, 158, 131, 215, 249, 28, 56, 79, 199, 3, 85, 59, 32, 26, 159, 165, + 153, 187, 11, 114, 208, 249, 6, 234, 48, 233, 143, 245, 237, 64, 89, 70, 242, 189, 176, 192, + 166, 135, 105, 24, 63, 76, 132, 88, 227, 250, 69, 172, 161, 47, 186, 225, 229, 179, 211, + 156, 32, 59, 220, 105, 134, 26, 100, 79, 251, 183, 241, 255, 19, 208, 35, 98, 13, 244, 65, + 254, 146, 56, 236, 114, 241, 195, 48, 203, 172, 17, 234, 50, 137, 65, 56, 189, 20, 227, 55, + 32, 198, 34, 202, 232, 40, 50, 95, 15, 32, 91, 85, 71, 8, 64, 189, 185, 137, 72, 229, 177, + 80, 83, 196, 66, 53, 244, 39, 234, 241, 130, 246, 188, 139, 192, 248, 142, 88, 119, 121, 62, + 0, 106, 97, 57, 70, 118, 192, 171, 172, 35, 188, 41, 215, 64, 101, 118, 24, 159, 35, 182, + 69, 143, 192, 56, 3, 83, 63, 210, 33, 89, 122, 148, 83, 231, 254, 172, 75, 54, 245, 234, + 235, 19, 168, 153, 3, 126, 94, 106, 207, 169, 26, 174, 83, 246, 188, 170, 225, 58, 109, 207, + 201, 26, 174, 76, 55, 133, 218, 102, 109, 48, 246, 217, 94, 31, 192, 182, 205, 121, 189, + 250, 154, 165, 151, 139, 33, 146, 221, 202, 166, 159, 57, 244, 52, 155, 126, 214, 194, 114, + 1, 57, 245, 50, 39, 245, 172, 45, 126, 222, 121, 138, 101, 10, 153, 181, 198, 140, 223, 182, + 143, 157, 236, 249, 100, 219, 57, 76, 219, 224, 205, 159, 147, 102, 149, 95, 13, 91, 233, + 106, 215, 9, 219, 14, 239, 133, 110, 222, 121, 141, 168, 128, 136, 192, 244, 207, 61, 118, + 4, 237, 48, 62, 111, 179, 118, 76, 117, 117, 151, 35, 93, 221, 89, 51, 87, 119, 28, 231, 22, + 57, 17, 233, 13, 215, 70, 90, 210, 181, 62, 107, 77, 141, 128, 138, 30, 91, 86, 204, 187, + 150, 26, 57, 137, 189, 80, 60, 107, 29, 141, 128, 214, 30, 123, 22, 97, 214, 83, 190, 10, + 215, 112, 247, 58, 154, 223, 94, 63, 47, 66, 17, 113, 195, 182, 109, 21, 237, 254, 154, 121, + 104, 230, 96, 121, 180, 123, 37, 113, 29, 191, 237, 186, 199, 243, 193, 96, 246, 42, 58, + 191, 56, 47, 77, 60, 234, 72, 91, 147, 198, 53, 20, 100, 103, 209, 230, 54, 131, 52, 182, + 196, 117, 136, 205, 180, 109, 80, 60, 203, 132, 174, 44, 10, 231, 48, 150, 69, 153, 21, 17, + 20, 138, 139, 134, 208, 28, 203, 128, 93, 159, 201, 131, 212, 196, 153, 254, 75, 142, 250, + 105, 108, 65, 19, 12, 227, 179, 242, 218, 101, 243, 236, 229, 61, 240, 67, 148, 20, 215, + 208, 30, 117, 194, 60, 171, 237, 177, 70, 216, 118, 124, 62, 148, 48, 114, 176, 203, 14, + 199, 117, 5, 235, 82, 81, 144, 143, 83, 136, 242, 228, 137, 176, 203, 12, 66, 127, 193, 150, + 7, 218, 192, 108, 178, 240, 172, 205, 117, 77, 157, 178, 157, 173, 179, 254, 118, 153, 74, + 174, 123, 58, 31, 212, 48, 16, 43, 160, 42, 182, 31, 97, 183, 213, 4, 106, 234, 26, 16, 41, + 58, 185, 174, 217, 126, 69, 62, 104, 197, 190, 130, 24, 214, 4, 66, 144, 47, 102, 235, 253, + 68, 92, 163, 74, 227, 122, 217, 4, 215, 71, 4, 59, 135, 200, 68, 221, 12, 112, 135, 237, + 181, 218, 166, 174, 187, 246, 122, 63, 198, 94, 207, 125, 69, 121, 232, 108, 251, 19, 38, + 77, 66, 176, 44, 13, 229, 12, 120, 56, 166, 37, 64, 89, 182, 2, 235, 73, 69, 189, 186, 135, + 252, 58, 151, 203, 246, 15, 126, 128, 188, 166, 109, 140, 111, 228, 241, 79, 140, 159, 64, + 237, 249, 114, 16, 203, 237, 130, 178, 102, 142, 153, 62, 216, 235, 141, 233, 207, 66, 212, + 183, 253, 16, 98, 214, 68, 245, 38, 202, 208, 7, 252, 208, 141, 52, 126, 164, 241, 27, 43, + 34, 242, 153, 215, 132, 145, 78, 207, 134, 25, 158, 184, 226, 110, 74, 66, 233, 49, 232, + 100, 210, 104, 7, 56, 131, 83, 230, 61, 0, 215, 0, 227, 7, 178, 227, 208, 147, 189, 141, + 207, 239, 61, 8, 101, 221, 112, 253, 222, 137, 107, 99, 45, 92, 195, 155, 161, 172, 14, 64, + 23, 182, 15, 249, 48, 140, 95, 130, 24, 129, 190, 95, 26, 248, 115, 127, 72, 98, 63, 98, + 190, 138, 152, 54, 4, 203, 237, 197, 58, 222, 196, 116, 131, 9, 88, 230, 36, 210, 117, 80, + 135, 237, 134, 20, 182, 3, 253, 131, 31, 141, 143, 0, 161, 124, 56, 210, 167, 17, 13, 33, + 142, 188, 11, 3, 232, 93, 24, 32, 171, 226, 154, 92, 203, 181, 216, 174, 223, 32, 205, 245, + 148, 141, 55, 113, 221, 252, 209, 83, 214, 3, 187, 175, 94, 60, 169, 207, 163, 208, 183, + 123, 66, 127, 237, 190, 102, 239, 167, 233, 227, 19, 250, 103, 234, 48, 245, 218, 229, 48, + 15, 231, 224, 143, 114, 58, 137, 136, 112, 211, 204, 182, 116, 42, 172, 65, 44, 165, 199, + 49, 111, 75, 24, 69, 86, 185, 182, 163, 92, 27, 229, 64, 147, 236, 97, 94, 133, 60, 143, 40, + 199, 171, 192, 251, 136, 151, 144, 143, 70, 250, 49, 226, 61, 119, 24, 22, 34, 78, 32, 198, + 99, 221, 159, 34, 221, 40, 237, 187, 27, 2, 180, 1, 234, 51, 82, 140, 91, 130, 152, 143, + 216, 227, 77, 203, 14, 211, 206, 147, 226, 179, 67, 4, 186, 182, 63, 22, 222, 140, 107, 13, + 130, 220, 116, 109, 55, 200, 153, 159, 191, 4, 85, 177, 189, 170, 188, 142, 107, 187, 1, + 251, 5, 215, 16, 132, 28, 3, 5, 212, 8, 40, 192, 74, 98, 124, 48, 150, 203, 17, 22, 129, + 104, 231, 54, 67, 9, 6, 174, 59, 255, 212, 167, 191, 3, 254, 196, 100, 147, 99, 236, 127, + 50, 198, 255, 20, 102, 238, 154, 245, 249, 191, 85, 223, 127, 10, 124, 190, 99, 16, 79, 219, + 125, 184, 134, 246, 216, 214, 33, 200, 67, 142, 184, 78, 34, 237, 68, 142, 224, 186, 61, 28, + 109, 41, 2, 195, 101, 49, 156, 223, 43, 79, 239, 115, 194, 248, 215, 236, 248, 28, 207, 15, + 117, 5, 140, 204, 115, 198, 231, 12, 231, 124, 174, 255, 20, 166, 27, 161, 103, 118, 120, + 245, 32, 75, 31, 102, 65, 93, 3, 94, 15, 243, 35, 114, 134, 245, 46, 168, 107, 32, 119, 98, + 218, 206, 63, 135, 249, 202, 127, 64, 55, 244, 81, 22, 154, 62, 161, 14, 150, 252, 115, 88, + 182, 134, 146, 6, 180, 4, 246, 181, 152, 41, 131, 115, 14, 145, 21, 222, 143, 118, 21, 97, + 242, 218, 229, 253, 112, 189, 68, 152, 185, 107, 64, 55, 225, 90, 140, 200, 74, 175, 130, + 54, 31, 145, 77, 174, 85, 141, 92, 217, 66, 119, 186, 247, 249, 120, 159, 75, 206, 231, 131, + 253, 139, 229, 251, 16, 221, 208, 159, 221, 7, 49, 72, 219, 35, 173, 239, 165, 217, 231, + 108, 78, 157, 206, 25, 231, 181, 37, 79, 202, 147, 99, 110, 196, 252, 85, 157, 255, 63, 1, + 231, 206, 110, 196, 87, 136, 47, 255, 111, 183, 69, 0, 117, 21, 17, 128, 176, 125, 212, 90, + 184, 7, 175, 130, 62, 103, 39, 115, 84, 243, 240, 27, 128, 7, 5, 144, 230, 199, 117, 1, 103, + 222, 3, 92, 87, 31, 126, 135, 124, 47, 68, 20, 242, 239, 99, 220, 124, 164, 147, 144, 162, + 169, 121, 144, 137, 241, 46, 92, 71, 24, 210, 37, 188, 24, 250, 239, 0, 147, 16, 88, 71, + 230, 16, 119, 217, 135, 183, 17, 35, 221, 117, 60, 252, 0, 224, 254, 247, 30, 164, 185, 203, + 63, 152, 130, 192, 231, 251, 16, 61, 179, 7, 155, 16, 171, 16, 235, 16, 13, 177, 140, 183, + 158, 153, 24, 126, 6, 233, 231, 24, 110, 236, 174, 235, 1, 242, 15, 207, 34, 38, 34, 154, + 35, 230, 185, 233, 131, 116, 132, 73, 183, 176, 141, 163, 198, 31, 121, 194, 62, 244, 191, + 74, 255, 106, 255, 241, 159, 82, 239, 62, 195, 75, 255, 180, 135, 248, 55, 180, 214, 127, + 68, 31, 219, 107, 120, 159, 255, 63, 81, 239, 94, 226, 9, 212, 150, 131, 167, 255, 50, 91, + 127, 254, 118, 143, 227, 165, 168, 63, 86, 118, 160, 47, 29, 110, 124, 74, 227, 71, 27, 95, + 214, 248, 207, 198, 127, 204, 162, 102, 223, 214, 196, 166, 249, 61, 245, 120, 169, 191, 89, + 3, 141, 239, 108, 252, 87, 81, 201, 62, 111, 52, 123, 160, 168, 108, 251, 193, 120, 239, + 186, 145, 221, 182, 146, 155, 176, 4, 17, 128, 8, 244, 208, 1, 152, 231, 46, 238, 117, 246, + 161, 237, 241, 71, 155, 122, 11, 199, 247, 182, 1, 134, 243, 152, 117, 13, 41, 194, 181, 31, + 121, 127, 92, 235, 62, 49, 121, 144, 238, 197, 112, 16, 210, 91, 222, 53, 205, 107, 91, 255, + 100, 99, 255, 97, 77, 251, 111, 135, 255, 237, 26, 249, 63, 88, 83, 43, 122, 208, 51, 7, + 254, 42, 222, 139, 234, 30, 52, 53, 200, 185, 22, 255, 91, 252, 211, 218, 253, 63, 94, 203, + 255, 98, 141, 206, 190, 78, 255, 111, 195, 222, 117, 222, 11, 171, 46, 84, 52, 80, 177, 174, + 237, 6, 57, 253, 210, 63, 249, 1, 255, 16, 254, 39, 63, 247, 223, 134, 115, 250, 29, 255, + 58, 156, 195, 47, 241, 134, 115, 226, 79, 233, 57, 117, 207, 235, 207, 20, 195, 61, 176, 23, + 57, 230, 221, 191, 133, 217, 91, 240, 205, 143, 124, 127, 111, 31, 114, 206, 227, 172, 249, + 230, 9, 163, 140, 226, 179, 3, 237, 64, 41, 92, 179, 74, 35, 222, 68, 123, 129, 254, 191, + 43, 8, 129, 123, 92, 215, 44, 140, 123, 81, 63, 128, 138, 122, 173, 217, 247, 186, 54, 35, + 182, 96, 220, 85, 164, 73, 38, 13, 233, 27, 100, 42, 26, 183, 219, 174, 135, 24, 126, 25, + 195, 1, 124, 175, 157, 183, 139, 7, 73, 255, 164, 207, 57, 245, 214, 248, 231, 182, 127, + 136, 50, 179, 237, 224, 12, 211, 127, 40, 143, 168, 133, 200, 135, 88, 143, 24, 228, 125, + 214, 102, 239, 137, 109, 95, 164, 31, 2, 152, 125, 46, 239, 230, 186, 197, 247, 33, 114, + 248, 128, 255, 72, 171, 192, 51, 136, 181, 24, 246, 199, 176, 191, 185, 19, 145, 184, 194, + 155, 115, 13, 180, 203, 115, 61, 20, 236, 123, 26, 239, 25, 31, 218, 122, 57, 222, 206, 211, + 208, 190, 59, 217, 105, 159, 247, 149, 231, 20, 58, 242, 97, 174, 65, 158, 179, 148, 124, + 178, 52, 248, 81, 101, 159, 217, 133, 123, 207, 233, 112, 45, 42, 107, 206, 134, 228, 36, + 19, 231, 26, 237, 61, 63, 86, 125, 176, 254, 73, 184, 14, 84, 194, 122, 205, 217, 183, 57, + 3, 31, 6, 131, 89, 16, 174, 15, 171, 192, 73, 119, 0, 247, 156, 33, 131, 247, 44, 217, 156, + 79, 153, 245, 74, 214, 51, 101, 192, 55, 235, 252, 184, 13, 68, 33, 234, 121, 238, 77, 218, + 120, 238, 169, 202, 176, 41, 80, 153, 37, 152, 187, 26, 215, 93, 115, 238, 78, 235, 193, 50, + 146, 9, 62, 230, 62, 194, 7, 251, 104, 117, 128, 112, 53, 21, 26, 162, 19, 85, 90, 21, 199, + 122, 134, 66, 29, 125, 222, 117, 1, 125, 179, 11, 178, 134, 125, 159, 211, 194, 187, 174, + 154, 53, 209, 203, 103, 59, 251, 107, 98, 203, 234, 209, 153, 102, 152, 231, 78, 232, 49, + 159, 192, 244, 15, 203, 133, 154, 243, 152, 236, 237, 122, 203, 169, 5, 184, 150, 62, 231, + 62, 167, 203, 190, 150, 255, 149, 111, 67, 87, 187, 14, 97, 93, 203, 188, 103, 164, 127, + 117, 222, 153, 69, 115, 158, 191, 231, 60, 167, 127, 9, 154, 179, 210, 208, 33, 235, 76, + 214, 172, 217, 223, 121, 250, 238, 145, 113, 206, 190, 120, 219, 66, 157, 188, 242, 55, 190, + 80, 126, 207, 189, 24, 231, 229, 81, 119, 202, 187, 238, 24, 29, 243, 220, 231, 216, 247, + 112, 220, 125, 23, 87, 83, 112, 104, 97, 206, 27, 17, 177, 124, 19, 196, 178, 201, 16, 143, + 227, 140, 201, 202, 179, 212, 190, 219, 202, 139, 121, 205, 179, 247, 222, 185, 5, 26, 253, + 50, 103, 144, 72, 171, 34, 74, 153, 243, 96, 251, 14, 227, 13, 251, 14, 207, 242, 32, 47, + 234, 64, 140, 221, 151, 123, 238, 123, 51, 225, 131, 48, 231, 142, 131, 236, 118, 126, 127, + 4, 251, 156, 214, 207, 125, 191, 227, 250, 157, 93, 68, 155, 102, 96, 206, 213, 176, 63, 6, + 236, 5, 155, 158, 51, 178, 203, 186, 11, 76, 130, 38, 236, 179, 199, 238, 4, 125, 217, 111, + 192, 237, 59, 193, 59, 8, 124, 254, 136, 218, 136, 167, 61, 122, 250, 180, 103, 110, 53, + 177, 207, 14, 113, 188, 246, 24, 209, 167, 194, 103, 58, 6, 251, 123, 147, 13, 65, 123, 225, + 150, 143, 157, 87, 14, 128, 134, 242, 51, 196, 33, 148, 201, 120, 180, 255, 235, 160, 128, + 168, 0, 5, 100, 75, 104, 205, 39, 226, 152, 71, 35, 130, 48, 254, 24, 250, 177, 179, 32, 24, + 17, 73, 234, 186, 190, 37, 31, 65, 48, 66, 24, 208, 174, 16, 204, 6, 225, 220, 74, 0, 110, + 206, 251, 233, 21, 132, 231, 94, 205, 125, 62, 13, 119, 12, 200, 3, 44, 131, 224, 227, 160, + 164, 231, 94, 170, 189, 1, 93, 77, 66, 61, 247, 132, 35, 60, 124, 144, 155, 199, 184, 26, + 176, 197, 134, 167, 14, 196, 138, 108, 192, 124, 174, 235, 44, 15, 62, 175, 46, 216, 118, 7, + 172, 127, 35, 246, 177, 13, 242, 216, 14, 11, 64, 189, 200, 1, 44, 211, 203, 3, 227, 151, + 23, 54, 122, 195, 59, 163, 141, 122, 28, 113, 57, 129, 101, 13, 45, 159, 19, 24, 111, 104, + 68, 78, 120, 226, 139, 229, 4, 198, 27, 218, 32, 39, 48, 190, 193, 19, 250, 241, 87, 249, + 254, 170, 31, 127, 21, 31, 153, 19, 24, 31, 249, 95, 232, 199, 95, 213, 27, 158, 19, 24, 31, + 254, 55, 253, 107, 158, 19, 24, 223, 252, 95, 244, 227, 175, 228, 92, 34, 39, 48, 190, 196, + 223, 244, 163, 85, 78, 96, 124, 171, 156, 253, 64, 251, 244, 19, 226, 19, 220, 151, 94, 67, + 138, 123, 105, 215, 108, 119, 156, 203, 236, 109, 113, 117, 201, 188, 128, 60, 238, 47, 92, + 125, 60, 225, 51, 158, 124, 147, 30, 193, 252, 184, 158, 66, 60, 237, 46, 231, 234, 137, + 121, 112, 207, 235, 186, 130, 192, 189, 136, 171, 237, 35, 100, 126, 138, 72, 247, 188, 25, + 236, 105, 199, 53, 1, 145, 236, 241, 21, 246, 185, 203, 102, 126, 224, 110, 219, 238, 159, + 167, 77, 187, 172, 167, 175, 118, 127, 179, 133, 51, 11, 33, 54, 187, 219, 179, 219, 54, + 253, 223, 142, 52, 28, 177, 208, 147, 231, 125, 79, 187, 159, 185, 251, 157, 57, 31, 233, + 203, 238, 252, 38, 221, 140, 209, 46, 247, 217, 35, 152, 115, 3, 87, 59, 76, 15, 65, 138, + 229, 93, 123, 16, 237, 17, 10, 81, 16, 97, 206, 13, 238, 34, 246, 35, 95, 20, 233, 41, 196, + 119, 238, 63, 91, 224, 170, 226, 150, 75, 230, 49, 196, 201, 71, 118, 1, 142, 243, 124, 48, + 203, 190, 219, 193, 53, 64, 133, 216, 107, 100, 126, 94, 213, 182, 185, 128, 107, 157, 79, + 182, 181, 170, 25, 218, 252, 120, 243, 46, 8, 123, 13, 10, 243, 215, 209, 126, 45, 66, 187, + 118, 28, 124, 248, 96, 0, 137, 251, 80, 219, 126, 95, 197, 245, 34, 10, 243, 55, 67, 91, 49, + 21, 130, 112, 47, 220, 200, 64, 196, 98, 217, 21, 152, 127, 62, 214, 103, 238, 97, 246, 98, + 122, 33, 180, 201, 216, 134, 29, 70, 187, 233, 185, 55, 108, 194, 234, 160, 221, 173, 3, + 165, 60, 247, 255, 17, 246, 154, 138, 246, 214, 74, 68, 255, 37, 47, 250, 39, 61, 176, 92, + 23, 8, 86, 31, 67, 73, 49, 0, 202, 26, 159, 134, 111, 133, 2, 58, 14, 251, 240, 46, 148, + 245, 238, 133, 173, 53, 184, 126, 63, 135, 62, 61, 5, 11, 215, 77, 16, 23, 49, 222, 220, + 109, 121, 198, 36, 95, 198, 114, 91, 32, 175, 151, 250, 188, 14, 181, 244, 18, 92, 143, 138, + 97, 250, 68, 136, 183, 54, 65, 19, 217, 201, 156, 167, 101, 86, 203, 106, 219, 227, 107, + 209, 119, 33, 24, 227, 87, 32, 208, 211, 203, 92, 141, 88, 11, 240, 32, 10, 209, 194, 190, + 175, 50, 247, 66, 232, 163, 177, 207, 145, 154, 123, 60, 244, 109, 132, 31, 198, 135, 64, + 136, 185, 239, 50, 119, 78, 158, 61, 122, 136, 108, 138, 235, 199, 92, 240, 149, 251, 112, + 62, 63, 128, 114, 186, 1, 68, 200, 54, 246, 30, 62, 231, 221, 109, 93, 115, 255, 36, 19, 48, + 255, 33, 244, 63, 60, 123, 119, 165, 80, 134, 61, 193, 199, 75, 141, 191, 145, 253, 60, 0, + 219, 44, 103, 238, 212, 236, 123, 173, 71, 231, 1, 110, 234, 173, 195, 220, 183, 185, 239, + 188, 78, 230, 244, 107, 188, 126, 84, 54, 159, 194, 62, 35, 240, 182, 225, 29, 143, 77, 167, + 218, 239, 62, 68, 120, 218, 240, 210, 199, 253, 141, 38, 80, 203, 190, 27, 91, 109, 191, 91, + 226, 251, 39, 234, 233, 147, 185, 199, 51, 119, 105, 94, 127, 86, 14, 70, 148, 65, 12, 128, + 62, 98, 57, 116, 224, 243, 160, 15, 123, 3, 58, 168, 250, 232, 211, 114, 240, 53, 254, 25, + 174, 177, 118, 123, 102, 141, 22, 51, 209, 207, 63, 0, 190, 168, 251, 198, 39, 223, 229, + 158, 35, 174, 12, 68, 99, 132, 57, 143, 72, 195, 248, 163, 136, 119, 61, 182, 163, 157, 59, + 222, 158, 155, 24, 247, 112, 161, 39, 190, 63, 226, 121, 68, 138, 59, 221, 164, 185, 198, + 184, 249, 135, 215, 221, 245, 219, 105, 158, 95, 54, 120, 184, 14, 249, 41, 238, 187, 55, + 239, 89, 77, 230, 143, 110, 184, 166, 35, 66, 179, 251, 169, 246, 157, 40, 250, 247, 79, + 160, 89, 126, 189, 231, 61, 148, 191, 165, 255, 241, 89, 26, 206, 97, 243, 78, 85, 54, 127, + 248, 177, 59, 254, 191, 162, 88, 6, 253, 56, 215, 37, 207, 217, 21, 205, 230, 71, 63, 70, + 179, 191, 159, 130, 249, 127, 241, 208, 139, 158, 120, 127, 163, 107, 198, 86, 228, 164, + 127, 126, 127, 229, 47, 222, 103, 249, 11, 234, 157, 103, 89, 243, 45, 167, 127, 253, 87, + 239, 193, 60, 153, 38, 60, 233, 61, 153, 71, 20, 247, 116, 158, 240, 127, 122, 118, 103, + 219, 41, 183, 156, 108, 250, 132, 247, 15, 220, 103, 114, 143, 104, 254, 199, 246, 79, 57, + 169, 253, 62, 156, 203, 149, 229, 199, 154, 115, 197, 26, 80, 200, 188, 19, 240, 119, 16, + 238, 119, 221, 2, 100, 7, 180, 219, 79, 128, 199, 191, 255, 19, 196, 3, 180, 161, 8, 85, + 251, 113, 152, 119, 12, 254, 14, 18, 87, 76, 3, 237, 124, 50, 236, 125, 129, 13, 215, 123, + 30, 184, 60, 56, 100, 128, 54, 20, 12, 4, 123, 50, 248, 147, 223, 175, 139, 247, 142, 71, + 253, 225, 65, 140, 27, 246, 123, 14, 127, 3, 187, 175, 101, 30, 193, 236, 63, 254, 14, 184, + 247, 7, 3, 117, 223, 131, 212, 199, 225, 149, 187, 87, 142, 94, 185, 120, 199, 237, 237, + 175, 183, 125, 111, 189, 255, 219, 231, 248, 191, 125, 46, 255, 173, 113, 255, 93, 223, 179, + 3, 231, 228, 9, 196, 247, 30, 106, 222, 221, 43, 244, 164, 126, 27, 29, 148, 249, 17, 103, + 17, 119, 108, 159, 197, 204, 231, 146, 30, 20, 66, 157, 249, 13, 113, 16, 241, 187, 7, 7, + 108, 184, 223, 83, 41, 196, 190, 64, 29, 56, 110, 191, 107, 155, 85, 230, 79, 122, 96, 222, + 137, 49, 240, 62, 19, 247, 251, 55, 249, 21, 90, 114, 85, 9, 219, 156, 98, 202, 27, 91, 104, + 219, 195, 17, 79, 148, 207, 94, 236, 95, 121, 196, 121, 68, 69, 44, 227, 126, 111, 199, 248, + 94, 39, 248, 117, 247, 186, 110, 224, 181, 125, 250, 128, 125, 222, 16, 40, 220, 239, 214, + 214, 53, 231, 29, 168, 23, 49, 252, 83, 232, 227, 241, 247, 246, 120, 124, 191, 247, 237, + 253, 180, 251, 61, 88, 127, 183, 189, 131, 134, 182, 205, 53, 239, 47, 189, 138, 54, 202, + 133, 123, 194, 171, 246, 187, 162, 179, 60, 56, 232, 193, 60, 143, 239, 215, 202, 131, 130, + 246, 251, 192, 171, 225, 157, 236, 96, 229, 208, 63, 43, 103, 151, 175, 137, 237, 61, 135, + 88, 234, 241, 183, 195, 61, 97, 68, 230, 6, 119, 124, 86, 223, 246, 100, 189, 35, 41, 64, + 136, 210, 8, 244, 27, 216, 86, 40, 203, 14, 161, 142, 87, 196, 181, 28, 193, 166, 33, 208, + 95, 176, 239, 113, 122, 66, 81, 222, 22, 195, 211, 209, 183, 202, 246, 206, 13, 230, 47, + 203, 59, 98, 153, 150, 136, 142, 182, 79, 81, 151, 189, 248, 104, 110, 219, 239, 215, 152, + 247, 106, 12, 204, 59, 57, 45, 48, 191, 15, 250, 130, 117, 144, 90, 246, 123, 52, 246, 254, + 222, 222, 215, 99, 91, 56, 150, 120, 222, 26, 252, 237, 119, 127, 204, 26, 101, 222, 173, + 193, 58, 120, 77, 140, 67, 191, 136, 37, 160, 190, 182, 66, 189, 40, 130, 227, 54, 24, 130, + 99, 191, 237, 6, 27, 129, 152, 128, 251, 224, 5, 136, 187, 200, 175, 198, 248, 63, 80, 190, + 237, 144, 199, 189, 49, 155, 136, 64, 127, 148, 102, 32, 86, 34, 223, 24, 233, 79, 72, 151, + 98, 30, 244, 141, 105, 12, 134, 13, 198, 97, 92, 8, 210, 209, 136, 23, 16, 126, 110, 144, + 235, 110, 208, 126, 72, 91, 35, 197, 182, 216, 47, 72, 235, 35, 90, 33, 124, 61, 180, 149, + 187, 28, 153, 132, 244, 13, 196, 80, 79, 190, 110, 32, 232, 84, 68, 3, 228, 67, 144, 70, 33, + 93, 139, 104, 0, 194, 212, 71, 142, 120, 242, 119, 203, 150, 167, 199, 163, 60, 2, 125, 118, + 159, 62, 208, 8, 231, 84, 35, 245, 20, 234, 101, 125, 215, 118, 242, 11, 212, 230, 221, 32, + 47, 62, 83, 63, 247, 254, 33, 115, 159, 123, 223, 98, 251, 81, 102, 143, 209, 26, 177, 4, + 195, 187, 255, 244, 94, 128, 247, 158, 220, 67, 133, 132, 158, 124, 2, 238, 245, 127, 195, + 125, 159, 121, 175, 103, 41, 248, 139, 90, 184, 174, 94, 129, 56, 17, 13, 161, 230, 220, 2, + 235, 105, 142, 104, 97, 96, 222, 39, 182, 207, 158, 58, 130, 242, 158, 125, 123, 33, 187, + 64, 65, 107, 39, 218, 80, 48, 191, 233, 109, 219, 126, 155, 210, 53, 238, 247, 231, 73, 71, + 119, 156, 205, 27, 239, 109, 141, 219, 35, 51, 243, 204, 235, 227, 202, 66, 64, 101, 5, 244, + 35, 203, 217, 190, 83, 128, 253, 94, 153, 121, 239, 250, 156, 189, 182, 214, 53, 107, 190, + 189, 190, 198, 195, 211, 30, 31, 174, 1, 246, 203, 236, 31, 205, 92, 216, 131, 250, 226, + 131, 101, 26, 123, 230, 111, 99, 243, 62, 155, 209, 43, 143, 31, 56, 0, 177, 142, 14, 1, + 179, 135, 172, 97, 238, 41, 104, 27, 179, 87, 176, 203, 62, 229, 222, 147, 186, 94, 116, + 239, 111, 93, 205, 176, 222, 69, 217, 238, 158, 230, 26, 252, 191, 190, 219, 202, 121, 7, + 245, 87, 119, 69, 255, 244, 94, 198, 63, 189, 167, 241, 167, 240, 191, 188, 79, 201, 249, + 222, 198, 63, 189, 199, 241, 143, 225, 28, 247, 45, 255, 116, 87, 134, 122, 186, 138, 187, + 127, 223, 160, 192, 163, 223, 67, 192, 103, 191, 218, 245, 161, 1, 234, 81, 48, 218, 232, + 143, 60, 190, 90, 29, 58, 23, 231, 235, 78, 168, 47, 67, 237, 243, 200, 104, 247, 218, 143, + 182, 210, 216, 174, 36, 180, 131, 232, 243, 123, 234, 107, 205, 191, 180, 109, 121, 142, + 223, 113, 112, 221, 245, 254, 110, 3, 75, 182, 207, 73, 77, 124, 160, 109, 227, 204, 153, + 111, 249, 172, 115, 218, 172, 51, 90, 239, 239, 36, 216, 243, 233, 21, 220, 31, 226, 212, + 176, 207, 184, 199, 161, 13, 240, 245, 216, 150, 150, 30, 27, 180, 198, 192, 181, 130, 134, + 218, 103, 146, 198, 22, 21, 36, 195, 145, 182, 181, 81, 140, 76, 198, 217, 208, 218, 99, + 163, 202, 224, 88, 230, 120, 236, 207, 27, 174, 183, 109, 251, 242, 154, 199, 70, 205, 116, + 159, 25, 146, 109, 174, 89, 30, 91, 21, 130, 107, 82, 48, 93, 136, 104, 239, 177, 67, 21, + 144, 26, 12, 70, 56, 17, 165, 236, 253, 244, 107, 110, 184, 134, 153, 125, 181, 189, 46, + 197, 120, 236, 164, 169, 183, 29, 150, 67, 222, 115, 143, 17, 128, 107, 77, 109, 51, 7, 205, + 239, 192, 252, 147, 175, 132, 235, 255, 94, 143, 79, 224, 197, 94, 143, 159, 96, 211, 127, + 242, 9, 179, 149, 251, 237, 73, 249, 61, 247, 54, 205, 112, 157, 201, 111, 191, 235, 107, + 126, 23, 97, 47, 20, 247, 238, 185, 178, 222, 139, 94, 98, 219, 154, 134, 217, 206, 252, + 189, 103, 239, 113, 158, 243, 230, 56, 123, 29, 247, 220, 235, 231, 220, 19, 152, 187, 28, + 92, 207, 26, 120, 247, 243, 40, 167, 47, 61, 231, 60, 94, 218, 211, 13, 251, 204, 199, 94, + 163, 85, 30, 116, 147, 113, 45, 181, 207, 101, 221, 123, 176, 178, 72, 125, 60, 239, 212, + 134, 123, 246, 13, 121, 178, 237, 247, 188, 251, 56, 123, 159, 193, 190, 132, 250, 162, 17, + 166, 89, 184, 94, 46, 49, 119, 9, 174, 90, 158, 115, 52, 237, 57, 115, 50, 103, 93, 111, 27, + 61, 115, 91, 91, 24, 241, 239, 129, 79, 56, 23, 185, 200, 69, 46, 114, 145, 139, 92, 228, + 34, 23, 185, 200, 69, 46, 114, 145, 139, 92, 228, 34, 23, 185, 200, 69, 46, 114, 145, 139, + 92, 228, 34, 23, 185, 200, 69, 46, 114, 145, 139, 92, 228, 34, 23, 185, 200, 69, 46, 114, + 145, 139, 92, 228, 34, 23, 185, 200, 69, 46, 114, 145, 139, 92, 228, 34, 23, 185, 200, 69, + 46, 254, 45, 136, 249, 159, 154, 224, 6, 212, 134, 197, 160, 128, 66, 0, 148, 55, 127, 205, + 84, 252, 200, 47, 131, 176, 127, 213, 180, 38, 253, 24, 204, 31, 223, 54, 63, 253, 237, 111, + 195, 19, 8, 182, 67, 204, 254, 133, 212, 60, 48, 201, 195, 51, 24, 106, 254, 226, 145, 205, + 115, 8, 38, 218, 195, 11, 40, 66, 34, 61, 188, 132, 48, 82, 215, 195, 43, 216, 71, 18, 60, + 188, 134, 24, 90, 206, 195, 91, 48, 129, 246, 240, 240, 126, 116, 33, 61, 15, 222, 255, 95, + 170, 138, 120, 209, 195, 19, 240, 23, 27, 61, 60, 5, 37, 62, 243, 240, 12, 106, 136, 93, 30, + 158, 131, 191, 164, 30, 94, 128, 175, 204, 235, 225, 37, 228, 149, 65, 30, 94, 65, 95, 89, + 206, 195, 107, 40, 34, 231, 120, 120, 11, 226, 228, 90, 15, 239, 71, 90, 202, 95, 177, 102, + 194, 25, 182, 229, 171, 235, 216, 188, 145, 80, 128, 110, 106, 243, 210, 142, 239, 106, 243, + 182, 36, 117, 178, 205, 107, 155, 31, 110, 243, 150, 145, 161, 30, 239, 225, 81, 134, 250, + 186, 135, 71, 25, 90, 126, 30, 30, 101, 104, 5, 122, 120, 148, 161, 53, 213, 195, 163, 12, + 173, 53, 30, 30, 101, 104, 125, 238, 225, 81, 134, 214, 5, 15, 143, 50, 244, 217, 232, 225, + 81, 134, 62, 231, 60, 60, 202, 208, 145, 98, 243, 62, 166, 159, 121, 152, 205, 59, 76, 223, + 242, 248, 219, 188, 175, 29, 31, 98, 243, 121, 108, 62, 202, 230, 3, 76, 223, 242, 84, 179, + 249, 252, 200, 231, 203, 19, 111, 243, 5, 236, 60, 157, 109, 190, 160, 93, 79, 111, 155, 47, + 100, 199, 15, 179, 249, 162, 118, 217, 49, 54, 31, 104, 231, 113, 143, 37, 200, 206, 179, + 216, 230, 67, 108, 254, 29, 155, 47, 97, 231, 223, 108, 243, 101, 108, 222, 61, 198, 178, + 54, 127, 208, 240, 218, 221, 255, 211, 54, 239, 110, 235, 178, 225, 125, 221, 241, 119, 108, + 222, 30, 139, 63, 131, 119, 192, 9, 21, 33, 6, 63, 85, 145, 235, 0, 253, 32, 25, 105, 75, + 72, 133, 193, 136, 52, 24, 5, 67, 236, 152, 56, 12, 13, 69, 222, 124, 39, 98, 124, 138, 157, + 163, 28, 166, 212, 135, 129, 248, 113, 66, 59, 140, 235, 139, 229, 211, 96, 152, 29, 74, 70, + 154, 140, 185, 71, 224, 119, 18, 230, 236, 128, 233, 131, 236, 88, 39, 180, 66, 58, 210, + 206, 149, 138, 113, 137, 88, 147, 201, 223, 23, 134, 99, 77, 137, 88, 38, 103, 251, 53, 255, + 161, 180, 51, 71, 249, 154, 56, 67, 77, 219, 195, 60, 253, 116, 66, 21, 236, 65, 12, 84, 64, + 206, 252, 183, 189, 41, 208, 27, 83, 83, 49, 61, 21, 250, 96, 43, 165, 255, 161, 254, 191, + 170, 237, 81, 41, 119, 153, 71, 37, 218, 64, 123, 108, 167, 195, 63, 246, 59, 197, 78, 73, + 68, 164, 217, 146, 77, 194, 60, 131, 236, 49, 12, 192, 56, 211, 187, 127, 255, 84, 76, 173, + 131, 237, 26, 221, 229, 58, 98, 40, 5, 67, 230, 57, 56, 177, 95, 105, 118, 222, 100, 79, + 203, 131, 49, 182, 188, 93, 131, 211, 174, 187, 159, 61, 86, 39, 74, 40, 21, 229, 57, 216, + 238, 87, 138, 157, 187, 220, 191, 238, 201, 159, 243, 117, 200, 226, 26, 218, 57, 71, 218, + 125, 237, 139, 225, 214, 56, 214, 62, 246, 147, 49, 169, 101, 179, 122, 58, 24, 159, 105, + 50, 150, 114, 183, 58, 212, 150, 152, 169, 53, 26, 99, 58, 217, 249, 211, 60, 189, 111, 97, + 203, 205, 72, 208, 244, 218, 137, 207, 167, 6, 84, 66, 237, 238, 106, 143, 196, 105, 203, + 213, 212, 51, 220, 214, 76, 183, 124, 220, 242, 239, 99, 215, 152, 102, 203, 195, 132, 135, + 216, 50, 24, 100, 75, 205, 43, 183, 94, 118, 89, 175, 76, 227, 81, 170, 45, 236, 255, 134, + 185, 143, 167, 117, 111, 202, 16, 91, 179, 146, 176, 149, 222, 118, 141, 238, 103, 49, 210, + 110, 171, 55, 126, 63, 185, 93, 119, 216, 228, 237, 141, 227, 29, 110, 143, 34, 201, 206, + 155, 138, 223, 73, 118, 250, 16, 91, 187, 71, 101, 61, 53, 119, 91, 41, 158, 26, 122, 123, + 234, 114, 143, 222, 204, 76, 231, 159, 70, 158, 106, 75, 115, 148, 61, 11, 204, 127, 179, + 236, 180, 181, 173, 87, 86, 91, 79, 234, 215, 224, 63, 213, 253, 159, 75, 233, 81, 237, 73, + 89, 207, 121, 168, 173, 75, 110, 173, 234, 157, 165, 41, 79, 30, 253, 35, 61, 126, 188, 95, + 181, 178, 201, 192, 140, 196, 61, 150, 52, 187, 61, 175, 14, 154, 250, 221, 99, 77, 194, + 152, 145, 246, 200, 83, 237, 25, 246, 228, 145, 186, 37, 157, 248, 152, 84, 147, 61, 179, + 34, 231, 220, 48, 82, 77, 195, 124, 195, 237, 146, 166, 183, 35, 178, 52, 215, 93, 143, 201, + 57, 16, 115, 252, 237, 51, 122, 199, 89, 49, 38, 166, 170, 179, 67, 191, 100, 103, 203, 212, + 193, 169, 105, 163, 134, 36, 59, 227, 82, 135, 14, 73, 29, 154, 152, 150, 146, 58, 184, 156, + 179, 254, 192, 129, 206, 118, 41, 125, 251, 165, 13, 115, 182, 75, 30, 150, 60, 116, 68, + 114, 82, 185, 14, 41, 131, 146, 135, 57, 91, 37, 143, 116, 182, 75, 29, 148, 56, 184, 93, + 114, 223, 225, 3, 19, 135, 122, 203, 215, 204, 145, 236, 244, 164, 215, 236, 148, 60, 116, + 24, 214, 233, 172, 82, 46, 166, 130, 179, 84, 203, 148, 222, 67, 83, 135, 165, 246, 73, 43, + 157, 35, 127, 246, 108, 118, 18, 166, 216, 9, 109, 218, 183, 236, 144, 179, 238, 148, 97, + 206, 68, 103, 218, 208, 196, 164, 228, 65, 137, 67, 7, 56, 83, 251, 252, 229, 80, 156, 41, + 131, 157, 105, 152, 214, 113, 112, 74, 90, 114, 146, 179, 125, 90, 98, 26, 214, 148, 56, 56, + 169, 124, 234, 80, 103, 42, 166, 12, 117, 246, 78, 29, 62, 56, 109, 104, 74, 242, 176, 114, + 127, 85, 73, 86, 92, 7, 243, 213, 112, 104, 226, 200, 148, 193, 125, 157, 173, 251, 244, 73, + 233, 157, 236, 44, 107, 42, 29, 60, 48, 121, 20, 22, 29, 154, 50, 44, 117, 112, 180, 179, + 83, 74, 239, 52, 172, 190, 69, 226, 208, 164, 228, 193, 105, 206, 10, 53, 42, 85, 236, 154, + 58, 220, 57, 40, 113, 148, 115, 248, 176, 100, 236, 15, 246, 191, 79, 42, 166, 36, 14, 115, + 14, 73, 30, 58, 40, 37, 205, 244, 173, 215, 40, 187, 167, 241, 29, 91, 212, 199, 212, 161, + 118, 96, 200, 208, 212, 164, 225, 189, 211, 204, 40, 70, 246, 75, 233, 221, 47, 91, 89, 164, + 41, 131, 123, 15, 28, 158, 132, 69, 211, 82, 157, 73, 41, 195, 134, 12, 196, 6, 112, 104, + 88, 42, 5, 51, 244, 198, 92, 216, 124, 57, 167, 211, 219, 120, 234, 224, 129, 163, 156, 165, + 82, 74, 59, 147, 7, 245, 50, 165, 30, 213, 53, 216, 155, 251, 137, 93, 178, 179, 39, 153, + 49, 15, 77, 30, 134, 162, 234, 109, 132, 146, 173, 121, 91, 198, 158, 186, 106, 217, 61, 40, + 149, 130, 173, 164, 37, 15, 50, 18, 28, 154, 130, 173, 38, 165, 142, 28, 60, 48, 53, 49, + 123, 163, 216, 233, 68, 119, 87, 241, 33, 100, 61, 141, 212, 225, 105, 67, 134, 167, 57, + 147, 146, 71, 24, 225, 98, 158, 126, 201, 3, 135, 228, 24, 17, 46, 104, 169, 182, 1, 72, + 180, 167, 22, 78, 125, 226, 135, 170, 221, 31, 149, 251, 23, 219, 236, 123, 211, 188, 134, + 60, 201, 109, 160, 217, 66, 182, 158, 125, 196, 62, 65, 108, 99, 219, 217, 187, 185, 78, 72, + 174, 19, 146, 235, 132, 228, 58, 33, 185, 78, 200, 255, 11, 39, 228, 49, 43, 254, 136, 55, + 161, 148, 39, 166, 157, 125, 44, 159, 153, 23, 217, 237, 187, 91, 251, 159, 92, 231, 64, + 204, 51, 42, 123, 152, 7, 243, 10, 188, 57, 111, 204, 235, 224, 119, 141, 199, 90, 24, 140, + 245, 254, 85, 45, 173, 240, 123, 132, 45, 69, 247, 188, 238, 71, 50, 200, 50, 6, 246, 179, + 173, 143, 185, 134, 122, 108, 70, 226, 223, 212, 240, 100, 158, 122, 254, 228, 107, 40, 214, + 253, 132, 31, 191, 202, 132, 18, 70, 56, 110, 161, 57, 8, 144, 160, 64, 131, 5, 62, 224, 0, + 95, 240, 131, 60, 224, 15, 1, 144, 23, 242, 65, 126, 40, 0, 5, 161, 16, 20, 134, 34, 80, 20, + 138, 65, 32, 20, 135, 32, 8, 134, 16, 148, 127, 40, 132, 65, 56, 148, 128, 8, 136, 132, 146, + 168, 57, 165, 161, 12, 68, 161, 37, 41, 139, 207, 162, 188, 109, 209, 43, 162, 197, 168, + 140, 246, 189, 42, 84, 131, 234, 104, 63, 106, 162, 174, 213, 134, 58, 80, 23, 234, 65, 44, + 142, 176, 1, 90, 186, 134, 56, 251, 27, 65, 99, 104, 2, 77, 161, 25, 52, 71, 59, 208, 18, + 71, 210, 26, 109, 126, 91, 180, 237, 237, 209, 198, 117, 68, 203, 212, 25, 186, 224, 252, + 235, 6, 79, 65, 119, 120, 26, 122, 64, 79, 72, 192, 113, 246, 66, 29, 48, 250, 210, 199, 94, + 43, 83, 112, 197, 30, 128, 99, 31, 100, 75, 115, 8, 60, 99, 175, 50, 105, 40, 195, 17, 168, + 177, 207, 226, 19, 27, 13, 207, 193, 243, 240, 2, 188, 8, 99, 96, 44, 188, 4, 47, 195, 56, + 120, 5, 198, 195, 4, 152, 8, 147, 224, 85, 72, 135, 201, 48, 5, 166, 194, 52, 152, 14, 51, + 96, 38, 204, 130, 215, 96, 54, 204, 129, 185, 68, 192, 124, 88, 0, 11, 137, 132, 69, 176, + 24, 150, 16, 5, 75, 97, 25, 188, 9, 111, 193, 219, 176, 28, 86, 192, 74, 88, 133, 171, 255, + 106, 88, 3, 107, 97, 29, 188, 7, 25, 176, 30, 54, 192, 70, 216, 4, 155, 97, 11, 188, 15, 91, + 97, 27, 108, 135, 15, 224, 67, 162, 225, 99, 248, 4, 118, 192, 167, 240, 25, 124, 14, 95, + 192, 78, 248, 18, 190, 130, 175, 97, 23, 236, 134, 61, 240, 13, 236, 133, 125, 176, 31, 14, + 192, 65, 56, 4, 223, 193, 97, 56, 2, 71, 225, 123, 56, 6, 199, 225, 4, 156, 132, 31, 224, + 20, 156, 134, 51, 168, 89, 63, 194, 57, 56, 15, 23, 224, 39, 184, 8, 63, 163, 159, 114, 9, + 46, 195, 21, 184, 10, 215, 224, 58, 252, 10, 191, 193, 13, 248, 29, 110, 194, 45, 184, 13, + 119, 224, 15, 184, 11, 247, 224, 62, 60, 128, 135, 144, 9, 46, 2, 196, 34, 62, 196, 65, 124, + 137, 31, 201, 67, 252, 73, 0, 201, 75, 242, 145, 252, 164, 0, 41, 72, 10, 145, 194, 164, 8, + 41, 74, 138, 145, 64, 82, 156, 4, 145, 96, 18, 66, 156, 36, 148, 132, 145, 112, 82, 130, 68, + 144, 72, 82, 146, 148, 34, 165, 73, 25, 18, 69, 162, 73, 89, 82, 142, 148, 39, 49, 164, 2, + 169, 72, 42, 145, 202, 164, 10, 169, 74, 170, 145, 234, 164, 6, 169, 73, 106, 145, 218, 164, + 14, 169, 75, 234, 145, 88, 82, 159, 52, 32, 113, 164, 33, 137, 39, 141, 72, 99, 210, 132, + 52, 37, 205, 72, 115, 210, 130, 180, 36, 173, 72, 107, 210, 134, 180, 37, 237, 72, 123, 210, + 129, 116, 36, 157, 72, 103, 210, 133, 116, 37, 221, 200, 83, 164, 59, 121, 154, 244, 32, 61, + 73, 2, 73, 36, 189, 72, 111, 146, 68, 146, 73, 31, 210, 151, 244, 35, 41, 164, 63, 25, 64, + 6, 146, 65, 100, 48, 73, 37, 67, 200, 51, 100, 40, 25, 70, 210, 200, 112, 50, 130, 140, 36, + 207, 146, 81, 100, 52, 121, 142, 60, 79, 94, 32, 47, 146, 49, 100, 44, 121, 137, 188, 76, + 198, 145, 87, 200, 120, 50, 129, 76, 36, 147, 200, 171, 36, 157, 76, 38, 83, 200, 84, 50, + 141, 76, 39, 51, 200, 76, 50, 139, 188, 70, 102, 147, 57, 100, 46, 153, 71, 230, 147, 5, + 100, 33, 121, 157, 44, 34, 139, 201, 18, 242, 6, 89, 74, 150, 145, 55, 201, 91, 228, 109, + 178, 156, 172, 32, 43, 201, 42, 242, 14, 89, 77, 214, 144, 119, 201, 90, 178, 142, 188, 135, + 179, 118, 61, 217, 64, 54, 146, 77, 100, 51, 217, 66, 222, 39, 91, 201, 54, 178, 157, 124, + 64, 62, 36, 31, 145, 143, 201, 39, 100, 7, 249, 148, 124, 70, 62, 39, 95, 144, 157, 228, 75, + 242, 21, 249, 154, 236, 34, 187, 201, 30, 242, 13, 217, 75, 246, 145, 253, 228, 0, 57, 72, + 190, 37, 135, 200, 119, 228, 48, 57, 66, 142, 146, 239, 201, 49, 114, 156, 156, 32, 39, 201, + 15, 228, 20, 57, 77, 206, 144, 179, 228, 71, 114, 142, 156, 39, 23, 200, 79, 228, 34, 249, + 153, 252, 66, 46, 145, 203, 228, 10, 185, 74, 174, 145, 235, 228, 87, 242, 27, 185, 65, 126, + 39, 55, 201, 45, 114, 155, 220, 33, 127, 144, 187, 228, 30, 185, 79, 30, 144, 135, 36, 147, + 184, 40, 80, 66, 41, 101, 148, 83, 65, 37, 85, 84, 83, 139, 250, 80, 7, 245, 165, 126, 52, + 15, 245, 167, 1, 52, 47, 205, 71, 243, 211, 2, 180, 32, 45, 4, 111, 208, 194, 180, 8, 45, + 74, 139, 209, 64, 90, 156, 6, 209, 96, 26, 66, 157, 52, 148, 134, 209, 112, 90, 130, 70, + 192, 60, 26, 73, 75, 210, 82, 180, 52, 45, 67, 163, 104, 52, 45, 75, 203, 209, 242, 52, 134, + 86, 160, 21, 105, 37, 90, 153, 86, 161, 85, 105, 53, 90, 157, 214, 160, 53, 105, 45, 90, + 155, 214, 161, 117, 105, 61, 26, 75, 235, 211, 6, 52, 142, 54, 164, 241, 180, 17, 109, 76, + 155, 208, 166, 180, 25, 109, 78, 91, 208, 150, 180, 21, 109, 77, 219, 208, 182, 180, 29, + 109, 79, 59, 208, 142, 180, 19, 237, 76, 187, 208, 174, 180, 27, 125, 138, 118, 167, 79, + 211, 30, 180, 39, 77, 160, 137, 180, 23, 237, 77, 147, 104, 50, 237, 67, 251, 210, 126, 52, + 133, 246, 167, 3, 232, 64, 58, 136, 14, 166, 169, 116, 8, 125, 134, 14, 165, 195, 104, 26, + 29, 78, 71, 208, 145, 244, 89, 58, 138, 142, 166, 207, 209, 231, 233, 11, 244, 69, 58, 134, + 142, 165, 47, 209, 151, 233, 56, 250, 10, 29, 79, 39, 208, 137, 116, 18, 125, 149, 166, 211, + 201, 116, 10, 157, 74, 167, 209, 233, 116, 6, 157, 73, 103, 209, 215, 224, 117, 58, 155, + 206, 161, 115, 233, 60, 58, 159, 46, 160, 11, 233, 235, 116, 17, 93, 76, 151, 208, 55, 232, + 82, 186, 140, 190, 73, 223, 162, 111, 211, 229, 116, 5, 93, 73, 87, 209, 119, 232, 106, 186, + 134, 190, 75, 215, 210, 117, 244, 61, 154, 65, 215, 211, 13, 116, 35, 221, 68, 55, 211, 45, + 244, 125, 186, 149, 110, 163, 219, 233, 7, 244, 67, 250, 17, 253, 152, 126, 66, 119, 208, + 79, 233, 103, 244, 115, 250, 5, 221, 73, 191, 164, 95, 209, 175, 233, 46, 186, 155, 238, + 161, 223, 208, 189, 116, 31, 221, 79, 15, 208, 131, 244, 91, 122, 136, 126, 71, 15, 211, 35, + 244, 40, 253, 158, 30, 163, 199, 233, 9, 122, 146, 254, 64, 79, 209, 211, 244, 12, 61, 75, + 127, 164, 231, 232, 121, 122, 129, 254, 68, 47, 210, 159, 233, 47, 244, 18, 189, 76, 175, + 208, 171, 244, 26, 189, 78, 127, 165, 191, 209, 27, 244, 119, 122, 147, 222, 162, 183, 233, + 29, 250, 7, 189, 75, 239, 209, 251, 244, 1, 125, 72, 51, 169, 139, 1, 35, 140, 50, 198, 56, + 19, 76, 50, 197, 52, 179, 152, 15, 115, 48, 95, 230, 199, 242, 48, 127, 22, 192, 242, 178, + 124, 44, 63, 43, 192, 10, 178, 66, 172, 48, 43, 194, 138, 178, 98, 44, 144, 21, 103, 65, 44, + 152, 133, 48, 39, 11, 101, 97, 44, 156, 149, 96, 17, 44, 146, 149, 100, 165, 88, 105, 86, + 134, 69, 177, 104, 86, 150, 149, 99, 229, 89, 12, 171, 192, 42, 178, 74, 172, 50, 171, 194, + 170, 178, 106, 172, 58, 171, 193, 106, 178, 90, 172, 54, 171, 195, 234, 178, 122, 44, 150, + 213, 103, 13, 88, 28, 107, 200, 226, 89, 35, 214, 152, 53, 97, 77, 89, 51, 214, 156, 181, + 96, 45, 89, 43, 214, 154, 181, 97, 109, 89, 59, 214, 158, 117, 96, 29, 89, 39, 214, 153, + 117, 97, 93, 89, 55, 246, 20, 235, 206, 158, 102, 61, 88, 79, 150, 192, 18, 89, 47, 214, + 155, 37, 193, 71, 44, 153, 245, 97, 125, 89, 63, 150, 194, 250, 179, 1, 108, 32, 27, 196, 6, + 179, 84, 54, 132, 61, 195, 134, 178, 97, 44, 141, 13, 103, 35, 216, 72, 246, 44, 27, 197, + 70, 179, 231, 216, 243, 236, 5, 246, 34, 27, 195, 198, 178, 151, 216, 203, 108, 28, 123, + 133, 141, 103, 19, 216, 68, 54, 137, 189, 202, 210, 217, 100, 54, 133, 77, 101, 211, 216, + 116, 54, 131, 205, 100, 179, 216, 107, 108, 54, 155, 195, 230, 178, 121, 108, 62, 91, 128, + 123, 188, 215, 217, 34, 182, 152, 45, 97, 111, 176, 165, 108, 25, 123, 147, 189, 197, 222, + 102, 203, 217, 10, 182, 146, 173, 98, 239, 176, 213, 108, 13, 123, 151, 173, 101, 235, 216, + 123, 44, 3, 247, 131, 27, 216, 70, 182, 137, 109, 102, 91, 216, 251, 108, 171, 189, 47, 252, + 128, 125, 136, 59, 196, 143, 113, 159, 184, 131, 125, 202, 62, 99, 159, 179, 47, 216, 78, + 246, 37, 251, 138, 125, 205, 118, 177, 221, 108, 15, 251, 134, 237, 101, 251, 216, 126, 118, + 128, 29, 100, 223, 178, 67, 236, 59, 118, 152, 29, 97, 71, 217, 247, 236, 24, 59, 206, 78, + 176, 147, 236, 7, 118, 138, 157, 102, 103, 216, 89, 246, 35, 59, 199, 206, 179, 11, 236, 39, + 118, 145, 253, 204, 126, 97, 151, 216, 101, 118, 133, 93, 101, 215, 216, 117, 246, 43, 251, + 141, 221, 96, 191, 179, 155, 236, 22, 187, 205, 238, 176, 63, 216, 93, 118, 143, 221, 103, + 15, 216, 67, 150, 201, 92, 28, 56, 225, 148, 51, 206, 185, 224, 146, 43, 174, 185, 197, 125, + 184, 131, 251, 114, 63, 158, 135, 251, 243, 0, 158, 151, 231, 227, 249, 121, 1, 94, 144, 23, + 226, 133, 121, 17, 94, 148, 23, 227, 129, 188, 56, 15, 66, 15, 39, 132, 59, 121, 40, 15, + 227, 225, 188, 4, 143, 224, 145, 188, 36, 47, 197, 75, 243, 50, 60, 138, 71, 243, 178, 188, + 28, 47, 207, 99, 208, 11, 170, 200, 43, 241, 202, 188, 10, 175, 202, 171, 241, 234, 188, 6, + 175, 201, 107, 241, 218, 232, 23, 213, 229, 245, 120, 44, 175, 207, 27, 240, 56, 222, 144, + 199, 243, 70, 232, 45, 53, 225, 77, 121, 51, 244, 152, 90, 240, 150, 188, 21, 111, 205, 219, + 240, 182, 188, 29, 111, 207, 59, 240, 142, 188, 19, 239, 204, 187, 240, 174, 188, 27, 127, + 138, 119, 231, 79, 243, 30, 188, 39, 79, 224, 137, 188, 23, 239, 205, 147, 120, 50, 239, + 195, 251, 242, 126, 60, 133, 247, 231, 3, 248, 64, 62, 136, 15, 230, 169, 124, 8, 127, 134, + 15, 229, 195, 120, 26, 31, 206, 71, 240, 145, 252, 89, 62, 138, 143, 230, 207, 241, 231, + 249, 11, 252, 69, 62, 134, 143, 229, 47, 241, 151, 249, 56, 254, 10, 31, 207, 39, 240, 137, + 124, 18, 127, 149, 167, 243, 201, 124, 10, 159, 202, 167, 241, 233, 124, 6, 159, 201, 103, + 241, 215, 248, 108, 62, 135, 207, 229, 243, 248, 124, 190, 128, 47, 228, 175, 243, 69, 124, + 49, 95, 194, 223, 224, 75, 249, 50, 254, 38, 127, 139, 191, 205, 151, 243, 21, 124, 37, 95, + 197, 223, 225, 171, 249, 26, 254, 46, 95, 203, 215, 241, 247, 120, 6, 95, 207, 55, 64, 5, + 190, 145, 111, 226, 155, 249, 22, 254, 62, 223, 202, 183, 241, 237, 252, 3, 254, 33, 255, + 136, 127, 204, 63, 225, 59, 248, 167, 252, 51, 254, 57, 255, 130, 239, 228, 95, 242, 175, + 248, 215, 124, 23, 223, 205, 247, 240, 111, 248, 94, 190, 143, 239, 231, 7, 248, 65, 254, + 45, 214, 112, 136, 127, 199, 15, 243, 35, 252, 40, 255, 158, 31, 227, 199, 249, 9, 126, 146, + 255, 192, 79, 241, 211, 252, 12, 63, 203, 127, 228, 231, 248, 121, 126, 129, 255, 196, 47, + 242, 159, 249, 47, 252, 18, 191, 204, 175, 240, 171, 252, 26, 191, 206, 127, 229, 191, 241, + 27, 252, 119, 126, 147, 223, 226, 183, 249, 29, 254, 7, 191, 203, 239, 241, 251, 252, 1, + 127, 200, 51, 185, 75, 128, 32, 130, 10, 38, 184, 16, 66, 10, 37, 180, 176, 132, 143, 112, + 8, 95, 225, 39, 242, 8, 127, 17, 32, 242, 138, 124, 34, 191, 40, 32, 10, 138, 66, 162, 176, + 40, 34, 138, 138, 98, 34, 80, 20, 23, 65, 34, 88, 132, 8, 167, 8, 21, 97, 34, 92, 148, 16, + 17, 34, 82, 148, 20, 165, 68, 105, 81, 70, 68, 137, 104, 81, 86, 148, 19, 229, 69, 140, 168, + 32, 42, 138, 74, 162, 178, 168, 34, 170, 138, 106, 162, 186, 168, 33, 106, 138, 90, 162, + 182, 168, 35, 234, 138, 122, 34, 86, 212, 23, 13, 68, 156, 104, 40, 226, 69, 35, 209, 88, + 52, 17, 77, 69, 51, 209, 92, 180, 16, 45, 69, 43, 209, 90, 180, 17, 109, 69, 59, 209, 94, + 116, 16, 29, 69, 39, 209, 89, 116, 17, 93, 69, 55, 241, 148, 232, 46, 158, 22, 61, 68, 79, + 145, 32, 18, 69, 47, 209, 91, 36, 137, 100, 209, 71, 244, 21, 253, 68, 138, 232, 47, 6, 136, + 129, 98, 144, 24, 44, 82, 197, 16, 241, 140, 24, 42, 134, 137, 52, 49, 92, 140, 16, 35, 197, + 179, 98, 148, 24, 45, 158, 19, 207, 139, 23, 196, 139, 98, 140, 24, 43, 94, 18, 47, 139, + 113, 226, 21, 49, 94, 76, 16, 19, 197, 36, 241, 170, 72, 23, 147, 197, 20, 49, 85, 76, 19, + 211, 197, 12, 49, 83, 204, 18, 175, 137, 217, 98, 142, 152, 43, 230, 137, 249, 98, 129, 88, + 40, 94, 23, 139, 196, 98, 177, 68, 188, 33, 150, 138, 101, 226, 77, 241, 150, 120, 91, 44, + 23, 43, 196, 74, 177, 74, 188, 35, 86, 139, 53, 226, 93, 177, 86, 172, 19, 239, 137, 12, + 177, 94, 108, 16, 27, 197, 38, 177, 89, 108, 17, 239, 139, 173, 98, 155, 216, 46, 62, 16, + 31, 138, 143, 196, 199, 226, 19, 177, 67, 124, 42, 62, 19, 159, 139, 47, 196, 78, 241, 165, + 248, 74, 124, 45, 118, 137, 221, 98, 143, 248, 70, 236, 21, 251, 196, 126, 113, 64, 28, 20, + 223, 138, 67, 226, 59, 113, 88, 28, 17, 71, 197, 247, 226, 152, 56, 46, 78, 136, 147, 226, + 7, 113, 74, 156, 22, 103, 196, 89, 241, 163, 56, 39, 206, 139, 11, 226, 39, 113, 81, 252, + 44, 126, 17, 151, 196, 101, 113, 69, 92, 21, 215, 196, 117, 241, 171, 248, 77, 220, 16, 191, + 139, 155, 226, 150, 184, 45, 238, 136, 63, 196, 93, 113, 79, 220, 23, 15, 196, 67, 145, 41, + 92, 18, 36, 145, 84, 50, 201, 165, 144, 82, 42, 169, 165, 37, 125, 164, 67, 250, 74, 63, + 153, 71, 250, 203, 0, 153, 87, 230, 147, 249, 101, 1, 89, 80, 22, 146, 133, 101, 17, 89, 84, + 22, 147, 129, 178, 184, 12, 146, 193, 50, 68, 58, 101, 168, 12, 147, 225, 178, 132, 140, + 144, 145, 178, 164, 44, 37, 75, 203, 50, 50, 74, 70, 203, 178, 178, 156, 44, 47, 99, 100, 5, + 89, 81, 86, 146, 149, 101, 21, 89, 85, 86, 147, 213, 101, 13, 89, 83, 214, 146, 181, 101, + 29, 89, 87, 214, 147, 177, 178, 190, 108, 32, 227, 100, 67, 25, 47, 27, 201, 198, 178, 137, + 108, 42, 155, 201, 230, 178, 133, 108, 41, 91, 201, 214, 178, 141, 108, 43, 219, 201, 246, + 178, 131, 236, 40, 59, 201, 206, 178, 139, 236, 42, 187, 201, 167, 100, 119, 249, 180, 236, + 33, 123, 202, 4, 153, 40, 123, 201, 222, 50, 73, 38, 203, 62, 178, 175, 236, 39, 83, 100, + 127, 57, 64, 14, 148, 131, 228, 96, 153, 42, 135, 200, 103, 228, 80, 57, 76, 166, 201, 225, + 114, 132, 28, 41, 159, 149, 163, 228, 104, 249, 156, 124, 94, 190, 32, 95, 148, 99, 228, 88, + 249, 146, 124, 89, 142, 147, 175, 200, 241, 114, 130, 156, 40, 39, 201, 87, 101, 186, 156, + 44, 167, 200, 169, 114, 154, 156, 46, 103, 200, 153, 114, 150, 124, 77, 206, 150, 115, 228, + 92, 57, 79, 206, 151, 11, 228, 66, 249, 186, 92, 36, 23, 203, 37, 242, 13, 185, 84, 46, 147, + 111, 202, 183, 228, 219, 114, 185, 92, 33, 87, 202, 85, 242, 29, 185, 90, 174, 145, 239, + 202, 181, 114, 157, 124, 79, 102, 200, 245, 114, 131, 220, 40, 55, 201, 205, 114, 139, 124, + 95, 110, 149, 219, 228, 118, 249, 129, 252, 80, 126, 36, 63, 150, 159, 200, 29, 242, 83, + 249, 153, 252, 92, 126, 33, 119, 202, 47, 229, 87, 242, 107, 185, 75, 238, 150, 123, 228, + 55, 114, 175, 220, 39, 247, 203, 3, 242, 160, 252, 86, 30, 146, 223, 201, 195, 242, 136, 60, + 42, 191, 151, 199, 228, 113, 121, 66, 158, 148, 63, 200, 83, 242, 180, 60, 35, 207, 202, 31, + 229, 57, 121, 94, 94, 144, 63, 201, 139, 242, 103, 249, 139, 188, 36, 47, 203, 43, 242, 170, + 188, 38, 175, 203, 95, 229, 111, 242, 134, 252, 93, 222, 148, 183, 228, 109, 121, 71, 254, + 33, 239, 202, 123, 242, 190, 124, 32, 31, 202, 76, 233, 82, 160, 136, 162, 138, 41, 174, + 132, 146, 74, 41, 173, 44, 229, 163, 28, 202, 87, 249, 169, 60, 202, 95, 5, 168, 188, 42, + 159, 202, 175, 10, 168, 130, 170, 144, 42, 172, 138, 168, 162, 170, 152, 10, 84, 197, 85, + 144, 10, 86, 33, 202, 169, 66, 85, 152, 10, 87, 37, 84, 132, 138, 84, 37, 85, 41, 85, 90, + 149, 81, 81, 42, 90, 149, 85, 229, 84, 121, 21, 163, 42, 168, 138, 170, 146, 170, 172, 170, + 168, 170, 170, 154, 170, 174, 106, 168, 154, 170, 150, 170, 173, 234, 168, 186, 170, 158, + 138, 85, 245, 85, 3, 21, 167, 26, 170, 120, 213, 72, 53, 86, 77, 84, 83, 213, 76, 53, 87, + 45, 84, 75, 213, 74, 181, 86, 109, 84, 91, 213, 78, 181, 87, 29, 84, 71, 213, 73, 117, 86, + 93, 84, 87, 213, 77, 61, 165, 186, 171, 167, 85, 15, 213, 83, 37, 168, 68, 213, 75, 245, 86, + 73, 42, 89, 245, 81, 125, 85, 63, 149, 162, 250, 171, 1, 106, 160, 26, 164, 6, 171, 84, 53, + 68, 61, 163, 134, 170, 97, 42, 77, 13, 87, 35, 212, 72, 245, 172, 26, 165, 70, 171, 231, + 212, 243, 234, 5, 245, 162, 26, 163, 198, 170, 151, 212, 203, 106, 156, 122, 69, 141, 87, + 19, 212, 68, 53, 73, 189, 170, 210, 213, 100, 53, 69, 77, 85, 211, 212, 116, 53, 67, 205, + 84, 179, 212, 107, 106, 182, 154, 163, 230, 170, 121, 106, 190, 90, 160, 22, 170, 215, 213, + 34, 181, 88, 45, 81, 111, 168, 165, 106, 153, 122, 83, 189, 165, 222, 86, 203, 213, 10, 181, + 82, 173, 82, 239, 168, 213, 106, 141, 122, 87, 173, 85, 235, 212, 123, 42, 67, 173, 87, 27, + 212, 70, 181, 73, 109, 86, 91, 212, 251, 106, 171, 218, 166, 182, 171, 15, 212, 135, 234, + 35, 245, 177, 250, 68, 237, 80, 159, 170, 207, 212, 231, 234, 11, 181, 83, 125, 169, 190, + 82, 95, 171, 93, 106, 183, 218, 163, 190, 81, 123, 213, 62, 181, 95, 29, 80, 7, 213, 183, + 234, 144, 250, 78, 29, 86, 71, 212, 81, 245, 189, 58, 166, 142, 171, 19, 234, 164, 250, 65, + 157, 82, 167, 213, 25, 117, 86, 253, 168, 206, 169, 243, 234, 130, 250, 73, 93, 84, 63, 171, + 95, 212, 37, 117, 89, 93, 81, 87, 213, 53, 117, 93, 253, 170, 126, 83, 55, 212, 239, 234, + 166, 186, 165, 110, 171, 59, 234, 15, 117, 87, 221, 83, 247, 213, 3, 245, 80, 101, 42, 151, + 6, 77, 52, 213, 76, 115, 45, 180, 212, 74, 107, 109, 105, 31, 237, 208, 190, 218, 79, 231, + 209, 254, 58, 64, 231, 213, 249, 116, 126, 93, 64, 23, 212, 133, 116, 97, 93, 68, 23, 213, + 197, 116, 160, 46, 174, 131, 116, 176, 14, 209, 78, 29, 170, 195, 116, 184, 46, 161, 35, + 116, 164, 46, 169, 75, 233, 210, 186, 140, 142, 210, 209, 186, 172, 46, 167, 203, 235, 24, + 93, 65, 87, 212, 149, 116, 101, 93, 69, 87, 213, 213, 116, 117, 93, 67, 215, 212, 181, 116, + 109, 93, 71, 215, 213, 245, 116, 172, 174, 175, 27, 232, 56, 221, 80, 199, 235, 70, 186, + 177, 110, 162, 155, 234, 102, 186, 185, 110, 161, 91, 234, 86, 186, 181, 110, 163, 219, 234, + 118, 186, 189, 238, 160, 59, 234, 78, 186, 179, 238, 162, 187, 234, 110, 250, 41, 221, 93, + 63, 173, 123, 232, 158, 58, 65, 39, 234, 94, 186, 183, 78, 210, 201, 186, 143, 238, 171, + 251, 233, 20, 221, 95, 15, 208, 3, 245, 32, 61, 88, 167, 234, 33, 250, 25, 61, 84, 15, 211, + 105, 122, 184, 30, 161, 71, 234, 103, 245, 40, 61, 90, 63, 167, 159, 215, 47, 232, 23, 245, + 24, 61, 86, 191, 164, 95, 214, 227, 244, 43, 122, 188, 158, 160, 39, 234, 73, 250, 85, 157, + 174, 39, 235, 41, 122, 170, 158, 166, 167, 235, 25, 122, 166, 158, 165, 95, 211, 179, 245, + 28, 61, 87, 207, 211, 243, 245, 2, 189, 80, 191, 174, 23, 233, 197, 122, 137, 126, 67, 47, + 213, 203, 244, 155, 250, 45, 253, 182, 94, 174, 87, 232, 149, 122, 149, 126, 71, 175, 214, + 107, 244, 187, 122, 173, 94, 167, 223, 211, 25, 122, 189, 222, 160, 55, 234, 77, 122, 179, + 222, 162, 223, 215, 91, 245, 54, 189, 93, 127, 160, 63, 212, 31, 233, 143, 245, 39, 122, + 135, 254, 84, 127, 166, 63, 215, 95, 232, 157, 250, 75, 253, 149, 254, 90, 239, 210, 187, + 245, 30, 253, 141, 222, 171, 247, 233, 253, 250, 128, 62, 168, 191, 213, 135, 244, 119, 250, + 176, 62, 162, 143, 234, 239, 245, 49, 125, 92, 159, 208, 39, 245, 15, 250, 148, 62, 173, + 207, 232, 179, 250, 71, 125, 78, 159, 215, 23, 244, 79, 250, 162, 254, 89, 255, 162, 47, + 233, 203, 250, 138, 190, 170, 175, 233, 235, 250, 87, 253, 155, 190, 161, 127, 215, 55, 245, + 45, 125, 91, 223, 209, 127, 232, 187, 250, 158, 190, 175, 31, 232, 135, 58, 83, 187, 44, + 176, 136, 69, 45, 102, 113, 75, 88, 210, 82, 150, 182, 44, 203, 199, 114, 88, 190, 150, 159, + 149, 199, 242, 183, 2, 172, 188, 86, 62, 43, 191, 85, 192, 42, 104, 21, 250, 63, 173, 189, + 119, 156, 28, 181, 249, 63, 190, 123, 123, 197, 42, 139, 13, 1, 226, 208, 206, 246, 97, 48, + 216, 192, 142, 164, 105, 193, 137, 61, 187, 90, 17, 99, 7, 59, 84, 155, 20, 179, 62, 47, + 246, 193, 249, 246, 184, 2, 129, 64, 72, 239, 9, 36, 33, 189, 64, 10, 164, 0, 225, 56, 7, + 98, 72, 129, 244, 30, 72, 239, 129, 244, 158, 144, 94, 62, 73, 248, 106, 118, 222, 51, 167, + 219, 151, 255, 249, 189, 94, 191, 131, 153, 71, 210, 104, 159, 183, 52, 210, 243, 72, 122, + 244, 104, 76, 30, 75, 150, 147, 199, 145, 163, 200, 209, 228, 24, 114, 44, 57, 142, 12, 147, + 21, 100, 37, 89, 69, 70, 200, 241, 100, 53, 57, 129, 156, 72, 214, 144, 147, 200, 201, 100, + 45, 89, 71, 78, 33, 167, 146, 211, 72, 141, 120, 68, 16, 73, 20, 241, 73, 64, 66, 18, 145, + 152, 60, 158, 156, 78, 214, 147, 39, 144, 39, 146, 13, 100, 35, 73, 72, 157, 52, 136, 38, + 77, 98, 200, 25, 228, 73, 100, 19, 57, 147, 108, 38, 91, 200, 147, 201, 89, 100, 43, 217, + 70, 158, 66, 206, 38, 231, 144, 115, 201, 121, 228, 124, 114, 1, 217, 78, 118, 144, 11, 201, + 83, 201, 211, 200, 211, 201, 51, 200, 78, 114, 17, 105, 145, 93, 100, 148, 236, 38, 109, + 114, 49, 217, 67, 246, 146, 49, 114, 9, 185, 148, 140, 147, 125, 100, 130, 116, 200, 36, + 185, 140, 76, 145, 105, 50, 67, 102, 201, 229, 228, 10, 242, 76, 114, 37, 185, 138, 60, 139, + 92, 77, 174, 33, 207, 38, 215, 146, 231, 144, 231, 146, 231, 145, 231, 147, 23, 144, 23, + 146, 23, 145, 23, 147, 151, 144, 151, 146, 151, 145, 151, 147, 87, 144, 87, 146, 87, 145, + 235, 200, 245, 228, 213, 228, 53, 228, 181, 228, 6, 242, 58, 242, 122, 242, 6, 242, 70, 242, + 38, 242, 102, 242, 22, 242, 86, 242, 54, 242, 118, 114, 35, 185, 137, 188, 131, 188, 147, + 188, 139, 188, 155, 220, 76, 110, 33, 239, 33, 239, 37, 239, 35, 239, 39, 183, 146, 219, + 200, 237, 228, 3, 228, 14, 50, 71, 238, 36, 243, 100, 63, 249, 32, 185, 139, 220, 77, 62, + 68, 14, 144, 123, 200, 189, 228, 195, 228, 35, 228, 163, 228, 99, 228, 62, 114, 63, 249, 56, + 249, 4, 249, 36, 249, 20, 249, 52, 249, 12, 249, 44, 249, 28, 249, 60, 249, 2, 249, 34, 249, + 18, 249, 50, 249, 10, 121, 128, 60, 72, 190, 74, 190, 70, 190, 78, 190, 65, 190, 73, 190, + 69, 190, 77, 190, 67, 190, 75, 190, 71, 190, 79, 126, 64, 126, 72, 126, 68, 30, 34, 15, 147, + 31, 147, 159, 144, 159, 146, 159, 145, 159, 147, 95, 144, 95, 146, 95, 145, 95, 147, 223, + 144, 223, 146, 223, 145, 223, 147, 63, 144, 63, 146, 71, 200, 159, 200, 159, 201, 95, 200, + 95, 201, 223, 200, 223, 201, 63, 200, 63, 201, 191, 200, 191, 201, 255, 145, 255, 144, 255, + 146, 255, 145, 71, 105, 137, 150, 105, 31, 173, 208, 126, 58, 64, 7, 233, 16, 93, 66, 9, + 165, 148, 81, 78, 171, 244, 16, 186, 148, 46, 163, 135, 210, 195, 232, 99, 232, 225, 244, 8, + 122, 36, 125, 44, 93, 78, 31, 71, 143, 162, 71, 211, 99, 232, 177, 244, 56, 58, 76, 87, 208, + 149, 116, 21, 29, 161, 199, 211, 213, 244, 4, 122, 34, 93, 67, 79, 162, 39, 211, 181, 116, + 29, 61, 133, 158, 74, 79, 163, 53, 234, 81, 65, 37, 85, 212, 167, 1, 13, 105, 68, 99, 250, + 120, 122, 58, 93, 79, 159, 64, 159, 72, 55, 208, 141, 52, 161, 117, 218, 160, 154, 54, 169, + 161, 103, 208, 39, 209, 77, 244, 76, 186, 153, 110, 161, 79, 166, 103, 209, 173, 116, 27, + 125, 10, 61, 155, 158, 67, 207, 165, 231, 209, 243, 233, 5, 116, 59, 221, 65, 47, 164, 79, + 165, 79, 163, 79, 167, 207, 160, 59, 233, 69, 180, 69, 119, 209, 81, 186, 155, 182, 233, + 197, 116, 15, 221, 75, 199, 232, 37, 244, 82, 58, 78, 247, 209, 9, 218, 161, 147, 244, 50, + 58, 69, 167, 233, 12, 157, 165, 151, 211, 43, 232, 51, 233, 149, 244, 42, 250, 44, 122, 53, + 189, 134, 62, 155, 94, 75, 159, 67, 159, 75, 159, 71, 159, 79, 95, 64, 95, 72, 95, 68, 95, + 76, 95, 66, 95, 74, 95, 70, 95, 78, 95, 65, 95, 73, 95, 69, 175, 163, 215, 211, 87, 211, + 215, 208, 215, 210, 27, 232, 235, 232, 235, 233, 27, 232, 27, 233, 155, 232, 155, 233, 91, + 232, 91, 233, 219, 232, 219, 233, 141, 244, 38, 250, 14, 250, 78, 250, 46, 250, 110, 122, + 51, 189, 133, 190, 135, 190, 151, 190, 143, 190, 159, 222, 74, 111, 163, 183, 211, 15, 208, + 59, 232, 28, 189, 147, 206, 211, 253, 244, 131, 244, 46, 122, 55, 253, 16, 61, 64, 239, 161, + 247, 210, 15, 211, 143, 208, 143, 210, 143, 209, 251, 232, 253, 244, 227, 244, 19, 244, 147, + 244, 83, 244, 211, 244, 51, 244, 179, 244, 115, 244, 243, 244, 11, 244, 139, 244, 75, 244, + 203, 244, 43, 244, 1, 250, 32, 253, 42, 253, 26, 253, 58, 253, 6, 253, 38, 253, 22, 253, 54, + 253, 14, 253, 46, 253, 30, 253, 62, 253, 1, 253, 33, 253, 17, 125, 136, 62, 76, 127, 76, + 127, 66, 127, 74, 127, 70, 127, 78, 127, 65, 127, 73, 127, 69, 127, 77, 127, 67, 127, 75, + 127, 71, 127, 79, 255, 64, 255, 72, 31, 161, 127, 162, 127, 166, 127, 161, 127, 165, 127, + 163, 127, 167, 255, 160, 255, 164, 255, 162, 255, 166, 255, 71, 255, 67, 255, 75, 255, 71, + 31, 101, 37, 86, 102, 125, 172, 194, 250, 217, 0, 27, 100, 67, 108, 9, 35, 140, 50, 198, 56, + 171, 178, 67, 216, 82, 182, 140, 29, 202, 14, 99, 143, 97, 135, 179, 35, 216, 145, 236, 177, + 108, 57, 123, 28, 59, 138, 29, 205, 142, 97, 199, 178, 227, 216, 48, 91, 193, 86, 178, 85, + 108, 132, 29, 207, 86, 179, 19, 216, 137, 108, 13, 59, 137, 157, 204, 214, 178, 117, 236, + 20, 118, 42, 59, 141, 213, 152, 199, 4, 147, 76, 49, 159, 5, 44, 100, 17, 139, 217, 227, + 217, 233, 108, 61, 123, 2, 123, 34, 219, 192, 54, 178, 132, 213, 89, 131, 105, 214, 100, + 134, 157, 193, 158, 196, 54, 177, 51, 217, 102, 182, 133, 61, 153, 157, 197, 182, 178, 109, + 236, 41, 236, 108, 118, 14, 59, 151, 157, 199, 206, 103, 23, 176, 237, 108, 7, 187, 144, 61, + 149, 61, 141, 61, 157, 61, 131, 237, 100, 23, 177, 22, 219, 197, 70, 217, 110, 214, 102, 23, + 179, 61, 108, 47, 27, 99, 151, 176, 75, 217, 56, 219, 199, 38, 88, 135, 77, 178, 203, 216, + 20, 155, 102, 51, 108, 150, 93, 206, 174, 96, 207, 100, 87, 178, 171, 216, 179, 216, 213, + 236, 26, 246, 108, 118, 45, 123, 14, 123, 46, 123, 30, 123, 62, 123, 1, 123, 33, 123, 17, + 123, 49, 123, 9, 123, 41, 123, 25, 123, 57, 123, 5, 123, 37, 123, 21, 187, 142, 93, 207, 94, + 205, 94, 195, 94, 203, 110, 96, 175, 99, 175, 103, 111, 96, 111, 100, 111, 98, 111, 102, + 111, 97, 111, 101, 111, 99, 111, 103, 55, 178, 155, 216, 59, 216, 59, 217, 187, 216, 187, + 217, 205, 236, 22, 246, 30, 246, 94, 246, 62, 246, 126, 118, 43, 187, 141, 221, 206, 62, + 192, 238, 96, 115, 236, 78, 54, 207, 246, 179, 15, 178, 187, 216, 221, 236, 67, 236, 0, 187, + 135, 221, 203, 62, 204, 62, 194, 62, 202, 62, 198, 238, 99, 247, 179, 143, 179, 79, 176, 79, + 178, 79, 177, 79, 179, 207, 176, 207, 178, 207, 177, 207, 179, 47, 176, 47, 178, 47, 177, + 47, 179, 175, 176, 7, 216, 131, 236, 171, 236, 107, 236, 235, 236, 27, 236, 155, 236, 91, + 236, 219, 236, 59, 236, 187, 236, 123, 236, 251, 236, 7, 236, 135, 236, 71, 236, 33, 246, + 48, 251, 49, 251, 9, 251, 41, 251, 25, 251, 57, 251, 5, 251, 37, 251, 21, 251, 53, 251, 13, + 251, 45, 251, 29, 251, 61, 251, 3, 251, 35, 123, 132, 253, 137, 253, 153, 253, 133, 253, + 149, 253, 141, 253, 157, 253, 131, 253, 147, 253, 139, 253, 155, 253, 31, 251, 15, 251, 47, + 251, 31, 123, 148, 151, 120, 153, 247, 241, 10, 239, 231, 3, 124, 144, 15, 241, 37, 156, + 112, 202, 25, 231, 188, 202, 15, 225, 75, 249, 50, 126, 40, 63, 140, 63, 134, 31, 206, 143, + 224, 71, 242, 199, 242, 229, 252, 113, 252, 40, 126, 52, 63, 134, 31, 203, 143, 227, 195, + 124, 5, 95, 201, 87, 241, 17, 126, 60, 95, 205, 79, 224, 39, 242, 53, 252, 36, 126, 50, 95, + 203, 215, 241, 83, 248, 169, 252, 52, 94, 227, 30, 23, 92, 114, 197, 125, 30, 240, 144, 71, + 60, 230, 143, 231, 167, 243, 245, 252, 9, 252, 137, 124, 3, 223, 200, 19, 94, 231, 13, 174, + 121, 147, 27, 126, 6, 127, 18, 223, 196, 207, 228, 155, 249, 22, 254, 100, 126, 22, 223, + 202, 183, 241, 167, 240, 179, 249, 57, 252, 92, 126, 30, 63, 159, 95, 192, 183, 243, 29, + 252, 66, 254, 84, 254, 52, 254, 116, 254, 12, 190, 147, 95, 196, 91, 124, 23, 31, 229, 187, + 121, 155, 95, 204, 247, 240, 189, 124, 140, 95, 194, 47, 229, 227, 124, 31, 159, 224, 29, + 62, 201, 47, 227, 83, 124, 154, 207, 240, 89, 126, 57, 191, 130, 63, 147, 95, 201, 175, 226, + 207, 226, 87, 243, 107, 248, 179, 249, 181, 252, 57, 252, 185, 252, 121, 252, 249, 252, 5, + 252, 133, 252, 69, 252, 197, 252, 37, 252, 165, 252, 101, 252, 229, 252, 21, 252, 149, 252, + 85, 252, 58, 126, 61, 127, 53, 127, 13, 127, 45, 191, 129, 191, 142, 191, 158, 191, 129, + 191, 145, 191, 137, 191, 153, 191, 133, 191, 149, 191, 141, 191, 157, 223, 200, 111, 226, + 239, 224, 239, 228, 239, 226, 239, 230, 55, 243, 91, 248, 123, 248, 123, 249, 251, 248, 251, + 249, 173, 252, 54, 126, 59, 255, 0, 191, 131, 207, 241, 59, 249, 60, 223, 207, 63, 200, 239, + 226, 119, 243, 15, 241, 3, 252, 30, 126, 47, 255, 48, 255, 8, 255, 40, 255, 24, 191, 143, + 223, 207, 63, 206, 63, 193, 63, 201, 63, 197, 63, 205, 63, 195, 63, 203, 63, 199, 63, 207, + 191, 192, 191, 200, 191, 196, 191, 204, 191, 194, 31, 224, 15, 242, 175, 242, 175, 241, 175, + 243, 111, 240, 111, 242, 111, 241, 111, 243, 239, 240, 239, 242, 239, 241, 239, 243, 31, + 240, 31, 242, 31, 241, 135, 248, 195, 252, 199, 252, 39, 252, 167, 252, 103, 252, 231, 252, + 23, 252, 151, 252, 87, 252, 215, 252, 55, 252, 183, 252, 119, 252, 247, 252, 15, 252, 143, + 252, 17, 254, 39, 254, 103, 254, 23, 254, 87, 254, 55, 254, 119, 254, 15, 254, 79, 254, 47, + 254, 111, 254, 127, 252, 63, 252, 191, 252, 127, 252, 209, 106, 169, 90, 174, 246, 85, 43, + 213, 254, 234, 64, 117, 176, 58, 84, 93, 82, 37, 85, 90, 101, 85, 94, 173, 86, 15, 169, 46, + 173, 46, 171, 30, 90, 61, 172, 250, 152, 234, 225, 213, 35, 170, 71, 86, 31, 91, 93, 94, + 125, 92, 245, 168, 234, 209, 213, 99, 170, 199, 86, 143, 171, 14, 87, 87, 84, 87, 86, 87, + 85, 71, 170, 199, 87, 87, 87, 79, 168, 158, 88, 93, 83, 61, 169, 122, 114, 117, 109, 117, + 93, 245, 148, 234, 169, 213, 211, 170, 181, 170, 87, 21, 85, 89, 85, 85, 191, 26, 84, 195, + 161, 217, 137, 177, 154, 253, 3, 213, 203, 38, 58, 19, 169, 147, 205, 216, 196, 158, 169, + 246, 204, 236, 212, 68, 246, 160, 238, 87, 38, 199, 188, 52, 44, 60, 17, 244, 55, 103, 167, + 58, 221, 7, 158, 231, 101, 25, 18, 131, 140, 225, 96, 178, 107, 170, 125, 121, 123, 176, + 213, 37, 67, 73, 103, 79, 103, 162, 125, 233, 80, 43, 163, 131, 122, 180, 53, 213, 153, 24, + 220, 221, 37, 224, 81, 27, 106, 34, 87, 27, 185, 154, 89, 174, 118, 70, 182, 180, 70, 103, + 103, 218, 131, 227, 25, 217, 146, 37, 142, 119, 73, 255, 150, 221, 157, 153, 254, 113, 123, + 27, 60, 43, 123, 60, 145, 145, 179, 178, 92, 19, 14, 142, 95, 3, 245, 6, 207, 206, 50, 77, + 101, 228, 236, 44, 239, 84, 70, 206, 201, 18, 167, 187, 36, 251, 69, 32, 64, 229, 224, 185, + 89, 166, 153, 46, 25, 56, 111, 202, 190, 168, 129, 217, 244, 158, 229, 8, 129, 17, 122, 131, + 23, 102, 124, 174, 114, 248, 132, 117, 208, 198, 192, 25, 173, 125, 251, 90, 3, 231, 238, + 109, 207, 180, 42, 219, 246, 142, 13, 180, 198, 39, 247, 182, 6, 118, 183, 199, 103, 90, 67, + 237, 201, 233, 177, 113, 203, 125, 122, 108, 207, 190, 86, 101, 166, 53, 91, 153, 220, 59, + 86, 157, 157, 216, 221, 158, 154, 30, 237, 76, 181, 119, 239, 26, 39, 237, 103, 142, 142, + 183, 246, 165, 161, 137, 233, 217, 201, 246, 212, 88, 103, 106, 112, 178, 61, 109, 217, 145, + 214, 212, 84, 231, 138, 241, 246, 197, 51, 67, 221, 208, 236, 36, 237, 210, 169, 212, 193, + 43, 123, 152, 186, 231, 100, 161, 93, 157, 153, 189, 4, 217, 118, 79, 240, 34, 180, 107, + 186, 77, 59, 83, 51, 123, 211, 246, 104, 141, 243, 174, 215, 206, 116, 187, 235, 9, 196, + 218, 151, 205, 142, 93, 222, 26, 111, 79, 140, 182, 7, 246, 118, 102, 167, 219, 85, 219, + 210, 227, 157, 61, 99, 163, 173, 241, 137, 206, 12, 77, 51, 239, 153, 106, 141, 207, 76, 22, + 193, 93, 51, 221, 190, 227, 103, 29, 205, 82, 1, 218, 200, 168, 135, 116, 79, 129, 70, 160, + 120, 46, 144, 46, 16, 151, 136, 75, 196, 125, 252, 222, 247, 64, 193, 223, 151, 160, 200, + 239, 251, 160, 1, 104, 8, 10, 60, 63, 6, 77, 64, 235, 160, 57, 142, 6, 109, 130, 154, 140, + 6, 192, 15, 128, 31, 0, 63, 0, 126, 0, 252, 0, 248, 1, 240, 3, 224, 7, 192, 15, 128, 31, 0, + 63, 0, 126, 96, 241, 39, 119, 141, 119, 70, 47, 29, 178, 109, 147, 210, 129, 44, 54, 126, + 113, 70, 167, 102, 16, 159, 153, 222, 219, 218, 221, 30, 232, 222, 135, 118, 95, 218, 165, + 228, 226, 177, 241, 113, 219, 107, 58, 207, 164, 89, 104, 202, 182, 228, 208, 204, 212, 88, + 107, 207, 236, 100, 70, 167, 16, 223, 61, 145, 209, 241, 139, 7, 71, 199, 166, 70, 199, 219, + 100, 108, 226, 242, 93, 179, 246, 71, 51, 105, 8, 105, 211, 251, 198, 108, 255, 106, 141, + 182, 109, 199, 184, 188, 136, 84, 166, 103, 39, 6, 47, 110, 239, 179, 93, 163, 63, 189, 13, + 76, 79, 90, 240, 254, 209, 241, 217, 93, 3, 123, 219, 45, 11, 177, 123, 172, 181, 175, 51, + 177, 155, 237, 155, 157, 70, 103, 105, 31, 226, 132, 109, 111, 238, 219, 116, 102, 223, 216, + 37, 108, 162, 53, 217, 153, 158, 153, 234, 76, 238, 109, 15, 238, 27, 155, 232, 202, 99, + 123, 212, 254, 52, 83, 65, 181, 236, 53, 122, 30, 94, 111, 130, 215, 158, 224, 181, 37, 120, + 109, 13, 67, 59, 147, 237, 137, 172, 252, 67, 201, 190, 214, 104, 170, 12, 90, 25, 101, 141, + 180, 54, 179, 251, 46, 30, 111, 63, 147, 141, 46, 132, 51, 17, 173, 37, 160, 245, 161, 38, + 126, 215, 206, 232, 96, 51, 83, 112, 237, 76, 193, 101, 42, 44, 0, 13, 217, 25, 14, 215, 61, + 189, 92, 5, 212, 131, 240, 64, 161, 88, 132, 100, 79, 114, 126, 183, 119, 33, 220, 255, 164, + 93, 173, 169, 254, 189, 246, 54, 184, 105, 102, 108, 124, 119, 123, 112, 172, 75, 134, 54, + 161, 84, 99, 40, 213, 166, 172, 84, 99, 89, 169, 54, 65, 161, 142, 101, 148, 157, 233, 112, + 191, 164, 183, 84, 18, 165, 151, 33, 191, 212, 170, 253, 246, 196, 120, 107, 98, 247, 216, + 40, 18, 161, 179, 50, 81, 171, 121, 202, 7, 13, 42, 205, 137, 61, 149, 182, 213, 124, 91, + 81, 148, 14, 138, 178, 53, 43, 74, 199, 121, 65, 62, 32, 252, 144, 157, 227, 20, 101, 218, + 169, 232, 185, 105, 69, 103, 210, 138, 158, 151, 85, 116, 54, 171, 232, 121, 224, 62, 11, + 238, 231, 101, 220, 103, 51, 238, 231, 161, 162, 179, 168, 232, 5, 14, 247, 43, 156, 240, + 14, 39, 124, 229, 66, 120, 192, 234, 217, 61, 211, 52, 73, 53, 120, 87, 81, 91, 93, 153, 7, + 135, 146, 102, 70, 91, 237, 46, 101, 91, 167, 199, 91, 86, 160, 186, 225, 206, 66, 152, 180, + 210, 206, 59, 222, 30, 107, 13, 94, 96, 149, 157, 45, 219, 21, 25, 185, 32, 27, 1, 174, 200, + 114, 93, 176, 123, 172, 61, 213, 158, 30, 155, 38, 87, 228, 161, 193, 29, 89, 198, 43, 187, + 164, 122, 217, 172, 229, 147, 214, 202, 170, 218, 172, 167, 215, 100, 179, 127, 124, 108, + 170, 69, 218, 211, 51, 182, 161, 173, 136, 16, 91, 203, 118, 170, 201, 247, 242, 153, 189, + 182, 173, 178, 240, 52, 187, 120, 236, 242, 60, 204, 167, 45, 139, 137, 252, 193, 104, 199, + 14, 52, 173, 209, 209, 246, 196, 204, 178, 238, 16, 226, 36, 12, 204, 116, 38, 58, 211, 213, + 188, 56, 221, 24, 77, 210, 145, 168, 27, 228, 205, 108, 32, 234, 70, 150, 52, 103, 178, 84, + 178, 169, 131, 16, 223, 186, 47, 245, 239, 205, 158, 243, 243, 156, 204, 116, 235, 190, 246, + 158, 44, 211, 161, 99, 54, 251, 34, 132, 129, 46, 66, 127, 221, 142, 85, 3, 186, 59, 224, 1, + 167, 255, 194, 116, 52, 180, 56, 253, 41, 196, 192, 230, 214, 228, 100, 203, 14, 254, 251, + 118, 237, 110, 245, 61, 121, 182, 239, 172, 217, 190, 237, 99, 67, 192, 236, 219, 54, 86, + 57, 123, 111, 103, 224, 156, 238, 24, 121, 110, 107, 118, 8, 248, 149, 198, 222, 177, 202, + 182, 233, 49, 190, 201, 193, 93, 138, 135, 121, 156, 182, 22, 42, 217, 118, 43, 217, 206, + 43, 57, 150, 87, 242, 240, 217, 197, 63, 237, 38, 246, 239, 74, 11, 191, 39, 29, 195, 251, + 175, 74, 11, 157, 70, 103, 210, 193, 188, 63, 253, 225, 192, 165, 221, 162, 143, 103, 69, + 159, 152, 237, 123, 230, 152, 21, 142, 110, 185, 43, 83, 123, 59, 131, 221, 129, 221, 170, + 0, 148, 120, 212, 150, 216, 6, 7, 58, 233, 75, 227, 238, 251, 90, 218, 3, 206, 59, 238, 27, + 159, 117, 223, 120, 167, 120, 227, 93, 73, 83, 53, 15, 84, 128, 74, 80, 5, 234, 131, 6, 160, + 33, 104, 4, 26, 131, 38, 160, 117, 208, 6, 104, 19, 52, 155, 249, 169, 108, 8, 183, 20, 184, + 30, 112, 61, 224, 122, 192, 245, 128, 11, 149, 169, 60, 224, 122, 192, 245, 128, 235, 1, + 215, 3, 174, 7, 92, 79, 131, 2, 223, 3, 62, 84, 171, 130, 106, 85, 80, 173, 74, 0, 95, 0, + 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 0, 95, 2, 95, 2, + 95, 2, 95, 2, 95, 2, 95, 2, 31, 74, 87, 73, 224, 75, 224, 75, 224, 75, 224, 67, 255, 42, + 232, 95, 37, 129, 47, 129, 47, 129, 175, 128, 175, 128, 175, 128, 175, 128, 175, 128, 15, + 253, 173, 20, 240, 21, 240, 21, 240, 21, 240, 21, 240, 21, 240, 21, 240, 21, 240, 21, 240, + 21, 240, 125, 224, 250, 192, 245, 129, 235, 3, 215, 7, 46, 70, 2, 229, 3, 215, 7, 174, 15, + 92, 31, 184, 62, 112, 125, 224, 250, 192, 243, 129, 23, 163, 190, 113, 54, 246, 215, 188, + 124, 78, 144, 241, 247, 235, 53, 80, 15, 84, 128, 74, 80, 5, 234, 131, 230, 191, 11, 65, 35, + 208, 24, 180, 14, 218, 0, 213, 160, 77, 208, 172, 92, 126, 3, 184, 13, 224, 54, 128, 219, 0, + 174, 198, 115, 141, 231, 26, 207, 117, 254, 28, 229, 210, 40, 151, 70, 185, 52, 202, 165, + 81, 46, 141, 114, 233, 4, 20, 229, 211, 40, 159, 70, 249, 52, 202, 167, 81, 190, 38, 240, + 155, 192, 111, 2, 191, 9, 252, 38, 240, 155, 192, 111, 2, 191, 9, 252, 38, 240, 155, 192, + 111, 2, 223, 128, 175, 1, 95, 3, 190, 6, 124, 77, 54, 5, 174, 37, 9, 67, 253, 210, 119, 131, + 112, 146, 182, 151, 19, 142, 16, 110, 164, 239, 127, 233, 66, 184, 145, 183, 135, 169, 103, + 242, 110, 105, 2, 90, 7, 109, 128, 106, 208, 38, 168, 201, 168, 196, 239, 50, 57, 181, 84, + 128, 74, 80, 5, 234, 131, 6, 160, 17, 40, 240, 37, 112, 37, 112, 37, 112, 37, 240, 20, 112, + 20, 112, 20, 248, 43, 240, 87, 224, 155, 201, 159, 165, 224, 175, 192, 95, 129, 191, 2, 127, + 5, 254, 10, 245, 82, 57, 78, 182, 4, 169, 97, 41, 101, 215, 240, 160, 77, 208, 172, 221, 3, + 232, 237, 0, 250, 52, 128, 222, 12, 160, 47, 3, 232, 143, 0, 242, 30, 64, 222, 3, 200, 123, + 0, 121, 15, 32, 239, 1, 86, 211, 1, 228, 62, 128, 220, 7, 1, 210, 3, 164, 7, 121, 186, 4, + 85, 160, 62, 104, 0, 26, 130, 70, 160, 49, 104, 2, 138, 114, 5, 122, 201, 158, 241, 43, 39, + 247, 134, 161, 202, 3, 224, 164, 125, 130, 132, 240, 244, 44, 197, 0, 203, 32, 135, 9, 240, + 147, 200, 203, 3, 34, 15, 200, 60, 144, 179, 141, 124, 134, 10, 166, 47, 37, 79, 12, 243, + 64, 148, 7, 98, 4, 226, 90, 30, 200, 153, 199, 57, 243, 56, 103, 30, 43, 134, 151, 125, 170, + 93, 31, 231, 137, 121, 169, 226, 156, 121, 140, 119, 16, 54, 57, 232, 169, 23, 143, 77, 180, + 138, 200, 216, 196, 216, 76, 17, 217, 215, 222, 61, 150, 253, 46, 170, 201, 60, 160, 242, + 128, 159, 7, 240, 154, 163, 128, 131, 58, 44, 109, 100, 129, 165, 141, 164, 44, 179, 236, + 113, 196, 65, 187, 217, 179, 196, 36, 230, 160, 14, 15, 27, 89, 224, 97, 35, 11, 60, 18, + 131, 68, 227, 102, 55, 110, 118, 227, 100, 111, 52, 56, 168, 147, 93, 251, 221, 8, 42, 35, + 242, 234, 137, 188, 122, 34, 200, 3, 97, 30, 136, 242, 0, 26, 40, 146, 181, 60, 224, 229, 1, + 145, 7, 242, 23, 39, 115, 206, 50, 231, 44, 115, 206, 50, 231, 12, 77, 208, 200, 70, 36, 75, + 51, 205, 210, 200, 122, 190, 165, 30, 104, 206, 93, 229, 76, 179, 177, 87, 212, 50, 157, + 101, 105, 29, 20, 50, 43, 32, 179, 48, 115, 212, 2, 196, 3, 200, 56, 204, 2, 53, 152, 5, + 106, 65, 158, 15, 50, 17, 249, 121, 25, 253, 188, 246, 126, 94, 251, 32, 175, 61, 138, 103, + 76, 35, 79, 200, 139, 23, 228, 117, 14, 242, 58, 7, 57, 191, 32, 231, 23, 228, 252, 194, + 156, 95, 152, 191, 205, 48, 175, 111, 152, 191, 205, 92, 68, 163, 48, 231, 28, 230, 156, + 195, 156, 115, 152, 115, 14, 115, 206, 81, 206, 57, 151, 210, 40, 151, 210, 40, 151, 210, + 40, 151, 210, 40, 202, 57, 71, 57, 231, 92, 68, 163, 92, 68, 163, 92, 68, 163, 92, 68, 163, + 108, 210, 96, 52, 148, 181, 150, 38, 127, 160, 6, 199, 199, 198, 199, 91, 123, 187, 233, + 205, 8, 202, 76, 8, 14, 234, 136, 129, 144, 72, 148, 110, 162, 66, 162, 114, 19, 125, 36, + 250, 110, 34, 36, 81, 184, 146, 40, 92, 73, 20, 174, 36, 138, 16, 137, 161, 203, 3, 226, 41, + 34, 151, 71, 228, 242, 136, 92, 30, 16, 92, 17, 187, 60, 18, 36, 38, 46, 143, 196, 229, 145, + 184, 60, 234, 72, 172, 187, 217, 235, 110, 246, 186, 155, 29, 210, 44, 92, 105, 182, 17, 39, + 123, 195, 205, 174, 145, 168, 221, 236, 218, 205, 174, 221, 236, 80, 144, 194, 85, 144, 194, + 85, 144, 162, 233, 102, 135, 38, 18, 198, 169, 191, 172, 113, 80, 55, 209, 67, 162, 231, 38, + 162, 23, 72, 183, 23, 72, 244, 2, 41, 157, 34, 216, 200, 66, 17, 108, 100, 161, 8, 18, 253, + 67, 42, 55, 187, 114, 179, 43, 55, 59, 122, 142, 244, 221, 236, 190, 155, 221, 119, 179, + 163, 79, 73, 183, 79, 73, 183, 79, 73, 183, 79, 73, 244, 41, 25, 186, 217, 67, 55, 123, 232, + 102, 71, 111, 147, 110, 111, 147, 110, 111, 147, 110, 111, 147, 232, 109, 210, 29, 38, 164, + 59, 76, 72, 119, 152, 144, 232, 135, 210, 237, 135, 210, 237, 135, 210, 237, 135, 10, 45, + 164, 60, 39, 187, 141, 44, 100, 183, 17, 39, 59, 218, 78, 9, 55, 187, 112, 179, 11, 55, 59, + 90, 85, 185, 173, 170, 220, 86, 85, 110, 171, 42, 180, 170, 114, 91, 85, 185, 173, 170, 220, + 86, 85, 104, 85, 229, 182, 170, 114, 91, 85, 185, 173, 170, 208, 170, 202, 109, 85, 229, + 182, 170, 114, 91, 85, 161, 85, 149, 171, 41, 234, 144, 148, 122, 211, 73, 84, 104, 80, 229, + 142, 238, 10, 205, 166, 92, 37, 161, 208, 56, 202, 109, 28, 229, 54, 142, 202, 26, 103, 25, + 106, 219, 213, 149, 99, 211, 157, 241, 69, 9, 233, 111, 157, 4, 217, 155, 67, 246, 230, 240, + 123, 115, 248, 189, 57, 194, 222, 28, 89, 173, 179, 169, 160, 87, 19, 94, 17, 18, 69, 72, + 22, 33, 85, 132, 252, 34, 20, 20, 161, 176, 8, 69, 69, 40, 206, 67, 178, 86, 132, 10, 12, + 89, 96, 200, 2, 67, 22, 24, 178, 192, 144, 5, 134, 44, 48, 100, 129, 33, 11, 12, 85, 96, + 168, 2, 67, 21, 24, 170, 192, 80, 5, 134, 42, 48, 84, 129, 161, 10, 12, 85, 96, 168, 2, 195, + 47, 48, 252, 2, 195, 47, 48, 252, 2, 195, 47, 48, 252, 2, 195, 47, 48, 252, 2, 195, 47, 48, + 252, 2, 35, 40, 48, 130, 2, 35, 40, 48, 130, 2, 35, 40, 48, 130, 2, 35, 40, 48, 130, 2, 35, + 40, 48, 130, 2, 35, 44, 48, 194, 2, 35, 44, 48, 194, 2, 35, 44, 48, 194, 2, 35, 44, 48, 194, + 2, 35, 44, 48, 194, 2, 35, 42, 48, 162, 2, 35, 42, 48, 162, 2, 35, 42, 48, 162, 2, 35, 42, + 48, 162, 2, 35, 42, 48, 162, 2, 35, 46, 48, 226, 2, 35, 46, 48, 226, 2, 35, 46, 48, 226, 2, + 35, 46, 48, 226, 2, 35, 46, 48, 226, 28, 195, 171, 213, 138, 144, 87, 132, 68, 17, 146, 69, + 72, 21, 33, 191, 8, 5, 69, 40, 44, 66, 81, 17, 42, 48, 188, 2, 195, 43, 48, 188, 2, 195, 43, + 48, 188, 2, 195, 43, 48, 188, 2, 195, 43, 48, 188, 2, 195, 43, 48, 68, 129, 81, 200, 185, + 87, 200, 185, 87, 200, 185, 87, 200, 185, 87, 200, 185, 87, 200, 185, 87, 200, 185, 87, 200, + 185, 39, 226, 129, 173, 123, 59, 83, 19, 3, 157, 238, 253, 188, 238, 125, 54, 189, 231, 57, + 10, 185, 246, 10, 185, 246, 10, 185, 246, 10, 185, 246, 10, 185, 246, 100, 92, 221, 219, + 233, 92, 218, 218, 213, 185, 188, 61, 218, 217, 183, 43, 79, 47, 100, 219, 43, 100, 219, 43, + 100, 219, 43, 100, 219, 179, 178, 221, 221, 18, 89, 244, 219, 2, 167, 144, 109, 47, 51, 33, + 136, 90, 82, 95, 210, 153, 104, 207, 236, 29, 155, 218, 77, 102, 174, 232, 116, 3, 211, 121, + 166, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, + 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 66, 176, + 189, 66, 176, 189, 66, 176, 189, 66, 176, 189, 84, 176, 211, 93, 145, 110, 101, 187, 59, 40, + 110, 181, 67, 193, 119, 119, 102, 118, 181, 199, 59, 87, 44, 74, 46, 96, 10, 217, 246, 10, + 217, 246, 10, 217, 246, 10, 217, 246, 10, 217, 246, 10, 217, 246, 10, 217, 246, 10, 217, + 246, 10, 217, 246, 10, 217, 246, 10, 217, 246, 10, 217, 246, 162, 174, 25, 195, 107, 38, 53, + 80, 15, 84, 128, 74, 80, 5, 234, 131, 6, 160, 249, 239, 35, 208, 4, 180, 14, 218, 0, 213, + 160, 77, 80, 147, 209, 58, 112, 235, 192, 173, 3, 183, 14, 220, 58, 112, 235, 192, 173, 3, + 183, 14, 220, 58, 112, 51, 51, 155, 165, 192, 175, 3, 191, 14, 252, 58, 240, 235, 192, 175, + 3, 191, 1, 252, 6, 240, 27, 192, 111, 0, 191, 1, 252, 6, 240, 27, 192, 111, 0, 191, 1, 252, + 6, 240, 27, 192, 109, 0, 183, 1, 220, 6, 112, 27, 192, 213, 192, 213, 192, 213, 192, 213, + 192, 213, 192, 213, 192, 213, 192, 213, 192, 213, 192, 213, 192, 213, 168, 183, 6, 190, 6, + 190, 6, 190, 6, 190, 6, 126, 19, 248, 77, 224, 55, 129, 223, 4, 126, 19, 248, 77, 224, 55, + 129, 223, 4, 126, 19, 248, 77, 224, 55, 129, 223, 4, 126, 19, 248, 77, 224, 55, 129, 223, 4, + 190, 1, 190, 1, 190, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 201, 204, 108, 94, 246, 94, 45, + 109, 130, 102, 102, 62, 15, 230, 106, 15, 230, 106, 15, 230, 106, 15, 230, 106, 15, 230, + 106, 15, 230, 106, 15, 230, 106, 15, 230, 106, 15, 230, 106, 15, 230, 106, 15, 230, 106, 15, + 230, 106, 79, 55, 186, 230, 93, 105, 135, 86, 89, 83, 167, 142, 182, 38, 33, 73, 34, 150, + 206, 147, 70, 250, 196, 137, 215, 210, 120, 151, 131, 138, 177, 225, 16, 99, 195, 33, 198, + 6, 67, 140, 13, 134, 24, 27, 10, 49, 54, 20, 98, 108, 40, 196, 216, 200, 72, 240, 251, 4, + 191, 79, 176, 209, 0, 151, 38, 133, 141, 4, 133, 141, 4, 133, 141, 4, 133, 141, 4, 133, 141, + 2, 133, 141, 2, 85, 7, 30, 54, 12, 188, 40, 227, 35, 242, 13, 14, 24, 208, 85, 51, 55, 112, + 98, 102, 30, 184, 203, 214, 192, 44, 142, 44, 204, 238, 3, 51, 100, 53, 223, 169, 86, 177, + 167, 26, 240, 84, 171, 215, 237, 160, 52, 118, 21, 235, 70, 210, 29, 225, 217, 201, 106, 17, + 78, 29, 125, 24, 178, 93, 222, 158, 154, 89, 146, 134, 47, 238, 204, 78, 101, 188, 60, 127, + 224, 138, 214, 244, 120, 139, 92, 209, 186, 252, 202, 189, 173, 125, 87, 181, 6, 167, 247, + 181, 198, 199, 47, 95, 186, 176, 67, 126, 106, 107, 170, 181, 43, 203, 142, 45, 157, 0, 91, + 58, 1, 182, 116, 2, 56, 61, 5, 33, 76, 221, 185, 73, 56, 20, 85, 208, 238, 148, 28, 70, 217, + 80, 34, 85, 46, 74, 245, 145, 234, 47, 74, 13, 144, 26, 44, 74, 13, 145, 26, 46, 74, 141, + 144, 26, 45, 74, 197, 106, 38, 116, 23, 161, 161, 187, 8, 13, 221, 69, 104, 136, 117, 78, + 232, 174, 115, 66, 119, 157, 19, 186, 139, 208, 16, 198, 144, 208, 53, 134, 132, 174, 49, + 36, 116, 141, 33, 33, 140, 33, 161, 107, 12, 9, 93, 99, 72, 232, 26, 67, 66, 24, 67, 66, + 215, 24, 18, 186, 198, 144, 208, 53, 134, 132, 176, 110, 132, 174, 157, 53, 116, 59, 82, + 232, 118, 164, 8, 118, 143, 168, 230, 90, 130, 107, 174, 37, 184, 230, 102, 199, 122, 59, + 114, 215, 219, 145, 187, 222, 142, 220, 245, 118, 132, 245, 118, 228, 174, 183, 35, 119, + 189, 29, 185, 235, 237, 8, 235, 237, 200, 93, 111, 71, 238, 122, 59, 114, 215, 219, 17, 214, + 219, 145, 187, 222, 142, 220, 245, 118, 228, 174, 183, 35, 172, 183, 35, 119, 189, 29, 185, + 235, 237, 200, 93, 111, 71, 88, 64, 71, 174, 89, 196, 70, 156, 236, 174, 89, 36, 194, 42, + 58, 114, 87, 209, 81, 92, 5, 117, 123, 99, 148, 44, 1, 205, 19, 234, 200, 86, 95, 148, 13, + 253, 36, 106, 184, 28, 209, 27, 34, 237, 38, 66, 121, 68, 238, 178, 62, 50, 96, 106, 92, + 166, 113, 173, 10, 186, 40, 21, 50, 27, 97, 155, 39, 134, 204, 198, 139, 100, 54, 134, 204, + 198, 139, 100, 54, 86, 72, 85, 139, 82, 33, 201, 241, 34, 73, 142, 33, 201, 241, 34, 73, + 142, 33, 201, 241, 34, 73, 142, 241, 238, 226, 69, 239, 46, 134, 104, 198, 174, 104, 198, + 174, 104, 198, 174, 104, 198, 16, 205, 216, 21, 205, 216, 21, 205, 216, 21, 205, 24, 175, + 60, 118, 69, 51, 118, 69, 51, 118, 69, 51, 70, 99, 196, 174, 104, 198, 174, 104, 198, 174, + 104, 198, 104, 166, 216, 181, 83, 198, 174, 194, 143, 93, 59, 101, 140, 6, 140, 23, 53, 96, + 2, 129, 77, 92, 129, 77, 92, 129, 77, 92, 129, 77, 160, 133, 19, 72, 98, 226, 74, 98, 226, + 74, 98, 226, 74, 98, 2, 73, 76, 92, 73, 76, 92, 73, 76, 92, 73, 76, 32, 137, 137, 43, 137, + 137, 43, 137, 137, 43, 137, 9, 36, 49, 113, 37, 49, 113, 37, 49, 113, 37, 49, 129, 229, 43, + 113, 45, 95, 137, 107, 249, 74, 92, 203, 87, 130, 238, 148, 44, 234, 78, 9, 6, 134, 100, + 209, 192, 144, 160, 59, 37, 110, 119, 74, 220, 238, 148, 184, 221, 41, 65, 119, 74, 220, + 238, 148, 184, 221, 41, 113, 187, 83, 130, 238, 148, 184, 221, 41, 113, 187, 83, 226, 118, + 167, 4, 221, 41, 113, 187, 83, 226, 118, 167, 196, 237, 78, 9, 186, 83, 226, 118, 167, 196, + 237, 78, 137, 219, 157, 234, 232, 56, 117, 183, 227, 212, 221, 142, 83, 119, 59, 78, 29, + 154, 190, 238, 106, 250, 186, 171, 233, 235, 174, 166, 175, 163, 127, 213, 221, 254, 85, + 119, 251, 87, 221, 237, 95, 117, 244, 175, 186, 219, 191, 234, 110, 255, 170, 187, 253, 171, + 142, 254, 85, 119, 251, 87, 221, 237, 95, 117, 183, 127, 213, 209, 191, 234, 110, 255, 170, + 187, 253, 171, 238, 246, 175, 58, 250, 87, 221, 237, 95, 117, 183, 127, 213, 221, 254, 85, + 199, 192, 80, 119, 7, 6, 27, 113, 178, 187, 3, 67, 29, 3, 67, 221, 181, 151, 215, 93, 123, + 121, 221, 181, 151, 215, 49, 85, 169, 187, 83, 149, 186, 59, 85, 169, 187, 83, 149, 58, 58, + 112, 61, 113, 205, 188, 232, 166, 245, 186, 155, 136, 206, 88, 119, 59, 99, 221, 237, 140, + 117, 183, 51, 214, 117, 21, 212, 149, 151, 58, 102, 23, 117, 119, 118, 81, 119, 103, 23, + 245, 69, 187, 184, 232, 115, 13, 183, 207, 53, 220, 30, 213, 112, 251, 75, 195, 221, 67, + 107, 96, 92, 105, 44, 26, 87, 26, 104, 218, 134, 187, 137, 214, 64, 3, 54, 2, 55, 17, 205, + 212, 112, 13, 224, 13, 52, 70, 195, 29, 165, 27, 120, 229, 13, 215, 214, 221, 72, 0, 159, + 44, 130, 199, 155, 109, 184, 111, 182, 129, 87, 213, 88, 244, 170, 26, 16, 207, 134, 43, + 158, 13, 87, 60, 27, 174, 120, 54, 160, 237, 27, 139, 180, 189, 198, 11, 212, 11, 219, 82, + 166, 222, 132, 211, 8, 156, 113, 2, 237, 85, 65, 23, 253, 20, 99, 184, 94, 52, 134, 107, + 140, 225, 122, 209, 24, 142, 245, 91, 128, 117, 91, 160, 115, 206, 112, 65, 192, 186, 45, + 192, 186, 45, 192, 186, 45, 128, 155, 81, 0, 55, 163, 0, 110, 70, 1, 220, 140, 2, 184, 25, + 5, 112, 51, 10, 224, 102, 20, 192, 205, 40, 128, 155, 81, 0, 55, 163, 0, 110, 70, 65, 94, + 51, 172, 146, 130, 124, 149, 4, 55, 163, 160, 9, 252, 38, 112, 13, 164, 192, 184, 106, 220, + 184, 106, 220, 184, 106, 220, 160, 21, 141, 171, 198, 141, 171, 198, 141, 171, 198, 13, 36, + 199, 184, 146, 99, 92, 201, 49, 174, 228, 152, 188, 80, 240, 205, 201, 135, 175, 134, 171, + 60, 27, 153, 242, 196, 50, 55, 40, 12, 246, 65, 97, 176, 15, 10, 163, 94, 80, 24, 245, 2, + 149, 249, 65, 117, 7, 130, 206, 84, 103, 116, 180, 243, 152, 60, 158, 22, 13, 105, 25, 174, + 7, 31, 33, 175, 201, 38, 91, 51, 173, 189, 167, 94, 49, 182, 187, 125, 58, 210, 204, 194, + 94, 73, 216, 187, 69, 19, 246, 110, 209, 132, 189, 91, 52, 97, 239, 22, 77, 216, 187, 69, + 19, 186, 91, 52, 117, 191, 103, 139, 6, 9, 78, 142, 160, 55, 71, 208, 155, 35, 236, 205, 17, + 246, 230, 136, 122, 115, 68, 69, 14, 52, 147, 58, 117, 118, 106, 247, 44, 34, 97, 55, 226, + 20, 217, 235, 173, 131, 179, 237, 235, 193, 9, 192, 139, 96, 2, 137, 96, 2, 137, 96, 2, 137, + 96, 2, 137, 96, 2, 137, 96, 2, 137, 96, 2, 137, 96, 2, 137, 96, 2, 137, 96, 2, 137, 114, 3, + 1, 60, 235, 49, 5, 247, 34, 152, 96, 224, 225, 232, 197, 192, 133, 129, 195, 139, 129, 23, + 3, 15, 6, 15, 15, 6, 15, 15, 222, 67, 94, 12, 60, 24, 64, 60, 24, 64, 60, 24, 64, 60, 24, + 64, 188, 56, 199, 131, 201, 7, 6, 17, 15, 6, 17, 47, 1, 94, 2, 188, 4, 120, 9, 240, 18, 224, + 37, 192, 75, 128, 151, 0, 47, 1, 94, 2, 60, 24, 88, 60, 24, 84, 60, 24, 84, 60, 24, 84, 60, + 120, 102, 122, 240, 204, 244, 224, 153, 233, 193, 51, 211, 131, 193, 197, 131, 193, 197, + 131, 193, 197, 203, 13, 46, 240, 208, 244, 224, 161, 233, 213, 115, 60, 212, 15, 30, 154, + 30, 60, 52, 61, 120, 104, 122, 240, 208, 244, 26, 192, 111, 0, 191, 1, 252, 6, 240, 27, 192, + 111, 228, 166, 51, 224, 55, 128, 223, 0, 62, 84, 163, 7, 213, 232, 105, 3, 3, 86, 152, 155, + 186, 178, 116, 168, 74, 15, 170, 210, 131, 170, 244, 160, 42, 61, 168, 74, 15, 170, 210, + 131, 170, 244, 160, 42, 61, 168, 74, 15, 170, 210, 131, 170, 244, 160, 42, 189, 38, 202, 3, + 149, 233, 53, 81, 158, 38, 222, 7, 60, 55, 61, 120, 110, 122, 240, 220, 244, 224, 185, 233, + 193, 139, 206, 131, 23, 157, 103, 128, 111, 128, 111, 128, 15, 83, 162, 192, 105, 66, 1, 15, + 116, 1, 15, 116, 1, 15, 116, 1, 15, 116, 1, 15, 116, 1, 215, 52, 1, 15, 116, 1, 15, 116, 81, + 203, 249, 37, 160, 117, 208, 6, 168, 6, 109, 130, 194, 208, 6, 79, 116, 1, 79, 116, 1, 79, + 116, 1, 79, 116, 1, 79, 116, 1, 79, 116, 1, 143, 97, 225, 133, 252, 28, 231, 112, 4, 159, + 118, 34, 200, 129, 146, 192, 135, 82, 192, 39, 93, 192, 39, 93, 192, 39, 93, 192, 183, 82, + 192, 39, 93, 192, 23, 93, 192, 23, 93, 192, 23, 93, 192, 23, 93, 192, 23, 93, 192, 23, 93, + 192, 23, 93, 192, 23, 93, 192, 23, 93, 136, 58, 122, 144, 92, 212, 131, 4, 124, 211, 5, 124, + 211, 5, 124, 211, 5, 124, 211, 5, 124, 211, 5, 124, 211, 5, 124, 211, 5, 124, 211, 5, 124, + 57, 5, 12, 119, 2, 190, 156, 194, 207, 159, 163, 188, 48, 248, 9, 248, 112, 11, 248, 112, + 11, 248, 112, 11, 248, 110, 11, 248, 110, 11, 248, 110, 11, 31, 229, 130, 15, 183, 128, 15, + 183, 128, 175, 168, 128, 175, 168, 128, 175, 168, 128, 175, 168, 128, 175, 168, 128, 175, + 168, 128, 175, 168, 128, 175, 168, 128, 175, 168, 128, 175, 168, 128, 175, 168, 128, 175, + 168, 8, 128, 31, 0, 63, 0, 126, 0, 124, 24, 46, 69, 8, 252, 16, 248, 33, 240, 67, 224, 195, + 195, 84, 132, 192, 15, 129, 31, 2, 63, 4, 126, 8, 124, 156, 243, 20, 33, 240, 67, 224, 135, + 192, 15, 129, 143, 145, 69, 96, 100, 17, 24, 89, 4, 70, 22, 129, 145, 69, 96, 100, 17, 24, + 89, 4, 70, 22, 129, 145, 69, 96, 100, 17, 24, 89, 4, 70, 22, 129, 145, 69, 96, 100, 17, 24, + 89, 68, 110, 146, 198, 8, 35, 48, 194, 8, 152, 210, 5, 70, 26, 129, 145, 70, 96, 164, 17, + 24, 105, 4, 70, 26, 129, 145, 70, 96, 164, 17, 24, 105, 4, 70, 26, 129, 145, 70, 96, 164, + 17, 24, 105, 4, 70, 26, 145, 0, 31, 166, 10, 129, 145, 71, 96, 228, 17, 24, 121, 4, 70, 30, + 129, 145, 71, 96, 228, 17, 24, 121, 4, 70, 30, 129, 145, 71, 96, 228, 17, 24, 121, 4, 70, + 30, 1, 83, 190, 192, 200, 35, 48, 242, 8, 140, 60, 2, 35, 143, 192, 200, 35, 48, 242, 8, + 140, 60, 2, 35, 143, 192, 200, 35, 48, 242, 8, 140, 60, 2, 35, 143, 168, 231, 120, 168, 47, + 70, 30, 129, 145, 71, 96, 228, 17, 24, 121, 4, 70, 30, 129, 145, 71, 96, 228, 17, 24, 105, + 4, 70, 24, 129, 17, 70, 96, 132, 17, 216, 180, 17, 216, 180, 17, 216, 180, 17, 216, 180, 17, + 216, 180, 17, 216, 180, 17, 216, 180, 17, 152, 244, 11, 108, 218, 8, 76, 254, 5, 38, 255, 2, + 35, 150, 192, 100, 94, 96, 132, 18, 24, 161, 4, 70, 40, 129, 17, 74, 96, 132, 18, 24, 161, + 4, 70, 40, 129, 17, 74, 96, 132, 18, 24, 161, 4, 70, 40, 129, 17, 74, 96, 132, 18, 24, 161, + 68, 179, 185, 20, 252, 112, 5, 61, 241, 176, 39, 30, 245, 196, 99, 39, 30, 164, 180, 39, 30, + 244, 196, 195, 158, 120, 212, 19, 143, 153, 19, 119, 158, 133, 61, 188, 195, 131, 60, 15, + 123, 226, 81, 79, 220, 229, 237, 230, 141, 122, 120, 71, 61, 188, 163, 131, 228, 143, 122, + 226, 46, 111, 247, 89, 220, 195, 59, 238, 225, 29, 247, 240, 142, 15, 242, 123, 151, 119, + 254, 190, 131, 188, 13, 122, 226, 65, 79, 60, 236, 137, 71, 61, 241, 156, 119, 208, 195, + 235, 96, 241, 176, 39, 30, 245, 196, 221, 178, 133, 61, 191, 15, 123, 202, 22, 246, 240, 11, + 123, 248, 133, 61, 101, 115, 243, 70, 61, 188, 163, 30, 222, 209, 65, 242, 71, 61, 113, 151, + 183, 251, 44, 238, 225, 29, 247, 240, 142, 123, 120, 199, 7, 249, 189, 203, 59, 127, 39, 97, + 79, 123, 229, 241, 160, 39, 30, 246, 196, 163, 158, 120, 206, 59, 236, 225, 21, 28, 36, 30, + 244, 196, 195, 158, 120, 212, 19, 119, 121, 187, 191, 237, 197, 58, 216, 243, 168, 39, 238, + 214, 59, 234, 249, 125, 212, 243, 251, 168, 167, 108, 81, 15, 191, 168, 167, 108, 238, 179, + 184, 135, 119, 220, 195, 59, 238, 225, 29, 31, 228, 247, 46, 239, 188, 220, 81, 79, 123, + 229, 241, 160, 39, 30, 246, 196, 163, 158, 120, 206, 59, 234, 225, 21, 28, 36, 30, 244, 196, + 195, 158, 120, 212, 19, 119, 121, 187, 191, 13, 123, 120, 135, 7, 121, 30, 246, 196, 163, + 158, 184, 203, 219, 205, 219, 91, 143, 94, 236, 131, 229, 119, 223, 105, 220, 243, 251, 184, + 231, 247, 113, 207, 239, 227, 158, 178, 197, 61, 101, 203, 121, 199, 61, 237, 149, 199, 131, + 158, 120, 216, 19, 143, 122, 226, 57, 239, 184, 135, 87, 112, 144, 120, 208, 19, 15, 123, + 226, 81, 79, 220, 229, 237, 254, 54, 236, 225, 29, 30, 228, 121, 216, 19, 143, 122, 226, 46, + 111, 55, 111, 212, 195, 59, 234, 225, 29, 29, 36, 127, 212, 19, 119, 121, 187, 207, 122, + 223, 81, 111, 189, 122, 203, 210, 253, 125, 119, 222, 33, 177, 82, 149, 88, 161, 74, 172, + 80, 37, 86, 168, 18, 43, 84, 89, 203, 243, 39, 160, 117, 208, 6, 168, 6, 109, 130, 102, 243, + 40, 137, 149, 169, 196, 202, 84, 98, 101, 42, 177, 50, 149, 88, 153, 74, 172, 76, 37, 86, + 166, 18, 103, 164, 37, 206, 72, 75, 156, 145, 150, 88, 143, 74, 172, 71, 37, 214, 163, 18, + 235, 81, 137, 245, 168, 196, 122, 84, 98, 61, 42, 113, 230, 79, 98, 93, 42, 177, 30, 149, + 88, 143, 74, 172, 71, 37, 214, 163, 18, 235, 81, 137, 245, 168, 196, 122, 84, 226, 108, 180, + 196, 250, 83, 98, 253, 41, 177, 254, 148, 88, 127, 74, 172, 63, 37, 214, 159, 18, 235, 79, + 137, 245, 167, 196, 217, 104, 137, 179, 209, 18, 103, 163, 37, 206, 70, 75, 156, 141, 150, + 56, 27, 45, 113, 54, 90, 226, 108, 180, 196, 217, 104, 137, 179, 209, 18, 103, 163, 37, 206, + 70, 75, 156, 109, 148, 56, 27, 45, 113, 54, 90, 226, 108, 180, 196, 217, 104, 137, 179, 209, + 18, 103, 163, 37, 206, 70, 75, 156, 141, 150, 56, 27, 45, 113, 54, 90, 226, 172, 164, 196, + 89, 73, 137, 179, 146, 18, 103, 37, 37, 206, 74, 74, 172, 115, 37, 214, 185, 18, 235, 92, + 137, 117, 174, 196, 58, 87, 98, 157, 43, 177, 206, 149, 88, 231, 74, 172, 115, 37, 214, 185, + 18, 235, 92, 137, 117, 174, 196, 58, 87, 98, 157, 43, 177, 206, 149, 88, 231, 74, 172, 99, + 37, 214, 177, 18, 235, 84, 137, 117, 130, 196, 58, 65, 98, 157, 32, 177, 78, 144, 88, 39, + 72, 172, 19, 36, 214, 9, 18, 235, 4, 137, 77, 2, 137, 77, 2, 169, 115, 190, 40, 23, 54, 9, + 36, 44, 97, 18, 235, 10, 137, 117, 133, 196, 186, 66, 98, 93, 33, 177, 174, 144, 88, 87, 72, + 172, 43, 36, 214, 21, 18, 235, 10, 137, 117, 133, 204, 229, 22, 235, 10, 137, 117, 133, 196, + 186, 66, 98, 93, 33, 177, 174, 144, 176, 124, 73, 88, 190, 36, 44, 95, 18, 150, 47, 9, 203, + 151, 132, 229, 75, 194, 242, 37, 97, 249, 146, 38, 255, 86, 2, 92, 194, 32, 231, 10, 246, + 19, 5, 59, 135, 66, 123, 43, 180, 183, 66, 123, 43, 180, 183, 66, 123, 43, 180, 183, 66, + 123, 43, 180, 183, 66, 123, 43, 180, 183, 66, 123, 43, 180, 183, 66, 123, 171, 32, 199, 131, + 203, 26, 218, 91, 193, 174, 161, 96, 215, 80, 176, 107, 40, 216, 53, 20, 250, 131, 66, 127, + 80, 176, 107, 40, 216, 53, 20, 236, 26, 10, 118, 13, 133, 254, 162, 96, 215, 80, 176, 107, + 168, 80, 47, 29, 189, 114, 106, 108, 124, 124, 108, 116, 103, 103, 38, 253, 110, 24, 210, + 81, 30, 216, 57, 20, 236, 28, 10, 118, 14, 5, 59, 135, 130, 157, 67, 193, 206, 161, 96, 231, + 80, 176, 115, 40, 216, 55, 20, 236, 27, 10, 246, 13, 5, 251, 134, 130, 125, 67, 193, 190, + 161, 96, 223, 80, 81, 254, 141, 0, 240, 133, 253, 66, 193, 94, 161, 96, 175, 80, 176, 71, + 40, 216, 35, 20, 236, 17, 10, 246, 8, 5, 251, 131, 130, 253, 65, 193, 254, 160, 96, 127, 80, + 176, 63, 40, 216, 31, 20, 236, 15, 10, 246, 7, 5, 251, 131, 130, 253, 65, 193, 190, 160, 96, + 95, 80, 176, 47, 40, 216, 23, 20, 236, 7, 170, 158, 231, 71, 249, 96, 63, 80, 176, 31, 40, + 216, 15, 20, 236, 7, 10, 246, 3, 5, 251, 129, 130, 253, 64, 193, 114, 173, 96, 185, 86, 176, + 39, 40, 88, 174, 21, 236, 10, 10, 118, 5, 5, 187, 130, 130, 93, 65, 53, 154, 217, 238, 147, + 200, 53, 168, 210, 57, 69, 9, 160, 49, 20, 52, 134, 130, 198, 80, 208, 24, 10, 26, 67, 65, + 99, 40, 104, 8, 5, 13, 161, 160, 33, 20, 52, 132, 130, 134, 80, 208, 16, 10, 26, 66, 65, 67, + 40, 104, 8, 5, 13, 161, 160, 33, 20, 52, 132, 130, 134, 80, 208, 16, 10, 26, 65, 65, 35, 40, + 104, 4, 5, 141, 160, 160, 17, 20, 52, 130, 130, 70, 80, 208, 8, 10, 26, 65, 65, 35, 40, 104, + 4, 5, 141, 160, 96, 251, 86, 176, 125, 227, 3, 103, 150, 226, 43, 8, 152, 81, 248, 176, 125, + 251, 152, 89, 248, 152, 89, 248, 152, 89, 248, 152, 89, 248, 152, 89, 248, 181, 156, 31, + 190, 174, 128, 25, 6, 62, 152, 102, 41, 190, 238, 128, 25, 134, 143, 25, 134, 15, 75, 158, + 15, 75, 158, 15, 75, 158, 15, 73, 240, 33, 9, 62, 44, 121, 62, 44, 121, 62, 36, 195, 135, + 100, 248, 176, 228, 249, 176, 228, 249, 176, 228, 249, 176, 228, 249, 144, 28, 31, 146, 227, + 67, 114, 240, 37, 46, 75, 129, 11, 9, 242, 33, 65, 62, 36, 200, 135, 4, 249, 144, 32, 31, + 18, 132, 47, 120, 213, 240, 5, 47, 75, 129, 11, 9, 242, 177, 119, 228, 39, 249, 215, 54, 20, + 44, 226, 42, 119, 10, 118, 226, 158, 19, 151, 7, 137, 71, 78, 60, 61, 207, 21, 58, 241, 70, + 79, 92, 229, 249, 83, 92, 175, 153, 181, 179, 165, 112, 183, 174, 193, 221, 187, 6, 119, + 239, 26, 220, 175, 107, 112, 191, 174, 193, 253, 186, 6, 247, 235, 26, 220, 175, 107, 112, + 247, 174, 193, 221, 187, 6, 119, 239, 26, 220, 189, 107, 112, 247, 174, 193, 221, 187, 6, + 119, 111, 15, 248, 30, 240, 61, 224, 123, 192, 247, 128, 239, 1, 223, 3, 190, 7, 124, 15, + 248, 30, 240, 61, 224, 123, 192, 247, 128, 239, 1, 223, 3, 190, 7, 124, 1, 124, 1, 124, 1, + 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, + 1, 124, 1, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, + 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 9, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, + 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 5, 124, 31, + 248, 62, 240, 125, 224, 251, 192, 247, 129, 239, 3, 223, 7, 190, 15, 124, 31, 248, 62, 240, + 125, 224, 251, 192, 247, 129, 239, 3, 223, 7, 190, 15, 252, 0, 248, 1, 240, 3, 224, 7, 192, + 15, 128, 31, 0, 63, 0, 126, 0, 252, 0, 248, 1, 240, 3, 224, 7, 192, 15, 128, 31, 0, 63, 0, + 126, 0, 252, 16, 248, 33, 240, 67, 224, 135, 192, 15, 129, 31, 2, 63, 4, 126, 8, 252, 16, + 248, 33, 240, 67, 224, 135, 192, 15, 129, 31, 2, 63, 4, 126, 8, 252, 8, 252, 242, 227, 62, + 17, 248, 69, 224, 23, 129, 95, 4, 126, 17, 248, 69, 224, 23, 129, 95, 4, 126, 49, 234, 19, + 163, 62, 49, 234, 19, 163, 62, 49, 234, 19, 163, 62, 49, 240, 99, 224, 199, 192, 143, 129, + 31, 3, 63, 211, 223, 158, 129, 190, 50, 208, 87, 6, 250, 202, 64, 95, 25, 232, 43, 3, 125, + 101, 160, 175, 12, 244, 149, 129, 190, 50, 208, 87, 6, 250, 202, 212, 114, 254, 13, 80, 13, + 218, 4, 205, 234, 103, 160, 175, 12, 244, 149, 129, 190, 50, 208, 87, 6, 250, 202, 64, 95, + 25, 232, 39, 3, 253, 100, 160, 159, 12, 244, 147, 129, 126, 50, 208, 79, 6, 250, 200, 64, + 31, 25, 232, 35, 3, 125, 100, 160, 143, 12, 244, 145, 129, 62, 50, 208, 71, 6, 250, 200, 64, + 31, 25, 232, 35, 3, 125, 100, 160, 143, 140, 200, 241, 80, 63, 232, 35, 3, 125, 100, 160, + 143, 12, 244, 145, 129, 62, 50, 208, 71, 6, 250, 200, 64, 31, 25, 232, 35, 3, 125, 100, 160, + 143, 12, 244, 145, 129, 62, 50, 208, 71, 6, 250, 200, 64, 31, 25, 232, 35, 3, 125, 100, 160, + 143, 12, 244, 145, 129, 62, 50, 208, 71, 6, 250, 200, 64, 255, 24, 232, 31, 3, 253, 99, 160, + 127, 12, 244, 143, 129, 254, 49, 208, 55, 6, 250, 198, 64, 223, 24, 232, 27, 3, 125, 99, + 160, 111, 12, 244, 141, 129, 190, 49, 208, 51, 6, 250, 197, 248, 57, 95, 148, 31, 250, 196, + 64, 159, 24, 232, 19, 3, 125, 98, 160, 79, 12, 244, 137, 129, 62, 49, 208, 39, 6, 250, 196, + 64, 159, 24, 232, 19, 3, 125, 98, 160, 79, 12, 244, 137, 129, 62, 49, 208, 39, 6, 250, 196, + 64, 159, 24, 232, 19, 3, 125, 98, 160, 79, 12, 244, 137, 129, 62, 49, 208, 39, 6, 250, 196, + 64, 159, 24, 232, 19, 3, 125, 98, 160, 79, 12, 244, 137, 137, 128, 23, 1, 47, 2, 94, 4, 188, + 8, 120, 17, 240, 160, 111, 12, 244, 141, 129, 190, 49, 208, 55, 6, 250, 198, 64, 223, 24, + 232, 27, 19, 229, 120, 168, 47, 244, 141, 129, 190, 49, 208, 55, 6, 250, 198, 64, 223, 24, + 232, 27, 3, 125, 99, 160, 111, 12, 244, 141, 129, 190, 49, 208, 55, 6, 250, 198, 228, 250, + 38, 6, 126, 12, 252, 24, 248, 49, 240, 113, 60, 210, 224, 120, 164, 193, 241, 72, 131, 227, + 145, 6, 199, 35, 13, 142, 71, 26, 28, 143, 52, 56, 30, 105, 112, 60, 210, 36, 192, 199, 49, + 73, 131, 99, 146, 6, 199, 36, 13, 142, 73, 26, 28, 147, 52, 56, 38, 105, 112, 76, 210, 224, + 152, 164, 193, 49, 73, 131, 99, 146, 6, 199, 36, 13, 142, 71, 26, 28, 143, 52, 56, 30, 105, + 112, 60, 210, 224, 120, 164, 193, 241, 72, 131, 227, 145, 6, 199, 35, 13, 142, 71, 26, 28, + 143, 52, 56, 30, 105, 112, 60, 210, 224, 120, 164, 193, 241, 72, 131, 227, 145, 6, 199, 34, + 13, 142, 69, 26, 28, 139, 52, 56, 22, 105, 26, 192, 197, 241, 72, 131, 227, 145, 6, 199, 35, + 13, 142, 71, 26, 28, 143, 52, 56, 30, 105, 112, 60, 210, 224, 120, 164, 193, 241, 72, 131, + 227, 144, 6, 199, 33, 13, 142, 67, 26, 28, 135, 52, 56, 14, 105, 112, 28, 210, 224, 24, 164, + 193, 49, 72, 131, 99, 144, 6, 199, 32, 13, 142, 65, 26, 28, 131, 52, 56, 6, 105, 112, 12, + 210, 224, 24, 164, 193, 49, 72, 131, 99, 144, 6, 199, 32, 13, 142, 65, 26, 28, 131, 52, 56, + 6, 105, 112, 12, 210, 224, 24, 164, 193, 49, 72, 131, 99, 144, 198, 0, 207, 0, 15, 199, 32, + 13, 142, 63, 26, 28, 127, 52, 56, 254, 104, 12, 112, 12, 112, 12, 112, 12, 112, 12, 112, 12, + 190, 196, 148, 245, 91, 75, 241, 213, 193, 172, 223, 90, 138, 47, 59, 101, 253, 212, 210, 8, + 52, 63, 138, 141, 47, 60, 37, 57, 159, 236, 139, 78, 1, 190, 236, 228, 103, 237, 103, 48, + 175, 54, 152, 87, 27, 204, 171, 45, 149, 124, 87, 107, 106, 236, 212, 221, 157, 153, 241, + 246, 244, 52, 185, 36, 15, 101, 236, 234, 40, 86, 238, 216, 32, 114, 71, 31, 108, 204, 195, + 176, 42, 100, 238, 64, 129, 13, 254, 36, 223, 224, 7, 197, 242, 87, 96, 249, 43, 176, 252, + 21, 88, 254, 10, 44, 127, 5, 150, 191, 2, 6, 49, 1, 87, 48, 129, 229, 176, 200, 93, 193, 12, + 54, 250, 13, 54, 250, 13, 54, 250, 225, 40, 43, 12, 202, 97, 96, 144, 131, 33, 77, 194, 17, + 73, 194, 17, 73, 194, 17, 73, 194, 17, 73, 194, 17, 73, 194, 17, 73, 194, 17, 73, 194, 0, + 39, 225, 104, 36, 253, 220, 208, 135, 231, 104, 118, 141, 233, 144, 198, 116, 72, 99, 58, + 164, 49, 29, 210, 152, 14, 105, 76, 135, 52, 166, 67, 26, 211, 33, 93, 203, 249, 196, 160, + 9, 104, 29, 180, 1, 170, 65, 155, 160, 89, 55, 213, 152, 14, 105, 76, 135, 52, 166, 67, 26, + 211, 33, 141, 233, 144, 198, 116, 72, 99, 249, 166, 177, 124, 211, 152, 30, 105, 76, 143, + 52, 166, 71, 26, 211, 35, 141, 233, 145, 198, 244, 72, 99, 249, 166, 177, 124, 211, 152, 46, + 105, 76, 151, 52, 166, 75, 26, 211, 37, 141, 233, 146, 198, 116, 73, 99, 186, 164, 49, 93, + 210, 152, 46, 105, 76, 151, 52, 166, 75, 26, 211, 37, 141, 233, 146, 198, 116, 73, 99, 186, + 164, 49, 93, 210, 152, 46, 105, 76, 151, 52, 166, 75, 26, 211, 37, 141, 233, 146, 198, 116, + 73, 99, 186, 164, 49, 93, 210, 152, 46, 105, 76, 151, 52, 166, 75, 26, 211, 37, 141, 233, + 146, 198, 116, 9, 223, 249, 178, 20, 248, 152, 46, 105, 76, 151, 52, 166, 75, 26, 211, 37, + 141, 233, 146, 198, 116, 73, 99, 249, 166, 177, 124, 211, 152, 62, 105, 76, 159, 52, 166, + 79, 26, 211, 39, 141, 233, 147, 198, 244, 73, 99, 249, 166, 177, 124, 211, 152, 78, 105, 76, + 167, 52, 166, 83, 26, 211, 41, 141, 233, 148, 198, 116, 74, 99, 58, 165, 49, 157, 210, 88, + 190, 105, 76, 171, 52, 150, 111, 26, 211, 43, 141, 229, 155, 198, 52, 75, 99, 249, 166, 49, + 221, 210, 152, 110, 105, 76, 183, 52, 166, 91, 26, 211, 45, 141, 233, 150, 198, 116, 75, 99, + 186, 165, 49, 221, 210, 152, 110, 105, 76, 183, 116, 254, 145, 70, 152, 191, 2, 152, 191, 2, + 152, 191, 2, 152, 191, 2, 152, 171, 2, 152, 175, 130, 252, 227, 148, 216, 24, 11, 176, 49, + 22, 96, 99, 44, 192, 198, 88, 224, 229, 39, 142, 113, 74, 0, 242, 30, 228, 159, 164, 16, + 113, 156, 159, 47, 192, 217, 139, 166, 123, 32, 178, 137, 179, 43, 77, 227, 124, 27, 200, + 254, 6, 231, 68, 140, 251, 57, 48, 99, 138, 196, 220, 177, 223, 206, 14, 112, 74, 18, 234, + 184, 46, 240, 49, 79, 129, 143, 121, 10, 124, 44, 84, 224, 124, 134, 192, 71, 61, 5, 62, + 234, 153, 127, 53, 40, 181, 51, 21, 33, 175, 8, 97, 16, 41, 40, 62, 247, 151, 127, 97, 196, + 230, 8, 138, 80, 88, 132, 162, 34, 148, 125, 50, 84, 103, 218, 218, 210, 252, 83, 160, 24, + 21, 106, 24, 172, 240, 175, 46, 212, 178, 214, 176, 20, 159, 100, 197, 231, 244, 107, 53, + 12, 94, 153, 150, 179, 20, 131, 88, 13, 131, 88, 13, 159, 31, 204, 183, 59, 161, 229, 37, + 180, 188, 196, 224, 169, 115, 247, 75, 108, 219, 9, 108, 219, 9, 108, 219, 9, 153, 63, 199, + 104, 128, 109, 59, 129, 109, 59, 129, 109, 59, 1, 163, 179, 200, 183, 237, 224, 102, 42, + 113, 146, 94, 194, 221, 84, 194, 221, 84, 194, 221, 84, 154, 156, 98, 52, 192, 40, 35, 77, + 110, 228, 133, 145, 216, 228, 70, 200, 252, 211, 192, 48, 62, 194, 124, 238, 195, 124, 238, + 195, 124, 30, 212, 242, 79, 167, 162, 23, 163, 28, 1, 202, 17, 160, 28, 1, 202, 17, 96, 52, + 10, 252, 102, 222, 82, 161, 232, 158, 255, 13, 253, 218, 233, 69, 82, 209, 200, 249, 39, 75, + 108, 40, 64, 54, 111, 33, 91, 209, 218, 97, 209, 151, 162, 26, 178, 137, 34, 91, 254, 193, + 18, 89, 124, 140, 200, 134, 20, 178, 201, 133, 108, 69, 127, 138, 138, 254, 20, 69, 200, + 166, 138, 108, 113, 209, 89, 227, 162, 179, 198, 121, 21, 252, 133, 108, 69, 21, 226, 162, + 10, 113, 94, 133, 96, 33, 91, 81, 133, 252, 67, 68, 210, 171, 229, 85, 8, 79, 47, 146, 68, + 17, 146, 69, 40, 175, 66, 180, 144, 45, 40, 66, 97, 17, 202, 171, 16, 23, 217, 188, 28, 32, + 89, 72, 202, 154, 59, 244, 235, 69, 74, 206, 190, 177, 144, 169, 96, 95, 72, 156, 231, 229, + 236, 117, 145, 45, 255, 0, 145, 44, 62, 64, 100, 67, 249, 27, 106, 46, 100, 83, 69, 200, 47, + 66, 249, 27, 50, 11, 217, 162, 34, 84, 188, 33, 137, 10, 4, 69, 151, 241, 100, 241, 134, + 100, 241, 134, 36, 170, 16, 120, 11, 217, 138, 42, 200, 162, 10, 18, 85, 8, 138, 46, 227, + 169, 162, 10, 170, 168, 2, 54, 200, 195, 160, 224, 175, 138, 26, 168, 162, 6, 10, 53, 8, + 212, 2, 179, 162, 6, 170, 168, 129, 159, 215, 160, 232, 49, 158, 95, 212, 192, 47, 16, 252, + 188, 6, 193, 66, 182, 162, 6, 126, 81, 3, 63, 175, 193, 66, 143, 9, 138, 26, 4, 69, 13, 2, + 52, 66, 176, 208, 99, 130, 162, 10, 65, 81, 133, 32, 175, 194, 66, 143, 9, 138, 42, 4, 69, + 21, 194, 188, 10, 11, 189, 40, 44, 170, 16, 22, 85, 8, 243, 42, 212, 23, 178, 229, 0, 11, + 93, 43, 204, 107, 176, 208, 141, 162, 162, 6, 81, 81, 131, 40, 31, 147, 49, 150, 195, 116, + 161, 97, 186, 208, 48, 93, 104, 152, 46, 52, 76, 23, 26, 166, 11, 13, 211, 133, 134, 233, + 66, 195, 116, 161, 97, 186, 208, 48, 93, 104, 152, 46, 52, 76, 23, 26, 166, 11, 13, 211, + 133, 134, 233, 66, 195, 116, 161, 97, 10, 213, 48, 133, 106, 152, 50, 52, 76, 25, 58, 47, + 55, 76, 25, 26, 166, 12, 13, 83, 134, 134, 41, 67, 195, 148, 161, 97, 202, 208, 48, 101, + 104, 152, 50, 52, 76, 25, 26, 166, 12, 13, 83, 134, 134, 41, 67, 195, 148, 161, 97, 202, + 208, 48, 101, 104, 152, 50, 52, 76, 25, 26, 166, 12, 13, 83, 134, 134, 41, 67, 195, 148, + 161, 97, 202, 208, 48, 101, 104, 152, 50, 52, 76, 25, 26, 166, 12, 13, 83, 134, 134, 41, 67, + 195, 148, 161, 97, 202, 208, 48, 101, 104, 152, 50, 52, 76, 25, 26, 166, 12, 13, 83, 134, + 134, 41, 67, 195, 148, 161, 97, 202, 208, 48, 101, 104, 152, 50, 52, 76, 25, 26, 166, 12, + 13, 83, 134, 134, 41, 67, 195, 148, 161, 97, 202, 208, 48, 101, 104, 152, 50, 52, 76, 25, + 26, 166, 12, 141, 47, 62, 105, 152, 52, 52, 76, 26, 26, 38, 13, 13, 147, 134, 134, 73, 67, + 195, 164, 161, 97, 210, 208, 48, 105, 104, 152, 52, 52, 76, 26, 26, 38, 13, 13, 147, 134, + 134, 73, 67, 55, 48, 203, 192, 191, 149, 84, 139, 49, 27, 201, 63, 216, 31, 99, 54, 18, 35, + 95, 140, 217, 72, 29, 233, 117, 164, 215, 243, 244, 108, 150, 210, 244, 66, 154, 73, 136, + 136, 10, 37, 38, 138, 209, 78, 228, 159, 231, 178, 33, 191, 8, 5, 69, 40, 44, 66, 81, 17, + 202, 197, 92, 20, 227, 157, 40, 198, 59, 145, 127, 122, 207, 134, 10, 140, 98, 192, 19, 197, + 128, 39, 226, 2, 35, 46, 48, 138, 17, 79, 20, 35, 158, 204, 63, 189, 103, 67, 94, 17, 18, + 69, 72, 22, 33, 85, 132, 252, 34, 20, 20, 161, 176, 8, 69, 69, 168, 192, 40, 38, 153, 178, + 152, 100, 74, 175, 192, 240, 228, 50, 40, 179, 197, 167, 38, 243, 132, 98, 46, 44, 48, 12, + 8, 248, 73, 9, 248, 73, 9, 248, 73, 9, 248, 73, 9, 248, 73, 9, 248, 73, 9, 248, 73, 9, 248, + 73, 9, 248, 73, 9, 248, 73, 9, 248, 73, 9, 248, 73, 137, 220, 79, 10, 254, 37, 18, 254, 37, + 50, 204, 253, 16, 242, 137, 27, 118, 243, 97, 78, 80, 152, 232, 41, 76, 244, 20, 38, 122, + 10, 19, 61, 252, 179, 98, 150, 98, 87, 26, 35, 191, 159, 47, 179, 97, 109, 211, 248, 24, + 153, 134, 213, 77, 195, 234, 166, 97, 117, 211, 176, 186, 105, 88, 221, 180, 129, 8, 100, + 56, 194, 203, 234, 99, 105, 214, 213, 113, 34, 84, 224, 139, 224, 2, 95, 4, 183, 84, 128, + 74, 208, 60, 159, 15, 26, 128, 134, 160, 17, 104, 12, 154, 128, 214, 65, 179, 137, 126, 35, + 4, 159, 16, 124, 66, 240, 201, 84, 124, 18, 122, 57, 141, 64, 99, 208, 36, 163, 153, 57, + 192, 210, 162, 183, 132, 241, 61, 165, 115, 43, 191, 219, 95, 57, 121, 120, 67, 114, 68, + 229, 103, 165, 139, 42, 191, 46, 221, 88, 249, 121, 233, 33, 123, 245, 151, 150, 217, 148, + 101, 54, 180, 193, 94, 147, 54, 252, 168, 189, 6, 30, 189, 191, 242, 227, 253, 205, 166, + 216, 120, 192, 210, 181, 167, 118, 233, 252, 154, 147, 196, 61, 233, 131, 249, 163, 142, 17, + 31, 173, 252, 184, 239, 182, 210, 137, 165, 97, 155, 240, 208, 252, 145, 71, 119, 159, 252, + 104, 190, 94, 71, 32, 136, 178, 192, 254, 147, 79, 17, 15, 37, 180, 242, 163, 210, 31, 237, + 213, 87, 249, 81, 229, 161, 210, 154, 236, 87, 251, 215, 156, 42, 30, 73, 170, 54, 161, 92, + 121, 118, 105, 105, 185, 92, 26, 46, 221, 84, 249, 97, 105, 206, 94, 125, 165, 141, 149, + 239, 237, 63, 254, 4, 113, 227, 125, 149, 47, 217, 231, 95, 168, 124, 190, 180, 187, 251, + 179, 207, 207, 87, 15, 21, 150, 225, 103, 43, 31, 42, 29, 86, 26, 174, 220, 93, 185, 11, 79, + 238, 218, 127, 200, 161, 162, 148, 76, 87, 94, 89, 42, 151, 238, 183, 247, 7, 237, 245, 176, + 189, 30, 177, 87, 127, 169, 83, 121, 79, 233, 90, 123, 93, 103, 175, 59, 236, 213, 95, 90, + 106, 239, 195, 246, 58, 205, 94, 91, 211, 148, 202, 173, 149, 91, 109, 57, 111, 182, 191, + 95, 106, 239, 167, 217, 171, 99, 175, 235, 236, 213, 111, 95, 225, 251, 109, 250, 165, 233, + 189, 242, 222, 202, 37, 165, 85, 246, 183, 175, 168, 220, 80, 58, 194, 210, 151, 87, 94, + 219, 165, 239, 182, 244, 40, 75, 223, 105, 211, 143, 179, 244, 29, 54, 158, 210, 27, 17, + 127, 139, 165, 233, 243, 55, 35, 253, 77, 54, 126, 164, 165, 111, 4, 125, 131, 77, 63, 218, + 210, 215, 219, 120, 74, 95, 135, 248, 229, 149, 217, 238, 239, 102, 64, 111, 170, 76, 207, + 31, 55, 188, 44, 57, 206, 62, 95, 97, 175, 154, 189, 42, 54, 116, 131, 13, 221, 96, 95, 221, + 13, 54, 86, 178, 247, 114, 229, 249, 149, 241, 46, 210, 157, 150, 10, 75, 247, 101, 212, + 190, 174, 107, 230, 87, 142, 116, 219, 232, 154, 253, 143, 125, 156, 184, 201, 190, 210, + 107, 236, 171, 191, 198, 190, 185, 107, 236, 155, 187, 166, 212, 111, 31, 93, 157, 231, 185, + 58, 203, 115, 74, 229, 106, 155, 231, 106, 155, 231, 106, 155, 231, 106, 251, 86, 106, 149, + 105, 139, 55, 109, 27, 172, 100, 239, 203, 236, 181, 194, 94, 21, 251, 222, 167, 237, 123, + 79, 211, 231, 236, 253, 126, 123, 61, 216, 77, 127, 129, 189, 95, 111, 175, 155, 210, 88, + 229, 10, 251, 30, 79, 178, 165, 122, 105, 229, 146, 249, 53, 195, 182, 147, 237, 217, 31, + 111, 20, 27, 62, 92, 185, 216, 190, 234, 141, 149, 139, 247, 63, 238, 88, 113, 221, 66, 140, + 208, 180, 35, 90, 122, 8, 232, 210, 52, 111, 187, 251, 180, 189, 159, 240, 52, 181, 189, + 255, 168, 99, 51, 106, 115, 93, 154, 28, 82, 25, 45, 61, 203, 94, 125, 165, 195, 237, 253, + 120, 123, 41, 123, 105, 123, 245, 87, 70, 231, 143, 63, 109, 248, 222, 202, 89, 165, 125, + 75, 74, 27, 15, 25, 190, 182, 239, 218, 202, 181, 253, 215, 14, 244, 215, 116, 249, 176, + 251, 42, 162, 180, 109, 73, 201, 118, 201, 195, 42, 167, 148, 214, 219, 12, 39, 13, 239, 92, + 95, 14, 47, 34, 147, 228, 57, 164, 178, 140, 172, 32, 53, 178, 145, 108, 35, 3, 157, 202, + 181, 149, 235, 42, 149, 225, 202, 105, 149, 13, 149, 173, 149, 157, 149, 129, 3, 143, 222, + 63, 63, 244, 120, 105, 201, 198, 51, 6, 31, 47, 175, 103, 55, 177, 57, 118, 63, 123, 144, + 13, 204, 13, 222, 63, 248, 224, 224, 195, 131, 143, 12, 14, 172, 24, 172, 13, 110, 28, 220, + 54, 120, 209, 224, 228, 224, 115, 6, 175, 31, 188, 105, 144, 92, 63, 120, 253, 80, 223, 69, + 108, 146, 61, 135, 85, 150, 177, 21, 172, 198, 54, 178, 109, 108, 96, 120, 168, 124, 83, + 242, 194, 202, 46, 91, 205, 146, 189, 47, 179, 215, 164, 189, 174, 183, 87, 191, 125, 199, + 59, 109, 250, 138, 202, 51, 236, 181, 211, 182, 198, 78, 251, 42, 158, 97, 211, 75, 246, 94, + 178, 177, 101, 246, 122, 208, 134, 31, 182, 116, 192, 198, 150, 218, 124, 75, 109, 190, 165, + 54, 117, 169, 77, 93, 106, 83, 75, 246, 158, 62, 217, 102, 175, 139, 236, 53, 137, 167, 131, + 197, 147, 252, 55, 105, 254, 71, 210, 39, 246, 58, 209, 62, 61, 196, 166, 30, 98, 223, 237, + 195, 246, 254, 72, 26, 178, 215, 153, 54, 86, 181, 177, 170, 141, 85, 109, 174, 7, 251, 254, + 99, 75, 184, 204, 222, 87, 216, 107, 155, 189, 42, 221, 180, 135, 237, 101, 123, 141, 189, + 231, 207, 106, 120, 126, 145, 189, 6, 187, 207, 31, 233, 230, 201, 159, 109, 76, 127, 219, + 247, 159, 141, 173, 19, 239, 63, 169, 60, 119, 82, 249, 166, 147, 202, 215, 159, 84, 222, + 184, 126, 67, 34, 54, 174, 178, 183, 195, 14, 59, 108, 231, 200, 206, 213, 59, 215, 236, + 188, 185, 191, 51, 210, 89, 221, 89, 211, 185, 185, 127, 235, 200, 214, 213, 91, 215, 108, + 189, 185, 127, 195, 200, 134, 213, 27, 214, 108, 184, 185, 255, 180, 145, 211, 86, 159, 182, + 230, 180, 155, 251, 135, 71, 134, 87, 15, 175, 25, 190, 185, 255, 186, 45, 119, 108, 185, + 111, 203, 3, 91, 250, 119, 110, 233, 108, 185, 118, 75, 37, 180, 77, 183, 127, 126, 109, 77, + 116, 233, 170, 213, 41, 189, 107, 254, 113, 71, 137, 112, 105, 114, 122, 223, 29, 182, 58, + 59, 237, 253, 70, 123, 61, 100, 175, 74, 105, 216, 222, 79, 179, 215, 6, 123, 117, 236, 213, + 223, 119, 135, 189, 15, 247, 221, 110, 83, 111, 183, 169, 183, 151, 182, 218, 107, 167, 189, + 6, 236, 47, 110, 79, 213, 139, 189, 15, 227, 89, 154, 126, 99, 247, 89, 26, 74, 159, 247, + 45, 122, 94, 177, 21, 191, 109, 254, 241, 114, 107, 114, 166, 85, 185, 59, 237, 117, 163, + 189, 42, 150, 247, 109, 246, 249, 109, 221, 220, 89, 232, 142, 110, 250, 156, 189, 63, 220, + 77, 223, 138, 252, 55, 117, 211, 135, 237, 61, 255, 77, 197, 42, 184, 11, 187, 106, 238, 66, + 43, 126, 23, 90, 229, 127, 97, 105, 167, 189, 38, 237, 53, 80, 122, 160, 114, 129, 29, 28, + 46, 72, 57, 219, 251, 176, 189, 38, 237, 117, 135, 189, 250, 43, 23, 218, 255, 46, 168, 92, + 208, 119, 187, 253, 239, 182, 190, 219, 42, 235, 54, 86, 189, 35, 134, 75, 71, 30, 89, 42, + 149, 14, 59, 116, 201, 178, 100, 89, 31, 183, 125, 160, 90, 126, 111, 247, 254, 198, 238, + 253, 165, 221, 251, 134, 238, 253, 248, 141, 135, 156, 89, 253, 251, 153, 213, 143, 157, 89, + 125, 209, 153, 213, 19, 109, 160, 111, 77, 41, 177, 15, 110, 232, 222, 87, 110, 100, 73, + 245, 131, 73, 117, 107, 82, 61, 41, 169, 90, 110, 143, 45, 173, 44, 85, 251, 142, 232, 222, + 7, 211, 123, 249, 183, 221, 251, 89, 221, 251, 186, 141, 135, 175, 172, 254, 107, 101, 245, + 47, 43, 171, 127, 90, 89, 125, 219, 202, 234, 101, 43, 171, 79, 88, 153, 254, 238, 24, 43, + 187, 213, 190, 195, 187, 119, 150, 222, 203, 175, 239, 222, 207, 236, 222, 79, 216, 200, + 134, 171, 159, 25, 174, 94, 48, 92, 13, 135, 171, 73, 181, 252, 246, 178, 69, 47, 213, 187, + 247, 227, 186, 247, 163, 211, 123, 249, 207, 31, 92, 170, 151, 150, 200, 135, 203, 127, 46, + 105, 203, 169, 60, 191, 254, 164, 225, 3, 125, 165, 46, 41, 63, 58, 191, 62, 177, 228, 127, + 243, 235, 207, 176, 228, 191, 243, 235, 223, 110, 201, 191, 231, 215, 191, 118, 248, 35, + 229, 127, 149, 187, 67, 90, 249, 239, 243, 199, 255, 108, 56, 57, 162, 252, 215, 242, 166, + 254, 52, 254, 23, 208, 63, 149, 55, 149, 110, 181, 244, 17, 75, 247, 88, 122, 75, 105, 125, + 121, 181, 165, 239, 158, 95, 255, 220, 52, 255, 187, 236, 239, 223, 108, 227, 239, 44, 173, + 90, 146, 230, 127, 71, 105, 91, 247, 119, 55, 150, 55, 117, 211, 223, 134, 223, 189, 117, + 126, 221, 46, 139, 250, 150, 249, 117, 87, 90, 212, 55, 151, 214, 117, 81, 223, 48, 191, + 238, 103, 54, 245, 181, 243, 235, 94, 106, 201, 107, 230, 215, 141, 91, 114, 221, 252, 234, + 180, 128, 151, 204, 175, 63, 121, 56, 57, 180, 188, 167, 116, 124, 95, 154, 119, 180, 180, + 186, 47, 45, 201, 22, 32, 62, 201, 114, 30, 183, 244, 140, 236, 199, 205, 249, 117, 233, + 175, 116, 10, 112, 160, 220, 152, 31, 241, 44, 57, 49, 45, 229, 71, 202, 35, 165, 109, 93, + 184, 225, 249, 145, 110, 37, 143, 45, 141, 116, 89, 28, 83, 26, 233, 22, 250, 232, 210, 234, + 46, 61, 164, 188, 180, 91, 248, 106, 105, 85, 151, 46, 153, 31, 121, 174, 229, 50, 248, 193, + 213, 63, 27, 254, 199, 250, 15, 167, 21, 47, 253, 173, 188, 116, 254, 237, 195, 63, 253, + 136, 173, 223, 249, 54, 250, 147, 242, 166, 249, 91, 135, 191, 122, 79, 250, 186, 230, 135, + 31, 88, 119, 160, 188, 250, 238, 225, 175, 140, 124, 120, 248, 211, 199, 31, 40, 159, 63, + 63, 124, 255, 186, 3, 75, 236, 131, 251, 214, 29, 232, 43, 223, 53, 124, 167, 125, 201, 115, + 54, 111, 95, 249, 238, 225, 59, 214, 237, 25, 190, 125, 164, 251, 244, 230, 17, 251, 212, + 54, 245, 141, 235, 79, 25, 126, 203, 200, 133, 195, 111, 90, 109, 227, 243, 195, 207, 93, + 247, 145, 180, 24, 165, 125, 182, 198, 231, 219, 199, 59, 214, 61, 113, 120, 203, 250, 91, + 135, 205, 234, 3, 101, 251, 120, 227, 122, 11, 182, 145, 14, 63, 126, 100, 106, 56, 182, + 201, 209, 129, 242, 166, 253, 183, 14, 123, 199, 31, 72, 139, 82, 179, 60, 110, 189, 123, + 248, 100, 139, 120, 194, 72, 183, 40, 231, 133, 247, 246, 249, 165, 161, 242, 236, 198, 117, + 67, 51, 67, 187, 134, 206, 31, 122, 202, 208, 233, 67, 114, 232, 148, 161, 21, 67, 199, 14, + 29, 51, 116, 248, 146, 195, 150, 44, 91, 114, 200, 18, 190, 132, 46, 89, 178, 100, 112, 73, + 255, 146, 190, 37, 165, 37, 135, 31, 120, 244, 225, 141, 107, 75, 86, 10, 15, 31, 92, 150, + 146, 193, 254, 244, 222, 223, 13, 47, 235, 75, 239, 246, 150, 106, 253, 190, 242, 146, 62, + 43, 59, 115, 143, 169, 108, 238, 219, 124, 78, 189, 60, 119, 216, 230, 210, 230, 115, 235, + 115, 225, 218, 205, 7, 134, 30, 61, 123, 46, 90, 187, 121, 110, 201, 182, 167, 110, 191, + 179, 92, 126, 213, 14, 27, 155, 235, 123, 201, 129, 114, 233, 220, 237, 182, 131, 166, 73, + 47, 60, 122, 238, 176, 198, 246, 123, 74, 229, 242, 105, 47, 124, 229, 209, 41, 189, 250, + 133, 175, 220, 177, 163, 188, 121, 238, 254, 209, 210, 230, 93, 43, 230, 254, 126, 142, 173, + 7, 125, 202, 133, 115, 3, 35, 245, 229, 165, 35, 47, 223, 176, 124, 195, 97, 79, 60, 52, 54, + 250, 32, 183, 139, 112, 95, 187, 240, 183, 124, 173, 251, 183, 252, 216, 185, 215, 111, 62, + 103, 251, 220, 251, 143, 221, 49, 39, 210, 192, 163, 199, 238, 216, 60, 119, 198, 57, 43, + 158, 182, 253, 158, 190, 203, 250, 58, 77, 125, 79, 223, 100, 74, 118, 108, 191, 167, 124, + 85, 223, 101, 205, 179, 211, 244, 242, 85, 122, 71, 145, 173, 180, 170, 111, 210, 102, 43, + 173, 79, 73, 154, 109, 127, 105, 85, 154, 173, 180, 170, 188, 191, 155, 109, 75, 55, 155, + 237, 166, 171, 154, 250, 206, 85, 171, 178, 76, 159, 40, 111, 74, 51, 217, 238, 243, 137, + 110, 166, 61, 25, 175, 227, 45, 132, 229, 181, 45, 37, 54, 91, 223, 113, 165, 227, 187, 188, + 142, 239, 59, 46, 205, 102, 251, 67, 198, 108, 169, 203, 140, 151, 202, 75, 187, 204, 150, + 242, 82, 151, 217, 49, 105, 166, 59, 87, 175, 182, 89, 214, 173, 78, 179, 220, 25, 174, 182, + 25, 238, 92, 29, 118, 31, 223, 186, 240, 120, 100, 117, 86, 156, 29, 165, 213, 93, 156, 213, + 229, 29, 93, 156, 114, 121, 33, 207, 154, 44, 143, 237, 5, 200, 211, 183, 196, 230, 89, 251, + 255, 231, 95, 187, 254, 255, 33, 115, 121, 127, 235, 7, 187, 71, 155, 237, 145, 230, 69, 35, + 205, 182, 189, 46, 154, 123, 249, 229, 123, 151, 207, 61, 103, 215, 138, 21, 119, 238, 254, + 65, 250, 96, 197, 92, 229, 132, 139, 118, 141, 238, 77, 105, 171, 61, 247, 131, 145, 182, + 158, 219, 61, 162, 87, 220, 217, 26, 61, 200, 227, 209, 244, 113, 107, 68, 223, 89, 26, 109, + 158, 187, 253, 206, 209, 141, 109, 61, 223, 218, 216, 106, 142, 180, 244, 142, 253, 183, 92, + 219, 216, 188, 8, 235, 165, 5, 86, 227, 218, 131, 48, 187, 54, 101, 214, 72, 177, 110, 217, + 124, 144, 199, 155, 211, 199, 183, 164, 88, 155, 83, 172, 205, 41, 214, 45, 27, 111, 233, + 98, 109, 62, 187, 94, 222, 188, 109, 251, 157, 75, 74, 245, 29, 141, 167, 101, 116, 127, 31, + 163, 86, 30, 46, 58, 122, 229, 142, 250, 145, 203, 38, 159, 216, 21, 142, 211, 87, 46, 127, + 246, 209, 247, 246, 151, 236, 176, 197, 214, 238, 152, 227, 35, 245, 185, 170, 189, 210, 71, + 167, 36, 167, 36, 233, 35, 43, 157, 233, 163, 67, 108, 242, 82, 60, 90, 254, 236, 211, 87, + 30, 125, 111, 249, 189, 120, 180, 204, 38, 31, 58, 82, 47, 173, 45, 45, 111, 142, 233, 226, + 255, 233, 233, 233, 153, 244, 154, 157, 93, 107, 239, 51, 179, 203, 187, 105, 51, 86, 104, + 87, 158, 179, 121, 206, 60, 229, 194, 237, 115, 235, 231, 214, 55, 231, 54, 94, 164, 119, + 148, 211, 230, 152, 197, 95, 99, 251, 198, 101, 247, 173, 127, 96, 125, 95, 103, 253, 181, + 235, 175, 91, 127, 227, 250, 59, 214, 15, 204, 206, 238, 176, 201, 135, 221, 183, 234, 129, + 85, 125, 59, 87, 117, 86, 93, 187, 234, 186, 85, 55, 174, 186, 99, 213, 96, 250, 224, 105, + 219, 239, 222, 184, 254, 198, 85, 127, 92, 85, 153, 181, 189, 169, 60, 99, 255, 154, 186, + 139, 57, 107, 169, 253, 63, 141, 206, 204, 78, 167, 127, 37, 11, 48, 109, 175, 12, 110, 237, + 236, 218, 198, 246, 100, 85, 105, 212, 206, 118, 203, 118, 102, 126, 74, 233, 49, 246, 26, + 177, 151, 180, 215, 57, 246, 26, 40, 125, 210, 222, 191, 110, 175, 159, 218, 235, 47, 246, + 234, 47, 61, 223, 222, 95, 107, 175, 119, 217, 107, 127, 154, 82, 57, 165, 114, 74, 115, + 249, 152, 78, 17, 119, 172, 77, 149, 206, 242, 138, 216, 95, 243, 69, 116, 192, 210, 214, + 197, 25, 61, 231, 194, 140, 54, 207, 202, 232, 250, 68, 44, 183, 116, 126, 131, 164, 201, + 82, 59, 241, 46, 151, 238, 181, 247, 47, 216, 235, 123, 246, 250, 141, 189, 254, 109, 175, + 129, 138, 168, 136, 46, 243, 217, 172, 215, 238, 152, 46, 77, 175, 45, 219, 226, 151, 108, + 100, 38, 189, 77, 175, 157, 41, 175, 181, 129, 114, 250, 186, 103, 166, 215, 174, 45, 165, + 87, 218, 193, 109, 11, 216, 172, 107, 203, 139, 251, 125, 169, 60, 61, 91, 178, 175, 194, + 54, 136, 37, 54, 83, 55, 117, 58, 253, 217, 108, 74, 243, 191, 244, 193, 255, 3, 59, 253, + 13, 116, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 52, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, 104, 32, + 49, 50, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 19, 96, 97, 192, 11, 0, 2, + 156, 0, 21, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, + 106, 13, 49, 52, 54, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, + 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 70, 105, 114, 115, 116, 32, 51, + 49, 53, 47, 76, 101, 110, 103, 116, 104, 32, 50, 56, 57, 50, 47, 78, 32, 51, 53, 47, 84, + 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, + 104, 222, 212, 91, 89, 111, 27, 57, 18, 254, 43, 253, 56, 131, 93, 67, 188, 15, 96, 16, 32, + 199, 100, 199, 192, 102, 118, 16, 123, 54, 11, 24, 126, 80, 98, 77, 34, 192, 150, 12, 73, + 193, 110, 254, 253, 212, 87, 36, 91, 236, 67, 178, 210, 49, 54, 158, 135, 50, 91, 60, 170, + 139, 197, 143, 197, 170, 106, 90, 186, 208, 136, 70, 186, 216, 72, 163, 27, 233, 69, 163, + 181, 163, 82, 54, 198, 83, 157, 87, 141, 11, 212, 238, 117, 19, 52, 74, 211, 72, 161, 20, + 61, 216, 70, 162, 183, 244, 212, 91, 123, 212, 120, 98, 17, 48, 54, 16, 63, 84, 131, 65, 64, + 71, 226, 160, 132, 34, 246, 65, 54, 90, 88, 226, 17, 84, 163, 149, 165, 17, 65, 55, 218, 8, + 226, 19, 76, 99, 140, 162, 81, 193, 54, 214, 88, 98, 72, 188, 156, 1, 179, 224, 27, 231, + 184, 41, 52, 206, 131, 115, 136, 141, 139, 144, 37, 138, 198, 75, 112, 142, 178, 9, 18, 12, + 163, 106, 34, 218, 101, 212, 77, 212, 154, 248, 68, 211, 68, 107, 240, 64, 162, 8, 75, 19, + 150, 145, 120, 8, 143, 121, 68, 26, 34, 130, 70, 29, 145, 136, 86, 210, 19, 141, 150, 146, + 196, 84, 16, 76, 65, 88, 37, 168, 94, 105, 109, 49, 17, 122, 50, 36, 229, 79, 63, 205, 94, + 204, 183, 139, 215, 235, 213, 110, 246, 250, 215, 203, 139, 23, 23, 127, 123, 57, 191, 93, + 190, 223, 44, 103, 63, 175, 62, 172, 111, 150, 171, 143, 179, 119, 203, 213, 243, 213, 118, + 217, 254, 126, 189, 220, 108, 119, 47, 63, 205, 55, 141, 152, 97, 224, 171, 197, 246, 195, + 102, 121, 191, 91, 111, 88, 199, 162, 121, 59, 251, 231, 60, 247, 80, 214, 206, 46, 62, 191, + 223, 125, 185, 95, 204, 46, 55, 159, 23, 151, 252, 128, 63, 252, 202, 119, 203, 155, 221, + 167, 109, 131, 73, 211, 176, 103, 207, 72, 156, 231, 219, 15, 139, 213, 174, 241, 42, 204, + 94, 158, 191, 186, 88, 236, 72, 210, 200, 76, 95, 206, 239, 127, 89, 44, 63, 126, 162, 70, + 233, 102, 120, 43, 58, 158, 41, 73, 98, 220, 206, 63, 110, 105, 53, 152, 235, 139, 23, 235, + 255, 93, 157, 57, 103, 155, 51, 90, 31, 40, 128, 52, 32, 132, 187, 230, 214, 215, 203, 219, + 5, 205, 158, 128, 0, 158, 168, 249, 117, 126, 183, 40, 147, 127, 190, 89, 206, 111, 223, 92, + 206, 206, 119, 164, 133, 15, 207, 87, 31, 111, 23, 52, 203, 139, 221, 226, 238, 223, 77, + 240, 123, 201, 247, 115, 158, 253, 39, 11, 101, 101, 228, 9, 244, 245, 89, 88, 78, 210, 167, + 139, 211, 244, 25, 6, 250, 180, 162, 213, 39, 1, 170, 171, 79, 167, 117, 165, 79, 91, 244, + 25, 93, 165, 79, 67, 152, 61, 3, 14, 9, 76, 0, 163, 234, 170, 83, 142, 170, 51, 99, 233, 44, + 169, 179, 163, 213, 51, 41, 79, 211, 171, 113, 126, 84, 175, 61, 222, 211, 224, 42, 167, + 169, 55, 30, 85, 175, 25, 168, 87, 141, 169, 183, 3, 215, 7, 212, 171, 143, 169, 119, 10, + 90, 141, 51, 71, 181, 250, 98, 125, 123, 51, 81, 167, 118, 154, 78, 221, 49, 157, 42, 127, + 154, 78, 149, 83, 100, 205, 107, 189, 146, 9, 205, 122, 213, 113, 168, 87, 123, 20, 182, + 172, 132, 49, 229, 74, 103, 31, 208, 238, 184, 45, 184, 248, 114, 247, 126, 13, 99, 144, 68, + 191, 153, 147, 36, 212, 188, 189, 194, 129, 67, 146, 92, 239, 85, 126, 126, 67, 83, 91, 238, + 190, 156, 253, 178, 215, 30, 253, 17, 179, 203, 245, 239, 171, 37, 117, 90, 52, 73, 248, 86, + 142, 90, 119, 46, 234, 61, 30, 93, 95, 119, 177, 222, 238, 100, 75, 147, 238, 204, 94, 109, + 130, 234, 149, 192, 9, 162, 97, 58, 109, 71, 105, 42, 140, 42, 173, 157, 219, 20, 52, 90, + 127, 92, 95, 152, 203, 151, 45, 177, 58, 95, 253, 177, 166, 142, 255, 218, 220, 44, 54, 164, + 166, 31, 138, 154, 126, 156, 189, 93, 124, 92, 110, 119, 155, 47, 63, 92, 172, 255, 216, + 221, 206, 87, 55, 63, 146, 226, 238, 239, 111, 23, 119, 152, 167, 120, 246, 12, 76, 46, 215, + 255, 56, 127, 245, 102, 126, 223, 170, 119, 246, 234, 29, 102, 56, 2, 227, 132, 184, 162, + 123, 26, 139, 30, 152, 132, 170, 209, 123, 37, 174, 156, 16, 215, 82, 137, 43, 227, 196, + 245, 245, 225, 35, 128, 209, 52, 245, 28, 8, 211, 12, 85, 16, 105, 83, 93, 209, 94, 106, + 190, 39, 41, 194, 183, 38, 43, 102, 200, 225, 177, 180, 213, 65, 129, 60, 28, 248, 47, 74, + 167, 54, 38, 170, 179, 228, 70, 149, 254, 40, 65, 101, 204, 67, 84, 248, 128, 71, 33, 39, + 101, 19, 201, 42, 225, 93, 53, 57, 231, 185, 205, 19, 127, 150, 35, 191, 135, 219, 168, 62, + 16, 31, 238, 75, 245, 232, 91, 250, 181, 227, 242, 115, 52, 38, 213, 229, 250, 34, 119, 43, + 71, 150, 11, 37, 218, 235, 18, 245, 120, 6, 213, 115, 69, 9, 253, 148, 182, 66, 172, 159, + 106, 28, 203, 91, 235, 135, 124, 29, 244, 81, 65, 180, 186, 212, 164, 127, 30, 147, 215, + 161, 244, 3, 236, 59, 138, 227, 10, 204, 162, 253, 129, 33, 252, 90, 43, 218, 225, 204, 2, + 35, 115, 59, 70, 167, 206, 101, 84, 225, 7, 197, 112, 143, 204, 182, 85, 74, 111, 209, 32, + 108, 25, 227, 53, 189, 222, 103, 185, 32, 124, 174, 179, 228, 77, 195, 199, 182, 38, 238, + 193, 2, 94, 190, 187, 240, 76, 228, 250, 49, 192, 232, 36, 46, 84, 22, 108, 140, 88, 232, + 118, 101, 43, 42, 211, 45, 212, 14, 194, 115, 143, 32, 172, 175, 251, 212, 40, 203, 200, 56, + 132, 218, 144, 87, 117, 160, 152, 222, 251, 251, 104, 168, 9, 138, 25, 173, 223, 163, 237, + 122, 220, 189, 214, 225, 52, 247, 122, 112, 182, 58, 58, 9, 206, 52, 45, 64, 118, 177, 165, + 232, 30, 174, 254, 176, 139, 93, 140, 225, 148, 195, 245, 144, 163, 253, 61, 2, 151, 96, + 179, 129, 181, 130, 48, 250, 29, 73, 81, 108, 169, 137, 12, 173, 166, 137, 129, 235, 60, 5, + 78, 94, 80, 4, 132, 61, 33, 21, 19, 218, 64, 138, 66, 4, 45, 104, 233, 8, 154, 70, 139, 211, + 223, 131, 229, 38, 42, 124, 152, 28, 69, 214, 84, 58, 226, 103, 29, 65, 141, 222, 235, 136, + 167, 161, 88, 215, 88, 60, 19, 252, 41, 66, 80, 108, 90, 0, 85, 122, 39, 5, 188, 129, 14, 3, + 135, 118, 236, 97, 141, 40, 29, 227, 113, 72, 16, 81, 160, 235, 44, 237, 111, 10, 138, 35, + 248, 90, 240, 37, 158, 176, 33, 20, 213, 65, 102, 46, 179, 12, 154, 16, 104, 200, 205, 179, + 244, 46, 35, 3, 151, 86, 96, 222, 46, 29, 58, 244, 91, 25, 135, 117, 37, 185, 4, 63, 7, 242, + 110, 184, 159, 206, 253, 97, 123, 168, 93, 83, 240, 172, 77, 250, 13, 89, 188, 177, 60, 15, + 240, 209, 20, 108, 107, 178, 107, 134, 14, 20, 46, 227, 94, 223, 69, 175, 92, 71, 174, 165, + 167, 109, 215, 234, 8, 193, 183, 112, 138, 25, 98, 32, 38, 207, 13, 62, 116, 22, 133, 25, + 104, 155, 40, 215, 71, 90, 68, 67, 99, 60, 41, 32, 9, 71, 227, 141, 78, 19, 39, 129, 160, + 152, 22, 0, 149, 48, 165, 100, 146, 150, 13, 161, 145, 80, 118, 204, 74, 115, 220, 71, 71, + 226, 107, 18, 56, 52, 159, 198, 196, 139, 4, 198, 98, 88, 200, 229, 208, 151, 78, 53, 24, + 97, 146, 11, 227, 29, 201, 233, 104, 113, 188, 80, 12, 0, 44, 254, 24, 121, 82, 20, 0, 193, + 96, 168, 8, 96, 168, 201, 49, 207, 4, 134, 62, 65, 46, 71, 46, 16, 0, 81, 19, 230, 13, 224, + 88, 44, 106, 52, 163, 132, 247, 51, 32, 72, 254, 154, 24, 12, 21, 21, 0, 36, 48, 116, 137, + 117, 105, 76, 213, 167, 128, 195, 148, 242, 250, 233, 88, 0, 33, 247, 22, 128, 22, 221, 33, + 245, 163, 36, 47, 32, 104, 15, 54, 145, 44, 0, 45, 170, 14, 225, 244, 247, 184, 4, 136, 161, + 5, 32, 101, 248, 152, 20, 197, 46, 148, 173, 44, 0, 45, 158, 74, 0, 210, 50, 166, 157, 76, + 20, 104, 225, 156, 193, 78, 167, 49, 18, 7, 37, 149, 0, 54, 128, 134, 148, 25, 129, 210, 18, + 56, 2, 1, 148, 204, 62, 215, 25, 6, 35, 129, 22, 222, 65, 5, 112, 69, 96, 180, 210, 48, 49, + 200, 81, 194, 90, 208, 230, 41, 245, 138, 128, 136, 56, 208, 208, 123, 241, 236, 219, 49, + 186, 237, 163, 77, 114, 67, 145, 40, 99, 30, 4, 14, 232, 209, 192, 125, 53, 216, 44, 180, + 243, 81, 239, 68, 42, 7, 22, 64, 228, 13, 135, 13, 34, 246, 22, 138, 83, 119, 64, 19, 148, + 64, 66, 4, 151, 133, 119, 161, 179, 40, 204, 64, 38, 6, 29, 11, 0, 95, 154, 202, 36, 28, + 141, 207, 47, 7, 99, 40, 230, 33, 11, 160, 163, 78, 22, 0, 38, 56, 31, 5, 123, 11, 96, 152, + 103, 178, 0, 112, 167, 72, 89, 81, 165, 29, 16, 50, 72, 68, 50, 161, 134, 22, 23, 227, 157, + 198, 238, 164, 133, 197, 14, 131, 165, 192, 226, 143, 144, 71, 155, 82, 67, 11, 64, 60, 107, + 114, 106, 15, 134, 62, 177, 5, 128, 197, 33, 64, 212, 132, 121, 3, 56, 86, 249, 118, 1, 251, + 228, 109, 2, 4, 91, 218, 138, 24, 12, 21, 89, 101, 43, 48, 116, 137, 117, 137, 62, 61, 222, + 0, 68, 46, 255, 234, 22, 192, 61, 174, 5, 224, 0, 229, 84, 11, 224, 144, 28, 79, 22, 128, + 142, 199, 100, 1, 226, 9, 22, 192, 13, 44, 0, 50, 254, 88, 72, 248, 23, 54, 251, 7, 176, 0, + 198, 75, 254, 61, 180, 0, 121, 225, 1, 32, 46, 113, 174, 211, 6, 139, 50, 89, 0, 240, 32, + 153, 91, 11, 64, 199, 206, 35, 88, 128, 248, 109, 22, 128, 133, 163, 241, 249, 69, 95, 109, + 1, 132, 58, 221, 2, 32, 128, 123, 12, 11, 0, 229, 157, 100, 1, 18, 24, 250, 196, 22, 128, + 142, 135, 99, 22, 0, 139, 63, 70, 30, 14, 165, 210, 93, 192, 198, 3, 22, 160, 5, 67, 151, + 90, 11, 208, 246, 41, 224, 208, 165, 188, 126, 74, 249, 212, 160, 219, 124, 234, 19, 202, + 156, 7, 51, 200, 242, 186, 125, 150, 215, 136, 126, 36, 74, 141, 251, 72, 212, 140, 102, + 206, 49, 211, 51, 133, 15, 126, 138, 160, 16, 85, 232, 6, 161, 113, 52, 8, 125, 251, 249, + 126, 65, 58, 217, 204, 111, 150, 243, 213, 164, 175, 61, 66, 142, 234, 182, 203, 120, 90, + 174, 47, 76, 82, 109, 44, 185, 62, 135, 116, 203, 119, 36, 45, 83, 184, 3, 243, 136, 175, + 146, 176, 18, 17, 150, 11, 97, 23, 194, 38, 68, 27, 49, 165, 133, 208, 142, 254, 154, 194, + 70, 46, 57, 84, 116, 39, 17, 250, 130, 192, 163, 144, 213, 50, 167, 177, 144, 248, 195, 215, + 215, 136, 244, 140, 192, 247, 2, 50, 69, 150, 195, 1, 15, 115, 67, 38, 83, 113, 140, 137, + 216, 146, 152, 56, 196, 121, 212, 23, 103, 14, 157, 145, 92, 162, 157, 206, 0, 206, 29, 113, + 124, 106, 154, 136, 164, 92, 72, 117, 40, 121, 50, 58, 133, 80, 44, 64, 206, 140, 57, 114, + 26, 48, 22, 230, 51, 241, 160, 190, 48, 113, 120, 214, 102, 159, 73, 35, 243, 132, 18, 95, + 130, 29, 231, 169, 74, 31, 132, 45, 56, 179, 72, 49, 81, 113, 155, 165, 50, 32, 148, 129, + 89, 6, 193, 92, 102, 69, 160, 228, 247, 71, 193, 207, 40, 161, 80, 126, 150, 33, 39, 230, + 42, 146, 8, 248, 248, 45, 156, 187, 65, 202, 13, 67, 241, 229, 58, 138, 118, 56, 200, 22, + 202, 107, 214, 178, 74, 15, 36, 96, 98, 129, 19, 23, 93, 84, 210, 78, 129, 193, 216, 178, + 217, 154, 3, 142, 102, 76, 155, 177, 224, 100, 87, 84, 84, 50, 152, 16, 142, 10, 177, 231, + 34, 147, 174, 185, 45, 51, 136, 46, 182, 4, 32, 36, 12, 12, 137, 117, 141, 227, 4, 107, 90, + 81, 193, 68, 33, 198, 74, 198, 68, 159, 32, 23, 63, 211, 184, 154, 24, 23, 194, 114, 254, + 131, 49, 48, 66, 49, 164, 99, 21, 152, 168, 105, 152, 238, 83, 123, 76, 244, 136, 55, 86, + 105, 175, 200, 198, 180, 170, 84, 94, 63, 137, 172, 63, 39, 125, 173, 237, 228, 58, 145, 15, + 149, 81, 62, 90, 214, 191, 237, 95, 101, 253, 83, 90, 26, 154, 205, 9, 216, 163, 105, 255, + 156, 161, 78, 89, 227, 105, 105, 255, 122, 229, 140, 139, 157, 180, 127, 73, 185, 215, 2, + 183, 207, 144, 1, 14, 149, 16, 92, 134, 145, 12, 57, 243, 17, 221, 244, 189, 207, 99, 218, + 92, 60, 172, 138, 75, 229, 32, 237, 143, 190, 117, 150, 255, 43, 211, 254, 89, 196, 118, + 189, 198, 211, 254, 249, 199, 201, 105, 127, 247, 141, 105, 127, 237, 79, 74, 251, 247, 179, + 250, 133, 158, 70, 218, 191, 90, 140, 67, 105, 255, 163, 240, 207, 105, 255, 65, 125, 225, + 43, 196, 245, 19, 185, 148, 18, 229, 177, 47, 252, 70, 158, 252, 133, 159, 29, 193, 19, 191, + 240, 27, 245, 224, 23, 254, 163, 151, 83, 78, 250, 210, 255, 23, 207, 254, 155, 199, 205, + 254, 203, 175, 201, 254, 35, 216, 11, 41, 251, 239, 125, 202, 254, 59, 219, 203, 254, 251, + 97, 246, 31, 81, 122, 47, 251, 111, 85, 96, 50, 82, 165, 18, 7, 12, 242, 128, 92, 63, 146, + 253, 23, 166, 10, 240, 210, 88, 120, 104, 28, 8, 155, 28, 244, 17, 212, 247, 217, 127, 241, + 8, 217, 127, 103, 191, 49, 251, 111, 210, 120, 233, 167, 101, 255, 105, 155, 157, 156, 253, + 71, 82, 246, 49, 178, 255, 242, 212, 236, 127, 2, 67, 159, 56, 242, 39, 112, 28, 203, 254, + 151, 5, 236, 147, 119, 134, 1, 1, 48, 212, 52, 154, 253, 87, 254, 112, 228, 111, 204, 176, + 222, 39, 208, 81, 249, 80, 228, 255, 45, 145, 118, 156, 246, 101, 50, 154, 131, 241, 255, + 227, 222, 66, 194, 157, 219, 225, 61, 164, 246, 157, 111, 126, 59, 63, 255, 249, 247, 246, + 227, 108, 239, 149, 100, 95, 211, 232, 175, 186, 247, 228, 79, 187, 248, 100, 108, 255, 72, + 113, 106, 236, 226, 83, 39, 157, 128, 187, 181, 103, 156, 232, 202, 247, 70, 125, 247, 60, + 49, 163, 231, 201, 229, 242, 110, 177, 253, 117, 241, 223, 183, 235, 187, 249, 234, 183, + 139, 137, 183, 160, 140, 199, 85, 157, 17, 47, 227, 255, 73, 156, 21, 70, 178, 78, 132, 42, + 10, 211, 220, 134, 11, 69, 173, 11, 134, 54, 218, 94, 165, 191, 42, 215, 75, 122, 129, 230, + 33, 106, 189, 27, 124, 243, 201, 4, 51, 23, 149, 236, 120, 80, 229, 58, 78, 185, 154, 227, + 139, 35, 154, 175, 15, 241, 85, 157, 252, 236, 179, 159, 91, 198, 151, 203, 15, 165, 45, + 178, 25, 85, 237, 184, 250, 170, 14, 251, 236, 217, 133, 133, 28, 28, 93, 86, 101, 59, 103, + 209, 189, 7, 163, 138, 39, 216, 155, 95, 145, 177, 214, 73, 237, 179, 131, 39, 159, 69, 120, + 198, 13, 24, 35, 91, 183, 89, 103, 157, 150, 126, 157, 144, 120, 112, 207, 6, 179, 239, 187, + 236, 101, 149, 248, 45, 149, 67, 222, 186, 236, 49, 223, 16, 210, 57, 220, 65, 7, 147, 213, + 163, 170, 215, 119, 150, 172, 146, 192, 59, 193, 174, 64, 129, 65, 169, 75, 65, 121, 246, + 216, 209, 55, 247, 135, 199, 206, 201, 243, 226, 173, 115, 166, 40, 171, 165, 138, 25, 77, + 181, 68, 125, 42, 177, 227, 224, 86, 84, 29, 5, 148, 240, 237, 0, 65, 214, 131, 109, 217, + 113, 46, 74, 235, 19, 222, 61, 86, 63, 112, 216, 143, 65, 223, 196, 135, 182, 198, 216, 105, + 50, 52, 48, 211, 14, 147, 137, 185, 197, 120, 56, 153, 188, 254, 188, 89, 46, 54, 36, 218, + 116, 169, 156, 153, 36, 149, 179, 7, 165, 234, 164, 97, 255, 62, 61, 249, 238, 220, 52, 201, + 242, 255, 51, 252, 41, 192, 0, 54, 34, 190, 116, 13, 10, 101, 110, 100, 115, 116, 114, 101, + 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 52, 55, 32, 48, 32, 111, 98, 106, 13, 60, + 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, + 47, 70, 105, 114, 115, 116, 32, 54, 57, 47, 76, 101, 110, 103, 116, 104, 32, 50, 54, 49, 47, + 78, 32, 57, 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, + 101, 97, 109, 13, 10, 104, 222, 132, 81, 77, 75, 196, 48, 20, 252, 43, 239, 168, 167, 124, + 118, 219, 194, 178, 224, 234, 86, 15, 178, 22, 219, 131, 31, 236, 33, 72, 208, 96, 72, 151, + 110, 234, 199, 191, 247, 37, 161, 165, 138, 174, 135, 48, 76, 242, 102, 222, 12, 225, 84, 0, + 5, 78, 37, 100, 2, 33, 3, 198, 57, 226, 2, 88, 17, 48, 7, 206, 240, 208, 2, 132, 12, 188, 4, + 145, 51, 188, 163, 32, 89, 129, 200, 64, 162, 110, 185, 36, 231, 221, 224, 60, 72, 82, 153, + 254, 224, 163, 31, 133, 91, 114, 173, 34, 201, 34, 105, 63, 247, 154, 220, 12, 222, 26, 167, + 15, 171, 21, 138, 206, 162, 67, 120, 219, 234, 15, 31, 215, 5, 82, 171, 94, 187, 64, 69, + 164, 205, 6, 132, 72, 99, 173, 241, 86, 159, 52, 123, 173, 159, 94, 96, 115, 58, 154, 96, + 220, 95, 116, 117, 175, 223, 38, 207, 164, 92, 91, 229, 94, 161, 86, 207, 58, 105, 47, 30, + 147, 239, 221, 253, 3, 98, 129, 21, 221, 96, 237, 142, 52, 228, 178, 107, 187, 201, 190, + 136, 67, 169, 34, 155, 42, 150, 243, 138, 229, 188, 70, 118, 36, 142, 28, 59, 241, 92, 204, + 146, 109, 245, 59, 84, 198, 41, 11, 169, 221, 152, 47, 205, 84, 198, 95, 97, 188, 197, 207, + 100, 248, 15, 223, 54, 29, 239, 154, 255, 215, 21, 215, 101, 244, 143, 133, 95, 2, 12, 0, + 196, 33, 142, 199, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 49, 52, 56, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 76, 101, 110, 103, + 116, 104, 32, 49, 52, 50, 55, 47, 83, 117, 98, 116, 121, 112, 101, 47, 88, 77, 76, 47, 84, + 121, 112, 101, 47, 77, 101, 116, 97, 100, 97, 116, 97, 62, 62, 115, 116, 114, 101, 97, 109, + 13, 10, 60, 63, 120, 112, 97, 99, 107, 101, 116, 32, 98, 101, 103, 105, 110, 61, 34, 239, + 187, 191, 34, 32, 105, 100, 61, 34, 87, 53, 77, 48, 77, 112, 67, 101, 104, 105, 72, 122, + 114, 101, 83, 122, 78, 84, 99, 122, 107, 99, 57, 100, 34, 63, 62, 10, 60, 120, 58, 120, 109, + 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, + 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, + 65, 100, 111, 98, 101, 32, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 50, 45, 99, 48, + 48, 49, 32, 54, 51, 46, 49, 51, 57, 52, 51, 57, 44, 32, 50, 48, 49, 48, 47, 48, 57, 47, 50, + 55, 45, 49, 51, 58, 51, 55, 58, 50, 54, 32, 32, 32, 32, 32, 32, 32, 32, 34, 62, 10, 32, 32, + 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, + 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, + 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, + 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, + 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, + 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, + 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 50, 48, 50, 51, + 45, 48, 49, 45, 51, 49, 84, 50, 51, 58, 53, 48, 58, 52, 48, 43, 48, 53, 58, 51, 48, 60, 47, + 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, + 50, 48, 50, 51, 45, 48, 50, 45, 48, 49, 84, 48, 53, 58, 48, 57, 58, 48, 51, 43, 48, 53, 58, + 51, 48, 60, 47, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 101, 116, 97, 100, 97, 116, + 97, 68, 97, 116, 101, 62, 50, 48, 50, 51, 45, 48, 50, 45, 48, 49, 84, 48, 53, 58, 48, 57, + 58, 48, 51, 43, 48, 53, 58, 51, 48, 60, 47, 120, 109, 112, 58, 77, 101, 116, 97, 100, 97, + 116, 97, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, + 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, + 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, + 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, + 109, 108, 110, 115, 58, 112, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, + 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 112, 100, 102, 47, 49, 46, 51, 47, 34, 62, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 112, 100, 102, 58, 80, 114, 111, 100, 117, 99, 101, + 114, 62, 100, 111, 80, 68, 70, 32, 86, 101, 114, 32, 55, 46, 51, 32, 66, 117, 105, 108, 100, + 32, 51, 57, 49, 32, 40, 117, 110, 107, 110, 111, 119, 110, 32, 87, 105, 110, 100, 111, 119, + 115, 32, 118, 101, 114, 115, 105, 111, 110, 32, 45, 32, 86, 101, 114, 115, 105, 111, 110, + 58, 32, 49, 48, 46, 48, 46, 49, 53, 48, 54, 51, 32, 40, 120, 54, 52, 41, 41, 60, 47, 112, + 100, 102, 58, 80, 114, 111, 100, 117, 99, 101, 114, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, + 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, + 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, + 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, 58, 47, + 47, 112, 117, 114, 108, 46, 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, 110, + 116, 115, 47, 49, 46, 49, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, 99, + 58, 102, 111, 114, 109, 97, 116, 62, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, + 112, 100, 102, 60, 47, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 60, 100, 99, 58, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 65, 108, 116, 62, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 108, 105, 32, 120, 109, 108, 58, + 108, 97, 110, 103, 61, 34, 120, 45, 100, 101, 102, 97, 117, 108, 116, 34, 47, 62, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 65, 108, 116, 62, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 47, 100, 99, 58, 116, 105, 116, 108, 101, 62, 10, + 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, + 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, + 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, + 77, 77, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, + 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 109, 109, 47, 34, 62, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 60, 120, 109, 112, 77, 77, 58, 68, 111, 99, 117, 109, 101, 110, 116, 73, + 68, 62, 117, 117, 105, 100, 58, 100, 49, 101, 102, 49, 54, 57, 98, 45, 97, 54, 100, 101, 45, + 52, 49, 57, 101, 45, 57, 102, 48, 97, 45, 97, 48, 53, 97, 50, 100, 54, 53, 53, 49, 102, 48, + 60, 47, 120, 109, 112, 77, 77, 58, 68, 111, 99, 117, 109, 101, 110, 116, 73, 68, 62, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 77, 77, 58, 73, 110, 115, 116, 97, 110, + 99, 101, 73, 68, 62, 117, 117, 105, 100, 58, 51, 55, 52, 100, 48, 101, 98, 57, 45, 51, 48, + 54, 53, 45, 52, 98, 56, 56, 45, 97, 55, 100, 51, 45, 54, 52, 98, 55, 97, 51, 53, 55, 49, 56, + 57, 49, 60, 47, 120, 109, 112, 77, 77, 58, 73, 110, 115, 116, 97, 110, 99, 101, 73, 68, 62, + 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, + 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, + 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 60, 63, 120, 112, 97, 99, 107, 101, 116, + 32, 101, 110, 100, 61, 34, 114, 34, 63, 62, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, + 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 52, 57, 32, 48, 32, 111, 98, 106, 13, 60, 60, + 47, 76, 101, 110, 103, 116, 104, 32, 49, 52, 50, 55, 47, 83, 117, 98, 116, 121, 112, 101, + 47, 88, 77, 76, 47, 84, 121, 112, 101, 47, 77, 101, 116, 97, 100, 97, 116, 97, 62, 62, 115, + 116, 114, 101, 97, 109, 13, 10, 60, 63, 120, 112, 97, 99, 107, 101, 116, 32, 98, 101, 103, + 105, 110, 61, 34, 239, 187, 191, 34, 32, 105, 100, 61, 34, 87, 53, 77, 48, 77, 112, 67, 101, + 104, 105, 72, 122, 114, 101, 83, 122, 78, 84, 99, 122, 107, 99, 57, 100, 34, 63, 62, 10, 60, + 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, + 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, + 116, 107, 61, 34, 65, 100, 111, 98, 101, 32, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, + 50, 45, 99, 48, 48, 49, 32, 54, 51, 46, 49, 51, 57, 52, 51, 57, 44, 32, 50, 48, 49, 48, 47, + 48, 57, 47, 50, 55, 45, 49, 51, 58, 51, 55, 58, 50, 54, 32, 32, 32, 32, 32, 32, 32, 32, 34, + 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, + 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, + 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, + 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, + 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, + 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, + 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, + 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, + 50, 48, 50, 51, 45, 48, 49, 45, 50, 52, 84, 49, 53, 58, 53, 48, 58, 51, 50, 43, 48, 53, 58, + 51, 48, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, + 116, 101, 62, 50, 48, 50, 51, 45, 48, 49, 45, 50, 55, 84, 49, 57, 58, 51, 54, 58, 50, 49, + 43, 48, 53, 58, 51, 48, 60, 47, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, + 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 101, 116, 97, + 100, 97, 116, 97, 68, 97, 116, 101, 62, 50, 48, 50, 51, 45, 48, 49, 45, 50, 55, 84, 49, 57, + 58, 51, 54, 58, 50, 49, 43, 48, 53, 58, 51, 48, 60, 47, 120, 109, 112, 58, 77, 101, 116, 97, + 100, 97, 116, 97, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, + 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, + 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, + 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 120, 109, 108, 110, 115, 58, 112, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, + 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 112, 100, 102, 47, 49, 46, 51, 47, 34, + 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 112, 100, 102, 58, 80, 114, 111, 100, 117, + 99, 101, 114, 62, 100, 111, 80, 68, 70, 32, 86, 101, 114, 32, 55, 46, 51, 32, 66, 117, 105, + 108, 100, 32, 51, 56, 55, 32, 40, 117, 110, 107, 110, 111, 119, 110, 32, 87, 105, 110, 100, + 111, 119, 115, 32, 118, 101, 114, 115, 105, 111, 110, 32, 45, 32, 86, 101, 114, 115, 105, + 111, 110, 58, 32, 49, 48, 46, 48, 46, 49, 57, 48, 52, 52, 32, 40, 120, 54, 52, 41, 41, 60, + 47, 112, 100, 102, 58, 80, 114, 111, 100, 117, 99, 101, 114, 62, 10, 32, 32, 32, 32, 32, 32, + 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, + 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, + 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, + 58, 47, 47, 112, 117, 114, 108, 46, 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, + 110, 116, 115, 47, 49, 46, 49, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, + 99, 58, 102, 111, 114, 109, 97, 116, 62, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, + 47, 112, 100, 102, 60, 47, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 60, 100, 99, 58, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 65, 108, 116, 62, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 108, 105, 32, 120, 109, 108, + 58, 108, 97, 110, 103, 61, 34, 120, 45, 100, 101, 102, 97, 117, 108, 116, 34, 47, 62, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 65, 108, 116, 62, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 47, 100, 99, 58, 116, 105, 116, 108, 101, 62, + 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, + 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, + 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, + 77, 77, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, + 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 109, 109, 47, 34, 62, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 60, 120, 109, 112, 77, 77, 58, 68, 111, 99, 117, 109, 101, 110, 116, 73, + 68, 62, 117, 117, 105, 100, 58, 49, 98, 54, 54, 99, 53, 54, 49, 45, 100, 53, 52, 100, 45, + 52, 102, 99, 101, 45, 97, 102, 54, 97, 45, 99, 50, 53, 52, 102, 100, 55, 100, 53, 55, 102, + 101, 60, 47, 120, 109, 112, 77, 77, 58, 68, 111, 99, 117, 109, 101, 110, 116, 73, 68, 62, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 77, 77, 58, 73, 110, 115, 116, + 97, 110, 99, 101, 73, 68, 62, 117, 117, 105, 100, 58, 51, 49, 102, 56, 56, 99, 55, 50, 45, + 53, 98, 56, 54, 45, 52, 101, 99, 48, 45, 56, 55, 97, 53, 45, 52, 52, 55, 48, 54, 55, 52, 52, + 98, 55, 54, 55, 60, 47, 120, 109, 112, 77, 77, 58, 73, 110, 115, 116, 97, 110, 99, 101, 73, + 68, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, + 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, + 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 60, 63, 120, 112, 97, 99, 107, + 101, 116, 32, 101, 110, 100, 61, 34, 114, 34, 63, 62, 13, 10, 101, 110, 100, 115, 116, 114, + 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 53, 48, 32, 48, 32, 111, 98, 106, 13, + 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, + 101, 47, 70, 105, 114, 115, 116, 32, 56, 54, 53, 47, 76, 101, 110, 103, 116, 104, 32, 49, + 51, 50, 48, 47, 78, 32, 49, 48, 48, 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, + 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 140, 86, 77, 111, 84, 71, 16, 252, + 43, 125, 195, 86, 20, 118, 186, 231, 27, 33, 31, 18, 43, 82, 132, 64, 22, 160, 228, 128, 57, + 88, 120, 19, 89, 1, 111, 100, 214, 1, 254, 125, 170, 251, 117, 35, 8, 18, 147, 195, 106, + 234, 141, 103, 234, 213, 76, 87, 215, 179, 176, 80, 34, 225, 76, 189, 96, 40, 196, 60, 48, + 86, 60, 86, 140, 141, 122, 213, 249, 78, 189, 101, 140, 131, 122, 23, 140, 147, 250, 96, 18, + 73, 212, 39, 182, 11, 99, 156, 24, 133, 70, 194, 126, 201, 52, 176, 71, 164, 208, 144, 134, + 177, 210, 200, 224, 3, 30, 5, 124, 210, 105, 84, 240, 201, 160, 209, 192, 39, 147, 70, 7, + 95, 78, 52, 6, 248, 50, 99, 4, 95, 6, 223, 4, 95, 206, 52, 19, 248, 114, 161, 9, 77, 2, 174, + 9, 78, 201, 141, 38, 230, 36, 119, 154, 5, 124, 121, 208, 172, 224, 203, 147, 102, 3, 95, + 73, 52, 59, 248, 10, 99, 4, 95, 17, 154, 3, 124, 88, 59, 39, 248, 160, 133, 83, 2, 33, 14, + 203, 9, 167, 150, 210, 0, 32, 91, 74, 7, 192, 123, 165, 12, 0, 108, 148, 50, 1, 42, 88, 107, + 2, 104, 160, 197, 3, 0, 120, 241, 78, 78, 29, 196, 56, 20, 167, 1, 230, 170, 204, 19, 204, + 21, 204, 216, 6, 0, 102, 198, 5, 75, 5, 51, 227, 134, 164, 130, 153, 113, 68, 169, 96, 102, + 104, 20, 144, 50, 131, 94, 32, 30, 0, 204, 184, 29, 230, 6, 102, 92, 63, 115, 7, 115, 179, + 26, 129, 185, 41, 243, 4, 115, 3, 179, 36, 48, 55, 48, 107, 41, 5, 27, 88, 139, 33, 16, 199, + 122, 155, 130, 91, 96, 189, 14, 193, 53, 179, 30, 69, 80, 71, 86, 9, 210, 193, 44, 19, 219, + 225, 0, 238, 170, 185, 131, 121, 106, 61, 58, 30, 146, 138, 215, 23, 167, 172, 187, 176, 33, + 97, 135, 232, 117, 178, 214, 90, 235, 197, 122, 249, 106, 8, 214, 191, 15, 173, 168, 202, + 24, 90, 226, 162, 51, 90, 115, 125, 26, 90, 52, 117, 216, 176, 42, 234, 140, 150, 85, 107, + 98, 117, 209, 107, 209, 194, 23, 21, 166, 206, 42, 19, 51, 83, 47, 93, 116, 70, 47, 75, 141, + 168, 179, 85, 157, 161, 186, 155, 150, 105, 187, 8, 157, 209, 3, 36, 157, 233, 122, 54, 157, + 209, 67, 170, 102, 181, 168, 250, 51, 167, 164, 154, 50, 0, 171, 2, 157, 17, 125, 141, 206, + 232, 186, 162, 51, 69, 119, 234, 76, 213, 117, 58, 211, 244, 65, 103, 58, 126, 67, 103, 240, + 211, 82, 230, 52, 1, 170, 62, 37, 252, 160, 46, 51, 83, 86, 127, 63, 126, 188, 123, 98, 253, + 149, 232, 249, 238, 226, 234, 110, 127, 123, 124, 121, 183, 223, 91, 175, 125, 61, 245, 108, + 255, 241, 248, 100, 255, 137, 106, 223, 189, 252, 244, 247, 126, 247, 226, 120, 119, 255, + 198, 254, 242, 252, 112, 56, 158, 157, 41, 211, 171, 140, 98, 98, 155, 85, 13, 227, 235, + 221, 5, 152, 196, 152, 94, 236, 206, 15, 111, 238, 223, 129, 205, 214, 62, 187, 127, 247, + 254, 85, 178, 94, 214, 13, 108, 221, 108, 91, 173, 159, 21, 109, 29, 173, 168, 88, 79, 43, + 170, 214, 213, 138, 154, 245, 181, 162, 110, 157, 173, 104, 235, 109, 69, 211, 186, 219, + 152, 147, 53, 184, 65, 182, 30, 55, 40, 214, 230, 6, 183, 78, 55, 88, 172, 217, 13, 86, 235, + 119, 131, 205, 90, 222, 96, 183, 174, 55, 184, 53, 190, 193, 105, 189, 111, 234, 147, 181, + 191, 65, 182, 4, 48, 40, 22, 2, 6, 183, 28, 48, 88, 44, 10, 12, 86, 75, 3, 131, 205, 2, 97, + 187, 69, 203, 4, 131, 91, 44, 24, 156, 150, 12, 118, 67, 201, 178, 193, 32, 91, 58, 24, 20, + 203, 7, 131, 91, 66, 24, 44, 150, 17, 6, 171, 165, 132, 193, 102, 57, 97, 176, 91, 82, 24, + 220, 178, 194, 224, 180, 180, 176, 42, 36, 203, 11, 131, 108, 137, 97, 80, 44, 51, 12, 110, + 169, 97, 176, 88, 110, 24, 172, 150, 28, 6, 155, 101, 135, 193, 110, 233, 97, 112, 203, 15, + 131, 211, 18, 196, 42, 157, 44, 67, 12, 178, 165, 136, 65, 177, 28, 49, 184, 37, 137, 193, + 98, 89, 98, 176, 90, 154, 24, 108, 150, 39, 234, 195, 179, 51, 88, 211, 102, 95, 191, 210, + 252, 112, 208, 2, 244, 0, 35, 192, 116, 48, 98, 215, 224, 0, 18, 32, 7, 40, 1, 130, 121, 4, + 243, 8, 230, 17, 204, 35, 152, 103, 48, 207, 96, 158, 193, 60, 131, 121, 6, 243, 12, 230, + 25, 204, 51, 152, 103, 48, 79, 103, 214, 252, 112, 192, 1, 36, 64, 14, 80, 2, 212, 0, 45, + 64, 15, 48, 2, 4, 51, 7, 51, 7, 51, 7, 51, 7, 51, 7, 51, 7, 51, 7, 51, 7, 51, 7, 51, 7, 179, + 4, 179, 4, 179, 4, 179, 4, 179, 4, 179, 4, 179, 4, 179, 4, 179, 4, 179, 196, 61, 247, 141, + 199, 146, 46, 105, 32, 117, 79, 187, 63, 245, 43, 228, 217, 132, 156, 219, 114, 233, 215, + 219, 63, 14, 246, 173, 209, 249, 39, 97, 22, 114, 175, 144, 91, 133, 220, 41, 228, 70, 33, + 247, 9, 185, 77, 200, 93, 66, 110, 18, 114, 143, 144, 91, 132, 220, 33, 228, 6, 33, 247, 7, + 185, 61, 200, 221, 65, 110, 14, 114, 111, 144, 91, 131, 220, 25, 228, 198, 32, 247, 5, 185, + 45, 200, 93, 65, 110, 10, 114, 79, 144, 91, 130, 220, 17, 228, 134, 32, 247, 3, 185, 29, + 200, 221, 64, 110, 6, 114, 47, 144, 91, 129, 220, 9, 228, 70, 32, 247, 1, 185, 13, 200, 93, + 64, 110, 2, 114, 15, 80, 142, 108, 247, 100, 119, 3, 144, 215, 159, 188, 252, 228, 213, 39, + 47, 62, 121, 237, 201, 75, 79, 94, 121, 242, 194, 147, 215, 157, 188, 236, 20, 85, 223, 61, + 221, 31, 175, 174, 175, 142, 87, 200, 246, 177, 149, 253, 243, 231, 238, 139, 170, 255, 124, + 183, 191, 58, 222, 28, 110, 207, 175, 142, 251, 147, 243, 71, 146, 144, 253, 172, 223, 206, + 154, 74, 250, 33, 213, 7, 57, 61, 56, 221, 61, 61, 92, 127, 185, 64, 18, 254, 115, 74, 51, + 229, 207, 11, 46, 238, 14, 215, 247, 111, 246, 119, 39, 215, 135, 139, 243, 95, 232, 183, + 253, 29, 245, 135, 153, 126, 186, 191, 121, 123, 141, 36, 101, 186, 60, 185, 191, 253, 235, + 246, 240, 225, 150, 126, 191, 185, 189, 62, 124, 120, 79, 255, 236, 239, 222, 227, 197, 244, + 163, 174, 86, 244, 8, 95, 172, 135, 233, 33, 254, 207, 66, 38, 94, 158, 124, 108, 229, 242, + 244, 242, 244, 116, 247, 242, 230, 248, 118, 127, 114, 186, 125, 104, 255, 107, 228, 111, + 14, 244, 205, 138, 190, 92, 49, 151, 43, 182, 90, 127, 127, 201, 90, 201, 230, 136, 239, 47, + 89, 171, 229, 181, 92, 89, 203, 149, 181, 92, 89, 203, 149, 181, 92, 89, 203, 205, 107, 185, + 121, 45, 55, 175, 229, 230, 181, 220, 188, 150, 91, 214, 114, 203, 90, 110, 89, 203, 45, + 107, 185, 101, 45, 183, 174, 229, 214, 181, 220, 186, 126, 81, 91, 191, 168, 173, 95, 212, + 214, 247, 210, 214, 247, 210, 214, 114, 251, 90, 110, 255, 31, 233, 178, 150, 219, 215, 114, + 251, 90, 238, 248, 90, 238, 191, 2, 12, 0, 80, 130, 119, 159, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 53, 49, 32, 48, 32, 111, + 98, 106, 13, 60, 60, 47, 69, 120, 116, 101, 110, 100, 115, 32, 49, 53, 48, 32, 48, 32, 82, + 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, + 70, 105, 114, 115, 116, 32, 49, 54, 52, 47, 76, 101, 110, 103, 116, 104, 32, 51, 53, 48, 47, + 78, 32, 50, 49, 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, 109, 62, 62, 115, 116, 114, + 101, 97, 109, 13, 10, 104, 222, 140, 147, 79, 75, 195, 64, 16, 197, 191, 202, 220, 218, 32, + 54, 59, 51, 251, 39, 91, 74, 14, 90, 4, 41, 133, 160, 162, 151, 94, 130, 137, 18, 44, 9, + 164, 169, 245, 227, 59, 155, 138, 32, 42, 155, 211, 188, 151, 253, 237, 206, 35, 59, 203, + 72, 160, 128, 145, 129, 141, 20, 13, 46, 56, 3, 168, 130, 181, 128, 58, 120, 7, 232, 130, + 207, 128, 48, 120, 15, 164, 197, 147, 2, 202, 196, 19, 142, 123, 152, 72, 78, 17, 77, 114, + 90, 230, 164, 106, 208, 65, 147, 1, 109, 188, 84, 11, 218, 7, 206, 129, 225, 192, 101, 96, + 108, 224, 60, 88, 37, 28, 43, 176, 44, 156, 172, 217, 208, 143, 9, 28, 91, 88, 173, 210, 13, + 168, 180, 0, 114, 44, 97, 239, 210, 226, 21, 178, 179, 186, 79, 139, 178, 31, 242, 252, 79, + 196, 196, 17, 23, 71, 124, 20, 241, 24, 71, 226, 113, 125, 60, 174, 143, 199, 245, 241, 184, + 168, 112, 2, 195, 19, 152, 120, 98, 148, 113, 137, 51, 52, 129, 209, 19, 24, 59, 129, 201, + 226, 12, 253, 147, 57, 204, 229, 23, 195, 230, 23, 115, 219, 190, 116, 227, 200, 134, 239, + 155, 113, 152, 131, 218, 214, 67, 89, 149, 67, 41, 47, 233, 124, 53, 210, 11, 127, 253, 220, + 235, 190, 46, 135, 166, 107, 215, 229, 80, 207, 215, 75, 82, 196, 10, 73, 163, 49, 138, 233, + 66, 153, 25, 171, 89, 146, 110, 187, 234, 39, 224, 208, 179, 37, 252, 6, 138, 190, 171, 142, + 207, 117, 63, 175, 186, 98, 125, 3, 143, 117, 15, 110, 193, 112, 117, 108, 246, 213, 248, + 36, 119, 243, 99, 251, 214, 118, 167, 22, 158, 154, 182, 234, 78, 7, 120, 175, 251, 131, 52, + 134, 203, 64, 7, 181, 148, 139, 93, 168, 5, 122, 165, 181, 240, 31, 86, 239, 146, 93, 146, + 164, 15, 205, 176, 175, 231, 73, 158, 127, 10, 48, 0, 142, 41, 251, 213, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 53, 50, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 76, 101, 110, 103, 116, 104, 32, 51, 51, 54, 49, 47, 83, + 117, 98, 116, 121, 112, 101, 47, 88, 77, 76, 47, 84, 121, 112, 101, 47, 77, 101, 116, 97, + 100, 97, 116, 97, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 60, 63, 120, 112, 97, 99, + 107, 101, 116, 32, 98, 101, 103, 105, 110, 61, 34, 239, 187, 191, 34, 32, 105, 100, 61, 34, + 87, 53, 77, 48, 77, 112, 67, 101, 104, 105, 72, 122, 114, 101, 83, 122, 78, 84, 99, 122, + 107, 99, 57, 100, 34, 63, 62, 10, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, + 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, + 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 65, 100, 111, 98, 101, 32, 88, 77, + 80, 32, 67, 111, 114, 101, 32, 53, 46, 50, 45, 99, 48, 48, 49, 32, 54, 51, 46, 49, 51, 57, + 52, 51, 57, 44, 32, 50, 48, 49, 48, 47, 48, 57, 47, 50, 55, 45, 49, 51, 58, 51, 55, 58, 50, + 54, 32, 32, 32, 32, 32, 32, 32, 32, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, + 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, + 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, + 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, + 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, + 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, + 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, + 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, + 100, 105, 102, 121, 68, 97, 116, 101, 62, 50, 48, 50, 51, 45, 48, 50, 45, 48, 49, 84, 48, + 56, 58, 50, 56, 58, 50, 49, 43, 48, 53, 58, 51, 48, 60, 47, 120, 109, 112, 58, 77, 111, 100, + 105, 102, 121, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, + 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 50, 48, 50, 51, 45, 48, 50, 45, + 48, 49, 84, 48, 53, 58, 50, 56, 58, 48, 52, 43, 48, 53, 58, 51, 48, 60, 47, 120, 109, 112, + 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 60, 120, 109, 112, 58, 77, 101, 116, 97, 100, 97, 116, 97, 68, 97, 116, 101, 62, 50, 48, + 50, 51, 45, 48, 50, 45, 48, 49, 84, 48, 56, 58, 50, 56, 58, 50, 49, 43, 48, 53, 58, 51, 48, + 60, 47, 120, 109, 112, 58, 77, 101, 116, 97, 100, 97, 116, 97, 68, 97, 116, 101, 62, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, + 111, 111, 108, 62, 65, 100, 111, 98, 101, 32, 65, 99, 114, 111, 98, 97, 116, 32, 80, 114, + 111, 32, 49, 48, 46, 49, 46, 49, 54, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, + 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, + 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, + 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, + 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, + 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 112, 117, 114, 108, 46, + 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, 110, 116, 115, 47, 49, 46, 49, 47, + 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, 99, 58, 102, 111, 114, 109, 97, + 116, 62, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 112, 100, 102, 60, 47, 100, + 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, + 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, + 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, + 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 120, 109, 108, 110, 115, 58, 120, 109, 112, 77, 77, 61, 34, 104, 116, 116, 112, 58, 47, 47, + 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, + 109, 109, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 77, 77, 58, + 68, 111, 99, 117, 109, 101, 110, 116, 73, 68, 62, 117, 117, 105, 100, 58, 55, 55, 49, 97, + 56, 101, 100, 50, 45, 52, 54, 52, 48, 45, 52, 54, 54, 55, 45, 57, 54, 97, 54, 45, 56, 49, + 56, 55, 99, 49, 99, 54, 54, 50, 48, 98, 60, 47, 120, 109, 112, 77, 77, 58, 68, 111, 99, 117, + 109, 101, 110, 116, 73, 68, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, + 77, 77, 58, 73, 110, 115, 116, 97, 110, 99, 101, 73, 68, 62, 117, 117, 105, 100, 58, 56, 49, + 52, 97, 53, 57, 97, 49, 45, 51, 48, 102, 57, 45, 52, 52, 50, 56, 45, 98, 53, 102, 99, 45, + 57, 54, 97, 97, 55, 101, 98, 50, 51, 101, 51, 56, 60, 47, 120, 109, 112, 77, 77, 58, 73, + 110, 115, 116, 97, 110, 99, 101, 73, 68, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, + 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, + 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, + 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 120, 109, 108, 110, 115, 58, 112, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, + 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 112, 100, 102, 47, 49, 46, 51, + 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 112, 100, 102, 58, 80, 114, 111, + 100, 117, 99, 101, 114, 62, 65, 100, 111, 98, 101, 32, 65, 99, 114, 111, 98, 97, 116, 32, + 80, 114, 111, 32, 49, 48, 46, 49, 46, 49, 54, 60, 47, 112, 100, 102, 58, 80, 114, 111, 100, + 117, 99, 101, 114, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, + 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, + 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 60, 63, 120, + 112, 97, 99, 107, 101, 116, 32, 101, 110, 100, 61, 34, 119, 34, 63, 62, 13, 10, 101, 110, + 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 53, 51, 32, 48, + 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, 101, + 68, 101, 99, 111, 100, 101, 47, 70, 105, 114, 115, 116, 32, 49, 49, 48, 47, 76, 101, 110, + 103, 116, 104, 32, 51, 50, 50, 47, 78, 32, 49, 52, 47, 84, 121, 112, 101, 47, 79, 98, 106, + 83, 116, 109, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 148, 211, 187, 78, 3, + 65, 12, 5, 208, 95, 241, 31, 236, 120, 108, 207, 67, 138, 210, 80, 210, 68, 17, 29, 162, + 136, 196, 10, 209, 0, 34, 80, 240, 247, 120, 247, 122, 41, 34, 94, 211, 228, 42, 90, 239, + 25, 207, 172, 71, 68, 40, 145, 136, 146, 22, 15, 35, 150, 238, 89, 40, 203, 242, 191, 146, + 176, 121, 54, 146, 174, 158, 157, 180, 10, 137, 38, 50, 203, 158, 76, 69, 216, 51, 83, 101, + 175, 87, 161, 218, 189, 94, 149, 90, 245, 122, 53, 234, 182, 212, 23, 226, 228, 216, 110, + 55, 93, 61, 191, 63, 189, 145, 181, 233, 250, 241, 254, 124, 187, 44, 156, 232, 184, 74, + 158, 119, 211, 205, 199, 203, 60, 29, 78, 15, 243, 121, 191, 255, 170, 22, 217, 170, 13, + 213, 222, 27, 178, 70, 182, 200, 30, 90, 130, 118, 56, 189, 206, 235, 251, 203, 38, 143, + 223, 227, 91, 39, 182, 190, 67, 12, 97, 253, 133, 14, 147, 241, 128, 241, 132, 237, 98, 1, + 253, 121, 1, 195, 2, 12, 141, 193, 101, 112, 25, 92, 30, 231, 50, 184, 28, 59, 142, 182, + 193, 201, 56, 183, 157, 36, 56, 124, 13, 82, 112, 58, 206, 41, 56, 5, 103, 224, 12, 156, + 245, 97, 174, 0, 40, 0, 10, 166, 160, 96, 141, 50, 192, 229, 109, 183, 62, 176, 24, 148, 56, + 48, 221, 198, 48, 6, 76, 203, 255, 7, 40, 204, 138, 30, 107, 140, 14, 160, 138, 30, 235, 69, + 143, 56, 223, 95, 185, 6, 174, 129, 107, 224, 26, 184, 54, 206, 117, 112, 29, 92, 7, 215, + 99, 192, 199, 57, 78, 113, 29, 82, 220, 135, 100, 113, 75, 226, 22, 113, 30, 55, 89, 227, + 221, 18, 137, 91, 205, 57, 204, 252, 183, 249, 41, 192, 0, 248, 186, 50, 33, 13, 10, 101, + 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 49, 53, 52, 32, + 48, 32, 111, 98, 106, 13, 60, 60, 47, 70, 105, 108, 116, 101, 114, 47, 70, 108, 97, 116, + 101, 68, 101, 99, 111, 100, 101, 47, 70, 105, 114, 115, 116, 32, 54, 47, 76, 101, 110, 103, + 116, 104, 32, 49, 49, 56, 47, 78, 32, 49, 47, 84, 121, 112, 101, 47, 79, 98, 106, 83, 116, + 109, 62, 62, 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 50, 54, 49, 87, 48, 80, 176, + 177, 209, 119, 46, 74, 77, 44, 201, 204, 207, 115, 73, 44, 73, 213, 112, 177, 50, 50, 48, + 50, 54, 48, 50, 48, 52, 48, 53, 178, 48, 48, 209, 54, 48, 85, 55, 54, 80, 215, 132, 168, + 202, 47, 210, 112, 76, 201, 79, 74, 85, 112, 76, 46, 202, 79, 74, 44, 81, 8, 40, 202, 87, + 48, 52, 208, 51, 212, 51, 52, 211, 212, 247, 205, 79, 65, 55, 195, 194, 200, 194, 200, 16, + 110, 6, 80, 117, 74, 105, 114, 42, 94, 67, 66, 50, 75, 114, 82, 53, 52, 237, 236, 0, 2, 12, + 0, 155, 53, 43, 222, 13, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 13, 101, 110, 100, + 111, 98, 106, 13, 49, 53, 53, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 68, 101, 99, 111, + 100, 101, 80, 97, 114, 109, 115, 60, 60, 47, 67, 111, 108, 117, 109, 110, 115, 32, 53, 47, + 80, 114, 101, 100, 105, 99, 116, 111, 114, 32, 49, 50, 62, 62, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 73, 68, 91, 60, 51, 66, 67, + 70, 66, 55, 57, 65, 68, 56, 67, 54, 68, 69, 52, 50, 66, 65, 69, 54, 49, 68, 54, 51, 49, 55, + 52, 55, 52, 69, 70, 65, 62, 60, 53, 65, 70, 70, 48, 55, 49, 56, 56, 57, 55, 55, 48, 49, 52, + 49, 66, 57, 69, 70, 70, 57, 56, 67, 65, 48, 69, 54, 49, 69, 51, 52, 62, 93, 47, 73, 110, + 102, 111, 32, 51, 52, 55, 32, 48, 32, 82, 47, 76, 101, 110, 103, 116, 104, 32, 52, 52, 51, + 47, 82, 111, 111, 116, 32, 51, 52, 57, 32, 48, 32, 82, 47, 83, 105, 122, 101, 32, 51, 52, + 56, 47, 84, 121, 112, 101, 47, 88, 82, 101, 102, 47, 87, 91, 49, 32, 51, 32, 49, 93, 62, 62, + 115, 116, 114, 101, 97, 109, 13, 10, 104, 222, 236, 147, 205, 43, 68, 81, 24, 198, 207, 185, + 92, 238, 220, 123, 71, 166, 176, 65, 97, 154, 146, 13, 53, 102, 165, 201, 206, 202, 2, 133, + 169, 161, 88, 140, 242, 81, 108, 88, 106, 88, 74, 179, 179, 100, 101, 101, 129, 127, 193, + 66, 22, 106, 242, 145, 20, 25, 178, 193, 204, 20, 53, 98, 134, 52, 230, 60, 119, 241, 190, + 106, 86, 74, 62, 50, 139, 167, 95, 207, 121, 222, 247, 188, 231, 220, 51, 154, 80, 63, 77, + 138, 212, 130, 208, 132, 144, 49, 165, 162, 13, 124, 163, 212, 92, 2, 55, 42, 213, 251, 176, + 186, 6, 103, 28, 122, 94, 80, 105, 228, 192, 183, 74, 173, 43, 176, 64, 109, 28, 124, 0, + 127, 132, 50, 46, 19, 252, 8, 191, 149, 124, 179, 25, 124, 136, 204, 38, 227, 21, 240, 5, + 50, 59, 196, 174, 78, 240, 29, 248, 148, 216, 156, 96, 249, 48, 235, 51, 192, 106, 107, 88, + 62, 201, 242, 147, 56, 35, 216, 154, 131, 255, 132, 124, 146, 250, 152, 112, 164, 6, 127, + 26, 252, 172, 212, 232, 2, 135, 212, 157, 248, 130, 96, 56, 102, 37, 219, 55, 72, 61, 141, + 56, 249, 122, 19, 203, 60, 176, 153, 179, 52, 143, 177, 200, 102, 238, 96, 249, 81, 54, 103, + 11, 249, 118, 0, 181, 206, 253, 108, 80, 173, 125, 66, 236, 238, 166, 189, 236, 125, 228, + 119, 113, 246, 123, 150, 247, 179, 158, 175, 196, 238, 33, 150, 247, 176, 124, 181, 186, 1, + 121, 4, 223, 5, 63, 13, 62, 3, 31, 35, 83, 14, 46, 5, 207, 130, 251, 149, 78, 57, 239, 193, + 7, 221, 67, 213, 54, 177, 238, 188, 174, 75, 84, 37, 168, 155, 133, 27, 19, 41, 248, 94, + 250, 34, 86, 152, 216, 196, 108, 66, 237, 34, 107, 95, 20, 107, 189, 88, 29, 86, 90, 87, + 143, 85, 56, 81, 156, 183, 39, 70, 249, 8, 50, 2, 111, 56, 148, 33, 127, 190, 1, 29, 80, + 229, 244, 132, 47, 196, 160, 210, 192, 22, 86, 189, 72, 226, 157, 8, 252, 131, 108, 199, + 143, 40, 45, 187, 38, 213, 151, 49, 21, 254, 47, 21, 51, 200, 172, 67, 11, 223, 75, 230, + 226, 99, 232, 160, 222, 221, 71, 109, 127, 43, 238, 251, 153, 239, 201, 19, 87, 229, 139, + 231, 127, 175, 202, 196, 103, 170, 74, 178, 127, 237, 30, 254, 245, 71, 188, 198, 213, 239, + 220, 93, 75, 127, 193, 137, 50, 239, 2, 12, 0, 45, 51, 115, 85, 13, 10, 101, 110, 100, 115, + 116, 114, 101, 97, 109, 13, 101, 110, 100, 111, 98, 106, 13, 115, 116, 97, 114, 116, 120, + 114, 101, 102, 13, 10, 49, 49, 54, 13, 10, 37, 37, 69, 79, 70, 13, 10, 49, 32, 48, 32, 111, + 98, 106, 10, 60, 60, 47, 67, 111, 110, 116, 101, 110, 116, 115, 32, 50, 32, 48, 32, 82, 47, + 67, 114, 111, 112, 66, 111, 120, 91, 32, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, 47, + 77, 101, 100, 105, 97, 66, 111, 120, 91, 32, 48, 32, 48, 32, 53, 57, 53, 32, 56, 52, 50, 93, + 47, 80, 97, 114, 101, 110, 116, 32, 51, 51, 53, 32, 48, 32, 82, 47, 82, 101, 115, 111, 117, + 114, 99, 101, 115, 60, 60, 62, 62, 47, 82, 111, 116, 97, 116, 101, 32, 48, 47, 84, 121, 112, + 101, 47, 80, 97, 103, 101, 47, 65, 110, 110, 111, 116, 115, 32, 51, 55, 50, 32, 48, 32, 82, + 62, 62, 10, 101, 110, 100, 111, 98, 106, 10, 51, 52, 57, 32, 48, 32, 111, 98, 106, 10, 60, + 60, 47, 77, 101, 116, 97, 100, 97, 116, 97, 32, 49, 53, 50, 32, 48, 32, 82, 47, 79, 117, + 116, 108, 105, 110, 101, 115, 32, 50, 48, 51, 32, 48, 32, 82, 47, 80, 97, 103, 101, 115, 32, + 51, 51, 51, 32, 48, 32, 82, 47, 83, 116, 114, 117, 99, 116, 84, 114, 101, 101, 82, 111, 111, + 116, 32, 50, 49, 50, 32, 48, 32, 82, 47, 84, 121, 112, 101, 47, 67, 97, 116, 97, 108, 111, + 103, 47, 65, 99, 114, 111, 70, 111, 114, 109, 60, 60, 47, 68, 82, 60, 60, 47, 70, 111, 110, + 116, 60, 60, 47, 72, 101, 108, 118, 32, 51, 55, 52, 32, 48, 32, 82, 62, 62, 47, 69, 110, 99, + 111, 100, 105, 110, 103, 60, 60, 47, 80, 68, 70, 68, 111, 99, 69, 110, 99, 111, 100, 105, + 110, 103, 32, 51, 55, 53, 32, 48, 32, 82, 62, 62, 62, 62, 62, 62, 62, 62, 10, 101, 110, 100, + 111, 98, 106, 10, 51, 55, 50, 32, 48, 32, 111, 98, 106, 10, 91, 32, 51, 55, 55, 32, 48, 32, + 82, 93, 10, 101, 110, 100, 111, 98, 106, 10, 51, 55, 52, 32, 48, 32, 111, 98, 106, 10, 60, + 60, 47, 66, 97, 115, 101, 70, 111, 110, 116, 47, 72, 101, 108, 118, 101, 116, 105, 99, 97, + 47, 83, 117, 98, 116, 121, 112, 101, 47, 84, 121, 112, 101, 49, 47, 84, 121, 112, 101, 47, + 70, 111, 110, 116, 47, 78, 97, 109, 101, 47, 72, 101, 108, 118, 47, 69, 110, 99, 111, 100, + 105, 110, 103, 32, 51, 55, 53, 32, 48, 32, 82, 62, 62, 10, 101, 110, 100, 111, 98, 106, 10, + 51, 55, 53, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 68, 105, 102, 102, 101, 114, 101, 110, + 99, 101, 115, 91, 32, 50, 52, 47, 98, 114, 101, 118, 101, 47, 99, 97, 114, 111, 110, 47, 99, + 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 100, 111, 116, 97, 99, 99, 101, 110, 116, + 47, 104, 117, 110, 103, 97, 114, 117, 109, 108, 97, 117, 116, 47, 111, 103, 111, 110, 101, + 107, 47, 114, 105, 110, 103, 47, 116, 105, 108, 100, 101, 32, 51, 57, 47, 113, 117, 111, + 116, 101, 115, 105, 110, 103, 108, 101, 32, 57, 54, 47, 103, 114, 97, 118, 101, 32, 49, 50, + 56, 47, 98, 117, 108, 108, 101, 116, 47, 100, 97, 103, 103, 101, 114, 47, 100, 97, 103, 103, + 101, 114, 100, 98, 108, 47, 101, 108, 108, 105, 112, 115, 105, 115, 47, 101, 109, 100, 97, + 115, 104, 47, 101, 110, 100, 97, 115, 104, 47, 102, 108, 111, 114, 105, 110, 47, 102, 114, + 97, 99, 116, 105, 111, 110, 47, 103, 117, 105, 108, 115, 105, 110, 103, 108, 108, 101, 102, + 116, 47, 103, 117, 105, 108, 115, 105, 110, 103, 108, 114, 105, 103, 104, 116, 47, 109, 105, + 110, 117, 115, 47, 112, 101, 114, 116, 104, 111, 117, 115, 97, 110, 100, 47, 113, 117, 111, + 116, 101, 100, 98, 108, 98, 97, 115, 101, 47, 113, 117, 111, 116, 101, 100, 98, 108, 108, + 101, 102, 116, 47, 113, 117, 111, 116, 101, 100, 98, 108, 114, 105, 103, 104, 116, 47, 113, + 117, 111, 116, 101, 108, 101, 102, 116, 47, 113, 117, 111, 116, 101, 114, 105, 103, 104, + 116, 47, 113, 117, 111, 116, 101, 115, 105, 110, 103, 108, 98, 97, 115, 101, 47, 116, 114, + 97, 100, 101, 109, 97, 114, 107, 47, 102, 105, 47, 102, 108, 47, 76, 115, 108, 97, 115, 104, + 47, 79, 69, 47, 83, 99, 97, 114, 111, 110, 47, 89, 100, 105, 101, 114, 101, 115, 105, 115, + 47, 90, 99, 97, 114, 111, 110, 47, 100, 111, 116, 108, 101, 115, 115, 105, 47, 108, 115, + 108, 97, 115, 104, 47, 111, 101, 47, 115, 99, 97, 114, 111, 110, 47, 122, 99, 97, 114, 111, + 110, 32, 49, 54, 48, 47, 69, 117, 114, 111, 32, 49, 54, 52, 47, 99, 117, 114, 114, 101, 110, + 99, 121, 32, 49, 54, 54, 47, 98, 114, 111, 107, 101, 110, 98, 97, 114, 32, 49, 54, 56, 47, + 100, 105, 101, 114, 101, 115, 105, 115, 47, 99, 111, 112, 121, 114, 105, 103, 104, 116, 47, + 111, 114, 100, 102, 101, 109, 105, 110, 105, 110, 101, 32, 49, 55, 50, 47, 108, 111, 103, + 105, 99, 97, 108, 110, 111, 116, 47, 46, 110, 111, 116, 100, 101, 102, 47, 114, 101, 103, + 105, 115, 116, 101, 114, 101, 100, 47, 109, 97, 99, 114, 111, 110, 47, 100, 101, 103, 114, + 101, 101, 47, 112, 108, 117, 115, 109, 105, 110, 117, 115, 47, 116, 119, 111, 115, 117, 112, + 101, 114, 105, 111, 114, 47, 116, 104, 114, 101, 101, 115, 117, 112, 101, 114, 105, 111, + 114, 47, 97, 99, 117, 116, 101, 47, 109, 117, 32, 49, 56, 51, 47, 112, 101, 114, 105, 111, + 100, 99, 101, 110, 116, 101, 114, 101, 100, 47, 99, 101, 100, 105, 108, 108, 97, 47, 111, + 110, 101, 115, 117, 112, 101, 114, 105, 111, 114, 47, 111, 114, 100, 109, 97, 115, 99, 117, + 108, 105, 110, 101, 32, 49, 56, 56, 47, 111, 110, 101, 113, 117, 97, 114, 116, 101, 114, 47, + 111, 110, 101, 104, 97, 108, 102, 47, 116, 104, 114, 101, 101, 113, 117, 97, 114, 116, 101, + 114, 115, 32, 49, 57, 50, 47, 65, 103, 114, 97, 118, 101, 47, 65, 97, 99, 117, 116, 101, 47, + 65, 99, 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 65, 116, 105, 108, 100, 101, 47, 65, + 100, 105, 101, 114, 101, 115, 105, 115, 47, 65, 114, 105, 110, 103, 47, 65, 69, 47, 67, 99, + 101, 100, 105, 108, 108, 97, 47, 69, 103, 114, 97, 118, 101, 47, 69, 97, 99, 117, 116, 101, + 47, 69, 99, 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 69, 100, 105, 101, 114, 101, + 115, 105, 115, 47, 73, 103, 114, 97, 118, 101, 47, 73, 97, 99, 117, 116, 101, 47, 73, 99, + 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 73, 100, 105, 101, 114, 101, 115, 105, 115, + 47, 69, 116, 104, 47, 78, 116, 105, 108, 100, 101, 47, 79, 103, 114, 97, 118, 101, 47, 79, + 97, 99, 117, 116, 101, 47, 79, 99, 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 79, 116, + 105, 108, 100, 101, 47, 79, 100, 105, 101, 114, 101, 115, 105, 115, 47, 109, 117, 108, 116, + 105, 112, 108, 121, 47, 79, 115, 108, 97, 115, 104, 47, 85, 103, 114, 97, 118, 101, 47, 85, + 97, 99, 117, 116, 101, 47, 85, 99, 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 85, 100, + 105, 101, 114, 101, 115, 105, 115, 47, 89, 97, 99, 117, 116, 101, 47, 84, 104, 111, 114, + 110, 47, 103, 101, 114, 109, 97, 110, 100, 98, 108, 115, 47, 97, 103, 114, 97, 118, 101, 47, + 97, 97, 99, 117, 116, 101, 47, 97, 99, 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, 97, + 116, 105, 108, 100, 101, 47, 97, 100, 105, 101, 114, 101, 115, 105, 115, 47, 97, 114, 105, + 110, 103, 47, 97, 101, 47, 99, 99, 101, 100, 105, 108, 108, 97, 47, 101, 103, 114, 97, 118, + 101, 47, 101, 97, 99, 117, 116, 101, 47, 101, 99, 105, 114, 99, 117, 109, 102, 108, 101, + 120, 47, 101, 100, 105, 101, 114, 101, 115, 105, 115, 47, 105, 103, 114, 97, 118, 101, 47, + 105, 97, 99, 117, 116, 101, 47, 105, 99, 105, 114, 99, 117, 109, 102, 108, 101, 120, 47, + 105, 100, 105, 101, 114, 101, 115, 105, 115, 47, 101, 116, 104, 47, 110, 116, 105, 108, 100, + 101, 47, 111, 103, 114, 97, 118, 101, 47, 111, 97, 99, 117, 116, 101, 47, 111, 99, 105, 114, + 99, 117, 109, 102, 108, 101, 120, 47, 111, 116, 105, 108, 100, 101, 47, 111, 100, 105, 101, + 114, 101, 115, 105, 115, 47, 100, 105, 118, 105, 100, 101, 47, 111, 115, 108, 97, 115, 104, + 47, 117, 103, 114, 97, 118, 101, 47, 117, 97, 99, 117, 116, 101, 47, 117, 99, 105, 114, 99, + 117, 109, 102, 108, 101, 120, 47, 117, 100, 105, 101, 114, 101, 115, 105, 115, 47, 121, 97, + 99, 117, 116, 101, 47, 116, 104, 111, 114, 110, 47, 121, 100, 105, 101, 114, 101, 115, 105, + 115, 93, 47, 84, 121, 112, 101, 47, 69, 110, 99, 111, 100, 105, 110, 103, 62, 62, 10, 101, + 110, 100, 111, 98, 106, 10, 51, 55, 55, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 84, 121, + 112, 101, 47, 65, 110, 110, 111, 116, 47, 83, 117, 98, 116, 121, 112, 101, 47, 70, 114, 101, + 101, 84, 101, 120, 116, 47, 80, 32, 49, 32, 48, 32, 82, 47, 70, 32, 52, 47, 77, 40, 68, 58, + 50, 48, 50, 52, 48, 51, 50, 54, 49, 51, 49, 56, 48, 56, 90, 48, 48, 39, 48, 48, 41, 47, 82, + 101, 99, 116, 91, 32, 49, 51, 53, 46, 48, 48, 48, 48, 49, 56, 32, 54, 51, 51, 46, 56, 52, + 57, 57, 54, 32, 52, 48, 53, 46, 48, 48, 48, 48, 49, 56, 32, 54, 53, 55, 46, 56, 52, 57, 57, + 54, 93, 47, 67, 111, 110, 116, 101, 110, 116, 115, 40, 115, 104, 121, 97, 109, 32, 114, 97, + 103, 104, 117, 119, 97, 110, 115, 104, 105, 32, 105, 115, 32, 97, 32, 112, 114, 111, 103, + 114, 97, 109, 109, 101, 114, 32, 104, 101, 32, 105, 115, 32, 97, 32, 104, 101, 114, 111, 32, + 97, 108, 115, 111, 32, 111, 102, 32, 98, 111, 108, 108, 121, 119, 111, 111, 100, 41, 47, 67, + 91, 32, 48, 32, 46, 52, 55, 48, 53, 56, 56, 32, 46, 56, 51, 49, 51, 55, 51, 93, 47, 67, 65, + 32, 49, 47, 67, 114, 101, 97, 116, 105, 111, 110, 68, 97, 116, 101, 40, 68, 58, 50, 48, 50, + 52, 48, 51, 50, 54, 49, 51, 49, 56, 48, 56, 90, 48, 48, 39, 48, 48, 41, 47, 73, 84, 47, 70, + 114, 101, 101, 84, 101, 120, 116, 84, 121, 112, 101, 119, 114, 105, 116, 101, 114, 47, 82, + 111, 116, 97, 116, 101, 32, 48, 47, 68, 65, 40, 47, 72, 101, 108, 118, 32, 49, 48, 46, 53, + 48, 48, 48, 48, 48, 32, 84, 102, 32, 48, 32, 46, 52, 55, 48, 53, 56, 56, 32, 46, 56, 51, 49, + 51, 55, 51, 32, 114, 103, 41, 47, 65, 80, 60, 60, 47, 78, 32, 51, 55, 56, 32, 48, 32, 82, + 62, 62, 62, 62, 10, 101, 110, 100, 111, 98, 106, 10, 51, 55, 56, 32, 48, 32, 111, 98, 106, + 10, 60, 60, 47, 76, 101, 110, 103, 116, 104, 32, 49, 57, 54, 47, 70, 105, 108, 116, 101, + 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 84, 121, 112, 101, 47, 88, + 79, 98, 106, 101, 99, 116, 47, 83, 117, 98, 116, 121, 112, 101, 47, 70, 111, 114, 109, 47, + 70, 111, 114, 109, 84, 121, 112, 101, 32, 49, 47, 66, 66, 111, 120, 91, 32, 49, 51, 53, 46, + 48, 48, 48, 48, 49, 56, 32, 54, 51, 51, 46, 56, 52, 57, 57, 54, 32, 52, 48, 53, 46, 48, 48, + 48, 48, 49, 56, 32, 54, 53, 55, 46, 56, 52, 57, 57, 54, 93, 47, 77, 97, 116, 114, 105, 120, + 91, 32, 49, 32, 48, 32, 48, 32, 49, 32, 45, 49, 51, 53, 46, 48, 48, 48, 48, 49, 56, 32, 45, + 54, 51, 51, 46, 56, 52, 57, 57, 54, 93, 47, 82, 101, 115, 111, 117, 114, 99, 101, 115, 60, + 60, 47, 80, 114, 111, 99, 83, 101, 116, 91, 47, 80, 68, 70, 93, 47, 70, 111, 110, 116, 60, + 60, 47, 72, 101, 108, 118, 32, 51, 55, 52, 32, 48, 32, 82, 62, 62, 62, 62, 62, 62, 10, 115, + 116, 114, 101, 97, 109, 13, 10, 120, 156, 148, 78, 75, 10, 66, 49, 12, 220, 231, 20, 185, + 128, 53, 233, 39, 105, 65, 92, 248, 124, 15, 55, 130, 66, 193, 3, 248, 3, 81, 65, 23, 158, + 223, 84, 65, 116, 105, 6, 146, 12, 153, 12, 115, 3, 70, 50, 188, 251, 246, 2, 28, 146, 35, + 43, 206, 40, 33, 184, 28, 75, 17, 244, 74, 232, 35, 222, 247, 176, 129, 43, 204, 42, 140, + 87, 56, 91, 118, 8, 227, 197, 254, 252, 64, 38, 151, 218, 15, 97, 61, 152, 139, 139, 74, 41, + 103, 116, 57, 112, 208, 128, 247, 227, 143, 107, 204, 46, 38, 31, 5, 235, 14, 38, 26, 36, + 107, 17, 150, 185, 39, 245, 54, 213, 120, 82, 181, 173, 111, 55, 41, 158, 164, 104, 176, + 206, 166, 104, 154, 65, 244, 165, 156, 27, 146, 122, 187, 100, 73, 223, 170, 198, 155, 174, + 49, 233, 204, 165, 109, 131, 136, 167, 41, 214, 19, 244, 203, 238, 239, 252, 132, 35, 102, + 167, 239, 204, 210, 50, 116, 230, 92, 44, 231, 96, 136, 31, 223, 190, 194, 26, 158, 0, 0, 0, + 255, 255, 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 10, 101, 110, 100, 111, 98, 106, + 10, 51, 52, 55, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 67, 114, 101, 97, 116, 105, 111, + 110, 68, 97, 116, 101, 40, 68, 58, 50, 48, 50, 51, 48, 50, 48, 49, 48, 53, 50, 56, 48, 52, + 43, 48, 53, 39, 51, 48, 39, 41, 47, 67, 114, 101, 97, 116, 111, 114, 40, 65, 100, 111, 98, + 101, 32, 65, 99, 114, 111, 98, 97, 116, 32, 80, 114, 111, 32, 49, 48, 46, 49, 46, 49, 54, + 41, 47, 77, 111, 100, 68, 97, 116, 101, 40, 68, 58, 50, 48, 50, 52, 48, 51, 50, 54, 49, 51, + 49, 56, 50, 55, 90, 48, 48, 39, 48, 48, 41, 47, 80, 114, 111, 100, 117, 99, 101, 114, 40, + 65, 100, 111, 98, 101, 32, 65, 99, 114, 111, 98, 97, 116, 32, 80, 114, 111, 32, 49, 48, 46, + 49, 46, 49, 54, 41, 47, 84, 105, 116, 108, 101, 40, 41, 62, 62, 10, 101, 110, 100, 111, 98, + 106, 10, 51, 55, 57, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 84, 121, 112, 101, 47, 88, + 82, 101, 102, 47, 83, 105, 122, 101, 32, 51, 56, 48, 47, 80, 114, 101, 118, 32, 49, 49, 54, + 47, 82, 111, 111, 116, 32, 51, 52, 57, 32, 48, 32, 82, 47, 73, 110, 102, 111, 32, 51, 52, + 55, 32, 48, 32, 82, 47, 73, 68, 91, 60, 51, 66, 67, 70, 66, 55, 57, 65, 68, 56, 67, 54, 68, + 69, 52, 50, 66, 65, 69, 54, 49, 68, 54, 51, 49, 55, 52, 55, 52, 69, 70, 65, 62, 60, 52, 52, + 70, 49, 51, 67, 50, 56, 70, 49, 70, 70, 56, 55, 57, 51, 67, 68, 53, 49, 50, 54, 52, 70, 69, + 67, 65, 66, 50, 50, 51, 65, 62, 93, 47, 87, 91, 32, 49, 32, 52, 32, 50, 93, 47, 73, 110, + 100, 101, 120, 91, 32, 49, 32, 49, 32, 51, 52, 55, 32, 49, 32, 51, 52, 57, 32, 49, 32, 51, + 55, 50, 32, 49, 32, 51, 55, 52, 32, 50, 32, 51, 55, 55, 32, 51, 93, 47, 70, 105, 108, 116, + 101, 114, 47, 70, 108, 97, 116, 101, 68, 101, 99, 111, 100, 101, 47, 76, 101, 110, 103, 116, + 104, 32, 52, 55, 62, 62, 10, 115, 116, 114, 101, 97, 109, 13, 10, 120, 156, 98, 100, 96, 55, + 141, 103, 96, 96, 100, 96, 183, 251, 12, 166, 76, 223, 129, 41, 179, 101, 16, 234, 16, 152, + 50, 151, 3, 83, 214, 39, 192, 148, 173, 5, 152, 178, 159, 199, 192, 0, 0, 0, 0, 255, 255, + 10, 101, 110, 100, 115, 116, 114, 101, 97, 109, 10, 101, 110, 100, 111, 98, 106, 10, 115, + 116, 97, 114, 116, 120, 114, 101, 102, 10, 52, 55, 53, 48, 51, 56, 10, 37, 37, 69, 79, 70, + 10, + ], +}; + +app.get("/pdf", (c) => { + // return c.text({"message":"Hello World!"}); + return c.text("hello world"); +}); + +app.get("/", async (c) => { + try { + let data = await pdf(buffer, { + version: "v2.0.550", + }); + // console.log(data.text) + return c.json(data.text); + } catch (error) { + console.log(error); + console.log("Error occured"); + console.log(err); + // writeOutput(err) + let output = JSON.stringify(err); + console.log(output); + return c.json(output); + } +}); + +app.notFound((c) => { + return c.text("404 not found", 404); +}); + +app.fire(); diff --git a/JS/wasm/examples/nodejs-hono/package.json b/JS/wasm/examples/nodejs-hono/package.json new file mode 100644 index 000000000..8085997be --- /dev/null +++ b/JS/wasm/examples/nodejs-hono/package.json @@ -0,0 +1,21 @@ +{ + "name": "hono", + "type": "module", + "main": "bin/[...app].js", + "scripts": { + "build": "node ./build.js" + }, + "devDependencies": { + "@planetscale/database": "^1.4.0", + "esbuild": "^0.19", + "hono": "^3.9" + }, + "dependencies": { + "@hono/node-server": "^1.8.1", + "@arakoodev/jsonnet": "0.1.2", + "axios": "^1.6.2", + "crypto": "^1.0.1", + "http": "^0.0.1-security", + "stream": "^0.0.2" + } +} diff --git a/JS/wasm/examples/nodejs-hono/src/index.js b/JS/wasm/examples/nodejs-hono/src/index.js new file mode 100644 index 000000000..d455c96bb --- /dev/null +++ b/JS/wasm/examples/nodejs-hono/src/index.js @@ -0,0 +1,63 @@ +import { Hono } from "hono"; +import { serve } from "@hono/node-server"; +import { connect } from "@planetscale/database"; + +import Jsonnet from "@arakoodev/jsonnet"; + +let jsonnet = new Jsonnet(); + +const app = new Hono(); +const env = {}; +app.get("/", (c) => { + const code = ` + local username = std.extVar('name'); + local Person(name='Alice') = { + name: name, + welcome: 'Hello ' + name + '!', + }; + { + person1: Person(username), + person2: Person('Bob'), + }`; + let result = jsonnet.extString("name", "ll").evaluateSnippet(code); + return c.json(JSON.parse(result)); +}); + +app.get("/:username", (c) => { + const { username } = c.req.param(); + // redirect to /hello/:username + return c.redirect(`/hello/${username}`); +}); + +app.get("/hello/:name", async (c) => { + const name = c.req.param("name"); + return c.text(`Async Hello ${name}!`); +}); + +app.get("/env/:key", async (c) => { + const key = c.req.param("key"); + return c.text(env[key]); +}); + +const config = { + host: env["PLANETSCALE_HOST"], + username: env["PLANETSCALE_USERNAME"], + password: env["PLANETSCALE_PASSWORD"], +}; +const conn = connect(config); + +app.get("/db", async (c) => { + const result = await conn.execute("SHOW TABLES"); + + return c.json(result); +}); + +app.notFound((c) => { + return c.text("404 not found", 404); +}); + +// app.fire(); + +serve(app, (info) => { + console.log(`Server started on http://localhost:${info.port}`); +}); diff --git a/JS/wasm/sync-rpc/find-port.js b/JS/wasm/sync-rpc/find-port.js new file mode 100644 index 000000000..34e0d1aa5 --- /dev/null +++ b/JS/wasm/sync-rpc/find-port.js @@ -0,0 +1,9 @@ +const getPort = require("get-port"); + +getPort() + .then((port) => process.stdout.write("" + port)) + .catch((err) => + setTimeout(() => { + throw err; + }, 0) + ); diff --git a/JS/wasm/sync-rpc/index.js b/JS/wasm/sync-rpc/index.js new file mode 100644 index 000000000..51b59466b --- /dev/null +++ b/JS/wasm/sync-rpc/index.js @@ -0,0 +1,178 @@ +// const func = require("../somejs"); +const spawn = require("child_process").spawn; +const spawnSync = require("child_process").spawnSync; + +const host = "127.0.0.1"; +const FUNCTION_PRIORITY = [nativeNC, nodeNC]; +let started = false; +const configuration = { port: null, fastestFunction: null }; + +function nodeNetCatSrc(port, input) { + // TODO: rewrite with explanation + return ( + "var c=require('net').connect(" + + port + + ",'127.0.0.1',()=>{c.pipe(process.stdout);c.end(" + + JSON.stringify(input) + .replace(/\u2028/g, "\\u2028") + .replace(/\u2029/g, "\\u2029") + + ")})" + ); +} + +function nativeNC(port, input) { + return spawnSync("nc", [host, port], { + input: input, + windowsHide: true, + maxBuffer: Infinity, + }); +} + +function nodeNC(port, input) { + const src = nodeNetCatSrc(port, input); + // console.log("Src", src) + if (src.length < 1000) { + return spawnSync(process.execPath, ["-e", src], { + windowsHide: true, + maxBuffer: Infinity, + }); + } else { + return spawnSync(process.execPath, [], { + input: src, + windowsHide: true, + maxBuffer: Infinity, + }); + } +} + +function waitForAlive(port) { + let response = null; + let err = null; + let timeout = Date.now() + 10000; + while (response !== "pong" && Date.now() < timeout) { + const result = nodeNC(port, "ping\r\n"); + response = result.stdout && result.stdout.toString(); + err = result.stderr && result.stderr.toString(); + } + if (response !== "pong") { + throw new Error( + 'Timed out waiting for sync-rpc server to start (it should respond with "pong" when sent "ping"):\n\n' + + err + + "\n" + + response + ); + } +} + +function findPort() { + const findPortResult = spawnSync(process.execPath, [require.resolve("./find-port")], { + windowsHide: true, + }); + if (findPortResult.error) { + if (typeof findPortResult.error === "string") { + throw new Error(findPortResult.error); + } + throw findPortResult.error; + } + if (findPortResult.status !== 0) { + throw new Error( + findPortResult.stderr.toString() || + "find port exited with code " + findPortResult.status + ); + } + const portString = findPortResult.stdout.toString("utf8").trim(); + if (!/^[0-9]+$/.test(portString)) { + throw new Error("Invalid port number string returned: " + portString); + } + return Number(portString); +} + +function test(fn, port) { + const result = fn(port, "ping\r\n"); + const response = result.stdout && result.stdout.toString(); + return response === "pong"; +} + +function getFastestFunction(port) { + for (let i = 0; i < FUNCTION_PRIORITY.length; i++) { + if (test(FUNCTION_PRIORITY[i], port)) { + return FUNCTION_PRIORITY[i]; + } + } +} + +function start(filename) { + if (!spawnSync) { + throw new Error( + "Sync-request requires node version 0.12 or later. If you need to use it with an older version of node\n" + + "you can `npm install sync-request@2.2.0`, which was the last version to support older versions of node." + ); + } + const port = findPort(); + const p = spawn(process.execPath, [require.resolve("./worker"), port, filename], { + stdio: "inherit", + windowsHide: true, + }); + p.unref(); + process.on("exit", () => { + // console.log("killing server") + p.kill(); + }); + waitForAlive(port); + const fastestFunction = getFastestFunction(port); + // console.log('Using ' + fastestFunction + ' for IPC'); + configuration.port = port; + configuration.fastestFunction = fastestFunction; + started = true; +} + +function sendMessage(input) { + if (!started) start(); + const res = configuration.fastestFunction(configuration.port, JSON.stringify(input) + "\r\n"); + try { + return JSON.parse(res.stdout.toString("utf8")); + } catch (error) { + if (res.error) { + if (typeof res.error === "string") res.error = new Error(res.error); + throw res.error; + } + if (res.status !== 0) { + throw new Error( + configuration.fastestFunction.name + + " failed:\n" + + (res.stdout && res.stdout.toString()) + + "\n" + + (res.stderr && res.stderr.toString()) + ); + } + throw new Error( + configuration.fastestFunction.name + + " failed:\n" + + (res.stdout && res.stdout).toString() + + "\n" + + (res.stderr && res.stderr).toString() + ); + } +} + +function extractValue(msg) { + if (!msg.s) { + const error = new Error(msg.v.message); + error.code = msg.v.code; + throw error; + } + return msg.v; +} + +function createClient(filename) { + const id = extractValue(sendMessage({ t: 1, f: filename })); + return function (args) { + return extractValue(sendMessage({ t: 0, i: id, a: args })); + }; +} + +createClient.FUNCTION_PRIORITY = FUNCTION_PRIORITY; +createClient.configuration = configuration; + +module.exports = createClient; +// let func = createClient("/home/afshan/Projects/githubClones/sync-rpc/somejs.js") diff --git a/JS/wasm/sync-rpc/json.js b/JS/wasm/sync-rpc/json.js new file mode 100644 index 000000000..37f17c8d8 --- /dev/null +++ b/JS/wasm/sync-rpc/json.js @@ -0,0 +1,49 @@ +"use strict"; + +//TODO: handle reviver/dehydrate function like normal +//and handle indentation, like normal. +//if anyone needs this... please send pull request. + +exports.stringify = function stringify(o) { + if (o && Buffer.isBuffer(o)) return JSON.stringify(":base64:" + o.toString("base64")); + + if (o && o.toJSON) o = o.toJSON(); + + if (o && "object" === typeof o) { + var s = ""; + var array = Array.isArray(o); + s = array ? "[" : "{"; + var first = true; + + for (var k in o) { + var ignore = "function" == typeof o[k] || (!array && "undefined" === typeof o[k]); + if (Object.hasOwnProperty.call(o, k) && !ignore) { + if (!first) s += ","; + first = false; + if (array) { + s += stringify(o[k]); + } else if (o[k] !== void 0) { + s += stringify(k) + ":" + stringify(o[k]); + } + } + } + + s += array ? "]" : "}"; + + return s; + } else if ("string" === typeof o) { + return JSON.stringify(/^:/.test(o) ? ":" + o : o); + } else if ("undefined" === typeof o) { + return "null"; + } else return JSON.stringify(o); +}; + +exports.parse = function (s) { + return JSON.parse(s, function (key, value) { + if ("string" === typeof value) { + if (/^:base64:/.test(value)) return new Buffer(value.substring(8), "base64"); + else return /^:/.test(value) ? value.substring(1) : value; + } + return value; + }); +}; diff --git a/JS/wasm/sync-rpc/package.json b/JS/wasm/sync-rpc/package.json new file mode 100644 index 000000000..900ca6e10 --- /dev/null +++ b/JS/wasm/sync-rpc/package.json @@ -0,0 +1,41 @@ +{ + "name": "sync-rpc", + "version": "1.3.6", + "main": "index.js", + "description": "Run asynchronous commands synchronously by putting them in a separate process", + "keywords": [], + "files": [ + "./" + ], + "dependencies": { + "get-port": "^3.1.0" + }, + "devDependencies": { + "husky": "*", + "jest": "*", + "lint-staged": "*", + "prettier": "*" + }, + "scripts": { + "precommit": "lint-staged", + "prettier": "prettier --write \"lib/**/*.js\"", + "prettier:check": "prettier --list-different \"lib/**/*.js\"", + "test": "jest --coverage", + "watch": "jest --coverage --watch" + }, + "lint-staged": { + "*.js": [ + "prettier --write", + "git add" + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/ForbesLindesay/sync-rpc.git" + }, + "author": { + "name": "Forbes Lindesay", + "url": "http://github.com/ForbesLindesay" + }, + "license": "MIT" +} diff --git a/JS/wasm/sync-rpc/worker.js b/JS/wasm/sync-rpc/worker.js new file mode 100644 index 000000000..a116530d6 --- /dev/null +++ b/JS/wasm/sync-rpc/worker.js @@ -0,0 +1,76 @@ +const net = require("net"); +const { fileURLToPath } = require("url"); +const INIT = 1; +const CALL = 0; +const modules = []; + +const server = net.createServer({ allowHalfOpen: true }, (c) => { + let responded = false; + function respond(data) { + if (responded) return; + responded = true; + c.end(JSON.stringify(data)); + } + let buffer = ""; + function onMessage(str) { + if (str === "ping") { + c.end("pong"); + return; + } + const req = JSON.parse(str); + if (req.t === INIT) { + // console.log("Init", req.f) + let id = init(req.f); + // console.log("ID", id) + respond({ s: true, v: id }); + } else { + let result = modules[req.i](req.a); + // console.log("typeof result ", typeof result) + // console.log("Resutl constr name",result.constructor) + result.then( + function (response) { + respond({ s: true, v: response }); + }, + function (err) { + respond({ s: false, v: { code: err.code, message: err.message } }); + } + ); + } + } + c.on("error", function (err) { + respond({ s: false, v: { code: err.code, message: err.message } }); + }); + c.on("data", function (data) { + // console.log("Data", data); + buffer += data.toString("utf8"); + // console.log("Buffer", buffer); + if (/\r\n/.test(buffer)) { + onMessage(buffer.trim()); + } + }); +}); + +function init(filename) { + let filePath; + try { + filePath = fileURLToPath(filename); + } catch (error) { + filePath = filename; + } + let module = require(filePath); + // console.log("typeof module", typeof module); + // console.log("typeof module.default", typeof module.default); + if (module && typeof module === "object" && typeof module.default === "function") { + module = module.default; + } + if (typeof module !== "function") { + throw new Error(filename + " did not export a function."); + } + const i = modules.length; + // console.log("I", i) + modules[i] = module; + return i; +} + +// server.listen(6553); +server.listen(process.argv[2]); diff --git a/JS/wasm/tests/wasmtestcases/.gitignore b/JS/wasm/tests/wasmtestcases/.gitignore new file mode 100644 index 000000000..9e87c0549 --- /dev/null +++ b/JS/wasm/tests/wasmtestcases/.gitignore @@ -0,0 +1,2 @@ +node_modules +bin \ No newline at end of file diff --git a/JS/wasm/tests/wasmtestcases/app.log b/JS/wasm/tests/wasmtestcases/app.log new file mode 100644 index 000000000..e309d9828 --- /dev/null +++ b/JS/wasm/tests/wasmtestcases/app.log @@ -0,0 +1,33 @@ +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +nohup: failed to run command '/home/shyam/pr/EdgeChains/target/release/arakoo': No such file or directory +2024-07-09T17:54:34.325248Z INFO Loading Component from "/home/shyam/pr/EdgeChains/JS/wasm/test/wasmtestcases/index.wasm" +2024-07-09T17:54:35.429767Z INFO Starting server ... +2024-07-09T17:54:35.429968Z INFO Listening on http://127.0.0.1:8080 +2024-07-09T17:54:38.377628Z INFO Handling request: GET /hello +Successfully responded to request +2024-07-09T17:55:41.371997Z INFO Loading Component from "/home/shyam/pr/EdgeChains/JS/wasm/test/wasmtestcases/index.wasm" +2024-07-09T17:55:42.905582Z INFO Starting server ... +thread 'main' panicked at /home/shyam/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hyper-0.14.29/src/server/server.rs:81:13: +error binding to 127.0.0.1:8080: error creating server listener: Address already in use (os error 98) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +2024-07-09T17:55:45.386989Z INFO Handling request: GET /hello +Successfully responded to request +2024-07-09T17:56:40.841915Z INFO Loading Component from "/home/shyam/pr/EdgeChains/JS/wasm/test/wasmtestcases/index.wasm" +2024-07-09T17:56:42.408213Z INFO Starting server ... +thread 'main' panicked at /home/shyam/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hyper-0.14.29/src/server/server.rs:81:13: +error binding to 127.0.0.1:8080: error creating server listener: Address already in use (os error 98) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +2024-07-09T17:56:44.861415Z INFO Handling request: GET /hello +Successfully responded to request +2024-07-09T18:04:21.691950Z INFO Loading Component from "/home/shyam/pr/EdgeChains/JS/wasm/test/wasmtestcases/index.wasm" +2024-07-09T18:04:23.663535Z INFO Starting server ... +thread 'main' panicked at /home/shyam/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hyper-0.14.29/src/server/server.rs:81:13: +error binding to 127.0.0.1:8080: error creating server listener: Address already in use (os error 98) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +2024-07-09T18:04:25.709603Z INFO Handling request: GET /hello +Successfully responded to request diff --git a/JS/wasm/tests/wasmtestcases/build.js b/JS/wasm/tests/wasmtestcases/build.js new file mode 100644 index 000000000..66d297ff9 --- /dev/null +++ b/JS/wasm/tests/wasmtestcases/build.js @@ -0,0 +1,19 @@ +import { build } from "esbuild"; + +let runtime = process.argv[2]; + +build({ + entryPoints: ["src/index.js"], + bundle: true, + minify: false, + outfile: "bin/index.js", + format: "esm", + target: "esnext", + platform: "node", + define: { + "process.env.arakoo": JSON.stringify(runtime === "arakoo"), + }, +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/tests/wasmtestcases/package.json b/JS/wasm/tests/wasmtestcases/package.json new file mode 100644 index 000000000..23d9d3854 --- /dev/null +++ b/JS/wasm/tests/wasmtestcases/package.json @@ -0,0 +1,24 @@ +{ + "name": "pdfparse", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "vitest" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@hono/node-server": "^1.12.0", + "axios": "^1.7.2", + "child_process": "^1.0.2", + "esbuild": "^0.23.0", + "hono": "^3.9", + "nohup": "^0.1.0" + }, + "devDependencies": { + "vitest": "^2.0.1" + } +} diff --git a/JS/wasm/tests/wasmtestcases/src/index.js b/JS/wasm/tests/wasmtestcases/src/index.js new file mode 100644 index 000000000..a1815d263 --- /dev/null +++ b/JS/wasm/tests/wasmtestcases/src/index.js @@ -0,0 +1,8 @@ +import { Hono } from "hono"; +const app = new Hono(); + +app.get("/hello", (c) => { + return c.text("Hello World"); +}); + +app.fire(); diff --git a/JS/wasm/tests/wasmtestcases/test/all.test.js b/JS/wasm/tests/wasmtestcases/test/all.test.js new file mode 100644 index 000000000..7e1db2bbe --- /dev/null +++ b/JS/wasm/tests/wasmtestcases/test/all.test.js @@ -0,0 +1,71 @@ +import { expect, test } from "vitest"; +import { execSync, exec } from "child_process"; +import fs from "node:fs/promises"; +import path from "node:path"; +import axios from "axios"; + +test("build.js should create bin/index.js", async () => { + try { + execSync(`node build.js`); + const filePath = path.join(__dirname, "../bin/index.js"); + + await fs.access(filePath); + expect(true).toBe(true); + } catch (error) { + expect(error).toBeUndefined(); + } +}); + +test("should build arakoo-js-engine", async () => { + try { + const shimPath = path.resolve(__dirname, "../../../crates/arakoo-core/src/apis/http/shims"); + execSync(`cd ${shimPath} && npm install && npm run build`, { stdio: "inherit" }); + execSync("cargo build -p arakoo-js-engine --target=wasm32-wasip1 -r"); + const arakooPath = path.join(__dirname, "../../../../../target/release/arakoo-compiler"); + await fs.access(arakooPath); + expect(true).toBe(true); + } catch (error) { + expect(error).toBeUndefined(); + } +}, 1000000); + +test("should build arakoo", async () => { + try { + execSync("CARGO_PROFILE_RELEASE_LTO=off cargo build -p cli -r"); + execSync("cargo build -p serve -r"); + const arakooPath = path.join(__dirname, "../../../../../target/release/arakoo"); + await fs.access(arakooPath); + expect(true).toBe(true); + } catch (error) { + expect(error).toBeUndefined(); + } +}, 1000000); + +test("should be create a index.wasm file", async () => { + try { + const arakooPath = path.resolve(__dirname, "../../../../../target/release/arakoo-compiler"); + const indexFile = path.resolve(__dirname, "../bin/index.js"); + const filePath = path.join(__dirname, "../index.wasm"); + execSync(`${arakooPath} ${indexFile}`); + await fs.access(filePath); + expect(true).toBe(true); + } catch (error) { + expect(error).toBeUndefined(); + } +}); + +test("should start server", async () => { + const arakooPath = path.resolve(__dirname, "../../../../../target/release/arakoo"); + const indexFile = path.resolve(__dirname, "../index.wasm"); + + console.log(arakooPath, indexFile); + + exec(`nohup ${arakooPath} ${indexFile} >> app.log 2>&1 &`); + + await new Promise((resolve) => setTimeout(resolve, 4000)); +}); + +test("should get the response", async () => { + const response = await axios.get("http://127.0.0.1:8080/hello"); + expect(response.data).toBe("Hello World"); +}); diff --git a/JS/wasm/wit/arakoo.wit b/JS/wasm/wit/arakoo.wit new file mode 100644 index 000000000..e60f95e5e --- /dev/null +++ b/JS/wasm/wit/arakoo.wit @@ -0,0 +1,7 @@ +package arakoo:edgechains; + +world reactor { + import http; + import utils; + export inbound-http; +} \ No newline at end of file diff --git a/JS/wasm/wit/http-types.wit b/JS/wasm/wit/http-types.wit new file mode 100644 index 000000000..869fecd36 --- /dev/null +++ b/JS/wasm/wit/http-types.wit @@ -0,0 +1,42 @@ +interface http-types { + type http-status = u16; + type body = list; + type headers = list>; + type params = list>; + type uri = string; + + enum method { + get, + post, + put, + delete, + patch, + head, + options, + } + + record request { + method: method, + uri: uri, + headers: headers, + params: params, + body: option, + } + + record response { + status: http-status, + headers: option, + body: option, + status-text: string, + } + + enum http-error { + success, + destination-not-allowed, + invalid-url, + request-error, + runtime-error, + too-many-requests, + } +} + diff --git a/JS/wasm/wit/http.wit b/JS/wasm/wit/http.wit new file mode 100644 index 000000000..6ca943cfd --- /dev/null +++ b/JS/wasm/wit/http.wit @@ -0,0 +1,5 @@ +interface http { + use http-types.{request, response, http-error}; + + send-request: func(req: request) -> result; +} diff --git a/JS/wasm/wit/inbound-http.wit b/JS/wasm/wit/inbound-http.wit new file mode 100644 index 000000000..31bb2b774 --- /dev/null +++ b/JS/wasm/wit/inbound-http.wit @@ -0,0 +1,5 @@ +interface inbound-http { + use http-types.{request, response, method}; + + handle-request: func(req: request) -> response; +} \ No newline at end of file diff --git a/JS/wasm/wit/utils.wit b/JS/wasm/wit/utils.wit new file mode 100644 index 000000000..cc6db19d7 --- /dev/null +++ b/JS/wasm/wit/utils.wit @@ -0,0 +1,3 @@ +interface utils { + read-file: func(path: string) -> string; +} diff --git a/LICENSE b/LICENSE index 3cd383eab..0ad25db4b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,661 @@ -MIT License - -Copyright (c) 2023 Arakoo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..c3081393b --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +.PHONY: all +all: build-cli + +add: + @echo "Adding wasm32-wasip1 target" + @rustup target add wasm32-wasip1 + +clean-rm: clean-shims + @rm -rf target/ + +clean: + @cargo clean + +clean-shims: + @rm -rf dist/ node_modules/ + +build-arakoo: + @echo "Building arakoo" + @cargo build -p serve -r + +build-cli: build-engine + @echo "Building javy cli" + @CARGO_PROFILE_RELEASE_LTO=off cargo build -p cli -r + +build-engine: build-shims + @echo "Building arakoo engine" + @cargo build -p arakoo-js-engine --target=wasm32-wasip1 -r + +build-shims: shims-install + @echo "Building shims" + @cd JS/wasm/crates/arakoo-core/src/apis/http/shims && npm run build + +shims-install: + @echo "Installing deps of shims" + @cd JS/wasm/crates/arakoo-core/src/apis/http/shims && npm install + +compile: build-example + ./target/release/javy compile JS/wasm/examples/ec-wasmjs-hono/bin/app.js + +serve: + ./target/release/arakoo index.wasm + +build-example: + @cd JS/wasm/examples/ec-wasmjs-hono && npm i && npm run build arakoo + +clean-example: + @rm -r JS/wasm/examples/ec-wasmjs-hono/node_modules/ JS/wasm/examples/ec-wasmjs-hono/bin/ + +build-jsonnet: + @cd JS/jsonnet && ./build.sh && npm version $(TAG) + +build-edgechains: + @cp README.md JS/edgechains/arakoodev && cd JS/edgechains/arakoodev && npm install && npm run build && npm version $(TAG) && rm -rf src/ diff --git a/README.md b/README.md index 66d853e11..12da4c6e1 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,32 @@ -# EdgeChains : LLM chains on-the-edge -
    +# EdgeChains Packages [![](https://img.shields.io/npm/v/%40arakoodev%2Fedgechains.js?style=flat-square&label=npmjs%3A%20%40arakoodev%2Fedgechains.js&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2F%40arakoodev%2Fedgechains.js)](https://www.npmjs.com/package/@arakoodev/edgechains.js) [![](https://img.shields.io/npm/v/%40arakoodev%2Fjsonnet?style=flat-square&label=npmjs%3A%20%40arakoodev%2Fjsonnet&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2F%40arakoodev%2Fjsonnet)](https://www.npmjs.com/package/@arakoodev/jsonnet) + + + - - - - - - - - - -
    - --- +**Join our [Discord](https://discord.gg/aehBPdPqf5) - we are one of the friendliest and nicest dev groups in Generative AI !** -Leveraging the full potential of Large language models (LLMs) often requires integrating them with other sources of computation or knowledge. Edgechains is specifically designed to **orchestrate** such applications. +### ***Jump straight into our [examples](JS/edgechains/examples) WITH VIDEOS!!*** -EdgeChains is an open-source chain-of-thought engineering framework tailored for Large Language Models (LLMs)- like OpenAI GPT, LLama2, Falcon, etc. - With a focus on enterprise-grade deployability and scalability. + +## Is EdgeChains production ready ? +unlike a lot of frameworks - we built it on top of honojs and jsonnet, both of which are built by cloudflare and google respectively. +so even if u dont trust me...u can trust them ;) + +we dont build our own flavor of json or a specific DSL (that is inherently fragile) and give u compilation steps. Our underlying libraries are rock solid and stable. +
    + + + + + + + + + + +
    + ## Understanding EdgeChains @@ -25,9 +35,9 @@ Edgechains is built on top of jsonnet, originally built by Google based on their Edgechains gives you: -* **Just One Script File**: EdgeChains is engineered to be extremely simple (whether Java, Python or JS). Executing production-ready GenAI applications is just one script file and one jsonnet file. You'll be pleasantly surprised! +* **Just One Script File**: EdgeChains is engineered to be extremely simple - Executing production-ready GenAI applications is just one script file and one jsonnet file. You'll be pleasantly surprised! * **Versioning for Prompts**: Prompts are written in jsonnet. Makes them easily versionable and diffable. -* **Automatic parallelism**: EdgeChains automatically parallelizes LLM chains & chain-of-thought tasks across CPUs, GPUs, and TPUs using the JVM. +* **Automatic parallelism**: EdgeChains automatically parallelizes LLM chains & chain-of-thought tasks across CPUs, GPUs, and TPUs using the WebAssembly runtime. * **Fault tolerance**: EdgeChains is designed to be fault-tolerant, and can continue to retry & backoff even if some of the requests in the system fail. * **Scalability**: EdgeChains is designed to be scalable, and can be used to write your chain-of-thought applications on large number of APIs, prompt lengths and vector datasets. @@ -56,164 +66,128 @@ One of the big challenge in production is how to keep testing your prompts & cha Each prompt or chain has a token cost associated with it. You may think that a certain prompt is very good...but it may be consuming a huge amount of tokens. For example, Chain-of-Thought style prompts consume atleast 3X as many **output tokens** as a normal prompt. you need to have fine-grained tracking and measurement built into your framework to be able to manage this. Edgechains has this built in. - - - --- -## Installation and Usage - -### [Stuck?? Try the Docs](https://www.arakoo.ai/doc/category/getting-started) - -### Initial setup - -To set up EdgeChains, you will need to download the release jar. - -### Downloading the release jar -> **Note:** EdgeChains requires Java version 17 or above to run. Please make sure you have Java 17 installed on your system before proceeding. +# Setup +1. Clone the repo into a public GitHub repository (or fork [https://github.com/arakoodev/EdgeChains/fork](https://github.com/arakoodev/EdgeChains/fork)). -You can download the release jars and associated files from the [latest release](https://github.com/arakoodev/EdgeChains/releases/tag/0.3.0). Make sure to download the `flyfly.jar`, `edgechain-app-1.0.0.jar` and the `Source code.zip` file from the assets section. +``` + git clone https://github.com/arakoodev/EdgeChains/ +``` -Once downloaded, Follow these steps: +2. Go to the project folder +``` + cd EdgeChains +``` -1. Create a new folder in your desired location and add the jar files into the newly created folder. +# Run the ChatWithPdf example -2. Copy all the contents from the _Examples_ folder and paste into your folder. The _Examples_ folder includes all the Jsonnet files and `EdgeChainApplication.java` file. +This section provides instructions for developers on how to utilize the chat with PDF feature. By following these steps, you can integrate the functionality seamlessly into your projects. -4. Navigate to the directory in which you have extracted the files within the IntelliJ IDE. Make sure to use a **JBang project**. --- -### Run EdgeChains - -To run EdgeChains successfully, you will need to ensure that you have the necessary configurations in place. Follow the steps below to set up your EdgeChains application: - -1. **Prepare your OpenAI Key:** EdgeChains requires a valid OpenAI key to interact with the language models. Make sure you have your OpenAI Auth Key available, as you will need to add it to the Starter class in `EdgeChainApplication.java` file. - -2. **Configure Redis Connection:** locate the redisenv method in the Redisenv class in `EdgeChainApplication.java` file. Add your Redis URL, port, and password to the appropriate fields in the method. - -Once you have completed these configuration steps, you are ready to run EdgeChains. - -To start the application, execute the following command in your terminal: - -```bash -# To start the application. -java -jar flyfly.jar jbang EdgeChainApplication.java edgechain-app-1.0.0.jar +1. Go to the ChatWithPdfExample +``` + cd JS/edgechains/examples/chat-with-pdf/ ``` ---- -### Tutorial - Document-based Chatting with EdgeChains -Sometimes the best way to understand a complicated system is to start by understanding a basic example. The following example illustrates how to run your own Automata agent. The agent will be initialized with a trivial instruction, and will then attempt to write code to fulfill the instruction. The agent will then return the result of its attempt. +2. Install packages with npm -EdgeChains can be used to chat with a document. For example, you can chat with a document about the topic of "Bitcoin" or "Machine Learning" or any topic of your choice. For this, you can use the `EdgeChainService` class. +``` + npm install +``` -1. Fill in the `EdgeChainApplication.java` file with the appropriate OpenAI and Redis credentials. -2. Run the following command in the terminal: - - ```bash - java -jar flyfly.jar jbang EdgeChainServiceApplication.java edgechain-app-1.0.0.jar - ``` - -Now, you have to create a chat context, similar to a Chat Session in ChatGPT. Use the following command: - - ```bash - curl -X POST \ - 'localhost:8080/v1/examples/historycontext' \ - --header 'Accept: /' \ - --header 'User-Agent: Thunder Client (https://www.thunderclient.com/)' \ - --header 'Content-Type: application/json' - --data-raw '{ - "maxTokens": 4096 - }' - ``` - -You'll get a response like: - -
    -Click to see the sample response - -```json -{ - "id": "historycontext-571b0c2c-8d07-452b-a1d8-96bd5f82234e", - "maxTokens": 4096, - "message": "Session is created. Now you can start conversational question and answer" -} +3. Setup you secrets in `secrets.jsonnet` +``` + local SUPABASE_API_KEY = "your supabase api key here"; + + + local OPENAI_API_KEY = "your openai api key here"; + + local SUPABASE_URL = "your supabase url here"; + + { + "supabase_api_key":SUPABASE_API_KEY, + "supabase_url":SUPABASE_URL, + "openai_api_key":OPENAI_API_KEY, + } + ``` -
    -You will receive a response containing an `id` for the created session. Make sure to save this `id` for future use. +4. Database Configuration -Now, Upsert a document to EdgeChains using the following command: +- Ensure that you have a PostgreSQL Vector database set up at [Supabase](https://supabase.com/vector). +- Go to the SQL Editor tab in Supabase. +- Create a new query using the New Query button. +- Paste the following query into the editor and run it using the Run button in the bottom right corner. -```bash -curl -X POST \ - 'localhost:8080/v1/redis/openai/upsert' \ - --header 'Accept: */*' \ - --header 'User-Agent: Thunder Client (https://www.thunderclient.com)' \ - --form 'file=@./8946-Article Text-12474-1-2-20201228.pdf' ``` +create table if not exists documents ( + id bigint primary key generated always as identity, + content text, + embedding vector (1536) + ); + +create or replace function public.match_documents ( + query_embedding vector(1536), + similarity_threshold float, + match_count int +) +returns table ( + id bigint, + content text, + similarity float +) +language sql +as $$ + select + id, + content, + 1- (documents.embedding <=> query_embedding) as similarity + from documents + where 1 - (documents.embedding <=> query_embedding) > similarity_threshold + order by documents.embedding <=> query_embedding + limit match_count; + $$; -Now, it's time to start chatting with the document by asking questions. For example, to inquire about the "transformer architecture," use the following command: - -```bash -curl --location 'localhost:8080/v1/examples/redis/openai/chat?query=What%20is%20the%20transformer%20architecture%3F&namespace=machine-learning&id=historycontext%3A50756d25-e7e4-4d7c-862c-f81bf3f8eea0' \ ---header 'Content-Type: application/json' - --data-raw '{ - "query": "What is the transformer architecture?" -} ``` -## Contribution guidelines +- You should see a success message in the Result tab. -**If you want to contribute to EdgeChains, make sure to read the [Contribution CLA](https://github.com/arakoodev/.github/blob/main/CLA.md). This project adheres to EdgeChains [code of conduct]( https://github.com/arakoodev/.github/blob/main/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.** -**We use [GitHub issues](https://github.com/arakoodev/edgechains/issues) for tracking requests and bugs.** - - +## Usage -To ensure clean and effective pull request merges, we follow a specific approach known as **squash and merge**. It is crucial to avoid issuing multiple pull requests from the same local branch, as this will result in failed merges. +1. Start the server: -The solution is straightforward: adhere to the principle of **ONE BRANCH PER PULL REQUEST**. We strictly follow this practice to ensure the smooth integration of contributions. + ```bash + npm run start + ``` -If you have inadvertently created a pull request from your master/main branch, you can easily rectify it by following these steps: +2. Hit the `GET` endpoint. -> Note: Please ensure that you have committed all your changes before proceeding, as any uncommitted changes will be lost. + ```bash + http://localhost:3000/chatWithpdf?question=who is nirmala sitarama + +- Then you can run the ChatWithPdf example using npm run start and continue chatting with the example.pdf. + +⚠️👉Remember: Comment out the InsertToSupabase function if you are running the code again; otherwise, the PDF data will be pushed again to the Supabase vector data. - if you have created this pull request using your master/main branch, then follow these steps to fix it: -``` -git branch newbranch # Create a new branch, saving the desired commits -git checkout master # checkout master, this is the place you want to go back -git reset --hard HEAD~3 # Move master back by required number of commits -git checkout newbranch # Go to the new branch that still has the desired commits. -``` -Now, you can create a pull request. -The Edgechains project strives to abide by generally accepted best practices in open-source software development. +## Contribution guidelines -## Future +**If you want to contribute to EdgeChains, make sure to read the [Contribution CLA](https://github.com/arakoodev/.github/blob/main/CLA.md). This project adheres to EdgeChains [code of conduct]( https://github.com/arakoodev/.github/blob/main/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.** -We are committed to the continuous improvement and expansion of EdgeChains. Here are some of the exciting developments we have planned for the future. Our team is dedicated to pushing the boundaries of what is possible with large language models and ensuring that EdgeChains remains at the forefront of innovation. We are actively exploring and incorporating the latest advancements in large language models, ensuring that EdgeChains stays up to date with cutting-edge technologies and techniques. We also have a strong focus on optimizing the scalability and performance of EdgeChains. Our goal is to improve parallelism, fault tolerance, and resource utilization, allowing applications built with EdgeChains to handle larger workloads and deliver faster responses. +**We use [GitHub issues](https://github.com/arakoodev/edgechains/issues) for tracking requests and bugs.** -To support our growing user community, we are expanding our documentation and resources. This includes providing comprehensive tutorials, examples, and guides to help developers get started and make the most out of EdgeChains ## 💌 Acknowledgements We would like to express our sincere gratitude to the following individuals and projects for their contributions and inspiration: - -- First Hat tip to [Spring](https://github.com/spring-projects/spring-framework). - We draw inspiration from the spirit of [Nextjs](https://github.com/vercel/next.js/). - We extend our appreciation to all the [contributors](https://github.com/wootzapp/wootz-browser/graphs/contributors) who have supported and enriched this project. - Respect to LangChain, Anthropic, Mosaic and the rest of the open-source LLM community. We are deeply grateful for sharing your knowledge and never turning anyone away. -## ✍️ Authors and Contributors - -- Sandeep Srinivasa ([@sandys](https://twitter.com/sandeepssrin)) -- Arth Srivastava [@ArthSrivastava](https://github.com/ArthSrivastava) -- Harsh Parmar [@Harsh4902](https://github.com/Harsh4902) -- Rohan Guha ([@pizzaboi21](https://github.com/pizzaboi21)) -- Anuran Roy ([@anuran-roy](https://github.com/anuran-roy)) - ## License -EdgeChains is licensed under the MIT license. +EdgeChains is licensed under the GNU Affero General Public License v3.0 and as commercial software. For commercial licensing, please contact us or raise a issue in this github. diff --git a/WASM.md b/WASM.md new file mode 100644 index 000000000..c7631e08b --- /dev/null +++ b/WASM.md @@ -0,0 +1,76 @@ +--- + +# Compilation to webassembly for edge devices +## Setup + + 1. Select latest successful workflow run from [here](https://github.com/arakoodev/EdgeChains/actions/workflows/release-wasm.yml) . + 2. Then scroll to bottom and download artifact . A zip will be downloaded to your system + 3. Extract the zip . + 4. You will have two binaries `arakoo` *(this is runtime)* and `arakoo-compiler` *(this is our extended javy compiler)* + 5. Copy these two binaries to `~/.local/bin` or `/usr/bin` *(if you want all users to access the binaries )* + 6. Open terminal and grant executable permission to copied binaries by running `chmod +x ""` and `chmod +x ""` + + *You are now good to go ! Have look at below section which describe how you can create apis in hono and compile them to wasm* + + ## Compiling js to wasm +1. Open Terminal +2. Create a new directory `helloworld` by running + ```mkdir helloworld && cd helloworld``` +3. Initialize it +```npm init -y``` +4. Add `"type":"module"` in package.json to use es6 syntax. +5. Install hono `npm install hono@^3.9` (as of now only this hono version is supported) +6. Create a `index.js` file and open it with your favourite editor. +7. Paste below code in it +```js +import {Hono} from "hono"; +const app = new Hono(); + +app.get("/hello", async (c)=>{ + return c.json({message : "hello world"}) +}) + +app.fire(); +``` +8. Now since javy doesn't have capability to require or import module . So we will bundle the index.js with esbuild. +9. To do so , install esbuild as developer dependency +``` +npm install esbuild --save-dev +``` +10. Create a build file `build.js` +11. Paste below code in it +```js +import {build} from "esbuild"; + +build({ + entryPoints: ["index.js"], // specify input file ( in this case this the index.js file we created earlier) + bundle: true, // this allows esbuild to find all dependencies and bundle them together in one file + outfile: "dist.js", // the name of the output bundle file you desire ( in this case we named it dist.js + platform:"node", +}).catch((error)=>{ + console.log("Error ",error); + process.exit(1); +}) +``` +12. Now compile bundled file with javy +``` +arakoo-compiler dist.js +``` +13. You should see a new file `index.wasm` in the directory + +## Executing wasm +You can execute the compiled wasm with installed `arakoo` runtime. +To do so simple run +``` +arakoo index.wasm +``` +You should see output as - + +![image](https://github.com/redoC-A2k/EdgeChains/assets/60838316/75bab29e-de61-4f1b-87ea-66b921441a66) + +Send get request to http://localhost:8080/hello to test the api. +You should get response as shown below \- + +![image](https://github.com/redoC-A2k/EdgeChains/assets/60838316/6796513d-63e3-4ce4-a797-ffd20ac0b7a1) + +--- diff --git a/package.json b/package.json new file mode 100644 index 000000000..836e761a5 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "@microsoft/eslint-formatter-sarif": "^3.1.0", + "@playwright/test": "^1.46.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", + "axios": "^1.7.3", + "eslint": "^8.57.1", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.5", + "express": "^4.18.2", + "prettier": "^3.8.3" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/jest": "^29.5.11" + } +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 000000000..174c92cc2 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +[toolchain] +channel = "nightly" +components = ["clippy", "rustfmt"] +targets = ["wasm32-wasip1"] +profile = "default"