diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..e069f7a8834c3d9da13cd48d2a08de13a7d6dad3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,39 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/lin/aria2 filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/win/aria2.exe filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/BLIP/BLIP.gif filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/generative-models/assets/001_with_eval.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-inpainting/merged-leopards.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/depth2img/d2i.gif filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/depth2img/depth2img01.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/depth2img/depth2img02.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/depth2img/merged-0000.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/depth2img/merged-0004.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/depth2img/merged-0005.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/img2img/upscaling-in.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/img2img/upscaling-out.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/stable-unclip/unclip-variations.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/stable-unclip/unclip-variations_noise.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/768/merged-0001.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/768/merged-0002.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/768/merged-0003.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/768/merged-0004.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/768/merged-0005.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/768/merged-0006.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/merged-0001.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/merged-0003.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/merged-0005.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/merged-0006.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/txt2img/merged-0007.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/upscaling/merged-dog.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/upscaling/sampled-bear-x4.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/stable-diffusion-stability-ai/assets/stable-samples/upscaling/snow-leopard-x4.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/assets/birddrawnbyachild.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/assets/first_stage_mushrooms.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/assets/first_stage_squirrels.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/assets/imagenet.png filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/data/open_images_annotations_100/train/000b1b3b85edd850.jpg filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/data/open_images_annotations_100/validation/0a600f1148d1023c.jpg filter=lfs diff=lfs merge=lfs -text +stable-diffusion-webui/repositories/taming-transformers/scripts/reconstruction_usage.ipynb filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index f5e2caa4c69a1e002dbc52fca556353fe4e6599d..b962890fbded428839e097bd102869f269c64047 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,6 @@ --- -title: AI PICS -emoji: ๐Ÿ“š -colorFrom: green -colorTo: blue -sdk: gradio -sdk_version: 4.21.0 +title: AI_PICS app_file: app.py -pinned: false +sdk: gradio +sdk_version: 3.41.2 --- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..9d7d198a6bee2430f7cbcc81f9c19287e5e248a2 --- /dev/null +++ b/app.py @@ -0,0 +1,6 @@ +import gradio as gr + +def echo_function(input_text): + return input_text + +iface = gr.Interface(fn=echo_function, inputs="text", outputs="text") diff --git a/stable-diffusion-webui/.eslintignore b/stable-diffusion-webui/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..1cfd9487674ff4db01a4285097f5eae74010b2ae --- /dev/null +++ b/stable-diffusion-webui/.eslintignore @@ -0,0 +1,4 @@ +extensions +extensions-disabled +repositories +venv \ No newline at end of file diff --git a/stable-diffusion-webui/.eslintrc.js b/stable-diffusion-webui/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..cf8397695e1d59a9a12de4cfa908cae3bbfad0d9 --- /dev/null +++ b/stable-diffusion-webui/.eslintrc.js @@ -0,0 +1,98 @@ +/* global module */ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: "eslint:recommended", + parserOptions: { + ecmaVersion: "latest", + }, + rules: { + "arrow-spacing": "error", + "block-spacing": "error", + "brace-style": "error", + "comma-dangle": ["error", "only-multiline"], + "comma-spacing": "error", + "comma-style": ["error", "last"], + "curly": ["error", "multi-line", "consistent"], + "eol-last": "error", + "func-call-spacing": "error", + "function-call-argument-newline": ["error", "consistent"], + "function-paren-newline": ["error", "consistent"], + "indent": ["error", 4], + "key-spacing": "error", + "keyword-spacing": "error", + "linebreak-style": ["error", "unix"], + "no-extra-semi": "error", + "no-mixed-spaces-and-tabs": "error", + "no-multi-spaces": "error", + "no-redeclare": ["error", {builtinGlobals: false}], + "no-trailing-spaces": "error", + "no-unused-vars": "off", + "no-whitespace-before-property": "error", + "object-curly-newline": ["error", {consistent: true, multiline: true}], + "object-curly-spacing": ["error", "never"], + "operator-linebreak": ["error", "after"], + "quote-props": ["error", "consistent-as-needed"], + "semi": ["error", "always"], + "semi-spacing": "error", + "semi-style": ["error", "last"], + "space-before-blocks": "error", + "space-before-function-paren": ["error", "never"], + "space-in-parens": ["error", "never"], + "space-infix-ops": "error", + "space-unary-ops": "error", + "switch-colon-spacing": "error", + "template-curly-spacing": ["error", "never"], + "unicode-bom": "error", + }, + globals: { + //script.js + gradioApp: "readonly", + executeCallbacks: "readonly", + onAfterUiUpdate: "readonly", + onOptionsChanged: "readonly", + onUiLoaded: "readonly", + onUiUpdate: "readonly", + uiCurrentTab: "writable", + uiElementInSight: "readonly", + uiElementIsVisible: "readonly", + //ui.js + opts: "writable", + all_gallery_buttons: "readonly", + selected_gallery_button: "readonly", + selected_gallery_index: "readonly", + switch_to_txt2img: "readonly", + switch_to_img2img_tab: "readonly", + switch_to_img2img: "readonly", + switch_to_sketch: "readonly", + switch_to_inpaint: "readonly", + switch_to_inpaint_sketch: "readonly", + switch_to_extras: "readonly", + get_tab_index: "readonly", + create_submit_args: "readonly", + restart_reload: "readonly", + updateInput: "readonly", + onEdit: "readonly", + //extraNetworks.js + requestGet: "readonly", + popup: "readonly", + // from python + localization: "readonly", + // progrssbar.js + randomId: "readonly", + requestProgress: "readonly", + // imageviewer.js + modalPrevImage: "readonly", + modalNextImage: "readonly", + // token-counters.js + setupTokenCounters: "readonly", + // localStorage.js + localSet: "readonly", + localGet: "readonly", + localRemove: "readonly", + // resizeHandle.js + setupResizeHandle: "writable" + } +}; diff --git a/stable-diffusion-webui/.git-blame-ignore-revs b/stable-diffusion-webui/.git-blame-ignore-revs new file mode 100644 index 0000000000000000000000000000000000000000..4104da632b8fcacf3a6f52eba093e63059749725 --- /dev/null +++ b/stable-diffusion-webui/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Apply ESlint +9c54b78d9dde5601e916f308d9a9d6953ec39430 \ No newline at end of file diff --git a/stable-diffusion-webui/.github/ISSUE_TEMPLATE/bug_report.yml b/stable-diffusion-webui/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000000000000000000000000000000000..5876e941085d256cc6a3f4d9ec560d19e782e16e --- /dev/null +++ b/stable-diffusion-webui/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,105 @@ +name: Bug Report +description: You think something is broken in the UI +title: "[Bug]: " +labels: ["bug-report"] + +body: + - type: markdown + attributes: + value: | + > The title of the bug report should be short and descriptive. + > Use relevant keywords for searchability. + > Do not leave it blank, but also do not put an entire error log in it. + - type: checkboxes + attributes: + label: Checklist + description: | + Please perform basic debugging to see if extensions or configuration is the cause of the issue. + Basic debug procedure + ใ€€1. Disable all third-party extensions - check if extension is the cause + ใ€€2. Update extensions and webui - sometimes things just need to be updated + ใ€€3. Backup and remove your config.json and ui-config.json - check if the issue is caused by bad configuration + ใ€€4. Delete venv with third-party extensions disabled - sometimes extensions might cause wrong libraries to be installed + ใ€€5. Try a fresh installation webui in a different directory - see if a clean installation solves the issue + Before making a issue report please, check that the issue hasn't been reported recently. + options: + - label: The issue exists after disabling all extensions + - label: The issue exists on a clean installation of webui + - label: The issue is caused by an extension, but I believe it is caused by a bug in the webui + - label: The issue exists in the current version of the webui + - label: The issue has not been reported before recently + - label: The issue has been reported before but has not been fixed yet + - type: markdown + attributes: + value: | + > Please fill this form with as much information as possible. Don't forget to "Upload Sysinfo" and "What browsers" and provide screenshots if possible + - type: textarea + id: what-did + attributes: + label: What happened? + description: Tell us what happened in a very clear and simple way + placeholder: | + txt2img is not working as intended. + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce the problem + description: Please provide us with precise step by step instructions on how to reproduce the bug + placeholder: | + 1. Go to ... + 2. Press ... + 3. ... + validations: + required: true + - type: textarea + id: what-should + attributes: + label: What should have happened? + description: Tell us what you think the normal behavior should be + placeholder: | + WebUI should ... + validations: + required: true + - type: dropdown + id: browsers + attributes: + label: What browsers do you use to access the UI ? + multiple: true + options: + - Mozilla Firefox + - Google Chrome + - Brave + - Apple Safari + - Microsoft Edge + - Android + - iOS + - Other + - type: textarea + id: sysinfo + attributes: + label: Sysinfo + description: System info file, generated by WebUI. You can generate it in settings, on the Sysinfo page. Drag the file into the field to upload it. If you submit your report without including the sysinfo file, the report will be closed. If needed, review the report to make sure it includes no personal information you don't want to share. If you can't start WebUI, you can use --dump-sysinfo commandline argument to generate the file. + placeholder: | + 1. Go to WebUI Settings -> Sysinfo -> Download system info. + If WebUI fails to launch, use --dump-sysinfo commandline argument to generate the file + 2. Upload the Sysinfo as a attached file, Do NOT paste it in as plain text. + validations: + required: true + - type: textarea + id: logs + attributes: + label: Console logs + description: Please provide **full** cmd/terminal logs from the moment you started UI to the end of it, after the bug occured. If it's very long, provide a link to pastebin or similar service. + render: Shell + validations: + required: true + - type: textarea + id: misc + attributes: + label: Additional information + description: | + Please provide us with any relevant additional info or context. + Examples: + ใ€€I have updated my GPU driver recently. diff --git a/stable-diffusion-webui/.github/ISSUE_TEMPLATE/config.yml b/stable-diffusion-webui/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..f58c94a9be6847193a971ac67aa83e9a6d75c0ae --- /dev/null +++ b/stable-diffusion-webui/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: WebUI Community Support + url: https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions + about: Please ask and answer questions here. diff --git a/stable-diffusion-webui/.github/ISSUE_TEMPLATE/feature_request.yml b/stable-diffusion-webui/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000000000000000000000000000000000..35a887408c1a0cb7d5bbf0a8444d0903a708be75 --- /dev/null +++ b/stable-diffusion-webui/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,40 @@ +name: Feature request +description: Suggest an idea for this project +title: "[Feature Request]: " +labels: ["enhancement"] + +body: + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the feature you want, and that it's not implemented in a recent build/commit. + options: + - label: I have searched the existing issues and checked the recent builds/commits + required: true + - type: markdown + attributes: + value: | + *Please fill this form with as much information as possible, provide screenshots and/or illustrations of the feature if possible* + - type: textarea + id: feature + attributes: + label: What would your feature do ? + description: Tell us about your feature in a very clear and simple way, and what problem it would solve + validations: + required: true + - type: textarea + id: workflow + attributes: + label: Proposed workflow + description: Please provide us with step by step information on how you'd like the feature to be accessed and used + value: | + 1. Go to .... + 2. Press .... + 3. ... + validations: + required: true + - type: textarea + id: misc + attributes: + label: Additional information + description: Add any other context or screenshots about the feature request here. diff --git a/stable-diffusion-webui/.github/pull_request_template.md b/stable-diffusion-webui/.github/pull_request_template.md new file mode 100644 index 0000000000000000000000000000000000000000..c9fcda2e2790861c7bf4aa4cb37e01545c48fb95 --- /dev/null +++ b/stable-diffusion-webui/.github/pull_request_template.md @@ -0,0 +1,15 @@ +## Description + +* a simple description of what you're trying to accomplish +* a summary of changes in code +* which issues it fixes, if any + +## Screenshots/videos: + + +## Checklist: + +- [ ] I have read [contributing wiki page](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Contributing) +- [ ] I have performed a self-review of my own code +- [ ] My code follows the [style guidelines](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Contributing#code-style) +- [ ] My code passes [tests](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Tests) diff --git a/stable-diffusion-webui/.github/workflows/on_pull_request.yaml b/stable-diffusion-webui/.github/workflows/on_pull_request.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9e44c806ab353cf3166b6ddbc54df63a16995ff5 --- /dev/null +++ b/stable-diffusion-webui/.github/workflows/on_pull_request.yaml @@ -0,0 +1,38 @@ +name: Linter + +on: + - push + - pull_request + +jobs: + lint-python: + name: ruff + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + steps: + - name: Checkout Code + uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.11 + # NB: there's no cache: pip here since we're not installing anything + # from the requirements.txt file(s) in the repository; it's faster + # not to have GHA download an (at the time of writing) 4 GB cache + # of PyTorch and other dependencies. + - name: Install Ruff + run: pip install ruff==0.1.6 + - name: Run Ruff + run: ruff . + lint-js: + name: eslint + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + steps: + - name: Checkout Code + uses: actions/checkout@v3 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + - run: npm i --ci + - run: npm run lint diff --git a/stable-diffusion-webui/.github/workflows/run_tests.yaml b/stable-diffusion-webui/.github/workflows/run_tests.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3dafaf8dcfcd14fd7a7ca3385806efad5550b871 --- /dev/null +++ b/stable-diffusion-webui/.github/workflows/run_tests.yaml @@ -0,0 +1,73 @@ +name: Tests + +on: + - push + - pull_request + +jobs: + test: + name: tests on CPU with empty model + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + steps: + - name: Checkout Code + uses: actions/checkout@v3 + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: 3.10.6 + cache: pip + cache-dependency-path: | + **/requirements*txt + launch.py + - name: Install test dependencies + run: pip install wait-for-it -r requirements-test.txt + env: + PIP_DISABLE_PIP_VERSION_CHECK: "1" + PIP_PROGRESS_BAR: "off" + - name: Setup environment + run: python launch.py --skip-torch-cuda-test --exit + env: + PIP_DISABLE_PIP_VERSION_CHECK: "1" + PIP_PROGRESS_BAR: "off" + TORCH_INDEX_URL: https://download.pytorch.org/whl/cpu + WEBUI_LAUNCH_LIVE_OUTPUT: "1" + PYTHONUNBUFFERED: "1" + - name: Start test server + run: > + python -m coverage run + --data-file=.coverage.server + launch.py + --skip-prepare-environment + --skip-torch-cuda-test + --test-server + --do-not-download-clip + --no-half + --disable-opt-split-attention + --use-cpu all + --api-server-stop + 2>&1 | tee output.txt & + - name: Run tests + run: | + wait-for-it --service 127.0.0.1:7860 -t 600 + python -m pytest -vv --junitxml=test/results.xml --cov . --cov-report=xml --verify-base-url test + - name: Kill test server + if: always() + run: curl -vv -XPOST http://127.0.0.1:7860/sdapi/v1/server-stop && sleep 10 + - name: Show coverage + run: | + python -m coverage combine .coverage* + python -m coverage report -i + python -m coverage html -i + - name: Upload main app output + uses: actions/upload-artifact@v3 + if: always() + with: + name: output + path: output.txt + - name: Upload coverage HTML + uses: actions/upload-artifact@v3 + if: always() + with: + name: htmlcov + path: htmlcov diff --git a/stable-diffusion-webui/.github/workflows/warns_merge_master.yml b/stable-diffusion-webui/.github/workflows/warns_merge_master.yml new file mode 100644 index 0000000000000000000000000000000000000000..ae2aab6ba8ce5684755b5fb4083267111bcd23cd --- /dev/null +++ b/stable-diffusion-webui/.github/workflows/warns_merge_master.yml @@ -0,0 +1,19 @@ +name: Pull requests can't target master branch + +"on": + pull_request: + types: + - opened + - synchronize + - reopened + branches: + - master + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Warning marge into master + run: | + echo -e "::warning::This pull request directly merge into \"master\" branch, normally development happens on \"dev\" branch." + exit 1 diff --git a/stable-diffusion-webui/.gitignore b/stable-diffusion-webui/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..09734267ff5c4d51c2f9f1c85f6f8bf2cc225fb9 --- /dev/null +++ b/stable-diffusion-webui/.gitignore @@ -0,0 +1,39 @@ +__pycache__ +*.ckpt +*.safetensors +*.pth +/ESRGAN/* +/SwinIR/* +/repositories +/venv +/tmp +/model.ckpt +/models/**/* +/GFPGANv1.3.pth +/gfpgan/weights/*.pth +/ui-config.json +/outputs +/config.json +/log +/webui.settings.bat +/embeddings +/styles.csv +/params.txt +/styles.csv.bak +/webui-user.bat +/webui-user.sh +/interrogate +/user.css +/.idea +notification.mp3 +/SwinIR +/textual_inversion +.vscode +/extensions +/test/stdout.txt +/test/stderr.txt +/cache.json* +/config_states/ +/node_modules +/package-lock.json +/.coverage* diff --git a/stable-diffusion-webui/.pylintrc b/stable-diffusion-webui/.pylintrc new file mode 100644 index 0000000000000000000000000000000000000000..53254e5dcfd871c8c0f0f4dec9dceeb1ba967eda --- /dev/null +++ b/stable-diffusion-webui/.pylintrc @@ -0,0 +1,3 @@ +# See https://pylint.pycqa.org/en/latest/user_guide/messages/message_control.html +[MESSAGES CONTROL] +disable=C,R,W,E,I diff --git a/stable-diffusion-webui/CHANGELOG.md b/stable-diffusion-webui/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..b274aa428097b8f43f91a71aa9e887062ff71faf --- /dev/null +++ b/stable-diffusion-webui/CHANGELOG.md @@ -0,0 +1,674 @@ +## 1.7.0 + +### Features: +* settings tab rework: add search field, add categories, split UI settings page into many +* add altdiffusion-m18 support ([#13364](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13364)) +* support inference with LyCORIS GLora networks ([#13610](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13610)) +* add lora-embedding bundle system ([#13568](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13568)) +* option to move prompt from top row into generation parameters +* add support for SSD-1B ([#13865](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13865)) +* support inference with OFT networks ([#13692](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13692)) +* script metadata and DAG sorting mechanism ([#13944](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13944)) +* support HyperTile optimization ([#13948](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13948)) +* add support for SD 2.1 Turbo ([#14170](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14170)) +* remove Train->Preprocessing tab and put all its functionality into Extras tab +* initial IPEX support for Intel Arc GPU ([#14171](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14171)) + +### Minor: +* allow reading model hash from images in img2img batch mode ([#12767](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12767)) +* add option to align with sgm repo's sampling implementation ([#12818](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12818)) +* extra field for lora metadata viewer: `ss_output_name` ([#12838](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12838)) +* add action in settings page to calculate all SD checkpoint hashes ([#12909](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12909)) +* add button to copy prompt to style editor ([#12975](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12975)) +* add --skip-load-model-at-start option ([#13253](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13253)) +* write infotext to gif images +* read infotext from gif images ([#13068](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13068)) +* allow configuring the initial state of InputAccordion in ui-config.json ([#13189](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13189)) +* allow editing whitespace delimiters for ctrl+up/ctrl+down prompt editing ([#13444](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13444)) +* prevent accidentally closing popup dialogs ([#13480](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13480)) +* added option to play notification sound or not ([#13631](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13631)) +* show the preview image in the full screen image viewer if available ([#13459](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13459)) +* support for webui.settings.bat ([#13638](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13638)) +* add an option to not print stack traces on ctrl+c +* start/restart generation by Ctrl (Alt) + Enter ([#13644](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13644)) +* update prompts_from_file script to allow concatenating entries with the general prompt ([#13733](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13733)) +* added a visible checkbox to input accordion +* added an option to hide all txt2img/img2img parameters in an accordion ([#13826](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13826)) +* added 'Path' sorting option for Extra network cards ([#13968](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13968)) +* enable prompt hotkeys in style editor ([#13931](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13931)) +* option to show batch img2img results in UI ([#14009](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14009)) +* infotext updates: add option to disregard certain infotext fields, add option to not include VAE in infotext, add explanation to infotext settings page, move some options to infotext settings page +* add FP32 fallback support on sd_vae_approx ([#14046](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14046)) +* support XYZ scripts / split hires path from unet ([#14126](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14126)) +* allow use of mutiple styles csv files ([#14125](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14125)) + +### Extensions and API: +* update gradio to 3.41.2 +* support installed extensions list api ([#12774](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12774)) +* update pnginfo API to return dict with parsed values +* add noisy latent to `ExtraNoiseParams` for callback ([#12856](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12856)) +* show extension datetime in UTC ([#12864](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12864), [#12865](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12865), [#13281](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13281)) +* add an option to choose how to combine hires fix and refiner +* include program version in info response. ([#13135](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13135)) +* sd_unet support for SDXL +* patch DDPM.register_betas so that users can put given_betas in model yaml ([#13276](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13276)) +* xyz_grid: add prepare ([#13266](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13266)) +* allow multiple localization files with same language in extensions ([#13077](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13077)) +* add onEdit function for js and rework token-counter.js to use it +* fix the key error exception when processing override_settings keys ([#13567](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13567)) +* ability for extensions to return custom data via api in response.images ([#13463](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13463)) +* call state.jobnext() before postproces*() ([#13762](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13762)) +* add option to set notification sound volume ([#13884](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13884)) +* update Ruff to 0.1.6 ([#14059](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14059)) +* add Block component creation callback ([#14119](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14119)) +* catch uncaught exception with ui creation scripts ([#14120](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14120)) +* use extension name for determining an extension is installed in the index ([#14063](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14063)) +* update is_installed() from launch_utils.py to fix reinstalling already installed packages ([#14192](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14192)) + +### Bug Fixes: +* fix pix2pix producing bad results +* fix defaults settings page breaking when any of main UI tabs are hidden +* fix error that causes some extra networks to be disabled if both and are present in the prompt +* fix for Reload UI function: if you reload UI on one tab, other opened tabs will no longer stop working +* prevent duplicate resize handler ([#12795](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12795)) +* small typo: vae resolve bug ([#12797](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12797)) +* hide broken image crop tool ([#12792](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12792)) +* don't show hidden samplers in dropdown for XYZ script ([#12780](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12780)) +* fix style editing dialog breaking if it's opened in both img2img and txt2img tabs +* hide --gradio-auth and --api-auth values from /internal/sysinfo report +* add missing infotext for RNG in options ([#12819](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12819)) +* fix notification not playing when built-in webui tab is inactive ([#12834](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12834)) +* honor `--skip-install` for extension installers ([#12832](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12832)) +* don't print blank stdout in extension installers ([#12833](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12833), [#12855](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12855)) +* get progressbar to display correctly in extensions tab +* keep order in list of checkpoints when loading model that doesn't have a checksum +* fix inpainting models in txt2img creating black pictures +* fix generation params regex ([#12876](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12876)) +* fix batch img2img output dir with script ([#12926](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12926)) +* fix #13080 - Hypernetwork/TI preview generation ([#13084](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13084)) +* fix bug with sigma min/max overrides. ([#12995](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12995)) +* more accurate check for enabling cuDNN benchmark on 16XX cards ([#12924](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12924)) +* don't use multicond parser for negative prompt counter ([#13118](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13118)) +* fix data-sort-name containing spaces ([#13412](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13412)) +* update card on correct tab when editing metadata ([#13411](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13411)) +* fix viewing/editing metadata when filename contains an apostrophe ([#13395](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13395)) +* fix: --sd_model in "Prompts from file or textbox" script is not working ([#13302](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13302)) +* better Support for Portable Git ([#13231](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13231)) +* fix issues when webui_dir is not work_dir ([#13210](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13210)) +* fix: lora-bias-backup don't reset cache ([#13178](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13178)) +* account for customizable extra network separators whyen removing extra network text from the prompt ([#12877](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12877)) +* re fix batch img2img output dir with script ([#13170](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13170)) +* fix `--ckpt-dir` path separator and option use `short name` for checkpoint dropdown ([#13139](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13139)) +* consolidated allowed preview formats, Fix extra network `.gif` not woking as preview ([#13121](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13121)) +* fix venv_dir=- environment variable not working as expected on linux ([#13469](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13469)) +* repair unload sd checkpoint button +* edit-attention fixes ([#13533](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13533)) +* fix bug when using --gfpgan-models-path ([#13718](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13718)) +* properly apply sort order for extra network cards when selected from dropdown +* fixes generation restart not working for some users when 'Ctrl+Enter' is pressed ([#13962](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13962)) +* thread safe extra network list_items ([#13014](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13014)) +* fix not able to exit metadata popup when pop up is too big ([#14156](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14156)) +* fix auto focal point crop for opencv >= 4.8 ([#14121](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14121)) +* make 'use-cpu all' actually apply to 'all' ([#14131](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14131)) +* extras tab batch: actually use original filename +* make webui not crash when running with --disable-all-extensions option + +### Other: +* non-local condition ([#12814](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12814)) +* fix minor typos ([#12827](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12827)) +* remove xformers Python version check ([#12842](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12842)) +* style: file-metadata word-break ([#12837](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12837)) +* revert SGM noise multiplier change for img2img because it breaks hires fix +* do not change quicksettings dropdown option when value returned is `None` ([#12854](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12854)) +* [RC 1.6.0 - zoom is partly hidden] Update style.css ([#12839](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12839)) +* chore: change extension time format ([#12851](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12851)) +* WEBUI.SH - Use torch 2.1.0 release candidate for Navi 3 ([#12929](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12929)) +* add Fallback at images.read_info_from_image if exif data was invalid ([#13028](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13028)) +* update cmd arg description ([#12986](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12986)) +* fix: update shared.opts.data when add_option ([#12957](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12957), [#13213](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13213)) +* restore missing tooltips ([#12976](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12976)) +* use default dropdown padding on mobile ([#12880](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12880)) +* put enable console prompts option into settings from commandline args ([#13119](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13119)) +* fix some deprecated types ([#12846](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12846)) +* bump to torchsde==0.2.6 ([#13418](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13418)) +* update dragdrop.js ([#13372](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13372)) +* use orderdict as lru cache:opt/bug ([#13313](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13313)) +* XYZ if not include sub grids do not save sub grid ([#13282](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13282)) +* initialize state.time_start befroe state.job_count ([#13229](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13229)) +* fix fieldname regex ([#13458](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13458)) +* change denoising_strength default to None. ([#13466](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13466)) +* fix regression ([#13475](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13475)) +* fix IndexError ([#13630](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13630)) +* fix: checkpoints_loaded:{checkpoint:state_dict}, model.load_state_dict issue in dict value empty ([#13535](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13535)) +* update bug_report.yml ([#12991](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12991)) +* requirements_versions httpx==0.24.1 ([#13839](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13839)) +* fix parenthesis auto selection ([#13829](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13829)) +* fix #13796 ([#13797](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13797)) +* corrected a typo in `modules/cmd_args.py` ([#13855](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13855)) +* feat: fix randn found element of type float at pos 2 ([#14004](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14004)) +* adds tqdm handler to logging_config.py for progress bar integration ([#13996](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13996)) +* hotfix: call shared.state.end() after postprocessing done ([#13977](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13977)) +* fix dependency address patch 1 ([#13929](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13929)) +* save sysinfo as .json ([#14035](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14035)) +* move exception_records related methods to errors.py ([#14084](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14084)) +* compatibility ([#13936](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13936)) +* json.dump(ensure_ascii=False) ([#14108](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14108)) +* dir buttons start with / so only the correct dir will be shown and noโ€ฆ ([#13957](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13957)) +* alternate implementation for unet forward replacement that does not depend on hijack being applied +* re-add `keyedit_delimiters_whitespace` setting lost as part of commit e294e46 ([#14178](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14178)) +* fix `save_samples` being checked early when saving masked composite ([#14177](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14177)) +* slight optimization for mask and mask_composite ([#14181](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14181)) +* add import_hook hack to work around basicsr/torchvision incompatibility ([#14186](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14186)) + +## 1.6.1 + +### Bug Fixes: + * fix an error causing the webui to fail to start ([#13839](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/13839)) + +## 1.6.0 + +### Features: + * refiner support [#12371](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12371) + * add NV option for Random number generator source setting, which allows to generate same pictures on CPU/AMD/Mac as on NVidia videocards + * add style editor dialog + * hires fix: add an option to use a different checkpoint for second pass ([#12181](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12181)) + * option to keep multiple loaded models in memory ([#12227](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12227)) + * new samplers: Restart, DPM++ 2M SDE Exponential, DPM++ 2M SDE Heun, DPM++ 2M SDE Heun Karras, DPM++ 2M SDE Heun Exponential, DPM++ 3M SDE, DPM++ 3M SDE Karras, DPM++ 3M SDE Exponential ([#12300](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12300), [#12519](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12519), [#12542](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12542)) + * rework DDIM, PLMS, UniPC to use CFG denoiser same as in k-diffusion samplers: + * makes all of them work with img2img + * makes prompt composition posssible (AND) + * makes them available for SDXL + * always show extra networks tabs in the UI ([#11808](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/11808)) + * use less RAM when creating models ([#11958](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/11958), [#12599](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12599)) + * textual inversion inference support for SDXL + * extra networks UI: show metadata for SD checkpoints + * checkpoint merger: add metadata support + * prompt editing and attention: add support for whitespace after the number ([ red : green : 0.5 ]) (seed breaking change) ([#12177](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12177)) + * VAE: allow selecting own VAE for each checkpoint (in user metadata editor) + * VAE: add selected VAE to infotext + * options in main UI: add own separate setting for txt2img and img2img, correctly read values from pasted infotext, add setting for column count ([#12551](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12551)) + * add resize handle to txt2img and img2img tabs, allowing to change the amount of horizontable space given to generation parameters and resulting image gallery ([#12687](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12687), [#12723](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12723)) + * change default behavior for batching cond/uncond -- now it's on by default, and is disabled by an UI setting (Optimizatios -> Batch cond/uncond) - if you are on lowvram/medvram and are getting OOM exceptions, you will need to enable it + * show current position in queue and make it so that requests are processed in the order of arrival ([#12707](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12707)) + * add `--medvram-sdxl` flag that only enables `--medvram` for SDXL models + * prompt editing timeline has separate range for first pass and hires-fix pass (seed breaking change) ([#12457](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12457)) + +### Minor: + * img2img batch: RAM savings, VRAM savings, .tif, .tiff in img2img batch ([#12120](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12120), [#12514](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12514), [#12515](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12515)) + * postprocessing/extras: RAM savings ([#12479](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12479)) + * XYZ: in the axis labels, remove pathnames from model filenames + * XYZ: support hires sampler ([#12298](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12298)) + * XYZ: new option: use text inputs instead of dropdowns ([#12491](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12491)) + * add gradio version warning + * sort list of VAE checkpoints ([#12297](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12297)) + * use transparent white for mask in inpainting, along with an option to select the color ([#12326](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12326)) + * move some settings to their own section: img2img, VAE + * add checkbox to show/hide dirs for extra networks + * Add TAESD(or more) options for all the VAE encode/decode operation ([#12311](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12311)) + * gradio theme cache, new gradio themes, along with explanation that the user can input his own values ([#12346](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12346), [#12355](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12355)) + * sampler fixes/tweaks: s_tmax, s_churn, s_noise, s_tmax ([#12354](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12354), [#12356](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12356), [#12357](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12357), [#12358](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12358), [#12375](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12375), [#12521](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12521)) + * update README.md with correct instructions for Linux installation ([#12352](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12352)) + * option to not save incomplete images, on by default ([#12338](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12338)) + * enable cond cache by default + * git autofix for repos that are corrupted ([#12230](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12230)) + * allow to open images in new browser tab by middle mouse button ([#12379](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12379)) + * automatically open webui in browser when running "locally" ([#12254](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12254)) + * put commonly used samplers on top, make DPM++ 2M Karras the default choice + * zoom and pan: option to auto-expand a wide image, improved integration ([#12413](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12413), [#12727](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12727)) + * option to cache Lora networks in memory + * rework hires fix UI to use accordion + * face restoration and tiling moved to settings - use "Options in main UI" setting if you want them back + * change quicksettings items to have variable width + * Lora: add Norm module, add support for bias ([#12503](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12503)) + * Lora: output warnings in UI rather than fail for unfitting loras; switch to logging for error output in console + * support search and display of hashes for all extra network items ([#12510](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12510)) + * add extra noise param for img2img operations ([#12564](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12564)) + * support for Lora with bias ([#12584](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12584)) + * make interrupt quicker ([#12634](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12634)) + * configurable gallery height ([#12648](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12648)) + * make results column sticky ([#12645](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12645)) + * more hash filename patterns ([#12639](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12639)) + * make image viewer actually fit the whole page ([#12635](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12635)) + * make progress bar work independently from live preview display which results in it being updated a lot more often + * forbid Full live preview method for medvram and add a setting to undo the forbidding + * make it possible to localize tooltips and placeholders + * add option to align with sgm repo's sampling implementation ([#12818](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12818)) + * Restore faces and Tiling generation parameters have been moved to settings out of main UI + * if you want to put them back into main UI, use `Options in main UI` setting on the UI page. + +### Extensions and API: + * gradio 3.41.2 + * also bump versions for packages: transformers, GitPython, accelerate, scikit-image, timm, tomesd + * support tooltip kwarg for gradio elements: gr.Textbox(label='hello', tooltip='world') + * properly clear the total console progressbar when using txt2img and img2img from API + * add cmd_arg --disable-extra-extensions and --disable-all-extensions ([#12294](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12294)) + * shared.py and webui.py split into many files + * add --loglevel commandline argument for logging + * add a custom UI element that combines accordion and checkbox + * avoid importing gradio in tests because it spams warnings + * put infotext label for setting into OptionInfo definition rather than in a separate list + * make `StableDiffusionProcessingImg2Img.mask_blur` a property, make more inline with PIL `GaussianBlur` ([#12470](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12470)) + * option to make scripts UI without gr.Group + * add a way for scripts to register a callback for before/after just a single component's creation + * use dataclass for StableDiffusionProcessing + * store patches for Lora in a specialized module instead of inside torch + * support http/https URLs in API ([#12663](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12663), [#12698](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12698)) + * add extra noise callback ([#12616](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12616)) + * dump current stack traces when exiting with SIGINT + * add type annotations for extra fields of shared.sd_model + +### Bug Fixes: + * Don't crash if out of local storage quota for javascriot localStorage + * XYZ plot do not fail if an exception occurs + * fix missing TI hash in infotext if generation uses both negative and positive TI ([#12269](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12269)) + * localization fixes ([#12307](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12307)) + * fix sdxl model invalid configuration after the hijack + * correctly toggle extras checkbox for infotext paste ([#12304](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12304)) + * open raw sysinfo link in new page ([#12318](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12318)) + * prompt parser: Account for empty field in alternating words syntax ([#12319](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12319)) + * add tab and carriage return to invalid filename chars ([#12327](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12327)) + * fix api only Lora not working ([#12387](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12387)) + * fix options in main UI misbehaving when there's just one element + * make it possible to use a sampler from infotext even if it's hidden in the dropdown + * fix styles missing from the prompt in infotext when making a grid of batch of multiplie images + * prevent bogus progress output in console when calculating hires fix dimensions + * fix --use-textbox-seed + * fix broken `Lora/Networks: use old method` option ([#12466](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12466)) + * properly return `None` for VAE hash when using `--no-hashing` ([#12463](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12463)) + * MPS/macOS fixes and optimizations ([#12526](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12526)) + * add second_order to samplers that mistakenly didn't have it + * when refreshing cards in extra networks UI, do not discard user's custom resolution + * fix processing error that happens if batch_size is not a multiple of how many prompts/negative prompts there are ([#12509](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12509)) + * fix inpaint upload for alpha masks ([#12588](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12588)) + * fix exception when image sizes are not integers ([#12586](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12586)) + * fix incorrect TAESD Latent scale ([#12596](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12596)) + * auto add data-dir to gradio-allowed-path ([#12603](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12603)) + * fix exception if extensuions dir is missing ([#12607](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12607)) + * fix issues with api model-refresh and vae-refresh ([#12638](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12638)) + * fix img2img background color for transparent images option not being used ([#12633](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12633)) + * attempt to resolve NaN issue with unstable VAEs in fp32 mk2 ([#12630](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12630)) + * implement missing undo hijack for SDXL + * fix xyz swap axes ([#12684](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12684)) + * fix errors in backup/restore tab if any of config files are broken ([#12689](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12689)) + * fix SD VAE switch error after model reuse ([#12685](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12685)) + * fix trying to create images too large for the chosen format ([#12667](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12667)) + * create Gradio temp directory if necessary ([#12717](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12717)) + * prevent possible cache loss if exiting as it's being written by using an atomic operation to replace the cache with the new version + * set devices.dtype_unet correctly + * run RealESRGAN on GPU for non-CUDA devices ([#12737](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12737)) + * prevent extra network buttons being obscured by description for very small card sizes ([#12745](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12745)) + * fix error that causes some extra networks to be disabled if both and are present in the prompt + * fix defaults settings page breaking when any of main UI tabs are hidden + * fix incorrect save/display of new values in Defaults page in settings + * fix for Reload UI function: if you reload UI on one tab, other opened tabs will no longer stop working + * fix an error that prevents VAE being reloaded after an option change if a VAE near the checkpoint exists ([#12797](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12737)) + * hide broken image crop tool ([#12792](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12737)) + * don't show hidden samplers in dropdown for XYZ script ([#12780](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12737)) + * fix style editing dialog breaking if it's opened in both img2img and txt2img tabs + * fix a bug allowing users to bypass gradio and API authentication (reported by vysecurity) + * fix notification not playing when built-in webui tab is inactive ([#12834](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12834)) + * honor `--skip-install` for extension installers ([#12832](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12832)) + * don't print blank stdout in extension installers ([#12833](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12832), [#12855](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12855)) + * do not change quicksettings dropdown option when value returned is `None` ([#12854](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/12854)) + * get progressbar to display correctly in extensions tab + + +## 1.5.2 + +### Bug Fixes: + * fix memory leak when generation fails + * update doggettx cross attention optimization to not use an unreasonable amount of memory in some edge cases -- suggestion by MorkTheOrk + + +## 1.5.1 + +### Minor: + * support parsing text encoder blocks in some new LoRAs + * delete scale checker script due to user demand + +### Extensions and API: + * add postprocess_batch_list script callback + +### Bug Fixes: + * fix TI training for SD1 + * fix reload altclip model error + * prepend the pythonpath instead of overriding it + * fix typo in SD_WEBUI_RESTARTING + * if txt2img/img2img raises an exception, finally call state.end() + * fix composable diffusion weight parsing + * restyle Startup profile for black users + * fix webui not launching with --nowebui + * catch exception for non git extensions + * fix some options missing from /sdapi/v1/options + * fix for extension update status always saying "unknown" + * fix display of extra network cards that have `<>` in the name + * update lora extension to work with python 3.8 + + +## 1.5.0 + +### Features: + * SD XL support + * user metadata system for custom networks + * extended Lora metadata editor: set activation text, default weight, view tags, training info + * Lora extension rework to include other types of networks (all that were previously handled by LyCORIS extension) + * show github stars for extenstions + * img2img batch mode can read extra stuff from png info + * img2img batch works with subdirectories + * hotkeys to move prompt elements: alt+left/right + * restyle time taken/VRAM display + * add textual inversion hashes to infotext + * optimization: cache git extension repo information + * move generate button next to the generated picture for mobile clients + * hide cards for networks of incompatible Stable Diffusion version in Lora extra networks interface + * skip installing packages with pip if they all are already installed - startup speedup of about 2 seconds + +### Minor: + * checkbox to check/uncheck all extensions in the Installed tab + * add gradio user to infotext and to filename patterns + * allow gif for extra network previews + * add options to change colors in grid + * use natural sort for items in extra networks + * Mac: use empty_cache() from torch 2 to clear VRAM + * added automatic support for installing the right libraries for Navi3 (AMD) + * add option SWIN_torch_compile to accelerate SwinIR upscale + * suppress printing TI embedding info at start to console by default + * speedup extra networks listing + * added `[none]` filename token. + * removed thumbs extra networks view mode (use settings tab to change width/height/scale to get thumbs) + * add always_discard_next_to_last_sigma option to XYZ plot + * automatically switch to 32-bit float VAE if the generated picture has NaNs without the need for `--no-half-vae` commandline flag. + +### Extensions and API: + * api endpoints: /sdapi/v1/server-kill, /sdapi/v1/server-restart, /sdapi/v1/server-stop + * allow Script to have custom metaclass + * add model exists status check /sdapi/v1/options + * rename --add-stop-route to --api-server-stop + * add `before_hr` script callback + * add callback `after_extra_networks_activate` + * disable rich exception output in console for API by default, use WEBUI_RICH_EXCEPTIONS env var to enable + * return http 404 when thumb file not found + * allow replacing extensions index with environment variable + +### Bug Fixes: + * fix for catch errors when retrieving extension index #11290 + * fix very slow loading speed of .safetensors files when reading from network drives + * API cache cleanup + * fix UnicodeEncodeError when writing to file CLIP Interrogator batch mode + * fix warning of 'has_mps' deprecated from PyTorch + * fix problem with extra network saving images as previews losing generation info + * fix throwing exception when trying to resize image with I;16 mode + * fix for #11534: canvas zoom and pan extension hijacking shortcut keys + * fixed launch script to be runnable from any directory + * don't add "Seed Resize: -1x-1" to API image metadata + * correctly remove end parenthesis with ctrl+up/down + * fixing --subpath on newer gradio version + * fix: check fill size none zero when resize (fixes #11425) + * use submit and blur for quick settings textbox + * save img2img batch with images.save_image() + * prevent running preload.py for disabled extensions + * fix: previously, model name was added together with directory name to infotext and to [model_name] filename pattern; directory name is now not included + + +## 1.4.1 + +### Bug Fixes: + * add queue lock for refresh-checkpoints + +## 1.4.0 + +### Features: + * zoom controls for inpainting + * run basic torch calculation at startup in parallel to reduce the performance impact of first generation + * option to pad prompt/neg prompt to be same length + * remove taming_transformers dependency + * custom k-diffusion scheduler settings + * add an option to show selected settings in main txt2img/img2img UI + * sysinfo tab in settings + * infer styles from prompts when pasting params into the UI + * an option to control the behavior of the above + +### Minor: + * bump Gradio to 3.32.0 + * bump xformers to 0.0.20 + * Add option to disable token counters + * tooltip fixes & optimizations + * make it possible to configure filename for the zip download + * `[vae_filename]` pattern for filenames + * Revert discarding penultimate sigma for DPM-Solver++(2M) SDE + * change UI reorder setting to multiselect + * read version info form CHANGELOG.md if git version info is not available + * link footer API to Wiki when API is not active + * persistent conds cache (opt-in optimization) + +### Extensions: + * After installing extensions, webui properly restarts the process rather than reloads the UI + * Added VAE listing to web API. Via: /sdapi/v1/sd-vae + * custom unet support + * Add onAfterUiUpdate callback + * refactor EmbeddingDatabase.register_embedding() to allow unregistering + * add before_process callback for scripts + * add ability for alwayson scripts to specify section and let user reorder those sections + +### Bug Fixes: + * Fix dragging text to prompt + * fix incorrect quoting for infotext values with colon in them + * fix "hires. fix" prompt sharing same labels with txt2img_prompt + * Fix s_min_uncond default type int + * Fix for #10643 (Inpainting mask sometimes not working) + * fix bad styling for thumbs view in extra networks #10639 + * fix for empty list of optimizations #10605 + * small fixes to prepare_tcmalloc for Debian/Ubuntu compatibility + * fix --ui-debug-mode exit + * patch GitPython to not use leaky persistent processes + * fix duplicate Cross attention optimization after UI reload + * torch.cuda.is_available() check for SdOptimizationXformers + * fix hires fix using wrong conds in second pass if using Loras. + * handle exception when parsing generation parameters from png info + * fix upcast attention dtype error + * forcing Torch Version to 1.13.1 for RX 5000 series GPUs + * split mask blur into X and Y components, patch Outpainting MK2 accordingly + * don't die when a LoRA is a broken symlink + * allow activation of Generate Forever during generation + + +## 1.3.2 + +### Bug Fixes: + * fix files served out of tmp directory even if they are saved to disk + * fix postprocessing overwriting parameters + +## 1.3.1 + +### Features: + * revert default cross attention optimization to Doggettx + +### Bug Fixes: + * fix bug: LoRA don't apply on dropdown list sd_lora + * fix png info always added even if setting is not enabled + * fix some fields not applying in xyz plot + * fix "hires. fix" prompt sharing same labels with txt2img_prompt + * fix lora hashes not being added properly to infotex if there is only one lora + * fix --use-cpu failing to work properly at startup + * make --disable-opt-split-attention command line option work again + +## 1.3.0 + +### Features: + * add UI to edit defaults + * token merging (via dbolya/tomesd) + * settings tab rework: add a lot of additional explanations and links + * load extensions' Git metadata in parallel to loading the main program to save a ton of time during startup + * update extensions table: show branch, show date in separate column, and show version from tags if available + * TAESD - another option for cheap live previews + * allow choosing sampler and prompts for second pass of hires fix - hidden by default, enabled in settings + * calculate hashes for Lora + * add lora hashes to infotext + * when pasting infotext, use infotext's lora hashes to find local loras for `` entries whose hashes match loras the user has + * select cross attention optimization from UI + +### Minor: + * bump Gradio to 3.31.0 + * bump PyTorch to 2.0.1 for macOS and Linux AMD + * allow setting defaults for elements in extensions' tabs + * allow selecting file type for live previews + * show "Loading..." for extra networks when displaying for the first time + * suppress ENSD infotext for samplers that don't use it + * clientside optimizations + * add options to show/hide hidden files and dirs in extra networks, and to not list models/files in hidden directories + * allow whitespace in styles.csv + * add option to reorder tabs + * move some functionality (swap resolution and set seed to -1) to client + * option to specify editor height for img2img + * button to copy image resolution into img2img width/height sliders + * switch from pyngrok to ngrok-py + * lazy-load images in extra networks UI + * set "Navigate image viewer with gamepad" option to false by default, by request + * change upscalers to download models into user-specified directory (from commandline args) rather than the default models/<...> + * allow hiding buttons in ui-config.json + +### Extensions: + * add /sdapi/v1/script-info api + * use Ruff to lint Python code + * use ESlint to lint Javascript code + * add/modify CFG callbacks for Self-Attention Guidance extension + * add command and endpoint for graceful server stopping + * add some locals (prompts/seeds/etc) from processing function into the Processing class as fields + * rework quoting for infotext items that have commas in them to use JSON (should be backwards compatible except for cases where it didn't work previously) + * add /sdapi/v1/refresh-loras api checkpoint post request + * tests overhaul + +### Bug Fixes: + * fix an issue preventing the program from starting if the user specifies a bad Gradio theme + * fix broken prompts from file script + * fix symlink scanning for extra networks + * fix --data-dir ignored when launching via webui-user.bat COMMANDLINE_ARGS + * allow web UI to be ran fully offline + * fix inability to run with --freeze-settings + * fix inability to merge checkpoint without adding metadata + * fix extra networks' save preview image not adding infotext for jpeg/webm + * remove blinking effect from text in hires fix and scale resolution preview + * make links to `http://<...>.git` extensions work in the extension tab + * fix bug with webui hanging at startup due to hanging git process + + +## 1.2.1 + +### Features: + * add an option to always refer to LoRA by filenames + +### Bug Fixes: + * never refer to LoRA by an alias if multiple LoRAs have same alias or the alias is called none + * fix upscalers disappearing after the user reloads UI + * allow bf16 in safe unpickler (resolves problems with loading some LoRAs) + * allow web UI to be ran fully offline + * fix localizations not working + * fix error for LoRAs: `'LatentDiffusion' object has no attribute 'lora_layer_mapping'` + +## 1.2.0 + +### Features: + * do not wait for Stable Diffusion model to load at startup + * add filename patterns: `[denoising]` + * directory hiding for extra networks: dirs starting with `.` will hide their cards on extra network tabs unless specifically searched for + * LoRA: for the `<...>` text in prompt, use name of LoRA that is in the metdata of the file, if present, instead of filename (both can be used to activate LoRA) + * LoRA: read infotext params from kohya-ss's extension parameters if they are present and if his extension is not active + * LoRA: fix some LoRAs not working (ones that have 3x3 convolution layer) + * LoRA: add an option to use old method of applying LoRAs (producing same results as with kohya-ss) + * add version to infotext, footer and console output when starting + * add links to wiki for filename pattern settings + * add extended info for quicksettings setting and use multiselect input instead of a text field + +### Minor: + * bump Gradio to 3.29.0 + * bump PyTorch to 2.0.1 + * `--subpath` option for gradio for use with reverse proxy + * Linux/macOS: use existing virtualenv if already active (the VIRTUAL_ENV environment variable) + * do not apply localizations if there are none (possible frontend optimization) + * add extra `None` option for VAE in XYZ plot + * print error to console when batch processing in img2img fails + * create HTML for extra network pages only on demand + * allow directories starting with `.` to still list their models for LoRA, checkpoints, etc + * put infotext options into their own category in settings tab + * do not show licenses page when user selects Show all pages in settings + +### Extensions: + * tooltip localization support + * add API method to get LoRA models with prompt + +### Bug Fixes: + * re-add `/docs` endpoint + * fix gamepad navigation + * make the lightbox fullscreen image function properly + * fix squished thumbnails in extras tab + * keep "search" filter for extra networks when user refreshes the tab (previously it showed everthing after you refreshed) + * fix webui showing the same image if you configure the generation to always save results into same file + * fix bug with upscalers not working properly + * fix MPS on PyTorch 2.0.1, Intel Macs + * make it so that custom context menu from contextMenu.js only disappears after user's click, ignoring non-user click events + * prevent Reload UI button/link from reloading the page when it's not yet ready + * fix prompts from file script failing to read contents from a drag/drop file + + +## 1.1.1 +### Bug Fixes: + * fix an error that prevents running webui on PyTorch<2.0 without --disable-safe-unpickle + +## 1.1.0 +### Features: + * switch to PyTorch 2.0.0 (except for AMD GPUs) + * visual improvements to custom code scripts + * add filename patterns: `[clip_skip]`, `[hasprompt<>]`, `[batch_number]`, `[generation_number]` + * add support for saving init images in img2img, and record their hashes in infotext for reproducability + * automatically select current word when adjusting weight with ctrl+up/down + * add dropdowns for X/Y/Z plot + * add setting: Stable Diffusion/Random number generator source: makes it possible to make images generated from a given manual seed consistent across different GPUs + * support Gradio's theme API + * use TCMalloc on Linux by default; possible fix for memory leaks + * add optimization option to remove negative conditioning at low sigma values #9177 + * embed model merge metadata in .safetensors file + * extension settings backup/restore feature #9169 + * add "resize by" and "resize to" tabs to img2img + * add option "keep original size" to textual inversion images preprocess + * image viewer scrolling via analog stick + * button to restore the progress from session lost / tab reload + +### Minor: + * bump Gradio to 3.28.1 + * change "scale to" to sliders in Extras tab + * add labels to tool buttons to make it possible to hide them + * add tiled inference support for ScuNET + * add branch support for extension installation + * change Linux installation script to install into current directory rather than `/home/username` + * sort textual inversion embeddings by name (case-insensitive) + * allow styles.csv to be symlinked or mounted in docker + * remove the "do not add watermark to images" option + * make selected tab configurable with UI config + * make the extra networks UI fixed height and scrollable + * add `disable_tls_verify` arg for use with self-signed certs + +### Extensions: + * add reload callback + * add `is_hr_pass` field for processing + +### Bug Fixes: + * fix broken batch image processing on 'Extras/Batch Process' tab + * add "None" option to extra networks dropdowns + * fix FileExistsError for CLIP Interrogator + * fix /sdapi/v1/txt2img endpoint not working on Linux #9319 + * fix disappearing live previews and progressbar during slow tasks + * fix fullscreen image view not working properly in some cases + * prevent alwayson_scripts args param resizing script_arg list when they are inserted in it + * fix prompt schedule for second order samplers + * fix image mask/composite for weird resolutions #9628 + * use correct images for previews when using AND (see #9491) + * one broken image in img2img batch won't stop all processing + * fix image orientation bug in train/preprocess + * fix Ngrok recreating tunnels every reload + * fix `--realesrgan-models-path` and `--ldsr-models-path` not working + * fix `--skip-install` not working + * use SAMPLE file format in Outpainting Mk2 & Poorman + * do not fail all LoRAs if some have failed to load when making a picture + +## 1.0.0 + * everything diff --git a/stable-diffusion-webui/CITATION.cff b/stable-diffusion-webui/CITATION.cff new file mode 100644 index 0000000000000000000000000000000000000000..2c781aff450c8604eb3cf876d2c3585a96a5a590 --- /dev/null +++ b/stable-diffusion-webui/CITATION.cff @@ -0,0 +1,7 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: + - given-names: AUTOMATIC1111 +title: "Stable Diffusion Web UI" +date-released: 2022-08-22 +url: "https://github.com/AUTOMATIC1111/stable-diffusion-webui" diff --git a/stable-diffusion-webui/CODEOWNERS b/stable-diffusion-webui/CODEOWNERS new file mode 100644 index 0000000000000000000000000000000000000000..2c937f6f1e519f864d15d5233e1fb86c6cdfac2f --- /dev/null +++ b/stable-diffusion-webui/CODEOWNERS @@ -0,0 +1,12 @@ +* @AUTOMATIC1111 + +# if you were managing a localization and were removed from this file, this is because +# the intended way to do localizations now is via extensions. See: +# https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Developing-extensions +# Make a repo with your localization and since you are still listed as a collaborator +# you can add it to the wiki page yourself. This change is because some people complained +# the git commit log is cluttered with things unrelated to almost everyone and +# because I believe this is the best overall for the project to handle localizations almost +# entirely without my oversight. + + diff --git a/stable-diffusion-webui/LICENSE.txt b/stable-diffusion-webui/LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..211d32e752cb61bd056436e8f7a806f12a626bb7 --- /dev/null +++ b/stable-diffusion-webui/LICENSE.txt @@ -0,0 +1,663 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (c) 2023 AUTOMATIC1111 + + 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/stable-diffusion-webui/README.md b/stable-diffusion-webui/README.md new file mode 100644 index 0000000000000000000000000000000000000000..329a86e2a4eba6b3f1ebf14181e09bac2af7ff59 --- /dev/null +++ b/stable-diffusion-webui/README.md @@ -0,0 +1,181 @@ +# Stable Diffusion web UI +A browser interface based on Gradio library for Stable Diffusion. + +![](screenshot.png) + +## Features +[Detailed feature showcase with images](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features): +- Original txt2img and img2img modes +- One click install and run script (but you still must install python and git) +- Outpainting +- Inpainting +- Color Sketch +- Prompt Matrix +- Stable Diffusion Upscale +- Attention, specify parts of text that the model should pay more attention to + - a man in a `((tuxedo))` - will pay more attention to tuxedo + - a man in a `(tuxedo:1.21)` - alternative syntax + - select text and press `Ctrl+Up` or `Ctrl+Down` (or `Command+Up` or `Command+Down` if you're on a MacOS) to automatically adjust attention to selected text (code contributed by anonymous user) +- Loopback, run img2img processing multiple times +- X/Y/Z plot, a way to draw a 3 dimensional plot of images with different parameters +- Textual Inversion + - have as many embeddings as you want and use any names you like for them + - use multiple embeddings with different numbers of vectors per token + - works with half precision floating point numbers + - train embeddings on 8GB (also reports of 6GB working) +- Extras tab with: + - GFPGAN, neural network that fixes faces + - CodeFormer, face restoration tool as an alternative to GFPGAN + - RealESRGAN, neural network upscaler + - ESRGAN, neural network upscaler with a lot of third party models + - SwinIR and Swin2SR ([see here](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/2092)), neural network upscalers + - LDSR, Latent diffusion super resolution upscaling +- Resizing aspect ratio options +- Sampling method selection + - Adjust sampler eta values (noise multiplier) + - More advanced noise setting options +- Interrupt processing at any time +- 4GB video card support (also reports of 2GB working) +- Correct seeds for batches +- Live prompt token length validation +- Generation parameters + - parameters you used to generate images are saved with that image + - in PNG chunks for PNG, in EXIF for JPEG + - can drag the image to PNG info tab to restore generation parameters and automatically copy them into UI + - can be disabled in settings + - drag and drop an image/text-parameters to promptbox +- Read Generation Parameters Button, loads parameters in promptbox to UI +- Settings page +- Running arbitrary python code from UI (must run with `--allow-code` to enable) +- Mouseover hints for most UI elements +- Possible to change defaults/mix/max/step values for UI elements via text config +- Tiling support, a checkbox to create images that can be tiled like textures +- Progress bar and live image generation preview + - Can use a separate neural network to produce previews with almost none VRAM or compute requirement +- Negative prompt, an extra text field that allows you to list what you don't want to see in generated image +- Styles, a way to save part of prompt and easily apply them via dropdown later +- Variations, a way to generate same image but with tiny differences +- Seed resizing, a way to generate same image but at slightly different resolution +- CLIP interrogator, a button that tries to guess prompt from an image +- Prompt Editing, a way to change prompt mid-generation, say to start making a watermelon and switch to anime girl midway +- Batch Processing, process a group of files using img2img +- Img2img Alternative, reverse Euler method of cross attention control +- Highres Fix, a convenience option to produce high resolution pictures in one click without usual distortions +- Reloading checkpoints on the fly +- Checkpoint Merger, a tab that allows you to merge up to 3 checkpoints into one +- [Custom scripts](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Scripts) with many extensions from community +- [Composable-Diffusion](https://energy-based-model.github.io/Compositional-Visual-Generation-with-Composable-Diffusion-Models/), a way to use multiple prompts at once + - separate prompts using uppercase `AND` + - also supports weights for prompts: `a cat :1.2 AND a dog AND a penguin :2.2` +- No token limit for prompts (original stable diffusion lets you use up to 75 tokens) +- DeepDanbooru integration, creates danbooru style tags for anime prompts +- [xformers](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Xformers), major speed increase for select cards: (add `--xformers` to commandline args) +- via extension: [History tab](https://github.com/yfszzx/stable-diffusion-webui-images-browser): view, direct and delete images conveniently within the UI +- Generate forever option +- Training tab + - hypernetworks and embeddings options + - Preprocessing images: cropping, mirroring, autotagging using BLIP or deepdanbooru (for anime) +- Clip skip +- Hypernetworks +- Loras (same as Hypernetworks but more pretty) +- A separate UI where you can choose, with preview, which embeddings, hypernetworks or Loras to add to your prompt +- Can select to load a different VAE from settings screen +- Estimated completion time in progress bar +- API +- Support for dedicated [inpainting model](https://github.com/runwayml/stable-diffusion#inpainting-with-stable-diffusion) by RunwayML +- via extension: [Aesthetic Gradients](https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients), a way to generate images with a specific aesthetic by using clip images embeds (implementation of [https://github.com/vicgalle/stable-diffusion-aesthetic-gradients](https://github.com/vicgalle/stable-diffusion-aesthetic-gradients)) +- [Stable Diffusion 2.0](https://github.com/Stability-AI/stablediffusion) support - see [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#stable-diffusion-20) for instructions +- [Alt-Diffusion](https://arxiv.org/abs/2211.06679) support - see [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#alt-diffusion) for instructions +- Now without any bad letters! +- Load checkpoints in safetensors format +- Eased resolution restriction: generated image's dimensions must be a multiple of 8 rather than 64 +- Now with a license! +- Reorder elements in the UI from settings screen +- [Segmind Stable Diffusion](https://huggingface.co/segmind/SSD-1B) support + +## Installation and Running +Make sure the required [dependencies](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Dependencies) are met and follow the instructions available for: +- [NVidia](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs) (recommended) +- [AMD](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs) GPUs. +- [Intel CPUs, Intel GPUs (both integrated and discrete)](https://github.com/openvinotoolkit/stable-diffusion-webui/wiki/Installation-on-Intel-Silicon) (external wiki page) + +Alternatively, use online services (like Google Colab): + +- [List of Online Services](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Online-Services) + +### Installation on Windows 10/11 with NVidia-GPUs using release package +1. Download `sd.webui.zip` from [v1.0.0-pre](https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.0.0-pre) and extract its contents. +2. Run `update.bat`. +3. Run `run.bat`. +> For more details see [Install-and-Run-on-NVidia-GPUs](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs) + +### Automatic Installation on Windows +1. Install [Python 3.10.6](https://www.python.org/downloads/release/python-3106/) (Newer version of Python does not support torch), checking "Add Python to PATH". +2. Install [git](https://git-scm.com/download/win). +3. Download the stable-diffusion-webui repository, for example by running `git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git`. +4. Run `webui-user.bat` from Windows Explorer as normal, non-administrator, user. + +### Automatic Installation on Linux +1. Install the dependencies: +```bash +# Debian-based: +sudo apt install wget git python3 python3-venv libgl1 libglib2.0-0 +# Red Hat-based: +sudo dnf install wget git python3 gperftools-libs libglvnd-glx +# openSUSE-based: +sudo zypper install wget git python3 libtcmalloc4 libglvnd +# Arch-based: +sudo pacman -S wget git python3 +``` +2. Navigate to the directory you would like the webui to be installed and execute the following command: +```bash +wget -q https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh +``` +3. Run `webui.sh`. +4. Check `webui-user.sh` for options. +### Installation on Apple Silicon + +Find the instructions [here](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon). + +## Contributing +Here's how to add code to this repo: [Contributing](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Contributing) + +## Documentation + +The documentation was moved from this README over to the project's [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki). + +For the purposes of getting Google and other search engines to crawl the wiki, here's a link to the (not for humans) [crawlable wiki](https://github-wiki-see.page/m/AUTOMATIC1111/stable-diffusion-webui/wiki). + +## Credits +Licenses for borrowed code can be found in `Settings -> Licenses` screen, and also in `html/licenses.html` file. + +- Stable Diffusion - https://github.com/Stability-AI/stablediffusion, https://github.com/CompVis/taming-transformers +- k-diffusion - https://github.com/crowsonkb/k-diffusion.git +- GFPGAN - https://github.com/TencentARC/GFPGAN.git +- CodeFormer - https://github.com/sczhou/CodeFormer +- ESRGAN - https://github.com/xinntao/ESRGAN +- SwinIR - https://github.com/JingyunLiang/SwinIR +- Swin2SR - https://github.com/mv-lab/swin2sr +- LDSR - https://github.com/Hafiidz/latent-diffusion +- MiDaS - https://github.com/isl-org/MiDaS +- Ideas for optimizations - https://github.com/basujindal/stable-diffusion +- Cross Attention layer optimization - Doggettx - https://github.com/Doggettx/stable-diffusion, original idea for prompt editing. +- Cross Attention layer optimization - InvokeAI, lstein - https://github.com/invoke-ai/InvokeAI (originally http://github.com/lstein/stable-diffusion) +- Sub-quadratic Cross Attention layer optimization - Alex Birch (https://github.com/Birch-san/diffusers/pull/1), Amin Rezaei (https://github.com/AminRezaei0x443/memory-efficient-attention) +- Textual Inversion - Rinon Gal - https://github.com/rinongal/textual_inversion (we're not using his code, but we are using his ideas). +- Idea for SD upscale - https://github.com/jquesnelle/txt2imghd +- Noise generation for outpainting mk2 - https://github.com/parlance-zz/g-diffuser-bot +- CLIP interrogator idea and borrowing some code - https://github.com/pharmapsychotic/clip-interrogator +- Idea for Composable Diffusion - https://github.com/energy-based-model/Compositional-Visual-Generation-with-Composable-Diffusion-Models-PyTorch +- xformers - https://github.com/facebookresearch/xformers +- DeepDanbooru - interrogator for anime diffusers https://github.com/KichangKim/DeepDanbooru +- Sampling in float32 precision from a float16 UNet - marunine for the idea, Birch-san for the example Diffusers implementation (https://github.com/Birch-san/diffusers-play/tree/92feee6) +- Instruct pix2pix - Tim Brooks (star), Aleksander Holynski (star), Alexei A. Efros (no star) - https://github.com/timothybrooks/instruct-pix2pix +- Security advice - RyotaK +- UniPC sampler - Wenliang Zhao - https://github.com/wl-zhao/UniPC +- TAESD - Ollin Boer Bohan - https://github.com/madebyollin/taesd +- LyCORIS - KohakuBlueleaf +- Restart sampling - lambertae - https://github.com/Newbeeer/diffusion_restart_sampling +- Hypertile - tfernd - https://github.com/tfernd/HyperTile +- Initial Gradio script - posted on 4chan by an Anonymous user. Thank you Anonymous user. +- (You) diff --git a/stable-diffusion-webui/__pycache__/launch.cpython-310.pyc b/stable-diffusion-webui/__pycache__/launch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64c77b533f0514a6636745d25a23e1dd023e94c1 Binary files /dev/null and b/stable-diffusion-webui/__pycache__/launch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/__pycache__/webui.cpython-310.pyc b/stable-diffusion-webui/__pycache__/webui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c6dae596205764c9e4ac8d766979ed4a673bcfc Binary files /dev/null and b/stable-diffusion-webui/__pycache__/webui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/cache.json b/stable-diffusion-webui/cache.json new file mode 100644 index 0000000000000000000000000000000000000000..e0b8e447ab92c66c28df126e3332e8f9d57f39e9 --- /dev/null +++ b/stable-diffusion-webui/cache.json @@ -0,0 +1,36 @@ +{ + "safetensors-metadata": { + "checkpoint/Realistic_Vision_V5.1-inpainting.safetensors": { + "mtime": 1710508474.0, + "value": {} + } + }, + "hashes": { + "checkpoint/Realistic_Vision_V5.1-inpainting.safetensors": { + "mtime": 1710508474.0, + "sha256": "befb05f117278b063dac594a3406d861c8e148a16db356a95cf0deee25c94cdc" + } + }, + "extensions-git": { + "sd-webui-reactor": { + "mtime": 1710508719.0, + "value": { + "remote": "https://github.com/Gourieff/sd-webui-reactor.git", + "commit_date": 1710498038, + "branch": "main", + "commit_hash": "ae57149962cd6c17edc0e4c4c868d1355b9daff4", + "version": "ae571499" + } + }, + "sd-civitai-browser-plus": { + "mtime": 1710508872.0, + "value": { + "remote": "https://github.com/BlafKing/sd-civitai-browser-plus.git", + "commit_date": 1710365275, + "branch": "main", + "commit_hash": "fbdbc336d5701fadb0c09c3e9b04b82bbd558f87", + "version": "fbdbc336" + } + } + } +} \ No newline at end of file diff --git a/stable-diffusion-webui/configs/alt-diffusion-inference.yaml b/stable-diffusion-webui/configs/alt-diffusion-inference.yaml new file mode 100644 index 0000000000000000000000000000000000000000..cfbee72d71bfd7deed2075e423ca51bd1da0521c --- /dev/null +++ b/stable-diffusion-webui/configs/alt-diffusion-inference.yaml @@ -0,0 +1,72 @@ +model: + base_learning_rate: 1.0e-04 + target: ldm.models.diffusion.ddpm.LatentDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false # Note: different from the one we trained before + conditioning_key: crossattn + monitor: val/loss_simple_ema + scale_factor: 0.18215 + use_ema: False + + scheduler_config: # 10000 warmup steps + target: ldm.lr_scheduler.LambdaLinearScheduler + params: + warm_up_steps: [ 10000 ] + cycle_lengths: [ 10000000000000 ] # incredibly large number to prevent corner cases + f_start: [ 1.e-6 ] + f_max: [ 1. ] + f_min: [ 1. ] + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + image_size: 32 # unused + in_channels: 4 + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_heads: 8 + use_spatial_transformer: True + transformer_depth: 1 + context_dim: 768 + use_checkpoint: True + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: modules.xlmr.BertSeriesModelWithTransformation + params: + name: "XLMR-Large" \ No newline at end of file diff --git a/stable-diffusion-webui/configs/alt-diffusion-m18-inference.yaml b/stable-diffusion-webui/configs/alt-diffusion-m18-inference.yaml new file mode 100644 index 0000000000000000000000000000000000000000..41a031d55f03b9946b543e930b881017c7e1cca6 --- /dev/null +++ b/stable-diffusion-webui/configs/alt-diffusion-m18-inference.yaml @@ -0,0 +1,73 @@ +model: + base_learning_rate: 1.0e-04 + target: ldm.models.diffusion.ddpm.LatentDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false # Note: different from the one we trained before + conditioning_key: crossattn + monitor: val/loss_simple_ema + scale_factor: 0.18215 + use_ema: False + + scheduler_config: # 10000 warmup steps + target: ldm.lr_scheduler.LambdaLinearScheduler + params: + warm_up_steps: [ 10000 ] + cycle_lengths: [ 10000000000000 ] # incredibly large number to prevent corner cases + f_start: [ 1.e-6 ] + f_max: [ 1. ] + f_min: [ 1. ] + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + image_size: 32 # unused + in_channels: 4 + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_head_channels: 64 + use_spatial_transformer: True + use_linear_in_transformer: True + transformer_depth: 1 + context_dim: 1024 + use_checkpoint: True + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: modules.xlmr_m18.BertSeriesModelWithTransformation + params: + name: "XLMR-Large" diff --git a/stable-diffusion-webui/configs/instruct-pix2pix.yaml b/stable-diffusion-webui/configs/instruct-pix2pix.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4e896879dd7ac5697b89cb323ec43eb41c03596c --- /dev/null +++ b/stable-diffusion-webui/configs/instruct-pix2pix.yaml @@ -0,0 +1,98 @@ +# File modified by authors of InstructPix2Pix from original (https://github.com/CompVis/stable-diffusion). +# See more details in LICENSE. + +model: + base_learning_rate: 1.0e-04 + target: modules.models.diffusion.ddpm_edit.LatentDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: edited + cond_stage_key: edit + # image_size: 64 + # image_size: 32 + image_size: 16 + channels: 4 + cond_stage_trainable: false # Note: different from the one we trained before + conditioning_key: hybrid + monitor: val/loss_simple_ema + scale_factor: 0.18215 + use_ema: false + + scheduler_config: # 10000 warmup steps + target: ldm.lr_scheduler.LambdaLinearScheduler + params: + warm_up_steps: [ 0 ] + cycle_lengths: [ 10000000000000 ] # incredibly large number to prevent corner cases + f_start: [ 1.e-6 ] + f_max: [ 1. ] + f_min: [ 1. ] + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + image_size: 32 # unused + in_channels: 8 + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_heads: 8 + use_spatial_transformer: True + transformer_depth: 1 + context_dim: 768 + use_checkpoint: True + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: ldm.modules.encoders.modules.FrozenCLIPEmbedder + +data: + target: main.DataModuleFromConfig + params: + batch_size: 128 + num_workers: 1 + wrap: false + validation: + target: edit_dataset.EditDataset + params: + path: data/clip-filtered-dataset + cache_dir: data/ + cache_name: data_10k + split: val + min_text_sim: 0.2 + min_image_sim: 0.75 + min_direction_sim: 0.2 + max_samples_per_prompt: 1 + min_resize_res: 512 + max_resize_res: 512 + crop_res: 512 + output_as_edit: False + real_input: True diff --git a/stable-diffusion-webui/configs/v1-inference.yaml b/stable-diffusion-webui/configs/v1-inference.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d4effe569e897369918625f9d8be5603a0e6a0d6 --- /dev/null +++ b/stable-diffusion-webui/configs/v1-inference.yaml @@ -0,0 +1,70 @@ +model: + base_learning_rate: 1.0e-04 + target: ldm.models.diffusion.ddpm.LatentDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false # Note: different from the one we trained before + conditioning_key: crossattn + monitor: val/loss_simple_ema + scale_factor: 0.18215 + use_ema: False + + scheduler_config: # 10000 warmup steps + target: ldm.lr_scheduler.LambdaLinearScheduler + params: + warm_up_steps: [ 10000 ] + cycle_lengths: [ 10000000000000 ] # incredibly large number to prevent corner cases + f_start: [ 1.e-6 ] + f_max: [ 1. ] + f_min: [ 1. ] + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + image_size: 32 # unused + in_channels: 4 + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_heads: 8 + use_spatial_transformer: True + transformer_depth: 1 + context_dim: 768 + use_checkpoint: True + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: ldm.modules.encoders.modules.FrozenCLIPEmbedder diff --git a/stable-diffusion-webui/configs/v1-inpainting-inference.yaml b/stable-diffusion-webui/configs/v1-inpainting-inference.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f9eec37d24bce33ce92320a782d16ae72308190a --- /dev/null +++ b/stable-diffusion-webui/configs/v1-inpainting-inference.yaml @@ -0,0 +1,70 @@ +model: + base_learning_rate: 7.5e-05 + target: ldm.models.diffusion.ddpm.LatentInpaintDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false # Note: different from the one we trained before + conditioning_key: hybrid # important + monitor: val/loss_simple_ema + scale_factor: 0.18215 + finetune_keys: null + + scheduler_config: # 10000 warmup steps + target: ldm.lr_scheduler.LambdaLinearScheduler + params: + warm_up_steps: [ 2500 ] # NOTE for resuming. use 10000 if starting from scratch + cycle_lengths: [ 10000000000000 ] # incredibly large number to prevent corner cases + f_start: [ 1.e-6 ] + f_max: [ 1. ] + f_min: [ 1. ] + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + image_size: 32 # unused + in_channels: 9 # 4 data + 4 downscaled image + 1 mask + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_heads: 8 + use_spatial_transformer: True + transformer_depth: 1 + context_dim: 768 + use_checkpoint: True + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: ldm.modules.encoders.modules.FrozenCLIPEmbedder diff --git a/stable-diffusion-webui/embeddings/Place Textual Inversion embeddings here.txt b/stable-diffusion-webui/embeddings/Place Textual Inversion embeddings here.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/environment-wsl2.yaml b/stable-diffusion-webui/environment-wsl2.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0c4ae6809997ec38e7cf62cf0f71360b8cb61a7e --- /dev/null +++ b/stable-diffusion-webui/environment-wsl2.yaml @@ -0,0 +1,11 @@ +name: automatic +channels: + - pytorch + - defaults +dependencies: + - python=3.10 + - pip=23.0 + - cudatoolkit=11.8 + - pytorch=2.0 + - torchvision=0.15 + - numpy=1.23 diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/ldsr_model_arch.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/ldsr_model_arch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11263dd70fcc217415d38bdb3e3bcb43698e5d21 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/ldsr_model_arch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/preload.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/preload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19acb76e307237d8b2f9156f3ee94b6f16640c72 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/preload.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/sd_hijack_autoencoder.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/sd_hijack_autoencoder.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ccb27a6c60c395fea93f1f528eed32742b47f0b Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/sd_hijack_autoencoder.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/sd_hijack_ddpm_v1.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/sd_hijack_ddpm_v1.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c4fe1b916ba104e480438d9de1513107923b63e Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/sd_hijack_ddpm_v1.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/vqvae_quantize.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/vqvae_quantize.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d66ca8b69abd0e058ae4dad1b73ddac37459354c Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/LDSR/__pycache__/vqvae_quantize.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/ldsr_model_arch.py b/stable-diffusion-webui/extensions-builtin/LDSR/ldsr_model_arch.py new file mode 100644 index 0000000000000000000000000000000000000000..7cac36ce55ae295c6d0e444a93ea12bf8cfe893c --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/LDSR/ldsr_model_arch.py @@ -0,0 +1,250 @@ +import os +import gc +import time + +import numpy as np +import torch +import torchvision +from PIL import Image +from einops import rearrange, repeat +from omegaconf import OmegaConf +import safetensors.torch + +from ldm.models.diffusion.ddim import DDIMSampler +from ldm.util import instantiate_from_config, ismap +from modules import shared, sd_hijack, devices + +cached_ldsr_model: torch.nn.Module = None + + +# Create LDSR Class +class LDSR: + def load_model_from_config(self, half_attention): + global cached_ldsr_model + + if shared.opts.ldsr_cached and cached_ldsr_model is not None: + print("Loading model from cache") + model: torch.nn.Module = cached_ldsr_model + else: + print(f"Loading model from {self.modelPath}") + _, extension = os.path.splitext(self.modelPath) + if extension.lower() == ".safetensors": + pl_sd = safetensors.torch.load_file(self.modelPath, device="cpu") + else: + pl_sd = torch.load(self.modelPath, map_location="cpu") + sd = pl_sd["state_dict"] if "state_dict" in pl_sd else pl_sd + config = OmegaConf.load(self.yamlPath) + config.model.target = "ldm.models.diffusion.ddpm.LatentDiffusionV1" + model: torch.nn.Module = instantiate_from_config(config.model) + model.load_state_dict(sd, strict=False) + model = model.to(shared.device) + if half_attention: + model = model.half() + if shared.cmd_opts.opt_channelslast: + model = model.to(memory_format=torch.channels_last) + + sd_hijack.model_hijack.hijack(model) # apply optimization + model.eval() + + if shared.opts.ldsr_cached: + cached_ldsr_model = model + + return {"model": model} + + def __init__(self, model_path, yaml_path): + self.modelPath = model_path + self.yamlPath = yaml_path + + @staticmethod + def run(model, selected_path, custom_steps, eta): + example = get_cond(selected_path) + + n_runs = 1 + guider = None + ckwargs = None + ddim_use_x0_pred = False + temperature = 1. + eta = eta + custom_shape = None + + height, width = example["image"].shape[1:3] + split_input = height >= 128 and width >= 128 + + if split_input: + ks = 128 + stride = 64 + vqf = 4 # + model.split_input_params = {"ks": (ks, ks), "stride": (stride, stride), + "vqf": vqf, + "patch_distributed_vq": True, + "tie_braker": False, + "clip_max_weight": 0.5, + "clip_min_weight": 0.01, + "clip_max_tie_weight": 0.5, + "clip_min_tie_weight": 0.01} + else: + if hasattr(model, "split_input_params"): + delattr(model, "split_input_params") + + x_t = None + logs = None + for _ in range(n_runs): + if custom_shape is not None: + x_t = torch.randn(1, custom_shape[1], custom_shape[2], custom_shape[3]).to(model.device) + x_t = repeat(x_t, '1 c h w -> b c h w', b=custom_shape[0]) + + logs = make_convolutional_sample(example, model, + custom_steps=custom_steps, + eta=eta, quantize_x0=False, + custom_shape=custom_shape, + temperature=temperature, noise_dropout=0., + corrector=guider, corrector_kwargs=ckwargs, x_T=x_t, + ddim_use_x0_pred=ddim_use_x0_pred + ) + return logs + + def super_resolution(self, image, steps=100, target_scale=2, half_attention=False): + model = self.load_model_from_config(half_attention) + + # Run settings + diffusion_steps = int(steps) + eta = 1.0 + + + gc.collect() + devices.torch_gc() + + im_og = image + width_og, height_og = im_og.size + # If we can adjust the max upscale size, then the 4 below should be our variable + down_sample_rate = target_scale / 4 + wd = width_og * down_sample_rate + hd = height_og * down_sample_rate + width_downsampled_pre = int(np.ceil(wd)) + height_downsampled_pre = int(np.ceil(hd)) + + if down_sample_rate != 1: + print( + f'Downsampling from [{width_og}, {height_og}] to [{width_downsampled_pre}, {height_downsampled_pre}]') + im_og = im_og.resize((width_downsampled_pre, height_downsampled_pre), Image.LANCZOS) + else: + print(f"Down sample rate is 1 from {target_scale} / 4 (Not downsampling)") + + # pad width and height to multiples of 64, pads with the edge values of image to avoid artifacts + pad_w, pad_h = np.max(((2, 2), np.ceil(np.array(im_og.size) / 64).astype(int)), axis=0) * 64 - im_og.size + im_padded = Image.fromarray(np.pad(np.array(im_og), ((0, pad_h), (0, pad_w), (0, 0)), mode='edge')) + + logs = self.run(model["model"], im_padded, diffusion_steps, eta) + + sample = logs["sample"] + sample = sample.detach().cpu() + sample = torch.clamp(sample, -1., 1.) + sample = (sample + 1.) / 2. * 255 + sample = sample.numpy().astype(np.uint8) + sample = np.transpose(sample, (0, 2, 3, 1)) + a = Image.fromarray(sample[0]) + + # remove padding + a = a.crop((0, 0) + tuple(np.array(im_og.size) * 4)) + + del model + gc.collect() + devices.torch_gc() + + return a + + +def get_cond(selected_path): + example = {} + up_f = 4 + c = selected_path.convert('RGB') + c = torch.unsqueeze(torchvision.transforms.ToTensor()(c), 0) + c_up = torchvision.transforms.functional.resize(c, size=[up_f * c.shape[2], up_f * c.shape[3]], + antialias=True) + c_up = rearrange(c_up, '1 c h w -> 1 h w c') + c = rearrange(c, '1 c h w -> 1 h w c') + c = 2. * c - 1. + + c = c.to(shared.device) + example["LR_image"] = c + example["image"] = c_up + + return example + + +@torch.no_grad() +def convsample_ddim(model, cond, steps, shape, eta=1.0, callback=None, normals_sequence=None, + mask=None, x0=None, quantize_x0=False, temperature=1., score_corrector=None, + corrector_kwargs=None, x_t=None + ): + ddim = DDIMSampler(model) + bs = shape[0] + shape = shape[1:] + print(f"Sampling with eta = {eta}; steps: {steps}") + samples, intermediates = ddim.sample(steps, batch_size=bs, shape=shape, conditioning=cond, callback=callback, + normals_sequence=normals_sequence, quantize_x0=quantize_x0, eta=eta, + mask=mask, x0=x0, temperature=temperature, verbose=False, + score_corrector=score_corrector, + corrector_kwargs=corrector_kwargs, x_t=x_t) + + return samples, intermediates + + +@torch.no_grad() +def make_convolutional_sample(batch, model, custom_steps=None, eta=1.0, quantize_x0=False, custom_shape=None, temperature=1., noise_dropout=0., corrector=None, + corrector_kwargs=None, x_T=None, ddim_use_x0_pred=False): + log = {} + + z, c, x, xrec, xc = model.get_input(batch, model.first_stage_key, + return_first_stage_outputs=True, + force_c_encode=not (hasattr(model, 'split_input_params') + and model.cond_stage_key == 'coordinates_bbox'), + return_original_cond=True) + + if custom_shape is not None: + z = torch.randn(custom_shape) + print(f"Generating {custom_shape[0]} samples of shape {custom_shape[1:]}") + + z0 = None + + log["input"] = x + log["reconstruction"] = xrec + + if ismap(xc): + log["original_conditioning"] = model.to_rgb(xc) + if hasattr(model, 'cond_stage_key'): + log[model.cond_stage_key] = model.to_rgb(xc) + + else: + log["original_conditioning"] = xc if xc is not None else torch.zeros_like(x) + if model.cond_stage_model: + log[model.cond_stage_key] = xc if xc is not None else torch.zeros_like(x) + if model.cond_stage_key == 'class_label': + log[model.cond_stage_key] = xc[model.cond_stage_key] + + with model.ema_scope("Plotting"): + t0 = time.time() + + sample, intermediates = convsample_ddim(model, c, steps=custom_steps, shape=z.shape, + eta=eta, + quantize_x0=quantize_x0, mask=None, x0=z0, + temperature=temperature, score_corrector=corrector, corrector_kwargs=corrector_kwargs, + x_t=x_T) + t1 = time.time() + + if ddim_use_x0_pred: + sample = intermediates['pred_x0'][-1] + + x_sample = model.decode_first_stage(sample) + + try: + x_sample_noquant = model.decode_first_stage(sample, force_not_quantize=True) + log["sample_noquant"] = x_sample_noquant + log["sample_diff"] = torch.abs(x_sample_noquant - x_sample) + except Exception: + pass + + log["sample"] = x_sample + log["time"] = t1 - t0 + + return log diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/preload.py b/stable-diffusion-webui/extensions-builtin/LDSR/preload.py new file mode 100644 index 0000000000000000000000000000000000000000..cfd478d545ed12ef74e73fa40b6defe0156859da --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/LDSR/preload.py @@ -0,0 +1,6 @@ +import os +from modules import paths + + +def preload(parser): + parser.add_argument("--ldsr-models-path", type=str, help="Path to directory with LDSR model file(s).", default=os.path.join(paths.models_path, 'LDSR')) diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/scripts/__pycache__/ldsr_model.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/LDSR/scripts/__pycache__/ldsr_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc8f8eb1ec3acdf5125f3892c735b661fbb741e5 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/LDSR/scripts/__pycache__/ldsr_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/scripts/ldsr_model.py b/stable-diffusion-webui/extensions-builtin/LDSR/scripts/ldsr_model.py new file mode 100644 index 0000000000000000000000000000000000000000..bd78decea1ec9fc66d61d66ee64457458a290f72 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/LDSR/scripts/ldsr_model.py @@ -0,0 +1,68 @@ +import os + +from modules.modelloader import load_file_from_url +from modules.upscaler import Upscaler, UpscalerData +from ldsr_model_arch import LDSR +from modules import shared, script_callbacks, errors +import sd_hijack_autoencoder # noqa: F401 +import sd_hijack_ddpm_v1 # noqa: F401 + + +class UpscalerLDSR(Upscaler): + def __init__(self, user_path): + self.name = "LDSR" + self.user_path = user_path + self.model_url = "https://heibox.uni-heidelberg.de/f/578df07c8fc04ffbadf3/?dl=1" + self.yaml_url = "https://heibox.uni-heidelberg.de/f/31a76b13ea27482981b4/?dl=1" + super().__init__() + scaler_data = UpscalerData("LDSR", None, self) + self.scalers = [scaler_data] + + def load_model(self, path: str): + # Remove incorrect project.yaml file if too big + yaml_path = os.path.join(self.model_path, "project.yaml") + old_model_path = os.path.join(self.model_path, "model.pth") + new_model_path = os.path.join(self.model_path, "model.ckpt") + + local_model_paths = self.find_models(ext_filter=[".ckpt", ".safetensors"]) + local_ckpt_path = next(iter([local_model for local_model in local_model_paths if local_model.endswith("model.ckpt")]), None) + local_safetensors_path = next(iter([local_model for local_model in local_model_paths if local_model.endswith("model.safetensors")]), None) + local_yaml_path = next(iter([local_model for local_model in local_model_paths if local_model.endswith("project.yaml")]), None) + + if os.path.exists(yaml_path): + statinfo = os.stat(yaml_path) + if statinfo.st_size >= 10485760: + print("Removing invalid LDSR YAML file.") + os.remove(yaml_path) + + if os.path.exists(old_model_path): + print("Renaming model from model.pth to model.ckpt") + os.rename(old_model_path, new_model_path) + + if local_safetensors_path is not None and os.path.exists(local_safetensors_path): + model = local_safetensors_path + else: + model = local_ckpt_path or load_file_from_url(self.model_url, model_dir=self.model_download_path, file_name="model.ckpt") + + yaml = local_yaml_path or load_file_from_url(self.yaml_url, model_dir=self.model_download_path, file_name="project.yaml") + + return LDSR(model, yaml) + + def do_upscale(self, img, path): + try: + ldsr = self.load_model(path) + except Exception: + errors.report(f"Failed loading LDSR model {path}", exc_info=True) + return img + ddim_steps = shared.opts.ldsr_steps + return ldsr.super_resolution(img, ddim_steps, self.scale) + + +def on_ui_settings(): + import gradio as gr + + shared.opts.add_option("ldsr_steps", shared.OptionInfo(100, "LDSR processing steps. Lower = faster", gr.Slider, {"minimum": 1, "maximum": 200, "step": 1}, section=('upscaling', "Upscaling"))) + shared.opts.add_option("ldsr_cached", shared.OptionInfo(False, "Cache LDSR model in memory", gr.Checkbox, {"interactive": True}, section=('upscaling', "Upscaling"))) + + +script_callbacks.on_ui_settings(on_ui_settings) diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/sd_hijack_autoencoder.py b/stable-diffusion-webui/extensions-builtin/LDSR/sd_hijack_autoencoder.py new file mode 100644 index 0000000000000000000000000000000000000000..c29d274da825d2500b77a2022db3421b40b18886 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/LDSR/sd_hijack_autoencoder.py @@ -0,0 +1,293 @@ +# The content of this file comes from the ldm/models/autoencoder.py file of the compvis/stable-diffusion repo +# The VQModel & VQModelInterface were subsequently removed from ldm/models/autoencoder.py when we moved to the stability-ai/stablediffusion repo +# As the LDSR upscaler relies on VQModel & VQModelInterface, the hijack aims to put them back into the ldm.models.autoencoder +import numpy as np +import torch +import pytorch_lightning as pl +import torch.nn.functional as F +from contextlib import contextmanager + +from torch.optim.lr_scheduler import LambdaLR + +from ldm.modules.ema import LitEma +from vqvae_quantize import VectorQuantizer2 as VectorQuantizer +from ldm.modules.diffusionmodules.model import Encoder, Decoder +from ldm.util import instantiate_from_config + +import ldm.models.autoencoder +from packaging import version + +class VQModel(pl.LightningModule): + def __init__(self, + ddconfig, + lossconfig, + n_embed, + embed_dim, + ckpt_path=None, + ignore_keys=None, + image_key="image", + colorize_nlabels=None, + monitor=None, + batch_resize_range=None, + scheduler_config=None, + lr_g_factor=1.0, + remap=None, + sane_index_shape=False, # tell vector quantizer to return indices as bhw + use_ema=False + ): + super().__init__() + self.embed_dim = embed_dim + self.n_embed = n_embed + self.image_key = image_key + self.encoder = Encoder(**ddconfig) + self.decoder = Decoder(**ddconfig) + self.loss = instantiate_from_config(lossconfig) + self.quantize = VectorQuantizer(n_embed, embed_dim, beta=0.25, + remap=remap, + sane_index_shape=sane_index_shape) + self.quant_conv = torch.nn.Conv2d(ddconfig["z_channels"], embed_dim, 1) + self.post_quant_conv = torch.nn.Conv2d(embed_dim, ddconfig["z_channels"], 1) + if colorize_nlabels is not None: + assert type(colorize_nlabels)==int + self.register_buffer("colorize", torch.randn(3, colorize_nlabels, 1, 1)) + if monitor is not None: + self.monitor = monitor + self.batch_resize_range = batch_resize_range + if self.batch_resize_range is not None: + print(f"{self.__class__.__name__}: Using per-batch resizing in range {batch_resize_range}.") + + self.use_ema = use_ema + if self.use_ema: + self.model_ema = LitEma(self) + print(f"Keeping EMAs of {len(list(self.model_ema.buffers()))}.") + + if ckpt_path is not None: + self.init_from_ckpt(ckpt_path, ignore_keys=ignore_keys or []) + self.scheduler_config = scheduler_config + self.lr_g_factor = lr_g_factor + + @contextmanager + def ema_scope(self, context=None): + if self.use_ema: + self.model_ema.store(self.parameters()) + self.model_ema.copy_to(self) + if context is not None: + print(f"{context}: Switched to EMA weights") + try: + yield None + finally: + if self.use_ema: + self.model_ema.restore(self.parameters()) + if context is not None: + print(f"{context}: Restored training weights") + + def init_from_ckpt(self, path, ignore_keys=None): + sd = torch.load(path, map_location="cpu")["state_dict"] + keys = list(sd.keys()) + for k in keys: + for ik in ignore_keys or []: + if k.startswith(ik): + print("Deleting key {} from state_dict.".format(k)) + del sd[k] + missing, unexpected = self.load_state_dict(sd, strict=False) + print(f"Restored from {path} with {len(missing)} missing and {len(unexpected)} unexpected keys") + if missing: + print(f"Missing Keys: {missing}") + if unexpected: + print(f"Unexpected Keys: {unexpected}") + + def on_train_batch_end(self, *args, **kwargs): + if self.use_ema: + self.model_ema(self) + + def encode(self, x): + h = self.encoder(x) + h = self.quant_conv(h) + quant, emb_loss, info = self.quantize(h) + return quant, emb_loss, info + + def encode_to_prequant(self, x): + h = self.encoder(x) + h = self.quant_conv(h) + return h + + def decode(self, quant): + quant = self.post_quant_conv(quant) + dec = self.decoder(quant) + return dec + + def decode_code(self, code_b): + quant_b = self.quantize.embed_code(code_b) + dec = self.decode(quant_b) + return dec + + def forward(self, input, return_pred_indices=False): + quant, diff, (_,_,ind) = self.encode(input) + dec = self.decode(quant) + if return_pred_indices: + return dec, diff, ind + return dec, diff + + def get_input(self, batch, k): + x = batch[k] + if len(x.shape) == 3: + x = x[..., None] + x = x.permute(0, 3, 1, 2).to(memory_format=torch.contiguous_format).float() + if self.batch_resize_range is not None: + lower_size = self.batch_resize_range[0] + upper_size = self.batch_resize_range[1] + if self.global_step <= 4: + # do the first few batches with max size to avoid later oom + new_resize = upper_size + else: + new_resize = np.random.choice(np.arange(lower_size, upper_size+16, 16)) + if new_resize != x.shape[2]: + x = F.interpolate(x, size=new_resize, mode="bicubic") + x = x.detach() + return x + + def training_step(self, batch, batch_idx, optimizer_idx): + # https://github.com/pytorch/pytorch/issues/37142 + # try not to fool the heuristics + x = self.get_input(batch, self.image_key) + xrec, qloss, ind = self(x, return_pred_indices=True) + + if optimizer_idx == 0: + # autoencode + aeloss, log_dict_ae = self.loss(qloss, x, xrec, optimizer_idx, self.global_step, + last_layer=self.get_last_layer(), split="train", + predicted_indices=ind) + + self.log_dict(log_dict_ae, prog_bar=False, logger=True, on_step=True, on_epoch=True) + return aeloss + + if optimizer_idx == 1: + # discriminator + discloss, log_dict_disc = self.loss(qloss, x, xrec, optimizer_idx, self.global_step, + last_layer=self.get_last_layer(), split="train") + self.log_dict(log_dict_disc, prog_bar=False, logger=True, on_step=True, on_epoch=True) + return discloss + + def validation_step(self, batch, batch_idx): + log_dict = self._validation_step(batch, batch_idx) + with self.ema_scope(): + self._validation_step(batch, batch_idx, suffix="_ema") + return log_dict + + def _validation_step(self, batch, batch_idx, suffix=""): + x = self.get_input(batch, self.image_key) + xrec, qloss, ind = self(x, return_pred_indices=True) + aeloss, log_dict_ae = self.loss(qloss, x, xrec, 0, + self.global_step, + last_layer=self.get_last_layer(), + split="val"+suffix, + predicted_indices=ind + ) + + discloss, log_dict_disc = self.loss(qloss, x, xrec, 1, + self.global_step, + last_layer=self.get_last_layer(), + split="val"+suffix, + predicted_indices=ind + ) + rec_loss = log_dict_ae[f"val{suffix}/rec_loss"] + self.log(f"val{suffix}/rec_loss", rec_loss, + prog_bar=True, logger=True, on_step=False, on_epoch=True, sync_dist=True) + self.log(f"val{suffix}/aeloss", aeloss, + prog_bar=True, logger=True, on_step=False, on_epoch=True, sync_dist=True) + if version.parse(pl.__version__) >= version.parse('1.4.0'): + del log_dict_ae[f"val{suffix}/rec_loss"] + self.log_dict(log_dict_ae) + self.log_dict(log_dict_disc) + return self.log_dict + + def configure_optimizers(self): + lr_d = self.learning_rate + lr_g = self.lr_g_factor*self.learning_rate + print("lr_d", lr_d) + print("lr_g", lr_g) + opt_ae = torch.optim.Adam(list(self.encoder.parameters())+ + list(self.decoder.parameters())+ + list(self.quantize.parameters())+ + list(self.quant_conv.parameters())+ + list(self.post_quant_conv.parameters()), + lr=lr_g, betas=(0.5, 0.9)) + opt_disc = torch.optim.Adam(self.loss.discriminator.parameters(), + lr=lr_d, betas=(0.5, 0.9)) + + if self.scheduler_config is not None: + scheduler = instantiate_from_config(self.scheduler_config) + + print("Setting up LambdaLR scheduler...") + scheduler = [ + { + 'scheduler': LambdaLR(opt_ae, lr_lambda=scheduler.schedule), + 'interval': 'step', + 'frequency': 1 + }, + { + 'scheduler': LambdaLR(opt_disc, lr_lambda=scheduler.schedule), + 'interval': 'step', + 'frequency': 1 + }, + ] + return [opt_ae, opt_disc], scheduler + return [opt_ae, opt_disc], [] + + def get_last_layer(self): + return self.decoder.conv_out.weight + + def log_images(self, batch, only_inputs=False, plot_ema=False, **kwargs): + log = {} + x = self.get_input(batch, self.image_key) + x = x.to(self.device) + if only_inputs: + log["inputs"] = x + return log + xrec, _ = self(x) + if x.shape[1] > 3: + # colorize with random projection + assert xrec.shape[1] > 3 + x = self.to_rgb(x) + xrec = self.to_rgb(xrec) + log["inputs"] = x + log["reconstructions"] = xrec + if plot_ema: + with self.ema_scope(): + xrec_ema, _ = self(x) + if x.shape[1] > 3: + xrec_ema = self.to_rgb(xrec_ema) + log["reconstructions_ema"] = xrec_ema + return log + + def to_rgb(self, x): + assert self.image_key == "segmentation" + if not hasattr(self, "colorize"): + self.register_buffer("colorize", torch.randn(3, x.shape[1], 1, 1).to(x)) + x = F.conv2d(x, weight=self.colorize) + x = 2.*(x-x.min())/(x.max()-x.min()) - 1. + return x + + +class VQModelInterface(VQModel): + def __init__(self, embed_dim, *args, **kwargs): + super().__init__(*args, embed_dim=embed_dim, **kwargs) + self.embed_dim = embed_dim + + def encode(self, x): + h = self.encoder(x) + h = self.quant_conv(h) + return h + + def decode(self, h, force_not_quantize=False): + # also go through quantization layer + if not force_not_quantize: + quant, emb_loss, info = self.quantize(h) + else: + quant = h + quant = self.post_quant_conv(quant) + dec = self.decoder(quant) + return dec + +ldm.models.autoencoder.VQModel = VQModel +ldm.models.autoencoder.VQModelInterface = VQModelInterface diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/sd_hijack_ddpm_v1.py b/stable-diffusion-webui/extensions-builtin/LDSR/sd_hijack_ddpm_v1.py new file mode 100644 index 0000000000000000000000000000000000000000..04adc5eb2cfe9aa1d5f75e5653624456c5e37a47 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/LDSR/sd_hijack_ddpm_v1.py @@ -0,0 +1,1443 @@ +# This script is copied from the compvis/stable-diffusion repo (aka the SD V1 repo) +# Original filename: ldm/models/diffusion/ddpm.py +# The purpose to reinstate the old DDPM logic which works with VQ, whereas the V2 one doesn't +# Some models such as LDSR require VQ to work correctly +# The classes are suffixed with "V1" and added back to the "ldm.models.diffusion.ddpm" module + +import torch +import torch.nn as nn +import numpy as np +import pytorch_lightning as pl +from torch.optim.lr_scheduler import LambdaLR +from einops import rearrange, repeat +from contextlib import contextmanager +from functools import partial +from tqdm import tqdm +from torchvision.utils import make_grid +from pytorch_lightning.utilities.distributed import rank_zero_only + +from ldm.util import log_txt_as_img, exists, default, ismap, isimage, mean_flat, count_params, instantiate_from_config +from ldm.modules.ema import LitEma +from ldm.modules.distributions.distributions import normal_kl, DiagonalGaussianDistribution +from ldm.models.autoencoder import VQModelInterface, IdentityFirstStage, AutoencoderKL +from ldm.modules.diffusionmodules.util import make_beta_schedule, extract_into_tensor, noise_like +from ldm.models.diffusion.ddim import DDIMSampler + +import ldm.models.diffusion.ddpm + +__conditioning_keys__ = {'concat': 'c_concat', + 'crossattn': 'c_crossattn', + 'adm': 'y'} + + +def disabled_train(self, mode=True): + """Overwrite model.train with this function to make sure train/eval mode + does not change anymore.""" + return self + + +def uniform_on_device(r1, r2, shape, device): + return (r1 - r2) * torch.rand(*shape, device=device) + r2 + + +class DDPMV1(pl.LightningModule): + # classic DDPM with Gaussian diffusion, in image space + def __init__(self, + unet_config, + timesteps=1000, + beta_schedule="linear", + loss_type="l2", + ckpt_path=None, + ignore_keys=None, + load_only_unet=False, + monitor="val/loss", + use_ema=True, + first_stage_key="image", + image_size=256, + channels=3, + log_every_t=100, + clip_denoised=True, + linear_start=1e-4, + linear_end=2e-2, + cosine_s=8e-3, + given_betas=None, + original_elbo_weight=0., + v_posterior=0., # weight for choosing posterior variance as sigma = (1-v) * beta_tilde + v * beta + l_simple_weight=1., + conditioning_key=None, + parameterization="eps", # all assuming fixed variance schedules + scheduler_config=None, + use_positional_encodings=False, + learn_logvar=False, + logvar_init=0., + ): + super().__init__() + assert parameterization in ["eps", "x0"], 'currently only supporting "eps" and "x0"' + self.parameterization = parameterization + print(f"{self.__class__.__name__}: Running in {self.parameterization}-prediction mode") + self.cond_stage_model = None + self.clip_denoised = clip_denoised + self.log_every_t = log_every_t + self.first_stage_key = first_stage_key + self.image_size = image_size # try conv? + self.channels = channels + self.use_positional_encodings = use_positional_encodings + self.model = DiffusionWrapperV1(unet_config, conditioning_key) + count_params(self.model, verbose=True) + self.use_ema = use_ema + if self.use_ema: + self.model_ema = LitEma(self.model) + print(f"Keeping EMAs of {len(list(self.model_ema.buffers()))}.") + + self.use_scheduler = scheduler_config is not None + if self.use_scheduler: + self.scheduler_config = scheduler_config + + self.v_posterior = v_posterior + self.original_elbo_weight = original_elbo_weight + self.l_simple_weight = l_simple_weight + + if monitor is not None: + self.monitor = monitor + if ckpt_path is not None: + self.init_from_ckpt(ckpt_path, ignore_keys=ignore_keys or [], only_model=load_only_unet) + + self.register_schedule(given_betas=given_betas, beta_schedule=beta_schedule, timesteps=timesteps, + linear_start=linear_start, linear_end=linear_end, cosine_s=cosine_s) + + self.loss_type = loss_type + + self.learn_logvar = learn_logvar + self.logvar = torch.full(fill_value=logvar_init, size=(self.num_timesteps,)) + if self.learn_logvar: + self.logvar = nn.Parameter(self.logvar, requires_grad=True) + + + def register_schedule(self, given_betas=None, beta_schedule="linear", timesteps=1000, + linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3): + if exists(given_betas): + betas = given_betas + else: + betas = make_beta_schedule(beta_schedule, timesteps, linear_start=linear_start, linear_end=linear_end, + cosine_s=cosine_s) + alphas = 1. - betas + alphas_cumprod = np.cumprod(alphas, axis=0) + alphas_cumprod_prev = np.append(1., alphas_cumprod[:-1]) + + timesteps, = betas.shape + self.num_timesteps = int(timesteps) + self.linear_start = linear_start + self.linear_end = linear_end + assert alphas_cumprod.shape[0] == self.num_timesteps, 'alphas have to be defined for each timestep' + + to_torch = partial(torch.tensor, dtype=torch.float32) + + self.register_buffer('betas', to_torch(betas)) + self.register_buffer('alphas_cumprod', to_torch(alphas_cumprod)) + self.register_buffer('alphas_cumprod_prev', to_torch(alphas_cumprod_prev)) + + # calculations for diffusion q(x_t | x_{t-1}) and others + self.register_buffer('sqrt_alphas_cumprod', to_torch(np.sqrt(alphas_cumprod))) + self.register_buffer('sqrt_one_minus_alphas_cumprod', to_torch(np.sqrt(1. - alphas_cumprod))) + self.register_buffer('log_one_minus_alphas_cumprod', to_torch(np.log(1. - alphas_cumprod))) + self.register_buffer('sqrt_recip_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod))) + self.register_buffer('sqrt_recipm1_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod - 1))) + + # calculations for posterior q(x_{t-1} | x_t, x_0) + posterior_variance = (1 - self.v_posterior) * betas * (1. - alphas_cumprod_prev) / ( + 1. - alphas_cumprod) + self.v_posterior * betas + # above: equal to 1. / (1. / (1. - alpha_cumprod_tm1) + alpha_t / beta_t) + self.register_buffer('posterior_variance', to_torch(posterior_variance)) + # below: log calculation clipped because the posterior variance is 0 at the beginning of the diffusion chain + self.register_buffer('posterior_log_variance_clipped', to_torch(np.log(np.maximum(posterior_variance, 1e-20)))) + self.register_buffer('posterior_mean_coef1', to_torch( + betas * np.sqrt(alphas_cumprod_prev) / (1. - alphas_cumprod))) + self.register_buffer('posterior_mean_coef2', to_torch( + (1. - alphas_cumprod_prev) * np.sqrt(alphas) / (1. - alphas_cumprod))) + + if self.parameterization == "eps": + lvlb_weights = self.betas ** 2 / ( + 2 * self.posterior_variance * to_torch(alphas) * (1 - self.alphas_cumprod)) + elif self.parameterization == "x0": + lvlb_weights = 0.5 * np.sqrt(torch.Tensor(alphas_cumprod)) / (2. * 1 - torch.Tensor(alphas_cumprod)) + else: + raise NotImplementedError("mu not supported") + # TODO how to choose this term + lvlb_weights[0] = lvlb_weights[1] + self.register_buffer('lvlb_weights', lvlb_weights, persistent=False) + assert not torch.isnan(self.lvlb_weights).all() + + @contextmanager + def ema_scope(self, context=None): + if self.use_ema: + self.model_ema.store(self.model.parameters()) + self.model_ema.copy_to(self.model) + if context is not None: + print(f"{context}: Switched to EMA weights") + try: + yield None + finally: + if self.use_ema: + self.model_ema.restore(self.model.parameters()) + if context is not None: + print(f"{context}: Restored training weights") + + def init_from_ckpt(self, path, ignore_keys=None, only_model=False): + sd = torch.load(path, map_location="cpu") + if "state_dict" in list(sd.keys()): + sd = sd["state_dict"] + keys = list(sd.keys()) + for k in keys: + for ik in ignore_keys or []: + if k.startswith(ik): + print("Deleting key {} from state_dict.".format(k)) + del sd[k] + missing, unexpected = self.load_state_dict(sd, strict=False) if not only_model else self.model.load_state_dict( + sd, strict=False) + print(f"Restored from {path} with {len(missing)} missing and {len(unexpected)} unexpected keys") + if missing: + print(f"Missing Keys: {missing}") + if unexpected: + print(f"Unexpected Keys: {unexpected}") + + def q_mean_variance(self, x_start, t): + """ + Get the distribution q(x_t | x_0). + :param x_start: the [N x C x ...] tensor of noiseless inputs. + :param t: the number of diffusion steps (minus 1). Here, 0 means one step. + :return: A tuple (mean, variance, log_variance), all of x_start's shape. + """ + mean = (extract_into_tensor(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start) + variance = extract_into_tensor(1.0 - self.alphas_cumprod, t, x_start.shape) + log_variance = extract_into_tensor(self.log_one_minus_alphas_cumprod, t, x_start.shape) + return mean, variance, log_variance + + def predict_start_from_noise(self, x_t, t, noise): + return ( + extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t - + extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x_t.shape) * noise + ) + + def q_posterior(self, x_start, x_t, t): + posterior_mean = ( + extract_into_tensor(self.posterior_mean_coef1, t, x_t.shape) * x_start + + extract_into_tensor(self.posterior_mean_coef2, t, x_t.shape) * x_t + ) + posterior_variance = extract_into_tensor(self.posterior_variance, t, x_t.shape) + posterior_log_variance_clipped = extract_into_tensor(self.posterior_log_variance_clipped, t, x_t.shape) + return posterior_mean, posterior_variance, posterior_log_variance_clipped + + def p_mean_variance(self, x, t, clip_denoised: bool): + model_out = self.model(x, t) + if self.parameterization == "eps": + x_recon = self.predict_start_from_noise(x, t=t, noise=model_out) + elif self.parameterization == "x0": + x_recon = model_out + if clip_denoised: + x_recon.clamp_(-1., 1.) + + model_mean, posterior_variance, posterior_log_variance = self.q_posterior(x_start=x_recon, x_t=x, t=t) + return model_mean, posterior_variance, posterior_log_variance + + @torch.no_grad() + def p_sample(self, x, t, clip_denoised=True, repeat_noise=False): + b, *_, device = *x.shape, x.device + model_mean, _, model_log_variance = self.p_mean_variance(x=x, t=t, clip_denoised=clip_denoised) + noise = noise_like(x.shape, device, repeat_noise) + # no noise when t == 0 + nonzero_mask = (1 - (t == 0).float()).reshape(b, *((1,) * (len(x.shape) - 1))) + return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise + + @torch.no_grad() + def p_sample_loop(self, shape, return_intermediates=False): + device = self.betas.device + b = shape[0] + img = torch.randn(shape, device=device) + intermediates = [img] + for i in tqdm(reversed(range(0, self.num_timesteps)), desc='Sampling t', total=self.num_timesteps): + img = self.p_sample(img, torch.full((b,), i, device=device, dtype=torch.long), + clip_denoised=self.clip_denoised) + if i % self.log_every_t == 0 or i == self.num_timesteps - 1: + intermediates.append(img) + if return_intermediates: + return img, intermediates + return img + + @torch.no_grad() + def sample(self, batch_size=16, return_intermediates=False): + image_size = self.image_size + channels = self.channels + return self.p_sample_loop((batch_size, channels, image_size, image_size), + return_intermediates=return_intermediates) + + def q_sample(self, x_start, t, noise=None): + noise = default(noise, lambda: torch.randn_like(x_start)) + return (extract_into_tensor(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start + + extract_into_tensor(self.sqrt_one_minus_alphas_cumprod, t, x_start.shape) * noise) + + def get_loss(self, pred, target, mean=True): + if self.loss_type == 'l1': + loss = (target - pred).abs() + if mean: + loss = loss.mean() + elif self.loss_type == 'l2': + if mean: + loss = torch.nn.functional.mse_loss(target, pred) + else: + loss = torch.nn.functional.mse_loss(target, pred, reduction='none') + else: + raise NotImplementedError("unknown loss type '{loss_type}'") + + return loss + + def p_losses(self, x_start, t, noise=None): + noise = default(noise, lambda: torch.randn_like(x_start)) + x_noisy = self.q_sample(x_start=x_start, t=t, noise=noise) + model_out = self.model(x_noisy, t) + + loss_dict = {} + if self.parameterization == "eps": + target = noise + elif self.parameterization == "x0": + target = x_start + else: + raise NotImplementedError(f"Paramterization {self.parameterization} not yet supported") + + loss = self.get_loss(model_out, target, mean=False).mean(dim=[1, 2, 3]) + + log_prefix = 'train' if self.training else 'val' + + loss_dict.update({f'{log_prefix}/loss_simple': loss.mean()}) + loss_simple = loss.mean() * self.l_simple_weight + + loss_vlb = (self.lvlb_weights[t] * loss).mean() + loss_dict.update({f'{log_prefix}/loss_vlb': loss_vlb}) + + loss = loss_simple + self.original_elbo_weight * loss_vlb + + loss_dict.update({f'{log_prefix}/loss': loss}) + + return loss, loss_dict + + def forward(self, x, *args, **kwargs): + # b, c, h, w, device, img_size, = *x.shape, x.device, self.image_size + # assert h == img_size and w == img_size, f'height and width of image must be {img_size}' + t = torch.randint(0, self.num_timesteps, (x.shape[0],), device=self.device).long() + return self.p_losses(x, t, *args, **kwargs) + + def get_input(self, batch, k): + x = batch[k] + if len(x.shape) == 3: + x = x[..., None] + x = rearrange(x, 'b h w c -> b c h w') + x = x.to(memory_format=torch.contiguous_format).float() + return x + + def shared_step(self, batch): + x = self.get_input(batch, self.first_stage_key) + loss, loss_dict = self(x) + return loss, loss_dict + + def training_step(self, batch, batch_idx): + loss, loss_dict = self.shared_step(batch) + + self.log_dict(loss_dict, prog_bar=True, + logger=True, on_step=True, on_epoch=True) + + self.log("global_step", self.global_step, + prog_bar=True, logger=True, on_step=True, on_epoch=False) + + if self.use_scheduler: + lr = self.optimizers().param_groups[0]['lr'] + self.log('lr_abs', lr, prog_bar=True, logger=True, on_step=True, on_epoch=False) + + return loss + + @torch.no_grad() + def validation_step(self, batch, batch_idx): + _, loss_dict_no_ema = self.shared_step(batch) + with self.ema_scope(): + _, loss_dict_ema = self.shared_step(batch) + loss_dict_ema = {key + '_ema': loss_dict_ema[key] for key in loss_dict_ema} + self.log_dict(loss_dict_no_ema, prog_bar=False, logger=True, on_step=False, on_epoch=True) + self.log_dict(loss_dict_ema, prog_bar=False, logger=True, on_step=False, on_epoch=True) + + def on_train_batch_end(self, *args, **kwargs): + if self.use_ema: + self.model_ema(self.model) + + def _get_rows_from_list(self, samples): + n_imgs_per_row = len(samples) + denoise_grid = rearrange(samples, 'n b c h w -> b n c h w') + denoise_grid = rearrange(denoise_grid, 'b n c h w -> (b n) c h w') + denoise_grid = make_grid(denoise_grid, nrow=n_imgs_per_row) + return denoise_grid + + @torch.no_grad() + def log_images(self, batch, N=8, n_row=2, sample=True, return_keys=None, **kwargs): + log = {} + x = self.get_input(batch, self.first_stage_key) + N = min(x.shape[0], N) + n_row = min(x.shape[0], n_row) + x = x.to(self.device)[:N] + log["inputs"] = x + + # get diffusion row + diffusion_row = [] + x_start = x[:n_row] + + for t in range(self.num_timesteps): + if t % self.log_every_t == 0 or t == self.num_timesteps - 1: + t = repeat(torch.tensor([t]), '1 -> b', b=n_row) + t = t.to(self.device).long() + noise = torch.randn_like(x_start) + x_noisy = self.q_sample(x_start=x_start, t=t, noise=noise) + diffusion_row.append(x_noisy) + + log["diffusion_row"] = self._get_rows_from_list(diffusion_row) + + if sample: + # get denoise row + with self.ema_scope("Plotting"): + samples, denoise_row = self.sample(batch_size=N, return_intermediates=True) + + log["samples"] = samples + log["denoise_row"] = self._get_rows_from_list(denoise_row) + + if return_keys: + if np.intersect1d(list(log.keys()), return_keys).shape[0] == 0: + return log + else: + return {key: log[key] for key in return_keys} + return log + + def configure_optimizers(self): + lr = self.learning_rate + params = list(self.model.parameters()) + if self.learn_logvar: + params = params + [self.logvar] + opt = torch.optim.AdamW(params, lr=lr) + return opt + + +class LatentDiffusionV1(DDPMV1): + """main class""" + def __init__(self, + first_stage_config, + cond_stage_config, + num_timesteps_cond=None, + cond_stage_key="image", + cond_stage_trainable=False, + concat_mode=True, + cond_stage_forward=None, + conditioning_key=None, + scale_factor=1.0, + scale_by_std=False, + *args, **kwargs): + self.num_timesteps_cond = default(num_timesteps_cond, 1) + self.scale_by_std = scale_by_std + assert self.num_timesteps_cond <= kwargs['timesteps'] + # for backwards compatibility after implementation of DiffusionWrapper + if conditioning_key is None: + conditioning_key = 'concat' if concat_mode else 'crossattn' + if cond_stage_config == '__is_unconditional__': + conditioning_key = None + ckpt_path = kwargs.pop("ckpt_path", None) + ignore_keys = kwargs.pop("ignore_keys", []) + super().__init__(*args, conditioning_key=conditioning_key, **kwargs) + self.concat_mode = concat_mode + self.cond_stage_trainable = cond_stage_trainable + self.cond_stage_key = cond_stage_key + try: + self.num_downs = len(first_stage_config.params.ddconfig.ch_mult) - 1 + except Exception: + self.num_downs = 0 + if not scale_by_std: + self.scale_factor = scale_factor + else: + self.register_buffer('scale_factor', torch.tensor(scale_factor)) + self.instantiate_first_stage(first_stage_config) + self.instantiate_cond_stage(cond_stage_config) + self.cond_stage_forward = cond_stage_forward + self.clip_denoised = False + self.bbox_tokenizer = None + + self.restarted_from_ckpt = False + if ckpt_path is not None: + self.init_from_ckpt(ckpt_path, ignore_keys) + self.restarted_from_ckpt = True + + def make_cond_schedule(self, ): + self.cond_ids = torch.full(size=(self.num_timesteps,), fill_value=self.num_timesteps - 1, dtype=torch.long) + ids = torch.round(torch.linspace(0, self.num_timesteps - 1, self.num_timesteps_cond)).long() + self.cond_ids[:self.num_timesteps_cond] = ids + + @rank_zero_only + @torch.no_grad() + def on_train_batch_start(self, batch, batch_idx, dataloader_idx): + # only for very first batch + if self.scale_by_std and self.current_epoch == 0 and self.global_step == 0 and batch_idx == 0 and not self.restarted_from_ckpt: + assert self.scale_factor == 1., 'rather not use custom rescaling and std-rescaling simultaneously' + # set rescale weight to 1./std of encodings + print("### USING STD-RESCALING ###") + x = super().get_input(batch, self.first_stage_key) + x = x.to(self.device) + encoder_posterior = self.encode_first_stage(x) + z = self.get_first_stage_encoding(encoder_posterior).detach() + del self.scale_factor + self.register_buffer('scale_factor', 1. / z.flatten().std()) + print(f"setting self.scale_factor to {self.scale_factor}") + print("### USING STD-RESCALING ###") + + def register_schedule(self, + given_betas=None, beta_schedule="linear", timesteps=1000, + linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3): + super().register_schedule(given_betas, beta_schedule, timesteps, linear_start, linear_end, cosine_s) + + self.shorten_cond_schedule = self.num_timesteps_cond > 1 + if self.shorten_cond_schedule: + self.make_cond_schedule() + + def instantiate_first_stage(self, config): + model = instantiate_from_config(config) + self.first_stage_model = model.eval() + self.first_stage_model.train = disabled_train + for param in self.first_stage_model.parameters(): + param.requires_grad = False + + def instantiate_cond_stage(self, config): + if not self.cond_stage_trainable: + if config == "__is_first_stage__": + print("Using first stage also as cond stage.") + self.cond_stage_model = self.first_stage_model + elif config == "__is_unconditional__": + print(f"Training {self.__class__.__name__} as an unconditional model.") + self.cond_stage_model = None + # self.be_unconditional = True + else: + model = instantiate_from_config(config) + self.cond_stage_model = model.eval() + self.cond_stage_model.train = disabled_train + for param in self.cond_stage_model.parameters(): + param.requires_grad = False + else: + assert config != '__is_first_stage__' + assert config != '__is_unconditional__' + model = instantiate_from_config(config) + self.cond_stage_model = model + + def _get_denoise_row_from_list(self, samples, desc='', force_no_decoder_quantization=False): + denoise_row = [] + for zd in tqdm(samples, desc=desc): + denoise_row.append(self.decode_first_stage(zd.to(self.device), + force_not_quantize=force_no_decoder_quantization)) + n_imgs_per_row = len(denoise_row) + denoise_row = torch.stack(denoise_row) # n_log_step, n_row, C, H, W + denoise_grid = rearrange(denoise_row, 'n b c h w -> b n c h w') + denoise_grid = rearrange(denoise_grid, 'b n c h w -> (b n) c h w') + denoise_grid = make_grid(denoise_grid, nrow=n_imgs_per_row) + return denoise_grid + + def get_first_stage_encoding(self, encoder_posterior): + if isinstance(encoder_posterior, DiagonalGaussianDistribution): + z = encoder_posterior.sample() + elif isinstance(encoder_posterior, torch.Tensor): + z = encoder_posterior + else: + raise NotImplementedError(f"encoder_posterior of type '{type(encoder_posterior)}' not yet implemented") + return self.scale_factor * z + + def get_learned_conditioning(self, c): + if self.cond_stage_forward is None: + if hasattr(self.cond_stage_model, 'encode') and callable(self.cond_stage_model.encode): + c = self.cond_stage_model.encode(c) + if isinstance(c, DiagonalGaussianDistribution): + c = c.mode() + else: + c = self.cond_stage_model(c) + else: + assert hasattr(self.cond_stage_model, self.cond_stage_forward) + c = getattr(self.cond_stage_model, self.cond_stage_forward)(c) + return c + + def meshgrid(self, h, w): + y = torch.arange(0, h).view(h, 1, 1).repeat(1, w, 1) + x = torch.arange(0, w).view(1, w, 1).repeat(h, 1, 1) + + arr = torch.cat([y, x], dim=-1) + return arr + + def delta_border(self, h, w): + """ + :param h: height + :param w: width + :return: normalized distance to image border, + wtith min distance = 0 at border and max dist = 0.5 at image center + """ + lower_right_corner = torch.tensor([h - 1, w - 1]).view(1, 1, 2) + arr = self.meshgrid(h, w) / lower_right_corner + dist_left_up = torch.min(arr, dim=-1, keepdims=True)[0] + dist_right_down = torch.min(1 - arr, dim=-1, keepdims=True)[0] + edge_dist = torch.min(torch.cat([dist_left_up, dist_right_down], dim=-1), dim=-1)[0] + return edge_dist + + def get_weighting(self, h, w, Ly, Lx, device): + weighting = self.delta_border(h, w) + weighting = torch.clip(weighting, self.split_input_params["clip_min_weight"], + self.split_input_params["clip_max_weight"], ) + weighting = weighting.view(1, h * w, 1).repeat(1, 1, Ly * Lx).to(device) + + if self.split_input_params["tie_braker"]: + L_weighting = self.delta_border(Ly, Lx) + L_weighting = torch.clip(L_weighting, + self.split_input_params["clip_min_tie_weight"], + self.split_input_params["clip_max_tie_weight"]) + + L_weighting = L_weighting.view(1, 1, Ly * Lx).to(device) + weighting = weighting * L_weighting + return weighting + + def get_fold_unfold(self, x, kernel_size, stride, uf=1, df=1): # todo load once not every time, shorten code + """ + :param x: img of size (bs, c, h, w) + :return: n img crops of size (n, bs, c, kernel_size[0], kernel_size[1]) + """ + bs, nc, h, w = x.shape + + # number of crops in image + Ly = (h - kernel_size[0]) // stride[0] + 1 + Lx = (w - kernel_size[1]) // stride[1] + 1 + + if uf == 1 and df == 1: + fold_params = dict(kernel_size=kernel_size, dilation=1, padding=0, stride=stride) + unfold = torch.nn.Unfold(**fold_params) + + fold = torch.nn.Fold(output_size=x.shape[2:], **fold_params) + + weighting = self.get_weighting(kernel_size[0], kernel_size[1], Ly, Lx, x.device).to(x.dtype) + normalization = fold(weighting).view(1, 1, h, w) # normalizes the overlap + weighting = weighting.view((1, 1, kernel_size[0], kernel_size[1], Ly * Lx)) + + elif uf > 1 and df == 1: + fold_params = dict(kernel_size=kernel_size, dilation=1, padding=0, stride=stride) + unfold = torch.nn.Unfold(**fold_params) + + fold_params2 = dict(kernel_size=(kernel_size[0] * uf, kernel_size[0] * uf), + dilation=1, padding=0, + stride=(stride[0] * uf, stride[1] * uf)) + fold = torch.nn.Fold(output_size=(x.shape[2] * uf, x.shape[3] * uf), **fold_params2) + + weighting = self.get_weighting(kernel_size[0] * uf, kernel_size[1] * uf, Ly, Lx, x.device).to(x.dtype) + normalization = fold(weighting).view(1, 1, h * uf, w * uf) # normalizes the overlap + weighting = weighting.view((1, 1, kernel_size[0] * uf, kernel_size[1] * uf, Ly * Lx)) + + elif df > 1 and uf == 1: + fold_params = dict(kernel_size=kernel_size, dilation=1, padding=0, stride=stride) + unfold = torch.nn.Unfold(**fold_params) + + fold_params2 = dict(kernel_size=(kernel_size[0] // df, kernel_size[0] // df), + dilation=1, padding=0, + stride=(stride[0] // df, stride[1] // df)) + fold = torch.nn.Fold(output_size=(x.shape[2] // df, x.shape[3] // df), **fold_params2) + + weighting = self.get_weighting(kernel_size[0] // df, kernel_size[1] // df, Ly, Lx, x.device).to(x.dtype) + normalization = fold(weighting).view(1, 1, h // df, w // df) # normalizes the overlap + weighting = weighting.view((1, 1, kernel_size[0] // df, kernel_size[1] // df, Ly * Lx)) + + else: + raise NotImplementedError + + return fold, unfold, normalization, weighting + + @torch.no_grad() + def get_input(self, batch, k, return_first_stage_outputs=False, force_c_encode=False, + cond_key=None, return_original_cond=False, bs=None): + x = super().get_input(batch, k) + if bs is not None: + x = x[:bs] + x = x.to(self.device) + encoder_posterior = self.encode_first_stage(x) + z = self.get_first_stage_encoding(encoder_posterior).detach() + + if self.model.conditioning_key is not None: + if cond_key is None: + cond_key = self.cond_stage_key + if cond_key != self.first_stage_key: + if cond_key in ['caption', 'coordinates_bbox']: + xc = batch[cond_key] + elif cond_key == 'class_label': + xc = batch + else: + xc = super().get_input(batch, cond_key).to(self.device) + else: + xc = x + if not self.cond_stage_trainable or force_c_encode: + if isinstance(xc, dict) or isinstance(xc, list): + # import pudb; pudb.set_trace() + c = self.get_learned_conditioning(xc) + else: + c = self.get_learned_conditioning(xc.to(self.device)) + else: + c = xc + if bs is not None: + c = c[:bs] + + if self.use_positional_encodings: + pos_x, pos_y = self.compute_latent_shifts(batch) + ckey = __conditioning_keys__[self.model.conditioning_key] + c = {ckey: c, 'pos_x': pos_x, 'pos_y': pos_y} + + else: + c = None + xc = None + if self.use_positional_encodings: + pos_x, pos_y = self.compute_latent_shifts(batch) + c = {'pos_x': pos_x, 'pos_y': pos_y} + out = [z, c] + if return_first_stage_outputs: + xrec = self.decode_first_stage(z) + out.extend([x, xrec]) + if return_original_cond: + out.append(xc) + return out + + @torch.no_grad() + def decode_first_stage(self, z, predict_cids=False, force_not_quantize=False): + if predict_cids: + if z.dim() == 4: + z = torch.argmax(z.exp(), dim=1).long() + z = self.first_stage_model.quantize.get_codebook_entry(z, shape=None) + z = rearrange(z, 'b h w c -> b c h w').contiguous() + + z = 1. / self.scale_factor * z + + if hasattr(self, "split_input_params"): + if self.split_input_params["patch_distributed_vq"]: + ks = self.split_input_params["ks"] # eg. (128, 128) + stride = self.split_input_params["stride"] # eg. (64, 64) + uf = self.split_input_params["vqf"] + bs, nc, h, w = z.shape + if ks[0] > h or ks[1] > w: + ks = (min(ks[0], h), min(ks[1], w)) + print("reducing Kernel") + + if stride[0] > h or stride[1] > w: + stride = (min(stride[0], h), min(stride[1], w)) + print("reducing stride") + + fold, unfold, normalization, weighting = self.get_fold_unfold(z, ks, stride, uf=uf) + + z = unfold(z) # (bn, nc * prod(**ks), L) + # 1. Reshape to img shape + z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L ) + + # 2. apply model loop over last dim + if isinstance(self.first_stage_model, VQModelInterface): + output_list = [self.first_stage_model.decode(z[:, :, :, :, i], + force_not_quantize=predict_cids or force_not_quantize) + for i in range(z.shape[-1])] + else: + + output_list = [self.first_stage_model.decode(z[:, :, :, :, i]) + for i in range(z.shape[-1])] + + o = torch.stack(output_list, axis=-1) # # (bn, nc, ks[0], ks[1], L) + o = o * weighting + # Reverse 1. reshape to img shape + o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L) + # stitch crops together + decoded = fold(o) + decoded = decoded / normalization # norm is shape (1, 1, h, w) + return decoded + else: + if isinstance(self.first_stage_model, VQModelInterface): + return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize) + else: + return self.first_stage_model.decode(z) + + else: + if isinstance(self.first_stage_model, VQModelInterface): + return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize) + else: + return self.first_stage_model.decode(z) + + # same as above but without decorator + def differentiable_decode_first_stage(self, z, predict_cids=False, force_not_quantize=False): + if predict_cids: + if z.dim() == 4: + z = torch.argmax(z.exp(), dim=1).long() + z = self.first_stage_model.quantize.get_codebook_entry(z, shape=None) + z = rearrange(z, 'b h w c -> b c h w').contiguous() + + z = 1. / self.scale_factor * z + + if hasattr(self, "split_input_params"): + if self.split_input_params["patch_distributed_vq"]: + ks = self.split_input_params["ks"] # eg. (128, 128) + stride = self.split_input_params["stride"] # eg. (64, 64) + uf = self.split_input_params["vqf"] + bs, nc, h, w = z.shape + if ks[0] > h or ks[1] > w: + ks = (min(ks[0], h), min(ks[1], w)) + print("reducing Kernel") + + if stride[0] > h or stride[1] > w: + stride = (min(stride[0], h), min(stride[1], w)) + print("reducing stride") + + fold, unfold, normalization, weighting = self.get_fold_unfold(z, ks, stride, uf=uf) + + z = unfold(z) # (bn, nc * prod(**ks), L) + # 1. Reshape to img shape + z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L ) + + # 2. apply model loop over last dim + if isinstance(self.first_stage_model, VQModelInterface): + output_list = [self.first_stage_model.decode(z[:, :, :, :, i], + force_not_quantize=predict_cids or force_not_quantize) + for i in range(z.shape[-1])] + else: + + output_list = [self.first_stage_model.decode(z[:, :, :, :, i]) + for i in range(z.shape[-1])] + + o = torch.stack(output_list, axis=-1) # # (bn, nc, ks[0], ks[1], L) + o = o * weighting + # Reverse 1. reshape to img shape + o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L) + # stitch crops together + decoded = fold(o) + decoded = decoded / normalization # norm is shape (1, 1, h, w) + return decoded + else: + if isinstance(self.first_stage_model, VQModelInterface): + return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize) + else: + return self.first_stage_model.decode(z) + + else: + if isinstance(self.first_stage_model, VQModelInterface): + return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize) + else: + return self.first_stage_model.decode(z) + + @torch.no_grad() + def encode_first_stage(self, x): + if hasattr(self, "split_input_params"): + if self.split_input_params["patch_distributed_vq"]: + ks = self.split_input_params["ks"] # eg. (128, 128) + stride = self.split_input_params["stride"] # eg. (64, 64) + df = self.split_input_params["vqf"] + self.split_input_params['original_image_size'] = x.shape[-2:] + bs, nc, h, w = x.shape + if ks[0] > h or ks[1] > w: + ks = (min(ks[0], h), min(ks[1], w)) + print("reducing Kernel") + + if stride[0] > h or stride[1] > w: + stride = (min(stride[0], h), min(stride[1], w)) + print("reducing stride") + + fold, unfold, normalization, weighting = self.get_fold_unfold(x, ks, stride, df=df) + z = unfold(x) # (bn, nc * prod(**ks), L) + # Reshape to img shape + z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L ) + + output_list = [self.first_stage_model.encode(z[:, :, :, :, i]) + for i in range(z.shape[-1])] + + o = torch.stack(output_list, axis=-1) + o = o * weighting + + # Reverse reshape to img shape + o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L) + # stitch crops together + decoded = fold(o) + decoded = decoded / normalization + return decoded + + else: + return self.first_stage_model.encode(x) + else: + return self.first_stage_model.encode(x) + + def shared_step(self, batch, **kwargs): + x, c = self.get_input(batch, self.first_stage_key) + loss = self(x, c) + return loss + + def forward(self, x, c, *args, **kwargs): + t = torch.randint(0, self.num_timesteps, (x.shape[0],), device=self.device).long() + if self.model.conditioning_key is not None: + assert c is not None + if self.cond_stage_trainable: + c = self.get_learned_conditioning(c) + if self.shorten_cond_schedule: # TODO: drop this option + tc = self.cond_ids[t].to(self.device) + c = self.q_sample(x_start=c, t=tc, noise=torch.randn_like(c.float())) + return self.p_losses(x, c, t, *args, **kwargs) + + def apply_model(self, x_noisy, t, cond, return_ids=False): + + if isinstance(cond, dict): + # hybrid case, cond is exptected to be a dict + pass + else: + if not isinstance(cond, list): + cond = [cond] + key = 'c_concat' if self.model.conditioning_key == 'concat' else 'c_crossattn' + cond = {key: cond} + + if hasattr(self, "split_input_params"): + assert len(cond) == 1 # todo can only deal with one conditioning atm + assert not return_ids + ks = self.split_input_params["ks"] # eg. (128, 128) + stride = self.split_input_params["stride"] # eg. (64, 64) + + h, w = x_noisy.shape[-2:] + + fold, unfold, normalization, weighting = self.get_fold_unfold(x_noisy, ks, stride) + + z = unfold(x_noisy) # (bn, nc * prod(**ks), L) + # Reshape to img shape + z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L ) + z_list = [z[:, :, :, :, i] for i in range(z.shape[-1])] + + if self.cond_stage_key in ["image", "LR_image", "segmentation", + 'bbox_img'] and self.model.conditioning_key: # todo check for completeness + c_key = next(iter(cond.keys())) # get key + c = next(iter(cond.values())) # get value + assert (len(c) == 1) # todo extend to list with more than one elem + c = c[0] # get element + + c = unfold(c) + c = c.view((c.shape[0], -1, ks[0], ks[1], c.shape[-1])) # (bn, nc, ks[0], ks[1], L ) + + cond_list = [{c_key: [c[:, :, :, :, i]]} for i in range(c.shape[-1])] + + elif self.cond_stage_key == 'coordinates_bbox': + assert 'original_image_size' in self.split_input_params, 'BoudingBoxRescaling is missing original_image_size' + + # assuming padding of unfold is always 0 and its dilation is always 1 + n_patches_per_row = int((w - ks[0]) / stride[0] + 1) + full_img_h, full_img_w = self.split_input_params['original_image_size'] + # as we are operating on latents, we need the factor from the original image size to the + # spatial latent size to properly rescale the crops for regenerating the bbox annotations + num_downs = self.first_stage_model.encoder.num_resolutions - 1 + rescale_latent = 2 ** (num_downs) + + # get top left postions of patches as conforming for the bbbox tokenizer, therefore we + # need to rescale the tl patch coordinates to be in between (0,1) + tl_patch_coordinates = [(rescale_latent * stride[0] * (patch_nr % n_patches_per_row) / full_img_w, + rescale_latent * stride[1] * (patch_nr // n_patches_per_row) / full_img_h) + for patch_nr in range(z.shape[-1])] + + # patch_limits are tl_coord, width and height coordinates as (x_tl, y_tl, h, w) + patch_limits = [(x_tl, y_tl, + rescale_latent * ks[0] / full_img_w, + rescale_latent * ks[1] / full_img_h) for x_tl, y_tl in tl_patch_coordinates] + # patch_values = [(np.arange(x_tl,min(x_tl+ks, 1.)),np.arange(y_tl,min(y_tl+ks, 1.))) for x_tl, y_tl in tl_patch_coordinates] + + # tokenize crop coordinates for the bounding boxes of the respective patches + patch_limits_tknzd = [torch.LongTensor(self.bbox_tokenizer._crop_encoder(bbox))[None].to(self.device) + for bbox in patch_limits] # list of length l with tensors of shape (1, 2) + print(patch_limits_tknzd[0].shape) + # cut tknzd crop position from conditioning + assert isinstance(cond, dict), 'cond must be dict to be fed into model' + cut_cond = cond['c_crossattn'][0][..., :-2].to(self.device) + print(cut_cond.shape) + + adapted_cond = torch.stack([torch.cat([cut_cond, p], dim=1) for p in patch_limits_tknzd]) + adapted_cond = rearrange(adapted_cond, 'l b n -> (l b) n') + print(adapted_cond.shape) + adapted_cond = self.get_learned_conditioning(adapted_cond) + print(adapted_cond.shape) + adapted_cond = rearrange(adapted_cond, '(l b) n d -> l b n d', l=z.shape[-1]) + print(adapted_cond.shape) + + cond_list = [{'c_crossattn': [e]} for e in adapted_cond] + + else: + cond_list = [cond for i in range(z.shape[-1])] # Todo make this more efficient + + # apply model by loop over crops + output_list = [self.model(z_list[i], t, **cond_list[i]) for i in range(z.shape[-1])] + assert not isinstance(output_list[0], + tuple) # todo cant deal with multiple model outputs check this never happens + + o = torch.stack(output_list, axis=-1) + o = o * weighting + # Reverse reshape to img shape + o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L) + # stitch crops together + x_recon = fold(o) / normalization + + else: + x_recon = self.model(x_noisy, t, **cond) + + if isinstance(x_recon, tuple) and not return_ids: + return x_recon[0] + else: + return x_recon + + def _predict_eps_from_xstart(self, x_t, t, pred_xstart): + return (extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t - pred_xstart) / \ + extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x_t.shape) + + def _prior_bpd(self, x_start): + """ + Get the prior KL term for the variational lower-bound, measured in + bits-per-dim. + This term can't be optimized, as it only depends on the encoder. + :param x_start: the [N x C x ...] tensor of inputs. + :return: a batch of [N] KL values (in bits), one per batch element. + """ + batch_size = x_start.shape[0] + t = torch.tensor([self.num_timesteps - 1] * batch_size, device=x_start.device) + qt_mean, _, qt_log_variance = self.q_mean_variance(x_start, t) + kl_prior = normal_kl(mean1=qt_mean, logvar1=qt_log_variance, mean2=0.0, logvar2=0.0) + return mean_flat(kl_prior) / np.log(2.0) + + def p_losses(self, x_start, cond, t, noise=None): + noise = default(noise, lambda: torch.randn_like(x_start)) + x_noisy = self.q_sample(x_start=x_start, t=t, noise=noise) + model_output = self.apply_model(x_noisy, t, cond) + + loss_dict = {} + prefix = 'train' if self.training else 'val' + + if self.parameterization == "x0": + target = x_start + elif self.parameterization == "eps": + target = noise + else: + raise NotImplementedError() + + loss_simple = self.get_loss(model_output, target, mean=False).mean([1, 2, 3]) + loss_dict.update({f'{prefix}/loss_simple': loss_simple.mean()}) + + logvar_t = self.logvar[t].to(self.device) + loss = loss_simple / torch.exp(logvar_t) + logvar_t + # loss = loss_simple / torch.exp(self.logvar) + self.logvar + if self.learn_logvar: + loss_dict.update({f'{prefix}/loss_gamma': loss.mean()}) + loss_dict.update({'logvar': self.logvar.data.mean()}) + + loss = self.l_simple_weight * loss.mean() + + loss_vlb = self.get_loss(model_output, target, mean=False).mean(dim=(1, 2, 3)) + loss_vlb = (self.lvlb_weights[t] * loss_vlb).mean() + loss_dict.update({f'{prefix}/loss_vlb': loss_vlb}) + loss += (self.original_elbo_weight * loss_vlb) + loss_dict.update({f'{prefix}/loss': loss}) + + return loss, loss_dict + + def p_mean_variance(self, x, c, t, clip_denoised: bool, return_codebook_ids=False, quantize_denoised=False, + return_x0=False, score_corrector=None, corrector_kwargs=None): + t_in = t + model_out = self.apply_model(x, t_in, c, return_ids=return_codebook_ids) + + if score_corrector is not None: + assert self.parameterization == "eps" + model_out = score_corrector.modify_score(self, model_out, x, t, c, **corrector_kwargs) + + if return_codebook_ids: + model_out, logits = model_out + + if self.parameterization == "eps": + x_recon = self.predict_start_from_noise(x, t=t, noise=model_out) + elif self.parameterization == "x0": + x_recon = model_out + else: + raise NotImplementedError() + + if clip_denoised: + x_recon.clamp_(-1., 1.) + if quantize_denoised: + x_recon, _, [_, _, indices] = self.first_stage_model.quantize(x_recon) + model_mean, posterior_variance, posterior_log_variance = self.q_posterior(x_start=x_recon, x_t=x, t=t) + if return_codebook_ids: + return model_mean, posterior_variance, posterior_log_variance, logits + elif return_x0: + return model_mean, posterior_variance, posterior_log_variance, x_recon + else: + return model_mean, posterior_variance, posterior_log_variance + + @torch.no_grad() + def p_sample(self, x, c, t, clip_denoised=False, repeat_noise=False, + return_codebook_ids=False, quantize_denoised=False, return_x0=False, + temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None): + b, *_, device = *x.shape, x.device + outputs = self.p_mean_variance(x=x, c=c, t=t, clip_denoised=clip_denoised, + return_codebook_ids=return_codebook_ids, + quantize_denoised=quantize_denoised, + return_x0=return_x0, + score_corrector=score_corrector, corrector_kwargs=corrector_kwargs) + if return_codebook_ids: + raise DeprecationWarning("Support dropped.") + model_mean, _, model_log_variance, logits = outputs + elif return_x0: + model_mean, _, model_log_variance, x0 = outputs + else: + model_mean, _, model_log_variance = outputs + + noise = noise_like(x.shape, device, repeat_noise) * temperature + if noise_dropout > 0.: + noise = torch.nn.functional.dropout(noise, p=noise_dropout) + # no noise when t == 0 + nonzero_mask = (1 - (t == 0).float()).reshape(b, *((1,) * (len(x.shape) - 1))) + + if return_codebook_ids: + return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise, logits.argmax(dim=1) + if return_x0: + return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise, x0 + else: + return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise + + @torch.no_grad() + def progressive_denoising(self, cond, shape, verbose=True, callback=None, quantize_denoised=False, + img_callback=None, mask=None, x0=None, temperature=1., noise_dropout=0., + score_corrector=None, corrector_kwargs=None, batch_size=None, x_T=None, start_T=None, + log_every_t=None): + if not log_every_t: + log_every_t = self.log_every_t + timesteps = self.num_timesteps + if batch_size is not None: + b = batch_size if batch_size is not None else shape[0] + shape = [batch_size] + list(shape) + else: + b = batch_size = shape[0] + if x_T is None: + img = torch.randn(shape, device=self.device) + else: + img = x_T + intermediates = [] + if cond is not None: + if isinstance(cond, dict): + cond = {key: cond[key][:batch_size] if not isinstance(cond[key], list) else + [x[:batch_size] for x in cond[key]] for key in cond} + else: + cond = [c[:batch_size] for c in cond] if isinstance(cond, list) else cond[:batch_size] + + if start_T is not None: + timesteps = min(timesteps, start_T) + iterator = tqdm(reversed(range(0, timesteps)), desc='Progressive Generation', + total=timesteps) if verbose else reversed( + range(0, timesteps)) + if type(temperature) == float: + temperature = [temperature] * timesteps + + for i in iterator: + ts = torch.full((b,), i, device=self.device, dtype=torch.long) + if self.shorten_cond_schedule: + assert self.model.conditioning_key != 'hybrid' + tc = self.cond_ids[ts].to(cond.device) + cond = self.q_sample(x_start=cond, t=tc, noise=torch.randn_like(cond)) + + img, x0_partial = self.p_sample(img, cond, ts, + clip_denoised=self.clip_denoised, + quantize_denoised=quantize_denoised, return_x0=True, + temperature=temperature[i], noise_dropout=noise_dropout, + score_corrector=score_corrector, corrector_kwargs=corrector_kwargs) + if mask is not None: + assert x0 is not None + img_orig = self.q_sample(x0, ts) + img = img_orig * mask + (1. - mask) * img + + if i % log_every_t == 0 or i == timesteps - 1: + intermediates.append(x0_partial) + if callback: + callback(i) + if img_callback: + img_callback(img, i) + return img, intermediates + + @torch.no_grad() + def p_sample_loop(self, cond, shape, return_intermediates=False, + x_T=None, verbose=True, callback=None, timesteps=None, quantize_denoised=False, + mask=None, x0=None, img_callback=None, start_T=None, + log_every_t=None): + + if not log_every_t: + log_every_t = self.log_every_t + device = self.betas.device + b = shape[0] + if x_T is None: + img = torch.randn(shape, device=device) + else: + img = x_T + + intermediates = [img] + if timesteps is None: + timesteps = self.num_timesteps + + if start_T is not None: + timesteps = min(timesteps, start_T) + iterator = tqdm(reversed(range(0, timesteps)), desc='Sampling t', total=timesteps) if verbose else reversed( + range(0, timesteps)) + + if mask is not None: + assert x0 is not None + assert x0.shape[2:3] == mask.shape[2:3] # spatial size has to match + + for i in iterator: + ts = torch.full((b,), i, device=device, dtype=torch.long) + if self.shorten_cond_schedule: + assert self.model.conditioning_key != 'hybrid' + tc = self.cond_ids[ts].to(cond.device) + cond = self.q_sample(x_start=cond, t=tc, noise=torch.randn_like(cond)) + + img = self.p_sample(img, cond, ts, + clip_denoised=self.clip_denoised, + quantize_denoised=quantize_denoised) + if mask is not None: + img_orig = self.q_sample(x0, ts) + img = img_orig * mask + (1. - mask) * img + + if i % log_every_t == 0 or i == timesteps - 1: + intermediates.append(img) + if callback: + callback(i) + if img_callback: + img_callback(img, i) + + if return_intermediates: + return img, intermediates + return img + + @torch.no_grad() + def sample(self, cond, batch_size=16, return_intermediates=False, x_T=None, + verbose=True, timesteps=None, quantize_denoised=False, + mask=None, x0=None, shape=None,**kwargs): + if shape is None: + shape = (batch_size, self.channels, self.image_size, self.image_size) + if cond is not None: + if isinstance(cond, dict): + cond = {key: cond[key][:batch_size] if not isinstance(cond[key], list) else + [x[:batch_size] for x in cond[key]] for key in cond} + else: + cond = [c[:batch_size] for c in cond] if isinstance(cond, list) else cond[:batch_size] + return self.p_sample_loop(cond, + shape, + return_intermediates=return_intermediates, x_T=x_T, + verbose=verbose, timesteps=timesteps, quantize_denoised=quantize_denoised, + mask=mask, x0=x0) + + @torch.no_grad() + def sample_log(self,cond,batch_size,ddim, ddim_steps,**kwargs): + + if ddim: + ddim_sampler = DDIMSampler(self) + shape = (self.channels, self.image_size, self.image_size) + samples, intermediates =ddim_sampler.sample(ddim_steps,batch_size, + shape,cond,verbose=False,**kwargs) + + else: + samples, intermediates = self.sample(cond=cond, batch_size=batch_size, + return_intermediates=True,**kwargs) + + return samples, intermediates + + + @torch.no_grad() + def log_images(self, batch, N=8, n_row=4, sample=True, ddim_steps=200, ddim_eta=1., return_keys=None, + quantize_denoised=True, inpaint=True, plot_denoise_rows=False, plot_progressive_rows=True, + plot_diffusion_rows=True, **kwargs): + + use_ddim = ddim_steps is not None + + log = {} + z, c, x, xrec, xc = self.get_input(batch, self.first_stage_key, + return_first_stage_outputs=True, + force_c_encode=True, + return_original_cond=True, + bs=N) + N = min(x.shape[0], N) + n_row = min(x.shape[0], n_row) + log["inputs"] = x + log["reconstruction"] = xrec + if self.model.conditioning_key is not None: + if hasattr(self.cond_stage_model, "decode"): + xc = self.cond_stage_model.decode(c) + log["conditioning"] = xc + elif self.cond_stage_key in ["caption"]: + xc = log_txt_as_img((x.shape[2], x.shape[3]), batch["caption"]) + log["conditioning"] = xc + elif self.cond_stage_key == 'class_label': + xc = log_txt_as_img((x.shape[2], x.shape[3]), batch["human_label"]) + log['conditioning'] = xc + elif isimage(xc): + log["conditioning"] = xc + if ismap(xc): + log["original_conditioning"] = self.to_rgb(xc) + + if plot_diffusion_rows: + # get diffusion row + diffusion_row = [] + z_start = z[:n_row] + for t in range(self.num_timesteps): + if t % self.log_every_t == 0 or t == self.num_timesteps - 1: + t = repeat(torch.tensor([t]), '1 -> b', b=n_row) + t = t.to(self.device).long() + noise = torch.randn_like(z_start) + z_noisy = self.q_sample(x_start=z_start, t=t, noise=noise) + diffusion_row.append(self.decode_first_stage(z_noisy)) + + diffusion_row = torch.stack(diffusion_row) # n_log_step, n_row, C, H, W + diffusion_grid = rearrange(diffusion_row, 'n b c h w -> b n c h w') + diffusion_grid = rearrange(diffusion_grid, 'b n c h w -> (b n) c h w') + diffusion_grid = make_grid(diffusion_grid, nrow=diffusion_row.shape[0]) + log["diffusion_row"] = diffusion_grid + + if sample: + # get denoise row + with self.ema_scope("Plotting"): + samples, z_denoise_row = self.sample_log(cond=c,batch_size=N,ddim=use_ddim, + ddim_steps=ddim_steps,eta=ddim_eta) + # samples, z_denoise_row = self.sample(cond=c, batch_size=N, return_intermediates=True) + x_samples = self.decode_first_stage(samples) + log["samples"] = x_samples + if plot_denoise_rows: + denoise_grid = self._get_denoise_row_from_list(z_denoise_row) + log["denoise_row"] = denoise_grid + + if quantize_denoised and not isinstance(self.first_stage_model, AutoencoderKL) and not isinstance( + self.first_stage_model, IdentityFirstStage): + # also display when quantizing x0 while sampling + with self.ema_scope("Plotting Quantized Denoised"): + samples, z_denoise_row = self.sample_log(cond=c,batch_size=N,ddim=use_ddim, + ddim_steps=ddim_steps,eta=ddim_eta, + quantize_denoised=True) + # samples, z_denoise_row = self.sample(cond=c, batch_size=N, return_intermediates=True, + # quantize_denoised=True) + x_samples = self.decode_first_stage(samples.to(self.device)) + log["samples_x0_quantized"] = x_samples + + if inpaint: + # make a simple center square + h, w = z.shape[2], z.shape[3] + mask = torch.ones(N, h, w).to(self.device) + # zeros will be filled in + mask[:, h // 4:3 * h // 4, w // 4:3 * w // 4] = 0. + mask = mask[:, None, ...] + with self.ema_scope("Plotting Inpaint"): + + samples, _ = self.sample_log(cond=c,batch_size=N,ddim=use_ddim, eta=ddim_eta, + ddim_steps=ddim_steps, x0=z[:N], mask=mask) + x_samples = self.decode_first_stage(samples.to(self.device)) + log["samples_inpainting"] = x_samples + log["mask"] = mask + + # outpaint + with self.ema_scope("Plotting Outpaint"): + samples, _ = self.sample_log(cond=c, batch_size=N, ddim=use_ddim,eta=ddim_eta, + ddim_steps=ddim_steps, x0=z[:N], mask=mask) + x_samples = self.decode_first_stage(samples.to(self.device)) + log["samples_outpainting"] = x_samples + + if plot_progressive_rows: + with self.ema_scope("Plotting Progressives"): + img, progressives = self.progressive_denoising(c, + shape=(self.channels, self.image_size, self.image_size), + batch_size=N) + prog_row = self._get_denoise_row_from_list(progressives, desc="Progressive Generation") + log["progressive_row"] = prog_row + + if return_keys: + if np.intersect1d(list(log.keys()), return_keys).shape[0] == 0: + return log + else: + return {key: log[key] for key in return_keys} + return log + + def configure_optimizers(self): + lr = self.learning_rate + params = list(self.model.parameters()) + if self.cond_stage_trainable: + print(f"{self.__class__.__name__}: Also optimizing conditioner params!") + params = params + list(self.cond_stage_model.parameters()) + if self.learn_logvar: + print('Diffusion model optimizing logvar') + params.append(self.logvar) + opt = torch.optim.AdamW(params, lr=lr) + if self.use_scheduler: + assert 'target' in self.scheduler_config + scheduler = instantiate_from_config(self.scheduler_config) + + print("Setting up LambdaLR scheduler...") + scheduler = [ + { + 'scheduler': LambdaLR(opt, lr_lambda=scheduler.schedule), + 'interval': 'step', + 'frequency': 1 + }] + return [opt], scheduler + return opt + + @torch.no_grad() + def to_rgb(self, x): + x = x.float() + if not hasattr(self, "colorize"): + self.colorize = torch.randn(3, x.shape[1], 1, 1).to(x) + x = nn.functional.conv2d(x, weight=self.colorize) + x = 2. * (x - x.min()) / (x.max() - x.min()) - 1. + return x + + +class DiffusionWrapperV1(pl.LightningModule): + def __init__(self, diff_model_config, conditioning_key): + super().__init__() + self.diffusion_model = instantiate_from_config(diff_model_config) + self.conditioning_key = conditioning_key + assert self.conditioning_key in [None, 'concat', 'crossattn', 'hybrid', 'adm'] + + def forward(self, x, t, c_concat: list = None, c_crossattn: list = None): + if self.conditioning_key is None: + out = self.diffusion_model(x, t) + elif self.conditioning_key == 'concat': + xc = torch.cat([x] + c_concat, dim=1) + out = self.diffusion_model(xc, t) + elif self.conditioning_key == 'crossattn': + cc = torch.cat(c_crossattn, 1) + out = self.diffusion_model(x, t, context=cc) + elif self.conditioning_key == 'hybrid': + xc = torch.cat([x] + c_concat, dim=1) + cc = torch.cat(c_crossattn, 1) + out = self.diffusion_model(xc, t, context=cc) + elif self.conditioning_key == 'adm': + cc = c_crossattn[0] + out = self.diffusion_model(x, t, y=cc) + else: + raise NotImplementedError() + + return out + + +class Layout2ImgDiffusionV1(LatentDiffusionV1): + # TODO: move all layout-specific hacks to this class + def __init__(self, cond_stage_key, *args, **kwargs): + assert cond_stage_key == 'coordinates_bbox', 'Layout2ImgDiffusion only for cond_stage_key="coordinates_bbox"' + super().__init__(*args, cond_stage_key=cond_stage_key, **kwargs) + + def log_images(self, batch, N=8, *args, **kwargs): + logs = super().log_images(*args, batch=batch, N=N, **kwargs) + + key = 'train' if self.training else 'validation' + dset = self.trainer.datamodule.datasets[key] + mapper = dset.conditional_builders[self.cond_stage_key] + + bbox_imgs = [] + map_fn = lambda catno: dset.get_textual_label(dset.get_category_id(catno)) + for tknzd_bbox in batch[self.cond_stage_key][:N]: + bboximg = mapper.plot(tknzd_bbox.detach().cpu(), map_fn, (256, 256)) + bbox_imgs.append(bboximg) + + cond_img = torch.stack(bbox_imgs, dim=0) + logs['bbox_image'] = cond_img + return logs + +ldm.models.diffusion.ddpm.DDPMV1 = DDPMV1 +ldm.models.diffusion.ddpm.LatentDiffusionV1 = LatentDiffusionV1 +ldm.models.diffusion.ddpm.DiffusionWrapperV1 = DiffusionWrapperV1 +ldm.models.diffusion.ddpm.Layout2ImgDiffusionV1 = Layout2ImgDiffusionV1 diff --git a/stable-diffusion-webui/extensions-builtin/LDSR/vqvae_quantize.py b/stable-diffusion-webui/extensions-builtin/LDSR/vqvae_quantize.py new file mode 100644 index 0000000000000000000000000000000000000000..dd14b8fda5ce25a8cea8b70eb1d387b9c46c80d8 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/LDSR/vqvae_quantize.py @@ -0,0 +1,147 @@ +# Vendored from https://raw.githubusercontent.com/CompVis/taming-transformers/24268930bf1dce879235a7fddd0b2355b84d7ea6/taming/modules/vqvae/quantize.py, +# where the license is as follows: +# +# Copyright (c) 2020 Patrick Esser and Robin Rombach and Bjรถrn Ommer +# +# 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./ + +import torch +import torch.nn as nn +import numpy as np +from einops import rearrange + + +class VectorQuantizer2(nn.Module): + """ + Improved version over VectorQuantizer, can be used as a drop-in replacement. Mostly + avoids costly matrix multiplications and allows for post-hoc remapping of indices. + """ + + # NOTE: due to a bug the beta term was applied to the wrong term. for + # backwards compatibility we use the buggy version by default, but you can + # specify legacy=False to fix it. + def __init__(self, n_e, e_dim, beta, remap=None, unknown_index="random", + sane_index_shape=False, legacy=True): + super().__init__() + self.n_e = n_e + self.e_dim = e_dim + self.beta = beta + self.legacy = legacy + + self.embedding = nn.Embedding(self.n_e, self.e_dim) + self.embedding.weight.data.uniform_(-1.0 / self.n_e, 1.0 / self.n_e) + + self.remap = remap + if self.remap is not None: + self.register_buffer("used", torch.tensor(np.load(self.remap))) + self.re_embed = self.used.shape[0] + self.unknown_index = unknown_index # "random" or "extra" or integer + if self.unknown_index == "extra": + self.unknown_index = self.re_embed + self.re_embed = self.re_embed + 1 + print(f"Remapping {self.n_e} indices to {self.re_embed} indices. " + f"Using {self.unknown_index} for unknown indices.") + else: + self.re_embed = n_e + + self.sane_index_shape = sane_index_shape + + def remap_to_used(self, inds): + ishape = inds.shape + assert len(ishape) > 1 + inds = inds.reshape(ishape[0], -1) + used = self.used.to(inds) + match = (inds[:, :, None] == used[None, None, ...]).long() + new = match.argmax(-1) + unknown = match.sum(2) < 1 + if self.unknown_index == "random": + new[unknown] = torch.randint(0, self.re_embed, size=new[unknown].shape).to(device=new.device) + else: + new[unknown] = self.unknown_index + return new.reshape(ishape) + + def unmap_to_all(self, inds): + ishape = inds.shape + assert len(ishape) > 1 + inds = inds.reshape(ishape[0], -1) + used = self.used.to(inds) + if self.re_embed > self.used.shape[0]: # extra token + inds[inds >= self.used.shape[0]] = 0 # simply set to zero + back = torch.gather(used[None, :][inds.shape[0] * [0], :], 1, inds) + return back.reshape(ishape) + + def forward(self, z, temp=None, rescale_logits=False, return_logits=False): + assert temp is None or temp == 1.0, "Only for interface compatible with Gumbel" + assert rescale_logits is False, "Only for interface compatible with Gumbel" + assert return_logits is False, "Only for interface compatible with Gumbel" + # reshape z -> (batch, height, width, channel) and flatten + z = rearrange(z, 'b c h w -> b h w c').contiguous() + z_flattened = z.view(-1, self.e_dim) + # distances from z to embeddings e_j (z - e)^2 = z^2 + e^2 - 2 e * z + + d = torch.sum(z_flattened ** 2, dim=1, keepdim=True) + \ + torch.sum(self.embedding.weight ** 2, dim=1) - 2 * \ + torch.einsum('bd,dn->bn', z_flattened, rearrange(self.embedding.weight, 'n d -> d n')) + + min_encoding_indices = torch.argmin(d, dim=1) + z_q = self.embedding(min_encoding_indices).view(z.shape) + perplexity = None + min_encodings = None + + # compute loss for embedding + if not self.legacy: + loss = self.beta * torch.mean((z_q.detach() - z) ** 2) + \ + torch.mean((z_q - z.detach()) ** 2) + else: + loss = torch.mean((z_q.detach() - z) ** 2) + self.beta * \ + torch.mean((z_q - z.detach()) ** 2) + + # preserve gradients + z_q = z + (z_q - z).detach() + + # reshape back to match original input shape + z_q = rearrange(z_q, 'b h w c -> b c h w').contiguous() + + if self.remap is not None: + min_encoding_indices = min_encoding_indices.reshape(z.shape[0], -1) # add batch axis + min_encoding_indices = self.remap_to_used(min_encoding_indices) + min_encoding_indices = min_encoding_indices.reshape(-1, 1) # flatten + + if self.sane_index_shape: + min_encoding_indices = min_encoding_indices.reshape( + z_q.shape[0], z_q.shape[2], z_q.shape[3]) + + return z_q, loss, (perplexity, min_encodings, min_encoding_indices) + + def get_codebook_entry(self, indices, shape): + # shape specifying (batch, height, width, channel) + if self.remap is not None: + indices = indices.reshape(shape[0], -1) # add batch axis + indices = self.unmap_to_all(indices) + indices = indices.reshape(-1) # flatten again + + # get quantized latent vectors + z_q = self.embedding(indices) + + if shape is not None: + z_q = z_q.view(shape) + # reshape back to match original input shape + z_q = z_q.permute(0, 3, 1, 2).contiguous() + + return z_q diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/extra_networks_lora.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/extra_networks_lora.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80c91c9930841fbd35cc6f1817f837702720c3cc Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/extra_networks_lora.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5221dd2d15bef64c37d829761cc5602abae6b0a7 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora_logger.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora_logger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90eba46de31c48a728b8ed03e3ab3c98f2ed50c6 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora_logger.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora_patches.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora_patches.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acd60af0e4da21c574e1da095ce33ea7ffd73814 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lora_patches.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lyco_helpers.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lyco_helpers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab304b2afa627ef48e46c711a04f9c83fb3c2a2f Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/lyco_helpers.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c884989e321f66a027b2e794b288d739612bd521 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_full.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_full.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f338cf983881b147c235dc0cfb110cf64a90d3a8 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_full.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_glora.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_glora.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7413126b9091aa73b1ebe222cdaf323be66b8d23 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_glora.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_hada.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_hada.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2178e33bdeaf1d262ac9e4af9fa1f24393ce0d6 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_hada.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_ia3.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_ia3.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db12edbc4c2d879d0adaaaa9775e4febad9e57b6 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_ia3.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_lokr.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_lokr.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82756d05c817a3a09541bab28fe6841f60e3b859 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_lokr.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_lora.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_lora.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c84325ea091f6c062246e32f7098d816f6f18495 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_lora.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_norm.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_norm.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22ae9fb42d046f14f8306682739e1d9141d17ffc Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_norm.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_oft.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_oft.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e0df405640fb6588a13cbcabf2ec19ec5513878 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/network_oft.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/networks.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/networks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43b894644df3bfcfa33642346121b9d90b5689e1 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/networks.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/preload.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/preload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4071aba72b6c86c755922f850b9ef1fa618fee8d Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/preload.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/ui_edit_user_metadata.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/ui_edit_user_metadata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..235ea414a242deeb0bf67fc42ae486395e93189d Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/ui_edit_user_metadata.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/ui_extra_networks_lora.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/ui_extra_networks_lora.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..141c17b18d324690bdab9a3833402f7f0d3b0974 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/__pycache__/ui_extra_networks_lora.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/extra_networks_lora.py b/stable-diffusion-webui/extensions-builtin/Lora/extra_networks_lora.py new file mode 100644 index 0000000000000000000000000000000000000000..88425009c7150f303b10bec8a42a3aa7a8c4ff93 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/extra_networks_lora.py @@ -0,0 +1,67 @@ +from modules import extra_networks, shared +import networks + + +class ExtraNetworkLora(extra_networks.ExtraNetwork): + def __init__(self): + super().__init__('lora') + + self.errors = {} + """mapping of network names to the number of errors the network had during operation""" + + def activate(self, p, params_list): + additional = shared.opts.sd_lora + + self.errors.clear() + + if additional != "None" and additional in networks.available_networks and not any(x for x in params_list if x.items[0] == additional): + p.all_prompts = [x + f"" for x in p.all_prompts] + params_list.append(extra_networks.ExtraNetworkParams(items=[additional, shared.opts.extra_networks_default_multiplier])) + + names = [] + te_multipliers = [] + unet_multipliers = [] + dyn_dims = [] + for params in params_list: + assert params.items + + names.append(params.positional[0]) + + te_multiplier = float(params.positional[1]) if len(params.positional) > 1 else 1.0 + te_multiplier = float(params.named.get("te", te_multiplier)) + + unet_multiplier = float(params.positional[2]) if len(params.positional) > 2 else te_multiplier + unet_multiplier = float(params.named.get("unet", unet_multiplier)) + + dyn_dim = int(params.positional[3]) if len(params.positional) > 3 else None + dyn_dim = int(params.named["dyn"]) if "dyn" in params.named else dyn_dim + + te_multipliers.append(te_multiplier) + unet_multipliers.append(unet_multiplier) + dyn_dims.append(dyn_dim) + + networks.load_networks(names, te_multipliers, unet_multipliers, dyn_dims) + + if shared.opts.lora_add_hashes_to_infotext: + network_hashes = [] + for item in networks.loaded_networks: + shorthash = item.network_on_disk.shorthash + if not shorthash: + continue + + alias = item.mentioned_name + if not alias: + continue + + alias = alias.replace(":", "").replace(",", "") + + network_hashes.append(f"{alias}: {shorthash}") + + if network_hashes: + p.extra_generation_params["Lora hashes"] = ", ".join(network_hashes) + + def deactivate(self, p): + if self.errors: + p.comment("Networks with errors: " + ", ".join(f"{k} ({v})" for k, v in self.errors.items())) + + self.errors.clear() diff --git a/stable-diffusion-webui/extensions-builtin/Lora/lora.py b/stable-diffusion-webui/extensions-builtin/Lora/lora.py new file mode 100644 index 0000000000000000000000000000000000000000..6186538e956e39c843a2a22a77c5ab53fdfec3c7 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/lora.py @@ -0,0 +1,9 @@ +import networks + +list_available_loras = networks.list_available_networks + +available_loras = networks.available_networks +available_lora_aliases = networks.available_network_aliases +available_lora_hash_lookup = networks.available_network_hash_lookup +forbidden_lora_aliases = networks.forbidden_network_aliases +loaded_loras = networks.loaded_networks diff --git a/stable-diffusion-webui/extensions-builtin/Lora/lora_logger.py b/stable-diffusion-webui/extensions-builtin/Lora/lora_logger.py new file mode 100644 index 0000000000000000000000000000000000000000..d51de29704f72b80958dbabda021c6648aef8177 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/lora_logger.py @@ -0,0 +1,33 @@ +import sys +import copy +import logging + + +class ColoredFormatter(logging.Formatter): + COLORS = { + "DEBUG": "\033[0;36m", # CYAN + "INFO": "\033[0;32m", # GREEN + "WARNING": "\033[0;33m", # YELLOW + "ERROR": "\033[0;31m", # RED + "CRITICAL": "\033[0;37;41m", # WHITE ON RED + "RESET": "\033[0m", # RESET COLOR + } + + def format(self, record): + colored_record = copy.copy(record) + levelname = colored_record.levelname + seq = self.COLORS.get(levelname, self.COLORS["RESET"]) + colored_record.levelname = f"{seq}{levelname}{self.COLORS['RESET']}" + return super().format(colored_record) + + +logger = logging.getLogger("lora") +logger.propagate = False + + +if not logger.handlers: + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter( + ColoredFormatter("[%(name)s]-%(levelname)s: %(message)s") + ) + logger.addHandler(handler) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/lora_patches.py b/stable-diffusion-webui/extensions-builtin/Lora/lora_patches.py new file mode 100644 index 0000000000000000000000000000000000000000..59859e6f94f434a032c2c07f040bceb79fcd1dc2 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/lora_patches.py @@ -0,0 +1,31 @@ +import torch + +import networks +from modules import patches + + +class LoraPatches: + def __init__(self): + self.Linear_forward = patches.patch(__name__, torch.nn.Linear, 'forward', networks.network_Linear_forward) + self.Linear_load_state_dict = patches.patch(__name__, torch.nn.Linear, '_load_from_state_dict', networks.network_Linear_load_state_dict) + self.Conv2d_forward = patches.patch(__name__, torch.nn.Conv2d, 'forward', networks.network_Conv2d_forward) + self.Conv2d_load_state_dict = patches.patch(__name__, torch.nn.Conv2d, '_load_from_state_dict', networks.network_Conv2d_load_state_dict) + self.GroupNorm_forward = patches.patch(__name__, torch.nn.GroupNorm, 'forward', networks.network_GroupNorm_forward) + self.GroupNorm_load_state_dict = patches.patch(__name__, torch.nn.GroupNorm, '_load_from_state_dict', networks.network_GroupNorm_load_state_dict) + self.LayerNorm_forward = patches.patch(__name__, torch.nn.LayerNorm, 'forward', networks.network_LayerNorm_forward) + self.LayerNorm_load_state_dict = patches.patch(__name__, torch.nn.LayerNorm, '_load_from_state_dict', networks.network_LayerNorm_load_state_dict) + self.MultiheadAttention_forward = patches.patch(__name__, torch.nn.MultiheadAttention, 'forward', networks.network_MultiheadAttention_forward) + self.MultiheadAttention_load_state_dict = patches.patch(__name__, torch.nn.MultiheadAttention, '_load_from_state_dict', networks.network_MultiheadAttention_load_state_dict) + + def undo(self): + self.Linear_forward = patches.undo(__name__, torch.nn.Linear, 'forward') + self.Linear_load_state_dict = patches.undo(__name__, torch.nn.Linear, '_load_from_state_dict') + self.Conv2d_forward = patches.undo(__name__, torch.nn.Conv2d, 'forward') + self.Conv2d_load_state_dict = patches.undo(__name__, torch.nn.Conv2d, '_load_from_state_dict') + self.GroupNorm_forward = patches.undo(__name__, torch.nn.GroupNorm, 'forward') + self.GroupNorm_load_state_dict = patches.undo(__name__, torch.nn.GroupNorm, '_load_from_state_dict') + self.LayerNorm_forward = patches.undo(__name__, torch.nn.LayerNorm, 'forward') + self.LayerNorm_load_state_dict = patches.undo(__name__, torch.nn.LayerNorm, '_load_from_state_dict') + self.MultiheadAttention_forward = patches.undo(__name__, torch.nn.MultiheadAttention, 'forward') + self.MultiheadAttention_load_state_dict = patches.undo(__name__, torch.nn.MultiheadAttention, '_load_from_state_dict') + diff --git a/stable-diffusion-webui/extensions-builtin/Lora/lyco_helpers.py b/stable-diffusion-webui/extensions-builtin/Lora/lyco_helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..e0e1afa7887aae587f854b6f3ea3d231f2e8f6eb --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/lyco_helpers.py @@ -0,0 +1,68 @@ +import torch + + +def make_weight_cp(t, wa, wb): + temp = torch.einsum('i j k l, j r -> i r k l', t, wb) + return torch.einsum('i j k l, i r -> r j k l', temp, wa) + + +def rebuild_conventional(up, down, shape, dyn_dim=None): + up = up.reshape(up.size(0), -1) + down = down.reshape(down.size(0), -1) + if dyn_dim is not None: + up = up[:, :dyn_dim] + down = down[:dyn_dim, :] + return (up @ down).reshape(shape) + + +def rebuild_cp_decomposition(up, down, mid): + up = up.reshape(up.size(0), -1) + down = down.reshape(down.size(0), -1) + return torch.einsum('n m k l, i n, m j -> i j k l', mid, up, down) + + +# copied from https://github.com/KohakuBlueleaf/LyCORIS/blob/dev/lycoris/modules/lokr.py +def factorization(dimension: int, factor:int=-1) -> tuple[int, int]: + ''' + return a tuple of two value of input dimension decomposed by the number closest to factor + second value is higher or equal than first value. + + In LoRA with Kroneckor Product, first value is a value for weight scale. + secon value is a value for weight. + + Becuase of non-commutative property, AโŠ—B โ‰  BโŠ—A. Meaning of two matrices is slightly different. + + examples) + factor + -1 2 4 8 16 ... + 127 -> 1, 127 127 -> 1, 127 127 -> 1, 127 127 -> 1, 127 127 -> 1, 127 + 128 -> 8, 16 128 -> 2, 64 128 -> 4, 32 128 -> 8, 16 128 -> 8, 16 + 250 -> 10, 25 250 -> 2, 125 250 -> 2, 125 250 -> 5, 50 250 -> 10, 25 + 360 -> 8, 45 360 -> 2, 180 360 -> 4, 90 360 -> 8, 45 360 -> 12, 30 + 512 -> 16, 32 512 -> 2, 256 512 -> 4, 128 512 -> 8, 64 512 -> 16, 32 + 1024 -> 32, 32 1024 -> 2, 512 1024 -> 4, 256 1024 -> 8, 128 1024 -> 16, 64 + ''' + + if factor > 0 and (dimension % factor) == 0: + m = factor + n = dimension // factor + if m > n: + n, m = m, n + return m, n + if factor < 0: + factor = dimension + m, n = 1, dimension + length = m + n + while m length or new_m>factor: + break + else: + m, n = new_m, new_n + if m > n: + n, m = m, n + return m, n + diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network.py b/stable-diffusion-webui/extensions-builtin/Lora/network.py new file mode 100644 index 0000000000000000000000000000000000000000..e14cc67c9104c88bb222cf72e162a4d99b77b0a8 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network.py @@ -0,0 +1,159 @@ +from __future__ import annotations +import os +from collections import namedtuple +import enum + +from modules import sd_models, cache, errors, hashes, shared + +NetworkWeights = namedtuple('NetworkWeights', ['network_key', 'sd_key', 'w', 'sd_module']) + +metadata_tags_order = {"ss_sd_model_name": 1, "ss_resolution": 2, "ss_clip_skip": 3, "ss_num_train_images": 10, "ss_tag_frequency": 20} + + +class SdVersion(enum.Enum): + Unknown = 1 + SD1 = 2 + SD2 = 3 + SDXL = 4 + + +class NetworkOnDisk: + def __init__(self, name, filename): + self.name = name + self.filename = filename + self.metadata = {} + self.is_safetensors = os.path.splitext(filename)[1].lower() == ".safetensors" + + def read_metadata(): + metadata = sd_models.read_metadata_from_safetensors(filename) + metadata.pop('ssmd_cover_images', None) # those are cover images, and they are too big to display in UI as text + + return metadata + + if self.is_safetensors: + try: + self.metadata = cache.cached_data_for_file('safetensors-metadata', "lora/" + self.name, filename, read_metadata) + except Exception as e: + errors.display(e, f"reading lora {filename}") + + if self.metadata: + m = {} + for k, v in sorted(self.metadata.items(), key=lambda x: metadata_tags_order.get(x[0], 999)): + m[k] = v + + self.metadata = m + + self.alias = self.metadata.get('ss_output_name', self.name) + + self.hash = None + self.shorthash = None + self.set_hash( + self.metadata.get('sshs_model_hash') or + hashes.sha256_from_cache(self.filename, "lora/" + self.name, use_addnet_hash=self.is_safetensors) or + '' + ) + + self.sd_version = self.detect_version() + + def detect_version(self): + if str(self.metadata.get('ss_base_model_version', "")).startswith("sdxl_"): + return SdVersion.SDXL + elif str(self.metadata.get('ss_v2', "")) == "True": + return SdVersion.SD2 + elif len(self.metadata): + return SdVersion.SD1 + + return SdVersion.Unknown + + def set_hash(self, v): + self.hash = v + self.shorthash = self.hash[0:12] + + if self.shorthash: + import networks + networks.available_network_hash_lookup[self.shorthash] = self + + def read_hash(self): + if not self.hash: + self.set_hash(hashes.sha256(self.filename, "lora/" + self.name, use_addnet_hash=self.is_safetensors) or '') + + def get_alias(self): + import networks + if shared.opts.lora_preferred_name == "Filename" or self.alias.lower() in networks.forbidden_network_aliases: + return self.name + else: + return self.alias + + +class Network: # LoraModule + def __init__(self, name, network_on_disk: NetworkOnDisk): + self.name = name + self.network_on_disk = network_on_disk + self.te_multiplier = 1.0 + self.unet_multiplier = 1.0 + self.dyn_dim = None + self.modules = {} + self.bundle_embeddings = {} + self.mtime = None + + self.mentioned_name = None + """the text that was used to add the network to prompt - can be either name or an alias""" + + +class ModuleType: + def create_module(self, net: Network, weights: NetworkWeights) -> Network | None: + return None + + +class NetworkModule: + def __init__(self, net: Network, weights: NetworkWeights): + self.network = net + self.network_key = weights.network_key + self.sd_key = weights.sd_key + self.sd_module = weights.sd_module + + if hasattr(self.sd_module, 'weight'): + self.shape = self.sd_module.weight.shape + + self.dim = None + self.bias = weights.w.get("bias") + self.alpha = weights.w["alpha"].item() if "alpha" in weights.w else None + self.scale = weights.w["scale"].item() if "scale" in weights.w else None + + def multiplier(self): + if 'transformer' in self.sd_key[:20]: + return self.network.te_multiplier + else: + return self.network.unet_multiplier + + def calc_scale(self): + if self.scale is not None: + return self.scale + if self.dim is not None and self.alpha is not None: + return self.alpha / self.dim + + return 1.0 + + def finalize_updown(self, updown, orig_weight, output_shape, ex_bias=None): + if self.bias is not None: + updown = updown.reshape(self.bias.shape) + updown += self.bias.to(orig_weight.device, dtype=orig_weight.dtype) + updown = updown.reshape(output_shape) + + if len(output_shape) == 4: + updown = updown.reshape(output_shape) + + if orig_weight.size().numel() == updown.size().numel(): + updown = updown.reshape(orig_weight.shape) + + if ex_bias is not None: + ex_bias = ex_bias * self.multiplier() + + return updown * self.calc_scale() * self.multiplier(), ex_bias + + def calc_updown(self, target): + raise NotImplementedError() + + def forward(self, x, y): + raise NotImplementedError() + diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_full.py b/stable-diffusion-webui/extensions-builtin/Lora/network_full.py new file mode 100644 index 0000000000000000000000000000000000000000..545e254e0c675c8b81668cbd234d41edaba524e7 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_full.py @@ -0,0 +1,27 @@ +import network + + +class ModuleTypeFull(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["diff"]): + return NetworkModuleFull(net, weights) + + return None + + +class NetworkModuleFull(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + self.weight = weights.w.get("diff") + self.ex_bias = weights.w.get("diff_b") + + def calc_updown(self, orig_weight): + output_shape = self.weight.shape + updown = self.weight.to(orig_weight.device, dtype=orig_weight.dtype) + if self.ex_bias is not None: + ex_bias = self.ex_bias.to(orig_weight.device, dtype=orig_weight.dtype) + else: + ex_bias = None + + return self.finalize_updown(updown, orig_weight, output_shape, ex_bias) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_glora.py b/stable-diffusion-webui/extensions-builtin/Lora/network_glora.py new file mode 100644 index 0000000000000000000000000000000000000000..492d487078de426074066b0176840fed9bb66c29 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_glora.py @@ -0,0 +1,33 @@ + +import network + +class ModuleTypeGLora(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["a1.weight", "a2.weight", "alpha", "b1.weight", "b2.weight"]): + return NetworkModuleGLora(net, weights) + + return None + +# adapted from https://github.com/KohakuBlueleaf/LyCORIS +class NetworkModuleGLora(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + if hasattr(self.sd_module, 'weight'): + self.shape = self.sd_module.weight.shape + + self.w1a = weights.w["a1.weight"] + self.w1b = weights.w["b1.weight"] + self.w2a = weights.w["a2.weight"] + self.w2b = weights.w["b2.weight"] + + def calc_updown(self, orig_weight): + w1a = self.w1a.to(orig_weight.device, dtype=orig_weight.dtype) + w1b = self.w1b.to(orig_weight.device, dtype=orig_weight.dtype) + w2a = self.w2a.to(orig_weight.device, dtype=orig_weight.dtype) + w2b = self.w2b.to(orig_weight.device, dtype=orig_weight.dtype) + + output_shape = [w1a.size(0), w1b.size(1)] + updown = ((w2b @ w1b) + ((orig_weight @ w2a) @ w1a)) + + return self.finalize_updown(updown, orig_weight, output_shape) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_hada.py b/stable-diffusion-webui/extensions-builtin/Lora/network_hada.py new file mode 100644 index 0000000000000000000000000000000000000000..b62e88840866f2801b5bafa657cfd9b0377054b7 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_hada.py @@ -0,0 +1,55 @@ +import lyco_helpers +import network + + +class ModuleTypeHada(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["hada_w1_a", "hada_w1_b", "hada_w2_a", "hada_w2_b"]): + return NetworkModuleHada(net, weights) + + return None + + +class NetworkModuleHada(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + if hasattr(self.sd_module, 'weight'): + self.shape = self.sd_module.weight.shape + + self.w1a = weights.w["hada_w1_a"] + self.w1b = weights.w["hada_w1_b"] + self.dim = self.w1b.shape[0] + self.w2a = weights.w["hada_w2_a"] + self.w2b = weights.w["hada_w2_b"] + + self.t1 = weights.w.get("hada_t1") + self.t2 = weights.w.get("hada_t2") + + def calc_updown(self, orig_weight): + w1a = self.w1a.to(orig_weight.device, dtype=orig_weight.dtype) + w1b = self.w1b.to(orig_weight.device, dtype=orig_weight.dtype) + w2a = self.w2a.to(orig_weight.device, dtype=orig_weight.dtype) + w2b = self.w2b.to(orig_weight.device, dtype=orig_weight.dtype) + + output_shape = [w1a.size(0), w1b.size(1)] + + if self.t1 is not None: + output_shape = [w1a.size(1), w1b.size(1)] + t1 = self.t1.to(orig_weight.device, dtype=orig_weight.dtype) + updown1 = lyco_helpers.make_weight_cp(t1, w1a, w1b) + output_shape += t1.shape[2:] + else: + if len(w1b.shape) == 4: + output_shape += w1b.shape[2:] + updown1 = lyco_helpers.rebuild_conventional(w1a, w1b, output_shape) + + if self.t2 is not None: + t2 = self.t2.to(orig_weight.device, dtype=orig_weight.dtype) + updown2 = lyco_helpers.make_weight_cp(t2, w2a, w2b) + else: + updown2 = lyco_helpers.rebuild_conventional(w2a, w2b, output_shape) + + updown = updown1 * updown2 + + return self.finalize_updown(updown, orig_weight, output_shape) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_ia3.py b/stable-diffusion-webui/extensions-builtin/Lora/network_ia3.py new file mode 100644 index 0000000000000000000000000000000000000000..ddf5d68983c3b8d57ad3d58b293e6bc462d52159 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_ia3.py @@ -0,0 +1,30 @@ +import network + + +class ModuleTypeIa3(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["weight"]): + return NetworkModuleIa3(net, weights) + + return None + + +class NetworkModuleIa3(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + self.w = weights.w["weight"] + self.on_input = weights.w["on_input"].item() + + def calc_updown(self, orig_weight): + w = self.w.to(orig_weight.device, dtype=orig_weight.dtype) + + output_shape = [w.size(0), orig_weight.size(1)] + if self.on_input: + output_shape.reverse() + else: + w = w.reshape(-1, 1) + + updown = orig_weight * w + + return self.finalize_updown(updown, orig_weight, output_shape) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_lokr.py b/stable-diffusion-webui/extensions-builtin/Lora/network_lokr.py new file mode 100644 index 0000000000000000000000000000000000000000..87fbafa1b406de73cc394a3a0c9068da4119b0d8 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_lokr.py @@ -0,0 +1,64 @@ +import torch + +import lyco_helpers +import network + + +class ModuleTypeLokr(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + has_1 = "lokr_w1" in weights.w or ("lokr_w1_a" in weights.w and "lokr_w1_b" in weights.w) + has_2 = "lokr_w2" in weights.w or ("lokr_w2_a" in weights.w and "lokr_w2_b" in weights.w) + if has_1 and has_2: + return NetworkModuleLokr(net, weights) + + return None + + +def make_kron(orig_shape, w1, w2): + if len(w2.shape) == 4: + w1 = w1.unsqueeze(2).unsqueeze(2) + w2 = w2.contiguous() + return torch.kron(w1, w2).reshape(orig_shape) + + +class NetworkModuleLokr(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + self.w1 = weights.w.get("lokr_w1") + self.w1a = weights.w.get("lokr_w1_a") + self.w1b = weights.w.get("lokr_w1_b") + self.dim = self.w1b.shape[0] if self.w1b is not None else self.dim + self.w2 = weights.w.get("lokr_w2") + self.w2a = weights.w.get("lokr_w2_a") + self.w2b = weights.w.get("lokr_w2_b") + self.dim = self.w2b.shape[0] if self.w2b is not None else self.dim + self.t2 = weights.w.get("lokr_t2") + + def calc_updown(self, orig_weight): + if self.w1 is not None: + w1 = self.w1.to(orig_weight.device, dtype=orig_weight.dtype) + else: + w1a = self.w1a.to(orig_weight.device, dtype=orig_weight.dtype) + w1b = self.w1b.to(orig_weight.device, dtype=orig_weight.dtype) + w1 = w1a @ w1b + + if self.w2 is not None: + w2 = self.w2.to(orig_weight.device, dtype=orig_weight.dtype) + elif self.t2 is None: + w2a = self.w2a.to(orig_weight.device, dtype=orig_weight.dtype) + w2b = self.w2b.to(orig_weight.device, dtype=orig_weight.dtype) + w2 = w2a @ w2b + else: + t2 = self.t2.to(orig_weight.device, dtype=orig_weight.dtype) + w2a = self.w2a.to(orig_weight.device, dtype=orig_weight.dtype) + w2b = self.w2b.to(orig_weight.device, dtype=orig_weight.dtype) + w2 = lyco_helpers.make_weight_cp(t2, w2a, w2b) + + output_shape = [w1.size(0) * w2.size(0), w1.size(1) * w2.size(1)] + if len(orig_weight.shape) == 4: + output_shape = orig_weight.shape + + updown = make_kron(output_shape, w1, w2) + + return self.finalize_updown(updown, orig_weight, output_shape) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_lora.py b/stable-diffusion-webui/extensions-builtin/Lora/network_lora.py new file mode 100644 index 0000000000000000000000000000000000000000..cb63807a09a6883fa636822ebc01753e2cb4848f --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_lora.py @@ -0,0 +1,86 @@ +import torch + +import lyco_helpers +import network +from modules import devices + + +class ModuleTypeLora(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["lora_up.weight", "lora_down.weight"]): + return NetworkModuleLora(net, weights) + + return None + + +class NetworkModuleLora(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + self.up_model = self.create_module(weights.w, "lora_up.weight") + self.down_model = self.create_module(weights.w, "lora_down.weight") + self.mid_model = self.create_module(weights.w, "lora_mid.weight", none_ok=True) + + self.dim = weights.w["lora_down.weight"].shape[0] + + def create_module(self, weights, key, none_ok=False): + weight = weights.get(key) + + if weight is None and none_ok: + return None + + is_linear = type(self.sd_module) in [torch.nn.Linear, torch.nn.modules.linear.NonDynamicallyQuantizableLinear, torch.nn.MultiheadAttention] + is_conv = type(self.sd_module) in [torch.nn.Conv2d] + + if is_linear: + weight = weight.reshape(weight.shape[0], -1) + module = torch.nn.Linear(weight.shape[1], weight.shape[0], bias=False) + elif is_conv and key == "lora_down.weight" or key == "dyn_up": + if len(weight.shape) == 2: + weight = weight.reshape(weight.shape[0], -1, 1, 1) + + if weight.shape[2] != 1 or weight.shape[3] != 1: + module = torch.nn.Conv2d(weight.shape[1], weight.shape[0], self.sd_module.kernel_size, self.sd_module.stride, self.sd_module.padding, bias=False) + else: + module = torch.nn.Conv2d(weight.shape[1], weight.shape[0], (1, 1), bias=False) + elif is_conv and key == "lora_mid.weight": + module = torch.nn.Conv2d(weight.shape[1], weight.shape[0], self.sd_module.kernel_size, self.sd_module.stride, self.sd_module.padding, bias=False) + elif is_conv and key == "lora_up.weight" or key == "dyn_down": + module = torch.nn.Conv2d(weight.shape[1], weight.shape[0], (1, 1), bias=False) + else: + raise AssertionError(f'Lora layer {self.network_key} matched a layer with unsupported type: {type(self.sd_module).__name__}') + + with torch.no_grad(): + if weight.shape != module.weight.shape: + weight = weight.reshape(module.weight.shape) + module.weight.copy_(weight) + + module.to(device=devices.cpu, dtype=devices.dtype) + module.weight.requires_grad_(False) + + return module + + def calc_updown(self, orig_weight): + up = self.up_model.weight.to(orig_weight.device, dtype=orig_weight.dtype) + down = self.down_model.weight.to(orig_weight.device, dtype=orig_weight.dtype) + + output_shape = [up.size(0), down.size(1)] + if self.mid_model is not None: + # cp-decomposition + mid = self.mid_model.weight.to(orig_weight.device, dtype=orig_weight.dtype) + updown = lyco_helpers.rebuild_cp_decomposition(up, down, mid) + output_shape += mid.shape[2:] + else: + if len(down.shape) == 4: + output_shape += down.shape[2:] + updown = lyco_helpers.rebuild_conventional(up, down, output_shape, self.network.dyn_dim) + + return self.finalize_updown(updown, orig_weight, output_shape) + + def forward(self, x, y): + self.up_model.to(device=devices.device) + self.down_model.to(device=devices.device) + + return y + self.up_model(self.down_model(x)) * self.multiplier() * self.calc_scale() + + diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_norm.py b/stable-diffusion-webui/extensions-builtin/Lora/network_norm.py new file mode 100644 index 0000000000000000000000000000000000000000..ce450158068ef85ebe11cc60756ed991465c0e54 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_norm.py @@ -0,0 +1,28 @@ +import network + + +class ModuleTypeNorm(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["w_norm", "b_norm"]): + return NetworkModuleNorm(net, weights) + + return None + + +class NetworkModuleNorm(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + self.w_norm = weights.w.get("w_norm") + self.b_norm = weights.w.get("b_norm") + + def calc_updown(self, orig_weight): + output_shape = self.w_norm.shape + updown = self.w_norm.to(orig_weight.device, dtype=orig_weight.dtype) + + if self.b_norm is not None: + ex_bias = self.b_norm.to(orig_weight.device, dtype=orig_weight.dtype) + else: + ex_bias = None + + return self.finalize_updown(updown, orig_weight, output_shape, ex_bias) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/network_oft.py b/stable-diffusion-webui/extensions-builtin/Lora/network_oft.py new file mode 100644 index 0000000000000000000000000000000000000000..fa647020f0a3cad281e74596d749daf3ee412c20 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/network_oft.py @@ -0,0 +1,82 @@ +import torch +import network +from lyco_helpers import factorization +from einops import rearrange + + +class ModuleTypeOFT(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["oft_blocks"]) or all(x in weights.w for x in ["oft_diag"]): + return NetworkModuleOFT(net, weights) + + return None + +# Supports both kohya-ss' implementation of COFT https://github.com/kohya-ss/sd-scripts/blob/main/networks/oft.py +# and KohakuBlueleaf's implementation of OFT/COFT https://github.com/KohakuBlueleaf/LyCORIS/blob/dev/lycoris/modules/diag_oft.py +class NetworkModuleOFT(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + + super().__init__(net, weights) + + self.lin_module = None + self.org_module: list[torch.Module] = [self.sd_module] + + self.scale = 1.0 + + # kohya-ss + if "oft_blocks" in weights.w.keys(): + self.is_kohya = True + self.oft_blocks = weights.w["oft_blocks"] # (num_blocks, block_size, block_size) + self.alpha = weights.w["alpha"] # alpha is constraint + self.dim = self.oft_blocks.shape[0] # lora dim + # LyCORIS + elif "oft_diag" in weights.w.keys(): + self.is_kohya = False + self.oft_blocks = weights.w["oft_diag"] + # self.alpha is unused + self.dim = self.oft_blocks.shape[1] # (num_blocks, block_size, block_size) + + is_linear = type(self.sd_module) in [torch.nn.Linear, torch.nn.modules.linear.NonDynamicallyQuantizableLinear] + is_conv = type(self.sd_module) in [torch.nn.Conv2d] + is_other_linear = type(self.sd_module) in [torch.nn.MultiheadAttention] # unsupported + + if is_linear: + self.out_dim = self.sd_module.out_features + elif is_conv: + self.out_dim = self.sd_module.out_channels + elif is_other_linear: + self.out_dim = self.sd_module.embed_dim + + if self.is_kohya: + self.constraint = self.alpha * self.out_dim + self.num_blocks = self.dim + self.block_size = self.out_dim // self.dim + else: + self.constraint = None + self.block_size, self.num_blocks = factorization(self.out_dim, self.dim) + + def calc_updown(self, orig_weight): + oft_blocks = self.oft_blocks.to(orig_weight.device, dtype=orig_weight.dtype) + eye = torch.eye(self.block_size, device=self.oft_blocks.device) + + if self.is_kohya: + block_Q = oft_blocks - oft_blocks.transpose(1, 2) # ensure skew-symmetric orthogonal matrix + norm_Q = torch.norm(block_Q.flatten()) + new_norm_Q = torch.clamp(norm_Q, max=self.constraint) + block_Q = block_Q * ((new_norm_Q + 1e-8) / (norm_Q + 1e-8)) + oft_blocks = torch.matmul(eye + block_Q, (eye - block_Q).float().inverse()) + + R = oft_blocks.to(orig_weight.device, dtype=orig_weight.dtype) + + # This errors out for MultiheadAttention, might need to be handled up-stream + merged_weight = rearrange(orig_weight, '(k n) ... -> k n ...', k=self.num_blocks, n=self.block_size) + merged_weight = torch.einsum( + 'k n m, k n ... -> k m ...', + R, + merged_weight + ) + merged_weight = rearrange(merged_weight, 'k m ... -> (k m) ...') + + updown = merged_weight.to(orig_weight.device, dtype=orig_weight.dtype) - orig_weight + output_shape = orig_weight.shape + return self.finalize_updown(updown, orig_weight, output_shape) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/networks.py b/stable-diffusion-webui/extensions-builtin/Lora/networks.py new file mode 100644 index 0000000000000000000000000000000000000000..c905e51d03f4e419b738b72589fa4fa4e6dba9b1 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/networks.py @@ -0,0 +1,629 @@ +import logging +import os +import re + +import lora_patches +import network +import network_lora +import network_glora +import network_hada +import network_ia3 +import network_lokr +import network_full +import network_norm +import network_oft + +import torch +from typing import Union + +from modules import shared, devices, sd_models, errors, scripts, sd_hijack +import modules.textual_inversion.textual_inversion as textual_inversion + +from lora_logger import logger + +module_types = [ + network_lora.ModuleTypeLora(), + network_hada.ModuleTypeHada(), + network_ia3.ModuleTypeIa3(), + network_lokr.ModuleTypeLokr(), + network_full.ModuleTypeFull(), + network_norm.ModuleTypeNorm(), + network_glora.ModuleTypeGLora(), + network_oft.ModuleTypeOFT(), +] + + +re_digits = re.compile(r"\d+") +re_x_proj = re.compile(r"(.*)_([qkv]_proj)$") +re_compiled = {} + +suffix_conversion = { + "attentions": {}, + "resnets": { + "conv1": "in_layers_2", + "conv2": "out_layers_3", + "norm1": "in_layers_0", + "norm2": "out_layers_0", + "time_emb_proj": "emb_layers_1", + "conv_shortcut": "skip_connection", + } +} + + +def convert_diffusers_name_to_compvis(key, is_sd2): + def match(match_list, regex_text): + regex = re_compiled.get(regex_text) + if regex is None: + regex = re.compile(regex_text) + re_compiled[regex_text] = regex + + r = re.match(regex, key) + if not r: + return False + + match_list.clear() + match_list.extend([int(x) if re.match(re_digits, x) else x for x in r.groups()]) + return True + + m = [] + + if match(m, r"lora_unet_conv_in(.*)"): + return f'diffusion_model_input_blocks_0_0{m[0]}' + + if match(m, r"lora_unet_conv_out(.*)"): + return f'diffusion_model_out_2{m[0]}' + + if match(m, r"lora_unet_time_embedding_linear_(\d+)(.*)"): + return f"diffusion_model_time_embed_{m[0] * 2 - 2}{m[1]}" + + if match(m, r"lora_unet_down_blocks_(\d+)_(attentions|resnets)_(\d+)_(.+)"): + suffix = suffix_conversion.get(m[1], {}).get(m[3], m[3]) + return f"diffusion_model_input_blocks_{1 + m[0] * 3 + m[2]}_{1 if m[1] == 'attentions' else 0}_{suffix}" + + if match(m, r"lora_unet_mid_block_(attentions|resnets)_(\d+)_(.+)"): + suffix = suffix_conversion.get(m[0], {}).get(m[2], m[2]) + return f"diffusion_model_middle_block_{1 if m[0] == 'attentions' else m[1] * 2}_{suffix}" + + if match(m, r"lora_unet_up_blocks_(\d+)_(attentions|resnets)_(\d+)_(.+)"): + suffix = suffix_conversion.get(m[1], {}).get(m[3], m[3]) + return f"diffusion_model_output_blocks_{m[0] * 3 + m[2]}_{1 if m[1] == 'attentions' else 0}_{suffix}" + + if match(m, r"lora_unet_down_blocks_(\d+)_downsamplers_0_conv"): + return f"diffusion_model_input_blocks_{3 + m[0] * 3}_0_op" + + if match(m, r"lora_unet_up_blocks_(\d+)_upsamplers_0_conv"): + return f"diffusion_model_output_blocks_{2 + m[0] * 3}_{2 if m[0]>0 else 1}_conv" + + if match(m, r"lora_te_text_model_encoder_layers_(\d+)_(.+)"): + if is_sd2: + if 'mlp_fc1' in m[1]: + return f"model_transformer_resblocks_{m[0]}_{m[1].replace('mlp_fc1', 'mlp_c_fc')}" + elif 'mlp_fc2' in m[1]: + return f"model_transformer_resblocks_{m[0]}_{m[1].replace('mlp_fc2', 'mlp_c_proj')}" + else: + return f"model_transformer_resblocks_{m[0]}_{m[1].replace('self_attn', 'attn')}" + + return f"transformer_text_model_encoder_layers_{m[0]}_{m[1]}" + + if match(m, r"lora_te2_text_model_encoder_layers_(\d+)_(.+)"): + if 'mlp_fc1' in m[1]: + return f"1_model_transformer_resblocks_{m[0]}_{m[1].replace('mlp_fc1', 'mlp_c_fc')}" + elif 'mlp_fc2' in m[1]: + return f"1_model_transformer_resblocks_{m[0]}_{m[1].replace('mlp_fc2', 'mlp_c_proj')}" + else: + return f"1_model_transformer_resblocks_{m[0]}_{m[1].replace('self_attn', 'attn')}" + + return key + + +def assign_network_names_to_compvis_modules(sd_model): + network_layer_mapping = {} + + if shared.sd_model.is_sdxl: + for i, embedder in enumerate(shared.sd_model.conditioner.embedders): + if not hasattr(embedder, 'wrapped'): + continue + + for name, module in embedder.wrapped.named_modules(): + network_name = f'{i}_{name.replace(".", "_")}' + network_layer_mapping[network_name] = module + module.network_layer_name = network_name + else: + for name, module in shared.sd_model.cond_stage_model.wrapped.named_modules(): + network_name = name.replace(".", "_") + network_layer_mapping[network_name] = module + module.network_layer_name = network_name + + for name, module in shared.sd_model.model.named_modules(): + network_name = name.replace(".", "_") + network_layer_mapping[network_name] = module + module.network_layer_name = network_name + + sd_model.network_layer_mapping = network_layer_mapping + + +def load_network(name, network_on_disk): + net = network.Network(name, network_on_disk) + net.mtime = os.path.getmtime(network_on_disk.filename) + + sd = sd_models.read_state_dict(network_on_disk.filename) + + # this should not be needed but is here as an emergency fix for an unknown error people are experiencing in 1.2.0 + if not hasattr(shared.sd_model, 'network_layer_mapping'): + assign_network_names_to_compvis_modules(shared.sd_model) + + keys_failed_to_match = {} + is_sd2 = 'model_transformer_resblocks' in shared.sd_model.network_layer_mapping + + matched_networks = {} + bundle_embeddings = {} + + for key_network, weight in sd.items(): + key_network_without_network_parts, _, network_part = key_network.partition(".") + + if key_network_without_network_parts == "bundle_emb": + emb_name, vec_name = network_part.split(".", 1) + emb_dict = bundle_embeddings.get(emb_name, {}) + if vec_name.split('.')[0] == 'string_to_param': + _, k2 = vec_name.split('.', 1) + emb_dict['string_to_param'] = {k2: weight} + else: + emb_dict[vec_name] = weight + bundle_embeddings[emb_name] = emb_dict + + key = convert_diffusers_name_to_compvis(key_network_without_network_parts, is_sd2) + sd_module = shared.sd_model.network_layer_mapping.get(key, None) + + if sd_module is None: + m = re_x_proj.match(key) + if m: + sd_module = shared.sd_model.network_layer_mapping.get(m.group(1), None) + + # SDXL loras seem to already have correct compvis keys, so only need to replace "lora_unet" with "diffusion_model" + if sd_module is None and "lora_unet" in key_network_without_network_parts: + key = key_network_without_network_parts.replace("lora_unet", "diffusion_model") + sd_module = shared.sd_model.network_layer_mapping.get(key, None) + elif sd_module is None and "lora_te1_text_model" in key_network_without_network_parts: + key = key_network_without_network_parts.replace("lora_te1_text_model", "0_transformer_text_model") + sd_module = shared.sd_model.network_layer_mapping.get(key, None) + + # some SD1 Loras also have correct compvis keys + if sd_module is None: + key = key_network_without_network_parts.replace("lora_te1_text_model", "transformer_text_model") + sd_module = shared.sd_model.network_layer_mapping.get(key, None) + + # kohya_ss OFT module + elif sd_module is None and "oft_unet" in key_network_without_network_parts: + key = key_network_without_network_parts.replace("oft_unet", "diffusion_model") + sd_module = shared.sd_model.network_layer_mapping.get(key, None) + + # KohakuBlueLeaf OFT module + if sd_module is None and "oft_diag" in key: + key = key_network_without_network_parts.replace("lora_unet", "diffusion_model") + key = key_network_without_network_parts.replace("lora_te1_text_model", "0_transformer_text_model") + sd_module = shared.sd_model.network_layer_mapping.get(key, None) + + if sd_module is None: + keys_failed_to_match[key_network] = key + continue + + if key not in matched_networks: + matched_networks[key] = network.NetworkWeights(network_key=key_network, sd_key=key, w={}, sd_module=sd_module) + + matched_networks[key].w[network_part] = weight + + for key, weights in matched_networks.items(): + net_module = None + for nettype in module_types: + net_module = nettype.create_module(net, weights) + if net_module is not None: + break + + if net_module is None: + raise AssertionError(f"Could not find a module type (out of {', '.join([x.__class__.__name__ for x in module_types])}) that would accept those keys: {', '.join(weights.w)}") + + net.modules[key] = net_module + + embeddings = {} + for emb_name, data in bundle_embeddings.items(): + embedding = textual_inversion.create_embedding_from_data(data, emb_name, filename=network_on_disk.filename + "/" + emb_name) + embedding.loaded = None + embeddings[emb_name] = embedding + + net.bundle_embeddings = embeddings + + if keys_failed_to_match: + logging.debug(f"Network {network_on_disk.filename} didn't match keys: {keys_failed_to_match}") + + return net + + +def purge_networks_from_memory(): + while len(networks_in_memory) > shared.opts.lora_in_memory_limit and len(networks_in_memory) > 0: + name = next(iter(networks_in_memory)) + networks_in_memory.pop(name, None) + + devices.torch_gc() + + +def load_networks(names, te_multipliers=None, unet_multipliers=None, dyn_dims=None): + emb_db = sd_hijack.model_hijack.embedding_db + already_loaded = {} + + for net in loaded_networks: + if net.name in names: + already_loaded[net.name] = net + for emb_name, embedding in net.bundle_embeddings.items(): + if embedding.loaded: + emb_db.register_embedding_by_name(None, shared.sd_model, emb_name) + + loaded_networks.clear() + + networks_on_disk = [available_network_aliases.get(name, None) for name in names] + if any(x is None for x in networks_on_disk): + list_available_networks() + + networks_on_disk = [available_network_aliases.get(name, None) for name in names] + + failed_to_load_networks = [] + + for i, (network_on_disk, name) in enumerate(zip(networks_on_disk, names)): + net = already_loaded.get(name, None) + + if network_on_disk is not None: + if net is None: + net = networks_in_memory.get(name) + + if net is None or os.path.getmtime(network_on_disk.filename) > net.mtime: + try: + net = load_network(name, network_on_disk) + + networks_in_memory.pop(name, None) + networks_in_memory[name] = net + except Exception as e: + errors.display(e, f"loading network {network_on_disk.filename}") + continue + + net.mentioned_name = name + + network_on_disk.read_hash() + + if net is None: + failed_to_load_networks.append(name) + logging.info(f"Couldn't find network with name {name}") + continue + + net.te_multiplier = te_multipliers[i] if te_multipliers else 1.0 + net.unet_multiplier = unet_multipliers[i] if unet_multipliers else 1.0 + net.dyn_dim = dyn_dims[i] if dyn_dims else 1.0 + loaded_networks.append(net) + + for emb_name, embedding in net.bundle_embeddings.items(): + if embedding.loaded is None and emb_name in emb_db.word_embeddings: + logger.warning( + f'Skip bundle embedding: "{emb_name}"' + ' as it was already loaded from embeddings folder' + ) + continue + + embedding.loaded = False + if emb_db.expected_shape == -1 or emb_db.expected_shape == embedding.shape: + embedding.loaded = True + emb_db.register_embedding(embedding, shared.sd_model) + else: + emb_db.skipped_embeddings[name] = embedding + + if failed_to_load_networks: + sd_hijack.model_hijack.comments.append("Networks not found: " + ", ".join(failed_to_load_networks)) + + purge_networks_from_memory() + + +def network_restore_weights_from_backup(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.GroupNorm, torch.nn.LayerNorm, torch.nn.MultiheadAttention]): + weights_backup = getattr(self, "network_weights_backup", None) + bias_backup = getattr(self, "network_bias_backup", None) + + if weights_backup is None and bias_backup is None: + return + + if weights_backup is not None: + if isinstance(self, torch.nn.MultiheadAttention): + self.in_proj_weight.copy_(weights_backup[0]) + self.out_proj.weight.copy_(weights_backup[1]) + else: + self.weight.copy_(weights_backup) + + if bias_backup is not None: + if isinstance(self, torch.nn.MultiheadAttention): + self.out_proj.bias.copy_(bias_backup) + else: + self.bias.copy_(bias_backup) + else: + if isinstance(self, torch.nn.MultiheadAttention): + self.out_proj.bias = None + else: + self.bias = None + + +def network_apply_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.GroupNorm, torch.nn.LayerNorm, torch.nn.MultiheadAttention]): + """ + Applies the currently selected set of networks to the weights of torch layer self. + If weights already have this particular set of networks applied, does nothing. + If not, restores orginal weights from backup and alters weights according to networks. + """ + + network_layer_name = getattr(self, 'network_layer_name', None) + if network_layer_name is None: + return + + current_names = getattr(self, "network_current_names", ()) + wanted_names = tuple((x.name, x.te_multiplier, x.unet_multiplier, x.dyn_dim) for x in loaded_networks) + + weights_backup = getattr(self, "network_weights_backup", None) + if weights_backup is None and wanted_names != (): + if current_names != (): + raise RuntimeError("no backup weights found and current weights are not unchanged") + + if isinstance(self, torch.nn.MultiheadAttention): + weights_backup = (self.in_proj_weight.to(devices.cpu, copy=True), self.out_proj.weight.to(devices.cpu, copy=True)) + else: + weights_backup = self.weight.to(devices.cpu, copy=True) + + self.network_weights_backup = weights_backup + + bias_backup = getattr(self, "network_bias_backup", None) + if bias_backup is None: + if isinstance(self, torch.nn.MultiheadAttention) and self.out_proj.bias is not None: + bias_backup = self.out_proj.bias.to(devices.cpu, copy=True) + elif getattr(self, 'bias', None) is not None: + bias_backup = self.bias.to(devices.cpu, copy=True) + else: + bias_backup = None + self.network_bias_backup = bias_backup + + if current_names != wanted_names: + network_restore_weights_from_backup(self) + + for net in loaded_networks: + module = net.modules.get(network_layer_name, None) + if module is not None and hasattr(self, 'weight'): + try: + with torch.no_grad(): + updown, ex_bias = module.calc_updown(self.weight) + + if len(self.weight.shape) == 4 and self.weight.shape[1] == 9: + # inpainting model. zero pad updown to make channel[1] 4 to 9 + updown = torch.nn.functional.pad(updown, (0, 0, 0, 0, 0, 5)) + + self.weight += updown + if ex_bias is not None and hasattr(self, 'bias'): + if self.bias is None: + self.bias = torch.nn.Parameter(ex_bias) + else: + self.bias += ex_bias + except RuntimeError as e: + logging.debug(f"Network {net.name} layer {network_layer_name}: {e}") + extra_network_lora.errors[net.name] = extra_network_lora.errors.get(net.name, 0) + 1 + + continue + + module_q = net.modules.get(network_layer_name + "_q_proj", None) + module_k = net.modules.get(network_layer_name + "_k_proj", None) + module_v = net.modules.get(network_layer_name + "_v_proj", None) + module_out = net.modules.get(network_layer_name + "_out_proj", None) + + if isinstance(self, torch.nn.MultiheadAttention) and module_q and module_k and module_v and module_out: + try: + with torch.no_grad(): + updown_q, _ = module_q.calc_updown(self.in_proj_weight) + updown_k, _ = module_k.calc_updown(self.in_proj_weight) + updown_v, _ = module_v.calc_updown(self.in_proj_weight) + updown_qkv = torch.vstack([updown_q, updown_k, updown_v]) + updown_out, ex_bias = module_out.calc_updown(self.out_proj.weight) + + self.in_proj_weight += updown_qkv + self.out_proj.weight += updown_out + if ex_bias is not None: + if self.out_proj.bias is None: + self.out_proj.bias = torch.nn.Parameter(ex_bias) + else: + self.out_proj.bias += ex_bias + + except RuntimeError as e: + logging.debug(f"Network {net.name} layer {network_layer_name}: {e}") + extra_network_lora.errors[net.name] = extra_network_lora.errors.get(net.name, 0) + 1 + + continue + + if module is None: + continue + + logging.debug(f"Network {net.name} layer {network_layer_name}: couldn't find supported operation") + extra_network_lora.errors[net.name] = extra_network_lora.errors.get(net.name, 0) + 1 + + self.network_current_names = wanted_names + + +def network_forward(module, input, original_forward): + """ + Old way of applying Lora by executing operations during layer's forward. + Stacking many loras this way results in big performance degradation. + """ + + if len(loaded_networks) == 0: + return original_forward(module, input) + + input = devices.cond_cast_unet(input) + + network_restore_weights_from_backup(module) + network_reset_cached_weight(module) + + y = original_forward(module, input) + + network_layer_name = getattr(module, 'network_layer_name', None) + for lora in loaded_networks: + module = lora.modules.get(network_layer_name, None) + if module is None: + continue + + y = module.forward(input, y) + + return y + + +def network_reset_cached_weight(self: Union[torch.nn.Conv2d, torch.nn.Linear]): + self.network_current_names = () + self.network_weights_backup = None + self.network_bias_backup = None + + +def network_Linear_forward(self, input): + if shared.opts.lora_functional: + return network_forward(self, input, originals.Linear_forward) + + network_apply_weights(self) + + return originals.Linear_forward(self, input) + + +def network_Linear_load_state_dict(self, *args, **kwargs): + network_reset_cached_weight(self) + + return originals.Linear_load_state_dict(self, *args, **kwargs) + + +def network_Conv2d_forward(self, input): + if shared.opts.lora_functional: + return network_forward(self, input, originals.Conv2d_forward) + + network_apply_weights(self) + + return originals.Conv2d_forward(self, input) + + +def network_Conv2d_load_state_dict(self, *args, **kwargs): + network_reset_cached_weight(self) + + return originals.Conv2d_load_state_dict(self, *args, **kwargs) + + +def network_GroupNorm_forward(self, input): + if shared.opts.lora_functional: + return network_forward(self, input, originals.GroupNorm_forward) + + network_apply_weights(self) + + return originals.GroupNorm_forward(self, input) + + +def network_GroupNorm_load_state_dict(self, *args, **kwargs): + network_reset_cached_weight(self) + + return originals.GroupNorm_load_state_dict(self, *args, **kwargs) + + +def network_LayerNorm_forward(self, input): + if shared.opts.lora_functional: + return network_forward(self, input, originals.LayerNorm_forward) + + network_apply_weights(self) + + return originals.LayerNorm_forward(self, input) + + +def network_LayerNorm_load_state_dict(self, *args, **kwargs): + network_reset_cached_weight(self) + + return originals.LayerNorm_load_state_dict(self, *args, **kwargs) + + +def network_MultiheadAttention_forward(self, *args, **kwargs): + network_apply_weights(self) + + return originals.MultiheadAttention_forward(self, *args, **kwargs) + + +def network_MultiheadAttention_load_state_dict(self, *args, **kwargs): + network_reset_cached_weight(self) + + return originals.MultiheadAttention_load_state_dict(self, *args, **kwargs) + + +def list_available_networks(): + available_networks.clear() + available_network_aliases.clear() + forbidden_network_aliases.clear() + available_network_hash_lookup.clear() + forbidden_network_aliases.update({"none": 1, "Addams": 1}) + + os.makedirs(shared.cmd_opts.lora_dir, exist_ok=True) + + candidates = list(shared.walk_files(shared.cmd_opts.lora_dir, allowed_extensions=[".pt", ".ckpt", ".safetensors"])) + candidates += list(shared.walk_files(shared.cmd_opts.lyco_dir_backcompat, allowed_extensions=[".pt", ".ckpt", ".safetensors"])) + for filename in candidates: + if os.path.isdir(filename): + continue + + name = os.path.splitext(os.path.basename(filename))[0] + try: + entry = network.NetworkOnDisk(name, filename) + except OSError: # should catch FileNotFoundError and PermissionError etc. + errors.report(f"Failed to load network {name} from {filename}", exc_info=True) + continue + + available_networks[name] = entry + + if entry.alias in available_network_aliases: + forbidden_network_aliases[entry.alias.lower()] = 1 + + available_network_aliases[name] = entry + available_network_aliases[entry.alias] = entry + + +re_network_name = re.compile(r"(.*)\s*\([0-9a-fA-F]+\)") + + +def infotext_pasted(infotext, params): + if "AddNet Module 1" in [x[1] for x in scripts.scripts_txt2img.infotext_fields]: + return # if the other extension is active, it will handle those fields, no need to do anything + + added = [] + + for k in params: + if not k.startswith("AddNet Model "): + continue + + num = k[13:] + + if params.get("AddNet Module " + num) != "LoRA": + continue + + name = params.get("AddNet Model " + num) + if name is None: + continue + + m = re_network_name.match(name) + if m: + name = m.group(1) + + multiplier = params.get("AddNet Weight A " + num, "1.0") + + added.append(f"") + + if added: + params["Prompt"] += "\n" + "".join(added) + + +originals: lora_patches.LoraPatches = None + +extra_network_lora = None + +available_networks = {} +available_network_aliases = {} +loaded_networks = [] +loaded_bundle_embeddings = {} +networks_in_memory = {} +available_network_hash_lookup = {} +forbidden_network_aliases = {} + +list_available_networks() diff --git a/stable-diffusion-webui/extensions-builtin/Lora/preload.py b/stable-diffusion-webui/extensions-builtin/Lora/preload.py new file mode 100644 index 0000000000000000000000000000000000000000..1f85bc5338d77df91e60f35ebb4ce11d2573f01f --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/preload.py @@ -0,0 +1,7 @@ +import os +from modules import paths + + +def preload(parser): + parser.add_argument("--lora-dir", type=str, help="Path to directory with Lora networks.", default=os.path.join(paths.models_path, 'Lora')) + parser.add_argument("--lyco-dir-backcompat", type=str, help="Path to directory with LyCORIS networks (for backawards compatibility; can also use --lyco-dir).", default=os.path.join(paths.models_path, 'LyCORIS')) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/scripts/__pycache__/lora_script.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/Lora/scripts/__pycache__/lora_script.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06212cbe77549f1760ac3877035d33ee7c932803 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/Lora/scripts/__pycache__/lora_script.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/Lora/scripts/lora_script.py b/stable-diffusion-webui/extensions-builtin/Lora/scripts/lora_script.py new file mode 100644 index 0000000000000000000000000000000000000000..83b6678db128f44a7a556221e02022fe8e416beb --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/scripts/lora_script.py @@ -0,0 +1,99 @@ +import re + +import gradio as gr +from fastapi import FastAPI + +import network +import networks +import lora # noqa:F401 +import lora_patches +import extra_networks_lora +import ui_extra_networks_lora +from modules import script_callbacks, ui_extra_networks, extra_networks, shared + + +def unload(): + networks.originals.undo() + + +def before_ui(): + ui_extra_networks.register_page(ui_extra_networks_lora.ExtraNetworksPageLora()) + + networks.extra_network_lora = extra_networks_lora.ExtraNetworkLora() + extra_networks.register_extra_network(networks.extra_network_lora) + extra_networks.register_extra_network_alias(networks.extra_network_lora, "lyco") + + +networks.originals = lora_patches.LoraPatches() + +script_callbacks.on_model_loaded(networks.assign_network_names_to_compvis_modules) +script_callbacks.on_script_unloaded(unload) +script_callbacks.on_before_ui(before_ui) +script_callbacks.on_infotext_pasted(networks.infotext_pasted) + + +shared.options_templates.update(shared.options_section(('extra_networks', "Extra Networks"), { + "sd_lora": shared.OptionInfo("None", "Add network to prompt", gr.Dropdown, lambda: {"choices": ["None", *networks.available_networks]}, refresh=networks.list_available_networks), + "lora_preferred_name": shared.OptionInfo("Alias from file", "When adding to prompt, refer to Lora by", gr.Radio, {"choices": ["Alias from file", "Filename"]}), + "lora_add_hashes_to_infotext": shared.OptionInfo(True, "Add Lora hashes to infotext"), + "lora_show_all": shared.OptionInfo(False, "Always show all networks on the Lora page").info("otherwise, those detected as for incompatible version of Stable Diffusion will be hidden"), + "lora_hide_unknown_for_versions": shared.OptionInfo([], "Hide networks of unknown versions for model versions", gr.CheckboxGroup, {"choices": ["SD1", "SD2", "SDXL"]}), + "lora_in_memory_limit": shared.OptionInfo(0, "Number of Lora networks to keep cached in memory", gr.Number, {"precision": 0}), +})) + + +shared.options_templates.update(shared.options_section(('compatibility', "Compatibility"), { + "lora_functional": shared.OptionInfo(False, "Lora/Networks: use old method that takes longer when you have multiple Loras active and produces same results as kohya-ss/sd-webui-additional-networks extension"), +})) + + +def create_lora_json(obj: network.NetworkOnDisk): + return { + "name": obj.name, + "alias": obj.alias, + "path": obj.filename, + "metadata": obj.metadata, + } + + +def api_networks(_: gr.Blocks, app: FastAPI): + @app.get("/sdapi/v1/loras") + async def get_loras(): + return [create_lora_json(obj) for obj in networks.available_networks.values()] + + @app.post("/sdapi/v1/refresh-loras") + async def refresh_loras(): + return networks.list_available_networks() + + +script_callbacks.on_app_started(api_networks) + +re_lora = re.compile("= 16 + + +re_word = re.compile(r"[-_\w']+") +re_comma = re.compile(r" *, *") + + +def build_tags(metadata): + tags = {} + + for _, tags_dict in metadata.get("ss_tag_frequency", {}).items(): + for tag, tag_count in tags_dict.items(): + tag = tag.strip() + tags[tag] = tags.get(tag, 0) + int(tag_count) + + if tags and is_non_comma_tagset(tags): + new_tags = {} + + for text, text_count in tags.items(): + for word in re.findall(re_word, text): + if len(word) < 3: + continue + + new_tags[word] = new_tags.get(word, 0) + text_count + + tags = new_tags + + ordered_tags = sorted(tags.keys(), key=tags.get, reverse=True) + + return [(tag, tags[tag]) for tag in ordered_tags] + + +class LoraUserMetadataEditor(ui_extra_networks_user_metadata.UserMetadataEditor): + def __init__(self, ui, tabname, page): + super().__init__(ui, tabname, page) + + self.select_sd_version = None + + self.taginfo = None + self.edit_activation_text = None + self.slider_preferred_weight = None + self.edit_notes = None + + def save_lora_user_metadata(self, name, desc, sd_version, activation_text, preferred_weight, notes): + user_metadata = self.get_user_metadata(name) + user_metadata["description"] = desc + user_metadata["sd version"] = sd_version + user_metadata["activation text"] = activation_text + user_metadata["preferred weight"] = preferred_weight + user_metadata["notes"] = notes + + self.write_user_metadata(name, user_metadata) + + def get_metadata_table(self, name): + table = super().get_metadata_table(name) + item = self.page.items.get(name, {}) + metadata = item.get("metadata") or {} + + keys = { + 'ss_output_name': "Output name:", + 'ss_sd_model_name': "Model:", + 'ss_clip_skip': "Clip skip:", + 'ss_network_module': "Kohya module:", + } + + for key, label in keys.items(): + value = metadata.get(key, None) + if value is not None and str(value) != "None": + table.append((label, html.escape(value))) + + ss_training_started_at = metadata.get('ss_training_started_at') + if ss_training_started_at: + table.append(("Date trained:", datetime.datetime.utcfromtimestamp(float(ss_training_started_at)).strftime('%Y-%m-%d %H:%M'))) + + ss_bucket_info = metadata.get("ss_bucket_info") + if ss_bucket_info and "buckets" in ss_bucket_info: + resolutions = {} + for _, bucket in ss_bucket_info["buckets"].items(): + resolution = bucket["resolution"] + resolution = f'{resolution[1]}x{resolution[0]}' + + resolutions[resolution] = resolutions.get(resolution, 0) + int(bucket["count"]) + + resolutions_list = sorted(resolutions.keys(), key=resolutions.get, reverse=True) + resolutions_text = html.escape(", ".join(resolutions_list[0:4])) + if len(resolutions) > 4: + resolutions_text += ", ..." + resolutions_text = f"{resolutions_text}" + + table.append(('Resolutions:' if len(resolutions_list) > 1 else 'Resolution:', resolutions_text)) + + image_count = 0 + for _, params in metadata.get("ss_dataset_dirs", {}).items(): + image_count += int(params.get("img_count", 0)) + + if image_count: + table.append(("Dataset size:", image_count)) + + return table + + def put_values_into_components(self, name): + user_metadata = self.get_user_metadata(name) + values = super().put_values_into_components(name) + + item = self.page.items.get(name, {}) + metadata = item.get("metadata") or {} + + tags = build_tags(metadata) + gradio_tags = [(tag, str(count)) for tag, count in tags[0:24]] + + return [ + *values[0:5], + item.get("sd_version", "Unknown"), + gr.HighlightedText.update(value=gradio_tags, visible=True if tags else False), + user_metadata.get('activation text', ''), + float(user_metadata.get('preferred weight', 0.0)), + gr.update(visible=True if tags else False), + gr.update(value=self.generate_random_prompt_from_tags(tags), visible=True if tags else False), + ] + + def generate_random_prompt(self, name): + item = self.page.items.get(name, {}) + metadata = item.get("metadata") or {} + tags = build_tags(metadata) + + return self.generate_random_prompt_from_tags(tags) + + def generate_random_prompt_from_tags(self, tags): + max_count = None + res = [] + for tag, count in tags: + if not max_count: + max_count = count + + v = random.random() * max_count + if count > v: + res.append(tag) + + return ", ".join(sorted(res)) + + def create_extra_default_items_in_left_column(self): + + # this would be a lot better as gr.Radio but I can't make it work + self.select_sd_version = gr.Dropdown(['SD1', 'SD2', 'SDXL', 'Unknown'], value='Unknown', label='Stable Diffusion version', interactive=True) + + def create_editor(self): + self.create_default_editor_elems() + + self.taginfo = gr.HighlightedText(label="Training dataset tags") + self.edit_activation_text = gr.Text(label='Activation text', info="Will be added to prompt along with Lora") + self.slider_preferred_weight = gr.Slider(label='Preferred weight', info="Set to 0 to disable", minimum=0.0, maximum=2.0, step=0.01) + + with gr.Row() as row_random_prompt: + with gr.Column(scale=8): + random_prompt = gr.Textbox(label='Random prompt', lines=4, max_lines=4, interactive=False) + + with gr.Column(scale=1, min_width=120): + generate_random_prompt = gr.Button('Generate', size="lg", scale=1) + + self.edit_notes = gr.TextArea(label='Notes', lines=4) + + generate_random_prompt.click(fn=self.generate_random_prompt, inputs=[self.edit_name_input], outputs=[random_prompt], show_progress=False) + + def select_tag(activation_text, evt: gr.SelectData): + tag = evt.value[0] + + words = re.split(re_comma, activation_text) + if tag in words: + words = [x for x in words if x != tag and x.strip()] + return ", ".join(words) + + return activation_text + ", " + tag if activation_text else tag + + self.taginfo.select(fn=select_tag, inputs=[self.edit_activation_text], outputs=[self.edit_activation_text], show_progress=False) + + self.create_default_buttons() + + viewed_components = [ + self.edit_name, + self.edit_description, + self.html_filedata, + self.html_preview, + self.edit_notes, + self.select_sd_version, + self.taginfo, + self.edit_activation_text, + self.slider_preferred_weight, + row_random_prompt, + random_prompt, + ] + + self.button_edit\ + .click(fn=self.put_values_into_components, inputs=[self.edit_name_input], outputs=viewed_components)\ + .then(fn=lambda: gr.update(visible=True), inputs=[], outputs=[self.box]) + + edited_components = [ + self.edit_description, + self.select_sd_version, + self.edit_activation_text, + self.slider_preferred_weight, + self.edit_notes, + ] + + self.setup_save_handler(self.button_save, self.save_lora_user_metadata, edited_components) diff --git a/stable-diffusion-webui/extensions-builtin/Lora/ui_extra_networks_lora.py b/stable-diffusion-webui/extensions-builtin/Lora/ui_extra_networks_lora.py new file mode 100644 index 0000000000000000000000000000000000000000..ba930378242285e8342e6e8dcb73cf12009ed014 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/Lora/ui_extra_networks_lora.py @@ -0,0 +1,82 @@ +import os + +import network +import networks + +from modules import shared, ui_extra_networks +from modules.ui_extra_networks import quote_js +from ui_edit_user_metadata import LoraUserMetadataEditor + + +class ExtraNetworksPageLora(ui_extra_networks.ExtraNetworksPage): + def __init__(self): + super().__init__('Lora') + + def refresh(self): + networks.list_available_networks() + + def create_item(self, name, index=None, enable_filter=True): + lora_on_disk = networks.available_networks.get(name) + if lora_on_disk is None: + return + + path, ext = os.path.splitext(lora_on_disk.filename) + + alias = lora_on_disk.get_alias() + + item = { + "name": name, + "filename": lora_on_disk.filename, + "shorthash": lora_on_disk.shorthash, + "preview": self.find_preview(path), + "description": self.find_description(path), + "search_term": self.search_terms_from_path(lora_on_disk.filename) + " " + (lora_on_disk.hash or ""), + "local_preview": f"{path}.{shared.opts.samples_format}", + "metadata": lora_on_disk.metadata, + "sort_keys": {'default': index, **self.get_sort_keys(lora_on_disk.filename)}, + "sd_version": lora_on_disk.sd_version.name, + } + + self.read_user_metadata(item) + activation_text = item["user_metadata"].get("activation text") + preferred_weight = item["user_metadata"].get("preferred weight", 0.0) + item["prompt"] = quote_js(f"") + + if activation_text: + item["prompt"] += " + " + quote_js(" " + activation_text) + + sd_version = item["user_metadata"].get("sd version") + if sd_version in network.SdVersion.__members__: + item["sd_version"] = sd_version + sd_version = network.SdVersion[sd_version] + else: + sd_version = lora_on_disk.sd_version + + if shared.opts.lora_show_all or not enable_filter: + pass + elif sd_version == network.SdVersion.Unknown: + model_version = network.SdVersion.SDXL if shared.sd_model.is_sdxl else network.SdVersion.SD2 if shared.sd_model.is_sd2 else network.SdVersion.SD1 + if model_version.name in shared.opts.lora_hide_unknown_for_versions: + return None + elif shared.sd_model.is_sdxl and sd_version != network.SdVersion.SDXL: + return None + elif shared.sd_model.is_sd2 and sd_version != network.SdVersion.SD2: + return None + elif shared.sd_model.is_sd1 and sd_version != network.SdVersion.SD1: + return None + + return item + + def list_items(self): + # instantiate a list to protect against concurrent modification + names = list(networks.available_networks) + for index, name in enumerate(names): + item = self.create_item(name, index) + if item is not None: + yield item + + def allowed_directories_for_previews(self): + return [shared.cmd_opts.lora_dir, shared.cmd_opts.lyco_dir_backcompat] + + def create_user_metadata_editor(self, ui, tabname): + return LoraUserMetadataEditor(ui, tabname, self) diff --git a/stable-diffusion-webui/extensions-builtin/ScuNET/__pycache__/preload.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/ScuNET/__pycache__/preload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a5eda53e01afcabb8318342173b14ef7d3d5bfa Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/ScuNET/__pycache__/preload.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/ScuNET/__pycache__/scunet_model_arch.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/ScuNET/__pycache__/scunet_model_arch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67af6fcc729104d3050fc9b48cfdbf54252359e6 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/ScuNET/__pycache__/scunet_model_arch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/ScuNET/preload.py b/stable-diffusion-webui/extensions-builtin/ScuNET/preload.py new file mode 100644 index 0000000000000000000000000000000000000000..4ce82b1d4349b24192b1915d022ed4fda9f31e5c --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/ScuNET/preload.py @@ -0,0 +1,6 @@ +import os +from modules import paths + + +def preload(parser): + parser.add_argument("--scunet-models-path", type=str, help="Path to directory with ScuNET model file(s).", default=os.path.join(paths.models_path, 'ScuNET')) diff --git a/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/__pycache__/scunet_model.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/__pycache__/scunet_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..111f19fa8d848e470c20ecdf2afb758e786c4a99 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/__pycache__/scunet_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/scunet_model.py b/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/scunet_model.py new file mode 100644 index 0000000000000000000000000000000000000000..167d2f64b8e8ef1c506d89026e5d2ac8687d8098 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/scunet_model.py @@ -0,0 +1,144 @@ +import sys + +import PIL.Image +import numpy as np +import torch +from tqdm import tqdm + +import modules.upscaler +from modules import devices, modelloader, script_callbacks, errors +from scunet_model_arch import SCUNet + +from modules.modelloader import load_file_from_url +from modules.shared import opts + + +class UpscalerScuNET(modules.upscaler.Upscaler): + def __init__(self, dirname): + self.name = "ScuNET" + self.model_name = "ScuNET GAN" + self.model_name2 = "ScuNET PSNR" + self.model_url = "https://github.com/cszn/KAIR/releases/download/v1.0/scunet_color_real_gan.pth" + self.model_url2 = "https://github.com/cszn/KAIR/releases/download/v1.0/scunet_color_real_psnr.pth" + self.user_path = dirname + super().__init__() + model_paths = self.find_models(ext_filter=[".pth"]) + scalers = [] + add_model2 = True + for file in model_paths: + if file.startswith("http"): + name = self.model_name + else: + name = modelloader.friendly_name(file) + if name == self.model_name2 or file == self.model_url2: + add_model2 = False + try: + scaler_data = modules.upscaler.UpscalerData(name, file, self, 4) + scalers.append(scaler_data) + except Exception: + errors.report(f"Error loading ScuNET model: {file}", exc_info=True) + if add_model2: + scaler_data2 = modules.upscaler.UpscalerData(self.model_name2, self.model_url2, self) + scalers.append(scaler_data2) + self.scalers = scalers + + @staticmethod + @torch.no_grad() + def tiled_inference(img, model): + # test the image tile by tile + h, w = img.shape[2:] + tile = opts.SCUNET_tile + tile_overlap = opts.SCUNET_tile_overlap + if tile == 0: + return model(img) + + device = devices.get_device_for('scunet') + assert tile % 8 == 0, "tile size should be a multiple of window_size" + sf = 1 + + stride = tile - tile_overlap + h_idx_list = list(range(0, h - tile, stride)) + [h - tile] + w_idx_list = list(range(0, w - tile, stride)) + [w - tile] + E = torch.zeros(1, 3, h * sf, w * sf, dtype=img.dtype, device=device) + W = torch.zeros_like(E, dtype=devices.dtype, device=device) + + with tqdm(total=len(h_idx_list) * len(w_idx_list), desc="ScuNET tiles") as pbar: + for h_idx in h_idx_list: + + for w_idx in w_idx_list: + + in_patch = img[..., h_idx: h_idx + tile, w_idx: w_idx + tile] + + out_patch = model(in_patch) + out_patch_mask = torch.ones_like(out_patch) + + E[ + ..., h_idx * sf: (h_idx + tile) * sf, w_idx * sf: (w_idx + tile) * sf + ].add_(out_patch) + W[ + ..., h_idx * sf: (h_idx + tile) * sf, w_idx * sf: (w_idx + tile) * sf + ].add_(out_patch_mask) + pbar.update(1) + output = E.div_(W) + + return output + + def do_upscale(self, img: PIL.Image.Image, selected_file): + + devices.torch_gc() + + try: + model = self.load_model(selected_file) + except Exception as e: + print(f"ScuNET: Unable to load model from {selected_file}: {e}", file=sys.stderr) + return img + + device = devices.get_device_for('scunet') + tile = opts.SCUNET_tile + h, w = img.height, img.width + np_img = np.array(img) + np_img = np_img[:, :, ::-1] # RGB to BGR + np_img = np_img.transpose((2, 0, 1)) / 255 # HWC to CHW + torch_img = torch.from_numpy(np_img).float().unsqueeze(0).to(device) # type: ignore + + if tile > h or tile > w: + _img = torch.zeros(1, 3, max(h, tile), max(w, tile), dtype=torch_img.dtype, device=torch_img.device) + _img[:, :, :h, :w] = torch_img # pad image + torch_img = _img + + torch_output = self.tiled_inference(torch_img, model).squeeze(0) + torch_output = torch_output[:, :h * 1, :w * 1] # remove padding, if any + np_output: np.ndarray = torch_output.float().cpu().clamp_(0, 1).numpy() + del torch_img, torch_output + devices.torch_gc() + + output = np_output.transpose((1, 2, 0)) # CHW to HWC + output = output[:, :, ::-1] # BGR to RGB + return PIL.Image.fromarray((output * 255).astype(np.uint8)) + + def load_model(self, path: str): + device = devices.get_device_for('scunet') + if path.startswith("http"): + # TODO: this doesn't use `path` at all? + filename = load_file_from_url(self.model_url, model_dir=self.model_download_path, file_name=f"{self.name}.pth") + else: + filename = path + model = SCUNet(in_nc=3, config=[4, 4, 4, 4, 4, 4, 4], dim=64) + model.load_state_dict(torch.load(filename), strict=True) + model.eval() + for _, v in model.named_parameters(): + v.requires_grad = False + model = model.to(device) + + return model + + +def on_ui_settings(): + import gradio as gr + from modules import shared + + shared.opts.add_option("SCUNET_tile", shared.OptionInfo(256, "Tile size for SCUNET upscalers.", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}, section=('upscaling', "Upscaling")).info("0 = no tiling")) + shared.opts.add_option("SCUNET_tile_overlap", shared.OptionInfo(8, "Tile overlap for SCUNET upscalers.", gr.Slider, {"minimum": 0, "maximum": 64, "step": 1}, section=('upscaling', "Upscaling")).info("Low values = visible seam")) + + +script_callbacks.on_ui_settings(on_ui_settings) diff --git a/stable-diffusion-webui/extensions-builtin/ScuNET/scunet_model_arch.py b/stable-diffusion-webui/extensions-builtin/ScuNET/scunet_model_arch.py new file mode 100644 index 0000000000000000000000000000000000000000..b51a880629baa492ffcbebe682bcf101f06699a6 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/ScuNET/scunet_model_arch.py @@ -0,0 +1,268 @@ +# -*- coding: utf-8 -*- +import numpy as np +import torch +import torch.nn as nn +from einops import rearrange +from einops.layers.torch import Rearrange +from timm.models.layers import trunc_normal_, DropPath + + +class WMSA(nn.Module): + """ Self-attention module in Swin Transformer + """ + + def __init__(self, input_dim, output_dim, head_dim, window_size, type): + super(WMSA, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.head_dim = head_dim + self.scale = self.head_dim ** -0.5 + self.n_heads = input_dim // head_dim + self.window_size = window_size + self.type = type + self.embedding_layer = nn.Linear(self.input_dim, 3 * self.input_dim, bias=True) + + self.relative_position_params = nn.Parameter( + torch.zeros((2 * window_size - 1) * (2 * window_size - 1), self.n_heads)) + + self.linear = nn.Linear(self.input_dim, self.output_dim) + + trunc_normal_(self.relative_position_params, std=.02) + self.relative_position_params = torch.nn.Parameter( + self.relative_position_params.view(2 * window_size - 1, 2 * window_size - 1, self.n_heads).transpose(1, + 2).transpose( + 0, 1)) + + def generate_mask(self, h, w, p, shift): + """ generating the mask of SW-MSA + Args: + shift: shift parameters in CyclicShift. + Returns: + attn_mask: should be (1 1 w p p), + """ + # supporting square. + attn_mask = torch.zeros(h, w, p, p, p, p, dtype=torch.bool, device=self.relative_position_params.device) + if self.type == 'W': + return attn_mask + + s = p - shift + attn_mask[-1, :, :s, :, s:, :] = True + attn_mask[-1, :, s:, :, :s, :] = True + attn_mask[:, -1, :, :s, :, s:] = True + attn_mask[:, -1, :, s:, :, :s] = True + attn_mask = rearrange(attn_mask, 'w1 w2 p1 p2 p3 p4 -> 1 1 (w1 w2) (p1 p2) (p3 p4)') + return attn_mask + + def forward(self, x): + """ Forward pass of Window Multi-head Self-attention module. + Args: + x: input tensor with shape of [b h w c]; + attn_mask: attention mask, fill -inf where the value is True; + Returns: + output: tensor shape [b h w c] + """ + if self.type != 'W': + x = torch.roll(x, shifts=(-(self.window_size // 2), -(self.window_size // 2)), dims=(1, 2)) + + x = rearrange(x, 'b (w1 p1) (w2 p2) c -> b w1 w2 p1 p2 c', p1=self.window_size, p2=self.window_size) + h_windows = x.size(1) + w_windows = x.size(2) + # square validation + # assert h_windows == w_windows + + x = rearrange(x, 'b w1 w2 p1 p2 c -> b (w1 w2) (p1 p2) c', p1=self.window_size, p2=self.window_size) + qkv = self.embedding_layer(x) + q, k, v = rearrange(qkv, 'b nw np (threeh c) -> threeh b nw np c', c=self.head_dim).chunk(3, dim=0) + sim = torch.einsum('hbwpc,hbwqc->hbwpq', q, k) * self.scale + # Adding learnable relative embedding + sim = sim + rearrange(self.relative_embedding(), 'h p q -> h 1 1 p q') + # Using Attn Mask to distinguish different subwindows. + if self.type != 'W': + attn_mask = self.generate_mask(h_windows, w_windows, self.window_size, shift=self.window_size // 2) + sim = sim.masked_fill_(attn_mask, float("-inf")) + + probs = nn.functional.softmax(sim, dim=-1) + output = torch.einsum('hbwij,hbwjc->hbwic', probs, v) + output = rearrange(output, 'h b w p c -> b w p (h c)') + output = self.linear(output) + output = rearrange(output, 'b (w1 w2) (p1 p2) c -> b (w1 p1) (w2 p2) c', w1=h_windows, p1=self.window_size) + + if self.type != 'W': + output = torch.roll(output, shifts=(self.window_size // 2, self.window_size // 2), dims=(1, 2)) + + return output + + def relative_embedding(self): + cord = torch.tensor(np.array([[i, j] for i in range(self.window_size) for j in range(self.window_size)])) + relation = cord[:, None, :] - cord[None, :, :] + self.window_size - 1 + # negative is allowed + return self.relative_position_params[:, relation[:, :, 0].long(), relation[:, :, 1].long()] + + +class Block(nn.Module): + def __init__(self, input_dim, output_dim, head_dim, window_size, drop_path, type='W', input_resolution=None): + """ SwinTransformer Block + """ + super(Block, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + assert type in ['W', 'SW'] + self.type = type + if input_resolution <= window_size: + self.type = 'W' + + self.ln1 = nn.LayerNorm(input_dim) + self.msa = WMSA(input_dim, input_dim, head_dim, window_size, self.type) + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.ln2 = nn.LayerNorm(input_dim) + self.mlp = nn.Sequential( + nn.Linear(input_dim, 4 * input_dim), + nn.GELU(), + nn.Linear(4 * input_dim, output_dim), + ) + + def forward(self, x): + x = x + self.drop_path(self.msa(self.ln1(x))) + x = x + self.drop_path(self.mlp(self.ln2(x))) + return x + + +class ConvTransBlock(nn.Module): + def __init__(self, conv_dim, trans_dim, head_dim, window_size, drop_path, type='W', input_resolution=None): + """ SwinTransformer and Conv Block + """ + super(ConvTransBlock, self).__init__() + self.conv_dim = conv_dim + self.trans_dim = trans_dim + self.head_dim = head_dim + self.window_size = window_size + self.drop_path = drop_path + self.type = type + self.input_resolution = input_resolution + + assert self.type in ['W', 'SW'] + if self.input_resolution <= self.window_size: + self.type = 'W' + + self.trans_block = Block(self.trans_dim, self.trans_dim, self.head_dim, self.window_size, self.drop_path, + self.type, self.input_resolution) + self.conv1_1 = nn.Conv2d(self.conv_dim + self.trans_dim, self.conv_dim + self.trans_dim, 1, 1, 0, bias=True) + self.conv1_2 = nn.Conv2d(self.conv_dim + self.trans_dim, self.conv_dim + self.trans_dim, 1, 1, 0, bias=True) + + self.conv_block = nn.Sequential( + nn.Conv2d(self.conv_dim, self.conv_dim, 3, 1, 1, bias=False), + nn.ReLU(True), + nn.Conv2d(self.conv_dim, self.conv_dim, 3, 1, 1, bias=False) + ) + + def forward(self, x): + conv_x, trans_x = torch.split(self.conv1_1(x), (self.conv_dim, self.trans_dim), dim=1) + conv_x = self.conv_block(conv_x) + conv_x + trans_x = Rearrange('b c h w -> b h w c')(trans_x) + trans_x = self.trans_block(trans_x) + trans_x = Rearrange('b h w c -> b c h w')(trans_x) + res = self.conv1_2(torch.cat((conv_x, trans_x), dim=1)) + x = x + res + + return x + + +class SCUNet(nn.Module): + # def __init__(self, in_nc=3, config=[2, 2, 2, 2, 2, 2, 2], dim=64, drop_path_rate=0.0, input_resolution=256): + def __init__(self, in_nc=3, config=None, dim=64, drop_path_rate=0.0, input_resolution=256): + super(SCUNet, self).__init__() + if config is None: + config = [2, 2, 2, 2, 2, 2, 2] + self.config = config + self.dim = dim + self.head_dim = 32 + self.window_size = 8 + + # drop path rate for each layer + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(config))] + + self.m_head = [nn.Conv2d(in_nc, dim, 3, 1, 1, bias=False)] + + begin = 0 + self.m_down1 = [ConvTransBlock(dim // 2, dim // 2, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution) + for i in range(config[0])] + \ + [nn.Conv2d(dim, 2 * dim, 2, 2, 0, bias=False)] + + begin += config[0] + self.m_down2 = [ConvTransBlock(dim, dim, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution // 2) + for i in range(config[1])] + \ + [nn.Conv2d(2 * dim, 4 * dim, 2, 2, 0, bias=False)] + + begin += config[1] + self.m_down3 = [ConvTransBlock(2 * dim, 2 * dim, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution // 4) + for i in range(config[2])] + \ + [nn.Conv2d(4 * dim, 8 * dim, 2, 2, 0, bias=False)] + + begin += config[2] + self.m_body = [ConvTransBlock(4 * dim, 4 * dim, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution // 8) + for i in range(config[3])] + + begin += config[3] + self.m_up3 = [nn.ConvTranspose2d(8 * dim, 4 * dim, 2, 2, 0, bias=False), ] + \ + [ConvTransBlock(2 * dim, 2 * dim, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution // 4) + for i in range(config[4])] + + begin += config[4] + self.m_up2 = [nn.ConvTranspose2d(4 * dim, 2 * dim, 2, 2, 0, bias=False), ] + \ + [ConvTransBlock(dim, dim, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution // 2) + for i in range(config[5])] + + begin += config[5] + self.m_up1 = [nn.ConvTranspose2d(2 * dim, dim, 2, 2, 0, bias=False), ] + \ + [ConvTransBlock(dim // 2, dim // 2, self.head_dim, self.window_size, dpr[i + begin], + 'W' if not i % 2 else 'SW', input_resolution) + for i in range(config[6])] + + self.m_tail = [nn.Conv2d(dim, in_nc, 3, 1, 1, bias=False)] + + self.m_head = nn.Sequential(*self.m_head) + self.m_down1 = nn.Sequential(*self.m_down1) + self.m_down2 = nn.Sequential(*self.m_down2) + self.m_down3 = nn.Sequential(*self.m_down3) + self.m_body = nn.Sequential(*self.m_body) + self.m_up3 = nn.Sequential(*self.m_up3) + self.m_up2 = nn.Sequential(*self.m_up2) + self.m_up1 = nn.Sequential(*self.m_up1) + self.m_tail = nn.Sequential(*self.m_tail) + # self.apply(self._init_weights) + + def forward(self, x0): + + h, w = x0.size()[-2:] + paddingBottom = int(np.ceil(h / 64) * 64 - h) + paddingRight = int(np.ceil(w / 64) * 64 - w) + x0 = nn.ReplicationPad2d((0, paddingRight, 0, paddingBottom))(x0) + + x1 = self.m_head(x0) + x2 = self.m_down1(x1) + x3 = self.m_down2(x2) + x4 = self.m_down3(x3) + x = self.m_body(x4) + x = self.m_up3(x + x4) + x = self.m_up2(x + x3) + x = self.m_up1(x + x2) + x = self.m_tail(x + x1) + + x = x[..., :h, :w] + + return x + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/preload.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/preload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdf83b250fefbe69b9805ccba7e3fe3a7aee1d60 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/preload.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/swinir_model_arch.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/swinir_model_arch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44543ed2c754d26820f3e3fe5f6c86a6fe02f033 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/swinir_model_arch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/swinir_model_arch_v2.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/swinir_model_arch_v2.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edb1721c8781474047e4b13858d0c15f6d84b9ee Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/SwinIR/__pycache__/swinir_model_arch_v2.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/preload.py b/stable-diffusion-webui/extensions-builtin/SwinIR/preload.py new file mode 100644 index 0000000000000000000000000000000000000000..e912c6402bc80faa797cf2e95183101fb9a10286 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/SwinIR/preload.py @@ -0,0 +1,6 @@ +import os +from modules import paths + + +def preload(parser): + parser.add_argument("--swinir-models-path", type=str, help="Path to directory with SwinIR model file(s).", default=os.path.join(paths.models_path, 'SwinIR')) diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/__pycache__/swinir_model.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/__pycache__/swinir_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c90261eed9c6f41c162d4ed6ed1557f71c3bba7b Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/__pycache__/swinir_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/swinir_model.py b/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/swinir_model.py new file mode 100644 index 0000000000000000000000000000000000000000..ae0d0e6a8ea04f3054c1e8e5baefd2f76b57f246 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/swinir_model.py @@ -0,0 +1,192 @@ +import sys +import platform + +import numpy as np +import torch +from PIL import Image +from tqdm import tqdm + +from modules import modelloader, devices, script_callbacks, shared +from modules.shared import opts, state +from swinir_model_arch import SwinIR +from swinir_model_arch_v2 import Swin2SR +from modules.upscaler import Upscaler, UpscalerData + +SWINIR_MODEL_URL = "https://github.com/JingyunLiang/SwinIR/releases/download/v0.0/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth" + +device_swinir = devices.get_device_for('swinir') + + +class UpscalerSwinIR(Upscaler): + def __init__(self, dirname): + self._cached_model = None # keep the model when SWIN_torch_compile is on to prevent re-compile every runs + self._cached_model_config = None # to clear '_cached_model' when changing model (v1/v2) or settings + self.name = "SwinIR" + self.model_url = SWINIR_MODEL_URL + self.model_name = "SwinIR 4x" + self.user_path = dirname + super().__init__() + scalers = [] + model_files = self.find_models(ext_filter=[".pt", ".pth"]) + for model in model_files: + if model.startswith("http"): + name = self.model_name + else: + name = modelloader.friendly_name(model) + model_data = UpscalerData(name, model, self) + scalers.append(model_data) + self.scalers = scalers + + def do_upscale(self, img, model_file): + use_compile = hasattr(opts, 'SWIN_torch_compile') and opts.SWIN_torch_compile \ + and int(torch.__version__.split('.')[0]) >= 2 and platform.system() != "Windows" + current_config = (model_file, opts.SWIN_tile) + + if use_compile and self._cached_model_config == current_config: + model = self._cached_model + else: + self._cached_model = None + try: + model = self.load_model(model_file) + except Exception as e: + print(f"Failed loading SwinIR model {model_file}: {e}", file=sys.stderr) + return img + model = model.to(device_swinir, dtype=devices.dtype) + if use_compile: + model = torch.compile(model) + self._cached_model = model + self._cached_model_config = current_config + img = upscale(img, model) + devices.torch_gc() + return img + + def load_model(self, path, scale=4): + if path.startswith("http"): + filename = modelloader.load_file_from_url( + url=path, + model_dir=self.model_download_path, + file_name=f"{self.model_name.replace(' ', '_')}.pth", + ) + else: + filename = path + if filename.endswith(".v2.pth"): + model = Swin2SR( + upscale=scale, + in_chans=3, + img_size=64, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler="nearest+conv", + resi_connection="1conv", + ) + params = None + else: + model = SwinIR( + upscale=scale, + in_chans=3, + img_size=64, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6, 6, 6, 6], + embed_dim=240, + num_heads=[8, 8, 8, 8, 8, 8, 8, 8, 8], + mlp_ratio=2, + upsampler="nearest+conv", + resi_connection="3conv", + ) + params = "params_ema" + + pretrained_model = torch.load(filename) + if params is not None: + model.load_state_dict(pretrained_model[params], strict=True) + else: + model.load_state_dict(pretrained_model, strict=True) + return model + + +def upscale( + img, + model, + tile=None, + tile_overlap=None, + window_size=8, + scale=4, +): + tile = tile or opts.SWIN_tile + tile_overlap = tile_overlap or opts.SWIN_tile_overlap + + + img = np.array(img) + img = img[:, :, ::-1] + img = np.moveaxis(img, 2, 0) / 255 + img = torch.from_numpy(img).float() + img = img.unsqueeze(0).to(device_swinir, dtype=devices.dtype) + with torch.no_grad(), devices.autocast(): + _, _, h_old, w_old = img.size() + h_pad = (h_old // window_size + 1) * window_size - h_old + w_pad = (w_old // window_size + 1) * window_size - w_old + img = torch.cat([img, torch.flip(img, [2])], 2)[:, :, : h_old + h_pad, :] + img = torch.cat([img, torch.flip(img, [3])], 3)[:, :, :, : w_old + w_pad] + output = inference(img, model, tile, tile_overlap, window_size, scale) + output = output[..., : h_old * scale, : w_old * scale] + output = output.data.squeeze().float().cpu().clamp_(0, 1).numpy() + if output.ndim == 3: + output = np.transpose( + output[[2, 1, 0], :, :], (1, 2, 0) + ) # CHW-RGB to HCW-BGR + output = (output * 255.0).round().astype(np.uint8) # float32 to uint8 + return Image.fromarray(output, "RGB") + + +def inference(img, model, tile, tile_overlap, window_size, scale): + # test the image tile by tile + b, c, h, w = img.size() + tile = min(tile, h, w) + assert tile % window_size == 0, "tile size should be a multiple of window_size" + sf = scale + + stride = tile - tile_overlap + h_idx_list = list(range(0, h - tile, stride)) + [h - tile] + w_idx_list = list(range(0, w - tile, stride)) + [w - tile] + E = torch.zeros(b, c, h * sf, w * sf, dtype=devices.dtype, device=device_swinir).type_as(img) + W = torch.zeros_like(E, dtype=devices.dtype, device=device_swinir) + + with tqdm(total=len(h_idx_list) * len(w_idx_list), desc="SwinIR tiles") as pbar: + for h_idx in h_idx_list: + if state.interrupted or state.skipped: + break + + for w_idx in w_idx_list: + if state.interrupted or state.skipped: + break + + in_patch = img[..., h_idx: h_idx + tile, w_idx: w_idx + tile] + out_patch = model(in_patch) + out_patch_mask = torch.ones_like(out_patch) + + E[ + ..., h_idx * sf: (h_idx + tile) * sf, w_idx * sf: (w_idx + tile) * sf + ].add_(out_patch) + W[ + ..., h_idx * sf: (h_idx + tile) * sf, w_idx * sf: (w_idx + tile) * sf + ].add_(out_patch_mask) + pbar.update(1) + output = E.div_(W) + + return output + + +def on_ui_settings(): + import gradio as gr + + shared.opts.add_option("SWIN_tile", shared.OptionInfo(192, "Tile size for all SwinIR.", gr.Slider, {"minimum": 16, "maximum": 512, "step": 16}, section=('upscaling', "Upscaling"))) + shared.opts.add_option("SWIN_tile_overlap", shared.OptionInfo(8, "Tile overlap, in pixels for SwinIR. Low values = visible seam.", gr.Slider, {"minimum": 0, "maximum": 48, "step": 1}, section=('upscaling', "Upscaling"))) + if int(torch.__version__.split('.')[0]) >= 2 and platform.system() != "Windows": # torch.compile() require pytorch 2.0 or above, and not on Windows + shared.opts.add_option("SWIN_torch_compile", shared.OptionInfo(False, "Use torch.compile to accelerate SwinIR.", gr.Checkbox, {"interactive": True}, section=('upscaling', "Upscaling")).info("Takes longer on first run")) + + +script_callbacks.on_ui_settings(on_ui_settings) diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/swinir_model_arch.py b/stable-diffusion-webui/extensions-builtin/SwinIR/swinir_model_arch.py new file mode 100644 index 0000000000000000000000000000000000000000..93b9327473a6e77c3a3dc6a7743e932c9083a996 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/SwinIR/swinir_model_arch.py @@ -0,0 +1,867 @@ +# ----------------------------------------------------------------------------------- +# SwinIR: Image Restoration Using Swin Transformer, https://arxiv.org/abs/2108.10257 +# Originally Written by Ze Liu, Modified by Jingyun Liang. +# ----------------------------------------------------------------------------------- + +import math +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as checkpoint +from timm.models.layers import DropPath, to_2tuple, trunc_normal_ + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +def window_partition(x, window_size): + """ + Args: + x: (B, H, W, C) + window_size (int): window size + + Returns: + windows: (num_windows*B, window_size, window_size, C) + """ + B, H, W, C = x.shape + x = x.view(B, H // window_size, window_size, W // window_size, window_size, C) + windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C) + return windows + + +def window_reverse(windows, window_size, H, W): + """ + Args: + windows: (num_windows*B, window_size, window_size, C) + window_size (int): Window size + H (int): Height of image + W (int): Width of image + + Returns: + x: (B, H, W, C) + """ + B = int(windows.shape[0] / (H * W / window_size / window_size)) + x = windows.view(B, H // window_size, W // window_size, window_size, window_size, -1) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) + return x + + +class WindowAttention(nn.Module): + r""" Window based multi-head self attention (W-MSA) module with relative position bias. + It supports both of shifted and non-shifted window. + + Args: + dim (int): Number of input channels. + window_size (tuple[int]): The height and width of the window. + num_heads (int): Number of attention heads. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set + attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0 + proj_drop (float, optional): Dropout ratio of output. Default: 0.0 + """ + + def __init__(self, dim, window_size, num_heads, qkv_bias=True, qk_scale=None, attn_drop=0., proj_drop=0.): + + super().__init__() + self.dim = dim + self.window_size = window_size # Wh, Ww + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = qk_scale or head_dim ** -0.5 + + # define a parameter table of relative position bias + self.relative_position_bias_table = nn.Parameter( + torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads)) # 2*Wh-1 * 2*Ww-1, nH + + # get pair-wise relative position index for each token inside the window + coords_h = torch.arange(self.window_size[0]) + coords_w = torch.arange(self.window_size[1]) + coords = torch.stack(torch.meshgrid([coords_h, coords_w])) # 2, Wh, Ww + coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww + relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :] # 2, Wh*Ww, Wh*Ww + relative_coords = relative_coords.permute(1, 2, 0).contiguous() # Wh*Ww, Wh*Ww, 2 + relative_coords[:, :, 0] += self.window_size[0] - 1 # shift to start from 0 + relative_coords[:, :, 1] += self.window_size[1] - 1 + relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 + relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww + self.register_buffer("relative_position_index", relative_position_index) + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + + self.proj_drop = nn.Dropout(proj_drop) + + trunc_normal_(self.relative_position_bias_table, std=.02) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x, mask=None): + """ + Args: + x: input features with shape of (num_windows*B, N, C) + mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None + """ + B_, N, C = x.shape + qkv = self.qkv(x).reshape(B_, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple) + + q = q * self.scale + attn = (q @ k.transpose(-2, -1)) + + relative_position_bias = self.relative_position_bias_table[self.relative_position_index.view(-1)].view( + self.window_size[0] * self.window_size[1], self.window_size[0] * self.window_size[1], -1) # Wh*Ww,Wh*Ww,nH + relative_position_bias = relative_position_bias.permute(2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww + attn = attn + relative_position_bias.unsqueeze(0) + + if mask is not None: + nW = mask.shape[0] + attn = attn.view(B_ // nW, nW, self.num_heads, N, N) + mask.unsqueeze(1).unsqueeze(0) + attn = attn.view(-1, self.num_heads, N, N) + attn = self.softmax(attn) + else: + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B_, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + def extra_repr(self) -> str: + return f'dim={self.dim}, window_size={self.window_size}, num_heads={self.num_heads}' + + def flops(self, N): + # calculate flops for 1 window with token length of N + flops = 0 + # qkv = self.qkv(x) + flops += N * self.dim * 3 * self.dim + # attn = (q @ k.transpose(-2, -1)) + flops += self.num_heads * N * (self.dim // self.num_heads) * N + # x = (attn @ v) + flops += self.num_heads * N * N * (self.dim // self.num_heads) + # x = self.proj(x) + flops += N * self.dim * self.dim + return flops + + +class SwinTransformerBlock(nn.Module): + r""" Swin Transformer Block. + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + num_heads (int): Number of attention heads. + window_size (int): Window size. + shift_size (int): Shift size for SW-MSA. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float, optional): Stochastic depth rate. Default: 0.0 + act_layer (nn.Module, optional): Activation layer. Default: nn.GELU + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + """ + + def __init__(self, dim, input_resolution, num_heads, window_size=7, shift_size=0, + mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0., drop_path=0., + act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.num_heads = num_heads + self.window_size = window_size + self.shift_size = shift_size + self.mlp_ratio = mlp_ratio + if min(self.input_resolution) <= self.window_size: + # if window size is larger than input resolution, we don't partition windows + self.shift_size = 0 + self.window_size = min(self.input_resolution) + assert 0 <= self.shift_size < self.window_size, "shift_size must in 0-window_size" + + self.norm1 = norm_layer(dim) + self.attn = WindowAttention( + dim, window_size=to_2tuple(self.window_size), num_heads=num_heads, + qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + if self.shift_size > 0: + attn_mask = self.calculate_mask(self.input_resolution) + else: + attn_mask = None + + self.register_buffer("attn_mask", attn_mask) + + def calculate_mask(self, x_size): + # calculate attention mask for SW-MSA + H, W = x_size + img_mask = torch.zeros((1, H, W, 1)) # 1 H W 1 + h_slices = (slice(0, -self.window_size), + slice(-self.window_size, -self.shift_size), + slice(-self.shift_size, None)) + w_slices = (slice(0, -self.window_size), + slice(-self.window_size, -self.shift_size), + slice(-self.shift_size, None)) + cnt = 0 + for h in h_slices: + for w in w_slices: + img_mask[:, h, w, :] = cnt + cnt += 1 + + mask_windows = window_partition(img_mask, self.window_size) # nW, window_size, window_size, 1 + mask_windows = mask_windows.view(-1, self.window_size * self.window_size) + attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) + attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0)) + + return attn_mask + + def forward(self, x, x_size): + H, W = x_size + B, L, C = x.shape + # assert L == H * W, "input feature has wrong size" + + shortcut = x + x = self.norm1(x) + x = x.view(B, H, W, C) + + # cyclic shift + if self.shift_size > 0: + shifted_x = torch.roll(x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2)) + else: + shifted_x = x + + # partition windows + x_windows = window_partition(shifted_x, self.window_size) # nW*B, window_size, window_size, C + x_windows = x_windows.view(-1, self.window_size * self.window_size, C) # nW*B, window_size*window_size, C + + # W-MSA/SW-MSA (to be compatible for testing on images whose shapes are the multiple of window size + if self.input_resolution == x_size: + attn_windows = self.attn(x_windows, mask=self.attn_mask) # nW*B, window_size*window_size, C + else: + attn_windows = self.attn(x_windows, mask=self.calculate_mask(x_size).to(x.device)) + + # merge windows + attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C) + shifted_x = window_reverse(attn_windows, self.window_size, H, W) # B H' W' C + + # reverse cyclic shift + if self.shift_size > 0: + x = torch.roll(shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2)) + else: + x = shifted_x + x = x.view(B, H * W, C) + + # FFN + x = shortcut + self.drop_path(x) + x = x + self.drop_path(self.mlp(self.norm2(x))) + + return x + + def extra_repr(self) -> str: + return f"dim={self.dim}, input_resolution={self.input_resolution}, num_heads={self.num_heads}, " \ + f"window_size={self.window_size}, shift_size={self.shift_size}, mlp_ratio={self.mlp_ratio}" + + def flops(self): + flops = 0 + H, W = self.input_resolution + # norm1 + flops += self.dim * H * W + # W-MSA/SW-MSA + nW = H * W / self.window_size / self.window_size + flops += nW * self.attn.flops(self.window_size * self.window_size) + # mlp + flops += 2 * H * W * self.dim * self.dim * self.mlp_ratio + # norm2 + flops += self.dim * H * W + return flops + + +class PatchMerging(nn.Module): + r""" Patch Merging Layer. + + Args: + input_resolution (tuple[int]): Resolution of input feature. + dim (int): Number of input channels. + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + """ + + def __init__(self, input_resolution, dim, norm_layer=nn.LayerNorm): + super().__init__() + self.input_resolution = input_resolution + self.dim = dim + self.reduction = nn.Linear(4 * dim, 2 * dim, bias=False) + self.norm = norm_layer(4 * dim) + + def forward(self, x): + """ + x: B, H*W, C + """ + H, W = self.input_resolution + B, L, C = x.shape + assert L == H * W, "input feature has wrong size" + assert H % 2 == 0 and W % 2 == 0, f"x size ({H}*{W}) are not even." + + x = x.view(B, H, W, C) + + x0 = x[:, 0::2, 0::2, :] # B H/2 W/2 C + x1 = x[:, 1::2, 0::2, :] # B H/2 W/2 C + x2 = x[:, 0::2, 1::2, :] # B H/2 W/2 C + x3 = x[:, 1::2, 1::2, :] # B H/2 W/2 C + x = torch.cat([x0, x1, x2, x3], -1) # B H/2 W/2 4*C + x = x.view(B, -1, 4 * C) # B H/2*W/2 4*C + + x = self.norm(x) + x = self.reduction(x) + + return x + + def extra_repr(self) -> str: + return f"input_resolution={self.input_resolution}, dim={self.dim}" + + def flops(self): + H, W = self.input_resolution + flops = H * W * self.dim + flops += (H // 2) * (W // 2) * 4 * self.dim * 2 * self.dim + return flops + + +class BasicLayer(nn.Module): + """ A basic Swin Transformer layer for one stage. + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0 + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. + """ + + def __init__(self, dim, input_resolution, depth, num_heads, window_size, + mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., norm_layer=nn.LayerNorm, downsample=None, use_checkpoint=False): + + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.depth = depth + self.use_checkpoint = use_checkpoint + + # build blocks + self.blocks = nn.ModuleList([ + SwinTransformerBlock(dim=dim, input_resolution=input_resolution, + num_heads=num_heads, window_size=window_size, + shift_size=0 if (i % 2 == 0) else window_size // 2, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop, attn_drop=attn_drop, + drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path, + norm_layer=norm_layer) + for i in range(depth)]) + + # patch merging layer + if downsample is not None: + self.downsample = downsample(input_resolution, dim=dim, norm_layer=norm_layer) + else: + self.downsample = None + + def forward(self, x, x_size): + for blk in self.blocks: + if self.use_checkpoint: + x = checkpoint.checkpoint(blk, x, x_size) + else: + x = blk(x, x_size) + if self.downsample is not None: + x = self.downsample(x) + return x + + def extra_repr(self) -> str: + return f"dim={self.dim}, input_resolution={self.input_resolution}, depth={self.depth}" + + def flops(self): + flops = 0 + for blk in self.blocks: + flops += blk.flops() + if self.downsample is not None: + flops += self.downsample.flops() + return flops + + +class RSTB(nn.Module): + """Residual Swin Transformer Block (RSTB). + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0 + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. + img_size: Input image size. + patch_size: Patch size. + resi_connection: The convolutional block before residual connection. + """ + + def __init__(self, dim, input_resolution, depth, num_heads, window_size, + mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., norm_layer=nn.LayerNorm, downsample=None, use_checkpoint=False, + img_size=224, patch_size=4, resi_connection='1conv'): + super(RSTB, self).__init__() + + self.dim = dim + self.input_resolution = input_resolution + + self.residual_group = BasicLayer(dim=dim, + input_resolution=input_resolution, + depth=depth, + num_heads=num_heads, + window_size=window_size, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop, attn_drop=attn_drop, + drop_path=drop_path, + norm_layer=norm_layer, + downsample=downsample, + use_checkpoint=use_checkpoint) + + if resi_connection == '1conv': + self.conv = nn.Conv2d(dim, dim, 3, 1, 1) + elif resi_connection == '3conv': + # to save parameters and memory + self.conv = nn.Sequential(nn.Conv2d(dim, dim // 4, 3, 1, 1), nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(dim // 4, dim // 4, 1, 1, 0), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(dim // 4, dim, 3, 1, 1)) + + self.patch_embed = PatchEmbed( + img_size=img_size, patch_size=patch_size, in_chans=0, embed_dim=dim, + norm_layer=None) + + self.patch_unembed = PatchUnEmbed( + img_size=img_size, patch_size=patch_size, in_chans=0, embed_dim=dim, + norm_layer=None) + + def forward(self, x, x_size): + return self.patch_embed(self.conv(self.patch_unembed(self.residual_group(x, x_size), x_size))) + x + + def flops(self): + flops = 0 + flops += self.residual_group.flops() + H, W = self.input_resolution + flops += H * W * self.dim * self.dim * 9 + flops += self.patch_embed.flops() + flops += self.patch_unembed.flops() + + return flops + + +class PatchEmbed(nn.Module): + r""" Image to Patch Embedding + + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. Default: 96. + norm_layer (nn.Module, optional): Normalization layer. Default: None + """ + + def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [img_size[0] // patch_size[0], img_size[1] // patch_size[1]] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + if norm_layer is not None: + self.norm = norm_layer(embed_dim) + else: + self.norm = None + + def forward(self, x): + x = x.flatten(2).transpose(1, 2) # B Ph*Pw C + if self.norm is not None: + x = self.norm(x) + return x + + def flops(self): + flops = 0 + H, W = self.img_size + if self.norm is not None: + flops += H * W * self.embed_dim + return flops + + +class PatchUnEmbed(nn.Module): + r""" Image to Patch Unembedding + + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. Default: 96. + norm_layer (nn.Module, optional): Normalization layer. Default: None + """ + + def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [img_size[0] // patch_size[0], img_size[1] // patch_size[1]] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + def forward(self, x, x_size): + B, HW, C = x.shape + x = x.transpose(1, 2).view(B, self.embed_dim, x_size[0], x_size[1]) # B Ph*Pw C + return x + + def flops(self): + flops = 0 + return flops + + +class Upsample(nn.Sequential): + """Upsample module. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + """ + + def __init__(self, scale, num_feat): + m = [] + if (scale & (scale - 1)) == 0: # scale = 2^n + for _ in range(int(math.log(scale, 2))): + m.append(nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(2)) + elif scale == 3: + m.append(nn.Conv2d(num_feat, 9 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(3)) + else: + raise ValueError(f'scale {scale} is not supported. ' 'Supported scales: 2^n and 3.') + super(Upsample, self).__init__(*m) + + +class UpsampleOneStep(nn.Sequential): + """UpsampleOneStep module (the difference with Upsample is that it always only has 1conv + 1pixelshuffle) + Used in lightweight SR to save parameters. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + + """ + + def __init__(self, scale, num_feat, num_out_ch, input_resolution=None): + self.num_feat = num_feat + self.input_resolution = input_resolution + m = [] + m.append(nn.Conv2d(num_feat, (scale ** 2) * num_out_ch, 3, 1, 1)) + m.append(nn.PixelShuffle(scale)) + super(UpsampleOneStep, self).__init__(*m) + + def flops(self): + H, W = self.input_resolution + flops = H * W * self.num_feat * 3 * 9 + return flops + + +class SwinIR(nn.Module): + r""" SwinIR + A PyTorch impl of : `SwinIR: Image Restoration Using Swin Transformer`, based on Swin Transformer. + + Args: + img_size (int | tuple(int)): Input image size. Default 64 + patch_size (int | tuple(int)): Patch size. Default: 1 + in_chans (int): Number of input image channels. Default: 3 + embed_dim (int): Patch embedding dimension. Default: 96 + depths (tuple(int)): Depth of each Swin Transformer layer. + num_heads (tuple(int)): Number of attention heads in different layers. + window_size (int): Window size. Default: 7 + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4 + qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True + qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. Default: None + drop_rate (float): Dropout rate. Default: 0 + attn_drop_rate (float): Attention dropout rate. Default: 0 + drop_path_rate (float): Stochastic depth rate. Default: 0.1 + norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm. + ape (bool): If True, add absolute position embedding to the patch embedding. Default: False + patch_norm (bool): If True, add normalization after patch embedding. Default: True + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False + upscale: Upscale factor. 2/3/4/8 for image SR, 1 for denoising and compress artifact reduction + img_range: Image range. 1. or 255. + upsampler: The reconstruction reconstruction module. 'pixelshuffle'/'pixelshuffledirect'/'nearest+conv'/None + resi_connection: The convolutional block before residual connection. '1conv'/'3conv' + """ + + def __init__(self, img_size=64, patch_size=1, in_chans=3, + embed_dim=96, depths=(6, 6, 6, 6), num_heads=(6, 6, 6, 6), + window_size=7, mlp_ratio=4., qkv_bias=True, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.1, + norm_layer=nn.LayerNorm, ape=False, patch_norm=True, + use_checkpoint=False, upscale=2, img_range=1., upsampler='', resi_connection='1conv', + **kwargs): + super(SwinIR, self).__init__() + num_in_ch = in_chans + num_out_ch = in_chans + num_feat = 64 + self.img_range = img_range + if in_chans == 3: + rgb_mean = (0.4488, 0.4371, 0.4040) + self.mean = torch.Tensor(rgb_mean).view(1, 3, 1, 1) + else: + self.mean = torch.zeros(1, 1, 1, 1) + self.upscale = upscale + self.upsampler = upsampler + self.window_size = window_size + + ##################################################################################################### + ################################### 1, shallow feature extraction ################################### + self.conv_first = nn.Conv2d(num_in_ch, embed_dim, 3, 1, 1) + + ##################################################################################################### + ################################### 2, deep feature extraction ###################################### + self.num_layers = len(depths) + self.embed_dim = embed_dim + self.ape = ape + self.patch_norm = patch_norm + self.num_features = embed_dim + self.mlp_ratio = mlp_ratio + + # split image into non-overlapping patches + self.patch_embed = PatchEmbed( + img_size=img_size, patch_size=patch_size, in_chans=embed_dim, embed_dim=embed_dim, + norm_layer=norm_layer if self.patch_norm else None) + num_patches = self.patch_embed.num_patches + patches_resolution = self.patch_embed.patches_resolution + self.patches_resolution = patches_resolution + + # merge non-overlapping patches into image + self.patch_unembed = PatchUnEmbed( + img_size=img_size, patch_size=patch_size, in_chans=embed_dim, embed_dim=embed_dim, + norm_layer=norm_layer if self.patch_norm else None) + + # absolute position embedding + if self.ape: + self.absolute_pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim)) + trunc_normal_(self.absolute_pos_embed, std=.02) + + self.pos_drop = nn.Dropout(p=drop_rate) + + # stochastic depth + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule + + # build Residual Swin Transformer blocks (RSTB) + self.layers = nn.ModuleList() + for i_layer in range(self.num_layers): + layer = RSTB(dim=embed_dim, + input_resolution=(patches_resolution[0], + patches_resolution[1]), + depth=depths[i_layer], + num_heads=num_heads[i_layer], + window_size=window_size, + mlp_ratio=self.mlp_ratio, + qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])], # no impact on SR results + norm_layer=norm_layer, + downsample=None, + use_checkpoint=use_checkpoint, + img_size=img_size, + patch_size=patch_size, + resi_connection=resi_connection + + ) + self.layers.append(layer) + self.norm = norm_layer(self.num_features) + + # build the last conv layer in deep feature extraction + if resi_connection == '1conv': + self.conv_after_body = nn.Conv2d(embed_dim, embed_dim, 3, 1, 1) + elif resi_connection == '3conv': + # to save parameters and memory + self.conv_after_body = nn.Sequential(nn.Conv2d(embed_dim, embed_dim // 4, 3, 1, 1), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(embed_dim // 4, embed_dim // 4, 1, 1, 0), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(embed_dim // 4, embed_dim, 3, 1, 1)) + + ##################################################################################################### + ################################ 3, high quality image reconstruction ################################ + if self.upsampler == 'pixelshuffle': + # for classical SR + self.conv_before_upsample = nn.Sequential(nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.upsample = Upsample(upscale, num_feat) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + elif self.upsampler == 'pixelshuffledirect': + # for lightweight SR (to save parameters) + self.upsample = UpsampleOneStep(upscale, embed_dim, num_out_ch, + (patches_resolution[0], patches_resolution[1])) + elif self.upsampler == 'nearest+conv': + # for real-world SR (less artifacts) + self.conv_before_upsample = nn.Sequential(nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.conv_up1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + if self.upscale == 4: + self.conv_up2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_hr = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True) + else: + # for image denoising and JPEG compression artifact reduction + self.conv_last = nn.Conv2d(embed_dim, num_out_ch, 3, 1, 1) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + @torch.jit.ignore + def no_weight_decay(self): + return {'absolute_pos_embed'} + + @torch.jit.ignore + def no_weight_decay_keywords(self): + return {'relative_position_bias_table'} + + def check_image_size(self, x): + _, _, h, w = x.size() + mod_pad_h = (self.window_size - h % self.window_size) % self.window_size + mod_pad_w = (self.window_size - w % self.window_size) % self.window_size + x = F.pad(x, (0, mod_pad_w, 0, mod_pad_h), 'reflect') + return x + + def forward_features(self, x): + x_size = (x.shape[2], x.shape[3]) + x = self.patch_embed(x) + if self.ape: + x = x + self.absolute_pos_embed + x = self.pos_drop(x) + + for layer in self.layers: + x = layer(x, x_size) + + x = self.norm(x) # B L C + x = self.patch_unembed(x, x_size) + + return x + + def forward(self, x): + H, W = x.shape[2:] + x = self.check_image_size(x) + + self.mean = self.mean.type_as(x) + x = (x - self.mean) * self.img_range + + if self.upsampler == 'pixelshuffle': + # for classical SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + x = self.conv_last(self.upsample(x)) + elif self.upsampler == 'pixelshuffledirect': + # for lightweight SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.upsample(x) + elif self.upsampler == 'nearest+conv': + # for real-world SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + x = self.lrelu(self.conv_up1(torch.nn.functional.interpolate(x, scale_factor=2, mode='nearest'))) + if self.upscale == 4: + x = self.lrelu(self.conv_up2(torch.nn.functional.interpolate(x, scale_factor=2, mode='nearest'))) + x = self.conv_last(self.lrelu(self.conv_hr(x))) + else: + # for image denoising and JPEG compression artifact reduction + x_first = self.conv_first(x) + res = self.conv_after_body(self.forward_features(x_first)) + x_first + x = x + self.conv_last(res) + + x = x / self.img_range + self.mean + + return x[:, :, :H*self.upscale, :W*self.upscale] + + def flops(self): + flops = 0 + H, W = self.patches_resolution + flops += H * W * 3 * self.embed_dim * 9 + flops += self.patch_embed.flops() + for layer in self.layers: + flops += layer.flops() + flops += H * W * 3 * self.embed_dim * self.embed_dim + flops += self.upsample.flops() + return flops + + +if __name__ == '__main__': + upscale = 4 + window_size = 8 + height = (1024 // upscale // window_size + 1) * window_size + width = (720 // upscale // window_size + 1) * window_size + model = SwinIR(upscale=2, img_size=(height, width), + window_size=window_size, img_range=1., depths=[6, 6, 6, 6], + embed_dim=60, num_heads=[6, 6, 6, 6], mlp_ratio=2, upsampler='pixelshuffledirect') + print(model) + print(height, width, model.flops() / 1e9) + + x = torch.randn((1, 3, height, width)) + x = model(x) + print(x.shape) diff --git a/stable-diffusion-webui/extensions-builtin/SwinIR/swinir_model_arch_v2.py b/stable-diffusion-webui/extensions-builtin/SwinIR/swinir_model_arch_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..59219f69a9a7f8365628cb2f4f57f5cd0104147a --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/SwinIR/swinir_model_arch_v2.py @@ -0,0 +1,1017 @@ +# ----------------------------------------------------------------------------------- +# Swin2SR: Swin2SR: SwinV2 Transformer for Compressed Image Super-Resolution and Restoration, https://arxiv.org/abs/ +# Written by Conde and Choi et al. +# ----------------------------------------------------------------------------------- + +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as checkpoint +from timm.models.layers import DropPath, to_2tuple, trunc_normal_ + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +def window_partition(x, window_size): + """ + Args: + x: (B, H, W, C) + window_size (int): window size + Returns: + windows: (num_windows*B, window_size, window_size, C) + """ + B, H, W, C = x.shape + x = x.view(B, H // window_size, window_size, W // window_size, window_size, C) + windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C) + return windows + + +def window_reverse(windows, window_size, H, W): + """ + Args: + windows: (num_windows*B, window_size, window_size, C) + window_size (int): Window size + H (int): Height of image + W (int): Width of image + Returns: + x: (B, H, W, C) + """ + B = int(windows.shape[0] / (H * W / window_size / window_size)) + x = windows.view(B, H // window_size, W // window_size, window_size, window_size, -1) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) + return x + +class WindowAttention(nn.Module): + r""" Window based multi-head self attention (W-MSA) module with relative position bias. + It supports both of shifted and non-shifted window. + Args: + dim (int): Number of input channels. + window_size (tuple[int]): The height and width of the window. + num_heads (int): Number of attention heads. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0 + proj_drop (float, optional): Dropout ratio of output. Default: 0.0 + pretrained_window_size (tuple[int]): The height and width of the window in pre-training. + """ + + def __init__(self, dim, window_size, num_heads, qkv_bias=True, attn_drop=0., proj_drop=0., + pretrained_window_size=(0, 0)): + + super().__init__() + self.dim = dim + self.window_size = window_size # Wh, Ww + self.pretrained_window_size = pretrained_window_size + self.num_heads = num_heads + + self.logit_scale = nn.Parameter(torch.log(10 * torch.ones((num_heads, 1, 1))), requires_grad=True) + + # mlp to generate continuous relative position bias + self.cpb_mlp = nn.Sequential(nn.Linear(2, 512, bias=True), + nn.ReLU(inplace=True), + nn.Linear(512, num_heads, bias=False)) + + # get relative_coords_table + relative_coords_h = torch.arange(-(self.window_size[0] - 1), self.window_size[0], dtype=torch.float32) + relative_coords_w = torch.arange(-(self.window_size[1] - 1), self.window_size[1], dtype=torch.float32) + relative_coords_table = torch.stack( + torch.meshgrid([relative_coords_h, + relative_coords_w])).permute(1, 2, 0).contiguous().unsqueeze(0) # 1, 2*Wh-1, 2*Ww-1, 2 + if pretrained_window_size[0] > 0: + relative_coords_table[:, :, :, 0] /= (pretrained_window_size[0] - 1) + relative_coords_table[:, :, :, 1] /= (pretrained_window_size[1] - 1) + else: + relative_coords_table[:, :, :, 0] /= (self.window_size[0] - 1) + relative_coords_table[:, :, :, 1] /= (self.window_size[1] - 1) + relative_coords_table *= 8 # normalize to -8, 8 + relative_coords_table = torch.sign(relative_coords_table) * torch.log2( + torch.abs(relative_coords_table) + 1.0) / np.log2(8) + + self.register_buffer("relative_coords_table", relative_coords_table) + + # get pair-wise relative position index for each token inside the window + coords_h = torch.arange(self.window_size[0]) + coords_w = torch.arange(self.window_size[1]) + coords = torch.stack(torch.meshgrid([coords_h, coords_w])) # 2, Wh, Ww + coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww + relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :] # 2, Wh*Ww, Wh*Ww + relative_coords = relative_coords.permute(1, 2, 0).contiguous() # Wh*Ww, Wh*Ww, 2 + relative_coords[:, :, 0] += self.window_size[0] - 1 # shift to start from 0 + relative_coords[:, :, 1] += self.window_size[1] - 1 + relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 + relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww + self.register_buffer("relative_position_index", relative_position_index) + + self.qkv = nn.Linear(dim, dim * 3, bias=False) + if qkv_bias: + self.q_bias = nn.Parameter(torch.zeros(dim)) + self.v_bias = nn.Parameter(torch.zeros(dim)) + else: + self.q_bias = None + self.v_bias = None + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x, mask=None): + """ + Args: + x: input features with shape of (num_windows*B, N, C) + mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None + """ + B_, N, C = x.shape + qkv_bias = None + if self.q_bias is not None: + qkv_bias = torch.cat((self.q_bias, torch.zeros_like(self.v_bias, requires_grad=False), self.v_bias)) + qkv = F.linear(input=x, weight=self.qkv.weight, bias=qkv_bias) + qkv = qkv.reshape(B_, N, 3, self.num_heads, -1).permute(2, 0, 3, 1, 4) + q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple) + + # cosine attention + attn = (F.normalize(q, dim=-1) @ F.normalize(k, dim=-1).transpose(-2, -1)) + logit_scale = torch.clamp(self.logit_scale, max=torch.log(torch.tensor(1. / 0.01)).to(self.logit_scale.device)).exp() + attn = attn * logit_scale + + relative_position_bias_table = self.cpb_mlp(self.relative_coords_table).view(-1, self.num_heads) + relative_position_bias = relative_position_bias_table[self.relative_position_index.view(-1)].view( + self.window_size[0] * self.window_size[1], self.window_size[0] * self.window_size[1], -1) # Wh*Ww,Wh*Ww,nH + relative_position_bias = relative_position_bias.permute(2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww + relative_position_bias = 16 * torch.sigmoid(relative_position_bias) + attn = attn + relative_position_bias.unsqueeze(0) + + if mask is not None: + nW = mask.shape[0] + attn = attn.view(B_ // nW, nW, self.num_heads, N, N) + mask.unsqueeze(1).unsqueeze(0) + attn = attn.view(-1, self.num_heads, N, N) + attn = self.softmax(attn) + else: + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B_, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + def extra_repr(self) -> str: + return f'dim={self.dim}, window_size={self.window_size}, ' \ + f'pretrained_window_size={self.pretrained_window_size}, num_heads={self.num_heads}' + + def flops(self, N): + # calculate flops for 1 window with token length of N + flops = 0 + # qkv = self.qkv(x) + flops += N * self.dim * 3 * self.dim + # attn = (q @ k.transpose(-2, -1)) + flops += self.num_heads * N * (self.dim // self.num_heads) * N + # x = (attn @ v) + flops += self.num_heads * N * N * (self.dim // self.num_heads) + # x = self.proj(x) + flops += N * self.dim * self.dim + return flops + +class SwinTransformerBlock(nn.Module): + r""" Swin Transformer Block. + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resulotion. + num_heads (int): Number of attention heads. + window_size (int): Window size. + shift_size (int): Shift size for SW-MSA. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float, optional): Stochastic depth rate. Default: 0.0 + act_layer (nn.Module, optional): Activation layer. Default: nn.GELU + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + pretrained_window_size (int): Window size in pre-training. + """ + + def __init__(self, dim, input_resolution, num_heads, window_size=7, shift_size=0, + mlp_ratio=4., qkv_bias=True, drop=0., attn_drop=0., drop_path=0., + act_layer=nn.GELU, norm_layer=nn.LayerNorm, pretrained_window_size=0): + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.num_heads = num_heads + self.window_size = window_size + self.shift_size = shift_size + self.mlp_ratio = mlp_ratio + if min(self.input_resolution) <= self.window_size: + # if window size is larger than input resolution, we don't partition windows + self.shift_size = 0 + self.window_size = min(self.input_resolution) + assert 0 <= self.shift_size < self.window_size, "shift_size must in 0-window_size" + + self.norm1 = norm_layer(dim) + self.attn = WindowAttention( + dim, window_size=to_2tuple(self.window_size), num_heads=num_heads, + qkv_bias=qkv_bias, attn_drop=attn_drop, proj_drop=drop, + pretrained_window_size=to_2tuple(pretrained_window_size)) + + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + if self.shift_size > 0: + attn_mask = self.calculate_mask(self.input_resolution) + else: + attn_mask = None + + self.register_buffer("attn_mask", attn_mask) + + def calculate_mask(self, x_size): + # calculate attention mask for SW-MSA + H, W = x_size + img_mask = torch.zeros((1, H, W, 1)) # 1 H W 1 + h_slices = (slice(0, -self.window_size), + slice(-self.window_size, -self.shift_size), + slice(-self.shift_size, None)) + w_slices = (slice(0, -self.window_size), + slice(-self.window_size, -self.shift_size), + slice(-self.shift_size, None)) + cnt = 0 + for h in h_slices: + for w in w_slices: + img_mask[:, h, w, :] = cnt + cnt += 1 + + mask_windows = window_partition(img_mask, self.window_size) # nW, window_size, window_size, 1 + mask_windows = mask_windows.view(-1, self.window_size * self.window_size) + attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) + attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0)) + + return attn_mask + + def forward(self, x, x_size): + H, W = x_size + B, L, C = x.shape + #assert L == H * W, "input feature has wrong size" + + shortcut = x + x = x.view(B, H, W, C) + + # cyclic shift + if self.shift_size > 0: + shifted_x = torch.roll(x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2)) + else: + shifted_x = x + + # partition windows + x_windows = window_partition(shifted_x, self.window_size) # nW*B, window_size, window_size, C + x_windows = x_windows.view(-1, self.window_size * self.window_size, C) # nW*B, window_size*window_size, C + + # W-MSA/SW-MSA (to be compatible for testing on images whose shapes are the multiple of window size + if self.input_resolution == x_size: + attn_windows = self.attn(x_windows, mask=self.attn_mask) # nW*B, window_size*window_size, C + else: + attn_windows = self.attn(x_windows, mask=self.calculate_mask(x_size).to(x.device)) + + # merge windows + attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C) + shifted_x = window_reverse(attn_windows, self.window_size, H, W) # B H' W' C + + # reverse cyclic shift + if self.shift_size > 0: + x = torch.roll(shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2)) + else: + x = shifted_x + x = x.view(B, H * W, C) + x = shortcut + self.drop_path(self.norm1(x)) + + # FFN + x = x + self.drop_path(self.norm2(self.mlp(x))) + + return x + + def extra_repr(self) -> str: + return f"dim={self.dim}, input_resolution={self.input_resolution}, num_heads={self.num_heads}, " \ + f"window_size={self.window_size}, shift_size={self.shift_size}, mlp_ratio={self.mlp_ratio}" + + def flops(self): + flops = 0 + H, W = self.input_resolution + # norm1 + flops += self.dim * H * W + # W-MSA/SW-MSA + nW = H * W / self.window_size / self.window_size + flops += nW * self.attn.flops(self.window_size * self.window_size) + # mlp + flops += 2 * H * W * self.dim * self.dim * self.mlp_ratio + # norm2 + flops += self.dim * H * W + return flops + +class PatchMerging(nn.Module): + r""" Patch Merging Layer. + Args: + input_resolution (tuple[int]): Resolution of input feature. + dim (int): Number of input channels. + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + """ + + def __init__(self, input_resolution, dim, norm_layer=nn.LayerNorm): + super().__init__() + self.input_resolution = input_resolution + self.dim = dim + self.reduction = nn.Linear(4 * dim, 2 * dim, bias=False) + self.norm = norm_layer(2 * dim) + + def forward(self, x): + """ + x: B, H*W, C + """ + H, W = self.input_resolution + B, L, C = x.shape + assert L == H * W, "input feature has wrong size" + assert H % 2 == 0 and W % 2 == 0, f"x size ({H}*{W}) are not even." + + x = x.view(B, H, W, C) + + x0 = x[:, 0::2, 0::2, :] # B H/2 W/2 C + x1 = x[:, 1::2, 0::2, :] # B H/2 W/2 C + x2 = x[:, 0::2, 1::2, :] # B H/2 W/2 C + x3 = x[:, 1::2, 1::2, :] # B H/2 W/2 C + x = torch.cat([x0, x1, x2, x3], -1) # B H/2 W/2 4*C + x = x.view(B, -1, 4 * C) # B H/2*W/2 4*C + + x = self.reduction(x) + x = self.norm(x) + + return x + + def extra_repr(self) -> str: + return f"input_resolution={self.input_resolution}, dim={self.dim}" + + def flops(self): + H, W = self.input_resolution + flops = (H // 2) * (W // 2) * 4 * self.dim * 2 * self.dim + flops += H * W * self.dim // 2 + return flops + +class BasicLayer(nn.Module): + """ A basic Swin Transformer layer for one stage. + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0 + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. + pretrained_window_size (int): Local window size in pre-training. + """ + + def __init__(self, dim, input_resolution, depth, num_heads, window_size, + mlp_ratio=4., qkv_bias=True, drop=0., attn_drop=0., + drop_path=0., norm_layer=nn.LayerNorm, downsample=None, use_checkpoint=False, + pretrained_window_size=0): + + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.depth = depth + self.use_checkpoint = use_checkpoint + + # build blocks + self.blocks = nn.ModuleList([ + SwinTransformerBlock(dim=dim, input_resolution=input_resolution, + num_heads=num_heads, window_size=window_size, + shift_size=0 if (i % 2 == 0) else window_size // 2, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + drop=drop, attn_drop=attn_drop, + drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path, + norm_layer=norm_layer, + pretrained_window_size=pretrained_window_size) + for i in range(depth)]) + + # patch merging layer + if downsample is not None: + self.downsample = downsample(input_resolution, dim=dim, norm_layer=norm_layer) + else: + self.downsample = None + + def forward(self, x, x_size): + for blk in self.blocks: + if self.use_checkpoint: + x = checkpoint.checkpoint(blk, x, x_size) + else: + x = blk(x, x_size) + if self.downsample is not None: + x = self.downsample(x) + return x + + def extra_repr(self) -> str: + return f"dim={self.dim}, input_resolution={self.input_resolution}, depth={self.depth}" + + def flops(self): + flops = 0 + for blk in self.blocks: + flops += blk.flops() + if self.downsample is not None: + flops += self.downsample.flops() + return flops + + def _init_respostnorm(self): + for blk in self.blocks: + nn.init.constant_(blk.norm1.bias, 0) + nn.init.constant_(blk.norm1.weight, 0) + nn.init.constant_(blk.norm2.bias, 0) + nn.init.constant_(blk.norm2.weight, 0) + +class PatchEmbed(nn.Module): + r""" Image to Patch Embedding + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. Default: 96. + norm_layer (nn.Module, optional): Normalization layer. Default: None + """ + + def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [img_size[0] // patch_size[0], img_size[1] // patch_size[1]] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + if norm_layer is not None: + self.norm = norm_layer(embed_dim) + else: + self.norm = None + + def forward(self, x): + B, C, H, W = x.shape + # FIXME look at relaxing size constraints + # assert H == self.img_size[0] and W == self.img_size[1], + # f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})." + x = self.proj(x).flatten(2).transpose(1, 2) # B Ph*Pw C + if self.norm is not None: + x = self.norm(x) + return x + + def flops(self): + Ho, Wo = self.patches_resolution + flops = Ho * Wo * self.embed_dim * self.in_chans * (self.patch_size[0] * self.patch_size[1]) + if self.norm is not None: + flops += Ho * Wo * self.embed_dim + return flops + +class RSTB(nn.Module): + """Residual Swin Transformer Block (RSTB). + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0 + norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm + downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. + img_size: Input image size. + patch_size: Patch size. + resi_connection: The convolutional block before residual connection. + """ + + def __init__(self, dim, input_resolution, depth, num_heads, window_size, + mlp_ratio=4., qkv_bias=True, drop=0., attn_drop=0., + drop_path=0., norm_layer=nn.LayerNorm, downsample=None, use_checkpoint=False, + img_size=224, patch_size=4, resi_connection='1conv'): + super(RSTB, self).__init__() + + self.dim = dim + self.input_resolution = input_resolution + + self.residual_group = BasicLayer(dim=dim, + input_resolution=input_resolution, + depth=depth, + num_heads=num_heads, + window_size=window_size, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + drop=drop, attn_drop=attn_drop, + drop_path=drop_path, + norm_layer=norm_layer, + downsample=downsample, + use_checkpoint=use_checkpoint) + + if resi_connection == '1conv': + self.conv = nn.Conv2d(dim, dim, 3, 1, 1) + elif resi_connection == '3conv': + # to save parameters and memory + self.conv = nn.Sequential(nn.Conv2d(dim, dim // 4, 3, 1, 1), nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(dim // 4, dim // 4, 1, 1, 0), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(dim // 4, dim, 3, 1, 1)) + + self.patch_embed = PatchEmbed( + img_size=img_size, patch_size=patch_size, in_chans=dim, embed_dim=dim, + norm_layer=None) + + self.patch_unembed = PatchUnEmbed( + img_size=img_size, patch_size=patch_size, in_chans=dim, embed_dim=dim, + norm_layer=None) + + def forward(self, x, x_size): + return self.patch_embed(self.conv(self.patch_unembed(self.residual_group(x, x_size), x_size))) + x + + def flops(self): + flops = 0 + flops += self.residual_group.flops() + H, W = self.input_resolution + flops += H * W * self.dim * self.dim * 9 + flops += self.patch_embed.flops() + flops += self.patch_unembed.flops() + + return flops + +class PatchUnEmbed(nn.Module): + r""" Image to Patch Unembedding + + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. Default: 96. + norm_layer (nn.Module, optional): Normalization layer. Default: None + """ + + def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [img_size[0] // patch_size[0], img_size[1] // patch_size[1]] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + def forward(self, x, x_size): + B, HW, C = x.shape + x = x.transpose(1, 2).view(B, self.embed_dim, x_size[0], x_size[1]) # B Ph*Pw C + return x + + def flops(self): + flops = 0 + return flops + + +class Upsample(nn.Sequential): + """Upsample module. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + """ + + def __init__(self, scale, num_feat): + m = [] + if (scale & (scale - 1)) == 0: # scale = 2^n + for _ in range(int(math.log(scale, 2))): + m.append(nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(2)) + elif scale == 3: + m.append(nn.Conv2d(num_feat, 9 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(3)) + else: + raise ValueError(f'scale {scale} is not supported. ' 'Supported scales: 2^n and 3.') + super(Upsample, self).__init__(*m) + +class Upsample_hf(nn.Sequential): + """Upsample module. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + """ + + def __init__(self, scale, num_feat): + m = [] + if (scale & (scale - 1)) == 0: # scale = 2^n + for _ in range(int(math.log(scale, 2))): + m.append(nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(2)) + elif scale == 3: + m.append(nn.Conv2d(num_feat, 9 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(3)) + else: + raise ValueError(f'scale {scale} is not supported. ' 'Supported scales: 2^n and 3.') + super(Upsample_hf, self).__init__(*m) + + +class UpsampleOneStep(nn.Sequential): + """UpsampleOneStep module (the difference with Upsample is that it always only has 1conv + 1pixelshuffle) + Used in lightweight SR to save parameters. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + + """ + + def __init__(self, scale, num_feat, num_out_ch, input_resolution=None): + self.num_feat = num_feat + self.input_resolution = input_resolution + m = [] + m.append(nn.Conv2d(num_feat, (scale ** 2) * num_out_ch, 3, 1, 1)) + m.append(nn.PixelShuffle(scale)) + super(UpsampleOneStep, self).__init__(*m) + + def flops(self): + H, W = self.input_resolution + flops = H * W * self.num_feat * 3 * 9 + return flops + + + +class Swin2SR(nn.Module): + r""" Swin2SR + A PyTorch impl of : `Swin2SR: SwinV2 Transformer for Compressed Image Super-Resolution and Restoration`. + + Args: + img_size (int | tuple(int)): Input image size. Default 64 + patch_size (int | tuple(int)): Patch size. Default: 1 + in_chans (int): Number of input image channels. Default: 3 + embed_dim (int): Patch embedding dimension. Default: 96 + depths (tuple(int)): Depth of each Swin Transformer layer. + num_heads (tuple(int)): Number of attention heads in different layers. + window_size (int): Window size. Default: 7 + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4 + qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True + drop_rate (float): Dropout rate. Default: 0 + attn_drop_rate (float): Attention dropout rate. Default: 0 + drop_path_rate (float): Stochastic depth rate. Default: 0.1 + norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm. + ape (bool): If True, add absolute position embedding to the patch embedding. Default: False + patch_norm (bool): If True, add normalization after patch embedding. Default: True + use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False + upscale: Upscale factor. 2/3/4/8 for image SR, 1 for denoising and compress artifact reduction + img_range: Image range. 1. or 255. + upsampler: The reconstruction reconstruction module. 'pixelshuffle'/'pixelshuffledirect'/'nearest+conv'/None + resi_connection: The convolutional block before residual connection. '1conv'/'3conv' + """ + + def __init__(self, img_size=64, patch_size=1, in_chans=3, + embed_dim=96, depths=(6, 6, 6, 6), num_heads=(6, 6, 6, 6), + window_size=7, mlp_ratio=4., qkv_bias=True, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.1, + norm_layer=nn.LayerNorm, ape=False, patch_norm=True, + use_checkpoint=False, upscale=2, img_range=1., upsampler='', resi_connection='1conv', + **kwargs): + super(Swin2SR, self).__init__() + num_in_ch = in_chans + num_out_ch = in_chans + num_feat = 64 + self.img_range = img_range + if in_chans == 3: + rgb_mean = (0.4488, 0.4371, 0.4040) + self.mean = torch.Tensor(rgb_mean).view(1, 3, 1, 1) + else: + self.mean = torch.zeros(1, 1, 1, 1) + self.upscale = upscale + self.upsampler = upsampler + self.window_size = window_size + + ##################################################################################################### + ################################### 1, shallow feature extraction ################################### + self.conv_first = nn.Conv2d(num_in_ch, embed_dim, 3, 1, 1) + + ##################################################################################################### + ################################### 2, deep feature extraction ###################################### + self.num_layers = len(depths) + self.embed_dim = embed_dim + self.ape = ape + self.patch_norm = patch_norm + self.num_features = embed_dim + self.mlp_ratio = mlp_ratio + + # split image into non-overlapping patches + self.patch_embed = PatchEmbed( + img_size=img_size, patch_size=patch_size, in_chans=embed_dim, embed_dim=embed_dim, + norm_layer=norm_layer if self.patch_norm else None) + num_patches = self.patch_embed.num_patches + patches_resolution = self.patch_embed.patches_resolution + self.patches_resolution = patches_resolution + + # merge non-overlapping patches into image + self.patch_unembed = PatchUnEmbed( + img_size=img_size, patch_size=patch_size, in_chans=embed_dim, embed_dim=embed_dim, + norm_layer=norm_layer if self.patch_norm else None) + + # absolute position embedding + if self.ape: + self.absolute_pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim)) + trunc_normal_(self.absolute_pos_embed, std=.02) + + self.pos_drop = nn.Dropout(p=drop_rate) + + # stochastic depth + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule + + # build Residual Swin Transformer blocks (RSTB) + self.layers = nn.ModuleList() + for i_layer in range(self.num_layers): + layer = RSTB(dim=embed_dim, + input_resolution=(patches_resolution[0], + patches_resolution[1]), + depth=depths[i_layer], + num_heads=num_heads[i_layer], + window_size=window_size, + mlp_ratio=self.mlp_ratio, + qkv_bias=qkv_bias, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])], # no impact on SR results + norm_layer=norm_layer, + downsample=None, + use_checkpoint=use_checkpoint, + img_size=img_size, + patch_size=patch_size, + resi_connection=resi_connection + + ) + self.layers.append(layer) + + if self.upsampler == 'pixelshuffle_hf': + self.layers_hf = nn.ModuleList() + for i_layer in range(self.num_layers): + layer = RSTB(dim=embed_dim, + input_resolution=(patches_resolution[0], + patches_resolution[1]), + depth=depths[i_layer], + num_heads=num_heads[i_layer], + window_size=window_size, + mlp_ratio=self.mlp_ratio, + qkv_bias=qkv_bias, + drop=drop_rate, attn_drop=attn_drop_rate, + drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])], # no impact on SR results + norm_layer=norm_layer, + downsample=None, + use_checkpoint=use_checkpoint, + img_size=img_size, + patch_size=patch_size, + resi_connection=resi_connection + + ) + self.layers_hf.append(layer) + + self.norm = norm_layer(self.num_features) + + # build the last conv layer in deep feature extraction + if resi_connection == '1conv': + self.conv_after_body = nn.Conv2d(embed_dim, embed_dim, 3, 1, 1) + elif resi_connection == '3conv': + # to save parameters and memory + self.conv_after_body = nn.Sequential(nn.Conv2d(embed_dim, embed_dim // 4, 3, 1, 1), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(embed_dim // 4, embed_dim // 4, 1, 1, 0), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(embed_dim // 4, embed_dim, 3, 1, 1)) + + ##################################################################################################### + ################################ 3, high quality image reconstruction ################################ + if self.upsampler == 'pixelshuffle': + # for classical SR + self.conv_before_upsample = nn.Sequential(nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.upsample = Upsample(upscale, num_feat) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + elif self.upsampler == 'pixelshuffle_aux': + self.conv_bicubic = nn.Conv2d(num_in_ch, num_feat, 3, 1, 1) + self.conv_before_upsample = nn.Sequential( + nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.conv_aux = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + self.conv_after_aux = nn.Sequential( + nn.Conv2d(3, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.upsample = Upsample(upscale, num_feat) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + + elif self.upsampler == 'pixelshuffle_hf': + self.conv_before_upsample = nn.Sequential(nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.upsample = Upsample(upscale, num_feat) + self.upsample_hf = Upsample_hf(upscale, num_feat) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + self.conv_first_hf = nn.Sequential(nn.Conv2d(num_feat, embed_dim, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.conv_after_body_hf = nn.Conv2d(embed_dim, embed_dim, 3, 1, 1) + self.conv_before_upsample_hf = nn.Sequential( + nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.conv_last_hf = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + + elif self.upsampler == 'pixelshuffledirect': + # for lightweight SR (to save parameters) + self.upsample = UpsampleOneStep(upscale, embed_dim, num_out_ch, + (patches_resolution[0], patches_resolution[1])) + elif self.upsampler == 'nearest+conv': + # for real-world SR (less artifacts) + assert self.upscale == 4, 'only support x4 now.' + self.conv_before_upsample = nn.Sequential(nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.conv_up1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_up2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_hr = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True) + else: + # for image denoising and JPEG compression artifact reduction + self.conv_last = nn.Conv2d(embed_dim, num_out_ch, 3, 1, 1) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + @torch.jit.ignore + def no_weight_decay(self): + return {'absolute_pos_embed'} + + @torch.jit.ignore + def no_weight_decay_keywords(self): + return {'relative_position_bias_table'} + + def check_image_size(self, x): + _, _, h, w = x.size() + mod_pad_h = (self.window_size - h % self.window_size) % self.window_size + mod_pad_w = (self.window_size - w % self.window_size) % self.window_size + x = F.pad(x, (0, mod_pad_w, 0, mod_pad_h), 'reflect') + return x + + def forward_features(self, x): + x_size = (x.shape[2], x.shape[3]) + x = self.patch_embed(x) + if self.ape: + x = x + self.absolute_pos_embed + x = self.pos_drop(x) + + for layer in self.layers: + x = layer(x, x_size) + + x = self.norm(x) # B L C + x = self.patch_unembed(x, x_size) + + return x + + def forward_features_hf(self, x): + x_size = (x.shape[2], x.shape[3]) + x = self.patch_embed(x) + if self.ape: + x = x + self.absolute_pos_embed + x = self.pos_drop(x) + + for layer in self.layers_hf: + x = layer(x, x_size) + + x = self.norm(x) # B L C + x = self.patch_unembed(x, x_size) + + return x + + def forward(self, x): + H, W = x.shape[2:] + x = self.check_image_size(x) + + self.mean = self.mean.type_as(x) + x = (x - self.mean) * self.img_range + + if self.upsampler == 'pixelshuffle': + # for classical SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + x = self.conv_last(self.upsample(x)) + elif self.upsampler == 'pixelshuffle_aux': + bicubic = F.interpolate(x, size=(H * self.upscale, W * self.upscale), mode='bicubic', align_corners=False) + bicubic = self.conv_bicubic(bicubic) + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + aux = self.conv_aux(x) # b, 3, LR_H, LR_W + x = self.conv_after_aux(aux) + x = self.upsample(x)[:, :, :H * self.upscale, :W * self.upscale] + bicubic[:, :, :H * self.upscale, :W * self.upscale] + x = self.conv_last(x) + aux = aux / self.img_range + self.mean + elif self.upsampler == 'pixelshuffle_hf': + # for classical SR with HF + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x_before = self.conv_before_upsample(x) + x_out = self.conv_last(self.upsample(x_before)) + + x_hf = self.conv_first_hf(x_before) + x_hf = self.conv_after_body_hf(self.forward_features_hf(x_hf)) + x_hf + x_hf = self.conv_before_upsample_hf(x_hf) + x_hf = self.conv_last_hf(self.upsample_hf(x_hf)) + x = x_out + x_hf + x_hf = x_hf / self.img_range + self.mean + + elif self.upsampler == 'pixelshuffledirect': + # for lightweight SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.upsample(x) + elif self.upsampler == 'nearest+conv': + # for real-world SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + x = self.lrelu(self.conv_up1(torch.nn.functional.interpolate(x, scale_factor=2, mode='nearest'))) + x = self.lrelu(self.conv_up2(torch.nn.functional.interpolate(x, scale_factor=2, mode='nearest'))) + x = self.conv_last(self.lrelu(self.conv_hr(x))) + else: + # for image denoising and JPEG compression artifact reduction + x_first = self.conv_first(x) + res = self.conv_after_body(self.forward_features(x_first)) + x_first + x = x + self.conv_last(res) + + x = x / self.img_range + self.mean + if self.upsampler == "pixelshuffle_aux": + return x[:, :, :H*self.upscale, :W*self.upscale], aux + + elif self.upsampler == "pixelshuffle_hf": + x_out = x_out / self.img_range + self.mean + return x_out[:, :, :H*self.upscale, :W*self.upscale], x[:, :, :H*self.upscale, :W*self.upscale], x_hf[:, :, :H*self.upscale, :W*self.upscale] + + else: + return x[:, :, :H*self.upscale, :W*self.upscale] + + def flops(self): + flops = 0 + H, W = self.patches_resolution + flops += H * W * 3 * self.embed_dim * 9 + flops += self.patch_embed.flops() + for layer in self.layers: + flops += layer.flops() + flops += H * W * 3 * self.embed_dim * self.embed_dim + flops += self.upsample.flops() + return flops + + +if __name__ == '__main__': + upscale = 4 + window_size = 8 + height = (1024 // upscale // window_size + 1) * window_size + width = (720 // upscale // window_size + 1) * window_size + model = Swin2SR(upscale=2, img_size=(height, width), + window_size=window_size, img_range=1., depths=[6, 6, 6, 6], + embed_dim=60, num_heads=[6, 6, 6, 6], mlp_ratio=2, upsampler='pixelshuffledirect') + print(model) + print(height, width, model.flops() / 1e9) + + x = torch.randn((1, 3, height, width)) + x = model(x) + print(x.shape) diff --git a/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/javascript/zoom.js b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/javascript/zoom.js new file mode 100644 index 0000000000000000000000000000000000000000..45c7600ac5f81bc8c7b233162d73f6551c8b5e8d --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/javascript/zoom.js @@ -0,0 +1,962 @@ +onUiLoaded(async() => { + const elementIDs = { + img2imgTabs: "#mode_img2img .tab-nav", + inpaint: "#img2maskimg", + inpaintSketch: "#inpaint_sketch", + rangeGroup: "#img2img_column_size", + sketch: "#img2img_sketch" + }; + const tabNameToElementId = { + "Inpaint sketch": elementIDs.inpaintSketch, + "Inpaint": elementIDs.inpaint, + "Sketch": elementIDs.sketch + }; + + + // Helper functions + // Get active tab + + /** + * Waits for an element to be present in the DOM. + */ + const waitForElement = (id) => new Promise(resolve => { + const checkForElement = () => { + const element = document.querySelector(id); + if (element) return resolve(element); + setTimeout(checkForElement, 100); + }; + checkForElement(); + }); + + function getActiveTab(elements, all = false) { + const tabs = elements.img2imgTabs.querySelectorAll("button"); + + if (all) return tabs; + + for (let tab of tabs) { + if (tab.classList.contains("selected")) { + return tab; + } + } + } + + // Get tab ID + function getTabId(elements) { + const activeTab = getActiveTab(elements); + return tabNameToElementId[activeTab.innerText]; + } + + // Wait until opts loaded + async function waitForOpts() { + for (; ;) { + if (window.opts && Object.keys(window.opts).length) { + return window.opts; + } + await new Promise(resolve => setTimeout(resolve, 100)); + } + } + + // Detect whether the element has a horizontal scroll bar + function hasHorizontalScrollbar(element) { + return element.scrollWidth > element.clientWidth; + } + + // Function for defining the "Ctrl", "Shift" and "Alt" keys + function isModifierKey(event, key) { + switch (key) { + case "Ctrl": + return event.ctrlKey; + case "Shift": + return event.shiftKey; + case "Alt": + return event.altKey; + default: + return false; + } + } + + // Check if hotkey is valid + function isValidHotkey(value) { + const specialKeys = ["Ctrl", "Alt", "Shift", "Disable"]; + return ( + (typeof value === "string" && + value.length === 1 && + /[a-z]/i.test(value)) || + specialKeys.includes(value) + ); + } + + // Normalize hotkey + function normalizeHotkey(hotkey) { + return hotkey.length === 1 ? "Key" + hotkey.toUpperCase() : hotkey; + } + + // Format hotkey for display + function formatHotkeyForDisplay(hotkey) { + return hotkey.startsWith("Key") ? hotkey.slice(3) : hotkey; + } + + // Create hotkey configuration with the provided options + function createHotkeyConfig(defaultHotkeysConfig, hotkeysConfigOpts) { + const result = {}; // Resulting hotkey configuration + const usedKeys = new Set(); // Set of used hotkeys + + // Iterate through defaultHotkeysConfig keys + for (const key in defaultHotkeysConfig) { + const userValue = hotkeysConfigOpts[key]; // User-provided hotkey value + const defaultValue = defaultHotkeysConfig[key]; // Default hotkey value + + // Apply appropriate value for undefined, boolean, or object userValue + if ( + userValue === undefined || + typeof userValue === "boolean" || + typeof userValue === "object" || + userValue === "disable" + ) { + result[key] = + userValue === undefined ? defaultValue : userValue; + } else if (isValidHotkey(userValue)) { + const normalizedUserValue = normalizeHotkey(userValue); + + // Check for conflicting hotkeys + if (!usedKeys.has(normalizedUserValue)) { + usedKeys.add(normalizedUserValue); + result[key] = normalizedUserValue; + } else { + console.error( + `Hotkey: ${formatHotkeyForDisplay( + userValue + )} for ${key} is repeated and conflicts with another hotkey. The default hotkey is used: ${formatHotkeyForDisplay( + defaultValue + )}` + ); + result[key] = defaultValue; + } + } else { + console.error( + `Hotkey: ${formatHotkeyForDisplay( + userValue + )} for ${key} is not valid. The default hotkey is used: ${formatHotkeyForDisplay( + defaultValue + )}` + ); + result[key] = defaultValue; + } + } + + return result; + } + + // Disables functions in the config object based on the provided list of function names + function disableFunctions(config, disabledFunctions) { + // Bind the hasOwnProperty method to the functionMap object to avoid errors + const hasOwnProperty = + Object.prototype.hasOwnProperty.bind(functionMap); + + // Loop through the disabledFunctions array and disable the corresponding functions in the config object + disabledFunctions.forEach(funcName => { + if (hasOwnProperty(funcName)) { + const key = functionMap[funcName]; + config[key] = "disable"; + } + }); + + // Return the updated config object + return config; + } + + /** + * The restoreImgRedMask function displays a red mask around an image to indicate the aspect ratio. + * If the image display property is set to 'none', the mask breaks. To fix this, the function + * temporarily sets the display property to 'block' and then hides the mask again after 300 milliseconds + * to avoid breaking the canvas. Additionally, the function adjusts the mask to work correctly on + * very long images. + */ + function restoreImgRedMask(elements) { + const mainTabId = getTabId(elements); + + if (!mainTabId) return; + + const mainTab = gradioApp().querySelector(mainTabId); + const img = mainTab.querySelector("img"); + const imageARPreview = gradioApp().querySelector("#imageARPreview"); + + if (!img || !imageARPreview) return; + + imageARPreview.style.transform = ""; + if (parseFloat(mainTab.style.width) > 865) { + const transformString = mainTab.style.transform; + const scaleMatch = transformString.match( + /scale\(([-+]?[0-9]*\.?[0-9]+)\)/ + ); + let zoom = 1; // default zoom + + if (scaleMatch && scaleMatch[1]) { + zoom = Number(scaleMatch[1]); + } + + imageARPreview.style.transformOrigin = "0 0"; + imageARPreview.style.transform = `scale(${zoom})`; + } + + if (img.style.display !== "none") return; + + img.style.display = "block"; + + setTimeout(() => { + img.style.display = "none"; + }, 400); + } + + const hotkeysConfigOpts = await waitForOpts(); + + // Default config + const defaultHotkeysConfig = { + canvas_hotkey_zoom: "Alt", + canvas_hotkey_adjust: "Ctrl", + canvas_hotkey_reset: "KeyR", + canvas_hotkey_fullscreen: "KeyS", + canvas_hotkey_move: "KeyF", + canvas_hotkey_overlap: "KeyO", + canvas_disabled_functions: [], + canvas_show_tooltip: true, + canvas_auto_expand: true, + canvas_blur_prompt: false, + }; + + const functionMap = { + "Zoom": "canvas_hotkey_zoom", + "Adjust brush size": "canvas_hotkey_adjust", + "Moving canvas": "canvas_hotkey_move", + "Fullscreen": "canvas_hotkey_fullscreen", + "Reset Zoom": "canvas_hotkey_reset", + "Overlap": "canvas_hotkey_overlap" + }; + + // Loading the configuration from opts + const preHotkeysConfig = createHotkeyConfig( + defaultHotkeysConfig, + hotkeysConfigOpts + ); + + // Disable functions that are not needed by the user + const hotkeysConfig = disableFunctions( + preHotkeysConfig, + preHotkeysConfig.canvas_disabled_functions + ); + + let isMoving = false; + let mouseX, mouseY; + let activeElement; + + const elements = Object.fromEntries( + Object.keys(elementIDs).map(id => [ + id, + gradioApp().querySelector(elementIDs[id]) + ]) + ); + const elemData = {}; + + // Apply functionality to the range inputs. Restore redmask and correct for long images. + const rangeInputs = elements.rangeGroup ? + Array.from(elements.rangeGroup.querySelectorAll("input")) : + [ + gradioApp().querySelector("#img2img_width input[type='range']"), + gradioApp().querySelector("#img2img_height input[type='range']") + ]; + + for (const input of rangeInputs) { + input?.addEventListener("input", () => restoreImgRedMask(elements)); + } + + function applyZoomAndPan(elemId, isExtension = true) { + const targetElement = gradioApp().querySelector(elemId); + + if (!targetElement) { + console.log("Element not found"); + return; + } + + targetElement.style.transformOrigin = "0 0"; + + elemData[elemId] = { + zoom: 1, + panX: 0, + panY: 0 + }; + let fullScreenMode = false; + + // Create tooltip + function createTooltip() { + const toolTipElemnt = + targetElement.querySelector(".image-container"); + const tooltip = document.createElement("div"); + tooltip.className = "canvas-tooltip"; + + // Creating an item of information + const info = document.createElement("i"); + info.className = "canvas-tooltip-info"; + info.textContent = ""; + + // Create a container for the contents of the tooltip + const tooltipContent = document.createElement("div"); + tooltipContent.className = "canvas-tooltip-content"; + + // Define an array with hotkey information and their actions + const hotkeysInfo = [ + { + configKey: "canvas_hotkey_zoom", + action: "Zoom canvas", + keySuffix: " + wheel" + }, + { + configKey: "canvas_hotkey_adjust", + action: "Adjust brush size", + keySuffix: " + wheel" + }, + {configKey: "canvas_hotkey_reset", action: "Reset zoom"}, + { + configKey: "canvas_hotkey_fullscreen", + action: "Fullscreen mode" + }, + {configKey: "canvas_hotkey_move", action: "Move canvas"}, + {configKey: "canvas_hotkey_overlap", action: "Overlap"} + ]; + + // Create hotkeys array with disabled property based on the config values + const hotkeys = hotkeysInfo.map(info => { + const configValue = hotkeysConfig[info.configKey]; + const key = info.keySuffix ? + `${configValue}${info.keySuffix}` : + configValue.charAt(configValue.length - 1); + return { + key, + action: info.action, + disabled: configValue === "disable" + }; + }); + + for (const hotkey of hotkeys) { + if (hotkey.disabled) { + continue; + } + + const p = document.createElement("p"); + p.innerHTML = `${hotkey.key} - ${hotkey.action}`; + tooltipContent.appendChild(p); + } + + // Add information and content elements to the tooltip element + tooltip.appendChild(info); + tooltip.appendChild(tooltipContent); + + // Add a hint element to the target element + toolTipElemnt.appendChild(tooltip); + } + + //Show tool tip if setting enable + if (hotkeysConfig.canvas_show_tooltip) { + createTooltip(); + } + + // In the course of research, it was found that the tag img is very harmful when zooming and creates white canvases. This hack allows you to almost never think about this problem, it has no effect on webui. + function fixCanvas() { + const activeTab = getActiveTab(elements).textContent.trim(); + + if (activeTab !== "img2img") { + const img = targetElement.querySelector(`${elemId} img`); + + if (img && img.style.display !== "none") { + img.style.display = "none"; + img.style.visibility = "hidden"; + } + } + } + + // Reset the zoom level and pan position of the target element to their initial values + function resetZoom() { + elemData[elemId] = { + zoomLevel: 1, + panX: 0, + panY: 0 + }; + + if (isExtension) { + targetElement.style.overflow = "hidden"; + } + + targetElement.isZoomed = false; + + fixCanvas(); + targetElement.style.transform = `scale(${elemData[elemId].zoomLevel}) translate(${elemData[elemId].panX}px, ${elemData[elemId].panY}px)`; + + const canvas = gradioApp().querySelector( + `${elemId} canvas[key="interface"]` + ); + + toggleOverlap("off"); + fullScreenMode = false; + + const closeBtn = targetElement.querySelector("button[aria-label='Remove Image']"); + if (closeBtn) { + closeBtn.addEventListener("click", resetZoom); + } + + if (canvas && isExtension) { + const parentElement = targetElement.closest('[id^="component-"]'); + if ( + canvas && + parseFloat(canvas.style.width) > parentElement.offsetWidth && + parseFloat(targetElement.style.width) > parentElement.offsetWidth + ) { + fitToElement(); + return; + } + + } + + if ( + canvas && + !isExtension && + parseFloat(canvas.style.width) > 865 && + parseFloat(targetElement.style.width) > 865 + ) { + fitToElement(); + return; + } + + targetElement.style.width = ""; + } + + // Toggle the zIndex of the target element between two values, allowing it to overlap or be overlapped by other elements + function toggleOverlap(forced = "") { + const zIndex1 = "0"; + const zIndex2 = "998"; + + targetElement.style.zIndex = + targetElement.style.zIndex !== zIndex2 ? zIndex2 : zIndex1; + + if (forced === "off") { + targetElement.style.zIndex = zIndex1; + } else if (forced === "on") { + targetElement.style.zIndex = zIndex2; + } + } + + // Adjust the brush size based on the deltaY value from a mouse wheel event + function adjustBrushSize( + elemId, + deltaY, + withoutValue = false, + percentage = 5 + ) { + const input = + gradioApp().querySelector( + `${elemId} input[aria-label='Brush radius']` + ) || + gradioApp().querySelector( + `${elemId} button[aria-label="Use brush"]` + ); + + if (input) { + input.click(); + if (!withoutValue) { + const maxValue = + parseFloat(input.getAttribute("max")) || 100; + const changeAmount = maxValue * (percentage / 100); + const newValue = + parseFloat(input.value) + + (deltaY > 0 ? -changeAmount : changeAmount); + input.value = Math.min(Math.max(newValue, 0), maxValue); + input.dispatchEvent(new Event("change")); + } + } + } + + // Reset zoom when uploading a new image + const fileInput = gradioApp().querySelector( + `${elemId} input[type="file"][accept="image/*"].svelte-116rqfv` + ); + fileInput.addEventListener("click", resetZoom); + + // Update the zoom level and pan position of the target element based on the values of the zoomLevel, panX and panY variables + function updateZoom(newZoomLevel, mouseX, mouseY) { + newZoomLevel = Math.max(0.1, Math.min(newZoomLevel, 15)); + + elemData[elemId].panX += + mouseX - (mouseX * newZoomLevel) / elemData[elemId].zoomLevel; + elemData[elemId].panY += + mouseY - (mouseY * newZoomLevel) / elemData[elemId].zoomLevel; + + targetElement.style.transformOrigin = "0 0"; + targetElement.style.transform = `translate(${elemData[elemId].panX}px, ${elemData[elemId].panY}px) scale(${newZoomLevel})`; + + toggleOverlap("on"); + if (isExtension) { + targetElement.style.overflow = "visible"; + } + + return newZoomLevel; + } + + // Change the zoom level based on user interaction + function changeZoomLevel(operation, e) { + if (isModifierKey(e, hotkeysConfig.canvas_hotkey_zoom)) { + e.preventDefault(); + + let zoomPosX, zoomPosY; + let delta = 0.2; + if (elemData[elemId].zoomLevel > 7) { + delta = 0.9; + } else if (elemData[elemId].zoomLevel > 2) { + delta = 0.6; + } + + zoomPosX = e.clientX; + zoomPosY = e.clientY; + + fullScreenMode = false; + elemData[elemId].zoomLevel = updateZoom( + elemData[elemId].zoomLevel + + (operation === "+" ? delta : -delta), + zoomPosX - targetElement.getBoundingClientRect().left, + zoomPosY - targetElement.getBoundingClientRect().top + ); + + targetElement.isZoomed = true; + } + } + + /** + * This function fits the target element to the screen by calculating + * the required scale and offsets. It also updates the global variables + * zoomLevel, panX, and panY to reflect the new state. + */ + + function fitToElement() { + //Reset Zoom + targetElement.style.transform = `translate(${0}px, ${0}px) scale(${1})`; + + let parentElement; + + if (isExtension) { + parentElement = targetElement.closest('[id^="component-"]'); + } else { + parentElement = targetElement.parentElement; + } + + + // Get element and screen dimensions + const elementWidth = targetElement.offsetWidth; + const elementHeight = targetElement.offsetHeight; + + const screenWidth = parentElement.clientWidth; + const screenHeight = parentElement.clientHeight; + + // Get element's coordinates relative to the parent element + const elementRect = targetElement.getBoundingClientRect(); + const parentRect = parentElement.getBoundingClientRect(); + const elementX = elementRect.x - parentRect.x; + + // Calculate scale and offsets + const scaleX = screenWidth / elementWidth; + const scaleY = screenHeight / elementHeight; + const scale = Math.min(scaleX, scaleY); + + const transformOrigin = + window.getComputedStyle(targetElement).transformOrigin; + const [originX, originY] = transformOrigin.split(" "); + const originXValue = parseFloat(originX); + const originYValue = parseFloat(originY); + + const offsetX = + (screenWidth - elementWidth * scale) / 2 - + originXValue * (1 - scale); + const offsetY = + (screenHeight - elementHeight * scale) / 2.5 - + originYValue * (1 - scale); + + // Apply scale and offsets to the element + targetElement.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale})`; + + // Update global variables + elemData[elemId].zoomLevel = scale; + elemData[elemId].panX = offsetX; + elemData[elemId].panY = offsetY; + + fullScreenMode = false; + toggleOverlap("off"); + } + + /** + * This function fits the target element to the screen by calculating + * the required scale and offsets. It also updates the global variables + * zoomLevel, panX, and panY to reflect the new state. + */ + + // Fullscreen mode + function fitToScreen() { + const canvas = gradioApp().querySelector( + `${elemId} canvas[key="interface"]` + ); + + if (!canvas) return; + + if (canvas.offsetWidth > 862 || isExtension) { + targetElement.style.width = (canvas.offsetWidth + 2) + "px"; + } + + if (isExtension) { + targetElement.style.overflow = "visible"; + } + + if (fullScreenMode) { + resetZoom(); + fullScreenMode = false; + return; + } + + //Reset Zoom + targetElement.style.transform = `translate(${0}px, ${0}px) scale(${1})`; + + // Get scrollbar width to right-align the image + const scrollbarWidth = + window.innerWidth - document.documentElement.clientWidth; + + // Get element and screen dimensions + const elementWidth = targetElement.offsetWidth; + const elementHeight = targetElement.offsetHeight; + const screenWidth = window.innerWidth - scrollbarWidth; + const screenHeight = window.innerHeight; + + // Get element's coordinates relative to the page + const elementRect = targetElement.getBoundingClientRect(); + const elementY = elementRect.y; + const elementX = elementRect.x; + + // Calculate scale and offsets + const scaleX = screenWidth / elementWidth; + const scaleY = screenHeight / elementHeight; + const scale = Math.min(scaleX, scaleY); + + // Get the current transformOrigin + const computedStyle = window.getComputedStyle(targetElement); + const transformOrigin = computedStyle.transformOrigin; + const [originX, originY] = transformOrigin.split(" "); + const originXValue = parseFloat(originX); + const originYValue = parseFloat(originY); + + // Calculate offsets with respect to the transformOrigin + const offsetX = + (screenWidth - elementWidth * scale) / 2 - + elementX - + originXValue * (1 - scale); + const offsetY = + (screenHeight - elementHeight * scale) / 2 - + elementY - + originYValue * (1 - scale); + + // Apply scale and offsets to the element + targetElement.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale})`; + + // Update global variables + elemData[elemId].zoomLevel = scale; + elemData[elemId].panX = offsetX; + elemData[elemId].panY = offsetY; + + fullScreenMode = true; + toggleOverlap("on"); + } + + // Handle keydown events + function handleKeyDown(event) { + // Disable key locks to make pasting from the buffer work correctly + if ((event.ctrlKey && event.code === 'KeyV') || (event.ctrlKey && event.code === 'KeyC') || event.code === "F5") { + return; + } + + // before activating shortcut, ensure user is not actively typing in an input field + if (!hotkeysConfig.canvas_blur_prompt) { + if (event.target.nodeName === 'TEXTAREA' || event.target.nodeName === 'INPUT') { + return; + } + } + + + const hotkeyActions = { + [hotkeysConfig.canvas_hotkey_reset]: resetZoom, + [hotkeysConfig.canvas_hotkey_overlap]: toggleOverlap, + [hotkeysConfig.canvas_hotkey_fullscreen]: fitToScreen + }; + + const action = hotkeyActions[event.code]; + if (action) { + event.preventDefault(); + action(event); + } + + if ( + isModifierKey(event, hotkeysConfig.canvas_hotkey_zoom) || + isModifierKey(event, hotkeysConfig.canvas_hotkey_adjust) + ) { + event.preventDefault(); + } + } + + // Get Mouse position + function getMousePosition(e) { + mouseX = e.offsetX; + mouseY = e.offsetY; + } + + // Simulation of the function to put a long image into the screen. + // We detect if an image has a scroll bar or not, make a fullscreen to reveal the image, then reduce it to fit into the element. + // We hide the image and show it to the user when it is ready. + + targetElement.isExpanded = false; + function autoExpand() { + const canvas = document.querySelector(`${elemId} canvas[key="interface"]`); + if (canvas) { + if (hasHorizontalScrollbar(targetElement) && targetElement.isExpanded === false) { + targetElement.style.visibility = "hidden"; + setTimeout(() => { + fitToScreen(); + resetZoom(); + targetElement.style.visibility = "visible"; + targetElement.isExpanded = true; + }, 10); + } + } + } + + targetElement.addEventListener("mousemove", getMousePosition); + + //observers + // Creating an observer with a callback function to handle DOM changes + const observer = new MutationObserver((mutationsList, observer) => { + for (let mutation of mutationsList) { + // If the style attribute of the canvas has changed, by observation it happens only when the picture changes + if (mutation.type === 'attributes' && mutation.attributeName === 'style' && + mutation.target.tagName.toLowerCase() === 'canvas') { + targetElement.isExpanded = false; + setTimeout(resetZoom, 10); + } + } + }); + + // Apply auto expand if enabled + if (hotkeysConfig.canvas_auto_expand) { + targetElement.addEventListener("mousemove", autoExpand); + // Set up an observer to track attribute changes + observer.observe(targetElement, {attributes: true, childList: true, subtree: true}); + } + + // Handle events only inside the targetElement + let isKeyDownHandlerAttached = false; + + function handleMouseMove() { + if (!isKeyDownHandlerAttached) { + document.addEventListener("keydown", handleKeyDown); + isKeyDownHandlerAttached = true; + + activeElement = elemId; + } + } + + function handleMouseLeave() { + if (isKeyDownHandlerAttached) { + document.removeEventListener("keydown", handleKeyDown); + isKeyDownHandlerAttached = false; + + activeElement = null; + } + } + + // Add mouse event handlers + targetElement.addEventListener("mousemove", handleMouseMove); + targetElement.addEventListener("mouseleave", handleMouseLeave); + + // Reset zoom when click on another tab + elements.img2imgTabs.addEventListener("click", resetZoom); + elements.img2imgTabs.addEventListener("click", () => { + // targetElement.style.width = ""; + if (parseInt(targetElement.style.width) > 865) { + setTimeout(fitToElement, 0); + } + }); + + targetElement.addEventListener("wheel", e => { + // change zoom level + const operation = e.deltaY > 0 ? "-" : "+"; + changeZoomLevel(operation, e); + + // Handle brush size adjustment with ctrl key pressed + if (isModifierKey(e, hotkeysConfig.canvas_hotkey_adjust)) { + e.preventDefault(); + + // Increase or decrease brush size based on scroll direction + adjustBrushSize(elemId, e.deltaY); + } + }); + + // Handle the move event for pan functionality. Updates the panX and panY variables and applies the new transform to the target element. + function handleMoveKeyDown(e) { + + // Disable key locks to make pasting from the buffer work correctly + if ((e.ctrlKey && e.code === 'KeyV') || (e.ctrlKey && event.code === 'KeyC') || e.code === "F5") { + return; + } + + // before activating shortcut, ensure user is not actively typing in an input field + if (!hotkeysConfig.canvas_blur_prompt) { + if (e.target.nodeName === 'TEXTAREA' || e.target.nodeName === 'INPUT') { + return; + } + } + + + if (e.code === hotkeysConfig.canvas_hotkey_move) { + if (!e.ctrlKey && !e.metaKey && isKeyDownHandlerAttached) { + e.preventDefault(); + document.activeElement.blur(); + isMoving = true; + } + } + } + + function handleMoveKeyUp(e) { + if (e.code === hotkeysConfig.canvas_hotkey_move) { + isMoving = false; + } + } + + document.addEventListener("keydown", handleMoveKeyDown); + document.addEventListener("keyup", handleMoveKeyUp); + + // Detect zoom level and update the pan speed. + function updatePanPosition(movementX, movementY) { + let panSpeed = 2; + + if (elemData[elemId].zoomLevel > 8) { + panSpeed = 3.5; + } + + elemData[elemId].panX += movementX * panSpeed; + elemData[elemId].panY += movementY * panSpeed; + + // Delayed redraw of an element + requestAnimationFrame(() => { + targetElement.style.transform = `translate(${elemData[elemId].panX}px, ${elemData[elemId].panY}px) scale(${elemData[elemId].zoomLevel})`; + toggleOverlap("on"); + }); + } + + function handleMoveByKey(e) { + if (isMoving && elemId === activeElement) { + updatePanPosition(e.movementX, e.movementY); + targetElement.style.pointerEvents = "none"; + + if (isExtension) { + targetElement.style.overflow = "visible"; + } + + } else { + targetElement.style.pointerEvents = "auto"; + } + } + + // Prevents sticking to the mouse + window.onblur = function() { + isMoving = false; + }; + + // Checks for extension + function checkForOutBox() { + const parentElement = targetElement.closest('[id^="component-"]'); + if (parentElement.offsetWidth < targetElement.offsetWidth && !targetElement.isExpanded) { + resetZoom(); + targetElement.isExpanded = true; + } + + if (parentElement.offsetWidth < targetElement.offsetWidth && elemData[elemId].zoomLevel == 1) { + resetZoom(); + } + + if (parentElement.offsetWidth < targetElement.offsetWidth && targetElement.offsetWidth * elemData[elemId].zoomLevel > parentElement.offsetWidth && elemData[elemId].zoomLevel < 1 && !targetElement.isZoomed) { + resetZoom(); + } + } + + if (isExtension) { + targetElement.addEventListener("mousemove", checkForOutBox); + } + + + window.addEventListener('resize', (e) => { + resetZoom(); + + if (isExtension) { + targetElement.isExpanded = false; + targetElement.isZoomed = false; + } + }); + + gradioApp().addEventListener("mousemove", handleMoveByKey); + + + } + + applyZoomAndPan(elementIDs.sketch, false); + applyZoomAndPan(elementIDs.inpaint, false); + applyZoomAndPan(elementIDs.inpaintSketch, false); + + // Make the function global so that other extensions can take advantage of this solution + const applyZoomAndPanIntegration = async(id, elementIDs) => { + const mainEl = document.querySelector(id); + if (id.toLocaleLowerCase() === "none") { + for (const elementID of elementIDs) { + const el = await waitForElement(elementID); + if (!el) break; + applyZoomAndPan(elementID); + } + return; + } + + if (!mainEl) return; + mainEl.addEventListener("click", async() => { + for (const elementID of elementIDs) { + const el = await waitForElement(elementID); + if (!el) break; + applyZoomAndPan(elementID); + } + }, {once: true}); + }; + + window.applyZoomAndPan = applyZoomAndPan; // Only 1 elements, argument elementID, for example applyZoomAndPan("#txt2img_controlnet_ControlNet_input_image") + + window.applyZoomAndPanIntegration = applyZoomAndPanIntegration; // for any extension + + /* + The function `applyZoomAndPanIntegration` takes two arguments: + + 1. `id`: A string identifier for the element to which zoom and pan functionality will be applied on click. + If the `id` value is "none", the functionality will be applied to all elements specified in the second argument without a click event. + + 2. `elementIDs`: An array of string identifiers for elements. Zoom and pan functionality will be applied to each of these elements on click of the element specified by the first argument. + If "none" is specified in the first argument, the functionality will be applied to each of these elements without a click event. + + Example usage: + applyZoomAndPanIntegration("#txt2img_controlnet", ["#txt2img_controlnet_ControlNet_input_image"]); + In this example, zoom and pan functionality will be applied to the element with the identifier "txt2img_controlnet_ControlNet_input_image" upon clicking the element with the identifier "txt2img_controlnet". + */ + + // More examples + // Add integration with ControlNet txt2img One TAB + // applyZoomAndPanIntegration("#txt2img_controlnet", ["#txt2img_controlnet_ControlNet_input_image"]); + + // Add integration with ControlNet txt2img Tabs + // applyZoomAndPanIntegration("#txt2img_controlnet",Array.from({ length: 10 }, (_, i) => `#txt2img_controlnet_ControlNet-${i}_input_image`)); + + // Add integration with Inpaint Anything + // applyZoomAndPanIntegration("None", ["#ia_sam_image", "#ia_sel_mask"]); +}); diff --git a/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/scripts/__pycache__/hotkey_config.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/scripts/__pycache__/hotkey_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f941af93b777b9a49a9cd0cf9b36681bc771ec0a Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/scripts/__pycache__/hotkey_config.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/scripts/hotkey_config.py b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/scripts/hotkey_config.py new file mode 100644 index 0000000000000000000000000000000000000000..2d8d2d1c014be5dc1bac24b2c71079351fe1177e --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/scripts/hotkey_config.py @@ -0,0 +1,15 @@ +import gradio as gr +from modules import shared + +shared.options_templates.update(shared.options_section(('canvas_hotkey', "Canvas Hotkeys"), { + "canvas_hotkey_zoom": shared.OptionInfo("Alt", "Zoom canvas", gr.Radio, {"choices": ["Shift","Ctrl", "Alt"]}).info("If you choose 'Shift' you cannot scroll horizontally, 'Alt' can cause a little trouble in firefox"), + "canvas_hotkey_adjust": shared.OptionInfo("Ctrl", "Adjust brush size", gr.Radio, {"choices": ["Shift","Ctrl", "Alt"]}).info("If you choose 'Shift' you cannot scroll horizontally, 'Alt' can cause a little trouble in firefox"), + "canvas_hotkey_move": shared.OptionInfo("F", "Moving the canvas").info("To work correctly in firefox, turn off 'Automatically search the page text when typing' in the browser settings"), + "canvas_hotkey_fullscreen": shared.OptionInfo("S", "Fullscreen Mode, maximizes the picture so that it fits into the screen and stretches it to its full width "), + "canvas_hotkey_reset": shared.OptionInfo("R", "Reset zoom and canvas positon"), + "canvas_hotkey_overlap": shared.OptionInfo("O", "Toggle overlap").info("Technical button, neededs for testing"), + "canvas_show_tooltip": shared.OptionInfo(True, "Enable tooltip on the canvas"), + "canvas_auto_expand": shared.OptionInfo(True, "Automatically expands an image that does not fit completely in the canvas area, similar to manually pressing the S and R buttons"), + "canvas_blur_prompt": shared.OptionInfo(False, "Take the focus off the prompt when working with a canvas"), + "canvas_disabled_functions": shared.OptionInfo(["Overlap"], "Disable function that you don't use", gr.CheckboxGroup, {"choices": ["Zoom","Adjust brush size", "Moving canvas","Fullscreen","Reset Zoom","Overlap"]}), +})) diff --git a/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/style.css b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/style.css new file mode 100644 index 0000000000000000000000000000000000000000..5d8054e65196408c97791727088088650f102b21 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/canvas-zoom-and-pan/style.css @@ -0,0 +1,66 @@ +.canvas-tooltip-info { + position: absolute; + top: 10px; + left: 10px; + cursor: help; + background-color: rgba(0, 0, 0, 0.3); + width: 20px; + height: 20px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + + z-index: 100; +} + +.canvas-tooltip-info::after { + content: ''; + display: block; + width: 2px; + height: 7px; + background-color: white; + margin-top: 2px; +} + +.canvas-tooltip-info::before { + content: ''; + display: block; + width: 2px; + height: 2px; + background-color: white; +} + +.canvas-tooltip-content { + display: none; + background-color: #f9f9f9; + color: #333; + border: 1px solid #ddd; + padding: 15px; + position: absolute; + top: 40px; + left: 10px; + width: 250px; + font-size: 16px; + opacity: 0; + border-radius: 8px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + + z-index: 100; +} + +.canvas-tooltip:hover .canvas-tooltip-content { + display: block; + animation: fadeIn 0.5s; + opacity: 1; +} + +@keyframes fadeIn { + from {opacity: 0;} + to {opacity: 1;} +} + +.styler { + overflow:inherit !important; +} \ No newline at end of file diff --git a/stable-diffusion-webui/extensions-builtin/extra-options-section/scripts/__pycache__/extra_options_section.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/extra-options-section/scripts/__pycache__/extra_options_section.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7138233661b732c7ec4060ac6fccad08660b19cc Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/extra-options-section/scripts/__pycache__/extra_options_section.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/extra-options-section/scripts/extra_options_section.py b/stable-diffusion-webui/extensions-builtin/extra-options-section/scripts/extra_options_section.py new file mode 100644 index 0000000000000000000000000000000000000000..96797033b7c6f9ef4bf43a6ba54e6d55933872c2 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/extra-options-section/scripts/extra_options_section.py @@ -0,0 +1,78 @@ +import math + +import gradio as gr +from modules import scripts, shared, ui_components, ui_settings, generation_parameters_copypaste +from modules.ui_components import FormColumn + + +class ExtraOptionsSection(scripts.Script): + section = "extra_options" + + def __init__(self): + self.comps = None + self.setting_names = None + + def title(self): + return "Extra options" + + def show(self, is_img2img): + return scripts.AlwaysVisible + + def ui(self, is_img2img): + self.comps = [] + self.setting_names = [] + self.infotext_fields = [] + extra_options = shared.opts.extra_options_img2img if is_img2img else shared.opts.extra_options_txt2img + elem_id_tabname = "extra_options_" + ("img2img" if is_img2img else "txt2img") + + mapping = {k: v for v, k in generation_parameters_copypaste.infotext_to_setting_name_mapping} + + with gr.Blocks() as interface: + with gr.Accordion("Options", open=False, elem_id=elem_id_tabname) if shared.opts.extra_options_accordion and extra_options else gr.Group(elem_id=elem_id_tabname): + + row_count = math.ceil(len(extra_options) / shared.opts.extra_options_cols) + + for row in range(row_count): + with gr.Row(): + for col in range(shared.opts.extra_options_cols): + index = row * shared.opts.extra_options_cols + col + if index >= len(extra_options): + break + + setting_name = extra_options[index] + + with FormColumn(): + comp = ui_settings.create_setting_component(setting_name) + + self.comps.append(comp) + self.setting_names.append(setting_name) + + setting_infotext_name = mapping.get(setting_name) + if setting_infotext_name is not None: + self.infotext_fields.append((comp, setting_infotext_name)) + + def get_settings_values(): + res = [ui_settings.get_value_for_setting(key) for key in self.setting_names] + return res[0] if len(res) == 1 else res + + interface.load(fn=get_settings_values, inputs=[], outputs=self.comps, queue=False, show_progress=False) + + return self.comps + + def before_process(self, p, *args): + for name, value in zip(self.setting_names, args): + if name not in p.override_settings: + p.override_settings[name] = value + + +shared.options_templates.update(shared.options_section(('settings_in_ui', "Settings in UI", "ui"), { + "settings_in_ui": shared.OptionHTML(""" +This page allows you to add some settings to the main interface of txt2img and img2img tabs. +"""), + "extra_options_txt2img": shared.OptionInfo([], "Settings for txt2img", ui_components.DropdownMulti, lambda: {"choices": list(shared.opts.data_labels.keys())}).js("info", "settingsHintsShowQuicksettings").info("setting entries that also appear in txt2img interfaces").needs_reload_ui(), + "extra_options_img2img": shared.OptionInfo([], "Settings for img2img", ui_components.DropdownMulti, lambda: {"choices": list(shared.opts.data_labels.keys())}).js("info", "settingsHintsShowQuicksettings").info("setting entries that also appear in img2img interfaces").needs_reload_ui(), + "extra_options_cols": shared.OptionInfo(1, "Number of columns for added settings", gr.Slider, {"step": 1, "minimum": 1, "maximum": 20}).info("displayed amount will depend on the actual browser window width").needs_reload_ui(), + "extra_options_accordion": shared.OptionInfo(False, "Place added settings into an accordion").needs_reload_ui() +})) + + diff --git a/stable-diffusion-webui/extensions-builtin/hypertile/__pycache__/hypertile.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/hypertile/__pycache__/hypertile.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16579aec7a6d87db11db809797ecfd7bdc788e50 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/hypertile/__pycache__/hypertile.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/hypertile/hypertile.py b/stable-diffusion-webui/extensions-builtin/hypertile/hypertile.py new file mode 100644 index 0000000000000000000000000000000000000000..0f40e2d39256deb69a3694adb627f726a568de8f --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/hypertile/hypertile.py @@ -0,0 +1,351 @@ +""" +Hypertile module for splitting attention layers in SD-1.5 U-Net and SD-1.5 VAE +Warn: The patch works well only if the input image has a width and height that are multiples of 128 +Original author: @tfernd Github: https://github.com/tfernd/HyperTile +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Callable + +from functools import wraps, cache + +import math +import torch.nn as nn +import random + +from einops import rearrange + + +@dataclass +class HypertileParams: + depth = 0 + layer_name = "" + tile_size: int = 0 + swap_size: int = 0 + aspect_ratio: float = 1.0 + forward = None + enabled = False + + + +# TODO add SD-XL layers +DEPTH_LAYERS = { + 0: [ + # SD 1.5 U-Net (diffusers) + "down_blocks.0.attentions.0.transformer_blocks.0.attn1", + "down_blocks.0.attentions.1.transformer_blocks.0.attn1", + "up_blocks.3.attentions.0.transformer_blocks.0.attn1", + "up_blocks.3.attentions.1.transformer_blocks.0.attn1", + "up_blocks.3.attentions.2.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "input_blocks.1.1.transformer_blocks.0.attn1", + "input_blocks.2.1.transformer_blocks.0.attn1", + "output_blocks.9.1.transformer_blocks.0.attn1", + "output_blocks.10.1.transformer_blocks.0.attn1", + "output_blocks.11.1.transformer_blocks.0.attn1", + # SD 1.5 VAE + "decoder.mid_block.attentions.0", + "decoder.mid.attn_1", + ], + 1: [ + # SD 1.5 U-Net (diffusers) + "down_blocks.1.attentions.0.transformer_blocks.0.attn1", + "down_blocks.1.attentions.1.transformer_blocks.0.attn1", + "up_blocks.2.attentions.0.transformer_blocks.0.attn1", + "up_blocks.2.attentions.1.transformer_blocks.0.attn1", + "up_blocks.2.attentions.2.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "input_blocks.4.1.transformer_blocks.0.attn1", + "input_blocks.5.1.transformer_blocks.0.attn1", + "output_blocks.6.1.transformer_blocks.0.attn1", + "output_blocks.7.1.transformer_blocks.0.attn1", + "output_blocks.8.1.transformer_blocks.0.attn1", + ], + 2: [ + # SD 1.5 U-Net (diffusers) + "down_blocks.2.attentions.0.transformer_blocks.0.attn1", + "down_blocks.2.attentions.1.transformer_blocks.0.attn1", + "up_blocks.1.attentions.0.transformer_blocks.0.attn1", + "up_blocks.1.attentions.1.transformer_blocks.0.attn1", + "up_blocks.1.attentions.2.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "input_blocks.7.1.transformer_blocks.0.attn1", + "input_blocks.8.1.transformer_blocks.0.attn1", + "output_blocks.3.1.transformer_blocks.0.attn1", + "output_blocks.4.1.transformer_blocks.0.attn1", + "output_blocks.5.1.transformer_blocks.0.attn1", + ], + 3: [ + # SD 1.5 U-Net (diffusers) + "mid_block.attentions.0.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "middle_block.1.transformer_blocks.0.attn1", + ], +} +# XL layers, thanks for GitHub@gel-crabs for the help +DEPTH_LAYERS_XL = { + 0: [ + # SD 1.5 U-Net (diffusers) + "down_blocks.0.attentions.0.transformer_blocks.0.attn1", + "down_blocks.0.attentions.1.transformer_blocks.0.attn1", + "up_blocks.3.attentions.0.transformer_blocks.0.attn1", + "up_blocks.3.attentions.1.transformer_blocks.0.attn1", + "up_blocks.3.attentions.2.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "input_blocks.4.1.transformer_blocks.0.attn1", + "input_blocks.5.1.transformer_blocks.0.attn1", + "output_blocks.3.1.transformer_blocks.0.attn1", + "output_blocks.4.1.transformer_blocks.0.attn1", + "output_blocks.5.1.transformer_blocks.0.attn1", + # SD 1.5 VAE + "decoder.mid_block.attentions.0", + "decoder.mid.attn_1", + ], + 1: [ + # SD 1.5 U-Net (diffusers) + #"down_blocks.1.attentions.0.transformer_blocks.0.attn1", + #"down_blocks.1.attentions.1.transformer_blocks.0.attn1", + #"up_blocks.2.attentions.0.transformer_blocks.0.attn1", + #"up_blocks.2.attentions.1.transformer_blocks.0.attn1", + #"up_blocks.2.attentions.2.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "input_blocks.4.1.transformer_blocks.1.attn1", + "input_blocks.5.1.transformer_blocks.1.attn1", + "output_blocks.3.1.transformer_blocks.1.attn1", + "output_blocks.4.1.transformer_blocks.1.attn1", + "output_blocks.5.1.transformer_blocks.1.attn1", + "input_blocks.7.1.transformer_blocks.0.attn1", + "input_blocks.8.1.transformer_blocks.0.attn1", + "output_blocks.0.1.transformer_blocks.0.attn1", + "output_blocks.1.1.transformer_blocks.0.attn1", + "output_blocks.2.1.transformer_blocks.0.attn1", + "input_blocks.7.1.transformer_blocks.1.attn1", + "input_blocks.8.1.transformer_blocks.1.attn1", + "output_blocks.0.1.transformer_blocks.1.attn1", + "output_blocks.1.1.transformer_blocks.1.attn1", + "output_blocks.2.1.transformer_blocks.1.attn1", + "input_blocks.7.1.transformer_blocks.2.attn1", + "input_blocks.8.1.transformer_blocks.2.attn1", + "output_blocks.0.1.transformer_blocks.2.attn1", + "output_blocks.1.1.transformer_blocks.2.attn1", + "output_blocks.2.1.transformer_blocks.2.attn1", + "input_blocks.7.1.transformer_blocks.3.attn1", + "input_blocks.8.1.transformer_blocks.3.attn1", + "output_blocks.0.1.transformer_blocks.3.attn1", + "output_blocks.1.1.transformer_blocks.3.attn1", + "output_blocks.2.1.transformer_blocks.3.attn1", + "input_blocks.7.1.transformer_blocks.4.attn1", + "input_blocks.8.1.transformer_blocks.4.attn1", + "output_blocks.0.1.transformer_blocks.4.attn1", + "output_blocks.1.1.transformer_blocks.4.attn1", + "output_blocks.2.1.transformer_blocks.4.attn1", + "input_blocks.7.1.transformer_blocks.5.attn1", + "input_blocks.8.1.transformer_blocks.5.attn1", + "output_blocks.0.1.transformer_blocks.5.attn1", + "output_blocks.1.1.transformer_blocks.5.attn1", + "output_blocks.2.1.transformer_blocks.5.attn1", + "input_blocks.7.1.transformer_blocks.6.attn1", + "input_blocks.8.1.transformer_blocks.6.attn1", + "output_blocks.0.1.transformer_blocks.6.attn1", + "output_blocks.1.1.transformer_blocks.6.attn1", + "output_blocks.2.1.transformer_blocks.6.attn1", + "input_blocks.7.1.transformer_blocks.7.attn1", + "input_blocks.8.1.transformer_blocks.7.attn1", + "output_blocks.0.1.transformer_blocks.7.attn1", + "output_blocks.1.1.transformer_blocks.7.attn1", + "output_blocks.2.1.transformer_blocks.7.attn1", + "input_blocks.7.1.transformer_blocks.8.attn1", + "input_blocks.8.1.transformer_blocks.8.attn1", + "output_blocks.0.1.transformer_blocks.8.attn1", + "output_blocks.1.1.transformer_blocks.8.attn1", + "output_blocks.2.1.transformer_blocks.8.attn1", + "input_blocks.7.1.transformer_blocks.9.attn1", + "input_blocks.8.1.transformer_blocks.9.attn1", + "output_blocks.0.1.transformer_blocks.9.attn1", + "output_blocks.1.1.transformer_blocks.9.attn1", + "output_blocks.2.1.transformer_blocks.9.attn1", + ], + 2: [ + # SD 1.5 U-Net (diffusers) + "mid_block.attentions.0.transformer_blocks.0.attn1", + # SD 1.5 U-Net (ldm) + "middle_block.1.transformer_blocks.0.attn1", + "middle_block.1.transformer_blocks.1.attn1", + "middle_block.1.transformer_blocks.2.attn1", + "middle_block.1.transformer_blocks.3.attn1", + "middle_block.1.transformer_blocks.4.attn1", + "middle_block.1.transformer_blocks.5.attn1", + "middle_block.1.transformer_blocks.6.attn1", + "middle_block.1.transformer_blocks.7.attn1", + "middle_block.1.transformer_blocks.8.attn1", + "middle_block.1.transformer_blocks.9.attn1", + ], + 3 : [] # TODO - separate layers for SD-XL +} + + +RNG_INSTANCE = random.Random() + +@cache +def get_divisors(value: int, min_value: int, /, max_options: int = 1) -> list[int]: + """ + Returns divisors of value that + x * min_value <= value + in big -> small order, amount of divisors is limited by max_options + """ + max_options = max(1, max_options) # at least 1 option should be returned + min_value = min(min_value, value) + divisors = [i for i in range(min_value, value + 1) if value % i == 0] # divisors in small -> big order + ns = [value // i for i in divisors[:max_options]] # has at least 1 element # big -> small order + return ns + + +def random_divisor(value: int, min_value: int, /, max_options: int = 1) -> int: + """ + Returns a random divisor of value that + x * min_value <= value + if max_options is 1, the behavior is deterministic + """ + ns = get_divisors(value, min_value, max_options=max_options) # get cached divisors + idx = RNG_INSTANCE.randint(0, len(ns) - 1) + + return ns[idx] + + +def set_hypertile_seed(seed: int) -> None: + RNG_INSTANCE.seed(seed) + + +@cache +def largest_tile_size_available(width: int, height: int) -> int: + """ + Calculates the largest tile size available for a given width and height + Tile size is always a power of 2 + """ + gcd = math.gcd(width, height) + largest_tile_size_available = 1 + while gcd % (largest_tile_size_available * 2) == 0: + largest_tile_size_available *= 2 + return largest_tile_size_available + + +def iterative_closest_divisors(hw:int, aspect_ratio:float) -> tuple[int, int]: + """ + Finds h and w such that h*w = hw and h/w = aspect_ratio + We check all possible divisors of hw and return the closest to the aspect ratio + """ + divisors = [i for i in range(2, hw + 1) if hw % i == 0] # all divisors of hw + pairs = [(i, hw // i) for i in divisors] # all pairs of divisors of hw + ratios = [w/h for h, w in pairs] # all ratios of pairs of divisors of hw + closest_ratio = min(ratios, key=lambda x: abs(x - aspect_ratio)) # closest ratio to aspect_ratio + closest_pair = pairs[ratios.index(closest_ratio)] # closest pair of divisors to aspect_ratio + return closest_pair + + +@cache +def find_hw_candidates(hw:int, aspect_ratio:float) -> tuple[int, int]: + """ + Finds h and w such that h*w = hw and h/w = aspect_ratio + """ + h, w = round(math.sqrt(hw * aspect_ratio)), round(math.sqrt(hw / aspect_ratio)) + # find h and w such that h*w = hw and h/w = aspect_ratio + if h * w != hw: + w_candidate = hw / h + # check if w is an integer + if not w_candidate.is_integer(): + h_candidate = hw / w + # check if h is an integer + if not h_candidate.is_integer(): + return iterative_closest_divisors(hw, aspect_ratio) + else: + h = int(h_candidate) + else: + w = int(w_candidate) + return h, w + + +def self_attn_forward(params: HypertileParams, scale_depth=True) -> Callable: + + @wraps(params.forward) + def wrapper(*args, **kwargs): + if not params.enabled: + return params.forward(*args, **kwargs) + + latent_tile_size = max(128, params.tile_size) // 8 + x = args[0] + + # VAE + if x.ndim == 4: + b, c, h, w = x.shape + + nh = random_divisor(h, latent_tile_size, params.swap_size) + nw = random_divisor(w, latent_tile_size, params.swap_size) + + if nh * nw > 1: + x = rearrange(x, "b c (nh h) (nw w) -> (b nh nw) c h w", nh=nh, nw=nw) # split into nh * nw tiles + + out = params.forward(x, *args[1:], **kwargs) + + if nh * nw > 1: + out = rearrange(out, "(b nh nw) c h w -> b c (nh h) (nw w)", nh=nh, nw=nw) + + # U-Net + else: + hw: int = x.size(1) + h, w = find_hw_candidates(hw, params.aspect_ratio) + assert h * w == hw, f"Invalid aspect ratio {params.aspect_ratio} for input of shape {x.shape}, hw={hw}, h={h}, w={w}" + + factor = 2 ** params.depth if scale_depth else 1 + nh = random_divisor(h, latent_tile_size * factor, params.swap_size) + nw = random_divisor(w, latent_tile_size * factor, params.swap_size) + + if nh * nw > 1: + x = rearrange(x, "b (nh h nw w) c -> (b nh nw) (h w) c", h=h // nh, w=w // nw, nh=nh, nw=nw) + + out = params.forward(x, *args[1:], **kwargs) + + if nh * nw > 1: + out = rearrange(out, "(b nh nw) hw c -> b nh nw hw c", nh=nh, nw=nw) + out = rearrange(out, "b nh nw (h w) c -> b (nh h nw w) c", h=h // nh, w=w // nw) + + return out + + return wrapper + + +def hypertile_hook_model(model: nn.Module, width, height, *, enable=False, tile_size_max=128, swap_size=1, max_depth=3, is_sdxl=False): + hypertile_layers = getattr(model, "__webui_hypertile_layers", None) + if hypertile_layers is None: + if not enable: + return + + hypertile_layers = {} + layers = DEPTH_LAYERS_XL if is_sdxl else DEPTH_LAYERS + + for depth in range(4): + for layer_name, module in model.named_modules(): + if any(layer_name.endswith(try_name) for try_name in layers[depth]): + params = HypertileParams() + module.__webui_hypertile_params = params + params.forward = module.forward + params.depth = depth + params.layer_name = layer_name + module.forward = self_attn_forward(params) + + hypertile_layers[layer_name] = 1 + + model.__webui_hypertile_layers = hypertile_layers + + aspect_ratio = width / height + tile_size = min(largest_tile_size_available(width, height), tile_size_max) + + for layer_name, module in model.named_modules(): + if layer_name in hypertile_layers: + params = module.__webui_hypertile_params + + params.tile_size = tile_size + params.swap_size = swap_size + params.aspect_ratio = aspect_ratio + params.enabled = enable and params.depth <= max_depth diff --git a/stable-diffusion-webui/extensions-builtin/hypertile/scripts/__pycache__/hypertile_script.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/__pycache__/hypertile_script.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7badf481d8ec798893aec1c062237ea67bf6308d Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/__pycache__/hypertile_script.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/hypertile/scripts/__pycache__/hypertile_xyz.cpython-310.pyc b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/__pycache__/hypertile_xyz.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49e9cb15f2252f10587eefae41bbc95ad795f606 Binary files /dev/null and b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/__pycache__/hypertile_xyz.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions-builtin/hypertile/scripts/hypertile_script.py b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/hypertile_script.py new file mode 100644 index 0000000000000000000000000000000000000000..52ba655fe37381fefad74b0bde26052d16a62116 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/hypertile_script.py @@ -0,0 +1,109 @@ +import hypertile +from modules import scripts, script_callbacks, shared +from scripts.hypertile_xyz import add_axis_options + + +class ScriptHypertile(scripts.Script): + name = "Hypertile" + + def title(self): + return self.name + + def show(self, is_img2img): + return scripts.AlwaysVisible + + def process(self, p, *args): + hypertile.set_hypertile_seed(p.all_seeds[0]) + + configure_hypertile(p.width, p.height, enable_unet=shared.opts.hypertile_enable_unet) + + self.add_infotext(p) + + def before_hr(self, p, *args): + + enable = shared.opts.hypertile_enable_unet_secondpass or shared.opts.hypertile_enable_unet + + # exclusive hypertile seed for the second pass + if enable: + hypertile.set_hypertile_seed(p.all_seeds[0]) + + configure_hypertile(p.hr_upscale_to_x, p.hr_upscale_to_y, enable_unet=enable) + + if enable and not shared.opts.hypertile_enable_unet: + p.extra_generation_params["Hypertile U-Net second pass"] = True + + self.add_infotext(p, add_unet_params=True) + + def add_infotext(self, p, add_unet_params=False): + def option(name): + value = getattr(shared.opts, name) + default_value = shared.opts.get_default(name) + return None if value == default_value else value + + if shared.opts.hypertile_enable_unet: + p.extra_generation_params["Hypertile U-Net"] = True + + if shared.opts.hypertile_enable_unet or add_unet_params: + p.extra_generation_params["Hypertile U-Net max depth"] = option('hypertile_max_depth_unet') + p.extra_generation_params["Hypertile U-Net max tile size"] = option('hypertile_max_tile_unet') + p.extra_generation_params["Hypertile U-Net swap size"] = option('hypertile_swap_size_unet') + + if shared.opts.hypertile_enable_vae: + p.extra_generation_params["Hypertile VAE"] = True + p.extra_generation_params["Hypertile VAE max depth"] = option('hypertile_max_depth_vae') + p.extra_generation_params["Hypertile VAE max tile size"] = option('hypertile_max_tile_vae') + p.extra_generation_params["Hypertile VAE swap size"] = option('hypertile_swap_size_vae') + + +def configure_hypertile(width, height, enable_unet=True): + hypertile.hypertile_hook_model( + shared.sd_model.first_stage_model, + width, + height, + swap_size=shared.opts.hypertile_swap_size_vae, + max_depth=shared.opts.hypertile_max_depth_vae, + tile_size_max=shared.opts.hypertile_max_tile_vae, + enable=shared.opts.hypertile_enable_vae, + ) + + hypertile.hypertile_hook_model( + shared.sd_model.model, + width, + height, + swap_size=shared.opts.hypertile_swap_size_unet, + max_depth=shared.opts.hypertile_max_depth_unet, + tile_size_max=shared.opts.hypertile_max_tile_unet, + enable=enable_unet, + is_sdxl=shared.sd_model.is_sdxl + ) + + +def on_ui_settings(): + import gradio as gr + + options = { + "hypertile_explanation": shared.OptionHTML(""" + Hypertile optimizes the self-attention layer within U-Net and VAE models, + resulting in a reduction in computation time ranging from 1 to 4 times. The larger the generated image is, the greater the + benefit. + """), + + "hypertile_enable_unet": shared.OptionInfo(False, "Enable Hypertile U-Net", infotext="Hypertile U-Net").info("enables hypertile for all modes, including hires fix second pass; noticeable change in details of the generated picture"), + "hypertile_enable_unet_secondpass": shared.OptionInfo(False, "Enable Hypertile U-Net for hires fix second pass", infotext="Hypertile U-Net second pass").info("enables hypertile just for hires fix second pass - regardless of whether the above setting is enabled"), + "hypertile_max_depth_unet": shared.OptionInfo(3, "Hypertile U-Net max depth", gr.Slider, {"minimum": 0, "maximum": 3, "step": 1}, infotext="Hypertile U-Net max depth").info("larger = more neural network layers affected; minor effect on performance"), + "hypertile_max_tile_unet": shared.OptionInfo(256, "Hypertile U-Net max tile size", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}, infotext="Hypertile U-Net max tile size").info("larger = worse performance"), + "hypertile_swap_size_unet": shared.OptionInfo(3, "Hypertile U-Net swap size", gr.Slider, {"minimum": 0, "maximum": 64, "step": 1}, infotext="Hypertile U-Net swap size"), + + "hypertile_enable_vae": shared.OptionInfo(False, "Enable Hypertile VAE", infotext="Hypertile VAE").info("minimal change in the generated picture"), + "hypertile_max_depth_vae": shared.OptionInfo(3, "Hypertile VAE max depth", gr.Slider, {"minimum": 0, "maximum": 3, "step": 1}, infotext="Hypertile VAE max depth"), + "hypertile_max_tile_vae": shared.OptionInfo(128, "Hypertile VAE max tile size", gr.Slider, {"minimum": 0, "maximum": 512, "step": 16}, infotext="Hypertile VAE max tile size"), + "hypertile_swap_size_vae": shared.OptionInfo(3, "Hypertile VAE swap size ", gr.Slider, {"minimum": 0, "maximum": 64, "step": 1}, infotext="Hypertile VAE swap size"), + } + + for name, opt in options.items(): + opt.section = ('hypertile', "Hypertile") + shared.opts.add_option(name, opt) + + +script_callbacks.on_ui_settings(on_ui_settings) +script_callbacks.on_before_ui(add_axis_options) diff --git a/stable-diffusion-webui/extensions-builtin/hypertile/scripts/hypertile_xyz.py b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/hypertile_xyz.py new file mode 100644 index 0000000000000000000000000000000000000000..9e96ae3c52781ef5e7148e3259bccca4de15a6b8 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/hypertile/scripts/hypertile_xyz.py @@ -0,0 +1,51 @@ +from modules import scripts +from modules.shared import opts + +xyz_grid = [x for x in scripts.scripts_data if x.script_class.__module__ == "xyz_grid.py"][0].module + +def int_applier(value_name:str, min_range:int = -1, max_range:int = -1): + """ + Returns a function that applies the given value to the given value_name in opts.data. + """ + def validate(value_name:str, value:str): + value = int(value) + # validate value + if not min_range == -1: + assert value >= min_range, f"Value {value} for {value_name} must be greater than or equal to {min_range}" + if not max_range == -1: + assert value <= max_range, f"Value {value} for {value_name} must be less than or equal to {max_range}" + def apply_int(p, x, xs): + validate(value_name, x) + opts.data[value_name] = int(x) + return apply_int + +def bool_applier(value_name:str): + """ + Returns a function that applies the given value to the given value_name in opts.data. + """ + def validate(value_name:str, value:str): + assert value.lower() in ["true", "false"], f"Value {value} for {value_name} must be either true or false" + def apply_bool(p, x, xs): + validate(value_name, x) + value_boolean = x.lower() == "true" + opts.data[value_name] = value_boolean + return apply_bool + +def add_axis_options(): + extra_axis_options = [ + xyz_grid.AxisOption("[Hypertile] Unet First pass Enabled", str, bool_applier("hypertile_enable_unet"), choices=xyz_grid.boolean_choice(reverse=True)), + xyz_grid.AxisOption("[Hypertile] Unet Second pass Enabled", str, bool_applier("hypertile_enable_unet_secondpass"), choices=xyz_grid.boolean_choice(reverse=True)), + xyz_grid.AxisOption("[Hypertile] Unet Max Depth", int, int_applier("hypertile_max_depth_unet", 0, 3), choices=lambda: [str(x) for x in range(4)]), + xyz_grid.AxisOption("[Hypertile] Unet Max Tile Size", int, int_applier("hypertile_max_tile_unet", 0, 512)), + xyz_grid.AxisOption("[Hypertile] Unet Swap Size", int, int_applier("hypertile_swap_size_unet", 0, 64)), + xyz_grid.AxisOption("[Hypertile] VAE Enabled", str, bool_applier("hypertile_enable_vae"), choices=xyz_grid.boolean_choice(reverse=True)), + xyz_grid.AxisOption("[Hypertile] VAE Max Depth", int, int_applier("hypertile_max_depth_vae", 0, 3), choices=lambda: [str(x) for x in range(4)]), + xyz_grid.AxisOption("[Hypertile] VAE Max Tile Size", int, int_applier("hypertile_max_tile_vae", 0, 512)), + xyz_grid.AxisOption("[Hypertile] VAE Swap Size", int, int_applier("hypertile_swap_size_vae", 0, 64)), + ] + set_a = {opt.label for opt in xyz_grid.axis_options} + set_b = {opt.label for opt in extra_axis_options} + if set_a.intersection(set_b): + return + + xyz_grid.axis_options.extend(extra_axis_options) diff --git a/stable-diffusion-webui/extensions-builtin/mobile/javascript/mobile.js b/stable-diffusion-webui/extensions-builtin/mobile/javascript/mobile.js new file mode 100644 index 0000000000000000000000000000000000000000..bff1acedff37d3683a01eb2bd6be76a8d33c0296 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/mobile/javascript/mobile.js @@ -0,0 +1,34 @@ +var isSetupForMobile = false; + +function isMobile() { + for (var tab of ["txt2img", "img2img"]) { + var imageTab = gradioApp().getElementById(tab + '_results'); + if (imageTab && imageTab.offsetParent && imageTab.offsetLeft == 0) { + return true; + } + } + + return false; +} + +function reportWindowSize() { + if (gradioApp().querySelector('.toprow-compact-tools')) return; // not applicable for compact prompt layout + + var currentlyMobile = isMobile(); + if (currentlyMobile == isSetupForMobile) return; + isSetupForMobile = currentlyMobile; + + for (var tab of ["txt2img", "img2img"]) { + var button = gradioApp().getElementById(tab + '_generate_box'); + var target = gradioApp().getElementById(currentlyMobile ? tab + '_results' : tab + '_actions_column'); + target.insertBefore(button, target.firstElementChild); + + gradioApp().getElementById(tab + '_results').classList.toggle('mobile', currentlyMobile); + } +} + +window.addEventListener("resize", reportWindowSize); + +onUiLoaded(function() { + reportWindowSize(); +}); diff --git a/stable-diffusion-webui/extensions-builtin/prompt-bracket-checker/javascript/prompt-bracket-checker.js b/stable-diffusion-webui/extensions-builtin/prompt-bracket-checker/javascript/prompt-bracket-checker.js new file mode 100644 index 0000000000000000000000000000000000000000..114cf94ccbf69b473757f2fc46443a39723a9269 --- /dev/null +++ b/stable-diffusion-webui/extensions-builtin/prompt-bracket-checker/javascript/prompt-bracket-checker.js @@ -0,0 +1,42 @@ +// Stable Diffusion WebUI - Bracket checker +// By Hingashi no Florin/Bwin4L & @akx +// Counts open and closed brackets (round, square, curly) in the prompt and negative prompt text boxes in the txt2img and img2img tabs. +// If there's a mismatch, the keyword counter turns red and if you hover on it, a tooltip tells you what's wrong. + +function checkBrackets(textArea, counterElt) { + var counts = {}; + (textArea.value.match(/[(){}[\]]/g) || []).forEach(bracket => { + counts[bracket] = (counts[bracket] || 0) + 1; + }); + var errors = []; + + function checkPair(open, close, kind) { + if (counts[open] !== counts[close]) { + errors.push( + `${open}...${close} - Detected ${counts[open] || 0} opening and ${counts[close] || 0} closing ${kind}.` + ); + } + } + + checkPair('(', ')', 'round brackets'); + checkPair('[', ']', 'square brackets'); + checkPair('{', '}', 'curly brackets'); + counterElt.title = errors.join('\n'); + counterElt.classList.toggle('error', errors.length !== 0); +} + +function setupBracketChecking(id_prompt, id_counter) { + var textarea = gradioApp().querySelector("#" + id_prompt + " > label > textarea"); + var counter = gradioApp().getElementById(id_counter); + + if (textarea && counter) { + textarea.addEventListener("input", () => checkBrackets(textarea, counter)); + } +} + +onUiLoaded(function() { + setupBracketChecking('txt2img_prompt', 'txt2img_token_counter'); + setupBracketChecking('txt2img_neg_prompt', 'txt2img_negative_token_counter'); + setupBracketChecking('img2img_prompt', 'img2img_token_counter'); + setupBracketChecking('img2img_neg_prompt', 'img2img_negative_token_counter'); +}); diff --git a/stable-diffusion-webui/extensions/put extensions here.txt b/stable-diffusion-webui/extensions/put extensions here.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/FUNDING.yml b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/FUNDING.yml new file mode 100644 index 0000000000000000000000000000000000000000..6d0af7885427407541e59b781dc19c2872b6915b --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +custom: ["https://www.paypal.me/JeJongen"] diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/ISSUE_TEMPLATE/bug_report.yml b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000000000000000000000000000000000..d55765a7a1a78d703c7a031830029fab0dfafd15 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,60 @@ +name: ๐Ÿ› Bug report +description: If something isn't working as expected, please report a bug here. +title: "[Bug]: " +labels: ["bug"] + +body: + - type: markdown + attributes: + value: | + *Please fill this form with as much information as possible!* + - type: textarea + id: what-did + attributes: + label: Describe the bug. + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce the problem. + description: Precise step by step instructions on how to reproduce the bug. + value: | + 1. Go to .... + 2. Press .... + 3. ... + validations: + required: true + - type: textarea + id: what-should + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: textarea + id: sysinfo + attributes: + label: System info + description: Information about your system and the versions that were used. + value: | + * Extension version: + * OS: + * SD-WebUI version: + * Python: + validations: + required: true + - type: textarea + id: logs + attributes: + label: Console logs + description: Please share the complete cmd/terminal logs from the time the error occurred, ensuring you include all associated error messages. + render: Shell + validations: + required: true + - type: textarea + id: misc + attributes: + label: Additional information + description: Please provide any relevant additional info or context. diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/ISSUE_TEMPLATE/config.yml b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..95d64503d645d008eaac35b1985cfe4c6dbb2a02 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: "๐ŸŒŸ Feature Request" + url: "https://github.com/BlafKing/sd-civitai-browser-plus/discussions/new?category=ideas" + about: "Feature requests are handled in the Discussions tab under 'Ideas'." + - name: "โ“ Question" + url: "https://github.com/BlafKing/sd-civitai-browser-plus/discussions/new?category=q-a" + about: "If you have questions, please ask them in the Discussions tab under 'Q&A'." diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.gitignore b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..d0683b4e1f5027ec96118b222cb330c864c5a0d6 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +.vscode +running \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/LICENSE b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..0ad25db4bd1d86c452db3f9602ccdbe172438f52 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/LICENSE @@ -0,0 +1,661 @@ + 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/stable-diffusion-webui/extensions/sd-civitai-browser-plus/README.md b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..75826817361f0e9396622a14c27fee5741c4d96e --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/README.md @@ -0,0 +1,646 @@ + +![CivitAI Browser-05+](https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/95afcc41-56f0-4398-8779-51cb2a9e2f55) + +--- +### Extension for [Automatic1111's Stable Difussion Web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) + + +

Features ๐Ÿš€

+

Browse all models from CivitAI ๐Ÿงฉ

+ +* Explore a wide range of models at your fingertips. + +

Check for updates and installed models ๐Ÿ”„

+ +* Easily spot new updates and identify already installed models while browsing. +* Ability to scan all installed models for available updates. + +

Download any Model, any version, and any file ๐Ÿ“ฅ

+ +* Get the specific model version and file you need hassle-free. +* Download queue to avoid waiting for finished downloads. + +

Automatically assign tags to installed models ๐Ÿท๏ธ

+ +* Assign tags by scanning all installed models for automatic use in image generation. + +

Quick Model Info Access ๐Ÿ“Š

+ +* A button for each model card in txt2img and img2img to load it into the extension. +* A button under each image in model info to send it's generation info to txt2img. + +

High-speed downloads with Aria2 ๐Ÿš„

+ +* Maximize your bandwidth for lightning-fast downloads. + +

Sleek and Intuitive User Interface ๐Ÿ–Œ๏ธ

+ +* Enjoy a clutter-free, user-friendly interface, designed to enhance your experience. + +

Actively maintained with feature requests welcome ๐Ÿ› ๏ธ

+ +* Feel free to send me your feature requests, and I'll do my best to implement them! + +

+ +
+

Known Issues ๐Ÿ›

+ +

Unable to download / Frozen download:

+ +**If you're experiencing issues with broken or frozen downloads, there are two possible solutions you can try:** + +1. **Revert to the old download method**: + A solution could be to disable the "Download models using Aria2" feature. +This will switch back to the old download method, which may resolve the issue. + + ![Revert to old download method](https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/982b0ebb-0cac-4053-8060-285533e0e176) + +2. **Disable Async DNS for Aria2**: + If you're using a DNS manager program like PortMaster, try turning on the "Disable Async DNS for Aria2" option. + + ![Disable Async DNS for Aria2](https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/3cf7fab3-0df5-4995-9543-d9824b7931ff) + +These settings can be found under the "Settings" tab in Web-UI and then under the "CivitAI Browser+" tile. + +
+ +

+ +# How to install ๐Ÿ“˜ + +

Automatic Installation:

+ +![HowTo](https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/91a8f636-0fd5-4964-8fb4-830a5c22254a) + + +

Manual Installation:

+ +1. Download the latest version from this site and unpack the .zip +![2023-09-25 13_06_31](https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/12e46c6b-74b5-4ed5-bf55-cb76c5f75c62) + +2. Navigate to your extensions folder (Your SD folder/webui/extensions) +3. Place the unpacked folder inside the extensions folder +4. Restart SD-WebUI + +# Preview ๐Ÿ‘€ + +https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/44c5c7a0-4854-4043-bfbb-f32fa9df5a74 + + +# Star History ๐ŸŒŸ + + + + + + Star History Chart + + + +# Changelog ๐Ÿ“‹ + +

v3.4.3

+ +* Bug fix: Hotfix for a change in the public API which broke searching. +* Bug fix: Fixed incorrect permission display on model page. + +--- +

v3.4.2

+ +* Feature: Ability to set-up a custom proxy for API requests and downloads. +* Feature: Use image API for prompt info, should speed up loading. +* Feature: Optimized javascript code, improved webpage speed for some users. +* New setting: Proxy settings to set-up custom proxy. +* New setting: Toggle for saving description to model json file. (this displays description on the cards) +* Bug fix: Broken default sub folder option fixed [#217](https://github.com/BlafKing/sd-civitai-browser-plus/issues/217) + +--- +

v3.4.1

+ +* Feature: Local images now work in HTML files as preview. (credit: [mx](https://github.com/mx)) +* Feature: Updated available base models. +* Bug fix: Fixed prompt info and model selection after CivitAI API update. +* Bug fix: Fixed "/" missing from default path/sub-folder. + +--- +

v3.4.0

+ +* Feature: (BETA) Download queue! rearrange download order and remove models from queue + - Will likely contain bugs, still not completely finished. +* Feature: Customizable sub folder insertion options, choose what sub folder options you want! +* New setting: Toggle per prompt example image buttons +* New setting: Insert sub folder options +* Bug fix: Add to queue fixed, now properly gets enabled. +* Bug fix: Symlinks now get correctly recognized and used. +* Bug fix: No longer creates accidental sub folder when bulk downloading. + +--- +

v3.3.1

+ +* Feature: Ability to send individual parts of image generation data to txt2img. +* Feature: Added compatibility for [stable-diffusion-webui-forge](https://github.com/lllyasviel/stable-diffusion-webui-forge) fork. +* New setting: Use local images in the HTML + - Does not work in combination with the "Use local HTML file for model info" option! +* New setting: Store the HTML and api_info in the custom images location +* Bug fix: New HTML model info now scales with width so it should always fit. +* Bug fix: Various bug fixes to the "Update model info & tags" function. +* Bug fix: Auto save all images now uses correctly uses custom image path if set. +* Bug fix: "Save model info" button should no longer return errors. +* Bug fix: Old download method (non Aria2) should now work again. + +--- +

v3.3.0

+ +* Feature: New txt2img and img2img model info overlay on CivitAI button press. +* Feature: Base Model as sub folder option. +* Feature: Ability to multi-download to selected folder. +* Feature: Use the same folder as older versions when updating using multi-download. +* Feature: txt2img and img2img CivitAI buttons can use local HTML file, toggle in settings. +* Note: Save images no longer saves .html and API info, save model info does this instead now. +* New setting: Save API info of model when saving model info. +* New setting: Automatically save all images after download. +* New setting: Use local HTML file for model info. +* Bug fix: better JSON decode, now forces UTF-8 +* Bug fix: Now uses the proper default file when using multi-download +* Bug fix: Hide early access models fix, now works when published_at does not exist in API. +* Bug fix: Fix attempt for queue clearing upon download fail. + +--- +

v3.2.5

+ +* Bug fix: Removed default API Key since it gets blocked after many downloads. + - Because of this it's now required for some downloads to use a personal CivitAI key, this can be set in the the settings tab of SD-WebUI under the CivitAI Browser+ tab. +* Bug fix: Fixed bug when selecting a model from txt2img/img2img that doesn't exist on CivitAI. +* Bug fix: Changed model selection to Model ID instead of model name + - This previously caused issues when 2 models were named the same. +* Bug fix: Fixed an issue where the default file was not properly used by default. +* Bug fix: Fixed some tiles not being selectable due to having "'" in it's title +* Bug fix: Now automatically removes residual Aria2 files. + +--- +

v3.2.4

+ +* Bug fix: Fix version detection for non standard SD-WebUI versions. +* Bug fix: Retry to fetch ModelID if previously not found in update functions. +* Bug fix: Style fix for when the Lobe theme is used in SD-WebUI +* Bug fix: Better required packages import error catching. +* Bug fix: Fixed CivitAI button scaling in txt2img and img2img tabs. +* Bug fix: Added ability to handle models that have no hashes saved. + +--- +

v3.2.3

+ +* Bug fix: Generate hash toggle in update models was inverted (silly mistake, sry bout that) +* Bug fix: Better error detection if no model IDs were retrieved during update functions. +* Bug fix: Better error handling if a local model does not exist on CivitAI + +--- +

v3.2.2

+ +* Bug fix: Fixed an `api_response` issue in the update model functions +* Bug fix: Reverted automatically retrieving base models to fix startup issues +* Bug fix: Better error description if a model no longer exists on CivitAI +* Bug fix: Primary file is now used as default file. +* Bug fix: Search after updating models no longer returns errors. + +--- +

v3.2.1

+ +* Feature: Extension now automatically retrieves latest base models from CivitAI. +* Bug fix: Hotfix for functionality with SD.Next + +--- +

v3.2.0

+ +* Feature: A toggle for One-Time hash generation for externally downloaded models. +* Feature: Updated extension settings layout for SD-WebUI 1.7.0 and higher. +* Bug fix: Set default value of Lora & LoCON combination based on SD-WebUI version. +* Bug fix: LORA models with embedding files now get placed inside embeddings folder. +* Bug fix: Better tile count handling to avoid issues with incorrect tile count. +* Bug fix: Better settings saving/loading to prevent writing issues. + +--- +

v3.1.1

+ +* Bug fix: Early Access models now get correctly hidden/detected. +* Bug fix: Better timeout/offline server detection for options in "Update Models" tab. +* Bug fix: Better error detection if required packages were not installed/imported. +* Bug fix: Download button now displays as "Add to queue" during active download. + +--- +

v3.1.0

+ +* Feature: Send to txt2img, Send any image in the model info to txt2img. +* Feature: Added new Base model filters: + - SD 1.5 LCM, SDXL 1.0 LCM, SDXL Distilled, SDXL Turbo, SVD, SVD XT +* Feature: Hide installed models filter toggle. +* Feature: Better display of permissions and tags in model info. +* New setting: Append sub folders to custom image path. +* New setting: Toggle gif/video playback, Disable if video's are taking high CPU usage. +* Bug fix: Better handling if hash is not found. + +--- +

v3.0

+ +* Feature: Download queue! Ability to add downloads to a queue. (Finally!) +* Feature: Checkboxes to download multiple models at once. + - This will automatically use the first version and first file of the selected model(s). + - Will use the default sub folders per content type defined in sub folder settings. +* Feature: "Select all" button to select all downloadable models at once. +* Feature: "Open on CivitAI" button when viewing a models metadata in txt2img or img2img. + - Will only display if the model's info has been saved to the .json after v3.0 +* Feature: Ability to rename model filename + - Note that it's not recommended to change the filename since some checks rely on it. +* Bug fix: Fixed display of saved .html files. +* Bug fix: Removed potential illegal characters from file name/path name. +* Bug fix: Fixed case sensitive sorting of sub folders. + +--- +

v2.1.0

+ +* Feature: "Overwrite any existing previews, tags or descriptions" Toggle in Update tab. +* Feature: Added content type "All" to model scanning to select all content types. + +--- +

v2.0.1

+ +* Bug fix: Folders starting with "." now no longer show sub folders. +* Bug fix: Added headers to simulate browser request. (May fix issues for users from Russia) + +--- +

v2.0

+ +* Feature: New button on each model card in txt2img and img2img to view it in the extension. +
+ Preview + +![ezgif-3-b1f0de4dd2](https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/536a693a-c30c-438e-a34f-1aec54e4e7ee) + +
+ +* Feature: NSFW toggle now properly impacts search results. +* Feature: Ability to set [\Model Name] & [\Model Name\Version Name] as default sub folders. +* New setting: Hide sub folders that start with a '.' +* Bug fix: Preview HTML is now emptied when loading a new page. +* Bug fix: Buttons now correctly display when loading new page. +* Bug fix: Fixed compatibility with SD.Next. (again) +* Bug fix: Emptied tags, base model, and filename upon loading new page. +* Bug fix: Filter change detection fixed + +--- +

v1.16

+ +* Feature: Ability to download/update model preview images in Update Models tab. +* Feature: "Update model tags" changed to "Update model info & tags". + - The option now saves tags, description and base model version. + - This also applies to the browser, saved tags is changed to save model info. +* Bug fix: Archived models are now hidden since they cannot be used. + +--- +

v1.15.2

+ +* New setting: Custom save images location +* New setting: Default sub folders + - Any sub folders you have will be able to be selected as default, per content type. + - If a content type doesn't appear, then it means there are no subfolders in that type. +* Bug fix: Unreleased models caused a crash, now hidden by default since they can't be used. + +--- +

v1.15.1

+ +* New setting: Show console logs during update scanning. +* Bug fix: Scan for update no longer prints incorrect info about outdated models. +* Bug fix: Removed bad logic which triggered the same function multiple times. +* Cleanup: Optimized functions and improved the speed of selecting models. + +--- +

v1.15

+ +* Feature: Filter option to show favorited models. (requires personal API key) +* Feature: Back to top button when viewing model details. +* New setting: Page navigation as header. (keeps page navigation always visible at the top) +* Bug fix: Aria2 now restarts when UI is reloaded. +* Bug fix: SHA256 error fixed if .json files don't contain it. +* Bug fix: Cleaned up javascript code. + +--- +

v1.14.7

+ +* New setting: Hide early access models (EA models are only downloadable by supporters) +* New setting: Personal CivitAI API key (Text field to insert personal API key) + - Useful for CivitAI supporters, you can use your own API Key to allow downloading Early Access models +* Bug fix: Extension now works with `no gradio queue` flag. +* Bug fix: Auto disable Aria2 on MacOS due to incompatibility. +* Bug fix: Now properly works on SD.Next again. +* Bug fix: Download progression and cancelling is no longer broken on old download method. +* Bug fix: Extension now correctly downloads models where it is required to be logged in. +* Bug fix: Extension no longer attempts to install already installed requirements. + +--- +

v1.14.6

+ +* Bug fix: Removed pre-load of default page, caused issues for some users. +* Bug fix: Fixed internal model naming, caused issues when model names included ' +* Bug fix: Different host for .svg icons, caused issues with MalwareBytes. +* Bug fix: Preview saving was broken due to passing the wrong file path. + +--- +

v1.14.5

+ +* Feature: Base Model filter now impacts search results. +* Feature: Ability to input model URL into search bar to find corresponding model. +* Bug fix: Adetailer models now get placed in the correct folder + +--- +

v1.14.4

+ +* Bug fix: Page slider broke the Next Page button when loaded from "Update Models". +* Bug fix: "Save settings as default" button inserted broken .json data. +* Bug fix: Triggering "Scan for available updates" twice resulted in an error. + +--- +

v1.14.3

+ +* Bug fix: LORA content type was broken when "Treat LoCon as LORA" was turned on. + +--- +

v1.14.2

+ +* Feature: Custom page handling when scanning models. +* Bug fix: Model scan feature now works for large model count (+900) +* Bug fix: Better broken .json error handling + +--- +

v1.14.1

+ +* Bug fix: Gifs did not display properly. +* Bug fix: Video's no longer save as preview since they cannot be used. +* Bug fix: Filter window was not hidden by default. + +--- +

v1.14

+ +* Feature: Redesign of UI. +* Feature: New dropdown with filter settings. +* Feature: Button to save current filter settings as default. (requires restart) +* Feature: Tag box can now be typed in to save custom tags. +* Feature: Delete function removes any unpacked files. + +--- +

v1.13

+ +* Feature: Updated available content types: + - Upscaler + - MotionModule + - Wildcards + - Workflows + - Other +* Feature: Videos can now also be displayed on preview cards and in the model info. +* Feature: Automatically scans upscaler type by looking through model's description. +* Feature: Automatically identify correct folder for wildcards based on extension. +* Bug fix: Version ID got saved instead of correct Model ID after download. + +--- +

v1.12.5

+ +* Bug fix: [Installed] tag was only assigned to latest installed version. +* Bug fix: Folder location didn't update when selecting different version/file. +* Bug fix: Version scanning didn't properly scan sha256 in uppercase. + +--- +

v1.12.4

+ +* Feature: You can now refresh by pressing Ctrl+Enter and Alt+Enter. +* Bug fix: Auto unpack feature was unpacking unintended archives, now only unpacks .zip. + +--- +

v1.12.3

+ +* New setting: Option to toggle automatically unpacking .zip models. +* Bug fix: Error wasn't catched when file path was incorrect. + +--- +

v1.12.2

+ +* Feature: Able to download multiple files from each version. +* Bug fix: Models did not get deleted properly when in nested folders. +* Bug fix: Wrong sha256 was being saved after downloading. +* Bug fix: Wrong default folder was used when installed model got selected. + +--- +

v1.12.1

+ +* Feature: File deletion now uses both SHA256 and file name to detect correct file. +* New setting: Option to toggle automatically inserting 2 default sub folders. +* New setting: Option to toggle installing LoCON's in LORA folder. +* Bug fix: Default file was incorrect when selecting a model. +* Bug fix: Next Page caused an error when changing content type. + +--- +

v1.12

+ +* Feature: Ability to load all selected installed models into browser in Update Models tab. +* Feature: Installed/outdated models check is now done using SHA256 + file name. +* Feature: Ability to select multiple content Types when searching and scanning. +* Feature: Greatly improved speed of model scanning if model ID is saved in .json + +--- +

v1.11.2

+ +* Feature: Redesign of model page by [ManOrMonster](https://github.com/ManOrMonster) +*
Model page changes (https://github.com/BlafKing/sd-civitai-browser-plus/pull/33) + + - Redesigned the look of the model page. + - Added link to model page on CivitAI. Click on model name to open. + - Added link to uploader/creator page on CivitAI. Click creator name to open. + - Added CivitAI avatar display. + - Separate description section. + - First sample image is marked with data attribute and downloaded as preview image instead of grabbing first in model HTML. This guarantees that the first sample image (not avatar or image in description) is used when downloading the model. + - Sample images are marked with data attribute so that only they are downloaded when using "Save Images" (no description images or avatar). + - Removed trained tags from info since they are displayed above. + - Each sample image has its own section. + - Sample images zoom in when clicked, zoom out when clicking anywhere. + - Forced width is removed from sample image URLs so that nice big images can be viewed. + - Metadata is arranged so that the most commonly used data is at the top, no more searching for prompts. + - Extra metadata is in accordion labeled "More details...". This is especially useful to hide insanely large ComfyUI JSON. + +
+ +--- +

v1.11.1

+ +* Feature: Error detection during Aria2 downloads. +* Bug fix: Avoid starting Aria2 RPC multiple times with better port check. +* Bug fix: Fixed dynamic tile status updates after deleting/downloading. +--- + +

v1.11

+ +* Feature: Ability to scan all installed models for available updates. +* Feature: Model ID and sha256 get saved to .json after scanning or downloading a model. +* Bug fix: Fixed crash when base model is not found. +* Bug fix: No longer overwrite sha256 and model ID in existing .json. +--- + +

v1.10.1

+ +* Bug fix: Fixed pathing for Unix systems +* Bug fix: Extra checks to prevent deleting unintentional files. +* Feature: Models get moved to trash instead of fully deleted. +--- +

v1.10

+ +* Feature: Update tags for all installed models! +* Feature: Tabs for Browsing and updating Tags. +* Feature: Buttons to select which folders to update tags in. +--- +

v1.9.4

+ +* Feature: Added Civit AI settings tab + - New setting: Disable downloading with Aria2. (will use old download method instead) + - New setting: Disable using Async DNS. (can fix issues for some users who use DNS managing programs) + - New setting: Show Aria2 logs in the CMD. + - New setting: Set the amount of connections when downloading a model with Aria2. + (The optimal connection count is different per user, try to find the lowest option which still gives you full bandwidth speed) +--- +

v1.9.3

+ +* Feature: Included Motrix Aria2 version. +* Feature: Max connections per server set to 64 and split file set 64. +* Feature: Aria2 is now shipped with this extension for Linux as well. +--- + +

v1.9.2

+ +* Cleanup: Split up script into multiple files for improved oversight/readability. +* Cleanup: Centered model icons +--- + +

v1.9.1

+ +* Bug fix: Added back old download function if aria2 fails. +--- + +

v1.9

+ +* Feature: Faster downloads by using Aria2. +* Feature: More info about current download: Speed, ETA, File Size and % completion. +--- + +

v1.8.1

+ +* Feature: Sub Folder list now contains 2 default options: `/{Model name}` & `/{Model name}/{Version name}` +--- + +

v1.8

+ +* Feature: Ability to download different file types per version. +* Feature: NSFW Toggle is now dynamic. +* Feature: Version list now dynamically updates after download. +* Cleanup: Rearranged/Resized UI elements. +* Bug fix: Downloading models now uses file ID instead of names. +* Bug fix: NSFW Toggle no longer hides images tagged as "Soft". +* Bug fix: Fixed each model load running twice. +--- + +

v1.7.2

+ +* Bug fix: Download button did not get re-enabled properly. +* Bug fix: Tile status did not get updated properly when download failed. +--- + +

v1.7.1

+ +* Feature: Base Model filtering dims tiles instead of hiding. +* Bug fix: NSFW Blur increases with tile size. +* Bug fix: Dynamic tile status after installation & deletion now correctly detects other versions. +--- + +

v1.7

+ +* Feature: Introduced seperate download progress bar, browse while downloading. +* Feature: no more force refresh after installing, cancelling and deleting. +* Feature: Added toggle to sort Tiles by date. +* Feature: Dynamic changing of tile borders after installation & deletion. +* Removal: 'Auto delete old version' removed since it relied on a reload. +--- + +

v1.6

+ +* Bug fix: Page count is now always correclty read when refreshing. +(You can fill in the page number you'd like to visit and press refresh to go to that page) +* Feature: 'Filter Base Model' to dynamically hide any unselected Base models. +(Please note: This does not impact search results, since the CivitAI API does not yet support this) +--- + +

v1.5

+ +* Feature: Slider to change tile size. +* Feature: Download Folder textbox which can be used to define a custom download path. +* Feature: Sub Folder Dropdown to select any available subfolder(s) as download location. +* Feature: Display a timed out message instead of an error icon. +* Bug fix: Nested files can now be detected as installed or outdated. +* Bug fix: Auto selects corresponding folder of any installed models. +* Bug fix: Better cancellation logic to prevent downloads from continuing. +--- + +

v1.4

+ +* Feature: Download progress bar is now on web page instead of CMD. +* Feature: Added Cancel and Delete buttons. +* Feature: Download button will now change according to circumstances: + - Cancel button if there's a current download. + - Delete button if the selected version is installed. +* Cleanup: Better margin fixes with theme detection. +* Bug fix: Delete option now also removes .json files. +* Bug fix: Buttons are now disabled during download. (except cancel button) +--- + +

v1.3.1

+ +* Bug fix: Fixed tag saving bugs/oversights. +* Bug fix: Trained tags display now do not include the model itself. +--- + +

v1.3

+ +* Feature: 'Save Tags' button saves tags to a .json file which gets used in image creaton. + (If a LORA with saved tags is used it will automatically input all tags into the txt box in image creation) +* Feature: 'Save tags after download' toggle to automatically save .json tags. +* Cleanup: Removed "Get model info" button. +* Cleanup: Removed download link box. +* Cleanup: Removed "No" from search options. +* Cleanup: Added border radius to cards. +* Cleanup: Improved padding based on if Lobe theme is being used. +--- + +

v1.2

+ +* Feature: Automatically saves preview image when downloading a model. +* Feature: Added [installed] text suffix for any versions that are installed in the 'Version' tab. +* Cleanup: Changed 'Model Filename' from a dropbox to a textbox. +* Cleanup: Made bottom textboxes non typeable. +* Cleanup: Disabled bottom buttons when no model is selected. +* Bug fix: Margin error on the latest tile. +* Bug fix: Version checking is now case sensitive. +* Bug fix: Default verison in version tab shows installed version. +--- + +

v1.1

+ +* Feature: Dropdown box which can filter by time period. +* Cleanup: 'Content type' changed from buttons to a dropdown box. +* Bug fix: Fixed tiles not reloading when already pressed. +--- + +

v1.0

+ +* Feature: 'Refresh' now reloads the current page unless any options have been changed. +* Feature: Made the page refresh after a download and made it load during one. +* Feature: Orange glow for any outdated installed packages. +* Feature: 'Delete old version after download' option. +* Feature: Ability to manually fill in a page number to load the corresponding page. +* Cleanup: Removed new folder option. +* Cleanup: Made the glow around frames always visible without hovering. +* Pulled fork from: [SignalFlagZ's Fork](https://github.com/SignalFlagZ/sd-civitai-browser) [v1.1.0](https://github.com/SignalFlagZ/sd-civitai-browser/releases/tag/1.1.0) diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/lin/aria2 b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/lin/aria2 new file mode 100644 index 0000000000000000000000000000000000000000..b93f84f39353b2784d18c91d1525d8f12f904aa6 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/lin/aria2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f50816471fbd5e91c04df6cf6f995c6279d295b70187f313e6d3b04f65769fc +size 9926088 diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/running b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/running new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/win/aria2.exe b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/win/aria2.exe new file mode 100644 index 0000000000000000000000000000000000000000..5485d42b9ba6f54ef5dfa6c71150ea725737d493 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/aria2/win/aria2.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:098a065ab71f639bf7048e790c870756fd6e83de9cc678915bbd07077d473fa2 +size 8136704 diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/install.py b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/install.py new file mode 100644 index 0000000000000000000000000000000000000000..ffb0b0ed26447c48854bc28e0342b4ae5218a73f --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/install.py @@ -0,0 +1,20 @@ +import launch +from pathlib import Path + +aria2path = Path(__file__).resolve().parents[0] / "aria2" + +for item in aria2path.iterdir(): + if item.is_file(): + item.unlink() + +def install_req(check_name, install_name=None): + if not install_name: install_name = check_name + if not launch.is_installed(f"{check_name}"): + launch.run_pip(f"install {install_name}", "requirements for CivitAI Browser") + +install_req("send2trash") +install_req("zip_unicode", "ZipUnicode") +install_req("bs4", "beautifulsoup4") +install_req("fake_useragent") +install_req("packaging") +install_req("pysocks") \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/javascript/Sortable.min.js b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/javascript/Sortable.min.js new file mode 100644 index 0000000000000000000000000000000000000000..bb9953355480571864d048d1b4070237af5027d6 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/javascript/Sortable.min.js @@ -0,0 +1,2 @@ +/*! Sortable 1.15.2 - MIT | git://github.com/SortableJS/Sortable.git */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function I(o){for(var t=1;tt.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[K]._onDragOver(o)}}var i,r,a}function Bt(t){V&&V.parentNode[K]._isOutsideThisEl(t.target)}function Ft(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[K]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Pt(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ft.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in W.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in kt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Nt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Dt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function jt(t,e,n,o,i,r,a,l){var s,c,u=t[K],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Ht(t){t.draggable=!1}function Lt(){Tt=!1}function Kt(t){return setTimeout(t,0)}function Wt(t){return clearTimeout(t)}Ft.prototype={constructor:Ft,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(mt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,V):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){xt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&xt.push(o)}}(o),!V&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||tt===l)){if(ot=j(l),rt=j(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return q({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),G("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return q({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),G("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!V&&n.parentNode===r&&(o=X(n),Q=r,Z=(V=n).parentNode,J=V.nextSibling,tt=n,lt=a.group,ct={target:Ft.dragged=V,clientX:(e||t).clientX,clientY:(e||t).clientY},ft=ct.clientX-o.left,pt=ct.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,V.style["will-change"]="all",o=function(){G("delayEnded",i,{evt:t}),Ft.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(V.draggable=!0),i._triggerDragStart(t,e),q({sortable:i,name:"choose",originalEvent:t}),k(V,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(V,t.trim(),Ht)}),h(l,"dragover",Yt),h(l,"mousemove",Yt),h(l,"touchmove",Yt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,V.draggable=!0),G("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ft.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){V&&Ht(V),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(V,"dragend",this),h(Q,"dragstart",this._onDragStart));try{document.selection?Kt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;wt=!1,Q&&V?(G("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Bt),n=this.options,t||k(V,n.dragClass,!1),k(V,n.ghostClass,!0),Ft.active=this,t&&this._appendGhost(),q({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ut){this._lastX=ut.clientX,this._lastY=ut.clientY,Rt();for(var t=document.elementFromPoint(ut.clientX,ut.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ut.clientX,ut.clientY))!==e;)e=t;if(V.parentNode[K]._isOutsideThisEl(t),e)do{if(e[K])if(e[K]._onDragOver({clientX:ut.clientX,clientY:ut.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Xt()}},_onTouchMove:function(t){if(ct){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=$&&v($,!0),a=$&&r&&r.a,l=$&&r&&r.d,e=Mt&&yt&&E(yt),a=(i.clientX-ct.clientX+o.x)/(a||1)+(e?e[0]-Ct[0]:0)/(a||1),l=(i.clientY-ct.clientY+o.y)/(l||1)+(e?e[1]-Ct[1]:0)/(l||1);if(!Ft.active&&!wt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))D.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>D.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(B((_=this).el,0,_.options,!0)),_=L(_.el,_.options,$),e?t.clientX<_.left-10||t.clientY addOrUpdateRule(sheet, selector, rules); + + toggleRule('.civcardnsfw', hideAndBlur ? 'display: block;' : 'display: none;'); + toggleRule('.civnsfw img', hideAndBlur ? 'filter: none;' : 'filter: blur(10px);'); + + const dateSections = document.querySelectorAll('.date-section'); + dateSections.forEach((section) => { + const cards = section.querySelectorAll('.civmodelcard'); + const nsfwCards = section.querySelectorAll('.civmodelcard.civcardnsfw'); + section.style.display = !hideAndBlur && cards.length === nsfwCards.length ? 'none' : 'block'; + }); + +} + +// Updates site with css insertions +function addOrUpdateRule(styleSheet, selector, newRules) { + for (let i = 0; i < styleSheet.cssRules.length; i++) { + let rule = styleSheet.cssRules[i]; + if (rule.selectorText === selector) { + rule.style.cssText = newRules; + return; + } + } + styleSheet.insertRule(`${selector} { ${newRules} }`, styleSheet.cssRules.length); +} + +// Updates card border +function updateCard(modelNameWithSuffix) { + const lastDotIndex = modelNameWithSuffix.lastIndexOf('.'); + const modelName = modelNameWithSuffix.slice(0, lastDotIndex); + const suffix = modelNameWithSuffix.slice(lastDotIndex + 1); + let additionalClassName = ''; + switch(suffix) { + case 'None': + additionalClassName = ''; + break; + case 'Old': + additionalClassName = 'civmodelcardoutdated'; + break; + case 'New': + additionalClassName = 'civmodelcardinstalled'; + break; + default: + return; + } + const parentDiv = document.querySelector('.civmodellist'); + if (parentDiv) { + const cards = parentDiv.querySelectorAll('.civmodelcard'); + cards.forEach((card) => { + const onclickAttr = card.getAttribute('onclick'); + if (onclickAttr && onclickAttr.includes(`select_model('${modelName}', event)`)) { + card.className = `civmodelcard ${additionalClassName}`; + } + }); + } +} + +// Enables refresh with alt+enter and ctrl+enter +function keydownHandler(e) { + var handled = false; + + if (e.key !== undefined) { + if ((e.key == "Enter" && (e.metaKey || e.ctrlKey || e.altKey))) handled = true; + } else if (e.keyCode !== undefined) { + if ((e.keyCode == 13 && (e.metaKey || e.ctrlKey || e.altKey))) handled = true; + } + + if (handled) { + var currentTabContent = get_uiCurrentTabContent(); + if (currentTabContent && currentTabContent.id === "tab_civitai_interface") { + + var refreshButton = currentTabContent.querySelector('#refreshBtn'); + if (!refreshButton) { + refreshButton = currentTabContent.querySelector('#refreshBtnL'); + } + if (refreshButton) { + refreshButton.click(); + } + + e.preventDefault(); + } + } +} +document.addEventListener('keydown', keydownHandler); + +// Function for the back to top button +function BackToTop() { + const c = Math.max(document.body.scrollTop, document.documentElement.scrollTop); + if (c > 0) { + window.requestAnimationFrame(BackToTop); + document.body.scrollTop = c - c / 8; + document.documentElement.scrollTop = c - c / 8; + } +} + +// Function to adjust alignment of Filter Accordion +function adjustFilterBoxAndButtons() { + const element = document.querySelector("#filterBox") || document.querySelector("#filterBoxL"); + if (!element) return; + + const childDiv = element.querySelector("div:nth-child(3)"); + if (!childDiv) return; + + const isLargeScreen = window.innerWidth >= 1250; + const isMediumScreen = window.innerWidth < 1250 && window.innerWidth > 915; + const isNarrowScreen = window.innerWidth < 800; + const modelBlocks = document.querySelectorAll("#civitai_preview_html .model-block"); + const civitInfo = document.querySelector(".civitai-version-info"); + + if (modelBlocks) { + modelBlocks.forEach(modelBlock => { + if (isNarrowScreen) { + modelBlock.style.flexWrap = "wrap"; + modelBlock.style.justifyContent = "center"; + } else { + modelBlock.style.flexWrap = "nowrap"; + modelBlock.style.justifyContent = "flex-start"; + } + }); + } if (civitInfo) { + if (window.innerWidth < 900) { + civitInfo.style.flexWrap = "wrap"; + } else { + civitInfo.style.flexWrap = "nowrap"; + } + } + + + childDiv.style.marginLeft = isLargeScreen ? "0px" : isMediumScreen ? `${1250 - window.innerWidth}px` : "0px"; + element.style.justifyContent = isLargeScreen || isMediumScreen ? "center" : "flex-start"; + + const pageBtn1 = document.querySelector("#pageBtn1"); + const pageBtn2 = document.querySelector("#pageBtn2"); + const pageBox = document.querySelector("#pageBox"); + const pageBoxMobile = document.querySelector("#pageBoxMobile"); + + if (window.innerWidth < 530) { + childDiv.style.width = "300px"; + if (pageBoxMobile) { + pageBtn1 && pageBoxMobile.appendChild(pageBtn1); + pageBtn2 && pageBoxMobile.appendChild(pageBtn2); + pageBoxMobile.style.paddingBottom = "15px"; + } + } else { + childDiv.style.width = "400px"; + if (pageBox) { + pageBtn1 && pageBox.insertBefore(pageBtn1, pageBox.firstChild); + pageBtn2 && pageBox.appendChild(pageBtn2); + pageBoxMobile.style.paddingBottom = "0px"; + } + } +} + +// Calls the function above whenever the window is resized +window.addEventListener("resize", adjustFilterBoxAndButtons); + +// Function to trigger refresh button with extra checks for page slider +function pressRefresh() { + setTimeout(() => { + const input = document.querySelector("#pageSlider > div:nth-child(2) > div > input"); + if (document.activeElement === input) { + function keydownHandler(event) { + if (event.key === 'Enter' || event.keyCode === 13) { + input.blur(); + input.removeEventListener('keydown', keydownHandler); + input.removeEventListener('blur', blurHandler); + } + } + + function blurHandler() { + input.removeEventListener('keydown', keydownHandler); + input.removeEventListener('blur', blurHandler); + } + + input.addEventListener('keydown', keydownHandler); + input.addEventListener('blur', blurHandler); + + return; + } + + let button = document.querySelector("#refreshBtn"); + if (!button) { + button = document.querySelector("#refreshBtnL"); + } + if (button) { + button.click(); + } else { + console.error("Both buttons with IDs #refreshBtn and #refreshBtnL not found."); + } + }, 200); +} + +// Update SVG Icons based on dark theme or light theme +function updateSVGIcons() { + const isDark = document.body.classList.contains('dark'); + const filterIconUrl = isDark ? "https://gistcdn.githack.com/BlafKing/a20124cedafad23d4eecc1367ec22896/raw/04a4dae0771353377747dadf57c91d55bf841bed/filter-light.svg" : "https://gistcdn.githack.com/BlafKing/686c3438f5d0d13e7e47135f25445ef3/raw/46477777faac7209d001829a171462d9a2ff1467/filter-dark.svg"; + const searchIconUrl = isDark ? "https://gistcdn.githack.com/BlafKing/3f95619089bac3b4fd5470a986e1b3bb/raw/ebaa9cceee3436711eb560a7a65e151f1d651c6a/search-light.svg" : "https://gistcdn.githack.com/BlafKing/57573592d5857e102a4bfde852f62639/raw/aa213e9e82d705651603507e26545eb0ffe60c90/search-dark.svg"; + + const element = document.querySelector("#filterBox, #filterBoxL"); + const childDiv = element?.querySelector("div:nth-child(3)"); + + if (childDiv) { + childDiv.style.cssText = `box-shadow: ${isDark ? '#ffffff' : '#000000'} 0px 0px 2px 0px; display: none;`; + } + + const style = document.createElement('style'); + style.innerHTML = ` + #filterBox > div:nth-child(2) > span:nth-child(2)::before, + #filterBoxL > div:nth-child(2) > span:nth-child(2)::before { + background: url('${filterIconUrl}') no-repeat center center; + background-size: contain; + } + `; + document.head.appendChild(style); + + const refreshBtn = document.querySelector("#refreshBtn, #refreshBtnL"); + const targetSearchElement = refreshBtn?.firstChild || refreshBtnL?.firstChild; + + if (targetSearchElement) { + targetSearchElement.src = searchIconUrl; + } +} + +// Creates a tooltip if the user wants to filter liked models without a personal API key +function createTooltip(element, hover_element, insertText) { + if (element) { + const tooltip = document.createElement('div'); + tooltip.className = 'browser_tooltip'; + tooltip.textContent = insertText; + tooltip.style.cssText = 'display: none; text-align: center; white-space: pre;'; + + hover_element.addEventListener('mouseover', () => { + tooltip.style.display = 'block'; + }); + hover_element.addEventListener('mouseout', () => { + tooltip.style.display = 'none'; + }); + element.appendChild(tooltip); + } +} + +// Function that closes filter dropdown if clicked outside the dropdown +function setupClickOutsideListener() { + var filterBox = document.getElementById("filterBoxL") || document.getElementById("filterBox"); + var filterButton = filterBox.getElementsByTagName("div")[1]; + var dropDown = filterBox.getElementsByTagName("div")[2]; + + function clickOutsideHandler(event) { + var target = event.target; + if (!filterBox.contains(target)) { + if (!dropDown.contains(target)) { + if (filterButton.className.endsWith("open")) { + filterButton.click(); + } + } + } + } + document.addEventListener("click", clickOutsideHandler); +} + +// Create hyperlink in settings to CivitAI account settings +function createLink(infoElement) { + + const existingText = "(You can create your own API key in your CivitAI account settings, this required for some downloads, Requires UI reload)"; + const linkText = "CivitAI account settings"; + + const [textBefore, textAfter] = existingText.split(linkText); + + const link = document.createElement('a'); + link.textContent = linkText; + link.href = 'https://civitai.com/user/account'; + link.target = '_blank'; + + while (infoElement.firstChild) infoElement.removeChild(infoElement.firstChild); + + infoElement.appendChild(document.createTextNode(textBefore)); + infoElement.appendChild(link); + infoElement.appendChild(document.createTextNode(textAfter)); +} + +// Function to update the visibility of backToTopDiv based on the intersection with civitaiDiv +function updateBackToTopVisibility(entries) { + var backToTopDiv = document.getElementById('backToTopContainer'); + var civitaiDiv = document.getElementById('civitai_preview_html'); + + if (civitaiDiv.clientHeight > 0 && entries[0].isIntersecting && window.scrollY !== 0) { + backToTopDiv.style.visibility = 'visible'; + } else { + backToTopDiv.style.visibility = 'hidden'; + } +} + +// Create the accordion dropdown inside the settings tab +function createAccordion(containerDiv, subfolders, name) { + if (containerDiv == null || subfolders.length == 0) { + return; + } + var accordionContainer = document.createElement('div'); + accordionContainer.id = 'settings-accordion'; + var toggleButton = document.createElement('button'); + toggleButton.id = 'accordionToggle'; + toggleButton.innerHTML = name + '
โ–ผ
'; + toggleButton.onclick = function () { + accordionDiv.style.display = (accordionDiv.style.display === 'none') ? 'block' : 'none'; + toggleButton.lastChild.style.transform = accordionDiv.style.display === 'none' ? 'rotate(90deg)' : 'rotate(0)'; + }; + + accordionContainer.appendChild(toggleButton); + var accordionDiv = document.createElement('div'); + accordionDiv.classList.add('accordion'); + accordionDiv.append(...subfolders); + accordionDiv.style.display = 'none'; + accordionContainer.appendChild(accordionDiv); + containerDiv.appendChild(accordionContainer); +} + +// Adds a button to the cards in txt2img and img2img +function createCivitAICardButtons() { + addOnClickToButtons(); + const copyButton = document.querySelector('.copy-path-button'); + let fontSize; + if (!copyButton) { + const editButton = document.querySelector('.edit-button'); + const originalDisplay = editButton.parentElement.style.display; + editButton.parentElement.style.display = 'flex'; + const editButtonBeforeStyle = window.getComputedStyle(editButton, ':before'); + fontSize = editButtonBeforeStyle.getPropertyValue('font-size'); + editButton.parentElement.style.display = originalDisplay; + } else { + fontSize = '1.8rem'; + } + + const checkForCardDivs = setInterval(() => { + const cardDivs = document.querySelectorAll('.card'); + if (cardDivs.length > 0) { + clearInterval(checkForCardDivs); + + cardDivs.forEach(cardDiv => { + const buttonRow = cardDiv.querySelector('.button-row'); + if (!buttonRow) return; + + buttonRow.addEventListener('click', function(event) { + event.stopPropagation(); + }); + + if (!buttonRow.querySelector('.goto-civitbrowser.card-button')) { + const modelName = cardDiv.querySelector('.actions .name')?.textContent.trim(); + if (!modelName) return; + + const newDiv = document.createElement('div'); + newDiv.className = 'goto-civitbrowser card-button'; + const svgIcon = createSVGIcon(fontSize); + newDiv.appendChild(svgIcon); + + newDiv.onclick = () => modelInfoPopUp(modelName, cardDiv.parentElement.id); + buttonRow.insertBefore(newDiv, buttonRow.firstChild); + } + }); + } + }, 200); + + setTimeout(() => { + clearInterval(checkForCardDivs); + }, 5000); +} + +function createSVGIcon(fontSize) { + const svgIcon = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + svgIcon.setAttribute('width', fontSize); + svgIcon.setAttribute('height', fontSize); + svgIcon.setAttribute('viewBox', '75 85 350 350'); + svgIcon.setAttribute('fill', 'white'); + if (fontSize == "1.8rem") { + svgIcon.setAttribute('style', 'margin-top: -2px'); + } + svgIcon.innerHTML = ` + + + `; + + return svgIcon; +} + +function addOnClickToButtons() { + const tabs = ['img2img_extra_tabs', 'txt2img_extra_tabs'].map(id => document.getElementById(id)); + const buttonIds = [ + 'txt2img_checkpoints_extra_refresh', + 'img2img_checkpoints_extra_refresh', + 'txt2img_extra_refresh', + 'img2img_extra_refresh', + ]; + + buttonIds.forEach(buttonId => { + let button = document.getElementById(buttonId); + if (button) { + button.onclick = () => createCivitAICardButtons(button); + } + }); + + tabs.forEach(tab => { + if (tab) { + const buttons = tab.querySelectorAll('div > button:not(:first-child)'); + buttons.forEach(button => { + button.onclick = () => createCivitAICardButtons(button); + }); + } + }); +} + +function modelInfoPopUp(modelName, content_type) { + select_model(modelName, null, true, content_type); + + const createElementWithStyle = (tag, styles = {}) => { + const el = document.createElement(tag); + Object.assign(el.style, styles); + return el; + }; + + const overlay = createElementWithStyle('div', { + position: 'fixed', + top: '0', + left: '0', + width: '100%', + height: '100%', + backgroundColor: 'rgba(20, 20, 20, 0.95)', + zIndex: '1001', + overflowY: 'auto' + }); + overlay.classList.add('civitai-overlay'); + overlay.addEventListener('keydown', handleKeyPress); + overlay.addEventListener('click', event => { + if (event.target === overlay) hidePopup(); + }); + + const closeButton = createElementWithStyle('div', { + zIndex: '1011', + position: 'fixed', + right: '22px', + top: '0', + cursor: 'pointer', + color: 'white', + fontSize: '32pt' + }); + closeButton.classList.add('civitai-overlay-close'); + closeButton.textContent = 'ร—'; + closeButton.addEventListener('click', hidePopup); + + const inner = createElementWithStyle('div', { + position: 'absolute', + top: '50%', + left: '50%', + width: 'auto', + transform: 'translate(-50%, -50%)', + background: 'var(--neutral-950)', + padding: '2em', + borderRadius: 'var(--block-radius)', + borderStyle: 'solid', + borderWidth: 'var(--block-border-width)', + borderColor: 'var(--block-border-color)', + zIndex: '1001' + }); + inner.classList.add('civitai-overlay-inner'); + + const modelInfo = createElementWithStyle('div', { + fontSize: '24px', + color: 'white', + fontFamily: 'var(--font)' + }); + modelInfo.classList.add('civitai-overlay-text'); + modelInfo.textContent = 'Loading model info, please wait!'; + + document.body.style.overflow = 'hidden'; + document.body.appendChild(overlay); + overlay.append(closeButton, inner); + inner.appendChild(modelInfo); + + setDynamicWidth(inner); + window.addEventListener('resize', () => setDynamicWidth(inner)); +} + +function setDynamicWidth(inner) { + var windowWidth = window.innerWidth; + var dynamicWidth = Math.min(Math.max(windowWidth - 150, 350), 900); + inner.style.width = dynamicWidth + 'px'; +} + +// Function to hide the popup +function hidePopup() { + var overlay = document.querySelector('.civitai-overlay'); + if (overlay) { + document.body.removeChild(overlay); + document.body.style.overflow = 'auto'; + window.removeEventListener('resize', setDynamicWidth); + } +} + +// Function to handle key presses +function handleKeyPress(event) { + if (event.key === 'Escape') { + hidePopup(); + } +} + +function inputHTMLPreviewContent(html_input) { + var inner = document.querySelector('.civitai-overlay-inner') + let startIndex = html_input.indexOf("'value': '"); + if (startIndex !== -1) { + startIndex += "'value': '".length; + const endIndex = html_input.indexOf("', 'type': None,", startIndex); + if (endIndex !== -1) { + let extractedText = html_input.substring(startIndex, endIndex); + var modelIdNotFound = extractedText.includes(">Model ID not found.
The"); + + extractedText = extractedText.replace(/\\n\s* 0) { + return; + } + const genButton = gradioApp().querySelector('#txt2img_extra_tabs > div > button') + let input = element.querySelector('dd').textContent; + let inf; + if (input.endsWith(',')) { + inf = input + ' '; + } else { + inf = input + ', '; + } + let is_positive = false + let is_negative = false + switch(type) { + case 'Prompt': + is_positive = true + break; + case 'Negative prompt': + inf = 'Negative prompt: ' + inf; + is_negative = true + break; + case 'Seed': + inf = 'Seed: ' + inf; + inf = inf + inf + inf; + break; + case 'Size': + inf = 'Size: ' + inf; + inf = inf + inf + inf; + break; + case 'Model': + inf = 'Model: ' + inf; + inf = inf + inf + inf; + break; + case 'Clip skip': + inf = 'Clip skip: ' + inf; + inf = inf + inf + inf; + break; + case 'Sampler': + inf = 'Sampler: ' + inf; + inf = inf + inf + inf; + break; + case 'Steps': + inf = 'Steps: ' + inf; + inf = inf + inf + inf; + break; + case 'CFG scale': + inf = 'CFG scale: ' + inf; + inf = inf + inf + inf; + break; + } + const prompt = gradioApp().querySelector('#txt2img_prompt textarea'); + const neg_prompt = gradioApp().querySelector('#txt2img_neg_prompt textarea'); + const cfg_scale = gradioApp().querySelector('#txt2img_cfg_scale > div:nth-child(2) > div > input'); + let final = ''; + let cfg = 'CFG scale: ' + cfg_scale.value + ", " + let prompt_addon = cfg + cfg + cfg + if (is_positive) { + final = inf + "\nNegative prompt: " + neg_prompt.value + "\n" + prompt_addon; + } else if (is_negative) { + final = prompt.value + "\n" + inf + "\n" + prompt_addon; + } else { + final = prompt.value + "\nNegative prompt: " + neg_prompt.value + "\n" + inf; + } + genInfo_to_txt2img(final, false) + hidePopup(); + sendClick(genButton); +} + +// Creates a list of the selected models +var selectedModels = []; +var selectedTypes = []; +function multi_model_select(modelName, modelType, isChecked) { + if (arguments.length === 0) { + selectedModels = []; + selectedTypes = []; + return; + } + if (isChecked) { + if (!selectedModels.includes(modelName)) { + selectedModels.push(modelName); + } + selectedTypes.push(modelType) + } else { + var modelIndex = selectedModels.indexOf(modelName); + if (modelIndex > -1) { + selectedModels.splice(modelIndex, 1); + } + var typesIndex = selectedTypes.indexOf(modelType); + if (typesIndex > -1) { + selectedTypes.splice(typesIndex, 1); + } + } + const selected_model_list = gradioApp().querySelector('#selected_model_list textarea'); + selected_model_list.value = JSON.stringify(selectedModels); + + const selected_type_list = gradioApp().querySelector('#selected_type_list textarea'); + selected_type_list.value = JSON.stringify(selectedTypes); + + updateInput(selected_model_list); + updateInput(selected_type_list); +} + +function sendClick(location) { + const clickEvent = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: true + }); + location.dispatchEvent(clickEvent); +} + +let currentDlCancelled = false; + +function cancelCurrentDl() { + currentDlCancelled = true; +} + +let allDlCancelled = false; + +function cancelAllDl() { + allDlCancelled = true; +} + +function setSortable() { + new Sortable(document.getElementById('queue_list'), { + onEnd: function(evt) { + const gradio_input = document.querySelector('#civitai_dl_list.prose').innerHTML; + const gradio_html = gradioApp().querySelector('#queue_html_input textarea'); + let output = gradioApp().querySelector('#arrange_dl_id textarea'); + output.value = evt.item.getAttribute('dl_id') + "." + evt.newIndex; + updateInput(output); + gradio_html.value = gradio_input; + updateInput(gradio_html); + } + }); +} + +function cancelQueueDl() { + const cancelBtn = gradioApp().querySelector('#html_cancel_input textarea'); + const randomNumber = Math.floor(Math.random() * 1000); + const paddedNumber = String(randomNumber).padStart(3, '0'); + cancelBtn.value = paddedNumber; + updateInput(cancelBtn);cancelBtn +} + +function setDownloadProgressBar() { + const gradio_html = gradioApp().querySelector('#queue_html_input textarea'); + let browserContainer = document.querySelector('#DownloadProgress'); + let browserProgress = browserContainer.querySelector('.progress-bar'); + if (!browserProgress || !browserProgress.style.width) { + setTimeout(setDownloadProgressBar, 500); + return; + } + + let dlList = document.getElementById('civitai_dl_list'); + let nonQueue = dlList.querySelector('.civitai_nonqueue_list'); + let dlItem = dlList.querySelector('.civitai_dl_item'); + let dlBtn = dlItem.querySelector('.dl_action_btn > span'); + dlBtn.innerText = "Cancel"; + dlBtn.setAttribute('onclick', 'cancelQueueDl()'); + let dlId = dlItem.getAttribute('dl_id'); + let selector = '.civitai_dl_item[dl_id="' + parseInt(dlId) + '"]'; + + let dlProgressBar = null; + let percentage = null; + let dlText = null; + + nonQueue.appendChild(dlItem); + + const interval = setInterval(() => { + browserContainer = document.querySelector('#DownloadProgress'); + browserProgress = browserContainer.querySelector('.progress-bar'); + dlText = browserContainer.querySelector('.progress-level-inner'); + if (!dlText) { + return; + } + dlText = dlText.innerText + percentage = parseFloat(browserProgress.style.width); + + dlItem = dlList.querySelector(selector); + dlProgressBar = dlItem.querySelector('.dl_progress_bar'); + + dlProgressBar.textContent = percentage.toFixed(1) + '%'; + dlProgressBar.style.width = percentage + '%'; + + if (percentage >= 100) { + clearInterval(interval); + dlBtn = dlItem.querySelector('.dl_action_btn > span'); + dlBtn.innerText = "Remove"; + dlBtn.setAttribute('onclick', 'removeDlItem(' + parseInt(dlId) + ', this)'); + dlItem.className = 'civitai_dl_item_completed'; + dlProgressBar.textContent = 'Completed'; + dlProgressBar.style.width = '100%'; + const gradio_input = document.querySelector('#civitai_dl_list.prose').innerHTML; + gradio_html.value = gradio_input + updateInput(gradio_html); + return; + } + + if (currentDlCancelled) { + clearInterval(interval); + dlBtn = dlItem.querySelector('.dl_action_btn > span'); + dlBtn.innerText = "Remove"; + dlBtn.setAttribute('onclick', 'removeDlItem(' + parseInt(dlId) + ', this)'); + currentDlCancelled = false; + dlItem.className = 'civitai_dl_item_failed'; + dlProgressBar.textContent = 'Cancelled'; + dlProgressBar.style.width = "0%"; + const gradio_input = document.querySelector('#civitai_dl_list.prose').innerHTML; + gradio_html.value = gradio_input + updateInput(gradio_html); + return; + } else if (allDlCancelled) { + clearInterval(interval); + allDlCancelled = false; + let dlItems = dlList.querySelectorAll('.civitai_dl_item'); + dlItems.forEach(function(item) { + dlBtn = dlItem.querySelector('.dl_action_btn > span'); + dlBtn.innerText = "Remove"; + dlBtn.setAttribute('onclick', 'removeDlItem(' + parseInt(dlId) + ', this)'); + dlProgressBar = item.querySelector('.dl_progress_bar'); + dlProgressBar.textContent = 'Cancelled'; + dlProgressBar.style.width = "0%"; + nonQueue.appendChild(item); + item.className = 'civitai_dl_item_failed'; + }); + const gradio_input = document.querySelector('#civitai_dl_list.prose').innerHTML; + gradio_html.value = gradio_input + updateInput(gradio_html); + return; + } else if (dlText.includes('Encountered an error during download of') || dlText.includes('not found on CivitAI servers') || dlText.includes('requires a personal CivitAI API to be downloaded')) { + clearInterval(interval); + dlBtn = dlItem.querySelector('.dl_action_btn > span'); + dlBtn.innerText = "Remove"; + dlBtn.setAttribute('onclick', 'removeDlItem(' + parseInt(dlId) + ', this)'); + dlItem.className = 'civitai_dl_item_failed'; + dlProgressBar.textContent = 'Failed'; + dlProgressBar.style.width = "0%"; + const gradio_input = document.querySelector('#civitai_dl_list.prose').innerHTML; + gradio_html.value = gradio_input + updateInput(gradio_html); + return; + } + }, 500); +} + +function removeDlItem(dl_id, element) { + const gradio_html = gradioApp().querySelector('#queue_html_input textarea'); + const output = gradioApp().querySelector('#remove_dl_id textarea'); + var dl_item = element.parentNode.parentNode; + dl_item.parentNode.removeChild(dl_item); + output.value = dl_id + updateInput(output); + + const gradio_input = document.querySelector('#civitai_dl_list.prose').innerHTML; + gradio_html.value = gradio_input; + updateInput(gradio_html); +} + +// Selects all models +function selectAllModels() { + const checkboxes = Array.from(document.querySelectorAll('.model-checkbox')); + const allChecked = checkboxes.every(checkbox => checkbox.checked); + const allUnchecked = checkboxes.every(checkbox => !checkbox.checked); + if (allChecked || allUnchecked) { + checkboxes.forEach(sendClick); + } else { + checkboxes.filter(checkbox => !checkbox.checked).forEach(sendClick); + } +} + +// Deselects all models +function deselectAllModels() { + setTimeout(() => { + const checkboxes = Array.from(document.querySelectorAll('.model-checkbox')); + checkboxes.filter(checkbox => checkbox.checked).forEach(sendClick); + }, 1000); +} + +// Sends Image URL to Python to pull generation info +function sendImgUrl(image_url) { + const randomNumber = Math.floor(Math.random() * 1000); + const genButton = gradioApp().querySelector('#txt2img_extra_tabs > div > button') + const paddedNumber = String(randomNumber).padStart(3, '0'); + const input = gradioApp().querySelector('#civitai_text2img_input textarea'); + input.value = paddedNumber + "." + image_url; + updateInput(input); + hidePopup(); + sendClick(genButton); +} + +// Sends txt2img info to txt2img tab +function genInfo_to_txt2img(genInfo, do_slice=true) { + let insert = gradioApp().querySelector('#txt2img_prompt textarea'); + let pasteButton = gradioApp().querySelector('#paste'); + if (genInfo) { + insert.value = do_slice ? genInfo.slice(5) : genInfo; + insert.dispatchEvent(new Event('input', { bubbles: true })); + pasteButton.dispatchEvent(new Event('click', { bubbles: true })); + } +} + +// Hide installed models +function hideInstalled(toggleValue) { + const modelList = document.querySelectorAll('.column.civmodellist > .civmodelcardinstalled') + modelList.forEach(item => { + item.style.display = toggleValue ? 'none' : 'block'; + }); +} + +function setDescriptionToggle() { + const popUp = document.querySelector(".civitai-overlay-inner"); + let toggleButton = null; + let descriptionDiv = null; + + if (popUp) { + descriptionDiv = popUp.querySelector(".model-description"); + toggleButton = popUp.querySelector(".description-toggle-label"); + } else { + descriptionDiv = document.querySelector(".model-description"); + toggleButton = document.querySelector(".description-toggle-label"); + } + + if (descriptionDiv && descriptionDiv.scrollHeight <= 400) { + toggleButton.style.visibility = "hidden"; + toggleButton.style.height = "0"; + descriptionDiv.style.position = "unset"; + } +} + +// Runs all functions when the page is fully loaded +function onPageLoad() { + const divElement = document.getElementById('setting_custom_api_key'); + const infoElement = divElement?.querySelector('.info'); + if (!infoElement) { + return; + } + clearInterval(intervalID); + + updateSVGIcons(); + + let subfolderDiv = document.querySelector("#settings_civitai_browser_plus > div > div"); + let downloadDiv = document.querySelector("#settings_civitai_browser_download > div > div"); + let upscalerDiv = document.querySelector("#settings_civitai_browser_plus > div > div > #settings-accordion > div"); + let downloadDivSub = document.querySelector("#settings_civitai_browser_download > div > div > #settings-accordion > div"); + let settingsDiv = document.querySelector("#settings_civitai_browser > div > div"); + + if (subfolderDiv || downloadDiv) { + let div = subfolderDiv || downloadDiv; + let subfolders = div.querySelectorAll("[id$='subfolder']"); + createAccordion(div, subfolders, "Default sub folders"); + } + + if (upscalerDiv || downloadDivSub) { + let div = upscalerDiv || downloadDivSub; + let upscalers = div.querySelectorAll("[id$='upscale_subfolder']"); + createAccordion(div, upscalers, "Upscalers"); + } + + if (subfolderDiv || settingsDiv) { + let div = subfolderDiv || settingsDiv; + let subfolders = div.querySelectorAll("[id^='setting_insert_sub']"); + createAccordion(div, subfolders, "Insert sub folder options"); + + let proxy = div.querySelectorAll("[id$='proxy']"); + createAccordion(div, proxy, "Proxy options"); + } + + let toggle4L = document.getElementById('toggle4L'); + let toggle4 = document.getElementById('toggle4'); + let hash_toggle_hover = document.querySelector('#skip_hash_toggle > label'); + let hash_toggle = document.querySelector('#skip_hash_toggle'); + + if (toggle4L || toggle4) { + let like_toggle = toggle4L || toggle4; + let insertText = 'Requires an API Key\nConfigurable in CivitAI settings tab'; + createTooltip(like_toggle, like_toggle, insertText); + } + + if (hash_toggle) { + let insertText = 'This option generates unique hashes for models that were not downloaded with this extension.\nA hash is required for any of the options below to work, a model with no hash will be skipped.\nInitial hash generation is a one-time process per file.'; + createTooltip(hash_toggle, hash_toggle_hover, insertText); + } + + addOnClickToButtons(); + createCivitAICardButtons(); + adjustFilterBoxAndButtons(); + setupClickOutsideListener(); + createLink(infoElement); + updateBackToTopVisibility([{isIntersecting: false}]); +} + +// Checks every second if the page is fully loaded +let intervalID = setInterval(onPageLoad, 1000); \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_api.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05306f6fbe6c007edbcc161dee39b539d1a68e6b Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_api.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_download.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_download.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..854dfc225efb284d597145043df0366daac0eb36 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_download.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_file_manage.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_file_manage.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e1a30641dc9f61676ff5d2fd31512a169a5b0e2 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_file_manage.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_global.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_global.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2fa5fb48f6f373411cf4b59d028225fd033cb4b Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_global.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_gui.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_gui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f667d7cae99137b49931c2345564fe8b8402e162 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/__pycache__/civitai_gui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_api.py b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_api.py new file mode 100644 index 0000000000000000000000000000000000000000..e10f39c6f3dcf03f2f895555db628decda3ea8c8 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_api.py @@ -0,0 +1,1298 @@ +import requests +import json +import gradio as gr +import urllib.request +import urllib.parse +import urllib.error +import os +import re +import datetime +import platform +from PIL import Image +from io import BytesIO +from collections import defaultdict +from datetime import datetime, timezone +from modules.images import read_info_from_image +from modules.shared import cmd_opts, opts +from modules.paths import models_path, extensions_dir, data_path +from html import escape +from scripts.civitai_global import print +import scripts.civitai_global as gl +import scripts.civitai_download as _download +try: + from fake_useragent import UserAgent +except ImportError: + print("Python module 'fake_useragent' has not been imported correctly, please try to restart or install it manually.") + +gl.init() + +def contenttype_folder(content_type, desc=None, fromCheck=False, custom_folder=None): + use_LORA = getattr(opts, "use_LORA", False) + folder = None + if desc: + desc = desc.upper() + else: + desc = "PLACEHOLDER" + if custom_folder: + main_models = custom_folder + main_data = custom_folder + else: + main_models = models_path + main_data = data_path + + if content_type == "modelFolder": + folder = os.path.join(main_models) + + if content_type == "Checkpoint": + if cmd_opts.ckpt_dir and not custom_folder: + folder = cmd_opts.ckpt_dir + else: + folder = os.path.join(main_models,"Stable-diffusion") + + elif content_type == "Hypernetwork": + if cmd_opts.hypernetwork_dir and not custom_folder: + folder = cmd_opts.hypernetwork_dir + else: + folder = os.path.join(main_models, "hypernetworks") + + elif content_type == "TextualInversion": + if cmd_opts.embeddings_dir and not custom_folder: + folder = cmd_opts.embeddings_dir + else: + folder = os.path.join(main_data, "embeddings") + + elif content_type == "AestheticGradient": + if not custom_folder: + folder = os.path.join(extensions_dir, "stable-diffusion-webui-aesthetic-gradients", "aesthetic_embeddings") + else: + folder = os.path.join(custom_folder, "aesthetic_embeddings") + elif content_type == "LORA": + if cmd_opts.lora_dir and not custom_folder: + folder = cmd_opts.lora_dir + else: + folder = folder = os.path.join(main_models, "Lora") + + elif content_type == "LoCon": + folder = os.path.join(main_models, "LyCORIS") + if use_LORA and not fromCheck: + if cmd_opts.lora_dir and not custom_folder: + folder = cmd_opts.lora_dir + else: + folder = folder = os.path.join(main_models, "Lora") + + elif content_type == "VAE": + if cmd_opts.vae_dir and not custom_folder: + folder = cmd_opts.vae_dir + else: + folder = os.path.join(main_models, "VAE") + + elif content_type == "Controlnet": + folder = os.path.join(main_models, "ControlNet") + + elif content_type == "Poses": + folder = os.path.join(main_models, "Poses") + + elif content_type == "Upscaler": + if "SWINIR" in desc: + if cmd_opts.swinir_models_path and not custom_folder: + folder = cmd_opts.swinir_models_path + else: + folder = os.path.join(main_models, "SwinIR") + elif "REALESRGAN" in desc: + if cmd_opts.realesrgan_models_path and not custom_folder: + folder = cmd_opts.realesrgan_models_path + else: + folder = os.path.join(main_models, "RealESRGAN") + elif "GFPGAN" in desc: + if cmd_opts.gfpgan_models_path and not custom_folder: + folder = cmd_opts.gfpgan_models_path + else: + folder = os.path.join(main_models, "GFPGAN") + elif "BSRGAN" in desc: + if cmd_opts.bsrgan_models_path and not custom_folder: + folder = cmd_opts.bsrgan_models_path + else: + folder = os.path.join(main_models, "BSRGAN") + else: + if cmd_opts.esrgan_models_path and not custom_folder: + folder = cmd_opts.esrgan_models_path + else: + folder = os.path.join(main_models, "ESRGAN") + + elif content_type == "MotionModule": + folder = os.path.join(extensions_dir, "sd-webui-animatediff", "model") + + elif content_type == "Workflows": + folder = os.path.join(main_models, "Workflows") + + elif content_type == "Other": + if "ADETAILER" in desc: + folder = os.path.join(main_models, "adetailer") + else: + folder = os.path.join(main_models, "Other") + + elif content_type == "Wildcards": + folder = os.path.join(extensions_dir, "UnivAICharGen", "wildcards") + if not os.path.exists(folder): + folder = os.path.join(extensions_dir, "sd-dynamic-prompts", "wildcards") + + return folder + +def api_to_data(content_type, sort_type, period_type, use_search_term, current_page, base_filter, only_liked, tile_count, search_term=None, nsfw=None, timeOut=None, isNext=None, inputs_changed=None): + if current_page in [0, None, ""]: + current_page = 1 + if inputs_changed: + gl.file_scan = False + api_url = f"https://civitai.com/api/v1/models?limit={tile_count}&page=1" + else: + api_url = f"https://civitai.com/api/v1/models?limit={tile_count}&page={current_page}" + + if timeOut: + if isNext: + next_page = str(int(current_page) + 1) + else: + if current_page not in [1, 0, None, ""]: + next_page = str(int(current_page) - 1) + api_url = f"https://civitai.com/api/v1/models?limit={tile_count}&page={next_page}" + + if period_type: + period_type = period_type.replace(" ", "") + query = {'sort': sort_type, 'period': period_type} + + types_query_str = "" + + if content_type: + types_query_str = "".join([f"&types={type}" for type in content_type]) + + query_str = urllib.parse.urlencode(query, quote_via=urllib.parse.quote) + + if types_query_str: + query_str += types_query_str + + if use_search_term != "None" and search_term: + search_term = search_term.replace("\\","\\\\") + if "civitai.com" in search_term: + match = re.search(r'models/(\d+)', search_term) + model_number = match.group(1) + query_str = f"&ids={urllib.parse.quote(model_number)}" + elif use_search_term == "User name": + query_str += f"&username={urllib.parse.quote(search_term)}" + elif use_search_term == "Tag": + query_str += f"&tag={urllib.parse.quote(search_term)}" + else: + query_str += f"&query={urllib.parse.quote(search_term)}" + + if base_filter: + for base in base_filter: + query_str += f"&baseModels={urllib.parse.quote(base)}" + + if only_liked: + query_str += f"&favorites=true" + + if nsfw == False: + query_str += f"&nsfw=false" + + full_url = f"{api_url}&{query_str}" + + if gl.file_scan: + highest_number = max(gl.url_list_with_numbers.keys()) + full_url = gl.url_list_with_numbers.get(int(current_page)) + nextPage = int(current_page) + 1 + prevPage = int(current_page) - 1 + data = request_civit_api(full_url) + data["metadata"]["currentPage"] = current_page + data["metadata"]["totalPages"] = highest_number + if not nextPage > highest_number: + data["metadata"]["nextPage"] = gl.url_list_with_numbers.get(nextPage) + if not prevPage == 0: + data["metadata"]["prevPage"] = gl.url_list_with_numbers.get(prevPage) + else: + data = request_civit_api(full_url) + + return data + +def model_list_html(json_data): + video_playback = getattr(opts, "video_playback", True) + playback = "" + if video_playback: playback = "autoplay loop" + + hide_early_access = getattr(opts, "hide_early_access", True) + filtered_items = [] + current_time = datetime.now(timezone.utc) + + for item in json_data['items']: + versions_to_keep = [] + + for version in item['modelVersions']: + if not version['files']: + continue + + if hide_early_access: + early_access_deadline_str = version.get('earlyAccessDeadline') + if early_access_deadline_str: + early_access_deadline = datetime.strptime(early_access_deadline_str, "%Y-%m-%dT%H:%M:%S.%fZ").replace(tzinfo=timezone.utc) + if current_time <= early_access_deadline: + continue + + versions_to_keep.append(version) + + if versions_to_keep: + item['modelVersions'] = versions_to_keep + filtered_items.append(item) + + json_data['items'] = filtered_items + + HTML = '
' + sorted_models = {} + existing_files = set() + existing_files_sha256 = set() + model_folders = set() + + for item in json_data['items']: + model_folder = os.path.join(contenttype_folder(item['type'], item['description'])) + model_folders.add(model_folder) + + for folder in model_folders: + for root, dirs, files in os.walk(folder, followlinks=True): + for file in files: + existing_files.add(file) + if file.endswith('.json'): + json_path = os.path.join(root, file) + with open(json_path, 'r', encoding="utf-8") as f: + try: + json_file = json.load(f) + if isinstance(json_file, dict): + sha256 = json_file.get('sha256') + if sha256: + existing_files_sha256.add(sha256.upper()) + else: + print(f"Invalid JSON data in {json_path}. Expected a dictionary.") + except Exception as e: + print(f"Error decoding JSON in {json_path}: {e}") + + for item in json_data['items']: + model_id = item.get('id') + model_name = item.get('name') + nsfw = "" + installstatus = "" + baseModel = "" + try: + if 'baseModel' in item['modelVersions'][0]: + baseModel = item['modelVersions'][0]['baseModel'] + except: + baseModel = "Not Found" + + try: + if 'updatedAt' in item['modelVersions'][0]: + date = item['modelVersions'][0]['updatedAt'].split('T')[0] + except: + baseModel = "Not Found" + + if gl.sortNewest: + if date not in sorted_models: + sorted_models[date] = [] + + if any(item['modelVersions']): + if len(item['modelVersions'][0]['images']) > 0: + if item["modelVersions"][0]["images"][0]['nsfw'] not in ["None", "Soft"]: + nsfw = "civcardnsfw" + media_type = item["modelVersions"][0]["images"][0]["type"] + image = item["modelVersions"][0]["images"][0]["url"] + if media_type == "video": + image = image.replace("width=", "transcode=true,width=") + imgtag = f'' + else: + imgtag = f'' + else: + imgtag = f'' + + installstatus = None + + for version in reversed(item['modelVersions']): + for file in version.get('files', []): + file_name = file['name'] + file_sha256 = file.get('hashes', {}).get('SHA256', "").upper() + + name_match = file_name in existing_files + sha256_match = file_sha256 in existing_files_sha256 + if name_match or sha256_match: + if version == item['modelVersions'][0]: + installstatus = "civmodelcardinstalled" + else: + installstatus = "civmodelcardoutdated" + model_name_js = model_name.replace("'", "\\'") + model_string = escape(f"{model_name_js} ({model_id})") + model_card = f'
' + if installstatus != "civmodelcardinstalled": + model_card += f'' \ + + f'' + if len(item["name"]) > 40: + display_name = item["name"][:40] + '...' + else: + display_name = item["name"] + + display_name = escape(display_name) + full_name = escape(item['name']) + model_card += imgtag \ + + f'
{display_name}
' + + if gl.sortNewest: + sorted_models[date].append(model_card) + else: + HTML += model_card + + if gl.sortNewest: + for date, cards in sorted(sorted_models.items(), reverse=True): + HTML += f'

{date}


' + HTML += '
' + for card in cards: + HTML += card + HTML += '
' + + HTML += '
' + return HTML + +def update_prev_page(content_type, sort_type, period_type, use_search_term, search_term, current_page, base_filter, only_liked, nsfw, tile_count): + return update_next_page(content_type, sort_type, period_type, use_search_term, search_term, current_page, base_filter, only_liked, nsfw, tile_count, isNext=False) + +def update_next_page(content_type, sort_type, period_type, use_search_term, search_term, current_page, base_filter, only_liked, nsfw, tile_count, isNext=True): + use_LORA = getattr(opts, "use_LORA", False) + + if content_type: + if use_LORA and 'LORA & LoCon' in content_type: + content_type.remove('LORA & LoCon') + if 'LORA' not in content_type: + content_type.append('LORA') + if 'LoCon' not in content_type: + content_type.append('LoCon') + + if not isinstance(gl.json_data, dict): + timeOut = True + return_values = update_model_list(content_type, sort_type, period_type, use_search_term, search_term, current_page, base_filter, only_liked, nsfw, timeOut=timeOut, isNext=isNext) + timeOut = False + + return return_values + + current_inputs = (content_type, sort_type, period_type, use_search_term, search_term, tile_count, base_filter, nsfw) + if current_inputs != gl.previous_inputs and gl.previous_inputs != None: + inputs_changed = True + else: + inputs_changed = False + + if inputs_changed: + return_values = update_model_list(content_type, sort_type, period_type, use_search_term, search_term, current_page, base_filter, only_liked, nsfw, tile_count) + return return_values + + if not gl.file_scan: + if isNext: + if gl.json_data['metadata']['nextPage'] is not None: + gl.json_data = request_civit_api(gl.json_data['metadata']['nextPage']) + else: + gl.json_data = None + else: + if gl.json_data['metadata']['prevPage'] is not None: + gl.json_data = request_civit_api(gl.json_data['metadata']['prevPage']) + else: + gl.json_data = None + else: + highest_number = max(gl.url_list_with_numbers.keys()) + if isNext: + if gl.json_data['metadata']['nextPage'] is not None: + currentPage = int(gl.json_data['metadata']['currentPage']) + nextPage = currentPage + 2 + prevPage = currentPage + pageCount = currentPage + 1 + gl.json_data = request_civit_api(gl.json_data['metadata']['nextPage']) + + gl.json_data["metadata"]["totalPages"] = highest_number + if not nextPage > highest_number: + gl.json_data["metadata"]["nextPage"] = gl.url_list_with_numbers.get(nextPage) + if not prevPage == 0: + gl.json_data["metadata"]["prevPage"] = gl.url_list_with_numbers.get(prevPage) + gl.json_data["metadata"]["currentPage"] = pageCount + else: + gl.json_data = None + else: + if gl.json_data['metadata']['prevPage'] is not None: + currentPage = int(gl.json_data['metadata']['currentPage']) + nextPage = currentPage + prevPage = currentPage - 2 + pageCount = currentPage - 1 + gl.json_data = request_civit_api(gl.json_data['metadata']['prevPage']) + + gl.json_data["metadata"]["totalPages"] = highest_number + if not nextPage > highest_number: + gl.json_data["metadata"]["nextPage"] = gl.url_list_with_numbers.get(nextPage) + if not prevPage == 0: + gl.json_data["metadata"]["prevPage"] = gl.url_list_with_numbers.get(prevPage) + gl.json_data["metadata"]["currentPage"] = pageCount + else: + gl.json_data = None + + if gl.json_data is None: + return + + if not isinstance(gl.json_data, dict): + hasPrev = current_page not in [0, 1] + hasNext = current_page == 1 or hasPrev + model_dict = {} + + if gl.json_data == "timeout": + HTML = api_error_msg("timeout") + elif gl.json_data == "offline": + HTML = api_error_msg("offline") + elif gl.json_data == "error": + HTML = api_error_msg("error") + + else: + (hasPrev, hasNext, current_page, total_pages) = pagecontrol(gl.json_data) + model_dict = {} + try: + gl.json_data['items'] + except TypeError: + return gr.Dropdown.update(choices=[], value=None) + + HTML = model_list_html(gl.json_data) + + page_string = f"Page: {current_page}/{total_pages}" + + return ( + gr.Dropdown.update(choices=[v for k, v in model_dict.items()], value="", interactive=True), # Model List + gr.Dropdown.update(choices=[], value=""), # Version List + gr.HTML.update(value=HTML), # HTML Tiles + gr.Button.update(interactive=hasPrev), # Prev Page Button + gr.Button.update(interactive=hasNext), # Next Page Button + gr.Slider.update(value=current_page, maximum=total_pages, label=page_string), # Page Count + gr.Button.update(interactive=False), # Save Tags + gr.Button.update(interactive=False), # Save Images + gr.Button.update(interactive=False, visible=False if gl.isDownloading else True), # Download Button + gr.Button.update(interactive=False, visible=False), # Delete Button + gr.Textbox.update(interactive=False, value=None), # Install Path + gr.Dropdown.update(choices=[], value="", interactive=False), # Sub Folder List + gr.Dropdown.update(choices=[], value="", interactive=False), # File List + gr.HTML.update(value='
'), # Preview HTML + gr.Textbox.update(value=None), # Trained Tags + gr.Textbox.update(value=None), # Base Model + gr.Textbox.update(value=None) # Model Filename + ) + +def pagecontrol(json_data): + current_page = f"{json_data['metadata']['currentPage']}" + total_pages = f"{json_data['metadata']['totalPages']}" + hasNext = False + hasPrev = False + if 'nextPage' in json_data['metadata']: + hasNext = True + if 'prevPage' in json_data['metadata']: + hasPrev = True + return hasPrev, hasNext, current_page, total_pages + +def update_model_list(content_type=None, sort_type=None, period_type=None, use_search_term=None, search_term=None, current_page=None, base_filter=None, only_liked=None, nsfw=None, tile_count=None, timeOut=None, isNext=None, from_ver=False, from_installed=False): + use_LORA = getattr(opts, "use_LORA", False) + model_list = [] + + if content_type: + if use_LORA and 'LORA & LoCon' in content_type: + content_type.remove('LORA & LoCon') + if 'LORA' not in content_type: + content_type.append('LORA') + if 'LoCon' not in content_type: + content_type.append('LoCon') + + if not from_ver and not from_installed: + gl.ver_json = None + + current_inputs = (content_type, sort_type, period_type, use_search_term, search_term, tile_count, base_filter, nsfw) + if current_inputs != gl.previous_inputs and gl.previous_inputs != None: + inputs_changed = True + else: + inputs_changed = False + + gl.previous_inputs = current_inputs + + gl.json_data = api_to_data(content_type, sort_type, period_type, use_search_term, current_page, base_filter, only_liked, tile_count, search_term, nsfw, timeOut, isNext, inputs_changed) + if gl.json_data is None: + return + + if not isinstance(gl.json_data, dict): + hasPrev = current_page not in [0, 1] + hasNext = current_page == 1 or hasPrev + + if gl.json_data == "timeout": + HTML = api_error_msg("timeout") + elif gl.json_data == "offline": + HTML = api_error_msg("offline") + elif gl.json_data == "error": + HTML = api_error_msg("error") + + if from_installed or from_ver: + gl.json_data = gl.ver_json + + if isinstance(gl.json_data, dict): + if not from_ver: + (hasPrev, hasNext, current_page, total_pages) = pagecontrol(gl.json_data) + else: + current_page = 1 + total_pages = 1 + hasPrev = False + hasNext = False + for item in gl.json_data['items']: + model_list.append(f"{item['name']} ({item['id']})") + + HTML = model_list_html(gl.json_data) + else: + current_page = 1 + total_pages = 1 + + page_string = f"Page: {current_page}/{total_pages}" + + return ( + gr.Dropdown.update(choices=model_list, value="", interactive=True), # Model List + gr.Dropdown.update(choices=[], value=""), # Version List + gr.HTML.update(value=HTML), # HTML Tiles + gr.Button.update(interactive=hasPrev), # Prev Page Button + gr.Button.update(interactive=hasNext), # Next Page Button + gr.Slider.update(value=current_page, maximum=total_pages, label=page_string), # Page Count + gr.Button.update(interactive=False), # Save Tags + gr.Button.update(interactive=False), # Save Images + gr.Button.update(interactive=False, visible=False if gl.isDownloading else True), # Download Button + gr.Button.update(interactive=False, visible=False), # Delete Button + gr.Textbox.update(interactive=False, value=None, visible=True), # Install Path + gr.Dropdown.update(choices=[], value="", interactive=False), # Sub Folder List + gr.Dropdown.update(choices=[], value="", interactive=False), # File List + gr.HTML.update(value='
'), # Preview HTML + gr.Textbox.update(value=None), # Trained Tags + gr.Textbox.update(value=None), # Base Model + gr.Textbox.update(value=None) # Model Filename + ) + +def update_model_versions(model_id, json_input=None): + if json_input: + api_json = json_input + else: + api_json = gl.json_data + for item in api_json['items']: + if int(item['id']) == int(model_id): + content_type = item['type'] + desc = item.get('description', "None") + + versions_dict = defaultdict(list) + installed_versions = set() + + model_folder = os.path.join(contenttype_folder(content_type, desc)) + gl.main_folder = model_folder + versions = item['modelVersions'] + + version_files = set() + for version in versions: + versions_dict[version['name']].append(item["name"]) + for version_file in version['files']: + file_sha256 = version_file.get('hashes', {}).get('SHA256', "").upper() + version_filename = version_file['name'] + version_files.add((version['name'], version_filename, file_sha256)) + + for root, _, files in os.walk(model_folder, followlinks=True): + for file in files: + if file.endswith('.json'): + try: + json_path = os.path.join(root, file) + with open(json_path, 'r', encoding="utf-8") as f: + json_data = json.load(f) + if isinstance(json_data, dict): + if 'sha256' in json_data and json_data['sha256']: + sha256 = json_data.get('sha256', "").upper() + for version_name, _, file_sha256 in version_files: + if sha256 == file_sha256: + installed_versions.add(version_name) + break + except Exception as e: + print(f"failed to read: \"{file}\": {e}") + + for version_name, version_filename, _ in version_files: + if file == version_filename: + installed_versions.add(version_name) + break + + version_names = list(versions_dict.keys()) + display_version_names = [f"{v} [Installed]" if v in installed_versions else v for v in version_names] + default_installed = next((f"{v} [Installed]" for v in installed_versions), None) + default_value = default_installed or next(iter(version_names), None) + + return gr.Dropdown.update(choices=display_version_names, value=default_value, interactive=True) # Version List + + return gr.Dropdown.update(choices=[], value=None, interactive=False) # Version List + +def cleaned_name(file_name): + if platform.system() == "Windows": + illegal_chars_pattern = r'[\\/:*?"<>|]' + else: + illegal_chars_pattern = r'/' + + name, extension = os.path.splitext(file_name) + clean_name = re.sub(illegal_chars_pattern, '', name) + + return f"{clean_name}{extension}" + +def fetch_and_process_image(image_url): + proxies, ssl = get_proxies() + try: + parsed_url = urllib.parse.urlparse(image_url) + if parsed_url.scheme and parsed_url.netloc: + response = requests.get(image_url, proxies=proxies, verify=ssl) + if response.status_code == 200: + image = Image.open(BytesIO(response.content)) + geninfo, _ = read_info_from_image(image) + return geninfo + else: + image = Image.open(image_url) + geninfo, _ = read_info_from_image(image) + return geninfo + except: + return None + +def extract_model_info(input_string): + last_open_parenthesis = input_string.rfind("(") + last_close_parenthesis = input_string.rfind(")") + + name = input_string[:last_open_parenthesis].strip() + id_number = input_string[last_open_parenthesis + 1:last_close_parenthesis] + + return name, int(id_number) + +def update_model_info(model_string=None, model_version=None, only_html=False, input_id=None, json_input=None, from_preview=False): + video_playback = getattr(opts, "video_playback", True) + meta_btn = getattr(opts, "individual_meta_btn", True) + playback = "" + if video_playback: playback = "autoplay loop" + + if json_input: + api_data = json_input + else: + api_data = gl.json_data + + BtnDownInt = True + BtnDel = False + BtnImage = False + model_id = None + + if not input_id: + _, model_id = extract_model_info(model_string) + else: + model_id = input_id + + if model_version and "[Installed]" in model_version: + model_version = model_version.replace(" [Installed]", "") + if model_id: + output_html = "" + output_training = "" + output_basemodel = "" + img_html = "" + dl_dict = {} + is_LORA = False + file_list = [] + file_dict = [] + default_file = None + model_filename = None + sha256_value = None + for item in api_data['items']: + if int(item['id']) == int(model_id): + content_type = item['type'] + if content_type == "LORA": + is_LORA = True + desc = item['description'] + model_name = item['name'] + model_folder = os.path.join(contenttype_folder(content_type, desc)) + model_uploader = item['creator']['username'] + uploader_avatar = item['creator']['image'] + if uploader_avatar is None: + uploader_avatar = '' + else: + uploader_avatar = f'
' + tags = item.get('tags', "") + model_desc = item.get('description', "") + if model_desc: + model_desc = model_desc.replace('', '') + if model_version is None: + selected_version = item['modelVersions'][0] + else: + for model in item['modelVersions']: + if model['name'] == model_version: + selected_version = model + break + + if selected_version['trainedWords']: + output_training = ",".join(selected_version['trainedWords']) + output_training = re.sub(r'<[^>]*:[^>]*>', '', output_training) + output_training = re.sub(r', ?', ', ', output_training) + output_training = output_training.strip(', ') + if selected_version['baseModel']: + output_basemodel = selected_version['baseModel'] + for file in selected_version['files']: + dl_dict[file['name']] = file['downloadUrl'] + + if not model_filename: + model_filename = file['name'] + dl_url = file['downloadUrl'] + gl.json_info = item + sha256_value = file['hashes'].get('SHA256', 'Unknown') + + size = file['metadata'].get('size', 'Unknown') + format = file['metadata'].get('format', 'Unknown') + fp = file['metadata'].get('fp', 'Unknown') + sizeKB = file.get('sizeKB', 0) * 1024 + filesize = _download.convert_size(sizeKB) + + unique_file_name = f"{size} {format} {fp} ({filesize})" + is_primary = file.get('primary', False) + file_list.append(unique_file_name) + file_dict.append({ + "format": format, + "sizeKB": sizeKB + }) + if is_primary: + default_file = unique_file_name + model_filename = file['name'] + dl_url = file['downloadUrl'] + gl.json_info = item + sha256_value = file['hashes'].get('SHA256', 'Unknown') + + safe_tensor_found = False + pickle_tensor_found = False + if is_LORA and file_dict: + for file_info in file_dict: + file_format = file_info.get("format", "") + if "SafeTensor" in file_format: + safe_tensor_found = True + if "PickleTensor" in file_format: + pickle_tensor_found = True + + if safe_tensor_found and pickle_tensor_found: + if "PickleTensor" in file_dict[0].get("format", ""): + if file_dict[0].get("sizeKB", 0) <= 100: + model_folder = os.path.join(contenttype_folder("TextualInversion")) + + model_url = selected_version.get('downloadUrl', '') + model_main_url = f"https://civitai.com/models/{item['id']}" + img_html = '
' + + url = f"https://civitai.com/api/v1/model-versions/{selected_version['id']}" + api_version = request_civit_api(url) + + for index, pic in enumerate(api_version['images']): + + if from_preview: + index = f"preview_{index}" + + nsfw = 'class="model-block"' + if pic['nsfw'] not in ["None", "Soft"]: + nsfw = 'class="civnsfw model-block"' + + img_html += f''' +
+
+ + + + ''' + + if meta_button: + img_html += f''' +
+ +
+ ''' + else: + img_html += '
' + + if prompt_dict: + img_html += '
' + # Define the preferred order of keys + preferred_order = ["prompt", "negativePrompt", "seed", "Size", "Model", "Clip skip", "sampler", "steps", "cfgScale"] + # Loop through the keys in the preferred order and add them to the HTML + for key in preferred_order: + if key in prompt_dict: + value = prompt_dict[key] + key_map = { + "prompt": "Prompt", + "negativePrompt": "Negative prompt", + "seed": "Seed", + "Size": "Size", + "Model": "Model", + "Clip skip": "Clip skip", + "sampler": "Sampler", + "steps": "Steps", + "cfgScale": "CFG scale" + } + key = key_map.get(key, key) + + if meta_btn: + img_html += f'
{escape(str(key))}
{escape(str(value))}
' + else: + img_html += f'
{escape(str(key))}
{escape(str(value))}
' + # Check if there are remaining keys in meta + remaining_keys = [key for key in prompt_dict if key not in preferred_order] + + # Add the rest + if remaining_keys: + img_html += f""" +
+
+ + +
+ """ + for key in remaining_keys: + value = prompt_dict[key] + img_html += f'
{escape(str(key).capitalize())}
{escape(str(value))}
' + img_html = img_html + '
' + + img_html += '
' + + img_html = img_html + '
' + img_html = img_html + '' + tags_html = ''.join([f'{escape(str(tag))}' for tag in tags]) + def perms_svg(color): + return f''\ + f'' + allow_svg = f'{perms_svg("lime")}' + deny_svg = f'{perms_svg("red")}' + allowCommercialUse = item.get("allowCommercialUse", []) + perms_html= '

'\ + f'{allow_svg if item.get("allowNoCredit") else deny_svg} Use the model without crediting the creator
'\ + f'{allow_svg if "Image" in allowCommercialUse else deny_svg} Sell images they generate
'\ + f'{allow_svg if "Rent" in allowCommercialUse else deny_svg} Run on services that generate images for money
'\ + f'{allow_svg if "RentCivit" in allowCommercialUse else deny_svg} Run on Civitai
'\ + f'{allow_svg if item.get("allowDerivatives") else deny_svg} Share merges using this model
'\ + f'{allow_svg if "Sell" in allowCommercialUse else deny_svg} Sell this model or merges using this model
'\ + f'{allow_svg if item.get("allowDifferentLicense") else deny_svg} Have different permissions when sharing merges'\ + '

' + output_html = f''' +
+

{escape(str(model_name))}

+

Uploaded by {escape(str(model_uploader))}{uploader_avatar}

+
+
+
Version
+
{escape(str(model_version))}
+
Base Model
+
{escape(str(output_basemodel))}
+
CivitAI Tags
+
+
+ {tags_html} +
+
+ {"
Download Link
" if model_url else ''} + {f'
{model_url}
' if model_url else ''} +
+
+
+ {perms_html} +
+
+
+ +
+

Description

+ {model_desc} +
+ +
+
{img_html}
+ ''' + + if only_html: + return output_html + + folder_location = "None" + default_subfolder = "None" + sub_folders = ["None"] + + for root, dirs, files in os.walk(model_folder, followlinks=True): + for filename in files: + if filename.endswith('.json'): + json_file_path = os.path.join(root, filename) + with open(json_file_path, 'r', encoding="utf-8") as f: + try: + data = json.load(f) + sha256 = data.get('sha256') + if sha256: + sha256 = sha256.upper() + if sha256 == sha256_value: + folder_location = root + BtnDownInt = False + BtnDel = True + + break + except Exception as e: + print(f"Error decoding JSON: {str(e)}") + else: + for filename in files: + if filename == model_filename or filename == cleaned_name(model_filename): + folder_location = root + BtnDownInt = False + BtnDel = True + break + + if folder_location != "None": + break + + insert_sub_1 = getattr(opts, "insert_sub_1", False) + insert_sub_2 = getattr(opts, "insert_sub_2", False) + insert_sub_3 = getattr(opts, "insert_sub_3", False) + insert_sub_4 = getattr(opts, "insert_sub_4", False) + insert_sub_5 = getattr(opts, "insert_sub_5", False) + insert_sub_6 = getattr(opts, "insert_sub_6", False) + insert_sub_7 = getattr(opts, "insert_sub_7", False) + insert_sub_8 = getattr(opts, "insert_sub_8", False) + insert_sub_9 = getattr(opts, "insert_sub_9", False) + insert_sub_10 = getattr(opts, "insert_sub_10", False) + insert_sub_11 = getattr(opts, "insert_sub_11", False) + insert_sub_12 = getattr(opts, "insert_sub_12", False) + insert_sub_13 = getattr(opts, "insert_sub_13", False) + insert_sub_14 = getattr(opts, "insert_sub_14", False) + dot_subfolders = getattr(opts, "dot_subfolders", True) + + try: + sub_folders = ["None"] + for root, dirs, _ in os.walk(model_folder, followlinks=True): + if dot_subfolders: + dirs = [d for d in dirs if not d.startswith('.')] + dirs = [d for d in dirs if not any(part.startswith('.') for part in os.path.join(root, d).split(os.sep))] + for d in dirs: + sub_folder = os.path.relpath(os.path.join(root, d), model_folder) + if sub_folder: + sub_folders.append(f'{os.sep}{sub_folder}') + + sub_folders.remove("None") + sub_folders = sorted(sub_folders, key=lambda x: (x.lower(), x)) + sub_folders.insert(0, "None") + base = cleaned_name(output_basemodel) + author = cleaned_name(model_uploader) + name = cleaned_name(model_name) + ver = cleaned_name(model_version) + + if insert_sub_1: + sub_folders.insert(1, os.path.join(os.sep, base)) + if insert_sub_2: + sub_folders.insert(2, os.path.join(os.sep, base, author)) + if insert_sub_3: + sub_folders.insert(3, os.path.join(os.sep, base, author, name)) + if insert_sub_4: + sub_folders.insert(4, os.path.join(os.sep, base, author, name, ver)) + if insert_sub_5: + sub_folders.insert(5, os.path.join(os.sep, base, name)) + if insert_sub_6: + sub_folders.insert(6, os.path.join(os.sep, base, name, ver)) + if insert_sub_7: + sub_folders.insert(7, os.path.join(os.sep, author)) + if insert_sub_8: + sub_folders.insert(8, os.path.join(os.sep, author, base)) + if insert_sub_9: + sub_folders.insert(9, os.path.join(os.sep, author, base, name)) + if insert_sub_10: + sub_folders.insert(10, os.path.join(os.sep, author, base, name, ver)) + if insert_sub_11: + sub_folders.insert(11, os.path.join(os.sep, author, name)) + if insert_sub_12: + sub_folders.insert(12, os.path.join(os.sep, author, name, ver)) + if insert_sub_13: + sub_folders.insert(13, os.path.join(os.sep, name)) + if insert_sub_14: + sub_folders.insert(14, os.path.join(os.sep, name, ver)) + + list = set() + sub_folders = [x for x in sub_folders if not (x in list or list.add(x))] + except: + sub_folders = ["None"] + + default_sub = sub_folder_value(content_type, desc) + + variable_mapping = { + "Base model": base, + "Author name": author, + "Model name": name, + "Model version": ver + } + + if any(key in default_sub for key in variable_mapping.keys()): + path_components = [variable_mapping.get(component.strip(os.sep), component.strip(os.sep)) for component in default_sub.split(os.sep)] + default_sub = os.path.join(os.sep, *path_components) + + if folder_location == "None": + folder_location = model_folder + if default_sub != "None": + folder_path = folder_location + default_sub + else: + folder_path = folder_location + else: + folder_path = folder_location + relative_path = os.path.relpath(folder_location, model_folder) + default_subfolder = f'{os.sep}{relative_path}' if relative_path != "." else default_sub if BtnDel == False else "None" + if gl.isDownloading: + item = gl.download_queue[0] + if int(model_id) == int(item['model_id']): + BtnDel = False + BtnDownTxt = "Download model" + if len(gl.download_queue) > 0: + BtnDownTxt = "Add to queue" + for item in gl.download_queue: + if item['version_name'] == model_version and int(item['model_id']) == int(model_id): + BtnDownInt = False + break + + return ( + gr.HTML.update(value=output_html), # Preview HTML + gr.Textbox.update(value=output_training, interactive=True), # Trained Tags + gr.Textbox.update(value=output_basemodel), # Base Model Number + gr.Button.update(visible=False if BtnDel else True, interactive=BtnDownInt, value=BtnDownTxt), # Download Button + gr.Button.update(interactive=BtnImage), # Images Button + gr.Button.update(visible=BtnDel, interactive=BtnDel), # Delete Button + gr.Dropdown.update(choices=file_list, value=default_file, interactive=True), # File List + gr.Textbox.update(value=cleaned_name(model_filename), interactive=True), # Model File Name + gr.Textbox.update(value=dl_url), # Download URL + gr.Textbox.update(value=model_id), # Model ID + gr.Textbox.update(value=sha256_value), # SHA256 + gr.Textbox.update(interactive=True, value=folder_path if model_name else None), # Install Path + gr.Dropdown.update(choices=sub_folders, value=default_subfolder, interactive=True) # Sub Folder List + ) + else: + return ( + gr.HTML.update(value=None), # Preview HTML + gr.Textbox.update(value=None, interactive=False), # Trained Tags + gr.Textbox.update(value=''), # Base Model Number + gr.Button.update(visible=False if BtnDel else True, value="Download model"), # Download Button + gr.Button.update(interactive=False), # Images Button + gr.Button.update(visible=BtnDel, interactive=BtnDel), # Delete Button + gr.Dropdown.update(choices=None, value=None, interactive=False), # File List + gr.Textbox.update(value=None, interactive=False), # Model File Name + gr.Textbox.update(value=None), # Download URL + gr.Textbox.update(value=None), # Model ID + gr.Textbox.update(value=None), # SHA256 + gr.Textbox.update(interactive=False, value=None), # Install Path + gr.Dropdown.update(choices=None, value=None, interactive=False) # Sub Folder List + ) + +def sub_folder_value(content_type, desc=None): + use_LORA = getattr(opts, "use_LORA", False) + if content_type in ["LORA", "LoCon"] and use_LORA: + folder = getattr(opts, "LORA_LoCon_subfolder", "None") + elif content_type == "Upscaler": + for upscale_type in ["SWINIR", "REALESRGAN", "GFPGAN", "BSRGAN"]: + if upscale_type in desc: + folder = getattr(opts, f"{upscale_type}_subfolder", "None") + folder = getattr(opts, "ESRGAN_subfolder", "None") + else: + folder = getattr(opts, f"{content_type}_subfolder", "None") + if folder == None: + return "None" + return folder + +def update_file_info(model_string, model_version, file_metadata): + file_list = [] + is_LORA = False + embed_check = False + model_name = None + model_id = None + model_name, model_id = extract_model_info(model_string) + + if model_version and "[Installed]" in model_version: + model_version = model_version.replace(" [Installed]", "") + if model_id and model_version: + for item in gl.json_data['items']: + if int(item['id']) == int(model_id): + content_type = item['type'] + if content_type == "LORA": + is_LORA = True + desc = item['description'] + for model in item['modelVersions']: + if model['name'] == model_version: + for file in model['files']: + size = file['metadata'].get('size', 'Unknown') + format = file['metadata'].get('format', 'Unknown') + unique_file_name = f"{size} {format}" + file_list.append(unique_file_name) + pass + + if is_LORA and file_list: + extracted_formats = [file.split(' ')[1] for file in file_list] + if "SafeTensor" in extracted_formats and "PickleTensor" in extracted_formats: + embed_check = True + + for file in model['files']: + model_id = item['id'] + file_name = file.get('name', 'Unknown') + sha256 = file['hashes'].get('SHA256', 'Unknown') + metadata = file.get('metadata', {}) + file_size = metadata.get('size', 'Unknown') + file_format = metadata.get('format', 'Unknown') + file_fp = metadata.get('fp', 'Unknown') + sizeKB = file.get('sizeKB', 0) + sizeB = sizeKB * 1024 + filesize = _download.convert_size(sizeB) + + if f"{file_size} {file_format} {file_fp} ({filesize})" == file_metadata: + installed = False + folder_location = "None" + model_folder = os.path.join(contenttype_folder(content_type, desc)) + if embed_check and file_format == "PickleTensor": + if sizeKB <= 100: + model_folder = os.path.join(contenttype_folder("TextualInversion")) + dl_url = file['downloadUrl'] + gl.json_info = item + for root, _, files in os.walk(model_folder, followlinks=True): + if file_name in files: + installed = True + folder_location = root + break + + if not installed: + for root, _, files in os.walk(model_folder, followlinks=True): + for filename in files: + if filename.endswith('.json'): + with open(os.path.join(root, filename), 'r', encoding="utf-8") as f: + try: + data = json.load(f) + sha256_value = data.get('sha256') + if sha256_value != None and sha256_value.upper() == sha256: + folder_location = root + installed = True + break + except Exception as e: + print(f"Error decoding JSON: {str(e)}") + default_sub = sub_folder_value(content_type, desc) + if folder_location == "None": + folder_location = model_folder + if default_sub != "None": + folder_path = folder_location + default_sub + else: + folder_path = folder_location + else: + folder_path = folder_location + relative_path = os.path.relpath(folder_location, model_folder) + default_subfolder = f'{os.sep}{relative_path}' if relative_path != "." else default_sub if installed == False else "None" + BtnDownInt = not installed + BtnDownTxt = "Download model" + if len(gl.download_queue) > 0: + BtnDownTxt = "Add to queue" + for item in gl.download_queue: + if item['version_name'] == model_version: + BtnDownInt = False + break + + return ( + gr.Textbox.update(value=cleaned_name(file['name']), interactive=True), # Model File Name Textbox + gr.Textbox.update(value=dl_url), # Download URL Textbox + gr.Textbox.update(value=model_id), # Model ID Textbox + gr.Textbox.update(value=sha256), # sha256 textbox + gr.Button.update(interactive=BtnDownInt, visible=False if installed else True, value=BtnDownTxt), # Download Button + gr.Button.update(interactive=True if installed else False, visible=True if installed else False), # Delete Button + gr.Textbox.update(interactive=True, value=folder_path if model_name else None), # Install Path + gr.Dropdown.update(value=default_subfolder, interactive=True) # Sub Folder List + ) + + return ( + gr.Textbox.update(value=None, interactive=False), # Model File Name Textbox + gr.Textbox.update(value=None), # Download URL Textbox + gr.Textbox.update(value=None), # Model ID Textbox + gr.Textbox.update(value=None), # sha256 textbox + gr.Button.update(interactive=False, visible=True), # Download Button + gr.Button.update(interactive=False, visible=False), # Delete Button + gr.Textbox.update(interactive=False, value=None), # Install Path + gr.Dropdown.update(choices=None, value=None, interactive=False) # Sub Folder List + ) + +def get_proxies(): + custom_proxy = getattr(opts, "custom_civitai_proxy", "") + disable_ssl = getattr(opts, "disable_sll_proxy", False) + cabundle_path = getattr(opts, "cabundle_path_proxy", "") + + ssl = True + proxies = {} + if custom_proxy: + if not disable_ssl: + if cabundle_path: + ssl = os.path(cabundle_path) + else: + ssl = False + proxies = { + 'http': custom_proxy, + 'https': custom_proxy, + } + return proxies, ssl + +def get_headers(referer=None, no_api=None): + + api_key = getattr(opts, "custom_api_key", "") + try: + user_agent = UserAgent().chrome + except ImportError: + user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" + headers = { + "Connection": "keep-alive", + "Sec-Ch-Ua-Platform": "Windows", + "User-Agent": user_agent, + "Content-Type": "application/json" + } + if referer: + headers['Referer'] = f"https://civitai.com/models/{referer}" + if api_key and not no_api: + headers['Authorization'] = f'Bearer {api_key}' + + return headers + +def request_civit_api(api_url=None): + headers = get_headers() + proxies, ssl = get_proxies() + try: + response = requests.get(api_url, headers=headers, timeout=(60,30), proxies=proxies, verify=ssl) + response.raise_for_status() + except requests.exceptions.Timeout as e: + print("The request timed out. Please try again later.") + return "timeout" + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return "error" + else: + response.encoding = "utf-8" + try: + data = json.loads(response.text) + except json.JSONDecodeError: + print(response.text) + print("The CivitAI servers are currently offline. Please try again later.") + return "offline" + return data + +def api_error_msg(input_string): + div = '
' + if input_string == "not_found": + return div + "Model ID not found on CivitAI.
Maybe the model doesn\'t exist on CivitAI?
" + elif input_string == "path_not_found": + return div + "Local model not found.
Could not locate the model path." + elif input_string == "timeout": + return div + "The CivitAI-API has timed out, please try again.
The servers might be too busy or down if the issue persists." + elif input_string == "offline": + return div + "The CivitAI servers are currently offline.
Please try again later." + elif input_string == "error": + return div + "The CivitAI-API failed to respond due to an error.
Check the logs for more details." \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_download.py b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_download.py new file mode 100644 index 0000000000000000000000000000000000000000..d76f25bf6dea2d76335d7475b369b1c25e6c15e1 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_download.py @@ -0,0 +1,771 @@ +import requests +import gradio as gr +import time +import subprocess +import threading +import os +import re +import random +import platform +import stat +import json +import time +from pathlib import Path +from modules.shared import opts, cmd_opts +from scripts.civitai_global import print +import scripts.civitai_global as gl +import scripts.civitai_api as _api +import scripts.civitai_file_manage as _file +try: + from zip_unicode import ZipHandler +except ImportError: + print("Python module 'ZipUnicode' has not been imported correctly, please try to restart or install it manually.") + +total_count = 0 +current_count = 0 +dl_manager_count = 0 + +def random_number(prev=None): + number = str(random.randint(10000, 99999)) + while number == prev: + number = str(random.randint(10000, 99999)) + + return number + +gl.init() +rpc_secret = "R7T5P2Q9K6" +try: + queue = not cmd_opts.no_gradio_queue +except AttributeError: + queue = not cmd_opts.disable_queue +except: + queue = True + +def start_aria2_rpc(): + start_file = os.path.join(aria2path, '_') + running_file = os.path.join(aria2path, 'running') + null = open(os.devnull, 'w') + + if os.path.exists(running_file): + try: + if os_type == 'Linux': + env = os.environ.copy() + env['PATH'] = '/usr/bin:' + env['PATH'] + subprocess.Popen("pkill aria2", shell=True, env=env) + else: + subprocess.Popen(stop_rpc, stdout=null, stderr=null) + time.sleep(1) + except Exception as e: + print(f"Failed to stop Aria2 RPC : {e}") + else: + if os.path.exists(start_file): + os.rename(start_file, running_file) + return + else: + with open(start_file, 'w', encoding="utf-8"): + pass + + try: + show_log = getattr(opts, "show_log", False) + aria2_flags = getattr(opts, "aria2_flags", "") + cmd = f'"{aria2}" --enable-rpc --rpc-listen-all --rpc-listen-port=24000 --rpc-secret {rpc_secret} --check-certificate=false --ca-certificate=" " --file-allocation=none {aria2_flags}' + subprocess_args = {'shell': True} + if not show_log: + subprocess_args.update({'stdout': subprocess.DEVNULL, 'stderr': subprocess.DEVNULL}) + + subprocess.Popen(cmd, **subprocess_args) + if os.path.exists(running_file): + print("Aria2 RPC restarted") + else: + print("Aria2 RPC started") + except Exception as e: + print(f"Failed to start Aria2 RPC server: {e}") + +aria2path = Path(__file__).resolve().parents[1] / "aria2" +os_type = platform.system() + +if os_type == 'Windows': + aria2 = os.path.join(aria2path, 'win', 'aria2.exe') + stop_rpc = "taskkill /im aria2.exe /f" + start_aria2_rpc() +elif os_type == 'Linux': + aria2 = os.path.join(aria2path, 'lin', 'aria2') + st = os.stat(aria2) + os.chmod(aria2, st.st_mode | stat.S_IEXEC) + stop_rpc = "pkill aria2" + start_aria2_rpc() + +class TimeOutFunction(Exception): + pass + +def create_model_item(dl_url, model_filename, install_path, model_name, version_name, model_sha256, model_id, create_json, from_batch=False): + global dl_manager_count + if model_id: + model_id = int(model_id) + if model_sha256: + model_sha256 = model_sha256.upper() + + filtered_items = [] + + for item in gl.json_data['items']: + if int(item['id']) == int(model_id): + filtered_items.append(item) + content_type = item['type'] + desc = item['description'] + main_folder = _api.contenttype_folder(content_type, desc) + break + + sub_folder = os.path.normpath(os.path.relpath(install_path, main_folder)) + + model_json = {"items": filtered_items} + model_versions = _api.update_model_versions(model_id) + (preview_html,_,_,_,_,_,_,_,_,_,_,existing_path,_) = _api.update_model_info(None, model_versions.get('value'), False, model_id) + + for item in gl.download_queue: + if item['dl_url'] == dl_url: + return None + + dl_manager_count += 1 + + item = { + "dl_id": dl_manager_count, + "dl_url" : dl_url, + "model_filename" : model_filename, + "install_path" : install_path, + "model_name" : model_name, + "version_name" : version_name, + "model_sha256" : model_sha256, + "model_id" : model_id, + "create_json" : create_json, + "model_json" : model_json, + "model_versions" : model_versions, + "preview_html" : preview_html['value'], + "existing_path": existing_path['value'], + "from_batch" : from_batch, + "sub_folder" : sub_folder + } + + return item + +def selected_to_queue(model_list, subfolder, download_start, create_json, current_html): + global total_count, current_count + if gl.download_queue: + number = download_start + else: + number = random_number(download_start) + total_count = 0 + current_count = 0 + + model_list = json.loads(model_list) + + for model_string in model_list: + model_name, model_id = _api.extract_model_info(model_string) + for item in gl.json_data['items']: + if int(item['id']) == int(model_id): + model_id, desc, content_type = item['id'], item['description'], item['type'] + version = item.get('modelVersions', [])[0] + version_name = version.get('name') + files = version.get('files', []) + primary_file = next((file for file in files if file.get('primary', False)), None) + if primary_file: + model_filename = _api.cleaned_name(primary_file.get('name')) + model_sha256 = primary_file.get('hashes', {}).get('SHA256') + dl_url = primary_file.get('downloadUrl') + else: + model_filename = _api.cleaned_name(files[0].get('name')) + model_sha256 = files[0].get('hashes', {}).get('SHA256') + dl_url = files[0].get('downloadUrl') + break + + model_folder = _api.contenttype_folder(content_type, desc) + + sub_opt1 = os.path.join(os.sep, _api.cleaned_name(model_name)) + sub_opt2 = os.path.join(os.sep, _api.cleaned_name(model_name), _api.cleaned_name(version_name)) + + default_sub = _api.sub_folder_value(content_type, desc) + if default_sub == f"{os.sep}Model Name": + default_sub = sub_opt1 + elif default_sub == f"{os.sep}Model Name{os.sep}Version Name": + default_sub = sub_opt2 + + if subfolder and subfolder != "None" and subfolder != "Only available if the selected files are of the same model type": + from_batch = False + if platform.system() == "Windows": + subfolder = re.sub(r'[/:*?"<>|]', '', subfolder) + + if not subfolder.startswith(os.sep): + subfolder = os.sep + subfolder + install_path = model_folder + subfolder + else: + from_batch = True + if default_sub != "None": + install_path = model_folder + default_sub + else: + install_path = model_folder + + model_item = create_model_item(dl_url, model_filename, install_path, model_name, version_name, model_sha256, model_id, create_json, from_batch) + if model_item: + gl.download_queue.append(model_item) + total_count += 1 + + html = download_manager_html(current_html) + + return ( + gr.Button.update(interactive=False, visible=False), # Download Button + gr.Button.update(interactive=True, visible=True), # Cancel Button + gr.Button.update(interactive=True if len(gl.download_queue) > 1 else False, visible=True), # Cancel All Button + gr.Textbox.update(value=number), # Download Start Trigger + gr.HTML.update(value='
'), # Download Progress + gr.HTML.update(value=html) # Download Manager HTML + ) + +def download_start(download_start, dl_url, model_filename, install_path, model_string, version_name, model_sha256, model_id, create_json, current_html): + global total_count, current_count + if model_string: + model_name, _ = _api.extract_model_info(model_string) + model_item = create_model_item(dl_url, model_filename, install_path, model_name, version_name, model_sha256, model_id, create_json) + + gl.download_queue.append(model_item) + + if len(gl.download_queue) > 1: + number = download_start + total_count += 1 + else: + number = random_number(download_start) + total_count = 1 + current_count = 0 + + html = download_manager_html(current_html) + + return ( + gr.Button.update(interactive=False, visible=True), # Download Button + gr.Button.update(interactive=True, visible=True), # Cancel Button + gr.Button.update(interactive=True if len(gl.download_queue) > 1 else False, visible=True), # Cancel All Button + gr.Textbox.update(value=number), # Download Start Trigger + gr.HTML.update(value='
'), # Download Progress + gr.HTML.update(value=html) # Download Manager HTML + ) + +def download_finish(model_filename, version, model_id): + if model_id: + model_id = int(model_id) + model_versions = _api.update_model_versions(model_id) + else: + model_versions = None + if model_versions: + version_choices = model_versions.get('choices', []) + else: + version_choices = [] + prev_version = gl.last_version + " [Installed]" + + if prev_version in version_choices: + version = prev_version + Del = True + Down = False + else: + Del = False + Down = True + + if gl.cancel_status: + Del = False + Down = True + + gl.download_fail = False + gl.cancel_status = False + + return ( + gr.Button.update(interactive=model_filename, visible=Down, value="Download model"), # Download Button + gr.Button.update(interactive=False, visible=False), # Cancel Button + gr.Button.update(interactive=False, visible=False), # Cancel All Button + gr.Button.update(interactive=Del, visible=Del), # Delete Button + gr.HTML.update(value='
'), # Download Progress + gr.Dropdown.update(value=version, choices=version_choices) # Version Dropdown + ) + +def download_cancel(): + gl.cancel_status = True + gl.download_fail = True + if gl.download_queue: + item = gl.download_queue[0] + + while True: + if not gl.isDownloading: + if item: + model_string = f"{item['model_name']} ({item['model_id']})" + _file.delete_model(0, item['model_filename'], model_string, item['version_name'], False, model_ver=item['model_versions'], model_json=item['model_json']) + break + else: + time.sleep(0.5) + return + +def download_cancel_all(): + gl.cancel_status = True + gl.download_fail = True + + if gl.download_queue: + item = gl.download_queue[0] + + while True: + if not gl.isDownloading: + if item: + model_string = f"{item['model_name']} ({item['model_id']})" + _file.delete_model(0, item['model_filename'], model_string, item['version_name'], False, model_ver=item['model_versions'], model_json=item['model_json']) + gl.download_queue = [] + break + else: + time.sleep(0.5) + return + +def convert_size(size): + for unit in ['bytes', 'KB', 'MB', 'GB']: + if size < 1024: + return f"{size:.2f} {unit}" + size /= 1024 + return f"{size:.2f} GB" + +def get_download_link(url, model_id): + headers = _api.get_headers(model_id) + proxies, ssl = _api.get_proxies() + + response = requests.get(url, headers=headers, allow_redirects=False, proxies=proxies, verify=ssl) + + if 300 <= response.status_code <= 308: + if "login?returnUrl" in response.text and "reason=download-auth" in response.text: + return "NO_API" + + download_link = response.headers["Location"] + return download_link + else: + return None + +def download_file(url, file_path, install_path, model_id, progress=gr.Progress() if queue else None): + try: + disable_dns = getattr(opts, "disable_dns", False) + split_aria2 = getattr(opts, "split_aria2", 64) + max_retries = 5 + gl.download_fail = False + aria2_rpc_url = "http://localhost:24000/jsonrpc" + + file_name = os.path.basename(file_path) + + download_link = get_download_link(url, model_id) + if not download_link: + print(f'File: "{file_name}" not found on CivitAI servers, it looks like the file is not available for download.') + gl.download_fail = True + return + + elif download_link == "NO_API": + print(f'File: "{file_name}" requires a personal CivitAI API to be downloaded, you can set your own API key in the CivitAI Browser+ settings in the SD-WebUI settings tab') + gl.download_fail = "NO_API" + if progress != None: + progress(0, desc=f'File: "{file_name}" requires a personal CivitAI API to be downloaded, you can set your own API key in the CivitAI Browser+ settings in the SD-WebUI settings tab') + time.sleep(5) + return + + if os.path.exists(file_path): + os.remove(file_path) + + if disable_dns: + dns = "false" + else: + dns = "true" + + options = { + "dir": install_path, + "max-connection-per-server": str(f"{split_aria2}"), + "split": str(f"{split_aria2}"), + "async-dns": dns, + "out": file_name + } + + payload = json.dumps({ + "jsonrpc": "2.0", + "id": "1", + "method": "aria2.addUri", + "params": ["token:" + rpc_secret, [download_link], options] + }) + + try: + response = requests.post(aria2_rpc_url, data=payload) + data = json.loads(response.text) + if 'result' not in data: + raise ValueError(f'Failed to start download: {data}') + gid = data['result'] + except Exception as e: + print(f"Failed to start download: {e}") + gl.download_fail = True + return + + while True: + if gl.cancel_status: + payload = json.dumps({ + "jsonrpc": "2.0", + "id": "1", + "method": "aria2.remove", + "params": ["token:" + rpc_secret, gid] + }) + requests.post(aria2_rpc_url, data=payload) + if progress != None: + progress(0, desc=f"Download cancelled.") + return + + try: + payload = json.dumps({ + "jsonrpc": "2.0", + "id": "1", + "method": "aria2.tellStatus", + "params": ["token:" + rpc_secret, gid] + }) + + response = requests.post(aria2_rpc_url, data=payload) + status_info = json.loads(response.text)['result'] + + total_length = int(status_info['totalLength']) + completed_length = int(status_info['completedLength']) + download_speed = int(status_info['downloadSpeed']) + + progress_percent = (completed_length / total_length) * 100 if total_length else 0 + + remaining_size = total_length - completed_length + if download_speed > 0: + eta_seconds = remaining_size / download_speed + eta_formatted = time.strftime("%H:%M:%S", time.gmtime(eta_seconds)) + else: + eta_formatted = "XX:XX:XX" + if progress != None: + progress(progress_percent / 100, desc=f"Downloading: {file_name} - {convert_size(completed_length)}/{convert_size(total_length)} - Speed: {convert_size(download_speed)}/s - ETA: {eta_formatted} - Queue: {current_count}/{total_count}") + + if status_info['status'] == 'complete': + print(f"Model saved to: {file_path}") + if progress != None: + progress(1, desc=f"Model saved to: {file_path}") + gl.download_fail = False + return + + if status_info['status'] == 'error': + if progress != None: + progress(0, desc=f"Encountered an error during download of: \"{file_name}\" Please try again.") + gl.download_fail = True + return + + time.sleep(0.25) + + except Exception as e: + print(f"Error occurred during Aria2 status update: {e}") + max_retries -= 1 + if max_retries == 0: + if progress != None: + progress(0, desc=f"Encountered an error during download of: \"{file_name}\" Please try again.") + gl.download_fail = True + return + time.sleep(5) + except: + if progress != None: + progress(0, desc=f"Encountered an error during download of: \"{file_name}\" Please try again.") + gl.download_fail = True + if os.path.exists(file_path): + os.remove(file_path) + time.sleep(5) + +def info_to_json(install_path, model_id, model_sha256, unpackList=None): + json_file = os.path.splitext(install_path)[0] + ".json" + if os.path.exists(json_file): + try: + with open(json_file, 'r', encoding="utf-8") as f: + data = json.load(f) + except Exception as e: + print(f"Failed to open {json_file}: {e}") + else: + data = {} + + data['modelId'] = model_id + data['sha256'] = model_sha256 + if unpackList: + data['unpackList'] = unpackList + + with open(json_file, 'w', encoding="utf-8") as f: + json.dump(data, f, indent=4) + +def download_file_old(url, file_path, model_id, progress=gr.Progress() if queue else None): + try: + gl.download_fail = False + max_retries = 5 + if os.path.exists(file_path): + os.remove(file_path) + + downloaded_size = 0 + tokens = re.split(re.escape(os.sep), file_path) + file_name_display = tokens[-1] + start_time = time.time() + last_update_time = 0 + update_interval = 0.25 + + download_link = get_download_link(url, model_id) + if not download_link: + print(f'File: "{file_name_display}" not found on CivitAI servers, it looks like the file is not available for download.') + if progress != None: + progress(0, desc=f'File: "{file_name_display}" not found on CivitAI servers, it looks like the file is not available for download.') + time.sleep(5) + gl.download_fail = True + return + + elif download_link == "NO_API": + print(f'File: "{file_name_display}" requires a personal CivitAI API key to be downloaded, you can set your own API key in the CivitAI Browser+ settings in the SD-WebUI settings tab') + gl.download_fail = "NO_API" + if progress != None: + progress(0, desc=f'File: "{file_name_display}" requires a personal CivitAI API key to be downloaded, you can set your own API key in the CivitAI Browser+ settings in the SD-WebUI settings tab') + time.sleep(5) + return + + headers = _api.get_headers(model_id, True) + proxies, ssl = _api.get_proxies() + + while True: + if gl.cancel_status: + if progress != None: + progress(0, desc=f"Download cancelled.") + return + if os.path.exists(file_path): + downloaded_size = os.path.getsize(file_path) + headers['Range'] = f"bytes={downloaded_size}-" + + with open(file_path, "ab") as f: + while gl.isDownloading: + try: + if gl.cancel_status: + if progress != None: + progress(0, desc=f"Download cancelled.") + return + try: + if gl.cancel_status: + if progress != None: + progress(0, desc=f"Download cancelled.") + return + response = requests.get(download_link, headers=headers, stream=True, timeout=10, proxies=proxies, verify=ssl) + if response.status_code == 404: + if progress != None: + progress(0, desc=f"Encountered an error during download of: {file_name_display}, file is not found on CivitAI servers.") + gl.download_fail = True + return + total_size = int(response.headers.get("Content-Length", 0)) + except: + raise TimeOutFunction("Timed Out") + + if total_size == 0: + total_size = downloaded_size + + for chunk in response.iter_content(chunk_size=1024): + if chunk: + if gl.cancel_status: + if progress != None: + progress(0, desc=f"Download cancelled.") + return + f.write(chunk) + downloaded_size += len(chunk) + elapsed_time = time.time() - start_time + download_speed = downloaded_size / elapsed_time + remaining_size = total_size - downloaded_size + if download_speed > 0: + eta_seconds = remaining_size / download_speed + eta_formatted = time.strftime("%H:%M:%S", time.gmtime(eta_seconds)) + else: + eta_formatted = "XX:XX:XX" + current_time = time.time() + if current_time - last_update_time >= update_interval: + if progress != None: + progress(downloaded_size / total_size, desc=f"Downloading: {file_name_display} {convert_size(downloaded_size)} / {convert_size(total_size)} - Speed: {convert_size(int(download_speed))}/s - ETA: {eta_formatted} - Queue: {current_count}/{total_count}") + last_update_time = current_time + if gl.isDownloading == False: + response.close + break + downloaded_size = os.path.getsize(file_path) + break + + except TimeOutFunction: + if progress != None: + progress(0, desc="CivitAI API did not respond, retrying...") + max_retries -= 1 + if max_retries == 0: + if progress != None: + progress(0, desc=f"Encountered an error during download of: {file_name_display}, please try again.") + gl.download_fail = True + return + time.sleep(5) + + if (gl.isDownloading == False): + break + + gl.isDownloading = False + downloaded_size = os.path.getsize(file_path) + if downloaded_size >= total_size: + if not gl.cancel_status: + print(f"Model saved to: {file_path}") + if progress != None: + progress(1, desc=f"Model saved to: {file_path}") + gl.download_fail = False + return + + else: + if progress != None: + progress(0, desc=f"Encountered an error during download of: {file_name_display}, please try again.") + print(f"File download failed: {file_name_display}") + gl.download_fail = True + if os.path.exists(file_path): + os.remove(file_path) + except: + if progress != None: + progress(0, desc=f"Encountered an error during download of: {file_name_display}, please try again.") + gl.download_fail = True + if os.path.exists(file_path): + os.remove(file_path) + time.sleep(5) + +def download_create_thread(download_finish, queue_trigger, progress=gr.Progress() if queue else None): + global current_count + current_count += 1 + if not gl.download_queue: + return ( + gr.HTML.update(), # Download Progress HTML + gr.Textbox.update(value=None), # Current Model + gr.Textbox.update(value=random_number(download_finish)), # Download Finish Trigger + gr.Textbox.update(value=queue_trigger), # Queue Trigger + gr.Button.update(interactive=False) # Cancel All Button + ) + item = gl.download_queue[0] + gl.cancel_status = False + use_aria2 = getattr(opts, "use_aria2", True) + unpack_zip = getattr(opts, "unpack_zip", False) + save_all_images = getattr(opts, "auto_save_all_img", False) + gl.recent_model = item['model_name'] + gl.last_version = item['version_name'] + + if item['from_batch']: + item['install_path'] = item['existing_path'] + + gl.isDownloading = True + _file.make_dir(item['install_path']) + + path_to_new_file = os.path.join(item['install_path'], item['model_filename']) + + if use_aria2 and os_type != 'Darwin': + thread = threading.Thread(target=download_file, args=(item['dl_url'], path_to_new_file, item['install_path'], item['model_id'], progress)) + else: + thread = threading.Thread(target=download_file_old, args=(item['dl_url'], path_to_new_file, item['model_id'], progress)) + thread.start() + thread.join() + + if not gl.cancel_status or gl.download_fail: + if os.path.exists(path_to_new_file): + unpackList = [] + if unpack_zip: + try: + if path_to_new_file.endswith('.zip'): + directory = Path(os.path.dirname(path_to_new_file)) + zip_handler = ZipHandler(path_to_new_file) + + for _, decoded_name in zip_handler.name_map.items(): + unpackList.append(decoded_name) + + zip_handler.extract_all(directory) + zip_handler.zip_ref.close() + + print(f"Successfully extracted {item['model_filename']} to {directory}") + os.remove(path_to_new_file) + except ImportError: + print("Python module 'ZipUnicode' has not been imported correctly, cannot extract zip file. Please try to restart or install it manually.") + except Exception as e: + print(f"Failed to extract {item['model_filename']} with error: {e}") + if not gl.cancel_status: + if item['create_json']: + _file.save_model_info(item['install_path'], item['model_filename'], item['sub_folder'], item['model_sha256'], item['preview_html'], api_response=item['model_json']) + info_to_json(path_to_new_file, item['model_id'], item['model_sha256'], unpackList) + _file.save_preview(path_to_new_file, item['model_json'], True, item['model_sha256']) + if save_all_images: + _file.save_images(item['preview_html'], item['model_filename'], item['install_path'], item['sub_folder'], api_response=item['model_json']) + + base_name = os.path.splitext(item['model_filename'])[0] + base_name_preview = base_name + '.preview' + + if gl.download_fail: + for root, dirs, files in os.walk(item['install_path'], followlinks=True): + for file in files: + file_base_name = os.path.splitext(file)[0] + if file_base_name == base_name or file_base_name == base_name_preview: + path_file = os.path.join(root, file) + os.remove(path_file) + + if gl.cancel_status: + print(f'Cancelled download of "{item["model_filename"]}"') + else: + if not gl.download_fail == "NO_API": + print(f'Error occured during download of "{item["model_filename"]}"') + + if gl.cancel_status: + card_name = None + else: + model_string = f"{item['model_name']} ({item['model_id']})" + (card_name, _, _) = _file.card_update(item['model_versions'], model_string, item['version_name'], True) + + if len(gl.download_queue) != 0: + gl.download_queue.pop(0) + gl.isDownloading = False + time.sleep(2) + + if len(gl.download_queue) == 0: + finish_nr = random_number(download_finish) + queue_nr = queue_trigger + else: + finish_nr = download_finish + queue_nr = random_number(queue_trigger) + + return ( + gr.HTML.update(), # Download Progress HTML + gr.Textbox.update(value=card_name), # Current Model + gr.Textbox.update(value=finish_nr), # Download Finish Trigger + gr.Textbox.update(value=queue_nr), # Queue Trigger + gr.Button.update(interactive=True if len(gl.download_queue) > 1 else False) # Cancel All Button + ) + +def remove_from_queue(dl_id): + global total_count + for item in gl.download_queue: + if int(dl_id) == int(item['dl_id']): + gl.download_queue.remove(item) + total_count -= 1 + return + +def arrange_queue(input): + id_and_index = input.split('.') + dl_id = int(id_and_index[0]) + index = int(id_and_index[1]) + 1 + for item in gl.download_queue: + if int(item['dl_id']) == dl_id: + current_item = gl.download_queue.pop(gl.download_queue.index(item)) + gl.download_queue.insert(index, current_item) + break + +def get_style(size, left_border): + return f"flex-grow: {size};" + ("border-left: 1px solid var(--border-color-primary);" if left_border else "") + "padding: 5px 10px 5px 10px;width: 0;align-self: center;" + +def download_manager_html(current_html): + html = current_html.rsplit("", 1)[0] + pattern = r'dl_id="(\d+)"' + matches = re.findall(pattern, html) + existing_item_ids = [int(match) for match in matches] + + for item in gl.download_queue: + if not item['dl_id'] in existing_item_ids: + download_item = f''' +
+
{item['model_name']}
+
{item['version_name']}
+
{item['install_path']}
+
In queue...
+
Remove
+
+ ''' + html = html + download_item + + html = html + "" + + return html \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_file_manage.py b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_file_manage.py new file mode 100644 index 0000000000000000000000000000000000000000..47f42fc005cdfeccbc6d7caa3a93385881d8b6e0 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_file_manage.py @@ -0,0 +1,1182 @@ +import json +import gradio as gr +import urllib.request +import urllib.parse +import urllib.error +import os +import io +import re +import time +import errno +import requests +import hashlib +import base64 +from PIL import Image +from pathlib import Path +from urllib.parse import urlparse +from modules.shared import cmd_opts, opts +from scripts.civitai_global import print +import scripts.civitai_global as gl +import scripts.civitai_api as _api +import scripts.civitai_file_manage as _file +import scripts.civitai_download as _download + +try: + from send2trash import send2trash +except ImportError: + print("Python module 'send2trash' has not been imported correctly, please try to restart or install it manually.") +try: + from bs4 import BeautifulSoup +except ImportError: + print("Python module 'BeautifulSoup' has not been imported correctly, please try to restart or install it manually.") + +gl.init() + +offlineHTML = '
The Civit-API has timed out, please try again.
The servers might be too busy or the selected model could not be found.
' +css_path = Path(__file__).resolve().parents[1] / "style_html.css" +no_update = False +from_ver = False +from_tag = False +from_installed = False +try: + queue = not cmd_opts.no_gradio_queue +except AttributeError: + queue = not cmd_opts.disable_queue +except: + queue = True + +def delete_model(delete_finish=None, model_filename=None, model_string=None, list_versions=None, sha256=None, selected_list=None, model_ver=None, model_json=None): + deleted = False + model_id = None + + if model_string: + _, model_id = _api.extract_model_info(model_string) + + if not model_ver: + model_versions = _api.update_model_versions(model_id) + else: model_versions = model_ver + + (model_name, ver_value, ver_choices) = _file.card_update(model_versions, model_string, list_versions, False) + if not model_json: + if model_id != None: + selected_content_type = None + for item in gl.json_data['items']: + if int(item['id']) == int(model_id): + selected_content_type = item['type'] + desc = item['description'] + break + + if selected_content_type is None: + print("Model ID not found in json_data. (delete_model)") + return + else: + for item in model_json["items"]: + selected_content_type = item['type'] + desc = item['description'] + + model_folder = os.path.join(_api.contenttype_folder(selected_content_type, desc)) + + # Delete based on provided SHA-256 hash + if sha256: + sha256_upper = sha256.upper() + for root, _, files in os.walk(model_folder, followlinks=True): + for file in files: + if file.endswith('.json'): + file_path = os.path.join(root, file) + try: + with open(file_path, 'r', encoding="utf-8") as json_file: + data = json.load(json_file) + file_sha256 = data.get('sha256', '') + if file_sha256: + file_sha256 = file_sha256.upper() + except Exception as e: + print(f"Failed to open: {file_path}: {e}") + file_sha256 = "0" + + if file_sha256 == sha256_upper: + unpack_list = data.get('unpackList', []) + for unpacked_file in unpack_list: + unpacked_file_path = os.path.join(root, unpacked_file) + if os.path.isfile(unpacked_file_path): + try: + send2trash(unpacked_file_path) + print(f"File moved to trash based on unpackList: {unpacked_file_path}") + except: + os.remove(unpacked_file_path) + print(f"File deleted based on unpackList: {unpacked_file_path}") + + base_name, _ = os.path.splitext(file) + if os.path.isfile(file_path): + try: + send2trash(file_path) + print(f"Model moved to trash based on SHA-256: {file_path}") + except: + os.remove(file_path) + print(f"Model deleted based on SHA-256: {file_path}") + delete_associated_files(root, base_name) + deleted = True + + # Fallback to delete based on filename if not deleted based on SHA-256 + filename_to_delete = os.path.splitext(model_filename)[0] + aria2_file = model_filename + ".aria2" + if not deleted: + for root, dirs, files in os.walk(model_folder, followlinks=True): + for file in files: + current_file_name = os.path.splitext(file)[0] + if filename_to_delete == current_file_name or aria2_file == file: + path_file = os.path.join(root, file) + if os.path.isfile(path_file): + try: + send2trash(path_file) + print(f"Model moved to trash based on filename: {path_file}") + except: + os.remove(path_file) + print(f"Model deleted based on filename: {path_file}") + delete_associated_files(root, current_file_name) + + number = _download.random_number(delete_finish) + + + btnDwn = not selected_list or selected_list == "[]" + + return ( + gr.Button.update(interactive=btnDwn, visible=btnDwn), # Download Button + gr.Button.update(interactive=False, visible=False), # Cancel Button + gr.Button.update(interactive=False, visible=False), # Delete Button + gr.Textbox.update(value=number), # Delete Finish Trigger + gr.Textbox.update(value=model_name), # Current Model + gr.Dropdown.update(value=ver_value, choices=ver_choices) # Version List + ) + +def delete_associated_files(directory, base_name): + for file in os.listdir(directory): + current_base_name, ext = os.path.splitext(file) + if current_base_name == base_name or current_base_name == f"{base_name}.preview" or current_base_name == f"{base_name}.api_info": + path_to_delete = os.path.join(directory, file) + try: + send2trash(path_to_delete) + print(f"Associated file moved to trash: {path_to_delete}") + except: + os.remove(path_to_delete) + print(f"Associated file deleted: {path_to_delete}") + +def save_preview(file_path, api_response, overwrite_toggle=False, sha256=None): + proxies, ssl = _api.get_proxies() + json_file = os.path.splitext(file_path)[0] + ".json" + install_path, file_name = os.path.split(file_path) + name = os.path.splitext(file_name)[0] + filename = f'{name}.preview.png' + image_path = os.path.join(install_path, filename) + + if not overwrite_toggle: + if os.path.exists(image_path): + return + + if not sha256: + if os.path.exists(json_file): + try: + with open(json_file, 'r', encoding="utf-8") as f: + data = json.load(f) + if 'sha256' in data and data['sha256']: + sha256 = data['sha256'].upper() + except Exception as e: + print(f"Failed to open {json_file}: {e}") + else: + sha256 = sha256.upper() + + for item in api_response["items"]: + for version in item["modelVersions"]: + for file_entry in version["files"]: + if file_entry["hashes"].get("SHA256") == sha256: + for image in version["images"]: + if image["type"] == "image": + url_with_width = re.sub(r'/width=\d+', f'/width={image["width"]}', image["url"]) + + response = requests.get(url_with_width, proxies=proxies, verify=ssl) + if response.status_code == 200: + with open(image_path, 'wb') as img_file: + img_file.write(response.content) + print(f"Preview saved at \"{image_path}\"") + else: + print(f"Failed to save preview. Status code: {response.status_code}") + + return + print(f"No preview images found for \"{name}\"") + return + +def get_image_path(install_path, api_response, sub_folder): + image_location = getattr(opts, "image_location", r"") + sub_image_location = getattr(opts, "sub_image_location", True) + image_path = install_path + if api_response: + json_info = api_response['items'][0] + else: + json_info = gl.json_info + if image_location: + if sub_image_location: + desc = json_info['description'] + content_type = json_info['type'] + image_path = os.path.join(_api.contenttype_folder(content_type, desc, custom_folder=image_location)) + + if sub_folder and sub_folder != "None" and sub_folder != "Only available if the selected files are of the same model type": + image_path = os.path.join(image_path, sub_folder.lstrip("/").lstrip("\\")) + else: + image_path = Path(image_location) + make_dir(image_path) + return image_path + +def save_images(preview_html, model_filename, install_path, sub_folder, api_response=None): + image_path = get_image_path(install_path, api_response, sub_folder) + img_urls = re.findall(r'data-sampleimg="true" src=[\'"]?([^\'" >]+)', preview_html) + + name = os.path.splitext(model_filename)[0] + + opener = urllib.request.build_opener() + opener.addheaders = [('User-agent', 'Mozilla/5.0')] + urllib.request.install_opener(opener) + + for i, img_url in enumerate(img_urls): + filename = f'{name}_{i}.png' + img_url = urllib.parse.quote(img_url, safe=':/=') + try: + with urllib.request.urlopen(img_url) as url: + with open(os.path.join(image_path, filename), 'wb') as f: + f.write(url.read()) + print(f"Downloaded {filename}") + + except urllib.error.URLError as e: + print(f'Error: {e.reason}') + +def card_update(gr_components, model_name, list_versions, is_install): + if gr_components: + version_choices = gr_components['choices'] + else: + print("Couldn't retrieve version, defaulting to installed") + model_name += ".New" + return model_name, None, None + + if is_install and not gl.download_fail and not gl.cancel_status: + version_value_clean = list_versions + " [Installed]" + version_choices_clean = [version if version + " [Installed]" != version_value_clean else version_value_clean for version in version_choices] + + else: + version_value_clean = list_versions.replace(" [Installed]", "") + version_choices_clean = [version if version.replace(" [Installed]", "") != version_value_clean else version_value_clean for version in version_choices] + + first_version_installed = "[Installed]" in version_choices_clean[0] + any_later_version_installed = any("[Installed]" in version for version in version_choices_clean[1:]) + + if first_version_installed: + model_name += ".New" + elif any_later_version_installed: + model_name += ".Old" + else: + model_name += ".None" + + return model_name, version_value_clean, version_choices_clean + +def list_files(folders): + model_files = [] + + extensions = ['.pt', '.ckpt', '.pth', '.safetensors', '.th', '.zip', '.vae'] + + for folder in folders: + if folder and os.path.exists(folder): + for root, _, files in os.walk(folder, followlinks=True): + for file in files: + _, file_extension = os.path.splitext(file) + if file_extension.lower() in extensions: + model_files.append(os.path.join(root, file)) + + model_files = sorted(list(set(model_files))) + return model_files + +def gen_sha256(file_path): + json_file = os.path.splitext(file_path)[0] + ".json" + + if os.path.exists(json_file): + try: + with open(json_file, 'r', encoding="utf-8") as f: + data = json.load(f) + + if 'sha256' in data and data['sha256']: + hash_value = data['sha256'] + return hash_value + except Exception as e: + print(f"Failed to open {json_file}: {e}") + + def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + blocksize = 1 << 20 + h = hashlib.sha256() + length = 0 + with open(os.path.realpath(file_path), 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + + hash_value = h.hexdigest() + + if os.path.exists(json_file): + try: + with open(json_file, 'r', encoding="utf-8") as f: + data = json.load(f) + + if 'sha256' in data and data['sha256']: + data['sha256'] = hash_value + + with open(json_file, 'w', encoding="utf-8") as f: + json.dump(data, f, indent=4) + except Exception as e: + print(f"Failed to open {json_file}: {e}") + else: + data = {'sha256': hash_value} + with open(json_file, 'w', encoding="utf-8") as f: + json.dump(data, f, indent=4) + + return hash_value + +def convert_local_images(html): + soup = BeautifulSoup(html) + for simg in soup.find_all("img", attrs={"data-sampleimg": "true"}): + url = urlparse(simg["src"]) + path = url.path + if not os.path.exists(path): + print("URL path does not exist: %s" % url.path) + # Try the raw url, files can be saved in windows as "C:\..." and + # that confuses urlparse because people only really test on Linux. + if os.path.exists(simg["src"]): + path = simg["src"] + else: + continue + with open(path, 'rb') as f: + imgdata = f.read() + b64img = base64.b64encode(imgdata).decode('utf-8') + imgtype = Image.open(io.BytesIO(imgdata)).format + if not imgtype: + imgtype = "PNG" + simg["src"] = f"data:image/{imgtype};base64,{b64img}" + return str(soup) + +def model_from_sent(model_name, content_type, tile_count): + + modelID_failed = False + output_html = None + model_file = None + use_local_html = getattr(opts, "use_local_html", False) + local_path_in_html = getattr(opts, "local_path_in_html", False) + + model_name = re.sub(r'\.\d{3}$', '', model_name) + content_type = re.sub(r'\.\d{3}$', '', content_type).lower() + if 'inversion' in content_type: + content_type = ['TextualInversion'] + elif 'hypernetwork' in content_type: + content_type = ['Hypernetwork'] + elif 'checkpoint' in content_type: + content_type = ['Checkpoint'] + elif 'lora' in content_type: + content_type = ['LORA', 'LoCon'] + + extensions = ['.pt', '.ckpt', '.pth', '.safetensors', '.th', '.zip', '.vae'] + + for content_type_item in content_type: + folder = _api.contenttype_folder(content_type_item) + for folder_path, _, files in os.walk(folder, followlinks=True): + for file in files: + if file.startswith(model_name) and file.endswith(tuple(extensions)): + model_file = os.path.join(folder_path, file) + + if not model_file: + output_html = _api.api_error_msg("path_not_found") + print(f'Error: Could not find model path for model: "{model_name}"') + print(f'Content type: "{content_type}"') + print(f'Main folder path: "{folder}"') + use_local_html = False + + if use_local_html: + html_file = os.path.splitext(model_file)[0] + ".html" + if os.path.exists(html_file): + with open(html_file, 'r', encoding='utf-8') as html: + output_html = html.read() + index = output_html.find("") + if index != -1: + output_html = output_html[index + len(""):] + if local_path_in_html: + output_html = convert_local_images(output_html) + + if not output_html: + modelID = get_models(model_file, True) + if not modelID or modelID == "Model not found": + output_html = _api.api_error_msg("not_found") + modelID_failed = True + if modelID == "offline": + output_html = _api.api_error_msg("offline") + modelID_failed = True + if not modelID_failed: + json_data = _api.api_to_data(content_type, "Newest", "AllTime", "Model name", None, None, None, tile_count, f"civitai.com/models/{modelID}") + else: + json_data = None + + if json_data == "timeout": + output_html = _api.api_error_msg("timeout") + elif json_data == "error": + output_html = _api.api_error_msg("error") + elif json_data == "offline": + output_html = _api.api_error_msg("offline") + + if isinstance(json_data, dict): + model_versions = _api.update_model_versions(modelID, json_data) + output_html = _api.update_model_info(None, model_versions.get('value'), True, modelID, json_data, True) + + css_path = Path(__file__).resolve().parents[1] / "style_html.css" + with open(css_path, 'r', encoding='utf-8') as css_file: + css = css_file.read() + replacements = { + '#0b0f19': 'var(--neutral-950)', + '#F3F4F6': 'var(--body-text-color)', + 'white': 'var(--body-text-color)', + '#80a6c8': 'var(--secondary-300)', + '#60A5FA': 'var(--link-text-color-hover)', + '#1F2937': 'var(--neutral-700)', + '#374151': 'var(--input-border-color)', + '#111827': 'var(--neutral-800)', + 'top: 50%;': '', + 'padding-top: 0px;': 'padding-top: 475px;', + '.civitai_txt2img': '.civitai_placeholder' + } + + for old, new in replacements.items(): + css = css.replace(old, new) + + style_tag = f'' + head_section = f'{style_tag}' + + output_html = output_html.replace('display:flex;align-items:flex-start;', 'display:flex;align-items:flex-start;flex-wrap:wrap;justify-content:center;') + output_html = str(head_section + output_html) + output_html = output_html.replace('zoom-radio', 'zoom-preview-radio') + output_html = output_html.replace('zoomRadio', 'zoomPreviewRadio') + output_html = output_html.replace('zoom-overlay', 'zoom-preview-overlay') + output_html = output_html.replace('resetZoom', 'resetPreviewZoom') + + number = _download.random_number() + + return ( + gr.Textbox.update(value=output_html, placeholder=number), # Preview HTML + ) + +def is_image_url(url): + image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp'] + parsed = urlparse(url) + path = parsed.path + return any(path.endswith(ext) for ext in image_extensions) + +def clean_description(desc): + try: + soup = BeautifulSoup(desc, 'html.parser') + for a in soup.find_all('a', href=True): + link_text = a.text + ' ' + a['href'] + if not is_image_url(a['href']): + a.replace_with(link_text) + + cleaned_text = soup.get_text() + except ImportError: + print("Python module 'BeautifulSoup' was not imported correctly, cannot clean description. Please try to restart or install it manually.") + cleaned_text = desc + return cleaned_text + +def make_dir(path): + try: + if not os.path.exists(path): + os.makedirs(path) + except OSError as e: + if e.errno == errno.EACCES: + try: + os.makedirs(path, mode=0o777) + except OSError as e: + if e.errno == errno.EACCES: + print("Permission denied even with elevated permissions.") + else: + print(f"Error creating directory: {e}") + else: + print(f"Error creating directory: {e}") + except Exception as e: + print(f"Error creating directory: {e}") + +def save_model_info(install_path, file_name, sub_folder, sha256=None, preview_html=None, overwrite_toggle=False, api_response=None): + filename = os.path.splitext(file_name)[0] + json_file = os.path.join(install_path, f'{filename}.json') + make_dir(install_path) + + save_api_info = getattr(opts, "save_api_info", False) + use_local = getattr(opts, "local_path_in_html", False) + save_to_custom = getattr(opts, "save_to_custom", False) + + if not api_response: + api_response = gl.json_data + + image_path = get_image_path(install_path, api_response, sub_folder) + + if save_to_custom: + save_path = image_path + else: + save_path = install_path + + result = find_and_save(api_response, sha256, file_name, json_file, False, overwrite_toggle) + if result != "found": + result = find_and_save(api_response, sha256, file_name, json_file, True, overwrite_toggle) + + if preview_html: + if use_local: + img_urls = re.findall(r'data-sampleimg="true" src=[\'"]?([^\'" >]+)', preview_html) + for i, img_url in enumerate(img_urls): + img_name = f'{filename}_{i}.png' + preview_html = preview_html.replace(img_url,f'{os.path.join(image_path, img_name)}') + + match = re.search(r'(\s*)
', preview_html) + if match: + indentation = match.group(1) + else: + indentation = '' + css_link = f'' + utf8_meta_tag = f'{indentation}' + head_section = f'{indentation}{indentation} {utf8_meta_tag}{indentation} {css_link}{indentation}' + HTML = head_section + preview_html + path_to_new_file = os.path.join(save_path, f'{filename}.html') + with open(path_to_new_file, 'wb') as f: + f.write(HTML.encode('utf8')) + + if save_api_info: + path_to_new_file = os.path.join(save_path, f'{filename}.api_info.json') + with open(path_to_new_file, mode="w", encoding="utf-8") as f: + json.dump(gl.json_info, f, indent=4, ensure_ascii=False) + + +def find_and_save(api_response, sha256=None, file_name=None, json_file=None, no_hash=None, overwrite_toggle=None): + save_desc = getattr(opts, "model_desc_to_json", True) + for item in api_response.get('items', []): + for model_version in item.get('modelVersions', []): + for file in model_version.get('files', []): + file_name_api = file.get('name', '') + sha256_api = file.get('hashes', {}).get('SHA256', '') + + if file_name == file_name_api if no_hash else sha256 == sha256_api: + gl.json_info = item + trained_words = model_version.get('trainedWords', []) + + if save_desc: + description = item.get('description', '') + if description != None: + description = clean_description(description) + + base_model = model_version.get('baseModel', '') + + if base_model.startswith("SD 1"): + base_model = "SD1" + elif base_model.startswith("SD 2"): + base_model = "SD2" + elif base_model.startswith("SDXL"): + base_model = "SDXL" + else: + base_model = "Other" + + if isinstance(trained_words, list): + trained_tags = ",".join(trained_words) + trained_tags = re.sub(r'<[^>]*:[^>]*>', '', trained_tags) + trained_tags = re.sub(r', ?', ', ', trained_tags) + trained_tags = trained_tags.strip(', ') + else: + trained_tags = trained_words + + if os.path.exists(json_file): + with open(json_file, 'r', encoding="utf-8") as f: + try: + content = json.load(f) + except: + content = {} + else: + content = {} + changed = False + if not overwrite_toggle: + if "activation text" not in content or not content["activation text"]: + content["activation text"] = trained_tags + changed = True + if save_desc: + if "description" not in content or not content["description"]: + content["description"] = description + changed = True + if "sd version" not in content or not content["sd version"]: + content["sd version"] = base_model + changed = True + else: + content["activation text"] = trained_tags + if save_desc: + content["description"] = description + content["sd version"] = base_model + changed = True + + with open(json_file, 'w', encoding="utf-8") as f: + json.dump(content, f, indent=4) + + if changed: + print(f"Model info saved to \"{json_file}\"") + return "found" + + return "not found" + +def get_models(file_path, gen_hash=None): + modelId = None + sha256 = None + json_file = os.path.splitext(file_path)[0] + ".json" + if os.path.exists(json_file): + try: + with open(json_file, 'r', encoding="utf-8") as f: + data = json.load(f) + + if 'modelId' in data: + modelId = data['modelId'] + if 'sha256' in data and data['sha256']: + sha256 = data['sha256'] + except Exception as e: + print(f"Failed to open {json_file}: {e}") + + if not modelId or not sha256 or modelId == "Model not found": + if gen_hash: + if not sha256: + sha256 = gen_sha256(file_path) + by_hash = f"https://civitai.com/api/v1/model-versions/by-hash/{sha256}" + else: + if modelId: + return modelId + else: + return None + proxies, ssl = _api.get_proxies() + try: + if not modelId or modelId == "Model not found": + response = requests.get(by_hash, timeout=(60,30), proxies=proxies, verify=ssl) + if response.status_code == 200: + api_response = response.json() + if 'error' in api_response: + print(f"\"{file_path}\": {api_response['error']}") + return None + else: + modelId = api_response.get("modelId", "") + elif response.status_code == 503: + return "offline" + elif response.status_code == 404: + api_response = response.json() + modelId = api_response.get("error", "") + + if os.path.exists(json_file): + try: + with open(json_file, 'r', encoding="utf-8") as f: + data = json.load(f) + + data['modelId'] = modelId + data['sha256'] = sha256.upper() + + with open(json_file, 'w', encoding="utf-8") as f: + json.dump(data, f, indent=4) + except Exception as e: + print(f"Failed to open {json_file}: {e}") + else: + data = { + 'modelId': modelId, + 'sha256': sha256.upper() + } + with open(json_file, 'w', encoding="utf-8") as f: + json.dump(data, f, indent=4) + + return modelId + except requests.exceptions.Timeout: + print(f"Request timed out for {file_path}. Skipping...") + return "offline" + except requests.exceptions.ConnectionError: + print("Failed to connect to the API. The CivitAI servers might be offline.") + return "offline" + except Exception as e: + print(f"An error occurred for {file_path}: {str(e)}") + return None + +def version_match(file_paths, api_response): + updated_models = [] + outdated_models = [] + sha256_hashes = {} + for file_path in file_paths: + json_path = f"{os.path.splitext(file_path)[0]}.json" + if os.path.exists(json_path): + with open(json_path, 'r', encoding="utf-8") as f: + try: + json_data = json.load(f) + sha256 = json_data.get('sha256') + if sha256: + sha256_hashes[os.path.basename(file_path)] = sha256.upper() + except Exception as e: + print(f"Failed to open {json_path}: {e}") + + file_names_and_hashes = set() + for file_path in file_paths: + file_name = os.path.basename(file_path) + file_name_without_ext = os.path.splitext(file_name)[0] + file_sha256 = sha256_hashes.get(file_name, "") + if file_sha256: file_sha256 = file_sha256.upper() + file_names_and_hashes.add((file_name_without_ext, file_sha256)) + + for item in api_response.get('items', []): + model_versions = item.get('modelVersions', []) + + if not model_versions: + continue + + for idx, model_version in enumerate(model_versions): + files = model_version.get('files', []) + match_found = False + for file_entry in files: + entry_name = os.path.splitext(file_entry.get('name', ''))[0] + entry_sha256 = file_entry.get('hashes', {}).get('SHA256', "") + if entry_sha256: entry_sha256 = entry_sha256.upper() + + if (entry_name, entry_sha256) in file_names_and_hashes: + match_found = True + break + + if match_found: + if idx == 0: + updated_models.append((f"&ids={item['id']}", item["name"])) + else: + outdated_models.append((f"&ids={item['id']}", item["name"])) + break + + return updated_models, outdated_models + +def get_content_choices(scan_choices=False): + use_LORA = getattr(opts, "use_LORA", False) + if use_LORA: + content_list = ["Checkpoint", "TextualInversion", "LORA & LoCon", "Poses", "Controlnet", "Hypernetwork", "AestheticGradient", "VAE", "Upscaler", "MotionModule", "Wildcards", "Workflows", "Other"] + else: + content_list = ["Checkpoint", "TextualInversion", "LORA", "LoCon", "Poses", "Controlnet", "Hypernetwork", "AestheticGradient", "VAE", "Upscaler", "MotionModule", "Wildcards", "Workflows", "Other"] + if scan_choices: + content_list.insert(0, 'All') + return content_list + return content_list + +def file_scan(folders, ver_finish, tag_finish, installed_finish, preview_finish, overwrite_toggle, tile_count, gen_hash, create_html, progress=gr.Progress() if queue else None): + global from_ver, from_installed, no_update + proxies, ssl = _api.get_proxies() + gl.scan_files = True + no_update = False + if from_ver: + number = _download.random_number(ver_finish) + elif from_tag: + number = _download.random_number(tag_finish) + elif from_installed: + number = _download.random_number(installed_finish) + elif from_preview: + number = _download.random_number(preview_finish) + + if not folders: + if progress != None: + progress(0, desc=f"No model type selected.") + no_update = True + gl.scan_files = False + from_ver, from_installed = False, False + time.sleep(2) + return (gr.HTML.update(value='
'), + gr.Textbox.update(value=number)) + + folders_to_check = [] + if 'All' in folders: + folders = _file.get_content_choices() + + for item in folders: + if item == "LORA & LoCon": + folder = _api.contenttype_folder("LORA") + if folder: + folders_to_check.append(folder) + folder = _api.contenttype_folder("LoCon", fromCheck=True) + if folder: + folders_to_check.append(folder) + elif item == "Upscaler": + folder = _api.contenttype_folder(item, "SwinIR") + if folder: + folders_to_check.append(folder) + folder = _api.contenttype_folder(item, "RealESRGAN") + if folder: + folders_to_check.append(folder) + folder = _api.contenttype_folder(item, "GFPGAN") + if folder: + folders_to_check.append(folder) + folder = _api.contenttype_folder(item, "BSRGAN") + if folder: + folders_to_check.append(folder) + folder = _api.contenttype_folder(item, "ESRGAN") + if folder: + folders_to_check.append(folder) + else: + folder = _api.contenttype_folder(item) + if folder: + folders_to_check.append(folder) + + total_files = 0 + files_done = 0 + + files = list_files(folders_to_check) + total_files += len(files) + + if total_files == 0: + if progress != None: + progress(1, desc=f"No files in selected folder.") + no_update = True + gl.scan_files = False + from_ver, from_installed = False, False + time.sleep(2) + return (gr.HTML.update(value='
'), + gr.Textbox.update(value=number)) + + updated_models = [] + outdated_models = [] + all_model_ids = [] + file_paths = [] + all_ids = [] + + for file_path in files: + if gl.cancel_status: + if progress != None: + progress(files_done / total_files, desc=f"Processing files cancelled.") + no_update = True + gl.scan_files = False + from_ver, from_installed = False, False + time.sleep(2) + return (gr.HTML.update(value='
'), + gr.Textbox.update(value=number)) + file_name = os.path.basename(file_path) + if progress != None: + progress(files_done / total_files, desc=f"Processing file: {file_name}") + + model_id = get_models(file_path, gen_hash) + if model_id == "offline": + print("The CivitAI servers did not respond, unable to retrieve Model ID") + elif model_id == "Model not found": + print(f"model: \"{file_name}\" not found on CivitAI servers.") + elif model_id != None: + all_model_ids.append(f"&ids={model_id}") + all_ids.append(model_id) + file_paths.append(file_path) + elif not model_id: + print(f"model ID not found for: \"{file_name}\"") + files_done += 1 + + all_items = [] + + all_model_ids = list(set(all_model_ids)) + + if not all_model_ids: + progress(1, desc=f"No model IDs could be retrieved.") + print("Could not retrieve any Model IDs, please make sure to turn on the \"One-Time Hash Generation for externally downloaded models.\" option if you haven't already.") + no_update = True + gl.scan_files = False + from_ver, from_installed = False, False + time.sleep(2) + return (gr.HTML.update(value='
'), + gr.Textbox.update(value=number)) + + def chunks(lst, n): + for i in range(0, len(lst), n): + yield lst[i:i + n] + + if not from_installed: + model_chunks = list(chunks(all_model_ids, 500)) + + base_url = "https://civitai.com/api/v1/models?limit=100" + url_list = [f"{base_url}{''.join(chunk)}" for chunk in model_chunks] + + url_count = len(all_model_ids) // 100 + if len(all_model_ids) % 100 != 0: + url_count += 1 + url_done = 0 + api_response = {} + for url in url_list: + while url: + try: + if progress is not None: + progress(url_done / url_count, desc=f"Sending API request... {url_done}/{url_count}") + response = requests.get(url, timeout=(60,30), proxies=proxies, verify=ssl) + if response.status_code == 200: + api_response_json = response.json() + + all_items.extend(api_response_json['items']) + metadata = api_response_json.get('metadata', {}) + url = metadata.get('nextPage', None) + elif response.status_code == 503: + return ( + gr.HTML.update(value=offlineHTML), + gr.Textbox.update(value=number) + ) + else: + print(f"Error: Received status code {response.status_code} with URL: {url}") + url = None + url_done += 1 + except requests.exceptions.Timeout: + print(f"Request timed out for {url}. Skipping...") + url = None + except requests.exceptions.ConnectionError: + print("Failed to connect to the API. The servers might be offline.") + url = None + except Exception as e: + print(f"An unexpected error occurred: {e}") + url = None + + api_response['items'] = all_items + if api_response['items'] == []: + return ( + gr.HTML.update(value=offlineHTML), + gr.Textbox.update(value=number) + ) + + if progress != None: + progress(1, desc="Processing final results...") + + if from_ver: + updated_models, outdated_models = version_match(file_paths, api_response) + + updated_set = set(updated_models) + outdated_set = set(outdated_models) + outdated_set = {model for model in outdated_set if model[0] not in {updated_model[0] for updated_model in updated_set}} + + all_model_ids = [model[0] for model in outdated_set] + all_model_names = [model[1] for model in outdated_set] + + for model_name in all_model_names: + print(f'"{model_name}" is currently outdated.') + + if len(all_model_ids) == 0: + no_update = True + gl.scan_files = False + from_ver = False + return ( + gr.HTML.update(value='
No updates found for selected models.
'), + gr.Textbox.update(value=number) + ) + + model_chunks = list(chunks(all_model_ids, tile_count)) + + base_url = "https://civitai.com/api/v1/models?limit=100" + gl.url_list_with_numbers = {i+1: f"{base_url}{''.join(chunk)}" for i, chunk in enumerate(model_chunks)} + + url_error = False + api_url = gl.url_list_with_numbers.get(1) + + if not url_error: + response = requests.get(api_url, timeout=(60,30), proxies=proxies, verify=ssl) + try: + if response.status_code == 200: + response.encoding = "utf-8" + gl.ver_json = json.loads(response.text) + + highest_number = max(gl.url_list_with_numbers.keys()) + gl.ver_json["metadata"]["totalPages"] = highest_number + + if highest_number > 1: + gl.ver_json["metadata"]["nextPage"] = gl.url_list_with_numbers.get(2) + else: + print(f"Error: Received status code {response.status_code} for URL: {url}") + url_error = True + except requests.exceptions.Timeout: + print(f"Request timed out for {url}. Skipping...") + url_error = True + except requests.exceptions.ConnectionError: + print("Failed to connect to the API. The servers might be offline.") + url_error = True + except Exception as e: + print(f"An unexpected error occurred: {e}") + url_error = True + + if url_error: + gl.scan_files = False + return ( + gr.HTML.update(value=offlineHTML), + gr.Textbox.update(value=number) + ) + elif from_ver: + gl.scan_files = False + return ( + gr.HTML.update(value='
Outdated models have been found.
Please press the button above to load the models into the browser tab
'), + gr.Textbox.update(value=number) + ) + + elif from_installed: + gl.scan_files = False + return ( + gr.HTML.update(value='
Installed models have been loaded.
Please press the button above to load the models into the browser tab
'), + gr.Textbox.update(value=number) + ) + + elif from_tag: + for file_path, id_value in zip(file_paths, all_ids): + install_path, file_name = os.path.split(file_path) + model_versions = _api.update_model_versions(id_value, api_response) + if create_html: + preview_html = _api.update_model_info(None, model_versions.get('value'), True, id_value, api_response, True) + else: + preview_html = None + sub_folder = os.path.normpath(os.path.relpath(install_path, gl.main_folder)) + save_model_info(install_path, file_name, sub_folder, preview_html=preview_html, api_response=api_response, overwrite_toggle=overwrite_toggle) + if progress != None: + progress(1, desc=f"All tags succesfully saved!") + gl.scan_files = False + time.sleep(2) + return ( + gr.HTML.update(value='
'), + gr.Textbox.update(value=number) + ) + + elif from_preview: + completed_preview = 0 + preview_count = len(file_paths) + for file in file_paths: + _, file_name = os.path.split(file) + name = os.path.splitext(file_name)[0] + if progress != None: + progress(completed_preview / preview_count, desc=f"Saving preview images... {completed_preview}/{preview_count} | {name}") + save_preview(file, api_response, overwrite_toggle) + completed_preview += 1 + gl.scan_files = False + return ( + gr.HTML.update(value='
'), + gr.Textbox.update(value=number) + ) + +def save_tag_start(tag_start): + global from_tag, from_ver, from_installed, from_preview + from_tag, from_ver, from_installed, from_preview = True, False, False, False + number = _download.random_number(tag_start) + return ( + gr.Textbox.update(value=number), + gr.Button.update(interactive=False, visible=False), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.HTML.update(value='
') + ) + +def save_preview_start(preview_start): + global from_tag, from_ver, from_installed, from_preview + from_preview, from_tag, from_ver, from_installed = True, False, False, False + number = _download.random_number(preview_start) + return ( + gr.Textbox.update(value=number), + gr.Button.update(interactive=False, visible=False), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.HTML.update(value='
') + ) + +def installed_models_start(installed_start): + global from_installed, from_ver, from_tag, from_preview + from_installed, from_ver, from_tag, from_preview = True, False, False, False + number = _download.random_number(installed_start) + return ( + gr.Textbox.update(value=number), + gr.Button.update(interactive=False, visible=False), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.HTML.update(value='
') + ) + +def ver_search_start(ver_start): + global from_ver, from_tag, from_installed, from_preview + from_ver, from_tag, from_installed, from_preview = True, False, False, False + number = _download.random_number(ver_start) + return ( + gr.Textbox.update(value=number), + gr.Button.update(interactive=False, visible=False), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.Button.update(interactive=False, visible=True), + gr.HTML.update(value='
') + ) + +def save_tag_finish(): + global from_tag + from_tag = False + return ( + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=False) + ) + +def save_preview_finish(): + global from_preview + from_preview = False + return ( + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=False) + ) + +def scan_finish(): + return ( + gr.Button.update(interactive=no_update, visible=no_update), + gr.Button.update(interactive=no_update, visible=no_update), + gr.Button.update(interactive=no_update, visible=no_update), + gr.Button.update(interactive=no_update, visible=no_update), + gr.Button.update(interactive=False, visible=False), + gr.Button.update(interactive=not no_update, visible=not no_update) + ) + +def load_to_browser(content_type, sort_type, period_type, use_search_term, search_term, tile_count, base_filter, nsfw): + global from_ver, from_installed + if from_ver: + model_list_return = _api.update_model_list(from_ver=True, tile_count=tile_count) + if from_installed: + model_list_return = _api.update_model_list(from_installed=True, tile_count=tile_count) + + use_LORA = getattr(opts, "use_LORA", False) + if content_type: + if use_LORA and 'LORA & LoCon' in content_type: + content_type.remove('LORA & LoCon') + if 'LORA' not in content_type: + content_type.append('LORA') + if 'LoCon' not in content_type: + content_type.append('LoCon') + + current_inputs = (content_type, sort_type, period_type, use_search_term, search_term, tile_count, base_filter, nsfw) + gl.previous_inputs = current_inputs + + gl.file_scan = True + from_ver, from_installed = False, False + return ( + *model_list_return, + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=True, visible=True), + gr.Button.update(interactive=False, visible=False), + gr.Button.update(interactive=False, visible=False), + gr.HTML.update(value='
') + ) + +def cancel_scan(): + gl.cancel_status = True + + while True: + if not gl.scan_files: + gl.cancel_status = False + return + else: + time.sleep(0.5) + continue diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_global.py b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_global.py new file mode 100644 index 0000000000000000000000000000000000000000..71567dd407cae953c8e515e7f85bcc25d0f9d974 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_global.py @@ -0,0 +1,28 @@ +def init(): + import warnings + from urllib3.exceptions import InsecureRequestWarning + warnings.simplefilter('ignore', InsecureRequestWarning) + + global download_queue, last_version, cancel_status, recent_model, json_data, json_info, main_folder, previous_inputs, download_fail, sortNewest, isDownloading, old_download, scan_files, ver_json, file_scan, url_list_with_numbers, print + + cancel_status = None + recent_model = None + json_data = None + json_info = None + main_folder = None + previous_inputs = None + last_version = None + ver_json = None + url_list_with_numbers = None + download_queue = [] + + file_scan = False + scan_files = False + download_fail = False + sortNewest = False + isDownloading = False + old_download = False + +_print = print +def print(print_message): + _print(f'\033[96mCivitAI Browser+\033[0m: {print_message}') \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_gui.py b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_gui.py new file mode 100644 index 0000000000000000000000000000000000000000..3237ef4d8ecfaaf23aea021be3d6046432c835b2 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/scripts/civitai_gui.py @@ -0,0 +1,1322 @@ +import gradio as gr +from modules import script_callbacks, shared +import os +import json +import fnmatch +import re +import subprocess +from modules.shared import opts, cmd_opts +from modules.paths import extensions_dir +from scripts.civitai_global import print +import scripts.civitai_global as gl +import scripts.civitai_download as _download +import scripts.civitai_file_manage as _file +import scripts.civitai_api as _api + +def git_tag(): + try: + return subprocess.check_output([os.environ.get('GIT', "git"), "describe", "--tags"], shell=False, encoding='utf8').strip() + except: + return None + +try: + import modules_forge + forge = True + ver_bool = True +except ImportError: + forge = False + +if not forge: + try: + from packaging import version + ver = git_tag() + + if not ver: + try: + from modules import launch_utils + ver = launch_utils.git_tag() + except: + print("Failed to fetch SD-WebUI version") + ver_bool = False + if ver: + ver = ver.split('-')[0].rsplit('-', 1)[0] + ver_bool = version.parse(ver[0:]) >= version.parse("1.7") + except ImportError: + print("Python module 'packaging' has not been imported correctly, please try to restart or install it manually.") + ver_bool = False + +gl.init() + +def saveSettings(ust, ct, pt, st, bf, cj, td, ol, hi, sn, ss, ts): + config = cmd_opts.ui_config_file + + # Create a dictionary to map the settings to their respective variables + settings_map = { + "civitai_interface/Search type:/value": ust, + "civitai_interface/Content type:/value": ct, + "civitai_interface/Time period:/value": pt, + "civitai_interface/Sort by:/value": st, + "civitai_interface/Base model:/value": bf, + "civitai_interface/Save info after download/value": cj, + "civitai_interface/Divide cards by date/value": td, + "civitai_interface/Liked models only/value": ol, + "civitai_interface/Hide installed models/value": hi, + "civitai_interface/NSFW content/value": sn, + "civitai_interface/Tile size:/value": ss, + "civitai_interface/Tile count:/value": ts + } + + # Load the current contents of the config file into a dictionary + try: + with open(config, "r", encoding="utf8") as file: + data = json.load(file) + except: + print(f"Cannot save settings, failed to open \"{file}\"") + print("Please try to manually repair the file or remove it to reset settings.") + return + + # Remove any keys containing the text `civitai_interface` + keys_to_remove = [key for key in data if "civitai_interface" in key] + for key in keys_to_remove: + del data[key] + + # Update the dictionary with the new settings + data.update(settings_map) + + # Save the modified content back to the file + with open(config, 'w', encoding="utf-8") as file: + json.dump(data, file, indent=4) + print(f"Updated settings to: {config}") + +def all_visible(html_check): + return gr.Button.update(visible="model-checkbox" in html_check) + +def show_multi_buttons(model_list, type_list, version_value): + model_list = json.loads(model_list) + type_list = json.loads(type_list) + otherButtons = True + multi_file_subfolder = False + default_subfolder = "Only available if the selected files are of the same model type" + sub_folders = ["None"] + BtnDwn = version_value and not version_value.endswith('[Installed]') and not model_list + BtnDel = version_value.endswith('[Installed]') + + dot_subfolders = getattr(opts, "dot_subfolders", True) + + multi = bool(model_list) and not len(gl.download_queue) > 0 + if model_list: + otherButtons = False + if type_list and all(x == type_list[0] for x in type_list): + multi_file_subfolder = True + model_folder = os.path.join(_api.contenttype_folder(type_list[0])) + default_subfolder = "None" + try: + for root, dirs, _ in os.walk(model_folder, followlinks=True): + if dot_subfolders: + dirs = [d for d in dirs if not d.startswith('.')] + dirs = [d for d in dirs if not any(part.startswith('.') for part in os.path.join(root, d).split(os.sep))] + for d in dirs: + sub_folder = os.path.relpath(os.path.join(root, d), model_folder) + if sub_folder: + sub_folders.append(f'{os.sep}{sub_folder}') + sub_folders.remove("None") + sub_folders = sorted(sub_folders, key=lambda x: (x.lower(), x)) + sub_folders.insert(0, "None") + + list = set() + sub_folders = [x for x in sub_folders if not (x in list or list.add(x))] + except: + sub_folders = ["None"] + + return (gr.Button.update(visible=multi, interactive=multi), # Download Multi Button + gr.Button.update(visible=BtnDwn if multi else True if not version_value.endswith('[Installed]') else False), # Download Button + gr.Button.update(visible=BtnDel if not model_list else False), # Delete Button + gr.Button.update(visible=otherButtons), # Save model info Button + gr.Button.update(visible=otherButtons), # Save images Button + gr.Dropdown.update(visible=multi, interactive=multi_file_subfolder, choices=sub_folders, value=default_subfolder) # Selected type sub folder + ) + +def txt2img_output(image_url): + clean_url = image_url[4:] + geninfo = _api.fetch_and_process_image(clean_url) + if geninfo: + nr = _download.random_number() + geninfo = nr + geninfo + return gr.Textbox.update(value=geninfo) + +def on_ui_tabs(): + page_header = getattr(opts, "page_header", False) + lobe_directory = None + + for root, dirs, files in os.walk(extensions_dir, followlinks=True): + for dir_name in fnmatch.filter(dirs, '*lobe*'): + lobe_directory = os.path.join(root, dir_name) + break + + # Different ID's for Lobe Theme + component_id = "togglesL" if lobe_directory else "toggles" + toggle1 = "toggle1L" if lobe_directory else "toggle1" + toggle2 = "toggle2L" if lobe_directory else "toggle2" + toggle3 = "toggle3L" if lobe_directory else "toggle3" + toggle5 = "toggle5L" if lobe_directory else "toggle5" + refreshbtn = "refreshBtnL" if lobe_directory else "refreshBtn" + filterBox = "filterBoxL" if lobe_directory else "filterBox" + + if page_header: + header = "headerL" if lobe_directory else "header" + else: + header = "header_off" + + api_key = getattr(opts, "custom_api_key", "") + if api_key: + toggle4 = "toggle4L_api" if lobe_directory else "toggle4_api" + show_only_liked = True + else: + toggle4 = "toggle4L" if lobe_directory else "toggle4" + show_only_liked = False + + content_choices = _file.get_content_choices() + scan_choices = _file.get_content_choices(scan_choices=True) + with gr.Blocks() as civitai_interface: + with gr.Tab(label="Browser", elem_id="browserTab"): + with gr.Row(elem_id="searchRow"): + with gr.Accordion(label="", open=False, elem_id=filterBox): + with gr.Row(): + use_search_term = gr.Radio(label="Search type:", choices=["Model name", "User name", "Tag"], value="Model name", elem_id="searchType") + with gr.Row(): + content_type = gr.Dropdown(label='Content type:', choices=content_choices, value=None, type="value", multiselect=True, elem_id="centerText") + with gr.Row(): + base_filter = gr.Dropdown(label='Base model:', multiselect=True, choices=["SD 1.4","SD 1.5","SD 1.5 LCM","SD 2.0","SD 2.0 768","SD 2.1","SD 2.1 768","SD 2.1 Unclip","SDXL 0.9","SDXL 1.0","SDXL 1.0 LCM","SDXL Distilled","SDXL Turbo","SDXL Lightning","Stable Cascade","Pony","SVD","SVD XT","Playground v2","PixArt a","Other"], value=None, type="value", elem_id="centerText") + with gr.Row(): + period_type = gr.Dropdown(label='Time period:', choices=["All Time", "Year", "Month", "Week", "Day"], value="All Time", type="value", elem_id="centerText") + sort_type = gr.Dropdown(label='Sort by:', choices=["Newest","Oldest","Most Downloaded","Highest Rated","Most Liked","Most Buzz","Most Discussed","Most Collected","Most Images"], value="Most Downloaded", type="value", elem_id="centerText") + with gr.Row(elem_id=component_id): + create_json = gr.Checkbox(label=f"Save info after download", value=True, elem_id=toggle1, min_width=171) + show_nsfw = gr.Checkbox(label="NSFW content", value=False, elem_id=toggle2, min_width=107) + toggle_date = gr.Checkbox(label="Divide cards by date", value=False, elem_id=toggle3, min_width=142) + only_liked = gr.Checkbox(label="Liked models only", value=False, interactive=show_only_liked, elem_id=toggle4, min_width=163) + hide_installed = gr.Checkbox(label="Hide installed models", value=False, elem_id=toggle5, min_width=170) + with gr.Row(): + size_slider = gr.Slider(minimum=4, maximum=20, value=8, step=0.25, label='Tile size:') + tile_count_slider = gr.Slider(label="Tile count:", minimum=1, maximum=100, value=15, step=1) + with gr.Row(elem_id="save_set_box"): + save_settings = gr.Button(value="Save settings as default", elem_id="save_set_btn") + search_term = gr.Textbox(label="", placeholder="Search CivitAI", elem_id="searchBox") + refresh = gr.Button(label="", value="", elem_id=refreshbtn, icon="placeholder") + with gr.Row(elem_id=header): + with gr.Row(elem_id="pageBox"): + get_prev_page = gr.Button(value="Prev page", interactive=False, elem_id="pageBtn1") + page_slider = gr.Slider(label='Current page', step=1, minimum=1, maximum=1, value=1, min_width=80, elem_id="pageSlider") + get_next_page = gr.Button(value="Next page", interactive=False, elem_id="pageBtn2") + with gr.Row(elem_id="pageBoxMobile"): + pass # Row used for button placement on mobile + with gr.Row(elem_id="select_all_models_container"): + select_all = gr.Button(value="Select All", elem_id="select_all_models", visible=False) + with gr.Row(): + list_html = gr.HTML(value='
Click the search icon to load models.
Use the filter icon to filter results.
') + with gr.Row(): + download_progress = gr.HTML(value='
', elem_id="DownloadProgress") + with gr.Row(): + list_models = gr.Dropdown(label="Model:", choices=[], interactive=False, elem_id="quicksettings1", value=None) + list_versions = gr.Dropdown(label="Version:", choices=[], interactive=False, elem_id="quicksettings", value=None) + file_list = gr.Dropdown(label="File:", choices=[], interactive=False, elem_id="file_list", value=None) + with gr.Row(): + with gr.Column(scale=4): + install_path = gr.Textbox(label="Download folder:", interactive=False, max_lines=1) + with gr.Column(scale=2): + sub_folder = gr.Dropdown(label="Sub folder:", choices=[], interactive=False, value=None) + with gr.Row(): + with gr.Column(scale=4): + trained_tags = gr.Textbox(label='Trained tags (if any):', value=None, interactive=False, lines=1) + with gr.Column(scale=2, elem_id="spanWidth"): + base_model = gr.Textbox(label='Base model: ', value=None, interactive=False, lines=1, elem_id="baseMdl") + model_filename = gr.Textbox(label="Model filename:", interactive=False, value=None) + with gr.Row(): + save_info = gr.Button(value="Save model info", interactive=False) + save_images = gr.Button(value="Save images", interactive=False) + delete_model = gr.Button(value="Delete model", interactive=False, visible=False) + download_model = gr.Button(value="Download model", interactive=False) + subfolder_selected = gr.Dropdown(label="Sub folder for selected files:", choices=[], interactive=False, visible=False, value=None, allow_custom_value=True) + download_selected = gr.Button(value="Download all selected", interactive=False, visible=False, elem_id="download_all_button") + with gr.Row(): + cancel_all_model = gr.Button(value="Cancel all downloads", interactive=False, visible=False) + cancel_model = gr.Button(value="Cancel current download", interactive=False, visible=False) + with gr.Row(): + preview_html = gr.HTML(elem_id="civitai_preview_html") + with gr.Row(elem_id="backToTopContainer"): + back_to_top = gr.Button(value="โ†‘", elem_id="backToTop") + with gr.Tab("Update Models"): + with gr.Row(): + selected_tags = gr.CheckboxGroup(elem_id="selected_tags", label="Scan for:", choices=scan_choices) + with gr.Row(elem_id="civitai_update_toggles"): + overwrite_toggle = gr.Checkbox(elem_id="overwrite_toggle", label="Overwrite any existing previews, tags or descriptions.", value=True, min_width=300) + skip_hash_toggle = gr.Checkbox(elem_id="skip_hash_toggle", label="One-Time Hash Generation for externally downloaded models.", value=True, min_width=300) + do_html_gen = gr.Checkbox(elem_id="do_html_gen", label="Save HTML file for each model when updating info & tags (increases process time).", value=False, min_width=300) + with gr.Row(): + save_all_tags = gr.Button(value="Update model info & tags", interactive=True, visible=True) + cancel_all_tags = gr.Button(value="Cancel updating model info & tags", interactive=False, visible=False) + with gr.Row(): + tag_progress = gr.HTML(value='
') + with gr.Row(): + update_preview = gr.Button(value="Update model preview", interactive=True, visible=True) + cancel_update_preview = gr.Button(value="Cancel updating model previews", interactive=False, visible=False) + with gr.Row(): + preview_progress = gr.HTML(value='
') + with gr.Row(): + ver_search = gr.Button(value="Scan for available updates", interactive=True, visible=True) + cancel_ver_search = gr.Button(value="Cancel updates scan", interactive=False, visible=False) + load_to_browser = gr.Button(value="Load outdated models to browser", interactive=False, visible=False) + with gr.Row(): + version_progress = gr.HTML(value='
') + with gr.Row(): + load_installed = gr.Button(value="Load all installed models", interactive=True, visible=True) + cancel_installed = gr.Button(value="Cancel loading models", interactive=False, visible=False) + load_to_browser_installed = gr.Button(value="Load installed models to browser", interactive=False, visible=False) + with gr.Row(): + installed_progress = gr.HTML(value='
') + with gr.Tab("Download Queue"): + + def get_style(size, left_border): + return f"flex-grow: {size};" + ("border-left: 1px solid var(--border-color-primary);" if left_border else "") + "border-bottom: 1px solid var(--border-color-primary);padding: 5px 10px 5px 10px;width: 0;" + + download_manager_html = gr.HTML(elem_id="civitai_dl_list", value=f''' +
+
Model:
+
Version:
+
Path:
+
Status:
+
Action:
+
+
+
+ In queue: (drag items to rearrange queue order) +
+
+ ''') + + #Invisible triggers/variables + + model_id = gr.Textbox(visible=False) + queue_trigger = gr.Textbox(visible=False) + dl_url = gr.Textbox(visible=False) + civitai_text2img_output = gr.Textbox(visible=False) + civitai_text2img_input = gr.Textbox(elem_id="civitai_text2img_input", visible=False) + selected_model_list = gr.Textbox(elem_id="selected_model_list", visible=False) + selected_type_list = gr.Textbox(elem_id="selected_type_list", visible=False) + html_cancel_input = gr.Textbox(elem_id="html_cancel_input", visible=False) + queue_html_input = gr.Textbox(elem_id="queue_html_input", visible=False) + arrange_dl_id = gr.Textbox(elem_id="arrange_dl_id", visible=False) + remove_dl_id = gr.Textbox(elem_id="remove_dl_id", visible=False) + model_select = gr.Textbox(elem_id="model_select", visible=False) + model_sent = gr.Textbox(elem_id="model_sent", visible=False) + type_sent = gr.Textbox(elem_id="type_sent", visible=False) + download_start = gr.Textbox(visible=False) + download_finish = gr.Textbox(visible=False) + tag_start = gr.Textbox(visible=False) + tag_finish = gr.Textbox(visible=False) + preview_start = gr.Textbox(visible=False) + preview_finish = gr.Textbox(visible=False) + ver_start = gr.Textbox(visible=False) + ver_finish = gr.Textbox(visible=False) + installed_start = gr.Textbox(visible=None) + installed_finish = gr.Textbox(visible=None) + delete_finish = gr.Textbox(visible=False) + current_model = gr.Textbox(visible=False) + current_sha256 = gr.Textbox(visible=False) + model_preview_html = gr.Textbox(visible=False) + + def ToggleDate(toggle_date): + gl.sortNewest = toggle_date + + def select_subfolder(sub_folder): + if sub_folder == "None" or sub_folder == "Only available if the selected files are of the same model type": + newpath = gl.main_folder + else: + newpath = gl.main_folder + sub_folder + return gr.Textbox.update(value=newpath) + + # Javascript Functions # + + list_html.change(fn=None, inputs=hide_installed, _js="(toggleValue) => hideInstalled(toggleValue)") + hide_installed.input(fn=None, inputs=hide_installed, _js="(toggleValue) => hideInstalled(toggleValue)") + + civitai_text2img_output.change(fn=None, inputs=civitai_text2img_output, _js="(genInfo) => genInfo_to_txt2img(genInfo)") + + download_selected.click(fn=None, _js="() => deselectAllModels()") + + select_all.click(fn=None, _js="() => selectAllModels()") + + list_models.select(fn=None, inputs=list_models, _js="(list_models) => select_model(list_models)") + + preview_html.change(fn=None, _js="() => adjustFilterBoxAndButtons()") + preview_html.change(fn=None, _js="() => setDescriptionToggle()") + + back_to_top.click(fn=None, _js="() => BackToTop()") + + page_slider.release(fn=None, _js="() => pressRefresh()") + + card_updates = [queue_trigger, download_finish, delete_finish] + for func in card_updates: + func.change(fn=None, inputs=current_model, _js="(modelName) => updateCard(modelName)") + + list_html.change(fn=None, inputs=show_nsfw, _js="(hideAndBlur) => toggleNSFWContent(hideAndBlur)") + show_nsfw.change(fn=None, inputs=show_nsfw, _js="(hideAndBlur) => toggleNSFWContent(hideAndBlur)") + + list_html.change(fn=None, inputs=size_slider, _js="(size) => updateCardSize(size, size * 1.5)") + size_slider.change(fn=None, inputs=size_slider, _js="(size) => updateCardSize(size, size * 1.5)") + + model_preview_html.change(fn=None, inputs=model_preview_html, _js="(html_input) => inputHTMLPreviewContent(html_input)") + + download_manager_html.change(fn=None, _js="() => setSortable()") + + # Filter button Functions # + + def HTMLChange(input): + return gr.HTML.update(value=input) + + queue_html_input.change(fn=HTMLChange, inputs=[queue_html_input], outputs=download_manager_html) + + remove_dl_id.change( + fn=_download.remove_from_queue, + inputs=[remove_dl_id] + ) + + arrange_dl_id.change( + fn=_download.arrange_queue, + inputs=[arrange_dl_id] + ) + + html_cancel_input.change( + fn=_download.download_cancel + ) + + html_cancel_input.change(fn=None, _js="() => cancelCurrentDl()") + + save_settings.click( + fn=saveSettings, + inputs=[ + use_search_term, + content_type, + period_type, + sort_type, + base_filter, + create_json, + toggle_date, + only_liked, + hide_installed, + show_nsfw, + size_slider, + tile_count_slider + ] + ) + + toggle_date.input( + fn=ToggleDate, + inputs=[toggle_date] + ) + + # Model Button Functions # + + civitai_text2img_input.change(fn=txt2img_output,inputs=civitai_text2img_input,outputs=civitai_text2img_output) + + list_html.change(fn=all_visible,inputs=list_html,outputs=select_all) + + def update_models_dropdown(input): + if not gl.json_data: + return ( + gr.Dropdown.update(value=None, choices=[], interactive=False), # List models + gr.Dropdown.update(value=None, choices=[], interactive=False), # List version + gr.HTML.update(value=None), # Preview HTML + gr.Textbox.update(value=None, interactive=False), # Trained Tags + gr.Textbox.update(value=None, interactive=False), # Base Model + gr.Textbox.update(value=None, interactive=False), # Model filename + gr.Textbox.update(value=None, interactive=False), # Install path + gr.Dropdown.update(value=None, choices=[], interactive=False), # Sub folder + gr.Button.update(interactive=False), # Download model btn + gr.Button.update(interactive=False), # Save image btn + gr.Button.update(interactive=False, visible=False), # Delete model btn + gr.Dropdown.update(value=None, choices=[], interactive=False), # File list + gr.Textbox.update(value=None), # DL Url + gr.Textbox.update(value=None), # Model ID + gr.Textbox.update(value=None), # Current sha256 + gr.Button.update(interactive=False), # Save model info + gr.HTML.update(value='
Click the search icon to load models.
Use the filter icon to filter results.
') # Model list + ) + + model_string = re.sub(r'\.\d{3}$', '', input) + model_name, model_id = _api.extract_model_info(model_string) + model_versions = _api.update_model_versions(model_id) + (html, tags, base_mdl, DwnButton, SaveImages, DelButton, filelist, filename, dl_url, id, current_sha256, install_path, sub_folder) = _api.update_model_info(model_string, model_versions.get('value')) + return (gr.Dropdown.update(value=model_string, interactive=True), + model_versions,html,tags,base_mdl,filename,install_path,sub_folder,DwnButton,SaveImages,DelButton,filelist,dl_url,id,current_sha256, + gr.Button.update(interactive=True), + gr.HTML.update() + ) + + model_select.change( + fn=update_models_dropdown, + inputs=[model_select], + outputs=[ + list_models, + list_versions, + preview_html, + trained_tags, + base_model, + model_filename, + install_path, + sub_folder, + download_model, + save_images, + delete_model, + file_list, + dl_url, + model_id, + current_sha256, + save_info, + list_html + ] + ) + + model_sent.change( + fn=_file.model_from_sent, + inputs=[model_sent, type_sent, tile_count_slider], + outputs=[model_preview_html] + ) + + sub_folder.select( + fn=select_subfolder, + inputs=[sub_folder], + outputs=[install_path] + ) + + list_versions.select( + fn=_api.update_model_info, + inputs=[ + list_models, + list_versions + ], + outputs=[ + preview_html, + trained_tags, + base_model, + download_model, + save_images, + delete_model, + file_list, + model_filename, + dl_url, + model_id, + current_sha256, + install_path, + sub_folder + ] + ) + + file_list.input( + fn=_api.update_file_info, + inputs=[ + list_models, + list_versions, + file_list + ], + outputs=[ + model_filename, + dl_url, + model_id, + current_sha256, + download_model, + delete_model, + install_path, + sub_folder + ] + ) + + # Download/Save Model Button Functions # + + selected_model_list.change( + fn=show_multi_buttons, + inputs=[selected_model_list, selected_type_list, list_versions], + outputs=[ + download_selected, + download_model, + delete_model, + save_info, + save_images, + subfolder_selected + ] + ) + + download_model.click( + fn=_download.download_start, + inputs=[ + download_start, + dl_url, + model_filename, + install_path, + list_models, + list_versions, + current_sha256, + model_id, + create_json, + download_manager_html + ], + outputs=[ + download_model, + cancel_model, + cancel_all_model, + download_start, + download_progress, + download_manager_html + ] + ) + + download_selected.click( + fn=_download.selected_to_queue, + inputs=[ + selected_model_list, + subfolder_selected, + download_start, + create_json, + download_manager_html + ], + outputs=[ + download_model, + cancel_model, + cancel_all_model, + download_start, + download_progress, + download_manager_html + ] + ) + + + for component in [download_start, queue_trigger]: + component.change(fn=None, _js="() => setDownloadProgressBar()") + component.change( + fn=_download.download_create_thread, + inputs=[download_finish, queue_trigger], + outputs=[ + download_progress, + current_model, + download_finish, + queue_trigger + ] + ) + + download_finish.change( + fn=_download.download_finish, + inputs=[ + model_filename, + list_versions, + model_id + ], + outputs=[ + download_model, + cancel_model, + cancel_all_model, + delete_model, + download_progress, + list_versions + ] + ) + + cancel_model.click(_download.download_cancel) + cancel_all_model.click(_download.download_cancel_all) + + cancel_model.click(fn=None, _js="() => cancelCurrentDl()") + cancel_all_model.click(fn=None, _js="() => cancelAllDl()") + + delete_model.click( + fn=_file.delete_model, + inputs=[ + delete_finish, + model_filename, + list_models, + list_versions, + current_sha256, + selected_model_list + ], + outputs=[ + download_model, + cancel_model, + delete_model, + delete_finish, + current_model, + list_versions + ] + ) + + save_info.click( + fn=_file.save_model_info, + inputs=[ + install_path, + model_filename, + sub_folder, + current_sha256, + preview_html + ], + outputs=[] + ) + + save_images.click( + fn=_file.save_images, + inputs=[ + preview_html, + model_filename, + install_path, + sub_folder + ], + outputs=[] + ) + + # Common input&output lists # + + page_inputs = [ + content_type, + sort_type, + period_type, + use_search_term, + search_term, + page_slider, + base_filter, + only_liked, + show_nsfw, + tile_count_slider + ] + + page_outputs = [ + list_models, + list_versions, + list_html, + get_prev_page, + get_next_page, + page_slider, + save_info, + save_images, + download_model, + delete_model, + install_path, + sub_folder, + file_list, + preview_html, + trained_tags, + base_model, + model_filename + ] + + file_scan_inputs = [ + selected_tags, + ver_finish, + tag_finish, + installed_finish, + preview_finish, + overwrite_toggle, + tile_count_slider, + skip_hash_toggle, + do_html_gen + ] + + load_to_browser_inputs = [ + content_type, + sort_type, + period_type, + use_search_term, + search_term, + tile_count_slider, + base_filter, + show_nsfw + ] + + cancel_btn_list = [cancel_all_tags,cancel_ver_search,cancel_installed,cancel_update_preview] + + browser = [ver_search,save_all_tags,load_installed,update_preview] + + browser_installed_load = [cancel_installed,load_to_browser_installed,installed_progress] + browser_load = [cancel_ver_search,load_to_browser,version_progress] + + browser_installed_list = page_outputs + browser + browser_installed_load + browser_list = page_outputs + browser + browser_load + + # Page Button Functions # + + page_btn_list = { + refresh.click: _api.update_model_list, + search_term.submit: _api.update_model_list, + get_next_page.click: _api.update_next_page, + get_prev_page.click: _api.update_prev_page + } + + for trigger, function in page_btn_list.items(): + trigger(fn=function, inputs=page_inputs, outputs=page_outputs) + trigger(fn=None, _js="() => multi_model_select()") + + for button in cancel_btn_list: + button.click(fn=_file.cancel_scan) + + # Update model Functions # + + ver_search.click( + fn=_file.ver_search_start, + inputs=[ver_start], + outputs=[ + ver_start, + ver_search, + cancel_ver_search, + load_installed, + save_all_tags, + update_preview, + version_progress + ] + ) + + ver_start.change( + fn=_file.file_scan, + inputs=file_scan_inputs, + outputs=[ + version_progress, + ver_finish + ] + ) + + ver_finish.change( + fn=_file.scan_finish, + outputs=[ + ver_search, + save_all_tags, + load_installed, + update_preview, + cancel_ver_search, + load_to_browser + ] + ) + + load_installed.click( + fn=_file.installed_models_start, + inputs=[installed_start], + outputs=[ + installed_start, + load_installed, + cancel_installed, + ver_search, + save_all_tags, + update_preview, + installed_progress + ] + ) + + installed_start.change( + fn=_file.file_scan, + inputs=file_scan_inputs, + outputs=[ + installed_progress, + installed_finish + ] + ) + + installed_finish.change( + fn=_file.scan_finish, + outputs=[ + ver_search, + save_all_tags, + load_installed, + update_preview, + cancel_installed, + load_to_browser_installed + ] + ) + + save_all_tags.click( + fn=_file.save_tag_start, + inputs=[tag_start], + outputs=[ + tag_start, + save_all_tags, + cancel_all_tags, + load_installed, + ver_search, + update_preview, + tag_progress + ] + ) + + tag_start.change( + fn=_file.file_scan, + inputs=file_scan_inputs, + outputs=[ + tag_progress, + tag_finish + ] + ) + + tag_finish.change( + fn=_file.save_tag_finish, + outputs=[ + ver_search, + save_all_tags, + load_installed, + update_preview, + cancel_all_tags + ] + ) + + update_preview.click( + fn=_file.save_preview_start, + inputs=[preview_start], + outputs=[ + preview_start, + update_preview, + cancel_update_preview, + load_installed, + ver_search, + save_all_tags, + preview_progress + ] + ) + + preview_start.change( + fn=_file.file_scan, + inputs=file_scan_inputs, + outputs=[ + preview_progress, + preview_finish + ] + ) + + preview_finish.change( + fn=_file.save_preview_finish, + outputs=[ + ver_search, + save_all_tags, + load_installed, + update_preview, + cancel_update_preview + ] + ) + + load_to_browser_installed.click( + fn=_file.load_to_browser, + inputs=load_to_browser_inputs, + outputs=browser_installed_list + ) + + load_to_browser.click( + fn=_file.load_to_browser, + inputs=load_to_browser_inputs, + outputs=browser_list + ) + + if ver_bool: + tab_name = "CivitAI Browser+" + else: + tab_name = "Civitai Browser+" + + return (civitai_interface, tab_name, "civitai_interface"), + +def subfolder_list(folder, desc=None): + insert_sub_1 = getattr(opts, "insert_sub_1", False) + insert_sub_2 = getattr(opts, "insert_sub_2", False) + insert_sub_3 = getattr(opts, "insert_sub_3", False) + insert_sub_4 = getattr(opts, "insert_sub_4", False) + insert_sub_5 = getattr(opts, "insert_sub_5", False) + insert_sub_6 = getattr(opts, "insert_sub_6", False) + insert_sub_7 = getattr(opts, "insert_sub_7", False) + insert_sub_8 = getattr(opts, "insert_sub_8", False) + insert_sub_9 = getattr(opts, "insert_sub_9", False) + insert_sub_10 = getattr(opts, "insert_sub_10", False) + insert_sub_11 = getattr(opts, "insert_sub_11", False) + insert_sub_12 = getattr(opts, "insert_sub_12", False) + insert_sub_13 = getattr(opts, "insert_sub_13", False) + insert_sub_14 = getattr(opts, "insert_sub_14", False) + dot_subfolders = getattr(opts, "dot_subfolders", True) + + if folder == None: + return + try: + model_folder = _api.contenttype_folder(folder, desc) + sub_folders = ["None"] + for root, dirs, _ in os.walk(model_folder, followlinks=True): + if dot_subfolders: + dirs = [d for d in dirs if not d.startswith('.')] + dirs = [d for d in dirs if not any(part.startswith('.') for part in os.path.join(root, d).split(os.sep))] + for d in dirs: + sub_folder = os.path.relpath(os.path.join(root, d), model_folder) + if sub_folder: + sub_folders.append(f'{os.sep}{sub_folder}') + + sub_folders.remove("None") + sub_folders = sorted(sub_folders, key=lambda x: (x.lower(), x)) + sub_folders.insert(0, "None") + if insert_sub_1: + sub_folders.insert(1, f"{os.sep}Base model") + if insert_sub_2: + sub_folders.insert(2, f"{os.sep}Base model{os.sep}Author name") + if insert_sub_3: + sub_folders.insert(3, f"{os.sep}Base model{os.sep}Author name{os.sep}Model name") + if insert_sub_4: + sub_folders.insert(4, f"{os.sep}Base model{os.sep}Author name{os.sep}Model name{os.sep}Model version") + if insert_sub_5: + sub_folders.insert(5, f"{os.sep}Base model{os.sep}Model name") + if insert_sub_6: + sub_folders.insert(6, f"{os.sep}Base model{os.sep}Model name{os.sep}Model version") + if insert_sub_7: + sub_folders.insert(7, f"{os.sep}Author name") + if insert_sub_8: + sub_folders.insert(8, f"{os.sep}Author name{os.sep}Base model") + if insert_sub_9: + sub_folders.insert(9, f"{os.sep}Author name{os.sep}Base model{os.sep}Model name") + if insert_sub_10: + sub_folders.insert(10, f"{os.sep}Author name{os.sep}Base model{os.sep}Model name{os.sep}Model version") + if insert_sub_11: + sub_folders.insert(11, f"{os.sep}Author name{os.sep}Model name") + if insert_sub_12: + sub_folders.insert(12, f"{os.sep}Author name{os.sep}Model name{os.sep}Model version") + if insert_sub_13: + sub_folders.insert(13, f"{os.sep}Model name") + if insert_sub_14: + sub_folders.insert(14, f"{os.sep}Model name{os.sep}Model version") + + list = set() + sub_folders = [x for x in sub_folders if not (x in list or list.add(x))] + except: + return None + return sub_folders + +def make_lambda(folder, desc): + return lambda: {"choices": subfolder_list(folder, desc)} + +def on_ui_settings(): + if ver_bool: + browser = ("civitai_browser", "Browser") + download = ("civitai_browser_download", "Downloads") + from modules.options import categories + categories.register_category("civitai_browser_plus", "CivitAI Browser+") + cat_id = "civitai_browser_plus" + else: + section = ("civitai_browser_plus", "CivitAI Browser+") + browser = download = section + if not (hasattr(shared.OptionInfo, "info") and callable(getattr(shared.OptionInfo, "info"))): + def info(self, info): + self.label += f" ({info})" + return self + shared.OptionInfo.info = info + + # Download Options + shared.opts.add_option( + "use_aria2", + shared.OptionInfo( + True, + "Download models using Aria2", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Disable this option if you're experiencing any issues with downloads or if you want to use a proxy.") + ) + + shared.opts.add_option( + "disable_dns", + shared.OptionInfo( + False, + "Disable Async DNS for Aria2", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Useful for users who use PortMaster or other software that controls the DNS") + ) + + shared.opts.add_option( + "show_log", + shared.OptionInfo( + False, + "Show Aria2 logs in console", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Requires UI reload") + ) + + shared.opts.add_option( + "split_aria2", + shared.OptionInfo( + 64, + "Number of connections to use for downloading a model", + gr.Slider, + lambda: {"maximum": "64", "minimum": "1", "step": "1"}, + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Only applies to Aria2") + ) + + shared.opts.add_option( + "aria2_flags", + shared.OptionInfo( + r"", + "Custom Aria2 command line flags", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Requires UI reload") + ) + + shared.opts.add_option( + "unpack_zip", + shared.OptionInfo( + False, + "Automatically unpack .zip files after downloading", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ) + ) + + shared.opts.add_option( + "save_api_info", + shared.OptionInfo( + False, + "Save API info of model when saving model info", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("creates an api_info.json file when saving any model info with all the API data of the model") + ) + + shared.opts.add_option( + "auto_save_all_img", + shared.OptionInfo( + False, + "Automatically save all images", + section=download, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Automatically saves all the images of a model after downloading") + ) + + # Browser Options + shared.opts.add_option( + "custom_api_key", + shared.OptionInfo( + r"", + "Personal CivitAI API key", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("You can create your own API key in your CivitAI account settings, this required for some downloads, Requires UI reload") + ) + + shared.opts.add_option( + "hide_early_access", + shared.OptionInfo( + True, + "Hide early access models", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Early access models are only downloadable for supporter tier members") + ) + + shared.opts.add_option( + "use_LORA", + shared.OptionInfo( + ver_bool, + "Treat LoCon's as LORA's", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("SD-WebUI v1.5 and higher treats LoCON's the same as LORA's, Requires UI reload") + ) + + shared.opts.add_option( + "dot_subfolders", + shared.OptionInfo( + True, + "Hide sub-folders that start with a '.'", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ) + ) + + shared.opts.add_option( + "use_local_html", + shared.OptionInfo( + False, + "Use local HTML file for model info", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Uses the matching local HTML file when pressing CivitAI button on model cards in txt2img and img2img") + ) + + shared.opts.add_option( + "local_path_in_html", + shared.OptionInfo( + False, + "Use local images in the HTML", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Only works if all images of the corresponding model are downloaded") + ) + + shared.opts.add_option( + "page_header", + shared.OptionInfo( + False, + "Page navigation as header", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Keeps the page navigation always visible at the top, Requires UI reload") + ) + + shared.opts.add_option( + "video_playback", + shared.OptionInfo( + True, + 'Gif/video playback in the browser', + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Disable this option if you're experiencing high CPU usage during video/gif playback") + ) + + shared.opts.add_option( + "individual_meta_btn", + shared.OptionInfo( + True, + 'Individual prompt buttons', + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Turns individual prompts from an example image into a button to send it to txt2img") + ) + + shared.opts.add_option( + "model_desc_to_json", + shared.OptionInfo( + True, + 'Save model description to json', + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info('This saves the models description to the description field on model cards') + ) + + shared.opts.add_option( + "image_location", + shared.OptionInfo( + r"", + "Custom save images location", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Overrides the download folder location when saving images.") + ) + + shared.opts.add_option( + "sub_image_location", + shared.OptionInfo( + True, + 'Use sub folders inside custom images location', + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Will append any content type and sub folders to the custom path.") + ) + + shared.opts.add_option( + "save_to_custom", + shared.OptionInfo( + False, + "Store the HTML and api_info in the custom images location", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ) + ) + + shared.opts.add_option( + "custom_civitai_proxy", + shared.OptionInfo( + r"", + "Proxy address", + gr.Textbox, + {"placeholder": "socks4://0.0.0.0:00000 | socks5://0.0.0.0:00000"}, + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Only works with proxies that support HTTPS, turn Aria2 off for proxy downloads") + ) + + shared.opts.add_option( + "cabundle_path_proxy", + shared.OptionInfo( + r"", + "Path to custom CA Bundle", + gr.Textbox, + {"placeholder": "/path/to/custom/cabundle.pem"}, + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Specify custom CA bundle for SSL certificate checks if required") + ) + + shared.opts.add_option( + "disable_sll_proxy", + shared.OptionInfo( + False, + "Disable SSL certificate checks", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ).info("Not recommended for security, may be required if you do not have the correct CA Bundle available") + ) + + id_and_sub_options = { + "1" : f"{os.sep}Base model", + "2" : f"{os.sep}Base model{os.sep}Author name", + "3" : f"{os.sep}Base model{os.sep}Author name{os.sep}Model name", + "4" : f"{os.sep}Base model{os.sep}Author name{os.sep}Model name{os.sep}Model version", + "5" : f"{os.sep}Base model{os.sep}Model name", + "6" : f"{os.sep}Base model{os.sep}Model name{os.sep}Model version", + "7" : f"{os.sep}Author name", + "8" : f"{os.sep}Author name{os.sep}Base model", + "9" : f"{os.sep}Author name{os.sep}Base model{os.sep}Model name", + "10" : f"{os.sep}Author name{os.sep}Base model{os.sep}Model name{os.sep}Model version", + "11" : f"{os.sep}Author name{os.sep}Model name", + "12" : f"{os.sep}Author name{os.sep}Model name{os.sep}Model version", + "13" : f"{os.sep}Model name", + "14" : f"{os.sep}Model name{os.sep}Model version", + } + + for number, string in id_and_sub_options.items(): + shared.opts.add_option( + f"insert_sub_{number}", + shared.OptionInfo( + False, + f"Insert: [{string}]", + section=browser, + **({'category_id': cat_id} if ver_bool else {}) + ) + ) + + use_LORA = getattr(opts, "use_LORA", False) + + # Default sub folders + folders = [ + "Checkpoint", + "LORA & LoCon" if use_LORA else "LORA", + "LoCon" if not use_LORA else None, + "TextualInversion", + "Poses", + "Controlnet", + "Hypernetwork", + "MotionModule", + ("Upscaler", "SWINIR"), + ("Upscaler", "REALESRGAN"), + ("Upscaler", "GFPGAN"), + ("Upscaler", "BSRGAN"), + ("Upscaler", "ESRGAN"), + "VAE", + "AestheticGradient", + "Wildcards", + "Workflows", + "Other" + ] + + for folder in folders: + if folder == None: + continue + desc = None + if isinstance(folder, tuple): + folder_name = " - ".join(folder) + setting_name = f"{folder[1]}_upscale" + folder = folder[0] + desc = folder[1] + else: + folder_name = folder + setting_name = folder + if folder == "LORA & LoCon": + folder = "LORA" + setting_name = "LORA_LoCon" + + shared.opts.add_option(f"{setting_name}_subfolder", shared.OptionInfo("None", folder_name, gr.Dropdown, make_lambda(folder, desc), section=download, **({'category_id': cat_id} if ver_bool else {}))) + +script_callbacks.on_ui_tabs(on_ui_tabs) +script_callbacks.on_ui_settings(on_ui_settings) \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/style.css b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/style.css new file mode 100644 index 0000000000000000000000000000000000000000..5410267facf9a3bc051025f51ba8f260fb4cce3a --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/style.css @@ -0,0 +1,783 @@ +/* Card list HTML */ +.civmodellist { + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.civmodellist figure { + margin: 6px; + transition: transform .3s ease-out, box-shadow 0.3s ease; + cursor: pointer; + border-radius: 10px; +} + +.civmodelcard { + position: relative; +} + +.civmodelcard:hover { + transform: scale(1.1, 1.1); + position: relative; + z-index: var(--layer-5); + box-shadow: 0px 0px 1px 3px whitesmoke; +} + +.civmodelcardinstalled { + box-shadow: 0px 0px 1px 3px aquamarine; +} + +.civmodelcardoutdated { + box-shadow: 0px 0px 1px 3px orange; +} + +.civmodelcard:hover figcaption{ + bottom: initial; + background-color: rgba(32, 32, 32, 0.9); +} + +.civmodelcard img, .civmodelcard .video-bg { + width: 8em; + height: 12em; + object-fit: cover; + border-radius: 10px; +} + +.civmodelcard figcaption { + position: absolute; + bottom: 5px; + text-align: center; + width: 8em; + word-break: break-word; + background-color: rgba(32, 32, 32, 0.5); + color: white !important; +} + +/* End of Card list HTML */ + +#quicksettings > div{ + max-width: None !important; + width: auto !important; +} + +#togglesL{ + margin-top: 3px; +} + +#toggles{ + margin-top: -10px; +} + +#searchType > div { + gap: 0.5em; +} + +#backToTopContainer { + position: fixed; + bottom: 0; + right: 0; + display: flex; + justify-content: flex-end; + z-index: 150; + pointer-events: none; + margin: 20px 51px 20px 20px; +} + +#backToTop { + margin: 0; + max-width: 60px; + min-width: unset; + z-index: 200; + pointer-events: auto; +} + +#browserTab { + position: relative; +} + +#browserTab > div { + gap: var(--layout-gap) !important; +} + +#browserTab > div > #header { + position: -webkit-sticky; + position: sticky; + top: 0; + background-color: var(--neutral-950); + z-index: 60; +} + +.acss-14flpmm .gap:has(#quicksettings):first-child { + gap: var(--layout-gap); +} + +#txt2img_seed > label > input{ + height: unset !important; +} + +#browserTab > div > #header, #browserTab > div > #header_off { + display: flex; + flex-direction: column; + padding-top: 15px; + margin-top: -15px; +} + +#toggle1, #toggle2, #toggle3, #toggle4, #toggle4_api, #toggle5{ + margin-top: 5px; + margin-right: 0px; + margin-left: 0px; + display: flex; + justify-content: center; +} + +#civitai_update_toggles > div { + display: flex; + flex-direction: column; +} + +#civitai_update_toggles { + margin-top: calc(-1 * var(--layout-gap)); + margin-bottom: var(--layout-gap); +} + +#toggle1L, #toggle2L, #toggle3L, #toggle4L, #toggle4L_api, #toggle5L, +#overwrite_toggle, #skip_hash_toggle, #do_html_gen { + display: flex; + justify-content: center; +} + +#centerText, #searchType { + text-align: center; +} + +#browserTab { + min-height: 650px; +} + +#download_all_button { + max-height: 40px; + height: 40px; + align-self: end; + margin-bottom: 1px; +} + +#searchBox > label > textarea { + padding-top: 11px !important; +} + +#searchBox { + max-width: 800px; + align-self: center; +} + +#baseMdl { + min-width: 100px !important; + max-width: 100px !important; +} + +#spanWidth { + display: flex !important; + flex-direction: row; +} + +#spanWidth > div { + flex-wrap: nowrap; +} + +.gradio-container-3-32-0 .prose :last-child { + margin-bottom: auto !important; +} + +.date-section { + display: block; + width: 100%; + margin-bottom: 5px; + text-align: center; +} + +.card-row { + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +#selected_tags { + text-align: center; +} + +#pageBtn1, #pageBtn2 { + max-width: 120px !important; + min-width: 50px !important; +} + +#pageSlider { + max-height: 44px; +} + +#pageSlider > div:nth-child(2) { + max-height: 25px; +} + +#pageBoxMobile { + display: flex; + justify-content: space-between; +} + +#pageBox { + display: flex; + justify-content: center; + align-self: center; + max-width: 950px !important; +} + +#pageBox > div:first-child { + align-items: end; +} + +#refreshBtn, #refreshBtnL { + align-self: end; + height: 42px !important; + min-height: 42px !important; + max-height: 42px !important; + max-width: 42px !important; + min-width: 42px !important; + width: 42px !important; + padding: 0px !important; +} + +#refreshBtn > img, +#refreshBtnL > img { + margin: unset; +} + +#searchRow { + max-width: 800px; + align-self: center; +} + +#save_set_box { + display: flex; + justify-content: center; +} + +#save_set_btn { + max-width: 220px !important; + min-width: 220px !important; + margin-bottom: -6px; + padding: 5px; + height: unset !important; + min-height: 35px !important; +} + +#searchType > div:nth-child(3) { + justify-content: center; +} + +.custom-checkbox { + position: absolute; + top: 10px; + right: 10px; + width: 20px; + min-width: 20px; + height: 20px; + background: #111B; + border-radius: var(--checkbox-border-radius); + border: 1px solid #bbbbbb; + cursor: pointer; +} + +.custom-checkbox:hover { + border-color: #ffffff; +} + +.model-checkbox:checked + .custom-checkbox { + background-color: var(--checkbox-background-color-selected); + border-color: var(--checkbox-border-color-selected); + background-image: var(--checkbox-check); + background-size: contain; + background-position: center; + background-repeat: no-repeat; +} + +.open-in-civitai { + font-size: 18pt; + color: var(--body-text-color); + display: flex; + justify-content: center; + margin-top: -12px; +} + +#model_header:hover{ + color: var(--link-text-color-hover); +} + +.civitai-txt2img-btn:hover { + border-color: var(--button-secondary-border-color-hover); + background: var(--button-secondary-background-fill-hover); + color: var(--button-secondary-text-color-hover); +} + +.civitai-txt2img-btn { + border-radius: var(--button-large-radius); + border: var(--button-border-width) solid var(--button-secondary-border-color); + padding: var(--button-large-padding); + font-weight: var(--button-large-text-weight); + font-size: var(--button-large-text-size); + background: var(--button-secondary-background-fill); + color: var(--button-secondary-text-color); +} + +.civitai-tags-container { + display: flex; + flex-wrap: wrap; + gap: 5px; +} + +.civitai-tag, +.civitai-meta, +.civitai-meta-btn { + background-color: var(--neutral-800); + border-radius: 8px; + padding: 4px 6px; + border: 1px solid var(--input-border-color); +} + +.civitai-meta-btn:hover { + cursor: pointer; + background-color: var(--neutral-700); +} + +#select_all_models_container { + display: flex; + justify-content: flex-end; +} + +#select_all_models { + max-width: 100px; + min-width: 100px; + min-height: 30px; + padding: 0px; + margin-top: -25px; +} + +.civitai_dl_item, +.civitai_dl_item_completed, +.civitai_dl_item_failed { + background-color: var(--error-background-fill); + border-radius: 8px; + padding: 5px 0px; + border: 1px solid var(--input-border-color); + margin: 10px 0px; +} + +.civitai_dl_item_failed > .dl_stat > .dl_progress_bar { + background-color: transparent !important; + padding: 0px 0px 2px 0px !important; +} + +.dl_progress_bar { + background-color: var(--button-primary-border-color); + color: var(--body-text-color); + padding: 0px 0px 2px 5px; + border-radius: 8px; + transition: width 0.5s ease-in-out; +} + +.dl_progress_bar::before, +.dl_progress_bar::after { + content: ""; + display: table; + clear: both; +} + +.civitai-btn-text:hover { + color: var(--link-text-color-hover); + cursor: pointer; +} +/* Customized Accordion Filter */ + +#filterBox, +#filterBoxL { + align-self: end; + height: 42px; + max-width: 42px; + padding: unset !important; + margin: 0px !important; + display: flex; + justify-content: center; +} + +#filterBox { + background: var(--button-secondary-background-fill); +} + +#filterBoxL { + background: var(--input-background-fill); +} + +#filterBox:hover, +#filterBoxL:hover { + background: var(--button-secondary-background-fill-hover); +} + +#filterBox .label-wrap.open, +#filterBoxL .label-wrap.open{ + border-bottom: unset !important; + background: var(--button-secondary-background-fill-hover); + border-radius: 7px !important; + height: 40px; +} + +#filterBox > div:nth-child(3), +#filterBoxL > div:nth-child(3) { + padding: 20px; + position: absolute; + border-radius: 10px; + width: 300px; + z-index: 100 !important; + margin-top: 55px; +} + +.browser_tooltip { + box-shadow: var(--body-text-color) 0px 0px 2px 0px; + background: var(--background-fill-primary); + color: var(--body-text-color); + border-radius: 3px; + padding: 10px; + position: absolute; + z-index: 50; + margin-top: 30px; +} + +#toggle4 > label > span, #toggle4L > label > span { + color: var(--neutral-400); +} + +#filterBox > div:nth-child(3), #toggle4 > div:nth-child(3) { + background: var(--background-fill-primary); +} + +#filterBoxL > div:nth-child(3), #toggle4L > div:nth-child(3) { + background: var(--neutral-950); +} + +#filterBox > div:nth-child(2), +#filterBoxL > div:nth-child(2) { + padding: 10px !important; +} + +#filterBox .gradio-slider input[type="number"], +#filterBoxL .gradio-slider input[type="number"] { + width: 70px !important; +} + +#pageBox .gradio-slider input[type="number"] { + width: 5em !important; +} + +#filterBox > div:nth-child(2) > span:nth-child(1), +#filterBoxL > div:nth-child(2) > span:nth-child(1) { + display: none; +} + +#filterBox > div:nth-child(2) > span:nth-child(2), +#filterBoxL > div:nth-child(2) > span:nth-child(2) { + transform: rotate(0deg) !important; + transition: 0s !important; + display: inline-block; + width: 24px; + height: 24px; + font-size: 0; + color: transparent; + overflow: hidden; +} + +#filterBox > div:nth-child(2) > span:nth-child(2)::before, +#filterBoxL > div:nth-child(2) > span:nth-child(2)::before { + content: ""; + display: block; + width: 100%; + height: 100%; +} + +/* End of Custom Accordion */ + +.card-button { + width: 42px !important; +} + +.edit-button.card-button::before { + font-size: 90%; + vertical-align: top; +} + +.copy-path-button.card-button::before { + font-size: 110%; +} + +.copy-path-button.card-button { + margin-top: -4px; +} + +.goto-civitbrowser.card-button { + filter: drop-shadow(2px 2px 3px black); + display: flex; + align-items: center; +} + +.goto-civitbrowser.card-button:hover svg { + fill: red !important; +} + +/* Custom settings Accordion */ +#settings-accordion { + border: 1px solid var(--block-border-color); + border-radius: 8px; + margin: 15px 0px 2px 0px; + padding: 8px 8px; +} + +#accordionToggle { + width: 100%; + display: flex; + font-size: 12pt; + justify-content: space-between; +} + +#selected_tags > div { + justify-content: center; + padding-top: 10px; + padding-bottom: 20px; +} + +#civitai_preview_html .model-block { + box-shadow: 0px 0px 1px 3px #3339ff30; + border-radius: 10px; + padding: 1px 20px 10px; + margin-bottom: 20px; +} + +#civitai_preview_html .model-block code { + white-space: pre-wrap; +} + +#civitai_preview_html .model-block dl { + overflow-wrap: anywhere; +} + +#civitai_preview_html .sampleimgs .model-block img, +#civitai_preview_html .sampleimgs .model-block video { + padding-top: 1em; + max-width: 20em; + cursor: zoom-in; + transition: max-width 0.1s; +} + +/* Preview Image zoom */ +#civitai_preview_html .zoom-radio { + display: none!important; +} + +/* Style for when the image is clicked (radio button checked) */ +#civitai_preview_html .zoom-radio:checked + label > img, +#civitai_preview_html .zoom-radio:checked + label > video { + max-width: 95vw; + max-height: 95vh; + padding-top: 0px; + cursor: zoom-out; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 1000; /* Higher than the overlay */ + pointer-events: none; /* Allow clicks to penetrate through to the overlay for resetting */ +} + +/* Overlay for resetting zoomed state */ +#civitai_preview_html .zoom-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, .5); + z-index: 999; /* Below the zoomed image */ + cursor: zoom-out; +} + +#civitai_preview_html .zoom-radio:checked + label + .zoom-overlay { + display: block; + pointer-events: all; /* Capture click events when displayed */ +} + +#civitai_preview_html .zoom-img-container { + min-width: 20em; +} + +#civitai_preview_html .model-uploader { + border-bottom: 1px solid; + padding-bottom: 10px; + } + +#civitai_preview_html .model-description { + border-top: 1px solid; + overflow-wrap: break-word; + overflow: hidden; + position: relative; + max-height: 400px; +} + +#civitai_preview_html .model-description::after { + content: ""; + position: absolute; + bottom: 0; + width: 100%; + height: 75px; + background: linear-gradient(to bottom, rgb(255 255 255 / 0%), var(--background-fill-primary)); + z-index: 1; +} + +.description-toggle-label { + cursor: pointer; +} + +.description-toggle-checkbox { + position: absolute; + opacity: 0; + z-index: -1; +} + +.description-toggle-checkbox:checked + .model-description { + max-height: unset !important; + position: unset !important; +} + +.model-description + .description-toggle-label::before { + content: "โฏ"; + width: 1em; + height: 1em; + text-align: center; + transition: all 0.3s; +} + +.model-description + .description-toggle-label { + display: flex; + padding: 10px 0px; + font-weight: bold; + cursor: pointer; + font-size: large; +} + +.description-toggle-checkbox:checked + .model-description + .description-toggle-label::before { + transform: rotate(-90deg); + margin-right: 10px; +} + +.description-toggle-checkbox:checked + .model-description + .description-toggle-label::after { + content: "Show Less..."; +} + +.description-toggle-checkbox:not(:checked) + .model-description + .description-toggle-label::after { + content: "Show All..."; +} +/*------------------------------------------*/ +/*End CSS accordion for toggling description*/ + +/*Avatar CSS mostly copied from CivitAI, but 48px instead of 32px*/ +#civitai_preview_html .avatar { + user-select: none; + overflow: hidden; + width: 48px; + height: 48px; + min-width: 48px; + border-radius: 48px; + text-decoration: none; + border: 0; + padding: 0; + background-color: rgba(0,0,0,0.31); + display: inline-block!important; + margin-left: 5px!important; + vertical-align: middle; +} + +#civitai_preview_html .avatar img { + object-fit: cover; + width: 100%; + height: 100%; + display: block; + overflow-clip-margin: content-box; + overflow: clip; + border-style: none; +} + +#civitai_preview_html dt { + font-size: medium; + color: #80a6c8!important; +} + +#civitai_preview_html dd { + padding: 0px 0px 10px 10px; +} + +/*CSS accordion for toggling extra metadata*/ +/*-----------------------------------------*/ +#civitai_preview_html .accordionCheckbox { + position: absolute; + opacity: 0; + z-index: -1; +} + +#civitai_preview_html .tabs { + border-radius: 10px; + overflow: hidden; +} + +#civitai_preview_html .tab { + width: 100%; + color: white; + overflow: hidden; + margin-left: -15px; +} + +#civitai_preview_html .tab-label { + display: flex; + padding: 1em; + font-weight: bold; + cursor: pointer; + font-size: large; +} + +/* Icon */ +#civitai_preview_html .tab-label::before { + content: "โฏ"; + width: 1em; + height: 1em; + text-align: center; + transition: all 0.3s; +} + +#civitai_preview_html .accordionCheckbox:checked + .tab-label::before { + transform: rotate(90deg); +} + +#civitai_preview_html .tab-content { + max-height: 0; + padding: 0 1em; + transition: all 0.3s; +} + +#civitai_preview_html .tab-close { + display: flex; + justify-content: flex-end; + padding: 1em; + font-size: 0.75em; + cursor: pointer; +} + +#civitai_preview_html .accordionCheckbox:checked ~ .tab-content { + max-height: unset; + padding: 1em; +} +/*-----------------------------------------*/ +/*End CSS accordion for toggling extra metadata*/ \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-civitai-browser-plus/style_html.css b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/style_html.css new file mode 100644 index 0000000000000000000000000000000000000000..59a5af188bd26fd5088990eb8fc0988692d480ca --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-civitai-browser-plus/style_html.css @@ -0,0 +1,303 @@ +body { + background-color: #0b0f19; +} + +.model-block { + box-shadow: 0px 0px 1px 3px #3339ff30; + border-radius: 10px; + padding: 1px 20px 10px; + margin-bottom: 20px; +} + +.model-block code { + white-space: pre-wrap; +} + +.model-block dl { + overflow-wrap: anywhere; +} + +.civnsfw img { + filter: unset; +} + +.sampleimgs .model-block img, +.sampleimgs .model-block video { + padding-top: 1em; + max-width: 20em; + cursor: zoom-in; + transition: max-width 0.1s; +} + +/* Text adjustments */ +h1, h2, h3, h4, h5, dd, dt, p, a, label { + font-family: 'Source Sans Pro', 'ui-sans-serif', 'system-ui', sans-serif; +} + +h3 { + font-size: 16px; +} + +h2 { + margin: 16px 0px 8px; + font-size: 22px; +} + +ul { + padding-left: 18px; +} + +p { + color: #F3F4F6; + margin: 0px 0px 6px; + font-size: 14px; +} + +dt { + font-size: medium; + color: #80a6c8 !important; + font-size: 16px; +} + +dd { + padding: 0px 0px 5px 10px; + margin-inline-start: 0px; + font-size: 14px; + color: #F3F4F6; +} + +a { + color: #F3F4F6; + font-weight: bold; + text-decoration: unset; +} + +a:hover { + color: #60A5FA; +} + +.civitai_txt2img { + display: none; +} + +/* Preview Image zoom */ +.zoom-radio { + display: none !important; +} + +/* Style for when the image is clicked (radio button checked) */ +.zoom-radio:checked + label > img, +.zoom-radio:checked + label > video { + max-width: 95vw; + max-height: 95vh; + padding-top: 0px; + cursor: zoom-out; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 1000; /* Higher than the overlay */ + pointer-events: none; /* Allow clicks to penetrate through to the overlay for resetting */ +} + +/* Overlay for resetting zoomed state */ +.zoom-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, .5); + z-index: 999; /* Below the zoomed image */ + cursor: zoom-out; +} + +.zoom-radio:checked + label + .zoom-overlay { + display: block; + pointer-events: all; /* Capture click events when displayed */ +} + +.zoom-img-container { + min-width: 20em; +} + +.model-uploader { + border-bottom: 1px solid; + padding-bottom: 10px; + color: white; + } + +.model-description { + border-top: 1px solid; + padding-bottom: 10px; + margin-bottom: 10px; + color: white; + } + +/*Avatar CSS mostly copied from CivitAI, but 48px instead of 32px*/ +.avatar { + user-select: none; + overflow: hidden; + width: 48px; + height: 48px; + min-width: 48px; + border-radius: 48px; + text-decoration: none; + border: 0; + padding: 0; + background-color: rgba(0,0,0,0.31); + display: inline-block!important; + margin-left: 5px!important; + vertical-align: middle; +} + +.avatar img { + object-fit: cover; + width: 100%; + height: 100%; + display: block; + overflow-clip-margin: content-box; + overflow: clip; + border-style: none; +} + +.model-description { + border-top: 1px solid; + overflow-wrap: break-word; + overflow: hidden; + position: relative; + max-height: 400px; +} + +.model-description::after { + content: ""; + position: absolute; + bottom: 0; + width: 100%; + height: 75px; + background: linear-gradient(to bottom, rgb(255 255 255 / 0%), #0b0f19); + z-index: 1; +} + +.description-toggle-label { + display: flex; + padding: 10px 0px 0px 0px; + font-weight: bold; + cursor: pointer; + font-size: large; + color: white; +} + +.description-toggle-checkbox { + position: absolute; + opacity: 0; + z-index: -1; +} + +.description-toggle-checkbox:checked + .model-description { + max-height: none !important; + position: unset !important; +} + +.model-description + .description-toggle-label::before { + content: "โฏ"; + width: 1em; + height: 1em; + text-align: center; + transition: all 0.3s; +} + +.description-toggle-checkbox:checked + .model-description + .description-toggle-label::before { + transform: rotate(-90deg); + margin-right: 10px; +} + +.description-toggle-checkbox:checked + .model-description + .description-toggle-label::after { + content: "Show Less..."; +} + +.description-toggle-checkbox:not(:checked) + .model-description + .description-toggle-label::after { + content: "Show All..."; +} + +/*CSS accordion for toggling extra metadata*/ +/*-----------------------------------------*/ +.accordionCheckbox { + position: absolute; + opacity: 0; + z-index: -1; +} + +.tabs { + border-radius: 10px; + overflow: hidden; +} + +.tab { + width: 100%; + color: white; + overflow: hidden; + margin-left: -15px; +} + +.tab-label { + display: flex; + padding: 1em; + font-weight: bold; + cursor: pointer; + font-size: large; +} + +.civitai-tags-container { + display: flex; + flex-wrap: wrap; + gap: 5px; +} + +.civitai-tag, +.civitai-meta-btn { + background-color: #111827; + border-radius: 8px; + padding: 4px 6px; + border: 1px solid #374151; +} + +.civitai-meta-btn:hover { + cursor: pointer; + background-color: #1F2937; +} + +/* Icon */ +.tab-label::before { + content: "โฏ"; + width: 1em; + height: 1em; + text-align: center; + transition: all 0.3s; +} + +.accordionCheckbox:checked + .tab-label::before { + transform: rotate(90deg); +} + +.tab-content { + max-height: 0; + padding: 0 1em; + transition: all 0.3s; +} + +.tab-close { + display: flex; + justify-content: flex-end; + padding: 1em; + font-size: 0.75em; + cursor: pointer; +} + +.accordionCheckbox:checked ~ .tab-content { + max-height: 100vh; + padding: 1em; +} +/*-----------------------------------------*/ +/*End CSS accordion for toggling extra metadata*/ \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/bug_report.yml b/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000000000000000000000000000000000..4b2908a1a2176a87dc5a5001d3222585d36e46b6 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,58 @@ +name: Bug Report +description: You think somethings is broken +labels: ["bug", "new"] + +body: + - type: checkboxes + attributes: + label: First, confirm + description: Make sure you use the latest version of the ReActor extension and you have already searched to see if an issue already exists for the bug you encountered before you create a new Issue. + options: + - label: I have read the [instruction](https://github.com/Gourieff/sd-webui-reactor/blob/main/README.md) carefully + required: true + - label: I have searched the existing issues + required: true + - label: I have updated the extension to the latest version + required: true + - type: markdown + attributes: + value: | + *Please fill this form with as much information as possible and *provide screenshots if possible** + - type: textarea + id: what-did + attributes: + label: What happened? + description: Tell what happened in a very clear and simple way + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce the problem + description: Please provide with precise step by step instructions on how to reproduce the bug + value: | + 1. Go to .... + 2. Press .... + 3. ... + validations: + required: true + - type: textarea + id: sysinfo + attributes: + label: Sysinfo + description: Describe your platform. OS, browser, GPU, what SD WebUI you use, what version and what extensions are also enabled. If you use A1111 you can generate "System info file" (Settings -> Sysinfo) and put it here. + validations: + required: true + - type: textarea + id: logs + attributes: + label: Relevant console log + description: Please provide cmd/terminal logs from the moment you started UI to the momemt you got an error. This will be automatically formatted into code, so no need for backticks. + render: Shell + validations: + required: true + - type: textarea + id: misc + attributes: + label: Additional information + description: Please provide with any relevant additional info or context. diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/config.yml b/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..53d8e3449910aaaf88d08d527a57921a1b10305d --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: ReActor Extension Community Support + url: https://github.com/Gourieff/sd-webui-reactor/discussions + about: Please ask and answer questions here. diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/feature_request.yml b/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000000000000000000000000000000000..674577cf107e708fff09801b5f7efffe47d44d35 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,16 @@ +name: Feature request +description: Suggest an idea for this project +title: "[Feature]: " +labels: ["enhancement", "new"] + +body: + - type: textarea + id: description + attributes: + label: Feature description + description: Describe the feature in a clear and simple way + value: + - type: markdown + attributes: + value: | + The best way to propose an idea is to start a new discussion via the [Discussions](https://github.com/Gourieff/sd-webui-reactor/discussions) section (choose the "Idea" category) diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/.gitignore b/stable-diffusion-webui/extensions/sd-webui-reactor/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2fe2733777ba7af729e8c400a41616c8755b7604 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/.gitignore @@ -0,0 +1,10 @@ +__pycache__/ +*.py[cod] +*$py.class +*.pyc + +.vscode/ + +example +*.txt +!requirements.txt diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/API.md b/stable-diffusion-webui/extensions/sd-webui-reactor/API.md new file mode 100644 index 0000000000000000000000000000000000000000..c58c3372de7546a5bf2c1f0ef5473d5c9347381d --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/API.md @@ -0,0 +1,85 @@ +#
ReActor Extension API
+ +
+ +[Built-in SD WebUI API](#built-in-sd-webui-api) | [External ReActor API](#external-reactor-api) + +--- +
+ +Gourieff's **ReActor** SD WebUI Extension allows to operate via API: both built-in and external (POST and GET requests). + + +## Built-in SD WebUI API + +This API is actual if you use Automatic1111 stable-diffusion-webui. + +First of all - check the [SD Web API Wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/API) for how to use the API. + +* Call `requests.get(url=f'{address}/sdapi/v1/script-info')` to find the args that ReActor needs; +* Define ReActor script args and add like this `"alwayson_scripts": {"reactor":{"args":args}}` in the payload; +* Call the API. + +You can find the [full usage example](./example/api_example.py) with all the available parameters and discriptions in the "example" folder. + +## External ReActor API + +ReActor extension supports for external calls via POST or GET requests while your SD WebUI server is working. + +> :warning: Source and Target images must be "base64". + +Example: + +``` +curl -X POST \ + 'http://127.0.0.1:7860/reactor/image' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "source_image": "data:image/png;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABQAAD/7g...", + "target_image": "data:image/png;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABCAAD/7g...", + "source_faces_index": [0], + "face_index": [0], + "upscaler": "4x_NMKD-Siax_200k", + "scale": 2, + "upscale_visibility": 1, + "face_restorer": "CodeFormer", + "restorer_visibility": 1, + "restore_first": 1, + "model": "inswapper_128.onnx", + "gender_source": 0, + "gender_target": 0, + "save_to_file": 0, + "result_file_path": "", + "device": "CUDA", + "mask_face": 1, + "select_source": 1, + "face_model": "elena.safetensors", + "source_folder": "C:/faces", + "random_image": 1, + "upscale_force": 1 + }' +``` + +* Set `"upscaler"` to `"None"` and `"scale"` to `1` if you don't need to upscale; +* Set `"save_to_file"` to `1` if you need to save result to a file; +* `"result_file_path"` is set to the `"outputs/api"` folder by default (please, create the folder beforehand to avoid any errors) with a timestamped filename; (output_YYYY-MM-DD_hh-mm-ss), you can set any specific path, e.g. `"C:/stable-diffusion-webui/outputs/api/output.png"`; +* Set `"mask_face"` to `1` if you want ReActor to mask the face or to `0` if want ReActor to create a bbox around the face; +* Set `"select_source"` to: 0 - Image, 1 - Face Model, 2 - Source Folder; +* Set `"face_model"` to the face model file you want to choose if you set `"select_source": 1`; +* Set `"source_folder"` to the path with source images (with faces you need as the results) if you set `"select_source": 2`; +* Set `"random_image"` to `1` if want ReActor to choose a random image from the path of `"source_folder"`; +* Set `"upscale_force"` to `1` if you want ReActor to upscale the image even if no face found. + +You can find full usage examples with all the available parameters in the "example" folder: [cURL](./example/api_external.curl), [JSON](./example/api_external.json). + +As a result you recieve a "base64" image: + +``` +{"image":"iVBORw0KGgoAAAANSUhEUgAABlAAAARQCAIAAAAdiYuqAAEAAElEQVR4nOz9+ZMlSXImBn6qau4vIjKzzr5wzwBCDrm/7f+/K7IHV3ZkhUIuyZHlkBhiMGig0Y0..."} +``` + +A list of available models can be seen by GET: +* http://127.0.0.1:7860/reactor/models +* http://127.0.0.1:7860/reactor/upscalers +* http://127.0.0.1:7860/reactor/facemodels diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/LICENSE b/stable-diffusion-webui/extensions/sd-webui-reactor/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..0ad25db4bd1d86c452db3f9602ccdbe172438f52 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/LICENSE @@ -0,0 +1,661 @@ + 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/stable-diffusion-webui/extensions/sd-webui-reactor/README.md b/stable-diffusion-webui/extensions/sd-webui-reactor/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2139b437b26f5a1cc75e061bcc50a93bd10ac7c0 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/README.md @@ -0,0 +1,413 @@ +
+ + logo + + ![Version](https://img.shields.io/badge/version-0.7.0_beta7-green?style=for-the-badge&labelColor=darkgreen) + + + Support Me on Boosty +
+ + Support This Project + +
+ +
+ + [![Commit activity](https://img.shields.io/github/commit-activity/t/Gourieff/sd-webui-reactor/main?cacheSeconds=0)](https://github.com/Gourieff/sd-webui-reactor/commits/main) + ![Last commit](https://img.shields.io/github/last-commit/Gourieff/sd-webui-reactor/main?cacheSeconds=0) + [![Opened issues](https://img.shields.io/github/issues/Gourieff/sd-webui-reactor?color=red)](https://github.com/Gourieff/sd-webui-reactor/issues?cacheSeconds=0) + [![Closed issues](https://img.shields.io/github/issues-closed/Gourieff/sd-webui-reactor?color=green&cacheSeconds=0)](https://github.com/Gourieff/sd-webui-reactor/issues?q=is%3Aissue+is%3Aclosed) + ![License](https://img.shields.io/github/license/Gourieff/sd-webui-reactor) + + English | [ะ ัƒััะบะธะน](/README_RU.md) + +# ReActor for Stable Diffusion + +### The Fast and Simple FaceSwap Extension with a lot of improvements and without NSFW filter (uncensored, use it on your own [responsibility](#disclaimer)) + +--- + + What's new | Installation | Features | Usage | API | Troubleshooting | Updating | ComfyUI | Disclaimer + +
+ +--- + +example + + + +## What's new in the latest updates + +
+ Click to expand + +### 0.7.0 BETA2 + +- X/Y/Z is improved! One more parameter is ready: you can now select several face models to create a variation of swaps to choose the best one! + +0.7.0-whatsnew-05 + +To use "Face Model" axis - you should enable ReActor and choose any face model as the Source:
+0.7.0-whatsnew-070.7.0-whatsnew-06 + +Full size demo image: [xyz_demo_2.png](https://raw.githubusercontent.com/Gourieff/Assets/main/sd-webui-reactor/xyz_demo_2.png) + +### 0.7.0 BETA1 + +- X/Y/Z Script support (up to 3 axes: CodeFormer Weight, Restorer Visibility, Face Mask Correction) + +0.7.0-whatsnew-03 + +0.7.0-whatsnew-04 + +Full size demo image: [xyz_demo.png](https://raw.githubusercontent.com/Gourieff/Assets/main/sd-webui-reactor/xyz_demo.png) + +__Don't forget to enable ReActor and set any source (to prevent "no source" error)__ + +### 0.7.0 ALPHA1 + +- You can now blend faces to build blended face models ("Tools->Face Models->Blend") - due to popular demand + +0.7.0-whatsnew-010.7.0-whatsnew-02 + +- CUDA 12 Support in the Installer script for 1.17.0 ORT-GPU library +- New tab "Detection" with "Threshold" and "Max Faces" parameters + +### 0.6.1 BETA3 + +- 'Force Upscale' option inside the 'Upscale' tab: ReActor will run the Upscaler even if there's no face is detected (FR https://github.com/Gourieff/sd-webui-reactor/issues/116) +- ReActor shows filenames of source images in-process when the multiple images mode or the folder mode (random as well) is selected + +### 0.6.1 BETA2 + +- 'Save original' option works fine now when you select 'Multiple Images' or 'Source Folder' +- Random Mode for 'Source Folder' + +0.6.1-whatsnew-01 + +### 0.6.0 + +- New Logo +- Adaptation to A1111 1.7.0 (appropriate GFPGAN loader) +- New URL for the main model file +- UI reworked +- You can now load several source images (with reference faces) or set the path to the folder containing faces images + +0.6.0-whatsnew-01 + +0.6.0-whatsnew-02 + +### 0.5.1 + +- You can save face models as "safetensors" files (stored in `\models\reactor\faces`) and load them into ReActor, keeping super lightweight face models of the faces you use; +- "Face Mask Correction" option - if you encounter some pixelation around face contours, this option will be useful; + +0.5.0-whatsnew-01 + +
+ +## Installation + +[A1111 WebUI / WebUI-Forge](#a1111) | [SD.Next](#sdnext) | [Google Colab SD WebUI](#colab) + +If you use [AUTOMATIC1111 SD WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui/) or [SD WebUI Forge](https://github.com/lllyasviel/stable-diffusion-webui-forge): + +1. (For Windows Users): + - Install **Visual Studio 2022** (Community version, for example - you need this step to build some of dependencies): + https://visualstudio.microsoft.com/downloads/ + - OR only **VS C++ Build Tools** (if you don't need the whole Visual Studio) and select "Desktop Development with C++" under "Workloads -> Desktop & Mobile": + https://visualstudio.microsoft.com/visual-cpp-build-tools/ + - OR if you don't want to install VS or VS C++ BT - follow [this steps (sec. VIII)](#insightfacebuild) +2. In web-ui, go to the "Extensions" tab, load "Available" extensions and type "ReActor" in the search field or use this URL `https://github.com/Gourieff/sd-webui-reactor` in the "Install from URL" tab - and click "Install" +3. Please, wait for several minutes until the installation process will be finished (be patient, don't interrupt the process) +4. Check the last message in your SD-WebUI Console: +* If you see the message "--- PLEASE, RESTART the Server! ---" - so, do it, stop the Server (CTRL+C or CMD+C) and start it again - or just go to the "Installed" tab, click "Apply and restart UI" +* If you see the message "Done!", just reload the UI +5. Enjoy! + +If you use [SD.Next](https://github.com/vladmandic/automatic): + +1. Close (stop) your SD WebUI Server if it's running +2. (For Windows Users) See the [1st step](#a1111) for Automatic1111 (if you followed [this steps (sec. VIII)](#insightfacebuild) instead - go to the Step 5) +3. Go to (Windows)`automatic\venv\Scripts` or (MacOS/Linux)`automatic/venv/bin`, run Terminal or Console (cmd) for that folder and type `activate` +4. Run `pip install insightface==0.7.3` +5. Run SD.Next, go to the "Extensions" tab and use this URL `https://github.com/Gourieff/sd-webui-reactor` in the "Install from URL" tab and click "Install" +6. Please, wait for several minutes until the installation process will be finished (be patient, don't interrupt the process) +7. Check the last message in your SD.Next Console: +* If you see the message "--- PLEASE, RESTART the Server! ---" - stop the Server (CTRL+C or CMD+C) or just close your console +8. Go to the `automatic\extensions\sd-webui-reactor` directory - if you see there `models\insightface` folder with the file `inswapper_128.onnx`, just move the file to the `automatic\models\insightface` folder +9. Run your SD.Next WebUI and enjoy! + +If you use [Cagliostro Colab UI](https://github.com/Linaqruf/sd-notebook-collection): + +1. In active WebUI, go to the "Extensions" tab, load "Available" extensions and type "ReActor" in the search field or use this URL `https://github.com/Gourieff/sd-webui-reactor` in the "Install from URL" tab - and click "Install" +2. Please, wait for several minutes until the installation process will be finished (be patient, don't interrupt the process) +3. When you see the message "--- PLEASE, RESTART the Server! ---" (in your Colab Notebook Start UI section "Start Cagliostro Colab UI") - just go to the "Installed" tab and click "Apply and restart UI" +4. Enjoy! + +## Features + +- Very fast and accurate **face replacement (face swap)** in images +- **Multiple faces support** +- **Gender detection** +- Ability to **save original images** (made before swapping) +- **Face restoration** of a swapped face +- **Upscaling** of a resulting image +- Saving ans loading **Safetensors Face Models** +- **Facial Mask Correction** to avoid any pixelation around face contours +- Ability to set the **Postprocessing order** +- **100% compatibility** with different **SD WebUIs**: Automatic1111, SD.Next, Cagliostro Colab UI +- **Fast performance** even with CPU, ReActor for SD WebUI is absolutely not picky about how powerful your GPU is +- **CUDA** acceleration support since version 0.5.0 +- **[API](/API.md) support**: both SD WebUI built-in and external (via POST/GET requests) +- **ComfyUI [support](https://github.com/Gourieff/comfyui-reactor-node)** +- **Mac M1/M2 [support](https://github.com/Gourieff/sd-webui-reactor/issues/42)** +- Console **log level control** +- **NSFW filter free** (this extension is aimed at highly developed intellectual people, not at perverts; our society must be oriented on its way towards the highest standards, not the lowest - this is the essence of development and evolution; so, my position is - that mature-minded people are clever enough to understand for themselves what is good and what is bad and take full responsibility for personal actions; for others - no "filters" will help until they do understand how Universe works) + +## Usage + +> Using this software you are agree with [disclaimer](#disclaimer) + +1. Under "ReActor" drop-down menu, import an image containing a face; +2. Turn on the "Enable" checkbox; +3. That's it, now the generated result will have the face you selected. + +example + +### Face Indexes + +ReActor detects faces in images in the following order:
+left->right, top->bottom + +And if you need to specify faces, you can set indexes for source and input images. + +Index of the first detected face is 0. + +You can set indexes in the order you need.
+E.g.: 0,1,2 (for Source); 1,0,2 (for Input).
+This means: the second Input face (index = 1) will be swapped by the first Source face (index = 0) and so on. + +### Genders + +You can specify the gender to detect in images.
+ReActor will swap a face only if it meets the given condition. + +### The result face is blurry +Use the "Restore Face" option. You can also try the "Upscaler" option or for more finer control, use an upscaler from the "Extras" tab. +You can also set the postproduction order (from 0.1.0 version): +example + +*The old logic was the opposite (Upscale -> then Restore), resulting in worse face quality (and big texture differences) after upscaling.* + +### There are multiple faces in result +Select the face numbers you wish to swap using the "Comma separated face number(s)" option for swap-source and result images. You can use different index order. +example + +### ~~The result is totally black~~ +~~This means NSFW filter detected that your image is NSFW.~~ + +IamSFW + +### Img2Img + +You can choose to activate the swap on the source image or on the generated image, or on both using the checkboxes. Activating on source image allows you to start from a given base and apply the diffusion process to it. + +ReActor works with Inpainting - but only the masked part will be swapped.
Please use with the "Only masked" option for "Inpaint area" if you enabled "Upscaler". Otherwise use the upscale option via the Extras tab or via the Script loader (below the screen) with "SD upscale" or "Ultimate SD upscale". + +### Extras Tab + +From the version 0.5.0 you can use ReActor via the Extras Tab. It gives a superfast perfomance and ability to swap face2image avoiding SD pipeline that can cause smushing of original image's details + +IamSFW + +## API + +You can use ReActor with the built-in Webui API or via an external API. + +Please follow **[this](/API.md)** page for the detailed instruction. + +## Troubleshooting + +### **I. "You should at least have one model in models directory"** + +Please, check the path where "inswapper_128.onnx" model is stored. It must be inside the folder `stable-diffusion-webui\models\insightface`. Move the model there if it's stored in a different directory. + +### **II. Any problems with installing Insightface or other dependencies** + +(for Mac M1/M2 users) If you get errors when trying to install Insightface - please read https://github.com/Gourieff/sd-webui-reactor/issues/42 + +(for Windows Users) If you have VS C++ Build Tools or MS VS 2022 installed but still have a problem, then try the next step: +1. Close (stop) your SD WebUI Server and start it again + +(for Any OS Users) If the problem still there, then do the following: +1. Close (stop) your SD WebUI Server if it's running +2. Go to (Windows)`venv\Lib\site-packages` folder or (MacOS/Linux)`venv/lib/python3.10/site-packages` +3. If you see any folders with names start from `~` (e.g. "~rotobuf") - delete them +4. Go to (Windows)`venv\Scripts` or (MacOS/Linux)`venv/bin` +5. Run Terminal or Console (cmd) for that folder and type `activate` +6. Update your pip at first: `pip install -U pip` +7. Then one-by-one: + - `pip install insightface==0.7.3` + - `pip install onnx` + - `pip install "onnxruntime-gpu>=1.16.1"` + - `pip install opencv-python` + - `pip install tqdm` +8. Type `deactivate`, you can close your Terminal or Console and start your SD WebUI, ReActor should start OK - if not, welcome to the Issues section. + +### **III. "TypeError: UpscaleOptions.init() got an unexpected keyword argument 'do_restore_first'"** + +First of all - you need to disable any other Roop-based extensions: +- Go to 'Extensions -> Installed' tab and uncheck any Roop-based extensions except this one + uncompatible-with-other-roop +- Click 'Apply and restart UI' + +Alternative solutions: +- https://github.com/Gourieff/sd-webui-reactor/issues/3#issuecomment-1615919243 +- https://github.com/Gourieff/sd-webui-reactor/issues/39#issuecomment-1666559134 (can be actual, if you use Vladmandic SD.Next) + +### **IV. "AttributeError: 'FaceSwapScript' object has no attribute 'enable'"** + +Probably, you need to disable the "SD-CN-Animation" extension (or perhaps some another that causes the conflict) + +### **V. "INVALID_PROTOBUF : Load model from <...>\models\insightface\inswapper_128.onnx failed:Protobuf parsing failed" OR "AttributeError: 'NoneType' object has no attribute 'get'" OR "AttributeError: 'FaceSwapScript' object has no attribute 'save_original'"** + +This error may occur if there's smth wrong with the model file `inswapper_128.onnx` + +Try to download it manually from [here](https://huggingface.co/datasets/Gourieff/ReActor/resolve/main/models/inswapper_128.onnx) +and put it to the `stable-diffusion-webui\models\insightface` replacing existing one + +### **VI. "ValueError: This ORT build has ['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider'] enabled" OR "ValueError: This ORT build has ['AzureExecutionProvider', 'CPUExecutionProvider'] enabled"** + +1. Close (stop) your SD WebUI Server if it's running +2. Go to the (Windows)`venv\Lib\site-packages` or (MacOS/Linux)`venv/lib/python3.10/site-packages` and see if there are any folders with names start from "~" (for example "~rotobuf"), delete them +3. Go to the (Windows)`venv\Scripts` or (MacOS/Linux)`venv/bin` run Terminal or Console (cmd) there and type `activate` +4. Then: +- `python -m pip install -U pip` +- `pip uninstall -y onnxruntime onnxruntime-gpu onnxruntime-silicon onnxruntime-extensions` +- `pip install "onnxruntime-gpu>=1.16.1"` + +If it didn't help - it seems that you have another extension reinstalling `onnxruntime` when SD WebUI checks requirements. Please see your extensions list. Some extensions can causes reinstalling of `onnxruntime-gpu` to `onnxruntime<1.16.1` every time SD WebUI runs.
ORT 1.16.0 has a bug https://github.com/microsoft/onnxruntime/issues/17631 - don't install it! + +### **VII. "ImportError: cannot import name 'builder' from 'google.protobuf.internal'"** + +1. Close (stop) your SD WebUI Server if it's running +2. Go to the (Windows)`venv\Lib\site-packages` or (MacOS/Linux)`venv/lib/python3.10/site-packages` and see if there are any folders with names start from "~" (for example "~rotobuf"), delete them +3. Go to the "google" folder (inside the "site-packages") and delete any folders there with names start from "~" +4. Go to the (Windows)`venv\Scripts` or (MacOS/Linux)`venv/bin` run Terminal or Console (cmd) there and type `activate` +5. Then: +- `python -m pip install -U pip` +- `pip uninstall protobuf` +- `pip install "protobuf>=3.20.3"` + +If this method doesn't help - there is some other extension that has a wrong version of protobuf dependence and SD WebUI installs it on a startup requirements check + +
+ +### **VIII. (For Windows users) If you still cannot build Insightface for some reasons or just don't want to install Visual Studio or VS C++ Build Tools - do the following:** + +1. Close (stop) your SD WebUI Server if it's running +2. Download and put [prebuilt Insightface package](https://github.com/Gourieff/Assets/raw/main/Insightface/insightface-0.7.3-cp310-cp310-win_amd64.whl) into the stable-diffusion-webui (or SD.Next) root folder where you have "webui-user.bat" file or (A1111 Portable) "run.bat" +3. From stable-diffusion-webui (or SD.Next) root folder run CMD and `.\venv\Scripts\activate`
OR
(A1111 Portable) Run CMD +4. Then update your PIP: `python -m pip install -U pip`
OR
(A1111 Portable)`system\python\python.exe -m pip install -U pip` +5. Then install Insightface: `pip install insightface-0.7.3-cp310-cp310-win_amd64.whl`
OR
(A1111 Portable)`system\python\python.exe -m pip install insightface-0.7.3-cp310-cp310-win_amd64.whl` +6. Enjoy! + +### **IX. 07-August-23 Update problem** + +If after `git pull` you see the message: `Merge made by the 'recursive' strategy` and then when you check `git status` you see `Your branch is ahead of 'origin/main' by` + +Please do the next: + +Inside the folder `extensions\sd-webui-reactor` run Terminal or Console (cmd) and then: +- `git reset f48bdf1 --hard` +- `git pull` + +OR + +Just delete the folder `sd-webui-reactor` inside the `extensions` directory and then run Terminal or Console (cmd) and type `git clone https://github.com/Gourieff/sd-webui-reactor` + +### **X. StabilityMatrix Issues** + +If you encounter any issues with installing this extension in the StabilityMatrix package manager - read here how to solve: https://github.com/Gourieff/sd-webui-reactor/issues/129#issuecomment-1768210875 + +## Updating + +A good and quick way to check for Extensions updates: https://github.com/Gourieff/sd-webui-extensions-updater + +## ComfyUI + +You can use ReActor with ComfyUI.
+For the installation instruction follow the [ReActor Node repo](https://github.com/Gourieff/comfyui-reactor-node) + +## Disclaimer + +This software is meant to be a productive contribution to the rapidly growing AI-generated media industry. It will help artists with tasks such as animating a custom character or using the character as a model for clothing etc. + +The developers of this software are aware of its possible unethical application and are committed to take preventative measures against them. We will continue to develop this project in the positive direction while adhering to law and ethics. + +Users of this software are expected to use this software responsibly while abiding the local law. If face of a real person is being used, users are suggested to get consent from the concerned person and clearly mention that it is a deepfake when posting content online. **Developers and Contributors of this software are not responsible for actions of end-users.** + +By using this extension you are agree not to create any content that: +- violates any laws; +- causes any harm to a person or persons; +- propogates (spreads) any information (both public or personal) or images (both public or personal) which could be meant for harm; +- spreads misinformation; +- targets vulnerable groups of people. + +This software utilizes the pre-trained models `buffalo_l` and `inswapper_128.onnx`, which are provided by [InsightFace](https://github.com/deepinsight/insightface/). These models are included under the following conditions: + +[From insighface licence](https://github.com/deepinsight/insightface/tree/master/python-package): The InsightFaceโ€™s pre-trained models are available for non-commercial research purposes only. This includes both auto-downloading models and manually downloaded models. + +Users of this software must strictly adhere to these conditions of use. The developers and maintainers of this software are not responsible for any misuse of InsightFaceโ€™s pre-trained models. + +Please note that if you intend to use this software for any commercial purposes, you will need to train your own models or find models that can be used commercially. + +### Models Hashsum + +#### Safe-to-use models have the folowing hash: + +inswapper_128.onnx +``` +MD5:a3a155b90354160350efd66fed6b3d80 +SHA256:e4a3f08c753cb72d04e10aa0f7dbe3deebbf39567d4ead6dce08e98aa49e16af +``` + +1k3d68.onnx + +``` +MD5:6fb94fcdb0055e3638bf9158e6a108f4 +SHA256:df5c06b8a0c12e422b2ed8947b8869faa4105387f199c477af038aa01f9a45cc +``` + +2d106det.onnx + +``` +MD5:a3613ef9eb3662b4ef88eb90db1fcf26 +SHA256:f001b856447c413801ef5c42091ed0cd516fcd21f2d6b79635b1e733a7109dbf +``` + +det_10g.onnx + +``` +MD5:4c10eef5c9e168357a16fdd580fa8371 +SHA256:5838f7fe053675b1c7a08b633df49e7af5495cee0493c7dcf6697200b85b5b91 +``` + +genderage.onnx + +``` +MD5:81c77ba87ab38163b0dec6b26f8e2af2 +SHA256:4fde69b1c810857b88c64a335084f1c3fe8f01246c9a191b48c7bb756d6652fb +``` + +w600k_r50.onnx + +``` +MD5:80248d427976241cbd1343889ed132b3 +SHA256:4c06341c33c2ca1f86781dab0e829f88ad5b64be9fba56e56bc9ebdefc619e43 +``` + +**Please check hashsums if you download these models from unverified (or untrusted) sources** diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/README_RU.md b/stable-diffusion-webui/extensions/sd-webui-reactor/README_RU.md new file mode 100644 index 0000000000000000000000000000000000000000..0018794af95889c3c82c0fcfe00d2162dfa27bfb --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/README_RU.md @@ -0,0 +1,420 @@ +
+ + logo + + ![Version](https://img.shields.io/badge/ะฒะตั€ัะธั-0.7.0_beta7-green?style=for-the-badge&labelColor=darkgreen) + + + ะŸะพะดะดะตั€ะถะฐั‚ัŒ ะฟั€ะพะตะบั‚ ะฝะฐ Boosty +
+ + ะŸะพะดะดะตั€ะถะฐั‚ัŒ ะฟั€ะพะตะบั‚ + +
+ +
+ + [![Commit activity](https://img.shields.io/github/commit-activity/t/Gourieff/sd-webui-reactor/main?cacheSeconds=0)](https://github.com/Gourieff/sd-webui-reactor/commits/main) + ![Last commit](https://img.shields.io/github/last-commit/Gourieff/sd-webui-reactor/main?cacheSeconds=0) + [![Opened issues](https://img.shields.io/github/issues/Gourieff/sd-webui-reactor?color=red)](https://github.com/Gourieff/sd-webui-reactor/issues?cacheSeconds=0) + [![Closed issues](https://img.shields.io/github/issues-closed/Gourieff/sd-webui-reactor?color=green&cacheSeconds=0)](https://github.com/Gourieff/sd-webui-reactor/issues?q=is%3Aissue+is%3Aclosed) + ![License](https://img.shields.io/github/license/Gourieff/sd-webui-reactor) + + [English](/README.md) | ะ ัƒััะบะธะน + +# ReActor ะดะปั Stable Diffusion +### ะ ะฐััˆะธั€ะตะฝะธะต ะดะปั ะฑั‹ัั‚ั€ะพะน ะธ ะฟั€ะพัั‚ะพะน ะทะฐะผะตะฝั‹ ะปะธั† ะฝะฐ ะปัŽะฑั‹ั… ะธะทะพะฑั€ะฐะถะตะฝะธัั…. ะ‘ะตะท ั„ะธะปัŒั‚ั€ะฐ ั†ะตะฝะทัƒั€ั‹, 18+, ะธัะฟะพะปัŒะทัƒะนั‚ะต ะฟะพะด ะฒะฐัˆัƒ ัะพะฑัั‚ะฒะตะฝะฝัƒัŽ [ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ัŒ](#disclaimer) + +--- + + ะงั‚ะพ ะฝะพะฒะพะณะพ | ะฃัั‚ะฐะฝะพะฒะบะฐ | ะ’ะพะทะผะพะถะฝะพัั‚ะธ | ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝะธะต | API | ะฃัั‚ั€ะฐะฝะตะฝะธะต ะฟั€ะพะฑะปะตะผ | ะžะฑะฝะพะฒะปะตะฝะธะต | ComfyUI | ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ัŒ + +
+ +--- + +example + + + +## ะงั‚ะพ ะฝะพะฒะพะณะพ ะฒ ะฟะพัะปะตะดะฝะธั… ะพะฑะฝะพะฒะปะตะฝะธัั… + +
+ ะะฐะถะผะธั‚ะต, ั‡ั‚ะพะฑั‹ ะฟะพัะผะพั‚ั€ะตั‚ัŒ + +### 0.7.0 BETA2 + +- X/Y/Z ะพะฟั†ะธั ัƒะปัƒั‡ัˆะตะฝะฐ! ะ”ะพะฑะฐะฒะปะตะฝ ะตั‰ั‘ ะพะดะธะฝ ะฟะฐั€ะฐะผะตั‚ั€: ั‚ะตะฟะตั€ัŒ ะฒั‹ ะผะพะถะตั‚ะต ะฒั‹ะฑั€ะฐั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะผะพะดะตะปะตะน ะปะธั† ะดะปั ัะพะทะดะฐะฝะธั ะฒะฐั€ะธะฐั†ะธะธ ะทะฐะผะตะฝะตะฝะฝั‹ั… ะปะธั†, ั‡ั‚ะพะฑั‹ ะฒั‹ะฑั€ะฐั‚ัŒ ะฝะฐะธะปัƒั‡ัˆะธะต! + +0.7.0-whatsnew-05 + +ะงั‚ะพะฑั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพััŒ "Face Model" - ะฐะบั‚ะธะฒะธั€ัƒะนั‚ะต ะ ะตะะบั‚ะพั€ ะธ ะฒั‹ะฑะธั€ะธั‚ะต ะปัŽะฑัƒัŽ ะผะพะดะตะปัŒ ะปะธั†ะฐ ะฒ ะบะฐั‡ะตัั‚ะฒะต ะธัั‚ะพั‡ะฝะธะบะฐ:
+0.7.0-whatsnew-070.7.0-whatsnew-06 + +ะŸะพะปะฝะพั€ะฐะทะผะตั€ะฝะพะต ะดะตะผะพ-ะธะทะพะฑั€ะฐะถะตะฝะธะต: [xyz_demo_2.png](https://raw.githubusercontent.com/Gourieff/Assets/main/sd-webui-reactor/xyz_demo_2.png) + +### 0.7.0 BETA1 + +- ะŸะพะดะดะตั€ะถะบะฐ X/Y/Z ัะบั€ะธะฟั‚ะฐ (ะดะพ 3-ั… ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ: CodeFormer Weight, Restorer Visibility, Face Mask Correction) + +0.7.0-whatsnew-03 + +ะŸะพะปะฝะพั€ะฐะทะผะตั€ะฝะพะต ะดะตะผะพ-ะธะทะพะฑั€ะฐะถะตะฝะธะต: [xyz_demo.png](https://raw.githubusercontent.com/Gourieff/Assets/main/sd-webui-reactor/xyz_demo.png) + +### 0.7.0 ALPHA1 + +- ะŸะพ ะผะฝะพะณะพั‡ะธัะปะตะฝะฝั‹ะผ ะฟั€ะพััŒะฑะฐะผ ะฟะพัะฒะธะปะฐััŒ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ัั‚ั€ะพะธั‚ัŒ ัะผะตัˆะฐะฝะฝั‹ะต ะผะพะดะตะปะธ ะปะธั† ("Tools->Face Models->Blend") + +0.7.0-whatsnew-010.7.0-whatsnew-02 + +- ะŸะพะดะดะตั€ะถะบะฐ CUDA 12 ะฒ ัะบั€ะธะฟั‚ะต ัƒัั‚ะฐะฝะพะฒั‰ะธะบะฐ ะดะปั ะฑะธะฑะปะธะพั‚ะตะบะธ ORT-GPU ะฒะตั€ัะธะธ 1.17.0 +- ะะพะฒะฐั ะฒะบะปะฐะดะบะฐ "Detection" ั ะฟะฐั€ะฐะผะตั‚ั€ะฐะผะธ "Threshold" ะธ "Max Faces" + +### 0.6.1 BETA3 + +- ะžะฟั†ะธั 'Force Upscale' ะฒะฝัƒั‚ั€ะธ ะฒะบะปะฐะดะบะธ 'Upscale': ะฐะฟัะบะตะนะป ะฒั‹ะฟะพะปะฝะธั‚ัั, ะดะฐะถะต ะตัะปะธ ะฝะต ะฑั‹ะปะพ ะพะฑะฝะฐั€ัƒะถะตะฝะพ ะฝะธ ะพะดะฝะพะณะพ ะปะธั†ะฐ (FR https://github.com/Gourieff/sd-webui-reactor/issues/116) +- ะžั‚ะพะฑั€ะฐะถะตะฝะธะต ะธะผั‘ะฝ ั„ะฐะนะปะพะฒ ะธัะฟะพะปัŒะทัƒะตะผั‹ั… ะธะทะพะฑั€ะฐะถะตะฝะธะน, ะบะพะณะดะฐ ะฒั‹ะฑั€ะฐะฝะพ ะฝะตัะบะพะปัŒะบะพ ะธะทะพะฑั€ะฐะถะตะฝะธะน ะธะปะธ ะฟะฐะฟะบะฐ (ะฐ ั‚ะฐะบะถะต ั€ะตะถะธะผ ัะปัƒั‡ะฐะนะฝะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั) + +### 0.6.1 BETA2 + +- ะžะฟั†ะธั 'Save original' ั‚ะตะฟะตั€ัŒ ั€ะฐะฑะพั‚ะฐะตั‚ ะฟั€ะฐะฒะธะปัŒะฝะพ, ะบะพะณะดะฐ ะฒั‹ ะฒั‹ะฑะธั€ะฐะตั‚ะต 'Multiple Images' ะธะปะธ 'Source Folder' +- ะ”ะพะฑะฐะฒะปะตะฝ ั€ะตะถะธะผ ะฒั‹ะฑะพั€ะฐ ัะปัƒั‡ะฐะนะฝะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั ะดะปั 'Source Folder' + +0.6.1-whatsnew-01 + +### 0.6.0 + +- ะะพะฒั‹ะน ะปะพะณะพั‚ะธะฟ +- ะะดะฐะฟั‚ะฐั†ะธั ะบ ะฒะตั€ัะธะธ A1111 1.7.0 (ะฟั€ะฐะฒะธะปัŒะฝะฐั ะทะฐะณั€ัƒะทะบะฐ GFPGAN) +- ะะพะฒะฐั ััั‹ะปะบะฐ ะดะปั ั„ะฐะนะปะฐ ะพัะฝะพะฒะฝะพะน ะผะพะดะตะปะธ +- UI ะฟะตั€ะตั€ะฐะฑะพั‚ะฐะฝ +- ะŸะพัะฒะธะปะฐััŒ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะทะฐะณั€ัƒะถะฐั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะธัั…ะพะดะฝั‹ั… ะธะทะพะฑั€ะฐะถะตะฝะธะน ั ะปะธั†ะฐะผะธ ะธะปะธ ะทะฐะดะฐะฒะฐั‚ัŒ ะฟัƒั‚ัŒ ะบ ะฟะฐะฟะบะต, ัะพะดะตั€ะถะฐั‰ะตะน ั‚ะฐะบะธะต ะธะทะพะฑั€ะฐะถะตะฝะธั + +0.6.0-whatsnew-01 + +0.6.0-whatsnew-02 + +### 0.5.1 + +- ะขะตะฟะตั€ัŒ ะผะพะถะฝะพ ัะพั…ั€ะฐะฝัั‚ัŒ ะผะพะดะตะปะธ ะปะธั† ะฒ ะบะฐั‡ะตัั‚ะฒะต ั„ะฐะนะปะพะฒ "safetensors" (ะฝะฐั…ะพะดัั‚ัั ะฒ `\models\reactor\faces`) ะธ ะทะฐะณั€ัƒะถะฐั‚ัŒ ะธั… ั ReActor, ั…ั€ะฐะฝั ััƒะฟะตั€ ะปะตะณะบะธะต ะผะพะดะตะปะธ ะปะธั†, ะบะพั‚ะพั€ั‹ะต ะฒั‹ ั‡ะฐั‰ะต ะฒัะตะณะพ ะธัะฟะพะปัŒะทัƒะตั‚ะต; +- ะะพะฒั‹ะต ะพะฟั†ะธั "Face Mask Correction" - ะตัะปะธ ะฒั‹ ัั‚ะฐะปะบะธะฒะฐะตั‚ะตััŒ ั ะฟะธะบัะตะปะธะทะฐั†ะธะตะน ะฒะพะบั€ัƒะณ ะบะพะฝั‚ัƒั€ะพะฒ ะปะธั†ะฐ, ัั‚ะฐ ะพะฟั†ะธั ะฑัƒะดะตั‚ ะฟะพะปะตะทะฝะพะน; + +0.5.0-whatsnew-01 + +
+ + + +## ะฃัั‚ะฐะฝะพะฒะบะฐ + +[A1111 WebUI / WebUI-Forge](#a1111) | [SD.Next](#sdnext) | [Google Colab SD WebUI](#colab) + +ะ•ัะปะธ ะฒั‹ ะธัะฟะพะปัŒะทัƒะตั‚ะต [AUTOMATIC1111 SD WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui/) ะธะปะธ [SD WebUI Forge](https://github.com/lllyasviel/stable-diffusion-webui-forge): + +1. (ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Windows): + - ะฃัั‚ะฐะฝะพะฒะธั‚ะต **Visual Studio 2022** (ะะฐะฟั€ะธะผะตั€, ะฒะตั€ัะธัŽ Community - ัั‚ะพั‚ ัˆะฐะณ ะฝัƒะถะตะฝ ะดะปั ะฟั€ะฐะฒะธะปัŒะฝะพะน ะบะพะผะฟะธะปัั†ะธะธ ะฑะธะฑะปะธะพั‚ะตะบะธ Insightface): + https://visualstudio.microsoft.com/downloads/ + - ะ˜ะ›ะ˜ ั‚ะพะปัŒะบะพ **VS C++ Build Tools** (ะตัะปะธ ะฒะฐะผ ะฝะต ะฝัƒะถะตะฝ ะฒะตััŒ ะฟะฐะบะตั‚ Visual Studio), ะฒั‹ะฑะตั€ะธั‚ะต "Desktop Development with C++" ะฒ ั€ะฐะทะดะตะปะต "Workloads -> Desktop & Mobile": + https://visualstudio.microsoft.com/visual-cpp-build-tools/ + - ะ˜ะ›ะ˜ ะตัะปะธ ะถะต ะฒั‹ ะฝะต ั…ะพั‚ะธั‚ะต ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ ั‡ั‚ะพ-ะปะธะฑะพ ะธะท ะฒั‹ัˆะตัƒะบะฐะทะฐะฝะฝะพะณะพ - ะฒั‹ะฟะพะปะฝะธั‚ะต [ัะปะตะดัƒัŽั‰ะธะต ัˆะฐะณะธ (ะฟัƒะฝะบั‚ VIII)](#insightfacebuild) +2. ะ’ะฝัƒั‚ั€ะธ SD Web-UI ะฟะตั€ะตะนะดะธั‚ะต ะฒะพ ะฒะบะปะฐะดะบัƒ "Extensions", ะทะฐะณั€ัƒะทะธั‚ะต ัะฟะธัะพะบ ะดะพัั‚ัƒะฟะฝั‹ั… ั€ะฐััˆะธั€ะตะฝะธะน (ะฒะบะปะฐะดะบะฐ "Available") ะธ ะฒะฒะตะดะธั‚ะต "ReActor" ะฒ ัั‚ั€ะพะบะต ะฟะพะธัะบะฐ ะธะปะธ ะถะต ะฒัั‚ะฐะฒัŒั‚ะต ััั‹ะปะบัƒ `https://github.com/Gourieff/sd-webui-reactor` ะฒ "Install from URL" - ะธ ะฝะฐะถะผะธั‚ะต "Install" +3. ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะดะพะถะดะธั‚ะต ะฝะตัะบะพะปัŒะบะพ ะผะธะฝัƒั‚, ะฟะพะบะฐ ะฟั€ะพั†ะตัั ัƒัั‚ะฐะฝะพะฒะบะธ ะฟะพะปะฝะพัั‚ัŒัŽ ะฝะต ะทะฐะฒะตั€ัˆะธั‚ัั (ะฝะฐะฑะตั€ะธั‚ะตััŒ ั‚ะตั€ะฟะตะฝะธั, ะฝะต ะฟั€ะตั€ั‹ะฒะฐะนั‚ะต ะฟั€ะพั†ะตัั) +4. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฟะพัะปะตะดะฝะตะต ัะพะพะฑั‰ะตะฝะธะต ะฒ ะบะพะฝัะพะปะธ SD-WebUI: +* ะ•ัะปะธ ะฒั‹ ะฒะธะดะธั‚ะต "--- PLEASE, RESTART the Server! ---" - ะพัั‚ะฐะฝะพะฒะธั‚ะต ะกะตั€ะฒะตั€ (CTRL+C ะธะปะธ CMD+C) ะธ ะทะฐะฟัƒัั‚ะธั‚ะต ะตะณะพ ะทะฐะฝะพะฒะพ - ะ˜ะ›ะ˜ ะถะต ะฟะตั€ะตะนะดะธั‚ะต ะฒะพ ะฒะบะปะฐะดะบัƒ "Installed", ะฝะฐะถะผะธั‚ะต "Apply and restart UI" +* ะ•ัะปะธ ะฒั‹ ะฒะธะดะธั‚ะต "Done!", ะฟั€ะพัั‚ะพ ะฟะตั€ะตะทะฐะณั€ัƒะทะธั‚ะต UI, ะฝะฐะถะฐะฒ ะฝะฐ "Reload UI" +5. ะ“ะพั‚ะพะฒะพ! + +ะ•ัะปะธ ะฒั‹ ะธัะฟะพะปัŒะทัƒะตั‚ะต [SD.Next](https://github.com/vladmandic/automatic): + +1. ะ—ะฐะบั€ะพะนั‚ะต (ะพัั‚ะฐะฝะพะฒะธั‚ะต) SD WebUI ะกะตั€ะฒะตั€, ะตัะปะธ ะพะฝ ะทะฐะฟัƒั‰ะตะฝ +2. (ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Windows) ะกะผะพั‚ั€ะธั‚ะต [ะจะฐะณ 1](#a1111) ะดะปั Automatic1111 (ะตัะปะธ ะถะต ะฒั‹ ัะปะตะดะพะฒะฐะปะธ [ะดะฐะฝะฝั‹ะผ ัˆะฐะณะฐะผ (ะฟัƒะฝะบั‚ VIII)](#insightfacebuild) ะฒะผะตัั‚ะพ ัั‚ะพะณะพ - ะฟะตั€ะตั…ะพะดะธั‚ะต ะบ ะจะฐะณัƒ 5) +3. ะŸะตั€ะตะนะดะธั‚ะต ะฒ (Windows)`automatic\venv\Scripts` ะธะปะธ (MacOS/Linux)`automatic/venv/bin`, ะทะฐะฟัƒัั‚ะธั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ (cmd) ะดะปั ะดะฐะฝะฝะพะน ะฟะฐะฟะบะธ ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต `activate` +4. ะ’ั‹ะฟะพะปะฝะธั‚ะต `pip install insightface==0.7.3` +5. ะ—ะฐะฟัƒัั‚ะธั‚ะต SD.Next, ะฟะตั€ะตะนะดะธั‚ะต ะฒะพ ะฒะบะปะฐะดะบัƒ "Extensions", ะฒัั‚ะฐะฒัŒั‚ะต ัั‚ัƒ ััั‹ะปะบัƒ `https://github.com/Gourieff/sd-webui-reactor` ะฒ "Install from URL" ะธ ะฝะฐะถะผะธั‚ะต "Install" +6. ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะดะพะถะดะธั‚ะต ะฝะตัะบะพะปัŒะบะพ ะผะธะฝัƒั‚, ะฟะพะบะฐ ะฟั€ะพั†ะตัั ัƒัั‚ะฐะฝะพะฒะบะธ ะฟะพะปะฝะพัั‚ัŒัŽ ะฝะต ะทะฐะฒะตั€ัˆะธั‚ัั (ะฝะฐะฑะตั€ะธั‚ะตััŒ ั‚ะตั€ะฟะตะฝะธั, ะฝะต ะฟั€ะตั€ั‹ะฒะฐะนั‚ะต ะฟั€ะพั†ะตัั) +7. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฟะพัะปะตะดะฝะตะต ัะพะพะฑั‰ะตะฝะธะต ะฒ ะบะพะฝัะพะปะธ SD.Next: +* ะ•ัะปะธ ะฒั‹ ะฒะธะดะธั‚ะต "--- PLEASE, RESTART the Server! ---" - ะพัั‚ะฐะฝะพะฒะธั‚ะต ะกะตั€ะฒะตั€ (CTRL+C ะธะปะธ CMD+C) ะธะปะธ ะฟั€ะพัั‚ะพ ะทะฐะบั€ะพะนั‚ะต ะบะพะฝัะพะปัŒ +8. ะŸะตั€ะตะนะดะธั‚ะต ะฒ ะดะธั€ะตะบั‚ะพั€ะธัŽ `automatic\extensions\sd-webui-reactor` - ะตัะปะธ ะฒั‹ ะฒะธะดะธั‚ะต ั‚ะฐะผ ะฟะฐะฟะบัƒ `models\insightface` ั ั„ะฐะนะปะพะผ `inswapper_128.onnx` ะฒะฝัƒั‚ั€ะธ, ะฟะตั€ะตะผะตัั‚ะธั‚ะต ะตะณะพ ะฒ ะฟะฐะฟะบัƒ `automatic\models\insightface` +9. ะ“ะพั‚ะพะฒะพ, ะผะพะถะตั‚ะต ะทะฐะฟัƒัั‚ะธั‚ัŒ SD.Next WebUI! + +ะ•ัะปะธ ะฒั‹ ะธัะฟะพะปัŒะทัƒะตั‚ะต [Cagliostro Colab UI](https://github.com/Linaqruf/sd-notebook-collection): + +1. ะ’ ะฐะบั‚ะธะฒะฝะพะผ WebUI ะฟะตั€ะตะนะดะธั‚ะต ะฒะพ ะฒะบะปะฐะดะบัƒ "Extensions", ะทะฐะณั€ัƒะทะธั‚ะต ัะฟะธัะพะบ ะดะพัั‚ัƒะฟะฝั‹ั… ั€ะฐััˆะธั€ะตะฝะธะน (ะฒะบะปะฐะดะบะฐ "Available") ะธ ะฒะฒะตะดะธั‚ะต "ReActor" ะฒ ัั‚ั€ะพะบะต ะฟะพะธัะบะฐ ะธะปะธ ะถะต ะฒัั‚ะฐะฒัŒั‚ะต ััั‹ะปะบัƒ `https://github.com/Gourieff/sd-webui-reactor` ะฒ "Install from URL" - ะธ ะฝะฐะถะผะธั‚ะต "Install" +2. ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะดะพะถะดะธั‚ะต ะฝะตะบะพั‚ะพั€ะพะต ะฒั€ะตะผั, ะฟะพะบะฐ ะฟั€ะพั†ะตัั ัƒัั‚ะฐะฝะพะฒะบะธ ะฟะพะปะฝะพัั‚ัŒัŽ ะฝะต ะทะฐะฒะตั€ัˆะธั‚ัั (ะฝะฐะฑะตั€ะธั‚ะตััŒ ั‚ะตั€ะฟะตะฝะธั, ะฝะต ะฟั€ะตั€ั‹ะฒะฐะนั‚ะต ะฟั€ะพั†ะตัั) +3. ะšะพะณะดะฐ ะฒั‹ ัƒะฒะธะดะธั‚ะต ัะพะพะฑั‰ะตะฝะธะต "--- PLEASE, RESTART the Server! ---" (ะฒ ัะตะบั†ะธะธ "Start UI" ะฒะฐัˆะตะณะพ ะฝะพัƒั‚ะฑัƒะบะฐ "Start Cagliostro Colab UI") - ะฟะตั€ะตะนะดะธั‚ะต ะฒะพ ะฒะบะปะฐะดะบัƒ "Installed" ะธ ะฝะฐะถะผะธั‚ะต "Apply and restart UI" +4. ะ“ะพั‚ะพะฒะพ! + + + +## ะ’ะพะทะผะพะถะฝะพัั‚ะธ + +- ะ‘ั‹ัั‚ั€ะฐั ะธ ั‚ะพั‡ะฝะฐ **ะทะฐะผะตะฝะฐ ะปะธั† (faceswap)** ะฝะฐ ะธะทะพะฑั€ะฐะถะตะฝะธะธ +- **ะŸะพะดะดะตั€ะถะบะฐ ะฝะตัะบะพะปัŒะบะธั… ะปะธั†** +- **ะžะฟั€ะตะดะตะปะตะฝะธะต ะฟะพะปะฐ** +- ะคัƒะฝะบั†ะธั **ัะพั…ั€ะฐะฝะตะฝะธั ะพั€ะธะณะธะฝะฐะปัŒะฝะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั** (ัะณะตะฝะตั€ะธั€ะพะฒะฐะฝะฝะพะณะพ ะดะพ ะทะฐะผะตะฝั‹ ะปะธั†ะฐ) +- **ะ’ะพััั‚ะฐะฝะพะฒะปะตะฝะธะต ะปะธั†ะฐ** ะฟะพัะปะต ะทะฐะผะตะฝั‹ +- **ะฃะฒะตะปะธั‡ะตะฝะธะต ั€ะฐะทะผะตั€ะฐ** ะฟะพะปัƒั‡ะตะฝะฝะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั +- ะกะพั…ั€ะฐะฝะตะฝะธะต ะธ ะทะฐะณั€ัƒะทะบะฐ **ะœะพะดะตะปะตะน ะ›ะธั† ั‚ะธะฟะฐ Safetensors** +- **ะšะพั€ั€ะตะบั†ะธั ะœะฐัะบะธ ะ›ะธั†ะฐ** ะดะปั ะฟั€ะตะดะพั‚ะฒั€ะฐั‰ะตะฝะธั ะบะฐะบะพะน-ะปะธะฑะพ ะฟะธะบัะตะปะธะทะฐั†ะธะธ ะฒะพะบั€ัƒะณ ะบะพะฝั‚ัƒั€ะพะฒ ะปะธั† +- ะ’ะพะทะผะพะถะฝะพัั‚ัŒ ะทะฐะดะฐั‚ัŒ **ะฟะพั€ัะดะพะบ ะฟะพัั‚ะพะฑั€ะฐะฑะพั‚ะบะธ** +- **100% ัะพะฒะผะตัั‚ะธะผะพัั‚ัŒ** ั ั€ะฐะทะฝั‹ะผะธ **SD WebUI**: Automatic1111, SD.Next, Cagliostro Colab UI +- **ะžั‚ะปะธั‡ะฝะฐั ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ** ะดะฐะถะต ั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะตะผ ะฆะŸะฃ, ReActor ะดะปั SD WebUI ะฐะฑัะพะปัŽั‚ะฝะพ ะฝะต ั‚ั€ะตะฑะพะฒะฐั‚ะตะปะตะฝ ะบ ะผะพั‰ะฝะพัั‚ะธ ะฒะฐัˆะตะน ะฒะธะดะตะพะบะฐั€ั‚ั‹ +- **ะŸะพะดะดะตั€ะถะบะฐ CUDA**, ะฝะฐั‡ะธะฝะฐั ั ะฒะตั€ัะธะธ 0.5.0 +- **ะŸะพะดะดะตั€ะถะบะฐ [API](/API.md)**: ะบะฐะบ ะฒัั‚ั€ะพะตะฝะฝะพะณะพ ะฒ SD WebUI, ั‚ะฐะบ ะธ ะฒะฝะตัˆะฝะตะณะพ (ั‡ะตั€ะตะท POST/GET ะทะฐะฟั€ะพัั‹) +- **[ะŸะพะดะดะตั€ะถะบะฐ](https://github.com/Gourieff/comfyui-reactor-node) ComfyUI** +- **[ะŸะพะดะดะตั€ะถะบะฐ](https://github.com/Gourieff/sd-webui-reactor/issues/42) ะบะพะผะฟัŒัŽั‚ะตั€ะพะฒ Mac M1/M2** +- **ะ ะตะณัƒะปะธั€ะพะฒะบะฐ ัƒั€ะพะฒะฝั ะปะพะณะพะฒ** ะบะพะฝัะพะปะธ +- **ะ‘ะตะท NSFW ั„ะธะปัŒั‚ั€ะพะฒ** (ะดะฐะฝะฝะพะต ั€ะฐััˆะธั€ะตะฝะธะต ะฐะดั€ะตัะพะฒะฐะฝะพ ะฒั‹ัะพะบะพั€ะฐะทะฒะธั‚ั‹ะผ ะธะฝั‚ะตะปะปะตะบั‚ัƒะฐะปัŒะฝั‹ะผ ะปัŽะดัะผ, ะฐ ะฝะต ะธะทะฒั€ะฐั‰ะตะฝั†ะฐะผ; ะฝะฐัˆะต ะพะฑั‰ะตัั‚ะฒะพ ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ะพั€ะธะตะฝั‚ะธั€ะพะฒะฐะฝะพ ะฝะฐ ัะฒะพั‘ะผ ะฟัƒั‚ะธ ะฝะฐ ะฒั‹ััˆะธะต ัั‚ะฐะฝะดะฐั€ั‚ั‹, ะฐ ะฝะต ะฝะฐ ะฝะธะทัˆะธะต - ะฒ ัั‚ะพะผ ัะพัั‚ะพะธั‚ ััƒั‚ัŒ ั€ะฐะทะฒะธั‚ะธั ะธ ัะฒะพะปัŽั†ะธะธ ั‡ะตะปะพะฒะตั‡ะตัะบะพะณะพ ะพะฑั‰ะตัั‚ะฒะฐ; ะฟะพัั‚ะพะผัƒ, ะผะพั ะฟะพะทะธั†ะธั ั‚ะฐะบะพะฒะฐ - ั‡ั‚ะพ ะทั€ะตะปั‹ะต ัƒะผะพะผ ะปัŽะดะธ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ั€ะฐะทัƒะผะฝั‹, ั‡ั‚ะพะฑั‹ ะฟะพะฝะธะผะฐั‚ัŒ, ั‡ั‚ะพ ะตัั‚ัŒ ั…ะพั€ะพัˆะพ, ะฐ ั‡ั‚ะพ ะฟะปะพั…ะพ ะธ ะฝะตัั‚ะธ ะฟะพะปะฝัƒัŽ ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ัŒ ะทะฐ ัะพะฑัั‚ะฒะตะฝะฝั‹ะต ะดะตะนัั‚ะฒะธั; ะดะปั ะฟั€ะพั‡ะธั… - ะฝะธะบะฐะบะธะต "ั„ะธะปัŒั‚ั€ั‹" ะฝะต ะฟะพะผะพะณัƒั‚, ะฟะพะบะฐ ัั‚ะธ ะปัŽะดะธ ัะฐะผะธ ะฝะต ะฟะพะนะผัƒั‚, ะบะฐะบ ั€ะฐะฑะพั‚ะฐะตั‚ ะ’ัะตะปะตะฝะฝะฐั) + + + +## ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝะธะต + +> ะ˜ัะฟะพะปัŒะทัƒั ะดะฐะฝะฝะพะต ะฟั€ะพะณั€ะฐะผะผะฝะพะต ะพะฑะตัะฟะตั‡ะตะฝะธะต, ะฒั‹ ัะพะณะปะฐัˆะฐะตั‚ะตััŒ ั [ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ัŒัŽ](#disclaimer) + +1. ะ’ ั€ะฐัะบั€ั‹ะฒะฐัŽั‰ะธะผัั ะผะตะฝัŽ "ReActor" ะธะผะฟะพั€ั‚ะธั€ัƒะนั‚ะต ะธะทะพะฑั€ะฐะถะตะฝะธะต, ัะพะดะตั€ะถะฐั‰ะตะต ะปะธั†ะพ; +2. ะฃัั‚ะฐะฝะพะฒะธั‚ะต ั„ะปะฐะถะพะบ "Enable"; +3. ะ“ะพั‚ะพะฒะพ, ั‚ะตะฟะตั€ัŒ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฑัƒะดะตั‚ ะธะผะตั‚ัŒ ั‚ะพ ะปะธั†ะพ, ะบะพั‚ะพั€ะพะต ะฒั‹ ะฒั‹ะฑั€ะฐะปะธ. + +example + +### ะ˜ะฝะดะตะบัั‹ ะ›ะธั† (Face Indexes) + +ReActor ะพะฟั€ะตะดะตะปัะตั‚ ะปะธั†ะฐ ะฝะฐ ะธะทะพะฑั€ะฐะถะตะฝะธะธ ะฒ ัะปะตะดัƒัŽั‰ะตะน ะฟะพัะปะตะดะพะฒะฐั‚ะตะปัŒะฝะพัั‚ะธ:
+ัะปะตะฒะฐ-ะฝะฐะฟั€ะฐะฒะพ, ัะฒะตั€ั…ัƒ-ะฒะฝะธะท. + +ะ•ัะปะธ ะฒะฐะผ ะฝัƒะถะฝะพ ะทะฐะผะตะฝะธั‚ัŒ ะพะฟั€ะตะดะตะปะตะฝะฝะพะต ะปะธั†ะพ, ะฒั‹ ะผะพะถะตั‚ะต ัƒะบะฐะทะฐั‚ัŒ ะธะฝะดะตะบั ะดะปั ะธัั…ะพะดะฝะพะณะพ (source, ั ะปะธั†ะพะผ) ะธ ะฒั…ะพะดะฝะพะณะพ (input, ะณะดะต ะฑัƒะดะตั‚ ะทะฐะผะตะฝะฐ ะปะธั†ะฐ) ะธะทะพะฑั€ะฐะถะตะฝะธะน. + +ะ˜ะฝะดะตะบั ะฟะตั€ะฒะพะณะพ ะพะฑะฝะฐั€ัƒะถะตะฝะฝะพะณะพ ะปะธั†ะฐ - 0. + +ะ’ั‹ ะผะพะถะตั‚ะต ะทะฐะดะฐั‚ัŒ ะธะฝะดะตะบัั‹ ะฒ ั‚ะพะผ ะฟะพั€ัะดะบะต, ะบะพั‚ะพั€ั‹ะน ะฒะฐะผ ะฝัƒะถะตะฝ.
+ะะฐะฟั€ะธะผะตั€: 0,1,2 (ะดะปั Source); 1,0,2 (ะดะปั Input).
+ะญั‚ะพ ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ: ะฒั‚ะพั€ะพะต ะปะธั†ะพ ะธะท Input (ะธะฝะดะตะบั = 1) ะฑัƒะดะตั‚ ะทะฐะผะตะฝะตะฝะพ ะฟะตั€ะฒั‹ะผ ะปะธั†ะพะผ ะธะท Source (ะธะฝะดะตะบั = 0) ะธ ั‚ะฐะบ ะดะฐะปะตะต. + +### ะžะฟั€ะตะดะตะปะตะฝะธะต ะŸะพะปะฐ + +ะ’ั‹ ะผะพะถะตั‚ะต ะพะฑะพะทะฝะฐั‡ะธั‚ัŒ, ะบะฐะบะพะน ะฟะพะป ะฝัƒะถะฝะพ ะพะฟั€ะตะดะตะปัั‚ัŒ ะฝะฐ ะธะทะพะฑั€ะฐะถะตะฝะธะธ.
+ReActor ะทะฐะผะตะฝะธั‚ ั‚ะพะปัŒะบะพ ั‚ะพ ะปะธั†ะพ, ะบะพั‚ะพั€ะพะต ัƒะดะพะฒะปะตั‚ะฒะพั€ัะตั‚ ะทะฐะดะฐะฝะฝะพะผัƒ ัƒัะปะพะฒะธัŽ. + +### ะ•ัะปะธ ะปะธั†ะพ ะฟะพะปัƒั‡ะธะปะพััŒ ะฝะตั‡ั‘ั‚ะบะธะผ +ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ะพะฟั†ะธัŽ "Restore Face". ะขะฐะบะถะต ะผะพะถะตั‚ะต ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะพะฟั†ะธัŽ "Upscaler". ะ”ะปั ะฑะพะปะตะต ั‚ะพั‡ะฝะพะณะพ ะบะพะฝั‚ั€ะพะปั ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ ะธัะฟะพะปัŒะทัƒะนั‚ะต Upscaler ะฒะพ ะฒะบะปะฐะดะบะต "Extras". +ะขะฐะบะถะต ะฒั‹ ะผะพะถะตั‚ะต ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ะฟะพั€ัะดะพะบ ะฟะพัั‚ะพะฑั€ะฐะฑะพั‚ะบะธ (ะฝะฐั‡ะธะฝะฐั ั ะฒะตั€ัะธะธ 0.1.0): +example + +*ะŸั€ะตะถะฝัั ะปะพะณะธะบะฐ ะฑั‹ะปะฐ ะฟั€ะพั‚ะธะฒะพะฟะพะปะพะถะตะฝะฝะพะน (Upscale -> ะทะฐั‚ะตะผ Restore), ั‡ั‚ะพ ะฟั€ะธะฒะพะดะธะปะพ ะบ ะฑะพะปะตะต ั…ัƒะดัˆะตะผัƒ ะบะฐั‡ะตัั‚ะฒัƒ ะธะทะพะฑั€ะฐะถะตะฝะธั ะปะธั†ะฐ (ะฐ ั‚ะฐะบะถะต ะบ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพะน ั€ะฐะทะฝะธั†ะต ั‚ะตะบัั‚ัƒั€) ะฟะพัะปะต ัƒะฒะตะปะธั‡ะตะฝะธั.* + +### ะ ะตะทัƒะปัŒั‚ะฐั‚ ะธะผะตะตั‚ ะฝะตัะบะพะปัŒะบะพ ะปะธั† +ะ’ั‹ะฑะตั€ะธั‚ะต ะฝะพะผะตั€ะฐ ะปะธั†, ะบะพั‚ะพั€ั‹ะต ะฝัƒะถะฝะพ ะฟะพะผะตะฝัั‚ัŒ, ะธัะฟะพะปัŒะทัƒั ะฟะพะปั "Comma separated face number(s)" ะดะปั ะธัั…ะพะดะฝะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั ะปะธั†ะฐ ะธ ะดะปั ั€ะตะทัƒะปัŒั‚ะฐั‚ะฐ. ะœะพะถะฝะพ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ ะปัŽะฑะพะน, ะฝะตะพะฑั…ะพะดะธะผั‹ะน ะฒะฐะผ, ะฟะพั€ัะดะพะบ ะปะธั†. +example + +### ~~ะ ะตะทัƒะปัŒั‚ะฐั‚ ะฟะพะปัƒั‡ะธะปัั ั‡ั‘ั€ะฝั‹ะผ~~ +~~ะญั‚ะพ ะทะฝะฐั‡ะธั‚, ั‡ั‚ะพ ัั€ะฐะฑะพั‚ะฐะป NSFW ั„ะธะปัŒั‚ั€.~~ + +IamSFW + +### Img2Img + +ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ัั‚ัƒ ะฒะบะปะฐะดะบัƒ, ั‡ั‚ะพะฑั‹ ะทะฐะผะตะฝะธั‚ัŒ ะปะธั†ะพ ะฝะฐ ัƒะถะต ะณะพั‚ะพะฒะพะผ ะธะทะพะฑั€ะฐะถะตะฝะธะธ (ั„ะปะฐะถะพะบ "Swap in source image") ะธะปะธ ะฝะฐ ัะณะตะฝะตั€ะธั€ะพะฒะฐะฝะฝะพะผ ะฝะฐ ะพัะฝะพะฒะต ะณะพั‚ะพะฒะพะณะพ (ั„ะปะฐะถะพะบ "Swap in generated image"). + +Inpainting ั‚ะฐะบะถะต ั€ะฐะฑะพั‚ะฐะตั‚, ะฝะพ ะทะฐะผะตะฝะฐ ะปะธั†ะฐ ะฟั€ะพะธัั…ะพะดะธั‚ ั‚ะพะปัŒะบะพ ะฒ ะพะฑะปะฐัั‚ะธ ะผะฐัะบะธ.
ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะธัะฟะพะปัŒะทัƒะนั‚ะต ั ะพะฟั†ะธะตะน "Only masked" ะดะปั "Inpaint area", ะตัะปะธ ะฒั‹ ะฟั€ะธะผะตะฝัะตั‚ะต "Upscaler". ะ˜ะฝะฐั‡ะต, ะธัะฟะพะปัŒะทัƒะนั‚ะต ั„ัƒะฝะบั†ะธัŽ ัƒะฒะตะปะธั‡ะตะฝะธั (ะฐะฟัะบะตะนะปะฐ) ั‡ะตั€ะตะท ะฒะบะปะฐะดะบัƒ "Extras" ะธะปะธ ั‡ะตั€ะตะท ะพะฟั†ะธะพะฝะฐะปัŒะฝั‹ะน ะทะฐะณั€ัƒะทั‡ะธะบ "Script" (ะฒะฝะธะทัƒ ัะบั€ะฐะฝะฐ), ะฟั€ะธะผะตะฝะธะฒ "SD upscale" ะธะปะธ "Ultimate SD upscale". + +### Extras + +ะะฐั‡ะธะฝะฐั ั ะฒะตั€ัะธะธ 0.5.0, ะฒั‹ ะผะพะถะตั‚ะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ReActor ั‡ะตั€ะตะท ะฒะบะปะฐะดะบัƒ Extras, ั‡ั‚ะพ ะดะฐั‘ั‚ ะพั‡ะตะฝัŒ ะฑั‹ัั‚ั€ัƒัŽ ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ ะธ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะทะฐะผะตะฝั‹ ะปะธั† ะฒ ะพะฑั…ะพะด ะฟะฐะนะฟะปะฐะนะฝะฐ SD, ั‡ั‚ะพ ะธะฝะพะณะดะฐ ะฒั‹ะทั‹ะฒะฐะตั‚ ั€ะฐะทะผั‹ั‚ะธะต ะธะปะธ ะธัะบะฐะถะตะฝะธะต ะดะตั‚ะฐะปะตะน ะพั€ะธะณะธะฝะฐะปัŒะฝะพะณะพ ะธะทะพะฑั€ะฐะถะตะฝะธั + +IamSFW + +## API + +ะ’ั‹ ะผะพะถะตั‚ะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ReActor ะบะฐะบ ัะพ ะฒัั‚ั€ะพะตะฝะฝั‹ะผ SD Webui API ั‚ะฐะบ ะธ ั‡ะตั€ะตะท ะฒะฝะตัˆะฝะตะต API. + +ะŸะพะดั€ะพะฑะฝะฐั ะธะฝัั‚ั€ัƒะบั†ะธั **[ะทะดะตััŒ](/API.md)**. + +
+ +## ะฃัั‚ั€ะฐะฝะตะฝะธะต ะฟั€ะพะฑะปะตะผ + +### **I. "You should at least have one model in models directory"** + +ะŸั€ะพะฒะตั€ัŒั‚ะต ะฟัƒั‚ัŒ, ะณะดะต ั…ั€ะฐะฝะธั‚ัั ะผะพะดะตะปัŒ "inswapper_128.onnx". ะคะฐะนะป ะดะพะปะถะตะฝ ะฝะฐั…ะพะดะธั‚ัŒัั ะฒ ะฟะฐะฟะบะต `stable-diffusion-webui\models\insightface`. ะŸะตั€ะตะผะตัั‚ะธั‚ะต ะผะพะดะตะปัŒ ั‚ัƒะดะฐ, ะตัะปะธ ะพะฝะฐ ะฝะฐั…ะพะดะธั‚ัั ะฒ ะบะฐะบะพะน-ั‚ะพ ะธะฝะพะน ะดะธั€ะตะบั‚ะพั€ะธะธ. + +### **II. ะšะฐะบะธะต-ะปะธะฑะพ ะฟั€ะพะฑะปะตะผั‹ ั ัƒัั‚ะฐะฝะพะฒะบะพะน Insightface ะธะปะธ ะฟั€ะพั‡ะธั… ะฟะฐะบะตั‚ะพะฒ** + +(ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Mac M1/M2) ะ•ัะปะธ ะฒั‹ ะฟะพะปัƒั‡ะฐะตั‚ะต ะพัˆะธะฑะบะธ ะฒ ั…ะพะดะต ัƒัั‚ะฐะฝะพะฒะบะธ Insightface - ั‡ะธั‚ะฐะนั‚ะต https://github.com/Gourieff/sd-webui-reactor/issues/42 + +(ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Windows) ะ•ัะปะธ VS C++ Build Tools ะธะปะธ MS VS 2022 ัƒัั‚ะฐะฝะพะฒะปะตะฝั‹ ะฝะพ ะฒั‹ ะฒะธะดะธั‚ะต ะพัˆะธะฑะบะธ, ัะฒัะทะฐะฝะฝั‹ะต ั ะพั‚ััƒั‚ัั‚ะฒะธะตะผ Insightface, ะฟะพะฟั€ะพะฑัƒะนั‚ะต ัะปะตะดัƒัŽั‰ะตะต: +1. ะ—ะฐะบั€ะพะนั‚ะต (ะพัั‚ะฐะฝะพะฒะธั‚ะต) SD WebUI ะกะตั€ะฒะตั€ ะธ ะทะฐะฟัƒัั‚ะธั‚ะต ะตะณะพ ัะฝะพะฒะฐ (ะฒะพะทะผะพะถะฝะพ, ะฝะต ะฟั€ะพัˆะปะฐ ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธั ะฟะฐะบะตั‚ะฐ ะฟะพัะปะต ะตะณะพ ัƒัั‚ะฐะฝะพะฒะบะธ) + +(ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน ะปัŽะฑั‹ั… ะžะก) ะŸะพะฟั€ะพะฑัƒะนั‚ะต ัะปะตะดัƒัŽั‰ะตะต: +1. ะ—ะฐะบั€ะพะนั‚ะต (ะพัั‚ะฐะฝะพะฒะธั‚ะต) SD WebUI ะกะตั€ะฒะตั€, ะตัะปะธ ะพะฝ ะทะฐะฟัƒั‰ะตะฝ +2. ะŸะตั€ะตะนะดะธั‚ะต ะฒ ะฟะฐะฟะบัƒ (Windows)`venv\Lib\site-packages` ะธะปะธ (MacOS/Linux)`venv/lib/python3.10/site-packages` +3. ะ•ัะปะธ ะฒั‹ ะฒะธะดะธั‚ะต ะบ-ะป ะฟะฐะฟะบะธ ั ะธะผะตะฝะฐะผะธ, ะฝะฐั‡ะธะฝะฐัŽั‰ะธะผะธัั ั `~` (ะฝะฐะฟั€ะธะผะตั€, "~rotobuf") - ัƒะดะฐะปะธั‚ะต ะธั… +4. ะŸะตั€ะตะนะดะธั‚ะต ะฒ (Windows)`venv\Scripts` ะธะปะธ (MacOS/Linux)`venv/bin` +5. ะžั‚ะบั€ะพะนั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ (cmd) ะดะปั ัั‚ะพะน ะฟะฐะฟะบะธ ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต `activate` +6. ะ”ะปั ะฝะฐั‡ะฐะปะฐ ะพะฑะฝะพะฒะธั‚ะต pip: `pip install -U pip` +7. ะ”ะฐะปะตะต: + - `pip install insightface==0.7.3` + - `pip install onnx` + - `pip install "onnxruntime-gpu>=1.16.1"` + - `pip install opencv-python` + - `pip install tqdm` +8. ะ’ั‹ะฟะพะปะฝะธั‚ะต `deactivate`, ะทะฐะบั€ะพะนั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ ะธ ะทะฐะฟัƒัั‚ะธั‚ะต SD WebUI, ReActor ะดะพะปะถะตะฝ ะทะฐะฟัƒัั‚ะธั‚ัŒัั ะฑะตะท ะบ-ะป ะฟั€ะพะฑะปะตะผ - ะตัะปะธ ะถะต ะฝะตั‚, ะดะพะฑั€ะพ ะฟะพะถะฐะปะพะฒะฐั‚ัŒ ะฒ ั€ะฐะทะดะตะป "Issues". + +### **III. "TypeError: UpscaleOptions.init() got an unexpected keyword argument 'do_restore_first'"** + +ะ”ะปั ะฝะฐั‡ะฐะปะฐ ะพั‚ะบะปัŽั‡ะธั‚ะต ะปัŽะฑั‹ะต ะดั€ัƒะณะธะต Roop-ะฟะพะดะพะฑะฝั‹ะต ั€ะฐััˆะธั€ะตะฝะธั: +- ะŸะตั€ะตะนะดะธั‚ะต ะฒ 'Extensions -> Installed' ะธ ัะฝะธะผะธั‚ะต ั„ะปะฐะถะพะบ ั ะฝะตะฝัƒะถะฝั‹ั…: + uncompatible-with-other-roop +- ะะฐะถะผะธั‚ะต 'Apply and restart UI' + +ะะปัŒั‚ะตั€ะฝะฐั‚ะธะฒะฝั‹ะต ั€ะตัˆะตะฝะธั: +- https://github.com/Gourieff/sd-webui-reactor/issues/3#issuecomment-1615919243 +- https://github.com/Gourieff/sd-webui-reactor/issues/39#issuecomment-1666559134 (ะฐะบั‚ัƒะฐะปัŒะฝะพ ะดะปั Vladmandic SD.Next) + +### **IV. "AttributeError: 'FaceSwapScript' object has no attribute 'enable'"** + +ะžั‚ะบะปัŽั‡ะธั‚ะต ั€ะฐััˆะธั€ะตะฝะธะต "SD-CN-Animation" (ะธะปะธ ะบะฐะบะพะต-ะปะธะฑะพ ะดั€ัƒะณะพะต, ะฒั‹ะทั‹ะฒะฐัŽั‰ะตะต ะบะพะฝั„ะปะธะบั‚) + +### **V. "INVALID_PROTOBUF : Load model from <...>\models\insightface\inswapper_128.onnx failed:Protobuf parsing failed" ะ˜ะ›ะ˜ "AttributeError: 'NoneType' object has no attribute 'get'" ะ˜ะ›ะ˜ "AttributeError: 'FaceSwapScript' object has no attribute 'save_original'"** + +ะญั‚ะฐ ะพัˆะธะฑะบะฐ ะฟะพัะฒะปัะตั‚ัั, ะตัะปะธ ั‡ั‚ะพ-ั‚ะพ ะฝะต ั‚ะฐะบ ั ั„ะฐะนะปะพะผ ะผะพะดะตะปะธ `inswapper_128.onnx`. + +ะกะบะฐั‡ะฐะนั‚ะต ะฒั€ัƒั‡ะฝัƒัŽ ะฟะพ ััั‹ะปะบะต [here](https://huggingface.co/datasets/Gourieff/ReActor/resolve/main/models/inswapper_128.onnx) +ะธ ัะพั…ั€ะฐะฝะธั‚ะต ะฒ ะดะธั€ะตะบั‚ะพั€ะธัŽ `stable-diffusion-webui\models\insightface`, ะทะฐะผะตะฝะธะฒ ะธะผะตัŽั‰ะธะนัั ั„ะฐะนะป. + +### **VI. "ValueError: This ORT build has ['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider'] enabled" ะ˜ะ›ะ˜ "ValueError: This ORT build has ['AzureExecutionProvider', 'CPUExecutionProvider'] enabled"** + +1. ะ—ะฐะบั€ะพะนั‚ะต (ะพัั‚ะฐะฝะพะฒะธั‚ะต) SD WebUI ะกะตั€ะฒะตั€, ะตัะปะธ ะพะฝ ะทะฐะฟัƒั‰ะตะฝ +2. ะŸะตั€ะตะนะดะธั‚ะต ะฒ (Windows)`venv\Lib\site-packages` ะธะปะธ (MacOS/Linux)`venv/lib/python3.10/site-packages` ะธ ะฟะพัะผะพั‚ั€ะธั‚ะต, ะตัะปะธ ั‚ะฐะผ ะฟะฐะฟะบะธ ั ะธะผะตะฝะฐะผ, ะฝะฐั‡ะธะฝะฐัŽั‰ะธะผะธัั ะฝะฐ "~" (ะฝะฐะฟั€ะธะผะตั€, "~rotobuf"), ัƒะดะฐะปะธั‚ะต ะธั… +3. ะŸะตั€ะตะนะดะธั‚ะต ะฒ (Windows)`venv\Scripts` ะธะปะธ (MacOS/Linux)`venv/bin`, ะพั‚ะบั€ะพะนั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ (cmd) ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต `activate` +4. ะ—ะฐั‚ะตะผ: +- `python -m pip install -U pip` +- `pip uninstall -y onnxruntime onnxruntime-gpu onnxruntime-silicon onnxruntime-extensions` +- `pip install "onnxruntime-gpu>=1.16.1"` + +ะ•ัะปะธ ัั‚ะพ ะฝะต ะฟะพะผะพะณะปะพ - ะทะฝะฐั‡ะธั‚ ะบะฐะบะพะต-ั‚ะพ ะดั€ัƒะณะพะต ั€ะฐััˆะธั€ะตะฝะธะต ะฟะตั€ะตัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ `onnxruntime` ะฒััะบะธะน ั€ะฐะท, ะบะพะณะดะฐ SD WebUI ะฟั€ะพะฒะตั€ัะตั‚ ั‚ั€ะตะฑะพะฒะฐะฝะธั ะฟะฐะบะตั‚ะพะฒ. ะ’ะฝะธะผะฐั‚ะตะปัŒะฝะพ ะฟะพัะผะพั‚ั€ะธั‚ะต ัะฟะธัะพะบ ะฐะบั‚ะธะฒะฝั‹ั… ั€ะฐััˆะธั€ะตะฝะธะน. ะะตะบะพั‚ะพั€ั‹ะต ั€ะฐััˆะธั€ะตะฝะธั ะผะพะณัƒั‚ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ะฟะตั€ะตัƒัั‚ะฐะฝะพะฒะบัƒ `onnxruntime-gpu` ะฝะฐ ะฒะตั€ัะธัŽ `onnxruntime<1.16.1` ะฟั€ะธ ะบะฐะถะดะพะผ ะทะฐะฟัƒัะบะต SD WebUI.
ORT 1.16.0 ะฒั‹ะบะฐั‚ะธะปะธ ั ะพัˆะธะฑะบะพะน https://github.com/microsoft/onnxruntime/issues/17631 - ะฝะต ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะนั‚ะต ะตั‘! + +### **VII. "ImportError: cannot import name 'builder' from 'google.protobuf.internal'"** + +1. ะ—ะฐะบั€ะพะนั‚ะต (ะพัั‚ะฐะฝะพะฒะธั‚ะต) SD WebUI ะกะตั€ะฒะตั€, ะตัะปะธ ะพะฝ ะทะฐะฟัƒั‰ะตะฝ +2. ะŸะตั€ะตะนะดะธั‚ะต ะฒ (Windows)`venv\Lib\site-packages` ะธะปะธ (MacOS/Linux)`venv/lib/python3.10/site-packages` ะธ ะฟะพัะผะพั‚ั€ะธั‚ะต, ะตัะปะธ ั‚ะฐะผ ะฟะฐะฟะบะธ ั ะธะผะตะฝะฐะผ, ะฝะฐั‡ะธะฝะฐัŽั‰ะธะผะธัั ะฝะฐ "~" (ะฝะฐะฟั€ะธะผะตั€, "~rotobuf"), ัƒะดะฐะปะธั‚ะต ะธั… +3. ะŸะตั€ะตะนะดะธั‚ะต ะฒ ะฟะฐะฟะบัƒ "google" (ะฒะฝัƒั‚ั€ะธ "site-packages") ะธ ัƒะดะฐะปะธั‚ะต ะปัŽะฑั‹ะต ะฟะฐะฟะบะธ ั ะธะผะตะฝะฐะผ, ะฝะฐั‡ะธะฝะฐัŽั‰ะธะผะธัั ะฝะฐ "~" +4. ะŸะตั€ะตะนะดะธั‚ะต ะฒ (Windows)`venv\Scripts` ะธะปะธ (MacOS/Linux)`venv/bin`, ะพั‚ะบั€ะพะนั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ (cmd) ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต `activate` +5. ะ—ะฐั‚ะตะผ: +- `python -m pip install -U pip` +- `pip uninstall protobuf` +- `pip install "protobuf>=3.20.3"` + +ะ•ัะปะธ ัั‚ะพ ะฝะต ะฟะพะผะณะปะพ - ะทะฝะฐั‡ะธั‚, ะตัั‚ัŒ ะบ-ะป ะดั€ัƒะณะพะต ั€ะฐััˆะธั€ะตะฝะธะต, ะบะพั‚ะพั€ะพะต ะธัะฟะพะปัŒะทัƒะตั‚ ะฝะตะฟะพะดั…ะพะดัั‰ัƒัŽ ะฒะตั€ัะธัŽ ะฟะฐะบะตั‚ะฐ protobuf, ะธ SD WebUI ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ ัั‚ัƒ ะฒะตั€ัะธัŽ ะฟั€ะธ ะบะฐะถะดะพะผ ะทะฐะฟัƒัะบะต. + +
+ +### **VIII. (ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Windows) ะ•ัะปะธ ะฒั‹ ะดะพ ัะธั… ะฟะพั€ ะฝะต ะผะพะถะตั‚ะต ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ะฟะฐะบะตั‚ Insightface ะฟะพ ะบะฐะบะธะผ-ั‚ะพ ะฟั€ะธั‡ะธะฝะฐะผ ะธะปะธ ะถะต ะฟั€ะพัั‚ะพ ะฝะต ะถะตะปะฐะตั‚ะต ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ Visual Studio ะธะปะธ VS C++ Build Tools - ัะดะตะปะฐะนั‚ะต ัะปะตะดัƒัŽั‰ะตะต:** + +1. ะ—ะฐะบั€ะพะนั‚ะต (ะพัั‚ะฐะฝะพะฒะธั‚ะต) SD WebUI ะกะตั€ะฒะตั€, ะตัะปะธ ะพะฝ ะทะฐะฟัƒั‰ะตะฝ +2. ะกะบะฐั‡ะฐะนั‚ะต ะณะพั‚ะพะฒั‹ะน [ะฟะฐะบะตั‚ Insightface](https://github.com/Gourieff/Assets/raw/main/Insightface/insightface-0.7.3-cp310-cp310-win_amd64.whl) ะธ ัะพั…ั€ะฐะฝะธั‚ะต ะตะณะพ ะฒ ะบะพั€ะฝะตะฒัƒัŽ ะดะธั€ะตะบั‚ะพั€ะธัŽ stable-diffusion-webui (ะธะปะธ SD.Next) - ั‚ัƒะดะฐ, ะณะดะต ะปะตะถะธั‚ ั„ะฐะนะป "webui-user.bat" ะธะปะธ (A1111 Portable) "run.bat" +3. ะ˜ะท ะบะพั€ะฝะตะฒะพะน ะดะธั€ะตะบั‚ะพั€ะธะธ ะพั‚ะบั€ะพะนั‚ะต ะšะพะฝัะพะปัŒ (CMD) ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต `.\venv\Scripts\activate`
ะ˜ะ›ะ˜
(A1111 Portable) ะžั‚ะบั€ะพะนั‚ะต ะšะพะฝัะพะปัŒ (CMD) +4. ะžะฑะฝะพะฒะธั‚ะต PIP: `python -m pip install -U pip`
ะ˜ะ›ะ˜
(A1111 Portable)`system\python\python.exe -m pip install -U pip` +5. ะ—ะฐั‚ะตะผ ัƒัั‚ะฐะฝะพะฒะธั‚ะต Insightface: `pip install insightface-0.7.3-cp310-cp310-win_amd64.whl`
ะ˜ะ›ะ˜
(A1111 Portable)`system\python\python.exe -m pip install insightface-0.7.3-cp310-cp310-win_amd64.whl` +6. ะ“ะพั‚ะพะฒะพ! + +### **IX. ะžัˆะธะฑะบะฐ ะพะฑะฝะพะฒะปะตะฝะธั 07-ะะฒะณัƒัั‚-23** + +ะ•ัะปะธ ะฟะพัะปะต ะพั‡ะตั€ะตะดะฝะพะณะพ `git pull` ะฒั‹ ะฟะพะปัƒั‡ะธะปะธ ัะพะพะฑั‰ะตะฝะธะต: `Merge made by the 'recursive' strategy` ะธ ะทะฐั‚ะตะผ, ะบะพะณะดะฐ ะฟั€ะพะฒะตั€ัะตั‚ะต ัั‚ะฐั‚ัƒั ั€ะตะฟะพะทะธั‚ะพั€ะธั ั‡ะตั€ะตะท `git status`, ะฒั‹ ะฒะธะดะธั‚ะต `Your branch is ahead of 'origin/main' by` + +ะ’ั‹ะฟะพะปะฝะธั‚ะต ัะปะตะดัƒัŽั‰ะตะต: + +ะ’ะฝัƒั‚ั€ะธ ะฟะฐะฟะบะธ `extensions\sd-webui-reactor` ะทะฐะฟัƒัั‚ะธั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ (cmd) ะธ ะทะฐั‚ะตะผ: +- `git reset f48bdf1 --hard` +- `git pull` + +ะ˜ะ›ะ˜: + +ะŸะพะปะฝะพัั‚ัŒัŽ ัƒะดะฐะปะธั‚ะต ะฟะฐะฟะบัƒ `sd-webui-reactor` ะฒะฝัƒั‚ั€ะธ ะดะธั€ะตะบั‚ะพั€ะธะธ `extensions`, ะทะฐะฟัƒัั‚ะธั‚ะต ะขะตั€ะผะธะฝะฐะป ะธะปะธ ะšะพะฝัะพะปัŒ (cmd) ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต `git clone https://github.com/Gourieff/sd-webui-reactor` + +### **X. ะžัˆะธะฑะบะธ ัƒัั‚ะฐะฝะพะฒะบะธ ะฒ StabilityMatrix** + +ะ•ัะปะธ ะฒั‹ ัั‚ะพะปะบะฝัƒะปะธััŒ ั ะพัˆะธะฑะบะฐะผะธ ะฟั€ะธ ัƒัั‚ะฐะฝะพะฒะบะธ ะดะฐะฝะฝะพะณะพ ั€ะฐััˆะธั€ะตะฝะธั ะฒ ะฟะฐะบะตั‚ะฝะพะผ ะผะตะฝะตะดะถะตั€ะต StabilityMatrix - ะธะทัƒั‡ะธั‚ะต ะธะฝั„ะพั€ะผะฐั†ะธัŽ ะฟะพ ััั‹ะปะบะต: https://github.com/Gourieff/sd-webui-reactor/issues/129#issuecomment-1768210875 + +
+ +## ะžะฑะฝะพะฒะปะตะฝะธะต + +ะกะฐะผั‹ะน ะฟั€ะพัั‚ะพะน ะธ ัƒะดะพะฑะฝั‹ะน ัะฟะพัะพะฑ ะพะฑะฝะพะฒะปะตะฝะธั SD WebUI ะธ ั€ะฐััˆะธั€ะตะฝะธะน: https://github.com/Gourieff/sd-webui-extensions-updater + +## ComfyUI + +ะ’ั‹ ะผะพะถะตั‚ะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ReActor ั ComfyUI
+ะ˜ะฝัั‚ั€ัƒะบั†ะธั ะทะดะตััŒ: [ReActor Node](https://github.com/Gourieff/comfyui-reactor-node) + +
+ +## ะžั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ัŒ + +ะญั‚ะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะต ะพะฑะตัะฟะตั‡ะตะฝะธะต ะฟั€ะธะทะฒะฐะฝะพ ัั‚ะฐั‚ัŒ ะฟั€ะพะดัƒะบั‚ะธะฒะฝั‹ะผ ะฒะบะปะฐะดะพะผ ะฒ ะฑั‹ัั‚ั€ะพั€ะฐัั‚ัƒั‰ัƒัŽ ะผะตะดะธะฐะธะฝะดัƒัั‚ั€ะธัŽ ะฝะฐ ะพัะฝะพะฒะต ะณะตะฝะตั€ะฐั‚ะธะฒะฝั‹ั… ัะตั‚ะตะน ะธ ะธัะบัƒััั‚ะฒะตะฝะฝะพะณะพ ะธะฝั‚ะตะปะปะตะบั‚ะฐ. ะ”ะฐะฝะฝะพะต ะŸะž ะฟะพะผะพะถะตั‚ ั…ัƒะดะพะถะฝะธะบะฐะผ ะฒ ั€ะตัˆะตะฝะธะธ ั‚ะฐะบะธั… ะทะฐะดะฐั‡, ะบะฐะบ ะฐะฝะธะผะฐั†ะธั ัะพะฑัั‚ะฒะตะฝะฝะพะณะพ ะฟะตั€ัะพะฝะฐะถะฐ ะธะปะธ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต ะฟะตั€ัะพะฝะฐะถะฐ ะฒ ะบะฐั‡ะตัั‚ะฒะต ะผะพะดะตะปะธ ะดะปั ะพะดะตะถะดั‹ ะธ ั‚.ะด. + +ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะธ ัั‚ะพะณะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะณะพ ะพะฑะตัะฟะตั‡ะตะฝะธั ะพัะฒะตะดะพะผะปะตะฝั‹ ะพ ะฒะพะทะผะพะถะฝั‹ั… ะฝะตัั‚ะธั‡ะฝั‹ั… ะฟั€ะธะผะตะฝะตะฝะธัั… ะธ ะพะฑัะทัƒัŽั‚ัั ะฟั€ะธะฝัั‚ัŒ ะฟั€ะพั‚ะธะฒ ัั‚ะพะณะพ ะฟั€ะตะฒะตะฝั‚ะธะฒะฝั‹ะต ะผะตั€ั‹. ะœั‹ ะฟั€ะพะดะพะปะถะธะผ ั€ะฐะทะฒะธะฒะฐั‚ัŒ ัั‚ะพั‚ ะฟั€ะพะตะบั‚ ะฒ ะฟะพะทะธั‚ะธะฒะฝะพะผ ะฝะฐะฟั€ะฐะฒะปะตะฝะธะธ, ะฟั€ะธะดะตั€ะถะธะฒะฐัััŒ ะทะฐะบะพะฝะฐ ะธ ัั‚ะธะบะธ. + +ะŸะพะดั€ะฐะทัƒะผะตะฒะฐะตั‚ัั, ั‡ั‚ะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ ัั‚ะพะณะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะณะพ ะพะฑะตัะฟะตั‡ะตะฝะธั ะฑัƒะดัƒั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะตะณะพ ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพ, ัะพะฑะปัŽะดะฐั ะปะพะบะฐะปัŒะฝะพะต ะทะฐะบะพะฝะพะดะฐั‚ะตะปัŒัั‚ะฒะพ. ะ•ัะปะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะปะธั†ะพ ั€ะตะฐะปัŒะฝะพะณะพ ั‡ะตะปะพะฒะตะบะฐ, ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะพะฑัะทะฐะฝ ะฟะพะปัƒั‡ะธั‚ัŒ ัะพะณะปะฐัะธะต ะทะฐะธะฝั‚ะตั€ะตัะพะฒะฐะฝะฝะพะณะพ ะปะธั†ะฐ ะธ ั‡ะตั‚ะบะพ ัƒะบะฐะทะฐั‚ัŒ, ั‡ั‚ะพ ัั‚ะพ ะดะธะฟั„ะตะนะบ ะฟั€ะธ ั€ะฐะทะผะตั‰ะตะฝะธะธ ะบะพะฝั‚ะตะฝั‚ะฐ ะฒ ะ˜ะฝั‚ะตั€ะฝะตั‚ะต. **ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะธ ะธ ะกะพ-ะฐะฒั‚ะพั€ั‹ ะดะฐะฝะฝะพะณะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะณะพ ะพะฑะตัะฟะตั‡ะตะฝะธั ะฝะต ะฝะตััƒั‚ ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ะธ ะทะฐ ะดะตะนัั‚ะฒะธั ะบะพะฝะตั‡ะฝั‹ั… ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน.** + +ะ˜ัะฟะพะปัŒะทัƒั ะดะฐะฝะฝะพะต ั€ะฐััˆะธั€ะตะฝะธะต, ะฒั‹ ัะพะณะปะฐัˆะฐะตั‚ะตััŒ ะฝะต ัะพะทะดะฐะฒะฐั‚ัŒ ะผะฐั‚ะตั€ะธะฐะปั‹, ะบะพั‚ะพั€ั‹ะต: +- ะฝะฐั€ัƒัˆะฐัŽั‚ ะบะฐะบะธะต-ะปะธะฑะพ ะดะตะนัั‚ะฒัƒัŽั‰ะธะต ะทะฐะบะพะฝั‹ ั‚ะตั… ะธะปะธ ะธะฝั‹ั… ะณะพััƒะดะฐั€ัั‚ะฒ ะธะปะธ ะผะตะถะดัƒะฝะฐั€ะพะดะฝั‹ั… ะพั€ะณะฐะฝะธะทะฐั†ะธะน; +- ะฟั€ะธั‡ะธะฝััŽั‚ ะบะฐะบะพะน-ะปะธะฑะพ ะฒั€ะตะด ั‡ะตะปะพะฒะตะบัƒ ะธะปะธ ะปะธั†ะฐะผ; +- ะฟั€ะพะฟะฐะณะฐะฝะดะธั€ัƒัŽั‚ ะปัŽะฑัƒัŽ ะธะฝั„ะพั€ะผะฐั†ะธัŽ (ะบะฐะบ ะพะฑั‰ะตะดะพัั‚ัƒะฟะฝัƒัŽ, ั‚ะฐะบ ะธ ะปะธั‡ะฝัƒัŽ) ะธะปะธ ะธะทะพะฑั€ะฐะถะตะฝะธั (ะบะฐะบ ะพะฑั‰ะตะดะพัั‚ัƒะฟะฝั‹ะต, ั‚ะฐะบ ะธ ะปะธั‡ะฝั‹ะต), ะบะพั‚ะพั€ั‹ะต ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะฝะฐะฟั€ะฐะฒะปะตะฝั‹ ะฝะฐ ะฟั€ะธั‡ะธะฝะตะฝะธะต ะฒั€ะตะดะฐ; +- ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะดะปั ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝะตะฝะธั ะดะตะทะธะฝั„ะพั€ะผะฐั†ะธะธ; +- ะฝะฐั†ะตะปะตะฝั‹ ะฝะฐ ัƒัะทะฒะธะผั‹ะต ะณั€ัƒะฟะฟั‹ ะปัŽะดะตะน. + +ะ”ะฐะฝะฝะพะต ะฟั€ะพะณั€ะฐะผะผะฝะพะต ะพะฑะตัะฟะตั‡ะตะฝะธะต ะธัะฟะพะปัŒะทัƒะตั‚ ะฟั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝะพ ะพะฑัƒั‡ะตะฝะฝั‹ะต ะผะพะดะตะปะธ `buffalo_l` ะธ `inswapper_128.onnx`, ะฟั€ะตะดัั‚ะฐะฒะปะตะฝะฝั‹ะต ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐะผะธ [InsightFace](https://github.com/deepinsight/insightface/). ะญั‚ะธ ะผะพะดะตะปะธ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝััŽั‚ัั ะฟั€ะธ ัะปะตะดัƒัŽั‰ะธั… ัƒัะปะพะฒะธัั…: + +[ะŸะตั€ะตะฒะพะด ะธะท ั‚ะตะบัั‚ะฐ ะปะธั†ะตะฝะทะธะธ insighface](https://github.com/deepinsight/insightface/tree/master/python-package): ะŸั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝะพ ะพะฑัƒั‡ะตะฝะฝั‹ะต ะผะพะดะตะปะธ InsightFace ะดะพัั‚ัƒะฟะฝั‹ ั‚ะพะปัŒะบะพ ะดะปั ะฝะตะบะพะผะผะตั€ั‡ะตัะบะธั… ะธััะปะตะดะพะฒะฐั‚ะตะปัŒัะบะธั… ั†ะตะปะตะน. ะกัŽะดะฐ ะฒั…ะพะดัั‚ ะบะฐะบ ะผะพะดะตะปะธ ั ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะน ะทะฐะณั€ัƒะทะบะพะน, ั‚ะฐะบ ะธ ะผะพะดะตะปะธ, ะทะฐะณั€ัƒะถะตะฝะฝั‹ะต ะฒั€ัƒั‡ะฝัƒัŽ. + +ะŸะพะปัŒะทะพะฒะฐั‚ะตะปะธ ะดะฐะฝะฝะพะณะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะณะพ ะพะฑะตัะฟะตั‡ะตะฝะธั ะดะพะปะถะฝั‹ ัั‚ั€ะพะณะพ ัะพะฑะปัŽะดะฐั‚ัŒ ะดะฐะฝะฝั‹ะต ัƒัะปะพะฒะธั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั. ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะธ ะธ ะกะพ-ะฐะฒั‚ะพั€ั‹ ะดะฐะฝะฝะพะณะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะณะพ ะฟั€ะพะดัƒะบั‚ะฐ ะฝะต ะฝะตััƒั‚ ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ะธ ะทะฐ ะฝะตะฟั€ะฐะฒะธะปัŒะฝะพะต ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต ะฟั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝะพ ะพะฑัƒั‡ะตะฝะฝั‹ั… ะผะพะดะตะปะตะน InsightFace. + +ะžะฑั€ะฐั‚ะธั‚ะต ะฒะฝะธะผะฐะฝะธะต: ะตัะปะธ ะฒั‹ ัะพะฑะธั€ะฐะตั‚ะตััŒ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ัั‚ะพ ะฟั€ะพะณั€ะฐะผะผะฝะพะต ะพะฑะตัะฟะตั‡ะตะฝะธะต ะฒ ะบะฐะบะธั…-ะปะธะฑะพ ะบะพะผะผะตั€ั‡ะตัะบะธั… ั†ะตะปัั…, ะฒะฐะผ ะฝะตะพะฑั…ะพะดะธะผะพ ะฑัƒะดะตั‚ ะพะฑัƒั‡ะธั‚ัŒ ัะฒะพะธ ัะพะฑัั‚ะฒะตะฝะฝั‹ะต ะผะพะดะตะปะธ ะธะปะธ ะฝะฐะนั‚ะธ ะผะพะดะตะปะธ, ะบะพั‚ะพั€ั‹ะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฒ ะบะพะผะผะตั€ั‡ะตัะบะธั… ั†ะตะปัั…. + +### ะฅััˆ ั„ะฐะนะปะพะฒ ะผะพะดะตะปะตะน + +#### ะ‘ะตะทะพะฟะฐัะฝั‹ะต ะดะปั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั ะผะพะดะตะปะธ ะธะผะตัŽั‚ ัะปะตะดัƒัŽั‰ะธะน ั…ััˆ: + +inswapper_128.onnx +``` +MD5:a3a155b90354160350efd66fed6b3d80 +SHA256:e4a3f08c753cb72d04e10aa0f7dbe3deebbf39567d4ead6dce08e98aa49e16af +``` + +1k3d68.onnx + +``` +MD5:6fb94fcdb0055e3638bf9158e6a108f4 +SHA256:df5c06b8a0c12e422b2ed8947b8869faa4105387f199c477af038aa01f9a45cc +``` + +2d106det.onnx + +``` +MD5:a3613ef9eb3662b4ef88eb90db1fcf26 +SHA256:f001b856447c413801ef5c42091ed0cd516fcd21f2d6b79635b1e733a7109dbf +``` + +det_10g.onnx + +``` +MD5:4c10eef5c9e168357a16fdd580fa8371 +SHA256:5838f7fe053675b1c7a08b633df49e7af5495cee0493c7dcf6697200b85b5b91 +``` + +genderage.onnx + +``` +MD5:81c77ba87ab38163b0dec6b26f8e2af2 +SHA256:4fde69b1c810857b88c64a335084f1c3fe8f01246c9a191b48c7bb756d6652fb +``` + +w600k_r50.onnx + +``` +MD5:80248d427976241cbd1343889ed132b3 +SHA256:4c06341c33c2ca1f86781dab0e829f88ad5b64be9fba56e56bc9ebdefc619e43 +``` + +**ะŸะพะถะฐะปัƒะนัั‚ะฐ, ัั€ะฐะฒะฝะธั‚ะต ั…ััˆ, ะตัะปะธ ะฒั‹ ัะบะฐั‡ะธะฒะฐะตั‚ะต ะดะฐะฝะฝั‹ะต ะผะพะดะตะปะธ ะธะท ะฝะตะฟั€ะพะฒะตั€ะตะฝะฝั‹ั… ะธัั‚ะพั‡ะฝะธะบะพะฒ** diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/example/IamSFW.jpg b/stable-diffusion-webui/extensions/sd-webui-reactor/example/IamSFW.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5032a34941db9e9d2869dbeac97d74a52a945fd5 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/example/IamSFW.jpg differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_example.py b/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_example.py new file mode 100644 index 0000000000000000000000000000000000000000..a9ae1a103e59dd49e6b2e5aaca5f574531ed7fe3 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_example.py @@ -0,0 +1,108 @@ +import base64, io, requests, json +from PIL import Image, PngImagePlugin +from datetime import datetime, date + +address = 'http://127.0.0.1:7860' +input_file = "extensions\sd-webui-reactor\example\IamSFW.jpg" # Input file path +time = datetime.now() +today = date.today() +current_date = today.strftime('%Y-%m-%d') +current_time = time.strftime('%H-%M-%S') +output = 'outputs/api/output_'+current_date+'_'+current_time # Output file path + name index +try: + im = Image.open(input_file) +except Exception as e: + print(e) +finally: + print(im) + +img_bytes = io.BytesIO() +im.save(img_bytes, format='PNG') +img_base64 = base64.b64encode(img_bytes.getvalue()).decode('utf-8') + +# ReActor arguments: +args=[ + img_base64, #0 + True, #1 Enable ReActor + '0', #2 Comma separated face number(s) from swap-source image + '0', #3 Comma separated face number(s) for target image (result) + 'C:\stable-diffusion-webui\models\insightface\inswapper_128.onnx', #4 model path + 'CodeFormer', #4 Restore Face: None; CodeFormer; GFPGAN + 1, #5 Restore visibility value + True, #7 Restore face -> Upscale + '4x_NMKD-Superscale-SP_178000_G', #8 Upscaler (type 'None' if doesn't need), see full list here: http://127.0.0.1:7860/sdapi/v1/script-info -> reactor -> sec.8 + 1.5, #9 Upscaler scale value + 1, #10 Upscaler visibility (if scale = 1) + False, #11 Swap in source image + True, #12 Swap in generated image + 1, #13 Console Log Level (0 - min, 1 - med or 2 - max) + 0, #14 Gender Detection (Source) (0 - No, 1 - Female Only, 2 - Male Only) + 0, #15 Gender Detection (Target) (0 - No, 1 - Female Only, 2 - Male Only) + False, #16 Save the original image(s) made before swapping + 0.8, #17 CodeFormer Weight (0 = maximum effect, 1 = minimum effect), 0.5 - by default + False, #18 Source Image Hash Check, True - by default + False, #19 Target Image Hash Check, False - by default + "CUDA", #20 CPU or CUDA (if you have it), CPU - by default + True, #21 Face Mask Correction + 1, #22 Select Source, 0 - Image, 1 - Face Model, 2 - Source Folder + "elena.safetensors", #23 Filename of the face model (from "models/reactor/faces"), e.g. elena.safetensors, don't forger to set #22 to 1 + "C:\PATH_TO_FACES_IMAGES", #24 The path to the folder containing source faces images, don't forger to set #22 to 2 + None, #25 skip it for API + True, #26 Randomly select an image from the path + True, #27 Force Upscale even if no face found + 0.6, #28 Face Detection Threshold + 2, #29 Maximum number of faces to detect (0 is unlimited) +] + +# The args for ReActor can be found by +# requests.get(url=f'{address}/sdapi/v1/script-info') + +prompt = "(8k, best quality, masterpiece, highly detailed:1.1),realistic photo of fantastic happy woman,hairstyle of blonde and red short bob hair,modern clothing,cinematic lightning,film grain,dynamic pose,bokeh,dof" + +neg = "ng_deepnegative_v1_75t,(badhandv4:1.2),(worst quality:2),(low quality:2),(normal quality:2),lowres,(bad anatomy),(bad hands),((monochrome)),((grayscale)),(verybadimagenegative_v1.3:0.8),negative_hand-neg,badhandv4,nude,naked,(strabismus),cross-eye,heterochromia,((blurred))" + +payload = { + "prompt": prompt, + "negative_prompt": neg, + "seed": -1, + "sampler_name": "DPM++ 2M Karras", + "steps": 15, + "cfg_scale": 7, + "width": 512, + "height": 768, + "restore_faces": False, + "alwayson_scripts": {"reactor":{"args":args}} +} + +try: + print('Working... Please wait...') + result = requests.post(url=f'{address}/sdapi/v1/txt2img', json=payload) +except Exception as e: + print(e) +finally: + print('Done! Saving file...') + +if result is not None: + r = result.json() + n = 0 + + for i in r['images']: + image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0]))) + + png_payload = { + "image": "data:image/png;base64," + i + } + response2 = requests.post(url=f'{address}/sdapi/v1/png-info', json=png_payload) + + pnginfo = PngImagePlugin.PngInfo() + pnginfo.add_text("parameters", response2.json().get("info")) + output_file = output+'_'+str(n)+'_.png' + try: + image.save(output_file, pnginfo=pnginfo) + except Exception as e: + print(e) + finally: + print(f'{output_file} is saved\nAll is done!') + n += 1 +else: + print('Something went wrong...') diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_external.curl b/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_external.curl new file mode 100644 index 0000000000000000000000000000000000000000..677e87fd8755b6fdfcee6782c78d1ce88fe049c4 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_external.curl @@ -0,0 +1,29 @@ +curl -X POST \ + 'http://127.0.0.1:7860/reactor/image' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "source_image": "data:image/png;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABQAAD/7gAOQWRvYmUAZMAAAAAB/9sAhAACAgICAgICAgICAwICAgMEAwICAwQFBAQEBAQFBgUFBQUFBQYGBwcIBwcGCQkKCgkJDAwMDAwMDAwMDAwMDAwMAQMDAwUEBQkGBgkNCwkLDQ8ODg4ODw8MDAwMDA8PDAwMDAwMDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCASSA6gDAREAAhEBAxEB/8QA2QAAAAcBAQEBAAAAAAAAAAAAAgMEBQYHCAEACQoBAAIDAQEBAAAAAAAAAAAAAAABAgMEBQYHEAACAQIEBQIEBAMGBAMBASEBAgMRBAAhEgUxQSITBlEHYXEyFIFCIwiRoTOxwVIkFQnRYjQW8OFyQ/GCUzUXJcJjc0QYorKEkpNUdIUmJzfSo8PTtMRFdXZXKTkRAAICAQMDAQUFBQcCBAYABwABEQIDITEEQRIFUWFxIhMGgZGhscHw0eEyFEJSciMzJBXxNGKCwhZDU3ODJQeiNZKyY9IX/9oADAMBAAIRAxEAPwD5H0SJjVpENYxE7iuoNkwNK04ca41VbM7BRgSvL2kToDF4JCCwWmRBB9BUUxJMDlxbpIZTbFRJpXQsmaleeYpnmBSmAAcfcPauJYPtkjCoYyyhRSurTQE5UBphgGxBYZHSWdSzKVjZDQyKx6+RzPI/hhSKA8BI3iVZKKwaYKRVhqYUDA5lRTM8cCYQKKqFWM9EZlWWJGJLaTwKtwz5g4aftCANApkSMo0D6keWh0BSakhq1BHD+zCbEkGSyBq2+qsykl1WtF0VppDfVqAqc8uOCRbB9IJUtiipad00LnNUByJXnUlaZ/HAAdY9uzN13VEt5PMBNNCchFmavqGWfCnHBsDEsgmWMydpZhI7PdW0gpWHUApAUDLIUA+eeEPUUXKrI88gqupgOwBq7ipQKNQHTllSgwmME+jQhUshiarSEhlg1gkoaDqrwBwCgEx0I7Oqg28YMqRjWgZ21AEVqDSgPKta54JBh8c8JlkaIqkd2CrANqMYpkqsoA1cqHAhQCEKlIaTpHLAjOH4oJKhSgqBTIZYYCgkKQEZY0WJwXUVVNWaAE59XA1wxnbeVO2JFRY5oEMVxbyAkELWjFlzFDgE0dQ1SWUPWQa+y0g6dWmtc/y04V54BMUagIY+yoBAjDwvlK2RaQg5UFaZ0wwQaqi4ZJLQUjeMxvJIhLEA1KcRUgniM8ALQAE09iOQPA0RIlNKV6qDUDwKjMAfjh1YW1BRs0ncSORYdJLIz10qikOG4fmHHEkxQ0GPMmpmjhR/ti7LCUbS8bEEOB8q4G4FAKS3SYT3VtLEYrbtp2XjcMI2eo4UGTZBhyxCZGhWskcwiEc5R4dTRsxBZRn0kgAkjgP7cKSUAZJtRFwoEKpIWiaOuqXWMzpc5gH4YGxQCDtAHiNuy3NswkjmpUM4zJPDOhqtD8MEhAcgiMrzGXqmUEJWglDAVoCMvwwC1O1ECdtmVyc4YyasH+rSSvpX1wIkgUkqqAJpAoYRhrsipVloRE4HIDOvrgbFqKZyjENIuiUkLIiV0SKTSqjjQDMn1wpCAtft2aaKMPLVgm2yg6S0Yr00IyzOZP8AHAkLUUNq78kZMc5mXVMoBMcemhWorxqOWGOGFQQRl0d7mK4MmoMo6HR3B41qPjTAJyKSNGnQ3djkHatlocwv5iaA1BzFcsEiApJqmBkUUt20mZQTSMAqKrlXq4U/swDSBRzF0MS1RgWEKt9DcPzA/V6Z4W4bHlGuFEeVaREhWUmpYflHEVAqOGJSEBhrEqIHEcFxQxSuCoURk6Vcg5FhhNjDCSoSNitvIlZJFUAvpJzpxrkMueeGnImF6B3LnQ0brp1R2pUjpbOvHUCBx5YYkhTHIrs8lqYmjuF7AjcmvSR0EilGyqCMqYTcjSAKEEiP3qC2JEshGuNhnqIpnkMKRtMOhgDPLHraGiVdWOrtrxBJoTmcz8MCBpgTKjaJFeNu0KLGAaSivE504jKnLPEhQK7eGJe3dC4EBjYLGWoxbV/77AypyrTPAtBuRRBtwJ+9MLT6XZBHC+ijNyZm1dQz6eWGiLkOgj2+2LWayUWcNpsXcSHXU5tTP+Bp6+mHMBueg2iS9u/9B2DY/wDunf716R7BtkUl1cSRqvdbtdnU0baa0YfIjFF86r1NGPE7G5/C/wDb/wDL/Ibaxt/JPIvGvb2eeKOWTZ7KOfdd07MgLQ92WUxwgmNiHVVIBGYqMYLc5vQ1rAka08I/2/v24eF2MN75t4svne7WTvLHuXk167xRo0uuq28HYgFGpxrUZE4zZMr6llE5+E0Vudl7b7N4/b2FvsG1x+LQvBYI6QBNsWVWAggkpTWWJ6QvDgSTjn3tW/Q1Updbs+fHvF+3v2gfd92i8U3HbPC/dbZGmli8etnkvbG/ubwVSO8jkYyQxrqopQCn4UxbS8F/y21qfOW+9rfHNn2Pd/JodkiltvCbFf8Ave3Moiu7WxubiOzO7WyV7kg71yGDmqqoI01GOjjySYMtIYZ5j7Q2mxbBd3drapbbhapYW9vt7gvHf2l80skc4/xuuhSZB9VRTPD7mVuvdqNPgntq0kfjg8r2I3Mu+W+4P4/e7Vd6ZQLaTQtpcoFZXlLsj0HUFI4q2UcmTQliVp3PtT7Eey+3+3/iu5+MzbNb3+q3tb7z68uSezLeyL3mtgwzcpQVAyUH1xy8q7lLNtL2q9WRZf2tSe5u7b/5Dvk1/ZW26xx7RtRtjBa21zZQOHkuDF1NHR+kAZtmRQDFXHxuq+H1knmzJ9TDnvd+1DyvxG93au8GV0vZBtm8X6CNzbKB2pDDCJI0fparNIA1AdNcdGvKhwZ1h7lKMa+V/wDwzfD4ptv3OOz3fa7DSbmxRkuEXU1BKWiIIWrA6WoRqz44348smbJx2upG186s57tVuY/9Od9LyPPpIlL6KozAAgUyFcaa5mZbYIJfb3m2zvGjEL95125jVgxktlAVagnpBOR54t7pRT2tDn2xGJIWNtIdaTSCKXVLGi9RIkXSNDEnKhNRiRW0KJp6s88bHtSS6pO5QrK3CMNXMZca0rxxIiFgIsoM0iKIYVBkiq3bFdQMdQQ4OCRwdDmNy1ZCkrhlt6FkYH6QSQNOqvrhDaDbW5uLW4E8RNuykRuHbpjKgkAnPUDq4ccS3ItCy2e2cXZNLWZI5H0AARTVzPCv/vP88IWozs7sscjRalai/a/lAHAVrxbnhMlsH0OsF5FieEkSPqJGkitSCB9NRwwoGGICdDQgOhBj7Zb6hkSQcqGhwADjMbSXI7iaIpBphVWOqPT9WdaMDzGWAQUzUch3S5W0IaaVgK14KopTiTxFcAAE0lVEk57gTW7ItSiNmpFKH8CMKBh4LmN5YFLODGs2oB1D8jQdVQMzTDA6YdEQDKsMrARwSE6y1GqdQ+Na54BAwOpUIqbp2aO4fMimRqBnQ8aUwQOTmiOJbeSGaO4mHVPACaTAGvGuRGdQcMNQLNHL28zbRglri3Z+sAnjlyPLPCAEsugSwaWeb6c1NGStQ7cc+QzGCRQzimWMQuYxKKubS4IIZi3EkV4U44Y4E6xtIZYS8U5c1d5K0Rc/pK0zI5YIQg4ukiNbxSJNAUDJOx00KcQgPoMzXBI9QqQqqjR+qsjq8sBFWVFXjX58sIFIYyNJCFi6rVJFd5NJDpqodJDHMAZ1w4AIpKzMq6Cbx6pCxYMafSRXNQBxw4ECdVhdY0ZBLFTuhfp7IFCCKZV/8HCgZ79P9aJdXec0VBQBKZV51HzOANTgbsgr2mmilQC2miFWoQNKZ8iSRn/HAG4WbhDEHeRWdVEVsqAgV1ZhwTywADEat3CSgRv6qt0UcGoSMgipJFKHCYzjGaGaVZwo1ArFcR1Xto66kWhzzzGeeAAAlkWIRvDKX69SkqFjHDKvBqZ51+WADpmjMbrH/TlUTtrz7Z4FiuXMcP44AOPoRS+o9wUeSDLTIlaxgUJFcixPwzwSEBLK8scNuZVhkYFhG+QkLCnURzK8CMAA2iFqS08sUjIBEGjDB2yqmkCoqtczwOAQSqmRiszJqD0Uk6XJoToFMiaZ8MAHGcDrAM0IKiJPpZWX6SxPEGn44cjDV0gSIJP8vcgFzHqDRq5oc/pqNWdcJsICFWKFDJFNqgkGnvRBh231GoqQSyk14gZ/DACZ2io8zTAKNHVE1AyliF1KRQBjn/wwIIPREhu1DCrasoSylXQqDWorRwFOrjxplgQQJVpIsUZYpobtytpOTHOnDOmRLVp65YQA4ld4Jo2kKTKG7q0ycV+vgBxPAceWCBHJAY445ozEjPGBbla0IQ11MHHTWvA1w5Ggl2WFTKjkM8SFtYFGJGb0rUZ4WoHGaGMMhMarIrLLLTUFZiTTiOHAnAOA2ocgyLFbM6qlY60anDTqyrlnXAGomDxXEs+o6UjZdMhqEVKUrJzqfTBAtT2lO0xuaERZalFFC8Qh9Sxz9cMBPb0dZDOlXoV70YoqFCSCGBzyp+OEIVjXcFTIriMKFFwwGoVILF+RqoyAGGhCJVYpcl0LomcFxECgCKKqpH1VPyrgHAN2WaRFmKLGqEkVpI4Zc5aJzHD4jAx7FUtJHAgiiZI0lzmkLF3VXyKuQKUPEH8MRRMH0FvuFKW0UPSaAB1Zc9Y1c/nywIYSElbu5se2e4Wc0DKPzKTwqT/wwwkVMHE08j6mESVpQBe6BwX1I+WeGIHHdRrEoIDyCrNC2RJyARTmQAwFBxwgYfC1I1lUxyXDK01HWocFgtDWnHOgr6YIEmCj1duSIL21oJYoZOptDnqZWqczmMCJg0DGREQCFXRjNFSsZeMEaKjMtXMk4OpBnXhLFGeIOY+126NSQNSrZVFWoc8D3Ew9ZQ8LlVqrzBbeNHAjGmgOrIHIVpT54TFIDtlS8E7CV3GkSAjWQakSMwy0kCgqMKQiQ8iZs4dcawLRJF9CArF/T1488A4FENvK8aW8aKCxrI1QFoOCknKppmD/ABwwAhxK4kWNLeKJDNP2mABZT/TFaBqUAoeGAGKEWS3uENFfWXHeZdK9WfVQnUATwrxwCAowt0EsjrbS9xiLRa5tUamX4n4/hgGDSbSRLGtGMx7lyCO2CRkNJABJ/jgEHxlolhmVqRXUxdCykHWctJr8s/nhjbOBqvJLcSKwV+3MVyYuDlzzqKVHwwgkVJI6vK5eIvKsisJFGkKpyQ1qKelOfPDkQMtH3mMUpNYqWsbAk6WJJBBBpxyw0B5noY7dGE0cReaB6kSd3nHGOP1DjhAKjLNGWkmMcs0hV9MxMjCUZZmuX4nDWgok93CsgklihLKqNBcmrJqHFCM1pzwIcHdSSJeOugiI5XY6mBYgBAuVK8PTlhkWoBRyyqVbvG0WAJDcQhw+YNUAqelFPLjgGkCWBFW6pKjIHAkt5DpRyDUlGzNAOA50zxAYJV7kWpVMroC8UUytUw8z8FJGWfxwAw+OR5lEjgtGAVlYKdCOx6f/AFFRwIwwgDm3fWaVBmqrKudG5ZCvPjgAExaOOPVpmWLpM6nQyMrcNIBqor/4zxGRMUjurRCImmYgu5UEyR1IAHGtONaYJJA40jP6CsLmC2OqB8+4tSNK6hn88Mi2Fokxjj6+3PNJWUimSJU6ONRnwHPDkUh7IVR16nmSskWr6xzOojiPTCCQuJZ9EhSVLkEAyW1MwteIpQ6iMjhwMPlnVtVyAHVToCZVIGapSgDAmpI/ngYCpIZ5GRW7EtwCJhGTo+oUCk8QFpkPTCGCKiSJDDCVVzJIHkotaABmiJ6QCcjTDaDRAQsrxqECxurduS3ppbWy0LqWPEDnhpDbOuSnFBAsuRkoWiP5A1KUJbjl88KCLBKjEzpEql4FP64YFS5ahKk16jkKDDQkdhLRxoiqDL3VWWYAvVjXUgFMxpOeFIw9203S9ldMkjGLtMBpkkHED/lAPrx+OAEcRmhkLCEyRhikgQZhxTNWBFOZbA0MUW6usTRC6d0QsIleOhJOak1oW6uA4YEIb55HWKdxA6CZv8xKV0gGoB06uFTzAz4YY4JBGhvI3hgkV5EAaCyiJpLShLqNNUYUoDywweiDjtqG0nmvbt44Y3i1tJnobgJJgnF/RRxNK4Vrdoq1dnBdNn7Obbsfj9n5t7q30viW0bkiy7B4YsX/AOEG7LqqCasJIIplHQxFSeBJxg5HKg6ODi66m/vY/wBq/dW8tdruvBPDth9ifCpDHcXPkN7bm93fcESgV0s5kjOpl09cuiorUHLHP+LJrsab9mPRG8fH/ANg8Zupt0e5vN33acqs/kW7Td6ZVUdSRBVEUCk56Y1UYGqY9Wyp3vfRDJ5z7g7VtO1T3S2cu7xQXCwPa2rwkOxJoQZXRSopVqtQYxZ+VV6I3cbjWTlnyg95v3PTbTvG+Q7L4Zv/AIhcabmbyqe23S0u9rNzPpWK5u7LrRZUUE0iI0khmBOK8WG1nPQ2Zb0r6yfObzT3i3a53O03TZvM76Kd9suLZ9uuJiLqBGcs0x3B1U3CzSGqKTqXPOlMdbFgS3ObfO0Re396PLNp9wo923F7TyS8sXTbJ0vxClru1gCtbW+MRZXicBa0JUsK8anGhUSM9rOxpTxz3r2G+i2Dx1ri2sttk2fd9v8AGIbn9eXZbu4u7XcdstZJKs0kVtcRhI3bikhXkcDRHuhFs+yfmfhW4e4eypb7bLDPBu0+/wA3iulJbeHclijgji2w6gzKRMRJlQCJSAc6YeXKRpwKWfWiDyxfK7ifwLYZLWXdtuMM3m88HTDt4uP1jHNJUoJKkBlrqBFCMch5rt9pueJRJb1vvW0jYvt9n3S1uXsR9nH9vMpRp4Qo7YYNWoBBIAzxqeZKmjMnyXa+pg/3h3m7ubjyS73vavIfINusme4u90tpYLPc7CWICM2sDNLGgUu6rpaPMEmuMVbd15b1OoqxWF/A+SPuPtO1bdcaNq2KfZ92sp/tN/vXuBd38q016gYXkBSMkL+mjCg0k14dvjWbW5gz1e5lnfdzsBcXllvd01/HCFGzbpbwF3YgFl7zTAVOeghaHLhjfU512R2z8g3TYb+MiVoIotBlhRzoKgaiUkBK8+ZxarFTUlueN+Zbfe9EpWC3fR21qGdZWILFCfr1cfh8sXVv6lNsfoWva30d1ayTd57pLh1RX0iRmAzCnSCCRTJhw4Ytq0UWqF6PuAkeq3ZXIZXVqMiIKkMMjmDmOWJLUQcZnhZ4ysks7yle/OrRvGKZB9K5hR9PpgAAs+qOR+6od9LFgqo8yc2VeQXgcNCQIKNAEdsrsralcNWi8aK2f4jlhDD4oCZGSNFeNCZVUmjK9KjLOtKYBNnYgY44pZJ2EMyd5pgvcQFQBoaMcmJrTjXCY0BkUjvFNULSFDNJqICK3AinCtTX4YAPNEqBLkSpE4DCK5dOiTSaMukA55GnDCEguJ4jJFEvbRncpQABlYmq6WoAK8ScIkHvOAIhIsdvBqcNEDVZHJAKyaVzUsKgk1OBggEmkqJIppLRowVifg7AtUtqI/v+GGgkMlhrr0N9zcE6FZQUFTXpUj19MMQIrKLiWQSNMo/Vd+FeRAZcw3wHLCAAYyJLdYdWm5LM0Cleg1oSWNNIJ4muGMA07NMrZ3iElZHp1GStNIyqQMJgCB7jSs8qzLACrGMEkBq6TSmZB/8AdwgC1aT7kLKR3kZSrPQa466Sq1NKnIg88EhAYbh2RY3QQrKXa4EYGtmDZNSppqAo1OGWGAAQd6FQF/U7ivrjodIJyAXKqmgzpgALdWArK0c5DFGeHIkg5Smhy401cMABkoAiijkesZOiSMmmhzmCq09TzxKRQBq8bmOQd1mTtaw9C9DmrDPlmT+GAGciWS17SOIgyHQXVge3Ea5nIkmpwgkFIXVSWDB4W1NPE2pmVhQClQTwphDCnWZZYYl0QdJBjpqqzZhXpWlKgD+OGME1vLJbIkCr23JcSBgo1qfrZsguVSBgEF9MokjkVDEwCW9wGBWi1rqrTic68jgBBZmIa2JkQSKNMkmmqMpYDU2YJJ44jA2Gh5YNSsURIfrkelX/AFKiqkkB/T4YkITtqQS6VYTo5/VSmmNeegEkAU5N/wAMIAJEJniRCJbctqKKBSfWepdXOnqeGCAk52irKqXCtApYtG+TCh/LWlKYEEgzD+kEVwjMzG4lFW06s1CjP6q0y+eGKQQWYiWG4ihe7UiB46KAYwMtDAMK/I+uESC5maGKSSWRZDcCs9qQek8FVuo6D8vngEeeQ2a1V4EeIK0kp600yHIFeBFOFc+eGPc4vRdRgCNRoJmQsNBJHQA1AGKAV/lhCYTHFOkQaiyIymdA66avSrAZkqW9DX0GAcnFB7LvFTTrCyIDUihyQNyIHVXCkDkxfSYaCIqgluQWzjVlACICKFcuB54GKQCo8TmVJHs3IVo3alG19RRswCTWtCMhhpCPKnc7rFqR3IAmWVatRMixI4g5HKlcJkjivq65Chjj0xKzKCO3KSrOoGrq1DlwGD3gAieDQIyqIqHqj/IygdLsGORoM24EemAcgHicI6rEgeUuAzn9RyCCqlTwU1qCeOHApBFGeOOKlHb+sqkjWy8MhxkY8a8vnhCErK1wI5El+4elAhPQZKAAtwzPpywwOyl4hb9yi28QHajyKKwGWqnKuRPwwAzk0YYXOkkMKMS5/SDUqDXI5Dh64BBbBtaNbuXdmUSUaq9zjqrxANaAj5YADlMMizFYxcFWP9IiNw7cWcCmQHHlhgVKpuXEqnSZLdu/cOTSN1C8Dl6euWKi1nv/AH3cPEYxIw7WoAk62JKvTjlmTyxJERR2Vle6ieNUjmk1anOTIp/kQafgMSQASkrLAaRmUyU7sRNZJFFAUqCAacSeOGEiwytE8UwaORTIzBIlDGNmA1Vp9ROfH8MJgCUSRvMIFV55+tZXUUQA1DamNPQU+GAAUuhZIrapuAKHtlasklerU5pUcMgPjgDuDjIL5pFWY6oY3QAZ9a1AJYVoD/HCBvQ8+pu3M2gTxyNLFbqlBCzgHMVyB4k8sNoTO6tLOCkTSSr3FcUCutAS9R9NK5HAJB4gCCBZ2V7csslvM+nqJFFAyyFcxXKuEB5VdZyZmeXuSFWuqAs4RcjpFM1z5cCaeuExoFGWEM0MSpKqAJFNFkSGPCQsOqg5HPAhhphhjVu20lbcrIzADtawasgViM+Fc8MQdQSsHieNoUcyQGulC9ephUEDjlxrgBnIv1WuVUmeSY1qAA0iKwDB24KBTI8cAg1RIYXnjVXaI1SBqHoORr8DxB41wAGlZHkEqSBrmMIO7JRlkRx1FVPOgrl6YSAHLLpFYnAHcAERFYGUVAYEitQvPDCJFOvto07qZO0umzLUqFb6sjxB41wwYKMSOkkMjaZpKzKstdbUNNZccKjKn8MJCbBiRJB+ujONYd0FcnA0hlavAUypgGcUIxlk1LHJegNAApICinEnh8sMDpcyrGheSiJSoXTCJAcjpGZFMEgGzzuoSVlWsTmoWoOphQGhoBx4YGIOVf8A2DQK8kqN3LiagLAcSo9Rw4YTQ5PRrEHjjLJLHbjUt1Mq6FU9NBQBgc9JGEkJnYYwkUivHLGQ+qrEk0qdIFCNQPEj0GG0NB4llMyh3Lrbkr3x0gAn6z8ATlUYjIw3uqtu0ayxQPIC6Sw6S86qc1ao+JFeIrhiZ5VKqYzGJo3i0TEfQvIH1NOFBw54AgNgkf8ASfUYxCjQl4kzSo4fSOkcABxwADiIpphKkkySIHGjSyCh+YPpzwxAWKGNTEge7nYGKLT0LItMzU0Bpwz4YBA2Uu3YgZnt2UmWXVqHdBq2bUNAeWAA+OSBomkCGMKoCQE9MpP5iwBK1rUj44JDYLICMIpI+33CCdBFZGFBo1f4s8m+YwBuGvFEr6XnK3MOl1GmoDnLTqGdKDL5Yj1JHZn1RKruiSBwWjIcFzSuoZcAeIHPPE4EHBZC9RbCUhv0hISWBZa1JPLnngGcEdZLeS4uZCyisrKQVJrRQKUHV/ZgYoDgJI2CBItLKWjotQPUnSQvSTl8cRbGdjDxF1gnSoUspIzFBQlQxJOommEAKIMEmDQHu3OmPtnIArnnnUCufrTjhgGxwyS2zySQrHbyA1lHRGz/AJXVqmtCKGuGByAOxjhniRwlWFzqTpcA6NYA9eFOWAbPW1uDIJtZvUjrFHOlCYZV+sFadCgjI0LHDRHUmO2zzLFO9nEkFvt7G4vLqSOjR9xe2yv+bnUKMyaYVsipuSVe5wa19kva7dPGtw2j3H872p7Lbraf7r298QubaJtz3y4GlVlNsxfTCldQdxnx4443M51dlv6HS4/C7tWfUf279q9ok3ab3E8l8eG7+bbnqMl/uTi8G3x0BjigLFgCv/KBp+eMeCbfFYvyvt+FGgtPaQsVaRtOooTQelcq41WvOxlSGDc9nhv5EkvFlkt0AkFsjFLfT+fugGjZ50rjNbjpv4jTTK6r4dypfMH3tdtvNq2TaPF4vHoLefW+/NcRbexcnX3IooS5WhPA0OZxTlxt6JKDZganVts+G3vru3g19JfbXI/iNnVrgX1x7ODyO4tnaLNu/HddqxcgAVSjVxPjUc6t/dp+ZZnvVKI/eYM36PYZY0Txbyq03hJbJmvLTc7Qbffoqo5aFSokiqQpGnuVrT4Y69E0cu8EDuZLyKGHb72J3jS1Ee2SMUIgIfu6kaPpdakgg1K1ypicQVTKFG13l8GDWHeDuGlhGpRNG0ADiVVXVShFTlpywmgNO+x3me6bT5ZL5dZm3sdy8fAjga+DC2MV1IIrq5hu4wid0E0jWoqGoDljLyMfcjTx76yfYT9qPt35rfeMWWy+R7ZJ474wl9Jf3TXsk8PkG7Xs8rTd+7VB/wBOySdHUD6HiccW+B2tCOjbMq1k3F5bZ7Zs/iYhm3C42LaLOJXafabJWkV4iFVwCJizj4ivOuLOUlirpEGbj2eS58pP3C+5T3Y8l3Xxbfl8si2yOC48qj3M7VuNlc7dbygGaZYkSdJ4wKCKRSxFacMYuMrXfxI6eTsx1g+aHlHvJBdS0htZZoLiVXW4aBI7ia2bXEI43iVWMcChdOQJIoeGPQYcTRyMuXUpLerqyjm3aSwuPvtoMzGC5ZQr1eojEsZaqkZ86inxxtSgyWcjVtk16ltBAb5rLabW4Vpe2BOraqr3HjIJKn8wblkK4mVMj19d7hb3/euD2p2SsMsSKiuqk6Hj0gCn92WBEZLE8c9w5bf7lZNNu9wUEqxKxR+baVqKMacsWVcCdEy/ds3VN8t7cxNCEojSCQIqaQCRUnNW+GfzxfW5RapLbfadwvLi2t9vtLi7ublkiS1ZlbuOaqI9ZIzHPPnhyQiEBuduudsuhZ7tZ3m23NsGQbRcpR+2KkaVObVAyrxGGRakIgCos3fLfazSaGWJQwA/xU4gilKDDA9IzFFVUL24ZjCkZqWGqhEjPQgDiKccMAplgBJLLC6hTb9nUwWtVDE1yBFMIDwHbhm1oxkDUldhkumlHdaEsRwpiIw7UEbQszBJY2V0daomrqDISRTPKv8ALAB2JkndmaGSRyvbmGaFyD9QrQZU5YYBay/qTgMiS3EqiS3C/pnKiuaZsKZUqKnPCgZ5W0hGIEDWjkPDINaNJqIoStM88lHDAJgoC6xxGNQjkPE6S9UeomtUAqQfnhgciKyyJbKwVASs4UBWZ1rVaGvUo5k4UDOKDBGVaBo1eireg6qxsaKCtDWvwGAAbERRQs9uZEjJrGW0kHkwPKtMIAuQFlSZAkciyGkiggPJkR0Zf20+OAJDpFg1BmQLHMB2ncg6GFeIIrnU5YegpAtH0hpYXY2a6bdVqhIY1o5z4jL4/wBoB7tpJHI7EtIsa1LjUhXiEYAA14g1wAcDQyrJojRDKqomoBSoOZjRgKaRz58MEBAU3ag7YlimYRIXeVAGYclU6eIHP4YaAUh2t5DPc2gTWO3awKBIFSQDVUKcyOOeABMUjSa4jmMYbthCKHSyCmkDmeOZwCDI7WQAqKkytp/TcER5dVTka/HhgJCYxxylVjR+BKzqaF0U/moeJNczhAzhIc6dckSXaFnDDpkPClSeKnAM7pXSrTKHaCggB/MATqpTh8zgEBa6qGuEcNN0lI+JiBNKajxFOeAAx7ddLQ6DH923c1Ggc6CcwlMy2o54BBOoq7XNVIJWOR9NBIVFNK15g/2YBnWjIige4jUamKEqumZ2rWioDQDLL1wxAUmj1LJErm2qYTJkxkNOoqORHMYEAndmjjaCGfWgB1nSFEYrV1B5V4n0/lggDwWMLDM9DDP/AEJ4W0lDw1AGuZIANT8MDGj0VuohTu0GhlW9AajBQaKpalKmtT8OeEDOiOVXk1DuospXuRmoaMkDpICg6QMmwAFRxwGkUI0juOxlB+twS2kKa1pxzOeAUggUulSbKEFmlnQnU0clNKUApWoFaEdOBDkAFel1PmSajss9GAVq5ZAAV6v5YAAaI0gCS3Oi3ir3YSaksxyV+YJ5Uw0hMCwNEmQsrgj9KV+4sapUaWBP1Z5Z5/hhQM4dBYNEyrAhDquoOk2o8KcgCK15U+WAJON3YdM8scYFqgYqrakkLigMZyoc6Zj54ABIbid2hdBdPcQiS5+kcc9LEk5UAz4UHDCBhY7M0cTK5RUdVineSpkf0BGdBx+WADpZ+7OYSGXu0kgkzqvNloa8BRR64QITTK6uYXZVt2KuZ2UIApFSwUVKjkQc8SGGMvbVBKv+XnYySpHQExDJRlQ0Pr8aYCLEzPNNblrm2ZoYwbhclVdFelcqAmmQPEYEEHXRnFTpkmc9yGAjtntj1YnMKOY54QzrRwiQ3MlQpJCspGlmYEioHKvEcDxGJCKqXvRrcK0ry6WV1lqCHdhkHXPIfzxBFjYoTUkmqVjG1rUT5ACNnNfQglufzyw0ByKaiSy1MsndNUK6ljZgApGWacc8AHNXYj0S2xltFQfeWSKB22JycEEEVAwxCtERe40EmpXo9tUHJ6ZyKTxKg88AgCWwdFENxrulB7cQIo8jHVqNaggA1rgJSHqC0i20Mv26SqJZJAckFK6AWzq1K8c8JSQDol+5ZJLZ9KKSGgyUuG6QXIyoTlXDgYI9tnjjSFzGhaJo4wCkgbqyYZ6A3GpwQM7plndXMioVcIe6g0BAahCFoWJw2hAohSeC4dY4/uGdLfgVFAanSTQgVy9D+GIgdUJCsi6mSKLrulgYuNIoENa1Oo0OWEAYDG3YeRGgkjlKrIgL9zSQWPTz/DDFIqr9uW1wlRO/VG7BljT/ABIAKHVWmfrggDsKArLAWCz6yZI1IOgA6loX4L8AMApD0lAXWqSaYXBnlQqEIIyagrUZ/T+OAYJkgokkwSC2SM6jG2qjvWgABrXKueAEeVbdZtMcmeojU1SEelFYAZ1PE4QMOWCRYnjd/wDLxNqEilesaaFVPIZ5V54YhT2TKIpYpwDoJjBZf04gD0j1OAGwrWsjvIh7kckbBg51ZZVoMgQaV+B4YQIWK1EMvckljYaVOnMoM2XTxqeRwEgCwTLPqjhBadtSGTJQFUUbUMjWo4DAKQhY4EdBKzMpXXKrN0GReIFK5+g4AccOSI7PE8ksyRB5kyVkKqrliTVgDwUHKowDCOplkU1Ku3aFwq1K+nbrw6uda/DCGmeigh7ptVRO7IGKBCSsbRkgmjkFmbkfwGAJkVRtIrRubcCXttFakEhVIGbaMtJNBnwwMTPQCoeJxKsjgNEgZUJbkgJrXOpNcIUhi6XCCaVI5VOuNAOrWOIOZDEU5CmJEjyupj79xMyW6syBYx09dcnoKhq8B8cJhIaVoIEkdIbqGjRJHpKhTkqluBYZA1GWAYq0skyMkkZe0gcv2hQhg3In/CDxwEZEzGYCJWVtVsD3WX6irV0sTTOpzy4YYpFMXbZ+wFftRxkXCKR0UoSjAU4VqTgBAFd00IAsts7GjZAavzGhzAJFK4THANYxVUnIZYmo6p1DSQKFa6ch6jAhBhjhkTRG5empJJHJ0MQa9JP+EE0wQMUI8yjvwKoLoIzMxV5NXqDWmk88SBBUA0dxSsncV9ToR0krnkTWvywA2Bkcu9JUDSXNCDpICtwZcvpqOeIhIu1FlljS3aG606ILtzpUpkCnbzA5nhgkEBgEaAujLE2lobYA6SmggFhUCtSfzGmGByELRpWjNxcFVMhroagIouVRU0qfhgkIBy9uTtBlkkgRiZLKFtSxIwAzqagUA/8AGWFI9wep5biJ0CxSMDELkZIwZiubdJJ0j0rlgRIlnjXj+57xudvbbZa91pImXbUWTV9zLqFYoUyMkuquVeOZwXyVopY1Sdjd/t97ebZ7C7bbea+abVBf+f7rA/8A2n4k8cd6NrmlQh5b8MwMrMVWg5MQMee5/PW1Tr8Hhd2tjZvsn7Zblf3tz7ke4ga68pvI3ltDegw3Ngk7VWKJAxWKo6qfyrjmYK977rM28nJHw0NDp5hZTXR2HZLQX1zYaVe2LNHDAgYq7vNp0MVPInGyvIVrdtTG+O0u62gp8i802DwnbbvcPIN0CCNGleZ4pZmK8jFHGCzKpNMs/wAM8SyciuFavUWLjWzP4UY688/dJ5JDtz7l4r7e30Nq6xvZbxfLeyX14sgGg7ZYW8EsjFnZU/UYJVhVlUE4wW5mTK4ro/adfFwMWJTe0+vsML/uA9vf3de820+Obdd+33lnlu8Xm0HcdxV7xdm2RbZWJe3ggEkZbcomqJO8NAUaY0cUc6eJS6t/mpt+79tPxKeRmw2r/laL2ny+8x3Dc/BfIIJvFvdCDyptss7FI/JvHzLa2ySxRKz2JgljhMjWjDSXMZD8amuOzWi9DkO7e5TbbtcSx3FreRxXj3U8l9JcyqBdd2Y6pHWZTUKaV0nn8caEtCmWDgla6AsreKS4M5AtLRqzs3cNC8RWrKWp1DACaJj4jtN8+5bbPtssMl3tErvdxhmj7cVSrpKwIOlhlnTj64LVlDSL/wDbfcY/DfMNh8sm2h7Qbdqm2zbXtI9wgur1OqOR7PUn6NANXHSF1Vzxk5CVqtM14U50Pu97O+T/ALg/Oo9l8i8gn232+8OvrCCTam3Kwpum5wsGPetrdJpFgSgBQNTopTHIrTNkeloqbMvyaKXVtmwr20im2a2jv91juJrJ1ubu9jKA6qaSWCtwNaUIxqy0oqdtnJzsd7O/dVQfIj90vgPtr5V5P5I3id1LtnuBuDpIuy+QW62O339tGvbaSxvJViR1XMZ0DN9Ornz8WWLfCtDsVxv5fxHx38+8Stdonlu9quzeS7ZdSQXFsQyXMUUIU/cRigR49epVCnVlqIzy7vHyNrU5fJxKrKimk3Lb7yOeUPa3TxpNFJJGVLKwqJSpFHVuNQMa0zHApuL6WeS53DaFlg3Bo2/1iCFVMTITnJGgWnbIpVTzzwxMjr3k5g+2LVtQ+qFXqwBAz0M2a14kDLAINiIWGG7t5CrWjVmhkYakY0o6CoqCeIwwJ/4/5l2bq0n7w2/cpC330xCG0nArnoyCMFyFMsNOBNSaW8U39vI7UWndlM9oUaXambTqqR1oA4J6acP7MWVvLKnQloligkOr/UZWtFCQd1DOe2DpBDtqpppQAjJcsqZ3QitpITG0UHTBKZLdpF7lzBUK6ilToypQ1rwwyL1F1ptf30W4fb3ljFIqtMLC7mMM92qEUWBiNHcNahNQJwQKRtbTawyR6Zbd4WCzIAKhq8WXhkBmD/bhMaQKmkWzKqElCoiFREGXNmNRlp41PHgMDJQER6GRqQqvZQsLIkqtTSpdRXKmfCgwCYZ+nJHA0Lr+Y28jCQySkdLqVJGQJ5ccNiOxMFioiERItZlrXWBQnTzoGGVDl8sINjkjTFLfqZGcloVemlqdWvTw1UJGeABUxk1Grt2ipeB0pRcq5LnSvP4YJAIR4xLKxte40RUorMaFXFGDqBnnmKYQSCaQpGsZJ7DkvbZFxpFdSgkEqOVOH44BgHOsREuzGYgwOTVYx8vQU/MMAAmuNJmaTTBJKFjMoSshANNSA1yB4YBAAZ+2yBC3eJUsRUSEEBSGFCDSpw0M46Rka4pdMduOoAv0uODBXqWJyryrgCAUccjymS31QvIopFGdLGv5jqrUHiSTgCQyW3lmcIWE0kdfuYwrJ8edAKA1NMMDhcmOSSJpdEkZELsAyySKKt6UQAE4BBOiR2VDCxMyqFlLa1lXi4Q5UGXLhgEDEvbKqqhoEXuQ3B/U6ac140HoeOBsEcjVEqZx3ElPcSdT1AKKkakzCt6fhgGtToOiSM0du5U2yw1JCGh7SDMhaYQwtA5IVwJzLKRE+oAhzQUpWmXphgwqNhScEslzRqSAZOqnMKp4caGuAR1ESZ41SB45W6ZoowAqKOoK2r6tRzqPlgaCQDS0MgmXW0lasoZwumoZI+JFOeeAYEtJCBA6JDMKEShQQ3ILQZfj+OADkcNuzP3ag25ZrguasEpmVHM+teWFIMA9w0OtHZ0tpV1QTEf068NKgZEjL5YBAdKx9xSgUAF5JdQJMDAAhTwoTxOAYKRYRo6e8IW/XniDLGqioQAZ1ZD/AD4YACHEjraSTlZ4GIj7iFl068tTU4nlQnDA6dLTMUj1KqFS8ekawnJdJoAKZ/HCCALOZI6IadpVmjcqKlgQNNBXmcyczhiOyJJIYlmhJknkKyxmnGgJdxGOR4YAkBoMUwAP3EoJFyoIDSEggdwFhQAUrTPnggYWBFIgENqYAzVMTAhgmRIzp0knM150wAGhgyCZUE/ecGVQvbKLmE0gE+lF/nhCCwI3IuGik7M4AuYnNQp/wIooeWVOOAaA9thKvb7Km6QHtPQKaZA1IqAOAGFAwLJGY5LaImXTIgM0tA5LEnSuQ1U+GXxw0ILlMECypC/dWXN4WYdNQMzmQKc9PLACAskS3CSSOFDgEFKN+oBkEqMqHMHBAgEWo96F1PckU/cLOygPTJdROQY+gwDASSFlka5Yq01FR4qaKLzoK51/swADk78wmL6ZXXTMlrQh10qRUHgaAVIp/A4JA9MkJkhl7sjyVR1CUOpG6W0MclUZZfxwAct3nhi7GhnkZmEcgqXkjKnJS2VFpkeWGhNFWokfbRR+jHDJplJBTuvyBAU/gcQRY0dkR0aeKJ6xgfrCTNEcnIMRUnT61plhxIgRjM5jMcDCNqd6aojWqcDQU6Ry9a4ABQPIZ06AiMRoc0Ielc5DnQMTlTAD0B2oaQhaASsXkGpWVajIUGWZpw9MA0Gt2zA4RWDTGtwGoEWhykB4gAjIA4YmDpFK4WeYO0yaVIPRnlpNMyeWfDARQZ3E0NDIyGaFSjNGSvclXIRgkH6TnTANnhrWCNmJhECUjIejysD1kA8aVpx9TgkUipRNIjFXa2lmBIBH6RQgBuoDUKkUp8MNjAShpEeFVWSMnRDDED1R16nBJqCeDNzxEDyr9qZ2VincFe22SoeGkSA9RUCvxwQAfCxhkD20RClO3rJJkYUqAsZ/NnWgwCAwCPUjvKYyVqIQCXmfMZECgJ46RgHAq7U0jxPMhf7pO2rhQHUtlnzBpkTh9CJ2ByGR44e6Ld+zIrkjVyVvmf5YQHkiTrjXoRWEl1IQoZWU8MshQc8AxQSYmMxhS2juFDrc50DAHXmM9IAyrgAEI1jRGcBe4Se2dIUqi1ZmB4UrhAKgGWFoDBqfpltJjwdaaixzGfzwCApIh1JGRCucs12RQdPFQKEaefHAIHGy6ZHgjjjRkHcgbNGFSQCzcak1GHA0GaB3VtrgNEsQZyTV66h1LwpmMhhMexwNFOaJpiJZGt1UEnSeAYVyI/McKRTAocBQDIyFWpFOyl9Xb+BXPVnU+mBBuHRoqTPB3iBE5khQVoKZspGYbLj/AMcSQgAid4w6ws6SSD7d1OlmJGasKjgB/HBAxQEUzJHGkkqywhUWrKwbUasQeBrxr/PCgLAixmWcpFGZkQWyt/hBqCyitKjjXBBGA1VncQSmRJEaLtK9CGjjXJXCkA6iRmcNk0dWsxht5TrlorwtmI5A1RVuFWpnhBAOIR0R5Ejggi/Sigrk2mpRTSuY9eYwyMhp1mVehjK47hNDpqwzZlFKUFOXxwhgBEw+3MCn7tgRp16UanNic1ArWhw0Jg3CSaYnaJYFqVck1aQGuksCSwGGGwNge8z9xTJCF70bA6HYk/OilTnzriMDDSGhpHEy6SQsLK2a86tXMDPL+eGB6Oralid4y4Pd1dKBUPEVyq1OPOmGIGhjglDFhNDGhcRE6WFRx/w0PphSMM0zPRp1kL5LVjSoY9L0/MB8eHDDEHsTAwbVGwt6pEkjMpoxpw+Z44TASi3mTuhImmCNrYLUVlOYCtWlPUHCQ4FSCSRpJUl+5SOpktVoVFQCakmjDn054kgDJLaOWAwtP9x3KTQkBgdVaOCw4EegpxxGST1Brbs1urMDNPIc2VdEwUZFRoqDp9QPgK4ScDaLM2jxEsduXdX7t75ERa7XaWqdfcfSYkkWTiQp9PhhZsixqR4qO7N7eJeLeI+wviV55T5/t9sPcHY+5dbVtU7q/wBpbBlWVsyazOygkLmQa8q48zzea7WhM7vC4b/mewp9pkPud5Pce43lu7pudlXv7Xst5GI4Lj7UFpL5ZaKVt7avbBAzZSxrljj2dk5Z02lEJGzLHcN88zhbZtlufsNkuYy175RXt3E8auFWWy1Ea4jwBOf41xZXuvV9EZrdlHPUhsXuY1/EfCPYzZxvj7PfSW/mHlu4Etsm1SxHVKk1xkbm8kByjQlV5+psWeV2YVtuyS4+vfmfuS3NB+MeOWtvaLetE97uEhjW73u+QC7MiKA8luWDaU5IFoKcMdHFh7VMTPX9xzM+fulLRewnsm3WyW6W9vDHH3G1II0WNnYnUzEoBUkip9Tje8KWxmpkfVny3/d5v3vn5BsnlNmu47f+3v2ytO+m7+Zb5u9d18ktrRQ4tNqtLFWVDVmYdpu7IDoLjqUYb8x1tDo9XHvOnj49WprZP9P3Hwq808I9vvHtw2u3i9zv9f2neNli3G33ex2Gayhilm1GK3nhu5kdmopZtFfhU43Yctr9NjNlw1qU1abZaX5Ij3awtpoqgpda4y6qrMDFQBSDp4aqg0xskywvUcdtitLm9aHe0m2z7dg9/vtmmiS0kCN9svaUqgDMACR+B1HDWooN8/t0sbC78I90tz3t5FuILCT/AFBbeKKaW7nvYmEpatWZF6GUUBq1a1xJrqSWrK0Ye5Fpu20bTszw2EdxAu07FfbT9sjys2uFkku5w0lHL/qnUAoPoBjFkuolmmlX0PrR+0v2w99tqtrCTf8A9wux3Npt5t57PxTx+SLye8Nt+oDDdX9w6xxVYhR21fpAoQBjDbjfN1raPtNNsjxr46yj6G+T+NXW9bNYJAbe13PbJojJuO526ytNEFZJUpHpZiWppYn4+mKM/Dd6wrTHuKcPI7bzET7z48fuk9rPP9og3bdLm7X3AtITHNtE+7S3ch2e3YyLPJb2sYq6Fiqrwp6OQCM2Cvyn2s6dl85d1T5Ub35GZ765tN52ptxuIYjDDQG1urKdFI+61kI8wGnVQkUIo3pjvYVVqTk5neraZVN1eTySzw7lMu+QuqSpNGepXANeyzDUE1NRowKcaUxsqoMbGm2gu4r0W62spupWMUMK1jlGvJiEJFa1yBNDhkBqmheB5IJ0eOeN2jMb5MpU0KsOTD+3AAUp1soZgrE6FMh4fP8A88IR6iqGTNihoF4VB4kgVGACxPFfJJrCc9zcGtJrVdVjuqh3aIqp0QykVOlsgCK6flh7ajiTR/j/AJXLe29qrXk8k9xKpeKN1lq7g0dTkxqBQ1FOOLK3KLUJYt0ZAxN6bSbSDFKyhRRTmjFc8jmcsji9MrgXGRXSeKcNLMulpNSak0DMudNQDkSTXDIgysl0XuEmS+kCsz2hbVIKjMrUZ6gK1r/PANCaPWiyvwhK/wBF6HWtNK1FKnSMhx/ngGwMiJ3GQSIrzsGHSSgb/AjEcDTPAKTrdnszsS08CLoFqSUJY5BzXOq0OQPDDAGQ4bsdbROSisq10uepY+NNJ4nERHWEqqVaZWW3f6omBZ5WAJWrAZZ4AgDVNNJ0FZRrQZ9LHLSoGrh68cAM8FdT2wVMiR6RKFJaKp4DKvA+mAD2uNdVVWYRuaujEBSoqOk8jzzwhnG1OQ0oMqTKrGVWUaDXJKEKT65/LDAGdfeRllllk0Hqbo1I/HTnVRwGeCAPVjlRYLq4aylKuIzrMcfRQhlYE5Z0I54BpAJCDIiOO805VmEgBzOXSRwVqZkfxwtxns7dreRSLi2VSjO6iob4lRUUrUV9MMjB0pG8i20croiRERTuSWJr1lmOQFOWHJKAzWqRiW2Kyort2bWeg4ha0AplX6RT/hgFAAMjJHMpWZojWHU3bZ2BJKACgHzwCZ2WINcQFVYNKWlmiagAIqpQZcKccECgDpht9Yjk7cdx1JCH64jwoQwrngQ0guRldZZyWiuUKoZULaEWp0mvx4UwDgLn1OkSCU6VXjTJC3VpoOP/AKuOFIBgUiRozEyxvQKI88wBVS1fmficAguSRmLRW6vb28yhY46DNKUqTxAHKmAcBM2qv3C6GSL9J1FTHVOBYUqo+PwGAA2OA91zGhbvRijN1MpAp0qK6q4YAALeORf0nSKA6bhyagA/Hiy8z8eOEI8jyRujJIhiCmKOX/2bhuFSeJHKgwDC0ikMjuzUm+pWJ4svGPSPyjicEAeRnSBLhe2tw6mKN11FSozZ2QZ55mtPTAACSrWidgKiu4ESISSF4nuH11cDTDAMiSNZJ2gRbcrGCRQK6nPVqrUDVXMDMjAEBWUUTmIS9rUvdGQI1ihZFyJ+AOBsDkk0P6rwsXa4cRSXJyQ8KFedR6YBQF9jrnIRDTTERKWUa60JJGbEk5YIHIB3lLorDQ6vpacEsrEchUUpxBAwgAyx0MskoaPV9OgBVAZslWjfVl/DDBAHKqZnnjWWYaUGheqID82lhyOYPphAdGhpI4ZEAjlBMbOPX84JrWtOFBTCCQBiCpLVVi1TBLebivbIpkM6aeHywxBThnhaOFhHFEaSO9AWAJ1az/h+WEMNZ2jn7Z6oVUpEQoGguuRy1VV68+WGISmKaWAQFELxFWkic5l6knMchn8jgAOkK/otEwrJXtxE9SLTOgAIOEM524JQqCXUI9LW0oJjaIA5pQDOpAPqcABYMc6TM7BXAcoIxRnXgpAOQU06lrXDqOQoKhImVu5Np7hjiBXTpABCgZac6muGJlZSCWZ7p/1LdiFMcci/UmQZSaUU1oc+WK0WM4ixaOCpIkfZuYasFA4GtT9IJ+oYaIgrkBUl0uxntY0KgjSjRjLtleLU4g/jhtDDXEIgRZQXlIMsjB6xqp4RhiQQafDLBAg4qZYzNNKqTpFrimqXKDkyLwJpgCQbK/bjhFIhdUeaVxRWFK8hQVPIYaBnYwo76x26sH0RqaAkq2WphmT8xgIoNNP0Z5BpjRypyIjK5UdiDkOVMIbBzMqACQgiAqKRgt+m1Q9BWlW9BwrgZJJHZkVTGElZXuG/VdqqhUUABU1oeWWERYfIkVtKJp4ZVUoUk7bFXVeAGpa0XnQDDQI4Y7dXSMlJiCZZJqEKUqMogSVFMq4AYb3LiGZf02VJ3PZMtCWjb0JqVI/xHlTAIHbyTpFA7NG0NszEOK61QHMGo+r0pnTAMAHLkTHWRKaTSnPthslpTKppw+eAixQ8MULFo5HV2fT29VUK5GrknI+owhnVhYyOZA8fPQKhdNaAMeHr+GGAp1SRoqxdpmdx22GcdKauk/lIPD4YcjBGPtdqWSJlEPW7yLqoc6LyPx5jCEw9bUAqGd2QqWSRjpGojhzNaf8AnhoTORRDqRpdUjfpMNQ0An6dRpmaHllhAHmJyklsp0sJhreRaxO1DQB6ZAZZjkMAwMkztCiq+m37tKnSSyLTNcwSBw+ZwSApWQAS3astbnSIkORao+hgfpA9cJkYDEfspGQkcwMup43rSvN9S5kHP8MCHAP6VVGtTYDXnMgIALgkBWzoDlUYcibBoJoWWa2/TmL1ubQ0owC1NOQH8/TAM4Y5CJJ3kVEmcI0oYyKyflAB4nKmWAcCkxvW2mNusbuQjozaQczRioqaAHpBOAYLtymX6zJNAlYLiYUrmW1N06RT0/HARORprXMiWMKGjdwdSswqzR140I5UwBAOFJJUiSQmRiG7RpRu0B1Lp4KfQfwwA6nJCJlDiOWNJaMkqZyaUFQXAzJJGWCAD4ER4DLIryT38axpqUal0irMSfwwwO21Y0CxGJbpVMYWlUAFa0P+LmcAmGRzEdtO5HNVuzbzACsofMqTkEP88KRwdS37YFusA1EEMFqrIq8y1ThyAY6iOUNIFQPF+okwCqqDJjWtC2RpggACpV2FuSzUEkY0UaIfKg4/HCgBVJGpBDCSNpgHqza27lfo4dIOGJHT+q5nAjuKUM6tU65F4moAyI/hnhSDQNkZIzIi5pSZ6HQACemNlHHhkfh8cIch6OpLyvB/mYF1KEUiOjZjh8OOGMUWdr9y1lbW0M00l27C3VNRZnpkIa51P5ieWIsZcvh+wnZd32y0RF3Hye+UvtG3RNrktZCnckjkjaoLqpJ4fPMYzZ8yqtDTixzDNXLslh7IWt5db7JtnkHvLuFi97tMl3KE27Z7CWNP1Z306DLHUgEfUwGjHneVy7PRHc4/FpHcZs3zdd095d9gg3213HdEvI4pNu8VSQxbtu10DJItxCHB7NrqqZJGb6eumYGKK4oXc9zQ8jSaWxtJW8O9qfC7Lf8A3X3m1NjNDFLB4htCi2a8ljWqbdZdvP7aFaFnYDW2rUacKXV3Yu5pa6Bu3e6nl3ukv+oFG8K9tL0pL4js0cksF7vdsxKSRaogTbwQEAAqBr6iDTFWajotfuJ4VV/vNle2vt5su1bJsdnJtUdvYR2obZvF7chYmZ3LTXU9ADI7106mqTzxs4tO5JWWj6Ix8vkNWbr06mhEs4Y0Q6dDJkAuZoBURgjgBT5fhjt46VxKTkO1rv3nzk/cz/uB+CeDDc/D/axts9wvPLJXg3I3dy1r49ZuUfVDNeFNM8+VBGjU1UBYVzptndnK29To4OGl/Poz5Q+S+I+/H7g7i/8AcPz3cN3sNruDpt/KvK0/07bpUaAyWtvte2MQElLI0URjLIz6AxBYnGVcvFW2ur/bqbngtZfDojJXuV4ungO77rtVteJ5HaXBX7fyG/tmW3ubhkSWZYI9KGKeLWscschOhtXKmOngt31TSg5udOjaZUV/fz7gYlFvZwKsIimtbBe3Cxj4l1LFdZArUZNyxpiDHIhsLia07dzbjt9pDH9wlaGpqA4qARwy5Uw0CPpF7Eb1bTtsGxx7ztL7n53vkO6ee2E2kWghgmiKRG6yVRcTKgKoCEVX/MMFthyVtu21b3ZeRWnkB8cs7H2/mvtx26x3fd9zEiNed6UTW0tJO7Kkp6V0oCy6mrQGmXJQux31Pod+3LYPZe9hZdu9i/Obv3A+2F1JvljuFyzXAotrf3lg0UkNbNWcp249bkZ09OLnx4rW+Kln7mdajsqzW6XvRuTewvjPjFpt3hY3mys4onWyjud0nnE3bV1aK5mu4+9BQNUaXWpWnrjHmiiSorVXvktw07m3dpmENw/cv4ve+aeL7Ts/u5L7beceM3V3tnlW0e4loJNnurVEB7UsmoB5DIKIryIoB1ceN3H417Luliz3VNJUew+en7h/cjc7u527avKfEdi3LcvGZbmFdwi+2nhktrmXXHcw3W3yCN5HGSq1aKF00qcdriUslqc3lZE9UY+juNkv5XS7s5LBHidBcWrfpm5QMYppFbMBidBXhTMY6HQ57csj/dluXXXV5oUDIZXbWpXIKJCeC0qowyLG55XdzIz65M2JbqYsTUtU8SfXCA4ImYFkBl1rqm0chXhXPjgFIphe0hnKyQvNZlwGRmKPkK6dXAUPHLlhoAMkrzSSSlVq66JSqhYweWS5VywDJb435Ld7RPCpiLWjmkZQlSjVGp4zxrkMjg2CJNP+N78NytpLiS7/AFDmIygZZY68FZuBNTXFtblNqkqhUMA/fayS4/QjaKskJUAFO47E0INKj+OLlsVRAojvFjkVTpjeAERKEzjNeoqwOZ55cMCYCi4msJbVGdGF6rq086VAuArZErmY2VRWoy9RiRGDjDpeOKMSKGDtJpodJzCrn0n40zwmOBNIVlWK4mJCRk6omGa55ZjjUmpwBAc9vLVpKm1Mzt3GqREppxPqTTL0wCPULOlrAiAqpDSA6QBzZeI58eJ4YAOo7hUMdAikI6ZagK5nSuY+ZOEACINGtwAWWeI8zpZgc1IoCCQDXPAAZH3CoBjikQL24qN1MTnnWmqgrU4APGOYy0lkRmpqCOKKAaUXUvMUrmMAw7XKkfeZyqREFoajWKtUVzFc60BwAgmVpu7rm7k7SJ27lYRqVKnpIBOVedOQwDkGykEO6OkdqaFIwxp00IBOYUjM/HCBgY0jkQiONZHiKMJYgUNHJI1qaCig8ePrgGjjpRJ5ppANalLgpQFoyQrMDSlKA0+OJQJhmpHZ2jjEU1wVa1Z10kpTSI3PoOJOEILbsCiKyysxCySooISROPwFTkAOGAYIqwcxPC0yoocW5bQoz/xcyBx+eGIIqESMmVWdXrI8kQDPqz08c1HCpGfDAhyHkmDS7IERiBFG7HUS3FZBy+GeWB6gJnhKoySIF62ZJxmoYjNhwqpP88RA5RO00ZLadBd5FPcI9R+Pw4YaA4SqosTFLiOlHJLUCACoBy0mvLDA6EfLTGtJFK9+MmiDiqt6jPlnhAEqXjWN5GZHMoC3CcRl1VBJyagoRywCBNIY7nVEvS6kRp0hl1n6WPAjLngGEt3TVZHAkA0Oyf0yUyqTwU8hlhgcaMB1MLn8uhnY0IbMurLxrSn/AJDAAcX7dxOLaBEnADTSq2kKaga1I4j/AJeX44ACgjoY3iuDHHcHtTIQNStnqYgZgZZHAMJ09yXKMqYFUQykha501VOVMuAzwxSBnWUDqYLcyHRO2mgTUdamo4YQ5Oxgr0zUYQSKST066ghSpPEmp4caccCI7hcSd6VE7Ynitw6wA8a5hi2dQK1zOEODsLMSsaw91Y1A+1jbUEPBguogAUPGmeAGFqC0rxsgAsVXs9uulVNSCQBWnP5YAkMiWrtNCpltgVDNU/RxLO7cBU1IrXAEBDAOGiCqysR/lRUyUIz005fDAB67VUkkljV45bYrEgoKrQU1H5DiP78AgtkUldDpchDohpkS9Miw58eHHAMEyOrRQl1WqCgTrLGmphU/4c6DAAFjH3EJiDPINL6iVbVSlHpWlaClOWEAWOiSPS3VMaz55q2WSNn68OeAAMrFh3mh7AgUyRQsV1s1aFiF4in8MSEGhwIDdMxYCjXKxpqBWTIrXLSaeg9MABMYDGaOF+5cTuzQ/qLHRUoGqcy5ABHxwAVgsTCJ5EcmcjRPGX1BAijiGoHP8xitFzCwghQSxKs0EJ0TPGdWoEGlQASfQVywyLYe4t2ngM6SPBCiiOQGih61WhNCBwyplhpgg+dJhHPPK9HmARIqAGQEg6UA45Zn44JAC6KbiYdruRRLqhQ8IqgVVhzOY4HLDEHdgRTWZQq1VdpLdmqpJ+plpX1oMIJOxsQ/6P6scQAKAFXjJHHV+OECQsRhHpDy/ohTcLG6qsjKpI0+orzy4cMCCwSjIAzmN43pqlWUNTQW51FKZ5YABAZfbSpoEEtVQsGdErSrEnMEHMg4RGAKARsLgqruzGMsrVRF00QOCaFiDy44khhxhQJEhj7bxdKxoOkDPqJHAUPPAIMYPA4aSZ4I2jPe7VHQqMtCA/XlQn05YADAtUdCTbtGVJhYkJpA6H1ngTl8DwwA2djAu+wpkjCyLWYA0VAOdKHUf8WGAPVGqMF6Y5mIVHSigrQag/ALT1xESFMZAAZ3V41YhrNmB7lMgR6/DlhjYKNVo0TASKVcLcladopRghUZAH44Q0FszoImc0WKQJDE56kVxQB3zrq08BngQmLJIv0TbgIzoBJeUqayHkpND6cMMR1otUq1iQM6MBI7AoZuaADOq5acCCQ8LrVWMIjluYjBxJRmpm1AeY44ABW0hXRcaNXbLmLQyqAtOs5jIknIYQBnc0M8ndE7XebCQDTKirViCB0DkQM8AQKTM0cYSVdDrokgncakCtkoJ40IOQw0yW4cryOio8UqmQabinAyLmpYHIAgmnwwwON1mQrAiRAmAgHVq0LkQeR5j1xETDe0UWAQoblUTUUYHQopRhr4E+npnniUiE4IVUlLGTWCrFQx7gXIU9Ao58cIBSJoxGGojAKy5uKCMGhAPCqkg5YADj23Ct25FjXoQO2krz6geIzqOWCSSOMsEZ7QZ41cF5Ect0UFRqUZ0avM5YEAdDbBWTUWmMchYrEVEYlJoKt9JGdMsNCYArGJZXnQxOzskqKSxNMxpqaZcTgYgeuZ0aGYRa3QsbocwOagAgNyrxOeECYbG/Yl0uBBH20QoBrWRsjXKn1euFIQBDPGHYKwhgciONqmReRq+ZAPGtfnhigNUIrSs47gJEiMF1q1ADRQ3pzGGAILdSgdJDygyRXAcM6DkNJz0058sAHYqMpnAMMgChHepQFCauDwIIJ44QCmskSxyRIft5GqInQJJFIaU0ADIZ5HAOAQgfVcPG8bRSVZpGoySaTqb4V4/wAMAIXwbZco8VrAszW1ydcVyyN2USTPUa5mvPkKemIw0TSlFweHbG0l03jlja/6zve5JG9qtuA0hRGbQbSbPQGY1kag6AedK5eTm7K6F+DD3PU2Zt+yePewviF1vvky23kHnm6hIC8TI0JljbuLAkLamhaKRmYtQ9wij5Y4HI5Ds4R2cGBLXoYx8x8s3nyzyKHbA8vlHlO/X8U+zeNS6iGaGRkW53ZIx1TduiJEpCKuZpXOnHgjV/t7jTkzvoXDfeU+J/te2uePeZo/O/erzELJdMxaQW7yLo/V4Pb20II1RD+ppNBlTEvl2zaLRFVbJPutuV54hsnlPnfku2e5Pubvl1ve8eQoZNi8XWEyr2beTV31tNCmCyCkdsr9QNTTnPJauNdtR0Ts5sfTL228UXYDaeX+Vxpf+Qb7FBb+JbCo78cMgGmGR2yDMRVitNKpQVGeMPYt936Ftsjso2Rq+53rYfbrx3dPN/cDfrTbI7dfuN83G4mWO0tyDTtW3FiDkAoqzGg9MdXHavHr32ev7aHLtS+eypRaGDvdRv3Mfu+sLrY/b2xu/Zv2XvAyrvG9fc7bu28RiNnSSZIitzDBI6aVjooOoMzMBpxkebLmtKT9np/E62KnG4lX3tO/7behJ/Bv2texv7cLPcvOvJ7e4843/wAb2pb67utxsxcxWagVL2FjGpVH6WKdsFmoTiGWcdfjcv2Fay35VoxrtXq/YfPD9zH7oZfJ/wDuPwizvLK+9v7/AE3NhZX0bLe26TKJIJIY5GLyTqD3YpidKVpWozlx+O7NXekdC611irHWD583XgHlm9y7zeePeI+Ub54jaEuN03K1a3gRLiiC5eaiR6nIAZvqJ447eK9Uok5N8dm9iqN38cvdnuNM0NvDcWR+2urf7yKRhcqNTBQhbUWBy5V4cMaK3T2ZntRoQR2jzMHF1aQIVed2ds16j0smZZqkCqjliyStqDansJJBNceL7KsqWCb3u1nte7Wc1uhknKSRKskdNR1vCSgXKlT+MbbEqRIp9z9j8Z2D3A8u3LynbktINoWOy2/wxI0e7t77cQXhkuIWJWRIweoZ8AoIrjPZz7iScOUfTD9lfuz4/ul1D4lJt1j4v5JeXMMqRbe32G13yogijWxstWgTRCN+7pHUG1UrXHNy96tozdFbL2m4fdK93C1khmO2NvHjW4RpBuW4RqHlt561jmh16o3VRTW1Ok0+rln5ibSLOH1PiT+9KybyaU77e7dbDzyKwYb3fbeEgTedmWam3iKN+41xPb5tLMAoomjPFvj8nbp0LObg7lKPl7fQPYEWsyiNLhEljClkhZGrSYqpZaEnivCnLHcr6nEcphE17abhPCt/ENutktzAz7WlUMiodLujHMswGo14cBiRBjWlq08scKvFIJhqZlbSopU1OqgFVBwwbBS2WmS2FxcJFbTL3IbgMH0x1pSi8WHpxwAxuV9BdY1UqwKtX1NaMDTKnEYQBedKVGZzHL0rXhgAUR3GjuxSSMYJFCuiHSCR9LcDWmGMUROgdoppGZXFUljIprU9LCvAHCkJJP49v9zsc0Uspd7VXo6qdRRwczTg3HhzwA1Jq7xnyKHdbW0hQqjmMH7mMAoxYZP2gK/AkHLni7HeSm9YJK8qT6laeK8SxQQBokpJG6ihzIJ6vzYuZVGoPW1tGkrPGbU07zuAV1VoBUZinAimBAHXEKL23eUTXch7bNUrpRiKNVQFcAHjhwKQMsWguruJIEhJyzShrxANVJUZHLAIEIo2jkQIRCVUdhyawscw51cjXP1wgk4IVYxwgBTLX7kBqAZUBqpANeXxwDFKLHILeWGZlaQlZJEGoaxQEAAVoaccMQUyoJHAmCGjF0PMCgZBUZnCGmcX7cG2ljYRFBWVwQRoY0rmKqF5DjhsICpIowjyyW5+3Gl0JfreoydaHmRng3EGW/c7JhKowRC8bEUdUqSW0sCTQn5YQwxpJQBquRo1qgkT6ZqDMOeAoPXPAM5GJbVIYEde4JNUQC9yNFqSe5Q1IpmDwphwJgo5G7kEpIeMNKsFushLVcFjKCKEetPkMIGwqFiViZrgyxxmYtBQFnkb8jD1ochwxIR6N3lXSoea5camEhXWHPBaE0WmR+WEwCtJY28Mkrq1spWURALpetSr5caAdVcNDR2WS2llOuQGZgO0zVSNm4MRyFOJwhnDCyFEd4p5iK3AkcDpXNSG+PGuGILU9uaRNSxm4RneRlDKyvTp050BHDLCGFyOVSN5W+3hL0SVW6AOAIQVOfoOGEAaXdDDEA1vNHITFKyE6CR9QPMN8sAgb1cuFtoyyr2ZrgPVGNKgiPgGrhgJjL2rdFaNokd2DXAoSGAOkpWnHgT/AGnCAG6BhGuXZZe4aEELQ5tl68aYAALIskyRSMjl17sE1K90NkFOWVD6nDAJMYinBllaRoarO7qCoAoTE5ocmHwz54Ak8sSM7fpu4+vTxDgA6CgH0lR6csIYBV1xKss1GYCOOBjUIHrpcsq5EV00wxHdLtFGrRk3CyVmIBDyCmdVoTmMsjTCGejhihaVO1+hF1W6oTLpZlNAi1oa51JOGAWF0p2wKyBtRUHLt0qCwAyC5mmARxslZWmMgUqLYSVLpzGlvyjma4ASPdqQyae5CJmCLdkk10sc21fH0whnC6S6tELCJyscpUlJIyDTSxy1auWeBAGSNJHqBaSOQfpLBWupGpQkkE5cOOGISO1ysMRbtCMMVWU/RIy9OgqKaq864BoPaQgvMw0wwBo3iI/qPyq1KpQtkK4QMTBZtJYRq0qN/mYxQLQmqgs4HA/mrgAMq0ro/bMvcQlYDykQmuk8GoOJOZwgEqhnKyaSxLEyMtVZ9BFCprlllhgdZdJMYmklU62UOKPqrWgatTxwDOESLGYxcMLhRrjRUqe22TDhnQ50wxSdJkUiaQCERsIHFaKobjpIFWJ4EcsECBMQtJ1hMTwxmO2t42JL1JBLKvD4V5YYxEqvIIR3F1RrSoXpoKswA46/5euEIrYRLMhu7qFWVqt20ck1VfqTLOpIzxBFxxYp7dhCWYSFVMcR+qSMZgFvTPIUywyIqdou5J3EAgUdFumosQ46SBwLAg54TALRFkh+4mlkCkKLdqkhmBJyqcjQULYYB9ZQsTBn7jyASJSvPNGpmQcqk4iIMEIaqwaQsjkxiNRrR1yYJUilKUFcsSBBihUnSIA3EETgyEDMtSlNIGefOmEwkCIXZmJbsMjmV2NGbtxgDR8SOOATDAJJrczJJ3oblS7sQGBVc6FDw0U5ccDAHIrrF3JJ4mijGiAgdBL5BWORBUZ8KZ0wIGcESxvEHdU6SHQirB6gBtIyAHAYYJnA7qmrvmOVie6yGolANA3Tw5An+GAA4GS2VZZII11oqNEr/mWoogbgSOquAUhvXICiOsjxtpdHqshVqGuQHSP5YEOQ1Yx3raSSErAVMKykaSNX1Eg+p/jgECETwI4aOUrqpDQL1UrqQ/CuAQc2p1idW71sI9JEaAdormdNP4gHAMO1tCHgRzI90NSFACtXPSSTUNmKGvrhbAGFXtwGds5ADbbco1gEDVR2XLiOOGRkFpVZ45JZhoiDS6jRWYsesLmCdJNa4RJOQcaTxkTJTtowUo4/UYNmG4EE0rmMAQHxBIpNCDvKz6oY9SHMihUKQB0ita4cgGGOVjJIXUwg6zOihhUjNZATXVQ5CnDAAZElzCWeF17UhZoY5KEKWzDFhXIYIBgoo7nsCXVpAkMhYsCGWmmgU8c+GAUg2NYZXV3WS5GoRK2oJQtpBrUg0NB/LASR497XbZERCOrRgAFmUU0gE0LAcTiISdiRnDQxCSJWIMglpSIkV4VzPwwQAaq9uMfqsszOUEVKKgUddTmADxxMiHvHI5QuVtUVNcTLWgy6jmQPgD8cA5BGORhIkpNxEYw99oINQCaEM1OAz48sA5PRMHU2pJmWgBkJDBQpqjrwB1Coz4YS0ADKTKrRKzMlooEUBUMdQqAxoRkK0B5mpwxSCEas8DC4JlUBX1VIJrUgAmnwywmINiDR9sLIIUnZiUKglCmYKA8/+JwhnkYrEZnZgzkrGwH5iTmoPDDEKlLpE82pGZB25UoaZHNmJNTUjI4YgGg2zqzFpops2ZQHdWJrRAR0054JAGgVJDI8qCO4JCqrUAFa0ThmRxr64BSGrKeuCSA2sbvplbMqq8aBQDSg44RIURRWyzRoaXVwwLL1NGUUjJSTWoAzJpgCBda7e08qLHam6tFBlWWNgSXAr1cqUFCAK4W4STbZ9tud3hTb9sZ/vLuY2kFrbCR7i5uDTuRMRksaLQEmg4YpzZlRF+HC7M397aeB7H7f7DL5T5Pt0d/e3CtBve62MYWzW4lASKyhZKurxEAnSoHSTx4ec5PKdnodvj4O3QyX74+6N/v27XcBme/3G9ZbS2jhRJyzM3btrOyKq2uR9VZGOS5NllinDj7nLNGWypoiC7p5xtf7a9lvLOzVPIf3AbrG8u9EMlzbeLJq1K/dB1PI6uG7dTU1DUpTG+uB39xm+Ylq9ysPbrx7ed+3PbvL/IWn8m808hlcWsu4RXGsd9wIdykSYMk41EJFFRRmrNxAw81q469tRY13a2Pq77a+A2Xt5tMPlPn8El75TLPbQbb49auJ7qbcCoP2QcMZAZAVeRUGiMa0Jzpjl2S33NdWaS23ff8Asq8m3zzPt777j+TQywbL4rtJheQJpDRbPt3do6BimqSSUUB4NTICssSne35Fd6u+2iJn497b3fk+92XmHuNb2W+b1tM81z4j43CS2z+Pw3ip3E7ZBS7u+nOeRarXooMasOF2+O7l+nRGbLnVF2U0XX1ZfF3PFaWyUkjXuuIoEZlZmkbJIYzUVY0yGNWS9aJPYx0o7NmMfdL9t3kPv1uVvde53m9/4j7U7esdzsPgfjsMUe/C8QUa9vN3kSZkZgzL241OkHSG44xYuK38V1D6fxOs+dXFX5eJS41b2KB9892/aZ+0m3s28N9q/HPJ/exLZYPGfEgy3e4SKxXty7lNdvM0KqBlUh2FQgAxo7O5pLYqx2aTsz4f+9/7i/cn338gvN38n32/JRjHH4nYs1vtFhbBnPYhtI2qdLMau+Z4k424eNWqh6mfNyLXehn25S7jjjumVrfb2cIqOrdsTEegOZoNXwxsSSMlnbqOW0tZCSMXkgms9T/f7fb0hkk0A6XidvpehqK5Eg4cgjaf7cktbrzDZb60vF2eCG5juNx22SGRp4bhVHa7cr0q8hVQr8BUZVxJrQU6izzG4hHnV7tnlTWZvvEbgTi/3S3kkN0zuGe33F1YTuz9IjmQ9FVqMsZb+wnVNG2dq9gPageMeE+4PiF9u+y3O8zJBf7zBc93abfdmWN7Ozmu0KklHLr31dG5ajWmMOS1uhtxx10ZcX/zw/nHtrb3ns374bcPF9x2Pb3n8G8/spZb2x3aWYs8Ld6JWLRaWoHQVRl0uvCuXLjvZew0YHRa/eYK99/cF7zu3Nrew3b+J2tteeCeRT2rTxXu3bissd/ZXyKFBcTNQOoXp/UoKVxfx+P26sXIzytD5y7/ALtFvMlxGsEO0Wm2tNc7NZRNWOGOchpbVGzJCvV1JPM+ox1aKEcq7bepCqyEkx8Co7jA8+YIrmc8WFUAFMjOuklXFA6kCgpnwJOAIFq2F01pJcCESxqaMQaspp9VOOZP/HLDkO1jYxGoaWBGdDwzHwGdcIUA6xm2dGRu+ZFaN/yqtDqFPUnAOAihFSAKnhgCAwszIAwB7Y0qacuYOAO0VBlAHYLgAAlGII18CafEZYBpE78V8xvNjnRUJ+2BBAWmqI0FCta+mdOOCYB17jXWx742+bLFGr2ktaPFuMIZJY4yQzxsRUEFhXMYvpcotjgcHimKuZCEt7hl0mMaVFcg5Zen5jFqKwMkYklWMBF0xLFG30gds1ouZqGArwwSJg52JIk6pGjAmu2AqCchpBqek58RywCOERqqyDpkjcfa0YyIQMxSnzI6ssAQcWqzyduTVHIR9xqSgSQiuph6KeGAAUVuJUSTU2vUyJPHIUVGpUMwIy+GGAZ1womqRVDJ3g5YGslKE1IBNeQwggLT7iGITQU7IDJPHOCvW1FJ5H0wAcYGSO4WMGDtxaYYjXIClQDnnThgA6W7hhjqSzoFA4aW4LWv1VNAOWGB63ePssrl7dCtJLeo0swGXaNMiOZOVcAHBRkVlmWN1NVgIBqhNKFmNeJK4BCiaHS6u8LRtI1Y3ibUyniyUpXPmeWEAQ76zdTp2tMjaTQFdGR6mDc688NDD/045ls4mSIgJLcCoYMzAqrIRmTT15YYBIeNdRjEwaBjG0J6wrEZvqzJPr6YUjO6meGVEKzRFVCK1RRjmxpyrwwAcdFlXvdpJCsQMMRNFVxmEz9R8cApAQHWJJeysdw4JlidiKrx6QfpX0OCRhX0ziK11EANkxUqP8SI3HSRnwwhHNLNLqVixXOQ6iY07Z/KzcCozoOZwDDGjjoJUmeWOdmVVkFNYIozEZZjDA5+qsSxmirqoCFBrSpVyTllQ0ocIcAXSNYigPU7M8bITQtmCSVrQUP8cN7EWhMxXtDUiyOqlZJBkEccGzzoTTLhhBAN3eOEsIprsTESKNPUpyq2oHh8MMIAO4dXmKfqK+mPPQNQ+pBQaq5VqMAHTIRckyyFpHIUyqgAKyjJUUVzWvL8cAwJ7tHcTaJocvuDmrqx+pnAyoB654ACAEqI41aCRFPakyJKgVCkA1pz4YQBq9ySrqkQmlT9NnJoSPqYAUy9cMAmMFYEkmjQKSxilL1jkINCSDwqT/dg2CQEhiVDUokikaIKgHWeoEEVy5GuEMNJFTcJMqdxQJxKP/aVzAiAry+qtcMQTGazAqzLKxLDQSdQrQoQ5y4mnwwCCHCNCgl0s2aQKjEKz8TpDAjLl64GAocTNLAkUry1TVNMF0gu/HjkSMABAWSRFUUdkdViSTh2q0aq0oK58eOEB4MqOYI5HNvKxXtkDSAop2wBQ1HGo44ACkCTBo5SWWAnuRFepjXpCnn8KYB7HGJLAIzskkerRJmBSnWSQKEVBOGgDHmlRg3ceR5VotKOStR+ooAoAQeGAQWwmjkt00BkdCYYlOpA4zOfEqeNT+OAAQjZG+6RSkIc6ZFGrUhWr1pnqzoBzAwDkJRKwFzIqh6iEpRo1OZKg0qWbP5YAKz7aHUY5YzFH/1Op2VZJE4UBqegHL1OK0XnBGjvctE8jG3QrE4HXNQVDKSB+IwyDDKytNFKQkVDITpFXMoFWoSTpBAIFfjgIhsRVUKpSaYxlVtWJQBmahpQUBOefrgGcRf0e8CbhJUJaUsFdyWoFb/CK8DhAGypHKzSRxAGaPSZNGlRpIDKSfzDPhTDA92VHZlikYTQg07YojEVUA86CudTgEHJUB0VgogAOiultRpUkljlx5YAOv2incitFhMxD906Qxpky0X4H8RhtAcNun0MrLECGVx1aQ4owRRkQMIUB6kK1wFDyk/0boDqEZoNCBhnQDL4YAg9r0ulvBCoi00KinbH+J3bjU+g4HDE0eKFXkJjBMb6LgyOx4CgcGoppzpgkQeY1maMxFxV9P3ElVcqvIg8QRwz54BirOVrmNQMgtHjaqhhwEdeqq/+OGEEBCO57UsiSNwWDUKgKPqkkFQpFeBGGAqIiCrMUTUzf5SM1EZVhUkpwPDOvDAAf+rJRmWOGVHCoxdRRf8A32mVMvX1wBAVpSOOWJ4nkWUKsMa1MmXEDOgpmTTjhCgOLuIjpkLqzEQNQkqAQGoQDSnNcIATavuLPttIOrXZysDoCHJgTxGo8K4cDbFToIvuql27bgxzKNT9w8TqU1pWlfhhi3BNbsYZzKzukAEtxIlNbljQ0pQMaA/HCQw9F/qIka29EV5ZtRSjDJFKg/mGQGGOAyNQ7KIW0yxZvmQQDmVQcBXPBuEQG0fqtaFJVPclYKCGIOTa+ZANK4GAKUO0SNLF1SAduQvmQvF1Iyz4+uFApBBNIdnhBJGmWR2IAavS1aZ0JrXDgDpNwUaGV+5FCp4N0yBjWhBoSeJrhhB5nEErLqmuII0JihjqGQ5VTMjpzwAHQiBiJpHWWEEqbddS6gVzjoKdVBgQBwVtAljjYSaKmKYBVGk5UIPCh4AYbATNLFIqRtOzCdqzxR9EuWQ48VU5ZHPEWIVRsxEqiKtxbDRKnTG5Q5BUNSajiThCkEzlXMfbEKaC80aj9TIZ9dTQ55+uBAzykRMGtQBNNQIpOp46jJmUsAa88AAtS922e1ll0SR6ZW5SVajEivIjnhyECqPVAhdR3XBcW8zUcKhGZf8A44YghW7rRRGM3QUamgzJZ616X5CudeGGMPZZKicvHMhzns5VLdsK2gUNT88hiLGOlpYvIbSdmMm3RsYrqZs9YWpoqg61IrT4/PAMl20bPdbhcxR7TZSWqWoLXEaErptywyMmkKpfgwzJ4DIYrvftWpOlG2bb9n/bCLZpoxcS/wD4UeRr3Z2UNGthskJ1GJEAGjWSQpB1EnjjznO5Xc4O7xOP2KWR73z9yY9ntrnadvnlh2qJGsrCGItJPNLIO3Dawf45OWsgkVIrjDgo8lpZvvFUZL8p8itfYGK03iFI5P3Abtt8kcCazcWvhNheKymQo+oPfPGxAZ66BwAx1cdO73GDLcyJ41YbZuV9feU+RJeb7t8VxH/p1jcSu13v+6FukuTVnjDGshPHgM8a7OFCMtVLPrj7E+3sHgO03Xu77vbg0vmtxC15vG4OA0lpG6aLfb7JFFEl0EKCgqtaL645Oa6bhbG+ldCW+Se8V34ubbcrm0a592PIFWy9vvDYiBD4zt8vWhkoKNcSA65HckiueIfKj39SSab12L89idqvt3lj8u37d3m3e9VId08tYAxydotSLb1YdCVZlZx9ZrxxWsdW9f8AqF7uNPuNp2++R7da29laxS3E7r2tq2gHVNcHm8z0/TQcc+WN9LKqhLX0MDxy5f3hm3bRLHcffbhId03l2EnaOk2VkUDAC3VVFKBjVhmcTxYkvitq/XovcK99IrovxfvIFvm9eS+Y31zsfgF8LOysT2d99yZow9tZvQ0h2qLqE86nixGhCMycRd3mfw7Lr+795bWtcSm+76fvPjz+5zd/2pe2O63dhebP/wDD39z7a4meTa5rkPbC8kYM02+bhGGN09QAI0ICDpCj6sLBhtPs/b72X5OQ7L9vwPlZ7ie43kvk+7bjL9ptXiG23Ts9v4743Zx7faQRuNHZUxL3GXTUdTmvPHQpRLYxXyN6FVzW8zR/0nKaQxRszyNaGtMv7MWopYOxilaZGQK4DqCOJXnUV9K4bEj6N/tpns7Qx32+bWLixjtTJDdSwMryywgtpWRR9YqCPT1yxEmRT3Uubby3ym93SWEbZ5JBLJcXqI6yf6ohYk9INAwA/HjiuxNI+ln7XNwl8i9lLnwuy8VWysLiSW/2PY9zdbnYd7tpG0Tw3BYqYZgy5AODkDTljC9JRe1OpXHuButj4Tte7+CeT+HbxL7eXtbk+ItKl1u3j08hIaXbpJCzvb1OSqDQZsOBxCtnMFsSp6nzR92/Fd99uN1tvIfG/JX8h8R3cM2weVwMeuOVNMtpfWxZuzMoLKyOM6VFRjdjsraGe6aMn3ZeaR+8miXUC54VJIrl6emNKMrG0k1LcA0g0U/LWpPxpiREGJZGCrIQyDqRtIZhypyJwADt9wuLJ0ltp9Ei5KwyHHPXUZ4QSPKpYb0hJ7e27o41wonTDMa5jL6W9MGxLcj01tNbTNBcIYpwM42FCMhTjlT0wyOwTWueADxywACRipDqaEcDgAVpJVqv0k56hyOEMtXwXzK42W4hiUsyVYyAPpDKeIIIpUDhhTBKO5Gp7Hc7W+tbe4tYwyTr+o+qqEUqCRXKh+GNFLyZb0geJL43MUVtKqOYHVbGUmjxxgdSMadSkmufD8cWSVdghSN0knVdLJKQdSGigE0B5fivLEgPQRvHIsjx98uCBpIAqv0tmAPlgQmAE0gQxSQd3QZC4jPUWOYJqKENyHrgEcoe0pounVXP6G0gfUeFfTAAa7BJu3JFG8SuHaQE9oaxU6h/irwPrgCDysskyHtMF0s1xDJ9UnKrAmn8sMR6NwWaRF/y8q1bX9ZYH8yivMccAAu8whlpC7XDAtK6U7YUHkG5jl/HAAA9pEKrEkkN3GYpwrVZDx0qDnSv/HAIF1dyJ3g02SUFAweQSU09VCQQo/nngGc0dqVSHaGXrSWTPUzMa5VrXX/fhMkgYAQzXE4VlKsTEI6UJyDdJo5H+HDATv22gQRuzLBJVruNdDhnFQRzFKGgPDAIUoDJPIY36grE3Z6ddaFjJyINOIrzwgCu53FYMixElGkkOSVWgpo5VrUYaAG6yytPG1osbO2tVWoXMfUGOXD0wAgEqdyW2BlkkiVCDICWKqAKipH004YB9AqR3eSSdz3FmZVkt4hQ0rQL/wApGQ/jhMEHS6e02pYnjkbUhWpjLA0DFuRrxGAAiXU8YWvalyZZK0XPM6CKAhuPxwACiaBxLIJlLCpa2l1KrJXSyilKBsueBAFyNCiMgAEn1IKGhUjISLTkvDPPEhhdx2z3oukxUj+0mfUdLmmnLkPQk0wiIXIdPcJjaFyFhu7oggKSaEgZevLAxhtwqsYoo1Z4YFEMZc00muZRRSvpXDkUHSJI2ZTH2FZHWYrVCARRgq1PFaVwhiWVoUjijUp2UzCKO2srNTQgbhq5tXjwwgO6ZRcAup61Ch9VCpAIKChIArmRWvphhJ0NofvmMSxyUCypQFHGTEIcz60wCkI0pMJh9U+lQRTqAOY5054TGHosg0lkokABuVkUdRIyVQRRyBw9MACUxoQ0THUbhhJF3F+pM9ZLAfUQBkMAwMTEloq61ALmdSFMpUVUSGlacq/zwyLDLeYK8twsIAYM1wtc1enGIEnLAKBOyn9G1SNpLRyrSNGelXqT06q+uYrgAM7cTTMrRmXSaTRCh1gN09XqOJwAFGkczJMRAXZjBKFoJUQ5AMDTVnhDOVBk7RVpO0O4peiyMaZEZZlT/PASR2MEyxRSqkjSlvuFc/UuTaiT+blT+WAGJ4oomgWVi0P3Mmp5WqGBqekAfSTTMj8cOSLBmVS85aMLMWrHE7dRK5VTT9I9VwgRwKY3vhEWhhnTVcLwY5UBQ5fLjUDAhhTqUNvKq93TCFIppTS/1fI8yeJOBgVzIigSyMCYLkKiVbUislAGagqQxy/jiCLWziFBpaONmWVXjvIFahcq1OnM0FfTDI7goTE80rRAOqqoMLEIXGdHdyBUjMUwCiA+SFyJQ0i9xG7kpjUaipz1KXYEg0IIHPDGFEp3wyCIq+hbyILRGK1IAJB9f44QtjvcmLaCn6kr90qzdwoeAVlyFDT1wAHRhWeTVA6yDrgVDSIhjxbnwNBU54JBsLjEbyoBJQjUlzM50yDI6QSDThlmMsApDyUEemdj0vRGhBqNIoA5PqfhwwmMUmsX6ayBOkI1voqXWvUytlpAPLDALZZXCEtp0PonQHTrcr9MTEegwkJsEkSJHAgde2x1S9tB1LU9LE06RiQbiiOPtFtWnvA92yiYlizceqhJNB/LAI4O/wB6J6RzR3TFT1BiNObGIHhngGhTGDG1uwZlRWLrcGomFeioQ1Jz9RgYQAhrphgEglYuVihAAUZ6jpIy1E8SflgGH3LL9yWMkYBjH3aOKAAHhlUjPLLDCAYUzXDo6meEnuIY1IRVGbMo4tyANcIEdiECyxMsc0wuKJE39IRkVDFVqcwozFc8IIgPVkMMryKWicr2YY00PGtSv0EV6syfhgZEVLK+lpI5NT9sqZ1oVCVyqpqa1P8AfgEBiSMiJ41UJJCVhd3GonmK+qkUzywxyGJ3KCFm1BKPF25KChObgUzJrUrwphdQkH9S92MRd+R5A0UlVR1yFaflApl8cssA5FDvK8zwy9ZGg90ABwv+JuFeHLlhoBQ0X6yrJGwlAaOC6kPFM6Ax0yGZHPBAjgirbraMjxxmpCAUDMvDTXgAOBywxBjCrBHiYgKzxxFsnoOqoA4GtBXAMCvaSOAr+daRxKi60JP1E5cDlkMAHFYDVFGzmZ5NPaXqlYUNdJ4ANWueAGCDOpe3LxQMYw8YQmr0HSo9Goc8ApFSuqB9cgbsKLhkLAMXyBYin08zTMHAxHIQ5XuhoWhcdyhNQJM9VRzPywhAo664pWURRg6u6RQ1H0Ak1NQPhnhDCpNTLMolqGlDTKqirvmVJHEUy+GAA+RCAUdJAylS1xlVwVFRTPT88MAxz3JNYcrbtpDThTpHSaMhB4DgRgGLFjo0g0HtmIo6qf1JEfMMCOGdTnhiOiB/tVPYlgjDKi3hRhb6SdIRbgUViTwUkH1wu5EkOKWEsjyxwK6wLIKuAdCycxIKk0y4VOGKSbbRsW97luUG27XYqbmeipIY6RxKB/WkZqhQKEkn+7FdrwWUpJqjwLxTxq0s5t7Uvu3j2xzEW0rs1d43f6FcLw0K30ryGZ4443N5L2R1OJg6svfyvd18B8Jmm3C6RPJvNU17jNqo9pHGtTGJBTSkYy4ccscW0vRHWolPuPnT5N7kWviUy+4E0AvvMpg9r7O+NXPWbeQEibe7uNqhQp/og8Tnyx0ePh6L7TPnymNI5f8AvHcd53Lynero7FYu+5ebb8SXutzu3YlYIi35pH6VHACrY6CXaoRz7W7mbW/bF7TzeW7xYe53kW2QWtpbxhvCdgfpt9vsYON3LX/CMwTxPVjDys8fCjZgxTqyyfd731222vra72Z03XZ9ouJIfC9nYV/1HdE6ZNzuBnWOE/0wcqivPFWHC2WXukQf2msYt3bdfcPzHdL5fE/uWG6bxc1N9vt/IdTWljq6jHWoZhx+WLMlVXQrq2z6A+3nlW/edXkG0eM28fj8EYhAvzpa02i1ioTHp4S3BUHiNKfhjF29z9C9tVX7am1fCY9uhsbq4tJe3s9opF15FdSESXawltZDnPSTX5ngKDGnF2pS9F+LMmWW46+noOMm423kWx3m77zef9pe2lrC13NJcv8AZzXkEIzkuJGp2ojpyHFhx9MaUnkU20r6fv8A3FM9j01t+2x8n/3D/u89xPe/cLv2b/Z7su9SeGWbjbN+8n2u1aKS9DdLxwy9ItrcqSKijPxOkYstC326Isx441e/5GI/cD2Bj9m7Syl97vKrTbrqS7ilv/bXYp45d8uY5BqaS4nFQBTLjSvxwq5XZxVbfcN10lsxf5ZulpdXE1vs+1QbHsMc8j7baEa5QjGgEsxq7mg/jwxqoZ7kHaVa60ZnzFWZaKc/4/DFiKmOW3RpLPGtxHKUBLRuv1cKEcKZDANH0s9jpo7Tbtlu5GLUt57eKGZmiiSkDE93poSwyBB/jg6DMz+T7zeWe8Gfa2+yksrl1/VjSQ1Zia6sx6jFVlJYmbx9i/3CN7Z+Ojx3y/2u3ryPwe5iJaOS17hj+8YvJcQSRqA8bsWIr8q5HGO9Ycly1j1LG92fE/bX3I8b3m79gtzi8hvtqgi3LfdjTc3i3BbcqTIsVrNrCyW31fSvDicRUyTn1PlP5D5V5P4bvG97dNcS+UbNf2/2W87HvEKNWNipHdj5SIR0yRsCOR4jGutE9Si12ikvJNvsike7bDcTT7LcFV0ygd61uSKtBIq5UHFDwI+NaaK+0psvQjH3DMUjdYySArdIXiKZgUriRWc7KmETR/qDURLnRhl6ZZfLDATTMGeQfTrzOvhX0qK4AOazoAYBSgGkUqSK1/HCAktlc2O8W/2O6P2rq2XTt+48a6vyS/A8jyxFytixNWUMZd02682m5ktbyPtvQGtdSlSMmDDKh5YkmnqiLTruNytxBFRgECFOfA88MAYqMjw9RhALrabtsrCqupBjcfDCY0aB9u/KWtbiCO5uaQsK3KUDKC2Wooa4in2sdq9yL8BKF3kcvFcR6o7pB9LDMZ5DhljXjtJjuoDZY9MnaLgEhWCghonkkXUdVakmmXHKmLJK5AsHkWNWBcW4p3ZBnpr9II5jlhwM8HkYMYpv03OmXQAWAagC0Nc+YwEWdWP+pbyR6YSwq8ZXSZE5uK1FRn88sAAnX7sTwoQwAVWc6VaUjKrVoMh/LAM9pk7ujui4UJ+rJo01C/RopkfjgEcQx9szhWkLt22LdDIGp+SmdeRwxSBeOirKySPbFBEnZAUhBnqI49JrgAN1QaGZQ6sumMzEZR6j0vrqDnzqMMZ4LJoSGFtE07AxFSNLDjq9M+HHCEFLLbrGZXjMkUS9kRMNbKzZ9DCla8ycxy9cJge1JExV3NxDENUaoaBZD01FdVAo5D+/ASFEccEUjnU91FLEJFZAAsxzzTgKhsjXDQpCFeEIpZmnidSkMJ6VVDmXAIz0nmRgA7WRYUjlOuPWSW0gmWlNNAQeFfqwAclVJIu+JZZ4i3Shahk0ihCqvOuAQOMOqOiQgvdMWjBkHbWmYPH1ypywthyeWQROjxsa3RpLMwLfqK1GiJrnSlMJDCk16JGSFFj1nuWbg9k04dRzBrX/AI4b2HAJ2k7UTxQsLZaGQfTqFaZaqUApwGATCpFjWstyJCk7DSrdQQflNRm5rxrhyLcLlZXFxKKCXurH2qAaVQg0zplnmcJgmDuAArfcaP1oaTitQtRlkRRhXOtMsJAcLN3THLI0vdjqSwGk6QNOg5achkD/ABxJAFDToRBcLbyhmEjjqKMRXtOy0Fc+AwxsAIVjS3LtIvdJVZpaMBXgKHPnWuFASBlQyfpqDW2qqyxZ62Y0zzOXOowoEwwxy8QUWQKiLHQmNycita5epPrhhATIJIVM0krL3WCu56QTqNWIyyHM1z5YAPaGIjgWEqZ6i2d+klaaiaZZ1zzwMAsUcdu4jcMoLvC2Wog1D51ox5nnhDCYtbxGJXVZLjVpcGj6F/KMiKAcPhhsDtoHZBI0ZljkTtyrAfqUUVydZ6VoaCnHPCECQl3Mpk7akVtWOQpTTSg40yFMMQASdnVEXMqy0eNHBFHoBmMj/wCWADumQo36cUbRLoLKT0ucwADXI4BoTwSdtlQghgzFkI1ahTPSDwp61wgOBlVoiGcxqWEbuKmNq1UOa558iMMZxzAGUsWeUECXID9TkT/hOEAFUKKs9WEkGc7zMJFfVUHQFpTDgAdR+gA7yL3C6SR5NQChjY8cweOBhAWY43kgWiw28daRNJUxrnpLHmPT0wACRZCszBl7hQq5U6mdV50HqOBwAVpIh7VqmurFjRgAyDgBqC/n40oMQW5No44ZZWPcMemRiUr+tVgCdCClFIPA4BaAZqyouoo0cUlUSTI6WqNUgGY+VMNIJFZhnklaWKFpkhCJnnIwoc+k1anLlTBA5C4w46AgmSJc5ZEAcFz18Dmchx9MIiFRMzxSIVaZC69rv5KCxIqpXifhhghV2USKWLvd5wHMkbdBpX845ioyPHC6DPIscMUYaAEiqkkUWIEVcsSDUHAIM6IkdUkNy00gjjePoBSlBTiary4YQpBW8RcTxxCN40XRErAiQAHjqOVAeBwxycYoYoVRG7BYI0b565DkRqFQKAZHBAQHDTIBVViS4jOi3YANIozVK8ARzOCRnmEiQpqUM79dwA4VgtaaagZZ8jywNiFEiKZ4ydEcasxVJOCUoV1UoRqYVNMssASwxBIxmDsGeVe6l6p9B/TANCBXmDhjBq0b6Xkj/wCpatxbxkVWStdKAH8TqPywIA0PD+okzBmRQB3F7iBWJIyyqxzoTgANS662M1x9ubmiRkDU0a6h+nSn0sTy/LhBB3UvcuAYz2SD9sK/pmpC0YinRSpAGABT+pLOFluUZ0cw2xVeIyBCkcSKUFflgAMChD2IwryyFwZNQYqQp1h2HTqocssIi0ARI0ijtW/y4tv1JVchtROaimeXPLAIPMscarJcwiNak2qoQTD00IA4Evyr88Akw0SMyiQuDNayLIq6A8bKw6YlNSK1zP8AHAmMOtq6CIkjS4uVZTcMoJOok00n+HGuJIlIOJWUSNNI6sf0nZzq0uoqPU8fTEhBmdwyh37jTuY3RTT6ASgB5liKn0whMMVjKsMvcjZjIehm4gUqK5ZpxFTQ55YBNnAzySSOugSLbsJZCq6go+o8R1NkQRywxh2iK3ZHS4qbk6WiY65RETQnucA+XLlhwDk9OEcmMxUNvOTqBUkZ1VWIqDSmf8MREGySq2meH7dljBmml1Bc3GcagUIANScMcBawLEHBkMNq5BjIANS3UDWhAp6HniIhQ7zTPI7IWWNlcRVOdForugzB9PX0wMYlSXsSsG/QGnWmpAdBbk3qT8MCExXAZEhSPWhSpVkcAo6nq6SMx+OAEGRk0aSMFLlQCgkJdXQgjIcAD8cAw5YkYvOsqQHtqK1BZJASozBrxqMsMUF8+2fvf5X4D47eeGX+z7f517ZXskkt74FukeayXA0yy2kqgsldRYhqgnMUIriu1H0HJFbm2WSZh41EsuxX0wj8e70YS6YP1CCQVJJQkCoyalcOdBrVlr+H+PTStL4zHcyNuV6e5uq1I77RCrCQCtI4FrUc2yzxg5GWFJuwY9TYvgOw2N9uNpdmFbPxH29gDW8BosRuI0DyzyqMiaZ/yxwMt5cnZpSFoY79+vd2y3m68j8t3Kn/AG21w1v45tgyN2IvpiHIAt1MfXEsGJ3ZPJZUR8yrzcfIvOfJ1vjK9zvW7sYLRdVFSIVFF/wpGvDkBnjtVqqKEcq1nZyXF7W+BQ+4HlNr4lba5PbrwWQbh5FeIhruV+xCLGWH1GV+hBySpxTmy9lZe7LMdO5mvPfH3GfxDxmP2n8cu4tt3/cYRP7h3dv+mLK0IrFYxlaaQqfUqn4c8c/j43ezs9jblv2qEY68eS28iupvIPIrmXbPAdjAtruaH/q7wDJLCzB4ySnN2H0ipx0mu3bcxy2aD8M3fyDzbdbJJIY9pt9mh7Gx7dT/AOJ/j23D6eilHuJFPE/M4x5oqi/Eb/8AC7uy2O12fxXx+wSeTch3dv2IN+peKCO9ebjJ9SRVA9C/0jLGFrqaJk0/a7745sWyX/uB7o+V2ez+33iUZhtNskKx2KSQLrdtKV78hI0pGtRlo9cX8aitF7fYUZ7R8Nd2ZB3a694P34eV2dr9puHth+121ve4lk2qLdPJIEYgzUQ5KwWgqdCVyq2N18tavXf0M9cfYvaXx5Fdj2i8cu/an9vPiaXHkQ1W23+MeOWq/bbVrFWvtzv5SEMoAqO4/HMrjFfK72aTn19EaMeJR3W2PnT7o/tW8stNu3HzT3n828Z9tZboNc7z5BuF9L5DvW5SSNUDUtU10FAofhwGLqZVV9u79CN4vtsfMbzix9v7PdJ18S3vdvJLGIKp3u6sks1llBoSkLVcIa0FaE+gGOjR2jUyXSRXDRxFugue2GbSVIIzoCKmuLClkh8f3Cx2q5tpnshfyRuWCSuSpzFKUBrWnDAxo+iHs75B9/ttLa1U7YlrPNd7PfSGbv3BUqGRk0lRWtBgklGpm3zq+3oX1zErwC2uTrmiaBIgyRmqgVAJbiCanFbJm5f25+PeP+4fhuxbBvk3uPtEFzePD4x5ZYxG62mwlZ6tbFipAV610iqj5ZYz23LK6Cn3J/b35J7Zb75DvWwz3kE+03zNtPuXBOltLQCirMkQVMzlVnOfI4qfsLqOUY79xt/b3csba037b7XYvc/x0SwQ+TwxQwW++hCKR3EsIVO+R9GoUPAUri7G+z3FN13GTIru82PcZBNBG4mD227WMqdEq16ldGACsOR5HMHGtamZ6CLdtrtUA3PaT97tM5KByB3rdzxinQZKRybgcSTItDCCsZRaMWrwFSCKDLhyPwwxCgCGcP3pDFIGJioCc8vrGWAYkkhMdEeMiWKoWgGfp88BEJVSyFwR+JIrgAl21eQW8lqNl8hj+523VSG7Arc2lVoTESc1rxXEGmtUW1vOjG7fPHbjaDHcxyJfbTcmtjucJ1RyD0an0t6g4dbJ+8VqNe4YBzpiREEjAZNmpwAHhaCozStNXocAEp8evft5xGzhGkI0O30kDkfniFkTqzX3t75BtW6/abZuN0LYppCzt1Rgc1YVBNRiVLwRy0lF7b/4z4/bbbuLvem13W2YTbc6CttOlBREYZ150xqq5MdkVfARSLShkCAvpBJV2yBAFDSg58fTEyJ41OqSONgjaq6h1K3CpbOtK5YQbhbqiRRue5RyzXhUhak/QxBOQ9fjiQgz9N5qo0ZYITJIRXUoFW0qK1rwGAAKhFkkMLhUCf5GTTpAjalSK/w9cMizyoid9I5ezKlJJRq1xuTX+NRgAGGDs7VkBgFKAkI0g+pdNOPp8MCYHu9CypEZZGR6m5kkADNq4p0kaguWk+lcKWNI6kGiApMEeNH6CGDOFqVKACpJBzAHI4YMCshW5kkOoqauKEPEDQ0LD4UpkMEAdtqJ3ZIIl0IDlJmrA5OKZhM8z+AwhgkkdwQ1wbgzKYoY65IpNXKKfp45g8cMQVbrII5WEhCVbXGuep2NADxoKDKnPAB2GNI4EuCglRaIkZajjMk0JoAa+vzwADKrGaNMpRGAkSMBXEr5qmkVoac8IcnljlrK4A1KB20FKRrkaMK5E8qHCAMALQmJEVUK6ZkZwqRupqyKrGtSD/HngGkADSaUl0VimDQRwKaFaiusZmjU9eIxKAYR2mZu2yvIY4axBloAeSnPM+uAR4Ad21FsO+Y0LMHy1mlSWFB9PKmExHXXTcCJI4zPMVBMjDrWldJbOpNMAwtUdXjiOmTts0otxVdIOZRSRmPXCA8ZFjQxxW9ANUgKkBlmpmPqBrT6QD8TiUiAEdxZVo01vMy1lfMBwDrMnrUGhpwOBCCmRX1k3SJcxKAhagjKimkEHMEcM+GAYVca4okGgIZXVlEZAKZVBDmlajPAM6Y44Z9DK0UMiq7QlSrNkXBJNRWvHDgJBKkfcEkzLcvJmrE151OfoKgUwhBLu6hnlRJBKoZIYzqOpKgauB005DAIARFLJIs83fklTTR6lFPHSBQGuWR4DCJAY0cyFVdS6pojds9QXiQSRTTmCcApFDxqzdpnMaqv69uKhlPKrD8opXLAgkIC6YwjQ1JrJE8g6Gr1Fl55ccsMTAzPIslZonmKqJJlIFWK9Qata/TywDAyLHJNLMI/uO6oZu0aOPwNKVOVfTAAPWEYkOz1BjlkpRY1IyAOZqDX54AWoXR4YZmAdmiNYkDihcEGhBABLLnX1wEgrUhilAV5VZQwhm+pnZv+XOnwwCOEssiFHFwKCNAD0Z5suWdcsj+GAALK8ZkWIqzxIXhUKRozIbSKj8dRpgATRheqcaVnAV0EmSkNxAIqCCc8JDFZjSMxwAqRLnNK60Yyj6QG9V/hhsjJVwWJllmeoYkFFQU7TKAQe38TnlitFjRw0CyDuu0qAyvO31s4pUoc6U/wnjhg0KpdfbgfShlnCxg6SW7SAGrEVoCefH1w9hHIpO4873EryvECnfQgFUWlHX6ageuCRwc7kiiGRiui3ZUeQEKClKCQkcxXADQEXEjOqTUtzHWOO41EaEJPWVp+YU0nCEg1GRZpDKe3KriONVy1AZuxrxoDnXlgkASSPQSAATXEpXqzjOha6hTIA1pngQBscBMQEkdGiFJZjk2sjKijj6ZYBNA4yHjQ6I5DEq26AFippmQyjmDxqMAB8ZoyusRiVwQupx0gGuv4BRw51wwCA8Mr3KHO3mVv1kGpwtOo504VpnyOEArjaMdPbEo0lJY4jpWh0lWdjUBjyocMZypaMWrTKe2yqCxr3FBybMVpXKn8cCDYPaGJJZw02gpSeSGo1KCM+omjAegywMTA3AjdrhmDLEYxJbSAacz+Yhc9TcPlwwgQobVI8caql0FCgyUovCqAtkAopmflhkgEYZDKmrVb26RrLO6mqMQFccielgARkRTCBCyOMJ34zIVCDQoGckQXqFBxpQZGmeAR541eJo6xiW8US2sirUKWPwHFj/PADYoa2tpJxEjyoIxpmkQaAs1KCqkcOVf44GRB6pSpjKCW4CDuUIjKigqSWFM6UpXhiMAGJDI8EnbEkYVQtmUpkGpVyTzFKjEoFApZZxqfVp6Vjt5CoADGhZlQDixJrXBA4Oo7EwSRkSESlACmkgkZgqRQaWAoTX4YaEcgRqKAQt0koc6a9RbiWOYNOWeGMP0Hvs/Q0olosYBIAB+oaqUB/jgFB54YlEiisbsSVhbJmUHMuozf0HzwxAxDBrV1Mg7lO2VAV9BWjF68aEfL1wkApi7Ylij0IEI1W7Lkrmn0ggcPTLEpA5IsYKm3EYkmjppTKLI1ChicyeHHLCGDNFCCRIaMWSVyrPpdupUrU8SeWEwCpIYoCkBbU5zn0szAVrpJJH5W4VxEUipYj3o2YoNa6bsIdL0pUjWvA5VOAAmVlZpVU9tpCjpGcypFK6gQc8+OGmAbIe4rPGFetNUznoy/KQOVeYwwQoNtGZO0kIJt2IkuA5JC5MtFNNVa0yOEM6K6jdmJZLerKbYKUatAM0BrmOOdK0wJBEDjDC4WaBXZ4otDRTqpAJoACoavLjgegLUtnxrbbq1hs5TC8m77sdGxQNQfaW4OmW9lBFFyyVjnXPljNexdjoa79uvGhBtib0lkY5pm7G1lwQ9zGxopzz/VI1Z/l+eOJy8suDr8fFGpIve3yhvDPD7H212CYLu+5n7zfbyOgLCc9UTH51Y/AY5zXezo101PjX7y+cf90b4uyWMujxvxQSRW5XNdQ/qzfNmyGO1xcXZWfU5vJy9zgj232NxtOx7e1lazt5h5iEsvHbCEEyiyl6C4pmGlbIfCpxe3r7ClI3d4VDYewPtwu4yXMVyPH3d7YRU/+Knk1zHoYFqdUVopKinME45mVvLeEbcfwVkxBuN7uO/317uO83sp/wBUmlvd23NiS7KGq7KT9RJOlRwxvpRVUIz3tL1F9le3nkVxZDbLFk2raWW08a2RaEBx1OzBqamP1u/Hlgs0kKstm2Pb62l8bsdt2q3sY9y3a9uBcizZqfeXYoz3F2xNVt4vqqTnQDHOyN21NtVBe23+a+N+LWvku532/wDZElo955Z5dRfvL4AELbWMdQER2OmMCmXVnyorR5GTcVQ0e3W37v8Auy3PZfLvc2wi2n2I8Ame08O9uELBLyRVJjlkjTOYAisjtUs3SuWLcuZYdE9f22IVpOvqfV7xzxlrTa7aPx6wTZoZI4kk3C/HaWC2VSqrHCGFKL9IFFXEKYnZS9PVsqvdJgN8u/H/ABDbf9Osd0gto7yN2ezsEXv3kiipkYQI8jkn4GvqcTvetFCf2BSlsjlo+N37tWt/I3l3Lf8AaL67Ikljsty3+6/0ba7S3jPUYNu0/cTMSalnbqPLD4jbs/3FuZJVg+W3lc/gFrrXbpr7yW/0Eu8ZWysVoc+wtGkf6uYGOtSepzrwVbJfqyLpto7ZNNQkZLEVqB1PWp+eLSqRft1zJ30XNdbBO4PqUelORwMEbu9j4O1NtzWcs9zIod7d5URYnZgR22FKkVOK2yyCv/d3a7Dap4LlAm4XE4eS97ZZ4ojI2SwtU6SKUIwSMM9nf3D+5ns+8KeGeZS2O3wv3JfG75WmsJQ+pSxhBKFqADIqaemI2pIK0bo3Zs/7gvKvJNg3zzzx23iiXbrO3Hut7a75JPHst5bXTGOO9tGnMpHU1H6l0mlDTGTshl0mJfcweFb/AHjbhsu2L7eX1+v3Tx2lz9xtA05RorUDqTQmmfHI4vo31IWXoZf8slnuWmt93SK4vbRR9t5FauDG6MRlKy9MgPAE0IxfTQqtqQKC7vtvkeZHBWZe3cwUDxypzjdRSq5f+Di0q1QdcQbfdQi82uVknY0uNqkB7iFq9SGlGTl6+owwGVx1qralbJWBFABxA4+mAQbFKqFe8DKpLdH+GvPV/A8MABEyJrpG5Ysf8PM50/DAASC4yDV4VNKn5g4BEo2TyS62cz2ckcd/tV+3/wAUNrnGpJMxmpzKt8RiFqT7yymSNHsOG6eOWl5bS714tJJeWEed9tz53NmeYZR9SD/EPxwq3jS25K2OdakKNK1GVeOLSsPilYal4hhQqeBwgQriyKlfy8RzGEMs/YNynaMSWpH31sh+5X/35GM6geoxWy6rNIeG+VXG9WNvtk9zKiKSLZXJZRJQEhieWWWJ48kaMqyY51RKZI+2ZVkgZLhGDq6Bo5E9WUVoAMs/icbU0zG6wcWWWuqFSwkUrrqR3XoFJy6a+pOAiecQxpLS6dIGYdqB1oe6ann/AIgP4YlBEBVe2ETSndQatRFEBpoVXGfH1wIZ5nRojKUikitQjXQc07lDTmCKGvIYZE7qQCFQpMME1bjuU0mQ5iMaRQgcBTCCAIjj1HQsj3MqE3Kqh7dK8VOa1HAVwxA5CDBGjksrhqhUr20Unicuo5/3YBgY/wBOdphFqNsdckrVrwogQ1HURTInAAJUlaSKKSk9tIoeNlXSEZ/pUspOkA8RhiAsPuUadmEMls5acJVQjrkrhSQGqRwwhhkKLIsrMrmObqLO4LITwp861wABiVT20RzI+pzGB0nUMn014mnAHjXCHJ6rrOtY5RpIMNsSCxjJqFYZ06hQ4YgrTHrhd1eQOWNwUBjqzfkJI1AHmBy4YABFo1kghlpIkKqssoyZVaoqwDUYCoCmvHEGSOzdxbejsHji/QjhUadVBX9UuSS3PI4YIGlVeSRHlWi6YUcClSKMxOf8eWHIxMkdZP1Yu7KJGMRrxcDqZmBFK8DngEHSNHGV7oc2sgHdKf8AsHGfTWuRy48RgEFPrV0jkfp1GQRpQqRU1o+VDTjTAAFVt9UbI5+3C92RUyXSagEOw1Z0zpgGFBIWuY1WJYXlWtroNKhs9R1AacAjmhhbSWsAd2csZLhujrUg6VNaMCAa4BMMaRZU+9zLNSJtKirsB9LaeKmmWGJBTN27ZAqiZQFm7UnUwVTmFPDTVuGAbDJJhE5kqzNKxLztVhDUcq8MMQU3aMA7Si4KnQGiKqR/zZ55+vrhSMJdwO1MAkUanTFkQwoMya/HIUwBBwrbxuxNyxMkeQKZyVNTVs8vSmeAaOQ9rQiaz9sgLrCy1diRn1H0NKDCYHEjaZJZGWihVBkBoxJzGlq0OkYaExLNMZuzKO5Fpk0xsRXSoP1H0YngMAQHl9EskoKklGdGZqaw2S5D48sIDkKmRXWJSZQjd6eQaRGVpkpI4ZZYYHY00xp92oeG5BUTK3VlwY1yJPxGWBggtY45ESMs2tFJj1judSHUevLKnwwDAILZYnkVnacfpM8RDEliCEWvLjngEBIH3Migi1qAaf8AoFdKk82pmDwwDPNJHG8sqrIkJGsHVXhTpb8Tw/DCAKuTJ0rK47s8epI2UaIwta6QOZrlTAtwDNCugOpgkMQVZeAqBQLQ5U+OGIrOWjx0DFLhH1SaxRmGnJVU5kcs+GWK0WHioaPtJHKFkGmO3lowjzGUjihyp9VcOBnUhqDCqRhISJHeuayZkqur15HDYgckkzsyyHuRwIsxiUUZQCRnl1EDIj+OEIAyyRxv9urOxk1yIKMFB+kkGprUZU40w0G4dFIAZppXVo3aPTdlKNVKAKQBUiteAwBAbCszMYmVGT65QRpYGpqxpyoa054QA4oqx9iVm7chP2ek6NYHUaHicuGADskci/bRs5eSSjxMVC6NNMn58eJ5YGICzmJtcCtMLY9meoAFX/x1oTn6YJAGUm7RiKJFFEys9vp10eooFrmQRzrlhgDaJonlOhUjuVBRtFVQmpKuorWnE1wgDdTyQa411JqMotVFRLEOoFq+hJNKZYJBMUnTMJDJPr7qkOyrTSwp01HBh688A5YRB9to7cioHZ0E9vIHLMhPToLZGuRIphwJ6hqSUdp0/p2A0p3BqeUt0rqcnigNRTlgEe0S28K27tqMZL20i6WHapmzR+lPymprngY5FmgK6zrNLHIqoFVAC7o5GrtluXAsKVwQEhrR/bzqWkjHEPKTqRWZjpCuTqBzrQ5YEJsBNNI6o5jijuRJRiDQAjLW1PWnCtK54AkPURF2KQyLHEFSc6zIwbV9YXLM+prhMJDT3Fljt4iZolI0F3YNIK/mOQAAzA4nAhhq0eMwhZFQt+jQFUdycga50yzwSAYsqoI2Znt7kEqtSxUt3CHBHVw5/DAIOZ1llCxkLGEZ55dLdeWa9Q00IHTnhkZBwuQiGeYdupDkDSpEgGlVPquXHPASO25mopMZijiZl+5FW1ED84bMkZ4YmDjlKmrSB4tf6hqdWqnBGPrUc8EhANEaFrkrA2oEMTM5CBT/AOzNK6ia5YYAVeQNoeQqZB/lpHy1csuFD8OFcEiDZpCEUsqrJqBWKNQMjSjDSDn8DzwgDGEkaxn+vbKqG4ANeo14aaBmyoaHjxwDOThYESJFPeIaWKKJW0BCR05mhz9TxwhHWWCQiCLqkroeQt0gqKsDU5nLngGGOsrPGyJHErRBpDk6hSMujjx54WwA66Wil7aKxPbajsFJAoSU4AfhgA7ojjZLiKSixIe+z0yOSnTXPicjggJFMSMvbEVGt5CySSN0yhiRmtQCDThXL54cjLC8d8V3Lfb+V4ojb7ZtFukm9bnNUQQR10hWP/v166VUcfTFV8iROlJNOeF+G3u7yWTWNmkdvuTJbzSykSXLwoR0nlGtK5Y5nIzQoOhhxyzX+2LZ7NFuPks9zHdbJ4rG1ptgA0pLfKtJJBXiF+kchji3t1OrSvQ+YX7gfdK5+13ryaac/wCr7w8tttpWqgKRQygegXIfhi7i4u63sDPk7KmEvDtiHkm+R2e4OYdu/wCu369agWK1gBd2djkK8B8cdmzhaHLSlmkPa3Zt28s87td1WERb9vEbJ4wSuhdo2WMdkXbA5KzIKR19dWM2W0Vgux1lhHvf5nYeQbrYeI7HI1t4L7eRm0tZUJKzz1/zFzU5kytwOI4KRr6lmW3Qzlc7vdeR7ssAkWxsnUCZ2B029tED2wQMwE4kc2+ONUdpnblmk/b3xyPYRBu9zGbq9kjEWxbIwAlaORumopk0rZseQy44x5bd2hpx17S19y8qg8S2y/tZbuK53vdF/wDi1vTAduNTVnt4VrXtQLll9RGKaY+9z0LXbtXtIh4Rt8/u75Xby3Ed1H7e7FcKke0En7ndLmgCpmQS0hI1egIUUqcWZrrBTTdkcVXlt7D7k+zHglv4xtFpvvk1rZWe+21pSK16I7LZ7cU0pVugMB9ROOfhxpTe33+hbnvPwr/qXLJvc+82oHie2f8AdChi0W4XNwbewYVqWErAtJSnBRQjhi5XeVf5aler0qU9ix/zuPYtyu9z9vvcLfoZ1vPPh4pHcuzPD45ZJZyqoFQv3somk0gc6DEf6e61s/u0/FklyadK/f8AuPlH78+M/su8C3C/XzPzTyj3X83l1x7oltua7lOrKys4eSdHgXSRTIimeWLMVstnGJaepK2qm2h8vfcHevaPcp5T4X4tvG1RLM/YuLu/huG7ZoE1hVFSBUUGOtirdL4mn9hhyuj2Kdke0jlP27d6JcxIEKmoHIVJzJpi4zjrsbGe8ihFrFIbhh2g6EsDQ0NTniLJVN5e0N4iGKRNpihu7WGSJUIKIupaK9Qak1zyNfwxU2X1RVPmV9HDczxtLBuC3TSxXljckhRVjQrwNa0pU4ExWRGfEN59vRJtu3eQ+By7hGs5O6pabrPZ3F1HqUFIn0yItFB4rx54bbIJamxfHNj9nt42zeL72e3mXYfLNvGm68C90bu3uVktZDU/6eV0NOFJqVNBzxnvBapW5n/z+x8UvJdytd08YsNv3KyVVHkPi10YYgzV1CWyuS0T140R1IPDFlGK2plPyW1vPHJYpbHdPvLS9QLa3kIKArmGilhfNSPQ/MHGiupRYhDzK9ROCmbs8f0lSSOFRwryxMgJT3FZaJUFsmrz41HPkcMQYsiHUrl9LEgSVJpy4GgI9cABEiaSsepX1GoYGo+OfLAB2tFYKdQVjUCh0+hHxwAdjXUGUvQtpzzofif488AQEdshqVpUkE0pgELtu3S+2m7W8sLhre4iY6WUijA8Qw4MDzGFaqe5Kt3V6E2awsPNEkutojh2zf1TXc7MDpiuSPqeAngx/wAOKlZ00eq9S91WTVb+hAnjlgkaKSNo5YyVdGFGUjiCDi4oD0PB14/+MsAyQ7ReyWl1HdW7FZY6kL/ykUIOIWROrLn2Hc0gaC9t3ZbC5dWnVD/SkHAgchXFFjRU2f43tW2eX7ZZar513NYQA6/SUWhAIqagcMsVrlvG9SduIsi0Gbf/AArfPHi8d7DI8Eo1/ewD9Eg1A5cfU46OLk1ybHNy8a2Pcia6kYSSTDS0RRYACY2PCoJrnyP441GVoRxKYlJZE7/Usk5yj6RUHp9OWFuJg9cWizMc0cSRx6JI6M7L3M9VeJFMxXhgCAwNE6rBPLpWLONAD2ijMQpPzPxrhyMLAWXXE6lpFdddR2xbqpIUPQiteOGiJ2Np7hC9dMqsyysikmkdTU1H0Enlw54QHBHHSVmKBAUuJL1mKqpJ4COvEk0JOWGM4WkjAV3CrC+h2QltSE6s1OXbHrQVwAzsel2ghQs0gBU3FT0RsSSWT+dMDEz1A9vNCGKNDXR3DXg2brnTI5Cv4YJEwayyamJjik0gfcW+qhcKMimVa5/8MECkAHaCWRwBNJI1Y1pR1bhqrTivD+eEMEGQd1Gn78crEuklCdVeZJGnPl8sAwhCi0Rz2FYlRavRpNCLQrxFCeWeCAkOybV3XMSIrLb91gilGyUlhwNSOHzzGIkpDCJ0V2cJHddUUZkYFCrGg0gmprTiRiYhMiu8dvbPoikkOgBTpk0jpDELQZHj65YUahIZMbmcTM4KyBxFJHUUDGg0NpyOWdeWEMCUW2ZwwMWjKS3QhgWpqPaPMAVqDhoAClpUd7go7KCYZSKqSaEjgeGRX44JEC7gdGfuFzHGTNFJUsSWzZQagDKnoDgkQVJm8DVeJRGEhizZa/4/+X0IpgkEjsbBmcdnWAyvcvGNS9LHTThlU/8ADAhwe7bRu8J7P2yEvNIGFAOWk5108xgEFh1nMsjKZGaIRxMygIanLorT454YjkwqUcyrPJHGSrxqo1IKAgEZDP1wEkej09tXuQRGwylUEmMZ1quda4A2CYlcyxrEwXtuWGmrKsTCpkIb4Z/DCEe1fbyM0SF5dRFnEVBRx9TSAEUBpwwQMIDRBWco5hSTVDbMw1dwmraRWhI/93DCDquUhPadZIoS7SqRQlmNOrLhU4ciCFjdbeiBHfuFoyQSykcQAeOXDCAUO0QXtMjySQ/qQGSiDSaZUBrn88Agr9K5Pbhtki+465IhkRo+qhPAemCSQW6OsVO5M8dwKwKKfpmtGqw+WGI86CkVyUEkQXUXY0IQ1pXSTqIbiPiMIDspCDtsolikULcGRASgIy+FT/PCATkTIJHSQO70W4iIqr0yBQZDgcyMEDPGQRsdT0lt5e7cPRshwVQMxXLPBASejWMGOFF7iMuttDkNRs1IUZdHGhw2Iq/VHoeRZ+zMWUl6EksVoixk5g1+oHgMVosYa8sgKvKpBtqpONP6cDEVUpT6qnmcsMD327KYNAUzhtDwiml1+rRnxPpTj+GAA4vEyTlUkWUkuIWZqRGtATQ0I4/8MAM4uqkTSHLt9x9C0II+linKtMgf4YJEw+GRljhmeFnlJMqsoElFJz0k8CxyphiPVVY27haRiSqyPUltTUC0+HE/LCJAYoxcpKrBnlWTSrqRqOg9Rp8BwH/HCEdZZKyG3SRftX1O0hLdxqgkuAa0AzbAAJCqpJI8cZs0aurNWeRhRNJoTQnM5YaEKdD2sQgQ6IZUoxlJMhLEk6RlQ+h54aEwIicqxJDozIutBSrJQaZAePxwAHzRyTMsitGT26ERVCxHgVLE1YE8fTCGj0o6XklJPbcUhR/0+5XpKsMwaVrXDSAVtot44SjrqhiWOJRUsAxrrWoyzNMhnhikDHIsU3buP1JVcnXQmORaEjTyFBxOENCiKqSSvLJHG6Eh5FzEivmFXMkccEggkVtxHIsLXERqY0SQVjJ+J5mtcANih4QEUSSMJZmFQwrVjwJHoowxB0jPG7XC2YNuCFl66hifzMCONeGAA+tIoitUC6jcwquhiQajMHMVNeOEAZ3gLh0lR5qQBGrlqOZrSoBIrmMIAca66Qu5VowQkYJWIjT1MqkHMHh64BoG7qVjeSWSl1GEUVAVEDDrqB1V5g+uCAkUdtKJbxqV+3qzqWChOok1BoKnj8BhwI4ygGSkTq8lvIxhkNQyCnWj1A1HnnwwloDBH7Z+ou3cp0VrrfSAaISTVaZE88SEKIupBW1WQSVaIqFCkr9K0NaeppwwDCotOrWqs5du0kx1P2WyDUBFCoqcORME7V0xIEm7Egjd16dNMyB6fLAhBtRFKsXb7YRgGmbNkR8hqpWoJy+HPADBMI1VDcBRcGQ0soyCVC1Cvx6csyVHA4UAmDaQLLDWR5pGk7hzFWNektTLSV4fzwgZxZVE9RCX7wPcgl1MhkWhJDVzzy4csCHGgJo0iMllK0bSO3deVTqUcRoYkAipIpTLCEG2kTyFI0iifs9c8UjliErnoIGYHHBA+4OljKTQPIsccqKCkLEO0TVoKtGKUAz/ABww0Y8bFtd5vW6We1WkUdzfSTGK4mQZRqc2mY5ikYqfh88Qs0kOrNOWSQ71d7TsW0W0ze3Pjk2jb7dmET7rfgdd1cSKoLVapC56V6RmTjDe3qbKr0NT+KbG3j23X16k/evt5KbdtjUB7ck+U8iAZdAyGWVMcfPlnRHTwY4Iz7277b7btO2+B7TKYbK0TtAKTWR6ankenHmxOMe9jdTaT5A+9Xk58o8omSGSu2bJptoFA+oJQcPViK47HFp2195z+RbuYv2zY4dg2RNk3ab7a93SNN680jUant9siGu2s3I4NOcyPQ4ttaSqqNA2+53XhXtpf7g6R23nPu0WlilGkf6fscEeiKFKZhdOkCnz5YzW1cF9VoYl8r3dDK2zwAf1llvgM9czUVFJp+UY141pJRkfQl/gmy21laQb9f2Epsdyn7W22qKWlunjoGehqdOogAYV7ToFFBf+131t4zt25eT75cmXctuGu5MZNFmlTRDZxE1oUU9RGfKoocY7J3cI1L4VLKQut9fzNri63CRbeO9uFSJUBJjto/ohtYgOp3IJ4cs/TGtVVEZ2+9n1L/bX4r497cbV435X5RZ3kvkm+Axe3PtbtwMu4zOKqLiYUrGWJzdukcePDjZ8nfed36HRxUarG3qz6ReKeGb/AORw2u6+7Is4l7v3O0+2tgxlsrXSdSm+av8AmZMsy3SOQxPFgVtcrn/w9F+9lGXN26YtPW3X7PQlfuJ7y+Ce1m2pP5X5Fs+yhV07Zs09xFbNORSi9WekUFdK8MXZeX8v4UpfoijFxnkc/ifI73//AH6+3Xk9vcbbuu+775XMZmt4vDfDJZNn2ntqCEa43OqXM5qcwlFxHFx+Rmc5NjQ8mPDpX7z5ceR+/e5XsNtbePeCeLeKbPYK0cNuu3LuFxJyaW4ur0SvK7cyeHKmOni4yot2zHm5LuykL/e73dLiSedYo6vURRQxwKa8dKRqBlxGNKUGZuRujjld2kDFGc6lIqCSagA5fPDCCceN2VzHd28vbK0KsGodQpzBPxOWKrMsojaHtnFLBKgLi8M4RkdjpEZrUlqk8By/jjPZmmtSGe5Sx2t1dxx2IuW78sj7gukGpJ45HMnP5YVbDdSFeIb1skW8bduPkXjUHkZtpwbu0vHeJJ4yNKxloAtCRXqFMWy/UpdT6AeDe4vshsI2m03r9vcFls07m5tN+ubprmEOD0iKd1ZonDCgAb+WKrbk1RxuPHl26/tp947VPH948Rh8RnkikurPc7LcbO23BbpBo7RaRQs2WYD/APnhfMa6B8v1ZlXyz9qm8WUV9c+0vkeye5WySRj/AFLwjcru1G7RlPpCqkhViM6MhGHTOtmmhWxMwP5RsG6ePbtc7bfbVd7XfwNS4269RklRgTVRULqGWRpXGyt00Zr0dSKSUJUhGVRWq5gEjjQtX54mVgG6hpKaXY0yzzPL4YADVdFWhH05o5z4UqDTjgAL6QuSmgrWvHlWn4YBBajrVa0ANaA5n1zwDFukT0YJRkQszE1LUNfw44BiRiBIB9NKAilD/PAIHHJJbyrJE7RvG2pHU0ZSDyI5jCaGnBYUE1j5nD9vfSpY+TRgCzvzQRXY4aJjyf0bFcOnuLpWTfchl3ZXW3XMtneQvbXUDaZI3FCD/wAD64tTnVFTUCmzYsQABrjNQvqPTCZJFjeLbmm3XfbmAlsrwaZEJpQH+8HFN0XUZsv2T8iGz71ZQ3DB7G/mS2UykABZDRT/AMpFeNMcvlVlSdPjOHB9drL2kl3zZ2u2sbe+tFiCS7cVDgowU1CtVTUHiKYx4u9KUW5XR6MxT7v/ALdtx2G2vt/8O22W62W3eSXdtlSv3EIRTR4wNWpQRWlchQ547XE586W3OVyuDC7qGWRGJXWDtGSGVAnajBbW6nIF8gKD8K+uOxWytqjkWrG4mdUMMgVXtpNQVp3062PNSTUkCmVBXEiJ58yFjqq24WsAUkua01ACmQNOPxwhQFK3ehZtRvSUCx3Eakl1FA3cNQRX+zDA6hhiVJkaRWyQMCUDhgQEatR0+vLCHAIwTLGNNvHMhZoCigqQSTp6uLheINKAYkI8qy3EszrKmpAsQIK6bmUCqlyQrKC9SKegGCQAtLIz3LRsYnVTrR49L5kBm0jIA8wc8sAjwVI0gZow8VyQsUfcFFCmisATn6g8hgEclBeRiiBhCwGgAgqCaa3oKGvpgEd/UMzvC8Mj0AqQQ1RWiqa8flgGAZmlEsiwJEYmEwVQChfIsx0kVBpkaYQwKMO47kMRIO4ocM2sBqIlSTpOdCKZ4ADlV4Vmk7QEDfqXsYOuJaggPVSCVAqpIHPCaGguOJVESLEXlEdbayVg7aKZ8dXSwpkK/hhwIMhlqszQxKs/cPcDr/RCihGnMsvqPxwSASdIjWRwIIGILKBWNgcgFev1E554UkpOAiFE7RCKpC3fAahUkalr0gGlGGZ+WBiCAsYjTplMsymWyjTqOsZcBXI8q4AeoqkkuJUt5D1M0gfqUKzyUAYtQcD6+uAAoMWSJCU1gPNJ3FBDI1ciQag8sSEFa3ljEX2qRCY/p6Dp0EGtM6l6jKvLlgALUlHaHtjRaH+lWoccRU0/L64Qw0JpnELIGuJv1lDMAgT6mHwpywCC2EaRqkYd3kfvRQ1CMKV6hpyp6KMED2CpREi/cwNIqM3beVuEjMaaagkAj1wQB64h0OO5FIdMZJ0tpLAcVLA5KPXAB5tcTuY2QJKA0SsSCH1ZgE8Kev8AbXAAV2e2k0E0GtJVMiXJYKQDkxUDhU/xwxSCUfVJ0LpVVW4YdLU+fEZZYADUC/5kKGtbkISSBT9LIgg04k4BiOAyM2pYRI7xlpJmJDdwZADP83LAIG57naRlSO6jNJ5wA40twzH0g8CBgADHFNSaSI/aLIzMzIaagBmAp4nDA84LIVikE0RGtUP/AL9qa8R05cMJoAhHB0uspKkqFjHUAqgV15ZgeuAA0uY37buJ6roTKiuvLPMAA8xgGeiWeMhQqKkSF3iTMsjVGTeoPChrgAICKRdRaWSNXUGQtUxAmlDTMsfh+OARVpBZdMS6+zIGdcm1My5AtQED/wBzFaLGHsHeCRbcv0klFckic8XPwpnxwCBl6xxJBKkZhfti3LZhmzJ1DM1H0nEkNilmaMmDW6rHoa8B6+hqgZkUIpngZGQccnbWSCePXI4LRTKc5lPJ2rQrQ14ZUwmASIxFadqV2S3iOrWPrArkAAPx+OGMOljhabSBG4eICMq+WoVoYxyNeNTxwAhYyGHthrbs3LuEjVgpaJVNVqAfzUJwMQiiMbdpwZBPO7FogtVZuALAUGR9csCAPqr3KzSzBks1KsAAdOXCgzY88MQGU9kxa1M5OtlU0LkHgwHIZ0wgDIBEQZzH3zK4jt0jUgFlplStE/gcCBni8QnQumgSB0DHIBjkUNFGRP44Bii2KOyC0dohIpSZZRWv5uqtKafQZ4YmdAilg6EWGFZNSvmVP5asePV6ccIQcUiDSosqgTUZLc0JdQoqVrXgOH8cA0ckiOnuyqEis9CUpWcDgteRI5VwQMO0zumpYVpDV4g5IbVxcjiDXj6DDQNg0du2LmhZSuiVnoXIOZVqU+WWHuINSSSB37cZiEKant36lGojQD6UH44B7ne7JBqNzrErkx1RdeupqKZZAE8ThQAKA1DvKvdNO3QHUHavCSmY48sIUSKloY5bcHQ0Ne0pzkVlXqWLUchQ54B7BnQsaSJEZO2CUgCkxyE1Jz404YJE0GgGV1EiJMk6MUDtUlxlqbLkeRwSAKNIpRHbaSyU0uciSWNe3nQjIAjhzwCBQOSyCJTK9ujgq1FFKEkLqHUAM60ywxhZESVZXC28cg7EgDBzq/P/AMpIBrTCAUqGimjgil7UshNaLqAd60C6hShpgEFosiTxxM9IYCTqzWoBoWcHiM61ryw5FGgoWF5HBQaplUiAtXTKqV6jWvAnIHAIEWNyYUjgZJUBdreo7hfV1KxUkAH5imBsYEyQs0mlTpai3DkBlAPFVaoIJIoAOGEAJT2luJFjQN3VNvHMwLHPSyUrQDOp9cIaBpLDFFbqWWSGdtVzG5AzXpAOXTT0B9MSFApjiH3La7RUnqtGc0oo4asqKfnxwthJCuHb7mSYmNqh6L9w7aqyk1KsoHUSAAoXCbJpF/7H4yvhGzLN5Z3I7ryBGkstiRhHez2x6gZmTqRHIzHEjFNnJOtY1Lh9qUbybePvb2JDDs0IjsbW1QR28LSdMMaAfm5seOOfy8nbX3m7jU7rGqJEXb2pNIkdn45aa7m4oFAdl+kfHHBs+5s7VVCMA+8Hm5kXffIXkKSyiW22tD+VXJUyD/3kYtwUlhe0IxHsG32Vnc3Hlu6xi7hsnMezbfNmLrcGPSzjOqxZMfjQY689Ec5qWSLw+xTyrfYNju2e7g3TcH3LzPdnqXnitjUaiuSJqooHwriNnCHVSx/90PJZrgbjv81DZ20QsNltgaLHbx9EQQH8rHP4cOWKaVlwW2fajMe07Vc77uVtYxK7yblN9xfT0OpIPqZzTgAK542uyqjKlLNC7Ckd9uU8lq5tbPaIo7faoyKpaWcagSScAodq5U5n4YyXehprUg3n/kh8jvrLYdp02+ywSFkh4AqB1yyNwbIHM4tw07VL3IZby4RIfbRrKz3mLyc2sF1d7U62+yC6obe2JFZJ0jz1mJBkeBYj0xHkOKx6jw1ln2F9j9uXYNhvPdzyDcZNgW+t2fffN94oLsWaAVhtFfpt4qEAkZ0+NMcO940X8WdN10gzZ7//AO5m0Jk8O9ghBsccWpJ/cO/j1OxI0t9pCxYmvJnz9Bjp8biXam+ns6mHNkpV+r/A+VHmXuFZ+WXo3zyryDf/ADnyO81Pfbhcy9iPUxrpDyGSSgPoqjHRx4VRQkkZcnIdtytL7co7uZJraxXboUjChIZJHavqXkZjmc8svhi1IztyIA7LIyoyyLXTyIOeebZnDEOUW3/c6WCKHJ69BYBsqcT/ACwmyaqTzaPF/ukjlbQltFUMa0OdSahv5YqtkLq0LLs9lRZEtZYFEXFJlGlcxWhUEnIjjil3LlQvv2+2yVrk/byK0EILQKRp6iKUDcgcU2sWqoze4lt9zcyRWaJC2kIAgLspXKg9fSuIKxLtKD3PbGiLI0caSk6mkYA6KZjicjT4YurcrtQTbZ5V5Vsn3UVluk6WUtTc7fN12xRa5iJgwrlxyzxYmmVQ0SOz9xfCt9FpB7h+OXF26gJBv2zSdu6jir9Oj6WHPqz+OJKrWzF3Jj1D7P7X5PINz9qfP9t3m5dO9Fs1zcnZt5tmrq7ZL6Y3z9Dn64bsuun5EYfRjB5Ru3uDtm1w+I+6njc/kezpIVtNx3K3KblaMtWrZ7iK6gOasWU4aSWtSO+5nre9pgs5jLYXbXG3TE/ZvJRZEUflkAJAYfDji+rkotWBglj7JWoA1KCCuXzHzxIhAn+oCukheeQI/uwCFBIcsrqCWOpGXpHy9cxlgGJ6EkxrmadQI5D1wCD11LIMiGH0BSDz+FMASKpIRcqskS0ZaGRGNKChz4CgywEoEfTpClSjgmq0FflkPTAI6lUIYGnMEYQFkWV1b+YWkO07nKkG+Wyadr3eThKBwgmPP4HFT+DVbGir71D3IZc2t1tl28FzE0F1buUkibiDi2ZRU00SazH3VsXjyktBWdRxoeDjFbLa6l5+32+k3O3vPIDc2Dq0YJ6ZAuYU/MYwcip0OPY/ST+1Lzna/Nfa7aZYgF3XbVa1v4DR2GmgAqTnVaEYo48RBHlKytPQuHyfwqIQLd2ItrSK5LxXa6CRICSw4fPPEM2FyoHg5O/cYv8Aev8AZRb+QrL5B7avD4r5DMZJ912e7B/026YcKCMaoHPElcvhjXi5V8K11RRkxY+Q94Z83fMvaP3C8AaQ+SeI3m1q0Tl7xh3rUopNJDexkqARnTLkOeOjj5uPI4T1MWXg5KatSisjDGhgm7hijeH9IBhIoFKrUrXIcq5cScbav2mJr1QYUKzMnZSM9rT2lIMHSCOo0LZ5mgxYyMBX24Mc+h/uV0qAKkRkPkYypGssDxypgagIkJMBMKtGJkmWJSvXpCquTMFGekiv40phEWDHUWuSsctmkYDCNHAB0gx6qjN+FPTCYAI+12pP1FE7skaXhVkJcUVjIa1BB/A4ADXYNLruYhdPa5dhidLDkyqtaVOZpkcSFARKZzGSP0qGgFQoFcyCOJJ9MJjOtSKVFS3ozgBYgGpqpUkNmdXwwgBwMgpFKJRG7ArIpUDI5QvXOgJ4YAg4rmFxIsYZpGYwW9QW18aAnmOIzocsGwHtESO6yR92N1IRlpmK1KEADJSeFcj64QwyJld5EgaNZCtax0KKKAqUyrX1zwSJCfSpMdXKXBdktnWkbHVTX1EGtacMDkDsSJNUnS82shEGlTlyAOoD4kj0wQM4Yu1BHE8AQEhhA5HdotSpY81rmcOBHWdBcCWZ2NzG1Q6KOptI00/wimVcEDTOLp6ZTC0yxOwktz9UbE5EMK1pSpPAYAAtC/ellos7pQSRldQoaCq6SBmM8sAHjELdSPruEQrDFCeiIZkMuWVeHxwxBQcKsheWUT2umoXMFgQczShrXhXCA9+me8obupeGitIASWrXTnUinM8MAwsQ1EiGtvKRWGLMUzAFc+JpQUwCZySWd4ljbRGYVBk0Cg1VyqvAVzqcAAF7bKjBmtmkJWeahRgRmFDHIqQM/hh7gBatxMZhIAE0k6m093TXTpHocAzjSRSLLrEy9x1aGPSTpL5hAOOkGuASC/17oW0RKrHWkca5plloU/ClfngANKBi8KNIzRn9Npcw8fAgjI0Px4YACyimGURmVTGCRChBWNuNdVCRgAK6w7TLMS6KHdAM60+njT8eWGMAqRd2S5mrKilZJNQJOs5L/wATlgEwSUOuJtZErdUP01P5SrfKpphMEeZaGEsJVlC6CuVDGc1jbLnywDC27kjwal7a0qnACnGjeinAIDG0qyNCrIB1alkP6ceVdVcycAHNE8SqZNemVxWM6WZtSfWCAdIJNT8MAyuKLDHc6+kBQXnIJDIaAeuYzAxUiZ2SNaKrzgRqgeBRSpUU6wxFQRwpXDA7MXeYyzy9iMRjWzrkv+ErQfUeFeWBCBPDGYVXpjnqXjlWpVRJkqsa5mvA4YgESIjJqWsrqRGsZqHpk5C8AvwwDTFKObdpHEyuroxjlaur/lqteoDDEerBDJD3EW0Ij7jLGaxk/kOXD1+GEOA11OsNqaZtAe9mJoDGeCq2ZOWWWeGRBd2sklysoeBDCHiCHLOoUCgz9eWBDBojRpMUtzMk7h0kBCkmtaE05elcz8MMR0JGrOyozxSKy20fxfijcwGPHniIQGWiPEsX6JeKN30GAgFUA/UJB40IoQcMAMBmiWZwkStqja2lYMI1V2B6QeJb1wDFC6YmZZHaMSXGdFzrQ/nNRpJIwxHIRoRyp03Gp2iFOipyowXIZZDViMgzwmSa3QyMg7qqEnCFtDo5rUD8vpTDQCrtOSUJEjaAZEkBAOri4IJpkPTDgJAQhHSMRzH7iBj+mTVE01Ioa0bUK1GBAw6OOIG5jMY7Kq0jmInVqPDLhlyocASHpJGt0JJ0dVUKwoDWSgBGuuQKjM4AOxJpcQMO8t4xMkYfpZTWgjYZnhnXCY5PaxqkEv8AlERF1x0qY2GQJYGjVHAYBBzgzSTCOaRJCgeFI1DMQoyXMj16sIJFsc4ZIEDKQjFmALfUD1FWJH1ZChwCaC4oU1TtAoW3mXp6SzBuHP6SeFK8M+AwwOB40VSuqKJtKysjKUNCTWM1rVWyL4cAKe7KGkW5pOryUCmms6qURXp0qw404nAGpwEzQuGVRL3VCVpkVJ/qChquRz4V54W4MNUoRAsMjW8b17EqDu1c1VxRlNASa8cOCLOPGoeKKORRGoqEauS8QKtWmWAchiltE8MKsuhldC1WQtXPTmCKjJaceOAQJpftxMLlNBK6O1Iah2Ncy4zFVzPxw4BAWEUZUvbLdW1BDDPKOmhH5lCgluVSK05YEgkOlfVM7h5FYxduYFgStVUFATQAUHSfqPDlhMaY+7D4vuO83ENqlLWC5ygnmUNUKCHJZmoCOVeOIu0BJee2+2PilnYXl1vnkF7Zz2uTW8cBTuAjpNGYgseOqvpit2JKsjvZ7p4t4XHtU3imzR7pumpe3eXpSVoGkJCSmNelnBNaDgPlit3+wnWrD4vHfLvLN8ut8h2Hc9+uZ9QW+SCR4UYijKrEUyJNKZYreauxb2ybR9p/bXcvDPGYZ922ySw3FgbmW3kFC0j9MYI9QM8cXnZZZ1eHjgifvB5BHY7XH4/byf5zcpKXwFRqkpUA/LHOopZ0dtT51+fR3flW9xePwHt2VuoF3cAExoq8CxqOCqT88dHCo1M2W0lF+Rb5bAzXtraG123aoWtNksVJCALVWuDzJZiWrzPypjZVGWzJr7d2tztPiO97xAe3uPmc8W2bXy0wqSXovzVifliOXeCWMrv3Rvoe7t2xRTNdQ20XduTnVY0OmNefKv4nDw+oZX0EHitpebD46+7yuU3LyomG1jKlnFtWgArSmoVpn6DniV7S4FSrRLfJ75/GNkTxiGPt7zOEfe5UIJAepWKopnpJLUxXVdzkss4RRUU/+p7pb7fHM9vFJLS9nUktIgzzH+EHgOZxq2Rm3Z9Af2q+0O3+YXN17heZn7D2x8JDNHdT0QXLw9ZChhmgIJNeJxzOXmSUdWdDj43uUF+7f9227+8G93PiXis77R7bbLKIbDbIHZEumhqomkWo1AjgDlz54t4HC+Wu+/8AM/wKeZyteymxhhpJJJAXYySGmZqxqSOP4Y6sHMlggpY5E0p0oTXPlyoeOGArhtJJWACCjikdQAoPpxGItwTVZJvs3i0l7LAjFHYNSVqA0rzIGfD1xXbJBbXFJbGw+PJCWhlh7iGlQASVCjJgAKj1z+eM9shppjJ5tfjMkcsNDIIJYjVmBTVQmjDKuR/jil3LljLBj8a7FrFA0MaXTkyyvQBii0J4cjTP4+mK3csVCR+OxGM3Vv2ambSKCpCPXIMcvw+OItklUbvJtouLu4FwQyR2h0dqPpU6BXIAHn8fwxDuH2lVbntK3EUskyaO2zKSWGpj9VCaUIyxJXF2lZ7hs0ygzUVh1AkDKvofnyyxbXIV2xyV3f7S0SyEQ9krwOkhSxIz+GNNMkmbJiI6ktxazdwTOQD9QLAAilKMpB4H8MXrUza1Lf8AEff7y/Y7SLYt6uv+6vGCyxybFu6i4RYwcwjsCwNPicVXwp6rRkq5OjJ7ufh3gfuDtc3kHh0Y2J3Qve7d3DJAGarBM6EH4GnzxVXJbG4sXOistDNe9+O3+wXj2W6QaXc9ChlAZSSCQaVNAK8cba3VloZL43Xci00Tx0r1QqSVQVzpxPPliZVEBbEmhD5tQSZ5mvADAAIJHpJUEMa0rUnLj8KD+eGAXSQgFlABNC45+o/9zCEGxSvFPG461K9UZ9BlTPhlxwDTgcLi1ilj71owa3+oK1NYoBly4fjgGxCpV3YZLXML6Z/CgwCFETPC6kErpNVYcQRhMa0LNjgHmu0yVZW8k2uLVqORuoF5V5sMUz2P2Gj+de0iez3DWd5HU6QSIpUbIEH1xKy0I0cMne23Um17gqwyVid+gj+K0+WM913I1Y32s+jP7Xvf669sN+sJ7m+cbFuJS23GAkUSQ5hiK8QRkfTLHLy91HKOiq1yKGfdPwb3Q2TzPYNt3XUiWl8xMbqQysSainOvwxbjz961Ofm4zq9C1TulsIyVUSICaIrKxauQUc8W2y1Sgy/JsM9/4N4x5PC8+97cHW8haOS2UmJWVjSjgdL8KjUDh14dbfG9Cf8AXZMa7U5Mje6/7SPYC9M+7ET+H7swVnfb2SlBVQ7RAdX8MK3JeDRXL8VLcl61Pnd5n+2mSxkf/tPz/bvJIopJWS2vIZrK5D/UAHVXRvTOn88aMPlqv+Ynk8JberM/eSeH+S+O3Erb7sc21CJapdulbeuRQrNFVSTU5fLHTx8qmTZnIzcTJi0siKi370S9t3ka7iWUtFJ9RjNNAPVp1CtTT5Z40pmRuALDUplnjWeSNwIoiCskaBdLKENKk1Bq3pka4cwB4yJMobtjvXEhSOMJ1AxihV0HKvKvH5YEuggEssAmWGRVWEroklYszVBIIVjmQCBX0w3oEApNUiLKjJMFDqiV0JpAAI1ENVsxl8cJiCySpKBDCpQK9VZylOsBVJqak5/DCGcdJKRAIYZSHSRQ2oCgzBahAND0jlzwEgun669qOOZ2VViDamNafpk0IJ9TpwhB0aqndSVXSCWTkG1Ky56CprUE8wcCItgKqyP2oQJ4l1RBenTGWp9SgkkGpzwADSOJpA6Sl2b+ixU1lZfqNaVFa0y/hgGBlMMrnR3VetCHqXLg1pDlmcs8NAEyRhtTuH1W8lHSoLkE6iTU5E/mpkMABxEjli47rwqztBHkVByDHVTjX1rgAAITHJGxIRipEkkZDMwpqAapoKigJrgGFAl2DMpmEnTVDUIwzNKcKca4EJgo0KpRpHjGrtKKHUaczxrxywAFMzLG1smqKOGoecUbXn1BTXM045YAAvHxaF2WAxKrJWrqGoQzA86HkcEDDZyrPFIZnLNpM7FQF006VagJqB6YIAAjNbmMhF7Tvqhnrn1DmMq+meGIAHVVn1Fu63CRhrRiDTt0BIIrywAcfTNFWKNVKvqmQlmOXPPNRXKmCAkKdxSSaGSgOmSbTU0BqCBXmTkcAAi0ji3c9UYXSssWRUoaHSMhVuAwDgCsjMwKBoC87NbzvWv1HoFDxp9WeEEAQYpIpDFPR1cGlanXStGK9FKc/wCOAAoNHJEy9cUUOl+yq5sVIZmDUyA+OGJgiJS8/wCiyLL1JqOTnNuogUDD04YJAAInklmjB0JH+lFK1KKW5ljy5YYwtXme3ZZQXaRSFnr+qClc6CudRQDEYA636kZhZSZrhCVq1VogJGROTHnXDEEwyu1se7JJ23VhJEgpqUKBq1cly4YYwMYaAduSYgyjJagMVI6XAyAyyA58cRYit5JZQkVCUZnLQdFdQpQkitCx+PzxWmWM5ojLxojs6UJWOWhXuk5dZzyOWXLEhHizNCDJXtiUgWq5kAGhd6itCfjXCgA2P9G3llERkUfqiKMMEpWlQfTkQcAM9FEFUxGORlhDEoCFJEmdNXEUJ4YYQKYkct3QFnkr27eQjV2gn1A+uXPCA9C8NwisJWE1vVpIuksKHPQGrkK/jhiPE1Z4lo0U8gBRyBImpa5twByzzyGAAqPuoxR2VpLWj9xRVak/h0gU6vwwJgxxMeoIZu5CZC0sOlslzp1Lwqa5nP0wxATC4VWlmIVOsFjVagkFlUUBJGQz44EM4I5C8y/q1GhC6mndI6gWH5VpkTgEmGx9uPRBrVllcmQMdIViacmz9T8OGEAe4moO/kQpjjkrQ6I8tNBkannlgInTKidEgU25jDPPoYy1U/nXIacNggz+sapELWKSFnATNXNDpCgigqeZwIkchiZbXSzKZrqJC9TQh1oKknkBzHHEhB33Ehje1qTMDpchKKVIqCTwqRl8cGgw2EIFje0Rh3CVTtsDImniGHLVWgwpA8UJSKvc09xtEIbNRWsisSPqPPACFBgoY4WUSmTW6QjpCRippqHECmeEkEg01QojuskzTBuxwVQAQS1CwDnVkB6YcCkP78SduIw6ipVrWgAcK3qSaVz4c8IaATFQ4gmi1zXDloXHSQFOkAL/AIs/kMPQGCt1q0qo6QTOTCS1AA3NBI/PKlQD8xxwthQeNysSRXUcMdqwVVV+CdyMZaR1dNCNXqcSFOoNkWORNELIHfTIpdmKg0IkAUilcx8MRGHUMgaKpFyGSWYkDtlEY1NNVK55DniSQnIW0kbRt3Iz3JJe33kbISKKVIWoA9KYHAagPuY0BS5eNkmd45STpPbBrmzDJv5UwkkGoBtxtVkjNvNAqVICM6SN2xSukVb1wOENSxTbT3F23asrO5voFQySdi3d3INaEFVaor+XjgdkJUsTPZ/bT3S8gWI7J7c+UbvPdfTLa7PeqrKtCFV+2qq1TlXFTyVRJUL58X/Y/wDue8sSKZvbUeOx3R7ktxv11b2ing1JoS0jk8hllit5fQtWM1d4H/tw+5EQgk8v9wdk2fSqkxbZDPfzIa1IWWTsrw+BxC2VvoHyzXnjf7GfZ/axbyeTXO9+bTxA64b26NtZuDlpNtbhRQcs8UOs7k1oW749+2/2M8VkSbZPbLZbeeIUjnliNw6mlCQ0zPmQcDxpku5lnjY9ss7aO1s7KG1tYVIjt4kVFA9ABQYTUElqZz91t7stutbm+lKgRlxZqfzNGKVPwBxwubf4jrcOrZ8wPOd3fctzv9zuZDGtqrusvGjy5ZV56f7sVYam3I4MdebbkNk2fcbgzCC73QsSVJo7SEqoJH5VUZ+p4Y6ONamK7M779quJNn2tw0l5uTopgUg5krGq0PrUnGyqM1vQ1Y9nb7JHb7IYB9j4Ntiup6dUlzcgqGY1/wAJLV+WMt3LL6IylDay+aeT3Egr9i85a8uKmkdrEajSfjkPnjRPair+ZloQ3Frd7je+TXqLDabVELXx60WhiUxVAIU1FWIrlyp8MVt9CxLqUZ5Dud7dyXl5cs0t1uDs4m11OgMBU51zAp/5Yux1K7skHtX4Huvm/k+0+O7NEZN38ouRawVGSQf+1kqPQAiuFmydqHhx9zNdfvE919u9uvCth/br7cXZgsrSxjTy+6i6HkkXLS7CmT8R/E45/CxfOu8lumxr5eX5VO1bs+WBIklZjqo1SzE5/hXkMds4wNIxcHT+oaMNR40Wn9ta4G4GqySjadm+6VYnjWOUGq1HH1JPyxXfJBopiLR2nxmF1WPtVmYfpShBXVUkoMqtljPbIaK4i0tn8Bu5ZA8Fo4U5GUVGsFQWrwNOXHFFshfXEXFtnhttaQwukgoTUhh1HVkQOB4Hjim1y+uMko8c7ckU8MQaemqOq/IjM0+GK3YtVB1itI7mZdaAyIpM7ChJHEoQacPSuI9xLsAxbPcxSNIitFFc6isJXpA+qp4njnzwu4OwTf6ZJNDMe81uCxILGpkBGYPADKvrhdwdhGNz2GOVjGtpIdYozIuYqKqy1NKZ4j3EuwrjdfE3Lyyhu8gIovIkGuXPElkE8ZWe8eO3EMcn3UOpVydafUppxz/icW0yFV8ZUu57YEEqrA9JJBpRswxrTI/iPxxtx5TFlwkKuLcRFT22dlYip6gTx450pjXW0mK9IHjxjyncvEr9L/bLigGVxaNRo5V5pItaEU/EYdqKxCt3VmmpJfHfcrYu+6KFjjH3KhgZbSQggD/0+mMsPGzTpdGZ/JPHL/xyd7W5SW4sncta3QqVy5/+rP8AHGul1YzXpBF2t43QS25MlRqlgzqhGZoa5j+zFhSJiGrVnAoa1qPTlQYABszhhXISdJFBwyJpwpT4YYgAAoVIPADUa515DPlgAXW07wy6qBkBzrULxByAFM8IaFNzGlwn3VuxKknuxZdNBnQ+lTXCGE25WSkbtStdL4GNDvtd9dbPfQXcLaJ7Zw8WeR9QfgcQskydXDJd5TY2l0LfybbQq2O8Z3sCDO2ufzAjkCcxiutujLbKdUBWUT7bb3QIM1qRBeAcQPyv+OIvRwTT0J543vDW7wxzPW33CMoxc5CQZKwPIg4yZqGzDkg+l/sP723+17fsezi/keLZbYXtxZ6ipeWJiAB1UplxHrjk5E6vQ6VKprU+kHtP7kXHmN3DucwktkV0n7TSahKjgU0LlpUVFajjiHHu0/iKuRiXboW77h+8w2WJ9m8f0zbzJGdJMqkIwyIAYZ0r+GNmfmNrtWxi4/j6z3WK/wDHPFP+57qPevKb64u5RGJI7WKTUp7hqprSuk50AxmxUVnqb8uTsUI0fsvjOxWMMcO27NYwR5DpijYnM1BLoSTkeeOtixVS0RxMvIvbdjjf+CeJ73bzQ7r4xtu4wXFO+lxaR0dqcWUAA41rFX0Mr5GRdTPvmf7LfYbzCTvyeFx+M3rOH+72SZ7RgVzrozQ0+WJKtq/ytj+ZW38yMe+a/wC2/utq0954D5xb7kDLrXbfIYDCwGkigniDKaepH9uLq57rfUrthpb+VwYr83/bp72+3ZLeS+AbpHC90zR73ZRC9tiqVKu7xAjLjmBjRXPXroU3416+1FKzDsSMIP0pIJXmImo0YocyUapFTyxoTTKGnsFhWt1k0xcAkkFqHXpLfnGS/P1wCBUiHRMyy0cTx2zjSXLgFiDmQqgVWoqT8MLYW4GVNJIjnZUmzh1AVU1JUuMqV4HnhORh5d/t1BtlUyCkVxA5YRvq41Brn/8AQnADYQZF7iPMjoqKCIT1gSVyLNTMsSD8sAHohIhMkylmIYXpLLRUpkWz4UBNMq4QQFB4oBGSrpFD/WDEmQuRVZFFch8OFcHUEwaPKnTFMlwWDlpURtFG+upTME/ly44aYHFt2dPureFp4w5jaNGGpiKaaE+mYbPDkUnpV0tI8cxS5t01kL1htOQJZhWtMiOXHCAKVjHE+uLRFKi96NatQMOnjSnr8sMYYDKQymFe6iENcKAVEa+iA1JY54AExVWVXXXbtEdMBJBUUqan414A4GAcEknRraKo77VlYnQGNKgZ5A04jCA4ED9ot2isTM/3CMVTSnAEAU4mlcSA4Ule5EtTNKtO+QQOodUZAApTlXjgATlJnklrnOSSsqnUgB/Kwb8wH88IcHGYzRxRK6iKmiBASpJHHWcwOH44AD1VHnaOV26oSokAA6uNCRXlwwxCbUyxRIkrRyGqvKaUUKaKGOfHkcIAKSxxqJII9D3C6ezIajWKghur0PD1wDQCVcokaNI41ddIiNdcgFWVGFCCANIJwJA2AaLuusjOkdwKrVGGkoTVqRg5Ec/78MR1YWnSWCLuRiE644KgnVzBIJ+rlXCgZyWJ5AVgp34zqbtNnC7HNCBXVX44YgFF6ACXzMk8bCmigo+sAkcssEjOBRLKi9tFVOoaGoXL/Q+QqBQ1JPDAgO6Xg/ToJWWM95kNRKWGRJpwGVTgQBNHjW3hYFbaZCdIVn0yEH6q0GfEjAI8oDNA7uZo3TtuAuocDTtnKlKYTGVqwdFIaPvCd9ECqwiNQoqa1q1eRGK0ibYWW1IguSssqsDcW4J0xpHWqoaZ6qcsSQhfRHlaBXIX6Khhp16ckBIoaevPAwOHVLCyP3BoAEpkOnuVNOinCnE4QA0RkYRRlLjtqRay6yAlBTMCpJPwGHsKQpFCxs8VY4pj+pcKrVhbLXwqCxz44iSDHDRxoNDFhXUGQF1rwYimYNeGGJgKykzOhQtNG69l6gkplRPgeeeAAcJESwupZe9msdSRJozZ65888zwpgSCQ9wgljeQCKUoDOSxVkZqlUoPyUzqfXEhINjMaLEywtN3UYPEucek1popXUVJyGAJkENHb0oXDyqI2uASAyg1CBszX09M8OSMHgiTROFRnRQxRa/qo6igdjzqB+P44UBMBjKjRi3747UVKkuQobiEpQE1px4jDgJDFUKzuVExa2o8Wkkx1oKqxpqNMwcHaoCTjjtGFQDLaQxrJcK5JyqQK0AYkA8F/jgGKFEYMBkYE3KtEwlFS6UOkaiCEFOQ/HDkNQBvUtkX7uRBNG6oUdl06B9GnTp1EV44Ugk2O207d5FvRjPjPju9bzcyMxuRt1hcTqQ1QCpgicA5VxF3gn2SWntXsB+4HynSu0ex3m11B0tA8u1zwJqJHWzT9sZjniHzEP5bLW2b9jn7rt6Z2X2kl2gKzJbS7luW32YTU2fT9wTpp8MHzUDxlpbX/ALbX7lL+4abcLvwzYY2Cgx3O5TXXzOm2tnGQ9CDhfN9A7UWJtn+1p7lysX3n3V8VtjKAJltNtvpsloRnI8QqCKVAxH5rBURNLH/aocA/6h73EFnZyLTY0BqSNJ1S3JPAZ+uF85g6r0Jht/8AtXeDxJEt/wC8Pk90VOuUW9lYQh3HA0ZZKZUwfNYdpLbL/a+9lYu0u4edec7ikVC0ZurKJXPMnRa1ofTB81h2IlVh/tq/tls2ElxaeUbm66qPdb1KKBhQgCNEFML5rDtJfY/7fn7VrHtV9vJrxoRQG63W+kJ+LUlFaUxH5r9QdUSWy/ZD+1iwEYi9ntom7ZqpuZbqck/HXMa/jgeRhBLLD9rH7dNsbVaezHiatp0apdujmJFKUJl18sR72EImu3+zntNtWg7d7aeLWJjA7bQ7PZKQF4UIirlhdzGTC08f2LbwVsNps7LUdR+3t44hX16FGDuYDrpVV0DICp/HClgBoPSvOvrhQyUnqZ4aQ5OkjOnPLBAIJJNAKU9cMCPeQ7im32MszMACNAY8i2VR8hjLyMiotS/DR2cHzt95vLH37dZNttiTZW40LTlGmZPzbnjzeW/zLz0PQYcfZUxP5XLb3ZurdGLWUTNJfMcidI66EZ0zIxrxKCGQwp5ruEu+b28cwItGumYISapDCFooAHoKY6ONQjFd6jd7P+Pf96+6kUaoxg2aKW+lkoSoisurPPgW4fI4uv8ADUprrYt73N3+O28EfcVpFu3mlzN21yFIo2MMY+WlSBjPT4re40W0RUPj9idu8ZgQ20ovdzKW8YjqHdj9KqDStKE/jni21tSCWgm883CPb47HxPb1UW9smu/ZWNBPIKBD8l/44ManULvoVA1rPuu5SCBwIIgY9QqRRelMq5DPF89qKkpZv39rG0W/hHi/n3vRuMKQxeKWj2njhl+klFAndTwqx6RTiTjlcy3c+xbs6PHpCk+bXuN5TuPnHlu9+T7lIzXu8XclzIvUQutzpRfgo4ZY6/HxrHRVRyuRkd7tkJSDvOsfAEZjP1zArx5YubgpVZZO9o2R20xqOBq3GhI5njyHCmMuTKbsOIvHxTwW73SeJI7dlz0KANYANRzFaYx2ym6mE05sfthDaxQs8aXMgH6aRggR04laeh9cUvIy5Yyzdu2Bo42hWOSJVFISeDDnQjgeOWIu5NYyQ23jyxMA8Gsxfpx1IIYUoKcTwxBsmqwGvZx20Zh7faZVIWYsSy1FSoJpmDiLZKBsNlbW8ZodEUgGjg2t6nIkmp5Yj3EoCHs2uOspJFADRMjShr1ACp4EfDCkO0DFsJBIVWCKArEqaFlrlkPw/vwpH2gp9tt4kWZo6SUMbUFTXSaZkDCkcEP3LbYSIlKkENUkj6Wy4dNamn44UhBAN18cglZ2epKcBUDMEk0yOWJJwRdSnvJPCLW8TuRIE0hyx4Zn8MwMX0yNFF8clAb7s01pNJEU7iioGkaWIy1UPPPG7FlkwZcJAJrdUZ5Sr9A+kMSfjnlmMsbq2kw5McDn435JfeMbgl5YykacpIGY6ZFrwYZDPDtVWWpVS3azT8se0+Y+Pi+hiWS0u0BnhWokh4glQP8ACa1GMymrjqaXFkZl8p8buvHLnUkbtYTt/lLoVIIPI0GR/txrpfuM2SkEWoANYPbIr0D1H4jhzxMqC6iSmqgoCKni3McTll6YBHGQKVYBlFOLCg+FCK8aYADl6xooUpmGVa1By4enOuABfZMbObUzoQwo9DqUpxofmMJkkPN9ttvKv3u2KRBSstqR1R15j1U8iMKSUDfGY2QRyMChyEnND/wwASfYNwW1kn229Bfb74CO5Q8A35ZB6YpuuqLsb6McVtTtt7ebfNVoLqOjE8GWnSw+PP8ADEG51LEugjsp5IXk26QlZomMlt/6xStD6EZ4LKUOlocGhvCvK5JN42G1grA28Qw2VxM9RH3AxFUAH1E0YmtMcvNjhHUw5ND64e1XmxsPHmu13NUvIYjarb3Y7Ye3hhYPWUZAllDCpxzoNllMCzYPIZd43OXfzLGkcty6SWs1FYQuA2dRTnWpPzpiKWpOUlBrLwXd7V/tm73bgZVdLmmhpQxFBpz4EVri7HZLqZ8tZRqrYHSeGNz1avoYgVIrx/HHc470PP8AJUMlKFaVFaH8Mb0zE0DIrlQUA4f3YGgPFFYj0oaivH/xTC7RbCWWyhkQqyALQmgJANeNa1Br8cRaJK9lsykvPv28+1PuFHcyeR+EbTc3Vwjf59IFt7pCwoWWeGjavQnhinsa1Whes6ellJh33E/27dqZ2vfb3yW820xxL9ntW60urfWMgTcKBKoXiSa1xNcrNTfVEnx8GTZ9rMM+cftu94fb2OS43fxafc7WxuO2m57Y5u4ircCyxASZjkR/IYvpz6W3095Rfx+Sr01XsKMmhMFzfa6rcICZFkrrOkjUukiob4jhwxrratjK6tb6CeSOLU+m2jIkUs9qmS6wcnIYg0qK9IzPHDIQcQtPBSSiKgWVtdKhgc1katVLVyrwGFAwt/tDNLbmaS2dgndtz/TkDDNtQHWATw/Nw5YfQSYOIMsslx3O5AU0ySOQR21pp1gkFWJ4A4QMKiZ7ddY7yOjuOxItTI5BzBFchnQnDgQWsoikhY6NUkvet4qMA3oVNAAy/DABzthIzctMIZ7eTU2oEmRvVuQNDTAAf3WQPKI2KwNpa0bKgbJCQACdXz+OCQkKC9sPBaMasmo6gQ8RbqFCRUj05554ckkDUQKC4kjki1VSF1GtZcqgihqTw+GABMg7ks8cfbJlo00bkFEHxJ55UwkI4YklnZ+2qxyLW4tQeOjKo4U08cMAx+y5aSUgxvFRHSuoeq8qZgAHDQADEehTLWZRSV0JVYRTOhIoS3DBABMwpcQ6zphFe0RxUMSCx0jiPQ4ICTgEkad4MgkIEcesqWdSaanyyy54EEAeyscjjutEEcExL1x05E8a8PpBwxgDrEysitAJA8qnSdJYgdTDl65cMsREAYym3EbAxLpBRzm0oAqxIGYJJHzwAwxwsXamljKBpAITQha82KipBLZ/EYAOOZGJNwsRNwQruBQ6gSQlf8OX1cBg2GF07MkapNpMuSqGbobPg9OQNQTyxIR5V7KQzxy0JDxT6idTDKhBpw9Ms8IYKQ1laQASsqCF5g2lXJBHVQ9K5Z044BSFuiTPaxROYmeMCRFqKrmWJA4U9BxwwkDM3bkE2vXoZo0QE1IYAaiCcssIZ5VeGJYjK1VzVKEoEC1lFKZVOQOATK1jUyPciNhO9u6sCV0hcswqEAjLmOeKkybO94iYuqus7OWtIo1JDNStWpwPzoMNMQFQBJbli0zsWAVgGYhz1V00yHL+3DaGHRukatEqDtqhCdxgdYrQsjHOtOIxEUHY4ULqjSB4qZuq1dYycwaAUrkKA4B7A4pFZowjUVn02siVzZakmQAU6hQV9MMJDBG80Nw8zdqitWY0j6q5KF4/AHDDc4e7JHF9wHgduiNmJALU+pqZ0FaVGERFUAZQVQJcPpLXDt/RkHIg5mgBrpHHEkAlEctJY6Dus2uZahgADqL1NMwBkMMIgONpKJFpJrgnGmEh9Kh466gFplwOqmfwwQxKwakZV4RC5kbV+siMSUZxxFahshWgOBaA5PTX0FX+5lW3mZAsbkrEXNRnkSan0AocJ2CCeeJe2/uN55dQjwX268k8tfs6HO1bXOIcsgwnYLGudK6jhO6BUZrLxD/bu/c55WEl3fx7YfBYbyONWvd83ESXUcQyIa2sxKa0pVSw4ccQeVEvlGovEP8AaitY41bzr3mvJSVYSWnju3RwKpcktpmujKxGf+HEHmJKiRpTxj/bh/a947223Lx7efM54gevfd1meMsxFW7NsYF5cMQeVslEGifF/wBuvsP4XoPi/tD4ntLxABbiPa7eSXIUH6kySPUf+rEHeRyW9a2drYRrDY2sNhAuQit40iUDkAqADC7mEirUzcXLetSf7MKWEgaKDUKD6VwtRSdoDxp6k0wwA1Apww4kZ0MPXjwwdoAw1MsqfD1OCAOFjlkPww4Ee1etOPPCgIPas+R+WCAg5qPM/M4IFB2vxzwQODlfjQeuGEHNVMq1PIYQQcJB5/M4B9p4ZnjwwSSg6BXgcAQe/u5YTY4EUlyis0eoFl+tQRUD44reQaqzLfvH7jQ2E8+1ws/csbdpogODyV0g0+HAY89z+V337V0O7weNFe5mKd5nu7TaL7c59LbhfVREYZ636iB8ufyxRjrBstbUxb7sb2Nns02qOkt48fduXyGQb/45ycsbMNZZnyvQx/5HItpJCkzCUWMRmvCXGbkmRtbD4kLxx0qbGG7Lo/bDtKWm0eaeXyQPI11bjae7qIo9yepQ3EMK/wA8R5FohBhUkP8AcaGHyj3A2bxGwmEO3bEyQsubKoQUY/JRU1PM4hiUVbLL6uB23q/s/HI77fUAW32INY+PBmDCVwpDyUpw5VwatwGykzi5vNzuZtwkkaWWrS3TMRQyyk6NWVCefHj8saNinclG37ObHZLaeyQndt/uTaWcSrmwJCu6qM86kCnxxG1pfuJ1qat/cBuVt7b+wHhntvZOlpuO7xO+9QpVSV1CRyeok6mP/HGHAvmZp9DZlfZiPlq/dkdpTSrkFasKgg5A1yGO4jiPUkezba8k0bmJW7h1hCKKAD8K0xny3NeHGaE8P8Ve6kigigRgz1Q0YBieJrnUUGOdkudTFjN6+3Xh0G3W6LNHEOlayrxCk001IIFDnXGaTV2wXxabBYw9tbi3JSYahqA6WAP1ZUpgAT3myQlmYCOMGoAT6qChDZZVqBhMaRFr62uE0uE0kBikpIEi5kAgAA/x54jJNIbXsVLqzKZC4DRyOeA+QyGItkkjg26MKJKo8tTpiOrnwOn1PrhMEGfZZIgOiTSSYCChy4UBqM8IEhNdJqjyXtBmCE5ECvHgRTASgap1jKvCEeaOQ9JNCQxHPhUZeuBBBGru2mm1AEOVBZdJAWpFSWpWnDABEr22cF1jVXjXhqIJryA0jMHPPPAIgm6QQS/cJLCQqnSpIBJHIkGnwHHE0yDRU+/bLBdIe6upQARIRxIryy/HF1HBnvUoryPxowCSSFhoDElFyABHEHMEf2Y24sphy4isbixMLs4jpRmqQpYgn6R8jjfS6Zz8mOCwva7yyXZd4SwnuuzaXhIQMf8A2jZDVXKjUzpiOWkqRY7awXx5P4/t99DI2R2m+AjYk17EpOXM5ajUHFVX1Rc10ZlLyTxy58fv3tJCZYC1LW4UZSDjllxpThjXW/cjLekMaBF3YqxlO7EVUw04ls61PIUzxIhATIzKG0HUor3EpUA59QJzoa4BAo5FP5MgKLTOmVfngA9GHCEuAYzQFqdKn4/hXLAId9uv3tZUr/T4GlBpJzNK8fliLUk6uB8uduguUN7t7I0oGqW1Xg1eag/zGIzBOOqEkC96BxGpW5gBJQZkrzH/ALzxwmCJhBcxbrssMz9V/tzduY0+qKla/MYoej95pq5Uka3Zx3Y7iOuuIJpkB+pPyn5jhidfQhf1JX4fvUv3ltMDGse3vr7wkVZVYmoKqcwcvy4z8jHozVx8mqPpN7f+b9zxnaojP25L9wkU6FhqRcmLamKlqk8fXHEvRJs66vKkvGz3WK1MEBmjsr26khjngGnIUB/WUgxqfWppwxCIJpyjSPt95asfbW4ZYk7iCSORoysYrUdtl6SDSvDCWjG6yjdHim8o9pGiamXUulTnpWlcmNNXLHT42SEcblYtSy7a6RwtJA6HPUMuPL8MdTHkOVekDikwalDXkQDwpi9WKWg6vDPiPXEpEcNKfVlzwAB0rUGmdMhTCgJA9pWAByNKEjLLEXQfcMl/stleCkkCE686BVbgQT6En44z5MUo0Ys96bMzn7hftp9tPO1eTevGreS4aSSRZ7ZFtp9RrQ9yPTq+RxmStjc1cG1Z6ZNL1XvPn37k/sX3XaWS78N3kMkfdlNhuqnUAcwsU6imrPOo+WLqc+1P5kRt42mXXG/sMQ+V+3vmHhlwlr5JsF1tPfUFrlYS0T0A0srjJvhzxvx8umTYwZuHkxPVEJCzMkf1SR2koFXkUBgGpq4VJHIZUxqUMxtQCqjSwyQs12zy9CoesaqoXcgEEknmchggQBY59OqL9TUdC3ETEt3Y3PQzemfP+zDECr3GSHtAIAHt5X6JA5PSMsgPyig/44AgA0ruzpQERml2SK9vlVRX14864BAJCsBdTEztBp0TrIAaZUDAUqSR/dhjR06Xjgmkk7chfuFgoKinE8OVM/TDgTATtA0mtQ8iK4NAaIGpmysOOENA3uO8ph70ccbt+q5H6jPxA/DLAB5S0bGYfoAR1mLgMqsOFSCPmcIAACgMV0CSI91Wck6kbMGgrT4HDGFMolupKJJP0apCHoJD6EVyp8cMUnNcixCRUMTa9It1GqPVQUOnOnLAG55lJV3lt1efh2EAVtGdAuVKZVPpgQwBS2b9WJVR2kXsBG1FmpmGJoK8OWAUhINxM5hIErs4/Vg+mtdJZiKZ14fHCGG3SyByup2iirEXICuSB9ZalCB8DhiAPJ3e0ZZS0qOEEyghXHLTln8/wwAdVE1SCV+wsZLNG7U7YH/tCOqoJ4quAALOUCBVRoVdvtAKtqJr10IPAnngQwXc7kkba3lEYbuRo2Up0gM1aZU5A/hgEBYSL+otpFBIqogcEFWH5TSppTLMjANBH6izTwCZ3mYGZmQVbVwAWvPPPCQgBpHJaq0pRABFI31AEGoTVWprlU4Bhr6klDpJ3VQ6Z5ZelalctFCRQVwCKwi+1lW5lEKiCRBGozOgmnQpNCdR9MVFgNxN252Mnbn0xwWtAwcNlqGlSM2AyJ/jiSE0DSiIRbpqndmWF4y6nURWRQeS5UGeAIAVjnij0KJI7aMBK0LxOTkVqKMKjPAwgVGJ1kdrk6ghD1Vad13FDR0Aqprx5YcDaOID1W7x5mMntIQvbAz0iXItXIEn8MMgGaCpto+4zK7dE0op9JOpQDlUD1yB4YW4wyCGbsu2juSBmWNGcxxRaCWGtqlWWoJ9CfhgGwFlDLvl7a7ftsFzue4MdV3Z2cUl1cFWop0i2qFFeNOGFa6Q+xs0J4d+0b9yPuCkd3s3tLvFnbSPS33DeY4tpWLSNJJ79HI6xTpNMzmcR+YiVcTNZeHf7Wvu9us1veeZ+d+PeGRN25Ly229Zt0uRLQ93STojDGoAOrCWYOw1p4Z/td+xmxgSeX+R+UeezsQ0tvJdJtlpXIUEdouumX/vzEXlY+1GtvB/2y/t/wDbpV/7T9o/GtvmhA/+KE9kt7clkAAPfuu69chwPHPFTyNgXpCnZjWGKIQwqOmJAsaAemlcRlhINqjOlfgOJ5c8IUngRQkCvpT+7DgDlacFzHDDgQMEmnr/AH4IA5Q1oDw9MOBpHRXPL8KYBweFfngDtOgGleOAIOHIHPhxywSODgI+rgoFARzwpHB3UB6AfEYJCDlczUAVFfjTC7gg7qVRmfxpglDgCXQVJZR6kmgwdyBVAmWMUqwHpU4j3ofawPfjyGsVYVNfQYi7ofYwDXcAUtrBoaaWIHHhxwnlSGsbEzblaqA3cGpiQATlUfH8MV/1KRNYbMbbnyKyhaMI4lDPpkJYUUf4h64pvy0i2nFtYbJ/N9itlkZr+Kqmiguisa+oJyHxxW+fRdSa4OR9CHbl74+G2CTGO8N29suqSKMhTXmorxxRfy9K+0vp4nI99CvJ/wB0ninf7Edpc92gLRdPcIY0A0mh/wDA9cUW81X0Ll4e3qMG6e+Vs2zbx5dCHt7aBRZ2tnGamWUGq15BiSBnjFl8pa+yNGPxqq4Zkubd5/K97YG/+6vby4N7ukpYu0SMx7Vr/wAopmfXGXEpcm+/wqBk9zLxIZ4rDvKg2yNppRwC6lrU/IfzONqMsHzz8u3Q73vl/dlTNDbM1xKGAaiW4IUfAVzPyx0MNYRkyWkzNut6b3/V+8JIo7mWOMKTVSikyOWpxyAGOhXQx2Nye1uzW/iX7erKYxk3fkO7SblLO2qMxpokKmppWiqpHpXGHPebwacVIrJRPgVjHdx735fueRvpZYLSXJqBG6iupSSRWgFcyKYts4SQq6uSqfNt5k3idIYlpYWbCG1Q9YNKatXH/Dn/AO5izHWCGRyC2fxm4nntNrkBie7U3VzKq0WNVALVUei5DLErWjUjWsls+1+3WflfujHcSK0OxeJ2bT20CigDIRHEq9PFivrma+mKMr7a+1l2NTYhv7uPJpd584Sx7jMdtiC6RQlGlABVajhww+BXewcy0QjHlnCZmC0CtnU6cwR6nPl8MdGzhHPpWWW94pYJJJatoSoAY1LUIB50OMGax08FDYPtVsStNDcRwhxAyjVpFCWNKrStTnjBex0qVNj2EMMMcLEOrFehVAIY1pnTkRiEliQ+294+h0lVCzEGNakOQRnlzzrngkl2isyQg9ZL1KkMDQkUFcqkZZ8sKRQI55E6wkQOs6opOYpUjnkScsRY4GpixLzOlCDQBqHRzOn/AM8IlAkKx6hRC+k1otQ9DSpNQ3wwAIrhYmNWBVtLq5OQqCMqnhwphMBrLJWQLHGrRdJ0krUkH1FaegwhjTeSxxgRlQWqqsnUCaDNf5ipPPAIZb24QRJEjLTlnmNJJyHw+OZwxEMvZECukenUysGhDmo4UP4V5jnhgyH30jcJysaaaGIEajo41JFKE4aIMg19DHJIK1aNmLDIcMxkKEf+5iaK2VnvVirq1IwdNSuQKZkmhHM/LLF1WUXqU7vW1KX6WGmVTVgg08TwBPGuNePJBjyUkru5iexl7mo6lkHaYUHChqQOFDTG+lu5HPyU7TW/t1v1t5V4y0Uyd68s17G4246taUI1AgHMjqGKLp1sW1srIa/I/G4rxf8ATLsa7GVqbTfgZq/ErXkw5Yacaia6Gad72S98cvpbG5JRiQ0M1OiQflYqeBxqrbuRntWBukj/AETcRaakHvrlVa/IU+WHJBiEppoTlT6eda509PkcMQKEVLKxARiKFgQBQ1oa1B5ccAAO6dTkMZG1HQMlBHE5CnLAA5We4TWjq0T6aHI0yBGItSSraCaRT2W76ZrfTt+8R/1B/wCymNMj+OKrJouq0wVi8djf1dTBDdAx3luRwPw/HMYrvqi2mjGzc0KrPEW/VtCWhH+OJuP8OOHjYroZNjvDYbjFd01IrAMaK9KnLpbI54ty17qwV4bRY2D7YeVT2k9hZSXKsxcFIHfVGhYBiykkhNQzxxMuLWTuYcmhpi38pt73cjFbFuqMF5JJCR3EzQDVpFCK0J/8sZWpNSsXj4x5bJb39mlxHBJ2mT7yJgSyyvSoPCtfSlBitolU3T7d+d99lhuZtP2up3tS7CSP81AueoHnSlBhUcEctVZGqvH/ACCOe1tHfSiutRIM0c8/4c8dHDnOPnwa6E6tb1JGFTXOvDh8sb6ZUc++KBzSfVSgFFHUBn/5401sUOoqEgNRUE5UGJyQYIevqaADEkIHxP451GCRAWXIjKtDywMYS8Sk5iuuo0k+o4j0xVaiZJWgZbvaoLlUBjBaOtBqqKfI5E/PGW+GdjTTNGpUnmXtZtG/WN3a3VjFJbyMHmidBIjcCSYyCGoRl6YxWwurlHTxc1NRbVHz392f2VbPPJfX/h8v/bdw+qWK3CPcWpJpxUgshIrkMW4+dkx6W1DJw8Of+XRmB/PPanzHwOW//wC49mlfblUCLdLbU1tIsZC11xgAEFRkaY6uDnUvByM/Bvj3RXpklkWa4Lq0UnbEkaHSQOAJAIX55VpjarJmHtAXMbsEtpArrVESavSW1FnUseVOR+WHIgtpXK3Ekfa1RUSW4hHA1IoV519cEigDCsPckCD7sFdZjIBaoFakN6YkhQDkSaOA3Ds5eZRHRKFdJ6gHUUA+XPhgGFaB0D/p7eMFkkVNJEleJrkM8IAhHkDySPFSa2HbllICxMTnU8c8MBU2oGKkMiQzMwGljQuOBOdNPrywxMJlDGB42TuOjnuSA5CnDqFSRnwwQEnFYvJ3Yf0jo/VJP6bCmdKH8MxgGcS3RE7qntR1ppDZgnhE1K19a+mWCQE7MYQsoVRGKu4Vimlq5gHjQk0rgGGyLctJLOwMCgMBE9MgRWqfHmKYQgJM7rbgxl4gp7Bi0qATkxJ5g+n95wwC3MY+2idomtkQJG66kRW4uDWooKCleOAYZWrzEQuIpOhiMh086D6dXIf8cAugXNHIyx1Dt1dyaF8yqgFVNR+J48MA4BvkImm/ThkjK27aRWmWWnPM8a4QAEb9eVmjWBJqfqF6sjLmVIGRy+OAQWNUKuV7Za4H9NgR1GvxqfUDEhhAFwkMxEUiSjORqGrHgaMeBHMfiMIAzUI3jJCvGyUAkoFVqZhjxy5nCEeiYsj26IqSKujt8FCUrXVSgpyNMAFXM0YLa1ZEjIE84ILlajSoUcAuZqBiCRMWIvcZJWvNc70Ejt10cE6Xjk0g6Oa5EnDaGvaeiYCVwI4JkFJDBcERyM6miBFB1UenOgH9rWgB0bC7AbsTQCMgyLcEGNZJPqUsQjINJ4njXLniMyEsf/HfFN98uuLi28T2DcvKZlhX/K7ZZT3kkSk8Q1ujqS1T1E/HEm0gVbM0t4t+x79zvldt27b2vvNjs5BrW68mvLXbTpKKKFGeWSmf+CvpniHzETVJNO+H/wC1v51uJSbz/wBzdi8aioqzbf49azblcMEYVTvz/bxrWnGhxW7kuxGvfB/9uT9t/i7pPvey7p7h36MX73kd6zQVAoaWkAhiCmnAhsQbbJRBsvxb288J8MgjtPEfEtp8bto4lhjXbbOC2oi06dUaB2/E4jBLuZN1hK0HB6EK2ZoPjU4IIbhxT8MgAaZ4IEeyPL4+uf8A5YIEzp9acOHDLBAgJORBrSuf8cOA7QRUc82HywmOAJBqK8sAQDAAFaAGmXDAOAQzJpz5/wBuAIPcM6igzwmxwcLqATWgGZJy44UwOAPdUZH8Mv54O8XaJGv46VqAACWY5Af2Yg7k1jYhfc06qmqDMZ0qBmcQeRE/lCY7xEgLPKigkECtaD0oMV2zQTWBjdP5LAi9wsQ4JWNDUZ/FcJ5yS47YhufLrSFJB3qHTrLMpNAfjTI1xU+Ul1LFxG+hG733N2y1jDCde0SO8ak0qdI66UXPjnii3NS6mmvAs+hDL/302KBHLXiRwws8M4aQVQgkValaVpTMccVPnqdC6vjX1ILdfuY8dQ3afdtPFbhv1YasCgOWk8DQVJpyxRbn29DSvGVITefu28dFreNPNJC0BZZUdSFK1ovbYEHMEE/DPhit8y7Jrx9EV9u/7yvG3UxW+4/cyxqO5FCzlkKnPhQk+hxTbkZWW14uKpVe5/vai7sn26yzx6aHSWTIkFSDU+uZ/DFLWa3UuWPEkVVvv71N4uJZe2JDZLIOzdJIA0OqnBFoGrXItiXyMr6iVsaeiKz3n91O935lvzNNKO0YU6gvbViKu4ORBIyy/liP9JbqySzL0IlZ++G83+4RvBezSzbi/as+/QqGL0ZQqmhJBy44LcZ1Qll7tILK3L3E23xy4+2thLuPk0kf252yOXV2ZLoqsUcmupZy5LAenpwxSsFrIk8iRbnke/P48vifgP3su5X3hdtHdeVbREAxfc7wdyYTHqBWAFRX1OI9jTIqyakm/tbZi12643e4mgVbxzcNJF1a5KMFXXmToFScX1hFGRyU17r+QPZbTuG6PIstzuUpLsxzKUOgZ8gBX8ca8KllORwjBflV3NZ+PRwKqpdeTyS99yTq+2jbqyH/AL8Y462Kpz8jKw3e3jNxY7PaESS20WreWpkLqZgFAOeoBSuXwyxoXqUM+hnvZaW+x+3PhXiu0sVvZrC0s4bFFIrI0UZnfMGjAKFyHM45tWrXk2/y1gzl5zJD4pssOwbaUe12e3ECyo6t3LqUHVw5qTXhxxcl3MrbhFJbHtT7juBugmq38ehNzfsaBCwrQZ+rcBXOmNPQpZLri/TZvHr/AHgL/wDFbfZP/iWHIVktoT1H5uStK8OPHEN3BJOEX57XePR+N+2+yXV7DTfvJt5ecymgk+xs49QqRU01fxxnz2k0YVBiH3r3aTfPPN/3AvrQzfpkgUOmgA5enLjjXxVFEjLyXN2VltULmVnoI14VYEdQIyFM61OLsjI4ql+eGWYjNvpiQKuYcknpI/8AGYxz8jOrhqbR8Cs0tbZKEK2nN1YBgRmTy5YxN6m2qLyt7lGjRGB1uKE6zSopnXlXPL/jhSTVR2gPSyCEhKFValCc1HyPrxwpHAuSZUBBV5JCp7KouYAFABUUoDgE0JZ5VVY+zEwCktVK61GeZK0rw4nhiLGkJHDdwJG4aICsuvqJLZgD51phMATzuyKxUSVSncevVWlAAAK09KYaIwNlwpbpWZVCaSw01ORFa1PD+GBjQz3JHeeamqKoDGgFNPLPUAeOABgaSMLotv6n1NTnTiK1J5ZUwhjJeuzxRwdztM+TUH1A9WVTmc8SIkXvJdDhpUZmL1ApnqCkk5nhnTAIiN04kYFm1ayTmATXPhmeeJEWRG/kRx9Z0gUjzPUuVchU4kiDRC90ijkcq0YDBslVD1MfTURy40xNFTRXG7baod2WLQV1M4KALx+mpGX/AI54vqyi6Kt3ixRw1FHEhAo1aQx/nwpjVjvBjyVk74H5TP4h5NbTI/atZmWK7iFSCpIo5BP5SeYxruu5GRPssbD8h2yLcNoj3GxQy7ffqrSoGp2pCeK04E1BqPljPVxoWtFO73sUfkVlcW96qJeWKkLcsauCTVT60YUHHFlbdrINSUDcbde7JfTQujO0TFXibg/DqA4HLGhOSiICmsRfRS3NnGusAkW5OlxwOpTwpyw0xNEdOoHNWSRCCc6gAfAn+3EiDBxstcx0grrQ9NaNmfXAAaaS5rUnMkgcQBz5D8MAAopDHQhirL9NOXywmhomtldR7tbCOU/5+FQsYHF1A4jGe67fcasb7l7RNvLarazvAWJhDW9yaUJIy/sxHHvBLJtJCa6SaGnUKnhlxBxqSkxTDLI8Z35bQ2lx3ZI5oJ9bployIYkooqVOQ48cYs+FN6HUw5tDSW0+ZwXF+byWV4LfcIGSONQJVDaaI3IUXgAMxzxzr4YZvrlnUu/Z/Jpo7e1KMO8VZPuVWqya+JatSrEcGPE8OOKLUNFLqTS3gfnkkU8T2dz9xdSFYbS6qO8DHTWspr055cfnjPesGpNPc3J4T7jXMrl3d2tEzS4YGi0jUklgx0sWypShFKYqWS1Su+KtjR+y+ZR3axEO2khDGjA1GrMg/OmQxuxch9TnZuL6FgWW9RyqoqAAel26i3wyJxvpyF6nPvx2iQQ3qPozLGtSDnSmWdMaKZTLbEOiTCqmufE04Z/EZYvVyh0FKOuVaetfjiackIDaVrnlT4YmICSTXM0IoM+OFEggsrQUzNBSnH8ThNDCWiB0koDQVpn+GIWqmSVmhnutpin0IytQHIAmpLCmda8MZMnHTNOPO0VZ5P7X7Nvdrc2txYQTpJE8ciTJVZA5r1pQq3xxjtgdTfTmuItqjAHu5+yvZ5pNy3Dw5P8ARbkSq9vt8UX/AMTy9KEUJqlSeIrwyGeLsfMyY99UFuJhzqa6M+fXnXtZ5p4DdXFp5Htc9qkkzrBuSVkgnUdTMGAogJJ4/Ic8dbBzK5FucnkcO2J6or2RSt3WOJAZENGhGlGccOo5aQONca0+4xusbiH9GZVSSQnSGkhuIyViUAnWrsKaTUVqOOWeGhhiSkA0i7tn3FMyI9NQAoGBNTQUrQ4ZFnDCDNLEH7oaPuElg2RA0fMgYJEeYtK/ZSQCNf6qsdSuyig0jOgwwAqyXClY5NUqxsqI66BGBxAGX8cMTPJSOONluFhmkXtIKVqAahSK0z588AIJOpQolAVWFW7K9Kspqag+vMYCUAZJ4gwYQiFSCwDmqOzZZD19MAQdiDadE1wI+sNqK6woUfS1Bw4AYbEwRVnXM9wxnVcRnIstCBoB4UrywgCmkc6g8RSsIVYw4BiPCiMOIPM4ADBGDI8bsKaQ4qCQQgFdYOT0yoMIYQdZj7rsZV1qZip0sx/K+R0qBTmfhgA46i4dI43E0adbzsQAacKAEjp+OGILYIULRS9+KYgPEKtIAKAlVAWjHM4QxT1FZI40W4hAEiMWzUVzoWIBIpSudMNCE7NbuIn6gqN0O1AS9KkHPj6GmCRgZCXjuG7bNDC2poYmIJJ468sj8sIDgmik1uF7zyARRiRPoyqAyCq0qeJwAJ1JdqhxJJUrLrFVGlepFzH4YJEV3CZYkVQWE0yiksbVlVFX+o2oHUKnKnAVriEE0yWeHeA+Xe4e6p414V45uvlm8TosX2W227zS27M1C005HajU6hUkgUI4ccHcqk647WPor7Wf7Y3uTvojvfc/yjbvB9u0hf8AQ9tA3PcCtQQrzECFSRUk1ehxXbL6FtcKruz6Be3/AOwz9uXhkltuN74jJ57vMKktu/lVzJfdyQ/S5tAUtvwKHEO9vqS22Nb7N49s/j9mm27HtFjsm3oipDt+3W8VnAAKZdqFVUgAZZYi2HePX2qJUj6qVHKhPHlT5VwoFIc1uCczkB9DDUK8ycsMUgxGteIFcqH0HKtMECkOCDIDpUZCg4YJA7QetK4AOr1CvCo54GB6gAJqKDn/AG4QAdQUE8hmCOGFIHNS5dVanL4n+GDuHB0sBxPE8MEhBzuAHMaBmOrKtMKQg53lFVIzGRWmY/jhdxJVkKNyq6iwotPq5H+/A7B2MSzbjFGw1EK0zaEJOWQrWvLL1xW7omsbGa732OBWMhADEKpyBBPAkeh5euIWyE64WRO/8zs7VWb7lX0rWOMuAJGI+JyqTQjgMUWzGmnGbINuHuZt9ogkkuhN25NOhSCUY1BOnNnAB40/uxRbko1V4bIjuHuvYxhRBeq8crubZlWpl0EiunUaUPp6YqfJLa8QrrdvfLbYrlEgvohCRJ95PqViki0IYpUFVHD4k5YptyGXripEAv8A9wkKiRlvmgmiNZIWDO6wAVWRCtaGnIVxB5bElgqikvIv3Gx3Dyqm5La9uUSzSmUxzKwUaY2IJK6qZll50xXqy5UrXYpPevf3e9xkhf8A1NrOaVyb6BK6lUklc0yeimueD5YfNjYq3dfdW7uLuWZdwWC4dmEsiSELIGIJbSatq+ANPTB8pIfe/UhN97l317Jcot3cFoxW3iOpXGkZBmBUZZZYISE726EVvfPN2vmYG4k7hUtZox1MxUZslDlwIocPpsLufUi1/wCWz3VusizAozF5ljJWR9LAmgAFCDx/liSRFsjt7vdwi9wFlglkfVCslHWA6SWK5jS2Z4YlCK22I/vbiQ0DtNChRRBpCCSIjIsfhkc8SaBT1EVzc3lrO0itHcWwPbUShwJhGFJ7gzFeFAePLEkl1E2yX7R5JP479x5DczJLfWkIj2WwkI7ccj9RUGlGVdQLAAZ88RdO5wPv0lllewN3tFn5luPuZ5nvKTWni8ou7aRv1p7ndpj+h2oiKP2hWQ1yFFHMYORXtrFSulnZyy+9w9ybLef9S2nwHbbmG28tv0G++aXxV9y3Se50tICwyjjDMoVEzrWpxz1idVqaVdM1/a2MOzbDHsUMyG32CyS1kkB6nvJ1GoGnoCa4rQNyYg9698bcd4TZIW71pblIwsZoXdnAP4UWvyx0uKtJMud6wZb3+d9z8omYMJLHa0BSEfSsFp1sR6Lqpwx0sahGG+47+wvjX/e/u74ntzisG57w17eNIKgxQRmUEgVoKkivriWZxUjjXxG3vdS8H/ww7jyO2tYptt8L29rKFKdzuXk6mjKjHI6m/v5Y52NwoNjqYZ82uC08ccbBSC00ruSNU5+pq86ccsbMWqkoyD1s+1S22y7ZsxXtXm4MLzyRzxFv0hUqOGQAz5nFjZWkRgw3fnXkFlsVhFGO/cDb9ocKdAht2DSykLx1MpJ+A+GE/hQ1q4NYXt9aW/uLJ4/t5Wfa/GvCZIIJNIVBdCPR3AdVK0BrjHe01n1NVFqfL/yi57+5X8msA3NwJJTyGdAoz/LT8KY6eFQjDl1ZzZII0MamMv1kmMioqeGY1fPjiOVl+Gpo3w2ykeSCJWIi/LQEHVkW5n1/uxzsjOniqa78V29FgheNyqsVfQDmAScuBrx5YzNmtFrWXcHbhQVjXXpzGQ9cgK0+OIMlA8wygESBSJIUqZTQFc+AofhUHAmAqQoAFajCJmLSEkMx08FB+IwxQDLmONHWrJQd70pHx9OPDLAASs4l1lWAkJXtAcqGh5ZZNhAJXdVjTQe6oZmBJIOskVqRUZ/DBIhDdOO2zMpWSMashULnxJOdTX0wgI9ddvrLKJQadshTQihJBpxrX0wwGO7kCoK9wGVtKqo1UqKZMKZZYAGq6huNaGqiQMW1ChAVR9NcxwGeJESO3YKGTuT6FkDFCRUEZHVkCeXpgAid5FJHrdm00BZi1VIrkKEUOWR4ccMRDbuRjJofQQSaKWooz4inz54kiFmRW8iLMxACOaGoqAfjU8D6YmkVWIVuW3pK0i5SScWBJooJGdAcWVZVZFZbrZKVJWOrqzHLJgdVMgvyxoozNdFdbpDrdtKKlMgaEfSciQM88bcTMOWppP2P85N/b3Hhu73AYmNorYMQHdOGlSf8AHH0xHLSNQx2nQl+/wDj77ffyzRN2pLZuqpIE8Iy0jOjAjP4HEU0x2RBPINntvJ4hARHZ7jZxFre5CkkL61GbIeB9MTraCLUlI7jtu47deNGY0hu7dQWKCoauWoCnA8eGL05KmoEUkcG6Dt3Si03KMEGYkBHoPzLyPxw5gjBGbm0ntZe0yEFc9BFMly1c8udcTWpBqAMbSI+pCGeRiFQAcOZ4YAD2Kt/UyP5ZPX/ANXDCAHbzTW0scqHS8ZBRhiLUkquGSq5lj3GxMiZNKKXKDgHHBsZknWxs0vUgqkqzhh/TrnzBxrMDQvsp5LU6i4CSxsjo1KslKNQ+vpiFqyW47wTfZ97meOO3FyqrWsJkY6odIpUlR+alCOeM2TEb8WRQXV4r5hbs1vbzUjuIZK3MepXZgaZoGyKrxpjJkxaG2mVF6+PeXpFfKqPBFE8M8cdQoRqAhAwDLRmNOJ4+tMYrUZrrc1z4L51JJDYCO9IW1i1T2zyMY1kYnQkyEnWnDQUPpnjLekGhXNR+G+5iSx7W+mVYxA0pTukM7aiGeOvBUXkakYplobomaS2XypIzGRMZpriJ31KDoaqqRRQK6ia5kjM4upkgzXwyWftPkfcVVMnWUrrZxpIOTnn9P8AbjbjzJGDLxyb2W6IREAR+ogYA1ANaZn0PwxrplMF8I/294h0rUBiM1JHrx/8saq5UZbYhwgnDrUPka0qKH4YvreSl1FCsCRRsvzZYski0DrkSW+RpTCkQE/UQCeHUa4cDQWV9MgRQmnHEWgC5IwwZSaArmOIrX0IxB40ySs0M1ztsbrpMTEU/pjTQgcBX4HnjLlwyaaZoKm8q9sdp3q3ngurWKaC7Qpe27xxlHJr9UbKQTjG8Lq5Rvx8uVFlJ88Pdf8AZ1ZxpJuPiQm2S7FwXNmatZSyNVqHVVkzpxqOOWL8XNvT+bUWTg48rmjhmAvLfBPKfCLtbHfdtew1XDFL5F7ltPQkdDgaWPMCvLhjsYeVTJscnkcS+LdfaQU2gaaTUjwoxZlkRtTkECikClKnkMvXGpMyAYEVnZlBM+vQQx/plzTUzUFMID0sRguEjEQZg4MujPQeAJrzOGJoBLJFRZTSadiGM1KaCuRbLiKca4lJFHZI1QSJI61ajxTJWslcyRxoaZ4QwM5AWMGRYI1LaLgpRXU83Fc8xgGelGtCG0yLHpJdCKMafSPT8OeJCOSaWW3jlbRE4JeAtpd6cBq4fLAMShu6miRZZGLgR24A0oinpBkFeHEgHPEQYGJs437TLNPpMcZB0ilMxwKqOS0zrgANlCDS1zRqKHnk0gGJkz0NSvE+uBsDyaoFjjaUzTq4aWFQf1dVNIZQDrrnngQAI8pGJj0REvIrZAMzEUVqGhHEUwAA0ktLIbYuj0Tsg0eIgAE1qQC3r6YUAGTCryK8o7ESnTbqFRianrJ/tOGAWqnX9wFJXtgSzGiqAeEhHoB+NcACYC3jPceYmJdOmWOtXb6qkcKilcMAUj/ph5OgmTUyx1o44UbLM+owgQOOCOszOpRRWSMAFqupyFPQYBM0X+239rn/AMM+TafLfcGW92fwDvf/ABMsoAsO77wwqr0JP6FqakFqam4D1xz8nK7dDoYeHayl6I+7Htt4R4f4N49abB4R4/Y+M7PYoANq22JYUaWlSZXYGR3UcWc58MVq7ZbanbsWvGyR9HClP014VbOpAypzxYmUtMXB16SFDNkWJGefA/24koIwHBgTxAAND+PEfDPDkjAarLSpyFaAUIPwywSEHQ1CcgABxwSB4yAcOmlCAMz/AMMKRQe7ornQLnxI4jlgkcBD3Gk0rR6VC/P8cKRweN2oJQVDAalWtPwJzwu4SQnN6hBo+tgpIUU4ca8eGF3ElUTtuC61VDnTNa5KDzxF2JKgmO4rQM9TqJ7RIHUq8eYxHvLFjE3+rxKemRCyN1GlaDkBTlhPIP5TEUvkFuuplmiYDNZmI6ieCpH/AM3A4i8iJLAxhuvMrKIUScNKwBZfpdNXJ6sakAjL+GKrZki+vHbIjunuH2DDKEQ24mETFXqRPmKA6hlqNachxxTbkovpxWQLe/dS2hkmiWQyN2j27aWMkSTNTVpFa9HOuM9uTJprxUtyrdz92biW3IjumtFijT7y9nCrdB3J0hQDkHp0jSeGKfnSXrCl0Ki3/wB3JUt5+9NEsCMGnMjj9ZlNEqnSwJFeQyxBuS1URS3kHvJc2kfdtrkxS3BaGSOJgzsg6gTUECMAcjXjgVJG7pFP7z7j3zTVF2LOIxoL6CncMsYbpMZrRDWo05H1rixUIWsV7ee4s6vcwxXSxoEEd0aiVJmQnQrAAEBedMjiXaiPeyvd989ubiI3BlRtVxHG3bzLyavrFKFAvDScq4SSG7ETvd+uEIXvBWjat5cFvpV8lbucGqDmDWn4YG0JDJNvIRIokkAaCRvur+PVqUU6V9Wzyr/LnhNhshpiu3mSV5IYoZI+mJwWILOaavka0NeBOKyQGR7pYZpJf09VBJaymjMYzULHTVl8fhT0wpGIisckaNMkvclk1WkiJpAkbqYGtOkEUFaYFYVlIZLG0kBefRNOkhF05orrVia0HSPkDhq0jjQ6UmknEkYeOFQInjfqCwscn9VBPHArC7ZC4bEC0ljlV+6ZgQ0h00dyVVGLU1asyMv+OG7oOyAVswDGUxMYYCVnEhqquVIBSP16chnTDmRDFuS3e4XlrsscEksysFggUqI0H1Ch4VXMknGnC1EsyZbSS3v2cDW9na3LXFpZxGx2tIkIea4koJZSaVq5yB+Iw3WWR7lVGwf25eLPFLabtvdtLb7R4LZzbxfSS5pFcSuVhj/5nd6ZDhQDHP5TmYL8L0NaeQX8uz+OWkV3KYt0uVl3TcIzxLSrrGqnAKGAzxkS6F8nz28h3iK53TfN4kQulmJIbd+Qml6Q1PguOthrCSMWW0lRbvHLsWxtFcxt/rHkCol3buCDBZk9+LUMuqUaWp/h48cb6ox2Zqn9oPjFttMHlnujdRM9psEMVptamoDu6nUy5HgwVfm2M3Kt0LuPUfvcKW4sUO1yTBjvFzLv25uWNEaQMY04BjpBSgH/ABxmpqanBlnZNtTybylvuFEsFpI006DrpDCVdg/401U+WN1fhWhjs5Yp8j3hpLXd92tZHiu/JnNvYwRnKO2iJVa5itc2+YxJIiTH2Y2a0tWn8iv42U2iva7JNIGrp7RDuADw1Mc/XFea5PFUT7NvHfvPO/Iu4Z1rPZ2zmpbRpKqONV5f354py10SL8fVmFr7S91Ort23ViVzyPpx+RzOOlXRGJ6skWwR9y6hY8S1VKpRRz4A04ivDFGVmvCjS/hMROkSN0FwSaAac8qGlcYMjOnjRr/xi0WKFHTSctYlPABCdOfzyocZmaUTq0ScKbg1ErHQGIADBSB05n54SGx6PcOoI3aaIkD01Cla1+A58cBFgFASJ5moxLFgSoFAB9IqDQnjlywABl6o/wBV3IrVyNNVqKio51yr8MAjhckSalMq6AVRsm1cFIpQEClc+eABE8oYSiSNWQjo0gECp5kU4DjU4QQN9+dWhCscUekP1AZ15knIHLL0wxDJcGRikDKNGk1NWyPGv9vH58sACV4pOnuEjQqsJ1YlQpyp00PL0wxDbOlsrB+2URgAzCtNPDj8c8MTIluUjhu3EI+2PoYdT5kACmAGRLcDqUnTIAWqAtaZUH8xSvpiaIsiV4rliXQqF0oWT6aEfVnw4V/DDgg9SPXcTqqoNCMidbaKtUmtcvT44kQZCdwWVFnBfrQEMaVJDU01z/vxZUqsVvvKrU0PUoIVkooJAzBDZ1y9cX1RmuVhfpQt3Kv1FjwAIp0hQRX+eNdDJcYLDcLrar+Hcdvk7M9tIr28ueoGuXAAcRnjTEoxz2uTbfinkth7keLW0clIN429SHbIHWACVrzOQINc8YrL5b9hsq1dCQbYm8MduY/6R5Dtup7JkNFlUVOtacjTqU/hiaZBohW7W1nu8b7bvNmds3u3LvG6g1dl46OYzBqv8MTTIlJb9sd1tTsZoi6Fa6lyBVuLo/D4UPyxdW0lbrAy/ewMIbe+eSWFFIguCaSJpPIZ0yPPEiI3XllLbyHtsk0TnVBIv0srU9OBz4YackXUSrk3aZWzqAuVQBzHPjXDEjxNR2/T6MIBx266aKQxNmkw0yD1xXkrKLcV4Ygv4GhlYqxKOWZAPSgof7sTo5RDJVpiGqg1bq1Dpj4fj/5Yk0VoURXMqUKSMsjCilTlnkMuWE0iyuTUkVnuGntSLI8MsZQufykICAdVQRXgcUXpJtx5kXF495X31TvaYZ1uUN0sikISc8iKCpAyyxjyYYNmPKaS8O8rjhuJe2txBbzygwRPpZgykEpStQpHEU4YwXxybKXNQeL+bMiAQMJDOpS2jtpTJ2lRtLRaCFbQampP/DGS+ODVS5pTxfzaabUslwsDtKkTVbTFF09TI6lloaZaeZxU6wWLU0H4/wCXQvFEsUpljVu1bSOfrZOpgTlkQSc8RraGRvSS4tq8nWaPWj/Z607oEjnoamYStC1Twp/ZjTTK11MOTDJP7HfEEEMp0hmRWAJz6qg1NP4AnGymeEYcnH1JZZ7mrAJXMgVZsi3oK8K42Y8xjvhHmO7jcLxbLMchjUsiMzxi9ZgQAzacqs3LFlbIqtWA5mWvoCQFJqP4fPFjsQhhgIPOtDWnLAmAFhqqBXKmZz/lXDYASoJppqpHDEYGgiWBJUKtzGQoCKj/AI4qtjklW7RHdz2OC77ivEpR6Gn1ZnKp1AgnljPk46Rqx546lE+fezey+UW17FNt9vc9xXea2nQmMGSikBBQcAcx/fjG8dqOUdCnKrZRfY+Z3u3+0PdNhuJNy8Mi+4g7bqnjs2rURGGJEMjgVIPBSw9Rjdx+dZaWM2fgVtrjZiu62642+8nsr60msrqJWE9reqyyxPmK6SNTEUpwp8+OOxTIrqUce+N0cMaHClbaW3URy6GRQaAFq59ROdOOfpixlbCQZKq4CNIUprVf0mzGdGzqSeeIhABI5UkSN4u4jq0wao1qQDkGJ+HAYkhAQZzJKixandCwgagGkjIivCnzwxHHhH6Taf0FUqrUPA8Q/P6vhTAB64K1C92UI9XV2Q0RweK8c3PPhgY0FjtaBbsqItuwE8rVFSR0EJlQ8tQNPU4UgGzGRGe6eB4w8KvMrMrMK8NQWgo3H/zwSAlYSwxvJHqSSNkf6e5rU8JXGlqtQnKvDAPQ6eyqwqlFEX0SRnTWdwSys5+k1qCKUr8MMQY0coAQA3MkT67kIdaMxzVVDUII50HH54QAipZ5Ht5XBYErrFFL0zVwaE0y/u54YhOiCVGjZHgemmbImj1/KxGQIwhnQo1JH1qyLWWYVMYTPoOZFB8vjhAAaUrCLnWuuaMrL9RiYFsgBUlT8aA88DCJAk6XiEEYWMrXQzVDn/CDlmvrhiC1LQyMY2Edsx03ER61B4DL48ajnmcAz62e3flJe+2uXpLfcG2toVoYeyCOgaalGGokelMeS+Y3bU9isSVYN6eO76lzaRwwXqSXDh44hE2tFCEVViR0kA/PHQx3OblpDJId6CqiRHWZVBNsx4mOoLMy9VCeGLlco7PUUxb8yqWuCVZJCehtTkE9OpacOWJKxB0HRN5JatNaFjq05qoPAqRTOozrkMT7yDxhy74pEki1d4h1qTTpJ+NakUzwdwnjDo94WcAwsNQYAI5AbTTVqbh64O4Xyzsu6xGejkqYzVgPX/CPQVzywlcaxiSTeVKsSwLR5y6TUAcqVBzPPC7xrGJJN5gZRID2ogut7hyAQTlQHgR6cMRdySxyI5vI4i1TIo7i1Mv5gBlQKOPDKmIvISWIQv5DCzSoXTvlAXYtSLQwqAwzIryBxHvJLGNV15daxxukl4scSEKkjqGfOn0n5Z8MQeQsWF+hEbrzWsepJ/tZGlCJLIeiQsdNWJAPLgBzxS8hfXER+/8ANZEUS3En2kTM0TqZNCsTkAobNSeOKrZGXUxL0K23L3A3KBUNm8WuWuiyuH/UcBQFEVaDqpmTQ/HFVsrNCxIrTdPdGZLeWO/kdGtihvO07NoYg00v1FqjI0+HDFMuSzsSK13r3asiJYoroNdWsUqDdpnKSQk0oI1U0IX1PP1wmSTSKm3b3cnOqzubsC6MUax9yYZtQDu1HB6DjwNcP5YPIirt29zbi7MixN3L5CHtTFXVcsQUpI7cdFK+v8cWrGiDywVff+e3N5HNNJusk9vEscEVs/WxMlBIAzilCQW1HD7UV9zZDp/J7gxrHncMA8cLBhH2wQGVzUDPgP44noD1Itdb27Kn20r3Eiss2qVmaIsOnIk8OFa8MRdmMjs99cMF7eiT7lWR7cZANWrZGtAtKg8jiMhsJBcyMzXWiOWFoWTtkhyuqoUAE11fDhXEBtSN9XNvIDP0ugLW7DWoYkLGzMebc8DsiSQcIHDx2TGIzMndmAqCuitF40qAOfPEXckkHOkt3JFdSMkDXSFkmYkiiHQmocTX4GtcQdiVasWx2iaFuJ4g8QQxojDSSVIJXV6CtRU4rbLIR6SJpo45Z2E0kA0BkYVCEUUc6kYXeKBYbWVlYvEsUylWuoSgMbgDpYFASABx/D0wd8jVQ4WlyXu44EmNszg2jaqsz0qXdwQWQchTjh94KjEq2dzNJHd24Z+wD/qMhXuK4pRe2RTOhz1emJdyaF2OdxJIwgYyyyiF5pEEZmXNCgosuXSD8KHjizHLKrwmGTWi2lldf6fE0F1csG3CWZW7zVAoVyyFcyBi6ntM12ia+De3O8eZXO3nZ9vnk2nZz3r7eyG7aShtcjsxpw4Cppi29u1MolNwfRLxDY3TZ/HoIwXuPMbv/Vd2DAhTtW01S1GkgaVeQ6hUdXyxysjlmqlYIn7p+XtJsu87hFUSbpObHbxTN4Yj1yD0BzP8MGGssnZwjHu+y2mzbLC7Wyzbpeu15b2Eqloo4yaRzzCvUzE/pqcsqnljr41qYMjKpurHdPKvM/sEuHuNw3O4htTdyDuEmXSss8hz4Mxr8PgMaqtJSZ3q4Pqn4NsG3eIeMPtTWKW/i3hFjHMysFrfyvVu9MoOYC9dDnmMcvLeZN+OsIyj7p73Kv8Aqc7MklzPC9ywbMrr0iOIcPoDcKUrizBWQy2hFabPbTeL+C7r5GxH3G/TybPb3JoHImZWegHGjMRlzXGzqZGQPcbU7huOzbLYO5uJpBbwJTqUajDEzUBzNGY/34E4HEl/eRXG3+KeF72iB7f/ALctINut0zZpLibItUkE8RX5Yzz3MtWiKWsidv8Ab3d71XNbi+mMyg0IrCCK19S38cF9bpEqaUbMeysjFWarSSSSxkqW4A5ceP1Y6K0MaJ14/GrkqZShU6Y0RDx4nPGXIzoYUap8FsjCkEjLpcFeqgJNSPqGeZOMFzpYzU2yQSiCFoULSFQwVqVVCOBNaUoOGKGXE6hKElml0ugYEgAAVzKtkQcjgEHkMCjglYwODgfVQHKhAy+eCQgBL9uUBWkqoSY2KihYU4DLjnz/AJYCIkkaOPW+tqAjQdYVVA+BGQFcEAclYMpLyjWpoUXjnwrkB8qYQDbPI0WowJqhY1ooGnOlaN6YGMKnKM5jqtxGFqFOZZuBA55AjDRESy9sIJe4pJUFgM3BWopkKAkYYCZ0UatMYhLAkIzE5A8SMxxFPjgkIGe+IasWoJHNUNoNVJNagcAONf4/PDEyIbiXbuV0xxBtKSH8oFM1+Z+GJJEZIzMBMXjkkUW2urNQ9WkdRpzPGueJJEJRHbxY7akqyIrSDWlDlnWoyX8ScTVSDsRq+e0t0kFVYBOqvIjmeWRGVBiSqVu5At4ktlh6ZkMzcXBr6KCfgaYsrUrtYrXenk11CMwRAY6nPq40y9OeLqoz2Kw3HuSPKixtrZQXYtkBw0/hxrjTQy3IlcRqDIseTVyWleBpzz4/DGmpkuiTeGeWT+K7xBeJreBqx7hbIPrQniK8xxGFkx9ygWPI6s2JK0PmFrabht1329w0dy0vU6WalCR8yOIrjGprozbb4tUMO5Wcfmdk320ItfLdtQ962PT30Q5yI/E0oaClV4YsWhW11K4G4QyRz2m5wlgoIubacUJIbNozlQinUMsS9wiEb74nJGrX2xh9wtGqZ7YAmSIGhAIrw4UIxZW/qQtQgqy3Nm8gUtLBN/1MDcKLzcEZGvPFm5XsFzRWkshNtO0bhatbnMdOZCHmPTBImpC5LdjpYLpqMvU+uCQaEpYgq3BkPEc6euAQtuv83EJg9HRNSpw0gfWK4jVQyy/xKRj5gFqqD88ji0ygkUVoQSAekAZn09a4IJSi+fGPbeC72Kd96tp7a9vTHIJhVDaRjPqhPGuWLq4ZWpS87q9Bk3jw7yPx2W6uYoDum3WwWt3Z9S6GU6Q6ZkEeuKL8eDXi5W3QkfjHlEg0W88uhLdKBAw1owzDBqE86HmMc3Nj9DsYsyeppDxbzFQtm8V+y3lwpWRpAwAUhaIXHGqj44wXobKZDSPjPlttqaS3vhBDKgWjv22VwDVIwvBmINP/ACxlyUNVMhobw3zWZGt7KelqzSL93BUmFhppqiav58qVzJzxmtSC9OTRvj/k8M3ZVn7cZzt0Lao9AzHVyb4A4UldkWfs/kIlq5l7VszL1yP06HDacmNQcshTLFtMhRfGWRZb+srAdxVDIzQKxHbalKk81yzArjVXJ1MV8UdCTWW+sFQu+lXQFVJFTSgrUU9c6400zNGe+GSS2u8K6oyyJrZioRiKEgV5fCuNVMpkviHdNwjZQdVa0NQSDn+PD0xashU8Q4R3ak01AtUaVrl+IxYshVbGKUuVYldQBBoQciMTVyt0DEuFapNP/I+tcNXE6tBisDUihBzJ+H92LE9CGpwrqDANxFPSlcJ6hISYVNGIVia1UjhUUOYpTEHjkmrsjm6bDY3sbR3CBy6sDUgGhFKg0pQA88Zrcc0Y+Q6mM/fP9sPiHnVlc3MiLtu8IiQ2nkFqO3dR0qwSo6XQ1HGv4Yhju8T0NVksy1Wp8kfdH2t8p9st3j23fIP8jcXJ/wBE3mJf8pMq/VqA4MOan546uDkK+hzc/Gtj9xUrRuIrk6TNrn0wUUE6vxpVcuFMa6mNzISnWsqRuIRP0tO4FBLTWyhTUDhgYIH9vPIvc7Yt5bnUBVumh4M6iuTHEoBhP6UskYkolvGpjbW1FBGSkE+pOVeOEIC0kqr2iFuZkVkjJZTkPrBpT6eP9mExnRI0ds6PIEDiiawSSripqoA4n83LBAASpjgVO41TpeCy+qpXkSDWjZ5chngGDQ64BcV4sUnMJXtyBuCn0I9a+mGIJW4EEcUyHuvCQHg01Kxtmo1AULKcq8ThAGO0kE8JibulxWSaIFSzMSWKg8HrxA4YBo5pCK7pbtJ3AEhUEHqzBkoc6k8cEigK+lGrKwWVgZdQIYmlGZQfwwADXvAxqE7PaAIdDUOoUmsozHDCATNMT3u2msFAIpAFIz4uAf78A5DVjmR0ja8XXJGVuIhGBQKMgCSACQcvXDgQTEY1Dloisp/SOhQCMsnJJOqo4nADPof4Ff3VhuMN7DCLdPuFZBGVia4ShDRqlaqSABSuePHTDPcJSja/i+6wLY6rh/t1Ro5mllTQtuKB4gxXI1HM8OBxoo4M2Sksltx5JGqlZ2eBzW5MCGsoR/pYM1Qa8wf4YuWUoeIQf/DAt4omgQuloDQTBaoHp3BrArRQOmtPrywfPD+nkPh9wIJBLKb9beHTohkianflOSoykdOZBIP454ks7Ivjim388tl0n7ikQkCwJKS0qyDUXDA0z4mp+mhrg+eD4wsPn0JKvNeKss+Q0itD+WP6gCWJGfAfHB/UEf6cTXPnBtZIzfXIRiSkdsjNoQNxBJ0hlr6DjiL5EE1xpElz7hLGGk1BYX/T2+4iKkVjzoequYNaccQfIGuMM+5e5sCQvM94roivJcmNj2jQf01AIIY/HjiFszLK8dDCfcJAts0m5R2DtGJrWfWCAo/KSRll8fmcQ+a2S+UiOX3uakcDtNeiN7k1kKkBHBOdCfqLVAB+FcsDyMksSIjL7nN2kkEj3KXzSJALmYJLHTJK10KNWZJB+VcRVyx4kRTd/dizRo4HvBJKhDJaR65YYlAOvuNn11B5/LEbXY1jSIZunuQojeVXjS7v4wSwnagVa9pIqPVaGlTiLbZYsaK63j3FEjRN/qLXIjQtK87HVKKlpOsGo0jKteI/HEWrChLYrTePcAXOp4r0y3NuyzQSO7lwmigV3oVFQ2QpQcsSVGJ2RU25ebXjEPrQG4jkRbl2TSOOoGJKU5cq4t+Wil2kgVzv8zQw2zAi2SUuzhwJonT6STWo48CcTSRBoYLjfL1WehjmuUURyoGD6HYjqDA1ByFf4YbhbAhpkvriTXbyqkbHVMtwpGmhBNaV6aZgnjliIIRs1xKwEigdwpILtqqK5AGtKHLCbJQI7lgHunM9CzBb2OQf1AWB1BQTShAoDwxElUIMBuJrbuyLapKgEc+avoJPbUHKvxxDuJ9shiWdZJRA7TIQZJ4FUoqSAUJQIWrQ55/24ha+hYsY4QWLTQxJAFuI4wGkZkIEktMhQVNTwzyOKrZCxYxwXbna2eJxIzyO08Lp+odKgKQwA5DPI4reSCz5Y6jZhNp7qJHBRZGLEClAAStPpY5VFcR+ZOg+wXRbUGY9VYA6/bEEtKyA50enUB6c8JyDSQ6CwMM0cc1nJbSLpjWKlE7dOoUXKvPniCaCVBz/AEJ0J1MLVmBiVCp7kkdcjQkEryqDixO0wRbRcvs/+37f/dHf4dj2ndLHYZbGP7jd9xnDylLdm+mG3zMrkEsAcvjjTTiZLGTNzljWhe3lP7ZvZf2zvjssnle5e5G836E3OzwSx2UYVOqsgiNE16qULZfLG6vD/vHOt5C1tSlrrx/xppn23Y/G4NuVZGTbttgVry5lZyVWNGkUk6ASEJz5+mJWw1rsRXJs3qaV9tP2a/6qu2eR+4VfGtk3QqsnicGo7jcvQBO67ZRqedAKYeOnVleXM3oiR+Y7dY2W+Re0ft/41BsW2bdcx2H+oajIGWTOeQNU69KA+vrjPybpbFvHrOrE+9733Y97bb2ihLPH4rskafl260Ud5wRxLvUEjhjlzLOikZ488P8Aqu6WO1woINv2e3K7lNnpjQUZ6fE0AxpwepXlMu7wlz5Bu86SyvDaXEjXRUGjpZ2ZKqijI1OkKBwqcdWi7anPu5Zd/st4tbK+7+8e8WcUGyyTyWOz20w6pJVk0UiDAamkaiinLUcQz3aSqPFWXJr7cWvNh8El8l3aNf8AVPNrt9wu7INqWKKEKRAqE5aQiA15k451tzbUwT5rPeb7dmCKMT7nut0Ft4Y6sNZdJZCAD+SukVyzxuwqCjKwnzqS3tN/2rwyCRJtp8Mso7i7YGqHcbkAkauek0PyBxdOk+pSIPAtlU7rd+QSRfo7Mpe2BGovM9UVBnyFT+OIXtpBZVB3vBfaLbxXxYki68gna83ksMw5bSuo/A/zGFiW9gyPoQryZxtvtRuvQQ8m8SLGwIQhGC1qBXkP44VPiyIdnFGZChJ1RhWFVckCunItkAPjQVx0ehlq9S1PFVV541VY0IIalTUgACtSfXjjLkqb8NjXPhMEWiORmUnSp1RvQLTh0tyOMN6nRpY0JtkypCjOhGjT23UlQFPCg9TXLFDqXKxJGvI9FLdBKjrpkfVRuBJBzHplliDRI8l4jo6jjFpBQkmoNa15Cnw+OAZxpQ4KKyiT6QzRkhtP5QCPj/fhkYE8tzDLGFdKPQdqTilQPTPgfXCFAWLjVDGzIEiVj3ZCSATStTSlOFMuOABv7j1d1CMsLMmk/UeVAT8G4nAAGW4pG3YUuXUkMHU1IzahJzPxOAUCdpAqVAYOwVWTWarqqSfWmWGMQTXKxK5dutDnpqRwJrT4VHDDSExhurs1kVHjMByOpgc6cMszTOvriaRC1oIXuG82lsrmWagjq2hiAchUnOg5fHF1MbZmvkSKf8g9x9tto2S3qrgt21UE0YfCvP1xqx8Zsx5OUkVDu3uLvN/CvZcxIRoikUcKkmmjL+zGlceqMtuTa2xE23DyS/qYIbrtpVmlCMBQkg0pUfxriTrREO67CGvPKRGyy285FQI4pIiTpqKkUphRQlNxE1/dCjbgrwSEkGYEhVp+UnOn/jPEexdB9z6kdvx3hlqEjljrBB+dCDyy48sTroQsRa4V+4SSTqoVepqQatSoAOdcXVKLDW40sCdepSO4SeGeWY+WLjOy6Parzn/SLo7DucjLtd44+3YsdUMvA0PxxnzY+7XqaMGWNDQe9bZNJJFuu1zdncoP1o7uOtHQKKtQVzPBgMZq2NNl1IluVra+W927tSlh5NaqBdxEaY7otw0Cv1GmXriacEGiuYL6/wBquZDZySo0b9u6sJGKvGxNG01rlypwxPcjsdubPxvftTXrf6HurkiO+iU6czSssXxJGanCVnUfarEK33wreNkH3ktt91t7Zw7lZnXF+J4j8Ri2uVWKrY2iNwSXGouZGYop1o51iq5HLP8AjiRE9NbidWljiKSL1Og4H4jArA6ie3eQaYQ2lGYEAgfV8a8jhsKsDc7eVkeONm1CoIIoshOY0tSmXDDViF6IkfiOwG93Wyku7lbGCArKpZqSsSTo7agGoqtDi2kNlNk0jX1glwVF89s025dxVZCzLHKinNlBNSQDSoy9aY21aMjfqCKxoZxK5i1Jqma3WiiqlkQnOooQTT5HOuBqGD1RF9/8K2jeJ+6sS7TusUOn/VbWiiQmv1xCisAAeGdcU5cKuXYM9qECeDf/ABGW0S/h1Wus9jcISZIGBJLCv5GAFc6Y5PI4rW52ePzVYufxDzNZHKT3DEiVJDKDTpJqHUGpJFccu+KGdTHlk0vsPlUkkmq3eK3CAXIYgoQobonYBXRSDy/GmMl8ZvpdGgfFfM2a3tBPM/ehkecQxU7Uj0BRvzAaqUzFa/DGa1CxWku/ZPKXt7i2CzxJNKe8EKkkjTWsoqAWJGWQocKBMs7ZPIC0cQYPFbu4eWckKqsy0I0NStc6nkOGJ1tBVakk32/yUM8iW7BEFBHGDU0jBJZTmcgK4trdlV8ZJ7TyQaZJTLWPKk5XqZRmFpmQ3OtMXrLBneEklp5B3RHUrQFXXTUEBs9Q51+GLa5Sq2Ef7ffdXb1ByGqJYnqCRyKg51NKnFyyme2Ad4/IoddC4RAAAfylh/iPy9MWLPBV/TscIt6BfSX+kaqk+o5VpXE65pK7YBau7wrkzLry4jmf8VKkfHFqylTwyLY90jkpGHDmlRpOWVNWeXCuJ1yFdsMC1r5AgYdFRQVBFcW/NSKvluSq/NPcNdnAaI0hDmKRjkzOQdKoy1III9MYORyWjpcXhq25hz3F/cBc7aYoDuMqWUbTN9wSTJHIYyyRgqvNRQ/+Bjn/ADLWZ11gpVanzs90fdXcd171juVzHuO23JEbWjyvLHZFmJZ0UgFSNVKnOuWN3Ftarkx8pKyhFDwbrbSRStDOC9uxEbFiJAGGlQ6rwyOdRjv48ko87kxOrFRe3WV5NQcPGIiHUGrAZqMq1LU4/PFyZRB2SMowaTSH7IUAElJtRppRs+kGv92CWDBsiiCFWuAVjTW5FCgNB9Q4sw4DLDIgTWRorlxGsQZkEP1agGCgqac2GeEOQDL2wJkuTJcTAL3IyQZQfppzFDypnhojINnljmjACI8KHu0KgDVxC0IIZ+Bp8eeBgAjiHaYsFjldi6MjaaBjq0kCuY5j0whpHmYrIqI6kyOSrt1Sd1uMZYAUXOnrT44AOu7RFnLh4SckAKyQStUkCgqQeAwDPKFgl0xSCN3UmOStWXV9XDPUopXLMcMCABHG6PLGtUlhbUsZcEMpBZiAfp1fDAIJYGKL7gBYzKey7BjpdjwRhnXLieBGGMNkjmLPL2IlmmDQiIUJ0R/UMyPWgwCCpl7YkjdotVyEeCIUerKaCOoHAc8/7sAgb0jcyB45JUJVYzVzR/rIJy014YBwbP8AFpJ/8vqlkhu45oo7SUiQxvHHm8b0kIABoV5Znhnjx0tnukjSOz+XKQyyiTs2d0y3Nv3NIeZ61MbEtqStBQ5Uw5ZJ45G/c/PLmNrWzFxFdQSPI9qIpO/LPoBYQSv1dDHIIRTThSR7UiEHz6VHliAS7S4kjuLsJQuumoSJSA6NGNRZ/RjTA0xQhhi9zzEsXdu/vikskkMsEsn+X7hDMjg0Dtl0+gPHE4Yu5CO+927qeC4kui80Vyyy29CY5K8EhTWWNRSoJrU8csCo/UXcugYvvPe20VpcNNrvyBBC7v23gotCmltVaDqOoA+mWE6MO5CGP3duzM8y3DvDDDKEvIWllmLOxDIpZ9RJbUQQK0wu19R9yYiPumwWe4UxIGeO2shAQugnqJ7RoVZiczqrzOYwux+oPIthruPc+YJexQgxd+VXvVR1/RHARddVUEZkA1p+OH8uRLIhruPci8dYlguVa0ujF3Y1mbt9A0fQwJVKjMcMNY4F3DDce5Uj3MiLdFzopdTRqKRxnJyRWmleAPxwKgnYj1357fXUj3RmhuBdx0ddDgJElGVgDRcqfH5YmqCeQYLvzaaYPGl89ksjmWBX/USVACzNqHKpPPgcP5aIvKRq58yvZVmmurLXdTKHlt60opOlW0MCdIocqig+GD5aRH5rGK58sn+3niN7JHF0aNLIskqI2nRHkeedOGJKsbi7iM327aU0PDJHAtXa3MuduykhD0gauPphwR7pGK63ZmiaML3VDGZo31a3FTSQqMqLUCnH0wpEhma5s7uWGkbWbPHqcrUghhTSwavVX+IwibTCNYkljM8pt4UIjuAFBLBB1AhACTTMEnPhiLsyUA42nU6ZLUGG4VjK+oUaNh0la5ClQSBxOI2voS7Q5TM0LmO5AKaHEEgL514oABQU4ZZYqdyfy5FtltbyCKq9ye+VwhH1mjdRKmmQ5Hnip5Ui6uIdbfZJSI+zKsyQ1iMc6UClmNakjKvLLLFFs3oaK4R9j2JdSWttrRkcQF3BCvqpkAQST6H0xS8pcsSHWLx3uxyQQqVMzhTaMaZKpbM/mpxFOBwnkkO1IerbYiWWWBhEkWqGjCjSCpBV8jmQDWlK/PCTkTUDjBtEVrPcSiZDFZMsogKKFDSHNjQNpUcP4Yvx4b3eiM2Xk0puwy4G228tufuFiRiXuYlNAHHAJQ5gg8RjpYvEZLanNy+Xx10E9zNYxJNFEZZu+ojhDUJiY1ppZRQmhPPLHTx+Hot2cvN5ez2QO18vlit4ttWzjmS2UxpNMv6kbA1IYSAjRXMUp8sbacDGtIOffnZHrJJtp3TyIbhts+wT3dnuqKZI7iyci5LafoADUK860xpeGlFqZlnvZl3eK+1nlPll7abxuEnRe1jk3q7naJVZuqY/qHqJOWo5emOXmulsdPDVtGrvGt89mfZG23XcLiS03ry+CItZBYlupoJFbpCM/Qrtyp88Ya3s3sX3qijfOv3Uef8An8O4+P8AicCeLQPb3LXO6NqN7GrVFZJmAABrwSmL6qFqQiNhB7dWt9414FJ5xdzzzeQeRW/+l+K290S8i94kTXi6iTVySR+GONy8k2hHW49IQ5XO3x2FzPFHcq1p4ZYabmd/z31wdcpap4hiST8AMZki+TM3mu7fZbDue8HWJ95Jj2u2FTIY9dA5HEmWSv4Kcb8C2RnysjXgntVe+abjcXe47k2wbBtUEA808quV/Rt4Yxra2hZqa5pcwFXhXPG3vhSY7I1JsezW3nHl3j9lY7XNtHgPjxDeH+KldMkUagqb25UZa3qWDHmacsZsl9X6svpWEOH7iPI7bb7JrW0mQysi2e2wAGrE10gBaA1oGr8sUY13WLpipkywmTZpNz84uonEXhtulnaxuw1SX12rdTUNMiC9OOQx0KmS7KrsLKYo5nLPuG7XUm4XTP16gQSqmtSciCc/hiVmFUXxsdh9ps2wbZdW9LmSWS/3NmGlwvGNWBGQGr+OKL2LqozX5Luf/c3uzfyM5urO0ma1tJAvBIh1sAKD6mNacMXpdtCl/FYcfdplsvENt2aIr/n2NxJGKglWNQQeB+oYr4+t5LMv8sGPbvvG7ZoI3CihCaRSlMsgcdSqUHPs3Og97XdbhaNFcorrKoOpqfGoOZpnw+WB1qx1vZFveNe4+7bVIqljKiOAYtQXq5q1eNP+OKrcdWL6cu1TQfjHvbFJAv3miOUgK8SkFSeS04HL8K1xlvw2tjZj5ye5cW1+e7TuSRMbtI5mQHta+IpxJUivxxkvgaN1M6fUmUG7wXOmkn9UENHHQiiDiWHPjTGd1aL1c69/JQtqGiMUqakBj6mpz/uxFonIA3eu3AEiOxIV20MB8TRacR/54UAAhuI2WVlOmU0AjYVBqG0ipFTUGoPDAI4k0bSKFLIV651KigZiTpJJqDnTLAAhmuoaf5hwaGqxrnU/Mf2ZDAhiG4u4UjhIZ+2tHJ1ZaeAIOdBiSRF2ghW8+abbtKHVNrMw0uhOoqW4AVrjRTC2ZsmdVKP8i9441a4hsyonZtKhqMKZVCmuVB6Y24uJO5z8vM9CmN6803Ld2EkstGJ0gKSjV+IAoa42VxKpgvntYT7D4/unkFyPt43hWdm1Xc4+lUFCVoaHJuOC+WtR0w2sXj4/4L45tEMctzCL68Reu5lGteqrHjwIrwxiyZ3Y34+OqkjkmsbVDHbxwiPSaR6AOnVwoNPrXh88Uy2aFRIhG63cEylhCS4B7jKoooOY5n+FcSSZXZFWbubaRpEAXRlQHSKkcRUZnL0yxdUz3SK73GBIyEDfoluuULlllyAPOtcX1ZmsiNbhGipVZRoFB2+J08iKD48Di6pTYjL/ABOhGNNFa0rxOXyxeZmdDAMtXNQwoFP8hT4U5YBGl/bLz5J4LfYt3uQkgKmxvJGPGmQatcycsZM2PqjZhyyoZYm/+Pyvo3PbYNF5bgtc26ZsugVBSgqQeP8AGnpipMtaIXcrt3klIrx/9N3pEpBeNXTOACQktK/CjDEloKJIPuNvebLOtlvdrrjlUAO61LEDJgVr86jE9yuA/b953bZ3VtuvWjjkUKtlORNbyoc9JJBDcfzZ4i6pklZoLvP+1t8m7d9Yv4juh/pXVuBJasOYeMCq6jzXDTsvaJpMj+5eO7jtp7khTdNvUUTcLI9xKepIzX5HElZMXaRs7elxWQOrNEQ0eoadQ5Kx5elcTVoIWqEHSIoqqqXVsza4yNWrWxIU5UIIGROf9wtSMSiS7JuEcHbuqqbdpKKqMweGSlAUH1BSTnU0+eJJ9onDLr8Y8laS2ggmFUX/AKW7X6u3zWukkDIVAzxsxZTJkx66FixnXb2Sx3MaaamyiBKnQWL6OYPEsCQM8XTJnaD2dXQxJpMzOsq6s+2AMwpy1Cooa8K4kgAzwRdhIxHbNH25Be27danhqTS1RWvEHEbVTBWggG6+HmwY3uxmRoUEZuLM1CqimpMEhoczyPDljnZ+Kt0dPi81rRk+8O8zLdqG4fS8cLrGGYntlCSxI05Gq1qefHLHGyYmmdzFmT2NDePeSqgE9xNHerIEkkkcmPq/9mVFAAVqa6TjJaiNuO8l37P5G1zDLHM7JdXM6tMZXEjTIQNArQkcOXyxmtQ0zJam1+Ry9qI3Ds91IVt4hIQyyFQQzhTShAHH0Hrit1AsOy3+NzahgXt1AUiNyjRvWjcSDwHPKnHCTY2h/i8imkme4W4Jjt1IeRmWrrUVdK5gryAPD1w5ZF1RJYfJ4w0ccysLbVSh+tea6jxAHEYuraCp0kklv5PM7ASTdyjANcc0ZqgDpNRUcOOJ/MK/lewcrDyZFaUwataqWjV3oaUGtjzUrmK/DPElYjbGPUfk9tEqhrsMhPahcsA4bmQDn1cBqpi1ZIKniF0flh7glg1GAnt6iyfUciVI5ivxw1kZD5MCxPKlgcIXdImKxtMPpbQaUyzFaZ+uLVk9pW8SbI75H7kNZxXLydxoIZGS4RG6IWAoCSKkcQP4ZYjbK2SrxqmVPcr3Uu2W7VSnblXUEDlncCpRwYyKU41I+eQxTabGzHRVRgjzDypruV47GeWYsGle7LNqVky7zRCikstRSv8AZi6mPqQy2Mp+RX8spvnuLaWNulpruNtLJlVdSnLqPqcaqmG+5W1xuW4CcQgy291I6yLKZBRmC6kDOM+WRpTGvHeDHkpLgmvjvm0E0ost0mjkummpDdgjTckmgBpSmmnA46GPLJzs2GNi0YdKGa4ZJI3p24nQKApYAKwJPUFBPDn8caUzLDPQC2V5kJJC5RrU0ZXyeWLlUgEcflgIs6UnoUlcNKsLJDIaaowpqKgHTX0xEEj0ZWUaliMVzMwWTSh6RDkGQsciMsTQgJiuCq3LvbAwktCoTNmFMzzJrzPzwDBS6IZVZ5kCmpuWoWCuACCpoK0rQHh88IaBtEw16Zo2NBIGUL+k44jUK6mrnmMsAMTdqN2gYSiGNgEU0pJHTizPWmfLBuINBXupPAyGFwYFQjQzN9JyoBqAOR4fzwQNhZFu0pgEYjMAKRVYdwFf/ZlvgCeH92AQaPpZYCj5CJZm0lSxpUaQuoZDlhwAnP3LrcTLOzNcNoXusKutKFQpz48yRgA7ISkcsLRK6oAvaIq4rUgAgVpzwgPJHc6tYAiiRNA0VRQCKUBqankRhAzX+w3CWMBOhpV7oZ1ZxVmVCQ0KyUB1Amur0+NceRR7km99vdLeSUWDrBOpaxliyaJaBxDL+VtZzJ5cuGIstTghN75HqCMqSS3MitHY3cQ7axEgqULqQQqkGlFzOZOJVoQuyqb3ymSS0uVRmsoUQ9+K3UkqxIGouerqpn8c8WqpnteCHXnkCvauizRo0RjbWiuaqv0rGQpoBxY/wpiexW/UaLvyCU69c2kGi38ssx7hkIydBXJQDUczz9MAu+AE3kF1qthNctJcWYEcd5GKEmX6tXUagjKp/DBAu4FceQXoltW+7kFzt6h3KkwzIDwCFRSq6iCSK1wdo1YTy73d61eS7ME0iIlqxVtQjpVyvSADXiW44IE7CS432f8ASikmadA6pMwBUdNdBcHixJ+GWBVGrBMu8uluSjCBZJCGQsO0cs0Qklj/AByGH2ke4SS7sIfusuxayhNU8bAStoFesioAHKtKDPBEoirsbW3ZZJIIQUJYUecABGDGqhSNRCkkBjTAhu43tdSfbvbGaGdZJUe1FWajjIxmpFNJ4nLLEkiLE0u4ydiR1lkgt5JNECAERs4FXBcH6acM8hgDYbJ7qSRJIppEeMoHQgkiIFqgx15fLEWhyJp553aaa3A/yojNozN1lGNKFTUHUSK8OXKuFIIR6pVEM80f291G7iQSHUZWOdDmSBqFBip2JwFaJmtwZSzNF+okrEswDVDAqcxp5/xGKu+C6tQ9dvV4ZI7dP6gSQyqSQQoqQFrmFPPniu2QtrjHu32pGj1uGInH6UauWSOpGTKSdRYmuXDLFVspfXES/bfHro9pFUu4DI6hYw7V4ijcUFOX44z3ymiuImdn4y7IWt0inhWNVdqVaEqK1iIYUoeA58OGM18r6miuJEptPHbqaMSS62+5XtSa9KuQFoH4cMqE4od2yyESSLxgwhJO2kNvFGYI7juAREk1JIemkVIOWJUraxDJatF8TI7cbtsNijypMJ5CzxxxxdVGXIqHYUBY88xjs8bw+XJq1Bx+V5nDjejkY73yaaRXjsbRIpEULNOULyAg6gQTxzy9aj0OO1g8NjprZycHkebvk0roiKvuV3dFXMslDXuVP09RoWH+EUoAeXyx1seGmNQkcrJntkerChMsg/VgZ0cNqhZiJaKfyeufAA4sSZXIqsYTLqhYmRI4umGSQ6kdiSNJp9R4A1xNJEO4m23+HeRbuGsrba5Lu8ZkCghqzMxoNJUaCBWpJ+OC11XqNY+43/7c+xnivgvit95l5haRslhZs0iSyKsrOigu0QFAyajTpNfXHJ5PIbWjNuHDDRRnkHulu/ll/Hs1vH/pW0xRSHZtKAW+qU6EFA4Yl6kENQA/PGauN23ZsvkVHoVhc7JdXN1Ot4JN3uLe8p99cER20EgJPcLKAGYUNOQGWeJ9iRHvbL28E9mty8xlm8q33dFsvbzaYu9uu4OGU306AGO1gQha66ZnhT44z8jOqVZdx8fdZIlG63M+4b/bzNaCG12QLc7TtanUlvGEC28YA/NU6jjztrdzk7iqqqCBeaTXdpsqePRur3V87XG83GSKZCQzEtz0U9eWLaKSt2jUibe3Fx5HNceQeSbini3trBHFEu/XMZF9eLCAPt9rgbSXZ6kFz05k46FF2qWZL2lwtxZvO6W+9Wm1+KbZtp2Pwfx6l5HsHcygjRuie4I6pZ59NWZiQBkABhWyMdcce80V7VbU9psW8e4G6yfb/wCqKxSaXSrfYWymmpiKDXyA4LkMRsPrBjXzXyBPNvK9082mBh8d2B2u7G11VUVPbjHSOJpqFPhi7FSF7WRyPoUz5ncm8uNh8XiuD9lek7x5QRUL3GUP+oo4lUBA9K41VUalD1HjxjbUvLu2nmfTPfNot7Yj/wBhGQztwyyoDXFVrdC2qJp5hvkO17H5V5JLIpVYpIduoQtWhyQgEc5GrT4YhRS0iVvhRlj212+bcjuG73Su13GSC3AmSWjMSV5k0GL+RboU4VOot96b5Zd7sLFAWTbtrWNtH0rJ28wfTMD+GFxtp9pLLuUbsTWf0z1AemqYjiBwB4CoANMarMhRKC1Nqi2m4h0zKkgShWTSCWyovE5YqllyqmOc/jnjt/C80KrbTsQVaLoZWIpXVwoRnX54lXLZELYKshN54tuu3iSSxu1uo1CqkbkAqRmRQZceVcaK511M9+M1sNMW87zthRLnVAxOpFJJoBpAAJGRFMq8sWxWxVN6vqTXYfdjdNu/zLXJlZgCQHH0k/H1J5fwxRk4ysacfLsty8fG/daz3UwW5lb7lgKq5IVTSjUFeQ50OMGTjNbHRxcpMtmw3i3vFXgKsFYxkn6fzAGvE1xjtVo1q8kkiC5yPH3YVJYMhHBlzoVGXEYhBJMNnLaNWcgUjjmwrQAZHiKZ4TJEa3jfDaJI4UvG5I1ih1KNOXMUNK8MTrUha0GffL/P5YIbm3tJlXofWgBooGYqa8MuBxuwcedzn5+Q1sZ43Df9wvTK0jzGaRjqkI1aAAGNKH446daVqjl2tazEFts27XemR9SKwKsxIJDHq40IrTCtlSBYWydbT41tlowvN1nilIqWPdVUXL84zJFK4otktbY0UxVruS//AL48c2cLBb38UbI9IzH1AZcdQyoBTlir5V30L1lotExtuPc3a5Tpjvo4KuQWRmZeBY55Cufpg+RZC/qasapfM7aTU1vOJ0rVm1AtpH1Bl+PAYPktC/qEyP3PkBmaWRblHJJCoaigyzIrllhqgnlkYZ7lplKGXtI5BJ0g0FBWjE8eZxOIK7WGi4giKvGpKaqhSwUrkasRXhiaKmR27t1jm0lA6MAoDECgINaHSCf/ABni2rKrEQmVlc6hUEUAPBa5CtDXPPLF6MttxOzUyVQoXJ2Xj/5ZjDIjlYySwTq8J1OR0FWORIHMenDEbEqvU0f4J7moI4rLd5O5P2xFFPKahgzf03YCoIoaHGTJj6o2Y8k7lgb1sVvu0ZvdsiiuoiAbiAVjkjc1rQj5ZYrVvUsa9CBT3ktvA237zB97tymqR3Kn7hPygpIAT01GeH7hb7kYuvH7mG2l3HYm/wBW2uY1liADyR6TnVafzAxNWINEWa5bU0EapOY2P+XnBGg06ghIFBmcSFAVFfvYzsLC6m25xno1HtsanjyI+BwokJgVX15Z3wU3lum3XUqlJbyBB2pDxBkQAjj6DCBsY7qwdbRYtLPG6iSMxgv3GGoqobitTyP4YtqVwNm3SNZyJP0uhVhLqTpcV+g0rQj5YsakrRN7K8+yeQ2ryRGYq0CBix7VKmPWx/K1CD6ccKrgdlO5duwbul1brSbvzzFiXVMuFDSo+oelaHGyljFehNBJCrJCAnYjVFaHQEjVWXM6yKhvhX4YvKWoDkiSITMUjiaMKBpCux4BCoUVbTTmMApCgCtuHKzammCCSNjIQWP1JwBNBwNBxwCGTc9qea6uNysCYdwjRjfxNRPuRkGJ01ofTGHkcZXUm7jct00ZKvFvIn0Wkd3cSfoyUmt3XpBU00MtcydXEY4WbH26HocWXv1Ly8e8hCN9uZgC80jvKzBkZSKiJTQhaZlvTGS9DoVtJbW1bzJSFXuZIIruMsyzIHDxRVYBWBGXqR+GeKbIuqyyNr37SqiJ4/unj1lgrDtqi0QsGJU1pzPzxVA5RIod6tpB35Sss0xKhQp6DQK7FK0NScqDBEC2HS03krLbinf1VWR5Wdq6l6BmKilaAZk/zDSG2PcHkDaXuFllkuQlIjIQGRBUFWahBJ4gilOFcsMJFib/ACrbCU3AnCENAF09169VWDEAc9VSflhpkWhyfeJ5o5BLdrNLdIsnUp1BEIFF05A+uZxOBDnN5QtogmlmXTaRAxo2a8hrYqTTLOhzxJFbqmJL3zK7ihL2gjI7PdeKTqLhwCZEUE6eNc8/wxJNsj2FOeUebq8EtxamaJrhaSXEgQUirR9YFaniBXiMWJSNVM9+TX6XN5eXFS9tLG0kgMukuCOhARz4Ej8MWJCbM3+QOUhuLen3bSgFGZQsqA0LEhCSQqjLPni6qgz3KT34tPR6C4h7nbkhen9IDVV2FK1oTxri6pmsyq7tJD2ZOyxtULQpKshYvHq1FGCkkDLKmNNTJcZlAZEOc0kja0ZQB20j5gqK0C5HFibRW0mWP4V56LJoLLdrjXbCi7ffBVQrpBr3S/EAUxrx5fUx5cPVF3QXiSQznvwhZQhneuSowqCvMVrlTGlWTMTUB7BE7isVnQ0S3k1EkfSQXYHSKcv+GDqJIMpNJJBK36p1lVBYAoDkAhyNa8ScvTEmwgTqIyt2XjJ0sQrxguRmR0oPqLfxrhNjDn0xTHSFkCxBViYEDpIAEnTxBPMGmEB2VftikrhWEj6ZwAaAChbVpFSFqKHnhyB6OJEaaS2DmyjpII9VVDUodSNU9XpTLAiJ2KTU/wBxqihhnBMtxpqI6D+nSlcxmfjhjC4z9uIZoQzhlEcoHUy6TQMVUmgIpxGfDCkDjJOqSOgNTqDzCjKV56BxryyzGGAGJIre4CPIwRwJNCtnIaUCPyX4Z1wSAREVneQ5xggxx28XFhIc666Zgca54Www4okNRcSiRyxRXkqsi6WrGY+IHClWwMRpPbr6aCGPvu47LKIUjUuOFWJJIqMukGpypjyMHuUPku4t9pJKAIZWRnahbthnBKOTmWLaRkB088LQmVnuk7iPvxSSHuMZ7xa6wYqlidaUzkatBwxbUqtYr3d7tqvGzNIgj7klzIra3eg0RMtCAVLUxYjOyJ3d88skx1aJ4pEjVI1KNEwycMKZg048efwwSRs2kN89woSaIwdx2cPdsV6wS1P0zXSaVyyxIr1YU0smtYpw/wCgKxzkh+gDURmQprTieBxJBseFzVZXiQyW5UuYJs5HBy7lcqigyzNMA5ByXMqwpcOarHJHRB19Na0AUgimVf4YiI8Z6SEi7leOXW8phCyVGZ1AU6SDyJy5YkkKRvjmRxbtqN/ca+0kGa6QwI6tQowHwzwhteoFgO9JaNJ+r3A/ZWscRIFQDUGtAM/jTARaC2ll7k84iEKaG/zKLTIdOnOlczxwAERMdcUiIoiZglxECA6uuQJ1BTzHP58sSTDViJ3LRSd93R9WliARGNWQcVy+dMFhpBExglGiOONUioiuOgsozLKHB6V40HyxXYaR0tKzxSI0brHCGSQ5SMv52VRXMcKEYptYsqgsRarpokuBHHRWS4IAqVWuleIWvqeeM9rlyQss9v8AullkMTIECzRx1BZNLgOoNaE0OfrjPe5opQmVpthuJLeRoNRnmbQwoDHFmVApmxFcsZ7ZDXTETbbNi1sx7LrcgqmulTIiHJGVfpNKgH+eM1ramquP7iyNs8ZgrGigRXSOGRiKlYiANK0NRTjirVsuSgeL288f8cEk26XS2k1uupolo0z1NCwjGY9fkcasHAy5nojHyefhwfzPUg+4e5SGWax2WxFvGoNJ7zrc5VKaBkK1qtceh4vgEtbv7jzfK+obPTGoK/v9/wB13JFG47jLdOW0wRSsf01qKvoHSQOBpxx3MHExYv5anBz8zLmfxWGsXwlMTSAIHKpLqXQqaQKacz188+ONKXsMsglXQoVXkMgNUaULWI8F1MCPqrzwRA5kNdkfRGw7iRUNygBaVpCP8Vcxnxw9yMB8mv8ATUxCQxOWtZAesDOq6Wz6Rkf44QJC7bLxILy3e4KXEVxIGlkCkFY69WX/AC88SGzbHtp5Dt9zu2x7bukv2l0zrHt256mGgUpCwoaKKcz/AAxi5KaTNGC6nUv/AH/ZfcXa9q3fxnyfbLi98V3jVFdbtFKDDKJCskVxFpUdupHVSgrTHByZFOuh16auIkpR/wBuu/bDNbXkN/Pu2w3VwyWXlDEFYkr3CZo1zbQTTUB6Y0489Wip47TEGv8A2w/bBt2/WG17p5dZdnboXZ12cO+q/RydMk5yIqfTPDVe/XoJ37XBO/dnxTcL+3sfGtstYNq8c8dEA23aoF7aTSRCoHpShpVuOOLy7WtZpbI6nE7aqerM1WXi9jsI3BvIt6tNn3DdSaop+8uY869tVjNFJOWZyxkrC3Zru29lJV+9754vsW4Wa2Hj7eReSyMFsty3xke0hYV6orOMgMRzLkgY0Y8iWyK7Udt3CKf3jft3823i+l3zcZd8XbkCzbox7NupB/TtrWNOlFByOkcMXdzerIdirohw2jY9y8y8qsfCtrk1KXE/k94h7ZYflhIyp0DSByxPGupG7hF5+/8A5Zb+I+KWXh+y525AtJrNCT3CFCvFRQCRmBXBHdaCNdFJh/cbq0sVreSuNu2Ui/8AIYQNMDyLwjUAdRBotBkBTicbKoouyu/Hra58hvb/AHG8ZYn8snM0KjIRWiFgihVzCkLT5D1xO9ugVqWtssJgkvJI0IvUt/traAnKNS3EihozmjfLFD1Lkipff/yC3stj2HxC0Dm51yXt+CaDQgGkHLmanF3Hrq2U57aDj7X7CLLYdjuJFCf6g7Xs/wCagTNVpTICq1rinPaWW4qwigPcTdW3Tfd+3F5EMSTS28FCVZlQEA0pTi1aU9casNYSRVd6tlKtetD20jch0NaVNVPDOmXL0542KkmV5IQePK5oVDRSdRFREwIA50BJpX44awJifKgNHne8BGZ5kRK6VqG/NmtRXPT8MTXHqQfLsK7bzrd/0VkvQrrGWI0ajU1Kk1IrU54fyKkVyrAD5/uEhjkuO3MjGpLoQG9SDzP8sH9PXoTXKfUeIN/2DdAUurIWssYBEytlXiSWFRQHPEHjvXZltclL7rUktpsskEqz7ffE95QwpWqoKcCKEA1zHzxTa86MvrjjZmlvbiXcZI4oJptdvGQFWpbXzOfHhjm50jo4WaU2zb52RAolk0CqIgIK1zAIIqBX5/wxkdjUkE7tYyQhrl49DkDSzN0qRUZAZfHLEZlkyjfNLl4oJYKLoI1xSE9KmuZqB640Y0Zsr0Mr7xK893Ia6nlbQNVKKBmQVANfX4Y6dNEcrItRLEkdrbzXVyyxRjUSWIqAK0HH8uXDFqTehCVUiu6eS3sjaLSc2kchPbKUZ5A1R0AAfH4jF9cKW5nvms1oNu0nfd83n/SbbbpLvdLqF7URz5sHCl1qKEFqDLLji+tV0M1sj3bGHcrve45m2ia3RbnZZpUmWNEYa6gPqkSoIB/5qZ4Go3IJyMb393MA0y1RCWVVXm5oa1rWtaYUIep5Jyz9xSIl6yqKeqnAk/Gh5YUIFZoeba6mn1NrRQygd1aZUJozA8K0oAMV2oi+mRkxtYy8apGgeMjJmBAJrnnXLMUzxmvoa66jjPYuBVtMkS9TIlV4Zn+PPLFXcSdSIbnCYpJJQpZFYhwCGNQenPMfAYvoyi6IPcFDJoRBFQkg6uND6DPGpGS+4lDEOpNG1tqK8m9OWGQBxkxzIxJAVgVVTmBXhXCYIld32bS8WSNURJ1DhUOTDmK+v9+K9y/Ysrxvzq82Z0huJ3Mej/LXYfU4StKGhq4APPhii9JL6XLeTyTbdxtAd2sY76ErojkiBAUUqG/xZ15HFGqLdxE/imw3oafZt1udrnlFJDqJTIgjVpKkEZVrhyxQRXePEd8CSxtb2m9qpqNxjDLMAaihIzrw4jDrkE6Fc3e1y28kllc7fNZuucckldSnOoOrMjLnixWIdrGCWCa1CFJ1cK/VGtSWUg6qKaZACpxJQyOx1J2WV45Ul+zamasPy8JV1DM0pliUITQiubJgRcBHFpcEGAOaMh/95FAPjzxKr0INajxaThLeKa5tv8s5ctCz01/86NpOY5cMxgemwmyzPGdwi20jTdx3No5Vg7KQyllHWcgtB8MXUuU5EW3ZbgJ4pVcRzo+l2jQaQ4CgakPKmVfXGqtpMl0OtrKsVTHokMLVjjA69T1ORrQ5YkVwLYmVmedHdplbSsjOQJAwqpFMgqEmopiyAQnm7+jvh1VZZT3FBKsjHNmIAGbn8aemIRA9WNV1t7/cC7s0UXZZUUKdSXA1ZBwc1PLGTkcdXWht4/IeN6kj2TemaIJBFWVtcThuk92VySjivIVoeX444OfF2bno8GdZFKLu2feBcQmeGTspoSOCNZCwiKU1EEHLWeR44yWoaq2LIstyqNeqI29+FXQjEywgGoTMVI54r7C2rklC75CkU8gjlkn1KZLiQqdKgaaoDxFeQOINDkebHc7pWiSZXiaZSZJKHWJFJrM2ocSpqBXB2grSO8e7TXUUmqbNibi+u0rF3AP6dEVaCrAUJH9gxJwCbHS2vHlitmeE2xmDO06yCpQZGLMZGh6TlXhywJIeo7xbrP32SNFItWYRXKsItMYIKowY5VBz+OJMQOW+t5ikshZVuTrmZyCrurHSJdI4AjOnzw0J6Ee3XcooZLWKVtDaNZuAWQtOxJ0rVjkK8afLFlURKa3bdrtUv57ruTygdCkKRIAxU0SoypxqMXLQTclQ73fQS9p6Kpkd3eKAlUD1qihWHEc/hzxNMrsU95AQJbWCGFp54JJDeyxOKkK2oVIpQCtTixKSi7grDeJWmkmgi7VzFKvdW2rp0zAUYk0LdNfli1GaxWW6WUgKtbSjvW/9LSqoI3Y0KsRTIDMNSpxYmyhoj08SQyvL2mh19Cq39HWwpqFKAqSKNUYvTK4EaLJ3I7a7AMCkqSqKqsinU3bckU5nLE+6CHb3Ft+33kN1MkmzPNrCJ3IddS+gcFatanPljTjuYc+OC6EAjhgBWWISgBUi00OdWBH5jlz5VxoMqDVCr2JTEiRM5AaMk5igJCgZZc+WGgYcWAuJmbud9Ce2KjVIQKgAtlVuQwAJWZpYZjOO8CwMjKp1CQ1NGpwypU0wIJBzfcwss4WgOhEXMhuORyqc8wTgBnkV2uFBRJQrirrUJQCqVGXD44khIJj+3/V61gkhJZQw1RyPqzOlcivwwgYb1agGWNWjiXU5bMgZlRTMjM58sMJARR6Yo6OipINZSQkjKulkIzywMSOwySKv65NFc56epJD+ah4in/imAchRa2leVJc61HfAJLOn0tITmq5YUiORC4VVlLpGx1KZfqSZQpGmvOvIkfHAMuKznK6GrGzxjTBDqX+nXU7MCKnhpBoKU+WPJtM9rI8yzUjQp3G2+RgI10V6CGDSLkACvAevHCVSckR3FJRCyqs8z3j9u3h7lGNqWDMTQeoNa/hlixKCm7IFuk2uWW1ecXrzSoiXDAqNCCoJJAoa8K4mkQfqRdj9zcyTR3HYUy9sI2llmBBBeopnlQYcFT3EiCOZynZkDuxhitySakj6Qw4AGmeJAchS3buaETXobu2YZSOmmoksOGVPnhyRepxkknjkkMqG5ijPcimUdIXLt0ppIoOIzGGGoS8RaO3kcLDFJJ3YpIyQqCOutgGJLGuItAerplTtRHtNGvZZVosg+rQwoMyTl6YAgCFdy4it1bta4ZCiBnUHjQUzZV4HngQTAS8cCRyzEsgZf0UnBL586AiprTllggBLOILk2/flkit7ZVlmkoplVhxzNDSp/jngkBOZ1nMiypJIZkeZiABrIP1GnoOIOErBANJy0EDak7gXqZyimS1UZ0FK5EVwnYcCYyjuiZkSKEA9lhxKacqU50z5DFdrE0ERxOYZUidT3inaiTKg1dZ1tSmVKj8MZ72Lq1HaCCJXnhXQqlCbkHNtAoKJpyJJPDjXGa9pRppQnG3bZJMQGgELGJTEscY66CgYmp6lHTpxkyM246ln7JsEl2C8kWpe2sTrUKFdhxLUoCRxxVWrtokXwq6twhwm8p8X2FGtkn/1W8tlESQ2lDoUA0Z5iAMmFCQcdPj+IyZNYhHM5XmcOH+XVkP3L3H3y/oLLtbRbyI4ntoaGbRTIl+JJANMd7jeHw49bas85yvOZ82i0RAZbiSSVbi6Mk5lYPJOxLuoWpBVqgUauQOOtjpWqhI4972s5bk9CFea3Dos7zsTE2klSgAXUZRkxAGSnmcTcFcg7dhEkBfvBgXXuVo0badIjZK50rwOGOTsrmOOOIltQAjlMgoiDjqZ6ULV5njhCg921kHZEn+ZOlUZmIDAfmdqUJPIcsDAULMkNXV2VAumQsCxUfP+NB/LAgTDZIZdYgLLJd0FGeqSGIVoQ4p1NQ8BhhAsW9pKSEZo1bsWsDj6xwqWFMwAfngTHBYex7om039qt5HLNaTBw0tHV42ZSNIBOQBI4fPEbqdAro9T6eft197Li+2mHxTzKFr60s5Ug227lTqh0gUiNSdWWYr/ADxwObi7dd0dTjX7nEmyLPePHpd3Ntd2zbTpkjaNyB2ZlmoynMUGogVBzxzfnY3kiy0RueLIqSty8Y3iMJeEAIPoCU4nOg/HHZpHbpsc3WdTHvvd5Lue13W4bJbTSahCLu9kqIRGjcF7nM5Y8vzrOuR1PQcHGrUVjA2+7vfz67jabM7faykrZXt1nLPJWlRqqdIOeQzxlojoWUblZ71BJaTpsVlctunku4pq33eZCQLeM5kLx0gc86410SXuM9peoBivj2wLLt9v9wzXAtPHLUir316aa7gLSpRCR+NBi5KWVPQ0p7Y+MWXtV4vd75u8hHkFwv3W83r01NcygHtIc80HGvPFlrdEUx3MyR5b5Dd+SeUblufeC2sK9qMOe523kalV41bqy56sW41CFdlJb4X8m3O38csmddms3Z7tmUmqrSpc89Wkfyxqq4KIJzGtp45tUE4hczzxu1tbUqxiBVFy5VNABXIfPFblli0JP47ajbbOPcrqMPdXrtf3DSVoyLkBWvBjkB8cQnUscQYu8l3WXz73JkmtGaSG7u49uhjTMCOJv1WHoOJxuS+XjMj+K5p/yS5tvF/Et5dZBE1pZi3tkDU0nT1AAcyxp/HHNr8Vkja/hqYy8lDNYbWJSrzX0Mk1wGbIl6ioNDU5gDHSpvJltsVFuEUiASK4fSEorU1g5ioI+I/txuxsw5F1QwMXkYmR2Pbp0EVqSKkUHDFpnaLF9u/Az5nvS2l1UW1GAWM9TEVyrT+Hyw0Ptgfrj2+Tbt93Hb5oQLqyuG7VpLWNXjoxjzArpYDiD/DE3oxRoOdx4Y+9XF/uG5W1pspvNL29jYIYokKIqgRR501FfXjXEnZ3e0ChLYsG5/bNux8Lst7iuXtt5lj7ospKGMqTWjgjI6RkBiFtCdCJ+GbR5Au6jxy6sHtN8MLSWlpKjhZ0GbGE8K0OdMZclZN2Nuq1NHeB2l7te6LZblZyQq1EKvqUKSRqZankSaY5vJrKOhx76x0N1eIbJBuFtDJEdDBNOjgWBXM0rU5Z/wBmOS9zpII8x8fi26J5ZIldgBokPAoPgOJz44ZKTDfuPexxtdkySKzMRErggUzIIrll8ueNmBSY87SRl/RdblufYkZmjZhmQrHVwBpQ19cdWqhHJblh3mNr/pE+27SEN5vEyiR7YCvaqv1sBWuRJHpQYuxv0K71lwaG/bZ4X4E+7Nu/l19Zy79ESLe2nZO2gIy7aNwJz6gMX1ZDLhsltoWB74+y91s27XvmXidlDunj+9QJ/q9na6HktXIOqRdGZVudDX4Y1U+Ne0wP4TI23+PQIb3atq2q4mmvgiyRiFqh14A1AHIHlitYnI+4mN17bbR4Z4fft5HdWq7xu4MgiWhaKPiqCubU+WFbtqoJ1q7WnoZbv9uQXMiWZ6e6dKfmYVyLHOmXrilMstRToSvYfE7gzCSaJ6nSzKwyGfEgcRSmKMmWEXYsPqWxtvjOipmVigIHeao086Bfl64w3vJvpjgP3PbI4VdCEIVDQUoa5szZeh/jiCsTdSoN7tFichWqAGJkyJJGVagcP/LGvGZMiK7uwrS6lqprRlP/AC5VyqePHG2uxhvuIVQ0FcjTVQcdP8MMrPKaVXSFoa1ObAj/AIYALBux3dq2q5CqyiizMeLtQKK8cU7Nmh6pMT2xluFdAAstq+qKAcNJoKHkMxhMaY5Qbjd7ahmtpnSNs5VTOjcSsgzFMQakmrQTuw8lTdIwl/YxC7UVSeFjFI4PGq8CcuOKnSNixWkfrfdJYA62W7yWYQkrFeoVrTPpkp8uOIOskpFT+X726A7lZHcYe0FM8OiRSuWdVU8PjiDoh9wxNvW3zFZra37F3Ej9RgSP00q5INdRy4YGmJpMYb2bb5JFmg2+zui7AXeekjWTrA4A8RmPT0xKs+pFjBvMVuY4bSG4WR+4zW7wR6UjqAWUUp9XEk4uraCtjWZZoZoIT+m04I+zzKRyuCELAAg1FCM8WyQaHbark2byFy0WgiOaJm1iQlqEkGmQ9RkPWuGkQakujYtzh0rZEPKpdQTI2k6+JjDGlSeIByxqpYz2qiYW13GUjdkSIyAvDK+mkSVoU086nni5MztQSEkW0kjtBJE0qUEKHplNAaqD6HFskUJlYxyRLcSkrMpYXKGpkJzK0p/Eg1HDCAKdNaSSS26TRxiugakZUJARSDmWrnWvzwoGhNci5Amu49KtH9Y0hRKuRCppyqpOdcYuVx1dabm7iZ3jcdCVbBvMKmOB5xLC1A3cIKs5aoDEDJgMuPHHByU7dD0VMispLp2ndTcUkRnhEamSQodDGh0gSAGgLZAZYztGitiX2O5HOsptNCfqd6iFQw6nQ/PIcx+OE6k2xztt1F01JHd9DCNdRo0msVBc0pQjnXEIGmPtruWgSv35USFR2ixH6oGdKilVTjmfwwEth8trxUfu3EsaSygNa3IdVFRmsnTrA18AT+GCQmSQxXEDl+4+sRsBPcIgRS0teuVcySoFKg51wCQrt2Wa2kia2mkRYlIhLaVMhqFZWzBy4gfDFlUQdiC7ndfatG95c/cW1rGNEbxk0kcVMTnP6fX5YtSIyU/5DuKJLHOhCNClV7nSYwD1KOA+k1pyxNEWVbukiSO0kMJaJO4XV2Ar3B+nQjLLkcTSZTexVO4vGiSoUeO+EXbZo6setgdRIBIGVBiyqKnYg+5MIbi5SCRZZI2VYZXDaoyaU4jMDmcWLQpZCWjExuEm0QzNOpSSMBdVMj2wMjwxJELEcktS0+m5QPJcM7UBqY1Q0JKZaT/7uLk2VOBlktvuppEDK+lnKqK1MRqRQjLqHwxamVbDts9w0FxbbpbyvWxkR+22ZWPWEKCtR1A8+GJ1cMry1lGobOa2uLQXEdwYkcRSwqhJAoamPmASTQnnjdW0o5tlAvhuDGVnUsIu40emEawDxYEMGIJ54kiJ493WzLIoY1MMSiquGNe5nTOuQGB6gCWJRO4DSsAncn7Da1LcDqUAgDLhhoTBRS3CTWl488pJJV7gAKUUcFb1qPhhgFSdyM3EMb6UYdyZHowOeS6qAmo44Q4PO0qCKWO2VbeOLUsEiEqoRjnWnEHgBgYgnQBMJWn13MrB4UBLAIcypY8j6YYhQ2uRATrmtr0nTQBXyrkmZJFcicACaoIEgiEsqLnLEhpGq5DMnPVwBGAZ3+nMhcmQXCGKJUIKPq4ipPFeBJwAEoBoC9xTQqkN0uoBCpJK9sggVpTLngYiybJoZfutRdpQikNG+iEjgyNkSKD5VPrjycHtGyUGWd4ooXt5bWCSISNESVDUqdaMMgB6U+WBaMktURm7Lx6ruC1pVawyBjIRrOntvU8AM+GJIhZEIvoQ1wYkue5cTQ9LqutQ1P09GkhalcjUZYmVMjkwEqAlyZrdzG9o8dUjnNOvLhUih5A4ZESRQ3TFGt4VMgQ92JBV3lkIXQCTnqHHMcMORHngRzKgXuERuZ5I3/pmhUxaqgH8fX+L0YRAe8TloBPC7NKKPWvdDxoNIZuFABT44GxweMbR3MdYVrcMI0oQI0mIHQwFcuB+P8cEiEUqicXrO0cYjIXu8TGBlqGmldRqMEgEqZTbRvNF2gCIrhizI5UrVdOmoXjxwCeojk1QQian3UMaggSGgoRQIjcTmRU4A3Ec8pUGSV10zqHmhYhULsKaiwBJ05cMJsUDZqpCr9so4mZpNLaxM4+pUABpRcjliDGAM7DtLI/ZzL0UhhVhwatTlkf7cRbJpAo2jeWAqoLRhVnoaadOS6K5amNAMVWJLQUWhaWSEhnjDSiNFqFIC11mQD8NVOOKLNvYvoSjbLdp5ooneKJnYIY0Y1AiIAPrQ5ig4ceOKraGikt6Fpwts/jyo92o03FXs9uh1NcNkTRshpHMA4twcC+d+wjyvJU46h6siO5eVblu8rq1ysFlIulNotZCBQUVWc1AZ9Qoa/hj0fF8djwrbU8pzPI5c71YwERvFGiMXkL6BoOT/wCJW4aTlXHQVY2Ob3eoIyx3AXMSOW/TR2XU0QykJYehNBXLDSFPoC0Kk0tCpjjYm1DLSIqwowPImgqfTEoHLgViERxMLxQ9tBkhQ6S2sggCgoVqOIwR6gg1Q0yOJgVjWrXDPQaifyoeFaDhgAKMsvbZIFkmW7cqLJxVCAOly2dMBGQckbQq8jxh5AAe6JADA/yzrTAwDVaEXHcYLa6k7es1pNJkSdRHE+pxFDDlaV59ckJhBAD6iGBHBqMTkacTwxIaYONI2l0W0oYtN+pA60NSMgBSvD0GDYJklNnfXUVt9lcRi5itlpbyn6I9VRokORFCQc+BpiNnI1WTXvtJe2m1W+w77d3xl8e3m7G0bgC4+4imYsspAAOntg9NfQGoxzOSpTRsw6M19su9bpdpu22XMck+5+B3ElrbqiOLi8sk1JrkXUUbQKetK1x5XnJtytz0fCiIZfXj/vhYWWywxbjdxyzxuIvuQRqiNBQyJnWvHI4fH8m8de1jz+M77d1djO3vJ55F5ZvSzWESy2cKhUnI0yTlcyGFcwT68sZOTn+ffuNnF4/yaQZh3K9lklnu2Ie6RSDMMo4q5KiVyr8sFETuyKxW9vbM8D6TcbsO9czPQUtohqklctSioOFcmb1xpqZrMm/tl49L5Zva+4l/bn7OxP8Ap3gO3XGSlIiQbkrwoACQaAV/ji/+VFFnOg1+9PnxvZh4zsM+q024f5+6ZT1NTqYkcSWNB8MRpq5Y4hGWt23WWz22KG1fV9y7x2NvEAZC7L1zFia88vTGuqllNiSeNeNrtlpFDLLHA906NuklakWsSglKtwyFCfX4Ym7dSMDbezXXlHkNlbWKUttzmdY4vyQbfb9KE0z1Pmc/XAtEMJ91/LZPH/Ebz7UpDd3Oi02+JSOqIKY0YV4UFTT4YeGvdaBZbQikf26+NJdbxuvk+4Rk7ZtFu4jnoCjTv1SHl60NOOL+XfSCrBXqP3u/u813cbP4+jt3d0mE13COoaWJAWmRH1Uyrijj13ZfleyM+eY3Nu24JBb9dvZgW4lbpQkMQ1KVGRrjXjWhRd6kJns+8DCNU0Y+hkI9Mxx+XLF6tBW6yJV8eVwjIq1aocAnqqSR1VAJJ+H9mLFlKnh9CUeH3d94rugvdv1m4h6CV1FWrnQippSuZxYrgq9GXbunmXj3nkVvJ5Hsdxtm527C3j3yzBErKCKpoZetRny44vrkUQ0UvB1TJHt9h4LY3AurW63jdb6zHdb/AFC3IjhBAKkqmTV5A+mG8qWxJcZvRkivt+3jegIm8xura0j0qBZ2yxKAaUqxY15UrjPfKbMfHVegXB7dwbwdtv4vOdylv9ovRcbckaRo0bjNgHZq0J4j1xTfM4gm8cmh912m1f8A0y+UBrtVVZ59ILNpU5kUFeRJ9cc/LbQ1YV6GjfaNu52YJQJHkojqyair55qMj+Hpjkv+aDpNfCSL3stlt7eOG2ie37URaSTIal5mh0+uQ/hi26hkceqk+V/ubJPLeXEMbMzqxdgRkTlX1yofljdxzFydCDeG7YLXcorq4hrDmzF2LVbMZAAZen88bLOUYEtZLoh8K8Om3W533ctnlvtwuiOMjDtDSfpHIBSKgjPP8YVvavUuVU2H7gviF3JHZnxaw26zIWJ5IlKTzMKAMZFryHEj8KYsrlLOxkRaTfdqnvD49e3O1WaxtLBbLduVXTRVopYqSWJFKYvpnSKb4FbdELv9+9ybhb6J97MSQhiwSNe6xI1EhwBqoczlix8kzf0nsKq3Xbdz3BYdx3G6m3B5kPddmrSSmbAHkMQeZB8pwNlh4pJPPEv1wAVSTMChIoK/Dhiu2bQdMGpdm0bV9rbJrGs1AlKhtag9NG4/OmMlrmutCU/YJFBI6L9SNWo0nKtCchXFDZckQbewscZGlaSIy6QM60BPUa5etMSqQsUVvpCzOA1aagTqIJB9KgjhwxtxGPKVxuSsJ8zXUWNaAVFfgBzxtqc/JuAhRdDyFyxAJEfqRwIyFcSIpCPgalTpzFKnPPPj8MsBEtnx6yj3bxe4KnuXFi5cuXNAoIOdaVAqOOM93FjVjU1GNilncQ3B/ViooEbHTrFMxkBzzqMS3I7Mdw8dldRvdRCXbbuINKKDNaGjV9V/jiDJILn25bSQG3bXazKHtbpCysKkZV/xf34jMkogcrXfL6MGK9WO9ghqGWcVKgDMhlzzpxxF0Q1djvbz7XcES224S7Pdmp0vVkavAhkzUH44g0yxNC913uNIft54r+C5JVpRpnjU+p5/CmEmMjV3PfQ/pPtljK06ij9ll1AfVnXIr+YUrT4YdUmQsxlnub0yLcWkCaHTshLWOiADNgqnPieeWLUkQkSfZXalO7Jn0lqt0H50NSfUDEpRGBXbwqsdqEuVmLO0cykkUQEUVHpwqa054kRaJ3sd00bWs6yrCEzllOopIyDSWAFDUegzxZVlTqWft93AIpbhnqXoe2qkq4cgCmqo6RX5Y042ZrrUmPcRoY5be8e5l6mWVFDgKa1EbNmDnSlKYvTKGKo6yBDcMyRr0SIq5RtSqmnMkjliSYI9BE0TEyUaRGWVrtXNZEbIKedSTiLUjkTao/1I2u3ilEy6rfSCwYUKgHgw/wAVeOINMkmNsoayule2DxW5kEtzMhIRZRmKKOIoSPhw5Y5nL4/VHX4PJ6FjbJvUsyydy4U3CsgVZpBrKKXHUWA6QKHjnjj3pqdmtiw9u3EzCNVBpLXs98mj6QCEGZBWppTFfaXqyZKbK9rKqoVgSM9po0WrN06mYkcQSM/TEWixbD/ZXES6XNz9rPcEq7hf0jFnkCK/XXCaBsdrOZZEiHb/AMsq9F0CV0pyiAAVjU8PTCgimSiCWaC2jneSNQQrzBlHcEIPStBXSQQM24nLBBLuHGW9u7e1d3naO3CGWVGVnOp8w66sgaZkn5YmkQa1K33XcyIGllfWkIZLkvUDrB0kGpNSaYsRGzgpDyG7muu0kJcSxluqY/U9anV8hz44tSIWsoK33m713MjOQTCoW6jCnJ2UajpqAARXgOOJmduSEbhdm2hgdtcUV4dTyIaSKFYhUKnPMChzxbUqInc3Lwk/qLJE4JturURWpCsB8K0BOJEGyG30aQiSKUGOYmOWBgtaMaCgPp8OWJogNlxbK7Eiokgo1w7KS5NBUpnkPhiSK2JJY3D28SMAkQo6VFaEE1dgKDI0GJpkGEdpRe6VtnkiSGiRq+lllJFBnVWFRixbkC+fDJpBsdvFczKzW4dURXy0CuntkgDmOWNuPVHOy6MmlqkaanUSSHQVVBVmcOT9R41BAyxaitg0hDfbrEgFuiMjo4YMsf8A7WrnjTgCMSEGSSQyjvojLHFpjhu4C2kotAtaepFCPxwEQc4cyqZ1SrhFUiuhmpkhGY/EYACyER1tiWJXOKAih7dOpSxrl/44jBASd027dkQ3CxxsSr1cxhWQ1Eek5D/1HlgALcrpKSTN2U6/uGBBIJqEUilMsNCBSK0ruijSqMrKwJEmk0NWWuXD+GAchQbVNcBJNDSZwKalWaoNcsqDlnTDkDkiIO6lxPLCYU9K6nOSsmngMIJAlp2aPur3TbkRuNVdCutQ55ll+A54QiyrFYYygjhkuBcssjxRochEeVaEjlnQVGPKntCcpbrdrL2Eku7Z2CQ3qodXcP8A7OjZ8BQ1AGItk6kWv7WKk8SQyRf+xuJI3UOJiytpNKjqFASPTDQrFeXcKKYjMoikiIcZUXI5xtwoQc8TTKWN3ZIuZJYYg7xxrHG0nSykHqZjwYAHMnEpK2hEIih1uFjkcsLsRKWZkky1DTkOP44JGkeigcFoZI0kgl6RdIT+oQMlLevMGmTDEkwgJS0kYNbVLWo0lpWpnEWpQ04qCeRr/ZhSNIImK62meRJo3LQtGqMgbQgq4Q81BpnTBIoCpYpk1xzTl4FMiW88tArAL+elCOIK4EJjRNo0kuyLBaosXfYuOkkhglfnlX54lJGIGmdoZA8LuohtnLxmccKgqa5ghSKUIPxwSMbbl5IxI0DtcJb1W2uTGAULEHQDl0MBQmnD54jBERy3CsFijeOUxHUQjEOgyciJlABKCvLA9ByJ++06xzIpZoxrmLEdUZY0BJFA1a1IPHLEHBNBupoWlmSpWJlSNSxSjAfSQvEUJPzxW6km4F1oWEcqKupTFHHpk6lUAajraoAI9cQaJpyTSw3CParNnSH/ADzkIpjJLaiao5oWAApjbxeF3tWsY+V5D5ada7iRr+XcLycXExkuS1bm6dloWoStCVYoAczQ/DHdpjVVCPPXy2u5YuSMRtKNLPHeBC+piVkjpxBANDlUAcueJorsBLvI7FY52LJo25UVahVbqBNMq8QTn8cPQivaKRcJKJKUCKusFV0mMfSXcsaEZZgceeGhygq3o8Sx0p39KpbuwEutPTPSFpxzxJoEKULRT2rxtIqGOmt1GkBRp0g1oFB4YCMQxVCAYXiZW4ETxDVoWWSpDUPSTTjhEgjtNE0MYLzFKshU6WU8as3w9MBAUwqywMJCsTMqvd68hK4Y/HkMh64GOAazTCSEGA0jfTDaZFwpyVlGVAK1zxHcGHLahQbeIH7iJy1nLKal1zNEDEa9J5YBIAZhMw/TFzHOKSLQq4daZRmoYaiMzUUw0Sgl427v7ZNuZZrbb4J1S4lYg67iucKgsWZlDAA0pTjniqzgmjQPjd9sm5+F7PtdyP8ARba08i3SSLf7SNnladoIFjtp7dHDEOXJqSQtK8s8WarNmK3Q15c79f7BYeM+W7Yq7rcXiQ2O47vE8sgmd4+w/wBxGAjQyOsRpWisTx4DHA5tdNNzscO821Gby0XG17oL3Qb61ZO5sMEhVZSpAoXCcQtATqz5HhjgPHqehV5WhWEm8XO4TSNFA0d0zUmnlyVa5tmeAGLFUjZwMNzH9w1ZLgLZW7VVFI/zM3pSoy50PLF9DNZhm2+LyeSX/wD29Y3cjncWW68y3IZ9m3Q1MFeB9AD08hWmL6GbI4LD838zs/EfHv8ARdhUW0qW32kGkEdmFRTTGTU1fiTxqcHd3OCNa9WZA3a6kVZo55mEcdbnebqtEMvFIlJ5czjRREbMbvH7Nd23J963NPtttsELFiAwYL1UFOAH1U5k4v2UFTJDvG6Q29pLcudEd4pX7dq9FmqlmL+rNxIpnwOBauAQi8VMlpt1/v8Adg2s/khS22dnBIt7SMkBhXmFz+ZxO3oJGYvdzyKXyDyi02yxCyw7WY4ljrUGZ+lfmRlljTgUVkoy2lwaU8X8dt/BvBdu2iaStzMjX24g01Egas1BFdTHI/DGPLbusaMdUkZP3ffDu+9bx5OWAigDxbYSoUJI5KR8yagZ/wBmNdaRVIqdpclcbk5nuXRum5dY5HDEDNoxWleeWLkQ3DrSAqgMZ0q7DWoCgAitQD+PocJsmkSSx2+urQNQand0dOVOFTnl/wCK4i7k1UldlsE0qqIYgkzaw+Z1VIqMgM8L5rRZXEiW2GzvDQ9hDHG9ZPVjpNeHCn/jPC+eyxYUSCS33O8l7sNsC8ka24qoVCFUgPnStKnPjTAs3qSWJIcNt8G3G+kMl2HhWkZntkPQQMg1cuABw++RusF6+NeJR27RGAMG7dJ5D9AzpQ5g50FcK2WCp45ZYdzZqFVH0SNpzKii0AGbDiRUitMYcuSTVhxQXT7P2sS7/Zq9JgHOoVJZNY+lSaVPp8MZaKbo15NKDr+4yWW3vDC/RHAGWNwQdYpxcEihqcsX5FFoKsH8p8r/ADlRdbgxbU0Yk0s4oxqSVJrUEZA8Ma8WxkzrUT7TZxLGKpV4k1rGAEI5gnTmSOf9mLHeDMqSXJ45Fqte0wfVcN+rJ/iHEMK19MQ7yaoLrrxyC9cOkLK7fphtGkmgBOZrQ55YJLdiHXfhwWWRbZyXGmilmzAqQtR8OeXphySgi8/iG5MX1AMXYrJIWfVWuYAFK0Bwd4okbYPANT0dGfIsVYClV56TUAZcB8PXC7yPYh3tfFYLMlhAS1NMVaUAGQpkQK5csRdx9g5fYmNAmhWEbVUgZhQAOIAJORzxB3JKg0XqG2QFUYqG0vUipU8ajhyr8MKRtFSb/cP2ZJepTIGVEGZ9ABTgDwxdRFNylt9mZ1BotSNSyD6SGHA8eBFcbcRhylaXjsZO4SXHMgaTQD+zG1bHOvuKrNV+1umIARYzR6UzyoKn4+mGwrsxqozClc2rqU/8cBAvv2dU3dtv+3h9NbeVokNDq6DXPlnz9cZs26NWB6MaN42WW2VEUErp7kbLSgNerMetOGBWG0EWsEd5ZrYXEqWsBf8AyzGp7UpPNh+VuZ4YGCFtlI21Tz7Tu1k3ZV80FaimZkhqaMKHnliLU7DTHBtoM6m52mZdwWJguQzdPR0HAgenDEZHCGo2UHcDRxyQn6ZYagCNjl6cCcKRwxMYJ7GR4yZIpCS8UUVSsjr1fJfmPhhPUeorg3C+ak8ZWV4yJbhSP1VqvSVU0rXjkcjgroGoleZoSqpt6K0usxhRIiMlADVcs8AmgiGWQWaxLaxdsz92KaRDpVqZliwqoNAoOJKxFoEm4yl2lFrC7NI0Ua6RUM3E0qK6TmD/AGYsnQg00OtjfzyTEXBIktiiRyKoMbUBQsFApqFSTh1fqRaLC2O8jQ2yW5DGBGiZ46MCGIouVdFa9RpjVRlF0Tvb7qMxtIhWeSORlWJgTFoVQQ6tULnqyGL6WMrUEhinaYPdNcOidMUMvSwQ0pQgU6fieOLCDYY4tokhWUdp0LabqA6laNwK1QHItmRThhyAUe49wqITLNHHpjmNNIAzrQ5ZjnhOBhckHfM7pC8drJENECnWy0BqwA4/E4rvVWTRZjs6uRttLsbXcR2d2wlaM959Sa9cQpoIzOa+mQ5Y4efB2WZ6DjZ1epa2y7kxMzFnWKdWJiWjDQRQIK/TUGlMZLI3KxYFmzNDEVY200LMiqEqoVusFSQKkkEEYoZfRyPxvqlGeURuumSPSKxmMAE+grnly5YiSkcZL4oEeOIj7qRZp0FDCUADFedDQVyw0hSSmyuIzEskk3bkuTpaPMFVoxCSV1CgX1whoN3W5kmKwRuk8CxkWzSFgA/BgNRKsaHIHj+GJ1INla+R3zQvV71ZtES96Yxr23kWtFZFoDT4/PFiRBspLd7pdUriZHa8ApHHUKXPMZnStKipzxbVFVyB7nM7RyssOqEgCOFCO4tD/ioRThni1IpbghV9PHdtqnAnUqBG8RCDXIx7Sgc8xQnE4KmyO3YZ2SQkRJcP+tGU1duQAUANaqMvl64IIyM9ypklkmR5M0VGk11YowrUE1BoeH88TSFoN5RXt4TBXsSOUkjB0srBepmJJyPwOGiDEsi0WSO3kTuSRNqJGUq8FFTzHwxYiFgoPZKBMI5He2ICwSKMhlUvwOWdCOGJpkC3vBopv9PljIqIblwGZtccikZ0bn6gD0xtxbHPz7llI7xvLwlWix6UWrRzSdNUGVRTjXF62KWB0tRUIWF4gZoy1VjqGJGoZEFqVOGiLPNPJOrOA+m0o8cKIaFCKMSpHTXOnPngEHGVBBbyIwa3p/mIwNK5kDrJ5gUFRgALqR3FC9kVLOGNXMYyBXkBkOdcAHFRnlC6e60B0SBlDIY3/M1TkK/jgACoW4YXEkjUCuCFjXVpBGqNVHGgzrT5YYMGkcwZrq1capB27Tur9YGZ1FhkSMABMg+8CS00xQyqqwLRVRV4hR/hBwhgZQiILoB5B3KlZjTUrZAAmtF/sw0I60TRF0TSe6uVQctRNWYflApQMMIRabwCV57pHmsZu9Eki9xw6w6R+oK/UFINRXHlJk9rBN9sJkFnFFLL9vQkuDoMsKltBag4H+NcJsnXYQbnBGltrWRYwZ0kg0UUhVoQKAAswBqCc8CE0VzuizzC9KhZjJGWNesBAQKM1KaznU8RhplbSGdrJhbpoQ6gw/TAGoRKKlWJNHA5n+/EpIwFvCk1xA9qTEkiijEVZRUjUxIJcA5AcsOQiBvdQ6tErux1DRrUR1Knr0ClAPSp44ciSAvDbyK8Jt+zduVWWEswUsQdLo/pUZilM6YEwgSyrJJbOih/uyDJdP0xsgjAVKV/KcwaGv44kiKGtorZ+1IID2JGXux6qsoRaBRU5f8AvXGuGRZG7lxEvamr1sv6qAUZdXSAi1qM6E8sJgRO4vT97cG4VzGhqIpCulFYcJhXNciaZV5YKi6DfFcxy20ssMbkW1HuZFc6nRgQI15HM0Gn+7E+0gwsXY0uY3lhlhQiGVTnG2TOJQObnIUOE0iUhMl60UwjjRJ/1QqImohdR6kYLxNcyT+ODtkasxCt5aW7xie6SBoAZiwoSyM2SqWP1AgVOD5Uj7kl8RItrulu7hWgV5hoZrm4lBPeRlqaKaAGpGRGfLGrBxHZyzncjnKulSUtrk7SpIWkn0xi3NVVVYE0JQVFQMzyx160VVCOPa7s5HW2idIJqzMI5EGhtQAZMqJlnp4ZZYCsNmjWkhRQtwo1LE7EDSAA3UQQBUDAS3B24W3eOUt9tMyhYypPQJOGlGBBXPjhyKAcQiWSMMjLoBZwVBSYsSDTKgJHpiSFBJ7HZRe7LvV7IxjTbivYjDMCEFC6yIQdda5emDugcll+0/tNc+5++7ZtpuLi02aW6js93uoihCO5GkKTUVC/l41xF39BKxW297NcbTvG87bJMHGzblPbrMRWqRSPEoKGgJPHPLEk5G0JLeIiOS8V442kp35pVOpZM9KMG5fA/PAxQAbSy3MEcjqiuG7EhAlqTQ6UbI05U4YhoxqA6WNYZITKXd3VdJqEmSmXVUUIwwgKe0BtniYKslqxMUxqsqq3/s46DpBBGnOp44fvCB+27bZN2mS0jZojHA13JuBZAlpAmR/UY5jUvE5k88RtoSSkkV/LBIYqmO12+1tEbYrKTJpWl6mnl4jUTVg3pwxXOhJVktLxvxrdztvim2W0kcU1vfPv1xuNw5jsrEXBVIpGy/W1rGwSnHV6HGLNroX469rNReI3Xku2bjvV/tFs+4+FeaPFYnZd1uVt4ry3LdmUmEfqpLLUukpHbUDT1A58rktKup0MM3agmfk+1X0Md3YwxH7C1klhsWcL3lXWRV2CKTQLpBP1euPNWct+89JTRIpq5sdxuJv9LiTtQoeu4b6mJ4kjDqTs0j237AJpJEsSk6W9Vk3KQE29vU9RFfrf1OL6ozXsT+SWx8Q2B7Pa5u1DdgzXd1MALi5dRmfgM8q5Dj6Ym7dEUxO5mLeN0l3u7n39mMlrE5h2aCQEtLLUqZW1Vqq+vM4upWEKz6FZXVuu/wB7Ls0Vy8sG3yd7dJuEUs5oaSFciFGQHwxorpqVWJtqRLaK0hQR7TanUXddHfZQG1FR+UGn9gxJuPeQiSASpN5Z5BDstszqO8j7tcO39KBG16FWv1NxOXoMWVUKQbHb3E8gtfG9tmNmAE22JYNvTVrCkAjURzJxKq7mRbhFE+zHhk/lvlMnl+5q67dtMxllmlQ/1iAxomVSoOo/EgY05r9qhFOOsuSyPe/zE2W2TbdYntTXyhMyoeOAHSNJ41plQczjNgp3WkvyW7VBkTyy8i2qLYvH4yxdHF5usbZ9VclJJzpQY6OOrcsx3vEIappke8lmCqC0g7YOdFAog9M/lhNaFlXqSTbVWSVQVQqDQcCTpA1LkOdcU2ZopUs7Z9qdtFe2BMKSZUoeVSBlSnpii1zTWkly7F402hS1K5Ui+oVK5fHiD8sV9xaqFi2HjFkRGulUNCjkANpplTPjngkl2kwt/HUiVwEGmUZSMVUihGelieOf88OUOB+tdkEh1RgyFqJJStaEZUOeZ55ZYTyAqE0tbaOyQdpetDSWY0ZWIGQzpUClcU2uNUEcltHJNQqVWg1VAo2ZIYkHOpPLFFtS+igur2igMW/WUoUgiXSjL1LnTOoHHgcSxJuw87+BjV+5G8mjv7kyzG4BA0xvVHBXgagU9Bx44vyfzFWJfCfNjfIkfcLhjH3AZaOrKQNQqK1AINOQIxfTQzZXqJ7Vo49EqMOvIJU8BQV1AN+GG2VpFk+O3sHeVmbSSWEesZHUSpINaYpehdVSWhHCZ4ImRFCsAO6hoaKAQaUoarliPfBZ2BM9idDMFHcaoIAC0UMeoECtBTl/ZiSyC7AhNuSVWYBo2eocCqnhmqkCudafHPA7yHYN8+1RzElLYCRa1X0oDQjIE5UHzxB3JfLGu62sMkhclBqAEfNagFTU1rwAxF2H2Ijm4LbommQdEVFkOYLAnIig/wDLAnInUrLe3i1TIq90lqSGlWNBwyAzoMW1K2Uj5GVZWC1dwv6ig/CoNCAMgcaaIzXKZ32SSjhpCY3LdTEAep6aUH4Y3Ykc/KyESysXGhyxArrJPSBnlSg441o59txXbn/I39EVipUEgkE1yHADgcHUa/lY2suomo0qo/TUHiB88BCC7/Yy6WPyC9tpJAq3UBRSSRlwIpmMwcsZ+RsaOPu0Wlueyf6haX0CxVl2yYtHmQSjgGnHl9QxUnBcympopdmu3ea2LRXFUaJqUZK1fInkc8W7kCSyaDZWVxKp3TanottcmqzQ6c9DHMgivypiGwxALG2heOXbtw0I9HTvExyK3Ial5/wwmNCmSXeFZlvLddwjIBZ3VXdl41BB1GvL0xBokgsvt8kfaltpLeVGDL231KADRsmoykcRiPUkFXdltdwtxPM7W04YdmVa68+DsDQEHgfSuGmB0bcltE5iuS8RRGUzgGQSDJSpJ4V5YJZGBr+0mCyTyytFF/SjuHbSzANXRoORApw9MNP1CBBJb6bu2aIqLggu8TUBjDUyBHGoOXwxYmQaFFlDJA0yKzpKgbsyZdRJo5bT+Y1/txJMi0SrarxoWht7b7gtLVCUjC94EdXLqK/HliyrKbV0LZ225+6jiimRXjBicjTp0VADNSnH4H+zGvGzJclcbx6iSrGSZCkqMuhe3WisVIqKUBpzxeUoTRSOhmVV1GNSttcAq1Qc6M4yA9OeAYbCwlhKRnuTxgCeEUCgKalKkEkjj64UiYpjbvhwsAgdo2rIjsrUzASQNQnPL+3DZKRDd2MVzHBHqMUsMgcTXDUjVgtTG9MyDSmQyxmz4ldaGnj5njY4+P36xzTLdOQsbfqwPp0LJxOuOn+LgOOONlxNM7mPL3JOS+vHpkuon1BJyXWRmSmgOpOogVGWdAP5YwWUM3YraDs7dtojbytcRRaoe9JpZCAdRVtIrUDLh8+GEXNyhMZGZ2QRN24ZO7EqtUsuVdK+lDxHLARkldpJLfJ95FJLKLqTRdQ1NYo6ZR1BzA4gsK/ywlUewk3Dd2t0ktYwsirHotS5C1P0liSNNdXDF1URtBS+6bu9whWSREdGAIFFAC1DBAQNJ4k5fHFiRU2V/uswmjiWKdXDDokCB1ZuGqSQ5gkevzxakU3sQPc7lY5DIZ0eQhrdY0XuhFBoc/TPKgypixIp7pI7OjlHtdcc3adaOrCMddaqxIBqTnlgCRtl7TPKkAkVmgEf3D1UyFidQU8K8qcMSSIMamtlRpIY5xqjjyOrS3CukVFOWGJjfcBXeGS6aOMOgJSOqSUBotQeNaf3YmtyvYRuzAiY6WaOSVVU6QoAWoFGyXPnX5YkiNmEoIrfQ0TSNaRPpaOT0OZDFqg58/7cSWpAtvwdGispUEhUyXGcZoGj1dRcAEJUA040xuxbHOz/AMxYzywySLDAo+21rpkXVEJNFf6nOi0zPP54vKTpaASqCGuEasr3Bdi+vhmor01pQYBB36kbPCZe4lC7PFkFZjU6yOR54Yke7UYGt5ZITIjNQjSraRl00pllTDGEr3H0yyzKs8sg7+gDUlKACteYPDAIHM8xfXHOkiyuTa0NM+Bzy6R/hNcAmBZooXZreQmSJ1Quup9EhGYpzBqeOADzyg8IpLYTHVdKKq1V4HQagBuGWAaAB1VkSCWRRcrQP9BStNWgNka1zyzwhyBnjSSJZXkMkLq8KKaMwiXKqx8Aa50PwwxI9CWkhVxcAPEO1BLUqFyoyUFKsw+GATLnRGMdzAGh7SKqRzAVMwYAFaNU0TVmTmBnnjySUHt3rsPu3WiqskTQvHC8SxWxR8kLmvb1LQPUjTX0ocJjqhy3KzuXjhYgAQgW9xOFORalNPGtPUZ4i2TVZI1PsrWNo4iiWOPvAm8QUpQCsjIajqqAKjI5nB3QJ0kbLvZp+qbQrSoihLYKdIU1aj6ToavGg+eH3CdBuvdvki7YaJWDx0tQRoZmINVdQKADlniSuR7Rik25Z4Y4DFKEiZXZpF1FkAJKBaA0WmWfHD7iLqN89nLA/dlpM9ND20Z740kVB0mhpnn6nEk0JoQTx0im6GimndO9c116IsiKClOP5a5YkmQgapUdXkY2pW4u42fvxihZBWi9WSZDjiSZUQu7EzR3LxQy61ovZMZYLIKfohgOa1p8OeFPQGiC7tasyOlrcRrcJqmtFUGusjWwZs6UJOkH0BGJ0UkGQWXcrtAY7uGTs62lluqikhcEkZ0A1Vr88XqkkExom8gYD9O3eR7iJYmkkOehQM1pT+OJ/JRF5Y2Gi43a9cyyJNpWRQlIenoUc+YriSxpEPnNiLsSyaZGjqUCg90lgS44VpQhgfwxOYKHW1nMG2f2Te2Wz+8Xvh4n7Y+aSXf/AG5vttftNeWhCSxyW1pLNEqXFD9LLkrCnHE8WeHBXyMHwzBfH7jP2teX/t/8iVdxibd/Dr3XPsPmkMRMTpqoltd06Yp1BoUNQ31LXgNyyScp1hmbYI2QTfprB22VmtAqlZnyU1cioUcK/DDYSBkh7rRLGyyLco0zCMsaEVqiv9JFBQDAtBHpJkt2lSZw9nLUCRNJCUHTHViSFUDPDkaHSzaNFszNE1zawsDd2QYl+2M6I+VNVQQcOALl20DZbuJ7eaO/265spp4JH063jYEANFmRJHkFrmcmxVa0LUdKSbp8K8Bm8Z8d9kd/8X26cbB595Dst/ut7DErGC92/UgjcIKr3Q2rqzJB9MZnkhxJorhlGS/3Te225e2vvX5laTWO4R7Rv26S75sdwU1R3MM6iS47THJxFI5DDiMasd9CnJTUpLaNvXcd0higtYLjU6yXFuWLKFY/1HypQUGWfpTEnZPQrhosYb747f7nPt3nWxHd9ptQYrTyO0Zba4tH0KKhol0lVIooZcufPFbTHVEwHtr7P7tty3dp7qXe2zFRGYr+C2mjgeisxDDSWpQ0yoTzxXbJdPQvVK+owS+2HgUlvcwW/utHdblZ6TE0OzaxIM6F3EmlTXIZc8Rea66AsdfUO/7ZhitLHZoZNw8btbyVlur/AHPbp57EJGgeWK4ESkrVjkS2k55jB81sl2LoTjY/25edeUtsm97fc+M77Y7khPZsNx7ziEIv6k0CgSRLpFNLBa5qPjTbk1TLaYW1saj232Pbfpb+2/0e7ae2gg7O27Q0MVlbpFDo7bW9yGAMakhXU6h61zxzMvLqbcfGcItnxb213PYoZbY+Kw+I7NYs8lhuF5Ol9e21vEpJTukMCXrrpXpPE8BjjcnO7z6HT4/HrVz1I15JNtuzWqbft7m7V013Jj0tc3835XdYxlTllwxzK2b0R0O2NWVTc7DeFI7vymf/AEbbipeHZLYk3s5rkJDxUH1OL6VjVkLXnRBslybSCC4uLaO0tI1rsmyKdKIo/wDazDiTzzxZMlLKE8g3WbzTcryCC9e08d27r37c2/8Aa0OcUNcgGIyxdSvUjZwV7uV7Msq2dqxXdL1Oxt9koNLKz6tLPyDMOok8MX1RUH7dtVrt9mIWk7W12/1ds/q3dy31HPMCvri2SBFPIt/dv/ifbFDc3MlbOzUk19BxGSGpJPE05YnVTqJj5s23N4dsTwd9ZvIN2DSy3D8U7gLSyE5kqtcv5Yk9SJn7dIb73D8ksvFdjk+7it5ykd5noAYgSXDV45igyzxpqvl1llT+Jmjbu62T248RSxt0aPbtkHalapT7u6GepiOIBFSRzy5YotN3HUsrFVJi7ybenv3vvNNyAWC3maOxt3y7s5IKIqnILGpHLG3Hj/soovfqZzvt2urzcZNxv5WupJnLMWFKEnLkBQDgMb1WFBgdpck2tCO8jB+7MxUnRTnVQMq/jTGayg201LK2KGNmiOhS5owUFcicqV5E8MZbs34kX741Yl5ErpqVIr9VRXmK1HPGK9jdSponZNk1FAbcqJShEp9AB9FDxrinuLuwsiy2JBEIoRSQtVen16eWGrC7R1TY4Y9WUhkjcKXY5BhkWPGlQKYfcEDv9l9kp0rEHoCr05E5UqSRT4nCbBIZ7+cGJzcDSxlICkkfUtKqM+BxFuRpCaJu7IZGrGqGqISGLCmZOYrUYSQ5Lv8AaJR/rduUDdsMpEamuvLqHPjSnpiWL+Yjm/lIj+5GbvbjdjQyKpYLXWSctJYmlQRQU5fxxde3xEcX8h87N0WVLuYfclWemgklyCAaMRXKvw/hi+vsMt9xpt5ZBPHrpKNI0KgpU0JY0+JxIrklXj1wjPGQxNWCO1ClNRAryHE8v7MVXL6F/wC2uEhUtIFeQjuGrFkFOIFaYpZoRKbbbYlEU+mMkqqjJtIIqSRWo4ccQG0BNlHC7NoIhgQBoVjFDTMAitPjliLY4Et3bF4X0opQ0KigEmVK5VBqT8flgkCHbkURBI9UEAIyXVnSrFq5/D+eEEFZ+Q34WMsU7agEuAQS1DUUqSOFcwMW1RBlMb3fFu7HGul61QNQUpXSWJXkK4vqjPcpvyKUyn9GSkcYJKijClePrQn0xpojJkZTO6Oo7jEnUQKyilCDxqc+ON2M5+ZkTYksxH5uLClc/XGkwNjtY9sbfuas4EqhHiUkcQaEjnX1wdSS2Y06T1M0ZIOdDxHHAQLJ9rL5bLzDalcsFmrHqH/1wp+IxTnU1LsLixrzd9vNl5NvCFSkLwQ3sUlaqxYaiRQ0zAIIOM1XKNLWpX3lfjkUr2twaw22+gtZ3DDphuUqClQOB4EUxYmRZV9lNd7FPeWF1bu8CgxbrtbU6uYda0oV4hudcSeoh1u9qkFtBudjS/2efiSVaWFyBRHAqenkMVkxq7AjBaOR5oKkxzKB3RzIy+NOHzwhildxlRJ1mKXC6Vk7lNYqtMtAFTkOY+JxFLUlMBdxcx3M+uV4jdSMJZJONYgBpXJaGvA+mDtQpBogkC3EMgBAZ/t5MysqnIBsxTKhyoRhQxwJSYXiib7XTJcyd6SNyXSWmREb5quYOG0JjXcRtIizR2zGQMRGaqRFXIArQVCkDjiSQmFTQiC9uEd0eF1LdyF+4rc8yua6ySSCKjhixbFT1HrbbiRwmuR9CSK6KzlSgVaaI3y1E8ac8Tq9SFkWnsNzBpW4uG0hQqG0NSzKBUOCoyJ+WNeOxkyImM94HX7vus0sQDSqACNJGlAG4kYu7intkJsZZfsoWKx3MUchkkqxTua8xUZZ5fgcOSDQ8Qya9SqvdCnuQzrxUHI0OWXpnXjgBI7qIgSTWFZiEjmGTzPmaEn19DhsewCW2T7hCyaokijYx0LKamtQR08TSnLCBCS5QRvJdW0Ru7m3ZTfRxOT3UDagVpllw4Z4ycnD3KTdxuQ6aF7+CSLuGxtOJI4UaMiCdiQR3QaAmoNaU4jljgZq9rg9DgtKklUx1d4yPpEAR+4rUWMgUOVBRWAzNf7cUwaUxOFee3leGRe05SQv1I6Riq5f4aEU+WJIW46bO0Uct/aSNVJ4y4tyQWcCmaD41+mtVwIGyNeR3LKGjVUuoep7O3ctHKKkV1AUUrT+PEDFiIMpTedwuZJNEsySmdW7EjfpjpOca8CSTlXFiRVZkK3O8tEmvGeP9MupjiRmVRMAAQ60z4evyxZUqtqRuaeSK5u7iscaqmh16UUOwrpKcfUVGJplTQ2S3EUjFLqMm4R1fvgBm00JWjCmnTlnyxIjsNrsXiuY3d9cRJhjfpZa0NVI41rXPEkRkb7iKF7lKE6AdM7AhgeYapAzOGORscrLdFSO7G8bShXeoKpkaChOZ9MMhZhUgaRVkYK8n9aSIHREYyxA1kg1IrUZeuJorYXHCGmSJWCr21kVKVCEdT9xhm6kZj+GJEHqi5vCbcRePwXCTIXeVmJI7YBrXQ5o2ofA/wBmOhjroc7L/MTyRygubsokrP2zcaiWQhcg7gejE1xakUyCEJYcU7cIYM6sR3Y2+qSgBoM8hxPLAEhaqjyoYwIu4pURxoQssZ4A8Cak0J5YYjsDPNpHfeVFIEokWrIVOfbGQphgwLBWd7gSLPC/6bqS0bBGodTEcCAMqDCgbAyBZ2LRgBYlUwM4oSozNamhAJqOeGRAgoI4ALhoEnJY3EoUozA1KgnMg0+OAALqkSRxSKEjlbUWLVOr8oKmuR40rhjOyEl5EZYzIjM0RqSFYZHTUGi8sJAGSIWejAh3jIE6aURK9PAVqW4asASI11hU+7QsLc6B0gHgRHQEkHSQc8AFt7dvNtu6Wu7Gsn3UiSPARXtzr0gU9D+Yc8eYzY+xnrsGX5lSabEqoB3UZLdTGQJGP6bN9SOikUFDQCmfzxnbNVSwLGwguI0iiQRiON9LMpoQMi9TUaaZaQcuWKLWNFahp2aKR2SRpFWSURXCBSQY4wwQBmPQKUOYOIOxLsI/dbfZRxGG0KvCBqnk6gQAciA2TMKivqMuOJd0CdSOXu1yPEpRhcQTxEmVKa4un8qijAFc+HriStJF0I/fWQDKymhV/t571EdiHA1QoUIzFMuOeJqxW6EeeyRDFJABLFOSml+iSN24kSVOVeA9MsTTKrVGdrIlpLdE7UbyP3oVUVmnZG1CgBotBkQcTRXAwfbxQ28jFkWUjtlSGjfWeKitBQDjiaE0Ra9sGS4N4qzRCJI3ke3bopxLxUYlSKjiMsBW0QndbZHsxLGsIunkZVkCD9SoyaUnNaA0z41ryxKYK+0hW57KLjWkrUUQLbvEqklFYhtKf46uczx9MXVyNELKWRC62Htd+K6RO4XEaTjU60X6aU4CnpwxZ80ksaE8W3QI88f25SIAuxqdYjjFSABmQctNPXCeSR1xqopisxI/ajYK9vEkluBQdwEVctX0+OdcsRtZk0oNhftE8pf2797/AG28xnn+02zbN7ha6jC1P2EyGC4rQj6UeueYxQsvbYWXEr1aP1G774v4z5541e+OeT7VZ+ReN77CFu9uu1SWC4R6OpIFfgykGoyINcdbHeUeeyUhwfDj91P7JvIPZqe+828H+98p9snma5u3CiW/2Va5C8CD9S3WtBMBkP6gB6saK3M1lBg2eAG3KspKzBjEqFe4uZcadPTppnUCn8sWKwgkQSTxySEhFSQSRO6ahpJIczcVNCRTVyOJJSRcj5tuyX24Jbja723guXmMSWMsxM8hNa0JGgClSPQVw5hjRvL9sHi3gW4+Ubn4j7rbPFabbuMNvP4+9zcK0SXtqRLLbxXS6HFxKpRo3ZwB1LThjncuzWpqx1lH0X9nZ9u9u/INw9qd527/AE+3uZ33XxF3njubOTvy92KEXGlf10Wo4cVy5Y5+PN3PVGi9IroW376exfifv34bc+MeR69vvoNcmweTWqqbzbZwP6kRP1I9AHTgw9CAcdGlo1M89GfD33P9ovK/anym+8T3qzfat3s7djYXSRH/AE/crcSAC5t7gDMMD1IepWyahxoWSSvs7SnE8c3rchuS7Vb3U9vA4a+NpE0kcTIvUHYZsa514cK4n3ke2NRVte0WDJAXLPcyBu1IkBZ50rQAiQUDass+AxJtdRJN7F+eA+1NsZIrzdrS5Fy5kG27S1sqBwArkuSHDqxYVY5+gxly5arYtpiZtbwzwPermynsd57W2XgT7iPfNrRZZ3tqdEJWXUe8GzORqeQGWOVk5KXU6GPjSXr4R7IWc5try52Vdqstplc7fuk4b/Vrsa+4GlKlRHqrmCvTyxm+LLq1CNFr0xqFuaHvodr2y1UGGKG2RApiAowKCoJNBqPzxXyL1xV2K8XdktoZ782ZLqKOLXFbi6DSXN1HKV0wKwrG2hwcqjLm2POZbux6HDj7TMu477a7QtxZbFZPPvd4/wD12g/cTMctYV9TJUAFjl8MGGzShFuWs77EDuEGz97cvIrtb/dyuoWuqqAnhrZvTGhGduVoUp5Dum4eR3F3bQ3It7Dju+5vULpH/s4/QAccX1RBuCudy3Q38VttuwxdrZrL9OK0RTqvJx9Dyaa1A40rjRUqYqs9ntNnhu59xuQNxuWMm8X75yIrV/SVgDwy+OLEVshfku+wxwtOkKm0jqu3261Mk7cVA5gE5nniyqIvQS+N7eLGJfJd6gS53u8YJZWTLnkAa+gVK/hi1voV7lc+c79c7ruB2naZPv73cplguJ4GzlkORjXjSNOdDyxdirGrI3fQuXxLw7avbjYG+5mX/XdwHcvZ1Qd0A5UTUKc6D/xSF79zCqM1+feUX/mm9xbBatTbrQVWIOO1FGpJLueB0kceLH4Y0Yqdqkha0mZvOfIzulxBt22uV2Xay0VsqsB3H4O5PA1rxxvw07VL3ZjzXnQrnUQGUkMWBJA4E0H8aYvMxPNnkMkVs5WkiqUShKkFTQemfqcZ8qNuBzBdvjqnVDr1IJGGVTnQ8KHjT5VxgynWwmlfFAekFGI+pZGooFCCBnxGWMFzo0RoDY2pGApoqnUNGZz4AZ8AcUl0Fp2X6arKJmVAAZmZhVlJBPGlchTDIwOThTMskdYhqqW1ACgqaUyFeWeGKBDeqwoiSLrjrRytWCsaLnWmZwTqEEV3CdgyyMyLCqiNVUMRqrlnUE/P+OFImB25XmdnERYqRJEtTHmFA5nID+/DI7miPaxpLPcYJO6Y5gY2Oo6yNQB+ngP4Uwsb+IMympBPfO4G53t3KVV5w7Izay+pjqrpBGYPH8MTvb4gxr4IMA+RWJBuVZivYJcgNp+kZlv+Ff7MacbM2WqkrG53D7ZjEkxSNADKrsooNJzPTTIfHF0GXqS/xy6WWRHWsqkUABIq0gqRQkjOn8sV3UF2Nyan8ctYlhs9SBxMFUyAcMiTTPmFHHGU2ImsaJGAjXGuYCkaNkdOVGKjhUciMJk4DJHV4QwBi08epSGOnPI1r/45YTFDTIrfMjmdAFRIyQpHAsozFcvXliAyvfIZWeNgEUyK2gAtp1A56tNABWlMSEVBvd8gjaPXWTqLMoJpnSnA8cXVKbFM73eqBKxFQrBZKBq0BOfPPlli+iM92VZvUqvG6IeojWDTiB6DlThUjGqiMl2VJucqhiwkEi80oMqchSnzGNuNHPzPQjx4aamn5VrnQ58eeLzCeqiMGWtDUEih/hgGCrwKiqrXW5FRThgAfdguVst12+7FUMVzE8bipoFYFuHOnxxC6lE6aM3/AOSMt1aeLeQRTGRLoR20uo0FRU0oaChWueMNTYxRZbQ2/bPvHj0rCWW2Jutp1CjOrZUQngRTE5IlR7l4x/rRSyUC38mtEpYTSgJ99EpoYyx4yClKHPliScCZWllJuuw7hPHbQyWksTab/aZVoQU6SVV1oacc8D1GmP8Aq2neJJHVxte4JmXWvZfiSQAScssxiEwTgaNy2Lcdv0SxRPdW0jAQ3UJ1LnkRrXgGFRpI54UiaGuBE0SQIpte2rTiq1YMPqVS2liSo4cMvxwwQCWMyRxXkTMNIVrWJzUnXkWkUZmlBQk8Sa4XaOQgpIp/Xdoo5JD1gDoaUUFQMgBxoRnx44bEJpJLlJDEVeXV+grOWKtGVKiSopzNDywKWDGa4Jtp0T9W6c0ftKQS7VKkMaflAFDzxaqkBVYyTwqv6kiazrkjCdKSjhkMqnDItFmbJcOvbibuLMza1ii66iQ006gMga5jF+NmXJUmskZmc2nXO1uyhkRCOg0NBlU0+eNVTOSGyECgx27qpA0qARlU1ZGJFCRUUpU4kiDQ4SyxdFuWCrCRKso1KZNIrpQgAVrxrhyAN+1LbrcBWZT/ANNRdJANdJYmmYPGuJEQTKX1W7yC3iiVXZSdR1VoKBTWjA5emCJJJdRQqstxqlBhuBEAgFVC0A6QRnqoMvjiDGi8vDbJdt8atz9qR900sitcUCkAGsch4DmeHHHm+VHfoep4S+BDsWQfrMwSW6/SNwlQdLELmpqKCgNcZUbmgp1ljWYSW0emIhLa6VygZhwbKoNeLN65YcwRSBWe5mFpkkiRrponDlQh0svBuogFOdBxw0KCDb1cgBpZeuGZtaXidJSRdLlTGMgBRqH+HMYtSKrFNX8oLTG4LTSpqVoYhkWYE1UGlQOYGRxakV2IrdPcwqTcTme2ChC8ekaiABRUFWqvr6ZYcMqYyywOzdzS+qKIHU6kK4UDUKcSxBoPjiSRFsRdySBHlAkEKRqluQncPaYltZoKqVDc/liYtxGGKKh0qz28LmTr0MFNdB1GhOocq4kkQaED3Emq7ftqpZVVVA7Yct015ghacssPci0N/YZm06Y1kshp7VclBNfykk5enPEkiD1EhUu943UzxVeOYDRSLiFJqM6HMYaRFgjEGcNbx92LQR2NZBKqyqSK06F4j5YsrqyFtEX347bxQbbtid1QRGzhxQqBQgEhjXWTShJoRjpUUI5dnLH5Iu8Ve1tisUj6/wBV6ljXr1AEihOYGJkGGyJbtHLKdUUgNba6YGnScwKVA01pUYfQQCcieKpUpMAn6nAyhR9cbVPDOv8AxwhBohRnjUJJO7Lp7H01Wh1NI1aihoQDywxgVjjhLgy9+OQNGrBwBI/AahxIFD8cMGEmZmVFR1l7ZH3KnoY6RUKgNMviMAgUusqo7SkMiTaZgFUZ5qnMMo5AZ4QAQtsFghVS8ZLO5NQ6A8V05HqOdDgGBkCR29JAhkRdFrFTqT4V+PM/hggTAIwVGkYkzSRZRvXSScqsDSgHKpwBsdY/b6ToEGRjNxRiQzDMAHiGOQ5YACvFd8G3Xka3bKduumoXShIk/LKpNKDMKa88c3k4e+so6fC5PZaC+9rnlhluLo3Ahaeso1aXVzWgzQaiueqv4Y4d06uD02OyupRaOzXIkAgERjLOVCyH9RnGln0gGg0cTXjWgzxmvoaqkzRZblJX0xFuyNZU/wBRQK0XL40FcUNwWDY0KyAzyBdMlsI0iK6uNdKqG4OKA/h8sOROgxXG0kQvMIw8Madu2YGk/aUFnWVq0GZLU9TgTF2jBLtyl7COKksrVyDF2Ea01V0VDaa0/vxOtiDRGJ9piWfttYNFLcAR2801KsM6d0rlUmgGLlYrtUjVxYyJFcTRaHclRcsEPSDXLSnGnLLFysVQR+W2PcLSaZxbws1y+kAMjH/2Zz6qEc/54aZXZEIubZEJtLcC4KqZnLEMJY2AohJArXIivHDkhBEr6wDJLaSJ9u4jWR0kAaCIaSesqDT8cSK2iKX1nNO0RaMBlQOwd1XvxRLQlM+CnmRU4kmQhjBPYRuncaQhgpeONh3V7RoSGORLDEpJJDY9roMYIET3OlQNIqqjmpXMZHhhSTgNi2xFuGmjnEjROQ9vIBmqoAJFGX1fOlcN2BE58bnktZrW77oAWRI7Mmul4yP1OkUIJzJqa4ovqyxQfej9iv7gb3zRZ/bTfb+XcZrLbjuHju4TFdfZgIVrb4iNSCCT/IDFvBy27u17HN5/GhdyPpZJBFPE0UsaywTqUngYBlKsMwwORBGRBrXHYk4rPk7+5/8AYMHl3P3B9h9vEDy9y43723gYIgBGp5dnyojE1JgJ0mv6dPpxZW8FVqvoYc9mf21ea+7nku4ePbPZW21x7HM0Pll/uSvFBtatymhoGeckH9MDVx4UxK2aNhKvcfSf29/26PbzZTF/335vu3m86wuDt1jp2m0BI4hotc5AAoKOMVvM2TrjRovxj9sP7fPCLR5dv9uNoiLsjvuO8zz3chdE06+5cysVYhcyoFcUuyZctGXnF4z4rLGDDtVpMkTL2tcav2mjzUxk1KEV4qcRWKjWgd9luPEdqbVXKkyoZGZQSCVU50rxIBw1XsF/MV77me2PiHu14zP495TYJcxLqk23cY8rmxuSAO9A5BINBmpyYZEYdvi1qCt2uHsfLbevYX3B9l/MJbK2SXerPfZjb7J5HBatLt93A31W88CsTHKQKNX5qfSi3Jj4XuaMeDu13RaGy+yl1uUkdy3thHfXaSJLPczFrcwBgCQqAgaK9Q54ree62ksWFTqzTXi/sDbW1zDeTWlltjkCK6mjR5JJEpmia2IUCnEHPFMZbvXYm74qLTU0Btniex7KYZLezj70QAS5ZesZUOknhWmLVx6p+0ptms9tEPz9tRU5/MEn4YnZIqT9CtPK3vImlmW4a2t4kpJOUWVI6n6dD0NT88eb5qbb10O7wY+0yf5SRf39sm11K65z9sAEPealZ2MlKKuoaaZccscS253aKEVd5FeWWwm5tEu2vN2gj/zd0RUx6uSOali/EV9MaMUdDPkRm7yfcx3Rdbvc6IxnabUh1SMTweY/2DGqtSlsr+7jn3Jexev/AKZsz0EO3I36s4Y1JYDMAn8TjQlBTZgnaPbbZra3tG2i2VOhwoFwwbPTEnFAcqk4tRUyvt63hLQqZomurqQMth45ExYk8nloM+Nfj8MXVUkWRzb9uka8+/3No73dLYFkg1HtWtfpaVswp+GdB8cWog2RbyTyyXcJhtGxzSXW4Xw7LzopGorwigH1LHQVLYtpj6srtboixPEPDLf2322PyLf0ivPJ79CbSCTNLcc2o1OFamg9MF7zothJFO+f+4V7u9w2z7LPLd7hfyaVuBXVID9SgU6EX4fM4txY+rFexnXy7fLXx6xn8d2y4SfcrhaeR7pHmWZsuzG1OC8//dxtx0nVmbJeNEUnMtZCg1FQWavrnUZcsvhjUjLYTsKSBQTUgMo4EEivGmJEWSPYbqOKSaGQlTIVaMHMFlyI1fEfDEMilF2C0ODQXjDo/ZMZZm0U1g1INa0OfCoxy8p3MDNH+HSvJ29baqg9tyK0blmB8Bjn3OnQ0LsEjBI9BaZVP1K2bN6DP1xQWos+zmSWHs6Ht1FFUMRrDUND8QCeJwwiGO0UgjVHCCXSCiRg1NeGo5cK1xKSI03V2sj6jLnDpGpH+paEcOIoa8RiDYQVzvUzTzxJBqd2IpGciRUdQyGeWJ0UshZwSrx+1ahjuGZJCV1Myg1JzJGVK0yOFdhVGlfDLWSOB5Ej7ivGFZzkzhAACCaV/wDHyw8Slkcr0Kq9zopI3k7kKyXMNdSS1JIqBnTlmeH8cFlD1J0c1Ma+ZwQwST3KR6BKBLKpYFgKcGPGoBzz/ji/GzNlM9XsTS30iLIEEhAV6gtQtUAcSB+HLG+q0Ofbcc/Hry623fILW8jVoJXRFMnWKjJciRQgU/hivKpWhbitFtTdHjCxz20UqqmoLVnQVBHDnWhr8M8YDoIlrxRTo+g6jIoZKCpICk1JFSMq/PCbksQ2TsrRKrR6HjOgEV4sCCxGZzJzzxGQghu63AIUauuJmKqpAYjIknif40wCZV2+XyMJEFA1CHAGVWppPAnLEkpIMpnyK8JV5CA4bMLkAoPPKvH+OL6opsyo92l/qmDrDAkRvQtqoBQjMjMnGmqMt7FV7pIzLKwB1tka5EV5emXI/GmNFUZLsr3d0VUrQkkLqANNOVACMxljXiMOfYYI11MEpUsa+uLzGCVQCKULhsjlz9AcAw5VCuzE8VqlDkADShr8MACuIMqpqP6OrpZeNWFM6YhZllUbu9u7pfLfayfbu5rv9jVlicUZgVH1ev0kZ4x3UWNVXKJV4vfTOthcxLo3SyV540oaTiPKaFqfA1/HL1wmhDr5x4rb3cNp5JtEkotd3AnimUHuWk5yYEkDTU8R8MSkRWV2mz+VN/onlrDZfKIFRbHyqPOCbSTpNwBmQ3DUMORlceQ+Mb149cyRbnYa0kSllukJV4JFXq1Bxk2XPjiI0xltBJJHptb1lkiIkvLOaQxsipRi9GyYKM/X44iTkFcXaxm6FxZxXd3Isc8d01ScuLswyzBFQBiWxBkcmfbldNMLdlZWSeD87I3FQaUHrT0+OFINgZXhhLx2spnDCWOPUNSnTUVYrQ100/txJgxvlsrp9UsKNa2zR0twjVVQw0kENnQnIAYc6BqxElmsZVoh919uqiaUGjKrnLQeda1BxNWBhlsgttcjMe0ZW7TjrLinSrFjQVOQI4cfTEW9SJOdluGidJe6nakVauubxOpHQpyNF/MTl6Y0UZlyE+tZJVs4Z2n6rMntlZdOtnP0KWqf4+uNlTG2SuNn7OnS8UyIJYUjarISM5AoFDmeBxJEZOzzxd23VA7rEaOVGlWdqtWmdSDx5Yj3Eg+KSJ2uoQoRNKi4EhrVZKgMpJ5MQcuWJJyJiu3DE/bXBjb7dCEfiGAIomrM1XE5DUcraE3lxaW0apNuEsiQWyhwWPAKRQE5f4aH0OKM1u2rL8Fe+yNBNH2oorPrht7W3C2qkVi1AUL6RQAHM1AyPxx5jLabHrMdO2qSOSakSyM5fVG4pOoGqla6K0zRQamvHliKROZGtymgwSEz6RW4ZVZA8bkHSAczpJrkOGBhITK5WeWa2k7iwwBXikyIL06o15hcuHDE0DILv5nNvNbK7KsCajFCCgkIfMksOk6iMq54sqymxWN6Ld30gyQG4dSFtyXQ0Yk0YHTTUDwzxcipkOmjMs+UZRriQNbRICi9wPRgxJyGrOh+GJJldmN9x2Y5pGYUEcqTLO6kjWx+kIPjy9c8SgrY1FEhd1ijEgapiikVlYqv1LIxOdARkOOJIixtkKorwJEe6Om6kbS2nVSooWzBp0+lMShAxsIiVl1xOzRrpVm+ooxolDXSp9csOCLYUxDSiO6VhFGCY5FLKFGr6H6agLzrhkBKjpLphhdhJJORPITUBQNQ5A0oaZDhh1foQYq2mwku7+BEnVxPcAT260bJTUOCKcTw4YvxqWU5XFTRwigHbCIs8fa7UzSpkyKFUVUZijDM1x0a7HNYMWwENvriWaGaR2eeMoshRBpKihAp/hwxI6yRnU2csUqdxJiCEQqeKgj6Ty4VOWEAbLFWRWfVJbykJcRolPpAOtAc1B51wwBCJDLIqF5wVAEmlgdYFK1z6RTjzwAJYVEemKcdR6jKnBM+BHA6j6DAI4ZJJZf04FbtKy/aqKJ9VNJkOVc8Jgg6UdxVngl7hU5ow0FNIA0lT8jTLDkAoiEswebW7OHiZRpLSAZAsBSgp6fPAATpuAziTSJWIeMAgliOR0nMgYBBrGOUs0nclWRRqp+WhpkRkSM6iuEMCjHqt3YyrDVYbl2IGQJoSfQDhhgyAaUpGdR7KlVlgWSsKpmpfUtOA488U+wsRb/t95UGH+lXDo+4Wysm0TuCRMhqGB6W/wDH8ccrmcbSUd3x/M/ss0js7rGlk6WqxxGEurpICVcsNRJyooPADP1xxMiPQ43JPrSkYb9Vrh56hEjYkTVYAOVApkTX1JxmtoakhzOmB4GmdXpHqd9BJR1NAQiimqo+GVcsQkO0KltCZVLxMwuE7qSxUj0u5Fa5jI1pxw0xOug03NjC0RWznYTd0xWdxGKEU+tmWlcjnxzxJWZHtI/fbasRMRt+5HPH3BG1AQ/GMqooFDsONeOLK2KrUIHNZvNIssheOYxtNcSITGJEzBoq5VUcVpxGLqWKXUiz2EU0jIdX2EgRRDcaE0LWgUSA0y5k0qcWplVkQ68tLqRLhpGeRGQd1GIMYEZOkCQfmGJJlfaRXcrKYrJ24C8r0RhFTr1DUzgAcfnkfniehW0RG4s0LwntUgArC4j64itdWqR+I9AcsSSEMdzaTiEFWCOZWEjhiWKMAVV14DUQMsNEIGSaExrFbmQ2NKLB0s3amqQUoAS2qtTn/ZhNktQboyOsUjRylI3+4WGIt2sgK0/MWNR6YTRNDrtaSB0tyjozyh5FSUgiMANVVSh1UHUh4Yg0OqPpn+wGKV/fbZLmGE2kFrsW6Pcx0IAXthFANKHUzA8sQ4rjILnV/wAln3jRwVBFaEcSfT1x3kzytkDohqcm5/8AjLFiIlZeaeKb5BtXlu+e1abNs/uNutkTaXm6QsdvvLuFf8v98sNHNBVRJmQOIYZYhaoJSfA33j/cX+9TYfNr/wAN9zfN7r2z3u0uGt7iwsbNILUJKQ0EtncRlhcQEGoIPD0OINQW1qar/Yv4P5B7k7p5R7m+6/lO/wDuDb+KXK7TsWw7pfPNtUm4TEtPcmHUY5O2jKU1ggF+FRhqGRvKN1e5HvI3iflmxbFtd/DYNPcRf6u80QMUccjqioVHCtePDFny5KHlhl1+OebpuSvHusA2647nbW6r/l5CVDKFJzDMDkDjOsvbozT8udUThk1BWjIRuJWmTVyFcN1bU1FPSwjmgViNVskskZBTWAR81rUVGM2Sqs9tSWOzr10Gjct72/alMdzKLdYR1qUJA9K50Na5Ypvy6Y9Opox8e2TVDb/3N9zdxWlpZPczTBWD0CqEbOp6vTGdeQeR9tFLLnw1RTZwPjTtbo7X9ykcRNKAaf51NMW3yWX+paDPWqs4qpE33ttPE6rcFo3+kahqAHMEVrir5lGv5y35V1/ZIF5TYW17avbruIhku66mlk6HUDgaZ1r/ABxzOXSr2sdPiXsnqjM3k1rc7TIZ7m8jhnZDapLaMWLM4GlSoAC6v/GeOPaqR2lkky55jNvN3osto2v7NYtaLdhl0xMcpCCzNWp/Mfji/DVFV2irj49ZWR72877btcw1kmuHJmev/Kq5fxxsqjNZyRy63yz2/vSbNtzKxr3vIroAkqBxjDZAj4YtVit19Ss9z3eS7W4uW3Bra1FTc7xddLtq+oRLQV/A4srVkbEKh3CzNteXURfa9nai3G+ykfc3XE9uHVmo5ZZY0qjKG5In9/vPnN8fHvDNqeLaqFHl0sRWuck0mQLcPgKfHFyqq6sg3JZ1rZeEezdj91fTr5J57dRkqqBpYbZVGdRlUn/xllhWu7aISr6lKeTeVeQebXdy0t29mjnXLeXLFVWL4A0DHkOQ5DFmOqQrMprfvLbfaluto8WYh50Iv97lFZTHSrIjHNRUn+3GqtJ1ZTaxRcoklZmc0EchpITmaCufEnPM41ozPURRxi5dlLdSgCNuJIGfwPLFklaUiV41JCLq1qWLaiahQMhw40zxIgzsTyIUYAyOjVVcqUBqT/LDEnBoDwy6hmjgkqCG06UAqpPAA/In1xy89YbO7xb9yTNKeKXFTEXToK8KaWBX4E1HDL+OOdkR1sbNF7HNIVhKgaQB0sFyYVzAHPmMsZrGhFp2FwdMTq6kLlIpAAqAOqlK55g54Qx4N4ok74VhTplGZQkj1qKDDTFAz3siLE5ELM8jKAyg8yVpQFq8iMKBSRjabbv7vLPcsJ4LWOtuiAg9Qyp8fhi7apS9WTnaVQ35j+4VUYgykipqeALUpRuHz+eM9kWJwbW9ptm2e8gkn3KRIZUVnRSWLBySA+fIccdDg1q9znc21uhSXvd4/Hb7jeSWkyTW6yEC8AISlTVgTlTV6Yq5CSvpsaeJZump8/vNI0t0u3l/TtDHTQqBeBAOZ9T88SxKRZmjP0UJmv3NurSREsJAQC2knM6iKcDlljbsjnPcJ8hitrWGC6gWt1asGWZ6VFKgrmORphJy4Jx1Nje3m8R3/j22zSjqZI5Lnq0KxNCQCCaUz/hjn3UM3Y7SiyJLlQAsQOhqNQABTxFCRU8RxxBl0jBul0rQqgr0OQzoepqE1Ay4EfDEWSIJvN9G5fthNWlav6Vr+bLLgMMi2VDvd5oWTWHE7LRpASCzenOozHzxbVFdmVNv1zEFKVlaRH6KCgqKjVXiOGNFEZrMqfdpUDGQaZWOmmeeqlDWtfTj640VRmuyD3665WXvCsa10k0zbjQ/wxcjOyAb8yrpjWqksWcUyPGmZzrnjXhMPJ6EfUspqGFSMwPSmLjICBKlgH6AasvEH8M8AB8URYgAglqdRzI50oflhMkkPHbRVpJqRdajWRQZDgQfn/xxXJdEF8ezPl//AGr5DIsshbbN0C29zGzAR/4VLeoPCuKslZRZRwzQu6WX/b29A2blNv3hlu9jveKJKv5OBp/hOXDFJOC0fHN8s+1PBdo02yb83a3Oxcf9JdgU1KQagMTkcRkGiCeY+DqLobZDMjzFWksJZeEyE1VQ3DLmMiMsOQRVMO+eReONPse7WxvLM1FxsU4BYgaQDDqBU/A8csDJJhV5Z+FbtGs9nJcbRuRTtiSUjQGYCvdjZgQRU00tThXC1CCIzbJuFvHEtgP9Rjt2I7ZkBMKj6mYhuZFQDlniWpFwRydL2ySZr7a2PdiImft6NTEkIrVBANOdc8CARCO4ngjV9uFpbhqMYyA7RqtEZfWhNP5HDJSISVDygOyztplDKrsHjUjSuZoGINBTAR6hd5PG09xKkEtrczNKsyuFWMMygAioppArl+IpiVQEUUjLI6OWIhYF1VBp7zCg1Dgy864lBEnnjdu0ojlnEX2xKk3AySlf6YoCM+ONONGPLYnF27Wgs7NRVrmb+kF1MYhUgnguVM/XGiTLDZKVZi0TN+mkq6Vdas56BThWgAyzxKRQMFzfRWssbTo1IdUMZqE1LlSueQzA4Z4qdixIDbTXECxTzCPWjk3afVROoAKvKvrwxOthNEoiaFo4mhnYTTPqiCt25CDxUMAQtBz54u3ITBZXt9YNc7pd3eh4xti1hkkjRA8zigJZaqWU1YUA+dccnyOWF2o63jMLb7nsW+kKQR3JnQtcIjR9o5GvGiHOvGtKepOODs5PR7oQTtDbFTcpH3FRTb3sakKg4laKArE864sEkF32kQoUft27aC6KoLiIAKV1AHnQBcKSLGa7eNHYSus9xCtT21I7cYpoOogVoOQ54uTE4ITvU0YhZDcNbo7O815JnqR6DIc60zPLE6opsyCXdWuEiSJorVY2YxPRGU1ZS0YX8xPOpFPni9IqZB7qC3RSslvoiZS6u4+hfoq1MyT6jEkoIWGYitxM6RuBoY9kVAWhFGzyGoDM1xKpWxnJkkGtyInkZe0FbWS2fSAwqopwriUEZG26ZQpKq8RNO4FTXQHqYcKgvw45UwQKQoWwJt4XjWGRiZhEXcFSSSq5VqHHL54mVsTOJTDcFSpM5K3KkdCSg6jqZqatVRiUEO4TLHK7zMGS2mvABL1DUi0oOmtRUfyw0BMvD9uS7vJB2XmtrUMI2CihYBmDVX8vMfwxqwoycixctS1ux7kiRTOjC3D6XzoCmf1A0qc8bTC0eRrUSCMSGGNmDXUjIQwp+VVFVP8Azc651wSApPcBcuxMMYWbtrR9ULZEh+BpxApkcANhIlctNJcszh9KTzMCSFNdK0BzIoMAj2q57L0n7sBqkUlGFaGhQGgJU0y5emAAUKhJe2SYRApdYSoohoa9XpzrhCEpIRJ5QiytpBajAKXOXcqRQYADpFeV1mlmXXFEW+500oa8+TFRSoGGCPSrO0aaAjw6e48yFQ1aZsAeAamYwDCHYiNejtq7iS6B0ippkqE0IqBwwMUHpZBF0RyOrXWccDj6CRyIGVeGeENAQqGkjARPGE0lzqYvTLIUFDxHphgV4hjd2SWL9K1kZvuKFxqatEdmAJWvCmKtyaYttnls2t5bfXaz27d+abUNIfLRISOFPQVywnVWTQ6t1co1L4B5Zb77bJ91PXc4WRbq0VyJFXOk6t9GhjStPxpjzvN4zo5Wx67x3Mrkql1L622WC8itjGhtlV2/TiJIV8uosBn88ci52k3BJQztJbal7lZ9MbytpV51pUjTWqsP4HFTJI9JAt0rOAzSI8hjeYjSqHqJIaoBH5c8CZPtCZYYIbOCVCyhHPaeMk6nLnI15Z9PzwC7RiuYY7UtcRJG8fd19xA0ksTyUJoMgADTj/bTE1YrtUjF7txW5eZSL2aP/wCCkIcrIoDEgKuSgkgE/DFlbQUOpBN2tFtWuLf7pkRZo0i7ijrVhVuoVCU4GgxpraSp1IlfWkKRKiACKRzLLKr6kjkjYsKKBVgATUD8eGJplTqRfcdvgilnmjuax3KhZ7VgVV26lbRp4UPCueJyVNETvLGVovtn0kShnLyaqZgVhzByalTT8OeJSVtEYuLIFrd2tXikU9qYkfpSBFATTqJNCMq50Iw9xNDV9vBBc9ot3G72pWzbqB6wytSpYCnHI4kECEWaQudBq8Mv/VyM9dQqyx6fqI9KHCJIXWkFsb5rgErWbvApnplKkAkFSaKSeBxGw0tT6+/sK2+02d948g7Wvct0jNukTMCEQaXfQ5Jyc0NDjnVyuuRM1cnF3446H1jsd1ilQUlEoyJkQ1AHx4cOGO3i5CPMZeM0PcF3FJTTJqBAICmuXCvwxspmTMtsTQrLBhTL4g8KYuVkylKCsPdP2a9ufefx4eN+4/jFt5Bt8cjT2U5XRd2cxp/mLW5FHicUFdJo3Ag4LVkfcVH7Ie0Uv7fPa+PwF93TebqDyDcL+33pU7Qu7e4lZ4O7HmBIkWlX+IqMsV1hMWR6HzK9+vLH3H3X3uaaZnG3v2wCxWOaRAHEaNUgUCinocdHFWaHMu22fRL2i84s/MPAfHN0S7jmjvYFO7K5YlJIxpIJ9QRTPHI5Fe22p2cFu5Et8J94IrDy3dvbnyG+aXcFuFn8TvJhR7myZNQRz/iShHx444/9e8F+17HVtwfm07q7miod1tLqLUsi11FGQ5GoNOBx0q8ul1ozl2wWq9UIN2sItwt5UBSK60UgkNNaMOBJNcsZuTgrkrK3LuPmeO2uwX47si7XaJFNP9zeSAG4nNaEjhQHhh8PhrEvaS5PIeV6LQer2yt72F4JkVlbI1FdJGdQMaM/FrkTTKcWV43KM++b7fvWwvJNDbyPt9UaG6s66kZyQAygjIcTjyfM41sL9h6bh58eVa7mf/IfK5Lsz2sd48nZLyXN5MKhjGnSAjZhjSgoeOOf3tnUVKoo/wAn8t38/f7jbJNc28NupuLSeUoYwSFolQamuZHwOeJVUsVkijd69wprWSUblspttwkbtayx7OkAECq6VJ4k0rWtca8SZkvBVG6+dXcglitPHzIWNU1RhVdjzXIsR8aY11p7SizIXd33nG/K0SbJ2npRDcErGNXpWg/ji+tK1KrMZT4hurXAfe7mPetxjIEFkf07KB8yBIarqGVaLi9WS2KXLCtx2XxCC4g3HzvyRN5ntiPtPHrOotoqVKqoAFAPSoxbW/oQdRJf+5u43Vp/pfhOzx+O7SzaXngQIKHp1a2ADEgZmmXxwRO4oSKl3Hc9ugld91vRf3JICwwk1LcKMQanl8MXUqyLZV/lHlk99ENtt41s4ZKEIQzSN6l29BjTjqlqU2sVpch5S3bZe2mXcFSrMTU5+mNFdCp6jVOGiOjT9Jq6gGtQOf1Ysoyq/oAaExqtxXS06hmAzOkAcciOJxNOWRiEMpGtSE6WjPVnkf5f34sKWGlCkYOYZSwehoKmlc/7cCY2oRY3t/eEdyMN1q5pHlnlyrWtAcZOVXqb+FdxBqTxO/Gjtws7MGrXIDIc2A9McvJU7mKxojYL0MqIyhSw6XFT8/SpxksjWmWrt9wRbmQSEgEcPpZwaGmX40xW0TTJct1WMyLF3RF1MlAwUEZgj4cMCYgkRm5dFpVSSTSp48qEk8gc8MT2Oblt023WEl9Y25ldFZ5iq9SoeJGQ9R+OLE50KLSUQnvRsFt5HDY3N39ndTOI45HRo0Z6UIBNcyQMj/LFiwd2xF5Y0Nk+L+5kVraW9y91EDHEVVlNAScyK1Fak+n9mEqupFxYh/m/uIl4si3EsThEZLZtRC1P5jVhXj88R7WySsqowZ7keVJIsy9z7aFCS8jPpU6QaGmdK+lcbsOEw8jMUh475zt77kYFinkTWFmuWUrAxpwWq5VIxqyYmkZKZJZJ/IN1hvFhtoWSWaeqrGCCwBOrU30gZLyGM9aw5Zp7uhqT2wRI/GLC2uZuyY49CF6UbgRq/CudTjHl3NmPYt03Xb+guzAGtQoWtaEg550OKS5MjF/fLGjl3OWag0PScs/7jiJKSuNwuw6SkR/pstAzqGOdTzzIHy54nVEWyrd4nDyqJJHlEagyEZAsK8gfjyxfVFNmVVvFxVm7QKooNQWoDzLfgOONFUZ7MrDc2UmUwAjqzOXSKUyrQ1NMXpGazkjd0uqpDEFv6qqaVoKknj/LEyorjfJK3sqhtVFAqeNeJH/gY24VFTn8i02GlQGWlACPzV4YsM54AEV+qhIAPP04YBj1ssDXW4WyadaMwLIuedM8jTliF3CLMalj1uMCpMLbtlBA3SeGRGRqacBitPQttuPG3IzyhAxKxRfQaGoQAkVApWh5YiwSk1V7b+R2PleyL4R5HOsV9AofY9xkoCJTkFNKZ5AHFV6xqiyrJDa3G5bZulxt88Ulpv23rov7GUkLfQDg8ZJzYDgafzxW0TLM2Xetp3vbV2fel78D1W23NWK3Fq1cg545cNWFIQRHynahH2rHyOH/AFO2JH+mb7CumdFHBSy1rWgqcCYQU9uPi+4be9zfbZOt/a6f0iy6nJHHWCTXmKg4coHsROaYWckt3e2UzSzwoGe3kdQ2h1zmJJFKqMzx4UxJWKxruN9E0ckGuUQxqzzLJIzFqcVjP8xXLDJdqYQ+9xRhVubaQxPLD2y31pIlCQDkKac6A554UyNVgbLjfpv1hDCskeplN2ymrJX9KgI4EZr6UxJCgjlxeSTUVYdFuhGm51VWMqM2BPxy454kggZmaQuW6kuGeisxBFHrmtMh8MT0FBcPit08/wBsBL2HVhroQjIVXq6eYNK1HDGrGzBmQ/X8lwdysri3Ri0UZWRcgjDVUlFpwbKueJWepCi01JnYXeiK5rCJNUQWSdnooAXoDMOJz48sPu0ItIjc9yioFjJkudXbEMqhqlG6SX/5ammeKmySQ3xTOzuDKzu7ssWsUkkZqnTWpVlzw6sGiTbX3ZF7ouyWuSImhYsKSDMcAaDli927VJFU7nBqbxLaYtq2S2tpCpugyXF2q1UB2oTprXKn5SMec5mXvsen4OL5dCZtCAKqptmjRhbdxeIYEsMj/HGJ6m/YapmhUzdqZEiS30yLHWqsfqXMVINaADFqRBuRrubcAwEQrbwslKLVDopVlqCyHVxNc8LQTYwXUZncSgmaSOYUjVGH6KLkiMSK8M8uVcW1QnZEK3RYbloDFOsjyEmCZyes1HTUZUocXVKbEI3L/MC6uEs5LMRyNGZS2t9VaBQvFVOdCMWLYqZGLt5KrF2ihuGbvQsusIQNNaEj0xJFdmRmdWuEYyIWByEayIryUI0mjD14U4YsRXI3u8v3TTSJIk0nbjRJP1NTKNOh6CopxrX+zAQYzyqIhPqJDXGsK8fUZApqeJyJFQScTI2EQZBrKr1wRqRFIAC8QGWomlCv/L6YCM6AZOzIidoj7WNS7OyUZq0oHrm1TmDiZBiWVY/02MpgngXXM65dJqOIWp48Dyw1qDehbniNl2NmguIzpSdxIUVjR6MV1Bq0A1cQRwGOhhrCObmcsn0iQSTdhJdQMfciKq3bTVTSI+DDMZ/PFrKEwxJi4hgd3jhUaqyIFJdK9b14gDlzxIAkIonHYTuRuhZbZyQH1cK1+nhqwhnjVirxwhootQAB0nQldRfLioNR/LAEHpK3DlHhaRwoBQOagH6GQNQAkfwwIR2scbhplR3jA7JAao0dOp6EggEnDALkQW/SxIEiu1vTpVya5uvD5DAB5o5G0WkZKRqjM4YgqsoozsF4MQMsABTBHMckNukYGoxSP6DNtSDI8cEgClhAEKmzE8cy0ASQozuMw2nMfH5YGKTxEUatIp+37LKHjdiWlU/mBBIOngM6YQzir9t3VaLVPMXZkqGIi4kMDQDPMAZ4YmV4RLF9xJFIr6gImjWjRmLLgWy1CmYAritEgxS2gokbPbjRcQqGZmXV+Vyo08KrQYdmSTHTYN3uNjvra92vTBLCRGzEaUZGFXikapFAOHPFGXGr1aZdhzPHbuRs/wAH8qtd82uKazna3jcjvw/T2JVGsxkA1IalRU48ry+NbFY9pwuTXNVPqXJDcl4pIw8bM5pHbMCsaysNVFLDVRgzV0kYwtaHSrqKbZI44grW4jt4SAFk6zJJRivUCDVaE0A4YrTLYOShAvdn1QwTR0lWEMBDpPMEDQ1fzHjgEIruGSON5IkgZmC9+YhWNQTpC1IOsjl+OJJldkRfcrMdIWNbdEUNZSrUuq8e2RU1OedT8MSq9SDqiNbjYSBb4EpGLhKA9IIR6ESAAVoM/j6cMX1ZTZEX3Hb3tzHZSRxSKAI4LctTU1K95cjTUTpNcXVbKXXqQncbPtWsfbSRtSdq6mMevTQ/Slcuk8xniypXapGr+1ZC9vEixzwHNlOZZBWqoTmw9T8sWyUtESnt2iSXuF4dcmiFS1E1/UQh9CeAwpEkN09o0UTxvEsZniYRNJGBVlNe2pYgniOoHEhQNL2yxhlTWJp0UyXblWAkCkrEoYdLUGXrzzwC6jnttosMkcTqFjngjDrQBqEjUQ5/PlQUxGxYkfSz2A3+HYtpt9uSH7OW2YPcNPQzRipNSwIJU0FByOOVlo1aUzpY0rVhm/vHPc23niYT3PZOrQ6uBTQK9YFcwacMW4+RGjMGfhyWrt/lNpKgZJowJKaJY36XVs1Jy4kHG2nJRzr8N+g/W/ksEbJG1woLKW/VyA0ipIb6aY0Lle0y24M9Byi8ssNQR5Qg0hwagk58MvSuL6c1J6sz28ffoO1zBtu+WL206rcW13HoBVqNpbiUcZg0y442Uy1yKasx2o6Ptsj40/ut9hvKPbnyq487dZd+8B3O6743uJSG22Xq0wX2kqqDTQJIeljkc8jsw51VQzFm47b7kK/2pe5Flt19vftjuVuwG+Bb7xy+dhG6uCNcRhrQFeJpxxm5lVZSaMFmmXb787dLsu7+MeYbZqiuYriOxW6C0/Vi1Anu0rwbMfDHlefTucHpuDlhGpfFvNre/wBstm3Bg9o1rHM92iEHWeLNTmcZMedJQyWbjS+5FhQbsCsEUO5AicEwO5qSOOROf4Y215ErRmN4PVD2m5XwQqk8Nw61DFqDUeBFQTQ401z36Mqtgp1TDZN4vLcKTYSSqVNZIZAwHwoc8XPlXqpdfuK/6ZPZx7xvm8m2x5OxLIkFxQrS5HbDCmX1ZEYyZuXS2+nvLsXGvXb8DNPuTtmw3obc7m2isJIh2rS4tKyLLGn1ikSsacwafDHDzdjbg7uC1oMY+VzpBOjWPkUkm2wSNBFbXtm8kojrRzJJKQAjZ/SCRzyxVSDQ5Kcvt2urdntILLabltRWS4ZWlipxURrSgahr6gZZY2Y3JnuiJ7l5Dc2aNPJPY7agoqdmEcRzzzxoqk9ChlXbx53eOXjs7eTdZWB/zlwwitw2VMjkePDF9cZXZlcbx5Jvs0Ah3HfLbbLeZRrtIELuM6tknM0yOL6Y17yp2ZALnedks11R2k29XJqYpr99ESasw5hQVJqpABpljTWrKrMju4eR79uUQe7k7UbHRb20ACqVH06Y6H0pU4mqpEZZFNxu2g0NRJJ5SSi0JCBiQWNM6158cW11INkXe2ubtpZVZjLOrCV5Ophz5nI4smCuJCuxHax95wB9tTRGWDanI46accxxxJOdBRBH2ga8umncUU1Z3c6RQU5D58cXTCKmpY1381XKLLpUAl8gOrhQAcBXliyiK7sbII2kOiKpqDqpT8vrz44m3BXWsiu/TtW8YyZ3/NwNOFOR9DhU1J5dFA6eK36WW5Qh1FLjplkyHEUA/tOFmrNR8a/bc0v45fvDIrxAmhPZiYg9NPqJqKVrXMY5N6nexXNC+N7prCMrds6waalOZ00OkkZAjGW9TbW0lv7ZuKtEjmganUoNFOdCaED6RihotTJtZm3d41kuCXdKL1MQRSgqADitk9yY7bbiOROpxGVUPC4B1UoQcqk1IqcKRMmkfYkiWCSP9EgMQRTpJI9OAGVMSTIdpQ/n3tD4j5S7z3O2QJJcN3HarI+RJ1E5VOdaYurkgg0QW68Q8g8T21F2y6kv9ut4x24mZu9GrGlAScwOQOL65FbczWq1qil958rvZLkw3ErCXU6lQCDQUAyFAchxrSuL60RntdlYb5ZX29fcS3UYezJMcChQEJJqrsSDmKCtMaKXSM1lLItHsMKTItsdMUgoVTpzI1UqCWFMsuOG7AkiUbdt1tFOXSKjgkM6rXj1GnAEc8U2ZdVGmfC7to4I0P0NVYgQFANKE04kAk8MYchtxvQsRL0yrSYhVAzjUZE/3Zf34pZaRq+voEgdozpIJPYA1Vr8eHwOBA2V/ut3UN230AllLUIbT8OPCnDF1UVuxWe6zK+osCyZhnZamoOYFRTMYvqiizKt3WYOkhUVevGhBAP1ADOoHrjRVGezIJeyEue2imIv0VLUyFBnyzOLFoUsZbp440fXlSpZ1JNRTIk5U9MziSUis4RU00n3FxNM2RdqhSf5CnH0x0EoUHIs5chZOk9WYGRC/H48MMR5VopLcWOkKeNePPABY3t7YSXe4X8oCj7O0L1bhqyAoAOJGM/ItCNPHrLYVuKdzd54wgJL6I60pkoNR8cKuwW3Hvx+FjdTgsBWJgUFAC2eYBGfwphWHUckM9tJbT25/Xg/U1CtVdMxRQQc6fPCGaW8a802z3FtLXZfKb5bDyezVP8ARfJyCrMwoe1ORwqaZ+uKrVgsTkV7nb7hs14Yt6R9rvUpXcUY9i4WpCyAhSAc/wDyxWyaZIbPzWe0sX2ryOxTc9qfOKQJVmViT3FlWpVjl6fhhD3GO92LadyS5m8a3n9ExF49pv3e2uo3NCVVh0yD8eGHIoZEL7bb2X7zb7i0eynWJO7bwoGildiKhq1ADGmR9cCsRghl7BD9w895apM8HRc2QjZXJpQ6a9NBwIGH3C2RH5PGpoJYLZZZY7KRnmll0VjdeIUIxYrp+PxphpkYb1Gaazs9vUJDItwjh5BCyUdA4IZjU5VXIZ4sAYrlTIsT2kCx29rlahmakorqKqtSNINSAeeGgnoNYgnjdYEWMi7cmBJCChZjmyjjqHAZ8cSmQSJN45cW9pPI/ddrS8kMaMw6QwJJdQM+XUOIxdRlGRSTbc5zIscouGDxyhY5CwKSJTq0qKcV5c8WtmdIkFvd25tkSBFhjECViRjRia6njzHUPiK4rkEhvvpDJrcDvvJEEhVVJLjI6iR9JFeZwE+04oNxHbW6O0jW8QaJw1S2vqfqB6glBWg+GJ1RBqUXd7d7Ct3fjcWgItrJlYRVqkzuAMtWomjfhzxn5mbtrBt4GDucs0bbd3tmW4lMcysUDSBRGDU0cnmFIpWmfLHCtadT0NKxoHTu1tJIalxK4e4mfSoidvobKoo1aj154gTYmnjZWt4p/wBOiSIJqKwEhqGJ1VB/xYtRAYri2lFvLEZl6lRYI2VSrAnSzGRP8R6acBywJERnairdToJTNaE20iIemFXNCVOerqqCuL6orstSDbhIxaW07SwSQlZAqMDGy04AA9PKp/DE1oRbggt5cPOZbUStErqZ7fU1D3GU1VMiOFeJxaimzIjdSgyxysrwCYJcRPJEn6klNPSFrShrWv8AaM7UVtDLdRxIZYe12poqvI4AEg11NIQDnl64aK2xn7o6orZ3LOEkd1rpZo/pr6CtSTXDSIyJZbiSRpp4rVZTHN3HTQSdNKKEcnI15UriSI2EEruqSOzq1zcOLhiFJ1UNNDAVFRSlMSKwtpVk1XB0G3hoiRFKChpqyB41JpgF1FG32L3O4LZqJe5rqI0ICGPKsYTiSR65Ysw1llWa/ai9tttVt7aNo0a2iYAOjhNCquXaIpSp+HPHTShHOs5D1aSP6mUzaxMJ2ahVBkCigEqaZU4YZWKDKl0yzuSS8h13DLRkH+ChALV5UGCQgJZVd7cQk9ihkSZjUlRmQzH6R88IchwDRTxLqEav1xTKoC6GFQpNDy5YBhYkaszQosMJLSJCisxDg0LtXMUGGI72prXsxxyxdUh70LAFX1ZFpcyQOP8ADCAL6RPFnIqk/wCTEQ/NqNSa8icvWmeADioKTW39ESPqRGdQxoeoZioNeJ4UwwOKDIqBkBDymPu10GinpULQ1BPMcsASd/V1sgjSKYhhcxKMkRz6/wACTgBnbeMD9Nla5EKusQoVRRQ6pDUiqknAJhMUM1O8Cha2ZV+o/qN+UZ8lDZ+tcIZXojkjhCSiadIye4ildSKwB1EV+oH6cs8QTJMEzNH35UZmkt5CrXZUjt1HNSxJNCKkCmG2EAYWJNJCY4JHAmEYORqekq2Sg1rUc8KBqZJt4f5Dd+Kbgl4QJIiTDewFi0ckQA6lzprC8Ryxl5PHWVG3icp4bz0NueK79b71bJf2nZngvIGFu7np0IBwVqUI4U/448jyMLx2hnt+PyK5Kposm2KS2jM6fbrHpr2+pmmGWtVyIBBzp8cZWoNaYdMZo40uyYHyC3LohKSSUXpJYD6vq1fgeGFI9xPPbmCGOOeEyRxzPI8qEoTqXp4ihCVryrh+0ixpujOgZ5nhZ4P0g0RKm57mYqR0/AYkmRgjd7ZxJOv3saqyxFrZl6EQKSe23brUjIjFisV2RFLjbJu3FcCFIpp1kS5ljciN6HpJBbpyzHxxdWxW6kTv7JUkig1A223gOssakqw0gs6sopkRT54vrYpvUjF3ZSuTO8CWr1aSeRWVwgcFkJ11JNaUpz44nJU0Ree1CQxwxxxlZwW+4lj1xAmumqsagnif5YkitjA9kzM4UTOM5e1UFKpy1sSRnXLI0OJSKBqKVWBJYBIi641jAYEStmgJpQ58CcMiLrQFHhJjOpB/07D9NHU0ILVr1mmY4Z4i0iScl8+IeaPt8j2lxIO7cpG91MzCWJGLf0Mirds5mrZg4xZcZsx5INAbd7kmHs21vuC7gysrQF9VFEVV7dBUtTGV0joaFkkmu1e9F/Z65e5GqzPG2u1cBWpUFoo8tBWmYIzOIw0NqrJrtX7hRIJomuhPHJONUch03RCL9YqFXTxPHCtayI/Kq9xq3739vpYI0t7+ACRz2lZ1DdqpDAUp1UGZBxB2syXyqLVbiL9un7o7nwnfpvGvKbs3vgu5TsReO5eTbpXOkSHXmYmy1AEkceGNPE5FuNad0+hz+fwa8iun8x9XzFsfmGwz2t3Dab7sG+2rQ3VtIizW1zbTLRkdWqrKw4imPUY8lc1Vap5DJjtis623Plp7yftN8q9oPJrb3P8AZNJd18V2e7Tc9z8XAMu4WFao0dqwq08FG+knUq8dVBivJkeOe7VBixq1pW5am7bnae53tovkdhIJ5ItvkuN0t3lDPDcA9YKKCKoVNRQEZY4+aLJwzrYG1Cgk/tLtlxvft/tP2l+LqHZ5Lq2v2mehkRM0XpzJDZDkccZ4rXTZ1L5lTR7sQb9e3WzWnjls80ovrrcNcpjYj9EHpiTIZZipGKapppFyasmykd099vMLGffN52HcTJYW25Q7XFFUuIItBMrSAgFdJHE05csdXFgs6ymzDkvSYaJFtf7oPNbKcrcWNtvKQXLLuE0YKLboCQrSNq6iQKlgKYt+Xkrsyl9jWqHxf3Rf6veX2x7p4kLmS3fRcQVJiYkHXpnIBVV4k5gYz58V3rZSW4bUX8pAvIN933cwl147uG4eKWdJkltJBHuUZKv0iJgItK1FK0PD0xzLVUnQrlgpnfH81klkuNw3Sz3BUJXa5bpkgRqgkssYQluHUAxNMSWMl3SUj5D/AKmkk8F55PaxsimOlhC8zFy1WpJVcs/XGrEtSmzKk3HamuC8sKbpunEFpf00ZvlmaY11kqsyG33j+7S5JthUuCyxsz0BBpShIJOR5YvrZFLRHm8S30B/t7NIi51CWaQKoFa1A419MWq6K2hE3jqWc7w2IG6bpJ1yBQWgh/xFiwCkjOta5YtVp3INEJ3a8SwMtrAxvL2UsjTqxKJQDJaUFK58KcsW1UlbZGLXa57gGe4EjK9GWNaVauWvMVpixsgKJYYwskUfRCrEzTGrBRWpBalWP4YExsh95aTbndfbWqyGCKoUA8BXMueZPLF1fhKba6DdvMtvYQvYWL6WCkSMrE9IoTnU5+nwxZRTqyFnChERCFlBk0dsGrdOo58q5kE/Pji+SmBytI5HZe1FpiiUvpoNS6jwNak/HELWLKVGrdrhprp1ClAoIZMgCVyJoDTli2ihFWW0sQRuUKTRkRsrB6nI1rXI/h64k9SpONTSPi1+9/Z2t30qaAyKCKKRSoJIzzy445mana4O1gydykvPx/cjRQ/bai9LLkSCc6g50r8MY7o6FLFx7dfk9cctZtXSlTULQA5fP1xmsjTVyWfs167kVmjicnoYlqKy041+HDFDRamWDY7pGEDu6IsfSO2Cp4cwcq88RFJKINxzi6i68aD6aEHPLPhmf7cSRFsBE6SM3drIY3LJISCSpoACQD68fmM8JsQt3WwEm0XRn1QlQdNAKfTUDVQZcR/7uJTJB1MRbt41Fdb8QbZhC76tShSKg5Zeo9cba2cGO9dQzyXwlrWxe6hgbJFEbOhJqQKZA04E1P8AAYdckMi8clKXFv2pDqiDEHVQnPqAodIH8aY0qxS6wCgqgZpEZmk/9rkqV4LUGuYA9MJjXtLQ2reVhSIxuIDEQO2OkmvOozyxlvU00siax7uXidNQTW2qqydLKR+Nc64p7S7uGjcNwE0bO8YYltEEgfOoFDVeBpX/AM8CqDZBdyuDJqOtlag0kniTXmK1yzxfVFVrEE3Sul6zSL010kcRThSv9tMXVRTaxXG5SCd2UHTRdLEn6W4qKUyri9FFmRuZFVyiRyCTSrOxoKUA4fGtcsTIEJ8svRbwfaxs4eeoApQBRk4J55jF+CsuTNybwoK4rkR1ENkK8ABjWc4MCnSxYmpyFTWpPD+RwDBKoYmrUBPUprwH/DCGXR7Q2S3NxvwZlb/K1EmZAVjQmgzrnjHy3ojZxupELqRf9TuH0sOxOwapq2bjMA58P5YtWxU9yX7PELfcCJG1AjWaUrmK1GXChxWyddxX2njvGjZ1kjSRhGuugoc8604/LC6DE00T2UgurNuwT0zCmoa8uS0qGw5AunxL3WlS0TZfLIE33aG6GtJQfuIK8WgkOZ+AOK7U9CasWBDsW27rBPeeD+TJfWbFlm8Zvj25wufT1gVFfTFfvJyQ+4s5ttkKbpsl1tc//s5wHEFTwqCrUDeowoHIjut2kgthZ2k8s0joH0tqWIlaEopYJk+QNRXLLCghI1Tb9cKseqzgqJFdo2nACScF+pSQFHxxJJiepGLvdL29RrWR2muHVu/2EqjLyBY8cueJQIj91tMqJcm6i7AYrqaSUF4ojmq6eeXMYmhCFpbK2ilDTpOkbsJImADaWJBlZ+ZJpwwQCIru9w7sNACOzLLHERRu2BpUk8K1Iof44tqMU7JJ2ZTHOmtpFDTlH0tFnk6Kg4+p54minIiX3M5aIAov21uR0IWrmdQcMQPSppiySqtSY7c6iFpXIhZ4kKoQFJSlNIpUsajiMJEY1GlKNeSxOUhSBmLTKNUpXixDV0mlaevI4j3FvbKJBse3PuElukSv907CKJVXpMbjOi5kUoScqYL37VI6YnZmt/Gdpg2fbLKzjJihZKySMhKvcmh6T6U5UyxxM2V3Z3+NjVFBYcbRG2Y3GsW31SRqoLNKemj9wgrkchTGdGl7nQzSd4yJ92FiEckrnQGbOkZ1gtkDkfX0xIjZ9BsknECq0zv9xLGe0Zl6HzGQOYIHxAxYiLGa8aKDQrxojTxuZaURWBoNMYYgDTyoRhpEfaRi/nmijVbaLXFYhWVG165WJoqktSmk1oOfri5MgyG7tE5skUwRSXEhZI3DVDMQT21/wkDMmvwOLJINkTvNIS2XtrOZFkgt5wpJzoQxaoHMjIVqK4sqiqyIdcFpKUjgy/TSQBiFoCEKclB5epxZBWxkVYAkeuSRFtJVpTJ9bcQTnUE8Byw4K2hudG/zsE85iMK1dFJQoeIJRfynnTnniaRFsRTaSslxJOkjGsaSwk6mFAA1TShpXjiRXuNLXEMQaJJR3KjSxBJcHkKZ1JwAzjl3kDyH7aO3kK6WTWNLDPoXj864ZAm3h209x5buJJDJG6pbyCRV1JTqOn6qimNmCkGHkXnQtYJHk0UolBGo2xNKoRm3EZ5kCmNbZj1OvMUeNFulkSiiZ9PUAMtB6akGlBTDHBy5jYKEnkBuVXU8Ir+mjH6wFFTQA0OExBp0S3DK8QdVoy0OnUuZLHloBzA4/wAcKRhciKImeOtykDq7LSiKSK0FCTQZE1zrlgkJBh1jcBJ5bdZY9UciqBJIa6hSopx4c8MAlJERD91bdQUrMgzK6qsuddRoc6HADPMLgIgjKFZwYlnRS1WZRRiBRloKA54QHFWG4qzqI40j7bqDqaRs+qtAa0HrhgAR5GprhSK4uANSmgCouQVFYZVAzrx5YAkEEAYJQo5LKNR6WB4uCSBmfpzwhI9EzJG41/cQxlmWOlHQiqkgE1yHIf8ADBIwCKjxxGGlxB9ctuGNNYUgScCUofw9MMRXcAR1uBI7JIxVVkLHX3KE6nYZEAcK/wAMVIsPJpYRlpXSSddDyqdSpGTRpCorm3qfwwwPR1EUkc7qwgfU56gQBXSQABWv88MSD5aGN2UGJJKiRpwQkbKQyhAMzqzFSPQ8MRJotHwDza68cvBaX6mPZ7nS91DQukAJWhQ1JqeY/vpjn87iLKtNzp+P5zw2SextbZ90tNwWxliuNQo00dyrmvapVdBCih4U5HHlcuJ0cM9phyK9ZRNbIEPcyyObeOjMtrESCyS1o+jgCpGZxm1Ro0jQVmO4kVxKveaZe20L5RmMgEKSeB/DBLItCW5sZyk9rbOUhtWGhCREDIBwBrRdHI5/zwIBmuLMxQyx9yKYQHvd8pRXlcUZSV+ojiP+GJpkGiP3FrGkjrKI7lQBcNe1IFG4NJCqliqfD58MsWq5B1ZE5bFpo4Y2m0PHK/3cQydV18Iwp45VIOLqsqvVoiE+3TTxpctKtqt85kInjBWTRQRtmNQPwri6SpojF7t57U0cjFrhpdaRliaKAOoq4OVBkBhqxW6EcvrRlVx3I5xa0eKiFe6a9bnTn0AchwyxYrEGhhuYRWeVJmZJdK2qIxD1NSTKMqUBoCcSkjB1LVDM6PAD3o1jcP8AXFXOp5EDiSKnCEKLRooddzd3MZS3LxtHaiskxH092hrQ8vTnhOsgrQOtpvsuu07zLaTlW0pGzAxgilV1ji3M8eBxX8ssrcNl3+4a8uLlZ2a6FRBbIf1FXSCxqAKHSM1+eK3RE1diyXySVJlhMTwM8TJJcBiVkAAZRoqSDXniq1SytwC7/wBdIX0x3QR5bNAXWNR9VNSgUryHPFdqk1c5Huksd13W7LL2ibW6bo6GQ0QqvEegxDt0JKzmT6f/ALLvfKZzD7fb3II7BgDsqyu5lhmcgGIliaq1QV9OGLeFyLcfJDfws5/lOEs2PvX8yPqAhEgDEUYDMfjj1UK69h4/b3mevOfZKGW6vfKfbz7fY/Ir2OX/AF3ZyoXbd6DVIFxGMo5QWakqCudGqMcbl8F11p9x0eNy9UrlaftzsbqwufP/ABfedufbr7ad3S4O2zAhkDoFDAL06Dp6SMc3i62dWb+bddqsmSv3V8MmMdvvtvFEBtolHYK6nCyKxGkAMCFI5CoxXm43a1boT4vJ7q9vU+UmySpY7pYbNexz3UVvey7ndWRjAZ3qZKqXzNBRaHjwzxvw/wAqIZa6+0s/2h8Ku/IfB/NJb5YZJN6nKbOq6kLCVO9dSydJBIr0jgCDyxqhLUxNtuC3Par2e8q39dr3q7lRrLaWNnb3E8IjMzRVV4C1QXjFNRZ16q/wy8iWi3FdJ+0lfnT7F49cy2Wzwm/vJmMd5fXEixQW8gFGeFY+OWRBBzzrjj3SmEdHHazUszbu+22N0k0l/vQmmhQAQOwCqK9LnSxzIGkUPPhgVZL1Yr+/O12sAigt7GNY3LGRY1c91stIXN6jTXM8Di/FSGQv7CI7juM0cbylLuK2VdJPbHZcn0Sgr/HGntKu4gm5b3aBneysb+/ZlAdWVUQAZAAgDIc8TVX1E2RDcX3K6Rpf9HsNqsoqGaWclshnkSePoKVxbVFbZVO/bjuW4K+2bUrLbqaXV6kZiWSn5jyC/D+OL6qNytsg0Wy29rNW4kjv7x2DdhWqooKdbAUoOVMWdxXAnv5xAxhV4wWyaQFqsaU0rSpP/HEkIa7Xab7cQCYvtNnhZi0xZkjYj1LZE/HhixQiDcjJve52O1iay2h1RFAWe7QDqbhkeGdKYnVS5ZFuEVnHDNczswdgApJeQccjmF486cMaZhFMSFOtJftYCHRG/VlTjXkcyK4J6i9iF9zKLKydtY7sv9NQApyFBUAjKhxGq7mWWfZUhJcM56yV9SByrwHPGpGJnRVFOk0PVnx4DDAn3ge+fZ3f+l3Ep7F0waHVQqJFFPw1D0xm5GOVJr4uXtcM094/eKrRUKBWZSwfT1UzpnQmtM8cy6OxSxduzzKVWWKTS1SpZQMwACQPQfPGW6NdWTy1upEhdwD0ishFanpAzX+/FUE+4Uf91iCYQySRop0mdGNAQOS5gHD7JIPIWn4/eQ3EcbyXTQpGoYaiFVq8cqnjw44i8bBXJH/3B4rYTK93vFvGyKuuEMWBUkkg5muQ41xOvHtYvqnbZD3F514JvtjdbfHvVvFNOCIy66U5nqJOmhp6Y0V4bC2O9ehBtv8AbHdb/cA1okF1bFxPcXcTIygE1QVXgCvGmLXhslsZr9pNPLN19rPF9pbbN93e1vtzto1Y2cALUkUElXPrXjnia4rfQgqWe2xiLyh/C9y3GW42qUQRNQhJFpXPq4kKBi1ca1SjIvUrq+tVDkq8UgUKyaKEZGgIOZ5c/XB8tlLEkW5fbFizHS5PajNFIJHS2XwFcQeKQWSB/wBs3xDJFHpVgxOskgk1X8vxyxRbFBdXJI6vcO0ihSvbkOruEaiF41JHr/PEO0n3SM+5SupBIJLqBqYimRzoTwyyxKomQTc7hTriErBnk0Gpyo2YAz4jhi6pTYgt2I2aWItkS2Vaahzzp8v7sWorYwXcqpG8k0mkJ190khaDnnnnXEkp0INwilN1v/8AUb2WddQiBpBFx0qP/FcdCle1QcrLfvtIhGl6jURzBPpnkMTKwSgduT9MAggl8+kUrl8ThDFsSM6lgVWg+k/A8MuHxwmySNBezEbx2flk66SzWanUKKedQKmuXyzxh5T2NnH6lXrEZdznLD+oGkDMRxNa0pn8MsX9CrqTDbZ6T2d04KOXEMuoj6ahaU+R4nFbGh+3yAQ3sE4JrKEYO1B1Cg/u54SJMMdYShH5Lle1JT8pIofkT64QEfmsnWSWKT+pCKLJkGLLyYcQSMOQB2m47lt0qXVjcMQpClQzBxTkSp9RhQOSwds93/JbSJrO43B3glABW5BnojKKqxfWQKYi6IfcCvPPLieVoJtm2m/+8KiN42Mialzi1IKMCB65ZYfboRmRkbzrcp07UVjapcsx+5eRNJotKMwYjpPAZYUDaI3P5Put4jVmEMdqxKWSwgN3GGdDlUDmCPliQKpGr27mupZI7ktdTS6Ck+sk1Iz01OlgBzxJInHUb1n1tLC6nt62pcOShcJ0hAOfqRxw4AZnu/uLwXCwkKrAFFqwiWMUX6uHx5YsSINkt2VDIyzRFZS0ixrdM6qTqrRSvEjma4klJmtYke5RPHHHbiLudmRzrHR3YwgIbSaknqIywMdXIvsN+jtbdkhtzNJPF2bGUZoABVoqegz6sRdhuuoCAICkUlxHBbyDUJYwSEeQ6u3nmOZ9MVqxd26aGkPbrZLqCOLd5dX3U8Gu1hkTRo7dAJVoV4g50xh5OXodLiYo3L42smL7dncxOhM7yOSSruASrA50bka4wNnQVSSRqskkUXb7yS6ZLiJZGZ+6301LGmdMx6YIGFOouO6zxrJIzmRXJ/TkShB+kZEClSRXDRGw2XLzvZlBWOOKEEBgSXFc+oZgUPTqHzxYhEZupYjbzzoGnl1JNdJWrpHmFVWNVJpn8OeYxKpBkV3d1a07yky6JVkVZXqulhRTCVyNDUBiOOLkpK2R3cXjS4drN5BEsgKIWOlVYAlVyyJzBGJlbIXdkRxyTIkscT6XiTWKIdRoFA414A8+GLKvQrsyOXJuLoWsduQstsBVJDXWTQEUpwQca8MWlb0Ga6o8oefQ0MKEuYwT1DNlPP6qZ8MMgxnmZgwe5ZO7cnRIfrdUZaihByzFOr0xJIqYgdIaiOJXBkdRPEKhYxzK14g/PDBiOYRidllaR5IV0RFQFVq9IPCvTXIg4aIMDHaSK4thFquGftQxyNq0CualuI1A144lRSyGRwi9vHtsuLGG2jEVAgMKTKQtHJrSp5f8MdOlYRyruXI7tTvltHckRtDvHmjnhSnof+XnicCkNd1RbdO0I4p2JV21ZlDkBX6TxPxpiQmwotSSVA/3qyyFf1f6gqOtamlCwNMhSmIgdeJVWNkiDtAxi+2SjGQkVCBmHAGmYywgPOHjnW2TMRnVNLFp1an4qK5al45+uBIR4FvuA8imCdmqJq1WgoVoxyyAz+NcMA2OBZHP28TdiKtJXzJJzYMCSRXMjLCCRGEjkj1W3etpEcEohIRUY5kV5HnXliQB0cSkwTJqaK1YySOWVTUZKKE/OmEDCUWRpJI9WmdR344Wo0gkbKgJOdPTABx20rJKkrASFTNBMuoO1OHwSvphAFy6YpEeQo07UlAYiqAZdtaf4uQwDB9tdfb71HmT6gDp059JOfUeBGAJK9MjCrM/2/cQfdTlToDcgtM6twqMVpEjqmJUjuP1IWArc2iKSjaSU1a+fxy44YI6LVq91iLtOz3JJGYaSjHmBnqArQYYjsChu7GH7cUrRijN+SlA61OTYQ5OqiC5McpPdLAujViLRhqKop9RORqc6ccRZJMvL2q9w59ku4tp3KWSDb5pALad2p286iJs6EE5D8PXHI8hwldSju+L5/y32t6GztrvopIvuDdghWBVAw7n6h6A7afU/LHmr0dXB6+l01oSm2czKtq9wJZYQXuyrdwMlfrK0qGIIFPTFBbsLHtbZna1dXftFmZFWplXTUFa8CB6fxwSQ9o1SWveikkjjMXciUVRi/QDUVIORpxoMCAYriyeSBHjiilkedWTIAvFWgOVaAmtRiyrIMZp4R91DcQIs7QyMsVrp0urDq4kgnS1STXhli+rIXInebcimaK1mltLSCU6JfqzfmyEZquYGLEypojG6WKRxwTtNJPW4kEVy1F7mmmVQBpWlQQT04mmQ7SLXthpWGEXgdZaxtEGDBUKkoiVqwbPMVzxNMptqyNXlhpj+1MMNWU9x5AY6MooFQ6q1HFsWJkHXqNU1qqpJL3TNBantCStWUH6tbGlK5UpiSZBobjbAxxySITqKq4BZdKVougjMtnmcBHYRPH2J0WZjPEoViEOUGjkTmanLCZNBDysZNKxF5zIZY1owq9BWoqTQj40BxU0MKVgryJDquSJVmjlBIVXkycBvzAUpTFbRNMVreODLbWz1moXmOpkaMpmdAIII+HMYg9CcyOVvcvcxaZnSLuBZpAqdysYyA1rWlTliu0k6suP2w8gn2TyHatw2pZYX2+VLtCshaZWWjNQNpqtAa4zZa9yk1Y1Kj1Pv17Y+aWfmfimyb7bXcVwb+2DyvGeksDpenpRhj0HjOV3UVXujx3kuJ8rK42LL6aBuNfhXLHXaTRyiMX2w277tbb1BHHFfLS3vJQNLS2xqQjEfVoP014Z45Gfi9uRXX2mumd9jq/sAbxs8G6WT20w7iTpWINlRwcjq5YXJw91YDj5nS0mJvPfYeCLyZd92XbpBNe27wbxtrue0xA6HhOQVjQVPpjl07qaHY+ZXKu4q3adutPELfbPFbq5kW522Oc78iIWhMgapjZqgKSzMAB8ueNTzwir5TdmXr7g+4I8b8X2wq6WE++aYjFAo7qREZkpVSMhmeJPpnjn58zenQsw8ZLUxR5D5Yy3l1aS3huLtVe5/T0M0UMhAJkLVoxORzNP4YoTT3NyUIqy/wDMLLaphOlj9z9s0ksZuXEcoZMw0q1GpVbPMCuLqwJojFx55ETI+5XVnb3xcy7iYhFLIDLkhiKFgARyOYxbRa6ELLQhe5+dbBFLFcTXNzvDxvpjt0bua+dMyF4chi9VZSyOX/m28XqSybJ41oMa1E10pZApJooXpRcSVV1ItkTn2nzDfp9G43ZrcIS9rbASRIzcW/T6VIPM8MXKFsVthze3m4lrW1vLmZ3c0Wys1Ls5pwdhXjlxxNJvYg7IeJPZHy6e0a4NpH4/tkuruXVww1sgpmDSo4VoP44sVY3IO5Wu+7F4N4lKTc7mm/XsNR2oFYRFhxqakn+PLEqtsTRTW/eVXO7J9uFFjZGotrONSwoD6Dkan6sW1qRkrd7WfcZTGraow9TpJP08WNBi1OCLUjbuEtpt6PZ21Z5shNMDkv8A6fWp4nFlVJW9BPt1tEoNy6FQR3FUtWmY/jWlc8F7ToOlY1GDc7v764d9bFYzSPMcvwHHPF2OvaijLbuY3q7OWzzYUavL5YsKkpDmUBQpSjGnM5gcTxr+OEmWWWgnWQpIsynS0bBkZcipX05YkVpwae8B8kTeLSBmoLqHpu4zTI0+sH0Ygmn88czkYu1nX42bvRozx6+Ltbh5CVSoQN8ahT8cgaY52RHSx2LJE8j2shjcku2jM6SxFBzpigsbIduXi1/5B+nt9/JtxYk98fP6jXI1rXGjFZJ6ldlKK53PYfeDxq4ay/1BNzs1QvbzwvpbRQk1HDIChx2sOGlyqvenoMk2/wDke3lBv+zX0TugenbdqqfSlQRljW8Kp0NKeX0YO38521jERdGFo0IFtMGjYtnkBJQZUHyxFtLoOcicOUWP477t+Q7bYX22W25tbRXI1SFJiBoUEoAAxqT88Q0kucvdalS7t5RHJefeXt5GJLgs/wCsxPCmompbnUYso0jPltZ7si975ttMh/y1yJZVBMoQNIKk5gUNKCnHFncmYHMkevvLmEkrWa3AoP09IbUxPxPCmI/K7uhBppDJLuvk1y8cVpCxlcBhM7MCF5EgcOOWE8CSM17MtnxPbtysYzPfXfflmCl1AoqgGoFeP8sc3kJLYuxSWpEsTspkWUjtlXcAUJ41U1/8sYWakNe4yFQ5qXgZCKgcKZKeoZ8RlXAhtld7o7Mjt29KtRpdQA0njl6/hTF1SlkSuJAQAyGTMBCMgNIIIH9mJog2VL5dvOstt0DdLUaYEUABAKqtDljbgxxqzDycvREAp/iORoVHw9SM8aDECCnSTxUAHXzz5DlXDGGREFipGgOpAJzNKceWEx1HK3RGQJ26igqxJ6gtaFaU9eOIMmkaG9nlL7b5EgLxxtbAFgNQFK0FacwcYeT0NWHYrRbdotxmeMKwViqUOdQSPTIZVzxenoVvceolkFtHG5AkeYlGpwBGQqAOHDCAm94st9tysvGIK8S0BADjqWoHOmIEgJTtxW06Qt2ZV0XC1BCsgzBFKVz/ABwSARuW3swhukNYzQMwpUKvAtyDU4k4Bkde06jcRBhBMKqaA6GAyPzywCCe3HdoWmhIkAAnIAGsVyK88gPXAA2yW9vEEljnUa302siLRjXikhFcz/5YlMgtAqQ3ok+8lnjiOcTrIvdooAotCDqU8aHCSJyBa4S40LLmYlFYJCRIqg504Zeg/DBJJjTeXFxK81yhDSaCwQL9MZoBQDgTz0/PE0LUZ2mkMbdsGiAN2wSxQHkAfnmeeJoTE3amrpRBocdwkNULp419flicFGslteIWwvEluljSOKWNFmCgdpiPyAg5EkVNBXDpUqyDz5BYPauph0kz6y1HZV1qAX0GgpllgugxMidpbSzrGruELL/8TI3cEOamoYV6SOXrjPKNJa3hnjUu9bla0t0O22Cut4ahnZEclVNWo1PQGvxxmy2g1YMcs1PtEemKzTti3hgiaN7RQzALmAVoOHPjjm2tLOvSqSJvZ9y1XuBjaW7TaPt0642b6QAx9DmTzBJAGEhjhOjxURndZmYm2bWApK0qw41jyIFQeWJIVhPdO+iAyJPdiR2WNJFGvTxIKoABXiP4YaISNTCZ0DrIWMmpXE/BMzoU0GVeeJCbI1e3INWERkSINGtvExJ6ydbM9QQAxoCQcSSIsiV8ZayRNJp+2UrNOrlgofSUj1BTTgMWJlbIzuKsjW7CRBcTUE9vKG0ErUKVKVzIqOGLStuSHXzSieOaGr6AdbSMKAE0yYlWCg5E4sqiDaGG8rILzQ/VEFWUBasXLgEVP1V5euLCtiFw0NwXaqwqq61d1IaqgBWBJ66cvTE6kGNki2n66RkXEbwK8ULKykFT1BvXOhoa/DEisZLgnro0iSO4BcADNwB1rkMsuGCBNiJ4JGbsqGkg0aVncgUCn6lr8ieOGpIMmfie2C/3Vp5Awgs8o5dYKyMfXlkM8aMFNZMfJydC14O0tuVYaizATyqWVH1E6VPxqa/LG8xNi5GaSBrZGSYSltafV21r9K81JOYwEWcmDXSIGNZDT9YqEaLRkGNPiMzx9MDEDUSzNJK7KZkDKZUoUJ4iRgK0Fc/XCJITxBEEYlkleKOj2yEUbXWjCPhw5iuWJAwUfcJR1h7k8QYBC5VixNa1Na6a4QHKElYy8jGBqJFIKUb6tVWNdNThDYLT3JnmtnCqVUXqsCuedAtPXiCMAoEwYtal+7KpqWUn8yjIrkOVcSAFMATcqziZTokUrRSzA5HLLL0pnzwgk5L2jJcPKFuIQAqKilm08wKHJq8TwHIYAC3Z1lco9AYwMyDFrYZUJrUgGmeENHGik0r21jneOPu3PBVIXMH1LAZ5csMYPVBWeUSFwxXRMSVYOcgCKcSOfphMRXPbEYKgt24Bra3Ygt15Zk0BI41xWiTBOYZIo5JYjcSFmleRaqe0OKtnTVkf7cMAbKYBVlVp2Hc7hOpe36aBxPIYYjzGN1VTD25Q5kSSTq6TwBOVPhhPQR5mKJbuzPch10ASkanAzWhHp6YRKQ5wg7BDukINZBmdRY56cyU0kAZ4LIsTg1B7T+42rteP7/dCRtAFlfSsDFIqtTth8q5AaSccHyPA/tVPSeK8jHwWZrCxuIrpjcpCqhERtMLlS6tkpdzUccmpjz9qRuemrfQkiXjnXHJpWS5KxoxVQQENAGYZ6Cp41zxU9CcAJIUVJA0b91HE1oCmpWkzBeo08TStBkMRQxturY3X3BPbMsR7atGdGlg1RpANCD8+OJyQYw3EBRZO7G3egXtRyaQ5j00rKGWlCBUHE1YjZDJe2dsr2bTRBYrgiOWS41Mix6U4o2ZDgjT/AH4mrFbRG7rbYQo+7kp968rGFNThUWugK/5Qa1P44uTIEYudvLW8ktzZNGJdLXLQMEIemk6xQsXZaUJ4DnixMrtUjF3boxOuXv2lwRG8HaGuOPMqTooaA0zp88Tqyt1GOe3OmQXQEk9sWCtARKCAKFWRcicwQW4fHE0ypojc1tbxmGKaeSJVAksrjh2qc2zoxHOmJEYGu5jGoTRj/MzNqgYDQyso0h2BBrXKmBsBC8E0dqXkjeOZJO5qBGlzmHkNcycqCmWIwAQ8I7hjli7iSa5EOnpcoKKy6aAaflmcV2JCcGSSRwZtUx7cidz61VRQ1I4j4fxxXZDTFtlK0k6CJG63HZCfSvbFWZRwIJ5csVstqyc+M3t7a39vfwrGkiXCmGYioahqUbTUEmuKbIurbU+sP7UfcuFmvNmYuv38zTCBVrHCWjQuFPoG9MUYcrwZE1sZ/I8ZZsc9UfRW0ukuoo5IzqVsxTjw/DHscGdXrKPG5Mbq4YoY1qCQCc8+YwZIe5XsJLqYRwO7jpRDIwp/hGYxTnulSX0J46/FC6kAl8k2i4ia8W4QQTNpL0BEbDKtCcscj+qpZz1OkuLkpp0M3+d+HbRPv+3+WWe62sUcN0b/AHW2kK6biTJWMingQoB6fTGDJaq0TOjSraiCgvcjxrffLZ7rc7TcIUtzGYorecoqRRMupApZdVGI4g1zxTBanGhkffvBNztLlLS6k+1nkJuLpAsck0r1Cgq3ExqBUjLP4jElVtFytoMg8FF7G0F9FPc7naylrm6m0hJ4OlRGGBJYn+2hxbXHBU2wEHhe1K0tmuxiWaBdctmdSQrGW0rIrsBrOWdPX8caKoptYPi8O22ExdgW1nBqBMSRAg1plrYjlXFyqVOwv/0Lx+1Yy3zm9lWg09CW6gV6a558uGJKCLTPT+R+N7V2DKLHb7QMapGNUppkKHkMsWJyyDRF9w/cX4b4zazReLePf6lueph90qEBSBkS5NRmRw48saVYoeOXqZc8+98fNfL5JP8AU90FjZGgi2+yOkchpNK8fjnhpSS22KRku5rlnbQ002oFriXqk0k1rRq/xrh6ANF28FoXklZnnIBeA0JpT4UpialkXCIrd7kSmm3rFA9anLUwpTqB5/3euLq1INiKC1afUWjY6/pVciQDU8RlT44k7QRVZE283zopsoQynIntkUHKg+BJ/wCGJY66yLLeFBFJCysoXMA5imVTz/HGhGRh0UYOkkaSKAHmwbLPTU1pgbJUWouv0XuFVJipSuup4Z04HgcV1L7jUxUuaDKoAYgsD8cXGZj343v1x47ukN5E2qL6LmECodGoGHxPpiGSiuoJ4sjo5Nl+Lb5b7nBa3NlPqjlUMANVV41BINfmDji5sbq4Z3sWRWUounbtyE4UtIpcqBCj0rnmx48a4yNGpOSxtraBjVj2WRc24ihHofXLEJGE7xMmhZGRnaJ6xtwZRwbUSTkfQY6HE5Lq4ZKtu1inaN22+cix3a1jm1MFq7fkrkoYH81aH449TgyVul1Ohjvpo4ZeUHtD7EeawRS/6bb7dcv245vuJS1JAmuV6UHSCMqY2LhYr6x+JC3M5ON6/F9hAfJf2m+1txfxrt01otgIEl6JWUatLMVNDmekfjiL8dVv0RKvkXfW1JZWb/tR8Ft5Lu9a4sPt3hM9jN3GkVyoBCkGp1EEZfxxZXxlI9o7cvHHw41JFPL/AGW8H2LbYZbNoWugTSGNM+ggvpIH0kHpri7J4+lVp6Gd8p3/ALMfYUNue1bbYQusdqjXMTlk1AMCjHmKkZUp/fjHlVcZhzazJHLaAi4ke4CswZBHHQsEVswGyGYHLHI5HJ9DBZInu3RhAdCmoYdTA6cwcgT6Y5N7yydVA6C8TW7fpq8hCuFNKAEDmfhlihlkjBucyLbySemfTU6jX6aZ5imJJEWyA30itJnLm1SgNaE/CvypwxciDK/8j3cbfA6w1+54JG1f/eTwHpTF2KssoyWhaFJyszyyO5d2kYli/Fq51x0Ecu24QxoasCNX1EkkmnPlgIgiDRkNdNehOda88ABiqdQDHL84rnkfh/AUwhoeLNlCOrMYyRVVIzIy6QVJzxCzLqmhfZ5UaffLERMBc2Y0E8S1TwGXPGLkdDTi0Ihf2Jj3S9tylHkZ6KK1IDU0kn+zFiehBoFHGRaTRqja4z9ZqCufA8M6euARKNouEKJaNE6x5q0zkBayZgjOlDX+WExod7Wm3m52W/h7tjfU7F5X6JQaCTLhhDEjxNtUumR+6HoGAFVdCaCqkUPpgGJptuhkC3NhcMY5wzdthTSy1JHPpHCuCRDFKyxSj7iF0f8A9m6kCprUDSMv54AEM8lsklvcVaEyKqzWZTWqVzUr6EmprhoSE1zA0kcDKnZSRT+pH1UTjqYGnE8CRhaSNtoTXdsglkeWWN16TK7kund09JVlo1PgOeGSkQS2iFkkRXeCRzGEjY901rU+tDyHEYdWDYllskhhAQd6GOPVuBUhQQW6QxB1Bl4Yl3aib0CDt6SN3pwttbslWnYEqBUUVlUCpb1HLDllb1LK8Xe1tYY4TPoEEocwlV0MwX60ppqxBFMX0uZ747Eg3a5gmS4RWiuLe6lV4e8asyEASMi6gRpJJOHeyHjo0RpLGswhRxNJOB/pvbUVoCSSiU6gMsuOMWSxrxqWan8P2aPZNvtoUeMSKI5NwjYAI7SZnUSKhajMU/HHPyXOtgpoWxagRlI4QZLa2dYltCwRWZ3J0vTgoGamufriho0oebQRLI0URkWOObSzt9KGQEaipqMgTU/wwdo2wc7WgDRya5Ldarb3bkyaVVaFS2RKk550w+0rYRdyxO3TLNNSaNZYpJKHQ1D+lHTgDwNcSQhkv1/zUaicrczamdgtCEFQtSjUHOtPjiSchsRO53FnuTcI4Z40VJnCFSAKhKOrcWSg/txYkRbIrcs0ZSYp9o2pokWNgC4YnQAST1Gp44lVSQlEfuizwNaBUePSX+2UlWXT1AMxOok8sWors0Ra5YTwvcCWWUtAyTxlhXIgr0AcjXOvzxbVFLY0tHElxG8cqqxUC4jDVKvIDQmtQRwxY0RGieTtmRhK12JGVLySi0Y8Qcqg/IYaINjfcOYnIdEbVMrI8h0qDSirQ1JPLhhogxmlDpK0smpftW/WnYBV+C6c6GmRryw4KwgW8dewtZHVlltEVa0ZsgBnRwTxp+OJKrIXski6fHdrgsdutYVQFpX713IwOhZONaD0+GOjip2o5uS3cyVamdJ/05JC8ZogIQg0A7gByqxGRPzxaUnhIFeAr+pDqIlf6T3AM5Msz6E+vph7Cg88amYLJKpjarTmdStCuYPTxB5ADPCYwYBmMUyqsQuFCvpoKrWi5ADh8cCGA7nX9vFCrtbltdSKkH0YZKCeOCQCpY5dbNK6FzGFajZ/AKwpwOEEAplaRwkg1tFpYzMOKilaV9PnggRxkhEitcx96O4zQCqsukZNpAIJwwOwhZBCw1yaQwSjKqrJXpoBwrzOAJClVzb2ss8DQszETQNmrNXpIOfT8sJDBJJcJri+1UCJS0JDK2hWNekniRU4fQQAyRkNGlFhULI5bpLaeKsORBNTQ/DAMEUk6F7SUhRZ1l0ko3KpJOQAH4nAARHKpZpAsg+5drdEdRRVap0kmtM+eEDZXuqmpAGcTCoLkpobgS7E1oeAzxUiTOhTEhmNv3Z43EVrI9NSvSraVNAxGZqeWJiAi2EbRsHMERc1nYHN66hULlpryrhoGDcOXkudWuOUqshcEM2nMEKudDywQEBstA0gjhYG1ZCYWYtMtRThzB41xEcAJdLk6FpKEZ7d9VCCcyAfzNUmgOBoacCy0Zx2FtozGI0VhQCOQSV+oHI5HOnzwrVlak6XdXK0ZsH2n9x/9WKbRudwY99toGBuISEM8QVdDw9QXVUVOR+OPN8/h9r7lseq8Z5BXXbZ6ml7JzHbd2RhqKq0M5fuMunJlNRVmJpnT4cKY4dlqegrYd4ZmmMQjRUngXXAXBEZIbPqPBmBIpTLEGoLARh7sjuEigniRTqIzU+hJoCzDLAmLYZ5oHhLiOMPG7ALBKVWj0BCPIOXLEqiZH7iG4SaWN1Msssas92zhgUUnRUmtClTx/uxNaEGpGOe2tja3FpBGQ0xM8lqlSSQaKxcg5/CufDFiehW6kcv7csZhcqbqzYlJUShkgZQCrOdVWUZnVyGWJJkII7exCLXojaR0iItZI5CaQS1GZOZyGfzxYiFkRue0iMaRQIIvtzqhkUjticHJA1CzArwzNBxxYmUtEburNnsBCsK0YMxMxUqrA5xoW4ahkT6054ski0hrnhYujyI1s11GB2n4LQUXUCCBnQZHBJBobHt3SrXUbBY5BG5jIpGCCNOgEiurjU0wpATx2yu847skyLErGIf4eIZMqaRSpBzxCxIQy279pXSVlSMhZXiUETlzQnInIGpJHLPEI0FIDtTvCbaMFuLGSImNKkDV0kDSBzxEsqPm2ECRW0x2LCITRROWMAdCCpUAEfEimeK7Imn6GovZXym/wBm3zZbazupYp3vF12YPUVcBXkqcjqApTLhjBya6GvFZPRn2u8W362exhXWKJpQuCSCW6hxPxx0/G8xY6pWZ5XyXEsrtodN/wB2ksXhnEmiHJTXmxPxy54t8jyXitVzoZuJgWVNdTib1BcxGFJFErIVEZNaVBBy4HEHza5KQ30J/wBLalpjQx35ba30G5bpZCdrKOORRG6F1WR6k0dOSsD/AMMecu+20HpcUWqmivPJYr0NbQ3sYivZoiJLcyP2wjIMwwrUkDEpS6h29xTm47zv+xLBcR3sm63plEVnZdTmFSpA7yuOoEZAnLGit9Sm2NSVVuXlUl/Isl9Zxw3EIn1OST3dRBaNj/yZ/wDp5Y01yidCBbn5ZYW8kdm959vEUEbzROaIxYkJUEkqK9VM/TGilpKLKCI717gWVrdSKv8AqN7pZo7JrWUCKUqAH1AgnSAAAK40U2K7ED3H3b3R9VtBbz7enF7aNu7MBx6iRpUfPFlaIqbIZeeWeTXR70MWiOlYLiRmlcMRU6anSD60xaqog7EL3G73K7P+Z3SW6nUfqRA5agagMAQOfAZ4moRBjDc2kgkIkuFZnjULCDpVAT1NllU54lJFjBcJt9nUNJ9xcVoYEJ0KRykOQrlTLE1JEjd5dX993ViiEKIaMsCFaJQnSSedcTUEWR+4gLNGpJn0j6FNFXP/ABUFc8WJkWgqDbVmYvIXhCMC4IKpVRWtDWvpxw3cFUbdyvobPVb2rEMady5UigFOGeRzPPE6U7nLFa8bEIkNX7kmuTU56qkafTlx541ox2chbJ1MQDoGQLHTT8KnhhkBzsos+8WZGYjmCTQVPE5Z4hZl9KwpPXcslCHYu7nWGFTmBSvwrgqhXY1qgUESFtBIAIFBX41xYVACKJQs3INzGRzHHDIk+8D8uk8bvxb3UjHbbiQCQHMRtSmoUrmeBpjPyMPevaauNndHD2Np+MbrZ3iW9zHIstuya4tJ+qopWtDkTThji5Kwdyl5LdsJmAUh2FcmaQ9VM65gnLPL0xnaLkON9NFcQ9sysahlEWZzXOhIJ44ddBMgV3fT7bIrwDurqyj45VIJ5045Y6nF5dqDpn7NyS7H7gpY0C9ZIOlaqrqwBGvSRzDUyx6DB5Gpvx8hW6k9g92oJYIkLyFljSJIKgjobXWozNfTG1c+oPFOsiO591LKOz+3ZSI4u49ko6ius1H05c+eLV5GqRF4uslNeX+f/fvExIhMK6REv1MRkAAORoDnjNyPKroUXaotymbyeW9mLrGZQ6gvK1dRBypSg9ammOJn5trnOyZZ2FVjAv8AVkoxIBD5jTQVyoMqAc8YLWkqQ/RzAwNGPQMxAr60qc/4VxUSChIwRgKtrSgJU6XzNABwzrhDkje53LaaEkOSyRjkDlXI1rxxNIg2QbdNzjiScmplk1DtngWArUj+zFtUQbKj3oO7CUyMGUV0gUoa0ArQHjjRQpuiDEUc1Y15rkefDPGxHNtue1VYFFHDqBpnnXP4UwCPEuRpIFFJOfEEcaHlgEDQnp+ruepNQfQcvxwDHmyLiXLQFfSdJGVRTj6ZYqsXV3L29otwW38vt4T29F0TbsCAT1MCM/Q0zxly6o0U3HrzrbX2rye61UQh+lSCQAWNRXOtAc8Kr0Cy1I4bQW12YAyst2oJRhWgatCa4cigIiTszT2qVR4wGKtUEsvCnpXDFBLLLcE3C2WEAT3ECjXC9asKVAU8yfTEXoS3D3KSW7yiQ3kBA79pIaTRHjUc/XCAbhGul3tbkMjGkkBpXLlTnxrgGFvZi4UB6RkAlYpASrEc1OCRQJI9l3Aq9xFCpWQD7gSP/UUnrRMv4YbIIHb+P7pallgjDJItFuI3JQI9R1MfyrxOIkhO/jV5AJLZbeNSgVe5PJ0NTiVocjmeWJpAmhHJ41uNlAFa5tbVJg73STSCRiFFFpqORofX44epHuRF5rM29uFE3287afudb8SDVXIzqFqQajn8MOBrYQu1rKCzXnSoEczA5pU8VQfVqbPPLEkhtiu3sYrlFo8RYPohAkCOzCgqyt0/iDliLTFK2F9s5dBHZSTLPaIzvIZW1Fa0Jan1g5gUzwe8EkXj7f8Ajplcb1dhZSWAsbZwpZdINJBqpVeRr8sZsrN2DFJo6whCypPCVlupI1KwIile24IaVg1AdJ5Z0yGMFnJ0K6Els0cRGQOiRW8XbuBJkjq2eoLSpNDxrlhFki+O6ZCl+IpZXgcx3gy1kEBkVR9JApz+eCSvqeuHiWQWdqvZeaRmmeRqiOi6jGysefwyxKRDVdXqP2ZSztPGpYW8bdb6TQ0cLTTmSV/hliagTZHLjuFbpkCxSwKFV5G0ijgUCAclHA+tcOq6kXqR3dJ7yTvRiaNqxrNc28UApQfSBTM1rXFiRFkbuboRr0NKZnUFhKAxBIAqUIyLeuLKoiMN1ogjMQR4BJGFlioWD8iRrrSnIg4mRZGbrXJJGs7Kn2zOroWGtKjNiy8gB/HFtXJVbQYZpA8EswoSSim4QESJGMhkQSCRxryIxZBWxunjW3pIjmR1DFgoVoxGcjlmFNcNIgI9bLHIJtNyrRu0UgoBqp9IrU1HwOWJLQixskmaOPWx7syMrzPUsrqPpLkggqTyGJLUqZJfGNujvdyjnmTuWlizSBV4GQ8VFKHji/DSXJlz30gt+IzwpG6UK6A0J1UBrQEgfUPUg1/hjbEGCQ7taliumja9+4AacAhWlX8v+Eg+nAUwITPM4ESzqWjk1aY46HTJzoh0tUczXngbBIPidzpeK7jSRiQpfIA6fyitR8uOGgYBCw0MTMLkyUkIFWVjkxbOlGGYywAdjRHo6ziKOJyW09QUVJJdeBU0yrgEFA0Jki0xOp6A5BqslMxlw9MsImg+VppDCqXSo7kqsCrSsYIyNciScMTES6YnFw0jC5t1pOR1lWz0KCOVK4CJ4qyhHVVpDWadA4XWWNAQnrnwwMkgSJ1INTFoVMvRQuVY5gngKcKYUiAJoiRWadIluAwj7a0dZK5Jqzpnx9MORgUhRRIweJQ1YGoC1WXN65AgjhXAAERosEiFmkZNTC2ZukKAQSxAJNOOAAawJEVtlnWV9Gi2tgCWYZklqV55k/hhCggKPK5+1kdDFC6F5jHqML0NHRajjWhJxWmTYUEeOO4d1oQQJZRRiWpWhUAV1czxxMGBWUyRdqKWs6EPEXYdURJrrDcWGdBgQCkqpLSSSdxowY42OpSKjp+Bz5+lMMT1CFnVlR3i7sluoM9wDQyKSQxJyBz4DCAUSU1IFVHMUYaEyZVA5SVyp6nC3GFEihXQZIkAeSOPqbXQk0YkHSQTn+GBhMDnaXbWt2t5aTPFdWjJcW1wg1KrrQ6hWvSDQkAZYrvjV6wy2mR0tKNte13uVb+V2kMc+iDftsYG+XUKO3/v2ICtVIzIp/djzHO4TxttLQ9h43yKy17bbl8Wl7FM8hN0kpEmlGJAQGT/ANorUBAU8qY5bUHbTF/eLJJb3ErxxsjRy1AbUdWT6m4hWWrKDwxAluFNbSXKQ2coEsMsZmtu7xBHFQQStKA0P4YimRiBlvoAIW/QghuIDrnjkJZPt3ApnUEE4nJEbdytmVIxNETJE5aKbIuCQCAyg5BTwIOJJkSOyRRpJdOGeyREEcdEDOGH1GtAaORx4chxxYmQaI9eW7Eu04Z5raMtKijRG3cIoqNUgrTMrXh8cSTK7EfktRJbRCe3jmikQTRwshRm01XQmigAAFQGOeJqxVAyXllGZGLHvwTozO0YoiKprRRQgmlVrzOJK0EWpGSW0nmeTUgWR4db20Ssh7ZP9Sjr9SjI51/hiUkYG2a1kaNpIJBW5AaeeoSNENM2JObLQE5YG4ItIbDtskv2TXFqXRtYdkordxiQAxB+kEggcxhMkkESWps4/ttIZdUgcounQjD/ANmpNQWOWRxFhAnmto2Fv9xAts9vGGtZQSv0jVpdAGNT6YQCyyguDbmZYykszKGjdu6NasKRRrUZFTXFbGi1fEt6G0XKXq0udzuzGsU6j9aHS5VQlAQWPMAZYz5aNo1YnrJ9Q/ajziPdbG2tJ7gF42iBJ/MdJrmKiuXDHJVnX4ehdycCulZLUu238ms91tzsG8TJBdXU5Gz3cgAEtCKKKk0YU4c8a3y1no8dtH0ZxbcO2C/zaLTqiG7lu+77HNLJLAyNEqiC4AprAYg0pUHIY51nlw21OjWuLPXQS73DNvlqN4s5Y57pE7sncWpbStdBp6YnZ9/xEa1WL4WIPFLCLyy3ufH9/WF2hQrtF5DRpSTSTTqYZnSaCpxPB25HDKuS7Y/iqveQP3K9nNwtNvut3tna72yKIrdViImzyClRViAcb7ce2NT0MuPk1ye8xz5X41K01vFbsrRbm2iS8aAgoYqgE6jll8RXFdLl7ehnzyLw6GESp9on6DUBjqsjSEErJoqVOmteNOWL62ZW1O5Wcvgl9EqwS7gEtDN3/uemryFcxFIDzGZWn9mNeO5TdQeeyNoyVt5JwT22q2t/TN8gMuVcaUyhhclrszMIriOdgwPckkdRGGNQF0AE8acMTRBkQvUEsr/bSWYYVUuqlzpbhTLpNPQfjiaIsjdzt4fRHLfwiQkrK1COJyIApQDmcWEGR6Ta9rt+6HvEfQTocKXXh6k8eXHEtREfuo7COOYgyzaD06FVVrStKE505YaYRAyKYIw0wt0tlWpcyEu7BuGkkZ/h64khQRbco72cd53KQt0pbx+vpkf54tTRBpkJ3C0mVwzxyLEwoGKhhlUV48RkDjTSyKLpjUtvJKo7MbUJPTQ1yrwrzyxd3JFXa2LUsIYkRrldGZYqepiOVQp/lXEXadiSoluCm1VSKNVAZNSmnVU/H/hhImILpidKMFVl6VJ4/ChBxOpVdiJgSSKAUH01NTU+gp6YmVMB1VGptDFen/gaeowxBY1migEaRwBzr/xwAX97ceZTbM1vZXL92zkKqkratUdcwAc8uGObyKSdbjXaRsXYN3ivoLZopA+tBopStDmSRU8P7ccu9YOnWxMpoZJkAty7FdLadTCpGRFOAqanFck4CrnY7m5Vi6nSKMFPUCOOXxyqcSV4IuhDr7wi6mUyJAyq/SklD9P+HL8Bi6udoreIicvgm9ozMovOy1O5MCajUcxnw4cPTFy5AJWXURXPhO8lA5+5c010kBNaGgGVKnElyWN9/qNZ8bvI1jd43rlVXaprTjQj4YHlkotV9QKbNIIw85zkPWTQHPLVQ4XcQVA9rGVRTWNFGEkgDMHoQKVPAUGWFJKAIilEVXZRDHXRGK0KsQBWprTPDFA33U5VG1t2RKhrpyX0qozIGQ5/xw0DIHud26qJjV3JKoY3+rSOFGB4/PFiRXZkFv8AXMZZU1SA0YnLUCwqQCCMycTSIERv+80KkMVlcEFOVOAJ9TXF1Su5CLldDaWYk8AKDhlQVxsrsc/ItQqtGBK1bgQAKKOeQwyB7S+pVIJFSaGtfU5n0wCDGQ/o1TP6c6EHmKfhhEoHKEhXhlVfoIVmZaDSaU4U/DFdi2u5P7C7l2u+stwt2KSwyiRHLZ1U8aD41xnepfszUfmW2weW+ObT5dtoDma3UXkSHWdeVWPH/wAfHFddNCT1KuULdWC6aI9nWJpGU6wKcMs6cxhiGe9jlkKXvbUTQjTOp0gaQTRsmzOXwpU4EOBtVmtriG7tJNBoMgeOZJB4E0PDEiJJLe+N9HFuEAQ3YFbuBebDiSB8OI/txBkkJ7pdu3MNLqNhdN0tF+QtXjlwr64EAzS/6zY0aK4eYKSFVW1qB+GGEgrbfN2s3ZYzAVjKmZ3U0VadZ+rkPQYlMkION5bvsM0jRTRTRKCugR9BRzTWBx+WCBiK4325uK/c3swDksiqAndBppIJHSMsOEEDNLflkLyM80cpP3HccAoBQlQadQ54UAJJ7gyaZlmWSNpChlbJXRQKIwoSKenPEoBhC3EJkkezto0eug61AEYUgBQaaaH+3EkRQVLMGlZgoM6giG3gYBVWmbgBKAGuFBJE48M2LcN4vbVxFJdRWFGedAAsSIQ3VTMgVzyyxXktBZjrLNhbFt8FmlsotljjKO9yGVm1L/6hUKQOIp/bjBe0nUxU0J1t4lNwklUHYjLRBqaRAh0hVPHqNMuNMZ2aIHe0L6IEEpjjgLSXYIJU0JUUHHSa1OAIOmcwLasXKIple3ufrDMMjI4BoADwGBCE+qOKU26vr7tTd3LL1CRzqrXMlRT5Z4mkQkbe8ZXunjjYlskGoKgjatWUj6eBIHE4kiFhgmd45O3FcFgB2IZ1UOkslalSC1TQZ+gyxNEURqefty3HYl0IZdS6wTLGeCqwy4njTEkwZG7uR0Z5XdkkMBaQadKyPU0DA1yINQw5jFqIEdvZp7cxMl3rc6e6sjlqq1RUGhHVwofniSRBjJdlobkPHCECJoK/SRIamuqtGyyrzxckiDYzz3MgXtJGwWF9Kxx5OY+LDuE5gnIYsRWxolZIVMUMqap+loTpAUfk1gk9VemuHBWxrVZAsRnQyx2bsmmRSuggAnPiwByJ54kiuRGkMuqWJYBJ3m/Tlc0Eh4aQBwAyI9KYklLIXaSLx8e2pdusYrKht7kKskn6eqYSNxUGvChqDjfjpCOZktLJCFLO8cQETWo1BpKKzgnqIOdFPAmvwxaUtnHREjM/aZsgZpiQp0EmgVVoOmmRwkLcFGU1RqAxHboVAIOn8xc8uNRhtDCa9MqSxMja9NEBqy8inMmnOlcIJkPcyvIdCjJl7MMVY3Lf+/GrXI8DhSB2R3mMkv2hUUKy1IUsy5Cg9AeXPEmAOMN2DJKiMkS9NRV5dYA0oAaUUg8eOIyySE6ow0PJPHJNFI2uObUNIpTOnEAcPTLEgaBMBBNdRs0aRRqD2WqBpbMCtOJ/lhQRE/cClWeT/LxdaXDkF6clBFcxyw2B6YmrmSUpd1UyGpDsOb04cOXDCCQzJVSWRi7QGioVoWJH1MAAR/PLAML1QwrcK0p7UgDoSwIOo5a3NdJHHPM4ACSKayALJ7coxuEGVCDnIf8AmGYrgGdjM1yjMEWRHQOlaUkEYB1gqRppxAPPCEyAKixyQyCN4J5IyAlPqYGvWprQEEcTiFSR7txOUhQMJIm1SzfT22/NVfzFeVMTEwqPQ8bI8H3TrnG7jTV2yALZ5ECowgYaiSQxpKdE+mNkdZGqunkqn1DDMYYAo078Kfb1Ghl026jVpZstTVPSDwz5/HAwDWlheKMzNogQfqQSGn/K2pycqcsEAEqYY3lUNrmdTDGpBA7dK56fqqP/ADwCYptywCSwKscYUxxSM1GiYHjVRwatMEDqx42ndb7aLzb72zvFsrqxOqKcAo66yCEdSASprTnlirJhWRQy7FmtjtKNve2/uBa+U2PaVI4dyhHavdremoFq6JVbVmhYkADKmPL87hvG9Nj2Xj/ILMoe5dCgTW0HajaZUBcujEyAK3XpJPSFORqOFa8scpo7KsK3Vbkq7UWd9HeMTMVlJP1IRQCgFNPpiuBnrqKMus0y9wzkrcRNkGVTSjKpH4knDQmhpmte27LFGJY7Ve3FJLVWZiNSgNQBxTFiIsYprVpIWUKbmWZhM0hIVe8FoUMtSeX0kUxIgxgvbUj9KZlKuGS/cRAZof0gxB4qCKkYkmV2QxXNgzvcWat91LJVp0NSkUmhcklpUFRWg0kUrU1OJzBWkNNxaCaNZobI51ENw0g1uQdZjYDJBQkgsP4HDTggxklsHaJWeaX7hNTRSO3cpKp/on4UNatQDE1YQyvYpdqHS3a3E7P9wAiIQEFSoKkAknMGgHLEWxQJniQB41l7WuNnFy9AAQop28zm1cj8/TArIUQNhtkRDGEDxKO5rqvTppoYMBmtSannywmxxImaKSKUyPNreeJlDK5MSOwqEoaZsAaYaIsT28apZwLDIWWOTVIsTaZOogkGudRXLEWNWHGFrqF5RBGKxTKLW5iGgozkklXz1VGROKmpJ1tBrT2l8umsrq02qxhkdoTru9wZhqdlViCkR+k0Oahvnjk8jHOx0cNtIZtDatyst8sBDdRGVe7GTbsoDxNkdcXowJDDTwpjFbVe0L1dX7CdeBeUReUX26+B+VIsm7WYefbLxqBLq1ldlLIcqOhNCo+eOhw7Vyr5eR69Dk+Qw2w/5uLbqNe9+Pb34Zdm7heW82e4RShVXbUCpLKRwQgczxxi5PFyYLewv43Kx8qifUi8Et/bbpa3PjUF3IZBLdvYQxl1TSCKU5EZ5fh6YjWzVk6lt1V1as0aEtfLLaHYbe439Itnup0/UjvXEZPTlqSTgpFDmcemxctLEu/c87k4VnknFqjDHvhF4lJ5PJc7XdRtte82yI9vFMDF91INbFQgoDRTzxzMmWt7Ps2Ovjx3pRd+5lXyzx+72QbXBd2hqxctEdLuIn4Ksy5EA01ehyxKrcEGyrNyitoYbpbe3mtpCrvFZEajp1qWYBSQCR68hjTi3RluyB3V3c0ZI7eC1hemppVJY09Saj4Y3IpbIteOJ1aKeWS6CgsgVdMYHHOh9eJxakVtjJcvZq0IfcGt4kAGi3AYVGfUUzJzxNEZG2a02eXUUjupQX1PMUVBqJyDEkHM4kpE2ImsdkLRxTFiIwP0yQ4XjmDkOeGpExPJabLOY2tQ+tV+liQCAOFa1J9aDEhEe3HaNruWY98RAMNBGs6dORFOPx4Ykm0G5Hr/AGAWpM9nIl0tArAo9KnMnmKYabBjDNEZmEMsKDkW/wANTSoP/LyzxNMiyNXvj92BLc2bF4qEhxUaTzBGf44urf1K2iI3NjcDKWKj10qdLVJA+Xrni5MraGmRWEsmZDAE006ajhkT8sWEOo1yapDqYai5J1HjlyNMWIptqFGtMvyioFDX+/EiBxiHAGQWnTX+NMAjimtSoNVIqRz5f34Bk+2SYFIQCyE0oqGhr+Wnp88Ysy1OnhehfnhPlcm1ywW05YwyMAmo1CsfjX44w3rJtpaDXfj+4pdRAu3UFqGZq1atAaUI9MYr1g21clnbbbwSqn3QDoM42H+D4igyxSyxIm1tsm2MvcaNYmjWkYNDwIOY+J+OGECqXZ9qRWIIldzV42yAJoDQiv8APhibYlUjl5su3OzK8Y7IDAVodTn/AAn0NeeGmDRBdy8QspCzaVEkZ0qijM1IIrw4DFiZU6lc7r41bWcrlqtoLAkheI+J+eWJJlbqQi/tTbqh0oo0hmJUgECpNQfXhixFbRDbvQIeCs1KqQDQ/wCKtRkAMTSIMhO6blGA8PS0ig9uNm5DIEcuWX4YsSK2yHSBpGDvIGYAsCa16cqahlTPFiK2R68jeeF5OzqjQgBEppC0z4fA8sSQiGXiypbFm1BHA0aaGob+Nc6ZemLqkL6kOvA6SaG6SSSag1r8P/LGqmxgyqGJQNNSwKgmoIrxFcsSKQxSwYM1TkQhrU04fPANCwqWeNCVKPmwFBxJ5k5E/HEScaim1qZ0jAVaS6tJHLMUOefPLELEq7k7vYREiyiulAsoYDOvDkcuHPGZM0tF2eznuJbbDO+weQlX8f3ZyX1UPYZqDWfUHL5HPBZCRee++1kFp/8AFvaZBuux31JIntaOM8+oL6j44HqKYKO8l8Zu9ha4mQGexmA0TIMqVOQBFagcjhQSViuZJgpW3kLvTqguKgmpBzNCeANKU54IARmSeyla7gk7bjNpFzBb4jDmQFp8ghmJe9t9bED/ADEVMz8QMsR7Q7hZFcbVOVNvcyRls2aMg5+hU8cEMcjTPDEy3CNIaOKiooe5yIrSo+GDtZFtDZTskKIWjjhGiSXtgA0FG05/Sa1AxKBphUzKSsFO4sQCIrsGJ5h1BORB5Uyw4gJQkkpKolkCyQtGVRiaUYA9QAyBGeWGhtIao2iTQ8A7jZoZeRX/ABaeFRyxKCCQjmnMcTJq7hEgMsOo6dJrTM5hiczhqoNijboXu72K2AJabSqx05MMgKCtM6kUwsmiJ4tTYXt745b7VBbduBJnWIukvbBRmYHVVgKupHA/8Mc/LeTo4saLn2y3SKKODtqiTHuRRrGVAKrpKOdOlKA9XPgcZbM0qsErjULGk89q2k0juSGVCGXIALUkauNKZYioLVsKZIp7ZEhMKxpa9N7DEBrYNnnUjJeNa4loyMhburQO8BhdIOoNmUAzCjRQnhkTWlc6YcFbY2SzFEaViiSHUUWGRCZTTJdVTVV4Nww0BH9wuYpUZ50WRyFmaQDtqg0ihcAgk1XlQemJogxmlcrcsyKiBgmjRpMSykgmQFzQ6SKnhghkRgupBBHDpVpwdYuGQKRKysKMGBIABNficWKpGSOytIVWFnrHnJbTSLmteIkCmmVeB9cssWpEWxhkZ2kK2saKsZqprqqW+vpcGlTl8sTqiuzI9JNWSS1kIhRwxsnQBepstDVNQCcjzBzxZJEZJTB+grNIKDtvVtJRnJoSx4iopQj44mitsRXEo7v5FjeNYtYUByVOTLmQQa8fTEiDYlmJjMXfWQd2Q/cw6yoUcuoV1BTn8eeGQHzxHalvLp5p2IWwqYpGOkqxOVBTSyjn8MasVZMXItBcEca6Z7m3dorpWWNZS+qq0JfMjnXIVxsMQtKxypKzKY2iKr2iNQAYdQI/NU4aIMEEgiUvE2nv0WKJW1IiHKjKdQBGZGEJHUiUxzRPHE0KFozc5l9PEIFNCa5VoeOGTiQiFyQ5YLKzOsUcbEq7VHQ1TTIjjQ8MsIR7Q7SNdGB5YhVZZVB0KFNDo55UyGCAk8zjXLLNcRIYnAjVi1VIzOZNSx1UIFaYbAB3Y2AYxmGS2lKdla6SGGQVQSpavPkMRDYNoO8InQPeQKXAYlg8lASzjKhFMsSQ5OwmV5GbKXvgMpoWFTxI5gZc/wAMAghlWN5YyFUxktNEUCvqrmqVI44QoCnjMhq9RJHHpKKdMjoSfqfMIR8MAw5BonklQx6XXN69Jr9IABNGFOOGAU8tzMi6gSYJB1KtAxAJaR0PEgZVwDQXLVArCDolkMlCWUSAk6Sqpy59XphDkKt41YyxxSOIZXLF5Do0ALqrQVpqB/uGATK+JEsczyNokVw0sTmlGVR2zXkf7cVokwTVTtvHIZ1Z9ZRqlo241XhRR64lImCgKO+ua8VJJg1JKa07VOogVzpThxFcAApIKSzPEiwqH6EzQqq566HiCBzwwBo+ieWTQ5laPto0Roshk4kEDLhXPjhAdgl+4keV1RyismoqFVSBnrU5dRHHEkxArec6hLIrMsidsSwx5AnJh8ADyrgFIpjnMf6SlGWEMsSlQJO4eBqMufPlh9AOA6cpf6hYxzPM1Q6cSQeAUHn/AAxFMaY+7PvF7su62+4bO6Wt1CyC1eOn6sYzYFeY/uxRmxq6hmjBltico3N7fea7f5RYw3duz2jxjTeW6MS0EjAhmzKjSTWgpw4c8eW5nFtjcrY9pwOZXNX2luwXdqwuB3CI4gncjNXJfpoysuaZgGgrlXHN7TqpsMEukT/pl5lBQCRRpOriYzkDQcKEj4csR2JPUINuvdSQywxx20RjM4oKlsx0EnPq4+uJIixkvFbQzXiSvb3BIWQirpKQNTMQwpUg4lMkRrvo9Ja3mWOYGsbvJUtEUFCqEfmY5nVniRXA03NjPcq9siRiCJlMlQe7qQVU1OYoePoM8STItDNc273Ec89vHDLbPGPuYm6XoCMwmnNVqTq4nKozrgZW0NbWTvHbpFIs1pMpbvKuhpQBxJp0sKmgPHEkyLQ03MMzd12bvtdOkZZVKygqG0szVpSnP/hhkRrni7EKaVkWXO4VmUlUjq4IUjURUGg+eCAaG+4RqyRMvZkdaktpMehSDHArKARXiMApGR4o0E3baVJnZHWHJtUlSRpqM/h8cMGhO8DJdyW326K5fuysq6u29aqwEQzFeXLOvLCaK7MR20pBW4cOO457s0fFpFJb9MZKQVzyGItE6FpeBbzDt+4ffyqYkvRpjhrUK5aply055ZZDjjHlxybMd0jY3t551FvW57iLe6SKz2+Id6btkAsQtCGBqRlxxys2LtNtGrIlHlNzud3HtXlGx3KQb9s8yvtc0baSgDmQMtTpcE0qG4iuKKN7rcjatWnV7M197Re7mw+5m0iG4UWnkVqgh3napKMa8DLGDWsbEZenA49X4/l05S7ci1PH8/gZOJbuo/hLpLbfZQTTBI7OCMM0jxosa0IqSWFPnjpumHGpUKDmq2TJZKW2fPL3d8yj8g8k3e+tZYt2SzuRY7RDESAyVz1qwZX1EZNkMeI5F/nZm29J0PccOiwYkmtShPI76HxHcLiHdYLa73Te4YpTapIrwWXY1aTUnTrPwPH1xZgxRsU8jk9+pR3l/lNxvl7cXFrLPdQCOG0sdlkZhORl3NIzqc6k/E8cdDHjsc2+SSES7Tu1iWm3mYbJZzKNF3cyhmlBByjoQVKUApzGNeNLqUNyRefePAISyXu6ve3EP52gJHyJrjbWpRZhZ8u9rUZIRYRSOigTvL3NJBFTUginDF6RU5D18h9rrpZD9gIwh06WLKpBrmKHFqVSt9wkH/wrLtnRJexLIAZNDqRQ6suvP/jhxUPiEEu2e3CxtLDuMhVSFJ/TQHOhozevDChBLGsbR4MXaS33G4kMSlqqqlyp+KEDBASyPTbd45LIGt7+OZy4B7hGoccqg4RKWMV5tUCM62k4SZxQKzVADDPOgp+IxEkRu68fup4xJH2pmkBJjUgGvqM6/wAP4YaYEVMUtvJWS3CUFDGVKgUHAmnHEpE0Jty8WO5wiWFB9xKp0AVJJORzrXhyxJXgi6yVbuuw/buYnheK8UmMSZKvA5mp/li+mSSDqVxdWzW0yRspDRMQWUD1rjZW0oyXrDEEgYsSQOqvVXiefwryxMrAmoNPpb8xJyrwwCOqaLQD6q1rlywDJtsRftARhmkBoQKCvMcqDLLGTNudHA/hLV2YTSvGKOgYVhfKtRyFRjDbc2VZb/iflVxssgF1M3ZPQjE1qRlT8OOZxXasl1LQaS2Dy6CeNJoJ+4jJ1rXpUmopQnjx4YzWxGquRFj2PlSDUrS91UoJARX0BBAyH/vP8sQ7CfcgN/5JAUknjmET1CmCuXDqrUZj54aoDuRo+Vo8zo7GNFJZQa5jgTQGnH+/E+wi7hVx5Srx6u8C+egL0kU4nPlQg1w+xkO8rzdt9jLMy6ZAWGolSQCRUZ1H8MWKhXaxXW67xGokLuJYyD1AaqCpFAcx/LFiqVOxXG57i8qFIHjXiZCOABPUa55GuLEipsit0yhUuPqkcAE5GjUNBQevLEoKxuuGUIWRkqyhSAaV+VOHy/8APEkRbI3uEcpjaKIiKOQgtpPoaZj54khIh17HMjhSx1IKBV6VFMiOk8P78W1FZEZu0h01WjS/natR6f2400MeZIbyyVAY0JABYD+z8OeLDKHxFWmRfpUHNRxqTlpI+WEyVdwyd9IkFahwG0hqgUOYxEk9xbZgvLEQxorFteQ00yy+AxC+xOm5aSQpdWbSCobtkRtXIlSNXVXPGbZmlOSMRyCNmY9KQsQQ2TLxy5DLEiJang3vD5f4SsFjt26mbZpHPdsZjrVan6gGOR9KYUSKTRUXu745vtst55J4ml7bMRHcz2TBS2o8SoGnVU8csRZJIhW9+Me2m+u934f5IdnuZ3qdp3UFSur8gkzwS0CRXO4e3nlNk8jw2S7lEoqzWMqzo4+S5/yw+5MIINc+O7nCzNFtN9Ea0lV4ZAB8sqYaaIwID4zupoY7G7QO2Tdls2+QH9mH3IIY4jxzyFJI1nt5e7H+sjXFEWgGWljnlzHPAIbL0f6cwmnvEcsxHTJqVnrq1aQWy5EcsPtkJI7fbnbprlglaRotIgfTpVq11A8+IxOtBOyEcV8ZFaKNAncIDrHSlTmTp+f88N0GrLoI2u9bMrsqfcV1yKpyz4MOeo4aq0RdoPR9xzE0IYOCRIxBarVoAwOYAz44HoWUUl1+2/jzXc8m4TAK6j/KRgdakZ60Y6hwrXGTNknQ1Y8ZrTZ7eJ7bb4EUFVWqSBgorXgKUFaeuWMTcs20UEsiZJIlV5JEtSO3VgU7IU17hVarTLLmcVxqXjv3pGMjBTdwR1Ej1odJXoyCgEJyZss8RJSDcSMq2DSAOyMZ436bipoVDA1JK5EZ8MSRAKaUNFazzTmFw7hpoSInDUr29HAmmdDiRU2MMwjNtHMwrDpMjoJelY2NBo4NUkZg4HuEkfuJUrDNR+1MtO3Jmro30x1Y0ypixKCLYxXLhYEMbOsZ+uRiS0ck3DUlQAoFR64lBHuGWdYF7haQvEsxjjghJ1Sl0CkgjJa4mkQZGpr5I4JGVjMkREBUgrQ6uJJGZGJ1ExnvLglbmcvHGWjMWtFUFshwByNRxPHhixFcjFWEBGfVGiKVD0Y1c8dBzoRidURsxvlkL/d9x5JYWKhnIXXQLRC4plmM64sSggxtACUt5CJKkySxSgLQ0yAJFAGphwVWZxVuborEndjnnpEsTJVtVeByBAXVUHnniarJXktCLm2SwG37dbxmPt0rFdTliELNXUQtAaH4430rCOZe0sfVZlaOIDtQZBIWBjD1FRIBmCF5YmQFBjkLus0LSSxrr75NA6PzIypXgMSItCYOq97QgiqlTJ9QUKaU9ThBAZ2joEiRFJZRrgQdQoPUV4tyGBjkMVrYKzGGR2WglVaAh6AhQOK0+HDnhwRAi4nieOOJyywqWnDrqRytDRhT6hTI4AgL6e3O8qmKGQj7cAhpFHEBCx5/HjhEtgLpOIiohUrE4K3Wkroq3T0k1JFeWAQeUcGYyR9oxKB22YChU5yPWhq9OfrgGgtA7BVj0lWViqt0NIR6/wCH54YAVIPYcr25oSWuI/6oZafUw48qA4QMLtu9JMjOrGKfVomDDV21p0UPECudOGGIKSKJ1mXtEQMaiYFisdCaNxrXDAFGydtHknUR3I0LoYjQgIo1TxBpwwhnY4krpJaWQuftyr/pIqt9YbIg1zp/wwgEweN5lumicq5MbuxFdSVozZ0ZQeGGBA3mqDQIpCobxnqwFR0BDT+BxUkTkFIGSP6HuYoAUZiKOxB1CMkfUFry44lJE9XuSRyxsTKvVF2QdPTypnT44ESO9+QHXcLGxnGhSuempzrXOnKhOCRQCiTtyTdmZYWFA8LglkUrloHM/DlhoTOwon3Dawqtc06kzDAGlCpJI+JwxAENvJCkbahFLL0y6u2kYXIswNaimBiD4mVjGizI0UZAeiOammQHMrTMeuESgMYyRzSvBB1JTTE5H6kbZBV5AfDCgGGBHS8KFRSmtJMqRsQdQbnU+owbgP8A4t5Pd+Lbpa3+3OqSadN0pJNvOg6u3nQ1IzGfH8cZ8+FZFqa+PyLYrSmbk8G87svI9ts76znUTQHXuFsxHdgkPSUJUZ8KgnHl+VxXjb00PY8LnVzL2lqW8j6+3KIZG6rgy63EQIArwoM6cBT5Y5zqdOQ2kWuWVk70EkgBY1EbIxqHBWtT6KcqZYjI5EjIHQ2yIbhoEWjSLSdodX0kAEMKGoPpmM8SRFpCSaAQyoFtXEEa/pvGWbUWzBl1khq8KjhxOHIhvlUNPa6nMpoJSI2UGViRRYpCwqoPEHLKmHJCyG27tp5XmVKybejSSM04TS0iisZyY9LEZLwGJlbGM2tbWaRJWt5SVYwREUaQqQETuEqMqj4YEyLUDC8ECxkm27YvG6LbJX7QahpIKDiSP/BxNEWNTRwRaR2mlhaTTrcldeRLghwc1oKUFCcORMaJIWieOyt7ZbZpBI87TnU9Ccg1Mq0UHppgbI+0ariOft3csd4BHclVWN16TStKMACrClSK5nCF7xnmtyS7wPL33TQ6gkH1ZqmgBFf5nARYjaOKApEkki63rJPIQoVwAUCBa0LKaEVwE6j1bDOUd+G0tGK/d6Kl5FIodAp8eWeKrFiRP7XzT/Q9qk2faw8O2STAPckVlkcKAWJ0gjSABStMYsmLuNWO/aW34h7oxW9xHYXl4LiNYULBSNOmoVXqKqNIbNefzxkvx42L1dWXtJtFdXPiPk+z7rtN4+1USW4i3i3WsBmBBKsFFCCpNRWhxUm6uU4aK8tFkq01Jp7xn91ng95tlxsXuOv+jXFwRbruLxSHbb4OSmpZUBMdcqg/IY6uLmu1HXKtzz+fxV6X78T+wcfNN49ptl8eu7jxKLZdyku2+2e629hcTxSkEUBLUXSpyJzrlTFdlhbjGtR1eZL/ADDFu7eGbp5BvQtr5YpLi8RNdtNcL3ZQj6u8ppToHDIVPDPFuLGq7EL5JIf5VuWw+3NobfY4bfcLmMkDc7kKoDRqC0sNSSzJqINcufLGmsyRWqMt+ReSz+USsbm4ju5rZu9cGeRZGjZx+mrOozpWuWVMXUprLIaFebiLVhqvbdd3kiBbRHFohA9NXE/wxqWhW9SOrebpeloNv2qG2pkqJAG0p6liMvmcTSggxmutt3FmZL2+ilmDhlRQXK0NTq0aRT8cSkiEvZzxxEidRKwZmmlULQBcgaD588DsOCMXHkFttrRoYjcPEW7szNpjUA50Dg8OQpiVaticB8G4bhdwma23IPG7iJY6UbWx4gU/KCOIxJ6CD7+DcY0sY3nd5bZyt1KG09YNStFyJAxFWH2jbFuG8NHN9pNNIFcskbkAOhrQsCKU+WJNqdRQO9l5rc2wWLcbYsIWOuZGqQvAkqRXL4YO2dgksJbbbPJLXv7dKsyUJQDMmtQKtmD8OdcsQ2Ai8erbbswziVFmlB1qKsJAK0bPI1wwFfkXjcO42hkEK94x9zVXNqCoHGgOFW0MGpM4eQ7Q0U2t4njqpSWSnA8acqnG3HcpvUri5tmgcwsSSCSulfw442JyjJasOBOY3OpdWkMKmnD1zxIjAUQSaMePAmvPIYBE38fjcCGjaVLdDEZNpHplwrTGTO9To4FoW1siyC5jidw0ZzC16cqmpHE8MYbG2hLOx3bcs9A6vkxFQaUJIrmPTEJJwLrHddw25EktX74p1Rt0ppJFKcPQYnA04JbZ+4VzRoG1KQumTS1QunUFOXLniLoh/MHj/vMyRtWRkIGitakkVpSmedP54FRD7xrbyS66hJKRHGxLFTzPAZA4l2oTsem8o7alGZpNZJkFMgKU4865YO1EO4YJ98aYVWR1LmgTkRxAJP8AZiUEXcYpbiWSSsrmKMoe2yEjKtFPE/HCItjc8IWUliq5gMCasVGWedD6cMSRFhciJHI2kKqsprI2VPhU1y4YYhnu3aYGFpV7aUXKgOocCKceHLDIwRO++3JlQW8guInBatACPXP/AA4ddxERvmDs5MJmlRv6sVNIPx4n+OLkxWGK60MtBFV6ExkVoBTKoPL0xdRlGWoylNRK0+lhWg/lni8wtQKLbOU0pqK9da0A5nnnwxGxOgN9LAUyYCmo1BYknPjT4DAJjttOhp+pSyijGRTT1pll8f8AxTFWTYtx7libJOH1wOQKmiqlSSeHwI5ZYz2RcmR/cEjt7mc9sIsZyB5gk5AAVFMSQPQSvJGIEVlEqsQC5qOn5c8/jhi6Djsfkl7sEvcgcTQKNNxaNUxuvPUD/aMDSYK0Fn225ePeUCAJcQ7dcuoDWN0xWjf/ACOYf2YjDRKUxHebFv8AtjtLYy3lvF+aWFy/4h0oc8Ephqhobe/OLX9CDyC/dRxR3kBFeH1VGCELUQnffOb1lgk3Dc5KVCqGYg/MgVzwPtXoNdzGG9fejVbu6kdmcqTPMQYmAo1AxNABkfji1EWNKxd0/wCX0mG2XRcI7VKVz1Jp4+ppiZW1BHb5dEjoGGmNwAq100Iy9cWIqtsJ1EiEFUKLKtA3Djl/dhwFO4dbayaRAVUuzAFVGQ0qTXUeZryxTa8GmtO7cmGx7Q97ItrbxvA7Gtw4qRStOquVDwpijJc1Y8cGp/Hdrs7CCw7SxGMAx9up1EPTTnXIK388c+7NlawW/aBIoyWjEsd5GQhdiFc0GQUfSRTSQB8cQZbQfkYsHhiI7sOhnLCjCgpVSR1UzxEm7C1qayszntW4jAmiLFG1N9JQ0yqeH8eGCBKwU0oF08UUpiMjdztOGPaz6+vPVlw5YkkJsQGQRDcHWQRRzHsywitJNRBLxsAeocf78S7CsZbua3kVhEyBg6/cAqFUnKhKnOpzr6ZjDiGRGK8u4LeefW7vCrrIzlC3akJqAoI0/DEyMjFcyvKDHHEkRy7RDH9ZvqOrUxrQVIw9xEfuWLLGFhJmgYgggaYzJ6VIqMhWtaYkiLYxXl02qQOqiNXaLWKrR6AKpHAUOdc/TFlSEjdMRbvAXUr2mPavVUsxAFSuih4H+AxOCLUoZJZNLWxih7SvIzpEWY5Oc2o1c6HFqIsQzT3ErfaQxLAHdnbWBqAGR1Hn/fiSZCyEUoeSSSbtq0T6lnZ9TulDQ6QeFMs6YmipsmXjG2xXlzJf3iy9xCVQVq2qMVBRuJ/uxpw0MOfJ0LMiMSoqoHSrL9y0mYjUmn0niTzGNcGWQ1DIWd49TdoduROqjgn6iDXTqrWnLAiJ15UDJFA0oEqEPcOD3GT5HICgrh7getyIzHHmlkzUgkTmgBJ1cfwpgQgZjaQyRSuKxfqgO2klTXSFkB/HPDGe13f3ES9tVltUMoI0qCppmXpnUcRhCCI690QMiyQ3BEgSoIRXyY0YVzrSmEIArLrtZ1j19tmjMauQSkfAivp/dgGHSy9tzPHJKjhqyq9KsaZVIyBIy+FMMDzDKSUsGMlFeGQZ62H00yJ+ZwDCJmKEAoVVgv3aoKv3FrQAj55/DCFsepoKwkGT7gAWssB1UcEHSy1OoV4kkAYY5AAs8MpCtDJCxRTGcia0KMK1JfnTLLAAa8VxMkkOn7djokuNIKnWSKLSuagDlgAKOjQ0amPtWzH9NzV2rlpLcACcNjSCZIvt0hk7ShbiTtlTqYaT+XgBQE8eeEIWdpgk88bgmQlZi/QukjTVeINDy/jhAyrwWdHSMuY9JndA7ApUUq1SKk8ajFaZYdZe01u6XRKwx0mnNQqg0oAAMxggUBo1pEk6hmZNSvBESoKDhV151p8fXAgZ5QrF1QAGMhxDWrCMitK8CTXDA47Ok0S5xMV1QsaM9c6L6gEHnwwKQgNeCKIdjWFlZA1u0YJeozZdY5VyIxJkQzVrEYDusI1d8IvQWr/hNQB61wADZVjuSZIdLf8AsWjZxqLAEkPWhyNPhywAEx/btGWqYiWBLItUCMaAVFag/wAcABrTRpdPGyIqvGYyTkzkDMDhQ5515YQNBkYbTFGyRhWzh0NSNwATQVppbOlcJk5JR4/5Hu3jm5w7tYTi1uRNR7dgaP0j9MgU1KaZVpnnjPmwrIoZdgz2xWlG1fBPPds8qsGlhdlvW0x3Fi5IZZfyyBSeoAEjhjzPL4bxPTY9hwufXMoe5bqTKI4yls7fdIolt0A0kRkU0AOMxwJplzxzbJHTXtDrirfbyieUNAWUTZjToNdDCgqFr08gcKSSWgJ4nT9KOVYZYazuyllWRWXXpNQ1BUHL4nDExskEHZgiZAkUudRECYWkOSxlRzB44aZBjVIqsskDPNDBbDtR6upC9a6mKlcs65cDiUi7RsvFmYvCx1o2uIhiC3cJqzkfLLCkbroM93bwSxiJou49qhGlpCiox/OmdKgfxxYmVtQR6eJ2ld4glzLaAmIvUGYmlSK8NFPxwypoZ7u27Xeihj7qaFijuXJjq8gDMgLVGoDgT654bExkltE0ytlNqIjUNkzMMqIDxZTmMsCcCga7m3khs5Y2k0VAjdnqTIoND0/lKk6sEhAy3MUcDXNosUpjgBmWHTQuxGcwpXPOtPhgZFMIuGVTMonh1Qxd6UFKfrUBQR5gc+GIwWVYlkkmW3LTaLcoD1klu+ktFJVfWo9aYqdGPvnYftl329t5LY9wotAbm0NIURtVAH9BRQ2eK8mOUWUtBrPYt2i8o8S3HtF2vNvSVbIAsyylhUOW6VYORp+WOZempr7zP+6bb5f5Bv1j4ptcP+tXO/Tw23jW2W8LyRfeStQCUMCVELdTnhllXPG/DD0RlzZOxS3ofRjb/ajxP2N8B2vx/b9rg3Xz66Nud8vZzW3F/wBrty8Vp2UbhzahPPGnJgVH7ThPkvI23sUT7k+WW/hm1XW0QT/6l5DcBp/KPJ3pHLdysCUgtAFokURamlQKUpxJODUSUmFt13R/IJY953edpTcACytGqgQAnSrqQBoNAW4YvrUn2xuRiZ9w3O9/yFmFhVKxRW8XahiKgA62LEupIqF4Y0VqQtb0DB4+8pM89ncbnejNkUMsYB9AAP7MWJQVNhc217hGpjkeLbYQDW2h6nZfQgZ1+Zw1BHciW63ez7FBrmd4nIOlDp1H/wBXM/LBMjgpTffIbjcneKLVb2eYYoxLkHiK/HF1akLMhb2bzyJNcS6UiKhVepIrQACvqeP/AAxbMEIY5PqggtKH7W1gkZoTWrTNXMnjSpOFAFuWrDcfE4LkwFr2ZDLJNSuouStBUegrXGe2li1fyinxGyt57i4syBPMoZDlUHSoYUPDI4WRjqhqj2sDcpbOakgAPUQFLnVmhJzw1bQi0NyxXvi24xTWDySQB6KgOTA50NaZ5kDFqfctSD0J/eLF5Nsse97bCGuYum+iLdRenP0K+uIrRwx7nPELhbm3uNvuJDMAWpKKagaEUPxriNkSK+842BokuIQtJLdTKuf1qSTQfLjizHcjZGdt+tUYG4hAYkDuLShGdAPxIrwxvxW6GbLWSNKAwKxkK9RkQOZoTXLhi+SiAvQozrSnHUfqzHEZnDkUE58drNbXKQKA1qAQuRqW550qK4x59zfg2LE2N2edMyrKBqcOFAIoek8RxzzxjuzbVFubXam7jfUylGJYkZrXllTOpHpimS1DbfbTNbPNCVfpBkf8oANAOPMcM8WKxBojL92NNSKEnNQzUNanIcqUpWueHVyVghKXZnd6Srm2mvGmdfTEhyKI5kaYBmcqQw1gkk5cPXPiMASHOYlFHrVhojzBo1DSta0+eGkRBxIoCiREBUanZePSK1qKin8cDYgUjICspUsShaOalRxryr8qYQmITJ3wWLFVJDsrKOFaEVGfypiSIjZOksKIkNHAPQ9cukg1aoND64kAyXLsVaVEWCXJe+xPTQVOocK4JCRkuZWEQAiZ7k0LSEqKpTjUcf8Ayw0wItLPbs7l17scyhdMdAajjlXni1EWMFyGB7ITTxaInqLL+PAfPFtfUrvqhnnQqdKqQTkQfgOVfT1xoqzn3UMHEmiN5NRVDQnppUjPmfUYGOuwnYxhlodVR1EfxJFT+GGRJBspCzlqDtlSO05BzoKAVA4n0xTkLsY8Q3SpI7p+mS36YLDLTT1y/GuK2ichu5XAvI45iFEmkh2ChWNDTOmEiTcobYJUaN4XJWucZ5V9Pxw2gTELyuhAA0kVz41+GJJEWzrThB9JcmlNOWn4VGHBGR+sPMd9sAyWe8z2aLwjZyUP9ownjTBXY7S+deU3Os/ed3uAdYUdRGXS3riPyqk/mMj1z5Du8oCNuM4lrVow4X+OmmGsa9BPIxoN5JNIWLM7nKZnOQB+ps8qk4u7YRDubZ175Yu4loWPToQkkFNOXT8/XB2idhNBA9ydbSCNUqHkkzz40pxNeWWG3AVpJJrHZZLv9aVZI7eYExtprQDLL4/34zWymquNIli7b9sLZVVSkQMvcdanVxGpAa1oBxxnteS5VJ14zYlXUo2kz6PunXpYsSakU4/MYqtYvpWC99spFDbLGe6qSFZ6qqGUMw0jMZacUs09Cc20ph0QwQzGKJtEySJU8zWMmtK/HAKo5rPAslvGY1l+yaiyJVZEFcgRnUUIPHCBuA6W6uoXtjI63BglbQjA6lAahQ8NQIzB4YUAFtcXIKxRNH9taySzyRqBrRT9PVU1NcguJKrExqmljt4xbuAsMYdnuNRdVeZqjjQ1yqacM8WVTINwNF7dJ3TcTETOGEcqqgrWuVAcjlnU4cANbvEivLLc0gdghkjqWDodWocDXlXAkRY03DdxzcRAzPcNp7ZbSQoFVZWAIqQCKUw+0HsMN3egUmeRoopVItU6tSEDToI5U41xNIgyPVhkBWRm+3jjOkRkmkpNFIJ+o/2YsqisbZZJe5rjiYtQxNAG1O4PAkmtOBqePpicAxBNMYAg+2HeRdMys4Z1IHSEkB9eGXDE0iDY1SAd4tGzyQoF+7kdjqq5yUkjivA04jPEkQb9Q6x2+S8uraxPQAHDOCTpWtaKVP5aZ1xfirLMme8IunbIIIraCJGDyRMQk6KQMhUdeekZdQpnjdVJI59nItVpihd1B/WHd1DXIK1qQCKlRz+OJIr1QYIpGAdSWlmlAhGrS75U/UrTKnDDgGelYOwd5DHpA7KqDmGJrGCag0pgQgxI3DOVHa1DuCFsw4rQ5A8DyAwhqAg9mRO6xdrZX/VFGJjrwDA8Mh+GGgbOs8X3MiTqVSeIaQxJqtCaMKEiuWAR1Drh6NEc5jL3TqtSEYZL0jMEcNOAcAo+6lRBbRW7laB9QdkWo1AkkUpwBpxywgQXD3DpTNQGPeeodZTnRmrk3zGXLDGBEZEgnudVwkoZFjkargscmalAAf5c8IR4vNDEk3cEWs9togdJIaoLvXPTlWgFcMR4Itw3a7kcSorhbZTo1qmbEEZUFcqnAAEEpG7SuZo4V0d9BpMpAyWmfEGlfTDkYWyGOSG3DvoYgJqNGWYjUBwoBTKuEMF3ZCpP3Ct2qRywOiiLStasGpnzHzwQCE7uQFSJO48wDutCpI+lRTkVGQoPjhIASaVkkUCVbaNzoaTqUSEEnpP+MVBPphiZX8BmE87hA0RU6H0aFWRVOnSBxBHr8csU1LGJxWWMnrmuXkLxpq/Ow6nC1rpp9OJDD5tSduIxCzpIHt1XpRcuruEUNSRXCEHAyAEzrFErhjCdJBDtxcCvAnLEkhMJj7bxqZO4xjJldmFSSvBl+JGVOeF1AN7ivSWapjmZA7aipVamgr/iY04YbHAXCpDMZCqyyyP1o9E7gLHgMznl88JMUBkRCoIUK69QEirkEAqSHauVTU5YYNClmmgVHjfsiRyJFopB4551PPLCYQAr2iJpKBI10OgFXY5kFHPMV4/ywhAtVY4400SK5LrHJQsprVdI/jT1OGMFEBRRIjFc3kduLoBUFsqrpIoPThniLJSPuw75uezXS3m0SzpcwL3JHU1DhiOTZEUxVkxVuoZdgy2x2lG0/b/3HsvKLSEpNHYbhChkurNdAdRpKsynLJjnQ8eePN8zhPG5Wx63g+QrlUPcuq2vxPKxB6ZIQIqOHCGuTlSDQeorjmWWp1ULG+3W3aGG77isxLRIGVH0/wCKhppI54gTCGrFA8qMbRlcFrlQC1BXSAFqaDPPDRBiOeCIyKYdNw6nSV0dSjMs1DkCTma4Boaru2ZGt7VVjhCyASoGNHL9S0ZhxpxwSA1zRB0QyEFFd/uJHWhEbcBU509KYaYmhiuo9D3VzK0Yif8ARBlyIJFUoMq5Zk/DFiKLMYZlt5mMV1NItxGUWRSrSI5B/SKFiFoG4/DEpIQNDW810zNdSp91calNyoHcRlYaQQeDEigIXDkCNMkstxDNGSz1aOSMqVZ6VUyFWNOsZVr+GG9CPQabmOXtwuFkSWKQy26nqkIOdBwqRwoeWItkWhr6WLXNvFJdwsDGYnXS8eokFgGPAMD8Bw4YSGhiuGtp5bdZoZJuyGUQqpADLxkDA86cMPcJg6JZLYqz3jhXZ2lYFU7yaq6AdAJOVM+dMRtXQkmal9oNyVN1ttpSH7WHc45IYIFq8Qehqj6iW1A8fXljnZa6mitpRsT9unhNr/3z5H5g0pQeEjsiEoRGb+4jNZUrSpCk/LF/jqzbufQ5/k8q7e31Gb3q9wY7PyW933brhGbZYjt2zNJKFhS9Kshll15y9dTllUL8TjRbK72bOfjx6anzl838pv5LwWtpNLKQO7Y38465G1hp5VOnNpXY6BT6BXF9K9Sa0ObF4VuG/XD21pbxixnnaTdr9ZZJJriNzQxSO1Y9RYg0XKgxakQvdwaStPbrxrx3ZpDe3dnthtwr27XbGOLTGPznV9RrWhFfwOLU0upnbKe8l899v9mW4jh3GXfbrSQ0VspWOvyFMN2kkqMzv5F5/Jfd6PabWLareYHSW092nyzP44gpZPRFJ31vablNJM29C7uWFZC2oKpHIOwIJ+WLqyiDY0HaZWCxxobG3BJaeTN3HM0FTn6YnMETt/FZWqJotmnaJNSQOeLH80lOZ9MKurBjZtu03nkW4JbxkGq6bl6AJGh40yplXLFzsqor3LU3eSDa9pG2QSdm0s0UOy/+0auXD0A4YzpdzLZ0B+14llu76DWIYdZeFwuXWmdTXh/DCz6Dxgd4RoL+OZ9Rm+6KmRTq6QSeNTU9PPCrsDH/AHnbobuwYBXZSndto8iGYGrVJ9RzOHVwyLIt4ZfPt3kn+lzEtZ7sDSMEAA6K+vw9MWvaSC0HEIdi8hkiYssdwzqoA6acQa5eoOI7oknA5eUqBbbXeEiRZbhraZmUHoJAzr6YKbjZmLyzb5bbdb7b2B7RdggqAAv1LSmNmOxVZFahC71r3ipoQKAjOo4/LLGqTPBx42khWShNWpkcgQeBwp1BqSa+IKgurqKQMe5ENJSmosvPKuRxRnNOBk828OL+FHaMmpA6VBApWhAND+OMVjbVlteNTyMelGMQcoW/NUU4etPT8MUsvqy0d02WC/tRLDbgynNlNdXCtcxlw54UknUpLdrKWyneAlY9TDSc1JBBzNeeLqMqtUYQgiuFhZVVzXRJmBmcwxqfXFkFLeocsckCsHA7QAzFAc/50z+OFIzrsgeKRKB1fTRwCf7qYJFAoWTVIqSaY2yDUNNTUyBOX8MMA11u2Qs6lAQAHJUL9XxHHAJhMoeudWMaghSOI4VAXj+GHIhluJJaosb6kkYsVLaQukU4enww5E0Rya7d4+00FC69Ck110HS2o8cvhgIwM0kT94oCSqR6lf0ZjU//AE2JoCO3zLHNEwrUlaKAEC6cuFCKGvCuLUJsaZ4NTmQONMAqATUj0FOYxOrK7IapEDIVZiKuBoAPTxzI/HF1WZcikIeQnVEygsCKHkQOHpiZTMaBDGhyJXTkqkhqU5DLlhkR0sbjtIUDMhbM0OWYoSB60OK7otow0ydmUBTktDl6YhGhJ6MWGSqMQ2UZBHyOIQWJje0+hjzzqFxPtkh3QAknLktq4/lGGlAnaQnV2ya1J5LXn8cSiSEwFM6VrSpHEcsOBAxNK+lQ7Ii/QikgCv8AfggcgZQVajHhmx+OBAwyGN5A0hFUppRKf1GFOnIjhxrXEthKrYusdtkvJu0A1H+l2yoTy+ZP/HEL5FUupgbepZGyeNW6qxuQ2pSipGorQVzqSOoqcqgYx5MsmqmJIlBtYzKIWdo5Iy0s84I0hQPTgG0+uM0l3b6BUkbGMMkYW1lYGCF2BElGP6hIpTKuHqSgs7x2yS30JIGCsBPAVAULShWNmqa1PHhkaYqs2XVLLtGaSRqro7lOhgBoenAMuROIyTQ+wzyBlSbuIzIFnlLhAQclTTVipFRn8MMaDY5Y4oGkikEd0QAEIIINaESAcWYioywJCbDprllDxMtZ5v1i2oL26HKNU5GhqKH1xOCEie4lQIkaI6wXASS6UMdZelNXovy409MOBTAne7ch3Zowbl3WSJgCDpoI2FPX+6mJITY2XNxGDBbyTM0UQZZJocy5BGTVpnyywxNjVPclIAiSRtNbHtoUWoVaUFS2QJryzw0EiK7eCOSWsEq6AJVtotKqp0jUC5yY51y+WGRkjsk6RxvKkrSlFZIZyNAjZxmpU50BP4YkhN6DRcxSQW7QSNoSOYGKaOhFGoeuhBOYz9cWIrkbLqUoxlCtPbudc1umlD36itAKn+GJoTGe4LxyTAyI0s9VhZioDHM9FPpK1pU864kiuRJdv+mkYjWVoJACkalGOkZozGoNak88TqpZXe8Fl+KbKllaG+unWOecLIQxLDQ1dCrWlWpSueN2KkI5mW/cycTCO3097uKIAHubUlQCSajqIyNCCKYvKUG/oktoncWzHTI8YBB7hzGeYCnn/PAhSckFVmac6iU7VujUfoH5lJpmOdcs8DADHJP2YZyVlTQ0bRqygBSefCteRoKc8AgYWJBEoSR4kBlLKa6WJoDxqAOfLnhpCOKg1LMkUkyw1luTXoBU0BTjq+fPDgGBrIxDSKTWUSjUSOgilKDjQcsQCDqv2lWfsNLbyAMwBBZWU5MR8DyxJskFqsoMqINayaWedFXWFGRohZhVuYAwgAduFYbiIMhjh09gBQhEf+FW5150wBIZ9vVna4L2tuyKJZHbSxZfy+grzy+GHAghZEJeZodMhUhhpppi5rqPEk8PhhACPbjBLpJMs9Jz1FdWnMUIyBJoKHI4AOVAuZFlIiadwzREmjkrkYyuWofHDCDjMA6Ow7OeghQziiAgAluBJrqrgCADyRMUno5hmUG4janUCRTSeQB9MMATpcyzx0ot0rNOma60QDLVQdQHw54iM9FIzqkaRywR9sko2Wpj1canUAaHDE0Vw0apIrd145JSouSOIlFdFCAVodVKAYpRaAFvFrdpgY5YjpnijBjMYXiqFqVX+0cMMRwpHKn0rbM8iMY5V/qCp/UUmornlnngA6wiFuZbaQKRKXtjUtI3Ighqgeo9cSELY3WcoXhIa3QtLFSnbb/FlkNWExiSJG7isEMJhkac2z0MZP5JCTypl61wQEigIlZdMLEwMUhgqCwD0Idq0pTmM8Aj0CFCHjoJ5B25NZ6CFrqZRTPIc8NAcgDs5eOcLI8lAjLxHDpHHMHCGGPLQu9yaGJ9MYABUGhyoOB/swgPKWZQZI0GhSImJNA2dCTStfnhgHxaIiAlXYIVvV1DrB4g1pWhORxFglJ6Oj/pI6y6VWUW6NpKEkVGpqFqipyzw0NaD3t+5Xu2bgb+yv2hntnjSEoNBZdXBoxQhRTmeOKsuJXUMsx5bUaaZr72392tv8ggg2+5aKz3NgRepJEhimypH2yxLCvCnLHnuXwHSWj1PC8lW6i25fVpNEkDug+7BbOYdKKo4h6hSQtcci1YO3W8itoqo2jU2Xct5odRjXMkLVuBIrTEYYwH6D0+4WkzqtAFCmN6UViwFDlzPDEUA2dnVCwFwsxrrlDGrq5J+nk3Gpw2JiCSzMk5ikWOQyxhnmU6QCnEurEfUP8ADiUiepHbm1EsTO1Jp7x2AzBEen6T1VBqtARiSZU9WMjyz1kDBJWXUz2pYsjKpBZgzDTxyIBpT44nJFoj95TVNL3Q8z1QswAhkJOhTUE0CgUPxwERhu4F79xAhWZpUhV65AMuUkirWpU05cxww5EM9yZTCmiT7gx6qxjTqeP/ABkUUgmpqc8EkWMFysr29x3NUkVx/RkiUFxQ/TIear/4yw0hDXuDCytgyjuykjSF0u7OVoJNJ5qRQAYIItiewgfvKUcFYI0kjFNKs5OYAZTSpzPHELSSqaJ9rb+3tvKtkI6Le2pNFas7ESTSEBqu1AxAqRTgMsY8qaWhf3JH0P2je7H259rLuaGBHlvGuLsTUoXvpCYwhORfQlTX4YuxLto/VnHzt3ufNXzPfzf7zdbfSXs2cbXAvHdmjdrhgy9yuocSSBxxfip1ItuYIZbTWGyPLvm/QyTrt8LC0gjkGiZpVSqvqqQoQBRw4Vxc9BvYjm7e9nkUKtb7IkPjm1TLI8NjBF+tBq9XoQCCAwNOFfnhOXsJUTKk8q8xut3Mx3jdH3GZXDm6nd2B4aaAetKCqjEqpkbJIgl3um4TRsISbW3Y5dvIafVm4nGlVRW2FWXjN5uhmuJJxt+22/VPfztpD5ZhebH0Aw+6CINrfZl0wWBnljVqR3EiadX+JqcaD8MNIQcZNUbWe1v2bSM6pLiShkuG9ErWg+AwCEu2eKbpu5kZ1NnYVLz3MxoT6mp4/wBmH3JCgnVlZWG12Use3K0FpHld7hIKd2nHST/LEHaXqNIrbfLn/V7mW2t1YW8IGXpU5n50FMXUXavaJ6lq+1lksVlue4shWOSTtW78iEBFcUZnLJ0GLd5oxFdTvRkNw/aJ4BmyFPkcSqhNkn2nuT+M2bSdT/byKZGzyDV54i9w6FWx9y03bapIiTK8jsgB/wADZ8eGVRjQtiplg+b6Y7q2uc4ZJIowaAH82Zy50z44rqTDd+aF/ExIc+3MZQpUszHtg1BzoRSuCv8AMN7GePL4keSwvcpGmhV9a0pqJObVHKnocaqELFRxxqZZnU6VYEsqihPrw08T641SUJChYybdmUmLuMyyVGRDUJOXGnzwp1HGg+eNxlL+zjZywJAAINczXI8sV5dUWYtGWRcpPb3qnUIxISXNBVc6mh45U4YyNGtaFh+GuTL9ndOYYndp21GuoDgcq8R/54qsX0L82y5huokYza2bPtkAgAKGrly4jFTRoRGfJdhS+FtMsqFrg1VciSeAVsjyzBwU0FeklJ7ttU1ldBe2GaRCxJNG40KgUFa40KxkvRpjVGZOy2oFAJCEc8M+ArmMqnEokiCSSpJFx0zP21RgQQRmMzXLCBhyzsksaqBKqBtfEkhaU488/wCWJAGXU0jMSgdVIq5APVUjlzrhCYkkkIWtaSp/VIBqByGfwGAQx3hMpkVFDKrHRUkioGVKZ5HDTEyPyyFmndj0QntutAopSuXqOWJoUDNexiKMSJIWo+mVzTJTmRQZHMilMW1QMbZ+yqsVGZ/JXLSSaUr864kkIbZGEcbmupZBpKLQinr88TSK7MaZVZmKFuIq2o+nrixGewguRQk8QwFPli1MovWBKxrw/jhkAaSFc/ThhNAnAqeTXRweVDiKRY3Iqt7pRDKHzZl0p8+WIWrqSrfQbi/MnPgcWJFTZ4ORmMqYcBJyrV4588IAyGKSZxHGpZjkaYG4BIehbx7aBJPplmIqsdch8TiEyTiBsSJ7qbIHrPH0xJtIFVsl+2bEwVZ50YBqmxUUq8inq0t8PQ4z5M2hqxY9Sy9j2SKKkghilkJaQMxp2iy0pWnDOlRXLGW1+41VrBI0tgIqT3Dx9hGMc40gMgqGYsCCDU6Vy48cUyycBDq7hLhoWiiaRkuVTqZ6CozFAD6k8cSTCDkVrHdbgjRohljjqxcdDMMz0qMgBQg4TcjLC2gxpEJDPIwUCMgLR2elFGrgBngJIm1rcORKtwwVgY1dXXpVzxJ0inPI4UFkioSyBgs8hYo4MdxUN3CyijMTQED5DCgUhi3JHd0yRGW4bvwq9M2U6cm9AMx64aQpkBLclHkiaR0ErBlmAZ30oDpVQBVOPM4kiMje9+hiWZtVteQBlaShLPU5EkZZ8OGJJEZPXTyTNJE/Q0Udbb7cA6S4ByZqEk4TASyTxa0hCvNEqdajLuMQc6ClDy+OBDiBHJdXepe524kkJCzpIBVm49I4mgAoeGJEYGuWXsrcJ26SysBLDKNelRnq+NDXgK4aE2NEkp0i56rgTBhMaIG7SZgOtcjzrTFlURkZJZ4IxBKn/sDojzJ1K9ev0qa/hixIgJLi5aJTJ240WOQmHtN3HqRSo0gDiakDmcWJEGxgmfuK8c4EsoZu9cCQUGRqCOYrw5jE0ipskniuyPfTR3l0jLaxHRa2wqVlrTrBaoOkGpONOLH1MWfJ0Rb8UMsLGMyyuTF3THGujoBpUBhQH1+ONRjFUbNEBcCjxzD9GapAUrWq/EqvM1zwxACXqsDZs7Ui7uTSg8NQyNAa09KYBScieNZiIJNSxDUFIr66gmVc+BrggYONQMpIAkYUuVqFdq0CsCczpA4Hlhig4zSrFNAHVpCgMjMCHZSc1kbP1PDAEHFLxC1dX7clNKR00jQx45A8TkMDEwciSyXEcTvENUmUbkhNVeZrmSeQwkgCZI5YwWEPZVmaSO5RtSmmYp/MD44BhnaElvEIkd5JZGjjZiNaVprXnqI50GJQMLuG62niWCWCJ1WUUP6hU5s3SCoJHH4YQgUiiO57tw1bl1Mk+kl6op6KAjSfStfjgEF9zuuHQLpNZDExAVTWn6hGRrxrzwDOQLGFjdZR2Y2aWe3TI6jl0ksR8sIDxZwYjoWNYwwIJ0sKjIMRTMAVBGGhg1IJminldAGEmsU0yKM/wAGdcMQnJllo4leP9StpbKAQlKA6hWrKKCowQB6QjuzsxEs0dCQqkIxpQ6KZ6V5jCGmAHZIidmEpXrjkc9QcZgchQVyPrxwCK4cuIIopzSRWYtCIzpJYVHUerWOY9DlilFgWpWNbR4kdJAdIYKazRrT56TXIA8cMYK51m5UMg7DuVjWIHTGUOoggVPMasMR4hpnMzqgEkJ7S6cigqQVC8/7sACwNDLCt27xlhGBqRiKAEAoVUZk8RgABKe0AywCa4cEW6yHUNNAQhAAAPzw5AAGYTMf1JdMQqq0DByakZ5cueEIP1GQmUOpjmjOuJxQxtSmlRQ0NcEgkDZGYSKVbvmFFgYgArHGQxAatFap/twDQLVcPFGYwqrp7/bAzKA0PE/UOOZwAzmltIlijEa0Mqwk6oyoNK+oIJq2AQOq3E2sRPIJAGMIKs00QHUdeVKMOHphQM676ZTJdKr3IAEUSgKCG4MTmQQP44aG0HQnRcKkCh9A7yu1SakUKljlU0yJOWB6iTFMFxJC9o0Myx3MTFYJ0l0uZSR0GgGaitcV3r3E62dXKNPe2nu+5aHx/yG57ExQwWm46tRPJhIdQANRl/wCeOHzfHb2qeh8f5NSq2ZqOG4t7iOIRiXRd6ZLieOUsOlm0vVTQA+mODejWjPSUumpHJG7ydrVHeO0RkU0+vRkdY4ihNRQ4rJCJlinjkM0ZRWVQbkqquDn0leJJ/hggYylIrlWllddESNHLoNGpX6Cpz66csCI2Ge8jXtOkxcW9uxk6mVy8ZzzUita5fDFlSDGC6k/UnZZTCBGSkGlqHpqruXGSj0GJoqYx0maKF4EieO6hkaO3CdOta6mAccKitBxPxxMUEYuolhuIDOJIW7B7igdSllOaljkTkMv4YTFAzNA3cnlK10RhURSVdEYnq1SV4DCgi0R+eRIzcW8DmQ6dUzqaRowJMYZSQQDWv4YaIsRRwSNfF5CZmRRrckKhJWgaMNqyHEYZF6nralpHotesAutWQ6YwFJehqwZumuXEZYgxosz20sZLzyPx6C3eWXuXyxIVNVkaSjMa0qpC0oDiqylhkvCNZ+9HlFzaeP7psdpc92z2yWO2t45FAbvyISzNyzBoaDDrWTnO0WMVbHJc/wClXm73Esa2l2zQ3CxKXEjgGpcZ6NTLQHljXVJKCLs5Kx873Ga07Ng9vHAJIpViUSB+2gA0Ry1Izb19MSZJNNFd7XbTXUe43nZXcH2l0ijjmy7Zb6cxQuBXOvIemEn0Fb2Av9IF/JMtspuYrmV1W6WSjdNGFMqqgJppPLA2Vv2j/H4tNBajcN7hWC3Ira2BFCV5H5Ys7vQIIzubPfyhrmTs2FtRLeACgy5Ko4nEkJojd7UsYYIXkNwAkNrGKsRy1EcB8MWVRWyc7X4lFsyQX3kLGe/ZRJZ7WoGuh4A0+kYLW9BQSK+GmBNy8pnXbNupWw2SLKaUj6ajjQ+pxGH9oyst83u431m0Itns+39S26migg0CseZJ4nFiUCbGrZ9ruN9u7fZ9vLNNcOJby4AppBNer0AHAYk326sW5fG5/a+N7VBstg4JipG7f4mAqxr+OeMy+JyyeyKM3q/imilWJiUjcwxD/wB+TMasR60pjTWsFbZbFvENr2O2tZK1tbLVK3+F34L/ACxU1LJJlTRE3Pknj8YHUitLdD01kkfyxetEQe5KvcG4JEJWQlqwqlf+cUocRohsW7/IIfHHQtpP2eop/wA2mlf5YVVqSZnnyS4illtoomoLKzRWrzYgk/zxqqQepXSL/VIqQcj+JxfJVAvuYjHBbr/78JcD+VcQTlk2tBfsi13OyfWVIlVGAFTxz/hhZHoSotS0d6ijS+MaSGgVXEzsCorQMCOOMxpQ57TdTQ3ImygWNjEtT9VKdNc61H4YpsX1ZoHZL0II4wv6kqgKRkoZl4fIc8VsvqyQzuJI3gWRSnaqgfL/ANQQg5fM4jJMhG97Vb3MEx7DBoVYuo5UpzzNeByOLEUWKc3C1lsdUGprkowki/KAHHVUn0GWLkymyGdy6CoFBAWJrkaH6STwFc6YcEGDEqNplMhiQCoVh1hTlqy45imeHAgZkCukzu1HVgjg6lAAAFQDUfPDF1CZXYSFpFZRGwdpWIFDwHPMfHDQDVdSOA7PrVhRo4l0nVUVLD1AHHARI7Me5UyVRYq0XishpUEgV4ngK4aGkMMqtO8bHWtsKxrQDJ61pnxz/li5AJZ2Mk0nejVHBBumBHSo+k0H92GiIidBFII0KmYngpzRmyzAyIApiaIMZpVoCxJ/TbSBTifUk8AcWoouhNJEBCHJBrUU/MDiVSq6lDa3DSBTT/PEygDXAIEGwDk6GOdeeEANRq+fpgAGVPBVPxJwDF9ntdzdmqIViX65myUDnniLsNVHOa6tduQ2+3fqT0pNcnh+GIpTuSbjYQwW1zfyA50PFjzwrWVSVKOxPdm2CgjqmuhDSGlQFNBlTmMZMmWTbjxQWPYbcsLKAhMUZY3IZGNFegNeQU/24zOxoVYJFojJ7rQyrDGul2YhSdNNJVByoOIOIuxJIJl0mIpKjSklmtXRc2FanpOYGWeGD0AN3IInCF5p0iEkyagqFSaihzNTWueHJES2CoSJpe4xlJW4B5MxzVlyqQOGFJInFtIr/bW80ctQUHaBosjci1RmaDBJJIekmMduWluJQkKdp4wjaZHrmDXj8CMEBMB5uZ1SKKQl0nqdcaVBIbJGbhTniUMjIoedwwQPF2kBmQyKw0PpoEY16ajMilOWJJCTCUuu1IJKLEyJRp2c6tZFatTkOGBiYFbySnfXsr3mEguVYnjkwbKoFeGeBDQm1juktK0wcCZXVmCvUhRkwP014c8ECkOEyMXd50dbTVpiAIkZqczwBBzqBhpBI3PIJBGZoxHbJ1JU9ZA4kNQ+pbj/ABwyLG2aVo5NasS0jkRGPNmVhqKkNw9R8T6YaExmuLkRGnZMbaAiQBiZEpmIyTWgOZ9MW1gi2MkwmKmLuvDJK4ZEIqjf85bkPQDFyRBsap5Ih3o40McdsCFRWJNWyMiCgrT0GJwVtwKbSwm3m/htYyP1kX7xCgVkjoKgciTxNMWUp3MzZbwtC6LGxENtFAun7OFCh0EALnRWdRmxNRkOWN1VCOfa0scYnjjlR2GsM7NN2gz0YgqAoJFFzrTEyAJe3GGtxDHdR5fcyoxGZzCxA8OGY54BHDWSNIWdUSGTTJESSRll1j4ZAVGBgDSaKSRZDITbooMKmg1RZAEPkxIIzriKA8f0zplVCs7B7imciKTQNmTQnhTEmNHjMIodNW7saktKy6NKHgXNSW5YBHo31RCQIQwiK3CmjEDnpIPqOQwSROdtE7hiBfUAYZOIYipYhTwNaDOh+OEyUHpO2iI8ERaJu4kkDlmGokFqBuBFNVAP454BgqI/YDTAqUPZWNmVQTUgupYEn5UJwxSAjCMqhrhoC1FRyNTOFr1EGvA8v7cCBgZEopaUMqmQu3cOohVoDJVaUPOn8MApAt2zIZbcCV3Gm1ZKquX1a1Ncss8IYQGVnYlDIshPfgEenRSo1R6jkSeeGMPkUTVXvd4MQXunUIxNKolOJBPEkYAARUkB0RBJXNJdL6oxTmQDl8xxwCColQ0Zbpu93FKyaSXqag6qcAvM8MA2eUA6jpMQjasioRUBxnIAtKhjpGkYQBqkiS6pEO8wKoOI7YNDz0gj0/4YZFsrhS8a3ILNILjSplI/WMhFNNM8jQjUTilFwjGaP9zK3bhBSW3VSTEtaBARxJ9Ryw0Jh+iRrjShaOWFD2urUBQZt8SQMwOOGI8i67h5Edis7rGrSjSdSLkxIoAGFK0wDOqxJjUwETxPWWNmIrqy1A8QvM/hgAEnb/raSn2iEKqEHUK0bqz5jAAdGXhJjgPegaHU7GjKIyasCwz1eleWAQOOiLA79MEiM0UdRqyOYBNK5nLAMLh1lLdge7AG7bwq1e3G1RoGo/UAcKAO6UVHkoxLqQsagiuk6T3K0qfjhgGkCKEBZCHWJnSIt0srUJLAZ/jhiBFTKtpG5Va/qRodILoSAqqQa1qTmRwFeGECZ0yG3kdgyhgC1pUVaQHoprAI45gmnwwSOAbKsTNFOZI00KJqagqSNmQF9RxPI4ABpcpIuq4jCTq2p2IBWSJSRQFQPxwIJkEsg1tJVl1priK/UdJoqhTnx9KGnHFdtWOS/wD2293Z9he127fe7NZzyaba7IKmNSeD8Kip/DHL5vj1dTXc7XA8m8fw22NdWG52d7ZxXNg5uUmo6zKdSkJUOAQRTI1oCeYx5zJidHDPVYs9bqULpJFQx9ySK4SYDt3C0V6qanTTi1CRTlilyXrURSSQytEs9u6xOP8AKvmNRbIEtnXPjgSAa5pJWeUO8UiTxsWJyNF6CK5DKnP5nE1oQaQw3M8wQ0DwpoPbElWaQE6WFQCMq/LEiDrJHbwIvdd3CuykMwqGjVjmaAkAhgK5cMTkrZGHeVY7hZ4e08UZBlOpi2vqQkEcQeeWWAiNFw01yY7GVjDFeAO1yW0vINXUoNSKVOlfXCckBgvJVaCeO3VI5WZdEj9Gmg4MVJ1Z/MYlAhtaa3kEiXi5NLSEihdCVoraAeR5Vp8MIQCaaNY1Bm0OxCXcYrQJkwIA+k1BNBXC7QNH/to2ZU3ve/Krm11bT4lYy9qdqrWeRaqQDStErmRXFdjPltOhE/cPeb7ctoN3JLJc2u973clERiGDxUYgOOBC8KYsxY2jNZShDtOxSQ+GWl9Z2k0KXjzyyW+pi3d6l7ihqalPAH/3cWNduhXPQzN5ZLJuG9XRt4VkS4keC7adFjbuxn+s9PyKG08fjixOUSagney+H3w8Ctr6Ca3ZdzvO1chYpC0cEahIyj6MyWapNedcRvaCFU9S5fC/abb49ou953sG22bZIY23nc2CATgMKW6s1Op2IHr/AG4jZwCU6FKebbp/qdzcX1/CLGwRu1tu2g0d1jyUH+GJ1lktirtt2zd/Kt0Xadntjd312KMU/pWkI+pi1KLTmTi+tSqzRc/iXt1b2My2HjcK+Qb3bam3byKT/o7T/Fpc5EjDbn3EE/Uj3lW/+P8AhNzJbbUw8o8umr93ukp1wRPwpGM6lcNL7gKWvJLm+un3byO8keWevYtq1ldjwCg/SPjia9EJhNrs/kXkN1b7Pt+2CzjDh3cj9NV/xMTxIGJN1qpI6svTbtq2nwLaZo4GSW9lWu47m/HUfyoeZ9AMZrW72WJQU75T5E1wLhUIiCoTOSamFCela+rcTi+lCDsNfhu0HeryHdLlO3sm0nXEjD+pIOBPqSeOJ5H26dSK1Jr5TucgjitIarcbi4Ywjiqf4m9AAMV41LJMjPhFn9/vu67pl9tYKI+6fp9FofkMWX0RFCPyy4a/3Cxtq65JLhDHGDxVG4n+OCqhBuKvcLdVstvkSgBitxA4B4ux4fhgxKWSszOF1M8qRAnU8qnqHOjVxrRWII1MkyQr0t+enM4k9EJLUWXRZ7uKNTUwgBRwHDgTiK0RJ7ko8U21r3cLKADQsDGeeYZFQOqpy4YryMsoiW7q33t7eSRtE+s1hIXJApAHA8DSnriovqLLFYmIjZnLRH+itVBbSAGBz4nIDnitosRdmyXYF+1okug6Y3ZiFQM0YrpVTXkMwMU2RciX/dAzQywiM/cD9RWBWqKKZcqg8QKVxCILJE6SQsq6ptFqrmTRpGuVS1AoDejUzrw4YuqyuzIr5H46LmKSZYNUhfVIzRBHR9RAR3NARThQ4u7SmSobyxmtLgJKqqtuQNL9OtSDX14AYVWRspGRpDpZTJogEoS1IOQ1VorA50zzrickAwsiM/dDRyoFjIZf0wpqCOBFTUkYEAkMzLLNHEonuFJIiNVbthQFBBypQ5cDiSQpkR30ucKCZJCQEmuBQsUJGhagkccqDIDPDaBEWuJHDFRqEja3QaqyZmmr/wBPHDSHIlKUMkZKyW0KlnLgEoQAammdOQxOWJwIJ2eNmV0UTyqD1NRk1HVHz/liVRWG142haM1rII9c8MilWFaZ8M/hnxxaVQJHYvRKN22qR/iLGprqpww0RtqJFtpXj1RK0oJIBC5g/wDjjiZQ6jVKpRuAoOYzGLEZ7KGFMjgVKkKefKpwEZAUYCtMjhiPUJplxyBwQAMFlbMcMKBpitLlwKnhXNaCmF2jVhZPf3bjsO5VQB0L0ggjLpyriPaPuFe07U97J1EIgYDq5mlR+FBxxG9oLcePuLH2jbICKhNLQqJZAaIArHTWpyyp64xXs2bqUgm1jALeITItInDBpXcHUQ2kooUmr8wPTGa9jRVEmjhWOJDR4++xijkNAxLAV7lfQGnxxEnArkYiWO4VYjQiAayVj1UzqBWijiM8DcCY0h5Y9E0sjpeO5S2j0gvSo0kk1yzxJPQhYGiykxskbpPC0iTqG+qozJzAoBxpgRGRLayRC6kikmFwiKzGdGCFdAyAGVW5YTJEliu7kXMDMiJLQLBA1V0qcyWI/wAQORwSSqxwkuI3dUUyT/aHXJIBoYBjSiA5UIFDXhiW4raBrTLFKscRkaeM/wBIUABNQAuVG05ccW1K5PR3LRStS5Pci1iUkdBJ4mjClWoATwGVMOBhRZVpFE8drrYvDIauFTnU1GRpQE8cQaYdwIXRRApQmSb9KeJaa+knqzyFVypiUDkGt4NGko1tHI47vSMwooFDcRQc8CIBayRM47pAOs6JGbqK04hhxBpxIxJIcieQa4iyRukyyIYolOXZFKEKTwp64IE3qNcl0FSUpJ3JwGeVXBbtohOoEmnAEEEZ8uWLFUi2MN1O4tnWkb28tFhbWw15nUSPqoDwBOLKoh3DfdTaIg6yObjUSrsdelafSy0IHwA9cWELORPCk5uE0xTW9zqWAQMofpYZU/HKuJqslNrwWz49s8mzRRRyKqXUwLzu5VwrD6dIJJz9MbsdIRzst5ZKDGFtyO0O4jC6jlKguZSaDUCTlQk0GLCligRsk320JEMaxFmSQU0VqT1DKvwrwwwCUMojgCaFSVu0rM2khBxBUZhmqSABgkQOQMqMuk1jynkKhXC1qAQagHmCcAjyhTMZBplilj03Mci6TUZAkGgpQYQ9QCyLrkdeoGMNGTHmJANJ1AZ8BXPhhiBg1YzIwneSPrnL0Qkj6suQ4Zj0wDBPIdcXdSk8CK7CNBq7ZyGkCoJPoRwwhAAO1qkMlS7MoiAoR6hssiMqGuAYNGZF0SnUJVCSWsp4gcKGubHACkDIquTHH24GkXuF2GlnbgDITQgsBx45UwIGdkA7UYerNIwdVqG0ueRIBABGY4fwwwSChIY1DRERiT+sAerUDQy0pnU4TADKMoZOmaJgco6UahOYzH44AC5FQ6FUOqBNMOjk+QKk1NeOGhyGBJe48vTIYlMcUoHS78wQD88AgDEwMFYBJHqVIOpTIR0pWtKeowMAKOqw3KSMphWNe6EajPmCoJJoSmWVMIAJRuhZp1UQEMgNdQLDoCDnSpOeQwxgFE41zkIxkk/UQkFNLA9TKaHpyz9cHUTK9MMslICYu2KSMOo9nuZUrStDxPw4YpRcJwFa4WSF+41kp1NUgO9KFga5Bq8T6YYgZV1jT7qJbZlrWRW6qE1FR9TUNK4YgaaG7iyLqIVlYyilTUUrX/EcACijspmDRmWoWav5G4CrGlVArxwAFLDMA6TQ6beZh9wFVQQw4aACDggGdXvyW0sQQFqhTMaLkv0qwNM//cwCOymnYnSjg6Qjoe21RT6a1oRzwMAZiijNyp1UaVFejatCngp9WFa1HHANbA3lhPal1uZCJEkkFMhUAIQaUAry/jgGdZACUjkMUkKf5goKtEB9PX/LDInIlHQwjZloXkyKlqGgVWIqyn05ccIAxWBY/awyGS6k0AEECNyBqQGukgZ8cANgF7YWdtBuNJeOKPWQnUc9NeNSK4AkUgJCs1QezJGArqMjQABNJp88sABndDAr2mmMSF9Skq7hstZSgK6TkfhgBBsKyFY1aQmKMFpwwNGYiupVFagZE5YTRIs7289yLnxSZ47+cX20zSaZrNGyizNHj4gV1GlD+OOfyuHXMvadLhc62G2uxsfZ/IbHf7ZNy2u4gurQIumTMGMkAqrL6mufxx5nNx7YrQ0et4/KrlWg+LNI6iRgtlIyl43LADpI1AKSSCTw9MUQa5EN29x2Z2KLaTMwVrbTq+sU01IFdeRGWeE9BNyM1yojdK9yK1m0lYQaGJx9TMSCNNRn6g4kkVbkcuFRGeeZH1SSOhA/U7x48RTSSBlTEkiJFrxGZpZVkVVEVJWjFD2RkwfUc6UHA1/HEkRehG7gQSXJWKdO5IwKDNCwOavQ8ajgtcSepGRvvWikmYVkmjaMW0LPpKMkeS5g5GpoP54i0RbI/eyK0RtNAWKoSOMMGcSce3qJOYBJ4/DDSK2N81wzGWNtMbgoY5paBGdahizUPUKVxKBOxsPxKe28U9k7i6kZrbcfKriSUyGQKJLdSVUplVi2ngOWM7UsxWctlObl9xum0eBwRwyPFcSXs7aJAMgWLhUrTIGvCtMaauCEwi3mtVTw7Ylh1RSxQy21sQ3UYwSza1zAqGBzHPDtqVzqYQ3K3e93JobaOVYdyvTbzof1GBmlkBVozzb4YnXRSW5GfR/ePCYbWx8N8Yt4VsYNo2y1htpXARrhpCNKyMOrTrLEBhUU9KYyWbtYgoqiEe9G8WWwWcni1vNb22weGwqu5Qzaq3+7SMpdoWTSJVhQkliOlunjh76E6pRJgfeNyu/IN/jtLQUkvW7Ngp65ArGgoo4E42Y6qCq9jaHhXtjt3j/hUyyXL7B4uAr+ZeYzdNzuFyAS1nacwgoeGLk0lL2/MyttvQpPz7z+/wBwB8O8D2aTxzYImMEFmFMc9wRlrmbiSeNCcQblyWqEirNs8MvZbhEtUW53aTUbncplJjh0/WqLTNhyw+4NyZx+EWe2XQisof8AVd6kGuW5nGsQmmbaTkCPTlzxG1/uBDw8m1eMQyRGcbhvsqM94kh7WihIOT6a5jIc8UtyxykUH5R5ZPuUqzh+/I3/AEtugOiMEmjEUALZVzxrx4oFa0jFsPi195BO33zNHtxcPMB1NK1amrDIkDjnQYstkVVoVxJZu5blt2wbbCtnb9q0jKxWVooGqR6ZsRxovPLFCfcyS0Kq3O/upfumJMu7bg5tyqkVRKZIudRqGfDhjRVJe4TLC22D/t/xT7FdAv77SbkqKqpyyJ5UGX8cRs5ZFEJsi0nkkW43ELmxsl0ROaVdwDSqnPNgT8sSeqgJgrX3A31N13X7K2m02tmxaabMh5HpqGXMasaMOOFJF3TIKZo6TNE4AtFBtzICO4tdJZfXjwxZBIPigfb4zc3imJ5FH2wP1HXXMqcxTA1IloF2trLcMC7BJGqZzIaBRxAI4nV6jBbRElUtbarSDbtrmuyCtze/pKSdAK8OliR+GMttS6ugQixM0rkGa1hjAZIyf6pqispGWmvHEWWVJJsq9yaC9k7atbOVaSddTKzUqCP+XPOmZpiqS1InG0xu9ft4FaSRpHaJCoZEUcQTWurnzxXdF9S157iF9vjvHMsVz216EANTGBmhNQVodJOWWIvQepHbq7jZkiYJBDdapo5IzUOQKmgKkUFfhiSINjttm5SXGmIukltoGVVLqFNSrDgQPSmNNLFNkMvlXin3duZhG6up1FkZamHNhRaFcqkEVxNpMgUruO2tazROLeKk8RENV0IVLFQQCCFzXicV9w4QxTJIURXBJJ7kclAaMoIZWzpSuJplbEDvE7JM0YeERlaNWlR1B+NaZ0GJpoQ1XmkLImoyzEardO2oJVhQrpBNK5H+OGSQwS9xtZUxs8RpEVHSunpKaiBzzAHHE0hMRdwSGNolQOy9uZ2JIotAXANNVTxB5DE0L2hUkrxsnacQ3rMQ8bAMGZgAhFK5Uzy4YlXQTGqZOuMyKdM7Vcr1ZpxZQTqpnlUfzxNEWFpN34pIZH1RSCRyUpmVHSoUZ8fQf34lBCzYilfuyIWDJIp0M0YJdQg0laE5k8cNFTYjuO33D20Ah6QVBoDSlDTl8cSTKb1EeguQEVqrU14ZetM8TRRAQQAaZGh+JrhyRagLI49OXDPCkR0KSCaGi8aCv88ABorUUGa15V/HANEh2/by7xvMdPcQvEDmTnShK19OfLFWTJBqxYe7VllbftSK62ujtRSooELNnGpUk0PCjZ54xZLuxtpWCa2tm1slHRmnQlhOyqQig6alc+AJxmZelJJLS1ZFJtzoki7b9wqGRvipIPA0Yc6VxUyyug5CMRXP3KxR6nrNdd1wwFciSOJoeAAqcNIlImvIooGFppMdxPqMjjrRWqPpUfmNcq54bepCzGW5uRJcLpmluUWTTczKoo7OtF0AUp6UOGiEjoi6ILVGi7rpGzlXYBNCGoagIOXI045Z4nApG5CHluI3dJoSVmaMIKsK11DhWtaGuFsA9QCV5GM0yRtoSRrdm1NGi/TQZ054i5GmgyWdNRme51SAUWONdMhrSjIPXkw4YmtSLYWJiskSBQJLaoKtQxoxBJkFBUkE5jFi0QgpZUhkfXKgjnhJiDCpQE9RBY/mPDBAAZGURxiVDGSSnYI1AAkdStU0AH4YCIYHDtWNSI/pcqFLMVzDioHPPDGGx3LgRhEWO4mqJZ5AM0H5VrxIU1FDhoiwtZu/C8cTSXMUjgWySKNAVRVufED0xOAkRS39uI0kSR0ETMFcoS6ilCXauekZjAkRbEE84XRbRjUAi0qp19snVqAHHPh6jlixIUjRqad+0epVZRPMo06UIJCtU8j6c8sTRW2JjHGS6XDmBoyCZsncHTRNYBzrUUOLaqSNrQWF45sItQLu8ijN+8Riitw7BlWn1FiSDq4n0xsx0jU52XJJPI1SBoq90o0afeTH6lWvFT6EilKYvSMstsGzFXMs07pJakCKd2Bqi1p1ACjZ6achlhbjT0DVeRY+7pQpJIwliUVVT9WqtMzz/lhiAlEdYYXX9NWYlVIEugVUivMkk19MAg+NnWMTLK0byOqJGD3FRl4hiDUihHEYaALctHrJYOryHvRgdzUBQB9JGSknCGGTmYMhZkZkak8SMQmkmgzAJNeXpgRE4kiaoniUQtEWFrK5ZVVeHbYseeFBJA5EdZCzBY9cRKqDpBcD8j5VWgpgAJI1SSGIiK5uFUNaaaqVGdS1Knh/wwwk6yPdRyChaNaTR0HU2VCSx5niBxwgPKqNoZk7rsRE8Uhq6soFdVfq1DjTCBHFKPqMUcizO1TGuTTjMFFpXWDp/lhjOOwWdFDd5Ix25p2UFSPzIacAOHrXDABbpB3SXKRqwkcZEinBSvHSVPHAI83SoD6Wni1GS6Y1MSMtQFAGYPJvwwAclV5JUadiJXhBjQDUVWgFRnQ0wDAFVEXbiqY4x3AsmSOTkKDkSDU/HDEcIi76SaUcIoDLWiysAAFC8MjTjgEAjcG9VJ4wknbYxooACV+tedKevPCGdUOgWJZACasI2Q0RSOoUAObCgrhgVvKDGXkVriRQf1SJCdasKKHqAKiteGKEXMLXSB+nNpiKBZCRkQMqkD6qcKfzxIQZHqM03cMksYj7gZxRkFPqyOfwGAQSDcVEgNZ9A78ZzZkbIEVGZpgAVSlJHQyEPbyxdtWYUNQK6iBQE154YAVVkSKssk8r0ngSoJVKZ50JDA8a4AgNctKR2daxvwVydLMB9TZenPAxBusFJS7RlIg0dyigmSNhVg6U+WVcRkACRkAqzaXk0SROerWAOoMSaA8TXAMEzhHVBocPrMEBWgVVzY8KjUeZOHAgTsyaTHG8ncZI2tyRQnjpqOZPLAMEAY3aRImSG0IBSoqsjH6QeVP+OFuIDrTUCVe6gidiOy2p09a1GZPM4lVAw5mluLoNLGZIwySxIKLoZcqBRwA54BMDEQQhtnKi46pY6khAprVXPTl8MIAUhWa5DMw7bJ+qwqDKqnMACp/AfPDGD6mleNdRcD9GpJMQI+ilflhNj2FUkJMiRzRCPupol5DoPJuGfLCCSZeK+Y7z4zfx31gZI4mp37aVgIZNJIVW48RTGXPx65VDRp4/Kvhco1x4n5ttfltnFNZyGOaFlN7trVDa6DV9QYEAfDHmuVw7Ynpseu4fkK5l7SXNOxK20ciSRVeRHlGhgoNC3ImtKj44ws6XSRJfSN2KE9+3uio+47eqJ0Vcy4AFK0AqOfHEkyEDLNG0XdmVuzQaA8IbNR9PayNcsiTw/nhyIiV7b90W5RlFGcRQj9IFQCKSOoPrxIwIrsiMz9oROjM0aoFktYY3FYpCPUZFRSvPhixEGiNTSkwJDJKk8yu0ZCg6ZKDN9SZj8eOIkWMspWGjRrpN3GXDIxLawSAFDZAqKgscSgreozoUa1ECRNA5rHDbnNWd9Ws1Arqp+HxrliT0I32Na+6e6Wu2+FeG+MQzR28Wy7dam0t2jZxDcyqQ6EHOgWtNXDj6Yh2y9DBuyM7LYvvHh3ie7xwf5bZ9ymtWu1qojqc1CmupWA+qtRnli1qCqz0Lg8lsIE8X31keO13OC3UNBCAJFIBB0nVThzwIKmPva3ZINy92fEdr7Et1a3u8wQTySUVlgjcEONQoHGmhJ5HFlnKHk2Poj5NLbW/l9pFtV1Kd13TeHWxSdO7aRWm2Rw92aiAUZnLUrwK+mMmi1CTAHv35btt7ftsMNxMm3QSXHZZXZ5mBmeaXtvmQzsQCGwY6N2kknoKvZbwaw8etk9w/J4IodwSBo9r2mrOyxyVBuApKhn0NSpONNrwUNO3uJR7geZS+dzWm33qNBsWxqsfjXjcYjAdpFK95BQ6mYUq3Lhgq51Dt0F0PtdDYWVl5B5jef6Bs84KQ7XZlZL2aq0aMxjq6wOonFySRU7Eyj8R3K/tRawWEXhfjOgT7ZPPqS5vjGTVgzZxjSanLTmaV5U3LKtFTeU7xsfjWu02wvfdk9ya/jbqkLZCNNQJNCAdRyI5c8JVtZlkoy/uu6715hfdqyhk3BlcvPL1RxPTIq5AU9NaEk0oOGNSoqaszt9CSbV4BDtU63XkUq7hNOem1Q6o5AVBzIICgDIcScVWysnCCty8ohsFktdvjN2dJBMQ/pqvQRE0f0PWoNR/bhKjtuNQyEX8953Zr5ibvcdLd9yqrFBG4URkA1oUzBpnWhxdjokJ+0efFtgSVbnfdwulggZQLASRh3uFQ0oWzo2RPL44syMj1G7ybfVm772G5S7ZCdUMltFXXcDUNRjYagTQZlhTlh0pGoyAbrvNtsWyNItsiX+4kmG1OcsZbISLp1AhgKknnlwyxOte60ITbKeaGVJp7iYi4ltj/AJ6rHus7f03Khs6cz/HGxaaEVVIGl2ls/eiiE9xpMly5BLLrNP0xULpI45ZHB2oT0ehwxT3cizpNLcSJ1SSyAkdkEkDU1NQJrQ0+GBtImlJOtg22BJY7m9cwtIokZadQA/IApNQ3E5cMZ7uSxVH2Um/e6jh1MDKFeUtWNKEAaWpTIClfwxSWJDosCRdnsMoMkbxy2kLNp1qKM4BqCKLXEWy2pIbaJf0rdYBC8yI8dxNTUSCdIIrmSR+OKbNehbVEi2xWi+2iZPtxCp1zMVYqxqSzGo1KxNBXEGy9ItET3BgRVDSSGM6utQpoKhmUgEA0pUV48MKRMgyXiRMsjCRoCO1dih7Cr/77RgBQ50FRgIwPW1XiwXCSNKsxaI9tmUPJCI2oYwTma/EcPjiyrIOkltbbaxz25klRGlcLJEpP1K+QGQUFaY0optUgvkHh2cryFnRVCzwRLWRStWITUaUYcOWeE0JKShN82VdtlFwjBohL0BSKopH0y89Q4HkcRRKyIYXWO0kCosSyMYzMTU0B1E/AZ8OWWJJkUiMXrrqlgMjSGBtQkJA0KVpr1Ag1GVOWLqCQxi4M0ncuLozRRxUZjUEov5gBkTkeOeLogiFiX9IyyShiwESTRUM0qtXtHqy0ihqKVxKBSN63NuiiMq0TxMT9wCKJKMiRma1plh6EWxFdSsJpBINUutWmkU0JNBQinI+mJorvaBLAZJVKRsmkDuHX0/SagZCvE8jiRWrBM0hWTIhWfOQ1BCtXMqw4n+eEkRdtdQHdcBodCmldLsoLBTmaHEoH3CdomIyHUtdWRqRxrT/hgkpdHMhhtnfUUhIeNATTKoA40/nhyK+OVIdNs2421hDfyW6/aXr9pH4nUppQ14VIxZGkmadYAx7feyxrrPbt1qFDnSCAc8hxocVuyRfXBZjvbbKkdTIKyK+kRkNSh4GoFc+WXDFNshopgSJlYbY8cUFtPb9ypDlgBXqH5eRy40zxlvkNVaQif21uvcWaKN3gUEvEKlWFfyFhWlRwxls5LkiR2sERf7ZHSQrWR010kkYipAbPNa5inD44jJYh7gSzkB7k0ja7fSUC61FPyBDTq9DX1xFsmKI7aGa1McZT/MyKl46qQkUaH9NlNcs8iD6YcwJjTOH7ccTSFnleWS6Zv/aJTtgqVFSaCowFbIxCGDIbeUXDW8gjMJGlWjUEawuRr64nBFkjt4WMQKxBiE7gZtYqoFNGpqUFK58CMOSEDY8UcaMJAki0Co0bsztHq1FVZcqDCGKhHNFIFUkWtwQYxIR+mEFEUk1NRzzwDQXcToVjWMnWnSr1pU55E8hUcjniaE2AknLyGJWVTMR3egkNpHUh1VoQSSKYmRCGlLPGJIgYzVPtQc1X8ukA8OYzwKQYIESOIwskiB2E07ahRWArpYUAUgU4YlAtw+JmkUUciUMRBCzdaIqjJWOZrWmBCDmkMoKiN7hLdA/bYEaGBFdNKcORwxwFyymJmmErTEsJLcioaJ5DwByw1JGRE8kgl7sch+1kYCTSRqR1P1OlKZV5/HFiINjKblle4lFyvZmZ4wydWjUc3qeoClaD8MSSIMTvdS0Fm8iyx24EsZjZaSqaBV0EVr8+GeJpEGyW+MePiedby+t1mGr9G1OpTpYEAknjpONuOmkmHLlnRFmRJbldb9mPtqQhPFynIty/HKmNSRlFKSudLiB47mWQERaiFofpYCh6RTmMAjspCyE6WnltmrOoGmNi/wD7Qg8RX044QMPDSMayCSKSakNqqZxpDlnTgKnmcOCMg4u7bwsHjV51rHHLo1NSn9QE+gwSCC5G0OIpVUK6AVUdEbcCXNPwJBwAGzxgOXaQSxMumtCKAcSv92AD2m2V0/WVYVBaKJRWSIgdJ6qHqHP0wIDwLuc0BjnAcrKADCPp1HiCTkatgBAO51aboF1AeOF4izo2mhJUAHPnXhgepIHBodCsd2FdFYtJQhu0tKKrAitBWuWEI8kspZbwAPG9DPGKa1WlDJpU1qaDPCGdJudMzuGkACx3KO4DoBUowZaAVHrWuAEFSsIuwwHXARGZiCug55VUCta11V44kMCxaMqvfMywAxzh9QJdxk1D9RBFBTicIQORXLwK8CRilWjKkRldNBrrQlh6YYpCRMulZniLqWERQHS0apxahFOr44ACpmil71HeIow7LltRJoBRdI6acTgEGyGl3O7S6hNF2Q7DVqOkAgDkfjhjEzxoqTIY+yyUDdurlW+AHAt88EDOUgZHVgyxFe64qxZWz6lAFSeWeEEBwUq7yLL23kottJLk8oAo1amlCP8AxXDEViXMIdFjYtMaiUkqjKACS9KgqvpXFCLgNXZVkubbWLyghQvQaQ1OigyUmlK/PhhtiDHVhFI4Mj/aSVSNxQtUVLAr1EV5c8AmGFhGLfWvZjjC0uVUtIrE/SFPT0j15Z4YSeoIlidn1MD3TKnUmkE11Dk3oMABiqGlCRxkRTDVAODt/jAIyp8/lgCQ1Vj1ylyJHWrIato7Y5V4gV54ACGVNEkis08kYHdlWiyddQCi5asshhEmCkMMncM+nRo0akFJRQZUDZGp44ERYc8kamJ00mRYiRGasWXmzkjPTl04kCBxO3bt0WcRMkmqdRpKPC+ZYB89VaZYAArV4rYzSJbwRyyFEkBEhKmpNQSGoBwOEkJgowjsZIoC7P3BFNEzEyDiTpFKfHL4YewoOlWojoUniuPrijJUjSAKBsvpzJPP5YUkoBSOXaOKGDXJbnUhY/UxyJMa/lpkKYBBzSq4SONVWZ1IgZDR0ANWOkj6qV+eJCDAzvKUtk7VyAYneKn05f1a8uZI+WIkpORtcRxvRM0yI1UOo5MSMsmH/lgIwHdxZXZyp+3kTRbRmulSCK0pw/HBA5gctp3a82K6t59snlS6jIMbClKnS2lxz9D8MVZMSsoZZjzWxvuTNX+De5Fl5HClnuL/AG26LGYnjc6UdGbKitwIJrkeOPPczx7rrXY9RwPJrJpbRlkNGwaeASdhDEqCBgQshpn1P9NRxpjlNR0O33J7DXcMk0ckUcRWUoGtIRU0lXMyI1DwzpwwmKBlvoJu0t5DcC4t0jPZcGqOE+ruU01ZgchTPhgWhXJE9zto1VVmjkAh1rI4XtyMZBVeFQABk1OOJpkSMXkTQXNw+uNHuI1itnjGkOpHSVU1NfQn5YkkVMiExidZbeWYW82uiySIQupFIBHKjZZZZ4sqiDA7VdCLdbdDbm5mt49FzFqRlmoatQH6KflpzAOJOpTk23LZ9zd7/wBY3eC/luZ2mubaAwzTaVijVaqik16mK0FaA5Z4XZGhlSLq9obGTdfGbnZLh4pl3G3e4srfRVWubXU5TSNOnuLXTwJOC2hTeUTvebRb3xi+YnUd20IiulJEdV6lkA6lzHM4S0FVwZ89hvGy/vPc3scPeitLe7e9sKEzLcEqiBRXgaEinP8ADE25RKzlGnPIN4u7XyTyjdpZFhi8c2h7W0VlB7ZkXUQKDiSTXOuMy1JI+cu2bdL5r7gp2pWuZLTuz3U0gMUbUOuRTJpIJ0tialILFr735BabhAsNiglijU2mzQgikxQ6jI0h4hAKsDSvLEO1ti2Eez3KbLfwtoTct1hlDxdoIAJ20/SWL6AKhkGWeZxfVQyLaaND7M20eGyJ5N7iK+9eUXMZl27bJyZSGl0rEssShgCBTqGWXDLE++Nih0kon3N93dx8p3uTaYRPu17dH7WDx60GmF5o81iUZMgGeotTV9OJKjerJJQtSJQezG97tHb+Re51z2trtZGay2G0YwhWaoZ3mGbMq0BVaVXLnh2ydq+EVYdoEm8T7JtS3EOxbclptkYC2VsuhZJf/YgAtQMqmpNeWeM3de2pdatSrdy/1PfBPI90se3QTfqSRgBriaMEKY3AK6QaUB4YvrWCqxGElEpFttkBt5BGisluwZZPSSV6EauZNc8hTF1ayKR9tPBzahbrygrDCkglh2lHbuGb/E+oEnUKEnIYsemxFkY8n8vtf1beyt4UhjJjm+3yURZakjLUBq1KnmcOtZ3G3oVcdwQO293zdqGWWQbPaR9Eb1XQqNlUivE4s7WC1K93aSWeWW6urpLcPI/attTFodIGlDprlz+eL6KBusDRGsIPZmnlljK67iFI9ANDWhZszXlXFomkx4sYrSOQw29s91HPGe8rEr+jXU0TMqGhyFGA/DEGx0Q9RQXMhMs4Npbs5FrGsSCZQRUBFNCEoKccVWbLkkKxuCWwDdElnFHRWioAJ2UiNqHSRWmZ/upiHbIz1g0tz2EW3kdrpNM0qnXEVJpwoNNBXM8OOIXhEkixbIR2Yb7hlQEBpKJkmkUVYTl8q0zxQ7F1ULrTUBAwYyT3TL9tbOWBZagh9eZJNKYqs5LVMkktAZFVZX1TmTTPcuDpolG7A1U6jwBFK4iyyCXRTzOsMsbTW7Kj0l1ElYkyjjcEsFy4+vHEkGhGu5IbuaOPUwkR5boFi8Q1ZkrWhanrxGBkWkOtnKGNuB3IJI9PeAWsYUjTrAIzqDz44ktCDZZ207p27aNmlEy9YmjYlVINSCF5CvClRXFquLtkV3W6rO0kKGRU0JJDqAOo5CrCoHHA7idSC+Q7Ha7rFJWa37rrpUMChaQjUC2nIgAcKccHcRsig/JLB45ppHMZBR3HcUppK0JrTI58P54knIktCqr91kGoyaJZIwBAi50X8pbnmMx6Y14yLGRWKhpJE71u1FD/AJo2zJUcOn1xakVhEpDHUCBHIRJIiABmIqAcsqGuQ9MPQg0xO8E6iad0Bjei50KOQaaRT0w0ytpyBkgaqyKjano0cjUKkKBXjnXEu5C7XAEWc6sI2GgyAlHAHXr5CuRqMPvRBUYbHtMpVO6ujXXtxUI1itDmcqjEXeCTxyOdvsjJKkTssoKFlRmFaiuTE8PTKuIPKNYh5t9kkjiDRLIk611QuoLhx9aHgaac/jnip5C1VHSPZ4YlAgIU11JACaAUo4YkcacjiPzB9kIf9n2OzvLDedmm1aCiXe3syFqJKREzIOWlwrE+hOOnxbrIu1nI5VHjt3LYjMG1PIHhaFD9m7xaJQTWdKqVZvzagP44wZX22dToYn31kdI7ddIjSMHtxpHJbLHpKk0PFwSFOdCeGKLP2l9KwOkNu/aTuKO39duWoF1LQldIrUE5VJ4YqdoLlUl9nZ3U5tpHaMSTMHVIyenPgCMwpA4YrbJpD7DZxmRUkRRE6OaKKNqYmoy5Ek4pZJDq0UlsNOhoIwEMkhGoazktCCSdXP4YkkM7MrRg6dccbxBmYAMjSChU5flrxw4Gxg3PvKommYMsa9x2jyRW1ZlSD6ZjEyoi9uUle6t4p2hunAe0WgUtGRrfU3CpAyxJEGSG3kM8VuJJaRI3YVmBXNc8wK1FKEYcepEBcRO84mYdtZhlIiqQhQlWKg1qSMzT1xFqAgIZXacF4tayqWjIY1KV6TTMc8zhoJEAkkeWZpB23gykjjUgFB9RANR8sTRFgB3XBLQhFC90azQ5ilFAqWrlyricgBUxiKVwAxmo3ccUZj+ZYzWuXw/sw0hNinWurUW/zEcSxS2lySiMTToULXJQfXjggig6QGRpIJZGjjMYLSSgMzE0OlSvChw0iRwTh5VREL2zOyLGhIZNVFYnhlX44cEZEP3HdLfrKjJVJY/6YC1prqaiorXPDSE2NtzOpIhZxMlsyUZQFdunUWNDWgHHE5IMa1lb/PaUWS1mZSgYEhieCsRmMjx9MWIg3A/7Bsj7hKpubaWayts6qoBZVrUhhQmpyHpxxqx45cmLLljYuKKyitFihMzNFLGlC3UEK5dKKQwpTP0ONi0MTs2LZUjEiqq0ETUmgoQxJyJUEcTy/lhiYc8j0ZZYhHOV1xIwLNLnSONdIqSBTUOAwagoAuFJS3LGtzGTdkjt0kGdFLHpApnX5YaQMOEYdxIqllugIyYukAg0NFrWgrxwxQB0szFat3IW0yAnNM6cqZGlTiIQdTv9wx1CadSW9s3SWWhrqNTWlK1wADCxxlbeQdxEXWugkyAcdOkkn5/hhEtDwV7iUmYCUBqtJIaBVDABGPEEEeufyw0RYEM+mWe5YHXkJnJFJORUZVoDmMAIGjPAxK/pRUVBoGoyAmjZ8BQ1OXLBIwSI7QqLfpRXJkZBr7lMwBXPMceApgFImjMMkTtI7SAmqSRqWKqQaAqFrkc+OAYcphjGiUFkiXVapUgzCQca55Cp6Tw4ZYNBBcczpCsJdWd3PaFQEZcxqfiFI9a4aGzzqjDVcsxMSaqqP1O8BkdRGYAPLAIJEhZxKI11yuDK9GppXIhWJ+qn88AIMuFBaeMSHSUImhdW1kE6gsZ4Gg488ABDtBH2SwIZNPeljXQxpUR6cqkceJzwwByrExaRiXWUUjWIFeonMBsqMDxOAAoCeRZJVn7MgTSJA1FHEdQJqcuHrhsEgJkkQI7Rm4gJaJo0OasABVVGeYzJrTlxxEkBgaSQiNJCVlQKmo9MgoTV88iM6D1wCK3nid3hLaT9gocQJISUyPQxNak1rUnFNS05IQXpNbNHbuCO1G1XAIrrJHECtKHlww3qIMdZmItnWO3WisF11IKmgAYAECh6QfXPAIHOSsWvukXEqjtg6SsSqaLqoCCPUnDEzytCEh0pLD3R27dqUjX/ABSEHiSScsAAIhDKgikSQRx8esg62IAfT+GdcIJFNujPq7uUzLV6UOtqGjDmeFCMAwyihVSWIK0CEXCFWoysKkRkV41GXrmMABRfWio8VCx/QKLSToP0UaoyHrxwQKQyUuQ6IFiuZ9EqACrqFH0Go0jhkOeGDCfubdykxgIuGCKENQ1VyBLVAIrlTAAamvtmK4U6u23UQAsEjHUCK1Gf8sAjqRRyUYF4ngjB1xA63eSmSg9OluZNMAwJJVe3cTUuYiDXhxPSuoHL4jANi7vNDKoUxhS360irperZtmSekcScCFB4KslV1RlTMrPbw5dnM9RB/KaZeuGxAu2/dmOlA9yhESxkgBRmXWvEU/nlhIbBossqqjRoCOmVUU0J4KGbgp9a4aQjssbDtK0ZjMVAxVs9R4Z8KfPA0MUBKOoWWIyp/wBTaxAl2ZuBBamkk4UBIK3uJ013MEjNOkgpMTTqOekfH0J44i6pjV3VyjQvg3uo0S2u2eTFbiCqpbbqACUIFKPTM+mORzPGq2tTtcHyjq4tsXhSOa3WSwcmO8/VgmiIbJgTUg5itKUBx5++N0ep6amWuRSmIHtoLgz9yERTXcJa81gDUSR+oSoyaoyGIQSsiK3sDvLEZG0yTN3KFgAkS0H6oBzFOdMTTK2iHbjFEApMMvdeqTS55IKsrVVSCSBQVoMSTK2RrdojpjkSFA10FiSdjm6kav8A3kmtPWuWLEyDIqjaFiVWDa1UtU6ZI2RwlXYZk5afThia1K7KEWn5dJDc7da7k4KWlwsMZV0qRMhIqq5kihoaYGZEaE9rLCdfAfHt1S4S0vhuDmW4GkOmbLEy6h0gLSqn8uE0U5GaZi8ett62neI0EZls2+5cKxjersWeaMHLqOqqgcq4RVZlMe1ezRbN7yeQXlxFEkH2L97c7ZysmpQpQhCQEIBqKYi9EyQwe4V9/oux+4u4yveQPf7qINrvGNbZkgVtayFjxOVa+opimqkuRkHxCOeLbfKnuJ5IJd6vxF9mh6UVSryMhUggiuSn6svXFlrdBN9Ry3C5FxeRLaIrXVvot9osUqsUDAglyyjSSAeog0PxrnKq0INkp2+52nwWw+5nuLaXe1EjfcSMwW2TPKaOpLszZj+VMTWpFlcxeQ+WeeX1xZ7Qbu4g7vfm3EBu2rHplaSRs9QH0AGg/hi3tVdyCfoaX8G8H8O8E2+e9lWdL/srFum+OzNc3DK4P6ZatI1FMwa141xG2RtgrNkR8q8wu96f7G0jZ7WASQ2lvcuHt7dmqrmU/SHYCorT1rhrH3A4RBdh8Ku/IDHdWm13vlssdBHDZSrDZ7eGqVlur5v0oYyCSUQl8s+OLfkwiFrM95L4NYo6DyPyCPe7cP2/9D8fSRLdYRp7SyXExDuQ1atlUfHEZVWCTe5DNz3bY/FYithFbWaWmsvZ25D6ZBq1u0pWoCrQ6V4cT6Yj3SyxV0M2+Teczb7e3LbSZJwrFHaGUGWWJKU0sRmXJzFeAxppjjVkWQilzeRw3+6PdGO3kH2kMfbAumRtRVEyICEUH4YvTqCqRq/aW9kma5lnZig+ytwBSMdxQgCZBWC1qBTmcTqyxUENpZ2jyBJKz6tb94xdLKoroOo0Ugj6jzw+4bS2F1s9n9rc1sI5L4kyxJI2pdKnMO1QNSDP+WI21Cq0CbjcL9iQiqgu01syIqqQOAlC9QpmAcSrRicyJjIb9h3LuS5ZQRZrE1SHfNqqwqASPhgtoiSQ92exzQwGS9c26xy6pIVAkld9NA2kBgAoNGryxTfJBbWiZMLGO5itPt9tsHHcIaa4mGbUoOGSrnQUzxld5L1jgeooblLgzyRyNcrpX7eeOoMr8QgqchSgBpXFLsiytfUe4La9aSOCaLS5YClO3JpIq6qv+EVxB2LVUdItEqPNdM89xHpiEYkJjANAHCqOIoK04YAdSTRotsht9JaZlJEKGivqFHFciAaGmGmQagjX2ssgURxyPOokW0MT6VQrx1ahWtOVcS3IMHDc3EVtHAqG5aUlmYkhVDDSwYGhLGnD+GG2KCR7bvDLAYriRraSFRCyTL9IrQq/xzqDhdw4BPuzq1vE89ILrTpcUYKBUcRn8aAcMJ2FA6Wl/PM0CuqO0kbLbx1ViQOBV1oa1zFcTTQQMHkvjL7q0klghmkKCOS1IDF5WBpINIoQtCczixP0IMobetgms5xZujTtcpEs7dKksDqaVQK6QmQONFbwVxO5E5dtRe4kSVllIoNNNBGYZjwz9Bi35kg6hUG2yrIsnbVrZdT6nUUVwMwDTID1OWJvIRg9Dtxr9ydJkUj9SQ6ELNxUgVoQOGVMQ+YRdRQ+2QqJHhcRQlwFb6wGrQ0FMiRQYffImmLk26SIrLPHolcskoYalaNjSkZzzoMRtkGqjpFt6olpH2UiSRmaNDV1qcgFY56SuZPriDyElUdht2hGivIDKtqKGZKZjIqaV55GvpiDyD7JHG2tV7tl3Iu0zN3ZbgnIVFFCsQRwJIHAHEHYO0NSyaO3huSnceWWjySAF3LEhQy51HA1Bzr8MJPoxusim0FnbX9pe3KiSCGc2s6oaqbadiklK8MiT8KY28XN23Rh5uHuoxV5RtEm270hdjHdbgtO3kFjmgcJI9R0itEf+ONfkcaTVkZPG5G12voMj27oscqpOrRyszrIdZk7lQQRxIOfAcM8cmzk7CrCHCGGJI2tn0BAy60CkhWyIVCozoBnQZ4oe5NIlEFvUyrbh4URNfckIzVgaqASGU/P5emIyMdkhgWAxyROkLqGBbNwxp+V/pq4yzwkSgXvAIUhLamludSyRk9AjappqA4c65+mJJiGntozxWwjrDIR3OoniM2UgABVJzr8sTTBuSObhKswCXVIlt2JZUBUOEBKojA6a/CmJQV2khNtG8tza6pY0ad2aO4lcllj0nVHIU6VBxOCDZPNunVZJIILgiftnRIxQlC1MlU5E+h9MTgSkNmILSGkPZVyzBOpyVNK8aKSRn8fhiuwSNri4bU9dWpR93anUB0DMLp50zFCMBEbbhg7TSTIZ9B0R1JC8SVPHqUcTTPEp0EEaQ8IbVLGml2didWvRVqhxQqPhhLUGHI8dFe4Ytcgh4WUkVYL0hWXhlka8cWVcCgMt9SxyF5XijYLNqoHLUUkDPMmtdWdaYmtRdTyJRIoarPHrVxb6f0gRUkBhnqpyPPEg3OTMBM7jXpckJFqCNnm1eFcvXDSFA2MV64p0imFvnI+qjFCPpIAHw488Sgg9Bokch2nBaV41pojXUY1kFDrrTl8cNIi2Ltt2qS9uVhhLsyqVvDIaVjrq0qCVzAPr6Y04scszZ8iguuw2uK2hEEZeJbZQBJJJoY9OoxgUpWpzqcb61SRz7WbY4hoVcpPGbeKRC0dFDOgANSWGYDc/XEmRbB60HZE4lNw2kli2kuaVVQamn488SQg2eV3qZKC7RtNu9dGjiW1EZ6q5YUgd1aIqjX3kcSxd0alc0qz0zqM6ipwSIOjMKSo8RmjMZ7hep6kIq9eQHEDBI2e/Sjknc2+pHKvAdQqC301bmMApB6Wjmlje3a4CkGdGkFe5Q6V1GlAfhggYYzxR3KmSrGSjzR0oC/FVVq+mFAjvQEZpEdp5ixMbZZ0zJocwoGBochZVoraBwOoEl0p3CSvPSDlkcIQTIutGVVTtzMNRDEuXANAoJPE5ADAMMIlgct3JIu4gMgNQrac9LhT0niOGGAZG699uzIE1oJ5FYAmgy0gc29P54BCa2VnYEEFdVUNOtQ4NAg4E8jXBASeCUjNpJCraZmdw1EGrkwoafEg4AOxAdDm4DhQ8ZdzRUoDSoJqa5g4AE6ANO/YMmgEUUMdJdhxC5YlAgZR1bVcOFmtwTJOKPqXM1AJoCBn88IAwJMs5SeXsRSQ6xcSAKRGR/SQKTVvh64QwjRM8sUiSF3UAPbinSiiiBqt0l/UYYwkoGluBHHGU1juWpI62XOicvT1w2EnZon1XMbsqho66RpIZgB01OdRTIDmcRA4uuTok7WqGJe3C4oFNdRBIAoWr9I54YQV3ax1mla1uNckyK8ZlIKhvprMTUMoGY9Kc8U1LLBEjyvC8UUYdZGoxCZzkiq6FFMznSnDDE0GvDFpAVI1nhTuJZySaf0qZhwaZ151wAcAjGgNcIkqlC1RQAMKhSKUcU4AYYNhsifqXEVw4SWIoNFD0uBkEXTXU1Kn0wmB62ZrlHjq8Vwam4lIAY6akLr9DWhOATOqoeNHlikQxu7CQEhEbjk5IB1c6YBoCvcle3ZWVUHBQpJipUkk1z55U54A2DUo8ki9xgoKNbuT1EAHJVqM244aEGQmV6nSZIJm1hW/qKwFFqWNOWXxwC2BtNIsUkc6EPqBGujgtXpoRmQDxwpGgpi3ZLSIZe5HrIc0japAWnPMjnhiBtCrwrm0VulRcRIwJLHilCRT4HDAUpOjdozWpAVSkzvV2TIgLVqcRXPCCAuCAN3eloo9IPbYV00oe4WNekUoMCJAqRSrLPOFeKTT3WjIVSn/ADutSKnOg40+OJMQId5nUo3dnUKbOSuUcdKhQR6VrTjyxEQN3RR9qpkghKa73Pr1HLNRln64YBtvJKkcsMnbdlY9s6xoYKOQoQaDAmEnlVHa3jlcqczK7E1WTMqSakHhUA5YNCIa/wBkXlm1aUUD7p9GpuFaUHL1yr6HA0NBoBhmMgjQiNNURJ6ZajOME/lBNaEVxGB6FmeGe4W5+MtDHNGt/s8sirc2hYPoy6dBNCpNa5/I4xcniVyrbU38Tm3wP2Gk7K92vyTalv8AaLn7qFCwZBVXjmJrpZRnpzx5zNx74nqes43KrmUoDeW0cqKyziSZl6HZtJUPTUKHM9S5V9aYzQXMgu4R9m6Zm6Uuv0Jbdm/WVQP6bLSg9R6YdUVsjDWguYJ4lI1Udnt26IwqjIg6aE05DFygqsQTcIIluJI2aKYpoMt5Ih6kyoA3EHIjh8cWFd04LU3MV8esrhKSLYU/RmIe7RStehj+UggmnHniNjH1NCezNtNce2u+WcE0LXMkTzaZXzAiWqBTyVmQiuHuirJuam9v78R7Z455HLHKVSL7TetuKLIjkME7xY1NF45HOuHWssos+g27347YbP7gWW9bLamO2kt/t0FA0ckcrai8lQNRiNV410kVws2hKm5kr3J3W6ufCvNNoe6tilx5DdNEl9B3443UsxMQckdSqF5+vLGfGaIM+Wp27Z/EtvurmS9g6Hl3C0Ygy6SEVSZBwkqAq1y058sWKuohLYibarVN2naxS8Fubixte4zLa2xDaXLEEEGoUCnx5Ysqyq0MhgTcvcHd41gaaC0jbt3e6xIR9xJXVUq9dKmtFQcBnQYsT7SL00L72xrD2+gj27bF7pWMqrkrKrSOgkeWVgKauJzFf54rbdgSQWJN480vlsNn2yXdZotUttarIVSBB/XkkuCdAoKEk8PllidKkbWVSZrs/t74uIJvKNzT3K3zomj2G3kNv47aRJWTRdTkB7mQEn8wBNeONLsq6FMS9CLee+6ck0cg3TcYNv2K2Ilk2aAfZ2aEqqoVtYzGJCoAGo4zu7ZdTHBnPefcXXFNBtMMzCRna3EbaLWVzkFD1rqNa8aAVxGlbSXusIpPydo76WUeU7zrnsiFG22KpIYCU4UD8DnXj+ONNaWWpXZoarYWV9bUtrZpbew0yJCV0NK0rcIotQ1OEQ8fXLF3vE16CXdbiK4UJdW0dpZS6ordU1aISaM0kNQqtWvGvpnnhR6E0iO/dbb/AKfHNHJSSRtED0CywpFmoGk0KE5VOYPGoxLtZKBvbcjOJrVIGlMoEo1A0LKKuZFH01yJI5D0xJVSGK7PZJtxgBvmWyFyqnbnkqIlAPWrIgLUOYGX8cJ5FUmqtjrZ+JQPJI8ouL6VVLhYSe3EyVUo7AZgHmMVW5DLFgJfY+I3zNTbysCELFNbwxhZHUDrb1alaHGe2VstWJInG0eDw2sqiXbWdy/fWaOsi9sUKCjMCC2k1AzxB5FOpYsZM4/HI7mWRpYVgnkOqKIEa3QCupeIFcwVpxpzxHuRNVHU+ORBJZ0nlc3KkXEsgUZUVqUK5uDTh88IcCddnvLWSKdO3FFGiM7gCi1pqUgmvUDnn9WIPRkpFVxtcZYtc28dp3k6o1KoY2BA1jP8y+uJSJMjE8faBIaQW7K/28sgzDxiq0OZzoaVPDBIPUYb63vpYYYnn1ISJLdK6S8rE6mB4ClM68cTTKoQ0SqLeculH1ua2gLU1gEFg5FOnjlgFA1tM9sAZSFzJneJxWTUKqVIJzArWuIjFUe4zS9gTUELRxhY6g5MKL2zx4ZnABJLHdkVgNDGfSRAyA0RV46tOVfSuJK0EWyYW+8JNbu2uVImkDEZakK0p1qvP/zxZW5Foju/7bZXSGaOWSOSzdnjdE7jKWQEodR5nif5YlJFoqe72WRI2iNt0uv6zS6VUk8GTieOJdxB6jJNtzRIZVdWUFY5mUKF7gyCMoPUDSmWJdxENewdZUDxFFuiFlovUS1K9AqFrXI4QAks44wYYrVnE7UkuHVYyojy6AcyORPzOJd0CgNtbUNEiogcoWAspCQol1ErI7UqFzyJ58eOErInA5Q2rSuU0iPvtJCgkjLLEh6nXOlCGzBHrliDsSgX29lKIVmuoxKpk0C2TNJBTShDCh/DEWTgXW1hGEktnUolsoNwNfUrgg1plkv8sORNCsWss0aFC0cZk6pVYVjSo1yU6qqTQ/CmWIsIANbx3kElu1sv28zOiKjhRLro2TUBrQVNRXMeuLaOGU3rOhKvIYBu3gPj3kpf7m72a5W13VB1BJUYWs4YUI6lKSVPrjt5F83BPocLF/k8iHsyFMssssSsGVQ3bitwMlaoVWJP0/8ADHAbPRQO1lbMgdVRoZ4Fr2ok11cHqcBhkcwQAeGeKuoVRI7Tb0ZERoKys2h7laZ8CSy+pzzphyShjm8ZiVraaJ3DLSCT/EoPBuVOJwDaEVxHKzaDMWfV2BCq0pGRqJAoRUnD3YnoN1/VpHK3PZEIEBWQUV/zELlzpRsWVRCCJ7kTJqk7bQw2+qUxltLUpRuJ5EjhiU6lViExRKl4LSFkgjuriP7NmNXSLPp9DUMQRXjiwrbkmNnoFtatIBEstwYhaSBmVSB/UPOqihIrhiTHm5RWlihtwDcyH9dc9MpGemgCrpH1Gv8AbhNEhouGiRppu2XXuFbeVASvTkdTAgv8gMRgQgZHAQp+vEhYxzAB1Wgq7hG+PD0wCgTyRKI0YR9qVEd5ERh+o7VIIBOfxWmWJdo2guRmeMwRQrCraRICNLy8K14UIrgQmCdoop2EbrIc17rMNLSH/wBmqUovKvyxKooOtMIIzHEFighZY7hNNWLtnrWvP41pixCQlu2RCNUYnTRUTKeo+jVHInjXLE0Noa7hyxUAnRJGANekNLQVyqABpxJIqs0AEcpaSITQid1IZhQ8hUPXnkKU/DFlEUZLFieN7laWifbRW5BXOXUVMpKjiNRrQ/H0xux6I595ZOBdQShUjQ1uSXktOsIq0ALMzZVrxBxerFUCvPQsp7glgoIbcLRpTmQCSfTM+mWBETwkjCIZWesTEwRNxIGbaQat/wC9D54cwMAZZriH7pEOjUzRwglmXT9YFeqpJzJGYriLYmxU41SQXEdw7xBu3OzCgjUipGk0qDXBIhPFcF17cREIlnZFZqlSFrSM06flg3BjgksqRqrxIzGqLFSrAgEnSppl8cMAQZnWMNcHuvGfuWalWWtdAJ4EA51w5GDmMal4GLmEaTbxkEOq0IVlIrUV41HpgIngF7Fu0h7kgl0xLGSX5k1fPMk+mfPDGwsUDs0C6QSEgLMAxIJBBJ4qudBwwgg84SN2SKVHiWixEDTIjGmfr8zgGeeNHpKqMWmJjlj1Au5T854kgZ4aEFykqHWMCT7dgwmZR1MtAU4ZAYBg5AkfckLUEqqitGfqJ+rTyBwpAAFAkTtxIxjBi7Okll0kHXx4Upn64AAw0kj7ciKRLxnodRAOda5gCueGByhjEhqLgB2W25AKaa9UlKZAZVGGIKiFWXtCMW841M8uSvEgXS5JNMmplQVwhgeygjWGO2dZ5qm2ikLAqlaM6gE1rTn8fTAI53IlkUQTM6aV79wrsDIF6ilDzphgBEWaEBo862LhSzhXJ6W1V45H/wAsABLh5O24h/R1FWSMUZi/V3M/jU/E4QxUO2Xb9bvxINEYr+kJF4mVAKqaDiD6YAKyaVaSW0aNG00idxPpAWgoV1AEH+zFCLAKhyjdkGl5OVFwDUQqCK0+J54khMMYfpl4YykjSBbdI0qjsn1MaVJqOI/vw5ANhiMjPHBPHNJIElAkOTHhpSlacT8sABjMy9u3WbWVOp5aErViWGljnX4YNiIFpRCZk7ZjEuppblKMAXpl+OdcA0Ddq/axtETa90ZMcu4pzdacOGQGBjByF2k7phcqgoqoepGB6e4Kg860wgPMEUGX7sFIqq1wF1N66SCCBTKhwCYXLpjVKSmsiaZYCQBK7Z1rxHHDAURNGZFZNJ7SiLTr0urmuZHAqDlU4ACoh2rm7mZFlVen7mvSGOXWK0pWlKDPAIGzWyG3mKCR1FQiNpUjixqRz9P7MBKARMrRxOFQ631IijUWLE5P6UwMR0zTwMkkbSJUMFZjTWh46+IGfM4EAomp3mRIAEdVZIg5TryqzacmAOWG2AQpkkVoyhEMAYRqgHUwpUEcTU515DAgFKGFC6SxvOyxap2iIDN8WIOY+GAicVY55NYUBm+uONdI+AHw5HCAPQPErwwkO4JYI2YNBWmeR08czgAMh7koSS2l01RlAYEhSciSQRlXga4BsNTUFnkVQprqimQ6wGBGsUavGmdcEkQVsYhM9ykzr1h5JUoxWozBTnw44UEkya+I75u2y7lHe7bOWS4IWJeoxyowH1gGoIAyxnzYK5VDNODkPFaUzXW13Ee/QLeW8Zt2jq1zFOodY6gnScq9X9n8/M8njfKseq4vMWWpHt926W2Ecsyl1mmKyaiC6MK5LQ1GWda4zKxtaK+vGeAzW91BIY5BWOVFo2kitABqyPGtcTTKbbkGms5Ld7mUoBI9Fs3BBrHUNp0A1qRmTTE0yq09ScvPTxeW2iYJrXuS3MgZ5JG0kUQ55AZZ+mCyMvbrJb/sPdLaSfYB42s91U2F6ygiI9wllUGmkEavpy54a2KslTVPht8uy+KuZo4rmCDeZ9qcMNStGG1BVINAeNMWLRGRh+7Tx3cLeOzTRmAxfd+O7tI7xoZZiwMPcNVIDA6l44habE6qDGPurLND47HtsqmWe63SX7aOJwELPLVwKmqhtX/DGdPtNK2Kp3y0uPu9u26S1Ei21kTuLRrWCKNTqVZWIDAgjUKV4DFlW2QfoQzczuHkG7Q7PtdvK9lfaZI1ZlpHCumNI2CkghQlSTi5KCuUtywKbf4xYblYBrfvqwF9vURL0dRksCAgMTzIpgakRGLOVr5Hnuphtu0EK9D9NwpB1OKmhYkVzGf8MCr6EnsIt99zLTaLCfbtuhbbYRnNaQuVNwUXSjSGqnqBrpHSB6YtSK4ko/yH3V8j36m37U0W2xrO7Tzj+jIVj6UKUckqakMGPGuWLVj6sim9kVys+7Xdw7SDu3V5rCjuPdPRQOlQxYaqn834Yn8K6FsQPbeDefXtPu7B7a3CAtLPcJBFJTgePTm1MvlxxPuXoQi3Q7b+21nCbk71v1lMLdiVjty8hWR2FC0gI1aRVRU4nTL3NJIjfG0pZPvLPbh/FbHx6a/3CxuvIN2UTWe2uH/y1lEpPeupXKhVZSAoUinxpXF2XH2KWUYMzyWhFN3nj4+5jtRM9xa2yuZLq0LXCFgR3NAalFqCU9VpXGN5kdGtNB227wXcdw+5m/0+KC20pL2ZQwSjEaREQxOdanFb5HoWrGTza/A2QSiGSLuLHoEilXWgFZAAFLGgOkn0yxTbLZl1cSJBY+H2IhgJfVcGpktlLqjhunUVcEgBchit2Zaqkq27ZNks7iA2tmtbiMxLGrHTIlARTUBkSKk1+WId0FnaOEjJG8k5HZlr3FXJZEUZMGZM2FQK88DsECpxLOlmyurRMO5FLp1u7hiGryXI0OX9uIzIbDjDbyKZJVmVrVm1OjFgwDNTTF0/UpBqKcMBMe7eSIzkJURIALfsgFpJVWgArkKHpNc6YkmKB8iit5JIo2pBFOQUtnAp3JCKx10igyrX+zEpQEY3q3iu5Pt4z3JTWIdg9XqokZqasuNeWIsIIdPZCJyyqPu7dhJoGshiq5kqaadNKg+mEmJrQLlspnUEzCGpJtpJEAL6Rnq05amoBWvDEu4gxouLAXWm2dGtin6skSDWY2AoRrK0+I/hh9xHt6kXuNhMSLdExmGNgZI1H6hqVBWtP7B64cg0ME20SyBpdL63Id7iQFVcMfqBoAvID4YCKQXLZX0DydwkCSPot1bOTVlVhTIg0/tywNhAvQ3NrH/mJmjhuGWNJkDFiwPUorStMCYQSNbq4uI5C4WWOzChrclhqVhxcGmQ44skjAiu0MrwRhe1IylJtIzjjbIHUtTmOOGrEXUbm2RpJZouxDdOFU6FajqvChHEBgOHLjiXcJ0QgO0iWQlS8kh+i5hyUAnIivEgAjCVhupyGB5C8tHlWGjxSuAT26UBU0NKnlg7yMAorEzHvQx9mdk7aMRWPRJkTQdJBzwSCQojs0Et2qqKBSJRm8dSVoQcqmg5YimCQtjtZI9aySq4tkUiNTpZ6CgUErTL+eCSyNBQlrI0cp7KM8UtHWgAYOOpGIAHDM/PDkAyCyEEjxPCbd1NBFXWFjcnRRiCOk8v7sRbB6gtDRt9u83THVKOAATUEOcxxyXLEkyFqosTwTbW3rYvcXw+aFEW9ghv7VUYntuwNrKVBUfnaKpryx3fH276Wqef8jT5eStyt9vtzcWcck1qxZECzxairCeE6GBoMqsrY4mevZdo72GyvRND5a232ysSiESEuZGJasqGiK1cxRTyxnLeo8W1qGlMMaFJZafcMgNVUj6kBzNCeWJJEpCvuSjNLCHW3ER70kjB43NdI7gAqK+lMSQmN13MpKtLOs3danfQ/S4WnSF4qPlhogyPy0cRqZskdik1M2B+oVNRlxGLdSFiFbjLDJEG1ta3dFidBU0jNakA1BDcfhxwJMpsRw/cxzQK2hDFOTbxIwGROTBqEU4VBPHFiREsTboWMUuiY3v20ZJFc9fAqdRoamrUPLhhsjJ5ZBHFbSCNJo6JHDC5AOuWuscAa5Ur/HASk7cKwMdyU0tZSaTVhqVeBVxUVNTxGCJAZriOOBtF3IWuFicCOJjpRJQdADUIPqedMKAkb3tlClHrI1uhdpVUgMxFQwFMyafPADCO4RbDUdSTKX1yHqY1pmoHSWpxwLcRx7lU7xkAMCEF1I1aGCjSAVGdT64kgCmY28RtzIszuf1JcjQGpJoc8xQEYsRCRpuq6dcc2mQEJE7N9VR6ciAeHDFiE7aCYQkyxo86OzFRPQNVS4oFFeBYfgMTqii1h5srCO+aVq9ueBsgorIygUQsBTV88acdTLlsOMNveJGwZxWf6lRtRqOchyK5imeL4ZnlD3Z37opjnSVUjoJQGJZgynKhAyPHM4knBFkrgv0/SCzyTxIwNydXVXgoplSnwxPuINDqt0NK2jyd4RJ0My1pGQa6SRnU8q4JFAISqI41KnsSVUXUdS9B+UHjn+Y1xKZEKFhV5Vjkm7kLHuKobQI9FaFSKagBy54FuAqlRJ47sQUkhcIx/LUaSQcslFBwwwOsWfTNEjxzkqVmgIJUrkxo1ekCn8cBFsNMSOLhZazLTXGGTMlvzUNSahuIrgHIIM8aCQzRzxoShP0zAmgoxGWWQpggAxZJNcsohMSqo7sCglHUjq0gnOoyNBgHAm1yXJjgfsrWrR2x0gpUdCActVPX44AYYVCvJKdSCE6IgtVWRqCnM6gDwOGKApDMVW5CqguHBMUAowA6VAApw/MfTAAfreOaZ1UModXaAGo1HKoOY4EkEDL8a4UgcCPrMCL2ZItRSORkUrKM2RWH+HnXiMBIJl7bQzAsKysqysshChlBKgHjUk0APLjhkWct2VmjkE4jaBAZWY9OrPpBGoHL+BwIGdD6Z6wxNA1yhEUMhTj/AI88siPTDCALRJLFDJVZ4VqswFVFT9TKCDlT/wAsDAKlWLtTI0smmJyUbVV0DnJQtSeAoDXKuIoIPHVKsbLbKkolZDJMSVSg4KQR9IHpiUAEs7mCWbUsssSBVfgsLkVAiHHNa1P4YAARl2KwSwpIb1O+soOkyM+eggkZcgPXCA8gicgOBDcRsjCSpCsVFFrXiXyBzpgQQV3Ris8UsgmcSKVjB6wzAV6iRqyFSM8UItYGULJAxFe2tPtmL0DspoSig8+FafPEhBsZuIjUSEQXIBnli0oFYcACMxSn9xwC3AiCHsRxTRObiUF4kAY0UENlpbI8xgGGlaTMDOpiugV7XFgHBrTLiDxNMAIAEYKq0jM0adCfQRHqGoELRTlzOGIMmW1a5l1B3qFjGtKfqflyFPnUcOBwBIYquKLc3LTLGvUTUMSpojCn1H+OWIjSORDtCKSaRoCjMWjZdSgV/NwDV/LzGGDCzNrkllY0hiRj2wASErXTWp6yc/lgFAfEzPrl6RKI3U5L2woYKQTTIkH54AOLLE6/oholkm0BuIiAWtW1VHLLDQHS1JkRKFFbSNKcSR/U/wCYAZEYUjBRyI0pmtIUmEpJ1uSpeg66/wCEjgDgEDeZleclVMU9GCVJUg5KvVwPI0wCBsXEaRDrlmqoi+p1LfmPAhaVphgjyleyjKgUW4IJjJLVBAbP0IIqRhjkGuiPS8RMwZx1JUEVqDrWooAf/cwCDUYa2cMbppH/AEjGAFZlGY1DIU9DgECSKokMMTKpIEMQZFDuSamNuJK0qflgANMcdB10uwxEy50YBclJXSOB54Qdx2K3m0dqViqMdckrEV1CunSq8QRlngaYjx7btayCFWFwDrVlFHOYIDZAcMsBJImPh8Ti5guIo6guY7i5V+6Y6HIqpBI49XyxBpi7tTff7etofefMdvt55E3ezM5g1BS0UqdQ1aQahlGRBGOdzYaNnGy2o9DW3uj+1c3Fre7n4syoWPdOxEllYMuZB41FMgMcHJxrLVbHe4/PnSx85fJdqu9vm3CwmtpbSTbCEkBj6+5FVe2S/rxrwxSnDOomrbFW7hY1MBgLRuJSuZ1SLqap1Bq0Fa51+GLJkquh2tpS9pNZxJC2iFi6AnI1K1T+BpTDbM7RJtgnax2gLCyJLt+4m4e6XUVcjS+bITTTw+eHOhRerNYbbucFz4fLundezi3HcFu4FVx3GlUaWkQGgIJ5Yuf8pkjUjsXlcUdg+23dw1zayyj7dpIgTDdhjr7eY+oH5ZkYqWpNIpz3I29tzuNltZ7VlaPdVe6ERA7hC1SSMngtOIAxXampOdCsfIo2sDut/O1Xs20PcwkRu0TaAqMKnVkpqRxzOFVjbIxs+2nx3azulwj/AOp79KTtdjbE/czpIxZXRc2VGVqBeJ45YuWhW3OoTvt5Z7VcQ33lt1BBLYxrDDt4+iDSA6poUEOwXN+VcsSop2E0Z88m9yb3c70wbOGtYbkn7ORCdZRuldKrRULc6DLG2uFLVkFOwg8d8I3zyS/jN+ZL6XcD2+9r1JbIDUyXDFgCCeQzwWsug0u3cvTa/ajx3aLJLjyK+tLqW7TVYw25KW8kaCpGoU0nP6eJxB2aJaPZB2473s23JNaeIbJbQW1nCYEnu1RWdgNIdS41Lp5FQfjiHcWdkbkNn/1vyKMR7tfzCysIpUS5tQ1wwkbS4iYuwUqBSlK/wwd0k1TqiWeG+Hxb95Lsu126RQ7fPKb6aVVHdSNFoxOmg/UYAEEc6Y28KnflXsMHPv2YX7Q33L3qfd/NvLLgzyW0Xj8EHj23xL0MtEM10EjVgJAHcKak8eGL/K5fi7V0K/E4l2q5X9ht8D21vPHCiNaGJhC0TA0yLMxjWtAeBBzGWOLZndpUmEKzQtHJcLIblv1NK0oEU5JGZMqEHhT4YhJckKEjmSdyyRtPJQiJqaY2YV/TaPIVORPLPEWEB1vGJ5FljVR2aB5mAKkqc1BLAkA5jnn6YjAxQ51NJIswSGUqsKAAaGXNUoeH4YIJCp5RGs02qJ2eVWOQU1pwND8M8SgYoSaBLhrsLJTJRGTUfqcSeFACMwcziLRGRfHbVV2PUMiepWiU1B1oakAciMIkKodUL6xDWSdRKZ6fpRrXORQMwCePyw0A8QLRZW7jSWzRCW2kQ9zWzMasuogg5fywMahjfLYPdKjPGsgt4WnqCWCrqy1Dpo2VRmfTCQwptslCPdvBE8LsJmYNp1qQFQEqTmtKn1HxwCgbW2xI0mRLYxpGGYBgTEG5Fs8waggA/PAEaDc+3famKBYmU3ZSNHYUUhxXQoBJJzyJ4j44bRAJn2iK3jiVSUglRlS+dKBQDpYI5zJHy4YZKAv/AEYNciN7Z1iEZzDhf0gMnVf+alcPQXaNI8ZEgNzaRhZIldrGNV1iUN0uXVmPCmfxwmJ1GtvH1t44xGkkXfSkcbVSNpIwdRYcqUzzwJsXYE/6U0Ztj1IigmRiGkOX1UPPIHjyxNaidQy22tbKG47kjRR3DGXuqrM6jjGAaUJY0qK8sOSLDo9viaMMyCGdo173cANXkBKyVPIilfhgkEpATbaGtpUmt9MKHutIMu4yf0yacOWnThyRaGWfbWykRPtpHcPrqSJFIpQqhpkczTLAhQFvaoSJnkqqFY7pSO2EJzqjV4V5c8TCADW0xLzMht0kBUrq1Kh4IaVoM+X8cGooBrBMpRJYVllikSGCWOp1AipGhqgUBzOIwMWS2uqWWIxS21tGgJTUI1JH00IJpWtTnU4csQOQdpwrrV4lUhwToIYCmo8OkZ0w9BAdDa5Gqk0UQDxzSAswLDqamZb4g8Pww6isiT+DX0tj51scr2chj3UzbVcuoJ7a3SVibIqGrKI2oeFcdPx+VUyJepx/KY+7E36BG+bbJtHl+/WA1CCe5/1SwhZBVo7gFmQelH1D54q8ri7Mk+pd4jMsmGHuhIsZtgDFIpW4IMUuTumdTqUcDQ5mmOcjrpB8cjxMrrKYjAwS5tydTdtyeDUqOHDAJhbzRxKQ7lfunWWFVU0bmoYZBQoP8cNERnu465VijaZ9HdgAKoK1ZSOWeR9cTRDuIvulxDokJLW7pqKVU6CCeC0zDHE0mV2ZC9ymYOhjiaREQJauxDnS2YBAz+VRiZVZjHDFplsddJYhONaEB2Ez8AQvUwrnSmJLQi2WRtq6be5t5lc3IVtMWWsq5BZ9RIXMHgRUcBibRGQVz2fuTGVFzI9ILNWj7estRqawCQRly5Z4i0NMXWYcbaguQJnKSL21B1h1eqlg1KhaUxJbDkj+5loGcyK8UVxORuBKBSV4qaKDT5DEWxyM82qIW9E1OshmarGjmoFa0+r4cMIixO5lkQKwUhixRzWrrnXURQgfM4YBEk+lysaKwXOOMqQWmzolQc8TQm9BPciIzsYwIllIM/cFHLjiQePLliaIDPdzwsxLr2I7jUCyjU9VyFV+NMSRVZwKbSK7uGaaAlZVTSUzcvTIg1oaUGZ5Y0UoZr3HV4Li0dL4zfbiOhFxqJUSMcxUfl4fLli1JoqlMme0bwlzKLW5hge5I6zWiSFqtqanCleeL62KbVgfI7KMwSNOWftkC3QComZVoodlzIIJFDlizcgzy2cSk6F7SKTrWuqrHIqKk9QI4Dhh9gpHNUCTTQmJllp3eodwRnpPb0HgaCnTkK4IFI5L9vFEsMsjRrGhlfMMhzyAOYAJJFeZGJJCYrWWTuNK0FF0KVs5VOek0oFzAqMiBxxENzysLWPVInblmYlHYsCwcUXUoP0j45YYQHxITaiQDrhV5bkqCjgn/wB65ZZUwxA0SVo0Mbl47oUnDnkfyLWhXMVywDRxFYkETLrDaVBZfy8dABqSOBOGME46u2EDSWbaweoBhxqVpTjwHPCkTCHEPajmmP6jBuhql1V8sjkcv78AB/ZSaDu29FjhHaWrdQSlWJVmOY4/DDFITpHcQoW0GiQTVZ+o51/9OWfrgYHotFXRlIkUlRKrHQGJP6rNUZGnAZZYQANazQ1OoCQkNdKAUVF4hU5ZUFQP5YBgo5V7kkMcuh5hqjmcc69WpeBOWVB8cAgMpaXXEmiM2pdobbSNIJFHIYLXLPIj44aGFydsfbSJSNI+pYxXuDOoBUg5NzrhiAvDAGmSUgXUxBUS1QKa1qCopVfpofwwhnV7ZliAlV10CMmeuQFWY9w55nIA8flgQMDCszaQhmgHclarhWYo4yiqa0J4UAzwxBMf28ltGEdlaMgKjcYya1DZDKtKA4QHGCzRyLbooAqVkYletfqqvHllgGCe46rYyRuFiH+ZAAPXJ8TlSprlwwCK3dYwq6RWSJgJmRe25Vl4LSirTmBilFrAOI+5BHXt0I0tGNJiDHVU1rmRxwxByxAdqB2EQcs0AVtVFXqCtQGlfjgA8NTRxSDvSgT/AKhU6UUIK9B5rTiThgw0SRSDXaRiNApazTTWoqddTq6tWYA54UgzzlJHtJo0CwlOuIdIj1DSFLAGteI+OAQDudhSe47zlCsomXSVqamprQH0/DAEBsMMcwtnS7FdLHXJ9bKeSClK0ypywD2OxwuYxGiuqyh2kHSzQ0yHVw1fP5YYjg6CzqGhADaIV4OPpcuPqJGXywoCTo7KRTZyCEukkRIqrMPqrw1Ejif78AhQx0tPKsRlsZ1QqyDUsYJ4ChFAafTTAAW79pEmRQhfJZhVaKoy0IQaDIVH44Q9wyIRi6L0PYYdbsKqGyJFeRPDL1xKAB2v3UBkfSY4nk1L32H6RYVBoR1GlOHLAOAYjaMXUjT9uedxVjRiT6gHlTKnPAROBJXSVIwEWc/oSEaagU1gVNSDl/DAIU97thXylMWlLm3RVDaqU7iNxY0w4EBVXedwhIGfad1AJdeciA9NK0JphAB6pQkTxpHRy1AaCSuRZczQ1HLAMHPL2YWR2V4pgTNCwoT8WIHLlTnhigMk1yXUgeBrU6AIpkGTxj8rD1Y8TgTHAphs5rxYXeGKaOaQrBSWg18wpoQPWnDEWM0X7We0/kO/7pbta28lrtzAub9x20koDrSoBqSeLAUxRfMqkkkz60ftZ9uIvHtzv2ktlDWERkLgAVlkH1ZEiv4YwXfzLI0UfamzdFyo7QYsF06WOQypX+3BnSSHSWzGnvp7DWvnEVz5H46IrDyMRMbmMrVbtGJ1rwzOfPhjjZcS3R3OLyWl2s+UPl/i+47DvT7Xf67S82+RkmikXQaV6VNVDE59PLnihJo6CsrEMtH0yXdrGZxI3c7MLR5RplkHBBVjQV1cMTWpGyglex26Ntu4WkAXRNoft2jVLSxlkeuQGngTXlhsz3Lo8HurBNj8n8cvrhfuphDe7YYy1IXp22qlQIwx5AfHEk5WpjutSvN13XcknthNFHdT27tbtbxMoUmVqa3qePKo5YdScSgyyvpt5ggsZbQTz7ddzJHdPKry0cBiCRwAYHP+GCxXqiE7zt19uO6wW9lZncP1XngsmA1fpEMe6GFSKHieVaYhXVj942eS73Y+MWc1xtW4R7n5PpSAbp28rBypQRWeXQSpILVyxakyDbkxv5Pdbn5VuTPcd22s1LQFY1ZwzRkFdVaVJObEcfljVjSSFqyx/D/b8tc7Yt1clmWRprgMukIXI0aFGdQAOOFbJOhOqhl7Km0+I2l2k9xa2khqhv2jHdYMM1VDprqzGoNx4VxCCztTZVe9eQNujmOxhm3CKKTrkjjIiDPTrMSDqatATWnxwnqTUIbLlbULaNufbvtwgdnlhi6oIGLcHClRKKDMA5V+GItKCalh9vBuO5W0AupYI4I0IsLeDoMADEIW0dMgXPjyxGfQsSaUF4e0Fsli/k3ld2hSGwhFs99RTmq96R2HMdIBp61OPQ+JxRR3Z5zy+Sbqhn6+cS2O2Xd7OYLvc7273a4Y5itwzS1Ir09BUDPHH5l+/K3J2+Dj+XiSHyxtEfRBGYoZECSNdzlmRqAsRGoFCpBNNRyxjbN6HuKa1bSywPIk8qr23askYBIBVSCaHM0/DEUSk5bsgtTaWwe3Z5HMdyQUOkjSEOTZ+mGM5EwiuFkmvDc2sOm4eKTSV1nI62UgVyouAZ13ZLOOdY5opf6kcknWlC1NIpTVUc+WFASK47gdyEwlAlWacOoIZeDKpav44THJ1biOOK3ZARBHKTcRuwJcqc1oKVArxphAlIstY5TErJbKttNIZGBfJlrSlDxP9uEwJNbKx0RoO/DaoROJlHcAPBBzBoKkemHI4HCKN4zIKxm1BWR2KKqSeojIJK0/93BJNCjQGgnthqhKsXMwOf6jghFNaEkfmPLCIpBE8cUoX9cJOtWmDIe2Ci9OuPgzUGROEyaRx7N5bcdyArGzj7VNY6GWp7mk8Rxry5csCkICJbZY0MaNrjsyUSNAAVMjA9xWNaAVoM8sPUWwa9qO/EdX6bR6bVqNIh1dJdozSpIY1rzGESgJWz7iJFI4EEkhbbtIMrBlFAwciigZCmHDCEAlsl1W6PGsFwugyxq6kyIx0t9NAP7cSIsQzbdEtyrT/qrXXApIaEUaiLq4k6iaH+OExQN0u2xtcx2sgSJwJDLb6wEoADq1UXhXj+Aw5ItjbNaQR6LBI50u47gyxyVTtl35sg1N0LyBocE6kGJ7iESN0PbTNAhRajUrq2QAzNdHALzxLciwIS3LCV2kNuIlOhOsdwZVIPCtchwGGhNDL22eaVe8baOGCkDLGBIqEkBWUDJmPpgTAQSoZxHc3VuqVj7cTsQQFUFWVkyqa5V9TiyQOxQW1vdlNK21sAoeJlOZUUWjVqxb0PxzwhHFjC95ykcLyhAIJFKnuRnIcuR/DDYgP+XBmFwr9yGXvMDqVXYKSpORAWp5DCIhn27y0mFwIFZDIKxrRFJB01NF1A0zrwxJAxvnCyRGeOFo5Fd3kiWoehb6qCi8CSaZHCgVmoEd017Fqns07c1mIbuxeNgmmZCe07DWaksozHpjTgaVkzHnr3VaLU9wuzeN4r5hFGezewxR3KoR0i/j7yBszXRMHXM/Djjr+Tp8zErI4/ib/KyOjIV+lI9uyh3lkGi5Iy1L9JDD8tR6Y89VaHp9gQcOz9uM1kcxzJGpZZNNNbhzRq8Mh88NITeona71TCQSqiZ9yKTJqJ9OsUJqfhiSERu8mUQ/5ugkuA5hAOmJBUHU+k/VxyOJopsRjcZHWOJlt4nPb1Q3ZzyWvURxArwJxYU20IdfTOY5QzNHMqKzxkDTx/5f7B8sBFiG3kKXcEhiJQS0mm1aXkbiGOoEmgPLEluRsWiJ4rWK0ngjQwwlLW6ikjyAf6CailQfwocXaQQkbt8M8UjTzqJPtZKRqxULKpALMHBUfCozwmhyGWF5AFjt4ZjcMQhVpX7b6W61DLQ0Kca8CPTChEkxFeSatcrlpTr7ksRiGiZBmKUY8h6Z4g0OSPuUbUasiF2aVNOg6WpSq/DhUYcCbEkk0tYlhl7usCG4tyQileNVz4kH8MSgTCp5WDvCkixm3Usj00J01pqHMgYkiLG+eSIxuqP+nCrFJVao7ppVRqqRTE6orkbwJLkGJysjXixqkSgsyFDkGIzoa88WVWpXdqC0ds2hFhhto4TbzRBZXbSHJammnVmtfTG+lEc+99QwxpCpto0+5iY6ZrVxRWqaUrwAJ4jEnUimRuW1MfeukNO1IY1mHSYyGzBIyNPX0xW9CUyTPZt5hl+2tWLwXVqutwTUSDk3UaVAzyxbWxCyJfEiyF7eGVDAoaQo6LmJKa5mpRwa4tkrgCEnfWyS9qWAFo1ykGgkdKniC1M888INhx70yQhS32/2pWZoEC6CfzBf4njz+WGgDYpRCguyjNbQsVgStGGs1Yq7E6jU55YQjqK61Y9c0SEqrLq4moKVOVOZ9cAwxjJLSTvAoFrLMgpV+C8BnQitMMUAG1Ar9wVAhosSxZBDWravTOmVcABxOo9xiiS6SsbipQgjUWC5/HPCBBbdmZCqaVSONJIU1Es54A66/wAjlhjArn2QZvuHdO2dYo7UFQq04BeFcMQILJGvba3Bm0t25vqop9SPUVwABcLbyRGJXRJVVY5CasOVUUZ1q1Mx8eWADqI7GeAuqvAAe0ihQ4AyQ5cGGRp8fXCGdOhbjv52uhXMUZXuaCw/Vj0jIsRl6cMAgPen15ws6y6haBxmyKDo0GtRT8wHOmBjCWj7luXjY3FGSYzhqNIANJUqclZa0+OBAwTUJikqHuZDmJD1tGBRI+FNJPE4k2KAp2LIkFwp7ElTEwoxTjk3wrxJwhh7NFOZ7dtcxNJkkHRLpUUprJFV9K4YBBrcuF7jTSLSW4kVdJYopVCjE8VA4UwgOf8AsS6uweTOaAqdLrqrrqKmi8FJNeeEMDrQKs0y62aRQNbAoupdOoAEk/jxwxQBtkaCMhGSR5C6Rxu/KnWdJy6uR4cOeATK5OqEfbvDW3kCOFi6+3yBLfUK8sUotAyGgjvQihZo9SpTUhjjzYluFa8sMR0x1WPvJ3GZg8pFFCow6a5nWFHxzww6h6lgo7UzSa0EbJGRG/arlUBj8aA/3YNg3C1lZoHla0DrEe9BX6aimosWpkpyA4ceOEwBtIIkSWPWwZyYRGAqrIT1ADhpz/HAANHQSuhjYy3DCSGRwrIzDMjQefrXhhwIAEDSs0MkZIH3EyAAkEfUFIHrzHDCHJ6Ixxl5IwUuHYBYA2sO70I6qUb8cMA2Fws8sDH7iOeOrzRmjxsK1INSMiDU+mAQogunkcvGE7lWRYajKPQOtTQqGJP88AAGeNSkdBotWUrFCSWlkYcZK5Ek1ocAM7MAVnmDmZUlURurAIvDoJPAnnTAIUxwB45u6VM2oSSxxuYtAAoopwb8MMAkCMGO37upo20mWSrUjpWgPA/24Qg1pEVxIhZtJIuIHUsSGWo7btlw4f8ADBI4OMrOtog0oBJSKKTJqUH1EfAGg4HABxpAs7RsyRJGwMUbCtGNaJ3BxIwxSHCMqk05mKyItGDfVIByqMgpP44iAO2gDqVKGcJETJ2Xo0PHpFfnnTlh9oz0YfWIYW+9unjDLGpBYsx6CTSvAgEDANj1tmy3u4g28cU001tNpuAGZJY0IJIDHJmqKAYLOCMmzPZz9vY3Wfb7zfyQFQSi2JUIWJppJofpBWuWMmTI+hZVo2Nv3mPtp7NbXDsktxBdX6IOzaW50ulPoUlqgKWOZ54zw3qSbkvX9tvnh8p3XdPuLP8A0y8uIlJgoCCGGpSukCg48cQde1onRytDV3kcmjbRIXEY6BITUUFOGWMXkr9tUaeLXusRGxvXd/tyNCagUcmoAetMuWYxy+Pm7nDN+WnbqinPff2F2j3I2KTcdoSGw8rsVkubO/SOj3OgahBKajIkUU8jxyxtyYu6vciODk9rhnx53PYr2xutysb60ksr6xulW7sb1dPZdiRIkjnSAvoa5nLGZKDqO6stA7Z1ni3GASGNIGdiMmQAr06qV0sp4nPM4RRkehYvjltuFl5VZI0UYRo5UulH1FriM5rINVRlWhxOupmyMgm+9y1mnhuGWCeKeQRyqyk5HVrU/mppoMSqOttBX4Dtt5c2i3xWZWuyyBZ20md1PQxY5ClczwrlhOslb1OeY7iuzRXFhssjXG57gx+8vnjJkWZf/Yoy1IrXkKA8TwpOuigJ9TJfnm7SwRSjQsdxf1jWBF7invqNRetSlADUcq4sohJajZaXezbPDGu4QPFauUkilt31NkCCkIrkK8TTFsEuooX3W3mFHttjsbbb4WJ/+LF0uqQMWIBWnHTShHLEYSLITGX/AFS53aWXdfIbuTcbh4NUYumpGqSUGoKtaqSw08KYi3BNUHPaRvEgubiKdbPabmqRWULKr6myooqNIAB1etcRtZllKyS2z25bJbeCOJnZ4WaWYLUyp9I+rIaqgfGuKi2qJGIghW5WOAW7t2517RQwvoGhHqv8NPHMZUqWkFmT3eezsXs3cMzuL7yJJfsVtCe2z7nMIw5FeHajIYcseow/5XFk8pf/ADeVHtKKvIoH8ig263d1iSNYYFdQxYKgUqjU4EqTWvDLiMeYyN2lnq8dYSRObVIo9MMruZEkWOZSQBIQhqxUCooo4DmBzxXVT1L2FVsopY9KvJGrp2bhmJl0s1CukjUtaE0IywoGkDZYxCBFpdo5HNxMSHhT8tSMjwIANDgCAo9uILLZoA0coWZXpGZNROlWFSOZOQwmNIJm7t25PdkoqqqLICFPEZFQRyoTgkUAu1LM8TD9UOeq2hBXtlfga1qBniLGK4rOF75GYqZWYyh1GsqwoRGRkpp6YAHe2tRHE9w2lxIwSMSdNdJ6GXhXRx4Z4RJasfoYFjYXYhe5Vml7zIW7kZCgkuNOkkGppwp8cKRtC6FkD27GllCY6SRVolG/MCtaE14YYh6sriaNYYJtFwIAW7UiksqE/VIQeIFciOGJMnVCoNbma6RFW7upDpgSQau6GH1sVHGmWWWItDCnWIolsZO2RJ3YY+2yh0BIbUxB0aSMv54ByemmWOWURs1usXShdckShGkNpzyJ5YACpHjt4VSHWQIiJI0fSVZ89RBrSoPpgHoF/daUYiTvQNGYhaSDpPVVWWgoByPrnglBoBzW40DSJr2NWF1TUsIbMqpNQFI/HAiAS9sveQxonbnq9ostWWVwCdCEfRxr68MS7QkaLi0MyXUUKK80cYLJK1BCqnPQTUVNan0whdRoljty6hJIwTGVQxko5WoJDMQaU+eCCLqNbKq28VFQwuzo8iDtnUg6TQVHTlzzxIi1A3NoRZbXUszxHVLNATobTmJChAIpX8cSREST3UQAZriWCQqVZ1zZxxWpyyNaAD+3DRERNBE0rtLplWSsklTTV8QDmCozpiSEFW80qqIZLcXiO+uKcUKdpQaiStenn8DgExOJP8xJJIWWS4buC5dellpQvpBBAC5GvHLAINhzkYSys0EVX0FtLafUmlSDWlMMcBLrBJZ6yArzkwqNJRFUZgrlkxrnXDkTQXKJAJ2jiU3MoAjYErpjWmqpThWhPA1xETQz9uMwzSq8aRs3+Wy0vJTgW4VNOeL6WkpuiztpC777SbrtULVu/HZJEsJKkse2y30A0UBGZZRnyx6DF/m4GvQ81lbwchW6EHE/3FuTbTgtcxpLDIKdyQEAsK5AUx5u2lmj1ddapiSS8dHt5O0S5qbhNYzK6gNVNJqQDwwEWJriZzMJFEcYKrHNAyhFQlQeoGmqozyzBxOBSRy+aOFoJIo0WW3Y9+f+qGkdTXUAaaQpFPjhoqbItey9x2kEXfaMlZINWtghBKoaUyqafhiaIMjV9csZe4dEnaSqxIAHhPDqJB1ehr/bniRAAunvKDV31rKe24JkPMAAZU50xJLUjZwWDa3KXtrdQi4TXucdBZdujROTQQgPkchq1fwxeitjVcPJc2EDzzRzFmFoqTAaUliBAcoQCoI4VOfHAIabS9aGF5gy/dw0hSWQ6xEFJq2YyVshmK/hiMDkBuF0IXWZG0jSgINDINebdJ4qTXgOOIssCJbvuXEgVNGpSRcSfpsBSrfPnmBgSENTyRmOVEiZokHcjjFAyHVlrcVrUGmXyOBLUiwtp1Ld1Z0Ld6kygAlK8QSSK6uFfTFiREZnAZykQM1watMuqq5GoCqRUjKmWJwQgf8AZ2KM98vbXuqocIKCEg5FaZ1FKYtpoUZE2WfYX0REpnXtLc6SRGdWtuJ1V4ZZg42UujDfHrJILhLXcShjlKTxo5tTp09xWzoSMifT0xeiuCMXVq9sCZYAI3Soah0EHm+ZqfwzxB0JJjD/AKe/fZAiQ3JHcCmqxhqfSCOZ/liponI62W6Xb9tppJUltYw0okykehpVWABIrT+GJJkGiZWtzHcC3S4HdRkQMi1FQPpahpQg509c8WIg0PioJZI2i0rq1BIaaSxH/tKGoz5/DExB6L3FYXDIvc0OFLFl0qM2irmKV9OOHAtg1dARpo5f1iaI0j0BDCmjnUgjMcMKCR1ZGkQBnghYHTNOYwClB9NDlQj0/HAAXbKiLLpaRYmo0y6V09sii6sqV9BywyIK2Qp+rO7I4Y6DK60CclAFDQjnXCgkeh7ahu5Qxv0ynRUEsQFjB40BPH0wAgwFolaRDbu0AH210Dqc8jQGvHhnhgcVbhGa67TStOhM7BRSPt50GrLUBkAcEkZCtHemHaZ7rJXdlHbcGn+H8tRXAOQMjW8ukNHWSLKZBRcgcgzU4+hGADs07JXuya0bQyuVEgIrVXX/AA14GhzwggGzNS5l7hlnUfpMjDTCSc0UE1yJqMMAsFQuuJ0Z5mVVt0oml+BdOJOrI+gwIAOntJdLDL3ZEjLVoaCLgVBJyYZkE8ThyJgZC6i3uoGkkVwR01qyUqwYAZNlQ144UjQG4ZZGlnuJFutSAwAMWU50ADKBTTw9MMaC0n7jklAZBqd+5Qxq+nS6JpzYkEnERBYDMs320jamIKIpFVehAFQB9IyB4HhgGdKq+lVhYs7GNqfTUcqnJAKVy4nDACkuuK4c2wSsgi0Mp7aEknI1BU1z9MIGV5G4TUDCDNGR0RklpFYZA0rVRTjXKmKkWMJkmeKEwGNTb3ILqqAlaZUWqmubZCgwwBjSZodchaQlWcSARxGgqAobhQVJywCBzuJEuIwryh6soUFQUBoAxFW+qpFPmcCAN7NxpjeOVpprRKSSdI1A8gwqrAVplhiCYpv15Z1j06F0PIxDBajT0A8TXIYAD4I3hiM0srRwoXUCY6WBHoozPpgA7AEkRZbgovcpGIo6qAxPBAPXngEeEcSK4uQ0JkdlKNGaRE1GotwzplTBAwyGAjssELPECryL0ltLU1AnIimQHGuAD0keuSYSQyLLIlIdLDUi8tYU1rllhiPBoAgZqCNmKwqwJ/UU0NGFc8xT0zwhwCi71wtY5EeZT2pUjokSstasFB/iDgAMftwyRoVjuJ1kCzUrWoz/ABPA0wCgGyFZZYgO5DMf09asDqPqAPXjhMAUkmlBDVJogn+YVWqr0IBKngoU4Bnpmh0kdkKkTq89yrEuHPAoTy4Vw5EGM0QMS6lit5mqZSNSFqZUPD4HDEcZgsLpVVt0Ui7u46lzKeZXI50zHywmhilBFC0bSo0l23VEFJVWXSNRZhQHp4k/LEqkWKYk+4EIZHkjMlYZ6VahIpSgoNIPrwwmxxJrf222/bNpsYt33O7tLeKyjLRmWIumggBqVqGcqxNSMsUXTYKF7x/8s/cNOLC48Z8LWPa7SIds7jpUM2oAUi0+vwz+OK1h6snKYze22wXcc91vu/2f+qG80lzcLJPMtSCWUMSASAaYVsaewnqfQX2H25LDyzYd9tXuLQGYieyYsJe0xoveBNGAryzxTlcblmGdjfXloVtonJUuF0lVA6zxoMcvyte7FJu4bi5B/GLU3c0gMkgjQh2ckKy0zAoanjjicKrtY6PKtCLOmijESq4BTSE0ucqk/D1x6bsisM4/c+6T5n/u59u9paaXyXZP09zd5W8h2+ABopoEKlZSBmGq2fLHOyUl6HUw5mlqYju7aI2aXFkJLJrKMukJ6iEBOpdHAGhrwxRerk0qLInFjdQPJsd3Zzl57kRfbXKAsgWmly5Chaip4+tMNVa1KbqSFbts3/cW9nbrYGRbeZ7iZ0yQKJG1FDU1IJqR8PTBqJbE5ur6CztZNpspVh2qGA9/cLghdESEsDmBUMxIyNeHwxJPQi0Zxu7ht+3OzmnuHtYgs0tmqL2pVt4gzytIq6qBjH61/HFiDYpzy63mZdsa7jWGXdnW4ns7YHuM7sSrB5OIdT1enMYsqCcMo7c53vbuftW8sctqdcUMkmqK3SM0IJAq+fpwxatiT3JFt21hFkjpL9tcnu3ccY6iRyR8+moqxHL4Yztl6qTna9kk3CW3u57UGxsyVbsLqlkdW6WbTQdsZAA5DliLsTpRlhW0P2Rnllt4hHM4jkampKA1SML8a5EZYqk0VrA4xgJPbrIXstN2FedHMiCMIGVSMqr1cAD6nBXULaI81w+gyBgbq8YBLWEiZo86alYEBiSKn0rljTip3WS9plzX7at+wsH3llk2629vvFYO3Cu2xPe3MakGq20PFGI05k8Kg1GPQeSt2YlRHmvE1+Zmd2UfsL/cX95eju/auB3Lx1JOotx0mpRcjQ48zuevSgliRQGaN7ZVuoYmLB3XtqzGugvkrcjzxWTQujDl1nlZvt5TrlmILqkhqKBh1DOnP44ZI5IwkMc0SFbiZtUkcrB1kRQKUDDmRiLEHSIH7Qlj0qIpDLbyuCSamoqM145CuENgzCDBFGsZSCIKk0qNQRqBUBc/lWuFI4FMNisiaR3PuZ27lusNEk7ailcuTVFR+OGEC22tKXEMUrBjO+uNgDocADVWoyK0plzGEA4w28cYaYQzONRjVHXJSor3CMyKU6TwwmA4FIhEzNASHZe8wb9ZGKlqvpyBbM8eH8MRgk3Iugc2ky3xs5HudLRwrpqNKjKgYNTI1JOJpCaAQPS1W+kjN7c1U3E0jnIEfQQo5fAYYxRqE7NHkgJDzSVOmPSpKxo65n1pywpJSI47gXNuQ0evutJ2X0gOIwASWAPqMgMRbJdx1rhzI0iaWUxMzRzArmAoklXVUUAHT8cApCTOxhhkdkgjlRo4oWJJqTQqwNGai519aDDgTseuJLho5IUPYRUH+WuVKa2CgmlTl050P9uDcTsBFxEwkdoNNo3bVhlr1kg6BqyoONcOBITy3ErP2wWtSQ1bckmrkdFCanP/AMZYJHIiQl5ZbZpnaFnCyhBraPUM1BAyHA154EIaJ5bORESWEPNGCiQKTEritcqVzHEA8cSE2Nk7fptKJEVWZVvYCASQGJGkjLIceeJTBFtDdOrZMWbuAKYmjpUQ6jqDVNAc6j5/LDRU2AZjJGlvbT9rvLI6RA/qIozAcNpzzypiUDQ3tETGRKsFu8pKzxKD3NSHpJGYUAEVFc64JAIZLeQwzFZNapWWSLo7lDmmoAjRzFcEkRWsCf5t7Uxh4QqRxPU6U41StK14gUpgkbEt8O0STI09x0qkhUaeqpVM8tVeFeGJJBIK4mvGL6ZllW0AcW6ihaqgHUCCCQTyOBkWFOFMUUka9ltJI1oW1ymlI61GZrlggQ2PGsn3cXYeKa3/AK0gq4QhSCwA0c+Q/sxOrK76kx9rLyH/AF3fNqvG7h3qwW+jmaq0eA/rER8+iVjkOWO/4q0zU835erUWK7/0+4sGvtlmuITLtt7cWUSVKue25ChmrShUih9McfmY3TK0dzhZe/ErAmmjDfbrFrJjjWZI5AdZpQmpApQ8q/yxQa5G+a61a7hpjKyowvo3oAjLUCOig8OIIxJFbIxJdROi/b/5WcRs8dGrGy1qCwPEseFRhlTGG+kjegbXHFQi4LVDdzNlVjWuZP4YmkQbYw62nkMkYbuoqwshzjZhUFGIzOVCD64ktiuTlsUaVJe1Sij7mPTTqAyK+ooM6YaYmTW1lAklFyqSTMqPFbDUUVSMqNSpauRqaYuqJgtxuXikkgjlECTqLgQOdaxuoAMalTlqGeZ/HE4IoiKlE3BY5JQokUyJr6kBIJC5VDChyxFgdd1bSbx2uUDqyrKAraKGnb5Mv44hI0xtkaRkgiWR5Fj1obdj1yqc6oDmvClK5fHDCROXqpUrpN0io66qgAEgayDReWJIGxDJdStKoZG+7jVwFTrBIFF1g86V4YcEO4Jit5iIJYxIZY31V6QsJP45g/yxIi7EnsIYz0ypGIyaxFGydlIycDNScSSfUosyZ2Nhau1tcQx0eJGMOksmg50rXmM61zOLUVNSOUD3VuqSQyNJHQqFrStK6q1r9PGuLq5GQtVDsL9Xt+y69u4uaErP1k6DXXVTRdQxd3yUurC3sLee2Zo2KhpNfWKo7MKFWPFCo5g4l2kdRN/plwxjVojOkCaUmJroqOlR/jAwdsBJIbHbgIUaSNpZ1ACztVmmWhrQcQQMhXEkiLHpQrRxxxiToA7QbUqqf8KtmDTmMSQCozMDE0rpMFWijRmrkZgHPjyAwyMHu0s00ixMzydvTGr1cNQCgKjmo4AGvrhDPSJbEMjrMIUBSQNUUkOaqanMA0AH88BIOYFLQ915JGOqI2gFCD9TkliM88MieVO4sVpo7sugdqSaQKroBqahzBypnyOARxRJISiRBI7o5JJUaFSlQS2eocB6jATA6oxK7JW5jYho4oukR9JIapoF1FacfngQjgaSUySiV5XkjDRBW051II0/DPP0wSKAZhUrDHH3YGkU1kpRAdPXqrkdRFB+OCQgLVriRppF7aEigDMBGufVGCSKk0BFOGCUOIAAuNDwRCRgxjgFSVYACgfT9IWg44UAgStIjTXSMZFiK1UyCrmhBrQVqM6HANroAraCKR5GqqEKaoTpL01IDQitfhgmCLAAO8H3EcpgkjJaYRio1soyUDIgjAILCBGWSF2iEihZBmTHKMyTpOVOdB8MMkjsbUuFNtFpDBkhZx3F1DjQEFf/ADwAcSCeMcC9vqH25ciiuQakJxyzrXCFuAdCgWytpRLJcgrPNXTEBSgaMKc6nIkc+GAZykCx6CpktIcrp1apd60VSK0OQrx54ACoo37wuEjcSyxM8+vqjkPI1H+FRWnI4Agr+STXGiqjjTpmuZFcKeHRoI9OefKnxxWiwLZlEQZbmK2g1OIoNJrID1NkM6gV/wCOJCAyRwGoQ9pKGQTsNXeKgFtNKDSRhbg9A2O6ExjaeIKgGiSJaCkhHBCAczwPLADPAFYxGvc7dse722oh7n+EACgAHAg0wAeo6MSzxvDcSiaOCgYOD9LFxwp8PnhAGSzI02meQzq6M3b46StetKLnQmgP9+BAcCCMd5ljQSKI5I2U6owBQZ1rqrmaYBAzOyRdqdRplCyNpJkqOGsA8SOY9cDAEYwzPDMFlFWkjjhJDKRkHU8Kjn8cEiDlB0VWb9aboSQ5s6MaanC1px588SCAuH7uMyqYVlaBKLPGQKLUZsG+qlOAAOENsOUvKkDCRYXDLFV6IBwbuA8P5fDBBENkEELSCyURTZPGwFEpnlQjieJwbDOzTKUiZAYtL6WjJOol/wA9eGkniMIJAR6FaQSFRHG4kpQjOpAcaeIJNKHlnhBJ4I8azh5gUiQpHIQW6WIOQGRNcqZYBB33GUbFY4bQMVkaheLuZ6agcAeVPniSGH9ma2dZHVp1oySoqqQ7muoatVen5YYNHg5hk7cLLQoTLdmMBGBNaMqVIOo0ocCYmaV/anbeIXPvT4jD5lZ2svj24tc7e1nuC/oCaZSsSsh4ValCR/DFd9gq9TV/7gP2d+c+JC6ufAraXyPwd5HezghEkl1tuqjEPEhzQVKqc8uIxVXJO5O9FMozN4p7VvJc2sVzYXN5Nt2h2VLVyEkPJ4VBNVyINc+eLXYjDN9+1/sf5/vtv2YvH5NktA7KN1vI3tqIGAYKr1qRUnGe1n0JKqNj+EexI8Xn2+63TyA7rPYydxUhiMS1GQGotX54zWTe5po0ti4d8Rrq1a0SPXJcFQgFT9LZg4x8746dqW5bx322lhlht0O2WxU6UkoDNThVTwGFxuKsVZ6hlyu7KB96Pf3xj242u4L3yz3vdWNUikUmUk1eNCciQOJHD54nbuy6IKxRSz5Le4XvPv8A7hXtxd3FzcbZEjlbXbbds6LQLqXmAoHHnjTTh9q1Kb8mXoNm1y/6vYR3NvDJape28yyySEKplU5sgNGJ5UOQ+OOfysXYzqcPL3KCV7dG21ePbFcTSUWPud9gAGk0miRlGPU1CaECgxlktaAyRWm3bddyJJLAJlBnm6YnkR21MiUPECikc8RepErrzi7hPje3tHerYf69dL/qGmopaq1EojfQaqaHFlUJtkI2KwNN4e2/yllYhU786vKzQS10OKECSpzAqBiRGZKf88Yyb/44jRyyG21C1lGUrBm1k6BTozrUDKijE0SSkqZ9tM08sMyiGZ7mL7lqj9RcyCtQaOxpXA24LlXUmW1WMjqbsxgxWX6L2srLGTAx0hmWOhbUy0FPTFTZfVFoW9lNbRGF7jvgxgRXEZCAg5FRGPgKZHFVmaKoXm3WON4F0dmNVSeFmAJeoesVPVRQD1wIk2FwhqmWIi17tHcOiyGME9ESgguGoatyoM8sSWhCR62C1ivvIPFdsDr/AKZcbhELl0WorDR5NJVuaqSSDxx0/HY/mZkjkeUyfLw2fViH3m3iSf3M36ITotvsu3R2CTDq6pgzsWIVKnLI1rjX5i03hGbwmKMfd6lceNq5kmuUBuYJdMc8zuzsSxFWVTUGtKgHhjhs9AnBMnnVkSOOMKq9UMjVScqrlSlQTxIFa/yxU0WJjqkjLbSyO/W5YW0JBKxlsmK5jMHgafHDQ0LA0rpLbaFkZ5VIcgmI6RVpFqeBIFMsRbgI6iuOVI43m7oS70FyVjDVoxq68KhqHM4YzpjERUxJFbIEUNIkmYLioJRuZ44ixpi9JDGFAjjuIredtAQBZHLJQMCakrUZnAEyHxzSxduZ3IuYkFBMKgqRmqDMgkHOuAUegsUoyWk8cyBErGbYLXSWFSgyzI5YGDHDty9iKO3tpq5SIuhWaZAR9eoj1zFf7MRAW9tDC80JHYmC/e25QyAlMweZzFcq/wAsMakSyR3Rkcl1Ve4SUjVf6JBVWOhhpJrnhSKBtukl0iG6VIEgILW1aGYVJBDg5ADjXDJASgtIDK7pDcSTVlu/zhXqQCM+ogkCmAig2IvPLI8sfYe0QarfpftoaamLZc86YQ5OUtC0sTQaI2PaETNqdSGJEpViDnX1wwC5Gt2tpE3KWeaKDSILUtWSQg5dWfTTgRgE0J5w0riSYi3iBWO0t01Vyp1MuYp6nDIywq5Z0ZHjkjuhekQySsD26GuQcHpI4DCGmNJMIiV1jkihVngco1CsZz7jZk0DZVNMNBIknISSJ5YkkMMQ7bRkk5k0KU5AcRyxOBNiOS3MVtbyO0sUkJ1QQga+h6ksVOZoeRPywyMSIRH2riCRygmXIPKNXccDLLlxzBHDBINCSRR9vM0rxLDPKscjtHrYMKvUk9VBqoM8xliUiCmklWFJ5Z3FwzN/p8II0qoFMqE6gV4VHLAESduFAtplUL25Y1Zhp0605qiKa8TXUcMUCeKG1MUJALJpUNbyZuSMxo+ngT8sAzlvH3GuJRRElYhgGqNLZUoeBHxGBMi0I4zCFgEYGqBQrNHV1KVJWtczT0OJEQFxKtxHdHtdxD0R3RPUJDSgKE0FBnlhigQ3kzRyGNppFkUJHcNp1GEkr9AFTpzIq2GiNvUXeK7w+0eYeK7z3x9rHfQ2m4SFSjvBcVjmOitKENQZUx1PH5e26OR5PErYxZ7pba2x+bboDatr3Pb4b3uw6dRkt9VvK9F4AaAxxb5fHFlYh4bJ3U7SAzMIYy2pXGgy3RBCyxUIAUaeA1cAeOOQlJ2Wxm3J3cyNwlpWSNGBPUAC7EUrRRyHHDgixm3CV3j0BNchUEBVUSStqGkgj6KAV0nI4mkV7DDdTaJjdNMQ6ivZYVcGpU0r0sSeOWWJQVNjKziApISbfWhSaNB1tnnqUcjlww1qRYts5JLjRG8qxSQJW2kBqqDh+NM/jn8MNCH6G5qwuLeDtRyqY5Ld2GSBVDEAA6iQa4tQmD3FYFWMFGh7kfa0qtcq0r61GROJyRI47Q6oFdyGtQYriRk0q5RyAjcCDpI4YTUhIS1x/mVPb1RG3MYslFSUFWpqbIEHlSuIsUiN+zW3QqzKaGI8ZFDZnUeNBypgE9BJHK5un7ciwt1LKigsp0g0rnUZcTiaBsbe+0iySjRA8IRY4lyDKxpqBJzYDgeOJwQdhwsrkxlkFvGY4kcySZFJkJr1HMV9f7sOIK29STWd9tzamjVFE0ka9uuYLClEBGQw4E3oP4uYYmZoIu3HHqSdCx1dJAJ0jj88STIC2PdImeNPujFLEoe3YLUBciVPDhTE5ICmdoZRAZNKT6WCgEHSK/mJrwrUCuJCOR311EUhWXvtNnCVUKoKmncz4+mJ1vBC1E0THZ71dw7cpj7BgAhmDZDMHOoNCQeAxppaSm1YJBEqp+mJe3boAwGahw3GhXVXjQDnxxYQDao8QGoySW5URIVKSKrDpXUxpXlgAVqQyyUQW0xWqxsNelENOnVpqQf44QgAMvbChVVdWuKcNpJcH6tIpprywhHWDaQZlYRyAoVFNSE8NPE0Jz9cMaOpWOim7Wf7ZR2Gprjoc/Uk5igB4nDGwuYyFUtZHyZ1mDMgbRJU0UEUoR60phAgckCSLVe46wKB25SpCoamr1zFaE4AAgkmeaDU7wxrpAjDAggFssgdQFOPLDBg4k1oZI2HZiJJvFVEjBYfSoJ6dZyr+GGkLY6YfuNFwJDEjAx3JoKoDmoah4seYwbA2JqBY0judEAqHKoC/UooGNeRoB888IJOyNIIzOFHeuXLyW2nqfRQlAT+UjPPOuG9AOM8KQRF1/yzKYidJemoVoABXIZAnia4ihnZHCNK0kiUtyrRKdQ7lOlTqqKnkRx5YYgu5j7lxaiZRHPLVGjDAUPFqheJ9M/hgCDy11M1fuZ7ZSXMqlaZVBIrXMZZ4Q2EhRHRoiDayRFisj0ClhViFHAg8B/bhoJCzRo4pNLlwzdLPQuMslJpkT/LAB0jRoeOQSPFRZYo6qg5NGFBFCa5E/HAAdAi9xJQX1ENWdHWiqSAEOWkg0piI4EiKgrCzSp227ZkA6WcVZQAfpA51wwZWsnVCB3As0bGRoSpChiBRkRsjX0OK0WHSa2xuey0TSy1Zk6guk+hObZVNRTEoEKIbNHdbe1aJO9RxPLKAGaMA5EDL5eowhSCYypKsKVfsP2O8Fr00JboYgjPMkccASFKipJLplaZosgzjVpZh0kk8f8A0jAwDgJ26pqUmjCujMAgIPUEArTLjngYJAvvUMWmSSQxoSQpQA0OSpUVyHHjhBBy1S5kSOeRFMCFhbxHIKBTIIRUj54AAPKAhjEzGNOruaQGKVodB4g0zOWEwFUa3CuXV10hdMNxH0FBXLuHgxY8hhoEFx6TGzLNGsE4KzxSKa6lNakjMCvAeuJCFKhV7c326yRyktJGGOvuLXPUfUgE1wgjUFr7SsFAuGnWup2R1avU2giuqhOeHIQcVY1MpeWi6HeOUA1VyKnnXM0xBiBwrM5FXDGikLGdS1J6QagkE/2YYB0aMhjKRAPcTMKjMAgULItSSU54bDYMi0gRzGjxTFlhjipR60AcKeYpX+eAiegkMEQKtDNaue2Goa66kVJqDQcMs/jhpDFNtZyXMsa2izTzxgRiK2ha4n1M1KRpH1EV4n6ueFayW40m9i8PEf20+9nm8UDeOe2m83ZkTK9eMWUNJCQ51zEEqKjiK4r/AKiqJ/KsbR9uv9uj3YM8F75L5NtPhEKt3ZUgla+u9anokoi6VYfPEXmbWigSpD1Pr94RsW6+N+ObZs+++TyeW7ht1vHbvv00QgmnEa0LSgE1Y+vwxUoLH7CTRWW2wOZoLG3hkc9cyRoGJz4sBXngio5YtJUjqevzxGEKRO8iHpDCozp88Rsk+o0NN1f7XslpJc3tzHa28as0txMekL+Y1PIc8VxSvvJttnz69+/3nbPsXf8AGvBpRe7hJqFxcx6gqhGCtqepCZH4kjCWG+R67A8lar2nyy8m8r3bybcn3Pet0lvZ7tzJKLjU/YiDmjRihCVUCgp8cbqYVVaGa+VvcQpbf6swlgC3LzOr2sqZKiVoS4/LXKhWgGJPYr3N0ezPsreeYbBf7hukIWCJtHZXMABGVWZj9ZqQTTOgxwue3Z6HX4b7UQXfLKTZ3t7RFjki2xnhlBBX9VarRVb05Y550GytLhxvO92vj1nW6dzrvZq1QRlizIhyKstCT8sCUkLOCJ+497Be7w97Y7NJLZXkcdnFPIQWYW6K0bSKoUIWCkkDL1xanBGEx0sLGTbPBraHee3JuO9STXFtfItI4Y1+gyMaEUPTRfw44fcQTZlvzW9W882sJJJTbTx7e8NrPVepwxEhAzJSq1FDXE40Labld2los1/JM7LNDbuGuLguVOQ0gvnVWxTZ6GuqLK8b21bi5hMkoS4tFD3M4GskstIoSDWlBWhxBltUT64Z2Z4JHUuD3AqAARkgcBypw+GIMuG+7jjWgR0Rlk1uRTSjFQAxaoPDgBTE6orbO0iN3PJIrpIHjbtZMrHpGtwMyPhnXLE0RfoWL7bJD/3vDcE6/sbCe8WMgiW2YgqV1AnIAZgGlMd3wte67ZwfNP4VUzj5Tug3ncvJt4jQoN13cx284AJ0RnSWBz4DPljFzcndlN3Ax9mFD7tcQjSFluSQsBiDOOlhUsQvqeZNcc97nSQ9lmnj+5r25u6uqNm0SIlAoZpB9VcicQ3Jpj1ErK0qCVJZJX7SyyMqkKMiVZOOWWeAaYqEykRwmTvRxsInYadSvnShGnKtCBTEWSkdTfGaNY4qNPUxPYuoBMWZaSMhMi2daHhwwQKfQCsqNEsUYLxle5ezEKtdHSVViBnTIYBphsB6IO1K7GEMhBUARqM6CoqfnhMY42cn3dxq0TyNMTDGxbSFLUIYkD81MzyrhA2SKGNGWEwxR25LsJ4JGDAMnQ5RWzz5g/3YTGh5Lx/dQiSTuQQKEn+2ABtwq6W0/Dh+OESOTosI7MTLC02iUyQZVUt0x1Whqfj/AG4BCK4jltpYGa8kWYHVMuSBjmaVIoQoqMsycITEFxAsUBnmtxEsrgXFPoKBiY6REHg2dBz44cilih9vO5XBkMcSMFRWaRguosv9Y8cwOFPhgkTYUbVrePvfeB5FBDzSISxTJdIBzqfiKYGJB0FmyvbqITFNMyyamkqooKKklBXSBwoeGBAwD2kumSKUJbmMl7lUybS1ArIxqVB5A/yxNBI2Q21xdSXMn2xVoEPYLMOniNK8A2Q5YQQIJLTRHAytWEae/YFhRWDBjoBpUmgwxwIZLGZ1vLua3VxLpUMX06QTwK5ioB4VocNIXsG6W1WGQLBB3IIbfXb91groCepyTxywwgSTQQsO5V1tJUEsV+HDhCjqpES5UFa1OGJyNEboFWA2sgmmZmeTVRinASqtAV4g04YaEwuaWW7tI40jW8JlEJnC6neMZlZAWFD6HDIvQRa2EaosRdELNDIpKMSPyLUUNOBwCk67QJWGMVho8kE057gH+FKipavCmHA5Ork0avF2Vto/1i9WAqaVQkZVJ4UwgTEUbowuQzoJhXuxMpIOni1CFJrgE2IXlW4RZ1kjDNRYNLVBkUg0IoKilOo8MMiESTSSRxSEsA9awvGFr1msi8afHKuJTABTzUFwJUqbhZD25Bk6gZNrJBAX6iKZ8sCakg9RivSbmwuC0bS3FugS2mUUOuOj000VhopQHGrFbtsoMmevdVot/wB1p5972DwPzaAFReQxRXaFQ4iW+i1SB1bhSZScxzyx3fI1+ZgVjheKfZyXUpKSTvl0jjMiz075YFEeNKcaU9KccedWx6ZoY5LoiaJwdDqO2Hkj1hkJIorMajIEHEkQs4GOWWKOht5JYGZgXJNVZTmC2WQBFRXE0QkYLqRmefSh7dqGlSaSoCgnMtnSprlhlVgiKUG5gmVWYmPQrVOnj0gsKn+eeAi2Ko3gaO2hjpGQxUQEhSMwSQAKBhXLma4khMeAY5TcusLCUAMHqGNDkrUNKNlTLE0RkG7K4t8heTRajI3PUKZZ0PGhzz9MSkQwyLJJN3TEZHk1PcwM7DUwbpf1oAak4GwEq3EVwXIYi1uFIcsAX7mkgF29BwBGAEIJbmVo3QMzyypRQlCUKg1GrPlww4BnYEFzIpDG3BhCwy1ylY+vplmThpFbH2FLcokDw9sqGEnDtAtzNcs6ccXV1KbOAyLY43USQ6VaJToYdR1DMBhmAtPTjifbJV3CaXabr7lJpFUvMdIhDBo0dfpX4ADOmH2C7j1xbXFlBHIplEpZhd9s5mLLNQMgTXnwwogO8WQPudvbxySR0jFZHtaEMI+TaqVIFf54IJK8hkN27kXSSqVvATIlREpT/Aw5n45AjCkHUc7e5LXHbir25JGG3xltSo+QOocStMgPxxZXUg1Bauz2xsYRDKFbURLKusOaNwoF4CpzrwxsooRmeo9vCxj7RgzjfuaFNQDwBFDlp5nE4IihTVRC0bfrydzUw0tLpUV0xtmxrlhgDli7sMmp1mQlTGctKCoGl8q1XhTlhCPJ23illlVkZWZFSgYF/wDECwBDZHnwwCYKMq1nH3nZnUEQ5hC7EBsnABBA458MMYBaabcRdzVp6mAoQlc6qp+oetDwwgPSRmJLmMKClVZ4V5Mc9esc6CpGGANtCGMujJEzlZmyMi5BVBYGhBrmM64jIBYZ07KyPLBpTTFpYq0AppOpQQKEc/wGGBwd1mjUlJobdqrIWUAqaEI+qmQHHLAAAW8TNqFqwLDinWXGXEA8xlXCYQAWRI7jvF2ViAEBUZ16aVGrJScIYY6XFeyaRNbgsKDpK/mz58cNyI6WcKt1Ivb1L22DEKGSuVeFeNMNCAkxuXgVNUpZZETTrUD0qajL488NDCGmcsJRohmd6W9ug1rWMUpp6WATifU4SBsA6xdy4huaQmZAzuseZK5lgDX6jlTAh7gTJbS3UqaNVs36kkqJmWVchTLSB/LEhJHWInVZZYe2bd9UlGq0Q4ghiKDVSvH5YiSAVW2neVh21aMTJIp19PHPiSWpxwgAgrI3ZkiQjRpEUJCAvIKjUTkQK88MDkcrqksckb9+JeyUK6FflWhzLDngBlbvN9we1GGVYT3RWLTrOkVJBrpC8vU4rRN6Bzx25pdFyLVo2NxdEHUoLcSBQAtz+GGAW8azSvGYERUWkWkBqAUPR8+dcAHXef8AWuCsalYyjrITmCKEg8qVwhMMt5bhex2FaOEw9te5Vwa16WBNSTy5n1pgBHVELho1tfspYg6RwVrDUDM1H0kk554YwLARRwkkm1SQdxnoCH5KPUfhnhCBzZzIZ1C9+PU86VCqoJOoMfpyFT8cAmDkVpmjRFZYQ3ds2HUdCUIofqI554ABFjLFJ2hJdNHVpUkJzrQuSrD0oaAceGGEAZZyHiWOXtxxhVijmUqrEjmD/hGY51wCkEUuGmMUjo5KhIJXJUNT1UHqqPjhjDO2kpmmlVHS3Kr9uwZVkXMVRARQetOWENh41v8AbzI5WVyCxWmhlpkrA8CF4gYRGDsbCNe+tU06u/EmpdK8QSSCtPTLACOvKBHPOZdTEGSNo2p214EaeAJHPnhgcCR9szF+yjH9Ocg6uoADRQ5A8K1wBAbJ2+yqzw9hBUGWuaqxqrtU/wAKYAgsH218tu/AvNPHfMtuaE7hsd9HcmAKSrqK9wSD8tVFc+OK8mLvHMH2Tt/35e2+17Ltdx93BLd31uss9rAkkpDU1NoQE0oTSmMzrbZImrrqVruX+4/YSvPbbTtNwvelCQXUtsY0AbhSp/mcS+RkYfNpUbYv9wXeJW7AsZVa2kjDHQKupNHKjiRiP9LYf9Qn0HN/9wUSSyWdpYPPImnocaYzT6yCaZD+3C/pbDWZPoFw/v5v5NwjinsphYsyCe6RB+kuRrTMUIqcL+kuTWavoTnyX99Xhu2iKGzuv9ZuI3X/AC9rXuSqysau4oAB6YS4tgeaq95jL3U/dL577iTrt8N6/j2yXH6kNvCT3pEcDpyJ0kEHhxBz440Y+Kq6sptmdjNMazS3F4RcXKWokZrsFQzKSemprUks1fUY0pFDBLayNZ2Uk10ksiSM0cyK5LAtXqoVyUUFDiTRHdmjfbfwpDeQbnd2KTSzRd7OQLFFEpB1Serc/QYx58kI0Y6SfWH2v2iG09tRNBGyvukb3cSxgoGjU6ApAJB1g0rzGOM33S2dKOyEj51e8+6Q2+8XVw4jQIlbiE6gBM5KAV9FpnTGJ1g3LYpnb7e6trcrI5+5vwwkPcRnSN/oJIBHWa5HOh4YgtCUJocIvEzut1Y7dfvcPfSXCzXFulYqR0EccagmgBJyIGYU4lZlb9h33OnstulNjbXCPte0bfIJBM+hUeCLV0k1ANRUE88So5Yu0xJ5PLfjcvELsAS7jPtUV3eyTRqe5FcSSELoXIMKih4Z40t6Dx7oT2duLcbhG6mOW7KqGyDSaiSQMiOOMrN1dCz9hTt2U89tMhWc9h41BEujkGPGvxxAuoh2VIlW5dXNuEMgjnrqlBUVo7EmoY1oOeEixjdHLbTXX68aRx2qa5UJOsuWpViBwLUxNIpeos21Fks2nVoxC7duGJKFwS5FHY6iQaHIYsSSIWJ34hfSbHsXuDvsnbez23bpdt2+dFILukOZEgUqHVmoVPyx6Lxtfl4Xc835C3fnVTKFnEW3Lb45Iy4W37hjOS62DMxI1CtD1ZelKcscLLq3J6HEkqpFl2U0AhVy33cMMaLbwkrHVqgF11AlhUGtTihl9WLQzRrPaG3Ll5KxuGREm05hWWlAtOGdB8aYjJLcUpcQhxbQtqIiAsiYSNRfOQaqgVHKmExi+NV7ixRBWmlj/USclNArm3MVI41wQCFpu5WefS8vat1qkoOgRVNApCglgSP58MGxJAHu+5EUuEmrblSLYsDoV8nYMtQATkaCuIsBdLfLN3o3kZw7Ue6YCOhoDpdRmch/fgQDjZbmDdNN9yqCVTbdBPcROIZG+muQywmgHf7l0lj7ZM8s0ZkSSgDtQDWTQUKtQ1H44Q0SG3vAs6Q6O5bTsIrUhB1IRVQXJKso9f5YiWdB1hkS8dYWkhtoHkUxRoQ4ZkJAXPhp41wJahIvFxEGvDbIj2liUdpxIsimRgRRywB6uVMq4bIsTT7Ut4q3Ecw1JS6fvN1xua0LgLmTTSR8a4SQmghoGu45IpGUmIiOQslEe4dgO2kg9SvDDSDYVxW9holeOttoQRxB2Ll5HJqi9OpTlzGXrgBIT/biWRKQi1jtYzHcImvWGIpUGubj1NKDAhQJ4raJpYLaVpGt5I9cUjM+pQBwlFKFQzZD8cORQCEPatZkbW7W/wDl/tu2GBY5kahmEA5jDQQNFxNBFo7VswEeQH1LEUOlSpIpnwpgYxqu2WaSJBbgSw6lNkzsFkpUqxJoOFc+eHIDPfXU3eWNJKW5YzGOQkgjIZV/w1y4ccKQgaruEzDSI5JJraQrIzGkTR0qwy/9zE0JsY5HKyI8avqtyFkKNyIqEoeAXhlgRCRtknnaUODEGuk0mUIaBV4HUMwf7cMiAuC5SKMtWWHIzM4YQqSQBTjQjhgEI7u5iUS28J7bIY9asrARhDmVA+JqcsIaPTzrEy6GEwVdMiliRRMgtQRVRXKuGECVpnjkYGN9eookjupVmBBFfkP7sNEWJ+4ZdYZ+5Fb6gdQJ0RtXUQQc2rTOmAQQ8ks0aTOCt0yCOKUlAzxiupNLHpNBX8aYkvaDCZWmkCvFE8QQqIfqEkeRzLAqAGrp1VpTEmRYjmnaR4xC7XEaRUQB1Ll6aSaUrUAEE88gMTqyqyRY23rNvfsrv23RsGn8eu7k24di7gQst9bBgAPqRmCnHpsD+dxYPM5X8jlT6lKy3xlRWozmQLLKgcDVHOBVVOdVJPMZY866wz09bypI/fSgpNbqSgkDf+lkU6u1ry5Z/wBmCCFmhmupJHhkcyViUpE/dCqGFa9bclAy54misa5JRrgQRPpjkJjNf0ya1JDGlRThXARaCYg0ssshmMcalkSZVACu3DQPl64kQY6RGW4CxUBVGMZbVVUkQUXUaAmtMSANV5JZSBMHEJjYyOuhidWZr+YBhQ4aRFi2aaK57h0UfvK8ZLEAz00hkAzBplTEhQNc5EbBpIRE8hYwJ+YsaBtPErnU0wtgY3TxuIQGaSQCRXkh4ZH6TVeBHOuGEDakavexyxSfbTRgtM7cHL9KhWH5qHMcMTSkhZwP9rt/SZFYyP3P04KatXyBIrmaAj5HEoK+4cGt5YIWjELKZSvZt3NXK0rVRmAwIoRiS0IW1HWy7hMdvNqhkkZSlyx0o6mukKQCCcqHhi2rK2oJPa7Yh1iKTqyZDSoTUcw1TT8MX1UlFnA5x7dFBpYSC4LgNMa6NCg0BfVmKE5Yn2lfdLGTdVggiudLFmcMsMhJGpW4qC3HFWSqgsrJBrK1eUylrQTRNFodFWoEdcixOakE1JxVWpb3E48ZtKSvK8LXDcLNo2Vc1oEJYqSCOX88acaRVkZZcEEZkmmakCaA17PQhg3oCo58yBi9FLYYZEZ+5HqWdo1EyhgKpl1a/jx4YciDpJUdoJC0LyTdNvGAdINfrStaEfLBIgx2i1W9IxFDKxEkbkCMs1FdmBoaA50pgCTxklIZZjpDZCVySZKGlKgZenywgPM+kMYkVmhGqUhgU0k5oQwNc/xwwDdFSyxT9m6mI7VuwLZKOkNm1aDkKYAQU6QvEZY6wtCrNcRSq5kDmgIrqAIP+EYcDDKhTI9UuaqCWSnZViQBRWBOpaZfDAITgxxNB2pfuZIQrCcEtH6Emv1UPKuIjBtAsqySXKrP9oQJloVJLcNK8SCBUnDkJAhVBia1JAj1RFxUEkZlSBWg+OAA0PKumNjqCykyvQK9Rn1gU1KPQYBQJ3l0yGRUj+3k6aSGqrXgP/TzoOfHDbGBkjikkke8MkioxcgAkLUdOlQaEGnD0xEiFv1pAjRySQoxdWrSij82QyPwriQwEoMsoaTXR8ywI1KqjpGVSa4SAPLyhUmjjIRzQW8taE5ZqpzFBhoYmcXTieGS3afJQ0gUaitdQ6jQU+AwmIA0gedYXfNNIaF20pJUV1LQ1rTkeeBDCpFUus0MJ7ltLqeYVNUGR1DI0HIDAxh84kjjnkCgtORNLBFQExqcqmnAehFcOBSFkqjpXTpBY20pdmZXlWtNXM4Qyt9bxxuW/qOpjvbmtVcUFOBzyyAGK0SYBGCtClRbskeqGOXNZozkFdSRwIyrhiR1zG0y9pnhExZO9SrBSQ2lSRSh4YBnQdbJ2IjTUVQs56iSdfVQgLQEgHPAApQzTGOeIJNGQ47OatGoJDMGP1VP014YQgt0ebSs0mm2dKOZNOlApqobTTrNOXLDGHFIJgWZ1iW4ZE0qD0lemgrlQ+uAAmJkV9Cx6WjOicRsGDoDwQGoI4YQCqL9GSTuTGGSTrCglwoJPQwrWrcRThgEz0cdI0mSES/b1B1hUZUatEKk5fP8MOBnZoWWaFJIlmWQFrdASqEnMBlNeGAjBxRHokFwgbMvcatWmFaUooB58MMAyHWxkFRGtuhCS0YqiGmjUvGpPxy54IJBrxxxlY3D2+tdVwmoGrk9IDAhOIzAzwhHmfTUtE9rEsZWQqrV1A8DmQFrUn/zwCTDUjYToFZu1GpkkL6e24YfWaGpArwwNCkKrKsyo0yyaAO3O1AMzqQBM1z9Tww0IU/pyQr2C8F3FIDdIT0nWaM8YOqoqRkcvTCAPjkInd3RWluiIrdiHjJcALUgDPhUVxJDfqCjTVUOvZmKuiSBdP6oNS7EVHD/AAjAhC+wjmkntWaKT9FgDcJQq6KagcSOPHKuHJBoMaeSdmu3ZzIJWDUZSwU0AjX/AJsuJ4YJgBTcSwoJ7aQxL2ICz3RLq1X+kMAKEYUjSFb3N9FBHFITE0USALDIVFwT9FVNQSOFMEgBsrW4toovuFjf9RpHjQVnkzBLLyAX1wSNOSZwtazRyTzSSXAdtSKRp7moUGhhQihzIrT+GFqDXQc9utIHt4bYyfby28Rd2QBnj1EnUBUuwcDqLcDg7hRBdHiXhUTtHdXW82sUelZdvijIeShYmpioKkAgt/xxVe7RKqTNme0ntXa73udvbW15NPtlvILndLlmKpNDSrBY6ZE0AFMjjn8jI76G3ElEs1R7q+St4l45su07S5s7zdZWt9oaIiN0ht4tTBVyByJ5UrTGC8LQ1pTqfOP3g1X3lVrGg+9gZNEoCqGD11KGBHEU4+uMt9zVVqBk8Z8U/wC4LlzepJeWdtCUs4mDRxx3YrWUgA5aK8TSq+uK1uJv0Jm1l/25tt95Oki29y8TW+2WM4LGXtKU7kigVJUA00mmZ+GJWcDq5Mk+5l9Ja7TvtxNKk8m62zLbOUMkUZunVWjOYOulanlhY3LHKZTHnWz/AOkb549DITPLt22WttAUckw1SgEgAHSpJ+eL+4ljUsjNpBES9xKGBeWUMAQXLChBoSSoIzqMZ2bEWztyQW22It0xjuJ6NcWsVO6S41CjgcAGBJXlxxGC6rE92SgEAlXUxVmLqO4yhhpbOgpU/wAMNKAdoGUyGQ3M06RpIwaS5lhNQACEUPSoFW/n8MSbK0x3tLt4YxPdaY4rSJWSOLSSgYMUVwtA1WZqsedMPfYTJDeNc23sHvF007Jab/vJhjhk1ICZLkJ0sTWrKhzGPV4q/L4Z5O1+/mGcthjka6MjwpKYWYBGVkcqBmSa8acwafxx51rds9PSZJvBcM2qXUWjtFVbSFxrBRz1SFsgKVIoKDhxNcUMuW47mVY5LaRikipWO20GjkKK1ZVoVAqa1GIMm3ApWSR1DrcLM0U7SaVYPGEkFCVDaaEHnhMEwyFjKzRyHvx3H6jW0jOSkanUdJApmK5emHJIGtx+sskB+7nJaWWeukMr5AEdI6RlQ8RhBsF2965LaJe4AW1yKlDFpy1hiDXSMh+OBolIZHcOP1Y2KEKgjd2J1oo+ogioYV5csQAeEvknWIpA0MsgP+YUtoVg1S6CldR4EnDAcIr9ZlkuGnkXuyEIVoBHpqKGpqFNacM8JIcj2L12lCr3IoreMrbADutEGGnSygUGog0pwwhyOtpJDE06wSapYkKLbIe6JDke6FJrqBBqMqDB2kpHu03FCe7cwGRRCimAMGjlX/k/5UqDlnXgeOEwlDtZyjsXFuyVaWk8UulqSshIOkaiVC0HE8q4JEPCXlndTKI7vtNJdFI4aaKSqoauYJzpyz+OeEwOv9xGtzObfVuF0rE3EI/SjoxZaoTqqfqAA5YktgBOr0tJ4rQC6nCzRnMmQUAd3TIljnSnPDgTYj/VkLGJBFcLXsPmgdFrXWCQFOdBx4YBDfKsAS1UI8Dij1JVlPMxkZEKK1z9aYYxmubwVokaPZ90fpRqQ6kGofQ3EKfWuCBQR64keV9ZdkaR5O9CEXU1K6AvAKzZ8TT0whyMUzHVeTrG8d3PVYzMNSxlBQfT+U8864EhTqMNxMiQLpdjLG6LEmurGMl9YqScyV5HIccSQrDWJoxHP2dKhgVjowMIIFWDOCa/HEkVsQfcSltI6EdSlUWqBaVDUzI+HxwERveWgE0U6QPBkjfWGAyr66vniQNhi3gcsbhH0a6ujVyagpViBl+OFAhKLsusbxwFTASIYWA0qvw01J9c8KAkS3UxuIpY4IBLHbuNESgguTkc2IqfiOOJNimAs3CssyRz6XiXuThydauRUrpIHTlyOBCONNFbCGapZpo1Uzs/9OZmqCi5V0qc8Gwgk3UQ7Z7jzROs2plNe7QUoVGpqA5/T/PEtWG40tqjVZ5WjmHVDCYisZiCMampdHrXPNaDFlalVnoWl7Lvr3PzbYql7a8s7W8dZEHbfRrt5JGKk6RpYZ8j8K49P4Zd1bVPL+Z+FqxQ0yT7fd321C5IuNoubi1meUhkZon0gUJK/ScqZY4/KxfLyup2+JkWTErDFHcyJ24kBCaDIlGV4+3UgsUFRUHlwxndTROo2yiVEjKyRt3D+jASQjrIKltJp1HMHDREbpI4UExb9O2lWlkczwIqMssxz44ZBs4HBDCa171xCukxqeKkDqAXiRQHPDZFDqsiukaxsZraoWRyCGQN9KkDLUCCa/xwIYod0MUM1wUEUEjRRNTQzU4HpJBA+GYxNIgtwck87pBFCwhSVge6SAtTXqB4rX54lqSgb3RhGI2pOYZaOUFGdqVGluIrzxEixsmAZoC5YLLFSY8BHx4j1OVSTiSAcfG7GW7aW0uD3bJKdzMEkR1P6TGlfwOJpFORlj/6SbaBWRSzFW/04lg5AahJcUzyNOOLYgqIzMrwj7glhFI3bvA6Crac8ipNMuA9cRkbD40hurgBbk69LSwoaLpTjqIY8a8hxxNFdtib7VeWiJK5kBdE7cgIrWmYfQakn8caKODO6nLjdol+3ZZmYs/UxrUgrkSAeFQKfHPErXBUGLc2uLuNo+481xO4VzWvQ4y1dNATwpQYrabJLQc4dntoIkVNOmBKXEDMVdhz1AGgFcsWVpoRbJFs1gu3wNHMXaN2MhkpStVAGmh1/PF1VBB2kfEVyDIwAe2ZAsgDOoLAgFy2daHhXEpINCgGExFgrM9VaNgA0YNaCtcj8sNAHBHFyssly0gmSsbAKY43A4jIDKvAfHARDKlXDGIvCrhEl+lS5UHInKh40wDQOjRR9kFCUHeRVr9JPVTVUFvSuAcAAU7Mf2xDMpaSEFAS9c3rnUaBnQZ4bEeUvK1VYqhUxyh0LaAORSpfqOQNcRGBhQRiVAf0oaLcRynUK8yaCvTy+NcCCQKxs4YI5KM2tplNU0AkAUBJJFeQzwxAwoeKWVe2Dbk63QAkK2elACDUAAk/wwthgT2lJllmM7RyE2fbADdS0LNmoNfzV/twxBSVUxNES9w3QI2WvTxYMRwYcTniOwzmiitFGHKEVMTGojzprJBGQAz9cMR5SyRoHjRhJ/0k+TUYZ62QioDHkMMkFqjr23mLEMS06SUDmhOo9JqvHLAhNAY3khUq7LBK47kZAHbcAgAOB68a1+eGAUjtGR3tKS3DaZWoV6Qa9QY5AcBTjgAOmWMSTzPONCv1uPq0rSmla5kczhsADvcUdRGWdSojlTkn5i6g0zHDKuEAiIV1SRRURB9KSfUKZ8aiv8cIBa6xBYXlZ+ypMaTxnreo+pGJINK0OXxwCciXXCyySC5VpZGJYZhwi/lFCByzOGSSPd83BEhoGdKRIihQtQCprmAcsLqBWvXJ9bx9mFtLs2QeoBqVHEiuWIIkw6TUiQrLpFw5MsMc6BkjIyADjkBxrgeoQdRBFKopqJIEWpqq4cam7VSefGvywSB6KKRkGplZEYxzOlCHANChXLSAOJ44AC0QIrSRymaGD+ijHtgVyqpB/KOR+WBiPRIGjdWiLRmQCQtkxOdJBq5UOQHPCkcCparE8soYdtSsTJ/VkfhrZOdBww2ADW6mJXzkhoSoFFzpSjDgaca8MIcBhjcv2rgme2ds7kgCtK6XqvAYBA4pECSrNKiuxX7mRV191KZdVMweeGIIZG+zZOyyvbSdoLWhCv8AnBJqRWnLLCGHxxQi1KyyLLEUBeBzpZiAQqkczXMcMMA/RrjiUMbbqKTTREapBQZheJBGR5Vw0CAho3mhtxGgUIGhIFInGZqy5dZAIz+eE2RiA77cW7hqv9pdSfXlIhAFT3QKH0GAcATEmslkIRSTQEnNgM+qlFHocAoDina0O5Vlbo7CkNGQaBpARmOOQwCBa+gySmO6WV9EBai1NTVCaUp01zpnnhiDP11kWaQIzSIRKxXWqg8NRUjq5VpTDJQcVpHKCivJaxkiFq6UAyARudf7cApHCyvylxbsyrPCihmikfONmIBqRWtPXAiDQc6rHNO72yTJrCQyyArSrZZKanlQnAwhwFfqi5e4QVIOm+iYALI4NFI1VFK/EYENC4xXFwCDOEkdxNEhIDMlMi7ZgDUaUH4YGDY7NbS3kdYSQpj71xH1KHcZSRpQmlPTKpwC6nLRnTv/AGepllQubCXOSqUqiJwJ48DnhEpHWDcJ5DIttLJtEotxpkYhtUSlQUdiCQxLEacInuWB4TDvG87hZ2O0TywXi6dEtujyTBSwJbtkUIoSSOWI3dY1Iw09D7Vew+w2XiewRW0zyXUqf9XMjB1aZgCgUkk8DmK04442S6rY30rK1KS9zPKtv8688VbFPuNs8QHa2mde5+pJIVEshB4qc+AHLGbrPqaFJWvk3ge9b9utvJDbfbW25Xf3K3JGccNFdjKKVAIpprxOM9qNltLST648Ut/Gdjhi+4ZLW4jcXsrDrQODSpVuLk0A9PnnTMMtM/ea75eeQX8j2jx7bZbTD9o1stKLASGOpRWjkg1APwwm5BaGYPKYpN/nsrTb1a7tN63JbYNINDmG3YEyMlW7YOmn8cWVqRb0K/8Ad7LyqazcrPZ2skKWU0PU7aaoFoBmKqRSvEZYlZ6mjEupXCxym6QBOh4THTJQrOaltDZ1AoCK4rZpRaiRm3sokVmCw251Sg5StQ0SrZgN+GEiySK3t0rxxxQx924RVXsoQ8kRap6i/wBR5D054lBF2B2rvEskelQQEWZF0sDI5UMjk1BJA4UpXDnoHaWN4T4XufmCvFbyJtmzbeGbfd/uKGDb42B11IHXMCKhKH14Y6PC8ffPaehy+d5CuCsdTUuw+J+2U3ht14p5J4/D5H4RtEJgm3jc2EbTSq6sL1NBQxois0haMZUpQnHtcfDr8rtex4nJzGsvcn7TO3uB+2648di/7g9tt7Xy7xvcb2tp4zeSxf6jArqzqttcRkx3IXp0oSHzANTjgc7xDo26fcem4PmFfS5QEcru81tM0m3X20Sfb3m1zQmO5ikUkNFJFKoNaGtaECnHHnctXR/Ej0WLLW6motlnWD7iWOrNKFmaYdtmiZ/RaVJCmlDyxUki1goZFDKrQp0p3I2b6QhP0gAcxmKc8J1BCgrI88qmNXU0YLKxV9IzoAh4EZUwhyBhkE/9WOWBbktpqBojRSTQOuRrTMfjgkEziu5WNnD3CdxOzLH0qFzorAcaZ8fxw2ABdFNKuLeUOX0dw9eX5T/hPIeuItDTFUbCTRAjMyTirRlwqKOIBbI1+P4YEMVLexh6Wn6DygrcM9StAdKhU0rmcianPDgcwL4rlkmBTuxPaosWRbuCVvUZBhxII/4YjAIc4NwhilEcD/qWpIMzqNTg5kalY1Ykk5DnhyND9bXqS20TQGizSiDuAjTEwHUENCeqoDaqccQYNkq227mpZqx7eWq8snkB/T6lLFmNCtMsxywoHJJba4srjTaPaRxqUEEksoJk1EAI6EO1KkCpplhwJDyrzhrNlhakLrDDBISwcNXUFlLGlT8cMYN2uDcTRTKkdzcFv1YwAUieoCkEjMcKD54ZHYa54C7LZalELl3eXVr1aqfpitGFQtRQYXUBouWaY9h0+3s1kUzajqLa/q6xpNRTCnUa0GCSWWGe7uABCkUiqY36gQTRFIzI9a4khojG4XC/cvt0y9pBIS8a0HfkIqArHIVOWRphMGhgnu4FdrdNY7kjiJ1avckyAEi1JIHBgfTEiIy3V2rSrHbdUkRf7ZVFEUH6tDHPjTjy5YkiLGeadQZmt6O0kSGawemkKSQzcQan4YZAb5Lzt07UhheBTJEYwGYgAduJwQScyRxyOGhMaZLh3jYrRY0XWik9BZz1V9CdXDlhogxLJcG2VC7u8LGgMbamj4CjLXmeYPxw+0UnQNRhiJlRXQupRqaq8SCDUH4E4HVgFtdpNExjVhNEe2Ia/qdJoWPy/nhJCBnunQ7Fh2DRHiYM9DzNeAqcCTYdAEzENKjyiS2iBmC6KKDSjLWmWrnT+OJRG4xLcbiRcOUPZaeJIoSqqztpFFbUaAChp6nElVEXYP8AGdg37zHd59r8X2Gfd9wUtFe2drGHNvG1F1TyMAIk45k5Y18fi3zOKoxcnlY8Gtmay9tfYS48Svdw3DdPK4ZfI9z202MXjWyqZFtYgwIknnkKRyIX0r00oWzrj2Xi/GPjfFff0PG+U8l8+FVaSZq94PC932PdpfL1s1u/D/M777LaN3DIyJuEITvWNwCKwTkAlVYjVQ0zGOZ5riP5nekdbwnLVqfLb1RRVytxboIhBqjdpGs5IVJZWFB1EAalFc8vjjgtHe7oEj9CvEyAC4mOu21glNIozpQ89WI9hGWIZlozdyT7dUXqH9RVBIK1HAEjhThzw0oBhzTlV7qiSPWutg1KKRl3aDqzIGVMMBVElXil0g6Oi5WI11gjpoObMTU88ECFBla3mMiMGKCNXCKHWRQKGgNaU5054sSItQCkYo0aOxQCimYPSOQN1qtCKKtOJwNAxtIEbOJD2hASlQ4DSaiWQrXIegxFERvmVGdbbRoedjNVzUotOJzzoanE0BLNjFxdsskFxGghJkezppEf5QU/xagDUVGLKLUouydJSKN5FbtqwLISSyFaDVWlCK0rTFzKSMT/AGzTi6hekbSN3EQgqGOShAc6imfLFRZuJ5L2KGVIZYFlaRwxcEau6eDFl5U4jDTE0OTPOgkohluAlJpVoqqCQCUetageoxYVvUMte+Z5I0f9O4UHtvzVOZFOXHE0iFtCUw7elnHbTSCQzAh52jkGaMaKeXD+3FqrBU7SSOGMxPKrxu7HTJNMWAYDIiNaBga15nF1SDY7RI8QBhhlCtV4pHIqAw6nIJyFMhiTQJhykqgVf6pZSjkkw6RU1rxNBz9cIGciUSnsliiDJoSNIBb6dBbj/wAcSRBh+mJAweb7N1cB0OYFeAUE0zpmcAI8BLJIkkoaKSRiJGVqaUrllQafn/bgAHoNXpKbVmBntZFUE0ppbUGohJpzBpx44QHSWZuypjhlDqbmOJaGn+JBwIoc+ZOBMYWFHeje3fRKEKiU6qOQKEihqMj/AHfHDgQBNAlENA2oBI7jSaZHMMK5kGuIjDUNZ27bd37c9P8A78KEcI2OWkDMCuJCQUAkUsRWcAOGkikrpaJj9bOKUegpw588BIKIUvFFDR7eUHUEA/VJ4spz5EZnM4BAe45kjcopVj25rMNkqocmLBakClSR6UwhTBySNLqe6jjBYITKWSkbSkDp4cfgDlTPAN6Bs0vbTSjxxxzusjICVrpAGmrCgYZE/wDngGgLQuwBGhwDSLUeqMUoRJQ1OZyHqc8MQU36yFGTuRuDrAZqFlFarU5AHI/HAAIyzDXDOplj7XbZgAWccUbSRXI1GAQWYbMxxq03acRvUBQwDgZVJoa5ZAYY5DNEkSyv22hIRI40VlP6TDqegp6cOOFICYx9qkDRlgodtcmZMZGXSBXAM63bMayKemJQbe3rR61OrLMDjTDYAUVYWjAhZ+91vMrCuk1JRCC1TgEE28scix2yOYYiGlqxMbSSIclcZg0PPlhMCun1k6lc6p1X7lyiqjMv0xZHM6fTjisn0BoVks31SFJmotxbygy0dadIU0IUgev1Z4kDC20SlV7IRo2EaydzV2iACq0zGRyOeFIHZhKkTMtcnTvvpI1sa0Q5mvHlgZJB5doWgthCPuNFOFWQE55UAoeFcBELil0K2qGQRxOUmm5LXgBw/AjIYQBpE8cKzadUXU8a5u+kkASAsOZ5HPACBOUCW6ayht2p31ppBNaA04mhrTAM7TTLESVmumXriQU6Seo1ORNMiKcc8MQK4dHuGWVNWpdNuA2kLlmHPJqDjhgFxMrSgwkutxAElLjNiDwBPPLnxwgQdCWSSPuESLC47gUDUSc1DKQa0+GAYOJpEka3OlRcBl6iA8WrhpbLInAI5HFDEy65BDLGVEimlGQE1PMBg41D1qcBEVl5u5JLCh0lj+nkA9fqNDnnkRggZyNft7poogTUkzl1VhM/Ag0ocq9WAQGDpKIjoZpGLyQlqp3AMqM1CFrkBgFAPVLGZrc17aCsswVVVQK6hRqg0rTLDEAWWfSkysNER67cmjaVYEEqKVrXjgGLxKDUxFoHmkLOjANTP6604KcqYYmgMGuJtayRmWaqI8qntvSpLKaDPEkRHaC4RbqNpkkeOZCGU0EgUjMgZdNcsR3JMsfwzwvx7y6azgbyf/R7rcpuzNM6mWMBeAJpwIpnTLELTUinJpX/AOcn9yN0sLDdfC/INm8wt4Rqis2raXHadKoI3YMsj1QqSaUxT859S3snYozfPbHzrwndez5d4lufi0zrpkmuYneOVRkCJE6DUg/TzxL5q9Q7HsHWnt5vW7fZC18d3K6VmR1uba0dizMaL3GoRGKGvDD+ctkL5T6lp7R7Ib5ZXv3vlU1ttFpcyBVt3UNLKBoAKggjqPSWJHryxU86gnXFDLZ2Sx2zxC+trLYFtdjimkMu4bxIC7uFBJEa5nVKSAM6f2Yy3vJorRI1P4Zs/uJvfjNz4345a3G2W+5yy3F9vNwCBCrEARsTllTJkOMuSs7ls9S4fAvZ3YfE7K2n3O8Xcd0ijXuO4AiMikMXoxFRXjyxCFuWKzYn853vZ9vCtBaxx2EU5ZJY0Oq4umQalagz00AAxiy3h6FuKUZD8q3Lct5+9jFzLHbd7U0sdRGWYnIlxl2xkD64zfzGqGUj5bfbbsm2mG0bQ92zWzzxgya5Co6NOeqhBJY/LEq0IPQgOx7TJLv5XcZZ/sNotxfXUykrHEHVXQxsQAFYjS+eTVGLqIWjM++Z7hBf+S7veq0tqu43phiNwmmaXS4ZCqpQKHDArp5Zk4T1ZqxaIiu3Qtc7rLLL3XlS5AngVVaY1b/Acgopn8q4i9i8sLe2W1texHLHO9xIwhtlJDtC1CykAjUA3xAwVHJDFla/3FpooxpSVnSaNgdcafVKcqHlka58MW7FSLf8I8Cn8mF1u17cLtPiluWlvtxVaNclDnDaVB1SAE6ieFfU0x1fH+Ntlas1ocvyPk64V2p6l8hbW822WxtLVNg8QtA0W02ylke9aJRLM0xGZyI1PQkk0GePb8TjVxpJI8PyuTfJLsyZWTh7LxHaLmGB7jzG/itLfY51rb2mw2JM1wqN6BGAIY1YD542pa6GVvurBGvakzeOwzWH3vb8c3K+kG82SdqdY45JAFmAyEZlGkjjkPhh5caupe5Gt3Jo/wA2/aD497h2873u72E8lqwfa93MP2e8WUcqKWAu4iXZaVOl6g8ssed5XFxZNLKWzvcXnZccNMwl7m/t28i8Bmv928R3i291fEbOY2W4X+2DVuO0MNIpe2y6taZqupKkcxTPHB5fh74l3U2PQ8PzVMj7bPUoNQZYn0nvOy0tyc1ZS1Kg0z/A44bTThnfVlbVA44Fko8TNJLEWDSlqAVUakPM0Xn6YUDk47kLGEQTAap7eQL+mq9Q1AE5gkU4ccRaJCTQXieK3Ki4umWWWepUxqaALpbIU4NlhwKQfc7Vq00sbdyEGKMgBoznQaDnmuZJ9MIlAVE8iymaNljExANuRpd9FCHGZoa5nCSFIZJcuzzBo2mHcV0JAQ9wVAqRxrT+/E2hgnniW4q0jPdKBJNOpWXUaZqQpoKVpXEUkEwKEu20FyslvJk9lLnrVQaaaUGY4k88Jocj7bbjcFpO+6q0ZERiciNWdcw6igPoTX8cRgCUWzxF4bOSRVuJlPcu3AZZV+tFDVqCcxX+OAaJztU8TCRRJHbRWrCOeOcAMsrE0HVUqpJzzNCMIcQTawlWTsT2V6sMikRPDINaigJaSg4A0yJ+Aw0I9JJDFOlxAT9o4lhRNS/rEatKglsmJGR4+mEIb0ijj1Kya+wWl28R5udQFTpGTMK8zXDAZkIeCV5I9Yjh6pVYI0tSTpABoApPAUr/ABwEiNXtw0cchmVYlVY1do1Kdtmy0vxqxHqDgQEQ3OWVUmJjWzgBTuSSx6nDMNIK51NSDT4YkhOzIXeXixxsJ4HilimUtOJKM7H6SRQg860xNIg2NF3IIpmkJjZJSR/liax0JV2VCM9JpU+n8nAnYaZritzDJPeCYxAySzJ0M7KelCh08P8AzxKCAgZmSKQ/caWlesVqHJZ31fS5Oo6RSoPP5YcEJAMEJl7jOYgwklqBTUck+kfUeJplwxGWAUagssWRtwREKa9S8WBbgBWmdMTExMsXeniFqe3FKTLMIzoMfJlU1zGeeGqtkJAKYplZdRiKSKsUyqS7aSSoevVrqaHLAkSZxjcrA880TB5WKS3BcVUjmvCoHPM4cPoLujcnfhftd7h+dGOHxrxHcNwhdg738ifbWUmqo0pdTlFBNPUjGrDwMuV/CmZM/Px4VqzTXgf7Lt73jd7eX3D3232vZoVZZrDZJhe3b6zpETTtWKBQwOp1DN6Y7HG8I05v9xxuT5qV8BrQeK+CeF7hsXtr47s9ts1lc3DiS1sZgvc0qhLyykB5JTTqLZmppThj0/G41cS+BRoeW5PItlcWZCvZO8k3iX9xPhkr293u1rv912BMFjP2Wlo0gYDqVFMSgaDm1KZ4tyW7WnPUrrVJRBm2z8p8Y2jznfvDfcLbBuntH7sBtu8t2Zj+pt91HIPt9xidyO1PasynWpJyIzxZzMKyUh7EONltS0rdGVPfD2U8i9lPLv8AQt4uv9d8d3a3W78L80gDtabtYSVJdXHSJ4h0yoODcqEY8TzOJbDaUtD2/A5qz013KGdIQTCGBhZXFs6UIA/PqLcKioOeR4YwQdBMTA/oKoBJZS1w2pRIkYBI9QfTVp4YTQpBrcK0sVwoaXTCpqVCq4qQRTnp5YByLoj2GU1WBgCqKBXuqKF8sgpb4cMIGwcZ+2CgjsSgqryRMJGRa1U5DieeJyJM4sv+Zkt50WeNEKxOwARFbMljnSprmcJtkRHQtrSqPHDVpWUawzgaQQPzDlTiOOGiIiNoJZ1AnLSaRJE6qSKGrFRSp+GeJ1cg2Tna1Meq3SJrZRqM2dG05FlI9AQMxi6pnuP4uQqWiGYfcguCqpRGqOnNQQennibZBIjFzKykOIQxlLPMEqxQj6fgA1cVbkoBWVgiXNpSSgDn7mMJk0hqQEJ50H4YnWuorWJrYbSZzJpYBkcmO3bqc0BJBIyNAM/wxfWpRaxKbO3W2bphdwih7hpSp0xjMkVpQ4sSINiu5tDHFIiwKmsCRaNrZo3zCqf5nLE4ISE7ZBPZsbeeUFWKvbzKhJYVosbkila8OWHVQJsf0YFxM9wqPcSFZHIQppXMpQnjyLcjickdQ2QFgkaI7xp1TRKRmWzpHqBNOAFfnwwwkPZpkb7iR5NBpHMsgCg6agafiTQVwIR5ZColEsSl0BkaSUqz0GWnIElSaVw2COrnHLn9wFYPLbCgoGH1UPGnLCGFOtqsLCN1uAxY2cax/nDfWzMQCRSgXhlXBASH/oy6VZlPbjZiFqA0zAklHHFhzzpXA0JAIZJJHzjV52roRiEdS4zUVoDQZk1w1BKDuaNFIrdgh9LK66lJIyJqGHx5YjBF7hczvI0WgLGrkC2KBqqgH0nMU1evLhgGD7mt5YlV1Lka+44cxnMkJQadXOlKUwCkItZVojyytbxsrRRSoKADLMkgj5EjjhhJ6RRG79Tpc25AQnPUfUVXMuOA+dcRGFls4qAQrMdFuZOpk55gDhTnxriUAGMixpqmnbtSDQ6sO45atQ6Upkx4k0ywMcCUdxY3OgvNCf01DmsQLa2aQKQ2qoyzwgDlFuLdS6toDarWhIaRlJNKECgrw9ThiAataTyGFpLoLWaVmAY0NNChSRqAyIGCACKSFZlWISiJtc7OuYXmmrDAMRnDTRxae1JpeOOTUJIzxXSOWQIqcIAoKJI6qsqs0ndSYFgdQGa1qMhgA5k7Q1DvLMDFoUAEoeJLUoKnKvPDALVOzKirJoMLaJpWFVgAyyHzOeAA54biGRoEyjnzcAAsqgVMg08Q1MjgQFbEmK7qU7kTKJWtmotY6EEqKHicUosC5O1UiRe200FbaGEFWVSaVGrMkkZ1zxJgchaS5IFyhnVAyyB10KC2WivNlHEHjgEwS6pSUMjONehVYZaNP6ZXMAVYCtcDFJwxlvt0ppuY0UJGJGbU1CaMSAPgBWgwxihZNAHduDKYBpnibM0k/wAQINT/AGDCYBYCaXtopGliXRNIB0srKaLTTQfwwQAc7yLKT1RRdRiLcSxAHcX+PPPCCQKrE91PHkqCOkYi+glRVi3PqzGABQxaOKzZuq6kq0EqMNKVzo/oQBTPDAEpEccMcjvGkn6kWo9es59eRCqRwP8ADAAmbT2ZJ5W63DKZiKsrg/UhHMU9MIYZ24zLCuvud6qXIC8WGaGoyDNQHDIiklWM+pTNDIlLu3I0ya8slB4moqSK0OeCAOoZG7weZk7LAzTCpIHHSCozzyzOWBg9TjSsioxUuxDwzaGzOVaRFj8Oo4IEg+F1jnS4C96KFFKrKdTNqGRKHJmWtB/xwwCq0URdlmljn0pCDqAUZswrpoRxpgEw6KUp3ImXvNI+lZdJ7jIPQkUIBHDAAOH9GCbtIJIYqpHH1FmrlQEZ0B9eOAR20Z7lFgVlJDLNIZAG0UbrUryyxNCY+G2tr6BHl1W6rVhKyFNDCgqaDMZVGBIj3DnYWt2jynbtxIoAbaUM8bmSuegKrDPTwHHDcCZsr2M96PcP293ez24SyXdndKon2yQNP3i5GtEAyGoUKigocZM2NMsxWPsr4Pvdl7j+L2V3vPiF1aQzxAz7VvNoOHCoSUZAUyIxm7TTr1EXkPsxst7ZCDx7cbnxiVn19uCjwu35QaUdf4nEL429hprqZh8r9lV2bcLr/uNN5vopmDC+2hS0QiqrBasJK/TwK8cZbu1N+hekrdRf4luHtL4sVns/E3fcKiKGfekaYmRTmYjIAFocxVaYofIaLflk5k94rSec29ht9xBBKj/dSgDUjJQlQgbT1HhyxS89mS+UkMt17kbpcWk0m4qohJYbVbGZCko5dwAEpU8q5+mKbZGyxURCLwbhu6R3W43Flt4UDtW6UKwAkVKxnLX8cVP2k9FsVF5dcWctvZbdskz3YtZWayjZgFkfNZjIhPTEBnqPPC6klZmdL+3ju728WVvuI7YMt3IWJjtzE7ErFUgMzhQQ64kk0DcithceF+I7jvVzF2LvyQSpawCRW02rL1llY1jyJFCNLHPLF7UVHVSYovpu7NJFW4VYZWuLY3BOsxyGg0Fh0hhTIcMQSNS0RJfDbQy3CXzApERpEhXQzmv051pp9aYi3LhFiHHdb6G2vJ5VKuFZoJIlCdxSy6o1AXKhpWmX8MWVo1qJWgmHtt7evvED+Sb7E1j4naXCmQpEVG8MHAkgtQrflGTsMl/s7fjPGPP8T/lOL5Lyawp1ruXPPcDfdxttqiC7V4j4yqPPtkWpYFMR6LWJxq1DSBqb6ieNcezw4FVQlojxWbM7OW9R82m6S9lF7FDFVNEttaQlmjhhhA7cqggBlQMU08z9XA41VUGd2kDPuEVluvnu8bfcBP8AszxGW325rnXMk13ea1eaMJpKuNY1GlKZDliyOpHZEY8UuLWbek8YMUFim67Wbqw+96mMsDklXEdASpK6QeFannh2fQg11NuexPuNN5T4FbG5jW6vPHIbi03Dbq0uIWhYrG0rGoIAIKZmo+WMObjpWn1NWPL8MFTe325Qp7o+4vj5uFtbm4ki3PZbt3eLTcxsrmkC6UkLhq6iOVMX5qpUIYm+6SoPc32Z2fcLyQGNPBPM5nZdJSuybuiKe9LcwRkm3k1LlJGBQ/UtDXHA5niMeZTXRnf4Pl8mFw3KMjb745v3jV7NtHke2S7PuM0TXVrGSxt7hVoO9ZzxlknQ6uIIy48MeR5XDyYHFloew43Ox8haPUQRmRzbd6KMSLSKRFJrrYsM5BRWBB9B/HGV1NsQcW1RGazilYFmIdWWhYsKAI3CtMzwriDQVEzwkARXMiSSsW0OSwNQektTKv8ALCJSBnKE6jGbq3iFJpGYdTOcitDTlQZ4mkKBE3ciZVaMIQxjijKlQjEglZFOrpp68eWE7DQRPJIoiSFFKEtGGRtJZlYsCpBqVBzrhJkTv3RW5SOYIlwsuqabX0EMKihOXDnyOAY7Q3SoZDckNJUrHpK9WsEgvSlQAeNMJocks224TuNqnKJbENdwIC8moNTSBlkG4GuQ+GEyScE+22QAN9wTcRrqkggkYxM8jUFHIBqyqxAGEPcsKwtIEitkpK8oAkMY/SrGRqAVuNBX6Sc+GWBC2JX/AKfJJcSwK8S98UqCJCYXJJRFIGkj51XlgiSLsNbW7WzCRbVXjhcQ39tBVTpI0VQV9BUkHjw54aQ0RjdoLe3Uql5N9n3J+5AqFXgkVSwWleoMD6cuAOFZilld71exIATNKJAoa4iRgpaoKozHSVBoRnXPlhpkpKy3meZVRTetHGQsccbPpYyHhoUE6gQaajkMSSE2R2RmaWKKORoKxdiVy/cUyFgy6mAJFDmRiZARXEryot61ZZ0kKjuaV0lRTSADQVqKiopxxJEWJrlYgNf2RmNuFZp21sS0jAFesDIE+uWGRQTJPG5M0Yj7UANvIkhpIa81r1cMszg7hNMEiRQvpkUpEsbM0RH6iRuAQopSgPGvxwTIoYZFEkH24Pbvbu8BijlYOulBkopUDiMs8+OHqKD01tZ9toZQ0XYZzFqkFF/5W51qAQMSq3bRELNV1toXt4F+3TzbziDb923aP/sjxaSNZovIN1g0XVwKZta2ZPdkzHE6RzrTHU4ni8mbV6I5XK8vjxJqurNW+L+0ftT7eJaXm3+NDyDf4P1IfId8McsTStTK3g09uIheIKn549Nx/EY8fSWea5HlsmWdYLL/ANdud4YWcDyo1uqTX1xE8cdlZwRk6nd1OlNAJOgrU0x06YktjmWzOz3FvjHuf4ed0vPCfGZzvV9Bt9zfXflr/pQXU9ue4FSJqV1CoFaVphvE5kh85pFCWnm9vuPuh4UJZoV3Lc9xcrYLqMkSSV/qMwGZzOXLGhVaRSobbY3+A75P4Z+8f3E8WgZUX3IjurGOOVA0Yuft0uY5CMmH0OBprnijJWal9b6FG/uE2O0svOvMfHoe9DuE9xb714xE0dSZpIS11bMpYhO4inSSDmBjTZt1RVSO6R18I8+2n3Y9kN39ofO1O5LsgfdfGtyQB9wtL9R2bd4QaFQWXRNp+oHPI1HOzcdZlDNmPNbj3VkYR33Z7zx67ktJzBei4V47V1DLDI8bsrUUU0nUCWBp6Y8jyeG8Vn6Hr+Ly1lqQ8iUyxCNmuY56Fo+mqKVOsKwoRkOXHGRz6GtQHLcTNHPbyRjTG/6du5C0HGikflyqcR1JBzTNWOS3WQyL+lba11q+gVyHqBXjxwITFaUR9cc5KN23eNjR1ZqgKhJUsTifQj1EjdUbNBJWWU0WVDq7rg1CEEUAWlK144QwcKiNBOsjfcTTNHNbV1tqbJ+3QgKTzrXDSgrbli8WSRl2R3EIlZQo4aV+kErn0kHLgcTRC+g+WzPUyrNoaFOx9zGoLmpFCTzB/NzxaloUNtgLm4u7dLiGSRFoEEU0VQus1rHzNKZ8MNyNCe1t5Vka2X9UN1SQIGk6mFA2VMgOZywkDJLaWdpDIbdXaSWWPuoT1Ohz63Iyy4CmLaoqsyc2UFvCkcsql4Y20ySoCACuQ6gOmnL1xpqilsdLaJmLyaI2m1s72rAkCo6HqxGVaZDLnixERZDbzxlh3C09yhe5KJpqF4aSS2n5YcigEsCIkUkdVYR9yCYAnuaqqdQryPE8sKBHezG0IeB45kSRdUcgr3JCBwJIypXKlM8ACxFWIrrn7tqra51iNJKtmQuqlADkQOWHAM5JHKJyTB27hB3nhVtKBAAtGIr1Z4YpOykNCJiEZSVkkOQeNQ2lwtONMApPfprGqxHuB30pHIQQAMxVueocycAByxsDOwjAWSi6/p0oORoaDgcwMA0j0LLLQh44GQGRIwAPoA66n5cBmTgYHQ8XcWSRkiiAYuuUjhmFdRJBoGOWBCkLZVyWKJVDAallQlmBNQSfhwqcMEDuUi/TdVmRCTEvc/qFzQ9LZihPAYQxG+uSFhNKdVDHocaHbRlRGy58TXPCECOYSaq3LRaYhEw1OV56vUNxFRgHB4GDVOpkLWwULJo6jxrooTUEHPLDgR5njknaEqxV3UNbqwDuWHST016uHHAMLETRFyC1EYkpKa5itApzJz5c8NIYXFHJ25XZ6l2DTSOdIcAGjin0gfzwCDWVnMEkY7K0LCHPUU/9+aciOAAHLh64QoEa5s4QoYk1SrHqOo5mhIPCmGyUnGdGSNSA7oFbvL9LU+pyoAqFrQ048sEiDmFwwe3kmRpmUsQDUtHy1GgoBkcIYX1iKkCkDQVjiPUnSKuVI/l64YjpmnS3IjYpHLkiH+oAFyVcz88ABZTsPHHNcECZOpcjqLChLGuTcKV54EABFlRFZWLyR07MhfqYAZkg50AzpgCCt5FoJz3VYKFaUNRtdacFrUHOhz4YqLGGSMzTFpGAZ2owYZLAR0ivKhyywxBRCpLddlJICyonbcg9QP1Ur1cM8AMNnkjLySwzLIYU6YAo7XIN1DMgZkV4YIFAKOURwxq0KosiS6gy5sFFQ6EevGhOAe4eC0z27SDS8UOuBlUGNKjSS4IqWb55YcAECZlWFH7SxaCbaZSQoZsgABTn6/3YBgdMhiNnGoZ9avQkkdrVwJ4qCQThCD5pnaJ06Wqw+1hKaJH7VStVy6V9OeZwADlWUrcW0kAQzUkYRrQSFh1cTqJNMqYbBAwQx7KBWeOHVMwqWIAIABzDUHD0wgCo3gMKx6pJJWUltVVdkTL+R9BwywpCDsRk0x6YVaSZao1WUDSciRlnyGHIQKkP28gnWN5oaHvLUFlccw3GlTlwrgBahEc69swB1njYPM7ICmo5VCNxrUYAYrjmSMRRPSa4ClezIpBo3EqxyyWpNc8BEAJYW7xuyPuIKI4KkLSooVIFNWZIoMMDqztK7zKGYRkdpKgdANGq1eNKg864CL0Fdswg1BdJtUkLRFRw41UE5lq4YSFRMkhNy2t3jcHvikaqSCK5mleVMORwaQ9gfajx73J3xrbyjdDabZbVHbt3WOaTXnq1txWnHFN7tDVZN37b/t9eO34nk2f3Cvreyuk/Qimt1kULkysCRmBWg9cVfOZO2Esnx7/bu8Rt4oV8i9yN33OKCTVJa2lvHAGVTXSHJJp8hhPM2JY0jUvivs17DezEb7pY7RtO0XtsjvJv2+XSzTgaQWo07aVAAqKLiPd3e0ku1bEW8t/eP7C+JvPaXPuBDu17aiklttv+YHSARRh00IPrxw1SzD5iK+sP31e1W6TXAgnu7O0i1tHdXKpD3NFK6Q9K0B5YTwXH82rLL8a/cZ4T5VGZNt3f9KaVRFI0sa1oK10MeXP0xly9y6GitU+pJ3vPB/KI3SdNovjDKP1AkTq5Jrk6ZfMVxjsp3RYNd5sftvaW4uJ7ey263dGEwQ/1EPT1OpoAfXFNqVRJWsNE23e2O33Vv2oEa7vwV2n7W41RvGgFaAMwbSMi1BxxBVoWzZla+41/YNZyWWx+PNNt8waRYrQLM7qtKysCxcIvGhPV6AYrtWXoWVMdeRXkU19JY2lzJuD3w7V5cwCqyI66o4l000rqpn6/TXjgWOB9w+bd4jt0caXG+1gttuRZTfIzIEc6hpjLZFyxAJNcjn6YuVe1SQ1Zkb3g80i3683C1VnEVpJ9vb7WEeMyKjBTTMFumpIHPFO5rxVgoyOWSZYxJKjaEEksH9R2UkgIjkjiOApgehf0LR2Kyi27Y3kTXbfc6lhRqsHUA6YzUVHVnUUyxBV1lDHLwXwY+abkl3u79rY9rkWXer2OOkty8rBlt7cLWrVADHPQKVzyx3vG+Pedzb+U4vkvIfJTrXcvHft+j2Xa5ks7S0s122JrPYtjsk7a2SdSNCinUpJDay4+o1JOdce1w4lVQtjxefNa9pYTtwks9m23ZUEbHcLsXF5cTMY+7NIC7lRmVaJQAtB1OaZY1JJGTukkEEUsm07c8bzRNvu+QWFnfEMIFs7XW0hkQk6Y2VHDZZkiuGoFZ6SQi73CaP278s36WFrZvO/IbeCyk0Arb2xl6EiDURkZVNWBy5jEloxEX9p792872qQWsiiNJLMR94TyXUcgYiUI9BTp1V4txpyxG24/7JZXtf5gPAfcm627dDJN435JNLBuE1tO6zJI8uuB9RqQA40uTWg4UGJZKd1dCNNHqTHzbfD457uWO+yW00EG7zSQX6iYMkkT0UASMiBBooRTIU9c8KO6kEq2cyX7Jt22eU2Ue13jyS3MqyTlVVWvEU6f1InWuqg0qSCTTjQ54yNQzWviRUnknjckW2Xex+T7fF5X4tIjS21xOaNHI6svdSRCHt5FYgB09KEYjlwY81e2yHj5NsNpqzNHnPs7ceO7VP5R4xPL5P4SY+9dSBS247UQKUu0Vf1Ij9IlQZCmuhx4/wAj4V4ZtTY9j4vzlMq7cmjKiktkhWGSKPuQLCGdoGDJIrAKrLqNBx+qvHLLHn3XU9ItdVsJbiKS3EKJbLbs0VW1dsiVXzUFgaq3EU/nnhWcaDmRBJG0rMhs+0zMEKA61EoNVK5VGQoWwSIaZI3j7kLSSLFcN20bSRUK1DrOQYHMnAkA3tFLaq8hcdy31fagqtdJ/MFPEc61wDSTESL2HJCPcxTx6Qi0OoknXRc+NK1wCBQ3KQ/pSMwVlKszAZMFqKHKgoeeENEusLyNGsZG1xzClCCylVQ6g5cZtUZEH+OExosbYpbmaaMPOY3vS00isQQuird8N1ELlSgzwoJrQuXZJHhMgnNUknUnvpQPOBUxLqGsggjOmED1LUtZ57iXS1tFKxhcRgCr21V0tSNqVWgIrWpNOWGippSM16tokJtlti8VqskaaAShDkhYiWoNQIpQClfjhjTgp3frgBSQVUopEDFQ0qSjhr0mlAOeIsmlJS26X6FFV0Zo5pCsqk1QvSoAPEAFq5AgYEJkAurlRJBplFmIH0KkiEsNGdSxPxpTE0RYhEcRZYRGjw3C9wMysCr8hVOdf5ZYkRBTd6UtC1uZiwXt24J0EmusBs+fAn+BwSDR1opHnl72q0uXnV3JoI2WPMkFlypTiQR+OJLYjAHJ5Xe2gZ2F0BbkpG3eaWrHVlkdNOHPEloKJFUNg5kfuuZTI5+1kKlBxoSisQQVrzqK/DA36AkWf7de1XlnuTeRw+MbfHbbRauybp5VuRKWFtoYdyNpdOueQpmI0Bp+ON3E8fkz7LQ5vM5+PAt9Ta3g3tJ7e+1UdjuFhYHzLzNtF0vlO4JVI2GQWwsQNEWlT9RBbjVser4XiKYdWpZ5TmeVvlcToSDyHfLy/lhhto133f5C7ptbzVaCNq9czKCsSDnqPwpjt0wqpw8mZt7kUjv54b1vs72W5kkhK7/5HbvE1vbnjJb2weOruf8AHQZfDFsFTs2Q7fNxTe9lfZLHvbN4ntsyzx2ll/XuHWQAPcSgjWXzqW6Rx5YkkmLuexS/h/kcae6u0Wdu9i+3yXFzYXMOgyF0eNtIpXrdOb0qeWWDqT2rIweTS7jtnmFnud1fNBe2V65EpUl4e1KCrARtVNYNPlixhWBz/c7uSeGfuD8S9wrfTbsbbx/yaFIi1CItDSAaSGIZVINfWmMV3Bs41U6tFu/vQ8fiHlW17/sdvHFbX9uZbOj6VNSs0OpR9QZZQKE5A40Y27UcmOtobTMIw30uw7ztnku3xm1O40kvZVAgEN2jFpNIUigbSaig4YztRaTWn31h9B+8u2m23G3bepoWuI5XJ8kgjKiSOeZQUvIQRWitxoRWnxxg5XHV0a+JyHjM4+S7Fd2N72ZolloWia4CgLMCwYEMMufEcPxx5nkcd437D02DOsiGi2eOSSFHZ4YqdvtyGkbMlSS1OAzxkiDbOgutdcyh4CRLbyEogcjoJz0g5EGuWVc8KHJFsWQrqdYpoI+7ChMltoTQorRm11pWnqcsNsSYmeZJ50aWRtMbAotaydJ6ASoyrXOgxCCUigR2Zg2eOF5Xnm+5l3kLWMLJrpGsdQSaAZkHOuLYKJ1kk8dv3GtTHGpuFjK9sFlBCULmnIgcB64nVELMPvHtoITSN3oKxl1f6T/jVSK1qeWJ6EWNkcclRAjUhqE+6J0Ln1UFSa15H1ywkJoeY4liksl7UkUaq0MTaAndBPWFyqRqzrzxZVSQs9CTbftMe2xLeVQ3AYkLQABqVVUJOfxGL1SCl2FtrHdQuLlbx4/uKyzGRaws1ekU+kEEmoBxYtCEjzZybg8h70kV1LQq1SUFKUFdPpwriSE2Odu4S5jGkRrI9bQxglSlNLV4Hq4YfUg2LnKOyuA5kRzHLOKhioz0acwF4cOOJCDWa2RO4P1YpV+kLVFIOZB4mhFOOGkMN70Qlc3Xbu5FACsW6iGpRVQE6WBwBuGVdZ5UaFWeQFiCSP06Zplx4ZfHAI6qqkkQb9KJCWloxZQXy0ahSvEZEUwIW4OOIJGUd+4ZWo7KumTQuYJFcwKZU44BoKRAGaN2ZDkIrjV0kVr6gVBpSvDACOv2/wBGW4iEjKyCeILq6lzFDxHrlzwDPOmhpXMmmSeQa7YIGEkdPqpxrggIAg9y3LB9EBY65WbIovHMnKgOQwAEkqSIZjIkygGJWBIZKA9NBXVTM0NcMJBlzFI5hVsn0qXZXWR6fp6BWtRXOpoeGEwR5nBd43ECLJRbyOmljJSmpjWtCwIpXADYBZBqkR5BDO9UdivSKAkEVyLCuXrgAADEGSdIZAwQoh6q908GBNKZHPDAJldI2haWQtIVLO5WhjzIBUgcTkFqMIYcGCsjRNqjfUL1ZtQLNGv0kE0JHKmHMiClkdXFWWJbqIaZpFzDjJlGYqBzBywgBtIsYtPuIkc9wo7xV9CK8zXkPTDYgv8AyygoAJIVmIYhSGijzKBSMySacq8cRgkJoW0roOtn1F4WViyNUjoI+PP454YhRIQoVY0ktCJArxJRljAGenjUZ0JwxBC9lXaIV1Fgwq2kyj6V08KmtcwMIZ5VXVIC/a62BkoOplFQq1FKj1pngGExyaSs5VYlP6fcQltTEUCgGuVfqJwA2V8UZYmEde7E3dneRQGVQlQQlKGh9MVImwNUWKMGGJ4Ehdgg62Ks2TZ886ivDEiMB8RijkIyuhGG+1HcKkS81YgVBA48hwwQMR/dIIViX9J2YySNVn1oeC6hkM8qYGECkg6h3HIuI3Bt7dwOlDXIMBTIDAxHLhiIIlgjcPE2s6wTRW/9nSmdeWAYcrzSywrHoRaCVYIwjaUl4huIrTKnECuAYONbq4JKTwpKuuK47IBCKWBBfIA0TpJJ+WAQQjpJLKYnVJ7aq24B1dHHWrEdVBxOCRBpK6JLhZdBLfrU1Eu5/IPQ8AKHBIzrmN4XYJLWF1eUx0buMBQxl1qRQfV8cAHXKzRtGryQ9sqHuWjD9tgNQUcyopStPngAUkySxRSRxpPIxrLGjFSpyQgZcDxqMABEpUp3R3O2f04rcgo4jXiRyJH8sAA6azFIkLMlr1SuCSsYUVzX5ccECYN+2e3dLcCVS+mVphTuI2YLUBpllUYYpD5u2ZJTd6TbJpWOJzVQQOkELz5kHAI8qGBHYzJKzAq8Na9x3+ggD/hXADAREimmF0WKjgOSVqDnpJPxyJwxIVSQpGROmpUmOmdpKlDGw4MgrwJpWmfPBAm9SY+N77uuy7nbbht13DZXkKqrRBtKyKjAhGHBtVcK1UydbNH0Y8D/AHX7Bucdts+8+S3HhW5W5SO2Q9xoqlQoIZQacDkeHHGC+JzJfTIapffPL/J7Ox3C0893202SdFH3O2IlTEwChqBSa5mhxVDW5NpMpjy/9rXhXm81xu3lXuL55uW3MA15cXF9JME7FR0xMwUZGhridc3b0K/lTuVdf/st9p4o/wDUvGfdK82a+lk7W12l/tyTpLG3DIswbjxJxorzmt0J8RPqRK9/aP5P4zcwCy8l2jzOzaSVrq3mlNoYCtaGOOQZ1pTT/ixP+rTWsFdeM/Rhlz7aeeWDWX2mzwGO1jkmnh2u6VxEK9sPPMFOesaSqj+WM9uTjLq8e69SX7B7ce8Lmu7braeEbOg17jN96Jl05kRtpC0JGdANWeMmXNjtsX0pau5It28w8S9v2utqtPI9yv8Adr0pZyXV67Sg9yqi3hRCrsXUak1Lpz+quMTXdsaFpuOEMe7ttA3z3I3Gy9mPFLpFbabjcriSfdb21JIL2e1Fe6GJOZbpJyOHXH1Jd61Eye5p8ztLnwL2a8V3berneLKO08g9wt0ia33C8jSRdKQOtREj0q9GOha1wWWmhGt52LN8W9uYvE7I3d/eRXe8zRyv5VNGS9vAsKLGvb1/4QQIyaE01UywVohOxnv3H822/f8A7nxnYgRsOzuBHDAQY5bhCaVIz6WGsn8TxxPJVpFmG3czDfmVtMt5YBWeUQp9xOyJVSxclnjap/EchwrjJGpuWxGbGOS8uIbaFqXksqwzdKpqUUojGlK556cN1kkrRuW3Btt9u272ewbfJ3boRGCaM01wwivdllKgika56vh641cHjPPdVMvN5KxUbNM2FhtWybLaWWy3UIsdtie0sY9ADSyCkk94zaQDpDVcHqzAx7zi4FiqqnhuTneSzsVxfyXG87zbiPO3s6IzsdYqrAsyyNUkyMFqPgQKgHHRVYRznadyQbg8sdxPOlpGYrS1pPbPIo1GWiyo4oaU1klRnzOJIhMBtxdxwb3s+121yiwbB4/d7lHdJMxXVcW/ZjUocqrqPIasS3C+gyed7eu0+2HtrtULGO3vrwXJgOURkAd6sSAys35eWEtxNkT9ultYvKvHbqOjKt9HDL/hAWvSWUApSvOmrDuiVXqOHnViJb771wKJdPDLOWXSYiekKFzBan8s8WU2K77i4eUbtvu12my7zdi7g22Zm2yZxS/WNaqYpGJqQADTjy44brAlaC+vEvJRBHtu27rMbXdpxJDb3LSvHDdWsa1jdVX6XACkheOZpjNdGlXkvK0vrGeKaOaeBrmNSk9sYgtvq1LoCqc11hjX0JzxQXNKyIpcbFc+Psd22NJUjKvJuVkwaVQsnU4jHUSOk5U0kfPEnFtyKVqOUUN7g+zdvu7y+Te29vDHuBLzbt4RAQltdTTyv3H25GIMTgqS8DClTVcea8n4VXTvj0foel8Z5u1Ipk2Mp3FsRrVC8MSyNG1lONLCZW/VTtuOhgcyGOVKcxjyF6Wq4soaPY0y1yKa7DTfydTsZwk8w/UuYl0xBarQGlanLlnhJE4gaZwVVhZvEsLaVhVhqqGqr11AD6hnXEZgGNNzarGxnuAI41CIyhgaRHIstaihbAwGe5QxEQXDEMo1d4HQnZPTpooLArTOhwmhaiZUQGdSGKRtUBCHDI2YkdSozzHoaZ4SHI52G5XCVOuSKSWPRco69JFSCFBHIVwySLN2OYTT2ttqT7e7ZRDA0rCMRJ1GhqdIahzPA4RIvnxy5truMJJF0ai1vN+ZYT0BQWBK6CA1QOGBAy1Nvln7FnFNcszXCaZiNJDwg5aXPE0qatnywQREm9z/AGu3XdxodRHMW26FyUd1YV1AV555UoMRsKpnfyu60Tz9q5k1uoTQpyQtVmqWADdVakZ4iW7FObvcrNPPNRzbRgKLdMgpIFWrlmQOWJ1K2R9JGEkguIuzIxMkQdqq4YUAH1LU04jniUEdw3RL2xN2tE6nsyMSAqxknU2o5F8qZ4ktBCdrKJY4oUjSB45GNyZQauozIXR9J+Q44Q3oKTYsIniKst0oobZWVyIw4LCjFaH6SaZnOmJRAvaKhbp2bh9McIjRrNptRjjZgwcEIoJYtl1VrqPpiVU7EG1RSzV3tT+3abdntPIfcqC427YLhhJtfiSyypdbhEaMJrlwh+2iBoQKh3HoDj0fA8P3JXyHmfIeZ/s4/vNawyzmyh8c8XtodssNqhIjW0h+32+BFbqWNK6ixz+tq/A49Viw1xpJbHlsuS13LIJ5BOUu5bLx1JLrcLxUM++TK/ZngkUhpVlA6QShJJFOk5ZY111UGSxCLu5+1mj8X8WjNu1+A3kXkpmSC5uIkXVSNmXRooC1K51xaqlVl6EG8g3eKS1j2fa5ibW2uIiLtVCu7CocPlQ5cjhx0IJkZ8q3Btu8ctbOOQPG8ciySISkTrqzSRhkc/8AxnhNEkZ58Sup/wDvjZ7osyRxXayWZWmjWQF0xugDIPUHMDOmFWZLbqKFj+4kCR7xPdCeZ2a5k13oo7DWmp1YqQyjMAH8K8cWsoq2M37muxvfiPsF5JbXirLe+Kz7Hc3LAntvaMFy0HJlVzUVxhzaSb+I3LRpn3imj81/b97I+WvuC3FzuHim3u8ujU8s0CLbyMNC6tSvDpzI/Hji/juZRmy1dLmBZrIQztYamto94RnginNNF1QZsWyC6wQedGxCyLqMfPELhDbOZUZms4wjkRjtysn/ALFw5qcxT1NKYralE5hyiNeY+HQxQq4ieDYd2lK29HWtldHX3Y3r1fUKgHjy445HL46Z1OHyHVyZ7uLOe2u7ixudcEsMoW7jqKszEBSuqmRABy5Y83lq6No9RiyK9ZFcMqB1hGgPCyKdT1aYqzBWDKQAV58sVwN6HGYQl0e6jaCR/wBQas9QGZA9aCmfPPBAQJGlFw4k7TBGKuE1EpKledOdcqYIE2OrDTPDHeIQlsNK1ooVgQTGNI4UoK8cSK5RLYDOJLlpi5EbLI8oaqrGR9AUkEVBxNMpshFSeaeWSRXk70ZWIuM2QA0UNy+da4cSJsXWVo8URicxsscYlit5aB425E8iBTMeuLFUi2Ptk8FmvbKySzP0mMAOqo/FKNwYnOo5YtqoK2OlpdStJHLJEr28EoTTqCiMVyYKBkajnixMg0StIkkVJ5CXjXJLd2CImquYZRQ0/wCGLEVsVdhRlFL3ZJU0SdtepolI1VFKahSgwEWw0wSxS9pIRGkT/pMCWej0La2pk3KnDEkIUuscdV7TLrp0Emq58aE0OABSwBJjuAyhAO0ytVU1itAQDQmnLEgODtXJBkiS3tkDVUL9bGmktQVHPBIHO27sBGaLbyAI7jQwZjWvHMegwAdcyqsMZnrKr6pNa0NCMxJQdWVc8AgwPEQGNdVwp0M9MoiaVjJpnnz5YACxHRpAQrRwqNdaEsR9JIIHDjlx+eEOQQlMgWRQHgMRiqoy6R9QFaqScMDxMcLjtlotKhoSACZGI00UkmqkHh68MMEB7ar3QFCL3Al1GpqxHGtDwpXM8sEBIJlUQsRc9lk/UhuEDMpWtAACCRU11EYIACWmEE5KkSkVM4OlUK5kRgimfxwhnElhZq6WfWi/ccCFJzR3151J/hgBhf1FEk1TzPVYqGlUyIZQuoZUqAcAAZjFLcRFR1SHpnrlI9CukgClcq8s8A0wVoJXEcscyN2ZAGmqCXkJFKk06uQPI8OGDcR2kn3LRpRml1FZKZiQcVBz1FfprgEJNXcC9uNFkQadD1UMozfTqz6uFcABs8sSO6qvbCII5FIp2w1NLAgVajc/44ZIA0ZkGmMNMUyik1hayMakkrQkjllXDZGQpzJKYI4kYSR6qWqitWQgrU0oC3EfHCCQcqwrMFnlZAhBaUsQWrwElaVzyIXAM5cdFBKja3KmF1f+nXqU1GrpNK0+GASCwYZHcLJ2FKdp7sMx1SEV0E8Acx1D5YCSOxuVDW0hcTxxuPt0XSOkDqoQOA44BMrV/tpFM0qGQw0RoVZo2VSOZHrXjilIsZyGF45I7fUJlj1NEarqRSAwBOYGRrU8cNIS1DI7qFHuGgkKR3BaOPp7ccZPEvnz+qvHlhyMEvdFu8SLETMjMDqJ71Miy1zX0/ngYjmodorJERaRqkckJOqQ5dABGZoc8zgA4GmRKq0jvG4rIASxDZ6SASMvUHAB2Qtcto7og1t3oXVGUKgHVrIIozEn8MMDpZWMlzbSUZBR7fVUMj5FzmRRhkBiLAGzaVhSBq3AWqqylUCNm2o1zZef44ABS9i4hgSEpFahtNsPqq9fqqQDXjTDEGyS6DCzOYII2pGVUGsgrV2IIyzoQ3zwAc7ojIMU5kSTURLUGNQTXWDTPjww0M6xmMc9Jo5JJULgMCspStGC0oFHOn/HCCZOalCIWVpO/JqQSHqjFc3BoRU8TngAMdrpV7paturdMiFlFH1CpY5PSnDlngEdEblFhZdTS0LyacylKAqMxlWvxwCk6Imjpr0yBTrUDUCYm5vyqBywIYBmSJlLqFtIx+nKoLNXUOBpmSenhkMEiYrQspupQgqQFNnUUVMiTqGVPTDkUByqFRpAW7pPda4ZwiugXJdJy/lnxw5BIHBOyv3tcRnKLLBr6xp5jLIgcjywSEEu2zzTfrGGOLa7hbSF1MdzPHCrzHV9Wp3DGmQII4YNxJQSTavcDzqBGntvNt925g2m3E13IsIYjSCVqQAVxB4q9SauyfeKefe7u87rY+P2Hnd/cbhuczWxt7pzJbPU1Gocwa9VcVvFUXczVnt/ae4u0+UGx90p44vH5AsFtdWzOqpcyroRIgeCKQSwXhx4HGLOq1RqxS9i6Lrw60berLbt2Mm/tqZdpRmADEMCA7jNsq1Nc8c95Ktm6qdUXlsfglvt0tqu6xLHGXVRaJIVVEoNJkoNUlDliDgg2+gV5R7P2Hlm3X+3XflH/bW3yySCa72m2jklnikB1M2oGrAdKnkBlgVdQdmIPGPZz2d9uUkufHIFvfKLmB7BfMd907huFvFq1B4YiFh1Io6TprUUNcT7ktiDlkSPtb7XN5PJ5LfWu4e4XkUquLvet6kN0R0lXhVXbRHAT1rGMlJ6dOIq0Ekl6ai298osfELeZrSDa/H9t2+GYxtAoghtIvrdI6mpZ68FrmczwxYk7Mrs4MB+6/7jLryUHa/DEm2zYryNTLdSO/funLMpAKnpCharXPhljpYeKo1KLZSkfHfIja3FqJmeKwubjtXiaGBo+WpnX/FX5nD5OGahx79tgPke2PImq6ujb3S1MFlnDbRhAa93VQgutKZmp9TjiOmp3a20IT47GbeCbdNxZo7KyfQkRiJk7rdKn0UVI4ceeJJS4I2tCk1J7Z+NfZWibldKLLc98It9zm1s3YsVOuNKgMB3Tm3oKY9d4nh/Lr3Pc8l5PmfMvC2JL5BeCO1trcO0lrBHWOSNJI3kZuC6X6WYZsxHypnju1rrJxMjIz4xtyxX8cndkiNq6yPeUM3a1AqBKODEgsAAMifhjQ3JnXtHKG3O57m6JFCrbteK32schcPDCc2ShFSQMg3EDq44mtiLeo3bRKu87751uXct7aN4tNrDMFZobezftEiv1LIwCgetTngQrOYYL3ilmt4/A9v0R27WtlNcX6mVpokkZAI+FdNK9JA+FBhU3YrbEU8NjD7vs0gkJlNza3N1bGgDKJDXUG1EcKihGXHE7BTckXnu2ES+SwziCe5MveljWb9OJYWJWRUAZlBFRWvx+GCj0JX9SuNtuLlOxI2qGbvqjTyOGjYqSX7S9TGoIJqeGYPLFrUlftLc2G5sruCfbb1A0LSrNBMlHdQoOh4nJqmeeQxRdFqehNvFvJd3tt6fb9xnjgvI9ccV1cxu6zys1BG8gamlqjMg8vXEHVQFbRsW3t3lUtnLd2W+WVxZXcUXccxvqVkXUFeNQTHoPAoDTniLxzsWLJOjB3yRwu++7a8N1ZMqvLa28bd+CWmpXQ6qV5FuXxoMRidBzD0K6899vNr9wbc75tIh2bys28c1vuEdDb7jDCp1pcounTIzN0yGpFM8scTyXiq51NdLHc8b5a2Bw9jHm57PuOxbhfbTuNm1juthL2r7bJqxmNZDnSvS4JYsrA0I4Z5Y8RyMF8NnWy2PdcbkUz0VqjDcWSxRzQyFglpG33OtQx0U16FZah8hxTMHFEJmljFJZ9IiRRpkiJe2bUSzFjpoxGamnyGJSQgY3s2NwVgZJRUCNxXSwj+qrVoXUcaHEQGWRSXnKzs2qMiBSCncAyzYjJlGVD/ZhwKQs/cRSOhfuyOqMWBVWRa/mIrqNTmFwQEk/wBiukk7dsiRROjGNmlYDSlB1KTktWFaDCJrY0V4heXUlsLlLmGU6lth3CqmNydMjuXAAJFKca4ihtlr2JeyM8SzLdIyiG5Ro6kM5Ugo6hSqVH1Hlh7iG7yOeWa3kRlEZ7zRQ3MkgW3VoxmEdgag+pGI3HUy/wCUbhI3f6jMZ8mNNEdWKtRdJp0n1GK4LGVtdqR9zLNK9F6Y4ytCx5s3VlprQZ54sqVMNi2+aRmWSONvt9MaSPXtllGugkP0gA6gDx4YkNaDjb2jXEBRY2ihUAgSjUDJG3DMj+Fc/wCOAT0PQbbNK7RxqAiK7xFpCkkjgiimN600gZUOWBLu1IyOkGzm6+3KGW5u5ZRHb9mMia6Zg2lVKA1LMAAg4EZnPF2LG72hIqy3WNNtm6fa72At/Doj5b7gwJN5HCouNu2W7Cz2W0mZV0STk0WS5AH0gELwHVnj1vjvF1xxa61PHeR8rbK+2mxbm/3LyW1zu26yyWm0wtpk77MXuHZRrlP0sdBXJR0j6mBpl6GlVMQeftcrbyHyW7329i2zbdtuBt5RYLiG0eOWNlJU913iOvLNya6RwpTGitIRntfu2IT5Bu9rsby+KbffNdyyiSbe98eJQZIXYlIoCppoQOVqx44srWSNmNcMK7Tss17eMqSbnLojlobh4FQiuamqrUgUoBliwi9iurqs+43UkRaX7WQd6FKdpSjV1HmdPMnj+OIkFoVl7hXs13LK5dwEl7T6VPb7bAAFAMyGBBPxwpgnRkY8Fiafcre57pNzbXat9s8YKyAEUYk0IJORIPDllgruSyvSCx/dG1NyZZXjQutxGVkSLQNAADGXTXpj4fTXEtyiuhDPdcjdf2/eFTzXMRm8U8vurElFQUtr2BpAGjSvSTGOefMYy51D+w2cW3x/Yaj8cWXdv2Ue08pUm122Ddbae4tnUMptd0lIQAEKvQ1ak14YXGt8Y+Wm7SYN3y2ZbZxb1MlpOUgVj3Q5kOpWeThXUoOWLcuhDG5E0DxS7o8xYW1vuw+9A7h0GWhzLUAVtRNFA+XHCRZZuC0LW2tN4tLzaL5JJLfdFAuBMf10u1/pyR0ByYAEUGQ48cZ8tO5QTw27WZc818elsfullstW7bP030I4vbg6Q2kVJ0Di2WWPO87jzqej4HIjQrtEBijJgJghNLejHSFYfS5pUVHGmONZHa31OyGFD2zZiCdm7ZilHclRTpCv1HJTl/bhqIItkj2nbLyeUMYnaK1dpJpkZCWC9JJDUzNKZYnjrJTkuSiPY7eWZpoVhVEjEkUMn0ksoLZcaKc6nFzoUd8iG4jkN0YtJd4Aq3QLFRJ1UqcqaaHFbRORSQX1fbRyokACJLxBcsNIpxIWpocSSIMc7bbZmcxTkvLONMULafy0qyknjU4tSZCwv7KI8QVpzcRxFVIQshY5At6VzzxYkQbHWzsWd4zAxlcR9uZo26ZG4lKnMUHEnj64kkQbJZaosS9h4f0LzrjkoQMsiaZkGoyrxxZUjAdIxBMiyPD2wYFn+tpV40b0qf4YlAmL+3LH21R1EzUElqepmVB9XKhPp8MMidR7d07YvBCWmqySL3Kqa0JNR64IJBkoVtAKt9vbSgyGUdSycRlxNaZfDjkMMTZ1zLIFkUkpMWnklioX0ZKNZNOquRPADAIEqySNJLGymTshu4wyIFCXAr0UBNKccMApJJEIuLdjc9zoKEDU+oV0sH5inzwgOs6zSd1FWC3iH6ccdRVhUBSjkHM/hggEjhdkkiFIppIl0LAxpH1gB6KPpp8TggIPabdUmKygdqQoy1ppNaBjq+ulcsvlgGdV5I7qUSFZGhDMk5DBGr00IBPSPyiuGgC5D2uzEYRNPOCoUuQxUVZW1MfqPA15YAD9ciymQxxSREIx0uUMfKo1ZHhTLLDEguORJJg8jtBpVWDUD0bIEyAUFRlShwhgJi1HSMtJBbq6MzjS0hcVJXPgTn8MJgADaIP8wDHMppE49GIKBlIHSKE1rywCPSVl/TaYfdyldMiKQuqlSzLU1JXgMqYBgJwigRll7a1qqk0RmrQlgpDV4UpwrgEGyBwYJGBVolGsw8AcgppkQa5euEAU0cqmONi00kxUBpApVMy2RGdT/L0xIcAZJBHIGgtpnVpGWSVzSR+WiNQSQRStT/HAhnllRT3hFGsXUjhaho2pUFaMaMxNKmuGRgKdpBGsULSwhc7ssquRIWrrIUZkA0I5ccAjjsigm3CPDcOQDKRKrGmbAnhTCQ9wMghQ2ywuuq3bRJ2QR+pStWH5yRl6YBgCWRhO1vGjQ1VYVdm0RmjNqUUFQaHP58cDQ5ALIscZjMkbyOwGpy7EuvWvUTWhoS1M65YQmVzM7SIoSQiOTJVJQM8gH5aAZCnA4rRNoK7aHpnCgzlJAyatCmukDucgKZ4ATgO1mZzDOqhZOqGJgChkBqAw4VzzJ44Yzjxv3JZc5DKGW4jVaJEFNCDTkBnlngEDLw0UAi5Rge/ITTVFXgARQEEjAI8msd2OCZpBq7cEldJjWp1KVHIcK4BpAwZ5fuFiJEyJokuApKuik5BeNW9cABKOqwFkhl0he1BIK1GXUGYVrxrTlgAUxFVaFJJwtvU6JVBNGbm+X5ueEB0lAruumFkP+Xj+rUvPPKmZrTjhgB0diKeV1EilP03PVWQHNxQ8M6VwhButAJY4Ygl0FCla6VVQeK0HU1f/ABTEkBxkEr/aazcSqA9VOmUtUEg1+GWASDJR2Y5jIamZlacxVUBCaNGEPMU45YQwMilGs0ALs8bJqbIUY5LQ0zPGpwAHqoaRayH7kjTa3MPUpNOpRnlWhyrgEkeaRNDan7qRMW7IJIOdGZQM6V9cAQGrrijDqqVeqvIVoWy+kAGqnlnzw4E0cEGlYGZGeWbohiB7jNzGv0pThgYQHuF1IJ3aeZ0oVqP02oQxUNT+fHAAICKOVAIma20lG0qah04syj8tKZA4EAqTviNFPGBtU2nq1A10HRllQA0GEAuXdTGEmaOHuzxhZ1oGEgVdNQpJ0t88NApHKPyKUGFIYo7IIoCaDolSSlNes+o4kYaEXt4x+5Dzzxu2XaNxe38r2hVRYbDdSkhTtGg7DimlaCmWdcZ78ety2tmi4PDf3a7xZXJs7n2rHktxd3gk2uw2uTuXpRxVVRDqqIxUkg4x5OJXdItryLbPY3XtfkXnG57Qd4voLTxq6nUSna5rvv3cduUEhJ0VXIE1FajhjDbE52NNc2hVPlXvZ4P4nt8M/kfuBfbzNurSSWFjsoMp0xDpJXVqpnVhTF1eK2RtmSZFLj9xftJb7ZJebLZXO5z2nZ0Wsjgy99iCzIp0tQk5V5Vw1wrSR+eis/Kv3cW6QiHYdkhhkk/pXEvQsFTQlgM2ofUCvIY0V4TW5VbMZi8v92fIfJ5pE3nc59ztO6WaknatQhXoAgpUlKZsTn6AY2YsFaFNsjsVjdTMpDTuI/sws1sYW+pgR014DJvxPwxcQQRYySXMsw7/AGppY2mVJKt26uFL5agJFrQU5YfbI3aC4/t5d82m1v5wbiV4FtpY1pqkktzWSjHJtRJNKVPHHnuTj7bwd7jZO6iZzatj/wBZ37adhjWGz2y0Mm47sqRlolyLJ22yagNK141xq8bxvnZZ9DF5LkfJxx6mroFmsLIRXCpHcXMa3UjLJq0xx0orR1FAEp00z/t9rWqSg8bktOpCd0LSsjVkt4y0hM0CkiBaioIbJBQDIjGmi0KLNiza7BYvu7wQTWTSM0kcsAKgt0xLQ0YAyKajLLP1xNFWyEO2WhhjkvnjWMWW23M9xbyMZqSnJZKD6TUjhlTLjXE5gjZA/B7Jots3S5n0yNNtlssE8MIq8r3EhoVfKmeo6K8M8FmESIfdtWj8o2pYlIi2vbrftXMTmYBmJZdbA0JyOpQenBjIW9CO+J2Lm6gZ1kDi7+4j7lJHjkDNqAAFFQmhzP8APPBYsx/EWT5fBGm8TyzqsUl7PIslz2xHM5ZQQoQ/locm/l6qjcFmRQihF02r3VvC9YY3EluvbdwqxBWEkRapFIwdQYVyI54uKEkSKyvZLal1E6wQxkpDIjNK7VYnUsfJa8QRlywnqNOGWXeWR3baP9TtVN1cWqxjcIs4wWYgVByqxrXUMQWjJR1HXxPfIYez4vvV28Fmjr2b3WxltJdbN2qDIqxIz/8APBZdQradUXEgvtqu7O3u4XtpO0kjRTSMLaeIqQjtGqmgatQRVfgMVNyXpOBY/jtlO8G5bBarHttsvdubS3H6sMsYCu0YbUrKx40FBXCT9RQ0A809q9v9w7Mx7mXsdygEp2LykBWLArRI5yijVGpOanhmRQ1xx/IcHHyKv1Ot43n341tNjCfmng++eJb5cbTv+2/Z7xasZ5Y21SwzR8IZbeQFV0McqgcKg48Jy+Nfj27bH0HicqnJp3IryW2gqI+2SrvNQqlOw4JDr3Mv086CueM0SXvQil1bd+1kguLXswodSTLqUROaamjU5aQOH/DExQMs0LuJGncSzwqyHTkoGkKjgZFSaZgj54ERaGiJbaCe1lOl+2C6OzaW15FdQ9ABxxIiSDanMcqqzoO5KXa3Sh7bHMNKWqaGvLLniJZVmifBlV7hDeMs0boks3bJSFkFcmYg5gn8cs8Qgl0LrsFilgeMCRmZne0OayqqrVwq5tU16fQYkL3Ec87uZ4dv/wAtI8aRqDBC1JJHQmrM8hFCw54quWUM07zcWsc3bVezZuAZgupFfQajVxzJ9DlgQrEcktyJGAl7ssasL1y5dzWmkIoNKpm3HMHEisfttsYljtFSV2d3Mtzrr2pNPrEc8iaHl+GHJIerfaoAtF7zW927xzRV0rDHQFnAXqOiukAceAwk9RbImUO0S2Wj7lCgtirWsOgukRZ9CBBpBLSgnI1p64vpXucIpyWrVdzNqe0Hs+nhtnB5p5PbB/MbyCFtssXUldmhky1GJmUCZl+o06VNBnnj1/jPHrFXutueN8p5B5n2rYse/vbaaW4u5UETl2W2sE73aYuCFklHBwM+oCp4AHI49DWm0nnb29Cl95bfN+muDr0RKyQNaurrKlSwZUUkdtRq0mh4EE40pKqM1m7M7vlv/wBj7RbRmdI9/wBwha3u7tArRR25AUxMAw1E1GVKk5nLBR9xJrtRBfGdhs9wvZTJDbQbds4WXdp41CmVBUoFc11itSeWLG4RGlHbUbfNr8XBnNlED9ysUYbQoIEZyibIquVCWXL5HEa+0GiuD2LKF5NEU9usbQqUfRJJLI1UVjWrAZBWIxJqRbFL+WKZ2WKKOWJoGMrmd+llBoETM6ipqchwpUcMJoacDz7bbe0193exK00RDRwM4Qq8hDdsKwChZDUgkfSeOFEEokm3nv6NnIkFxNcNIjRhwpaNK6ixaQqQWXTTP0r64milqGVLv4F97Pecbcydt7G+2nd4IkLxyMyu8DyBGBrlJmBx48M8VZUaMGlzYPt3Yav2O+FXNxb6XTdd9e1a4D9pT96TrCAKCMs6A864y8ZxlaNXJSdZMTeS2BSfcoEaK5d+zcRrb5ox6dWlQdCAEkCorjVlM2FELs+ykFpNHHaXMNneGJrRzqkaJaAIzHKoIPLjniCeiLrVgu/xsPdPHbQxSXHemE0CRr11Yg9yN2/UVcipPCvoDhWRTVRqQL3l2yKz3fbPI0s1+13OI2e5jNTMIzpcMwyOVBQHPHL5WI6nFyMyfuu1y2G+3e2FH+0DmW3tmI0NCanUX1ZFQcvXHmeRj7LNHpuPfuqIoJDObe6QvJOsYUTaOlTTSOo8QABVfXFGmxc0XH41t8abSW7Wtmzu3UNULQ9S09fXHQx49DnZMks9NEpLQSrQsTJDMVDsDp/NSuQpSnDDsiNBraJLi9uViaQlVEblVVu4opkBzHrQYy9S8cbCDsSO9fuZ7dBH2SoQOG5JkKafUHFlUVtjwbRJkBdjFNqKuXr1Z8EbKlFyrxxaRmTs1uUBz1SW8Z7EwXSf+VdB409fxw5YI9t5iguCJWZDRZCy9Beo+gNUA1I4c/XEqkWSVWtXNz3XJdJGee5UNpAJqoRNXQymnDjXE0Rke4IZJYIEaQF50poQ5lkzGda8KA/D44nJEPVdc00fd7lwhUusvR21yrRmHL144YAQ6GWUUVrcrVZDEQ3bH1MaivHhXPAANJAoEdWS3iXVeXEYDSLDJQAAOTSopWvrhkTtuApjjVEe5buRs6nSFH5UdciKU9M8AwIMsMAMqyywamFxpqDGxzDauPLLlhsQLWiau7EXQ5RGJwNTs1G6aihAOf8ADCJBMbpK9wZKo0KuFTUtTGfiCQSCQKk5YYgVFjUvVKudTqnUSFFCoApppxJp8eGFIHbh0BeaWStaC3YLmVagDqBXnzOAEeV3aOUC4DBTqDAaldgKKqU4+uGAXqiXRofuzTu2m4LdIBGYapypywSKAUWlo2dVaaSDPTqzFD9RYVGmop8MAHFUfrW04TQSZljYVLihBQMQKnPma5UOAJCUmj7ReEK8tNOlhRVyoAykNp6DxHE5csIYNYyAIjNrEtRHrDMS4zKlTwCqOZwCQUiK08B1MIpEVpy1dQbOsjac65ZYAkLDB27cgVHYSQwWjgLqRKEMP/dwQCDYVmHZRVMb9KxLHXQRmRlnwBJJwoHIVEsNXgRXqzMFiXq1FDlI1Ms+GWGgOKZVIgfUGDNJdXEPQVU/SdPED141xIQWGklWPuaZ9DlHhjPUGJFDQVyIHH+/AEhncj7TuE+4gkkAulWqsXH0VQ0+k8TWhwgE8ZiQoYWBMxMkrgARUWv5TVlJ4ED8MCA9Jd9SSqot9IYRKQSUQ51IzohpWpz4VzOGPY8jESwhCjdxCYpWNHL+pJJqDXKuEI7G0EiLbiJYLiRWVY61TUCW1UY11Mo6TyzplhQBWcjntv8Apq0cpb7NoyNAYALo4VNSM86DFSLGz0nbAZZmkZpI+5OlFyJ+s5ChpwA/HEkgD5GAK6mZFVEaYxrxRjRATyKg1OCAkLBt1r2L3703JKwOlQXNWAMleFOX4YBMEoBtSjhu/CzanyB11oRlka0ywDgNuNAmAc6w8bNd3EXMaQO3QA8s8MEFDRrnBVkECrqt0J19JoJCfgOFMzhACEkCtEI43Kwr3bJSCO5IwydgaH5D0wCPRM8UchEuoTVepFVWRcyG9KVIAzwDPSUUqiIUaWrRKhqwU/UaD1I/DAIMCCQnsdMiKBaEEVY56wCek+tP5YBo5L2po0j0sstoiyKysF7YBzQsfqpUZ4YCoKZmhM7pVwZruVCNIAzFQozpWpI4YBASFZVlJLm4rE+skllqKMD6VFRTCACsjLANKhktSClwikEqSR0q3BhWtfTAJhskKLbaCpEpj7pmIoubEVFMiw50wwDZIkGjvRtcuYgoCnIgGuoZ6iCcAgSQujIS8LrNUvqqQxQZACpNPgMMbAxiTt3UjELJIQkqCoCZ0IU1Brwy/DAIPHaLqksfdjXT33eokjZvpZjSoGWEwSAxNIVSOQPPHGe21BQtrrx1UqoBrlmKYQ4FEZalzHG7M8a0Z8wSCRRCo4ZcxwwAFO0MarGYw0TIQEkpqd/zKpzGXDM4kIVRxESNPIWtTAgSVEALAMMh8QK0OCBoVR6VeJEjinj0AW7xgmjEnUzUoRn05j44UjaJP495nvvihvJPG7o7TeXUYhtt5hjQ3tvFGQ3bgd6gE86ZkHEWpCNRPc+SeUbk8s975Dusz7lAybhJ91KKjUP6g1g1Yivw4Yj8uvoEsa0aW3bvyH7eWzkAW8iBBUAUDaq5k0yGWJQgb0Of5iK8j1aEuGIlgeKiuCSS1a01k8cuGeGhMPvZpp3jvGLRy3FwRJJQ6wyKeIIoSBlU/PjgCQFlbQPda47cJFPUzxvlrVfQ1bVXEkhMW3rxE2xtz3LZDon0tkpZQKOSSAR6cK4IIjr43tbmNnjlZdB0xSEEggZNTiDqpxxZWrZU7Fv+M3UY23c9uCwotnexzTOtAwSQFWomTUqBQrWhxx/IY4tJ1+Bk+GCd+2u0RTHeN0gXtG4uhbyLIoqIEJLHVXUOHEVHDLljs+GwRTuOR5jO7ZO32F1bpFbyPEltCY4ISGto50UszIK9tnXipABDK3UeNKY76OC7DYdquFvpD9uJIppyYXZAe4rZ1MdclJoCxJY5+hxJMjEokS7CRs6AWzXcsr6n+ooZB1Vj1UKKgBpq6ST8KYatqRtXQKHhl3H4d5NdwWpikn2x47W0TU3CZQ5RqAVJ+qoz4g4k8ikfy5Q4+NePxrtm8FSoC2lhbRimppEjkjDIxYoGZTXNQM8O1tUQ7IRWfuvaLH5dueoui21pBB2koe4GWhCsCeotnkOfE4nj2KsnQafE9qZ5xrhiCyaJZIa01wMxEdaDNl05jjmK6RguyzG0Xj51sLGU3SM7SvFEYXa3EjduIHVEhpmCQCRWpHDjiqli6+pm7ftrZry6KKEE0EemOKmdWAMluFC9LUppGYzqxxoTMiWo3Lb26vA5dIL6NV+ynQ1ZAo1zLIrghmYklWOa/HDJJSWN4fffZ3sdruEkjbbc9N+hWsxjbJCOkHpLU1UzrywmyyiD998a3bYdx3USwJJLG6LDauA8txA7fWjA8FA4n8MQrZEb1hl8e1t5B5fZDwfc5Vj3e2UXfiW4SL3C/ZUs9rM5atBWkYJzofTFGaa69C/D8Wj3JTtu2bttm4G0uIn2zcNbLZl4q9p2B1pKhahR69J4UzxFtWRPtaZfnjW1228bZ95YW7WV2kzR7rsLlX7cyqxkABBH6o1EEenGuMOW/Y4ZqrVWWg2e5nszs3up4oNp3KJdt3C1Yz7PvSuJrjbrugIjmC0LwuDSRSaUOXVTHM5nHryE09+h0ODyrcaysj5Cea+H+ReGeRbt4t5HZLtXkG03C2u7qpDLqkFYpImIq0MkZDJJShHxVhjxubDbDZ1ex7rj8iueiaKnu44ZVlLq7SxymMvAwZSPyodILaRX6qfxxXBc00Rq9EuszvGlIA8RuIHQ65idOaVHCn8eWJkII5Mnblu4bhYZECqZYzUFjwDVI1DPMjhhojAptJo4jMsZaV4ox25CujRrHChB1EE/h8sRaJovnwmaMpbkStHIzQJHGp/qqTVlXlQnI1+WIInBpPaPtnigltVeJoWIt52z0IiUKuAKsoIoB8anDYMhfnV01pb6reaQRR91Eaa3UKJiDWNA1a1HAcsV21J1M2bjPIfuGW5Z7d42uJIXQhtQChhHqBUEEAUGBITYGyiZZFmKw6O324iCKMWzUBgAdfqfww0xLUnu3W0cT/cSRR3c1vVe2569ZGkrRMjWmefDCepJJQTO02NhOkRiMtxtyH7e6D6I3iYoxYM1CdPAVyPpzw0o+0rtBs79vPsc26mH3I8h21pdnti48Qs7tVrczRah921a64lpRA3Egnln6TxXDSi9vsR5fy3OdvgoaV3TxW6ni++ubotO8rStK7qoIzC90MFozUqCa8+dMeqx5UmeVvVkfuPGEs9vuNwvtwcM6mS6BhZiIxqUaNeYZTwJBGmlBni1ZpZXbFC2I/ZeJSbfaJ5XuFuou72cSbfZSdIlULkxY1Ykriz5s6EfkwpM1+Swyb1vtzIFW6F3cNabdKU0EXH0s6UGkEDpLEenpjXTRGS82ZMrraI9h8ftttlm0X4j725kOGjeQ10ktpGYFCQOWK+6SxJ0RRF3ZzXu5Os+USFhHZDT3KyHUujRRSpzY1PDSMWT0IPUh+/9yz27uzGR9ECwgBRH9yp6bgk09RQcBnkc8SSkgyib6x7szxxL+rDbiO4VQXZtRUtPShIZWBFONMDQJlu+3m0FbJbwRq8tnbyRyxS1YSSMihKkiisRwHyFeOEydasU+Z29beeGVpftzarJdqCsYkALAOxZiCQHGXMnLLEqshZalDQabnbfIYvuDPa3e1TQIAv6ishSaMhiAQDyqPngvqmSThn0i2rxaXx79jvtjtsrLZ3F1Z3F/NM4Ex7l/LJOtaDiVahqc+GOfx3/ALh+42cl/wCSn7T52+Ubf3N4+3hjWCzksHe0iiAeMJEWbW4BzqVNCDx+FMdDJXUxYrwiE7NYXO4PPZvatOZpFuIkhh1yRsQ3GhBqAG5ZmnriCUF7cov7xDZXjt7a/Ui5QSKJHCkSAqrrIrMDRlqvVThiu7HjWoD3m2C2HiLrHD/moHE9w8hJjikqKaFoCQwP1U4iuMeddyNWKyrbUwF5hB/8T9h3KFCoethfKnTTLo1E1ZmoMy38Mee52M9HwsnQYdrhjnlitZwbgOTIJdJVahgdWheHDTU/jjm0TszfkcIvyxYSRoS/20MVuYxGlNBaLj3KAkg+uOrj0RyrrUaNyieRTJEyLMkahWpSoJppb5evpiF6DraNCKubk3q3UsiLdB21BekaGooNCOdMZGtTTMomViltcwJFKACpLqWI0g8Kj148sWIg0LpLcmV1S7SWG3QRqxFDIOB9a55E8sTkhEBV7CYpIO6prpZZWQ6tQ9UIyz/jlXAAwyhInIkdXihUm1WSopX/ABSZEUzNaZYYEl2+d5ICdHSpLzyOVMZZD0gqxBP8aE0OJogyQxq8gFnMvdm6ZYrUkjtRk1WjD/CTU0+AGLEiAtJLlVtz925Bdq0rTmKH6iR9J5fHDGG9JISGZz9sy0XM9ytSdLVNStTWnDAI7WFmglRdHc1LIukusa16i9DqIAAoK09cMTPF/uHDNoK9wLFesCKlckqc8hXIc+OAJBVeTS8jqJLcB4rgZRSMTnllWlcx6Z4YBQZYnLNOWiza0YDUUc8xUGoqT/IYABzsZGWJZMoXVLV6qFLg1YOBzrmRTjhAFOqyOwVFhEz9ErE6maMfWWBqQRWvLhgCQ1ZGVeslZZ6ppKNIKKMmPpUcvlh7BJ2Njp1QKUaEqs6ujOQ1MukU6c/T44JGJp5NaNIrhpJGLRTaAV6eI0rQj0GWFIgUxMxDa0SVlDBlNGkWtQKCnLlgkR1mOmJVcRSOf0SRqUVNNDNmDnngAA8kdySxEa6z/mHkQhSy16TQkGnJRwwDAU7sbNMSaug1saNpI+pgp4iuajjX0GAQNljQyLLWV9BW4n/qKsYyBTQADl0j/wA8McScRHRpgsa6HHS7UJ0EUB7YPUaZ1rT1wCgJTXGCtvRipKQBhRVDmrMan6vXPCJBMXdijMcIXvRklpZFYOg1VoxPCvLlhoAcboe7JndxU7sbfQG9SJKZha5DAKQJk0qE0x6ZCDpRSxuISaEmtDlhgAWQJqVWjWDWIjJQksAdSileoV9PngYBdw8hYxx0LRz1yNGZvRag0ArzwRACkmOKiEyTv9X6YJBnGYGgNqIA48q4TBCQljG80rGML0RSkiRQSa/pgEZqeJwIbQaizlpCGVpmBMqHMtHpJLCudfQf8cAiuJRBKxQoqJbAvEjhUkZTWrAqacRWg44qRaJkaNJjSKSVIlBmZwF1D8hAPD4VwJiZ2qx/c2ys851ByxJ0SMaA9X+HlngkAyoLvJFCjaVCxxKFFGHAjmT8cMDlWRI3aLRHrEckKaiKPUs2ok0yzAOAA9WRZYrkaFhgUP1Myq1ahWNM6tw+GAICzBokRZ5OxNGwZ58ydNSyhRxYj1phiOq8fcaedg1y/wCnIsn5S1QHrSnAZ4Qw4ROI4gWiIuCUNQAqlRTpXiT6NgFIT1lROGk1wka1ACgL/IUPCmAYNaRwws0DrHrAMudIg1aaQOedDgEDjJi1gJWFySgqGGpBw1GtDly5YYbgpBOzARkNPIndij0aU/5lpUgAj+OECFEh1RI7waWtZBG6K9VIahCKPQc/54YBYkY3Ej0UJMC0ZUaTyBD0AFDTM4BQDkCiPtG4R4C1bZJBmpY1rkRx4cOOAYYy5NKjEuKLGuuraQcxqHDLlhiDRHGpV0lUAOvbJADJqzJ/vGXzwIR1oY3n6JGlDBWSVBpJqKk0qAeGdM8ABJLhzPouGluBWOPUf1ihIXURypxrhNDQq78xLzRFyVBigjC1/UoA+taZAcAcEBJ2HuRxxzRR6eyhj6R1epy4U5VwCDgGHbjWEsiDUA2YUvXiAAOPphiPQOrwzAW3eMRZgF/9m1M21EZitflzxElINWLAPbSFmavduK9bCtRGRwoT8OOGgkUBFimfV+n2iknZj1HQtOIJyFOFMAM93Gh1p+mjSqZYZCeCkNRBUBS340wMSDZaodJik0tpdGpVUZhXSVPFzXI8BhDAPLJM/ZVIw4oy29etFH1qzGuYFSeNeGGIFG7hO73HkhVyhJACGOpLdH8KHnhiHHufZQFnhRxG3cdpOtkU/QVFCKeg4DDmBMOt7Rr64t4xGXa4q5Z3prBIAqq6hWpPLAlJGz0LPitIrLbPtJRVoFYQysQGMjAgoY+nIgihxoSgzd2ol23eBtd/JFRreK8tZI5IzmiSRZxlWAIWhXKnGpOMfMxdyN/DydrZrr2Ws5rjxXY+7GshLve3rpk+gt+WmdTTOn8MdrgU7MUHG51+7MzQewe3Mu9XDPHA8UALS2wAVNBWjBhQFADQVpi62VVMqxN20LQtfZtrW1AuFeR1bvNM4HUGADsrA1XKtfXFS5S6F641luSaP2ujjjl1QrN3mXUAQQEC0WJwSQRzxB8qWRvgkmO3eAQw2V7tT2yPaSwN3YyKq2dUSuQbTxzJHzxW+QpTLv6ealTbf4RcWGwLG9qFM0UjSNGwqn6wk1k0pljV85Nmf5cIzj7weO93yXdXeFxDcdoxlYawxtmF0VqQKigHAH+e3Bb4TFlpDEnhviNzc3CW72rRS9yNtSKA+ulDIpK/nHSTn/weXIkGKmpqDyTxBrna7O7WKs7QoixXC10HtsilCn1HpzpmR8DjFTLqzdfFJljybwC8hku4o7T7ldOu5ckTFpworCHSjAouYIypUUxtrkMVsWpCP+1bmy3S4E8bvZMY2u7tIZNOg6i5kABPRwoufrifzBVoLrHxm9Vlnkt4JY0CFWKE6bdzkWUtUkg0VcycicDaJOvoWVeeNtvnjqSXVqP9S8dUFYV0xC4sgw7bCNCzMYzSmo8cVppMHMAtj2e/W72++tglpfxXDPbSspFwZoKlGqo01WooTyPzwXaaaEl2uTak+wW/n/jNhviRfb+U2iqm5wK2kSNATrDU41AqhrjkrK8Nu3+ydPt+ZVWRK/B7GYJ9wIi8sMSQ3S6VHdCBtJbLIg5ZeuK+TeSeGpawsLeZXkZCVuolMyZBvpFRrWhHDPHP+YzascmT/wBzf7fP/hpeLf6tsdvH/wDDI8StXfYJEYiXc7FCZZNpnc8TIRqgcjpfIUDHGPl4a56nQ4HJtgvHRnxGuxLqhkSDrUdk2zhonjKlw4lQgESKwZHB4MCONcebsnS3aeupdXUlf7nCnbtpjGaGr3GoA6kqBUaadVcj864a1FYZL4GJljVxLLcOHVyVqi6RTWD8DQ8sOBILgLyTwTJIzNG0iRXgFInBUgZNUA8QK8cJoaLq8AVRboneW3lecG1mUaskAagYHgWGdMQaJM1XsytJ9wywnSUJeStOkglp7dCOLDLhz9csJiKz9wJ7iSCeZA8UduYzbLrViI0UkNIB9GgAD4V54rjUu6GdZpu7WSzjFrEmk6yS7kymhrlQiv8ADFjKupKtstGaeK1dpbi3SSNRZxvTW5JLNGQCRprUU4nEWxwy1tltFJ7MqBjaI4W6prLyEEaZDw1Z00j+/C6D2NPexftMfcryQQ30bf8AbezypceUX4Ol34BLMEigaTMUrULqPLHS8fxvmW7nsjl+S5XZXtrufVmO0s7K0t4Et4YLaxiRYYIowEjVBRYokGSAZZDHo6uNjyuTXV7kautpNw0d7MiuJ8oIZXI0IwGrOlSTQAAjKmNVckaGV0khH/bS+R7z9lKZF2rbJNe6Rxr0EqKRxurcQRQD41xoeVUrPUrWPuZAfc1gJHtraPQIFMO1TawRD2xTRGslAzEgLlwONHH11ZRnfQrTxLweSaWXyS92+tvbKX26JpFkpIripBZgocUJYU4UAxoyZkvhRmrglyNnlnj8tyz2gdYIWbuL2Y1ZHSUBmKxgk9RJ4mh4YeO86hevqVTN4pI5meWwWK71Htt3FYQpnolOpkCxkCuY+AyxdXIVPHBT3lmx92aRYYZhMqLNa2j65EuIyojLNpZeBJAAOXHFtXJXehXNh4cbnvSwWk89kJJNFvq7U4uEqmsspDEAsADwpXE5grS1iTR3jHiP2u3zwmMtZDVcOw1GSRmVf01c/RQGlONPhwotc2YqKNStPO9ikjS7FzFFDHGryyWdGfWj6hFomA01jHVWnEfDE8bkzZ1D0KC2DxrcrvdTaBJ7t7qBLczwv3ZWRqK2qoIKg06fji5wqsjVTEH2H9x/FTYeyezeN21shTadvsIIowoDSNDbhDGK0oSeBI5cMcfi5JyuzOjyK/5aqfMXfPBJo9xiubgOkJg0WENtQPIzvIrxkGg0qwFQTpYZitMdV3TOfVQhk8c9r7hN5spJrd17UmieR9cUSTRg8GzWiU1KK8gOeK7W6liNO7Z4dHZbVNC8Bgv7aaZ7aOVFRJIWFSkeRzbRWo/AYodtTTVFG+68VlF45cPLZSvJAytV5BR8lJWrGoVRmPjhNEXufOby60Q7L5DZIAxt2jv7VpAVlKFq62k/MOHDHE59Du8CzkY/BhDb3U73Mr291MjRWjTUWIiRSxBJByzqAMcnFU6maxMV7kFWsY1WWI/5yB6qCFrT6idVczw9MaVaDO9RVb7qsyyJPFKqFWbtKF0Fv8PClCPjxxLvIOo030MbxrcyKJHRCfuGQgSIOCsgrq00yxC1UTqx9s7VbxQbM91u2ZkjkBBjoKUSnxz4Yh2D7xJKk6GOeSWSO4Vy3ZBIAFKVDUoATXLEIY5QdLf3ECQRC8llt691lZDV5ONGHGg9a8csE2HCG8RXSm6uri3VbdKu9sA1AaZPoP8AacsTh9SLQ7bAn3cssjAw2AZO4zBaXBKaq/h8Ri3GpK7E4hELxi4nlkWKKokdTpZKmiqa5VpypXFqRWw+tzHVp5GtmgVI3uECnUrEEA6BSoyqfXEhAIzCsk1FltMgLd5CrGOtNQKKOdeP/DAMUgNMwWiKEYpMFYKeupHwoeYwCCGmCdmOSAvJbOqQNkY3qeutOpiBSmGwDmYQyaY+0iByYHOYY1IKBQNIBBof/LAB4IQJ7ftqzopCdthGUkOelTnnTP8AAYQAXmQssEURkmRXV5VSmkEZkhjmWFBq+eAAhCUialvKxCaTJ9ScQGIFMlPEjnTAwBRd8RxP2XdnUrEopokAzWgNSFB+GAAMMmnVOjPH1fqOxNWBPUMqcDkSOWCRHVnq6OS9ApVVrp7YkOWs5g0py5YAPCQrGWjEQEFYgumjUIFHc/zJGGMGkEhQxrFGFUiWZqFEZWGXUpyPOuAAskM80rOGENAaEBRTNCBl6c/SvHCA9GIg6qelmQuqPpKEk8eqpJrwwQAGMuhUPN2pAVCsKEVWpOXAlR8cABaPKZFYs0kBJ7TOK92hoIw9agVoQOGAAxmSIPEsb6GI0o9O1FKRT5kHjxwwBQPJCqPBdBCzAOzIpWUk17bBvThWnPDBiVIy5m/SeN0FL2zyq5GYIOQCivDEQPFpJIJ44IzGFCaZkIV5CxoQrcATTIc+eJADkkmtSySaJtEelYu2qgsciyNWozPD1zwEQlu26gKQI51ylkBZmYcQeGdcweOAkeVGjIf7grNA5/VMutWTgxB4kU5YQ5CUVY5in2zFFFEIoU7bVDPxNNNaihwpGDRjK8kMUhlVaGLOkjkVJYFqahpqacsMTZWMsUcsLy9tJJGINsEHSjp0hSvpnWmKUWnIwp7XbdkFx/XjqFLyKKBAeQNM8SEdVGVGMw7kbP3JECgFFBB6yKdS8KDCEGvIgmaSS3QmYds1IZ2jOepCKD0+OGAa8uiaBW0MY4yoWMMYkVgQC9ciMqH0wgC07iaTLGWWc6xM5ChGzBXLiDwGJAFdyPtXHbgdCkhQaxrEcS9RGrPPiBXCAPkcsk8hXvJIUjEDA69BAoV+Zw5ECWMh5I4FeMU1rQajqrWiM1efLCEAZe7aTnUdRdjLECSVcZIflxwAKShjaGW4K9LBVDuCTUCtVPM8GrgA47KxjnYrKZwdVoBpAy6QAR08OWAYKRg5edJHkR6JPG2QUmgr/wC84YSGiImWENCksJ1GCUmkkkjqCpc86H15YNwBgyB1Ec5aS4j7UmkDQ+k5heQwAcDKkYWNT3VQMrdsKANRq/VzHA5Z/wA8AgBkiQspiNxmtXroM5BzZV45fLAB5nburI1QHL9mJgB9WQDA5gE5HOhwSAqkiVVji7JiuIQohZHrp5moHLLDkUHOuRXu9TM3cykjbMHIUpwzHLCGKTC0YZ1jCTT1EsgcGMq5BVAf+Y50wCARr2Vhhl1hVUrCaGtFzJanp8cMIOyyIIBHK7O04JuCTmy+hAFAf7cAB5WPtwzG40XGQ1PXtxAjNCQRUEH4/HA0CDD2pF+3WcARyAkvSupvp0kca0FMIGdlMn26QmsQaWs8Ktrz/MCK56h/A4GAXGpDvm0cBfX2NAAbVwQ8qVyy/HAAOEtKHUa0iQkSoQF1AHprX6iSKfDCGGqBEPuJZTCbkgdwKGZWHUdNakCnr+GGkIPhEfeUBWohZrmClQA/EUPHLkfTDgQveNzNJJFOskc0ZYOw/UVB9IA/L8iMECZIfH54LBxM7LJMmkSME1IBX6wRwK8MW1K2h53TfUuTctbXCgxSCVJHXUxK5BCaHLjlTFs6EFTUirXf3hDKxVwCf0hpRWTMswHBsVWLKqD6K+z9lKPHdjjEyTPBY27wVbtuSwDy50zOlhQH8MdnDFaHFztvIfT32u2JTtcFxLG5gkAlQTUJqwpmCa8q545HLyw4Olxcaepb0u2QyoKxjUq6QAB/DPhjDW7RueNMTrtSVk6QC4ChCBmuVTUZDhh/Ngr+SGLt8cbEBBmNAFPy09ML5klnyoIvuPilp2I7eGMBQjwvCihS6kcS3xApU4vx533ame+DQory323j3W67zQmQ3OqMrqCoBEWICEk6cjQkVNOGOni5SSg52XjNscPFvay3sp1jEcYKuDFNGwLIyVLDUaDnlQUzxXl5Zdh4umxb83i8UsMMIi/pAqUCihz40zDHGNchya/kOCqN69vLWdoXAVmjZ3W67dCtCS2ugFVHIDG3HyTNk4xAJvahO9DS2Ajgnd7aOjOzkgtTIABTU1ByrzxeuSZrYGIz7ZR6YnEUjzRjtDWitK4b6RRVAAXL4gDKlMN8sFxmh1sPAIdkuluY4Gt1t2Ky6jUyIy9UTaRrUDjzwPkh8hi0+3UEEs329r3IJV+6ij1F2dqhlNadNBWgP1Yi+R1IPjuS0vC9vk2i4KVJgugBdUB06q9Lf8MZeTfuNmDG6ssi22tbS9aSFVihlYO2g0OsAUHLjTGO2SUaVj1HsRkK7tVKqNSHmc+FK0xndjQq6DPuJKIkgJCRgNIDmVZTlT4n4emLsaT0KbWaPkF++D2fTxnebH3h8Xt1h8e8w3Bbfzi3t1pFY71Kn6N3QU0pfgAOaUWXPi5xyfI8P+0kdzxXNT+Fnzkuog0JcSF3uCABQxg6q6o9RIAyJ444/cd9sicjI8kgb9CSFXd7mMDXIEXRq1GnMEMDyw50IyJFdRE01I1lDrDbxheh2ObsRUivIVp6YUSCReHt00MMkaBWUvcRJLIp6og2rUgQ5FWJAyPH+GK2tSxGxNqt5Vs45LhUt11iNtQ1Sq0goUBzK1zoDw+GFZSNlLe46xwFjazRi7UdlrVUNJQ6svXIBTKMnI8xX1xWlqTbcGe0PduFkgnKP3mt7a40toK5AI9MlVWNcuVcWblMlg+LWxlAN3Gsaxgxpchgft3UnT2mRgVV6ZEV/A4iixMvDx6xvrgWUMdk13eSzQxLAh1SSvKaQLGV6iTzrniVKd7SK8uRUq7H2J9ovb+19t/Dtv2RoIzuc9LzyOZQGae9lHWCQBqVPpFfT449ZhxrHRVR47kZfmXdiyXiWW4hhBOlqyOw4ZcRXl88aFojK9WI75JmRYLcgPcxlIS4JJPBerOnph0fViuugoXb4tv2uSOprRnuNIpqc1BHSOVa1wnd2sHZ21KXv/E5Ny3KJTFLIWYmISjVAy5CqKWOgqBx41x0aZlWpgth7mTCbx+3s7ODbbZGSOFS8kYQAsDkTIwWlSRT5UxQszbll/y4UEJvPDI7mG4ijt44lngYRwBhSZ9VWDgjUq0pSmL652im2FkZv/AIpYJEa31QrDlDKoZBEFqiuGqdFBUAgmvEYtrnIf07Kq3/ANrfu7iGJxKQoCPKQFSMlfyUBckiopkDi+uf2lFsD9BBYezuUbS2TtuCqdEi1UdvWAI1mVdRUla8qU9MO3IQq8d7wTmHwcQ2itbiN5XcCChykbRpdtNKVFP5Yr+cW/La6FZ+Ye1k+5xSmEwXiwQtBF2E7cys2ssqlchRsq/hi7HngzZcFmSf2t9irLb9wsb2e1EaW6LcKKBkhldImmUBwCSxQMSMq1yGI5+V8Lnct4/G7XLWpq3zLaotw29oDGGj7gaQP1JnmG0kVqKUFPXHN414NuXE7GWdw9tbO6fcg8DvbSC3SKSVQ6m3UFCAzrWhYltPLlxx0llMdsPQFbe39hBqNxF3e2pt4g5dg0S00udWTU+OfLlhd4fLgrTzXebbaIPsnnZxNbydicOKqtSWqjAZ5Gi1/HFlVJC1oMH+7/ktvdPuVsbiKe7vtMMSodLzRodWqlWROFD6n4Ytgy902MmeUpIsG4xgPJHdbQyurAh0aMKxQqTRgK0FMcnyNYqzu8Cy7iG+N7elvsEc8ls867qocRTCo1JQIRmdFK5Y49awdS7lj0m2u9pbSvIxkDM9ZAyszE0qQK1UfHElUjIelq0ilIrYTxU0C3VznIcy6g5ilScN1Dug7bW9/bPG0EcslqgoUkANDUlxTl01zwoE2SiyUwSCG3nCSXDd6JwGYLkTkfiM/licEHqySXE+23tusF3YwtGwKrdMHUagKk0AWlTx5YPhGmyP3F1ttj2XtLe3W5aIAGSsi6TQ6VLZOCcQs16Fi9oywWbbi4lvNce2PIZULsVeVVejCoyBPAAimGqyHcS6K1is4zDHGyxJMCiMgdOoFiWatMqgZceeLEiuRzULqW3NOurLHXJpiBXuZdWYOZNOWLCLCIlDPEkoQxwq4nkVSCWHE1z1EE4QByMavEGitUY6oo21BmKDUdbDiCufzywAA1ALHL2aSOlYwyhUc1oeBPqNIwAHIQsncSNjGurqGRDkA6a8MzXLBIoAuCyzB7QaixbSp0qunI05VGGmOAKkSRN2y4jIDwHR0u8fOTPPn+GAQS8qiCWSgiOpHuCDVgHqAUAJpU5UPLADFDdLIgV7h54hLQ5IsZINRxqQBllgYBNu0atHNcQqVWP/ACjltJYEgAdKkj4nAIMEIhW5s1dWihYywq76VReFAwHA8Qc8KAATASwknVcwrJTMaWZCeRUAAD+eAAuWSHoCytDGzEPLoydlHJhwIGAZ0QSSmZEcjQA4rTVQmgoOFfXDA6sLvWPQYp5qL2lYGjqC1eIpXj6YIECjSRpjErTWxlDJHIQBwzJXVUD4Hny5YACY3iK9cSxzPTVLoKAaiAG1UqHb/wB3CgYWsQLdusds9qxljhmBIoR1M1AMqj/ywwB25M1I4ov0ZTpI1Gjs3NGoKVIOWAcHCwMLM8UDQqe0xJ6wh4tUZk6gf7MMIAuJdQUOr/eLWYjNlShpTLSK0HHPCYjzB5EVEjCSW+pASaUJAzeurlxPLlgAJpCro6xM6smudiRoqOkEUrSg4euAATs7L2TIxWICTuzCh1gAhDTjkeGGISOyalMnaguJSO8BTqBNSNYyBywhoHIFaMPCXQivYUoHQx/nKDKnoQcAHZxO5iDKDIKjtQ17kceZNCMtIpmPTLBsMrSgLzmB6C2IeVwQ47lOkUpmoPA/+WKkTYALpuXe3BkEZpJDGpCscyyEkmgJJzwwA6YoEmbQ5iUBe03Eu30oxFQxXPqHpgCAxI5baIKsEj2yaneEjqiPqXJAPyGEAMQF1kuTIdaI3dljCkDVQ1VaUYkemQwACeOJikMErO0qxyJKWOkLTpLClNRORAGGhBpnWW2YRO2plUTqF0iNtWsNSlSTTMcMNsAPcVjGZZEmVFJ7ek6Ap+qtPzZ5VwAeUiMNCrmKLthYLdCzAayTpI4g8c65YBAgUhkhht1+4Eba5CF00yApWi5AcDnXAwgAUhZAZpmV5mDO+kszoTXQCc+VcABqIyTyGVxq09yMMSzFAaCMEaQTwNPXCA4VcgypCYnuCDEa5FQcyysSag1Jy48MA0deKN4Q6SnSruZtWoyE/mZQMqAmgAGeHAMNMUVweyNIQgxd5SVZZF4lVJ6ssIGDRkk1M7FgoIiuaGrRqcjQ89Rp8q4BAo51MkFy8ivM4LztLGAqkjSGJU8BwwwDlaU1Ak+5jmAVwQFKGtB1EE04UwAgRKRSwrK8lKOJTqLOQciS2eQ5DAB2HTbpISte0Q2oHpaozQAcKjM14YQHKKIQju6hwZERupVANFZAM68sOBB1ZTErMhSQBWkYGqCEcBpOdSRgGcaaIETRkFJD25blVpQaqLVeIrhyIUnWZOqYGMRaFCHpaPj0sMq1/hwwABMrtM1w8SGRE1faKQpoo/NnQEDPCYAGuoGkE0CounpMgXQylh1uwbI1HDDFApcmG0MUUTLHE4eSYGryajq1JXIA88AAnVdIaEoxqCkAOhW0111HE0B9cJjDog4eNQq0kAKCUk9pY/WooFUYYHbVZpkdWmI+8LxSFn6pFU11c6Amgr6YCMh0bEspZiJYG062VkK0rRXccRWvAfPAMUMJO6O3Nr7ZEszpRCi0JoVXj8MORQgErBljeGV1uLl2ZJYtVGjApRjSoNM8PuYQB1P2Z3hkE87wgs70ApUUIYHMV9aHBLHCPp77SvDaXu22sjyyaba1RHPSrEQoQjUrU+nHHcqvgOFkfxn1V9untn2mI2sjk6U76yNrIehGZHDhjictfEdjiP4SyKhtP8xjGbYPAGpNKDhX5fD44iyMNAiqgSMR9K50wkSYXIFPUMgM/mPjiSItDc9nDJ9aBwDUoeAr8BiSuyDxJiiC2igVkjBCs2pl49TZk4Ts2SrSA/QANFBmc/8AhhSSENxaxyVBUmNxoMdSBQ86ccsTV4IOsiEbXED0qCzKQoH0mnGv9mH81kHiXU8dmgXUDVWYEq68QT/gyyw1kYnjQU+zxMCwWjlRHIpAqwORqacfjh/NZF4UE/6OiKVQAMj0FARqBFKUrmMS+doRWIUQ7cseplXShJURrypzFf5YTySSVEmO0allAIVqKCG4n/3cVNlqBsxA1p9UlaVyIHxIxEkyObkZNCNHIwTS9XdQ5BJFa8xUemNOIyZUVF5z4lsXmvjnkfg3k9u1z4/5jZPtt/qBLxrKrdmZVC0V4n0yK3Ir64vy076FWHM8VpR+ebzjxXf/AAnzDyjwDyXXH5B4puUu23RdV0SvHTt3CgZBLiJldPgfhjyPJxfKs/Q9xw8yzUTK+vhLHLVO2FFuO7OAYw9DpehBYZHjQZjFKNI3xq8krRx3AS1kjaVpmlDa+51NGAeYzOXHEbCRfXthbxzyxJHM1lcSgoLiNFcONIKLRyStTxIGWIWJo1ztVjcf6e+mUmaWNFnhj+lyxHcGk51OQ1E4HsT6lU+5atE7yBWtV2iaORpVQNpMoKsqpQjiQCSeOKSbRmYxASCJT2nkljlM0i6INBaoYEGooPT44seqKZLP8UiXVDEJT2Y3B1FQ1KEBUA0sWjYkUrnXjTCH1k+iv7Ufb6DyLyz/ALy3GIT7b4KKWryEsJ9zmoImRhWphWrU5dOOt4zjy+9nG8pyYXYup9IAWSUqa8C0laNmTnmc/kBjvxJ5tvUPtlAIcBSrJ9IY1K+tScRsx1QvgtgCkhJ1BToUnJfQEYg2WKssPnhDgqoVXKEJqB58ef8AZiNX1JWpKgS2+3Q2lWRT3HQKSSSKE14epxO2SSNccAJrBZgSY17c/SyHmB9IBByP4YSvAPHIQ+3qzhQihVoY9IppC5Ucj6uNTh97I/KgJbaYSrF1EoVn0CQZ1bhwPD0xJZAeMRDxq3Z5Lhqd+VVQtQOtVORVSOJ/sxNZ2iDxSGt49aABwmldIBQdKkHMsVpkx4ZcBiPz2x/JQnk2GFnlmiUFnKowkGpRp4EAUr61OJLM4I/JQiHjFgbmOSdBKI6Vjk6l0mpq3AEg4ms76EXhQotbC329I44VRD3KsERUJJyYkKKDlw/hhu7sR7UmId9mhklbQwPbYKwJ4OKGi8AcqmnwxPEmkFrFdX7WsU0UZm1C8ldUdgpoY11NGfUgDGqslF2oKN828vS0tLqa0knSQa+whejaYwCwWtVbVnx4fjjTjqzJkypaHz49yfcCPc0kDyAWsgZToQShWYFe3I9SNTNQqcbq0MGXJOxj7e797yWGRtcXZcjoNZKEnpapPACtfXErFeOWyKeUvJJZ3K1Kxq1ICwA1mTIqlNJ6aCleOObz6TQ6/j7fGOyba3aitYpQLRYY07r5qgUUY04rUnIHHEVTtOwvtttTS2uMLLJRAYWLCOMHKoYmmriKc8S7SHcDSCBCpaON3hBVZChUIBkS5XMGh/HD7RhUtqAjQwKJmlUOMy7ROMzQk0JIHLhgagQiu4ZZrRezB2pIYw9sIgFKqD1FQSRz9eOIjkDa215uFvIk6yW0d1RY4qnW0gyo4NRQg1NDiPaOUCt9jtX6rlnvZ9QIt5mCqjLQEoDkCQKUGVMNY41G7EhnjVXtkWJy1Sq5MYQxPSVyAYL+Y0picQRkFEJBLHEwrHCRH2noFQkENq4auNRgQCmVpWP20jK0yMIAoTqaOgpTMg5ZgfxwwZyKKNWmWAL2FBL3DsOypGTaqV6ia5DOuATCoHhcKylhJIQyMxVhKhqwFcjReZNPTACBXBLhNSLbxxFWgiIJNa0J0/P40wxg5JIO49YZJIHIZHQKR3G+k0ahI+WAQAmR4HthII5I5VWRNAAY8idXIA58qYEMFLGIgtu7CSFcxIqh0jK5gV9AMzgkRwyxhGlSKN+1Ir3F3p4qDSi6Rp58CMAM53USN1hmrcTSV7tSg0EZxaq50pwrgADKzNL3ZKu0oZVkdQIzHp+npAzBNKjAEBUgDRRtIhSOgHHoQrQMTUVpSn4YQHYTH9y5jOiKIKjND1IfQ05AVrhgHOW1dueRJRb07ig/pyKDpAAOdc+XywgCo1kt10yRqQBqDM1CjU6VIAzqMNAFos4Jo3blTrLU1KQfy1yPOtMAgDFZlJlAdO4Uk7lKrlyLZjURkMIZyaRXcGZ9Mf8ATETkVVNIpI+YDZnjhAGVZineuDKj6CEI1lmTJDrUA9XxwwCmM1e5NGDEVIjZQKfqHqVXTM0FSa8MMAxJhG5Mskdy3UkMZA6zw7uWWBACgZ0IBn1z3JrJMoB1UByVhxy/sw9gkSyOoSSEQqWc6JJXAMk0ZY0DgcBX6qH+/CA9LbrJLJ2gqxIVW6m1As8iiiECnAcxgbA80zme3kVElE0Sx6ydP6jk1YUBpQ8zgCDkSNGpJZO7GdZjkUUdq05GppXiRgAL/Tn7SzJJNLIv6MRyUFM+nTwB4Gp44ExhUaK4kkABYIzsWYoC3AxgDPSOXrhAVxBRJZHaBIVeIwxQaleSoGpSp5j14YrRMKlkSKFDGQJHiKl8+FeuU5EMCcvhhiORxCG2BWQu3Z0C2yLFfzEKSTQkihGeBgKO1pUyT3KnUixLOHGrWTQagctK8BlgSAD26uskTQvDbhke6Ufpmv1HScqDnlnhwANiJXUqe4kBdY0XpJDAatI/5iczywgDZCSyu+mVlSgkqAWKUOmoyWjeueAAEQX7iNAO40sQlnRSKs3GhByz5HAAfG6llAY27jUjmQFu4eS6gMwK8+fwwxAWDtM4TuRIVChOlGTI6jxpqY8OWAZ4yMY0fW0UyFmaFVOak0IqTkxpWvpgEDXSrQxiRBJDRlYVUagNRMYIP0jjgGejYvJKjzNPGhpcPL0l9X0MTTn8MABlQlYlhD/bVDtG2qQtSgVMqgGudMAHXDLRYR9xBGA0Ez5aKUqquak55nKuEAdGFk7xW3bRIoVqUyQgdTJQUz5HDEcgbJbJi8WuvdJAUO/IB/iBwwIAyMdwSyzq6u6CNrbqVmdaaWZjlWudMMAKTIAJD0Shq3MNBpck0PCtF+OAAwlAiyxW0Z7L0YrSjluEgpWgX44TCQdCzW6W5XWNXaY10qxqdZ45MCQBhAwxmlEcTEi4budsuFpFKCMxQEZqMqfjhiOo6xSknhFSuoiqIw+iSta58cA4AoggMM7lI4QSJI3AKoSamnLMZUrgQM6xVbmaVIwzNoUW9dIBBBjCsAMhTVnxwCgPjEypJGYmmBcP1kUcnIaWzJI44AQNCjRz9kAyQqSoc6GfOjoqnIZHMnAMOMYcLDqEsr0dguZiRfpqK0IA9OJzwCBhIlEd0QJVuV0ItPpNKM7AE6hkfww0JgKRK0B7iESAmSRqKJP/AEqaUzwBB3RJPcLMgVpWNdBBWN0J4OAWPH6qYQAwpEpkkRB3AS8sbkFABnHlQkVGfrhig7OpkjR3hUC7WiPB09sj6KAcCQcASDdYnt7gBgyRRfrRlaAyLx1AVzHHhhyCPop7Sbg97YWksSLLBc2FtLJ2qdTKuRBGZbgCCPljv4taI4GdfGfUf2u8iSSxtoO+vYiCRh3bU2pjqIfPVljlcvFrJ0uJk6F+RXStEr/R0hgv/uVyxy+2DqK0h+vKhIqQDSnHlXEXoOTpNTpLUqCpH/j4YQmxPDMrwxsrAnTQUB4j/wAZ4k0KlpQbrNK1AGkUPEfxwiUnS1S1Ccs6+oOCByBEmYWpzzFCDU/HMYYSGDq+AGZXmK+uEBweoNMyVy5DjggIO0FQNIFQf/cwBCBUGRrSpzwmAEoCKE1Ar0jgcNEYCWQBlIUdIyI4gnjhg0cICioANDU8KEc6jngCAmXgyrkWXiaEKfX1wJEbOCObhMQrMtY5GXUARXqWlacDVhkMacaM+VyVvvLQrG8gESJK3TqI1HUCGD8lqSeHPG3EYbM+YH7+PbeOaw2X3y2pH+5sRB4x7hRwqul4Wam230iCpJjYmBieTL6Y5XleL3Vk7vh+WlbtZ8xJ5oxGO7b9xO47zFWYRxyEAFQFoMivDHnIg9SNW2rK05jQgG4kVjGmkoZAGOQJqDQ8OR+GIsaNae1m3M9tCdWoRfqNYygAIrsFDmRiCWPp64raJo1ntlvc9tnaOG1jkdSVOg6Y1bPu0AKcK1riD02GVT5/Y/pLBLBGtre2xiubliHFvAzBw7jWSSSBQgV40xWtyzoZFnNbq7SYzzWNu0hkhV9KOGagI4kDUAQvD+3GiNCmzLX8I7ly0UkVDegIsBhIUzSSnTEiLTOhPAc6YjWjtaCN7qtZPu17T+Fj249vPHPG3RH3SKEXfkT0o8l/cgNIGpT6PpGXBRj1nGxdlEjxvLz/ADLtk+SRQZKv16wemoqeXoK+uNLRiTHa37tQ+qtGoIyAyBqZUII4YrsX1H2IUUkACpyJpQ15jFDL6iio/T0nQOArQivPhhRBOTlekqPjXV/b654UBJ4nMDmXIClc6DmMNAAJFK01oKuKcxhhIHucesDkK8QBnn8flhwRlHGkXpJfmRw5+gwQEiSS8RFWV2ClmzBrSvDOtOeGqEHcTPdKgZiQdBBVh1DjTpoan5YmqEe4abndIIozpkAfhEyKSzcKnTRQMgRUnFlaMqvcii+R2n+otcXM0dtabZaXG57jeSGiLDEGHcZ9WQFCTxGXxGL3iaUepl+dq36FCP7oW91stnubgm63yB9ykglXUYYJ3WVNekgkdsrw48KY2/JhwUf1EopTzX3dsoEEU10TYOsyPNCyGURtmEQA6RVieJ1U4/DRjx9TPfPpBkPz73QuZLhrS7jVrgQyNDCWQx9pgSmsh2AcKQ1R6euNVKGHJeWZN37e33NmvJpXMs4JExzOqMBSzxDIZ/TTljQlCM7ckMutPZnl1K3clSOacUQqrUrRlBqxzJFaHh64rtJfRhtnCbq6t1R9a2gW6vUoCGKZLGUbIZ8VAxzec9IOpwKuZJJCoiJkkkLNOpDKVWhf6qfCtefPHJR2gs3A7yF0+1MhLaFABBOYFafCvqOWFIgNJYl73faF+4OtSJI5KilSABU58DhIcaA2gHbhg0MSNTMxNApP0sFBqAa5VwNgjiQtIixOirIulhqerO6HMKhGqhpwrgSG2GmModepECSM+mIaGVjXpCsan5nAJHFWWQRLlLC1VjhVkUxgHIyayBlTgTgGGwIkbO0zsfuY2Rx9ImzrpjzIYH0yw2IHCJGVh2I2myFv3AI4wy5MCq6qkVyHL5YEEnGijljSJYS0qiqFKxLQN1mtBmDlUfjgE2GSmSVdMaRqNXdjKNq6AKByKVU1Hpnhik48gn15IzSgNMrKFZyB9FOIy/8AHHCAMEkpWSCiylQe0wFJEDUBBBrX1OeAYnZRpSJU74iTVPpYKJDSg4j5UNePHDECjcq0buGaPTpW44gVqDVswFHM4RIKDxroemt4kZl0ioRv8bE5PU88MAYbtszTsSJUpM6ozAkgZIKHnxyy5YBHNUjo6adXaKm2jjpoGkV6wafUcyK4ABPLWPuyrLJKyHuO1Vj0fmKq3LhhMZ1ll7KQhBN3irB0poKgUFOVR8eOAQAF+29wREkobtx3DAJpQUBpFwavDPDGF3EMcYjLESKrAIWJqxH1LwyAPPjggD0kbO6QiVZ2hoWZ6sEBNaKBkwbhUiuAQBwZhVlKpcBug1VAykkqzDjnxwCDDGusShu4HFJww1tlxFOHSfxpXA0MLcOZZUkBHeQIumgCgkcBwIb8ThQB1ZlMT1h0oOkBQqKZBWhzIOjkRzwwOAnsSM0UbZ9u3MROijU7lQ2VDxNMAgTGON45gEnUxrEAg0jKuY1CoBOZHGnDjgALl0Slo5Ye40KKSgGgLUVLx89NQOeAcCKSQPFHdNMVkl/TghcUMgBGrqzqDWhrhDFQty5EZ7cU9Atv1aYSCDqqwJJ5AH1wCAyqixGsbTW4CxzQalUqg/xUIoaklc/xw0AQ1YDGXZZe5TRAeLf4SvGgAFBzGADjMYy8cZZ2iUPeavpjQ1YJw+k8MhXngGeVB3HiEHXMwlbVmaAVQIaqQFyy9PjgYirYKTRT9HZn6HlXSSV4EEEVJyzIp88UosegN5EJupwfuAVMcwI0AqKfSDT55YYHJgtVKAyOrgwvMf6gYfRkAVC/3YIGgTyGJWUKWnJEbytHp1KeIrnkAaVGGhMNkhCy0jkWjALI9KwItCRpXiSfjhiARsESWRpzKq0S3lBz0HMgilQcIQeyxgSwAakkYN2q5pCQQ3drxFTU0zrTBA5BiNWYSPIYUVg9tJTRpQfVWlRUjhgABrdkdgGjkBZ4SyhnUDmhGQFD88EjAFoi4i7oKvwJyR2k5FuVD/PDExW1EA6FaKJ+2zhiq90UCq4oGPIDkcAgu67nbkWixhW7IYgadbA61BIrSpHAYQSGdCqzwSETIhXsIG7ZU5sVL8fUnAOBShQS20kfUYIwYo2B1sxAHVyIFeNPjhsQmghaWGY90uq0RA1Wi1aqvUD8xrUeuEMWKrSKIfuTI5rpkI0/p51BpQkn44YMJ7qs9vFHPIyZm3VlPEKatIfy6uAJ4YUkTqMY4ws6PIxeot2NP0+GaqcypzrhjFOhImnlhkrBKiOKg6WLcgKA0FOGBCCgFRXVXImkcDVUiNTIMjIBka0ypgYwxY4EfujrjCBnIU/WooGAPp+UUwgBRnREJJLnRENTMWzMko4oF5HhUjjhgD1h4nhIWNnIaVx1BWJyTUacRwGEMOZ5AsYKaO8qiVpKaI6mlaH1ypnxwIQcwmCGZRJKzhozoQdD/mBBrQHjXjhj3CjIEVJEJmjjH6EOSspBpWNQKBWPA1wCB9yVY4hHHqjtW6lKa2cmg00oMq5VGCRNA1NVVwxR2ZvuGAYEPWnZAJNARU/ywJ6g0HIRGLZdCxyjWk40AAEjMVNOph6YYM9GRGoKxyrHLVoY5m7qnSMiGNdNOZ9cIAccZURh5NAm1aFOoOFPEqwrQ5ZCuBAwEcahnGn6ZD+mtWLpT6iTxI48cMiD1wSCYRs0C9smBhWgcUoXGdCeGWABfHJIluYWVUaRWLMRRnJXNV1UyINa1wAjZHsru9nBs2x27UC3luIZnIZzGwJUZ0BoeAp8Bj0HG+KiOJyHGRm+PBfLo7doe/OjOoGqyZx3dFBplNaNVqcyTivNhkeHJ2s0xsHnKzLFEpYyKNP20uksVzVZCRSoPoCac8c3JgN9crJ3Z+TQuJDrZwi0VSQVZ6CpVvzU+GMtsOporkH2DdkeVTVSso1RhDrAKjgSOPyxU8UEq5JG/ad1X7i8sZZ1cwXMqRKzdZDFnCgAVJpT+7Fl8bhMqx5NWhfb7jEqPCxLNbMY5ASCQlaqSqmg48cReMsWSNw//VLeWvWOB6iDQgmgpnn+GI/KZP5pxb8dWlw4qVKkUYU4E+mfrgdB/MFK3iMBpYEkKYWGes/4gOfphdg/mB6XaMdNSNTVHEMQfTM/iMR7SXegYu4wKnMmukClWNaZf+WDtDukEs+aCurWSqf30+XPB2grHe+rFCjZZ1alAQOfEUAxGByd7tMqVOdSOYHMVr/PBA5CjKurW30FcpMqKPlxOWHApGq/ulVDUGQKKTwRnqKZgMa55ccsWVqVXsQ3cN2VXjMUocU1rI+Q0jI0GRqtSc+PDGmmMy3uVjvG6W6Iz11KWWGRNevV3WJqiKKZ0yBIpjXjTRlyWkq/erPZ/Kds8k8Q8igWTxvy3bZ9l3l5ClRBcroWUU5o4DDpqCBni3NiV66kOPleO8o+CHl/j+7+E+SeT+BeSNTevD90n27dJlDhJjA/6c/VymhKSr8Gx4jlYXjyNbI+hcXOsuJNEe2VUm3AyxMRbSS6Wj1AMpIJ1BKUoP7OOMtloaK7m5vbHb+zBBZo0MkFykazwPTUy0LLrpwVqD8vHFE6mjt0k0pb7fFcJbMa2k4bTPE8oQyRgA6eVUJNMwc8KxArjzja41hvb6CNLqdisFshT6C+WhyAAxpSp5jkMVPRltdUY28ltuxuN48NtpilfvI2kgOY2zRVqfprTI5ccacblFN0bI/ZZ4EnmvuTbbld2iP437fwDe9wY62V7pzSzhcHprrBfl9OOj47D3Xk5PkuR2UhdT7DXFwrr3ZQUC1aWpHSTlQnifhj0taweTvaRLDcd0ksahBV4GC8BwJJ4VoaUxJ1I11JHaS6SacD1EswKAsfqLZYosjTXQe4pQOJNABrWhy+Gf8AdilouVgwXSISBSoNKgEA5cjgVAdhA19EU46k1EEggq3I1xLsId4UdzCMqFjWo1LkWUUqKDnlh/LD5glfeIA1MizGqxA9TtnzyCkUqRyOJLGJ5BDLvqL3NLa2eghp+auZFcswOX/niSxEfmDVceT2qM0MsgM2kuyF+22ggVkFT0gHI864nXFJVbKMF35hFEKpcRgFHU3bEESafyplUnKg088W1wSReUZLvzW2IVYZtJMgiiQMiyQ0YdUw6q1PGo6R88WVwsrtlgq/efciOF7iJ5XejTRrEoDCWEqFasQAWJQfqLEkk8DTGrHx5Ml+R1M+e+PuVd7L7HX7wTmLePeDcv8At/aWjYav9JtghvpYnQIBrXo4Uzpi7DhWTL7jLny9lN9zM/lXuWkumxSeeCwtYILXamUCKTTahaLIAwQ6COsgKTl6Y22x6mNZHBn7yfzvcL2eNhI0Mjrq0uI3bWJAjS0CgHUBQDq9cTrQh3la31/cTlpZYBOySOklCWCtVjoAFNNQcxn8MSagjMjQ8kbRwpIrx6uqOReqSZxItVYEfSgrU/PicKxKqkRI0s1y6h4ws2maRGy1qC2cPAcgAONMQcQWVUDntaxTW0rr3JLjcpO6jECNnjhYrmAchXHC5V+6zPQ8THFUOkLRCKdXcgXQPecZIKEFY3BpnU0FMYtDcgygkLwqwUxnuaiFLpQflrmxIzzGGJhaNEkh7EIWBqSRKxKGQmtQwcUUHjmMIkj0yUMd0spmIr3BTrV8iEbRkRpOVcAjqkPMAZKqlFSShV0b8oyHAcueCBBrRzlZI1o6WUgOlgTpoc1pnqPMmvHASBSM4jCSs0VvJIH1Noc1fOrDIGvDBA5DHtwHjWZVR1jLhIgwCA1o1SaVWldI+YwiAFVkaBpKNcPCHIBJWmkgo5ZTU6ufPANHs5SJgW6UDBgtCJG/Kq1yBNcSCD3+Z128jsHeR83Ioy5fSBWhC0rnhAFgK4UgdySQlopZAVNNXCpzBy4UwCFKxrOZVR3S4FFcEAMtKkGhGZPpywDEyxrNAI0k7E/dYSxvq0gAHMHkCOIwACUf5cyLCZYbpFEUMZ6dS1LGhNOOf9uGM8TEWR5JIibZkjSSMkq4AqupAQM6kZZVwCOfrO7AK5Nwh7QQj9IajqUhuRpgGBYmZ07OgCFT2IiTGZVC0bWuYOmudc8DFINnkaFLnXrQIyqZemKnDtspIGZ4GmEAWYkEZ0FYI51VIVBIauRfSR9I58MuWGAHSP0dcojckxySy/SCBkB+HPCAEs0YYra2rIqqe1GQzRGUCrFq8CPXh6YYHo30TITOxSYERy0qBKcmD8Ms64APOTFqZ3ZrgNptgrBtJBq4bL8w9cIAqMKIlV5x2rjUUuUqSrVoBT05n+3AgOP2AiMW/VapyY6aUyk1EZUHpgAMZXeWCWMBJCjdqWoAovHI5EU4VNThgFurJGDIrXNvMwDTJlocCrUBBIqMAQeMi6wiMJYC41GJiJCxAJY8KAHj/LCA53hEwjehejLJOxOpI3pRmPEEnM1HpgBCfrikkCwupjdltglJAkrHiRQ5c88sMJPMHkRY/wCjLFRpImCkOSeokLWmeBBIMy2pNxcNdLFEOh0VCOutNOdQR6GmGwk5FCk36ejSUZX7YoXUV+oZ9VSagHCYCRywmgKyuYrdmjEr0Opmauqo4qR688IYOUBxWdWdo1PbdCS7MKgqfhTnhiKtloYGkSNlWOqggAyLWgYsTViDwFMUlp2rK0QNuskbR6H7YDKh+ohGNQVXSS1eFMsMEejj7gdw8ix27BlVWqKEEggmuotxyw0KRUtWlgVH1XDJkXz7cdagkH81fTjxw0gC4JwswddJhZ2GpyelubCvqcKRQHERi4YN24X7ep+k0IGeoDhq+GAAuYa41mUMZLhx2JWqJWC8QlSFOZp8MORhrCZnYL3Y7mJF7sdarJySleOXP1rhCYYor1IdDT6mmtnqKEMPpNQdI+JzwIQXII37cbKGgWsaRN+alWIDACgFcsACmGjXErxGOJFkSNw4qSxIoDnQah8MNajBBHjMy9o6nmkAYPoVmBzzNBUAcxzwAzsrqhJnRXli0taIjMqr3ARRz6k8sECRwLKhhMkjhkb9R6gsGcGik8SOWBoJO9htK6DJDJMlYtAookTLVxJFa4Qw5SiAB2MU8nTWQDSGFFLNl8aDAAWUlHdtQqxxaliHE0rn1HOqn1OATFTQM6frPCsayfrJwkyICMDUUBrwAwAFuGN1GdTKscdCspIZU40Y58KYYpDYzUFJY5YoGqGiXq6GzVg3HjywhndLFu11SXIZpIbiMdShBl8Dnw9MAHtffMbynKQ6rWBo/wA4BJMh4GvHLDgGzyyRs06tIbeKRqyAjiKjUzACikGnDCEHRgs00i1jihpEI2OsNqIo5HM5A4cACVngKo0rd61JQOz1WQHMBgMvTgK4IGC7kgWONQIkQsiswPXI1OllHEZ5Z4YCgxzsURVdFClrcoa9YADBnOagkUHrhAdEjOzsZUSCSalxOp0IrUpqVGBBJIox5HMYBMN7pdQ8FxGpduxNASKoKVYB1zZiMwf4nDALdXcp2UlSOBv8m7OBKzA0KBaEUP8A54TAMkzVovuGDhe608Y0iSTlllQjPhTDQM5NLNCGY9pHl0xyITm2XUdPw4ZHAKA0PHEn266Z41hMxjRdOr5sM654YkxRZxqAkokSUIQGQtQKoFToOZrTjwwdQZfHtluUy+PyxMHrsu4TxdipZhbzESmp1BaEAk547XAtNTjc2sWk1B4r5cI5be1kuFlJSOOzvGZqPE1SyyI1ACSAB60xtumYaNyXds/uFJqEaTSdpyRC8oojNnqGsA0U0oP4Yotik1VyQWrt3uCkcZeO+e11GkUHdNUUEgMwetFZlNKHhih4S9Zie7T7iwKttO9wjuAH7gHb1vro6hhXIZH/AN3FOTjyg/qIY97h5THtPmm4KlwB9zHa7hHBbgq0kUkLREBxqZ814ImVa6qYhTD3UC2btuK908q0X0d3GPuYru1iuLZFfJH0q5jDigDUcV1GhPrgphlQTtk1A2/lrR3LJNPS4dWWCWQ0jy05tmC2mpJIyHAYbwaaC+ax1PlIOhIZu9IZRGtWIDacznSlKVrnir5Mlqyi2Ly1NbRxzfWTKItXHTloVjkufMnC+QHzRbF5ahLL/wBM4KmOCTi4fjQgnKhwvkDrmHKDyaAo728hag6BES2ak6mYNQ8ByGIPBBasorTyJaFI5VZSpYPwDGlTpen0ivPPliLwB80UDyOEgFy1vHEVLrMw1AEZE0Y6VblzpniDwk1lFse9oMmk0rExOg0apFOQ1ZjlniHyiXzQMm7QhXR6ppRmMVDrI5aa04cc8Hyw75Qx7nuq0ZvuivdP6YU1cgAE1oPwpz5YtpSCq1yv973Aa5WMhS4EYjMZPQakivVxINanljVSkme7Kw3Xc0RnhS4glhkUJLEdSMz50DNWrBq9IIzP0imNFKlFmQeW8ePSyvFGEhLmZJVNzH3aDi+SiooRi+ChuD57fvq8OMe9eF+7+32vb/7stF8U8skWqn/UtuXuWVzIynSDcWrGMnn28648x5fi9vxI9Z4Ll6On2mOvErCI3tsZI40thKJ1QnTqDCnUaVapGVB+GPN3eh6qtfQ+g3tlYLJt0YCSuY545oGyZ0DUVEIIz0nlQZ8MZqsttoX3FaEW81xPEs5lanaDlTqFA4UD6akDM4k2QIb5VYSSj7EW8UauC95M0hZoFQExx1VgKnjUj+WKbssqzK/n+wVmn3ApNHPGe4IzoyjP6iyrQjpoKELlzxPE5cFeTRH1V/aX7ev4B7N7buN5bLF5B7gSt5FuxIIMduy6bOGh1H+koagJFW4Y9fwsKpRHjvIZu+7XQ0TeXDKaMEglcFzKyuXNTU0GQFMs6Ux06LQ5VmhNFNHK0bC4U1FHSoL6uJDLGaN8cNoVXBJLW+pGdCh7hkWqqKqVrRdWYB/u4Yz2oXq4J90jV5VWRRIquveFSxpQ0UH0rwHHCWMHkGmfyDT0MxjeOPVLEQzSiv8AhUcBlwHHFqwlbyEauvKewP0CZHIH3JUnWsbGhOnIVAGLa4Sp5SP3XmcUUkZjldlB1QMtCdNBVpOdK8KYtrgE85G9w85SORkkdrqQl2uOx1zMn1MQuQB4AevrixYCq+dbyRTcPcM1cXFwGikY9i+B1QiI5aCWC9JJozfDp9MXV46K/wCoZE7v3GaSdLRbqSOHWIxPHIxHckRljQtQgovH4c8T/p46Fds0kNu/cVpAqPc9mV0YpbmsZmaJEBdXAOhAc+HVT0zNtcCIfPITv/uTNJAiKLieK6UvJZs8srOkelzJUBXOoCiioTMZk6q2LAkVWzlNb75vc3rrt1kWS73doYdnt66n79ywjjXUrehFFAFczTFjXbVv0Mvc7WgZP3VeSbfH7kbD7e7fcGHZ/aPZLDx9ZAgUDcniWS7uFC0rV2UVPEg4r4VWqOz6sr5dptC6GZd33t5ppu8TdP2FF/DFWjoQNKtItKMeLMQOIrjVElVLQiETuZI5I1RmZVBhiZQNJH5YyDQ6SOQ+OIlntEt1cLQEM00KwpLDA7ij5Z66H6lHUADXLCsSqAYkzzIJNcJQGOYDSCVYE6V4gsCa0GIskgqG4KqVFuss9wtbSULq7xZytDroARWopQ4pyPtozRhr3XRKTEYgkXdVo4ou1CtNbRlfzAipNG5Y8/dyz0mKvakg2pZXtPoEX0lgVVmJp1qa6V5gjnilqS9HWMytGjhLmWADtyinSo4Ek8a8ycMjAONx3o1FEic/5aMgjUSKUeufLjyphAejlRQ8URLiasptQxMdVJOsNpyzwDakE6s+mOJlkaUd1ZaAcTQ1+nTxyNBzwCPIoKLKsgilLHsu5auQoyx8Mv8ADU4Yz1Gcq2he0SDHAxIVgMyTllQ+owhngFMzpAndtidUrBjWpqDp+fOmCCLDQWMkKFHieJggkgfglKaip46a+uGByEdyZUcIqRs2uUanYj/ExGbH8csAwFIkSjpKo1lkkI1iRdWVaVpUnj/HAB2aQudM7VaJ/wD2XBTycmlPnTLCA882stEZGkEzAEoTpIGYLCv1ZcsMZwtPGkwEqu0zIRBzGkkhaenxwCBprmLtHqt2IJMoBLhyNQWoA1A/+7hDCXkRIjpYlZhpiFQZUUV1q1BlwOWGEHnkUM0RncBGWSC4DhqEgdEnpWoGkZ4JECnSSeVo3kJpRy56usngCvAHIemFIHBo/SBjQXDx0ntwNRJFMylaUrnnhgFIIZI50b6WYhWQ6iZgNWlVGbA4GIMAFxoRHZ5JlAMknGI8VUjIAhv44ByAaORIo4ZAUdPojVjWRUHUShNeOAZyWUyQyK9wshoryq69tWYVP0gUyrxwCOKYCZGoyQLGEYO9WYkdNKU1AYTAAgJLKVUPrLSyhtIQgcM6VFMCGmcGh11TJSUqEZAM9VaorZjp+A44Gwg92rd6C5iUSRlvu1PQ4lpQCIk00/CvyrwwAD0zSPOFaSJpkCKalhoHGvPUacsABadtIP8ANKUEhCpcQurCNkyUyUAOkV1fPDIsE2uOUF5GnuLhNQutFQ8iigKL6+gOXrgGwoyRwyBO6rEx/ruCyls+oMRSrD+3DEddokeOSKAyRUUmJmC6ZAKgCh/HPBIwoypJJC8hDpK5PcAohevAmgoPjTBIQENL1xTKe7MSYwjHQrkE6SpAHD4YihsEVJdoUHYBiaIM5OqWVc+J405kYYpOxyS/bRKkgDodLItACKZsQa0IBpgYFYLJLdmRBoEYIe7ly7buaBWAIqBQcueKS1qABDSK8ARVSeMmCNTkdHDUfy8KZccMRxFimihSOJnCuO6KDuBgo05enHLDAWxmKTvQxFhb3NVgVco5JK1dm5ivwHwwCEwlmkhEg06mq2pUAjqmQSjcKjPLAEhiSo8iShdUi9TKRp0uclr/AMvPPBA5DhWNiEBuInCpOqfUzVHSDTKlcxgYAKGSBkBBWIhIYgdJrX6UPGg+OBCkNeOcGMzahGAF7RpnUDUVpRjmaVwxAe3KsDJJF34leg4VEaHI6hkSD+XCANm789pMXYzSIqtExKiiKTVGWgzBzGZywxyF/pySKs06sgcyh3Gt4+4AQNLcTUDDEKF1d2QsUdSmjcWIIDuRQazwHrlgBhiiQJFbkQO0tG1rxSPIaVXiS2dDhMAAaGskSGRrZD3Fzr2wuR0LXIctVcJDg7GXeKWQMlJSqMoJarUqMyPqC8RhgCmdlMMFTVqIIowFNVz1t/8Am1+OEAYqRRyHuhlt6UjlkzRXYVA/xajXIYADiY2E2tXlijKgCRs5KUADVzpXnhoQBVYx5sIUmlJ0lgdDnMHhSgrhAHoCoIkjjVix0zBwQVNBqTic/TmMNMIPKZ1K3SN3pZKgUIAAHHLgdPEYQHYR3IJk1KbcrrkYilWPAEZ0FeOAUBkZrIk+sPOg7ZtmU1dgK9Cg0yFPwwwSOaO0y2rOrtQNHGwJVZSaqgKmpLZ5YEMMkBBeGVOwgJN1Eh6ywqNZ/nw+WG2IA6yCJhJ2iYVAFwhOuVRTRQ8QV+P/AJ4QA4wqIszxNIr0gSN3BFH+py3MtX8BgAG1Cil6y/bDRdKqqIwmehyCQaDgAOJrXDAErCdUKBWSJdcYpRnBajNSnTSuZGEDFFa0kXtusZ7VxbPlHRfpYk9RoMqeuGgBtqeZJHUN2QZYoFoEQDgSWOTE5g4QjuoaQlq8skc76ntyikF+IqQCdRJ48MSGg6RWZkKppYDTdSSU0oRUqupRnSnEZ4Qpgtr23uZlu92gSSKX72ygvQVA0CWJmjdULZGoPA46XAtDaOXz6yky2kvhEsCCcxR3ChxbANrK1I1GhFQp+qhqeVMdpI5OxJrXyGVFhSU9mJ6K9oaxrG3SQoQ1ALjhQ/HEYBWJdb+a3FtV2n1wxWySQXDdu5FuDGUZnIWo7hBBJ4Z5cMLtSB5IJJD5xKI4VWSae2iVQKaBEvdQdSEA6lcmvAUHPkG8fVkXkguvcPL33Gw8H30XxEu6WU3jt/NG0aO11Ar9kFzV2YqlF05A0+WKa4obXQseRtKwuTyiaXw8tKHsbnxEwT/YAxzyrY3MaEGWRKI50kksFBFOqhwvlQyTyiGPylo4Z54JuzZuugtK0a6FDBmjLuKUYORUcF4Z0xZ2LqFMsjsvmziANKjRRPpSa3gfUCquRSNjRo4wudSxZicUvFJb80UHziJQHW6BhnSORbUShGuENM442GpdOS1LZcueH8liWUUr5o6yTFpQ80a6LexJLKy9NaOSGqwp01qM8J4tCdcgvs/OvuO5OGa5GhUlRASyMRqEWRq2f0nnxOIPEkP5o9webRTAq1yl8UL650JzelXi1cF7ZzIIxXbCydcw8W/miNFbSveSdnSGjuBSqNXIEGoJFOJriHyYJrPqP9n5cC8ASIqJVb7W1UjttWuuRj9QzrQmlc8VvD6jrlF9r5XHcEiJxeaY+60UMgaUAEqSxPBTwyzwnigtWULn30H7l3uhayNTumqsCKHUAufGn8MHyxO0kUvdxbtMsB+5HcWOx7kiopk4ijUBYChNDliytCDsQjcrxJ4Wi0tOzkusylZBG+akg1APHIcvUYsqoKbsgE93bRtIwRUnCLEDOuQApUtIKalA9Ofri9FO5FPcPw6X3S9s/NvbaRabnvdr/qHibR9SRb3tv+asyzSZxmVgYgA30vyxj8hgWTGzZweS8OVPofLHwCOJvs57m0YzTsKo5CvCGOllkCk9UbA1B/Nxx885FO20H0vBbuorI+hftvZulna27HuWzmORrhCQ7CUAEro5VArXh/PFFNy/I9C7RaSxyzoGhMxfVDc0o0iNkFK/8vE/H+SehXOhEvItuWaa2mUvEZInt4npqHUjB+5UK9Gplq/DFV1LJJwiKeOe3a+4vmXiPh0kP3CTXFd8mAFYrGz6rh1bjp0gpnxrXG3x2HvyGHyGf5eJs+ndxuVlE0Mdv2reJYhDZRJQKIol0oiDOgFAMx+HHHt8eOEeGy5JsMU17NczagypGmh2hPUrZnNgCdRoanhi9VKWxTBMI2cgCY9xmidVVVBrzoMgtfXEWgTC5d4QRGOOZllYl3LArlRgRqFCFNKcPjwwLHJLu0IzeeQN2pgmruGNDCKiluACSzZdJyriyuMrtkgrzc/LYhDRpm1S1eMRuwlZlH1rqFacK1PzxopQqtlK93Xzj9RI45DNfshezaNs9B6v1KU1LUZNU19KZYvri+4ptkIPeeeyPdTtHfGEZNeTtoLuoUdDo1RX/DT/AI4triKndkMuvN7kwu8p+2iu9clvJplMrxSV1q6F6szgGlaBacMWfL9SPemQy68xZ7YmKJ7mGOVO/A4JDHTkVjWhHbTp51P8cWKpXfIMc3l7sGuHlaW3ua2zToHMRSpqpZmUVJYAkn6agccHZ6EO71GHcfI7hLWLWaR63kaEI0cxf6XenExmtFIy4EjE1VEe6CEbvvf3LrJPPJapKxYSgqQYCFKRkCg48cgKcsT7Y2K+5skXtBf2p9wdk3zfS8ey+HQ3HkG9ySOAs0ltE5twxUdDPJRVr8BinkVmsIVX2uTPPke/X/kG77n5PeSNd3+/391dTXBYM/cuZGZVnBOYTVp+YrWlMW1qq1j0MtrO1pIOZDVYewO9GheMIzEMhOZZnyJQkgrqwItkLkNzbJHc9xbhoZAxEbAyKwoCIwoOlaZkgYiOZE0JniIW2cLJqM9WjAQLXV+sCampGVPWmFBYmBnkQxqVQyxxg/qyxhFbIkoUrqFH/uxBslVajhAvb6btJopLaYNHIxDLNUBkkAzC0PMH54w8y8V0OnwaTYd4HkjVmMMTXpACBDWqucqVNAAOZOOGzvoOP9GS3DgtLVoJpQdOkfUS1c650/jhMZwFlNvHpTuEaIKCopyMhyFDhCYZErJHMxiZ1KsGo1AGBo4Wn+LhlzwwDAO+ERoxHNEasxy6BktFBqDyNOWeECO1QCVJo0nuNOjvUypX6qjgPhXDkYAoDEuayXk+msjhZNLDJSQOGXMcvTAIUaSwjMSmL89sUkChlHHUamhJBIBGEMAJFmcOodJRGR0kjq40BUVIrSuWGgOKJGMbRIIpWU9hFo8deBLsc/jTDYgrWJIgiz/bKA1IYlGkhRQMy1GXrhAGvracLJVWZEPYUmjV4qDlQ8zgGDZnjmY9wRkKS8UVMiB0qwPDicKQA9oUijIP6oLSyL0qFrU1TkSczTAMFFVtdJCKBxKjD9RjxDh8hQUpgaEB/UK3MqOsU8tUmjcl2mPSwVhRaV5Eca4Y/YDYqrLKYhb6gpiYihEij8icczXjxwAxLAO7HOjQrc6EMi6qIxkY8DTIEDmeeBikEJFK2+klKgK8Sj9R1GThjnkPWteOAAcbrGsia+lG/QFOsrWgVX/MvqCMAhPqeO3aRFCTgjSStCorkEIr8wfwwADWhcBlLvIdaPJSktOYOWdeFcEgFRgIC5hZ4s+7GzkOHJ6SXp9IPp8jgkkG1kQz2zlZI2QC4mDdEg4jSxUEAeo44ACkFERtMsy6FEcqhdUBJIJ0kcDlhCPSMTEVTTEiESRlhRCSaIVXiBU88MZ52aTQ8glHaYiWZTXUSK6BlmWrlQ5YBBas6tMj5xWy06jWkmnIM1MiF554EM9OW0tJIp7iqv3bxEqQeShTUKaHjXDQMC9C4X7ZXOgMJW6GqR1IORZuFfXA2I4CjOsL93shqBDUMjUHSM6gUOVMJABIEsbiaBpRbEho1IIcVrRgST6AE88IAAAkUMoVDIVIkBppp9IYgfV/ZhjDZtLyKs0mqOEjSzjLqyZV08dRzOABOszobhizEsxUxuuh2pTMDgDhACYmTSJCsfbAUAAhm1DUADlmBxI/HAAFJZBqaQrDLcExxpoKmnPV6emXPDArAKVhlh7p0DS3cQglVOZVqUJNRlUZYpSLZAswkSGWSdI+4A8a5FVRjSlRnrpkM8SEKDIxkQyLqJFbUghVUL0sGpTNhQZ4QIAyKGuIg5gMcjCWxLVRFU6jnxrp9OWGBxmgmk1nWqXFBatUiIUHoeGfEYCIpdVElBLoeCIE5gDQRmCDk1cqVGGNIAhmjLtHM6JJQpFJUHVWuptNDWnMYEgYP62EqXTTrGzaZ5KgFaVYBSASfTAKDxdWkt5A+lShWO5uOnVGtdShieI9f78JsIOVZUKxa2WI9yJZGoj6zSqkcSOWCRApGt4TAnWQr1DsoXTzpmRXLP1wDaD9cghd4YI1DLqaXUO64NK6a8sMSOySd6GbXKY4ZFQLG3Tp05AtQU40rU4JBIEVlim7JnDg6X7nTrBpmiMM6aTlWuAaBpJHGzxlZDFrCyAMVWNGOQLDNlNc+GEACKJHVIArSyLJnIAI5FC1IX8aV4cMCE2HUacStCoiKT/ptHVXY85Dqy9cNiCxCjvNG1FhdkjttNe3Wte4K1qABXjXAMOOhwsVvK8pt2Wk5zaJRlT0NK4QQGKVIiDMn+aUta1BTQVNAQQaZnjXAB5s27azB1VwV7gBWMkAMBpzz5YABygNGvUCjlTDHTj/AImqAKH4YAOvRChgYiZSInBBEemuSyUrnXLDYIPMJlkaE0cahIGjIRlUcQKZ09CMAbAUZZYjJCAkrSNoUkf0wKKi1qaEcDxwkCDkz7scUccT6SSpDFteQKjURVQBhgAQQqkc2lRG5/TrV1NRQlRQ514A4YgSdtEJJWeMHsrASyhVlBLM68a8xXLCkIDA2ntRGXvz9sJHKtEKR8gF4FicqEfHDEDR2iSeVoGiihcByApeMsc2QV6qnLPAMLoEk7cDlpJQA1aMuk0NShr1ep5YQQKUWMCScPUgkLodlZ6f+yqRwHAczgB6HUeQQlbdkmYBeymoh42JzCkfmyyzw5EGo7FVjYsDHqS1cdJSQmrZhasTwrngESzwu6gtN/2oPKv23de2uCEpqFwo08zmHFP78auLbtujNyqzRl6NKFMyszLKkTxJqNI9FDqdFGo6kUcMegq20efaCo7mSyS17xdkaNAsBjRtKg/1WNW1cmU8hkcMgHQySOtv2G7d7cxF4bqKUokj6q0oD1VB1BSeZyyGGgb1HaO/DsZJ3ng1RG4kRZA6J1BWBoCWKMfSmrhwxPQdmraIuLw/ebncvFd/8fMjG+jMe+7PaiVox95YuJXQSqdQLIpqK58Mq4runKZGvoTDw3yTbp57aMG327ZPKbRrFLWD9Oa4SaFzN3UoQixXDGlOphnxzEr109oJy2Q2LdJoJbkPcyrNCWtrmWSQFdVtpjarHWCaClOI+eJpKBd0HYvILiAQuIq3CjosXj70AzajKr/4q8Tz4YTogV/UNXyQsq/0zNOFWVJVqtaijGIE6WBpQVHx4YfbA+9CdPIAIIXS4RBPI3cV1Da5zlq6iMl+r4/hg7R94sbyJ9cMrGOV7WQ/6qpKIySCgEqhSCKD6R6jEOwfzIF8XljgxJHcTmE6TdyyEdwMpqNR0rVm5kdTc8sL5ZP5g6Q+XzaqanhuC+tYiwkihGZU0LAnXX/3ML5YK5IrLzAmOadogUjdV3CJ3UMXUgByVJNQDkoPE4rtjLaZCX2HmcczpFKHiipU24YJJqFdCswJ1vqr0jiKVxW8RZ80kVt5IzxrGKLI5aNBIgJEh0lValQQORBypip4yayCibeIhoka2YXLs8ZZyMxU1ZeRFTUc/wAMR7CTuiO3F8JS8MEomMhaF4/yalOoVGvMscqUz54mlBC1pIvNdyjS01R9y5iWZSHVXU0Oeeqg9eFMqYsSKmxLbuln9req8dhJYstxaSl9atPGaxmMsy1IUVBYVPLDakjW2soxj7teEweIe9+9XdpAqbH54sfk2xW9u6VU3T03GABWABjuRUAeozx4HznGeLLK2Z9E8Fyvm4Ye60NR+3wtrfbLeMAEsnbeTVRSpajaY606ciQRjiJnYu2W3LBMLeG2ilDyFmSKsas6ICRrNWXuUDCgNMq86YAIxe9ozyRiUIzJo2yYVKSMoLMdD9BJNcvTjiEayPoWn7E7LY2Nz5Z5lJbCIwrDsWz0I6Vb9a4CMrMf8AzOPSeE471szzHnOTtVM0GJoZZI46yT63ULCc6wpkpJ09IJBPxPDHpu1o8zKYG4njfVIrFnIcywqxLxheBUUI41FcKHJLQjNzvbkSTiWOTthTf2xRjQUORZgDlUAetScTVCu1oINfeUCFGUMEnQa43k+lctIZA9AoodK6s/TF9aCdyqN+8yt4rWQxLNHJMmpbagZHUf1GzNaimRxfXGZ73RWG8+YNMUlaVzDGwBRHbU8RNXiVTUUY5kjmacFxasZndyvNz8kaRNEty8ENxIrQys7SCNSCFRstWQNB6YtVSHfqRq+3sszyCBPuoI9BkJ7iKOTpU9VONa/LFqRF3RHbrdWkVpp7hZJLyMvHMAwL1FCpah6n5+gw0Uu8jRNuLkKdU1s0TUkjUdo6HIZiWFCwJ5E/DDgUjel48c08ksEplQ/oKxrG1DVGMTgKWBzHoMxngJJoZ7y+kkLILo3F0AEa4VzNPP3CdAR3IP/vIHL0wyN7QR69ubiUqFaaC8WEAQszNKspr3HjJOnTQAuCefDEimByn3mPZPANzvIGdL/wA0mG3QzOzi5hsoTWUF6UKMRwPDjnhdssqvZyUvf3umKWS3Y6TSaaGFqNoRQoEhJ+kjhT0wXfQdV1YgdO4Et07f29qTl3CiBnXqApUmmRNTiLJe0Cpkg/ViuFuY5QsTyp+m3R1pUChBFPxp8cIe+4VFHC4h1Sl5HVyLlCTqQZlSteNRliLJ90AZpJJl+4Yd1zMjXMD00OG6UDUpXV9JA54rt6FlGx3sH1m6jVBOtkulbbNiDMQCtTQjSBSmOTz7dDueNrpLHmJQ2lIWXu28IVrlRpKDgVqtaHiPljltHXQoaLXLIVVLm3SMCS6YMCpWmtaEAUJGmowmyYCqLFDO2lXPUIiT2ytdK1bOoFaZ4QhYtAyGSHusG12kik9vWOJArnxrQYYoEocyvI5kUxtJoMwJSiqKlcqU4UGGANEicw6IGtYoyXDaQQGJNASTnXnywACQJ+pGskY7h1atYdKZEK7NWtDUchy5YGB2iPOumJwCitPCK6VUZLoB/KaVzzJxEGAg7sUSJCzFZK/bzFdJJr1ZnhUetcMQY4hpI73VbZGH20K0Yqx+rJchU1BqMSkcHo5EMlqzaI+6HXu0VQoH5eI4V40wmICiujhJbgxShC02s1BK5cBnRlpT51OEgYKMrSJiWsTMQsiR8FpQaWDUqrDnSueAAMiLFK8kEiQpBJ3rVqE1b8xXVzJz9KDDGC7CMgWNhIajvGQ/SW6gh4BtRzB5csAwQo7RVnkjjuYRraIEUKZVGRGRFMj8sECE8LgiB55TJcOwpOtarpyUH4tQjh64BgisgVaM0YuH12ZMYYs/HXTI5UrgEDA0m5pGfuIkpLcIVYOTxAIqK0P88ACYJE0UbiWSJogTC0ZGT1qFp8Dnw4YBBsYeGPudkSRuK6AdOlj+VdXGpPPCBhLsyKYmV5mc96OBxmAeIBAyofjhgGs47cTSxHtK2tbhZGDRMAP06GgIJyNcIYSYzE1JFWbu1pn1MBQ6h1fS1KfDAB6RgERjJ3Vkq+itHCgjUrUrUBTUV/HDDcA7L3VaFDNEucqMCRIp6qspA4jKowQB0mUM16iExklooolZ0jkagpEBTMClTy4YASPCMhFgeiMrFXuwTGSq9WkE/UW5k4AAK6GRI0LwwHPvSUXuHj3myGYAz/DCkAx2ZYHMUUksbIGdpPrVkbJ4+GuvqSPxwSAmBUk3UVx1aQdEoOqVmOemlcwcieIwwAuvdjSQu5qa3KE/qDSRSgGVAfUYJEAYFUaSNCBNIFuRMemRq0FSoAGXphDD0EKSSiORRGEYCAliqODpRgacK51wDAlbtIWUJAXXOOR2JZyPr6TSppnXhgAILErIHZm+5B7CtnXXx0NyU8/4YYga6ypDgxyLElXcjIqKUoaZ0yphAVToJjSTuF5Q5o2s9xshUEVYZcjX1xWi2DrkzmOWOZDcwuJUtjHRVH0lVArWozzxIQJ1tWlMiOJIYu40cRqXcP8AVWvAg5ipwoAMBioksBZyEVDEBpYhPqWUmtRnh6BB3VFMq10xvb0ddJOlFbMxmmRoPxwpEkDWWNylHUSACTttkQgIJIHBloeGESDQ5jftqHgid+ieahYKBktB/iBocMQDvQuzmJzDFPJoD8VEgz00zAHqcALQNLRRxhqRz9qisjCiqa1GnLIZfLBIQcUBkf7aXurFHqSOVtKrpbUa6RlprVQPXCFINDRH7KBgr9zvy8UauZp6ehA4ccMQK4kjBZjRhqowAoIVNCpSn44JAPdwrRmO6t3t3VAtTQORXJlzq340wwCwqrGWn6Jw3fWSpJCmgIC048/hgAUAzSJFMkdZ1YEq5LiRXJ6jT0+OENoC9RM1rHFpRU7VxIpDyMwo1QKjM8MuAwxACrNGCzdiRKxRgmoZQ1dJNCc+YGAQN4278wiLxrImqUAVpUflyzOVKA4BrQ6UCpDMHdGjBCTGhVgMtZCnlgHMBkipNEsaytMgQFTqosjE1cg5kU4fHjhAHQ9ShSdRkVojK2UepfUjOo5YAOQxmOYTvDODEtEjkXIhfq1Afxw0xMNjEscigHUyEuUqQpDDgSOYB/hngFJ4ojNplUJ20OqJajnlpamdfngkZ5JGeZm0gSOQTFTrCDnxAJXKhxEEg10lWOda6oRmmtgJDU8m+PM1xJBIXbhFKpr0hy00bGrKzAf0lPTWhGAAx1Cdl9QE9xR5XQUHVmWZuqoyyBp6YIAMpGwE6sE7DaY7lQ1ZJWNaA8qfHAJoPcTBobVW7fbjZbWQjVVjmdTHI6eWXx44JGgoaFgjj7S24L6mjQlnryYA5io41wMA0sVAdZNLIxikgYmixv8AnB/xHgMAjkaKRIgLduNqtEo0nWeLA/IUI54YhTGxCNob9LUOzEMmYGmWs/TT5YE5CAcTJFMZIkrNqRrJWDauk6tR0kaqUyPLEqWackL17lDNRW13/qG37Ru8MQNtudvHcGOJ2DIxQhtOsUJLKQQf549Fgt3VR53PXts0JZ44YpysJmKgGR2RgpER6VqOoSBc65ZYvbgoQSkcaQxtlHaKe7EI0AXSCSX4k6geKgVPLLDQmvQMFxoljPa7ccjLNdRtpdJUdCfroCgJblnw9MSSAkPjW7NsG8w3Mbd543SebskRM0ZZu4g1LTSV6a8TzwNCmNyYrew7Du81g0ix2Ky/dbTZyLJ2pUmiBhQXDKJKrqNOkg06qYnEognA6eTzvJv33UiR3Me5xQXqmEFlRpgA4LVAJBB1BfXBX0FaNyLx3QVYYzdukMEbNDMI3HeiLfpxFyTRnPAnIUxOCvoJop5E+4oGMsaIxugRwcgMZCSdIXTSmZNa0wyMgWvrh5GTud1rwohMRJTSn1ELpUAHhzyHzwoJpgWvLglilotwLZ+9NQl5mMf59baTTLJf7s8DHYUNfztNCs12UuHDSBtPRJrNQlAGWo4Gp+eAacAvvpCpd5R9xcqtLaBdGl06kDAA5KCM864EiXcOI3cOIlkpdaiOwkNYpHmUksgYCgzzHpzwnUnWxJYN/LTPHNMJYrcCRYYm7EgBqqNHxJkUsRWudeOKrUJVsSiHyeSQQvdaiJQ6/ax9IMqjpJZSuklTnlxrit0LFddCTweRSuYlikdQ50T7gWBZWI46aMOk8K8sQdCatI4yXst4VXuaLbSYIyqlVLgkhmbUCRxpp4kitKUxF1SJhMs0oq0kQt7ZV0wwSVcaxSvUuYrzyzyypgiSIEtHb3kstEftzL2o1AZxpP0CMggihqM8sSS0IpwyAe/mzw33jvhHk0S3FxdeE78bW9kEWpVsN4jA1u0R6dFxElKLQA8Mec+oONOPvPSfTvJjL2vqTnwj7c7ZbxG4028SLLealTUXWgOkEVFTx/sx4ZLqe6siwbjWndNXJhYMlswy4dOmnW9G+HVzpTBZgl6kfvZHghn1nS9ow7yyOHaRTQHRGBSjDgQeNfjiVVOhCz7ZZoXZ1u/EfFfHdnmRY7+S0O7XusaaSXtZNBJrmCQCDmMe88bhVcSPn3lc/fmYXZbul6sCIzMNR1woxDlsipUKa865H8BjpWrBzq+wd7m8mC92a6MKTMXurONWY9IoqqRpKUI+AJxHtRdqVn5H5G1opSZft4V1CaNGDHWQSCzKB1E1HoDXFlKyUXvBR/kPloknkm+1nklBUW5kkEhlKCqrJpAKq3EAD15Y00qU2yoprcPIZJ1KRXYhkupCqXjNQLIaalp1H5cABmcaFQz3vJE7jc5J1EU0ioxlCC7ioFBX6QFFQVbjqPH4YkkRTGzcNwa4kkVpnugtGkJGkSFBQkAVoQDRfTjhpQQsxpeX7k17zSxrqFxBFpLx6PTVSoWlSf7ThpkEIXuXmliEsQ3IMjRQWYIEYUgVlVsjqFBUcvU4GNpIbprsnsRvMftpqNbTAAh3BP6bK2RNM6Z4kiCiQiTvhWVWe4t7PRcQkdaNMT9JY5AovEA9OBKCV9Bhvp2kurmUSRyLtcZnN6EZlM8jUCqlQD0ggVPSM88SiSq1yMzR3Nz9nZ2sKwXW8SJZRd0s4NxIxEjKxqaCvEihOfDBZwiKt1FXnO6Mb9dst/1LLxi1isJkU9yoCqsskgJBJQio01NTzxLQoidStC6zz6wzF2j7SwS17kiacmNKFVI5kcsVvcsShHVSEiBA6rJ3Ba3jrVQVK6gVkHSC2XUQfTLCY+gVOqyXkEKukYWZ0L1OYUFSXbOrLlRvmcRJUiD1os0cfRHoMUki1QAoyZU1EnnQmoHDCbJMBFG5/U0skVC8U2te2T3NfbQDgAQSK4hYuqoHHx/uLtTXSHuQ313LO1GZpDGpCpx6hmOOODyrzY9Lw8cUH9tYSOFJmQRguZDlIVcU4AUPpnjEzbB5wGZpUkklMTBfsQCGUNSushqZEVAPE5YTJSHy5d4zNqnmIieJBTuItMwc+A/w/jgEjqxBNcwiqof/ACpJY8cwh56vX0wxhijuxvO8lRVn06TpZjkFc0qQOVMjhCYB0ZC0dxFHAiRa3XUTUgllIcCppWoFeeGgkE8i3L3UClZAVQLbMp1FiasyhOBPEgcOeAJOhllUwqkgtCNZYmqKYwAAHJGS8SONcIAosX7R7TK0R1MkhVo6AVU1T15CnPAAKUxFZjHbp3gO4aCoc+lNIFAc8zgbA8Zl0o88itDU6VPGoFCaDlhSANz2zBKpUuwLyM1CGD56kANBT0wwgBKJYwIszC6ntOCXdc/pdiKZ+gOWCBhhj0mLsqRKv9TIuiK3EMCeINOOWGKAuREa5t5IlEKyEquijLRTUPU8CTkPTlgGekVu7PDIhjBPfEUB7qErmQFIyI9QM8+eAQSxkl0ySupaMkyoupUA4hh06gRyOAA0O7F2tZu48S61L1bWxBChg2QAy4fjhDCIWKqTbkSkASiJuOqM0dyNX0CprzOGAbI/acCIQPNHGsl2FGqik5fURSnzwxBTMheasz/URBE40HI0JY/Sc+YwgOhkeF5GfTOgAlhVjqQjpoBQ0U864UAdALDUZdOkkskZqpHI5ih+WAYW8eoz9HWlGijyUkKASGPECmYAGGByR0lAFxCe65rKoqAhBA7uQ6qn1yGDcUQHSd4NpikEnejrE7jMqBU6yPpYkklcAAImNsRJDLIkTRMbbQQylyBqXQQCanLAECde2WigZlVJjrjD5gO35M65CorQ4ABTPAyJpEc0cHTdMZSTQ9ICjOgHHIYTGgMggefuahJLOFRKhkpUdOleasM64Yj2plGgo6z6Qkkca1qTnVNJy4VJwgCk/UA0vKtxqIeaMUPS1KEE8PTAEBhllSWTRoeVjUUBIU8OpeFSOeAICo0n1EmUCZBVQwHccVoKrwI/HAM4skcvcuHRlIIoQA4aMfUFrz5ZYYAVjM7iXqgigaluhbrVRmenPPCA6xaQ6KajLXRFqYalpk9TXOnLnhAVaJQrszsJJNSm2doj1AChVPSlM68cQRYCilLurwgRAyFe23SQSKVqeWfHlhgdFUklgt1aQaazvoOlHH1DS2da864EGx1+9RwsaQyAoXjVyQRTMleIH+LCYHmYyp+rIkWoFbVXFAj0BJ6s2y4VwxHF0XCq8qakiLagFYOStKKxBGR4jAAatdLkyFVlJ1xDqy4LobjlzwDDSAkckVwAKODocagwzBXkRUChNMIUHaymNGBQwnpihVh0N/hyrUcq4IGz0kvdmIdg8ZKNcyRClHC5Kp/DqywyIZbsxH3FSklQjh1GkrU14EdXLAwDGliieeMj6CdcXBgAKU15BgTggIOKyJJpa3RO2E1NEM2U1NSBkCOZwSMG8ZBDxRgIz6JpKBS0oyD0HKmGI41SoaANKYY9DSrpVZFZqO3HgOdMIAYkDM8dlOSLktqY1JUoPp1D1OBAeiuFCq7RggtpmiLEsHfJQHGQJOAIDB3EhaGTVFpkMAVxVxXOgZfXgTgEeV31l2iEcluO2tsgqHDcAo9ScIYZcQMoW3kK/cNCko0yAgE8tOVDTKhOAJBSAuukRhIC2ZDksz0ohQcKdNMMEDj+4li0m4cqWLSKWJXpyBrnReRwA0BNVjRkD5vWTsEotRmFFaVrT+GBigNPZEjrPKqlY+k6yXIPMH8p5ZYB7Au4ia5IU/SZVWs5JZn/ADISudKZ0GHBGQUUJinK1YCIVigfJFJHUEqKFQCKGmZwJDmRQlHt2VHDQyEtJcNxROJ0j1rWtKYGDC1jFGtWbKQp3ZEBYNp6gvwJHGnAYBSHT96eSoWuWm2QZD5lOHPprxwDPB4HhQGREhtRnanq06fydVAK1/jgFB2KS3kAIhb7lVLtE5LIzE9ILcSwHAVpgBBml2h1SK07rQwxSOCTUFtbAnqC1Ap/DAB1FDxSxS/RVfupI2DIrHMuOJqaUpnhkQxUkkjEEjIty1ZJI6rSdaGhjHEkDlgTJINExeRAja5IVNJY20sMiGIQj6QMqYbFZF7+2O4W24eN7hs8k7PuGyyGa3BXWxtLri6vkq9uTVwzqRjscLJKg43NxRafUl09vJBMkUgtwjM0lsghGhyi0LOoL0D0qCT/AOnjjoyuhznoMpV42lijIQSuJ0tLilCUA1EcG5hRT0ywLUqYYytGGaIS/cpRu2zalaICvVq/wZ1qRQj5YkIUQzsY1li/S7EhmgWIahJqGRSooAa1r/LE0hMery7nm2O23K0luobvah9jvd6CDKLCYFrd9DAGsbsRRCMjnlhrcjZ6Dob/AO72+1nt9Eh26UxNGpJSOC4C0kqagK7KahaHjnQCs4hldnoI72VzauJJAsblLiXo0mVbZ/y6QAy6AKEZHj64nBGRLPequgo6TRXPbd9KFphEzmtTqoWWg4ceeeGKTxubaQyRz3JpbyEa4v02jWtAEWtSM6EgczhMtqAnkL9M1yHMpas7UKuYswmWkhs+XoBiKBsJYoBonWNEjVX1ISGkRqnq0fS1ajLIYkhhJdgty5jZTEQ6mNiRGtQGLOcyQeCf2DCGxwE7FYy0zG2i6ikD1mUSqVJRszVzmXp6ADLOLY0xyt7mQ9kXUSzuIxHJKAyoKVEbQSKDRyDT1409cRGmPm23klHuIb+WNiOzcIgDzQlCRHp1VIqFAJIr64CUkp2y7dDGGuO13qzwh5AVikYEMjrwBWmRzxCyJUsTawkKhW+9NusSl2imB050/wAWXUWyAGrFTRfI726XQk7jFbqaNz97EkQU6EFVYM3Tka5cB+auI7gPEUaB7OBYzG4qlvLIhUsagssDjQHUFSdVMxwAwraDaH2bxpvKdn37xPcIJbWHye0lsb/dBreKBjRrecRyDoo4DAgjhjPysay4nV9TTxMjxZFZdCFeGa4LRNvMSm92pVgv6ppY3FsTbzrImdNRQnOhGWPmGXH8u7XofT8GT5lFb1JxNVnPbXtxwuoh61ebvaXZHQfSy5ha5cTilsufoSPwrx1PKvMfHtvaKIWl3dC53uAVVWhtBqkXUoBzoAQaZ8Bzxt4OPvyGDn5vl42aW8r8fsry5edoorX7qU69Bow7QIqGBI+k0p/wx7nj3hHgs+Lus3JA7lNt2+VplUtHaosioQplRHBQmvGuQFeONTbZSq9pXXkO+XMKTC3m/wAw4b9NFqjZLX9aRdPSKEVoS2QGLa1Iu8bGefIvJGLS2k4CANGbi1Zxp6yNOmUks5VjUinHLGqlTJksyp903MzNJbx3ZkNuzBLjS0Mrkgx9t43pXhqMjZgZcAMX1RltJDbi4eqia4jKQsWu5FasL0q+lJEyq1BqCjhXjTE9iKEciySlO1otzJ/UvLc1BAAIIQUKrTnT4HAgmNhLBqErJFSGaQuTICS6ov8A7RQAaVGY+frgIsRNGJIUma37pU1cKe21Fy1tw0kEAsCc/TPCqA3XIuElmnnUXAArNIdVItWkK0QGQBH1Uy5YkQY1XE9ywnuGeN1iEkdxaGNWRS4qsg9CCK9NKcPTE0iKtqJPukFtEvdadCzSnUAkcbHMyVOa66Zg4aQrXGOy3BjZpLIFW9vLg3c3aQMRCG0oyxMKCgzDDhXE0imzchO1SJbbxu+/mltHsNpJ9r+orNJdzAjUlcm6qnRxHDEBvRQV7fXl26yTsXmcytBbSSNRYakmRpARqqa8QenlhN6DqoYjC9iRhLomcyaImViXbSBpaT8xU/4ueIEm5OGEzMKQ0cAsrA1jAkGlkJOVNQyoMsLqE6HEuVkSa6ijiaCBHjecCgiCk1Cg5kkN0sRnU+mFI9UAa2mjiKhBDO0ayRp3NX6GoFSGFAW1DhiLcE6jTeXxXbQElY/eKytJTpDirdCkZMOFP4YozOKmzBj7rEt8fhmj2farWV3Wcxkq5XTRahiGJGR5588efzObHpsChQPYldqkp2pQzBpJWrRgKVBFQDnSgxQ2XsEiGUXB7Lz9BabNjRgRQjhUDifjgInh3UQ65QewBGoC1ZPUrw1MeBz51wBJ0hAXdC8JdtLLVhodhVnUCmog5VpwwDRyZQUSVizsXMZl+lSK0p/LL4+uABRHG4W3eMdyKLpaGRddBXnSn9mBCC5SzTH6HkVO06AaUVTkCHOZGdOHOuAAzXVoxGjdq2DBFkykAqFDqBlxy9MMZ2c3KmV7hBpjYLFBp00zqDlWvxyywgCHYRiKF5EZJJGEEsZVQA3M1NSK8Tz4YGgDl1d1mljCoxKKQhJpTJCo+FT8sINwS9uFbeOOGPX3DKY2JCkNzqaEMRwH8cSkDolRtcJMgSEFgjv1AsR0RnPMA8a4JGgCTsuk3MbCMkotzVu2aigDD82fGmCQYWsWnvQwIzv3FESniukVJrUVArQemBCBLRhNIK28cYCiOhaQypSjKBUkFgeNMAgiO6CxSTl2N0GCTswOTUarNypQ8OVMIYcVVJZGlX7mBVJkaM0KmgJqMs2U144BgWGmKW3WOs8jCae7oyOKHpVdIoVYDhy54YhOpEaW8SKAJHIkmBNWrxC1qrEeg+eGAF3ZqnSBHcIEtg3FVjyBJGQPy58cRYIURzxkmbWgCgHtDo7jg9SMoGZNCOOeCAEgkUIjtmwbWY61FPjwqRgGGnsTrZrEZHkfICQjSiV61ZvzH0OGI7Uo/wCnEWgYmJWrRipyHbBz01HV/LAAngiZo1hDloQS0yaPzCmkdWeR4sMAA5C5m1poLlg7RF/0nlpSq1yoOZrgGclEiExIr1Mnemcf+09VBFKelPXAIJDgyMFVi8kZWOIrzJqARSnTwy44BimYojJFMII3XSl4Uapk1cEGrMcK5fIYREA4LBXUFEkDBrkOQ6Dj10r9PwzwxgHIYnpaaKUKapQdxwKmvMEHCGAjkVlZkBCR6THMpJYEHIOM8s8NMRxP03BXS+uv01RgVzchia/KnHAwRyeSPoVJF7NwCrRgatCig1Enn6gc8JgBJbV2CiJMRSAlmJ0c9VMqkDL4YBphelbgws+vtAUVxnTTkCuXSGOXwwpGVuziKmiYtKpLSOqFcqCi6+en/CMQRYFu0cwnaIxqHUJkTUg0JcA0pSlaHDkUAAOyTa20zyFX1I3+AECobmCSMIAahWJkiE8DIitHGjBtQ/MM+IFK8MMD0fYklZhHJN28xMrDuOxp+oeApyJGQwITBiWFZ101Do2n7n62DNSmlhwFBngAFBEqSuGjUiPVI0TuCvWSBo4ENlma4QM7WQ5n/Mh1H290Gq8i1o0dBx+Y4fjgTBBrCJ6LHFoIjZlmVqUdRmRTn/fhscnLXuSGJhRUiB1MmRLtWtQaZin1euEKBYscA1Ms0lzDqWPs0DsZGIqxFAaAileHPDYCddclvGRrNGZZO119tUagWmZoTzOAJDqRFxcPWKNSyGKEkMxp9J+HGmEIDFEVQTazB24y4nB1ExMOlWB55fjhhIbEXzn1qpiUGgGiKhyI+BpggQcCNZDyMO61VyqHAFNKjnlz54AOLIscckogJtWJRIA9AZGp9WRYUpU+uBjPE6Je6citNTAEcONRXL4YQBjPqckF4y7UuIwO6an+mzZc+WeRw0NHAwXq0BUtZKTxSGpGqtCOLBmrThg0BhMEPT3ZdMbXEbCGGI6v06kjhQUGAQo1rLFH3KKJCAbmPp6FFRqyqAPTDgAcetmRWcPNMgRCT0moyNOAIGdPjggAyFIoYEmZVjNuTDHFQO2ouKyCvxNMECbDXBjRklVn/VV1lbhITlyoAQefEUwCSkFRRGglkmWOByveWjx8Cw1nmB8Pwwh7HUjV7hJYFAi06snKlVNf1CCeHwpxw9wC9KSRMRGsahyruWIJAzDkmlaVrXniIhW3d7cUqTkvJoSREYhnQZ6h/wCnjWmJDRx4zIolhlM0Uh7aI1BqJBKSsG5HM1OAbZ184l7DuwiJUW9NIagGoj1HocEkTjh3Rpk6+woEMqsADyZSDzIoa+uAA6R20W6xTqe2hLBaIJBX/wBppH5SRgkSBlRLEFckpC7mFl/ra8q6XBFPl6YcADlkrDE4Uax+i9zQJRG+kaTUHjxGAJJHsG+3nj+7w7xA36NsOzcHJo5YH6ZRpFM/zAUyxp4+XsZl5OLvqaEW7tptvgurOQXdtNDrz+oQBz2iACAxTIAZ+nCuO7RyeeyJp6npYIJwRE6mTWJZXYtFpnNOjOq6m9a0XPLFyUFbYieC5tgkMJGueRu9Gw1kNTT2i1amtaAfxwyLE8UUU0gWWNlGghRKFlETKwHSMwGAX8MTQNi/arqK0l7d6HFtfxvbXw0iV3t3GhmjSoUMBwIH1CuHuQaC9skudr3TdPHbyKP7mCAxWt1EiuJIw4mt3IVWGYANKceOLK6kLaoPhu1uo7a6YySRw0jmuImCGgojlgagClV6c6jE46Fc6CW0hjNrLBKTALC4eO6kZl1iN66Xd0JJrUdJ+Ppgke+otUsoCyRqHSIxmaNUXtxgAGRm+k1IqKGo4nELFqUISTSq4QQ26NGjr90i6WeR16SQeK0B+ArnhiegNoGR7ZO2tvLbqWYBwU0jgvOmZPxrhMEdS4jCPpdwkchkjgYCkikUJByGZb+JwiQeCGJNwqoYlNvGvUCsIYdP1HKvMfEUwhiqJ1kjj1StLPJGDDCG4qmnTKgFaFdVFUZ8vXCYJajpb3CB27sapdZQXACsJEJANCAKtXSDmTQ8cA0iRWdzM/dkkie9mhZGjByBcNoTt0rxC0OZrxpliLRYTqxeJFjt4HLx90i1MxMnbLN1NIWI6KDprWvzpStkqlmbOlrcESgLFFHcIkNzOxSGGU5EAdJ0sCVFajmcsUtQXJk4srKaITyFnl0priiWMq4klkUkI7hqZgcxVfgRit6k4H21vLe2h1bhH9jcxpFOyhmQtPWjkiNmQ5DLMgc8V2TexbXQr/yeOHbfL7yaGGVtv8hht99WQaZB3plaK609oVDalD5V458MeF83hdM0+p7vwefvwqr3Qp7z/aw28shie5covcBDOFUFVeinQaA5gipOOJEHck0H7J7GLex33ye8dNd2q7ftqyoQ6xRhXlJFSGDllQ8TUGhx6HxOBx3Ruec8xyF3Kkku3m7tklnktXklkK1nd3dHaVV0UkQq3IgAcRlXPLHp8SaSk8rd6lOb35BBbuAL9ZrkKXuu1FVFUglo2zBVlH0mlOPPLG2tTPa5nXyLfTNBcyWcIc3TJ9xZM+uJXAUpQGlSgAKgDj6DLGqtDLa5Um47kZZlsdPdeQsO3IBPoDOQzqSasWYNU8vhi+qM9r9SDzT/AESI8wl1NHG4iZo9MrHWjNI2ksOHwp6Z4s2KJkTAFC9vbGSNSQ0FnIoVl1oC0wkBCq1UoppktaZ4i0SQnFvJKJYyqxy66O1VCdxiGcOyFc2OZahArRvTBsIFdskix2weOd1AcwxroDsnSaUAzQcc6HAxbDRcx6XQO8c0ZdWklSqOGFdMhXiQfp/CorhIQ03AhSCN7dVs3ZWmt5nJqoH9VggJBXqyReABBAAxMjZkWubmKVSkIf7piqTxQt+qEfUdaSHjqocuP9uLEmyp2Q0eSX/+V3GK3bsu0KJbOjl3uUmqGzYVJ5tTL0w1poRruD3WZdstBGJu2tharFbqGMjTKjKzRkghxQmlB60o2JW0RCq7rEW3aT/TtpstuSZGa4QbnuOg6GmAAESgsAqk1rXI5ZjEGyyqlkbdbd0WGQS0iBaVGJkdw7VXWKgChzamIyDkFKjNPDJKw+57gZHoUE6ItAqqa8PlQ4i2JADEx0Mpltbp3czWzSrRCwq2jPNaE1HrhEgEsn6jTgx27tGO7dutY27ZAp2waMSP8QxEmkIy73c7RxWzlrhjCkYUhGRdRqx/LkagcMRbLKpjNHbQ3E47Lys0062VmrfQRGO7OBlpIXSACKnjmcc/k5NDrcWnc0i0I2oyn7o6FVpY2j4uR0KQpOrKmeeONZ6ndooBiPvBVf8ARRApklZdA7yZ5mtAakVJFDiqJLGwSmZhIzM9xDLXW84CyK5ORVTwU5HEgQdKywxxmPUIx0xOXNIpOBHVXUaGh9CcIGFxd9NdvoL9oMGhjBIWQitSa5nMAZ4BByoIm7EYWS4KFmnlAdUzzDCvEU5YACgqFonjn0zyKZCAxckCtSw1A5chgAMLiNIpkZSisZIUC6pianUpUH6s8vQYYgLSu82iqm4ChpJgrMBG5DUIGQIFcwfjgGj0VwKxT28ksJhTTbuCW1hTmGJOfx9RhAxQ6ySPFOayzCPrjoAGVTVQgHoTmRgAJLMspjbuQvKSzQU1MCeTlfxpgACUcFXtXKKZKRaAVdWJBkkBcMCOAIAwxgwqx6zBIZFiUqklMyz0JZa8ueX44SBo6VlZJzJ+ohYMbrUAsrt+amWnLIEDDEJ5ZoWeAAant8lRaxlGrkrac+eZAwAdSGVbgSaUbtapI5FBDZii1P5zUEZYAORqQiLHqmdg0rK4Olq/lbjmADSuARxhG0fdgBQuQsTw1CRjgGbVkTUc8EEj3dmjgBLBpFojaVIZR+bSGrUN+Y1zwxMMkLiSW4iZSkkP6BhXSqU4FU5FM60/DCYCaJJO2dLOJoFqsy6QFZ8yxYmmZAoa4QAhJOJBHJDQFgbiOIUBJAqxH0mvrXDGEqHMbGIGL7p6WwX6i6nIByOHM/ywAeo88TJK8atqYAA6Ix2+JFfzVNSMAjnd/UhaHVkeiQkHWeLUPVVSOFOeAARuIRIvft5NKOw74JBIPFTSgp+OADmv7dHSNkETSOrh89EB6qivrXKnPBIHmVAYlM7xAI328i5igGZPAkMKAemEEnmKSES9+oRQDe6gCpNAqrppUjPhhgFLUTTPDAZV0fqWzEa2bjVC1aetP4YJEcP6jqyOzuoR3QmkiagSSFIAJ9a4iSOv29BumjrHGQglQ5OxJLAr9WXrzwwkBbyMrLSkveJLwsp0P/6SONK4aBndUsjairW8axgwqM+yFNRxB5Z8eOEAn4o8sNVpVxGymSuX1AZU086+pwgOtrCxtEWU1WSORBqVnf6mB/w/2YQw5ZYpO6uqVYZCS7odGqQAmnPmPkfxwAyrmDNFM0tGHc1IK5PRQGCgnJuRp+OIImzgDzBJKxFA6QjQNLRtxAAp1Ef24YAdQ7xkjMjC3rqEtAWP5hXmKZ0P8cMQcQ8ZQIFjLLRdFCFBNWbSx6VIypgYBMmpILq4+1qUIibPUVV8tK0NRTlywBIe1LWNIZAIgiqyICAZFIGoMacsDYHDLGi1mi0QCXU0AUDQ9D2zU1rXmMRJHZJFiKyxoHUp+pcA/phiR1Ag5fADnhpkRRoNZYRIbaBMkeeinpzYChFCxP1HDFIVKs0RD/asSiaXUyBneM5qoUDIAk1IOeESTDDA4WOJIkgklBWRC3WVzOj/ANJJoM8ANnmkjAZlT7cyzKbt1rriUrQCqEBq0yywyINi8ISZY6SJIWnJKsWAqVEvocvwwgWoaBEi200co7txISpClkCEgmqnmo9eGGkAOKOFROqHUHuNMEo4SjiagmmXphggCHVr7bNbwZxxux1gnjkPXKlMAAf1IgWaHXLbrVi1NFWPFjTieGWEAZ2xbTTKkJJaFXV1YAhH4lgeQzPHjgAMRyoJRWAmztmMhpIy5h609BgAGmunHvIxKSSqAJE9QP8ADmcyc8ASAOmIBlV1k1Uju4ipUkGnboKgKficABrTikkxjUSmbRBBSql6/UxNKemeAAXblgiuLeVFuFylbU2kuajorxoPStThwKQyNw0hftFNIMlwGFHialVOfBQOQNcEgehEMcSyM0kWuJlhKjUv/OF1Vy9csCAMZUaS2VESNnAU2wJEBCkkrWtOGZrzwDOghopO0/dgGn7dY9KlUBowon1DPgcAjkLq0SSyLIPsqorUJolMlUc686YIFIoE04iS47y27xAFpo6q8YbgmnPLnQ4RKT0rd2WVdKvbhBG8yoc60KhacQTgIgtMjwoFgEawEKrh8qHMlQM2FeINMMASsZVE4YhoamO2LAvmQHcAEdJGXDLAJhidtKiLXNaz6aGHrMT1pobUxJJrQ19MA0DRS4kdrb7XQVRlDaZEp9bktzoeP8cPcAx9SzqqK3ZMYKXDUCKg/KRwNfUc8BEOTUF7Clp5xJ3UBorkvx0KT1MAdNfThh7D0gtXwLeZbW3uku0B2e2l0NIgZmheRTpY1BIqONBQDHZ4WTuWpwedRVehbDxyr3TO5EClJFmAPaliQDSSw06mp1DSMvU46Wpze0SyQXE2u3pGxAJZ6hGIQFgTKT0NprkOdBiaIsa51USSKkDJBJSSC3iXI6iKs+oa0emWkjga54ECYTd9xpHd3t7iKrFo4XJ7etqFAlCWqDXDQBW9NJcWNtvNlFNL5B43Kr6FZGkuLUmNiECZUj1FTU8/hi2pW2OIubOW7hNg4bbd9ijvLa9rIZY4xG7Fda0C5imQ9QcTZSp6jYJ4x5L9wdDW+82STKrVEjXFs1GXUwGZVm1DnnwOCyCrge1nBtGieVmt1LyTKx0lQ3SWkfkFyGgE1GIGhPQQjuBZFkgas86QXktDRFNK6CKEih5fywIhOoN2jfUht5Ibed5mpERLNWNiF0M1QVNKkDhmMJk5BySSR2kUrWzgSPE4SUjtMaZiJhTIaahOOCBzqHCVFkjnikQNPK7NPLl25ORLNUaRwA5VwhyDWQk1ZYysvb1SH6lmBFCa1pRsxQ4Qk4Y8285kngiiMgFvRokJ0vKzFi6Np4Z1OfLBMD7h7sptYXRNqFvL3o5QRrjMZFVo4NdIauXHnxyiOSS7fvFpazVhHZVA0ciNKrx3CSAMrAuKKfnlywnUnVwTfbPK4HkEUlov3CxJHaXjszR669II6l0MFClgM+VOOIOkEvmE+2rzu3S4tzZ3KJCA9wNZ+plTQ8agFmPSWyY5cfTFdscltcqJ9Bu2ybrYN+hFGGQvbW4VWiVyw/UE3FhmF0tkTUUxQ6Wqy5XVtgnyC0N3sVhfpbvNd7Ler/qTHWiQ2t4GiK/bgsq9ZBrSg/HHn/PYO7H3Rseh8FyOzJ2+pG43ZraQzvojMbRimkESLkoQArkcsj/YRjxNE7OD2trQpNILebR4j4xtGyO4nNjbv96sCko11IVkkkcjW3cDUzVqU5DHv/H8V0ol9p8+8jy/mXbM7+ae7dxC/ag3Du2Q6ra4KkOxaKramCnRqABGqpNMjXPHapx0jiW5DexQ935/uW4dyO7SeOFdMlw8oEluxI1RrJUAkyrWuYOXE0xoriVdim2SSM3N3Ndws0V5H9zbwdxbOcakEeln1lkpVowMsqmoTLE9iHcR2RbZYwzytpWFXb7W4Z5IiYyr6ypWtS1Ao+ZriaRCw2NJ3FkNvFGs8duIh3JFZp1QhhMpCACQcKsCK5YIEJug2gC2KqI1BSIaDFJKpoWHdXuAoRUAnCIyvUCqW08TpLLqeJdVxdsmrWTVyQK16moWrUcDhNE5CJrkrC0VzHpmVTNbahSNuWomvPi+ZrwwkIaL/tJBE7yut2keqK4UmTWpNFkq3SoXLI1POuJwRZGdx+4lmjkYLOxJpp6qNUgMAAaAlcz6VxJFTZFLvsXFyElYQQlDHFLFl2ZgQ4GkU46iuXLFlZRTb2EdjuG3LyLYkDmRbe7e8vIJDRnMAX6+Wlm+kUpnh7slHbRkg3S5fcN3to5ZiINkaXcN4ZISgEaNqWIqykOFPMeuJPcqrotSu766S+v5Z2jTRdytMYNVYmoo0R0NSuRrT1xWaaqEKFlM6zyzTtantoy3Yoxt2YhRDIRk1QKlqfDFZBoRF2SUTEPLOSWSKJTrQ0o1QSekfUoPHAGwTIsLNAty8eiG3S3iljUyGRjWnqQhpVjxy5Yi2TVWxOguGuVyaBRIIrWMETJHJXoCg1yyBJJ+GINllVA3tpmjvLSwuToiYDcb8nQQ2rS0MLc2JFK8KHFFrN6dDXSsasc9su4brfXgjUJZbTZ9m3jiOp45XyJpQkkiuYH445nLstjr8LE18RLVRUEirpLGTXCulUdqfSxLE00DHNk6qch1x9EDrMpVACruxLa61cyDgwzAFBmcRGzpWNnWNS7EnU0hOkMwqQuWWGhSGho5oyqxuZIdSvaVFY+FQppnXngYwxi0pRRKywpmiJUSuWP1AHiRTKvLDEcckQsFSQjUFljABUaRkdVM6jifjhDCtXeVZGEZ0sB30GlWqBVgBmGp0j+eAWwbMkbNGsDsJNCNnpDRgAikmdQWGZyrhgDkncvoEqRLKqgxDKOOMZkMeKkkZgmvPDYBZkjGiWMvGJK6oiAwCrw00yoa1riI0gxR3Y4nLa3iKkDLOuWhag6CBXPhhgwPXI89sI3lLRfoTB0BkH5UYcTWhHqDgIzB0ieQyW6KXUyKrQr+mpjALCSo5tXP1wDk7IavM8w1I61ivVPTSlH6aZA8KfjzwDRwFmNuwmWNhqBt42ZihWhBZakCtacMMRzqchkkR2kJEk66SEpwAoTm1QDhAgUKmVQurVHE2hoEoBG+dHJrXQKZgZ4ACzJ2+/LHI8kEpEc8NSSpNCaaeQzp8MMQHvRuHiiLKmvQ0jZlgSNBIHpwrhAKv8xq0ERwPCgl7TA1k9atTgTyHywIBO7xBTCzMsZPfS2GZjcjNCvHTgY0ggunaMIlMVtI4VRIQwbVQhfTTlQE4EgkFIWMcSyPNLDrYyoCAQV/IHy4EcuWCRAFcXE5SOZpF7GkFqgKFoNVAciePwwDWgU7l4JI9Kkqo7YBrKxNKslRTMcaDhlggaZwyKZpSWcIgUXbR5L00Gih9fhgEejlWFSmRQSdtEJPb6gdOtmrpP8A44YAOEoiXMmtZHb9LWooFHAqVWmZ/KeHPAwAKJLdIyqrLGqmis1HDMPoGYpwqTTAPcEsdyWqQB3l1qDkCmRYqlMjTIYBHRINZZUYxuCzVrqVBUEqRQ6geR4YBASs05BkPZQqUDfQUBpVtXHqHH19cKBnkQkHvoGjtwyo1CK6jQ04aqtl8sAgKpH21fW0jx0jL56jQdIUUoRT0wxgf6CBmWUNq0vrA0lqZ8iCBX/xTAM48czRzyCNnKil0V/TcuCK5DIEDIHgRiLQSdVmlMUxuNBNRbhSDpRfqLLT/wB5z/vwQNMJjCRyTM8aRSR9BhB1KQ5otVBpUHnggiysGMqzSPExleJh3SzBNQ01qhByIHE4rqWtgZGYvD3VLvKhMQYBAoFKqTxLUNKgceGGCDtLpPI8WqG3osU4apAyyqDkCedcApBxqq9NAtygLuUYHpTgik5FTxpXAARBlHHrkeVAxOmMHPVU6yW+oHgBywCPMjRI8LkTKBqEa/1ATkA1a8uQwmTTFbLcITGsnSFEwag66ZVIOeXDDSA4Ioj2TCxFsFM8cbNrrXJhIDQHM4cCYMFSRHFL3ZStLgli6spyNA4Iw4IgqGKlCoRBp+7LEUVswNCnMj+zCGFmWKGRpJ4ygEhHfUFgoAqzIakAUwAHxPJ23aJQsaqDHERkQFObkEg/DAKDxmKR8OyLxQ6hmJaTUTUMQKgD8pwwgNmgmcy2/aSLuMJXKE8AB0azmScuAwSANZGYOgUWkspSWQNnVlJARSKkE5VGEM8ZBbzipRGu2DCB1qV1D6g2QI5fPjhAcDwoqs8jxnuMdAIq1AQCwNSAfWnzwxSdSVUT9VFlgl1uzIMyTT6iaVUH4UOAaOS0KRh42CKqiaVqqwJrpaMDMV9OeGIPTvRNCveftXEYRJySNX/vIGWY48cAjoMfaSN5BoJIuGTpAXVVWFPzepOAA5THK/3EYDi5jENpGQgKtw1ux46j6YGAGFVmRlmi/VgJE9jq1VIFNKDiSBmcIAcZMkrSpEmsLqmEjZyR+mrMioyI44BnVaMwt2z25Xj1wEH9QqOIFBkOeGEBhB0wE20c6RAaoZGpH3TxCAU4cczmcAg6t33f1u3IIE7WqOiLH6mOgoajjngA6k63LK7Ri4ZY+3amMaXAHEA1y+BwxBay6PuaAKs6sYqktUrk2pc868T6YQSDqIpLeOZwIoEVu6a5GnA+oHLmcCAPjl6XkWRQLY1MSgv+m+RauX9uEAIOvYZUlqZFNblKMCCSSsbkg1r/AGYBwDV0SOCYSuqSxskTRigWrfU1OfrTDEAdUWN2nZommAWMEmsrcOsjUMjn8uOGhB661d5JZu9NAvbjjarIwJoooTTI5gYYjkSBYoLZxINEuq2dFqyN9QJYGtKn+PwwITRo32l2b/W9i8khluYQl5KsQmpXt6VOhDybU2RqOeOtwVocTyP8wlguL7Y7+42UxGaK01gWGsNP9DKWt6k1AVT0ZU5csdZKUct20JRHdWu5pDc2jx3FhKiK1ACDFWhEqUVkkBNSGoajPE1sRUIMvyjyzvc92aS5bUZmZWlZxVIzqOmtfzgHKnywJC2Gcd2KUMGy0E20kSV7kUj/AFFFBKtnkrHE0h1ciWG5urO4EsSsYoe4WWUfpyBvrjdBSgXjnia3I21GySBttSHb7Yia2jdtz8fKmgjtZJC93brnQmCUNpDflbEkzPdSxXv7xq21bpJGzTWV5GRKI6lorhTHIXFaV1ICRwNcTIJDvcSAQi2hjkZLZmlGuTQg1FWonE0WmkLxp8MVwaBPLJDPPGxg+9MyrHE0IcBlJY5CqrHoOef1ccKBIUMJGsIRHHFMLB2FyGfSI5EpriJLZA01CgzNRhDDBC0EMty1qP8AT7ntsk7MapCKtEVU1p60yrywMmmgMi27G4TSsvc7c0WhaoqMdQB+k1IPrQ/hhDkU/bF3cvI95IkSGVpGRQxTp7WmJiTqFeoZgDC1ELUIYtLKRHFEDNDcOw7UQFNZqDyNMhzyJwKoIcljCi4l7QEjyAoYwwXWalQ5oe2GrWnDMDCY17BytVZWEU0MZSSAXEEDaWjZpSVZNIRdDU6q1pU4IhEpkVdiPt2cDalWMNRgGVoojTU0bqNLsACWPHkOOJJFbnoSja7a5luZIoZIiwJeNe2zIEHSA1KgMa5g/V864T0Eu5F6eFbXuljHaSPFKTPLJMWj+rPICSJuAbjqJz+GM2Vpo1400aNj2iHePHN62OzYX9/5NtkkLxtoieKUpqWgJFSHppqM/XHH5ON2parOzw8ipdW9pTvt9at5HuvjNmx7QkUXt1GK9IhhBcMFU6SsnTkcudaY8Xw+L3crtPacvlRxu7rsT7zTaPK9zgu57DbZ5o5p7ibuNAsJlkPcEQAfpLMFAGWfEY99x7VUHgM1GzMW7+0HmT3Fuv2shuLtkMRuDpfpShSUzDMBj0qc+fy6Hzaeph/p79UQ+f238rsu40+zPPUV3G1kgmKJbAUZ2jIZKhVBIBrpOr1pL5tX1FbFZbjXJ4Ze2RjW4srhoL25WlskcjoW0l0Khh+mwqrEg6eAJq2DuRDsYz3WyG2UtcrJRk+4gmSHtytEzhXQREZK1TXSa1PRlXE1Yi0xqG19xrme5jeB5Y3WK5Ylp4SCNES0BKAk5EfP44mRfoN91trrHNNdqZftlEm4FsmMUdT+n3KFjUULuc/WlcRgihM1rcB0ihthHPrEdwJAEQgKJDGxUtrIqX1A6MiMzXCZJ7DM807N9ta9yGW2FIri4iEtRJ9CdNRQ5aRWlDTLhiSRW2RuU6IriNWFtda1S5qe68aMfUAAjIZj6a14HDEyHXGmSSW1uEZ5HTSrZ1jcMepm1sGCpqZwOZHPEqpsr0GbcDHap3LedbiKSGihKQO8I4SKMyueRLZjhixKCECPwxpn3LyzyOb7a2Xb7QWTysNcpkYr9w6KR+oaKAFz4154VXrJLNrVVDtxZ7PYZpL5Lhdw8luJp0udbJ2dogdoqafSWQemWmowyNUtCHQxSd6WaHslC7d23qGLTUQRCNq56q1qeGZOKi21jtzGkEb24kMUYULdzKlVhfQr9tSlO6STky8MKGVTIkRpl/QMjwy3QC3UzEuX1fTTt51YHgPX54WpP2sT0tdvia9uJhYDQ6wo2UStF1DRkKkZdNMQtZLcupV20Q2SPNuD26t/8TtsuC8U90ylXvAp06nIFUXMlueKX8XuNFaKvtYZDLDBbXhtAsNtt8BktoNNFlViVXSDzBWorniq9kkXUo7NB3hYn/0++upu1KtzJlK+nWWoKJqzAIzBHA442aWd7Co0J8XVftS7tOpRirUowRhR9KuARSlFWn8MZINiOaTGis1sqlmUbcjQ6QBx0sBzAPAmlcDQNsGWjVIzb6X62jleZhXSKEkHMZEkD/hgEFtE6I0zBbdhQxyNmzKeAI9K/wDmcMcgnYEv9xP2nnNJW06tDLQihoeNAMv7sIQc4XUsaDVIYxFSRtSrkNMYPIHAMFAzkyzQtEDHRJJiNSD/AJQKiuoilf44BMKFxL2S6tLAUcyJIwLhhX6mPoDUZ1p/PDAHJoEErQRCjhjOkQooDZnV/wA3MZeuEwOJMe3IxmCgqIoUQBmIGQoWrw4EelcAwaqKSIiSW1VEZj0fpNnUqppWpHDDCTnbQr27ZX+4hZDHXpqTnpIGYA/nhCOyNbSQr2laNnkDyZghWNa6WGdW40PywwCwbYpMsUWqiqzAlgY6ClSB605YBh/emAaMssCqmh+2oV5FpWhJNcNCEVVEHcXW8kL6gVBAjPDMc8qVwmIPRX1hZXlibMRyCulxXqBpXjzzwDgJDRCE6Ai63CvA4qqqDXTU5kH0wxNAWid5ZALpnVqAyy9OocKDLq05DLlhDDIiCZY5oTFcxrSIurFaNUHInprUEmnHANBQPbkVm7jpIp0yLm5yoR6/CgwSD0OiOOOEW0wg/VNCwNRDThy6dVK8cALUMAkjimjZigkSnYGagnIFRnmdPEYQCfS7yiBpXVVUOxizDMi5KGANfQ/xwwAh1l1P2xK0dJE7AoNQbMU4ivAnLAKAKHUVVXSP7ptCoWNTJm1Q3AFaVBPLLCHIN1nl7MtydEfcKBQQO2KZMCoox9DTIZYYQARUlZmCx2/fVgtvmC7A11E5EjOtKYIEFEM/aElJWmfWZyDxrSpVs6io48cIAwSBGZvty2lzIdWoVNRWjAk1BFQOeGAWzLFLcxMwiWZBJIi9PbJz1xihAz/E4AgAHDvDpKtbaaRI5NCcyHo3AA50HDAIE7V7ZMrR6KG1Q11DTxbqJFMuGWADqnSZGjcK1deicEqqE1ahGdfUgYAOu7yOhiVlnVqRTLmrxH8rajx+Y+eAAEzPCYmmP+W6mV9VZFJNNL0JrQnIYRJAWEeprbqcyKn3FzkWULUgAr+UmuBggsBhL3ECzAglo+EgJBqCDTJef8sICsBbkQtASCWNIYzpop/Nq1UI5UzxUmWBmqORlasssklD1gHS6Gmp6AaVrwFOGGgZ4LCVKsXIlUO7uAWkNSKMnoD8fjhiBvGO3blj3gp7fSC6hQSTpGRLKTz/AAxKAOlo1k12Qp9wrN2ZFPalypqIGY4fxxEApZ2iMUoKtK1Wjhj6j1UFRXjQ8FwMAWgu8pWUTiAhRNqp1LTJxxrXgPTAhyLIyhlpJCJkYh0eEmqyHjqJOYPIDAIS1Zz2USk8OSMTRY+LZZAsKYcgKawvpukUqAmmC4iB0liMw6NkKGuXywCkLZozriVvs4WXS5I09yUAk0FfX5HAMPALxzVRgoRezAApppH9NqipzNfhgkZ2KRJu321aAEmOWZjV0UA6kJIqRxpXBIgnVKdTKrSJaOyszsAy6jT9KnEZcDgEK45KukZZeyFDO6qRI8kgIKuaigamdOGWADqMs0bwlj24m0h50AILcUVq01AUzrngCDpZYdGsosrJo1hKkLTmQaCvA4IGCR+2iRuoleYDvW2gmPt8VC+nqaYcACZLyUuREYTHIVDrmuvg1SSB8OFBgEdWSN/vHdWVk1Mr5ltBGQQigGfA4BQGibtp22CxOYwswZCECO3TTPi3A4AOyNmYOwJFhAa6aN2UlAekCi/lY1ywMAffDtGrALca6SOwKtGBnkVzzFc6ZYIAG0ixO9wYzJEsmm3UEZE0rUimoUwQAVDA6duOSb/MzHXrAo3b4KokWvH0HLDAMecLKjmCOFI5DHLKDqSVjx4DKgwgDGSRVKzF3tw1aqRVUIouinEE8uWAAK0CKY5FS7KmZZSlVWNeVTmtfTAAfCzrb20hCxxmRmhBBDBnzrXhpY8sBEFC6fbu5RZL6aYMatoCsOD6TkRX+eGNnEoSigzHQ6ySxaqMWaoJkIp0+mEwPKlv3miWQzRSnX3xVFXKlQchRVNKjnhQMMhaSRp2Z2DNUGMgF40BojOtTWpHL54AR1mhENmqSrHIjjSsZ7mbVBq30FTyI4YkAZMTNcTLHHFMI6uzqaZDJlQD09TgIh0b1igukKOsdBDRysiljpUt+GYqPngE4L+9lfJYtsn3Hxq8UWq7sUuYXFA/cXUsqMfiCCKHjjp8K62OTz8bfxE+9wNgfdrYX21TNDuVlN2rK9jcoWUnXokkUE9XBSefzx2aHEu4KctdzujfIscibRv92Y42SQ0tr1waFLsMKCSq/WOdPni5Ipcr3Fg2Hk9hdP2b1Zdh3S1mBVZ21W7agTIQxqOJIA+X4SaklV+o5yQGJ5JIR2TGqyRNI2UgbMANlQk5n1GDVEhlvtu/pyx24e4OgzQ62kIINWDVIBoyhgx48MTrqRtoJdt2y78gv4vHzJ9vuG5RPLs0iqSse4iojXPJUmVRq+Jz44k2kU2E1vo3PaLuwnh+0mmEm3TWgdWlE8IqwOrhR0r8RmDniSK7KGG+OXJl2+C4lpIjRh3snIEbywKQ6sQC2YBOXP4YgydbB4ECQqJHW2iKi4/TJEMhd1ETvJQAHP8AKWBNeGF2yT7h+0XYnuY1l03UhkjKSBYniFQ36rLQAhgTUrzw40Du0CIYQs0mc1rKIS8lww6k6ASgLkEByemopU1WmWDsCXGg4JZvIFkh1E26O0cy6FUITpVV1EsNVCVDENQ0rg7YCR3stolULKkXct3lS4txQIHnY6XCqtW069VWyHHPCgkSyx8ZuvuoImC3j3F1JLbQMoLuF1FliBCmTXUVKiigHnTEXBJSyU7T4JPd3qR2m3KrWUwBguEKuZncEqA7uGJANeYrlQDEbWRaqssXa/ae9uYViisTfNJL37aR7WVXRiQzlAxVQoqSqirE5jjnW8qW5asTLP8AHPYVbwRmSJrKJZme5cJ3WZlK/ouSTX1NKAfzxnyctV1NGLiOxf2wewe22yv99LC8zuswMehlOmtIm0qoAzqaVxzMvk/Q34/HLqT+19pvF4i8zRrFcT9FwUVymmtBpOqoPrXGW3kLM014FUV55J4pd+E3CbtZ2NubZbiMh4DIz25FNeodRIfLif5ZY3cfMsyhmXLheNyRP278Yk8S3f3bvvuobS12vc1t9o7tvHMILHcP89KsMQ6sg9NNK05UxysXGrXM31Z1svJdsC9hN5vcXabtLfabC23Pya7ikW3ihtLUKJpyCzaFpHp0gZjlwrjoLBGswcu2Yf4715ltnv8Axie3FzMWZ76MRmILQM8lGcg1p68qYg6tbMFlr1Em7XHiO12iC63LbduO4yCO7hvbtIFfQS2fc40pWn8cSr8xvqRdqPUorzXdvbVEuIbbdrKGQEfaGG4V0nKdc3ZnXUdGVGoOP89+Gl2pMl3Qo7ct+8IshPHOis28I5njVqh3ZW0NGKMIgwAo61JX0GNlcdjJbIiH3u7+G3E7arhbWZYo4biWQaaimhk7rAqaqKAKOkcScWqloK26sik1j4rdzxx2e/LbXsC6jcTsmkQBgRGkp0xDpNAWOrMZYl2srGm98Yi3CKRdnvLO4jhbtWK6Yg4CuX7VS6yMVOasMjX0GH2tELOCDb1se8xhpTaTdqrmO/aQOkMeQl7hH1VNcyRXEtiOpWO5TLM0jwhIu47iGNpGISSPJqLqYEsjaa1HHBD9SMMil3WO3e3jdZ0uI+23a0NGodg/3ADENqYLm3ryxP3EOpH96u47a0ubi6nM62lJJyQra4GQBdaAhWrwZfX54itENS2SLw3xm+3XZfGPD4bq12zf/Od1d7jcLksWiQqrsWdFPYCxLrDElT6jA5rWSLurZH6Dd53dJu2/3lzDJqtkmaz2m0ijZWNtErpbugBA/VdmY8K1rhtEKW1GIRx2q2JR1jSdu3O0cVJozHpaWTQWyDEhc+NCOVTBocuRnnWOCJ3vHRI2Al78kpjESxArF2cyTqAz+GE7KNSSrZvRDHJvEl+scezQidIGXRPONCQqQXpFwZtNM6/hit2b2NFcaW41RPbtKbu9mbcJ1kaWUTr+kqmorGh4sRQgVxW6epen6aCyI31zdQSMyxwyxrJcTk/pGoKRBqk1LcDSnLELuEWVSYxXu42UcIs0X7mQM0YtQSIwRUtVjTMEVrwoaYy5ciNePG05LM8etETaNuNs2mGW3VpowQBGWAYOQwqSSKVxyMr1O3hWg4q7IHnZiyuymeYIa1J/TYZ5/EnLkcUsuDWKmJ7vvfciQ6VNcnB4sCDShrX54jIBogVAD2lbvJRbYmldH0kjOuAAvo0iS5kaWSRSoRvojHrlUZZ/PDEGRyt2liRKIg0aJNJBU50jH1D58zgAJiqksjWb0gDAOxqWReKn4fP0wg3FUz6nRukI46UiIQHuGokByoTww2gPBpADHc92HSS9I6dqgHUoAPGuEM8JG0tNHEHj1DVGKktG1RRhnlXMUwB0BIkWh5o43kVNKw29Sq6qUEimnV8a4YQB7clw9zIziKQKqyHVUVpTgdVBQccAwZkZJIg0glXIXDABO8wNAynmRlzwhHGWRRFqjjjkZ/8AMQogDKAaksMxXmM8MSZ5e2xkEU5TXpltpQhUg51B6Tm9dNDhDCoY6xwntmOKUkszUZ42yyy5Vp+GGApZ3aUyALPGFWGXtg6GeQABgtM6czgEEduRFMcMZjmtpSs2nhp01IA9acxxw4HIASxFXVLdbooQyI9AUUjNSDx/jggEAbRcxoiKkUUTBCAuWp8zxPHmOWAbBPFLLEZFZngjOmQ1rIaHOgIBIOEGwCV4jIqoGRIK6ilFBagogzOk0NDTnXAJg0ZpiWiYSG41xX0UgoWYE1coSAtRkD/LCGj3SzExF48iLeOQ1PbYfqFiDlw5DAMSxIRHlqaAs0DLGRXScg/cqKZj6aYZEMWNDJJCbt7WUALNoKya1IrUqwypwBrgALkEsvQ7iUmJTLMBoWPt1K9KtpFQM6YUDAvKGMk+UjWlDrAqgNP6arUEgcc8SFJ6eBUUROrf5h1mSY1kVy9CEBr+P9mEAAnutJJ1SzITMilaEDg2pq0BAGWWWAAVUkDTLPFKEJV0JpRciSeOojhgFIFZoZDLI5KxRjRbwuA2qvTqIqMvX0wDB1eeRJaBY7cfpa6FWJapGqoFM/5YTDYLgDSTTL3EYpkZH6U0cVIC8MuJ9MMiedi5EjrGJog9LgkhY0HCueVeXrgGFMEMSCaWQSuWEa5ltWdBE3A051woGeib9cvITomGcoydOIOfAnlSuAALAqZbiAQ2yWoKRqoIAT/ERxIb1rx4YByBeJB22zMcY73c1dRrwVl9eWGIrLIyIR1GX9O4SVj+oKg6yxGVPhnimqktZ6VkkU2zEyM7hL2Y011GQOoHPLliQCo6nlqI1jkTSiRMxHSeLVrxpgSEwtu0rP2UdYlAZpSSSoAzJzIYN6+pOBsaQCKUzMJetv1NLIcxCAMq0oPwGEmDQZqFTE6rE9SqOqaqgZhiadNBgEdk0BtccGmO5orCYBlRvzMaUJPx5YYIMKfbN+mwd5f/AGcZBag+mQ1NDUVoOWAkJUDW7dwBljUM33JBohkpRVHFmqczwphCDRFdRoxES3BT9W6t2JEbDMl0X1qeA/vwAHyIIow6R6g8ZMOqq1dj1Eg59A/4YIFICNYzFHMqyMxZ5IzEpZyKBe4TkVpzwDPd4tok+mSQhZp34FaAkatNGVvXLAmKAxrdQVL6YZonVrR4WHRGefxAxKAk8WjUWzLeIsoclbhlLZnLr48hxwgDhGpVbdp2VLhg4iRhpKgGrA0AHLjgkAQWVI0gmcrOZAYUl/8AaDlRqVNKZ4EAbqU5xy6bu3aupWJyJpU1FDT0wxM9MVdtEDMIwhbWzfVQ5jP1z+eBgHIWljjMLB4pj25KEagEFaAUzBGdcJsD2tpiAg+5ZVESTs2TEZkhh6CoA/vwCQarhZAsVyHT6oh0lhNWgDPxC5UxIGzpEtJwg714/VLUggDmVK51A5cSMIAlEiMfeqF0FTHQFu3WhqwNOPIYYCxoZU7cgMUaIjAzagxAbIMR6GvAYBBVo2kESRMsCqChOQUrk7gEU58P4YQwUKGYhDEFVwyrbIaBa1KsRXLhWvrgCQ2Jmjj7VVMoIaUyAhSqgAKGyzI4j+GGJnpDooVl7cRkpaaSekGlCpAPHhnwwgQeBJJHrkkQLGtHh0FmYg8nyr8ThgEyKWKN0yXM7EJOzk1XjpWpyWtBnw44QB0vdURtbxg207f5eAE9Mi/1KvxKs9KgYQA1Vi/c7jVmKtBcfmBORUgipB4EngMMECcqgjW4hUOkWUAqIpQTxT/CK509cAMMBePSDIkjwSCbsKuZrkCTgRGDkr6biZA6QqxCq7jW0Z1cGWlWbP8AAYEOGL47i5tJFlt5kjlsWSe3l4sLgdQbVSuk0GYxdju6sry41asGm/C/I33jb4r3c+Fxph3q10B+3cV65CrZmpSoyx6Pj376po8vysXbYF7he2txcg7vtG1X242G5IzmTb4zLIGhqsc8aoGZdX0tXIHGqrS3MrlL4SpNssd9EsmxTP37y5DNDtW4gwzgLVTrRwNLUTKnPF1ddmQ6SyQQSeQ+OwvG0Ev2RkDx21wrXFrqORAfP6f/AFYlEaNDTJXHv0N48Sbjs0cdxeLVvsbgsarQVC5E6M/XEYIuzY/Wm2y3s24HaL6OGa2jF9t8tykiwzSW1HXSyhXZiwppyGHAn7j3lmypbXu0+Z2Uc0e3+S9m139plVBbbzEilphyCOwZQaivDhiVEVW/Er57Vtt37dtngtzu0F7cC+2iFaF5e6oqUdmVAo5gVIGZoCDibrqC2Jja7ZcXc8awWiS3by9qz21TGJgwVtRt1UkklelmNVy6QCcEIHaCX2fityFjnd7fb4QWgEEsgvJAFIIheO1SQBdVdQZ+QGBR6kbWfRfoSyDxnarU3X3H3twtlJG8yzy2tgqhAqOjw3LSSkrUU6eQI5YHVCrksvQkEVjZdsiDbdrupklVbW+u7+N7jpBADgqgYUyJ51OWI9ie0knmjcW2e7W9ut5ezvtFukyOl9ayONUzHVkBRQqkNmK0IApgeL2MP6hIWN5ZbWiaWnsZUnt5lt7syxRxRiuoKXyJC1yoM/54a47fQX9bVdRdH7n3dlHb28O77Tsj26LJUyQyKsgUxq0YUVOqMnVlkeHrhf0baka5ykkX/wAOJ47a0a58ntZIwVjtJ2uFVoUiqSql9FNVKDUOXPnX/wAe30NOLya2LQ8V97d2vJwfH/Gt630oggjEOySlSpArIbkxhXJJr9eMfI8fSq+KyX2nR4/Mu/5dSfXXvF7m7dJG28+OW/jtuVZdsS9sWWSYkZAyCRYkzFSTjBXx+C2zn7TTl5udLREIv/eX323R3tfH9uE06zFFtLC2E7NUdwlGLEsCorUcOGNP/G8dKXova4M39dnb3CT7ge495d20G/S3a27ost5Ybxt32kjCUlFkMlToCMaEUrTPgcSrxsFV8DU+xk6587/mTHbyTc/Ldhvd28b2qzv76Pcdw2/eL8bbZzTyMItujiWOCQRGKglUlgc+Hxrm4+LE7q9ml/1NPLvl7e2hGrLZ/dPeLbctwvN68k8LtyZZbiXc1ns7aGJzXuiKOOpBYdRplzNMbcmXip/DD+05tcPIt/NKG1dj9tK2tr5N+42zFxGhfcVtg7gmOtc7maoUD1XLicUfPs18GL7zR/Tx/NZnJvEvZV1Sa19zPIbm73QvH2rW/stvjeFk7jiJEjlYk0HD5k0OLFfP/cX4i7MS/tMTT+1vsHILmBvP/JbgRzrCIzu1ikqlCDKwEnbK6s0ZCch6YfzeR/dX4kX8p72EE3sl7By/d26ee+YwJcIFcxbjtciSoh6Y0pP1BiDy+GWGs/K/+WvxE6YP7wxyex/sdcQiZfdDzKFomjWONk26Z0kJD6m0yOoNOQ/ni35vKf8A8NfiVNceu13+Ax3/ALNey6xt2feTy9dei4l1bVZz26So1dTKGNT/AB4Ydb8idca+/wDgRfyelvyI9uXtL7cC5H2Xv1frBKsaQy33j6CMaixYfpsraqmtRi6t8r3xsqdcf94iz+3VtZLuQ2b9we0PchibV73bZITMq0KLM9TpXKlKNi5S1rQp7ktn+Iy7p49ez29yJfPfbXyFoERoUu7e8tZ45DmwQ26DU5JrU4l2ewqeSy3ggm4+EbHN2ZoV8bdrdnS4TYfI5xJRAWdVg3K0kXrLaszQUpliLxtPRAshn73D2yDZ7PbpXnivNu8ikSNnimtZrmBhIur7lLd3UawFyFBWpoMU3URJfh1mCb+M+SW0ey+V+XGJUSy29PCvAktZCCRKum8kkjk1HtmEkj/CTTLEtWp6GS1GnpuVZdbptltHMkdveS9hFt7TbY6alVOovU0DKrdNacflhPJBPHhdiN317vPceNbaHaYr6dIra4kcyTXSnNwG9OkAZUzOKnazL1StRG+3W8KQ7lcXa3jglGnvyWMTElUUIpY6VC0V+BNcR7UtWXJt6JDJuW+2jyLbtPLOURY1UxFUCDPUpXTrYE8gPjiq+etS/Hx7WEl5vk8MFvuFxtcM6zFBa3UjM47aHSNSUqCTwyHPFTzaaIurgTcN7DWbzeL+Yd83H3Nn3ZDFbAPp7jhkVtJIKqRwplyxndnY0VpWqHnb/FpJoI/9YmS2iADGNaV1sO4jSniBxrX5Yi8fUl8yNiz7Ex9naFt1kH6KpGtG0z8TRaDIL8eP4Y5WeO7Q62Ge1DqHEUmmI1ilCllZDIIWb8h48wRQYoLgA+3jCR9tTFcsPuND6qHkCtKqG54NgOlw7JdADWx7KsDVFUVFGqRQc8sCGw3tyoE0yd5lpFdqilQS3ACoOVBxrgkEGAa4bpI07hkKrMzsD21GQzyPLhXDGBUzNBGsaywQhKSFgELOpqVL868sBEN0TM8k8YjkDRgu0bI2kehUHIgcsA0JIwZVjZzoAUSWy68ldcq0NAKjPjUnCAPt3uJFC6xBcSFpJNSFqKDXS9CQa8vTDAGqCYsI5Y1gIMkDKCB3vzEg50HrhhJwFLd5YWcvbUPZWTSRI7EVo6g/Gn8MJjBLEIm7bXS6UJa3JGo6OBGkgUJOABOCqLO1xFGz3NH0SZ0jUgcR+WgGQzwCBokpkyIvHSQMGFRHIDwU1BNF5E4Ag7oUyOAFgYhpYIy1f1BkWz0j1GAYWXWH7eaGMkxqQrgCjSOevUDx+YwyMHmjIkEJlhkW3IlZRzY0OeEAfGF7n+X0UkOtZnPUzA/SFPDL/wA8CYBbEpIkcWuGeUHXHItSmdKMKnVwOkjlgHIVpjWSSOEhFiT9csQzhDTIVJr/AHcMCBs5EiVZowywQsXt7dhpqTmGZTlpwwDJCv3bSa0labqilRKIgyVGCmuedAv5q8MIAh1QtcqsiiI9UpK1Jcflyp9XPl+GEMAI+69IoY42aMG6jKFTRMgqmozpxphgeMkjRMy9osgqsC1YlM9FD0sfl8K4AAAx6IRGkqaz2+3JpWOpoS5ZeVSePHhgBnEXsPLAI3hkZhDEgFWC0JQA50yBJr+GGROieVIk7czR2WpFltAK6CpajAjgSc/XCACiyRM7KjTMf1ZDWjBh0nU3wBpwwxnjV2dGhjeV9AikGQZwSWU6a00jmBhAdWR3laSNCToaMu9I1Df4aDgTgAJZFETIFKkkKFJ1aPhTV+Y8MvXAEHnoZnWMx3EvbCSyREKADkcjWppxwCYY6pO09pb6Vj0AdlfzmKhouQK0HHCAT93tQWrrIyzooFXXWkQLEenrn8zhkkGuquDC+iLQxBRXAQk56n5Zj0wABnLmiIApmQRR6wOhQ2nVzB9BngALWEWopq1TTniVqjIta6RxHHicIRW7VVUMgDwpJ+mAeJIoARU1+JxUixsCDISWCBnjYa7VBQMgNcyBnp9cAAXkQoJxOYtRoxCHuBTzaoyriUgdlOuUBAW7VBcTcFMZ6hpX+2ozwgR1QZZhIzSJE7EQxoBooQOluOnTTAAcI5oEFtpH6qEiNqlFNeOvia8MAxOocXCwKD3ouqECrKoGVCxqCScicAMO7siqElkJikm/6qMBjHqqD3AMqA5AcK4ADZ6hyJZjEkHbYSVr2ujitTmGOXw4HAAFSFkadVcozFVm1FdMqZnSoNT64YSdq4eqRIyUP2+ohi0efTShoH5k/wAsIQZUIqiOMju1NwRLqMR5AVpka58BTAEgdBlR7gNIwhBSbpAZlUnQoBIGkHIUrUYAkMiSBZVnkkBkkVg7x1bVI5zjCtWgp/5YYB0gWEGVhEba6bRGqioIUUBFMwajqrzwgEulQ8Zb9GNwY3VwOpjSoNK5V9OeABc2pJgCGk7lVWKRS0jCg1AUI4UGGI5C2brMiskFYklmBVkNaCo/MfTA2M6KdqBNAeQdwIDkGz5VrX8MAkBShM36bqKoZIqVjUkVDgVqtDXCAFAjxK85EulFINqqkmRDxcinAnOtMCAOSKOHS12SizBSUWutwD0gkZ5c/XEkDDk7btcPJIECMEdlJDoTQZ04kg8cBE7GZZAuk9uOfUkwA1EFPpDAD0wDQTbQxzM6RCUoqnU1WI1ISW+Q9Bzwxh9BO1Z0btvCQC40kleZBAox5DCIgIRK/cGrQF/TSBlNash0JUcQBhgHQAyx9tD3Iy9ADXWroDUV4UHx44ADFHduHWHJlJ7cpyKvyArkBlmcIZwrDKnc61kC1QmtCIzxoOdSaV44YpBRhXUSPKTKvWeBZF4AimWfAj1wg3DglXSdVaKPSe9pfONFObaTT6vlhIYIpaaXkd11MQyKpoIwcg7ACtKcQMSgIDnKIioXWaed/wBIONUdMtMlQaoDyBwmKABkieSOQq7u6nsxrUMSCBqkyBFSMuVMA9geqViHmDTxqwEooNfefKmoniBxPxw1oDAPIGXvGNjUdvvyg11I2QcrxrwU0oMSSkhZpF0+O7Tf+Jbxtli87mPeLJb3b7q4P6LySqVNuzD/AAt6iueO9wbRozgc2HqbI9rvd9/bncltUs3SO/iEU2z3UnZDKAHMtvIxIANTQZg5U+HUycZ5FpucmudY38SNhx+Sexfu8u22/lllZS3ul7Mw7vElrco36ixJHdCuYDcQ/HljlWw58DbR0MfIwZtHoQ3cP2d2EUe5XPtt5+21m4Rvttu3MDcrQVI+qWPNeeZB/niVfK2r/OmTfjq3/kZVW5/tY91baKAp4btPl8yUWS5sr6JTJydgkqRaV9ATjQvJYbPW0FF/HZarYjFv7C75sk5fdPC/IdjWCYx/eWxkuCC4bUFidWUJpPFWHDGpcnFba0mb5ORb1f3DL5L7by7htO5eNf627WUkQl2//U9m3Fp7GUvkQo1rLn0VHrUcMWVzL1KXivMwUNu3tr7qu9rBZ+DbpfpFZJBuO87JtVzOZIRpUpFIUhdCFX6TWp+qoxf8/H/eS+1EK471nR/cP/i/tx7g7MIUl9tfJprncW7rtd7DeSCxFG1LSN1WSo+oczli+mbjpa3r96MebHyLvStvsT/cTuPYPeJZ7m02/wAIl2i3iLvE8vhzRxUYVClupj05kA8SBxw1l4rf+pX70VPByf7ln9j/AHDXN4p7r3l0tor3liGTvNcHxO6gKEmrRd0xk8Tp48BjRXLxo/1a/ev3lL4/I/8Al2+5jdD7d+7e6FlubmdXLhoBLs9zEAqEZ6NHSMzWgP41xb/V8VL/AFK/eim3F5DemO33MRye1vufcxzXcl/c2z2khjh22HxW6uGnJopZFW1VWFPzM1T88N87jJqMi+9EHwOTMfJs/sYXfe1PnW3RS3HkUm8yWqWiT/ef9vXjaWly7XZMTMCBmSOFQMWY+Zxrf/Eq370Zc3D5Nf8A4Nl9jK+uPF47a1e/3C53KGCFTDDHPs17Hq0/nVe2NOZ41xrrm4/95feZLYuUtqW+4UbVf+1FvfxX17uu5X+7wlZ5uxZrDMJQKnou3GrqFS9aDjiORVvonoTxV5NXoo95fu3fun3PYbQSbV5b5SlooZLI7xfWD2bBMgpS3F1O4yIoOfMY4/I8Tgt/NH3a/odzi8/lYnEL7JX7kXZ4r+7j3A8rk27bbP2xX3KspUFu1rttpuVm8zGMFmAmV0Gk5Ny9McHkeKwYpdcjqeo43k810las/iTC82fyDdbyLyT299mfc/2w8uuyIHu7SWA7e0cjAOtxb306lEYrmVpTjijHlpT4cuStq+3clkw2vbupRp+wt3Ztr9/2uIrHfvErK8tbiMDdr3cru3dWjbJVa2jaSpU5hVOfCvCma+biLWjg3Y8XJiLonMll5vf7RtFv4F5VY7LcwrevvOz7rA93LqDPoNI2DppoBRuWWeMbtjVn3KUaX81L4SnJ9g/dvOLVrLfvHZ0lC/flhHGskhuFKPbiWM0DRj9RHrpNczWg0rNw67mb5XJs9hXf+B/uXvHjtLm88e3ew3ASLfGUWUN3oLKFDzQ2SGLUTQaA9QOoitMSx83jVcy017yN+FnaiEUZvf7YffzeI72a+2HbLzcNwq0+ncLa2CzVqDEsFqkSgj6tFNVOrHVx+Z41UlP5/wDU5mXxGez0RDLn9m/vbO8Dy+AbNOYW/wA1M+8wq4c/mRvt8hQioAOderF3/O8ZPf8AP9xSvB8nqn+H7yPy/sn9/buGUye3Oxw3Ff05RvUXUpIyC6ABlzOeJ/8AP8X+9+f7iX/CclPZ/h+8SSfsS9+Li4gK+IbdYRkq0zRb+DoYZqR+lUkVH41zwv8An+L6/mP/AIfkro/wEh/2+/fKRGb/AEqyAH6JWff5AHJLDWEigrp4UBwv/cHGXX8GP/heS+j/AA/eMd5/t4+/Nva3Mw2za7q4t+qNbTep2Zn1UCossVGNTmSQABiVfPcSz1f4Mjbw3Jqtn+BUvkH7SPdnx1pG3rat5tYo4g91ILOW7iBbMKJYyA38MueN2PnYMn8t/wATn5MGbHo8ZXe5+zXk22yu097dRsireMrbfPG4KghCRQAjlUHLGqt8dl/MZbXyJR2EYvfGr20tW+6vXgvm/UEbxsqSP+XTJ3BU551GWJNY/wC8SpfJ0pBEZPbrzXz7c9s2vxHZL3dLq97t1d3Wj7YxmNAC8k7JGVRQtKOaHlmccLmVd7fC5R2+LlrWr79B93zw/wBybY2Pjm5PtGxLs6GPb7eS+EsYndA08yMgbU0mnS1Gp8sJq1loUd2NOdWRq08U3buyDcfIYrOWSMKYoLSWQEZlYOpwCvWcxU4j8q3Vk/n1jRHJvHrJdVvcblvD38eo3VsI4oI2QjSSUWtO2BT44HiS3ZH5rfoMcy7NZRGew2+N7hopII5ry4YySI/SynUxAVQOmig4qsktTRVt7jOL77nY7zxK72druWa7jk2K/iiRLlHnNZNciE0VtI0rpr60xRPdoaHXtiyY4w+IzwQH/uO9lsdtrGEUGryRHpMr11UKgkDIcMRstNSStOwdHe2e1C2ttvSKyaSRdFyq6pggINZAa0DcSBnit2RKidtxtjujc3CrdMZrafuPKzsY4mlaoQqOLKK/LFTZf2xsTjY2Y7ZZSXEMyrExEV00h+mhBMVOIyz50xy8utjq4v5R8EcyQSXIVTGpUrcSVLOnrQZinEVxVsX7gkRSl6sp/TanW5VG7hzXVSpIPAYBADJqjQlVkigAMkko9Bpyp6YQQKBE6xNqDaXKpA0ZoxL/AJjwoFp+OEB2RiI0JRdKqYiUyck8WRaAmo4E8MSFIW5Es6qVBWRSscbsaBRwOfM/LABxZv1KRgB26EljHMnTQrQ1pzOGhhpJaFnlhiuTEwZmBqMhTUQRm3HPCFB52dAnbhMKTyhpo41qz6vo1MKAUPHAB542hk+3LMWkkE00MQosY00JDcKcqemGM6lEckx6rTV3FtnoF6aA6Avr64UAdhJEjmS2SR27jJKpOYAoRIxrU58a4AYkt2pHbxoXieMsiahriDcW1OKczlnngAUKTp7YaWeRRoaOmhijHpFDQk6uHwwpA86MxhgBKyIyhWC/QGJJVK8/WuADqA6iYY+5cwh+ysZAQsa1GdKetcMGFPEEcSCESoTqjgRjqLKeqpyyHpggQCaSaSaOKaYJIAaRKD22Kmo0jiCPngJADLL0zyzOWpokcjMH6c605U/EfHCFB5ljrEGLSTxoUaNaU0gihNaajnQ/HDQHF7jSyWxcOkhV4kIyI/woxB1Z5YBoCQvfIVZSAxVOypNCQekMKgChNT6n4YABQl5QI4aTTUZViqFjmIUkyF2JYGPJac8JDCJVkW1eJA8UVdS6sm1k9RJyKggZZZ4kINUhmTvR9hRDQ6DSQE1JYHIHgBxwgC4+3oIR55WYUW20IC1KHQSOAFa19cDCDlS0ZK0cpcCkv5nNcxnzBFMAjzxJWEqgLo5N1anpGpmJ1aqEZHnXLADPMFleBkR5QrNrWT6ZfxGVBhpgwDCB4Y1lKxdgtppUDQSfpYUOquVTgFAEq4czREqEjXsxSHU0uWRStAD88JhsDSsTh4lDWrIAkmqjpqqakVNcxl+OeESChGrLpuo2kZWoY0bPU3+I1pQjlhiBBl7YuNYdtYVpBVgBXJaLzwDAsojjfWx7LmUwqc3YkghhQHNTxrgYIFausghjZ1kTSdVtmZF0jVQjOtK1NDhAASjRZRtJaiQSO75BCeYXiacxhgErFGYu/Xss5Yi71ZM54oFbgCDQVwMRWhkYIxQpJpq4cUqWYU0rQ5EAVOKkWwDtWLRSMOtrcMGmNVKgCoZjkFJOXyw1qDQCCSN6RlnkVQXEWRlagzDV4mvD4YGAashNyulIoZZelVUDSQx4UJqCDWuIgBnCCJ/uH6ImZY1BNC6kVKnka5YYAYpzpRnl6mUxfbE/Q5pVszmAMA2CQPby3FuFRSrGBYCaal011VOYplnyw0RFMStHAyzamt2UAv8AWxVfyvXiD6jPAARJGXWERhwyHVrI1LV6FdNRUU454Qw5pNEyzQkxxQgrM5BA7uYJYc1Y8KYZEEFhE00U2jQyJHRkIKlwAc8vqGWWEMAf13ZhWBs41QIFjZE4VNOIrTjhg9g1X1y2MSDu6T+pHQhdXAFeZ0054BBslFa6eZ2hq1FtSaE0bJk4UpnngGAMYMZMkGiXpV4FOpAfqRWLHPjXLngAURB0WZZmErMC32+gGRpGXIJzIAqaD+/CAA8VYbcGZ1kqaS1JYvUZEgilP44GAe+uSeSKW4Wa4EiEsyoU1jmlK0p8fngQkdllM3fLlA0carHCBUhqElYyADU+gwwaAq6lljWJA9yFpa/UxWvEhz9XIZ/HAMEGchgXPQViVUcsXAPTqqxHSeNcq4QHZBFGhhVtEsBLT3UtS1DStNPGvAYkiMhulY1vUVo3BZf1B0tkKipH4YABRsRMjrJJBHO5ludJJUAKQKsPXM4BAR2ZYARNOO+G7EK6dQMY/OQerIcfjhjBtPJNbwzTZyMynVqLLRARVx+OWEEByVDzyRSBA5YdVfqYdJyyIHrgIgZFhuIAXcEu6rMGqGyzqrLx4Hjxw5GkGxJAsUk1wvetnl0CtAzrTNDXMnIHAADupNJI0jaUjXW6CppX6OOerLgcIEg5j3Y0MhVCjBV7NagrmC1M+PHCBA6OSjTSLIz0RxFRAQMqlqCoI44cEjy/pGSB4++VVu4HfTVcgiq1QDX0P4YBMCqxxhGWJVlALAhSy0zBahyqOFTxwAGSFGnDJIf10EZRlOvM9Opc/mK0GBCkNRKw3GkrNABoketdTKKNShIBA+ojEg3Do5XR0UlLaJJIjLq6yYkNSQKk0rx+OJ01ZC6lG4bbavF/I7O0s9+iTctk3KGOk1s/bayZtP68bKSWYLyqPTHTxZIOPlpDHzfvYP3N2O2e48KSL3w9u7W3Ehlsand7NDmFa1LAvpAqTETjoYuYqwm4Obn4fdLS+4o20833O3vprfabiXvWkq3EmxbzC0bGVdTHN4+4gCggBuJoPl1seWrWrTOTk41q9Gvai0fEvfryLwiTuXu4b94hIJibiKLVc2jSMwEOrOoUktU8qDlgzY8N1FqfaGO+ej+C8+w0R4t+77zm9ja3Tyfat6WNo07Fw0MNzIW1MAI7hYWJbgKYxX8TgtqoNa8jyaFnWP7xPNo7MWq+E29+7VDG3lR1VBUE6o3IJNM8Zb+Eq3KZsp5iyXxQSSz/AHhFLoDevCd3sE7Cs0/aBkcqwBaL6hpFaccU38Q0olk15SrcwiyLH95ntH2P88PJdtkiyuFezuJNHqT2mOQrjnZfD5Z0Onh8rjqo29xJbb93vsVcQm4Hlu628QUFmn27cAFqQAT+meJOM78Vn9DR/wAvh9X9wtb92PsIkcc0vuKbSJwf1Li13CNa8My0NBiH/HZl/ZLF5PE+o5Wn7lPZfcY459v9xLe9jllEavE9yRqPI9IA4jjh/wDG5F0Jf8ljXUBL+5X2bWRki87W4kQM0kUS3btVKVVQF4rUVwLxuV9CNvJ4lrIy3f7pfbdbfu7evk+85qoFpt14ql3XUi9yUIKsP4c8WLxOWddCt+Vx+rYz/wDzy25XbsNl9rfJJrdZu1JebhdW1oimhFSC8jfUAMs88XU8RL1sU38ouiEZ96Pc7c0RWtvDPC0uWKJPvM97uMkY01DGOJYAdRoMjxxf/wAXjrrNn7jLfyF30RWflFjsXuHF2fc/3P8AC922+WM9vb7HxiC1mjaUFGaK8lmubhCQaEqFIxs49b8dzjVvvM2Wyzr42vsAeKWf7Uvbx1ewsNhutxhdEj3Lc7aXcrpgiVIEl2HoqjPLhiHJvy8zmWSwYeNi3SLEj/dP7KbTGZF8nq7qY/t7SxkiUKKrmoVQFHM/DGJ8DNfR/iba8vFj/lSQguf3e+0Vqqm3vNyu2L0jkMAVSObdeYA9Thrw+Zln/KYx0s/3T+ym63Eaz+VyePXNxB3TfXcLQDTG4qVkIotK1zFTyxRbx2anQsr5HHdwir296rHwqGe2sP8ATr+2Xdbu9td9+4a1mvrW8ZpllYOFLhWYkGppTlUY6v8Ax3zNdjlf8mq2aWpEpP3qXiF4Lbw+18l3K+kJsZbOxnaOeMMAxjNaylVIBYZE/LAvCVeswN+atXQabj97PmO3oEuvay3F9I8nbiuIZYgiqdAJMQeg1VGfPB/w1elg/wCYb3Gpf33eYPDDT2s2GZ1RZu2J52MaFmEjSVhVYiAB0sdVDU4P+Eq+ov8Al36jtt379brtWk+5e123RxXDBpWsrhJ1cZ5IzBdRr6YhbwaWzZbXzDHm0/3BvE0DDc/B1tJzVYI9UIIZVJK5NSvKmK34S3SS1ebQ7w/7hPt8trquti+3u0IVLVg7GrVHUyKyrT54T8HYf/NJ7C6H/cK9se7K7bX2YXIW2ilLRzByATqUqS1K/l4Z14Yh/wAHd9R/8xIvs/3/AHtw6xyyW8c6XKyxwRQ3EBk+4QaggoVyK/4sD8Jb1EvMewVp+/L21urSGJQqz3EXc7y3CtbgMPpchumjZHL5Ya8LZOZY7eVq+gw3X77vZ9VthPBIbuSUJeSPFG3bUAAzFTU6SPpqeFMXrxWVbWf3ma3Po96r7hrb97P7cju2z39/sHf2u1jnruTbfbzdmUxt2xFDn9ZFCcqVxHJ4zkxpb8S3Bz8E61X3GRff390e1e4XmF7vvj1rLuPgCbNHse0bfJD9rcnUrTPdXYWrKXdyFC/SoGeNvj+I+NT4nqc/yXJXIyRTRbIxLf8Al8Mk8zWuvcLdUt41spAB9sF+kA16mf8ANXnjc8iMKw29xEb3zOe6faUhso5WtdP+n2NESSXTIW1yGMAl2NQNVafhil5IZfj48bkbu9w3G+YNdym1DsZ5NxuXkjqJSP1D2y5bPkg5VOIOz9hpWJLYcfEvG9u8qlvNuu9+ewitF74t4oTKb9wwDhGcrpyzOeeKd2StFOhY13N4/wCO28cGzoLKhWJ9ZL3DmP6dRV+jI0J+eBuNiMNlXbnvl5vVws0kZrPNrdI0PUyHp1A5E6RUECmM9rNs10xqBmkhJbsCVZhKf04STG6M9KgkgGppmfTFbRamkh9j26/u5YduiC9y3X/MTk9SoAdUQr+U0qBxOKctoLcNU9SfxRQSoILJXEVlQ2sIoaAVBappQY52RydHGoQtijqUmMhVI6FYS31gDMgAkfEVxAsBpKCyPMrNA6lLO4XJ46kUNaUbV8fwwgAwuGSRaO0CFhLOle4ErUZg0JrWnw4YQBmisIaeUqssydtlNWYEf+yAryoGqPliSANDQtK0cgcleiFZRV2j/wAVeAPz54GJoTMGLXEMsi0DqNQFRoHoBwzOEC1FDylJ41AQl6t9qgOgqBWjNlQkDPDRKDgCMVCTKkAIEUTfSlRWjHIinzw5A8uhRbQrqe3dnDQ0XUxzo9SBlXhhCApHpjiSKUW1yJu4hrQsT/jFSoGGAYzNGsbTFbmMO7rIdVFNeqhOdOPwwhHZey0ZjtnkuIJ+rUx+g0FBpUBedAPxwDBS92F4wrqstCiRj6a0pkOFfngYHHWIyyxs8mliGFwn1Rs2VTXl6YSCAuQTEugD92NS08JIDGvDTq4NzwSOAbCPuRUYqyJqnuIWaojpRQBnmSM8MUCeISSdx3DRppYMxJILDgCeZPPLPAgaAIJZVhKy65B0CUUT8SOVK8a88HUNjqShpWSZ9Sq4R3YdCyECmmn1DPAM8rNpZGTumBnWPQwVFZsgslK1B+HPADAxRyyW8iVecwgLIi0Z0YE9Kaq0Hr/bgALUrl20QTXBHZkXg2rI1yIB+fPAANVLJPG9Xe3RSYsgwetA45cOIwAgaQSt2kcRxxyAiOQOFMpNRpY1oKA+tK4cBIijifTJAZl+0gdhR9OpiACEBBqdXAU/swQJsGEWltPFERE4HdkiJLKXfKNwSCBUjngHIo0GOO4YrGbZWCzSBwO45NFRaZLUkkD1HxwgEhYNbrLM4aJB25UJAYAZBeJowqCa4BHHmWBmVCGhSMKdQOqNSB9I/N/zemAAKuwj0xoohRwyIwoGQfmqDwA4V54ABIqCFypeOKF9TtJ1ihFCjMKkVB6afPAIAqiaWOS3oGmUNEjNqWMf4Tnz4fzwQOTgk1q8gOhIqr2iRz9a8mPA4SGwwyTIYnt1V3Qabm2VqZDMsf40qMOQgK7i9BVTbIzdDsGFZK0JoeR4YUgwVy5UOWiAidgodgWZ5OWYppB4EVw0IJ7zmeS4SV4VRO07MupmoaUAqARUUBGeGMO6dc33EbJOQRHMlKGpqq8Mq0zJHDEWIqksT3IIo0ECUkiUKVWoyKgMK5054pLUGCgluZEWS4imAjkQgNHIx/wn4HMDEqgemjBiliD97slC060qmnqIzoeJ/DAIGGjK/cBmnDaBHGKka1BDUJFV+BwIkDlATuwxAqHjYQIxqjyHqOjlUZ4BSAiKLIkkpjk7aEIA1HKHII+oH6OWADoZEZSIys8ZCpqYKulvrVi2dCPhmcAMMVTJIQha3CP+gg/qQjlq1D/3MCGDeWO4V4pAoZjomMTHTqUVXSwArWmdMAtglXd+3+oiTK/6MkqCgpQBSCP4U44BB0kk7kyC2jWW2kqVJDrrU1CqK8Ofz4YEOA5ViIpPZokAAuS+ttSGQVFU1EsNVMuWGI46L2VAJR6F1nZcwaVcgDllkcDAFEJJGSWRRKk40gAl1A/xsTSoJzpgA6ySrDIUmjMCDTPZhslp/wAtcyeeCA3Bdqgrbzq92QvYjNKRKiAlNZ4ZfieGFsI8phNZG1WsVKSpFRgW4kKV5+tcAA4VOtKwamOpmCUAYVBIfmcq1PphgDU9toy0qNa62QKqEBfTTXPUa0Bwxs4ssoifWncaM6usAdvLp7gouY/LgEG6Ye7bySQnv6WaaInUzlRQNqJ+OEIMVULrDIkndjGsdsrWQ/lVg3piSAE5kkliIgq1wK3SLQakH5lf5DAILSKGVAkD6zIzsKOCEFc1bV9R4Z4Qw9AEjTWyRrGCYJEIUAyNqC0Ar8/jhgGQySiJQauGAjuFRSKU/MxPLPCYBVO6e13nl0Mo71dPbPBgBTiOfwwCDjO8U0xWATW2TTRAVcFDUMtDX5ZYGOAUbtV3UFFQmWVNNVYtmAeHDhwwwOpI/eUFg0rsHMYUsDHnU6hmaeuANAZk0aQpMFxeyr2QhqsSqOBVss+OAUAUZUFwiMKse3BJIe4S1cwByBJrgCQaJKdSKnbaFw86MoC5H66HOuAA1WKT3MzBbgNSSaJSQwdxkuqpOXOmAASd2YfdKbdV0EXDKKaVpSrHiaUwCPFXaFnjaNEcDt3cQGZQVDLxAHxOGAOMsFjmdW1yOY5tKhXjUAHiDXP14YacCLe9v/KZ41FgkhVLIvJYXx05I560f0OdDljXhu9jHnp1NE+G+6+/eFskuybtNt08+j7mzkLyRMFBr+n+YkUFB642pK61MbtZbF1757w+33utbxQ+83tRtPkNzYwxwWG9bPK1tdwh0DVklUJKCT/zMKZU9ZY6Wo/hehReL7op7dfZ3wPcVu732o91IftZmjD+G+fRvbT3c8rBZFivkVl0ngpkGVc8dLBy71SVkc/kcSr1/gU/5X7abx4ZcIPMvGrnwu6kmJTdFslvdjYkMKx3cEjJ0roFQSQeFDjcsuPJrGpgdMlF1gi9t475XFBdnx1m3GxiIJudpIjcgA1ARw0tNKgk0NOeZxdCWxQ8i/tBc97514vH2pd63vbbqzVhDNNcUEcdMyMwWjKmoZeOeDtVuoK6nbQbIfNvOxJBBD5hvENvdAdmW1mnMchNDVWP1cRyGF2Ftbr0Q5WTe425SFYd28jvbVzodrm5utMnbPAaGNQAp4D8cJrTRh8yn9pT7i0vFdk3PbkNx5TY3PlKxVMCbput81lbuGLCTsRSI7dORWQriOSsqZK68h90KsIue49w/Jba1DbhOkkEEKtZ2dpt9lDYIiURX7KxFgI1pU9wnnnxxSsVftNVMrQnk8s3LbKyTG2h1RrNbXtlYobe5aUnT2+5pqGIHcMgFAMxwGBYmyzvTEMnuR5BcW8R/wBX3C3vZYnorGNS0ZKqsixoqUZ2c6CTQEjUaLiPyUvUj3v2DHe+WeQSGODdN3uRt8by61mvFIWUNUaSskpZuGWSjgSDhrDXdArN7DXcbnuMzpePuFzuNvGqG4LPBXQTXtLKoOoAkNVF+fDElRJEm29BPPfM9J5Vc9wk37dw1OutSoUqVUqflzw1De4nMDBc7pbQ3DLP5DbxW6S9sbZPdSmVNQ6lcaxRWUBahvTlhSlpIkk90Jp902ZiIbfcLea4zVJUpM5UAip1yFclXq1Hq/jg7qoh8tt6fmctbDcrm6sztk9vd2+5TCC0jnKQidwhKrFUBaRhalmORNMT71Ek4ScMPvfGd/tbFb/crJriz+3uL+izJ2JIUqHMUqFfrYEDPOmnMYrWaJgkq1dtNi+Nt9lfOPLPFfDNx8TvNuuNv8h8Yttztlurm2tbiG8mP68UU8jUnZoQNR+lc1oGxnr5GqblMtyePnZlK754z5l4vc3dnvXj93Duli0U9xHDci8tB3NbQlJINaF6g0oa1GXw3Y81cimDn5cHy9O7QjEPnO47C9sIZt4gd+8lxFOrmJZGQrGZEuC2catkur40riy2JWKe/tWsM5N55vG4RW+4blby393HFGgu4I3t0D6jpdYYZgnA9WWf5sR/po6kv6uu0CabyrZZ5rq3m2mMXW5yLADNLKAEBBPeR6MwK8QpyNPxfyWluNcgJk37Zz3UkW2tlCpHqmSCeGXs6lBD6dakLXQrAknLOpw+x+pC2X0kSNvXi921biKytIzMrLclY2X7R2JZRHoyCMFZic/44HVjV2w2Kfw3cWmUW1q172Vb7iNgJLhgxHeUhSiGhB7dMwK1xHtaLFZo7JsvhTvaut1bzi91d2bJII9JKRwtRaiQk6i300y44TnYsTsNt74j4+72pu9VjcukslyjTBbdxGxMTNICWBKgBVZBngaH8yxFtx8Z2RIhNt27ia/t1rHaltMlyJKgBtQ0gRZcz/ZiDonuTrdrVkK3TYdzhtodE024WI6Jd1QaleR11RxumrI0yqMvxwvkJal9c06QV9uc953Jlnu5bLsSoXspC0nVpAZg0RoOk0CnhjNkfSTRjS3Yhtdi3rc40hsbKRpoXbtyMDHRAwkHEqKGmqpOKGrMstlpVyxUfFt3mWac3O17dKZGBt3ZDkVOsKI9ZyYAUJxFp+o1np6B4sNnitnkNzc7p9uyqlkyskKClSHNalXYHJeWINJbk+59Bd99cRZJax2otoam4RVRYo1A0itCPnTPhzwnYEp3GsyM7rIbhXaZXFyNINARqMiMSek8zy9MVlkIKQS/btMGDTKE+yuVIVdCV7gTiWpWlAMRJSDguorZ3MtussSsA9WUkFloZF1CvDKmFKGk2SDZJIpNxkzW0tbu3TQwFQijggNQag1/hjHyHobeNuTJNUcTJJkYFXvTpINMnb/9n6gmla4wM3iqaPs3AmWEx20lJY3NWALAal0jPqGQxEkgSiVqQzuqxKQ8bDNFY8NafHkMDA8HLMUMYNso0xAgBVAXMg5Bgch8MRFJ6IqlJoqqqhvt4ypbUTkQ3pSmJoYbKEeIukQWAN23dSTxpnl9NCeHPCgTQJ+2sS92QrImuklAXVQDQaCOHxzpgQoPa0aSQQ2ygTJQDKoag1OB6/24kwYALFFJHG0LvEtEuWNNekmq0CnjU1OExnIZGXTCs+pEJRp2QHQNWSo9MjyH44IAEsn3CzqREXchaMtC5FdPDmfhlhiBKtzqpNSHU6h5SarIyZEUq1PSg9MCGFAySTAOzuiN+lMBkKg6Xb/D6Z4QBq6Y2I/+ZpZCGCMCS4ppkANCQK5jhgABI8pQJJcPOihdTqdRkJzFaDOlOJ+WAEB7tFS5aA1YvK6E1GlRRkANTlzPPCCAThI0bUugaw8FVDR6nyop9Tll6YY0FlJIWlcxtcVRmu4EFJKqKahq5D0GEBwyLogit9YWTonkJoWjI+Iotc6euAD3WI0FuFRLZCI4zkWQ56jU0pUHDkD1Ncia0dIlBYwP9TVHEspplXCkAtXlgjgPfMM7HUyxrV1XPiCQWBJoT/DAB6Vz0vMsZiLlDJFWsigeppUimeeGmECduso8StJFKwYorFVjByUkjifjgCDzQqiCWGYQqrlTHJIpVtBPS1BTqYZAYYw4udM8jW9dZ0TXLDNXP1EKRloH/DAI53DE6QQzPKoOctNKyyA1RmBApxz+GBiE6SoZeieqzDVcRhAAZKkVqeYK14cMAA9MsaaEjR5DqfvsQSRkWopzNRkScJiC0IRpYl0mDRrgVspIyefzAJrhDYR1xrHCtJBGBGW0kIXzORGZDelaYATDZnQnudiRdSjvxrJRQfyHpp/ZxwwBHsXDARqqNQNPLTSxXMFQo+nLLI4EB4RwkFLai/cjVM7tVAOSkZE6hlngegI8lWeGOYiErqIIWigqCVLZgrQ/xwpHJ4FpdKu320iEtJCpB0yMaKSaZA4YSEurygzE9wpIO40dVVxRg2hSeOfURngYBTyl2hnljaUA6IkFWCIQAIiPUU/hhIYc0MaGCaJTnXtNMMnQAg5E0JrmB6YTEysWEh1zFqrcKO4ztUoxHQyvkDlXlissO1YLCYxriXoukU0XWfp1DiSPhiQbnE7iM0ojZyn6c0aHJjw1EcKcq4QjsDh3kmMYRZVZUuKZDt/kNONK8accMDgMiwEpH0qR2onPQF9C1BTiKU454GCPAo8yyNALeGRGjjDDSNYGavmaj0OEAfJKw0kASQqwHbUhnaSmTgkEGmAbR53eK4jeaLvsiKiXCtVnYitZBWhqcqYACv1FknECsoRWWfURoB4gotKqRwGeAQdIyxqsqvRIYhFLBOuoBsjqUilTngEDZJmn7cjq5i0SCdpFViABUaBQA/HDQwuR4ZaoCYTrbuR6w6aGNOkjNiMA4D5yFkRjIZFkiWJDoINBkoOkVoKUOGCAOju3ZSQTOrAyaRRI6gkqug04ZiuAQIfbyLcTfbiaQooAboLRngStedMqn44GwD1dioMMgKyL2/uWIJjVVDaacmrSgz4YQBcGhJ0SUSRBWLySwgmjHMkcRmeNRngEKKqkglDPHDOxDJkxExz+ongx/CmCQSD2iaGJ4XYwiYjuONOlAoqDqz4n8cMDi90diO4uPuWjYt2VNdaMOlmcDM1NKYYgGlogZnNIoZCUkarmSmYBpyBGEEHdCzGc0keWRe4kZJRVZs6A8a5HLADBam7NrKZDIDIwkKKFyFClFyPqeGATBQ2wbsyLEe/NI0Y7Y0qyfVU8q4YwyYlpmg73BCYMgq6jXgPUeuAAWsgwpI/dFdCJQq6VoFcj0BHPnhNiSZwOq28E8lJft3aOON3KiVicyStS1eFDgHMB1uAHYOjIFNXdc6A9WmQtmBXLKvHAM9Gwnb7cyOqXMtbeNashZuNSv1CuR9DhiOAIsrmVWt3jrEbfMaOIKGlCDTlhIcB6xTHVD2nMrnuZtq0oKEK3p8MMQLuJIJYx24omQGWUZK7LwDHj0/DAI4hSR40kn7jIiySalJEaKekLShNcuOADkKKJAruTLMXMUgp0rwdgRQk8sABwbSGgnEhVUJuSmkHQRQCnrX/hhsUHYnEcEcSxtHLbaULmillrWrGhFPgMEgGiGOOcXKSKCTrS8VirNX6+IpnhATPw1ZDvNjG2sWdzDNHGUcSEntkipYKv48cX4nDM2dSpLLEdzbQxRTNrjkKSvI8oWVRHlo1VLnQc200NBjo00MLcjyizX/aWkIuXnIW5q6Rv2+pcweL0Naf24000M94RMtt2Pdr46ptCgsrrbMJf8PWI1dtRAJrx+FMXKxXbUvLwbZPMdihMOybrebNaXUafe7fGqSWs8LOXaKS2m1xMppVgVPxwr9rIfLLVT2z9rfKJ4rjdfC18T3powy+W+GSjb5Vdwc5LYdyCpPEKg44rWfJTZyL+kpk3RK4/YfyrYhY3vgnkOye6Fjs0jXlv495baxxTXKTVEkEsulkdBnoyWj5rhPntqLTWfQpt4x0c1+IsXYodpuUtIX2a19j/AHIlgkSTxLyXZ7e+2O4kZSyiwuOlKCin9OQN+XTWpxjtnv1btX1T1+03Y8WPZJJ+1E9PivmVtbQfe+03i3kF9bQulvvnje4W+2vGz11GETRRyRgg6WCvnU4p/qaN/wA7Xvk0ri3Sn5afugjB9p73dduW2uf27eKtcyXEga+8g30SXJiAHbZ7iKKeaQipVSzE0AHCmJf1ny3Kyv7ED4lsu+NL3wQpf2ceRzpbH/vSz8YRBI0e3WMdzuVvatIWbTF3jGSvWUANen+GL35tL+zP4FdfC927S/E9N+yN2LyH3Zvu/bhBtcn+k62h0rpZf1bgo+oVNSOPLLB/zr/u/iT/AOFSX834fxAzfsn8WMV3LuXmvlm8lIAptrG22+zZ+sOyRKYGKhgBTr488RXmMj6fiK3iKLr9yIbdex3tnsDXUW5eEe7u53EkrQp3LiWSORWcyIR9pNGgqoBJOQI9eOmvNyXS1qUPj46PqRi+m/bH441b79u3ktyjW6Ty3G9R30jJHmuuk143MGukZZVwlTkXemQg7YarWozT+7fsFtv3Ue3ftWtDclK2KXtlZRgoAaOJLgSEjL45HFteHntq8jK7czAv5aoZb390e2W8Cnxz9ungXjfUIo728trWft6SAUHZgSpJNCGbmDw4NeMc63f3g+eohUX3FC+Qe8Pnm7/o3E22xiGWWeCy2+wtbN4JZWJAYQqzUDVXTU9FOJauOjjw0xr+Y598l76qv4EA3Cy8h35HtNxi3CGxUmFRLHctEhqpaqiLSsgyVyDnXOmLe+i/tFPxroR/btt3y1+9uBHezWSxSwzL3ZooI9SBGncK9GI1Z1yOfDCXa02mh99pSktTbLy+8r8b8Wi3S/F9aWGyf6LEsraZDDbXEyrGq0YK+ldGRGQrnXEq46dURyZ7raRln8fuLxDaQeSRbPcQPSDaXFyqTIuk5xhAsbFyRU5jiKYsSS2RS7+0a7zwPyTdDA0HmFm8cUiK4vbyakbyKCI+5LFWRpDkcqluBoMStlrVS9CHy+/RKR3279p37iN4gludp8C3m42mS3Z23CS+ht4pYy+pexDcUcOSK8DXiPTGW/ksC0djXTg5Wp7fwBv+zr9xvcFtce3JjZ+2RcrcWzRsgJdzLWWhVVXPSQTxp6i8lg/vIT4eaf5WL4f2N/uG3CGJYPG4drmeRUtmn3KBouuv6g0K3bAH0ngAa4VvLYF/aTLacHM96v7iw9n/ANuf3w3WQybt5J4144kaUpJcS3TOxdgxVLeMaaA1GedeWMmXzeJfymvF4rI90WBc/wC2V5iYw1t727Wl0gPZEmy3giWpLaQVuM1PqR/bjG/Oy/5fyNq8P/4l+I52/wDt0eRWMc9rP7z2bxTxiaV49jmWs/UCNPcYhQOBGfqMN+bdtqkf+JS3t+Ygl/YXdWtuPuffbb0gt9MkqL49eXBDgEmjiTU1Tn/LCXl8nSr/AAD/AIqi3svuf7xjn/aP4Pb3Jm3L3s8u3Pcbq1JZPH/DpmIamoLrn7qBSVABp8MS/wCQzW/s/iNcLDXr+H8T1p+1j2w2u7b7bwbz/wAyeCKK+bcfM93sfHdmnkBJr9vbnvkSEFaacjia5OWy1hITx0W0v7iK+dbPsntjsIufCfBPEbLe9wDjbBsm3ybslhVCpke4voyzSHJSwFAR64sVmzPkqnqzDe7+JeY+YtLvm83b7nNIrXV3uskqnWVXoGlgCKKAMhSnwxN+8jWsbIi9x4BvcbKI4U3WIx9y1licEOVoNasNOlyMhiDrBZ3L3DAdm3uGMSR7DeOtuf07lk1UL5/UBpDg5g0OIakpS6jfcRTmUIA/6bia5+4BUtJJQDpjNGP/AC0pzxGGTUAEtY4y0KM0tq4Ja4kHVRKjQNI41yC8+OFDHowBCQxRTgiN4HZJTES0aPXp0hsgG/MMRbGtACRWqLJPC7r2SDNDQ6gz1+lWJGkkfzGKyackp2IVu1XuJ32hDCONS0emQ5A6RkaihNMq4y8p6G3ik1ty7tO3c+1urehaMjoXKhLKa1AJzz5Y5+5vkEmlZXnYSNMK9gAFA5C5vpJIXjliKJSDi7ZLXAkikh7Y+4hnr+q5JCqgUA1P/HDALJZoriJ0JFFYwr09uMUoiPXM1/lhERVHIiNIqyvBBdxKDIADoU/nNTma5U45/DEkM4ui5YwQBjCx0qwyMyoRqJ400mlT8sEgwtpaKYkRBE/WnKjKc1LHMgV58TgkEGSCBpZH7gLrHURU0u4BrVOWXAYJBhUSrHICZAtFYwzKSwBcfmrxamWeEI8ofQmruyfasDCqUqQ1eJAy0f3nDQwxg9zG8yqiwO5c6Kxs2ni1KE14AevrhiApHFLHLddbwo69Oupj5jp58cgOOEMOcysukRaDMO60oAVtANOrl8654AgTlrJGeAlHmikJtQocR+hZWFaca/PAEACESOKGPTI2RZCzBWGdNbfmGeWAAxmP9WNT2ygC3DMp1qoIMYQjIgVIHPCGjsR4xWshViwEcVKgORUsFatQeYrXDQBYERjuT3O41AyMCzEiubMK1UelTggATvbvW5cmeCTQBrHTMwyAIHUKfKn44IA4sSJVZF7X6h+54gwq75oTSgBp/DCAI7izd24keZhAxBYiukVBTKmZY/wwhydJMhuYyGkEiCSWUtqlU1rRfTll6YaEAMShYpXgRmqBZrqIU6ciAr1zOZqcsMJkLEkUkRjhVtM0g7tvRG7h4vULWnEDAkEg7hWkaGFU7CWwFEoNKhASoYgULDLgeGGwC3MYia+UmWIkxiGY/WpAJD/4s6EAZ/HCA99yprcA6opSIkaSoU6qBzpPBhTiPTAATCp/6ZG7cyuT3WGt3RKmhPPI8uXywQJhhZZ4C8kixM+mKFWqFFBXo4FSx4g8sABDjWryKBFcAilT1HTxIpyHMYQwVuQhaklGn6PuKUjDj/DXPgK4EAYw/QWeWQ1YshZOsuwNAGpwOdaYYI4kUrt2HRZTDTTcahRkJq1KitcAIJUakunhpHG7HXCyqxaQiq6QaEAMOOExwdV6OdUUgnYdkxygMrvTMagM6cTgQmADy6XuZZGmWUlDDQKzEg0YhRlkKAnh+ODYAdIlUqWkWIpqkUA1hopNV/gamueAAgU+3dBIw70lQi9JC1/qJqFQRwwIYO7kgklhaWV5IiixCRsm0hekoh4cfqwMRWbIDbxydwSzMMplrrWIChUISAa1FTSuK0WAlBMxVI9E9wopSpU1OcgHrQFqDCHIXL2popl7odokCxLJ+mVFdOskDPVThiQg9DKrQQtCBIEBkUCg7daAha5HAI9OipJoerQhD0K1VAIopb48aUwAFuWSGAPIHjVR3IUopbqyOvlThTicDBBvbWBJVlWXshh25o6Bqnln/Ik4QSA1aLe4IVIiSBMHzcqODsOIOXHDGmHR1hkUdmsch/Tc1owYVUuQag04YQjymN3NC7PGWMUEjdKqM65ZEH0wwOKUdbZpS0p1UMZHUTwTuNStK5CnzwCDDpk7mmILLBXuW8j1VASCBHwzywhh0PbZdUmu7uHICW7tSNeGksAM68CcORnIolWUMoQxpB1QkmMHipPCnSeNa1ywCPfcFQprJFCBpZHBk/UYfVKh9eQr+GAR7tB3MdJIEjHbuDIc1YirM3EM2n1ywAKBIEnSQoVjK0hijYqssYyNXIqCRxpgAMaqW5i0OoVAJ3JVgyMelVz4qOeFAAO9GrNquNSPDVYQSQVC0GoMOk19PwwwAKz9k6GJuGHet2QUagNNJPCgPAccMQoR4R9Nw0vcrHJA9dALDVkAPq40zzwADSMLEitK7wxkOYyR1E1yV+NBSuWdcARIbAhWnQsiLWSFnJoBTNXOBDgDGYdUYfUlnIxWsQJKOBXMVNRSmeGKAY/TaO4lEsk2ntMwQVZuCxlTwIrx9cMICQlIArSGPT1xRv8AVrr1hmqDhNAHd2HSzCGFp5QoMahiWKVYFQeQ5UzJwgDJA4DD7lu0wZDIULNE5PXkDwNchTLAAZOohWVasoSQSRCEhuNdBFAKV54EByXutW5lbvyEp3FUZmUig0q/LPM1w4AGJ5XfVLIyokedqAVrXiW4gmo44YAyqovZClu/p0u40xKpORJrzwhBcOlDNcSkt3XMN1IkdF08F0V5/EYaQHUk7cnZjJMsYVZCaMwLdICUIyHP1xEAJMcJe1jdPtUAM03V9WZzY55tywDkOlBlMCXMjRT92iKFEuRHFmXnSmAQYHELWumRZIpHJELUKFPpJVvWuZHI4YiTeI3MNt5Bssyoi28N0gExJYtranVH0mtaHI4sxvUryLQ0mLASzmWFRC8z1jEfSxkXMmg1MoIzrz+njnjpUZy7os/Y/HLYQWl0bhrruxMEjZxEhyJaMg106WzoBUnGtODP2lrbLs9tZslrEjmO+aCS4hc1aSRRViT+mVYHgKgYi7slWhO9ptRBGY6mkrhUt2k6ZDqpEiAMCmkAljwpiDsycQWRYGjW4gbtXLtpeNQNakdJWQMSc6assV9w46lh7fb3d5C0llNNb7mhpcp9AlUHIg6jXI/LPENCfcyY7T5XO0Em17/Em62amkvdiVlqCKK6SVBIOZJp8MU3ot0SrE6ll7fPaxwQLtrtAkS9BLM8YD5kgM1Twzz+WMl6vqbK3jYlcV+hEiu51qaOpGmqj8456T64zPGX1yipbiCUOgIOnitOoqPkeGIOjRasiAJcRsKxnXViARXImmZqcvSuCGHcmcft0IajnUek8QaZn4D0w0yDQiltomMpK1RgCSrMNQqBRaHLkcWKzIdqGK92DZ7qN4byxtrkTxiM64lZOGk0DhtJ0/HF1ORer0bKb8elt0V3untR7fzosk/ie2FYHUqVjJKsAagSHMVyFVGNVObk9TNfhY/QiUvtd7ZQSXFxD4Z43OJnMt27WKy93pyVlk6eGVcWrlZH1ZU+LRLYeYdn8Z2l4Jdq2baNuu4SptFgsV/TV0ETMWDCvRQZio5YHe7erY64qV6IZt18jvLSNVhW6F1ZoY440CQpIzNRWQMkjNQnM19SRlidKN9WRu6+iMpe4qW2/PZruHZWOw0SwTNInaCsCtVVUDSB60JJoD8MdPj1dV6nMzVTeiH32u9pPBrnweaPcdrcXVnu87z3FpcmOZGnt0kjWJRQnRIS1CRTMipriGfk2rbTYvw8XHasvcltp+3/ANtN7nuJL278gt7mKRNBF6p0RqNLsplVnALE1BrWgOKbc7LXYk/HYrFseGex3tj4vcpuSbfceQ7kpHYv98mFzHEUkMiOsVI46jIaqVxhz8vLfRs08fgYsbk0HbXMTKWeZXd2HZYauoNxWhK5L61xzrJtnVqqpQLKLrMSyKgLaFC5sAuetakjjiPc0DS9BQrqzUYxiVgWepypXiaHj8vxwOQ0OqArKvcBRErqagNWJoQf7DwxFqSSCHePtqmYcDpbUaBwAQFr9VK88sNVE2M0smiroSw0t9wAx1BR/CpJxdRFViH7pILdVMco1SUWLTHql7dKkMGAUUOfrjTQouys9+3Iwlyl9MqRxgvbwuNGpqVUvQ1Uc1AyxrpJnbRSHle6tI12dxjWeNtUdxGeiDtAVQgaqBq0HH54vrUotd9Ckt+Rb+1NsUm+1MwadptMIMgFFYLGaGlKHIA40V0K3qVJuOz2jdyFzBIY5GuKV6QQa6HC5FqDNadPpiTbK2oRF9w2jb3jkg7UEF1enUIoZGjjjCVzdjXqpwGBkFXWWQzc9vjczKzPPBbVitrSFCiVXMTTFSFY1rkP41wSTVYIldeNW1z3bvcSliZDQyhVMK9QDCNM6MchXly44bGiG7n45ZQJLLLapaTTgiJgjK4QA/06UUZUIPEn0xUyUFb39ibZ7eXufdWyMY2kUkyxluCsoI1EVFajFViddRoZ5ppwzXKhk1pLC9AUUVLKARRvXhxyxS3BbVaEg8bjWVrlGSrpGXOoEVXPSVzFPkMs8ZORqbeOoJVEqsLdIxUW2gd6ME6hStJNWdOVMYzchQxW2kEYIgaUk3j1JAUmpOfxzqMIAYHajLB9Ylr9tQA6h+avo1DTIYCSOIRHZ0SUCBj0lQCxJOqtTwp8s8IRwydrvQsjKcnlC1o6qBxbOnLDCTvSmqOar288WqIwnojWlWBZRwPAih+HHAR3BRuHjaJlhVy4eYctFQRHSnMcCPxwmNA2M5WNQ+TNS1mH1ildSspqagZUGGhgDGrSlo0LhP00ljBCo/GhBodTcz/dgEGMY+yn+YeGSIFlhI6TIDRiCD9JOGBwyQDQVUyhBre4kBLALmF0qKBSfjgYAXcZoy0W4UzQui5MW5MRUqAeFcAA4wpVmLt3GBSZmz/U4Eqq/VmaHL44Q9zyMiR0liWU2xIhhP5g/PVpoSBy9MMAkqkgnWG9TpFQtNOWVAtTSh5YIAEsiwCO4MglCCjw0DKJTU6ADkKADS3LhhCPBoiWE6vGwULAQNICPQlNSmus55j41xIAmiq3dqzRljD2oyFKSAZBmNCQK51wgOsyDtyIdKyx/qyE17iniwPGgJyAHzwMYeWmUQW8tLmFgpickoFr+VlFKhuIJ/44QhOYWjUxTyMtvESoGlgSzcGDrwpwOBjCS8WoJex1lRwGu14nPpaoAFT88h+GARxOqVk7Dm4MmiB9RoAfpcEE1PIk4YzolMzzSQzrGs6sJo1WjaqU6iQBma8MMcCYtLEndjMb3KAgmOpWNAOoBRkTQccDAOYRMrlCZWf9OyhuOlgQNbatNQa1yPHlhEYAtJAyLVZQhXRbxgGpZjVhqNagnDCAcUsRAe4Miw3H6ckkYBZG9EpyFBl6+uEAXKH7cLJMLiXWyBiMwBxJHJgPqywpGBiQQyvDGgTsgmKUAuA9RUNzpnywwDJQwTtdloZonJlU/To5OeBGVQDWlPjggAt2E9aotmKmSGUtpUUADknKvwyw5A5MQ+p5oldUp3lQEMqcVZASV1YiOThRXDyAtLcOR2FIGugzbWqnLLmcIJPJJJIhSNGQRM30yAyRKeRqciTwrhoACsnaVpow0ZquipFFArqDUoWNcOBI40ssVquhWe3Uo9ukiiuXMsOIJIFDwwmABi7SfcSSalKATSUrlXNQhyoORwhnmLiSdp40LIB3akEBHyWnDhlTlhiK2IcRSs0FJbcq3eClFZacDUkinpiqpaFAKwW4bUxkUMkqMFLLWmlaHieBpiSQhTHb6XaMyJDDXUisQQTXgpPNScgcOQg4AshiaZmKyV0s76AHUU6jxAYnlhAdjRu9cme37Vw3bDW61INOKnh1ZcsABbooR2VHUXKt21FCSAR1DVzAOWEDBAQOzx6ZFhCI0TyUYux+l2APD54ZEGksjNDKRGGaOj3QGqqR8Qx9MssAwBbUO7H+kUIWEEkq6Ma5mp/CuAIDdMUii3bWpSoZ2FDpNSBSgqDQ54AAV1Mt2R2TKqozsQdAQdQJpzHPlgYDhK0MYkIQBp8u24DUSnFmUkjMZHCkAlg7MIcxLGmq3RRqBAIrQmmQJ54ADzG7P9zGGWZQxlaQqDqA01P/AKhWh5YYwqJh+jChEsUkoeMBdS6yCBqpnSvM4ABlS92xqe6TmHJKMzfUCCcgKUFcIUAYJY4y2ogmNGjeIDXq9ApBoK1wwDNM0fcXtiCsepanpEbcK1qAa5DPAACMCOUKWLFKSVKAF5mAAjJ9MsjgEGsD9zRNUcslQhOQjYc5CvDqzBA+eAcHZDV0jiBlg7ZDIci7rUk8Kt8MEhBwLI0dukMOkMGltl4uZBxB5DhmDQYbEw6sbgF4ZYX16l7ZqiGhqGcehHLjgkA5mikCMsTXCk6ZUjIGuQCigCvPKhP92BCbOSGZZyj3DzS1XtnTnG4HUCAQDp4A4bYwouiSTOEdoABQ1aqFOMhBFKGv44i2IUusxkR+4rd2MI0yjSqVAZXFc+BrXhhhAHtQTSSSKquqIAb5CetqGhovH5jAAJILsoFaN0GtfuXFKmMiiVHE14imAA2SjssaS9yKFShlHBFOSmvGuXHEhA5CJUMaOLh9QVZ1qOtPyD/ETTCA8TLKsys6S6D3CwzAkFCUWnEVzphbADjmkZVla4ePTTRSmkH8wYZih/LlhhB6OH7hdMkWka6dxWEbgHjUnmeGEAcssrM5FtFLp0xxJMhAJB4tnUj0IrhiPOkUs5jZzNocVmAOqRU4BX4HSRw9MAg4uVKzyIyx0KLahVIjcUKOygmmWYz+eAA1X7DI1PtGg0T0UkqzI9aluRNa4lR6hZaGvdhmhup7S8R2aS/WKVXOlVK0rpJLUqWrpzy9MdPG9Dm5EaC2aeO4NvGkTvLIEAhFWUuVfQsjChSgqTyz4ZYvTM0Ezso4nk7M0IaeqK/fWncjQhQrhNJVUNAtDnxOESJjBp7Km5yUgpE0nWqLmUoSQQanOvEjBAQS7b5JI2MaNqAqO2SwJOYLBq8ScjniEBsT7atzVaPUsw+lQwJDcAtFYGhOWIWRYiWTNbbisbyaFuSSY5V6dRpTSQDqNDnxxBaEoFW17lPZSiM9TqApRa0koMzUUFThWSsSTgnVjvIdUMxKySkr9JNHU01kmtKDhyOM9scbFisP8O6CTtsJEkkqNEhc6atSoalCWPEDlinsLJHFL1CGZmoykxPpNWDDgSRxGK+yS1WDFuUkVSul0OZNCFVhyDMa/OvPC7YH3ATdxfqGpAqe6W/KAM6/34O0fcAa9BrQayelipBYAiqgUGQw+wTsMs91ramgCSKrFmGoBxXMciKemLK1K7Mj93PKsbALoOenpUGOlT0cQpb5YtqimSJX9zGuiO10yppDPJSpkJIHEFakVBqOPOnHGipVZlR+QyXc1vMCaAnQGh1K7StGepouEz6j9A0j0PHGvHBmyIq7c4pjOyKrzQ6Q6q9W7hOoFidJUlzlo/Kf441UsZ7Iuv2u2BZvF98ieMhIb6NhZ5GUFogupwDnwHP8cYuTki6NXGXwsmk1nLbuFmfVBBGIZaAM7o3UqDSurIZk/wA6VxUrIteOHoPMUcwhWMShtbCaZymrXoAAOoU6hzNMRbTJVTJRYiZQiN3JAFqkZFNK1+kyKWAz45UpjPeC+skoti5WOOYq0lWHej1Ba1rq0/H/AMsZ2XIUtcBVMpNYkchhm6tU0zoQOPp+OEMJa7EakEl49VUDZks2QIFTWmZw+0JG+43CPqVZNZIoaUUlKZ9NcqVw1Ui2Ms9w6swSSMxNVjOCQQqipVanPPgBi5IrZBNw3FG1tcBpKjUZBXU6LmoCihB5f24uoiqzK13XcLZ1bt6KxhhojoYlNa9bZkEEmuk54100MzKj3OS4vlKRXEjXWtpxbA1hJrQsupSW4ZcBXF6ZRchV81tHdXM0zMCiBmC6WeU6emJgrGpUn1FSR6YmmR7Sr90H27GAbazSxt3Y47XTHQMxBEiIpcgVp9RxJEbEKurfRM3c0W6SSCSTtorRsi5nM56vnWnzxIhBELpVM6duQrBSQ200SkJDHyMgP5vXPLDkkmMdw0Udy8jLHbv9UMAUkMr9NDXmSdQy+OIyBXG+XmmC9tiveWM6LiJnyZ0JYLWhNBxamIskindznmuBHEkmksSqW5QxnTpJJJBoa4otYuShEceOIi3YwFZwxEZR9LuFy00zpShzxUyxbEy8dRnspJXh1gyDtqAQGCkFnJyPSOK4x5nqdHBXQkIklcowWR5ZHZHgRUUvb5lNJNKniPXGU0JQHxz6Wt0gAaNyUSCRdLoRlVqnMemAYFI40lWRu6pSQRXEpT6C7dKUFRlQ6j6UwhJg5AFEkqqrC4IjhiQ9xWStBITyBIwAcdDphVu7JbxtoYACplYcjxKjIGuADgkRDMLhliitZNZjQkISSFIrw488AB7tPEzT9sVj0rBCQNblzkwArlnmeHywDRySCS3WWDSoCrqtga6qc3XM5V4VNTgQmdMr6YqhZTbAdx4gdUYaoGoGoqadZw9gg8klGB1fqTqqwuqAihyIpTpAwAADFzNDHGYwmcNsGBZ2BzZWGVB8cAHpXVTBIsrQaSe7Ka11UodXKgPD1OADi6DLJ0mNlaiTRRgTZ5NViMiRwwmNHpQJY5Jl1JCrAoCK8GyfIA6j/hPPBIAj9qwWTTBeJc1RkXOXtodLsEqc6jiBhiAKwjnaVD9sjx9ErGoEeWn9Kp6jXnngGJw85jimeMtbQOY+0Bo6WrqYeoy44AYJ4wDkxdQe65kpRqHga8KH8cAoBKpdoe2CiTOzsVIEkmlSGyoNLca5UphBAWwZ4+7AqoEJW2BdgBGDmZDkSRwwxnlYMVUO8UkOp4VY6loDwAH1HPPCGwtpyrwyknW+oRIlCqqQcyB/gJqRThgECZ1TS4Ypb3hrJOlOopU5aOosfq00/jhgdDKZFid1uNJcTugBDR16V0ihLMTlgkYTDcIXKywNDLDTsyKKqqNn1gCoy54AOXKLF34KStIRrjv2AGpMyFTTXMVyJz9cIR2Tum4tKVjiaqBGPUpI1ampQVIyJBrhyMKlTTqijWRk0a5EBUKGWnTElaZH/wAHCEcd5U1CSYRyqoD1OaivEg5CvA5YACVSFoXgRJAyVaFs1YVGQap/NyplgkcB88zxx6JpFCTUNxItXchsgp5cBkBhsUBd3WC3jRgDMGRtJWoWIdKqprxY8cISPTMoeWcBkCkLHGpCuK8tVcwTlTAAUJPtl0ALJc6DRkYh1oRqYPwIbgB/hywIcB8SsT2hAXQHVAx6ZFZqaUqKliSM25DEugBVzLMDrk0zaZDE8YDhENBqkGZ6hxGE2ByWN+qkpaEaEZzQqMq9wjgSa5j44QAGAjRnjjSQWy9mOMEltJzBB4V54BHnl7bW5NJrdI610qr1IJqDnWlSKHDgIK6Z5JqSytHMxWk9zWgZKUUKDTUFPHL8cVrQtCXKiRXjlRI7dVkjmPUS5NGAUnLM0pwGGJnJEcgQyxxtdI3cYwA0CnMAVyORwhyGuttcPMrRsYyaaEJNEUVD1NBlhAe13EqRqnXNOrKsjKTI6ippnktKZmuAZwRmSKJVhZqAGLMlVGWrMmrVP/DDE0KJHlXTrIljuAYmuIl6iQck0D8owhBUxPbiQy/aLa6TRQCqs2aktSufMYkMMfUzC2M6tUgxzSAAOAK1YcARypyxEDsZuHubsmR37igxvp0vQKQGpyWmGIHHI6Kzwyq7Kq1iUf1Gc/LIfEZ4IA9WkYjqpe5cmPIvpRQcq04E8BhCZ24k7kbm41LDAg1RvkXNTmCDXP0wwBXEfbgUvGqPMNUmltbGM/QRXkMuPywDDHKs0rSTgI6p24kOSSA5AEVIZuIBywhHZyAkU0ojEkqk3cjjXo/Khr8KcBx45YBhs0LoHt2bRFJFrjtqaWpTKStKUyB/8DDEc7JFk8YklkMDpLpYfpIJuLshGYU0GfrXAGocylJJQXH3JNS8WZj6eJJzII/8UwCkIDntqIZndI2U2IYUkkd83Gs1yB/gcMchijtSKhlMASNi8KmhUyDNQCACV44QbnpLgqolkuTrfSYtOYCitQVHUSeJwAw2OR49CltdqQZJFiYssZUcxw+By54YjpVQrQLIk0klBMqA6QR1BEkAoBmeB+GBIYfNLODbKEJiZgEiSpdlXKoBPCnFcAmcMoUrGrGOAPplINe4XFAHGkgHLAAAK7MXhP3FzEKxoHoDG2f1ZigPHDkJDv0Ulknk6FCFDEo1FqgA6KCtBxqMKQPLJJI7WzTTM0cdYK9RI5gcPlhhsFl2gbQNIjpWyYnSw15HMDMjP8cKRAnla17dyXAhNFZiKy6wvUSF+lhx454JGKLfus5CssaRt3G7gFG15ljQ81GXpgEFqjysqldKSqdGjTqdBwdTmOnkMAwJWQwTwyKrFWQaKEsysKgyZVwCFP2wad5UvDGIoaPLCxEobkoX0H88NAChjr2poVaZhp7cWTsrkkNqFQAKmowgBx9yNU7RRmlMiz9VIpCCQgUjmvPDIpB1uFeaBFXSsBMbR9zT2inBlfOtOFCOGENmnfbK8e82jb1ANvNZSvBqjzZStSQFyL8Kg8OeOjgtKOdnUM0Fsm4go8fbjuO4NU7lygckaaMxAHSADkTmT6Y2VRmtBb1lctOlzroJU0tKJeGioQiNvStBUcePDDZGSVwORotZFkjeFTIQQuhUA+p6/ST6n+zCJIkEE4126aoVeUmUxkAFASaNXga88/jiFkGxIrW/Vft1yYOxCSNUqXHIqDVq/D58MJolUfor/Ss6Bk7ase6zimnhUKprqFcunLChDnUcBeVjj0yK1B+hbZMAxNdQ4MK1yphNDHO23iGM9pZSraa9qQdZyp+Hqa4g6k+4kkO8t2VYyiKR2CQRoR2zQfUaA1FcuFK4rtQasSNdzMq1JCdp6NIhrGqgZ1OVfgefLFLoW1toL/8AVB22dSCxJ1u2aH0UJkKnEXQlIab9Vk7hJiTmwJfualqVHrpPphKg5ANfjoH6MTShdCghpGqRWqihrT1P9mH2wHcFzXw7VSwNtrC6KAOlaadROVDxrw5ccHbqKRoncydx5CZBqIkYVGsgZAKCcgTXM4sRBkcvYQKq8iB2Cl4kWNEU8ixyJjJGkg/HFlSt1IZe1j+4QhmhDH724dSQtaUoV1Z6iAOdMX1ZVapDbzZo1iCiCOUB9VKrIEDAqwGQykyUktWuQPTTFquVOiL99qbeObZN9kjYOk14hNwSHDDtAaS2o1OOfy7fEjbx6fCSW/2kSXEcoQgDK0aTSAhWmZBOdSMuX44jW2hK1IEMFrBFGFWHsoJu4ssYIPdH5ahaAUFcNsKKB3SPTrfS3DS8UdWqHGYBOQ+VcVtlsBxmYo7FgsMyAOFIoCtCC6g1BPDj/LERyBa8mbUxlCAZtI1AFUfSFVWohP8AP44l2kZGq53TQPuaSrE4Vo2YVCNyGXE8fgMHbINjPeXwZ6GKLtRuU7SAhlYjJmpUn15UxNVIOxGr/fI4T2w5uJGNY55OmISAFiFXUQaAcBwOeLlUi7EBv90W8ijksjnHI6RFBoXvMKksCagZ8eGLq1gz2tJANxu+5LM7nSWPaZCVKSUA1ssgpl6g4vqimzIne300em0FzNCqhTOjRtrAY0CMa0oRwHLLFhAjUqxza7FojJ3BKgUMuUSk/wBUjPW3CvFsSIwyFblcXUJltUkd9EBVSB2oiKV0ayakqMm+OJEWir769S4iLHWyWqdxoLdCqFKUVlNKtXIBfxpiZGCGXcmi0eaabsAyA9sMGU1zCICOulKnkTka8MDY1UhG67xcSduEB4jco8kNuznvED6n+AI4A8OQyxBicIp3e9yaaSYWw0wSx6Jnko4UAdUcfJRXieZxBsnUhcqrHHDrW4tXZQZLUisjsKAFSwFT8FxVYsq9RukV07kjXBtlca53QqzMC3BMiTpPEjnitvQtotSZ7QzW+22w0uyNL3ZSWKRvlRWGeqrCoApkcc/K9TqYVCHxO1WPtRBVQnXaOS6oTmZNIqTQemKS4F3C7FHpdTAFQjfTpOYYGoJA5CmFIHIkrqNXXXD+r11EhJroFKelQ1OOAAkCMrV6RgpQsalwvAKBy5ClPjgYAjGEjJFDI9DckGoC1GlFYihrnQn0whCnVNCRoSTTIa28BbM6j0rKoBqBxxIEgkSHRM5iieeM6fuHVdC1FCAeQzoBhDPFRDSPSI4qLHE0jguJAARxoBQ8KH+zDEGMTIGtlRreUf1EcaaMq1VY2JrSnrzwBIYrzfb6NLxTCIq5OaqgNakEihY88ABKtGzR9uQwBY/0XLUkeRSegg/VRqgAcTgYjiEhJAJJRFGAf1c3iPEVbgwofppxwAAhZ1AcSGREYB5E6HlByTpNDkMzU4EhhsVvHH3pe4wggYkSSKKzM6nI5V+WAb1PO5aFKW0q3gaN2KIpGmmkRLpJI6ePDjgEFN2p3aRxHBb27hkSEUKqK69YBFCwqa8sA5DolqJo4y0zkiaNUfV/lwc1oaZZg0pxwSIImn0tNOhXtROI5qICXHDUVNKZcD64QHWjKFpllA+5TS8ynoeRqUIzJAA5VpggAtEMKyGJmEjCls0ekyEigkZkY8CP/PANM9JKRFJCuuEoNUMiVpKpIqa5FRxzGAZ1laMLbxrJMzOCXUhU0MK6BTlU5EjDYgppGWV7gyvGLmqXJXjArHhxJDjnTlhAmck7Tyo/cEEZIhuYUDBlUVKBa5lmAzHLAMAZnjVbhnZpJiyzRBS7oP8A2Ss2mgU50oP54AQGJZm/TV6yrL3bqMjNXPB1U5sSOHIDPBIwsmE3DyMO5HO3cgV9K1ZCRpUHPiK5YQgCvNGiokJFy8paOZ66lBJ+piSKn8vr6ZYaEHLPGJJrZz25NLkvIqtVwP6bqKgetK/34AACSSOGrQ0nJDrGaGOWSlQ46hkR8PlgkACGCO4d3YRwU7rFhrQtxIYU4VyJy9MIJAqqrIokSSNKLHPK7ay2eoFa1qV/nzwwBVRbRi1Azd1O4FIIFQdTBqfwrgEFyRTpbRnuRKxVTAWBBbScm1UKqFpQEnBA0wEhKfcKltIZ6CRY2+kI9Cz5GtPngCQxdEJaARiWLQGcnJZKDUA7gEAAZg0zPwwbCCmdEhkmRQZphrEBroCPUDQANNafj64UDOokaCMCZljGqjqtdKNxjRQSSQeIwIYFLsTu0UwMs6A9pXrpBUfXUD6hxNeOGJldM7GKQko8kb9NlpJ0grUmgz01HLFaLWFiP7Qdm4VJUMZ7VxCa5FiSJCQaBuQ/HBItwbyROUSDW05FWMgJEdAKgHInLIEccDFANlpLB241WcoJQoH1AE6Y+AAFcSAB25NawpGvZfOQMp6M9RVCOFSKGuWBjQOrydoRszJK/baMHQqUzLRnIUDUAOIgdiloHeVDAQaskZEaSVqoUavp9a4YNBQWSqFi876gs8TD87DIufzADicKRB0iaSySSkG0p3EA6ZSxoVUnDGGSyt2oXN3rbUEjm01YplUGhFBXh64A2DDJ2Yyiwt2SKPP0lRqJ6lqK6qcaYBAYGmtoi6aUQAqgk+kUKnSlKFieNaccJCBKWhdITC079U1v3cwPTuHlx54Yg2GSOSZpu+0y6CXNNQda8BppwOVMEDAj9NfuYrd629DJI8mTIW4lQOPoOWEwBaoagTu6zzMGdsq0z0sSDRVzAK88MYN5JNUsrjTMo7YjjHSImA+otXLmKZHCYQGPPKAWDuJGtgksWrTrUChIApQ8+GGB5TLHHcIFeSGbSq9YDxh82JbjyPCuAidZJGiloxjhjT9MJkWQ/DiRXIEemGEQe+3muAdAV9DpRpCKpqplU519a4UAelt9M4WV0neHquLiI6n0kU01Ap8xhwDDUapWSR5EgA0yOFBqMgFKnmfzEYAFLBgsguxJpt5BJGBQH4IPg3GuGATE0qjtNAzTKTKJ2IZVDfVUAjl8c8KQPO4MM08brILjrinbpD50IX58ThhAJDqMCGKSEyqNAFFUKBmQF5Z8Dx5DEQZ6EyQNpKKiqojtgp1UViNLiueVeGGINtSU1wrCEmhcnQDQPXIk/I54JAMlkZ4wYTo7mpHjCsxRyaGhUcK8M+eAcg4J/tg/6oKuDHeQNTrYKc8sw44YBMTquqOOGFQmkM6q+chPEKtc2FK8sAA5HWaAaoJLeZmMKqqkBRpowAHGvL+OAGHskccuhmeKkQW80vrzagRaj1OXH4YAQZoXviREjtxQxzTAVADD6VcUpU8QcMR5RFWSMU0wlY5pYww7pANTy+dfjgEzqx3K6FkAk0HUGPAg/SFP/KOJwwOmSNYhcq4M2stHKygltJoVbhmBXP0whl9+0s6PZeSWpu371pJFJ2iAdKMGGqNdQYEEUFDnjXx2ZOSjQm1bgYzCxuWaOdAGjQ0UhSSoo1Crcz/PG+jMLLZ2zc2GlWkUHSC84bW8JNBTq4DkefpixkWidbdd17HYlZtKsIg7UBAAqjgigpy4nCgY9w3EGkGeNX1jXcRkVi7YopVgKEkE1GWfLLCaEx3spSrMkgKTlmIh1lUZhUjS2a8M2/hxxEasP9ldmURBVaIh+1b63UqxFaBCK5kD6a5f4uWE0Lu1HiKYKpmMmp16O0p6l4jTqFBppU5jI8sRZaOUFw/ZUAhYlSpQnSVapqHApxGVBhNSCFkN0qooCNLNoPSpCqV5UBpw9MKByPFrdyOQjaWuwNaxR5JEuQIfVlXKtP7sVuqH3Md4tyLPUMXlZdbt9URC1IDU6V1E14fAeuI9voWVsxVDuMhVFqVlACMRlEWb6QABUBf8IH/qwu2CTsKUvGeQFpnnkRgO6tVBZf8ABQGoJGdMLtFMh0VxLQHuBGm1O6KQBmaUYNlkeJJ/DA6jYTLdRCOYnRJr/SkkrVa6c0HEgqKkGmeEkJjPePbwyumtXQJrVUqz6DVVyYitW9a/hiaFIyzhiyJDCXWJVOlnC61NDUjPSUBqSc864sqQaGC5ggte5DKhkWPrghi7il5iaZCtWUFumuRpXEkyDRfntdbgeObi8tWd7vVNx+pY1r9RrkfTHP5j+NGvjL4WSy8gVNT/AKcgyViy9IU8h/wxTWxdZDQ6BKSK4Mi6mjl9eRFKHgDni1Mg0Ie8kUSOjRwhCzxyq9DVuIWi5EtnUjEoFsIJJqgq4jfUpqIwBG+mjEliAOHEcPliSQ2xluL9UMTxSxugX+o4qDUkq5ANDkKCvpX0BmqyVu2pHLjd3Ls0KzTTBW7QbQCIloGILZKhPqQSeWJqhXa5FNw3gB56Tx2s6iv3C1MYLqAijSRmoIBxZWpGSMXm9AtGi3SF44wJLmSscaMGLJ2g1QWkP4kceGLa1INyQi63P7h5GSMx3Ex0ziFydLA0BDLnVss/+GLq0gqmCL7nukayfb0EcY6yzAJFE4UBytRU0pxpniaRXawzz75cmWOF/wDNXEaur3A0g9mQrqZX+RzNBh9pGZI/c7jFFHeB441SxREJajLcOrFUlYoAQFpQAcTniUCkge53MLs0AgorkRMs1UXUM9KrRuIzJIxJCZBN4voH7kkkhlnnJheQEIRJGDRQM6ZVFa5D+TK2yt9wn0yObnSkTpW3gYM0ayOQECAVHDPLCgkrFX71vMwea3OlGjkYrAK1Yk0ZtTZnj6D0GIuAK1vZIxcqwGpJR2QWGkjWo65PxNePDFdiSGiRDGRG8gkjgYRg0JKFTq1pVi3UONMQZOrEk0cZR2VlQNpa0kqNa0BGQUVUHn/PFNjRTVlibbWtikYEhSFBIZD3EKaesIFzGeeeOfkep0qaIPBjKC4FwyMSXiutQAcKQSjBedQKE4qbLeobqk7z64zE1S8zhqgBqFWFOGXGhwhphZ1aJGCkzQOjSOhAZEqP6dclrlkDywwFCy0DkS0gIqLzLUNVKVAPxwABlVogYp2VVUB1YENRG41ByIqOWeAAuZQjiRFEsrqD20ZtbBci6gCoAHDAyMhyEaont21Rmh0KNTsTkWK/jn8PjgWowuVCkc4mJdi6BtLagjNzjY5k+uGDDGMzCVUpKsx0Wwlzz+oZkkUHGpwCg4Wj0OxuPuasyRMGJAYGjiTLgP8Ax64YANUQjit20zFWZZmypGCKJSuTUGIgGDvJHMs1tpdQFiuNYTWDzyqHZhlT1wDOSGadtIiaOddOlQaNGhbMEGooc8SGBpJMkru50UKrO9VAZTlkp+FFwpEwuNnMVr26xtG5MkUZR5GYcGIABCcKljXAAMyS6pUDaHzkngrpDSINSkZHUF555jAANzCXjllcGSJBLIFzQsR0yItMiD+Ujh64UDE+qdpjGzMisA7ajk5AqS1PpUjlgSBgECMhLSd0Qu2mWMBWAI9KUPoBgEFyTO0Urgj7lGV5HJGnSxAotPpIpnzPpgGHPcdp4iiSRwyJQWxPdoPpolCQOOeWVcNBIEGWARTQ1780jKEUhw8daaYyaZACtfngEFRFZyUYNGivqcPm4NCVep+oKRlXM4QHe9K5PfnWIXFQk1SUATMtqPVU045YBnERJUKTxySlBJrEbhSxNAvDgBly4cMEgCEU+iMK1ChCzQg1kSihiEzBJ/5ic88AxKVkUyRJVnA7kbA1OfSmoHUVBHHTnXlhQDC3AW3Vpo5lkuKSiJACz6KAADMoCOH+HDEDe4iKIncSERlCJnBCMOKvprUn8owAAK6irRPKI4wVluZMiqGgGWXCvTy515YAOK7TFGgZpHPTaMFIjfTkSakVrnmf7MAjskqTKZQnauemGQO1A5J4GvFsA9jpkSB5AzxrdFS1zmaFK0RWbgKfDjhgcfQNHYhZmd1IIJZO0M8hTLP4YGAHVM8DRrp7jA5yH9VkahUKa5gZ4BA1Y6CqM0aMtZLaoYIoIzcqOPOhw2AmkVxBcR9lljViQfrjJJGpiwzrXkPXERo7JC4kikdwrn9RY4jVtIFSoHA+pPPANAzKjxPURaGb9VlqdFSBSnqa0wCZWskiSLrt3ECQjTbmYKYjVc+5IKk0PI/DFSLGE6pSy/qRo0qr3G1UUNSuqQHJAR/LDQwy5bvhMgyxyKdasuok51Qg00n5YYgcivrMoDStcOHihU6S2n/FzFcDEcVtegWahxKCocloyj/miJOZ1UNcvhwwpGBB7kU8KOYrYEGWQjJVAoFBP00PLCkYNQrNWaWS7VlUurDpNcqkcWpWo+WAQbDHKkbtQt2lkYSFzQGorXnVvTllhgw6FpmSEQUEUURaCWSrUBrUFicyf5YYgqNkWJlQBZDGTOSuoKWzFQePAUoMAAkZdCRxxBdMamVVJAzJLdr1PMnP44QA5gyp3nkWf7dCZdSaWA4rpbKp+OGANI5JVSrgJMoGqoHaBNCHIatfjxrgACrFu+tvrSNso4nKq6uKnOmdGpw4Z4QpByyPEY5JAe2UCLc0pRzxDg5UAJGGCFMjAW6FTHJ3AssjkBdSrTnn+PoMDGCEanUI0LRshXWxLR9snNNQNDzJBzGEAXEnWLiWImERdtuqulM+nIklhyyzwxHFZTE9uj67cmttNpFYldeEgGeZqDgANIhl7MdHjihXto1AumQZDjQgDDAPWA013Uam3MgVnBYl5KALVRwAJwAwIRrea5VWDRadAuV0vpY0oqjKozz9MABtJe/GXbv9hl7DHPVGwbqNK8BwwCkSMAJ27kzwBkJcv1kox9Dlqr/AYIA6spgB0yapEkdUYajqVgCTJmf5UwkAsdWeaVIozKrRrUMAFz6kVVXJSTxw2wR5kZHF2KSa0DOtPzDgFBJGVMKRChFnSd6FXkuFymAGqPInqHx4euABO0alROYAbwsJZrgV/Ll1kc8MID3uGVeysru9OCZUJOevicAASaIiupuCyHvooAppJzJyqfjXCANEihYpUUTSR9PcNVXUeCgcagZ4Y5ARM6Tqr1eSWhhumqEdRUUOdVPLhTARYOA20B1FWCxNqj0qQzas21AjPSRWlB64BpihBIkMsIh0QXLP+qjO1WGbAJwqcqnDALraQS9wxiJmQxXKaWAUHM6aca4EEAtMEryiaMhgRBbxDUzRrQHrNaU4VwSIPEkcn6hAWWDUs9m7AW5FKVSmYJHwwBqWh7XTRwb7OJInMT2QS2dAGZjGylWKHLSP8VK4vwPUzchaGiYZF7xVUMTNIpmYSM4LAVYoeB/HHRRgZNdk3Fy9v22JnVnjaVhI6uCah2QZkrxyzxYiLZZu37l3VVHlCJOwSaUEoJKcTTLTqpWnCmWGxExsrkrEe7BGJmAQBqgaV+jUpJPDME4TG2PttdrL9vAXU6UARujKmeeekDmMuVeVcKBD9Zy90S26OGVGAkuDmFL1KgFgwoSKVqMDEPKXFEqk46WrFdvxoAdVeQXjT8OWWIE9RT9wztCyhowQxjBYBjl9RzOocfllTBsSQ5C5CvDUiIyH9GYkAsuQPBq1blliJIVC7gCzyyFo1hohhK1kb6TU0PI/HEYJSOFvdF0jUqU/VIWMZkgiqlg2YNBTCgK2HKO7gcxiSZiyP1BVJVzkchkBQccsDRLuHHWg0T/rx6FKvSlQRlkADzyriBJMUM8faXu27LJVRE711roqT9NaaweJz9cKCLYokkWN5Cq6Eqj0ap0AVo7ahnnQfHlgSJNieQqASi6o4XqrKuhS1Rr1A+hzOrhX14NEZETiOYSPF+s86mRUoRqpXqkpmBU8+PAZZ4khMbp4RIWuNDXJR0URZgrpoDqcKclINVB4DM+siDRf/t5GkeyXYhfu6Lt0aRV0jUAtQBz/AL+OOXy/5jfxl8DJNdwqCtdYQ1qQagHLhXEKsusiL3KULM+gqop3VALFga6SM1pnnXFyKLIYZ2AGpQJKnVLcKBo0UqwoK0p6UGLKkWRi/uI0jCE94IncFxMUjQoCSuooKqeGeXxxbEkG4IjuNxLFOs50LboGlMbkLHStXCEVJJ5k/MYsrWSpsg26bmtnETJKYlth3HhClkiVqEyS5dTZmlKkYuVCu1yI3m927u/2ksX6zFe8S0SMoFW0IaAtQ9XP5YuVIIO6IxeX94zdxbaR45HEaTsKxCtG1vmAhA/l6YlVELXIte7tbvSWTthJFMcVrEurUOEkpJKgaQuWWfAYsgr7iNXV/bvblmuJGhjmU2UEkSlqgZl2LVYZ0CjMH4YfayLI5d7qqyvIQ0Fq8itIRqkWFlOTSAGoqPy8By9cTSZBOBFud68lwlvCWuLZ41ASMhYohyUtSoqfzZniBwwoG2RDcdwtZWnjmT7ztuscNugKOoI6QpbjqI+YX4ZYUCkrzeLvTBCl3pKqWCRNGFaMN+UZANTjWhxKCLKo3bd50VntJHd7aMG3QrrbqObqGpUZZ/ywMZXF5cMjNJLG09rKndLSKy51qShU1NGpipslUj88pW6L3EcbLPQ6gSaK4BUGpOTHLPnitsmIZB3JbdbktPK9T2GQxPTkisMs/icQLEddI2mOsGJpynbZVo0YX8rHMnhTFOV6F+GssnYCRFo4g0PcKRM+vQx4H9IrQVPA1H8sc5nUqCaZZVR3QWht3rL3Aqh2BNETSSAw5k8ajEIQNhsfbQCeGNoyJA0LA/UhyHcYE6QDUHlywDQXHJBqWe6lGpWZ2hctFQNk1WUUY8Cow4JBqLWSWod7pkDCFVp05kB+FRTlggicjVZSstuugSux1jq0KaBu4MwKkdIrgRIGrR/dNHFKycQrSdQMn0gihqcxwIwMgFl1iaQPLLECQutK0JP5RkdPDOuGkMO7axwW6yKUWAskciLpQNxoDTPLI/yzwwAwRhX0wq8EV0pVU1AKjErqJrUipNRQ1wgOKVV3VSBOdRtUfIBQAC1SCrVpXMetMAjy0ltut1ZHHdlkfpYuCNNGA0kegGfDAM5FMZJZO06tLPp7cDsyKrA1IFc+C555cMMUhnfEssS6TGrj9QxscnXOuphXT8cAScaRFjVpIT24pdN4xcsskv5KR1oCo+GEAUxiKxypHV3JrIp0BiTSgoa1pQ0OWADwVv1GliFzFASUkSgZK8QBnWta5/LASQVC1t9tqj1q0UncmRdJLVGWjnlWpGE0EnSmoTxzKC/boGq1NBFVFPn68sMQZFocRP0mWE6WlbJCNORyzz5fDAB2TV+pJLEEijSsFjQIX1cAaHqNc68cABMcui3kniSORVQ/dStrJjJpUczQk8jngA9JGvd7caabhFEcMQFO0oGT1J+ktyGYOAbOsJS7zx1WOahuVB1sWXNiByrxBrhAjvWYikMMQMjESEsGUDmY6cM8iOGAUCf7yge4jOmWGEQmPQBlWgbMehrTjgGFMoWRgJJlktIlbpAIKs3ANWvMEkn4cMAA5kQxa5GjQhloisVZ3GYdWFMwKCmEMMVX1mSKGOrRr91KhYMhPFo611Zmh9cMBPKzqBcq6mW5BiSRxQ6gCrhwT0qOGAAEoZND/qKWRo5JWNUZY8yTy08h8MASDFZZhCsSzLcjUIxUUoKEqmQHLBACdZpoVGpFmrIyrOSX7YpTV/5/wwxHVCQFgFDiM0eWUmjVGQz40ocjzwCOoqq4idu1Miv23FUDahUOT6muWfHLCGDD9x0mctEJVpL283+JqfoNeFM8CAKNIY5kOsNcfUZCdRpkFOQHDOuGB4d1nGpaRDoRo2OlCK1NDWtTXhhBIVHJKxUBlinnakTOQYzGuZzzyYVwDOxzIGcogRYuioFYgznpRV4iv+I4AK1lXRBDSYPC0tXINYhUCh6qsRXjkMVIsZ136jGU7SSDTBEQrKdFARIa9VRwJOGKQ917iypFGC6w9t4G/TICn6wfU8iMABK6JHZ0kZSulopg2plZR9JP5uJ+GHAMHcKDJpkDzOVCwOWpmea1ANDzrnggQIiQyqZowO4dc0kbAqxHT1AAA0/nhQAV2qW1UDKyyFbeSatQp4hacDThhikGypGYVZW0O+q4CVoJFoRU06vjgAHMZdEipIZaSqbqBgEjAP0mleJ54AFdw5MbJbksk0iM1GIcqB+f1WvCmAYESRiVTGolW2UrTUdCK+TMGyoSTUnCACRGEnpKxgQUQ5DQ61FQW+o5/L8csAgI06SYo/oOlstLzKDWoqKfGowAG9yMrG0LCWRJWYSFjqGdTrr9QyywkDDEljkUS65FmkkH6coy1j6iozVgBwGGEA26JgYUaQGsnaddX1DgvA0HP/ywx7gZJAbVFKKFDiWWTML0mgIUGozFD64TFAo7Zg+3nZS8UxUu0Z+mVhVGUccgMuWAe50h4hAIWhYTswdiavJpOo6RQZita4YgMiw9sOiuBIxRHbLTWhq9eLc64ABRBUNuHUxTy6u4A3TFqBoW41B51+eCQBWqSJFGFFvM0mqONHbQW0ZM7E1qFqKD1wwYMKskUUYNQ3/UB+lkI+lFYEUBAqBTPnggiHLoSLvEvLB024nUAyJUA0Zjl8DgGkeSNUdJJVEJmrBCFACtpB0rTOpJ5YQ4AtrgiZAzGcCpkADEimeoKANXKg4YBQDSGCCRVBkbWuiZCaxgEcBxpUc8IA1I1merSBWcik4bMdsUC/j64aQScjdkQgRpFMRqnlVtaUWulSDwJrxwwAJEqEyxytJcTLqaDLqFa11HlTnhCBqzMrP3AvYemkEHtgg11Hhz44JHB4SwFu1EiwRoO7l1BiMqj4VpmcAB8UchiVmmBZwrSBwQ9aUWgy4DiP44kI4J2dZoyzw3EqiqNTXL1f1F4iq+mIDSOqe3Gwt4nhlg/runUrADOlQKNTjQf2YkmEAodRQEKdE0TFIG+BORfPgfXAIEsawwXJSYqZFWqZMCCOlaipIJBGCA3DUAMYMiApbMqXOodWedARwqM+HDDgCT+Hziz8j20s3atxJJai5QAIytwqCRx4Ek4txOGU5tjU8BosxYd2SNBPF0htCD6WSQGlRQ0rljoVZzx1iuYgFWNnUXSaYJJZCZJV40Up9LZZkHLhwxYrEGTfbt16GtzR3m0Eca0WtRpY5EnjTFiIFj7deRTq2iSXuJR6aWJoSA4MlK8adNOWWWG0BNLa6Z4aOEihGkzogDMaDTpRgaUApx9MKAkfVnrbqEkXRDkI6lBKpOer8cq4iwWjHEXCwprcjuEqFljUlSFJNNP9vxxFIlKHJrjWWL9pCprERUa5CKgajUBaHlQV54IBMVd4hNB/roF1LWhjdTQ6HJoBTl/wCDEm9RxSdE7aOe8YI1BctViSRUswyR60rln/HAhdBalw7yxSTUVpFo8sdWEhrVQQaFV5f2DEUgT6DtC7KsaKzoZCSVbpJYmgC1rkONPhhE2OaySrMqM5mkRCJoj0mRhWjLoyNQPTENyS0F0Uwj0yIzsVOmWSRlBNCaqRxyORIwmOUxT3FZP0eoQODIG0oeFaDLhyywhyCeRQyhShQIIyrLqXSpyTUCQczz5554ERET65zI4LN3FrJJL00KrQF1B1MSOJrwy54mhMOjSWWiJ/7MjtlwM6HTpFVK5A0XLhnhN+pKC+fBgi7TdhAUVbiiaiCVGhKVI45HjjncnWxt46irJLcVFaglS1AqVrWmdaHFNWW3QwXMUqIx1grqCmRaE1JotAMyRw44trYraInuMShGLARApqVfzajUL3MuJYYvqymxBNyMkn3ULqtyAvbu8iJGqKgFqjSqnj8MaalLKy3CZRQXBOqEduSJpNIdnJVXTPShqSAaVpi6qKrEK3K5lsp019mOeEiOKSWQzmMSN0s4prKowKGoOoVxbUqe2pB7547lRbibX2pHN4pcVhyALlWoRrI4GmWRxcit6kHv7uG2JS6Esbp3TKoYhFBJ4rzLgjSrCtKnEqoi2Rq63Aw27NA6TWyMHmlJCFwfyggnLlktK4sgq7iL312UZZY4dYZSZJHfpiWgKtmSa1OGkRtboNE+8tH9tHaSLJb3CHQ7pVpCQM1rwNKnPM4e4VZG7rcaDuwMJI5RqmWbVHKyrUMI3cU4cKD5fAgkyK7nvNvHKVlV3eOMGFQwVY5ABXVpNWFBqYitAMINkVjuO8yyNcxvc2+icNbw30rtVzzWhowFOY5ccRbIp6kB3GaJ0Cd6Uoyq9ykihO3l0aWBq5y4csQbJwRhmIaK3JRWC96R3LVjZwQGGngAMqDjXEGOrgSPHcx24jPbZ5GIjjkAWTQKkigPCtfliDRZIQzRyrcAGW6SOMMtCQBQAdLZav78RJpirb4Wa6t5gZJTGOqXTU5Z0WhyPqDxxmzPQ28dKSXKI5NLK620MTGUPSr6wPrJplWoBxgbNzUBikqf1Zf1AquJYlIzzq+g1JNeZxEIOBH/AFnijZBJXXBHQmQGtangV5kUywxh6xCa31xap+olVk+kD6W1EnjUZYBNnMtJmaKSOBz2oIoyQFcGuojI1bgBgaBMCRHpjcQrCz/pSRrXTItclWnAV4muGNBqSrHJ3ZYWRbcFIB9Ol+Clj/iphQILR9XdWWRRNcfUoJctLHnpKAVFOJNPXBsAbqMkyvPoAhVX7leiQ8cgSACfXgMNsAlXCpcLLHJDHIK9tBXpDEGqnOnPLjgEHJcxllR/1YGZkmeNaJ3hmD1UPAZjl8cEgjsSw6tLwzNI69tLmE5HWeplWoWg5k5jAMLllEkF1Akfdu5YSkkoQVZASpKEBtVadIBzzwACoqC3iWMxx6Y0kK9TEgcGIyX1NRgYCSQqI0RH1OJAZWCBiymv5myOXHAKBQZbYxSHWJI6LJJCSUKvJQateeeXrhhAlMkqiWZq0QhVbNdBZqgt/ipQYQw25eRoaNCY9OmSV8mZy/NCOHDhgYAriQVl0x9xwyB5KGulhWg/wmpocAoE7vE8saGMy26VUIV0VPoDUZ8sA4PMpjNEjaYOvd0q1dLrmKty4cMAIExWNZbqFWilncBGBK6WUmmuMZUHKvzwAASKC3MMiTBXkFGOb69YzCgnL8eeeEDDEiCS1XVCkoIRlorp/wAtCaHPlTLDAKKxWxYzRlpK/pWiEvpqOqlBxNKnPAML7gdRcMRJ+oYulagu1SSK1oc6DCA73WB0iZ0udTNGzqFMukVIJJzGWYPpTngQwpDTtd2ORNKuYLWoRXJPVqyyJHGmJAwuvbW3lmBjDV+0Ak1BFzIWhpwOf8MRgR2XuFVSciIyEioXoJP0gqdRyJ5c64ByDjpMzVYaSSRGaFKKRU8qFqUp+X+OAADa5I5HuJnhd2BhQHU+kZhKCmmhzoTmMMTFbTuZSk71k0Dt3EihBKB1BaDh6gc8KQE51ytJrUfcSR93W4ovHgE6lqa5GtTgkIAx1BKPG6tKB+mq62ZkoQxAFUzGXTTAGwTpEssIMSRQ3EbViU6JFCVzbkWJ+nPAINl0gSO9wqMHMcEjatBrTI0+pia58B8sDJITyK0oihVmkCuBCCSVjoDrGvjThWuBAcaWVpnjlmVZDT70gCjgZqEIqfjXCAHCrqotio1KGdFQZKRkNVSAdNKUr8cMRWgt4f1nnQtIZBBNBTqooOSnJc6VryxUixydKQSClsoSJEKwWrmpeImmrUxzpnQ4YSH3EtswWSRgzyVUTIdS9ulFITiDXLAgOVeeR44YFMYRu0JOAd/zBhQ0PCn8MSYHO5NWVGjL1HZkgYg1U/SVYUoKjIUwhMMmkL91ZFZ4kXSrrpV1kqKMxyDUrlQYBBUzzXKKVl+4Nto1MDVGHqFOZJzzwMID5GLtcJJM8UcQSSaJSp7ajgchxy/DAAVG0ojmmVkEfS76QWU6uCkn+ZwDQYItWiRkMqMOhlrRGAGhQrHgOfphAHpJHaxVYO80SnpUdIDZaq1oacQMAQFZaIkDBhGA7SONQAWuk0ppNDmacfXAxQG6ZVjSQgKoVTLKGNdbnNqH/F6YBwGSo8kodolMwfVJQfQqkBWApQ0HLAAbKCSk6TQlYhQMTqLJXMFOIJOZwwAnQIl7Cm5nc6o5CdNPgWJ5iopTA2Aaqkd+ZXBjclHucxoVVGrSp5BsjhADR5ZSqyai8aadL5mVGPUQ1BxGQwLUTOGKVDIRFbrFaxsslrCSqx1+l68Q1OQrgA9NG0lrGjgyPb6TM0Q1KGJ4kGtainDDAObvM8LSgIe5ruaFWcADpbTSpqK0GAAQVJ7i7EcSmadlSEznobOgLgfScqtgExO6wxag8izTN+jLIOhEap/USlCSeVMMBWJUQyW8c4VqAPE0gGpVzL5A8QOHHBAAJnAiaa6kUySqXjjAOp1zVAWUdIVa0zwgPIQIrcI/2z6Rpij+kV4ByQc6ZfE4ADkDB5UWJmB/L+WtM6qc6rxOAFqB7aRUUoveJAMPEinFqZ5/LABxhEwmkC92RiB2UOhuGYcHma5YBBmkO0bFlieOpuYqaWD8yo9OWADum2cOAY1kc6FlFQGXgAM6V554Bg2IliTXojhSpFutM2BOl5K56q1+eGAZ3Y9cz3japZRpSIrlqpqrqp01/MfwwoEFpM6woUmBMQ1VIJIP00p01SnP4ZYGhoHIJVhmiLvFHoVo2Zi57gz0lgcvU58MAB7uD2AZiI5FVogtGLNzCtxap4CmGJbBVVREYERS1aIMumkmrM0q1RpIqR/xw0IUkkMdMvfuQiidAU0uTUs3AAt8KDTzxLYkhXYyG1ubSV316blXiZSRGwLZ9K0NR6/DDo9Su6lGs7eSWWKxuDCRJfhWMRQKnaZVJjJBIYH6uWOhU5t1DHG3laKeLMxuuqGMMaIDzNKEAgHPmeGLEytoc7K5NpIzwSmZVNZ7dGQTo1SHlVK1C8+eXHE0waJzs+7ItIzcFwoycEaSzCqshpmWyHAYsTIFi7dvFEjdU7M8qrH1qmhTJUgoacDU/wDq+GHoOUyX2l3JEivDJCEQGSMaikAI6W6xU8+HEnhTEWMeobpoGSCUDWzEW0bBihZc2alDmtMuX8cQI7ioXaxmCKZof1uqZtAbQOJWmqrIWzoDx/HAyYqS4SJC7QM0UR1fcCrvKxyUaga6lFNJ4D8MEEWO8N8sydUoaOMqszqKSB+AXTWoCj6if+OBVJJjjbTEjSXlWRwwuHGYCr6VBOf1V4jlhNDSHiK9OkaXpCaG1aStFyFQxIDClSQK8qnEGiVWOEMpiVF+47RakcTgfqKpObMwyatcRgbHEs1ZS5NusjLHJA0ih1Ar1AjUABXlnhdooYrE0yo8nbgWQEAyCYlVFFGolRmWH8xhEoBrKY2tjHkpI1W4LMa5UDE9IPDM4SQSKIzJIB+pqkNTHEqkBmGR7mqvwzb+GGA42q6m7yRMVlloqhNR7gyAViKLT1bLmRWmK2yaReniEciWV0kjAsswoRUjTpUAgmlchWmMHIept470JPNHrFKNShQqDQkDhQ+uWM6L7ajJexktVQR+ToBBFOdfUVz/ABxbVwU2RENzgJKCRVEevJYqZu3B9ZFSfXGmhSytN2hbWInLy2+p1VWqGkpUkyN9JrTI400ZTfQrDcpAQjwXyyPC0wKy6iCFp+qp7hBAGQA5+mNVEUOxXe6yyq9ze6Hvqo2iJnZpJ1LBirgsS5jrkBwY5nji5IpvuQDcTrnYSrBLeqSGhLLaiZpOqMqnStAAasDQmorzxYiEkFu76eJJEgeSaV37QvRqkjLVZY5o4+LAVKrqIoBWpxJQVWsQ24vAmiRrNEnjhWJS302w4MZChFangBw4k+tgpRELm8uFLGWNriFiGF5LQ96RanSpYZqBVdRGfLBKK3qME+596UPE7ug1yPbyKoaRmbMwgEAAH4Up88RklEEX3TdhNDLK7SyRx5RXisJZGCVPdCgHIUy9P5YlI5IduN9cCF5Xf9FGYxq4GtpHAABbpINDXQa8cRYEG3LcEaJoJ11OAAkEcZZYl1Ehld+Oo5E1xBsdayRO6uZQss6uFglkLyxaC2k1AKLwJ0UrX+GK2y2BvlVmho0KuiMoiJOiRlcZZEkgKPU4jIIKkWNWVzdExzpTWDkkYHSGWpIryPHEWSQ33E8lTBJGVCSKUgU1U0OZDUBFDwqMRgmh02dRHdTSJqVIkCxRowDq7ECjkmhOZJ+GMfIZs4yJlpQ2726vIy9zXoGTAJWorWtGrlljIzbIBSft0ljuGZyG1iU1fQpzjLECoUDiMR2Gg4xskRkj1lK/orXSseo1q9TWhPL8MAzkau6xzGQszJrZq01RcNLKRlQ4kRaAn9cr2pGkGjRC9aKreuR/KMgcIIDF7TKEkuBGo6VRGp25AMgONa4YwcPf1JquqmFWZCTUaRl1CnGo4nCALj0tA8cf6R1gyMHFQy/SvybM/GuBiQakUcigSwoFqCQrlQrnIIQa9P8AbhwSEyBHhWFZBE9wxFwxB/TcGuojjQ0y5DjngIhkzkTCNmjjgZTGIS/R3FpVpAak1J5c8DBHIKMrRQS6UJEb9WmRAtS1BxAzp/zHAM8rCN3ijkMPFYUkQCgIpqyYV0gGmdRngYQFALFJasjrCjK6tIOtScyzUFB1f4ePpgQaipqJ3yjRTiUhhClCASKkmnAj/DhgAd51i+3dYVjACyTsoj7lDUavSvpgBICypqiLM4WWMpMitRY1rUGoBBrhADo4lVu40cUelIJJKEOX6QATwNMh/dhDC5V0JpkcGRtTyyR1/UA4FeOkD44YHCZYlhR1diQ36i9RiyJrpoK8OWAQU8qqJAJzJLIum9YqFXufkOnhlzocAzrKupJGc1aPRVOoOy5kaf7cAgIEvbRmBLq3bkAz6SAOgH0wAAkfsOydhZ7a2csYUBYgsRoIrnWudDhAgYOgxGQDUdRuJX1A58ErWtDmc8MYQzkIZHgjC6iGtkWsYCrSraeBAP4/DEQOyztWPRJHIhZmiMqa3TXlU15KMqYY0d4ieV5RKZHEUMVKs2kUOnVqpQ8+eAAn9CONolYpEZAZVKn9XP8AO1QI6enHALYHIFTsRxhmkoXVNWlaHMLH6n0qMASFukd2XuEVJQq0lhRuuLRUkin+KuYwAjuli8UsKiKh70aKGbuAihdzRjXkKjhgYAUJmQRwlGjkDRM5QEib6movTl6H1wgkAnZ7JA7aHUVESkHOtaawAQ3OlcMECdn0ieKUXE8hB1hlIOQ1aTShFMiDwOAQArIXaEhmCIHdVVRWT/37qJP0+h/uwwgGryg6ZqMkUbI7xsCspcAayo/NUUrhDQX+ojx/cQJLGikiKMgDOgKKMtQP8cA2E9u3jZmJiSWOMq8cYohRs9KVAzqaEgcsJAg4MJA4M5SR17rIOl0UD6SKddeBI4YNgZWp+5eNpHJUrSMwuwRyrCjFiaam0ii0xXBYFFTOtt2bVJIOqK3RWAlcLkTInEAfzOJERR3BE626Okt1PnMFQlBTqGlhlTkB/HCGAYlo2eryNMe2qsdMgVTQ6SBwyp8BhhIYCEjL91DBUGAI1ZGLGg1D0plwwSB5AskN1G8h7dtKGlJr0KeQA5YBHtY7YukWN5T/AJc261SoUcSPT1wgOOIdYSekyNQQsOlWYHUatXPPDECjYoTrStvI2qgqRBQnIHga4QwyKSOjSA65JXGmRaqFIrQnLhnnhjPJ3AsyvRAp03NwWyJGSAgE6vwwBIazdi3AdEj7yapJFIYmI5BwBWlDwAwmhIHqiGhWSOeKOAnkdQ9dBp1emGgZ4EsWk0rGpJpA9QNBXJiWBzalDngEGKyGQkRxIkpAMlBzNDTnlgGHLI+pYjR442ACqemTURUk8sswTwIwSIAsbUmdI61kIWcZAKh4qMzqoanLPjgJIWEESvC0TTuyVVVdVR1pTUxqNLV5YBCZlKIkztrVlOooAGLcEVhUE4BCxSXoCXtZYk/VigGhWUipZeI1VHrhAJUDlpHfRFK6mVJwQnbRulgA3POoBOXDDAFFojURAVI1yNFICqtRedciaEE/PCCDv0OrR6URlOjggQDM0UjKorQ1xJACLQBAhZtMOmlyEKl0YjjlUknn6YQgYCpMFkCQhSNCGlBQ10qTTMjPAAYJIkWcFEddVWqCCZDw+oU/HCHAYqFOys0epbTV1P0s6set1oc0FeIwwOxiSJnWF0ntSlUbqTR6nXSppwpU1wRqIBJJL9qooIwknUYV0Mz16Zc+QB588MIPMj28lNDtMiHRMCW4ijuDwanp/bhMR5E71vpRxPO0mmFIwAVK0LUqafHCJCtUL9Mksjfb/qwSFKa+Wsn0qKZ4YAFaScwzTAyydQigRafqAnqUHkOZOATPRyMkkcnbDSNKwuaEKSRwVxwIFeRwhSDeFdaGHoSYq8MUmQEQ4Bu4TQg4mkKTjvCGYKjxKIyUn06WeXMkGvIUypgHIOOKN0hTW9xPIe7INekpWh1k0DagR8KjAIG7d5iXpqbOsenUgH/tAp5t+b1wxSxQY5BNcdxFcpGQWmUsSq0oRQijMf4c8A3sab8R3GfctgtpDrZ7VIkui9SSqg0CNwy4Zfjjo4znZITJPPPFHWKXStrJCv3UpUmWJQKBQRXPIggDjnXF0FTDVdVaOVGTuW7Rm6j7apGEUdOghaVyyYnLPAIXWly6ukfclQr+oIJFAjJcFhEoqaEDMk0FT64kmRZPds3KUypPDG7nT2opzVidB/VqqstTTJczw9cTTIwTaz3ONXt5A4uoyQsltUiaRNIYK/ow+o8P5YYEoiuUkE0ouHh70gjluZH1jPIUopNTzz/lhQNseI7qMJAbc0hpqWeTqUoCFdF4HM8B6YFqA5QTpKkCxFkkBZo7iM6UQldVGJNEOkZkj5euHArMdUmuk1tLLNayzHtdpVOsKAGOohaNQ55L6/HCgknpoPdtfSzxiaWSC57wDwXz1HQhyOY4jTQcxx54i0NKR2gumCubiOGkbKJHfMnSTRQczlX4Z0xGCWg4w3LRSHUqRmQGcMwB1EmoD6W4ENWhFKn4Yg9QkdYJzqZTELlwwmmjZh0EaqMxqa5ADNsEEtRbHcF15zhwKFaB6ildXA0HDPl64iAelw4EDjqZwSyxijlaHSgAAOQ54IE2LQq6tcK6o5AFe1UkAsB9JOdMqZnLliMeox6snd5DEAe7KqdUYX9NQQTEQRQrUZ0+fPEGSRffiUZG3yCXJhKdSjIKaDJRjncl6m/BsSl1I10GokhkQmgBA5HP+eM8miBBcqCjUYqqqHBJ4HjSuda/DE6vUjZETvrdzpGghlqrxfUDrIo1Aa5j4Y0VsZbFc7xt5QTQrDKEY1k7RGlQKjjUNnWnPjjVSxntqVPv1jcNZ7oyNIXgVou2sQjkCxgUclQRoqx1UWtCMbKWM90VrvEU6Sz3Fu09nEsUX3csJ1hQtQ1GNQQy5sFAoMuJxfUzwVluFvJFK0bWnaS2aR0ldFCRwMvV3A/Uy55aRqJqTiyJFaYKs3OWS2juENy0VjbgWsU0KntTICAWBC5kCtPQZ5YsWpS0V1uclva1VSqOhYLIsrSQQCmkqyDSGJUChIrX4Z4cwLchd9fCJ5IZLdp1oOyZG0F45KV1KWI6uAqKYjuSTIrd3rSBLWKJmnUaktJGBkWM1IMkmY0GnCtfgKYeiIv1Idud9LAbiaymiFrIO3HanUwD069OWRH+KnyOFJKqIrfPNcdxpJRM8uoGZqrGAx+mtTXP8w/jiDJjBdOydyKYpMpiKo8QIYcyAxBqG4mvHEXqCY0zoXeLT+vOUXsxFzE0JRRTVTJjmTisaEjNIyvLV45EYEXEhCLKK0IDZip50wNwSQNo2uNEzKUaKrXNzHSgpyCk1pQfjiMkhLIzMNMOm6nlYmUqQQ2ZAq2Vcjwrl+GE2SSH3Zc3v1/TQtpEytUSVFaUrwAz48RjHyGdDjskRcSqLgRIKBYAYyyvqrWpA4V5fzxjk1h1ASjtJ2pIm0SMylkRCKkcCKP61wEgvUkrkHvGKJg4SRetkegWoHxwxSHqYoNci0MdQDIKikjGoy488ycsIQAIYhJcFSkYr0RjoIOVKAfiaYAOoIok1KJ5m01iiC0j1EV1lvQZYYIIjlKQm4kFbksXZyD+m5FFLA55j6cAB1EBVpG7So+h5EToZqnTpNOByFefDEQkEyRSTOzxosciapCW0oCDk9Qc2rmAcSQBEMscyyFmY28j1uNKihOYQerVGZwACdlVZoLmJY5ioWB14OFAAGsUoR68PU4USI6O0WkeaLO1QxvBAmcg4Bq89PI1yxIAauCszEpoU62oNfAmihqUqeY5HCJBCSxWxjYxmWKcMZkVQ0kfcyCgVoTw4YAg9I69pSyrHBZyBHiVdDAt9DScatz+WAAxxbxt22VpdTAzy5jUppQRg8SWyzwbgcWqNbQSkyxWzFI3RSNTsepXBJqo9fwGBiAtKitGXMrRoHilIGtgyNUUBOSgHicEBIWzHQDE7M036kt2VanCukrxz5+uAYNKM1uFZoXnLM0gzP01IPGnDIYQBIkEhkQoitGqRrbONBIJGbVqMjxwAHSsdUuoootcmnUV1ORQjKnD4ccAgqJtAEzRSvbhe53GcDtMaqTU8RzwwAQmMzsvZDaaiR1fJaihkrTiwNeOWAAEYeRft5mYM7VtZw1Y5fizHKooMsRAMi7qRmZI+7Kr9jvSkKQQeLgZUPAUw0MI0ntSu0xijj1JLM/UjV+lcgSVHL/hgA72WQC2mJaNlHdumOrtmnSEK8Bz+fpgGdBQ9hLgav0BFGiUKnPLVXLq4k4YmBkCoUkKiAu9HiWo6+HSTlTgCeeEEA5IpopJiBClwpbOtA6EKSWOWkgepzwAJSqEfcfqnQ+l30jUqMtCRThUn5YBh0olXR3qGRWKQvER0hVAWin+ZHHAICiFiVKFZoOq5Q9ANc1JLZEtTlgAILNMJpwjDSgaCAJo055luRDCpoBgQBk8ocqQO8yIrOXamskiqVTIgVrnXDQgMo0OJOyzSW2nRZk6hn9bHSKFc/nlgGCLu1wsDKryW7lo4SwJo2etSMjQUrnX0wJiChokuNU0velcvVCNLNLWh00OS+g9cIkFDWUjHclttBKPI61oKH9Nj6HgMMRXDvaojRkND9s2sWdzkCr82JNT6gDgeOKalzBLEBNA8Ia3hiTWjgEkivUwNf5H+/DIgreLT25kRFukdRBJISaxuaMCAaamp+GAQekSpIqRq7wK2tqNQgAZqDxWnH0wxhYZJFjpF2rW4JdZFFXIyGlganI4BhmuFWM6gPKw7QhFdLrwzzFCB6j44CLC3EkJeUrG0cWl4pJB1LwHcqK6tRyrhDBsz6ViEiytISrqc6VzYaswD60wwOmVQWkZGt4DF24SOJANOun8sIQIJaDtf5pZGiyghFU1ZHUQeYGGAYsiRRR6SYoZCwknCsHLnMLQcsgTgEDGhIlomlSz9xK9DM4zANBRRhsAwPCO0JW1Nb0EtscpBUVpXkKZDjgQzqrMzvBMvdVkMialDK0YWoWvDLMjnhAcBYCCaQ9qSQ1liYBe8GqoIA+n6aYCIfoCrDRY2RkMc0MooBWlKHgQpHHCJAcgysYxAtQhkAJ1SADS2eWk8MEBsCKM1EdUVogxV1NKVrkxFaKBmMABbSd1GaNKy6tCPQ8lNNNCKlsNCYexVNcDStGCAIpgDpDVrpelRXlgYAGTQQCiz6AywQCQEazWpqAfXIHAIOVqRyXOrWpottDIta/KudDzNOWAYFJGiRppH10eqxKNQdgMyCaVA5DAApEoWUPrN1J29MJYZNqoSeOQFafDAB2J1MqwPMkrRgaY2XpZG4aGJrl/54BBaK0YknZNckZYC4rVKL9QOrKgrlX/AM8AwTIiUhS5R7d2NEcNpj0BWA15kmv4HBAj1W7aM8RiVrnVbaGo9G4sRmG+OeAIDaLE1P8AqhE+mQ6/6ay5gV4mvqcsEjD1Rm7SOy0VT2J1ACyqeA4/+DgEgGgyuqyBV0UjPb0gMRnVDlShzOAYb2DQrNLoZzWPPJolHFiSfpNAAeOBCZ51TuCRQbRFXuooAVnK06lGRowGVcOCJ1RM6o7KwkALwyAimgrUhqZCp50whpA40gkYLMjmRAjSpp0tkAf0wTX4muZxIGgMJVzG0kmiOItJHJINSaVI+o86E8uJ4YaQQKkR7hZgrAzyt3lmZVCEr+VyOfCgyzyw4FKF8UV7dghrVmnXS8wjHXXIEioGRHKnI4mqtkHZIk9j4jud5GrR2kiyW0qxCNchqddIIrU1pxGLq4iu2ZI0X4PsD2G2y7YLnXoiM0LOQNaIeojTnlTjThjVSsHPvfuY4T2EqCUmZiskgaFXIZgwNVdXyY5Dh6/DFkCQhMbzCKyosMVyTJHGwNJVA1awDXSF4gYjMMAzvu8kKsXtXXrkgetQONXm5KaUpwHzxJBA82F5DbsxtppXjlHcSAOFSVg4UJGxoOPMYkmJkosNxEaRq9w1sHDhpo45JStCaJJ0g/UTpJyGJpkSXW+5okUn20jAyOySIsmkLTqYHgFZga4YiS2m4Fk76ssMMyfo0NXIzWoQnJq1rXARUjxDevIDbrCs7xELI6mhZ2IJBrWgU048gcJk0PsV+VZ0FxSW21fb912cUYUdKFS7MWJJ50+nAkEsforxZJCafaIGjnuKhqPHwTWUFGpUVQcBxJwakR2S6hKE95YSgWpavZdtJYSnTmo4Kq1+eIFyUjxbXahojTsjUy2wVAzl9WpSWIougV06vy5nMYjAmx1t7gUBU9iJKhTkkUcgNSRUdequoHmfhhNDVh1WWTJ1DOFkDCY9PHKrLzHICmZ9MRgaYpin/XjoyXbhtU5cU7udEXPnXhyrhQORbbhi8i1HdDMGYEKELHUV00ADczhDkl+zmKW6hRYisMoBYdNSCaayeYFcv44rtoidUzQHjFuIdrC5aHdiDTS1K5AgUAIxy87mx0cK0H9snVVJJAIJ5Z8vxxSy1iZwSo4BRRCKU+dBzxJAxou7d3LsIwaNpyzIUjI0PE/DFlWU2qiIbja0cgQ91WNNQU8AMy1Msq40UZnukirt7saghyIXK9qNY5D10AJWhNGIGR+HpjbjsY7rUp7fNmkmmQGOI6e5NDDGNEdTmZaHVVgwyA5DOuNdXoUWKZ3y1iljnFurncLmFJVWeoaKEEM0bawquI6Ehqg5nKmL6FNn6lNbvfOvaaUduOBwl7dR0FvIzEisLDp7annorUDjicFclQbhf28DyLIA/wBszSSTq+nMk07qoArVrkABTnhtBJAdxvgkCR0EMkbukroGLqAa6CTzpmBxHzwiKepE7q9LpGqublwG7WkaGSg4yciMxUVwFukEZ70p7EshWV3JE8RI7cYNaAgU4Z6TnliJGwyXdxHMLowKsjvHVH+sQRqdFFDDIHOgp8cQZKo1StMsLE/5eSVu2+hzRh6gEVUAc8RHEhMkbIWuErNHbhVkqaiVmFQ451AyxEkkJ+7bRzxdxC8oQF1I1Kz0oHC5A+mWETgRuJDOiXMhY5k2wjNfpqqVr9IpSvriLYxJ3Pue6II21wKGaLILAOHUeB454hYnVwO+0wp9yswuDJ9pEveloakcjmTT8czjHnNnHkkZYwyFll7k5fTMyABGjJqastQDQZ8qYytG1Ic0kkaeUxRmQBRDIq5gpSoZFzBI4A4ByEtOgaRU1JoJEzMNRZQKBDX0yFeWAQBegxMhkRp6q2qrDS30itOJwCDe0rIYUD1RCyMDRAwbOigUqfngGDjkamlZgGBpMhAJVeeqnBTWtOPHBABQdupJZHlggcBUJAULykJ4kHPnXAJgnQrJCXlPZho0QQ5FGPBV4/JsMYUEiRmSW3SMTy9yBw3SyHJenOrmmZplgAOBk7untyW/dqsaICXrX6eJALNmSeWCBhckaRyxCNUkRFYXMEgOoEUDNlyJrSmAQcZUWfVK3+XVtcetRolcjoP+LI0AP8cEhEidDOrxwERSqid4KvRpeQ9IJWo1muYzrhjFAUxyQwi7EbGJklkKqahzRtWWRrwP8MAgvuydszk1R6qYCDrZ1IDMNRFB6148sIApXjmjNU1S3FHQorUUA6a6CKg/CuAYYJGOtEZlMamV4iNRkkTM0yyBNMhhMALyRxJIoJXvgiS2ZNRqx4sDy5jDgUglcJIWlcoEVWSUflqDwQV6c8sAACYGjkde9LOFCOkjDKmZYDIECv8ADCGEGrHvGZY3nZnQ6KkKpCggmgoR64QwekPJp0JDFIazUGlRl0BAOFKYYgPcVYz3jITI5aVzVkZRQAEepOeAIOyStFquI0Vlt1WNp69IXkU0EfScz64AAzB0jaFalRplhkRV0gEZyE8VryrwwAA7YuRApipEUo3Vk8gBoTXI88MALM6W5kuJZHLUy0KNFD/UamRrlUenDCDcDVU1QQoysP1ppFyVjpqFKmnH0GAAyEAoiKNSTNWGM0D6jmvxFc8qYAkJjMWly8mtYUaN1r11fgQRnlw4UBwAFR6nLd52WMsxaLNmYgUIArVh6AnAMNEMkogiBYxVJRgAFjWrHURxapNBhyIAkZK9t4xVAxS2DioNebDkPjgBA4nuD9xGzuvbfIONRIyIUDmAOGAYWEFbmNqvH3FkiU0AbMkZCudRnnhIGeR0SZJJQkFpdyN+jGilFkU5HpoRUmnHAgTAq7pErM6wKzvLDb0qFkCkh2Za0SnAgn0w5EBjQygxoR3qkBdX6ZkFNS8ARnkF9MIchYcGF1kqon6SiZy1qBrA40B5HhggQeJJgzxPWZHFLa8WjALTOo/Dn88DCCtTcURhGCkr1MyzAd0LSgKjMjUOAxSi4Jj6ewIneS172kMQSikjpUkU6l+AwxHHRFR4WmjDWxEgjf6ApNRQEULYEIMuWQKX7utjGGuAuaujEABmBBYkGg9DhgK0E0V7NTVDGyap6tWSLSBTuDPOhpQetcMQGGRQQUQmGrLAABrki/M5rTgDSp+GAcAULiOSON1kjE1IfylSM6gkczlhAHs0PcVIQojQKZbSiijHNgrf4q8cApCHjYySxOZ4JJNTBFowDLzK5hvgeWGAapDQrLwEqmOPQqyMzg01EAHSOX9uEM6id6GLvaFSLrdxShXmjcOr8xwAdBjAkhlVrVW6reQ0IlGVaj8aZYYmKHdv0ygXsCisdI1AnIk/+k54GASwYmJ4bbuwrVWFaGQU/qaR6Z4BSKJYhUhQ7pOCGac6lWJ8lrQmjV5DlgHAGFqxh5FBIXtUqpUfEg8FNaEHCHIMyI7wKqBniZYygOZLVowryypThgE2eSKMyhmSRA0J+6YMCC2Z0uc6KePDPCYpD45VjRWeJ46GiRRkDXIwNQWNOgCpB+GJIlAON5Vl0owQTlwHoelicnIrQkZVNOGATDYCr6nWKKFLpAltIoCqJCdJDCoBaoqCM8/jgIgFBkaWJXWVo0dY4y361agPoPALnQV44GNHGUBEghld51VaQMKqprUEgjJgDnQ4BJCmMMxEkUGh6aNDHMMSRWmVAM64EM5oWRZ4p2+4mjqWijIDVGR0yEChzpQYbEd7lFeKRO65UtJBDxaNKhSwrQ6eY54QwoO32x+4h1wTEMxGpY4Gp0swrXMngOWGRD5eik9zXVE5jd7cr29LCvS1eJyrgHIeIrvXLca4XSNg0kocBc86OFqagcMABaorO4SUoJAJLRjkSKDjUAYBgbh3kjVDIBI0gMoYDTrqDXLLURzxGAZ1o4jruAg1E9oQ5N1nPW6serLj/HEoEH0o/eMJU2yjUgJZloDQgnjxHHhggAoBp1mMa9qBMnlkq6GQ0FTpNSQRkMTSkj3QPEWyXlx3LiS0UtbBYpLhoy0iykU6hUFgwNagfDFlcLIWypE823wiae4ikJuBFYqutlkEh0nNsiaqSSdIpli+uBlL5CLO2f2mlYR2m4WxiLlQY6qGDsASWYVy0tXM+gxorx0UW5Bb/j/s50rcRwTTCziiZ4Jk7bu2ecQAYkLypi35KRmtnbLr8a9mbPRaRx2gtpAO657akmMN9KkZVPHLnXEoVRK7cj/5p7UbltWyQeW7LtiX+3ePX8EW+kBVeO3ugY2yyyjDhmzoBiq11KRXWtpkpzddndJIYWgRYlEiq4CaS4qQ2eQ4UyxKS2zggG42ixmR5Iyr00SwRqCrnUGdUEmk151OExoa5BOWIuZB1AxiNkcyuT11J6dWQ1E5gYEDOSSNJDFHKG7l2DpdqIupK1IRXXJxTIUz44SYhyjurm21P0EhCxYFDMEyR6aTQaRTJvxyxYhNEgtL/syRLHIkdxNE4eWVdZVSuuMFSQKnkRixMgSyC9IaVXjktAsSukgUUjlKgN3VWpUgmtMya4aBtj8m5ySLEskmmS6arpErKzLTrdjSjawKVOX8wW0LuH+K7iK28txHEkkis8d1RaIkOaxaNJJNDUsc/hnh9voFdSRxXOidw8DRxwwlwYxVYA1KFmP0rn1UHDhniLRLoSK2uNLRsup5Y2Gicikq6R1s7ZnTQ06gABQVzxGAT1HiyupXJlR42S3BYd1axEA6lWg4BjmQePxGIwSkfUmQsn22u8kDhppXGbu1SFDmhAFTkKCgpiLUDbHdZm7jid3eSOs8hEnSFINOtahWNOAFNOVThRIJi2CczECMqt2QZWBGUYAIDIlCWVhXMfjhQTmR/hUNJDJ23SSTOKGLqBrw1ita5DI888QegIsDxi3Eh0MgnjZAuvIuCM9JJNciKZYz5di7G9TQ23Rdizto2XTRBqFKUJFTUY5V3Njp0rCDGYtUFlC5Uyy40oP7sAN6ns2y1UBzFf78A0wLRBmOfA5Mw4n8cJMTrIx39tVGQP0sP1TStdPBGHP4Yto9Sq2OCCbrYKI+0f0g47dsi9LJXiytmK5njjbRmXJQp3yIW4EwUxI8TF4XPSQop3HBKk6wRUilDjdjZjs0jPfl7WDrcaZS8sUBCNGeuLWgRe4aUatDRjmvDhjZRGe7kzN5XuYuZb1IzHeRxRr21miUNVaajpX6dIyFBnSpxckZbaFNb3PYFZS17pXSRZ2aRsquqGtaAAVT+JwNCqyE7k9uryzwyS3ZcK8feXuPEFHVLMtNIoeNDU8MJkiISB75oBa9B0yG5ihQCMR5HU1NVK8ePHESxDPdW6hZJ3lga5CnWLcAhgTRVOefDOmE0LUaLqRxdao4Y4UGk1dTqVqfWSM+dAtcuQxCxNIaW1S6pJZo5o2Qo7ShlcHiVCVyHPPEJJISBHnjZZ4KqgLAE6Qq0pVOH1Hjn8sIlInSB4rd4wZpBNECxde320bKoU0J9MjiJNuRSLaZozLNcGG0du2S5/UDqv0KOSsRlU4TQITyBQzWtoAllFEZftVYa9NRUOTUGp4A4qsTqOe2yNb2bmNRGt2DJJKjCkWmgo68SRjFl3N+BaDxGV1adGRRYVSP+iHK1UkVArQVIOKGaUGIInZZAhjlhol5D3QNOoUGQz9aKMIYOJleZoELmEaWZloAY4x0lBTmcqccAHleeQyQQstZdThWGhwqsAzVNDWlBSmATRwNEEZpEIgt6CzjP1h1NTmpJFa144bAOWUiGR9DF9LJLEaCOX8x0gcaUpmcAAG1syAK7MgULCp0rNWpIUCua+n8cAAtcMToFTsvHQwmlGVTyanp/bhDPI6GV4plMrrnFU6QysdRYNSqkfwwSByNpi8rxTGafNpIjXS4NAMhxoPjhgFsvaKxwypr16nmC6gjGnSdRBryFeXHCGHN3ZIpFe4KwiRltpcu0GU1YEUrXKgC4YgDiWfQr24iFwQnZ4uxjGUjPxX+fphAARrgJIdMczAvS4NE1ClNDL8BwOADqTi4aK6AYtEhidWC6qU0gk14nI8OGAZxGkWJrcPplRWlm1fnQtQDI16qVrgQjyITFE8TJJAihnVmK6AD6nOi8B8fhgHoDclyGB7iXCaVhV9dUrma/wBoJwxQF0OifsIaQMU7jEO1OYABr8BgAC2ontQmRou2sbaqlo2fMtQU+kA4QwppIz3o+4JomIFukpOh41FS69IpmSaeuEMHENbpWfTIYQWXmp59VctRpUYcCOpKULSxalhVleS0FA8T8OhuJyGBAFJRI7qrq6xP3DakECgPA5fxwxgn6ZDcPSBUTRJ2+qhJLCM8jyFaYZE5EoWF20NMyMJCC2oFWWpRRWhHwxGByc19wzyWbsyOECRK+pQaZJpfIkEUywDQTMKvFE01ZkrWUrlG9Rk1TxPLAAcIwJZJTGxQjtyyI4aRmGYAZjUZ4YBcUglhZJGD0IUzx0MqqTXQR9ROQoKeuEASjuCUkoz2qPoRxkQ2XS2WQ51wCONE5jYNM4dHBQlzpXLgtakj4DDA7Kjwr0yCMoolnVlHUr8wvy/lgGGtLLJK0aTP23AXuS5vBn0iuVKA0FMAVE/0tFrgeOO0BjedGqglqSC6kEZjCZHcFI50mJIgneXVK6UXUOA0VNDwrgGjzNHDMA5aUoqm2AOarLkqvU8Qc6nLAOQk9Ekixx6+1lbx0OruPwVXNa8zWn8sEACICvErzEKshFMtTS0qUYippw/88ABUUjrO4K6TcA9q4ORQ51SSlBRQKEYAZXmsntrHcmJ2bVdTUH1ZAdbAGoGQHDFRYdUu6Mlt0tbs3bBbpcIK6gACKV44YjyXCRtHL2ZCs0mTSASAkkAUpXI+p4YAgBGIYopUZe5IZyJw2aKeJIIypTLBIHO0qz9pZtFxLWslO5rkYagqtwoRka4JAOjmhWMqqIYVAjmt66WdmzB4GtBxzpgkYOVnkkhKqJe0rxNEQwRQF1K4NBX14U5YJEFxot1DBb23cRZ2MgebIyFBloP5SKVr6YAYYJWjRJZVKywRtArsagZZgNQ1+eAiF2pEryBQe8rMVK1SkaigYE9NCTnnhDDQytCYzCiSIyXEcirnJnQEmmZoacMSAUiZ4YIwUVZUbTOCfqYDgv8AhHxwCZws8DSNpD61MjmoYK1M6Ajjny44AAI4CxQmR45KlmnKlUDctJ/5vhgAURPrl1SQqZaFxqYaGUZHOnH0wDFAWNzIJ43jkiZu8ynpZtPSzL+YZYBgWMDNGHdPthEFNy40alyNFIIIrxyzwQRYYXlbuxmNYDL/AFEGREdegk1NQMqjjxxFiQE6giP1XFuwJiWKQKtFHWGJzoSeHLDJA2uEjmW6h7kkjJWJCgC66V6B6AZEgnADBMYtTnQjm4I7WiQhBICdQJIFDxU554aIycle3eMtJGkZhGu4g1MCJB0qBUZpXh8a4TA939cSokhXul5LhCSZAFIGleZI41pQ4IAMrE7xzogjuJCIZUfr0rSuQ4Z/21GGMFpUojSDuiGft9wmj5f4gOI/8VwCkGtxG5dYVe67pVXahRVVhQowPH51wxs9GaW8cYJDW5Peg1E6SxogNeI5Z4BQHaiJopoBEVdDqiBADOwIc0b0Arn8cAwP+WRDF2BNI1Fj0hhrQn6wytRvgMEAGOsnZmhc6orZ9QSWpdowCWz/AMNafjhMAFFUR6VRQ6rIHoZIwhqEDfGhFeeJQJi2O3VqJIizLGGkuXVWaj5Asmk5Kp6SCMEMj3JIfds2W5nEZUqJbgIXvVeoBIIWNjwUk1PVlTGmmGSm+VIsPx/wqaSOQPEocsrlkZU7hJKhi9NLAGn/ALmNePima+cuXa/DbO1kWY9tbu1JaOZv0X1ovWpJJqAcloDXGuuFIw5MzLr8f8Vs5TaQASRBdM0qrogkZANRkYMuaAkgc64sdUUq7Lq2LwyOZ2ZLd0W4dHaCNUHbdiMqsQzLSh4Z88V2Zak2XBs3hsNtH/mURpIeglwSK1q5GStUg8sq4qd/QmqDtu+47d49bPHaxo7939M5MZNQ1FS5NQRQ58MKtXZivaEFe2vuBt+/xedeDby3dtr6xvdys3kAEcimMx3EdVpQUoRXEOTgdWrIlgzKGjIG4WkIgtEuLdtRjaSOSPQQIwNIdGArX0NePEYsRNorfdli7LHtvev3EW0J1VURgV1swK/KpwNESHyxzmOK4EzM8k3cWUnSdCmtEjTMEHiaZjEYATSK8okk1LJHPMD3JTTv6DXpX8tD+HLB1Gke1x6mNyHtzIjyyPKwaVa9JV+2KhGGVKU9cSQ2hSlzIbb7dWWaSphSIKWhkVaPw59QpQ8q4mtypkngvGKGl6bmGOV3kjRu5qrlUvQMGjJpQVoMsNe0i5H6yvW7aJFesya1VD9c8iIoJVVOahK1GLdCKRJ7OWVGV9aubqTuCIKyxFWYiM6iw6iQa1oa58MEj2JFY3N2ot40vIRSYrbvJqDBwoLDSdRKgcanEdQbJHZ3dwzSyq80zyEoaFtRIoTETqoQunMnIZqBxxEOpIYZ5GdQE7plFTCjUj1aaMwbpWnCpK5UoNWCCcjrDfgSRGNhq0B9M+lQSCaEA1PCtCcRdSXcPtrKolaJoVik0mUsW4rTV06KcPhyriLQd2g/Wry3SOgABRVKDJJDECTqZyB0rT+NcJkk5RLNvhVmAjX9YsDMgPEiua8zxqRiFmNF7+HbaZWjqayxlXk0f4APjyPxxz8+TtRtw49S15NKqavRaDqrThTHPg3twInl4IR1PUrG1KinEZ0yPPE4KbPUPjIJJbqZgBTMVp8PhiDLK6h75I9c6DJqVp/7mEWDTf3EcUefPS1TmEJp861xbSrZTkZVfk282kAmicr9wKug1ga1UjVqFRlQ+uR5Y6GHE3sc/JkMx+Z+W20IfuXI7cah4pyn9BmqYmKn6iTmBnWnpjp48bRzsuRGUfL/AC64khlid7i9MTB7oo4TSTTWhzNKgErQUp0njjXWsGV5DO/kHkcN3dXLm6kSG4OpLlx2WKZBFDio4cQTmByxIi7SQC83W8kklWSaGKO7FUtmNYXiGVFGmvXkDnxz4YVgqpI9LOqo63AWOSRG1zswUgCh7WQHPgPTEGy1VgRRSy1intraX7qar3M6yHsBjXSSQcl5UAOEic+pHxKv3MUc033UenSIBk8Va6pBSlWJqaDgOOEw6DdNGZXhi78qQwQGS1nZerr1MdYFaNnzOINNsAM1lJJIjzdoT3CltwCx17kXAUoacB6ipxBoaYRKsVNCK8rqqtF3+MgH0yIo/nqPywiYGsLPG0jI6xw9yOWRqr0mhXIZ89IwgTG25u5JljHekS1nj/SaShcHkSlPUf8AimIMsTEEVBFbwToI9NVhkhfWC7Gqow/NSvH0+OK2TTgkVn1fbPIYm+2UtJFoIjUg5q5Geo5EDnjHm3OhgtKD4X0Ms2iRlaWSZw/1RyNWjAc2IyXLFDL1qHd8ztWjn7eMMERtLtxzctRSa1rQ1OAGKCkZe2ozPHp/QWOTSytXMUyBFeIwAcMszhTLMrrFWGW4Rs2YGgYUAppOX/HCGg1f8nIjBiEppVStWpQUGQIAJyzwAejLJ3mVAnbFbfS6kIGPUxNKN8BhjPJEsiMK96tSXQ6e4AevMVArwNMKQgEXMqd1IiCmbSSnJzUUiBPH4Z4iOAMznXFDLcNGrFisB6qBhTt9yn9Qk1I5YkI6GRRJalTB3QxEb6ljhoCpVipJNQTX8MIAgoCBHXtuhBt1Iy7Z6aFgTVxTIn4YAFk0LXEcqSRv3IIiZdRXSxbnQVOv+3D6CCUaeKOCYv35JU7TuwNSuRCqzEmoGAZyNaGTVDL3oizCJCOpXrSo4M38MAj0tdS95QIwAGlAzLD8r0FcuGXrhDPShKyrrl/RdjPbSDqIYUOqoJC19Pwwgk87N3VQxhnCkQHTUKiigLE58GoRhwCC0hlY6HBkgnQs7opDLxooNQMzy54ewBYEIWSURul3MAZLWPSBVTRSMh88HQYZrEUK3NFnC6kumjota8KqcqnP+dMIDksjsheUmVEHahkRgGUsMhWmVOFPTAB5cpbb7cn9MAO1AQQ4pT/mrwwwOR9vWzySGN4mHdiCElSTRWjB+HE4AOjusxmNJCsv65rpZl4hWA6WFM8vTCACWZZJmCorO6lZUBXQQDQcSBQc+eGEBcjRJHcPF0lJhWUgRLGcjqpz1H4YARwiB7hXZWZ5DRaGikFeh1YUAPrhDAxxrFNGgJq1EnlK1PcrVBXjTVhMDxlMkdrKzrIChjjmyqJx0sXIzLch8DhjQWvb77OY5BLGyhFqCjMTRiRTLngAFQo72wkGuM1ZZUMh0io08q/jhCYSLmIhJ2LxEvWS5oGAcVoEQioXSfpJH44aBgo1KtHA4VoS6uVDEuH0khzXl8PwwAmdj7QCsT3ZK1TUKPLU50A+inChGHAwDsyCQyrJbozAIh6xEGOXUKV9OrARYP8AQWaqpJMA2ppJQMmoasjcCoAyphEokJiieWJIE0XQdwiLMr1CkHUSTWta88sMizg7sJnkq8skTPCoyA/UFBkOQqDXj/HACCkVIrmFVFQHCLK5yMoqaNQksOFK8MIch5NwVV5o+6K9OlxqjYjhRTn6/LAG5XL642vYxF2NaA11qQtFAYNmRqbKhxSixhRMQjWH7gzyzxhXjVaCMR/lUfjSoxJCYaJY4I7du5+kyFSsedZARWp/wgfywxAY5JqTPLC08UoDSRwKAvSwA7eqvEfURgBs8rRor9uVkkfS1o0A0ghsgD/iIPHCGDjISW6Vu1SPS91bnraQkVAXhQVOBIR7Qe+8zQwxBQQLdKhdElS5Zq5haVNflggcg1BV7x++5QII0n01GgkadSDOp/KF4c8OAg8YqCSOLuQsxEQQ5s+nqKrXIeuFAjrt+iY55gzHQoUEDQvBQGp8MwcCQxYskjsDKEuDEoaUaqMM6KzqPTjQcMSEJ1hnaV7rTF+qRFFHWtajJky6iKH54QBpk7bKYKLNCDWOVcjozqPjgBhhlYpG8gaNULUSeg0pIa6mOXSafOuAAw9pGJkImetEdqdtnWuTac108P7cNhIBANRUBHdgHhaXqUsF1VU5VA+OEPcUQl7mKSRhoMhOkkA1cUr0ioXLlgQMDIsOqOJGWEvp7wZWUs66tJWpzwmRYX3EjUASIFWNY7lGB0GpqTXnU88AI73pUIMKSMV1LbyyUKBciRWgAqeeBDYdWOUi4ZmcoRG0YWgTmGDGmla8cSREAdMkrSyvCI7oMdTCgZguaMa/TUVrX0whwK5As81Asj2zjRcBQAVYAaVLGhAUiuXLDEFMUYmqmMANbwADOXUQFapqCSTxwgFTwyESW7RKjQjtAseiQAgu0hGQ9Kg4cgKJZatcP32FqgAelF08hQggZZ0PL4YQpPSFUcXAcvK4oYGT646Dq/AZ5n44BiaIRyyKFQss0QMSqCNaIa6WJ4NWueAGHoQHolftrhjAluOlQrVLZgtpYVrlhpgGrFIqzoraomWsDyqwYjNaPlmKcB6jBI3oLLWykk0rBCbfvrECwBeMoRkBTnTjl8MW0xtlLyJFjbN4Q8rLNPB2tZZxIvUxodKgKKkMaEkHKlTjdh48mXJnLe2/xi2s0jUgM6lGElSsj6yS6yEkBhQfUMuQxuphg5+TOyZW0LOs6WsbQrKhS0LoorHU6gq8CxAyoc/wGNCUGb5mpJds2261Ax7fPMsI/XY6ZDGyZMArU0KVp65nLEl7SNnJfXiWz2hpHeXMsEExMi9yMK8armCXaoyOK7v0JYrGidl3DbbSGA1rGkemgFXGs5PqACsa1p/xOMlquTV3oV7t5bb2scLlwTDr75QrRgSCEapqCDm1eOCuJg8yM9+X+WJfiYO1Z5WLAkFFYii9AX6RlTjT+3G3HjgxZryUsN4u7HeLe6AdY7aYW8YjJAUTLpeNqkcj6/hi3LVNFWG/ayebtABZSrPakQ2sTSVMrBqSKtEJOkqTw+OOa1DOonOxWF6oneRGMzmRAstsKfpqBSNaVpkeJFPjhajcELuYZVmQRDtd0aorhneQuR9SlFr0OPj8MDBDWYk/URoW7oiIuGJ7eSsCNAOS0+JJpiJIDK8J6EuB9uys6dxULs3SDHqJBII4DhiSIyOcIlM1WE8EE4ZWUUDRyoMiCBp45LT5HE6lbY62rxIlvLIWMtwXjtiV1BJqkl2bTxYHMkafQ4lEEGx2tz+mq3Z733ETRiCtO665IyOFYDSaUAypXEhJkmt5IooTJFbyxpdSD/JUDdtqaFkBfPIKWBBzw0NNDzZtodkSCWB/okkBoWkU1EpkAzb4E04HgMOEJj/FIO3E8crSRuK3kagldIAGrSoKijAgVHVkTnhBWR/tprY6GNw8iTlYp4MwHUHTG4BI+kfUWr8MRJslFuySGMXdwbXXqSLSS6hAwrG1fzGvHIDCaGmPlssVxDRYaW8imOyrISKggkkDKudQR/71hMbJXt0crtbxyGRqoWkRwBIzpTSV59JXMUxGy0GmWt4xtTXdxHFJFq7JpEFTSmiQ1XJQaFScq8vljLkcItx1bZpjaLMWVogcMZWC6jQA0HyA/hjkZr9zOxjrCCrq8jo9WBXttQCi6SpoaE8cOtCq2SQi3LzMCaFGbWlc8zUFa88SagjT4h9hjKIqtmxHM1/AVxRZ6mqqCbq4SFCXIVa0FeZ40r60w61kje8FT+WeV21iLhBOqMzKiGRwY+4AdVCaHpH88dLDgfoYMuZGO/PfciyjlktDfrcKtEhktWKmozDahkBUnV/DHVw4YOXlzJmVfIvN5Lm512LyjtS6WmtpgSykESsQ4ahDCorX0pjXWsaMxu6ZnzyLyiB5JLmGYi6CKjzwuY4nDsGpK6aQ1adVRTkKZDFjgjUgt3us15Ndy3JDSW7lbiS5kk06K5sjiqkHJQKZinHEBx6CaM28isZYZIomkLzXRT9No9NI5JFC1olPy0J5Yg0W1OSWthGLckTVtyDIzmkjAkoqssddCHjwrywoJ9wRPNNM/wBnBIloIDIkVnHpEIYdQZxXMEGoX1pXChibGtLK5urqwazkeX78NFLD06ouyQrVdclL6hUemH2i7iQWvhkknYiiQqo1TMJA8CiKmcqjm6lqCvLlgiBS2GXfhzBC0oEKw0NybohFlLL+l2lpXIU6aZ88RdSaZB90jWPvx62drcD7+ZY9JkV6gBxSgbIcOGKbE0Rm6kS1tmjCT64FEwdhqiCkDS4kGRNCRTEGTSGHtgIYIG0/XcHMDXFQdNTzr6csRJJieTtx65Yo6G7TvRW4/TKstAaVyzz/ALsRgldBW6X1wgtbm2lkghuP8vdmRaRhoh05GtKrz9cU5KSaMOToM3/cd/FC6NOCtUhiAbWzhT9Sj1HDFLx+w0LJAQu93hWINeUjYj7dQVKgjMo7AHTXE/lA8o4nyeVGETL3RAzNIsZqAyEmin/Cf54rtjJVyIe7DyVCyTIRIiBpJZPzutKKx4iqn0xB4mixXRI7Td4Z5AiSKBcRCRpGK9bV4vkNNeGQpTFbTJJpjnFcBmtyJY1R367dMoy441SuSEDjXjiOpKQzTFXtoRDDdGoUjpEy1Nag1SlKdWRHDAkNMFNIG+4RkpFCVeSJC1M8mkSSo9cvXjgHseIlkMfcBlnhTU1sVAKLToqrfS1Dx54BAgZZkWJWPbeVidQ1vCKZhixzLca1ywCYFtck6OX7scRAuZI6LGBSihATx9fXBsNHJFjWPtSs5Vqm2ds0INTRmrUgcPngkDydnuNIZJEeTjo4qAMzwoTQZ0ywpDY9QtK7j9MSoyhQWqqngzR5MSPhzwAcnkZF/RkWR7NQolJoCKfSQxzIrUmmGAa0crfqoGTVFWJ2ozVpkXNDp/GuEAmhgobZ+80CUd1kd1NXNdSpU0NaemHAzjGNVWGQFpZH1RwxODpY8G06h1LxIIyywMAKvQTyuZNGkRSyQAuBpNEKtQnMVqTzwhhjdCpJG4kZFAWVq9nUp00IWmeYrzwAEzaJLSMRSNRKdiMrSj8TWnGoyzwCDSaOJCjWyxAC4BU0WoBCqMxTiKHAAWpMMpaUBWtyDG+YVlbNdfHIA4YBZRhBrMgaUy9LoOogipFAeBywgTDEZddu8MZdLVCWY8dbVoACBl8OOGMEqtDJHD2ozPG7ssTU7ZqvWK1qKfGpGEmECcGQxzvNEojkAaOYkaqUomgDJgCMMAatKxVFjRpmTrkFQRQamdkqCAa0WmYJr6YixAZTHOqXHcXtqoa3jeikD8+vRUKRypn/ABwEkCMn6hCSSCOWEsgfMtKQAATxAoPXBIgMRaQLA0ul5M7aR1JkqmZUEAfxOGAVqEaMNPcIb/NSijpUZqzqaBjXAKAEYjCpJKTGwOtGkHVU5oPiM+JwMZ5AAs0Myd6RqLcgAB2cAlGWlKUrn/L0wAFNJojiWVz2yT2JgCUqMurVSuYy/hgBBsmkkxtCkiRiMLIJR0AdQ7dCKjVWleeAe4FphI5n7sgaRe3cMWAd4xWurqpSmVaccEiAwyELJSJmhkkC2xBpoyqTyqAQBmBhiYnZxouI51Y1/qKxqA9T1KaV+WEOAZXVKvaZpGtYh2o3XTqVRUkFaUyzH/DCGV/AixarYXGlcmZQurUi0bQrczq/LiCLGcJWN3/y6yPIwdGOkMI6ZGgAGVMxx9cNCaC1oj3EonRKLrubccCxpUqOYAyFPXCFAdCrMqKo0wtXuWpJIVWGTMBQ0HwwxMCqvplR5kmt4i8gVD+nX6RRuVK/jgGejSOKOJ1g7k5akRkJUqOJIzqQRlU4QHAEnUKlxnCpMQQVWlKgKStCRWmZ+OCQDUVaNPJEYViAQRq4BWYj1FKkc68MMGdAWCFbKZ3keAnStalqEVKGppWvH0wCDEC64nkZdM5kEsLlWMs1PpJANSOROFA5DLVSAJbaMW6UaOErRZQ/A1J4lhUYcAAV1aLtB4ilpqkuSuoVj4UWvzoaDDgR3QkZc115GNbYApqUkEGrfVkeOEIMMKowjeRkgjrP32YMSzZEFeBHBcAAlIiaUCKTt6zSNfpjd89QIJoDX82eEMMEKPotokLhOi4mqF7YNCTHnQV9MMA1Iqx6TGE0kII0frYqCQ2XEgYJAMdmkDR3DRSlRpgueICrmFcrnkBTlgEzsdxHonKRo6SAstszEEBCAakih9eOEI7GYop+uVnDIXLHSK6gBRlJAGfLhiSGBWRtLwCf7cBTogAqvx18eHwwMiHRyK8SJJHC8hLUUgMhqKlqfA54AQX2l7cYi1PGCYZZUahk1UqoGRHxwhsMeGQxBKlZrUGRATVByQCgNWWv8MABrGTXFrP2wWJu7PG2kdQAZlB+OVDggD0JmRlKKkbBmSIEgK6HMJpFQW+eAQpjUGUvRmXUSddRIjUp0DNSPSnLBI5PI0naemubVq7ir0stDq1mppyy04YMHbIhjWFF7yVWSdmfSZIzUHLgpB4/iBiVatsi7QTjb/FpnCNNTsTap4jCxqCc11FslZVOYHPGnHgbM2TOkWxt+yWFiGebt28MaxyWzIpEhbgFVG6aAfU3qDjo48Bz8ucme0pczBV25DGaKwkjOqSQ6BqZaZMCDT+NeeNtMUGK2Ys7xX29ut4a1ISaO3WRVS4lVZSCT1gkNnQDJqfDFzSqVd7b0Nte3f7d9p7EV9f2a3yHXoWRNSg/42FeVOQr6Y5+blquhrx8V2Lltvarxq2EcNxbWsoRtXdcLVkNSqlTnkeRPLGb+pb2NDwKovb268au43Jt7V42UCOgKLqXpWulqMAKmnCpxH+oaYVwoj177WWsndFqvYluVZXMQJAapoTGxKkGh4DliyvJUakcmD0Kq8k9pfIAbefb7sM7Rt/lpVUapDyByB1VpRh8caMeZMyXw3Mx+X7D5LsT3T7vYNFJbyhY7h31RihpRdIFK8RSv4Y30smjJdWq9Ssb6ZmnlWKFE+p5Nv1FqGmcxU5ZZ5hudRmcTVVBBXW6LS8UvhvXjrXlxG0l3AWsZoSO6qlBSJ09ek0qeHPHPzV7GdLj37iIbzY2kLtcXUiwSIru8zSaRI6/VWgrWnwzpigusV/eRWlutrAySpGOpHWQnRUZFWBoFAzAGBgmN1ATDCjF43BkjCnuIqEfnYVagyz9cRglMBtgkl1cxqY1uSFKNHGScicm1MBWoFKVxOqIWZYEfiElsCbiQMZtYMsSghwSagrUKMsyBU0GLEiptgZ9pu4W0NN33kLQNNkE7KU00ZaAgEZqBUnL1OHEg7CiJby0mlkMMFxG6jv2un9QOykVQA0VXA/AYlBENtNI7Yt0aVkABErikaA1MboWJAJrxwwHu1miEQlYuIljIitO3SQuqVEv+GhpkOdMGhJD9bTTQmIspTv1ZHgClJGFAB+XJRn8TWgwDj0H61nijEVxPD3GidyJSuoIoroAAFWJIoFGfPlhQRT1JHaE28skOrQzRlnjFGyYA6ARqIZs8hggsZJ7ENK6i4c96brkghIA0r+XWXAqp4imXDjiLFMFnbBZSXEkEUbHTpiNxEulpKEdNAaE8M/78UWsXUUmn/DPHuxDG02l4ogSlUKN3K1oDU5LTHL5GU6ODF6k7v7xIYmQEl6DUoNCK505caUxjpTuZoyXhQhkt4Z7qQMKSRSt+prU9LjJwRnll/PGizSRmqnZkjtrNIctK6zxpWmXCg+WM97SbKUVQq9v7exhZ5XVKAtSuZA5KDnU4KUdmGTIqozr7he7NhtMFxHaXMcpHcQwxyhpKuMkYAaggrUsOfwzx1+Nw29zkcnlpGB/c/36u5V3K3sr0CSeaQKEfujtaPrGkErmwBzJPrjrY+OqnHycl3Mo3XkO9b1cM8tzLPtzKFkd6QhYzmQqjKgP8c8aYgqWvvGTcbi5vCLR7lHFuytHZWp7MUaipLAkVLEZk1rqOIMbIi81kjzv9rEYY4WeWNG7cpIQBmaRsjprSpNK1pxrhMNkMtwdkWF0EbyGBTI08dC4p9CGM8afUcyPTjgbHVuQEqbbFIHjuZYzIrViH6ayOpLaak1QED0oORwi3uBO7Cb7iO7Mk0oD0EgLs9OlNdCFWuQoPnhArApbaVjFNd2xSjq5CuWW2NM9BHSxA4fHEu1EXaSWe2+zQy7haQiHv9jdog0kNIQkV4RbksGqG1Oy6qcMEQNM1fvmy7Jtdtex3UNsl0U1fZOQWdlCt0SaaUIFK1/DEJLpMw+ceSWayTiZER2fXBPDomaIkFlZQ2kMTTSTyH44i2JKTP19uD7hNPKUfuyFxMiuw0KvUY6E0z9cUtosqoI+5/XaKK4/yaKTZ3D6ho1HNQqqag0ritlqEcbrohue2ZF0gGRepxrNGrWg6vyjEWyUBbpBMYo1kH3VU63iLEAkkI/CtRwpwwhwFXUFzfWm6xW8KmbQ0lsrjNFiPcI0uaAMPpAwmgWjK4F292BKphimIH26dujJpamnUBQ1A48sVvQ0pNgldgoQwKHdXWSOMVAbjqpmC2nD3BhQuJCihZJFeCNOzoTVQMSxB9dOWDtBC0yITpkRo4RDqjtl0tHQqdWoAjmchgtWR7Djb7vNHMWF0RK0YMc0mhUkRiKIQARUHjQ/DFTxSWVuTSx8le3heG5UxOmkkRgMQp4Nkcs+BGKb4oLq2TJdaXqXL6451nS4SlyKABxWg1FaUHrUYpagtTF3cDo0EQKOjMq1ClERiAxUsMzWgzHDCHIMIkjRSxrJbsR1r3BJUKKAAg9S0GWEPYBVgyn7yR4pT1sQeeYkI9GHA4QgSjtsLUx/qzqD0UpprWvGgr64bQIMk1aXjKfbEUMcFSegnLTTpFTXOuf8sIchUkkakxOmiGEh4UPT0gZoDSuZI44ABN9zPNqlYR6wyPMoXuLlVI9TUzGGhBMaNWSKZDFIgUF48vzVJJb8x5nAC1AtQsjQxMsUjHuxt1I7CvEUBC0zzGWEgPLBDM0kMLMY4uq4nJCxVC1VVI4DDGeKNII7kRamhHdliBGuQoSUckDLpyFDmcsJhINmjt+zNG7zDLU6nTG2ptXWGAoakgCmBDQS4bTFGrOskLtrm0gL3CagsKaQFBIrzwAKJ5JoR35NESCJVniyGpTn0sKk8uPDDEBBkMqSyvHEAyugY0AV/pGkZE1wAcWW+hllQlVC5mMioYVrRgeHwwggCHkhT7lZWjd6hISFJOr8qZ8KnPAxCYsyvbuYFKEAsNdS61zLUGRBrxzwIkmHNB+lO7yBkjftRSFa624lK1BHxPE8MAM8WMrRMY4UK0a3i4aFXpZXzNa8vTDEFiIqxdVWWVKS/bBu27kEMoUilUU5muExhcJEUqurNcPq1zMpCyrnUoBz18QPhhACElvGGKa5Q/6kNoR+elGZgfzaeI/vwQAAi3KxLdHuysCsgiBK5jINTNKD0wxSFqrCJ0jiSVrglEcMQhUGuSmhqAOOGM6oWJGDuzRRrW1ulAcLQg0aozqa1riISeqJgYbeKjSKDczHqOk1qAppTjyw4GAqyHtoqhY2EQLsKvzQEE55cq/jhhAWRpQyigeORVMBoV0sc0FOJqKg0+OAiKFa30yjsS9+QNGIGAZSjZgRtWitXPCgYhQkkwB4ZZH+qA6g+Qzck048MOADXDTTxL311JXSfyKoAorcS2EIFDL34Zo45u2qnuEcCZOTODWi0BzrggkV27ubZtMTMYSrXAJoJGpkRQ16eOWK0TYFViNwZbe4UAtqMAJWrN1SIdQIC89XrlhwI8IO+rW6wCM9wlQ406VNdOfENxpmcsKADDHJG9tNDqZIEbuSPlKQQdWsDlWtMMATBylr9o41qSaPURyfCmdCCOB+YwMWwUzSrp7qSLIyqe2SKIaksD6qeFBhAHAPJKVMfaSOkrSaf04gK9OljlqOZAwQMENKyR3UkbzJIWFvPGwIqtSajKpJ4AYYHj3pQuhuysJE8khowDDIArSpCjgMIAYj1x65hpgtxmqjQzg56ygrSvwzwxHIkgudLwExpLVgqAl2cCpWh+kAcMA0HSzCW3o0gcSNV2YUKaQAQaClTXIcMsAgtpXEts6v9sKdpVZcilSoZgeFaeuAAxIWuYQ4UQRiYKJpemJdJoKA8MIBQ6rFLFHbdFu7jqz/AFipqwNTnpIrqPHAAczyQrJVZLeRV7lyQoKgNkaeuR5/PAxHaOJJLZCkwLLL2ervKEX6dYFQvOpOeAaOL2UnvElCAtSQFX+tWFUBJ5+nrgAUKVklrcMRrKLNCyDW1Fy00AGkDifXACCYtS2hcxB4JXKrGGGnUchm1StCMx64kJgZiNfcczLO6LpEZAK50zGda8suHxwhCgaGlcRosfY66ggu5rmUB+Ap8MCGBEaW8c871jDju2ixScMs9NaZmlScECDhLoEmgIZ0QEyNyjIyanNs+OCBArcKkIIt1LECONu5SPUOKVXly4YYSDjcxkyLqglCmcljRAi5aEPAlviMIidOqGVRE5ijkOttY/VRmBoytSmVaE4EpJDjb27SpD1o8EjEzKx0aZBnRTSufqOIxbWkkLWLK8a2J4JI764jRbt1ZzIGV0jC6grNlQKCen+/G7DgMeXMWLY2a24+2h62jUUtIx3dEjDUmsu31ManHUx4Dl5cxLNo2m4u5JJXhnCsQJ3YFkQVNV4VcHnT+zGumKDJbIrFx7Bstu3diuREpV4ppmVkUoFPXEoUigIIb58sXdhSramkPDxbWk8DGPuTaO5qVB230klECKKEjnllxOKMuNtGmlkbp8D3G1vdshEfainiTVLCCSdTCvGgpT5Y83zKWq/YdjjWrasFEfuE8x3jxCJLqzgumh0BIpYKlYy5YZkI2oinyp8cdDxmOt9zm+TzXxTBlLZP3Bb1aydi43JO3CQJER+iVmzK6KUVwOVCfhjtX8dWy2OLi8rZal8eI/uJttxitortu2muQI0gYhmQEKpY9Kt01BpQjHOzeJaco6uHytbLc0dsXmGwb9AJYp4dExDrM1B1lCQrZaRQcscvLgvjZ1MWat1oPW7eEbFvto8T20dJhrUELQtShOYOWVD8Bilcq1XqTycWuRGKvd39vMu3C73PaIpHtBGwkt4nCSRlRr1qAoqBxq34Y6/H5qvCZxORwrY1KM4+H2Nztu67+GuXW2tdv1btVMkkUr2XYnMk0J4euLuTqPhyyLb/AHEJe5uAqKRIkslq5RdagE6VJIB41r/bjE0dFshM0iyO0lwiW887E3VvI3bYEnTVNJoAQP4Z4QHI1ed4EiUBkKfalskZBVQzuOVTw51zxJIT0NA+3nhFzLFHe3GpnYKIUZQzxUJGkigAB5eoxPYioZZvkW1w2aSSRE29qkcpEoYNo4A6qDpappUcOeEnImVJewduORo4mt4otH+WmRWZVObMMjRiK0+dcTRB6kWktkg0uB2YVd0tmEmqdGOZ6a9NTwFc+HDEhAY2j7kxjCJM1e7a6aRMKCjVNOP8jhwA4wSKpia3iDLFHR1J0xoxFHjK6qgk0o3HiBhEkP8AaTTIGkt2RI0za3eSRaOc/wBNRmBWukYa2DcerWZ7dC66/uIhruCrB9D0ydv+ahOQwIRJ7JnWV5UuY1iUx6qxlWeRhQMOGkngMssKxNFibHtwaQROSZHokUMmsiTmBG2Yy4E+vyxW3BJamk/AvHJ7xl7tsYWVUN1r69K0FKNxpyGMHIyquprwYpehoU9nb7ZIIFVFAYJGDxIFTQY5GuRnUb7EIIdue+InvRpVn1CBuJ9Byypi55FVQiquN2cj6kSQrpVNKrwAqeP/AJ4odmy9VVRl3verTarOa7upRBDGCXmcNp4cMgacMW4cDuyrNn7EY391ffSHbhc2sEpilTSPt4G7dwHKHo7x4gjj6Vx3uNwlGp5/k+Q10PnL577sbhvW4TtazHs3QpEQymQlWKmLpGsrXIVPV8sdWtFVQcu13cq2GylmM17uYkaN4pXS0lZEkjaIhidK/lFagcBhvQeww7h5IkyiG0UXAji0wSMgAZ2NQGVRnRc8xT54UAvhZAbrcby9rMZkmUtRbcSKgUIaMTpABB55VwibcnpZpZSjwuqyTP3RakUoq5gKyUrGx4hsq5c8RakFoN0naiklJthPBZSBUVeKI5DEy1zJ4j0AxEdXAna1t5Vk7Qf7kmR47lWCiRB1EQgk5GuYNeGETbPRFhLPcQtG9uUBuInOhVZTVdNACDWmYHE+mGhFy+31nt++XVva38UnbOlUYxKZYpBwZIgKFpeAJyrlTPEkJsnW7eOw+MeQ+b2MSR7R/qfjU+87BOxUSm62uWO7WGNf/ZM3bYaTXh6nDahBVjJ7r+6dtLRdquJ5l3KCO5SWfTSOKZVkUoAQMieGY44gxpyZSm3C/uTLczpMe9LLpnSOrlyPp0Upw9KDFVnBoohDcNGmqd4mM4p9Eh0lWKq+sA5MacKfHFLLUJCHMUqRStNZmQTiRTpdYRkVK0GoV+OIwSVgLQ3FwkkccJBcLLqjAUzEEg1XgKZEYi0WJg5e/JZy96FgZnLv3dJMumncMZyK19AcRQ5E2pIDay9j+irdZBqBnQs76hRSfThh9oiqPJ7cWvkF0Gj02kpWeFrdieiShTqXpyJ4UxXZQa8dtIEdiZ0WKaC40XNy7r9uD+ozqKllfhw5YVRWHOwkdQLa4tDIUJjISgkZFzK5elc8TSIWY6JZ2V0XiinmthC4ESSg6WLGgBKg0ArnU4cEe5wd/wBDvUgkntGS8SBpYB29KOFPDQtSeoHI0wdrHXIp1GtJJ7ORbYiRblhJFcQmgMqj6RlSgHr/AAxTZPqXVcjrZbtPG9oRMkYmRmhJJ0xrXSw1CnpQ1xRekl9WWLY70kh7U3T3oxV6FnLJwqTxpil1gtViSwSQ3MTJH21VlDVjYsFelNLKM6HPIHPEGiUinvI7Rv34WNAUmZdGsUqQUNAaca8sRkIAdyYJ+nHUzClFXOUEV1KAa/A8MOZJJHZ5QoQDU1oxUfUJO0eYNa1IPLCA8wlL2ytMQsD0INCFBzJlXiCcAugZ21GqXWHjhdmuYHcigcEM2lTU/LDATapa25V2z65dYqXUnIkUzB+JywMECMsgSZ4WLRKCHK00xB61U141I5YYAo1aJLVbRPtZCzSKTlqqMw/L5A4QM4NUrd0E2kUYMRhUaNDH6xTiyknCCACRo0IQpMrSkqYq1aqZKVoKNo51wSS2Oyu7pN0K+l1JhaQk3BFa6qAVpwy+OHIgIWGOWMwOpBmzjzLMXWoiVTkVB54AAIIVLyyOO5I7oYIwDokr0gk8KcqYGwgAtCSG1NcEgXUDGuo82rxJ5ADCGdYJHdNbdsCJAZV09XURkp9DXkMDEGxd2SF2WgDaiCoBAYZAk8tOEEBby6oVUHvdpP1yrEolc+4GoCxApQ0/nhsYU8iOiBkBRUB7zMCpRj9AJIJJHP8AjhAdYxzIsbxiXuEsEV6SRrWhUZnNTn8sAHmlQSqYXCsrkGZ1A7Y00KgHiKfmr8sMACRmF44xUPKxaKGNagDiKOR6cR88AM9TtJDchHijiLdxamjyVNORy+NcAoBrHKXUmIzOiFprRTQEkcUp88OQC5e5EFCRtFqYwUYaagkEoRShI4jEWMA8p7qFNSuemVSAjuVqKFeQAzpiQzivIURrcCcRo2i2lGl3UH66kemdf7sIATKKx2nYKwlavGw/UBpVSxrUgH0wwYhiVe0UM4kiT+ho1ZOMworUg0qQaZYBBk9yNSKbeS3hkf8Ar5GRqdLCoGrpNKE4Ugcnh7RuWLn7ZJFU3FCTUZBfxOZw0AKUyPLqcxQSEqZrskKQ2nIaRlmOPrhSMrmWWdAVGqsLdRCqzQK61AyzUnkcxipE4PaSFRarKZ+hWjHX0tmx4Z/yxIQc8sQldpdckKRFb2IGjJqGWoEg14GgOWADyg64rZ5ZDG6iaLuChYt9Kl1rxpl/PAwBmYJKkczAxMxa3uomJ0jMaGqMzXKh4YAiQLF1nZWgN1KzIgCkMYg1K5Ggz9eWCRnpWcuujVGiTNDCqnJmbJWcc1HHAKQ0rEzOrLpMJWOCVWY8qEVBHHj+OAArUkkkhkiE0gZVjgpmikfMBiQK8csCEH9UUSREunZUyQrIKrqY0WpzBNK5csAAdMkcANu0ZguiNEKcQ3DWxPIMAKYQCySSZO4XKrAgKtHQBGembqOdBxwwkHF2440Cj7uU1EE0gCjS4DMChP004VwAFo+iJIpZHZdVVcnqjFaMdPNficKQDA6FYxE8dwlDLH1cFGVSCKEE8sCBo6qBSpidrdpkoI5+lXbNj9dRTn/5YGwQs0rJKLeOXtpIj92JgVfSh0toNahSeQ44BhbNO3bkkVukaeyyaS5Wo0vT68uAp8MDEcVzErdtQyzroEyHq0fn1ClAR6cRwwBJ1KSRSNIIzHbLRZJaEsGGXUSAWI/h8cNIUg5yaKkSkNBplkVX1yqzV+jUKgHmOQwhhkrPGBrjikuNX68cZ1yEMR+ADDiAcNETim1ASRZRGI5O3M4oCqnNVAbLjxINcSgNQ0aSVuC4YWtdMUiE9NPqYZk1qTmcAjqxw0WGFCyuC8jRkkMtBWQA/SBw9MKAAxysYpItTXLlQz2ooF0CqrRq1qfhzpgAcLPb5bgrBIZdGr9RAutRMQNBJGRNBwr88TqmyNraFr+MeO/csj3IeRYgQLZGUs5B/qE0p6ZemOlx8HcYM+aC1rbbL15DDBZSSyuw+3UKO0pU/n0KxBz6a/gBjrY8K6HLyZy3PHPbDfr8xTrt800z6ZIo2XQz6ETSWKpqqeerh+GNCda7syWm70Rd+2exvlM2jt7O4mtZG7srCQxtQhenpFWKihK8cL+rxrqKvHv6Evs/anyeySKUbSICgaMRoC5VCa0ZtNTppnUYP6uj6jtx7LoP9nsW9WRc3Fu4hkFQZA1C6GgCMoFAa8CMJ5a3F2WXQuLwrySbbbxZG7i28zBupwOpRw5f2cMYuTgV1HU18fM6OC9dytNh872021+gkEhCOokIpQU00oKg6jTHJo78d6HSdaZ1FkfP/wB9v2v73s024+S+HRybptNoBNc7T1RzoGjArBoPBWBYimePQ+P8nW8VtozzXkvDunxUMOR7nue2OmqZWAiIuUfuCRlQ1ZXr9L1yAx3uyttkebbyUtBaHh/vhum1SI8924sWCQyx62rbKygI7tSoB0U+Iz4E4yZ+GrLY3cfm5Mb1N7e2/wC4eydLO03iRWnmiGtK5MAorOgGrKh9eHxx57l+Lb1qeg4fl1MWNQX3kGzblsV3uwvYpbFLWR0vCwVXCKSU1FqDlmcueOPSlsV4Z3r3rkxyfKfy3drWyjubOwnZLrerqbdd3o+t4pZW1RwawoJRI6cyNROOva3cjlVr8soyXcnnuFqkNw6yZFdOhhwkLNIaBqZVoaYg9i7cTRsXWSJYx2Wft2szqSFVjXRIQc6L888CQFxeFeIGS7SeS3Nu6Fzd9wFUQgVB0U6ssv8A1euJwOupoCfdNs8etZbeNYY3KRdmEqSZHYVXSa8tJyPKuHBKySKh3jzWO8vImhmWW20UbSrookzVmK1A05UzyHxwKrKWxBJvC2VjE1xEk+5TRd1GDUVVr9SgVPTWoz4YlEC3Ie97JcSwXcXbMr65LjRRQTWoAJ+jq+kk1PEZ4YB8fc09u1jeFZpG7Qb+o0vMEHVo9D68RhNgOdm0rydyxldY2K9yGRaohXJtBJrU8K+ueEMfLPvS/cSRslsHZl7c5JViDVl1k5qKcDTPhiUD2JHa/pmYiFhGkYOkkmTUB2y0YJ1EyEZf8vDjhSGnUnNjaXGoPcIe1pVJ5hGxgiDkEBjUlGqo4ggDPnhMa1Lk8M2Zmmt0iRLm3kJihZZHNHHVUtyqRTgMUZbaE8VG2bQ2DbBtdnDHoU3EqgslQdJ0/SGHGnxxxM9++x2cFO1D4tsDIktwBI4SixtQqCeNPlijuhaGjtncUSypEgZtIAoDwypyxFJtjbSRWHl/uJtmxW7f5qAyPqjJ7ikBl1KwK1X6Txzx0ONw3d6nO5XNVEfPH3b/AHEvcXM8G3SuomllVX1NFFpqGADdSagKkkVpWlcd/DxFRann8/NtkejMTX29bv5NfM81zc3MbKDGc5HhrTrVV01oCVHzxthJGVa7jd2bXaGik3FBPfdzU6xOsYVVU008epeFDniLt6BBXm772+6slzPOsNv+oJZ+DVX+mAa1KoCK1wEW2RiWQBw663+703MAhkLkOCTkdPSCM886ZAYQxvLGO3NzPOJbOVTR1/TcSBiDRv8ACuqmkjP44gy1HJjpt5pJgzrDpEyV0hQwquitKkDjXLCLFWQLzzrFNK8ZiUqWE6EsiaqFFAAIcN8eB+WEyMagZBLCqaJe8HP+XtH0hHQVcu7gjSailB864jsS3CTL/Vll6XikLSzSnQNU2XSKdaocx8KYaJEw8a3Ftm3e0AuJEigm0Gd5QssZUoXEf1goWXp+FTXE0RsXR575SsXkHgnllwzwXEkc1tu06dQmW5UxGhIzqrkEUxYtoK6uTIlzLLcTQrK5kew/RMMo0IscVSopxOQ5Yz2NKUCRI5YtU0ZS3kmYiNi5/TK5sGXqpkfq/DFdiavAK3tJQ5cWzxdzUvcRtQZZMy7AUGrkTiHaTVjjRBopY5itXZWWKNsiwJAAWlKHPh6fHEGTk81teIiCQxmRnMShdUPdXIgsaAEpiLknVimSN7cuY49UEyg211L0qsVKEsAc1J4kcDhDkZXjHeL20hWukWkcLEtIpP6ivr4DpyFKn+1gyC+b2i3Nrt26RS1eKZrWbTnJpOcZc0ochQDlirIaMFtYZX9sWKyNPpY0pblyVVZAfzECgNByxBGjIhWtw8LGQSM80hLXTFetdQAJqOGf8sWLQoaJZtl7CyiRGWC9tW7aSDqjkrzlORFTwFMMg1A7wn7e8tzIjSTMrJazhgrgnIAKOIBBoR8MTkpJ/Y+LR7vstxb7lF3AIx9vexqe8mYq6vShFBwOJOnctRVyOrKg3Tbrvab57O9kUrm1s9SBLGzVDgrlUUH44x5K9p0Md+4UW259tDdy3JlEpWO5jYHVqXgVAORpxPLFTRbJLdv3h55YhARDcMSs6Fw+oNkpBNKkgcKYpdSSZMrfcBO6s8hdY0ow00ZpEyIGQoW4EE58sVupYmOsU8kid2Ni1ArNCoLVAbIGgJBHOnDKuVcIkeK6DWV2jjZhojFCkjHgCRUEkH144IFJ5pDCxZ4x3Qaowb68+DKanLACDZA0iyaZ1AkJk7pFCrLnStOA/hgGzsUmrSTEEDhkz6gy0zcDgKHAAFGkbpicSdtNEcceQZAeurClSDnTCGFqryRPQuVUOqaqIsgr+Z6/VXLhw4YYAZV+6ELJMxMqtGrvmxY5dvh0gU+r0wgPM5jkaOJOxbkaz2SWSrDrRK0qRSteeEOQs/04lkiB0Fl0xuAufLKuTUFTy4DDBgZEmWIy3CdlSysiKRqQD/D61wxHYxJKhiLr1EujMtQCTRSxXllnXCGAInAkXXH+kuiN1SkpYGoK+tRzOEB5I9FuXEjQi4K6nGYJH8aZnPAOTrKT2yrhDcMEkikOTKuYZaGmfzwBB3VbRyPok1LKSiXUvEqnGILQUrSla/24YgnUbeENR4HcnJhksIyYaeRqcIUB06IRokKNFQP3mNWRWGkVopIFeJwDR1oJmURRlDo0M0ElAW4itDWqClRngAIYdvux3K94Rv24IoSAxd82Iz6hX44YHW7okQTP+rI6hkqpRKcaEVy9AcKQOGKMlkLN9wX1I4NCGHHpJ4UwwAJI8jVZRIquFlcNQuK/UgPDPLCkAEoDyPDLOAluNQg0EIqEUZxxOrlT8cMaPTiaReykILaWkt3RwUKFahWyBqePHjhIbC5HkhVROru7qZIUbT3TnnqOfSOQxIieeQRvarOUYLH31jQFHAB6actQAJIPHhgDUEHntzIY4VaE0kV2p+prGSyADqrUmgyHPCCAlI5XIeB2UM5Q/c0IOrgzJSo0kUFOOAZ2Ju8hcQJ2SGS3grlUV18RUnKufywmxFbiPRG0qKkaTp2glCY3Yc89LAZ/HFaLGg6F2t1VRAFlWPTBG1auBU1oMwK8PhhoACsrW8okCztG6yMz5LG5NNRIzNeRwCFAM04ZVkkihnqI0arMGjoKkqekZZCvDPBAAUZ3hGmJGeRlS1LOGJ7eepgagjOpPHBIQHawuh+porhKSwjJyQKkitDQHAD1AdzUFlljEjRKLdFgB41BRdR4g0zPzwABVxGJGRn+4uHEUYUdCs4+sLwNCOPywAGBqCU20aytaPoRqkVKUBZQuXVnWvLAANnLOVWMd1w8kzBQupRkV00IBNKA8fwwSB5BAkkUbLWYKFdCau4YZRrQ6aDgRTAKAxkj/RMhLR6mZLetWWg+lfiP7MMAbj9QzdoQsEOkt1Ah86PX0GCABrHIWkUxvdW50vFTIGTQSSvE0pwBywgOpIskcshgeVX0tJJDTuR8Vr6UByBHHP4YBhrq7zPHLnK66Ht0WpiVjQV+PLh/LBBEAdDNKW1tJACjI+dUTLuKB9ND8cOB6h9JIqXAfsiJUV1INGRjn8Sx/lggRwBlSKNYSC+rQYTrA1ni/wAxTjg0CA1Je2gDWCSpGoJVwrPG/FSDkM+J+OBCaBcFEoczXEh0y8clfgrFMq/LDEBKi2MUVBPGCxCD60FATrbLJfSmfDANHmkl0rcVVhMP03CrSM1A1MhGTEcBzw0AdMZBpjVRE1pVopY1EiqGFQoX82mta8fwxF7h7QIAmhlnibS5XtoBUKrOasCM8zSo5H4YlUTY42Vm9w0jMCtlMAkUTLrRfyGjChoozHxOLK1bI3skW94345cSmCFImiiePsySM9BHzAHEB3LVpx5cMbsWCTBmzpGq/bz2b3Xf5LOys7SS02jU00kbRa3AZiM5Ub8xPCuOkoxo5rtbI9Dffth+3LZfG4LSfebaAO1J2Q1BeVjqTWakMQACCRljLm5j2Rfj4ietjR1s/t74ZEgD7fZq5AZ3ZGkZiTUtWuZ5muMFvnZH1NaeLGoBQ+8HttHN9oN/soWFASJE0KTlRSDyyqBiL4eZqYBc3CtyabX5T4rv6A2W52d4NZUoHWtQeJUnLjjPfHkx7pmrHmxX2ge5tg2e+ieKWyidWyegzPwanHEK571e5Y8NbLYYbz228YvAf8mIKigMYAplQHMHF1edkTKbcHGxtj9vJNtMsu1bkQTQQxSgZBeArnzxNc7vXxIr/ou3Zj3FZ7rGRDfWpuY3Hbd1OpGUjiR68sVvNWdGT+XZKGpRk730/alsXuJbX3kniCRbR5P25jcWjaltbvWtO2yJmjOagt8uGO1wPMWxtVvscLyPhFlXdQ+SPlXinkXhW+bls2+7RPtm82HeW+2u4RkEkRUgMSW0nT9KnMUx6nHmplStVzJ5DPx70t2W2CPGd93TbWgfvXD2ccMUcYVWkuLeYFhHHEAdTF2H0555cMW5O1asVcbnTc2De+WeSeHeGzbLv14tpe7/ABxXm4bIz6P9NiMYZQ+qnVJWrIBkOnnTHmOU63vKPVcStlTVmZN93zct4aW9Gk2ZkP3t5OWjdmkBDGJR1OG9KALyxQka9GFbdtN9dj7WyjMk0o0yyxl3UctSqctOefxwJajr7C7fGvEbWxEk24XBkkTRQxrqiVQQSKfTkRmQMNsm3oSi88rh2+IQwdwTQrJrjXS9IowaVL/mzrn8RiSKpgpjdvMLm8LRXN81shqIpCzIYtRqFNTkWByGJQR7mRuXfbmfu20sjTXdy8aRkFe23UNSuVHE8M8sOREnub8aLmKCQxz2kSQQ250uGVFppjZiB+UkDlQ8zgGctbyBCJlGqK7iBvoVjqJJEUhgRy1A5EH4YTFVjxGwtTqSYTNckk9pKGRTlXuZUKV/HCJjhbQxVGqOcJNpIirqGlzVNRPVUsOliOOWYw0Ik9gBcMPuRcRI7KkpKtIaEUUdvSaFjkeGeJNBJMbJw3bmhtwSGaF4ogZGaNBp0MfysRUjSP5DEQktbw3Zr/dL2xeytbm5uJuiZVcKxVzVWfQAvEVIOI5MiqtSzHS1nobl8G8Bj8ft47rcqSbmaEhaUQ050ArWuOHyOX3OEdjj8Xt1ZZ4CoMqBjlXhw9cYZbN0JDJu+/bftFrNd3VyiRwqWd6l6ACo6FqcxXF2PDa7KMuetDLnuV76WO2Ws52+9VFZVjRo9EoJkFQCSQyvWlQOGOzxfH+pxeT5CNj53+4/vPu/kd5cJaXZjjvHZLi3TPtBeogleLE8aevHPHZxYK0RxM2d5XqUj9lcX5nfdpTbLRlmWX61q3Ja0AY54sfqQWONgjdN9gsYZ7PaxpcAQtKsoQMEUlg5BrUcvSoxGZHMaFYbvus8qRXF1VxASqTvGVjjD1UcDU6j+YmuFsKrkjclxDDLG+lSIodKLHFwJodcLEH4E1JwhpDbLIVWXtQSwJcBC0iq6tIa1LNVhqbM1HpgLEjpWONzFIkgik0tcziP/wBmKmNQqE0oT1ZVxXYmguZ21IHgaVmDgd5gHlFQFVAOKkjpOeVcIsqAhH26qlWtYQwlQTsGEerNo2pQADMH4YZGT0zoJmVj3ILqYdxQFBEmklQNXBakVPpxwiUaHnZpnsrhpUuXlJi7zKwV8+KBhTLhQCnrhojZwP8AaWUgiNytvpjkjbtQtIgBZBSYMD9IzyFcWLQpteWJd+3Pu7TYROVvpbG5ipr/AFJVSoqsi8AhPD8MSsyzHWSGzOv+rbnbxdBkmUQCpMkfcap6SAKEHLGdmjoTaz2S2Jhhgh+4nu+mdrmgjQrUoGIOTO5/lhOsCR47I0cEjXCAJLqXsIvbmnZchLmKaR/YPU4i0TGS42y2gmsxIGktkgbWtAWeVxUZqeluFK8OOK3UmmN1tDLLJLJK8k8jyfaXCpRlVxXTUtUZAEsefHEWicwLrjajBbGAK7GHToqSxIJzoMwFYUqOXpggO4it9odqZo8EoeHSCKCmcRKmtQwyriEFiZH9w2839jf7ZdwKkm4xmZZFAZlKHUqkCgQ1FK1pnTjhWWg6OHKKIt5AJLUq5LRErJEwLAZ0yA/nXFCN1tUPepGSNbZk02idu5NAplqTQxk1LZevDFqKXowQuXTuS61WYOFNFqCpzqTUEjOuCSUSSzaQm53VpAitFIxEdIqmTUxBVoyCNKk0piylHZ6GbLbsRs/avF22nxNJ5kSd72Im8QVUCijXGnVUU40PKpHDG54oRzVmcwUV5lt9hJZy3AgaaK1mOlZ6qUikahETUoaEdOMeSko6GHI0VhuficlmzT7fKLu2eNWit3I+4iAzGoDJsY744N1MsjFbPEs5ZlkEs0q9qZekq5BUvl+Xn8MZ4Lm5JRaX84lYSSRazMGa3LqtGSg1OQK6SOGdcRddBpwTLb9xB/Ri7kcjajNH1ZUOUiGoI1V+NcUtE1aR6DGeNm7haZSqxjUNBzoCo4fA8M8KCcjjI4tpVXQq3kzUWVD+mI6ZVBJz5YlACJVDLPrh0uWKo6hihJqTWpyOWfIDCgch6vqWOCWVrcuprMjEIjgcFzyBrmPXCgDiSmVRJIgi0EGFQNKhlADhio55E+pwDC3Kyy2q94TSyF1lZCpjBA6aqOZHA/jgAMIWZ5G0Pp0aJ5RlF0+ppkK8KfHAwAEo7RuqapGkXvQnpUyLWmgkADIg8PjhIAMx7PdIjSfRJquzESGKkA6GPDLL4YYzwk/zUMkTM0UgKRB6Fgh+pvjQ5fAYQgJA7fbnjYCWpa2Y0VErQM1ONKDCGBVwE1lvuJHj0CDLWpQ8NYNerjngEe+4EavPBMUuCFo+nUNVKVCmtaCtQMDGAMUlRbg645h+rp61UE1YEHMk8/QYCQYJA47UqhIgpWJQK6QcgxpxXmAOGGRC4o2ZiJNZcZa2cUlj4EKi5ZEZkccIAaIGjS3UOsOsyxyBaddMlZeJr8fnhwNCVI1nVE0pSAahMzkcB9CVIGfChwJAwwRgJcSy9gE6ayqciBmIxp4EYBHSUcrI/wCjJdEGSQ0ZKAZg5cRywgOS1UBnYyLcHRcun00BCgLzBoBgAAxXuqiRUZtZleoJMY5D/CaYBgSBE8QlDSRJ12SSA1bUCdJbLOmfwwCCu3DM8sb0Z9RaiNpkEimtT6qPzfHBA5B26wRokgIWVAdV1IChCHqHT/ibPhw44kAEFymua2WeJSZO8vVICxJ0tGSS2mgyGIikKl7K6RGrSLaDXKxoxLSAZgVyI9BkcAMMlikMUN3FFrUqWjaPJO0TVhp5VIr6YJJATFIxM2ayFj2YZVoSlM6kZdIp/DjywpEV67OuslzpjaiMx1RojfSBz1V4fPEJLGFRhRLHI1w7/cIWu3zM8dQFFVzGfBsshhikMM6M0ZZl7R6FiQFUjK1Id9IqfkeGGIEjJJIsryuZrirSMwozBclOo5hcuGEM7K5URSXAMuoM0ykDSUrQFAtaA0qSPhgYgxDLpyZvVdPVHpbPTRswTzBpgAGGBKyy6xHcZEItESOhUAita4API5hnuJVnTuatEQXONVXg3AkEU/HCAAVY28Jo4juAzSJFmGYdNSBnU+vAYADABPNrSWjS27IpUnWNDUAaoyHTkaVOGAbDFEII3kAjGsrLQBtRp0gFhkWqTlggQYQ0RkYREDUe3ECQ0bUOkmoqNXCuAbALJG9Z42khiUASllBVTkW6eeYpXDEHNIzSUUPG00dZEFQxUkZGmVBy+GEAXqZD+u7xkuApVSFLj6eYHDlwwDkNUSzdtkZDR+2ms9cx5lmqKkHmOOAQdI8BWJWgMdvDIKykVYGgBWpJOVB/HhgEHd9mlnSVh3SpEULUVeH06TQaqemCRnjJLHEvZdf0BqnjORAPHrHr8MSFJ5tZWB0WSEBCRXrVFU/SRxNRnXCALhnk0SzACWEvrljAfTLUAKdIHTQ54AO9liYls2esyVMwUSOQOvS+rhXgK4CLYe8s6sr2s4lgmd2VAFqstNJVgTRgK0oKjniSAM0PUzGZImhGl0QK+mRjVgg4MGBoacBiQmK7OxklkQNEJMxK0cYZtBrQGppSoyVf44lSssjdwXl4N4BcXRkuJAbaAtpt7hdSSysGLvHHEwpx9MdLDxtNTBn5EaH0J9mf2+3e/Nay7htnZgREYo4WkaCtC6EGjZcc641ZMqwIwVxWzW9h9Ftk8L2HwTaDHDBFC8SAyStRDISa1f8ALljk5M7yvQ6VcNcSlmXvdP8AcOu3fdbP4zPCtxEO28erVqLV6tZyXKvyx0+LwJ1scvk89bVMX79515F5PezGTc5LZLlmSxk1hggKigFaa8wa8DnXHWrirTY5N73trJG4Nm3qY29DKbqfXNIVdgYip0saNlUg1oT+PPD+YhfLnUddj8l838SuxNtW7XbKZhNaOW160CgkZVAoq5hsvTEb1WRNQWVvar0Zur2Q/dUN0NvsflNx+upVRJMNEqpSisczWp9OWOJy/HVcup1+J5N1fbY3vtO7WO628d1ZXK3FuwydDqFaA8RjhZMbo4Z6HFkrkUoeBSlKYrLIR3nlgFAS0YYcQuVOYr+IwJwDqUL72+x3hPvBsT2G/wAAst1tkZNr8it6C5tGbOgBFGUniD/bjqcHm5MFlGqORz/H0zpuIZ8udl8DsvZjdNz3LypbTdvO9puTtWyW1iRLZ2UcbAx7nIp4yUOpdWQJIx6Dkc22dei9Dg4uDTC/VlWbpd795TuN057l3cPNNdy3JXXGXH1q5kOpF1itDUHlljHBsSTcEm2D267zQz7xLDdyhDMwiPZR3dSAjrklQCKfyw7Mmqsmwl2varOSK3RLUQDVFMBXQHqpq31Ek5cPjliKlscwQTf/ADIlbuCPtsJSYxcJKQYwxBMagABq8zifaJ2nYq7dN1knkjlZGb9ZFvJu4ZFUAkhSRUaaeuJSVpjaHcxXIkVZ7eZ6KwajoUFQA1a9QOXrzwmG53bJw1xZ287JcQ39xC8gI0BSvTQkZAn+Bw0KIJTdzXN5u9zb90ieNx9gyhVUaVNWY504c+fzw4Ii6wuUkmt2dTOrxqk+qhFSANRAFBQimR54AJRbnvwpE8fYRHUESEau4pBRQXpq1UBH888EEpHewV2nErO/3k0TVvYhVYgpoIgvHUK0qM/lhyMmG02JmjSW2H211JpW7TXpq4BUs4k+ornXTkvxJwnaCarJo7219mPIvLHFyLKTZdmaRVm3OZ3KSGMKCUBIbUw5j5Yycjl1p7zRh4lrG7fEPBti8Mte1tkCtcMumXcJADM4rUL8Bnyxxc3Itk9x18HHWMlktxFbKzyOqKn1O+QB/wDdxQqtsvtdVRTvmfuvtWwxzxxTxtc29AymQKQSaABWA1E+lcdLj8F21Zzc/OrUwf7n/uDubucCxLXFy0hXTIySWzMQNERJoAV9K5555Y7mDhqqOFyuZ37GSd33rdvILySCWW5WRW1OrEtbsMg5LVGfpnTG5VSRz5dhut9tt7OIXVxpSa0AjedHNArqKV/wAlvxwrXT2H8tIh3knlEssn28BijRJiJI9JDStQrqOr6lYimR44SqTeSFBX9xKdcs0xeJpJGR4XAdJJGFVWpr9PDI54k3CK9xilDRKruQLqV+1MWeqCBRQrU1qer0r6Yg9SaSEbA65LlpzNHI5MEuvXKjDJQooFqACWHGgxEkkdpJRJrarQuTHFeNVjHN06mCqCYw9aHVmR6YUlkCN5Ps1+0rLbyIweJ2U6A8gKyJUHrBqak1FOGIMmkJ1CuIQy91rVw0ohDEqrcFWgGkDMih5YGKRerxRmS4DSXFuXMkh0h4ytApJIUrXlSuYzwtBiQtcQJPGLrKVdLqmTKHNdSMKqFIHUvCg9cCRJOSSeMbDJul2tuC8sBcJI8L6kjNdPcbVkqscqDLn8cWJFORs0pYe2hg2ORbjVayPHbyBbcLpQZhJC6jInPImhH1YlM7FXY4Mp+eWrWN9PEzrJCjjvvatpEjhwncqopStTXhX1xXdmrBsyGblF29zvmbuulwYJl1KJGagH6hfjUZ1B/hiudS7dGjfFbO0uba0cS/eW3bVwrKrBpgwroQHTq4AD14YkyKE/kF1Y2txcQQRi4uo5CHmuFdlCppZFKoqiijJlBHxxB6lhT+57kJFltElEr3EupZYSoibXU0AWoUtwy5DEGNDjtNsLmKS5kspTGy9tLWNFQxhelmIrRtQ+fA1wJEk4HO/toYUneNn0QgraCMmNUDihdX4NX1NFGQywmgK23VHhMlmQY0WoVooxSWRRVTIUBJrwDc88VMmhjBZEM0cMYigKTBAGEkRLVZSOPURSrcOGAmik/KrNbHf79I7Zobe6l79sI2JftzVPHOtedcZrTVm7G5qAikicwEI1xG8TQsj6Q4pkrUHUvGpIxcip7g1TVDCFnUIBKjXWnN2YZrqIoRUCjDDsgpM6mwP20e1V15bft5LuNuI9ssdIhuKlu4xJrXSCSFGX4438XFFZOXzc827UXv7o7um22slrZ2v+mw7bDpgt49LO7opWP66FR8xnwxflcIyUTu9DNG5RRX2z3EsKM9zeWszT25o8ispVtIrRaKSemufLGOy0N1G04K/wBpZpxYuHWWSEUkjkFdKEgVFc+n1OM7rJqVoGvyPZI7Ei4tAY9vv5aTNrMgjcVqrgV0g50HKuM+TGkaaXkjkTRxqGCrJEiFPtAo0q1KKdX1AqP8XHGdouJNaX7q0L0lmmt41WUkHWuZrmoNVA4LiDrJJMk0BaOQ6GSRYIQ7fnL1zVwMtJByyyxDtgmrDrbXSy91YgA5p3aqKxClXoGofTPjiJORxM0bhEdzMWWjuAFDRnMash0n82dcIkAqiaXeEFXACAt+kQ4IUKK+nEkYQIHKqIEbuPPE5ozR6dahDn0jhSvH0whyeIZj37dVBVQn20aqSYvqBUqtM+J9MA0JQ4kWOVWkt7JBWhoa6wTqIJoTUV+FRgGGvWZP8w5uIQkj5nS0Mn+NiaCrAcK4iEAbcSaYwmtO7qSVXISSVtOVEORoDxwxNnRJRYU0tJJCQkUUhppdKgnUMiM8A4CElMeoSLIkpSrRle4HT8yitaKD8sAQG0LLFLCrdhB3IwtKoc+pwPq50wCg5RgBUJ9vIC41HS0S0zKk8iTx/hhDOySskjRoHgDIdNwhprX1BNaE8x/HCHIQ1Vj1giKH/wC2AT0ita6eJBBzpzwwgMaPRFFE0ajVRlnNGdAzdLIMxQjPLhgEAMoWcAs0VxACqyxDWJGHq35cjWuGAWztJGS0SUWZBMqgAyFskGdCOGZwDZ0rDC/3EbvE8sgWCMKD1JWpJY5gipBAwCOxmJriVViKlhWO3Ygr3KEk58M6n+zCATxSduFH7pUyswVQAUVjlqK8uGCRsOdI1gCvqMBYurxULNImR+JDfywCC5V0i2YhtZ0NJHI+guirxHppORwDkHJGkk0SMoDSLXW1KtmWAZlNQa5tQZ4YCcFGkh7IF0YmaKZlYKjN9WRdsgPlhAFAkC4aSRAch34yRrHog5ZimfIYAgEzzQASxoG7UeqYEdMIPFgDUUPoRTAI8AkFUWFkluQVWCNivcDUZwdJYaTxA/DBBIAwaOSMuWuISpiDUJLIgoFRTXSFbjXPngBlfMqtFql0DQWVe3JmWK5ZHiQP4DFaJM8NMi24PaaObKGOOoJr9SCtMqDM4lAkHhWQGC5ibQ3WsCj9RtFKCvHI8cIJOs0twJJjqdlYUmVVNI2FCnLVTn6YGAKgUrKk7dqPShjWjECn0mtf5YABACOE1BlXuExZhZH1NkCKZU4kH8MAHCRpC6WeKAtJch6IAfRfUV48xgAPQuY5JlQK5zu9EYLSQgdCLnmK8DgYAImeWSCfvF7ioAAyPbNQY9PAN68sMGdWh1pHIHdQVZQAdKVotDkWoB+GEIO028hkCt31j6XUFlOpuDKKZgUGdMABaRs4tzK5jlLl5mP51ShGXP8AHAM8zRSSAlyXctJEx4JEcvmdJ9MEiFbozsoeFlRVLQuHILK3HuBuAzoKYAg4xcPpllpCAixRyU1rqoVXSDz+OBDDI1Vwv3SiOWHU8x46VBoNFMhSlDnXDEAMeuKPTJQxsZomepTS/wCdtPH8MDEw3UtwbiNWSSJB/wBOKhnoMpFcZivrggRyir2IRI3d7ZQNnVRzBGer/wBQwAGSRBEeRgsspQJCEcrwzYjPSGIFQRlTDkUilYpmhga26UUN+ofraVMiHK8Aa5euAAoKk7wpIUEKZFlLRszR5kUBFTXjXlhh2nVhlZw4VFaRgsDW6UEYNASASakD0zocNag4Hu02Dct1nQWO2ETM7LJTUqFCwFRSgUkEn14Ysrhsyu2Wq3NCeG+1k9qtve7und3J37cVr2yWWtdJagWuVABjq8fiRqzl8jlTsfRv2O9lIr68t7y6s7ea+MiMlf1VhUsKGJOAfPqOLs+VYkZcWJ5Gj6X+OeM2Pj+3JbW8SCQIFmnCBWOZ4nnSuVceez53kZ38WFUqZt/ch5dLs+wTW1vJJC7uBLMVZwoZSKUVgSSOAx1PG4Zt3M43kc2nanqfNBrG/wB0vLgXP6n3CVjuJEI1KB06hxqefxx3XaFocBKSyPHvDoEipcRsyTAI0rJVlYV+kFQudKV4kHGa+U04sLLLg8ejitxH2C/bOtZToU6jRaHgAAvChzxR36mn5S6kK3zxW0kR+lk1u0heMRxkPpaqAsKDMDU2Yp/PTjytFN8UFSXmzy7TcSy7csUbWhMpaDqVZelm0tkSgC6fhXFjc7laqkar9lPffdNhit9u3eaOSFyw7TmjUAUA0HOmYxzuVxa31OlxOU66H0R8X8x2rye2W52+dWDRq4jrV9LGlachXnjgZuPbGd/FyFYl+vjmBT0+HHFBoEt9f2m3Ws97fXUdlZ2yari7mcIiIeJZmIAxKtHZwiN8iruYp90/3Ox3LSeM+2KS7he3CPDJ5TRykIJ7bPaQnORlPB2XQOVcdTj8Lt1scnk8x2UVMWf9ptuAO4b7fi8vHlOmOoeSXuVLGRqnVqJqfQ46DtGxz1idtR97O17WkrwqIplKqt1pYl0UFgGK0ouY/wCGIy2WVqqkI8j8nWJbtCYF+3cKkTkozsBVWYgmmkVJAHHElqDcFP7x5Dd7gszmUIS5jiLE62BFVYFQQdRPoOeJV0K2iMzpJdTCR5FKL2g7Ssp7ZXPMArWvEYcsUCeRV03FzbRKsURYrLrASZmyJYZjpPD+GCUHaILmVkEZt4HZJiuiMlTrYZkNT6SAekVzwTIRAt2aGGbedt2/X2jPdRNb28kWnTGXXU1CegHmASeeJog9pHW4nmn3bdLdEEkzXDrDHLWqqpbQELDSFYDUfh8TiXQgtSYbPtklxbWiWrLMrQlJEIZAihmUMurSaOw1HI1POmAaq0T2x25ryOS0hhd0s4lihMbUki0L0BhJUEv/AMxGk0HE5JakpLf9v/aXyzzO9t5Ng22a4TKOXdJA1pbw0I1PqHSaV5E6vjirLnrjWrLcWC19kbx8A/b14z4yLe+8jkHlO9RaaGQEW0bKoXKMnr4fmyz4Y42fnWvotDr4OCq62NBqIoI0jiRIYkFIo1ACgcBpUAYwttuWbklUiPkPmWz+PwtPe3ATSM4wuqQAGhOkEkccsacXFtkKMvIrTqYo9zP3HkxXEW3XCNb90w64qktJpUUHHJc/51x3ON49V1ZwuXz220jEvlnnW8eS3Fy80813B3FjR1JBEhrUtk1Vy5cTjr0oqnFva1yM22yOVc7xc9pA4CwKmrXGRShB6QW4D4VwrX9CVMb3CL7e7aCE29kHg7Egi7LULBmbJGcqwCrSnxOIassIT5HuMkEXZa5hEnV984/O5qya0UdWleHpyw6qGV2ZXFxcXU6LEZTNSNpAi1yjY6arqPAEHSPniwrG65jmZpGhkkRJIGMELL3I2YAa2KjNCBlx5c8VtE0Jre0a7SIm3haGpWOyTpHcB0qAQCW46m5g5VwImxXBsM9yrvDCNUx0XVpPH+mjla6czUpU1yFcJkkPyeOSxrdXMUM6LQ64uruSUy6DIAKouSfA0PAYXUmtCHb1afazdqVHayWUNGjsJddf/aR6AaEk00nlhQTmRNZo0pkunj08UZg5VnIppjUjIsRUDliDQu1HBK8rCELriIb7qxAVNYWoqSciyGo4cBhJDY2RxpPogQs+gSFWkPBwTVdOVSM6AHqGJJCTg1v7CeKHebqS6lt4CVlX7iNoyplFKgKq6clBBIqfkRh3fah1r3s+hl77eG38RYdgAWYTsvLVY5deSmRaaVzFKmtOIxi+f8RsXH+Fnx496Nvew8ivbZDBOY4GkltoXEqRKZhrDkBAummSDPgeeNdrbGPD1KmurdzcTdiVwktpD3GddQXtghWKE10kZZZ1yOK3uX1J7tflAt9kt40drdTEgmq4WMOlOoFQGBy4AccWblfUjm4bz9xNIrd2ZgT/AKaY5HJCkBmWhrkTm3qeOIPQmlIzRXc15MrTTCSa4qJZ5kKIhYUC6FFTwyocuOK2WbInHjDStbyWnbVJwrfazM5IAbiKcSRTI0yxJIg3qPN4VksrRXRo7a3jd27QqE7mSxyitWHE1pSlajEbAivt5R4Q0ywywwtIuq8RgUGoAooZgSQedRlipovqyJXLabgv2zbrPKe8xXSiUJ1VX81NQapNCBlgRbOhX3n+3t/8R9yZ9bRK9nuF4rVatSFegz54ozaF3GtuiBW0sstmHCCWRCsjOg6kp06DwJqP7cTpsTsviLH9t/Ad89x/MNh8P8ehafc96ulgtTChkhVHassrLmVEa8T8MXYaO9tdkZ+RmWKjfU+5a+1m2+yftttuy7bFU28KQ3V/KukyiMnXKqr9bOx4U4AY31zVvpU47pZfFfdnz192L5NxuruJ5ftp7dFCztIf1JFaqd0U6KVyFcuPLCzalnH0K4uoXh8Uur2aPvtDBNcXKw5aJVWoYlc2A/Nwp/LFFlCNCbdijvDL+SZTG10GuFq5jkGtnY9YJP5lIbMfDGamrNmX4UaDHisd3szi8SE7Ve6VuwhoUUlgjsRkcxz9PXFrxpqDPXI5lGdt12fcdovL3a72WOV6gTzqQqPFIQEmJpU1IGQxzslO1nSx37kFWUtzE4XRJDNDqAkjbSjBahgAahaVyPpiEEm4JftrzX0UUdxb93RLXSlBpcflV0I+lRWhGeGqid4Hw21xGZ21lHjJ0zSIWZRlpIC/Uorn/HCthfQdc6DkuTchhJAJJyTE2ZZZFGRzFQKVrT1xldYNNXIoImLhLXVAYqsJ6k0fi+QNKmv4Yi0TkFGQCxa2AHcAlj+gMTTMajm1RyOEkG4cAsdwI42A7jMJkJFVGXRqGQ1YCQTKH/VghYzJEO4k4BCR5EhTTJuP8sASGCk08kUj643AbQhCsCoq0rjmCBwJ+fphMApR9xJ/mCnchVo47VyFkLldShWpWpGbCvwGEmOALHSkrSQsAyxR3UYc9JrkWDDIsfTAMHDHNHIGNZrqVu3dNHIQIyfpRiAAM/U8sEwEBasUhSSdtcMzFSdOlHpm0pKnI0H8KeuADhmYIwVu5HEp0LKAXIcfSy50y4An48cAjzmOKrBQkTAdq2kZi8bHiBXL5054Bhnbkad7cEyCRe4SQCyDV1SU/L/fhCkLyS2jdZGQNOIrfuqFCaeYrRhqB4cPxwwCw0P3c5jYQkp21jQ0JNKMtc8yPzYAA1pCWAV4o6I7sCDRvpBLfDjXPDCQwiMKQdTSyxhe2hASNBVRICKAhjnnnhAciLsJAshMcsRFvIpIbSuVDqFAM8jgDYKIpahJaKlS7SKasxU8xSlM6ccDAAVjCxtKZImABiMeWQPxFOqn92FIzzl2HemajzBVWIA1RqjKpHTUDPAB2MJC7wtpiBDaEoZC6t1EMwoa8cSQHtQaBLfQFQk96aQVKnjormDyGWf8MAQBkHd1fcILWfSrySgVTnQscgKcKAYQzmtWE76mke4jAkUAKRQA1+QGABNKQUEkr9kwRo4ChitScgK51bKvpg6gHhZkkLySSNOB3ZBDQDRmApWuRNeNOWGD2IAZGcBJIY9aujWRYUQkcatTJsuf44rQ2AkRJbmRZZTdySD6FAUhUzKAZVJ4EZZYciDGJglmijYEyUZ5FbSQhyZS2fLIDACAIGhR50MzqGYCE1KKoNQTQVz+GEMNRoG0qZVJnDKWYBnVKVJplmTwOBIAMDBleUFZGEgWVJFKaQMgQRzpggZ7qlQaFVUZiwkerpVeLSZ51rT54IANPcWXXHrXU0f2eeoqKHV3EOdK5j0wgAmOOF51DNM0JIZX6WL1pqXgWGeQxIQQ4ttUUrAukYKMzLRdVR1LlUaqH+/CExY7yzTxTFnVHQAXCgGXtlqUb1FMhlnhghSQyPOphUlSWkhNTp4BWOWSmoqMJDgJA7xhADGeOpVoR0uqrmukZoPXOlM8ABzyk6JHjPfMoEaFy4VuIAJqdOda8AcMAKRss09w6fdsjdpWkYBi4zJOWQzoPTCAGE7qQoHMSLrOpmDIkgqQx50qTxwCYcjGSGSZXeGVU0SFCDqdQKGi1AB50ywxBiESm3ZpI3n7I7q0y0MCBoIpQgZU44UhBz7iOJeq1eFbNf0mNAAeCpI1a58xnhiPLIkdx+n+l3uuEEtoEw4x5npA+I4YfUTQoWzuLiW6hsbbVK0rR6Y3Kgx6NZomVBmczx5YlWjYWvWqLD8W9sfJ/I5VhsLVyj3Bj70tVKNwOmlDwP8AxxrpxW9zHflpG0/b39oUzql3uUJmglkRBpRqDQuoEocgajiMaFjpQyXy5MmxY28eA7P4Y1vtdhaw3e+WMZVEVKJV6qzVGQNfUE+lMdDDRQYsuSHElje3nt1O95BvF4zJfuSImIEkaGp4Ma9QXL4Ynkv2ldKu259HPbXxyy2qxWVIYSHFY9KUZWyqan15Y4HNyuzg7nCxKqLWKkq2g0p6iufLHOW50LPQxb757Bc7sLhnkSCC2PcuE0iTgDyPD4nHpeDZKqPJ86jdmZF2zZ4LRIDNbtGsUzExpJUKCKh6s2eXqKY22lmSiSZOoNFq0ZMRlhZtLzoevTxzzoKZc8+NcZ7KTXWygPbdrYRMUmZnVmigYMoLGpoCDkvqW44So5B3RE9x3WC5W5ooKzgAxqCWLigYA8WpXM/3YvpRopvkREL3ROwVTGBcw6Y5ZQNDFDSmmlDqPD1/EYuiCCaZA7iJds3G1gh/UjuIB2oZSIxFx1BVWpFKkNnhNSGNwzRHgvn+5bJcWbWV1JHbwhVuNdIipBBAqxAOoioC8c8c/PhVtzfiu6uUbu8K92Nn3u2a2v7hbHcY01lHFEZaCjFjQZ0JIrjh5+M620Ozh5U11MXe/Hu5e+5O/XfiWwXwi8a24lWViDAbiJg33FyAwEgOk9pPmxByp0eNhWNS9zn8jO8zjoZ83PyTb9jSIWTLJclJD93NHSR+4xWR1AFW+nILQEcK40O0lNdBg27dLzcXkuormOawQajcXrFAssb9RSLTkKqMyafE4SbG2xBum/hpSsTm3ZpWa3XssVD1WolXUp66ABRmONMSBvQq663L7j9RniLyxlBGS6ENQ1jq5JUCvUa5E4Ym5GyWkDRFyxVYytzaBaySMpqjLqpQUYin9meBsg0I5BER9uItTQqrSPXT0nMMBUVZaceAzywCE3fk7MYhSRGBMtpU9AcijHSafVWudTzwRJKRLMezcTPEydqNVFzDIxZdUhrpUGgplxzIxOugtyQ+LIJ9xsJJUbRoluWE2mqPDGwIVSaLkKdRpQ+uJp6kL7Et8Q2O73S5+0gt2vXv5202MCu8oZidCtQZChOfD8MT6EK1l6GwfE/ZDct4Nrbz2DbpuqTPJLsUVKW4IUr9zdcwSfoXhSuK75a41LZppgs3EGx/C/24bHtkqX/lUy7ndBy0W12imK0GdV7mRLsooK1xys/kXbSqOjh4C3saLtbSx2u1jstvt4tvs4BphtYBoFKUyUUzxzbXtdy9WdGtK0UIZ958l2vZoGnvrtLYIAX1MhdQzaAQhJPEjE8eC12V5eRWiMv+ffuEs9ula22irToSqqJIzrIoWGsMTQJUjSKH8MdnjeO62OPyPI9EYW8x92fJPJLpoop7iZ3kjayWBldkXWaayoouommnkMdnHhpRaHFyZr3ZAJNnm7kl3vd6LMTStHJbp9MyFDrLAU00Oan6RzrifeQrQQ3W/We0SdizjXOBVnCgSNKBmkfdOWuvE4Tmw9CCT73PPKsvdkgQzN3ygBkWXgQVVj0gczh7IXcxjiXQ/eaN5Yo7Yxh7Ziyu6muqM1AqKnjnXEdxsj9/duxZwrdp42NrHE2oLNrJCseNMwOOJpFdtRvSJJZraa6ZSUlaC/mZKU0j9aPStMifp5fPDQoYrtNnubi4Cq3buyxfswqI5kiGSoqZatXUTThzw2gLS8c9rN23CG2maAxrcOjRyEHTGEfIgKAUdqUz5DFdrqpZSjtsXjtfs4lrPDeXMUszKCftZQCkaspB1FASdfrx/DFfeaFRrciHmm0Nt6Rzaljj0N9nMpdoIwCVKOSx1MNVPQcMKSTMkeTotnuUiwQ/YpFJK0vZUaUmbMZhirAgAVHAZcsSK0M8REcg7eguKS3ThgYAlKVDHpYivLhiLJSJLpT9wjNEwuKPIHD9vUh+lycwRmaj8cJABslDTwmUPcQghxdIwDaiTobpIFdRGY6qYnUV9D6nftq8RaFYbsqIJFjZblbdqQjU65sHrqJJArU5Yz8q0VL+HWWfRm52GMeMzW0TEBkcpKoGuR2U0LIRQmuOD834zuPH8J8C/wBw/jF5tHkryvaLLFaSabxXVY4meaR6SMBmzsfTHfT7qo8/i+G1k92Z3mQM+3zlyrRn7eOQgTODn1OrAMUU0GX4YbZOra6DZFFMts8T6Juy7NGwoAxqwLvTpGfpmf54cjanUbHaKAyVjkj7qB4LZjpk1PXJSKkjFbZJSKku1fTPqW4nnVkePNWZlA7g1GoVRyPPPEZGybbNMyyQQR62ikjVu8o1I2Rfp/jRjzxNEGTMQJJFG0wjmWSSRrlYUZKFdVJkJrX0A/HkMFkNakH3CC4kQRkjRLI5jvUWquSRoAiOShlObevHFbROrIPdoqmmUctkpjManVJU8BGzHMaq8eXwxCC6SOeSbVLuWz3tu1t2rhUW62+LXoaaRASSGFRUA0OrL0xDJR2qTw5FW2pW+x7Le7rNBZWVvLeXm6SRxWiW61mlmmIRYogtQ51ZUHHCwVnRl+eyrqfoS/aP+1TbP2++Gzec+4Ihk9yd7s0G4wJKrJt9pKKx2MI5yLxkI55cBgzch3ax49vUxdib+Zf7EV/77+fWt595PcQRTzlTAtuJKSiMqREsaq1SVAJcjlzx1MGLsqjnZ8vfY+b/AJFIlxdXLwQCGJXEd5ErM7yKSSZOolixpQ04D4YVy7HCQk8yjSw8C3uaOMM01sscEhZlqGZQIlTUDkGr+OKcv8pow62M17K09huIePSXtwrWbEFHZVGYVuR0+v8AOuMeKZ1NudrtPpJ7L7Uvke1CwuzEllvGmKONUB7MpjoS6D6tbZ14A/xxtaSObWyehTHv97ZXuwzW81rtsV1c7W8hmkFsUaWyjHUKioyJr8eWKc+LuUo04Mva4Zkqp0xHs6YULIYIeppmY0qv+E588c6DfuO0b3EegIohaIqwJc1Bp0sTWleOfPEloJpMnez+R6JkivrYXNqrAzOCQ8akZ5gVAB4Uyxpx2TRmvRrYlM+zWd5El5ZyKZZh0vESkkcpICgquRB4MeWDJx1bYePkOrhjFJ3WmUXgIjgKhxGVPWaA6PWvPmcc3JidXqdOmRWWgIOZHmkeDWygxoIwT25fyN1VAzxU0WimKSGMy28oaZ7T9GY1EZ1E1TUAauD/ACxBjQE6u3BObpkZdSuZGC1QNxYVqRXLCQ2wTvG9xIWja416NMQojlyeiNBq6l1Z8eGGACMzJczi5rM8LhQSNKrUdRNTWqnLjXP0xFAAVDRYZneZU/VhnUktSteFTWvqT/HPDgbDFKMphaQlUcKl2ACZNINVOnOrEUByoK4SQSAlmkdxcdiMCSImNQwqhWoBqAKMxOVRw/DDJANUnbMbAmRaGeVRVeQGpASSw4VPA4QpCpBKhtlaIz9mTSIgV1O1c2FTwrQfgcIQJ0imWayWUzVPcupwSokRagIPzaSeI/swBIJVkCySPGK3qBTECdYiXPXHUBVpyB44ACq21HhLHXRQNFWd4idJXUMkJJpkc8OADHaSaYINB7YKqobJU4VbPqrwNOA54YmEHSkkhkqZL2iRpWg0LUHUAaLwyOEB2NNGlaSiNgDDlXRIxGtTw6csAI4QspKMveCmRBNHQFVGbCh4n44BngHulkjfTE8umQ9w5hAOkMSaBvlgFIXL+vpmasfdB1TuNdaEAhkHAEgfHAySYON5UmhhSLu9wH7cCtQxFdMhIAIoc8vhgEFmK7EbyxICgVwY2QM6tqPSukVBzr6AYNRyEhYlSGJ1aIxigjb/AN9HOqH4k0Hw5YADGkLlHZQ2lSszqNDhK1B1UpU+nHAMJnJe6QzBtcqFIwrflJrQkDIFTn/LAAYkbrGq9Ul2QJJJ11L+mgzWjngaUoMAmV3IwaMM8ZEbaQoJ6o9PBjpJ1ZnlitEjpBRHdJhcyxNqUlQQ5HHT6AHOnP5YYCjXKogeM0GsnpppZWoRX54EEBYDOZS8pEsUeVy5CioOUdBUAV4HngANj1lZ6B7iVgJLkKmligyMZBB4kZUzwxAiI5AHt4mhkDK0jt0y6TXpWuRp6csJjTOMpjRAh0XED6WU9MZYg51PTUjj8cJAdIhWCQxygiE1UP0ZuKnSTWpFfXDAMjEE8wkiJijtlSNZ601aqVY5VXKtMsMAIHclurhEcaEMds0jERhSdNNWWZ44QmHRokCwQalkijj/AEZuOjmyuRxzNMAHUURHvu/akjkDMZqspyIGvnwBAPPAAW9zrlZAsgeQMz60K0Wv5a/VXmMAxUerXAsrK0S6rbWQXVAKniPhmDTPLAAQxZA7aRbtMVcotG0qnB2IFKMeIrgEHGN3Ro1VA90S8ic29AK0pTDEDItlWOXQyvAh1zJQLpH5XoDma58zhMEzsCQuAeq47WmaSdG0oQCaCq0pUGhyzw4AG7tLIsbljDeHXFE0YYpH+WQ0rqry9MNICXbD43uW+OXjjM6zlY9ZNXmRRn9QFKDnTGrFgky5s/boa89ufY+Gd7ae/toreHtFybgUKxvT6WOTUHPKmOnjwKpy78h2Z9BvaH2v8eRoLe0tIRDaTamLRVCppA1o5NW1t6YWfJ2olgpNpL98/v7TwTw24uCySG3hb7XTlrduFUXNuNcuGMmBfNuaOTk+XUzP4D4Le+TbnJuW5FrgXrmTuyIutY2OqimtOo/jljqWuqVOTjx97k0JZ7VDt11DYzovYL01BdKAMQVzY+ozyxmvfuUo01qkzTXi0qmyt1LKz0olBTIiooBypjichanZ4rUEwNNOfHL+WMprsVP5/s8dzZzo6KFlo4Wgo56iUYkGtfQDHV4ebocbm4Op85vNbCXYL+d4tdvbxyF6kMQopq6iCaZV4p+OPQ413I83lbq4Ke3T3LG1NBJGHW7eSva7it2xQA1SuZzFaD8MXrAn7il8hori490Z3nuYobiPqMggmkY6StQxDrlSM/lAxoWBEHlsxNY+dreXE0j3H28rUZY2DFDHFpqoqy9VQK/DDeAh32TLO2jdprgxzEqJbUCdEY6tCsnSVgrV81yBPHPljNfH0NOK8jt5BYST2MpVH7lwzrA+gRsZI6Fgx0yNmD6gVy5YoNbUajf4vdSXkcX3rV+yPdjmIIQtHJUaXHMHKtK0xRm01NXG1RZO/eVz7TsS2+1Ik++b5KIbVbeQ6YolSktyoNSNCk1r6/HGFauS+11WsFSbtvJ2DbpNrgm0XN0F/wBV3kzKY53QCsYVlJUIAFLepyw7eglBCtus/wDU7lbWnYaedZlSQFhAiq2gLpDBVbRRATTLPjTBVIYu3XdFtR9vbySPDBI9LZlVi7RrTuaaFWNagflqSeQw9AcohF5uCPLJLFKHS2mjd4nVi2liCEpnUjTVWJyzyzJxNIrcjM11EriQRNN3pys0BKu0QBypRqMWYBjTn6YQaiRi8coh78MsIKsl2D3TXUSqkhaChJqPnhwMJKwmSNIowptpA4lAeUpPQ111pUVr8MNewAyWWVu612pSAOACyrEC3As5BDAEr/4rggYb4149vnll/bQ+N7Hf79cOrpeRbbayXbNHqDCrKoIC5E1OAG4NYe1n7ZvL0uXufNJ/+3Pvo5LBtptgNz3d4JCCf0o/04gdJQ6m6eNMsDyJbjdHY+gft1+3/adgs2ig2+HxnZbx0me2tnMu7XOpCP8ANXrisda1KRCnxxgz+QjSpu4/Cb1expDaNo2rYLGHb9osorC0jpSNFpqIFNbHizHKrHHLyZbZHLOrSlaITbnvlltsTyT3EUNaiMsxqSKnKoIFR64lTDaxXkz1qjPfn3vnY7RFLb20rJKUZWEUyrKDRSlNSj6tXJqjhjrcbx06s5XI8ilsYh8796d236S7tIWea4Ry1ytq1ZF7pC9vXTqyHSCaV/MTjs4uNTHscfLyrZHuU9fJuN3cwvvl79rAyGS2sFqJmjALIzElgrinWcq5UxdPoZ3UYL3yKx2qKK12qCOxZAJ5kRfrDhTrd6toL/8ALU550xKCKyQiFX287nfm5hkrbrIqvoRFaKVyCVANM/WhPHjhuqQu5vYaVVvuY6sn6jJNL3ToUqM5FZQMpGPphMlGmohDxLIZJVpJKS63Tx6CsbAlQwr1VJIIOWWIglqdlaW2jhslJg0qrxIrHSRIamNMqgmmf92IyTaGaZI3kESOO5G5ZYZwxWI1oa6fhwFaV48MTK9hz2jarm6ndFQmO4lVmuItIZVzBqHJGoVoRwAyzOJIi9zZvsx7H3nkN6t1cbeTb3AZbe57YWkShhWqkBa0zy44z8jkVxqZNnH47ys3rt3tDY7Jt7RQ2sZbtRroijOk9VaoxOokjM58ccd85WZ11wexSRHyTxaK0juwgYW0ZZjchCWopI/ppRieVBx/HGjFm7jPbH6mQfdGwa3t/u4raKlqe5NYT5REtVIdSk16uJCnjjZjtJkyUSPn35JAkG5ylJ1vDLC8VsX0tG81auhqRTTUhTX5nFpTJGoSkEQEdxKLARtJClwq1aNiNYIU0DAjL+PwxEFqE3KTRpNA9xIivHrS1Ug3AY0WkYI6tQGdMgMC0JEh8R2+S83zbbVZoJLiY0tiFD9OYOtmyyA/D44sSI32Psr+2nZTBtdoLdI5ysTSSwzdzQVamcbEDJSteYrXHL59oR1OBVeht+W2H+nmMMCVQBi/ClM/TkccHu+I7Tqkj5C/u39upHv03ZD24RKsVtBCtWuXJcgNryrkeHAY9Jxb91DzXIr22Z80LqyHcWG6YC7dzb2ozUIBXUVkyLaKUIrT44vsxLVDXdRyC9Ym3VoJYUUqqBVWRSKPGRzZ1qQTXPMHEJJd0oarlLhLiYSy1DqouyANKihKiMsdRypU8+GIhU5byXKXMkZosVxpMNw0YqhOUa8Txoen44Ww7bEk2+Wv26dKyzajGCdNGVakZGlK50OJSVk2sL4Pb2us6be6dWVLcgnUB0u4BGlSTmtOGJSMQbrbBZCwMixSQ9TM2tTU8QByJFTiLJplf3VsZJGSCYrOj90yvGNLDVpYCpADAEAk5EV4YqtKLa7D/sezSbhcWn2sTJuEt3HFnSeESS6cqE1KsRX0xbTHOvQoyWaPoT+1f9uW1eze+bp72+YW4jmn7r+1Pj91GylJeF1dspqh0liIh/71xGIvGsnw0+0d+Rbtmxevnvu8b9Tcjc45LBDLbqyvRY5HJaik6jqyoSR8sbcPFrj95hyZ73RhHzvya9vpX3EzmdkZY2njRYzGwqtdRAKrQ9R09RxdZrYrrPUoOrtdMk8jxCKZpZr1QrRFa0KsTmtSc8uGVMUM1V1E/uwJU8Mt7Ltqr7ruiTJJIq9yKGFdZWMjMpXmMVWTehoxtLUzVDPGu9SXUbdh4rrTLpNaqKK2ZOkqCMjTKuMlV8Zqya4z6TftmupbaSyjjjWUuDd7csYAD6wAVdtWlc88/Q425K6Sc3Fubg91vayy8m8TbctuPbv4Yo0mVFShjQa5GepJK8VJxnx5dYZry0hSj4oe5vgt34J5LebYlx3rOYG7224bpqy01REqArFDxHpjJyMbo56Gzi5FkXtK9hWTvsXjElxNHqaZqUPMppFVJzpiqsMvvWNSWWGsuGt3kkjcxqJwwUo7VohrwBIoeR+eNFKepltkjcunwbZX3n76zW3liuYoDNcm3otY6CtCmTaePDMY3YqqDDmyQ5JevhP3UdtHf28csN1VonT9ENrWlUanGoqVOdeGHkwK+jFi5jo9CM+Re2+9WFvPd2SS7nt9kmiUoOuMKAB0f8p4k8scvNwrLY62DnVtuV4FdJIzMXke1kImhWPSrJpFOpjVjnU4516RudGtu5SgQMZ7JFyCJg7W+paldIJCk5hFpwPPEe0kcjTtRuk6a+yuqNWPWCRTUprqKr68cJAme0ZxLLqNxoVZE1E6gf6bniFA9Bn8cINBLNWGNnMgE6aVu2clsySMzwBpl8sKBikfcRwOewjQr0yW6kEoGIK1OQNAPTCAIlKi3kAbuXBBWLSpWiLQ6hqzbDEmdXrgMinJ41FsAOsUNDkK5ilczwwDApLaqYylFalbcPVmRjUM4A+oA8cEBIAgGOZo5XTU7tYXT0KlmNZGVfjSuo8ONMID3SsavQQI2r7mwqGqDUGgqKlgagcsOAAvKtw8iaGS2i/6aAVDTGnTWo5cT6YZECzRSqQ2tSF1kAadek8P+U+uCBnJpDDJDCUDm6Bd7VgAuo0pQgEmnHLnhCPLSR54O53bhukJUqHI46Qy0UgGhplgA6JViRZEAlS3AjZ9LK9dWRIHLLjzpgJnDolklpNHKZ1IMjUNAoJ4cAQRlhSRAK6sPuJHRUkKxwqhLKa8Wap5jKtOeGOTjyOGntWQq8eqOMNSQRIM3XUuaU45ccASF9yNRBKxmM0a0ickqGQg6QTWgLevpxwxsDJcExtcwlTNCawh6hlZq0RTnl8OJ44QAlH6JErgz3Co8yrnmeAZcgfhTDGBkk/TWIVihHSx0FnMgzqp4U5Z4QBSSsYg4TuSyEKtwHJDkDjWgzHxwCIYhYGaJ42dLZxqjXpEepcyK8yBTFRNhbTCq6XjCcbVJF6lcmi9z5DDAGxii03DNJTSpEQyJOdSBmAteWHAjwLRmqUMRYNcEDUDqp1UFRlXhlngAJasMaSsSs9Stu4qCZWyDOQCVIH/AAwxBxiaPtGWaNmtUbU0lVLB2qyjTmW+NM8DGgwAovbEbTqhVriN6tUt9DBaAaiK51+eIgGEoGkABd3bSXk6jGQM9JzGWVaDEhA3zee4KoqzkieXPqNf6hH5iPT1wIYBIhoaJZxK6nvCJasHcn/2ijgtP54QB8YZlCqwkM7CMxQ+riuoDMinxwAcRnSOaNpO9oYL+oNTLXirk8fh6YbEDEjSiS3kQWZYBpUDagCDQVNQQWA+WEByRVGsh9UkQPfSVCQ4I6lrTML8MNgcjJhjJJ0PcKA1u3E0JAZhnkF9KYSBh7aYRHEHjLwhkrGaBSeLChqozNP44GILj61a2/Viu2MdRq/q0NAxJFM/44EG4oSae5IjiXtyyE65gw7P6dehRppWmZNMSQ2S/wAX8dm3y4tojFLHAjgHtOQ0Oo0BauZJHAD1xqw4W2ZM2btRuH229vYLG0aW6sKL24y0TNSragMshQCtSK/2Y6+LEqnKyZe4v26vVrDZ7epVwqUEoUqYwCAlGAWpAHHGlLQxt6m0/ZyGH/T7e4kVgpCaIOHbVAAisV4cdRr645HLcaHU4q0K999d4O4eRbD44k4YRu01xGw1K4bpC6m+kilMhjTwccVdjFzsjtaDR/tT4habf49bXLQDXdwsMupAtajI4w83P8UI38LDFZIp5tZ/6Tv7XCHVDcSLr1MVIAFaKoFPxrjRxrd9DPyPhuWT4VvCyxqHlAjARY1BUgih6qqWyzFcYuVjNvFyFtIwdPWtKZ8ccxo6i1QyeQ2n3FjIwDEqPymtBnU05nGjj3ixk5mPupoU7Y+23hXkRmk8g2qHdr24AjrcLQpSuVBStcdLLzL0XwvQ5eHhUyfzIj3ln7SfZLy2CdbjxJNrvJV/TvdunkgdWy9CARlivH5bNXroXZPC4bLRamMfcf8AYFf7NBPuHg3kdxuNvI7SNtV1DEFSNRVVMgarHUABUE47PF8zS7iyOHyvEZsbmmxjndvb/wAp8LuZ7fd9vmZLa5CAyPEYphTTVtYqCxLLpJHCvDHcx5qXWhwsnzE4t+RJvH9wMUmqV1klm0dm4c9TJG3bIQ10nUDUAmtfhlhZaluLMi3/AB64tpo7u2jnEwu0EcJencZ/rpqYdI5gEAUxzs1WnJ1MVnZQyNWW3SWHkx22ZA6t+okTA9WpgCVNQC1ASKYzZbSjdgrD0Gny/wAvsLDyTcbi7u457nYIk2nY9ruUcETmr92qGrMKFhUHhwxmhdCdk5IdsvjfknltyjWux79uk8uuWUQbTcywyLKf6wdbfSXbTkC1ByyxB1S6k6+wtWL2v92J9ue18e9q/Lgzp9rJNLt/ZZlqWL6pWjIalAw+k5HjiPzKLqifyrLo/uGyf9vPv/uBpae1e90uEINzJcWFmKgaQGZ7ouDUaaEf24PnY0+gLHf0f3C6L9on7hZ0gii8N2jY5JOmS6vt/gFAPoP6IdgQozNCTmOeD+opAlisOkH7Nvc3sQx7n5l4LsUyfqMn3N5dyhaAvGyiOPItShrkTXhh/N9Ew+U/2Y/2n7UNkikL7z73xIACk8W0eOhq0rSks8meZ/w4l35GtivtS6r8SSWP7aPZyzXu7j5V5x5VLF21VInt9rDipqjCKIkEHLjzwJZPYiSSndlk+NexvtDtl2sOx+0tvu17MP0b7ye4udxbuVap7UjBGNAWpTEXV9XA0k3omzT2w+2m6XNrBbX00O07NppFte2Qrt8ClAF0iK30mnTxNcZMnLpXROWbcXFtbokXJtPj+y+Pxn/S7KK1kYaZ7lV/Ufn1ucyfhXHOyZ7ZN2b8eCuMN3He9v2yMyXlzHbI2epieGqlSch/PBTDa+wXzVqUT5l73bTtUN72XcG3DKjoQ6sKrpYBWqwYggAipIyx0+P45uGzl5/Ix1MZe4Hvtd39w8EV9oMxKSSympOh6IrLUAqU4OeeOxh4laLY5GTmWszPe473ebxcTXG47iUs7iRGNvJTvNIANTIzEAAilQTnxxqVYM09zGv72eNZLTbrArQ1VlYCYqua9WgqAKErn/PDRFv0Ez7PvV0tLiUR2fVI0UjLqFKjRJTqAYDOrcTwwSp3BSxKfHvswsixNcGOuhGAkEkciBYwpoAmfHCdkWOiI9c280fat1MadZZbhmAZRTWKBKKpBI+eHJW9BieO4e3BUSI/UpikUh5ChCuwIJOkipofXM4Ug2IEkYxgW8JIuDqmimVisQCioDVIYLQZf34iSQi1ubZHd2ioHBlDN221kmp+ilKcP/dw1A5ZzsyILeCO3fty1WJX62dStXXUubBjmAcSRW4Lq9udhivZrEyaGtpi1p3HYKq6idZeoJIUZD4cMNyiVVLPsH7L+L2+1bLBILTsFUjSFpNJftqpAHTWorwryx5nyOZtxJ6fx+OFJdtxArRuJB+U8i1ONSMxjl1bTOjeigp7ymwZY5P0wiQaidC6HlemSovChJ+VaY6mC8nOzURhX3mtp47ft0eKNEmrPVZWhFOkyRgVqKFVXhzOOvhaOTnUHzE8me1ut1vZLaNnSRkFtIEP6oXII0dAFqa1pnyHLGoypEdjEI0OkUaPFKZLyxmZi/VnkMtIWhyGdaYgyxI5fxw/cQsjO0aygJL3ayGM5oEOQUKCQQM8sCCxNvba0hbd0aWH761jLy3AhAZ0hpmWqQAAaUA/8sW1KmpZ9pfYMrJb21lcaZ+2ypCgJjURKgcFY65gNQVH4DHJ8g4rJ2OAoZsSolgKltSMlXFK1J5c8ee2sdp6oy577+CR+R7HuaG2WdWiUSdoEspDMyrEGU0NcyV+WOvw80Qjk8zCtz4re6vg9x4xu7qjyygvL3LfSWiSPqCwMrV0q2r6q8aLjryjlpxoyjrvbwYoxJJpkjHftL2N41imZtK6iCMs8mIHwwgTGpraF4pu9JokNGlt0GmQSqCSqliKCgriJMRqwj/QeR5IpDHJFDwYySL+WRjkVH8cIluOQIthNLEkNAFjmthXugOaK9agHjUkfwwluV2Q9RXAA02/epDqjUssZdwaKTIppqAAGfPlixMikK3dLtkUv+uyItuhOnUEALqjHJUULUg4CTYkubWKeWHuyQydjouQpClhViWFGOYUkGuVTX0wdssdbwbI/bR7RWXmnlS7hvzJt/iPiMQ8g8u31yvZh26OjxWTOpXrlJ1Gv+HCz5vlU7V/M9Eh0r3uXsi0fdr3xufNPJJrzxmNk2u1SG08U2jNI4bOIFV1x0Vh3Vzz+XEY18PjrDj13e5z+Vlea/sRSt6bqCOWbcriE3EgTQwdFTSwoo7iigYcgPkcabMrrboZ78q3EXE0id6S6lYjU8wAm00JRZFamZoXoB8uOKbF1GwraYS0wmEcbi4ROxaSuwR3YlHBqQAxJrQc8sV2Lqka90bgL5RteywzGS28bsFylYyoZrsawooCVYJQaTiOP4pZOz7dDOsEKrepeOqyJezzoVoQOqTNTSoqMsqZjGdU+OTY7zjg33+2W+kElva9UXbu442ul0xOgDBqE00uApoAT/PGzJVRqYMb+I+0Ph9jZ7rsckDStMty2kLcALKCwdQpU9FDSoFKY4uW7rb2HWx07lBgr9yvsNbX0l5t+82bWkG4Ok+03scav9rcyFlWRQg0kg5MDkQcb8bpyKQYbzgvKMBQftS96p9zn2/xzwubzLSmmSXZXiZ54/yy6JHVlpwYUoKfLGPLhWF6vQ24+Usq21GLcvbXzbwWV7TzzwzePELmaQ27xblaSWqFV5iQrpLCoYUbF9LVtEMz5U/SCUeDztse87Xf6nex2+bXKqOoZ4Jaa6EmnqAK42UqYb2PpUPaqyv4rTcYo3n2beoYr3aJl0OyvIVYGtKZA5Yks6enUq+U25RKm9kPvYtcUKG9gQiaSFuyZ4jlpkQZauY/hjPfkQy+uF16maPdn9skt0km57VZnbtymBS3mChVkoa0kRa6aClTjPlxUyrTc3YM98S11Rgzd9j3fx3dW2vdbFra5iVkmhkJCyKSTrVm404ZcMcnNhdGdjDnrkWgxsFhOYKysTDHCdWlmQ9PbP8Ay8TXjiiC4NSa3kadpUWJnXt3RkOoqxzLouRFT6nDAJQpJ3GbTDA9HkWurI5g6edSDXCAEC80siyIo0BgYo2IIYZByFyIywmwOJdh2SUmSWWJRquZTpBQUoMgCGzyP4YNggLldK6LYSJ94QAagKpYA1CgA15Z4GNMC0hAIW4aGWNwveyVDqOkoCcyQcIkE3DqyRntgysunsKpZFirSvAcaVIwEWDi7EhWSN42cjVHM406qVHSnEU+WeHAScDxM7N9vrZP6OggIWU8RShNTnTAw6nApMvaW3N010KRxqx/UYcVavTRaf2YAk5LK6SRPbaO1bq36bkiqVJZs+BDcDgEBmJQQGRCUkYm3M5DmQcQGIrQEZ1wtBgg0/SZD21uG1wTgkOBwYkioChRw9MOEMDHoreQgxlo6EhloJQMwTQZAfD5YUIaAN9oqzoP0naOhGTCU09RkM+BGHAnqBuLiaOC3GqOYrQxgjSHcGuoaT1U4V4DDIwclaQOZZlmZ9VXiYdUYNanPKg5ZYixnHLn9NGV45QkyzDqD5Zktyy5n8MMJEy3EoZzGJHciltLWodFAWprx4nCHIPuP2tSsXpUSuWqA2oaVUn1HGuCBnDGYiqoyo8gZpImqUANQKcq+nxwAiFSa5C8TdxEbNWbMrK3rWhAB9cVonBxZZXkVDMkj07UroAzCo+k1AqT64EB6MmAyfcTMf1DQKCXZ2XgWAoDT0wxHY4kEE4V2Yt/7KKqgMprmORWtcMDrK4a3dneYyVaScA6Q6fStBStefqaYTGcBZ+5JC3caNyZJUGo6l+oOp4Cn8OWAQPRIk0XbVjSOodqFVBFNAHA1I5nAMOCStJAJZGe4ALCQ0aSEEE0IUaRTP54YjokDkFlJiuKowlNCoHBhUkZnMYQg1Jm1mGiRy6QjSkipkQZR6x1E+vLD2CQxJJWMkv26wyCEpOw0lMuIRQcshXAMAn27LbMuqsmuMIh0moAo0jH6iPWuAQIXBEjzEiDvgtNqYMslKgFVyIOXCmAIOw90hHjkkKksssDErRTwkd+dMDCD1u6N2yGZQDIBfirPI1B0mvDLPAgDIy0EUZt4A8l2dEzKuekNQdVahjzrwwCg4PuHJku07UdpJWGEESFhwYqV/w+tPlhpAiQbPtsu4ypawQL+s2poSGLdgMKuBTUtTmfXF+KncyjLkVTYHtp4paWi2VwSrPCzIHjBAKafyociTSoBx2MGJJHIz5G2aIjuILGGJYliS2kQaEkAopHQBWoAPr6HGtIyNhWxS/cbjbXEzySSQPlHrKqIz0u7BwVNRSh5DhiVtiFdWfQ323kG2+PQjvmOJbQdnt0H6QpwJqCf5Y4+dTY6mO3bUz5d3jb97l3l6HErRXRji1sJE4VDUPAngSDT4Y6OOvbjOTkt3ZD6I+IFTsNmYyD0AFlAUV50Ayx5rlaXcnpeJX4Eiuvd7aGk2+K8ikjWaOukyDJVVGqQR8xlwxv8bfVox+Rx6KxTnhPlS2c0ca6xHQqKlQJHQEFVfgADmMqY3cjD3IxcfNDg1rsG9Q7hbx1bq0rq1U6ieLA5c8cDPidWd7Dl7kSTpZaZEEHLj/LFEl7SaG3/SbAMzpB2XZtTMnSKjE3ksyn+nqnI4KNKhRw5L8MQL0oPHI5mgFMMTK+8s9svCvMrWez3zZoZhdSd2eWNQkjuOJZgKknKp45Y14eflxPRnP5HjsObdamafIv2c+E3UcM20+TX/jkltVkpFDPAHIADFZCuWX+LHUp5u/VScm309jmUxLsn7X/AA3ZLmGe5848g3yWFmJi260t1V2NM3MUcpNM+eI5PKZLrZI04fEY6b2b+wtzbvYv2/sbmDc7T2/e+3KFk+13Pe7rU6Z1BCFyBTPLRjBfm3tuzo4+JSuyZMJdo2rxGFb+PaPG9ghjYma4gtVRqEH/ANokKFiKk8a4rq3kfVkrqteiGjcPcOPbUiVLuC5a9MuYkljSEqmqjM2oVPIUxauK2VWzpEJ3T3aljmhNlHrsWfsyXSzPJSfSxq4rXRUULGlKcM8X04hTbklc7l7p73cFBb7jLbQ3ZZ4Ggk1qhCLRdUjLUvqJHoKY1V4qXQz25L2IPfeb7lucsy7hf3AZVNbcTMwI59sKQZDVeVMq4vphquhlvlb6jIdye5RftSBddt6tOoDsjLRUzDOa0pQ8+NMW9kEFkZIbCx3TdWtrW3EuqJgpglV1HcMgqqgE1qVIy9a4i7VpuOqbfqXx4v7QS3rJe78rW4NGozPqZzmx0ChzGRJxz8/OVdKnQw8JvVl87Rsey7DCItvtEh0mslyaFz8KkfHLHMyZr5Do0wUp01Obj5Ftm2wNLc3Uaqh09TqK8qAnh61OFTBazC/IrQovyv3z2fagYYLyFZCgKzdygUEAlhXiVHMg46WDxzerOZn8kktDHHnPv3um8MFtZZu67iVkRkKNAUZKMgqFLHl9WOxi4laaHHy8q19Si7y68m3+aW4u3+3kVtQZlLsxepDPShZQh0mnA8BjSlGhQ5sLrTxNQsclWe2apkvXTRJbiXTVVK55MtaZ/wDEd3IVqtmSSLxAmU3F727m4Mixzfdx/wBQCrVCAD6h06q8M8Qd4LFhkkEfjYhln0L2RakaYIwzK0YqxkXS68xUhjTLgajEHkkvrjUaIOGysruVM16tysRkEvbJeRKjqRQNIDkkcqEV4Yr7g7H1GK+2SGSEpHHLCkP6VsWJNZZHYqSpJ6aioPA05KMTViF6lR7zsRKXEawMrzFe+hULASK9LOeLPqzAFfy4uqzPdFZbjGsVxcxok1obs67W7SN6hkWoDknpJB0kU48sTkqhjDcqSs4nZreGBALkBRUqSdFStaLqGQGefxwhoLIeCC2e6aGdSyxtGaiNnqR2xWvUfzE5YROBfZQym6lVEVUaTTRyWQGpz1A1AHyzxNFbWhqP2k26abdbOEqJomCJFJIy0RqgsVRSR8jhZbfCGGZPsP4TaG02GwUilIlISlKKBQVGeYGPG8q83Z7XiViiJZJ9NKZEfxqcZUabFZeWoiwThpDpo0UWsVccP6RavHLjjo8bWDn5z5v/ALhNzWHbNxum7axoinqybX9PEKNTIQaD547nGqcXk2Pmtuy3Mt/dSfbCVQP1otYpEjL06TkVLZH58641syVYGzWV3t0jYikbNCxfttHGRp1Z1atRTicQcF1GMF07U/6zspcKrsrxiRkQsdRhGYGlhx4nEkhW3LS9qo5E3q3haMyrJIEnSOXWhDIT3WpmGFa1HPFi2Kup9cPZS+eF7O9gvo5ba5g7NmJAtGOSs6uFVtWVCDjmc2sqDq8Zw0bgtiXjJc/UKM5yPCmVOXyx5u6hnepqhn33bE3C3mVw5Yx1ioaMtDSi0B/nizDkhlWbH3I+c/7gfaeG7W/uIrdnEtusV0JIwIJCzdKhVIJ0VJD5/GnDHoONlTrB5/k4WrHyv8r8SvfHriZgiB4p3ZJnBVKwoKgk0ZTnWlDq4Y1NGerkr2WGDvwXUdpot9QN/Z6mZk10ZXDmqkA8ApriJZIkuIiyyTXBST7qZVeVgTTXkByqFrwrlXESPceljQNKkEg1VEEgepjDKOiFU0kKaZ1/jhMAqFRFMXuSrLE5Bu2oNJoRmQM9JyXL5VwpgaYstJJLYIJUaNEOqMnS6zOANQo2X0jOgOeLKkbewl2wQW91NHGkEl/HB3JbKElVMyuRSLSasav8/XFkQyLehqWTyebZvAtu9odjM1tbXNz/AKn7n3kWof6lu71EFrFIMvtLEKBnQPKDyxow8X4+++sbGXLyG121H3afHU2mza/vCq3Nz/mYzOQ6PKoXU9K5ZEkcqYvteSutWtUVD5x5DcJqq6/6dGztAiR6RGCAdbE8HJqRyI/DEEhtyykdUm53qO4e6MsvcmqKFYnNSQzjKlAWpnyGIli0RYPjdpttiN23e77cOybVbve3upSFfRXt9rnmSoHxzxVkcbF+JudTNO+7jdXK7nv0w1325XMl1ewRMUSNp6FAwOYKZAHFladtSDv3XIVbxUjWCDVJHNOZIrSc/qE0BepyGQFTiNK7SXZLaGuPYNriPyWwtYLqERbgqtGY6qjFTTRIpyrUUqaV5HGjNT4JOZTO1eGfoG9oNs+62xL6WGrR5KjKNOokiv8A6c/THk+deNEet4le6qZJ/Mfbq584+1sLuSHa9pidHurjSHuHMbagsYPSFanE4p4/MWBPqx5uHbM1OxLPEfb/AMT8ItjD49tcVvLIp7+4SUe4kzzDPStPhjNn5WTK9WbMHDx4loh63nbtn3myuNr3vb7Tc7C4Ui4sbyKO4hkBFCHjkVgag0zGK6WstSd1R6MwD70/sM8P3qzvfIfZtU8N8jiDzjxVyTs9+xYsYFV6/bFsgCp0D/CBnjqcTydsbi2xyuX4xWU1EX7Wtyvt02Ldva/y3bZtt8u8GnP2m3XICywotA8ILD/2LjLkVKkZY3823bGWuzOfxInstujZ+2ePFlVZUjlmYVD9vpdDXM/H1rjl5OQdXHgUDZvfhdnODW1JR6VNOBr10GdK4eHk+0MmDuUGFvfb9u20+X2V1LDaMm4Wrs1huSoaxxsx1CQnNgdXP0x01ZZVDMcWw20PlL5f4Du/jF9e2W5WcsN9C/bgYNoEgRqF1plRgMufPGHJx3Q6mLOrogr2MizzSGOaSAMoVkSoYsKKHHEgnGdY2Wd6Q1OjxfqS6opY6xOoTpRlBAEwVjkKdIHDPEbVaJd6YjDFpGWSN7eV20vIihSAtGDIKmqGudMQSGnIc1zIZZJknH3QAaSJs4pAMqADMkg8CMIlAj76vHK6MAlDpLigag+kN6CvzwC0Bd1VEH28blBpaRDqbuvQBmrzouEMLjkURsLVgysel5cu1U16VypWtMsSEwDXkr9uVtDo4GgVrQgcRXhWn8sIaBx3w1oKhFcsY569aBsiF58eOGwgLW5lKOHXXpDKZmqUAXLW4FDU8iMRGAjuzE0TFhESe2JOCutKqzAVpX54aFAEXR7oKssxZTHMY17RCqR1AE6R/fgYQGS3lvHIQ0qxvKmqS1Ztccun6XORp6UHDCHB5rkz62Zkli0JGTIwVnBFU4A5Chy9BgECE/fZFgaYulI41BDxkcBTgKHl88NADJiMyK8qs0LD7xip/TIGWih41OWHGogBjgiX7pZQjI7icSajrUinStcx6nnggaBuAGe3SqXEbVAChagV0ofUZ1wgOOgjSR3dY7e7Q6ZagBSqjSqhQePDPANga6IZ7eOITSO4VrZqdr+JFGPywmOAgyiWHu2Z6kZTdajVoy/QBnmQTlQYQSRNg3eCrcKbhlQXDEFVbhppU1rT+GIImwsyOHvSkWuIuGgkFQUFeVK0B+PLEhAknitalGmiioTbhh9UjZAeozrxwpALyEkrSxuyTAm4VWA7cgNS6ivpw54JQ4Od+Tu2haeZQwdIRJVkIyFGXgtRngFIalzCxhDuVj1abNwrZgDqVhxYtzJwCOxSRadNWt4pnBSdKrItPiDkGA/lgGHm4AmcW5MaRhhCuR000hiR/wA/KuAAKyQsxMMzLb69YjnJJBcAtSnH/lpkThoAyORzFKVMUEbGsMjHTKxNKAgVqF4thiBMZO4Xgj7Qtz3aLR27lOoqCaNXkP44ABHS6zSKnRpDKhXNakMTJw4kVwhnVeZZBIrq0d0BJMJGQByoNCjUrlXh+GAWgLuK7SRSTTRmWM9sSGjdqp4sMgwpxPLDSAMU64lmDvAHk/TuEWqiOmkuxypWmeARzUzpLDbMsjzULyx6mZKVACqv1VrXAkA5WaEXKwhOiOsEiKkncuGC1BJqBQ0zpi2lZIWcF/8AgHjFDDc3LFZjGuuRzp1q2SonPIevypjp8fFGpyeTkc6GpdtX7WBkL0Vu0g/T6EJzAKBQak8cxTlnjpJQYG5C73c5iCrKkjwyF2NG0yhaLoVCVPECpFc+OJJFViceFOBKskk8ga4kiiimcsolVqtSpBApShFcxwOHfYMe5std4bavBLmQxhXkhk0QLmTmAKM1MqDhTHN7JyHQyWihRHgVzJJvrMzxFnuZTWLp0oR10JrUgilTX4Y6OSsVORV/GfSz2/vILjalSJdEak6IlXTQUWtV/wDLHmOZX4pPT8K/wwSLynbBuuxbjaCJJXkgfSGXXmFPI0r/ABxVxsnZdMt5WLvxwYCv1l2Td7iwSQ2wiZyYZVWq89IFQCKnkMxj1NV31k8u28dtSzvEvcG5tIhDItJZNCfbaSpjUZllzINR64xZ+MrdDo4eV2l17b7pbc5iiluEElHqtQA2kZZ+vxOObfhM3052mpOLLzfZr1gsV3HmOirrmaVI48RjNbi2qaq8pMkEG72VyAYJ1lrwC1NCeRxntjaNFciYrZp2AMcQpzMjAZ/IA1xGENsTC3uZG/VvAoJPRAgXI/8AO2r+zDlEIb6hY2rbQQZoPuny/VuiZTX1o1QK+lMHcNUHGNkRaIFRFNAVoq14f2YTbZNJISz3lvbwTTSvpjSNnkdRWiqKk/DLDrV2cIrvdVRhr3S9y7zc96+7tTq2ezmVNpumYtECtVcFV6eonOorThwOPQcbipVOHyM7divYvI55IrgpNBfGwjBntHXVbd2auho4QwYhSK04+nCuL7VSKe9vcje97xc2c14dTRiKn3l+sjIzTyLSORKHTFAygEKKt68TidKpkLX0I5OPvGjtJ+1LBKqSpICFRJzJSVpFRgzEigAp8cgAMaK1gz9zew77DtG5blJIos2JkcRBiplBMYqf0wxIbIEDkMLJZVWo60dnoaa8I9lbi5ihut1jk2+NlVkfUwdi1SCFrTPVQ545mfnquiOhg4Vrbmktk8Z2LxuLXaW6LIoGq6YEsS2fHPnn645WTkXyM6dMNMYRu3mW07YJCbxHkj1d2IOtQQpc11H4YePi2sGTl1r1M9+b+/23bbG/297DEgjLv3dJY1Kjp4UDAUXL4546WDx3qcvN5F9DJHk/vFvXkFzcxWkU979zJ254EKheOpBQLmqGjMQKk5LljrYuOqbI5OTk2s9WV7Ls3kG9SNdbtdO0JZI7iZVXuI9f01YALxB1EA8KcTi7YpspZJtu8Ot7FpFNrF3okLXds1XMjvnrYk1DEMKDP4Z4j3E1VNEqtdighjgVo9fZJCXSOzaJHJUMBJWoFACMuqvHEZLUhzgt7W3MLI8f2xLRpcprHcDgmRjkRQE/VX+ymE5J9qQCS5itok+4obgkC8mcKZO2BSLuigIDgnS3/wBcOWIwS7xNLfWqLLBLcPBGV7xhVnBPTnXTVTwFVyyOWDtkn8w5LcrNNIsdZKu6DsAdUUjaggBFVIJoKmo54h2sTyCL9C6aHtkOAnYkRdOpZYmIEnMHSTQAcKdVcNJog3JDb/biXMkKxy2sttLL2yoRWehq40VYOcv/ABlixWKrIqjyDYJV0AKJI7pl7Ll+3+qyBSlKBqjQSfXL54mmU2qVhdWDh07cgjSQva3RlqNT50IAGkCuVQKnFpVMMbbm3ZncXIeMPbpEdC17WkU0lDUamHMDKvxw0iasOm2W0xl0BkaaaFTI8HS+nRqjUIag5GhB+JpiaiCu94Nqewew/e7rtjxJGyh1Ih0aI45SKdteBBrnnjNyr9tGy3jJ3sj60WEH21rbwnMRRohYDiQBUmmWePF5LS2z3GJRVINmbQklaA6Tm9KCvM4VdSdnCKX893D7WG7dJHQdoITUhQchUEAkE/DHV4tDj8q+58mff7yRL/dZoobzsXGho2hFZKI70arsaajT0Hx447mGkI4eXLqY+7CSd91iF2iVSRXUkGBagqysK1FCfQH8MW2IVYYICYLmKOSRkZV0AaXI1NRQOmmerqA4DESyrgi8s6JeRsZhAiEC9smBHZJDK+kNVqVrSg/txJEbssT26ka23q0iZvtHlKyRyykjuoxrpFDQByMqYtp7SPdqfWD2beVxbJIJIkaRYrWF3dgEFGZXLZEkD6vwxzeZsdTitNm99kUm1iDDPSG7eWpQakVplnjzGbc7+J6DpNGpRdQqCcwfp6sV1bRY1JUHnPjEO62vbVQRIJFEmn6CqtpegzHGmZ+WeOnx80HO5OHuPmF70+1tvDE94+3xy3d2zxQ28khjlLRv0yDKmnOormTxJx3cWRWRxr43U+f3kuxXu3Xk9uzyiO3fs/dyqHRULVjJVBU0PqRwp8cNor7iNiJY27LygwgNqmEYUuXBbVblNSqAVpU1yOEIQ/bRSQkI800mkxSQhaJGqmiuoOkEniHIphQDYVcQ/atCO5I6SFgkrVK3LwkAq1KlVALZjPVlxw+0SZ2K0MczRxuiRPqljAZ3dCQpp1UowORoBQA1zOJJehKS1/APH973a7hns7cRvE320F7JEJaPLShidKEEtkKDLG/j007rGHPlhxXc+gntv+3mbbdkHkvlgbZNtt4XaOKVik0jfWRIpP8ASFchTPPFWTmVnsrqyWHh2/mtsVV7peRW5F3aWLKqRJ24LeJgqRGOvVRdOoPQZYspVvVkMt0tFsYp3bdJNyuJpJkjs7oKwkZNVSMgEPV658MSZGo7+PbXJJBFfaHhvm7bGaOrLLEHbSigAamy4U/swoSJKwp90r+32fYNo8JVC17vLjevIHch+zCrkQRZdSrJIC2k8qZYppXvuabvsr7zO/krvDYI0Ko8Ny6293MoWSNnVamqNVgaUzPDF+fRQU8fVyR6wjUSsIoez3tOuOQ1NPQ68jTjXmMPEkWZckG5P2ieC7p5t7heP7TbwEmaYu+5R10iELVpCBVSKDgTQemLOZlrhwOzOdx8bzchVR+jzZNqs9lsLbbrNQsFmgjWgI1EADVwzr8cfPcuR3cs+hYcKx1SQ7mRQKkEnFRchLctMVYQ0ZiuQNBU+gxKkdSrI30K63ebc47hDLFKqNWkqcAaAiumrccdLF2dpyczyKxNdmnN3bRtIr6wFLF6givJvxxhzUVbabHTwWtamplX3v2i28F9yfBPd2wXtd64G3eVqoC963YaQ70p9K//AEox1uBb52K2J9Njjc/H8nLXItmar2lrY9Vu2qG4RHt2HAqatlyIzxycia3OvihjtPbRzxPGwNHFDTjiurhyX2pKK48o2FZ7d+2hNFH1jpYD/F6nHR42dt6nOz4IRiD3K9ktj8peeyv7WONL5F17gUZXhJJNRn6n8cdlNWrqc61njZgL3C9jd08J31tu3e2ijiuEaSwu3i0pcwggI8dCOr19MUuiexas7jUp/c/Aba4DSIkVs6zZSMoT7jUdBTjUaTnU0r64i8KJLklT7l41dWgCSKVjBC3CSDqIANWQ8loAcjjLfAzVXOmQmaCTQhZRHHKjRiKpEaZ5GnEEn1PDGa2NpmmuRMap5poIkWZCkKk6CqdtbhuFUzOakmtMVtFicicbiVjWCOTXIGDRBeqRgoGoKa0olM/XEWSOzbnLJE5mk63kCSoOhjq4NQ0zYmlBgEAEztGYwsaGGQGa3DABg9QACaU08TxwAgoXYFwypGWtrWqT9slQsbDM1bpJ9Dg3RJs7DfUuCQjQz2yHuQBwUZNQozH1A44IEziXhhgbWyvIzvbrJJkikgkPQ5GnDI0pTDQahaTxydshpUTt0lBI0ylQNQdiKAc8DQpPGad0kpb97MzW0RIjIh1H9QgUFQeRGfLCgaYot3Zddz3FkdZexbM1KpISaqC31GgqQRlwBw4G2iSbXsu87l27ewsZby1DhnMlOgvmXUJkK1y44srib6FNsqroSD/sryq2gLTbVO8elnBVMyv1K5PHLID4Ys/prLoJZkxkn+5ilE8sb27xMLZo54xWFGrwLAAsvypiFqNE1ZDc18I43ckCV5RG7hhUNxZvWh+eKogmmAknj1xOCsoR3iuleriQGlGFOAFaE8qYRKRvnlkjPZdphAGdYGkBWsnLgPT+WEIHHcy/fLLkFjjKPIKHJRQkrz+FMCAi/wB3EImaOFO4FyRgXMQA1ay1OZNB/DFSLWBS8QIskcmiWVtRJp0H6WZhwPwGGIDFdlHuHSRaAjvdwVjdctRUcVzFBX44ewoAG8E8bZpAkz0MJbUoI4OeBqeANcIYEzLrgMjtKIyVnjZ+jTxWh46RnniQgzuyyrdqjVZwp7SCjrTmGyGQzIwggD9zFE2hZO4xcCdXppdVFemo+v8Al6YAgUPc9cJeYwdyqTXGpSSMiVpmMsgcAwSvrV7eUtF23ogDBjIa5jlTSCKDAAYZoo1S4RzE1qCkagBndhUUYHIE14+gwxAWuhW3dFMTxoEjmjIJrxrU5VHGhwhhs90qMBMQiW01KJmXV+OoGhFac8ORQGm4EUIMEn1dLS6UZSoFWZFapUg0HDAJnluAkkkoULIgCBUzic/SBkeGZGeGh9DwukV27cU8Jue5GscbHSgACq6gcaZk14YNyIrijNNIeKGOAiKWSJW1OQorGVFcjzPHE0gexaHg+zC+vFvU/RKzhoNLB44QaB10vyUH5nG3j4m9TByMkaGptpsxZUS2WFktmNw/cDNrABDMoqSGRSKfHhjq46wcrJkkkC7gXaznjr+sJhFDG7NLrIp0PQnMNmB8saFUp7gMMkwaJkuTbvap27oZIGT8g7TjRVhyJqczQLixIps2Wx4GbUrHeRCHtsyRTRoSzGMksyKpGmtQDqbIYryIsxSmXf59vna8XtLOCcXRmjkQ3LoR2kUgHpQ/TXI6cUYKTfUv5NvhIF4HuojuoCzdkGVIp7cspaAr0xkvQUrkBQZZUxszUcHLpbU337Z+Vwx/a2M5S1dlYxRNT/l+oKaAtnzxweZgbUne4WU0jHPDOilSGSRKjV8cjXjjiw6s7KaaMpe9Xhkdpcf67DDW3mc/e0QAqHCg6mpSlRj0Pj+SrKGcHyGB1coonaNl8g3GSb/Sdqv91MZDfeQRtBCgU5NrYoGA+GOjkzY0tWc7HivZxBfHjftH5PfrFPvG5QePQ9JjVlW6u2BNW0nVpoR688cjP5CtdKo6uDgXtrbQuvafbvxbbQjzC53m5SjyzXcvEjLOJAo/DHMvyr3Olj4ladScwSWlqNFskVui0UrGoUcKAfwyzxncs1rtR192tFqGlXX9IGdTQcMsCoxPIhtfySxAkHcNY01OtdI4VFK4l8lsreaBhuvOLK37ml444zHrSR3AcsDSmgVJ+GeLFxyD5BDd49z9viEqxXEbSDtsc6uz6gJECGgBUHhXGjHxjPflQU35X7p7huMN9YW07dm6Xtskj0YdvjpSPM6h6nG3Hxq1ZkvyXYzxNbd6WOW3tbkIlwLiSKmhV+nX0RnSVoSwLA5jLG9OFBjsw+3aeJY5IbOWZorkT1ZADLLMzRPmDVxEhNAK1r64UA2MMaTX5n/zP3MtQk8hKPJNUEozAkLGVrSgqwoNVMWpJFNtSz/EvbO53m5hGqfQjqBHRG7buykrqJNQAMyaYpy5+zUtxYnY2J4d4HsPi0P3Bihmvo4ys0hjVVUV1UFBzI/Ljj8jk2yOFsdfDipRajnvnney7QjQ/cxtOtQKGiBlBIWtKk5ZjlivHw731geXm1ojMvnHv5Z28EyruEcBjNElgJEqqa504AUORYcBUZ0x2MHj0t0cfP5FvYzfv3n3mHlE00lrBJt1qmmKS6ldqIhXpfqyAJ56a43UxUrsc55rXGOx8KuNyY328X1xuE8wjhnCkNGkzVAYyPQhQCRTE+5V2ILFedSb2vjNhYxw26DswSqTd0VNUKRtX6mArVl4kfwGIu7ZeqwOLpbxKZxHbyQu476KC2pSCgcmtRQClNIGXM4STZZCCrjdYIdJSTrlpG0ilFeJVq47zLwU6iF4n8ScPtaYvm1qMN35FJGk5dWWKVyx0KkSqEVqNFCCCrjLUCaGlRkcTWLUpedDHeeTW8QYMoeIIjzWcYErzRCoVnXWRSM5jTSvE8hixYmVf1K9Rgk8njC9mS4MtvQK86xLpmRTkGJJowIBqeH8cDxB88a38scTU+4Gu7Kie2nAaNnijUaUrzQCrE8yKcML5QfN1DIPJbuS4cDVrdQa27h3RiwojMzCrORShOZzOQwnRE1lHux36GefpZHMZ7SI4pOKE1kZidFSSKUNWxVahcrjw95b3MHZkmCz2/0TutO0sTVKkhWDMahczyFBxxFpk05IrvVlA7G3QLDHbzPbqrLlGXqSdXSdOZ0mpI/skthOuhV+52gMl2ohghWzaOF45WcyibIawGUnMtlXI1qfTFlTNbRkUvbM2rfa3TSSWUMqXElysh6jMOoAABdAY1b0HDFkFTY7bDt1xfbilrbiKa7hYlbigQlSAxZ+YqG6TStK0w9iESfT39s3hPYii3eeJ9A0zhnVlZSdQVQcwcqY43luR217UdzxXFbcs26q0VV+rSBXHmWepqho3jcIbG2mllaONKBS0hotWIUcATzxdhp3MozZIRjz3g8ugtLTcGZ0bud2DsMxVXd1RgVVVNKgGn/E47/FxxBweTlTPk/7l7yd23O9EpSfsusdqhpmlKOgJAqpbiTnUDjjq1UI4tnNisYyjyB3ika4hKtBeFtJZ01dtZB0npFAK8cQZfXYb9xXv9+3XQzwx6oHjVFcSMayVAbNNOeWdPngSJuxGmmjcNrSZZdIHdi/UqqdLqrNUuCerPgMTSIPUtPwZ5DeRWUUIkhA7otJIyyOVqquzr1BSDwP/u2QVTqfXL2D2+SSNJ+40uqNFlQ1eJmdQAFY5FeBqQDjkc60KDscGs6m6NuhWKGFaFdCr1kgsOnmfQcqY81kcs9HjrCF7LXgpBORGXHll8sQRYMN+iPHRieuoj4oSeD0KgVIGXHF2O0FGSsozF7l+L/dxbktpakMidiM1BQrNRGjVpHzCmp5UIx2ePl01OPyMUHyp94/AZrbcmht01Foz2plAgAjjcsqzMGWlQDwXNchjqV+JHLtNWZbTb7xO4Cjoe4FvbZmBBDuQGhoykOR00pnwWueDtgO6RS9lHNCshjuIpXUW1zqoqyIfpVAKhBGa8Bka4n2zsVW0YlhsJL0pa28Yu52dVa0hOjuIiAK7FmyGWYI0nElitboJ5FXc0d7S/tk8u9w761jWwa5iDiS4syhNrDJSjNPO/GoqaKc/wCOLbWx8evddlVfmZn20X2n1c9t/wBv3t37N7PFuG+LbblvFsqOt1MtLeIoTRIRz0kcaY43I8jk5Nu3GoR2cHj8eFd19zP/AL+++0N4tzY2P60FsytBGJe0zkDNmVlGVOGN/C4fy0m92YObzO99tdj5meaeRyeQTSTSObuKYZRtpEkwUnMEjqA+kfxx1Nkcyil6kW2zZW3W/t1hgJEkf+WsnUEkIaBhJTpVGyz454qLXpoXbYWVrt0Eu8786xbf4/btuO7SsCH7Ma9KxONIEjk5D/mGKr2jQvpWdjKG4bzf+Wb/ALz5DeN3rveO5JCCQHjjXpjiLZAaEAy9c8aONjhFXIyawQDya6LXUFsq9FpGO8JCI9ZoFKs4pnlzxDk/zwX8SvwSdskgSSICKkOpe7M3StaigVjU5V4kUxdiWsGbkbSfbn/bZ8CWx27y3zqeDuaUXbdsum01CN+q+kCo4kCq/wAMcr6jzRWtDV9O4u+7u0fTnyHzXxzxG2Nxvm6QWEcQP1nrYildKqBzIx5bFxcmV/Cj1efm48K+JmUfLP3p+K7XNcRbDs8+4uoVobi4qkbA8WCrqqAcjnju8f6fvZTZwefz/UVauKlZSfvT8qu3jSPx7brZDpzMxJJ41GRrkRT442/+3saWrMa+oL22Le8Y/cB5Vfx7fe7rs1qtrcy6eygZJWjrxBYCpoeWMebxNKJwzZi8ra7Uo2VYTxXNrBdwiiXCLKhIoaOK5/xx5q9WrNM9PhfdVMon9yW32197dztcqe3aXcMhAA1sAHyVgcsdPw9ozx6o5fmFOH7R49lvIbje/b/x66uW/wA5tsBsLlWrXVbnSpJBNSVANcHkcPZla9ReOzd2NMvBalanOvA/PHLZ2UxNcwrOoRiQq8aHjUZjDq3Vkb1lFOb/ALGIrt0E/TcELV1qVYU0g8iMdfBmmpweTWLDX5p7SbB7m+EyeP7xEIpVRm2ndFQCe1uQvTIvGqk0qOYyOKXyXjuX0w99D4m+e7fv/gvkG+eM+Q2P+mbxsl4Ev7eOjLJlWOZBTNHWjA04fLHYxuuRJo5rbq+1lX39xY3Uep4da0ZbW1SQMpU1LFtILEBjw5Ys7JD5jINufjdneoVgaK4D6p7dY1MZIIIkcA/UCaAV+OKb8eTRTkQVdvPjdxZGSVo2PZCS61BbpNBpHEKaVzGMeXjuptxZ1ZkCvE7TIBGHe0mZniC0GbUUTE8viM/4YwusM21chMd1LbxyGURyyvIFSWUNQKaUaMnOg4VOItLoSEk/6geREElxEmoyKlTIrkgtQ8K/DESUgndpUjMYftJGaWygrJIAwBGkAlgDz41wwkVyRyCOvekuO3IDLLb59tHr0mo6iDSvLOnHEu1hIEMgZolCkQKwt5HBmQLkQVjYUoxNPmMOGKUcdSgijlEkEAYRiYrqiMeQU6Kgu1RxHM4jDYdyHvZvGt33qRhaWAaOaVBE5jKwqChrnTU3AHLKuLaYW2V3yqpp/wBvP2/TX91Z3m4hri3lP6bmMIg0serjxIUDhjdi4vqYsnK1NmeK+2Hiew2kHfjRWidVuI4wtaA5qpIAxrWFma2WdyfXuweGubcL9v8AcKxWPIqDGKaj0q1dJAGGsdkQWVFI+4Hs5te4WNzJEe+JYZJ49AQOpOrPkSKkDhXBbCrbk65oPn/514fceI7hcRwyGazeFVV5FYsightIBUZ1yHH445mbj9h0cWXuKvkuS8Uq1XvSQNpSJizhMwojRhQiQg6gfpxja1NUiCa+UxppVRG5QTVZtZkpQxRVHBQePLEGoJSBju0M1zbLVJEbRA6sNaKrdaSUyIAPLAkA2F3jDtVriQlWjnU0XSlK6lFch6YrLRM00gLO6q7msiTtkrBuVD864YBboXJmkmaGNWVppnJVQzctJBqKcDwwEWedoR3J5DG0V1wiP9UNwJbOnMH5YYgppWVUjYqveorrkzA5BU9dPDhgYHZZ9TxvMVkji/TW4TVqOn6hpyBFOGBIA9TcRPL1xwxV0qrLUArwKH8zcjXBAgEM0ZUrcqy0JebPIg0ox9CeVMBKQUd0syPDJUI4rCJK6u5qFS7DMV4j1whCu3mlE0IkjZGjqss+TUoMgxHGgPIYYpgTrOyQyG1fuxxsS8ZqYyHy6DxzIrngY0HW11HJdBh3HLoyuHoDIBQ6GJqVoRX1wLUGCt5oYUnea3aF1AU24BKhiar286ipNc+OAR1mvZoxa2VobV4l7ktyWpWmVM+Qr+GHA5FS3Ess0rQS6SEVILROpTo6nRKCgUtmeZPwxJ7EZJFsVrd3ctnGlSJFFHiZxVSxHWTTOuQIHDFuKsspy3hGuPD9kjt7IXVwsEQiYRsoTWzinQwoc24E14Y7eHEkji58mpZjhra17EU5nuAGFu8QCsASHlV+KnVwrTGmtTJYKknkuvuVjUI6KVLRmg7jf4jlRh/yihxdVFUivaNuu93v7fbdl2643W7vEZbjb7CGW7kcA0L/AKYJUjlUZYHai3YW95pnxX2r9yuxHdye3PkzW0nZDTGwkVpARSN11BSchQ8hzxnycnFt3qS/FgyLZMdPcnxjz50hWTwLytzbqIg1vtU8kKGTIdUZdW9CeGJYMtJ/mQZqXjYo/ZNy/wBJvLe0cLZbjcERSbbcrJBMroPqEcyg1HxHyxvcX6nMsmnqaW8X8yvLZbeNIHlvYmASCFjqdjXIaDUgV1UIxkyYki/FksnozT/i/uB5ZbmIfau0Tds3Sy6SEr/hYtQfFeXLHMz8SjOph5N69SxpfNLrdDLYLtFle3EMitFDLr0R6TVXdWXkRlTPGJcZV1TNds/eviE9z5Vtm29+Xedy/wBbvomUvYakSG1qPpENVAzOROZxH5EvRElm7SN3nu7ISz7fZCKKOocstXiCgio4A0+H4YmuD6si+Y+hDrv3P3oQvJLcArNHrW3t+5Hch2/xAkaaceFfwxZ/SUKHzLSM8nujfLG0clxKzRER953IU8DVnoTTP6iOOH/SVD+taEE3utuyW8tuoLTWiH7KOK4pEQa1z1AVAzqRx4Yf9KkRfLnYYrz3H3PtuFv7dO0iyQK8muZbsgM4JP8AVGYqeXAYmsCK/wCpZH9x85km7rRfoqARFGjL3S7Lr1TSOR+ZSy+gFTQYnXBBG3IInNv11Kbi6lEiAxtDHAGCO8oYapNTHNlFCdX4Z4uWOCt3bEVtuBtJIpQrkW0bTLcgUc6gTpdv8AoK044l2gOkNzeukSCAWZnYidKMJOy7VEjVNGVtRpzoMgK4HUO4V2223W5yQpIDKJJmNnESVeDM9xgq5qOAorAkCvHEtgmS3vFvEBLJb3NzXSHMxjaMoJXShAUMRWorqY8eeeKsl4LMdVMlqny7ZPFLdrOz7bXBmHbjSJV70kpeokCEaaUNC1FpmTjI8Fsr1L3nrjUlH+Y+9zhbmO3uJdFvEUjjj0u8M9KdwsrMVLNUJmfXJTjZh4FamDLzm9ij7vevNPLJYBPo2mzmImMjSMJJARWORXJr0UOqpowHLG9UrTYwX7rudTm2+FWlosM00In+4j1fd3DF5wrGqRUZWUlaeteGeG8rWxKuNdSZx2cVu0LksJI9LxmQrqai6DElPrpWh1Cg+XClyXKqqgi73bb4TFC6yz6o2EyrKjEPRQFkqW1txOoUoMSrjdiLz1RErjyO01ogu4QqTaxcJl2BEj62k1gDNiFFQQfTF1cLRRk5SIlc+ZDSzQs8czD9WaKnbmYnUqlpM2rQkKPWo5YvrxzFfmJEQuvL55FCRLHFpuRrsBmRNWqhSFFIlJpzoeXLFq45nvzCL3PkRnliddJk3GQL9rKx65IWFVdcqRjq6qCvKuLVigy25bGJ/Ibh7iSrSLcSRAGFYVOuMkaGzqMzQA8sS+UoKf6ptiZN4k7bSKVmVkNs0MpEcelatMqlvzKBSgHWchiq1DXjzN7gDvLubuKO9kt4yiW7zzqVkijBOl8s+JpSla8csV9kGut2xXBuE8ay2zR655Y20mEmritS0pGRagoprWrGmK7VL62H+y3yWOCNY+4O2CbQTFTCoohMh0iolaoIB9FyGdK7VRfXISyy324Q3UGsLGirJGK63ikVRpfUACZAKV9KUXFTqW1ux+n3MzQ9yeCQLI8NxMP/AH6tDr1HiqLkRnnQDM4gl0L+4jVx25JYAbmRIo1aSG4OUjOT0nQ1KUBoNVflliaRmu1uQ6eI95Q6uiyAxxCLTIUYcNPTSNqVJHAYtqiq/sL79mPbe+33dLN5bZLhJ/07WOoaRJFGpapUUzatKn44pzZq4022X8XC8lkkfWvxHxyDxnaLawiAEiIDOwyIZjUj4gE5emPH8rO8156HsuLgWKsEhuZ0toJZHJCxqWc0JyHHhnjPVdzL73VUZy9x/PYYIpzHIO3DE9VYqiNEw0s6s4J6VP8A7mO1xeLCk4nL5MnzU91Pcq43Vru2ikmmlXtojVKAKtD3TGSR1ALUrkByOO5ixwcbLklmVNymnv5FmmIuDHcMWlZgsmo5sxAqM6ZUNPhi22hSlImCBIWuJwED1QyuVDlyaIJCarVcqU/88VMurBDd2aGa2Hdg+13C2CwOswZQqhuhxL9JbhkRwxKtWQu4I/GUS4DmF4mtw5ulpQGN8izMtdJkFc6fhiyNCHeXj7XWE1zvNhayOkJkeOWwv43ZxFEa0YqBUgGi58z+OJLRNlacs+4Xsb4w+2bDZS/qNN24+5M4VCCQCQzKoVyRw4/Oox5jyWZNwep8dj+GTSEQCrwooHTT6ccZnZR2QhQWGQFKMeR5ZYYCGfMrRqK1KMAdR1GhpxoBh1FZIqrzO3tY9ueJonf7U64ltyQ/cKagCqkkkKtaEcDzx0uLNmc3laI+bvu/BbXck8EzSRd2WRLZHAZJGUuW7hyGkgg6Pqzr6Y9FgWhwc71MT7/49Gs0olQxRxIpguZou3SRW0hULaciMxQEivPGj5Lt0MjyKpIfAPZvzPzrcLGw2HaJtKzi3ju7VZVkcEco5FOhKcS9K4nauPEpuyr5l8rimv2H0s9of2WbL4zBBf8Anc6mRFBTbY5A04V0BcSznIDVU0GXpjj8rzSXw4Udjj+Jn4sjNF797geE+3O0/abGthYWUaoCYtKxMQemhHVK9RyqM8YcXEy8i03k15ORi49YqfPH3h/che73JPb7XcGQTkxvbwsSyjP6pK0Q1+JBx6Dj8GmJe04mfmWzODFPkm+3W6vLc3U0tzdmRKlm63Mh0qjOKEinGnw9cbJSRjVHOpDbfb5d0lZPtppbRJG/zMa6CjMQCqiuS5Gh/liMk+30Ly8R8KgtFY3LkPGDMsyN230FKtU1pnXIcsVWyF9ceklTe/flMsFrt/gVk7me7Ee6eYxZRuB9dnaSMpp9JDkHgdOIRNkTpFU2UTZgC2uu3WITSI1zHGKFF1ULSLTOvCgx0sa0Odlt8RBd4mmut03Bn0uxKx0YhNSxg0ZHoCAPjzxlv8V2dLF8ONEr8ctXS7czHUZeqcN1OSD0UqCtAwAHzxv42ODlc3IrVg+5ftz55Zft49i/D9nMULeZ73bm/l24pRlluwZUeUJUKEQjLmcuOWODyOE+fyX/AHVoa8PkKcHj76sxd517q+Teab1uF4dyM7yu4njLPptwj5R9RAox40B4Uzx6Tj+OphSqkefz8+/IbtZi/wBtPbPzX3N8ih2jxPbhue5IpG6brKzfb2sQYa5JXaiqRXpAzzzGFz+Vg4lG7Ml4/iZuVaKpn038F/bH4P7d7da7r5NKfMfKUiWSOScf5ZZEbUkcUSipXlwx4nP5rNyLRTRHtcHgseGs3+Jkxsvb653vdGuBbG0tUdmWFkXtwhmFWSvOmQHpiN+Z8ukNyy3Hwe+8paGkrO1S0tobWP8Ap26BFIy+jLhyxwb37m2ehx07KpGcP3K7tHF4xYbPq1G/vUkmz+hIwSHIAJyOYPrjr+Ixvv7jkeXv8PaRz2B3KOygk2WViYt0rNZyyMcp0UBlNaKCwAagzONflcc/F6GDxuTtcM1xasBCo404g8vgfTHnbHp8ewpI1fjz+WIEmQTymGNpYGdddXAUaqMDnQj5csb+K9Dkc3ccdhdTY29XYtCAhZuZpxyFCcsVcj+Y08WHQwH++f2QHlm2Q+5Pj1p/8X/GIZE8it7WOs99to6gaV6ngzYc9JIGOp4zNGj2OZ5Oiq+4+PWl3nikgmasa/ozCMsGVwNIVVpQngTjs77nPnTQt3xfwW+3BI7uaYRWwkVZbYEs5BAOmIFTQAEE8cTdCpXZY24eze27jt8scARJYxpR4ZiVljIGrI51zHIZ4haqa1LK3a1MMe5vgNz45fS/c27rax11PGrBQqsSDqY5kU/jjmcvj6SjrcTkd2jKUTKSLVIJDKJCssi6YlYZdkAHqJ/txymoZ1EGQWdxL2DGZA00isQ/S6AMekMtcgRQYnWksja0F0eK+1W875JDdLVZTSaGlXkjOejSKUzpkMaqcdmS2eDRW3ftuEna7kZE7OTFXpAMlCzEnVnmCeGeLvkpblX9RYdz+221ige3hgSOIshWIaQ/cbmv+IKRUVPHE1jqiDzWbklvj/7UL7e7qOSHaA7vK0ertlaVqGCoSQQQa19TlhOuND78jNNePftmtfGYon3WNYhACpQgAKjZ0DlRWpHDE63q9kRatGos3fbLLake3VUNq9TG2sFRIoPbjByzNKk8AMbcdZMuTQpne7u6RgtaSyuVozdPVxKLWjGhArjVWqMtm3sQxpr6GQtNPE0MNO8RMyMr6q/pqfqI4kA0pnmcXaMosmiR7Dvt0lwlr9wWRwzVuZAQqj/32505LnWp+rFWSiLseR9SM+4nidnvdhJeRrLHFdK6SRzIXAV6kEHM5n4jI5ZYwZMfdob8WSGfOzzDxi72XcBbzwaLUa3aSMhiI6kFAa50HI544+fD2s62LKrIrqUL3YpkJeNXEJjnOrJTVCFUVNKivx44x2NSYkWYyfbVj1NmtvNIdLgEnuA6TxocsNaDE7yALG8bCSa5ZgDkHdUUMytGuQ4ZHFSLGJmJZo0hDGOYEqrqTRuJ6iK1UZL64QSHHuXEkw0maWVFbRINXQlPqFfr9CMMUgVVpYBKJmSO4ZpLeKbMo1SGHLiBhoJBGS4IifthEWf9AUoQAAOkcdOeeGJnBKo1jva3NY7uQkBI8iBqBHV8+OBggiOpjaQRmN0KrJAasrKBQuoPE8RlhIIDQs812saEwxxqtVc9ITTU61HMcszhuWEwCrM6OpYrNDL0UGqWR15MtQKnkQaAYUNCkG/eiit4/wBQLJGJEXJis2onTqqP54YbjizRKzSrKyI7KkUDRHKUCtaA8CcAogTtRYrqSdY1ZpQl/DTSwkOSha14+uGOTgLMENvG1tI0Yt7e3kzVipJepOXTnzxEchYkmkkUGHt3ELC1aKQmlF9Cc6kHMYYmPMEMkzW6xO0YDCGO3LmN9ajMRClDUUPHFirJU7QXP4N4+4vHubgPE60S3eMHQmvpqpckqCtQxOXpjdxsbkwcjIao2+KMxI1qQqQRiVIiwiXUDlWNK6yT6D8cdmihHKu5LL8d8M3jyq4CmOLb9vajHdNyVoYYix/UYRKNbU41I+WHPoVpSzZftr+3r2fiEEnkd7f+4O6TJ3WsJy1nt6aeK9iJlMgAzBdz8hjncnNkThG/Dx6b2N4+G7Jsu1WEFp4ts+17Ds/bCRrttssAZhQHqQLqOWZOOLmvdvVnVxYcddqpEvmWjMZSWgSpD6grFmpQ6gKccU1btoi+yVdyNXW8bXbBYX36Ozl1MWjluYQzaRUjM5Z0rjQqWZmteskO36y9qvPrf7fy1fHPKI2ZWWG8+1kljpVdSSKe4pzoCDi+nzsf8soptixZH8SEOzez/tNskFzF49t0WztdyGRntrxpGWSgoVMjOQaDliT5nI6kFwOOtgd57W7bNCLaz8luLdCQUhljhnXRTMD6Tmf/ABXE6868/EhW4VHsyK33tl5PbWsi7Xv20zMoZWLxyxyMXWpAYOdJFOWL1za23RRbhWWzK63T2n82kd5IJ9tvlfSYYlvGXP8APrMgqf8A3o5YvrzKLoUPh3I9d+2vuTbyNHD41HcW9rGqxyQTQzhxVdJHUdRFRnyAJxNcnFbWSl8XKv8AqQS/8c8zs5Yo7rxbdbcayWka2llorVYx1EbBRTPIkn4YtV8b6opvjyLdMh81xPayTW8kU1ikkgNbiAhQ4ZQANZU5HgBiSSexS5QgbcDMZYVuW65WPcoHbWgJZmKaQwqDQDKtK8MS+WhO0BL3V9NHq7iRXOpFqFMrKF0qf6YCkknP5E1wnSCPzBOSJWluGhkYXbxxNHEACzZByZKZk/4lXSFwuwtxvuD1tbsm4uCpSPU0Nw0jdvUEqY+3GTqohBAJJBOGy/3D5abXczsrhHuEs1RhctJU6SKhSF515+lcJCTgklpt8EDx/eSmQyDUhjYSTGi1RNbUFHRQKLxqaZ1OJOoW2JXa3NvaQhpLe3W6CH9DS0hk7laMlautFGkafnXD+W7bEHmSGLe/cZreS3srYyT3zRl4IIkSWfNdKNLIOlYkFa5E04554srgS3M1uQ3syJz7Rv8AvaJ/r25LtdnkY7a1Uo7VI1K7kxlxICSByGLJS2RXVNvckNj45t21M0tnCIruGRpW7kncuCQNIAZugaVPEg0rittstVKrfUUvcQWys0FYS4QIj3Ha0UGatUkULEKAvxr8F2krZa1RG9w8hW07n20kskjRtGINOjWDqSssRBVQp4kGnDni6mGTLflVXUrnefL4Q9zKjxBXIgSF1ET981DsoVlIDhiF0txGNWPjPQw5ud0kgV/5PuE8cxtp9Ue3nvnbXnaSJ+4w1GSY5ACoCg1ONdOOupyMvOckOvN5ZmRkuyoaXvLC7E641qz6q8SCuRJrQUpTF3yih8qzEFxfTSPojVHm1tcTQ3BLRO0ucEasuS1BUMSFpyw+0h81jU92iRTw3DLDHoYQtDSR0uG1awrDJgNRDf4cm55PtDve41yzya4prudJY0VND5qwSHS3aCZlpgMxWi0P+I4TUApYagunSVUQiRnjW/u45Ig0Ul0rLaRRvwUSEldIooyqRiuzL8VfYE6GdBK8LyMkiT3G3vp0akAI0kMO4aqahcsvSmKnsdDEoDkWa5uG+3IZ0jrC7QlNTP1SkgAsCpOkVNTSuIGqlRwWybs3Q/zBi1rLbuLYB2JqTKmYoisCCWJIFSBRhiprUvgd2t7+FLiKWKOlsiys0B/Sl4gEq5IFcmAGf+LFdkOnsH622++WQhh2u2qvHNISsjPItShZwR1A1PMfDFaLq9xJLWO4W40rCNVquuah6IjIeLNpDAJSq048+WDtknLQKHbt1mECv0TF0MFxL21WVI+oCq0bt5EMBz/HB2tbkO6WW77Yexu/eZ3yxRbb95ZSMZ5byQyLbKrkjSa01AUqSSK1y4Uxm5HMphrq9TZxuFfK4Ppx7fe22yeA7attZxJLfEEz3JzC1NaRkqCBwA55Y8ty+bbO/Yeq4nCrhXtJvfbra7bE0txKI1XIsxAzoTTqIpkMZqY3dwjRkyqhmD3K937O2jmWGXsxQa2jRwF1dLLSQlegBkqDWjY7fF4HqcLlc+ND5ze5/u1Lvl1PaRI5tykomfuSdp3YApJHqFQig5itPhzx2sWPtWhw8mZ26mc7q7uriWJJZ5obkojV1EoZdbEBmqRQ/lYnSOeLdihORvSJkUvcKqraPpkB1E9w00qlfzDMAAZ8uZxC2poWqE+7N9kZRMqw/poZStApQGrAHPM6q8eoYgh90IrLdLhJmMouo7kRiOCeBnLOYXAdJQpqXPI6cqVFcXdpV8w9txeWWO1hdbpzKsn27sw7WjoqrFalcuok05euJxoVXtqbu/bf7dDft32t1jvJIpT3lhZzFJHRX1MpC0KVbMv+GK+TlWOk6F/Ew2veT7PeO7Yuz7bYWMQ7siRxjvVrrotMzQALjxXIyd93Y9zgx9lYJHFKwRnY1kCkUIotQaUrT0xmLpnQG0ojPcYhUP5myr6ChwJSJ2Qx7tutntVvLc39zDYQQrre5uJVRFjqBXP044vx4bZHojNl5NKLVmN/c7368ClUxbVNd+V3FiZDcQbSqiKNxGq1e9LBAzCobqOXAY9LwfEZXrbRe081zvL0T7a6sz/Y+H+5Puhf3UfjnjNls1jLKKXSQtPICWFD99cL2kKjLoUnIfPHWyXwcVTa37e7c5dP6jkuK1Zd/g37OPFNne03/wA73h933K3QtcDuGkT6gSFmagoukjpUevxxyuR51v4cVTrYPCpKcjLrufcH2s9rNuO0ePQWVsbYMkdtZqqVZWGoyzNQE141OOd/T8jlWm7ZuWXj8ZRVIyP7j/u0nvTd2e2SvatbvWWEME6AzGgKlqmhz1H8MdTj+Lpj3UnP5HkL3/l2MReXe529+QXM9/JM6CONFaGrySSIalf6mSqDzAyr6cOooqoSOY3ZvVlV3V7PJNphnml7gDMD+oxKkMOAzYGoVm5YHb1J0poH2fi17uohndALSUkWcKaijEltXbkVSV4GpPPEbMmqtl9+J+3TTP8AfwwJ27mMUgjYnQBVWah/KOXM1xTbIXUwj/51ve0eL7DO00kEm07NYtu28R2hKOILegiiowoTcSlYzSlAa8sRWpG6hwj5jXF9uXlG97nve5XBk3PfLmW83FE6euQFtI1ZaUUgUHLLljRho2xZrKtYHE3TpHHOl0ICqlSoLsFJUAaFGZWnGvPG16I56XdYhkMAvJgx1yiUuKkaWNTQrrc06fTFOKvczblv2VNEezPj1nunl2wRbuCNlsWkvt2ngHdUW1kncKSpkQraACSDxp8MdC01p8O7OByc0Wll6eY+Ybp5tvNzeyW7JbX8apb2qkyqkca/pL3CKCq1ZmHBjThjocfiLDT2nDz8l5bTZ7F1ewn7d/IvdbcRKlvLs/i9s8Lbxv8APK7ISp0mO0BQCR6ChOQHGnryvKeYpw6QmnY63jPEZebkT2qfYDwvw/xz258dt/FvC9sS3s7ZWEtx9U00oA1SzOAC7k8fjyx875XJycq7vkZ9M4fFx8SirREsg2GWef7u+lydaMoFHzoePLhih5lRQkbFitdzYksUMUCaI0EcfIVPOh44zuzerNNUlsJby8t7WIvNIEVKk8CchU/ww60dmRtdVRhv3f32bdd3e9We4NjRLdLXsMxVKmjZZANUVJPHHquDiVKKdzy/Ov33H/xfYLy38YlurMdrcbK4TcdrcGjCSNQQGNXJGYFACM88VcjKrXhlOPFZV7l0NXeJb5beSbFtm9WppFfQqzxmv6coykQn1DA44HIxvHd1PS8LMsuNWJMTkRw9SMZzXBAPN462cdwqRySRBmUyNpyAGVDx9cueOhwdW0cfyKhJifw7cpLra1eZWSiARqxBLLTJwQefxw+ZjiwcDJ8BF/cLcdYFpGVkdlD9qUdLqw0EFudKjGnhY9JMfkcivaGfPPfP297Bt3mG+bxtsXZs9ymN5Y2SlUtYHlQNpRWoB1Hpyx2qZ01BzcXHdVrsRfyR7HxO1ls1DpMysisqoXDGgIon0MwNKjGzBj7irkZUnCL19gPAL7yq23TfdzhM21axFtkkgcFQqDXoAoCNQOYxg8hyFjaS3NPAw2yavYyB+8v2+tdtF1NQL2UEkzuxDEdw011oAGqCTTlnitP5mKTU/wDLywfKy5hLXGl07kivH2oGIcKCBQRSjpJPHT+GOO8cuDtLJ8Job2x9sJbyd7i7t3jeiuySNpUtk/QcwxU0JAFBjbhwwYsvIdjd/injVnYW9rALVXmS3o7RkCTUy0CiRqkqKmoGeNL+FGbvk0X4b7TeVeZNA1ttzbfDGSHvLmrIw/MxD0BrpOWMuXkKpZTG7vQ1Z4h+3nxfYVtbjch/qV4BqmWgWLVlyplwxz8vOb0R0MfEh6lwf9u7Rt8Ei2llFbxIDpiRagUIpwzxnWa1maHjVVsUH7jXqxQ3FvbyLazIraU4a9NDU1qKDHX4lJ1ZzeRZVMc7raPuUtx0dsR2/U1Q0ZDdSvmMzWvEY7C0Ry7OSEX/AI3dFhMiR93sRkoy1AzNJAaDn6emJqxS6kC3HZDbalESmOFqh2WoeNqipUZgrXgMsWq0lbRBrhbvb5Y1SWEhI9SRdtpnkTUaj0AyoacOWLUkxVtA87f5NK8cllcSNqjH24uSWbTrHTIwfJQvDL+eKb4/YXVywUZ7neGxbnbzs8lsZCwYyMGRnIBBcNkDq4Eev8sHIwyb8GYxVvFqbe8ngWJZkRWhAlQdxKVB7RQ6Dma1444mXH2nXxZJRH2mjkjhkkt1DpCYh2+oaBlrckagw5H144oguka1MbiVLiEQtMUUN9RjQg6VJoCQTwpihPUvZ2XvHuRTau1ayGK5kQApUgU6lpQKOY488OCMgFlikWjiRLiOYMs6ggs4bNSK1AYCvoMNaDgLJWgL66zNVoZKkaVOZUioqScOAswXfrJDOAyIZDHb1FdPxZuBBzOWGQkGyuAYko8LI4d2UBOFdQpXUcq/DAPY8D3pLdYpmeZFIgmz6qt/Sb04VwmNs8nbZmRGP3JJjkZepkFc9fJueeHBE8jWyhKQ9dv+mEfURlwdnAJDHlhAKUV5mig7Yke5JaVJP00VjwGWa8s64cTsR7oFdrZXdwwkSEvOsZVGSqsHTiwzyKjiMSVQeRC632O7LOsK/wCcjozRHt0KkEsaNUliOR44fyyDyIVnYmmkt0aNWdYyZrYkqqha0IY5ValcvliXy2yPzRRB44IzBOheWQEv2nSsiuANAz/LQj44nXERtlJZt2zkyx20cQmjKtJaMIQ9ZH/KoB1UqKZemNGPC2Z75kjUHt57Ubxb2KXe73MOxoVQRQuTNcS906iIY81BOWRrjo4sDW5z82bu2NkeMeA7PtC2e6vB/p1ukyGa4nRptxeVwQoXp0xxqRVqjL0xqehmWu48Xu+2X+pwz2qxT/br9tFcyuXhYsKPIpoAhq3PMj+GGkRaSZf3tmJUubWzfcWju1PamZCXaRWFe0HbM6c81/HGTPsa8NnpJ9A7EpZbXEZEaU2sKsIUALFiOY5sceZyfHc7tF21IzcbB/rUr3Hll/NcwoA0Ow2TtBaRaTX9V1IeZiMmqQvouLq3ddKIptRWc3Yadx8K29mtki2q1YE1thFC8jAgA9KgklqZ19M8T+Vmt6iWXFXYIS/9vL7uTTWu0FHIjYTW0aM9KAUBAyHDDdc9dJY08L1FsPjXhF4BImx7aXJMiFAobPLUdJxW8mVbssrTG9hYnhniqDVHs0UbKQSyu4ppyFM+QxB8jJ1/Il8mjC/+y/GwX0WckWpNFYppARXn9XHLjia5V16fcJ8ar6hc3gmzEIkc19biMAL2p6mmrUwJcE1PDEv663sI/wBIvaJpvCHbT2PIr22WNQiwhImWoK5kALXIUz+eGubO9UQ/pWtmAfxPfog5tvJImdm1R/c2zgKAMlqkoyrSvww1y69UJ8a3qJ5/HfKHRVe42vcSSxaSUFPpHSNDRvSp4AH4muJV5OP2kHxbewi197dW96ituXt/su5NQd4RpAGbV9aBwsZ+fL8MWrmLpZoptw53qQe79jvDZGZ5Pb+725nX6rC6lFZGJLErrdeHAU9cWrmt/wBopt4+kfykKufY7wmMR9i/8g2iWrRxd5UuCZKjM6o0Y0A/xcMXLl2foVf0VV1aEMnstavIPtPPEdYRRbe824EqKaFPRKMwCWHzxauW+qIviNbMTT+0fksaIbLyDx28kjzcqk9tJpWpADLrpXKp4chia5dfaQfFt7BtuPar3AtYkjsts2q9n1llvbTcljCVVdbBJFHE1P8A5Ytrysb3kz342Rv+JEN09vfdCS7ntb7x7cdr2aaTuX17aNDNLMIwXDqYHB1BjQk/PljRTk4o0ZkycXLOwy29nt/jNt2RZPtCxUNzJd20nedJWpVndUdWehy1FQcsWqytt+ZW6Ou5w+TbYrNYW9xbztclxL2biGViysxJo6s66RkQWy9cTWCzRVflUruR7dvLreMiC3jkVkl7U0xniL/qIF0VNSfma0BrTF+PiWe5iy+Rqitt18uurmfULuGOWNZLeWd1JDpyjAKqCAKgNXiScjjZThxujj5vIudCBblv8kwkvInMKllWRzcmqlSXjJ06jQFTRQeNM8a6YF6GK3Mb6jBNf3LmSYpcTJEzA25iWoVqaoo6M1Gqa1p+NcXLFBV/UO3oM7Ncq8hLuJYQkgv4gDpSZ6Ss9FZTIV0qF/Lh9klTyJiaS4txIxd1uCrKht5I1VL2NmZYxrjMfbVFoWLhdZFBwxH5bJoQyzuw0rLSHRrvLftgDIgFmCadCyMP03qSUAoMRaSLKy+gFLe9bTPCBaSxMshjkkZVkU1X7dGIDFnVuH1Hniqzg1Y8bsPtv47LWFEg7N5azwtbHshY9BOn7YDUoVi1DVswBnQZ4otkNmPi9xINt8UmkkbTYQyrtpeCWCBaySrIRQioB6weIJ504VxntlTN+Li29CWWft8EiUS2oF1buZtMyN9TAKAgDmoGRLE8MVPK+hvrxkiSx+KWoaK2ljNh905a4klKkzEvVTIqk5gADPlliptlqxJbD3Ze3m77lNIu0+OXO69+cCH7O3YMCQf01K1GlQPTOuK7ZqVWrLlx7W0SJ9sv7b/c6/MMY8MmijSrSS3pihjDhsgAzggDjl/xxmyeSwV6oup47NZ/yssXaP2g+cSwW4v59r2zt6iZZpzLMBrXLo1ChUHj8MZb+Zwp6T9xqr4fK/Z9pZG1ftBZDG++eao1dQlSxtdI0kEaVLn1J44zX84v7NWX08I1u0W74/8At49svG2jlmsJN4nh/pz3pHSS1SRpApU4xZfK5sm2htp4vFTdyWnJuXj3jlqtqJLTbbWFaR2kWmOgFa9PHkTnjEqZMrnVm3ux41pBVnlHvPs206obebq0s+pmAWg0rWpz6q5H+zG/B421tzFn8gqrRmNPcz9yMckV1HY37TTBRH2mi1MjOSSqFSQ5A+onnjs4OBWm5ws3kbX0MaeY+4u9+RNcXspZrKd6XkAVkkLKpAdwCcs6mo+GNyokYLZO73lezwzTzMsl0axugEnd0l3dOkUc5atQCg+h+WJaEKsEdskKR90SVtgxjSQsT2Sq9ICklqOQNXOvCmeINk6pyKXSCNFuNSmKwR0mCdtSlW1rUNWrZ6cs6HLEHuXy0V7vt6LNZSkiwSzPJFco7FlDEameVeo9VSVqQaUFMW0pJmvfoV5PcRCSe4tm7dZM7c0QSKwNSjZUVUFenh8CcaK0lGd31Jf4TsE2775t212MTXiTyKSWV2BWip3UNQ4VWrpSmdPngjsTbHrZo+9n7d/a2Pwnxbb23UE7g8EIWCeNGZVCaaALqYfE1pjyflOZ8y0VPYeN43ZWWoNGXF5aWVo819Pb7fZRRa2muJUiCIoqWZm4AUxya0tbRKTqWyVpq2VD5D+4b2p8cLWi+SHyDcUpp2jYK7hJqTNuuLprQgmr+mOjg8PyM39mF7dDm5/M4MS/mn3FJ73+4v3C8id9r8A8EOzSS9BvNzH3t8BJIEV0s7auQp+d6Z58MdjB4LFi+LNdfYcjN5zLl0xV+0Y7f2E90/cjcU3L3J8ikmtF09uLdWDsoIo4isICsSVDfnLZj8caLeT4nErGGsv9upjXjeVynOSzSLf2X2m9m/bG1hut7NtfXtmqyC83JwRUKItS26kKAV6aFcc7L5Lk8lxRQvYdPF43Bx1N9WQ7zf8AdZ4n4/BcWWwWgup4yy28xXtwPWh6NACM1M1DeuFi8Ta7nIyzJ5OmNRRGLPcL9z3lHkwmC7hM+3PFL+ijGNoQzFVLRpQVGQooOWfz6uHiYsWy1OXm5uTI94M3797gbtu2qW83GSaZ7kjss+mON1NVXUuR1KD8OXLGqUtkUOje5EJf9Rv5DAirES6C11fpxyB2BA1DVUMvqcLu0J10HXafD9w3GSWOVVeSORleLWNUgoA/acUOkemYxB3H8tlkeP8AtmLi4kV0d3a3oZe0KrpWMqCSy1YEkHlT44i7ltcRemz+IR3SSd5WerxySKhosqRAgiIIVyXTxGZxRa3qaK1S6Eg3S9i26ykuY4ooyw1GqkS9o5BWoKEgcOFTiNayLJZJSfO/9wvmk25wbbscF3Vt/nbd9wRlKD7G2rHYxMT/AI31uw4fSeWNKrCgz43LdmZz25UEMjmMFmKmWVtSLqFKNqHHNq/hjZhRm5Fp0PbtOJYv1KTRydAm4uhYEsJQtGBrmBwxPI5I8euo32FuHnZwTcIzB5JViNXRqfSlaF1oeGHgSTJ8l6QX94DbRw2N7cq8tsbx1sQqCsZtqh3DuwDCuQIr6jHc41Favc1oeQ8ja3eqo+iX7df2wX3uEtt5b5rZ3Gw+DDTNZbcdS3W6lV6tAoCkFcuFccPzXna4Zpjcv8jqeF8DfPZXv/KfWrx7xyy2zaLHa9ssY9k2e0iWKz22FAnbjAFKgAEE+ta4+e589slnazln03jcRYq9qUIlcNvb22SIFrQmufD/AMZ+uMzu2bK40gN1uNraR9yeZIlBpVjTqPAD4n0wKjY3dIiW8eXRWKSmOImWIDS7sFFX4ceIxoxcadyi2ddCjPNfcOGZLm0S4N2qDTBKFYJI1QQoCMMhnmeOOpxeN7Dm8nkx1M+XVzc3l6buZTEZ9LFo2MsQCkUWSrFqDhT+OOvSqSg4l79zNbe3drbzeKMwhK205q2g1MoKqHJ1dS0pSlccPl2aynY4lFbGJPaLcjtXkHmvg80ortk67ptsLV1LBcdMiipPBwD+OIeQorVpkXuY/F3+XkvjfvRoAdQUtwYVqP5Y5PsO57SrvP7+NrQWNUYzlqxMczqXpGk51PKmOp4+nU4fk7zoiK+Obj/pm2oUL01ldDUMmnIsDUA5V/lljTnx91jLxr9lSA7jv0u6+WWFl3Iu1cM2k66EUoCa09AAMaqY1SjMdsqvlgVe6Edt474NfbpGq3BsrZmihZQ36qqwFGOdMgK4o4tnkywbuYlixSYl9tPbTdfebzmW3lVoNh25lu993hxl2iwJt0ofrYigzx3+byqcXH7TzvC4t+Xk30PqztHj+0+L7FDtO1Wi2m37fB2re3jGkheBJpzYjjjxWXPbNk7me4x4K4McI+QP73fItuvHk2tjBLCmg3L0JljjZmOa/myzNDyx6TBV1xHBs/mZpR8wPGdlG6b8kIjWSB5BE90uTaY2OqgChdRoKA/34x1rNpg6WS/bU+ifs97b7run+n7V45t77juLKEligXS8CBlP6gOpQKca405L1otTHTuvaIPqF7bft42jx23tL/yvRvO7JGpjtiNMUFAenLLKtPwxxs/Nl6HUwcLrY0fBaW1vGsUMSQoo6UUaQB8sYLXdmb1StdhRSoHGnCmIkoI/5BeR2VnM7sqHMEsacuNDxxdgp3WM/IvCMi+Vzz7vdPAitOWYhJJBpTq4lTmQT8ceiwV7UcPNbuYw7V4Q1+WZYWWVCLcSlQ36aEEcPq9Biy+VV3I48TY/7x7XTpaPJ2WkVAjxR6dRUAUII5ZVyOKa8pNl1uNaNCnd+9tpSJpLey70dqzSk0LGpGYJJzPoPU414+QluYr4GUn5B7dTIrE2shzFwwVah20kEBVJNa+tcaaZ0ZLYmiod48N3C2VpRZzGRXWePS2kPEcippxI40xesiZXWrbIlebfdiO9s5o5e1HERCzgPpUcjXPgKBeOIXSZdSzqZV9z/FlhuH3BbUtDO4du2jq8ZC0KhKUoCM/XHG5WHc7PEzdDP8ts8NYVieSSVSk0gYKdJ+kZZZ8sscu1YOrVyiNPHJ3HIk7wjQi0lqEUhsymg8ifT8MZUaQCy6vtYihWJG0C1HT0yZkvTI15Vzwxg49EkbmKOK4m7ulLp2IAUkgrQ0J9MMUHZpO52xMhhCSrEyimiDQKjTTp4GlMMi2ellZWFSQokCwRydKMFFS3DI/2YT1ITAIB7UyRQXJKHRI8hUB4DJ1VAI9MsuOHAJyGiKGSTQ8BdVjXSI845GP0hxxFW9MTSki7QO1nsk1xcSF9UWktI8ZpGrMtRpyApXgcSVGV2zQSG08YMapDdK8cMgVwGPGmVGABpQGo9cWLCVPO2SGDxiFDHE8yzT6DrmqpVgvSug0FSo41xNYiq2RjtBYW9EJjpK0XYaO46XVVOlTwB4kgk4srjXoVPKCWJR24DConhyjZtOpSBTWGHFqGmdScPsH3sLFvI6RLGyxy2kRrbzBQrlqlRmDmQeHLDVA7iT+PeKbpvt3t9jZRvJdzrWNi9UiJqSGb8uXM4upidnCKr5e0194t7fbN4tLa7VtlvFuXk26RxMXm+gOCasj5hVWvrnjqY8Cxo5187sy47SS32eGwunDX+5W2r7m8MJYROuQNstaVFPq9PTEmvRka2kLu97vLlPs47oiWQtKJ0kXUWk6lFQekmvKpwQS7iNW08jNHE6GUSyIBbuiyUkQfqaWHEnjwpXEkQNVe0u86t1tTMYyVZzFckhWWdUoI8zUEA6TlQ8sY+TSUacNkfRvbbprywtJo6K0oTXIM6OFqBQ0rjzN6drg79bzWUZI839xr7cNyuYt2v5to2nb55rePbLOVhWe1k6u8/E60HA/349h47xdK41eJbPCeS8xkeZ0mIA2m3QXEsiWl9dWksq9WmQlnQkEFFINVAHLkcPIu3dEsHId1pYa5oPJNtgvHj3SDdbeZAsVrKWWZZUIyFM+JNFp8Tir5dLM2rPeiInuPuCNlkH+s7NuG0TKiCS9jkJZlBIJQR16V56s/hiX9D3KUR/5TtcWJhs/utbRy2i2Hll4kUsTSQwyS95q5sF7Z0kFq1FfTM0xnv4/1qasfk6PqTjb/AHX8it4yF3pL3tpqgrEkhevAdxSQSCDqp/PGS/jl/dZsp5BP+0SiD3j3CJLdr2OKWGZAscqxOuuQAtpGnU2dCMxjNbx1emhrpzvtJTZe8uzzNbC7tns456fqBgQCQKatYXSCTz+eM1vH2WzL1zESWw9yPHLyKKRJ5LbuGkOpNZYU1dJjLAj4k+uKLcO66FteVR9SRWvke0XLmOC+iYodTxjUCoyzoR6niaZ4qeGy6Ftc9OjHJby3m+mWN6khQDq4CtDzGIOjRYrpipZY+THVSoIBXL+GFqhymGHtyABh3BxAZQ2Z5gGtMHcxOqYhl2ja56mbbrWQ8yYU5UIFQK5UxJZrLZsg8VX0GWfw3x2ZGRdu+2V1oTbSvEc+YoRTji9cvIupVbi0YyTe3G1MuiG9vbdA+oQ93UtFHSMxWn44sXNt1KrcJdGIX8G3qES/Y+QuxKvpjlUpqBppUutSBlnli1cynWpW+JdbMQXGw+dIZIT/AKfu1s2YWaXuVGVBSQDIfLE68nE/VFV+Nk6qSD7z4Tt+6RdvyX2l2neVcETzjbbdqqwbUuqNdeYrXP8Ani+meP5cn4lF+JV/zUX3Fabn7Iexl0033Pge5+PTEq8rbZNfW65GoURsxTSeYpjdj8lyca+G6a+w52bxHHyb1ggl/wDta9qr0Sx7P7h+R7CbohmtbiK2uIkC/SlHgSgBzI1Y2U8/yFvRP9vtOZl+mcF9Vdog+4ftBv7gSf8Ab/uvsG4AnWI9w217R2p0gO8DOoyXiFxrp9QR/Njf3nNy/Sz/ALN0/vIRun7QvdvuarWPxjyS2iTRazW+6pA9K1/9tGD9A5n+ONVfqDjPdWX2SY7fTXJqvhj7yFX/AO2P3ytJPuT7aXUssba4xt93tl1HmerOORXJAFASK1pjQvNcS39tL3pozPwHLr/ZlexkQuvY73T2/vQ3Xtf5Vb2946xyiKyklqQafqTRFywPGhH8Odi8lxrbZK/eVvxPKrq6W+4brfwTdbW6il3HZ722aEKZl3Lbp9bO7GIhDJGp6QNOpuBB0jKuI5ORSy0si7Dwr7WTJVa+KW4WIT3KRi2/UWGS6d9K9xWiAowdzWtaivSudDjFbK29zr4eN6VJptHi6oO3cWEEgj1BWhuVd2Z9IJ6ytXfXTUwNPTPKm9mzoY8Cr6lpbJ4Tf7vd/ayW+zbfFLJ+pc3sul0FKB0JbIaSdNDQ5jLGXLkdVKRux4KvqX7sXsR4ZdW9uPJfcODckVqy7ft0lpbRMSwJUSMzOa0FTQEGvrjlZfIZ1pWrOni4WLe1i7tj8B9m/Hljkt7HZruWB2f7y+u47qTW1a11tp4D0xzcuflZH1+42Uwcai6feTpvL/C9mgVf9f2bbLdKFY47iKJc8hktBij+lz3etW39peuVgotGvwI/f+8/tdt5X7zzrZ0LUzE+s0IYg9Ip+U4nXxvIf9hkH5LCupA7790XtJauRb7+l8gbQXjdFXVp1AEsefwxpp4fM99DPfy+Ku2pXG8fvK8Qhkli2+1hAjYxi6mlkkXXnUERxAemdSK5Y1U8E97WMeTzUr4UVjvP7vJtwt76SNdwtI7dxahNvgaOWO4CNIZKulWSig5gcQMbcfh616SZL+Vs2UD5F+4PybdY5IV2/cTc3KfaD7wulys4qC8cQFWI1dRBIA54214lafypGHLzLW2ZS+/eX+R7tJKs93JN2WespWRxEoqQrl6EgZEDmeGeLq1gz/NdiGGxu5I+zNZ3ENuF0pJGKSxO5JBWVyoZmdhx/wDeeGHKIvcc7fxzcJJZQ8AS5MQkuI4mDyBQDqQqTk2qlQx4jPKuIWsgWpI7fxeJ4WK9uZ1Ma3EDDWtv3OhZaincNBUEaQDz5Cl2ZdVB9xttlYf5+IRs0QEmt3o0T1KyAVY1ZywKrQLX4UxHtZZVtFdb/dPGluk1q+iOt08KqvCvT3CMtdQzGp5A8sX0pJXkyJFJbsP11hl+4kgQB73QAgatGPXQ00FhpY8OZxqrVQY7NvoNNrt15uSJHbiW+mRmfXbobh9R6ToVEk01AIzFOenFiSINOuuxq/2J8P37xnyW28l3TwPc96iTRJtW0u8dhE8tQwed5W16X/JVD1VAGIcnFbLXRwT4+TstO/uPoI3uV75eTm3sLG5sfELMKENn47bfd3Gg0YFbi4Vk4EfSopjlV8XxqNu7k61ufyb1SooBQ+wnnPmN09z5nu+77mrlit3v920wbUtAVtVfQACoNKAGmJLyPE4/+nVSL/j+Tmfx2bLbsfZv258Thin8g3KA9sHVaQMlhbMKU0dqJtRHoa14V4YxX8xnySqI2Y/EYsetmId497/bb2/s3tvD9jtHkiDlLWzRIgGZqaiuTmpOZPxxTXiZ87/zLODRbkcfD/KtTMPnH7tN+3V7mHZr47dbxxss1vCix6jmDplqSaEZZevpjoYfGYse+rMWbyN7aIyX5P7q+Sb7PDcTXjtMe5BBfSNItCS1NSuaM2fAj40GNqx1rsjKna+7K7uZdxv01zytdworfcL3SDMrKdRiIyANeB/iMNsSrDF9n4rulzNbO1ZokRDL2iqyhWUIAO1U5rlQ5eorip2C1Z6E92v23ETKJbWG8RoxoLtm7ipjNSWAKkCvAZ0wnclXHJYW1e31rHCYJlR4rVlaaIoBKWXgq6tIpTLLL0piDuW/LLFsvFrO00QpHE6CSRrSSgDotdYQSKVIoTnlzzxU7SXVpBI4rW3VPu7hgQY9ESg0DOONB6gZBvxxGSSUCWfcUhgtQhieWEM1vKraGjTiW5VGdK8eODtkLXSRn7zzfLncrmz26N+0+7OLaWSBF7ix6h1hjxAGZ5/zxtx1SUHPvklnzp9wfIB5Z5lvm5xrLJY3l4LfaoJAI+3aW36UGgDjRRXTlU4EtYNFVFJCYFVYbYkdt7XXUOGFAM/1UOQQ50P8MdCldDmZHLGe+bvsmuIHSpYTmIanZalSStOFRQN8/hiFzVx66Eo8S8Xvt83Kz26xt3ud0vJVjtbFY2eSZ3ZQqQJHqLEsOQxbhqkptojPzM3bpXU+1f7cf2T3UEW3eS+7tqLWGMJJa+ChhIXZTrilu2HStCT0DP8AxY4/lPqVVXy8D+39xZ4r6ayWv8zPt0XU+nFjttrYxokaRqI1VYIwBohVRpCxDSKADLLHi8mW13LPdYePXHWEKZ7+3tgGnlEdBUE5n0yUCtcQrR22L3dJEJ3bzjb7T7lRPGqxoW7iyguQpOugGXSOPpzxsx8OzM2TkpFNbl7ltINMKGZu8DPMH1Cr0Kkk1AB9MbqcODBflyVduHke5bnD27xXZLlJXljC6Worih18DXG2uFVMt8rZFppJo5I5u3KIWUvqjUgszhtVVY5sa5cAOVM8aVEGS6dtxDZWZS8tu2rRxIA8aSoulyQWFBqHPlwrnni1vQzQzRHtr5HLY25spYhElwXRIuoVcnUpBIOQz4+uOXzeP3vuR0uHl7KtMZ923weM+8niXktI7Sw3aR9m8gDSKQyXXRHKzD/C4XCeHv4zr1RWs3ZyFb10NcPIRE5UhTECKkigOVePIY89uz03d8JSm+st1f8A60ZZo3DJdlfyU6Uz+Rzx2+Ou2pwOR8dtSD75uMFpAWS5WCGzQCNNNesZmNQ1CacKk+uNGJOzMuX4FozNm4+VS7b5xtt6LQX8N2jIApKm318V08KgkVGOp8nupBxFn7cv2lpe7u9tuvtjuUKuYr2NI5Jo42LyVBNCwr1BxlTljDw8DpmOpzuR8zDBYP7XdusNt8BgaOMRX25zy3F62jSTSlB+FcZfN2byew2eBoq42y0fcrzG28Y2C+ujLpaBBUAEaFBFST6AGuMHC4zyXR0vIclY6NHwD91/IN/91/MpNq8T2m98q3aWcR2uxbRA13cMFNTMqx1+knV1ileePS5mqUg4XC/mn1Nb/t0/2/fOHkXyT3ZuB4DbSS92HxeykjudwmV+P3MgLRR61oSM2BrjhZeZWuldTtriWvrbRH1f8G8N8Q8GsItj8P2eHarOBAjvH1yMBl1yPV24c8sc/Llvfdm3FipTZFhEihrxxlgvAk1rUcc6A4CSQIlQK1AIzqTwxIG4KV9wN5E2uzt6NIigsJQCoNcwdVCK+oBx1OJihyzk8rJOhXOxePzbxcRQyRlnlakUrMANDEnLLPTTnjo5MqopMlMbsaH2Txi02eECPT3v/avpABplw5Y4mflO79h1sXHSQ0eV3m27XYyvIyRkodMSgZkVGeXx54t4tbXsVcq6ooI54pt9nv8Atj3UkKtNKxc6gMqcK0Hri3PkeNwU8fGroZ9+9rNvkLXCW0UYUMHKqQdOmlKCtRniWLmvYll4SZT27e0FioWFLUATyO7oCVqzipJY1y9RXKuWN1OU31MN+KqmcvKvbS2tbeWMRLE0UwmDKuSyx5KFY8QedTjbTLJlvihmUPcXwBru1u7eCKWc3RZdaZxgkAuYtOoh6ChrxzxZZKyIVfaz53+b+Prst7LasjwXEmnW7HtulPpDplStDTHF5ePtZ2+Jl7kVQ0Gm1Z3QOJOlJNRqhUflrnnwxyzrwEh6TRmB4xJPGIJmahKaWB1AHKopn+OGiITKYQ0kwXso4Omi9yNoydSNWv5s/wAcMi2HiEwqI5AkvWI56qQtWoyvVRmSP5Ymqsi2hZDZ3ZZ4DbsrLWJowupGyJrQ1Unj/fidaFdsiH+18YuWghurhv03UC5mZT0lGGkmuZrX5fHF1cJmtlgmtt4xAqIViEN2jJ2pw3cGg+oUUHrnzxcsJntnkkce0ww/pSxRlXDE27nXEXbiGIBNDSpp64urQqd2xYJgInKyGbtRf1CQX16qKORJHD5DEu2CKuwoxTyakUSTIOnv0A7brnQ0IIX0HDDdCSsKYtt3Oe4mU2TS3MisyFmIXQATqoxIzHP/AI4fY2QbQ62fiV9cCVZ4ZWhoJaugGkvyGVa0PEZYPleoO5NNu8GZtMlqkzJMFdWdqlXNANTZ1rX4UyAxdXGVPI0aA2XbLbw7bPtrYKd33Er9xJRWUk1OkMpOQpnUfPG7Fj7UZMuVssTxXb5to2yDyi9tFvI/Ip5dijuM0SBnRpkYalBTVpoCK0xK1tY6lda9Rje8nil7N3DMlpDG0aytG4ljAYIVJLHUGbIsaVw1UknOw1oyv2beiG5lrJDKHVUkZT/UcrQI3pT6sJsA6C8lgDDstHcummaTtntVJPQgWoBzrQkEczhCkubwHfftpoIpWNzFBcCRLIOpdJRQINTjIVFTT0+WKsi0LaOD6Q+23mNpfxLYG6jkOuHSfqIZkzAqKjPnjg8rBrKOvxs3RlV+/wD7f3lpJceZbNZG+2yeNh5BZIzK8ckgAFzGFFSFUHWPkceg8B5KqjFd69DyX1N4iznNjRRPjHlk8a/6Z96G7bMNuvQGLMCQojByzCjMA/HHo+Vwqv40jx3D52Slu17+hL7ved6mgngtqfpMzSxqtGdSDRlYliSBwpTnljAuPTeDtf11vUYN03ryS1gEkdnb7qLKJpZAUJqKEnUckPTwGL8fGpZ7wZs3NvVaqUVlNv8Atf3EEG7+GC3uooe6+52gMKaWVSNBRqGgFOPzpjWuE2tGc+3ktdUI7Tc/Hop0+z3Pc/HrmJgscgeutcyKaTSi6iKAcTXCfBydVJbXy1UtyX7Zf74VI2rysTxAO23JOzanAejmhLAhKmteHzxmycSi/mqasXlMj2tI7L5F5GnVd2W17n3ZXRl1SQmNT0lg3WpAFKZfE4yvh429PyOhTy2VLVfiLj5PG8rPf7He7cbgRxX17aTh40diclVdJYKpDsypxIqC2M+TgKIRpp5yundoOtn5bt50rbeTXUEzQCO7huo5Y5ax5sJ9ahQFyORNR1EYzPx761NtPK47aqxIbTzHyqGC1n23erfdWiURCfuVBbKqA0amkNnx/jim3Ao9GjZTyNntZkktvdfzOzaFrm0luFeP9NQWAbuhdFFOYAZaVPEZ0qcZ7ePp0RoXkrrqSCy9+722MQ3GJ4FulAqVeMx0pXudLV48suPpjPfxi6F9PJWJpt3vtt057bMiSRzMkpuFKBgqknTICFFTkCR/HGe3jH0NVPJLqTax93thu1/SLShJu1IYQWCZClfUmuM1/HXXQ018hR9SWWfnvjl1KIU3GKORlDiOTpamf5cyeBxntxLpbGivKq+pIYN6225BMF7DJzBVhmAacDn+OKXisuhasqYtWWJ6spBBFFbiPmCtcRhkk0zuqM9AI1Lm4qQa1yGFsSlHnWOUMsiibVxDAMDX4cMOtmiNqpjdNsOyXYJm222k1g6n7aqc8zmM8WrkXXVlVuPjfRDJc+A+L3KlRYNBkFrFM4pTmFzHw+WLVzci6lT4dGNNx7Y7LJU295eW7aAgHSy5fAgGnH44sXOst0mVvgLo2N0vtveISbTySVVFAqyo9AoNTmr8eWLFzq9aog+DbpYRyeFebW7SyWW+2c7ZCIS94UAIr9RIrli2vNxPesFFuDk6ahEuz+5UKvHJHbbkoTNRMOo0oT1U5HIeuJLkYXs4+wj/AE2Rf2Rlvtr3qVJDu/gcN6JAUfRaLMW6F5gnKgy/HF9M1OmQi8NutCMzbR42RF994BLYSMR3mitpIlTPioJKk9Izpli1ZbdLyVOtf7sDTJs3gDyRAmWycljHBPbahXVxZjHUDl9XwxP5uQj2VGpPA/CppJ3h3Cz3AurxJDJF21Banco2pSCNPGuWJLPZdAeJPqIJPZPxm9rHNt21SW9ojSm3t55JHYuCGqc9JoAoJrzw/wCsS3X5g+LPXX3DFd/t0s7iaY2/i0kltMO7bxpJNSN14JqOiuQBrwONFPJY0tYkz5ODkf8AKyGX37ft2YdtvAt7kMC0hmS9Yhsm6qiUevpjQvJYHtZIyZOBmWvan9xC9w9qb6xSh8A3FJ7FFLoyXMsT6ozUsxMlaVPHnjQuVS39tGe3Gsv7P4fuIvL40IIreH/tt7K8hBnW1/0x9VsgB1ESMMnoPpI/85O9V/aIPFbWUN7bJcyM08G33I3DUVmuxt8wnOmuoCRINZLDLj8OeH3V9Sv5bT1qEPsFwWSb/RN6pEiRHVZXQYiooGrFpCrXNOfA1xHuXqP5T9PwC18bvx3BD4nuBeI92wRbN1SJ1YLVQ0YC1JqMuFTxriEp9SxUSFieK74857fid+0EzOzSraZfcKdRjboY5cD/AO7hOPUfa30DR4j5ZOkkNx49fGRQLxLmYpCAF4DiBUnhlmK4glV9RfLgTN4vvpED3M9pZ3cjD7wXF3D3RpDLpZVJJWnACmJunoiSUDdP4nHLLcQXO/Q6pEosVnA0rECmlQQmkKtaAA4iqkmgzZf2/tvulYvBfIN1YsGvbqeRrSyaFFVpAumIty1KONKjnhvNipvZEflZL/yp/YXDsP7RL64SSe68S2yxS5dlE10okkFsrKVRxM8jgA5KDxAriu/lsFNN2W18Xmu51RfOxfto2/a4RDuW+FImbVc2lhAlvGx0lAyiEJpoD+NTXPGHJ5r+6jZh8Iv7ZY1h7be2/iaJIbRJ5oqukk0gDL1BlGgZ5Fi3HGO/keRlemxvrwcGNasa9294vb7xWA2lg9kjwNSG0jKQhiACxNVIXppU/wB+EuHmyubMbz4sWyM7+ZfuxvQs1vtaJbQSxDtXMLdf6mRB7gzOZzFKDljXi8XRb7mTJ5C9l8JlLyP3n8o36eVri/nurdHYQtcR60YEULAqaHPhljoUw1rsjDky3tqyqpL3ddxBZ2aaQZdp1aN4iUJVC9dZ+dM/7bk4ItJqQqHxu6vJUleA/aOCk6SM6rHK5IYlSANZJ1fHEe8r7Wye7P7e3BjtpL1mlWYmG4gCntq51OhYsrALpoSRzypip5fQurjZYO3eBQWva1RPEwj7c11HocSorgkhmNVLZ0ANfjlip5GXrGupL7Txq1s+1K8Pajb9Hc7eBwaTKxCuvc4AKc6fzzIi7j7YJLFbbbbzzQxJX7oOx7X1dyNNRzNOQ4DLEZZJNIJur5DavJqZCkStJPoBWFVy6Waorzzw0htiW83Qxgs0qxxhzUrXRRqaCxHNjWuBVF3aDXdbsAhEat3CQygABFkyU0jPrmtK/HniXaRdivPIt+ha2hQtoeKSrIRpKSE6u3qTMjmCcv77cdPQy5bwZq8j382ln5v5I/cVtj2m6S3lj61+83A/aRBgQukr3iRSvCuNDUIppLtHqYthtz9zBbSUmd/6EkTjUSOpSSaE04ZjEsddTVls1Vk7WyuCvcjha4KxmUSEAuFIodUdSAFbljdEI5NbSy7fY79sHuN7+b0sfiexaNkjkVN78rvO5DtkOsKHarA91wBUJGDnTgM8Y+TysXFXdd6+nU6OCmTK+3H/AND71ft+/al7bewO3LNtVp/r/mU8atufl24KJJ1fSVcWoIPYjav0qa+pOPG+Q8vk5Xw7V9F+p6Pg+Mph+J6tmk3mSMEkgrECXJYqFHoCRThjmKsnW2Kz8h9x9u29JxbSrPcRahn9AIIJIGpemh41xuwcK1zLl5SpojPvkfnm67tEewLqZKsY5BKkaOGNKRAipoCCM/qAx18PFrQ5mXkWZBnnvLi+jM8l20yliIZSkUcsZWgYgE5n8wHPP1xqfalCM3fPUW7dtl1OILVIbq4M9w01u5TU4WnEhaagKDKmK75EgrRvUmVh7e+V7ytr2dgm7cZEjTS1gjkH5SSzcxnjNbl46dS9ca9tkT7afZff3VZ769stpldCpiiDTMqngD9Ixmv5KvRSXV8dZ7smtp7J+PIoW83C7u1CaWVQqLU8SPqpXGd+Tv0qvvLq+Lr1t+A923tT4zZokds13Ho/OJKH48AOOK7c+7LlwKLqQ3y72Ns/ItuuLSLe54C6FkZ4VZhIGBVg4oQQc68cX4vJOqh1MmXxc27kyUyb5deK+OxQ+YTG53Cxtkim3iKJnhvG+kNRKlGalWB51pljKsayXmpr+Y8VYsZ68l9w7Jp5ZbW2vY4Nawx3zwvGFh6iZCnVWhOZ50GO3gxJJSzi8i1rPQi026XG96E2u+i3kAgssdGlRmQNpKMaVUHPnx9MaElSehisnYor3FdNm3rx6a4dBJc3Sm6mSrslvUfqAHSNRYaaE/LHQ477lByORV1t7SRtv7b949vFnbrVTKEinJqSg4xuOorU51/hiKxdt5L1Z3pDNOezVruUHjOyWVnZyzsI2d5TqRC0oJAIJpSgyNccjyN6O7k73ja27YRam8+0e0eXM3/eM8242bMr/wCkQyNDCwAAKSshDMDTMVxyVzHTSp0reO+c5uyYeKeC+HeC2Sbb4d4ttfjNoF64tvto4Gb4u6rqc/8AqOM+XkXyObNs3YOLTCoqoJVpBI6iiMKDMg0BpQV4Yzmho5FFDHUxoiF8nZfhlxpniTciVUg0kAcRpHrwwiTcDMPINqXcF2t7uNL5yBFCaAyFs6L64teC3b3JFH9RWYFG63qWtjO5Kl9DBRQE6iPniOJSyWS0VkzpeJLvm6Sl2793GWqyOQKE00leHDHeolSpw8kuxeHiewx7baJPJAsdxIKmuZWgpkfj6Y5XKzOzhHT4uKFJKL24S1tpZnbR20ZmORNFzOWMlK9zg1XsqqTLflu633lHkFvt1lNpt1uCJ4wdJMZAYVy50x6Lj41ipJ5zPktlvBoXxna122wtrZVUCOMFjmDU+vHHF5WTuszt8TH21RJHiVo2UrkeIrT4YzJwarFM+U3sNq7oNCFj25lLZUKnMfMemOtgq2czI1JQnlVza3UDvCzK8rpFJmGWnClMtVdORx0sSgxZIMled2CzGQwzOIJXmjnijBXSR1MHKjNQBlmMb6GHIfPD3f8ADzeG53ARQx3UQaUII694EURl1EGhFTXljPy8PdU08PN2sxSsjPcXFIniOkyoX6+3QAF3AALZfD0x5ap6hnbcO4KQRuLgoVkmIAdCTRizHKhrlT1xZWpXa0DrZbLLK6rL/QePtaYhwU1KnSARm3IcMX1xyZr5YJ1tvi47A7irIgZY7sUr9JNKDlStK41VxmW2XUlNvs62ym0AMoTrkt1YMeNSUagpUE1xasZntlcjrHa24a3laJCkcZjZGYAUkIIDNzOQ6aYsWOCDs2G2lhfXLzQ2lrLOSUUSyLpjDV5gcCacTiaRB2RM9s9tN6vUX7iJ0jiWqEVDpq+IzpUEZccsSWPUTyaFkbd7MzrLaifvXDMA0chTQoC6aqwJ1CpJz50xP5ZU7sl1t7XxQO6R20bveq0twsy5pEDzcMAAOZxYqIXfYWS+CJbxLFJCIJSyi0lakgBXqqSDkq8q4fZJF3YRF49DCsMqaisDhkkOuNDKDUrT6mqDWn9mH2wLubJdZbVFYC63L7WN/tCZDGhYsskgqHGRDUK6dI+eLaVE7QoGCEzbjuP3UlsHuYqpcQopBbUyhk6amjE6dfAY06JGer7mbA3XxBb/ANmN+gtLJTebT9vvNi41rR7XVJJBHJQhm7bMp1A+uObXL/mKTe8PwmVWkTcbKPcFv2je/hinlZhpAYAhlYVOpssl+NaY221MsNLYa0QMxf7QrA3VI5qRRDwXT6ADhzwLQiOTPJbl7mi2sMsmnt6lZqk1bTJUHU2ZPxxGSSJNsm5yQXiMHjMtwzGKAjKqHPXTJaDhxxGB6Saa9v8AzqazgtngbsBy13uVwSSyvq0p2gmS19MjzOKcmLuLqX7Wb88I8ssvJLARyyAXgRIpYpdCMxK100zJqOZGeOBysLxWlHYw3rlr2szP7t/t1n2+a68p9tbQywO3cvvEUZk0sS0kk1rITVeJJjGRJypj1Xh/qPRY87+3954nzv0u03lxGe9r8mjT/LXsXZlt17Vwr1W4qCSVeNxrJyyoBXjwx6m/Hrk1qzxK5bwW7cmjHtvJjK9skkrO0LN2beIIAG/IWGor1U4Hh8K4pXESL7eRURpBGdw8gs0SfvOVm76RyWszJGlSCWZ6kosdaZAnPlljVjwWWxizcmlvQhG77tYhFjjS1iKSmOOFIQHNudBMhClY+t1JCqeVT6Y1Y8b6nNzZa9CCXNzCve1yrazW2q2kpGX1gaSkcbAZmimuWfr6661VuhjeW6ejYfD5Tu8UcyQTiOJzH3Ii/QilgpRWarKVBFa/I4V+HjtuSp5DLR6OSVWnuVvAkhlubaO8LFUmUELp0lTGT26qzJxWpz/ljFk8bjezZ0cfl713j7v3kiT3JsroW0W6208X3k3ZkMwSkZkDGWR6MC6mlCDy4nGR+NtSe0118pW+/wCA7Wm6ePXyvMwsoZLhZ3aKCTTVIHVYwJIyYw9aDtA1p+OM+Tj2Tho34+bRqVZofkvom70kG+XthFfoj22mVpV7rAq5YUejKDpUkUUV058Mt+P7Dbi5ze1h1h3fc5FniF5ZXi25jmELwoqygxIynuQlSEDGgr9PPnil8SvtNlfI3W2oqfciOy93sAaMMivLasrMgkBUOEFC2uU0QsMxVsU24tejNWPyb6oPt59jZ50ee72eKBlkkgkBii1ulI9JkPW7E0Jr6VxTbiWNVefR9R7thuBt4pNu39Jq1LmVxl2+5qGhzQCnI5c/TGd4FOxspyfRjqd38xtCsqRfdQzoBHEdVCukuCBGGIpTmaHgBit4KM0V5Vl1HiD3I8w2pES5im78aALJHpjFFjZwMjkAVoTQj0qcsZ7cHHY0159yWWHvju8JjW4WfuZGWSaHoV5GKsgFCUACmhORpjNk8bToaKeTsuhLrD3yid442iDrOgESOFjfVVep1k0kijZ6eeM1vG9TTXySe5K7L3j2adUHVPI5pE8WlMwP/aK1NIJOXH44ot4+yL681MksHujs0rQgyEBiFc64yEYgnM1Hpx4YpfBsi1cxDzB7g7BKutrl40UMZHZaqoX81RxB5HFT4tl0LK8qo8ReWbHJrAvlIj0kmhpRuFCK4g8F10Jrk1F0W+7TKXC3sBKHqHcUgcTx4VAByxH5VkSWejFiX1nL1xzxsGoah1558jiLrYkr1DhNEVJR10qaMQaU/gcKGPuQHvITQyfEAkg8PQ4eovhe4VJa2U6qJIIZdJqBoQ0P4jElksupF0o+iGa58W8Zu00TbNZyKTqH6emv4rT0xYuVlXUh/TY30GmX278RmLMu1rDrP63YkddVOGrqPDlia5mT2MjbiU9o1z+1+wt/RvN0tWDE6o7wgCpr/wCMsWLyFvSv3EHwlH8zEP8A8LPtmV7fy3eYZCwoqzmMBQxJWqkcqLX1zxZ/yC60RU+DbpYJfwDyRZJWg893QalKrSd1AJAH0jL8cSXOxPehX/QZJ0t+A03HtZvd0ztc+X3d68ZravcTTGjZFmoMgxKgk0PocXY/J48e1YKsnjcl97Cd/aPyDuPL/wDDE3UPJIA4R3ICAEACteHqMT/5am3YV/8AFX/vCOT2V3GUslz5tuV4krl5XkZgWqSwqoybSQNOWRqcNeYov7JJ+Kv/AHhE3sLdMsDy+bblNJACAXnnCk0IBCIUC0LE/wAsS/5qqf8AKiP/AA9urOH9umzSoUu9+uJ0P6sq6HkJkP5yZJDUkfj/ABOF/wA3bpVB/wAN62Yav7cPBSES7vby7DOWUuEqSzMxFTqOYYgjC/5rL0qiS8TVf2mPtn7J+2u3s0txtz30rEB3nlPVQUppHrXFN/JZr7FlfG4luSuDaPCvHowtjtW3WPa0qjKikgKKDJh8c6Yz9+a27ZesOGnRAbrzvx+1V44pu60SmQxpSMaVJqSWIAy54K8XI3LFbkY69Csd996/HdvJJuoJ42WNpXhmoFdstP8AzEAiv8Ma6cFsy25qRQ3k37j7wRy2tpEUhnBFvcQH6nAVSrs2Z1cqfPG7HwqLcy35jexmbyn3g3re5J5juLTNEQsSxuNSkadQdciVJWhJr6CuNtMVaqEjJbJa25Vt/uu7b2lx25zNJFOGRhIXLu6hmUo1ASvEDgTyOLU0jO3DE1v49ud/2biVprt7l2EgbpSgKhpBESc1yFAf4YfekPtbJZt/t/G0k7GNO/A5WQfqCF1RqyMhP00NaLTIjFbyk1jLB2fwOHtyNHB3VuXjnnE7tWQJrMYqTUFTU1FRypiu1y6uJIf4to2+xhKyytGGuH7jNGW6hUkOFYMCNVdVDT1pliMtlnbVB015ZRvdRERzMkagT6mjlU6Qw7YqNQr+Zh8BkMHa2Qd0M0nkyl5+zEjNNQwK661eNKKcx1JIQSTypmBnXE1jkreZdBtvvJYtX3IjhKWpCNGzd1I1kWjx9NCSUAC0NRxOJrEV2zBL74TJLbGQL2YkdTE5fXpyWiqQWUA0fgK/jifyyCzSCTenmkYyyINCd65CFSGUhgCoA6mpxoKDlhOhNZJE81/I5guFVVjjDrLMzChVgCFcOAVdgop/xxF1JjBe7i9JLlZHMQkYTNxXtggMCK8QCFqDXDSKb3gqPyve+2BaW8zMlwzFJImNUA46HzB/8Z400rBnblmf/cOac+BwJFIl1Jv3kXajcMxYwbfA8hFciQHkGVDSmF3wy/BVNyyv/b/wLyjznyC02LxXYb/yLe75Q1rZbfF33ZK6SzjTSNVINWOQxZj7cfx3cJByLOy7UpPsT7Cf7cNlbGw8m99LmO9uFHdg8D2qRlgQtpbTe3Sms1SM0Si/E443kPqFKa4fvf6GvieGdmnk0XofVDZNg2XxjabPZNh2u12XZ9vjEdlttnGsMMajgqogAGPKZc18tps5Z6XDx64qxVQF394YkdYIpbqahMcKKdJNMixpwrgpTUudoKu3608w3mT9PbZJgNKrayhEiDNQOxJoeHDG/E8VNWzNfvsQ3/4Vvmm5f9W9rZxRDRCr6CQtKUCgZfH1xqXOxV2bn3Gd8XJbpoP23+xFgrI+671Jc6R1QwRhEqcyQSTzxTfybeyJ14Hqywtu9sPDNuOpdr+4bSFrcMXpTOuMt+Zexopw6VJla7dt1gqpZ2UFuiCg7cYBFfjjPbJZ7tmhY6rZCwspzP8AxxWWQFF04VHxpy/HD1EGB1OQPHhhDR3iPnhhB4itMvxwtQgIuLSG6ie3uI+9BLUSREAg1FMwcTpdp6Fd6KyhoozdfCo9t3Fk1mTZLuqhXC1iYmpAFKZtzx0sfIlHMyYe3RIpn3B9rJNkWXe9rrZ3xVpDf2kZT9YMKF4x0t0nMfHG/j8pW+EyZuCkpRh/3hud3uNtih3aJbU2Lx03FYxJbTUJCTSEVKFQNIrlWox2uJ2rqea5eO1bzuaI/bX7U+VeZbXBv3k8M2z+No6i3muEeK7v0RAS8SUA7TggBz+GMHkvJVxt1pqb/G+NyZXLUI+jO0bftuy2kO37XapaWsKIkMSVroXhUmpIHLPHlsuW2Vy2ezw4a4lCHXurQUYZnpFeeKogtkSSXSLUhh+bIn0/txJVkg8iQ0XG+WcNR9zEdBCsNYrmK1+Q9cXVwt9Cl5kRuTz/AG77yCztX+4Nw5jRwA1dPEinLPFj4zgr/qNR53XyG0gspXkuFg0gB2LZhsqKKZ1z44hjwPuHky6GN/cjyZ3nIjupbeTqljnts3hMWopKsgqA1RUD1+HH0PFwrthnB5ORzKLC8O94I/OfGLnatwaOLy7x3RDvm36irXcUlVhvIVFKrJxb/C1QeWMeXg/JyStmXYud8yna9y0fEdlF26SzR0IbUZMtPTwFRxpijk5e1Gvi4u9yXSumNTlRVGQxyHqdjRFW+e+QrBCbOLqL9xJ1IFc16aDnjo8LDrJyuZmeyGf268ajEbbpdwjvTU0yUzyFOBzGLuZna+FFXE4/dqXLDGI10KaADh6kcccls7VVCAXM0ccbBm05VyPH8cFayQvdIxr7xeSTbPeMhdYxL/08gDMwBUgKEHrzHHHo+Hj7kcDk5u1mYLzz1Zll7RMQsnJbQ4JaprVSB6GrKPpx01iSMbyyV15HviXqM5uZGnZmi0hUeO4kIDImYOlcqGvPj8ZqsCtaTMXlkNtfs8t0jOO2WFxJQFXI06dFCqqa8P4UxY6yimuRpnzztrBlh1lwCjFhIjDPSuYdmzGfLhjxdansL3gkm37MzoyyRxwfcqrhGU1k0jgF4ADmRjVTGZb5ScWG0pHpS3RyhUM7aQUUt9RWvGvqMa64zJkySPUiJCbcMC8CwkPbCutCBpBqKEjKozxctDOpbHCxsbq9vI4bWE3VxNm/ZDJzqZGc0VqDliSqNuNy5PC/aC+3yRLi5RbwSymVY4lAiBWnHiQTliyIB66I274L+3OGKLb7g2SrVCZlCqQaE01HPMmvril5EgribL+sPYK2gjED2iLbGMSh3Xpdx/77yDHM8MR/qUi35AK79qltLeXWGlAQOJQgUsQRqjcmg/NUemJLPLIWwR0IHufhLQQuIYxHHE7gRRRrUoy0KqDQkfA54urkK3jgqLf9mexncFVSRh+rdGFyocfRpAOQpxB9MX0tJktuVxfS2tq1mlrH95v16rDarNH0vLItaSkDJETiS3LLni7sZX3oUbbbG42e4drx570yCe9nZSBJdsqoyKFqqqSaAZZUxJaMlEoQeI7Sqb5ZxylpHd31W9e7VlHTEki5qFcVB4A8MSyW0I466n0T8RtreHbrK3ugNar25mc0t5FlLIwKllJLLkWNcuWONktFjrpJ1gwj7n+AHwDzPddos4/utr3OSPcdvuVjVISJq6oUPB2hatCprXTljfgy96ObeupBp4W7ogjg+0udBa3nYKRFSgfVTJWNK0+AxcVwJRG9tDqhgMmqsccDRljpI65SpKrqBHEHMfPBuOYDLRu3dLeM/b0jtvV1bvMjEqQQKDMZA8xhRoN6kz2bdWsZLFkaq20iQwz8Umdga1jJNQummrh+bDEjSntx7ktsl5oku5IZppw06OmpZipqojJBAJ/wkrlwzoMZs+JXRqwZnU334b51Y+R2kIM8TTtUVRhQ6WANQ1KH/wAUxweTx3jemx2MWVXWpEvdD2C8R9zV/wBRfXsHko1SJ5BYKIpZWK6QLilBKtBSjA43+M87m4Tj+avo/wBDh+W+nMPOTa0sfOz3L9lfcv23a7nvdtl3TZYnLReQbSgMRiJCkSoNXbqzVAanPnj6L43z3H5aSmLejPlPlPprlcKztDdftgo24urzUP1572qMY30IQGkboYAtVWquWQAx6BNW9DzLrensGmW8mjEmuSO7ZCKyggdQIqrkKr5/PpOXDDlbbFd1ZbyJ5r5jIZZnLooJVyaExydK6GpUgUAoDw+WFCjQIb0ExluFU2g4lJLjpYKH0UqZSw1AnkRz44khqsiQ3KltcSlzPGiG1DkkuuoAGmnUtKMaZ/hhPQmscbitbueInSY2lgYx3MZErGSKR6nRmGVQTQjj64Uh2yw6G9KGErJGi6BKzRjuL3FqVJFTo0nIVzNeWE9d1+BK01/6jra+QbkodklSaKcPBcQCILRahlCKrUVRUklTz9cVWwVsxrkXoS3bfO541VHnljkUKkpEYWMENUSMpDa3GYJB+Qxmv49M2Y/J3qS6x81+4a7mbOS5iaa1YyqkkVxGKSSOaGjyKCUqKA8AMsYsnj4iDdg8w9mS2DzGB/8AL2+mSakYjefSiBo+IljeisRxrXI0qMZrcKyUm/H5Oltxx/1rZplNyXgRpLmNQTqjeSaVCvaQEvk1BUsaYzWw2qbsfKq9mP8AbbhdR3Mj2V5LZv8AdrGGkaO4/XBJKKS5IV0PoAT9OKL4K23Rsx8y1dmSK18kvoUMctpbXlpFMEdtKhowV0KiaqfQ3Emo5VrjNfi16G/H5C3UeY/IdrnE0N7Zst5buWkkl0xBl/UNadZqSTQUz4nljNfjWWqNuPm1e4tWy8W3Earcp0nVLqOtpApYARiifQTX4muM7peu5qrmpbYUDw+xn+2YPoR4pBVpdUcx+phMx0sCaig/xZeuK3ZmhW00Ygl8Luo0UW106IzPNbzs4mr3PqMgAWmVVNOPzwnZPcnFhql2XyCyVGjvLuIyppkDV1q6VoqAMRmfU0piKVWNd4QL3y6zQvLe3ccUddEzgGMdLBmLCuQBJqRx0054i6Ueg++xw+XeYWjyxlQ0sR/zMXeRVLuDRSVUip1g1B+Bwvk1Y65rMcI/dDyG0VHeAkyiViyOWAkWo0EIjDNRx5HLFb41WTryLLdi+39690tniF0ksbABBE8pPcZtXGo1VGjImgPw4YT4lS3+rt0HmD333GExLNOyrAw6dXcUEAkmQ0Bp08q4rfCqSXMY9Q/uAuYV+4kGrR/1MZlajO1Qvb+A9RiD4NS6vNke7T39uVbtSXEaNIpMUzOr10gE6wo51oKHLLFb4FRrmORxX9wqFA4eKRY41aZNJUsS2XX1BdQBoSM8QfjkWV5sjoP3BWhWbuC3hEcasqJIZy0kjZKNOknSK6h/54X/AByJf1sMOk9/tpieMSSQohUqwZ26m06loQrADmTnl8RiP/Hsa5qFg99NqV6STW0aNGxjVpSOD8SdPSQo4H5jB/x8DXOTBxe++zs7xdyGJwBJCrylKxaRV5GKkLnl1fLjhf8AHMl/WIM/+HtsxiMpaJtbFewJGLxDUAWbShFQDU+nPB/QFT5yE83vvs6B0gmguFKdxZ0d3GYJB6VGrlQA54mvHh/WyJH9+9oiCOk8ckcnbWMaiWLuRXKlOfAcM/TD/wCOQnzfaMl1+4K2iEzLJQ2xIcasnYkmqLkacFB5k0xZXxyZC3O7SFX37ikUSPHNpE8ZUyCUHRIK1114KOfPkcXLx9UZ/wCubK/3X9xl/OYrfRrVOkQFnVmkKnS6MNJFSvCvDF9eHVbFd+VboVpvPvTvlwr6LmO3vJaCNw2tVU0yFalaluH8+GNFcFTN/U3fuIDuXuhv+5FomvZmuo4mWMENpajaq5gE0IqcjxHxxYqpPYhZveSIyX28XlezDMiLCs0Ss+ly/TqR4yTxrmeJNMS0gr3C4vGrncEjnIaQovcu4g9P0aiHuirKygUyVhma1FMLugnWrWhKtp8CnMvdTXHIsUfaESKskrOG0kydS1A6jXKgywrXJ1xSS3b/AAy1QWs9yI40Ca5J2jRZO7z1ALQUoKauXpiDyN7EniJJbbRY7ckP3r6LuCKQ3Ii0oKlSwYFeJzrkcPcEkgi48gsLbRMkxLtEBcCZWjk0jJaoQdVOVfnhrEyDyJEN3rzBF7kcj6Fmm07fFJ1Iw+tDSleFTQHLFtMElN+SkQO/83YTypFcyyQzMdUxAEmpFo2hnC5MailePx4aK8eDJflkZuvMUk7V2S5jjH+VeNkRamqqpQas65iufwxcsBQ+UM3/AHMdBlnuKJK4nkGruSTSMK6SnBWBzLZYmsJW88hA8i7Jlh1dyQggXJXREynNRJVlqeWfHE1h0IWzyeg8jVY3mDVVJTMqaetO70s9VoNFfpC0Pxw/ksrXIhkkst2W606JZJJR3e/qKrDJGAWeUFiQASKVNMzz5UZMcGvHmlDlb7lAkMyiRFgkPeaR9f8ASdtIUqBkQxybjxxT2M0rJIx7hcGVZu9EVT7YrbPQao8hSNoiTT5+ueGqohdyirbm1lvLuZluTJdInbgstD1ZydKrAqANUVBoKmvDLC7oWpPt0UGwPBf2FeV+7Fj4bc+eX9x7ceIbI11c3NiVWXd9ya6dSGjR8rcaUpqerZ5LjkZ/LUwtqq7n+B2ONwcl67wj6n+1Hsr7b+y+yrsnt/43bbKkgX/UNxC9y8vHGWu4uH1O5+ZoOQGPPcvyGXkv4n9nQ7GDhY8WqWpbHcUUAqc8zjHBsS9AvuD0z5igPLhgGqndRAAJIPIcsNMsVT2sDPmciaceWGPtPahlQHPLBIu05VqkgGuAIg76muYwgPA5UofQ4Ywp49QoSQQOVMvTCkTEElq9Qwk4DMPWnHjliasVtCRZ7q2bTJ1hm1IeZAyoSKgYshMim0OEG5QzLmwRloGVsjXjzxB44JLIOaEEVqDUCmKyxOTp/ngGNl/aQXlu9vPF3InrlQZE8CPlidLwVZKSR+G3We3m2297bOiiJ4yB1ITQZNXmKE/LF3c6uUZuxNQzKnun7V2cf3PftLRtsuZA9uZI6gOH1KrpmpAYClaY7XH5PfWJOXyeNDksfwD3etN+uo/G/IoIPGvKYIA1tYBiLO5gibQv2b/SxoM4xmOIqMc7kcR1+KuqNnF5afwvRlxS3Vsoa6uXBjV6COKoYquZFPkcxjIl0N/eIrje0gW7ubi7SKOGgEtaRqpBIViagtTli2uHu0Kb5YKL3/3ca47v+kVTaO06TbjIKTPcBqKkK1FVpmWx0cPDjcwZeTqVhJ5duNxHBDDMWaeLVc3Ep7byIq9esZcAKjKpGNawpFDzMDt9/PBOt3JO00eTRSBRGI1By6sjSnqMO1EQVmS7cfL7q50vHPDBIEpbW5OosKCpoePDFVcMMtteVBQflN7GTeXkSt2mkZYoUYhboPmrnoIVM86/icdDFoYciKVbet48X8g2vynbVCbjs8scs1gUftyWc1Pu7JqihaSNSycw4GkZ41ZKK9GjArdtpPr14BvXju/+K7J5D4xdrfbBvdlHe7deJVqxyjUdQpkykUZTmpDA8MeL5KsrtPdHseHaromhVv3ldnt1vcL30aRslFSDQgioPzxPj8a1mQ5HJVSnLWK58m3vKRjFIySF8mAIUA550x1Wliocys5LGjLK2W0hWFSuiMUUAZcs/wAccLLd2cncw41WoqnbRG5rSik8PQZ4rqpZbe0Iy97p+5sGxtLbwXKwzwIsvbk1EiNGOsuq/SaCoJOPQcLh91ZZ5/l8yLFY+4lgvuZ7bJu+2u3+oPbm8282+kyNLGAQoJFSDXiOGNPHfyckPYozV+ZST5cHyW8czRghpkmaGSJnKu80THUZM0Narxp88d7snU4vzO1wI9z8vjmimJuJrlTVZRKp1ayEOTCg0I6GuZrwrXFSoXvJoRS83UTzRkzKZu3+isy07hKtqYSDVlzWnDE+0q7zLVltMEDwao1kupGHd1cSCMkDUIP8MeSriPWZMkokNraIZWVZSYq0liBV9IOSgVzWuNNaQZb2HRcpFiSJu5Eh0OklRoNciKAUPri0rHHZtqvt2lKxSsjAf5uZgdGmv0q3CvridayN2g197Ze0r7gbI/6a8Fux783ccBmoKVBpnWtKE4sntRU22z6Ge3HtVabatuy2oiWfTGkcmnuLHxPEZjOmYrTGLNnjQ1YsKepq/wAf8YtbGMabYU06YyaUH/MBSlPjjnZc7OhjxwSmdAkYEcQag6hqrQk0Pwp8MZ62bZKyqik/OPNfBvHjdW+87/t9k9vEpeB5AzHWctUa1OVK5DHSwYMltkYcmelepk/zH9w3tjaMstvJLu1y6lJe1Ew7VMjXWRRTjp4uJkW5hycqvQxT5577XW6Pfw7Bs7WFvSQ297OdTaBkRHqJAyNcbseHt3Mbv3EG8Bnv76xuvI93mN3ufkDdi1noVMMEZ0usbLktcsqUxd26FTUWhGhvHbGNPu4mQvYFNDxxZrJGmkK+rgx1ADIZHFF9DVi2JNsNrHDvCTSxE271Blk0aZAp/qEpQ6uVPXLFdrSiVa6motss5TZ20gPdt5rdfsnlYL24iBUaiMyunMVpjnWN1WJ/JfDrH3F2KXYt5aODd7UtL45uncKxpdv9OpRm6GmYHrlwxKt+x6bFGTH3GML/AGC/2DfN28e3ayG17tbsHnjYdwykVLSKoFGSRTkynPG+tlZGN1aeox3G3yRATSI0UaM1uxVK6YwDT6hUgVBpz4DE0wYyRxPAiSCOQWlukguYQqhyGqFKsBQFsjQfSMOJGhZH3ohZzxh5HtYUMFtGhVwpJJEa51ByUk/GnHCbE9yX7PuUlswkhmmtgFa4HcCyFS7AsjaSA9WOk8dIrTMYi9hF4+3nuTf7CLBWmWVO4rtauWJQJ9TKzE6gTSpFcqfPGfNjV9y/Fd1Nz+Ce6dpudra/cTrPFKwVJ1kMhq5J0qeJochjj8jhem51sHKb3Lqtruy3S1DRlZoLhQWVkJUg1yKsCDjnvuxs2tUyqGUP7gftl9sfOlurkbUPHN4uWDndtrHaLNUEl46aWy5ZfDHf4H1LyuNC7navo/3nmfI/SfD5UtVVbewyX5j+0fz3Z7q9utiNr5btrISsEOi3uC1QASpFagZVqRlw4Aet4v1bx8iSv8L/AAPA+Q+iORic0qrL2GfL72+m2S/Fj5T4/fbXc2GgXMlzA0XcWUFY17i9CkL9NAOGfDHcp5GmRTS6fuZ57L4jLj0tRp/aNP8A2haK4eC4ia26oYEnV5iHH0lSQWPcBHMitMsW/wBZJnvwGtqgk8Ngu4dUcYjhjJmsbkVV3K8dXSCWBFKD5Yl/VwUW4V1oESeC3Co90CzW4VWEIlWB9B+oMZNDLUnLjT+AxJcplduNfZCaXxO6hjkkuokFvJo7tyrgUmRXIUljQEa6Hh60xYuSnoZ74LJ7DPJ4/dCPSVdYljiczx0YJCp7ZLUJ4nOgPzpiyuVMqumAuLGQy3NxQxmYSkvX9NyxIDBVB6lGYUU+eLJfoZ1aNBC9k9s0LsVL3ABFu6HugKQg7wYKtC4OVa/HniO/QmruNzyPudukMJaOWELJItM0jliappzqCAtCM6Vr6y7KvpqSrme4rt98vY+7PK9y/fRUZmfqR0JAKoa8ATnTmcV2wVekGmnIutmPdv5juFujM0igiOkUElO5FIGoEJYHuMTmK8KYz34VLdDXi8pkr1JZaect3E72qGd4Vin1kNcMMgWqenM50pl+GMmTx3ob8XmH1JPZeefpMz28RniX7fQdStMWaj9tBVtKqC55/hTGPL4+y2Onh8vV7klt/KNqaSOYXWqaN+8t1VS3apoDyK45cFCjGDJxL+h1cPkMb6wTSw8oVOy0VyIoFnNLkSaSiuoKgwHqMjVJLAigxivxtNjqYucvUlNj5hLqIEkhuixSeMuGdwBqRA0g6VNPpBoPzZYx34rOlTnT1JNb+TW0oQySIIxI9ZiwdXjFRQNxLA5MRxNaA5YoeFmivKTHWK52W5RqwJE+gAuFAEKgnSuj/lA1HllTFLrZFyyKwI7Nst4Xtk7ehtLtC6qysT1KQuVKaeJ+fphdzROsMSy+IbZciTsTRPFIpSJIiACAK66tqz5mhp64O9om8aGqXwa2k1osBMdwugAacs9Wo6QCdVOH4cML5jI/LQxze3NmxdRDoaRNImEUauSmlRwAWpFdOVBXgTwdcrLPkoarj25RDJJBW0EqJoDgKETS3Q2oD6WzH4DEvmidBsn9tpdJhWd0ExMaaixWoyR1VdIL5cCeYzOEsqJKrSEL+EbmWjmW6IE2mOUS1AWNFKEORqqQMyPjlTm+9Mj2DVJ4rvEOkRTN3IGYs1S7lWIOsZA0rTOnriXcmFqiI7Jv6LJND35YLmMyCOmlFNCWqCQRmAaA0AOGroqdRrl23e0jYxyNJJcJI5uQ1UdQgIUGo1NkR6gYcoEmgia03eRpOozxTdv7czs4EKupNHrmCRxBPHhzIl3IHZhJst6XXCHaCUN9rHcIC3dDAvIxDk1IA+k8ueWEmmDUqRLc2W9NLIIppoY5HpDBQVBRdLoDqy41rTKowShNsRz7Xvv6kcrkJJ+otykp1E6getk0kaaiunLPDlEEnMiabad2li+7dgY4p3VWoTpegUmpp9HIVOZrlhyizoJR4tePI88sStSB2upASGkWQ0D1U0UKQKg5scHcQrVnh4ReareKRtQZf07mfpCqpAqrV0kvwFfhzywPIDrLHm39uMnL2QWUyOLm1jZA80YNArBkHENQc8q1OI/MQ1ibHaP2/tlinSaFlgcEQrJI6lZloFBHEKNOk6TnmaYHcPlNMkNv4lbJMYngAYx1FDRpWlBACs1KkaiQK5ccJXZKtIHE7dYQ9q5YxJLFFHD91BKGjaBTkHDZkqfzczhvUk4QjPke22UMckBgW5IMskA0NpdKEvqagOkLTP0xJYmyDzJEC3XzstbsFlBERMU8oUrLIsqkLRRXItXOhp8sX0weplvykVvufnf263bWbSFmjMc1g7HSIwBrfWGIJ0n4HljXXjma/IkgW5eaAurW947Ru4hjjmcd1odILAmgHQeB9fQ4014/qYMvJjqRKXyiSSRjrDwCQRXVnIxLCI10mjf4eWnPM8cXrjmO3JbRFJ97nuDJItyyrI4hRWIkkKgkyalpUNxJIGLq4YKLZmES7y0TTTd9Vt20qJBHqJqpImVafVlQenyxL5RFZmFG9khM0oqy29YyInA72o9YeoNMhnnh/LH86eoT/qFx2ZY5XJBJWMyU7bdzhQUBJFQMyeWBUQPJI4peyR25UaoQAsd0xrqOkltIC5MprUemG8clXzNSUWO5M0j9xSI5VjeyOtGt1ieqjjxVq0IY9Pxpim9Ei/DnZOdtukkhlGlp4UcK0tO4Vkyb81FopXUK5ZmnwwZaxsdXDedzQPtn+3/zn3ZWO72m1+y2NAbafyjdQ8MWkAnoioHmddWRGXIsMcnl+Qx4N9/Q63E4OTPstPU+ivtL+2r259qJI92tLM+T+WhFSXyvcwrypQmgtoQDHBkaVUaiOLHHmuX5LJncbL0PScXxmPBru/Vmhgy1IVgaHpNa1PPPHP8AedDtE73SoSQR0igOrifhlnhpEu2NxNJuFtG3ba5RXX+opZQV58KenDDhvYJqhvl8i22I6BcjgajgRQ0Iy51NP5YaxW9AeWqG2bzLaIwS1zGHVgEjrmQeFaHjT0xYsFmV/wBRUTt59siSGP7uNyis0jKa5D09c8sP+msP+oqePuBsQFWulJaRYlCsKljzGqmQHEcRh/01iL5CEsnuDs9IBHcJKs0mhAW0ErX6lJIBHP5Yf9LYg+TU6nuLtHcRe+rQMSplCsNBqFVc+IqeOE+LZdAfIqL0892VyoFxQsoLUBNCc6D1ryxH+nsNcmvUUx+abFI7qt6iiPqNQf5evH8ML+nsP+pqO8O8WNxo7NzG/d+gBhqNfQHEXisuhNZasWfpuunKQkfSOFK4jqiejEMtkuTJTuaWoDyJFCAR6CmLFchagtsppFc28vUVA0uM6jIUriN1I8Y4luHyxWWjfe3JtoWloWRAS2nMUUenH+GJ0rLK8lmkZ090/dGTw23t992iBLw2bar6BdJM8Q0s0YkagDBeRzI4Z46nH4byJycvNyOx6Ey8c8q8d90/ELPyDZx3ts3CDJJQNVvKpo0Utaiqk5jFLpbDeGX1us1dTK3uh4J9v9wugxPbXMTW92GMD1jGqCWAocmR8wVPzzOOtgusldTncjH2PQJ8O/cDu21Qf9re4Un3e6mJk2by+GKkV/xpHcjIJNkKvzz54qvwE3NSunOaUANw883PfrqKO4DRwyAyJtdvTTHqYgHpy5k5Z+uNFOPWi1E+R3MjF2sSTSQRO0qWqprWNwy55nSwB4DM54tmSFnI7LDJIYpPuAgCpCbptLUCka5CDmaBRwAIGItk6VOy3YdZIrcqJyxEhOYCjmlBQ1pmDgSB6CaXc42irMjRyo5FtIoVWUhdLKTWijiRxrTDgUkEvZoJ2kMwYZMTBnVmAoqFgKqFoK5cT64uoVXUlW7/ACypDeWlxMfutRlvZCn6UaMQQys4qSHpmM6Y14jFmptBIfZ3358m9q7fd/CrW3+/8d3q5a42yKRiP9P3S4GuUW9GH6VwerSeDgkfVjLyPHY811Z7lmHnXxV7VsWxa+/llu10Y/JrO822RmUXlwpMyJlqZSmRouVPgcT/AKJ0XwoS5XfuzZ3tRufjG4bUu47XvtpvbSmhngdA0Y4FWQUdTyocee5/fMQdvg2pvJdaToyKVoEFaAcyOQGOX2nX71BnX3p969q8HsGsbWYzbzc07NjHVXzqhPq1Aa0GOt4/x7u5exyOdz6pQmfMvyL3V3fyb7pb1b2AiUFtehZJZVoAr8DpagBHpj1ePj1xrQ8xkyWveTa/hu7QWfhOx2F+v2101tFbsihQAJIhUgkAEGtTQ44+bH/mSjtYmvlo+Xn7g9mTxb3Cuns4DJtW9B7q0nhdSGajM2k0p9Wf447fEfdTU4vJr8uzgoD/AFee5QW66porRXWFSSJHFf1EXSKMF58ic8aflpGdXHfb55Z0gWABqp3X/M8aqKEJEa1VKAlq0+GIXrAK2pVoKskaRxsxTKQMKIgK1ahFStfXHlkj1rDmuAkscCwvCs2ZtlTtkKKE9R4gngThoi0dTuNKlm71giOppEYUQA5qW5/IYsSkg1Brz2Y8IhuLuG4Y6UA7nZpWKsgoNVeLUyzPyxOIRUtT6be3/hdrt9tbRrCq9iJSxiDGjA56gB8P78ZcmRmzFVM0rsFjDboiRgrCTWIsKHqGf1CuYxzslpNlKpDv5R5l414JstxvnkF2LWztgI1jTqkkkP0xQxj6manLFOLj3zWhEsvIrjrLPnR75e/nuVcPaW11De+BePb3DK/j+xxER7hPat0LcXrn6VY5BRTjj0vB4GKq9WcDlcy936IyjYpu/k1ykbgJNEWVZCweSctU6n7hNEqtKk8eGOo6qr0MlX3lo7f4X43Jcq9/tcnkE/b1XZQGFdDChFdIqwAy9Sfhiu13BJUSRH/JPaz22vNu3S5WwudkNrHNJFQszQSheYqQQ2XD5YK2beonXt2Ke8bgtYV2mJ5E7JgdJllcgaFFPkpPH1xddNIglJdWxsstvJCCkVwWRJLVwQtEZSjgZ/lAGWRzxivPU2YyxttleO6s71ZEtRJcRMqA91e4hA7byehH+ED44ps9C+qk1f49ZW11YRCW3VUuCVND+l3moyIoHEGta1yPLHNvbU2UFVxt1zbXKw9vtPCUlEgo9ZF50FTqUmpFPngVkx9j3GDy7wzZ/c3bbOw3e5XavJrGExbL5BpcPobUxjk0ipjNKkV45jPFlMjxv2GfJi70ZM3bxjefGtytfHPMrF9svwe5atIjtFcQs2lZYpMw2YFanhxAxux5FZSjHbG66MiN74i0B1SxHvzysHmiR2/TLEBtOriCM8XSQgaRZ3MEhRjKNxQqGu11UgT1IqCQ3AsOBwh+0Jt4Iypkt41jLM0kOmUqyduoeuphwFTwof7QTHexnuJGguYWe4mjULGodWm7UIrKGUkAl1GTDhTPliuz1LFsWN455bcWFy01k6PC8qtZ9sD7dz9LUSoGoKOK5emK7KUTrZo1J4X7qSxMAZDK8Lx20Dq/cNaAUDVBYHOp54xZuNVo1Y88Godh88tN0iWVpANTmMx6ANDKTUVrSuWOVk4sbHQx55J3DeW9yOg6tVKI1AfUZfzxmdXU0VsmGy2treqYrqCO5QkEpMiuuX/qB4Ydct6bNojbj48n81U/sGK78E8PvT/mfFtqmYMX1faRghjzBUCh+ONFPIciu17feZ7+J4t98dfuI7ce0Pty4cnxWyhqhUGNXSgPHmRnzONNPM8pf22Y8v09w7f2EiPT+yXglxMZrO2ktywCyKrrIrKpJAbXqqATUA41U89yKqGzn5fpXi2/l0I1c+wG1StM8dzbXE1w7P3JoRVQRwQilKUyrXGuv1FdRKaMOb6RpfZrQg2/ftzeQmSHb4Z1KASFJmY0jJKqEyADEktTI5VB5b8H1JXq4ORyPo5rZfcilt8/b3DYzzG2jms0aUq33cVVCyCqIC1aZ0pTgM+OOzh8/wBy6P7TzvL+krKd19hVe6+0G9WIuxBZXM1KkvGR2glKKgRtJJrnmK/OuOri8tS/WDz+bwOShBr3wLcrSZZFtXiuSWS4QloqoeK1ppUZimeN9OZSy3ORl4Oakp1/Iis/j8CP3bjbspUQWMQZjAGQUZZGWuQJJyzyzxcrz1KHW9XqhiOyu8UP27tweMSMnToDFhJqcAKRUjqNcsWK66srd3Ow3yWkkIUSKC8JdLmodlEbLRCSedcwdWJ9w/mJAvvdytZdOt45YQZbBpGZW0zjUzNUVKtpH1fl554TrOvQ0VzJiu33iWERRRQTCRJJ5Fuo6sGVlXWrMGY6VYahlTmOeKbYqstryLLqPNn5Jci5gEcqPJFSSJpCAJZGWtGeo4LxbjwpjNl4lIZsxeRyV9STWXlt7CkTNEyG2YxJqJWkDAakCsTp4Z+uMOTgVex2MXmmupMNp8xVe3EpX+rnZrRFEZJBcBSRThUD545+XgtHWweX7upN7Hy6UDQDLOqsEW8Ua9KJnpJJq4UVHpQ0xz8nEOtj8kvUk1r5noklku5hojJEzHU8USuwCk0OoajTIfyxmvxjbi8hqTC38q7ivCFWOaTqMPcJjCqWbUSOA45UpT1xmtgg34+YmPsHk6BHi7rDrBTu8NCoWIQLwqF5nFNsRrrnHmPyQOyygIysf0oJcj0k62Slczy505Yq+UXLMhwTdbYuGL5Nrmj1BqErx45ihFBzOIOhasqYJJ07dSD909dbsAWQKMlfMZ1rSg4ccRjoWKyYYiW0jurR9x0jEjQgg6SSAKVoDnmcQGoOPZIHjkDpJLbFYvuk+hpGIBGnWKmhyrzBwS9iTqgkbXaKBKwZlMjJLVuiRiPqIJpQHnw9BhdzF2oTvscTJSWSR44l1K4AYMGqWYEZZDnifeN10EA8d21TKRAwS7KyiRTmUTh0sKENkGz4nArEFSROfHbRYy0kZRIQ0IhjotGaoBDaWAbqzoaAeuJd4/liOXxq1Ebqxa2NFZB3DRKdRK1qaLnkT86DAshW6DW/jMbRhVj0SsHrcDLUppRzVsz8T8aYfcR7AuTYEjCyPGyRqoRkFWUxsBxABFan04fiMT7huomh2q3gQx9ZX6ZXVupxq6VrTNV1GhA/tw5bEqhEltax/cQBxK/djaZWURKaAaWoa50GRrgIuBtm3K3ge5ZApR17qxTiqywRjMli2ZT8tPwzxNUKnkgjV35RbxLIGbSJYwUgjarqxUErGSAWcCpJbOvKmLqYiFs6IPunnJ7bvHKkvcAdIANR7bKVYVQgBzUgH1xesEme3Kgri/8API7h3DXUAQ6ZLhoyxcMOla0NX05jSBWtMaa8cyZOUytb/wA3u7q27wQyPoMlyisWJo2k0UEhStKkAZ40045ityyCbn5K9x9rGlyt0wMj26SCpUMBrLqaBS6+nLF6wGS/I1IreeQXEjB1d7acyN+oHyA0g6JAmYUVNMueNFcUGa3IY1y3t1PMWBMjLGlNZDLprnQngKEgjkc+WLlUzWyNiFpVeYTxqqaGoIXqGaFQau+quklcq88vjiSQm4QWlwY45pVRtTJqldKaVt3ahKspyYE/M4nBEGSbSSSFAbqGZHB7Q1yoiEklMqAODxFRka4Sr6k05WoFHBNJIVDRRFriNCqGi/4QCTrYLqatT8qYcCs4OFbh3SZVjMsMbIIyoYGJiQnMDNThqsklZRA87fbo9zA8Kg3iRnWXOphIRQUVvrBFPWlMsKwmur2LQ8B9vfLPO9ztvHfENjut33lZU7tpbJHPDCGGppruYUjiUZZs3y9Dg5nIxces3cI28Tj5eReMdZPqt7Pfs32LxdLfe/c+e38o32Nu/H4/bhhtduQagSE0a4K04vReORx4jn+aeRtYtF69T3XjvAVxfFl1fobei+3tYY4IFjhgt1WKGCKiooUUCqBQAAD05UxwHNnqekrVUWmgz7j5LtO3RM817EoQ0jLE5n8xFONK0xZTBZvYpvyKV6lZbp7rbVDHIsF5HIUYiYxajop06aAjgD642U4FnuZL+Rr0INee5G5X0VY4HeGJ+2kAUpnpPBtNXHA1BCnhXjjTXgpMzvntkdvfLd+mSWIO7SKqJE8Lqi3DSKqaSv5VNSQAankQMW14tUZ7cxkXu9y3e+kuJY795IryRhDDqIYCMsSAyhgVBoNI4ivOpxfXCqmd57PqxqLX+qSVdxDtABonqxVC7miEsQxBoMgKA88TVK+gLI2DFibd49TObRBUCNA2h5M9KgGgo2Y1A8zg7UWq1oDUs5IWRg84ubc92a5jqpklXLUSQQMhT5YXy5B5PVi2Da3hjgRppSyKqywIVZASNS6K1yDcx8hiLoNOdhzttjuVDJGk0zQCgLOVWUmgBFMi4pkSMQbqixKw9Q+KbnMgSC3uS40Jbs1W0LTIk8Tnx1YqtloixY7voOsfgu+JpMdtOdbERSFDpVKHoKHkxPM4h8+hYsFwx/HN4tAmm3mgijdhGU1lg9SBpVuAINczgWSliXbaovtN93mxeNLfcpo+2DFNG9WpI1TU8QKnhgeKr6C+dapYW1eeyakivowIDRJZ0Nf1BkxyrXPGS/FW6NOPktk4tN9s7pdUcirppVW4j4L8jjPbE0X0ypg7vyCG01PKrdsjpZcz89OI1wNk3lSI7uHm+0LHcRu+nSlaOpGpTTiKE1I4UxopxrIotnT0Mde8u77RcQzXNhKssUiO9zZpqpAqAdaqadQplQfLHb4lXXc5PLaIJ+2Ty+82DyjyfxKTSlsxj3Qxl2ZNBqsrqWFCJDQnLLC5+FWUj4OSNDdXk20jetv/ANQtZAZbeMvbkKJA656RpIIyJ4Y5GHJ2WhnRz41kqYA9zvB0tu5JLCJ0u52mmkQNIoJ4llFApHqMd/j5U0cLPihwV14r5R/o28SbNvbLJZgi2s9/diBB0khZkA1Efl4/jTF96yiGK8PUulWtI4+4JP1I1Ej9shkUOamjoCpBqAxJ+QxktJqUBVzcxDRNKEEdEGhkGkxkmgPMMTU19M8MciK9nmVXmMjG5UKs/bPcZS2agMK50oABiSI2Gy6vjZWzLFcjVIC8CMwkkQLUSsa0Vgv+CvEfHElWSMkL3C9a2Mk9hPFruelHNXYq1WIkByFGNQSeQyxbVFbZB93upie+sSXUl2fuYFuaa4wACXY1zoD+GLaoqvDKm8jT7i4uJHa5naakVtO6l6K2ayrKKUMZpT4Y1V1UGWyglniV7e7/AGhgWK4XctsdIfJpYtUiMtGEc+atk9c8xmMuGH3qr1KuxvaCZbRDvnjO4C92ua9s9yhZ5Irm3AjaPTQqsqqaNU88VZHTIoa1LqLJRyjSnj/7kvJLWwk2fytI7v7iALFvcMel1JNBrTUjVJyrT445GXxdO7uqdTHzbRDKP8s3nZ/IrozR73eWTXd2xbcJo2BRnoCO6AaqR9Wk0rjo4aOiMWftu/aM21eI+PWN2u53W4m9e1cpMOCtTNHYuTqJrQAD4c8X2ytqEU1ww5H/AHfz64tENnHmltKqFLdtLxIRWI5Vq3bB4cBxxXXBOpZfOq6Iqn34trjy7wKPe7Vnut08XEb9uOMNJ2kJ1hwOAHA8OfHF+H4LR6mfOu9SYYt5K3XdWNbcBzIkiBwhRxyAFHFczQU5Y3p6GGy0LM8c2SS87K2zHvIyI0UR6dSglVOoLpLAgMtTlXFGRionJRz64kkllQg3KhmmC6Ap4HWgPCnAY8sevWorr+k3ck7qGRO3MCGcagAAx9KchwxKqI9w6bZPbRbhokbtulyrWsMw1oUjNDkaVahBqf7sWVUEMrk217U+S2thCitMqQ6llKZNDJqFCdAOqp4DPFtqyirHdJm+PDPcW2kSGSMCRNS9+5jYCRVKkhCvpxyqTnjDkxSbq5EX3aefbVb2Yma70oselFBqTqyABpqU51NcZHx3ZwWrkVrWSB+Fwx+63nU2++QKu5WWxEp45tUgKRWbQsCZNDqdclWqSeByHDF2d/0+P4d2UY6/PtL2MCfud3m93r3s8wllZZYrC5g2SCPIiO3hWhOmpo2uoJA9KY7njl24U/U5PK1ytdEOPi9lbNDHtsUaRz3MJeYRMRcNFVdCLU5E5hjyFfXFmWzWpZiqtjcPh3tfYjagtysaXx7dxcyBD3OqMEJqrUAadWY4UGWOPn5fxaHTpxU6zBlz91n23jq7bsOzW62N1vdbncxEhq1unCrE/VXIgAY6fjrO9ZOfzvhaSMXWMkgVZysfb72lojQRpPKvSaEGoqaEY6FjHXQtHb91js5rdZtYfQWkti/F9WmUxkHkaU5DKnE4x3Rqx2LO23cG+5ktblQiXkKi3OkGN3LamLKpyJrSpbM58csUWqi+tjVXtlvVlvlidukBivNsMam1FEDISOso+oMw5EfzxzuRSDXjtJoCbaYtwt7lDItxLq1pcINNcl1Bigoa0yxhd4ZrqtCvNy2K9ivJ7SUSLcQsWtZVkqEUA5LpAOeVMaKXkz2UBkE3i/mFla+Hefbej6pVG13k4YM0gUopSWoIkGeZNPUc8O1rY3NSM1toyrPJfZvdfFZIFRz5D4y06rHuLqUuLGNOLSKo6lLemNWLmK++5ny8d7rYqzf/AGtuYIo7myfVFuGu4WYKREaMNINWqB8OGNCzp6FHynBXO4eK3MFxM5gW3FyBNLPpAaIaSzqkjc2oBwpTE/mSQ7GiOttoWdrmaBYu9El4ZSpgXuIwChlQroqxJIBFflgkblKANoLh5B+qyXDzySW4iVSsJNAyaBlGZc6nOvwwNoKokm27jJF2WjLnuPpmkiASeNkJP6ZBBrqHIcMQsWpF2+Keb3SvHC08zxuzl5AdWunFRTMGmWojj8cZ70UF9bwab8U9w4rlFmkvGlYk1LL236iRpBIFABlTl/LHPy4DZTMXrtG/2t7BUTq5UosjVVRmBQZZA1ypjn5MTRspkTJUslaUOkj6gDXhihqC9OQ4HmDmcicRG0Me4ba8h+5sm7Fx9R0mgYj1ORGLsd40ZnyY3uhnTdrmGKWORS15ErFVY010rQUOVT88aViT1M9szqtRFt/nO13camcm3cOEYONOhtIrz4VrngtxLdCFOdWYZIo7vbL9AY5YLhJCQCGU1NMyOeKYvT1L5xZPQZb3w7Yr95pDbJHJc0M0qgdVKca/LGnH5DLXSTLl8Zhv0IFuvtVZ3DL+hBeL3Aw7oXUoYkdIoeAx0sXmGurRyOT4Cl1svuKa3j2TtjbPHJta2xFaRwLXSCdRAXSAK0BPE1x3MHm5f80nmuZ9LUtr2lL737GGWS8aGe5tXuVDmSVRVhQIQ1SRU0yFOWO1h81G8HmuV9ItfylXbn7PeS2UtuVghuNCs83aIZFZAQNaEkSGp4Acq5Y6GPy+K3qcDP8ATmbF0KuvPGb3bQXuLS5QW6vbyTyROWYuKAszN1IRwAOQx0qZ1fZo5OfhZcbhr9vuGGXaTblbVo1g7MpkLvHqUzLkACrHhUkrWpxc7rdGXVPVDTc7avdlt3eXtxsxUS0RDUgmVFo4q5PSK5CmIqXroTWSdUE/5uMyX0Z1NGpaK0MpLkKQCZMiCAOeVcS02LO5THQNN61tJNKWkuEjuA0twCservKFMekAqPXjiDxpl1czWzHaPeprSkazP9vbVVJtY19mukUjAIFWQqvwGMt+JV79TVh8jddSSWHlUrO8DSNUTa7aKg0mNFziYZ5hiTU5kkg45+fx76HX43lNNWSey8gBkEXekoGEcdrOz6DBL0vCZNX1VoTXKpNeGMOTiuq1R18Pkk3uSiw8umSKJbeWKZjE+TkzFFgAakZRl1MjAV5cgMY78ZHWxc72krs/KklSNmV3t0AbSzmOUOpZUMjD6lyowGf8aYzW4zRvpzUyQWfkzGZtEzMXukaOXTp0aloTozPbZqhBkTxJxntgfobactD/AG/kKiNYo3DXEdZbhVNTqZg0ncIyYsBlwAxVfAaaclMfbbyWESao5AUCuySRk1bWBqVD1DPlTFFsJopnHSPd1ZZAsp7UkWksymNSCRVW0sK5cMq1xU8bRasqY7Rb13CryOzFMhQVHZQEUABKqwrx4/wxW6FiyA03GIxumtjHIpV2Zf8A2aivbCCg50BGeWH2SPvA/cfoWUJkMyNGDOgclQur9MlwKsBlXl/DB2uRq4UL1jJGRRpJwVMbB9CtReoU9dORJrhdod4ha+RY1mjJIgbVGkoOho3rRUGQLVz49WJdpG1huu92R45jVpGnISLWgY0DfQfVPXn6YsVCHzBmn38xrMjFmd6CaIkkBzQaVIrQEGmZyxOuMj84i975NBHdqsjrCsAVEMjAiONx1BiCKE8BiyuGSm+dIgl35VE8UTC6IdAWDhXXNvqV0ZsiOVeGL64GZrZyvdy8074ip20SWWltOtRIxRq01UOmhBqSpPwxorx2ZMnISK33TzPureSPcGWUfqSRzDmhopVa1KkAVIatc8uGNdONBgy8ogd55PK7Oe+qSwoZVt49faj7gPSUqNQB4EcOWNNcJjty9CJzb1I0kccDzfcvUW1sFzEpGbKo4DTUkH51yxesJRbkStyNT7gzLObcRQFV7OoVoygDuLqBzauWdeOL6USM1szQ03F33IpGz0TOEMbDu0I4iuVQTliarBX8xnC5lllmeTQr0VTGxVJZkA7a5g8VrgiNhJgZFlREqe392FW7L0MolVSA40AFeQoOWBIbYOkMFJo3mE1vMYprSWhMSjlNwXSTlxqK8Kk4cMmvRhdHiL9lVmljXs3isjGPUztGpLqVUChAVjlkD8MSI6P3HRGsAPZbXG6FLO+B/UeJV6gmnTUu+fDhzGCSa9obHAncT7YOURpXEjrokzChiSpJLtXSRTNeOZOJdslbvBMfHfC988gu/wDS9j2d93VA6vNACYoZErRpmBCIBlxPCmWKr5a0q7N6F2JO1l6vp1Z9AvZX9j25+Q/Z717h7nLs+xx0eLZbIL3rhHVdSCRq0jIH9Rfqrl6Y8z5L6lrimuHV+vRHqvG/Td80Xy/DX06v9x9OvEvCvDfb3ZIdh8O2Cy8c2a1pSztIwjOVyDyycWb/AJmJ/DHic/Jy8i3ddts9xx+Li41O2ihEW8k92/Hdlkay2+Q73uJNftLM6grmubSUpUEZAE/xxoweOyZNXojLyPK48eldWU7d+cec+TS0tLZbXbSsgdSChjPSMmqlWFa8cdOvCxYt9zjZfIZcr029hG22i6nMrbpe3d86qT2IVNVkOY0yEmqk0rpxeu1LRFc2etg37IkySNDHbtOqIwYEayullZtLClaHifQYAmsHkglM6meV5JdZZyr0iCKwfQjUqvDktOPzxPt9hVfPWvUb7292u0llF/5BtdgsSuFSe5IlI0LUMjVbUVJFSa+mLKca9tqv7jHk8jhpvZDKfMPFLOjDdpt3eTtqYrO3bQWrXJpGp0sB9PLni18O8awiivlsTcVUj1tU3kO9RSf6N4TeNA1WjvN0kWBGWoC6kFMqj1xVeuOm9ka6Zs2R/BTQnW3+Mb4h/wDizvljtLShHZNuhWWUgMeku540oK0xiyZ6/wBlHSxcbJbW5K7fxjxVW1Xl1fbgZf6qzS9EZdwdIjU/w/HGa/Iuzfj4lF7R7t7TxOxCyW20osFAsAK6ipGevIVNQwJxQ73ZpVKV6DrHvW0WjxCLbYwi56qDpqD014ClMRdLW3J99V0B/wDexUoUto4hOxKu7AVoKCv8ML5A1lQcfKpptcaTRalFZAVORA5V/vwv6dIkssjhDu9ywrRSdNRG4NASa1qCRwwPGkSVgMsWz7soTc9ujULX/MKdObDPqX+/EV3LYjalbbogG++L3G0wrf7e33lghDshp3EK/SRThT1GNGPI3ozLfE1/LsQiHyee0uJO7M8hdWacBSCqKaqwbgTXjTGj5aZBZGh4m8zW7iX7eZXljRopG0mupa1Q0OfAZjEVggs+bK1KH8x8tJD3NlM/fid3mtw+lmAWgjUHTqHpnljXjoZsljLfkHnVzcwupNxBPCCscDIJCHFWlVXBoEfga5jljdSsGPI5CfCPJTYb3tW+Ry/bWT3cdru0gp3EjuCUJFWqAraciaDjQ4easohx7dtz6neC+SW1xZw2txOjCbU4kXoUjJg1a0zry5487yMOso9Bhu2hm9yPFLa4hkuFBe2u45GaKQqI3ZfyMeOanjXFvGzvZkORiW58/POvCJLe9v3FtHGssbaO30RRoD0qVNSxHCpI9cdvHkk4ebG6uUR3xLyxtuSz8X3G5kg2+dv/AInbo8gkcMa6Y2K55ngeWHfHOqI0u9mWuu4QwyksytGsxjRSxJD5BGAPqw+QrnijtZfOgT35FnvIlZBCsircALJK3bkc0L0OTgGmon+WJQIjW63qW7zqrrPZwMIwiEskihQocEURmJBqRlidURZDLm6aG2uLXqhkCs4jhAZJW1E0UvlqFAS1CBXFq1K5I5ud7oim+4jjuB2lP32qg/UAVUk001IKAaBnl1YkhNkA3G7aS3lVLjVFZKJYLcMsbEvkUIplkAQvLni9ODPfUK8M8ji8L8w2zetytrm42NSF8xt4mBll2qc6ZtMZIAkgoJUr/hpzOIchN0lDwOvdqfRHfPb7Z7W2bcdkmTcdqv4Qdp3MSxskttOiyQPqQ0OpTzqTjl4uQ3o9zpvCt0VBu3j21QXrian+pWyv2zp0OUBCFo9dFooNQCT8Male25RbFJV2/wDid9E4isb17qKAIbWzmeqqSBIp7YAH1HPOhNfwvpmXUothe6Kpn3Lc7a57UU00U0QldbEkBRKSVIIcDWsgIAUGuYNcbqpWMeSzoMU+8zXAsZwyW93BIhijBLdxhqYVQn8ochlLUaopi9UgyO0lw+Kzwb5td5sktz3o92hmtwuoRyoHiOhu31AsrZZ8PQ4z5aw5NWPJpDMdQ+N3Vl5JLsEymGfab2W37M4j/S0nXCzA8NSnMc/hjSrJ1lGS+5rTwjxK1iG3Xz7cLizkC/dB9EpearKWy4aaAilKADPGDNkiUasGNP3mF912S62+aZZlJLRKl0rqSwAoUJIFM2yGOK6Lod1XGuO0MTBmUKY2qsCurDWKBkJBqT8RkMSVSDuEJJcRsHRJZWmK9xbZw84ehKqA5pTKpOX9mJKom5JpsPlV5Z30zmT7cQmks0Op4ooG6eoJQglshTFyUlT0NAeKe7LztbxvPJBMsaubdlZwWAoZAQAakcB6YHjT0Iu7qXjsXme9eYybfsey3TPuF+wto5xIY1SIHRPcsWzUotaf24i8fYCvLhn0z9kNtNls6TxoY7a4gWLYGkZWkNvbvSQyUJzLdQqamtccXyNk3C+07HAqk2fNb93OxP4l74b7LCjx2++tB5BtwQagxmPblAHL9Rcx8RjueLy9+FT00ObzcXblbA+3e6wL5B4ndHtxW88TXSFk1lkHU5PSRSoqeZ4AYu5C+FwU4p7j69eJ2cJ2HbRFHE4aBGDKtCykCjVFCeA4548jns+9yemwqaHy4/entk1v7kePyO7JDc7dJolMgYIw7evSvPjnXPHqPEZU8R5/yaauY3s5XWfttCtzKtIoy6aVdNRdhERQ1pXMnHTtqYyTbXelou5b3qx3NqY42jdM6CuhVD0YHiHqacOWM1i2pOdt3ieOzWFxpUTrB9o40rEWOpy1CW6gK/8ADFdl1LEy1fFPNLrZd2TcYruW4NqCitHmrxqaFdNM6DIA5emM+TH3KGX0yRsfRHwDym133boZ7a4Vrae1Er27rQxuRmGpXl6HHE5GJ1Z0cOTuJ3u2wWu7WtGYLKoVra4pTQEB6TQ54z1ydpovj7irt58aMmuB7fTcGEljGlS1OMif4TQcjjVjyyY74Y3B+K+W3Wy3K+N+SSi52uUCLat2fUXWIjJJgakgk0B9MGTEn8Vdx0yRoyw7rwyxlSSa1hQ290rqIRkiLKKqQoqKHI54oXIa3NDxJqUVB5L7XQ3TaYbdZO/L3J3SGjBkShQE5EMeII5DG/FytCjJgW5m7yL26ksWjke1aF21xSulWQEVCkqD1aRSleBONVcqexhviKyu9ikjlcPCVcx6rgoTrCinUqqaqzcgDlXFsoh2wNjwtHEWJYtDEC8+lWaI5gIoUUyU09fXDkSWorglksZSYGEE7JGiJxgkp9Y4ZZHKnPjiDRJljbJ5PPYzdgzFYUTtxXCyZjUQQC/VUin5qfDFTomWUsaN8T85kjbtfdxyBMkuQGRiukBqKRSgrU1zJxky4jVjyGivG/JIL+MKsmbOQtWGvSAWB45DKufyxzcuKGbsdyeW1yJIo2qCDkKZ8+J9cZrVg01vItFOGIbEyO71scV8gliRBcIvQafURmuNGLK6syZ8PdsZ68q8evBez7jYxtDuIDLcWDNRZ1GShR/i48fljucbMtmcHl8d7rcr+13zfre0W4t2NyiP2pjCwS5ilp1KyZslDlwx0flY77nLXIvVwpkeLH3e3eyEUK3jGZf6kF8KDJgChdhpJqaV/hiq/iqW2Rbj8vko9WWHtnvTby64ruxEksUXccq3beopqqDVTnkNJzOMWTwrWtWdDF53pYsjb/O/G9zKx/6hGksgLdmUUNF4kMKg8ePLHOycHLj6G/H5LDl3aHqSz2fdIFJhiuI5F+tSD0HMVZa/hipZsuN7tFvyMOX0IzuHt7s92wmt6W0yau2oVSpLHOpAqQBwxsxeVyU0eply+HpeYcFfb17TLOrGezttwVNUYiVAAe4GH00JpUCuOng81G2hyOV4Cl9HWSkfI/YvZrr7mD7O4shNEWn7AKgMVL0pl9Vc+eQx2+N5uyjVHmOX9J47apQUpu/sddW8cU1gGcW1Qy6IwGGlVCtqIILch+JpjsYvMVe55vkfSl6zDKj3b278kshMIrdpreTUBNCAmqM6yYiubFQ2lM+efDHUxeQxW3OFyPDZsXRkEvdp3GA/r20iXsEnalvXADQGNiqhgtFXUo00/vxsplpbrocq2C9XqmNM22JErUQ2gQs1rdRxkNrElFkZ5FIKgAgBiaemG30RKjt1/ETOLyGSEBXsydT2MSl6pWoaQGrAswNOGdfhhqie4leNjsU5tpYY4P8AKyMWAYyHRCaFwooDmaVIIz4UxXkxprU0Y+RausjrZ71cKAYpo9UaF4KkdyKZhVgSCdRJGQ4H54y34lX0N+LnujHmDyhi9y0VwrywRD/T5rgAMO5qWdqV6QVXTnnx54yZOD6I6mHycbkhg8lTtukUbXMojZLdJYxXtNGf1naI1IqSFPpxz4Yb8RrodXD5FepIrfywCERpeSC2aTXI0rAPJINIIdUBBFa/V0jGa3FOpi5kkhtvLZFmRWvre1MkoZ2qZR1UCoFOkCOpzavoDmxAzZOPpsbsfMnqSS28nYxXAZ0SWQLridz2hT+pMGdV0LVqFmFPTiBjLbBBrx8hPqSi18iCIALnQZGBhXUI5kAIWXQrCjamzFTzFKmtM7xGuuZNbjgm9QLLFGHCkqxWKSSj10isNc+qmZqTnXPFXymXLKLLneNSXZULKhKnvLpZ2XqLBjWgyIBqP/TTCVCXzRFcb3FpCUTtAB52kWskurhpB01IFBllg+WSWT2jdJvrE/bmWGaZVSYxuxQvqUqsSUBqxArXj/hw1QjfJBGLzyaKaOZZjKlzbVEkYUs0LLRlIViCNQ5EE+oxfXEUPOiL7h5Lbd5XtZAinVbte8A9FpooNI1atTFgM+HLF1cDM9+QkV1vHlpW3ul1NRwFkLDKJEckMzKw1NU01IPwpx1VwehjycpFe715TcTFopLkLJ3xEsx0OkxVVCFBRgGBJop6eYzxpphObblRsyD7n5CJpGVbsmeeZVkcLoVEHCSMSDXrJ+OXyxrx4TFk5TIpe7xc9tmaVWMDEqUVBp7Zp3DGgqpBpVePP1xf8tJGX57bGe43CZgqRs4BHbgmYajKzlgEB/8AfamtAeXHPEq1RB3Ec8lw5SATujooS3iBasfSAT3Fpr1UJI9MWQVq8aiR5EkgJ0arh2WWGnSY0NS3Iam1GvywNQOXIGSSsYue4RKVi0SitACAGQxcMgM2wiS31OpH3xpWMTRGJZFQuutJoKghhwOpGNAfhhQSqwOho4rkJGI3nAW4uXj65K0LJHm1GjAoafVU1IrhwWLeQ0CGWCqprBX9KN5CgAIVYVckFS7HqNSCFU+lcEwJpz+32j1bbZud5T7UGSHQYWDERRlSyq0YZzpJSQUGZNBVcHeh9r6k72j2+3S73BGlab7i8k0iKO3WWSadASBpUNUMtNNNPrTLOq2etVqTx4bZNEjU3gH7YZLu5sLLyKOb7q+pLD4Jt3VdzMysHe6utCi1jA0gtWnHjjlczytaKenr0/idbheFtksurPpP7Z+xXjnhlpY3W4bVYfeWysbXarOJVtbVnbW2ptKm5cEV7jr8seL8h5i/IbVXC/b7j3njfC4uNFmtSyvKfNdl8YhkSaT7i/QHtbVBk5IoAGbguTZfCuMHH4l8z9hv5XOpgXtM3eS+V+U+XOI7yd9o20sXTZLCXUXjU11yvQEEE0oT+GO/x+Fjxb6s81yOflz7aIDYbHa2rxyR2xhaOTtP22UzqcjlVq8DwyFcsW3s3oU1rSu+rDb7dLS1tp5LpBZQKxM7z1Xt5glitRQADkTgx8e2RxVSyOfyGPCpbWhS+/8Avt4rYd2z2oPvlzAjgNFIY40UMCKkHgczxJ5Y7nF+ns19bfCjyfP+sMdHGPUqnffe/wAgmgiuF3Xa9miMfcjitlEt0IZMlqtWYHI5VrTHVx+DwY/5pZ5y/wBSczkW7a+oz7BufuR7o38ieIbXvPmcxftpeLqtrHtoSCs0r6VqOOZxHkZeHwq6wvzNPE4Xkua4Ux+3U1Z4T+0zyu9EV37g+XpsltMwebxzYI4nkKjPtyXkkfA89I/96x5Xm/VCemJfa/3Hs/HfQ+1uRafZrJqvxP2h9vPCVRvH/G4I7tUKNuNz/mbo1r/7aYuw/AjHmeR5PNnc2se34niONxklSpJdz2KK8haOh6kCuFIUUGfADFNMuptviUaFO7zs91YSSNQNGEIQACq50J6uJI+ON+PImjBkpDECXyLEwmjSMSaBJCa0X0NBUn4nE4HWAqe/hiM1tG5fSUUyEgElgQVU1Gnhw5YSTCzRCL3yEQuFACzRh4IrYEBXHHqWuVOdfnyGL60kpbIHN5VfNFKVLMYTSVWA7mpmKilfygGv4Yu7EVO7QotfKr6F40mBki1ao5w1AyN9ZJBINCQBXA8aJLKy9vDd8kvZFIc3BlH60ZJBGfSCOWWMWakG7Bedy5tx25JLZp4IgJ0BcMRxy4NSlcc+l33QbL1TQybLJ3ZJrIqdEsWo1oVR6moFfX4jF99NSjGu4zR7mbU217rfx29Y7YSVHbB+girIaflrzoM8dLjX7qpmPLjhlGbt5FPbQXWUhUFBDGCGk0kNWRVoAGatKVrT5Y1pFMwVJ5D5EdGZljWKZRBPLkKjOrAA8OIPGuLEiq0Monyd6l7mXQy3dvRLmFjUOjhhSpIYsozbKueNFTFe2ov8NuBJab3bPIYNwuALiK4jYMWVaEpoORAIzr8MWWWhVs0ze3sZ59ZbltFpeR3yTWk8EDxPGoaPVTSynjpZTkVag58McrkUTOxxsr6mxdvnF/YpZXFKFFRelXVlNSSzZ5AGmOVdRaUdKe5GffcLwa2uBdJfRwyrO7u01sTHO2mjLpkqGBFeX4Y6XGzGLLjnQwr5b4hdWN28Js7NLGCM1cM2oRgnSZJCqg9vVlnX1x1aXTOTmp2vQS+K+U3FlLZeNbiguCrt/pu4SZhTKppHOSCSSPpNcK9PQSsiXtezxRXumQm8mBaVEr3arVQ3PUStaGh4+uK0iatAwbhuckqTIs6C2sY+2tsgQRs2rtuFFOjSW0itRkTma4srBF2IbeXn9OQs1yIVcvGxkrEjMqaFrTpjpn60zxYQkZb0RSM1tGWuoIRqt4g2aCpJYNSgFf5/LDE2ROa+LNJNPIqtLIWjiTOQGhFC7EBEYA0ZjXnTEkVwQ/cJoLgICwmnnc9bs2gkFmKlSAzBwQn08icsW0ZTaU5Nd+wnvGLj2/m9st3leLc/BIp7rxS8P9ObYmkq0FVGcu3yk8ant452biNZJWzNleVFBXuPlLtGs6UvES4Kzs0jxyKr9TByc9NOA40GNSxSQ+fJGIPJIZb4RpL3JJZPtleRiqvAelNAIpSgpQ04VwvkwWLKiDeRvYblbyxXVuZ5YpmNpdKmiXUpINdIKtpJ5kGnPGnF8JlzQxR4d7J+W+YRff8AikMG82F0zxvcwyxrJCtdOi5iVtQY11Lq5Z5jPDyc2tFFiivEtkehcXjfsD7mbXNBKdrmnue/3VQ6TJHKOpyGBFAQTQZ0PrjJfyOK3U118dkS2HjeP2n+Wb55jY+V7fH/AKcl/bJHvsNzp65UP6clCKEkVHD58cU/8pjSaLF4vIy89o/b3u9n9tHPJHbSIQss0TmmhTkAqUABPqOfDGC/kKs2U8bdIwP517ZwSyXP21uba8KFFCr0OCg0VGdc/wCGLcbC9TLW9+JT7S0zdnXGpAae2VhpIANApByFRzGLoKm4K4uzLE0oMbR28qL3xK1FTVlqIzOscRTL+zAkLuEq6USW6Ld2O4l7DqtftgFoBNIUK1zaoA54sUkGyVbJPez3clurC7WKNUEiBiWBPQY1HF2NMxxricxqQk+iHsz4Eu0mwt95jhi37f4ozvF5GGY2aSUFpYxCMHQZHC91iKEk588UZLOGy6lJaR9VfCLcZTPDHZzw2sdtewxZQG6YDUIUHJQo6h8Mee5DO/hUIxb++DZLbdIPDvOLRdc+xXcuzbpK/wBCRTODEzFcx+otBx4g46fibOs0Od5Jd0WMZe2m6JHcbWbi37MmxXiJLLCxbTbs9Ejk08RWo08sdfJMHOUJn2n9st1W68fs0cs8qQVAkZWcpqKgVBzpShx5Tm0i8npONaamav3qe2t95X4bt/kW1WjXt747qPbRauIpEAkY1yIAXLPHR8PyFWzq9JMPksCaVj5PzbZ25oFHct5dvLK6tKV7WkDUySOtSQCaimYqfSvpXY4kTsLLYSRyxXbM+q3JNzKqalMMgovS3SA2mjV+ByxTZ+hJStx/sLiWCUzMxQfcs0ZaQ/qKiisainUFBAqPliEEyW7XeyL2oou2VNwbqZ9ZZbZpTpCup0lmUDMDL4VxXZE05NMe0fuJLtO5Db5HCWpPREGPblbiwzrSoPAU+eMPIwqyNnHu0z6CeOeS2u4wLNCy9s1dYWFCqACp014E5A1OeOJlxOrOrS8ok81vHdwtSMuyho1eoB0uKfP5YrVmiXamVR5R4kFVZEEjgM8TUzZVNCSQMmqTlQ42Ysy2MmbEC8N8jvfGpE2ffJZZNrDGK0vpFJeGRQNKNWtVocvTEM+NW1qSw37dGXi1tbXCSdAaN2DkVqCCPgc64wdzqbVVWIbvvgthuUQjjgh1GQya2FNOXIAUpyzxpw8hrcqvgTRmHzH22IjlFtbrHPcSs0ckR0sqg9Sjgc/4DHTpnT6nPyYWmUBufjl5Yzy3QVjHfakEBQiSoXobSBTgCRnjQryZHQh72syNEnddWuB29RTuCGOPhWpqrE1BFaccWNigHaKiqIljExdAbqZX7aAEikjLQ0zzwxbE42HdLu2msojNJoUySPBmIwBWoU14Fan4nhniq9JLavqX74h5av8Alasqxdl1hjdSJXNcyqmvPPlmMY8uI1UuaW8c8gjuoo0110dvucQ7agSvTnljm5cZux3LFhnEgaj5qcz6GuYxlag1KwsBBOXLif8AyxElAw7vsltuqEvWKYBtM6ijZ8q4vxZnUy5sCv7yg/JvA5oZmu7aY2W6k9tby3GpLgkVAl1Uox/xY7fG5i67HA5fAcytymvINyW0uXtN321I/tgHvLeRBcOFBAqARUgnOgNcd/jYe9TWx5rlZ/lvtvXUhV7vHjUiSIgEf2p1RQiXQDQ0Uq7U7dGH0k/HHQx8XNOxzHzcKe8CCLySyintzZeTL9xMwt7dL0sjBaVIrUaSq/SDlmCc8SvxckfFUK87H0sWFtPmnku3XDpAGuraV+33bOX/ADEKlSdcuZU1z6gtDjm5+DitutTpYufamqsWdtXvgkayJeSBmTti3a7QxmWoJ1rprXIGtafLHKy+ET/lOzg85eujLL233U2G6WJ7mVrfuRpLpH6irVs2dlOSj1xzcvicldtTq4fNY76MnVvumzbpHpingu4pK9LEHUDlUauRrjHbFlx9Gb68jDk2gRXniew3xetsIHNOpDQGnDKvw4cMWY+blp1I5OFjybED3j2uhuxKsbreoxHZjk6SlMszTP8A8emOhg8q6vXQ5nI8Kr7FOb97RI7mSbbHjSWLQF7SysrR5grrrUniS4J+XPs4PLqNGeb5n05Wz2RS+8+y9vI8dz2ZJLpncyLMwWJmdSHJfUTUVBLUypwx2MHmY0R5rmfTSacFMb97UbttiPJbxSXZslZe02ldQUEqQaqxJ1AAiox2MHkqX6nmeV4PLR6IqrctgvLBnimtjDDqV5J3eQSLOyAKdYyLKrllY0HL59KmWtlMnIycfJj1aI9d2LxyMkLyK0VB9yM3WSI0URIK0rqU1VjzIyxPTchWVuNc9uFZVJDRO3aeAt3pLZAxoWZFXUeNaVr6YJbL1bt/bc5bX08cqzrPNWQNDNG4QoVq2nhT8uYI5+uIPEmoZbTk2ox4tt6lilV7iFp4II1RLhwHotFU0TmaAha+mWM2Th1fU6OLyLgdrTfVJjhlk0GyjijjjnBWaZHZiK0OTZKKGgGMl+E0dDH5NMe7beWCC4CrMBam4e2001BZCCkYH1OrfQpzB6sYcmCNGdXBze7qSCHyJreWeGRppAlbmSOSkkselCgd3WhkKL0nOtCaDmcluPJ0cfMJGnlURB7ms2Ft/mTKy1cErq7qUZQys2lFQDUKZilK5nxmjfXlJhsXlMzmG0lljkdFZ0spHaOd1ZsxIigAUBrz+dajEHhLVyBSfJGLr2zJe/bsOwB22M7gaWCtUIKAZGorniHySxckYrnyFIYilpcLIqhks9JLqgqxJEjqHD0YcB6emLKYfUjfkohd/wCSt2VcTtdLOrokyNWSootWryoKl2BzxpphgwZeVGpB9z8hjKaZj2II4WZJmbuNExppkqKBh/y/8caq4DBflEN3LfA7rrkKMrwyhoXOikalZHZGppFGHDGiuAx35JFLm7lkSJZUEokrbfb6qIoYAhkFDw4jM0OWLq40ZbZm2NVxMy0iJlAGrtzjR23RDpEyISSpJFMS0KtxITKkksio8M8bqrg6CC8kbB9Ryaj04t8cDHUTSR1/TDCKkLNM8uaq1CEjQ0LFjpCjP+/BBOQZrCPuWSaJZlEkyUAKvQ0hBahGs55cBgIAo4XfQ4Z1ktSyguulI43OrU1c6qx4mvHlhjR3s9qbWUUyIojZFJ7YMhIKs2ZNK1FKnL4YbRKqkVwbbebgYVtIJJppZO2skS6kYxkqSJOCgITU8QPjiq2RVRqx4tSYbN4JPuAgngihWUkpbtHO4RwiV7EbFCToy1SMKZ/HGa3INq4ttmWftntvb2FkLmVVNvpMEpkfvoZC4Zpyqx6F+qg1kcK5cqHyak1xddVLLw8b9rb/AHFYry7A2fZXkZbDctxIE5mUaq2ltpZ5aqa6tFP8PDGbJyklp/Evpx0jZPtr7G3CxWl5bWkvjdk66LnfdyRZN8uVVwzNHH9NuOkKJHJbT+Xnjz3N8vWrarr7On2v9Eel4HgrZErW+Ffiat2XYPGfCNqlTbbaLbbSuu6vJH7k0hrXXNM5LyHPmcvljzl8uTkWh/d0PWY8GLjV00K28i9xn3Ctl4/cR2Nt1A37grNKUYpJHGq5ggjgCDjq8XxkRa5xub5Rua0KpisGuO3IYprm7R6yCcGWWQyqSAA0lKUFanP546vcqaLRHHbdnNnIl3Ledo2dZjfSw2G3wv1Jc0StRnSg1NmM86U+GLMOC+Z/CtTFy+fi46+JmePL/fvbNree32CNt4uKNBHcuyrGjsdORyaqEAgVofWmPRcPwFr65HB43n/VE/DjRlzyPzbyfyqdLjd7uURvRUhQnsac1ZgjHqPrnxx6bFwsPFroeQzc3PybOW37Cwvb79vvu37oG3udl8fl2zaHoq+Qb0slnaqnMKgrLKCP8Ip8czjj8/6k43FUd3c/RHc8R9Kc3nOex1r6taG8vbT9k3t74q1tufmVzN5vvCUke0esG3JJWp0wqauBy1sceE8j9V58zax/CvxPpfifojj8ZJ5fjsvsRsTbNr2zZrSKw2iwg2yyhULDa2kaxIKCgyWg4Y8tlz3yObOWe2w4KYq9tFC9ELa551HyH8sVQ2Wo4DzHHmKcMOCSOlRSlMj64kiUSMm57TFfIFkyFNJIXPPMHFmPI0VXxSUx5D4zNbSvLaiQs5ClQwFQMtJpwyzx0MeWTHkw9pTm8S3KR3Cykqkj/oNpqyvqI1BDQmgzz/DGupisnJBLpp5rxYpUWWcRq0KSnpYLUGi8qDnWuLp0IA7S31PJGNH2xo0s6jUQZDRRpI+kHMj+OBslWo/2+yW9CdMfZegFGQ61CjUwTSMhwI9M+OK7XJLGXL4TYiG5tpNDxSMKsUbo7aHSFWvwGWMue8o24KQi+rm7SCw1mSnRQHL/AAmmf8sc7HWbGy9oqR/xWzdI572QOqyUSNGIIyNSQfT0xdnvsirDUoD3kubea6vWWeCsS9EzSMrsWWgWMKKM1eA/jjo8TSqM+Z6mRN+0XMLrEywrJChu1dgrF0JCMTQGqE1ahqMb0YblCeQ3063F2qy1WWlvc3CgMGeOupv1Ap6TmKceXHF9FJnsVdf3rTUuI5Gns5keEi3j00VOrUVJprNc/XGmq6GW+o4+OyXMF0YJJALYsI2lBXR22Gkq7AVWoOWdM/XFllKKquGWt7Z+I+QeyJ3HyTxXd7ryz2zuriS+8w8TkUybl47ArGL7yDQSLi3q36gXqUUNOeObloq+5nSpkTSPo74h5xZbpZ7bum33SSi9igFu9sS0UiuiuCrLUaW1UFeeXHHPy4p9x0cN017S4Lq2s/JNtj0qhuEYSRQyKFdTSjADOhOWeMqu8bL2pRk/3J8MjSa6jaAz2gjaWfbJn0I9H6wjEmlTXgD6AZ46vHy9xz82P1MXeXbHBYtdvLZw27yaSkFWL/btmnXGwUyClQDnyx0q2k5t8fa9BDtO9H7O32OYiXde49um56nYSQE9bhzShH0mv4YLVICqR5YyArA2t5IPt0YqqNAitSVgxqAKhtPEnPngAjt7cTW7wAJM7xq5thKoKNC2mrTOpyTiQTw9MxiSFA33LRyXbCKX7i7BWQHMAI3SNYU1yPImtMPYjJGJGkuUK0EQQj7q6qoB0qOuI0I0ggcOGHINEVv2aeX7qGJnljUuijUqSJ3M3JY9ILMeVa/DE66FVkNdlvG6bPusW8bLNL/re13JmtpVKhEKqO5bzMvTpmWqFcWP4kVqsGpV29d62vYfItllkvPH/I4hc2NyNQKXCFkvbGbX1iWBgQykAUIOYOKq5UvhJ2pGxCbiwdAILgMlms84RgSTC1C8Y6RUqpFSOYPHji3uIqrA3aTSg3Slv0Yq7hbM7qquVCrRac/UVwpRKOg5eAeeeWe1nlo8g8cltLctEg3jZWLm13CAZ/azovBxWiSrUoTllUYz8njrNXUswZ3jsj65e13ut4r7p+MW+/ePl4pYlWPc/H7khbvbrjTnFcR5Zf4XHS4zXHleRx747Qz03H5FcldCbz+Qxo4LJpiQjUgIalf/AB64gsUl9rJEZfyxDNDG7FoQpkSq1Gdc6Vr8q4tWCSm2eND58y7hYX4mdpBMqFXSWioZBUdFDU0rxoOWOrVQc7uTRXHknilnuCXgVUklRZLaaR2UBFlHEBeI58K5YsVim9EZd8s9tZrSOUwLUIC6dwUEYGYDSVGTD6cqV4YvTM9kUhuGyzxXkiXMbrO4BR2aidQDVEajqU0FafA4miKZo32Z8OijS1813SCFxA+jxXvBe2s4oH3DiKRx8EH+OlcK1pJVpGpvj2v7H38Lyr3obd2N+R1JcTyOml5RCS6hC2pSvrqbLGbkfymnjptm5rK5OwbHGsk0T3YQia/FCSZSWUn6dQAIzHGnLHDde+x1+6KmZ/dWL/ubwzy/aJUc/e2y39jpUs8s0TijKKHppWoOR546XGXZZMw8n4qtHy92PcG2/wAijmNzahLmSKKUsgQNI+odtNIqG1Kc+A/njsW1Ry+p9aPYzzFbvaLGeS6RLlIB9xDKWLFpG+k9vLIqaH+IGODzMWrO7xcnwo1ruG27f5Hs13tt7Al3YblbvFNE+YIkBUkUPxPxxya2eO0rc3WorqGfN33m/bqbG+u73bhBMYuoRMsjdIUBAKg1OdM69INcek4nNlHDy8J43K2Mdbl4Ve7PcSWF/avFIHDR2Nw39fTIzHuu9ImFTUA+oWuWOhXKrGR1Y12+3N3QVeUx3C91jcKIVWdD9La6FUOk/RUEU58BscDtbLOD3HrGpdZHnfMrOz1UGMZKCG6QcyBU4jZoETDb7h4ZzJI1Ly7/AK0cTKTG4JOpmz0jQOB/him2xbVwal8A9xbi2jsrK+uW7DIXthInVQUDVU0zblX/AM8YcmKTXiyQaz8d82hudAlcQwSxBoGdlkkUAZV0n6uAqTTPHOyYYNlchP03KK7iRjINRqKAihqtV4fVjOqurL200RLc9utblUikcu/b13MMahwgFaceBBJyxdXJqUWoKfDvJbjbpx4/u0qm2en+k3dQaiQg6G+XAYhmw92qJ4skaMtsNG+rqPWKEDMAjKuMWxsUNDTuO0Q30Uq6VEskfZLlQWpUgjFuPJ2srtjTKJ8u9v1mDiIkTvF/lgiaTWtCGrlQnjnjoYs5gy4PQzZ5V4RcWr6pYGj0dyG5SLOFVrwaUUoTTkOON1MiZktiZVdxt9xbXMCIq/c2wkjmAUJby6l6gx6l1AZCoPDP4XrUqaPRi3WBO6okVX0tLCTk4aqlwCpI1HSpHzwPUlXTcnW17hLCVjSJJFUM0haRiV4dxUC0BZKkaflnim1ZJq8F8eJeRm3aCGSTOSRNDSGtWapUM2RXI54y5MZopdmoth3IXUY0trWMpqlJJBqorQEcT8MscrLWDfitJK2JVa8KCufP0xn3NQja7Cqz5aBRT1fSfTE1Urdhr3AW9zFJFOiyQSAK6sKlhi+jdSm6VitPIvBNo3+2ltbqN0FwvTLHKyuvKgFTSlBjq8XyF8NpRx+X43HyE+5amOfcz2Y8p2yFtyht133bmVjczW0INxGK1QTR0BfTxoeePaeM83iv8L0Z4Dy/07mwzbGpRjXyHa972ie+Y6ru3tpe0b7tmJ43iUUV+2TpPEFXAx7Lj5aZIeh4PkY82K2sp+hFrLyvetqVJbDeruwijcMk0UxBjAGkkkBhQgjTp9OGL3xMV1Dqp9xZXl5aPcsLZ/fPzWxkeK8nst1RI1jjjuYQpKaaAAoRwGVDnXPHOzfT+C+0o3Y/NZaJP9Syti97tinkjF9sVzs8rMY4720k+4iZ3UULICHCqtTRRWteGObn+n8q/k1R0sH1BV/zlz+Pe4VtuLV2HySHdNatMUkkMVxlIVjCpUNq0asiKmgxxOR461NL1g7eDytba1sy4Nr95N62qQf6p3rUxw65IL1C4bUHYGoqwppNKfDHGzeJpk2R2uP5rJTZyW9s3u3tN6LYXGnvXMYcdhg6qGFQCv1jIVNRjk5vEZK7Hc4/nq2XxFjbd5BtG7IEhuYZDmTCxGpaeoPHHOvx8mPdHUx8vDmW4K88d2K/TVLZRI2eh1VRQkUrQilcsFOVkpsyVuLiyEL3f2x2+8Vzazt1gg6wNXUwagkWpXhyxvw+WtXdHPz+Ho9ipvIvZ+S4WWO5sorm2mftyHSZFIAqF1AhwCVqc/njscfzOspuTzvL+n9P5V9xQu/ezO33MGo2rRTXAAe2jch2Zq6mTUemldWpdL8fjjuYPLWT30/b9vQ8xyPpqurSgprefZ3erOR2tZHummeRJGV5AyVc0dUTU6LkFAaufPnjr4fLVvued5fgMlNUv2/b2lLbl4ruFkotLu1uomFIg6wsEISpVSjDq5Etx9cdOmattU0cPLx743qiNmx+6n1dyCN5ETSWjYBG09ROoq1QBShOeLdtiDt2qHImYS0WcHptwyATMFLKkgB1HVUk8C1eFQMR9jHXIk9Ak3LxxwCOQJxkSAsaJMSMyKEKOYHHOtcVWpW26Ohhz2ptsOj7jOrNFoZoVaQq0Y1IZYhqZi5DVVfU/hjLfjJ6m3Hzmuobb7+gBuo7pYpp0PdkSoqVyJpX89PqFMwfQYzW4j2g6OLyOkCg+QwtEkYn1RQk9uSMmVggHQYWPGOgzJzrXFL4rRqXkJftOXW+adaUk7UiEXVDk40VrHl1UpzpmMQfFZdXn+0ZL7yZpZPt5Z4aNDGkbQJ3I/uY4kdCiqKNqQgmv5qg0GDHxWivJzCKXe9yyk3JlDSvIsyS1C6BShik0DPPqC8BUY01wNGa/IkZp553kCtKRLMxhuIparIsiE0ZOQQVAz4fyxaqIzPK2NguNUlwRIh7iGILNGoC6K6svysCCAPzA/HEogTkI7ep3mt0PT0NC41AK+SkUAZ6yV+kZczhDZ1YDIsccYRrSFtLoxMRWShcxGZhmVoXP8sNgnB17a5kS3RUjEE5ZXDgxCcKWJmkqa1XgudM8ueE0STg59ks2oHvxxSIpjdjVO8o6WLqSCxNcwMh68cR2JpBq7esgRZZIe7ePp/Uk1usldGtHWqlytDp9cqcMJuCSq30JHZ+H7nuT26pttyNchtLe6njbtSGQHrkLrk1VNVAoNPDFL5FV1NGPjXa0LJ2X2b3O6E73jI7M8TdqaOSCJyxrrU1BBOqmkZ8ssZsvL9DoYeA92i5tp9rtu2iKC8dI7JDriiuX/RiJ+mUdnUp+ojgvVTlxxitmtY2LFShMdu2NZro2e07dJdpbDR/rEriKGPSNQk0jocMerJuNRqBxC1HGuw3yUlBengXs7vG+zG5t7JHDsoO+3CNHawaWBkEEB1LKTxGpSwpUNjncvn4uOt9Tbw+ByOW/hULrJr3xD208e8Vlj3Rlbd/IO2IZd9vzrkDMalYuOgE1oBU/HHmOX5HJnlLSvoj2nC8TiwJN629pK998i2/YYopr1n1T9NtawlXklzpWlQaDmRwGM3H418ziqNXJ5lOPXV9Cgd/8n3LyG6eO7ktUjALWliZg1uQWeM6gCHDCnGmXPHpONwqYFpv+J5DmeSvn9xAN78t2LYIXu923OOe5VO2Y3kth3JUjBLiHXrFABx4c646WHiZczhKF9pwOV5fDx0/in2GdfKvf6S6DJ4/aaHciD/UrmNO8TSor0jSKVHy6ceh4v08k5yfceS5v1TkunXHp7imra09yfdXcDFt+1bp5Xd3DMDHZRN2YkIp1NVYguWRJGOpfPw+BSbRU49MPP8AI5IonZmlPCf2P+YbyYLzzryK38bsZBrl2u2jW7vl1flE1e3GV4ZaseY5/wBaY6TXCu727I9l4v8A/Xue8WztV9m7NmeAftu9pvbsxXW2eNxblu0ahRvO60uZ8s+lW6Fzz6VGePHc/wCouVytHaF6LQ+geO+leFw9VRWfqy+owqgKqgKBRQMgB8BjhOzsekrRV0QMn+fCmIQSAk0yxJIcATxrXhww0hpHgf8AywySR2in1qeeGSPMBQjP5YQxn3Hb4riEqUppBYUzJxZS8FWSslMeTeJpWSVECOpUhI6ltLVDMVNcvljfjzSYcmApDctknsSirEw0BxAGqCSWyqctNK5HGyt0zJfHBHFV4xND2h3tRRJgdUOtD1gE1qBzNOOLJkgh/wBqkJDLOVK3LfbaRXSxH1NlwGYFAMsV3LqMvfxbTbQDvmMiICMMCOI4hSeQxkyKdDXW3ah9tp38iniht3KQwvUuaEUGZBpXEGlRSSU3Y/8AkG7w7NthjUBFVCsWS0WP8xJ/vxRjr32lltn2oyP5nfyXs7s0PdjIpG9BM4qQVdQgbRSlCeHpjs41COfktqZo354VgkmupHURxtCllHrkZyc2bRWoPUCR+J+GmpmZm3yG5Je4trqSRHSaMXBWNSG0gqtK5A1NekcKc8aaIz5CFT3LyNc0cyw0bsRyKpBMVC5dkqFZaVoRjSjG9z1lIndRILkr9wwuVjBHakVwSkYFNRyFTXgeGJsjEampPajzltpureASMkncaGWENJWh0sSQCNQagUqa/jjHnpoacFtS/p/Dtx8NuJvN/be1e58T3KKbcPOPAbVXUbc0mgvf7Og/9nXOSAnKhdBxGOd3KujN8NaovT2x89i3OG2ZLqKS1SKsEqajHJEVq1Dx6SRxxnz4uqNOLJ6lkeYeP2++bc09op1y6AskaoHRSNQYiSnA51xVhyurhl2Wsowx5z4wvVY3EX3EXUYkEQ/QZjXqGpTU1rUjI1x2sWQ5OXHqZc8isZtuupopTNYPbUEk2hTDD9uQ+pXUZl9IqwAHHGtOTM6wD27dTvfee5jrd2mq3uhcSUjSLR0zEgAanLVyOQ014ZqIEJ9wEjxwXFzG0cpZY1fSImZNQ0AipHbU6tOWdNRyAxNFcEdnjeLVbx28UywyqbCeORkTU0Y1LKVzGsfmORwC6kfvbaREt0hAi28xliZCdGhiCQCfoFaECuf4HA2DQw3iLHPdapKWJhKUkqQYx/T0AEmpIqeQ/EYkmQdWRyUTItza3UUweMoZWeTtwxxgk6UjWpLgVFQK16ueLUyFogu32D8+2zxbe7zw/wAsujL7d+cXMMF9cyEP/pu7UC2m4B6AKJa6Jq+tTwOMvJxyu6u5bht0Zqzyz2uvNiuZrC5tD026oWhaQ0NdMM6tQofprU8uHpivDyVZF9sEaoqSbxa8hjiEshnmLMksUwoWCZMEfJvyjTXPTmeFcX/MRntQhMnjcvZuTbgKtz3O7Aq1kVo1rJFUHSiiooRxrQc8SVyt1O+M7/5L7f7zt3knhF9Ns+425kRLx4VeO6hBAa3vo2IDwmldJNaZqwNMU58NctYZdiyvGz6HeBe6u1+62wT3lrCu1+R7Voj8l8Z195rGTRRZoGqvct5qExsc/wArZjPjXwPG4ex1cWdZEC3DcHiddCyW9sigOjKDGwdao2VSteP44uolAXTPmEd13vxxJYpo2ljmCgCWh6VAA6q0GY58TkMbVVMwKzHO19y5pSr3MfU9FVWACd2I0A1EkheNSeOeD5S6FquODeTWl93UuCj6mX709FI36hRD1DTkKZccLtaI7iFfDLLybcksIDJa1Jne7EkTvFZ8X0kUzYdNB/bh93Qi8ckm8w808T9qtst988gnTaNojBt9j26OFXl7YHVBFABVmNavyAPUfWzFhtmcVUmjBxMme0Y1MfgN3tN+8v2itt1CXe2+Si3uJFnN0ltEEcRFFjkdPuOQWhA9OGNGXxGe9ZTX7fYeh4f03ybLuTr97/cfQKz97/EvcDx//VfC96i3Wy+5aOWFdRlt5dIYrLGQGTSGGdPjQjPHEfBvhtF1DMnOwZONfsyKH+2wLbZ1lt545BLCtyktvcmJ+5KTMvFGGYr8Blyw3XUwtSj5h+ewWPi97ust5KLHb9imuo1kuZNMYVHdxIzV1IUDemfPHVxuUjn9j7oW4u9pP3we2Hh9wu3um9btZ2+gwz2lqoPdBzEfckVmOZ+pRUYLeMychTVo9J47xGfMtHVe9n139gP3J+3PvEHsfGdzkj3OOHv/AOiXkXYuSjMS7oNTJIFy1aGqOJAGPP8AkfGZeNrZaevQ6fI8ZyOJVPItPVao0ju+02+7WjrIFZytYwfpYDljmYsrozDkp3IzR5p7ObbetWLbo+vWFtoQHT6iy1SgoNXpxx1cXK9py83EfQyB5R7I3O21kji0v3zWcMOyCXNVZWBKUJ9aY6FM6MTxWRWE/jm5xh1ntXgeHUlqmgBEZAAWEi10GQUoNJYgccW/NRDsg5HZSTJFcfbyzzkRm5JTJpEBrKrONTEBf48qYGxwSLa4Li1lWca5irmSVCW1PIaAMsdCQaMa+noMQsW1RePi++yon3UEx6VEMNFIDCmcZyzNc8sZMlZZpoy8dm8smCwJKVWNhH3lU6isseRFdIArzxlvjLq3aJpBva3FApj/AE5AXkB0hkLZroJzAy4HFLpBarCDcTFcqwVhGFlLM9dAjeh00JGZ+AxaiFl6FkeJ+TPd267ddSKt5toozZ0kArQg5VOMubCt0X4shPIr1JY4pRlGF7pYHpBp/LjXGR1g0d0iPdpdut9vvL/criGy26wie5u7qZlWJIlGpnZmNABTMk4nSW4W5KtHdpJS2YW8x/c77M2t3Lb2EG8b2iyF33Gzs1SFimRZe9IpcZkiqimPQ4PGZ7LWF9p07fS3LvWX2r2N6ld+J+b+3HupdSbZ41dXFrviLJPDtG6wC0uOyKlzE1XSQZknS2rPgBi/PxcuBd1lp6rU4nkPCcniLuupr6rVfwH648QmtSDBFJHJJpmtW0qEjEYowB+NOWMyujjvHG4xR7PMkhpEYTJMskALuQ5ZvpLjLjx5euJ90gkS3a7ibblCSsi3EspWgGtP0yAGOkZFRwBxU1JNM0X4l5lY7TZ3O47tertW37fFLPuF1MwSBAoJZ5Xdvp9Bka8MY82B30SlmzjO17KtVLeyI7efvR9nYJnhtId93WNCaXsFkqRNyqollVyPmowl4XkdYX2nsMf03yr1l9q9jZKfB/fv289zbufb/F9zkj3uGN55dk3GH7e4eOMdTRiro4WuYVq/CmFm4GXApstPVHK8h4nkcNd2RfD6rVfwJtdb2AseuR7YrIQdQqA5OZoM+GKq0RxbXKj9w/f/AMA9sY7eXzHdXgv70BrbYLeHvXcsaMR3BHqAC1qNTEA8q43cbgZc/wDItPU2cHgZ+Y2sa0XV6IqKy/fH7OXUqrcWe/2UcklBO9jEzKGqoJVZySPiAflja/B8happ/b/A6tvpnlJb1f2/wLRuPCfav3v2H/uvxm4tpf8AUw8ce/7dGqsHQASQ3ETEHUDk6svD51xZxvK8ngX7bdOjPC+Y+l8eSzpkr23/AG1Mp+4H7Vd+2c3l7t+3JuVmbcr99tECq8jLq1arQh0LNx6Soyx7HgfVGLLCs4ftPnfkvpLPh1xptfeZW3bwDyDbLkw2sElyIZH/AENJhlFKlx2nbk1V1Kxzrlj1mHnUyKU9/tPIZuJkxNq6aIbLDc2T3EcyPYXKMp1saMrlSAaEFgcau+r2M0vqhbHeXel1iYiaLXJ34gTUMq1DNG2Zpzplgfa90oIruprLJpsvuX5bsot4LPdGvLYyKs23bin3UFVUpGjKxJ0oKmlRnjn8jxPHy9IfsN2HyObGtWWntHvTtEy6N72GXar1tHe3DaJtQWEIsRbsSU0mlTpD8ccnL4HIv5LJr2nXxebSfxJlx+O+5e3bjIB495VDezzyAfbX5FvclGOlNdaCppkoJAxxeR4u9F8dDtcfzFLbWgunZvdvyDZ2RbyOeKGQGG3cDuQs6HSz11V05VBB5jHEz+Kx26Qzu8fy+Su1pLd2H3s269XTeLFcSiRYlktn0nURxKNStTwofTHHz+Estanc4/1F/fRbm3eVbDuZZba+iLoW1xyGjAgkEENTgR645OTjZcb1R3cPkcGZaMXXe27ZuQkE8Ks0g6pOB6hkK0ocv/LEK5r02ZbfjYsq6Mhu6e3G13/3EqvRp6kJJ1IKqABTLkPWueNuLyd6Qc3P4al1oVR5H7MtfIyPaQX1m+sujfqli4YVowDZemok8Pjjr8bzSr1hnC5X04rLaTH3u/4z7U+3EYl8v3N9inkRni2NVM81zrKlK2y1YA0KgkqijnXHpeB5HPyP5Ift/icR/Q2TlP8AyaP3zFV9ux8/fM/eTZdsu3j8V8O3beLZaPb3U7wWjyMuaOIleTTQGhCv8c8ep49bXXxtSVf/APL+UtXkqvdL/cQy19+vF3ee237x7fPG57lV7l2yLcxgE1YPoJNDSlQKkcqY1PjWeyTRzeR9B87BrS1bezWr/FFx7RHB5HtablsFx/qe2XXQ242IV4+lAwjbR1IyEkEFcszSta4sllR9ttH6M8xm4nIwXdMlGmujX6/xHH7a+ZkaWP7iS4jERmVUo8q5rJHqVXUCgJIGfxriHweonVroN9zZsytE9vNArRqxWVzL1AnW87RhCAWJZBp5UFcjiOkl8whmns7j7eto8gkdBLPayFI17y162CuQwAP0tQ5U+cHWWW1u1uIpLG81tbpG00BMTCFm1oRHmxkKFADyKgc6YiqxvBNZFu5CZNtvS0k3YjhaQ/o9xBRpBmQoVjoQqQQ8meR/NhzKHNegUu2SPE1uNUf6WgiJlYDUo601Kf0wxUmpqa5Yg0x92uwqXabiWTt9l+woSrW6dKNpokgXhoy6qkFuQGeFMDTTDRss0bKsumOWBj9umgt0u4KmNIyQhYkElTn8s8R7kS1ey0Fv/ad+kUs1xtrWkSq1Lq4bt2xaAhmlllkKKigjLVy54h8+pox8S92lVSyttw9xPbjZ2MY8oO4TTTLG1ntNvLuMhdNRbVOTHbOGalAkhBBri1Ys19q/fp/E9JxPpDnZ1PZHvcfgTzwLzL2j8v3O02i4v9y2KS4uEWxu90t0t7SKR3XTCskLyKNRoEZvXjWmMufBnonaJ9zOy/ojmYa9zStHo9fuNy7V7LWtvI5baY1kjAnks47VJV7xJJmLMauTpNDxHE5EDHFtzH6mKvja13Jj/wBteK+Noj3b20v2mlrOCMh7l2bUXZqitW7hCk51XnliNXkyPRMjfLiwCQ7vK062ew7UYlhdy8d1Gks+uYgFlyURlQeLZenHGmvFjW7Ofl8j3uKbDxsPgm4b3uC2zxSb5uYH6NtHqd0FCFaR8uBGfWKDlivPycWCvpHqRwcfNyHCTfuNc+GeyljtqwXnlDR7jcxqGg2WBQtnEe2FIKjJqGp5Z88eR5vmrZH2029T2vjvp2lUrZdX6F5KsFrDHCqJbQRppjt41oqqONABko+A/HHFc2cvVnp0q41CUIpX3U98/DPbDY9y3Hed5gslsC0b3WossDsB2tCBWMzscgqgmvHLPHW8d4fLyrqEc3PzrXt8rCu6z/D2nzs8g/fz7OWl3c3m8jyKe/Zhci6SFYmVSwjbsW8jtr7pyUVNBmRXHtsH01yIVaQl+3U5HL8TybfFktV+yWyld7/3GPEN6nh27wzxjymS+do6sLaGaZpVlb/2Mbkyagw/qMc8qcMdTF9NrD8WW1X9v7QcDk+D8jyfhx9qXTf9wn2Ty2DzW8F95JZbr4xtk1NVxuNrBPeOo+nTbwzKinL/ABDFubyOPjVdcSTt7/1I8T/9SeW5r7stq1XtbX3KJNP+Db7+1HYJLKTyHavK/Mb1a9y/3a1gNspJrU2kMwVhX/FqNMeX5vkfJZ57bVr7t/vg9rwP/wBOY+NWb9t7e1uPuPpV7fb54N5H41Z7n7ey2Mnj0lYoUsYlt1hdPqiki0qUda0II/ljxPLeZXayzPtOm/ErgW+U6KrXSCbhgRlQDlw/hjJqxxAMH+XMkYUCg7U551PImmCBweBrggcHRxp6YBwCqAOOXOuAkdr6AV5nDHB7PKmVMAoC5p4raKae4lSC2t0aSeaRgqIiDUzMxNAABUk4aUjSbcIy5vv7wPZzaryWytZ9139YmZWvtvtAbc0NKo8rxlgeRAocdSnh89lOi97O9i+m+XesuK+96/gK/EP3Ge1PuRu9vsG37hebJvd8e3YWu7QLAs7/AJY45Vd0LHkpIJ5VwZfHZ8Fe5pNewyc7wPJ49HdpNLeOhJPJdkSVpVUKsxBDGpP08zXjivFkPNZKFIbttItZJJIo3ypJaxswCtIK0ULq4860xuraUZLVgy3vf7s/abwzd59pmu9w37cNvleO4k2a3SW2E5+pUmeRFZg3HTqHxx1KeIz5a92in1O3xPAcvNVWhVT9Xr9xdHtV+6D2891N02/xfbL3cPH9yupEt7eDeYBBFcStTSsc6s6FnPAHTXgK4ycrxeXBV2aTS9C7P4HlYauzSsusdPsN0xxWmxWDQQlg6k5DIlxxFGGVccK1ndmGtexFJeY+QG7kuysImRgUiUdVKrnUMT0hcyQMbcOPtRmyXPnT7ifu59o/Gby42hd1vd/MEzQbpPsdqWtqIdHbWd2iD9sg1IqKc8eg4/ic96zCXvOlj+n+Xmr3QlPq9Slrf90vtl5NdR7Ul5c7FcXReO2l3G0MQkR6hIkmWSQAk5VfSD61xbl8XlxKXD9xl5XguTgq7NJpej/QJ8hnkBYRiOQxxdpbzNglAA8Q9DwFczXGasHn8jK+N01tcyGB40trmMO8bsdQUZCgzHS1Mhn/ADxpRlbDBeQyzvFGQbYAqBIGRFauplehICmuWrnX1xYQRO/FN/vbO+iuYr1LczrpjSVCoEjgVEVRShFeqhpyxGylElaGfSb2G8plvrSGCdnRSyVSQ6ljoBVqEqSGHA/yxxObXtOxxb9yI357Zp7cefLebY0UeweRu98NviRhDZ3Tue7oX6VSTIkAjOuHx130I5X2WNR+A+Tw7vaR2s7RBHCJHCdLUDKa5VNVJH4Yx8jF2uUa8eSUQb3J8PkiLJboZkumWSOY6aJ2waEPy414Y0cbKmV5cXUxV5x44ZIbiVLb7CJJY5oIkYSdhgahytK0fiSOfDHTrkg52THDM7blcNsc5vvuUgispO4O7lBHHqaWVtQJ1GKrGj5UzoRSt6clEToVVu/7nfaaAyWkNzum9u8rGa5262UwxKCCEWWZ4+4qMzFaDTThlTGrHwct1Kg6+DwufLWVC+0P2H3z9t/PN1XadvuLrb9x3WRrZNo3FBbCXQGKBJo2ZSTQHTUH0rhX418al7Gfk+Lzcdd1konoWFf2kbvaJLIEtr5Q6EVVZ+j6nNSVyI4j+3FEyc5oh9xaSR3FuJZI0u7WNnXXpaOTMcaEVqDnhpiehFZATGiRRUMhaOxupqN2ICQ7alXSpoarTieeWLFqU39SM77vWweM7Ldbnu95DY7d91IhSUM8ziUEGERfWzMKsqUAAzY4m9oZZhw3yWiq1Ne/tu/f37ZeR+Op7Qe5Ftvl1uOzqYvCPJuzHJNdWKCv28ytMv6sCr059agDiMce3EvbNFHrE69fWPauv3npuB4nLyH2TWfb/wBDY/j9l4h59tr7x45uZ3KC3YQESW5E1uY6NoeIkMCVzBGRByYgYV3fE4uoKOf4rNxL9l6x+T9xCPIfAJnftlRHcvM07gjTIqtUxxotKBwOpVrx5ZYtpmOXkwRqUzuWxTtL3WTRBBM0cdutVmjQHQIVU5ajmQCRTnwxopkMdqEb2W/33w/yKDyDx90t9xt3lpAP6MkLuDJbXWnUDHJTMf4s+K4eSquidG6s2RtHmW1+ebPbb3tlu9n2Dpvtu6me0koQysCc1rWjZinDMHHMtTscM6Nb9yK/8y9pY7p1jtLY64mNtLAq9La4qhiHqrN6HFuLKiu2EyL5d7ZT2j3U9oHYEtBHJGFKzuHLdCn82fEj5Y147yZ7p10IN4/41vd7u9hsm1WclzuO5TRJsNlbvqeV5JANCvQk0FS2oZccO9lVSxY27aJG3PFPF/B/D7i99vvILgweRSTxJd76QTC1z26tAGGnRHGRTVqFTzxiydzUo1UcaWPld+/M3Fr7wWOym4S42zadhsptu7cmu3f70vPJPDmV0uSM/lWuPQeI/wBGfVnrPF4a143eurf4fuNet/t/+H+I/tG/+eTtvcXfLve7z242/wAyl8Zntrb7MS3llDdtahx16FaUgNxpjBTz+R818d1Ud7rMuYTOtxPIWpk7Wpl+vQzf+yrzDdv/AIYvlu3vdSPabjs6XVxbMVAaS2nRIyqMQv0ylTXOmOt5mieNPqn+Zg+pmr462e6cfYz7CbJfIsqqgAnhVJ5HRKMwViNKnTpHTwryp648rY8pRyfJ3/cDX/Rm32ysRIkO8b/Cb13oHCdp5lQUAqC1CSMqjHR4le+mr2XQlxMc5230Qb+wH9iHiX7qvAvMfNvIPPt68TvPFvIRssFjt0FvNFIn2kNx3S8lGDVlIy9MVczzWXg5FWtU5XX9Ig9HxM7wvuQk9r97uPaX9yNt4ztV7d3sPgnuDceN2m5n9OS6ttv3VtveeZV6epPqA5nmMdzOlyeJ3P8AtUn8JPZWvXkcS07Oj+9L95+lratwgvIh2pi0SUKO3McqHnj5rkpDPA47Sh1ltopRV01FG1LJQV9aimK1dom6yiIbt4dYbpDLHNBHKshNA6BgprWoJ/ljTj5Fq9TPbjIpzyP2bsb2SaWO1IMhMjCNdNZDx0506iM68sbacv1ZnvxUtirr/wBmHSX7gQB5n0mraBqaoIOkCgK05fji9clGZ4I6DW3tZNZsypq69LwRJqB16ixBYHPPl6YnXOmNYmeTwy6t+6yqdMpMd8sY0soVtRIqOkEkU4emE8iGqtbD7DtDwCd6VmlVRG2rTH2gQSaLTq4UJzxXaxNVfUkENtKqy6SyE6Xt5CGFQtAWLfHgaDMYrbGlArMsqLpiFWXqRHBClKkGuVB/bg3HIqivO3PazQ3NJ7di6yGpAORMQK09a58sNiW5a+2bu7F2chlqkekE11fSpoODVORxmvQ0UsZ9/d95Bd2Ps29lZSmGPyDd7WyunGpSIo9czAjIdbRgMOBxt8RiTzy+ibPSfTdVfly+lW/0Muftz/brs3v1s/k26bt5HebEfHruCzggtYEkEomhEjO4kIIYNl8sdPyPkbcO1VVJypPT+W8pbh2qlVOV1KJvtj/+F170ybRtd3JfHwjzD/T7O5mojzi1vexqbTw1KDUcM6Y6Vcvz+PL/ALVZ/A03quVxG7L+ak/epPsbvXhtvdNMsMBQI76KKp7QqKKBnUZVpjx2PPCPk7xSiudx9vjHNeSorCWTRFEBpVWy/NXIUrkAPhjRXOil4WRC88QNvJIw1xnRp1ZBUGoF1Ccq8iPjixZUyDx26mU/3dX+5+Pe11nZQF4YN+322srpGZl7kEEU1wuphxq0QrXHX8PVXzN+i/gei+lcSfKdnvWrf4pfqB/aZ+3/AGX338M8g3y/8qvtmfYd2G3Lb20Uc6yBraKbUzSGtayUpheY59uJkrVVTlT+J7Ln+YvxLVrWqcqfxIXs1nc+D+9+02e03cksnjHmC7dBcNRGmihumtjrAqKSISGHxpi29ll47b61n8JOhyqLlcKzsv5qT+En1Q8ohi2eG93O+m+0sLAyy3NwR0xrGCzSnUTTJeJx5nA+/Rbs+S2xNwktWfCrfLnyr9xfvfHZ7VJ37nzfyCHbNiMlR2LRXKxmtK6IIFaRqD/Ece6p2cHjS9qqX7X/ANT6Nx8NOBxlV/2VL9r6/ey/v3U/tm8D/bb4xsO52fnu6eQeV+Vbn9vsmx3MEEMPZt0L3M7lWJCpqUCnFmAxz/E+Wy87I6uqVUtXr9hRwPI5OTZppJJblnfsQ3jdovFfO7q5k17bd7xbR7S9GIN5HCxumoMvpaMUA4jFPnq1d6pbw5/T9Th/VF6vJjX9qHPunT9T6SbZv8UwZdZkbTqVipSQ0PUtOB+dMeatja2PNq62EHknt74H51Czb3sVreTSISm5xr2bhQTmUmj0nLKmeNHF8pyeK/gs0vToYeX4njctfFVT6mYvOv2j3E9vIviW8Wt/b6AG2vfIVNwKEt+ldAZNyBI+OPW8D6xqn/nVfvX7jxXkvoWX3YbfeY48z9it28WuGbfPGdz2BZYyVuz25LIMvW6iYAkBAaZkVx67h+bxchfBZP7dTw/N8DyuL/On92hTl94rfWkCT5TwOx0MskIlOsVXQH0mr6cqV6aczjs05Cs99Ti2raujRGmjkiDxXCUeNQyoV0kUBOlQ5RwBkedcalYg2t0F/czKy91kYKgZCz6QHCKSVLKPpGZ9MsDh9Sa12TJvsXuh5b426x7VvTm1iLJbW12O/AdRAVXjkdgBmx6KZ4x5vGYMyc11NWLnZsezZbW0e+tjcMIvIdgE0gBhF1tcwhkEirpWRkk6SagHj8B644/I8C1rjt9h1eP5e1f5kXBtPuL47dDRtHmv2HcdXS13gNE5mzKsXly1FixoGocscTk+NzV/modXj+WxPVWhl37J7l+X7WkUouvutuiNbi7t5u/GUXpMg1VB10yKn1pji5/F4rpyoZ3+P5jJX+W0lobP78WmoRbxZtFKzgBckdAa6HcADpahNafDjjkZfBaTRo7vH+oLbWRAvfj92HjHtx4ta2m07jHD535ZG58filTXFbQKQsl3I2aHTXoU8TnwBwuH9P5st5a+Bb/uPY/T+bDz8k5NKV39vsMQ+2ntL5l+5zfNx3W3uE3qxkn1+Q+cbqzSwq7DNNYGqSXSckXIc9Ipjq8rm18clVqH0qv22PonI5vC4+JJJP0qv20Ni7Z/tu+x0Fuh8l3rft1vWH6strNBt8DP00KxiKVxTTl+pTHKf1bzP7MJfeeXzeStkfw1SX3lXe5P+1x4jeWdxfe1Xnm5bXvADvHtnkQivLW41Z9ozwxRPGPRtDn1x0OH9a5quM1E16rR/jP6Gb+oVtLr7j5x7Z7de8n7c/P7q3l2VLTc7Gbt+QeOsqNaX1pJVuBNH1AgpKudaZ49d/ynH52JfFo9n1T/AG3RLm/TePyOHaV0a3T/AG3R9Mdi8D2/zjxbZ/Jdt8dafbd/hSZbm5tUlkjKBw8bBKAMjKQy0FCMuWPP28h8u7q7qUfJ+d9PW4+S2PJjcrT9zGa79nNvYIr2clvJEUVSkYjjIjK0GjQxII0ggnOmLq+U9pzLeFq/7KRGp/ZCylFLcyP3W7hia2VoXlViWcgJSqin0njQD1xbXyZU/A1EX/whu0y6bgAo7yrbOlcjQACEU1hsh14n/wAqmU/8C/X9veEp7DylUQXtms9sVK9xpAvcIKnQQgAFSABSlGJ5Yjbyi9Ca8E95/AOh9ijIp139ojoqJHIIdYW36y65QGlP8RrUCo+Mf+Ugtr4FMfLX2FtJ5pDM9/cKg+1WO2t0twEkB1a2ZUDgggGhY1Hwypv5VxuaqeDqui/ElFh7Hw2VndX4tV2eziSZ7vcHSOcraKC8kjuUEcYVDxB1Yz38prEyzpcfwabVVWW/fufOP3NtPIPd7yVfH9otb1fC47423iPh8L/qXUjM6Ry3CBdTs9QVjAIWvwrju8fNi41O60d0av0/6H1Xxf0ti4GPuul3xLfp7F7PzNZ+2P8AtZb/AH9nZbl515da+H/5dftNptLX728hrRiJW7scSknNtLE14nLHD5f1nSrjFTu9rcI035uHG4pWfwMr/vD9pPCf2rea7L4Lss195O+87EN6jnlgWGSJ5LmSAdcbEkVjyIoR647/ANOcrN5bFbI0lFo/CSm/mFWuq16G1vazzjzfzj2x9v8AcbmZtse72OCK/e3Pa1zKO08vdNGd2CjWta5nFGfgYsOay3hnxHzfOyW5WStdErMkNpbbe17bq5a8viWilgiIeWdQaLqlP0aiKAA1+OC1uxPZI4tcbu9ZZe/gftHvu+xK9+i+O7IsjS64z+u7IxFK/VUerHHn/I+Yx4vhXxM9R43wWTNq9Ea18e8X2TxizS12ewjtiY1Sa8oGmlpzd6Vb448fyOVkzubM91w+Bj4tYqtfUM3vyDbdkhWa+uTbrJ9KhCXNByABPyyxHFx7ZHoi3Lya41qZ/wB/9wL/AHeeawsHO22Zd9S27d2eVwNBhmXqoHBJIYnL/Ccd3j8GmNTbVnC5XNyZdKo+Wf734vK73c/b7x9G/wBE2c7fd7q08rlpmrKLTRoQkMURQU/MA1Dwx7LwfIpWt7buUv1O99K+Ltlrku1rKU+yJLA/bz/tqe2Pu37Y+J+53lnne93+5eQPfS3e1okRsFa3vZ7ZlRahmRjCHox445vlvrDkcfPbDSqhRr11SZ2M3Hx8fM62r3RH7zWmz/7c/t54/AbbYvLrzaICQSlrt1rGTT1YGp/HHn8v1Pny/wA1U/tZv4/lq8f/AE8VUPP/AM4R4xWv/wAMPdqU4fZ2/wDH6sUf8/f+4vvZtX1NkX9hfiVj7zftK2D2s9ufI/OrLzDct1uNkSFl2+S2iSOTuzpEdRViRTXXLGnheVtyM1cbqlJt4Hn8nIzVxuqSYd+xPyO4a89wNlaYttcttZbgkOYHeV5IiQDzZCK5flGH57DCpbrqjN9U1r2479Za/U+kMUquFC56wCCDXI+n/DHmWjx6aYoVlbMDUPXLjwwiQYAR+XIYUhB7LnTPAEAqj0A48+eAZ4kf3f8AHAB4HgKD54BHjIq0q4qeAw0hOxTH7ijuT+ynuENpcrcrtytOy1/6VZozcjL/AOQh8bPHQuRTu9fx6fidPwtq/wBZj7tp/GNPxPmn7Ce1uw+73le5+Lbxv1zsNxDt5vtse3jSQzduRVlQhyPpDA5Y9Lz+Xbj0VqqddT3Pledfh41etU1MOQj309qJfZjzW12Ow3OfcLS4sYNz2jd5UEUmvWyMOgkApJHXI14YlwOX/U4+5rWYaH4znf12F2sknMNH048L3qLzn218R8sdRPNum1wPuDkBmNwi9ueoHMyITjzObH8rNanoz5v5Pi/Iz3p6N/d0Mi/un8jn8J9pPMb7b7lYdyv7cbVszqWR45b5hEWU1rUIScsdnxWNZM1U9lq/sM3iuL/UculWtFq/sPn7+z39qFv+4Pd/LG33e7vxzY/GbW1lF1ZQrI0l1PIwSArIaadEbMefDHf8z5Z8JV7Um3P3HuvIcx8StWlLZaHvp7KWn7d/LrPxzZ9yuL2xv9vi3Tb95lRYpXkV2RxpQ0BjZAQR64y8Hnvm4+5qHMQdDxXMXKxOzSTTho+ini3uS3nnt14b5VHdFpN02+D7xFJUrdRqYpx1DOjqwPxx57Jxvk5bV9GfN/JYfkZ74+ib+7oZn/c75/J4j7T+ab3HPLY3262w2nZ7svpkE98whYroqQxTVSnCg9K46PjcPzM9U9lr9wvE8dZ+XSr2Wr+z+J8+P2gftNtP3UeQ+e7ZvnkF14vsHhtjZz3e67bDHPJNeX8jiG3YT5aBHDI3rkMd7zPlnwK07Um7Tv6I9r5HmvjpQpbMw/vB9n/FfYj3p3/2w8R8nvvLU8btbL/Vd43BII5Bd3MQneBEgyCxo6DPOtcWeP5mTmYFlukm3pHoc5ZrZ8fc0p/Q1Ntk25yeF+Nz7iBc7wu02Ud1DKWqbgRIzEKy/UDwrz9csci0dzjaT5xyo+ZaNpZE7gwOlyhkVu6yn7kjRQqCwjLrkNRFCBlli5MwsLmuldXi7uhboIzXZA0uea0pXiKD0xKSMehINrlP+UDRFZp3ibtIX7sRjyapJyVBmCefLAhPQ2r+3/dns7qHW00xeUw27MCBJGrNQVpqqpJLMcs8c7l17kzpcNwWV7176HuvHb6VXvbO8Dfd2yf0ytQKaQSpCjKoGVK4r4tITRLkvUO8C8mm8buoIZLlpNucn/QL9dQ7ndYKY2B1HUoP1HBmp3Dw5YNq7fcbd5psTRIYZbpVKqz9LawCus5cajljkW7sN5OrVq9TKXuF4zdWUt3GYUtzpf7i3lAaOgjGg1Yj1r9Q4Upjp4ckqTBmxHzV/dhZS7D7XeX3FsDGl/HaxWjawNHfuUSVljXJdY1UOZINcdXiPvskV8PFOeqKJ/YB+0bx792O++520eR+Y7n4pb+H2FhcQNt0EE5ne7klQh+99IXtilMT8j5fJwNKJNWmZPU4ORfE7LdMrD9z3s9a+wHvx5j7eeM71c7xb+ES2FzYbxdIkVwzvbw3NSiVUaWfKmOz4/k253GWWySmdPc2jqdj5ON2aR9Ep7KG72UtcxdgXVrZ7gHrqhjNxEC61IJZtVANRy41rjgN6wfNslO1tejIJe7XGFsY3WIGOPuXEQI7JXVTplOQC0FPnzxNMpsiA3NpWyk0WxKrM2kOR24mkAGmAg1ZiueVfji2r1KYMVfuCllk8l2nYY3Mlrtm1rcRoqMr92RiH7oObMAgFanGrBX5trV9k/iei8Lh7qWfX9x9APGv9trwq7/aCv7prf3S8i27yrb/AG7vvPrTY7e2tRbpe7fZTXkcKy5SBC8QFeNMeZ5fkL25Pykkosoa3n1/bQ7GOaRar1LE/wBtb3dh9y/N9x8dvmitvIpPHLweR2IqiT/baGivYVBp1VIYflJI4EY18/P83j9z0vVqV7+q9j/gdnyPMpy+Cnb+etl+On3H1W8t8XLTzvBDGiq5ktyIwNUp/OCWoGatM/TPI45mHNKPG5sRl3y/xhLRZ7iO3kjtIkMkMpVWRZXGmMOBRGGRAoM6lsxjoY8hzb4ykfJrKC2hV2TtSG3Q3lto0LJp1VkzpXKmogAemNVLalNqkS8c8k3rw/c9v8ltIhKjMU3Ta4hI/wB9YjqMEgzVdORX4/M4eWishVv2s+jm7WlowkSRUuneMPFcGQEM/bzQLUCtTQHHExWO20kZ1862+0naUXCGfR+jKsDhdBOnQhAIJZGy1Ux0cLbZyuQif/tV9r7Y77u/uLc2SgbOzbV468lWka6cVublW+lqKQARzJxi8nn2obPG4v7bM3e99jf2Xk2/rArT/fbhPIbdaA1RmYhww6WFTQqa58PXo8Zp0U+hmz1+Ntnxu/c9v267l7ki33i4a5ktNpsYdsvJRpcWyhykbqBXImgqOGOvxMtaJY3Clyn6+qO74vkzxVR9G9T9E3lNZP8AassCa6m9g9jOQqa/6NacjjyXHl+U/wDuP82dTjubo+Gv7K7tofdTc3RWMq7DNpIq0aj7mAanYHhnwpnwx7byjnEl7f3lPnsk4Evav1PsB4vfLP8AcJK0a2eYkmDCZjcxMQBUKQM8hz05Y83ep5nFcwV/uaRd6Pxm6VZOxfXMMsTso0SEW8lWU8aCvLLG/wAdVWlew28Jd2W3uNkf7Kv/AOQz3Z//AL7FfT/4GWnDHnvPKM1fd+vQ62PY+Unk+8T2n7wfcJY7mW31+8m5jSpKo0kfkkpRWAr8649rxWrcKs/3F+R6bjcj/bWT/utfgz9JvhPldGuraWcIhbtAMRpLijMg01HPIg/LHhcuOTxOC+0k58193fA/bjbIr3y7f4rZrtC+27bB+veXAUCoigXqIrkWNFB54y4uHlz2ii/cdrg8LNzHGNT7ei+0yH5N++K+eWaPwvweC2hWojvd5naRyPUwW5QD/wCyHHWxeDX9u33HqMH0rWP8279yX6v9xXkP7z/dhZw81l4/dRCoe1e0kVSD/wAyTBuHocaX4XD6v7zW/pfixvb7/wCBbfiv7zvGtxmis/O/DZdmjYgPuu1y/dwJqObNbuqOF+ClzjLl8Peq/wAu0+xnJ5X0pZKcV59j0/H/AKGu9gm8Y8y2ePfvFd3tt42y8yh3G1YNpP8AhKkdLLXNWFRjkXd8Vu2yhnluRxL4bOmSsNGVfen9wfj3tzvt34ns2wyeVeQ7eoj3iRplgtLd3XUI2cK7SMAQSoApwrXHW4PBvmr32cJ7HZ8b9NX5VFktbtq9urf7jP8AD+7jdheQvuPtxtstop/6e3vXjaopwEkTr6kimfqMb34lRpdz7jpZPo+jXw5HPuNk+3m+eOe5njNt5T4vrazkkeC8267p3rW6i+qF1BIyBqCMiCCMcbkUvgv2XPKc3x2Th5Hjvv8AmvUlL7AiM8ccRMq1Yyu3BTWiEZU+GWKlkMToZU96vfbaPZq+s/HrTaT5X5O1st1dbaZlt4LSN6iM3E2iQ624hQuY40qMdbg8C3JXc321/M7PjPA35qd2+2nrG/uKR2j97Xktvcodw9u7C5hjzuDb308cpU51GuNhUfEZ4338LSNLv7jtf+1KRpkc+5E598fdfx33f9g9v3/ZluLK6s/J7W33fZbkD7iC5NvMymgJVoypqG5n8Rijg8S3G5LrbX4XD+0n4jx+Thc10tDTo4a6qUXD/t6s7eJ+5BcZjeLIBiSSaWnOvAjhjD9Rfz09z/Ml9S/6lPc/zMY+5Ca/3B+bkEiT/wCGBdgGtF/+CZoKevqcdrjP/a1/wL8j0XDX+zr/APT/APSfbg2ymWZqFVLEMvL/AI48N3HzBVCvsI2NWQFiSTlUHkK1w1cOwZLvxq2uEcOoGs1kJWpNMyDlmMW1zNELY5MD/vq8RJ9ufFZFiEcj+UR66gEBUsrqg08BXHoPA55y2/w/qjv/AEtgS5F/8H6olH+3JYf6f7d+4sWQ1+URuEFOkf6fbADLjin6kt3Zaf4f1Zt+oqduWn+H9WZIv5hN+4HdUJJaL3AnDDlT/VGp8cdVKOKv8H6HpsTnhL/6f/pN1fvV8vj2H2+j8VsWEe8ebSywO6gApYRUNwTlX9QlU+RbHD8Jjdsve9q/n0PI/T/j/n5nkttT8+hQv7AfZMQ+SeS+7262Wm22hJNl8PeTMd+cBr6dOH0ppjrTmwHPHQ+oedNK4V73+n7zd9QZlWMS33f6GQP3mef3fvd747nBtKNuWzeKOuweJ2aVImaGTTLKKf8Av24JI5kBByx2PC8ZcXjLu0dvif7exGzx3FXH4/dbRvV/t7Eb+9sPb+09t/b7xzxaMfaNZ2Jk8gvg4DG+dO7cys7GgANRWnAAnHB5PIefK7er093Q+dc/lW5We1/V6e7ZGY/Mv3wRbPucm2+E+Kt5HaQykLve5XTRJdCMkMY4Y42Og/lLMCRQ0zGOrg8I7Kclofojv8X6XvaqtlvDfRax9oo8Y/3CbmMBd78CVGVf0xa3zRxGQtQBhPETQV+oMf8A04Mn08ntf8DRb6Xj+TJ96/iLH/3A/cC5k/yPi2x7VaFneFLhZrqZowSAGYSxLX4hB88R/wDbuJf2m39xvw/TeBL472f3L95Y/i/78N0mRE8s8M23dLC4HalbbJpIG0EUYmG5MwcnhTUoxly+B7daWaft/gPP9KYMi+C//wDUk/3FmeQeV/tJ838SPml/aJtV1HL2pNp2xGs92+5YFgn20Z7bg0+s1T48sT4vN8pxcny1aV7dax79zxPO/wD13Tk5fl2xLX+0tvfP7M+cPuheXu4T3M3tbYWtlFJIZEt/Ki0jSDV0gizCoMgOJPDHtuD5ztUZ1L/8P8TmZv8A9KYnqszfsSS/HX8jJ+7eU+/vjDyjc/ArPdtrVUE02z96QEDVkhSSVlrXPox6TD5PiZtrr7dH+Rw+Z/8AqlYU/wDUT9dLL8kC8c9/PHNyu49t8ls7nxK+ikrqu2ZolkJrQyBNSHLi0YGNy9Vqv3nifJfRHL4qdsTWRLdJdtvu6/fJc5iVoGmD/cpIiPFNCS6srhjXWoBzpllni1OPQ8Z8VbRqvYxTFe31v2wtwbmOYEUbTKtW6ianh+PDELQ3qPtTW0R9hM9k82ns54Tby3OxmR4xMNvmIjYl6EtCxVaDVWnz9MY83BpaZqmFMuWj+C5dfj/u35Nb27dq823yS3KiGUXJBfuIDoPFJM6ZUBHPHHz+Iw39as2YPMZ8Tix82/fH3Lf3N98t026LZrnb93NxH4zsSWNwRG0xMcMCduUxhF77Mxz4muNuDhPhcdvops9vv9uh9y+muRavCxuNbKfv/gfoi853/wAa/Yt+1K3Xx6ytbzcvG7K22jx+G8kEKbp5DejT9xdzEg0eUNLISa6V0g8MfG+PTJ5zyPxuO5tv2VXRfZoj1F79qlnw+tfeD90fvJvW67g9p5B7kblDI93eNth+8s7aKQMsQSKJoooIqjVGqsGb4jH0e/ifH8aiUdi29v72a6+cx8GqdnVL8/zNA/t1/fh5H7Z+fbP4t5xeXjeI7hfpt3kOy7m10ZbEyStD34FnWRkaNhUoGAKqwpWhxyPK/StM2J3wtdyUqI10mH+818rnYeXSe1K0aNLf7tD6Tfvq8N2a79uLH3ObRBfeIXMFveX6gnuWF/IIQjFQSaTOhX/1H1x436fyXef5K17untX8DR4TyK413W7+G35la/sU9zdq3fx/zHxFN5trhNsvLe/2yFZ0UBbtCs6UZlP1RqaD1Jxq8/wsmO1bur10+4p+p8mC16ZU91D+zY3Tvu7+O7Ptlxvfkd3Z2G0Wia7ndLxlMKBs/rPEnkBxPDHCxrI321mfYeax4Kci3bRdzfRGIPOv3Y+2NpLLZ+G+Cjyl4mZRu18RYWrcRVEVWkcZ8CFrxrjvcfx3Iet7x7Nz0PG+i+9J5bKvsWr/AHfmZ+vP3MeW3M0jw+OeO7bb/wD2skM7gAcCWeck/OuOjXh19bM6dfofgRq7P7SV+OfukhiltU8t9utv3a2h0AXG13lxbSqoINQkzSq+Y9VGKcvBt/Yu17zNm+heLvju179V+EEz8h/dd4Ht7W8fg/tnLdw9mIzXW8XRt1DGhMYii1lqU011gZnIjFOLx3It/PePcjPh+i8S1y5Evdr+cDbsP77vCds3CCHzjw2w2bbQ6RybtYX/AH5YA4ZCzW82bZKa6Wr8CcW28ByMi+Czb9Gv1M/M+nePgrOLJL9H+8o/9wn+4l4X5V435L7f+AeM3d7tu6AWS+VSSrAs8Sygv2YdDaFmC8Sa04jHW8X9I563rkyWhroZeHTHxb1y2c2WvavX2v2E+/2zNkf3A8g9wfdDftmt7WLxA220+KwtWSVbq9jaW6nYtwdYgiADhqbGP6xquJXHgq/5pb9y2X3ybOT5PLyU6vRFA/vo/fb7jN7ueVe2Xt15ne+GeH+BXbbVeLsziG93S/tqfdNLcpWRI1esaopWpFTxrjvfS30rx/6WufNRXtdSu7aq6aevWTkZMq1UnzDvPKPLvcDeLB9x3jc90VLuG1/7h3y4u9zaCKVixVjLJI4VNRbtg0OeWPcLDh49X2pV6xVJT90FSrmun8urb/E+9Hth7RlfD/DdofcJLra9u221SxaANHCYnRSs9UBqJ82NPXjj55zvLV77Nbyz55bw+fPmvfMobb0/T7CX7l74eyXtLJ9nt1svnXlW3krJZ2EkZsbdxUFJLxgQWGVQocjHFzYuVytW+2r+/wC4+geB+irOqtZKi9Xu/s/6FVeTf7gfldsBJtu1+P8Aj9mSwiilEl9PQZ0JLxqaD0QYqx/T9H/M22e9w/TfFxqLWs/uX7feQWX/AHJfO7QpDL45sG+21z0teMJbORCeAVkkkUChz/TONNfprE+rX4lHK+ncN1/l2svuf7vzLD9v/wB2/tt7lX8dj5BuN94rv9xKwt7HdmC2k87AApHfIShFclDBdQxDP4vLx1NV3L2b/ceW5/03yMK7/wCevs3+41La39nZaYIbVLRWVQ9sir1JWrGtVUVrUGmf445VrWscWtKrZHzf/fbvEknl3gncUs/+hXMjOakqv3i9IrLRC/EVBPpwrj0Pg6/5d59f0PdfSz/ycn+JfkfSH9p14zfsk8XvrWR4ZP8At/yWaGZG0Mri/wBxIYMhyIIrUHHl/Lpf8jZe2v5Iz+Q15j96/JHw82L3J94t3uYNr2nz3zLfb2QAR7ba7puk144CBnZY4pmdioq1AuY9Me8ycbj11dKpe5fuPT5KYqa2VUvakiajcf3KGVxr9znaOPXLD3d9A1HJtdHyPoAaYoa4npj/AP4SCz8Nf2sf31HVrX9xG/RRbPe2HuJvMF8VptO4/wCqyW8qsgakwuSI8jmNWWK+7i0+Jdi9qj9Cxcvh0+LuxqPR1/Q+jf7V/bXeva3Y983zyloo/JvKWto22oHumztbfW0cbyJVS7O5LUrwXMnHm/LcmvIsq0/lXX1PI+d8rTl3rXH/AC1nX1bNS737leN+E7Ncb15Rv9ts+z2dEeS6cj9TMhEH1Ox5KoJxysfFtlt21Us5HHx5M9u3Gm37DKHkf7+9phnlg8G8Sk3RdLAbju8nYi1A8Rbw6nIPxdTjrY/p9tfHaPd+89VxfpmzU5bx7Fr+JAI/3ze6ssnfFt45DDqP+W+1kKrw6SzTFv4nFtvBYVpLOqvpzixvb7/4Fu+KfvqLPbxea+Ex9p6CfcdknIZeVftriteOdJMYsvgf7lvv/f8AwMmf6XX/AMK/2W/ev3G1fBPczwv3K2s7r4fvcW5RQgfeWh/TurZj+WaBqMvz4HkccbkcbJgcXUfkea5fCzcW3bkrH5P3MnBkXm2ZzVa8cZoMsmIPdX96mweF77ufjfiXjw8pudnme0vt2nuDBai4jNJFhSNXeUIagmqivCox3eH4S+WqtdxPTqej4f09bNRXyW7U9lEuPb6FIr/uGzRyTx734BFIiCsX+nX5WVXIIXUsqEEMeOYp6Y6X/tz+7b70Tz/TVf7GT70QPyX9/Plu/wC2X202viux7RtV/bTW1/a3ZmvpnSZSjLrLQpmCfyccXY/p/HSybs219hq4v09hxtWd7NpzpC/f+ZS/7f8A3hsvDvd/2+3iW8WGzbdU23dmJp/lb2ts7MTlRdev8MbPIcJ5MF11iV9mp1vJr5/HvX2T9q1PpB++Xxb7vxLxPzKGIGTYdxewvpBWv298o08OQljX+OPNeDyxe1PVT9xxPpnP25bY31U/av4Bf7NPJRuvt15F4nMwebxfdDcW0ZP/AMzbgrSAU4mkqSfyw/MY+3NW/qvyM/1Vx+3NXJ0svxX8IM5/vxvfu5PBPC45DWWafe9xt0bRRUrb25rx/NLx+GOp4FfzX+z9X+hV9L8T4r5f/Kvzf6Gnv2SeKbd7f+xVz5VfmOyj8kvbrdry+kOkCztB2Iyx4AKImOOV53M83J7V0SX2sl5zI8nJVF/ZSX2vUrn/AHF/GPvfbvwz3DsFq2w7i1heTqPqtdxj1Rlm5KJIgPmwxp+m8vbmtjfVfkW+AzumS2N9V+KM8fs787G8eBb94pLed8eK7v34YpCQUtL1NYCgZ0EiSVP/ADY6PmcXblV/Vfkcz6pw9uauT+8vxX8IKG/fb5w4t/C/DI2Ajke433c119UcJ1W9rQU4au5QE8Vxs8Fh1td+79WWfS/H/ny/+Vfm/wBDf3+2n4VZe3f7X5vPd1Q2L+ebjf8Akl9ezEFl22zBt7csR+UJC8gH/Ocee+pM/wA7l9i/spL7d/1H5XL8zPC6aH58fIt8vP3AfuJ3fyOcPPJ7geXXO6zxS0XTZtO0ojYDIBLdQhPwx651XG41aL+yl94+bkWDjuHql+Jt7fWVrQXEV1FMkGoRRZOY2c0UKpHUKfUa5cscWrPn10Zr8393vDfDLiexMj7xvVsxD2Ni6yRiVclMz17ekD8mZz5Uxd3Jahh4OTLrsvaUDuf7i/JLqWeSx2PbLMS/mnEly6/Basigf+8/jit5t/21OjTxVFu2/wABTs/7k/MLO4719tO135JXXNGsttP0muTo5Wh5gqcX4ZvpoK/isb2bRvD9uH7p/Aty3Sz2ryF5fENyupyqNeS6rJu59AFwAAlW/wAQUVwZ+HktVuuv5ksXi8yU0Xcl6b/cbG95d7Fxa7QCym3kJIllVwxkZlYPGFJ0sSeDUyPPGLBWNDncl6lHeWe/nintV43bxb/Hc7zd7oHj2TZLUKsiSqamcM/0xplma1rlXG3Dw7cm0LReps8XwL8y/anC6sY/bb/cX8t2Tcksr3wXaw9qRFHBNuEwaaKVhprIkWkMRTPT+GWNWXwFMlWu5z7j2HG+nKbPI5XsRov3R/eVP5N4+Lzw7wi0sr/sqLy53a6NzFr0hCqpEsWpVocy4JPEYw8bwqpaL309iNtPpOr1vkn3KPzk+XPvF+4DzbzfxzyXwzyPbtrk2q/lR7e7sopo5YJYpY3oJnZ9StooRQEcjyPcxeOx433Vb2KMn09h49vmUdtF1N0f7LETQ+Y++6FqgbPswC6aU/zFx8TXHmPqirSx/b+hzcuN0cGTP9xC9jf95XvHYvpDK200rmSp2+2JP/vNfXHc+msyfDrTqp+6WdXxudWq8biV+34G5r47P474dbbpus8e1bFsu1W08t9Mg0My28ZZmZS2skmgHE8szjmqrvkdaqW2eAvhtlzOtFLbf5nz08p/dnaR3RtvGvDI59sgkc/cbnOYjckk59iKM6AeI1OcuXHHTr45pTax1F4Bqs3vDIdt37oYJbsW2++Hx2O13ZijubixndlhRRQlYXTLTWvSQaYjbiOuqZkz+HdV8Ln3ojXvdp3X3I2GSCcSW954rHJbSnqAgZ5mjMbLmRpIIOLfHL/P/wDK/fujq/SmKbWq/b+SP0I+IRlP9qu8iZQhX2E31WUjIf8AxHu+IGPG5q//AJSP/wDIvzRsy07bOr0PzpftT8s8r9u/evZPMfDL9tu8h2GzvLi1Bo0Nwgj/AFLW4U/VFKlVYDPOooRj0PkPH1bmPZ9+sft7zjc/JbHj9NUfqK9tvdPxf3x8DsfL9knNpSVbXyfZGZUm2u/EdJLaWlAeIK/4gQ2fDHmL4nitBVizLJUivmccf28q3bPCtzqhKaFKoUY0KRgkFzQBWpU42Yp6FOVLoZL83sY7m9QPIWivWSK9jVjpMSakSIjMg0AJamVTnjfjcIxXoUm9tBA+499KtaExxxoXASAOoUVNNdRXifTkcaK2kouoPoPv3kSxv9xJMqF5A8IkUxlWVNJZ0AowqAKAiuOPjxs6VsmhQ26puW871Z7PYM15f7xO1vbQfSJCzaWcOAdQRcwCa43ysdZZh/1LQfRzwrx6z8P8T2Xx61KpHtNuIZZjQCSf6ppCalKs7UoaH4481nyPJds9BixqlEjFHvx4zG9xud1DazML4EmzZqR3AcaXDSyA6QAeIzHJsdriZJSRy+VjmT8837qrM2vu1fwl+5H/AKbY9kkEEJoIAIIBBFKZ5nHc+UsmHXr+32GvxqdcX2s/RX5dKLf/AGo7CZhqEXsDsJI9abPafLHkuNkWHnqz2V/1O1jv2NW9D8+3sN594/7decbjvPlN3dWm07htj2xFlE83ckeSNlHbVlIWgNTX+eePonkMF8qheqZf5ri5M1VWvVp/h0N5eNfvM9nrCSB5ZNxKdTSQx2MqIG0iPWhLsNRUCpZTnjkvxmW60g4OHw3Js9I+8pX99vvd7ce6uy+2Vp4XdblPNbRST3qXti1rGECFVCljV6E8eGFw+Lk4+SMiWqftOj/xeXh5E8sRZPZyfRX/AGVwR7He7VaV/wC+l4fDa7QY8159Rmr/AIf1JVPjp7gXQh/d77iqW0xr7z7u7GmVV8imqfjj13Et/tKrp2r8jpYcsce1ekM+y/uV+4C09oPF7Dc440v/ACHye6YeK7I9EMrRFtd1NQmiw5E/4jRR8OHxOA+TeHpVbv8Ab1OP4bx1ubkjaq/mf6e9mdPZzxz3W/c/5pfS2sku8Xkknd8l8rv2K21hFJmgdlGQypHDGKnjQCpx1eblwcDGp09Euv7dWfR78nB4/ElEJbJbv9urPqb49+1n2J9stoi3H3AvYd+uEULcbtv90LW0LgVpFAHRR8ASxx5PJ5TkZ7RjUexas4OTzfM5Fu3Fp7KqX945JN+zbeZW2RG8Hkkc9sxgJBwyym6B+OrEY59Pi+Ii15SnxfH+3sIf7gfsz8J8i25959rd1OxXsqGezsZJjd7ZcgiqhJKs8YPJlZl+GLuP5nJRxlU/gzRxPqLNjt251K+6y/eYt8V8u9yP29eeXNq0U+2Xu3ThPIfF7lj9rexcgwFVOpTWOVeHEEjLHZy4cXNxzv6P0/b0PR8jjcfyWH1T2t1X7dURn3A3Kw3L3C3rye3Vtz2ff9y/1yC3nY6pbe6fvPbyMM1KnVEflUcsW8erriVNmlH3df1LuHjtXBXG9HVdv2rSf1N0+4/7d/ave/Zi8849r/HBZ7q22Q79tMsU80xlgCiaaEq7sKmPUPXUBjhcbyOavIVMttJhnmOH5bkU5SxZ7Sp7Xt9/3lO/sx81j2fzXd/CbyUDbvM7YXG3KcgL6zUsoH/rh1f/AFoxs81g7saut6/kzb9TcT5mFZVvR6+5/wAT6Qb9Ntex7Tum+7q8cW37Vay3e4TSGg7UKF2NfXKgx5vHNmqrdniMeF5bqtd24X2nxa2TxXcffz3ogivATP5vvTXm7SD6rawQ65AKZARQrpXlWmPa3zLh8fT+ytPefSsqpwOJptRQva/4s0t+7H2j9k/azxHaLLxHxGHb/M/Jr0fZXn3Nw7W9pa0aeUh5GHUWWNajn8MczxXM5Ge7d7TVL8TjeD5PJ5WVu9prVezd7fvMwbf4fuNr7GeVeSs0y7bunl+02NkWNO9JZ21280mXp3gtcdR50+TWvVVf4wdi90+bWi3VLP72v3G4f9v6AQeLe5KqCFO9WZAP/wBy544nn3N6e5/mcD6nUZMfuf5mOPchEb3+8xDZ/wD4wbqqcwDuZ4U5HHY4/wD21f8AB+h6Hhr/AGdf/p/+k+2zqBLK/MMQDjxB8yPFs86BQaCuAGwtnWlRShFTX0HrhiMX/vgWNvbXxRTTPyiOn42N0cdrwemW3+H9Uel+l4/qL/4P1QD9hiBPBfPNNKN5Gh4U/wDmKDD885yV/wAP6st+pv8AWp/h/VmI91th/wDPBblIGdC3uBIQF5gbocdur/2q/wAH6Ho8dY4S/wDp/wDpNe/va8E8h3STxfzfbbOfcNn2i2uNv3lYQZPtTJIJI5SgFQjUIZvWlccfwmete6jcN6o4P0xy8de/FZw2017fYZR2D9wnur4n4lB4V47v1ntWwQ28tvFHFYQGYLOWaR+9TUXJYnVxrjrX8fgyX77pt+872fxHHzZHksm7P2v8h3/a37Dbp5N5pZedbttcg8Q8YEt1Z3kykfe7hwgWMtm4jrrJGVQM64PJ+SrjxvGn8T/I4v1JzK4sLxUfx239i6/ebQ93trurD239xb2zVlvIvHdweigqppbyLUn1oSaDHF4dlbLRP1X5nhOFi/3ONdO5fmfLv9nntZ4h7n+8kPivne0/6344+038/wDpjSvGvcjRdBUxMjrpqa+v4Y9R5rlZOPx+/G4co+g+VzXw4e6jhyay8l/YRsfmP7gdw2jYLKbwX2U8c2XbJ79oHaWS83GdpmlhtTcF+rSqF3NQoyAJOXJx/UN8fFTs+7K2/sXt/Q5dPLOmBNvuu2/u9pdP/Yf7Afaa6h2Hdm8Mi3uALZzNud8243tVIIWdjJLoNTWhC4wrkeT5K7l3RvooRmWXnZlK7o9mhId6/aP+2f3Y8fk3b27js9hnui72PlXit2J4Vn5GWEvJE+nmlFI9RivH5nmce0ZNfZZfsxY/KcrBaLNv2M+a6exnu3tvvlB7EfZLf77lPBvJUrZSbUSW/wBTMlCwiC5EHPWO2Ktj1D5/Htxv6jZenXu/u/t01PSU8vj+T817enWfQ+mO2/tx/br7S7LaXXuduO37rfyr+ru3kV2LWKWVaFhbWokRaCvDqNOJx5W3kuVyLNYk0vRL82cPJ5jmcm0YpS9Kr82Ldu8d/Zj5/Km1bIviN1ey1S2SzuGs5yzUFI2Dxlm9AK4VsvkMCm3cl95G2XyWFd1u6PapMzfuO/Yz47YbJf8Alfim2ReU7HtsbT7r45ukS3F5bwqDqlt7igeRUUksp6gKkE8ux4r6kzVsqOzq+jW32o0cXl8fm2+XyaVl7Wj9oM6/t49ofbfyLeP/AIW9/d7j46N0ic+HX1vP3oobgapGtmSUlijrUoNQowoPqx6XP9TcvjU7/hslumtffJ4/6z//AFlwuQnycM0sv5oej/8AFHr6+wtzzf8AYv7gbMJLnxS/sfL4UYuIam2uigyClJGIJYE1o3LG3hfXPFzaZk6P70fGef8ARHLwJvHF/c9fuMneUe2vmfh0stl5H4vuGzmGQkvNaOEJVgtVkbgpNaUJrkces43kOPyVOK9X9p5Lk8PNx3GStk/aiHql1G/eIkVlyQkBDQNpXSx05ClDnkcan2mJp2UIwjJvsvgvv1ZeRbs0lzb+PeZWm+XpdTI8kUd5FdORq6iSi+uM/MWS+C+Ku1q2SnbVRufe/p+9MvBwXX92q0/8Oh+i/wD3O/b3dveH9pq794OJd+h8O3fb/NPt7D9UXm1i1uIZZVVc3WOK772XJa4+QfRPNxcPyUZoSsnTVbOVH4qD1HJq7U0Pz/ewn7hd19lk3TbbdbybZd7uo7m/l2u6e3uEZEMf0ErHKrLTJiPnTLH2LmeMw8tK2ja9P2/HU8V5zw+XnNXxZOy9U0k9av3xqn7QPvP7xv5l5peeZ7DvA3WPyKOGXdLHcbGOC4t7uGA2xqIxpoUAIaNyNVTkcU8fx+PHTsh6TEnS8Fl5vH4/yeRE1ejWtXX8/saLF8o/fh7/AHuD4Tf+3Hnvkr7/AOFbpDBZ3m220UNr3I7UxyQKZVi7tRLEjGjgmlDxNedg+luHx8qy4qJXTesv9fY39h2q8u39ovP9rXkmwe1eye4Xut5pf+QeFbVc7ba2W0Wl1bCZrpBKXuO0jknN9KJwr8RijynEych0xUSeup5XzfmsXLzY+Lg+K8zo9F933v0K18g93/d39zPnm17B4XvM28Xskxg8D9vrVGjaulDreNCiaz1tJIRpUDiFGD+i4nj8TtkVUlvZ6ft7Ej1fi614lO2j+J7uJb/WD7AexP8At/HYdpt9/wDf/wA1n33eyhnuPFNnuWt9rs1qX0TXbUlnKjJiNCf+oZ4+d+U+p65LdvFx9tfV62fuWy/FndXkM6/tFs7h5b/t++BzDY9x8l9s7KeOUq1u93BeurgjUHkDTEUJz1NjDj4fmOQu6tMj+xr9xXbn5Xvd/eF7n+3L9q/7gPHtxl9q/JrHa7tVavkXgm6xTtbSyg6TPba5oqZ10OgqOHriNfJ87gZEs9W/Zdb/AG6Msr5LPEK7aMB+E/tH8u8Q/d34Z7V++003nvtn5ftu83Pi+8WjS2tjuH2FqZgs3aKtBPCVRjFq9SCynHq+V5zj5PG2z8X4MtXVNbtS+nSH6lFuZltaGynP9wv2K8S9nvd3wPx32e8FXa9l3vxr73d4xPNMpuVvJ1LkzO5JMYApXHT+kvLZOVx735NpatC2WkFTx5s1oqm/aNH7HvaL258u9yt4tv3CW2yxeG2/j08uz2e53wsIY9wWaJVaOQyRksIWYGrfEcMW/U/lc+HBX+jb7u7WNdI93qXPxmWte5ps+9vsP7e+xvt7se/WXsUNr/0Pc9xW631tq3E7lGb1YI4xrkM02lu0q5VGWePlnk+Zy+VdW5TbslClRpPuXUrtitj0smveZu8l/bT/ALfV/wCXeSb35PZeF/8Ad27breX3kj3XkbRTm/uLh5boyxG8XSxlLVXSKGopjrYfOeYpjrWlr9qSS+HpGnT0LKcXIviVH9x86f3heEexnhHnXhu1+xsOyHxi42GSbyB9mvlvoVnNy8dHl70qqxTSM8wM8ej8NzeXnxWfIdu6dJUaQen8Rjs8b+ZXWdNI6EV8r/cP5f8A/Ct8L9q/HJJtot9g2VYfI91hZkluFfUVtVYUIhS30K2k1JBHBTiePg1+dbLfWXov198lXG8Jjryr8i6lu2i9Pb75L0/bh+xLzX3Z23b/ADL3P3ncPB/BL0C42vY4kjXddxiY6llIdSsETqahnBc5EKv1Y5nk/P4+O3TEla3V9F+9k+d5dYW649bevRfvNxXPtL+w72PQ7f5PYeG2m6QRhbxt/uhuW4vmBrmikeVwSeegY4K5fkuVrR2j2KEcn5/N5Oq7n7tEBj9m/wBhvvzHJtvjW3+G3+5zxFID45ef6duKrShaKKF43NKcdB+OG+b5Lia2dkvbqhPkc3jfzdy9+qMB/uY/2+/JvaewvPOPbbcbrzvwLb2a43fZbpA25bbbChZ2EelbiJBmWVQwGbAirY9B4v6ipyGseVdtuj6P9zOvwfLLM1TJpb16P9xG/wBrnv3f2+7WPtr53vUl7s1/KLfx7ddwdhJazN/StmdtQaKSgCavpNBWnC7ynAVqvLRarf2+05vnfC1dXnwqGv5kuq9ff+Zz989sY/OfbvvxrDMPHrpZypcN03rEs3AFWpyGF4J/5d/evyJ/Sq/ycn+JfkfSr9pbmT9i3jr5KX8f8qI0ALSu4bnSi8AfhjzHl/8A+Y299fyRR5Ff71++v5I+L37cvIdg8M93vEt/8j3D/SNp2uzu2vbxwZEUSWrqpYIGaoLcPnwx7fyOO2XDatVLf7zveY418/GtSimzj8z6cp+6P2GaJmHnaR27MwAa1uaBpPoB/TORoTWvDLnjy78Zyf7v5HjP+A5n/wAv8UPFn+5f2U3C6hs4PcWztpGY9l7wXMSNIRRI1kdNNAAeJ+eKreM5C1dGK3g+ZRT8t/ZBNvNfcjxnwrw68823Pd4bjY9vtVZHtGSRbx3NIFgYNpcuxoGHz5HFODjWy5Plpa/kY+NxMnIzLFVfE/Xp6yfKXc/K/dn9znuTabLtm3zbxvO8yOnjexWxpbbfZ8WqzmkagAGSVqH15DHq648HAwttwlu+rf7dD6HxuPh8bg009X1b/bZH1F9pv2De3XhWyW+9+828Dy7eraDu7nbrO1hstqtKsp0sjyBebuyj/lGPLcvz+XLbtwrtX32ZxuR5zNdxi+FfeydT79+wnZJ4PH5dx9uI5j+hDGjRTg1yp9wmsfiXxnVPI3XdF/29hVX/AJC3xLv/ABA79+0/2H9z9lbevareLbZJWRksty2O7XcNsLjPRLB3HAz4hWVh/LDx+W5OC3blU+xqGX4fN8rj2jKp9jUM+f8A5Xs/ub+2nzy2ju7iXYN6tg0uyb7ZyFrTcLZSNRUsAJI+AeNxUVzAyOO/ith5+PTVdV1R6XHyMHkMLTUrqnuv29T6J+1P7iNq92PAbje7aaLb/J9rhaPyTaVBUQTiNmSWENWscoXUn4rxGPPcrxtuPk7f7L2Z4DynCtw83bvV7P1X70fJH2JGz+5Xvx7f+HeWW3+r7P5Bu1xFu9uZHj7w7csgGtGV9VVBYg/DHrue7cfi3vRw0lB7jyHItjwWdHDSNpe8X7Dtq8v98/BPFvbPb39v/baPx6fdPcbyGF5Z5GnF5oghtu8zgzyKGAr0qtWYHpDcTh+fti49rZX3XmKr7OvsOBg8veuKzu+606F6+RexX7NvYTxK8j8jtvGNt3tNquhtu5eW7ks24XMphejolxLViW/99x/AYwU8hz+Xddrs1K/lWi+4yrncrNbRuJ6fwPzd7X5fdSy20skzQXVkqGMmrRqFoVyrWtc6nnXH0i2KT1KySz9Q+37jH+4X9om3bxATc7h5N4fFdrWhk/1SwjDMppwYzwlT88fL7V/o+a6vZW/B/wADy2C39HzU+it+D/gY0/aB5X/onuvDs0k3atPM9vm28LXI3EQ+4gI+JKMB88dfy+Luw9391z+h6j6j4/zeL3Lern7NmV5+5nfZvMPfDyaOyk+5WyubXx7Z04qz29Iio9C0zsCPXG3xdflcZT73+3uJ+G464/Dq31+J/b/A3N+5y+tfZz9pFz4laSrHcXm2bf4hZkNoaV51C3Timepoo5WNOeOD4ur5POV36u37v0PNeOnk83vfq7fu/QJuFP7iP2OXMSlbjetx8NZRTqI3bZM14GtWmtQfiG+OD/svIexW/C38GV2/2nO9it+D/gz46ftF80fZ/dlNpaf7ePzjarixWBkCxiaAfdQlq8CAjinrj1/mMXdg7v7r/gb/AKlw/M4vf1o5+x6Mpz9zXkm5e5fvVvW1bVG9zIm5W3jWxWUIDNK0TrbroANG7szsaE8TjT4+i4/FVnpp3P8AMs8Vj/p+FWeq7n9v8D7j/u43ew/bd+xDe/EttmjtbhPGNv8AANmKLRZJr6NLS4IUEU1RCZj6Y8N41f1XPV7f3nb9V+MHBw2+Zn7n1c/t9p+ff9ruwSXPle9+TBGMOxWn2iBUJkM16xWkfI0jR+fOuPXeSvFVVdX+Rl87kiiour/IcP3Ge8s+03s/g3jMoj3aCMweQ7+j6pYw4zghkGQZgethw+kc8c/FTqzh8bi93x226Fnfsw/21vPP3LWVh7h+c7jP7de0NxIWsdwEQfdd6VDRjYRSdMcVRTvyAgn6EfOnJ5fka4/hpq/wTOrWkn2KP7Xf9uP9sW320PnezeD7bfiAv9951uKX243MZrqkFvdSGorzjhA5Y5Pz8+WzdZn2FkJDVY+2P+1t+4Yjx/xiz9sdx3e71W1jBsN2uy7kXI4QRxPbSSNzFFb1xOubk4/jlwuu6/cEJmE/3Qf7VW/+1u37p5/7A7le+deJbdG1zuvgl8FferOBdTSPayxqq3aIv5NKyjl3OXp/D/UNW1jzadE+n2nR8fnWK0PYwJ7Ue/u8ePX9v4V5RuM1x4vdt9ra3F25Z9vfMKquwb9JsgR+XiCACMdfnYq2fclD/M4/nONTJd3oot19v8Qn9ze4Tt5x45b/AHLm1t9lpaI4GStcSkmgpmafjh+PvE6wV+BydqcONT65+F/s/wDZzyT9iOze6uw+2H+se9O5+BPfbJuVvPdNcT7tIzrCwh7vbJLEcVpjgZPM56eQ7bX/AMtW20/lPQf1uSuaZ0T/AANT+yH7G/bb258Bsbr3uktPK/IntluPIo7q4MOy2Msh1vFGSyGQITQvI3VTIAYx8/z+bPlawfCun95mjP5nPkfbi0X4s+WH+4T4x7WQ+7W2R+0lts1t4lZeJ2aXcfj4jez+9N1ed4ntmndEZjJOfTT549P9P3zPA/nT3dz33iEdTgUy2wv5szL332Rdv+zbam0839+IW4x7TtC/wuLjHJ+rax8v7f0OH5LF8uyRg3/cmuPtf3s+7k2qgEm0hxyKnbLYH+3Fvgsjx8etv2iX+JzcWb5WTuI17u++O4+7EvjviO0a4/F/HRa2VpYQK7SbldLEsYuHRSSSWUCNFHOtNRpj0HB41MCd7bzr7FudDxPCx4E8lodm9fYtz6rft2/28faD279nd492P3g7fC+4TWZ3a62W9vJra18e25FDok327xl7pxQMtW0nTGoLVr5TyPns2fOsfFbiYWmtn+4jyOS8l4x7dD4y+/e7e2nnXubfL7Ie3H/Yng5kSw8W2EPcXF7eAMVW6ujLLKe7MxyQGiLRcyCx9NxuNkxYUs9u671fovuj7yGbj9lfi33ZK/PvGrjx/wA58A8d3Us93sngVtZX5DaissYljdRzIDVA/hhePh3dvf8AoZ/pT4897L1f6H6Ftgtqf7Y+5WsII/8AxGb3HGrZEV2i6ArXHjMuvltP/mr80bOVSeXaq/vfqfnS/bft0EvutGrh5I49p3Gs0UYd2pGvWuoEVHAEjHs/Ipds/Z7zj+f46WGV0f3n0N9vfO/JvZjzVd82Sm4bXeWwi8q8caVUh3Owib6ZaAKJ46Fo5ACeIORx5/PgWRHlcObtZvV/N/G/NNqg8h8P3OPcrLd7TXHLCDFJb0bqhdQp0yRZ6uAFOdQcZFjjRm5ZJ3Kp8ivYZrVgtuYLEQdE4ZHkvEiiDazKKFQtDqqBqrQUPG+hXYzTu+8TQRW04neOGytzJN2JFZWEqhtBouax5HTUkgc8bMdZMeW0GytyuGuGH3Th55UjUhwytCAACwINCCMsY6pLQsbbRbXsR4S0u73Pl+5FXXa3Np47IiKaOw0tIseemg5/DGPn5or2o2ePwS+5mqd7dLfbDHK/UEEettQY141oKn4inPHGxKbSdjI4UGf/AHJ8dTdvG57xY0kVI2DxR1VZAWIRdA0gn0x1OPftcGHKpPzbfvc2yTb/AHv3GG4V2ddo24ZroCjttoFKVGXI49bw8dbYU2p/b2b+5mviUSwd3tZ+kf2/9sIvej/b/wDbL2pn3dtgi889mfGtok3lIRO1sJtntQZBEWQNSnDUMfP+X8PIvP8Aef5s212RhI/7L2zvHbJJ7/7i7W6COv8AoMIDKv0hgLvkMegx/VWWtap0TaUb7/ga3yrWVU+n4+8JT/ZY2WMuV/cBuKl+OnYYR/8AxeH/AO68mvwL7/4FdMtqttPce/If9nLafIo9mS59+r+M7Nbm2iYbFD1IacaXQ9MQy/U9rtP5aUe31NHN5j5PbKjtN2/s3/aZZ/tF8M8t8PsvNJ/No/Kt9G9vfT2a2TQt9tFb9sIksobKKtajjjieQ5z5eTvagxH5i/cpyn7vvcko3WvvLvLKhzWv/cUtK/HHt+I1/S1/wr8vzLKuMVvcyxvPfLvIPeT32vNp2aGbc5Nw3mHxnwKzPUGpcfbpoaMNQSOS50jgfhjocVV43H7r6KJZ3fCUXE4qnTTuf7ew/QvuV/4H+wn9tNjBbQRbpu9miW9urkRzb55BdKWlmlYCoQEMx/wxqFGdMeDpXL5bl66J/wD8Nf2/Ew0rfyPI1f8ABHyk3z3Z8w90d6k8h8x3ufed1vixt43bRbQRmrCG3hB0xKo5AV9anPHracPHgr20UL9tz3PEw48Fe3GoX5+8WQuk8aOFHbOa05UxW1BvTLy9nffLy72i3i3ksbubcfFJZV/1rxiZ2aGSMnre3BNIpQMwRkeDZYxczg05FddLdH+853kfF4+ZXVRbo/3+qN2/uR8F8f8Ad/2otPc/xUR3e67HYLuu17hGAGudsI13FvJTmgq4B+llI5nHC8bntxs3yrbNw/eeW8Nyr8Pk/Ivom4a9LdGfLFWaa3prBS3rIoJ4K7AECp9SDQD1OPUnudmfT79lnnK+ReBbx4HuMqz3PiU5NpA+Zbbr0swFDxCyax+Ix5jzWDsyrIv7X5o8T9R8X5eZZVtb80Yh9x9h3L2S959xh2svA3ju7xbx405P12ruJ7fPgRSsZ+IIx2+Ndcrjru6qGel4eWvO4i7v7Sh+/Z/vNdfuo939vvfafxPavH7kM3udFBuNwENSm2xBZWVqcKy6V/8AeTjkeK4bWezt/Y0+0874Hxzryb2uv9PT/wA3/QSfsf8Ab1EtfIvc6+gHcu2OzePyEf8As4yGupF+b6UqP8LDD83yNViXvf6Fv1Ny5dcK6av9P3mZf3B+bXfut7w7om1Br2ysrhPHvF7dCW7oik7ZZP8A5bMzEU5Ux0vH4Fx8C7uur/b3Ha8TxlxOKu7Rtdz/AG9iNKfuK8Ks/b39tvhHiFqqM20bvZJezLwlupIJ3nkrz1OTSvKmOb47O83Ltd9U/wBDh+F5T5PkL5H1T+6VA7fsMAHjPuJQU/8AixZ//u3piPnf56e79Q+qf9TH7n+ZjT3IA/8Ah+eYGmf/AH9cZ/8A3yOOzxv+2r/g/Q9Fw1/sqf8A0/8A0n2tkoHk5dRNf7ceKPmDEMgBX+oUqak16R6/xxJEGNV3BcMGeO60uEIB9D8udRi2jRXY+f8A+/KfyK39uPEJ7K4Eh/7rj/RehyFhdECh9OePSeApS2W0/wB39Ud/6Ydv6i/+D9UPX+21uu77p7d+5J3iDs3Ft5VHGo4Eqdutmz/E4q+qMVaZqdvWv6s1fUFm8tJ/u/qzElz7g+M3f7jd823/AFGO2vbD3JurWaGY6OuPdihKk5UqMdlcS/8ASKy2dF+R6LHya/0UP+5+h94e8spkKyK8ZJpwIIrw+Rx4Fprc+cVsnqiPTeG+H3Nw93N4ls094zh3uXsLZpC/EMXMZNfjXFizXSjuf3s0Lk5Uo77R72Pwhi0KiRLHHGKRooCgfIClBiuepS9Sq/eHabeb2s9wx2wP/wAHtwOmvE9hq42cPI1mp70aOBRPk4/8S/M+Zv7INpFj7+WMykkNsm5KapSg0LpGof349P53J3caPaj2v1BRLjfajU/75fdvyHxbYtl9uPFb6babvzC3nuvId2tpGhuI9ujPbEMUqkFe69Q5BB0ig+o45PguJTJZ5L6qu3v/AIHG8FwK5rPJZSq7e/8AgfPT29/aV7l+5Pjw8v2iLbdo2q91/wCnzbhNJFNfmEsrtF2o5SACCKvSvI0GPScjy+HBfstLfs6HU5vmOPxMny7S31hbfihn8E8r9zf2r+59zLH9xtw2m8VPMPEnP+Xv7VjVkKqSpqjaopRX1GWRlyMOHyGHo52fVft1RdlwYufhTrrK0fp+3VH3W3nyPxTavEty95/sIrgbd4pNuMe5rGBdSbakP3wtw4BajMAQv+LHgqYr2usM72j2TseLrjs7/K6zH27H5377dPd79y/uxJc31624+Rb7M8wtpZWW22+wUaykSkHtRwghQFWp45knH0etcHAwRtVfe3+89dkvi8dg7npVfe3+8sby72q9yPaXYIfJ/KLvbt42dLiO1vZ9suZZjbySGkbMHhiIViQNQrnxxRh5mHk27ayn7SHjfP4eXk+XWU4nVb/iz6h/sn94rz3N8H3rxTyC+/1fdPCzbxw3U51yTbddowiWQtUv22jZKmtRSuPKec4K4+RXqoVvzRy/O8WuLKslFCt+aMQe4u3t7Re+G9w7WHt4fEvIYdy2nSCCls7JdxKDzpG+n8MdrjW/qeOp6qH+R6viX/rOIu7XurD9+x9nra5gv7S1vYRqhvYY54iOGmRQ6/yOPGNOrg+ZXpDafQT3222e4wNbX1rFe27nqt7hElQ0/wCVwRliePPajlODLm4mPKospM6+b/tQ9nPMe5MPHF8b3CQVN/s9IOCso1Q07VBqr9OfPHpeB9Xc7jad3cvSyn8dzynkPonh8nWs0fqmfHH96/8At3+4HjJHud7d3EXmmyRqYPI7QUgvbaKOgguHViEcEHS5WgFAaUJp7vxP1lx+W1TMuy3r0fu/ibPpzwfI4VXxk1ZTNOj9tdd/X7y0f2S/v+f2a8b2b2J/dDtm5bBsWyqLHwf3Dmt3litrQVC2e4BdTNHHXTFKgai0VhpUNji/UX0r/VWtyuE1adbVlffX39U+p6Wtr4X2ZE0/aa587/Yn+yj91UF35r7ebhYbLuu66rifyb293G2a2klmIcyXFkvdgDHiQEQmprnjznH+ovJeNfyrtwtIstfv3/Mk8NL6o+ffu9/s9+8Pi8F3u3tF53tfuXaQa3j8f3KP/Sd0KUFFiZmltpW4/VJH8Acew8f/APsSl2lnq6v1Tle/aVH2ma/C9D5yeOeZ+fewvmW4eM+S+NzWN3tV0bXyXwjeIDFNHKFKsUEiFopOosrLkQR9SnHsVysXKx91XVzs099Px/RaHnPL+Axc+rVprfpZfk/Vexlze+Pk+5+61n4fs/t3su53XjdxbLvc00x7SGZ9UUcUlXKKYRFIuTZ9PwxXg5NMSdrQ374/OHqc36R+luTx7ZMl6PvntWmnb6r36H2Z/wBtn9sexewPs7de9/n9rBY+eedWD7jc7hdEN/o3j0YMsUCtToMqr3pSOPQv5c/l31h5q/kOV/TY/wDTo4S/vW2n9F9vqe/4/Ftjfa18WxiL91/vV7q/ui8tm8Y2fy+68W9pTcC18d8A2gTfc7sdaiKfcdIUzPMT0xV0x5UDNVsdzwfB43jKfMuu7LGrcRX1j9/U7b8DkupyW7V+3UiXi3+2N5xfWMN3vk+27NcSRJM22bnevDLo1AsHSC3mMRpVQC1aUJpjZm+scS0rLXuRzX/x+Nw+6/tX8Wgj/wCFB5v+1rzDa/INqiu/Ad/Cv/ovle0zJJBdQhgzJ30UxzKfzRutSv1Liu/k8XksbrZVtXqmtv1XvR6Dx/D4HJrOJS1uuqPt/wDtl98tp/cN4dabrvO32tv574TcKm82qr0pNLC8aX1rWpVJ42daVyOpfTHzvynBtwsjrV/Bbb9z9xzfI8F8TJH9l7fuMJf7js1nF7q+Fm6hjdW8WALSLr1D7yfppQ0HOuO99NN/IvH979Dt/T9E8Vp9f0Mj+W+0+4bB7d+Ke5099ZXXjXmKxRWm36nFxBcFXIV4yjIy9GRVvwGO1h5qvltihzX7jdh52PJyL4EmrU+6D6W/7a0CW/tn7hRqiRn/ALoQuiClG+wt66h648t9Tuc1P8P6s4f1B/q1/wAP6s+YfuT4sd499Pcews4idy3Pz/ebexcsiBprrdJ40UlhSlZOZyGePU8TN2cajnai/I9Jx128etnsqJ/cibeZ/ta829s/FbvzHy59r2u1spUtodvgn70t7PK9I9KxoY9K5sxL5AEgHhijD5bHnuqUlmTi+WwcnKseOXOu0JIsj9lvsPYe6vuVJuvktiL3w3wGOHcL63ZAba+v5GJt7d1YEEKVLt/yjTwbGPzXkHx8PbV/FbT3LqxeY5f9Pi7a/wA1tPs6s1L+9T9zu++OXk3tD7Z7s+x3kcSp5j5VZMBcW7OgkSxtmXONmSnckGa1CrQ1I5fhPF1yL52VSui9fazm+H8XXIvm5FK6L9WfI+82syXUtw5dr6dtUs03U9GJLF3I1En1J/HHsFeFCPU9kCWLbpbK5hltWeG6t5NdrexMYnBAXQ0bqwKMCOmhqDniLtKh7EXRPc+uP7K/3Wb15XuUHs37pbk287lPA6+HeV3mkTXbQqWksblmY9x9FWjYjUwDK1TTHkfNeKrjXzsShdV6e1Hl/MeLWNfNxrTqvT2ox7+972A2z2l91xu3j1om2+H+4SSbvs6R1jFluEDAXcETAiiqXWRB+UPQcMdnwfPfJwdtv5q6P2rob/Ecr+oxRbW1dH7uhV3vr5Ze+4fi3spvt5KZ9xTxq9sd6u6iPu3lpemOQlgc9aaX+BanLGvgYVhtkqtu5Ne5oXiuGuNfPRbdya9zR9h/2d7ZPvn7N/CNmDi1n3javILKOR1FIzcbluEakheS6hwx43zFu3nWfo6/kjheUfbzLP0a/JGKoP8Aa788ijijPuj4+RHEsWoWV3UADMrViNXxOO1/7ox//Lf3o6r+oKf3H94cP9sL3ABLD3R8dBZiHQWN2FKnjXq+r44X/ufH/wDLf3oX/uCn9x/eUX+4T9l/k/7fvAx53u3mm07/AGk24Wuzx7ZZ200DVuWciRmlYr0Kp5VJxu8f5qvMy/LVWtJ3NfD8rXlZOxVa0b3Ml7r7g7/feGbX4O9+0/jPjV5cX20Wdwa6JLhBrYgkE6ACVz6dTUzOOtXj0WR5Eviag2V4uOuW2VL4rJJ/Yfbv9nvtV4v+272Cv/eLzsrY+Q+TbP8A9x+WbrPQvZbUkfetbOKtCKpR2XImRqH6RjxHl+Xfm8lYseqThe19X+3Q8v5Lk25ef5ddk4Xv9T5Te/H7m/dX9zfl/wBnA19Z+KTXZg8K9uNtZijBm0xPcqhBuJz9TE9KflCjHqeD4zDwaS47o1s/09F+Z3uLxMXCp3WiVvZh+3/tD94pNvJmuvHdquRGrttdxdSNKp4hCYYZYwaAcH+GFbzGBOPiftgwX+qOKrQu5r1S/e0yHbB5770ftc9wpJ7G4vPFN9s9Ej7Y5M22btal2yaONu3cRvyIzU/SVbF+TDx/IYtYa9eq/cdLv4/kcUp9y9eq/cfb7X4L++r9tYvrRIbHdb6GVbZ6h5tk8htVo0evjo1EV/xxN68PE/5niuXD1S//AIq/t+J5qtsnjuR+2tf2/E+H3tV7pb77S+8LePb3E9kLy5ufFvMrA5OJHdrZYyFJBeKcAg0z9aY9xy+PXkYO6uu1l+3uO35bBXl8Ztbr4l+3tRz9l+4yTfu69l7eeSXX/rN5S1YZRD7afTn8QOWWIebUcLJ7l+aJeTt/t7fYfbX99/7n7j9sntBFufjvZb3A83vG2fw3vqHS2ZY9dzfNGcnFuhFF5uyVGmuPFeF8cubni38q1f7vtPM8PAst4tt1PzXbF4n7s/uF8h3zyL76byDcbu4aXffLN9uSUed6E1mk1Fm0j6UB0qBkBTH0O+bDxaKqULokjo83yuHiVS29ElJa3mP7cdz9rPAbfzG+3iLfd7O7xWW5WNmpFpDDNG2jSzrqdi4+qigcKczXx/JLNl7IhRJV4rzS5nI+WlCiV7WfZ3/a985XePaDyjwGeVXn8N3j7yzQ/V9ruyGVlI4Gk8crGmXUMeO+qMHbnWRf2l+K/hBd5zD2ZK3/ALy/FGePN7Sf2f8AfPeBaRtEPFPJV3PbI+Gq1eUXMaj4GN9HyxvwP+p4ynrWH79j1vGsuZw0n/arD9+wD9vW0z+5P7gfE1vQb9Itxn8h3iZgGSlqWudT+muYqM+ZxLyF/kcW0ekL7f4FHlsywcSyXoqr8vyLI/3NvPx/q3t37dQPrWztLnf7+FTk8szi2t0b0IVJCPgcZ/pjj6XyfZ+rOH9P4tL3+wm3+2J5/wD654H7i+3l9Mks/i+9LuNlatUsLTcY9DKVbgqyQHhln8cZ/qbB25aZF1UfajP57FGWt/VfkfI/3q2zcP2+/uP8zsrJSP8Asnyua72i21apXtZGF5ZtnyaOVajhQ49Vw7rl8Srf9qsP37M69I5fFi21qw/yJH+xPwa492v3b+BT39dws/F7u68y8glkjJTXZEzwVHAE3bxnFPnuR8jh2S6/D9/8DN5PIsWDtXu/b7DWn+8v7oAT+0Xs7Z3K60S68t3y2DmtWJsrDUBlTK4OfwxwPpnBrfK/cvzf6HA4iibfcYX9sJ7b2x/b1unmLQj/AFS+Nzutu0maGRv8rZxnMGjEV+OeOnyl35u30OFzn87k9i2Wn6sgv7Fv25S/uo/cRtuz+URz3fhXj3c8o9yLlulp4I5RptWb1u52VDnXRrYfTjF5TP8AIw6aN6L9TZ26wfZH/ca/fBdfth2LY/ZP2VW02z3I3rao5ZtzijjMXjezisNv9vAQU78oQiMMKRouqhJXHnuDw3nfc9Uh2tB+djb/ABX3J93Nw3Ty2/u7ve7i6nL7z5dvdzJK0sx4l55C8kh+QNMeix0iFVQkYs/Kpi0s9fQcd89kfPPG7Ft6FtDu1laRrcXV1tUrSvbIakO6MqOKUqSB086Y1Y6UlKyKsXOx5HEwfYb/AG0/38+U3HlGw/t396d/n3+w30/Ze2/mO5StNeW94ATFt91cOS0scw6YWapVqJUqRp5nmfE0rR5caiN1+qOsl8JTf+7P+1zbvaj3A2X3r8J25Nu8N90bmaHyPb7dQkVn5CgMzyIoNAt5HqkoBQOkn+IDEvEeQeXH8q71rqvWP4fkV5bNwfLjyLymXya08U+9cTXu0baNuuXzDOkMshhLEnM6GAqPTHbwW+56lHGoqWa6Nyfrr/ZJuFptX7MvY/ddynS0sNt8NS6vrlvoihhMryOaclVSceH8inblXS3djY5bPiZ7mfuv9xv3R+81zZWzbgviA3Q2Xt57e2Tao/tBq0XE0aZSzzAVkdqhQdK0UY95wfF4uDgbtHd/at+3Q9V46mPiVdrwmt37C7vd39p/mXjHthufuD5HcbXYJtotlG1WczTzstzMkebBUiGgvXJmzFOGKOJ5bHkzLHWdepow+bwcnMsWNNzOr0W0+8sX/ad25tv8/wDfEGERCXa9sIrXuH/Mz5uCTQHiueYzy4YwfVjmuL7f0OX52sOj9/6HzY/3M0Zv3n+7hVC1W2pRQVJJ2224CmLPE6cSrft/NnnLp7n0t/26/wBkW3e1Hjdp+5z9w1vBs++2lidy8O2Ld6QRbDYxqz/6nfrLQLcFM4w39Neo9Z6OV5Py18y/p8e2zj+16JftqXVyWdVX7P3GL/3y/vX3j9zvlK+E+DS3dj7N7Dd//ELbFVo5t8vYyVW/ukHURU0gi5A6mGs0X03g/DV4dPmX1yNf/wBPu/U6/EwVx17nv+CJB7Bft5g8N2s+a+XQLL5lMEFjt0q1ba2Joa6WJEpU0c0olSONcR5/P+a+yn8v5/wPL+Z8r/UN48b+Bdf738Cp/wBwNtHD+4O2SaOacw+JWhmKsHVXmuJmqzAACPkMuHHFvi9VY6v0bX4rM+63iVqq/wC3bNZvIXX/AOE7u8TSyVUkHbLkVNKkfhjyGV//AJWf/wDKvzRvza8//wA6/M+EX7dPG7619447i3lnLjYdzVpBUnsiJM0rXpoSKE5c8e38pdfJn2of1Tx443cv7y/M1B5vsFsIrxYFmeEyi4Xb9KrIiqAwcTadLJIcqA58vTHCrc+aduoi8I863bxa+urCdxa+NbxJEPJ9stInkU9ughnt2QELLHpAkAzKivHCtjTJ0t2lkbr5g0aXEMN3ELZ3iMFyIJZlvZmiMi9Wa6AoNVRaHTn1VpFU1J93UoXyryKFr2OftQW8F1A8KQyv3hBMAUldjQFNTD6iKVPTyxqxVMWV9D7S+4HgnjPhHiu42uzxd/yLfZYdo2e+v2DsGuSA5RaU6FBPw9RjzGHlXyWl7HfzcWuOsIubxDxqDxvYNt2iNIkSzt0BnjqC0lKyMW9TXOtfXGTk5u+zNnGxqlQHk2oqnbHaIAJlpWoHVz4U9fjgwBlcMjMVhHuezT2Eh+4ScmWMVbpPKmmtc88Xu/baStLuR+cL/cM8cuLL9wO8I0DJr2fbqiQEh9MTZgilBT1GXxx77wvx8XT1Z3vHcXu4c+1n2r37fd+8U/2udp3/AMY3i+8c8h2X2I2G42nettuJLW8tZk2e00yQzxFHRhyKkHHz/k07ubev/jt7erMll26H5vdu/db+6e5leBP3De6NyJVAJTyneHMdCKOaXJIHI49Hw8XH+ZFqVdbQphfC+j22ezghTIq6WcJj5N+5H938ZUv73e7i5c/IN9WoXmAZ86jHUfF4r/8Ah19P5V0+zqRtnrO6D90/dD+7C32Owa799/dKwaO4kU3UnkW8wlwRkpczjUR88SycLi2xqMdZn+6tvuNeTLS/HrEdybmN4Pu1/tKe5PuF7m+znuVu/uL53v3nu52PmK2tjf7/ALjc7jNBCNutnMUcly8jKupi1AaVJOPI+fw0x5a9iSmvRR1foQblJnwD99r59r/c572bjAf19t90PJbuEqPzRb1cvTPL8tceo4MPBRf+FfkPGk017zTf+3Jtth5V+8L2ii3CASxWc+67tbrIK0ns9turuFqUpVZEUg/jifnMscG8exfY2jtZsqfGceiP0Q/uH/a54V+5GXxQ+beR77tdr4j9y+22G1TxQxPLc6A8kokjk1HTGAPhjxHA8nk4Xd2JfF6nO4nOvxZ7I19Skts/25vZnadAtfLPKyqVor3dsePHMQDG5/UfIfSv3fxOivqDkLpX7v4ktg/Yv7UwIEXyPyEhRQVuYK0/+xYqfncz6V+4sX1JyF0r938RT/8AOQe1tKf9xeQZ8/uIP/2WF/zeb0RL/wBzcn+7X7v4mi/A/bnZfAfBk8AsNxut02WNbmKJr90kkWK6LF46qqjSNRoKY52fk2zZPmNQ/Ycflcy/IzfNaSem3sPjR4JsC717hbR4fdkW675ez7LK5pSJp1kiUileD0zGPZZ8nbid10Un0Xl5vl4HkXRdxPPYDzC89q/ebZk3Ym0t7q8l8b8nifpCCaTtFn/+VzIrfgRjPz8S5GBx6Sv29xl8tx1y+K3XXTuX7e1Gqv3xeBG72fxv3HsYSZtml/0ne3Ucba4Oq3dqcklqtT/jxy/CciLPG+uqOH9M8vtvbC+uq963/D8j56Wzb35TeeOeOW0kt/dVj2nx+2qW0/cXDOkag8u5Mx/HHffbRWtt1Z6xumJWu9Fu/u/gfWH3O3ax/b1+3iPZdmmWDcYNvi2DY5VNGe9ulImuBzqKvLX1448rxaPmcqXtMv3ftoeD4VH5Dm91tp7n7l0/QxZ+0PwVfKPcc+T30WvZ/Bo1uldhqV76bUlsn/vNGf8ADHZ8xn+Xi7Fvb8up6H6i5vyeP8tb30+zr+40t+9e5C+0u1mtAfIrUANz/RuM6jHN8JWcz937jhfTL/3T/wAL/NDH+wiQSeNe44FOjeLKoBqc7WueLPPKL09z/M1fVH+pj9z/ADMVe5V5Gv7gPMkZgtPcC6Az403M1/hjt8as8av+D9D0XEt/s6//AE//AEn2rmvNM8wzorNVhmRnkAPjjxKqfL+8bpb1GEiiRFCMNStwbjlXLT8cSVCLuIbi8I1Ki6ukstOApmtK8TTFlalbZhb98ssU3tp4ezdyOVvJlZB/ikWxujkCP41x6DwCjNb/AA/qj0f0vryL/wCD9UPv+3RG6+Ae5EjGom8ojKg5kBdvt14860rXFf1K5y0/w/qzV9RL/Np/h/Vnyi9yPBbXdv3KeUXEanbpZvc26Z7mMmikbqx7hHqxPyx7Di8iOHVP+4vyOjbCnw5X/wAv9D63jfvdT29vZZ7K5/7k2WSZhFCTWuj0JPAA48g8eLOoahnyit8uFaMs7xX9x/je5P8AYeQQPsO4KoUxSCoLDIgA/HLGLN4uy1o5NWHyM/zF87X5Tsu9xiXbb+K5jfNdJoTUVoQaZkY51+Nem6OjTkUtsyP+6zq3th7iUOX/AG9uA/8A0D4lxV/nU96Oj49r+ox/4l+Z83f2ZKB707eRx/0e/qK89C49J5n/ALf7Ue3+ol/tftQ//vmjMvur48GkJRfG0AiOYzuZanFXg3GG3v8A0KPppf7e3+L9DaPsBZwD2W9uV0gD/RoyUpkWLuSSD8ccXyFv9xf3nk/L1/3eT/EfPH96G2xr7xXWnSnd8fsC7qubH9YDhmaUH8Mek8Jf/I+1nrfpun+0/wDM/wBDcG/rI/7L7iNmZnb28hQtxJBtkFPxGWOFi/79f4/1PPUr/wDkI/8AH+p85/2bePqvutuOhFjpsFw0LoArajLECVYj6mAoT+Hqcel8zf8AyF7zp/VOP/ar/Ev1NY/uk2BJfYz3C1RhCbSKaCOhLjTcR/UV4svGnrjleLv/ALinvPJeEpHNx+/9Cg/9s43tv7m+5VjJKGtF8Zt2VQa1ZLtAjZ15OeeNv1Prio//ABfoer8//p194h/eLdJF+4PyyMMihdt2xnXOpdrYUJp6gUxPwtZ4tfe/zOl4C8cZe9n1Z8AvBJ4L4azyk12SwLsTU1Nuhzx5PkVfzLe9nheXdfOv/if5kx+4i5ygGmoZ8vjiiGUK6BfcoRqDajwp/wCdcHYDsjNXuT+6j2V8B3G+8b3zdLjf9ziBg3PZ9ptPvVUMCGild2SCtKgoXr6jHU4viOTmStXRe3T+J1ON4jk56q9VC6NuPt9ftPmP7kSewfuTuE3/AMLfdZ/AJtxl0Js3l1oG2fuu1VaG4tnumt1J4iQaRyoMev4VuXxV/mfFHWr+L7tJO3bFya0jkY1kS61/m+5pT9mpSe/ft595vba9bfNt8NXbZLQGa28p8V1P2UNNMqTWjB1OeTMBUGlKY69PN4uTXtteV1Vuv2MwYsfjM9tIrb0fws0J7I/vz9zfANx2/bvcu+k9wPB5JhBfT3GqTebGNSEklimIDzdviyTVY50YZY4nk/AcfPV2wrsv7P5X9nT7DZm8JR1+Bw/bsbF/er7J+Fe7ntZF78eK7ft25eW+G7Wm87X5HFDHI1/sZTuyoXKkntxsZYzxFCOeOH4Dymbh5v6ezarZw16W/bRnK8fWlc6pkru49zPi5DfFZrW1Q/p3YSFrPSUiVZJc+mNl08zUUNce2yXtaWz2eOlaV0Pun++HdZfAf2t7lsuyD7e1vp9n8ZolV0WbOoZQRwqkOn5ZY+feDp87mK1uk2+08l4ivzOUm/a/tPnj+yfabHc978p8svoEv7/xeG0t9kgeo+3ku+4ZZuokK4SPShBP1N8x6PzeSyrWiejmfsNH1Ryb0pTGtrS39kaH0aO5tJI0LS9wIryxjm4cAZMaArTLPHm4PESVj7yeOWnmnth5hs16nf7e33F9YFqGW3urSNpkdGB6SCKMRxWo541cPK8Watl6x950vF57YOTS1fWH7UzGn+3X5VuG3/uEi2iKRm23y3x++t7oKwaM/aqLqI8Selo2A+Z9cuv9RY1biy91ZfuPcedonx56ponv+5ZdND7v+CRl9EMnig1mjHq+9n0k6eCjmTlin6Z/0b/4v0KfAf6Vvf8AoVt7mOqftI9kIGgKSx3g1FGrq/TuMiADQ8Pn/HGri/8AfZf29DNwHPlM/u/cbT/20pC/tj7hqXMhTypauakmtjbnmTjifU3+tT/D+rIfUH+rX/D+rPnV5TNo/cj5Gh6Xj90rmtCD0nf2K1Apx4Vx6LF/2i/wf+k9DV/7P/7f/pNlfvo8gni8e8D2tZVMO571fT3MClgK2kKKo45j9djljjeCxzez9Evx/wCh5j6UonkyW6qq/F/wL0/27dttYfZnf94jhWO73byi6juJAKFktYIFiHwC6zQYw/UVm+Ql6VX6lv1DdvkJdFVfqPXkX7Ffa/ynf978l3fy7yefdPILye+3GYXUADS3DmRqfo1oCcs8V4vO5sdVWqrCUbEMXnc2OqrVVhKNhmP+3v7OEFR5L5KFI0uPurfqA9f0KnE//cXI9K/d/En/AO4eR6V+7+IFv9vT2aZtR8k8krQUH3NvTKlCB2eVMH/uHkelfu/iH/uHkelfu/iO3jX7DvarxPyPYfKNn8p8lh3XxzcINy26U3NuQJoHDjV+jUhqaWzzBOIZfPZslHS1aw1G38SvL5zNko6WVYajb+JHf9xfZYdx9pfEd2WNJJdo8piikl6CUt7qzuQ9NWebxxjLF305eM9l61/VE/p+0Z7L1r+qPjJcG4ubK2snfXb7a1x9kkoyBuWDyH0FdIrj2lYlv1PXKiTb9Y/A+6v7Ubm4279mvjF5YSmC8sdn8kntJ0pVZY9x3BlYVqKhhXMY8J5dK3PsntNfyR4ryanm2T9V+SPkpB+7/wDc3NCkq+7W8VjYNOgtbJiQoqygC1rT40qces/4fh//AC1+P7z0j8Vxl/YX3v8AeESfvC/c0GMY93t6DvTSv2liSo4VI+2FK/yw/wDhuH/8tfe/3kf+M4v9xfe/3kD869/vfX3Z29PFPKvLN4812driK6t9lNpA4NzCdKSKLe2V9SFiONK4vw8DjcZ99Kqr9Z/eyzHxOPx331Sq/Wf4lTeN7Ku4e4Hh3i+82728m4eS7ds+72k6AMhnv4reeGVABRgSQ1R8Mact4xWsv7ra+4syZF8t2T6Nr7j7e/7mPkd141+3Cw2HbKW9r5R5Lt2136r0j7O2hnvNAA9ZLePLhSuPEfTeJX5Xc+ib+3b9Ty/hKK3Il9E3+h8+P2P+L7bcw+aeaT2pm3iwnh2janOhuzE6d2d1JFULkgEjkKY9B5vJaa06PUq+q+TZOmJPR6v9DepuJe4rfcxvJbvpe6VgNOo01MABWp5c/hjz8Hj04MpfvC8f23d/aO8325tw954Rf21xtV4CI5hBPIIJkZxkQ4kBI5Ux1fD5HXOq9Lbne+neRanLVFtZOfsUoln+0t5le3e7e9Hhxkd9tS32veYo3BUJOWlgcqp4F1KgnnoGIfVmJJY79dV+R6DztF8D66owN+/mzg8P/dz7tptg0Sbhe2G7wMraDDcXNrBPIy/HudVcdzwF3k4VJ9q+yWbPHZO7j1T9qIx+xC61/vB9klLuxbeZ6F8ya2VwTX0pTKmDz7jhX+z8yjyeX/KaN5/70NxOrewUIdmgX/X5O0MxqIswW9eAxwfpPR5H7v1ONw7OrbX7bmfv2lxRt7TbMi2/fR9y3EywsAEkl1hQJC1QGAAGo8BjpeR/1X7kea81rynr0Rrvyjwf/vj228q8ZjtYvuNw2mU7dIci13aDv21TSqgSIAT/AIfnjBhz/Ky1v6P8A8Vn/p+RS/RPX3PR/gVx/t1+Tf8AanvBYbbJW3tfNtqm2q9jcFQLqMfdQgA8M0IA+Pxxp+osXzOO31q5/Q+neawfM4rt1q5+zY0J/uAeODY/MPGPM4olW38m257S8kOQa529gBqI41ilWg/5Tjn/AE/fvpano/zK/pzkzitjf9lz9j/iOn+3T4sLzcPc33BlhIjtjbeObXKw/MQLq70kjgP0RliP1HlhUx/a/wAl+pm+o+RPZj+1/kv1Pnl+8fzmb3H/AHJ+4D7XcPcf6ZuaePbT2lq+jbh9rojBqG1yiRhTjUcsd/w+D5HEpOkqX9uv5G3x2NYeNWfSX9uv5Es/27/cebwv90G0+MX10iW3uHtu4bFfQ6gT9xEn3tmz5/UGgaPLnJij6i4/zOJ3L+y0/wBH+Zm8xjWTB3ejTHz/AHb/AAJvH/d7wj3Et45EsPPNi+xv5lUFRf7RJo1E0+poJox8kxR9Lcjuw2xv+y5+x/xM/huR/lWxvo/zLb/2evbkjb/dv3dvULvc3Fr4nstwa00wKL29pUUPVJBmPjjF9V8ib0xLpq/yX6mPzGWbKk+39vxPmV++73Em95f3b+5dxt8n3tltu8ReIeNiOTUjJttLPpyyDzh2p6scdPxWJYeJWff95jVljxy9h3/cvBH4p7TeMeLWMgiSC7sdsnRQulo7WB5FdgvMlK0PzxVgm15PNcGzvmduurPoz/sobDYr7ee9/l3YT/Vdx8k2/aZLmn6n29nZ99U1H8pa6Y0x5/zmR2yJHWVu5yfHz94HlG4+5n7vveu/3WVhJN55fbDZ1Zm7dltlz/plqBxpSGBSQMq1xv4dEsNV7J+8oyWiWaUs9usNmsbfZ7LRZ2W2QrEyxrRRpyBYDpBNKVbPicdE8rezs5e7JxsVpFr6Kmd0YGONBoMSmpB1DSQxFOrjiNmOtTBfubBF7ee727TeKTvtb7Lultu20dige2mIjukMZplocgrQZUx0sbWTFD1lar8D2PCy92BNvWNfyP0df7kNla+ffsL8j8l3CNY7q0t/HfJbOgr27iWeBWA9KpcOv448FwH2chL3oV9j8o6GmY5/Tj2OO3Xp0KEfrU9jpni/2ztgmiYo6+0O6FWj4itrdDL8MeVyw/If+dfmbcet170fDv8AZbNDbe/3i11pCO2zbjGxTmRbFDmKGug8s8+ePf8AmP8At37YOl559vGn1aPt/wDuGuW3r9tfk9pcTLcya9sVaaj0/cwOCD/5gf2Y8d49dvLq17fyMP0655dPt/JlF/7ZO3/Zede8ZW0MCSbZtx77U1St9xNWpqSdPqTzPrjZ9TuaY/e/0O99QqFT7SwPFv2q+2/ur++f3t96fPN22zyW79uty2eLx72zLB5ILv8A0y2eHc9xhYUZAQft1zUspZvpAxy8vOyYuHjxVTUp6+yXov1PPX/lr+3qYT/3Yv3Se59/57d/twt9k3Dwb262eO3v9yubkduXydn6orhHRiDZxOCEUGrOpL0KhV2eC4tK/wCc3L/L+K/b253eGZm/aT7c+M7pZN7lbreWm77rtd40O2bHFV2spY1BE8kbAapDUGMHpX6s24ek5vKu12JQn+Jj8p5PJHykoT3fr7j6UbNePuTyzRSQs0rAhwCzaBKKxsAp+rgfxOONZQcKrnQ+bHv5uEN7+5XdYQ328MGy2thOqZs0cAbUqg/mVjUDmBjueJSi/roez+jra3XWT73eGxl/9vsRFRIX9odzXSRUNXbbigoPXHi83/8AM/8A7i/M6OVf/kf/ALi/M+VX7Wdpt9w957aCTXCz+O7mVilBGmQJEI1Z6gAEgGnPn6Y9Z5S0cf7UdD6ox/7J/wCJGivP/GGgvNwttwtx3Y5iJO0WH6TatDEZdKMCdIpyIxyMVz5beiRljfdvk2970xTSTWBBaCYKyy6lk/oKsgJJepDdPGvIY1JmW1eoypuV9cRW+2oZrSawE7bXEZV1rcNEySWYjBoA7Hp1ACtADnlKtVIm4RW277hfETR6FtrESyRiEjssxTSZUlQnUdDddDkac8aaGa+p+hHfZ4vJvdq12iRY32/xCxSe7jc6it7ftqVek06YlB/E48fgr242z0+S3dcvaKMLGpVqlOlGy0leXCoNOVcc5uXqbloiHb2A9HepDA92StSAKgEKBQn541YdEZ8u4l2m3mjcxOVmftVeZRQyA8yh4enzw72ClYPhj/uWeL20nvhe38duVY+ObYXeFaEERnSGJNfq9M8e5+msv+3S/wDEz3HhcafCX+Kx9F/cOJ1/2snhYaZF9iNmRlNTQjabUHjnjycT5Rx/8x/mzz3IrOSyXqz80PswP9O8wv5GYqsO3M+TFNSd2MtwIJoM8eqXGWHO1GjWn6nmPqKjriS/8S/Jm+/EfJbnc44Nqvrj7ndLSMS7TJJJIBcWwFDB1kkH6gTTgRgy4+1yjgYcs6Mqz90s8k3tlsx7ksMEHknajhYkq5+1c6kBJqQMmPL54OPpZx6fqeg8Vpe3u/U+n3+yvUexvu0ppUeeDh//AEy09MeY+ok1nSfp+p3abHxF96bSPcP3We7dlJ/Svvdrf7eUEdREu+3CEj1yPDHouHaMFH/4V+Q3btq7ehbH7MfN4fZv92vtdu+9v9hY7f5LPsG/PKdC243FZtskZssu2Zqn1GLfJUefhWrX0n7U5OnW3zOPNXo1J9cf92bwHyQ+Pe2/vD4/PfpY+Mz3GweUi0nmjSKG+KyWk0giIovdVk1Hmyr+YY4f0vnp32xWjXVfZua/CZaq7pbrsfGPxzyHyqfdLS0tt13Se6LrHDGNwnV3Z8glZJFBOeQx7K+OlVLS+49Nd0opaUe42V4r4n752sH3W5+MeSQwQxd0yTTSgdo1k1u3dpQDgTjmZM3GeidTPj8pw24V6ySu13zcnAru940iEmZlu5XUEcaOrlWp6g4qtjS6fgdvGqtTC+40jZ/t+967vw+Pztith48+3ndu9fbq1vKtqEMmt42NVqoqBzqMcy3kOOr9m7mNEc63l+Isvyt7TGi6hX7WrOy3T3x8QS9hluPsxeX9uE4LPb28jxu9fygip+ODyjdePaPYvxF53I6cO8exfeyQ/u78KHiXulNv1nC0O2ecW/8AqUMiVCrexkR3QHoSdMn/AL0TivxGf5mHte9dPs6FX07y/ncbse9NPs6fuN4e3m52H7gf28RWO5zJNebvtMuyb66mpi3C1XQJedDqVJh8xjh8ij4nJldHK937aHmOVR8DmzXZOV7n+0GPP2fe199uHurvu9+QWLQr7XyS2skLrRf9WcvAoof/AH2iuw+anHX8vyksKrV/z/keg8/zkuPWtH/qa/8AlGD973ucvkPuHaeF2Vxq2vwWLt3Ok1VtyulDzHLnGmhBXgdXri3wnF7MXe97fkh/T3F+VheR73/JGuP23+Ef/C/9rNltbi3Ee8eSf/FfeQoOpXuVUwxfApEFFD/bjkeSzfOzNrZaI8l5rnf1PJs1/LXRfZv+JAP3nrcXXsyl5ERo2XfLGe6LN1GKQvbkD5NIK40+FhZ49UzV9N5FXlw+tX+8yx+2z9zvjHsVsvllhv8AsO5b3/r+4QXdtPYvFSOOKHtEOHINaiuOp5Lxd+Xarq0oXU9H5bxt+Zarq0oUalGbl5TH7ke9su57PAbVfOPNBd7Xb3FNaLd34mVXK8GCtQ0OeOhXF8njxb+zX9DY2uNxIt/Zpr9iPthc7vGsjhX7auWJLU6AzGgJ9STlzOPEqh8rV9BI+/jSWl0MbcUkI4GvAUpQk8/TEuwJCV3iNh2ncMDIDE4ALUyrUjIUrhqgdxjf97N7FL7X+KHXqaPyZAlOamwuqlvX0x2vCL/Ot/h/VHpvpV/7i/8Ag/VE0/27tB9v/cVlpV/KI2YA8K2FuQKDIU9MZ/qP/Vp/h/Vmz6j/ANWn+H9WfPryoQD9xe9ymMBh7iXI0VoG/wDimRmMh/HHocH/AGi/wfodxKeF/wDb/wDSfYC92irsyAtKGdY5RRSC5rpGRBFefCuPJVywj5Z2SisfKfbrZd87slxt0ElymiOK6UKJU6gS2ZoxJGdfwzxrxcpoz34qe5U9x7feU+N3lq3ju9yraBAChDqWkUEARZBWrTVQHKtOONSz1stUZrYb02DfLfdfz7Y/bXz623vaZNys4/HNxSWda6kZIGLAgkilQRXkcRxcbFfNRr1X5nU8XyL05OOf7y/Mzl+wH3B2vyv3vsLW2WaC6XY792t50CsAI0Ncia8aH443fUHHePjz7UfSPO5+/ix7UW3++m+gtfdbx5JXCM3jkZFeGdzKBny/HGPwVW8Nv8X6D+mrRgt/i/Q2t7AbhD/8Jv25QuCf9HjzBBAIZ6jHF59H/UX955Ly9v8AeZP8R88v3m7lE/vFKUOpf9AsArDlQzVrwx6LwtP8j7Wet+m7/wC0/wDM/wBDcW9zIP2YSz1DJ/8AC9gap4EG3T0xwsa/38f+P9TgUf8A+R/8/wCpgz9me726+7O5akqq+OXSyTf4ayx0Wp5Hhlj0Pmqf5C96Ot9UW/2y/wAS/U1z+6HdLdvY33IVUXQ9lExhjNGYNPGpyyqKmpzy544/i6v+pp7zyfho/rcfv/QzF/tu3MU3uj7hJAAyJ4ulZ61LML6MEVOeWOn9SqMNP8X6HqPqD/Tr7/0KO/f1uR2/9zPlDQTGKf8A0baiaHn9t0k8hjd9PVnhr3s0+FtHGXvZ9Gvb/wAxuY/AvD6XDTgbNtsjyDip7CZDia51zGWPO8jEvm297/M+d8u7+df/ABP8yX/953w/TW5EzRliShzZqiiEVJb0z/8ALFHy0Udz6kf8j9wdytPGvJ77bZ+/uFntl1NbR1ZDHcRwu0aCtBUMADyGLcWKtr1T2kswNWyVq9m1+Z8e/wBv/jkfvt7tbN7b715LNsUfksd5cyb9DGlzMbq3heZQVkI1mRlNSTx449j5DP8A0eF5K1mI0Pp/N5L4+J3SmI0LM/d5+3OD9tB8GubPyi98p23zJr+C6v7qzhgEEtsIm0HtEhgyyFgppwNMZfD+UfOdk0k6wZ/HeRfK7k1Ee01B+1X3U2/y/wBpdlsPvYrvyPw4z7bewOQkohjYmA6T1Fe0aA8KDHM8rgdM7caW1/eeN+oOK8XKtaPhtqvT2/iY4/eFvfgs3uZtL+JT20m7x7XMnl/2saEG9MwaFHKUjMhjFGIqa0qcsdnw6yLC+/adPcei+nFl/pn3zE/DPp+6T6uftumuB+xnxm48o0xwf9kbzJLrPSNvreG35Ll9vp5DLHkPJx/yNuz+8vv0n8Tnc2P6t9v95ffp+p+d6G9nWFLqNYxNbrHISegOymo0nTUBgozyz+ePodlJ7TeUz9FXvN48v7ov2e/d+Or/AKluu++P7f5P4/BGSzSbjZItwYFKaSWLK8YApVsfOuHk/oOdFtEm0/dt/E8Vxr/0nK+LZNp+4+MH7ZveeD2k8zvrPf5Hsdi8jiS03Voll/ys1tI5hlZNINELOrLTIHhlTHs/J8R8jGu3Vrb2nb834+3Mwp0/mrt7Z3X7j637bu20b7aQ32z7jb7pZSgT7fuNtPrSSFxqJDxkluFaZemPJXrajiyaZ88vjvjtFk0zLv7lfffYfG/Et+8I2Pcob3zHyW3axnhtJRJ/p0EopLJcPGQusrkig1NdR+PU8ZwbZLq9lFV+J6LwPi8mbLXLdRSuuvVobv8AbQ9s903T3E8o90LpGXY/ErB9psbkAKs+43wTWgoOrswKSczTuDEvqXkquOuLq3P2L97PQef5CWOuNbtz9gP/AHL4kPu94HNKaInimkDSGBJvJ/hXB9M/6N/8X6D+n1/lW9/6Fde5luv/AM6B7FnulZvvEVmCaif07imRzAH8MaeK/wDfZfd+4z+P/wD5rn937jaH+2hI0ntl7h1QoF8pRVqak0sLfM4431L/AK1P8P6sq+oP9Wv+H9WfOHyp9P7lPJIHzgT3TumIFQ1X39uXE8fl6Y9HiU8Rf/T/APSehr/2f/2//SbY/e9sEl/7c7FvKByPHN/C3TqoLiK+QxhgfTuIg4cTlwxxPCX7crr6r8jyP0vl7c9qP+1X8v2ZYP8AtueX2134P534LJKPvdn3hd5tkbJpbbcIljZ6UFdLwUJ+OM/1HhayVydGo+43/UOJrJW/RqPuPn978eL+Se2Pu95v4tebhukdsu5TXezPJPNoewu271tKhLgEUbTUcGDLxGPQePy0z4K3SUxD96PRcDLTPgraFMQ9FuiK+MeM+5HmUMsvi0O9b8LRlEyWV1NM6dR0akD6jq48KYuyZMWL+eETz8jBg/1Gq+9CzyTxX3Q8StfvPKLLetihnk7UEt3dPGZGHNV7obnwAwseXDlcUhiwcrj53GNq3uO+E+N+ee4/lWyeG+JXN/uG+7o7diNruZIwsUZeWSdi1ERQOJyw8+TFgo73hJews5GXFgo73iF7ESv3h9nPdH2et9oX3FubU/8Acc8jbbtkW6NfO5twNTtHU6VXWKH1yxTw+dh5Lfy1tvpBm4nMw8lv5a29kFYbzttlb+KeH31vE6Xu8/6q16ZclkEFxHHGY8qUAJBrzxrpZu9l6QXY7t5L1ey7Y+1H2e/bGQ37MdjKp2abD5MNA/KRfbgOWPFeU/79++v5I8h5P/vn76/kj5I/tZto196vBlZfuEaO7/ysqKUztJGEjawRkwyGPW+VbXHt9n5nd+oNOHd+78z6xz7ZYgyKm22zyajT/LxCRg5NdVEFRx448n3v1Z83d36v7xkFtbwMrxW8dpIs40XFuqq4pw6lWtDzpzw5kqvZvRs+Lvvbb33t3+4Dya9jh+4m27yW18l28Ci9yssd/H1BcmMgYGn449nwozcVL1q1+h9J8VkWfhU/w9r+zQ+0n71fDR+4D9pknkvhcZ3i42uLbvPPHI7ckvPbxwMZ1QLXU32txIQp4sAOOPGeGzf0fN7b6TNX+3vOF47L/T8mLab1f7e8+OH7XvenbPbbc918e8nu/s/HfMJophuKIBFa3cQMaGf/AOROhoSMlIBPOnsfKcG2dK1P5q9PVG/6g8bbk0V8etqzp6r2e0+pkF1ZXlrBcWd3aX9tNEFt7iGWN45EfrWQSKWzpnWuPLWo04aaZ4C1WnDTTPnj+773u2q92n/4VfjO72273FzerdeWX9u4kigjtyWW1RlqGZm6nFcgP4eg8PwbVt82yj0/eet+nPGXrf591CiKp+3qbX/2nvazcvH/AG78+92t5gkt19wb+Db/ABlpk7Rl23au5ruVBz0SzzMoJ/8AfdeeOJ9U8pZMtcS/srX3v+H5mnzOdXyKq6Hx+/dH5tB7yfuo9yt92qf73ZvI/KBtWz3sYJLWVkY7JJIwuTArGXB9Dj1HjML43Donv2y/t1NeK39Px5a6T+ov/YS9f3k+yUYzEO83MYIJyVbO4ArXFHnXPDv9n5oxc3J3VN+f70rMtx7BaDRym/Ba1HOyqa8scT6UnuyRvp+pz+PZp6blR/s0spJPaTaC8StDJul9IXkSof8AVKaeqoqSRX+eOn5PTM/cjz3l6v8AqX7kfS/wTbFu5LSTR3TbiMhNPXKlSGVgVUU5Z5ZY8/nuVYqmEPJNun9lPejep7JJIx475JFvm0oRppA8q3cPKtGVqfLLHfpZcrjpPrWP0PrvAuuXwqz1rD9+x9G/3vbTaecftom852pFu4/GmsPJ7GXRrY2U6iObSPjFPq/DHmvB5Hh5nY+s1+3/AKo8z4jI8PK7H1mr9/8A1C/2+x2/sF+yyPzS/gFndweObl5pfJIwOqa6R7i2Us3HUnaA+dMLyLfL57ovVV+7T95Hn2/qeY6r1VT4k/t5sG8297tiu9w1X0FrczeRbiZSHlM1uO4HYMcw0zqCW9ce28lZYuM0uui/b3HX87nWDh2S6/Cvt/gVZ5RuN37HfuHn3zaX+1XwTzC237aVFSxt1ukvoo2FBWkTUouJUX9TxIfWrT/IXGzf1PCVn1rD960Z9sP90Dw6y9y/2l2nuTs8Yuj4Lf7Z5NZ3QUs52vcQttPppmARcRux9Fzx4rwOf5HK7LbOU/s/aPtOBwsvysmu3UmvsIlv+1f/AG+Nv8t3WAWW5bL4TfeZ7lCzLWTct0R7u2hLcKlpYYh+GKObd83nNeto+xaFWfI8uVt6H5t/Yvbrny33d23dNyuWuTaSXG/7tczLVZJozr1SVoNTSuD88ew5EUxwtnoYvJZfl4Wk9zR/7mrH/Wfb3cbmNHd9o3C33DtstWC0aFyWH0gLJXjjDh0epweDeMuvVGzf9k/3JsI396PaK6mSLc7o2PlmyxM41TRRj7G80r/8jJgrT/F8McPzVLN1u9tjv430MD/7jntDvHst+7bzvcktGtti9xNwbzfxO+AYxyHcJe9eKC2WqK77gKg5Lp4AjGjg5/mY6qdtH9n8CF67+0f/AG28/wBl83sLe4tpba23aB0+92mTtqYnOTM0bU1xmpKsOfIGuOrMnmc/GtitD26F1bj5RsHgeyy755DukFjZoCzwzsJpmm1VX7eEGrM2mgpkK+mCtHbYMOO13CRhX298T8l/dB+4bx/xXZ7KSHcfcHyGJbhIAZBt226w1zMW/wANvbqzGvpTnjVyM64uB2e6X7feepxL5dFRbr9mffD/AHbvP9p8A/alt3txZzi23D3A3nb9q2uwWhb/AE/adN1cNnnpXtxIT6uMeO8VRvN3Rot/yHfY/L2EdRG5BRHr22I40NDT1x6nG+7VaR95TOp+sz2SP/8ArF2I5n/8T+6fD/5luseWv/33/nX5mvC9a+9Hwe/aU8sfuzsM6sUWzs7qYkk5JRNRB0kivqMfQPKr/bfajp+e/wCxn2o+3XvJe6/YHyiMsQZZrFY5GIPQLmBlUn8xANB6Y8pwq/7mv2/kc36ZtPMp7n+TI/8A7dlukHm3uq6ADu7RtpoBThPMONTif1G5pT3s9N9R7U97MK/ur96PPv27/v68/wDdH29utN/Z/wCmpvezTFzabnYmytxJa3SAiqNpyIzRqMueOp43gY+X42tLr116py9jBTjLJxU+v8WfSH3B8F9kv90H9t23+SeMXUWyeZbekh8d3idUfcPHd5VAZtt3AJVmgkNNQGTLplTMDHlq2zeMzutvt9GvU4l6dGfnRt290/2n+727+P8Ak21zbJ5H4vcvYeRbDLq7N7btXS8Zy7kcinXFKMqEEemPaYMtOXi7uns3+78zLl49c1e2/Tb1/b1Pqr7W+f7D5nFsO+bFJ/ltwiaQQSOBJFID+pFLoBVHj1UFePEV44w58NqN1sefzYb4Mnbbc+c/vLucx94m8it5xNb7pNdQQmZv1KW9zoep4ghWGeOt4vrU9N9IZYyWX7dD66+J/vX8Gt/21L7N/wDaG7vua+GXHjP+q9yBbXvXVrJAk1C3c7YMgJyrT444WbwmX+s+d3KO7ujruexfisl+V85WUd0/jJXH7P8AYprz3eku0SSePbvH90N1pB1OZzEkTEV6TqNAc8afL5Iwx6tB9UNLiQ93ZfgbY90/GYJ4bXeHLOGEsEshU0MknAhqakANV4UxxMOTU+aZcZifzLxs3FveyT2k63lm1WuJCdVY3or60JKMRmjL1Z0NCcdGt/QwWxwzPW7QXVtLOJHjmkumVTcGQxyaiSUjUCtDGaM3I8TTPGitl1KmlEFe+QWTXNre36Miz7fJq8qjEjMWQsI47mJSWZ6V0yAGgUA8BiasVWTPvj7QbnJ5FvPl/k1xVpfJN6muJ7d1GiJbeFIoFBpqIATkaVx5rkU+XSEd3jfHaWab0BVVFPTp0KeZyrl8ccfrqdbt0I1fWiBnm0iOrGMOD1OrjMEfDP44vo9DPess7bRIirrGrIhSterT/wCmpywWckkj5Bfvz2wX3uzuoEYaUeP7QYlHQR0SagGzzp6jHsvp+8YF72e+8DTu4K/xM2X7oWUUH+21uVgKxxQey+3QqBnQJtluB/Zjh4NfLf8A3X+bPOWpPLdf/E/zPzxezXtpuu8+TeRHbIfvL3avHJtzREQMzIssStrDAaSVY0rj3vkVWta29sHM+ruEq8etl/e/Rlh2l9JZ3UUls7QyxP8Ac2CSPRy4UklWYZdSgE54xaWR80pNbCb90M8b+1Hg86wpFJu+6JuJdCmkJJav0FFqVaprxz44y8fS7PV+MtNm/YfUn/ZYp/8ACO92qGo/77FD/wDey0x5r6i/1q/4f1Z6Ch8TfeHX/wDPZ+6QTSW/+G/vY0sSKk+QTUz40+Ix3+O/9tX/AAr8vyJZf9J+5ku/cl4Lc+O+Zf8AedvBIdl8ul7ks0SFUiv0/qqDXVViNYNak6sauBnrddlv2Q/CctXp8u2sfl/A+6H7I/3WeB/up9qpfYb3hFnuHuBt+0HZ982bdChh8l2xE7YuYeGqUIB3VHUGHdXI9Pl/L+Nvws3zcWlJlNf2X+70N3JwWxX76bT937dDI/7gP9rj3O8Z3O83n2Gu4PPvEmYyWnie4zxQbvaJUkRiSfRDcgaqBtSvTiCcz2OB9TY7pVz/AA29ej/VHY4nmqtJZdH6mZds/ab+79p02uL2f8sUqQxjnOi2LBgFjM084hKgcatpx1H5bg7/ADK/t9h0F5DirXuX3a/kfUP9tP7EvKdpvdu8s997uziWwdbiy8A26bvo0i5r95OtE0CgJjjqCagtTI+c8l56t06YFv8A2n+i/U5/N87NXXDOvV/oPn7vv3N+P7jZ3ns94DuCbhEkix+Z7zZMrQBYTX7CB1NGIYDuEZCmjjWkPEeLums2RR6L9f3FngvHOtvn5PsX6/uB/su8Fay2zdfdPd4RC+6Btu8VD9DfZgj7i4qTwdwI1Pwb1xHzWaWsS6av9EZvqbyKtZYKvbW3v6IuH91PiQ8x9pdxv7SFpN08LmO62Ioe40CDRdRr+bOIhqjmoxj8Vl+VnSe1tP3HP+n+b8jkqr2vp+78Sgf2F+5aWXlvkPt1eXOq18ng/wBR2apy+9s1/WjWpy1QnV8dGOh57jTRZF00fuZ6H6k43fjrlW60fuf8T6C+Zbt4r7NeFe4Xny2UVlHWffN0VMjd7jLHHBEP/VK6xr8zjgYaX5OSmOfYvYjzGGt+Vkpjmei9i/gfFr2h2DcfeT3k2x93P+oC4vZfIfMZJDVWgil78iknlJIRGPgce05l1xsDj0hHsvK8qvC4jddNO2v7ezc+wb3qiSRGYogq8Uq9KkUBBJHMciOGPHQfMUzHP72d2uLf2mtEhZ1hvd+slkt1IGsJFNIQ1eojWoJ/jjs+EpOf7Gej+mVPKc9Kv9CEfsM9rPbb3N8Y9xbvzrwza/KbnaN6s4tvnvou60KSW3cZFaoyLZ4v89ysuC9Fjs6ynt7zted5eXDeipZqU9veYa9z7q28N/cT5Ztfj6Q7Pt+we4Vza7RZWoAWyt7bczGgRQKqAqgDjlju8acnFq7at0l/cdKlvmcRO2rdNfbofZC+3wQz3scrhYoGkNo+oFiGatNA4n0rjxqpJ8rrfQjsnk4dIsz+q3ctoR09IHTUAnieGJKgd6EcXlbapYo9azFGbQpAYKpOplHDln8MSVCLuZD/AHpeVlfbPxGOvSvlCPVn06l+xutQ1eg5E47PhKf5tv8AD+qPT/S1v9xf/B+qL7/2wtyO5+2nufIxFY/LowFHABtutmAy+eMP1QozU/w/qzoefc5Kf4f1Z89PJ9/jX9yfk9u0gd4vcu5UKDRkI3duXPHoMNP9pX/AvyO7W3+y/wDJ/wCk+17bwGuLhtRWZ5SpKkhyCKGgrxyzyx4vt0PmNbaAvvYXoykBOFu6ivLOqkDhTLlhQyWgD7m1uEICL2iwMkkbnrYUJJFDQZf24nLRBpFae6dlt0vtl52Y4oc9h3RiVXQHlFs9XXPI0HPLnjTxMlvnU96/M1ePqv6nH/iX5mAf9vy3t4/3B7TLFAoRvHNzEMoUA10Rh6sAC1aDHe+orTxf/Mj3nnUlx/tRPP8AcRu0tvebxmsgVm8Vh6CTUA3koqAOB5Vxn+nNcFv8X6EPp5xgt/i/Q1j7D74o9lfbbTIYov8ARou1IWAJbW4YstMq58eOOVz6f7i/vPH+Yt/vMn+I+dX7z/JCnvROuopHL47YICCKEAzEkrWtDSmPR+Fx/wCR9rPW/TVv9p/5n+h9LvI7zT+w24vkYJT2wglVyKAf5RDWmPLY1/8Akv8A7n6nGo/99P8A4/1PlH+y7y1R7sbl1tSLx+6RYia0PdjKsXJyByIrXP0GPWeax/5C96N31Rf/AGy/xI2B+5zyq4T2N9xSzDS23okd6Cvc7iXEZZTUGpIyq2XNdWOL4yn+5p7zy/hLf7zH7/0Kb/2pd3fcvdj3Lh1mSO28QhAcgfUb+OvUPqPCpxs+qlGKn+J/kes86/8ALp7/ANChP9yfdLq3/dX5laRyLEjbBs3bkJQMtbWp0k+vDPG76bU8Ne9mjwz/ANuvezeXt5ue5N4T4VV/t3h2KwHfSi6CbeMUoCRWn45Y4PIqvmW97PnvKf8AnX/xP8yUNus08jhLfWYGVmLKFJcmgqa0pzqDT+GKe1dDO/UOkv7u5FJjInebROKq0iIBRqaaasuOCA7j46XN35R+3L9wFvuNnbom5+Cb7Hvnj6oyrBe7f3HdFP5iLiBzHWuRrwx7FKvN4va/7Sh+/wD6n03i5K87ipz/ADKH7H/1P0B+Z+M+1v76v2+Wj7Pu4Wx3lY9y8a3yKjXeybzApXRPGGBV4y7Ryxk9Sk8ipx4LDkzeL5Oq1WjXqv22POY75ODm1Wq39qPi95h+yT90vgG/3drY+Ebj5FbvWKDyXxOTuxTRhtSvojkWVSxUFg6CnKuPZYvN8PLWXZL2WPS4/J8bItWl7GXJ7Ff7ePu7515Dt26+7lg3t34Na3DTbrt1zJFJu25KSGZI4omfsmTg0kjAjMhDljJz/qLDjq1h+K3R9F+8o5fmMVKxi1f4I2N+/L3z8U9qvab/AOED4TJaQ+R+U7bBtNxstqRp2nx7SInDqpOgzxr2o1bMqWbkCeN4Lg35Gb59/wCWrmfW37as5vieJbNl+bbZOfez5A+O+z3lnkPtv5V7l2FoZdv8Wmjs7mMq9XgKa5p4lANRBVS9erP4HHsMnLx0y1xvd/t+J3svPx4+RTBZ62X/AEn3m8v2Hfu12/22VfZv3T3CPbPEr+Zrnw3yid1EO33M7Vmtbo/khlc60kOSsW1dJqOD57xLzP52JTbqvX2r2mHy/jXk/wA3Gteq9faaD/c/+wXa/dXcbv3I9mtxsNh8m3hvvN58enbTtW6ySUY3EM0av2JH+okKUc5mhqTz/Geftx6/Kypuq2fVez2mHx/l3hXZkU1X3o+c99+0v90Hj11Nt6+1vkfdVtDz7TKktrcZ/XrtJimkjLqANPTPHol5fh3U99ftX7zuryHEvq7L7V+9F2+0H+3j7u+ZXttee4iL7beOBw94bmSO63ScVOoRW0bMiVrkZWy/wmlMYuX9Q4cSjH8b+5Gbk+bw41GP4n9yPq74zvHtZ7K+Qe2n7b/CLOK23HdrS9u4tqhYPLb2lpA80t7ePxaSeQACubZnJVGPKZa5uTW/Jvsmtfa+i9x5zJXLyK2z32/bRe4+cX+5JGr+7/ghKO7DxYAaa0C/eTlieWVOFK49J9NaYb/4v0PQ/Tr/AMm3+L9CvvdG2b/50f2PlALTi+Q1BID/AKVwD01ocuIxfxf++y/t6FHA/wD5rn937jYf+2pGkXtn7hpHSg8pQlcgVJsLc0IHAjHI+pP9an+H9WU/UX+tX/D+rPnJ5SqR/uX8lk1MC3uhdKtCNT131umlKD58cejxP/aL/wCmv/7TvJf7P/7f/pPrz5/4fY+d+L+UeJbpSG08gtpLMSuAxhkPVFKtTq1o4U1OPI8fM8N63XQ+a8TkW4+WuRdH+yPkz7beZ+Y/tl95U3G6sXXdNiuW2vyzYB9N3ZSFe7EG4EuAskUgqtQpOPWcrDTnYIT0eqfo/wBtz6Tnx4vIcddr0spT9H+2jPrX7h+2XtL+83262Tyzx/eFh3OKBz415ZboDc2bvnJY30BzKhvqjahU9SnPq8lxuVn8bldbLTqvX2r955fj8nN43K62WnVevtX7z5p+Vfs6/cH4LuEn2Xi1x5RBbAx2W9eOT90SJXOsXcjnWozoy/jj0uLzPFyrW0ex/tB6XF5ji5a6uPY1+yAeN/tI/cN5juUUM3hV3ssUulbjefI5lghhjr/gd3nYjM0VOOJZPL8XEtLT7F+0DyeX4uKulk/Yl+yPpV7Vez/tp+0TwrefNPLvIIbrfprcDyDyudRHqH1LZWEFS1GYAACruaE8KDzPL5mbyWRUotOi/Vnm+XzM3kcipRadF+rPlh7x+5nkH7jvdgbtY7dcKb+4i2TwvYdVXhtC5EYalRrdyZJCMh8hj1fC4teDghv22Z6ficenAwfE9tbMlX7o/CbD26X2f8Ms2EqbZ4rdf6lKi9UlzJeappfWjPWnwpirxeZ5/mXfW34Qc7wXKfKebK+t1HujQ+jX7YwP/nMdiUNVRsPkqhh6C+3AA4815T/v376/kjkeT/75++v5I+TX7WmVvebwQlA8Kw3iEk0ZwbOUHUGyHr8set8r/wBvb7PzO59Q/wDZ3+z8z6s7hqWTU1VnjeimNRkCtCD8uWPJo+aMa7l5S8K6g7isQuDQsinMFiAONByxJEdj5/8A71PbC83PbLb3R2WMyS7DAtn5NBEas1sW/Ruqk1/SJoR/hIPI49B4XlKreJ9dvf6Hqfprnqlngt/a1r7/AE+0sP8A2+P3d7J43Y2XsF7n70lpt8kjH298lvW028b3Lln2y4dsk1OzNESQMyn+HGX6g8Ta1vn4lP8AeX6/vOn5bgOz+bRe9fr+8kH7ov8AbVu/JN7v/O/2/XljZHdJZLvdfbm/k+3thcSvreXbbgKVQPViYpKL/hYA0FfjPqRY6rHnT02st/t/eQ4fmO2qpl6df3nzwu/2f/uw2y4Gzx+z/lpiVjHS1YNAFJzpLBO0NK58f78ehXmOFbX5lf2+w6S53Gbl2X3fwNS+wn+197g+WbvZb17+ND4V4lbyRy3fitlcRz7ruOg10O8BaO1U8CwdnpkAOI5XkPqbHROuD4revRfvMfM8xRJrFq/XoaO/fj+7rw72C9upv24+y8ttaed3u0ps0sO1ELB4xtJj7Wiq103MkQ0xp9Sg9xiOnVyvC+KycvJ8/L/LM672f7v+hy+HxbZr99tt/efHv9s/t1Ju+77h7g7jZs2z+MxzQbUrgslxuMsLAFWAApCtWJ/xFR649Z5HkJVWNbvf9vaZ/qHn1rRYav4m9fYv4/vB/sCJ/wDny/ZMsxAk3u6CitdRFlccfkMU+d04d36x+aLeQ3Et7n0L/wB6CPXdewPQHou+5MaA1ayy544v0kpeT/y/qQ4lO620jD+yXbID7M7Gq6u5LuV8A9RR277UBFApA1Dn/PLG3zL7c79yOP5vEq8tpeiPp94RtEscMcjI8dxGmi5MoYakRzWrhaGvAZcsebzWkzY6RqYq/fpsybfv3ifl0KD7Ld7Ftt3K40l/1LR9cYJWlCySUr6KMdrwN+6tqejn7z3f0zyZx3xejle5/wAfzNdftR3fbve39qUHiO83BuEhstz8L3uQN3JBEFaOJ+r83YlRlr8Mcby9Hxea7V9VZft7zn+To8HKdl6qy/b3lb/7kHmdj7Z/ti2/wbapl28eYblt3jthbUBX/T7BPuJo6f4SkCR5f4uWLvp3C83L73/ZTf2vT9SXh6PJyO59Jf2nzF/Zht6Jb+4Hm00UUV9NJDslhIAdaqn+YnManLSzFAfSgx6LzeTWtF72Z/qvk60xLpNn+S/Upr97uySWvmfjXmCW6rB5Ntps7wxsSDc2T1qzUzLJIMvSmLfEZX8t09H+ZX9Pcv8AyrY30f5n2+/Zruuy/uU/Y14v4l5Wz31vJsd74F5cpfVLSyrbIxbMh2tmhkFcwTjx3k6W4nNs1vPcvt1I508eVv7Smf8Adx9woPBf2z+O+2m1MLST3E3y0sBaR0AG2bOoupE08h3FhApi3wWJ5OQ7vovxf7Morqz44ftd2WVdk8q39LZu9vN1DtdpJpBVYbdTLKSWIHUzKATlVcem5d5aRx/Mcjusqr3mgfJbeHf9s3LaL4xiLdLN7TctIrWKQBeiopq5148MZUcWtu2yfVGCfbf3A87/AGp++ew+bePvp3/wi/1yW7ErBuO3zApPA9OMdxCxU/4TmOpcUcnGs1HRxP7bHpMGVXqrI/TB5F49+3H/AHQf2/7bd2O7Nb3tmRcbfuNv2zvfiu7vGBLb3ELU1IfpdT0SqAyMCFZfNUvk4mT9tTVpZHw/90/9rn92vtnvE0fjniSe6Gxqx+z8i8XuIy7LQU7lnO8VxGxrwVWGX1Y9BxfKYLr432lTxsjfiH+3d+8v3B3K12yf2n3Pxu3LFJt88ouYrG2hT/E3cdpmHwjjY43ZfL8XHWO6fd1LGtIg+4X7bf2sezP+3p7c+Ue7Pud5hY3/AJg1hTy/3Dul7Vva2wow27a4WrIe46gZAyTNpFBkuPM83n5OddVS06L9X+2g0o1Z8Cf3i/uZ8j/eF72t5HZWN1aeL7eBs3tr4rIQ0kFnrqZZFUlRNcP+pIQSB0rUqgOOvxeL8iirGr/H9y95RkyJJt7IpL3V8ZXxC58U2AMsrWmzK11MnB55JpGmYc6ashXkMdCtV3KUYuHm+arW9p+nf2U//wCYex1//wAPbrl/9SXXpjzGX/vv/OvzOti3X2Hwc/aSHl90bZXOhpNk3Ax9oZKUiXSCCaGtPXHvvJN/07n1R1POS+Dr6o+xfuZcR3H7et4YylhP/puqNQ2U/wBxDVsqAY85w1/uV9v5HJ+lp/rKfb+RI/8AbyCt5J7jzK1RJtW36F+Hdkqan1xV9R/y097PW/Uf8tPez5kf7jG2TS/ui9072PoSNtrLSagKN9lCFyPxx6P6ea/oqL3/AJkuBjniV+38zP37d/3D+4/7M/eD/WLWC4m2ieWO09w/BpnMce52QIIKq9Ak6I2uCSmVaGqMQYeS8fj5uP8A8XR/t+KPPcqlX8ddZ/b7z7kfuX/b17V/7insb497uez+72P/AH9a7e0/g/k5Cxm4C1abY92ABaPTISOrOKTqFUZtXjeFy8vjczrdadV+q/bUwNTqj8+ft95v5p+3n3I3XZ/Ktmu7eTZrm42/zbw3cFMbxzxHSSqtksicVPBh6g495ZU5dO+rlQ2n+JDPxly18T1Sevo/3EL9wvIYt33zYN0tpnksryye5twxqVWe6kZqkUz6aU+GMfjsys+6r3/b9DJ4KcFnKh90P8D9E/tb7Gezd9+w7avcqT272aXzab2qvN4/7pkhD3hvYbGeWK4MtRVkcBgeRx5/N5LkPyHYrvs70onSJ2PV4fIZrcmqV32uy0no2Zx/ZRcu3u4sUV33JLnx/cFu4q0LtEqMX5EBWpwFK5jHW81pg+1HX+pUnwp9LI+nu8bNa7jZX1iq6muLetqAVbWxpnxWnDME/HHmaWg+cXUmNvOth+3v5IJFCxySS2/djdmZpYyVAVVVSBQ5saKOBx0MV5MmTGZF802SIzXcsp+xhk/WtbYs2mBwOpSJDqDMxyAOmnyxupaTn3rD0KoUXtjuNvfwjuy2sB7lI1cFZK9yG4WrAhwaUJJAOeNGjWpXesH2r9m7i62S63PYr4m3u9q3XcraeSoI6WH5PQKwIx5/lLvrJ2OL8Jqe3uBPCHjGlSqmJuRNONMcW1WmdatpOTw6mpQDug1J4j5CtCR64aYOsidUKtVWESOM1Q0NVz1VJy519cOSMQfMT97Hie4we4G1+XG2aTZ9/wBqgs0uNPQLux1q0LMeDFGDCvEfLHqPB518p06p/me7+mM1b8d4+qbf2Morzj91XufuPs5c+yaePeMf9qTeN2/jguuxdffNZQxJBqDtd9oOFQVJi01/Ljp8fxOFchZ5t3d3d0ifu/Unl8Rjrl+am5mekfkIv2Qe1G7brvvlXlt3t0yeP2e3nbNsvZESs1xLIJJYVU01dtUFW4Zj1xb5rlqta0W8yea+qr1eKuHrM/Z/Egn7o/YTdfavyZt5s7SSXwjyN5GsJ5idNtczgmSBwuS0JBQ5AjLGbgcxZV2t6ny/m8V47TBnv398W3Dff2/+A3dhDcXd349YWt3eWsaKQ8Gl45JIygOsRBlJJzAxfgyduW3t0O14y6o1OzUFa/tc/fn7tftO8U8i8P8Ab3xrxLfNs8m3b/Wb648gtr6eaOfsR2+mNrW+tVC6YgaFSa1zxVzfFYuXZXs3t0hL8Ud+loKX2qff/d730Plc1pFa7t5h5XceU70LJX+2tmubxr64KB2kZI1ZiFDMTSgJJxbmxrDjVVslBZzmsWJv2aH033TaNm8n2e98e321ivtr3COR5bSUEaXkcH9OhBDoTqV1NQcc2jdLdy3POYMlsdlajhowl5l7L+b+126Q+SeL3F7uWxWMn3e2eV7a8kd7ZNE1U+4MNJInUkUcdJ4gjhjv8blY81ey0T1nr+89x4vyeLkJUvCt1nr9vX8zaftB/up+/fgtimz+b7Xtnuxt1mO3Ffbkz2W6KMtPdvYAySfEvCzf82Ody/prj5bN0bp+K/b7TpX8ViyNurdfyNO7h/u+PHZKLH2LH+pOq9dxv/8AlakZ0ZLLWRXIVA+NMc+v0m51yae7+JCvgG3rfT3fxMce7/8AuB/uG951utgTdrXwfxS9YRSbF4ussM8yuQO1cXJaW4aoNGCsoP8Ahx1+H4Hjcd9zXc11f7tjpcXxeDB8TUtdX+4sv9un7fPJPIbvafI/c+2bxvxm3CmHxt6pfXUTkFO5QAxRczXqPwxV5DyVKJ1xa29ei/ec/wAn9RUxJ0wObevRfvf4H1327fLaytLWHb4YLbbLGMWlhbRLphjijAVNKJkoQZCuPKWo3q9zxbyOzbs5bIn7ve6th7f+3Plfkd9puZIbKS1t7eXrinmuh2reF48yQzOK1yA/HEuJxXmzVqvU2eNwvk8ilF6/gtWfPv8AZF4xuPn3vnsN3BM8O3+Bo+/brfQfpnStY4LcaaUEsr0IPFAwx6PzmWuHjtdbaft+2577zXJWPjuvW2hpv/cR93orKLxv2k226U3Mirv/AJLEGHTGGaKzjdRnmweQj4L6jHL+neJPdma9i/U5n09x9bZX7l+o3fs08VTYvA9x87v44v8AUfN5Ihallo62FsxWOhU8JpCz/ILiXmcvflWNbV/NnM+ped83MsS2p/8A3P8Acasu90AjieCSgSQq1QSqkjJSBmac+Q4nHJVTzTZln93Gzbr5V7S34262a83HYLu33eW2ttckhjh1RzoqgEsVSQsdPGlMdTxGSuPOp6qDufT/ACqYeUu5wrJr7ehgb2R/dv7hft42zyjZ/DNo8e3Ub/uEF5ucu+W15KIRDEYgYjb3NuMxmVNTXnTHf53icfMdXdtQo0j9zPZc7x+Pl2VrtqNNI/cU9ablv/vl71ybhDZwruvnvlL77vK2UbdpUluTdXDr3XkMcEdDp1OcgBUk403VOLx46VrCnfaCvlXpxOK5elawvbpCPsJeb2JmlkNyJjNMWW3KBGMr0GpSeS0yr88eNSPl3bCI7PuSSl7Se4MKwq1Zzn3GLcU0mgYcVB+OJKsELEel3furNdurXECMsekEhyhNGBFTQsKn+WLEiMmYP3d7fum/e1CybXbzT/8Aau5Q7rLZR9Un2wjkgdxxNE7tWzJAGOr4nKsebXqoO/8ATvKri5MW/tKPt0ZmX9t374fcb9tnjXkHjfg+weM7za+Sbmu73rb5Dezz91YI7YhJLe7tlA0xA0Kn58sdPyHiMPOsrXdk0o0j9Uz2PK4OPlWVrN6Lp/0I77a7x5L7x+/1lvQt7eHcd98lk8k397ESLBbRS3RvLhh3GfSsdToDMSchmcX8itOLxmuir2r26Qg52enF4lk3tWF7XEI+3SeWLNLJOkzAAgCJ2HdQNUs9TUUUZ0+PrjxLxnzSrZIrfyOMiSRJe8i0a0IIYoTnRhmTlyxB1JIc4fI4JgJEuSssZGl1NEcA1JPOvLQT8MJUG2MXmYfyHwvyzx+0uBFJ5Dtt5YxuAaQzTW7rGW18QWI/DFuF9mStnsmi/i5liy0v6NP8T47e23vV5r+3X3Ak8l23ZrKfyvaYLna7jY97hmkiiWSiS17EkDa6rWgag+OPYcvhY+Zi7W32vXQ+m8nDj5mJKfhcOUEe9v7gfM/3Fea7Jvm/7Xtdpv8AHZpsuz2GwRTp3qStIFCTzXDM7MxUhW5cMPhcDHwsbrVuJlzH8CPF41OHRpNxu2/2R9SfbeK98S9ufC/GdxJO4bPtNvHuKimj7gKGmWoFP02JX48fhjy3KusmW1ls2fNufyFm5F712bce4+cf739u3WDzraPMmSR9m37Z0snv4hqhimtGkYqxzALI4KitDQ0x6HwmSrxunVOfsZ6z6Y5NXhtin4k5j2MaNx/3B/de/wDZOb2RuvH/ABBPE5PHV8Z/1BLS/O5PaLCsayrIb/slyoGpu3QH8vLDr4HAs/z1a3d3T0id/Q6K8XiWX5qbmZ6R6+gh/ZVsm7f90eReaSQMuzQ7W21w33bAju7iaVGeKOtK9tAdVPhXjiPm8texUnWZON9U8mix1xpzaZ9y/wCps33m2W98v9rPOvG9maa43Dd9tc7bbRlf13tmWVY60rwQha0rWmOLw8ixZq2eyZ5fxvIWDk0vbZPX8j5p/t2/c57h/tb8k8i3rw/ZNl3Ld96sP9J3Wx8itrmQQJHOsxIS2ubVw2tNJ1HL0x6byHjsfOrVXbSWukfuZ9F5XEpyqrubjfSBo93PdPz790PuwfLty2Oxi818nis9qfZdihmS1P269qEos8s8g6ep2L055YnxONj4GHtTfapev7IlixY+Hicv4Vq2z7DeP7VLtXjXjuzyObo7RaW9m8VatI0Mapr9K6gaHhTPhjx+S/fZ29WfMc1++9rerb/ElaMxjSXt/pXQGhiCRHIuXUDSuk8sVkEpFMVujiMaX1R0W0mWnWCasrg0zBOFsKCivf72IsPeTZYLvbTFtfnOxLp2q8mQBbhCCWtp3HUErmukEqc+BOOjwOf/AE1oetX+0nc8P5R8K7VpdHuvT2owh4P7ke+v7VfM7qPYLvcPE9wkdG3rY7mJZtuv1XpHct3JjlUAk91CGpwauWO7n4/G8hT4l3ejW6/b0Pb2x8bn0VlFl6rdft6M+gPjP+6p5Clp2/LPZ6y3O9ijXVd7Luclqsjj6m+2uYZiinMj9VscHL9LVn4Mn3r937jm5Pp9f2b/AHog3uJ/uYe7fle3zbd7f+K7X7drdu8Q3R3fdL/tkcYmkWCGM0NT0MRlpPPGjjfTWGjnJZ29my/eX4PA4qub2dvwRmf2v9lfcX328rm8l3ye+Gy3kr3fkPne4B5JZ5q0dbdps7iUmiD8oyqcsdPlc3FxKdtYlbVX7aFvkPKYODTtUO3Sq/X0R9bPFfFNj8T8fsfE9h21bbaNptjbx7YVDvIQra2kJC9wsXq59TxOePI5c1slnez1Z8/zZ75rvJdzZv8Ab7jDPvf+0S7a63Tyj2jtEuLG9lEt74JIBHJDIxJLWrtSqEmqxk19Mssd7g+XUKmbf+9+89b4v6hrCx8h6/3v/wDb95U/tR+5T369gLiTx+w3q5k2rbZezL4L5DbvPbxEkqqRwOyTW4UjMRuoPyxq5XjONzF3Navqv2hnczeP4/MXdpr1X7QbP2b/AHOdyW0H/cPtDbS3IbQLjbN4KxsVoGLRzW7MlD/zt88ca/0yp+HJ96/ic2305/dyfev4kA86/wBxf3W8ksTt/hnjO0+36zv2rrdzK253catkOy0qRRK3ziY+lDjRg+ncNHN7O3s2L8P0/iq5vZ29mxlz2994vNfbr3Pi91YSnk/mYW8NxdeQtPciZrqIxs0xWWKQko1Vo1BkOGWOpyeHjzYfk7V029h1ORwseXF8ravs9g6+83vP5n+4PyTY/IPItp2y03iy24bZt1ns0NxEswaZpVAjnmndn1PQaTnwpiHD4VOHR1q3Ezr+yFw+Fj4dGqtxu5g157v+1Pkdl+1TwTZks55968DWzvt32xQXkRHSQXOSA17fcBNCeB9Mcnh8ur5lrdLSl+h5fx3Px28le8/DeUn+X3mbfY790XnvsFsO8+PeH7Z47utlvN+N0u593guZZFbtpBRDb3UC0og4gmuOlzfF4uZZWu2oUaR+qZ6Pm+Mx8uytdtNKNI/cyNe3m2eQe7nvjtu4xbeItx33yd/Jd5W3Dfb2ateffXLNqLkKDULUk0oK1xbybV4/GanavavugOdkpxeJaXoq9qnrpCPtT2llLjSWR5Hdia6s8w3pX/yx4pHzAzx79+wG2+7u0ncbCSLafOttQR7buz9AniXMWl04ILK2eh6VX0Iyx0uB5C3GcPWr6fqjteJ8vbhW7Xrje69Paj54bRvPvT+23y1rizn3LwncrltF3aS9djfpDXQBGdUE4rxYZ/Lhj0V6cfnU1iy/Ffqj23+28hj0iy/FfqjYHjH+4x5VFbQxeUe3G27zOinv322XstjWnBjDMlwATzGvHHyfTdH/ACXa96k5mT6cq38F2vepO+R/7i3lN3b3EPift5tm0SFdMO5bjfSXxUnKogijtwSDw6j8sGL6cov57t+5R+8eL6cov57t+5QZL3ryD3q/cj5TDFdXO5+Z7mNRsduVBFZWKtkZAiaYLdaVqzUPxPDHXpj4/BppFV+L/VnU7eL4/HLiq9er/Vm/PYn9u22e1Fv/AK7v00G/+cXyaFvYwft7CGRaNHa6hUtyZyATwFBx4HP8i+R8NdK/n7zxfl/M25nwU0xr8fa/3FF/vq8f3KSHwjzO2ieXaNtt7nZ9ylAzilllE0DORkqt1LU5Vxu8FlS7qPfc6P0tnqvmYnu4a/JlM+EfvI9xvbr2vsfarZ/H/Grjxy1tb2yS5vort78Q7jLNLK7NHdpHVGnalEpQDia418jw2LNm+bZ2lx6Rp9h28/iMWbK8rbnT0jT7Bl/aF4puW6+6W3b5Cks20eKWFx99uWnREJ7iMwQQ6qEFm1kkDMAVORxZ5jMq4e3q2Y/qTk1pxnRv4rNQvdq2fUCbQqS1Q9yNCrxqaM7EepyJz4A5Y8sj54ximjgR4jXvRqAZnNc1Q0GoAZ0qBiaEMs9qLgXsdzBFPbSDtz2VxGDEySgq6kNVSCpzH4YmnGxGWnKPmN77ftI3fY7rc/I/bTb33nxm7rdXHj0P6l1YtWtbdeozRplQfUvCjccem4Xlq3SrlcW9ejPb+K+oKZEsedxb16P3+j/AbfZ398/v37IxR+PHdoPN/FNsAii8Y8ljllnt0UUMdvcI63EYUCgRtSrn04fM8HxuV8Udtn1X7tjq8nxeDP8AEtG+qNYp/u3zW9gw3D2MV91ETtC1tv1bSQoufU1kXWjAgjSSPiccp/SeumTT3a/mc1+C10vp7jKXvP8A7oH7gfcDbH2rw2Ha/anZNwjaO7k2Znud3KPlpW+uAO2acDFEjD/FnjpcX6Z4+H4rt39+i+797LqeJxY9W+4y17X/ALfPM/dHdB5D5RLebT4xeTC4vt7vNT324yStqYW4lOtml4mVsufVwx0+VzsfHXZSG/Z0MHlvM4+InTG07+np7/3H0Cg2HZNi2SPxzbbWHbfHbG3Frb2sKa2IAYEFhWrVObHifnjz/da1u56s+e58t8l3ezmzPk14H5p5r+2n3w2zzXbdqsLjy32+3GaTbtu3aKZ7OYujxKziCWJ2R0fUCrjlju58NOZidbPS3pv+p67Dk+eu5bP9oLu/cX+7b3N/drP4efcPx/xnZJvDhdJtKePwXsCzC+MQl7v3N3dkkGMBdNDx44PF+Ix8HudW9d5jp7kju8LiKkt/t6n1X/aL7d7n4x7UeKbPvdp/pW43KS7nLZsvaltmupXkiLKGB1aCDpb6WOXDHnfLciuTPZ122+48n5bLTNy7WpsoX3H0W2xTabekjOq3JUOzOnSa8FWvL0rmMcC2rKlojJv7v9hm809pN8NvbybhufjUse8WsEWnXOYapPCoALK3bJrSpyoM8dbw+VYc6nZ6ft9p1PCctYOUu5wrafu/E+XHsn+8/wByP242HlFj4dYbDvm3+RXVvd7ha75BPKLeeFHirCba6tiC6aQxbV9K8Ofped4fFzWrXbTWmkfqme05vj8fJadm1HoVn+5X92nuF+6WXxceb7fsuyDxLvxbJs+yW91GHlvmiLyyLc3FwzNSJQNNB88W+O8Vi4Pd2Nud5jp9iIcXh4+Krdreu8mwfZHxvcvCPabxzZNwiezvJ+5um9wkKKS3D6zG5Ay6O2pBP+LHD52VZs7snpsj535nlrkcq9k5Wy9yKm/db4nceRe2d7dWlu1zu3jm4R7jDaWq6ybYxlLkFvzEIwcheS0HDFvAy/Lya7PQj4nkrDm1cKyj9xm39tH78vd/9q3i/kHiXgO1eLb/ALJ5BuS7m8HkVteTfb3IiWFzbtaXlrQSKi6tWrNRSmLuf4vFy7K1m00o0j9zPQZlW+s+z2EB/dD+7L3Q/dv5D4fu3n21bJtdx4paTbdsO0eOwXUUTteSq8rlLm5unMrlUXIgUUZYOJ4/Hw0+1vX1/gkZMkU1NN+3Oxv4R7f+PeO3Cx2N1aQGbe6HuObu41Syo60I6dQANeWKLvus2eU5OTvu2H3c8aUTWqmTPuFMon4fUxAJYjjTP1wGN2Kl9xfbnavP9qcPN9t5Dt2s2V0EJkBY1CSLzjPEgZg5j0xF1nY08bk2w29nVGa/FvJ/e/8AbB5nb+T+Gb9ung2+RsEh3jb2Jsr+JGr25AwMNxGSM0kUj1GKrcamSvbdJndxciuRTVn1D9uf96P3Q2uws7P3L9pdh8yngolzvez3s2zzyqKdbQPHdxF+NdJRfQDGW308rS62g11s2pJH5j/vZ+STWssHgPsVtu23jw/o7lv27y3sccpqM7W1gtiwGR/rCuK6eASfx309hF5D5e+8P7hf3B/uy8jgk898ivvKRauX2rxexjFrtVgD06o7aLTEhANDJJVjzY46WDiYsEqi9/r95TkzKqmzhFh+2XtTa+GxRbrukovPKrpmgQIV7VmeFFfPVXgWp68uNtatS3uzznN5zzPtrpX8yu/3C7Ff/ebN5HHC0u3C3NhfXCZxx3HceRQaZrrVqivpiVXr7PQ3+LulV167mh/D/wDci97PFvYe0/b5YeK+Ey+GWfjk/iqbnPZ7id0+zuY5InlMq7isPcAkND2qV/LimvhsNsvzXa0zPT193qehwVmJ6QJ/2VeIbtf+cbn5Qtq8ex7PtN3ZtfMpVJbq4RQsIcc9AZjThQeuOn5TKq4uzq3+Bp87nrTjLF1bXvhdT63bh47u/nHsR5Bs+yWc19uENrFdWG3Q0aW8+zuRK0a10liyIQvqaY87gy1xZ62exyvp/kVwcqlraKY+9QZr9k/fHyn2Nud9uvF9u2zcrzeI47W+tt3huGMQgckACGaEg1JqTX0pjrc7gU5UK7enpB9N5vj8fMrXvb09IM5e9lz5X+4b3Rvd3uNit5PKPLriCB7TbY5ltoTGiQpOdbyFUVVqw1mhzqMdDh1x8PD2z8NfUzZMePhYNX8NfUsT90n7drLzXYo942UxReXbHbRW9jeuSP8AUBAixm3melWYEVSRjxNK0OXL4fNdHD2b+72ny/j+Qtis62/kbn3N9TEn7c/3h++X7Pdz8n27wn/T73bN3bt734R5RDcT2Md3EaC6SKCe2kimABQlXGofWGoum7n+NxctKz0jqt4+7X8zou0ap6Ed/cf+57yP90vkth5p5j4F4f4v5hZWT2d9vHjFvfW0u5QKF7K3a3V7dK7QgEIwCtpOkkgLS/x/DrxcN1Rt6PRtenSEieK0t+sFJ7p45u+2eK+Kb5PG8lu0U0MoBB+2MsjSwo+XTrViwr8uOOZ4tWx0rZ7w/wATDg5VfnXVf+ukH0B8A/3HPd3ZPZLb/wBuyeM+Ft4dB4vJ4gm8zWm4/fiyuoHtmlkmF72RIok49nTX8tMa8XhuO86y2tbuTVvZ+X6npfG4sTvVtuVD02+3Q15/t/bduO7e4O5+ZBtW17Ds823m6KUj+/udEccalmqSFQuAv5QDwIwfUF1XCqdW5+w6P1JyarAsfWzn7EfWCQW9rMCZH0MRHMX0knuAmqFaFM2yLf8AnjySPDNSVD7l+LN25pYLcxwGJZobiBn11JIbUprqoeXP541YrFGSpiX3E2ATLJeEJLeov+T1pRnmTSyhxRxoJqvWAFOY40x0cVjn5KmY9229IZY43UKbeIUEPcjthM8dZInKtUl9NfXgDXjjbW0mZqD63+QyT+O+7Hlf6Zj27ep7Lc0eP1e1VHMaggfXDU8ccTCu7GdW3w2L98c8gjlhdQypACj2oVq1VhkiigoWqMjzxhzYjZiySWDFcCVS2o/VRM6ZngKZ54xOsGqrFWioyBBU6lkJFajieIr8sRknAk3bZdo8gsJdu3rbbXeNsn6prO8hWeFz6lHHEciOGHW9qOauGWY8lsbmrafsKduP25+yX3CXq+12wG7Ru6rtCzrqOR6XYgfAUpjfTynIWnezTl8ny7KHltBKtt8Z23altbPbNvs9ssrcH7Ows1WCCPSaqpjjCqtTxoPXEL5nZttyzkWTtabOW/vC/cLwDxn3H8T3Xw3yjb4r/aN8iktrhNB1I7jplhNel4ydSkYhg5Fsdk6vUhn49ctWmfFPcrX/ALYFl4lBePfjwkTbC18aATdhu1rVQ1OoKKknjXHrsb7terPN3cLt6IqG/wDaj263qeW5vvCdnmvJpjHNPHC8YUjMDTEY1NaZn44l8yy0ktryslVpZkl8T2DxLZ9olg8d2ay2O5gcrfrYwBJSqqdBd+otx4Fj64pzWbctlyz2yL4m2SqwmklliLOLudtHYhAoY1BGmQEjMk8PXPFTJU0ZO9h3FmnMSTK02vRMJV0uKLR2UCqmn/KcQY2L732M9n/MtX+reE7Y25SSd19xswdulZAB1O8JVKca5VJxOvMz4v5bOPvOxxfKcnCvhu/t1/MQ7f8AtE9l45kmk2zcJYbZjNDaT7jMYJVI0qaLRqUpkT/biT8vyH1X3HTf1HzIjuX3Fv8Ajvth7feHL3PEvB9r2eadBbxXscSm5rUCslxJqcazkxDA/wAMZMnJy5f5rNnK5HPz5/8AUu37On3E+S+UNEovWhurVSszcWMSA6QXFVJJrRQeGKXqZJY82PklxLGzd4x6STcSJQ58SSBXjyoMJ1JJmDf3r+8U8tx4x7d2MrwQKf8AW9+jL1Ds4KQRkVBGmMOwqeJpju+E4kK2R+5fqez+luLCtnfX4V+p9GP9vzwHb/a/9u937q+SEWFz59HL5HfX09V7WyWcb/aM2qhAaMPN8Q4x5/z3JfI5Xy67V0+3r+4PMch58/Ytq6fb1/cfH3yjz3ev3KfuA3TebcMy+4O+9iBHLFrLbo2EcTHIUSC1Sp+WPYYsFeDxkv7q/H/qegTrweLL/s1+9/xZ9jdpvLLYds23a9nRbaLb4YLXaLaIagsMMelBRaAsRQkU+OPHXTs3Z7s+ZZL2vZ2tu3LDZ90YtL3dFwpo9vbTNqcOepTIyUFPzZjI0xFVK9QqXc0PaJhkkiSXuXWskgFxpDM8bAh2qCopwHxwu0kmU75F7Uez3k8zXG+e3myXm4SqZJdxkhKGaSoCNpgaPSx4UZefM42U5mfGoV3Btx+T5WNRXJZL3/vA7N4z4X4jbG08U8ZsPF/uWHeaxjjjjIB6YjMGaQ9QrQmi/mpiOTNky/z2b95mz8vLnc5LO3vA3t+bi4uvuZErNGS0xBCRvVGf5BTkvr8sRSM7sMs99c3CalZppGcCNqhkOnJtArkTmBU/zxKCMyInkA7UaIoEMnbS3RgrO7U4MSAeOZOJIi0Ji83TbCVJdEZLuSFCqRUhiSRTiD/DCByis7v2f9oN4u5tw3b232GW5uydCxQtBpfiQRA6J8QKDGpcvNVaXZsr5LlVULI4RPvGdm8d8WspLTxrY9u2SGGMGe1tYUtwxU0TW4GpyP8AmY58MsV5Mtsmtm2U5ORkzOclnZ+1k2tN5CKjI80QmT/LylQyxGg1PJSrEsTkKfyxS1JXMbDu28y9qYsXue0iyLGmZJo2nQUqT9Naca/xxXBKrkeI99l0NGLkySOxW3txTUrqqmR8lVaepFc+GeDtE2Kk8kZyZBdLKQGiuBIWKsyqCoK0oAPjw+WB1BW9CF+S+Je3fmUkN75N4PtnkG5iNe/f3CK06ITprJLGY36Qcq8vhi7HyMuLSlmkbMHkORgUY7tL9ugV4/4J7a+E3fd8Y8K2bYr5WKw7nbxg3ccoyNXbuGMNUjIjKvyw8vJy5VFrNolm5/IzqMl216SSGfcI7xNCSFCKUnBKiIkAklRTp9SOeKEjHZkb3wbbv9ubHdbW2vLG9OmS0uoVlikRBSgjZKAMorQ4trZ1cpwyOPJaj7qtp+qKhPst7ONey3ae2WwvfmQtaIYnMa6SKvo7mk04cKZ5Y1f12eP52bn5blvT5liybW2stutIbHatth22129SLWC3jSGBDWjBAlFA1cQB/HGS1nZy3Jgvd3c2cv2jgJJNTs0WlunTUaTqH0qDUEcK5ihBxFoioIJvntX7a+Vbg+5eS+DbVu8051ffTW1JkZgFAlkQqSAP8Vcs+OLqcnNjUVs0bcHP5GFRS7SJH4v7deC+EyoniHilh4/K+q2nu7KLVM+urkCSTVJpFcgG+HLEcnIyZV8dmyOfm5s/+pdssiOOX+igVFUFYFiah19NVLEHh68MUtmfce0TS/djoqs1SVFFRlqp1qeHDP8AD1xAkh1gtZTLbnSJ2IYx26nqHOqCnHKv/lgbHA7x2s2pJtccbW6Dt3JavaNSFUGhrX48TwxAn2iLdPEfHvLdsO2eTbBt2+bbPEdVtfxrLCi6q6gSNasePRniePLfG5q2i3DmyYX3Us6v2FM7p+0D2U3Am8Xxq+2a4cnTHt+4TQLQA0IiLMFFDmfTI43U8vyKqJn3o62P6g5lVHcn70iUeLftn9l/FbuO5s/B7Pcb2KNWgud0eXcGVkzrplbSQSMhpxXk8nyMkzaPdoU5vM8zLo7tL2afkXnb2sFqsNvbwrFGoAitU6AsQIC5KKErSlBxOXDHPdm9zlueorVZwo6XDMAskasAY2UAIUUHopnx4fHCCBYuciiMIzGVQ0qLVSGJBLgHP4jASgj+/wDgXhvmaMnlfjFn5EiAr2763RpQlQEcShRICBWg1Ysx58mL+SzRfx+TmwOcdnX3Mp+8/aF7JX0zzHY9w225IAkgtb+ZIFXj0IxYZcqcTjWvL8ivVP7DrU+ouZVR3J+9InPjX7cPZTxaS2ubTweHcb6Kkhud2eW+aIqMm0zFlJrkcsU5fJcjJvaPdoZ8/m+XmUPI0vZp+RYXkXth7c+VraHyTwza98/05FS3a4ttEkcK5KmtNLaQeArT0GM+PlZcf8tmjNh53Iw/yXa+0I8Z9pfbTwy8N/4x4Rs2yborM67nawapxqFGCtKZCp/9NMSycvLkUWs2gzeQ5OdduS7a9JLHWBEc1RpVK9DA0appqFeFPXGZmRlWbp7Iez+9XLXu8e3OxTTTOS0qW5jJBNeEJReo86Vxppzs9FCuzfj8pysaiuS0e/8AeS3xjwrwvwxZbPxTxjbvHoHQd+GziEfcUZkySkFnKg5VOKcufJkc3bZRm5OXO5yWdveSwBlIXVIYmoFkYZAHgVFDl8cVlIaFkBUxIpcCjRUyNCfU8cjmcAQJN32bZPI7Ntu3raLHdbK4ADWu4QLcIKZal1huquVRQ+mJVvajmrhk8WS+O3dRtP2FIbv+0z2Q3YyTHxOXZ55SSsW23k9ugHAgxh2U1PqMsbqeW5FVHdPvR18Xn+ZTTvn3pMF49+1T2P2VlkHi0m9XMTEL/q13POlBmKJqVan5YV/K8m2ndHuQs31BzL6d8e5JF27Tsu07LYiy2PbbTZbGAkpDZwJbqTwUaFCg1pxOeMVr2u5s5ftOTkyXyWm7bftD2kYo7yDUXIPcZaFWPIA8R8cIgNu42ttuFtcWm4WkF5td5C0V1Y3CpJbyqVNVKuCG4ZqcSq2nK3BWdXKcMpOX2F9lJ5vvZva7YriViWW8EbqO4ubF0DhQBTgB+GNi53IiO9m5eX5iUfNsTXb9r2jZrRNp8d26z2zbrZ62tnYwrawLNIRQlUAFeZJFfU4ota13Nm2/ac/Lkvkt3Wbb9oOUs7Rxq4IgYxo0dApoHAVmC5Bc88CIDXcikk9pHokRAFuLkqY9Irkpy/LkAAKtiSINQM90HSJNML0jb9aHMrUDOOnA/EcPXEkxBbRnRL+rI4+uOKUdTM+Q0ZChXkeQr64YirvM/ar268wK3Hlvhe37xfxAarwwiK8MjrQP310PqA5ljjVg5WXF/JZo1YOfn4/+ndpfh9xnHdf2iex0l88n+nbvt7RyK0lhDuUxjMTEkhQ1WA6szWvCmN9fL8iN19xt/wDcnMSiVPuQt2b2R9q/D3S52Hwfb7e+25i0W4XStd3AQk1YyTl1LCgoQMQyc3Pl0tZx+3oc7leW5ObS93HotF+A9btdJcwi2LEREd625k1J7hqAKAU5jFdanJtYr3d7obhI9qsxeKJWMQB0rN22yIU/AUp64vRmsxFc+2/hnmzJN5L49Y+SKQsdhNdInceMgFVaYHWoBBpQ/wDHElmvT+VtGrjZcmP+SzRZ3g3sn7X+O3ttf7H4Fs+23HeUJedgyyxycSydx5KU5FaEZ4qy8zLZdrs4Nz5nIyV7Xdtekm8/BtiW0RUmld2tyCt05BaRKkAA8iaf+DjjZ7TsTxVJvut/JHqRFEbldSmUVGongNJNKcanFNKyy61in993lnS6buuIonYP2l0KoT/2q1Bavx58caa1gosZW8u9p/arye8ut13z272O9vbxe7NMsJUyPUl3lMJSrVNSWzJx0MfLzUUK7g1Y/JcnFXtrksl+3qQG09tPbXxi9W/8V8I2ixvopRJDuMFqZZ2eNa6UMxYowFSKEfE4svysuRRazZTn8lyMy7b3bQ43l990hSJTbULSJbMpq+ldTalH9hPHjimDn2ZEru+QaJAWEiL/AJjt5CLusBoNRXM8R+GLKorZSu/e03t3vN59/e+DbLdXkkja3WIQKW41btFASTXMDlxxcs911ZcuXmWnc9BjsPb7wPxu8SbYvD9u2y7QEG5ijDSQuRk5kkZypHE6Th/Ms1DZVkzZLKHZwLNweYRwRTPreFmaIMNXc5kNU/SwHE/8cCRntsQ65lMqyyzFNGquiSjMxFRpiIJBA+GLEZ3uDIacmWaNkKFSblW0s4Tqo6pUrQ0HywItqh4j2qz3BezfWkV5Z3EZjv7K4HeiiyJACSDSxFPwrhMFNXoNPkXsD7S3Nskt54sthM4BF3tU81uztQagY9RjqK1NPlTE1muupvrzMtVuQOH2B9stsmLLsM+6O47lqLq6kdWII6CqlU+dTyOE7u25G/Ny26wSiGw2nZrOCLZbC12aCNB+jDbogJzDiQKSXI/KQT/LEk9TDlvazlsJA700pjM8Ku/9ZBq7coA1SMTQj8B8MSaM0aj7Z2tlfwSWu6JFdQXYIn2+aJnt3IA6Z4zmzZ1H8WxVY1YW1sO/jvs37XXVzDKvgm3S3HdTss2pS0jdXUNRjAoQVqueIfOvXZm+nKy12szXnilht+xxR7dstjbbNaW8S9zabJEjjDgsrdpEByNSa+uMl27OWFna2tnLZqf2JjP+nfbmJibS7lXuxEhdcbB1epNT+BpXGLkl/GUF8bt7Re1nl877v5D4Dsu6bjJ3JLm8kt+00zEnUZe0U1MfVjnjHXl5selbtI7vH8lycNe2mSyRGdw9tfCPELCabxHxSx8dWaLsXB2+FEujHMwABlcvJQsOGrF1eTky/wA9m/eZOZzM3I/1Lu3vMr+cbM0N1LcQCOOUsqPEISI1augqh9JFyPoczjfiscW9TEvnXtn4X5BcRnevEds3GeB5EjLw6JMloo7sRDOgHAlsjT1x08eS0ROhnebJTStmkVrsHtz4Lsc2+rtniuzx3VpHcw2121s08olaEsqr3S6qwBqGFCp40OLne3bCZTfk5bb2ZXXjsH3e2x7VNZxmO4RbS6tpYVnimcoF0aZSmgtwJqRUcuOK0kkRV+1yi1/DPb32qu7hbi89u9oZ6yy38BicpAq9KGP9RQOsgAUNaeuKsmXJVfDZnS43kM1drs+l/srve22FnZ7HtdjBs23wJ/kbSwiSBO3IupwiqF0Gqmtc6njjk8juvq22zX8++R91m2/abGt5fvIGeMxxxSLWSDSKZrrB0gE1JPqaYwRBatQvddul3TYpYWSTvoxZI6juMEJ1IRwFRlx9MFbQwspRjzzrx22hvLtWRJReO00IUCNzFkrINJFAVkzJcZmlOGOjiuYclGY38i2W8gke3jKMjw0juXjIHYK1/VbSKE6tKVpQ0HClehjsYslEj6afuPsrjbd18O8nsoXWSRZNtkmJKhSeqNmpVgAKmpxxfH3lNM6nMUQxB4r5AXXUl13rSSABrgDKIx0LOanTxBqzY0ZaSV4bwaJ8d3qG6VVFwJI2oX00ZmQgdbUzFaZ1xzMuM30uWJBIJAHD1DgVrnUAClKc8YrI01Yeh6akElORpz9CKYRMSyuFOmgYfUoFafI/jhpEGxqPZlA4nUauR61y+QxbqVsjnkO5PtGybvfyrLOlht9zdKSlQyxoStFBDcuIxbgorXS9pRyL9mOz9h8I5ZRdwW24C3Mlzd67y6nDaWKytqNHJJTS75k8PTHsNjyqfqKO3HqNgySQmNCUhIqCBSh7hOkZ8V6iciTyxU2XVUojFpemz3l9rVBMN9XQkiEhu4eqrAkatOYrUUGJ2pKI47xaGSqjC5WMS/cxxOZJponCVFNKhQoA6WzOeM7Wpr2JbtcpkuLOSv63bcipaOE9QIbSSaVrnitosqWr49fW1xIluZT+oGgt52Vc5FqWQjMACmdP7cVWL6uCz9unjmTXHE8cjKqvpovdAOfbBocuBNP5YoaLkxbcoCTbgDsRgw/bsoqgNK6nIrSuTEZnCBjFO8wnWW1MbXdvVUlD9tCFHURQHIcGIGJEYGmS7ZmaS1TroiXfbPQuf0mpqKggj1GeGkGx8+/3ae2nld/5ZF7ieL7XNvezX23w2W8Lah7iaOW31KJJIVXWFkFKECgI/j6HxPLpWnZZw16nsPp7ymOmN4buGnKnRNFQ3n7nf3M+Q+K3HtzuHuR5Nf8Ai93YLst54sIVWP7JU7IttEcAcp210kZemNdPH8StvmKiTTmf1O/jw8ar+ZCmZn9TTf7Qva3fvG7ncvc7zDajst5JZG08ZsrkaLgxSkd647TCqVVQi1FTUmlOPO8tza5EsdNp1POfUHla5qrDjcqZbW3sX6m8l3O/txM0UxBNdNiqxsqAEOGLCgYEmgFa0rXHCaPKSeTcGDxJbiOcvpN1AaqkoqaVfItmQAR8sPtE3JxtzkeWYrcSx3bF2uYRqdekhiAFIBOWVT8q4UEphCWS/Mk00UquwuIteo9LEFuhSSSyn/Ef4YO0GMjX881vMssKFAdMsxXIOtTln8cxTjxxJIiNFzfHVGzhkjWkvdH5lQBFL+uQNf5Uw0hPURSXBR49R7ccwWRpFLKKHJdI5A8GBHH5YaQCaSea37UjLF39Ugs2RqdFaMHAGZzJp8MOBSIvugpllt0+4jdY5HfTTVFXMK2QJJpX4YEiE6isSmNrh+6I7RGcdyNQriRaFaMQMzXM555YETAxTpHMVjjILjXJbNm4SldQIOZINcSQk0KhN3hH2rhlQFnaKhRklQVAR+JqMiW4YixNinv/AG6wtIz94PIJDG5Zk1gNQqpzIH0kcv4YCSYplvnEkpmInWXpeIq0YdlNECEVYLWla0qcRgbFQ3BobkvLEUMiCKSUK3S9NOkgatSitQDhwC0CpNxMMazQIuqNFMl6dKO9a5nMFSvE1+QwoJTB0boyAQ/cgRNGS+io0lh0F31Z1415DCaEmDe+pNCQkZkt0HcIWhdmqDyIJ0ijZ8MOBNhQnXupChkMbI5kDgAGY11AkUoKZ5nIYkQTEUEqTt21nSE2iNJGwYBaEGpL5kaedRXCY+osJaT7WGPSEU6zIQysZVbMAAk04mnMmvDAAuQmSUwae5bxgmNOYckAyhmrWlef4YiwgdbCOJpSqrcFdGbdSSusdKlssqA5fCvE4QJSPdvA/ahKKrSxqQjnoMTKddeDEcaVOfLEWTgfre2YF0jgDGiyvaHoIIBLua1FOJrwriLJJD/DapOorIZICwbvBKg0A6QubE8ufD0xBssSkc0tmkaBqKrXjFvuA2gkGoGnnqAGZoMvXhiLYLQdYAVnU0WJGGmJenQqqaGigjhQUzrngkYuiiZFhYx6I5CyhlorNI1AzsakkHlypliLY0xdHFEokRm7kMajTJnqUcxTL6jXI8RngAHbxoO4pLGV8oSx09NeLAD8v/lzwBLDI1keZCqktECDJJTWztRQxoKCg4KP+JwhNSLo7WNC7BUEbDOVm0AyHIyMF5L6A4TZKGKrXVKkYkR1dStXOhRMKgUFPSoqR8MEjQqiS1WRamSRnBUgZk0y1uK1JFeHIccRGLoolkjlWQM0iMGdiKluS6aCtD6emItwCFaxs0jKZFUTsCCTRiBSo6aZ1HD0whwKAoVpC8whQvpj1/4VPCn88IcBpCqvcZGCjJTlqIH01Nc//FcJkThH6ZZaK9ApcnKp46QP4YZILXUsoNNMT5QGQ0apB4DiT8MAoDo4goUEF3rrMDLnqr6gcjgGGRxhWZXdQWVYwM2FDwzND8CcIcoVNEgjdJGq4BPSaMSvBm9K5UpgkQYqaT+vqMihXYV6Vy+kAcDnlTAMPI6yxAXWNbMT1nlRc8vjhDCWqqmOSIPLGjFCvGjVqWAphwRkTGo0yxnUsK1ldzUU+eGhCFpdWhlIEof9KNqkUaoKseIrxwwY2EKUkgWFtbAu6Nmimpo4yyqP54kJjNcTpQSCOQRhTFcRAlATzJ+HrT8MTSINiBaxduORWARxEJlZnjaJ6H9M86epFQMPcSYiWLuugKtHby6y5WpAVQAgX8ygVyqePHEhsLaGaKCFaf42RxmRHG1XI/5w3AnDICNrePSJwG7MADQUepAcCutWBpqr8TTOmAQnnMFpOBGuqZ49RgCjpShpQ0yoooCcNBoMN4TKrwUd5pGErKCCXXKpBqBT1z9aYsqQZW++SMxmkiRdauIwwFW0HKgJNCAwxfVFb0IJezoRcgzqgASJ5GcrRwdWulRk2QPz+GLkjPkKw3HczKs8euNhJqmEdCrlSoRq0OS8T8Bi/Gih2jQYLa3nkKxrC7GLrVwUasbZ9KjPOlQT8cSbIpKxaWx2qPcxRQwhVkOu9hCsuoOBQ1Bo5UcQBlTFV3BdWkGhvCdg+4nikngJltyrLrWitERqUKFGVW5YxZbmzFU0pb9jbrCK3Zk0rG66moFjK1ypU1/DjTGB/EzZsiAb3uOpItMuqZ2ZSwJIEZUEsOBqK88aKVKWyo94vGZpZY7okSusCQPQuoVwaOEPDgVPI/yuSIvUqLcrsyz32hJhHc07FiuZ0nhlqy08jxri6qKbMhd5cT2yCCK5l7saEd9SXBiU6pFoxOfqTniZWyH3N2sSd/S0lkD9ytTpkqcwK8afD+/E6ojJG7iZpe5blAst4dZdTQRx14lSc/X8MTVSt6kZvnhRCom79oa96KjMIWCkrpBqFJ4sKUxKBNkburwNBIOzDcTyKAZiaLprTQV41/txJIi7ERur86Z9MiqZQdRINULCiNzoDyHLE0ip2kYDFcxRoGgWJ7UkQXMZJyzIMampqPU+uWJIqerFgjo0piTVHJGskitkBrNRGOYauYqa4ROrLR8bsZFllupZg0DALbyyI0gaSQAA0zybm1fTEGy1KRTvsoZGe2lPctGVoJNLCM0J1sFYUFNPPjSuGvaStBDNwPea20FIEEWvUjDTrHU7alNCcyPxxOCBDb64MUkcqztJM4/VJiFIuVWBpQf4jz9BiaRRdCW2iivGljaURXVqNV6kkjAyRLWjRBR9VR/DKuCwqokVgZHVZLhnh7CjRcUUnuTfTTVQ6tPHM4rZbQtvx4ANJKIJLW4EQa4geToINHLaMy3CufDFFjTU0NstLtFDxPcSBU7brkEiPUCaGpNRmDyxQ9DRXY0r7CzxpFuVuZY4XF6VNsKA62JOka86EivDLGLk7Grj7mvLdEKFUdlRkrIoIJANOnMUy9ccu0ybURbyRkeEwzFVin1dos7RlXTkxoVABFaZ4vxSU5DJ/ne3xTNMbgUMkavdMv6dK5ERMBpLEVrWnHljp4mYciMneWbdHHIjxxLczTI0VsjStHqjqQGlkoTL6UAABGOhjsYroo7trBuy2rTSRwTxiCSMSARlpY9IbMUIzNCDmfXGvdGS+hnW3kktjb2SXEEptZZFeRySIkheutXaojLkaWrkKfLDhQRdixdh3WGJooJEkhtn7bXUlqyy3TQyM1GkUg9wMDRWWlB1DFN6luKxrT238lKP9mt1LBeRSGayvICupgxAVWI+rpFQD6V+GMWTGdClz6LeF+Sx71b2piX9WbQJxEx1sxjAZtFeNRn6csczLSGbcZa+3SwMzoCdWrqFR1uvSGLACppjNbQvKT9wPHnkUI6wtMqSXNrGqURZQugFlGosafSQpzqacDjTiyFOSqMX+c7M1v22ii+6uL6ha6vyoprQK6GJBQFmyXPUGoScsdPDaTnZkfRP9xWxt5B7W+QSwSSpebC8O6Wc9txPYYdylc80J4Z44PAs65UvU63LqrY5MKeI+Vl7aNEkV7S5Itw7ChmIozxOuk66sKVIAHqcehvRQcrFbXU1P4l5JcJNHbm4i7ki1WcswP6Wj9E1QMBHWmYBbHOy0T1NlL+hprYN4jvraFiVimatY2JbSQAMiKc/UY5WbH2m/FaSUh9QDPRSciTUgkelfXGY0SI7osEcoSCvUy8TSvIYkmVXYxTMolMtDq0ANpzDA1Hxp+OL6rQrKH/cnvc+x+xfuXuFvI9pPLtTWFmwKOdd2ViAU0OfWfpxr8fXuzJGPyF4ws+R9nQx28Zjjms+yqTmIrWSqKqgqBQhc66hUHhj0tzgUUoXRwFooW1M4tWbttqAZlqaqCMwQOJAHD44pku7IKf83i7TpcwusZFGWWxTONUSoZaU4UOrGnHqjLbS5P8AY91j3vZ9t3C00o0iFJzKQGWZPrDVqqhwCx+GKL1hm3HadSRWZZkm1vFLBGohW5mNHkZtOg1UHI8QcsuGeKWi+ti09o3AhhO8STG1QRyRKSsZotGJSvAk6svTOuKbItmS0NuuUlihVXe5mQdyORCe42VC5WlBUmhpQUyxS9CdXBLPue0IkiZezeaJGCqWaAE0UZdRPLPkcVsuQ3XtqzvNDFEnbKuLSNqhXzFVQgLn/iH88OrERe7glLtbNCWhQMBGoqslQw0Vqc65YsViNhqOpIhPGe3d3CGRGLkrIpy0IeVQAM+HzwMrSEwuoUiW4tnWOTXR49ClBIG1nUxCsygnDhk9UOK3ya2MjLNdOzRoVZ+2jmhoVOQ1A5YUEpkMhvbjtwW4LdgMzNJH0rHGBVw1ag5gg0rXBBFtpCiPcaq3YEVzasjosEpo0uumpQQAy6Rnl+XAkQlhUe5ST1su2900KdsxAICxt21glgxDFUNWPOgHHDWhZ3iSTcrf+hZSkG5LapHkoAgYt26MNQBXmw+P04GJsap57QLLHE5t+/SQNTtxBY8o1CgguxNAK5Gh4DPAJNhLzSIvcldYtLgvGKaZWAD1XRUZ8gePywDmRA8q3InbsxyszBwzdNCQQFPVyAIJ9eOGQlnIplghAGsSaV70dAwrwUUbIcKUHHnhkmDM7sRIxDwupSWOOgRWOVV1ZV5YCsBMHgRGWKkcHb0TRt1EscmzrUCn9tcBIH34YyZTKkkZApEFpVcx0j6hpIpStBgFJxdUZklZSf0xpljZUQmmXUToqeWfHDFIptblirD9aTuxtG6uc9YoVUsaMMuND/HEWPcUJcBVZ/u0S0kBYjUah1oGQE0NBTMfxwQTkB33lUShnYtqYySAkIwU1ViD9NMMi7Hmu1LGVjJHExCShEIIZNJqwFciOAIyHzw4BsVNLLLKtq8qxAR0gWVCNa5FjTTyqKVOYOeIiTkDJdrMWmdGFxEURoFJ0o44MOGeXrhkpFErrIJjLJFJC6rouAdCpQAuzIaAhqZ8x8MIjAdC0c/cmnSP7jSxXUQoFaValWBJIz9PTBAIcomkZLYQljK8oUayQwatCKlTkBwryywicDnaxPLJ+jJoiYDU0tWBZMmXOg4A5CtOPHEWCJXawtIIDpdY4yNNqqF3qn/s1DUq6mh1NkOXHEG4JpQPsVt3WiZ0UMwcxa10hgrVVS1KkrTPgK8eWIFiHm1ggaVmBWTtPWSVqgswrp4HKh5+nHLCCB2S0DxKZdPdDaZp1JbTIB0E8BQDLLjwxBskOv26zd46dTKqmGPVTVprqjZaHTWuR4U+OEKRwhIdqB2lt5CscjIihlcZUoBTMD8MIcitSJNE7qphNIwukal00FacvkTgBCwGZYmhZ1ZUGqeSM9VBlpbLOvM4TGHABe4kkddAV4V4AiupVoRTI8MLcYKCMsyvVZkMbMZNIB1GtageuBghxjjVRAugopWl38myWvUcIb0FkEYFCYjQMGLMwbSCMtQypU54TBKQ4JJGgKvS57gAkLkLpoc24ULA50FcIbQsWONGi0lzGF1RyhiWUNUAsPQVrmakYi2NIW6SYlV2LHSdNxHlRiPq+IJFRn8MIYoSEnVVyzBB3p2ADGvx+FeIwDg6kTLGSrLWnaRWbKpNQtGOdfXCF0OShQ8assavAv8ASHUE1DmTyPwwwgTrGX74EfdQdXcegOYzHKnAcMEiFEWlhQRUKgUV0FVpwWmXH44JJQGBWWIa6vUfqhmOnPggBPMYQRApjieiowVC503ATLTQZD41HLAINAUvFoj0hOlQTQhTkCanhXLPhgJI8hVw6dLAgqVP5TXI1pzPDAEieVHVXkIpJ9DaCa6uFK+vwOGREsxkZUKqidgaVLKtNXE1Bpwy4YcDkbp3cKFYrHG7BnKka9BpUkCvD04YEiLY2XVHQM0ZcSyUeQMBSgNCBkTWnwxZUQ0XDxmeAGRijoO6+YDUrQCg+GJIqYgkbudvVM04h1RxOABoAoyksAKioocMcAV/U7oik0K1ZHjmWncVc3pxpw+eGgkKaITR3EwiWF0o5SQEmJ4zQGtaMMEihgp4ZP8ALOoEtv3UVAoChSTnUVNCpbq54BDU6qRLI3dnjgLusaVDMzAijnjTkMSRFoi24XE0drJWUJpIqy5MKmmgnlThT0xbVEGVtvF0JNb6O8IW1OYwTqJ4KmYrkeNOfwxfVFNmVJ5NfFu9bxKZbeOgiYquqYZFvpA4k5mnPLGiiKbXRXl6wuZRG8cmsuyJMoDt1dXbovE0xcjJZIkGy7dNNPFfmExdpgoY6UDMoyT8tWrmAPXPhiNnBdTGXb4jtkzgw28LzSwqHvIZFXW0akaAK/lPLPGfI9DXRepq3xbaotttbeYRmIyK0gU8AxBJBUHp0rjmZL6mylIFm87npQa5BLEkYkjXVroX5qzBa+tPwwqVHZlOb9uStqtFnikWtJEZiiOKE1VvRePzyxpqillS7hcxTPdQKQY3MbWzMc3XMoM1oNJzArxyxYkKzIJud0kb6TNFI9oQIZaFBM5yyf8ALnyOYNMX1RUyE3t20Au7dZgiayAFZhIXYCqMFqaHiWp/LEkitsiNxcCIzVIlRVosJADAEfQG/Lwrw4YtSK2MVxJG8cscylHkDP35SFQhKEAvXgaZev8ADDYQR6e7ZItZdYpmk1SqWARkNas3+EyZ0rn/ACwQV20I3cyEH7iJFkiSKPtRtIKRgE0LV/w1yFM8WJSQsyK3k8McbjWS0pqIgP6mrnUcRwpXPFiRSxBGZYnctEViJos8YLkPwAXl88NgtSQbRBMsiqlJJF6JEKgE66DUNZBFB+Y4g2WKpc1haLtW0rC5tzrjDTIhIEmuoFNVKEAcBw44juWJET3S4SKkgjlaJyg+4QZM6VGnTqJClSeOZwITIHuEoVrp5h3IZpJA6QoEKsF/TePPgtOGYxJFdmyLXsjtNJEJAVljaF5WRu0rUAqKZHUKHF1UZ7AoVuTK0un9dVOnhWSqhTpJzAI/gcRbJ0RI9vjZWhiSKOGFaMpZDrFASVWoNGUnLKvPFdi2ujLs8TLSSAlJDoi7ImaOulVqHLajTpNFanHPGazNNUXzsVtJDayWKiOSKWNE7qHXrJBbS9RWhrQENn/PFNmX12NF+0x7Vtda1Yq9327ZjpZkzyYVPEA0J9MZMxpwqDW1g6zQRltPf6XSWmnTQcP+HrjmWUG2rkat5VpQ47jKIwXkkdaKKg5sDSmrIYsxshczx5Nbtb93vJ39vu5NMyKB3bdmXSWJrwqxzPzxuxmPIjK3mO1raSSxQF7tlhMTkJVWckVyBr3Ch6jTMcsdDGzHesmXPK7V4Nw291QxxWUqLaTqVjXSwY0jVDqJVcgKcOJrXG/HqjDepnfexHb7xvNtGHitUvJriOZFXohkBd4mZcwWDUoR6YtRTasDjZXkto3ZBMiO4i1wRmZwslTGHZcn1KKKg+nmMRsmOjktzxXyLsRAhQuhx/8AEwE1ZUqHpHTVRVzJWlTUZ8s2Shuw3g+hntD5a9s6hLuW4spVhtlgyZgzKFBU/TkaUHEc88czNSUdHHfU2R4/cK8iwIyywwKGVv8A5YRqFGLN005gcDjnZF6murB+Q2iXW3I8WqSW3bVAsa5sshYMorUniP4VOFS2pG6Mkef+PXLWtzJ9m8vdRotBCh4Yz1BypJJRmU0Ffljpcexhz1NFeD+5Wz+W+OzbdvDpcrusZtlhkYLq7yMGTqNCABlirJw3S/cuhLFy1esPqfMzeIv+1fJd02i8W5EG23EttcpIxjSW2lciN3VHUlVOQ0U4AZ546y1Rhs3VwXl4X5eCLdrknVBKFv7mdo0maGQKsILvwArQDjQZ4zZq6aGjFeTZvt35FHLBB9zeqElRuy7rpaVg5/UD0FQa86/HHIz1OnjZfqyNNAGjqpUKxkDA50zp8+OOc1Bs3QtLMR1Cj6P1AeOY9RliOwmRu9TPtyA5rricLUhjwpShy9caKlVjFn71d3urX2Wg25JRF/rnkdlDMGGcsUHWwbTUalYD0OWOv4qieVs4/lr/AOWl6nzi28un2dzH+hdQwlEGnpkjY/VUnLUOo/DPHbyanLxvSCWxJKqaBMvfcNouaMJFyB0RuAahySeFcZmzYnoVB51bpdbdJbxxRoyIxLSUjGtatpkZs9RpWo+WNOFwYcu4z+2F9JPc77souO4hiW9sLRXz7sWlZEAUAk6dNRWmWFyF1LOPYt62VI5KxRtL3FMlwBq7aEihqaihU0POvLGR7Gwk+yXCQSv99FJGIw1xKUo2qhoqsFzoAK1xBpssTRaeybmyW7qF7VyHL3jxMAyiutKEggChpT+OKWi1Msvb51ukfToLqoeCSQaqjTTMipYAVBFeHwxTYuTAN9y/28EU7QvGupopOh1kJ1hEKg16eJGEgY2bhbyELd26COAl0tSCvbadiKRUIUvQArkfXlU4mRaI3dxmO5uUeF9EiGJBNTSiMalzWoJVqg/hyxJORbDW8QhmlWRInDqftZlOrUijpDUqDlnka4aYpYVMpYR2xnZP01km1oABw/TWgDVUfGq8cNBIC5unaI1m+1toJVUW7MWKxjMyMRQ54AgUXM5jtCsUgeBGC2yjV3ATSqkg5HOuefLACQnhnYvLFFpUuaPFTW0MaqVbtLqoKnh8K8MsIJEncNxHHAuhZEk0GEVAlVVDGhJLKBzrnyOGSkJe5inhvYUWOC3R+45lLHWedK5CgFQv8sKBMTm70ABIYhMU1dwdOhVXUqp0itaCtM64aQnYJjYAxSQDQ51M0LMV1agCe2poSdVaFqH+zDFIGSSZoDbBTEUYySACrsK9MufxGdc/wzwg7g9bp5TAInAjuAQEUUDMeTjkTT+IwEZFceuMMokVY5lMveWruHFNdA3TTkfXjhkp0EgmRJZIsorbNnYqaSqaKGUDIaTn6UGEQCUdYomSJ3oQOzIKtFpJrUqTpzHDDJwDZYzdXCiZQskR75zBStaas+Hp6YYpDu8IjEXkWHuFvuXc9zhmBXLTXL+FMAj0MkaT3UoWR2gUGFahau4zEQOQYEYBwGRmGsQKfcDqN09GZXBNFcymikg8QMxThiMhuDgeQh41Iuo1Y9hCw10rVq6vzKOA9MNDqhVJ25pIh3O3CV0omoFyV6qHUahhxWnAccIbQO2ZbjW8lCwbVItK1UfRITmWJHA/jh6kR2sI+79s8KRpNCzGM5jXGwDM5AoKnjQ54ixokFrGhQXAjVXemgFgQ6NwCaRwBr9XDEWTJNt9q4BOhxE2plYDWVNAFBFSRVaCgGfA0xCzBIk9lZBhGQqBpVMluFCgoqZN26iuY4/DFbZZBIYoY+082lWjl0rDbuxDGmVK8vXC1CRxtYESdu8VkMLawoorMWrSgyBoKLQYiSTHmJaxkzSq5YiN4nUBRlmxBzoQQOGXLEWSmA5o1UDW5aIyaZ0foZaUA0ClaenrgIyOEaKZ3vGlp1DTpHxzFGyrTngHAtFuY5CoSOjMJZFZqlEYdJAFADzoeOESD1MjFY5JDG8cgKTVFGoMnkXjn6YBg9I1xrqAYJSSbMaWNTWleIPOuEAst0jJBYh0qUeKgVV0k1pUdRH8DhNsa0FZWJgwlYZik7E0CGnRUMCMuGWFqDYvRGZYwJFldozrlIVQRWuqoGR5fhXCHXQHpjkDShaqEV2DDU7rktGalDWgphMkOcEMilnjQSLIIw7cEYjIEih+kcaYgwQoRXjYRENpjyieoJAYUFeTE4BghktXMcpjWpHAgVoWcc64YScbtqwLITG1XZwKs6sKBjlWoIpyywgOMqqU1BT3KlowS2pjUgsa0plgAKYMyyAxlxUP2zTIegB4eorhigPRCxchgJEUBUkrSlDXVp54Q5B8HQKBGAANGVQG4tT0/GuCQFIU6ljoZHi01VuEinnqJ4jjTAKT2ZOtELozUBr9VfynLlT0phDk8TGInVhWFdStG7ULA5GrAmlDlTDgQjDyKGCr3QgrNb6gDwzapyz9cNC6iSUo3dDMWAFINQrpoKtSvGmJIGIHYSq2mtGYgSFhSqcMjwHrhwE6DXJRhJK0moFGR5PpdtVctNOBypnWuZxIiMMskzS6tCCSIIRExoDxXRqJIAAqfnhpFbQmcmQNGqmSN3o2kgax8a0P4jLEoGdJl/RZ2ZzECjysCiguMjHTIcQDUYaIhkclDVwzToy0iYrSWYflcih0n/FgYzyqgiZyrd8FxHkFCEMKyLWoJNeo8xhhI3XDXAXuoqKrKHQUqGYD6mFQQRnnzOGiLIJvl72o0eheBWLW8igVZjlULxIqaVOL6Irs1BUu7zmDvTxszTQt/nY0JGsupC1BFDx5DLF9YMtmU7f3E4kEqLpUITBOGCtGACSMh9RrkDjTVGe+uxGrdGmDqxaMSGlAFLCQEASDTmCzUrSuJyVqpa/ju1yhq3SOS0oka7m0lo5AKHMcyKD+7FV2a8WhqXw7x2EP3pI44ZZKKqvkHWocVpT09OOMGXJBux1nUuC6uftYG+3UlDQGLSeLfUKkVHHhjJHcX7Fb7zfuDcxRagSutyrK5iVhkqkZfMHF9EVMpzfb6ASpBcQSubaveGkKqKuYB01JHPF6RVZlXbjdW919w0mho4B3JY4yD+m506UoOBpXjixIqs30IPf3QlbqYm5lZVlikcsO2pqrDnTTUcD8cXIjOhFN0mgjv5YZSVFUDRQ5sjVqtSOAHGvH1xNIpsyLSXLsZoy5j7kkkc4diHSPPpZipIr/AMMSgiNF1cTssMNwBNLFGxlj1AkgDpbqC10mgp/dhofcRi+vTNFK09wptdWpo4xVpy3A0oCzVNWGQphlViPXL9tY1WJZJDcdy6XRoikqKKqEt1DT/DE0pINwR+Zu/NDCdHYuu6Ip5Kqc2zPHICnEZ4mkVSGR3SaZ2gcwx2/S8KqxMmdC1eQORzz4YTJwT/xDa03G7FysQuHtgJJ5ZVD5ZGmdKhuPqOGItk6osbdnjSRDCvc1MFiikYmEFmJZQTQZ0NOJ4YiibK0vWa1mdRIYZLgvUOQoK0FWJJPrQUz+OGhEIuZpgi2tRDcSAkspWhRBXT1Bi2v4ccTRVfUYUaGQF9MNZZhC9r1IQEzc6CaKTxrz+GLJKuosgMKd5YpQiqSr69SvAjZRopJYrWlKCvHL1xBl6qiSWeiN4YI7pu8iCNhqCnRmw0glgGWtDTPhxxVZj2NEeELHOLUNGiywoHtZnB1NHp1CQls8xVXryOM1maamgthto2EV0szxQsATDCnVQfUrVqlQD0gHKmRyGKmzSkWz7eL2bO9tZIRFN96GFwg1qwJ06ga8RxpijIpLcZqPYrxplPfK6ixiZgubslAC/EDgKY5+SsGmlhfuRMsM0U5EisrMwdaUAIow4E6SDlTPjiNVBKxSvl23vJFcJrCkEPNIS2pypJ0aADq9Kc8bcTM10Zg80t7hbfcUaBTczsGCllZEKNRihYV1BeqpPH1pjfjMWRQZP8nt7do7glWkluU0rMKxxmNaSBmLAOp1AcKemQrjoUehjutTNHnUkse/PPeQiJbu1t7pYijBQxQwvBKUapBKVY01HID1xZVma7RG7SWSG2luYpJLSe2HbvHV3Uwl2JSPRUEakBqRVvlXE50ITLJ7s24LDdVjiaKTQ32kcDPrLzK4btnVmamjBjkK8MU3UovxmrvbjyiW0uomkRZHSXUUhcpRUVQpUkrR/U504emMGSp0cdj6I+3fka7jCk1XFuqRJOAgRwSp6TIAAQtTSlSTjnZaG+jL+1R3JQ9wSKWaK1iTMMrEGuVTwHwxgco0Osopjzbxzvd23W3aQXMbxpcBqFViZpP1WBrUk0UnmcbuPaDJmrofLPwL3W3Labi3E+4FYba6Do0bEdqYIQo0S5BQCdRPHHqr4E0eWxZ3WCZeebxD5LcweSbczLPeRR2m6ujuVZ1FULsytVempKCtK0zOMbp26HQ+YrqRD4rvksE08feTtXDrHKdT9idiwPchLDqFCASTmCAvVQirJWS7Ga98B8zCXgWC5uEtw7x2E5jARpFUG5EZI00o2sjUaVqa5Y5mXHJ0sd9DaniXk1tultGYmYl4wxIzFY8m6W4fhjlZsTRux3JyXUNCxYK2jIngFPoQMZoL9BvuY4pYyCpcM6mNiMlI5EHPjxxZVlVkfNj9924Rpce2OxwzKl8H3Dde2W11kJWIHqOYYAjPHofDqU2ee8xb4qoxhadqGzkd5We0ZUnkgcIGGWksg00oSRypl68enk3MONyTaGsVs1xLI5WJVeGVCS5NSRSRidPGhB/hjMzbVaFSe4BW3ltjc2IhkZSYHmrJAZWq6uyjIFQSVqOJxfjMmepVvt/dJD5ts1wwaO4vZ3VwenuwTVR6Ff5D0xdkU1ZHFKZpe6tX7qRODCLhRqILGJRyoBw0aacq4xQbkdgulhmhld17yjt20lNWsCuqoyAIGdOJ5YiycEx2vcra2hh+0uGm+8AjjlUMHQCh1EGhYV5ceZABxW0WJls7HuUGuSOZzcaS6BHAjV2ppLBiMuNAtKHn6Yosi6rROAsFza3CurWiyhHjZgzFYl1K4BzBqWoNXzPpiEFiEtzFbXE0EJ1LG8VI420xkocu4xBpxWgIzoDhAyMz2gjcar0yIytK6QK8kaPHRQgl4GoBpnQc8STKrSMl000CrePbI0cThp4q6e3VqdqgNQwU1UEGlSeFMTW4txBeRSuo0sJpkpctNJ3BVQVJCJp6gSQGz6Tm1cOQgRzCYahHTvpIGlESmWQq4X9JKkdwjixFCOknp4kjG+SdbSWUfozpUGLtOVZWbqRUqAKkEkmvGmAD07NdM70DwsoMyoiuzlTQKACWBBNWI5/hhANz3LiVEaVgZTSQoQzPKRkI2JyJJ+kDOmAAkvIwVJ5WkhdQwLg0eXMCMVYZ1FThiAwk29uzKEVFqt261WTj1aCxKgLx5j1wxMVOia4Xmkkkt5I6oAucirkJC3E0J1eorlgQkJ1WeiukLGaQq1zIzgspCkhyTWnT6jMfHAMMqzNp6Y5ViDRAKUU1PJWz1V9c8MTOOrII4S/ZlcGZAM8+akVI1HMZZcaYGySYFJGlRlh/RjuP6h1DUqqDwClsqjT6euIi3B1B1TxzOWcBzbLqZNSdJJAAyFK1XLEkKA1TNDJM8oDgxh1kZyAeHST8xTOpAwMQrjMkMKpIiLLGDLFKy6zQ8UKGoB+eZwQiSClDRxqtqWJldpYXY6kBqWYAivVq5AYGiWgobXojOkwxpIVDKtZBWuuMj8hAyFDxOo4RAF0NJJKwaKC3ARwpo41iiBjUsxyJLCg9cMcwLApjhKoHQagDcrU0SlSVIFAaZ1H9+B6jiRwjhWVpIiyLFLRgNA+vIq7qSpodODoED/bW8sgLBQujS8Mq6dbkimp0y4HpJ1YgGhKrK1ZXh7sUQQgLNbvmFLjSDqo1a0NCKD1zxBktyU7fZuiGCZD2iWrG9HY6amMBgAOI4fxxXYnVEgs0aDTK9Glu6mdCpQFmAGRP0qcqkc8sRgew6W57jzMYlmlaRtEdFqrLWgDfSQPX+OAkOcDIGrGUkXONlUZigow5euIMaQ6JEhUxyCVkjT9NdGo0oNYJ001Ac64iyTZ1VKRT92hLAJFIBqATIoCOI48s8MUDlCSksYbToZtE1KsFkI5EflHxGWIsaQbEsile3paN80lpULIelqAgZV+OAmKolb/2WsyRyaQCOqv5yQTQgCtMAAox2pH0VltSmqJitAjUNRwAwCgWomkgUaMKoaQqP1NWZ0McxwOY4YiwFka6ZYRGoklKkOpUBCKkgE8uOFBJC+gZSQxSN1Q9scQa56eGqtP4YRJHbcrTsCp4vpUAqwNDQVpkCKjC3CBbAVDKyM6BAdMhI/KevUTQUp6DCaAXoEBkABRZBSNgKMK5Dp+IzrhDDydIdRoc016+Oo0zThmKYQAQCukKAYnUO+RGZOZJ4k/8uGgYAKiFHlc6gwSugaipyGkHgKYAAKoSOWRP1HiJPeYcK+tMjQZ4Qg2MFFFDVgVc6hwrzAp+JwMcAj9PbRwxikqiplrY5gkcweeADpKvUO1XQisekgofXhU8fXAJAjJpdtLaGY6ZFrRSWGer409MDGJ3YFQG0s0BEaRgZUHAn1OGiInZ9LShqVBFaHTUkZ1I5AcKYaQ0I5ZA57aHUjDVHGaBqj6cqU08zzOGJjRcOSFdEInmkVHb6X1IcqKcqUxNIrY2zSrJKQ+l5GV+5MQApAAqMjXqy48sSQ50G3uCgZmjMy6WWFwNIZR9ZB/KOX/HDgg2IkUdwLkkRDNHHqIoeNamv1etDiUCkVq8b65VlkllDDuwiioFYFa0cBiOJpXCYI6xEOkSzDTKDHLKVGrpPTShJAPqf4YAkLuWAYwCdEMg1TKOZU0ojUAPEU54khjLfSNGXdUqgpRCSC9QKE5kZcMNIhYrPyRnlD2TygvI5klSgYpHwIrzJ5Uxpxoz2clLeU3M1UhJ0Osz9lQxTWgGQY0H440UqjPdlU3krymVIf0m0CSe3BoUZTQaVJApxNONcXoo7tR72fbZrmaEWtzKLcmkfcUkq2Y68wtMzTT+HAYVnBdRJ7mhvB9h7s6RuAbZlMcFzIGAUgHiCpGpSRx9fhjJkubFTTQ1LsdsdvstMqayI41jXIshPowNaMcc+7lmqigY94vyUlaeVgUJjnWlSSeGg5cOBJ44dEQdiqd6uyyyOXdBFGNTIuTMTkp9T6n8MXpFbZVO5biLlXle0MstTruE1Bk09LMrDqPTnw+WNFUiuzK23PcCENyTIsFu5EMIAo6VAbUyjUQCPlyxakVMiV3O0Mjf5pJYpHkWSJQSrOSW4sdSj+WJog2Q+RtCtO8qpPFPQup1MFYUyBpStSSaYkitsaJb1mlV45gTCXdDpq0kdKU9AailTn+OJjUEaubyOFqOvbiCd0rISGcH61ZgOCjPI1woFZpDJNcQoQttH9xA4LyGRjGZAzFWANNIK1GQGdc8SK20RtriV1IUGWGI0ureMjUI0NAwBPoQag54mim241yNEkxhd1a2FGcMp1pGzE0WtDmONMTI9ovtqNKtsp+4SMu8aRLUBHHWAKUJAIGfr8MQZOpfnhtglntbTB2Z5ADaCoWJiK6VetCfiOHxxCxoqMO/TmaSYNIe3CopHD/SRhRi4DZj6aVHqMCK7sri4uoXQTuumOMj7qzQM3ajAdIwlRXNqVIPwxNaiki129kDC8iTrEHbuu41FmoAO02ejPgD+AriVSu3sG1Ak7/b0MXdjrNrBZ2jY/VUg1Ymg41piZXKFsUqSM0wbtvantsjRhCoB7Y5DKvHnXhisuTJZt0QaeytY27Udu5VHk6tc9c2DmpNATWv92KrFiSNQeD2f3KSGAyCUIzDsqFaR9Op5VzIIoSNOQr8KYzWRdQ0349awNZGXuKrJZVlWNVWMgMBqoQdbCnLKnLGdzJvotB58JlWETBWAja5PaJbRpbVm7hjUKKmoBxG46I0N4/cxvrhjuBJrcl1BBXKoZowCaE8M/XGG6NFSV3Kf5M3EUpk0x6WlQ6a1qq1WhOVakeueK1uNvQrvfooJI5KotyY42aBWAbV22zZwNOQOWWdMasbgqsZg8jjksnIMSPDIjus3ImVgEjbT8xSmY/jjdjZjyamVvMNvKzblb3cUTwCQloWFO1pJZSjEkiprUmlQfTHQxMw5EZa9xrMLf8Aj1+qM01/BPZaHU9ttDhwqk1+nXkSeHwxoruYcq0K6SaGaa3aaEW4bOFpQyLMyZTMz1Nacj8cTZWrDzsxaC47J1vDArJdtGsTPEFJKmJixIzNSSM+HDCalFtbdS8fD94mjitjI73DW6sbaRgxciSgj6qE6l/N+XhjJlob8LN1+zXl7TQWthJuEg+2qw1FtJkDZo+RApUDjnjn5a6HQxm+NnvBc2EElEmmu6FCoNAAE1hQQKczn/LHKyLWDdV6BfkNhJPAXim0gIrs7oCXXTQggcSOOHhtDKsux+eCO9uoI9caIHgXQ8jVUP3F6AsINSB8flnnj3M6niElBZHjnkbrCu3SFlhuYhHAs9I+zL/T11KsF0nNQcwK4oy4zXhvG48219LYSsrNHD27jtCKNUGtidL6zlqrUsMgG05acZbJM3VyIu/w/wAmdoYbe4Btpbdwy3SKWkRUV+yswFI0AJ0sUJGnjUcMeTGt0a8eSTbntp5sJLSwkV4meSQfqu7UldBRioIGQ9OYBbhjm58Wpuw3NTWO5x3lsCo7bNGROQdVStekU4nKmWOZakM31smhyhuaxjuvr1Q9MtAFKhR0nhniDQ5k+TP749yM/vJ41tiRB4dl8Xt2kQka1a6uZjVankFHMHHpvD1jEzzHlnOYzttwmigs5ELSMLhZDKOkM2gUHUTQmhFOB488bckSUYloSe1RIyZBKLeOWNpFlZu4ncEhYrIsYNC1Kt8sUWNdXoV17inswi6f7aVDJqaJpKrJRegpWmnhkGz/ALMXYjJnZRHjFxJa+VbTJIvecXK9UasUZWIZe01c6EAAY0PYhU2Z9uk9iJNItfs9ME4V6MqzCoSo5kk5gZZ+tcYbKDdVkeikeAyNFHHAChWOFWCszBqlssuAJavIfjiL1LJHTar0zUgRtSX2mOJyqrrAbhlmOqpLav45jEWhosPZ5yE+2juVMtvCCCTqSSSvQkcmZovq2frimxamWpsW6PLZzI66/uUL3OgOEohohnU5hVBJ1cCQKYraLa2JrFB3S/aaSW7Zj2tKNIy28la9sDTWgAUMBT+eKyaI7ue2WdsGiubcQQ2LMYZ3jeaJEQKQaFupy7lQwB+WHVkLVkjk69JWSF0vLiQTLbkCQywIQGLsGLM3+E+mHIDAbMRKhjt3lnhd5i4JkifMr22LOSoIqCTkPXLEyIzpDKIpo7dgbVdSNautCBK2ruRprAPbQgA1+OdcEgFTwoJxERcTPArB3C6aKxGggk5uT9Q05cssMQz3kGkRy1mW/wCMUgVgjg5MeIIGfE5nlzxKBSJpLd0Uw6gURleN3ZFCyAEEnSxND6ccKBhYZJQhrIFMT9id1qWK1MnczGkDl6/HCECRWSCZ0Ks1O2plIICAfQa8Kigz5/wwwDIbTRHLbylYo442ksZXLBhroGU1qSfQLlQ4YkBS3ngugAscE8apG8ddTdQy416T8eHpwwIArsCOESSoxgtpHqNWkzMxpVK5j0yOABV25A1u7af1x3rh1cqQR/ToykEsp6ScKRpnIrhlmJmkYyRxnXpQ6HhPSdIY0rUAZ/E88CQg2EyMEV5UMRoyMwZWjRa1UirBiOVBT1OGNuEcQLNFE7dFwSTGZI20jtioUtQlXKgdPqeOAQqaFYUVoj2FRkNvrFVGrpOo5NXL54Q0KHdlmilaFYkesUIqapTpLA1yUkGlADhkghoI4I5mQMJARpGsAI5GUtASKtTKuERY8QWjLGlwq6wXQTTKGJZaDJdJGrMUpx/DBJFC6K0liJgTVeAsxhLHRTUNTEhVTTXPKlP40wSSHu0tHAgPbcrOSsgnSoLaagVJ1MuVTpGQpkK4TGSSPb9LQXEiASI3auFYdLBgeCioocytRiDYEksrSQAoml3lcDXIT+Y1diECAFgBQ/8AmcQepNIlVpAHAeBCiQoZk7tSa5Ci0GdR6HEGW1HG2V5gjBhqnWnccHUHWuQFTw44QN6jpAjyRKIyHY6/uAUYPVeOkdOZGWeBkkLooWgkSOVyiupW2uSACFCrVSFH5vjwxBsBZAJIoyEpFrFY460bW1dNPQDlgGw2GQrbatTK6ZFSv1MKZioNAfXlhSJSKe4/XIJFGrQ6Ocnlz4KqjI+tePDhgGGyAfpEZRwkAMQQxkpQNTOgB+r44TGhYNbTFWQBlNYKVVCoUNUmnDh1YSGDQM8sbysJVkyeXPLSRTnwNcz8uWG2IVdsoiymJ5Gc6Zkqc4yRQ0GZ9eGIskOctE7pBd1nKpGxFFY/lYkZmnw54ixoUxlkfS8cbx10qqijxMR1MNRNBzBGFAwzSHVGGmUQtpqTpUsM9S8QAONMIJF8A65AzLLIV62IoGrmNINKn5ZYiOBYqGscTONSPnItCRUZZMABQ/8ADCCA1RG3Qx7cgLf5gjpNKFj86+mEAB3IjIJ1s51aj0kGtKD8OFMSA70IxUMaHSrlgNIHGpOEAF2qJNbNIZB9Kmo08yTln8BgAM7rkqykglKqrdOsEUppavDmTgHAWXZGQBEK9SrAhqiAnIl6ca/8BgBgu4OhKsCxKHUCC55kDAByNnCiNydNSGAFWCjgRWoB+JwxCVncEQGhYv0oxFSB8QTU/DDQhLMzGFJw4KhsmBr0/wCJRTq9OGGMQvKGBRk7BmoKHjkKhgQcgeGXPDIyNMjx6ZI2rQlXGTBwR+WuZy5+mJoiIroyCIyu8TOx1JCtANBqNZpxIOXHPEkRkb3/AEANRYs5o6uQWKkUWtRlQ1OJQRBVk0KqyISOpVQatQpwJNKD4DhhiRwkKyxuy9mQdSlToUg8GIB4+gy54Qzz6u9WYsHliOtQFahAqK6VVqLxqOOYwgaELMRG4kfUoClHUVfWDRdes0BJOZGeJITZHr26ASQSlaK6/cqAGbjyoQTkAeOLKohZlNb/ALgLOK+ZZS00spaOSYEMABQKc6kDiaY1UqZruCiN4vu/cSdLBkkEncZ9RBJpUR1zB+B+WNVVBmsyPRW7zXDETNM02lFu9Iji6CQQ+RpxIHHP44ckEi3fFtkklY25hXuTNG4RNJ7dP/ZkVr1ccsv54qyOEaK1NdeF+PrbQCd7cwxJKHVakVBU0A0+h9TjmZL6m/FXQmu43kduqlVCRCizyMQGDPnpGk0IAxSqyXNwVdvd6FuF10dIyyzy0qtZa6StCPpHE+uNFUUsqbebwCJ7dpmNpnGvAlWBJL0rqoTkBnXFyRWytty3QFlvTHoPeaG6zrIy0FQQoFQfQcMXVqUtwQLcbmFFWEXQgEq10t0mJSxIl06fqOVU4DFqRFkUvrsEylOwluKR/ctzniz1AADVUHKuJpFVmRu6mS9M7STtHMitCUcBJUkpUuR1AaxkD/diSRFsjF1eVjaWF2ivWXuFHBVRQaQVADZ1JJ9cOIFMDFPcoYJbkSok6MiwJKparMQ5NGqCpI9RhwRZHb2YHu28EjxyXgd/tj9da9QjWrVzzABpTE6oqdugzSTxrJcktHO8q9oABtMsarRRqyBMfHhx9cSILUMgkhtqRTH9ViA6FAwVxmHY6qdsDiOJw2CJD4zGb2eESRK5juItHc6Qp1cVZainNanqrnTLFbLarUui+nFtar2bjTcxmRZXqFjkArrRKVFTkMRRZMFd7re28yyNE8gjeq3cOkv21JoFzpUNpy9MTggyGbjcK4CRTustyUAfS1I41yUSVzDAZADLngERi4kMs1whkGkGMiZqlWjBJIXTqFaHgMWIqsI45JDI8xfsEFRZhzpaJlOmNyUDKR/fxw5EqjlE2mafvq0kttUS260SgI7bydxgVBJ41HPFbJ1RYXitnDcXTJErSJMonR/rVI6dVFZqcekUoTT0xTYuqa59vdugmNjDAFt9Vs0FnEZKL10BlWmo6JDUccssZ8jNWKppq2sRHt1zIYUjHaUzFVbVpUU6FDaV0nMkcuIxls9TbVQQvbrua1vH+3uwZ45mcDSmnOhbqWoYNSq5fDA1KE3BoDx69jmht7+ggSNKszstFZfqbpAyPOnpjLevQlVllRSEWyuFAkhasUtCKs4pkDU0Prihl06EX3NFKpcLI0gqVlqCdWqq10kEUyzqKYtqVXM2+ZwW6y3LWqiOUxRG+skWvTXQq1+kAqy0HLHQxszWqZh82sJ5pkAeJJrgySxADqWKMDJj9JbVlpp868cbsbMl9DJvuzbSy+NLepoi/wBM3G2lmium0KO8DF0lagANTVmKY1V3kxZFOhRy3j92Saf9F+4BcxGM6Yz9SspGSr6U4qRlXF2hmdWmOkJVfsoGWCFwHliglARDAz9xGlYGhVqEEip5c8BKi6lheK30FpdW753EtUkmtrkaYzJnV4SraqKuahgAByOKMiNeO6k1b4H5JLZ31u8ZmmuLho5GjZBFI0gakZ1CiVoKig4ZnPGDJVHRxX0PpP7b+RLuG2yzsRoDSF7sPqVmYKFBQjmRQmg+GOTmpB0KW0gt2YQ3e3KWdwzhUiZzpkXtFg1BwYAj5kHGWspkr1lH5wo4yZxPETG0QjSU0ViwIZnUPSnVTInhwx76Dwj2HOITh171yg7ozTtgsFJJJlkAqGXINXPBYlW0Ezttyl3WKRriRe9aMDc2bCiSW5ZR3B00yAyrnjHaupvw2klG1bkIJwVu7uUBVWVCryVjNWX9Maj+mT9Nak515YqsjUtDTfgXl08d9brc3NCUCyopBXS5Bj7cYydlzzUUHBhlnhy0nU1Y8htHwjzKO+jswJEeJnCICa8eClxQ5VqgpnmMc3LiOjjyyXNa74rQyL3mnk0MskTUqp1kFqMBQsKnSB/wxhtjLlc+Rn7t9xfdff3ys2qrI23W+3baFJzaEW5lYMBRgNUmdDlj0/ja9uFHmOfbuysq/aGmFlbxKDcxRpRxMtQhjoCNRBIAGa8vgMW5NxY1oTKJeyoMjztbyI2iVFEiMGpwWhORqD/KmKGzVVEE86WaS0mYRyQXEqOpeOOOUPGVoyUIA1mlRUYswsz8hGcbRVi3nbZJInlW2mikaYnUkilqUYZUBHEDgcbGjMmbb2K6gd9M0MXfvSyXUC1rSUa0pU8ghA+OWMOVHQxbEc8gsriyuoreslvC4YVl06cqZgj4D0xBaoteg2RTMpXrQQxhXS5j1NVwM2KCtKngBhdo6ks22dopbVWkSKAKJULKoYuwqJiVIJDAEiuXLFbSLJLI2S/ZprCOdnlgTVc3ko/qoKFkDqCEdQDwrQ5jLCaJJlzeMbk0wMcdy0k0qqz1JVlao7vbov0ha9PClOPDGe6LqslN5tsOhUQCKO3dxFHCXasUgy0cAAo4UFQcs8Vpk2tCA31lKO8YVlgmiDRxvMW/UhqAA7kUqGoKFgRw4ZYmipjBuEDTOyyRO0SPqu9S9qNQYiWdVC/QxzZQSVNBzxZVwEEcuu0ClxcosZdmjmvCvbeYQqRChUqyBApJZqgKOOeWHASN9xHbdmJ5YC7Rao3mjIlKhlWhckn+pSqmn04ERGp4rnXA0SrCsVAIGdAETipKha6GJFWypyxIiwuQBBJJ+rqmobcIWYSBQS1KopAAqRTlwzwDQnjZ1Yi7eSSrsy3sNKMWoqqgXUdKADMDjxwokbC2iuJI1l0JDc5GIVoJFBqzGtCaMeY9TzwbCBFbbsOskcquzFTIwZ6Sj8g1KBpz+o/24YBc3QXWcmW1mHY0uayRtk1CdNaseGGEgL0rLW3SNw6Kv6C6isclBTQDQnVThWlczXCgA3SqsolOm4zIlQf02IoYyoqqiueeROEAJ9aqot9UcMB1xRyDSZo3oSKBdRoRwI4GmWBCYoEa9p5S5fXRbguzKkkTAUGgK56a8G9B8cORhwiHcC6HjUfQWClw5YEh46AVkAJ+rhn8MJAKYrZUK1VgGBkW2hVWIAyZmbqGpeOWZrTACFMFtPLI4uR20ioJmnAB0nMlnanED6agjhgGOiWhhFtEVmUuGFyjnRrFaKE1cSMzlTIYUiaHeCzTN1tZpxHVLZVoWViD9CswqWGWWBgh1js5O6yoDMCFiQAAtLGWFczQVFaYiSJHaWmptMUTNEHaM6RUsQKP1FRQgAZ/PCsSSHyytu4zQQa0SjKzOANDU6aUOR4KDTliEjgWRQGXswzKDcowDQulNRU1HHKq8hXCZJD+iwRlInUSRBu6Aw1l5iCGUngDVuWItDmBwhi1PNpilEqkBiCQgU0OtQDQEU0jAtEJC+FUkKhw0ndJDvGCsgBIoBUVy4E/jhMlIupGyyKgibuEgOB0KGNVcE8zwwoBsFFrP24RpIgrmk0tQxFRUVIrxOXww4HMBxLVOlGMbGkRfSHXMaVFCR10rTPEYGK0yYERsqTU/U0kEvpzonAHjUcKfLAOQ9EjZ0K22h2OqRVGqrqDRS9OFM9VP7MRGGpmyxxo0phVREVX9NDwYVofoA4EHAiIsiWoKPVC9WkPBgDkHKgggkCtSKAZemETQsDqSW0yVcKOsMHljI6x8AMsIcihZDoCxLJKU1LHHIATp0kqik0qxOdBgAXIRp11Mj9vr1UDlq0YD1pwIGIjkUhSVI0BgAC5K0+k/S4AyC/+OGIjFqhW0AxvIiODrNKoACA44ZHEQQoBZqK4LIWZe9poQnJWB4Ch44TQ0HIc2iVSVkPSyCtNOR6zmKnCJMBcBXBHb09sKe2n1VHKnDnXAKQzSAKiMt1apFIorkigXhxwCDEh0r0q8dBqSMrktT9RJrlTlhEhNQ6XqOomtF6tI5VHA+owxAy9TTSCAx1aaFVY8C9aYBABU6+lnK5sWqoEhypUgZHAABFYqEmNVZ+uXIrJTMrX1GGhSFSPHqGiMEuekyKA1AKAIMsvU4YhDMaE64ndyM5EyEwA41HwxJCkSFw5T9IzmMadWmsYU1DUr/h45jDgJGGU6RISwDrIGjnWpLVPDjnX0xNIg2I3JSRlSPRBTQ0JGeqldQ4mnx5ccSExMXQLqjhzCdtwTVqkDpeQ1KueK5ZjAR3BwIEkdkYvShghUscn4v8AA55gYYzzzSBEi/UkMLElQKlC1KA1HOvHlgEFMo0tHDGSwDB8655MUOfHlmeeWBjljfdTUDsY26TrljFKGSlNNa8q0yxKpCxXvkO4xRq8ReZp2oNBHSrVLVqRzPAY0UoUWZQnku53MqukkNwYY2JmdNA7jPWitzNakinDLG2lYM12VL2S7XkhlY6adl5Ce4jEaaAvRaitPnwyzNrKFqS7YrU99Ga3kDwW3cMOjTHpaoShJA1KBUc+PriDJ9pp3wDxx51tkzRrRNKXVK5kdS61A9MY89zdhqaHE8djbiFKp2h+sAuk6VyqBTmRxxz38TNO2xAN23OUsJIQqK7MJo5o+kLwIVhlWmLq1I2ZV243DwxuzmSeZmcWWgA1y1CvCgJxclBDuKy3K8hKtLCjyTlWAmkJElUqS1Mq58KDj8MW1RCzK73K8Vou4XmkQGkMThe88hyc0JpQUzGLkiizIfdXtxcvHNoKqpaQsEGnvk9RKgZFSQOa88WJQVyRS4M7zMhhmcGskixsWi/xs4f8xVSDQjnliSExhurqZu2X0otzWK7vmUrqFTUNlTLIUFDliUIjMDLdziCNNJlNzbBpYYpKIGByUyygGq1aoyoMhXDaEiP3FxHDpEKSiYM/YtmH6QT8zFiNIDk0P92GoIsitxcTyzRxr245IRqjmd2WMArQiQ6dRL04AAgZL64kiqwiW4YqFYu0SEDXJUSPK9CERFArGA31L8jwOG0VoOhSUtFJGWuXUGKfUod6s1Y3LMAHJA4g1y+GDoSRa/i1pFbp32hkSNemeFdJjjZmqW1UNTnmKYgzQkPG8XjMJDFEJNChmMbkAck0kZNXmBwGCqFYge5TytPOzRyrfF/17aYgRyMynjlQ1zp/wzxLQgRCWQNonRmHaMsuYIUEkhFYsSCgWtD8csINxilklItzC7RmJT2XcmMvU1ftkqapTgcNEXoJ7WSGYxUume2KM0CxArKgJIbI1FCMqnP0oDiSIjtBpYNBEDcQyRKsbuTGrksdJkYAaQp4EjP8cJk6otrxW3RUSzcTzmEo1x30IRGRCuhJeoKCrCmdaknFLLKm4PbbbO5BAltbyB4wQLcqGiA7f0wyMukx501MTjHmN2JGk5UiXaH1oe4VCJaKNWkGgBzzcZczQfLGGdTZ0KC3Fyu4NWeO3llZ2hhSHSGcOevUAaNqyArp/HGpbFTLP8Tv2KWiyUWMxsHSIkFnRiSaLnxzNMU3qSqy8doujOkHdLTkgskrqo7YAFaqcZbrUuQK/imeKMu51qDJcOAVOlSNCoQDqGVcsFHqKyKQ8wto5LdtQnaFaNFcP0uSraqsaVIAzBP92NmNlF0ZZ8528SSxrNbsIppS8dF0u0QFFlAAXNKLWnLPjXG/HYwZEZf8y237nZN+2ztd2WaxlGt1RWE8I+oaRSoIBGVeJ9MbKudjNZQzIcc8j2tu8umRNwZQrPKTHEYzkdarqyJqagn44vqzPsOFpNF2ZDK9xFRV1QUde9KAGWSPSrGiEHhStc8SaFr0JVs11KsUKpItw0ZEP3ahRDJG5DHvagD0GgrnTELIdNzSnhm4BTDcXMojkjmDhkPVG0KhRHp0nUlOoEmtAT8MYclDo42b29pN9uCwheFo7e4krKY2du5JIpeNtEmZRuOo452eiN+K5sbY7lJ177TGWcx9uZ5A2moNRpSmlhxB4ZY511BsWp+d4/Rsv/UfQv8A6+A+n/m9P+amPdo8JX+Xp+gvuf8A4JL/ANXwm+vj9A/q/wDL6fHFbB7C+w/+D22f9f8A9KP/AKY/V/yf4Pjii+xtwkpf/prn/qv/AIJycP6X0D+r/wCPpxntutjVTcsrxv8ApWP/AFv/AMEZPq+j6T/S/wCf/wCNxRkL6bm0Pbz/AKhv/gh/8E+X1fX+f/5J/fpxzM2xuxmkrD+hF/V/6k/V9PH83/N64xM1I+R/7hf/AMsXuh/1n/wdX+pw+iP6P7/+XHqeH/prY83y/wDU+0T2f9Ofj/W/9tw4DFdizHsSa2/6W++n/pP/AGP9Ph/Z/i+GKbGuv2ER9wP/AICX31/0Y+PH6B/S+Prgw7mfOZhv/wDroP8AqPyfX/Q/qp9Hx9Pwx0ehiobS2v8AoWn9X+nHx/qf1F4fH/D+OMGTc38cW+Z/0tk/pf0U+r+t9PL4+mIVLrle2H/RQ/V9Df0/6f5vr+Pp8cDGiQW//Ryf9V/T5/Nfr/8Akf8Aj/5aYqe5aidW3/RP/W+n/wCavp/rD6fh/hwhLcunYf8Ardt/6z/puf8AU5/0f+X1+GKMnUliLjk/+Bp/+7of6v0/X/8AS+mKF0NLIfdf/BDc/p4n+lx+h/8A6P1/5sWIrIDN/wDA+X+h/wBPH/139L6h/L/H/wA2JLcQxbh/017/AFv+kg/qf0f6jf1f/kOGRY03f9af+r/1kX/SfX9KfT/4+nEkHQT3v9XcOH/Tt/1H9Xh+X4euAQk/Jb/T/TP/AEP1cF+n4/8AxmBjQmn/AOpf6/8AoJf6f18f7P8AFgQArz+jJ/8AU/8A1X/p5/H0/wCXDQhKn/wcT6vrXj/U+k8P/kfrh9BdBKv1yf1vrf6eP1f+1/5vT4YYMFF+f6P6jcP7/wD4z4YBsVS/RuPHhB/S+Y+v4+nxxEBzT/qpP+o/qp/W/q8B/T/5PXCAKh/oXP1/134//rv+f0+GJMSHG7/6O14/Wn/VfT/SXj/8b/y4r6jDYv8A4ISf0/6n/wAy/wBT6hw/uxLoNDs3/wAD/wD6pH/yrl9f/P8A4vhhPcXUdX+tPr/qP/W+r6T/AE/h/h+GEDHe1/p7Z/R4t9HD6T/R+P8AfqxIKj43/VwfR9LfV9fH8n/jjitEug42P/zV/S/944cRx+P9+EyY82n1WXDi39P6Pp/J/wCPqxWCF3/zfe8Pqi+nj+Xh/wA3phC6jj+W0/q8Jfq/p/8AvP8A444aJWDk+mP6P6Y/r/T9Q4fD+/ACHGH65+P0/m48PzYT2JC6D6Lj/wBcP9ThwP8AP0+OIsVj1n/Qb6OCfR/6B/S+GGxhn/sLX6fpT+pw+n8vx9MRBh44230f1h9X18Dw+Pr8MNgh0s/678f6jf8Ao5fX8PTEWSewCDhLw/rw8OP0p9Xx/wAOAihwH9e4+jl/U+jl9f8Af8KYiyxHrr+hz/8Ae+P1f+2/5sRDqOT/ANWf+n9K/V9XP+X/AJYl0AUW39Gy+n+sn9Phw/J8cQJLccv/AGS/0/6cn1fVy/l/ixEkK2/6VuH9NOPHj/40/HEQFNz9bfTxj/tP1f3f82IjQZ+ebj/SH1f+o8fj6/GuBEjkf9aXj/U58OH5vj64YmE//MY+n+rz+njz+OAQ4/8AzRL/APKl+f8A71/y+uIjEfOT6f8A438fh6YkhBY+mb/5dz4fj8fTCGCP1yfVwP1ceHL4+mGJhUv/AE8f08Bw+Q/ngAIn4Q/V9B+jjhkWIpP61t/Q+huHz/J8PXElsJiFP6MnD8/Hh/49cSQmMc//AE8vD6zx+n6Tw+Pp8MWIgN039F/6X/Tx/Pn/APQ/+eGDCx/Q5fUn/p48/wDmxEQpb/qLjh9H4cvp/wCXEkABv+quPo+ofRw4D6sAHrf6H+n+s3/o58P+f0wCI/ff9O/Di30/I8P/ABwriddyNij/ACL/AKaw/wCo/wCqfh9XB+H/AD+mNuMyXKT33+pt/H+rc/8AUf0/y8P+b/D+GNNSq2wwQ/R/7X6U+v6fqP1f/Jv7q4sZQtyd+O/1E4f9cPp+r/3r/lxGxoRtv23/APgMn9L+vL9H1/U31/8AN645PI3N2EeNz/rX/HgeH1cfz/DFFC6xWO8f9Ev9X+qPo/p8Rx+Hr8caEVMrbfvrb6/+oP8A1fD6Py/D1xZUg9ir90/+Cz/X/T/L9fHl/wAvr8a40V2Kivtw+i6/q/VN/U+vgfq/5/TFtSu5H7//AKXaPr+q2+f0c/8Ak/8AjqYmVoje5/8A86/r/Sv1f0+HP4/4/jTAhsju4/0bn6P+js/r/ofn4/8AyPEkRZHJOG5/X9N1/T4cT/8AQ/3YsfQgiMTf09o4f1P/AGH0fR/7L4+nxwdSD6iO4/6CT/qP+uf6/o4n+p/z+v8A71hvci9wiH+pdf1/+li/qfXxb+n/APIfTD6FbObV/S2H6f6h+n+j9bf0P+fD9SaLn2j/AOBl9w4H6eHL+r/zeuIW3L6iSX/rof8Aq/6R/o/VwH1f/G4ktiFiB/kX+v8A1Lr+l9fP6f8Am/x/CmBgRmX/AKq44/8AVx8OP0f+1/5P8GEthMaj/wBL/wDNP0RcOP1p/T/5PX8cHUTGfc/+mn/rf9e31/R9K/8A0PriSK6kx27/AOCd9/V+iP6/6v1D6/8Al9PjTCtsW0Ld8Y/6eP6v68//AFH0/k+r/m/w/GuKupN7m+/bH/prX+j9C/1Po+hfp/5f7qYwZzZi2L+3r/4Fy/R9Vv8AV9P0D6Ph6/HHPrubVsZe3L+tF/1X/Un6f6v1n+p/djoLYoe5O/Ff/qn/AKtfo+Q+n+/FNyVTQOy/9QP6n9E8ePHl/wAvrjHcuRKr/wCp/r/6NP8A18D/AE/7sQqSexQvlP8A0T/0v+ln4fT9H5vh/djbjM2QzR5X/wDAW5/p/wDTx/0/6fEf0vh/h/5sb8e5kuZx3r/qbLj9Z+vj/Tbj/wDJP8XwxvpsZbmDbP8Ar3v9f/prr/5X/WX6f+X/ABfGmL+hmybjyv8A8GF/+CH0ycf6nP8Apf8AN64VdhPYkuz/APWRf9d/Tk/ofRwT+h8P8XxpgexJF6eBcYf+u/6eX+px+puHx/x4y5TdjNs+0X/wQ2r/AOUWv9H6vqPD/lxzc5tob28T/wCki/8Au6b+n9P0jj8PX8ccrKbqH//Z", + "target_image": "data:image/png;base64,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", + "source_faces_index": [0], + "face_index": [2], + "upscaler": "None", + "scale": 1.5, + "upscale_visibility": 1, + "face_restorer": "CodeFormer", + "restorer_visibility": 1, + "codeformer_weight": 0.5, + "restore_first": 1, + "model": "inswapper_128.onnx", + "gender_source": 0, + "gender_target": 0, + "save_to_file": 1, + "result_file_path": "", + "device": "CUDA", + "mask_face": 1, + "select_source": 1, + "face_model": "elena.safetensors", + "source_folder": "C:/faces", + "random_image": 1, + "upscale_force": 1 + }' diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_external.json b/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_external.json new file mode 100644 index 0000000000000000000000000000000000000000..422aa478b9b8c58f0ff9801ba73792d697043e9d --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/example/api_external.json @@ -0,0 +1,25 @@ +{ + "source_image": "data:image/png;base64,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", + "target_image": "data:image/png;base64,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", + "source_faces_index": [0], + "face_index": [2], + "upscaler": "None", + "scale": 1.5, + "upscale_visibility": 1, + "face_restorer": "CodeFormer", + "restorer_visibility": 1, + "codeformer_weight": 0.5, + "restore_first": 1, + "model": "inswapper_128.onnx", + "gender_source": 0, + "gender_target": 0, + "save_to_file": 1, + "result_file_path": "", + "device": "CUDA", + "mask_face": 1, + "select_source": 1, + "face_model": "elena.safetensors", + "source_folder": "C:/faces", + "random_image": 1, + "upscale_force": 1 +} \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/install.py b/stable-diffusion-webui/extensions/sd-webui-reactor/install.py new file mode 100644 index 0000000000000000000000000000000000000000..ea6ec08d44253374254b382c64d831f6a7ed0784 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/install.py @@ -0,0 +1,155 @@ +import subprocess +import os, sys +from typing import Any +import pkg_resources +from tqdm import tqdm +import urllib.request +from packaging import version as pv + +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + models_path = os.path.abspath("models") + + +BASE_PATH = os.path.dirname(os.path.realpath(__file__)) + +req_file = os.path.join(BASE_PATH, "requirements.txt") + +models_dir = os.path.join(models_path, "insightface") + +# DEPRECATED: +# models_dir_old = os.path.join(models_path, "roop") +# if os.path.exists(models_dir_old): +# if not os.listdir(models_dir_old) and (not os.listdir(models_dir) or not os.path.exists(models_dir)): +# os.rename(models_dir_old, models_dir) +# else: +# import shutil +# for file in os.listdir(models_dir_old): +# shutil.move(os.path.join(models_dir_old, file), os.path.join(models_dir, file)) +# try: +# os.rmdir(models_dir_old) +# except Exception as e: +# print(f"OSError: {e}") + +model_url = "https://huggingface.co/datasets/Gourieff/ReActor/resolve/main/models/inswapper_128.onnx" +model_name = os.path.basename(model_url) +model_path = os.path.join(models_dir, model_name) + +def pip_install(*args): + subprocess.run([sys.executable, "-m", "pip", "install", *args]) + +def pip_uninstall(*args): + subprocess.run([sys.executable, "-m", "pip", "uninstall", "-y", *args]) + +def is_installed ( + package: str, version: str | None = None, strict: bool = True +): + has_package = None + try: + has_package = pkg_resources.get_distribution(package) + if has_package is not None: + installed_version = has_package.version + if (installed_version != version and strict == True) or (pv.parse(installed_version) < pv.parse(version) and strict == False): + return False + else: + return True + else: + return False + except Exception as e: + print(f"Error: {e}") + return False + +def download(url, path): + request = urllib.request.urlopen(url) + total = int(request.headers.get('Content-Length', 0)) + with tqdm(total=total, desc='Downloading...', unit='B', unit_scale=True, unit_divisor=1024) as progress: + urllib.request.urlretrieve(url, path, reporthook=lambda count, block_size, total_size: progress.update(block_size)) + +if not os.path.exists(models_dir): + os.makedirs(models_dir) + +if not os.path.exists(model_path): + download(model_url, model_path) + +# print("ReActor preheating...", end=' ') + +last_device = None +first_run = False +available_devices = ["CPU", "CUDA"] + +try: + last_device_log = os.path.join(BASE_PATH, "last_device.txt") + with open(last_device_log) as f: + last_device = f.readline().strip() + if last_device not in available_devices: + last_device = None +except: + last_device = "CPU" + first_run = True + with open(os.path.join(BASE_PATH, "last_device.txt"), "w") as txt: + txt.write(last_device) + +with open(req_file) as file: + install_count = 0 + ort = "onnxruntime-gpu" + import torch + cuda_version = None + try: + if torch.cuda.is_available(): + cuda_version = torch.version.cuda + print(f"CUDA {cuda_version}") + if first_run or last_device is None: + last_device = "CUDA" + elif torch.backends.mps.is_available() or hasattr(torch,'dml') or hasattr(torch,'privateuseone'): + ort = "onnxruntime" + # to prevent errors when ORT-GPU is installed but we want ORT instead: + if first_run: + pip_uninstall("onnxruntime", "onnxruntime-gpu") + # just in case: + if last_device == "CUDA" or last_device is None: + last_device = "CPU" + else: + if last_device == "CUDA" or last_device is None: + last_device = "CPU" + with open(os.path.join(BASE_PATH, "last_device.txt"), "w") as txt: + txt.write(last_device) + if cuda_version is not None and float(cuda_version)>=12: # CU12 + if not is_installed(ort,"1.17.1",False): + install_count += 1 + pip_uninstall("onnxruntime", "onnxruntime-gpu") + pip_install(ort,"--extra-index-url","https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/") + elif not is_installed(ort,"1.16.1",False): + install_count += 1 + pip_install(ort, "-U") + except Exception as e: + print(e) + print(f"\nERROR: Failed to install {ort} - ReActor won't start") + raise e + # print(f"Device: {last_device}") + strict = True + for package in file: + package_version = None + try: + package = package.strip() + if "==" in package: + package_version = package.split('==')[1] + elif ">=" in package: + package_version = package.split('>=')[1] + strict = False + if not is_installed(package,package_version,strict): + install_count += 1 + pip_install(package) + except Exception as e: + print(e) + print(f"\nERROR: Failed to install {package} - ReActor won't start") + raise e + if install_count > 0: + print(f""" + +---------------------------------+ + --- PLEASE, RESTART the Server! --- + +---------------------------------+ + """) diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/last_device.txt b/stable-diffusion-webui/extensions/sd-webui-reactor/last_device.txt new file mode 100644 index 0000000000000000000000000000000000000000..e5e9362b18ac3262c15f7b22bf6d121b202d3a3b --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/last_device.txt @@ -0,0 +1 @@ +CUDA \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_modules/__pycache__/reactor_mask.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_modules/__pycache__/reactor_mask.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aa2a16d94eac7ec44c89a6ff66e65c6f3d40d8e Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_modules/__pycache__/reactor_mask.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_modules/reactor_mask.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_modules/reactor_mask.py new file mode 100644 index 0000000000000000000000000000000000000000..4109989aa3ea1d98cabfa7cc807f35e0d5c79d2b --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_modules/reactor_mask.py @@ -0,0 +1,176 @@ +import cv2 +import numpy as np +from PIL import Image, ImageDraw + +from torchvision.transforms.functional import to_pil_image + +from scripts.reactor_logger import logger +from scripts.reactor_inferencers.bisenet_mask_generator import BiSeNetMaskGenerator +from scripts.reactor_entities.face import FaceArea +from scripts.reactor_entities.rect import Rect + + +colors = [ + (255, 0, 0), + (0, 255, 0), + (0, 0, 255), + (255, 255, 0), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (0, 128, 128), +] + +def color_generator(colors): + while True: + for color in colors: + yield color + + +def process_face_image( + face: FaceArea, + **kwargs, + ) -> Image: + image = np.array(face.image) + overlay = image.copy() + color_iter = color_generator(colors) + cv2.rectangle(overlay, (0, 0), (image.shape[1], image.shape[0]), next(color_iter), -1) + l, t, r, b = face.face_area_on_image + cv2.rectangle(overlay, (l, t), (r, b), (0, 0, 0), 10) + if face.landmarks_on_image is not None: + for landmark in face.landmarks_on_image: + cv2.circle(overlay, (int(landmark.x), int(landmark.y)), 6, (0, 0, 0), 10) + alpha = 0.3 + output = cv2.addWeighted(image, 1 - alpha, overlay, alpha, 0) + + return Image.fromarray(output) + + +def apply_face_mask(swapped_image:np.ndarray,target_image:np.ndarray,target_face,entire_mask_image:np.array)->np.ndarray: + logger.status("Correcting Face Mask") + mask_generator = BiSeNetMaskGenerator() + face = FaceArea(target_image,Rect.from_ndarray(np.array(target_face.bbox)),1.6,512,"") + face_image = np.array(face.image) + process_face_image(face) + face_area_on_image = face.face_area_on_image + mask = mask_generator.generate_mask( + face_image, + face_area_on_image=face_area_on_image, + affected_areas=["Face"], + mask_size=0, + use_minimal_area=True + ) + mask = cv2.blur(mask, (12, 12)) + # """entire_mask_image = np.zeros_like(target_image)""" + larger_mask = cv2.resize(mask, dsize=(face.width, face.height)) + entire_mask_image[ + face.top : face.bottom, + face.left : face.right, + ] = larger_mask + + result = Image.composite(Image.fromarray(swapped_image),Image.fromarray(target_image), Image.fromarray(entire_mask_image).convert("L")) + return np.array(result) + + +def rotate_array(image: np.ndarray, angle: float) -> np.ndarray: + if angle == 0: + return image + + h, w = image.shape[:2] + center = (w // 2, h // 2) + + M = cv2.getRotationMatrix2D(center, angle, 1.0) + return cv2.warpAffine(image, M, (w, h)) + + +def rotate_image(image: Image, angle: float) -> Image: + if angle == 0: + return image + return Image.fromarray(rotate_array(np.array(image), angle)) + + +def correct_face_tilt(angle: float) -> bool: + angle = abs(angle) + if angle > 180: + angle = 360 - angle + return angle > 40 + + +def _dilate(arr: np.ndarray, value: int) -> np.ndarray: + kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (value, value)) + return cv2.dilate(arr, kernel, iterations=1) + + +def _erode(arr: np.ndarray, value: int) -> np.ndarray: + kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (value, value)) + return cv2.erode(arr, kernel, iterations=1) + + +def dilate_erode(img: Image.Image, value: int) -> Image.Image: + """ + The dilate_erode function takes an image and a value. + If the value is positive, it dilates the image by that amount. + If the value is negative, it erodes the image by that amount. + + Parameters + ---------- + img: PIL.Image.Image + the image to be processed + value: int + kernel size of dilation or erosion + + Returns + ------- + PIL.Image.Image + The image that has been dilated or eroded + """ + if value == 0: + return img + + arr = np.array(img) + arr = _dilate(arr, value) if value > 0 else _erode(arr, -value) + + return Image.fromarray(arr) + +def mask_to_pil(masks, shape: tuple[int, int]) -> list[Image.Image]: + """ + Parameters + ---------- + masks: torch.Tensor, dtype=torch.float32, shape=(N, H, W). + The device can be CUDA, but `to_pil_image` takes care of that. + + shape: tuple[int, int] + (width, height) of the original image + """ + n = masks.shape[0] + return [to_pil_image(masks[i], mode="L").resize(shape) for i in range(n)] + +def create_mask_from_bbox( + bboxes: list[list[float]], shape: tuple[int, int] +) -> list[Image.Image]: + """ + Parameters + ---------- + bboxes: list[list[float]] + list of [x1, y1, x2, y2] + bounding boxes + shape: tuple[int, int] + shape of the image (width, height) + + Returns + ------- + masks: list[Image.Image] + A list of masks + + """ + masks = [] + for bbox in bboxes: + mask = Image.new("L", shape, 0) + mask_draw = ImageDraw.Draw(mask) + mask_draw.rectangle(bbox, fill=255) + masks.append(mask) + return masks diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__init__.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..22bba1f24fe1ee4c72570afbf47c59868cf42c98 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__init__.py @@ -0,0 +1,5 @@ +import reactor_ui.reactor_upscale_ui as ui_upscale +import reactor_ui.reactor_tools_ui as ui_tools +import reactor_ui.reactor_settings_ui as ui_settings +import reactor_ui.reactor_main_ui as ui_main +import reactor_ui.reactor_detection_ui as ui_detection diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/__init__.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649cdf2f6fb86d79d5b5f93b42e4397ce465e6b2 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/__init__.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_detection_ui.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_detection_ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cac8a10d440f092435152aa50cc36b6a4c9c7f21 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_detection_ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_main_ui.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_main_ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acd848d957ffaa84ae52639169fa50432a8c519e Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_main_ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_settings_ui.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_settings_ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25b374cc73fa35e5c53e7a789c8f9b6557ad339e Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_settings_ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_tools_ui.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_tools_ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15afba3d735cff31bd5479f6113416f82a7f86eb Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_tools_ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_upscale_ui.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_upscale_ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d2d60064d216c66272136d3e48a3504dbf9021c Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/__pycache__/reactor_upscale_ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_detection_ui.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_detection_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..58f7111b79ddeb7f105032130c43931b76c89a75 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_detection_ui.py @@ -0,0 +1,54 @@ +import gradio as gr +from scripts.reactor_swapper import ( + clear_faces, + clear_faces_list, + clear_faces_target, + clear_faces_all +) + +# TAB DETECTION +def show(show_br: bool = True): + with gr.Tab("Detection"): + with gr.Row(): + det_thresh = gr.Slider( + minimum=0.1, + maximum=1.0, + value=0.5, + step=0.01, + label="Threshold", + info="The higher the value, the more sensitive the detection is to what is considered a face (0.5 by default)", + scale=2 + ) + det_maxnum = gr.Slider( + minimum=0, + maximum=20, + value=0, + step=1, + label="Max Faces", + info="Maximum number of faces to detect (0 is unlimited)", + scale=1 + ) + # gr.Markdown("
", visible=show_br) + gr.Markdown("Hashed images get processed with previously set detection parameters (the face is hashed with all available parameters to bypass the analyzer and speed up the process). Please clear the hash if you want to apply new detection settings.", visible=show_br) + with gr.Row(): + imgs_hash_clear_single = gr.Button( + value="Clear Source Images Hash (Single)", + scale=1 + ) + imgs_hash_clear_multiple = gr.Button( + value="Clear Source Images Hash (Multiple)", + scale=1 + ) + imgs_hash_clear_target = gr.Button( + value="Clear Target Image Hash", + scale=1 + ) + imgs_hash_clear_all = gr.Button( + value="Clear All Hash" + ) + progressbar_area = gr.Markdown("") + imgs_hash_clear_single.click(clear_faces,None,[progressbar_area]) + imgs_hash_clear_multiple.click(clear_faces_list,None,[progressbar_area]) + imgs_hash_clear_target.click(clear_faces_target,None,[progressbar_area]) + imgs_hash_clear_all.click(clear_faces_all,None,[progressbar_area]) + return det_thresh, det_maxnum diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_main_ui.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_main_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..bbbd24810d6803b7d1aff4bb152c15c7c6285132 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_main_ui.py @@ -0,0 +1,192 @@ +import gradio as gr +from scripts.reactor_helpers import ( + get_model_names, + get_facemodels +) +from scripts.reactor_swapper import ( + clear_faces_list, +) +from modules import shared + +# SAVE_ORIGINAL: bool = False + +def update_fm_list(selected: str): + return gr.Dropdown.update( + value=selected, choices=get_model_names(get_facemodels) + ) + +# TAB MAIN +def show(is_img2img: bool, show_br: bool = True, **msgs): + + # def on_select_source(selected: bool, evt: gr.SelectData): + def on_select_source(evt: gr.SelectData): + # global SAVE_ORIGINAL + if evt.index == 2: + # if SAVE_ORIGINAL != selected: + # SAVE_ORIGINAL = selected + return { + control_col_1: gr.Column.update(visible=False), + control_col_2: gr.Column.update(visible=False), + control_col_3: gr.Column.update(visible=True), + # save_original: gr.Checkbox.update(value=False,visible=False), + imgs_hash_clear: gr.Button.update(visible=True) + } + if evt.index == 0: + return { + control_col_1: gr.Column.update(visible=True), + control_col_2: gr.Column.update(visible=False), + control_col_3: gr.Column.update(visible=False), + # save_original: gr.Checkbox.update(value=SAVE_ORIGINAL,visible=show_br), + imgs_hash_clear: gr.Button.update(visible=False) + } + if evt.index == 1: + return { + control_col_1: gr.Column.update(visible=False), + control_col_2: gr.Column.update(visible=True), + control_col_3: gr.Column.update(visible=False), + # save_original: gr.Checkbox.update(value=SAVE_ORIGINAL,visible=show_br), + imgs_hash_clear: gr.Button.update(visible=False) + } + + progressbar_area = gr.Markdown("") + with gr.Tab("Main"): + with gr.Column(): + with gr.Row(): + select_source = gr.Radio( + ["Image(s)","Face Model","Folder"], + value="Image(s)", + label="Select Source", + type="index", + scale=1, + ) + with gr.Column(visible=False) as control_col_2: + with gr.Row(): + face_models = get_model_names(get_facemodels) + face_model = gr.Dropdown( + choices=face_models, + label="Choose Face Model", + value="None", + scale=1, + ) + fm_update = gr.Button( + value="๐Ÿ”„", + variant="tool", + ) + fm_update.click( + update_fm_list, + inputs=[face_model], + outputs=[face_model], + ) + imgs_hash_clear = gr.Button( + value="Clear Source Images Hash", + scale=1, + visible=False, + ) + imgs_hash_clear.click(clear_faces_list,None,[progressbar_area]) + gr.Markdown("
", visible=show_br) + with gr.Column(visible=True) as control_col_1: + gr.Markdown("
๐Ÿ”ฝ๐Ÿ”ฝ๐Ÿ”ฝ Single Image has priority when both Areas in use ๐Ÿ”ฝ๐Ÿ”ฝ๐Ÿ”ฝ
") + with gr.Row(): + img = gr.Image( + type="pil", + label="Single Source Image", + ) + imgs = gr.Files( + label=f"Multiple Source Images{msgs['extra_multiple_source']}", + file_types=["image"], + ) + with gr.Column(visible=False) as control_col_3: + gr.Markdown("Clear Hash if you see the previous face was swapped instead of the new one") + with gr.Row(): + source_folder = gr.Textbox( + value="", + placeholder="Paste here the path to the folder containing source faces images", + label=f"Source Folder{msgs['extra_multiple_source']}", + scale=2, + ) + random_image = gr.Checkbox( + False, + label="Random Image", + info="Randomly select an image from the path", + scale=1, + ) + setattr(face_model, "do_not_save_to_config", True) + if is_img2img: + save_original = gr.Checkbox( + False, + label="Save Original (Swap in generated only)", + info="Save the original image(s) made before swapping" + ) + else: + save_original = gr.Checkbox( + False, + label="Save Original", + info="Save the original image(s) made before swapping", + visible=show_br + ) + # imgs.upload(on_files_upload_uncheck_so,[save_original],[save_original],show_progress=False) + # imgs.clear(on_files_clear,None,[save_original],show_progress=False) + imgs.clear(clear_faces_list,None,None,show_progress=False) + mask_face = gr.Checkbox( + False, + label="Face Mask Correction", + info="Apply this option if you see some pixelation around face contours" + ) + gr.Markdown("
", visible=show_br) + gr.Markdown("Source Image (above):") + with gr.Row(): + source_faces_index = gr.Textbox( + value="0", + placeholder="Which face(s) to use as Source (comma separated)", + label="Comma separated face number(s); Example: 0,2,1", + ) + gender_source = gr.Radio( + ["No", "Female Only", "Male Only"], + value="No", + label="Gender Detection (Source)", + type="index", + ) + gr.Markdown("
", visible=show_br) + gr.Markdown("Target Image (result):") + with gr.Row(): + faces_index = gr.Textbox( + value="0", + placeholder="Which face(s) to Swap into Target (comma separated)", + label="Comma separated face number(s); Example: 1,0,2", + ) + gender_target = gr.Radio( + ["No", "Female Only", "Male Only"], + value="No", + label="Gender Detection (Target)", + type="index", + ) + gr.Markdown("
", visible=show_br) + with gr.Row(): + face_restorer_name = gr.Radio( + label="Restore Face", + choices=["None"] + [x.name() for x in shared.face_restorers], + value=shared.face_restorers[0].name(), + type="value", + ) + with gr.Column(): + face_restorer_visibility = gr.Slider( + 0, 1, 1, step=0.1, label="Restore Face Visibility" + ) + codeformer_weight = gr.Slider( + 0, 1, 0.5, step=0.1, label="CodeFormer Weight (Fidelity)", info="0 = far from original (max restoration), 1 = close to original (min restoration)" + ) + gr.Markdown("
", visible=show_br) + swap_in_source = gr.Checkbox( + False, + label="Swap in source image", + visible=is_img2img, + ) + swap_in_generated = gr.Checkbox( + True, + label="Swap in generated image", + visible=is_img2img, + ) + # select_source.select(on_select_source,[save_original],[control_col_1,control_col_2,control_col_3,save_original,imgs_hash_clear],show_progress=False) + select_source.select(on_select_source,None,[control_col_1,control_col_2,control_col_3,imgs_hash_clear],show_progress=False) + + return img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_settings_ui.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_settings_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..431fd2ace658b84a0cae3dce80b4d3ca63ee4389 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_settings_ui.py @@ -0,0 +1,77 @@ +import gradio as gr +from scripts.reactor_logger import logger +from scripts.reactor_helpers import get_models, set_Device +from scripts.reactor_globals import DEVICE, DEVICE_LIST +try: + import torch.cuda as cuda + EP_is_visible = True if cuda.is_available() else False +except: + EP_is_visible = False + +def update_models_list(selected: str): + return gr.Dropdown.update( + value=selected, choices=get_models() + ) + +def show(hash_check_block: bool = True): + # TAB SETTINGS + with gr.Tab("Settings"): + models = get_models() + with gr.Row(visible=EP_is_visible): + device = gr.Radio( + label="Execution Provider", + choices=DEVICE_LIST, + value=DEVICE, + type="value", + info="Click 'Save' to apply. If you already run 'Generate' - RESTART is required: (A1111) Extensions Tab -> 'Apply and restart UI' or (SD.Next) close the Server and start it again", + scale=2, + ) + save_device_btn = gr.Button("Save", scale=0) + save = gr.Markdown("", visible=EP_is_visible) + setattr(device, "do_not_save_to_config", True) + save_device_btn.click( + set_Device, + inputs=[device], + outputs=[save], + ) + with gr.Row(): + if len(models) == 0: + logger.warning( + "You should at least have one model in models directory, please read the doc here: https://github.com/Gourieff/sd-webui-reactor/" + ) + model = gr.Dropdown( + choices=models, + label="Model not found, please download one and refresh the list" + ) + else: + model = gr.Dropdown( + choices=models, label="Model", value=models[0] + ) + models_update = gr.Button( + value="๐Ÿ”„", + variant="tool", + ) + models_update.click( + update_models_list, + inputs=[model], + outputs=[model], + ) + console_logging_level = gr.Radio( + ["No log", "Minimum", "Default"], + value="Minimum", + label="Console Log Level", + type="index" + ) + gr.Markdown("
", visible=hash_check_block) + with gr.Row(visible=hash_check_block): + source_hash_check = gr.Checkbox( + True, + label="Source Image Hash Check", + info="Recommended to keep it ON. Processing is faster when Source Image is the same." + ) + target_hash_check = gr.Checkbox( + False, + label="Target Image Hash Check", + info="Affects if you use Extras tab or img2img with only 'Swap in source image' on." + ) + return model, device, console_logging_level, source_hash_check, target_hash_check \ No newline at end of file diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_tools_ui.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_tools_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..a131ac8eea743262eda147a6639491c9ff013083 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_tools_ui.py @@ -0,0 +1,61 @@ +import gradio as gr +from scripts.reactor_swapper import build_face_model, blend_faces + +# TAB TOOLS +def show(): + with gr.Tab("Tools"): + with gr.Tab("Face Models"): + + with gr.Tab("Single"): + gr.Markdown("Load an image containing one person, name it and click 'Build and Save'") + img_fm = gr.Image( + type="pil", + label="Load an Image to build -Face Model-", + ) + with gr.Row(equal_height=True): + fm_name = gr.Textbox( + value="", + placeholder="Please type any name (e.g. Elena)", + label="Face Model Name", + ) + save_fm_btn = gr.Button("Build and Save") + save_fm = gr.Markdown("You can find saved models in 'models/reactor/faces'") + save_fm_btn.click( + build_face_model, + inputs=[img_fm, fm_name], + outputs=[save_fm], + ) + + with gr.Tab("Blend"): + gr.Markdown("Load a set of images containing any person, name it and click 'Build and Save'") + with gr.Row(): + imgs_fm = gr.Files( + label=f"Load Images to build -Blended Face Model-", + file_types=["image"] + ) + with gr.Column(): + compute_method = gr.Radio( + ["Mean", "Median", "Mode"], + value="Mean", + label="Compute Method", + type="index", + info="Mean (recommended) - Average value (best result ๐Ÿ‘); Median* - Mid-point value (may be funny ๐Ÿ˜…); Mode - Most common value (may be scary ๐Ÿ˜จ); *Mean and Median will be simillar if you load two images" + ) + shape_check = gr.Checkbox( + False, + label="Check -Embedding Shape- on Similarity", + info="(Experimental) Turn it ON if you want to skip the faces which are too much different from the first one in the list to prevent some probable 'shape mismatches'" + ) + with gr.Row(equal_height=True): + fm_name = gr.Textbox( + value="", + placeholder="Please type any name (e.g. Elena)", + label="Face Model Name", + ) + save_fm_btn = gr.Button("Build and Save") + save_fm = gr.Markdown("You can find saved models in 'models/reactor/faces'") + save_fm_btn.click( + blend_faces, + inputs=[imgs_fm, fm_name, compute_method, shape_check], + outputs=[save_fm], + ) diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_upscale_ui.py b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_upscale_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..f5256d86609fe161a027da27f0e602226ee69718 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/reactor_ui/reactor_upscale_ui.py @@ -0,0 +1,47 @@ +import gradio as gr +from modules import shared + +def update_upscalers_list(selected: str): + return gr.Dropdown.update( + value=selected, choices=[upscaler.name for upscaler in shared.sd_upscalers] + ) + +# TAB UPSCALE +def show(show_br: bool = True): + with gr.Tab("Upscale"): + with gr.Row(): + restore_first = gr.Checkbox( + True, + label="1. Restore Face -> 2. Upscale (-Uncheck- if you want vice versa)", + info="Postprocessing Order", + scale=2 + ) + upscale_force = gr.Checkbox( + False, + label="Force Upscale", + info="Upscale anyway - even if no face found", + scale=1 + ) + with gr.Row(): + upscaler_name = gr.Dropdown( + choices=[upscaler.name for upscaler in shared.sd_upscalers], + label="Upscaler", + value="None", + info="Won't scale if you choose -Swap in Source- via img2img, only 1x-postprocessing will affect (texturing, denoising, restyling etc.)" + ) + upscalers_update = gr.Button( + value="๐Ÿ”„", + variant="tool", + ) + upscalers_update.click( + update_upscalers_list, + inputs=[upscaler_name], + outputs=[upscaler_name], + ) + gr.Markdown("
", visible=show_br) + with gr.Row(): + upscaler_scale = gr.Slider(1, 8, 1, step=0.1, label="Scale by") + upscaler_visibility = gr.Slider( + 0, 1, 1, step=0.1, label="Upscaler Visibility (if scale = 1)" + ) + return restore_first, upscaler_name, upscaler_scale, upscaler_visibility, upscale_force diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/requirements.txt b/stable-diffusion-webui/extensions/sd-webui-reactor/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..96892a83b3f25371310352ab500baa24ef776a2e --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/requirements.txt @@ -0,0 +1,3 @@ +insightface==0.7.3 +onnx>=1.14.0 +opencv-python>=4.7.0.72 diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/console_log_patch.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/console_log_patch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee09018831293327a7819f33aa2d4153b6d0537f Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/console_log_patch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_api.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fce51941ba226c6ccca48821aeea561572c5c48d Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_api.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_faceswap.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_faceswap.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba99f873f81a54961a78b06e42a19f578b4dc5aa Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_faceswap.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_globals.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_globals.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f98e7fee70759bcc40ce281702f1a9b4fcc9469 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_globals.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_helpers.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_helpers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a92ecb10ebe3577c25a8120c26d28d0e3fb674d Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_helpers.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_logger.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_logger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a547db51fa2a19848dc93a04f8f549eeb0fe93e Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_logger.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_swapper.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_swapper.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..334539fd96acbc58a900d61f368cb2ceec2e6650 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_swapper.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_version.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_version.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14b4cc3fe17e6915cda290b937b8983821347d8e Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_version.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_xyz.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_xyz.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1687784bffb3381280c5442a914e18d144baf2d6 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/__pycache__/reactor_xyz.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/console_log_patch.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/console_log_patch.py new file mode 100644 index 0000000000000000000000000000000000000000..362dec68faafbee1020707e8ab1319cbfa966750 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/console_log_patch.py @@ -0,0 +1,120 @@ +import os.path as osp +import glob +import logging +import insightface +from insightface.model_zoo.model_zoo import ModelRouter, PickableInferenceSession +from insightface.model_zoo.retinaface import RetinaFace +from insightface.model_zoo.landmark import Landmark +from insightface.model_zoo.attribute import Attribute +from insightface.model_zoo.inswapper import INSwapper +from insightface.model_zoo.arcface_onnx import ArcFaceONNX +from insightface.app import FaceAnalysis +from insightface.utils import DEFAULT_MP_NAME, ensure_available +from insightface.model_zoo import model_zoo +import onnxruntime +import onnx +from onnx import numpy_helper +from scripts.reactor_logger import logger + + +def patched_get_model(self, **kwargs): + session = PickableInferenceSession(self.onnx_file, **kwargs) + inputs = session.get_inputs() + input_cfg = inputs[0] + input_shape = input_cfg.shape + outputs = session.get_outputs() + + if len(outputs) >= 5: + return RetinaFace(model_file=self.onnx_file, session=session) + elif input_shape[2] == 192 and input_shape[3] == 192: + return Landmark(model_file=self.onnx_file, session=session) + elif input_shape[2] == 96 and input_shape[3] == 96: + return Attribute(model_file=self.onnx_file, session=session) + elif len(inputs) == 2 and input_shape[2] == 128 and input_shape[3] == 128: + return INSwapper(model_file=self.onnx_file, session=session) + elif input_shape[2] == input_shape[3] and input_shape[2] >= 112 and input_shape[2] % 16 == 0: + return ArcFaceONNX(model_file=self.onnx_file, session=session) + else: + return None + + +def patched_faceanalysis_init(self, name=DEFAULT_MP_NAME, root='~/.insightface', allowed_modules=None, **kwargs): + onnxruntime.set_default_logger_severity(3) + self.models = {} + self.model_dir = ensure_available('models', name, root=root) + onnx_files = glob.glob(osp.join(self.model_dir, '*.onnx')) + onnx_files = sorted(onnx_files) + for onnx_file in onnx_files: + model = model_zoo.get_model(onnx_file, **kwargs) + if model is None: + print('model not recognized:', onnx_file) + elif allowed_modules is not None and model.taskname not in allowed_modules: + print('model ignore:', onnx_file, model.taskname) + del model + elif model.taskname not in self.models and (allowed_modules is None or model.taskname in allowed_modules): + self.models[model.taskname] = model + else: + print('duplicated model task type, ignore:', onnx_file, model.taskname) + del model + assert 'detection' in self.models + self.det_model = self.models['detection'] + + +def patched_faceanalysis_prepare(self, ctx_id, det_thresh=0.5, det_size=(640, 640)): + self.det_thresh = det_thresh + assert det_size is not None + self.det_size = det_size + for taskname, model in self.models.items(): + if taskname == 'detection': + model.prepare(ctx_id, input_size=det_size, det_thresh=det_thresh) + else: + model.prepare(ctx_id) + + +def patched_inswapper_init(self, model_file=None, session=None): + self.model_file = model_file + self.session = session + model = onnx.load(self.model_file) + graph = model.graph + self.emap = numpy_helper.to_array(graph.initializer[-1]) + self.input_mean = 0.0 + self.input_std = 255.0 + if self.session is None: + self.session = onnxruntime.InferenceSession(self.model_file, None) + inputs = self.session.get_inputs() + self.input_names = [] + for inp in inputs: + self.input_names.append(inp.name) + outputs = self.session.get_outputs() + output_names = [] + for out in outputs: + output_names.append(out.name) + self.output_names = output_names + assert len(self.output_names) == 1 + input_cfg = inputs[0] + input_shape = input_cfg.shape + self.input_shape = input_shape + self.input_size = tuple(input_shape[2:4][::-1]) + + +def patch_insightface(get_model, faceanalysis_init, faceanalysis_prepare, inswapper_init): + insightface.model_zoo.model_zoo.ModelRouter.get_model = get_model + insightface.app.FaceAnalysis.__init__ = faceanalysis_init + insightface.app.FaceAnalysis.prepare = faceanalysis_prepare + insightface.model_zoo.inswapper.INSwapper.__init__ = inswapper_init + + +original_functions = [ModelRouter.get_model, FaceAnalysis.__init__, FaceAnalysis.prepare, INSwapper.__init__] +patched_functions = [patched_get_model, patched_faceanalysis_init, patched_faceanalysis_prepare, patched_inswapper_init] + + +def apply_logging_patch(console_logging_level): + if console_logging_level == 0: + patch_insightface(*patched_functions) + logger.setLevel(logging.WARNING) + elif console_logging_level == 1: + patch_insightface(*patched_functions) + logger.setLevel(logging.STATUS) + elif console_logging_level == 2: + patch_insightface(*original_functions) + logger.setLevel(logging.INFO) diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_api.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_api.py new file mode 100644 index 0000000000000000000000000000000000000000..5fb9969adcca3cf3cf5defec8da719f57fc31a0b --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_api.py @@ -0,0 +1,171 @@ +''' +Thanks SpenserCai for the original version of the roop api script +----------------------------------- +--- ReActor External API v1.0.7 --- +----------------------------------- +''' +import os, glob +from datetime import datetime, date +from fastapi import FastAPI, Body +# from fastapi.exceptions import HTTPException +# from io import BytesIO +# from PIL import Image +# import base64 +# import numpy as np +# import cv2 + +# from modules.api.models import * +from modules import scripts, shared +from modules.api import api + +import gradio as gr + +from scripts.reactor_swapper import EnhancementOptions, swap_face, DetectionOptions +from scripts.reactor_logger import logger +from scripts.reactor_helpers import get_facemodels + +# XYZ init: +from scripts.reactor_xyz import run +try: + import modules.script_callbacks as script_callbacks + script_callbacks.on_before_ui(run) + # script_callbacks.on_app_started(reactor_api) +except: + pass + + +def default_file_path(): + time = datetime.now() + today = date.today() + current_date = today.strftime('%Y-%m-%d') + current_time = time.strftime('%H-%M-%S') + output_file = 'output_'+current_date+'_'+current_time+'.png' + return os.path.join(os.path.abspath("outputs/api"), output_file) + +def get_face_restorer(name): + for restorer in shared.face_restorers: + if restorer.name() == name: + return restorer + return None + +def get_upscaler(name): + for upscaler in shared.sd_upscalers: + if upscaler.name == name: + return upscaler + return None + +def get_models(): + models_path = os.path.join(scripts.basedir(), "models/insightface/*") + models = glob.glob(models_path) + models = [x for x in models if x.endswith(".onnx") or x.endswith(".pth")] + return models + +def get_full_model(model_name): + models = get_models() + for model in models: + model_path = os.path.split(model) + if model_path[1] == model_name: + return model + return None + +# def decode_base64_to_image_rgba(encoding): +# if encoding.startswith("data:image/"): +# encoding = encoding.split(";")[1].split(",")[1] +# try: +# im_bytes = base64.b64decode(encoding) +# im_arr = np.frombuffer(im_bytes, dtype=np.uint8) # im_arr is one-dim Numpy array +# img = cv2.imdecode(im_arr, flags=cv2.IMREAD_UNCHANGED) +# img = cv2.cvtColor(img, cv2.COLOR_BGRA2RGBA) +# image = Image.fromarray(img, mode="RGBA") +# return image +# except Exception as e: +# raise HTTPException(status_code=500, detail="Invalid encoded image") from e + +def reactor_api(_: gr.Blocks, app: FastAPI): + @app.post("/reactor/image") + async def reactor_image( + source_image: str = Body("",title="Source Face Image"), + target_image: str = Body("",title="Target Image"), + source_faces_index: list[int] = Body([0],title="Comma separated face number(s) from swap-source image"), + face_index: list[int] = Body([0],title="Comma separated face number(s) for target image (result)"), + upscaler: str = Body("None",title="Upscaler"), + scale: float = Body(1,title="Scale by"), + upscale_visibility: float = Body(1,title="Upscaler visibility (if scale = 1)"), + face_restorer: str = Body("None",title="Restore Face: 0 - None; 1 - CodeFormer; 2 - GFPGA"), + restorer_visibility: float = Body(1,title="Restore visibility value"), + codeformer_weight: float = Body(0.5,title="CodeFormer Weight"), + restore_first: int = Body(1,title="Restore face -> Then upscale, 1 - True, 0 - False"), + model: str = Body("inswapper_128.onnx",title="Model"), + gender_source: int = Body(0,title="Gender Detection (Source) (0 - No, 1 - Female Only, 2 - Male Only)"), + gender_target: int = Body(0,title="Gender Detection (Target) (0 - No, 1 - Female Only, 2 - Male Only)"), + save_to_file: int = Body(0,title="Save Result to file, 0 - No, 1 - Yes"), + result_file_path: str = Body("",title="(if 'save_to_file = 1') Result file path"), + device: str = Body("CPU",title="CPU or CUDA (if you have it)"), + mask_face: int = Body(0,title="Face Mask Correction, 1 - True, 0 - False"), + select_source: int = Body(0,title="Select Source, 0 - Image, 1 - Face Model, 2 - Source Folder"), + face_model: str = Body("None",title="Filename of the face model (from 'models/reactor/faces'), e.g. elena.safetensors"), + source_folder: str = Body("",title="The path to the folder containing source faces images"), + random_image: int = Body(0,title="Randomly select an image from the path"), + upscale_force: int = Body(0,title="Force Upscale even if no face found"), + det_thresh: float = Body(0.5,title="Face Detection Threshold"), + det_maxnum: int = Body(0,title="Maximum number of faces to detect (0 is unlimited)"), + ): + s_image = api.decode_base64_to_image(source_image) if select_source == 0 else None + t_image = api.decode_base64_to_image(target_image) + + if t_image.mode == 'RGBA': + _, _, _, alpha = t_image.split() + else: + alpha = None + + sf_index = source_faces_index + f_index = face_index + gender_s = gender_source + gender_t = gender_target + restore_first_bool = True if restore_first == 1 else False + mask_face = True if mask_face == 1 else False + random_image = False if random_image == 0 else True + upscale_force = False if upscale_force == 0 else True + up_options = EnhancementOptions(do_restore_first=restore_first_bool, scale=scale, upscaler=get_upscaler(upscaler), upscale_visibility=upscale_visibility,face_restorer=get_face_restorer(face_restorer),restorer_visibility=restorer_visibility,codeformer_weight=codeformer_weight,upscale_force=upscale_force) + det_options = DetectionOptions(det_thresh=det_thresh, det_maxnum=det_maxnum) + use_model = get_full_model(model) + if use_model is None: + Exception("Model not found") + result = swap_face(s_image, t_image, use_model, sf_index, f_index, up_options, gender_s, gender_t, True, True, device, mask_face, select_source, face_model, source_folder, None, random_image,det_options) + result_img = result[0] + + if alpha is not None: + result_img = result_img.convert("RGBA") + result_img.putalpha(alpha) + + if save_to_file == 1: + if result_file_path == "": + result_file_path = default_file_path() + try: + result_img.save(result_file_path, format='PNG') + logger.status("Result has been saved to: %s", result_file_path) + except Exception as e: + logger.error("Error while saving result: %s",e) + return {"image": api.encode_pil_to_base64(result_img)} + + @app.get("/reactor/models") + async def reactor_models(): + model_names = [os.path.split(model)[1] for model in get_models()] + return {"models": model_names} + + @app.get("/reactor/upscalers") + async def reactor_upscalers(): + names = [upscaler.name for upscaler in shared.sd_upscalers] + return {"upscalers": names} + + @app.get("/reactor/facemodels") + async def reactor_facemodels(): + facemodels = [os.path.split(model)[1].split(".")[0] for model in get_facemodels()] + return {"facemodels": facemodels} + +try: + import modules.script_callbacks as script_callbacks + + script_callbacks.on_app_started(reactor_api) +except: + pass diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/__pycache__/face.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/__pycache__/face.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8c02391b98f6a2675d6f9982334a489d013d489 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/__pycache__/face.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/__pycache__/rect.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/__pycache__/rect.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..275c0ee9d23084ffd81b61c9a10dc237f834cb9d Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/__pycache__/rect.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/face.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/face.py new file mode 100644 index 0000000000000000000000000000000000000000..4c7a78489a56e3f269cae9958b603fc19214c43e --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/face.py @@ -0,0 +1,147 @@ +import traceback + +import cv2 +import numpy as np +from modules import images +from PIL import Image + + +from scripts.reactor_entities.rect import Point, Rect + + +class FaceArea: + def __init__(self, entire_image: np.ndarray, face_area: Rect, face_margin: float, face_size: int, upscaler: str): + self.face_area = face_area + self.center = face_area.center + left, top, right, bottom = face_area.to_square() + + self.left, self.top, self.right, self.bottom = self.__ensure_margin( + left, top, right, bottom, entire_image, face_margin + ) + + self.width = self.right - self.left + self.height = self.bottom - self.top + + self.image = self.__crop_face_image(entire_image, face_size, upscaler) + self.face_size = face_size + self.scale_factor = face_size / self.width + self.face_area_on_image = self.__get_face_area_on_image() + self.landmarks_on_image = self.__get_landmarks_on_image() + + def __get_face_area_on_image(self): + left = int((self.face_area.left - self.left) * self.scale_factor) + top = int((self.face_area.top - self.top) * self.scale_factor) + right = int((self.face_area.right - self.left) * self.scale_factor) + bottom = int((self.face_area.bottom - self.top) * self.scale_factor) + return self.__clip_values(left, top, right, bottom) + + def __get_landmarks_on_image(self): + landmarks = [] + if self.face_area.landmarks is not None: + for landmark in self.face_area.landmarks: + landmarks.append( + Point( + int((landmark.x - self.left) * self.scale_factor), + int((landmark.y - self.top) * self.scale_factor), + ) + ) + return landmarks + + def __crop_face_image(self, entire_image: np.ndarray, face_size: int, upscaler: str): + cropped = entire_image[self.top : self.bottom, self.left : self.right, :] + if upscaler: + return images.resize_image(0, Image.fromarray(cropped), face_size, face_size, upscaler) + else: + return Image.fromarray(cv2.resize(cropped, dsize=(face_size, face_size))) + + def __ensure_margin(self, left: int, top: int, right: int, bottom: int, entire_image: np.ndarray, margin: float): + entire_height, entire_width = entire_image.shape[:2] + + side_length = right - left + margin = min(min(entire_height, entire_width) / side_length, margin) + diff = int((side_length * margin - side_length) / 2) + + top = top - diff + bottom = bottom + diff + left = left - diff + right = right + diff + + if top < 0: + bottom = bottom - top + top = 0 + if left < 0: + right = right - left + left = 0 + + if bottom > entire_height: + top = top - (bottom - entire_height) + bottom = entire_height + if right > entire_width: + left = left - (right - entire_width) + right = entire_width + + return left, top, right, bottom + + def get_angle(self) -> float: + landmarks = getattr(self.face_area, "landmarks", None) + if landmarks is None: + return 0 + + eye1 = getattr(landmarks, "eye1", None) + eye2 = getattr(landmarks, "eye2", None) + if eye2 is None or eye1 is None: + return 0 + + try: + dx = eye2.x - eye1.x + dy = eye2.y - eye1.y + if dx == 0: + dx = 1 + angle = np.arctan(dy / dx) * 180 / np.pi + + if dx < 0: + angle = (angle + 180) % 360 + return angle + except Exception: + print(traceback.format_exc()) + return 0 + + def rotate_face_area_on_image(self, angle: float): + center = [ + (self.face_area_on_image[0] + self.face_area_on_image[2]) / 2, + (self.face_area_on_image[1] + self.face_area_on_image[3]) / 2, + ] + + points = [ + [self.face_area_on_image[0], self.face_area_on_image[1]], + [self.face_area_on_image[2], self.face_area_on_image[3]], + ] + + angle = np.radians(angle) + rot_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) + + points = np.array(points) - center + points = np.dot(points, rot_matrix.T) + points += center + left, top, right, bottom = (int(points[0][0]), int(points[0][1]), int(points[1][0]), int(points[1][1])) + + left, right = (right, left) if left > right else (left, right) + top, bottom = (bottom, top) if top > bottom else (top, bottom) + + width, height = right - left, bottom - top + if width < height: + left, right = left - (height - width) // 2, right + (height - width) // 2 + elif height < width: + top, bottom = top - (width - height) // 2, bottom + (width - height) // 2 + return self.__clip_values(left, top, right, bottom) + + def __clip_values(self, *args): + result = [] + for val in args: + if val < 0: + result.append(0) + elif val > self.face_size: + result.append(self.face_size) + else: + result.append(val) + return tuple(result) diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/rect.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/rect.py new file mode 100644 index 0000000000000000000000000000000000000000..424b5556b0c90d5ae4da0f9447a370308f6c3c57 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_entities/rect.py @@ -0,0 +1,78 @@ +from typing import Dict, NamedTuple, Tuple + +import numpy as np + + +class Point(NamedTuple): + x: int + y: int + + +class Landmarks(NamedTuple): + eye1: Point + eye2: Point + nose: Point + mouth1: Point + mouth2: Point + + +class Rect: + def __init__( + self, + left: int, + top: int, + right: int, + bottom: int, + tag: str = "face", + landmarks: Landmarks = None, + attributes: Dict[str, str] = {}, + ) -> None: + self.tag = tag + self.left = left + self.top = top + self.right = right + self.bottom = bottom + self.center = int((right + left) / 2) + self.middle = int((top + bottom) / 2) + self.width = right - left + self.height = bottom - top + self.size = self.width * self.height + self.landmarks = landmarks + self.attributes = attributes + + @classmethod + def from_ndarray( + cls, + face_box: np.ndarray, + tag: str = "face", + landmarks: Landmarks = None, + attributes: Dict[str, str] = {}, + ) -> "Rect": + left, top, right, bottom, *_ = list(map(int, face_box)) + return cls(left, top, right, bottom, tag, landmarks, attributes) + + def to_tuple(self) -> Tuple[int, int, int, int]: + return self.left, self.top, self.right, self.bottom + + def to_square(self): + left, top, right, bottom = self.to_tuple() + + width = right - left + height = bottom - top + + if width % 2 == 1: + right = right + 1 + width = width + 1 + if height % 2 == 1: + bottom = bottom + 1 + height = height + 1 + + diff = int(abs(width - height) / 2) + if width > height: + top = top - diff + bottom = bottom + diff + else: + left = left - diff + right = right + diff + + return left, top, right, bottom diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_faceswap.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_faceswap.py new file mode 100644 index 0000000000000000000000000000000000000000..df0239b94a787c51a7108fb49c8eb0a1d2d62994 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_faceswap.py @@ -0,0 +1,710 @@ +import os, glob +import gradio as gr +from PIL import Image + +from typing import List + +import modules.scripts as scripts +from modules.upscaler import Upscaler, UpscalerData +from modules import scripts, shared, images, scripts_postprocessing, ui_components +from modules.processing import ( + Processed, + StableDiffusionProcessing, + StableDiffusionProcessingImg2Img, +) +from modules.face_restoration import FaceRestoration +from modules.images import save_image + +from reactor_ui import ( + ui_main, + ui_upscale, + ui_tools, + ui_settings, + ui_detection, +) +from scripts.reactor_logger import logger +from scripts.reactor_swapper import ( + EnhancementOptions, + DetectionOptions, + swap_face, + check_process_halt, + reset_messaged, +) +from scripts.reactor_version import version_flag, app_title +from scripts.console_log_patch import apply_logging_patch +from scripts.reactor_helpers import ( + make_grid, + set_Device, + get_SDNEXT, +) +from scripts.reactor_globals import SWAPPER_MODELS_PATH #, DEVICE, DEVICE_LIST + + +class FaceSwapScript(scripts.Script): + def title(self): + return f"{app_title}" + + def show(self, is_img2img): + return scripts.AlwaysVisible + + def ui(self, is_img2img): + with ui_components.InputAccordion(False, label=f"{app_title}") as enable: + # with gr.Accordion(f"{app_title}", open=False): + + # def on_files_upload_uncheck_so(selected: bool): + # global SAVE_ORIGINAL + # SAVE_ORIGINAL = selected + # return gr.Checkbox.update(value=False,visible=False) + # def on_files_clear(): + # clear_faces_list() + # return gr.Checkbox.update(value=SAVE_ORIGINAL,visible=True) + + # SD.Next fix + if get_SDNEXT(): + enable = gr.Checkbox(False, label="Enable") + + # enable = gr.Checkbox(False, label="Enable", info=f"The Fast and Simple FaceSwap Extension - {version_flag}") + gr.Markdown(f"The Fast and Simple FaceSwap Extension - {version_flag}") + + # TAB MAIN + msgs: dict = { + "extra_multiple_source": "", + } + img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image = ui_main.show(is_img2img=is_img2img, **msgs) + + # TAB DETECTION + det_thresh, det_maxnum = ui_detection.show() + + # TAB UPSCALE + restore_first, upscaler_name, upscaler_scale, upscaler_visibility, upscale_force = ui_upscale.show() + + # TAB TOOLS + ui_tools.show() + + # TAB SETTINGS + model, device, console_logging_level, source_hash_check, target_hash_check = ui_settings.show() + + gr.Markdown("by
Eugene Gourieff") + + return [ + img, + enable, + source_faces_index, + faces_index, + model, + face_restorer_name, + face_restorer_visibility, + restore_first, + upscaler_name, + upscaler_scale, + upscaler_visibility, + swap_in_source, + swap_in_generated, + console_logging_level, + gender_source, + gender_target, + save_original, + codeformer_weight, + source_hash_check, + target_hash_check, + device, + mask_face, + select_source, + face_model, + source_folder, + imgs, + random_image, + upscale_force, + det_thresh, + det_maxnum + ] + + + @property + def upscaler(self) -> UpscalerData: + for upscaler in shared.sd_upscalers: + if upscaler.name == self.upscaler_name: + return upscaler + return None + + @property + def face_restorer(self) -> FaceRestoration: + for face_restorer in shared.face_restorers: + if face_restorer.name() == self.face_restorer_name: + return face_restorer + return None + + @property + def enhancement_options(self) -> EnhancementOptions: + return EnhancementOptions( + do_restore_first=self.restore_first, + scale=self.upscaler_scale, + upscaler=self.upscaler, + face_restorer=self.face_restorer, + upscale_visibility=self.upscaler_visibility, + restorer_visibility=self.face_restorer_visibility, + codeformer_weight=self.codeformer_weight, + upscale_force=self.upscale_force + ) + + @property + def detection_options(self) -> DetectionOptions: + return DetectionOptions( + det_thresh=self.det_thresh, + det_maxnum=self.det_maxnum + ) + + def process( + self, + p: StableDiffusionProcessing, + img, + enable, + source_faces_index, + faces_index, + model, + face_restorer_name, + face_restorer_visibility, + restore_first, + upscaler_name, + upscaler_scale, + upscaler_visibility, + swap_in_source, + swap_in_generated, + console_logging_level, + gender_source, + gender_target, + save_original, + codeformer_weight, + source_hash_check, + target_hash_check, + device, + mask_face, + select_source, + face_model, + source_folder, + imgs, + random_image, + upscale_force, + det_thresh, + det_maxnum + ): + self.enable = enable + if self.enable: + + logger.debug("*** Start process") + + reset_messaged() + if check_process_halt(): + return + + global SWAPPER_MODELS_PATH + self.source = img + self.face_restorer_name = face_restorer_name + self.upscaler_scale = upscaler_scale + self.upscaler_visibility = upscaler_visibility + self.face_restorer_visibility = face_restorer_visibility + self.restore_first = restore_first + self.upscaler_name = upscaler_name + self.swap_in_source = swap_in_source + self.swap_in_generated = swap_in_generated + self.model = os.path.join(SWAPPER_MODELS_PATH,model) + self.console_logging_level = console_logging_level + self.gender_source = gender_source + self.gender_target = gender_target + self.save_original = save_original + self.codeformer_weight = codeformer_weight + self.source_hash_check = source_hash_check + self.target_hash_check = target_hash_check + self.device = device + self.mask_face = mask_face + self.select_source = select_source + self.face_model = face_model + self.source_folder = source_folder + self.source_imgs = imgs + self.random_image = random_image + self.upscale_force = upscale_force + self.det_thresh=det_thresh + self.det_maxnum=det_maxnum + if self.gender_source is None or self.gender_source == "No": + self.gender_source = 0 + if self.gender_target is None or self.gender_target == "No": + self.gender_target = 0 + self.source_faces_index = [ + int(x) for x in source_faces_index.strip(",").split(",") if x.isnumeric() + ] + self.faces_index = [ + int(x) for x in faces_index.strip(",").split(",") if x.isnumeric() + ] + if len(self.source_faces_index) == 0: + self.source_faces_index = [0] + if len(self.faces_index) == 0: + self.faces_index = [0] + if self.save_original is None: + self.save_original = False + if self.source_hash_check is None: + self.source_hash_check = True + if self.target_hash_check is None: + self.target_hash_check = False + if self.mask_face is None: + self.mask_face = False + if self.random_image is None: + self.random_image = False + if self.upscale_force is None: + self.upscale_force = False + + if shared.state.job_count > 0: + # logger.debug(f"Job count: {shared.state.job_count}") + self.face_restorer_visibility = shared.opts.data['restorer_visibility'] if 'restorer_visibility' in shared.opts.data.keys() else face_restorer_visibility + self.codeformer_weight = shared.opts.data['codeformer_weight'] if 'codeformer_weight' in shared.opts.data.keys() else codeformer_weight + self.mask_face = shared.opts.data['mask_face'] if 'mask_face' in shared.opts.data.keys() else mask_face + self.face_model = shared.opts.data['face_model'] if 'face_model' in shared.opts.data.keys() else face_model + + logger.debug("*** Set Device") + set_Device(self.device) + + if (self.save_original is None or not self.save_original) and (self.select_source == 2 or self.source_imgs is not None): + p.do_not_save_samples = True + + if ((self.source is not None or self.source_imgs is not None) and self.select_source == 0) or ((self.face_model is not None and self.face_model != "None") and self.select_source == 1) or ((self.source_folder is not None and self.source_folder != "") and self.select_source == 2): + logger.debug("*** Log patch") + apply_logging_patch(console_logging_level) + + if isinstance(p, StableDiffusionProcessingImg2Img) and self.swap_in_source: + + logger.debug("*** Check process") + + logger.status("Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index) + + for i in range(len(p.init_images)): + if len(p.init_images) > 1: + logger.status("Swap in %s", i) + result, output, swapped = swap_face( + self.source, + p.init_images[i], + source_faces_index=self.source_faces_index, + faces_index=self.faces_index, + model=self.model, + enhancement_options=self.enhancement_options, + gender_source=self.gender_source, + gender_target=self.gender_target, + source_hash_check=self.source_hash_check, + target_hash_check=self.target_hash_check, + device=self.device, + mask_face=self.mask_face, + select_source=self.select_source, + face_model = self.face_model, + source_folder = None, + source_imgs = None, + random_image = False, + detection_options=self.detection_options, + ) + p.init_images[i] = result + # result_path = get_image_path(p.init_images[i], p.outpath_samples, "", p.all_seeds[i], p.all_prompts[i], "txt", p=p, suffix="-swapped") + # if len(output) != 0: + # with open(result_path, 'w', encoding="utf8") as f: + # f.writelines(output) + + if shared.state.interrupted or shared.state.skipped: + return + + else: + logger.error("Please provide a source face") + return + + def postprocess(self, p: StableDiffusionProcessing, processed: Processed, *args): + if self.enable: + + logger.debug("*** Check postprocess - before IF") + + reset_messaged() + if check_process_halt(): + return + + if self.save_original or ((self.select_source == 2 and self.source_folder is not None and self.source_folder != "") or (self.select_source == 0 and self.source_imgs is not None and self.source is None)): + + logger.debug("*** Check postprocess - after IF") + + postprocess_run: bool = True + + orig_images : List[Image.Image] = processed.images[processed.index_of_first_image:] + orig_infotexts : List[str] = processed.infotexts[processed.index_of_first_image:] + + result_images: List = processed.images + # result_info: List = processed.infotexts + + if self.swap_in_generated: + + logger.status("Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index) + + if self.source is not None: + # self.source_folder = None + self.source_imgs = None + + for i,(img,info) in enumerate(zip(orig_images, orig_infotexts)): + if check_process_halt(): + postprocess_run = False + break + if len(orig_images) > 1: + logger.status("Swap in %s", i) + result, output, swapped = swap_face( + self.source, + img, + source_faces_index=self.source_faces_index, + faces_index=self.faces_index, + model=self.model, + enhancement_options=self.enhancement_options, + gender_source=self.gender_source, + gender_target=self.gender_target, + source_hash_check=self.source_hash_check, + target_hash_check=self.target_hash_check, + device=self.device, + mask_face=self.mask_face, + select_source=self.select_source, + face_model = self.face_model, + source_folder = self.source_folder, + source_imgs = self.source_imgs, + random_image = self.random_image, + detection_options=self.detection_options, + ) + + if self.select_source == 2 or (self.select_source == 0 and self.source_imgs is not None and self.source is None): + if len(result) > 0 and swapped > 0: + # result_images.extend(result) + if self.save_original: + result_images.extend(result) + else: + result_images = result + suffix = "-swapped" + for i,x in enumerate(result): + try: + img_path = save_image(result[i], p.outpath_samples, "", p.all_seeds[0], p.all_prompts[0], "png", info=info, p=p, suffix=suffix) + except: + logger.error("Cannot save a result image - please, check SD WebUI Settings (Saving and Paths)") + + elif len(result) == 0: + logger.error("Cannot create a result image") + + else: + if result is not None and swapped > 0: + result_images.append(result) + suffix = "-swapped" + try: + img_path = save_image(result, p.outpath_samples, "", p.all_seeds[0], p.all_prompts[0], "png", info=info, p=p, suffix=suffix) + except: + logger.error("Cannot save a result image - please, check SD WebUI Settings (Saving and Paths)") + elif result is None: + logger.error("Cannot create a result image") + + # if len(output) != 0: + # split_fullfn = os.path.splitext(img_path[0]) + # fullfn = split_fullfn[0] + ".txt" + # with open(fullfn, 'w', encoding="utf8") as f: + # f.writelines(output) + + if shared.opts.return_grid and len(result_images) > 2 and postprocess_run: + grid = make_grid(result_images) + result_images.insert(0, grid) + try: + save_image(grid, p.outpath_grids, "grid", p.all_seeds[0], p.all_prompts[0], shared.opts.grid_format, info=info, short_filename=not shared.opts.grid_extended_filename, p=p, grid=True) + except: + logger.error("Cannot save a grid - please, check SD WebUI Settings (Saving and Paths)") + + processed.images = result_images + # processed.infotexts = result_info + + elif self.select_source == 0 and self.source is not None and self.source_imgs is not None: + + logger.debug("*** Check postprocess - after ELIF") + + if self.result is not None: + orig_infotexts : List[str] = processed.infotexts[processed.index_of_first_image:] + processed.images = [self.result] + try: + img_path = save_image(self.result, p.outpath_samples, "", p.all_seeds[0], p.all_prompts[0], "png", info=orig_infotexts[0], p=p, suffix="") + except: + logger.error("Cannot save a result image - please, check SD WebUI Settings (Saving and Paths)") + else: + logger.error("Cannot create a result image") + + + def postprocess_batch(self, p, *args, **kwargs): + if self.enable and not self.save_original: + logger.debug("*** Check postprocess_batch") + images = kwargs["images"] + + def postprocess_image(self, p, script_pp: scripts.PostprocessImageArgs, *args): + if self.enable and self.swap_in_generated and not self.save_original and ((self.select_source == 0 and self.source is not None) or self.select_source == 1): + + logger.debug("*** Check postprocess_image") + + current_job_number = shared.state.job_no + 1 + job_count = shared.state.job_count + if current_job_number == job_count: + reset_messaged() + if check_process_halt(): + return + + # if (self.source is not None and self.select_source == 0) or ((self.face_model is not None and self.face_model != "None") and self.select_source == 1): + logger.status("Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index) + image: Image.Image = script_pp.image + result, output, swapped = swap_face( + self.source, + image, + source_faces_index=self.source_faces_index, + faces_index=self.faces_index, + model=self.model, + enhancement_options=self.enhancement_options, + gender_source=self.gender_source, + gender_target=self.gender_target, + source_hash_check=self.source_hash_check, + target_hash_check=self.target_hash_check, + device=self.device, + mask_face=self.mask_face, + select_source=self.select_source, + face_model = self.face_model, + source_folder = None, + source_imgs = None, + random_image = False, + detection_options=self.detection_options, + ) + self.result = result + try: + pp = scripts_postprocessing.PostprocessedImage(result) + pp.info = {} + p.extra_generation_params.update(pp.info) + script_pp.image = pp.image + + # if len(output) != 0: + # result_path = get_image_path(script_pp.image, p.outpath_samples, "", p.all_seeds[0], p.all_prompts[0], "txt", p=p, suffix="-swapped") + # if len(output) != 0: + # with open(result_path, 'w', encoding="utf8") as f: + # f.writelines(output) + except: + logger.error("Cannot create a result image") + + +class FaceSwapScriptExtras(scripts_postprocessing.ScriptPostprocessing): + name = 'ReActor' + order = 20000 + + def ui(self): + with ui_components.InputAccordion(False, label=f"{app_title}") as enable: + # with gr.Accordion(f"{app_title}", open=False): + + # SD.Next fix + if get_SDNEXT(): + enable = gr.Checkbox(False, label="Enable") + + # enable = gr.Checkbox(False, label="Enable", info=f"The Fast and Simple FaceSwap Extension - {version_flag}") + gr.Markdown(f"The Fast and Simple FaceSwap Extension - {version_flag}") + + # TAB MAIN + msgs: dict = { + "extra_multiple_source": " | ะกomparison grid as a result", + } + img, imgs, select_source, face_model, source_folder, save_original, mask_face, source_faces_index, gender_source, faces_index, gender_target, face_restorer_name, face_restorer_visibility, codeformer_weight, swap_in_source, swap_in_generated, random_image = ui_main.show(is_img2img=False, show_br=False, **msgs) + + # TAB DETECTION + det_thresh, det_maxnum = ui_detection.show() + + # TAB UPSCALE + restore_first, upscaler_name, upscaler_scale, upscaler_visibility, upscale_force = ui_upscale.show(show_br=False) + + # TAB TOOLS + ui_tools.show() + + # TAB SETTINGS + model, device, console_logging_level, source_hash_check, target_hash_check = ui_settings.show(hash_check_block=False) + + gr.Markdown("by Eugene Gourieff") + + args = { + 'img': img, + 'enable': enable, + 'source_faces_index': source_faces_index, + 'faces_index': faces_index, + 'model': model, + 'face_restorer_name': face_restorer_name, + 'face_restorer_visibility': face_restorer_visibility, + 'restore_first': restore_first, + 'upscaler_name': upscaler_name, + 'upscaler_scale': upscaler_scale, + 'upscaler_visibility': upscaler_visibility, + 'console_logging_level': console_logging_level, + 'gender_source': gender_source, + 'gender_target': gender_target, + 'codeformer_weight': codeformer_weight, + 'device': device, + 'mask_face': mask_face, + 'select_source': select_source, + 'face_model': face_model, + 'source_folder': source_folder, + 'imgs': imgs, + 'random_image': random_image, + 'upscale_force': upscale_force, + 'det_thresh': det_thresh, + 'det_maxnum': det_maxnum, + } + return args + + @property + def upscaler(self) -> UpscalerData: + for upscaler in shared.sd_upscalers: + if upscaler.name == self.upscaler_name: + return upscaler + return None + + @property + def face_restorer(self) -> FaceRestoration: + for face_restorer in shared.face_restorers: + if face_restorer.name() == self.face_restorer_name: + return face_restorer + return None + + @property + def enhancement_options(self) -> EnhancementOptions: + return EnhancementOptions( + do_restore_first=self.restore_first, + scale=self.upscaler_scale, + upscaler=self.upscaler, + face_restorer=self.face_restorer, + upscale_visibility=self.upscaler_visibility, + restorer_visibility=self.face_restorer_visibility, + codeformer_weight=self.codeformer_weight, + upscale_force=self.upscale_force, + ) + + @property + def detection_options(self) -> DetectionOptions: + return DetectionOptions( + det_thresh=self.det_thresh, + det_maxnum=self.det_maxnum + ) + + def process(self, pp: scripts_postprocessing.PostprocessedImage, **args): + if args['enable']: + reset_messaged() + if check_process_halt(): + return + + global SWAPPER_MODELS_PATH + self.source = args['img'] + self.face_restorer_name = args['face_restorer_name'] + self.upscaler_scale = args['upscaler_scale'] + self.upscaler_visibility = args['upscaler_visibility'] + self.face_restorer_visibility = args['face_restorer_visibility'] + self.restore_first = args['restore_first'] + self.upscaler_name = args['upscaler_name'] + self.model = os.path.join(SWAPPER_MODELS_PATH, args['model']) + self.console_logging_level = args['console_logging_level'] + self.gender_source = args['gender_source'] + self.gender_target = args['gender_target'] + self.codeformer_weight = args['codeformer_weight'] + self.device = args['device'] + self.mask_face = args['mask_face'] + self.select_source = args['select_source'] + self.face_model = args['face_model'] + self.source_folder = args['source_folder'] + self.source_imgs = args['imgs'] + self.random_image = args['random_image'] + self.upscale_force = args['upscale_force'] + self.det_thresh = args['det_thresh'] + self.det_maxnum = args['det_maxnum'] + if self.gender_source is None or self.gender_source == "No": + self.gender_source = 0 + if self.gender_target is None or self.gender_target == "No": + self.gender_target = 0 + self.source_faces_index = [ + int(x) for x in args['source_faces_index'].strip(",").split(",") if x.isnumeric() + ] + self.faces_index = [ + int(x) for x in args['faces_index'].strip(",").split(",") if x.isnumeric() + ] + if len(self.source_faces_index) == 0: + self.source_faces_index = [0] + if len(self.faces_index) == 0: + self.faces_index = [0] + if self.mask_face is None: + self.mask_face = False + if self.random_image is None: + self.random_image = False + if self.upscale_force is None: + self.upscale_force = False + + current_job_number = shared.state.job_no + 1 + job_count = shared.state.job_count + if current_job_number == job_count: + reset_messaged() + + set_Device(self.device) + + logger.debug("We're here: process() 1") + + if (self.source is not None and self.select_source == 0) or ((self.face_model is not None and self.face_model != "None") and self.select_source == 1) or ((self.source_folder is not None and self.source_folder != "") and self.select_source == 2) or ((self.source_imgs is not None and self.source is None) and self.select_source == 0): + + logger.debug("We're here: process() 2") + + if self.source is not None and self.select_source == 0: + self.source_imgs = None + + apply_logging_patch(self.console_logging_level) + logger.status("Working: source face index %s, target face index %s", self.source_faces_index, self.faces_index) + # if self.select_source != 2: + image: Image.Image = pp.image + + # Extract alpha channel + logger.debug(f"image = {image}") + if image.mode == 'RGBA': + _, _, _, alpha = image.split() + else: + alpha = None + logger.debug(f"alpha = {alpha}") + + result, output, swapped = swap_face( + self.source, + image, + source_faces_index=self.source_faces_index, + faces_index=self.faces_index, + model=self.model, + enhancement_options=self.enhancement_options, + gender_source=self.gender_source, + gender_target=self.gender_target, + source_hash_check=True, + target_hash_check=True, + device=self.device, + mask_face=self.mask_face, + select_source=self.select_source, + face_model=self.face_model, + source_folder=self.source_folder, + source_imgs=self.source_imgs, + random_image=self.random_image, + detection_options=self.detection_options, + ) + if self.select_source == 2 or (self.select_source == 0 and self.source_imgs is not None and self.source is None): + if len(result) > 0 and swapped > 0: + image = result[0] + if len(result) > 1: + grid = make_grid(result) + result.insert(0, grid) + image = grid + pp.info["ReActor"] = True + pp.image = image + logger.status("---Done!---") + else: + logger.error("Cannot create a result image") + else: + try: + pp.info["ReActor"] = True + + if alpha is not None: + logger.debug(f"result = {result}") + result = result.convert("RGBA") + result.putalpha(alpha) + logger.debug(f"result_alpha = {result}") + + pp.image = result + logger.status("---Done!---") + except Exception: + logger.error("Cannot create a result image") + else: + logger.error("Please provide a source face") diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_globals.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_globals.py new file mode 100644 index 0000000000000000000000000000000000000000..81d123d7e0a2e125bee88ad14b65de36739ae861 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_globals.py @@ -0,0 +1,42 @@ +import os +from pathlib import Path + +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + models_path = os.path.abspath("models") + +IS_RUN: bool = False +BASE_PATH = os.path.join(Path(__file__).parents[1]) +DEVICE_LIST: list = ["CPU", "CUDA"] + +MODELS_PATH = models_path +SWAPPER_MODELS_PATH = os.path.join(MODELS_PATH, "insightface") +REACTOR_MODELS_PATH = os.path.join(MODELS_PATH, "reactor") +FACE_MODELS_PATH = os.path.join(REACTOR_MODELS_PATH, "faces") + +IS_SDNEXT = False + +if not os.path.exists(REACTOR_MODELS_PATH): + os.makedirs(REACTOR_MODELS_PATH) + if not os.path.exists(FACE_MODELS_PATH): + os.makedirs(FACE_MODELS_PATH) + +def updateDevice(): + try: + LAST_DEVICE_PATH = os.path.join(BASE_PATH, "last_device.txt") + with open(LAST_DEVICE_PATH) as f: + device = f.readline().strip() + if device not in DEVICE_LIST: + print(f"Error: Device {device} is not in DEVICE_LIST") + device = DEVICE_LIST[0] + print(f"Execution Provider has been set to {device}") + except Exception as e: + device = DEVICE_LIST[0] + print(f"Error: {e}\nExecution Provider has been set to {device}") + return device + +DEVICE = updateDevice() diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_helpers.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..6c31dfe630dde94dbfec326fac7b2e3dbfc195fe --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_helpers.py @@ -0,0 +1,235 @@ +import os, glob, random +from collections import Counter +from PIL import Image +from math import isqrt, ceil +from typing import List +import logging +import hashlib +import torch +from safetensors.torch import save_file, safe_open +from insightface.app.common import Face + +from modules.images import FilenameGenerator, get_next_sequence_number +from modules import shared, script_callbacks +from scripts.reactor_globals import DEVICE, BASE_PATH, FACE_MODELS_PATH, IS_SDNEXT + +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + model_path = os.path.abspath("models") + +MODELS_PATH = None + +def set_Device(value): + global DEVICE + DEVICE = value + with open(os.path.join(BASE_PATH, "last_device.txt"), "w") as txt: + txt.write(DEVICE) + +def get_Device(): + global DEVICE + return DEVICE + +def set_SDNEXT(): + global IS_SDNEXT + IS_SDNEXT = True + +def get_SDNEXT(): + global IS_SDNEXT + return IS_SDNEXT + +def make_grid(image_list: List): + + # Count the occurrences of each image size in the image_list + size_counter = Counter(image.size for image in image_list) + + # Get the most common image size (size with the highest count) + common_size = size_counter.most_common(1)[0][0] + + # Filter the image_list to include only images with the common size + image_list = [image for image in image_list if image.size == common_size] + + # Get the dimensions (width and height) of the common size + size = common_size + + # If there are more than one image in the image_list + if len(image_list) > 1: + num_images = len(image_list) + + # Calculate the number of rows and columns for the grid + rows = isqrt(num_images) + cols = ceil(num_images / rows) + + # Calculate the size of the square image + square_size = (cols * size[0], rows * size[1]) + + # Create a new RGB image with the square size + square_image = Image.new("RGB", square_size) + + # Paste each image onto the square image at the appropriate position + for i, image in enumerate(image_list): + row = i // cols + col = i % cols + + square_image.paste(image, (col * size[0], row * size[1])) + + # Return the resulting square image + return square_image + + # Return None if there are no images or only one image in the image_list + return None + +def get_image_path(image, path, basename, seed=None, prompt=None, extension='png', p=None, suffix=""): + + namegen = FilenameGenerator(p, seed, prompt, image) + + save_to_dirs = shared.opts.save_to_dirs + + if save_to_dirs: + dirname = namegen.apply(shared.opts.directories_filename_pattern or "[prompt_words]").lstrip(' ').rstrip('\\ /') + path = os.path.join(path, dirname) + + os.makedirs(path, exist_ok=True) + + if seed is None: + file_decoration = "" + elif shared.opts.save_to_dirs: + file_decoration = shared.opts.samples_filename_pattern or "[seed]" + else: + file_decoration = shared.opts.samples_filename_pattern or "[seed]-[prompt_spaces]" + + file_decoration = namegen.apply(file_decoration) + suffix + + add_number = shared.opts.save_images_add_number or file_decoration == '' + + if file_decoration != "" and add_number: + file_decoration = f"-{file_decoration}" + + if add_number: + basecount = get_next_sequence_number(path, basename) + fullfn = None + for i in range(500): + fn = f"{basecount + i:05}" if basename == '' else f"{basename}-{basecount + i:04}" + fullfn = os.path.join(path, f"{fn}{file_decoration}.{extension}") + if not os.path.exists(fullfn): + break + else: + fullfn = os.path.join(path, f"{file_decoration}.{extension}") + + pnginfo = {} + + params = script_callbacks.ImageSaveParams(image, p, fullfn, pnginfo) + # script_callbacks.before_image_saved_callback(params) + + fullfn = params.filename + + fullfn_without_extension, extension = os.path.splitext(params.filename) + if hasattr(os, 'statvfs'): + max_name_len = os.statvfs(path).f_namemax + fullfn_without_extension = fullfn_without_extension[:max_name_len - max(4, len(extension))] + params.filename = fullfn_without_extension + extension + fullfn = params.filename + + return fullfn + +def addLoggingLevel(levelName, levelNum, methodName=None): + if not methodName: + methodName = levelName.lower() + + def logForLevel(self, message, *args, **kwargs): + if self.isEnabledFor(levelNum): + self._log(levelNum, message, args, **kwargs) + + def logToRoot(message, *args, **kwargs): + logging.log(levelNum, message, *args, **kwargs) + + logging.addLevelName(levelNum, levelName) + setattr(logging, levelName, levelNum) + setattr(logging.getLoggerClass(), methodName, logForLevel) + setattr(logging, methodName, logToRoot) + +def get_image_md5hash(image: Image.Image): + md5hash = hashlib.md5(image.tobytes()) + return md5hash.hexdigest() + +def save_face_model(face: Face, filename: str) -> None: + try: + tensors = { + "bbox": torch.tensor(face["bbox"]), + "kps": torch.tensor(face["kps"]), + "det_score": torch.tensor(face["det_score"]), + "landmark_3d_68": torch.tensor(face["landmark_3d_68"]), + "pose": torch.tensor(face["pose"]), + "landmark_2d_106": torch.tensor(face["landmark_2d_106"]), + "embedding": torch.tensor(face["embedding"]), + "gender": torch.tensor(face["gender"]), + "age": torch.tensor(face["age"]), + } + save_file(tensors, filename) + # print(f"Face model has been saved to '{filename}'") + except Exception as e: + print(f"Error: {e}") + +def get_models(): + global MODELS_PATH + models_path_init = os.path.join(models_path, "insightface/*") + models = glob.glob(models_path_init) + models = [x for x in models if x.endswith(".onnx") or x.endswith(".pth")] + models_names = [] + for model in models: + model_path = os.path.split(model) + if MODELS_PATH is None: + MODELS_PATH = model_path[0] + model_name = model_path[1] + models_names.append(model_name) + return models_names + +def load_face_model(filename: str): + face = {} + model_path = os.path.join(FACE_MODELS_PATH, filename) + with safe_open(model_path, framework="pt") as f: + for k in f.keys(): + face[k] = f.get_tensor(k).numpy() + return Face(face) + +def get_facemodels(): + models_path = os.path.join(FACE_MODELS_PATH, "*") + models = glob.glob(models_path) + models = [x for x in models if x.endswith(".safetensors")] + return models + +def get_model_names(get_models): + models = get_models() + names = ["None"] + for x in models: + names.append(os.path.basename(x)) + return names + +def get_images_from_folder(path: str): + files_path = os.path.join(path, "*") + files = glob.glob(files_path) + images = [] + images_names = [] + for x in files: + if x.endswith(('jpg', 'png', 'jpeg', 'webp', 'bmp')): + images.append(Image.open(x)) + images_names.append(os.path.basename(x)) + return images,images_names + # return [Image.open(x) for x in images if x.endswith(('jpg', 'png', 'jpeg', 'webp', 'bmp'))],[os.path.basename(x) for x in images if x.endswith(('jpg', 'png', 'jpeg', 'webp', 'bmp'))] + +def get_random_image_from_folder(path: str): + images,names = get_images_from_folder(path) + random_image_index = random.randint(0, len(images) - 1) + return [images[random_image_index]],[names[random_image_index]] + +def get_images_from_list(imgs: List): + images = [] + images_names = [] + for x in imgs: + images.append(Image.open(os.path.abspath(x.name))) + images_names.append(os.path.basename(x.name)) + return images,images_names + # return [Image.open(os.path.abspath(x.name)) for x in imgs],[os.path.basename(x.name) for x in imgs] diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/__pycache__/bisenet_mask_generator.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/__pycache__/bisenet_mask_generator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58e2754df5f8631bc7f6c829798d7164a4ec5464 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/__pycache__/bisenet_mask_generator.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/__pycache__/mask_generator.cpython-310.pyc b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/__pycache__/mask_generator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79e82d079e66cac1c77442fa50cd14d7d9b333e1 Binary files /dev/null and b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/__pycache__/mask_generator.cpython-310.pyc differ diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/bisenet_mask_generator.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/bisenet_mask_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..576c8c197cc0c7e4017f0539ec0fdb782eb20bad --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/bisenet_mask_generator.py @@ -0,0 +1,86 @@ +from typing import List, Tuple + +import cv2 +import modules.shared as shared +import numpy as np +import torch +from facexlib.parsing import init_parsing_model +from facexlib.utils.misc import img2tensor +from torchvision.transforms.functional import normalize +from scripts.reactor_inferencers.mask_generator import MaskGenerator + +class BiSeNetMaskGenerator(MaskGenerator): + def __init__(self) -> None: + self.mask_model = init_parsing_model(device=shared.device) + + def name(self): + return "BiSeNet" + + def generate_mask( + self, + face_image: np.ndarray, + face_area_on_image: Tuple[int, int, int, int], + affected_areas: List[str], + mask_size: int, + use_minimal_area: bool, + fallback_ratio: float = 0.25, + **kwargs, + ) -> np.ndarray: + # original_face_image = face_image + face_image = face_image.copy() + face_image = face_image[:, :, ::-1] + + if use_minimal_area: + face_image = MaskGenerator.mask_non_face_areas(face_image, face_area_on_image) + + h, w, _ = face_image.shape + + if w != 512 or h != 512: + rw = (int(w * (512 / w)) // 8) * 8 + rh = (int(h * (512 / h)) // 8) * 8 + face_image = cv2.resize(face_image, dsize=(rw, rh)) + + face_tensor = img2tensor(face_image.astype("float32") / 255.0, float32=True) + normalize(face_tensor, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5), inplace=True) + face_tensor = torch.unsqueeze(face_tensor, 0).to(shared.device) + + with torch.no_grad(): + face = self.mask_model(face_tensor)[0] + face = face.squeeze(0).cpu().numpy().argmax(0) + face = face.copy().astype(np.uint8) + + mask = self.__to_mask(face, affected_areas) + + if mask_size > 0: + mask = cv2.dilate(mask, np.ones((5, 5), np.uint8), iterations=mask_size) + + if w != 512 or h != 512: + mask = cv2.resize(mask, dsize=(w, h)) + + # """if MaskGenerator.calculate_mask_coverage(mask) < fallback_ratio: + # logger.info("Use fallback mask generator") + # mask = self.fallback_mask_generator.generate_mask( + # original_face_image, face_area_on_image, use_minimal_area=True + # )""" + + return mask + + def __to_mask(self, face: np.ndarray, affected_areas: List[str]) -> np.ndarray: + keep_face = "Face" in affected_areas + keep_neck = "Neck" in affected_areas + keep_hair = "Hair" in affected_areas + keep_hat = "Hat" in affected_areas + + mask = np.zeros((face.shape[0], face.shape[1], 3), dtype=np.uint8) + num_of_class = np.max(face) + for i in range(1, num_of_class + 1): + index = np.where(face == i) + if i < 14 and keep_face: + mask[index[0], index[1], :] = [255, 255, 255] + elif i == 14 and keep_neck: + mask[index[0], index[1], :] = [255, 255, 255] + elif i == 17 and keep_hair: + mask[index[0], index[1], :] = [255, 255, 255] + elif i == 18 and keep_hat: + mask[index[0], index[1], :] = [255, 255, 255] + return mask diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/mask_generator.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/mask_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..0c46b89e7f5f9c703aa9f89a259f0179485b3f95 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_inferencers/mask_generator.py @@ -0,0 +1,36 @@ +from abc import ABC, abstractmethod +from typing import Tuple + +import cv2 +import numpy as np + +class MaskGenerator(ABC): + @abstractmethod + def name(self) -> str: + pass + + @abstractmethod + def generate_mask( + self, + face_image: np.ndarray, + face_area_on_image: Tuple[int, int, int, int], + **kwargs, + ) -> np.ndarray: + pass + + @staticmethod + def mask_non_face_areas(image: np.ndarray, face_area_on_image: Tuple[int, int, int, int]) -> np.ndarray: + left, top, right, bottom = face_area_on_image + image = image.copy() + image[:top, :] = 0 + image[bottom:, :] = 0 + image[:, :left] = 0 + image[:, right:] = 0 + return image + + @staticmethod + def calculate_mask_coverage(mask: np.ndarray): + gray_mask = cv2.cvtColor(mask, cv2.COLOR_RGB2GRAY) + non_black_pixels = np.count_nonzero(gray_mask) + total_pixels = gray_mask.size + return non_black_pixels / total_pixels diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_logger.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_logger.py new file mode 100644 index 0000000000000000000000000000000000000000..d0945aea526e3a17fc6759c17bcededca49e1f4a --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_logger.py @@ -0,0 +1,55 @@ +import logging +import copy +import sys + +from modules import shared +from scripts.reactor_globals import IS_RUN +from scripts.reactor_helpers import addLoggingLevel + + +class ColoredFormatter(logging.Formatter): + COLORS = { + "DEBUG": "\033[0;36m", # CYAN + "STATUS": "\033[38;5;173m", # Calm ORANGE + "INFO": "\033[0;32m", # GREEN + "WARNING": "\033[0;33m", # YELLOW + "ERROR": "\033[0;31m", # RED + "CRITICAL": "\033[0;37;41m", # WHITE ON RED + "RESET": "\033[0m", # RESET COLOR + } + + def format(self, record): + colored_record = copy.copy(record) + levelname = colored_record.levelname + seq = self.COLORS.get(levelname, self.COLORS["RESET"]) + colored_record.levelname = f"{seq}{levelname}{self.COLORS['RESET']}" + return super().format(colored_record) + + +# Create a new logger +logger = logging.getLogger("ReActor") +logger.propagate = False + +# Add Custom Level +addLoggingLevel("STATUS", logging.INFO + 5) + +# Add handler if we don't have one. +if not logger.handlers: + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter( + ColoredFormatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s","%H:%M:%S") + ) + logger.addHandler(handler) + +# Configure logger +loglevel_string = getattr(shared.cmd_opts, "reactor_loglevel", "INFO") +loglevel = getattr(logging, loglevel_string.upper(), "info") +logger.setLevel(loglevel) + +def set_Run(value): + global IS_RUN + IS_RUN = value + +def get_Run(): + global IS_RUN + return IS_RUN diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_swapper.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_swapper.py new file mode 100644 index 0000000000000000000000000000000000000000..77b28258d2d22f59c28f41b89e6ee0b289ec7817 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_swapper.py @@ -0,0 +1,816 @@ +import copy +import os +from dataclasses import dataclass +from typing import List, Union + +import cv2 +import numpy as np +from PIL import Image +from scipy import stats + +import insightface +from insightface.app.common import Face + +from scripts.reactor_globals import FACE_MODELS_PATH +from scripts.reactor_helpers import ( + get_image_md5hash, + get_Device, + save_face_model, + load_face_model, + get_images_from_folder, + get_random_image_from_folder, + get_images_from_list, + set_SDNEXT +) +from scripts.console_log_patch import apply_logging_patch + +from modules.face_restoration import FaceRestoration +try: # A1111 + from modules import codeformer_model, gfpgan_model +except: # SD.Next + from modules.postprocess import codeformer_model, gfpgan_model + set_SDNEXT() +from modules.upscaler import UpscalerData +from modules.shared import state +from scripts.reactor_logger import logger +from reactor_modules.reactor_mask import apply_face_mask + +try: + from modules.paths_internal import models_path +except: + try: + from modules.paths import models_path + except: + models_path = os.path.abspath("models") + +import warnings + +np.warnings = warnings +np.warnings.filterwarnings('ignore') + + +DEVICE = get_Device() +if DEVICE == "CUDA": + PROVIDERS = ["CUDAExecutionProvider"] +else: + PROVIDERS = ["CPUExecutionProvider"] + + +@dataclass +class EnhancementOptions: + do_restore_first: bool = True + scale: int = 1 + upscaler: UpscalerData = None + upscale_visibility: float = 0.5 + face_restorer: FaceRestoration = None + restorer_visibility: float = 0.5 + codeformer_weight: float = 0.5 + upscale_force: bool = False + +@dataclass +class DetectionOptions: + det_thresh: float = 0.5 + det_maxnum: int = 0 + +MESSAGED_STOPPED = False +MESSAGED_SKIPPED = False + +def reset_messaged(): + global MESSAGED_STOPPED, MESSAGED_SKIPPED + if not state.interrupted: + MESSAGED_STOPPED = False + if not state.skipped: + MESSAGED_SKIPPED = False + +def check_process_halt(msgforced: bool = False): + global MESSAGED_STOPPED, MESSAGED_SKIPPED + if state.interrupted: + if not MESSAGED_STOPPED or msgforced: + logger.status("Stopped by User") + MESSAGED_STOPPED = True + return True + if state.skipped: + if not MESSAGED_SKIPPED or msgforced: + logger.status("Skipped by User") + MESSAGED_SKIPPED = True + return True + return False + + +FS_MODEL = None +ANALYSIS_MODEL = None +MASK_MODEL = None + +CURRENT_FS_MODEL_PATH = None +CURRENT_MASK_MODEL_PATH = None + +SOURCE_FACES = None +SOURCE_IMAGE_HASH = None +TARGET_FACES = None +TARGET_IMAGE_HASH = None +SOURCE_FACES_LIST = [] +SOURCE_IMAGE_LIST_HASH = [] + +def clear_faces(): + global SOURCE_FACES, SOURCE_IMAGE_HASH + SOURCE_FACES = None + SOURCE_IMAGE_HASH = None + logger.status("Source Images Hash has been reset (for Single Source or Face Model)") + +def clear_faces_list(): + global SOURCE_FACES_LIST, SOURCE_IMAGE_LIST_HASH + SOURCE_FACES_LIST = [] + SOURCE_IMAGE_LIST_HASH = [] + logger.status("Source Images Hash has been reset (for Multiple or Folder Source)") + +def clear_faces_target(): + global TARGET_FACES, TARGET_IMAGE_HASH + TARGET_FACES = None + TARGET_IMAGE_HASH = None + logger.status("Target Images Hash has been reset") + +def clear_faces_all(): + global SOURCE_FACES, SOURCE_IMAGE_HASH, SOURCE_FACES_LIST, SOURCE_IMAGE_LIST_HASH, TARGET_FACES, TARGET_IMAGE_HASH + SOURCE_FACES = None + SOURCE_IMAGE_HASH = None + TARGET_FACES = None + TARGET_IMAGE_HASH = None + SOURCE_FACES_LIST = [] + SOURCE_IMAGE_LIST_HASH = [] + logger.status("All Images Hash has been reset") + +def getAnalysisModel(): + global ANALYSIS_MODEL + if ANALYSIS_MODEL is None: + ANALYSIS_MODEL = insightface.app.FaceAnalysis( + name="buffalo_l", providers=PROVIDERS, root=os.path.join(models_path, "insightface") # note: allowed_modules=['detection', 'genderage'] + ) + return ANALYSIS_MODEL + + +def getFaceSwapModel(model_path: str): + global FS_MODEL + global CURRENT_FS_MODEL_PATH + if CURRENT_FS_MODEL_PATH is None or CURRENT_FS_MODEL_PATH != model_path: + CURRENT_FS_MODEL_PATH = model_path + FS_MODEL = insightface.model_zoo.get_model(model_path, providers=PROVIDERS) + + return FS_MODEL + + +def restore_face(image: Image, enhancement_options: EnhancementOptions): + result_image = image + + if check_process_halt(msgforced=True): + return result_image + + if enhancement_options.face_restorer is not None: + original_image = result_image.copy() + numpy_image = np.array(result_image) + if enhancement_options.face_restorer.name() == "CodeFormer": + logger.status("Restoring the face with %s (weight: %s)", enhancement_options.face_restorer.name(), enhancement_options.codeformer_weight) + numpy_image = codeformer_model.codeformer.restore( + numpy_image, w=enhancement_options.codeformer_weight + ) + else: # GFPGAN: + logger.status("Restoring the face with %s", enhancement_options.face_restorer.name()) + numpy_image = gfpgan_model.gfpgan_fix_faces(numpy_image) + # numpy_image = enhancement_options.face_restorer.restore(numpy_image) + restored_image = Image.fromarray(numpy_image) + result_image = Image.blend( + original_image, restored_image, enhancement_options.restorer_visibility + ) + + return result_image + +def upscale_image(image: Image, enhancement_options: EnhancementOptions): + result_image = image + + if check_process_halt(msgforced=True): + return result_image + + if enhancement_options.upscaler is not None and enhancement_options.upscaler.name != "None": + original_image = result_image.copy() + logger.status( + "Upscaling with %s scale = %s", + enhancement_options.upscaler.name, + enhancement_options.scale, + ) + result_image = enhancement_options.upscaler.scaler.upscale( + original_image, enhancement_options.scale, enhancement_options.upscaler.data_path + ) + if enhancement_options.scale == 1: + result_image = Image.blend( + original_image, result_image, enhancement_options.upscale_visibility + ) + + return result_image + +def enhance_image(image: Image, enhancement_options: EnhancementOptions): + result_image = image + + if check_process_halt(msgforced=True): + return result_image + + if enhancement_options.do_restore_first: + + result_image = restore_face(result_image, enhancement_options) + result_image = upscale_image(result_image, enhancement_options) + + else: + + result_image = upscale_image(result_image, enhancement_options) + result_image = restore_face(result_image, enhancement_options) + + return result_image + +def enhance_image_and_mask(image: Image.Image, enhancement_options: EnhancementOptions,target_img_orig:Image.Image,entire_mask_image:Image.Image)->Image.Image: + result_image = image + + if check_process_halt(msgforced=True): + return result_image + + if enhancement_options.do_restore_first: + + result_image = restore_face(result_image, enhancement_options) + result_image = Image.composite(result_image,target_img_orig,entire_mask_image) + result_image = upscale_image(result_image, enhancement_options) + + else: + + result_image = upscale_image(result_image, enhancement_options) + entire_mask_image = Image.fromarray(cv2.resize(np.array(entire_mask_image),result_image.size, interpolation=cv2.INTER_AREA)).convert("L") + result_image = Image.composite(result_image,target_img_orig,entire_mask_image) + result_image = restore_face(result_image, enhancement_options) + + return result_image + + +def get_gender(face, face_index): + gender = [ + x.sex + for x in face + ] + gender.reverse() + try: + face_gender = gender[face_index] + except: + logger.error("Gender Detection: No face with index = %s was found", face_index) + return "None" + return face_gender + +def get_face_gender( + face, + face_index, + gender_condition, + operated: str, + gender_detected, +): + face_gender = gender_detected + if face_gender == "None": + return None, 0 + logger.status("%s Face %s: Detected Gender -%s-", operated, face_index, face_gender) + if (gender_condition == 1 and face_gender == "F") or (gender_condition == 2 and face_gender == "M"): + logger.status("OK - Detected Gender matches Condition") + try: + return sorted(face, key=lambda x: x.bbox[0])[face_index], 0 + except IndexError: + return None, 0 + else: + logger.status("WRONG - Detected Gender doesn't match Condition") + return sorted(face, key=lambda x: x.bbox[0])[face_index], 1 + +def get_face_age(face, face_index): + age = [ + x.age + for x in face + ] + age.reverse() + try: + face_age = age[face_index] + except: + logger.error("Age Detection: No face with index = %s was found", face_index) + return "None" + return face_age + +def half_det_size(det_size): + logger.status("Trying to halve 'det_size' parameter") + return (det_size[0] // 2, det_size[1] // 2) + +def analyze_faces(img_data: np.ndarray, det_size=(640, 640), det_thresh=0.5, det_maxnum=0): + logger.info("Applied Execution Provider: %s", PROVIDERS[0]) + face_analyser = copy.deepcopy(getAnalysisModel()) + face_analyser.prepare(ctx_id=0, det_thresh=det_thresh, det_size=det_size) + return face_analyser.get(img_data, max_num=det_maxnum) + +def get_face_single(img_data: np.ndarray, face, face_index=0, det_size=(640, 640), gender_source=0, gender_target=0, det_thresh=0.5, det_maxnum=0): + + buffalo_path = os.path.join(models_path, "insightface/models/buffalo_l.zip") + if os.path.exists(buffalo_path): + os.remove(buffalo_path) + + face_age = "None" + try: + face_age = get_face_age(face, face_index) + except: + logger.error("Cannot detect any Age for Face index = %s", face_index) + + face_gender = "None" + try: + face_gender = get_gender(face, face_index) + gender_detected = face_gender + face_gender = "Female" if face_gender == "F" else ("Male" if face_gender == "M" else "None") + except: + logger.error("Cannot detect any Gender for Face index = %s", face_index) + + if gender_source != 0: + if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: + det_size_half = half_det_size(det_size) + return get_face_single(img_data, analyze_faces(img_data, det_size_half, det_thresh, det_maxnum), face_index, det_size_half, gender_source, gender_target, det_thresh, det_maxnum) + faces, wrong_gender = get_face_gender(face,face_index,gender_source,"Source",gender_detected) + return faces, wrong_gender, face_age, face_gender + + if gender_target != 0: + if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: + det_size_half = half_det_size(det_size) + return get_face_single(img_data, analyze_faces(img_data, det_size_half, det_thresh, det_maxnum), face_index, det_size_half, gender_source, gender_target, det_thresh, det_maxnum) + faces, wrong_gender = get_face_gender(face,face_index,gender_target,"Target",gender_detected) + return faces, wrong_gender, face_age, face_gender + + if len(face) == 0 and det_size[0] > 320 and det_size[1] > 320: + det_size_half = half_det_size(det_size) + return get_face_single(img_data, analyze_faces(img_data, det_size_half, det_thresh, det_maxnum), face_index, det_size_half, gender_source, gender_target, det_thresh, det_maxnum) + + try: + return sorted(face, key=lambda x: x.bbox[0])[face_index], 0, face_age, face_gender + except IndexError: + return None, 0, face_age, face_gender + + +def swap_face( + source_img: Image.Image, + target_img: Image.Image, + model: Union[str, None] = None, + source_faces_index: List[int] = [0], + faces_index: List[int] = [0], + enhancement_options: Union[EnhancementOptions, None] = None, + gender_source: int = 0, + gender_target: int = 0, + source_hash_check: bool = True, + target_hash_check: bool = False, + device: str = "CPU", + mask_face: bool = False, + select_source: int = 0, + face_model: str = "None", + source_folder: str = "", + source_imgs: Union[List, None] = None, + random_image: bool = False, + detection_options: Union[DetectionOptions, None] = None, +): + global SOURCE_FACES, SOURCE_IMAGE_HASH, TARGET_FACES, TARGET_IMAGE_HASH, PROVIDERS, SOURCE_FACES_LIST, SOURCE_IMAGE_LIST_HASH + + result_image = target_img + + PROVIDERS = ["CUDAExecutionProvider"] if device == "CUDA" else ["CPUExecutionProvider"] + + if check_process_halt(): + return result_image, [], 0 + + if model is not None: + + if isinstance(source_img, str): # source_img is a base64 string + import base64, io + if 'base64,' in source_img: # check if the base64 string has a data URL scheme + # split the base64 string to get the actual base64 encoded image data + base64_data = source_img.split('base64,')[-1] + # decode base64 string to bytes + img_bytes = base64.b64decode(base64_data) + else: + # if no data URL scheme, just decode + img_bytes = base64.b64decode(source_img) + + source_img = Image.open(io.BytesIO(img_bytes)) + + target_img = cv2.cvtColor(np.array(target_img), cv2.COLOR_RGB2BGR) + + target_img_orig = cv2.cvtColor(np.array(target_img), cv2.COLOR_RGB2BGR) + entire_mask_image = np.zeros_like(np.array(target_img)) + + output: List = [] + output_info: str = "" + swapped = 0 + + # ***************** + # SWAP from FOLDER or MULTIPLE images: + + if (select_source == 0 and source_imgs is not None) or (select_source == 2 and (source_folder is not None and source_folder != "")): + + result = [] + + if random_image and select_source == 2: + source_images,source_images_names = get_random_image_from_folder(source_folder) + logger.status(f"Processing with Random Image from the folder: {source_images_names[0]}") + else: + source_images,source_images_names = get_images_from_folder(source_folder) if select_source == 2 else get_images_from_list(source_imgs) + + if len(source_images) > 0: + source_img_ff = [] + source_faces_ff = [] + for i, source_image in enumerate(source_images): + + source_image = cv2.cvtColor(np.array(source_image), cv2.COLOR_RGB2BGR) + source_img_ff.append(source_image) + + if source_hash_check: + + source_image_md5hash = get_image_md5hash(source_image) + + if len(SOURCE_IMAGE_LIST_HASH) == 0: + SOURCE_IMAGE_LIST_HASH = [source_image_md5hash] + source_image_same = False + elif len(SOURCE_IMAGE_LIST_HASH) == i: + SOURCE_IMAGE_LIST_HASH.append(source_image_md5hash) + source_image_same = False + else: + source_image_same = True if SOURCE_IMAGE_LIST_HASH[i] == source_image_md5hash else False + if not source_image_same: + SOURCE_IMAGE_LIST_HASH[i] = source_image_md5hash + + logger.info("(Image %s) Source Image MD5 Hash = %s", i, SOURCE_IMAGE_LIST_HASH[i]) + logger.info("(Image %s) Source Image the Same? %s", i, source_image_same) + + if len(SOURCE_FACES_LIST) == 0: + logger.status(f"Analyzing Source Image {i}: {source_images_names[i]}...") + source_faces = analyze_faces(source_image, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + SOURCE_FACES_LIST = [source_faces] + elif len(SOURCE_FACES_LIST) == i and not source_image_same: + logger.status(f"Analyzing Source Image {i}: {source_images_names[i]}...") + source_faces = analyze_faces(source_image, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + SOURCE_FACES_LIST.append(source_faces) + elif len(SOURCE_FACES_LIST) != i and not source_image_same: + logger.status(f"Analyzing Source Image {i}: {source_images_names[i]}...") + source_faces = analyze_faces(source_image, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + SOURCE_FACES_LIST[i] = source_faces + elif source_image_same: + logger.status("(Image %s) Using Hashed Source Face(s) Model...", i) + source_faces = SOURCE_FACES_LIST[i] + + else: + logger.status(f"Analyzing Source Image {i}...") + source_faces = analyze_faces(source_image, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + + if source_faces is not None: + source_faces_ff.append(source_faces) + + if len(source_faces_ff) > 0: + + if target_hash_check: + + target_image_md5hash = get_image_md5hash(target_img) + + if TARGET_IMAGE_HASH is None: + TARGET_IMAGE_HASH = target_image_md5hash + target_image_same = False + else: + target_image_same = True if TARGET_IMAGE_HASH == target_image_md5hash else False + if not target_image_same: + TARGET_IMAGE_HASH = target_image_md5hash + + logger.info("Target Image MD5 Hash = %s", TARGET_IMAGE_HASH) + logger.info("Target Image the Same? %s", target_image_same) + + if TARGET_FACES is None or not target_image_same: + logger.status("Analyzing Target Image...") + target_faces = analyze_faces(target_img, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + TARGET_FACES = target_faces + elif target_image_same: + logger.status("Using Hashed Target Face(s) Model...") + target_faces = TARGET_FACES + + else: + logger.status("Analyzing Target Image...") + target_faces = analyze_faces(target_img, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + + for i,source_faces in enumerate(source_faces_ff): + + logger.status("(Image %s) Detecting Source Face, Index = %s", i, source_faces_index[0]) + source_face, wrong_gender, source_age, source_gender = get_face_single(source_img_ff[i], source_faces, face_index=source_faces_index[0], gender_source=gender_source, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + + if source_age != "None" or source_gender != "None": + logger.status("(Image %s) Detected: -%s- y.o. %s", i, source_age, source_gender) + + if len(source_faces_index) != 0 and len(source_faces_index) != 1 and len(source_faces_index) != len(faces_index): + logger.status("Source Faces must have no entries (default=0), one entry, or same number of entries as target faces.") + + elif source_face is not None: + + result_image, output, swapped = operate(source_img_ff[i],target_img,target_img_orig,model,source_faces_index,faces_index,source_faces,target_faces,gender_source,gender_target,source_face,wrong_gender,source_age,source_gender,output,swapped,mask_face,entire_mask_image,enhancement_options,detection_options) + + result.append(result_image) + + result = [result_image] if len(result) == 0 else result + + return result, output, swapped + + # END + # ***************** + + # *********************** + # SWAP from IMG or MODEL: + + else: + + if select_source == 0 and source_img is not None: + + source_img = cv2.cvtColor(np.array(source_img), cv2.COLOR_RGB2BGR) + + if source_hash_check: + + source_image_md5hash = get_image_md5hash(source_img) + + if SOURCE_IMAGE_HASH is None: + SOURCE_IMAGE_HASH = source_image_md5hash + source_image_same = False + else: + source_image_same = True if SOURCE_IMAGE_HASH == source_image_md5hash else False + if not source_image_same: + SOURCE_IMAGE_HASH = source_image_md5hash + + logger.info("Source Image MD5 Hash = %s", SOURCE_IMAGE_HASH) + logger.info("Source Image the Same? %s", source_image_same) + + if SOURCE_FACES is None or not source_image_same: + logger.status("Analyzing Source Image...") + source_faces = analyze_faces(source_img, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + SOURCE_FACES = source_faces + elif source_image_same: + logger.status("Using Hashed Source Face(s) Model...") + source_faces = SOURCE_FACES + + else: + logger.status("Analyzing Source Image...") + source_faces = analyze_faces(source_img, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + + elif select_source == 1 and (face_model is not None and face_model != "None"): + source_face_model = [load_face_model(face_model)] + if source_face_model is not None: + source_faces_index = [0] + source_faces = source_face_model + logger.status(f"Using Loaded Source Face Model: {face_model}") + else: + logger.error(f"Cannot load Face Model File: {face_model}") + + else: + logger.error("Cannot detect any Source") + return result_image, [], 0 + + if source_faces is not None: + + if target_hash_check: + + target_image_md5hash = get_image_md5hash(target_img) + + if TARGET_IMAGE_HASH is None: + TARGET_IMAGE_HASH = target_image_md5hash + target_image_same = False + else: + target_image_same = True if TARGET_IMAGE_HASH == target_image_md5hash else False + if not target_image_same: + TARGET_IMAGE_HASH = target_image_md5hash + + logger.info("Target Image MD5 Hash = %s", TARGET_IMAGE_HASH) + logger.info("Target Image the Same? %s", target_image_same) + + if TARGET_FACES is None or not target_image_same: + logger.status("Analyzing Target Image...") + target_faces = analyze_faces(target_img, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + TARGET_FACES = target_faces + elif target_image_same: + logger.status("Using Hashed Target Face(s) Model...") + target_faces = TARGET_FACES + + else: + logger.status("Analyzing Target Image...") + target_faces = analyze_faces(target_img, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + + logger.status("Detecting Source Face, Index = %s", source_faces_index[0]) + if select_source == 0 and source_img is not None: + source_face, wrong_gender, source_age, source_gender = get_face_single(source_img, source_faces, face_index=source_faces_index[0], gender_source=gender_source, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + else: + source_face = sorted(source_faces, key=lambda x: x.bbox[0])[source_faces_index[0]] + wrong_gender = 0 + source_age = source_face["age"] + source_gender = "Female" if source_face["gender"] == 0 else "Male" + + if source_age != "None" or source_gender != "None": + logger.status("Detected: -%s- y.o. %s", source_age, source_gender) + + output_info = f"SourceFaceIndex={source_faces_index[0]};Age={source_age};Gender={source_gender}\n" + output.append(output_info) + + if len(source_faces_index) != 0 and len(source_faces_index) != 1 and len(source_faces_index) != len(faces_index): + logger.status("Source Faces must have no entries (default=0), one entry, or same number of entries as target faces.") + + elif source_face is not None: + + result_image, output, swapped = operate(source_img,target_img,target_img_orig,model,source_faces_index,faces_index,source_faces,target_faces,gender_source,gender_target,source_face,wrong_gender,source_age,source_gender,output,swapped,mask_face,entire_mask_image,enhancement_options,detection_options) + + else: + logger.status("No source face(s) in the provided Index") + else: + logger.status("No source face(s) found") + + return result_image, output, swapped + + # END + # ********************** + + return result_image, [], 0 + +def build_face_model(image: Image.Image, name: str, save_model: bool = True, det_size=(640, 640)): + if image is None: + error_msg = "Please load an Image" + logger.error(error_msg) + return error_msg + if name is None: + error_msg = "Please filled out the 'Face Model Name' field" + logger.error(error_msg) + return error_msg + apply_logging_patch(1) + image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) + if save_model: + logger.status("Building Face Model...") + face_model = analyze_faces(image, det_size) + + if len(face_model) == 0: + det_size_half = half_det_size(det_size) + face_model = analyze_faces(image, det_size_half) + + if face_model is not None and len(face_model) > 0: + if save_model: + face_model_path = os.path.join(FACE_MODELS_PATH, name + ".safetensors") + save_face_model(face_model[0],face_model_path) + logger.status("--Done!--") + done_msg = f"Face model has been saved to '{face_model_path}'" + logger.status(done_msg) + return done_msg + else: + return face_model[0] + else: + no_face_msg = "No face found, please try another image" + logger.error(no_face_msg) + return no_face_msg + +def blend_faces(images_list: List, name: str, compute_method: int = 0, shape_check: bool = False): + faces = [] + embeddings = [] + images: List[Image.Image] = [] + images, images_names = get_images_from_list(images_list) + for i,image in enumerate(images): + logger.status(f"Building Face Model for {images_names[i]}...") + face = build_face_model(image,str(i),save_model=False) + if isinstance(face, str): + # logger.error(f"No faces found in {images_names[i]}, skipping") + continue + if shape_check: + if i == 0: + embedding_shape = face.embedding.shape + elif face.embedding.shape != embedding_shape: + logger.error(f"Embedding Shape Mismatch for {images_names[i]}, skipping") + continue + faces.append(face) + embeddings.append(face.embedding) + if len(faces) > 0: + # if shape_check: + # embedding_shape = embeddings[0].shape + # for embedding in embeddings: + # if embedding.shape != embedding_shape: + # logger.error("Embedding Shape Mismatch") + # break + compute_method_name = "Mean" if compute_method == 0 else "Median" if compute_method == 1 else "Mode" + logger.status(f"Blending with Compute Method {compute_method_name}...") + blended_embedding = np.mean(embeddings, axis=0) if compute_method == 0 else np.median(embeddings, axis=0) if compute_method == 1 else stats.mode(embeddings, axis=0)[0].astype(np.float32) + blended_face = Face( + bbox=faces[0].bbox, + kps=faces[0].kps, + det_score=faces[0].det_score, + landmark_3d_68=faces[0].landmark_3d_68, + pose=faces[0].pose, + landmark_2d_106=faces[0].landmark_2d_106, + embedding=blended_embedding, + gender=faces[0].gender, + age=faces[0].age + ) + if blended_face is not None: + face_model_path = os.path.join(FACE_MODELS_PATH, name + ".safetensors") + save_face_model(blended_face,face_model_path) + logger.status("--Done!--") + done_msg = f"Face model has been saved to '{face_model_path}'" + logger.status(done_msg) + return done_msg + else: + no_face_msg = "Something went wrong, please try another set of images" + logger.error(no_face_msg) + return no_face_msg + return "No faces found" + + +def operate( + source_img, + target_img, + target_img_orig, + model, + source_faces_index, + faces_index, + source_faces, + target_faces, + gender_source, + gender_target, + source_face, + wrong_gender, + source_age, + source_gender, + output, + swapped, + mask_face, + entire_mask_image, + enhancement_options, + detection_options, + ): + result = target_img + face_swapper = getFaceSwapModel(model) + + source_face_idx = 0 + + for face_num in faces_index: + if check_process_halt(): + return result_image, [], 0 + if len(source_faces_index) > 1 and source_face_idx > 0: + logger.status("Detecting Source Face, Index = %s", source_faces_index[source_face_idx]) + source_face, wrong_gender, source_age, source_gender = get_face_single(source_img, source_faces, face_index=source_faces_index[source_face_idx], gender_source=gender_source, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + if source_age != "None" or source_gender != "None": + logger.status("Detected: -%s- y.o. %s", source_age, source_gender) + + output_info = f"SourceFaceIndex={source_faces_index[source_face_idx]};Age={source_age};Gender={source_gender}\n" + output.append(output_info) + + source_face_idx += 1 + + if source_face is not None and wrong_gender == 0: + logger.status("Detecting Target Face, Index = %s", face_num) + target_face, wrong_gender, target_age, target_gender = get_face_single(target_img, target_faces, face_index=face_num, gender_target=gender_target, det_thresh=detection_options.det_thresh, det_maxnum=detection_options.det_maxnum) + if target_age != "None" or target_gender != "None": + logger.status("Detected: -%s- y.o. %s", target_age, target_gender) + + output_info = f"TargetFaceIndex={face_num};Age={target_age};Gender={target_gender}\n" + output.append(output_info) + + if target_face is not None and wrong_gender == 0: + logger.status("Swapping Source into Target") + swapped_image = face_swapper.get(result, target_face, source_face) + + if mask_face: + result = apply_face_mask(swapped_image=swapped_image,target_image=result,target_face=target_face,entire_mask_image=entire_mask_image) + else: + result = swapped_image + swapped += 1 + + elif wrong_gender == 1: + wrong_gender = 0 + + if source_face_idx == len(source_faces_index): + result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) + + if enhancement_options is not None and len(source_faces_index) > 1: + result_image = enhance_image(result_image, enhancement_options) + + return result_image, output, swapped + + else: + logger.status(f"No target face found for {face_num}") + + elif wrong_gender == 1: + wrong_gender = 0 + + if source_face_idx == len(source_faces_index): + result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) + + if enhancement_options is not None and len(source_faces_index) > 1: + result_image = enhance_image(result_image, enhancement_options) + + return result_image, output, swapped + + else: + logger.status(f"No source face found for face number {source_face_idx}.") + + result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) + + if (enhancement_options is not None and swapped > 0) or enhancement_options.upscale_force: + if mask_face and entire_mask_image is not None: + result_image = enhance_image_and_mask(result_image, enhancement_options,Image.fromarray(target_img_orig),Image.fromarray(entire_mask_image).convert("L")) + else: + result_image = enhance_image(result_image, enhancement_options) + elif mask_face and entire_mask_image is not None and swapped > 0: + result_image = Image.composite(result_image,Image.fromarray(target_img_orig),Image.fromarray(entire_mask_image).convert("L")) + + return result_image, output, swapped diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_version.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_version.py new file mode 100644 index 0000000000000000000000000000000000000000..e15372d9e2a5fd9869b56e5910124c42a505655c --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_version.py @@ -0,0 +1,11 @@ +app_title = "ReActor" +version_flag = "v0.7.0-b7" + +from scripts.reactor_logger import logger, get_Run, set_Run +from scripts.reactor_globals import DEVICE + +is_run = get_Run() + +if not is_run: + logger.status(f"Running {version_flag} on Device: {DEVICE}") + set_Run(True) diff --git a/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_xyz.py b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_xyz.py new file mode 100644 index 0000000000000000000000000000000000000000..75c7e571decb91ffbbd6c57060972f7220f0ffd4 --- /dev/null +++ b/stable-diffusion-webui/extensions/sd-webui-reactor/scripts/reactor_xyz.py @@ -0,0 +1,86 @@ +''' +Thanks @ledahu for contributing +''' + +from modules import scripts +from modules.shared import opts + +from scripts.reactor_helpers import ( + get_model_names, + get_facemodels +) + +# xyz_grid = [x for x in scripts.scripts_data if x.script_class.__module__ == "xyz_grid.py"][0].module + +def find_module(module_names): + if isinstance(module_names, str): + module_names = [s.strip() for s in module_names.split(",")] + for data in scripts.scripts_data: + if data.script_class.__module__ in module_names and hasattr(data, "module"): + return data.module + return None + +def bool_(string): + string = str(string) + if string in ["None", ""]: + return None + elif string.lower() in ["true", "1"]: + return True + elif string.lower() in ["false", "0"]: + return False + else: + raise ValueError(f"Could not convert string to boolean: {string}") + +def choices_bool(): + return ["False", "True"] + +def choices_face_models(): + return get_model_names(get_facemodels) + +def float_applier(value_name:str, min_range:float = 0, max_range:float = 1): + """ + Returns a function that applies the given value to the given value_name in opts.data. + """ + def validate(value_name:str, value:str): + value = float(value) + # validate value + if not min_range == 0: + assert value >= min_range, f"Value {value} for {value_name} must be greater than or equal to {min_range}" + if not max_range == 1: + assert value <= max_range, f"Value {value} for {value_name} must be less than or equal to {max_range}" + def apply_float(p, x, xs): + validate(value_name, x) + opts.data[value_name] = float(x) + return apply_float + +def bool_applier(value_name:str): + def apply_bool(p, x, xs): + x_normed = bool_(x) + opts.data[value_name] = x_normed + # print(f'normed = {x_normed}') + return apply_bool + +def str_applier(value_name:str): + def apply_str(p, x, xs): + opts.data[value_name] = x + return apply_str + + +def add_axis_options(xyz_grid): + extra_axis_options = [ + xyz_grid.AxisOption("[ReActor] CodeFormer Weight", float, float_applier("codeformer_weight", 0, 1)), + xyz_grid.AxisOption("[ReActor] Restorer Visibility", float, float_applier("restorer_visibility", 0, 1)), + xyz_grid.AxisOption("[ReActor] Face Mask Correction", str, bool_applier("mask_face"), choices=choices_bool), + xyz_grid.AxisOption("[ReActor] Face Models", str, str_applier("face_model"), choices=choices_face_models), + ] + set_a = {opt.label for opt in xyz_grid.axis_options} + set_b = {opt.label for opt in extra_axis_options} + if set_a.intersection(set_b): + return + + xyz_grid.axis_options.extend(extra_axis_options) + +def run(): + xyz_grid = find_module("xyz_grid.py, xy_grid.py") + if xyz_grid: + add_axis_options(xyz_grid) diff --git a/stable-diffusion-webui/html/card-no-preview.png b/stable-diffusion-webui/html/card-no-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..e2beb2692067db56ac5f7bd5bfc3d895d9063371 Binary files /dev/null and b/stable-diffusion-webui/html/card-no-preview.png differ diff --git a/stable-diffusion-webui/html/extra-networks-card.html b/stable-diffusion-webui/html/extra-networks-card.html new file mode 100644 index 0000000000000000000000000000000000000000..39674666f1e336d9bf61d2a6986721cf8591eeee --- /dev/null +++ b/stable-diffusion-webui/html/extra-networks-card.html @@ -0,0 +1,14 @@ +
+ {background_image} +
+ {metadata_button} + {edit_button} +
+
+
+ +
+ {name} + {description} +
+
diff --git a/stable-diffusion-webui/html/extra-networks-no-cards.html b/stable-diffusion-webui/html/extra-networks-no-cards.html new file mode 100644 index 0000000000000000000000000000000000000000..389358d6c4b383fdc3c5686e029e7b3b1ae9a493 --- /dev/null +++ b/stable-diffusion-webui/html/extra-networks-no-cards.html @@ -0,0 +1,8 @@ +
+

Nothing here. Add some content to the following directories:

+ +
    +{dirs} +
+
+ diff --git a/stable-diffusion-webui/html/footer.html b/stable-diffusion-webui/html/footer.html new file mode 100644 index 0000000000000000000000000000000000000000..8739a0f4752fd00b941d888d9a676158a3ba31a2 --- /dev/null +++ b/stable-diffusion-webui/html/footer.html @@ -0,0 +1,15 @@ +
+ API + โ€ƒโ€ขโ€ƒ + Github + โ€ƒโ€ขโ€ƒ + Gradio + โ€ƒโ€ขโ€ƒ + Startup profile + โ€ƒโ€ขโ€ƒ + Reload UI +
+
+
+{versions} +
diff --git a/stable-diffusion-webui/html/licenses.html b/stable-diffusion-webui/html/licenses.html new file mode 100644 index 0000000000000000000000000000000000000000..ca44deddd3663514962493c06a42a38d608c1229 --- /dev/null +++ b/stable-diffusion-webui/html/licenses.html @@ -0,0 +1,690 @@ + + +

CodeFormer

+Parts of CodeFormer code had to be copied to be compatible with GFPGAN. +
+S-Lab License 1.0
+
+Copyright 2022 S-Lab
+
+Redistribution and use for non-commercial purpose in source and
+binary forms, with or without modification, are permitted provided
+that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+In the event that redistribution and/or use for commercial purpose in
+source or binary forms, with or without modification is required,
+please contact the contributor(s) of the work.
+
+ + +

ESRGAN

+Code for architecture and reading models copied. +
+MIT License
+
+Copyright (c) 2021 victorca25
+
+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.
+
+ +

Real-ESRGAN

+Some code is copied to support ESRGAN models. +
+BSD 3-Clause License
+
+Copyright (c) 2021, Xintao Wang
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ +

InvokeAI

+Some code for compatibility with OSX is taken from lstein's repository. +
+MIT License
+
+Copyright (c) 2022 InvokeAI Team
+
+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.
+
+ +

LDSR

+Code added by contirubtors, most likely copied from this repository. +
+MIT License
+
+Copyright (c) 2022 Machine Vision and Learning Group, LMU Munich
+
+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.
+
+ +

CLIP Interrogator

+Some small amounts of code borrowed and reworked. +
+MIT License
+
+Copyright (c) 2022 pharmapsychotic
+
+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.
+
+ +

SwinIR

+Code added by contributors, most likely copied from this repository. + +
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [2021] [SwinIR Authors]
+
+   Licensed 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
+
+       http://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.
+
+ +

Memory Efficient Attention

+The sub-quadratic cross attention optimization uses modified code from the Memory Efficient Attention package that Alex Birch optimized for 3D tensors. This license is updated to reflect that. +
+MIT License
+
+Copyright (c) 2023 Alex Birch
+Copyright (c) 2023 Amin Rezaei
+
+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.
+
+ +

Scaled Dot Product Attention

+Some small amounts of code borrowed and reworked. +
+   Copyright 2023 The HuggingFace Team. All rights reserved.
+
+   Licensed 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
+
+      http://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 License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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
+
+       http://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.
+
+ +

Curated transformers

+The MPS workaround for nn.Linear on macOS 13.2.X is based on the MPS workaround for nn.Linear created by danieldk for Curated transformers +
+The MIT License (MIT)
+
+Copyright (C) 2021 ExplosionAI GmbH
+
+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.
+
+ +

TAESD

+Tiny AutoEncoder for Stable Diffusion option for live previews +
+MIT License
+
+Copyright (c) 2023 Ollin Boer Bohan
+
+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.
+
\ No newline at end of file diff --git a/stable-diffusion-webui/javascript/aspectRatioOverlay.js b/stable-diffusion-webui/javascript/aspectRatioOverlay.js new file mode 100644 index 0000000000000000000000000000000000000000..2cf2d571fc02a026b6cdedcf589a217ef0d65d27 --- /dev/null +++ b/stable-diffusion-webui/javascript/aspectRatioOverlay.js @@ -0,0 +1,113 @@ + +let currentWidth = null; +let currentHeight = null; +let arFrameTimeout = setTimeout(function() {}, 0); + +function dimensionChange(e, is_width, is_height) { + + if (is_width) { + currentWidth = e.target.value * 1.0; + } + if (is_height) { + currentHeight = e.target.value * 1.0; + } + + var inImg2img = gradioApp().querySelector("#tab_img2img").style.display == "block"; + + if (!inImg2img) { + return; + } + + var targetElement = null; + + var tabIndex = get_tab_index('mode_img2img'); + if (tabIndex == 0) { // img2img + targetElement = gradioApp().querySelector('#img2img_image div[data-testid=image] img'); + } else if (tabIndex == 1) { //Sketch + targetElement = gradioApp().querySelector('#img2img_sketch div[data-testid=image] img'); + } else if (tabIndex == 2) { // Inpaint + targetElement = gradioApp().querySelector('#img2maskimg div[data-testid=image] img'); + } else if (tabIndex == 3) { // Inpaint sketch + targetElement = gradioApp().querySelector('#inpaint_sketch div[data-testid=image] img'); + } + + + if (targetElement) { + + var arPreviewRect = gradioApp().querySelector('#imageARPreview'); + if (!arPreviewRect) { + arPreviewRect = document.createElement('div'); + arPreviewRect.id = "imageARPreview"; + gradioApp().appendChild(arPreviewRect); + } + + + + var viewportOffset = targetElement.getBoundingClientRect(); + + var viewportscale = Math.min(targetElement.clientWidth / targetElement.naturalWidth, targetElement.clientHeight / targetElement.naturalHeight); + + var scaledx = targetElement.naturalWidth * viewportscale; + var scaledy = targetElement.naturalHeight * viewportscale; + + var cleintRectTop = (viewportOffset.top + window.scrollY); + var cleintRectLeft = (viewportOffset.left + window.scrollX); + var cleintRectCentreY = cleintRectTop + (targetElement.clientHeight / 2); + var cleintRectCentreX = cleintRectLeft + (targetElement.clientWidth / 2); + + var arscale = Math.min(scaledx / currentWidth, scaledy / currentHeight); + var arscaledx = currentWidth * arscale; + var arscaledy = currentHeight * arscale; + + var arRectTop = cleintRectCentreY - (arscaledy / 2); + var arRectLeft = cleintRectCentreX - (arscaledx / 2); + var arRectWidth = arscaledx; + var arRectHeight = arscaledy; + + arPreviewRect.style.top = arRectTop + 'px'; + arPreviewRect.style.left = arRectLeft + 'px'; + arPreviewRect.style.width = arRectWidth + 'px'; + arPreviewRect.style.height = arRectHeight + 'px'; + + clearTimeout(arFrameTimeout); + arFrameTimeout = setTimeout(function() { + arPreviewRect.style.display = 'none'; + }, 2000); + + arPreviewRect.style.display = 'block'; + + } + +} + + +onAfterUiUpdate(function() { + var arPreviewRect = gradioApp().querySelector('#imageARPreview'); + if (arPreviewRect) { + arPreviewRect.style.display = 'none'; + } + var tabImg2img = gradioApp().querySelector("#tab_img2img"); + if (tabImg2img) { + var inImg2img = tabImg2img.style.display == "block"; + if (inImg2img) { + let inputs = gradioApp().querySelectorAll('input'); + inputs.forEach(function(e) { + var is_width = e.parentElement.id == "img2img_width"; + var is_height = e.parentElement.id == "img2img_height"; + + if ((is_width || is_height) && !e.classList.contains('scrollwatch')) { + e.addEventListener('input', function(e) { + dimensionChange(e, is_width, is_height); + }); + e.classList.add('scrollwatch'); + } + if (is_width) { + currentWidth = e.value * 1.0; + } + if (is_height) { + currentHeight = e.value * 1.0; + } + }); + } + } +}); diff --git a/stable-diffusion-webui/javascript/contextMenus.js b/stable-diffusion-webui/javascript/contextMenus.js new file mode 100644 index 0000000000000000000000000000000000000000..ccae242f2b6a731e89d8752814aae6b78e143482 --- /dev/null +++ b/stable-diffusion-webui/javascript/contextMenus.js @@ -0,0 +1,176 @@ + +var contextMenuInit = function() { + let eventListenerApplied = false; + let menuSpecs = new Map(); + + const uid = function() { + return Date.now().toString(36) + Math.random().toString(36).substring(2); + }; + + function showContextMenu(event, element, menuEntries) { + let posx = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; + let posy = event.clientY + document.body.scrollTop + document.documentElement.scrollTop; + + let oldMenu = gradioApp().querySelector('#context-menu'); + if (oldMenu) { + oldMenu.remove(); + } + + let baseStyle = window.getComputedStyle(uiCurrentTab); + + const contextMenu = document.createElement('nav'); + contextMenu.id = "context-menu"; + contextMenu.style.background = baseStyle.background; + contextMenu.style.color = baseStyle.color; + contextMenu.style.fontFamily = baseStyle.fontFamily; + contextMenu.style.top = posy + 'px'; + contextMenu.style.left = posx + 'px'; + + + + const contextMenuList = document.createElement('ul'); + contextMenuList.className = 'context-menu-items'; + contextMenu.append(contextMenuList); + + menuEntries.forEach(function(entry) { + let contextMenuEntry = document.createElement('a'); + contextMenuEntry.innerHTML = entry['name']; + contextMenuEntry.addEventListener("click", function() { + entry['func'](); + }); + contextMenuList.append(contextMenuEntry); + + }); + + gradioApp().appendChild(contextMenu); + + let menuWidth = contextMenu.offsetWidth + 4; + let menuHeight = contextMenu.offsetHeight + 4; + + let windowWidth = window.innerWidth; + let windowHeight = window.innerHeight; + + if ((windowWidth - posx) < menuWidth) { + contextMenu.style.left = windowWidth - menuWidth + "px"; + } + + if ((windowHeight - posy) < menuHeight) { + contextMenu.style.top = windowHeight - menuHeight + "px"; + } + + } + + function appendContextMenuOption(targetElementSelector, entryName, entryFunction) { + + var currentItems = menuSpecs.get(targetElementSelector); + + if (!currentItems) { + currentItems = []; + menuSpecs.set(targetElementSelector, currentItems); + } + let newItem = { + id: targetElementSelector + '_' + uid(), + name: entryName, + func: entryFunction, + isNew: true + }; + + currentItems.push(newItem); + return newItem['id']; + } + + function removeContextMenuOption(uid) { + menuSpecs.forEach(function(v) { + let index = -1; + v.forEach(function(e, ei) { + if (e['id'] == uid) { + index = ei; + } + }); + if (index >= 0) { + v.splice(index, 1); + } + }); + } + + function addContextMenuEventListener() { + if (eventListenerApplied) { + return; + } + gradioApp().addEventListener("click", function(e) { + if (!e.isTrusted) { + return; + } + + let oldMenu = gradioApp().querySelector('#context-menu'); + if (oldMenu) { + oldMenu.remove(); + } + }); + gradioApp().addEventListener("contextmenu", function(e) { + let oldMenu = gradioApp().querySelector('#context-menu'); + if (oldMenu) { + oldMenu.remove(); + } + menuSpecs.forEach(function(v, k) { + if (e.composedPath()[0].matches(k)) { + showContextMenu(e, e.composedPath()[0], v); + e.preventDefault(); + } + }); + }); + eventListenerApplied = true; + + } + + return [appendContextMenuOption, removeContextMenuOption, addContextMenuEventListener]; +}; + +var initResponse = contextMenuInit(); +var appendContextMenuOption = initResponse[0]; +var removeContextMenuOption = initResponse[1]; +var addContextMenuEventListener = initResponse[2]; + +(function() { + //Start example Context Menu Items + let generateOnRepeat = function(genbuttonid, interruptbuttonid) { + let genbutton = gradioApp().querySelector(genbuttonid); + let interruptbutton = gradioApp().querySelector(interruptbuttonid); + if (!interruptbutton.offsetParent) { + genbutton.click(); + } + clearInterval(window.generateOnRepeatInterval); + window.generateOnRepeatInterval = setInterval(function() { + if (!interruptbutton.offsetParent) { + genbutton.click(); + } + }, + 500); + }; + + let generateOnRepeat_txt2img = function() { + generateOnRepeat('#txt2img_generate', '#txt2img_interrupt'); + }; + + let generateOnRepeat_img2img = function() { + generateOnRepeat('#img2img_generate', '#img2img_interrupt'); + }; + + appendContextMenuOption('#txt2img_generate', 'Generate forever', generateOnRepeat_txt2img); + appendContextMenuOption('#txt2img_interrupt', 'Generate forever', generateOnRepeat_txt2img); + appendContextMenuOption('#img2img_generate', 'Generate forever', generateOnRepeat_img2img); + appendContextMenuOption('#img2img_interrupt', 'Generate forever', generateOnRepeat_img2img); + + let cancelGenerateForever = function() { + clearInterval(window.generateOnRepeatInterval); + }; + + appendContextMenuOption('#txt2img_interrupt', 'Cancel generate forever', cancelGenerateForever); + appendContextMenuOption('#txt2img_generate', 'Cancel generate forever', cancelGenerateForever); + appendContextMenuOption('#img2img_interrupt', 'Cancel generate forever', cancelGenerateForever); + appendContextMenuOption('#img2img_generate', 'Cancel generate forever', cancelGenerateForever); + +})(); +//End example Context Menu Items + +onAfterUiUpdate(addContextMenuEventListener); diff --git a/stable-diffusion-webui/javascript/dragdrop.js b/stable-diffusion-webui/javascript/dragdrop.js new file mode 100644 index 0000000000000000000000000000000000000000..d680daf52f28c8ace0a99706d60e5ea756fb258e --- /dev/null +++ b/stable-diffusion-webui/javascript/dragdrop.js @@ -0,0 +1,130 @@ +// allows drag-dropping files into gradio image elements, and also pasting images from clipboard + +function isValidImageList(files) { + return files && files?.length === 1 && ['image/png', 'image/gif', 'image/jpeg'].includes(files[0].type); +} + +function dropReplaceImage(imgWrap, files) { + if (!isValidImageList(files)) { + return; + } + + const tmpFile = files[0]; + + imgWrap.querySelector('.modify-upload button + button, .touch-none + div button + button')?.click(); + const callback = () => { + const fileInput = imgWrap.querySelector('input[type="file"]'); + if (fileInput) { + if (files.length === 0) { + files = new DataTransfer(); + files.items.add(tmpFile); + fileInput.files = files.files; + } else { + fileInput.files = files; + } + fileInput.dispatchEvent(new Event('change')); + } + }; + + if (imgWrap.closest('#pnginfo_image')) { + // special treatment for PNG Info tab, wait for fetch request to finish + const oldFetch = window.fetch; + window.fetch = async(input, options) => { + const response = await oldFetch(input, options); + if ('api/predict/' === input) { + const content = await response.text(); + window.fetch = oldFetch; + window.requestAnimationFrame(() => callback()); + return new Response(content, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); + } + return response; + }; + } else { + window.requestAnimationFrame(() => callback()); + } +} + +function eventHasFiles(e) { + if (!e.dataTransfer || !e.dataTransfer.files) return false; + if (e.dataTransfer.files.length > 0) return true; + if (e.dataTransfer.items.length > 0 && e.dataTransfer.items[0].kind == "file") return true; + + return false; +} + +function dragDropTargetIsPrompt(target) { + if (target?.placeholder && target?.placeholder.indexOf("Prompt") >= 0) return true; + if (target?.parentNode?.parentNode?.className?.indexOf("prompt") > 0) return true; + return false; +} + +window.document.addEventListener('dragover', e => { + const target = e.composedPath()[0]; + if (!eventHasFiles(e)) return; + + var targetImage = target.closest('[data-testid="image"]'); + if (!dragDropTargetIsPrompt(target) && !targetImage) return; + + e.stopPropagation(); + e.preventDefault(); + e.dataTransfer.dropEffect = 'copy'; +}); + +window.document.addEventListener('drop', e => { + const target = e.composedPath()[0]; + if (!eventHasFiles(e)) return; + + if (dragDropTargetIsPrompt(target)) { + e.stopPropagation(); + e.preventDefault(); + + let prompt_target = get_tab_index('tabs') == 1 ? "img2img_prompt_image" : "txt2img_prompt_image"; + + const imgParent = gradioApp().getElementById(prompt_target); + const files = e.dataTransfer.files; + const fileInput = imgParent.querySelector('input[type="file"]'); + if (fileInput) { + fileInput.files = files; + fileInput.dispatchEvent(new Event('change')); + } + } + + var targetImage = target.closest('[data-testid="image"]'); + if (targetImage) { + e.stopPropagation(); + e.preventDefault(); + const files = e.dataTransfer.files; + dropReplaceImage(targetImage, files); + return; + } +}); + +window.addEventListener('paste', e => { + const files = e.clipboardData.files; + if (!isValidImageList(files)) { + return; + } + + const visibleImageFields = [...gradioApp().querySelectorAll('[data-testid="image"]')] + .filter(el => uiElementIsVisible(el)) + .sort((a, b) => uiElementInSight(b) - uiElementInSight(a)); + + + if (!visibleImageFields.length) { + return; + } + + const firstFreeImageField = visibleImageFields + .filter(el => !el.querySelector('img'))?.[0]; + + dropReplaceImage( + firstFreeImageField ? + firstFreeImageField : + visibleImageFields[visibleImageFields.length - 1] + , files + ); +}); diff --git a/stable-diffusion-webui/javascript/edit-attention.js b/stable-diffusion-webui/javascript/edit-attention.js new file mode 100644 index 0000000000000000000000000000000000000000..688c2f112d6161877c947d8d17428fac77aa1df6 --- /dev/null +++ b/stable-diffusion-webui/javascript/edit-attention.js @@ -0,0 +1,148 @@ +function keyupEditAttention(event) { + let target = event.originalTarget || event.composedPath()[0]; + if (!target.matches("*:is([id*='_toprow'] [id*='_prompt'], .prompt) textarea")) return; + if (!(event.metaKey || event.ctrlKey)) return; + + let isPlus = event.key == "ArrowUp"; + let isMinus = event.key == "ArrowDown"; + if (!isPlus && !isMinus) return; + + let selectionStart = target.selectionStart; + let selectionEnd = target.selectionEnd; + let text = target.value; + + function selectCurrentParenthesisBlock(OPEN, CLOSE) { + if (selectionStart !== selectionEnd) return false; + + // Find opening parenthesis around current cursor + const before = text.substring(0, selectionStart); + let beforeParen = before.lastIndexOf(OPEN); + if (beforeParen == -1) return false; + + let beforeClosingParen = before.lastIndexOf(CLOSE); + if (beforeClosingParen != -1 && beforeClosingParen > beforeParen) return false; + + // Find closing parenthesis around current cursor + const after = text.substring(selectionStart); + let afterParen = after.indexOf(CLOSE); + if (afterParen == -1) return false; + + let afterOpeningParen = after.indexOf(OPEN); + if (afterOpeningParen != -1 && afterOpeningParen < afterParen) return false; + + // Set the selection to the text between the parenthesis + const parenContent = text.substring(beforeParen + 1, selectionStart + afterParen); + if (/.*:-?[\d.]+/s.test(parenContent)) { + const lastColon = parenContent.lastIndexOf(":"); + selectionStart = beforeParen + 1; + selectionEnd = selectionStart + lastColon; + } else { + selectionStart = beforeParen + 1; + selectionEnd = selectionStart + parenContent.length; + } + + target.setSelectionRange(selectionStart, selectionEnd); + return true; + } + + function selectCurrentWord() { + if (selectionStart !== selectionEnd) return false; + const whitespace_delimiters = {"Tab": "\t", "Carriage Return": "\r", "Line Feed": "\n"}; + let delimiters = opts.keyedit_delimiters; + + for (let i of opts.keyedit_delimiters_whitespace) { + delimiters += whitespace_delimiters[i]; + } + + // seek backward to find beginning + while (!delimiters.includes(text[selectionStart - 1]) && selectionStart > 0) { + selectionStart--; + } + + // seek forward to find end + while (!delimiters.includes(text[selectionEnd]) && selectionEnd < text.length) { + selectionEnd++; + } + + target.setSelectionRange(selectionStart, selectionEnd); + return true; + } + + // If the user hasn't selected anything, let's select their current parenthesis block or word + if (!selectCurrentParenthesisBlock('<', '>') && !selectCurrentParenthesisBlock('(', ')') && !selectCurrentParenthesisBlock('[', ']')) { + selectCurrentWord(); + } + + event.preventDefault(); + + var closeCharacter = ')'; + var delta = opts.keyedit_precision_attention; + var start = selectionStart > 0 ? text[selectionStart - 1] : ""; + var end = text[selectionEnd]; + + if (start == '<') { + closeCharacter = '>'; + delta = opts.keyedit_precision_extra; + } else if (start == '(' && end == ')' || start == '[' && end == ']') { // convert old-style (((emphasis))) + let numParen = 0; + + while (text[selectionStart - numParen - 1] == start && text[selectionEnd + numParen] == end) { + numParen++; + } + + if (start == "[") { + weight = (1 / 1.1) ** numParen; + } else { + weight = 1.1 ** numParen; + } + + weight = Math.round(weight / opts.keyedit_precision_attention) * opts.keyedit_precision_attention; + + text = text.slice(0, selectionStart - numParen) + "(" + text.slice(selectionStart, selectionEnd) + ":" + weight + ")" + text.slice(selectionEnd + numParen); + selectionStart -= numParen - 1; + selectionEnd -= numParen - 1; + } else if (start != '(') { + // do not include spaces at the end + while (selectionEnd > selectionStart && text[selectionEnd - 1] == ' ') { + selectionEnd--; + } + + if (selectionStart == selectionEnd) { + return; + } + + text = text.slice(0, selectionStart) + "(" + text.slice(selectionStart, selectionEnd) + ":1.0)" + text.slice(selectionEnd); + + selectionStart++; + selectionEnd++; + } + + if (text[selectionEnd] != ':') return; + var weightLength = text.slice(selectionEnd + 1).indexOf(closeCharacter) + 1; + var weight = parseFloat(text.slice(selectionEnd + 1, selectionEnd + weightLength)); + if (isNaN(weight)) return; + + weight += isPlus ? delta : -delta; + weight = parseFloat(weight.toPrecision(12)); + if (Number.isInteger(weight)) weight += ".0"; + + if (closeCharacter == ')' && weight == 1) { + var endParenPos = text.substring(selectionEnd).indexOf(')'); + text = text.slice(0, selectionStart - 1) + text.slice(selectionStart, selectionEnd) + text.slice(selectionEnd + endParenPos + 1); + selectionStart--; + selectionEnd--; + } else { + text = text.slice(0, selectionEnd + 1) + weight + text.slice(selectionEnd + weightLength); + } + + target.focus(); + target.value = text; + target.selectionStart = selectionStart; + target.selectionEnd = selectionEnd; + + updateInput(target); +} + +addEventListener('keydown', (event) => { + keyupEditAttention(event); +}); diff --git a/stable-diffusion-webui/javascript/edit-order.js b/stable-diffusion-webui/javascript/edit-order.js new file mode 100644 index 0000000000000000000000000000000000000000..ed4ef9ac399a6d0bd83435958dc4d46837760c6a --- /dev/null +++ b/stable-diffusion-webui/javascript/edit-order.js @@ -0,0 +1,41 @@ +/* alt+left/right moves text in prompt */ + +function keyupEditOrder(event) { + if (!opts.keyedit_move) return; + + let target = event.originalTarget || event.composedPath()[0]; + if (!target.matches("*:is([id*='_toprow'] [id*='_prompt'], .prompt) textarea")) return; + if (!event.altKey) return; + + let isLeft = event.key == "ArrowLeft"; + let isRight = event.key == "ArrowRight"; + if (!isLeft && !isRight) return; + event.preventDefault(); + + let selectionStart = target.selectionStart; + let selectionEnd = target.selectionEnd; + let text = target.value; + let items = text.split(","); + let indexStart = (text.slice(0, selectionStart).match(/,/g) || []).length; + let indexEnd = (text.slice(0, selectionEnd).match(/,/g) || []).length; + let range = indexEnd - indexStart + 1; + + if (isLeft && indexStart > 0) { + items.splice(indexStart - 1, 0, ...items.splice(indexStart, range)); + target.value = items.join(); + target.selectionStart = items.slice(0, indexStart - 1).join().length + (indexStart == 1 ? 0 : 1); + target.selectionEnd = items.slice(0, indexEnd).join().length; + } else if (isRight && indexEnd < items.length - 1) { + items.splice(indexStart + 1, 0, ...items.splice(indexStart, range)); + target.value = items.join(); + target.selectionStart = items.slice(0, indexStart + 1).join().length + 1; + target.selectionEnd = items.slice(0, indexEnd + 2).join().length; + } + + event.preventDefault(); + updateInput(target); +} + +addEventListener('keydown', (event) => { + keyupEditOrder(event); +}); diff --git a/stable-diffusion-webui/javascript/extensions.js b/stable-diffusion-webui/javascript/extensions.js new file mode 100644 index 0000000000000000000000000000000000000000..312131b76ebc2eea200698b81d024d98e8af9ea4 --- /dev/null +++ b/stable-diffusion-webui/javascript/extensions.js @@ -0,0 +1,92 @@ + +function extensions_apply(_disabled_list, _update_list, disable_all) { + var disable = []; + var update = []; + + gradioApp().querySelectorAll('#extensions input[type="checkbox"]').forEach(function(x) { + if (x.name.startsWith("enable_") && !x.checked) { + disable.push(x.name.substring(7)); + } + + if (x.name.startsWith("update_") && x.checked) { + update.push(x.name.substring(7)); + } + }); + + restart_reload(); + + return [JSON.stringify(disable), JSON.stringify(update), disable_all]; +} + +function extensions_check() { + var disable = []; + + gradioApp().querySelectorAll('#extensions input[type="checkbox"]').forEach(function(x) { + if (x.name.startsWith("enable_") && !x.checked) { + disable.push(x.name.substring(7)); + } + }); + + gradioApp().querySelectorAll('#extensions .extension_status').forEach(function(x) { + x.innerHTML = "Loading..."; + }); + + + var id = randomId(); + requestProgress(id, gradioApp().getElementById('extensions_installed_html'), null, function() { + + }); + + return [id, JSON.stringify(disable)]; +} + +function install_extension_from_index(button, url) { + button.disabled = "disabled"; + button.value = "Installing..."; + + var textarea = gradioApp().querySelector('#extension_to_install textarea'); + textarea.value = url; + updateInput(textarea); + + gradioApp().querySelector('#install_extension_button').click(); +} + +function config_state_confirm_restore(_, config_state_name, config_restore_type) { + if (config_state_name == "Current") { + return [false, config_state_name, config_restore_type]; + } + let restored = ""; + if (config_restore_type == "extensions") { + restored = "all saved extension versions"; + } else if (config_restore_type == "webui") { + restored = "the webui version"; + } else { + restored = "the webui version and all saved extension versions"; + } + let confirmed = confirm("Are you sure you want to restore from this state?\nThis will reset " + restored + "."); + if (confirmed) { + restart_reload(); + gradioApp().querySelectorAll('#extensions .extension_status').forEach(function(x) { + x.innerHTML = "Loading..."; + }); + } + return [confirmed, config_state_name, config_restore_type]; +} + +function toggle_all_extensions(event) { + gradioApp().querySelectorAll('#extensions .extension_toggle').forEach(function(checkbox_el) { + checkbox_el.checked = event.target.checked; + }); +} + +function toggle_extension() { + let all_extensions_toggled = true; + for (const checkbox_el of gradioApp().querySelectorAll('#extensions .extension_toggle')) { + if (!checkbox_el.checked) { + all_extensions_toggled = false; + break; + } + } + + gradioApp().querySelector('#extensions .all_extensions_toggle').checked = all_extensions_toggled; +} diff --git a/stable-diffusion-webui/javascript/extraNetworks.js b/stable-diffusion-webui/javascript/extraNetworks.js new file mode 100644 index 0000000000000000000000000000000000000000..98a7abb745c2baf0f131ee881ac221396657c51d --- /dev/null +++ b/stable-diffusion-webui/javascript/extraNetworks.js @@ -0,0 +1,400 @@ +function toggleCss(key, css, enable) { + var style = document.getElementById(key); + if (enable && !style) { + style = document.createElement('style'); + style.id = key; + style.type = 'text/css'; + document.head.appendChild(style); + } + if (style && !enable) { + document.head.removeChild(style); + } + if (style) { + style.innerHTML == ''; + style.appendChild(document.createTextNode(css)); + } +} + +function setupExtraNetworksForTab(tabname) { + gradioApp().querySelector('#' + tabname + '_extra_tabs').classList.add('extra-networks'); + + var tabs = gradioApp().querySelector('#' + tabname + '_extra_tabs > div'); + var searchDiv = gradioApp().getElementById(tabname + '_extra_search'); + var search = searchDiv.querySelector('textarea'); + var sort = gradioApp().getElementById(tabname + '_extra_sort'); + var sortOrder = gradioApp().getElementById(tabname + '_extra_sortorder'); + var refresh = gradioApp().getElementById(tabname + '_extra_refresh'); + var showDirsDiv = gradioApp().getElementById(tabname + '_extra_show_dirs'); + var showDirs = gradioApp().querySelector('#' + tabname + '_extra_show_dirs input'); + var promptContainer = gradioApp().querySelector('.prompt-container-compact#' + tabname + '_prompt_container'); + var negativePrompt = gradioApp().querySelector('#' + tabname + '_neg_prompt'); + + tabs.appendChild(searchDiv); + tabs.appendChild(sort); + tabs.appendChild(sortOrder); + tabs.appendChild(refresh); + tabs.appendChild(showDirsDiv); + + var applyFilter = function() { + var searchTerm = search.value.toLowerCase(); + + gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card').forEach(function(elem) { + var searchOnly = elem.querySelector('.search_only'); + var text = elem.querySelector('.name').textContent.toLowerCase() + " " + elem.querySelector('.search_term').textContent.toLowerCase(); + + var visible = text.indexOf(searchTerm) != -1; + + if (searchOnly && searchTerm.length < 4) { + visible = false; + } + + elem.style.display = visible ? "" : "none"; + }); + + applySort(); + }; + + var applySort = function() { + var cards = gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card'); + + var reverse = sortOrder.classList.contains("sortReverse"); + var sortKey = sort.querySelector("input").value.toLowerCase().replace("sort", "").replaceAll(" ", "_").replace(/_+$/, "").trim() || "name"; + sortKey = "sort" + sortKey.charAt(0).toUpperCase() + sortKey.slice(1); + var sortKeyStore = sortKey + "-" + (reverse ? "Descending" : "Ascending") + "-" + cards.length; + + if (sortKeyStore == sort.dataset.sortkey) { + return; + } + sort.dataset.sortkey = sortKeyStore; + + cards.forEach(function(card) { + card.originalParentElement = card.parentElement; + }); + var sortedCards = Array.from(cards); + sortedCards.sort(function(cardA, cardB) { + var a = cardA.dataset[sortKey]; + var b = cardB.dataset[sortKey]; + if (!isNaN(a) && !isNaN(b)) { + return parseInt(a) - parseInt(b); + } + + return (a < b ? -1 : (a > b ? 1 : 0)); + }); + if (reverse) { + sortedCards.reverse(); + } + cards.forEach(function(card) { + card.remove(); + }); + sortedCards.forEach(function(card) { + card.originalParentElement.appendChild(card); + }); + }; + + search.addEventListener("input", applyFilter); + sortOrder.addEventListener("click", function() { + sortOrder.classList.toggle("sortReverse"); + applySort(); + }); + applyFilter(); + + extraNetworksApplySort[tabname] = applySort; + extraNetworksApplyFilter[tabname] = applyFilter; + + var showDirsUpdate = function() { + var css = '#' + tabname + '_extra_tabs .extra-network-subdirs { display: none; }'; + toggleCss(tabname + '_extra_show_dirs_style', css, !showDirs.checked); + localSet('extra-networks-show-dirs', showDirs.checked ? 1 : 0); + }; + showDirs.checked = localGet('extra-networks-show-dirs', 1) == 1; + showDirs.addEventListener("change", showDirsUpdate); + showDirsUpdate(); +} + +function extraNetworksMovePromptToTab(tabname, id, showPrompt, showNegativePrompt) { + if (!gradioApp().querySelector('.toprow-compact-tools')) return; // only applicable for compact prompt layout + + var promptContainer = gradioApp().getElementById(tabname + '_prompt_container'); + var prompt = gradioApp().getElementById(tabname + '_prompt_row'); + var negPrompt = gradioApp().getElementById(tabname + '_neg_prompt_row'); + var elem = id ? gradioApp().getElementById(id) : null; + + if (showNegativePrompt && elem) { + elem.insertBefore(negPrompt, elem.firstChild); + } else { + promptContainer.insertBefore(negPrompt, promptContainer.firstChild); + } + + if (showPrompt && elem) { + elem.insertBefore(prompt, elem.firstChild); + } else { + promptContainer.insertBefore(prompt, promptContainer.firstChild); + } + + if (elem) { + elem.classList.toggle('extra-page-prompts-active', showNegativePrompt || showPrompt); + } +} + + +function extraNetworksUrelatedTabSelected(tabname) { // called from python when user selects an unrelated tab (generate) + extraNetworksMovePromptToTab(tabname, '', false, false); +} + +function extraNetworksTabSelected(tabname, id, showPrompt, showNegativePrompt) { // called from python when user selects an extra networks tab + extraNetworksMovePromptToTab(tabname, id, showPrompt, showNegativePrompt); + +} + +function applyExtraNetworkFilter(tabname) { + setTimeout(extraNetworksApplyFilter[tabname], 1); +} + +function applyExtraNetworkSort(tabname) { + setTimeout(extraNetworksApplySort[tabname], 1); +} + +var extraNetworksApplyFilter = {}; +var extraNetworksApplySort = {}; +var activePromptTextarea = {}; + +function setupExtraNetworks() { + setupExtraNetworksForTab('txt2img'); + setupExtraNetworksForTab('img2img'); + + function registerPrompt(tabname, id) { + var textarea = gradioApp().querySelector("#" + id + " > label > textarea"); + + if (!activePromptTextarea[tabname]) { + activePromptTextarea[tabname] = textarea; + } + + textarea.addEventListener("focus", function() { + activePromptTextarea[tabname] = textarea; + }); + } + + registerPrompt('txt2img', 'txt2img_prompt'); + registerPrompt('txt2img', 'txt2img_neg_prompt'); + registerPrompt('img2img', 'img2img_prompt'); + registerPrompt('img2img', 'img2img_neg_prompt'); +} + +onUiLoaded(setupExtraNetworks); + +var re_extranet = /<([^:^>]+:[^:]+):[\d.]+>(.*)/; +var re_extranet_g = /<([^:^>]+:[^:]+):[\d.]+>/g; + +function tryToRemoveExtraNetworkFromPrompt(textarea, text) { + var m = text.match(re_extranet); + var replaced = false; + var newTextareaText; + if (m) { + var extraTextBeforeNet = opts.extra_networks_add_text_separator; + var extraTextAfterNet = m[2]; + var partToSearch = m[1]; + var foundAtPosition = -1; + newTextareaText = textarea.value.replaceAll(re_extranet_g, function(found, net, pos) { + m = found.match(re_extranet); + if (m[1] == partToSearch) { + replaced = true; + foundAtPosition = pos; + return ""; + } + return found; + }); + + if (foundAtPosition >= 0) { + if (newTextareaText.substr(foundAtPosition, extraTextAfterNet.length) == extraTextAfterNet) { + newTextareaText = newTextareaText.substr(0, foundAtPosition) + newTextareaText.substr(foundAtPosition + extraTextAfterNet.length); + } + if (newTextareaText.substr(foundAtPosition - extraTextBeforeNet.length, extraTextBeforeNet.length) == extraTextBeforeNet) { + newTextareaText = newTextareaText.substr(0, foundAtPosition - extraTextBeforeNet.length) + newTextareaText.substr(foundAtPosition); + } + } + } else { + newTextareaText = textarea.value.replaceAll(new RegExp(text, "g"), function(found) { + if (found == text) { + replaced = true; + return ""; + } + return found; + }); + } + + if (replaced) { + textarea.value = newTextareaText; + return true; + } + + return false; +} + +function cardClicked(tabname, textToAdd, allowNegativePrompt) { + var textarea = allowNegativePrompt ? activePromptTextarea[tabname] : gradioApp().querySelector("#" + tabname + "_prompt > label > textarea"); + + if (!tryToRemoveExtraNetworkFromPrompt(textarea, textToAdd)) { + textarea.value = textarea.value + opts.extra_networks_add_text_separator + textToAdd; + } + + updateInput(textarea); +} + +function saveCardPreview(event, tabname, filename) { + var textarea = gradioApp().querySelector("#" + tabname + '_preview_filename > label > textarea'); + var button = gradioApp().getElementById(tabname + '_save_preview'); + + textarea.value = filename; + updateInput(textarea); + + button.click(); + + event.stopPropagation(); + event.preventDefault(); +} + +function extraNetworksSearchButton(tabs_id, event) { + var searchTextarea = gradioApp().querySelector("#" + tabs_id + ' > label > textarea'); + var button = event.target; + var text = button.classList.contains("search-all") ? "" : button.textContent.trim(); + + searchTextarea.value = text; + updateInput(searchTextarea); +} + +var globalPopup = null; +var globalPopupInner = null; + +function closePopup() { + if (!globalPopup) return; + globalPopup.style.display = "none"; +} + +function popup(contents) { + if (!globalPopup) { + globalPopup = document.createElement('div'); + globalPopup.classList.add('global-popup'); + + var close = document.createElement('div'); + close.classList.add('global-popup-close'); + close.addEventListener("click", closePopup); + close.title = "Close"; + globalPopup.appendChild(close); + + globalPopupInner = document.createElement('div'); + globalPopupInner.classList.add('global-popup-inner'); + globalPopup.appendChild(globalPopupInner); + + gradioApp().querySelector('.main').appendChild(globalPopup); + } + + globalPopupInner.innerHTML = ''; + globalPopupInner.appendChild(contents); + + globalPopup.style.display = "flex"; +} + +var storedPopupIds = {}; +function popupId(id) { + if (!storedPopupIds[id]) { + storedPopupIds[id] = gradioApp().getElementById(id); + } + + popup(storedPopupIds[id]); +} + +function extraNetworksShowMetadata(text) { + var elem = document.createElement('pre'); + elem.classList.add('popup-metadata'); + elem.textContent = text; + + popup(elem); +} + +function requestGet(url, data, handler, errorHandler) { + var xhr = new XMLHttpRequest(); + var args = Object.keys(data).map(function(k) { + return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]); + }).join('&'); + xhr.open("GET", url + "?" + args, true); + + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + try { + var js = JSON.parse(xhr.responseText); + handler(js); + } catch (error) { + console.error(error); + errorHandler(); + } + } else { + errorHandler(); + } + } + }; + var js = JSON.stringify(data); + xhr.send(js); +} + +function extraNetworksRequestMetadata(event, extraPage, cardName) { + var showError = function() { + extraNetworksShowMetadata("there was an error getting metadata"); + }; + + requestGet("./sd_extra_networks/metadata", {page: extraPage, item: cardName}, function(data) { + if (data && data.metadata) { + extraNetworksShowMetadata(data.metadata); + } else { + showError(); + } + }, showError); + + event.stopPropagation(); +} + +var extraPageUserMetadataEditors = {}; + +function extraNetworksEditUserMetadata(event, tabname, extraPage, cardName) { + var id = tabname + '_' + extraPage + '_edit_user_metadata'; + + var editor = extraPageUserMetadataEditors[id]; + if (!editor) { + editor = {}; + editor.page = gradioApp().getElementById(id); + editor.nameTextarea = gradioApp().querySelector("#" + id + "_name" + ' textarea'); + editor.button = gradioApp().querySelector("#" + id + "_button"); + extraPageUserMetadataEditors[id] = editor; + } + + editor.nameTextarea.value = cardName; + updateInput(editor.nameTextarea); + + editor.button.click(); + + popup(editor.page); + + event.stopPropagation(); +} + +function extraNetworksRefreshSingleCard(page, tabname, name) { + requestGet("./sd_extra_networks/get-single-card", {page: page, tabname: tabname, name: name}, function(data) { + if (data && data.html) { + var card = gradioApp().querySelector(`#${tabname}_${page.replace(" ", "_")}_cards > .card[data-name="${name}"]`); + + var newDiv = document.createElement('DIV'); + newDiv.innerHTML = data.html; + var newCard = newDiv.firstElementChild; + + newCard.style.display = ''; + card.parentElement.insertBefore(newCard, card); + card.parentElement.removeChild(card); + } + }); +} + +window.addEventListener("keydown", function(event) { + if (event.key == "Escape") { + closePopup(); + } +}); diff --git a/stable-diffusion-webui/javascript/generationParams.js b/stable-diffusion-webui/javascript/generationParams.js new file mode 100644 index 0000000000000000000000000000000000000000..7c0fd221d63313ab063f545570eb0da780b9da3a --- /dev/null +++ b/stable-diffusion-webui/javascript/generationParams.js @@ -0,0 +1,35 @@ +// attaches listeners to the txt2img and img2img galleries to update displayed generation param text when the image changes + +let txt2img_gallery, img2img_gallery, modal = undefined; +onAfterUiUpdate(function() { + if (!txt2img_gallery) { + txt2img_gallery = attachGalleryListeners("txt2img"); + } + if (!img2img_gallery) { + img2img_gallery = attachGalleryListeners("img2img"); + } + if (!modal) { + modal = gradioApp().getElementById('lightboxModal'); + modalObserver.observe(modal, {attributes: true, attributeFilter: ['style']}); + } +}); + +let modalObserver = new MutationObserver(function(mutations) { + mutations.forEach(function(mutationRecord) { + let selectedTab = gradioApp().querySelector('#tabs div button.selected')?.innerText; + if (mutationRecord.target.style.display === 'none' && (selectedTab === 'txt2img' || selectedTab === 'img2img')) { + gradioApp().getElementById(selectedTab + "_generation_info_button")?.click(); + } + }); +}); + +function attachGalleryListeners(tab_name) { + var gallery = gradioApp().querySelector('#' + tab_name + '_gallery'); + gallery?.addEventListener('click', () => gradioApp().getElementById(tab_name + "_generation_info_button").click()); + gallery?.addEventListener('keydown', (e) => { + if (e.keyCode == 37 || e.keyCode == 39) { // left or right arrow + gradioApp().getElementById(tab_name + "_generation_info_button").click(); + } + }); + return gallery; +} diff --git a/stable-diffusion-webui/javascript/hints.js b/stable-diffusion-webui/javascript/hints.js new file mode 100644 index 0000000000000000000000000000000000000000..6de9372e8ea8c9fb032351e241d0f9c265995290 --- /dev/null +++ b/stable-diffusion-webui/javascript/hints.js @@ -0,0 +1,203 @@ +// mouseover tooltips for various UI elements + +var titles = { + "Sampling steps": "How many times to improve the generated image iteratively; higher values take longer; very low values can produce bad results", + "Sampling method": "Which algorithm to use to produce the image", + "GFPGAN": "Restore low quality faces using GFPGAN neural network", + "Euler a": "Euler Ancestral - very creative, each can get a completely different picture depending on step count, setting steps higher than 30-40 does not help", + "DDIM": "Denoising Diffusion Implicit Models - best at inpainting", + "UniPC": "Unified Predictor-Corrector Framework for Fast Sampling of Diffusion Models", + "DPM adaptive": "Ignores step count - uses a number of steps determined by the CFG and resolution", + + "\u{1F4D0}": "Auto detect size from img2img", + "Batch count": "How many batches of images to create (has no impact on generation performance or VRAM usage)", + "Batch size": "How many image to create in a single batch (increases generation performance at cost of higher VRAM usage)", + "CFG Scale": "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results", + "Seed": "A value that determines the output of random number generator - if you create an image with same parameters and seed as another image, you'll get the same result", + "\u{1f3b2}\ufe0f": "Set seed to -1, which will cause a new random number to be used every time", + "\u267b\ufe0f": "Reuse seed from last generation, mostly useful if it was randomized", + "\u2199\ufe0f": "Read generation parameters from prompt or last generation if prompt is empty into user interface.", + "\u{1f4c2}": "Open images output directory", + "\u{1f4be}": "Save style", + "\u{1f5d1}\ufe0f": "Clear prompt", + "\u{1f4cb}": "Apply selected styles to current prompt", + "\u{1f4d2}": "Paste available values into the field", + "\u{1f3b4}": "Show/hide extra networks", + "\u{1f300}": "Restore progress", + + "Inpaint a part of image": "Draw a mask over an image, and the script will regenerate the masked area with content according to prompt", + "SD upscale": "Upscale image normally, split result into tiles, improve each tile using img2img, merge whole image back", + + "Just resize": "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.", + "Crop and resize": "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.", + "Resize and fill": "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.", + + "Mask blur": "How much to blur the mask before processing, in pixels.", + "Masked content": "What to put inside the masked area before processing it with Stable Diffusion.", + "fill": "fill it with colors of the image", + "original": "keep whatever was there originally", + "latent noise": "fill it with latent space noise", + "latent nothing": "fill it with latent space zeroes", + "Inpaint at full resolution": "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image", + + "Denoising strength": "Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies.", + + "Skip": "Stop processing current image and continue processing.", + "Interrupt": "Stop processing images and return any results accumulated so far.", + "Save": "Write image to a directory (default - log/images) and generation parameters into csv file.", + + "X values": "Separate values for X axis using commas.", + "Y values": "Separate values for Y axis using commas.", + + "None": "Do not do anything special", + "Prompt matrix": "Separate prompts into parts using vertical pipe character (|) and the script will create a picture for every combination of them (except for the first part, which will be present in all combinations)", + "X/Y/Z plot": "Create grid(s) where images will have different parameters. Use inputs below to specify which parameters will be shared by columns and rows", + "Custom code": "Run Python code. Advanced user only. Must run program with --allow-code for this to work", + + "Prompt S/R": "Separate a list of words with commas, and the first word will be used as a keyword: script will search for this word in the prompt, and replace it with others", + "Prompt order": "Separate a list of words with commas, and the script will make a variation of prompt with those words for their every possible order", + + "Tiling": "Produce an image that can be tiled.", + "Tile overlap": "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.", + + "Variation seed": "Seed of a different picture to be mixed into the generation.", + "Variation strength": "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).", + "Resize seed from height": "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution", + "Resize seed from width": "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution", + + "Interrogate": "Reconstruct prompt from existing image and put it into the prompt field.", + + "Images filename pattern": "Use tags like [seed] and [date] to define how filenames for images are chosen. Leave empty for default.", + "Directory name pattern": "Use tags like [seed] and [date] to define how subdirectories for images and grids are chosen. Leave empty for default.", + "Max prompt words": "Set the maximum number of words to be used in the [prompt_words] option; ATTENTION: If the words are too long, they may exceed the maximum length of the file path that the system can handle", + + "Loopback": "Performs img2img processing multiple times. Output images are used as input for the next loop.", + "Loops": "How many times to process an image. Each output is used as the input of the next loop. If set to 1, behavior will be as if this script were not used.", + "Final denoising strength": "The denoising strength for the final loop of each image in the batch.", + "Denoising strength curve": "The denoising curve controls the rate of denoising strength change each loop. Aggressive: Most of the change will happen towards the start of the loops. Linear: Change will be constant through all loops. Lazy: Most of the change will happen towards the end of the loops.", + + "Style 1": "Style to apply; styles have components for both positive and negative prompts and apply to both", + "Style 2": "Style to apply; styles have components for both positive and negative prompts and apply to both", + "Apply style": "Insert selected styles into prompt fields", + "Create style": "Save current prompts as a style. If you add the token {prompt} to the text, the style uses that as a placeholder for your prompt when you use the style in the future.", + + "Checkpoint name": "Loads weights from checkpoint before making images. You can either use hash or a part of filename (as seen in settings) for checkpoint name. Recommended to use with Y axis for less switching.", + "Inpainting conditioning mask strength": "Only applies to inpainting models. Determines how strongly to mask off the original image for inpainting and img2img. 1.0 means fully masked, which is the default behaviour. 0.0 means a fully unmasked conditioning. Lower values will help preserve the overall composition of the image, but will struggle with large changes.", + + "Eta noise seed delta": "If this values is non-zero, it will be added to seed and used to initialize RNG for noises when using samplers with Eta. You can use this to produce even more variation of images, or you can use this to match images of other software if you know what you are doing.", + + "Filename word regex": "This regular expression will be used extract words from filename, and they will be joined using the option below into label text used for training. Leave empty to keep filename text as it is.", + "Filename join string": "This string will be used to join split words into a single line if the option above is enabled.", + + "Quicksettings list": "List of setting names, separated by commas, for settings that should go to the quick access bar at the top, rather than the usual setting tab. See modules/shared.py for setting names. Requires restarting to apply.", + + "Weighted sum": "Result = A * (1 - M) + B * M", + "Add difference": "Result = A + (B - C) * M", + "No interpolation": "Result = A", + + "Initialization text": "If the number of tokens is more than the number of vectors, some may be skipped.\nLeave the textbox empty to start with zeroed out vectors", + "Learning rate": "How fast should training go. Low values will take longer to train, high values may fail to converge (not generate accurate results) and/or may break the embedding (This has happened if you see Loss: nan in the training info textbox. If this happens, you need to manually restore your embedding from an older not-broken backup).\n\nYou can set a single numeric value, or multiple learning rates using the syntax:\n\n rate_1:max_steps_1, rate_2:max_steps_2, ...\n\nEG: 0.005:100, 1e-3:1000, 1e-5\n\nWill train with rate of 0.005 for first 100 steps, then 1e-3 until 1000 steps, then 1e-5 for all remaining steps.", + + "Clip skip": "Early stopping parameter for CLIP model; 1 is stop at last layer as usual, 2 is stop at penultimate layer, etc.", + + "Approx NN": "Cheap neural network approximation. Very fast compared to VAE, but produces pictures with 4 times smaller horizontal/vertical resolution and lower quality.", + "Approx cheap": "Very cheap approximation. Very fast compared to VAE, but produces pictures with 8 times smaller horizontal/vertical resolution and extremely low quality.", + + "Hires. fix": "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition", + "Hires steps": "Number of sampling steps for upscaled picture. If 0, uses same as for original.", + "Upscale by": "Adjusts the size of the image by multiplying the original width and height by the selected value. Ignored if either Resize width to or Resize height to are non-zero.", + "Resize width to": "Resizes image to this width. If 0, width is inferred from either of two nearby sliders.", + "Resize height to": "Resizes image to this height. If 0, height is inferred from either of two nearby sliders.", + "Discard weights with matching name": "Regular expression; if weights's name matches it, the weights is not written to the resulting checkpoint. Use ^model_ema to discard EMA weights.", + "Extra networks tab order": "Comma-separated list of tab names; tabs listed here will appear in the extra networks UI first and in order listed.", + "Negative Guidance minimum sigma": "Skip negative prompt for steps where image is already mostly denoised; the higher this value, the more skips there will be; provides increased performance in exchange for minor quality reduction." +}; + +function updateTooltip(element) { + if (element.title) return; // already has a title + + let text = element.textContent; + let tooltip = localization[titles[text]] || titles[text]; + + if (!tooltip) { + let value = element.value; + if (value) tooltip = localization[titles[value]] || titles[value]; + } + + if (!tooltip) { + // Gradio dropdown options have `data-value`. + let dataValue = element.dataset.value; + if (dataValue) tooltip = localization[titles[dataValue]] || titles[dataValue]; + } + + if (!tooltip) { + for (const c of element.classList) { + if (c in titles) { + tooltip = localization[titles[c]] || titles[c]; + break; + } + } + } + + if (tooltip) { + element.title = tooltip; + } +} + +// Nodes to check for adding tooltips. +const tooltipCheckNodes = new Set(); +// Timer for debouncing tooltip check. +let tooltipCheckTimer = null; + +function processTooltipCheckNodes() { + for (const node of tooltipCheckNodes) { + updateTooltip(node); + } + tooltipCheckNodes.clear(); +} + +onUiUpdate(function(mutationRecords) { + for (const record of mutationRecords) { + if (record.type === "childList" && record.target.classList.contains("options")) { + // This smells like a Gradio dropdown menu having changed, + // so let's enqueue an update for the input element that shows the current value. + let wrap = record.target.parentNode; + let input = wrap?.querySelector("input"); + if (input) { + input.title = ""; // So we'll even have a chance to update it. + tooltipCheckNodes.add(input); + } + } + for (const node of record.addedNodes) { + if (node.nodeType === Node.ELEMENT_NODE && !node.classList.contains("hide")) { + if (!node.title) { + if ( + node.tagName === "SPAN" || + node.tagName === "BUTTON" || + node.tagName === "P" || + node.tagName === "INPUT" || + (node.tagName === "LI" && node.classList.contains("item")) // Gradio dropdown item + ) { + tooltipCheckNodes.add(node); + } + } + node.querySelectorAll('span, button, p').forEach(n => tooltipCheckNodes.add(n)); + } + } + } + if (tooltipCheckNodes.size) { + clearTimeout(tooltipCheckTimer); + tooltipCheckTimer = setTimeout(processTooltipCheckNodes, 1000); + } +}); + +onUiLoaded(function() { + for (var comp of window.gradio_config.components) { + if (comp.props.webui_tooltip && comp.props.elem_id) { + var elem = gradioApp().getElementById(comp.props.elem_id); + if (elem) { + elem.title = comp.props.webui_tooltip; + } + } + } +}); diff --git a/stable-diffusion-webui/javascript/hires_fix.js b/stable-diffusion-webui/javascript/hires_fix.js new file mode 100644 index 0000000000000000000000000000000000000000..0d04ab3b424338634af3e71a2f9d8796a5f00224 --- /dev/null +++ b/stable-diffusion-webui/javascript/hires_fix.js @@ -0,0 +1,18 @@ + +function onCalcResolutionHires(enable, width, height, hr_scale, hr_resize_x, hr_resize_y) { + function setInactive(elem, inactive) { + elem.classList.toggle('inactive', !!inactive); + } + + var hrUpscaleBy = gradioApp().getElementById('txt2img_hr_scale'); + var hrResizeX = gradioApp().getElementById('txt2img_hr_resize_x'); + var hrResizeY = gradioApp().getElementById('txt2img_hr_resize_y'); + + gradioApp().getElementById('txt2img_hires_fix_row2').style.display = opts.use_old_hires_fix_width_height ? "none" : ""; + + setInactive(hrUpscaleBy, opts.use_old_hires_fix_width_height || hr_resize_x > 0 || hr_resize_y > 0); + setInactive(hrResizeX, opts.use_old_hires_fix_width_height || hr_resize_x == 0); + setInactive(hrResizeY, opts.use_old_hires_fix_width_height || hr_resize_y == 0); + + return [enable, width, height, hr_scale, hr_resize_x, hr_resize_y]; +} diff --git a/stable-diffusion-webui/javascript/imageMaskFix.js b/stable-diffusion-webui/javascript/imageMaskFix.js new file mode 100644 index 0000000000000000000000000000000000000000..900c56f32fdf7128f0433621df25a0fbd14c4e42 --- /dev/null +++ b/stable-diffusion-webui/javascript/imageMaskFix.js @@ -0,0 +1,43 @@ +/** + * temporary fix for https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/668 + * @see https://github.com/gradio-app/gradio/issues/1721 + */ +function imageMaskResize() { + const canvases = gradioApp().querySelectorAll('#img2maskimg .touch-none canvas'); + if (!canvases.length) { + window.removeEventListener('resize', imageMaskResize); + return; + } + + const wrapper = canvases[0].closest('.touch-none'); + const previewImage = wrapper.previousElementSibling; + + if (!previewImage.complete) { + previewImage.addEventListener('load', imageMaskResize); + return; + } + + const w = previewImage.width; + const h = previewImage.height; + const nw = previewImage.naturalWidth; + const nh = previewImage.naturalHeight; + const portrait = nh > nw; + + const wW = Math.min(w, portrait ? h / nh * nw : w / nw * nw); + const wH = Math.min(h, portrait ? h / nh * nh : w / nw * nh); + + wrapper.style.width = `${wW}px`; + wrapper.style.height = `${wH}px`; + wrapper.style.left = `0px`; + wrapper.style.top = `0px`; + + canvases.forEach(c => { + c.style.width = c.style.height = ''; + c.style.maxWidth = '100%'; + c.style.maxHeight = '100%'; + c.style.objectFit = 'contain'; + }); +} + +onAfterUiUpdate(imageMaskResize); +window.addEventListener('resize', imageMaskResize); diff --git a/stable-diffusion-webui/javascript/imageviewer.js b/stable-diffusion-webui/javascript/imageviewer.js new file mode 100644 index 0000000000000000000000000000000000000000..625c5d148df27f33de315b9db0a446176b7ab8cb --- /dev/null +++ b/stable-diffusion-webui/javascript/imageviewer.js @@ -0,0 +1,262 @@ +// A full size 'lightbox' preview modal shown when left clicking on gallery previews +function closeModal() { + gradioApp().getElementById("lightboxModal").style.display = "none"; +} + +function showModal(event) { + const source = event.target || event.srcElement; + const modalImage = gradioApp().getElementById("modalImage"); + const lb = gradioApp().getElementById("lightboxModal"); + modalImage.src = source.src; + if (modalImage.style.display === 'none') { + lb.style.setProperty('background-image', 'url(' + source.src + ')'); + } + lb.style.display = "flex"; + lb.focus(); + + const tabTxt2Img = gradioApp().getElementById("tab_txt2img"); + const tabImg2Img = gradioApp().getElementById("tab_img2img"); + // show the save button in modal only on txt2img or img2img tabs + if (tabTxt2Img.style.display != "none" || tabImg2Img.style.display != "none") { + gradioApp().getElementById("modal_save").style.display = "inline"; + } else { + gradioApp().getElementById("modal_save").style.display = "none"; + } + event.stopPropagation(); +} + +function negmod(n, m) { + return ((n % m) + m) % m; +} + +function updateOnBackgroundChange() { + const modalImage = gradioApp().getElementById("modalImage"); + if (modalImage && modalImage.offsetParent) { + let currentButton = selected_gallery_button(); + let preview = gradioApp().querySelectorAll('.livePreview > img'); + if (opts.js_live_preview_in_modal_lightbox && preview.length > 0) { + // show preview image if available + modalImage.src = preview[preview.length - 1].src; + } else if (currentButton?.children?.length > 0 && modalImage.src != currentButton.children[0].src) { + modalImage.src = currentButton.children[0].src; + if (modalImage.style.display === 'none') { + const modal = gradioApp().getElementById("lightboxModal"); + modal.style.setProperty('background-image', `url(${modalImage.src})`); + } + } + } +} + +function modalImageSwitch(offset) { + var galleryButtons = all_gallery_buttons(); + + if (galleryButtons.length > 1) { + var currentButton = selected_gallery_button(); + + var result = -1; + galleryButtons.forEach(function(v, i) { + if (v == currentButton) { + result = i; + } + }); + + if (result != -1) { + var nextButton = galleryButtons[negmod((result + offset), galleryButtons.length)]; + nextButton.click(); + const modalImage = gradioApp().getElementById("modalImage"); + const modal = gradioApp().getElementById("lightboxModal"); + modalImage.src = nextButton.children[0].src; + if (modalImage.style.display === 'none') { + modal.style.setProperty('background-image', `url(${modalImage.src})`); + } + setTimeout(function() { + modal.focus(); + }, 10); + } + } +} + +function saveImage() { + const tabTxt2Img = gradioApp().getElementById("tab_txt2img"); + const tabImg2Img = gradioApp().getElementById("tab_img2img"); + const saveTxt2Img = "save_txt2img"; + const saveImg2Img = "save_img2img"; + if (tabTxt2Img.style.display != "none") { + gradioApp().getElementById(saveTxt2Img).click(); + } else if (tabImg2Img.style.display != "none") { + gradioApp().getElementById(saveImg2Img).click(); + } else { + console.error("missing implementation for saving modal of this type"); + } +} + +function modalSaveImage(event) { + saveImage(); + event.stopPropagation(); +} + +function modalNextImage(event) { + modalImageSwitch(1); + event.stopPropagation(); +} + +function modalPrevImage(event) { + modalImageSwitch(-1); + event.stopPropagation(); +} + +function modalKeyHandler(event) { + switch (event.key) { + case "s": + saveImage(); + break; + case "ArrowLeft": + modalPrevImage(event); + break; + case "ArrowRight": + modalNextImage(event); + break; + case "Escape": + closeModal(); + break; + } +} + +function setupImageForLightbox(e) { + if (e.dataset.modded) { + return; + } + + e.dataset.modded = true; + e.style.cursor = 'pointer'; + e.style.userSelect = 'none'; + + var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; + + // For Firefox, listening on click first switched to next image then shows the lightbox. + // If you know how to fix this without switching to mousedown event, please. + // For other browsers the event is click to make it possiblr to drag picture. + var event = isFirefox ? 'mousedown' : 'click'; + + e.addEventListener(event, function(evt) { + if (evt.button == 1) { + open(evt.target.src); + evt.preventDefault(); + return; + } + if (!opts.js_modal_lightbox || evt.button != 0) return; + + modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initially_zoomed); + evt.preventDefault(); + showModal(evt); + }, true); + +} + +function modalZoomSet(modalImage, enable) { + if (modalImage) modalImage.classList.toggle('modalImageFullscreen', !!enable); +} + +function modalZoomToggle(event) { + var modalImage = gradioApp().getElementById("modalImage"); + modalZoomSet(modalImage, !modalImage.classList.contains('modalImageFullscreen')); + event.stopPropagation(); +} + +function modalTileImageToggle(event) { + const modalImage = gradioApp().getElementById("modalImage"); + const modal = gradioApp().getElementById("lightboxModal"); + const isTiling = modalImage.style.display === 'none'; + if (isTiling) { + modalImage.style.display = 'block'; + modal.style.setProperty('background-image', 'none'); + } else { + modalImage.style.display = 'none'; + modal.style.setProperty('background-image', `url(${modalImage.src})`); + } + + event.stopPropagation(); +} + +onAfterUiUpdate(function() { + var fullImg_preview = gradioApp().querySelectorAll('.gradio-gallery > div > img'); + if (fullImg_preview != null) { + fullImg_preview.forEach(setupImageForLightbox); + } + updateOnBackgroundChange(); +}); + +document.addEventListener("DOMContentLoaded", function() { + //const modalFragment = document.createDocumentFragment(); + const modal = document.createElement('div'); + modal.onclick = closeModal; + modal.id = "lightboxModal"; + modal.tabIndex = 0; + modal.addEventListener('keydown', modalKeyHandler, true); + + const modalControls = document.createElement('div'); + modalControls.className = 'modalControls gradio-container'; + modal.append(modalControls); + + const modalZoom = document.createElement('span'); + modalZoom.className = 'modalZoom cursor'; + modalZoom.innerHTML = '⤡'; + modalZoom.addEventListener('click', modalZoomToggle, true); + modalZoom.title = "Toggle zoomed view"; + modalControls.appendChild(modalZoom); + + const modalTileImage = document.createElement('span'); + modalTileImage.className = 'modalTileImage cursor'; + modalTileImage.innerHTML = '⊞'; + modalTileImage.addEventListener('click', modalTileImageToggle, true); + modalTileImage.title = "Preview tiling"; + modalControls.appendChild(modalTileImage); + + const modalSave = document.createElement("span"); + modalSave.className = "modalSave cursor"; + modalSave.id = "modal_save"; + modalSave.innerHTML = "🖫"; + modalSave.addEventListener("click", modalSaveImage, true); + modalSave.title = "Save Image(s)"; + modalControls.appendChild(modalSave); + + const modalClose = document.createElement('span'); + modalClose.className = 'modalClose cursor'; + modalClose.innerHTML = '×'; + modalClose.onclick = closeModal; + modalClose.title = "Close image viewer"; + modalControls.appendChild(modalClose); + + const modalImage = document.createElement('img'); + modalImage.id = 'modalImage'; + modalImage.onclick = closeModal; + modalImage.tabIndex = 0; + modalImage.addEventListener('keydown', modalKeyHandler, true); + modal.appendChild(modalImage); + + const modalPrev = document.createElement('a'); + modalPrev.className = 'modalPrev'; + modalPrev.innerHTML = '❮'; + modalPrev.tabIndex = 0; + modalPrev.addEventListener('click', modalPrevImage, true); + modalPrev.addEventListener('keydown', modalKeyHandler, true); + modal.appendChild(modalPrev); + + const modalNext = document.createElement('a'); + modalNext.className = 'modalNext'; + modalNext.innerHTML = '❯'; + modalNext.tabIndex = 0; + modalNext.addEventListener('click', modalNextImage, true); + modalNext.addEventListener('keydown', modalKeyHandler, true); + + modal.appendChild(modalNext); + + try { + gradioApp().appendChild(modal); + } catch (e) { + gradioApp().body.appendChild(modal); + } + + document.body.appendChild(modal); + +}); diff --git a/stable-diffusion-webui/javascript/imageviewerGamepad.js b/stable-diffusion-webui/javascript/imageviewerGamepad.js new file mode 100644 index 0000000000000000000000000000000000000000..a22c7e6e6435f677c7a86dbbae5da86af8fdc9eb --- /dev/null +++ b/stable-diffusion-webui/javascript/imageviewerGamepad.js @@ -0,0 +1,63 @@ +let gamepads = []; + +window.addEventListener('gamepadconnected', (e) => { + const index = e.gamepad.index; + let isWaiting = false; + gamepads[index] = setInterval(async() => { + if (!opts.js_modal_lightbox_gamepad || isWaiting) return; + const gamepad = navigator.getGamepads()[index]; + const xValue = gamepad.axes[0]; + if (xValue <= -0.3) { + modalPrevImage(e); + isWaiting = true; + } else if (xValue >= 0.3) { + modalNextImage(e); + isWaiting = true; + } + if (isWaiting) { + await sleepUntil(() => { + const xValue = navigator.getGamepads()[index].axes[0]; + if (xValue < 0.3 && xValue > -0.3) { + return true; + } + }, opts.js_modal_lightbox_gamepad_repeat); + isWaiting = false; + } + }, 10); +}); + +window.addEventListener('gamepaddisconnected', (e) => { + clearInterval(gamepads[e.gamepad.index]); +}); + +/* +Primarily for vr controller type pointer devices. +I use the wheel event because there's currently no way to do it properly with web xr. + */ +let isScrolling = false; +window.addEventListener('wheel', (e) => { + if (!opts.js_modal_lightbox_gamepad || isScrolling) return; + isScrolling = true; + + if (e.deltaX <= -0.6) { + modalPrevImage(e); + } else if (e.deltaX >= 0.6) { + modalNextImage(e); + } + + setTimeout(() => { + isScrolling = false; + }, opts.js_modal_lightbox_gamepad_repeat); +}); + +function sleepUntil(f, timeout) { + return new Promise((resolve) => { + const timeStart = new Date(); + const wait = setInterval(function() { + if (f() || new Date() - timeStart > timeout) { + clearInterval(wait); + resolve(); + } + }, 20); + }); +} diff --git a/stable-diffusion-webui/javascript/inputAccordion.js b/stable-diffusion-webui/javascript/inputAccordion.js new file mode 100644 index 0000000000000000000000000000000000000000..7570309aa73fe051b41481db0da46dca94e57ab9 --- /dev/null +++ b/stable-diffusion-webui/javascript/inputAccordion.js @@ -0,0 +1,68 @@ +function inputAccordionChecked(id, checked) { + var accordion = gradioApp().getElementById(id); + accordion.visibleCheckbox.checked = checked; + accordion.onVisibleCheckboxChange(); +} + +function setupAccordion(accordion) { + var labelWrap = accordion.querySelector('.label-wrap'); + var gradioCheckbox = gradioApp().querySelector('#' + accordion.id + "-checkbox input"); + var extra = gradioApp().querySelector('#' + accordion.id + "-extra"); + var span = labelWrap.querySelector('span'); + var linked = true; + + var isOpen = function() { + return labelWrap.classList.contains('open'); + }; + + var observerAccordionOpen = new MutationObserver(function(mutations) { + mutations.forEach(function(mutationRecord) { + accordion.classList.toggle('input-accordion-open', isOpen()); + + if (linked) { + accordion.visibleCheckbox.checked = isOpen(); + accordion.onVisibleCheckboxChange(); + } + }); + }); + observerAccordionOpen.observe(labelWrap, {attributes: true, attributeFilter: ['class']}); + + if (extra) { + labelWrap.insertBefore(extra, labelWrap.lastElementChild); + } + + accordion.onChecked = function(checked) { + if (isOpen() != checked) { + labelWrap.click(); + } + }; + + var visibleCheckbox = document.createElement('INPUT'); + visibleCheckbox.type = 'checkbox'; + visibleCheckbox.checked = isOpen(); + visibleCheckbox.id = accordion.id + "-visible-checkbox"; + visibleCheckbox.className = gradioCheckbox.className + " input-accordion-checkbox"; + span.insertBefore(visibleCheckbox, span.firstChild); + + accordion.visibleCheckbox = visibleCheckbox; + accordion.onVisibleCheckboxChange = function() { + if (linked && isOpen() != visibleCheckbox.checked) { + labelWrap.click(); + } + + gradioCheckbox.checked = visibleCheckbox.checked; + updateInput(gradioCheckbox); + }; + + visibleCheckbox.addEventListener('click', function(event) { + linked = false; + event.stopPropagation(); + }); + visibleCheckbox.addEventListener('input', accordion.onVisibleCheckboxChange); +} + +onUiLoaded(function() { + for (var accordion of gradioApp().querySelectorAll('.input-accordion')) { + setupAccordion(accordion); + } +}); diff --git a/stable-diffusion-webui/javascript/localStorage.js b/stable-diffusion-webui/javascript/localStorage.js new file mode 100644 index 0000000000000000000000000000000000000000..dc1a36c328799ea3df1843001d397aa638935952 --- /dev/null +++ b/stable-diffusion-webui/javascript/localStorage.js @@ -0,0 +1,26 @@ + +function localSet(k, v) { + try { + localStorage.setItem(k, v); + } catch (e) { + console.warn(`Failed to save ${k} to localStorage: ${e}`); + } +} + +function localGet(k, def) { + try { + return localStorage.getItem(k); + } catch (e) { + console.warn(`Failed to load ${k} from localStorage: ${e}`); + } + + return def; +} + +function localRemove(k) { + try { + return localStorage.removeItem(k); + } catch (e) { + console.warn(`Failed to remove ${k} from localStorage: ${e}`); + } +} diff --git a/stable-diffusion-webui/javascript/localization.js b/stable-diffusion-webui/javascript/localization.js new file mode 100644 index 0000000000000000000000000000000000000000..8f00c18686057e3e12154f657170b014b13320a5 --- /dev/null +++ b/stable-diffusion-webui/javascript/localization.js @@ -0,0 +1,205 @@ + +// localization = {} -- the dict with translations is created by the backend + +var ignore_ids_for_localization = { + setting_sd_hypernetwork: 'OPTION', + setting_sd_model_checkpoint: 'OPTION', + modelmerger_primary_model_name: 'OPTION', + modelmerger_secondary_model_name: 'OPTION', + modelmerger_tertiary_model_name: 'OPTION', + train_embedding: 'OPTION', + train_hypernetwork: 'OPTION', + txt2img_styles: 'OPTION', + img2img_styles: 'OPTION', + setting_random_artist_categories: 'OPTION', + setting_face_restoration_model: 'OPTION', + setting_realesrgan_enabled_models: 'OPTION', + extras_upscaler_1: 'OPTION', + extras_upscaler_2: 'OPTION', +}; + +var re_num = /^[.\d]+$/; +var re_emoji = /[\p{Extended_Pictographic}\u{1F3FB}-\u{1F3FF}\u{1F9B0}-\u{1F9B3}]/u; + +var original_lines = {}; +var translated_lines = {}; + +function hasLocalization() { + return window.localization && Object.keys(window.localization).length > 0; +} + +function textNodesUnder(el) { + var n, a = [], walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false); + while ((n = walk.nextNode())) a.push(n); + return a; +} + +function canBeTranslated(node, text) { + if (!text) return false; + if (!node.parentElement) return false; + + var parentType = node.parentElement.nodeName; + if (parentType == 'SCRIPT' || parentType == 'STYLE' || parentType == 'TEXTAREA') return false; + + if (parentType == 'OPTION' || parentType == 'SPAN') { + var pnode = node; + for (var level = 0; level < 4; level++) { + pnode = pnode.parentElement; + if (!pnode) break; + + if (ignore_ids_for_localization[pnode.id] == parentType) return false; + } + } + + if (re_num.test(text)) return false; + if (re_emoji.test(text)) return false; + return true; +} + +function getTranslation(text) { + if (!text) return undefined; + + if (translated_lines[text] === undefined) { + original_lines[text] = 1; + } + + var tl = localization[text]; + if (tl !== undefined) { + translated_lines[tl] = 1; + } + + return tl; +} + +function processTextNode(node) { + var text = node.textContent.trim(); + + if (!canBeTranslated(node, text)) return; + + var tl = getTranslation(text); + if (tl !== undefined) { + node.textContent = tl; + } +} + +function processNode(node) { + if (node.nodeType == 3) { + processTextNode(node); + return; + } + + if (node.title) { + let tl = getTranslation(node.title); + if (tl !== undefined) { + node.title = tl; + } + } + + if (node.placeholder) { + let tl = getTranslation(node.placeholder); + if (tl !== undefined) { + node.placeholder = tl; + } + } + + textNodesUnder(node).forEach(function(node) { + processTextNode(node); + }); +} + +function localizeWholePage() { + processNode(gradioApp()); + + function elem(comp) { + var elem_id = comp.props.elem_id ? comp.props.elem_id : "component-" + comp.id; + return gradioApp().getElementById(elem_id); + } + + for (var comp of window.gradio_config.components) { + if (comp.props.webui_tooltip) { + let e = elem(comp); + + let tl = e ? getTranslation(e.title) : undefined; + if (tl !== undefined) { + e.title = tl; + } + } + if (comp.props.placeholder) { + let e = elem(comp); + let textbox = e ? e.querySelector('[placeholder]') : null; + + let tl = textbox ? getTranslation(textbox.placeholder) : undefined; + if (tl !== undefined) { + textbox.placeholder = tl; + } + } + } +} + +function dumpTranslations() { + if (!hasLocalization()) { + // If we don't have any localization, + // we will not have traversed the app to find + // original_lines, so do that now. + localizeWholePage(); + } + var dumped = {}; + if (localization.rtl) { + dumped.rtl = true; + } + + for (const text in original_lines) { + if (dumped[text] !== undefined) continue; + dumped[text] = localization[text] || text; + } + + return dumped; +} + +function download_localization() { + var text = JSON.stringify(dumpTranslations(), null, 4); + + var element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', "localization.json"); + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); +} + +document.addEventListener("DOMContentLoaded", function() { + if (!hasLocalization()) { + return; + } + + onUiUpdate(function(m) { + m.forEach(function(mutation) { + mutation.addedNodes.forEach(function(node) { + processNode(node); + }); + }); + }); + + localizeWholePage(); + + if (localization.rtl) { // if the language is from right to left, + (new MutationObserver((mutations, observer) => { // wait for the style to load + mutations.forEach(mutation => { + mutation.addedNodes.forEach(node => { + if (node.tagName === 'STYLE') { + observer.disconnect(); + + for (const x of node.sheet.rules) { // find all rtl media rules + if (Array.from(x.media || []).includes('rtl')) { + x.media.appendMedium('all'); // enable them + } + } + } + }); + }); + })).observe(gradioApp(), {childList: true}); + } +}); diff --git a/stable-diffusion-webui/javascript/notification.js b/stable-diffusion-webui/javascript/notification.js new file mode 100644 index 0000000000000000000000000000000000000000..3ee972ae1661b62066171e01af69b84b854aeef7 --- /dev/null +++ b/stable-diffusion-webui/javascript/notification.js @@ -0,0 +1,53 @@ +// Monitors the gallery and sends a browser notification when the leading image is new. + +let lastHeadImg = null; + +let notificationButton = null; + +onAfterUiUpdate(function() { + if (notificationButton == null) { + notificationButton = gradioApp().getElementById('request_notifications'); + + if (notificationButton != null) { + notificationButton.addEventListener('click', () => { + void Notification.requestPermission(); + }, true); + } + } + + const galleryPreviews = gradioApp().querySelectorAll('div[id^="tab_"] div[id$="_results"] .thumbnail-item > img'); + + if (galleryPreviews == null) return; + + const headImg = galleryPreviews[0]?.src; + + if (headImg == null || headImg == lastHeadImg) return; + + lastHeadImg = headImg; + + // play notification sound if available + const notificationAudio = gradioApp().querySelector('#audio_notification audio'); + if (notificationAudio) { + notificationAudio.volume = opts.notification_volume / 100.0 || 1.0; + notificationAudio.play(); + } + + if (document.hasFocus()) return; + + // Multiple copies of the images are in the DOM when one is selected. Dedup with a Set to get the real number generated. + const imgs = new Set(Array.from(galleryPreviews).map(img => img.src)); + + const notification = new Notification( + 'Stable Diffusion', + { + body: `Generated ${imgs.size > 1 ? imgs.size - opts.return_grid : 1} image${imgs.size > 1 ? 's' : ''}`, + icon: headImg, + image: headImg, + } + ); + + notification.onclick = function(_) { + parent.focus(); + this.close(); + }; +}); diff --git a/stable-diffusion-webui/javascript/profilerVisualization.js b/stable-diffusion-webui/javascript/profilerVisualization.js new file mode 100644 index 0000000000000000000000000000000000000000..9d8e5f42f327f93db42773ebf0b97ee1e9671806 --- /dev/null +++ b/stable-diffusion-webui/javascript/profilerVisualization.js @@ -0,0 +1,153 @@ + +function createRow(table, cellName, items) { + var tr = document.createElement('tr'); + var res = []; + + items.forEach(function(x, i) { + if (x === undefined) { + res.push(null); + return; + } + + var td = document.createElement(cellName); + td.textContent = x; + tr.appendChild(td); + res.push(td); + + var colspan = 1; + for (var n = i + 1; n < items.length; n++) { + if (items[n] !== undefined) { + break; + } + + colspan += 1; + } + + if (colspan > 1) { + td.colSpan = colspan; + } + }); + + table.appendChild(tr); + + return res; +} + +function showProfile(path, cutoff = 0.05) { + requestGet(path, {}, function(data) { + var table = document.createElement('table'); + table.className = 'popup-table'; + + data.records['total'] = data.total; + var keys = Object.keys(data.records).sort(function(a, b) { + return data.records[b] - data.records[a]; + }); + var items = keys.map(function(x) { + return {key: x, parts: x.split('/'), time: data.records[x]}; + }); + var maxLength = items.reduce(function(a, b) { + return Math.max(a, b.parts.length); + }, 0); + + var cols = createRow(table, 'th', ['record', 'seconds']); + cols[0].colSpan = maxLength; + + function arraysEqual(a, b) { + return !(a < b || b < a); + } + + var addLevel = function(level, parent, hide) { + var matching = items.filter(function(x) { + return x.parts[level] && !x.parts[level + 1] && arraysEqual(x.parts.slice(0, level), parent); + }); + var sorted = matching.sort(function(a, b) { + return b.time - a.time; + }); + var othersTime = 0; + var othersList = []; + var othersRows = []; + var childrenRows = []; + sorted.forEach(function(x) { + var visible = x.time >= cutoff && !hide; + + var cells = []; + for (var i = 0; i < maxLength; i++) { + cells.push(x.parts[i]); + } + cells.push(x.time.toFixed(3)); + var cols = createRow(table, 'td', cells); + for (i = 0; i < level; i++) { + cols[i].className = 'muted'; + } + + var tr = cols[0].parentNode; + if (!visible) { + tr.classList.add("hidden"); + } + + if (x.time >= cutoff) { + childrenRows.push(tr); + } else { + othersTime += x.time; + othersList.push(x.parts[level]); + othersRows.push(tr); + } + + var children = addLevel(level + 1, parent.concat([x.parts[level]]), true); + if (children.length > 0) { + var cell = cols[level]; + var onclick = function() { + cell.classList.remove("link"); + cell.removeEventListener("click", onclick); + children.forEach(function(x) { + x.classList.remove("hidden"); + }); + }; + cell.classList.add("link"); + cell.addEventListener("click", onclick); + } + }); + + if (othersTime > 0) { + var cells = []; + for (var i = 0; i < maxLength; i++) { + cells.push(parent[i]); + } + cells.push(othersTime.toFixed(3)); + cells[level] = 'others'; + var cols = createRow(table, 'td', cells); + for (i = 0; i < level; i++) { + cols[i].className = 'muted'; + } + + var cell = cols[level]; + var tr = cell.parentNode; + var onclick = function() { + tr.classList.add("hidden"); + cell.classList.remove("link"); + cell.removeEventListener("click", onclick); + othersRows.forEach(function(x) { + x.classList.remove("hidden"); + }); + }; + + cell.title = othersList.join(", "); + cell.classList.add("link"); + cell.addEventListener("click", onclick); + + if (hide) { + tr.classList.add("hidden"); + } + + childrenRows.push(tr); + } + + return childrenRows; + }; + + addLevel(0, []); + + popup(table); + }); +} + diff --git a/stable-diffusion-webui/javascript/progressbar.js b/stable-diffusion-webui/javascript/progressbar.js new file mode 100644 index 0000000000000000000000000000000000000000..777614954b2d489df32813fb27911dd9bbcd9c9a --- /dev/null +++ b/stable-diffusion-webui/javascript/progressbar.js @@ -0,0 +1,186 @@ +// code related to showing and updating progressbar shown as the image is being made + +function rememberGallerySelection() { + +} + +function getGallerySelectedIndex() { + +} + +function request(url, data, handler, errorHandler) { + var xhr = new XMLHttpRequest(); + xhr.open("POST", url, true); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + try { + var js = JSON.parse(xhr.responseText); + handler(js); + } catch (error) { + console.error(error); + errorHandler(); + } + } else { + errorHandler(); + } + } + }; + var js = JSON.stringify(data); + xhr.send(js); +} + +function pad2(x) { + return x < 10 ? '0' + x : x; +} + +function formatTime(secs) { + if (secs > 3600) { + return pad2(Math.floor(secs / 60 / 60)) + ":" + pad2(Math.floor(secs / 60) % 60) + ":" + pad2(Math.floor(secs) % 60); + } else if (secs > 60) { + return pad2(Math.floor(secs / 60)) + ":" + pad2(Math.floor(secs) % 60); + } else { + return Math.floor(secs) + "s"; + } +} + +function setTitle(progress) { + var title = 'Stable Diffusion'; + + if (opts.show_progress_in_title && progress) { + title = '[' + progress.trim() + '] ' + title; + } + + if (document.title != title) { + document.title = title; + } +} + + +function randomId() { + return "task(" + Math.random().toString(36).slice(2, 7) + Math.random().toString(36).slice(2, 7) + Math.random().toString(36).slice(2, 7) + ")"; +} + +// starts sending progress requests to "/internal/progress" uri, creating progressbar above progressbarContainer element and +// preview inside gallery element. Cleans up all created stuff when the task is over and calls atEnd. +// calls onProgress every time there is a progress update +function requestProgress(id_task, progressbarContainer, gallery, atEnd, onProgress, inactivityTimeout = 40) { + var dateStart = new Date(); + var wasEverActive = false; + var parentProgressbar = progressbarContainer.parentNode; + + var divProgress = document.createElement('div'); + divProgress.className = 'progressDiv'; + divProgress.style.display = opts.show_progressbar ? "block" : "none"; + var divInner = document.createElement('div'); + divInner.className = 'progress'; + + divProgress.appendChild(divInner); + parentProgressbar.insertBefore(divProgress, progressbarContainer); + + var livePreview = null; + + var removeProgressBar = function() { + if (!divProgress) return; + + setTitle(""); + parentProgressbar.removeChild(divProgress); + if (gallery && livePreview) gallery.removeChild(livePreview); + atEnd(); + + divProgress = null; + }; + + var funProgress = function(id_task) { + request("./internal/progress", {id_task: id_task, live_preview: false}, function(res) { + if (res.completed) { + removeProgressBar(); + return; + } + + let progressText = ""; + + divInner.style.width = ((res.progress || 0) * 100.0) + '%'; + divInner.style.background = res.progress ? "" : "transparent"; + + if (res.progress > 0) { + progressText = ((res.progress || 0) * 100.0).toFixed(0) + '%'; + } + + if (res.eta) { + progressText += " ETA: " + formatTime(res.eta); + } + + setTitle(progressText); + + if (res.textinfo && res.textinfo.indexOf("\n") == -1) { + progressText = res.textinfo + " " + progressText; + } + + divInner.textContent = progressText; + + var elapsedFromStart = (new Date() - dateStart) / 1000; + + if (res.active) wasEverActive = true; + + if (!res.active && wasEverActive) { + removeProgressBar(); + return; + } + + if (elapsedFromStart > inactivityTimeout && !res.queued && !res.active) { + removeProgressBar(); + return; + } + + if (onProgress) { + onProgress(res); + } + + setTimeout(() => { + funProgress(id_task, res.id_live_preview); + }, opts.live_preview_refresh_period || 500); + }, function() { + removeProgressBar(); + }); + }; + + var funLivePreview = function(id_task, id_live_preview) { + request("./internal/progress", {id_task: id_task, id_live_preview: id_live_preview}, function(res) { + if (!divProgress) { + return; + } + + if (res.live_preview && gallery) { + var img = new Image(); + img.onload = function() { + if (!livePreview) { + livePreview = document.createElement('div'); + livePreview.className = 'livePreview'; + gallery.insertBefore(livePreview, gallery.firstElementChild); + } + + livePreview.appendChild(img); + if (livePreview.childElementCount > 2) { + livePreview.removeChild(livePreview.firstElementChild); + } + }; + img.src = res.live_preview; + } + + setTimeout(() => { + funLivePreview(id_task, res.id_live_preview); + }, opts.live_preview_refresh_period || 500); + }, function() { + removeProgressBar(); + }); + }; + + funProgress(id_task, 0); + + if (gallery) { + funLivePreview(id_task, 0); + } + +} diff --git a/stable-diffusion-webui/javascript/resizeHandle.js b/stable-diffusion-webui/javascript/resizeHandle.js new file mode 100644 index 0000000000000000000000000000000000000000..8c5c5169210603ea229b96b746f9eb16ee4bfe56 --- /dev/null +++ b/stable-diffusion-webui/javascript/resizeHandle.js @@ -0,0 +1,141 @@ +(function() { + const GRADIO_MIN_WIDTH = 320; + const GRID_TEMPLATE_COLUMNS = '1fr 16px 1fr'; + const PAD = 16; + const DEBOUNCE_TIME = 100; + + const R = { + tracking: false, + parent: null, + parentWidth: null, + leftCol: null, + leftColStartWidth: null, + screenX: null, + }; + + let resizeTimer; + let parents = []; + + function setLeftColGridTemplate(el, width) { + el.style.gridTemplateColumns = `${width}px 16px 1fr`; + } + + function displayResizeHandle(parent) { + if (window.innerWidth < GRADIO_MIN_WIDTH * 2 + PAD * 4) { + parent.style.display = 'flex'; + if (R.handle != null) { + R.handle.style.opacity = '0'; + } + return false; + } else { + parent.style.display = 'grid'; + if (R.handle != null) { + R.handle.style.opacity = '100'; + } + return true; + } + } + + function afterResize(parent) { + if (displayResizeHandle(parent) && parent.style.gridTemplateColumns != GRID_TEMPLATE_COLUMNS) { + const oldParentWidth = R.parentWidth; + const newParentWidth = parent.offsetWidth; + const widthL = parseInt(parent.style.gridTemplateColumns.split(' ')[0]); + + const ratio = newParentWidth / oldParentWidth; + + const newWidthL = Math.max(Math.floor(ratio * widthL), GRADIO_MIN_WIDTH); + setLeftColGridTemplate(parent, newWidthL); + + R.parentWidth = newParentWidth; + } + } + + function setup(parent) { + const leftCol = parent.firstElementChild; + const rightCol = parent.lastElementChild; + + parents.push(parent); + + parent.style.display = 'grid'; + parent.style.gap = '0'; + parent.style.gridTemplateColumns = GRID_TEMPLATE_COLUMNS; + + const resizeHandle = document.createElement('div'); + resizeHandle.classList.add('resize-handle'); + parent.insertBefore(resizeHandle, rightCol); + + resizeHandle.addEventListener('mousedown', (evt) => { + if (evt.button !== 0) return; + + evt.preventDefault(); + evt.stopPropagation(); + + document.body.classList.add('resizing'); + + R.tracking = true; + R.parent = parent; + R.parentWidth = parent.offsetWidth; + R.handle = resizeHandle; + R.leftCol = leftCol; + R.leftColStartWidth = leftCol.offsetWidth; + R.screenX = evt.screenX; + }); + + resizeHandle.addEventListener('dblclick', (evt) => { + evt.preventDefault(); + evt.stopPropagation(); + + parent.style.gridTemplateColumns = GRID_TEMPLATE_COLUMNS; + }); + + afterResize(parent); + } + + window.addEventListener('mousemove', (evt) => { + if (evt.button !== 0) return; + + if (R.tracking) { + evt.preventDefault(); + evt.stopPropagation(); + + const delta = R.screenX - evt.screenX; + const leftColWidth = Math.max(Math.min(R.leftColStartWidth - delta, R.parent.offsetWidth - GRADIO_MIN_WIDTH - PAD), GRADIO_MIN_WIDTH); + setLeftColGridTemplate(R.parent, leftColWidth); + } + }); + + window.addEventListener('mouseup', (evt) => { + if (evt.button !== 0) return; + + if (R.tracking) { + evt.preventDefault(); + evt.stopPropagation(); + + R.tracking = false; + + document.body.classList.remove('resizing'); + } + }); + + + window.addEventListener('resize', () => { + clearTimeout(resizeTimer); + + resizeTimer = setTimeout(function() { + for (const parent of parents) { + afterResize(parent); + } + }, DEBOUNCE_TIME); + }); + + setupResizeHandle = setup; +})(); + +onUiLoaded(function() { + for (var elem of gradioApp().querySelectorAll('.resize-handle-row')) { + if (!elem.querySelector('.resize-handle')) { + setupResizeHandle(elem); + } + } +}); diff --git a/stable-diffusion-webui/javascript/settings.js b/stable-diffusion-webui/javascript/settings.js new file mode 100644 index 0000000000000000000000000000000000000000..e6009290ab37472e49cc74c7fe37c714fa5f40db --- /dev/null +++ b/stable-diffusion-webui/javascript/settings.js @@ -0,0 +1,71 @@ +let settingsExcludeTabsFromShowAll = { + settings_tab_defaults: 1, + settings_tab_sysinfo: 1, + settings_tab_actions: 1, + settings_tab_licenses: 1, +}; + +function settingsShowAllTabs() { + gradioApp().querySelectorAll('#settings > div').forEach(function(elem) { + if (settingsExcludeTabsFromShowAll[elem.id]) return; + + elem.style.display = "block"; + }); +} + +function settingsShowOneTab() { + gradioApp().querySelector('#settings_show_one_page').click(); +} + +onUiLoaded(function() { + var edit = gradioApp().querySelector('#settings_search'); + var editTextarea = gradioApp().querySelector('#settings_search > label > input'); + var buttonShowAllPages = gradioApp().getElementById('settings_show_all_pages'); + var settings_tabs = gradioApp().querySelector('#settings div'); + + onEdit('settingsSearch', editTextarea, 250, function() { + var searchText = (editTextarea.value || "").trim().toLowerCase(); + + gradioApp().querySelectorAll('#settings > div[id^=settings_] div[id^=column_settings_] > *').forEach(function(elem) { + var visible = elem.textContent.trim().toLowerCase().indexOf(searchText) != -1; + elem.style.display = visible ? "" : "none"; + }); + + if (searchText != "") { + settingsShowAllTabs(); + } else { + settingsShowOneTab(); + } + }); + + settings_tabs.insertBefore(edit, settings_tabs.firstChild); + settings_tabs.appendChild(buttonShowAllPages); + + + buttonShowAllPages.addEventListener("click", settingsShowAllTabs); +}); + + +onOptionsChanged(function() { + if (gradioApp().querySelector('#settings .settings-category')) return; + + var sectionMap = {}; + gradioApp().querySelectorAll('#settings > div > button').forEach(function(x) { + sectionMap[x.textContent.trim()] = x; + }); + + opts._categories.forEach(function(x) { + var section = x[0]; + var category = x[1]; + + var span = document.createElement('SPAN'); + span.textContent = category; + span.className = 'settings-category'; + + var sectionElem = sectionMap[section]; + if (!sectionElem) return; + + sectionElem.parentElement.insertBefore(span, sectionElem); + }); +}); + diff --git a/stable-diffusion-webui/javascript/textualInversion.js b/stable-diffusion-webui/javascript/textualInversion.js new file mode 100644 index 0000000000000000000000000000000000000000..20443fcca01bbba6712e40136c57dbcdb78ca945 --- /dev/null +++ b/stable-diffusion-webui/javascript/textualInversion.js @@ -0,0 +1,17 @@ + + + +function start_training_textual_inversion() { + gradioApp().querySelector('#ti_error').innerHTML = ''; + + var id = randomId(); + requestProgress(id, gradioApp().getElementById('ti_output'), gradioApp().getElementById('ti_gallery'), function() {}, function(progress) { + gradioApp().getElementById('ti_progress').innerHTML = progress.textinfo; + }); + + var res = Array.from(arguments); + + res[0] = id; + + return res; +} diff --git a/stable-diffusion-webui/javascript/token-counters.js b/stable-diffusion-webui/javascript/token-counters.js new file mode 100644 index 0000000000000000000000000000000000000000..2ecc7d91010eb7977aae064da97c239414404f49 --- /dev/null +++ b/stable-diffusion-webui/javascript/token-counters.js @@ -0,0 +1,75 @@ +let promptTokenCountUpdateFunctions = {}; + +function update_txt2img_tokens(...args) { + // Called from Gradio + update_token_counter("txt2img_token_button"); + update_token_counter("txt2img_negative_token_button"); + if (args.length == 2) { + return args[0]; + } + return args; +} + +function update_img2img_tokens(...args) { + // Called from Gradio + update_token_counter("img2img_token_button"); + update_token_counter("img2img_negative_token_button"); + if (args.length == 2) { + return args[0]; + } + return args; +} + +function update_token_counter(button_id) { + promptTokenCountUpdateFunctions[button_id]?.(); +} + + +function recalculatePromptTokens(name) { + promptTokenCountUpdateFunctions[name]?.(); +} + +function recalculate_prompts_txt2img() { + // Called from Gradio + recalculatePromptTokens('txt2img_prompt'); + recalculatePromptTokens('txt2img_neg_prompt'); + return Array.from(arguments); +} + +function recalculate_prompts_img2img() { + // Called from Gradio + recalculatePromptTokens('img2img_prompt'); + recalculatePromptTokens('img2img_neg_prompt'); + return Array.from(arguments); +} + +function setupTokenCounting(id, id_counter, id_button) { + var prompt = gradioApp().getElementById(id); + var counter = gradioApp().getElementById(id_counter); + var textarea = gradioApp().querySelector(`#${id} > label > textarea`); + + if (opts.disable_token_counters) { + counter.style.display = "none"; + return; + } + + if (counter.parentElement == prompt.parentElement) { + return; + } + + prompt.parentElement.insertBefore(counter, prompt); + prompt.parentElement.style.position = "relative"; + + var func = onEdit(id, textarea, 800, function() { + gradioApp().getElementById(id_button)?.click(); + }); + promptTokenCountUpdateFunctions[id] = func; + promptTokenCountUpdateFunctions[id_button] = func; +} + +function setupTokenCounters() { + setupTokenCounting('txt2img_prompt', 'txt2img_token_counter', 'txt2img_token_button'); + setupTokenCounting('txt2img_neg_prompt', 'txt2img_negative_token_counter', 'txt2img_negative_token_button'); + setupTokenCounting('img2img_prompt', 'img2img_token_counter', 'img2img_token_button'); + setupTokenCounting('img2img_neg_prompt', 'img2img_negative_token_counter', 'img2img_negative_token_button'); +} diff --git a/stable-diffusion-webui/javascript/ui.js b/stable-diffusion-webui/javascript/ui.js new file mode 100644 index 0000000000000000000000000000000000000000..18c9f891afc1746f8a919ea6989cea099f7e62a6 --- /dev/null +++ b/stable-diffusion-webui/javascript/ui.js @@ -0,0 +1,411 @@ +// various functions for interaction with ui.py not large enough to warrant putting them in separate files + +function set_theme(theme) { + var gradioURL = window.location.href; + if (!gradioURL.includes('?__theme=')) { + window.location.replace(gradioURL + '?__theme=' + theme); + } +} + +function all_gallery_buttons() { + var allGalleryButtons = gradioApp().querySelectorAll('[style="display: block;"].tabitem div[id$=_gallery].gradio-gallery .thumbnails > .thumbnail-item.thumbnail-small'); + var visibleGalleryButtons = []; + allGalleryButtons.forEach(function(elem) { + if (elem.parentElement.offsetParent) { + visibleGalleryButtons.push(elem); + } + }); + return visibleGalleryButtons; +} + +function selected_gallery_button() { + return all_gallery_buttons().find(elem => elem.classList.contains('selected')) ?? null; +} + +function selected_gallery_index() { + return all_gallery_buttons().findIndex(elem => elem.classList.contains('selected')); +} + +function extract_image_from_gallery(gallery) { + if (gallery.length == 0) { + return [null]; + } + if (gallery.length == 1) { + return [gallery[0]]; + } + + var index = selected_gallery_index(); + + if (index < 0 || index >= gallery.length) { + // Use the first image in the gallery as the default + index = 0; + } + + return [gallery[index]]; +} + +window.args_to_array = Array.from; // Compatibility with e.g. extensions that may expect this to be around + +function switch_to_txt2img() { + gradioApp().querySelector('#tabs').querySelectorAll('button')[0].click(); + + return Array.from(arguments); +} + +function switch_to_img2img_tab(no) { + gradioApp().querySelector('#tabs').querySelectorAll('button')[1].click(); + gradioApp().getElementById('mode_img2img').querySelectorAll('button')[no].click(); +} +function switch_to_img2img() { + switch_to_img2img_tab(0); + return Array.from(arguments); +} + +function switch_to_sketch() { + switch_to_img2img_tab(1); + return Array.from(arguments); +} + +function switch_to_inpaint() { + switch_to_img2img_tab(2); + return Array.from(arguments); +} + +function switch_to_inpaint_sketch() { + switch_to_img2img_tab(3); + return Array.from(arguments); +} + +function switch_to_extras() { + gradioApp().querySelector('#tabs').querySelectorAll('button')[2].click(); + + return Array.from(arguments); +} + +function get_tab_index(tabId) { + let buttons = gradioApp().getElementById(tabId).querySelector('div').querySelectorAll('button'); + for (let i = 0; i < buttons.length; i++) { + if (buttons[i].classList.contains('selected')) { + return i; + } + } + return 0; +} + +function create_tab_index_args(tabId, args) { + var res = Array.from(args); + res[0] = get_tab_index(tabId); + return res; +} + +function get_img2img_tab_index() { + let res = Array.from(arguments); + res.splice(-2); + res[0] = get_tab_index('mode_img2img'); + return res; +} + +function create_submit_args(args) { + var res = Array.from(args); + + // As it is currently, txt2img and img2img send back the previous output args (txt2img_gallery, generation_info, html_info) whenever you generate a new image. + // This can lead to uploading a huge gallery of previously generated images, which leads to an unnecessary delay between submitting and beginning to generate. + // I don't know why gradio is sending outputs along with inputs, but we can prevent sending the image gallery here, which seems to be an issue for some. + // If gradio at some point stops sending outputs, this may break something + if (Array.isArray(res[res.length - 3])) { + res[res.length - 3] = null; + } + + return res; +} + +function showSubmitButtons(tabname, show) { + gradioApp().getElementById(tabname + '_interrupt').style.display = show ? "none" : "block"; + gradioApp().getElementById(tabname + '_skip').style.display = show ? "none" : "block"; +} + +function showRestoreProgressButton(tabname, show) { + var button = gradioApp().getElementById(tabname + "_restore_progress"); + if (!button) return; + + button.style.display = show ? "flex" : "none"; +} + +function submit() { + showSubmitButtons('txt2img', false); + + var id = randomId(); + localSet("txt2img_task_id", id); + + requestProgress(id, gradioApp().getElementById('txt2img_gallery_container'), gradioApp().getElementById('txt2img_gallery'), function() { + showSubmitButtons('txt2img', true); + localRemove("txt2img_task_id"); + showRestoreProgressButton('txt2img', false); + }); + + var res = create_submit_args(arguments); + + res[0] = id; + + return res; +} + +function submit_img2img() { + showSubmitButtons('img2img', false); + + var id = randomId(); + localSet("img2img_task_id", id); + + requestProgress(id, gradioApp().getElementById('img2img_gallery_container'), gradioApp().getElementById('img2img_gallery'), function() { + showSubmitButtons('img2img', true); + localRemove("img2img_task_id"); + showRestoreProgressButton('img2img', false); + }); + + var res = create_submit_args(arguments); + + res[0] = id; + res[1] = get_tab_index('mode_img2img'); + + return res; +} + +function submit_extras() { + showSubmitButtons('extras', false); + + var id = randomId(); + + requestProgress(id, gradioApp().getElementById('extras_gallery_container'), gradioApp().getElementById('extras_gallery'), function() { + showSubmitButtons('extras', true); + }); + + var res = create_submit_args(arguments); + + res[0] = id; + + console.log(res); + return res; +} + +function restoreProgressTxt2img() { + showRestoreProgressButton("txt2img", false); + var id = localGet("txt2img_task_id"); + + if (id) { + requestProgress(id, gradioApp().getElementById('txt2img_gallery_container'), gradioApp().getElementById('txt2img_gallery'), function() { + showSubmitButtons('txt2img', true); + }, null, 0); + } + + return id; +} + +function restoreProgressImg2img() { + showRestoreProgressButton("img2img", false); + + var id = localGet("img2img_task_id"); + + if (id) { + requestProgress(id, gradioApp().getElementById('img2img_gallery_container'), gradioApp().getElementById('img2img_gallery'), function() { + showSubmitButtons('img2img', true); + }, null, 0); + } + + return id; +} + + +/** + * Configure the width and height elements on `tabname` to accept + * pasting of resolutions in the form of "width x height". + */ +function setupResolutionPasting(tabname) { + var width = gradioApp().querySelector(`#${tabname}_width input[type=number]`); + var height = gradioApp().querySelector(`#${tabname}_height input[type=number]`); + for (const el of [width, height]) { + el.addEventListener('paste', function(event) { + var pasteData = event.clipboardData.getData('text/plain'); + var parsed = pasteData.match(/^\s*(\d+)\D+(\d+)\s*$/); + if (parsed) { + width.value = parsed[1]; + height.value = parsed[2]; + updateInput(width); + updateInput(height); + event.preventDefault(); + } + }); + } +} + +onUiLoaded(function() { + showRestoreProgressButton('txt2img', localGet("txt2img_task_id")); + showRestoreProgressButton('img2img', localGet("img2img_task_id")); + setupResolutionPasting('txt2img'); + setupResolutionPasting('img2img'); +}); + + +function modelmerger() { + var id = randomId(); + requestProgress(id, gradioApp().getElementById('modelmerger_results_panel'), null, function() {}); + + var res = create_submit_args(arguments); + res[0] = id; + return res; +} + + +function ask_for_style_name(_, prompt_text, negative_prompt_text) { + var name_ = prompt('Style name:'); + return [name_, prompt_text, negative_prompt_text]; +} + +function confirm_clear_prompt(prompt, negative_prompt) { + if (confirm("Delete prompt?")) { + prompt = ""; + negative_prompt = ""; + } + + return [prompt, negative_prompt]; +} + + +var opts = {}; +onAfterUiUpdate(function() { + if (Object.keys(opts).length != 0) return; + + var json_elem = gradioApp().getElementById('settings_json'); + if (json_elem == null) return; + + var textarea = json_elem.querySelector('textarea'); + var jsdata = textarea.value; + opts = JSON.parse(jsdata); + + executeCallbacks(optionsChangedCallbacks); /*global optionsChangedCallbacks*/ + + Object.defineProperty(textarea, 'value', { + set: function(newValue) { + var valueProp = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value'); + var oldValue = valueProp.get.call(textarea); + valueProp.set.call(textarea, newValue); + + if (oldValue != newValue) { + opts = JSON.parse(textarea.value); + } + + executeCallbacks(optionsChangedCallbacks); + }, + get: function() { + var valueProp = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value'); + return valueProp.get.call(textarea); + } + }); + + json_elem.parentElement.style.display = "none"; + + setupTokenCounters(); +}); + +onOptionsChanged(function() { + var elem = gradioApp().getElementById('sd_checkpoint_hash'); + var sd_checkpoint_hash = opts.sd_checkpoint_hash || ""; + var shorthash = sd_checkpoint_hash.substring(0, 10); + + if (elem && elem.textContent != shorthash) { + elem.textContent = shorthash; + elem.title = sd_checkpoint_hash; + elem.href = "https://google.com/search?q=" + sd_checkpoint_hash; + } +}); + +let txt2img_textarea, img2img_textarea = undefined; + +function restart_reload() { + document.body.innerHTML = '

Reloading...

'; + + var requestPing = function() { + requestGet("./internal/ping", {}, function(data) { + location.reload(); + }, function() { + setTimeout(requestPing, 500); + }); + }; + + setTimeout(requestPing, 2000); + + return []; +} + +// Simulate an `input` DOM event for Gradio Textbox component. Needed after you edit its contents in javascript, otherwise your edits +// will only visible on web page and not sent to python. +function updateInput(target) { + let e = new Event("input", {bubbles: true}); + Object.defineProperty(e, "target", {value: target}); + target.dispatchEvent(e); +} + + +var desiredCheckpointName = null; +function selectCheckpoint(name) { + desiredCheckpointName = name; + gradioApp().getElementById('change_checkpoint').click(); +} + +function currentImg2imgSourceResolution(w, h, scaleBy) { + var img = gradioApp().querySelector('#mode_img2img > div[style="display: block;"] img'); + return img ? [img.naturalWidth, img.naturalHeight, scaleBy] : [0, 0, scaleBy]; +} + +function updateImg2imgResizeToTextAfterChangingImage() { + // At the time this is called from gradio, the image has no yet been replaced. + // There may be a better solution, but this is simple and straightforward so I'm going with it. + + setTimeout(function() { + gradioApp().getElementById('img2img_update_resize_to').click(); + }, 500); + + return []; + +} + + + +function setRandomSeed(elem_id) { + var input = gradioApp().querySelector("#" + elem_id + " input"); + if (!input) return []; + + input.value = "-1"; + updateInput(input); + return []; +} + +function switchWidthHeight(tabname) { + var width = gradioApp().querySelector("#" + tabname + "_width input[type=number]"); + var height = gradioApp().querySelector("#" + tabname + "_height input[type=number]"); + if (!width || !height) return []; + + var tmp = width.value; + width.value = height.value; + height.value = tmp; + + updateInput(width); + updateInput(height); + return []; +} + + +var onEditTimers = {}; + +// calls func after afterMs milliseconds has passed since the input elem has beed enited by user +function onEdit(editId, elem, afterMs, func) { + var edited = function() { + var existingTimer = onEditTimers[editId]; + if (existingTimer) clearTimeout(existingTimer); + + onEditTimers[editId] = setTimeout(func, afterMs); + }; + + elem.addEventListener("input", edited); + + return edited; +} diff --git a/stable-diffusion-webui/javascript/ui_settings_hints.js b/stable-diffusion-webui/javascript/ui_settings_hints.js new file mode 100644 index 0000000000000000000000000000000000000000..d088f9494f826d9534dc105ac2f99bda702d22c0 --- /dev/null +++ b/stable-diffusion-webui/javascript/ui_settings_hints.js @@ -0,0 +1,62 @@ +// various hints and extra info for the settings tab + +var settingsHintsSetup = false; + +onOptionsChanged(function() { + if (settingsHintsSetup) return; + settingsHintsSetup = true; + + gradioApp().querySelectorAll('#settings [id^=setting_]').forEach(function(div) { + var name = div.id.substr(8); + var commentBefore = opts._comments_before[name]; + var commentAfter = opts._comments_after[name]; + + if (!commentBefore && !commentAfter) return; + + var span = null; + if (div.classList.contains('gradio-checkbox')) span = div.querySelector('label span'); + else if (div.classList.contains('gradio-checkboxgroup')) span = div.querySelector('span').firstChild; + else if (div.classList.contains('gradio-radio')) span = div.querySelector('span').firstChild; + else span = div.querySelector('label span').firstChild; + + if (!span) return; + + if (commentBefore) { + var comment = document.createElement('DIV'); + comment.className = 'settings-comment'; + comment.innerHTML = commentBefore; + span.parentElement.insertBefore(document.createTextNode('\xa0'), span); + span.parentElement.insertBefore(comment, span); + span.parentElement.insertBefore(document.createTextNode('\xa0'), span); + } + if (commentAfter) { + comment = document.createElement('DIV'); + comment.className = 'settings-comment'; + comment.innerHTML = commentAfter; + span.parentElement.insertBefore(comment, span.nextSibling); + span.parentElement.insertBefore(document.createTextNode('\xa0'), span.nextSibling); + } + }); +}); + +function settingsHintsShowQuicksettings() { + requestGet("./internal/quicksettings-hint", {}, function(data) { + var table = document.createElement('table'); + table.className = 'popup-table'; + + data.forEach(function(obj) { + var tr = document.createElement('tr'); + var td = document.createElement('td'); + td.textContent = obj.name; + tr.appendChild(td); + + td = document.createElement('td'); + td.textContent = obj.label; + tr.appendChild(td); + + table.appendChild(tr); + }); + + popup(table); + }); +} diff --git a/stable-diffusion-webui/launch.py b/stable-diffusion-webui/launch.py new file mode 100644 index 0000000000000000000000000000000000000000..cafab78060f727848ac47bd041b1c51d69875c33 --- /dev/null +++ b/stable-diffusion-webui/launch.py @@ -0,0 +1,48 @@ +from modules import launch_utils + +args = launch_utils.args +python = launch_utils.python +git = launch_utils.git +index_url = launch_utils.index_url +dir_repos = launch_utils.dir_repos + +commit_hash = launch_utils.commit_hash +git_tag = launch_utils.git_tag + +run = launch_utils.run +is_installed = launch_utils.is_installed +repo_dir = launch_utils.repo_dir + +run_pip = launch_utils.run_pip +check_run_python = launch_utils.check_run_python +git_clone = launch_utils.git_clone +git_pull_recursive = launch_utils.git_pull_recursive +list_extensions = launch_utils.list_extensions +run_extension_installer = launch_utils.run_extension_installer +prepare_environment = launch_utils.prepare_environment +configure_for_tests = launch_utils.configure_for_tests +start = launch_utils.start + + +def main(): + if args.dump_sysinfo: + filename = launch_utils.dump_sysinfo() + + print(f"Sysinfo saved as {filename}. Exiting...") + + exit(0) + + launch_utils.startup_timer.record("initial startup") + + with launch_utils.startup_timer.subcategory("prepare environment"): + if not args.skip_prepare_environment: + prepare_environment() + + if args.test_server: + configure_for_tests() + + start() + + +if __name__ == "__main__": + main() diff --git a/stable-diffusion-webui/localizations/Put localization files here.txt b/stable-diffusion-webui/localizations/Put localization files here.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/models/Stable-diffusion/Put Stable Diffusion checkpoints here.txt b/stable-diffusion-webui/models/Stable-diffusion/Put Stable Diffusion checkpoints here.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/models/Stable-diffusion/Realistic_Vision_V5.1-inpainting.safetensors b/stable-diffusion-webui/models/Stable-diffusion/Realistic_Vision_V5.1-inpainting.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..c7c457da9fd0d3af44f15fd343ed48b903c2ceeb --- /dev/null +++ b/stable-diffusion-webui/models/Stable-diffusion/Realistic_Vision_V5.1-inpainting.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:befb05f117278b063dac594a3406d861c8e148a16db356a95cf0deee25c94cdc +size 4265203868 diff --git a/stable-diffusion-webui/models/VAE-approx/model.pt b/stable-diffusion-webui/models/VAE-approx/model.pt new file mode 100644 index 0000000000000000000000000000000000000000..09c6b8f7fda5e15495c6203ca323d6573745d0af --- /dev/null +++ b/stable-diffusion-webui/models/VAE-approx/model.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f88c9078bb2238cdd0d8864671dd33e3f42e091e41f08903f3c15e4a54a9b39 +size 213777 diff --git a/stable-diffusion-webui/models/VAE/Put VAE here.txt b/stable-diffusion-webui/models/VAE/Put VAE here.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/models/VAE/vae-ft-ema-560000-ema-pruned.ckpt b/stable-diffusion-webui/models/VAE/vae-ft-ema-560000-ema-pruned.ckpt new file mode 100644 index 0000000000000000000000000000000000000000..564371905c2c59bd7a412f590192d4e9693df186 --- /dev/null +++ b/stable-diffusion-webui/models/VAE/vae-ft-ema-560000-ema-pruned.ckpt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b204ad0cae549e0a7e298d803d57e36363760dec71c63109c1da3e1147ec520 +size 334695179 diff --git a/stable-diffusion-webui/models/VAE/vae-ft-mse-840000-ema-pruned.ckpt b/stable-diffusion-webui/models/VAE/vae-ft-mse-840000-ema-pruned.ckpt new file mode 100644 index 0000000000000000000000000000000000000000..7322202939e53e60602bfed9b6374b566a367737 --- /dev/null +++ b/stable-diffusion-webui/models/VAE/vae-ft-mse-840000-ema-pruned.ckpt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6a580b13a5bc05a5e16e4dbb80608ff2ec251a162311590c1f34c013d7f3dab +size 334695179 diff --git a/stable-diffusion-webui/models/deepbooru/Put your deepbooru release project folder here.txt b/stable-diffusion-webui/models/deepbooru/Put your deepbooru release project folder here.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/stable-diffusion-webui/models/insightface/inswapper_128.onnx b/stable-diffusion-webui/models/insightface/inswapper_128.onnx new file mode 100644 index 0000000000000000000000000000000000000000..cb672b799d74fdf7ab8b172a1b1d78411f6400f5 --- /dev/null +++ b/stable-diffusion-webui/models/insightface/inswapper_128.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4a3f08c753cb72d04e10aa0f7dbe3deebbf39567d4ead6dce08e98aa49e16af +size 554253681 diff --git a/stable-diffusion-webui/models/karlo/ViT-L-14_stats.th b/stable-diffusion-webui/models/karlo/ViT-L-14_stats.th new file mode 100644 index 0000000000000000000000000000000000000000..a6a06e94ecaa4f2977972ff991f75db6c90403ea Binary files /dev/null and b/stable-diffusion-webui/models/karlo/ViT-L-14_stats.th differ diff --git a/stable-diffusion-webui/modules/Roboto-Regular.ttf b/stable-diffusion-webui/modules/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..500b1045b0c94d83d2e6798aaf1faa55a2dab6fc Binary files /dev/null and b/stable-diffusion-webui/modules/Roboto-Regular.ttf differ diff --git a/stable-diffusion-webui/modules/__pycache__/cache.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/cache.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae2a2ea0815b971048fd2037dc49b820e6ea1406 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/cache.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/call_queue.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/call_queue.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f79df319fe6c9ee23d0fbaf3c903672eca2f16c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/call_queue.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/cmd_args.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/cmd_args.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d15229ceb08d5a4ea5690749bb2fa700ca78198 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/cmd_args.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/codeformer_model.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/codeformer_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5991b2db43bb399c0867ffd45a465994c4e42641 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/codeformer_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/config_states.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/config_states.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44371026d4bbe5717a77d4746f5d67041f72eee5 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/config_states.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/deepbooru.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/deepbooru.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d490a671747501cd02838dcf2e2ea15f27842a8d Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/deepbooru.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/deepbooru_model.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/deepbooru_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22b870bb2224ad36ed5f83907fcb28ef26e36729 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/deepbooru_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/devices.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/devices.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e4ce545a9755dee2f9c5d67aebacdfb35df4069 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/devices.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/errors.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5544be47ba8956163a433ec69174fd7404ec2433 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/errors.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/esrgan_model.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/esrgan_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fbc07faad2048e0563689e4b18f0d75ae179dd8 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/esrgan_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/esrgan_model_arch.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/esrgan_model_arch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb2ce4722bd1c902308a01471bba99b7b81b42e1 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/esrgan_model_arch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/extensions.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/extensions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fbda080253782ea861933ea43c418f5cbcb960c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/extensions.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/extra_networks.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/extra_networks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2366c101f8535ab5b9632dcb2bd1639532ed0e5e Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/extra_networks.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/extra_networks_hypernet.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/extra_networks_hypernet.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..532eba1738fcc1bbf5e0efb9c4d9fb4cd6535b90 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/extra_networks_hypernet.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/extras.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/extras.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb7e04e70118e2c832e3042cdd06598e3a48ce0a Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/extras.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/face_restoration.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/face_restoration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbb02e0628e9b30cfe69095538172e65b61da024 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/face_restoration.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/fifo_lock.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/fifo_lock.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32d7aaa6d063e0931075511966ebddc8bb90b787 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/fifo_lock.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/generation_parameters_copypaste.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/generation_parameters_copypaste.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a391b837ad3c5d61c8b925220999c2619471d59c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/generation_parameters_copypaste.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/gfpgan_model.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/gfpgan_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..752adfcca5966622a565d6c7daf1330b9c48f931 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/gfpgan_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/gitpython_hack.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/gitpython_hack.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdca6c0de298fc9af8b12a108511f0cfbb2a6677 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/gitpython_hack.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/gradio_extensons.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/gradio_extensons.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e4fc31dd53cc7cd79e98e169940cd3e1ad58c37 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/gradio_extensons.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/hashes.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/hashes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3664d47dab973aa7091ddccdcb44d7a3a813c18b Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/hashes.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/images.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/images.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a9d3e606dda9352ffa3ef5b2e56c8061064d8c3 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/images.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/img2img.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/img2img.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfd154f221a7ddefc59341443f452e2d62a7f5b1 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/img2img.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/import_hook.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/import_hook.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59d5ee02fb6cb23b6726f3858ee85dfef4bf970c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/import_hook.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/initialize.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/initialize.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13201f2254c628ffc2762dd66e33ab95dc206584 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/initialize.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/initialize_util.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/initialize_util.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ebbd040a8891000fd866ff3ab134251c89e7bc8 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/initialize_util.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/interrogate.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/interrogate.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0aa731081601f5b70650db920ad9750b38517bd Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/interrogate.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/launch_utils.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/launch_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a15bc154c4fc70f1c32ed98fb1717cb9193600d6 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/launch_utils.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/localization.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/localization.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d37dd392dda6cd5d08b131a0b6a8fcfd6e6d7be Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/localization.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/logging_config.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/logging_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de1274f808a54c61692d617e8283db88a45f25b3 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/logging_config.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/lowvram.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/lowvram.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac0310e91962262227a64714c8d5c8d8cb948d83 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/lowvram.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/masking.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/masking.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..707ae8d6ba7d9328439b2a3ed3ddc79bb99ebf96 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/masking.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/memmon.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/memmon.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07cea6a30e5e7dc0ffe19663eed55dda484321cf Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/memmon.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/modelloader.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/modelloader.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ac67386ec8aa3f352799a1ce7fe46633387bd4a Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/modelloader.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/options.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/options.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03ea5492eb7ec564755f945246a7f3a241ea0cce Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/options.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/patches.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/patches.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..616b72bfb4b5b9d295120618d608d89cc780cbaf Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/patches.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/paths.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/paths.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54abe1fb62ebe8012e18fdd370fd0a7067e12d1a Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/paths.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/paths_internal.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/paths_internal.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e26a931c9f8fe56cfbc134ecbe2fca21a233be99 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/paths_internal.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/postprocessing.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/postprocessing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58945b4f706e8cd009de33b87fe8980a6bd4baea Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/postprocessing.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/processing.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/processing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..539fbe21fb56bb125c6bc25f3288ba408787eba1 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/processing.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/progress.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/progress.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7cdaabf15a6928b5a6c65a2619886bea2d1c429 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/progress.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/prompt_parser.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/prompt_parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82bf80638652f475082de4fa3129ade158217091 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/prompt_parser.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/realesrgan_model.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/realesrgan_model.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a636364d8d11869bedee36ce8a697321adc3625 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/realesrgan_model.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/restart.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/restart.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..931c1d318211481acf246c29466d20395f748f36 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/restart.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/rng.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/rng.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32423c5cb37c3015a486dd9a1c8cdd4a5d12e51f Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/rng.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/rng_philox.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/rng_philox.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4718e498858589306caea0ed1b8b886c8ea12fea Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/rng_philox.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/safe.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/safe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c7f158159f4681604a063909ffd0e1314500d67 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/safe.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/script_callbacks.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/script_callbacks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..039532617c2231d8f49b56d354d5bac6c3a3f963 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/script_callbacks.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/script_loading.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/script_loading.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb8496a6795b1df67c50d342d5d455e932d982eb Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/script_loading.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/scripts.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/scripts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50466ed31fd6a49b6df8449397fbc193a86e62cc Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/scripts.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/scripts_auto_postprocessing.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/scripts_auto_postprocessing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b81e7d635fb43bd14a98121f3de9491f00759b24 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/scripts_auto_postprocessing.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/scripts_postprocessing.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/scripts_postprocessing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..875d23de8279561e12f24f8b3191d3b714a6d51e Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/scripts_postprocessing.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_disable_initialization.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_disable_initialization.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01a895bda4e45e99b3b45dbc1b43cfc66fbb077e Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_disable_initialization.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2eb06eb7a6fd2338e5937bc7a7683400cc05b835 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_checkpoint.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_checkpoint.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce99e159427d811a4d75762815418e5d7a02531f Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_checkpoint.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_clip.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_clip.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18fa0a21f9f5b14cee8d2b665094c782ab75d098 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_clip.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_open_clip.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_open_clip.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85674d35643ba1768d399069511a0fd07929ac7f Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_open_clip.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_optimizations.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_optimizations.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a317c4de2f687e1d9eab0a9a1494c13be7e4757 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_optimizations.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_unet.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_unet.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49f18b5ecdd3bae8741b5e6b07011ab89cda8cc4 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_unet.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_utils.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1fc096393f4ae4edcb5e1461f5bc3c72a74e2ca Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_utils.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_hijack_xlmr.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_hijack_xlmr.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed51e04a416b5c9280fb825eaadd76a350e1d746 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_hijack_xlmr.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_models.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bed8affaa9da3eaeff0647b79ae0c9070fe519ce Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_models.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_models_config.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_models_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4174933cbdef866e84ccc6ceb9582bbc9d10898 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_models_config.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_models_types.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_models_types.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6439fb13738a2be422b0fc05bd5872e702cf514 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_models_types.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_models_xl.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_models_xl.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1da8d066e5bbbd4c0715f9e389fa5c25d352263 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_models_xl.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47eaa855a3b8d561afbb631a66b7d358e4cb8926 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers_cfg_denoiser.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers_cfg_denoiser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4649235bcb9fdeb1de6d8c9660c78d07c9318758 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers_cfg_denoiser.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers_common.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers_common.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01f635859616b57c302929498efc783b11ec1f21 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers_common.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers_extra.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers_extra.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47504d6be97e06a691a9053840899d3450bcbe5c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers_extra.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers_kdiffusion.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers_kdiffusion.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..beaeff4a971628fbd799fbdad0d07e8ee2e2fad6 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers_kdiffusion.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers_timesteps.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers_timesteps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f501747143ca75643b5d265ded8e7ab25312bdfc Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers_timesteps.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_samplers_timesteps_impl.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_samplers_timesteps_impl.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53e968f88da5fccb655b737f6a1aca739e114ab2 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_samplers_timesteps_impl.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_unet.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_unet.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7714498557a2bc2611da3e282ee6bca191d71b45 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_unet.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_vae.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_vae.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f36640560ceae5bf3a1a394525e5c39207ae1f1a Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_vae.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_vae_approx.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_vae_approx.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cd44793e874f3aed94ebfe8986e73a42a8ec13c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_vae_approx.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sd_vae_taesd.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sd_vae_taesd.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f9074797fa7df610311a0907112a3e90c42bb27 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sd_vae_taesd.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eddffcbf84aaa79e5190438de97c7184cfda94c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_cmd_options.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_cmd_options.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d18bd566e5e5e569f3c9dda38c584826175e58b Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_cmd_options.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_gradio_themes.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_gradio_themes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95d1da3d2fd5e1a7db40be44dfaf2eaad0f9f911 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_gradio_themes.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_init.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_init.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c7b368af1f067297d83b425e6ebe06ead45847c Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_init.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_items.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_items.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcaaad9ad61b065f0b2e20d058ede1817cfdf849 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_items.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_options.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_options.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02af54860e77e6640df3b7837bb187184ba2af92 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_options.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_state.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a954af86ed23da06196428a4b7752bac26425f0b Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_state.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/shared_total_tqdm.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/shared_total_tqdm.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b79d85044af5d309670dd72bc3fa4868157e326 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/shared_total_tqdm.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/styles.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/styles.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..819bb1d8d769104421b9d9171a0a4da81afca270 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/styles.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sub_quadratic_attention.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sub_quadratic_attention.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60a0eca25f6bb5d38a69e244e4ed2ebdbdb261bd Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sub_quadratic_attention.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/sysinfo.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/sysinfo.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8627f170fbec49ba98f79879aa8c276c979c7118 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/sysinfo.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/timer.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/timer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52d2a3b60319f622284dd04ca73295c07b9775d6 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/timer.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/txt2img.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/txt2img.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e82cf2f4fdccb06c8a7f72e8ed2b043a972ebe73 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/txt2img.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6505329bb67686846fe8b5f4ecd79e0f14b3e9e Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_checkpoint_merger.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_checkpoint_merger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb75790f61dba997aac255fc12c10ec6ceff3a32 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_checkpoint_merger.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_common.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_common.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cc1537f758c9ba31c1f24b7519bebe2c4271c94 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_common.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_components.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_components.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..777d7cc195aac858aed4211be205568d223421e1 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_components.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extensions.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extensions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5564b28d9c338a5a9c2f2835d406411262e642ba Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extensions.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extra_networks.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dfadcca891a18d1476365bccf4d2b0557d8a03b Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_checkpoints.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_checkpoints.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee8b1e0ff07144f90c173af04ed749e7187b2072 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_checkpoints.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_checkpoints_user_metadata.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_checkpoints_user_metadata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bb54d8c2a774714d3e06edb2b1b51a6b7ff6700 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_checkpoints_user_metadata.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_hypernets.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_hypernets.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e03f5f8539098beb06e5e23f7395fda81eb1fd38 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_hypernets.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_textual_inversion.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_textual_inversion.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..904dad7d621c3dbf13a8187d2d42c014ae3ec57e Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_textual_inversion.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_user_metadata.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_user_metadata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc205dfc0868f412e37b48ce91548350400174ad Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_extra_networks_user_metadata.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_gradio_extensions.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_gradio_extensions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9089ce5d77c606c460cfe89e3eaabab4ac35982f Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_gradio_extensions.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_loadsave.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_loadsave.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7575b89bdb17d525984f485cb642531ba152c6b Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_loadsave.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_postprocessing.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_postprocessing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..627b3007903c7e793ae4758c0a20335fc1fba381 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_postprocessing.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_prompt_styles.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_prompt_styles.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16dd195c3a1cd08733d081e398cbfab356176013 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_prompt_styles.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_settings.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5379599d6c4a0b2cbb9c20f38a1d1520fe8c9fd0 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_settings.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_tempdir.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_tempdir.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53b743fb0217dd8d18346cebea98273133556632 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_tempdir.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/ui_toprow.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/ui_toprow.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..410aefa5ed81ee70f5cae1291d91dfcad4cb72f7 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/ui_toprow.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/upscaler.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/upscaler.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86b03c256905882e17089fef9ea7b9da71c9d9b7 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/upscaler.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/util.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/util.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3e0bc9a6aeac7648977e6555be81d21a222c260 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/util.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/xlmr.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/xlmr.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a3342f30ad5ba4cf7dccf84cad85ef8f09aa2fa Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/xlmr.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/__pycache__/xlmr_m18.cpython-310.pyc b/stable-diffusion-webui/modules/__pycache__/xlmr_m18.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7ea78159fe250d9272ab0df0defcdd8df63a378 Binary files /dev/null and b/stable-diffusion-webui/modules/__pycache__/xlmr_m18.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/api/__pycache__/api.cpython-310.pyc b/stable-diffusion-webui/modules/api/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1a71e95c49209500dc9aa67ca303d91cfedf155 Binary files /dev/null and b/stable-diffusion-webui/modules/api/__pycache__/api.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/api/__pycache__/models.cpython-310.pyc b/stable-diffusion-webui/modules/api/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccc430a6635874e5e38b640f53a2d25a0cef3ddb Binary files /dev/null and b/stable-diffusion-webui/modules/api/__pycache__/models.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/api/api.py b/stable-diffusion-webui/modules/api/api.py new file mode 100644 index 0000000000000000000000000000000000000000..b3d74e513a33736248353b994ed08fec30d670ca --- /dev/null +++ b/stable-diffusion-webui/modules/api/api.py @@ -0,0 +1,791 @@ +import base64 +import io +import os +import time +import datetime +import uvicorn +import ipaddress +import requests +import gradio as gr +from threading import Lock +from io import BytesIO +from fastapi import APIRouter, Depends, FastAPI, Request, Response +from fastapi.security import HTTPBasic, HTTPBasicCredentials +from fastapi.exceptions import HTTPException +from fastapi.responses import JSONResponse +from fastapi.encoders import jsonable_encoder +from secrets import compare_digest + +import modules.shared as shared +from modules import sd_samplers, deepbooru, sd_hijack, images, scripts, ui, postprocessing, errors, restart, shared_items, script_callbacks, generation_parameters_copypaste, sd_models +from modules.api import models +from modules.shared import opts +from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img, process_images +from modules.textual_inversion.textual_inversion import create_embedding, train_embedding +from modules.hypernetworks.hypernetwork import create_hypernetwork, train_hypernetwork +from PIL import PngImagePlugin, Image +from modules.sd_models_config import find_checkpoint_config_near_filename +from modules.realesrgan_model import get_realesrgan_models +from modules import devices +from typing import Any +import piexif +import piexif.helper +from contextlib import closing + + +def script_name_to_index(name, scripts): + try: + return [script.title().lower() for script in scripts].index(name.lower()) + except Exception as e: + raise HTTPException(status_code=422, detail=f"Script '{name}' not found") from e + + +def validate_sampler_name(name): + config = sd_samplers.all_samplers_map.get(name, None) + if config is None: + raise HTTPException(status_code=404, detail="Sampler not found") + + return name + + +def setUpscalers(req: dict): + reqDict = vars(req) + reqDict['extras_upscaler_1'] = reqDict.pop('upscaler_1', None) + reqDict['extras_upscaler_2'] = reqDict.pop('upscaler_2', None) + return reqDict + + +def verify_url(url): + """Returns True if the url refers to a global resource.""" + + import socket + from urllib.parse import urlparse + try: + parsed_url = urlparse(url) + domain_name = parsed_url.netloc + host = socket.gethostbyname_ex(domain_name) + for ip in host[2]: + ip_addr = ipaddress.ip_address(ip) + if not ip_addr.is_global: + return False + except Exception: + return False + + return True + + +def decode_base64_to_image(encoding): + if encoding.startswith("http://") or encoding.startswith("https://"): + if not opts.api_enable_requests: + raise HTTPException(status_code=500, detail="Requests not allowed") + + if opts.api_forbid_local_requests and not verify_url(encoding): + raise HTTPException(status_code=500, detail="Request to local resource not allowed") + + headers = {'user-agent': opts.api_useragent} if opts.api_useragent else {} + response = requests.get(encoding, timeout=30, headers=headers) + try: + image = Image.open(BytesIO(response.content)) + return image + except Exception as e: + raise HTTPException(status_code=500, detail="Invalid image url") from e + + if encoding.startswith("data:image/"): + encoding = encoding.split(";")[1].split(",")[1] + try: + image = Image.open(BytesIO(base64.b64decode(encoding))) + return image + except Exception as e: + raise HTTPException(status_code=500, detail="Invalid encoded image") from e + + +def encode_pil_to_base64(image): + with io.BytesIO() as output_bytes: + if isinstance(image, str): + return image + if opts.samples_format.lower() == 'png': + use_metadata = False + metadata = PngImagePlugin.PngInfo() + for key, value in image.info.items(): + if isinstance(key, str) and isinstance(value, str): + metadata.add_text(key, value) + use_metadata = True + image.save(output_bytes, format="PNG", pnginfo=(metadata if use_metadata else None), quality=opts.jpeg_quality) + + elif opts.samples_format.lower() in ("jpg", "jpeg", "webp"): + if image.mode == "RGBA": + image = image.convert("RGB") + parameters = image.info.get('parameters', None) + exif_bytes = piexif.dump({ + "Exif": { piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(parameters or "", encoding="unicode") } + }) + if opts.samples_format.lower() in ("jpg", "jpeg"): + image.save(output_bytes, format="JPEG", exif = exif_bytes, quality=opts.jpeg_quality) + else: + image.save(output_bytes, format="WEBP", exif = exif_bytes, quality=opts.jpeg_quality) + + else: + raise HTTPException(status_code=500, detail="Invalid image format") + + bytes_data = output_bytes.getvalue() + + return base64.b64encode(bytes_data) + + +def api_middleware(app: FastAPI): + rich_available = False + try: + if os.environ.get('WEBUI_RICH_EXCEPTIONS', None) is not None: + import anyio # importing just so it can be placed on silent list + import starlette # importing just so it can be placed on silent list + from rich.console import Console + console = Console() + rich_available = True + except Exception: + pass + + @app.middleware("http") + async def log_and_time(req: Request, call_next): + ts = time.time() + res: Response = await call_next(req) + duration = str(round(time.time() - ts, 4)) + res.headers["X-Process-Time"] = duration + endpoint = req.scope.get('path', 'err') + if shared.cmd_opts.api_log and endpoint.startswith('/sdapi'): + print('API {t} {code} {prot}/{ver} {method} {endpoint} {cli} {duration}'.format( + t=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), + code=res.status_code, + ver=req.scope.get('http_version', '0.0'), + cli=req.scope.get('client', ('0:0.0.0', 0))[0], + prot=req.scope.get('scheme', 'err'), + method=req.scope.get('method', 'err'), + endpoint=endpoint, + duration=duration, + )) + return res + + def handle_exception(request: Request, e: Exception): + err = { + "error": type(e).__name__, + "detail": vars(e).get('detail', ''), + "body": vars(e).get('body', ''), + "errors": str(e), + } + if not isinstance(e, HTTPException): # do not print backtrace on known httpexceptions + message = f"API error: {request.method}: {request.url} {err}" + if rich_available: + print(message) + console.print_exception(show_locals=True, max_frames=2, extra_lines=1, suppress=[anyio, starlette], word_wrap=False, width=min([console.width, 200])) + else: + errors.report(message, exc_info=True) + return JSONResponse(status_code=vars(e).get('status_code', 500), content=jsonable_encoder(err)) + + @app.middleware("http") + async def exception_handling(request: Request, call_next): + try: + return await call_next(request) + except Exception as e: + return handle_exception(request, e) + + @app.exception_handler(Exception) + async def fastapi_exception_handler(request: Request, e: Exception): + return handle_exception(request, e) + + @app.exception_handler(HTTPException) + async def http_exception_handler(request: Request, e: HTTPException): + return handle_exception(request, e) + + +class Api: + def __init__(self, app: FastAPI, queue_lock: Lock): + if shared.cmd_opts.api_auth: + self.credentials = {} + for auth in shared.cmd_opts.api_auth.split(","): + user, password = auth.split(":") + self.credentials[user] = password + + self.router = APIRouter() + self.app = app + self.queue_lock = queue_lock + api_middleware(self.app) + self.add_api_route("/sdapi/v1/txt2img", self.text2imgapi, methods=["POST"], response_model=models.TextToImageResponse) + self.add_api_route("/sdapi/v1/img2img", self.img2imgapi, methods=["POST"], response_model=models.ImageToImageResponse) + self.add_api_route("/sdapi/v1/extra-single-image", self.extras_single_image_api, methods=["POST"], response_model=models.ExtrasSingleImageResponse) + self.add_api_route("/sdapi/v1/extra-batch-images", self.extras_batch_images_api, methods=["POST"], response_model=models.ExtrasBatchImagesResponse) + self.add_api_route("/sdapi/v1/png-info", self.pnginfoapi, methods=["POST"], response_model=models.PNGInfoResponse) + self.add_api_route("/sdapi/v1/progress", self.progressapi, methods=["GET"], response_model=models.ProgressResponse) + self.add_api_route("/sdapi/v1/interrogate", self.interrogateapi, methods=["POST"]) + self.add_api_route("/sdapi/v1/interrupt", self.interruptapi, methods=["POST"]) + self.add_api_route("/sdapi/v1/skip", self.skip, methods=["POST"]) + self.add_api_route("/sdapi/v1/options", self.get_config, methods=["GET"], response_model=models.OptionsModel) + self.add_api_route("/sdapi/v1/options", self.set_config, methods=["POST"]) + self.add_api_route("/sdapi/v1/cmd-flags", self.get_cmd_flags, methods=["GET"], response_model=models.FlagsModel) + self.add_api_route("/sdapi/v1/samplers", self.get_samplers, methods=["GET"], response_model=list[models.SamplerItem]) + self.add_api_route("/sdapi/v1/upscalers", self.get_upscalers, methods=["GET"], response_model=list[models.UpscalerItem]) + self.add_api_route("/sdapi/v1/latent-upscale-modes", self.get_latent_upscale_modes, methods=["GET"], response_model=list[models.LatentUpscalerModeItem]) + self.add_api_route("/sdapi/v1/sd-models", self.get_sd_models, methods=["GET"], response_model=list[models.SDModelItem]) + self.add_api_route("/sdapi/v1/sd-vae", self.get_sd_vaes, methods=["GET"], response_model=list[models.SDVaeItem]) + self.add_api_route("/sdapi/v1/hypernetworks", self.get_hypernetworks, methods=["GET"], response_model=list[models.HypernetworkItem]) + self.add_api_route("/sdapi/v1/face-restorers", self.get_face_restorers, methods=["GET"], response_model=list[models.FaceRestorerItem]) + self.add_api_route("/sdapi/v1/realesrgan-models", self.get_realesrgan_models, methods=["GET"], response_model=list[models.RealesrganItem]) + self.add_api_route("/sdapi/v1/prompt-styles", self.get_prompt_styles, methods=["GET"], response_model=list[models.PromptStyleItem]) + self.add_api_route("/sdapi/v1/embeddings", self.get_embeddings, methods=["GET"], response_model=models.EmbeddingsResponse) + self.add_api_route("/sdapi/v1/refresh-checkpoints", self.refresh_checkpoints, methods=["POST"]) + self.add_api_route("/sdapi/v1/refresh-vae", self.refresh_vae, methods=["POST"]) + self.add_api_route("/sdapi/v1/create/embedding", self.create_embedding, methods=["POST"], response_model=models.CreateResponse) + self.add_api_route("/sdapi/v1/create/hypernetwork", self.create_hypernetwork, methods=["POST"], response_model=models.CreateResponse) + self.add_api_route("/sdapi/v1/train/embedding", self.train_embedding, methods=["POST"], response_model=models.TrainResponse) + self.add_api_route("/sdapi/v1/train/hypernetwork", self.train_hypernetwork, methods=["POST"], response_model=models.TrainResponse) + self.add_api_route("/sdapi/v1/memory", self.get_memory, methods=["GET"], response_model=models.MemoryResponse) + self.add_api_route("/sdapi/v1/unload-checkpoint", self.unloadapi, methods=["POST"]) + self.add_api_route("/sdapi/v1/reload-checkpoint", self.reloadapi, methods=["POST"]) + self.add_api_route("/sdapi/v1/scripts", self.get_scripts_list, methods=["GET"], response_model=models.ScriptsList) + self.add_api_route("/sdapi/v1/script-info", self.get_script_info, methods=["GET"], response_model=list[models.ScriptInfo]) + self.add_api_route("/sdapi/v1/extensions", self.get_extensions_list, methods=["GET"], response_model=list[models.ExtensionItem]) + + if shared.cmd_opts.api_server_stop: + self.add_api_route("/sdapi/v1/server-kill", self.kill_webui, methods=["POST"]) + self.add_api_route("/sdapi/v1/server-restart", self.restart_webui, methods=["POST"]) + self.add_api_route("/sdapi/v1/server-stop", self.stop_webui, methods=["POST"]) + + self.default_script_arg_txt2img = [] + self.default_script_arg_img2img = [] + + def add_api_route(self, path: str, endpoint, **kwargs): + if shared.cmd_opts.api_auth: + return self.app.add_api_route(path, endpoint, dependencies=[Depends(self.auth)], **kwargs) + return self.app.add_api_route(path, endpoint, **kwargs) + + def auth(self, credentials: HTTPBasicCredentials = Depends(HTTPBasic())): + if credentials.username in self.credentials: + if compare_digest(credentials.password, self.credentials[credentials.username]): + return True + + raise HTTPException(status_code=401, detail="Incorrect username or password", headers={"WWW-Authenticate": "Basic"}) + + def get_selectable_script(self, script_name, script_runner): + if script_name is None or script_name == "": + return None, None + + script_idx = script_name_to_index(script_name, script_runner.selectable_scripts) + script = script_runner.selectable_scripts[script_idx] + return script, script_idx + + def get_scripts_list(self): + t2ilist = [script.name for script in scripts.scripts_txt2img.scripts if script.name is not None] + i2ilist = [script.name for script in scripts.scripts_img2img.scripts if script.name is not None] + + return models.ScriptsList(txt2img=t2ilist, img2img=i2ilist) + + def get_script_info(self): + res = [] + + for script_list in [scripts.scripts_txt2img.scripts, scripts.scripts_img2img.scripts]: + res += [script.api_info for script in script_list if script.api_info is not None] + + return res + + def get_script(self, script_name, script_runner): + if script_name is None or script_name == "": + return None, None + + script_idx = script_name_to_index(script_name, script_runner.scripts) + return script_runner.scripts[script_idx] + + def init_default_script_args(self, script_runner): + #find max idx from the scripts in runner and generate a none array to init script_args + last_arg_index = 1 + for script in script_runner.scripts: + if last_arg_index < script.args_to: + last_arg_index = script.args_to + # None everywhere except position 0 to initialize script args + script_args = [None]*last_arg_index + script_args[0] = 0 + + # get default values + with gr.Blocks(): # will throw errors calling ui function without this + for script in script_runner.scripts: + if script.ui(script.is_img2img): + ui_default_values = [] + for elem in script.ui(script.is_img2img): + ui_default_values.append(elem.value) + script_args[script.args_from:script.args_to] = ui_default_values + return script_args + + def init_script_args(self, request, default_script_args, selectable_scripts, selectable_idx, script_runner): + script_args = default_script_args.copy() + # position 0 in script_arg is the idx+1 of the selectable script that is going to be run when using scripts.scripts_*2img.run() + if selectable_scripts: + script_args[selectable_scripts.args_from:selectable_scripts.args_to] = request.script_args + script_args[0] = selectable_idx + 1 + + # Now check for always on scripts + if request.alwayson_scripts: + for alwayson_script_name in request.alwayson_scripts.keys(): + alwayson_script = self.get_script(alwayson_script_name, script_runner) + if alwayson_script is None: + raise HTTPException(status_code=422, detail=f"always on script {alwayson_script_name} not found") + # Selectable script in always on script param check + if alwayson_script.alwayson is False: + raise HTTPException(status_code=422, detail="Cannot have a selectable script in the always on scripts params") + # always on script with no arg should always run so you don't really need to add them to the requests + if "args" in request.alwayson_scripts[alwayson_script_name]: + # min between arg length in scriptrunner and arg length in the request + for idx in range(0, min((alwayson_script.args_to - alwayson_script.args_from), len(request.alwayson_scripts[alwayson_script_name]["args"]))): + script_args[alwayson_script.args_from + idx] = request.alwayson_scripts[alwayson_script_name]["args"][idx] + return script_args + + def text2imgapi(self, txt2imgreq: models.StableDiffusionTxt2ImgProcessingAPI): + script_runner = scripts.scripts_txt2img + if not script_runner.scripts: + script_runner.initialize_scripts(False) + ui.create_ui() + if not self.default_script_arg_txt2img: + self.default_script_arg_txt2img = self.init_default_script_args(script_runner) + selectable_scripts, selectable_script_idx = self.get_selectable_script(txt2imgreq.script_name, script_runner) + + populate = txt2imgreq.copy(update={ # Override __init__ params + "sampler_name": validate_sampler_name(txt2imgreq.sampler_name or txt2imgreq.sampler_index), + "do_not_save_samples": not txt2imgreq.save_images, + "do_not_save_grid": not txt2imgreq.save_images, + }) + if populate.sampler_name: + populate.sampler_index = None # prevent a warning later on + + args = vars(populate) + args.pop('script_name', None) + args.pop('script_args', None) # will refeed them to the pipeline directly after initializing them + args.pop('alwayson_scripts', None) + + script_args = self.init_script_args(txt2imgreq, self.default_script_arg_txt2img, selectable_scripts, selectable_script_idx, script_runner) + + send_images = args.pop('send_images', True) + args.pop('save_images', None) + + with self.queue_lock: + with closing(StableDiffusionProcessingTxt2Img(sd_model=shared.sd_model, **args)) as p: + p.is_api = True + p.scripts = script_runner + p.outpath_grids = opts.outdir_txt2img_grids + p.outpath_samples = opts.outdir_txt2img_samples + + try: + shared.state.begin(job="scripts_txt2img") + if selectable_scripts is not None: + p.script_args = script_args + processed = scripts.scripts_txt2img.run(p, *p.script_args) # Need to pass args as list here + else: + p.script_args = tuple(script_args) # Need to pass args as tuple here + processed = process_images(p) + finally: + shared.state.end() + shared.total_tqdm.clear() + + b64images = list(map(encode_pil_to_base64, processed.images)) if send_images else [] + + return models.TextToImageResponse(images=b64images, parameters=vars(txt2imgreq), info=processed.js()) + + def img2imgapi(self, img2imgreq: models.StableDiffusionImg2ImgProcessingAPI): + init_images = img2imgreq.init_images + if init_images is None: + raise HTTPException(status_code=404, detail="Init image not found") + + mask = img2imgreq.mask + if mask: + mask = decode_base64_to_image(mask) + + script_runner = scripts.scripts_img2img + if not script_runner.scripts: + script_runner.initialize_scripts(True) + ui.create_ui() + if not self.default_script_arg_img2img: + self.default_script_arg_img2img = self.init_default_script_args(script_runner) + selectable_scripts, selectable_script_idx = self.get_selectable_script(img2imgreq.script_name, script_runner) + + populate = img2imgreq.copy(update={ # Override __init__ params + "sampler_name": validate_sampler_name(img2imgreq.sampler_name or img2imgreq.sampler_index), + "do_not_save_samples": not img2imgreq.save_images, + "do_not_save_grid": not img2imgreq.save_images, + "mask": mask, + }) + if populate.sampler_name: + populate.sampler_index = None # prevent a warning later on + + args = vars(populate) + args.pop('include_init_images', None) # this is meant to be done by "exclude": True in model, but it's for a reason that I cannot determine. + args.pop('script_name', None) + args.pop('script_args', None) # will refeed them to the pipeline directly after initializing them + args.pop('alwayson_scripts', None) + + script_args = self.init_script_args(img2imgreq, self.default_script_arg_img2img, selectable_scripts, selectable_script_idx, script_runner) + + send_images = args.pop('send_images', True) + args.pop('save_images', None) + + with self.queue_lock: + with closing(StableDiffusionProcessingImg2Img(sd_model=shared.sd_model, **args)) as p: + p.init_images = [decode_base64_to_image(x) for x in init_images] + p.is_api = True + p.scripts = script_runner + p.outpath_grids = opts.outdir_img2img_grids + p.outpath_samples = opts.outdir_img2img_samples + + try: + shared.state.begin(job="scripts_img2img") + if selectable_scripts is not None: + p.script_args = script_args + processed = scripts.scripts_img2img.run(p, *p.script_args) # Need to pass args as list here + else: + p.script_args = tuple(script_args) # Need to pass args as tuple here + processed = process_images(p) + finally: + shared.state.end() + shared.total_tqdm.clear() + + b64images = list(map(encode_pil_to_base64, processed.images)) if send_images else [] + + if not img2imgreq.include_init_images: + img2imgreq.init_images = None + img2imgreq.mask = None + + return models.ImageToImageResponse(images=b64images, parameters=vars(img2imgreq), info=processed.js()) + + def extras_single_image_api(self, req: models.ExtrasSingleImageRequest): + reqDict = setUpscalers(req) + + reqDict['image'] = decode_base64_to_image(reqDict['image']) + + with self.queue_lock: + result = postprocessing.run_extras(extras_mode=0, image_folder="", input_dir="", output_dir="", save_output=False, **reqDict) + + return models.ExtrasSingleImageResponse(image=encode_pil_to_base64(result[0][0]), html_info=result[1]) + + def extras_batch_images_api(self, req: models.ExtrasBatchImagesRequest): + reqDict = setUpscalers(req) + + image_list = reqDict.pop('imageList', []) + image_folder = [decode_base64_to_image(x.data) for x in image_list] + + with self.queue_lock: + result = postprocessing.run_extras(extras_mode=1, image_folder=image_folder, image="", input_dir="", output_dir="", save_output=False, **reqDict) + + return models.ExtrasBatchImagesResponse(images=list(map(encode_pil_to_base64, result[0])), html_info=result[1]) + + def pnginfoapi(self, req: models.PNGInfoRequest): + image = decode_base64_to_image(req.image.strip()) + if image is None: + return models.PNGInfoResponse(info="") + + geninfo, items = images.read_info_from_image(image) + if geninfo is None: + geninfo = "" + + params = generation_parameters_copypaste.parse_generation_parameters(geninfo) + script_callbacks.infotext_pasted_callback(geninfo, params) + + return models.PNGInfoResponse(info=geninfo, items=items, parameters=params) + + def progressapi(self, req: models.ProgressRequest = Depends()): + # copy from check_progress_call of ui.py + + if shared.state.job_count == 0: + return models.ProgressResponse(progress=0, eta_relative=0, state=shared.state.dict(), textinfo=shared.state.textinfo) + + # avoid dividing zero + progress = 0.01 + + if shared.state.job_count > 0: + progress += shared.state.job_no / shared.state.job_count + if shared.state.sampling_steps > 0: + progress += 1 / shared.state.job_count * shared.state.sampling_step / shared.state.sampling_steps + + time_since_start = time.time() - shared.state.time_start + eta = (time_since_start/progress) + eta_relative = eta-time_since_start + + progress = min(progress, 1) + + shared.state.set_current_image() + + current_image = None + if shared.state.current_image and not req.skip_current_image: + current_image = encode_pil_to_base64(shared.state.current_image) + + return models.ProgressResponse(progress=progress, eta_relative=eta_relative, state=shared.state.dict(), current_image=current_image, textinfo=shared.state.textinfo) + + def interrogateapi(self, interrogatereq: models.InterrogateRequest): + image_b64 = interrogatereq.image + if image_b64 is None: + raise HTTPException(status_code=404, detail="Image not found") + + img = decode_base64_to_image(image_b64) + img = img.convert('RGB') + + # Override object param + with self.queue_lock: + if interrogatereq.model == "clip": + processed = shared.interrogator.interrogate(img) + elif interrogatereq.model == "deepdanbooru": + processed = deepbooru.model.tag(img) + else: + raise HTTPException(status_code=404, detail="Model not found") + + return models.InterrogateResponse(caption=processed) + + def interruptapi(self): + shared.state.interrupt() + + return {} + + def unloadapi(self): + sd_models.unload_model_weights() + + return {} + + def reloadapi(self): + sd_models.send_model_to_device(shared.sd_model) + + return {} + + def skip(self): + shared.state.skip() + + def get_config(self): + options = {} + for key in shared.opts.data.keys(): + metadata = shared.opts.data_labels.get(key) + if(metadata is not None): + options.update({key: shared.opts.data.get(key, shared.opts.data_labels.get(key).default)}) + else: + options.update({key: shared.opts.data.get(key, None)}) + + return options + + def set_config(self, req: dict[str, Any]): + checkpoint_name = req.get("sd_model_checkpoint", None) + if checkpoint_name is not None and checkpoint_name not in sd_models.checkpoint_aliases: + raise RuntimeError(f"model {checkpoint_name!r} not found") + + for k, v in req.items(): + shared.opts.set(k, v, is_api=True) + + shared.opts.save(shared.config_filename) + return + + def get_cmd_flags(self): + return vars(shared.cmd_opts) + + def get_samplers(self): + return [{"name": sampler[0], "aliases":sampler[2], "options":sampler[3]} for sampler in sd_samplers.all_samplers] + + def get_upscalers(self): + return [ + { + "name": upscaler.name, + "model_name": upscaler.scaler.model_name, + "model_path": upscaler.data_path, + "model_url": None, + "scale": upscaler.scale, + } + for upscaler in shared.sd_upscalers + ] + + def get_latent_upscale_modes(self): + return [ + { + "name": upscale_mode, + } + for upscale_mode in [*(shared.latent_upscale_modes or {})] + ] + + def get_sd_models(self): + import modules.sd_models as sd_models + return [{"title": x.title, "model_name": x.model_name, "hash": x.shorthash, "sha256": x.sha256, "filename": x.filename, "config": find_checkpoint_config_near_filename(x)} for x in sd_models.checkpoints_list.values()] + + def get_sd_vaes(self): + import modules.sd_vae as sd_vae + return [{"model_name": x, "filename": sd_vae.vae_dict[x]} for x in sd_vae.vae_dict.keys()] + + def get_hypernetworks(self): + return [{"name": name, "path": shared.hypernetworks[name]} for name in shared.hypernetworks] + + def get_face_restorers(self): + return [{"name":x.name(), "cmd_dir": getattr(x, "cmd_dir", None)} for x in shared.face_restorers] + + def get_realesrgan_models(self): + return [{"name":x.name,"path":x.data_path, "scale":x.scale} for x in get_realesrgan_models(None)] + + def get_prompt_styles(self): + styleList = [] + for k in shared.prompt_styles.styles: + style = shared.prompt_styles.styles[k] + styleList.append({"name":style[0], "prompt": style[1], "negative_prompt": style[2]}) + + return styleList + + def get_embeddings(self): + db = sd_hijack.model_hijack.embedding_db + + def convert_embedding(embedding): + return { + "step": embedding.step, + "sd_checkpoint": embedding.sd_checkpoint, + "sd_checkpoint_name": embedding.sd_checkpoint_name, + "shape": embedding.shape, + "vectors": embedding.vectors, + } + + def convert_embeddings(embeddings): + return {embedding.name: convert_embedding(embedding) for embedding in embeddings.values()} + + return { + "loaded": convert_embeddings(db.word_embeddings), + "skipped": convert_embeddings(db.skipped_embeddings), + } + + def refresh_checkpoints(self): + with self.queue_lock: + shared.refresh_checkpoints() + + def refresh_vae(self): + with self.queue_lock: + shared_items.refresh_vae_list() + + def create_embedding(self, args: dict): + try: + shared.state.begin(job="create_embedding") + filename = create_embedding(**args) # create empty embedding + sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings() # reload embeddings so new one can be immediately used + return models.CreateResponse(info=f"create embedding filename: {filename}") + except AssertionError as e: + return models.TrainResponse(info=f"create embedding error: {e}") + finally: + shared.state.end() + + + def create_hypernetwork(self, args: dict): + try: + shared.state.begin(job="create_hypernetwork") + filename = create_hypernetwork(**args) # create empty embedding + return models.CreateResponse(info=f"create hypernetwork filename: {filename}") + except AssertionError as e: + return models.TrainResponse(info=f"create hypernetwork error: {e}") + finally: + shared.state.end() + + def train_embedding(self, args: dict): + try: + shared.state.begin(job="train_embedding") + apply_optimizations = shared.opts.training_xattention_optimizations + error = None + filename = '' + if not apply_optimizations: + sd_hijack.undo_optimizations() + try: + embedding, filename = train_embedding(**args) # can take a long time to complete + except Exception as e: + error = e + finally: + if not apply_optimizations: + sd_hijack.apply_optimizations() + return models.TrainResponse(info=f"train embedding complete: filename: {filename} error: {error}") + except Exception as msg: + return models.TrainResponse(info=f"train embedding error: {msg}") + finally: + shared.state.end() + + def train_hypernetwork(self, args: dict): + try: + shared.state.begin(job="train_hypernetwork") + shared.loaded_hypernetworks = [] + apply_optimizations = shared.opts.training_xattention_optimizations + error = None + filename = '' + if not apply_optimizations: + sd_hijack.undo_optimizations() + try: + hypernetwork, filename = train_hypernetwork(**args) + except Exception as e: + error = e + finally: + shared.sd_model.cond_stage_model.to(devices.device) + shared.sd_model.first_stage_model.to(devices.device) + if not apply_optimizations: + sd_hijack.apply_optimizations() + shared.state.end() + return models.TrainResponse(info=f"train embedding complete: filename: {filename} error: {error}") + except Exception as exc: + return models.TrainResponse(info=f"train embedding error: {exc}") + finally: + shared.state.end() + + def get_memory(self): + try: + import os + import psutil + process = psutil.Process(os.getpid()) + res = process.memory_info() # only rss is cross-platform guaranteed so we dont rely on other values + ram_total = 100 * res.rss / process.memory_percent() # and total memory is calculated as actual value is not cross-platform safe + ram = { 'free': ram_total - res.rss, 'used': res.rss, 'total': ram_total } + except Exception as err: + ram = { 'error': f'{err}' } + try: + import torch + if torch.cuda.is_available(): + s = torch.cuda.mem_get_info() + system = { 'free': s[0], 'used': s[1] - s[0], 'total': s[1] } + s = dict(torch.cuda.memory_stats(shared.device)) + allocated = { 'current': s['allocated_bytes.all.current'], 'peak': s['allocated_bytes.all.peak'] } + reserved = { 'current': s['reserved_bytes.all.current'], 'peak': s['reserved_bytes.all.peak'] } + active = { 'current': s['active_bytes.all.current'], 'peak': s['active_bytes.all.peak'] } + inactive = { 'current': s['inactive_split_bytes.all.current'], 'peak': s['inactive_split_bytes.all.peak'] } + warnings = { 'retries': s['num_alloc_retries'], 'oom': s['num_ooms'] } + cuda = { + 'system': system, + 'active': active, + 'allocated': allocated, + 'reserved': reserved, + 'inactive': inactive, + 'events': warnings, + } + else: + cuda = {'error': 'unavailable'} + except Exception as err: + cuda = {'error': f'{err}'} + return models.MemoryResponse(ram=ram, cuda=cuda) + + def get_extensions_list(self): + from modules import extensions + extensions.list_extensions() + ext_list = [] + for ext in extensions.extensions: + ext: extensions.Extension + ext.read_info_from_repo() + if ext.remote is not None: + ext_list.append({ + "name": ext.name, + "remote": ext.remote, + "branch": ext.branch, + "commit_hash":ext.commit_hash, + "commit_date":ext.commit_date, + "version":ext.version, + "enabled":ext.enabled + }) + return ext_list + + def launch(self, server_name, port, root_path): + self.app.include_router(self.router) + uvicorn.run(self.app, host=server_name, port=port, timeout_keep_alive=shared.cmd_opts.timeout_keep_alive, root_path=root_path) + + def kill_webui(self): + restart.stop_program() + + def restart_webui(self): + if restart.is_restartable(): + restart.restart_program() + return Response(status_code=501) + + def stop_webui(request): + shared.state.server_command = "stop" + return Response("Stopping.") + diff --git a/stable-diffusion-webui/modules/api/models.py b/stable-diffusion-webui/modules/api/models.py new file mode 100644 index 0000000000000000000000000000000000000000..33894b3e69423a231f91ccbe07b47bd843612806 --- /dev/null +++ b/stable-diffusion-webui/modules/api/models.py @@ -0,0 +1,318 @@ +import inspect + +from pydantic import BaseModel, Field, create_model +from typing import Any, Optional, Literal +from inflection import underscore +from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img +from modules.shared import sd_upscalers, opts, parser + +API_NOT_ALLOWED = [ + "self", + "kwargs", + "sd_model", + "outpath_samples", + "outpath_grids", + "sampler_index", + # "do_not_save_samples", + # "do_not_save_grid", + "extra_generation_params", + "overlay_images", + "do_not_reload_embeddings", + "seed_enable_extras", + "prompt_for_display", + "sampler_noise_scheduler_override", + "ddim_discretize" +] + +class ModelDef(BaseModel): + """Assistance Class for Pydantic Dynamic Model Generation""" + + field: str + field_alias: str + field_type: Any + field_value: Any + field_exclude: bool = False + + +class PydanticModelGenerator: + """ + Takes in created classes and stubs them out in a way FastAPI/Pydantic is happy about: + source_data is a snapshot of the default values produced by the class + params are the names of the actual keys required by __init__ + """ + + def __init__( + self, + model_name: str = None, + class_instance = None, + additional_fields = None, + ): + def field_type_generator(k, v): + field_type = v.annotation + + if field_type == 'Image': + # images are sent as base64 strings via API + field_type = 'str' + + return Optional[field_type] + + def merge_class_params(class_): + all_classes = list(filter(lambda x: x is not object, inspect.getmro(class_))) + parameters = {} + for classes in all_classes: + parameters = {**parameters, **inspect.signature(classes.__init__).parameters} + return parameters + + self._model_name = model_name + self._class_data = merge_class_params(class_instance) + + self._model_def = [ + ModelDef( + field=underscore(k), + field_alias=k, + field_type=field_type_generator(k, v), + field_value=None if isinstance(v.default, property) else v.default + ) + for (k,v) in self._class_data.items() if k not in API_NOT_ALLOWED + ] + + for fields in additional_fields: + self._model_def.append(ModelDef( + field=underscore(fields["key"]), + field_alias=fields["key"], + field_type=fields["type"], + field_value=fields["default"], + field_exclude=fields["exclude"] if "exclude" in fields else False)) + + def generate_model(self): + """ + Creates a pydantic BaseModel + from the json and overrides provided at initialization + """ + fields = { + d.field: (d.field_type, Field(default=d.field_value, alias=d.field_alias, exclude=d.field_exclude)) for d in self._model_def + } + DynamicModel = create_model(self._model_name, **fields) + DynamicModel.__config__.allow_population_by_field_name = True + DynamicModel.__config__.allow_mutation = True + return DynamicModel + +StableDiffusionTxt2ImgProcessingAPI = PydanticModelGenerator( + "StableDiffusionProcessingTxt2Img", + StableDiffusionProcessingTxt2Img, + [ + {"key": "sampler_index", "type": str, "default": "Euler"}, + {"key": "script_name", "type": str, "default": None}, + {"key": "script_args", "type": list, "default": []}, + {"key": "send_images", "type": bool, "default": True}, + {"key": "save_images", "type": bool, "default": False}, + {"key": "alwayson_scripts", "type": dict, "default": {}}, + ] +).generate_model() + +StableDiffusionImg2ImgProcessingAPI = PydanticModelGenerator( + "StableDiffusionProcessingImg2Img", + StableDiffusionProcessingImg2Img, + [ + {"key": "sampler_index", "type": str, "default": "Euler"}, + {"key": "init_images", "type": list, "default": None}, + {"key": "denoising_strength", "type": float, "default": 0.75}, + {"key": "mask", "type": str, "default": None}, + {"key": "include_init_images", "type": bool, "default": False, "exclude" : True}, + {"key": "script_name", "type": str, "default": None}, + {"key": "script_args", "type": list, "default": []}, + {"key": "send_images", "type": bool, "default": True}, + {"key": "save_images", "type": bool, "default": False}, + {"key": "alwayson_scripts", "type": dict, "default": {}}, + ] +).generate_model() + +class TextToImageResponse(BaseModel): + images: list[str] = Field(default=None, title="Image", description="The generated image in base64 format.") + parameters: dict + info: str + +class ImageToImageResponse(BaseModel): + images: list[str] = Field(default=None, title="Image", description="The generated image in base64 format.") + parameters: dict + info: str + +class ExtrasBaseRequest(BaseModel): + resize_mode: Literal[0, 1] = Field(default=0, title="Resize Mode", description="Sets the resize mode: 0 to upscale by upscaling_resize amount, 1 to upscale up to upscaling_resize_h x upscaling_resize_w.") + show_extras_results: bool = Field(default=True, title="Show results", description="Should the backend return the generated image?") + gfpgan_visibility: float = Field(default=0, title="GFPGAN Visibility", ge=0, le=1, allow_inf_nan=False, description="Sets the visibility of GFPGAN, values should be between 0 and 1.") + codeformer_visibility: float = Field(default=0, title="CodeFormer Visibility", ge=0, le=1, allow_inf_nan=False, description="Sets the visibility of CodeFormer, values should be between 0 and 1.") + codeformer_weight: float = Field(default=0, title="CodeFormer Weight", ge=0, le=1, allow_inf_nan=False, description="Sets the weight of CodeFormer, values should be between 0 and 1.") + upscaling_resize: float = Field(default=2, title="Upscaling Factor", ge=1, le=8, description="By how much to upscale the image, only used when resize_mode=0.") + upscaling_resize_w: int = Field(default=512, title="Target Width", ge=1, description="Target width for the upscaler to hit. Only used when resize_mode=1.") + upscaling_resize_h: int = Field(default=512, title="Target Height", ge=1, description="Target height for the upscaler to hit. Only used when resize_mode=1.") + upscaling_crop: bool = Field(default=True, title="Crop to fit", description="Should the upscaler crop the image to fit in the chosen size?") + upscaler_1: str = Field(default="None", title="Main upscaler", description=f"The name of the main upscaler to use, it has to be one of this list: {' , '.join([x.name for x in sd_upscalers])}") + upscaler_2: str = Field(default="None", title="Secondary upscaler", description=f"The name of the secondary upscaler to use, it has to be one of this list: {' , '.join([x.name for x in sd_upscalers])}") + extras_upscaler_2_visibility: float = Field(default=0, title="Secondary upscaler visibility", ge=0, le=1, allow_inf_nan=False, description="Sets the visibility of secondary upscaler, values should be between 0 and 1.") + upscale_first: bool = Field(default=False, title="Upscale first", description="Should the upscaler run before restoring faces?") + +class ExtraBaseResponse(BaseModel): + html_info: str = Field(title="HTML info", description="A series of HTML tags containing the process info.") + +class ExtrasSingleImageRequest(ExtrasBaseRequest): + image: str = Field(default="", title="Image", description="Image to work on, must be a Base64 string containing the image's data.") + +class ExtrasSingleImageResponse(ExtraBaseResponse): + image: str = Field(default=None, title="Image", description="The generated image in base64 format.") + +class FileData(BaseModel): + data: str = Field(title="File data", description="Base64 representation of the file") + name: str = Field(title="File name") + +class ExtrasBatchImagesRequest(ExtrasBaseRequest): + imageList: list[FileData] = Field(title="Images", description="List of images to work on. Must be Base64 strings") + +class ExtrasBatchImagesResponse(ExtraBaseResponse): + images: list[str] = Field(title="Images", description="The generated images in base64 format.") + +class PNGInfoRequest(BaseModel): + image: str = Field(title="Image", description="The base64 encoded PNG image") + +class PNGInfoResponse(BaseModel): + info: str = Field(title="Image info", description="A string with the parameters used to generate the image") + items: dict = Field(title="Items", description="A dictionary containing all the other fields the image had") + parameters: dict = Field(title="Parameters", description="A dictionary with parsed generation info fields") + +class ProgressRequest(BaseModel): + skip_current_image: bool = Field(default=False, title="Skip current image", description="Skip current image serialization") + +class ProgressResponse(BaseModel): + progress: float = Field(title="Progress", description="The progress with a range of 0 to 1") + eta_relative: float = Field(title="ETA in secs") + state: dict = Field(title="State", description="The current state snapshot") + current_image: str = Field(default=None, title="Current image", description="The current image in base64 format. opts.show_progress_every_n_steps is required for this to work.") + textinfo: str = Field(default=None, title="Info text", description="Info text used by WebUI.") + +class InterrogateRequest(BaseModel): + image: str = Field(default="", title="Image", description="Image to work on, must be a Base64 string containing the image's data.") + model: str = Field(default="clip", title="Model", description="The interrogate model used.") + +class InterrogateResponse(BaseModel): + caption: str = Field(default=None, title="Caption", description="The generated caption for the image.") + +class TrainResponse(BaseModel): + info: str = Field(title="Train info", description="Response string from train embedding or hypernetwork task.") + +class CreateResponse(BaseModel): + info: str = Field(title="Create info", description="Response string from create embedding or hypernetwork task.") + +fields = {} +for key, metadata in opts.data_labels.items(): + value = opts.data.get(key) + optType = opts.typemap.get(type(metadata.default), type(metadata.default)) if metadata.default else Any + + if metadata is not None: + fields.update({key: (Optional[optType], Field(default=metadata.default, description=metadata.label))}) + else: + fields.update({key: (Optional[optType], Field())}) + +OptionsModel = create_model("Options", **fields) + +flags = {} +_options = vars(parser)['_option_string_actions'] +for key in _options: + if(_options[key].dest != 'help'): + flag = _options[key] + _type = str + if _options[key].default is not None: + _type = type(_options[key].default) + flags.update({flag.dest: (_type, Field(default=flag.default, description=flag.help))}) + +FlagsModel = create_model("Flags", **flags) + +class SamplerItem(BaseModel): + name: str = Field(title="Name") + aliases: list[str] = Field(title="Aliases") + options: dict[str, str] = Field(title="Options") + +class UpscalerItem(BaseModel): + name: str = Field(title="Name") + model_name: Optional[str] = Field(title="Model Name") + model_path: Optional[str] = Field(title="Path") + model_url: Optional[str] = Field(title="URL") + scale: Optional[float] = Field(title="Scale") + +class LatentUpscalerModeItem(BaseModel): + name: str = Field(title="Name") + +class SDModelItem(BaseModel): + title: str = Field(title="Title") + model_name: str = Field(title="Model Name") + hash: Optional[str] = Field(title="Short hash") + sha256: Optional[str] = Field(title="sha256 hash") + filename: str = Field(title="Filename") + config: Optional[str] = Field(title="Config file") + +class SDVaeItem(BaseModel): + model_name: str = Field(title="Model Name") + filename: str = Field(title="Filename") + +class HypernetworkItem(BaseModel): + name: str = Field(title="Name") + path: Optional[str] = Field(title="Path") + +class FaceRestorerItem(BaseModel): + name: str = Field(title="Name") + cmd_dir: Optional[str] = Field(title="Path") + +class RealesrganItem(BaseModel): + name: str = Field(title="Name") + path: Optional[str] = Field(title="Path") + scale: Optional[int] = Field(title="Scale") + +class PromptStyleItem(BaseModel): + name: str = Field(title="Name") + prompt: Optional[str] = Field(title="Prompt") + negative_prompt: Optional[str] = Field(title="Negative Prompt") + + +class EmbeddingItem(BaseModel): + step: Optional[int] = Field(title="Step", description="The number of steps that were used to train this embedding, if available") + sd_checkpoint: Optional[str] = Field(title="SD Checkpoint", description="The hash of the checkpoint this embedding was trained on, if available") + sd_checkpoint_name: Optional[str] = Field(title="SD Checkpoint Name", description="The name of the checkpoint this embedding was trained on, if available. Note that this is the name that was used by the trainer; for a stable identifier, use `sd_checkpoint` instead") + shape: int = Field(title="Shape", description="The length of each individual vector in the embedding") + vectors: int = Field(title="Vectors", description="The number of vectors in the embedding") + +class EmbeddingsResponse(BaseModel): + loaded: dict[str, EmbeddingItem] = Field(title="Loaded", description="Embeddings loaded for the current model") + skipped: dict[str, EmbeddingItem] = Field(title="Skipped", description="Embeddings skipped for the current model (likely due to architecture incompatibility)") + +class MemoryResponse(BaseModel): + ram: dict = Field(title="RAM", description="System memory stats") + cuda: dict = Field(title="CUDA", description="nVidia CUDA memory stats") + + +class ScriptsList(BaseModel): + txt2img: list = Field(default=None, title="Txt2img", description="Titles of scripts (txt2img)") + img2img: list = Field(default=None, title="Img2img", description="Titles of scripts (img2img)") + + +class ScriptArg(BaseModel): + label: str = Field(default=None, title="Label", description="Name of the argument in UI") + value: Optional[Any] = Field(default=None, title="Value", description="Default value of the argument") + minimum: Optional[Any] = Field(default=None, title="Minimum", description="Minimum allowed value for the argumentin UI") + maximum: Optional[Any] = Field(default=None, title="Minimum", description="Maximum allowed value for the argumentin UI") + step: Optional[Any] = Field(default=None, title="Minimum", description="Step for changing value of the argumentin UI") + choices: Optional[list[str]] = Field(default=None, title="Choices", description="Possible values for the argument") + + +class ScriptInfo(BaseModel): + name: str = Field(default=None, title="Name", description="Script name") + is_alwayson: bool = Field(default=None, title="IsAlwayson", description="Flag specifying whether this script is an alwayson script") + is_img2img: bool = Field(default=None, title="IsImg2img", description="Flag specifying whether this script is an img2img script") + args: list[ScriptArg] = Field(title="Arguments", description="List of script's arguments") + +class ExtensionItem(BaseModel): + name: str = Field(title="Name", description="Extension name") + remote: str = Field(title="Remote", description="Extension Repository URL") + branch: str = Field(title="Branch", description="Extension Repository Branch") + commit_hash: str = Field(title="Commit Hash", description="Extension Repository Commit Hash") + version: str = Field(title="Version", description="Extension Version") + commit_date: str = Field(title="Commit Date", description="Extension Repository Commit Date") + enabled: bool = Field(title="Enabled", description="Flag specifying whether this extension is enabled") diff --git a/stable-diffusion-webui/modules/cache.py b/stable-diffusion-webui/modules/cache.py new file mode 100644 index 0000000000000000000000000000000000000000..16f39df2c6d47ab3e094348efebbb588f1af80bc --- /dev/null +++ b/stable-diffusion-webui/modules/cache.py @@ -0,0 +1,124 @@ +import json +import os +import os.path +import threading +import time + +from modules.paths import data_path, script_path + +cache_filename = os.environ.get('SD_WEBUI_CACHE_FILE', os.path.join(data_path, "cache.json")) +cache_data = None +cache_lock = threading.Lock() + +dump_cache_after = None +dump_cache_thread = None + + +def dump_cache(): + """ + Marks cache for writing to disk. 5 seconds after no one else flags the cache for writing, it is written. + """ + + global dump_cache_after + global dump_cache_thread + + def thread_func(): + global dump_cache_after + global dump_cache_thread + + while dump_cache_after is not None and time.time() < dump_cache_after: + time.sleep(1) + + with cache_lock: + cache_filename_tmp = cache_filename + "-" + with open(cache_filename_tmp, "w", encoding="utf8") as file: + json.dump(cache_data, file, indent=4, ensure_ascii=False) + + os.replace(cache_filename_tmp, cache_filename) + + dump_cache_after = None + dump_cache_thread = None + + with cache_lock: + dump_cache_after = time.time() + 5 + if dump_cache_thread is None: + dump_cache_thread = threading.Thread(name='cache-writer', target=thread_func) + dump_cache_thread.start() + + +def cache(subsection): + """ + Retrieves or initializes a cache for a specific subsection. + + Parameters: + subsection (str): The subsection identifier for the cache. + + Returns: + dict: The cache data for the specified subsection. + """ + + global cache_data + + if cache_data is None: + with cache_lock: + if cache_data is None: + if not os.path.isfile(cache_filename): + cache_data = {} + else: + try: + with open(cache_filename, "r", encoding="utf8") as file: + cache_data = json.load(file) + except Exception: + os.replace(cache_filename, os.path.join(script_path, "tmp", "cache.json")) + print('[ERROR] issue occurred while trying to read cache.json, move current cache to tmp/cache.json and create new cache') + cache_data = {} + + s = cache_data.get(subsection, {}) + cache_data[subsection] = s + + return s + + +def cached_data_for_file(subsection, title, filename, func): + """ + Retrieves or generates data for a specific file, using a caching mechanism. + + Parameters: + subsection (str): The subsection of the cache to use. + title (str): The title of the data entry in the subsection of the cache. + filename (str): The path to the file to be checked for modifications. + func (callable): A function that generates the data if it is not available in the cache. + + Returns: + dict or None: The cached or generated data, or None if data generation fails. + + The `cached_data_for_file` function implements a caching mechanism for data stored in files. + It checks if the data associated with the given `title` is present in the cache and compares the + modification time of the file with the cached modification time. If the file has been modified, + the cache is considered invalid and the data is regenerated using the provided `func`. + Otherwise, the cached data is returned. + + If the data generation fails, None is returned to indicate the failure. Otherwise, the generated + or cached data is returned as a dictionary. + """ + + existing_cache = cache(subsection) + ondisk_mtime = os.path.getmtime(filename) + + entry = existing_cache.get(title) + if entry: + cached_mtime = entry.get("mtime", 0) + if ondisk_mtime > cached_mtime: + entry = None + + if not entry or 'value' not in entry: + value = func() + if value is None: + return None + + entry = {'mtime': ondisk_mtime, 'value': value} + existing_cache[title] = entry + + dump_cache() + + return entry['value'] diff --git a/stable-diffusion-webui/modules/call_queue.py b/stable-diffusion-webui/modules/call_queue.py new file mode 100644 index 0000000000000000000000000000000000000000..396501918884db3afd352eb4dca4febd5682f4c4 --- /dev/null +++ b/stable-diffusion-webui/modules/call_queue.py @@ -0,0 +1,118 @@ +from functools import wraps +import html +import time + +from modules import shared, progress, errors, devices, fifo_lock + +queue_lock = fifo_lock.FIFOLock() + + +def wrap_queued_call(func): + def f(*args, **kwargs): + with queue_lock: + res = func(*args, **kwargs) + + return res + + return f + + +def wrap_gradio_gpu_call(func, extra_outputs=None): + @wraps(func) + def f(*args, **kwargs): + + # if the first argument is a string that says "task(...)", it is treated as a job id + if args and type(args[0]) == str and args[0].startswith("task(") and args[0].endswith(")"): + id_task = args[0] + progress.add_task_to_queue(id_task) + else: + id_task = None + + with queue_lock: + shared.state.begin(job=id_task) + progress.start_task(id_task) + + try: + res = func(*args, **kwargs) + progress.record_results(id_task, res) + finally: + progress.finish_task(id_task) + + shared.state.end() + + return res + + return wrap_gradio_call(f, extra_outputs=extra_outputs, add_stats=True) + + +def wrap_gradio_call(func, extra_outputs=None, add_stats=False): + @wraps(func) + def f(*args, extra_outputs_array=extra_outputs, **kwargs): + run_memmon = shared.opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled and add_stats + if run_memmon: + shared.mem_mon.monitor() + t = time.perf_counter() + + try: + res = list(func(*args, **kwargs)) + except Exception as e: + # When printing out our debug argument list, + # do not print out more than a 100 KB of text + max_debug_str_len = 131072 + message = "Error completing request" + arg_str = f"Arguments: {args} {kwargs}"[:max_debug_str_len] + if len(arg_str) > max_debug_str_len: + arg_str += f" (Argument list truncated at {max_debug_str_len}/{len(arg_str)} characters)" + errors.report(f"{message}\n{arg_str}", exc_info=True) + + shared.state.job = "" + shared.state.job_count = 0 + + if extra_outputs_array is None: + extra_outputs_array = [None, ''] + + error_message = f'{type(e).__name__}: {e}' + res = extra_outputs_array + [f"
{html.escape(error_message)}
"] + + devices.torch_gc() + + shared.state.skipped = False + shared.state.interrupted = False + shared.state.job_count = 0 + + if not add_stats: + return tuple(res) + + elapsed = time.perf_counter() - t + elapsed_m = int(elapsed // 60) + elapsed_s = elapsed % 60 + elapsed_text = f"{elapsed_s:.1f} sec." + if elapsed_m > 0: + elapsed_text = f"{elapsed_m} min. "+elapsed_text + + if run_memmon: + mem_stats = {k: -(v//-(1024*1024)) for k, v in shared.mem_mon.stop().items()} + active_peak = mem_stats['active_peak'] + reserved_peak = mem_stats['reserved_peak'] + sys_peak = mem_stats['system_peak'] + sys_total = mem_stats['total'] + sys_pct = sys_peak/max(sys_total, 1) * 100 + + toltip_a = "Active: peak amount of video memory used during generation (excluding cached data)" + toltip_r = "Reserved: total amout of video memory allocated by the Torch library " + toltip_sys = "System: peak amout of video memory allocated by all running programs, out of total capacity" + + text_a = f"A: {active_peak/1024:.2f} GB" + text_r = f"R: {reserved_peak/1024:.2f} GB" + text_sys = f"Sys: {sys_peak/1024:.1f}/{sys_total/1024:g} GB ({sys_pct:.1f}%)" + + vram_html = f"

{text_a}, {text_r}, {text_sys}

" + else: + vram_html = '' + + # last item is always HTML + res[-1] += f"

Time taken: {elapsed_text}

{vram_html}
" + + return tuple(res) + + return f diff --git a/stable-diffusion-webui/modules/cmd_args.py b/stable-diffusion-webui/modules/cmd_args.py new file mode 100644 index 0000000000000000000000000000000000000000..8073ed6b7b0b74f5e02535383d09ce5ea77933e7 --- /dev/null +++ b/stable-diffusion-webui/modules/cmd_args.py @@ -0,0 +1,121 @@ +import argparse +import json +import os +from modules.paths_internal import models_path, script_path, data_path, extensions_dir, extensions_builtin_dir, sd_default_config, sd_model_file # noqa: F401 + +parser = argparse.ArgumentParser() + +parser.add_argument("-f", action='store_true', help=argparse.SUPPRESS) # allows running as root; implemented outside of webui +parser.add_argument("--update-all-extensions", action='store_true', help="launch.py argument: download updates for all extensions when starting the program") +parser.add_argument("--skip-python-version-check", action='store_true', help="launch.py argument: do not check python version") +parser.add_argument("--skip-torch-cuda-test", action='store_true', help="launch.py argument: do not check if CUDA is able to work properly") +parser.add_argument("--reinstall-xformers", action='store_true', help="launch.py argument: install the appropriate version of xformers even if you have some version already installed") +parser.add_argument("--reinstall-torch", action='store_true', help="launch.py argument: install the appropriate version of torch even if you have some version already installed") +parser.add_argument("--update-check", action='store_true', help="launch.py argument: check for updates at startup") +parser.add_argument("--test-server", action='store_true', help="launch.py argument: configure server for testing") +parser.add_argument("--log-startup", action='store_true', help="launch.py argument: print a detailed log of what's happening at startup") +parser.add_argument("--skip-prepare-environment", action='store_true', help="launch.py argument: skip all environment preparation") +parser.add_argument("--skip-install", action='store_true', help="launch.py argument: skip installation of packages") +parser.add_argument("--dump-sysinfo", action='store_true', help="launch.py argument: dump limited sysinfo file (without information about extensions, options) to disk and quit") +parser.add_argument("--loglevel", type=str, help="log level; one of: CRITICAL, ERROR, WARNING, INFO, DEBUG", default=None) +parser.add_argument("--do-not-download-clip", action='store_true', help="do not download CLIP model even if it's not included in the checkpoint") +parser.add_argument("--data-dir", type=str, default=os.path.dirname(os.path.dirname(os.path.realpath(__file__))), help="base path where all user data is stored") +parser.add_argument("--config", type=str, default=sd_default_config, help="path to config which constructs model",) +parser.add_argument("--ckpt", type=str, default=sd_model_file, help="path to checkpoint of stable diffusion model; if specified, this checkpoint will be added to the list of checkpoints and loaded",) +parser.add_argument("--ckpt-dir", type=str, default=None, help="Path to directory with stable diffusion checkpoints") +parser.add_argument("--vae-dir", type=str, default=None, help="Path to directory with VAE files") +parser.add_argument("--gfpgan-dir", type=str, help="GFPGAN directory", default=('./src/gfpgan' if os.path.exists('./src/gfpgan') else './GFPGAN')) +parser.add_argument("--gfpgan-model", type=str, help="GFPGAN model file name", default=None) +parser.add_argument("--no-half", action='store_true', help="do not switch the model to 16-bit floats") +parser.add_argument("--no-half-vae", action='store_true', help="do not switch the VAE model to 16-bit floats") +parser.add_argument("--no-progressbar-hiding", action='store_true', help="do not hide progressbar in gradio UI (we hide it because it slows down ML if you have hardware acceleration in browser)") +parser.add_argument("--max-batch-count", type=int, default=16, help="maximum batch count value for the UI") +parser.add_argument("--embeddings-dir", type=str, default=os.path.join(data_path, 'embeddings'), help="embeddings directory for textual inversion (default: embeddings)") +parser.add_argument("--textual-inversion-templates-dir", type=str, default=os.path.join(script_path, 'textual_inversion_templates'), help="directory with textual inversion templates") +parser.add_argument("--hypernetwork-dir", type=str, default=os.path.join(models_path, 'hypernetworks'), help="hypernetwork directory") +parser.add_argument("--localizations-dir", type=str, default=os.path.join(script_path, 'localizations'), help="localizations directory") +parser.add_argument("--allow-code", action='store_true', help="allow custom script execution from webui") +parser.add_argument("--medvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a little speed for low VRM usage") +parser.add_argument("--medvram-sdxl", action='store_true', help="enable --medvram optimization just for SDXL models") +parser.add_argument("--lowvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a lot of speed for very low VRM usage") +parser.add_argument("--lowram", action='store_true', help="load stable diffusion checkpoint weights to VRAM instead of RAM") +parser.add_argument("--always-batch-cond-uncond", action='store_true', help="does not do anything") +parser.add_argument("--unload-gfpgan", action='store_true', help="does not do anything.") +parser.add_argument("--precision", type=str, help="evaluate at this precision", choices=["full", "autocast"], default="autocast") +parser.add_argument("--upcast-sampling", action='store_true', help="upcast sampling. No effect with --no-half. Usually produces similar results to --no-half with better performance while using less memory.") +parser.add_argument("--share", action='store_true', help="use share=True for gradio and make the UI accessible through their site") +parser.add_argument("--ngrok", type=str, help="ngrok authtoken, alternative to gradio --share", default=None) +parser.add_argument("--ngrok-region", type=str, help="does not do anything.", default="") +parser.add_argument("--ngrok-options", type=json.loads, help='The options to pass to ngrok in JSON format, e.g.: \'{"authtoken_from_env":true, "basic_auth":"user:password", "oauth_provider":"google", "oauth_allow_emails":"user@asdf.com"}\'', default=dict()) +parser.add_argument("--enable-insecure-extension-access", action='store_true', help="enable extensions tab regardless of other options") +parser.add_argument("--codeformer-models-path", type=str, help="Path to directory with codeformer model file(s).", default=os.path.join(models_path, 'Codeformer')) +parser.add_argument("--gfpgan-models-path", type=str, help="Path to directory with GFPGAN model file(s).", default=os.path.join(models_path, 'GFPGAN')) +parser.add_argument("--esrgan-models-path", type=str, help="Path to directory with ESRGAN model file(s).", default=os.path.join(models_path, 'ESRGAN')) +parser.add_argument("--bsrgan-models-path", type=str, help="Path to directory with BSRGAN model file(s).", default=os.path.join(models_path, 'BSRGAN')) +parser.add_argument("--realesrgan-models-path", type=str, help="Path to directory with RealESRGAN model file(s).", default=os.path.join(models_path, 'RealESRGAN')) +parser.add_argument("--clip-models-path", type=str, help="Path to directory with CLIP model file(s).", default=None) +parser.add_argument("--xformers", action='store_true', help="enable xformers for cross attention layers") +parser.add_argument("--force-enable-xformers", action='store_true', help="enable xformers for cross attention layers regardless of whether the checking code thinks you can run it; do not make bug reports if this fails to work") +parser.add_argument("--xformers-flash-attention", action='store_true', help="enable xformers with Flash Attention to improve reproducibility (supported for SD2.x or variant only)") +parser.add_argument("--deepdanbooru", action='store_true', help="does not do anything") +parser.add_argument("--opt-split-attention", action='store_true', help="prefer Doggettx's cross-attention layer optimization for automatic choice of optimization") +parser.add_argument("--opt-sub-quad-attention", action='store_true', help="prefer memory efficient sub-quadratic cross-attention layer optimization for automatic choice of optimization") +parser.add_argument("--sub-quad-q-chunk-size", type=int, help="query chunk size for the sub-quadratic cross-attention layer optimization to use", default=1024) +parser.add_argument("--sub-quad-kv-chunk-size", type=int, help="kv chunk size for the sub-quadratic cross-attention layer optimization to use", default=None) +parser.add_argument("--sub-quad-chunk-threshold", type=int, help="the percentage of VRAM threshold for the sub-quadratic cross-attention layer optimization to use chunking", default=None) +parser.add_argument("--opt-split-attention-invokeai", action='store_true', help="prefer InvokeAI's cross-attention layer optimization for automatic choice of optimization") +parser.add_argument("--opt-split-attention-v1", action='store_true', help="prefer older version of split attention optimization for automatic choice of optimization") +parser.add_argument("--opt-sdp-attention", action='store_true', help="prefer scaled dot product cross-attention layer optimization for automatic choice of optimization; requires PyTorch 2.*") +parser.add_argument("--opt-sdp-no-mem-attention", action='store_true', help="prefer scaled dot product cross-attention layer optimization without memory efficient attention for automatic choice of optimization, makes image generation deterministic; requires PyTorch 2.*") +parser.add_argument("--disable-opt-split-attention", action='store_true', help="prefer no cross-attention layer optimization for automatic choice of optimization") +parser.add_argument("--disable-nan-check", action='store_true', help="do not check if produced images/latent spaces have nans; useful for running without a checkpoint in CI") +parser.add_argument("--use-cpu", nargs='+', help="use CPU as torch device for specified modules", default=[], type=str.lower) +parser.add_argument("--use-ipex", action="store_true", help="use Intel XPU as torch device") +parser.add_argument("--disable-model-loading-ram-optimization", action='store_true', help="disable an optimization that reduces RAM use when loading a model") +parser.add_argument("--listen", action='store_true', help="launch gradio with 0.0.0.0 as server name, allowing to respond to network requests") +parser.add_argument("--port", type=int, help="launch gradio with given server port, you need root/admin rights for ports < 1024, defaults to 7860 if available", default=None) +parser.add_argument("--show-negative-prompt", action='store_true', help="does not do anything", default=False) +parser.add_argument("--ui-config-file", type=str, help="filename to use for ui configuration", default=os.path.join(data_path, 'ui-config.json')) +parser.add_argument("--hide-ui-dir-config", action='store_true', help="hide directory configuration from webui", default=False) +parser.add_argument("--freeze-settings", action='store_true', help="disable editing settings", default=False) +parser.add_argument("--ui-settings-file", type=str, help="filename to use for ui settings", default=os.path.join(data_path, 'config.json')) +parser.add_argument("--gradio-debug", action='store_true', help="launch gradio with --debug option") +parser.add_argument("--gradio-auth", type=str, help='set gradio authentication like "username:password"; or comma-delimit multiple like "u1:p1,u2:p2,u3:p3"', default=None) +parser.add_argument("--gradio-auth-path", type=str, help='set gradio authentication file path ex. "/path/to/auth/file" same auth format as --gradio-auth', default=None) +parser.add_argument("--gradio-img2img-tool", type=str, help='does not do anything') +parser.add_argument("--gradio-inpaint-tool", type=str, help="does not do anything") +parser.add_argument("--gradio-allowed-path", action='append', help="add path to gradio's allowed_paths, make it possible to serve files from it", default=[data_path]) +parser.add_argument("--opt-channelslast", action='store_true', help="change memory type for stable diffusion to channels last") +parser.add_argument("--styles-file", type=str, help="filename to use for styles", default=os.path.join(data_path, 'styles.csv')) +parser.add_argument("--autolaunch", action='store_true', help="open the webui URL in the system's default browser upon launch", default=False) +parser.add_argument("--theme", type=str, help="launches the UI with light or dark theme", default=None) +parser.add_argument("--use-textbox-seed", action='store_true', help="use textbox for seeds in UI (no up/down, but possible to input long seeds)", default=False) +parser.add_argument("--disable-console-progressbars", action='store_true', help="do not output progressbars to console", default=False) +parser.add_argument("--enable-console-prompts", action='store_true', help="does not do anything", default=False) # Legacy compatibility, use as default value shared.opts.enable_console_prompts +parser.add_argument('--vae-path', type=str, help='Checkpoint to use as VAE; setting this argument disables all settings related to VAE', default=None) +parser.add_argument("--disable-safe-unpickle", action='store_true', help="disable checking pytorch models for malicious code", default=False) +parser.add_argument("--api", action='store_true', help="use api=True to launch the API together with the webui (use --nowebui instead for only the API)") +parser.add_argument("--api-auth", type=str, help='Set authentication for API like "username:password"; or comma-delimit multiple like "u1:p1,u2:p2,u3:p3"', default=None) +parser.add_argument("--api-log", action='store_true', help="use api-log=True to enable logging of all API requests") +parser.add_argument("--nowebui", action='store_true', help="use api=True to launch the API instead of the webui") +parser.add_argument("--ui-debug-mode", action='store_true', help="Don't load model to quickly launch UI") +parser.add_argument("--device-id", type=str, help="Select the default CUDA device to use (export CUDA_VISIBLE_DEVICES=0,1,etc might be needed before)", default=None) +parser.add_argument("--administrator", action='store_true', help="Administrator rights", default=False) +parser.add_argument("--cors-allow-origins", type=str, help="Allowed CORS origin(s) in the form of a comma-separated list (no spaces)", default=None) +parser.add_argument("--cors-allow-origins-regex", type=str, help="Allowed CORS origin(s) in the form of a single regular expression", default=None) +parser.add_argument("--tls-keyfile", type=str, help="Partially enables TLS, requires --tls-certfile to fully function", default=None) +parser.add_argument("--tls-certfile", type=str, help="Partially enables TLS, requires --tls-keyfile to fully function", default=None) +parser.add_argument("--disable-tls-verify", action="store_false", help="When passed, enables the use of self-signed certificates.", default=None) +parser.add_argument("--server-name", type=str, help="Sets hostname of server", default=None) +parser.add_argument("--gradio-queue", action='store_true', help="does not do anything", default=True) +parser.add_argument("--no-gradio-queue", action='store_true', help="Disables gradio queue; causes the webpage to use http requests instead of websockets; was the default in earlier versions") +parser.add_argument("--skip-version-check", action='store_true', help="Do not check versions of torch and xformers") +parser.add_argument("--no-hashing", action='store_true', help="disable sha256 hashing of checkpoints to help loading performance", default=False) +parser.add_argument("--no-download-sd-model", action='store_true', help="don't download SD1.5 model even if no model is found in --ckpt-dir", default=False) +parser.add_argument('--subpath', type=str, help='customize the subpath for gradio, use with reverse proxy') +parser.add_argument('--add-stop-route', action='store_true', help='does not do anything') +parser.add_argument('--api-server-stop', action='store_true', help='enable server stop/restart/kill via api') +parser.add_argument('--timeout-keep-alive', type=int, default=30, help='set timeout_keep_alive for uvicorn') +parser.add_argument("--disable-all-extensions", action='store_true', help="prevent all extensions from running regardless of any other settings", default=False) +parser.add_argument("--disable-extra-extensions", action='store_true', help="prevent all extensions except built-in from running regardless of any other settings", default=False) +parser.add_argument("--skip-load-model-at-start", action='store_true', help="if load a model at web start, only take effect when --nowebui", ) diff --git a/stable-diffusion-webui/modules/codeformer/__pycache__/codeformer_arch.cpython-310.pyc b/stable-diffusion-webui/modules/codeformer/__pycache__/codeformer_arch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d103f32fdbf6f54a35b950bdf46a49706b427738 Binary files /dev/null and b/stable-diffusion-webui/modules/codeformer/__pycache__/codeformer_arch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/codeformer/__pycache__/vqgan_arch.cpython-310.pyc b/stable-diffusion-webui/modules/codeformer/__pycache__/vqgan_arch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..882a1d219f265970981ce30b9771fec76be9baaf Binary files /dev/null and b/stable-diffusion-webui/modules/codeformer/__pycache__/vqgan_arch.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/codeformer/codeformer_arch.py b/stable-diffusion-webui/modules/codeformer/codeformer_arch.py new file mode 100644 index 0000000000000000000000000000000000000000..12db6814268fdba5a3025f44d1bb24e93d280a69 --- /dev/null +++ b/stable-diffusion-webui/modules/codeformer/codeformer_arch.py @@ -0,0 +1,276 @@ +# this file is copied from CodeFormer repository. Please see comment in modules/codeformer_model.py + +import math +import torch +from torch import nn, Tensor +import torch.nn.functional as F +from typing import Optional + +from modules.codeformer.vqgan_arch import VQAutoEncoder, ResBlock +from basicsr.utils.registry import ARCH_REGISTRY + +def calc_mean_std(feat, eps=1e-5): + """Calculate mean and std for adaptive_instance_normalization. + + Args: + feat (Tensor): 4D tensor. + eps (float): A small value added to the variance to avoid + divide-by-zero. Default: 1e-5. + """ + size = feat.size() + assert len(size) == 4, 'The input feature should be 4D tensor.' + b, c = size[:2] + feat_var = feat.view(b, c, -1).var(dim=2) + eps + feat_std = feat_var.sqrt().view(b, c, 1, 1) + feat_mean = feat.view(b, c, -1).mean(dim=2).view(b, c, 1, 1) + return feat_mean, feat_std + + +def adaptive_instance_normalization(content_feat, style_feat): + """Adaptive instance normalization. + + Adjust the reference features to have the similar color and illuminations + as those in the degradate features. + + Args: + content_feat (Tensor): The reference feature. + style_feat (Tensor): The degradate features. + """ + size = content_feat.size() + style_mean, style_std = calc_mean_std(style_feat) + content_mean, content_std = calc_mean_std(content_feat) + normalized_feat = (content_feat - content_mean.expand(size)) / content_std.expand(size) + return normalized_feat * style_std.expand(size) + style_mean.expand(size) + + +class PositionEmbeddingSine(nn.Module): + """ + This is a more standard version of the position embedding, very similar to the one + used by the Attention is all you need paper, generalized to work on images. + """ + + def __init__(self, num_pos_feats=64, temperature=10000, normalize=False, scale=None): + super().__init__() + self.num_pos_feats = num_pos_feats + self.temperature = temperature + self.normalize = normalize + if scale is not None and normalize is False: + raise ValueError("normalize should be True if scale is passed") + if scale is None: + scale = 2 * math.pi + self.scale = scale + + def forward(self, x, mask=None): + if mask is None: + mask = torch.zeros((x.size(0), x.size(2), x.size(3)), device=x.device, dtype=torch.bool) + not_mask = ~mask + y_embed = not_mask.cumsum(1, dtype=torch.float32) + x_embed = not_mask.cumsum(2, dtype=torch.float32) + if self.normalize: + eps = 1e-6 + y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale + x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale + + dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) + dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) + + pos_x = x_embed[:, :, :, None] / dim_t + pos_y = y_embed[:, :, :, None] / dim_t + pos_x = torch.stack( + (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4 + ).flatten(3) + pos_y = torch.stack( + (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4 + ).flatten(3) + pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) + return pos + +def _get_activation_fn(activation): + """Return an activation function given a string""" + if activation == "relu": + return F.relu + if activation == "gelu": + return F.gelu + if activation == "glu": + return F.glu + raise RuntimeError(F"activation should be relu/gelu, not {activation}.") + + +class TransformerSALayer(nn.Module): + def __init__(self, embed_dim, nhead=8, dim_mlp=2048, dropout=0.0, activation="gelu"): + super().__init__() + self.self_attn = nn.MultiheadAttention(embed_dim, nhead, dropout=dropout) + # Implementation of Feedforward model - MLP + self.linear1 = nn.Linear(embed_dim, dim_mlp) + self.dropout = nn.Dropout(dropout) + self.linear2 = nn.Linear(dim_mlp, embed_dim) + + self.norm1 = nn.LayerNorm(embed_dim) + self.norm2 = nn.LayerNorm(embed_dim) + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(dropout) + + self.activation = _get_activation_fn(activation) + + def with_pos_embed(self, tensor, pos: Optional[Tensor]): + return tensor if pos is None else tensor + pos + + def forward(self, tgt, + tgt_mask: Optional[Tensor] = None, + tgt_key_padding_mask: Optional[Tensor] = None, + query_pos: Optional[Tensor] = None): + + # self attention + tgt2 = self.norm1(tgt) + q = k = self.with_pos_embed(tgt2, query_pos) + tgt2 = self.self_attn(q, k, value=tgt2, attn_mask=tgt_mask, + key_padding_mask=tgt_key_padding_mask)[0] + tgt = tgt + self.dropout1(tgt2) + + # ffn + tgt2 = self.norm2(tgt) + tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt2)))) + tgt = tgt + self.dropout2(tgt2) + return tgt + +class Fuse_sft_block(nn.Module): + def __init__(self, in_ch, out_ch): + super().__init__() + self.encode_enc = ResBlock(2*in_ch, out_ch) + + self.scale = nn.Sequential( + nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1), + nn.LeakyReLU(0.2, True), + nn.Conv2d(out_ch, out_ch, kernel_size=3, padding=1)) + + self.shift = nn.Sequential( + nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1), + nn.LeakyReLU(0.2, True), + nn.Conv2d(out_ch, out_ch, kernel_size=3, padding=1)) + + def forward(self, enc_feat, dec_feat, w=1): + enc_feat = self.encode_enc(torch.cat([enc_feat, dec_feat], dim=1)) + scale = self.scale(enc_feat) + shift = self.shift(enc_feat) + residual = w * (dec_feat * scale + shift) + out = dec_feat + residual + return out + + +@ARCH_REGISTRY.register() +class CodeFormer(VQAutoEncoder): + def __init__(self, dim_embd=512, n_head=8, n_layers=9, + codebook_size=1024, latent_size=256, + connect_list=('32', '64', '128', '256'), + fix_modules=('quantize', 'generator')): + super(CodeFormer, self).__init__(512, 64, [1, 2, 2, 4, 4, 8], 'nearest',2, [16], codebook_size) + + if fix_modules is not None: + for module in fix_modules: + for param in getattr(self, module).parameters(): + param.requires_grad = False + + self.connect_list = connect_list + self.n_layers = n_layers + self.dim_embd = dim_embd + self.dim_mlp = dim_embd*2 + + self.position_emb = nn.Parameter(torch.zeros(latent_size, self.dim_embd)) + self.feat_emb = nn.Linear(256, self.dim_embd) + + # transformer + self.ft_layers = nn.Sequential(*[TransformerSALayer(embed_dim=dim_embd, nhead=n_head, dim_mlp=self.dim_mlp, dropout=0.0) + for _ in range(self.n_layers)]) + + # logits_predict head + self.idx_pred_layer = nn.Sequential( + nn.LayerNorm(dim_embd), + nn.Linear(dim_embd, codebook_size, bias=False)) + + self.channels = { + '16': 512, + '32': 256, + '64': 256, + '128': 128, + '256': 128, + '512': 64, + } + + # after second residual block for > 16, before attn layer for ==16 + self.fuse_encoder_block = {'512':2, '256':5, '128':8, '64':11, '32':14, '16':18} + # after first residual block for > 16, before attn layer for ==16 + self.fuse_generator_block = {'16':6, '32': 9, '64':12, '128':15, '256':18, '512':21} + + # fuse_convs_dict + self.fuse_convs_dict = nn.ModuleDict() + for f_size in self.connect_list: + in_ch = self.channels[f_size] + self.fuse_convs_dict[f_size] = Fuse_sft_block(in_ch, in_ch) + + def _init_weights(self, module): + if isinstance(module, (nn.Linear, nn.Embedding)): + module.weight.data.normal_(mean=0.0, std=0.02) + if isinstance(module, nn.Linear) and module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def forward(self, x, w=0, detach_16=True, code_only=False, adain=False): + # ################### Encoder ##################### + enc_feat_dict = {} + out_list = [self.fuse_encoder_block[f_size] for f_size in self.connect_list] + for i, block in enumerate(self.encoder.blocks): + x = block(x) + if i in out_list: + enc_feat_dict[str(x.shape[-1])] = x.clone() + + lq_feat = x + # ################# Transformer ################### + # quant_feat, codebook_loss, quant_stats = self.quantize(lq_feat) + pos_emb = self.position_emb.unsqueeze(1).repeat(1,x.shape[0],1) + # BCHW -> BC(HW) -> (HW)BC + feat_emb = self.feat_emb(lq_feat.flatten(2).permute(2,0,1)) + query_emb = feat_emb + # Transformer encoder + for layer in self.ft_layers: + query_emb = layer(query_emb, query_pos=pos_emb) + + # output logits + logits = self.idx_pred_layer(query_emb) # (hw)bn + logits = logits.permute(1,0,2) # (hw)bn -> b(hw)n + + if code_only: # for training stage II + # logits doesn't need softmax before cross_entropy loss + return logits, lq_feat + + # ################# Quantization ################### + # if self.training: + # quant_feat = torch.einsum('btn,nc->btc', [soft_one_hot, self.quantize.embedding.weight]) + # # b(hw)c -> bc(hw) -> bchw + # quant_feat = quant_feat.permute(0,2,1).view(lq_feat.shape) + # ------------ + soft_one_hot = F.softmax(logits, dim=2) + _, top_idx = torch.topk(soft_one_hot, 1, dim=2) + quant_feat = self.quantize.get_codebook_feat(top_idx, shape=[x.shape[0],16,16,256]) + # preserve gradients + # quant_feat = lq_feat + (quant_feat - lq_feat).detach() + + if detach_16: + quant_feat = quant_feat.detach() # for training stage III + if adain: + quant_feat = adaptive_instance_normalization(quant_feat, lq_feat) + + # ################## Generator #################### + x = quant_feat + fuse_list = [self.fuse_generator_block[f_size] for f_size in self.connect_list] + + for i, block in enumerate(self.generator.blocks): + x = block(x) + if i in fuse_list: # fuse after i-th block + f_size = str(x.shape[-1]) + if w>0: + x = self.fuse_convs_dict[f_size](enc_feat_dict[f_size].detach(), x, w) + out = x + # logits doesn't need softmax before cross_entropy loss + return out, logits, lq_feat diff --git a/stable-diffusion-webui/modules/codeformer/vqgan_arch.py b/stable-diffusion-webui/modules/codeformer/vqgan_arch.py new file mode 100644 index 0000000000000000000000000000000000000000..09ee6660dc537e41fb9d9c7be7196c94c04aa8c6 --- /dev/null +++ b/stable-diffusion-webui/modules/codeformer/vqgan_arch.py @@ -0,0 +1,435 @@ +# this file is copied from CodeFormer repository. Please see comment in modules/codeformer_model.py + +''' +VQGAN code, adapted from the original created by the Unleashing Transformers authors: +https://github.com/samb-t/unleashing-transformers/blob/master/models/vqgan.py + +''' +import torch +import torch.nn as nn +import torch.nn.functional as F +from basicsr.utils import get_root_logger +from basicsr.utils.registry import ARCH_REGISTRY + +def normalize(in_channels): + return torch.nn.GroupNorm(num_groups=32, num_channels=in_channels, eps=1e-6, affine=True) + + +@torch.jit.script +def swish(x): + return x*torch.sigmoid(x) + + +# Define VQVAE classes +class VectorQuantizer(nn.Module): + def __init__(self, codebook_size, emb_dim, beta): + super(VectorQuantizer, self).__init__() + self.codebook_size = codebook_size # number of embeddings + self.emb_dim = emb_dim # dimension of embedding + self.beta = beta # commitment cost used in loss term, beta * ||z_e(x)-sg[e]||^2 + self.embedding = nn.Embedding(self.codebook_size, self.emb_dim) + self.embedding.weight.data.uniform_(-1.0 / self.codebook_size, 1.0 / self.codebook_size) + + def forward(self, z): + # reshape z -> (batch, height, width, channel) and flatten + z = z.permute(0, 2, 3, 1).contiguous() + z_flattened = z.view(-1, self.emb_dim) + + # distances from z to embeddings e_j (z - e)^2 = z^2 + e^2 - 2 e * z + d = (z_flattened ** 2).sum(dim=1, keepdim=True) + (self.embedding.weight**2).sum(1) - \ + 2 * torch.matmul(z_flattened, self.embedding.weight.t()) + + mean_distance = torch.mean(d) + # find closest encodings + # min_encoding_indices = torch.argmin(d, dim=1).unsqueeze(1) + min_encoding_scores, min_encoding_indices = torch.topk(d, 1, dim=1, largest=False) + # [0-1], higher score, higher confidence + min_encoding_scores = torch.exp(-min_encoding_scores/10) + + min_encodings = torch.zeros(min_encoding_indices.shape[0], self.codebook_size).to(z) + min_encodings.scatter_(1, min_encoding_indices, 1) + + # get quantized latent vectors + z_q = torch.matmul(min_encodings, self.embedding.weight).view(z.shape) + # compute loss for embedding + loss = torch.mean((z_q.detach()-z)**2) + self.beta * torch.mean((z_q - z.detach()) ** 2) + # preserve gradients + z_q = z + (z_q - z).detach() + + # perplexity + e_mean = torch.mean(min_encodings, dim=0) + perplexity = torch.exp(-torch.sum(e_mean * torch.log(e_mean + 1e-10))) + # reshape back to match original input shape + z_q = z_q.permute(0, 3, 1, 2).contiguous() + + return z_q, loss, { + "perplexity": perplexity, + "min_encodings": min_encodings, + "min_encoding_indices": min_encoding_indices, + "min_encoding_scores": min_encoding_scores, + "mean_distance": mean_distance + } + + def get_codebook_feat(self, indices, shape): + # input indices: batch*token_num -> (batch*token_num)*1 + # shape: batch, height, width, channel + indices = indices.view(-1,1) + min_encodings = torch.zeros(indices.shape[0], self.codebook_size).to(indices) + min_encodings.scatter_(1, indices, 1) + # get quantized latent vectors + z_q = torch.matmul(min_encodings.float(), self.embedding.weight) + + if shape is not None: # reshape back to match original input shape + z_q = z_q.view(shape).permute(0, 3, 1, 2).contiguous() + + return z_q + + +class GumbelQuantizer(nn.Module): + def __init__(self, codebook_size, emb_dim, num_hiddens, straight_through=False, kl_weight=5e-4, temp_init=1.0): + super().__init__() + self.codebook_size = codebook_size # number of embeddings + self.emb_dim = emb_dim # dimension of embedding + self.straight_through = straight_through + self.temperature = temp_init + self.kl_weight = kl_weight + self.proj = nn.Conv2d(num_hiddens, codebook_size, 1) # projects last encoder layer to quantized logits + self.embed = nn.Embedding(codebook_size, emb_dim) + + def forward(self, z): + hard = self.straight_through if self.training else True + + logits = self.proj(z) + + soft_one_hot = F.gumbel_softmax(logits, tau=self.temperature, dim=1, hard=hard) + + z_q = torch.einsum("b n h w, n d -> b d h w", soft_one_hot, self.embed.weight) + + # + kl divergence to the prior loss + qy = F.softmax(logits, dim=1) + diff = self.kl_weight * torch.sum(qy * torch.log(qy * self.codebook_size + 1e-10), dim=1).mean() + min_encoding_indices = soft_one_hot.argmax(dim=1) + + return z_q, diff, { + "min_encoding_indices": min_encoding_indices + } + + +class Downsample(nn.Module): + def __init__(self, in_channels): + super().__init__() + self.conv = torch.nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=2, padding=0) + + def forward(self, x): + pad = (0, 1, 0, 1) + x = torch.nn.functional.pad(x, pad, mode="constant", value=0) + x = self.conv(x) + return x + + +class Upsample(nn.Module): + def __init__(self, in_channels): + super().__init__() + self.conv = nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) + + def forward(self, x): + x = F.interpolate(x, scale_factor=2.0, mode="nearest") + x = self.conv(x) + + return x + + +class ResBlock(nn.Module): + def __init__(self, in_channels, out_channels=None): + super(ResBlock, self).__init__() + self.in_channels = in_channels + self.out_channels = in_channels if out_channels is None else out_channels + self.norm1 = normalize(in_channels) + self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1) + self.norm2 = normalize(out_channels) + self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1) + if self.in_channels != self.out_channels: + self.conv_out = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0) + + def forward(self, x_in): + x = x_in + x = self.norm1(x) + x = swish(x) + x = self.conv1(x) + x = self.norm2(x) + x = swish(x) + x = self.conv2(x) + if self.in_channels != self.out_channels: + x_in = self.conv_out(x_in) + + return x + x_in + + +class AttnBlock(nn.Module): + def __init__(self, in_channels): + super().__init__() + self.in_channels = in_channels + + self.norm = normalize(in_channels) + self.q = torch.nn.Conv2d( + in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0 + ) + self.k = torch.nn.Conv2d( + in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0 + ) + self.v = torch.nn.Conv2d( + in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0 + ) + self.proj_out = torch.nn.Conv2d( + in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0 + ) + + def forward(self, x): + h_ = x + h_ = self.norm(h_) + q = self.q(h_) + k = self.k(h_) + v = self.v(h_) + + # compute attention + b, c, h, w = q.shape + q = q.reshape(b, c, h*w) + q = q.permute(0, 2, 1) + k = k.reshape(b, c, h*w) + w_ = torch.bmm(q, k) + w_ = w_ * (int(c)**(-0.5)) + w_ = F.softmax(w_, dim=2) + + # attend to values + v = v.reshape(b, c, h*w) + w_ = w_.permute(0, 2, 1) + h_ = torch.bmm(v, w_) + h_ = h_.reshape(b, c, h, w) + + h_ = self.proj_out(h_) + + return x+h_ + + +class Encoder(nn.Module): + def __init__(self, in_channels, nf, emb_dim, ch_mult, num_res_blocks, resolution, attn_resolutions): + super().__init__() + self.nf = nf + self.num_resolutions = len(ch_mult) + self.num_res_blocks = num_res_blocks + self.resolution = resolution + self.attn_resolutions = attn_resolutions + + curr_res = self.resolution + in_ch_mult = (1,)+tuple(ch_mult) + + blocks = [] + # initial convultion + blocks.append(nn.Conv2d(in_channels, nf, kernel_size=3, stride=1, padding=1)) + + # residual and downsampling blocks, with attention on smaller res (16x16) + for i in range(self.num_resolutions): + block_in_ch = nf * in_ch_mult[i] + block_out_ch = nf * ch_mult[i] + for _ in range(self.num_res_blocks): + blocks.append(ResBlock(block_in_ch, block_out_ch)) + block_in_ch = block_out_ch + if curr_res in attn_resolutions: + blocks.append(AttnBlock(block_in_ch)) + + if i != self.num_resolutions - 1: + blocks.append(Downsample(block_in_ch)) + curr_res = curr_res // 2 + + # non-local attention block + blocks.append(ResBlock(block_in_ch, block_in_ch)) + blocks.append(AttnBlock(block_in_ch)) + blocks.append(ResBlock(block_in_ch, block_in_ch)) + + # normalise and convert to latent size + blocks.append(normalize(block_in_ch)) + blocks.append(nn.Conv2d(block_in_ch, emb_dim, kernel_size=3, stride=1, padding=1)) + self.blocks = nn.ModuleList(blocks) + + def forward(self, x): + for block in self.blocks: + x = block(x) + + return x + + +class Generator(nn.Module): + def __init__(self, nf, emb_dim, ch_mult, res_blocks, img_size, attn_resolutions): + super().__init__() + self.nf = nf + self.ch_mult = ch_mult + self.num_resolutions = len(self.ch_mult) + self.num_res_blocks = res_blocks + self.resolution = img_size + self.attn_resolutions = attn_resolutions + self.in_channels = emb_dim + self.out_channels = 3 + block_in_ch = self.nf * self.ch_mult[-1] + curr_res = self.resolution // 2 ** (self.num_resolutions-1) + + blocks = [] + # initial conv + blocks.append(nn.Conv2d(self.in_channels, block_in_ch, kernel_size=3, stride=1, padding=1)) + + # non-local attention block + blocks.append(ResBlock(block_in_ch, block_in_ch)) + blocks.append(AttnBlock(block_in_ch)) + blocks.append(ResBlock(block_in_ch, block_in_ch)) + + for i in reversed(range(self.num_resolutions)): + block_out_ch = self.nf * self.ch_mult[i] + + for _ in range(self.num_res_blocks): + blocks.append(ResBlock(block_in_ch, block_out_ch)) + block_in_ch = block_out_ch + + if curr_res in self.attn_resolutions: + blocks.append(AttnBlock(block_in_ch)) + + if i != 0: + blocks.append(Upsample(block_in_ch)) + curr_res = curr_res * 2 + + blocks.append(normalize(block_in_ch)) + blocks.append(nn.Conv2d(block_in_ch, self.out_channels, kernel_size=3, stride=1, padding=1)) + + self.blocks = nn.ModuleList(blocks) + + + def forward(self, x): + for block in self.blocks: + x = block(x) + + return x + + +@ARCH_REGISTRY.register() +class VQAutoEncoder(nn.Module): + def __init__(self, img_size, nf, ch_mult, quantizer="nearest", res_blocks=2, attn_resolutions=None, codebook_size=1024, emb_dim=256, + beta=0.25, gumbel_straight_through=False, gumbel_kl_weight=1e-8, model_path=None): + super().__init__() + logger = get_root_logger() + self.in_channels = 3 + self.nf = nf + self.n_blocks = res_blocks + self.codebook_size = codebook_size + self.embed_dim = emb_dim + self.ch_mult = ch_mult + self.resolution = img_size + self.attn_resolutions = attn_resolutions or [16] + self.quantizer_type = quantizer + self.encoder = Encoder( + self.in_channels, + self.nf, + self.embed_dim, + self.ch_mult, + self.n_blocks, + self.resolution, + self.attn_resolutions + ) + if self.quantizer_type == "nearest": + self.beta = beta #0.25 + self.quantize = VectorQuantizer(self.codebook_size, self.embed_dim, self.beta) + elif self.quantizer_type == "gumbel": + self.gumbel_num_hiddens = emb_dim + self.straight_through = gumbel_straight_through + self.kl_weight = gumbel_kl_weight + self.quantize = GumbelQuantizer( + self.codebook_size, + self.embed_dim, + self.gumbel_num_hiddens, + self.straight_through, + self.kl_weight + ) + self.generator = Generator( + self.nf, + self.embed_dim, + self.ch_mult, + self.n_blocks, + self.resolution, + self.attn_resolutions + ) + + if model_path is not None: + chkpt = torch.load(model_path, map_location='cpu') + if 'params_ema' in chkpt: + self.load_state_dict(torch.load(model_path, map_location='cpu')['params_ema']) + logger.info(f'vqgan is loaded from: {model_path} [params_ema]') + elif 'params' in chkpt: + self.load_state_dict(torch.load(model_path, map_location='cpu')['params']) + logger.info(f'vqgan is loaded from: {model_path} [params]') + else: + raise ValueError('Wrong params!') + + + def forward(self, x): + x = self.encoder(x) + quant, codebook_loss, quant_stats = self.quantize(x) + x = self.generator(quant) + return x, codebook_loss, quant_stats + + + +# patch based discriminator +@ARCH_REGISTRY.register() +class VQGANDiscriminator(nn.Module): + def __init__(self, nc=3, ndf=64, n_layers=4, model_path=None): + super().__init__() + + layers = [nn.Conv2d(nc, ndf, kernel_size=4, stride=2, padding=1), nn.LeakyReLU(0.2, True)] + ndf_mult = 1 + ndf_mult_prev = 1 + for n in range(1, n_layers): # gradually increase the number of filters + ndf_mult_prev = ndf_mult + ndf_mult = min(2 ** n, 8) + layers += [ + nn.Conv2d(ndf * ndf_mult_prev, ndf * ndf_mult, kernel_size=4, stride=2, padding=1, bias=False), + nn.BatchNorm2d(ndf * ndf_mult), + nn.LeakyReLU(0.2, True) + ] + + ndf_mult_prev = ndf_mult + ndf_mult = min(2 ** n_layers, 8) + + layers += [ + nn.Conv2d(ndf * ndf_mult_prev, ndf * ndf_mult, kernel_size=4, stride=1, padding=1, bias=False), + nn.BatchNorm2d(ndf * ndf_mult), + nn.LeakyReLU(0.2, True) + ] + + layers += [ + nn.Conv2d(ndf * ndf_mult, 1, kernel_size=4, stride=1, padding=1)] # output 1 channel prediction map + self.main = nn.Sequential(*layers) + + if model_path is not None: + chkpt = torch.load(model_path, map_location='cpu') + if 'params_d' in chkpt: + self.load_state_dict(torch.load(model_path, map_location='cpu')['params_d']) + elif 'params' in chkpt: + self.load_state_dict(torch.load(model_path, map_location='cpu')['params']) + else: + raise ValueError('Wrong params!') + + def forward(self, x): + return self.main(x) diff --git a/stable-diffusion-webui/modules/codeformer_model.py b/stable-diffusion-webui/modules/codeformer_model.py new file mode 100644 index 0000000000000000000000000000000000000000..3ad8a9db806d3406610d81534a6d7c85301cceb0 --- /dev/null +++ b/stable-diffusion-webui/modules/codeformer_model.py @@ -0,0 +1,132 @@ +import os + +import cv2 +import torch + +import modules.face_restoration +import modules.shared +from modules import shared, devices, modelloader, errors +from modules.paths import models_path + +# codeformer people made a choice to include modified basicsr library to their project which makes +# it utterly impossible to use it alongside with other libraries that also use basicsr, like GFPGAN. +# I am making a choice to include some files from codeformer to work around this issue. +model_dir = "Codeformer" +model_path = os.path.join(models_path, model_dir) +model_url = 'https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth' + +codeformer = None + + +def setup_model(dirname): + os.makedirs(model_path, exist_ok=True) + + path = modules.paths.paths.get("CodeFormer", None) + if path is None: + return + + try: + from torchvision.transforms.functional import normalize + from modules.codeformer.codeformer_arch import CodeFormer + from basicsr.utils import img2tensor, tensor2img + from facelib.utils.face_restoration_helper import FaceRestoreHelper + from facelib.detection.retinaface import retinaface + + net_class = CodeFormer + + class FaceRestorerCodeFormer(modules.face_restoration.FaceRestoration): + def name(self): + return "CodeFormer" + + def __init__(self, dirname): + self.net = None + self.face_helper = None + self.cmd_dir = dirname + + def create_models(self): + + if self.net is not None and self.face_helper is not None: + self.net.to(devices.device_codeformer) + return self.net, self.face_helper + model_paths = modelloader.load_models(model_path, model_url, self.cmd_dir, download_name='codeformer-v0.1.0.pth', ext_filter=['.pth']) + if len(model_paths) != 0: + ckpt_path = model_paths[0] + else: + print("Unable to load codeformer model.") + return None, None + net = net_class(dim_embd=512, codebook_size=1024, n_head=8, n_layers=9, connect_list=['32', '64', '128', '256']).to(devices.device_codeformer) + checkpoint = torch.load(ckpt_path)['params_ema'] + net.load_state_dict(checkpoint) + net.eval() + + if hasattr(retinaface, 'device'): + retinaface.device = devices.device_codeformer + face_helper = FaceRestoreHelper(1, face_size=512, crop_ratio=(1, 1), det_model='retinaface_resnet50', save_ext='png', use_parse=True, device=devices.device_codeformer) + + self.net = net + self.face_helper = face_helper + + return net, face_helper + + def send_model_to(self, device): + self.net.to(device) + self.face_helper.face_det.to(device) + self.face_helper.face_parse.to(device) + + def restore(self, np_image, w=None): + np_image = np_image[:, :, ::-1] + + original_resolution = np_image.shape[0:2] + + self.create_models() + if self.net is None or self.face_helper is None: + return np_image + + self.send_model_to(devices.device_codeformer) + + self.face_helper.clean_all() + self.face_helper.read_image(np_image) + self.face_helper.get_face_landmarks_5(only_center_face=False, resize=640, eye_dist_threshold=5) + self.face_helper.align_warp_face() + + for cropped_face in self.face_helper.cropped_faces: + cropped_face_t = img2tensor(cropped_face / 255., bgr2rgb=True, float32=True) + normalize(cropped_face_t, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5), inplace=True) + cropped_face_t = cropped_face_t.unsqueeze(0).to(devices.device_codeformer) + + try: + with torch.no_grad(): + output = self.net(cropped_face_t, w=w if w is not None else shared.opts.code_former_weight, adain=True)[0] + restored_face = tensor2img(output, rgb2bgr=True, min_max=(-1, 1)) + del output + devices.torch_gc() + except Exception: + errors.report('Failed inference for CodeFormer', exc_info=True) + restored_face = tensor2img(cropped_face_t, rgb2bgr=True, min_max=(-1, 1)) + + restored_face = restored_face.astype('uint8') + self.face_helper.add_restored_face(restored_face) + + self.face_helper.get_inverse_affine(None) + + restored_img = self.face_helper.paste_faces_to_input_image() + restored_img = restored_img[:, :, ::-1] + + if original_resolution != restored_img.shape[0:2]: + restored_img = cv2.resize(restored_img, (0, 0), fx=original_resolution[1]/restored_img.shape[1], fy=original_resolution[0]/restored_img.shape[0], interpolation=cv2.INTER_LINEAR) + + self.face_helper.clean_all() + + if shared.opts.face_restoration_unload: + self.send_model_to(devices.cpu) + + return restored_img + + global codeformer + codeformer = FaceRestorerCodeFormer(dirname) + shared.face_restorers.append(codeformer) + + except Exception: + errors.report("Error setting up CodeFormer", exc_info=True) + + # sys.path = stored_sys_path diff --git a/stable-diffusion-webui/modules/config_states.py b/stable-diffusion-webui/modules/config_states.py new file mode 100644 index 0000000000000000000000000000000000000000..651793c7f6f659f8751e35f894a8f588f276d9ac --- /dev/null +++ b/stable-diffusion-webui/modules/config_states.py @@ -0,0 +1,198 @@ +""" +Supports saving and restoring webui and extensions from a known working set of commits +""" + +import os +import json +import tqdm + +from datetime import datetime +import git + +from modules import shared, extensions, errors +from modules.paths_internal import script_path, config_states_dir + +all_config_states = {} + + +def list_config_states(): + global all_config_states + + all_config_states.clear() + os.makedirs(config_states_dir, exist_ok=True) + + config_states = [] + for filename in os.listdir(config_states_dir): + if filename.endswith(".json"): + path = os.path.join(config_states_dir, filename) + try: + with open(path, "r", encoding="utf-8") as f: + j = json.load(f) + assert "created_at" in j, '"created_at" does not exist' + j["filepath"] = path + config_states.append(j) + except Exception as e: + print(f'[ERROR]: Config states {path}, {e}') + + config_states = sorted(config_states, key=lambda cs: cs["created_at"], reverse=True) + + for cs in config_states: + timestamp = datetime.fromtimestamp(cs["created_at"]).strftime('%Y-%m-%d %H:%M:%S') + name = cs.get("name", "Config") + full_name = f"{name}: {timestamp}" + all_config_states[full_name] = cs + + return all_config_states + + +def get_webui_config(): + webui_repo = None + + try: + if os.path.exists(os.path.join(script_path, ".git")): + webui_repo = git.Repo(script_path) + except Exception: + errors.report(f"Error reading webui git info from {script_path}", exc_info=True) + + webui_remote = None + webui_commit_hash = None + webui_commit_date = None + webui_branch = None + if webui_repo and not webui_repo.bare: + try: + webui_remote = next(webui_repo.remote().urls, None) + head = webui_repo.head.commit + webui_commit_date = webui_repo.head.commit.committed_date + webui_commit_hash = head.hexsha + webui_branch = webui_repo.active_branch.name + + except Exception: + webui_remote = None + + return { + "remote": webui_remote, + "commit_hash": webui_commit_hash, + "commit_date": webui_commit_date, + "branch": webui_branch, + } + + +def get_extension_config(): + ext_config = {} + + for ext in extensions.extensions: + ext.read_info_from_repo() + + entry = { + "name": ext.name, + "path": ext.path, + "enabled": ext.enabled, + "is_builtin": ext.is_builtin, + "remote": ext.remote, + "commit_hash": ext.commit_hash, + "commit_date": ext.commit_date, + "branch": ext.branch, + "have_info_from_repo": ext.have_info_from_repo + } + + ext_config[ext.name] = entry + + return ext_config + + +def get_config(): + creation_time = datetime.now().timestamp() + webui_config = get_webui_config() + ext_config = get_extension_config() + + return { + "created_at": creation_time, + "webui": webui_config, + "extensions": ext_config + } + + +def restore_webui_config(config): + print("* Restoring webui state...") + + if "webui" not in config: + print("Error: No webui data saved to config") + return + + webui_config = config["webui"] + + if "commit_hash" not in webui_config: + print("Error: No commit saved to webui config") + return + + webui_commit_hash = webui_config.get("commit_hash", None) + webui_repo = None + + try: + if os.path.exists(os.path.join(script_path, ".git")): + webui_repo = git.Repo(script_path) + except Exception: + errors.report(f"Error reading webui git info from {script_path}", exc_info=True) + return + + try: + webui_repo.git.fetch(all=True) + webui_repo.git.reset(webui_commit_hash, hard=True) + print(f"* Restored webui to commit {webui_commit_hash}.") + except Exception: + errors.report(f"Error restoring webui to commit{webui_commit_hash}") + + +def restore_extension_config(config): + print("* Restoring extension state...") + + if "extensions" not in config: + print("Error: No extension data saved to config") + return + + ext_config = config["extensions"] + + results = [] + disabled = [] + + for ext in tqdm.tqdm(extensions.extensions): + if ext.is_builtin: + continue + + ext.read_info_from_repo() + current_commit = ext.commit_hash + + if ext.name not in ext_config: + ext.disabled = True + disabled.append(ext.name) + results.append((ext, current_commit[:8], False, "Saved extension state not found in config, marking as disabled")) + continue + + entry = ext_config[ext.name] + + if "commit_hash" in entry and entry["commit_hash"]: + try: + ext.fetch_and_reset_hard(entry["commit_hash"]) + ext.read_info_from_repo() + if current_commit != entry["commit_hash"]: + results.append((ext, current_commit[:8], True, entry["commit_hash"][:8])) + except Exception as ex: + results.append((ext, current_commit[:8], False, ex)) + else: + results.append((ext, current_commit[:8], False, "No commit hash found in config")) + + if not entry.get("enabled", False): + ext.disabled = True + disabled.append(ext.name) + else: + ext.disabled = False + + shared.opts.disabled_extensions = disabled + shared.opts.save(shared.config_filename) + + print("* Finished restoring extensions. Results:") + for ext, prev_commit, success, result in results: + if success: + print(f" + {ext.name}: {prev_commit} -> {result}") + else: + print(f" ! {ext.name}: FAILURE ({result})") diff --git a/stable-diffusion-webui/modules/deepbooru.py b/stable-diffusion-webui/modules/deepbooru.py new file mode 100644 index 0000000000000000000000000000000000000000..547e1b4c67aeb75a06c9991f957f51b0ef6fdd0f --- /dev/null +++ b/stable-diffusion-webui/modules/deepbooru.py @@ -0,0 +1,98 @@ +import os +import re + +import torch +import numpy as np + +from modules import modelloader, paths, deepbooru_model, devices, images, shared + +re_special = re.compile(r'([\\()])') + + +class DeepDanbooru: + def __init__(self): + self.model = None + + def load(self): + if self.model is not None: + return + + files = modelloader.load_models( + model_path=os.path.join(paths.models_path, "torch_deepdanbooru"), + model_url='https://github.com/AUTOMATIC1111/TorchDeepDanbooru/releases/download/v1/model-resnet_custom_v3.pt', + ext_filter=[".pt"], + download_name='model-resnet_custom_v3.pt', + ) + + self.model = deepbooru_model.DeepDanbooruModel() + self.model.load_state_dict(torch.load(files[0], map_location="cpu")) + + self.model.eval() + self.model.to(devices.cpu, devices.dtype) + + def start(self): + self.load() + self.model.to(devices.device) + + def stop(self): + if not shared.opts.interrogate_keep_models_in_memory: + self.model.to(devices.cpu) + devices.torch_gc() + + def tag(self, pil_image): + self.start() + res = self.tag_multi(pil_image) + self.stop() + + return res + + def tag_multi(self, pil_image, force_disable_ranks=False): + threshold = shared.opts.interrogate_deepbooru_score_threshold + use_spaces = shared.opts.deepbooru_use_spaces + use_escape = shared.opts.deepbooru_escape + alpha_sort = shared.opts.deepbooru_sort_alpha + include_ranks = shared.opts.interrogate_return_ranks and not force_disable_ranks + + pic = images.resize_image(2, pil_image.convert("RGB"), 512, 512) + a = np.expand_dims(np.array(pic, dtype=np.float32), 0) / 255 + + with torch.no_grad(), devices.autocast(): + x = torch.from_numpy(a).to(devices.device) + y = self.model(x)[0].detach().cpu().numpy() + + probability_dict = {} + + for tag, probability in zip(self.model.tags, y): + if probability < threshold: + continue + + if tag.startswith("rating:"): + continue + + probability_dict[tag] = probability + + if alpha_sort: + tags = sorted(probability_dict) + else: + tags = [tag for tag, _ in sorted(probability_dict.items(), key=lambda x: -x[1])] + + res = [] + + filtertags = {x.strip().replace(' ', '_') for x in shared.opts.deepbooru_filter_tags.split(",")} + + for tag in [x for x in tags if x not in filtertags]: + probability = probability_dict[tag] + tag_outformat = tag + if use_spaces: + tag_outformat = tag_outformat.replace('_', ' ') + if use_escape: + tag_outformat = re.sub(re_special, r'\\\1', tag_outformat) + if include_ranks: + tag_outformat = f"({tag_outformat}:{probability:.3f})" + + res.append(tag_outformat) + + return ", ".join(res) + + +model = DeepDanbooru() diff --git a/stable-diffusion-webui/modules/deepbooru_model.py b/stable-diffusion-webui/modules/deepbooru_model.py new file mode 100644 index 0000000000000000000000000000000000000000..7a53884624e96284c35214ce02b8a2891d92c3e8 --- /dev/null +++ b/stable-diffusion-webui/modules/deepbooru_model.py @@ -0,0 +1,678 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from modules import devices + +# see https://github.com/AUTOMATIC1111/TorchDeepDanbooru for more + + +class DeepDanbooruModel(nn.Module): + def __init__(self): + super(DeepDanbooruModel, self).__init__() + + self.tags = [] + + self.n_Conv_0 = nn.Conv2d(kernel_size=(7, 7), in_channels=3, out_channels=64, stride=(2, 2)) + self.n_MaxPool_0 = nn.MaxPool2d(kernel_size=(3, 3), stride=(2, 2)) + self.n_Conv_1 = nn.Conv2d(kernel_size=(1, 1), in_channels=64, out_channels=256) + self.n_Conv_2 = nn.Conv2d(kernel_size=(1, 1), in_channels=64, out_channels=64) + self.n_Conv_3 = nn.Conv2d(kernel_size=(3, 3), in_channels=64, out_channels=64) + self.n_Conv_4 = nn.Conv2d(kernel_size=(1, 1), in_channels=64, out_channels=256) + self.n_Conv_5 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=64) + self.n_Conv_6 = nn.Conv2d(kernel_size=(3, 3), in_channels=64, out_channels=64) + self.n_Conv_7 = nn.Conv2d(kernel_size=(1, 1), in_channels=64, out_channels=256) + self.n_Conv_8 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=64) + self.n_Conv_9 = nn.Conv2d(kernel_size=(3, 3), in_channels=64, out_channels=64) + self.n_Conv_10 = nn.Conv2d(kernel_size=(1, 1), in_channels=64, out_channels=256) + self.n_Conv_11 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=512, stride=(2, 2)) + self.n_Conv_12 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=128) + self.n_Conv_13 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128, stride=(2, 2)) + self.n_Conv_14 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_15 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_16 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_17 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_18 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_19 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_20 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_21 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_22 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_23 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_24 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_25 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_26 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_27 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_28 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_29 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_30 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_31 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_32 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_33 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=128) + self.n_Conv_34 = nn.Conv2d(kernel_size=(3, 3), in_channels=128, out_channels=128) + self.n_Conv_35 = nn.Conv2d(kernel_size=(1, 1), in_channels=128, out_channels=512) + self.n_Conv_36 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=1024, stride=(2, 2)) + self.n_Conv_37 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=256) + self.n_Conv_38 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256, stride=(2, 2)) + self.n_Conv_39 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_40 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_41 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_42 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_43 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_44 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_45 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_46 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_47 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_48 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_49 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_50 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_51 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_52 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_53 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_54 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_55 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_56 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_57 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_58 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_59 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_60 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_61 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_62 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_63 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_64 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_65 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_66 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_67 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_68 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_69 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_70 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_71 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_72 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_73 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_74 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_75 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_76 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_77 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_78 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_79 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_80 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_81 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_82 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_83 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_84 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_85 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_86 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_87 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_88 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_89 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_90 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_91 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_92 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_93 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_94 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_95 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_96 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_97 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_98 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256, stride=(2, 2)) + self.n_Conv_99 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_100 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=1024, stride=(2, 2)) + self.n_Conv_101 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_102 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_103 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_104 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_105 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_106 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_107 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_108 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_109 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_110 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_111 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_112 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_113 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_114 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_115 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_116 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_117 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_118 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_119 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_120 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_121 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_122 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_123 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_124 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_125 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_126 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_127 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_128 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_129 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_130 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_131 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_132 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_133 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_134 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_135 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_136 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_137 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_138 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_139 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_140 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_141 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_142 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_143 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_144 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_145 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_146 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_147 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_148 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_149 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_150 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_151 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_152 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_153 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_154 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_155 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=256) + self.n_Conv_156 = nn.Conv2d(kernel_size=(3, 3), in_channels=256, out_channels=256) + self.n_Conv_157 = nn.Conv2d(kernel_size=(1, 1), in_channels=256, out_channels=1024) + self.n_Conv_158 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=2048, stride=(2, 2)) + self.n_Conv_159 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=512) + self.n_Conv_160 = nn.Conv2d(kernel_size=(3, 3), in_channels=512, out_channels=512, stride=(2, 2)) + self.n_Conv_161 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=2048) + self.n_Conv_162 = nn.Conv2d(kernel_size=(1, 1), in_channels=2048, out_channels=512) + self.n_Conv_163 = nn.Conv2d(kernel_size=(3, 3), in_channels=512, out_channels=512) + self.n_Conv_164 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=2048) + self.n_Conv_165 = nn.Conv2d(kernel_size=(1, 1), in_channels=2048, out_channels=512) + self.n_Conv_166 = nn.Conv2d(kernel_size=(3, 3), in_channels=512, out_channels=512) + self.n_Conv_167 = nn.Conv2d(kernel_size=(1, 1), in_channels=512, out_channels=2048) + self.n_Conv_168 = nn.Conv2d(kernel_size=(1, 1), in_channels=2048, out_channels=4096, stride=(2, 2)) + self.n_Conv_169 = nn.Conv2d(kernel_size=(1, 1), in_channels=2048, out_channels=1024) + self.n_Conv_170 = nn.Conv2d(kernel_size=(3, 3), in_channels=1024, out_channels=1024, stride=(2, 2)) + self.n_Conv_171 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=4096) + self.n_Conv_172 = nn.Conv2d(kernel_size=(1, 1), in_channels=4096, out_channels=1024) + self.n_Conv_173 = nn.Conv2d(kernel_size=(3, 3), in_channels=1024, out_channels=1024) + self.n_Conv_174 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=4096) + self.n_Conv_175 = nn.Conv2d(kernel_size=(1, 1), in_channels=4096, out_channels=1024) + self.n_Conv_176 = nn.Conv2d(kernel_size=(3, 3), in_channels=1024, out_channels=1024) + self.n_Conv_177 = nn.Conv2d(kernel_size=(1, 1), in_channels=1024, out_channels=4096) + self.n_Conv_178 = nn.Conv2d(kernel_size=(1, 1), in_channels=4096, out_channels=9176, bias=False) + + def forward(self, *inputs): + t_358, = inputs + t_359 = t_358.permute(*[0, 3, 1, 2]) + t_359_padded = F.pad(t_359, [2, 3, 2, 3], value=0) + t_360 = self.n_Conv_0(t_359_padded.to(self.n_Conv_0.bias.dtype) if devices.unet_needs_upcast else t_359_padded) + t_361 = F.relu(t_360) + t_361 = F.pad(t_361, [0, 1, 0, 1], value=float('-inf')) + t_362 = self.n_MaxPool_0(t_361) + t_363 = self.n_Conv_1(t_362) + t_364 = self.n_Conv_2(t_362) + t_365 = F.relu(t_364) + t_365_padded = F.pad(t_365, [1, 1, 1, 1], value=0) + t_366 = self.n_Conv_3(t_365_padded) + t_367 = F.relu(t_366) + t_368 = self.n_Conv_4(t_367) + t_369 = torch.add(t_368, t_363) + t_370 = F.relu(t_369) + t_371 = self.n_Conv_5(t_370) + t_372 = F.relu(t_371) + t_372_padded = F.pad(t_372, [1, 1, 1, 1], value=0) + t_373 = self.n_Conv_6(t_372_padded) + t_374 = F.relu(t_373) + t_375 = self.n_Conv_7(t_374) + t_376 = torch.add(t_375, t_370) + t_377 = F.relu(t_376) + t_378 = self.n_Conv_8(t_377) + t_379 = F.relu(t_378) + t_379_padded = F.pad(t_379, [1, 1, 1, 1], value=0) + t_380 = self.n_Conv_9(t_379_padded) + t_381 = F.relu(t_380) + t_382 = self.n_Conv_10(t_381) + t_383 = torch.add(t_382, t_377) + t_384 = F.relu(t_383) + t_385 = self.n_Conv_11(t_384) + t_386 = self.n_Conv_12(t_384) + t_387 = F.relu(t_386) + t_387_padded = F.pad(t_387, [0, 1, 0, 1], value=0) + t_388 = self.n_Conv_13(t_387_padded) + t_389 = F.relu(t_388) + t_390 = self.n_Conv_14(t_389) + t_391 = torch.add(t_390, t_385) + t_392 = F.relu(t_391) + t_393 = self.n_Conv_15(t_392) + t_394 = F.relu(t_393) + t_394_padded = F.pad(t_394, [1, 1, 1, 1], value=0) + t_395 = self.n_Conv_16(t_394_padded) + t_396 = F.relu(t_395) + t_397 = self.n_Conv_17(t_396) + t_398 = torch.add(t_397, t_392) + t_399 = F.relu(t_398) + t_400 = self.n_Conv_18(t_399) + t_401 = F.relu(t_400) + t_401_padded = F.pad(t_401, [1, 1, 1, 1], value=0) + t_402 = self.n_Conv_19(t_401_padded) + t_403 = F.relu(t_402) + t_404 = self.n_Conv_20(t_403) + t_405 = torch.add(t_404, t_399) + t_406 = F.relu(t_405) + t_407 = self.n_Conv_21(t_406) + t_408 = F.relu(t_407) + t_408_padded = F.pad(t_408, [1, 1, 1, 1], value=0) + t_409 = self.n_Conv_22(t_408_padded) + t_410 = F.relu(t_409) + t_411 = self.n_Conv_23(t_410) + t_412 = torch.add(t_411, t_406) + t_413 = F.relu(t_412) + t_414 = self.n_Conv_24(t_413) + t_415 = F.relu(t_414) + t_415_padded = F.pad(t_415, [1, 1, 1, 1], value=0) + t_416 = self.n_Conv_25(t_415_padded) + t_417 = F.relu(t_416) + t_418 = self.n_Conv_26(t_417) + t_419 = torch.add(t_418, t_413) + t_420 = F.relu(t_419) + t_421 = self.n_Conv_27(t_420) + t_422 = F.relu(t_421) + t_422_padded = F.pad(t_422, [1, 1, 1, 1], value=0) + t_423 = self.n_Conv_28(t_422_padded) + t_424 = F.relu(t_423) + t_425 = self.n_Conv_29(t_424) + t_426 = torch.add(t_425, t_420) + t_427 = F.relu(t_426) + t_428 = self.n_Conv_30(t_427) + t_429 = F.relu(t_428) + t_429_padded = F.pad(t_429, [1, 1, 1, 1], value=0) + t_430 = self.n_Conv_31(t_429_padded) + t_431 = F.relu(t_430) + t_432 = self.n_Conv_32(t_431) + t_433 = torch.add(t_432, t_427) + t_434 = F.relu(t_433) + t_435 = self.n_Conv_33(t_434) + t_436 = F.relu(t_435) + t_436_padded = F.pad(t_436, [1, 1, 1, 1], value=0) + t_437 = self.n_Conv_34(t_436_padded) + t_438 = F.relu(t_437) + t_439 = self.n_Conv_35(t_438) + t_440 = torch.add(t_439, t_434) + t_441 = F.relu(t_440) + t_442 = self.n_Conv_36(t_441) + t_443 = self.n_Conv_37(t_441) + t_444 = F.relu(t_443) + t_444_padded = F.pad(t_444, [0, 1, 0, 1], value=0) + t_445 = self.n_Conv_38(t_444_padded) + t_446 = F.relu(t_445) + t_447 = self.n_Conv_39(t_446) + t_448 = torch.add(t_447, t_442) + t_449 = F.relu(t_448) + t_450 = self.n_Conv_40(t_449) + t_451 = F.relu(t_450) + t_451_padded = F.pad(t_451, [1, 1, 1, 1], value=0) + t_452 = self.n_Conv_41(t_451_padded) + t_453 = F.relu(t_452) + t_454 = self.n_Conv_42(t_453) + t_455 = torch.add(t_454, t_449) + t_456 = F.relu(t_455) + t_457 = self.n_Conv_43(t_456) + t_458 = F.relu(t_457) + t_458_padded = F.pad(t_458, [1, 1, 1, 1], value=0) + t_459 = self.n_Conv_44(t_458_padded) + t_460 = F.relu(t_459) + t_461 = self.n_Conv_45(t_460) + t_462 = torch.add(t_461, t_456) + t_463 = F.relu(t_462) + t_464 = self.n_Conv_46(t_463) + t_465 = F.relu(t_464) + t_465_padded = F.pad(t_465, [1, 1, 1, 1], value=0) + t_466 = self.n_Conv_47(t_465_padded) + t_467 = F.relu(t_466) + t_468 = self.n_Conv_48(t_467) + t_469 = torch.add(t_468, t_463) + t_470 = F.relu(t_469) + t_471 = self.n_Conv_49(t_470) + t_472 = F.relu(t_471) + t_472_padded = F.pad(t_472, [1, 1, 1, 1], value=0) + t_473 = self.n_Conv_50(t_472_padded) + t_474 = F.relu(t_473) + t_475 = self.n_Conv_51(t_474) + t_476 = torch.add(t_475, t_470) + t_477 = F.relu(t_476) + t_478 = self.n_Conv_52(t_477) + t_479 = F.relu(t_478) + t_479_padded = F.pad(t_479, [1, 1, 1, 1], value=0) + t_480 = self.n_Conv_53(t_479_padded) + t_481 = F.relu(t_480) + t_482 = self.n_Conv_54(t_481) + t_483 = torch.add(t_482, t_477) + t_484 = F.relu(t_483) + t_485 = self.n_Conv_55(t_484) + t_486 = F.relu(t_485) + t_486_padded = F.pad(t_486, [1, 1, 1, 1], value=0) + t_487 = self.n_Conv_56(t_486_padded) + t_488 = F.relu(t_487) + t_489 = self.n_Conv_57(t_488) + t_490 = torch.add(t_489, t_484) + t_491 = F.relu(t_490) + t_492 = self.n_Conv_58(t_491) + t_493 = F.relu(t_492) + t_493_padded = F.pad(t_493, [1, 1, 1, 1], value=0) + t_494 = self.n_Conv_59(t_493_padded) + t_495 = F.relu(t_494) + t_496 = self.n_Conv_60(t_495) + t_497 = torch.add(t_496, t_491) + t_498 = F.relu(t_497) + t_499 = self.n_Conv_61(t_498) + t_500 = F.relu(t_499) + t_500_padded = F.pad(t_500, [1, 1, 1, 1], value=0) + t_501 = self.n_Conv_62(t_500_padded) + t_502 = F.relu(t_501) + t_503 = self.n_Conv_63(t_502) + t_504 = torch.add(t_503, t_498) + t_505 = F.relu(t_504) + t_506 = self.n_Conv_64(t_505) + t_507 = F.relu(t_506) + t_507_padded = F.pad(t_507, [1, 1, 1, 1], value=0) + t_508 = self.n_Conv_65(t_507_padded) + t_509 = F.relu(t_508) + t_510 = self.n_Conv_66(t_509) + t_511 = torch.add(t_510, t_505) + t_512 = F.relu(t_511) + t_513 = self.n_Conv_67(t_512) + t_514 = F.relu(t_513) + t_514_padded = F.pad(t_514, [1, 1, 1, 1], value=0) + t_515 = self.n_Conv_68(t_514_padded) + t_516 = F.relu(t_515) + t_517 = self.n_Conv_69(t_516) + t_518 = torch.add(t_517, t_512) + t_519 = F.relu(t_518) + t_520 = self.n_Conv_70(t_519) + t_521 = F.relu(t_520) + t_521_padded = F.pad(t_521, [1, 1, 1, 1], value=0) + t_522 = self.n_Conv_71(t_521_padded) + t_523 = F.relu(t_522) + t_524 = self.n_Conv_72(t_523) + t_525 = torch.add(t_524, t_519) + t_526 = F.relu(t_525) + t_527 = self.n_Conv_73(t_526) + t_528 = F.relu(t_527) + t_528_padded = F.pad(t_528, [1, 1, 1, 1], value=0) + t_529 = self.n_Conv_74(t_528_padded) + t_530 = F.relu(t_529) + t_531 = self.n_Conv_75(t_530) + t_532 = torch.add(t_531, t_526) + t_533 = F.relu(t_532) + t_534 = self.n_Conv_76(t_533) + t_535 = F.relu(t_534) + t_535_padded = F.pad(t_535, [1, 1, 1, 1], value=0) + t_536 = self.n_Conv_77(t_535_padded) + t_537 = F.relu(t_536) + t_538 = self.n_Conv_78(t_537) + t_539 = torch.add(t_538, t_533) + t_540 = F.relu(t_539) + t_541 = self.n_Conv_79(t_540) + t_542 = F.relu(t_541) + t_542_padded = F.pad(t_542, [1, 1, 1, 1], value=0) + t_543 = self.n_Conv_80(t_542_padded) + t_544 = F.relu(t_543) + t_545 = self.n_Conv_81(t_544) + t_546 = torch.add(t_545, t_540) + t_547 = F.relu(t_546) + t_548 = self.n_Conv_82(t_547) + t_549 = F.relu(t_548) + t_549_padded = F.pad(t_549, [1, 1, 1, 1], value=0) + t_550 = self.n_Conv_83(t_549_padded) + t_551 = F.relu(t_550) + t_552 = self.n_Conv_84(t_551) + t_553 = torch.add(t_552, t_547) + t_554 = F.relu(t_553) + t_555 = self.n_Conv_85(t_554) + t_556 = F.relu(t_555) + t_556_padded = F.pad(t_556, [1, 1, 1, 1], value=0) + t_557 = self.n_Conv_86(t_556_padded) + t_558 = F.relu(t_557) + t_559 = self.n_Conv_87(t_558) + t_560 = torch.add(t_559, t_554) + t_561 = F.relu(t_560) + t_562 = self.n_Conv_88(t_561) + t_563 = F.relu(t_562) + t_563_padded = F.pad(t_563, [1, 1, 1, 1], value=0) + t_564 = self.n_Conv_89(t_563_padded) + t_565 = F.relu(t_564) + t_566 = self.n_Conv_90(t_565) + t_567 = torch.add(t_566, t_561) + t_568 = F.relu(t_567) + t_569 = self.n_Conv_91(t_568) + t_570 = F.relu(t_569) + t_570_padded = F.pad(t_570, [1, 1, 1, 1], value=0) + t_571 = self.n_Conv_92(t_570_padded) + t_572 = F.relu(t_571) + t_573 = self.n_Conv_93(t_572) + t_574 = torch.add(t_573, t_568) + t_575 = F.relu(t_574) + t_576 = self.n_Conv_94(t_575) + t_577 = F.relu(t_576) + t_577_padded = F.pad(t_577, [1, 1, 1, 1], value=0) + t_578 = self.n_Conv_95(t_577_padded) + t_579 = F.relu(t_578) + t_580 = self.n_Conv_96(t_579) + t_581 = torch.add(t_580, t_575) + t_582 = F.relu(t_581) + t_583 = self.n_Conv_97(t_582) + t_584 = F.relu(t_583) + t_584_padded = F.pad(t_584, [0, 1, 0, 1], value=0) + t_585 = self.n_Conv_98(t_584_padded) + t_586 = F.relu(t_585) + t_587 = self.n_Conv_99(t_586) + t_588 = self.n_Conv_100(t_582) + t_589 = torch.add(t_587, t_588) + t_590 = F.relu(t_589) + t_591 = self.n_Conv_101(t_590) + t_592 = F.relu(t_591) + t_592_padded = F.pad(t_592, [1, 1, 1, 1], value=0) + t_593 = self.n_Conv_102(t_592_padded) + t_594 = F.relu(t_593) + t_595 = self.n_Conv_103(t_594) + t_596 = torch.add(t_595, t_590) + t_597 = F.relu(t_596) + t_598 = self.n_Conv_104(t_597) + t_599 = F.relu(t_598) + t_599_padded = F.pad(t_599, [1, 1, 1, 1], value=0) + t_600 = self.n_Conv_105(t_599_padded) + t_601 = F.relu(t_600) + t_602 = self.n_Conv_106(t_601) + t_603 = torch.add(t_602, t_597) + t_604 = F.relu(t_603) + t_605 = self.n_Conv_107(t_604) + t_606 = F.relu(t_605) + t_606_padded = F.pad(t_606, [1, 1, 1, 1], value=0) + t_607 = self.n_Conv_108(t_606_padded) + t_608 = F.relu(t_607) + t_609 = self.n_Conv_109(t_608) + t_610 = torch.add(t_609, t_604) + t_611 = F.relu(t_610) + t_612 = self.n_Conv_110(t_611) + t_613 = F.relu(t_612) + t_613_padded = F.pad(t_613, [1, 1, 1, 1], value=0) + t_614 = self.n_Conv_111(t_613_padded) + t_615 = F.relu(t_614) + t_616 = self.n_Conv_112(t_615) + t_617 = torch.add(t_616, t_611) + t_618 = F.relu(t_617) + t_619 = self.n_Conv_113(t_618) + t_620 = F.relu(t_619) + t_620_padded = F.pad(t_620, [1, 1, 1, 1], value=0) + t_621 = self.n_Conv_114(t_620_padded) + t_622 = F.relu(t_621) + t_623 = self.n_Conv_115(t_622) + t_624 = torch.add(t_623, t_618) + t_625 = F.relu(t_624) + t_626 = self.n_Conv_116(t_625) + t_627 = F.relu(t_626) + t_627_padded = F.pad(t_627, [1, 1, 1, 1], value=0) + t_628 = self.n_Conv_117(t_627_padded) + t_629 = F.relu(t_628) + t_630 = self.n_Conv_118(t_629) + t_631 = torch.add(t_630, t_625) + t_632 = F.relu(t_631) + t_633 = self.n_Conv_119(t_632) + t_634 = F.relu(t_633) + t_634_padded = F.pad(t_634, [1, 1, 1, 1], value=0) + t_635 = self.n_Conv_120(t_634_padded) + t_636 = F.relu(t_635) + t_637 = self.n_Conv_121(t_636) + t_638 = torch.add(t_637, t_632) + t_639 = F.relu(t_638) + t_640 = self.n_Conv_122(t_639) + t_641 = F.relu(t_640) + t_641_padded = F.pad(t_641, [1, 1, 1, 1], value=0) + t_642 = self.n_Conv_123(t_641_padded) + t_643 = F.relu(t_642) + t_644 = self.n_Conv_124(t_643) + t_645 = torch.add(t_644, t_639) + t_646 = F.relu(t_645) + t_647 = self.n_Conv_125(t_646) + t_648 = F.relu(t_647) + t_648_padded = F.pad(t_648, [1, 1, 1, 1], value=0) + t_649 = self.n_Conv_126(t_648_padded) + t_650 = F.relu(t_649) + t_651 = self.n_Conv_127(t_650) + t_652 = torch.add(t_651, t_646) + t_653 = F.relu(t_652) + t_654 = self.n_Conv_128(t_653) + t_655 = F.relu(t_654) + t_655_padded = F.pad(t_655, [1, 1, 1, 1], value=0) + t_656 = self.n_Conv_129(t_655_padded) + t_657 = F.relu(t_656) + t_658 = self.n_Conv_130(t_657) + t_659 = torch.add(t_658, t_653) + t_660 = F.relu(t_659) + t_661 = self.n_Conv_131(t_660) + t_662 = F.relu(t_661) + t_662_padded = F.pad(t_662, [1, 1, 1, 1], value=0) + t_663 = self.n_Conv_132(t_662_padded) + t_664 = F.relu(t_663) + t_665 = self.n_Conv_133(t_664) + t_666 = torch.add(t_665, t_660) + t_667 = F.relu(t_666) + t_668 = self.n_Conv_134(t_667) + t_669 = F.relu(t_668) + t_669_padded = F.pad(t_669, [1, 1, 1, 1], value=0) + t_670 = self.n_Conv_135(t_669_padded) + t_671 = F.relu(t_670) + t_672 = self.n_Conv_136(t_671) + t_673 = torch.add(t_672, t_667) + t_674 = F.relu(t_673) + t_675 = self.n_Conv_137(t_674) + t_676 = F.relu(t_675) + t_676_padded = F.pad(t_676, [1, 1, 1, 1], value=0) + t_677 = self.n_Conv_138(t_676_padded) + t_678 = F.relu(t_677) + t_679 = self.n_Conv_139(t_678) + t_680 = torch.add(t_679, t_674) + t_681 = F.relu(t_680) + t_682 = self.n_Conv_140(t_681) + t_683 = F.relu(t_682) + t_683_padded = F.pad(t_683, [1, 1, 1, 1], value=0) + t_684 = self.n_Conv_141(t_683_padded) + t_685 = F.relu(t_684) + t_686 = self.n_Conv_142(t_685) + t_687 = torch.add(t_686, t_681) + t_688 = F.relu(t_687) + t_689 = self.n_Conv_143(t_688) + t_690 = F.relu(t_689) + t_690_padded = F.pad(t_690, [1, 1, 1, 1], value=0) + t_691 = self.n_Conv_144(t_690_padded) + t_692 = F.relu(t_691) + t_693 = self.n_Conv_145(t_692) + t_694 = torch.add(t_693, t_688) + t_695 = F.relu(t_694) + t_696 = self.n_Conv_146(t_695) + t_697 = F.relu(t_696) + t_697_padded = F.pad(t_697, [1, 1, 1, 1], value=0) + t_698 = self.n_Conv_147(t_697_padded) + t_699 = F.relu(t_698) + t_700 = self.n_Conv_148(t_699) + t_701 = torch.add(t_700, t_695) + t_702 = F.relu(t_701) + t_703 = self.n_Conv_149(t_702) + t_704 = F.relu(t_703) + t_704_padded = F.pad(t_704, [1, 1, 1, 1], value=0) + t_705 = self.n_Conv_150(t_704_padded) + t_706 = F.relu(t_705) + t_707 = self.n_Conv_151(t_706) + t_708 = torch.add(t_707, t_702) + t_709 = F.relu(t_708) + t_710 = self.n_Conv_152(t_709) + t_711 = F.relu(t_710) + t_711_padded = F.pad(t_711, [1, 1, 1, 1], value=0) + t_712 = self.n_Conv_153(t_711_padded) + t_713 = F.relu(t_712) + t_714 = self.n_Conv_154(t_713) + t_715 = torch.add(t_714, t_709) + t_716 = F.relu(t_715) + t_717 = self.n_Conv_155(t_716) + t_718 = F.relu(t_717) + t_718_padded = F.pad(t_718, [1, 1, 1, 1], value=0) + t_719 = self.n_Conv_156(t_718_padded) + t_720 = F.relu(t_719) + t_721 = self.n_Conv_157(t_720) + t_722 = torch.add(t_721, t_716) + t_723 = F.relu(t_722) + t_724 = self.n_Conv_158(t_723) + t_725 = self.n_Conv_159(t_723) + t_726 = F.relu(t_725) + t_726_padded = F.pad(t_726, [0, 1, 0, 1], value=0) + t_727 = self.n_Conv_160(t_726_padded) + t_728 = F.relu(t_727) + t_729 = self.n_Conv_161(t_728) + t_730 = torch.add(t_729, t_724) + t_731 = F.relu(t_730) + t_732 = self.n_Conv_162(t_731) + t_733 = F.relu(t_732) + t_733_padded = F.pad(t_733, [1, 1, 1, 1], value=0) + t_734 = self.n_Conv_163(t_733_padded) + t_735 = F.relu(t_734) + t_736 = self.n_Conv_164(t_735) + t_737 = torch.add(t_736, t_731) + t_738 = F.relu(t_737) + t_739 = self.n_Conv_165(t_738) + t_740 = F.relu(t_739) + t_740_padded = F.pad(t_740, [1, 1, 1, 1], value=0) + t_741 = self.n_Conv_166(t_740_padded) + t_742 = F.relu(t_741) + t_743 = self.n_Conv_167(t_742) + t_744 = torch.add(t_743, t_738) + t_745 = F.relu(t_744) + t_746 = self.n_Conv_168(t_745) + t_747 = self.n_Conv_169(t_745) + t_748 = F.relu(t_747) + t_748_padded = F.pad(t_748, [0, 1, 0, 1], value=0) + t_749 = self.n_Conv_170(t_748_padded) + t_750 = F.relu(t_749) + t_751 = self.n_Conv_171(t_750) + t_752 = torch.add(t_751, t_746) + t_753 = F.relu(t_752) + t_754 = self.n_Conv_172(t_753) + t_755 = F.relu(t_754) + t_755_padded = F.pad(t_755, [1, 1, 1, 1], value=0) + t_756 = self.n_Conv_173(t_755_padded) + t_757 = F.relu(t_756) + t_758 = self.n_Conv_174(t_757) + t_759 = torch.add(t_758, t_753) + t_760 = F.relu(t_759) + t_761 = self.n_Conv_175(t_760) + t_762 = F.relu(t_761) + t_762_padded = F.pad(t_762, [1, 1, 1, 1], value=0) + t_763 = self.n_Conv_176(t_762_padded) + t_764 = F.relu(t_763) + t_765 = self.n_Conv_177(t_764) + t_766 = torch.add(t_765, t_760) + t_767 = F.relu(t_766) + t_768 = self.n_Conv_178(t_767) + t_769 = F.avg_pool2d(t_768, kernel_size=t_768.shape[-2:]) + t_770 = torch.squeeze(t_769, 3) + t_770 = torch.squeeze(t_770, 2) + t_771 = torch.sigmoid(t_770) + return t_771 + + def load_state_dict(self, state_dict, **kwargs): + self.tags = state_dict.get('tags', []) + + super(DeepDanbooruModel, self).load_state_dict({k: v for k, v in state_dict.items() if k != 'tags'}) + diff --git a/stable-diffusion-webui/modules/devices.py b/stable-diffusion-webui/modules/devices.py new file mode 100644 index 0000000000000000000000000000000000000000..ea1f712f95040d3fc4205ea7cd3aef134724ccfc --- /dev/null +++ b/stable-diffusion-webui/modules/devices.py @@ -0,0 +1,167 @@ +import sys +import contextlib +from functools import lru_cache + +import torch +from modules import errors, shared + +if sys.platform == "darwin": + from modules import mac_specific + +if shared.cmd_opts.use_ipex: + from modules import xpu_specific + + +def has_xpu() -> bool: + return shared.cmd_opts.use_ipex and xpu_specific.has_xpu + + +def has_mps() -> bool: + if sys.platform != "darwin": + return False + else: + return mac_specific.has_mps + + +def get_cuda_device_string(): + if shared.cmd_opts.device_id is not None: + return f"cuda:{shared.cmd_opts.device_id}" + + return "cuda" + + +def get_optimal_device_name(): + if torch.cuda.is_available(): + return get_cuda_device_string() + + if has_mps(): + return "mps" + + if has_xpu(): + return xpu_specific.get_xpu_device_string() + + return "cpu" + + +def get_optimal_device(): + return torch.device(get_optimal_device_name()) + + +def get_device_for(task): + if task in shared.cmd_opts.use_cpu or "all" in shared.cmd_opts.use_cpu: + return cpu + + return get_optimal_device() + + +def torch_gc(): + + if torch.cuda.is_available(): + with torch.cuda.device(get_cuda_device_string()): + torch.cuda.empty_cache() + torch.cuda.ipc_collect() + + if has_mps(): + mac_specific.torch_mps_gc() + + if has_xpu(): + xpu_specific.torch_xpu_gc() + + +def enable_tf32(): + if torch.cuda.is_available(): + + # enabling benchmark option seems to enable a range of cards to do fp16 when they otherwise can't + # see https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/4407 + device_id = (int(shared.cmd_opts.device_id) if shared.cmd_opts.device_id is not None and shared.cmd_opts.device_id.isdigit() else 0) or torch.cuda.current_device() + if torch.cuda.get_device_capability(device_id) == (7, 5) and torch.cuda.get_device_name(device_id).startswith("NVIDIA GeForce GTX 16"): + torch.backends.cudnn.benchmark = True + + torch.backends.cuda.matmul.allow_tf32 = True + torch.backends.cudnn.allow_tf32 = True + + +errors.run(enable_tf32, "Enabling TF32") + +cpu: torch.device = torch.device("cpu") +device: torch.device = None +device_interrogate: torch.device = None +device_gfpgan: torch.device = None +device_esrgan: torch.device = None +device_codeformer: torch.device = None +dtype: torch.dtype = torch.float16 +dtype_vae: torch.dtype = torch.float16 +dtype_unet: torch.dtype = torch.float16 +unet_needs_upcast = False + + +def cond_cast_unet(input): + return input.to(dtype_unet) if unet_needs_upcast else input + + +def cond_cast_float(input): + return input.float() if unet_needs_upcast else input + + +nv_rng = None + + +def autocast(disable=False): + if disable: + return contextlib.nullcontext() + + if dtype == torch.float32 or shared.cmd_opts.precision == "full": + return contextlib.nullcontext() + + return torch.autocast("cuda") + + +def without_autocast(disable=False): + return torch.autocast("cuda", enabled=False) if torch.is_autocast_enabled() and not disable else contextlib.nullcontext() + + +class NansException(Exception): + pass + + +def test_for_nans(x, where): + if shared.cmd_opts.disable_nan_check: + return + + if not torch.all(torch.isnan(x)).item(): + return + + if where == "unet": + message = "A tensor with all NaNs was produced in Unet." + + if not shared.cmd_opts.no_half: + message += " This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the \"Upcast cross attention layer to float32\" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this." + + elif where == "vae": + message = "A tensor with all NaNs was produced in VAE." + + if not shared.cmd_opts.no_half and not shared.cmd_opts.no_half_vae: + message += " This could be because there's not enough precision to represent the picture. Try adding --no-half-vae commandline argument to fix this." + else: + message = "A tensor with all NaNs was produced." + + message += " Use --disable-nan-check commandline argument to disable this check." + + raise NansException(message) + + +@lru_cache +def first_time_calculation(): + """ + just do any calculation with pytorch layers - the first time this is done it allocaltes about 700MB of memory and + spends about 2.7 seconds doing that, at least wih NVidia. + """ + + x = torch.zeros((1, 1)).to(device, dtype) + linear = torch.nn.Linear(1, 1).to(device, dtype) + linear(x) + + x = torch.zeros((1, 1, 3, 3)).to(device, dtype) + conv2d = torch.nn.Conv2d(1, 1, (3, 3)).to(device, dtype) + conv2d(x) + diff --git a/stable-diffusion-webui/modules/errors.py b/stable-diffusion-webui/modules/errors.py new file mode 100644 index 0000000000000000000000000000000000000000..f788c8d52729fb945fc155ad7d766ba848c9d21b --- /dev/null +++ b/stable-diffusion-webui/modules/errors.py @@ -0,0 +1,150 @@ +import sys +import textwrap +import traceback + + +exception_records = [] + + +def format_traceback(tb): + return [[f"{x.filename}, line {x.lineno}, {x.name}", x.line] for x in traceback.extract_tb(tb)] + + +def format_exception(e, tb): + return {"exception": str(e), "traceback": format_traceback(tb)} + + +def get_exceptions(): + try: + return list(reversed(exception_records)) + except Exception as e: + return str(e) + + +def record_exception(): + _, e, tb = sys.exc_info() + if e is None: + return + + if exception_records and exception_records[-1] == e: + return + + exception_records.append(format_exception(e, tb)) + + if len(exception_records) > 5: + exception_records.pop(0) + + +def report(message: str, *, exc_info: bool = False) -> None: + """ + Print an error message to stderr, with optional traceback. + """ + + record_exception() + + for line in message.splitlines(): + print("***", line, file=sys.stderr) + if exc_info: + print(textwrap.indent(traceback.format_exc(), " "), file=sys.stderr) + print("---", file=sys.stderr) + + +def print_error_explanation(message): + record_exception() + + lines = message.strip().split("\n") + max_len = max([len(x) for x in lines]) + + print('=' * max_len, file=sys.stderr) + for line in lines: + print(line, file=sys.stderr) + print('=' * max_len, file=sys.stderr) + + +def display(e: Exception, task, *, full_traceback=False): + record_exception() + + print(f"{task or 'error'}: {type(e).__name__}", file=sys.stderr) + te = traceback.TracebackException.from_exception(e) + if full_traceback: + # include frames leading up to the try-catch block + te.stack = traceback.StackSummary(traceback.extract_stack()[:-2] + te.stack) + print(*te.format(), sep="", file=sys.stderr) + + message = str(e) + if "copying a param with shape torch.Size([640, 1024]) from checkpoint, the shape in current model is torch.Size([640, 768])" in message: + print_error_explanation(""" +The most likely cause of this is you are trying to load Stable Diffusion 2.0 model without specifying its config file. +See https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#stable-diffusion-20 for how to solve this. + """) + + +already_displayed = {} + + +def display_once(e: Exception, task): + record_exception() + + if task in already_displayed: + return + + display(e, task) + + already_displayed[task] = 1 + + +def run(code, task): + try: + code() + except Exception as e: + display(task, e) + + +def check_versions(): + from packaging import version + from modules import shared + + import torch + import gradio + + expected_torch_version = "2.0.0" + expected_xformers_version = "0.0.20" + expected_gradio_version = "3.41.2" + + if version.parse(torch.__version__) < version.parse(expected_torch_version): + print_error_explanation(f""" +You are running torch {torch.__version__}. +The program is tested to work with torch {expected_torch_version}. +To reinstall the desired version, run with commandline flag --reinstall-torch. +Beware that this will cause a lot of large files to be downloaded, as well as +there are reports of issues with training tab on the latest version. + +Use --skip-version-check commandline argument to disable this check. + """.strip()) + + if shared.xformers_available: + import xformers + + if version.parse(xformers.__version__) < version.parse(expected_xformers_version): + print_error_explanation(f""" +You are running xformers {xformers.__version__}. +The program is tested to work with xformers {expected_xformers_version}. +To reinstall the desired version, run with commandline flag --reinstall-xformers. + +Use --skip-version-check commandline argument to disable this check. + """.strip()) + + if gradio.__version__ != expected_gradio_version: + print_error_explanation(f""" +You are running gradio {gradio.__version__}. +The program is designed to work with gradio {expected_gradio_version}. +Using a different version of gradio is extremely likely to break the program. + +Reasons why you have the mismatched gradio version can be: + - you use --skip-install flag. + - you use webui.py to start the program instead of launch.py. + - an extension installs the incompatible gradio version. + +Use --skip-version-check commandline argument to disable this check. + """.strip()) + diff --git a/stable-diffusion-webui/modules/esrgan_model.py b/stable-diffusion-webui/modules/esrgan_model.py new file mode 100644 index 0000000000000000000000000000000000000000..1e4260e2c62dbb14387e90e369dc109f435867b0 --- /dev/null +++ b/stable-diffusion-webui/modules/esrgan_model.py @@ -0,0 +1,229 @@ +import sys + +import numpy as np +import torch +from PIL import Image + +import modules.esrgan_model_arch as arch +from modules import modelloader, images, devices +from modules.shared import opts +from modules.upscaler import Upscaler, UpscalerData + + +def mod2normal(state_dict): + # this code is copied from https://github.com/victorca25/iNNfer + if 'conv_first.weight' in state_dict: + crt_net = {} + items = list(state_dict) + + crt_net['model.0.weight'] = state_dict['conv_first.weight'] + crt_net['model.0.bias'] = state_dict['conv_first.bias'] + + for k in items.copy(): + if 'RDB' in k: + ori_k = k.replace('RRDB_trunk.', 'model.1.sub.') + if '.weight' in k: + ori_k = ori_k.replace('.weight', '.0.weight') + elif '.bias' in k: + ori_k = ori_k.replace('.bias', '.0.bias') + crt_net[ori_k] = state_dict[k] + items.remove(k) + + crt_net['model.1.sub.23.weight'] = state_dict['trunk_conv.weight'] + crt_net['model.1.sub.23.bias'] = state_dict['trunk_conv.bias'] + crt_net['model.3.weight'] = state_dict['upconv1.weight'] + crt_net['model.3.bias'] = state_dict['upconv1.bias'] + crt_net['model.6.weight'] = state_dict['upconv2.weight'] + crt_net['model.6.bias'] = state_dict['upconv2.bias'] + crt_net['model.8.weight'] = state_dict['HRconv.weight'] + crt_net['model.8.bias'] = state_dict['HRconv.bias'] + crt_net['model.10.weight'] = state_dict['conv_last.weight'] + crt_net['model.10.bias'] = state_dict['conv_last.bias'] + state_dict = crt_net + return state_dict + + +def resrgan2normal(state_dict, nb=23): + # this code is copied from https://github.com/victorca25/iNNfer + if "conv_first.weight" in state_dict and "body.0.rdb1.conv1.weight" in state_dict: + re8x = 0 + crt_net = {} + items = list(state_dict) + + crt_net['model.0.weight'] = state_dict['conv_first.weight'] + crt_net['model.0.bias'] = state_dict['conv_first.bias'] + + for k in items.copy(): + if "rdb" in k: + ori_k = k.replace('body.', 'model.1.sub.') + ori_k = ori_k.replace('.rdb', '.RDB') + if '.weight' in k: + ori_k = ori_k.replace('.weight', '.0.weight') + elif '.bias' in k: + ori_k = ori_k.replace('.bias', '.0.bias') + crt_net[ori_k] = state_dict[k] + items.remove(k) + + crt_net[f'model.1.sub.{nb}.weight'] = state_dict['conv_body.weight'] + crt_net[f'model.1.sub.{nb}.bias'] = state_dict['conv_body.bias'] + crt_net['model.3.weight'] = state_dict['conv_up1.weight'] + crt_net['model.3.bias'] = state_dict['conv_up1.bias'] + crt_net['model.6.weight'] = state_dict['conv_up2.weight'] + crt_net['model.6.bias'] = state_dict['conv_up2.bias'] + + if 'conv_up3.weight' in state_dict: + # modification supporting: https://github.com/ai-forever/Real-ESRGAN/blob/main/RealESRGAN/rrdbnet_arch.py + re8x = 3 + crt_net['model.9.weight'] = state_dict['conv_up3.weight'] + crt_net['model.9.bias'] = state_dict['conv_up3.bias'] + + crt_net[f'model.{8+re8x}.weight'] = state_dict['conv_hr.weight'] + crt_net[f'model.{8+re8x}.bias'] = state_dict['conv_hr.bias'] + crt_net[f'model.{10+re8x}.weight'] = state_dict['conv_last.weight'] + crt_net[f'model.{10+re8x}.bias'] = state_dict['conv_last.bias'] + + state_dict = crt_net + return state_dict + + +def infer_params(state_dict): + # this code is copied from https://github.com/victorca25/iNNfer + scale2x = 0 + scalemin = 6 + n_uplayer = 0 + plus = False + + for block in list(state_dict): + parts = block.split(".") + n_parts = len(parts) + if n_parts == 5 and parts[2] == "sub": + nb = int(parts[3]) + elif n_parts == 3: + part_num = int(parts[1]) + if (part_num > scalemin + and parts[0] == "model" + and parts[2] == "weight"): + scale2x += 1 + if part_num > n_uplayer: + n_uplayer = part_num + out_nc = state_dict[block].shape[0] + if not plus and "conv1x1" in block: + plus = True + + nf = state_dict["model.0.weight"].shape[0] + in_nc = state_dict["model.0.weight"].shape[1] + out_nc = out_nc + scale = 2 ** scale2x + + return in_nc, out_nc, nf, nb, plus, scale + + +class UpscalerESRGAN(Upscaler): + def __init__(self, dirname): + self.name = "ESRGAN" + self.model_url = "https://github.com/cszn/KAIR/releases/download/v1.0/ESRGAN.pth" + self.model_name = "ESRGAN_4x" + self.scalers = [] + self.user_path = dirname + super().__init__() + model_paths = self.find_models(ext_filter=[".pt", ".pth"]) + scalers = [] + if len(model_paths) == 0: + scaler_data = UpscalerData(self.model_name, self.model_url, self, 4) + scalers.append(scaler_data) + for file in model_paths: + if file.startswith("http"): + name = self.model_name + else: + name = modelloader.friendly_name(file) + + scaler_data = UpscalerData(name, file, self, 4) + self.scalers.append(scaler_data) + + def do_upscale(self, img, selected_model): + try: + model = self.load_model(selected_model) + except Exception as e: + print(f"Unable to load ESRGAN model {selected_model}: {e}", file=sys.stderr) + return img + model.to(devices.device_esrgan) + img = esrgan_upscale(model, img) + return img + + def load_model(self, path: str): + if path.startswith("http"): + # TODO: this doesn't use `path` at all? + filename = modelloader.load_file_from_url( + url=self.model_url, + model_dir=self.model_download_path, + file_name=f"{self.model_name}.pth", + ) + else: + filename = path + + state_dict = torch.load(filename, map_location='cpu' if devices.device_esrgan.type == 'mps' else None) + + if "params_ema" in state_dict: + state_dict = state_dict["params_ema"] + elif "params" in state_dict: + state_dict = state_dict["params"] + num_conv = 16 if "realesr-animevideov3" in filename else 32 + model = arch.SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=num_conv, upscale=4, act_type='prelu') + model.load_state_dict(state_dict) + model.eval() + return model + + if "body.0.rdb1.conv1.weight" in state_dict and "conv_first.weight" in state_dict: + nb = 6 if "RealESRGAN_x4plus_anime_6B" in filename else 23 + state_dict = resrgan2normal(state_dict, nb) + elif "conv_first.weight" in state_dict: + state_dict = mod2normal(state_dict) + elif "model.0.weight" not in state_dict: + raise Exception("The file is not a recognized ESRGAN model.") + + in_nc, out_nc, nf, nb, plus, mscale = infer_params(state_dict) + + model = arch.RRDBNet(in_nc=in_nc, out_nc=out_nc, nf=nf, nb=nb, upscale=mscale, plus=plus) + model.load_state_dict(state_dict) + model.eval() + + return model + + +def upscale_without_tiling(model, img): + img = np.array(img) + img = img[:, :, ::-1] + img = np.ascontiguousarray(np.transpose(img, (2, 0, 1))) / 255 + img = torch.from_numpy(img).float() + img = img.unsqueeze(0).to(devices.device_esrgan) + with torch.no_grad(): + output = model(img) + output = output.squeeze().float().cpu().clamp_(0, 1).numpy() + output = 255. * np.moveaxis(output, 0, 2) + output = output.astype(np.uint8) + output = output[:, :, ::-1] + return Image.fromarray(output, 'RGB') + + +def esrgan_upscale(model, img): + if opts.ESRGAN_tile == 0: + return upscale_without_tiling(model, img) + + grid = images.split_grid(img, opts.ESRGAN_tile, opts.ESRGAN_tile, opts.ESRGAN_tile_overlap) + newtiles = [] + scale_factor = 1 + + for y, h, row in grid.tiles: + newrow = [] + for tiledata in row: + x, w, tile = tiledata + + output = upscale_without_tiling(model, tile) + scale_factor = output.width // tile.width + + newrow.append([x * scale_factor, w * scale_factor, output]) + newtiles.append([y * scale_factor, h * scale_factor, newrow]) + + newgrid = images.Grid(newtiles, grid.tile_w * scale_factor, grid.tile_h * scale_factor, grid.image_w * scale_factor, grid.image_h * scale_factor, grid.overlap * scale_factor) + output = images.combine_grid(newgrid) + return output diff --git a/stable-diffusion-webui/modules/esrgan_model_arch.py b/stable-diffusion-webui/modules/esrgan_model_arch.py new file mode 100644 index 0000000000000000000000000000000000000000..353c70dd867cb894a0ac208f39394280175e4e14 --- /dev/null +++ b/stable-diffusion-webui/modules/esrgan_model_arch.py @@ -0,0 +1,465 @@ +# this file is adapted from https://github.com/victorca25/iNNfer + +from collections import OrderedDict +import math +import torch +import torch.nn as nn +import torch.nn.functional as F + + +#################### +# RRDBNet Generator +#################### + +class RRDBNet(nn.Module): + def __init__(self, in_nc, out_nc, nf, nb, nr=3, gc=32, upscale=4, norm_type=None, + act_type='leakyrelu', mode='CNA', upsample_mode='upconv', convtype='Conv2D', + finalact=None, gaussian_noise=False, plus=False): + super(RRDBNet, self).__init__() + n_upscale = int(math.log(upscale, 2)) + if upscale == 3: + n_upscale = 1 + + self.resrgan_scale = 0 + if in_nc % 16 == 0: + self.resrgan_scale = 1 + elif in_nc != 4 and in_nc % 4 == 0: + self.resrgan_scale = 2 + + fea_conv = conv_block(in_nc, nf, kernel_size=3, norm_type=None, act_type=None, convtype=convtype) + rb_blocks = [RRDB(nf, nr, kernel_size=3, gc=32, stride=1, bias=1, pad_type='zero', + norm_type=norm_type, act_type=act_type, mode='CNA', convtype=convtype, + gaussian_noise=gaussian_noise, plus=plus) for _ in range(nb)] + LR_conv = conv_block(nf, nf, kernel_size=3, norm_type=norm_type, act_type=None, mode=mode, convtype=convtype) + + if upsample_mode == 'upconv': + upsample_block = upconv_block + elif upsample_mode == 'pixelshuffle': + upsample_block = pixelshuffle_block + else: + raise NotImplementedError(f'upsample mode [{upsample_mode}] is not found') + if upscale == 3: + upsampler = upsample_block(nf, nf, 3, act_type=act_type, convtype=convtype) + else: + upsampler = [upsample_block(nf, nf, act_type=act_type, convtype=convtype) for _ in range(n_upscale)] + HR_conv0 = conv_block(nf, nf, kernel_size=3, norm_type=None, act_type=act_type, convtype=convtype) + HR_conv1 = conv_block(nf, out_nc, kernel_size=3, norm_type=None, act_type=None, convtype=convtype) + + outact = act(finalact) if finalact else None + + self.model = sequential(fea_conv, ShortcutBlock(sequential(*rb_blocks, LR_conv)), + *upsampler, HR_conv0, HR_conv1, outact) + + def forward(self, x, outm=None): + if self.resrgan_scale == 1: + feat = pixel_unshuffle(x, scale=4) + elif self.resrgan_scale == 2: + feat = pixel_unshuffle(x, scale=2) + else: + feat = x + + return self.model(feat) + + +class RRDB(nn.Module): + """ + Residual in Residual Dense Block + (ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks) + """ + + def __init__(self, nf, nr=3, kernel_size=3, gc=32, stride=1, bias=1, pad_type='zero', + norm_type=None, act_type='leakyrelu', mode='CNA', convtype='Conv2D', + spectral_norm=False, gaussian_noise=False, plus=False): + super(RRDB, self).__init__() + # This is for backwards compatibility with existing models + if nr == 3: + self.RDB1 = ResidualDenseBlock_5C(nf, kernel_size, gc, stride, bias, pad_type, + norm_type, act_type, mode, convtype, spectral_norm=spectral_norm, + gaussian_noise=gaussian_noise, plus=plus) + self.RDB2 = ResidualDenseBlock_5C(nf, kernel_size, gc, stride, bias, pad_type, + norm_type, act_type, mode, convtype, spectral_norm=spectral_norm, + gaussian_noise=gaussian_noise, plus=plus) + self.RDB3 = ResidualDenseBlock_5C(nf, kernel_size, gc, stride, bias, pad_type, + norm_type, act_type, mode, convtype, spectral_norm=spectral_norm, + gaussian_noise=gaussian_noise, plus=plus) + else: + RDB_list = [ResidualDenseBlock_5C(nf, kernel_size, gc, stride, bias, pad_type, + norm_type, act_type, mode, convtype, spectral_norm=spectral_norm, + gaussian_noise=gaussian_noise, plus=plus) for _ in range(nr)] + self.RDBs = nn.Sequential(*RDB_list) + + def forward(self, x): + if hasattr(self, 'RDB1'): + out = self.RDB1(x) + out = self.RDB2(out) + out = self.RDB3(out) + else: + out = self.RDBs(x) + return out * 0.2 + x + + +class ResidualDenseBlock_5C(nn.Module): + """ + Residual Dense Block + The core module of paper: (Residual Dense Network for Image Super-Resolution, CVPR 18) + Modified options that can be used: + - "Partial Convolution based Padding" arXiv:1811.11718 + - "Spectral normalization" arXiv:1802.05957 + - "ICASSP 2020 - ESRGAN+ : Further Improving ESRGAN" N. C. + {Rakotonirina} and A. {Rasoanaivo} + """ + + def __init__(self, nf=64, kernel_size=3, gc=32, stride=1, bias=1, pad_type='zero', + norm_type=None, act_type='leakyrelu', mode='CNA', convtype='Conv2D', + spectral_norm=False, gaussian_noise=False, plus=False): + super(ResidualDenseBlock_5C, self).__init__() + + self.noise = GaussianNoise() if gaussian_noise else None + self.conv1x1 = conv1x1(nf, gc) if plus else None + + self.conv1 = conv_block(nf, gc, kernel_size, stride, bias=bias, pad_type=pad_type, + norm_type=norm_type, act_type=act_type, mode=mode, convtype=convtype, + spectral_norm=spectral_norm) + self.conv2 = conv_block(nf+gc, gc, kernel_size, stride, bias=bias, pad_type=pad_type, + norm_type=norm_type, act_type=act_type, mode=mode, convtype=convtype, + spectral_norm=spectral_norm) + self.conv3 = conv_block(nf+2*gc, gc, kernel_size, stride, bias=bias, pad_type=pad_type, + norm_type=norm_type, act_type=act_type, mode=mode, convtype=convtype, + spectral_norm=spectral_norm) + self.conv4 = conv_block(nf+3*gc, gc, kernel_size, stride, bias=bias, pad_type=pad_type, + norm_type=norm_type, act_type=act_type, mode=mode, convtype=convtype, + spectral_norm=spectral_norm) + if mode == 'CNA': + last_act = None + else: + last_act = act_type + self.conv5 = conv_block(nf+4*gc, nf, 3, stride, bias=bias, pad_type=pad_type, + norm_type=norm_type, act_type=last_act, mode=mode, convtype=convtype, + spectral_norm=spectral_norm) + + def forward(self, x): + x1 = self.conv1(x) + x2 = self.conv2(torch.cat((x, x1), 1)) + if self.conv1x1: + x2 = x2 + self.conv1x1(x) + x3 = self.conv3(torch.cat((x, x1, x2), 1)) + x4 = self.conv4(torch.cat((x, x1, x2, x3), 1)) + if self.conv1x1: + x4 = x4 + x2 + x5 = self.conv5(torch.cat((x, x1, x2, x3, x4), 1)) + if self.noise: + return self.noise(x5.mul(0.2) + x) + else: + return x5 * 0.2 + x + + +#################### +# ESRGANplus +#################### + +class GaussianNoise(nn.Module): + def __init__(self, sigma=0.1, is_relative_detach=False): + super().__init__() + self.sigma = sigma + self.is_relative_detach = is_relative_detach + self.noise = torch.tensor(0, dtype=torch.float) + + def forward(self, x): + if self.training and self.sigma != 0: + self.noise = self.noise.to(x.device) + scale = self.sigma * x.detach() if self.is_relative_detach else self.sigma * x + sampled_noise = self.noise.repeat(*x.size()).normal_() * scale + x = x + sampled_noise + return x + +def conv1x1(in_planes, out_planes, stride=1): + return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) + + +#################### +# SRVGGNetCompact +#################### + +class SRVGGNetCompact(nn.Module): + """A compact VGG-style network structure for super-resolution. + This class is copied from https://github.com/xinntao/Real-ESRGAN + """ + + def __init__(self, num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=16, upscale=4, act_type='prelu'): + super(SRVGGNetCompact, self).__init__() + self.num_in_ch = num_in_ch + self.num_out_ch = num_out_ch + self.num_feat = num_feat + self.num_conv = num_conv + self.upscale = upscale + self.act_type = act_type + + self.body = nn.ModuleList() + # the first conv + self.body.append(nn.Conv2d(num_in_ch, num_feat, 3, 1, 1)) + # the first activation + if act_type == 'relu': + activation = nn.ReLU(inplace=True) + elif act_type == 'prelu': + activation = nn.PReLU(num_parameters=num_feat) + elif act_type == 'leakyrelu': + activation = nn.LeakyReLU(negative_slope=0.1, inplace=True) + self.body.append(activation) + + # the body structure + for _ in range(num_conv): + self.body.append(nn.Conv2d(num_feat, num_feat, 3, 1, 1)) + # activation + if act_type == 'relu': + activation = nn.ReLU(inplace=True) + elif act_type == 'prelu': + activation = nn.PReLU(num_parameters=num_feat) + elif act_type == 'leakyrelu': + activation = nn.LeakyReLU(negative_slope=0.1, inplace=True) + self.body.append(activation) + + # the last conv + self.body.append(nn.Conv2d(num_feat, num_out_ch * upscale * upscale, 3, 1, 1)) + # upsample + self.upsampler = nn.PixelShuffle(upscale) + + def forward(self, x): + out = x + for i in range(0, len(self.body)): + out = self.body[i](out) + + out = self.upsampler(out) + # add the nearest upsampled image, so that the network learns the residual + base = F.interpolate(x, scale_factor=self.upscale, mode='nearest') + out += base + return out + + +#################### +# Upsampler +#################### + +class Upsample(nn.Module): + r"""Upsamples a given multi-channel 1D (temporal), 2D (spatial) or 3D (volumetric) data. + The input data is assumed to be of the form + `minibatch x channels x [optional depth] x [optional height] x width`. + """ + + def __init__(self, size=None, scale_factor=None, mode="nearest", align_corners=None): + super(Upsample, self).__init__() + if isinstance(scale_factor, tuple): + self.scale_factor = tuple(float(factor) for factor in scale_factor) + else: + self.scale_factor = float(scale_factor) if scale_factor else None + self.mode = mode + self.size = size + self.align_corners = align_corners + + def forward(self, x): + return nn.functional.interpolate(x, size=self.size, scale_factor=self.scale_factor, mode=self.mode, align_corners=self.align_corners) + + def extra_repr(self): + if self.scale_factor is not None: + info = f'scale_factor={self.scale_factor}' + else: + info = f'size={self.size}' + info += f', mode={self.mode}' + return info + + +def pixel_unshuffle(x, scale): + """ Pixel unshuffle. + Args: + x (Tensor): Input feature with shape (b, c, hh, hw). + scale (int): Downsample ratio. + Returns: + Tensor: the pixel unshuffled feature. + """ + b, c, hh, hw = x.size() + out_channel = c * (scale**2) + assert hh % scale == 0 and hw % scale == 0 + h = hh // scale + w = hw // scale + x_view = x.view(b, c, h, scale, w, scale) + return x_view.permute(0, 1, 3, 5, 2, 4).reshape(b, out_channel, h, w) + + +def pixelshuffle_block(in_nc, out_nc, upscale_factor=2, kernel_size=3, stride=1, bias=True, + pad_type='zero', norm_type=None, act_type='relu', convtype='Conv2D'): + """ + Pixel shuffle layer + (Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional + Neural Network, CVPR17) + """ + conv = conv_block(in_nc, out_nc * (upscale_factor ** 2), kernel_size, stride, bias=bias, + pad_type=pad_type, norm_type=None, act_type=None, convtype=convtype) + pixel_shuffle = nn.PixelShuffle(upscale_factor) + + n = norm(norm_type, out_nc) if norm_type else None + a = act(act_type) if act_type else None + return sequential(conv, pixel_shuffle, n, a) + + +def upconv_block(in_nc, out_nc, upscale_factor=2, kernel_size=3, stride=1, bias=True, + pad_type='zero', norm_type=None, act_type='relu', mode='nearest', convtype='Conv2D'): + """ Upconv layer """ + upscale_factor = (1, upscale_factor, upscale_factor) if convtype == 'Conv3D' else upscale_factor + upsample = Upsample(scale_factor=upscale_factor, mode=mode) + conv = conv_block(in_nc, out_nc, kernel_size, stride, bias=bias, + pad_type=pad_type, norm_type=norm_type, act_type=act_type, convtype=convtype) + return sequential(upsample, conv) + + + + + + + + +#################### +# Basic blocks +#################### + + +def make_layer(basic_block, num_basic_block, **kwarg): + """Make layers by stacking the same blocks. + Args: + basic_block (nn.module): nn.module class for basic block. (block) + num_basic_block (int): number of blocks. (n_layers) + Returns: + nn.Sequential: Stacked blocks in nn.Sequential. + """ + layers = [] + for _ in range(num_basic_block): + layers.append(basic_block(**kwarg)) + return nn.Sequential(*layers) + + +def act(act_type, inplace=True, neg_slope=0.2, n_prelu=1, beta=1.0): + """ activation helper """ + act_type = act_type.lower() + if act_type == 'relu': + layer = nn.ReLU(inplace) + elif act_type in ('leakyrelu', 'lrelu'): + layer = nn.LeakyReLU(neg_slope, inplace) + elif act_type == 'prelu': + layer = nn.PReLU(num_parameters=n_prelu, init=neg_slope) + elif act_type == 'tanh': # [-1, 1] range output + layer = nn.Tanh() + elif act_type == 'sigmoid': # [0, 1] range output + layer = nn.Sigmoid() + else: + raise NotImplementedError(f'activation layer [{act_type}] is not found') + return layer + + +class Identity(nn.Module): + def __init__(self, *kwargs): + super(Identity, self).__init__() + + def forward(self, x, *kwargs): + return x + + +def norm(norm_type, nc): + """ Return a normalization layer """ + norm_type = norm_type.lower() + if norm_type == 'batch': + layer = nn.BatchNorm2d(nc, affine=True) + elif norm_type == 'instance': + layer = nn.InstanceNorm2d(nc, affine=False) + elif norm_type == 'none': + def norm_layer(x): return Identity() + else: + raise NotImplementedError(f'normalization layer [{norm_type}] is not found') + return layer + + +def pad(pad_type, padding): + """ padding layer helper """ + pad_type = pad_type.lower() + if padding == 0: + return None + if pad_type == 'reflect': + layer = nn.ReflectionPad2d(padding) + elif pad_type == 'replicate': + layer = nn.ReplicationPad2d(padding) + elif pad_type == 'zero': + layer = nn.ZeroPad2d(padding) + else: + raise NotImplementedError(f'padding layer [{pad_type}] is not implemented') + return layer + + +def get_valid_padding(kernel_size, dilation): + kernel_size = kernel_size + (kernel_size - 1) * (dilation - 1) + padding = (kernel_size - 1) // 2 + return padding + + +class ShortcutBlock(nn.Module): + """ Elementwise sum the output of a submodule to its input """ + def __init__(self, submodule): + super(ShortcutBlock, self).__init__() + self.sub = submodule + + def forward(self, x): + output = x + self.sub(x) + return output + + def __repr__(self): + return 'Identity + \n|' + self.sub.__repr__().replace('\n', '\n|') + + +def sequential(*args): + """ Flatten Sequential. It unwraps nn.Sequential. """ + if len(args) == 1: + if isinstance(args[0], OrderedDict): + raise NotImplementedError('sequential does not support OrderedDict input.') + return args[0] # No sequential is needed. + modules = [] + for module in args: + if isinstance(module, nn.Sequential): + for submodule in module.children(): + modules.append(submodule) + elif isinstance(module, nn.Module): + modules.append(module) + return nn.Sequential(*modules) + + +def conv_block(in_nc, out_nc, kernel_size, stride=1, dilation=1, groups=1, bias=True, + pad_type='zero', norm_type=None, act_type='relu', mode='CNA', convtype='Conv2D', + spectral_norm=False): + """ Conv layer with padding, normalization, activation """ + assert mode in ['CNA', 'NAC', 'CNAC'], f'Wrong conv mode [{mode}]' + padding = get_valid_padding(kernel_size, dilation) + p = pad(pad_type, padding) if pad_type and pad_type != 'zero' else None + padding = padding if pad_type == 'zero' else 0 + + if convtype=='PartialConv2D': + from torchvision.ops import PartialConv2d # this is definitely not going to work, but PartialConv2d doesn't work anyway and this shuts up static analyzer + c = PartialConv2d(in_nc, out_nc, kernel_size=kernel_size, stride=stride, padding=padding, + dilation=dilation, bias=bias, groups=groups) + elif convtype=='DeformConv2D': + from torchvision.ops import DeformConv2d # not tested + c = DeformConv2d(in_nc, out_nc, kernel_size=kernel_size, stride=stride, padding=padding, + dilation=dilation, bias=bias, groups=groups) + elif convtype=='Conv3D': + c = nn.Conv3d(in_nc, out_nc, kernel_size=kernel_size, stride=stride, padding=padding, + dilation=dilation, bias=bias, groups=groups) + else: + c = nn.Conv2d(in_nc, out_nc, kernel_size=kernel_size, stride=stride, padding=padding, + dilation=dilation, bias=bias, groups=groups) + + if spectral_norm: + c = nn.utils.spectral_norm(c) + + a = act(act_type) if act_type else None + if 'CNA' in mode: + n = norm(norm_type, out_nc) if norm_type else None + return sequential(p, c, n, a) + elif mode == 'NAC': + if norm_type is None and act_type is not None: + a = act(act_type, inplace=False) + n = norm(norm_type, in_nc) if norm_type else None + return sequential(n, a, p, c) diff --git a/stable-diffusion-webui/modules/extensions.py b/stable-diffusion-webui/modules/extensions.py new file mode 100644 index 0000000000000000000000000000000000000000..8adf306b6be0663927a4296d37867f2439584461 --- /dev/null +++ b/stable-diffusion-webui/modules/extensions.py @@ -0,0 +1,237 @@ +from __future__ import annotations + +import configparser +import os +import threading +import re + +from modules import shared, errors, cache, scripts +from modules.gitpython_hack import Repo +from modules.paths_internal import extensions_dir, extensions_builtin_dir, script_path # noqa: F401 + + +os.makedirs(extensions_dir, exist_ok=True) + + +def active(): + if shared.cmd_opts.disable_all_extensions or shared.opts.disable_all_extensions == "all": + return [] + elif shared.cmd_opts.disable_extra_extensions or shared.opts.disable_all_extensions == "extra": + return [x for x in extensions if x.enabled and x.is_builtin] + else: + return [x for x in extensions if x.enabled] + + +class ExtensionMetadata: + filename = "metadata.ini" + config: configparser.ConfigParser + canonical_name: str + requires: list + + def __init__(self, path, canonical_name): + self.config = configparser.ConfigParser() + + filepath = os.path.join(path, self.filename) + if os.path.isfile(filepath): + try: + self.config.read(filepath) + except Exception: + errors.report(f"Error reading {self.filename} for extension {canonical_name}.", exc_info=True) + + self.canonical_name = self.config.get("Extension", "Name", fallback=canonical_name) + self.canonical_name = canonical_name.lower().strip() + + self.requires = self.get_script_requirements("Requires", "Extension") + + def get_script_requirements(self, field, section, extra_section=None): + """reads a list of requirements from the config; field is the name of the field in the ini file, + like Requires or Before, and section is the name of the [section] in the ini file; additionally, + reads more requirements from [extra_section] if specified.""" + + x = self.config.get(section, field, fallback='') + + if extra_section: + x = x + ', ' + self.config.get(extra_section, field, fallback='') + + return self.parse_list(x.lower()) + + def parse_list(self, text): + """converts a line from config ("ext1 ext2, ext3 ") into a python list (["ext1", "ext2", "ext3"])""" + + if not text: + return [] + + # both "," and " " are accepted as separator + return [x for x in re.split(r"[,\s]+", text.strip()) if x] + + +class Extension: + lock = threading.Lock() + cached_fields = ['remote', 'commit_date', 'branch', 'commit_hash', 'version'] + metadata: ExtensionMetadata + + def __init__(self, name, path, enabled=True, is_builtin=False, metadata=None): + self.name = name + self.path = path + self.enabled = enabled + self.status = '' + self.can_update = False + self.is_builtin = is_builtin + self.commit_hash = '' + self.commit_date = None + self.version = '' + self.branch = None + self.remote = None + self.have_info_from_repo = False + self.metadata = metadata if metadata else ExtensionMetadata(self.path, name.lower()) + self.canonical_name = metadata.canonical_name + + def to_dict(self): + return {x: getattr(self, x) for x in self.cached_fields} + + def from_dict(self, d): + for field in self.cached_fields: + setattr(self, field, d[field]) + + def read_info_from_repo(self): + if self.is_builtin or self.have_info_from_repo: + return + + def read_from_repo(): + with self.lock: + if self.have_info_from_repo: + return + + self.do_read_info_from_repo() + + return self.to_dict() + + try: + d = cache.cached_data_for_file('extensions-git', self.name, os.path.join(self.path, ".git"), read_from_repo) + self.from_dict(d) + except FileNotFoundError: + pass + self.status = 'unknown' if self.status == '' else self.status + + def do_read_info_from_repo(self): + repo = None + try: + if os.path.exists(os.path.join(self.path, ".git")): + repo = Repo(self.path) + except Exception: + errors.report(f"Error reading github repository info from {self.path}", exc_info=True) + + if repo is None or repo.bare: + self.remote = None + else: + try: + self.remote = next(repo.remote().urls, None) + commit = repo.head.commit + self.commit_date = commit.committed_date + if repo.active_branch: + self.branch = repo.active_branch.name + self.commit_hash = commit.hexsha + self.version = self.commit_hash[:8] + + except Exception: + errors.report(f"Failed reading extension data from Git repository ({self.name})", exc_info=True) + self.remote = None + + self.have_info_from_repo = True + + def list_files(self, subdir, extension): + dirpath = os.path.join(self.path, subdir) + if not os.path.isdir(dirpath): + return [] + + res = [] + for filename in sorted(os.listdir(dirpath)): + res.append(scripts.ScriptFile(self.path, filename, os.path.join(dirpath, filename))) + + res = [x for x in res if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)] + + return res + + def check_updates(self): + repo = Repo(self.path) + for fetch in repo.remote().fetch(dry_run=True): + if fetch.flags != fetch.HEAD_UPTODATE: + self.can_update = True + self.status = "new commits" + return + + try: + origin = repo.rev_parse('origin') + if repo.head.commit != origin: + self.can_update = True + self.status = "behind HEAD" + return + except Exception: + self.can_update = False + self.status = "unknown (remote error)" + return + + self.can_update = False + self.status = "latest" + + def fetch_and_reset_hard(self, commit='origin'): + repo = Repo(self.path) + # Fix: `error: Your local changes to the following files would be overwritten by merge`, + # because WSL2 Docker set 755 file permissions instead of 644, this results to the error. + repo.git.fetch(all=True) + repo.git.reset(commit, hard=True) + self.have_info_from_repo = False + + +def list_extensions(): + extensions.clear() + + if shared.cmd_opts.disable_all_extensions: + print("*** \"--disable-all-extensions\" arg was used, will not load any extensions ***") + elif shared.opts.disable_all_extensions == "all": + print("*** \"Disable all extensions\" option was set, will not load any extensions ***") + elif shared.cmd_opts.disable_extra_extensions: + print("*** \"--disable-extra-extensions\" arg was used, will only load built-in extensions ***") + elif shared.opts.disable_all_extensions == "extra": + print("*** \"Disable all extensions\" option was set, will only load built-in extensions ***") + + loaded_extensions = {} + + # scan through extensions directory and load metadata + for dirname in [extensions_builtin_dir, extensions_dir]: + if not os.path.isdir(dirname): + continue + + for extension_dirname in sorted(os.listdir(dirname)): + path = os.path.join(dirname, extension_dirname) + if not os.path.isdir(path): + continue + + canonical_name = extension_dirname + metadata = ExtensionMetadata(path, canonical_name) + + # check for duplicated canonical names + already_loaded_extension = loaded_extensions.get(metadata.canonical_name) + if already_loaded_extension is not None: + errors.report(f'Duplicate canonical name "{canonical_name}" found in extensions "{extension_dirname}" and "{already_loaded_extension.name}". Former will be discarded.', exc_info=False) + continue + + is_builtin = dirname == extensions_builtin_dir + extension = Extension(name=extension_dirname, path=path, enabled=extension_dirname not in shared.opts.disabled_extensions, is_builtin=is_builtin, metadata=metadata) + extensions.append(extension) + loaded_extensions[canonical_name] = extension + + # check for requirements + for extension in extensions: + for req in extension.metadata.requires: + required_extension = loaded_extensions.get(req) + if required_extension is None: + errors.report(f'Extension "{extension.name}" requires "{req}" which is not installed.', exc_info=False) + continue + + if not extension.enabled: + errors.report(f'Extension "{extension.name}" requires "{required_extension.name}" which is disabled.', exc_info=False) + continue + + +extensions: list[Extension] = [] diff --git a/stable-diffusion-webui/modules/extra_networks.py b/stable-diffusion-webui/modules/extra_networks.py new file mode 100644 index 0000000000000000000000000000000000000000..5ebe72260488f31b30532b94d0f6fff1ea2e1660 --- /dev/null +++ b/stable-diffusion-webui/modules/extra_networks.py @@ -0,0 +1,224 @@ +import json +import os +import re +import logging +from collections import defaultdict + +from modules import errors + +extra_network_registry = {} +extra_network_aliases = {} + + +def initialize(): + extra_network_registry.clear() + extra_network_aliases.clear() + + +def register_extra_network(extra_network): + extra_network_registry[extra_network.name] = extra_network + + +def register_extra_network_alias(extra_network, alias): + extra_network_aliases[alias] = extra_network + + +def register_default_extra_networks(): + from modules.extra_networks_hypernet import ExtraNetworkHypernet + register_extra_network(ExtraNetworkHypernet()) + + +class ExtraNetworkParams: + def __init__(self, items=None): + self.items = items or [] + self.positional = [] + self.named = {} + + for item in self.items: + parts = item.split('=', 2) if isinstance(item, str) else [item] + if len(parts) == 2: + self.named[parts[0]] = parts[1] + else: + self.positional.append(item) + + def __eq__(self, other): + return self.items == other.items + + +class ExtraNetwork: + def __init__(self, name): + self.name = name + + def activate(self, p, params_list): + """ + Called by processing on every run. Whatever the extra network is meant to do should be activated here. + Passes arguments related to this extra network in params_list. + User passes arguments by specifying this in his prompt: + + + + Where name matches the name of this ExtraNetwork object, and arg1:arg2:arg3 are any natural number of text arguments + separated by colon. + + Even if the user does not mention this ExtraNetwork in his prompt, the call will stil be made, with empty params_list - + in this case, all effects of this extra networks should be disabled. + + Can be called multiple times before deactivate() - each new call should override the previous call completely. + + For example, if this ExtraNetwork's name is 'hypernet' and user's prompt is: + + > "1girl, " + + params_list will be: + + [ + ExtraNetworkParams(items=["agm", "1.1"]), + ExtraNetworkParams(items=["ray"]) + ] + + """ + raise NotImplementedError + + def deactivate(self, p): + """ + Called at the end of processing for housekeeping. No need to do anything here. + """ + + raise NotImplementedError + + +def lookup_extra_networks(extra_network_data): + """returns a dict mapping ExtraNetwork objects to lists of arguments for those extra networks. + + Example input: + { + 'lora': [], + 'lyco': [], + 'hypernet': [] + } + + Example output: + + { + : [, ], + : [] + } + """ + + res = {} + + for extra_network_name, extra_network_args in list(extra_network_data.items()): + extra_network = extra_network_registry.get(extra_network_name, None) + alias = extra_network_aliases.get(extra_network_name, None) + + if alias is not None and extra_network is None: + extra_network = alias + + if extra_network is None: + logging.info(f"Skipping unknown extra network: {extra_network_name}") + continue + + res.setdefault(extra_network, []).extend(extra_network_args) + + return res + + +def activate(p, extra_network_data): + """call activate for extra networks in extra_network_data in specified order, then call + activate for all remaining registered networks with an empty argument list""" + + activated = [] + + for extra_network, extra_network_args in lookup_extra_networks(extra_network_data).items(): + + try: + extra_network.activate(p, extra_network_args) + activated.append(extra_network) + except Exception as e: + errors.display(e, f"activating extra network {extra_network.name} with arguments {extra_network_args}") + + for extra_network_name, extra_network in extra_network_registry.items(): + if extra_network in activated: + continue + + try: + extra_network.activate(p, []) + except Exception as e: + errors.display(e, f"activating extra network {extra_network_name}") + + if p.scripts is not None: + p.scripts.after_extra_networks_activate(p, batch_number=p.iteration, prompts=p.prompts, seeds=p.seeds, subseeds=p.subseeds, extra_network_data=extra_network_data) + + +def deactivate(p, extra_network_data): + """call deactivate for extra networks in extra_network_data in specified order, then call + deactivate for all remaining registered networks""" + + data = lookup_extra_networks(extra_network_data) + + for extra_network in data: + try: + extra_network.deactivate(p) + except Exception as e: + errors.display(e, f"deactivating extra network {extra_network.name}") + + for extra_network_name, extra_network in extra_network_registry.items(): + if extra_network in data: + continue + + try: + extra_network.deactivate(p) + except Exception as e: + errors.display(e, f"deactivating unmentioned extra network {extra_network_name}") + + +re_extra_net = re.compile(r"<(\w+):([^>]+)>") + + +def parse_prompt(prompt): + res = defaultdict(list) + + def found(m): + name = m.group(1) + args = m.group(2) + + res[name].append(ExtraNetworkParams(items=args.split(":"))) + + return "" + + prompt = re.sub(re_extra_net, found, prompt) + + return prompt, res + + +def parse_prompts(prompts): + res = [] + extra_data = None + + for prompt in prompts: + updated_prompt, parsed_extra_data = parse_prompt(prompt) + + if extra_data is None: + extra_data = parsed_extra_data + + res.append(updated_prompt) + + return res, extra_data + + +def get_user_metadata(filename): + if filename is None: + return {} + + basename, ext = os.path.splitext(filename) + metadata_filename = basename + '.json' + + metadata = {} + try: + if os.path.isfile(metadata_filename): + with open(metadata_filename, "r", encoding="utf8") as file: + metadata = json.load(file) + except Exception as e: + errors.display(e, f"reading extra network user metadata from {metadata_filename}") + + return metadata diff --git a/stable-diffusion-webui/modules/extra_networks_hypernet.py b/stable-diffusion-webui/modules/extra_networks_hypernet.py new file mode 100644 index 0000000000000000000000000000000000000000..192f11b9cbd88447a0f80dbd2f0ace26d74f18b2 --- /dev/null +++ b/stable-diffusion-webui/modules/extra_networks_hypernet.py @@ -0,0 +1,28 @@ +from modules import extra_networks, shared +from modules.hypernetworks import hypernetwork + + +class ExtraNetworkHypernet(extra_networks.ExtraNetwork): + def __init__(self): + super().__init__('hypernet') + + def activate(self, p, params_list): + additional = shared.opts.sd_hypernetwork + + if additional != "None" and additional in shared.hypernetworks and not any(x for x in params_list if x.items[0] == additional): + hypernet_prompt_text = f"" + p.all_prompts = [f"{prompt}{hypernet_prompt_text}" for prompt in p.all_prompts] + params_list.append(extra_networks.ExtraNetworkParams(items=[additional, shared.opts.extra_networks_default_multiplier])) + + names = [] + multipliers = [] + for params in params_list: + assert params.items + + names.append(params.items[0]) + multipliers.append(float(params.items[1]) if len(params.items) > 1 else 1.0) + + hypernetwork.load_hypernetworks(names, multipliers) + + def deactivate(self, p): + pass diff --git a/stable-diffusion-webui/modules/extras.py b/stable-diffusion-webui/modules/extras.py new file mode 100644 index 0000000000000000000000000000000000000000..4653c3f6edacc067eb935c81d7e71c71790ce449 --- /dev/null +++ b/stable-diffusion-webui/modules/extras.py @@ -0,0 +1,330 @@ +import os +import re +import shutil +import json + + +import torch +import tqdm + +from modules import shared, images, sd_models, sd_vae, sd_models_config, errors +from modules.ui_common import plaintext_to_html +import gradio as gr +import safetensors.torch + + +def run_pnginfo(image): + if image is None: + return '', '', '' + + geninfo, items = images.read_info_from_image(image) + items = {**{'parameters': geninfo}, **items} + + info = '' + for key, text in items.items(): + info += f""" +
+

{plaintext_to_html(str(key))}

+

{plaintext_to_html(str(text))}

+
+""".strip()+"\n" + + if len(info) == 0: + message = "Nothing found in the image." + info = f"

{message}

" + + return '', geninfo, info + + +def create_config(ckpt_result, config_source, a, b, c): + def config(x): + res = sd_models_config.find_checkpoint_config_near_filename(x) if x else None + return res if res != shared.sd_default_config else None + + if config_source == 0: + cfg = config(a) or config(b) or config(c) + elif config_source == 1: + cfg = config(b) + elif config_source == 2: + cfg = config(c) + else: + cfg = None + + if cfg is None: + return + + filename, _ = os.path.splitext(ckpt_result) + checkpoint_filename = filename + ".yaml" + + print("Copying config:") + print(" from:", cfg) + print(" to:", checkpoint_filename) + shutil.copyfile(cfg, checkpoint_filename) + + +checkpoint_dict_skip_on_merge = ["cond_stage_model.transformer.text_model.embeddings.position_ids"] + + +def to_half(tensor, enable): + if enable and tensor.dtype == torch.float: + return tensor.half() + + return tensor + + +def read_metadata(primary_model_name, secondary_model_name, tertiary_model_name): + metadata = {} + + for checkpoint_name in [primary_model_name, secondary_model_name, tertiary_model_name]: + checkpoint_info = sd_models.checkpoints_list.get(checkpoint_name, None) + if checkpoint_info is None: + continue + + metadata.update(checkpoint_info.metadata) + + return json.dumps(metadata, indent=4, ensure_ascii=False) + + +def run_modelmerger(id_task, primary_model_name, secondary_model_name, tertiary_model_name, interp_method, multiplier, save_as_half, custom_name, checkpoint_format, config_source, bake_in_vae, discard_weights, save_metadata, add_merge_recipe, copy_metadata_fields, metadata_json): + shared.state.begin(job="model-merge") + + def fail(message): + shared.state.textinfo = message + shared.state.end() + return [*[gr.update() for _ in range(4)], message] + + def weighted_sum(theta0, theta1, alpha): + return ((1 - alpha) * theta0) + (alpha * theta1) + + def get_difference(theta1, theta2): + return theta1 - theta2 + + def add_difference(theta0, theta1_2_diff, alpha): + return theta0 + (alpha * theta1_2_diff) + + def filename_weighted_sum(): + a = primary_model_info.model_name + b = secondary_model_info.model_name + Ma = round(1 - multiplier, 2) + Mb = round(multiplier, 2) + + return f"{Ma}({a}) + {Mb}({b})" + + def filename_add_difference(): + a = primary_model_info.model_name + b = secondary_model_info.model_name + c = tertiary_model_info.model_name + M = round(multiplier, 2) + + return f"{a} + {M}({b} - {c})" + + def filename_nothing(): + return primary_model_info.model_name + + theta_funcs = { + "Weighted sum": (filename_weighted_sum, None, weighted_sum), + "Add difference": (filename_add_difference, get_difference, add_difference), + "No interpolation": (filename_nothing, None, None), + } + filename_generator, theta_func1, theta_func2 = theta_funcs[interp_method] + shared.state.job_count = (1 if theta_func1 else 0) + (1 if theta_func2 else 0) + + if not primary_model_name: + return fail("Failed: Merging requires a primary model.") + + primary_model_info = sd_models.checkpoints_list[primary_model_name] + + if theta_func2 and not secondary_model_name: + return fail("Failed: Merging requires a secondary model.") + + secondary_model_info = sd_models.checkpoints_list[secondary_model_name] if theta_func2 else None + + if theta_func1 and not tertiary_model_name: + return fail(f"Failed: Interpolation method ({interp_method}) requires a tertiary model.") + + tertiary_model_info = sd_models.checkpoints_list[tertiary_model_name] if theta_func1 else None + + result_is_inpainting_model = False + result_is_instruct_pix2pix_model = False + + if theta_func2: + shared.state.textinfo = "Loading B" + print(f"Loading {secondary_model_info.filename}...") + theta_1 = sd_models.read_state_dict(secondary_model_info.filename, map_location='cpu') + else: + theta_1 = None + + if theta_func1: + shared.state.textinfo = "Loading C" + print(f"Loading {tertiary_model_info.filename}...") + theta_2 = sd_models.read_state_dict(tertiary_model_info.filename, map_location='cpu') + + shared.state.textinfo = 'Merging B and C' + shared.state.sampling_steps = len(theta_1.keys()) + for key in tqdm.tqdm(theta_1.keys()): + if key in checkpoint_dict_skip_on_merge: + continue + + if 'model' in key: + if key in theta_2: + t2 = theta_2.get(key, torch.zeros_like(theta_1[key])) + theta_1[key] = theta_func1(theta_1[key], t2) + else: + theta_1[key] = torch.zeros_like(theta_1[key]) + + shared.state.sampling_step += 1 + del theta_2 + + shared.state.nextjob() + + shared.state.textinfo = f"Loading {primary_model_info.filename}..." + print(f"Loading {primary_model_info.filename}...") + theta_0 = sd_models.read_state_dict(primary_model_info.filename, map_location='cpu') + + print("Merging...") + shared.state.textinfo = 'Merging A and B' + shared.state.sampling_steps = len(theta_0.keys()) + for key in tqdm.tqdm(theta_0.keys()): + if theta_1 and 'model' in key and key in theta_1: + + if key in checkpoint_dict_skip_on_merge: + continue + + a = theta_0[key] + b = theta_1[key] + + # this enables merging an inpainting model (A) with another one (B); + # where normal model would have 4 channels, for latenst space, inpainting model would + # have another 4 channels for unmasked picture's latent space, plus one channel for mask, for a total of 9 + if a.shape != b.shape and a.shape[0:1] + a.shape[2:] == b.shape[0:1] + b.shape[2:]: + if a.shape[1] == 4 and b.shape[1] == 9: + raise RuntimeError("When merging inpainting model with a normal one, A must be the inpainting model.") + if a.shape[1] == 4 and b.shape[1] == 8: + raise RuntimeError("When merging instruct-pix2pix model with a normal one, A must be the instruct-pix2pix model.") + + if a.shape[1] == 8 and b.shape[1] == 4:#If we have an Instruct-Pix2Pix model... + theta_0[key][:, 0:4, :, :] = theta_func2(a[:, 0:4, :, :], b, multiplier)#Merge only the vectors the models have in common. Otherwise we get an error due to dimension mismatch. + result_is_instruct_pix2pix_model = True + else: + assert a.shape[1] == 9 and b.shape[1] == 4, f"Bad dimensions for merged layer {key}: A={a.shape}, B={b.shape}" + theta_0[key][:, 0:4, :, :] = theta_func2(a[:, 0:4, :, :], b, multiplier) + result_is_inpainting_model = True + else: + theta_0[key] = theta_func2(a, b, multiplier) + + theta_0[key] = to_half(theta_0[key], save_as_half) + + shared.state.sampling_step += 1 + + del theta_1 + + bake_in_vae_filename = sd_vae.vae_dict.get(bake_in_vae, None) + if bake_in_vae_filename is not None: + print(f"Baking in VAE from {bake_in_vae_filename}") + shared.state.textinfo = 'Baking in VAE' + vae_dict = sd_vae.load_vae_dict(bake_in_vae_filename, map_location='cpu') + + for key in vae_dict.keys(): + theta_0_key = 'first_stage_model.' + key + if theta_0_key in theta_0: + theta_0[theta_0_key] = to_half(vae_dict[key], save_as_half) + + del vae_dict + + if save_as_half and not theta_func2: + for key in theta_0.keys(): + theta_0[key] = to_half(theta_0[key], save_as_half) + + if discard_weights: + regex = re.compile(discard_weights) + for key in list(theta_0): + if re.search(regex, key): + theta_0.pop(key, None) + + ckpt_dir = shared.cmd_opts.ckpt_dir or sd_models.model_path + + filename = filename_generator() if custom_name == '' else custom_name + filename += ".inpainting" if result_is_inpainting_model else "" + filename += ".instruct-pix2pix" if result_is_instruct_pix2pix_model else "" + filename += "." + checkpoint_format + + output_modelname = os.path.join(ckpt_dir, filename) + + shared.state.nextjob() + shared.state.textinfo = "Saving" + print(f"Saving to {output_modelname}...") + + metadata = {} + + if save_metadata and copy_metadata_fields: + if primary_model_info: + metadata.update(primary_model_info.metadata) + if secondary_model_info: + metadata.update(secondary_model_info.metadata) + if tertiary_model_info: + metadata.update(tertiary_model_info.metadata) + + if save_metadata: + try: + metadata.update(json.loads(metadata_json)) + except Exception as e: + errors.display(e, "readin metadata from json") + + metadata["format"] = "pt" + + if save_metadata and add_merge_recipe: + merge_recipe = { + "type": "webui", # indicate this model was merged with webui's built-in merger + "primary_model_hash": primary_model_info.sha256, + "secondary_model_hash": secondary_model_info.sha256 if secondary_model_info else None, + "tertiary_model_hash": tertiary_model_info.sha256 if tertiary_model_info else None, + "interp_method": interp_method, + "multiplier": multiplier, + "save_as_half": save_as_half, + "custom_name": custom_name, + "config_source": config_source, + "bake_in_vae": bake_in_vae, + "discard_weights": discard_weights, + "is_inpainting": result_is_inpainting_model, + "is_instruct_pix2pix": result_is_instruct_pix2pix_model + } + + sd_merge_models = {} + + def add_model_metadata(checkpoint_info): + checkpoint_info.calculate_shorthash() + sd_merge_models[checkpoint_info.sha256] = { + "name": checkpoint_info.name, + "legacy_hash": checkpoint_info.hash, + "sd_merge_recipe": checkpoint_info.metadata.get("sd_merge_recipe", None) + } + + sd_merge_models.update(checkpoint_info.metadata.get("sd_merge_models", {})) + + add_model_metadata(primary_model_info) + if secondary_model_info: + add_model_metadata(secondary_model_info) + if tertiary_model_info: + add_model_metadata(tertiary_model_info) + + metadata["sd_merge_recipe"] = json.dumps(merge_recipe) + metadata["sd_merge_models"] = json.dumps(sd_merge_models) + + _, extension = os.path.splitext(output_modelname) + if extension.lower() == ".safetensors": + safetensors.torch.save_file(theta_0, output_modelname, metadata=metadata if len(metadata)>0 else None) + else: + torch.save(theta_0, output_modelname) + + sd_models.list_models() + created_model = next((ckpt for ckpt in sd_models.checkpoints_list.values() if ckpt.name == filename), None) + if created_model: + created_model.calculate_shorthash() + + create_config(output_modelname, config_source, primary_model_info, secondary_model_info, tertiary_model_info) + + print(f"Checkpoint saved to {output_modelname}.") + shared.state.textinfo = "Checkpoint saved" + shared.state.end() + + return [*[gr.Dropdown.update(choices=sd_models.checkpoint_tiles()) for _ in range(4)], "Checkpoint saved to " + output_modelname] diff --git a/stable-diffusion-webui/modules/face_restoration.py b/stable-diffusion-webui/modules/face_restoration.py new file mode 100644 index 0000000000000000000000000000000000000000..2c86c6ccce338a1411f4367a0bc6e4046ad67cae --- /dev/null +++ b/stable-diffusion-webui/modules/face_restoration.py @@ -0,0 +1,19 @@ +from modules import shared + + +class FaceRestoration: + def name(self): + return "None" + + def restore(self, np_image): + return np_image + + +def restore_faces(np_image): + face_restorers = [x for x in shared.face_restorers if x.name() == shared.opts.face_restoration_model or shared.opts.face_restoration_model is None] + if len(face_restorers) == 0: + return np_image + + face_restorer = face_restorers[0] + + return face_restorer.restore(np_image) diff --git a/stable-diffusion-webui/modules/fifo_lock.py b/stable-diffusion-webui/modules/fifo_lock.py new file mode 100644 index 0000000000000000000000000000000000000000..c35b3ae25a3cf383c8beae04db3e0a3d66785135 --- /dev/null +++ b/stable-diffusion-webui/modules/fifo_lock.py @@ -0,0 +1,37 @@ +import threading +import collections + + +# reference: https://gist.github.com/vitaliyp/6d54dd76ca2c3cdfc1149d33007dc34a +class FIFOLock(object): + def __init__(self): + self._lock = threading.Lock() + self._inner_lock = threading.Lock() + self._pending_threads = collections.deque() + + def acquire(self, blocking=True): + with self._inner_lock: + lock_acquired = self._lock.acquire(False) + if lock_acquired: + return True + elif not blocking: + return False + + release_event = threading.Event() + self._pending_threads.append(release_event) + + release_event.wait() + return self._lock.acquire() + + def release(self): + with self._inner_lock: + if self._pending_threads: + release_event = self._pending_threads.popleft() + release_event.set() + + self._lock.release() + + __enter__ = acquire + + def __exit__(self, t, v, tb): + self.release() diff --git a/stable-diffusion-webui/modules/generation_parameters_copypaste.py b/stable-diffusion-webui/modules/generation_parameters_copypaste.py new file mode 100644 index 0000000000000000000000000000000000000000..5baf31d3eb182302d987ee43df0d62908f8ff436 --- /dev/null +++ b/stable-diffusion-webui/modules/generation_parameters_copypaste.py @@ -0,0 +1,450 @@ +from __future__ import annotations +import base64 +import io +import json +import os +import re + +import gradio as gr +from modules.paths import data_path +from modules import shared, ui_tempdir, script_callbacks, processing +from PIL import Image + +re_param_code = r'\s*(\w[\w \-/]+):\s*("(?:\\.|[^\\"])+"|[^,]*)(?:,|$)' +re_param = re.compile(re_param_code) +re_imagesize = re.compile(r"^(\d+)x(\d+)$") +re_hypernet_hash = re.compile("\(([0-9a-f]+)\)$") +type_of_gr_update = type(gr.update()) + + +class ParamBinding: + def __init__(self, paste_button, tabname, source_text_component=None, source_image_component=None, source_tabname=None, override_settings_component=None, paste_field_names=None): + self.paste_button = paste_button + self.tabname = tabname + self.source_text_component = source_text_component + self.source_image_component = source_image_component + self.source_tabname = source_tabname + self.override_settings_component = override_settings_component + self.paste_field_names = paste_field_names or [] + + +paste_fields: dict[str, dict] = {} +registered_param_bindings: list[ParamBinding] = [] + + +def reset(): + paste_fields.clear() + registered_param_bindings.clear() + + +def quote(text): + if ',' not in str(text) and '\n' not in str(text) and ':' not in str(text): + return text + + return json.dumps(text, ensure_ascii=False) + + +def unquote(text): + if len(text) == 0 or text[0] != '"' or text[-1] != '"': + return text + + try: + return json.loads(text) + except Exception: + return text + + +def image_from_url_text(filedata): + if filedata is None: + return None + + if type(filedata) == list and filedata and type(filedata[0]) == dict and filedata[0].get("is_file", False): + filedata = filedata[0] + + if type(filedata) == dict and filedata.get("is_file", False): + filename = filedata["name"] + is_in_right_dir = ui_tempdir.check_tmp_file(shared.demo, filename) + assert is_in_right_dir, 'trying to open image file outside of allowed directories' + + filename = filename.rsplit('?', 1)[0] + return Image.open(filename) + + if type(filedata) == list: + if len(filedata) == 0: + return None + + filedata = filedata[0] + + if filedata.startswith("data:image/png;base64,"): + filedata = filedata[len("data:image/png;base64,"):] + + filedata = base64.decodebytes(filedata.encode('utf-8')) + image = Image.open(io.BytesIO(filedata)) + return image + + +def add_paste_fields(tabname, init_img, fields, override_settings_component=None): + paste_fields[tabname] = {"init_img": init_img, "fields": fields, "override_settings_component": override_settings_component} + + # backwards compatibility for existing extensions + import modules.ui + if tabname == 'txt2img': + modules.ui.txt2img_paste_fields = fields + elif tabname == 'img2img': + modules.ui.img2img_paste_fields = fields + + +def create_buttons(tabs_list): + buttons = {} + for tab in tabs_list: + buttons[tab] = gr.Button(f"Send to {tab}", elem_id=f"{tab}_tab") + return buttons + + +def bind_buttons(buttons, send_image, send_generate_info): + """old function for backwards compatibility; do not use this, use register_paste_params_button""" + for tabname, button in buttons.items(): + source_text_component = send_generate_info if isinstance(send_generate_info, gr.components.Component) else None + source_tabname = send_generate_info if isinstance(send_generate_info, str) else None + + register_paste_params_button(ParamBinding(paste_button=button, tabname=tabname, source_text_component=source_text_component, source_image_component=send_image, source_tabname=source_tabname)) + + +def register_paste_params_button(binding: ParamBinding): + registered_param_bindings.append(binding) + + +def connect_paste_params_buttons(): + for binding in registered_param_bindings: + destination_image_component = paste_fields[binding.tabname]["init_img"] + fields = paste_fields[binding.tabname]["fields"] + override_settings_component = binding.override_settings_component or paste_fields[binding.tabname]["override_settings_component"] + + destination_width_component = next(iter([field for field, name in fields if name == "Size-1"] if fields else []), None) + destination_height_component = next(iter([field for field, name in fields if name == "Size-2"] if fields else []), None) + + if binding.source_image_component and destination_image_component: + if isinstance(binding.source_image_component, gr.Gallery): + func = send_image_and_dimensions if destination_width_component else image_from_url_text + jsfunc = "extract_image_from_gallery" + else: + func = send_image_and_dimensions if destination_width_component else lambda x: x + jsfunc = None + + binding.paste_button.click( + fn=func, + _js=jsfunc, + inputs=[binding.source_image_component], + outputs=[destination_image_component, destination_width_component, destination_height_component] if destination_width_component else [destination_image_component], + show_progress=False, + ) + + if binding.source_text_component is not None and fields is not None: + connect_paste(binding.paste_button, fields, binding.source_text_component, override_settings_component, binding.tabname) + + if binding.source_tabname is not None and fields is not None: + paste_field_names = ['Prompt', 'Negative prompt', 'Steps', 'Face restoration'] + (["Seed"] if shared.opts.send_seed else []) + binding.paste_field_names + binding.paste_button.click( + fn=lambda *x: x, + inputs=[field for field, name in paste_fields[binding.source_tabname]["fields"] if name in paste_field_names], + outputs=[field for field, name in fields if name in paste_field_names], + show_progress=False, + ) + + binding.paste_button.click( + fn=None, + _js=f"switch_to_{binding.tabname}", + inputs=None, + outputs=None, + show_progress=False, + ) + + +def send_image_and_dimensions(x): + if isinstance(x, Image.Image): + img = x + else: + img = image_from_url_text(x) + + if shared.opts.send_size and isinstance(img, Image.Image): + w = img.width + h = img.height + else: + w = gr.update() + h = gr.update() + + return img, w, h + + +def restore_old_hires_fix_params(res): + """for infotexts that specify old First pass size parameter, convert it into + width, height, and hr scale""" + + firstpass_width = res.get('First pass size-1', None) + firstpass_height = res.get('First pass size-2', None) + + if shared.opts.use_old_hires_fix_width_height: + hires_width = int(res.get("Hires resize-1", 0)) + hires_height = int(res.get("Hires resize-2", 0)) + + if hires_width and hires_height: + res['Size-1'] = hires_width + res['Size-2'] = hires_height + return + + if firstpass_width is None or firstpass_height is None: + return + + firstpass_width, firstpass_height = int(firstpass_width), int(firstpass_height) + width = int(res.get("Size-1", 512)) + height = int(res.get("Size-2", 512)) + + if firstpass_width == 0 or firstpass_height == 0: + firstpass_width, firstpass_height = processing.old_hires_fix_first_pass_dimensions(width, height) + + res['Size-1'] = firstpass_width + res['Size-2'] = firstpass_height + res['Hires resize-1'] = width + res['Hires resize-2'] = height + + +def parse_generation_parameters(x: str): + """parses generation parameters string, the one you see in text field under the picture in UI: +``` +girl with an artist's beret, determined, blue eyes, desert scene, computer monitors, heavy makeup, by Alphonse Mucha and Charlie Bowater, ((eyeshadow)), (coquettish), detailed, intricate +Negative prompt: ugly, fat, obese, chubby, (((deformed))), [blurry], bad anatomy, disfigured, poorly drawn face, mutation, mutated, (extra_limb), (ugly), (poorly drawn hands), messy drawing +Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 965400086, Size: 512x512, Model hash: 45dee52b +``` + + returns a dict with field values + """ + + res = {} + + prompt = "" + negative_prompt = "" + + done_with_prompt = False + + *lines, lastline = x.strip().split("\n") + if len(re_param.findall(lastline)) < 3: + lines.append(lastline) + lastline = '' + + for line in lines: + line = line.strip() + if line.startswith("Negative prompt:"): + done_with_prompt = True + line = line[16:].strip() + if done_with_prompt: + negative_prompt += ("" if negative_prompt == "" else "\n") + line + else: + prompt += ("" if prompt == "" else "\n") + line + + if shared.opts.infotext_styles != "Ignore": + found_styles, prompt, negative_prompt = shared.prompt_styles.extract_styles_from_prompt(prompt, negative_prompt) + + if shared.opts.infotext_styles == "Apply": + res["Styles array"] = found_styles + elif shared.opts.infotext_styles == "Apply if any" and found_styles: + res["Styles array"] = found_styles + + res["Prompt"] = prompt + res["Negative prompt"] = negative_prompt + + for k, v in re_param.findall(lastline): + try: + if v[0] == '"' and v[-1] == '"': + v = unquote(v) + + m = re_imagesize.match(v) + if m is not None: + res[f"{k}-1"] = m.group(1) + res[f"{k}-2"] = m.group(2) + else: + res[k] = v + except Exception: + print(f"Error parsing \"{k}: {v}\"") + + # Missing CLIP skip means it was set to 1 (the default) + if "Clip skip" not in res: + res["Clip skip"] = "1" + + hypernet = res.get("Hypernet", None) + if hypernet is not None: + res["Prompt"] += f"""""" + + if "Hires resize-1" not in res: + res["Hires resize-1"] = 0 + res["Hires resize-2"] = 0 + + if "Hires sampler" not in res: + res["Hires sampler"] = "Use same sampler" + + if "Hires checkpoint" not in res: + res["Hires checkpoint"] = "Use same checkpoint" + + if "Hires prompt" not in res: + res["Hires prompt"] = "" + + if "Hires negative prompt" not in res: + res["Hires negative prompt"] = "" + + restore_old_hires_fix_params(res) + + # Missing RNG means the default was set, which is GPU RNG + if "RNG" not in res: + res["RNG"] = "GPU" + + if "Schedule type" not in res: + res["Schedule type"] = "Automatic" + + if "Schedule max sigma" not in res: + res["Schedule max sigma"] = 0 + + if "Schedule min sigma" not in res: + res["Schedule min sigma"] = 0 + + if "Schedule rho" not in res: + res["Schedule rho"] = 0 + + if "VAE Encoder" not in res: + res["VAE Encoder"] = "Full" + + if "VAE Decoder" not in res: + res["VAE Decoder"] = "Full" + + skip = set(shared.opts.infotext_skip_pasting) + res = {k: v for k, v in res.items() if k not in skip} + + return res + + +infotext_to_setting_name_mapping = [ + +] +"""Mapping of infotext labels to setting names. Only left for backwards compatibility - use OptionInfo(..., infotext='...') instead. +Example content: + +infotext_to_setting_name_mapping = [ + ('Conditional mask weight', 'inpainting_mask_weight'), + ('Model hash', 'sd_model_checkpoint'), + ('ENSD', 'eta_noise_seed_delta'), + ('Schedule type', 'k_sched_type'), +] +""" + + +def create_override_settings_dict(text_pairs): + """creates processing's override_settings parameters from gradio's multiselect + + Example input: + ['Clip skip: 2', 'Model hash: e6e99610c4', 'ENSD: 31337'] + + Example output: + {'CLIP_stop_at_last_layers': 2, 'sd_model_checkpoint': 'e6e99610c4', 'eta_noise_seed_delta': 31337} + """ + + res = {} + + params = {} + for pair in text_pairs: + k, v = pair.split(":", maxsplit=1) + + params[k] = v.strip() + + mapping = [(info.infotext, k) for k, info in shared.opts.data_labels.items() if info.infotext] + for param_name, setting_name in mapping + infotext_to_setting_name_mapping: + value = params.get(param_name, None) + + if value is None: + continue + + res[setting_name] = shared.opts.cast_value(setting_name, value) + + return res + + +def connect_paste(button, paste_fields, input_comp, override_settings_component, tabname): + def paste_func(prompt): + if not prompt and not shared.cmd_opts.hide_ui_dir_config: + filename = os.path.join(data_path, "params.txt") + if os.path.exists(filename): + with open(filename, "r", encoding="utf8") as file: + prompt = file.read() + + params = parse_generation_parameters(prompt) + script_callbacks.infotext_pasted_callback(prompt, params) + res = [] + + for output, key in paste_fields: + if callable(key): + v = key(params) + else: + v = params.get(key, None) + + if v is None: + res.append(gr.update()) + elif isinstance(v, type_of_gr_update): + res.append(v) + else: + try: + valtype = type(output.value) + + if valtype == bool and v == "False": + val = False + else: + val = valtype(v) + + res.append(gr.update(value=val)) + except Exception: + res.append(gr.update()) + + return res + + if override_settings_component is not None: + already_handled_fields = {key: 1 for _, key in paste_fields} + + def paste_settings(params): + vals = {} + + mapping = [(info.infotext, k) for k, info in shared.opts.data_labels.items() if info.infotext] + for param_name, setting_name in mapping + infotext_to_setting_name_mapping: + if param_name in already_handled_fields: + continue + + v = params.get(param_name, None) + if v is None: + continue + + if setting_name == "sd_model_checkpoint" and shared.opts.disable_weights_auto_swap: + continue + + v = shared.opts.cast_value(setting_name, v) + current_value = getattr(shared.opts, setting_name, None) + + if v == current_value: + continue + + vals[param_name] = v + + vals_pairs = [f"{k}: {v}" for k, v in vals.items()] + + return gr.Dropdown.update(value=vals_pairs, choices=vals_pairs, visible=bool(vals_pairs)) + + paste_fields = paste_fields + [(override_settings_component, paste_settings)] + + button.click( + fn=paste_func, + inputs=[input_comp], + outputs=[x[0] for x in paste_fields], + show_progress=False, + ) + button.click( + fn=None, + _js=f"recalculate_prompts_{tabname}", + inputs=[], + outputs=[], + show_progress=False, + ) + diff --git a/stable-diffusion-webui/modules/gfpgan_model.py b/stable-diffusion-webui/modules/gfpgan_model.py new file mode 100644 index 0000000000000000000000000000000000000000..6c3ce0bdea8265982fd51fa8d3be60b8f204970a --- /dev/null +++ b/stable-diffusion-webui/modules/gfpgan_model.py @@ -0,0 +1,125 @@ +import os + +import facexlib +import gfpgan + +import modules.face_restoration +from modules import paths, shared, devices, modelloader, errors + +model_dir = "GFPGAN" +user_path = None +model_path = os.path.join(paths.models_path, model_dir) +model_file_path = None +model_url = "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth" +have_gfpgan = False +loaded_gfpgan_model = None + + +def gfpgann(): + global loaded_gfpgan_model + global model_path + global model_file_path + if loaded_gfpgan_model is not None: + loaded_gfpgan_model.gfpgan.to(devices.device_gfpgan) + return loaded_gfpgan_model + + if gfpgan_constructor is None: + return None + + models = modelloader.load_models(model_path, model_url, user_path, ext_filter=['.pth']) + + if len(models) == 1 and models[0].startswith("http"): + model_file = models[0] + elif len(models) != 0: + gfp_models = [] + for item in models: + if 'GFPGAN' in os.path.basename(item): + gfp_models.append(item) + latest_file = max(gfp_models, key=os.path.getctime) + model_file = latest_file + else: + print("Unable to load gfpgan model!") + return None + + if hasattr(facexlib.detection.retinaface, 'device'): + facexlib.detection.retinaface.device = devices.device_gfpgan + model_file_path = model_file + model = gfpgan_constructor(model_path=model_file, upscale=1, arch='clean', channel_multiplier=2, bg_upsampler=None, device=devices.device_gfpgan) + loaded_gfpgan_model = model + + return model + + +def send_model_to(model, device): + model.gfpgan.to(device) + model.face_helper.face_det.to(device) + model.face_helper.face_parse.to(device) + + +def gfpgan_fix_faces(np_image): + model = gfpgann() + if model is None: + return np_image + + send_model_to(model, devices.device_gfpgan) + + np_image_bgr = np_image[:, :, ::-1] + cropped_faces, restored_faces, gfpgan_output_bgr = model.enhance(np_image_bgr, has_aligned=False, only_center_face=False, paste_back=True) + np_image = gfpgan_output_bgr[:, :, ::-1] + + model.face_helper.clean_all() + + if shared.opts.face_restoration_unload: + send_model_to(model, devices.cpu) + + return np_image + + +gfpgan_constructor = None + + +def setup_model(dirname): + try: + os.makedirs(model_path, exist_ok=True) + from gfpgan import GFPGANer + from facexlib import detection, parsing # noqa: F401 + global user_path + global have_gfpgan + global gfpgan_constructor + global model_file_path + + facexlib_path = model_path + + if dirname is not None: + facexlib_path = dirname + + load_file_from_url_orig = gfpgan.utils.load_file_from_url + facex_load_file_from_url_orig = facexlib.detection.load_file_from_url + facex_load_file_from_url_orig2 = facexlib.parsing.load_file_from_url + + def my_load_file_from_url(**kwargs): + return load_file_from_url_orig(**dict(kwargs, model_dir=model_file_path)) + + def facex_load_file_from_url(**kwargs): + return facex_load_file_from_url_orig(**dict(kwargs, save_dir=facexlib_path, model_dir=None)) + + def facex_load_file_from_url2(**kwargs): + return facex_load_file_from_url_orig2(**dict(kwargs, save_dir=facexlib_path, model_dir=None)) + + gfpgan.utils.load_file_from_url = my_load_file_from_url + facexlib.detection.load_file_from_url = facex_load_file_from_url + facexlib.parsing.load_file_from_url = facex_load_file_from_url2 + user_path = dirname + have_gfpgan = True + gfpgan_constructor = GFPGANer + + class FaceRestorerGFPGAN(modules.face_restoration.FaceRestoration): + def name(self): + return "GFPGAN" + + def restore(self, np_image): + return gfpgan_fix_faces(np_image) + + shared.face_restorers.append(FaceRestorerGFPGAN()) + except Exception: + errors.report("Error setting up GFPGAN", exc_info=True) diff --git a/stable-diffusion-webui/modules/gitpython_hack.py b/stable-diffusion-webui/modules/gitpython_hack.py new file mode 100644 index 0000000000000000000000000000000000000000..b55f0640e5ecb945ec72e9aeccd525c6dd9d7cb8 --- /dev/null +++ b/stable-diffusion-webui/modules/gitpython_hack.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +import io +import subprocess + +import git + + +class Git(git.Git): + """ + Git subclassed to never use persistent processes. + """ + + def _get_persistent_cmd(self, attr_name, cmd_name, *args, **kwargs): + raise NotImplementedError(f"Refusing to use persistent process: {attr_name} ({cmd_name} {args} {kwargs})") + + def get_object_header(self, ref: str | bytes) -> tuple[str, str, int]: + ret = subprocess.check_output( + [self.GIT_PYTHON_GIT_EXECUTABLE, "cat-file", "--batch-check"], + input=self._prepare_ref(ref), + cwd=self._working_dir, + timeout=2, + ) + return self._parse_object_header(ret) + + def stream_object_data(self, ref: str) -> tuple[str, str, int, Git.CatFileContentStream]: + # Not really streaming, per se; this buffers the entire object in memory. + # Shouldn't be a problem for our use case, since we're only using this for + # object headers (commit objects). + ret = subprocess.check_output( + [self.GIT_PYTHON_GIT_EXECUTABLE, "cat-file", "--batch"], + input=self._prepare_ref(ref), + cwd=self._working_dir, + timeout=30, + ) + bio = io.BytesIO(ret) + hexsha, typename, size = self._parse_object_header(bio.readline()) + return (hexsha, typename, size, self.CatFileContentStream(size, bio)) + + +class Repo(git.Repo): + GitCommandWrapperType = Git diff --git a/stable-diffusion-webui/modules/gradio_extensons.py b/stable-diffusion-webui/modules/gradio_extensons.py new file mode 100644 index 0000000000000000000000000000000000000000..34e38700a62fbb512c9b5867829737fd6d17a610 --- /dev/null +++ b/stable-diffusion-webui/modules/gradio_extensons.py @@ -0,0 +1,83 @@ +import gradio as gr + +from modules import scripts, ui_tempdir, patches + + +def add_classes_to_gradio_component(comp): + """ + this adds gradio-* to the component for css styling (ie gradio-button to gr.Button), as well as some others + """ + + comp.elem_classes = [f"gradio-{comp.get_block_name()}", *(comp.elem_classes or [])] + + if getattr(comp, 'multiselect', False): + comp.elem_classes.append('multiselect') + + +def IOComponent_init(self, *args, **kwargs): + self.webui_tooltip = kwargs.pop('tooltip', None) + + if scripts.scripts_current is not None: + scripts.scripts_current.before_component(self, **kwargs) + + scripts.script_callbacks.before_component_callback(self, **kwargs) + + res = original_IOComponent_init(self, *args, **kwargs) + + add_classes_to_gradio_component(self) + + scripts.script_callbacks.after_component_callback(self, **kwargs) + + if scripts.scripts_current is not None: + scripts.scripts_current.after_component(self, **kwargs) + + return res + + +def Block_get_config(self): + config = original_Block_get_config(self) + + webui_tooltip = getattr(self, 'webui_tooltip', None) + if webui_tooltip: + config["webui_tooltip"] = webui_tooltip + + config.pop('example_inputs', None) + + return config + + +def BlockContext_init(self, *args, **kwargs): + if scripts.scripts_current is not None: + scripts.scripts_current.before_component(self, **kwargs) + + scripts.script_callbacks.before_component_callback(self, **kwargs) + + res = original_BlockContext_init(self, *args, **kwargs) + + add_classes_to_gradio_component(self) + + scripts.script_callbacks.after_component_callback(self, **kwargs) + + if scripts.scripts_current is not None: + scripts.scripts_current.after_component(self, **kwargs) + + return res + + +def Blocks_get_config_file(self, *args, **kwargs): + config = original_Blocks_get_config_file(self, *args, **kwargs) + + for comp_config in config["components"]: + if "example_inputs" in comp_config: + comp_config["example_inputs"] = {"serialized": []} + + return config + + +original_IOComponent_init = patches.patch(__name__, obj=gr.components.IOComponent, field="__init__", replacement=IOComponent_init) +original_Block_get_config = patches.patch(__name__, obj=gr.blocks.Block, field="get_config", replacement=Block_get_config) +original_BlockContext_init = patches.patch(__name__, obj=gr.blocks.BlockContext, field="__init__", replacement=BlockContext_init) +original_Blocks_get_config_file = patches.patch(__name__, obj=gr.blocks.Blocks, field="get_config_file", replacement=Blocks_get_config_file) + + +ui_tempdir.install_ui_tempdir_override() diff --git a/stable-diffusion-webui/modules/hashes.py b/stable-diffusion-webui/modules/hashes.py new file mode 100644 index 0000000000000000000000000000000000000000..59a81eaabc91567a1a3a3caa12f1f9944f487806 --- /dev/null +++ b/stable-diffusion-webui/modules/hashes.py @@ -0,0 +1,81 @@ +import hashlib +import os.path + +from modules import shared +import modules.cache + +dump_cache = modules.cache.dump_cache +cache = modules.cache.cache + + +def calculate_sha256(filename): + hash_sha256 = hashlib.sha256() + blksize = 1024 * 1024 + + with open(filename, "rb") as f: + for chunk in iter(lambda: f.read(blksize), b""): + hash_sha256.update(chunk) + + return hash_sha256.hexdigest() + + +def sha256_from_cache(filename, title, use_addnet_hash=False): + hashes = cache("hashes-addnet") if use_addnet_hash else cache("hashes") + ondisk_mtime = os.path.getmtime(filename) + + if title not in hashes: + return None + + cached_sha256 = hashes[title].get("sha256", None) + cached_mtime = hashes[title].get("mtime", 0) + + if ondisk_mtime > cached_mtime or cached_sha256 is None: + return None + + return cached_sha256 + + +def sha256(filename, title, use_addnet_hash=False): + hashes = cache("hashes-addnet") if use_addnet_hash else cache("hashes") + + sha256_value = sha256_from_cache(filename, title, use_addnet_hash) + if sha256_value is not None: + return sha256_value + + if shared.cmd_opts.no_hashing: + return None + + print(f"Calculating sha256 for {filename}: ", end='') + if use_addnet_hash: + with open(filename, "rb") as file: + sha256_value = addnet_hash_safetensors(file) + else: + sha256_value = calculate_sha256(filename) + print(f"{sha256_value}") + + hashes[title] = { + "mtime": os.path.getmtime(filename), + "sha256": sha256_value, + } + + dump_cache() + + return sha256_value + + +def addnet_hash_safetensors(b): + """kohya-ss hash for safetensors from https://github.com/kohya-ss/sd-scripts/blob/main/library/train_util.py""" + hash_sha256 = hashlib.sha256() + blksize = 1024 * 1024 + + b.seek(0) + header = b.read(8) + n = int.from_bytes(header, "little") + + offset = n + 8 + b.seek(offset) + for chunk in iter(lambda: b.read(blksize), b""): + hash_sha256.update(chunk) + + return hash_sha256.hexdigest() + diff --git a/stable-diffusion-webui/modules/hypernetworks/__pycache__/hypernetwork.cpython-310.pyc b/stable-diffusion-webui/modules/hypernetworks/__pycache__/hypernetwork.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1e86dd4c26bbd7e2184d6c0565eaafbfb1ebdd7 Binary files /dev/null and b/stable-diffusion-webui/modules/hypernetworks/__pycache__/hypernetwork.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/hypernetworks/__pycache__/ui.cpython-310.pyc b/stable-diffusion-webui/modules/hypernetworks/__pycache__/ui.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f6cf00ac4f6fbc53c6136fa4dcd04b46810404f Binary files /dev/null and b/stable-diffusion-webui/modules/hypernetworks/__pycache__/ui.cpython-310.pyc differ diff --git a/stable-diffusion-webui/modules/hypernetworks/hypernetwork.py b/stable-diffusion-webui/modules/hypernetworks/hypernetwork.py new file mode 100644 index 0000000000000000000000000000000000000000..30086041107f2ca55169721c4ea1e7d06267d80c --- /dev/null +++ b/stable-diffusion-webui/modules/hypernetworks/hypernetwork.py @@ -0,0 +1,782 @@ +import datetime +import glob +import html +import os +import inspect +from contextlib import closing + +import modules.textual_inversion.dataset +import torch +import tqdm +from einops import rearrange, repeat +from ldm.util import default +from modules import devices, sd_models, shared, sd_samplers, hashes, sd_hijack_checkpoint, errors +from modules.textual_inversion import textual_inversion, logging +from modules.textual_inversion.learn_schedule import LearnRateScheduler +from torch import einsum +from torch.nn.init import normal_, xavier_normal_, xavier_uniform_, kaiming_normal_, kaiming_uniform_, zeros_ + +from collections import deque +from statistics import stdev, mean + + +optimizer_dict = {optim_name : cls_obj for optim_name, cls_obj in inspect.getmembers(torch.optim, inspect.isclass) if optim_name != "Optimizer"} + +class HypernetworkModule(torch.nn.Module): + activation_dict = { + "linear": torch.nn.Identity, + "relu": torch.nn.ReLU, + "leakyrelu": torch.nn.LeakyReLU, + "elu": torch.nn.ELU, + "swish": torch.nn.Hardswish, + "tanh": torch.nn.Tanh, + "sigmoid": torch.nn.Sigmoid, + } + activation_dict.update({cls_name.lower(): cls_obj for cls_name, cls_obj in inspect.getmembers(torch.nn.modules.activation) if inspect.isclass(cls_obj) and cls_obj.__module__ == 'torch.nn.modules.activation'}) + + def __init__(self, dim, state_dict=None, layer_structure=None, activation_func=None, weight_init='Normal', + add_layer_norm=False, activate_output=False, dropout_structure=None): + super().__init__() + + self.multiplier = 1.0 + + assert layer_structure is not None, "layer_structure must not be None" + assert layer_structure[0] == 1, "Multiplier Sequence should start with size 1!" + assert layer_structure[-1] == 1, "Multiplier Sequence should end with size 1!" + + linears = [] + for i in range(len(layer_structure) - 1): + + # Add a fully-connected layer + linears.append(torch.nn.Linear(int(dim * layer_structure[i]), int(dim * layer_structure[i+1]))) + + # Add an activation func except last layer + if activation_func == "linear" or activation_func is None or (i >= len(layer_structure) - 2 and not activate_output): + pass + elif activation_func in self.activation_dict: + linears.append(self.activation_dict[activation_func]()) + else: + raise RuntimeError(f'hypernetwork uses an unsupported activation function: {activation_func}') + + # Add layer normalization + if add_layer_norm: + linears.append(torch.nn.LayerNorm(int(dim * layer_structure[i+1]))) + + # Everything should be now parsed into dropout structure, and applied here. + # Since we only have dropouts after layers, dropout structure should start with 0 and end with 0. + if dropout_structure is not None and dropout_structure[i+1] > 0: + assert 0 < dropout_structure[i+1] < 1, "Dropout probability should be 0 or float between 0 and 1!" + linears.append(torch.nn.Dropout(p=dropout_structure[i+1])) + # Code explanation : [1, 2, 1] -> dropout is missing when last_layer_dropout is false. [1, 2, 2, 1] -> [0, 0.3, 0, 0], when its True, [0, 0.3, 0.3, 0]. + + self.linear = torch.nn.Sequential(*linears) + + if state_dict is not None: + self.fix_old_state_dict(state_dict) + self.load_state_dict(state_dict) + else: + for layer in self.linear: + if type(layer) == torch.nn.Linear or type(layer) == torch.nn.LayerNorm: + w, b = layer.weight.data, layer.bias.data + if weight_init == "Normal" or type(layer) == torch.nn.LayerNorm: + normal_(w, mean=0.0, std=0.01) + normal_(b, mean=0.0, std=0) + elif weight_init == 'XavierUniform': + xavier_uniform_(w) + zeros_(b) + elif weight_init == 'XavierNormal': + xavier_normal_(w) + zeros_(b) + elif weight_init == 'KaimingUniform': + kaiming_uniform_(w, nonlinearity='leaky_relu' if 'leakyrelu' == activation_func else 'relu') + zeros_(b) + elif weight_init == 'KaimingNormal': + kaiming_normal_(w, nonlinearity='leaky_relu' if 'leakyrelu' == activation_func else 'relu') + zeros_(b) + else: + raise KeyError(f"Key {weight_init} is not defined as initialization!") + self.to(devices.device) + + def fix_old_state_dict(self, state_dict): + changes = { + 'linear1.bias': 'linear.0.bias', + 'linear1.weight': 'linear.0.weight', + 'linear2.bias': 'linear.1.bias', + 'linear2.weight': 'linear.1.weight', + } + + for fr, to in changes.items(): + x = state_dict.get(fr, None) + if x is None: + continue + + del state_dict[fr] + state_dict[to] = x + + def forward(self, x): + return x + self.linear(x) * (self.multiplier if not self.training else 1) + + def trainables(self): + layer_structure = [] + for layer in self.linear: + if type(layer) == torch.nn.Linear or type(layer) == torch.nn.LayerNorm: + layer_structure += [layer.weight, layer.bias] + return layer_structure + + +#param layer_structure : sequence used for length, use_dropout : controlling boolean, last_layer_dropout : for compatibility check. +def parse_dropout_structure(layer_structure, use_dropout, last_layer_dropout): + if layer_structure is None: + layer_structure = [1, 2, 1] + if not use_dropout: + return [0] * len(layer_structure) + dropout_values = [0] + dropout_values.extend([0.3] * (len(layer_structure) - 3)) + if last_layer_dropout: + dropout_values.append(0.3) + else: + dropout_values.append(0) + dropout_values.append(0) + return dropout_values + + +class Hypernetwork: + filename = None + name = None + + def __init__(self, name=None, enable_sizes=None, layer_structure=None, activation_func=None, weight_init=None, add_layer_norm=False, use_dropout=False, activate_output=False, **kwargs): + self.filename = None + self.name = name + self.layers = {} + self.step = 0 + self.sd_checkpoint = None + self.sd_checkpoint_name = None + self.layer_structure = layer_structure + self.activation_func = activation_func + self.weight_init = weight_init + self.add_layer_norm = add_layer_norm + self.use_dropout = use_dropout + self.activate_output = activate_output + self.last_layer_dropout = kwargs.get('last_layer_dropout', True) + self.dropout_structure = kwargs.get('dropout_structure', None) + if self.dropout_structure is None: + self.dropout_structure = parse_dropout_structure(self.layer_structure, self.use_dropout, self.last_layer_dropout) + self.optimizer_name = None + self.optimizer_state_dict = None + self.optional_info = None + + for size in enable_sizes or []: + self.layers[size] = ( + HypernetworkModule(size, None, self.layer_structure, self.activation_func, self.weight_init, + self.add_layer_norm, self.activate_output, dropout_structure=self.dropout_structure), + HypernetworkModule(size, None, self.layer_structure, self.activation_func, self.weight_init, + self.add_layer_norm, self.activate_output, dropout_structure=self.dropout_structure), + ) + self.eval() + + def weights(self): + res = [] + for layers in self.layers.values(): + for layer in layers: + res += layer.parameters() + return res + + def train(self, mode=True): + for layers in self.layers.values(): + for layer in layers: + layer.train(mode=mode) + for param in layer.parameters(): + param.requires_grad = mode + + def to(self, device): + for layers in self.layers.values(): + for layer in layers: + layer.to(device) + + return self + + def set_multiplier(self, multiplier): + for layers in self.layers.values(): + for layer in layers: + layer.multiplier = multiplier + + return self + + def eval(self): + for layers in self.layers.values(): + for layer in layers: + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def save(self, filename): + state_dict = {} + optimizer_saved_dict = {} + + for k, v in self.layers.items(): + state_dict[k] = (v[0].state_dict(), v[1].state_dict()) + + state_dict['step'] = self.step + state_dict['name'] = self.name + state_dict['layer_structure'] = self.layer_structure + state_dict['activation_func'] = self.activation_func + state_dict['is_layer_norm'] = self.add_layer_norm + state_dict['weight_initialization'] = self.weight_init + state_dict['sd_checkpoint'] = self.sd_checkpoint + state_dict['sd_checkpoint_name'] = self.sd_checkpoint_name + state_dict['activate_output'] = self.activate_output + state_dict['use_dropout'] = self.use_dropout + state_dict['dropout_structure'] = self.dropout_structure + state_dict['last_layer_dropout'] = (self.dropout_structure[-2] != 0) if self.dropout_structure is not None else self.last_layer_dropout + state_dict['optional_info'] = self.optional_info if self.optional_info else None + + if self.optimizer_name is not None: + optimizer_saved_dict['optimizer_name'] = self.optimizer_name + + torch.save(state_dict, filename) + if shared.opts.save_optimizer_state and self.optimizer_state_dict: + optimizer_saved_dict['hash'] = self.shorthash() + optimizer_saved_dict['optimizer_state_dict'] = self.optimizer_state_dict + torch.save(optimizer_saved_dict, filename + '.optim') + + def load(self, filename): + self.filename = filename + if self.name is None: + self.name = os.path.splitext(os.path.basename(filename))[0] + + state_dict = torch.load(filename, map_location='cpu') + + self.layer_structure = state_dict.get('layer_structure', [1, 2, 1]) + self.optional_info = state_dict.get('optional_info', None) + self.activation_func = state_dict.get('activation_func', None) + self.weight_init = state_dict.get('weight_initialization', 'Normal') + self.add_layer_norm = state_dict.get('is_layer_norm', False) + self.dropout_structure = state_dict.get('dropout_structure', None) + self.use_dropout = True if self.dropout_structure is not None and any(self.dropout_structure) else state_dict.get('use_dropout', False) + self.activate_output = state_dict.get('activate_output', True) + self.last_layer_dropout = state_dict.get('last_layer_dropout', False) + # Dropout structure should have same length as layer structure, Every digits should be in [0,1), and last digit must be 0. + if self.dropout_structure is None: + self.dropout_structure = parse_dropout_structure(self.layer_structure, self.use_dropout, self.last_layer_dropout) + + if shared.opts.print_hypernet_extra: + if self.optional_info is not None: + print(f" INFO:\n {self.optional_info}\n") + + print(f" Layer structure: {self.layer_structure}") + print(f" Activation function: {self.activation_func}") + print(f" Weight initialization: {self.weight_init}") + print(f" Layer norm: {self.add_layer_norm}") + print(f" Dropout usage: {self.use_dropout}" ) + print(f" Activate last layer: {self.activate_output}") + print(f" Dropout structure: {self.dropout_structure}") + + optimizer_saved_dict = torch.load(self.filename + '.optim', map_location='cpu') if os.path.exists(self.filename + '.optim') else {} + + if self.shorthash() == optimizer_saved_dict.get('hash', None): + self.optimizer_state_dict = optimizer_saved_dict.get('optimizer_state_dict', None) + else: + self.optimizer_state_dict = None + if self.optimizer_state_dict: + self.optimizer_name = optimizer_saved_dict.get('optimizer_name', 'AdamW') + if shared.opts.print_hypernet_extra: + print("Loaded existing optimizer from checkpoint") + print(f"Optimizer name is {self.optimizer_name}") + else: + self.optimizer_name = "AdamW" + if shared.opts.print_hypernet_extra: + print("No saved optimizer exists in checkpoint") + + for size, sd in state_dict.items(): + if type(size) == int: + self.layers[size] = ( + HypernetworkModule(size, sd[0], self.layer_structure, self.activation_func, self.weight_init, + self.add_layer_norm, self.activate_output, self.dropout_structure), + HypernetworkModule(size, sd[1], self.layer_structure, self.activation_func, self.weight_init, + self.add_layer_norm, self.activate_output, self.dropout_structure), + ) + + self.name = state_dict.get('name', self.name) + self.step = state_dict.get('step', 0) + self.sd_checkpoint = state_dict.get('sd_checkpoint', None) + self.sd_checkpoint_name = state_dict.get('sd_checkpoint_name', None) + self.eval() + + def shorthash(self): + sha256 = hashes.sha256(self.filename, f'hypernet/{self.name}') + + return sha256[0:10] if sha256 else None + + +def list_hypernetworks(path): + res = {} + for filename in sorted(glob.iglob(os.path.join(path, '**/*.pt'), recursive=True), key=str.lower): + name = os.path.splitext(os.path.basename(filename))[0] + # Prevent a hypothetical "None.pt" from being listed. + if name != "None": + res[name] = filename + return res + + +def load_hypernetwork(name): + path = shared.hypernetworks.get(name, None) + + if path is None: + return None + + try: + hypernetwork = Hypernetwork() + hypernetwork.load(path) + return hypernetwork + except Exception: + errors.report(f"Error loading hypernetwork {path}", exc_info=True) + return None + + +def load_hypernetworks(names, multipliers=None): + already_loaded = {} + + for hypernetwork in shared.loaded_hypernetworks: + if hypernetwork.name in names: + already_loaded[hypernetwork.name] = hypernetwork + + shared.loaded_hypernetworks.clear() + + for i, name in enumerate(names): + hypernetwork = already_loaded.get(name, None) + if hypernetwork is None: + hypernetwork = load_hypernetwork(name) + + if hypernetwork is None: + continue + + hypernetwork.set_multiplier(multipliers[i] if multipliers else 1.0) + shared.loaded_hypernetworks.append(hypernetwork) + + +def apply_single_hypernetwork(hypernetwork, context_k, context_v, layer=None): + hypernetwork_layers = (hypernetwork.layers if hypernetwork is not None else {}).get(context_k.shape[2], None) + + if hypernetwork_layers is None: + return context_k, context_v + + if layer is not None: + layer.hyper_k = hypernetwork_layers[0] + layer.hyper_v = hypernetwork_layers[1] + + context_k = devices.cond_cast_unet(hypernetwork_layers[0](devices.cond_cast_float(context_k))) + context_v = devices.cond_cast_unet(hypernetwork_layers[1](devices.cond_cast_float(context_v))) + return context_k, context_v + + +def apply_hypernetworks(hypernetworks, context, layer=None): + context_k = context + context_v = context + for hypernetwork in hypernetworks: + context_k, context_v = apply_single_hypernetwork(hypernetwork, context_k, context_v, layer) + + return context_k, context_v + + +def attention_CrossAttention_forward(self, x, context=None, mask=None, **kwargs): + h = self.heads + + q = self.to_q(x) + context = default(context, x) + + context_k, context_v = apply_hypernetworks(shared.loaded_hypernetworks, context, self) + k = self.to_k(context_k) + v = self.to_v(context_v) + + q, k, v = (rearrange(t, 'b n (h d) -> (b h) n d', h=h) for t in (q, k, v)) + + sim = einsum('b i d, b j d -> b i j', q, k) * self.scale + + if mask is not None: + mask = rearrange(mask, 'b ... -> b (...)') + max_neg_value = -torch.finfo(sim.dtype).max + mask = repeat(mask, 'b j -> (b h) () j', h=h) + sim.masked_fill_(~mask, max_neg_value) + + # attention, what we cannot get enough of + attn = sim.softmax(dim=-1) + + out = einsum('b i j, b j d -> b i d', attn, v) + out = rearrange(out, '(b h) n d -> b n (h d)', h=h) + return self.to_out(out) + + +def stack_conds(conds): + if len(conds) == 1: + return torch.stack(conds) + + # same as in reconstruct_multicond_batch + token_count = max([x.shape[0] for x in conds]) + for i in range(len(conds)): + if conds[i].shape[0] != token_count: + last_vector = conds[i][-1:] + last_vector_repeated = last_vector.repeat([token_count - conds[i].shape[0], 1]) + conds[i] = torch.vstack([conds[i], last_vector_repeated]) + + return torch.stack(conds) + + +def statistics(data): + if len(data) < 2: + std = 0 + else: + std = stdev(data) + total_information = f"loss:{mean(data):.3f}" + u"\u00B1" + f"({std/ (len(data) ** 0.5):.3f})" + recent_data = data[-32:] + if len(recent_data) < 2: + std = 0 + else: + std = stdev(recent_data) + recent_information = f"recent 32 loss:{mean(recent_data):.3f}" + u"\u00B1" + f"({std / (len(recent_data) ** 0.5):.3f})" + return total_information, recent_information + + +def create_hypernetwork(name, enable_sizes, overwrite_old, layer_structure=None, activation_func=None, weight_init=None, add_layer_norm=False, use_dropout=False, dropout_structure=None): + # Remove illegal characters from name. + name = "".join( x for x in name if (x.isalnum() or x in "._- ")) + assert name, "Name cannot be empty!" + + fn = os.path.join(shared.cmd_opts.hypernetwork_dir, f"{name}.pt") + if not overwrite_old: + assert not os.path.exists(fn), f"file {fn} already exists" + + if type(layer_structure) == str: + layer_structure = [float(x.strip()) for x in layer_structure.split(",")] + + if use_dropout and dropout_structure and type(dropout_structure) == str: + dropout_structure = [float(x.strip()) for x in dropout_structure.split(",")] + else: + dropout_structure = [0] * len(layer_structure) + + hypernet = modules.hypernetworks.hypernetwork.Hypernetwork( + name=name, + enable_sizes=[int(x) for x in enable_sizes], + layer_structure=layer_structure, + activation_func=activation_func, + weight_init=weight_init, + add_layer_norm=add_layer_norm, + use_dropout=use_dropout, + dropout_structure=dropout_structure + ) + hypernet.save(fn) + + shared.reload_hypernetworks() + + +def train_hypernetwork(id_task, hypernetwork_name: str, learn_rate: float, batch_size: int, gradient_step: int, data_root: str, log_directory: str, training_width: int, training_height: int, varsize: bool, steps: int, clip_grad_mode: str, clip_grad_value: float, shuffle_tags: bool, tag_drop_out: bool, latent_sampling_method: str, use_weight: bool, create_image_every: int, save_hypernetwork_every: int, template_filename: str, preview_from_txt2img: bool, preview_prompt: str, preview_negative_prompt: str, preview_steps: int, preview_sampler_name: str, preview_cfg_scale: float, preview_seed: int, preview_width: int, preview_height: int): + from modules import images, processing + + save_hypernetwork_every = save_hypernetwork_every or 0 + create_image_every = create_image_every or 0 + template_file = textual_inversion.textual_inversion_templates.get(template_filename, None) + textual_inversion.validate_train_inputs(hypernetwork_name, learn_rate, batch_size, gradient_step, data_root, template_file, template_filename, steps, save_hypernetwork_every, create_image_every, log_directory, name="hypernetwork") + template_file = template_file.path + + path = shared.hypernetworks.get(hypernetwork_name, None) + hypernetwork = Hypernetwork() + hypernetwork.load(path) + shared.loaded_hypernetworks = [hypernetwork] + + shared.state.job = "train-hypernetwork" + shared.state.textinfo = "Initializing hypernetwork training..." + shared.state.job_count = steps + + hypernetwork_name = hypernetwork_name.rsplit('(', 1)[0] + filename = os.path.join(shared.cmd_opts.hypernetwork_dir, f'{hypernetwork_name}.pt') + + log_directory = os.path.join(log_directory, datetime.datetime.now().strftime("%Y-%m-%d"), hypernetwork_name) + unload = shared.opts.unload_models_when_training + + if save_hypernetwork_every > 0: + hypernetwork_dir = os.path.join(log_directory, "hypernetworks") + os.makedirs(hypernetwork_dir, exist_ok=True) + else: + hypernetwork_dir = None + + if create_image_every > 0: + images_dir = os.path.join(log_directory, "images") + os.makedirs(images_dir, exist_ok=True) + else: + images_dir = None + + checkpoint = sd_models.select_checkpoint() + + initial_step = hypernetwork.step or 0 + if initial_step >= steps: + shared.state.textinfo = "Model has already been trained beyond specified max steps" + return hypernetwork, filename + + scheduler = LearnRateScheduler(learn_rate, steps, initial_step) + + clip_grad = torch.nn.utils.clip_grad_value_ if clip_grad_mode == "value" else torch.nn.utils.clip_grad_norm_ if clip_grad_mode == "norm" else None + if clip_grad: + clip_grad_sched = LearnRateScheduler(clip_grad_value, steps, initial_step, verbose=False) + + if shared.opts.training_enable_tensorboard: + tensorboard_writer = textual_inversion.tensorboard_setup(log_directory) + + # dataset loading may take a while, so input validations and early returns should be done before this + shared.state.textinfo = f"Preparing dataset from {html.escape(data_root)}..." + + pin_memory = shared.opts.pin_memory + + ds = modules.textual_inversion.dataset.PersonalizedBase(data_root=data_root, width=training_width, height=training_height, repeats=shared.opts.training_image_repeats_per_epoch, placeholder_token=hypernetwork_name, model=shared.sd_model, cond_model=shared.sd_model.cond_stage_model, device=devices.device, template_file=template_file, include_cond=True, batch_size=batch_size, gradient_step=gradient_step, shuffle_tags=shuffle_tags, tag_drop_out=tag_drop_out, latent_sampling_method=latent_sampling_method, varsize=varsize, use_weight=use_weight) + + if shared.opts.save_training_settings_to_txt: + saved_params = dict( + model_name=checkpoint.model_name, model_hash=checkpoint.shorthash, num_of_dataset_images=len(ds), + **{field: getattr(hypernetwork, field) for field in ['layer_structure', 'activation_func', 'weight_init', 'add_layer_norm', 'use_dropout', ]} + ) + logging.save_settings_to_file(log_directory, {**saved_params, **locals()}) + + latent_sampling_method = ds.latent_sampling_method + + dl = modules.textual_inversion.dataset.PersonalizedDataLoader(ds, latent_sampling_method=latent_sampling_method, batch_size=ds.batch_size, pin_memory=pin_memory) + + old_parallel_processing_allowed = shared.parallel_processing_allowed + + if unload: + shared.parallel_processing_allowed = False + shared.sd_model.cond_stage_model.to(devices.cpu) + shared.sd_model.first_stage_model.to(devices.cpu) + + weights = hypernetwork.weights() + hypernetwork.train() + + # Here we use optimizer from saved HN, or we can specify as UI option. + if hypernetwork.optimizer_name in optimizer_dict: + optimizer = optimizer_dict[hypernetwork.optimizer_name](params=weights, lr=scheduler.learn_rate) + optimizer_name = hypernetwork.optimizer_name + else: + print(f"Optimizer type {hypernetwork.optimizer_name} is not defined!") + optimizer = torch.optim.AdamW(params=weights, lr=scheduler.learn_rate) + optimizer_name = 'AdamW' + + if hypernetwork.optimizer_state_dict: # This line must be changed if Optimizer type can be different from saved optimizer. + try: + optimizer.load_state_dict(hypernetwork.optimizer_state_dict) + except RuntimeError as e: + print("Cannot resume from saved optimizer!") + print(e) + + scaler = torch.cuda.amp.GradScaler() + + batch_size = ds.batch_size + gradient_step = ds.gradient_step + # n steps = batch_size * gradient_step * n image processed + steps_per_epoch = len(ds) // batch_size // gradient_step + max_steps_per_epoch = len(ds) // batch_size - (len(ds) // batch_size) % gradient_step + loss_step = 0 + _loss_step = 0 #internal + # size = len(ds.indexes) + # loss_dict = defaultdict(lambda : deque(maxlen = 1024)) + loss_logging = deque(maxlen=len(ds) * 3) # this should be configurable parameter, this is 3 * epoch(dataset size) + # losses = torch.zeros((size,)) + # previous_mean_losses = [0] + # previous_mean_loss = 0 + # print("Mean loss of {} elements".format(size)) + + steps_without_grad = 0 + + last_saved_file = "" + last_saved_image = "" + forced_filename = "" + + pbar = tqdm.tqdm(total=steps - initial_step) + try: + sd_hijack_checkpoint.add() + + for _ in range((steps-initial_step) * gradient_step): + if scheduler.finished: + break + if shared.state.interrupted: + break + for j, batch in enumerate(dl): + # works as a drop_last=True for gradient accumulation + if j == max_steps_per_epoch: + break + scheduler.apply(optimizer, hypernetwork.step) + if scheduler.finished: + break + if shared.state.interrupted: + break + + if clip_grad: + clip_grad_sched.step(hypernetwork.step) + + with devices.autocast(): + x = batch.latent_sample.to(devices.device, non_blocking=pin_memory) + if use_weight: + w = batch.weight.to(devices.device, non_blocking=pin_memory) + if tag_drop_out != 0 or shuffle_tags: + shared.sd_model.cond_stage_model.to(devices.device) + c = shared.sd_model.cond_stage_model(batch.cond_text).to(devices.device, non_blocking=pin_memory) + shared.sd_model.cond_stage_model.to(devices.cpu) + else: + c = stack_conds(batch.cond).to(devices.device, non_blocking=pin_memory) + if use_weight: + loss = shared.sd_model.weighted_forward(x, c, w)[0] / gradient_step + del w + else: + loss = shared.sd_model.forward(x, c)[0] / gradient_step + del x + del c + + _loss_step += loss.item() + scaler.scale(loss).backward() + + # go back until we reach gradient accumulation steps + if (j + 1) % gradient_step != 0: + continue + loss_logging.append(_loss_step) + if clip_grad: + clip_grad(weights, clip_grad_sched.learn_rate) + + scaler.step(optimizer) + scaler.update() + hypernetwork.step += 1 + pbar.update() + optimizer.zero_grad(set_to_none=True) + loss_step = _loss_step + _loss_step = 0 + + steps_done = hypernetwork.step + 1 + + epoch_num = hypernetwork.step // steps_per_epoch + epoch_step = hypernetwork.step % steps_per_epoch + + description = f"Training hypernetwork [Epoch {epoch_num}: {epoch_step+1}/{steps_per_epoch}]loss: {loss_step:.7f}" + pbar.set_description(description) + if hypernetwork_dir is not None and steps_done % save_hypernetwork_every == 0: + # Before saving, change name to match current checkpoint. + hypernetwork_name_every = f'{hypernetwork_name}-{steps_done}' + last_saved_file = os.path.join(hypernetwork_dir, f'{hypernetwork_name_every}.pt') + hypernetwork.optimizer_name = optimizer_name + if shared.opts.save_optimizer_state: + hypernetwork.optimizer_state_dict = optimizer.state_dict() + save_hypernetwork(hypernetwork, checkpoint, hypernetwork_name, last_saved_file) + hypernetwork.optimizer_state_dict = None # dereference it after saving, to save memory. + + + + if shared.opts.training_enable_tensorboard: + epoch_num = hypernetwork.step // len(ds) + epoch_step = hypernetwork.step - (epoch_num * len(ds)) + 1 + mean_loss = sum(loss_logging) / len(loss_logging) + textual_inversion.tensorboard_add(tensorboard_writer, loss=mean_loss, global_step=hypernetwork.step, step=epoch_step, learn_rate=scheduler.learn_rate, epoch_num=epoch_num) + + textual_inversion.write_loss(log_directory, "hypernetwork_loss.csv", hypernetwork.step, steps_per_epoch, { + "loss": f"{loss_step:.7f}", + "learn_rate": scheduler.learn_rate + }) + + if images_dir is not None and steps_done % create_image_every == 0: + forced_filename = f'{hypernetwork_name}-{steps_done}' + last_saved_image = os.path.join(images_dir, forced_filename) + hypernetwork.eval() + rng_state = torch.get_rng_state() + cuda_rng_state = None + if torch.cuda.is_available(): + cuda_rng_state = torch.cuda.get_rng_state_all() + shared.sd_model.cond_stage_model.to(devices.device) + shared.sd_model.first_stage_model.to(devices.device) + + p = processing.StableDiffusionProcessingTxt2Img( + sd_model=shared.sd_model, + do_not_save_grid=True, + do_not_save_samples=True, + ) + + p.disable_extra_networks = True + + if preview_from_txt2img: + p.prompt = preview_prompt + p.negative_prompt = preview_negative_prompt + p.steps = preview_steps + p.sampler_name = sd_samplers.samplers_map[preview_sampler_name.lower()] + p.cfg_scale = preview_cfg_scale + p.seed = preview_seed + p.width = preview_width + p.height = preview_height + else: + p.prompt = batch.cond_text[0] + p.steps = 20 + p.width = training_width + p.height = training_height + + preview_text = p.prompt + + with closing(p): + processed = processing.process_images(p) + image = processed.images[0] if len(processed.images) > 0 else None + + if unload: + shared.sd_model.cond_stage_model.to(devices.cpu) + shared.sd_model.first_stage_model.to(devices.cpu) + torch.set_rng_state(rng_state) + if torch.cuda.is_available(): + torch.cuda.set_rng_state_all(cuda_rng_state) + hypernetwork.train() + if image is not None: + shared.state.assign_current_image(image) + if shared.opts.training_enable_tensorboard and shared.opts.training_tensorboard_save_images: + textual_inversion.tensorboard_add_image(tensorboard_writer, + f"Validation at epoch {epoch_num}", image, + hypernetwork.step) + last_saved_image, last_text_info = images.save_image(image, images_dir, "", p.seed, p.prompt, shared.opts.samples_format, processed.infotexts[0], p=p, forced_filename=forced_filename, save_to_dirs=False) + last_saved_image += f", prompt: {preview_text}" + + shared.state.job_no = hypernetwork.step + + shared.state.textinfo = f""" +

+Loss: {loss_step:.7f}
+Step: {steps_done}
+Last prompt: {html.escape(batch.cond_text[0])}
+Last saved hypernetwork: {html.escape(last_saved_file)}
+Last saved image: {html.escape(last_saved_image)}
+

+""" + except Exception: + errors.report("Exception in training hypernetwork", exc_info=True) + finally: + pbar.leave = False + pbar.close() + hypernetwork.eval() + sd_hijack_checkpoint.remove() + + + + filename = os.path.join(shared.cmd_opts.hypernetwork_dir, f'{hypernetwork_name}.pt') + hypernetwork.optimizer_name = optimizer_name + if shared.opts.save_optimizer_state: + hypernetwork.optimizer_state_dict = optimizer.state_dict() + save_hypernetwork(hypernetwork, checkpoint, hypernetwork_name, filename) + + del optimizer + hypernetwork.optimizer_state_dict = None # dereference it after saving, to save memory. + shared.sd_model.cond_stage_model.to(devices.device) + shared.sd_model.first_stage_model.to(devices.device) + shared.parallel_processing_allowed = old_parallel_processing_allowed + + return hypernetwork, filename + +def save_hypernetwork(hypernetwork, checkpoint, hypernetwork_name, filename): + old_hypernetwork_name = hypernetwork.name + old_sd_checkpoint = hypernetwork.sd_checkpoint if hasattr(hypernetwork, "sd_checkpoint") else None + old_sd_checkpoint_name = hypernetwork.sd_checkpoint_name if hasattr(hypernetwork, "sd_checkpoint_name") else None + try: + hypernetwork.sd_checkpoint = checkpoint.shorthash + hypernetwork.sd_checkpoint_name = checkpoint.model_name + hypernetwork.name = hypernetwork_name + hypernetwork.save(filename) + except: + hypernetwork.sd_checkpoint = old_sd_checkpoint + hypernetwork.sd_checkpoint_name = old_sd_checkpoint_name + hypernetwork.name = old_hypernetwork_name + raise diff --git a/stable-diffusion-webui/modules/hypernetworks/ui.py b/stable-diffusion-webui/modules/hypernetworks/ui.py new file mode 100644 index 0000000000000000000000000000000000000000..351910461dadbf3bfe027e542e0fddf896352d17 --- /dev/null +++ b/stable-diffusion-webui/modules/hypernetworks/ui.py @@ -0,0 +1,38 @@ +import html + +import gradio as gr +import modules.hypernetworks.hypernetwork +from modules import devices, sd_hijack, shared + +not_available = ["hardswish", "multiheadattention"] +keys = [x for x in modules.hypernetworks.hypernetwork.HypernetworkModule.activation_dict if x not in not_available] + + +def create_hypernetwork(name, enable_sizes, overwrite_old, layer_structure=None, activation_func=None, weight_init=None, add_layer_norm=False, use_dropout=False, dropout_structure=None): + filename = modules.hypernetworks.hypernetwork.create_hypernetwork(name, enable_sizes, overwrite_old, layer_structure, activation_func, weight_init, add_layer_norm, use_dropout, dropout_structure) + + return gr.Dropdown.update(choices=sorted(shared.hypernetworks)), f"Created: {filename}", "" + + +def train_hypernetwork(*args): + shared.loaded_hypernetworks = [] + + assert not shared.cmd_opts.lowvram, 'Training models with lowvram is not possible' + + try: + sd_hijack.undo_optimizations() + + hypernetwork, filename = modules.hypernetworks.hypernetwork.train_hypernetwork(*args) + + res = f""" +Training {'interrupted' if shared.state.interrupted else 'finished'} at {hypernetwork.step} steps. +Hypernetwork saved to {html.escape(filename)} +""" + return res, "" + except Exception: + raise + finally: + shared.sd_model.cond_stage_model.to(devices.device) + shared.sd_model.first_stage_model.to(devices.device) + sd_hijack.apply_optimizations() + diff --git a/stable-diffusion-webui/modules/images.py b/stable-diffusion-webui/modules/images.py new file mode 100644 index 0000000000000000000000000000000000000000..b1860969e2be83f6f58a18ceca2d7c84664ab918 --- /dev/null +++ b/stable-diffusion-webui/modules/images.py @@ -0,0 +1,793 @@ +from __future__ import annotations + +import datetime + +import pytz +import io +import math +import os +from collections import namedtuple +import re + +import numpy as np +import piexif +import piexif.helper +from PIL import Image, ImageFont, ImageDraw, ImageColor, PngImagePlugin +import string +import json +import hashlib + +from modules import sd_samplers, shared, script_callbacks, errors +from modules.paths_internal import roboto_ttf_file +from modules.shared import opts + +LANCZOS = (Image.Resampling.LANCZOS if hasattr(Image, 'Resampling') else Image.LANCZOS) + + +def get_font(fontsize: int): + try: + return ImageFont.truetype(opts.font or roboto_ttf_file, fontsize) + except Exception: + return ImageFont.truetype(roboto_ttf_file, fontsize) + + +def image_grid(imgs, batch_size=1, rows=None): + if rows is None: + if opts.n_rows > 0: + rows = opts.n_rows + elif opts.n_rows == 0: + rows = batch_size + elif opts.grid_prevent_empty_spots: + rows = math.floor(math.sqrt(len(imgs))) + while len(imgs) % rows != 0: + rows -= 1 + else: + rows = math.sqrt(len(imgs)) + rows = round(rows) + if rows > len(imgs): + rows = len(imgs) + + cols = math.ceil(len(imgs) / rows) + + params = script_callbacks.ImageGridLoopParams(imgs, cols, rows) + script_callbacks.image_grid_callback(params) + + w, h = imgs[0].size + grid = Image.new('RGB', size=(params.cols * w, params.rows * h), color='black') + + for i, img in enumerate(params.imgs): + grid.paste(img, box=(i % params.cols * w, i // params.cols * h)) + + return grid + + +Grid = namedtuple("Grid", ["tiles", "tile_w", "tile_h", "image_w", "image_h", "overlap"]) + + +def split_grid(image, tile_w=512, tile_h=512, overlap=64): + w = image.width + h = image.height + + non_overlap_width = tile_w - overlap + non_overlap_height = tile_h - overlap + + cols = math.ceil((w - overlap) / non_overlap_width) + rows = math.ceil((h - overlap) / non_overlap_height) + + dx = (w - tile_w) / (cols - 1) if cols > 1 else 0 + dy = (h - tile_h) / (rows - 1) if rows > 1 else 0 + + grid = Grid([], tile_w, tile_h, w, h, overlap) + for row in range(rows): + row_images = [] + + y = int(row * dy) + + if y + tile_h >= h: + y = h - tile_h + + for col in range(cols): + x = int(col * dx) + + if x + tile_w >= w: + x = w - tile_w + + tile = image.crop((x, y, x + tile_w, y + tile_h)) + + row_images.append([x, tile_w, tile]) + + grid.tiles.append([y, tile_h, row_images]) + + return grid + + +def combine_grid(grid): + def make_mask_image(r): + r = r * 255 / grid.overlap + r = r.astype(np.uint8) + return Image.fromarray(r, 'L') + + mask_w = make_mask_image(np.arange(grid.overlap, dtype=np.float32).reshape((1, grid.overlap)).repeat(grid.tile_h, axis=0)) + mask_h = make_mask_image(np.arange(grid.overlap, dtype=np.float32).reshape((grid.overlap, 1)).repeat(grid.image_w, axis=1)) + + combined_image = Image.new("RGB", (grid.image_w, grid.image_h)) + for y, h, row in grid.tiles: + combined_row = Image.new("RGB", (grid.image_w, h)) + for x, w, tile in row: + if x == 0: + combined_row.paste(tile, (0, 0)) + continue + + combined_row.paste(tile.crop((0, 0, grid.overlap, h)), (x, 0), mask=mask_w) + combined_row.paste(tile.crop((grid.overlap, 0, w, h)), (x + grid.overlap, 0)) + + if y == 0: + combined_image.paste(combined_row, (0, 0)) + continue + + combined_image.paste(combined_row.crop((0, 0, combined_row.width, grid.overlap)), (0, y), mask=mask_h) + combined_image.paste(combined_row.crop((0, grid.overlap, combined_row.width, h)), (0, y + grid.overlap)) + + return combined_image + + +class GridAnnotation: + def __init__(self, text='', is_active=True): + self.text = text + self.is_active = is_active + self.size = None + + +def draw_grid_annotations(im, width, height, hor_texts, ver_texts, margin=0): + + color_active = ImageColor.getcolor(opts.grid_text_active_color, 'RGB') + color_inactive = ImageColor.getcolor(opts.grid_text_inactive_color, 'RGB') + color_background = ImageColor.getcolor(opts.grid_background_color, 'RGB') + + def wrap(drawing, text, font, line_length): + lines = [''] + for word in text.split(): + line = f'{lines[-1]} {word}'.strip() + if drawing.textlength(line, font=font) <= line_length: + lines[-1] = line + else: + lines.append(word) + return lines + + def draw_texts(drawing, draw_x, draw_y, lines, initial_fnt, initial_fontsize): + for line in lines: + fnt = initial_fnt + fontsize = initial_fontsize + while drawing.multiline_textsize(line.text, font=fnt)[0] > line.allowed_width and fontsize > 0: + fontsize -= 1 + fnt = get_font(fontsize) + drawing.multiline_text((draw_x, draw_y + line.size[1] / 2), line.text, font=fnt, fill=color_active if line.is_active else color_inactive, anchor="mm", align="center") + + if not line.is_active: + drawing.line((draw_x - line.size[0] // 2, draw_y + line.size[1] // 2, draw_x + line.size[0] // 2, draw_y + line.size[1] // 2), fill=color_inactive, width=4) + + draw_y += line.size[1] + line_spacing + + fontsize = (width + height) // 25 + line_spacing = fontsize // 2 + + fnt = get_font(fontsize) + + pad_left = 0 if sum([sum([len(line.text) for line in lines]) for lines in ver_texts]) == 0 else width * 3 // 4 + + cols = im.width // width + rows = im.height // height + + assert cols == len(hor_texts), f'bad number of horizontal texts: {len(hor_texts)}; must be {cols}' + assert rows == len(ver_texts), f'bad number of vertical texts: {len(ver_texts)}; must be {rows}' + + calc_img = Image.new("RGB", (1, 1), color_background) + calc_d = ImageDraw.Draw(calc_img) + + for texts, allowed_width in zip(hor_texts + ver_texts, [width] * len(hor_texts) + [pad_left] * len(ver_texts)): + items = [] + texts + texts.clear() + + for line in items: + wrapped = wrap(calc_d, line.text, fnt, allowed_width) + texts += [GridAnnotation(x, line.is_active) for x in wrapped] + + for line in texts: + bbox = calc_d.multiline_textbbox((0, 0), line.text, font=fnt) + line.size = (bbox[2] - bbox[0], bbox[3] - bbox[1]) + line.allowed_width = allowed_width + + hor_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing for lines in hor_texts] + ver_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing * len(lines) for lines in ver_texts] + + pad_top = 0 if sum(hor_text_heights) == 0 else max(hor_text_heights) + line_spacing * 2 + + result = Image.new("RGB", (im.width + pad_left + margin * (cols-1), im.height + pad_top + margin * (rows-1)), color_background) + + for row in range(rows): + for col in range(cols): + cell = im.crop((width * col, height * row, width * (col+1), height * (row+1))) + result.paste(cell, (pad_left + (width + margin) * col, pad_top + (height + margin) * row)) + + d = ImageDraw.Draw(result) + + for col in range(cols): + x = pad_left + (width + margin) * col + width / 2 + y = pad_top / 2 - hor_text_heights[col] / 2 + + draw_texts(d, x, y, hor_texts[col], fnt, fontsize) + + for row in range(rows): + x = pad_left / 2 + y = pad_top + (height + margin) * row + height / 2 - ver_text_heights[row] / 2 + + draw_texts(d, x, y, ver_texts[row], fnt, fontsize) + + return result + + +def draw_prompt_matrix(im, width, height, all_prompts, margin=0): + prompts = all_prompts[1:] + boundary = math.ceil(len(prompts) / 2) + + prompts_horiz = prompts[:boundary] + prompts_vert = prompts[boundary:] + + hor_texts = [[GridAnnotation(x, is_active=pos & (1 << i) != 0) for i, x in enumerate(prompts_horiz)] for pos in range(1 << len(prompts_horiz))] + ver_texts = [[GridAnnotation(x, is_active=pos & (1 << i) != 0) for i, x in enumerate(prompts_vert)] for pos in range(1 << len(prompts_vert))] + + return draw_grid_annotations(im, width, height, hor_texts, ver_texts, margin) + + +def resize_image(resize_mode, im, width, height, upscaler_name=None): + """ + Resizes an image with the specified resize_mode, width, and height. + + Args: + resize_mode: The mode to use when resizing the image. + 0: Resize the image to the specified width and height. + 1: Resize the image to fill the specified width and height, maintaining the aspect ratio, and then center the image within the dimensions, cropping the excess. + 2: Resize the image to fit within the specified width and height, maintaining the aspect ratio, and then center the image within the dimensions, filling empty with data from image. + im: The image to resize. + width: The width to resize the image to. + height: The height to resize the image to. + upscaler_name: The name of the upscaler to use. If not provided, defaults to opts.upscaler_for_img2img. + """ + + upscaler_name = upscaler_name or opts.upscaler_for_img2img + + def resize(im, w, h): + if upscaler_name is None or upscaler_name == "None" or im.mode == 'L': + return im.resize((w, h), resample=LANCZOS) + + scale = max(w / im.width, h / im.height) + + if scale > 1.0: + upscalers = [x for x in shared.sd_upscalers if x.name == upscaler_name] + if len(upscalers) == 0: + upscaler = shared.sd_upscalers[0] + print(f"could not find upscaler named {upscaler_name or ''}, using {upscaler.name} as a fallback") + else: + upscaler = upscalers[0] + + im = upscaler.scaler.upscale(im, scale, upscaler.data_path) + + if im.width != w or im.height != h: + im = im.resize((w, h), resample=LANCZOS) + + return im + + if resize_mode == 0: + res = resize(im, width, height) + + elif resize_mode == 1: + ratio = width / height + src_ratio = im.width / im.height + + src_w = width if ratio > src_ratio else im.width * height // im.height + src_h = height if ratio <= src_ratio else im.height * width // im.width + + resized = resize(im, src_w, src_h) + res = Image.new("RGB", (width, height)) + res.paste(resized, box=(width // 2 - src_w // 2, height // 2 - src_h // 2)) + + else: + ratio = width / height + src_ratio = im.width / im.height + + src_w = width if ratio < src_ratio else im.width * height // im.height + src_h = height if ratio >= src_ratio else im.height * width // im.width + + resized = resize(im, src_w, src_h) + res = Image.new("RGB", (width, height)) + res.paste(resized, box=(width // 2 - src_w // 2, height // 2 - src_h // 2)) + + if ratio < src_ratio: + fill_height = height // 2 - src_h // 2 + if fill_height > 0: + res.paste(resized.resize((width, fill_height), box=(0, 0, width, 0)), box=(0, 0)) + res.paste(resized.resize((width, fill_height), box=(0, resized.height, width, resized.height)), box=(0, fill_height + src_h)) + elif ratio > src_ratio: + fill_width = width // 2 - src_w // 2 + if fill_width > 0: + res.paste(resized.resize((fill_width, height), box=(0, 0, 0, height)), box=(0, 0)) + res.paste(resized.resize((fill_width, height), box=(resized.width, 0, resized.width, height)), box=(fill_width + src_w, 0)) + + return res + + +invalid_filename_chars = '<>:"/\\|?*\n\r\t' +invalid_filename_prefix = ' ' +invalid_filename_postfix = ' .' +re_nonletters = re.compile(r'[\s' + string.punctuation + ']+') +re_pattern = re.compile(r"(.*?)(?:\[([^\[\]]+)\]|$)") +re_pattern_arg = re.compile(r"(.*)<([^>]*)>$") +max_filename_part_length = 128 +NOTHING_AND_SKIP_PREVIOUS_TEXT = object() + + +def sanitize_filename_part(text, replace_spaces=True): + if text is None: + return None + + if replace_spaces: + text = text.replace(' ', '_') + + text = text.translate({ord(x): '_' for x in invalid_filename_chars}) + text = text.lstrip(invalid_filename_prefix)[:max_filename_part_length] + text = text.rstrip(invalid_filename_postfix) + return text + + +class FilenameGenerator: + replacements = { + 'seed': lambda self: self.seed if self.seed is not None else '', + 'seed_first': lambda self: self.seed if self.p.batch_size == 1 else self.p.all_seeds[0], + 'seed_last': lambda self: NOTHING_AND_SKIP_PREVIOUS_TEXT if self.p.batch_size == 1 else self.p.all_seeds[-1], + 'steps': lambda self: self.p and self.p.steps, + 'cfg': lambda self: self.p and self.p.cfg_scale, + 'width': lambda self: self.image.width, + 'height': lambda self: self.image.height, + 'styles': lambda self: self.p and sanitize_filename_part(", ".join([style for style in self.p.styles if not style == "None"]) or "None", replace_spaces=False), + 'sampler': lambda self: self.p and sanitize_filename_part(self.p.sampler_name, replace_spaces=False), + 'model_hash': lambda self: getattr(self.p, "sd_model_hash", shared.sd_model.sd_model_hash), + 'model_name': lambda self: sanitize_filename_part(shared.sd_model.sd_checkpoint_info.name_for_extra, replace_spaces=False), + 'date': lambda self: datetime.datetime.now().strftime('%Y-%m-%d'), + 'datetime': lambda self, *args: self.datetime(*args), # accepts formats: [datetime], [datetime], [datetime