././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1721490075.954494 borgbackup-2.0.0b9/0000755000076500000240000000000014646755234012460 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/.coveragerc0000644000076500000240000000074114646713253014576 0ustar00twstaff[run] branch = True disable_warnings = module-not-measured source = src/borg omit = */borg/__init__.py */borg/__main__.py */borg/_version.py */borg/fuse.py */borg/support/* */borg/testsuite/* */borg/hash_sizes.py [report] exclude_lines = pragma: no cover pragma: freebsd only pragma: unknown platform only def __repr__ raise AssertionError raise NotImplementedError if 0: if __name__ == .__main__.: ignore_errors = True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/.git-blame-ignore-revs0000644000076500000240000000010714646713253016551 0ustar00twstaff# Migrate code style to Black 7957af562d5ce8266b177039783be4dc8bdd7898 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/.pre-commit-config.yaml0000644000076500000240000000027014646713253016733 0ustar00twstaffrepos: - repo: https://github.com/psf/black rev: 23.1.0 hooks: - id: black - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.0.287 hooks: - id: ruff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/.readthedocs.yaml0000644000076500000240000000125714646713253015707 0ustar00twstaff# .readthedocs.yaml - Read the Docs configuration file. # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details. version: 2 build: os: ubuntu-22.04 tools: python: "3.11" jobs: post_checkout: - git fetch --unshallow apt_packages: - build-essential - pkg-config - libacl1-dev - libssl-dev - liblz4-dev - libzstd-dev - libxxhash-dev python: install: - requirements: requirements.d/development.lock.txt - requirements: requirements.d/docs.txt - method: pip path: . sphinx: configuration: docs/conf.py formats: - htmlzip ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/AUTHORS0000644000076500000240000000223314646713253013523 0ustar00twstaffE-mail addresses listed here are not intended for support, please see the `support section`_ instead. .. _support section: https://borgbackup.readthedocs.io/en/stable/support.html Borg authors ("The Borg Collective") ------------------------------------ - Thomas Waldmann - Radek Podgorny - Yuri D'Elia - Michael Hanselmann - Teemu Toivanen - Marian Beermann - Martin Hostettler - Daniel Reichelt - Lauri Niskanen - Abdel-Rahman A. (Abogical) - Gu1nness - Andrey Andreyevich Bienkowski Retired ``````` - Antoine Beaupré Borg is a fork of Attic. Attic authors ------------- Attic is written and maintained by Jonas Borgström and various contributors: Attic Development Lead `````````````````````` - Jonas Borgström Attic Patches and Suggestions ````````````````````````````` - Brian Johnson - Cyril Roussillon - Dan Christensen - Jeremy Maitin-Shepard - Johann Klähn - Petros Moisiadis - Thomas Waldmann ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/Brewfile0000644000076500000240000000043514646713253014137 0ustar00twstaffbrew 'pkg-config' brew 'zstd' brew 'lz4' brew 'xxhash' brew 'openssl@3.0' # osxfuse (aka macFUSE) is only required for "borg mount", # but won't work on github actions' workers. # it requires installing a kernel extension, so some users # may want it and some won't. #cask 'osxfuse' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/CHANGES.rst0000644000076500000240000007454214646713253014271 0ustar00twstaff.. _important_notes: Important notes 2.x =================== This section provides information about security and corruption issues. (nothing to see here yet) .. _upgradenotes2: Upgrade Notes ============= borg 1.2.x to borg 2.0 ---------------------- Compatibility notes: - this is a major "breaking" release that is not compatible with existing repos. We tried to put all the necessary "breaking" changes into this release, so we hopefully do not need another breaking release in the near future. The changes were necessary for improved security, improved speed, unblocking future improvements, getting rid of legacy crap / design limitations, having less and simpler code to maintain. You can use "borg transfer" to transfer archives from borg 1.1/1.2 repos to a new borg 2.0 repo, but it will need some time and space. Before using "borg transfer", you must have upgraded to borg >= 1.2.6 (or another borg version that was patched to fix CVE-2023-CVE-2023-36811) and you must have followed the upgrade instructions at top of the change log relating to manifest and archive TAMs (borg2 just requires these TAMs now). - command line syntax was changed, scripts and wrappers will need changes: - you will usually either export BORG_REPO= into your environment or call borg like: "borg -r ". in the docs, we usually omit "-r ..." for brevity. - the scp-style REPO syntax was removed, please use ssh://..., #6697 - ssh:// URLs: removed support for /~otheruser/, #6855. If you used this, just replace it by: ssh://user@host:port/home/otheruser/ - -P / --prefix option was removed, please use the similar -a / --match-archives. - the archive name is always given separately from the repository (differently than with borg 1.x you must not give repo::archive). - the archive name is either given as a positional parameter, like: - borg create myarchive2 /some/path - borg diff myarchive1 myarchive2 - or, if the command makes sense for an arbitrary amount of archives, archives can be selected using a glob pattern, like: - borg delete -a 'sh:myarchive*' - borg recreate -a 'sh:myarchive*' - some borg 1.x commands that supported working on a repo AND on an archive were split into 2 commands, some others were renamed: - borg 2 repo commands: - borg rcreate # "repo create", was: borg init - borg rlist # "repo list" - borg rinfo # "repo info" - borg rdelete # "repo delete" - borg 2 archive commands: - borg create ARCHIVE ... - borg list ARCHIVE - borg extract ARCHIVE ... - borg diff ARCH1 ARCH2 - borg rename OLDNAME NEWNAME - borg info -a ARCH_GLOB - borg delete -a ARCH_GLOB - borg recreate -a ARCH_GLOB ... - borg mount -a ARCH_GLOB mountpoint ... For more details, please consult the docs or --help option output. - create/recreate/import-tar --timestamp: defaults to local timezone now (was: UTC) - some deprecated options were removed: - removed --remote-ratelimit (use --upload-ratelimit) - removed --numeric-owner (use --numeric-ids) - removed --nobsdflags (use --noflags) - removed --noatime (default now, see also --atime) - removed --save-space option (does not change behaviour) - using --list together with --progress is now disallowed (except with --log-json), #7219 - the --glob-archives option was renamed to --match-archives (the short option name -a is unchanged) and extended to support different pattern styles: - id: for identical string match (this is the new default!) - sh: for shell pattern / globbing match (this was used by --glob-archives) - re: for regular expression match So you might need to edit your scripts like e.g.:: borg 1.x: --glob-archives 'myserver-*' borg 2.0: --match-archives 'sh:myserver-*' - use platformdirs 3.x.x instead of home-grown code. Due to that: - XDG_*_HOME is not honoured on macOS and on Windows. - BORG_BASE_DIR can still be used to enforce some base dir + .config/ or .cache/. - the default macOS config and cache dir will now be in ~/Library/Application Support/borg/. - create: different included/excluded status chars, #7321 - dry-run: now uses "+" (was: "-") and "-" (was: "x") for included/excluded status - non-dry-run: now uses "-" (was: "x") for excluded files Option --filter=... might need an update, if you filter for the status chars that were changed. - borg is now more strict and disallows giving some options multiple times - if that makes no sense. Highlander options, see #6269. That might make scripts fail now that somehow "worked" before (but maybe didn't work as intended due to the contradicting options). .. _changelog: Change Log 2.x ============== Version 2.0.0b9 (2024-07-20) ---------------------------- Please note: This is a beta release, only for testing - do not use for production repos. For upgrade and compatibility hints, please also read the section "Upgrade Notes" above. New features: - add BORG_CACHE_IMPL, default is "adhocwithfiles" to test the new cache implementation, featuring an adhoc non-persistent chunks cache and a persistent files cache. See the docs for other values. Requires to run "borg check --repair --archives-only" to delete orphaned chunks before running "borg compact" to free space! These orphans are expected due to the simplified refcounting with the AdHocFilesCache. - make BORG_EXIT_CODES="modern" the default, #8110 - add BORG_USE_CHUNKS_ARCHIVE env var, #8280 - automatically rebuild cache on exception, #5213 Bug fixes: - fix Ctrl-C / SIGINT behaviour for pyinstaller-made binaries, #8155 - delete: fix error handling with Ctrl-C - rcompress: fix error handling with Ctrl-C - delete: fix error handling when no archive is specified, #8256 - setup.py: fix import error reporting for cythonize import, see #8208 - create: deal with EBUSY, #8123 - benchmark: inherit options --rsh --remote-path, #8099 - benchmark: fix return value, #8113 - key export: fix crash when no path is given, fix exception handling Other changes: - setup.py: detect noexec build fs issue, see #8208 - improve acl_get / acl_set error handling (forward port from 1.4-maint) - allow msgpack 1.1.0 - vagrant: use pyinstaller 6.7.0 - use Python 3.11.9 for binary builds - require Cython 3.0.3 at least, #8133 - docs: add non-root deployment strategy Version 2.0.0b8 (2024-02-20) ---------------------------- New features: - create: add the slashdot hack, update docs, #4685 - BORG_EXIT_CODES=modern: optional more specific return codes (for errors and warnings). The default value of this new environment variable is "legacy", which should result in a behaviour similar to borg 1.2 and older (only using rc 0, 1 and 2). "modern" exit codes are much more specific (see the internals/frontends docs). - implement "borg version" (shows client and server version), #7829 Fixes: - docs: CVE-2023-36811 upgrade steps: consider checkpoint archives, #7802 - check/compact: fix spurious reappearance of orphan chunks since borg 1.2, #6687 - this consists of 2 fixes: - for existing chunks: check --repair: recreate shadow index, #7897 #6687 - for newly created chunks: update shadow index when doing a double-put, #7896 #5661 If you have experienced issue #6687, you may want to run borg check --repair after upgrading to borg 1.2.7 to recreate the shadow index and get rid of the issue for existing chunks. - check: fix return code for index entry value discrepancies - LockRoster.modify: no KeyError if element was already gone, #7937 - create --X-from-command: run subcommands with a clean environment, #7916 - list --sort-by: support "archive" as alias of "name", #7873 - fix rc and msg if arg parsing throws an exception, #7885 - PATH: do not accept empty strings, #4221 - fix invalid pattern argument error msg - zlib legacy decompress fixes, #7883 Other changes: - replace archive/manifest TAMs by typed repo objects (ro_type), docs, #7670 - crypto: use a one-step kdf for session keys, #7953 - remove recreate --recompress option, use the more efficient repo-wide "rcompress". - include unistd.h in _chunker.c (fix for Python 3.13) - allow msgpack 1.0.7 - allow platformdirs 4, #7950 - use and require cython3 - move conftest.py to src/borg/testsuite, #6386 - use less setup.py, use pip and build - linux: use pkgconfig to find libacl - borg.logger: use same method params as python logging - create and use Brewfile, document "brew bundle" install (macOS) - blacken master branch - prevent CLI argument issues in scripts/glibc_check.py - pyproject.toml: exclude source files which have been compiled, #7828 - sdist: dynamically compute readme (long_description) - init: better borg key export instructions - scripts/make.py: move clean, build_man, build_usage to there, so we do not need to invoke setup.py directly, update docs - vagrant: - use openssl 3.0 on macOS - add script for fetching borg binaries from VMs, #7989 - use generic/openbsd7 box - netbsd: test on py311 only - remove debian 9 "stretch" box - use freebsd 14, #6871 - use python 3.9.4 for tests, latest python 3.11.7 for binary builds - use pyinstaller 6.3.0 - docs: - add typical PR workflow to development docs, #7495 - improve docs for borg with-lock, add example #8024 - create disk/partition sector backup by disk serial number - Add "check.rebuild_refcounts" message - not only attack/unsafe, can also be a fs issue, #7853 - use virtualenv on Cygwin - readthedocs: also build offline docs, #7835 - do not refer to setup.py installation method - how to run the testsuite using the dist package - requirements are defined in pyproject.toml Version 2.0.0b7 (2023-09-14) ---------------------------- New features: - BORG_WORKAROUNDS=authenticated_no_key to extract from authenticated repos without having the borg key, #7700 Fixes: - archive tam verify security fix, fixes CVE-2023-36811 - remote logging/progress: use callback to send queued records, #7662 - make_path_safe: remove test for backslashes, #7651 - benchmark cpu: use sanitized path, #7654 - create: do not try to read parent dir of recursion root, #7746 Other changes: - always implicitly require archive TAMs (all archives have TAMs since borg 1.2.6) - always implicitly require manifest TAMs (manifests have TAMs since borg 1.0.9) - rlist: remove support for {tam} placeholder, archives are now always TAM-authenticated. - support / test on Python 3.12 - allow msgpack 1.0.6 (which has py312 wheels), #7810 - manifest: move item_keys into config dict (manifest.version == 2 now), #7710 - replace "datetime.utcfromtimestamp" to avoid deprecation warnings with Python 3.12 - properly normalise paths on Windows (forward slashes, integrate drive letter into path) - Docs: - move upgrade / compat. notes to own section, see #7546 - fix borg delete examples, #7759 - improve rcreate / related repos docs - automated-local.rst: use UUID for consistent udev rule - rewrite `borg check` docs, #7578 - misc. other docs updates - Tests / CI / Vagrant: - major testsuite refactoring: a lot more tests now use pytest, #7626 - freebsd: add some ACL tests, #7745 - fix test_disk_full, #7617 - fix failing test_get_runtime_dir test on OpenBSD, #7719 - CI: run on ubuntu 22.04 - CI: test building the docs - simplify flake8 config, fix some complaints - use pyinstaller 5.13.1 to build the borg binaries Version 2.0.0b6 (2023-06-11) ---------------------------- New features: - diff: include changes in ctime and mtime, #7248 - diff: sort JSON output alphabetically - diff --content-only: option added to ignore metadata changes - diff: add --format option, #4634 - import-tar --ignore-zeros: new option to support importing concatenated tars, #7432 - debug id-hash / parse-obj / format-obj: new debug commands, #7406 - transfer --compression=C --recompress=M: recompress while transferring, #7529 - extract --continue: continue a previously interrupted extraction, #1356 - prune --list-kept/--list-pruned: only list the kept (or pruned) archives, #7511 - prune --short/--format: enable users to format the list output, #3238 - implement BORG__FORMAT env vars for prune, list, rlist, #5166 - rlist: size and nfiles format keys - implement unix domain (ipc) socket support, #6183:: borg serve --socket # server side (not started automatically!) borg -r socket:///path/to/repo ... # client side - add get_runtime_dir / BORG_RUNTIME_DIR (contains e.g. .sock and .pid file) - support shell-style alternatives, like: sh:image.{png,jpg}, #7602 Fixes: - do not retry on permission errors (pointless) - transfer: verify chunks we get using assert_id, #7383 - fix config/cache dir compatibility issues, #7445 - xattrs: fix namespace processing on FreeBSD, #6997 - ProgressIndicatorPercent: fix space computation for wide chars, #3027 - delete: remove --cache-only option, #7440. for deleting the cache only, use: borg rdelete --cache-only - borg debug get-obj/put-obj: fixed chunk id - create: ignore empty paths, print warning, #5637 - extract: support extraction of atime/mtime on win32 - benchmark crud: use TemporaryDirectory below given path, #4706 - Ensure that cli options specified with action=Highlander can only be set once, even if the set value is a default value. Add tests for action=Highlander, #7500, #6269. - Fix argparse error messages from misc. validators (being more specific). - put security infos into data dir, add BORG_DATA_DIR env var, #5760 - setup.cfg: remove setup_requires (we have a pyproject.toml for that), #7574 - do not crash for empty archives list in borg rlist date based matching, #7522 - sanitize paths during archive creation and extraction, #7108 #7099 - make sure we do not get backslashes into item paths Other changes: - allow msgpack 1.0.5 also - development.lock.txt: upgrade cython to 0.29.35, misc. other upgrades - clarify platformdirs requirements, #7393. 3.0.0 is only required for macOS due to breaking changes. 2.6.0 was the last breaking change for Linux/UNIX. - mount: improve mountpoint error msgs, see #7496 - more Highlander options, #6269 - Windows: simplify building (just use pip) - refactor toplevel exception handling, #6018 - remove nonce management, related repo methods (not needed for borg2) - borg.remote: remove support for borg < 1.1.0 ($LOG, logging setup, exceptions, rpc tuple data format, version) - new remote and progress logging, #7604 - borg.logger: add logging debugging functionality - add function to clear empty directories at end of compact process - unify scanning and listing of segment dirs / segment files, #7597 - replace `LRUCache` internals with `OrderedDict` - docs: - add installation instructions for Windows - improve --one-file-system help and docs (macOS APFS), #5618 #4876 - BORG_KEY_FILE: clarify docs, #7444 - installation: add link to OS dependencies, #7356 - update FAQ about locale/unicode issues, #6999 - improve mount options rendering, #7359 - make timestamps in manual pages reproducible. - describe performing pull-backups via ssh remote forwarding - suggest to use forced command when using remote-forwarding via ssh - fix some -a / --match-archives docs issues - incl./excl. options header, clarify --path-from-stdin exclusive control - add note about MAX_DATA_SIZE - update security support docs - improve patterns help - CI / tests / vagrant: - added pre-commit for linting purposes, #7476 - resolved mode bug and added sleep clause for darwin systems, #7470 - "auto" compressor tests: do not assume zlib is better than lz4, #7363 - add stretch64 VM with deps built from source - misc. other CI / test fixes and updates - vagrant: add lunar64 VM, fix packages_netbsd - avoid long ids in pytest output - tox: package = editable-legacy, #7580 - tox under fakeroot: fix finding setup_docs, #7391 - check buzhash chunksize distribution, #7586 - use debian/bookworm64 box Version 2.0.0b5 (2023-02-27) ---------------------------- New features: - create: implement retries for individual fs files (e.g. if a file changed while we read it, if a file had an OSError) - info: add used storage quota, #7121 - transfer: support --progress - create/recreate/import-tar: add --checkpoint-volume option - support date-based matching for archive selection, add --newer/--older/--newest/--oldest options, #7062 #7296 Fixes: - disallow --list with --progress, #7219 - create: fix --list --dry-run output for directories, #7209 - do no assume hardlink_master=True if not present, #7175 - fix item_ptrs orphaned chunks of checkpoint archives - avoid orphan content chunks on BackupOSError, #6709 - transfer: fix bug in obfuscated data upgrade code - fs.py: fix bug in f-string (thanks mypy!) - recreate: when --target is given, do not detect "nothing to do", #7254 - locking (win32): deal with os.rmdir/listdir PermissionErrors - locking: thread id must be parsed as hex from lock file name - extract: fix mtime when ResourceFork xattr is set (macOS specific), #7234 - recreate: without --chunker-params borg shall not rechunk, #7336 - allow mixing --progress and --list in log-json mode - add "files changed while reading" to Statistics class, #7354 - fixed keys determination in Statistics.__add__(), #7355 Other changes: - use local time / local timezone to output timestamps, #7283 - update development.lock.txt, including a setuptools security fix, #7227 - remove --save-space option (does not change behaviour) - remove part files from final archive - remove --consider-part-files, related stats code, update docs - transfer: drop part files - check: show id of orphaned chunks - ArchiveItem.cmdline list-of-str -> .command_line str, #7246 - Item: symlinks: rename .source to .target, #7245 - Item: make user/group/uid/gid optional - create: do not store user/group for stdin data by default, #7249 - extract: chown only if we have u/g info in archived item, #7249 - export-tar: for items w/o uid/gid, default to 0/0, #7249 - fix some uid/gid lookup code / tests for win32 - cache.py: be less verbose during cache sync - update bash completion script commands and options, #7273 - require and use platformdirs 3.x.x package, tests - better included/excluded status chars, docs, #7321 - undef NDEBUG for chunker and hashindex (make assert() work) - assert_id: better be paranoid (add back same crypto code as in old borg), #7362 - check --verify_data: always decompress and call assert_id(), #7362 - make hashindex_compact simpler and probably faster, minor fixes, cleanups, more tests - hashindex minor fixes, refactor, tweaks, tests - pyinstaller: remove icon - validation / placeholders / JSON: - implement (text|binary)_to_json: key (text), key_b64 (base64(binary)) - remove bpath, barchive, bcomment placeholders / JSON keys - archive metadata: make sure hostname and username have no surrogate escapes - text attributes (like archive name, comment): validate more strictly, #2290 - transfer: validate archive names and comment before transfer - json output: use text_to_json (path, target), #6151 - docs: - docs and comments consistency, readability and spelling fixes - fix --progress display description, #7180 - document how borg deals with non-unicode bytes in JSON output - document another way to get UTF-8 encoding on stdin/stdout/stderr, #2273 - pruning interprets timestamps in the local timezone where borg prune runs - shellpattern: add license, use copyright/license markup - key change-passphrase: fix --encryption value in examples - remove BORG_LIBB2_PREFIX (not used any more) - Installation: Update Fedora in distribution list, #7357 - add .readthedocs.yaml (use py311, use non-shallow clone) - tests: - fix archiver tests on Windows, add running the tests to Windows CI - fix tox4 passenv issue, #7199 - github actions updates (fix deprecation warnings) - add tests for borg transfer/upgrade - fix test hanging reading FIFO when `borg create` failed - mypy inspired fixes / updates - fix prune tests, prune in localtime - do not look up uid 0 / gid 0, but current process uid/gid - safe_unlink tests: use os.link to support win32 also - fix test_size_on_disk_accurate for large st_blksize, #7250 - relaxed timestamp comparisons, use same_ts_ns - add test for extracted directory mtime - use "fail" chunker to test erroneous input file skipping Version 2.0.0b4 (2022-11-27) ---------------------------- Fixes: - transfer/upgrade: fix borg < 1.2 chunker_params, #7079 - transfer/upgrade: do not access Item._dict, #7077 - transfer/upgrade: fix crash in borg transfer, #7156 - archive.save(): always use metadata from stats, #7072 - benchmark: fixed TypeError in compression benchmarks, #7075 - fix repository.scan api minimum requirement - fix args.paths related argparsing, #6994 Other changes: - tar_filter: recognize .tar.zst as zstd, #7093 - adding performance statistics to borg create, #6991 - docs: add rcompress to usage index - tests: - use github and MSYS2 for Windows CI, #7097 - win32 and cygwin: test fixes / skip hanging test - vagrant / github CI: use python 3.11.0 / 3.10.8 - vagrant: - upgrade pyinstaller to 5.6.2 (supports python 3.11) - use python 3.11 to build the borg binary Version 2.0.0b3 (2022-10-02) ---------------------------- Fixes: - transfer: fix user/group == None crash with borg1 archives - compressors: avoid memoryview related TypeError - check: fix uninitialised variable if repo is completely empty, #7034 - do not use version_tuple placeholder in setuptools_scm template, #7024 - get_chunker: fix missing sparse=False argument, #7056 New features: - rcompress: do a repo-wide (re)compression, #7037 - implement pattern support for --match-archives, #6504 - BORG_LOCK_WAIT=n env var to set default for --lock-wait option, #5279 Other: - repository.scan: misc. fixes / improvements - metadata: differentiate between empty/zero and unknown, #6908 - CI: test pyfuse3 with python 3.11 - use more relative imports - make borg.testsuite.archiver a package, split archiver tests into many modules - support reading new, improved hashindex header format, #6960. added version number and num_empty to the HashHeader, fixed alignment. - vagrant: upgrade pyinstaller 4.10 -> 5.4.1, use python 3.9.14 for binary build - item.pyx: use more Cython (faster, uses less memory), #5763 Version 2.0.0b2 (2022-09-10) ---------------------------- Bug fixes: - xattrs / extended stat: improve exception handling, #6988 - fix and refactor replace_placeholders, #6966 New features: - support archive timestamps with utc offsets, adapt them when using borg transfer to transfer from borg 1.x repos (append +00:00 for UTC). - create/recreate/import-tar --timestamp: accept giving timezone via its utc offset. defaults to local timezone, if no utc offset is given. Other changes: - chunks: have separate encrypted metadata (ctype, clevel, csize, size) chunk = enc_meta_len16 + encrypted(msgpacked(meta)) + encrypted(compressed(data)). this breaks repo format compatibility, you need to create fresh repos! - repository api: flags support, #6982 - OpenBSD only - statically link OpenSSL, #6474. Avoid conflicting with shared libcrypto from the base OS pulled in via dependencies. - restructured source code - update diagrams to odg format, #6928 Version 2.0.0b1 (2022-08-08) ---------------------------- New features: - massively increase archive metadata stream size limit, #1473. currently rather testing the code, scalability will improve later, see #6945. - rcreate --copy-crypt-key: copy crypt_key from key of other repo, #6710. default: create new, random authenticated encryption key. - prune/delete --checkpoint-interval=1800 and ctrl-c/SIGINT support, #6284 Fixes: - ctrl-c must not kill important subprocesses, #6912 - transfer: check whether ID hash method and chunker secret are same. add PlaintextKey and AuthenticatedKey support to uses_same_id_hash function. - check: try harder to create the key, #5719 - SaveFile: use a custom mkstemp with mode support, #6933, #6400 - make setuptools happy, #6874 - fix misc. compiler warnings - list: fix {flags:} formatting, #6081 Other changes: - new crypto does not need to call ._assert_id(), update code and docs. https://github.com/borgbackup/borg/pull/6463#discussion_r925436156 - check: --verify-data does not need to decompress with new crypto modes - Key: crypt_key instead of enc_key + enc_hmac_key, #6611 - misc. docs updates and improvements - CI: test on macOS 12 without fuse / fuse tests - repository: add debug logging for issue #6687 - _version.py: remove trailing blank, add LF at EOF (make pep8 checker happy) Version 2.0.0a4 (2022-07-17) ---------------------------- New features: - recreate: consider level for recompression, #6698, #3622 Other changes: - stop using libdeflate - CI: add mypy (if we add type hints, it can do type checking) - big changes to the source code: - split up archiver module, transform it into a package - use Black for automated code formatting - remove some legacy code - adapt/fix code for mypy - use language_level = 3str for cython (this will be the default in cython 3) - docs: document HardLinkManager and hlid, #2388 Version 2.0.0a3 (2022-07-04) ---------------------------- Fixes: - check repo version, accept old repos only for --other-repo (e.g. rcreate/transfer). v2 is the default repo version for borg 2.0. v1 repos must only be used in a read-only way, e.g. for --other-repo=V1_REPO with borg init and borg transfer! New features: - transfer: --upgrader=NoOp is the default. This is to support general-purpose transfer of archives between related borg2 repos. - transfer: --upgrader=From12To20 must be used to transfer (and convert) archives from borg 1.2 repos to borg 2.0 repos. Other changes: - removed some deprecated options - removed -P (aka --prefix) option, #6806. The option -a (aka --glob-archives) can be used for same purpose and is more powerful, e.g.: -a 'PREFIX*' - rcreate: always use argon2 kdf for new repos, #6820 - rcreate: remove legacy encryption modes for new repos, #6490 Version 2.0.0a2 (2022-06-26) ---------------------------- Changes: - split repo and archive name into separate args, #948 - use -r or --repo or BORG_REPO env var to give the repository - use --other-repo or BORG_OTHER_REPO to give another repo (e.g. borg transfer) - use positional argument for archive name or `-a ARCH_GLOB` - remove support for scp-style repo specification, use ssh://... - simplify stats output: repo ops -> repo stats, archive ops -> archive stats - repository index: add payload size (==csize) and flags to NSIndex entries - repository index: set/query flags, iteration over flagged items (NSIndex) - repository: sync write file in get_fd - stats: deduplicated size now, was deduplicated compressed size in borg 1.x - remove csize support at most places in the code (chunks index, stats, get_size, Item.chunks) - replace problematic/ugly hardlink_master approach of borg 1.x by: - symmetric hlid (all hardlinks pointing to same inode have same hlid) - all archived hardlinked regular files have a chunks list - borg rcreate --other-repo=OTHER_REPO: reuse key material from OTHER_REPO, #6554. This is useful if you want to use borg transfer to transfer archives from an existing borg 1.1/1.2 repo. If the chunker secret and the id key and algorithm stay the same, the deduplication will also work between past and future backups. - borg transfer: - efficiently copy archives from a borg 1.1/1.2 repo to a new repo. uses deduplication and does not decompress/recompress file content data. - does some cleanups / fixes / conversions: - disallow None value for .user/group/chunks/chunks_healthy - cleanup msgpack related str/bytes mess, use new msgpack spec, #968 - obfuscation: fix byte order for size, #6701 - compression: use the 2 bytes for type and level, #6698 - use version 2 for new archives - convert timestamps int/bigint -> msgpack.Timestamp, see #2323 - all hardlinks have chunks, maybe chunks_healthy, hlid - remove the zlib type bytes hack - make sure items with chunks have precomputed size - removes the csize element from the tuples in the Item.chunks list - clean item of attic 0.13 'acl' bug remnants - crypto: see 1.3.0a1 log entry - removed "borg upgrade" command (not needed any more) - compact: removed --cleanup-commits option - docs: fixed quickstart and usage docs with new cli command syntax - docs: removed the parts talking about potential AES-CTR mode issues (we will not use that any more). Version 1.3.0a1 (2022-04-15) ---------------------------- Although this was released as 1.3.0a1, it can be also seen as 2.0.0a1 as it was later decided to do breaking changes and thus the major release number had to be increased (thus, there will not be a 1.3.0 release, but 2.0.0). New features: - init: new --encryption=(repokey|keyfile)-[blake2-](aes-ocb|chacha20-poly1305) - New, better, faster crypto (see encryption-aead diagram in the docs), #6463. - New AEAD cipher suites: AES-OCB and CHACHA20-POLY1305. - Session keys are derived via HKDF from random session id and master key. - Nonces/MessageIVs are counters starting from 0 for each session. - AAD: chunk id, key type, messageIV, sessionID are now authenticated also. - Solves the potential AES-CTR mode counter management issues of the legacy crypto. - init: --key-algorithm=argon2 (new default KDF, older pbkdf2 also still available) borg key change-passphrase / change-location keeps the key algorithm unchanged. - key change-algorithm: to upgrade existing keys to argon2 or downgrade to pbkdf2. We recommend you to upgrade unless you have to keep the key compatible with older versions of borg. - key change-location: usable for repokey <-> keyfile location change - benchmark cpu: display benchmarks of cpu bound stuff - export-tar: new --tar-format=PAX (default: GNU) - import-tar/export-tar: can use PAX format for ctime and atime support - import-tar/export-tar: --tar-format=BORG: roundtrip ALL item metadata, #5830 - repository: create and use version 2 repos only for now - repository: implement PUT2: header crc32, overall xxh64, #1704 Other changes: - require python >= 3.9, #6315 - simplify libs setup, #6482 - unbundle most bundled 3rd party code, use libs, #6316 - use libdeflate.crc32 (Linux and all others) or zlib.crc32 (macOS) - repository: code cleanups / simplifications - internal crypto api: speedups / cleanups / refactorings / modernisation - remove "borg upgrade" support for "attic backup" repos - remove PassphraseKey code and borg key migrate-to-repokey command - OpenBSD: build borg with OpenSSL (not: LibreSSL), #6474 - remove support for LibreSSL, #6474 - remove support for OpenSSL < 1.1.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/LICENSE0000644000076500000240000000301714646713253013461 0ustar00twstaffCopyright (C) 2015-2023 The Borg Collective (see AUTHORS file) Copyright (C) 2010-2014 Jonas Borgström 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. The name of the author may not 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 OWNER 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/MANIFEST.in0000644000076500000240000000073614646713253014217 0ustar00twstaff# stuff we need to include into the sdist is handled automatically by # setuptools_scm - it includes all git-committed files. # but we want to exclude some committed files/dirs not needed in the sdist: exclude .editorconfig .gitattributes .gitignore .mailmap Vagrantfile prune .github include src/borg/platform/darwin.c src/borg/platform/freebsd.c src/borg/platform/linux.c src/borg/platform/posix.c include src/borg/platform/syncfilerange.c include src/borg/platform/windows.c ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.9542506 borgbackup-2.0.0b9/PKG-INFO0000644000076500000240000001766614646755234013575 0ustar00twstaffMetadata-Version: 2.1 Name: borgbackup Version: 2.0.0b9 Summary: Deduplicated, encrypted, authenticated and compressed backups Author: The Borg Collective (see AUTHORS file) Maintainer-email: Thomas Waldmann License: BSD Project-URL: Homepage, https://borgbackup.org/ Project-URL: Bug Tracker, https://github.com/borgbackup/borg/issues Project-URL: Documentation, https://borgbackup.readthedocs.io/ Project-URL: Repository, https://github.com/borgbackup/borg Project-URL: Changelog, https://github.com/borgbackup/borg/blob/master/docs/changes.rst Keywords: backup,borgbackup Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: POSIX :: BSD :: FreeBSD Classifier: Operating System :: POSIX :: BSD :: OpenBSD Classifier: Operating System :: POSIX :: BSD :: NetBSD Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Security :: Cryptography Classifier: Topic :: System :: Archiving :: Backup Requires-Python: >=3.9 License-File: LICENSE License-File: AUTHORS Requires-Dist: msgpack<=1.1.0,>=1.0.3 Requires-Dist: packaging Requires-Dist: platformdirs<5.0.0,>=3.0.0; sys_platform == "darwin" Requires-Dist: platformdirs<5.0.0,>=2.6.0; sys_platform != "darwin" Requires-Dist: argon2-cffi Provides-Extra: llfuse Requires-Dist: llfuse>=1.3.8; extra == "llfuse" Provides-Extra: pyfuse3 Requires-Dist: pyfuse3>=3.1.1; extra == "pyfuse3" Provides-Extra: nofuse What is BorgBackup? ------------------- BorgBackup (short: Borg) is a deduplicating backup program. Optionally, it supports compression and authenticated encryption. The main goal of Borg is to provide an efficient and secure way to back up data. The data deduplication technique used makes Borg suitable for daily backups since only changes are stored. The authenticated encryption technique makes it suitable for backups to targets not fully trusted. See the `installation manual`_ or, if you have already downloaded Borg, ``docs/installation.rst`` to get started with Borg. There is also an `offline documentation`_ available, in multiple formats. .. _installation manual: https://borgbackup.readthedocs.org/en/stable/installation.html .. _offline documentation: https://readthedocs.org/projects/borgbackup/downloads Main features ~~~~~~~~~~~~~ **Space efficient storage** Deduplication based on content-defined chunking is used to reduce the number of bytes stored: each file is split into a number of variable length chunks and only chunks that have never been seen before are added to the repository. A chunk is considered duplicate if its id_hash value is identical. A cryptographically strong hash or MAC function is used as id_hash, e.g. (hmac-)sha256. To deduplicate, all the chunks in the same repository are considered, no matter whether they come from different machines, from previous backups, from the same backup or even from the same single file. Compared to other deduplication approaches, this method does NOT depend on: * file/directory names staying the same: So you can move your stuff around without killing the deduplication, even between machines sharing a repo. * complete files or time stamps staying the same: If a big file changes a little, only a few new chunks need to be stored - this is great for VMs or raw disks. * The absolute position of a data chunk inside a file: Stuff may get shifted and will still be found by the deduplication algorithm. **Speed** * performance-critical code (chunking, compression, encryption) is implemented in C/Cython * local caching of files/chunks index data * quick detection of unmodified files **Data encryption** All data can be protected client-side using 256-bit authenticated encryption (AES-OCB or chacha20-poly1305), ensuring data confidentiality, integrity and authenticity. **Obfuscation** Optionally, borg can actively obfuscate e.g. the size of files / chunks to make fingerprinting attacks more difficult. **Compression** All data can be optionally compressed: * lz4 (super fast, low compression) * zstd (wide range from high speed and low compression to high compression and lower speed) * zlib (medium speed and compression) * lzma (low speed, high compression) **Off-site backups** Borg can store data on any remote host accessible over SSH. If Borg is installed on the remote host, big performance gains can be achieved compared to using a network filesystem (sshfs, nfs, ...). **Backups mountable as filesystems** Backup archives are mountable as userspace filesystems for easy interactive backup examination and restores (e.g. by using a regular file manager). **Easy installation on multiple platforms** We offer single-file binaries that do not require installing anything - you can just run them on these platforms: * Linux * macOS * FreeBSD * OpenBSD and NetBSD (no xattrs/ACLs support or binaries yet) * Cygwin (experimental, no binaries yet) * Linux Subsystem of Windows 10 (experimental) **Free and Open Source Software** * security and functionality can be audited independently * licensed under the BSD (3-clause) license, see `License`_ for the complete license Easy to use ~~~~~~~~~~~ For ease of use, set the BORG_REPO environment variable:: $ export BORG_REPO=/path/to/repo Create a new backup repository (see ``borg rcreate --help`` for encryption options):: $ borg rcreate -e repokey-aes-ocb Create a new backup archive:: $ borg create Monday1 ~/Documents Now doing another backup, just to show off the great deduplication:: $ borg create -v --stats Monday2 ~/Documents Repository: /path/to/repo Archive name: Monday2 Archive fingerprint: 7714aef97c1a24539cc3dc73f79b060f14af04e2541da33d54c7ee8e81a00089 Time (start): Mon, 2022-10-03 19:57:35 +0200 Time (end): Mon, 2022-10-03 19:57:35 +0200 Duration: 0.01 seconds Number of files: 24 Original size: 29.73 MB Deduplicated size: 520 B Helping, Donations and Bounties, becoming a Patron -------------------------------------------------- Your help is always welcome! Spread the word, give feedback, help with documentation, testing or development. You can also give monetary support to the project, see there for details: https://www.borgbackup.org/support/fund.html Links ----- * `Main Web Site `_ * `Releases `_, `PyPI packages `_ and `ChangeLog `_ * `Offline Documentation `_ * `GitHub `_ and `Issue Tracker `_. * `Web-Chat (IRC) `_ and `Mailing List `_ * `License `_ * `Security contact `_ Compatibility notes ------------------- EXPECT THAT WE WILL BREAK COMPATIBILITY REPEATEDLY WHEN MAJOR RELEASE NUMBER CHANGES (like when going from 0.x.y to 1.0.0 or from 1.x.y to 2.0.0). NOT RELEASED DEVELOPMENT VERSIONS HAVE UNKNOWN COMPATIBILITY PROPERTIES. THIS IS SOFTWARE IN DEVELOPMENT, DECIDE YOURSELF WHETHER IT FITS YOUR NEEDS. Security issues should be reported to the `Security contact`_ (or see ``docs/support.rst`` in the source distribution). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/README.rst0000644000076500000240000001753214646713253014152 0ustar00twstaffThis is borg2! -------------- Please note that this is the README for borg2 / master branch. For the stable version's docs, please see there: https://borgbackup.readthedocs.io/en/stable/ Borg2 is currently in beta testing and might get major and/or breaking changes between beta releases (and there is no beta to next-beta upgrade code, so you will have to delete and re-create repos). Thus, **DO NOT USE BORG2 FOR YOUR PRODUCTION BACKUPS!** Please help with testing it, but set it up *additionally* to your production backups. TODO: the screencasts need a remake using borg2, see there: https://github.com/borgbackup/borg/issues/6303 What is BorgBackup? ------------------- BorgBackup (short: Borg) is a deduplicating backup program. Optionally, it supports compression and authenticated encryption. The main goal of Borg is to provide an efficient and secure way to back up data. The data deduplication technique used makes Borg suitable for daily backups since only changes are stored. The authenticated encryption technique makes it suitable for backups to targets not fully trusted. See the `installation manual`_ or, if you have already downloaded Borg, ``docs/installation.rst`` to get started with Borg. There is also an `offline documentation`_ available, in multiple formats. .. _installation manual: https://borgbackup.readthedocs.org/en/stable/installation.html .. _offline documentation: https://readthedocs.org/projects/borgbackup/downloads Main features ~~~~~~~~~~~~~ **Space efficient storage** Deduplication based on content-defined chunking is used to reduce the number of bytes stored: each file is split into a number of variable length chunks and only chunks that have never been seen before are added to the repository. A chunk is considered duplicate if its id_hash value is identical. A cryptographically strong hash or MAC function is used as id_hash, e.g. (hmac-)sha256. To deduplicate, all the chunks in the same repository are considered, no matter whether they come from different machines, from previous backups, from the same backup or even from the same single file. Compared to other deduplication approaches, this method does NOT depend on: * file/directory names staying the same: So you can move your stuff around without killing the deduplication, even between machines sharing a repo. * complete files or time stamps staying the same: If a big file changes a little, only a few new chunks need to be stored - this is great for VMs or raw disks. * The absolute position of a data chunk inside a file: Stuff may get shifted and will still be found by the deduplication algorithm. **Speed** * performance-critical code (chunking, compression, encryption) is implemented in C/Cython * local caching of files/chunks index data * quick detection of unmodified files **Data encryption** All data can be protected client-side using 256-bit authenticated encryption (AES-OCB or chacha20-poly1305), ensuring data confidentiality, integrity and authenticity. **Obfuscation** Optionally, borg can actively obfuscate e.g. the size of files / chunks to make fingerprinting attacks more difficult. **Compression** All data can be optionally compressed: * lz4 (super fast, low compression) * zstd (wide range from high speed and low compression to high compression and lower speed) * zlib (medium speed and compression) * lzma (low speed, high compression) **Off-site backups** Borg can store data on any remote host accessible over SSH. If Borg is installed on the remote host, big performance gains can be achieved compared to using a network filesystem (sshfs, nfs, ...). **Backups mountable as filesystems** Backup archives are mountable as userspace filesystems for easy interactive backup examination and restores (e.g. by using a regular file manager). **Easy installation on multiple platforms** We offer single-file binaries that do not require installing anything - you can just run them on these platforms: * Linux * macOS * FreeBSD * OpenBSD and NetBSD (no xattrs/ACLs support or binaries yet) * Cygwin (experimental, no binaries yet) * Linux Subsystem of Windows 10 (experimental) **Free and Open Source Software** * security and functionality can be audited independently * licensed under the BSD (3-clause) license, see `License`_ for the complete license Easy to use ~~~~~~~~~~~ For ease of use, set the BORG_REPO environment variable:: $ export BORG_REPO=/path/to/repo Create a new backup repository (see ``borg rcreate --help`` for encryption options):: $ borg rcreate -e repokey-aes-ocb Create a new backup archive:: $ borg create Monday1 ~/Documents Now doing another backup, just to show off the great deduplication:: $ borg create -v --stats Monday2 ~/Documents Repository: /path/to/repo Archive name: Monday2 Archive fingerprint: 7714aef97c1a24539cc3dc73f79b060f14af04e2541da33d54c7ee8e81a00089 Time (start): Mon, 2022-10-03 19:57:35 +0200 Time (end): Mon, 2022-10-03 19:57:35 +0200 Duration: 0.01 seconds Number of files: 24 Original size: 29.73 MB Deduplicated size: 520 B Helping, Donations and Bounties, becoming a Patron -------------------------------------------------- Your help is always welcome! Spread the word, give feedback, help with documentation, testing or development. You can also give monetary support to the project, see there for details: https://www.borgbackup.org/support/fund.html Links ----- * `Main Web Site `_ * `Releases `_, `PyPI packages `_ and `ChangeLog `_ * `Offline Documentation `_ * `GitHub `_ and `Issue Tracker `_. * `Web-Chat (IRC) `_ and `Mailing List `_ * `License `_ * `Security contact `_ Compatibility notes ------------------- EXPECT THAT WE WILL BREAK COMPATIBILITY REPEATEDLY WHEN MAJOR RELEASE NUMBER CHANGES (like when going from 0.x.y to 1.0.0 or from 1.x.y to 2.0.0). NOT RELEASED DEVELOPMENT VERSIONS HAVE UNKNOWN COMPATIBILITY PROPERTIES. THIS IS SOFTWARE IN DEVELOPMENT, DECIDE YOURSELF WHETHER IT FITS YOUR NEEDS. Security issues should be reported to the `Security contact`_ (or see ``docs/support.rst`` in the source distribution). .. start-badges |doc| |build| |coverage| |bestpractices| .. |doc| image:: https://readthedocs.org/projects/borgbackup/badge/?version=stable :alt: Documentation :target: https://borgbackup.readthedocs.org/en/stable/ .. |build| image:: https://github.com/borgbackup/borg/workflows/CI/badge.svg?branch=master :alt: Build Status (master) :target: https://github.com/borgbackup/borg/actions .. |coverage| image:: https://codecov.io/github/borgbackup/borg/coverage.svg?branch=master :alt: Test Coverage :target: https://codecov.io/github/borgbackup/borg?branch=master .. |screencast_basic| image:: https://asciinema.org/a/133292.png :alt: BorgBackup Basic Usage :target: https://asciinema.org/a/133292?autoplay=1&speed=1 :width: 100% .. _installation: https://asciinema.org/a/133291?autoplay=1&speed=1 .. _advanced usage: https://asciinema.org/a/133293?autoplay=1&speed=1 .. |bestpractices| image:: https://bestpractices.coreinfrastructure.org/projects/271/badge :alt: Best Practices Score :target: https://bestpractices.coreinfrastructure.org/projects/271 .. end-badges ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/SECURITY.md0000644000076500000240000000065114646713253014246 0ustar00twstaff# Security Policy ## Supported Versions These borg releases are currently supported with security updates. | Version | Supported | |---------|--------------------| | 2.0.x | :x: (not released) | | 1.2.x | :white_check_mark: | | 1.1.x | :x: | | < 1.1 | :x: | ## Reporting a Vulnerability See there: https://borgbackup.readthedocs.io/en/latest/support.html#security-contact ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8499937 borgbackup-2.0.0b9/docs/0000755000076500000240000000000014646755234013410 5ustar00twstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8501172 borgbackup-2.0.0b9/docs/3rd_party/0000755000076500000240000000000014646755234015317 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/3rd_party/README0000644000076500000240000000032714646713253016174 0ustar00twstaffHere we store 3rd party documentation, licenses, etc. Please note that all files inside the "borg" package directory (except the stuff excluded in setup.py) will be INSTALLED, so don't keep docs or licenses there. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/Makefile0000644000076500000240000001074614646713253015053 0ustar00twstaff# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/borg.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/borg.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/borg" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/borg" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8515341 borgbackup-2.0.0b9/docs/_static/0000755000076500000240000000000014646755234015036 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_static/Makefile0000644000076500000240000000030614646713253016470 0ustar00twstaff all: logo.pdf logo.png logo.pdf: logo.svg inkscape logo.svg --export-pdf=logo.pdf logo.png: logo.svg inkscape logo.svg --export-png=logo.png --export-dpi=72,72 clean: rm -f logo.pdf logo.png ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_static/favicon.ico0000644000076500000240000011401614646713253017155 0ustar00twstaffRR m6RRFmRR"&u(R PP aaaa PPKL<M>>>>>>?BuL0i9iuL0i9iuL0i9iCuL%|cs] cvu"uL4uL4uL4uL<>>>4B\\\\\3uL0 4uL064uL0-4uL`* 3e`Q=Lf9CflFLg9 glHLh9 hlJL%|L0L0L0PP aaaa PP?@@@@@@?(R(R "%*-03469<=>?BCFHJKLMQ\]`cefghilsuv|S\\\\\\\\' R\\\\\\\\\\(\\\\\\\\\\\\) !Q\\\\\"G\\\\\6(\\\\\U\\\\\\\;3\\\\N\\\Q9\\\\\D3\\\UG\\\\\6(\\\\\U\\\\\\\\;3\\\\\N\\\\P 9\\\\\D3\\\\\UG\\\\\6(\\\\\U\\\\\\\\\;3\\\\\\N\\\\\P 9\\\\\D3\\\\\\\#G\\\\\6(\\\\\UEGGGW\\\\\8.\\\\\T5,>\\\\\N 9\\\\\D.\\\\\L76G\\\\\6(\\\\\U<\\\\\PD\\\\\@\\\\\\9\\\\\DD\\\\\<G\\\\\6(\\\\\U<\\\\\PD\\\\\@\\\\\\9\\\\\DD\\\\\<G\\\\\6(\\\\\U<\\\\\PD\\\\\@\\\\\\9\\\\\DD\\\\\<G\\\\\6(\\\\\U  A\\\\\?D\\\\\@\\\\\\9\\\\\D"+++++D\\\\\<G\\\\\6(\\\\\U\\\\\\\\\AD\\\\\@\\\\\\9\\\\\DF\\\\\<D\\\\\<G\\\\\6(\\\\\U\\\\\\\\\D\\\\\@\\\\\\9\\\\\DF\\\\\<D\\\\\<G\\\\\6(\\\\\U\\\\\\\\\XD\\\\\@\\\\\\9\\\\\DF\\\\\<D\\\\\<G\\\\\6(\\\\\U<\\\\\M-\\\\\YH=R\\\\\L 9\\\\\DIJZ\\\\\/-\\\\\<*JJ[\\\\\(\\\\\U<\\\\\P0\\\\\\N\\\\\N 9\\\\\D#\\\\\\\@0\\\\<4\\\\\\\$(\\\\\U<\\\\\P1\\\\\N\\\\O 9\\\\\DB\\\\\K 1\\\<4\\\\\\%(\\\\\U<\\\\\P2\\\\N\\\Q 9\\\\\DC\\\V2\\<4\\\\\&(\\\\\UEGGGW\\\\\8(\\\\\U\\\\\\\\\:(\\\\\U\\\\\\\\:(\\\\\U\\\\\\\:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_static/logo.pdf0000644000076500000240000000244414646713253016470 0ustar00twstaff%PDF-1.4 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x}TAr! _@PyB!{H5ʞi  '?ƏvI0&t=ގZ=N*Q,J|DP ? ÜA-\ $k@ֽdхY3ko6T_,30^'w4=BJ5~AƑ`3WhF%$ acܒļRx|k]MX)`xLpRZ:>4V'}8Y( G||⥾ hs?$ J}( VR%Že3鯵"4 5)`OĹ){-֗Y<˹uPm؎mmV)jVtn y"9C$.}_T~ԫwXx/QXj^}5Rx'b.n5}S endstream endobj 4 0 obj 430 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 5 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 240 100 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 6 0 obj << /Creator (cairo 1.14.8 (http://cairographics.org)) /Producer (cairo 1.14.8 (http://cairographics.org)) >> endobj 7 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 8 0000000000 65535 f 0000000830 00000 n 0000000544 00000 n 0000000015 00000 n 0000000522 00000 n 0000000616 00000 n 0000000895 00000 n 0000001022 00000 n trailer << /Size 8 /Root 7 0 R /Info 6 0 R >> startxref 1074 %%EOF ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_static/logo.png0000644000076500000240000000337514646713253016507 0ustar00twstaffPNG  IHDRdsBIT|d pHYs  tEXtSoftwarewww.inkscape.org<zIDATx]e񯛽iFeaFPPHIeIKA^EQAAwEEb/FQkJkn=E9Ywg8z؇S Hq X0,b1LE S")`a X0,b1LE S")`a X0,b1LE S"Zz.u^ǀcD/Áik3x+B V&"QF"~ E,Nq G|z+"/AKc01(b1/݀Ay~'`ee)* oq.%o7XwoT16 8zOb`v%pJ-(ιL/~x"~_x0xvb7Sr1=m1LO,a 1ś)19La pdoc~(B&F<x81Ǜ)!n/8_{bE#Gr.KE2tHwԽ͓.Hp61FE S")`a X0,b1,ObsgӎzE\ xν#86'ULo?O\7Jrܹ}2Ώ$ xN pfjl.\c n};IvNw"Ni獂,t7|UwTnÝ4=!i; zZhL@ -R,R,M`/Vbq&p_k,)^Pt;pSy7|4_?nKMEmƽUTr%-y͸%3LKZ&elnC]ha X0,b1LE S"S gGIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_static/logo.svg0000644000076500000240000000337614646713253016523 0ustar00twstaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_static/logo_font.txt0000644000076500000240000000015714646713253017563 0ustar00twstaffBlack Ops One James Grieshaber SIL Open Font License, 1.1 https://www.google.com/fonts/specimen/Black+Ops+One ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1721490075.853603 borgbackup-2.0.0b9/docs/_templates/0000755000076500000240000000000014646755234015545 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_templates/globaltoc.html0000644000076500000240000000117114646713253020374 0ustar00twstaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/_templates/logo-text.html0000644000076500000240000000024014646713253020344 0ustar00twstaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/authors.rst0000644000076500000240000000021314646713253015616 0ustar00twstaff.. include:: global.rst.inc Authors ======= .. include:: ../AUTHORS License ======= .. _license: .. include:: ../LICENSE :literal: ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1721490075.853742 borgbackup-2.0.0b9/docs/binaries/0000755000076500000240000000000014646755234015204 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/binaries/00_README.txt0000644000076500000240000000502514646713253017176 0ustar00twstaffBinary BorgBackup builds ======================== The binaries are supposed to work on the specified platform without installing any dependencies. Download the correct files -------------------------- amd64 / x86_64 architecture ~~~~~~~~~~~~~~~~~~~~~~~~~~~ borg-linux-glibc236 Linux (built on Debian 12 "Bookworm" with glibc 2.36) borg-linux-glibc231 Linux (built on Debian 11 "Bullseye" with glibc 2.31) Note: you can also try them on other Linuxes with other glibc versions - as long as the glibc is compatible, they will work. If it doesn't work, try a borg 1.4.x or 1.2.x binary. borg-macos1012 macOS (built on macOS Sierra 10.12 with latest macFUSE from brew) To avoid signing issues download the file via command line OR remove the "quarantine" attribute after downloading: $ xattr -dr com.apple.quarantine borg-macos.tgz borg-freebsd14 FreeBSD (built on FreeBSD 14) *.tgz similar to above, but built as a directory with files, not as a single self-extracting binary. *.asc GnuPG signatures for * Verifying your download ----------------------- Please check the GPG signature to make sure you received the binary as I have built it. To check the GPG signature, download both the binary and the corresponding *.asc file and then (on the shell) type, e.g.: gpg --recv-keys 9F88FB52FAF7B393 gpg --verify borg-freebsd14.asc borg-freebsd14 The files are signed by: Thomas Waldmann GPG key fingerprint: 6D5B EF9A DD20 7580 5747 B70F 9F88 FB52 FAF7 B393 My fingerprint is also in the footer of all my borgbackup mailing list posts. Installing ---------- It is suggested that you rename or symlink the binary to just "borg". On UNIX-like platforms, /usr/local/bin/ or ~/bin/ is a nice place for it, but you can invoke it from every place by giving a full path to it. Make sure the file is readable and executable (chmod +rx borg on UNIX-like platforms). Reporting issues ---------------- If you find issues, please open a ticket on our issue tracker: https://github.com/borgbackup/borg/issues/ There, please give: - the version number (it is displayed if you invoke borg -V) - the sha256sum of the binary - a good description of what the issue is - a good description of how to reproduce your issue - a traceback with system info (if you have one) - your precise platform (CPU, 32/64bit?), OS, distribution, release - your python and (g)libc version ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/book.rst0000644000076500000240000000062114646713253015066 0ustar00twstaff:orphan: .. include:: global.rst.inc Borg documentation ================== .. when you add an element here, do not forget to add it to index.rst .. Note: Some things are in appendices (see latex_appendices in conf.py) .. toctree:: :maxdepth: 2 introduction installation quickstart usage deployment faq support changes internals development authors ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8403974 borgbackup-2.0.0b9/docs/borg_theme/0000755000076500000240000000000014646755234015523 5ustar00twstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8538523 borgbackup-2.0.0b9/docs/borg_theme/css/0000755000076500000240000000000014646755234016313 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/borg_theme/css/borg.css0000644000076500000240000000762114646713253017757 0ustar00twstaff@import url("theme.css"); dt code { font-weight: normal; } #internals .toctree-wrapper > ul { column-count: 3; -webkit-column-count: 3; } #internals .toctree-wrapper > ul > li { display: inline-block; font-weight: bold; } #internals .toctree-wrapper > ul > li > ul { font-weight: normal; } /* bootstrap has a .container class which clashes with docutils' container class. */ .docutils.container { width: auto; margin: 0; padding: 0; } /* the default (38px) produces a jumpy baseline in Firefox on Linux. */ h1 { font-size: 36px; } .text-logo { background-color: #000200; color: #00dd00; } .text-logo:hover, .text-logo:active, .text-logo:focus { color: #5afe57; } /* by default the top and bottom margins are unequal which looks a bit unbalanced. */ .sidebar-block { padding: 0; margin: 14px 0 24px 0; } #borg-documentation h1 + p .external img { width: 100%; } .container.experimental, #debugging-facilities { /* don't change text dimensions */ margin: 0 -30px; /* padding below + border width */ padding: 0 10px; /* 10 px visual margin between edge of text and the border */ /* fallback for browsers that don't have repeating-linear-gradient: thick, red lines */ border-left: 20px solid red; border-right: 20px solid red; /* fancy red stripes */ border-image: repeating-linear-gradient( -45deg,rgba(255,0,0,0.1) 0,rgba(255,0,0,0.75) 10px,rgba(0,0,0,0) 10px,rgba(0,0,0,0) 20px,rgba(255,0,0,0.75) 20px) 0 20 repeat; } .topic { margin: 0 1em; padding: 0 1em; /* #4e4a4a = background of the ToC sidebar */ border-left: 2px solid #4e4a4a;; border-right: 2px solid #4e4a4a;; } table.docutils:not(.footnote) td, table.docutils:not(.footnote) th { padding: .2em; } table.docutils:not(.footnote) { border-collapse: collapse; border: none; } table.docutils:not(.footnote) td, table.docutils:not(.footnote) th { border: 1px solid #ddd; } table.docutils:not(.footnote) tr:first-child th, table.docutils:not(.footnote) tr:first-child td { border-top: 0; } table.docutils:not(.footnote) tr:last-child td { border-bottom: 0; } table.docutils:not(.footnote) tr td:first-child, table.docutils:not(.footnote) tr th:first-child { border-left: 0; } table.docutils:not(.footnote) tr td:last-child, table.docutils:not(.footnote) tr th:last-child, table.docutils.borg-options-table tr td { border-right: 0; } table.docutils.option-list tr td, table.docutils.borg-options-table tr td { border-left: 0; border-right: 0; } table.docutils.borg-options-table tr td:first-child:not([colspan="3"]) { border-top: 0; border-bottom: 0; } .borg-options-table td[colspan="3"] p { margin: 0; } .borg-options-table { width: 100%; } kbd, /* used in usage pages for options */ code, .rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal, .rst-content tt, .rst-content code, p .literal, p .literal span { border: none; padding: 0; color: black; /* slight contrast with #404040 of regular text */ background: none; } kbd { box-shadow: none; line-height: 23px; word-wrap: normal; font-size: 15px; font-family: Consolas, monospace; } .borg-options-table tr td:nth-child(2) .pre { white-space: nowrap; } .borg-options-table tr td:first-child { width: 2em; } cite { white-space: nowrap; color: black; /* slight contrast with #404040 of regular text */ font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; font-style: normal; text-decoration: underline; } .borg-common-opt-ref { font-weight: bold; } .sidebar-toc ul li.toctree-l2 a, .sidebar-toc ul li.toctree-l3 a { padding-right: 25px; } #common-options .option { white-space: nowrap; } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/changes.rst0000644000076500000240000007454214646713253015561 0ustar00twstaff.. _important_notes: Important notes 2.x =================== This section provides information about security and corruption issues. (nothing to see here yet) .. _upgradenotes2: Upgrade Notes ============= borg 1.2.x to borg 2.0 ---------------------- Compatibility notes: - this is a major "breaking" release that is not compatible with existing repos. We tried to put all the necessary "breaking" changes into this release, so we hopefully do not need another breaking release in the near future. The changes were necessary for improved security, improved speed, unblocking future improvements, getting rid of legacy crap / design limitations, having less and simpler code to maintain. You can use "borg transfer" to transfer archives from borg 1.1/1.2 repos to a new borg 2.0 repo, but it will need some time and space. Before using "borg transfer", you must have upgraded to borg >= 1.2.6 (or another borg version that was patched to fix CVE-2023-CVE-2023-36811) and you must have followed the upgrade instructions at top of the change log relating to manifest and archive TAMs (borg2 just requires these TAMs now). - command line syntax was changed, scripts and wrappers will need changes: - you will usually either export BORG_REPO= into your environment or call borg like: "borg -r ". in the docs, we usually omit "-r ..." for brevity. - the scp-style REPO syntax was removed, please use ssh://..., #6697 - ssh:// URLs: removed support for /~otheruser/, #6855. If you used this, just replace it by: ssh://user@host:port/home/otheruser/ - -P / --prefix option was removed, please use the similar -a / --match-archives. - the archive name is always given separately from the repository (differently than with borg 1.x you must not give repo::archive). - the archive name is either given as a positional parameter, like: - borg create myarchive2 /some/path - borg diff myarchive1 myarchive2 - or, if the command makes sense for an arbitrary amount of archives, archives can be selected using a glob pattern, like: - borg delete -a 'sh:myarchive*' - borg recreate -a 'sh:myarchive*' - some borg 1.x commands that supported working on a repo AND on an archive were split into 2 commands, some others were renamed: - borg 2 repo commands: - borg rcreate # "repo create", was: borg init - borg rlist # "repo list" - borg rinfo # "repo info" - borg rdelete # "repo delete" - borg 2 archive commands: - borg create ARCHIVE ... - borg list ARCHIVE - borg extract ARCHIVE ... - borg diff ARCH1 ARCH2 - borg rename OLDNAME NEWNAME - borg info -a ARCH_GLOB - borg delete -a ARCH_GLOB - borg recreate -a ARCH_GLOB ... - borg mount -a ARCH_GLOB mountpoint ... For more details, please consult the docs or --help option output. - create/recreate/import-tar --timestamp: defaults to local timezone now (was: UTC) - some deprecated options were removed: - removed --remote-ratelimit (use --upload-ratelimit) - removed --numeric-owner (use --numeric-ids) - removed --nobsdflags (use --noflags) - removed --noatime (default now, see also --atime) - removed --save-space option (does not change behaviour) - using --list together with --progress is now disallowed (except with --log-json), #7219 - the --glob-archives option was renamed to --match-archives (the short option name -a is unchanged) and extended to support different pattern styles: - id: for identical string match (this is the new default!) - sh: for shell pattern / globbing match (this was used by --glob-archives) - re: for regular expression match So you might need to edit your scripts like e.g.:: borg 1.x: --glob-archives 'myserver-*' borg 2.0: --match-archives 'sh:myserver-*' - use platformdirs 3.x.x instead of home-grown code. Due to that: - XDG_*_HOME is not honoured on macOS and on Windows. - BORG_BASE_DIR can still be used to enforce some base dir + .config/ or .cache/. - the default macOS config and cache dir will now be in ~/Library/Application Support/borg/. - create: different included/excluded status chars, #7321 - dry-run: now uses "+" (was: "-") and "-" (was: "x") for included/excluded status - non-dry-run: now uses "-" (was: "x") for excluded files Option --filter=... might need an update, if you filter for the status chars that were changed. - borg is now more strict and disallows giving some options multiple times - if that makes no sense. Highlander options, see #6269. That might make scripts fail now that somehow "worked" before (but maybe didn't work as intended due to the contradicting options). .. _changelog: Change Log 2.x ============== Version 2.0.0b9 (2024-07-20) ---------------------------- Please note: This is a beta release, only for testing - do not use for production repos. For upgrade and compatibility hints, please also read the section "Upgrade Notes" above. New features: - add BORG_CACHE_IMPL, default is "adhocwithfiles" to test the new cache implementation, featuring an adhoc non-persistent chunks cache and a persistent files cache. See the docs for other values. Requires to run "borg check --repair --archives-only" to delete orphaned chunks before running "borg compact" to free space! These orphans are expected due to the simplified refcounting with the AdHocFilesCache. - make BORG_EXIT_CODES="modern" the default, #8110 - add BORG_USE_CHUNKS_ARCHIVE env var, #8280 - automatically rebuild cache on exception, #5213 Bug fixes: - fix Ctrl-C / SIGINT behaviour for pyinstaller-made binaries, #8155 - delete: fix error handling with Ctrl-C - rcompress: fix error handling with Ctrl-C - delete: fix error handling when no archive is specified, #8256 - setup.py: fix import error reporting for cythonize import, see #8208 - create: deal with EBUSY, #8123 - benchmark: inherit options --rsh --remote-path, #8099 - benchmark: fix return value, #8113 - key export: fix crash when no path is given, fix exception handling Other changes: - setup.py: detect noexec build fs issue, see #8208 - improve acl_get / acl_set error handling (forward port from 1.4-maint) - allow msgpack 1.1.0 - vagrant: use pyinstaller 6.7.0 - use Python 3.11.9 for binary builds - require Cython 3.0.3 at least, #8133 - docs: add non-root deployment strategy Version 2.0.0b8 (2024-02-20) ---------------------------- New features: - create: add the slashdot hack, update docs, #4685 - BORG_EXIT_CODES=modern: optional more specific return codes (for errors and warnings). The default value of this new environment variable is "legacy", which should result in a behaviour similar to borg 1.2 and older (only using rc 0, 1 and 2). "modern" exit codes are much more specific (see the internals/frontends docs). - implement "borg version" (shows client and server version), #7829 Fixes: - docs: CVE-2023-36811 upgrade steps: consider checkpoint archives, #7802 - check/compact: fix spurious reappearance of orphan chunks since borg 1.2, #6687 - this consists of 2 fixes: - for existing chunks: check --repair: recreate shadow index, #7897 #6687 - for newly created chunks: update shadow index when doing a double-put, #7896 #5661 If you have experienced issue #6687, you may want to run borg check --repair after upgrading to borg 1.2.7 to recreate the shadow index and get rid of the issue for existing chunks. - check: fix return code for index entry value discrepancies - LockRoster.modify: no KeyError if element was already gone, #7937 - create --X-from-command: run subcommands with a clean environment, #7916 - list --sort-by: support "archive" as alias of "name", #7873 - fix rc and msg if arg parsing throws an exception, #7885 - PATH: do not accept empty strings, #4221 - fix invalid pattern argument error msg - zlib legacy decompress fixes, #7883 Other changes: - replace archive/manifest TAMs by typed repo objects (ro_type), docs, #7670 - crypto: use a one-step kdf for session keys, #7953 - remove recreate --recompress option, use the more efficient repo-wide "rcompress". - include unistd.h in _chunker.c (fix for Python 3.13) - allow msgpack 1.0.7 - allow platformdirs 4, #7950 - use and require cython3 - move conftest.py to src/borg/testsuite, #6386 - use less setup.py, use pip and build - linux: use pkgconfig to find libacl - borg.logger: use same method params as python logging - create and use Brewfile, document "brew bundle" install (macOS) - blacken master branch - prevent CLI argument issues in scripts/glibc_check.py - pyproject.toml: exclude source files which have been compiled, #7828 - sdist: dynamically compute readme (long_description) - init: better borg key export instructions - scripts/make.py: move clean, build_man, build_usage to there, so we do not need to invoke setup.py directly, update docs - vagrant: - use openssl 3.0 on macOS - add script for fetching borg binaries from VMs, #7989 - use generic/openbsd7 box - netbsd: test on py311 only - remove debian 9 "stretch" box - use freebsd 14, #6871 - use python 3.9.4 for tests, latest python 3.11.7 for binary builds - use pyinstaller 6.3.0 - docs: - add typical PR workflow to development docs, #7495 - improve docs for borg with-lock, add example #8024 - create disk/partition sector backup by disk serial number - Add "check.rebuild_refcounts" message - not only attack/unsafe, can also be a fs issue, #7853 - use virtualenv on Cygwin - readthedocs: also build offline docs, #7835 - do not refer to setup.py installation method - how to run the testsuite using the dist package - requirements are defined in pyproject.toml Version 2.0.0b7 (2023-09-14) ---------------------------- New features: - BORG_WORKAROUNDS=authenticated_no_key to extract from authenticated repos without having the borg key, #7700 Fixes: - archive tam verify security fix, fixes CVE-2023-36811 - remote logging/progress: use callback to send queued records, #7662 - make_path_safe: remove test for backslashes, #7651 - benchmark cpu: use sanitized path, #7654 - create: do not try to read parent dir of recursion root, #7746 Other changes: - always implicitly require archive TAMs (all archives have TAMs since borg 1.2.6) - always implicitly require manifest TAMs (manifests have TAMs since borg 1.0.9) - rlist: remove support for {tam} placeholder, archives are now always TAM-authenticated. - support / test on Python 3.12 - allow msgpack 1.0.6 (which has py312 wheels), #7810 - manifest: move item_keys into config dict (manifest.version == 2 now), #7710 - replace "datetime.utcfromtimestamp" to avoid deprecation warnings with Python 3.12 - properly normalise paths on Windows (forward slashes, integrate drive letter into path) - Docs: - move upgrade / compat. notes to own section, see #7546 - fix borg delete examples, #7759 - improve rcreate / related repos docs - automated-local.rst: use UUID for consistent udev rule - rewrite `borg check` docs, #7578 - misc. other docs updates - Tests / CI / Vagrant: - major testsuite refactoring: a lot more tests now use pytest, #7626 - freebsd: add some ACL tests, #7745 - fix test_disk_full, #7617 - fix failing test_get_runtime_dir test on OpenBSD, #7719 - CI: run on ubuntu 22.04 - CI: test building the docs - simplify flake8 config, fix some complaints - use pyinstaller 5.13.1 to build the borg binaries Version 2.0.0b6 (2023-06-11) ---------------------------- New features: - diff: include changes in ctime and mtime, #7248 - diff: sort JSON output alphabetically - diff --content-only: option added to ignore metadata changes - diff: add --format option, #4634 - import-tar --ignore-zeros: new option to support importing concatenated tars, #7432 - debug id-hash / parse-obj / format-obj: new debug commands, #7406 - transfer --compression=C --recompress=M: recompress while transferring, #7529 - extract --continue: continue a previously interrupted extraction, #1356 - prune --list-kept/--list-pruned: only list the kept (or pruned) archives, #7511 - prune --short/--format: enable users to format the list output, #3238 - implement BORG__FORMAT env vars for prune, list, rlist, #5166 - rlist: size and nfiles format keys - implement unix domain (ipc) socket support, #6183:: borg serve --socket # server side (not started automatically!) borg -r socket:///path/to/repo ... # client side - add get_runtime_dir / BORG_RUNTIME_DIR (contains e.g. .sock and .pid file) - support shell-style alternatives, like: sh:image.{png,jpg}, #7602 Fixes: - do not retry on permission errors (pointless) - transfer: verify chunks we get using assert_id, #7383 - fix config/cache dir compatibility issues, #7445 - xattrs: fix namespace processing on FreeBSD, #6997 - ProgressIndicatorPercent: fix space computation for wide chars, #3027 - delete: remove --cache-only option, #7440. for deleting the cache only, use: borg rdelete --cache-only - borg debug get-obj/put-obj: fixed chunk id - create: ignore empty paths, print warning, #5637 - extract: support extraction of atime/mtime on win32 - benchmark crud: use TemporaryDirectory below given path, #4706 - Ensure that cli options specified with action=Highlander can only be set once, even if the set value is a default value. Add tests for action=Highlander, #7500, #6269. - Fix argparse error messages from misc. validators (being more specific). - put security infos into data dir, add BORG_DATA_DIR env var, #5760 - setup.cfg: remove setup_requires (we have a pyproject.toml for that), #7574 - do not crash for empty archives list in borg rlist date based matching, #7522 - sanitize paths during archive creation and extraction, #7108 #7099 - make sure we do not get backslashes into item paths Other changes: - allow msgpack 1.0.5 also - development.lock.txt: upgrade cython to 0.29.35, misc. other upgrades - clarify platformdirs requirements, #7393. 3.0.0 is only required for macOS due to breaking changes. 2.6.0 was the last breaking change for Linux/UNIX. - mount: improve mountpoint error msgs, see #7496 - more Highlander options, #6269 - Windows: simplify building (just use pip) - refactor toplevel exception handling, #6018 - remove nonce management, related repo methods (not needed for borg2) - borg.remote: remove support for borg < 1.1.0 ($LOG, logging setup, exceptions, rpc tuple data format, version) - new remote and progress logging, #7604 - borg.logger: add logging debugging functionality - add function to clear empty directories at end of compact process - unify scanning and listing of segment dirs / segment files, #7597 - replace `LRUCache` internals with `OrderedDict` - docs: - add installation instructions for Windows - improve --one-file-system help and docs (macOS APFS), #5618 #4876 - BORG_KEY_FILE: clarify docs, #7444 - installation: add link to OS dependencies, #7356 - update FAQ about locale/unicode issues, #6999 - improve mount options rendering, #7359 - make timestamps in manual pages reproducible. - describe performing pull-backups via ssh remote forwarding - suggest to use forced command when using remote-forwarding via ssh - fix some -a / --match-archives docs issues - incl./excl. options header, clarify --path-from-stdin exclusive control - add note about MAX_DATA_SIZE - update security support docs - improve patterns help - CI / tests / vagrant: - added pre-commit for linting purposes, #7476 - resolved mode bug and added sleep clause for darwin systems, #7470 - "auto" compressor tests: do not assume zlib is better than lz4, #7363 - add stretch64 VM with deps built from source - misc. other CI / test fixes and updates - vagrant: add lunar64 VM, fix packages_netbsd - avoid long ids in pytest output - tox: package = editable-legacy, #7580 - tox under fakeroot: fix finding setup_docs, #7391 - check buzhash chunksize distribution, #7586 - use debian/bookworm64 box Version 2.0.0b5 (2023-02-27) ---------------------------- New features: - create: implement retries for individual fs files (e.g. if a file changed while we read it, if a file had an OSError) - info: add used storage quota, #7121 - transfer: support --progress - create/recreate/import-tar: add --checkpoint-volume option - support date-based matching for archive selection, add --newer/--older/--newest/--oldest options, #7062 #7296 Fixes: - disallow --list with --progress, #7219 - create: fix --list --dry-run output for directories, #7209 - do no assume hardlink_master=True if not present, #7175 - fix item_ptrs orphaned chunks of checkpoint archives - avoid orphan content chunks on BackupOSError, #6709 - transfer: fix bug in obfuscated data upgrade code - fs.py: fix bug in f-string (thanks mypy!) - recreate: when --target is given, do not detect "nothing to do", #7254 - locking (win32): deal with os.rmdir/listdir PermissionErrors - locking: thread id must be parsed as hex from lock file name - extract: fix mtime when ResourceFork xattr is set (macOS specific), #7234 - recreate: without --chunker-params borg shall not rechunk, #7336 - allow mixing --progress and --list in log-json mode - add "files changed while reading" to Statistics class, #7354 - fixed keys determination in Statistics.__add__(), #7355 Other changes: - use local time / local timezone to output timestamps, #7283 - update development.lock.txt, including a setuptools security fix, #7227 - remove --save-space option (does not change behaviour) - remove part files from final archive - remove --consider-part-files, related stats code, update docs - transfer: drop part files - check: show id of orphaned chunks - ArchiveItem.cmdline list-of-str -> .command_line str, #7246 - Item: symlinks: rename .source to .target, #7245 - Item: make user/group/uid/gid optional - create: do not store user/group for stdin data by default, #7249 - extract: chown only if we have u/g info in archived item, #7249 - export-tar: for items w/o uid/gid, default to 0/0, #7249 - fix some uid/gid lookup code / tests for win32 - cache.py: be less verbose during cache sync - update bash completion script commands and options, #7273 - require and use platformdirs 3.x.x package, tests - better included/excluded status chars, docs, #7321 - undef NDEBUG for chunker and hashindex (make assert() work) - assert_id: better be paranoid (add back same crypto code as in old borg), #7362 - check --verify_data: always decompress and call assert_id(), #7362 - make hashindex_compact simpler and probably faster, minor fixes, cleanups, more tests - hashindex minor fixes, refactor, tweaks, tests - pyinstaller: remove icon - validation / placeholders / JSON: - implement (text|binary)_to_json: key (text), key_b64 (base64(binary)) - remove bpath, barchive, bcomment placeholders / JSON keys - archive metadata: make sure hostname and username have no surrogate escapes - text attributes (like archive name, comment): validate more strictly, #2290 - transfer: validate archive names and comment before transfer - json output: use text_to_json (path, target), #6151 - docs: - docs and comments consistency, readability and spelling fixes - fix --progress display description, #7180 - document how borg deals with non-unicode bytes in JSON output - document another way to get UTF-8 encoding on stdin/stdout/stderr, #2273 - pruning interprets timestamps in the local timezone where borg prune runs - shellpattern: add license, use copyright/license markup - key change-passphrase: fix --encryption value in examples - remove BORG_LIBB2_PREFIX (not used any more) - Installation: Update Fedora in distribution list, #7357 - add .readthedocs.yaml (use py311, use non-shallow clone) - tests: - fix archiver tests on Windows, add running the tests to Windows CI - fix tox4 passenv issue, #7199 - github actions updates (fix deprecation warnings) - add tests for borg transfer/upgrade - fix test hanging reading FIFO when `borg create` failed - mypy inspired fixes / updates - fix prune tests, prune in localtime - do not look up uid 0 / gid 0, but current process uid/gid - safe_unlink tests: use os.link to support win32 also - fix test_size_on_disk_accurate for large st_blksize, #7250 - relaxed timestamp comparisons, use same_ts_ns - add test for extracted directory mtime - use "fail" chunker to test erroneous input file skipping Version 2.0.0b4 (2022-11-27) ---------------------------- Fixes: - transfer/upgrade: fix borg < 1.2 chunker_params, #7079 - transfer/upgrade: do not access Item._dict, #7077 - transfer/upgrade: fix crash in borg transfer, #7156 - archive.save(): always use metadata from stats, #7072 - benchmark: fixed TypeError in compression benchmarks, #7075 - fix repository.scan api minimum requirement - fix args.paths related argparsing, #6994 Other changes: - tar_filter: recognize .tar.zst as zstd, #7093 - adding performance statistics to borg create, #6991 - docs: add rcompress to usage index - tests: - use github and MSYS2 for Windows CI, #7097 - win32 and cygwin: test fixes / skip hanging test - vagrant / github CI: use python 3.11.0 / 3.10.8 - vagrant: - upgrade pyinstaller to 5.6.2 (supports python 3.11) - use python 3.11 to build the borg binary Version 2.0.0b3 (2022-10-02) ---------------------------- Fixes: - transfer: fix user/group == None crash with borg1 archives - compressors: avoid memoryview related TypeError - check: fix uninitialised variable if repo is completely empty, #7034 - do not use version_tuple placeholder in setuptools_scm template, #7024 - get_chunker: fix missing sparse=False argument, #7056 New features: - rcompress: do a repo-wide (re)compression, #7037 - implement pattern support for --match-archives, #6504 - BORG_LOCK_WAIT=n env var to set default for --lock-wait option, #5279 Other: - repository.scan: misc. fixes / improvements - metadata: differentiate between empty/zero and unknown, #6908 - CI: test pyfuse3 with python 3.11 - use more relative imports - make borg.testsuite.archiver a package, split archiver tests into many modules - support reading new, improved hashindex header format, #6960. added version number and num_empty to the HashHeader, fixed alignment. - vagrant: upgrade pyinstaller 4.10 -> 5.4.1, use python 3.9.14 for binary build - item.pyx: use more Cython (faster, uses less memory), #5763 Version 2.0.0b2 (2022-09-10) ---------------------------- Bug fixes: - xattrs / extended stat: improve exception handling, #6988 - fix and refactor replace_placeholders, #6966 New features: - support archive timestamps with utc offsets, adapt them when using borg transfer to transfer from borg 1.x repos (append +00:00 for UTC). - create/recreate/import-tar --timestamp: accept giving timezone via its utc offset. defaults to local timezone, if no utc offset is given. Other changes: - chunks: have separate encrypted metadata (ctype, clevel, csize, size) chunk = enc_meta_len16 + encrypted(msgpacked(meta)) + encrypted(compressed(data)). this breaks repo format compatibility, you need to create fresh repos! - repository api: flags support, #6982 - OpenBSD only - statically link OpenSSL, #6474. Avoid conflicting with shared libcrypto from the base OS pulled in via dependencies. - restructured source code - update diagrams to odg format, #6928 Version 2.0.0b1 (2022-08-08) ---------------------------- New features: - massively increase archive metadata stream size limit, #1473. currently rather testing the code, scalability will improve later, see #6945. - rcreate --copy-crypt-key: copy crypt_key from key of other repo, #6710. default: create new, random authenticated encryption key. - prune/delete --checkpoint-interval=1800 and ctrl-c/SIGINT support, #6284 Fixes: - ctrl-c must not kill important subprocesses, #6912 - transfer: check whether ID hash method and chunker secret are same. add PlaintextKey and AuthenticatedKey support to uses_same_id_hash function. - check: try harder to create the key, #5719 - SaveFile: use a custom mkstemp with mode support, #6933, #6400 - make setuptools happy, #6874 - fix misc. compiler warnings - list: fix {flags:} formatting, #6081 Other changes: - new crypto does not need to call ._assert_id(), update code and docs. https://github.com/borgbackup/borg/pull/6463#discussion_r925436156 - check: --verify-data does not need to decompress with new crypto modes - Key: crypt_key instead of enc_key + enc_hmac_key, #6611 - misc. docs updates and improvements - CI: test on macOS 12 without fuse / fuse tests - repository: add debug logging for issue #6687 - _version.py: remove trailing blank, add LF at EOF (make pep8 checker happy) Version 2.0.0a4 (2022-07-17) ---------------------------- New features: - recreate: consider level for recompression, #6698, #3622 Other changes: - stop using libdeflate - CI: add mypy (if we add type hints, it can do type checking) - big changes to the source code: - split up archiver module, transform it into a package - use Black for automated code formatting - remove some legacy code - adapt/fix code for mypy - use language_level = 3str for cython (this will be the default in cython 3) - docs: document HardLinkManager and hlid, #2388 Version 2.0.0a3 (2022-07-04) ---------------------------- Fixes: - check repo version, accept old repos only for --other-repo (e.g. rcreate/transfer). v2 is the default repo version for borg 2.0. v1 repos must only be used in a read-only way, e.g. for --other-repo=V1_REPO with borg init and borg transfer! New features: - transfer: --upgrader=NoOp is the default. This is to support general-purpose transfer of archives between related borg2 repos. - transfer: --upgrader=From12To20 must be used to transfer (and convert) archives from borg 1.2 repos to borg 2.0 repos. Other changes: - removed some deprecated options - removed -P (aka --prefix) option, #6806. The option -a (aka --glob-archives) can be used for same purpose and is more powerful, e.g.: -a 'PREFIX*' - rcreate: always use argon2 kdf for new repos, #6820 - rcreate: remove legacy encryption modes for new repos, #6490 Version 2.0.0a2 (2022-06-26) ---------------------------- Changes: - split repo and archive name into separate args, #948 - use -r or --repo or BORG_REPO env var to give the repository - use --other-repo or BORG_OTHER_REPO to give another repo (e.g. borg transfer) - use positional argument for archive name or `-a ARCH_GLOB` - remove support for scp-style repo specification, use ssh://... - simplify stats output: repo ops -> repo stats, archive ops -> archive stats - repository index: add payload size (==csize) and flags to NSIndex entries - repository index: set/query flags, iteration over flagged items (NSIndex) - repository: sync write file in get_fd - stats: deduplicated size now, was deduplicated compressed size in borg 1.x - remove csize support at most places in the code (chunks index, stats, get_size, Item.chunks) - replace problematic/ugly hardlink_master approach of borg 1.x by: - symmetric hlid (all hardlinks pointing to same inode have same hlid) - all archived hardlinked regular files have a chunks list - borg rcreate --other-repo=OTHER_REPO: reuse key material from OTHER_REPO, #6554. This is useful if you want to use borg transfer to transfer archives from an existing borg 1.1/1.2 repo. If the chunker secret and the id key and algorithm stay the same, the deduplication will also work between past and future backups. - borg transfer: - efficiently copy archives from a borg 1.1/1.2 repo to a new repo. uses deduplication and does not decompress/recompress file content data. - does some cleanups / fixes / conversions: - disallow None value for .user/group/chunks/chunks_healthy - cleanup msgpack related str/bytes mess, use new msgpack spec, #968 - obfuscation: fix byte order for size, #6701 - compression: use the 2 bytes for type and level, #6698 - use version 2 for new archives - convert timestamps int/bigint -> msgpack.Timestamp, see #2323 - all hardlinks have chunks, maybe chunks_healthy, hlid - remove the zlib type bytes hack - make sure items with chunks have precomputed size - removes the csize element from the tuples in the Item.chunks list - clean item of attic 0.13 'acl' bug remnants - crypto: see 1.3.0a1 log entry - removed "borg upgrade" command (not needed any more) - compact: removed --cleanup-commits option - docs: fixed quickstart and usage docs with new cli command syntax - docs: removed the parts talking about potential AES-CTR mode issues (we will not use that any more). Version 1.3.0a1 (2022-04-15) ---------------------------- Although this was released as 1.3.0a1, it can be also seen as 2.0.0a1 as it was later decided to do breaking changes and thus the major release number had to be increased (thus, there will not be a 1.3.0 release, but 2.0.0). New features: - init: new --encryption=(repokey|keyfile)-[blake2-](aes-ocb|chacha20-poly1305) - New, better, faster crypto (see encryption-aead diagram in the docs), #6463. - New AEAD cipher suites: AES-OCB and CHACHA20-POLY1305. - Session keys are derived via HKDF from random session id and master key. - Nonces/MessageIVs are counters starting from 0 for each session. - AAD: chunk id, key type, messageIV, sessionID are now authenticated also. - Solves the potential AES-CTR mode counter management issues of the legacy crypto. - init: --key-algorithm=argon2 (new default KDF, older pbkdf2 also still available) borg key change-passphrase / change-location keeps the key algorithm unchanged. - key change-algorithm: to upgrade existing keys to argon2 or downgrade to pbkdf2. We recommend you to upgrade unless you have to keep the key compatible with older versions of borg. - key change-location: usable for repokey <-> keyfile location change - benchmark cpu: display benchmarks of cpu bound stuff - export-tar: new --tar-format=PAX (default: GNU) - import-tar/export-tar: can use PAX format for ctime and atime support - import-tar/export-tar: --tar-format=BORG: roundtrip ALL item metadata, #5830 - repository: create and use version 2 repos only for now - repository: implement PUT2: header crc32, overall xxh64, #1704 Other changes: - require python >= 3.9, #6315 - simplify libs setup, #6482 - unbundle most bundled 3rd party code, use libs, #6316 - use libdeflate.crc32 (Linux and all others) or zlib.crc32 (macOS) - repository: code cleanups / simplifications - internal crypto api: speedups / cleanups / refactorings / modernisation - remove "borg upgrade" support for "attic backup" repos - remove PassphraseKey code and borg key migrate-to-repokey command - OpenBSD: build borg with OpenSSL (not: LibreSSL), #6474 - remove support for LibreSSL, #6474 - remove support for OpenSSL < 1.1.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/changes_0.x.rst0000644000076500000240000010066214646713253016237 0ustar00twstaff.. _changelog_0x: Change Log 0.x ============== Version 0.30.0 (2016-01-23) --------------------------- Compatibility notes: - The new default logging level is WARNING. Previously, it was INFO, which was more verbose. Use -v (or --info) to show once again log level INFO messages. See the "general" section in the usage docs. - for borg create, you need --list (additionally to -v) to see the long file list (was needed so you can have e.g. --stats alone without the long list) - see below about BORG_DELETE_I_KNOW_WHAT_I_AM_DOING (was: BORG_CHECK_I_KNOW_WHAT_I_AM_DOING) Bug fixes: - fix crash when using borg create --dry-run --keep-tag-files, #570 - make sure teardown with cleanup happens for Cache and RepositoryCache, avoiding leftover locks and TEMP dir contents, #285 (partially), #548 - fix locking KeyError, partial fix for #502 - log stats consistently, #526 - add abbreviated weekday to timestamp format, fixes #496 - strip whitespace when loading exclusions from file - unset LD_LIBRARY_PATH before invoking ssh, fixes strange OpenSSL library version warning when using the borg binary, #514 - add some error handling/fallback for C library loading, #494 - added BORG_DELETE_I_KNOW_WHAT_I_AM_DOING for check in "borg delete", #503 - remove unused "repair" rpc method name New features: - borg create: implement exclusions using regular expression patterns. - borg create: implement inclusions using patterns. - borg extract: support patterns, #361 - support different styles for patterns: - fnmatch (`fm:` prefix, default when omitted), like borg <= 0.29. - shell (`sh:` prefix) with `*` not matching directory separators and `**/` matching 0..n directories - path prefix (`pp:` prefix, for unifying borg create pp1 pp2 into the patterns system), semantics like in borg <= 0.29 - regular expression (`re:`), new! - --progress option for borg upgrade (#291) and borg delete - update progress indication more often (e.g. for borg create within big files or for borg check repo), #500 - finer chunker granularity for items metadata stream, #547, #487 - borg create --list now used (additionally to -v) to enable the verbose file list output - display borg version below tracebacks, #532 Other changes: - hashtable size (and thus: RAM and disk consumption) follows a growth policy: grows fast while small, grows slower when getting bigger, #527 - Vagrantfile: use pyinstaller 3.1 to build binaries, freebsd sqlite3 fix, fixes #569 - no separate binaries for centos6 any more because the generic linux binaries also work on centos6 (or in general: on systems with a slightly older glibc than debian7 - dev environment: require virtualenv<14.0 so we get a py32 compatible pip - docs: - add space-saving chunks.archive.d trick to FAQ - important: clarify -v and log levels in usage -> general, please read! - sphinx configuration: create a simple man page from usage docs - add a repo server setup example - disable unneeded SSH features in authorized_keys examples for security. - borg prune only knows "--keep-within" and not "--within" - add gource video to resources docs, #507 - add netbsd install instructions - authors: make it more clear what refers to borg and what to attic - document standalone binary requirements, #499 - rephrase the mailing list section - development docs: run build_api and build_usage before tagging release - internals docs: hash table max. load factor is 0.75 now - markup, typo, grammar, phrasing, clarifications and other fixes. - add gcc gcc-c++ to redhat/fedora/corora install docs, fixes #583 Version 0.29.0 (2015-12-13) --------------------------- Compatibility notes: - when upgrading to 0.29.0 you need to upgrade client as well as server installations due to the locking and commandline interface changes otherwise you'll get an error msg about a RPC protocol mismatch or a wrong commandline option. if you run a server that needs to support both old and new clients, it is suggested that you have a "borg-0.28.2" and a "borg-0.29.0" command. clients then can choose via e.g. "borg --remote-path=borg-0.29.0 ...". - the default waiting time for a lock changed from infinity to 1 second for a better interactive user experience. if the repo you want to access is currently locked, borg will now terminate after 1s with an error message. if you have scripts that shall wait for the lock for a longer time, use --lock-wait N (with N being the maximum wait time in seconds). Bug fixes: - hash table tuning (better chosen hashtable load factor 0.75 and prime initial size of 1031 gave ~1000x speedup in some scenarios) - avoid creation of an orphan lock for one case, #285 - --keep-tag-files: fix file mode and multiple tag files in one directory, #432 - fixes for "borg upgrade" (attic repo converter), #466 - remove --progress isatty magic (and also --no-progress option) again, #476 - borg init: display proper repo URL - fix format of umask in help pages, #463 New features: - implement --lock-wait, support timeout for UpgradableLock, #210 - implement borg break-lock command, #157 - include system info below traceback, #324 - sane remote logging, remote stderr, #461: - remote log output: intercept it and log it via local logging system, with "Remote: " prefixed to message. log remote tracebacks. - remote stderr: output it to local stderr with "Remote: " prefixed. - add --debug and --info (same as --verbose) to set the log level of the builtin logging configuration (which otherwise defaults to warning), #426 note: there are few messages emitted at DEBUG level currently. - optionally configure logging via env var BORG_LOGGING_CONF - add --filter option for status characters: e.g. to show only the added or modified files (and also errors), use "borg create -v --filter=AME ...". - more progress indicators, #394 - use ISO-8601 date and time format, #375 - "borg check --prefix" to restrict archive checking to that name prefix, #206 Other changes: - hashindex_add C implementation (speed up cache re-sync for new archives) - increase FUSE read_size to 1024 (speed up metadata operations) - check/delete/prune --save-space: free unused segments quickly, #239 - increase rpc protocol version to 2 (see also Compatibility notes), #458 - silence borg by default (via default log level WARNING) - get rid of C compiler warnings, #391 - upgrade OS X FUSE to 3.0.9 on the OS X binary build system - use python 3.5.1 to build binaries - docs: - new mailing list borgbackup@python.org, #468 - readthedocs: color and logo improvements - load coverage icons over SSL (avoids mixed content) - more precise binary installation steps - update release procedure docs about OS X FUSE - FAQ entry about unexpected 'A' status for unchanged file(s), #403 - add docs about 'E' file status - add "borg upgrade" docs, #464 - add developer docs about output and logging - clarify encryption, add note about client-side encryption - add resources section, with videos, talks, presentations, #149 - Borg moved to Arch Linux [community] - fix wrong installation instructions for archlinux Version 0.28.2 (2015-11-15) --------------------------- New features: - borg create --exclude-if-present TAGFILE - exclude directories that have the given file from the backup. You can additionally give --keep-tag-files to preserve just the directory roots and the tag-files (but not back up other directory contents), #395, attic #128, attic #142 Other changes: - do not create docs sources at build time (just have them in the repo), completely remove have_cython() hack, do not use the "mock" library at build time, #384 - avoid hidden import, make it easier for PyInstaller, easier fix for #218 - docs: - add description of item flags / status output, fixes #402 - explain how to regenerate usage and API files (build_api or build_usage) and when to commit usage files directly into git, #384 - minor install docs improvements Version 0.28.1 (2015-11-08) --------------------------- Bug fixes: - do not try to build api / usage docs for production install, fixes unexpected "mock" build dependency, #384 Other changes: - avoid using msgpack.packb at import time - fix formatting issue in changes.rst - fix build on readthedocs Version 0.28.0 (2015-11-08) --------------------------- Compatibility notes: - changed return codes (exit codes), see docs. in short: old: 0 = ok, 1 = error. now: 0 = ok, 1 = warning, 2 = error New features: - refactor return codes (exit codes), fixes #61 - add --show-rc option enable "terminating with X status, rc N" output, fixes 58, #351 - borg create backups atime and ctime additionally to mtime, fixes #317 - extract: support atime additionally to mtime - FUSE: support ctime and atime additionally to mtime - support borg --version - emit a warning if we have a slow msgpack installed - borg list --prefix=thishostname- REPO, fixes #205 - Debug commands (do not use except if you know what you do: debug-get-obj, debug-put-obj, debug-delete-obj, debug-dump-archive-items. Bug fixes: - setup.py: fix bug related to BORG_LZ4_PREFIX processing - fix "check" for repos that have incomplete chunks, fixes #364 - borg mount: fix unlocking of repository at umount time, fixes #331 - fix reading files without touching their atime, #334 - non-ascii ACL fixes for Linux, FreeBSD and OS X, #277 - fix acl_use_local_uid_gid() and add a test for it, attic #359 - borg upgrade: do not upgrade repositories in place by default, #299 - fix cascading failure with the index conversion code, #269 - borg check: implement 'cmdline' archive metadata value decoding, #311 - fix RobustUnpacker, it missed some metadata keys (new atime and ctime keys were missing, but also bsdflags). add check for unknown metadata keys. - create from stdin: also save atime, ctime (cosmetic) - use default_notty=False for confirmations, fixes #345 - vagrant: fix msgpack installation on centos, fixes #342 - deal with unicode errors for symlinks in same way as for regular files and have a helpful warning message about how to fix wrong locale setup, fixes #382 - add ACL keys the RobustUnpacker must know about Other changes: - improve file size displays, more flexible size formatters - explicitly commit to the units standard, #289 - archiver: add E status (means that an error occurred when processing this (single) item - do binary releases via "github releases", closes #214 - create: use -x and --one-file-system (was: --do-not-cross-mountpoints), #296 - a lot of changes related to using "logging" module and screen output, #233 - show progress display if on a tty, output more progress information, #303 - factor out status output so it is consistent, fix surrogates removal, maybe fixes #309 - move away from RawConfigParser to ConfigParser - archive checker: better error logging, give chunk_id and sequence numbers (can be used together with borg debug-dump-archive-items). - do not mention the deprecated passphrase mode - emit a deprecation warning for --compression N (giving a just a number) - misc .coverragerc fixes (and coverage measurement improvements), fixes #319 - refactor confirmation code, reduce code duplication, add tests - prettier error messages, fixes #307, #57 - tests: - add a test to find disk-full issues, #327 - travis: also run tests on Python 3.5 - travis: use tox -r so it rebuilds the tox environments - test the generated pyinstaller-based binary by archiver unit tests, #215 - vagrant: tests: announce whether fakeroot is used or not - vagrant: add vagrant user to fuse group for debianoid systems also - vagrant: llfuse install on darwin needs pkgconfig installed - vagrant: use pyinstaller from develop branch, fixes #336 - benchmarks: test create, extract, list, delete, info, check, help, fixes #146 - benchmarks: test with both the binary and the python code - archiver tests: test with both the binary and the python code, fixes #215 - make basic test more robust - docs: - moved docs to borgbackup.readthedocs.org, #155 - a lot of fixes and improvements, use mobile-friendly RTD standard theme - use zlib,6 compression in some examples, fixes #275 - add missing rename usage to docs, closes #279 - include the help offered by borg help in the usage docs, fixes #293 - include a list of major changes compared to attic into README, fixes #224 - add OS X install instructions, #197 - more details about the release process, #260 - fix linux glibc requirement (binaries built on debian7 now) - build: move usage and API generation to setup.py - update docs about return codes, #61 - remove api docs (too much breakage on rtd) - borgbackup install + basics presentation (asciinema) - describe the current style guide in documentation - add section about debug commands - warn about not running out of space - add example for rename - improve chunker params docs, fixes #362 - minor development docs update Version 0.27.0 (2015-10-07) --------------------------- New features: - "borg upgrade" command - attic -> borg one time converter / migration, #21 - temporary hack to avoid using lots of disk space for chunks.archive.d, #235: To use it: rm -rf chunks.archive.d ; touch chunks.archive.d - respect XDG_CACHE_HOME, attic #181 - add support for arbitrary SSH commands, attic #99 - borg delete --cache-only REPO (only delete cache, not REPO), attic #123 Bug fixes: - use Debian 7 (wheezy) to build pyinstaller borgbackup binaries, fixes slow down observed when running the Centos6-built binary on Ubuntu, #222 - do not crash on empty lock.roster, fixes #232 - fix multiple issues with the cache config version check, #234 - fix segment entry header size check, attic #352 plus other error handling improvements / code deduplication there. - always give segment and offset in repo IntegrityErrors Other changes: - stop producing binary wheels, remove docs about it, #147 - docs: - add warning about prune - generate usage include files only as needed - development docs: add Vagrant section - update / improve / reformat FAQ - hint to single-file pyinstaller binaries from README Version 0.26.1 (2015-09-28) --------------------------- This is a minor update, just docs and new pyinstaller binaries. - docs update about python and binary requirements - better docs for --read-special, fix #220 - re-built the binaries, fix #218 and #213 (glibc version issue) - update web site about single-file pyinstaller binaries Note: if you did a python-based installation, there is no need to upgrade. Version 0.26.0 (2015-09-19) --------------------------- New features: - Faster cache sync (do all in one pass, remove tar/compression stuff), #163 - BORG_REPO env var to specify the default repo, #168 - read special files as if they were regular files, #79 - implement borg create --dry-run, attic issue #267 - Normalize paths before pattern matching on OS X, #143 - support OpenBSD and NetBSD (except xattrs/ACLs) - support / run tests on Python 3.5 Bug fixes: - borg mount repo: use absolute path, attic #200, attic #137 - chunker: use off_t to get 64bit on 32bit platform, #178 - initialize chunker fd to -1, so it's not equal to STDIN_FILENO (0) - fix reaction to "no" answer at delete repo prompt, #182 - setup.py: detect lz4.h header file location - to support python < 3.2.4, add less buggy argparse lib from 3.2.6 (#194) - fix for obtaining ``char *`` from temporary Python value (old code causes a compile error on Mint 17.2) - llfuse 0.41 install troubles on some platforms, require < 0.41 (UnicodeDecodeError exception due to non-ascii llfuse setup.py) - cython code: add some int types to get rid of unspecific python add / subtract operations (avoid ``undefined symbol FPE_``... error on some platforms) - fix verbose mode display of stdin backup - extract: warn if a include pattern never matched, fixes #209, implement counters for Include/ExcludePatterns - archive names with slashes are invalid, attic issue #180 - chunker: add a check whether the POSIX_FADV_DONTNEED constant is defined - fixes building on OpenBSD. Other changes: - detect inconsistency / corruption / hash collision, #170 - replace versioneer with setuptools_scm, #106 - docs: - pkg-config is needed for llfuse installation - be more clear about pruning, attic issue #132 - unit tests: - xattr: ignore security.selinux attribute showing up - ext3 seems to need a bit more space for a sparse file - do not test lzma level 9 compression (avoid MemoryError) - work around strange mtime granularity issue on netbsd, fixes #204 - ignore st_rdev if file is not a block/char device, fixes #203 - stay away from the setgid and sticky mode bits - use Vagrant to do easy cross-platform testing (#196), currently: - Debian 7 "wheezy" 32bit, Debian 8 "jessie" 64bit - Ubuntu 12.04 32bit, Ubuntu 14.04 64bit - Centos 7 64bit - FreeBSD 10.2 64bit - OpenBSD 5.7 64bit - NetBSD 6.1.5 64bit - Darwin (OS X Yosemite) Version 0.25.0 (2015-08-29) --------------------------- Compatibility notes: - lz4 compression library (liblz4) is a new requirement (#156) - the new compression code is very compatible: as long as you stay with zlib compression, older borg releases will still be able to read data from a repo/archive made with the new code (note: this is not the case for the default "none" compression, use "zlib,0" if you want a "no compression" mode that can be read by older borg). Also the new code is able to read repos and archives made with older borg versions (for all zlib levels 0..9). Deprecations: - --compression N (with N being a number, as in 0.24) is deprecated. We keep the --compression 0..9 for now not to break scripts, but it is deprecated and will be removed later, so better fix your scripts now: --compression 0 (as in 0.24) is the same as --compression zlib,0 (now). BUT: if you do not want compression, use --compression none (which is the default). --compression 1 (in 0.24) is the same as --compression zlib,1 (now) --compression 9 (in 0.24) is the same as --compression zlib,9 (now) New features: - create --compression none (default, means: do not compress, just pass through data "as is". this is more efficient than zlib level 0 as used in borg 0.24) - create --compression lz4 (super-fast, but not very high compression) - create --compression zlib,N (slower, higher compression, default for N is 6) - create --compression lzma,N (slowest, highest compression, default N is 6) - honor the nodump flag (UF_NODUMP) and do not back up such items - list --short just outputs a simple list of the files/directories in an archive Bug fixes: - fixed --chunker-params parameter order confusion / malfunction, fixes #154 - close fds of segments we delete (during compaction) - close files which fell out the lrucache - fadvise DONTNEED now is only called for the byte range actually read, not for the whole file, fixes #158. - fix issue with negative "all archives" size, fixes #165 - restore_xattrs: ignore if setxattr fails with EACCES, fixes #162 Other changes: - remove fakeroot requirement for tests, tests run faster without fakeroot (test setup does not fail any more without fakeroot, so you can run with or without fakeroot), fixes #151 and #91. - more tests for archiver - recover_segment(): don't assume we have an fd for segment - lrucache refactoring / cleanup, add dispose function, py.test tests - generalize hashindex code for any key length (less hardcoding) - lock roster: catch file not found in remove() method and ignore it - travis CI: use requirements file - improved docs: - replace hack for llfuse with proper solution (install libfuse-dev) - update docs about compression - update development docs about fakeroot - internals: add some words about lock files / locking system - support: mention BountySource and for what it can be used - theme: use a lighter green - add pypi, wheel, dist package based install docs - split install docs into system-specific preparations and generic instructions Version 0.24.0 (2015-08-09) --------------------------- Incompatible changes (compared to 0.23): - borg now always issues --umask NNN option when invoking another borg via ssh on the repository server. By that, it's making sure it uses the same umask for remote repos as for local ones. Because of this, you must upgrade both server and client(s) to 0.24. - the default umask is 077 now (if you do not specify via --umask) which might be a different one as you used previously. The default umask avoids that you accidentally give access permissions for group and/or others to files created by borg (e.g. the repository). Deprecations: - "--encryption passphrase" mode is deprecated, see #85 and #97. See the new "--encryption repokey" mode for a replacement. New features: - borg create --chunker-params ... to configure the chunker, fixes #16 (attic #302, attic #300, and somehow also #41). This can be used to reduce memory usage caused by chunk management overhead, so borg does not create a huge chunks index/repo index and eats all your RAM if you back up lots of data in huge files (like VM disk images). See docs/misc/create_chunker-params.txt for more information. - borg info now reports chunk counts in the chunk index. - borg create --compression 0..9 to select zlib compression level, fixes #66 (attic #295). - borg init --encryption repokey (to store the encryption key into the repo), fixes #85 - improve at-end error logging, always log exceptions and set exit_code=1 - LoggedIO: better error checks / exceptions / exception handling - implement --remote-path to allow non-default-path borg locations, #125 - implement --umask M and use 077 as default umask for better security, #117 - borg check: give a named single archive to it, fixes #139 - cache sync: show progress indication - cache sync: reimplement the chunk index merging in C Bug fixes: - fix segfault that happened for unreadable files (chunker: n needs to be a signed size_t), #116 - fix the repair mode, #144 - repo delete: add destroy to allowed rpc methods, fixes issue #114 - more compatible repository locking code (based on mkdir), maybe fixes #92 (attic #317, attic #201). - better Exception msg if no Borg is installed on the remote repo server, #56 - create a RepositoryCache implementation that can cope with >2GiB, fixes attic #326. - fix Traceback when running check --repair, attic #232 - clarify help text, fixes #73. - add help string for --no-files-cache, fixes #140 Other changes: - improved docs: - added docs/misc directory for misc. writeups that won't be included "as is" into the html docs. - document environment variables and return codes (attic #324, attic #52) - web site: add related projects, fix web site url, IRC #borgbackup - Fedora/Fedora-based install instructions added to docs - Cygwin-based install instructions added to docs - updated AUTHORS - add FAQ entries about redundancy / integrity - clarify that borg extract uses the cwd as extraction target - update internals doc about chunker params, memory usage and compression - added docs about development - add some words about resource usage in general - document how to back up a raw disk - add note about how to run borg from virtual env - add solutions for (ll)fuse installation problems - document what borg check does, fixes #138 - reorganize borgbackup.github.io sidebar, prev/next at top - deduplicate and refactor the docs / README.rst - use borg-tmp as prefix for temporary files / directories - short prune options without "keep-" are deprecated, do not suggest them - improved tox configuration - remove usage of unittest.mock, always use mock from pypi - use entrypoints instead of scripts, for better use of the wheel format and modern installs - add requirements.d/development.txt and modify tox.ini - use travis-ci for testing based on Linux and (new) OS X - use coverage.py, pytest-cov and codecov.io for test coverage support I forgot to list some stuff already implemented in 0.23.0, here they are: New features: - efficient archive list from manifest, meaning a big speedup for slow repo connections and "list ", "delete ", "prune" (attic #242, attic #167) - big speedup for chunks cache sync (esp. for slow repo connections), fixes #18 - hashindex: improve error messages Other changes: - explicitly specify binary mode to open binary files - some easy micro optimizations Version 0.23.0 (2015-06-11) --------------------------- Incompatible changes (compared to attic, fork related): - changed sw name and cli command to "borg", updated docs - package name (and name in urls) uses "borgbackup" to have fewer collisions - changed repo / cache internal magic strings from ATTIC* to BORG*, changed cache location to .cache/borg/ - this means that it currently won't accept attic repos (see issue #21 about improving that) Bug fixes: - avoid defect python-msgpack releases, fixes attic #171, fixes attic #185 - fix traceback when trying to do unsupported passphrase change, fixes attic #189 - datetime does not like the year 10.000, fixes attic #139 - fix "info" all archives stats, fixes attic #183 - fix parsing with missing microseconds, fixes attic #282 - fix misleading hint the fuse ImportError handler gave, fixes attic #237 - check unpacked data from RPC for tuple type and correct length, fixes attic #127 - fix Repository._active_txn state when lock upgrade fails - give specific path to xattr.is_enabled(), disable symlink setattr call that always fails - fix test setup for 32bit platforms, partial fix for attic #196 - upgraded versioneer, PEP440 compliance, fixes attic #257 New features: - less memory usage: add global option --no-cache-files - check --last N (only check the last N archives) - check: sort archives in reverse time order - rename repo::oldname newname (rename repository) - create -v output more informative - create --progress (backup progress indicator) - create --timestamp (utc string or reference file/dir) - create: if "-" is given as path, read binary from stdin - extract: if --stdout is given, write all extracted binary data to stdout - extract --sparse (simple sparse file support) - extra debug information for 'fread failed' - delete (deletes whole repo + local cache) - FUSE: reflect deduplication in allocated blocks - only allow whitelisted RPC calls in server mode - normalize source/exclude paths before matching - use posix_fadvise not to spoil the OS cache, fixes attic #252 - toplevel error handler: show tracebacks for better error analysis - sigusr1 / sigint handler to print current file infos - attic PR #286 - RPCError: include the exception args we get from remote Other changes: - source: misc. cleanups, pep8, style - docs and faq improvements, fixes, updates - cleanup crypto.pyx, make it easier to adapt to other AES modes - do os.fsync like recommended in the python docs - source: Let chunker optionally work with os-level file descriptor. - source: Linux: remove duplicate os.fsencode calls - source: refactor _open_rb code a bit, so it is more consistent / regular - source: refactor indicator (status) and item processing - source: use py.test for better testing, flake8 for code style checks - source: fix tox >=2.0 compatibility (test runner) - pypi package: add python version classifiers, add FreeBSD to platforms Attic Changelog --------------- Here you can see the full list of changes between each Attic release until Borg forked from Attic: Version 0.17 ~~~~~~~~~~~~ (bugfix release, released on X) - Fix hashindex ARM memory alignment issue (#309) - Improve hashindex error messages (#298) Version 0.16 ~~~~~~~~~~~~ (bugfix release, released on May 16, 2015) - Fix typo preventing the security confirmation prompt from working (#303) - Improve handling of systems with improperly configured file system encoding (#289) - Fix "All archives" output for attic info. (#183) - More user friendly error message when repository key file is not found (#236) - Fix parsing of iso 8601 timestamps with zero microseconds (#282) Version 0.15 ~~~~~~~~~~~~ (bugfix release, released on Apr 15, 2015) - xattr: Be less strict about unknown/unsupported platforms (#239) - Reduce repository listing memory usage (#163). - Fix BrokenPipeError for remote repositories (#233) - Fix incorrect behavior with two character directory names (#265, #268) - Require approval before accessing relocated/moved repository (#271) - Require approval before accessing previously unknown unencrypted repositories (#271) - Fix issue with hash index files larger than 2GB. - Fix Python 3.2 compatibility issue with noatime open() (#164) - Include missing pyx files in dist files (#168) Version 0.14 ~~~~~~~~~~~~ (feature release, released on Dec 17, 2014) - Added support for stripping leading path segments (#95) "attic extract --strip-segments X" - Add workaround for old Linux systems without acl_extended_file_no_follow (#96) - Add MacPorts' path to the default openssl search path (#101) - HashIndex improvements, eliminates unnecessary IO on low memory systems. - Fix "Number of files" output for attic info. (#124) - limit create file permissions so files aren't read while restoring - Fix issue with empty xattr values (#106) Version 0.13 ~~~~~~~~~~~~ (feature release, released on Jun 29, 2014) - Fix sporadic "Resource temporarily unavailable" when using remote repositories - Reduce file cache memory usage (#90) - Faster AES encryption (utilizing AES-NI when available) - Experimental Linux, OS X and FreeBSD ACL support (#66) - Added support for backup and restore of BSDFlags (OSX, FreeBSD) (#56) - Fix bug where xattrs on symlinks were not correctly restored - Added cachedir support. CACHEDIR.TAG compatible cache directories can now be excluded using ``--exclude-caches`` (#74) - Fix crash on extreme mtime timestamps (year 2400+) (#81) - Fix Python 3.2 specific lockf issue (EDEADLK) Version 0.12 ~~~~~~~~~~~~ (feature release, released on April 7, 2014) - Python 3.4 support (#62) - Various documentation improvements a new style - ``attic mount`` now supports mounting an entire repository not only individual archives (#59) - Added option to restrict remote repository access to specific path(s): ``attic serve --restrict-to-path X`` (#51) - Include "all archives" size information in "--stats" output. (#54) - Added ``--stats`` option to ``attic delete`` and ``attic prune`` - Fixed bug where ``attic prune`` used UTC instead of the local time zone when determining which archives to keep. - Switch to SI units (Power of 1000 instead 1024) when printing file sizes Version 0.11 ~~~~~~~~~~~~ (feature release, released on March 7, 2014) - New "check" command for repository consistency checking (#24) - Documentation improvements - Fix exception during "attic create" with repeated files (#39) - New "--exclude-from" option for attic create/extract/verify. - Improved archive metadata deduplication. - "attic verify" has been deprecated. Use "attic extract --dry-run" instead. - "attic prune --hourly|daily|..." has been deprecated. Use "attic prune --keep-hourly|daily|..." instead. - Ignore xattr errors during "extract" if not supported by the filesystem. (#46) Version 0.10 ~~~~~~~~~~~~ (bugfix release, released on Jan 30, 2014) - Fix deadlock when extracting 0 sized files from remote repositories - "--exclude" wildcard patterns are now properly applied to the full path not just the file name part (#5). - Make source code endianness agnostic (#1) Version 0.9 ~~~~~~~~~~~ (feature release, released on Jan 23, 2014) - Remote repository speed and reliability improvements. - Fix sorting of segment names to ignore NFS left over files. (#17) - Fix incorrect display of time (#13) - Improved error handling / reporting. (#12) - Use fcntl() instead of flock() when locking repository/cache. (#15) - Let ssh figure out port/user if not specified so we don't override .ssh/config (#9) - Improved libcrypto path detection (#23). Version 0.8.1 ~~~~~~~~~~~~~ (bugfix release, released on Oct 4, 2013) - Fix segmentation fault issue. Version 0.8 ~~~~~~~~~~~ (feature release, released on Oct 3, 2013) - Fix xattr issue when backing up sshfs filesystems (#4) - Fix issue with excessive index file size (#6) - Support access of read only repositories. - New syntax to enable repository encryption: attic init --encryption="none|passphrase|keyfile". - Detect and abort if repository is older than the cache. Version 0.7 ~~~~~~~~~~~ (feature release, released on Aug 5, 2013) - Ported to FreeBSD - Improved documentation - Experimental: Archives mountable as FUSE filesystems. - The "user." prefix is no longer stripped from xattrs on Linux Version 0.6.1 ~~~~~~~~~~~~~ (bugfix release, released on July 19, 2013) - Fixed an issue where mtime was not always correctly restored. Version 0.6 ~~~~~~~~~~~ First public release on July 9, 2013 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/changes_1.x.rst0000644000076500000240000061024314646713253016241 0ustar00twstaff.. _important_notes_1x: Important notes 1.x =================== This section provides information about security and corruption issues. .. _archives_tam_vuln: Pre-1.2.5 archives spoofing vulnerability (CVE-2023-36811) ---------------------------------------------------------- A flaw in the cryptographic authentication scheme in Borg allowed an attacker to fake archives and potentially indirectly cause backup data loss in the repository. The attack requires an attacker to be able to 1. insert files (with no additional headers) into backups 2. gain write access to the repository This vulnerability does not disclose plaintext to the attacker, nor does it affect the authenticity of existing archives. Creating plausible fake archives may be feasible for empty or small archives, but is unlikely for large archives. The fix enforces checking the TAM authentication tag of archives at critical places. Borg now considers archives without TAM as garbage or an attack. We are not aware of others having discovered, disclosed or exploited this vulnerability. Below, if we speak of borg 1.2.6, we mean a borg version >= 1.2.6 **or** a borg version that has the relevant security patches for this vulnerability applied (could be also an older version in that case). Steps you must take to upgrade a repository (this applies to all kinds of repos no matter what encryption mode they use, including "none"): 1. Upgrade all clients using this repository to borg 1.2.6. Note: it is not required to upgrade a server, except if the server-side borg is also used as a client (and not just for "borg serve"). Do **not** run ``borg check`` with borg 1.2.6 before completing the upgrade steps: - ``borg check`` would complain about archives without a valid archive TAM. - ``borg check --repair`` would remove such archives! 2. Run: ``BORG_WORKAROUNDS=ignore_invalid_archive_tam borg info --debug 2>&1 | grep TAM | grep -i manifest`` a) If you get "TAM-verified manifest", continue with 3. b) If you get "Manifest TAM not found and not required", run ``borg upgrade --tam --force `` *on every client*. 3. Run: ``BORG_WORKAROUNDS=ignore_invalid_archive_tam borg list --consider-checkpoints --format='{name} {time} tam:{tam}{NL}' `` "tam:verified" means that the archive has a valid TAM authentication. "tam:none" is expected as output for archives created by borg <1.0.9. "tam:none" is also expected for archives resulting from a borg rename or borg recreate operation (see #7791). "tam:none" could also come from archives created by an attacker. You should verify that "tam:none" archives are authentic and not malicious (== have good content, have correct timestamp, can be extracted successfully). In case you find crappy/malicious archives, you must delete them before proceeding. In low-risk, trusted environments, you may decide on your own risk to skip step 3 and just trust in everything being OK. 4. If there are no tam:none archives left at this point, you can skip this step. Run ``BORG_WORKAROUNDS=ignore_invalid_archive_tam borg upgrade --archives-tam ``. This will unconditionally add a correct archive TAM to all archives not having one. ``borg check`` would consider TAM-less or invalid-TAM archives as garbage or a potential attack. To see that all archives now are "tam:verified" run: ``borg list --consider-checkpoints --format='{name} {time} tam:{tam}{NL}' `` 5. Please note that you should never use BORG_WORKAROUNDS=ignore_invalid_archive_tam for normal production operations - it is only needed once to get the archives in a repository into a good state. All archives have a valid TAM now. Vulnerability time line: * 2023-06-13: Vulnerability discovered during code review by Thomas Waldmann * 2023-06-13...: Work on fixing the issue, upgrade procedure, docs. * 2023-06-30: CVE was assigned via Github CNA * 2023-06-30 .. 2023-08-29: Fixed issue, code review, docs, testing. * 2023-08-30: Released fixed version 1.2.5 (broken upgrade procedure for some repos) * 2023-08-31: Released fixed version 1.2.6 (fixes upgrade procedure) .. _hashindex_set_bug: Pre-1.1.11 potential index corruption / data loss issue ------------------------------------------------------- A bug was discovered in our hashtable code, see issue #4829. The code is used for the client-side chunks cache and the server-side repo index. Although borg uses the hashtables very heavily, the index corruption did not happen too frequently, because it needed specific conditions to happen. Data loss required even more specific conditions, so it should be rare (and also detectable via borg check). You might be affected if borg crashed with / complained about: - AssertionError: Corrupted segment reference count - corrupted index or hints - ObjectNotFound: Object with key ... not found in repository ... - Index mismatch for key b'...'. (..., ...) != (-1, -1) - ValueError: stats_against: key contained in self but not in master_index. Advised procedure to fix any related issue in your indexes/caches: - install fixed borg code (on client AND server) - for all of your clients and repos remove the cache by: borg delete --cache-only YOURREPO (later, the cache will be re-built automatically) - for all your repos, rebuild the repo index by: borg check --repair YOURREPO This will also check all archives and detect if there is any data-loss issue. Affected branches / releases: - fd06497 introduced the bug into 1.1-maint branch - it affects all borg 1.1.x since 1.1.0b4. - fd06497 introduced the bug into master branch - it affects all borg 1.2.0 alpha releases. - c5cd882 introduced the bug into 1.0-maint branch - it affects all borg 1.0.x since 1.0.11rc1. The bug was fixed by: - 701159a fixes the bug in 1.1-maint branch - will be released with borg 1.1.11. - fa63150 fixes the bug in master branch - will be released with borg 1.2.0a8. - 7bb90b6 fixes the bug in 1.0-maint branch. Branch is EOL, no new release is planned as of now. .. _broken_validator: Pre-1.1.4 potential data corruption issue ----------------------------------------- A data corruption bug was discovered in borg check --repair, see issue #3444. This is a 1.1.x regression, releases < 1.1 (e.g. 1.0.x) are not affected. To avoid data loss, you must not run borg check --repair using an unfixed version of borg 1.1.x. The first official release that has the fix is 1.1.4. Package maintainers may have applied the fix to updated packages of 1.1.x (x<4) though, see the package maintainer's package changelog to make sure. If you never had missing item metadata chunks, the bug has not affected you even if you did run borg check --repair with an unfixed version. When borg check --repair tried to repair corrupt archives that miss item metadata chunks, the resync to valid metadata in still present item metadata chunks malfunctioned. This was due to a broken validator that considered all (even valid) item metadata as invalid. As they were considered invalid, borg discarded them. Practically, that means the affected files, directories or other fs objects were discarded from the archive. Due to the malfunction, the process was extremely slow, but if you let it complete, borg would have created a "repaired" archive that has lost a lot of items. If you interrupted borg check --repair because it was so strangely slow (killing borg somehow, e.g. Ctrl-C) the transaction was rolled back and no corruption occurred. The log message indicating the precondition for the bug triggering looks like: item metadata chunk missing [chunk: 001056_bdee87d...a3e50d] If you never had that in your borg check --repair runs, you're not affected. But if you're unsure or you actually have seen that, better check your archives. By just using "borg list repo::archive" you can see if all expected filesystem items are listed. .. _tam_vuln: Pre-1.0.9 manifest spoofing vulnerability (CVE-2016-10099) ---------------------------------------------------------- A flaw in the cryptographic authentication scheme in Borg allowed an attacker to spoof the manifest. The attack requires an attacker to be able to 1. insert files (with no additional headers) into backups 2. gain write access to the repository This vulnerability does not disclose plaintext to the attacker, nor does it affect the authenticity of existing archives. The vulnerability allows an attacker to create a spoofed manifest (the list of archives). Creating plausible fake archives may be feasible for small archives, but is unlikely for large archives. The fix adds a separate authentication tag to the manifest. For compatibility with prior versions this authentication tag is *not* required by default for existing repositories. Repositories created with 1.0.9 and later require it. Steps you should take: 1. Upgrade all clients to 1.0.9 or later. 2. Run ``borg upgrade --tam `` *on every client* for *each* repository. 3. This will list all archives, including archive IDs, for easy comparison with your logs. 4. Done. Prior versions can access and modify repositories with this measure enabled, however, to 1.0.9 or later their modifications are indiscernible from an attack and will raise an error until the below procedure is followed. We are aware that this can be annoying in some circumstances, but don't see a way to fix the vulnerability otherwise. In case a version prior to 1.0.9 is used to modify a repository where above procedure was completed, and now you get an error message from other clients: 1. ``borg upgrade --tam --force `` once with *any* client suffices. This attack is mitigated by: - Noting/logging ``borg list``, ``borg info``, or ``borg create --stats``, which contain the archive IDs. We are not aware of others having discovered, disclosed or exploited this vulnerability. Vulnerability time line: * 2016-11-14: Vulnerability and fix discovered during review of cryptography by Marian Beermann (@enkore) * 2016-11-20: First patch * 2016-12-20: Released fixed version 1.0.9 * 2017-01-02: CVE was assigned * 2017-01-15: Released fixed version 1.1.0b3 (fix was previously only available from source) .. _attic013_check_corruption: Pre-1.0.9 potential data loss ----------------------------- If you have archives in your repository that were made with attic <= 0.13 (and later migrated to borg), running borg check would report errors in these archives. See issue #1837. The reason for this is a invalid (and useless) metadata key that was always added due to a bug in these old attic versions. If you run borg check --repair, things escalate quickly: all archive items with invalid metadata will be killed. Due to that attic bug, that means all items in all archives made with these old attic versions. Pre-1.0.4 potential repo corruption ----------------------------------- Some external errors (like network or disk I/O errors) could lead to corruption of the backup repository due to issue #1138. A sign that this happened is if "E" status was reported for a file that can not be explained by problems with the source file. If you still have logs from "borg create -v --list", you can check for "E" status. Here is what could cause corruption and what you can do now: 1) I/O errors (e.g. repo disk errors) while writing data to repo. This could lead to corrupted segment files. Fix:: # check for corrupt chunks / segments: borg check -v --repository-only REPO # repair the repo: borg check -v --repository-only --repair REPO # make sure everything is fixed: borg check -v --repository-only REPO 2) Unreliable network / unreliable connection to the repo. This could lead to archive metadata corruption. Fix:: # check for corrupt archives: borg check -v --archives-only REPO # delete the corrupt archives: borg delete --force REPO::CORRUPT_ARCHIVE # make sure everything is fixed: borg check -v --archives-only REPO 3) In case you want to do more intensive checking. The best check that everything is ok is to run a dry-run extraction:: borg extract -v --dry-run REPO::ARCHIVE .. _upgradenotes: Upgrade Notes ============= borg 1.1.x to 1.2.x ------------------- Some things can be recommended for the upgrade process from borg 1.1.x (please also read the important compatibility notes below): - first upgrade to a recent 1.1.x release - especially if you run some older 1.1.* or even 1.0.* borg release. - using that, run at least one `borg create` (your normal backup), `prune` and especially a `check` to see everything is in a good state. - check the output of `borg check` - if there is anything special, consider a `borg check --repair` followed by another `borg check`. - if everything is fine so far (borg check reports no issues), you can consider upgrading to 1.2.x. if not, please first fix any already existing issue. - if you want to play safer, first **create a backup of your borg repository**. - upgrade to latest borg 1.2.x release (you could use the fat binary from github releases page) - borg 1.2.6 has a security fix for the pre-1.2.5 archives spoofing vulnerability (CVE-2023-36811), see details and necessary upgrade procedure described above. - run `borg compact --cleanup-commits` to clean up a ton of 17 bytes long files in your repo caused by a borg 1.1 bug - run `borg check` again (now with borg 1.2.x) and check if there is anything special. - run `borg info` (with borg 1.2.x) to build the local pre12-meta cache (can take significant time, but after that it will be fast) - for more details see below. - check the compatibility notes (see below) and adapt your scripts, if needed. - if you run into any issues, please check the github issue tracker before posting new issues there or elsewhere. If you follow this procedure, you can help avoiding that we get a lot of "borg 1.2" issue reports that are not really 1.2 issues, but existed before and maybe just were not noticed. Compatibility notes: - matching of path patterns has been aligned with borg storing relative paths. Borg archives file paths without leading slashes. Previously, include/exclude patterns could contain leading slashes. You should check your patterns and remove leading slashes. - dropped support / testing for older Pythons, minimum requirement is 3.8. In case your OS does not provide Python >= 3.8, consider using our binary, which does not need an external Python interpreter. Or continue using borg 1.1.x, which is still supported. - freeing repository space only happens when "borg compact" is invoked. - mount: the default for --numeric-ids is False now (same as borg extract) - borg create --noatime is deprecated. Not storing atime is the default behaviour now (use --atime if you want to store the atime). - --prefix is deprecated, use -a / --glob-archives, see #6806 - list: corrected mix-up of "isomtime" and "mtime" formats. Previously, "isomtime" was the default but produced a verbose human format, while "mtime" produced a ISO-8601-like format. The behaviours have been swapped (so "mtime" is human, "isomtime" is ISO-like), and the default is now "mtime". "isomtime" is now a real ISO-8601 format ("T" between date and time, not a space). - create/recreate --list: file status for all files used to get announced *AFTER* the file (with borg < 1.2). Now, file status is announced *BEFORE* the file contents are processed. If the file status changes later (e.g. due to an error or a content change), the updated/final file status will be printed again. - removed deprecated-since-long stuff (deprecated since): - command "borg change-passphrase" (2017-02), use "borg key ..." - option "--keep-tag-files" (2017-01), use "--keep-exclude-tags" - option "--list-format" (2017-10), use "--format" - option "--ignore-inode" (2017-09), use "--files-cache" w/o "inode" - option "--no-files-cache" (2017-09), use "--files-cache=disabled" - removed BORG_HOSTNAME_IS_UNIQUE env var. to use borg you must implement one of these 2 scenarios: - 1) the combination of FQDN and result of uuid.getnode() must be unique and stable (this should be the case for almost everybody, except when having duplicate FQDN *and* MAC address or all-zero MAC address) - 2) if you are aware that 1) is not the case for you, you must set BORG_HOST_ID env var to something unique. - exit with 128 + signal number, #5161. if you have scripts expecting rc == 2 for a signal exit, you need to update them to check for >= 128. .. _changelog_1x: Change Log 1.x ============== Version 1.3.0a1 (2022-04-15) ---------------------------- Please note: This is an alpha release, only for testing - do not use this with production repos. New features: - init: new --encryption=(repokey|keyfile)-[blake2-](aes-ocb|chacha20-poly1305) - New, better, faster crypto (see encryption-aead diagram in the docs), #6463. - New AEAD cipher suites: AES-OCB and CHACHA20-POLY1305. - Session keys are derived via HKDF from random session id and master key. - Nonces/MessageIVs are counters starting from 0 for each session. - AAD: chunk id, key type, messageIV, sessionID are now authenticated also. - Solves the potential AES-CTR mode counter management issues of the legacy crypto. - init: --key-algorithm=argon2 (new default KDF, older pbkdf2 also still available) borg key change-passphrase / change-location keeps the key algorithm unchanged. - key change-algorithm: to upgrade existing keys to argon2 or downgrade to pbkdf2. We recommend you to upgrade unless you have to keep the key compatible with older versions of borg. - key change-location: usable for repokey <-> keyfile location change - benchmark cpu: display benchmarks of cpu bound stuff - export-tar: new --tar-format=PAX (default: GNU) - import-tar/export-tar: can use PAX format for ctime and atime support - import-tar/export-tar: --tar-format=BORG: roundtrip ALL item metadata, #5830 - repository: create and use version 2 repos only for now - repository: implement PUT2: header crc32, overall xxh64, #1704 Other changes: - require python >= 3.9, #6315 - simplify libs setup, #6482 - unbundle most bundled 3rd party code, use libs, #6316 - use libdeflate.crc32 (Linux and all others) or zlib.crc32 (macOS) - repository: code cleanups / simplifications - internal crypto api: speedups / cleanups / refactorings / modernisation - remove "borg upgrade" support for "attic backup" repos - remove PassphraseKey code and borg key migrate-to-repokey command - OpenBSD: build borg with OpenSSL (not: LibreSSL), #6474 - remove support for LibreSSL, #6474 - remove support for OpenSSL < 1.1.1 Version 1.2.7 (2023-12-02) -------------------------- For upgrade and compatibility hints, please also read the section "Upgrade Notes" above. Fixes: - docs: CVE-2023-36811 upgrade steps: consider checkpoint archives, #7802 - check/compact: fix spurious reappearance of orphan chunks since borg 1.2, #6687 - this consists of 2 fixes: - for existing chunks: check --repair: recreate shadow index, #7897 #6687 - for newly created chunks: update shadow index when doing a double-put, #7896 #5661 If you have experienced issue #6687, you may want to run borg check --repair after upgrading to borg 1.2.7 to recreate the shadow index and get rid of the issue for existing chunks. - LockRoster.modify: no KeyError if element was already gone, #7937 - create --X-from-command: run subcommands with a clean environment, #7916 - list --sort-by: support "archive" as alias of "name", #7873 - fix rc and msg if arg parsing throws an exception, #7885 Other changes: - support and test on Python 3.12 - include unistd.h in _chunker.c (fix for Python 3.13) - allow msgpack 1.0.6 and 1.0.7 - TAM issues: show tracebacks, improve borg check logging, #7797 - replace "datetime.utcfromtimestamp" with custom helper to avoid deprecation warnings when using Python 3.12 - vagrant: - use generic/debian9 box, fixes #7579 - add VM with debian bookworm / test on OpenSSL 3.0.x. - docs: - not only attack/unsafe, can also be a fs issue, #7853 - point to CVE-2023-36811 upgrade steps from borg 1.1 to 1.2 upgrade steps, #7899 - upgrade steps needed for all kinds of repos (including "none" encryption mode), #7813 - upgrade steps: talk about consequences of borg check, #7816 - upgrade steps: remove period that could be interpreted as part of the command - automated-local.rst: use GPT UUID for consistent udev rule - create disk/partition sector backup by disk serial number, #7934 - update macOS hint about full disk access - clarify borg prune -a option description, #7871 - readthedocs: also build offline docs (HTMLzip), #7835 - frontends: add "check.rebuild_refcounts" message Version 1.2.6 (2023-08-31) -------------------------- Fixes: - The upgrade procedure docs as published with borg 1.2.5 did not work, if the repository had archives resulting from a borg rename or borg recreate operation. The updated docs now use BORG_WORKAROUNDS=ignore_invalid_archive_tam at some places to avoid that issue, #7791. See: fix pre-1.2.5 archives spoofing vulnerability (CVE-2023-36811), details and necessary upgrade procedure described above. Other changes: - updated 1.2.5 changelog entry: 1.2.5 already has the fix for rename/recreate. - remove cython restrictions. recommended is to build with cython 0.29.latest, because borg 1.2.x uses this since years and it is very stable. you can also try to build with cython 3.0.x, there is a good chance that it works. as a 3rd option, we also bundle the `*.c` files cython outputs in the release pypi package, so you can also just use these and not need cython at all. Version 1.2.5 (2023-08-30) -------------------------- Fixes: - Security: fix pre-1.2.5 archives spoofing vulnerability (CVE-2023-36811), see details and necessary upgrade procedure described above. - rename/recreate: correctly update resulting archive's TAM, see #7791 - create: do not try to read parent dir of recursion root, #7746 - extract: fix false warning about pattern never matching, #4110 - diff: remove surrogates before output, #7535 - compact: clear empty directories at end of compact process, #6823 - create --files-cache=size: fix crash, #7658 - keyfiles: improve key sanity check, #7561 - only warn about "invalid" chunker params, #7590 - ProgressIndicatorPercent: fix space computation for wide chars, #3027 - improve argparse validator error messages New features: - mount: make up volname if not given (macOS), #7690. macFUSE supports a volname mount option to give what finder displays on the desktop / in the directory view. if the user did not specify it, we make something up, because otherwise it would be "macFUSE Volume 0 (Python)" and hide the mountpoint directory name. - BORG_WORKAROUNDS=authenticated_no_key to extract from authenticated repos without key, #7700 Other changes: - add `utcnow()` helper function to avoid deprecated `datetime.utcnow()` - stay on latest Cython 0.29 (0.29.36) for borg 1.2.x (do not use Cython 3.0 yet) - docs: - move upgrade notes to own section, see #7546 - mount -olocal: how to show mount in finder's sidebar, #5321 - list: fix --pattern examples, #7611 - improve patterns help - incl./excl. options, path-from-stdin exclusiveness - obfuscation docs: markup fix, note about MAX_DATA_SIZE - --one-file-system: add macOS apfs notes, #4876 - improve --one-file-system help string, #5618 - rewrite borg check docs - improve the docs for --keep-within, #7687 - fix borg init command in environment.rst.inc - 1.1.x upgrade notes: more precise borg upgrade instructions, #3396 - tests: - fix repo reopen - avoid long ids in pytest output - check buzhash chunksize distribution, see #7586 Version 1.2.4 (2023-03-24) -------------------------- New features: - import-tar: add --ignore-zeros to process concatenated tars, #7432. - debug id-hash: computes file/chunk content id-hash, #7406 - diff: --content-only does not show mode/ctime/mtime changes, #7248 - diff: JSON strings in diff output are now sorted alphabetically Bug fixes: - xattrs: fix namespace processing on FreeBSD, #6997 - diff: fix path related bug seen when addressing deferred items. - debug get-obj/put-obj: always give chunkid as cli param, see #7290 (this is an incompatible change, see also borg debug id-hash) - extract: fix mtime when ResourceFork xattr is set (macOS specific), #7234 - recreate: without --chunker-params, do not re-chunk, #7337 - recreate: when --target is given, do not detect "nothing to do". use case: borg recreate -a src --target dst can be used to make a copy of an archive inside the same repository, #7254. - set .hardlink_master for ALL hardlinkable items, #7175 - locking: fix host, pid, tid order. tid (thread id) must be parsed as hex from lock file name. - update development.lock.txt, including a setuptools security fix, #7227 Other changes: - requirements: allow msgpack 1.0.5 also - upgrade Cython to 0.29.33 - hashindex minor fixes, refactor, tweaks, tests - use os.replace not os.rename - remove BORG_LIBB2_PREFIX (not used any more) - docs: - BORG_KEY_FILE: clarify docs, #7444 - update FAQ about locale/unicode issues, #6999 - improve mount options rendering, #7359 - make timestamps in manual pages reproducible - installation: update Fedora in distribution list, #7357 - tests: - fix test_size_on_disk_accurate for large st_blksize, #7250 - add same_ts_ns function and use it for relaxed timestamp comparisons - "auto" compressor tests: don't assume a specific size, do not assume zlib is better than lz4, #7363 - add test for extracted directory mtime - vagrant: - upgrade local freebsd 12.1 box -> generic/freebsd13 box (13.1) - use pythons > 3.8 which work on freebsd 13.1 - pyenv: also install python 3.11.1 for testing - pyenv: use python 3.10.1, 3.10.0 build is broken on freebsd Version 1.2.3 (2022-12-24) -------------------------- Fixes: - create: fix --list --dry-run output for directories, #7209 - diff/recreate: normalize chunker params before comparing them, #7079 - check: fix uninitialised variable if repo is completely empty, #7034 - xattrs: improve error handling, #6988 - fix args.paths related argparsing, #6994 - archive.save(): always use metadata from stats (e.g. nfiles, size, ...), #7072 - tar_filter: recognize .tar.zst as zstd, #7093 - get_chunker: fix missing sparse=False argument, #7056 - file_integrity.py: make sure file_fd is always closed on exit - repository: cleanup(): close segment before unlinking - repository: use os.replace instead of os.rename Other changes: - remove python < 3.7 compatibility code - do not use version_tuple placeholder in setuptools_scm template - CI: fix tox4 passenv issue, #7199 - vagrant: update to python 3.9.16, use the openbsd 7.1 box - misc. test suite and docs fixes / improvements - remove deprecated --prefix from docs, #7109 - Windows: use MSYS2 for Github CI, remove Appveyor CI Version 1.2.2 (2022-08-20) -------------------------- New features: - prune/delete --checkpoint-interval=1800 and ctrl-c/SIGINT support, #6284 Fixes: - SaveFile: use a custom mkstemp with mode support, #6933, #6400, #6786. This fixes umask/mode/ACL issues (and also "chmod not supported" exceptions seen in 1.2.1) of files updated using SaveFile, e.g. the repo config. - hashindex_compact: fix eval order (check idx before use), #5899 - create --paths-from-(stdin|command): normalize paths, #6778 - secure_erase: avoid collateral damage, #6768. If a hardlink copy of a repo was made and a new repo config shall be saved, do NOT fill in random garbage before deleting the previous repo config, because that would damage the hardlink copy. - list: fix {flags:} formatting, #6081 - check: try harder to create the key, #5719 - misc commands: ctrl-c must not kill other subprocesses, #6912 - borg create with a remote repo via ssh - borg create --content-from-command - borg create --paths-from-command - (de)compression filter process of import-tar / export-tar Other changes: - deprecate --prefix, use -a / --glob-archives, see #6806 - make setuptools happy ("package would be ignored"), #6874 - fix pyproject.toml to create a fixed _version.py file, compatible with both old and new setuptools_scm version, #6875 - automate asciinema screencasts - CI: test on macOS 12 without fuse / fuse tests (too troublesome on github CI due to kernel extensions needed by macFUSE) - tests: fix test_obfuscate byte accounting - repository: add debug logging for issue #6687 - _chunker.c: fix warnings on macOS - requirements.lock.txt: use the latest cython 0.29.32 - docs: - add info on man page installation, #6894 - update archive_progress json description about "finished", #6570 - json progress_percent: some values are optional, #4074 - FAQ: full quota / full disk, #5960 - correct shell syntax for installation using git Version 1.2.1 (2022-06-06) -------------------------- Fixes: - create: skip with warning if opening the parent dir of recursion root fails, #6374 - create: fix crash. metadata stream can produce all-zero chunks, #6587 - fix crash when computing stats, escape % chars in archive name, #6500 - fix transaction rollback: use files cache filename as found in txn.active/, #6353 - import-tar: kill filter process in case of borg exceptions, #6401 #6681 - import-tar: fix mtime type bug - ensure_dir: respect umask for created directory modes, #6400 - SaveFile: respect umask for final file mode, #6400 - check archive: improve error handling for corrupt archive metadata block, make robust_iterator more robust, #4777 - pre12-meta cache: do not use the cache if want_unique is True, #6612 - fix scp-style repo url parsing for ip v6 address, #6526 - mount -o versions: give clear error msg instead of crashing. it does not make sense to request versions view if you only look at 1 archive, but the code shall not crash in that case as it did, but give a clear error msg. - show_progress: add finished=true/false to archive_progress json, #6570 - delete/prune: fix --iec mode output (decimal vs. binary units), #6606 - info: fix authenticated mode repo to show "Encrypted: No", #6462 - diff: support presence change for blkdev, chrdev and fifo items, #6615 New features: - delete: add repository id and location to prompt, #6453 - borg debug dump-repo-objs --ghost: new --segment=S --offset=O options Other changes: - support python 3.11 - allow msgpack 1.0.4, #6716 - load_key: no key is same as empty key, #6441 - give a more helpful error msg for unsupported key formats, #6561 - better error msg for defect or unsupported repo configs, #6566 - docs: - document borg 1.2 pattern matching behavior change, #6407 Make clear that absolute paths always go into the matcher as if they are relative (without leading slash). Adapt all examples accordingly. - authentication primitives: improved security and performance infos - mention BORG_FILES_CACHE_SUFFIX as alternative to BORG_FILES_CACHE_TTL, #5602 - FAQ: add a hint about --debug-topic=files_cache - improve borg check --max-duration description - fix values of TAG bytes, #6515 - borg compact --cleanup-commits also runs a normal compaction, #6324 - virtualization speed tips - recommend umask for passphrase file perms - borg 1.2 is security supported - update link to ubuntu packages, #6485 - use --numeric-ids in pull mode docs - remove blake2 docs, blake2 code not bundled any more, #6371 - clarify on-disk order and size of segment file log entry fields, #6357 - docs building: do not transform --/--- to unicode dashes - tests: - check that borg does not require pytest for normal usage, fixes #6563 - fix OpenBSD symlink mode test failure, #2055 - vagrant: - darwin64: remove fakeroot, #6314 - update development.lock.txt - use pyinstaller 4.10 and python 3.9.13 for binary build - upgrade VMCPUS and xdistn from 4 to 16, maybe this speeds up the tests - crypto: - use hmac.compare_digest instead of ==, #6470 - hmac_sha256: replace own cython wrapper code by hmac.digest python stdlib (since py38) - hmac and blake2b minor optimizations and cleanups - removed some unused crypto related code, #6472 - avoid losing the key (potential use-after-free). this never could happen in 1.2 due to the way we use the code. The issue was discovered in master after other changes, so we also "fixed" it here before it bites us. - setup / build: - add pyproject.toml, fix sys.path, #6466 - setuptools_scm: also require it via pyproject.toml - allow extra compiler flags for every extension build - fix misc. C / Cython compiler warnings, deprecation warnings - fix zstd.h include for bundled zstd, #6369 - source using python 3.8 features: ``pyupgrade --py38-plus ./**/*.py`` Version 1.2.0 (2022-02-22 22:02:22 :-) -------------------------------------- Please note: This is the first borg 1.2 release, so be careful and read the notes below. Upgrade notes: Strictly taken, nothing special is required for upgrading to 1.2, but some things can be recommended: - do you already want to upgrade? 1.1.x also will get fixes for a while. - be careful, first upgrade your less critical / smaller repos. - first upgrade to a recent 1.1.x release - especially if you run some older 1.1.* or even 1.0.* borg release. - using that, run at least one `borg create` (your normal backup), `prune` and especially a `check` to see everything is in a good state. - check the output of `borg check` - if there is anything special, consider a `borg check --repair` followed by another `borg check`. - if everything is fine so far (borg check reports no issues), you can consider upgrading to 1.2.0. if not, please first fix any already existing issue. - if you want to play safer, first **create a backup of your borg repository**. - upgrade to latest borg 1.2.x release (you could use the fat binary from github releases page) - run `borg compact --cleanup-commits` to clean up a ton of 17 bytes long files in your repo caused by a borg 1.1 bug - run `borg check` again (now with borg 1.2.x) and check if there is anything special. - run `borg info` (with borg 1.2.x) to build the local pre12-meta cache (can take significant time, but after that it will be fast) - for more details see below. - check the compatibility notes (see below) and adapt your scripts, if needed. - if you run into any issues, please check the github issue tracker before posting new issues there or elsewhere. If you follow this procedure, you can help avoiding that we get a lot of "borg 1.2" issue reports that are not really 1.2 issues, but existed before and maybe just were not noticed. Compatibility notes: - matching of path patterns has been aligned with borg storing relative paths. Borg archives file paths without leading slashes. Previously, include/exclude patterns could contain leading slashes. You should check your patterns and remove leading slashes. - dropped support / testing for older Pythons, minimum requirement is 3.8. In case your OS does not provide Python >= 3.8, consider using our binary, which does not need an external Python interpreter. Or continue using borg 1.1.x, which is still supported. - freeing repository space only happens when "borg compact" is invoked. - mount: the default for --numeric-ids is False now (same as borg extract) - borg create --noatime is deprecated. Not storing atime is the default behaviour now (use --atime if you want to store the atime). - list: corrected mix-up of "isomtime" and "mtime" formats. Previously, "isomtime" was the default but produced a verbose human format, while "mtime" produced a ISO-8601-like format. The behaviours have been swapped (so "mtime" is human, "isomtime" is ISO-like), and the default is now "mtime". "isomtime" is now a real ISO-8601 format ("T" between date and time, not a space). - create/recreate --list: file status for all files used to get announced *AFTER* the file (with borg < 1.2). Now, file status is announced *BEFORE* the file contents are processed. If the file status changes later (e.g. due to an error or a content change), the updated/final file status will be printed again. - removed deprecated-since-long stuff (deprecated since): - command "borg change-passphrase" (2017-02), use "borg key ..." - option "--keep-tag-files" (2017-01), use "--keep-exclude-tags" - option "--list-format" (2017-10), use "--format" - option "--ignore-inode" (2017-09), use "--files-cache" w/o "inode" - option "--no-files-cache" (2017-09), use "--files-cache=disabled" - removed BORG_HOSTNAME_IS_UNIQUE env var. to use borg you must implement one of these 2 scenarios: - 1) the combination of FQDN and result of uuid.getnode() must be unique and stable (this should be the case for almost everybody, except when having duplicate FQDN *and* MAC address or all-zero MAC address) - 2) if you are aware that 1) is not the case for you, you must set BORG_HOST_ID env var to something unique. - exit with 128 + signal number, #5161. if you have scripts expecting rc == 2 for a signal exit, you need to update them to check for >= 128. Fixes: - diff: reduce memory consumption, fix is_hardlink_master, #6295 - compact: fix / improve freeable / freed space log output - derive really freed space from quota use before/after, #5679 - do not say "freeable", but "maybe freeable" (based on hint, unsure) - fix race conditions in internal SaveFile function, #6306 #6028 - implement internal safe_unlink (was: truncate_and_unlink) function more safely: usually it does not truncate any more, only under "disk full" circumstances and only if there is only one hardlink. see: https://github.com/borgbackup/borg/discussions/6286 Other changes: - info: use a pre12-meta cache to accelerate stats for borg < 1.2 archives. the first time borg info is invoked on a borg 1.1 repo, it can take a rather long time computing and caching some stats values for 1.1 archives, which borg 1.2 archives have in their archive metadata structure. be patient, esp. if you have lots of old archives. following invocations are much faster due to the cache. related change: add archive name to calc_stats progress display. - docs: - add borg 1.2 upgrade notes, #6217 - link to borg placeholders and borg patterns help - init: explain the encryption modes better - clarify usage of patternfile roots - put import-tar docs into same file as export-tar docs - explain the difference between a path that ends with or without a slash, #6297 Version 1.2.0rc1 (2022-02-05) ----------------------------- Fixes: - repo::archive location placeholder expansion fixes, #5826, #5998 - repository: fix intermediate commits, shall be at end of current segment - delete: don't commit if nothing was deleted, avoid cache sync, #6060 - argument parsing: accept some options only once, #6026 - disallow overwriting of existing keyfiles on init, #6036 - if ensure_dir() fails, give more informative error message, #5952 New features: - delete --force: do not ask when deleting a repo, #5941 Other changes: - requirements: exclude broken or incompatible-with-pyinstaller setuptools - add a requirements.d/development.lock.txt and use it for vagrant - tests: - added nonce-related tests - refactor: remove assert_true - vagrant: macos box tuning, netbsd box fixes, #5370, #5922 - docs: - update install docs / requirements docs, #6180 - borg mount / FUSE "versions" view is not experimental any more - --pattern* is not experimental any more, #6134 - impact of deleting path/to/repo/nonce, #5858 - key export: add examples, #6204 - ~/.config/borg/keys is not used for repokey keys, #6107 - excluded parent dir's metadata can't restore Version 1.2.0b4 (2022-01-23) ---------------------------- Fixes: - create: fix passing device nodes and symlinks to --paths-from-stdin, #6009 - create --dry-run: fix display of kept tagfile, #5834 - check --repair: fix missing parameter in "did not consistently fail" msg, #5822 - fix hardlinkable file type check, #6037 - list: remove placeholders for shake_* hashes, #6082 - prune: handle case of calling prune_split when there are no archives, #6015 - benchmark crud: make sure cleanup of borg-test-data files/dir happens, #5630 - do not show archive name in repository-related error msgs, #6014 - prettier error msg (no stacktrace) if exclude file is missing, #5734 - do not require BORG_CONFIG_DIR if BORG_{SECURITY,KEYS}_DIR are set, #5979 - fix pyinstaller detection for dir-mode, #5897 - atomically create the CACHE_TAG file, #6028 - deal with the SaveFile/SyncFile race, docs, see #6056 708a5853 - avoid expanding path into LHS of formatting operation + tests, #6064 #6063 - repository: quota / compactable computation fixes - info: emit repo info even if repo has 0 archives + test, #6120 New features: - check --repair: significantly speed up search for next valid object in segment, #6022 - check: add progress indicator for archive check, #5809 - create: add retry_erofs workaround for O_NOATIME issue on volume shadow copies in WSL1, #6024 - create: allow --files-cache=size (this is potentially dangerous, use on your own risk), #5686 - import-tar: implement import-tar to complement export-tar, #2233 - implement BORG_SELFTEST env variable (can be carefully used to speedup borg hosting), #5871 - key export: print key if path is '-' or not given, #6092 - list --format: Add command_line to format keys Other changes: - pypi metadata: alpha -> beta - require python 3.8+, #5975 - use pyinstaller 4.7 - allow msgpack 1.0.3 - upgrade to bundled xxhash to 0.8.1 - import-tar / export-tar: tar file related changes: - check for short tarfile extensions - add .lz4 and .zstd - fix docs about extensions and decompression commands - add github codeql analysis, #6148 - vagrant: - box updates / add new boxes / remove outdated and broken boxes - use Python 3.9.10 (incl. binary builds) and 3.10.0 - fix pyenv initialisation, #5798 - fix vagrant scp on macOS, #5921 - use macfuse instead of osxfuse - shell completions: - update shell completions to 1.1.17, #5923 - remove BORG_LIBC completion, since 9914968 borg no longer uses find_library(). - docs: - fixed readme.rst irc webchat link (we use libera chat now, not freenode) - fix exceptions thrown by `setup.py build_man` - check --repair: recommend checking hw before check --repair, #5855 - check --verify-data: clarify and document conflict with --repository-only, #5808 - serve: improve ssh forced commands docs, #6083 - list: improve docs for `borg list` --format, #6061 - list: remove --list-format from borg list - FAQ: fix manifest-timestamp path (inside security dir) - fix the broken link to .nix file - document behavior for filesystems with inconsistent inodes, #5770 - clarify user_id vs uid for fuse, #5723 - clarify pattern usage with commands, #5176 - clarify pp vs. pf pattern type, #5300 - update referenced freebsd/macOS versions used for binary build, #5942 - pull mode: add some warnings, #5827 - clarify "you will need key and passphrase" borg init warning, #4622 - add missing leading slashes in help patterns, #5857 - add info on renaming repositories, #5240 - check: add notice about defective hardware, #5753 - mention tar --compare (compare archive to fs files), #5880 - add note about grandfather-father-son backup retention policy / rotation scheme, #6006 - permissions note rewritten to make it less confusing - create github security policy - remove leftovers of BORG_HOSTNAME_IS_UNIQUE - excluded parent dir's metadata can't restore. (#6062) - if parent dir is not extracted, we do not have its metadata - clarify who starts the remote agent Version 1.2.0b3 (2021-05-12) ---------------------------- Fixes: - create: fix --progress --log-json, #4360#issuecomment-774580052 - do not load files cache for commands not using it, #5673 - fix repeated cache tag file writing bug New features: - create/recreate: print preliminary file status early, #5417 - create/extract: add --noxattrs and --noacls options, #3955 - create: verbose files cache logging via --debug-topic=files_cache, #5659 - mount: implement --numeric-ids (default: False!), #2377 - diff: add --json-lines option - info / create --stats: add --iec option to print sizes in powers of 1024. Other changes: - create: add --upload-(ratelimit|buffer), deprecate --remote-* options, #5611 - create/extract/mount: add --numeric-ids, deprecate --numeric-owner option, #5724 - config: accept non-int value for max_segment_size / storage_quota - use PyInstaller v4.3, #5671 - vagrant: use Python 3.9.5 to build binaries - tox.ini: modernize and enable execution without preinstalling deps - cleanup code style checks - get rid of distutils, use setuptools+packaging - github CI: test on Python 3.10-dev - check: missing / healed chunks: always tell chunk ID, #5704 - docs: - remove bad /var/cache exclusion in example commands, #5625 - misc. fixes and improvements, esp. for macOS - add unsafe workaround to use an old repo copy, #5722 Version 1.2.0b2 (2021-02-06) ---------------------------- Fixes: - create: do not recurse into duplicate roots, #5603 - create: only print stats if not ctrl-c'ed, fixes traceback, #5668 - extract: improve exception handling when setting xattrs, #5092. emit a warning message giving the path, xattr key and error message. continue trying to restore other xattrs and bsdflags of the same file after an exception with xattr-setting happened. - export-tar: fix memory leak with ssh: remote repository, #5568. fix potential memory leak with ssh: remote repository with partial extraction. - remove empty shadowed_segments lists, #5275 - fix bad default: manifest.archives.list(consider_checkpoints=False), fixes tracebacks / KeyErros for missing objects in ChunkIndex, #5668 New features: - create: improve sparse file support - create --sparse (detect sparse file holes) and file map support, only for the "fixed" chunker, #14 - detect all-zero chunks in read data in "buzhash" and "fixed" chunkers - cached_hash: use a small LRU cache to accelerate all-zero chunks hashing - use cached_hash also to generate all-zero replacement chunks - create --remote-buffer, add a upload buffer for remote repos, #5574 - prune: keep oldest archive when retention target not met Other changes: - use blake2 from python 3.6+ hashlib (this removes the requirement for libb2 and the bundled blake2 code) - also accept msgpack up to 1.0.2. exclude 1.0.1 though, which had some issues (not sure they affect borg). - create: add repository location to --stats output, #5491 - check: debug log the segment filename - delete: add a --list switch to borg delete, #5116 - borg debug dump-hints - implemented to e.g. to look at shadow_index - Tab completion support for additional archives for 'borg delete' - refactor: have one borg.constants.zero all-zero bytes object - refactor shadow_index updating repo.put/delete, #5661, #5636. - docs: - add another case of attempted hardlink usage - fix description of borg upgrade hardlink usage, #5518 - use HTTPS everywhere - add examples for --paths-from-stdin, --paths-from-command, --paths-separator, #5644 - fix typos/grammar - update docs for dev environment installation instructions - recommend running tests only on installed versions for setup - add badge with current status of package - vagrant: - use brew install --cask ..., #5557 - use Python 3.9.1 and PyInstaller 4.1 to build the borg binary Version 1.2.0b1 (2020-12-06) ---------------------------- Fixes: - BORG_CACHE_DIR crashing borg if empty, atomic handling of recursive directory creation, #5216 - fix --dry-run and --stats coexistence, #5415 - allow EIO with warning when trying to hardlink, #4336 - export-tar: set tar format to GNU_FORMAT explicitly, #5274 - use --timestamp for {utcnow} and {now} if given, #5189 - make timestamp helper timezone-aware New features: - create: implement --paths-from-stdin and --paths-from-command, see #5492. These switches read paths to archive from stdin. Delimiter can specified by --paths-delimiter=DELIM. Paths read will be added honoring every option but exclusion options and --one-file-system. borg won't recurse into directories. - 'obfuscate' pseudo compressor obfuscates compressed chunk size in repo - add pyfuse3 (successor of llfuse) as an alternative lowlevel fuse implementation to llfuse (deprecated), #5407. FUSE implementation can be switched via env var BORG_FUSE_IMPL. - allow appending to the files cache filename with BORG_FILES_CACHE_SUFFIX - create: implement --stdin-mode, --stdin-user and --stdin-group, #5333 Other changes: - split recursive directory walking/processing into directory walking and item processing. - fix warning by importing setuptools before distutils. - debug info: include infos about FUSE implementation, #5546 - testing: - add a test for the hashindex corruption bug, #5531 #4829 - move away from travis-ci, use github actions, #5528 #5467 - test both on fuse2 and fuse3 - upload coverage reports to codecov - fix spurious failure in test_cache_files, #5438 - add tests for Location.with_timestamp - tox: add a non-fuse env to the envlist - vagrant: - use python 3.7.latest and pyinstaller 4.0 for binary creation - pyinstaller: compute basepath from spec file location - vagrant: updates/fixes for archlinux box, #5543 - docs: - "filename with spaces" example added to exclude file, #5236 - add a hint about sleeping computer, #5301 - how to adjust macOS >= Catalina security settings, #5303 - process/policy for adding new compression algorithms - updated docs about hacked backup client, #5480 - improve ansible deployment docs, make it more generic - how to approach borg speed issues, give speed example, #5371 - fix mathematical inaccuracy about chunk size, #5336 - add example for excluding content using --pattern cli option - clarify borg create's '--one-file-system' option, #4009 - improve docs/FAQ about append-only remote repos, #5497 - fix reST markup issues, labels - add infos about contributor retirement status Version 1.2.0a9 (2020-10-05) ---------------------------- Fixes: - fix memory leak related to preloading, #5202 - check --repair: fix potential data loss, #5325 - persist shadow_index in between borg runs, #4830 - fix hardlinked CACHEDIR.TAG processing, #4911 - --read-special: .part files also should be regular files, #5217 - allow server side enforcing of umask, --umask is for the local borg process only (see docs), #4947 - exit with 128 + signal number, #5161 - borg config --list does not show last_segment_checked, #5159 - locking: - fix ExclusiveLock race condition bug, #4923 - fix race condition in lock migration, #4953 - fix locking on openindiana, #5271 New features: - --content-from-command: create archive using stdout of given command, #5174 - allow key-import + BORG_KEY_FILE to create key files - build directory-based binary for macOS to avoid Gatekeeper delays Other changes: - upgrade bundled zstd to 1.4.5 - upgrade bundled xxhash to 0.8.0, #5362 - if self test fails, also point to OS and hardware, #5334 - misc. shell completions fixes/updates, rewrite zsh completion - prettier error message when archive gets too big, #5307 - stop relying on `false` exiting with status code 1 - rephrase some warnings, #5164 - parseformat: unnecessary calls removed, #5169 - testing: - enable Python3.9 env for test suite and VMs, #5373 - drop python 3.5, #5344 - misc. vagrant fixes/updates - misc. testing fixes, #5196 - docs: - add ssh-agent pull backup method to doc, #5288 - mention double --force in prune docs - update Homebrew install instructions, #5185 - better description of how cache and rebuilds of it work and how the workaround applies to that - point to borg create --list item flags in recreate usage, #5165 - add a note to create from stdin regarding files cache, #5180 - add security faq explaining AES-CTR crypto issues, #5254 - clarify --exclude-if-present in recreate, #5193 - add socat pull mode, #5150, #900 - move content of resources doc page to community project, #2088 - explain hash collision, #4884 - clarify --recompress option, #5154 Version 1.2.0a8 (2020-04-22) ---------------------------- Fixes: - fixed potential index corruption / data loss issue due to bug in hashindex_set, #4829. Please read and follow the more detailed notes close to the top of this document. - fix crash when upgrading erroneous hints file, #4922 - commit-time free space calc: ignore bad compact map entries, #4796 - info: if the archive doesn't exist, print a pretty message, #4793 - --prefix / -P: fix processing, avoid argparse issue, #4769 - ignore EACCES (errno 13) when hardlinking, #4730 - add a try catch when formatting the info string, #4818 - check: do not stumble over invalid item key, #4845 - update prevalence of env vars to set config and cache paths - mount: fix FUSE low linear read speed on large files, #5032 - extract: fix confusing output of borg extract --list --strip-components, #4934 - recreate: support --timestamp option, #4745 - fix ProgressIndicator msgids (JSON output), #4935 - fuse: set f_namemax in statfs result, #2684 - accept absolute paths on windows - pyinstaller: work around issue with setuptools > 44 New features: - chunker speedup (plus regression test) - added --consider-checkpoints and related test, #4788 - added --noflags option, deprecate --nobsdflags option, #4489 - compact: add --threshold option, #4674 - mount: add birthtime to FUSE entries - support platforms with no os.link, #4901 - if we don't have os.link, we just extract another copy instead of making a hardlink. - move sync_file_range to its own extension for better platform compatibility. - new --bypass-lock option to bypass locking, e.g. for read-only repos - accept absolute paths by removing leading slashes in patterns of all sorts but re: style, #4029 - delete: new --keep-security-info option Other changes: - support msgpack 0.6.2 and 1.0.0, #5065 - upgrade bundled zstd to 1.4.4 - upgrade bundled lz4 to 1.9.2 - upgrade xxhash to 0.7.3 - require recent enough llfuse for birthtime support, #5064 - only store compressed data if the result actually is smaller, #4516 - check: improve error output for matching index size, see #4829 - ignore --stats when given with --dry-run, but continue, #4373 - replaced usage of os.statvfs with shutil.disk_usage (better cross-platform support). - fuse: remove unneeded version check and compat code, micro opts - docs: - improve description of path variables - document how to delete data completely, #2929 - add FAQ about Borg config dir, #4941 - add docs about errors not printed as JSON, #4073 - update usage_general.rst.inc - added "Will move with BORG_CONFIG_DIR variable unless specified." to BORG_SECURITY_DIR info. - put BORG_SECURITY_DIR immediately below BORG_CONFIG_DIR (and moved BORG_CACHE_DIR up before them). - add paragraph regarding cache security assumptions, #4900 - tell about borg cache security precautions - add FAQ describing difference between a local repo vs. repo on a server. - document how to test exclusion patterns without performing an actual backup - create: tell that "Calculating size" time and space needs are caused by --progress - fix/improve documentation for @api decorator, #4674 - add a pull backup / push restore how-to, #1552 - fix man pages creation, #4752 - more general FAQ for backup and retain original paths, #4532 - explain difference between --exclude and --pattern, #4118 - add FAQ for preventing SSH timeout in extract, #3866 - improve password FAQ (decrease pw length, add -w 0 option to base64 to prevent line wrap), #4591 - add note about patterns and stored paths, #4160 - add upgrade of tools to pip installation how-to, #5090 - document one cause of orphaned chunks in check command, #2295 - clean up the whole check usage paragraph - FAQ: linked recommended restrictions to ssh public keys on borg servers, #4946 - fixed "doc downplays severity of Nonce reuse issue", #4883 - borg repo restore instructions needed, #3428 - new FAQ: A repo is corrupt and must be replaced with an older repo. - clarify borg init's encryption modes - native windows port: - update README_WINDOWS.rst - updated pyinstaller spec file to support windows builds - testing / CI: - improved travis config / install script, improved macOS builds - allow osx builds to fail, #4955 - Windows 10 build on Appveyor CI - vagrant: - upgrade pyinstaller to v3.5 + patch - use py369 for binary build, add py380 for tests - fix issue in stretch VM hanging at grub installation - add a debian buster and a ubuntu focal VM - update darwin box to 10.12 - upgrade FreeBSD box to 12.1 - fix debianoid virtualenv packages - use pyenv in freebsd64 VM - remove the flake8 test - darwin: avoid error if pkg is already installed - debianoid: don't interactively ask questions Version 1.2.0a7 (2019-09-07) ---------------------------- Fixes: - slave hardlinks extraction issue, see #4350 - extract: fix KeyError for "partial" extraction, #4607 - preload chunks for hardlink slaves w/o preloaded master, #4350 - fix preloading for old remote servers, #4652 - fix partial extract for hardlinked contentless file types, #4725 - Repository.open: use stat() to check for repo dir, #4695 - Repository.check_can_create_repository: use stat() to check, ~ #4695. - SecurityManager.known(): check all files, #4614 - after double-force delete, warn about necessary repair, #4704 - cope with ANY error when importing pytest into borg.testsuite, #4652 - fix invalid archive error message - setup.py: fix detection of missing Cython - filter out selinux xattrs, #4574 - location arg - should it be optional? #4541 - enable placeholder usage in --comment, #4559 - use whitelist approach for borg serve, #4097 New features: - minimal native Windows support, see windows readme (work in progress) - create: first ctrl-c (SIGINT) triggers checkpoint and abort, #4606 - new BORG_WORKAROUNDS mechanism, basesyncfile, #4710 - remove WSL autodetection. if WSL still has this problem, you need to set BORG_WORKAROUNDS=basesyncfile in the borg process environment to work around it. - support xxh64 checksum in addition to the hashlib hashes in borg list - enable placeholder usage in all extra archive arguments - enable placeholder usage in --comment, #4559 - enable placeholder usage in --glob-archives, #4495 - ability to use a system-provided version of "xxhash" - create: - changed the default behaviour not to store the atime of fs items. atime is often rather not interesting and fragile - it easily changes even if nothing else has changed and, if stored into the archive, spoils deduplication of the archive metadata stream. - if you give the --noatime option, borg will output a deprecation warning because it is currently ignored / does nothing. Please remove the --noatime option when using borg 1.2. - added a --atime option for storing files' atime into an archive Other changes: - argparser: always use REPOSITORY in metavar - do not check python/libc for borg serve, #4483 - small borg compact improvements, #4522 - compact: log freed space at INFO level - tests: - tox / travis: add testing on py38-dev - fix broken test that relied on improper zlib assumptions - pure-py msgpack warning shall not make a lot of tests fail, #4558 - rename test_mount_hardlinks to test_fuse_mount_hardlinks (master) - vagrant: add up-to-date openindiana box (py35, openssl10) - get rid of confusing coverage warning, #2069 - docs: - reiterate that 'file cache names are absolute' in FAQ, mention bind mount solution, #4738 - add restore docs, #4670 - updated docs to cover use of temp directory on remote, #4545 - add a push-style example to borg-create(1), #4613 - timestamps in the files cache are now usually ctime, #4583 - benchmark crud: clarify that space is used until compact - update documentation of borg create, corrects a mention of borg 1.1 as a future version. - fix osxfuse github link in installation docs - how to supply a passphrase, use crypto devices, #4549 - extract: document limitation "needs empty destination", #4598 - update macOS Brew link - add note about software for automating backup - compact: improve docs, - README: new URL for funding options Version 1.2.0a6 (2019-04-22) ---------------------------- Fixes: - delete / prune: consider part files correctly for stats, #4507 - fix "all archives" stats considering part files, #4329 - create: only run stat_simple_attrs() once - create: --stats does not work with --dry-run, exit with error msg, #4373 - give "invalid repo" error msg if repo config not found, #4411 New features: - display msgpack version as part of sysinfo (e.g. in tracebacks) Other changes: - docs: - sdd "SSH Configuration" section, #4493, #3988, #636, #4485 - better document borg check --max-duration, #4473 - sorted commands help in multiple steps, #4471 - testing: - travis: use py 3.5.3 and 3.6.7 on macOS to get a pyenv-based python build with openssl 1.1 - vagrant: use py 3.5.3 and 3.6.8 on darwin64 VM to build python and borg with openssl 1.1 - pytest: -v and default XDISTN to 1, #4481 Version 1.2.0a5 (2019-03-21) ---------------------------- Fixes: - warn if a file has changed while being backed up, #1750 - lrucache: regularly remove old FDs, #4427 - borg command shall terminate with rc 2 for ImportErrors, #4424 - make freebsd xattr platform code api compatible with linux, #3952 Other changes: - major setup code refactoring (especially how libraries like openssl, liblz4, libzstd, libb2 are discovered and how it falls back to code bundled with borg), new: uses pkg-config now (and needs python "pkgconfig" package installed), #1925 if you are a borg package maintainer, please try packaging this (see comments in setup.py). - Vagrantfile: add zstd, reorder, build env vars, #4444 - travis: install script improvements - update shell completions - docs: - add a sample logging.conf in docs/misc, #4380 - fix spelling errors - update requirements / install docs, #4374 Version 1.2.0a4 (2019-03-11) ---------------------------- Fixes: - do not use O_NONBLOCK for special files, like FIFOs, block and char devices when using --read-special. fixes backing up FIFOs. fixes to test. #4394 - more LibreSSL build fixes: LibreSSL has HMAC_CTX_free and HMAC_CTX_new New features: - check: incremental repo check (only checks crc32 for segment entries), #1657 borg check --repository-only --max-duration SECONDS ... - delete: timestamp for borg delete --info added, #4359 Other changes: - redo stale lock handling, #3986 drop BORG_HOSTNAME_IS_UNIQUE (please use BORG_HOST_ID if needed). borg now always assumes it has a unique host id - either automatically from fqdn plus uuid.getnode() or overridden via BORG_HOST_ID. - docs: - added Alpine Linux to distribution list - elaborate on append-only mode docs - vagrant: - darwin: new 10.12 box - freebsd: new 12.0 box - openbsd: new 6.4 box - misc. updates / fixes Version 1.2.0a3 (2019-02-26) ---------------------------- Fixes: - LibreSSL build fixes, #4403 - dummy ACL/xattr code fixes (used by OpenBSD and others), #4403 - create: fix openat/statat issues for root directory, #4405 Version 1.2.0a2 and earlier (2019-02-24) ---------------------------------------- New features: - compact: "borg compact" needs to be used to free repository space by compacting the segments (reading sparse segments, rewriting still needed data to new segments, deleting the sparse segments). Borg < 1.2 invoked compaction automatically at the end of each repository writing command. Borg >= 1.2 does not do that any more to give better speed, more control, more segment file stability (== less stuff moving to newer segments) and more robustness. See the docs about "borg compact" for more details. - "borg compact --cleanup-commits" is to cleanup the tons of 17byte long commit-only segment files caused by borg 1.1.x issue #2850. Invoke this once after upgrading (the server side) borg to 1.2. Compaction now automatically removes unneeded commit-only segment files. - prune: Show which rule was applied to keep archive, #2886 - add fixed blocksize chunker (see --chunker-params docs), #1086 Fixes: - avoid stale filehandle issues, #3265 - use more FDs, avoid race conditions on active fs, #906, #908, #1038 - add O_NOFOLLOW to base flags, #908 - compact: - require >10% freeable space in a segment, #2985 - repository compaction now automatically removes unneeded 17byte commit-only segments, #2850 - make swidth available on all posix platforms, #2667 Other changes: - repository: better speed and less stuff moving around by using separate segment files for manifest DELETEs and PUTs, #3947 - use pyinstaller v3.3.1 to build binaries - update bundled zstd code to 1.3.8, #4210 - update bundled lz4 code to 1.8.3, #4209 - msgpack: - switch to recent "msgpack" pypi pkg name, #3890 - wrap msgpack to avoid future compat complications, #3632, #2738 - support msgpack 0.6.0 and 0.6.1, #4220, #4308 - llfuse: modernize / simplify llfuse version requirements - code refactorings / internal improvements: - include size/csize/nfiles[_parts] stats into archive, #3241 - calc_stats: use archive stats metadata, if available - crypto: refactored crypto to use an AEAD style API - crypto: new AES-OCB, CHACHA20-POLY1305 - create: use less syscalls by not using a python file obj, #906, #3962 - diff: refactor the diff functionality to new ItemDiff class, #2475 - archive: create FilesystemObjectProcessors class - helpers: make a package, split into smaller modules - xattrs: move to platform package, use cython instead ctypes, #2495 - xattrs/acls/bsdflags: misc. code/api optimizations - FUSE: separate creation of filesystem from implementation of llfuse funcs, #3042 - FUSE: use unpacker.tell() instead of deprecated write_bytes, #3899 - setup.py: move build_man / build_usage code to setup_docs.py - setup.py: update to use a newer Cython/setuptools API for compiling .pyx -> .c, #3788 - use python 3.5's os.scandir / os.set_blocking - multithreading preparations (not used yet): - item.to_optr(), Item.from_optr() - fix chunker holding the GIL during blocking I/O - C code portability / basic MSC compatibility, #4147, #2677 - testing: - vagrant: new VMs for linux/bsd/darwin, most with OpenSSL 1.1 and py36 Version 1.1.18 (2022-06-05) --------------------------- Compatibility notes: - When upgrading from borg 1.0.x to 1.1.x, please note: - read all the compatibility notes for 1.1.0*, starting from 1.1.0b1. - borg upgrade: you do not need to and you also should not run it. - borg might ask some security-related questions once after upgrading. You can answer them either manually or via environment variable. One known case is if you use unencrypted repositories, then it will ask about a unknown unencrypted repository one time. - your first backup with 1.1.x might be significantly slower (it might completely read, chunk, hash a lot files) - this is due to the --files-cache mode change (and happens every time you change mode). You can avoid the one-time slowdown by using the pre-1.1.0rc4-compatible mode (but that is less safe for detecting changed files than the default). See the --files-cache docs for details. - 1.1.11 removes WSL autodetection (Windows 10 Subsystem for Linux). If WSL still has a problem with sync_file_range, you need to set BORG_WORKAROUNDS=basesyncfile in the borg process environment to work around the WSL issue. - 1.1.14 changes return codes due to a bug fix: In case you have scripts expecting rc == 2 for a signal exit, you need to update them to check for >= 128 (as documented since long). - 1.1.15 drops python 3.4 support, minimum requirement is 3.5 now. - 1.1.17 install_requires the "packaging" pypi package now. New features: - check --repair: significantly speed up search for next valid object in segment, #6022 - create: add retry_erofs workaround for O_NOATIME issue on volume shadow copies in WSL1, #6024 - key export: display key if path is '-' or not given, #6092 - list --format: add command_line to format keys, #6108 Fixes: - check: improve error handling for corrupt archive metadata block, make robust_iterator more robust, #4777 - diff: support presence change for blkdev, chrdev and fifo items, #6483 - diff: reduce memory consumption, fix is_hardlink_master - init: disallow overwriting of existing keyfiles - info: fix authenticated mode repo to show "Encrypted: No", #6462 - info: emit repo info even if repo has 0 archives, #6120 - list: remove placeholders for shake_* hashes, #6082 - mount -o versions: give clear error msg instead of crashing - show_progress: add finished=true/false to archive_progress json, #6570 - fix hardlinkable file type check, #6037 - do not show archive name in error msgs referring to the repository, #6023 - prettier error msg (no stacktrace) if exclude file is missing, #5734 - do not require BORG_CONFIG_DIR if BORG_{SECURITY,KEYS}_DIR are set, #5979 - atomically create the CACHE_TAG file, #6028 - deal with the SaveFile/SyncFile race, docs, see #6176 5c5b59bc9 - avoid expanding path into LHS of formatting operation + tests, #6064 #6063 - repository: quota / compactable computation fixes, #6119. This is mainly to keep the repo code in sync with borg 1.2. As borg 1.1 compacts immediately, there was not really an issue with this in 1.1. - fix transaction rollback: use files cache filename as found in txn.active, #6353 - do not load files cache for commands not using it, fixes #5673 - fix scp repo url parsing for ip v6 addrs, #6526 - repo::archive location placeholder expansion fixes, #5826, #5998 - use expanded location for log output - support placeholder expansion for BORG_REPO env var - respect umask for created directory and file modes, #6400 - safer truncate_and_unlink implementation Other changes: - upgrade bundled xxhash code to 0.8.1 - fix xxh64 related build (setup.py and post-0.8.1 patch for static_assert). The patch was required to build the bundled xxhash code on FreeBSD, see https://github.com/Cyan4973/xxHash/pull/670 - msgpack build: remove endianness macro, #6105 - update and fix shell completions - fuse: remove unneeded version check and compat code - delete --force: do not ask when deleting a repo, #5941 - delete: don't commit if nothing was deleted, avoid cache sync, #6060 - delete: add repository id and location to prompt - compact segments: improve freeable / freed space log output, #5679 - if ensure_dir() fails, give more informative error message, #5952 - load_key: no key is same as empty key, #6441 - better error msg for defect or unsupported repo configs, #6566 - use hmac.compare_digest instead of ==, #6470 - implement more standard hashindex.setdefault behaviour - remove stray punctuation from secure-erase message - add development.lock.txt, use a real python 3.5 to generate frozen reqs - setuptools 60.7.0 breaks pyinstaller, #6246 - setup.py clean2 was added to work around some setuptools customizability limitation. - allow extra compiler flags for every extension build - C code: make switch fallthrough explicit - Cython code: fix "useless trailing comma" cython warnings - requirements.lock.txt: use the latest cython 0.29.30 - fix compilation warnings: ‘PyUnicode_AsUnicode’ is deprecated - docs: - ~/.config/borg/keys is not used for repokey keys, #6107 - excluded parent dir's metadata can't restore, #6062 - permissions note rewritten to make it less confusing, #5490 - add note about grandfather-father-son backup retention policy / rotation scheme - clarify who starts the remote agent (borg serve) - test/improve pull backup docs, #5903 - document the socat pull mode described in #900 #515ß - borg serve: improve ssh forced commands docs, #6083 - improve docs for borg list --format, #6080 - fix the broken link to .nix file - clarify pattern usage with commands, #5176 - clarify user_id vs uid for fuse, #5723 - fix binary build freebsd/macOS version, #5942 - FAQ: fix manifest-timestamp path, #6016 - remove duplicate faq entries, #5926 - fix sphinx warnings, #5919 - virtualisation speed tips - fix values of TAG bytes, #6515 - recommend umask for passphrase file perms - update link to ubuntu packages, #6485 - clarify on-disk order and size of log entry fields, #6357 - do not transform --/--- to unicode dashes - improve linking inside docs, link to borg_placeholders, link to borg_patterns - use same phrasing in misc. help texts - borg init: explain the encryption modes better - explain the difference between a path that ends with or without a slash, #6297 - clarify usage of patternfile roots, #6242 - borg key export: add examples - updates about features not experimental any more: FUSE "versions" view, --pattern*, #6134 - fix/update cygwin package requirements - impact of deleting path/to/repo/nonce, #5858 - warn about tampered server nonce - mention BORG_FILES_CACHE_SUFFIX as alternative to BORG_FILES_CACHE_TTL, #5602 - add a troubleshooting note about "is not a valid repository" to the FAQ - vagrant / CI / testing: - misc. fixes and updates, new python versions - macOS on github: re-enable fuse2 testing by downgrading to older macOS, #6099 - fix OpenBSD symlink mode test failure, #2055 - use the generic/openbsd6 box - strengthen the test: we can read data w/o nonces - add tests for path/to/repo/nonce deletion - darwin64: backport some tunings from master - darwin64: remove fakeroot, #6314 - darwin64: fix vagrant scp, #5921 - darwin64: use macfuse instead of osxfuse - add ubuntu "jammy" 22.04 LTS VM - adapt memory for openindiana64 and darwin64 Version 1.1.17 (2021-07-12) --------------------------- Compatibility notes: - When upgrading from borg 1.0.x to 1.1.x, please note: - read all the compatibility notes for 1.1.0*, starting from 1.1.0b1. - borg upgrade: you do not need to and you also should not run it. - borg might ask some security-related questions once after upgrading. You can answer them either manually or via environment variable. One known case is if you use unencrypted repositories, then it will ask about a unknown unencrypted repository one time. - your first backup with 1.1.x might be significantly slower (it might completely read, chunk, hash a lot files) - this is due to the --files-cache mode change (and happens every time you change mode). You can avoid the one-time slowdown by using the pre-1.1.0rc4-compatible mode (but that is less safe for detecting changed files than the default). See the --files-cache docs for details. - 1.1.11 removes WSL autodetection (Windows 10 Subsystem for Linux). If WSL still has a problem with sync_file_range, you need to set BORG_WORKAROUNDS=basesyncfile in the borg process environment to work around the WSL issue. - 1.1.14 changes return codes due to a bug fix: In case you have scripts expecting rc == 2 for a signal exit, you need to update them to check for >= 128 (as documented since long). - 1.1.15 drops python 3.4 support, minimum requirement is 3.5 now. - 1.1.17 install_requires the "packaging" pypi package now. Fixes: - pyinstaller dir-mode: fix pyi detection / LIBPATH treatment, #5897 - handle crash due to kill stale lock race, #5828 - fix BORG_CACHE_DIR crashing borg if empty, #5216 - create --dry-run: fix display of kept tagfile, #5834 - fix missing parameter in "did not consistently fail" msg, #5822 - missing / healed chunks: always tell chunk ID, #5704 - benchmark: make sure cleanup happens even on exceptions, #5630 New features: - implement BORG_SELFTEST env variable, #5871. this can be used to accelerate borg startup a bit. not recommended for normal usage, but borg mass hosters with a lot of borg invocations can save some resources with this. on my laptop, this saved ~100ms cpu time (sys+user) per borg command invocation. - implement BORG_LIBC env variable to give the libc filename, #5870. you can use this if a borg does not find your libc. - check: add progress indicator for archive check. - allow --files-cache=size (not recommended, make sure you know what you do) Other changes: - Python 3.10 now officially supported! we test on py310-dev on github CI since a while and now also on the vagrant machines, so it should work ok. - github CI: test on py310 (again) - get rid of distutils, use packaging and setuptools. distutils is deprecated and gives warnings on py 3.10. - setup.py: rename "clean" to "clean2" to avoid shadowing the "clean" command. - remove libc filename fallback for the BSDs (there is no "usual" name) - cleanup flake8 checks, fix some pep8 violations. - docs building: replace deprecated function ".add_stylesheet()" for Sphinx 4 compatibility - docs: - add a hint on sleeping computer and ssh connections, #5301 - update the documentation on hacked backup client, #5480 - improve docs/FAQ about append-only remote repos, #5497 - complement the documentation for pattern files and exclude files, #5520 - "filename with spaces" example added to exclude file, #5236 note: no whitespace escaping needed, processed by borg. - add info on renaming repositories, #5240 - clarify borg check --verify-data, #5808 - add notice about defective hardware to check documentation, #5753 - add paragraph added in #5855 to utility documentation source - add missing leading slashes in help patterns, #5857 - clarify "you will need key and passphrase" borg init warning, #4622 - pull mode: add some warnings, #5827 - mention tar --compare (compare archive to fs files), #5880 - fix typos, backport of #5597 - vagrant: - add py3.7.11 for binary build, also add 3.10-dev. - use latest Cython 0.29.23 for py310 compat fixes. - more RAM for openindiana upgrade plan resolver, it just hangs (swaps?) if there is too little RAM. - fix install_pyenv to adapt to recent changes in pyenv (same as in master now). - use generic/netbsd9 box, copied from master branch. Version 1.1.16 (2021-03-23) --------------------------- Fixes: - setup.py: add special openssl prefix for Apple M1 compatibility - do not recurse into duplicate roots, #5603 - remove empty shadowed_segments lists, #5275, #5614 - fix libpython load error when borg fat binary / dir-based binary is invoked via a symlink by upgrading pyinstaller to v4.2, #5688 - config: accept non-int value (like 500M or 100G) for max_segment_size or storage_quota, #5639. please note: when setting a non-int value for this in a repo config, using the repo will require borg >= 1.1.16. New features: - bundled msgpack: drop support for old buffer protocol to support Python 3.10 - verbose files cache logging via --debug-topic=files_cache, #5659. Use this if you suspect that borg does not detect unmodified files as expected. - create/extract: add --noxattrs and --noacls option, #3955. when given with borg create, borg will not get xattrs / ACLs from input files (and thus, it will not archive xattrs / ACLs). when given with borg extract, borg will not read xattrs / ACLs from archive and will not set xattrs / ACLs on extracted files. - diff: add --json-lines option, #3765 - check: debug log segment filename - borg debug dump-hints Other changes: - Tab completion support for additional archives for 'borg delete' - repository: deduplicate code of put and delete, no functional change - tests: fix result order issue (sporadic test failure on openindiana) - vagrant: - upgrade pyinstaller to v4.2, #5671 - avoid grub-install asking interactively for device - remove the xenial box - update freebsd box to 12.1 - docs: - update macOS install instructions, #5677 - use macFUSE (not osxfuse) for Apple M1 compatibility - update docs for dev environment installation instructions, #5643 - fix grammar in faq - recommend running tests only on installed versions for setup - add link back to git-installation - remove /var/cache exclusion in example commands, #5625. This is generally a poor idea and shouldn't be promoted through examples. - add repology.org badge with current packaging status - explain hash collision - add unsafe workaround to use an old repo copy, #5722 Version 1.1.15 (2020-12-25) --------------------------- Fixes: - extract: - improve exception handling when setting xattrs, #5092. - emit a warning message giving the path, xattr key and error message. - continue trying to restore other xattrs and bsdflags of the same file after an exception with xattr-setting happened. - export-tar: - set tar format to GNU_FORMAT explicitly, #5274 - fix memory leak with ssh: remote repository, #5568 - fix potential memory leak with ssh: remote repository with partial extraction - create: fix --dry-run and --stats coexistence, #5415 - use --timestamp for {utcnow} and {now} if given, #5189 New features: - create: implement --stdin-mode, --stdin-user and --stdin-group, #5333 - allow appending the files cache filename with BORG_FILES_CACHE_SUFFIX env var Other changes: - drop python 3.4 support, minimum requirement is 3.5 now. - enable using libxxhash instead of bundled xxh64 code - update llfuse requirements (1.3.8) - set cython language_level in some files to fix warnings - allow EIO with warning when trying to hardlink - PropDict: fail early if internal_dict is not a dict - update shell completions - tests / CI - add a test for the hashindex corruption bug, #5531 #4829 - fix spurious failure in test_cache_files, #5438 - added a github ci workflow - reduce testing on travis, no macOS, no py3x-dev, #5467 - travis: use newer dists, native py on dist - vagrant: - remove jessie and trusty boxes, #5348 #5383 - pyinstaller 4.0, build on py379 - binary build on stretch64, #5348 - remove easy_install based pip installation - docs: - clarify '--one-file-system' for btrfs, #5391 - add example for excluding content using the --pattern cmd line arg - complement the documentation for pattern files and exclude files, #5524 - made ansible playbook more generic, use package instead of pacman. also change state from "latest" to "present". - complete documentation on append-only remote repos, #5497 - internals: rather talk about target size than statistics, #5336 - new compression algorithm policy, #1633 #5505 - faq: add a hint on sleeping computer, #5301 - note requirements for full disk access on macOS Catalina, #5303 - fix/improve description of borg upgrade hardlink usage, #5518 - modernize 1.1 code: - drop code/workarounds only needed to support Python 3.4 - remove workaround for pre-release py37 argparse bug - removed some outdated comments/docstrings - requirements: remove some restrictions, lock on current versions Version 1.1.14 (2020-10-07) --------------------------- Fixes: - check --repair: fix potential data loss when interrupting it, #5325 - exit with 128 + signal number (as documented) when borg is killed by a signal, #5161 - fix hardlinked CACHEDIR.TAG processing, #4911 - create --read-special: .part files also should be regular files, #5217 - llfuse dependency: choose least broken 1.3.6/1.3.7. 1.3.6 is broken on python 3.9, 1.3.7 is broken on FreeBSD. Other changes: - upgrade bundled xxhash to 0.7.4 - self test: if it fails, also point to OS and hardware, #5334 - pyinstaller: compute basepath from spec file location - prettier error message when archive gets too big, #5307 - check/recreate are not "experimental" any more (but still potentially dangerous): - recreate: remove extra confirmation - rephrase some warnings, update docs, #5164 - shell completions: - misc. updates / fixes - support repositories in fish tab completion, #5256 - complete $BORG_RECREATE_I_KNOW_WHAT_I_AM_DOING - rewrite zsh completion: - completion for almost all optional and positional arguments - completion for Borg environment variables (parameters) - use "allow/deny list" instead of "white/black list" wording - declare "allow_cache_wipe" marker in setup.cfg to avoid pytest warning - vagrant / tests: - misc. fixes / updates - use python 3.5.10 for binary build - build directory-based binaries additionally to the single file binaries - add libffi-dev, required to build python - use cryptography<3.0, more recent versions break the jessie box - test on python 3.9 - do brew update with /dev/null redirect to avoid "too much log output" on travis-ci - docs: - add ssh-agent pull backup method docs, #5288 - how to approach borg speed issues, #5371 - mention double --force in prune docs - update Homebrew install instructions, #5185 - better description of how cache and rebuilds of it work - point to borg create --list item flags in recreate usage, #5165 - add security faq explaining AES-CTR crypto issues, #5254 - add a note to create from stdin regarding files cache, #5180 - fix borg.1 manpage generation regression, #5211 - clarify how exclude options work in recreate, #5193 - add section for retired contributors - hint about not misusing private email addresses of contributors for borg support Version 1.1.13 (2020-06-06) --------------------------- Compatibility notes: - When upgrading from borg 1.0.x to 1.1.x, please note: - read all the compatibility notes for 1.1.0*, starting from 1.1.0b1. - borg upgrade: you do not need to and you also should not run it. - borg might ask some security-related questions once after upgrading. You can answer them either manually or via environment variable. One known case is if you use unencrypted repositories, then it will ask about a unknown unencrypted repository one time. - your first backup with 1.1.x might be significantly slower (it might completely read, chunk, hash a lot files) - this is due to the --files-cache mode change (and happens every time you change mode). You can avoid the one-time slowdown by using the pre-1.1.0rc4-compatible mode (but that is less safe for detecting changed files than the default). See the --files-cache docs for details. - 1.1.11 removes WSL autodetection (Windows 10 Subsystem for Linux). If WSL still has a problem with sync_file_range, you need to set BORG_WORKAROUNDS=basesyncfile in the borg process environment to work around the WSL issue. Fixes: - rebuilt using a current Cython version, compatible with python 3.8, #5214 Version 1.1.12 (2020-06-06) --------------------------- Fixes: - fix preload-related memory leak, #5202. - mount / borgfs (FUSE filesystem): - fix FUSE low linear read speed on large files, #5067 - fix crash on old llfuse without birthtime attrs, #5064 - accidentally we required llfuse >= 1.3. Now also old llfuse works again. - set f_namemax in statfs result, #2684 - update precedence of env vars to set config and cache paths, #4894 - correctly calculate compression ratio, taking header size into account, too New features: - --bypass-lock option to bypass locking with read-only repositories Other changes: - upgrade bundled zstd to 1.4.5 - travis: adding comments and explanations to Travis config / install script, improve macOS builds. - tests: test_delete_force: avoid sporadic test setup issues, #5196 - misc. vagrant fixes - the binary for macOS is now built on macOS 10.12 - the binaries for Linux are now built on Debian 8 "Jessie", #3761 - docs: - PlaceholderError not printed as JSON, #4073 - "How important is Borg config?", #4941 - make Sphinx warnings break docs build, #4587 - some markup / warning fixes - add "updating borgbackup.org/releases" to release checklist, #4999 - add "rendering docs" to release checklist, #5000 - clarify borg init's encryption modes - add note about patterns and stored paths, #4160 - add upgrade of tools to pip installation how-to - document one cause of orphaned chunks in check command, #2295 - linked recommended restrictions to ssh public keys on borg servers in faq, #4946 Version 1.1.11 (2020-03-08) --------------------------- Compatibility notes: - When upgrading from borg 1.0.x to 1.1.x, please note: - read all the compatibility notes for 1.1.0*, starting from 1.1.0b1. - borg upgrade: you do not need to and you also should not run it. - borg might ask some security-related questions once after upgrading. You can answer them either manually or via environment variable. One known case is if you use unencrypted repositories, then it will ask about a unknown unencrypted repository one time. - your first backup with 1.1.x might be significantly slower (it might completely read, chunk, hash a lot files) - this is due to the --files-cache mode change (and happens every time you change mode). You can avoid the one-time slowdown by using the pre-1.1.0rc4-compatible mode (but that is less safe for detecting changed files than the default). See the --files-cache docs for details. - 1.1.11 removes WSL autodetection (Windows 10 Subsystem for Linux). If WSL still has a problem with sync_file_range, you need to set BORG_WORKAROUNDS=basesyncfile in the borg process environment to work around the WSL issue. Fixes: - fixed potential index corruption / data loss issue due to bug in hashindex_set, #4829. Please read and follow the more detailed notes close to the top of this document. - upgrade bundled xxhash to 0.7.3, #4891. 0.7.2 is the minimum requirement for correct operations on ARMv6 in non-fixup mode, where unaligned memory accesses cause bus errors. 0.7.3 adds some speedups and libxxhash 0.7.3 even has a pkg-config file now. - upgrade bundled lz4 to 1.9.2 - upgrade bundled zstd to 1.4.4 - fix crash when upgrading erroneous hints file, #4922 - extract: - fix KeyError for "partial" extraction, #4607 - fix "partial" extract for hardlinked contentless file types, #4725 - fix preloading for old (0.xx) remote servers, #4652 - fix confusing output of borg extract --list --strip-components, #4934 - delete: after double-force delete, warn about necessary repair, #4704 - create: give invalid repo error msg if repo config not found, #4411 - mount: fix FUSE mount missing st_birthtime, #4763 #4767 - check: do not stumble over invalid item key, #4845 - info: if the archive doesn't exist, print a pretty message, #4793 - SecurityManager.known(): check all files, #4614 - Repository.open: use stat() to check for repo dir, #4695 - Repository.check_can_create_repository: use stat() to check, #4695 - fix invalid archive error message - fix optional/non-optional location arg, #4541 - commit-time free space calc: ignore bad compact map entries, #4796 - ignore EACCES (errno 13) when hardlinking the old config, #4730 - --prefix / -P: fix processing, avoid argparse issue, #4769 New features: - enable placeholder usage in all extra archive arguments - new BORG_WORKAROUNDS mechanism, basesyncfile, #4710 - recreate: support --timestamp option, #4745 - support platforms without os.link (e.g. Android with Termux), #4901. if we don't have os.link, we just extract another copy instead of making a hardlink. - support linux platforms without sync_file_range (e.g. Android 7 with Termux), #4905 Other: - ignore --stats when given with --dry-run, but continue, #4373 - add some ProgressIndicator msgids to code / fix docs, #4935 - elaborate on "Calculating size" message - argparser: always use REPOSITORY in metavar, also use more consistent help phrasing. - check: improve error output for matching index size, see #4829 - docs: - changelog: add advisory about hashindex_set bug #4829 - better describe BORG_SECURITY_DIR, BORG_CACHE_DIR, #4919 - infos about cache security assumptions, #4900 - add FAQ describing difference between a local repo vs. repo on a server. - document how to test exclusion patterns without performing an actual backup - timestamps in the files cache are now usually ctime, #4583 - fix bad reference to borg compact (does not exist in 1.1), #4660 - create: borg 1.1 is not future any more - extract: document limitation "needs empty destination", #4598 - how to supply a passphrase, use crypto devices, #4549 - fix osxfuse github link in installation docs - add example of exclude-norecurse rule in help patterns - update macOS Brew link - add note about software for automating backups, #4581 - AUTHORS: mention copyright+license for bundled msgpack - fix various code blocks in the docs, #4708 - updated docs to cover use of temp directory on remote, #4545 - add restore docs, #4670 - add a pull backup / push restore how-to, #1552 - add FAQ how to retain original paths, #4532 - explain difference between --exclude and --pattern, #4118 - add FAQs for SSH connection issues, #3866 - improve password FAQ, #4591 - reiterate that 'file cache names are absolute' in FAQ - tests: - cope with ANY error when importing pytest into borg.testsuite, #4652 - fix broken test that relied on improper zlib assumptions - test_fuse: filter out selinux xattrs, #4574 - travis / vagrant: - misc python versions removed / changed (due to openssl 1.1 compatibility) or added (3.7 and 3.8, for better borg compatibility testing) - binary building is on python 3.5.9 now - vagrant: - add new boxes: ubuntu 18.04 and 20.04, debian 10 - update boxes: openindiana, darwin, netbsd - remove old boxes: centos 6 - darwin: updated osxfuse to 3.10.4 - use debian/ubuntu pip/virtualenv packages - rather use python 3.6.2 than 3.6.0, fixes coverage/sqlite3 issue - use requirements.d/development.lock.txt to avoid compat issues - travis: - darwin: backport some install code / order from master - remove deprecated keyword "sudo" from travis config - allow osx builds to fail, #4955 this is due to travis-ci frequently being so slow that the OS X builds just fail because they exceed 50 minutes and get killed by travis. Version 1.1.10 (2019-05-16) --------------------------- Fixes: - extract: hang on partial extraction with ssh: repo, when hardlink master is not matched/extracted and borg hangs on related slave hardlink, #4350 - lrucache: regularly remove old FDs, #4427 - avoid stale filehandle issues, #3265 - freebsd: make xattr platform code api compatible with linux, #3952 - use whitelist approach for borg serve, #4097 - borg command shall terminate with rc 2 for ImportErrors, #4424 - create: only run stat_simple_attrs() once, this increases backup with lots of unchanged files performance by ~ 5%. - prune: fix incorrect borg prune --stats output with --dry-run, #4373 - key export: emit user-friendly error if repo key is exported to a directory, #4348 New features: - bundle latest supported msgpack-python release (0.5.6), remove msgpack-python from setup.py install_requires - by default we use the bundled code now. optionally, we still support using an external msgpack (see hints in setup.py), but this requires solid requirements management within distributions and is not recommended. borgbackup will break if you upgrade msgpack to an unsupported version. - display msgpack version as part of sysinfo (e.g. in tracebacks) - timestamp for borg delete --info added, #4359 - enable placeholder usage in --comment and --glob-archives, #4559, #4495 Other: - serve: do not check python/libc for borg serve, #4483 - shell completions: borg diff second archive - release scripts: signing binaries with Qubes OS support - testing: - vagrant: upgrade openbsd box to 6.4 - travis-ci: lock test env to py 3.4 compatible versions, #4343 - get rid of confusing coverage warning, #2069 - rename test_mount_hardlinks to test_fuse_mount_hardlinks, so both can be excluded by "not test_fuse". - pure-py msgpack warning shall not make a lot of tests fail, #4558 - docs: - add "SSH Configuration" section to "borg serve", #3988, #636, #4485 - README: new URL for funding options - add a sample logging.conf in docs/misc, #4380 - elaborate on append-only mode docs, #3504 - installation: added Alpine Linux to distribution list, #4415 - usage.html: only modify window.location when redirecting, #4133 - add msgpack license to docs/3rd_party/msgpack - vagrant / binary builds: - use python 3.5.7 for builds - use osxfuse 3.8.3 Version 1.1.9 (2019-02-10) -------------------------- Compatibility notes: - When upgrading from borg 1.0.x to 1.1.x, please note: - read all the compatibility notes for 1.1.0*, starting from 1.1.0b1. - borg upgrade: you do not need to and you also should not run it. - borg might ask some security-related questions once after upgrading. You can answer them either manually or via environment variable. One known case is if you use unencrypted repositories, then it will ask about a unknown unencrypted repository one time. - your first backup with 1.1.x might be significantly slower (it might completely read, chunk, hash a lot files) - this is due to the --files-cache mode change (and happens every time you change mode). You can avoid the one-time slowdown by using the pre-1.1.0rc4-compatible mode (but that is less safe for detecting changed files than the default). See the --files-cache docs for details. Fixes: - security fix: configure FUSE with "default_permissions", #3903 "default_permissions" is now enforced by borg by default to let the kernel check uid/gid/mode based permissions. "ignore_permissions" can be given not to enforce "default_permissions". - make "hostname" short, even on misconfigured systems, #4262 - fix free space calculation on macOS (and others?), #4289 - config: quit with error message when no key is provided, #4223 - recover_segment: handle too small segment files correctly, #4272 - correctly release memoryview, #4243 - avoid diaper pattern in configparser by opening files, #4263 - add "# cython: language_level=3" directive to .pyx files, #4214 - info: consider part files for "This archive" stats, #3522 - work around Microsoft WSL issue #645 (sync_file_range), #1961 New features: - add --rsh command line option to complement BORG_RSH env var, #1701 - init: --make-parent-dirs parent1/parent2/repo_dir, #4235 Other: - add archive name to check --repair output, #3447 - check for unsupported msgpack versions - shell completions: - new shell completions for borg 1.1.9 - more complete shell completions for borg mount -o - added shell completions for borg help - option arguments for zsh tab completion - docs: - add FAQ regarding free disk space check, #3905 - update BORG_PASSCOMMAND example and clarify variable expansion, #4249 - FAQ regarding change of compression settings, #4222 - add note about BSD flags to changelog, #4246 - improve logging in example automation script - add note about files changing during backup, #4081 - work around the backslash issue, #4280 - update release workflow using twine (docs, scripts), #4213 - add warnings on repository copies to avoid future problems, #4272 - tests: - fix the homebrew 1.9 issues on travis-ci, #4254 - fix duplicate test method name, #4311 Version 1.1.8 (2018-12-09) -------------------------- Fixes: - enforce storage quota if set by serve-command, #4093 - invalid locations: give err msg containing parsed location, #4179 - list repo: add placeholders for hostname and username, #4130 - on linux, symlinks can't have ACLs, so don't try to set any, #4044 New features: - create: added PATH::archive output on INFO log level - read a passphrase from a file descriptor specified in the BORG_PASSPHRASE_FD environment variable. Other: - docs: - option --format is required for some expensive-to-compute values for json borg list by default does not compute expensive values except when they are needed. whether they are needed is determined by the format, in standard mode as well as in --json mode. - tell that our binaries are x86/x64 amd/intel, bauerj has ARM - fixed wrong archive name pattern in CRUD benchmark help - fixed link to cachedir spec in docs, #4140 - tests: - stop using fakeroot on travis, avoids sporadic EISDIR errors, #2482 - xattr key names must start with "user." on linux - fix code so flake8 3.6 does not complain - explicitly convert environment variable to str, #4136 - fix DeprecationWarning: Flags not at the start of the expression, #4137 - support pytest4, #4172 - vagrant: - use python 3.5.6 for builds Version 1.1.7 (2018-08-11) -------------------------- Compatibility notes: - added support for Python 3.7 Fixes: - cache lock: use lock_wait everywhere to fix infinite wait, see #3968 - don't archive tagged dir when recursing an excluded dir, #3991 - py37 argparse: work around bad default in py 3.7.0a/b/rc, #3996 - py37 remove loggerDict.clear() from tearDown method, #3805 - some fixes for bugs which likely did not result in problems in practice: - fixed logic bug in platform module API version check - fixed xattr/acl function prototypes, added missing ones New features: - init: add warning to store both key and passphrase at safe place(s) - BORG_HOST_ID env var to work around all-zero MAC address issue, #3985 - borg debug dump-repo-objs --ghost (dump everything from segment files, including deleted or superseded objects or commit tags) - borg debug search-repo-objs (search in repo objects for hex bytes or strings) Other changes: - add Python 3.7 support - updated shell completions - call socket.gethostname only once - locking: better logging, add some asserts - borg debug dump-repo-objs: - filename layout improvements - use repository.scan() to get on-disk order - docs: - update installation instructions for macOS - added instructions to install fuse via homebrew - improve diff docs - added note that checkpoints inside files requires 1.1+ - add link to tempfile module - remove row/column-spanning from docs source, #4000 #3990 - tests: - fetch less data via os.urandom - add py37 env for tox - travis: add 3.7, remove 3.6-dev (we test with -dev in master) - vagrant / binary builds: - use osxfuse 3.8.2 - use own (uptodate) openindiana box Version 1.1.6 (2018-06-11) -------------------------- Compatibility notes: - 1.1.6 changes: - also allow msgpack-python 0.5.6. Fixes: - fix borg exception handling on ENOSPC error with xattrs, #3808 - prune: fix/improve overall progress display - borg config repo ... does not need cache/manifest/key, #3802 - debug dump-repo-objs should not depend on a manifest obj - pypi package: - include .coveragerc, needed by tox.ini - fix package long description, #3854 New features: - mount: add uid, gid, umask mount options - delete: - only commit once, #3823 - implement --dry-run, #3822 - check: - show progress while rebuilding missing manifest, #3787 - more --repair output - borg config --list , #3612 Other changes: - update msgpack requirement, #3753 - update bundled zstd to 1.3.4, #3745 - update bundled lz4 code to 1.8.2, #3870 - docs: - describe what BORG_LIBZSTD_PREFIX does - fix and deduplicate encryption quickstart docs, #3776 - vagrant: - FUSE for macOS: upgrade 3.7.1 to 3.8.0 - exclude macOS High Sierra upgrade on the darwin64 machine - remove borgbackup.egg-info dir in fs_init (after rsync) - use pyenv-based build/test on jessie32/62 - use local 32 and 64bit debian jessie boxes - use "vagrant" as username for new xenial box - travis OS X: use xcode 8.3 (not broken) Version 1.1.5 (2018-04-01) -------------------------- Compatibility notes: - 1.1.5 changes: - require msgpack-python >= 0.4.6 and < 0.5.0. 0.5.0+ dropped python 3.4 testing and also caused some other issues because the python package was renamed to msgpack and emitted some FutureWarning. Fixes: - create --list: fix that it was never showing M status, #3492 - create: fix timing for first checkpoint (read files cache early, init checkpoint timer after that), see #3394 - extract: set rc=1 when extracting damaged files with all-zero replacement chunks or with size inconsistencies, #3448 - diff: consider an empty file as different to a non-existing file, #3688 - files cache: improve exception handling, #3553 - ignore exceptions in scandir_inorder() caused by an implicit stat(), also remove unneeded sort, #3545 - fixed tab completion problem where a space is always added after path even when it shouldn't - build: do .h file content checks in binary mode, fixes build issue for non-ascii header files on pure-ascii locale platforms, #3544 #3639 - borgfs: fix patterns/paths processing, #3551 - config: add some validation, #3566 - repository config: add validation for max_segment_size, #3592 - set cache previous_location on load instead of save - remove platform.uname() call which caused library mismatch issues, #3732 - add exception handler around deprecated platform.linux_distribution() call - use same datetime object for {now} and {utcnow}, #3548 New features: - create: implement --stdin-name, #3533 - add chunker_params to borg archive info (--json) - BORG_SHOW_SYSINFO=no to hide system information from exceptions Other changes: - updated zsh completions for borg 1.1.4 - files cache related code cleanups - be more helpful when parsing invalid --pattern values, #3575 - be more clear in secure-erase warning message, #3591 - improve getpass user experience, #3689 - docs build: unicode problem fixed when using a py27-based sphinx - docs: - security: explicitly note what happens OUTSIDE the attack model - security: add note about combining compression and encryption - security: describe chunk size / proximity issue, #3687 - quickstart: add note about permissions, borg@localhost, #3452 - quickstart: add introduction to repositories & archives, #3620 - recreate --recompress: add missing metavar, clarify description, #3617 - improve logging docs, #3549 - add an example for --pattern usage, #3661 - clarify path semantics when matching, #3598 - link to offline documentation from README, #3502 - add docs on how to verify a signed release with GPG, #3634 - chunk seed is generated per repository (not: archive) - better formatting of CPU usage documentation, #3554 - extend append-only repo rollback docs, #3579 - tests: - fix erroneously skipped zstd compressor tests, #3606 - skip a test if argparse is broken, #3705 - vagrant: - xenial64 box now uses username 'vagrant', #3707 - move cleanup steps to fs_init, #3706 - the boxcutter wheezy boxes are 404, use local ones - update to Python 3.5.5 (for binary builds) Version 1.1.4 (2017-12-31) -------------------------- Compatibility notes: - When upgrading from borg 1.0.x to 1.1.x, please note: - read all the compatibility notes for 1.1.0*, starting from 1.1.0b1. - borg upgrade: you do not need to and you also should not run it. - borg might ask some security-related questions once after upgrading. You can answer them either manually or via environment variable. One known case is if you use unencrypted repositories, then it will ask about a unknown unencrypted repository one time. - your first backup with 1.1.x might be significantly slower (it might completely read, chunk, hash a lot files) - this is due to the --files-cache mode change (and happens every time you change mode). You can avoid the one-time slowdown by using the pre-1.1.0rc4-compatible mode (but that is less safe for detecting changed files than the default). See the --files-cache docs for details. - borg 1.1.4 changes: - zstd compression is new in borg 1.1.4, older borg can't handle it. - new minimum requirements for the compression libraries - if the required versions (header and lib) can't be found at build time, bundled code will be used: - added requirement: libzstd >= 1.3.0 (bundled: 1.3.2) - updated requirement: liblz4 >= 1.7.0 / r129 (bundled: 1.8.0) Fixes: - check: data corruption fix: fix for borg check --repair malfunction, #3444. See the more detailed notes close to the top of this document. - delete: also delete security dir when deleting a repo, #3427 - prune: fix building the "borg prune" man page, #3398 - init: use given --storage-quota for local repo, #3470 - init: properly quote repo path in output - fix startup delay with dns-only own fqdn resolving, #3471 New features: - added zstd compression. try it! - added placeholder {reverse-fqdn} for fqdn in reverse notation - added BORG_BASE_DIR environment variable, #3338 Other changes: - list help topics when invalid topic is requested - fix lz4 deprecation warning, requires lz4 >= 1.7.0 (r129) - add parens for C preprocessor macro argument usages (did not cause malfunction) - exclude broken pytest 3.3.0 release - updated fish/bash completions - init: more clear exception messages for borg create, #3465 - docs: - add auto-generated docs for borg config - don't generate HTML docs page for borgfs, #3404 - docs update for lz4 b2 zstd changes - add zstd to compression help, readme, docs - update requirements and install docs about bundled lz4 and zstd - refactored build of the compress and crypto.low_level extensions, #3415: - move some lib/build related code to setup_{zstd,lz4,b2}.py - bundle lz4 1.8.0 (requirement: >= 1.7.0 / r129) - bundle zstd 1.3.2 (requirement: >= 1.3.0) - blake2 was already bundled - rename BORG_LZ4_PREFIX env var to BORG_LIBLZ4_PREFIX for better consistency: we also have BORG_LIBB2_PREFIX and BORG_LIBZSTD_PREFIX now. - add prefer_system_lib* = True settings to setup.py - by default the build will prefer a shared library over the bundled code, if library and headers can be found and meet the minimum requirements. Version 1.1.3 (2017-11-27) -------------------------- Fixes: - Security Fix for CVE-2017-15914: Incorrect implementation of access controls allows remote users to override repository restrictions in Borg servers. A user able to access a remote Borg SSH server is able to circumvent access controls post-authentication. Affected releases: 1.1.0, 1.1.1, 1.1.2. Releases 1.0.x are NOT affected. - crc32: deal with unaligned buffer, add tests - this broke borg on older ARM CPUs that can not deal with unaligned 32bit memory accesses and raise a bus error in such cases. the fix might also improve performance on some CPUs as all 32bit memory accesses by the crc32 code are properly aligned now. #3317 - mount: fixed support of --consider-part-files and do not show .borg_part_N files by default in the mounted FUSE filesystem. #3347 - fixed cache/repo timestamp inconsistency message, highlight that information is obtained from security dir (deleting the cache will not bypass this error in case the user knows this is a legitimate repo). - borgfs: don't show sub-command in borgfs help, #3287 - create: show an error when --dry-run and --stats are used together, #3298 New features: - mount: added exclusion group options and paths, #2138 Reused some code to support similar options/paths as borg extract offers - making good use of these to mount only a smaller subset of dirs/files can speed up mounting a lot and also will consume way less memory. borg mount [options] repo_or_archive mountpoint path [paths...] paths: you can just give some "root paths" (like for borg extract) to only partially populate the FUSE filesystem. new options: --exclude[-from], --pattern[s-from], --strip-components - create/extract: support st_birthtime on platforms supporting it, #3272 - add "borg config" command for querying/setting/deleting config values, #3304 Other changes: - clean up and simplify packaging (only package committed files, do not install .c/.h/.pyx files) - docs: - point out tuning options for borg create, #3239 - add instructions for using ntfsclone, zerofree, #81 - move image backup-related FAQ entries to a new page - clarify key aliases for borg list --format, #3111 - mention break-lock in checkpointing FAQ entry, #3328 - document sshfs rename workaround, #3315 - add FAQ about removing files from existing archives - add FAQ about different prune policies - usage and man page for borgfs, #3216 - clarify create --stats duration vs. wall time, #3301 - clarify encrypted key format for borg key export, #3296 - update release checklist about security fixes - document good and problematic option placements, fix examples, #3356 - add note about using --nobsdflags to avoid speed penalty related to bsdflags, #3239 - move most of support section to www.borgbackup.org Version 1.1.2 (2017-11-05) -------------------------- Fixes: - fix KeyError crash when talking to borg server < 1.0.7, #3244 - extract: set bsdflags last (include immutable flag), #3263 - create: don't do stat() call on excluded-norecurse directory, fix exception handling for stat() call, #3209 - create --stats: do not count data volume twice when checkpointing, #3224 - recreate: move chunks_healthy when excluding hardlink master, #3228 - recreate: get rid of chunks_healthy when rechunking (does not match), #3218 - check: get rid of already existing not matching chunks_healthy metadata, #3218 - list: fix stdout broken pipe handling, #3245 - list/diff: remove tag-file options (not used), #3226 New features: - bash, zsh and fish shell auto-completions, see scripts/shell_completions/ - added BORG_CONFIG_DIR env var, #3083 Other changes: - docs: - clarify using a blank passphrase in keyfile mode - mention "!" (exclude-norecurse) type in "patterns" help - document to first heal before running borg recreate to re-chunk stuff, because that will have to get rid of chunks_healthy metadata. - more than 23 is not supported for CHUNK_MAX_EXP, #3115 - borg does not respect nodump flag by default any more - clarify same-filesystem requirement for borg upgrade, #2083 - update / rephrase cygwin / WSL status, #3174 - improve docs about --stats, #3260 - vagrant: openindiana new clang package Already contained in 1.1.1 (last minute fix): - arg parsing: fix fallback function, refactor, #3205. This is a fixup for #3155, which was broken on at least python <= 3.4.2. Version 1.1.1 (2017-10-22) -------------------------- Compatibility notes: - The deprecated --no-files-cache is not a global/common option any more, but only available for borg create (it is not needed for anything else). Use --files-cache=disabled instead of --no-files-cache. - The nodump flag ("do not back up this file") is not honoured any more by default because this functionality (esp. if it happened by error or unexpected) was rather confusing and unexplainable at first to users. If you want that "do not back up NODUMP-flagged files" behaviour, use: borg create --exclude-nodump ... - If you are on Linux and do not need bsdflags archived, consider using ``--nobsdflags`` with ``borg create`` to avoid additional syscalls and speed up backup creation. Fixes: - borg recreate: correctly compute part file sizes. fixes cosmetic, but annoying issue as borg check complains about size inconsistencies of part files in affected archives. you can solve that by running borg recreate on these archives, see also #3157. - bsdflags support: do not open BLK/CHR/LNK files, avoid crashes and slowness, #3130 - recreate: don't crash on attic archives w/o time_end, #3109 - don't crash on repository filesystems w/o hardlink support, #3107 - don't crash in first part of truncate_and_unlink, #3117 - fix server-side IndexError crash with clients < 1.0.7, #3192 - don't show traceback if only a global option is given, show help, #3142 - cache: use SaveFile for more safety, #3158 - init: fix wrong encryption choices in command line parser, fix missing "authenticated-blake2", #3103 - move --no-files-cache from common to borg create options, #3146 - fix detection of non-local path (failed on ..filename), #3108 - logging with fileConfig: set json attr on "borg" logger, #3114 - fix crash with relative BORG_KEY_FILE, #3197 - show excluded dir with "x" for tagged dirs / caches, #3189 New features: - create: --nobsdflags and --exclude-nodump options, #3160 - extract: --nobsdflags option, #3160 Other changes: - remove annoying hardlinked symlinks warning, #3175 - vagrant: use self-made FreeBSD 10.3 box, #3022 - travis: don't brew update, hopefully fixes #2532 - docs: - readme: -e option is required in borg 1.1 - add example showing --show-version --show-rc - use --format rather than --list-format (deprecated) in example - update docs about hardlinked symlinks limitation Version 1.1.0 (2017-10-07) -------------------------- Compatibility notes: - borg command line: do not put options in between positional arguments This sometimes works (e.g. it worked in borg 1.0.x), but can easily stop working if we make positional arguments optional (like it happened for borg create's "paths" argument in 1.1). There are also places in borg 1.0 where we do that, so it doesn't work there in general either. #3356 Good: borg create -v --stats repo::archive path Good: borg create repo::archive path -v --stats Bad: borg create repo::archive -v --stats path Fixes: - fix LD_LIBRARY_PATH restoration for subprocesses, #3077 - "auto" compression: make sure expensive compression is actually better, otherwise store lz4 compressed data we already computed. Other changes: - docs: - FAQ: we do not implement futile attempts of ETA / progress displays - manpage: fix typos, update homepage - implement simple "issue" role for manpage generation, #3075 Version 1.1.0rc4 (2017-10-01) ----------------------------- Compatibility notes: - A borg server >= 1.1.0rc4 does not support borg clients 1.1.0b3-b5. #3033 - The files cache is now controlled differently and has a new default mode: - the files cache now uses ctime by default for improved file change detection safety. You can still use mtime for more speed and less safety. - --ignore-inode is deprecated (use --files-cache=... without "inode") - --no-files-cache is deprecated (use --files-cache=disabled) New features: - --files-cache - implement files cache mode control, #911 You can now control the files cache mode using this option: --files-cache={ctime,mtime,size,inode,rechunk,disabled} (only some combinations are supported). See the docs for details. Fixes: - remote progress/logging: deal with partial lines, #2637 - remote progress: flush json mode output - fix subprocess environments, #3050 (and more) Other changes: - remove client_supports_log_v3 flag, #3033 - exclude broken Cython 0.27(.0) in requirements, #3066 - vagrant: - upgrade to FUSE for macOS 3.7.1 - use Python 3.5.4 to build the binaries - docs: - security: change-passphrase only changes the passphrase, #2990 - fixed/improved borg create --compression examples, #3034 - add note about metadata dedup and --no[ac]time, #2518 - twitter account @borgbackup now, better visible, #2948 - simplified rate limiting wrapper in FAQ Version 1.1.0rc3 (2017-09-10) ----------------------------- New features: - delete: support naming multiple archives, #2958 Fixes: - repo cleanup/write: invalidate cached FDs, #2982 - fix datetime.isoformat() microseconds issues, #2994 - recover_segment: use mmap(), lower memory needs, #2987 Other changes: - with-lock: close segment file before invoking subprocess - keymanager: don't depend on optional readline module, #2976 - docs: - fix macOS keychain integration command - show/link new screencasts in README, #2936 - document utf-8 locale requirement for json mode, #2273 - vagrant: clean up shell profile init, user name, #2977 - test_detect_attic_repo: don't test mount, #2975 - add debug logging for repository cleanup Version 1.1.0rc2 (2017-08-28) ----------------------------- Compatibility notes: - list: corrected mix-up of "isomtime" and "mtime" formats. Previously, "isomtime" was the default but produced a verbose human format, while "mtime" produced a ISO-8601-like format. The behaviours have been swapped (so "mtime" is human, "isomtime" is ISO-like), and the default is now "mtime". "isomtime" is now a real ISO-8601 format ("T" between date and time, not a space). New features: - None. Fixes: - list: fix weird mixup of mtime/isomtime - create --timestamp: set start time, #2957 - ignore corrupt files cache, #2939 - migrate locks to child PID when daemonize is used - fix exitcode of borg serve, #2910 - only compare contents when chunker params match, #2899 - umount: try fusermount, then try umount, #2863 Other changes: - JSON: use a more standard ISO 8601 datetime format, #2376 - cache: write_archive_index: truncate_and_unlink on error, #2628 - detect non-upgraded Attic repositories, #1933 - delete various nogil and threading related lines - coala / pylint related improvements - docs: - renew asciinema/screencasts, #669 - create: document exclusion through nodump, #2949 - minor formatting fixes - tar: tarpipe example - improve "with-lock" and "info" docs, #2869 - detail how to use macOS/GNOME/KDE keyrings for repo passwords, #392 - travis: only short-circuit docs-only changes for pull requests - vagrant: - netbsd: bash is already installed - fix netbsd version in PKG_PATH - add exe location to PATH when we build an exe Version 1.1.0rc1 (2017-07-24) ----------------------------- Compatibility notes: - delete: removed short option for --cache-only New features: - support borg list repo --format {comment} {bcomment} {end}, #2081 - key import: allow reading from stdin, #2760 Fixes: - with-lock: avoid creating segment files that might be overwritten later, #1867 - prune: fix checkpoints processing with --glob-archives - FUSE: versions view: keep original file extension at end, #2769 - fix --last, --first: do not accept values <= 0, fix reversed archive ordering with --last - include testsuite data (attic.tar.gz) when installing the package - use limited unpacker for outer key, for manifest (both security precautions), #2174 #2175 - fix bashism in shell scripts, #2820, #2816 - cleanup endianness detection, create _endian.h, fixes build on alpine linux, #2809 - fix crash with --no-cache-sync (give known chunk size to chunk_incref), #2853 Other changes: - FUSE: versions view: linear numbering by archive time - split up interval parsing from filtering for --keep-within, #2610 - add a basic .editorconfig, #2734 - use archive creation time as mtime for FUSE mount, #2834 - upgrade FUSE for macOS (osxfuse) from 3.5.8 to 3.6.3, #2706 - hashindex: speed up by replacing modulo with "if" to check for wraparound - coala checker / pylint: fixed requirements and .coafile, more ignores - borg upgrade: name backup directories as 'before-upgrade', #2811 - add .mailmap - some minor changes suggested by lgtm.com - docs: - better explanation of the --ignore-inode option relevance, #2800 - fix openSUSE command and add openSUSE section - simplify ssh authorized_keys file using "restrict", add legacy note, #2121 - mount: show usage of archive filters - mount: add repository example, #2462 - info: update and add examples, #2765 - prune: include example - improved style / formatting - improved/fixed segments_per_dir docs - recreate: fix wrong "remove unwanted files" example - reference list of status chars in borg recreate --filter description - update source-install docs about doc build dependencies, #2795 - cleanup installation docs - file system requirements, update segs per dir - fix checkpoints/parts reference in FAQ, #2859 - code: - hashindex: don't pass side effect into macro - crypto low_level: don't mutate local bytes() - use dash_open function to open file or "-" for stdin/stdout - archiver: argparse cleanup / refactoring - shellpattern: add match_end arg - tests: added some additional unit tests, some fixes, #2700 #2710 - vagrant: fix setup of cygwin, add Debian 9 "stretch" - travis: don't perform full travis build on docs-only changes, #2531 Version 1.1.0b6 (2017-06-18) ---------------------------- Compatibility notes: - Running "borg init" via a "borg serve --append-only" server will *not* create an append-only repository anymore. Use "borg init --append-only" to initialize an append-only repository. - Repositories in the "repokey" and "repokey-blake2" modes with an empty passphrase are now treated as unencrypted repositories for security checks (e.g. BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK). Previously there would be no prompts nor messages if an unknown repository in one of these modes with an empty passphrase was encountered. This would allow an attacker to swap a repository, if one assumed that the lack of password prompts was due to a set BORG_PASSPHRASE. Since the "trick" does not work if BORG_PASSPHRASE is set, this does generally not affect scripts. - Repositories in the "authenticated" mode are now treated as the unencrypted repositories they are. - The client-side temporary repository cache now holds unencrypted data for better speed. - borg init: removed the short form of --append-only (-a). - borg upgrade: removed the short form of --inplace (-i). New features: - reimplemented the RepositoryCache, size-limited caching of decrypted repo contents, integrity checked via xxh64. #2515 - reduced space usage of chunks.archive.d. Existing caches are migrated during a cache sync. #235 #2638 - integrity checking using xxh64 for important files used by borg, #1101: - repository: index and hints files - cache: chunks and files caches, chunks.archive.d - improve cache sync speed, #1729 - create: new --no-cache-sync option - add repository mandatory feature flags infrastructure, #1806 - Verify most operations against SecurityManager. Location, manifest timestamp and key types are now checked for almost all non-debug commands. #2487 - implement storage quotas, #2517 - serve: add --restrict-to-repository, #2589 - BORG_PASSCOMMAND: use external tool providing the key passphrase, #2573 - borg export-tar, #2519 - list: --json-lines instead of --json for archive contents, #2439 - add --debug-profile option (and also "borg debug convert-profile"), #2473 - implement --glob-archives/-a, #2448 - normalize authenticated key modes for better naming consistency: - rename "authenticated" to "authenticated-blake2" (uses blake2b) - implement "authenticated" mode (uses hmac-sha256) Fixes: - hashindex: read/write indices >2 GiB on 32bit systems, better error reporting, #2496 - repository URLs: implement IPv6 address support and also more informative error message when parsing fails. - mount: check whether llfuse is installed before asking for passphrase, #2540 - mount: do pre-mount checks before opening repository, #2541 - FUSE: - fix crash if empty (None) xattr is read, #2534 - fix read(2) caching data in metadata cache - fix negative uid/gid crash (fix crash when mounting archives of external drives made on cygwin), #2674 - redo ItemCache, on top of object cache - use decrypted cache - remove unnecessary normpaths - serve: ignore --append-only when initializing a repository (borg init), #2501 - serve: fix incorrect type of exception_short for Errors, #2513 - fix --exclude and --exclude-from recursing into directories, #2469 - init: don't allow creating nested repositories, #2563 - --json: fix encryption[mode] not being the cmdline name - remote: propagate Error.traceback correctly - fix remote logging and progress, #2241 - implement --debug-topic for remote servers - remote: restore "Remote:" prefix (as used in 1.0.x) - rpc negotiate: enable v3 log protocol only for supported clients - fix --progress and logging in general for remote - fix parse_version, add tests, #2556 - repository: truncate segments (and also some other files) before unlinking, #2557 - recreate: keep timestamps as in original archive, #2384 - recreate: if single archive is not processed, exit 2 - patterns: don't recurse with ! / --exclude for pf:, #2509 - cache sync: fix n^2 behaviour in lookup_name - extract: don't write to disk with --stdout (affected non-regular-file items), #2645 - hashindex: implement KeyError, more tests Other changes: - remote: show path in PathNotAllowed - consider repokey w/o passphrase == unencrypted, #2169 - consider authenticated mode == unencrypted, #2503 - restrict key file names, #2560 - document follow_symlinks requirements, check libc, use stat and chown with follow_symlinks=False, #2507 - support common options on the main command, #2508 - support common options on mid-level commands (e.g. borg *key* export) - make --progress a common option - increase DEFAULT_SEGMENTS_PER_DIR to 1000 - chunker: fix invalid use of types (function only used by tests) - chunker: don't do uint32_t >> 32 - FUSE: - add instrumentation (--debug and SIGUSR1/SIGINFO) - reduced memory usage for repository mounts by lazily instantiating archives - improved archive load times - info: use CacheSynchronizer & HashIndex.stats_against (better performance) - docs: - init: document --encryption as required - security: OpenSSL usage - security: used implementations; note python libraries - security: security track record of OpenSSL and msgpack - patterns: document denial of service (regex, wildcards) - init: note possible denial of service with "none" mode - init: document SHA extension is supported in OpenSSL and thus SHA is faster on AMD Ryzen than blake2b. - book: use A4 format, new builder option format. - book: create appendices - data structures: explain repository compaction - data structures: add chunk layout diagram - data structures: integrity checking - data structures: demingle cache and repo index - Attic FAQ: separate section for attic stuff - FAQ: I get an IntegrityError or similar - what now? - FAQ: Can I use Borg on SMR hard drives?, #2252 - FAQ: specify "using inline shell scripts" - add systemd warning regarding placeholders, #2543 - xattr: document API - add docs/misc/borg-data-flow data flow chart - debugging facilities - README: how to help the project, #2550 - README: add bountysource badge, #2558 - fresh new theme + tweaking - logo: vectorized (PDF and SVG) versions - frontends: use headlines - you can link to them - mark --pattern, --patterns-from as experimental - highlight experimental features in online docs - remove regex based pattern examples, #2458 - nanorst for "borg help TOPIC" and --help - split deployment - deployment: hosting repositories - deployment: automated backups to a local hard drive - development: vagrant, windows10 requirements - development: update docs remarks - split usage docs, #2627 - usage: avoid bash highlight, [options] instead of - usage: add benchmark page - helpers: truncate_and_unlink doc - don't suggest to leak BORG_PASSPHRASE - internals: columnize rather long ToC [webkit fixup] internals: manifest & feature flags - internals: more HashIndex details - internals: fix ASCII art equations - internals: edited obj graph related sections a bit - internals: layers image + description - fix way too small figures in pdf - index: disable syntax highlight (bash) - improve options formatting, fix accidental block quotes - testing / checking: - add support for using coala, #1366 - testsuite: add ArchiverCorruptionTestCase - do not test logger name, #2504 - call setup_logging after destroying logging config - testsuite.archiver: normalise pytest.raises vs. assert_raises - add test for preserved intermediate folder permissions, #2477 - key: add round-trip test - remove attic dependency of the tests, #2505 - enable remote tests on cygwin - tests: suppress tar's future timestamp warning - cache sync: add more refcount tests - repository: add tests, including corruption tests - vagrant: - control VM cpus and pytest workers via env vars VMCPUS and XDISTN - update cleaning workdir - fix openbsd shell - add OpenIndiana - packaging: - binaries: don't bundle libssl - setup.py clean to remove compiled files - fail in borg package if version metadata is very broken (setuptools_scm) - repo / code structure: - create borg.algorithms and borg.crypto packages - algorithms: rename crc32 to checksums - move patterns to module, #2469 - gitignore: complete paths for src/ excludes - cache: extract CacheConfig class - implement IntegrityCheckedFile + Detached variant, #2502 #1688 - introduce popen_with_error_handling to handle common user errors Version 1.1.0b5 (2017-04-30) ---------------------------- Compatibility notes: - BORG_HOSTNAME_IS_UNIQUE is now on by default. - removed --compression-from feature - recreate: add --recompress flag, unify --always-recompress and --recompress Fixes: - catch exception for os.link when hardlinks are not supported, #2405 - borg rename / recreate: expand placeholders, #2386 - generic support for hardlinks (files, devices, FIFOs), #2324 - extract: also create parent dir for device files, if needed, #2358 - extract: if a hardlink master is not in the to-be-extracted subset, the "x" status was not displayed for it, #2351 - embrace y2038 issue to support 32bit platforms: clamp timestamps to int32, #2347 - verify_data: fix IntegrityError handling for defect chunks, #2442 - allow excluding parent and including child, #2314 Other changes: - refactor compression decision stuff - change global compression default to lz4 as well, to be consistent with --compression defaults. - placeholders: deny access to internals and other unspecified stuff - clearer error message for unrecognized placeholder - more clear exception if borg check does not help, #2427 - vagrant: upgrade FUSE for macOS to 3.5.8, #2346 - linux binary builds: get rid of glibc 2.13 dependency, #2430 - docs: - placeholders: document escaping - serve: env vars in original commands are ignored - tell what kind of hardlinks we support - more docs about compression - LICENSE: use canonical formulation ("copyright holders and contributors" instead of "author") - document borg init behaviour via append-only borg serve, #2440 - be clear about what buzhash is used for, #2390 - add hint about chunker params, #2421 - clarify borg upgrade docs, #2436 - FAQ to explain warning when running borg check --repair, #2341 - repository file system requirements, #2080 - pre-install considerations - misc. formatting / crossref fixes - tests: - enhance travis setuptools_scm situation - add extra test for the hashindex - fix invalid param issue in benchmarks These belong to 1.1.0b4 release, but did not make it into changelog by then: - vagrant: increase memory for parallel testing - lz4 compress: lower max. buffer size, exception handling - add docstring to do_benchmark_crud - patterns help: mention path full-match in intro Version 1.1.0b4 (2017-03-27) ---------------------------- Compatibility notes: - init: the --encryption argument is mandatory now (there are several choices) - moved "borg migrate-to-repokey" to "borg key migrate-to-repokey". - "borg change-passphrase" is deprecated, use "borg key change-passphrase" instead. - the --exclude-if-present option now supports tagging a folder with any filesystem object type (file, folder, etc), instead of expecting only files as tags, #1999 - the --keep-tag-files option has been deprecated in favor of the new --keep-exclude-tags, to account for the change mentioned above. - use lz4 compression by default, #2179 New features: - JSON API to make developing frontends and automation easier (see :ref:`json_output`) - add JSON output to commands: `borg create/list/info --json ...`. - add --log-json option for structured logging output. - add JSON progress information, JSON support for confirmations (yes()). - add two new options --pattern and --patterns-from as discussed in #1406 - new path full match pattern style (pf:) for very fast matching, #2334 - add 'debug dump-manifest' and 'debug dump-archive' commands - add 'borg benchmark crud' command, #1788 - new 'borg delete --force --force' to delete severely corrupted archives, #1975 - info: show utilization of maximum archive size, #1452 - list: add dsize and dcsize keys, #2164 - paperkey.html: Add interactive html template for printing key backups. - key export: add qr html export mode - securely erase config file (which might have old encryption key), #2257 - archived file items: add size to metadata, 'borg extract' and 'borg check' do check the file size for consistency, FUSE uses precomputed size from Item. Fixes: - fix remote speed regression introduced in 1.1.0b3, #2185 - fix regression handling timestamps beyond 2262 (revert bigint removal), introduced in 1.1.0b3, #2321 - clamp (nano)second values to unproblematic range, #2304 - hashindex: rebuild hashtable if we have too little empty buckets (performance fix), #2246 - Location regex: fix bad parsing of wrong syntax - ignore posix_fadvise errors in repository.py, #2095 - borg rpc: use limited msgpack.Unpacker (security precaution), #2139 - Manifest: Make sure manifest timestamp is strictly monotonically increasing. - create: handle BackupOSError on a per-path level in one spot - create: clarify -x option / meaning of "same filesystem" - create: don't create hard link refs to failed files - archive check: detect and fix missing all-zero replacement chunks, #2180 - files cache: update inode number when --ignore-inode is used, #2226 - fix decompression exceptions crashing ``check --verify-data`` and others instead of reporting integrity error, #2224 #2221 - extract: warning for unextracted big extended attributes, #2258, #2161 - mount: umount on SIGINT/^C when in foreground - mount: handle invalid hard link refs - mount: fix huge RAM consumption when mounting a repository (saves number of archives * 8 MiB), #2308 - hashindex: detect mingw byte order #2073 - hashindex: fix wrong skip_hint on hashindex_set when encountering tombstones, the regression was introduced in #1748 - fix ChunkIndex.__contains__ assertion for big-endian archs - fix borg key/debug/benchmark crashing without subcommand, #2240 - Location: accept //servername/share/path - correct/refactor calculation of unique/non-unique chunks - extract: fix missing call to ProgressIndicator.finish - prune: fix error msg, it is --keep-within, not --within - fix "auto" compression mode bug (not compressing), #2331 - fix symlink item fs size computation, #2344 Other changes: - remote repository: improved async exception processing, #2255 #2225 - with --compression auto,C, only use C if lz4 achieves at least 3% compression - PatternMatcher: only normalize path once, #2338 - hashindex: separate endian-dependent defs from endian detection - migrate-to-repokey: ask using canonical_path() as we do everywhere else. - SyncFile: fix use of fd object after close - make LoggedIO.close_segment reentrant - creating a new segment: use "xb" mode, #2099 - redo key_creator, key_factory, centralise key knowledge, #2272 - add return code functions, #2199 - list: only load cache if needed - list: files->items, clarifications - list: add "name" key for consistency with info cmd - ArchiveFormatter: add "start" key for compatibility with "info" - RemoteRepository: account rx/tx bytes - setup.py build_usage/build_man/build_api fixes - Manifest.in: simplify, exclude .so, .dll and .orig, #2066 - FUSE: get rid of chunk accounting, st_blocks = ceil(size / blocksize). - tests: - help python development by testing 3.6-dev - test for borg delete --force - vagrant: - freebsd: some fixes, #2067 - darwin64: use osxfuse 3.5.4 for tests / to build binaries - darwin64: improve VM settings - use python 3.5.3 to build binaries, #2078 - upgrade pyinstaller from 3.1.1+ to 3.2.1 - pyinstaller: use fixed AND freshly compiled bootloader, #2002 - pyinstaller: automatically builds bootloader if missing - docs: - create really nice man pages - faq: mention --remote-ratelimit in bandwidth limit question - fix caskroom link, #2299 - docs/security: reiterate that RPC in Borg does no networking - docs/security: counter tracking, #2266 - docs/development: update merge remarks - address SSH batch mode in docs, #2202 #2270 - add warning about running build_usage on Python >3.4, #2123 - one link per distro in the installation page - improve --exclude-if-present and --keep-exclude-tags, #2268 - improve automated backup script in doc, #2214 - improve remote-path description - update docs for create -C default change (lz4) - document relative path usage, #1868 - document snapshot usage, #2178 - corrected some stuff in internals+security - internals: move toctree to after the introduction text - clarify metadata kind, manifest ops - key enc: correct / clarify some stuff, link to internals/security - datas: enc: 1.1.x mas different MACs - datas: enc: correct factual error -- no nonce involved there. - make internals.rst an index page and edit it a bit - add "Cryptography in Borg" and "Remote RPC protocol security" sections - document BORG_HOSTNAME_IS_UNIQUE, #2087 - FAQ by categories as proposed by @anarcat in #1802 - FAQ: update Which file types, attributes, etc. are *not* preserved? - development: new branching model for git repository - development: define "ours" merge strategy for auto-generated files - create: move --exclude note to main doc - create: move item flags to main doc - fix examples using borg init without -e/--encryption - list: don't print key listings in fat (html + man) - remove Python API docs (were very incomplete, build problems on RTFD) - added FAQ section about backing up root partition Version 1.1.0b3 (2017-01-15) ---------------------------- Compatibility notes: - borg init: removed the default of "--encryption/-e", #1979 This was done so users do a informed decision about -e mode. Bug fixes: - borg recreate: don't rechunkify unless explicitly told so - borg info: fixed bug when called without arguments, #1914 - borg init: fix free space check crashing if disk is full, #1821 - borg debug delete/get obj: fix wrong reference to exception - fix processing of remote ~/ and ~user/ paths (regressed since 1.1.0b1), #1759 - posix platform module: only build / import on non-win32 platforms, #2041 New features: - new CRC32 implementations that are much faster than the zlib one used previously, #1970 - add blake2b key modes (use blake2b as MAC). This links against system libb2, if possible, otherwise uses bundled code - automatically remove stale locks - set BORG_HOSTNAME_IS_UNIQUE env var to enable stale lock killing. If set, stale locks in both cache and repository are deleted. #562 #1253 - borg info : print general repo information, #1680 - borg check --first / --last / --sort / --prefix, #1663 - borg mount --first / --last / --sort / --prefix, #1542 - implement "health" item formatter key, #1749 - BORG_SECURITY_DIR to remember security related infos outside the cache. Key type, location and manifest timestamp checks now survive cache deletion. This also means that you can now delete your cache and avoid previous warnings, since Borg can still tell it's safe. - implement BORG_NEW_PASSPHRASE, #1768 Other changes: - borg recreate: - remove special-cased --dry-run - update --help - remove bloat: interruption blah, autocommit blah, resuming blah - re-use existing checkpoint functionality - archiver tests: add check_cache tool - lints refcounts - fixed cache sync performance regression from 1.1.0b1 onwards, #1940 - syncing the cache without chunks.archive.d (see :ref:`disable_archive_chunks`) now avoids any merges and is thus faster, #1940 - borg check --verify-data: faster due to linear on-disk-order scan - borg debug-xxx commands removed, we use "debug xxx" subcommands now, #1627 - improve metadata handling speed - shortcut hashindex_set by having hashindex_lookup hint about address - improve / add progress displays, #1721 - check for index vs. segment files object count mismatch - make RPC protocol more extensible: use named parameters. - RemoteRepository: misc. code cleanups / refactors - clarify cache/repository README file - docs: - quickstart: add a comment about other (remote) filesystems - quickstart: only give one possible ssh url syntax, all others are documented in usage chapter. - mention file:// - document repo URLs / archive location - clarify borg diff help, #980 - deployment: synthesize alternative --restrict-to-path example - improve cache / index docs, esp. files cache docs, #1825 - document using "git merge 1.0-maint -s recursive -X rename-threshold=20%" for avoiding troubles when merging the 1.0-maint branch into master. - tests: - FUSE tests: catch ENOTSUP on freebsd - FUSE tests: test troublesome xattrs last - fix byte range error in test, #1740 - use monkeypatch to set env vars, but only on pytest based tests. - point XDG_*_HOME to temp dirs for tests, #1714 - remove all BORG_* env vars from the outer environment Version 1.1.0b2 (2016-10-01) ---------------------------- Bug fixes: - fix incorrect preservation of delete tags, leading to "object count mismatch" on borg check, #1598. This only occurred with 1.1.0b1 (not with 1.0.x) and is normally fixed by running another borg create/delete/prune. - fix broken --progress for double-cell paths (e.g. CJK), #1624 - borg recreate: also catch SIGHUP - FUSE: - fix hardlinks in versions view, #1599 - add parameter check to ItemCache.get to make potential failures more clear New features: - Archiver, RemoteRepository: add --remote-ratelimit (send data) - borg help compression, #1582 - borg check: delete chunks with integrity errors, #1575, so they can be "repaired" immediately and maybe healed later. - archives filters concept (refactoring/unifying older code) - covers --first/--last/--prefix/--sort-by options - currently used for borg list/info/delete Other changes: - borg check --verify-data slightly tuned (use get_many()) - change {utcnow} and {now} to ISO-8601 format ("T" date/time separator) - repo check: log transaction IDs, improve object count mismatch diagnostic - Vagrantfile: use TW's fresh-bootloader pyinstaller branch - fix module names in api.rst - hashindex: bump api_version Version 1.1.0b1 (2016-08-28) ---------------------------- New features: - new commands: - borg recreate: re-create existing archives, #787 #686 #630 #70, also see #757, #770. - selectively remove files/dirs from old archives - re-compress data - re-chunkify data, e.g. to have upgraded Attic / Borg 0.xx archives deduplicate with Borg 1.x archives or to experiment with chunker-params. - borg diff: show differences between archives - borg with-lock: execute a command with the repository locked, #990 - borg create: - Flexible compression with pattern matching on path/filename, and LZ4 heuristic for deciding compressibility, #810, #1007 - visit files in inode order (better speed, esp. for large directories and rotating disks) - in-file checkpoints, #1217 - increased default checkpoint interval to 30 minutes (was 5 minutes), #896 - added uuid archive format tag, #1151 - save mountpoint directories with --one-file-system, makes system restore easier, #1033 - Linux: added support for some BSD flags, #1050 - add 'x' status for excluded paths, #814 - also means files excluded via UF_NODUMP, #1080 - borg check: - will not produce the "Checking segments" output unless new --progress option is passed, #824. - --verify-data to verify data cryptographically on the client, #975 - borg list, #751, #1179 - removed {formatkeys}, see "borg list --help" - --list-format is deprecated, use --format instead - --format now also applies to listing archives, not only archive contents, #1179 - now supports the usual [PATH [PATHS…]] syntax and excludes - new keys: csize, num_chunks, unique_chunks, NUL - supports guaranteed_available hashlib hashes (to avoid varying functionality depending on environment), which includes the SHA1 and SHA2 family as well as MD5 - borg prune: - to visualize the "thinning out" better, we now list all archives in reverse time order. rephrase and reorder help text. - implement --keep-last N via --keep-secondly N, also --keep-minutely. assuming that there is not more than 1 backup archive made in 1s, --keep-last N and --keep-secondly N are equivalent, #537 - cleanup checkpoints except the latest, #1008 - borg extract: - added --progress, #1449 - Linux: limited support for BSD flags, #1050 - borg info: - output is now more similar to borg create --stats, #977 - borg mount: - provide "borgfs" wrapper for borg mount, enables usage via fstab, #743 - "versions" mount option - when used with a repository mount, this gives a merged, versioned view of the files in all archives, #729 - repository: - added progress information to commit/compaction phase (often takes some time when deleting/pruning), #1519 - automatic recovery for some forms of repository inconsistency, #858 - check free space before going forward with a commit, #1336 - improved write performance (esp. for rotating media), #985 - new IO code for Linux - raised default segment size to approx 512 MiB - improved compaction performance, #1041 - reduced client CPU load and improved performance for remote repositories, #940 - options that imply output (--show-rc, --show-version, --list, --stats, --progress) don't need -v/--info to have that output displayed, #865 - add archive comments (via borg (re)create --comment), #842 - borg list/prune/delete: also output archive id, #731 - --show-version: shows/logs the borg version, #725 - added --debug-topic for granular debug logging, #1447 - use atomic file writing/updating for configuration and key files, #1377 - BORG_KEY_FILE environment variable, #1001 - self-testing module, #970 Bug fixes: - list: fixed default output being produced if --format is given with empty parameter, #1489 - create: fixed overflowing progress line with CJK and similar characters, #1051 - prune: fixed crash if --prefix resulted in no matches, #1029 - init: clean up partial repo if passphrase input is aborted, #850 - info: quote cmdline arguments that have spaces in them - fix hardlinks failing in some cases for extracting subtrees, #761 Other changes: - replace stdlib hmac with OpenSSL, zero-copy decrypt (10-15% increase in performance of hash-lists and extract). - improved chunker performance, #1021 - open repository segment files in exclusive mode (fail-safe), #1134 - improved error logging, #1440 - Source: - pass meta-data around, #765 - move some constants to new constants module - better readability and fewer errors with namedtuples, #823 - moved source tree into src/ subdirectory, #1016 - made borg.platform a package, #1113 - removed dead crypto code, #1032 - improved and ported parts of the test suite to py.test, #912 - created data classes instead of passing dictionaries around, #981, #1158, #1161 - cleaned up imports, #1112 - Docs: - better help texts and sphinx reproduction of usage help: - Group options - Nicer list of options in Sphinx - Deduplicate 'Common options' (including --help) - chunker: added some insights by "Voltara", #903 - clarify what "deduplicated size" means - fix / update / add package list entries - added a SaltStack usage example, #956 - expanded FAQ - new contributors in AUTHORS! - Tests: - vagrant: add ubuntu/xenial 64bit - this box has still some issues - ChunkBuffer: add test for leaving partial chunk in buffer, fixes #945 Version 1.0.13 (2019-02-15) --------------------------- Please note: this is very likely the last 1.0.x release, please upgrade to 1.1.x. Bug fixes: - security fix: configure FUSE with "default_permissions", #3903. "default_permissions" is now enforced by borg by default to let the kernel check uid/gid/mode based permissions. "ignore_permissions" can be given not to enforce "default_permissions". - xattrs: fix borg exception handling on ENOSPC error, #3808. New features: - Read a passphrase from a file descriptor specified in the BORG_PASSPHRASE_FD environment variable. Other changes: - acl platform code: fix acl set return type - xattr: - add linux {list,get,set}xattr ctypes prototypes - fix darwin flistxattr ctypes prototype - testing / travis-ci: - fix the homebrew 1.9 issues on travis-ci, #4254 - travis OS X: use xcode 8.3 (not broken) - tox.ini: lock requirements - unbreak 1.0-maint on travis, fixes #4123 - vagrant: - misc. fixes - FUSE for macOS: upgrade 3.7.1 to 3.8.3 - Python: upgrade 3.5.5 to 3.5.6 - docs: - Update installation instructions for macOS - update release workflow using twine (docs, scripts), #4213 Version 1.0.12 (2018-04-08) --------------------------- Bug fixes: - repository: cleanup/write: invalidate cached FDs, tests - serve: fix exitcode, #2910 - extract: set bsdflags last (include immutable flag), #3263 - create --timestamp: set start time, #2957 - create: show excluded dir with "x" for tagged dirs / caches, #3189 - migrate locks to child PID when daemonize is used - Buffer: fix wrong thread-local storage use, #2951 - fix detection of non-local path, #3108 - fix LDLP restoration for subprocesses, #3077 - fix subprocess environments (xattr module's fakeroot version check, borg umount, BORG_PASSCOMMAND), #3050 - remote: deal with partial lines, #2637 - get rid of datetime.isoformat, use safe parse_timestamp to parse timestamps, #2994 - build: do .h file content checks in binary mode, fixes build issue for non-ascii header files on pure-ascii locale platforms, #3544 #3639 - remove platform.uname() call which caused library mismatch issues, #3732 - add exception handler around deprecated platform.linux_distribution() call Other changes: - require msgpack-python >= 0.4.6 and < 0.5.0, see #3753 - add parens for C preprocessor macro argument usages (did not cause malfunction) - ignore corrupt files cache, #2939 - replace "modulo" with "if" to check for wraparound in hashmap - keymanager: don't depend on optional readline module, #2980 - exclude broken pytest 3.3.0 release - exclude broken Cython 0.27(.0) release, #3066 - flake8: add some ignores - docs: - create: document exclusion through nodump - document good and problematic option placements, fix examples, #3356 - update docs about hardlinked symlinks limitation - faq: we do not implement futile attempts of ETA / progress displays - simplified rate limiting wrapper in FAQ - twitter account @borgbackup, #2948 - add note about metadata dedup and --no[ac]time, #2518 - change-passphrase only changes the passphrase, #2990 - clarify encrypted key format for borg key export, #3296 - document sshfs rename workaround, #3315 - update release checklist about security fixes - docs about how to verify a signed release, #3634 - chunk seed is generated per /repository/ - vagrant: - use FUSE for macOS 3.7.1 to build the macOS binary - use python 3.5.5 to build the binaries - add exe location to PATH when we build an exe - use https pypi url for wheezy - netbsd: bash is already installed - netbsd: fix netbsd version in PKG_PATH - use self-made FreeBSD 10.3 box, #3022 - backport fs_init (including related updates) from 1.1 - the boxcutter wheezy boxes are 404, use local ones - travis: - don't perform full Travis build on docs-only changes, #2531 - only short-circuit docs-only changes for pull requests Version 1.0.11 (2017-07-21) --------------------------- Bug fixes: - use limited unpacker for outer key (security precaution), #2174 - fix paperkey import bug Other changes: - change --checkpoint-interval default from 600s to 1800s, #2841. this improves efficiency for big repositories a lot. - docs: fix OpenSUSE command and add OpenSUSE section - tests: add tests for split_lstring and paperkey - vagrant: - fix openbsd shell - backport cpu/ram setup from master - add stretch64 VM Version 1.0.11rc1 (2017-06-27) ------------------------------ Bug fixes: - performance: rebuild hashtable if we have too few empty buckets, #2246. this fixes some sporadic, but severe performance breakdowns. - Archive: allocate zeros when needed, #2308 fixes huge memory usage of mount (8 MiB × number of archives) - IPv6 address support also: Location: more informative exception when parsing fails - borg single-file binary: use pyinstaller v3.2.1, #2396 this fixes that the prelink cronjob on some distros kills the borg binary by stripping away parts of it. - extract: - warning for unextracted big extended attributes, #2258 - also create parent dir for device files, if needed. - don't write to disk with --stdout, #2645 - archive check: detect and fix missing all-zero replacement chunks, #2180 - fix (de)compression exceptions, #2224 #2221 - files cache: update inode number, #2226 - borg rpc: use limited msgpack.Unpacker (security precaution), #2139 - Manifest: use limited msgpack.Unpacker (security precaution), #2175 - Location: accept //servername/share/path - fix ChunkIndex.__contains__ assertion for big-endian archs (harmless) - create: handle BackupOSError on a per-path level in one spot - fix error msg, there is no --keep-last in borg 1.0.x, #2282 - clamp (nano)second values to unproblematic range, #2304 - fuse / borg mount: - fix st_blocks to be an integer (not float) value - fix negative uid/gid crash (they could come into archives e.g. when backing up external drives under cygwin), #2674 - fix crash if empty (None) xattr is read - do pre-mount checks before opening repository - check llfuse is installed before asking for passphrase - borg rename: expand placeholders, #2386 - borg serve: fix forced command lines containing BORG_* env vars - fix error msg, it is --keep-within, not --within - fix borg key/debug/benchmark crashing without subcommand, #2240 - chunker: fix invalid use of types, don't do uint32_t >> 32 - document follow_symlinks requirements, check libc, #2507 New features: - added BORG_PASSCOMMAND environment variable, #2573 - add minimal version of in repository mandatory feature flags, #2134 This should allow us to make sure older borg versions can be cleanly prevented from doing operations that are no longer safe because of repository format evolution. This allows more fine grained control than just incrementing the manifest version. So for example a change that still allows new archives to be created but would corrupt the repository when an old version tries to delete an archive or check the repository would add the new feature to the check and delete set but leave it out of the write set. - borg delete --force --force to delete severely corrupted archives, #1975 Other changes: - embrace y2038 issue to support 32bit platforms - be more clear that this is a "beyond repair" case, #2427 - key file names: limit to 100 characters and remove colons from host name - upgrade FUSE for macOS to 3.5.8, #2346 - split up parsing and filtering for --keep-within, better error message, #2610 - docs: - fix caskroom link, #2299 - address SSH batch mode, #2202 #2270 - improve remote-path description - document snapshot usage, #2178 - document relative path usage, #1868 - one link per distro in the installation page - development: new branching model in git repository - kill api page - added FAQ section about backing up root partition - add bountysource badge, #2558 - create empty docs.txt requirements, #2694 - README: how to help the project - note -v/--verbose requirement on affected options, #2542 - document borg init behaviour via append-only borg serve, #2440 - be clear about what buzhash is used for (chunking) and want it is not used for (deduplication)- also say already in the readme that we use a cryptohash for dedupe, so people don't worry, #2390 - add hint about chunker params to borg upgrade docs, #2421 - clarify borg upgrade docs, #2436 - quickstart: delete problematic BORG_PASSPHRASE use, #2623 - faq: specify "using inline shell scripts" - document pattern denial of service, #2624 - tests: - remove attic dependency of the tests, #2505 - travis: - enhance travis setuptools_scm situation - install fakeroot for Linux - add test for borg delete --force - enable remote tests on cygwin (the cygwin issue that caused these tests to break was fixed in cygwin at least since cygwin 2.8, maybe even since 2.7.0). - remove skipping the noatime tests on GNU/Hurd, #2710 - fix borg import issue, add comment, #2718 - include attic.tar.gz when installing the package also: add include_package_data=True Version 1.0.10 (2017-02-13) --------------------------- Bug fixes: - Manifest timestamps are now monotonically increasing, this fixes issues when the system clock jumps backwards or is set inconsistently across computers accessing the same repository, #2115 - Fixed testing regression in 1.0.10rc1 that lead to a hard dependency on py.test >= 3.0, #2112 New features: - "key export" can now generate a printable HTML page with both a QR code and a human-readable "paperkey" representation (and custom text) through the ``--qr-html`` option. The same functionality is also available through `paperkey.html `_, which is the same HTML page generated by ``--qr-html``. It works with existing "key export" files and key files. Other changes: - docs: - language clarification - "borg create --one-file-system" option does not respect mount points, but considers different file systems instead, #2141 - setup.py: build_api: sort file list for determinism Version 1.0.10rc1 (2017-01-29) ------------------------------ Bug fixes: - borg serve: fix transmission data loss of pipe writes, #1268 This affects only the cygwin platform (not Linux, BSD, OS X). - Avoid triggering an ObjectiveFS bug in xattr retrieval, #1992 - When running out of buffer memory when reading xattrs, only skip the current file, #1993 - Fixed "borg upgrade --tam" crashing with unencrypted repositories. Since :ref:`the issue ` is not relevant for unencrypted repositories, it now does nothing and prints an error, #1981. - Fixed change-passphrase crashing with unencrypted repositories, #1978 - Fixed "borg check repo::archive" indicating success if "archive" does not exist, #1997 - borg check: print non-exit-code warning if --last or --prefix aren't fulfilled - fix bad parsing of wrong repo location syntax - create: don't create hard link refs to failed files, mount: handle invalid hard link refs, #2092 - detect mingw byte order, #2073 - creating a new segment: use "xb" mode, #2099 - mount: umount on SIGINT/^C when in foreground, #2082 Other changes: - binary: use fixed AND freshly compiled pyinstaller bootloader, #2002 - xattr: ignore empty names returned by llistxattr(2) et al - Enable the fault handler: install handlers for the SIGSEGV, SIGFPE, SIGABRT, SIGBUS and SIGILL signals to dump the Python traceback. - Also print a traceback on SIGUSR2. - borg change-passphrase: print key location (simplify making a backup of it) - officially support Python 3.6 (setup.py: add Python 3.6 qualifier) - tests: - vagrant / travis / tox: add Python 3.6 based testing - vagrant: fix openbsd repo, #2042 - vagrant: fix the freebsd64 machine, #2037 #2067 - vagrant: use python 3.5.3 to build binaries, #2078 - vagrant: use osxfuse 3.5.4 for tests / to build binaries vagrant: improve darwin64 VM settings - travis: fix osxfuse install (fixes OS X testing on Travis CI) - travis: require succeeding OS X tests, #2028 - travis: use latest pythons for OS X based testing - use pytest-xdist to parallelize testing - fix xattr test race condition, #2047 - setup.cfg: fix pytest deprecation warning, #2050 - docs: - language clarification - VM backup FAQ - borg create: document how to back up stdin, #2013 - borg upgrade: fix incorrect title levels - add CVE numbers for issues fixed in 1.0.9, #2106 - fix typos (taken from Debian package patch) - remote: include data hexdump in "unexpected RPC data" error message - remote: log SSH command line at debug level - API_VERSION: use numberspaces, #2023 - remove .github from pypi package, #2051 - add pip and setuptools to requirements file, #2030 - SyncFile: fix use of fd object after close (cosmetic) - Manifest.in: simplify, exclude \*.{so,dll,orig}, #2066 - ignore posix_fadvise errors in repository.py, #2095 (works around issues with docker on ARM) - make LoggedIO.close_segment reentrant, avoid reentrance Version 1.0.9 (2016-12-20) -------------------------- Security fixes: - A flaw in the cryptographic authentication scheme in Borg allowed an attacker to spoof the manifest. See :ref:`tam_vuln` above for the steps you should take. CVE-2016-10099 was assigned to this vulnerability. - borg check: When rebuilding the manifest (which should only be needed very rarely) duplicate archive names would be handled on a "first come first serve" basis, potentially opening an attack vector to replace archives. Example: were there 2 archives named "foo" in a repo (which can not happen under normal circumstances, because borg checks if the name is already used) and a "borg check" recreated a (previously lost) manifest, the first of the archives it encountered would be in the manifest. The second archive is also still in the repo, but not referenced in the manifest, in this case. If the second archive is the "correct" one (and was previously referenced from the manifest), it looks like it got replaced by the first one. In the manifest, it actually got replaced. Both remain in the repo but the "correct" one is no longer accessible via normal means - the manifest. CVE-2016-10100 was assigned to this vulnerability. Bug fixes: - borg check: - rebuild manifest if it's corrupted - skip corrupted chunks during manifest rebuild - fix TypeError in integrity error handler, #1903, #1894 - fix location parser for archives with @ char (regression introduced in 1.0.8), #1930 - fix wrong duration/timestamps if system clock jumped during a create - fix progress display not updating if system clock jumps backwards - fix checkpoint interval being incorrect if system clock jumps Other changes: - docs: - add python3-devel as a dependency for cygwin-based installation - clarify extract is relative to current directory - FAQ: fix link to changelog - markup fixes - tests: - test_get\_(cache|keys)_dir: clean env state, #1897 - get back pytest's pretty assertion failures, #1938 - setup.py build_usage: - fixed build_usage not processing all commands - fixed build_usage not generating includes for debug commands Version 1.0.9rc1 (2016-11-27) ----------------------------- Bug fixes: - files cache: fix determination of newest mtime in backup set (which is used in cache cleanup and led to wrong "A" [added] status for unchanged files in next backup), #1860. - borg check: - fix incorrectly reporting attic 0.13 and earlier archives as corrupt - handle repo w/o objects gracefully and also bail out early if repo is *completely* empty, #1815. - fix tox/pybuild in 1.0-maint - at xattr module import time, loggers are not initialized yet New features: - borg umount exposed already existing umount code via the CLI api, so users can use it, which is more consistent than using borg to mount and fusermount -u (or umount) to un-mount, #1855. - implement borg create --noatime --noctime, fixes #1853 Other changes: - docs: - display README correctly on PyPI - improve cache / index docs, esp. files cache docs, fixes #1825 - different pattern matching for --exclude, #1779 - datetime formatting examples for {now} placeholder, #1822 - clarify passphrase mode attic repo upgrade, #1854 - clarify --umask usage, #1859 - clarify how to choose PR target branch - clarify prune behavior for different archive contents, #1824 - fix PDF issues, add logo, fix authors, headings, TOC - move security verification to support section - fix links in standalone README (:ref: tags) - add link to security contact in README - add FAQ about security - move fork differences to FAQ - add more details about resource usage - tests: skip remote tests on cygwin, #1268 - travis: - allow OS X failures until the brew cask osxfuse issue is fixed - caskroom osxfuse-beta gone, it's osxfuse now (3.5.3) - vagrant: - upgrade OSXfuse / FUSE for macOS to 3.5.3 - remove llfuse from tox.ini at a central place - do not try to install llfuse on centos6 - fix FUSE test for darwin, #1546 - add windows virtual machine with cygwin - Vagrantfile cleanup / code deduplication Version 1.0.8 (2016-10-29) -------------------------- Bug fixes: - RemoteRepository: Fix busy wait in call_many, #940 New features: - implement borgmajor/borgminor/borgpatch placeholders, #1694 {borgversion} was already there (full version string). With the new placeholders you can now also get e.g. 1 or 1.0 or 1.0.8. Other changes: - avoid previous_location mismatch, #1741 due to the changed canonicalization for relative paths in PR #1711 / #1655 (implement /./ relpath hack), there would be a changed repo location warning and the user would be asked if this is ok. this would break automation and require manual intervention, which is unwanted. thus, we automatically fix the previous_location config entry, if it only changed in the expected way, but still means the same location. - docs: - deployment.rst: do not use bare variables in ansible snippet - add clarification about append-only mode, #1689 - setup.py: add comment about requiring llfuse, #1726 - update usage.rst / api.rst - repo url / archive location docs + typo fix - quickstart: add a comment about other (remote) filesystems - vagrant / tests: - no chown when rsyncing (fixes boxes w/o vagrant group) - fix FUSE permission issues on linux/freebsd, #1544 - skip FUSE test for borg binary + fakeroot - ignore security.selinux xattrs, fixes tests on centos, #1735 Version 1.0.8rc1 (2016-10-17) ----------------------------- Bug fixes: - fix signal handling (SIGINT, SIGTERM, SIGHUP), #1620 #1593 Fixes e.g. leftover lock files for quickly repeated signals (e.g. Ctrl-C Ctrl-C) or lost connections or systemd sending SIGHUP. - progress display: adapt formatting to narrow screens, do not crash, #1628 - borg create --read-special - fix crash on broken symlink, #1584. also correctly processes broken symlinks. before this regressed to a crash (5b45385) a broken symlink would've been skipped. - process_symlink: fix missing backup_io() Fixes a chmod/chown/chgrp/unlink/rename/... crash race between getting dirents and dispatching to process_symlink. - yes(): abort on wrong answers, saying so, #1622 - fixed exception borg serve raised when connection was closed before repository was opened. Add an error message for this. - fix read-from-closed-FD issue, #1551 (this seems not to get triggered in 1.0.x, but was discovered in master) - hashindex: fix iterators (always raise StopIteration when exhausted) (this seems not to get triggered in 1.0.x, but was discovered in master) - enable relative paths in ssh:// repo URLs, via /./relpath hack, #1655 - allow repo paths with colons, #1705 - update changed repo location immediately after acceptance, #1524 - fix debug get-obj / delete-obj crash if object not found and remote repo, #1684 - pyinstaller: use a spec file to build borg.exe binary, exclude osxfuse dylib on Mac OS X (avoids mismatch lib <-> driver), #1619 New features: - add "borg key export" / "borg key import" commands, #1555, so users are able to back up / restore their encryption keys more easily. Supported formats are the keyfile format used by borg internally and a special "paper" format with by line checksums for printed backups. For the paper format, the import is an interactive process which checks each line as soon as it is input. - add "borg debug-refcount-obj" to determine a repo objects' referrer counts, #1352 Other changes: - add "borg debug ..." subcommands (borg debug-* still works, but will be removed in borg 1.1) - setup.py: Add subcommand support to build_usage. - remote: change exception message for unexpected RPC data format to indicate dataflow direction. - improved messages / error reporting: - IntegrityError: add placeholder for message, so that the message we give appears not only in the traceback, but also in the (short) error message, #1572 - borg.key: include chunk id in exception msgs, #1571 - better messages for cache newer than repo, #1700 - vagrant (testing/build VMs): - upgrade OSXfuse / FUSE for macOS to 3.5.2 - update Debian Wheezy boxes, #1686 - openbsd / netbsd: use own boxes, fixes misc rsync installation and FUSE/llfuse related testing issues, #1695 #1696 #1670 #1671 #1728 - docs: - add docs for "key export" and "key import" commands, #1641 - fix inconsistency in FAQ (pv-wrapper). - fix second block in "Easy to use" section not showing on GitHub, #1576 - add bestpractices badge - link reference docs and faq about BORG_FILES_CACHE_TTL, #1561 - improve borg info --help, explain size infos, #1532 - add release signing key / security contact to README, #1560 - add contribution guidelines for developers - development.rst: add sphinx_rtd_theme to the sphinx install command - adjust border color in borg.css - add debug-info usage help file - internals.rst: fix typos - setup.py: fix build_usage to always process all commands - added docs explaining multiple --restrict-to-path flags, #1602 - add more specific warning about write-access debug commands, #1587 - clarify FAQ regarding backup of virtual machines, #1672 - tests: - work around FUSE xattr test issue with recent fakeroot - simplify repo/hashindex tests - travis: test FUSE-enabled borg, use trusty to have a recent FUSE - re-enable FUSE tests for RemoteArchiver (no deadlocks any more) - clean env for pytest based tests, #1714 - fuse_mount contextmanager: accept any options Version 1.0.7 (2016-08-19) -------------------------- Security fixes: - borg serve: fix security issue with remote repository access, #1428 If you used e.g. --restrict-to-path /path/client1/ (with or without trailing slash does not make a difference), it acted like a path prefix match using /path/client1 (note the missing trailing slash) - the code then also allowed working in e.g. /path/client13 or /path/client1000. As this could accidentally lead to major security/privacy issues depending on the paths you use, the behaviour was changed to be a strict directory match. That means --restrict-to-path /path/client1 (with or without trailing slash does not make a difference) now uses /path/client1/ internally (note the trailing slash here!) for matching and allows precisely that path AND any path below it. So, /path/client1 is allowed, /path/client1/repo1 is allowed, but not /path/client13 or /path/client1000. If you willingly used the undocumented (dangerous) previous behaviour, you may need to rearrange your --restrict-to-path paths now. We are sorry if that causes work for you, but we did not want a potentially dangerous behaviour in the software (not even using a for-backwards-compat option). Bug fixes: - fixed repeated LockTimeout exceptions when borg serve tried to write into a already write-locked repo (e.g. by a borg mount), #502 part b) This was solved by the fix for #1220 in 1.0.7rc1 already. - fix cosmetics + file leftover for "not a valid borg repository", #1490 - Cache: release lock if cache is invalid, #1501 - borg extract --strip-components: fix leak of preloaded chunk contents - Repository, when a InvalidRepository exception happens: - fix spurious, empty lock.roster - fix repo not closed cleanly New features: - implement borg debug-info, fixes #1122 (just calls already existing code via cli, same output as below tracebacks) Other changes: - skip the O_NOATIME test on GNU Hurd, fixes #1315 (this is a very minor issue and the GNU Hurd project knows the bug) - document using a clean repo to test / build the release Version 1.0.7rc2 (2016-08-13) ----------------------------- Bug fixes: - do not write objects to repository that are bigger than the allowed size, borg will reject reading them, #1451. Important: if you created archives with many millions of files or directories, please verify if you can open them successfully, e.g. try a "borg list REPO::ARCHIVE". - lz4 compression: dynamically enlarge the (de)compression buffer, the static buffer was not big enough for archives with extremely many items, #1453 - larger item metadata stream chunks, raise archive item limit by 8x, #1452 - fix untracked segments made by moved DELETEs, #1442 Impact: Previously (metadata) segments could become untracked when deleting data, these would never be cleaned up. - extended attributes (xattrs) related fixes: - fixed a race condition in xattrs querying that led to the entire file not being backed up (while logging the error, exit code = 1), #1469 - fixed a race condition in xattrs querying that led to a crash, #1462 - raise OSError including the error message derived from errno, deal with path being a integer FD Other changes: - print active env var override by default, #1467 - xattr module: refactor code, deduplicate, clean up - repository: split object size check into too small and too big - add a transaction_id assertion, so borg init on a broken (inconsistent) filesystem does not look like a coding error in borg, but points to the real problem. - explain confusing TypeError caused by compat support for old servers, #1456 - add forgotten usage help file from build_usage - refactor/unify buffer code into helpers.Buffer class, add tests - docs: - document archive limitation, #1452 - improve prune examples Version 1.0.7rc1 (2016-08-05) ----------------------------- Bug fixes: - fix repo lock deadlocks (related to lock upgrade), #1220 - catch unpacker exceptions, resync, #1351 - fix borg break-lock ignoring BORG_REPO env var, #1324 - files cache performance fixes (fixes unnecessary re-reading/chunking/ hashing of unmodified files for some use cases): - fix unintended file cache eviction, #1430 - implement BORG_FILES_CACHE_TTL, update FAQ, raise default TTL from 10 to 20, #1338 - FUSE: - cache partially read data chunks (performance), #965, #966 - always create a root dir, #1125 - use an OrderedDict for helptext, making the build reproducible, #1346 - RemoteRepository init: always call close on exceptions, #1370 (cosmetic) - ignore stdout/stderr broken pipe errors (cosmetic), #1116 New features: - better borg versions management support (useful esp. for borg servers wanting to offer multiple borg versions and for clients wanting to choose a specific server borg version), #1392: - add BORG_VERSION environment variable before executing "borg serve" via ssh - add new placeholder {borgversion} - substitute placeholders in --remote-path - borg init --append-only option (makes using the more secure append-only mode more convenient. when used remotely, this requires 1.0.7+ also on the borg server), #1291. Other changes: - Vagrantfile: - darwin64: upgrade to FUSE for macOS 3.4.1 (aka osxfuse), #1378 - xenial64: use user "ubuntu", not "vagrant" (as usual), #1331 - tests: - fix FUSE tests on OS X, #1433 - docs: - FAQ: add backup using stable filesystem names recommendation - FAQ about glibc compatibility added, #491, glibc-check improved - FAQ: 'A' unchanged file; remove ambiguous entry age sentence. - OS X: install pkg-config to build with FUSE support, fixes #1400 - add notes about shell/sudo pitfalls with env. vars, #1380 - added platform feature matrix - implement borg debug-dump-repo-objs Version 1.0.6 (2016-07-12) -------------------------- Bug fixes: - Linux: handle multiple LD_PRELOAD entries correctly, #1314, #1111 - Fix crash with unclear message if the libc is not found, #1314, #1111 Other changes: - tests: - Fixed O_NOATIME tests for Solaris and GNU Hurd, #1315 - Fixed sparse file tests for (file) systems not supporting it, #1310 - docs: - Fixed syntax highlighting, #1313 - misc docs: added data processing overview picture Version 1.0.6rc1 (2016-07-10) ----------------------------- New features: - borg check --repair: heal damaged files if missing chunks re-appear (e.g. if the previously missing chunk was added again in a later backup archive), #148. (*) Also improved logging. Bug fixes: - sync_dir: silence fsync() failing with EINVAL, #1287 Some network filesystems (like smbfs) don't support this and we use this in repository code. - borg mount (FUSE): - fix directories being shadowed when contained paths were also specified, #1295 - raise I/O Error (EIO) on damaged files (unless -o allow_damaged_files is used), #1302. (*) - borg extract: warn if a damaged file is extracted, #1299. (*) - Added some missing return code checks (ChunkIndex._add, hashindex_resize). - borg check: fix/optimize initial hash table size, avoids resize of the table. Other changes: - tests: - add more FUSE tests, #1284 - deduplicate FUSE (u)mount code - fix borg binary test issues, #862 - docs: - changelog: added release dates to older borg releases - fix some sphinx (docs generator) warnings, #881 Notes: (*) Some features depend on information (chunks_healthy list) added to item metadata when a file with missing chunks was "repaired" using all-zero replacement chunks. The chunks_healthy list is generated since borg 1.0.4, thus borg can't recognize such "repaired" (but content-damaged) files if the repair was done with an older borg version. Version 1.0.5 (2016-07-07) -------------------------- Bug fixes: - borg mount: fix FUSE crash in xattr code on Linux introduced in 1.0.4, #1282 Other changes: - backport some FAQ entries from master branch - add release helper scripts - Vagrantfile: - centos6: no FUSE, don't build binary - add xz for redhat-like dists Version 1.0.4 (2016-07-07) -------------------------- New features: - borg serve --append-only, #1168 This was included because it was a simple change (append-only functionality was already present via repository config file) and makes better security now practically usable. - BORG_REMOTE_PATH environment variable, #1258 This was included because it was a simple change (--remote-path cli option was already present) and makes borg much easier to use if you need it. - Repository: cleanup incomplete transaction on "no space left" condition. In many cases, this can avoid a 100% full repo filesystem (which is very problematic as borg always needs free space - even to delete archives). Bug fixes: - Fix wrong handling and reporting of OSErrors in borg create, #1138. This was a serious issue: in the context of "borg create", errors like repository I/O errors (e.g. disk I/O errors, ssh repo connection errors) were handled badly and did not lead to a crash (which would be good for this case, because the repo transaction would be incomplete and trigger a transaction rollback to clean up). Now, error handling for source files is cleanly separated from every other error handling, so only problematic input files are logged and skipped. - Implement fail-safe error handling for borg extract. Note that this isn't nearly as critical as the borg create error handling bug, since nothing is written to the repo. So this was "merely" misleading error reporting. - Add missing error handler in directory attr restore loop. - repo: make sure write data hits disk before the commit tag (#1236) and also sync the containing directory. - FUSE: getxattr fail must use errno.ENOATTR, #1126 (fixes Mac OS X Finder malfunction: "zero bytes" file length, access denied) - borg check --repair: do not lose information about the good/original chunks. If we do not lose the original chunk IDs list when "repairing" a file (replacing missing chunks with all-zero chunks), we have a chance to "heal" the file back into its original state later, in case the chunks re-appear (e.g. in a fresh backup). Healing is not implemented yet, see #148. - fixes for --read-special mode: - ignore known files cache, #1241 - fake regular file mode, #1214 - improve symlinks handling, #1215 - remove passphrase from subprocess environment, #1105 - Ignore empty index file (will trigger index rebuild), #1195 - add missing placeholder support for --prefix, #1027 - improve exception handling for placeholder replacement - catch and format exceptions in arg parsing - helpers: fix "undefined name 'e'" in exception handler - better error handling for missing repo manifest, #1043 - borg delete: - make it possible to delete a repo without manifest - borg delete --forced allows one to delete corrupted archives, #1139 - borg check: - make borg check work for empty repo - fix resync and msgpacked item qualifier, #1135 - rebuild_manifest: fix crash if 'name' or 'time' key were missing. - better validation of item metadata dicts, #1130 - better validation of archive metadata dicts - close the repo on exit - even if rollback did not work, #1197. This is rather cosmetic, it avoids repo closing in the destructor. - tests: - fix sparse file test, #1170 - flake8: ignore new F405, #1185 - catch "invalid argument" on cygwin, #257 - fix sparseness assertion in test prep, #1264 Other changes: - make borg build/work on OpenSSL 1.0 and 1.1, #1187 - docs / help: - fix / clarify prune help, #1143 - fix "patterns" help formatting - add missing docs / help about placeholders - resources: rename atticmatic to borgmatic - document sshd settings, #545 - more details about checkpoints, add split trick, #1171 - support docs: add freenode web chat link, #1175 - add prune visualization / example, #723 - add note that Fnmatch is default, #1247 - make clear that lzma levels > 6 are a waste of cpu cycles - add a "do not edit" note to auto-generated files, #1250 - update cygwin installation docs - repository interoperability with borg master (1.1dev) branch: - borg check: read item metadata keys from manifest, #1147 - read v2 hints files, #1235 - fix hints file "unknown version" error handling bug - tests: add tests for format_line - llfuse: update version requirement for freebsd - Vagrantfile: - use openbsd 5.9, #716 - do not install llfuse on netbsd (broken) - update OSXfuse to version 3.3.3 - use Python 3.5.2 to build the binaries - glibc compatibility checker: scripts/glibc_check.py - add .eggs to .gitignore Version 1.0.3 (2016-05-20) -------------------------- Bug fixes: - prune: avoid that checkpoints are kept and completed archives are deleted in a prune run), #997 - prune: fix commandline argument validation - some valid command lines were considered invalid (annoying, but harmless), #942 - fix capabilities extraction on Linux (set xattrs last, after chown()), #1069 - repository: fix commit tags being seen in data - when probing key files, do binary reads. avoids crash when non-borg binary files are located in borg's key files directory. - handle SIGTERM and make a clean exit - avoids orphan lock files. - repository cache: don't cache large objects (avoid using lots of temp. disk space), #1063 Other changes: - Vagrantfile: OS X: update osxfuse / install lzma package, #933 - setup.py: add check for platform_darwin.c - setup.py: on freebsd, use a llfuse release that builds ok - docs / help: - update readthedocs URLs, #991 - add missing docs for "borg break-lock", #992 - borg create help: add some words to about the archive name - borg create help: document format tags, #894 Version 1.0.2 (2016-04-16) -------------------------- Bug fixes: - fix malfunction and potential corruption on (nowadays rather rare) big-endian architectures or bi-endian archs in (rare) BE mode. #886, #889 cache resync / index merge was malfunctioning due to this, potentially leading to data loss. borg info had cosmetic issues (displayed wrong values). note: all (widespread) little-endian archs (like x86/x64) or bi-endian archs in (widespread) LE mode (like ARMEL, MIPSEL, ...) were NOT affected. - add overflow and range checks for 1st (special) uint32 of the hashindex values, switch from int32 to uint32. - fix so that refcount will never overflow, but just stick to max. value after a overflow would have occurred. - borg delete: fix --cache-only for broken caches, #874 Makes --cache-only idempotent: it won't fail if the cache is already deleted. - fixed borg create --one-file-system erroneously traversing into other filesystems (if starting fs device number was 0), #873 - workaround a bug in Linux fadvise FADV_DONTNEED, #907 Other changes: - better test coverage for hashindex, incl. overflow testing, checking correct computations so endianness issues would be discovered. - reproducible doc for ProgressIndicator*, make the build reproducible. - use latest llfuse for vagrant machines - docs: - use /path/to/repo in examples, fixes #901 - fix confusing usage of "repo" as archive name (use "arch") Version 1.0.1 (2016-04-08) -------------------------- New features: Usually there are no new features in a bugfix release, but these were added due to their high impact on security/safety/speed or because they are fixes also: - append-only mode for repositories, #809, #36 (see docs) - borg create: add --ignore-inode option to make borg detect unmodified files even if your filesystem does not have stable inode numbers (like sshfs and possibly CIFS). - add options --warning, --error, --critical for missing log levels, #826. it's not recommended to suppress warnings or errors, but the user may decide this on his own. note: --warning is not given to borg serve so a <= 1.0.0 borg will still work as server (it is not needed as it is the default). do not use --error or --critical when using a <= 1.0.0 borg server. Bug fixes: - fix silently skipping EIO, #748 - add context manager for Repository (avoid orphan repository locks), #285 - do not sleep for >60s while waiting for lock, #773 - unpack file stats before passing to FUSE - fix build on illumos - don't try to back up doors or event ports (Solaris and derivatives) - remove useless/misleading libc version display, #738 - test suite: reset exit code of persistent archiver, #844 - RemoteRepository: clean up pipe if remote open() fails - Remote: don't print tracebacks for Error exceptions handled downstream, #792 - if BORG_PASSPHRASE is present but wrong, don't prompt for password, but fail instead, #791 - ArchiveChecker: move "orphaned objects check skipped" to INFO log level, #826 - fix capitalization, add ellipses, change log level to debug for 2 messages, #798 Other changes: - update llfuse requirement, llfuse 1.0 works - update OS / dist packages on build machines, #717 - prefer showing --info over -v in usage help, #859 - docs: - fix cygwin requirements (gcc-g++) - document how to debug / file filesystem issues, #664 - fix reproducible build of api docs - RTD theme: CSS !important overwrite, #727 - Document logo font. Recreate logo png. Remove GIMP logo file. Version 1.0.0 (2016-03-05) -------------------------- The major release number change (0.x -> 1.x) indicates bigger incompatible changes, please read the compatibility notes, adapt / test your scripts and check your backup logs. Compatibility notes: - drop support for python 3.2 and 3.3, require 3.4 or 3.5, #221 #65 #490 note: we provide binaries that include python 3.5.1 and everything else needed. they are an option in case you are stuck with < 3.4 otherwise. - change encryption to be on by default (using "repokey" mode) - moved keyfile keys from ~/.borg/keys to ~/.config/borg/keys, you can either move them manually or run "borg upgrade " - remove support for --encryption=passphrase, use borg migrate-to-repokey to switch to repokey mode, #97 - remove deprecated --compression , use --compression zlib, instead in case of 0, you could also use --compression none - remove deprecated --hourly/daily/weekly/monthly/yearly use --keep-hourly/daily/weekly/monthly/yearly instead - remove deprecated --do-not-cross-mountpoints, use --one-file-system instead - disambiguate -p option, #563: - -p now is same as --progress - -P now is same as --prefix - remove deprecated "borg verify", use "borg extract --dry-run" instead - cleanup environment variable semantics, #355 the environment variables used to be "yes sayers" when set, this was conceptually generalized to "automatic answerers" and they just give their value as answer (as if you typed in that value when being asked). See the "usage" / "Environment Variables" section of the docs for details. - change the builtin default for --chunker-params, create 2MiB chunks, #343 --chunker-params new default: 19,23,21,4095 - old default: 10,23,16,4095 one of the biggest issues with borg < 1.0 (and also attic) was that it had a default target chunk size of 64kiB, thus it created a lot of chunks and thus also a huge chunk management overhead (high RAM and disk usage). please note that the new default won't change the chunks that you already have in your repository. the new big chunks do not deduplicate with the old small chunks, so expect your repo to grow at least by the size of every changed file and in the worst case (e.g. if your files cache was lost / is not used) by the size of every file (minus any compression you might use). in case you want to see a much lower resource usage immediately (RAM / disk) for chunks management, it might be better to start with a new repo than to continue in the existing repo (with an existing repo, you have to wait until all archives with small chunks get pruned to see a lower resource usage). if you used the old --chunker-params default value (or if you did not use --chunker-params option at all) and you'd like to continue using small chunks (and you accept the huge resource usage that comes with that), just use explicitly borg create --chunker-params=10,23,16,4095. - archive timestamps: the 'time' timestamp now refers to archive creation start time (was: end time), the new 'time_end' timestamp refers to archive creation end time. This might affect prune if your backups take a long time. if you give a timestamp via cli, this is stored into 'time'. therefore it now needs to mean archive creation start time. New features: - implement password roundtrip, #695 Bug fixes: - remote end does not need cache nor keys directories, do not create them, #701 - added retry counter for passwords, #703 Other changes: - fix compiler warnings, #697 - docs: - update README.rst to new changelog location in docs/changes.rst - add Teemu to AUTHORS - changes.rst: fix old chunker params, #698 - FAQ: how to limit bandwidth Version 1.0.0rc2 (2016-02-28) ----------------------------- New features: - format options for location: user, pid, fqdn, hostname, now, utcnow, user - borg list --list-format - borg prune -v --list enables the keep/prune list output, #658 Bug fixes: - fix _open_rb noatime handling, #657 - add a simple archivename validator, #680 - borg create --stats: show timestamps in localtime, use same labels/formatting as borg info, #651 - llfuse compatibility fixes (now compatible with: 0.40, 0.41, 0.42) Other changes: - it is now possible to use "pip install borgbackup[fuse]" to install the llfuse dependency automatically, using the correct version requirement for it. you still need to care about having installed the FUSE / build related OS package first, though, so that building llfuse can succeed. - Vagrant: drop Ubuntu Precise (12.04) - does not have Python >= 3.4 - Vagrant: use pyinstaller v3.1.1 to build binaries - docs: - borg upgrade: add to docs that only LOCAL repos are supported - borg upgrade also handles borg 0.xx -> 1.0 - use pip extras or requirements file to install llfuse - fix order in release process - updated usage docs and other minor / cosmetic fixes - verified borg examples in docs, #644 - freebsd dependency installation and FUSE configuration, #649 - add example how to restore a raw device, #671 - add a hint about the dev headers needed when installing from source - add examples for delete (and handle delete after list, before prune), #656 - update example for borg create -v --stats (use iso datetime format), #663 - added example to BORG_RSH docs - "connection closed by remote": add FAQ entry and point to issue #636 Version 1.0.0rc1 (2016-02-07) ----------------------------- New features: - borg migrate-to-repokey ("passphrase" -> "repokey" encryption key mode) - implement --short for borg list REPO, #611 - implement --list for borg extract (consistency with borg create) - borg serve: overwrite client's --restrict-to-path with ssh forced command's option value (but keep everything else from the client commandline), #544 - use $XDG_CONFIG_HOME/keys for keyfile keys (~/.config/borg/keys), #515 - "borg upgrade" moves the keyfile keys to the new location - display both archive creation start and end time in "borg info", #627 Bug fixes: - normalize trailing slashes for the repository path, #606 - Cache: fix exception handling in __init__, release lock, #610 Other changes: - suppress unneeded exception context (PEP 409), simpler tracebacks - removed special code needed to deal with imperfections / incompatibilities / missing stuff in py 3.2/3.3, simplify code that can be done simpler in 3.4 - removed some version requirements that were kept on old versions because newer did not support py 3.2 any more - use some py 3.4+ stdlib code instead of own/openssl/pypi code: - use os.urandom instead of own cython openssl RAND_bytes wrapper, #493 - use hashlib.pbkdf2_hmac from py stdlib instead of own openssl wrapper - use hmac.compare_digest instead of == operator (constant time comparison) - use stat.filemode instead of homegrown code - use "mock" library from stdlib, #145 - remove borg.support (with non-broken argparse copy), it is ok in 3.4+, #358 - Vagrant: copy CHANGES.rst as symlink, #592 - cosmetic code cleanups, add flake8 to tox/travis, #4 - docs / help: - make "borg -h" output prettier, #591 - slightly rephrase prune help - add missing example for --list option of borg create - quote exclude line that includes an asterisk to prevent shell expansion - fix dead link to license - delete Ubuntu Vivid, it is not supported anymore (EOL) - OS X binary does not work for older OS X releases, #629 - borg serve's special support for forced/original ssh commands, #544 - misc. updates and fixes ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/conf.py0000644000076500000240000002025614646713253014707 0ustar00twstaff# documentation build configuration file, created by # sphinx-quickstart on Sat Sep 10 18:18:25 2011. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. import sys import os sys.path.insert(0, os.path.abspath("../src")) from borg import __version__ as sw_version # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = "Borg - Deduplicating Archiver" copyright = "2010-2014 Jonas Borgström, 2015-2022 The Borg Collective (see AUTHORS file)" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. split_char = "+" if "+" in sw_version else "-" version = sw_version.split(split_char)[0] # The full version, including alpha/beta/rc tags. release = version suppress_warnings = ["image.nonlocal_uri"] # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. today_fmt = "%Y-%m-%d" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all documents. # default_role = None # The Borg docs contain no or very little Python docs. # Thus, the primary domain is rst. primary_domain = "rst" # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. import guzzle_sphinx_theme html_theme_path = guzzle_sphinx_theme.html_theme_path() html_theme = "guzzle_sphinx_theme" def set_rst_settings(app): app.env.settings.update({"field_name_limit": 0, "option_limit": 0}) def setup(app): app.add_css_file("css/borg.css") app.connect("builder-inited", set_rst_settings) # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = {"project_nav_name": "Borg %s" % version} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "_static/logo.svg" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "_static/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["borg_theme"] html_extra_path = ["../src/borg/paperkey.html"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = "%Y-%m-%d" # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. html_use_smartypants = True smartquotes_action = "qe" # no D in there means "do not transform -- and ---" # Custom sidebar templates, maps document names to template names. html_sidebars = {"**": ["logo-text.html", "searchbox.html", "globaltoc.html"]} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. html_use_index = False # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. html_show_sourcelink = False # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. html_show_sphinx = False # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. html_show_copyright = False # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "borgdoc" # -- Options for LaTeX output -------------------------------------------------- # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [("book", "Borg.tex", "Borg Documentation", "The Borg Collective", "manual")] # The name of an image file (relative to this directory) to place at the top of # the title page. latex_logo = "_static/logo.pdf" latex_elements = {"papersize": "a4paper", "pointsize": "10pt", "figure_align": "H"} # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. latex_show_urls = "footnote" # Additional stuff for the LaTeX preamble. # latex_preamble = '' # Documents to append as an appendix to all manuals. latex_appendices = ["support", "resources", "changes", "authors"] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ( "usage", "borg", "BorgBackup is a deduplicating backup program with optional compression and authenticated encryption.", ["The Borg Collective (see AUTHORS file)"], 1, ) ] extensions = [ "sphinx.ext.extlinks", "sphinx.ext.autodoc", "sphinx.ext.todo", "sphinx.ext.coverage", "sphinx.ext.viewcode", ] extlinks = { "issue": ("https://github.com/borgbackup/borg/issues/%s", "#%s"), "targz_url": ("https://pypi.python.org/packages/source/b/borgbackup/%%s-%s.tar.gz" % version, None), } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8552847 borgbackup-2.0.0b9/docs/deployment/0000755000076500000240000000000014646755234015570 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment/automated-local.rst0000644000076500000240000001715314646713253021377 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none Automated backups to a local hard drive ======================================= This guide shows how to automate backups to a hard drive directly connected to your computer. If a backup hard drive is connected, backups are automatically started, and the drive shut-down and disconnected when they are done. This guide is written for a Linux-based operating system and makes use of systemd and udev. Overview -------- An udev rule is created to trigger on the addition of block devices. The rule contains a tag that triggers systemd to start a oneshot service. The oneshot service executes a script in the standard systemd service environment, which automatically captures stdout/stderr and logs it to the journal. The script mounts the added block device, if it is a registered backup drive, and creates backups on it. When done, it optionally unmounts the file system and spins the drive down, so that it may be physically disconnected. Configuring the system ---------------------- First, create the ``/etc/backups`` directory (as root). All configuration goes into this directory. Find out the ID of the partition table of your backup disk (here assumed to be /dev/sdz): lsblk --fs -o +PTUUID /dev/sdz Then, create ``/etc/backups/40-backup.rules`` with the following content (all on one line):: ACTION=="add", SUBSYSTEM=="block", ENV{ID_PART_TABLE_UUID}=="", TAG+="systemd", ENV{SYSTEMD_WANTS}="automatic-backup.service" The "systemd" tag in conjunction with the SYSTEMD_WANTS environment variable has systemd launch the "automatic-backup" service, which we will create next, as the ``/etc/backups/automatic-backup.service`` file: .. code-block:: ini [Service] Type=oneshot ExecStart=/etc/backups/run.sh Now, create the main backup script, ``/etc/backups/run.sh``. Below is a template, modify it to suit your needs (e.g. more backup sets, dumping databases etc.). .. code-block:: bash #!/bin/bash -ue # The udev rule is not terribly accurate and may trigger our service before # the kernel has finished probing partitions. Sleep for a bit to ensure # the kernel is done. # # This can be avoided by using a more precise udev rule, e.g. matching # a specific hardware path and partition. sleep 5 # # Script configuration # # The backup partition is mounted there MOUNTPOINT=/mnt/backup # This is the location of the Borg repository TARGET=$MOUNTPOINT/borg-backups/backup.borg # Archive name schema DATE=$(date --iso-8601)-$(hostname) # This is the file that will later contain UUIDs of registered backup drives DISKS=/etc/backups/backup.disks # Find whether the connected block device is a backup drive for uuid in $(lsblk --noheadings --list --output uuid) do if grep --quiet --fixed-strings $uuid $DISKS; then break fi uuid= done if [ ! $uuid ]; then echo "No backup disk found, exiting" exit 0 fi echo "Disk $uuid is a backup disk" partition_path=/dev/disk/by-uuid/$uuid # Mount file system if not already done. This assumes that if something is already # mounted at $MOUNTPOINT, it is the backup drive. It won't find the drive if # it was mounted somewhere else. findmnt $MOUNTPOINT >/dev/null || mount $partition_path $MOUNTPOINT drive=$(lsblk --inverse --noheadings --list --paths --output name $partition_path | head --lines 1) echo "Drive path: $drive" # # Create backups # # Options for borg create BORG_OPTS="--stats --one-file-system --compression lz4 --checkpoint-interval 86400" # Set BORG_PASSPHRASE or BORG_PASSCOMMAND somewhere around here, using export, # if encryption is used. # No one can answer if Borg asks these questions, it is better to just fail quickly # instead of hanging. export BORG_RELOCATED_REPO_ACCESS_IS_OK=no export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=no # Log Borg version borg --version echo "Starting backup for $DATE" # This is just an example, change it however you see fit borg create $BORG_OPTS \ --exclude root/.cache \ --exclude var/lib/docker/devicemapper \ $TARGET::$DATE-$$-system \ / /boot # /home is often a separate partition / file system. # Even if it isn't (add --exclude /home above), it probably makes sense # to have /home in a separate archive. borg create $BORG_OPTS \ --exclude 'sh:home/*/.cache' \ $TARGET::$DATE-$$-home \ /home/ echo "Completed backup for $DATE" # Just to be completely paranoid sync if [ -f /etc/backups/autoeject ]; then umount $MOUNTPOINT hdparm -Y $drive fi if [ -f /etc/backups/backup-suspend ]; then systemctl suspend fi Create the ``/etc/backups/autoeject`` file to have the script automatically eject the drive after creating the backup. Rename the file to something else (e.g. ``/etc/backup/autoeject-no``) when you want to do something with the drive after creating backups (e.g running check). Create the ``/etc/backups/backup-suspend`` file if the machine should suspend after completing the backup. Don't forget to disconnect the device physically before resuming, otherwise you'll enter a cycle. You can also add an option to power down instead. Create an empty ``/etc/backups/backup.disks`` file, you'll register your backup drives there. The last part is actually to enable the udev rules and services: .. code-block:: bash ln -s /etc/backups/40-backup.rules /etc/udev/rules.d/40-backup.rules ln -s /etc/backups/automatic-backup.service /etc/systemd/system/automatic-backup.service systemctl daemon-reload udevadm control --reload Adding backup hard drives ------------------------- Connect your backup hard drive. Format it, if not done already. Find the UUID of the file system that backups should be stored on:: lsblk -o+uuid,label Note the UUID into the ``/etc/backup/backup.disks`` file. Mount the drive to /mnt/backup. Initialize a Borg repository at the location indicated by ``TARGET``:: borg init --encryption ... /mnt/backup/borg-backups/backup.borg Unmount and reconnect the drive, or manually start the ``automatic-backup`` service to start the first backup:: systemctl start --no-block automatic-backup See backup logs using journalctl:: journalctl -fu automatic-backup [-n number-of-lines] Security considerations ----------------------- The script as shown above will mount any file system with an UUID listed in ``/etc/backup/backup.disks``. The UUID check is a safety / annoyance-reduction mechanism to keep the script from blowing up whenever a random USB thumb drive is connected. It is not meant as a security mechanism. Mounting file systems and reading repository data exposes additional attack surfaces (kernel file system drivers, possibly user space services and Borg itself). On the other hand, someone standing right next to your computer can attempt a lot of attacks, most of which are easier to do than e.g. exploiting file systems (installing a physical key logger, DMA attacks, stealing the machine, ...). Borg ensures that backups are not created on random drives that "just happen" to contain a Borg repository. If an unknown unencrypted repository is encountered, then the script aborts (BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=no). Backups are only created on hard drives that contain a Borg repository that is either known (by ID) to your machine or you are using encryption and the passphrase of the repository has to match the passphrase supplied to Borg. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment/central-backup-server.rst0000644000076500000240000001707714646713253022530 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none .. _central-backup-server: Central repository server with Ansible or Salt ============================================== This section will give an example how to set up a borg repository server for multiple clients. Machines -------- There are multiple machines used in this section and will further be named by their respective fully qualified domain name (fqdn). * The backup server: `backup01.srv.local` * The clients: - John Doe's desktop: `johndoe.clnt.local` - Webserver 01: `web01.srv.local` - Application server 01: `app01.srv.local` User and group -------------- The repository server needs to have only one UNIX user for all the clients. Recommended user and group with additional settings: * User: `backup` * Group: `backup` * Shell: `/bin/bash` (or other capable to run the `borg serve` command) * Home: `/home/backup` Most clients shall initiate a backup from the root user to catch all users, groups and permissions (e.g. when backing up `/home`). Folders ------- The following folder tree layout is suggested on the repository server: * User home directory, /home/backup * Repositories path (storage pool): /home/backup/repos * Clients restricted paths (`/home/backup/repos/`): - johndoe.clnt.local: `/home/backup/repos/johndoe.clnt.local` - web01.srv.local: `/home/backup/repos/web01.srv.local` - app01.srv.local: `/home/backup/repos/app01.srv.local` Restrictions ------------ Borg is instructed to restrict clients into their own paths: ``borg serve --restrict-to-path /home/backup/repos/`` The client will be able to access any file or subdirectory inside of ``/home/backup/repos/`` but no other directories. You can allow a client to access several separate directories by passing multiple ``--restrict-to-path`` flags, for instance: ``borg serve --restrict-to-path /home/backup/repos/ --restrict-to-path /home/backup/repos/``, which could make sense if multiple machines belong to one person which should then have access to all the backups of their machines. There is only one ssh key per client allowed. Keys are added for ``johndoe.clnt.local``, ``web01.srv.local`` and ``app01.srv.local``. But they will access the backup under only one UNIX user account as: ``backup@backup01.srv.local``. Every key in ``$HOME/.ssh/authorized_keys`` has a forced command and restrictions applied as shown below: :: command="cd /home/backup/repos/; borg serve --restrict-to-path /home/backup/repos/", restrict .. note:: The text shown above needs to be written on a single line! The options which are added to the key will perform the following: 1. Change working directory 2. Run ``borg serve`` restricted to the client base path 3. Restrict ssh and do not allow stuff which imposes a security risk Due to the ``cd`` command we use, the server automatically changes the current working directory. Then client doesn't need to have knowledge of the absolute or relative remote repository path and can directly access the repositories at ``@:``. .. note:: The setup above ignores all client given commandline parameters which are normally appended to the `borg serve` command. Client ------ The client needs to initialize the `pictures` repository like this: :: borg init backup@backup01.srv.local:pictures Or with the full path (should actually never be used, as only for demonstration purposes). The server should automatically change the current working directory to the `` folder. :: borg init backup@backup01.srv.local:/home/backup/repos/johndoe.clnt.local/pictures When `johndoe.clnt.local` tries to access a not restricted path the following error is raised. John Doe tries to back up into the Web 01 path: :: borg init backup@backup01.srv.local:/home/backup/repos/web01.srv.local/pictures :: ~~~ SNIP ~~~ Remote: borg.remote.PathNotAllowed: /home/backup/repos/web01.srv.local/pictures ~~~ SNIP ~~~ Repository path not allowed Ansible ------- Ansible takes care of all the system-specific commands to add the user, create the folder, install and configure software. :: - hosts: backup01.srv.local vars: user: backup group: backup home: /home/backup pool: "{{ home }}/repos" auth_users: - host: johndoe.clnt.local key: "{{ lookup('file', '/path/to/keys/johndoe.clnt.local.pub') }}" - host: web01.clnt.local key: "{{ lookup('file', '/path/to/keys/web01.clnt.local.pub') }}" - host: app01.clnt.local key: "{{ lookup('file', '/path/to/keys/app01.clnt.local.pub') }}" tasks: - package: name=borg state=present - group: name="{{ group }}" state=present - user: name="{{ user }}" shell=/bin/bash home="{{ home }}" createhome=yes group="{{ group }}" groups= state=present - file: path="{{ home }}" owner="{{ user }}" group="{{ group }}" mode=0700 state=directory - file: path="{{ home }}/.ssh" owner="{{ user }}" group="{{ group }}" mode=0700 state=directory - file: path="{{ pool }}" owner="{{ user }}" group="{{ group }}" mode=0700 state=directory - authorized_key: user="{{ user }}" key="{{ item.key }}" key_options='command="cd {{ pool }}/{{ item.host }};borg serve --restrict-to-path {{ pool }}/{{ item.host }}",restrict' with_items: "{{ auth_users }}" - file: path="{{ home }}/.ssh/authorized_keys" owner="{{ user }}" group="{{ group }}" mode=0600 state=file - file: path="{{ pool }}/{{ item.host }}" owner="{{ user }}" group="{{ group }}" mode=0700 state=directory with_items: "{{ auth_users }}" Salt ---- This is a configuration similar to the one above, configured to be deployed with Salt running on a Debian system. :: Install borg backup from pip: pkg.installed: - pkgs: - python3 - python3-dev - python3-pip - python-virtualenv - libssl-dev - openssl - libacl1-dev - libacl1 - build-essential - libfuse-dev - fuse - pkg-config pip.installed: - pkgs: ["borgbackup"] - bin_env: /usr/bin/pip3 Setup backup user: user.present: - name: backup - fullname: Backup User - home: /home/backup - shell: /bin/bash # CAUTION! # If you change the ssh command= option below, it won't necessarily get pushed to the backup # server correctly unless you delete the ~/.ssh/authorized_keys file and re-create it! {% for host in backupclients %} Give backup access to {{host}}: ssh_auth.present: - user: backup - source: salt://conf/ssh-pubkeys/{{host}}-backup.id_ecdsa.pub - options: - command="cd /home/backup/repos/{{host}}; borg serve --restrict-to-path /home/backup/repos/{{host}}" - restrict {% endfor %} Enhancements ------------ As this section only describes a simple and effective setup, it could be further enhanced when supporting (a limited set) of client supplied commands. A wrapper for starting `borg serve` could be written. Or borg itself could be enhanced to autodetect it runs under SSH by checking the `SSH_ORIGINAL_COMMAND` environment variable. This is left open for future improvements. When extending ssh autodetection in borg no external wrapper script is necessary and no other interpreter or application has to be deployed. See also -------- * `SSH Daemon manpage `_ * `Ansible `_ * `Salt `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment/hosting-repositories.rst0000644000076500000240000000660014646713253022517 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none .. _hosting_repositories: Hosting repositories ==================== This sections shows how to provide repository storage securely for users. Optionally, each user can have a storage quota. Repositories are accessed through SSH. Each user of the service should have her own login which is only able to access the user's files. Technically it would be possible to have multiple users share one login, however, separating them is better. Separate logins increase isolation and are thus an additional layer of security and safety for both the provider and the users. For example, if a user manages to breach ``borg serve`` then she can only damage her own data (assuming that the system does not have further vulnerabilities). Use the standard directory structure of the operating system. Each user is assigned a home directory and repositories of the user reside in her home directory. The following ``~user/.ssh/authorized_keys`` file is the most important piece for a correct deployment. It allows the user to log in via their public key (which must be provided by the user), and restricts SSH access to safe operations only. :: command="borg serve --restrict-to-repository /home//repository",restrict .. note:: The text shown above needs to be written on a **single** line! .. warning:: If this file should be automatically updated (e.g. by a web console), pay **utmost attention** to sanitizing user input. Strip all whitespace around the user-supplied key, ensure that it **only** contains ASCII with no control characters and that it consists of three parts separated by a single space. Ensure that no newlines are contained within the key. The ``restrict`` keyword enables all restrictions, i.e. disables port, agent and X11 forwarding, as well as disabling PTY allocation and execution of ~/.ssh/rc. If any future restriction capabilities are added to authorized_keys files they will be included in this set. The ``command`` keyword forces execution of the specified command line upon login. This must be ``borg serve``. The ``--restrict-to-repository`` option permits access to exactly **one** repository. It can be given multiple times to permit access to more than one repository. The repository may not exist yet; it can be initialized by the user, which allows for encryption. **Storage quotas** can be enabled by adding the ``--storage-quota`` option to the ``borg serve`` command line:: restrict,command="borg serve --storage-quota 20G ..." ... The storage quotas of repositories are completely independent. If a client is able to access multiple repositories, each repository can be filled to the specified quota. If storage quotas are used, ensure that all deployed Borg releases support storage quotas. Refer to :ref:`internals_storage_quota` for more details on storage quotas. **Specificities: Append-only repositories** Running ``borg init`` via a ``borg serve --append-only`` server will **not** create a repository that is configured to be append-only by its repository config. But, ``--append-only`` arguments in ``authorized_keys`` will override the repository config, therefore append-only mode can be enabled on a key by key basis. Refer to the `sshd(8) `_ man page for more details on SSH options. See also :ref:`borg_serve` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment/image-backup.rst0000644000076500000240000001572414646713253020653 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none Backing up entire disk images ============================= Backing up disk images can still be efficient with Borg because its `deduplication`_ technique makes sure only the modified parts of the file are stored. Borg also has optional simple sparse file support for extract. It is of utmost importancy to pin down the disk you want to backup. You need to use the SERIAL for that. Use: .. code-block:: bash # You can find the short disk serial by: # udevadm info --query=property --name=nvme1n1 | grep ID_SERIAL_SHORT | cut -d '=' -f 2 export BORG_REPO=/path/to/repo DISK_SERIAL="7VS0224F" DISK_ID=$(readlink -f /dev/disk/by-id/*"${DISK_SERIAL}") # Returns /dev/nvme1n1 mapfile -t PARTITIONS < <(lsblk -o NAME,TYPE -p -n -l "$DISK_ID" | awk '$2 == "part" {print $1}') echo "Partitions of $DISK_ID:" echo "${PARTITIONS[@]}" echo "Disk Identifier: $DISK_ID" # Use the following line to perform a borg backup for the full disk: # borg create --read-special {now} "$DISK_ID" # Use the following to perform a borg backup for all partitions of the disk # borg create --read-special {now} "${PARTITIONS[@]}" # Example output: # Partitions of /dev/nvme1n1: # /dev/nvme1n1p1 # /dev/nvme1n1p2 # /dev/nvme1n1p3 # Disk Identifier: /dev/nvme1n1 # borg create --read-special {now} /dev/nvme1n1 # borg create --read-special {now} /dev/nvme1n1p1 /dev/nvme1n1p2 /dev/nvme1n1p3 Decreasing the size of image backups ------------------------------------ Disk images are as large as the full disk when uncompressed and might not get much smaller post-deduplication after heavy use because virtually all file systems don't actually delete file data on disk but instead delete the filesystem entries referencing the data. Therefore, if a disk nears capacity and files are deleted again, the change will barely decrease the space it takes up when compressed and deduplicated. Depending on the filesystem, there are several ways to decrease the size of a disk image: Using ntfsclone (NTFS, i.e. Windows VMs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``ntfsclone`` can only operate on filesystems with the journal cleared (i.e. turned-off machines), which somewhat limits its utility in the case of VM snapshots. However, when it can be used, its special image format is even more efficient than just zeroing and deduplicating. For backup, save the disk header and the contents of each partition:: HEADER_SIZE=$(sfdisk -lo Start $DISK | grep -A1 -P 'Start$' | tail -n1 | xargs echo) PARTITIONS=$(sfdisk -lo Device,Type $DISK | sed -e '1,/Device\s*Type/d') dd if=$DISK count=$HEADER_SIZE | borg create repo::hostname-partinfo - echo "$PARTITIONS" | grep NTFS | cut -d' ' -f1 | while read x; do PARTNUM=$(echo $x | grep -Eo "[0-9]+$") ntfsclone -so - $x | borg create repo::hostname-part$PARTNUM - done # to back up non-NTFS partitions as well: echo "$PARTITIONS" | grep -v NTFS | cut -d' ' -f1 | while read x; do PARTNUM=$(echo $x | grep -Eo "[0-9]+$") borg create --read-special repo::hostname-part$PARTNUM $x done Restoration is a similar process:: borg extract --stdout repo::hostname-partinfo | dd of=$DISK && partprobe PARTITIONS=$(sfdisk -lo Device,Type $DISK | sed -e '1,/Device\s*Type/d') borg list --format {archive}{NL} repo | grep 'part[0-9]*$' | while read x; do PARTNUM=$(echo $x | grep -Eo "[0-9]+$") PARTITION=$(echo "$PARTITIONS" | grep -E "$DISKp?$PARTNUM" | head -n1) if echo "$PARTITION" | cut -d' ' -f2- | grep -q NTFS; then borg extract --stdout repo::$x | ntfsclone -rO $(echo "$PARTITION" | cut -d' ' -f1) - else borg extract --stdout repo::$x | dd of=$(echo "$PARTITION" | cut -d' ' -f1) fi done .. note:: When backing up a disk image (as opposed to a real block device), mount it as a loopback image to use the above snippets:: DISK=$(losetup -Pf --show /path/to/disk/image) # do backup as shown above losetup -d $DISK Using zerofree (ext2, ext3, ext4) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``zerofree`` works similarly to ntfsclone in that it zeros out unused chunks of the FS, except it works in place, zeroing the original partition. This makes the backup process a bit simpler:: sfdisk -lo Device,Type $DISK | sed -e '1,/Device\s*Type/d' | grep Linux | cut -d' ' -f1 | xargs -n1 zerofree borg create --read-special repo::hostname-disk $DISK Because the partitions were zeroed in place, restoration is only one command:: borg extract --stdout repo::hostname-disk | dd of=$DISK .. note:: The "traditional" way to zero out space on a partition, especially one already mounted, is simply to ``dd`` from ``/dev/zero`` to a temporary file and delete it. This is ill-advised for the reasons mentioned in the ``zerofree`` man page: - it is slow - it makes the disk image (temporarily) grow to its maximal extent - it (temporarily) uses all free space on the disk, so other concurrent write actions may fail. Virtual machines ---------------- If you use non-snapshotting backup tools like Borg to back up virtual machines, then the VMs should be turned off for the duration of the backup. Backing up live VMs can (and will) result in corrupted or inconsistent backup contents: a VM image is just a regular file to Borg with the same issues as regular files when it comes to concurrent reading and writing from the same file. For backing up live VMs use filesystem snapshots on the VM host, which establishes crash-consistency for the VM images. This means that with most file systems (that are journaling) the FS will always be fine in the backup (but may need a journal replay to become accessible). Usually this does not mean that file *contents* on the VM are consistent, since file contents are normally not journaled. Notable exceptions are ext4 in data=journal mode, ZFS and btrfs (unless nodatacow is used). Applications designed with crash-consistency in mind (most relational databases like PostgreSQL, SQLite etc. but also for example Borg repositories) should always be able to recover to a consistent state from a backup created with crash-consistent snapshots (even on ext4 with data=writeback or XFS). Other applications may require a lot of work to reach application-consistency; it's a broad and complex issue that cannot be explained in entirety here. Hypervisor snapshots capturing most of the VM's state can also be used for backups and can be a better alternative to pure file system based snapshots of the VM's disk, since no state is lost. Depending on the application this can be the easiest and most reliable way to create application-consistent backups. Borg doesn't intend to address these issues due to their huge complexity and platform/software dependency. Combining Borg with the mechanisms provided by the platform (snapshots, hypervisor features) will be the best approach to start tackling them. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment/non-root-user.rst0000644000076500000240000000465314646713253021054 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none .. _non_root_user: ================================ Backing up using a non-root user ================================ This section describes how to run borg as a non-root user and still be able to backup every file on the system. Normally borg is run as the root user to bypass all filesystem permissions and be able to read all files. But in theory this also allows borg to modify or delete files on your system, in case of a bug for example. To eliminate this possibility, we can run borg as a non-root user and give it read-only permissions to all files on the system. Using Linux capabilities inside a systemd service ================================================= One way to do so, is to use linux `capabilities `_ within a systemd service. Linux capabilities allow us to give parts of the privileges the root user has to a non-root user. This works on a per-thread level and does not give the permission to the non-root user as a whole. For this we need to run our backup script from a systemd service and use the `AmbientCapabilities `_ option added in systemd 229. A very basic unit file would look like this: :: [Unit] Description=Borg Backup [Service] Type=oneshot User=borg ExecStart=/usr/local/sbin/backup.sh AmbientCapabilities=CAP_DAC_READ_SEARCH The ``CAP_DAC_READ_SEARCH`` capability gives borg read-only access to all files and directories on the system. This service can then be started manually using ``systemctl start``, a systemd timer or other methods. Restore considerations ====================== When restoring files, the root user should be used. When using the non-root user, borg extract will change all files to be owned by the non-root user. Using borg mount will not allow the non-root user to access files that it would not have access to on the system itself. Other than that, the same restore process, that would be used when running the backup as root, can be used. .. warning:: When using a local repo and running borg commands as root, make sure to only use commands that do not modify the repo itself, like extract or mount. Modifying the repo using the root user will break the repo for the non-root user, since some files inside the repo will now be owned by root. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment/pull-backup.rst0000644000076500000240000005063014646713253020540 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none .. _pull_backup: ======================= Backing up in pull mode ======================= Typically the borg client connects to a backup server using SSH as a transport when initiating a backup. This is referred to as push mode. If you however require the backup server to initiate the connection or prefer it to initiate the backup run, one of the following workarounds is required to allow such a pull mode setup. A common use case for pull mode is to back up a remote server to a local personal computer. SSHFS ===== Assuming you have a pull backup system set up with borg, where a backup server pulls the data from the target via SSHFS. In this mode, the backup client's file system is mounted remotely on the backup server. Pull mode is even possible if the SSH connection must be established by the client via a remote tunnel. Other network file systems like NFS or SMB could be used as well, but SSHFS is very simple to set up and probably the most secure one. There are some restrictions caused by SSHFS. For example, unless you define UID and GID mappings when mounting via ``sshfs``, owners and groups of the mounted file system will probably change, and you may not have access to those files if BorgBackup is not run with root privileges. SSHFS is a FUSE file system and uses the SFTP protocol, so there may be also other unsupported features that the actual implementations of sshfs, libfuse and sftp on the backup server do not support, like file name encodings, ACLs, xattrs or flags. So there is no guarantee that you are able to restore a system completely in every aspect from such a backup. .. warning:: To mount the client's root file system you will need root access to the client. This contradicts to the usual threat model of BorgBackup, where clients don't need to trust the backup server (data is encrypted). In pull mode the server (when logged in as root) could cause unlimited damage to the client. Therefore, pull mode should be used only from servers you do fully trust! .. warning:: Additionally, while being chrooted into the client's root file system, code from the client will be executed. Thus, you should only do that when fully trusting the client. .. warning:: The chroot method was chosen to get the right user and group name-id mappings, assuming they only come from files (/etc/passwd and group). This assumption might be wrong, e.g. if users/groups also come from ldap or other providers. Thus, it might be better to use ``--numeric-ids`` and not archive any user or group names (but just the numeric IDs) and not use chroot. Creating a backup ----------------- Generally, in a pull backup situation there is no direct way for borg to know the client's original UID:GID name mapping of files, because Borg would use ``/etc/passwd`` and ``/etc/group`` of the backup server to map the names. To derive the right names, Borg needs to have access to the client's passwd and group files and use them in the backup process. The solution to this problem is chrooting into an sshfs mounted directory. In this example the whole client root file system is mounted. We use the stand-alone BorgBackup executable and copy it into the mounted file system to make Borg available after entering chroot; this can be skipped if Borg is already installed on the client. :: # Mount client root file system. mkdir /tmp/sshfs sshfs root@host:/ /tmp/sshfs # Mount BorgBackup repository inside it. mkdir /tmp/sshfs/borgrepo mount --bind /path/to/repo /tmp/sshfs/borgrepo # Make borg executable available. cp /usr/local/bin/borg /tmp/sshfs/usr/local/bin/borg # Mount important system directories and enter chroot. cd /tmp/sshfs for i in dev proc sys; do mount --bind /$i $i; done chroot /tmp/sshfs Now we are on the backup system but inside a chroot with the client's root file system. We have a copy of Borg binary in ``/usr/local/bin`` and the repository in ``/borgrepo``. Borg will back up the client's user/group names, and we can create the backup, retaining the original paths, excluding the repository: :: borg create --exclude borgrepo --files-cache ctime,size /borgrepo::archive / For the sake of simplicity only ``borgrepo`` is excluded here. You may want to set up an exclude file with additional files and folders to be excluded. Also note that we have to modify Borg's file change detection behaviour – SSHFS cannot guarantee stable inode numbers, so we have to supply the ``--files-cache`` option. Finally, we need to exit chroot, unmount all the stuff and clean up: :: exit # exit chroot rm /tmp/sshfs/usr/local/bin/borg cd /tmp/sshfs for i in dev proc sys borgrepo; do umount ./$i; done rmdir borgrepo cd ~ umount /tmp/sshfs rmdir /tmp/sshfs Thanks to secuser on IRC for this how-to! Restore methods --------------- The counterpart of a pull backup is a push restore. Depending on the type of restore – full restore or partial restore – there are different methods to make sure the correct IDs are restored. Partial restore ~~~~~~~~~~~~~~~ In case of a partial restore, using the archived UIDs/GIDs might lead to wrong results if the name-to-ID mapping on the target system has changed compared to backup time (might be the case e.g. for a fresh OS install). The workaround again is chrooting into an sshfs mounted directory, so Borg is able to map the user/group names of the backup files to the actual IDs on the client. This example is similar to the backup above – only the Borg command is different: :: # Mount client root file system. mkdir /tmp/sshfs sshfs root@host:/ /tmp/sshfs # Mount BorgBackup repository inside it. mkdir /tmp/sshfs/borgrepo mount --bind /path/to/repo /tmp/sshfs/borgrepo # Make borg executable available. cp /usr/local/bin/borg /tmp/sshfs/usr/local/bin/borg # Mount important system directories and enter chroot. cd /tmp/sshfs for i in dev proc sys; do mount --bind /$i $i; done chroot /tmp/sshfs Now we can run :: borg extract /borgrepo::archive PATH to restore whatever we like partially. Finally, do the clean-up: :: exit # exit chroot rm /tmp/sshfs/usr/local/bin/borg cd /tmp/sshfs for i in dev proc sys borgrepo; do umount ./$i; done rmdir borgrepo cd ~ umount /tmp/sshfs rmdir /tmp/sshfs Full restore ~~~~~~~~~~~~ When doing a full restore, we restore all files (including the ones containing the ID-to-name mapping, ``/etc/passwd`` and ``/etc/group``). Everything will be consistent automatically if we restore the numeric IDs stored in the archive. So there is no need for a chroot environment; we just mount the client file system and extract a backup, utilizing the ``--numeric-ids`` option: :: sshfs root@host:/ /mnt/sshfs cd /mnt/sshfs borg extract --numeric-ids /path/to/repo::archive cd ~ umount /mnt/sshfs Simple (lossy) full restore ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Using ``borg export-tar`` it is possible to stream a backup to the client and directly extract it without the need of mounting with SSHFS: :: borg export-tar /path/to/repo::archive - | ssh root@host 'tar -C / -x' Note that in this scenario the tar format is the limiting factor – it cannot restore all the advanced features that BorgBackup supports. See :ref:`borg_export-tar` for limitations. socat ===== In this setup a SSH connection from the backup server to the client is established that uses SSH reverse port forwarding to tunnel data transparently between UNIX domain sockets on the client and server and the socat tool to connect these with the borg client and server processes, respectively. The program socat has to be available on the backup server and on the client to be backed up. When **pushing** a backup the borg client (holding the data to be backed up) connects to the backup server via ssh, starts ``borg serve`` on the backup server and communicates via standard input and output (transported via SSH) with the process on the backup server. With the help of socat this process can be reversed. The backup server will create a connection to the client (holding the data to be backed up) and will **pull** the data. In the following example *borg-server* connects to *borg-client* to pull a backup. To provide a secure setup sockets should be stored in ``/run/borg``, only accessible to the users that run the backup process. So on both systems, *borg-server* and *borg-client* the folder ``/run/borg`` has to be created:: sudo mkdir -m 0700 /run/borg On *borg-server* the socket file is opened by the user running the ``borg serve`` process writing to the repository so the user has to have read and write permissions on ``/run/borg``:: borg-server:~$ sudo chown borgs /run/borg On *borg-client* the socket file is created by ssh, so the user used to connect to *borg-client* has to have read and write permissions on ``/run/borg``:: borg-client:~$ sudo chown borgc /run/borg On *borg-server*, we have to start the command ``borg serve`` and make its standard input and output available to a unix socket:: borg-server:~$ socat UNIX-LISTEN:/run/borg/reponame.sock,fork EXEC:"borg serve --append-only --restrict-to-path /path/to/repo" Socat will wait until a connection is opened. Then socat will execute the command given, redirecting Standard Input and Output to the unix socket. The optional arguments for ``borg serve`` are not necessary but a sane default. .. note:: When used in production you may also use systemd socket-based activation instead of socat on the server side. You would wrap the ``borg serve`` command in a `service unit`_ and configure a matching `socket unit`_ to start the service whenever a client connects to the socket. .. _service unit: https://www.freedesktop.org/software/systemd/man/systemd.service.html .. _socket unit: https://www.freedesktop.org/software/systemd/man/systemd.socket.html Now we need a way to access the unix socket on *borg-client* (holding the data to be backed up), as we created the unix socket on *borg-server* Opening a SSH connection from the *borg-server* to the *borg-client* with reverse port forwarding can do this for us:: borg-server:~$ ssh -R /run/borg/reponame.sock:/run/borg/reponame.sock borgc@borg-client .. note:: As the default value of OpenSSH for ``StreamLocalBindUnlink`` is ``no``, the socket file created by sshd is not removed. Trying to connect a second time, will print a short warning, and the forwarding does **not** take place:: Warning: remote port forwarding failed for listen path /run/borg/reponame.sock When you are done, you have to remove the socket file manually, otherwise you may see an error like this when trying to execute borg commands:: Remote: YYYY/MM/DD HH:MM:SS socat[XXX] E connect(5, AF=1 "/run/borg/reponame.sock", 13): Connection refused Connection closed by remote host. Is borg working on the server? When a process opens the socket on *borg-client*, SSH will forward all data to the socket on *borg-server*. The next step is to tell borg on *borg-client* to use the unix socket to communicate with the ``borg serve`` command on *borg-server* via the socat socket instead of SSH:: borg-client:~$ export BORG_RSH="sh -c 'exec socat STDIO UNIX-CONNECT:/run/borg/reponame.sock'" The default value for ``BORG_RSH`` is ``ssh``. By default Borg uses SSH to create the connection to the backup server. Therefore Borg parses the repo URL and adds the server name (and other arguments) to the SSH command. Those arguments can not be handled by socat. We wrap the command with ``sh`` to ignore all arguments intended for the SSH command. All Borg commands can now be executed on *borg-client*. For example to create a backup execute the ``borg create`` command:: borg-client:~$ borg create ssh://borg-server/path/to/repo::archive /path_to_backup When automating backup creation, the interactive ssh session may seem inappropriate. An alternative way of creating a backup may be the following command:: borg-server:~$ ssh \ -R /run/borg/reponame.sock:/run/borg/reponame.sock \ borgc@borg-client \ borg create \ --rsh "sh -c 'exec socat STDIO UNIX-CONNECT:/run/borg/reponame.sock'" \ ssh://borg-server/path/to/repo::archive /path_to_backup \ ';' rm /run/borg/reponame.sock This command also automatically removes the socket file after the ``borg create`` command is done. ssh-agent ========= In this scenario *borg-server* initiates an SSH connection to *borg-client* and forwards the authentication agent connection. After that, it works similar to the push mode: *borg-client* initiates another SSH connection back to *borg-server* using the forwarded authentication agent connection to authenticate itself, starts ``borg serve`` and communicates with it. Using this method requires ssh access of user *borgs* to *borgc@borg-client*, where: * *borgs* is the user on the server side with read/write access to local borg repository. * *borgc* is the user on the client side with read access to files meant to be backed up. Applying this method for automated backup operations ---------------------------------------------------- Assume that the borg-client host is untrusted. Therefore we do some effort to prevent a hostile user on the borg-client side to do something harmful. In case of a fully trusted borg-client the method could be simplified. Preparing the server side ~~~~~~~~~~~~~~~~~~~~~~~~~ Do this once for each client on *borg-server* to allow *borgs* to connect itself on *borg-server* using a dedicated ssh key: :: borgs@borg-server$ install -m 700 -d ~/.ssh/ borgs@borg-server$ ssh-keygen -N '' -t rsa -f ~/.ssh/borg-client_key borgs@borg-server$ { echo -n 'command="borg serve --append-only --restrict-to-repo ~/repo",restrict '; cat ~/.ssh/borg-client_key.pub; } >> ~/.ssh/authorized_keys borgs@borg-server$ chmod 600 ~/.ssh/authorized_keys ``install -m 700 -d ~/.ssh/`` Create directory ~/.ssh with correct permissions if it does not exist yet. ``ssh-keygen -N '' -t rsa -f ~/.ssh/borg-client_key`` Create an ssh key dedicated to communication with borg-client. .. note:: Another more complex approach is using a unique ssh key for each pull operation. This is more secure as it guarantees that the key will not be used for other purposes. ``{ echo -n 'command="borg serve --append-only --restrict-to-repo ~/repo",restrict '; cat ~/.ssh/borg-client_key.pub; } >> ~/.ssh/authorized_keys`` Add borg-client's ssh public key to ~/.ssh/authorized_keys with forced command and restricted mode. The borg client is restricted to use one repo at the specified path and to append-only operation. Commands like *delete*, *prune* and *compact* have to be executed another way, for example directly on *borg-server* side or from a privileged, less restricted client (using another authorized_keys entry). ``chmod 600 ~/.ssh/authorized_keys`` Fix permissions of ~/.ssh/authorized_keys. Pull operation ~~~~~~~~~~~~~~ Initiating borg command execution from *borg-server* (e.g. init):: borgs@borg-server$ ( eval $(ssh-agent) > /dev/null ssh-add -q ~/.ssh/borg-client_key echo 'your secure borg key passphrase' | \ ssh -A -o StrictHostKeyChecking=no borgc@borg-client "BORG_PASSPHRASE=\$(cat) borg --rsh 'ssh -o StrictHostKeyChecking=no' init --encryption repokey ssh://borgs@borg-server/~/repo" kill "${SSH_AGENT_PID}" ) Parentheses around commands are needed to avoid interference with a possibly already running ssh-agent. Parentheses are not needed when using a dedicated bash process. ``eval $(ssh-agent) > /dev/null`` Run the SSH agent in the background and export related environment variables to the current bash session. ``ssh-add -q ~/.ssh/borg-client_key`` Load the SSH private key dedicated to communication with the borg-client into the SSH agent. Look at ``man 1 ssh-add`` for a more detailed explanation. .. note:: Care needs to be taken when loading keys into the SSH agent. Users on the *borg-client* having read/write permissions to the agent's UNIX-domain socket (at least borgc and root in our case) can access the agent on *borg-server* through the forwarded connection and can authenticate using any of the identities loaded into the agent (look at ``man 1 ssh`` for more detailed explanation). Therefore there are some security considerations: * Private keys loaded into the agent must not be used to enable access anywhere else. * The keys meant to be loaded into the agent must be specified explicitly, not from default locations. * The *borg-client*'s entry in *borgs@borg-server:~/.ssh/authorized_keys* must be as restrictive as possible. ``echo 'your secure borg key passphrase' | ssh -A -o StrictHostKeyChecking=no borgc@borg-client "BORG_PASSPHRASE=\$(cat) borg --rsh 'ssh -o StrictHostKeyChecking=no' init --encryption repokey ssh://borgs@borg-server/~/repo"`` Run the *borg init* command on *borg-client*. *ssh://borgs@borg-server/~/repo* refers to the repository *repo* within borgs's home directory on *borg-server*. *StrictHostKeyChecking=no* is used to add host keys automatically to *~/.ssh/known_hosts* without user intervention. ``kill "${SSH_AGENT_PID}"`` Kill ssh-agent with loaded keys when it is not needed anymore. Remote forwarding ================= The standard ssh client allows to create tunnels to forward local ports to a remote server (local forwarding) and also to allow remote ports to be forwarded to local ports (remote forwarding). This remote forwarding can be used to allow remote backup clients to access the backup server even if the backup server cannot be reached by the backup client. This can even be used in cases where neither the backup server can reach the backup client and the backup client cannot reach the backup server, but some intermediate host can access both. A schematic approach is as follows :: Backup Server (backup@mybackup) Intermediate Machine (john@myinter) Backup Client (bob@myclient) 1. Establish SSH remote forwarding -----------> SSH listen on local port 2. Starting ``borg create`` establishes 3. SSH forwards to intermediate machine <------- SSH connection to the local port 4. Receives backup connection <------- and further on to backup server via SSH So for the backup client the backup is done via SSH to a local port and for the backup server there is a normal backup performed via ssh. In order to achieve this, the following commands can be used to create the remote port forwarding: 1. On machine ``myinter`` ``ssh bob@myclient -v -C -R 8022:mybackup:22 -N`` This will listen for ssh-connections on port ``8022`` on ``myclient`` and forward connections to port 22 on ``mybackup``. You can also remove the need for machine ``myinter`` and create the port forwarding on the backup server directly by using ``localhost`` instead of ``mybackup`` 2. On machine ``myclient`` ``borg create -v --progress --stats ssh://backup@localhost:8022/home/backup/repos/myclient /`` Make sure to use port ``8022`` and ``localhost`` for the repository as this instructs borg on ``myclient`` to use the remote forwarded ssh connection. SSH Keys -------- If you want to automate backups when using this method, the ssh ``known_hosts`` and ``authorized_keys`` need to be set up to allow connections. Security Considerations ----------------------- Opening up SSH access this way can pose a security risk as it effectively opens remote access to your backup server on the client even if it is located outside of your company network. To reduce the chances of compromise, you should configure a forced command in ``authorized_keys`` to prevent anyone from performing any other action on the backup server. This can be done e.g. by adding the following in ``$HOME/.ssh/authorized_keys`` on ``mybackup`` with proper path and client-fqdn: :: command="cd /home/backup/repos/;borg serve --restrict-to-path /home/backup/repos/" All the additional security considerations for borg should be applied, see :ref:`central-backup-server` for some additional hints. More information ---------------- See `remote forwarding`_ and the `ssh man page`_ for more information about remote forwarding. .. _remote forwarding: https://linuxize.com/post/how-to-setup-ssh-tunneling/ .. _ssh man page: https://manpages.debian.org/testing/manpages-de/ssh.1.de.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/deployment.rst0000644000076500000240000000054514646713253016321 0ustar00twstaff.. include:: global.rst.inc .. highlight:: none Deployment ========== This chapter details deployment strategies for the following scenarios. .. toctree:: :titlesonly: deployment/central-backup-server deployment/hosting-repositories deployment/automated-local deployment/image-backup deployment/pull-backup deployment/non-root-user ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/development.rst0000644000076500000240000004105714646713253016466 0ustar00twstaff.. include:: global.rst.inc .. highlight:: bash .. _development: Development =========== This chapter will get you started with Borg development. Borg is written in Python (with a little bit of Cython and C for the performance critical parts). Contributions ------------- ... are welcome! Some guidance for contributors: - Discuss changes on the GitHub issue tracker, on IRC or on the mailing list. - Make your PRs on the ``master`` branch (see `Branching Model`_ for details). - Do clean changesets: - Focus on some topic, resist changing anything else. - Do not do style changes mixed with functional changes. - Try to avoid refactorings mixed with functional changes. - If you need to fix something after commit/push: - If there are ongoing reviews: do a fixup commit you can squash into the bad commit later. - If there are no ongoing reviews or you did not push the bad commit yet: amend the commit to include your fix or merge the fixup commit before pushing. - Have a nice, clear, typo-free commit comment. - If you fixed an issue, refer to it in your commit comment. - Follow the style guide (see below). - If you write new code, please add tests and docs for it. - Run the tests, fix any issues that come up. - Make a pull request on GitHub. - Wait for review by other developers. Branching model --------------- Borg development happens on the ``master`` branch and uses GitHub pull requests (if you don't have GitHub or don't want to use it you can send smaller patches via the borgbackup mailing list to the maintainers). Stable releases are maintained on maintenance branches named ``x.y-maint``, eg. the maintenance branch of the 1.2.x series is ``1.2-maint``. Most PRs should be filed against the ``master`` branch. Only if an issue affects **only** a particular maintenance branch a PR should be filed against it directly. While discussing / reviewing a PR it will be decided whether the change should be applied to maintenance branches. Each maintenance branch has a corresponding *backport/x.y-maint* label, which will then be applied. Changes that are typically considered for backporting: - Data loss, corruption and inaccessibility fixes. - Security fixes. - Forward-compatibility improvements. - Documentation corrections. .. rubric:: Maintainer part From time to time a maintainer will backport the changes for a maintenance branch, typically before a release or if enough changes were collected: 1. Notify others that you're doing this to avoid duplicate work. 2. Branch a backporting branch off the maintenance branch. 3. Cherry pick and backport the changes from each labelled PR, remove the label for each PR you've backported. To preserve authorship metadata, do not follow the ``git cherry-pick`` instructions to use ``git commit`` after resolving conflicts. Instead, stage conflict resolutions and run ``git cherry-pick --continue``, much like using ``git rebase``. To avoid merge issues (a cherry pick is a form of merge), use these options (similar to the ``git merge`` options used previously, the ``-x`` option adds a reference to the original commit):: git cherry-pick --strategy recursive -X rename-threshold=5% -x 4. Make a PR of the backporting branch against the maintenance branch for backport review. Mention the backported PRs in this PR, e.g.: Includes changes from #2055 #2057 #2381 This way GitHub will automatically show in these PRs where they were backported. .. rubric:: Historic model Previously (until release 1.0.10) Borg used a `"merge upwards" `_ model where most minor changes and fixes where committed to a maintenance branch (eg. 1.0-maint), and the maintenance branch(es) were regularly merged back into the main development branch. This became more and more troublesome due to merges growing more conflict-heavy and error-prone. How to submit a pull request ---------------------------- In order to contribute to Borg, you will need to fork the ``borgbackup/borg`` main repository to your own Github repository. Then clone your Github repository to your local machine. The instructions for forking and cloning a repository can be found there: ``_ . To work on your contribution, you first need to decide which branch your pull request should be against. Often, this might be master branch (esp. for big / risky contributions), but it could be also a maintenance branch like e.g. 1.4-maint (esp. for small fixes that should go into next maintenance release, e.g. 1.4.x). Start by checking out the appropriate branch: :: git checkout master It is best practice for a developer to keep local ``master`` branch as an uptodate copy of the upstream ``master`` branch and always do own work in a separate feature or bugfix branch. This is useful to be able to rebase own branches onto the upstream branches they were branched from, if necessary. This also applies to other upstream branches (like e.g. ``1.4-maint``), not only to ``master``. Thus, create a new branch now: :: git checkout -b MYCONTRIB-master # choose an appropriate own branch name Now, work on your contribution in that branch. Use these git commands: :: git status # is there anything that needs to be added? git add ... # if so, add it git commit # finally, commit it. use a descriptive comment. Then push the changes to your Github repository: :: git push --set-upstream origin MYCONTRIB-master Finally, make a pull request on ``borgbackup/borg`` Github repository against the appropriate branch (e.g. ``master``) so that your changes can be reviewed. What to do if work was accidentally started in wrong branch ----------------------------------------------------------- If you accidentally worked in ``master`` branch, check out the ``master`` branch and make sure there are no uncommitted changes. Then, create a feature branch from that, so that your contribution is in a feature branch. :: git checkout master git checkout -b MYCONTRIB-master Next, check out the ``master`` branch again. Find the commit hash of the last commit that was made before you started working on your contribution and perform a hard reset. :: git checkout master git log git reset --hard THATHASH Then, update the local ``master`` branch with changes made in the upstream repository. :: git pull borg master Rebase feature branch onto updated master branch ------------------------------------------------ After updating the local ``master`` branch from upstream, the feature branch can be checked out and rebased onto (the now uptodate) ``master`` branch. :: git checkout MYCONTRIB-master git rebase -i master Next, check if there are any commits that exist in the feature branch but not in the ``master`` branch and vice versa. If there are no conflicts or after resolving them, push your changes to your Github repository. :: git log git diff master git push -f Code and issues --------------- Code is stored on GitHub, in the `Borgbackup organization `_. `Issues `_ and `pull requests `_ should be sent there as well. See also the :ref:`support` section for more details. Style guide / Automated Code Formatting --------------------------------------- We use `black`_ for automatically formatting the code. If you work on the code, it is recommended that you run black **before each commit** (so that new code is always using the desired formatting and no additional commits are required to fix the formatting). :: pip install -r requirements.d/codestyle.txt # everybody use same black version black --check . # only check, don't change black . # reformat the code The CI workflows will check the code formatting and will fail if it is not formatted correctly. When (mass-)reformatting existing code, we need to avoid ruining `git blame`, so please follow their `guide about avoiding ruining git blame`_: .. _black: https://black.readthedocs.io/ .. _guide about avoiding ruining git blame: https://black.readthedocs.io/en/stable/guides/introducing_black_to_your_project.html#avoiding-ruining-git-blame Continuous Integration ---------------------- All pull requests go through `GitHub Actions`_, which runs the tests on misc. Python versions and on misc. platforms as well as some additional checks. .. _GitHub Actions: https://github.com/borgbackup/borg/actions Output and Logging ------------------ When writing logger calls, always use correct log level (debug only for debugging, info for informative messages, warning for warnings, error for errors, critical for critical errors/states). When directly talking to the user (e.g. Y/N questions), do not use logging, but directly output to stderr (not: stdout, it could be connected to a pipe). To control the amount and kinds of messages output emitted at info level, use flags like ``--stats`` or ``--list``, then create a topic logger for messages controlled by that flag. See ``_setup_implied_logging()`` in ``borg/archiver.py`` for the entry point to topic logging. Building a development environment ---------------------------------- First, just install borg into a virtual env :ref:`as described before `. To install some additional packages needed for running the tests, activate your virtual env and run:: pip install -r requirements.d/development.txt This project utilizes pre-commit to format and lint code before it is committed. Although pre-commit is installed when running the command above, the pre-commit hooks will have to be installed separately. Run this command to install the pre-commit hooks:: pre-commit install Running the tests ----------------- The tests are in the borg/testsuite package. To run all the tests, you need to have fakeroot installed. If you do not have fakeroot, you still will be able to run most tests, just leave away the `fakeroot -u` from the given command lines. To run the test suite use the following command:: fakeroot -u tox # run all tests Some more advanced examples:: # verify a changed tox.ini (run this after any change to tox.ini): fakeroot -u tox --recreate fakeroot -u tox -e py39 # run all tests, but only on python 3.9 fakeroot -u tox borg.testsuite.locking # only run 1 test module fakeroot -u tox borg.testsuite.locking -- -k '"not Timer"' # exclude some tests fakeroot -u tox borg.testsuite -- -v # verbose py.test Important notes: - When using ``--`` to give options to py.test, you MUST also give ``borg.testsuite[.module]``. Running the tests (using the pypi package) ------------------------------------------ Since borg 1.4, it is also possible to run the tests without a development environment, using the borgbackup dist package (downloaded from pypi.org or github releases page):: # optional: create and use a virtual env: python3 -m venv env . env/bin/activate # install packages pip install borgbackup pip install pytest pytest-benchmark # method A: use a pytest.ini cat >pytest.ini <<`_ with the new version number and release date. - Announce on: - Mailing list. - Twitter. - IRC channel (change ``/topic``). - Create a GitHub release, include: * pypi dist package and signature * Standalone binaries (see above for how to create them). + For macOS, document the macFUSE version in the README of the binaries. macFUSE uses a kernel extension that needs to be compatible with the code contained in the binary. * A link to ``CHANGES.rst``. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/faq.rst0000644000076500000240000015207514646713253014716 0ustar00twstaff.. include:: global.rst.inc .. highlight:: none .. _faq: Frequently asked questions ========================== Usage & Limitations ################### What is the difference between a repo on an external hard drive vs. repo on a server? ------------------------------------------------------------------------------------- If Borg is running in client/server mode, the client uses SSH as a transport to talk to the remote agent, which is another Borg process (Borg is installed on the server, too) started automatically by the client. The Borg server is doing storage-related low-level repo operations (get, put, commit, check, compact), while the Borg client does the high-level stuff: deduplication, encryption, compression, dealing with archives, backups, restores, etc., which reduces the amount of data that goes over the network. When Borg is writing to a repo on a locally mounted remote file system, e.g. SSHFS, the Borg client only can do file system operations and has no agent running on the remote side, so *every* operation needs to go over the network, which is slower. Can I back up from multiple servers into a single repository? ------------------------------------------------------------- In order for the deduplication used by Borg to work, it needs to keep a local cache containing checksums of all file chunks already stored in the repository. This cache is stored in ``~/.cache/borg/``. If Borg detects that a repository has been modified since the local cache was updated it will need to rebuild the cache. This rebuild can be quite time consuming. So, yes it's possible. But it will be most efficient if a single repository is only modified from one place. Also keep in mind that Borg will keep an exclusive lock on the repository while creating or deleting archives, which may make *simultaneous* backups fail. Can I back up to multiple, swapped backup targets? -------------------------------------------------- It is possible to swap your backup disks if each backup medium is assigned its own repository by creating a new one with :ref:`borg_rcreate`. Can I copy or synchronize my repo to another location? ------------------------------------------------------ If you want to have redundant backup repositories (preferably at separate locations), the recommended way to do that is like this: - ``borg rcreate repo1 --encryption=X`` - ``borg rcreate repo2 --encryption=X --other-repo=repo1`` - maybe do a snapshot to have stable and same input data for both borg create. - client machine ---borg create---> repo1 - client machine ---borg create---> repo2 This will create distinct (different repo ID), but related repositories. Related means using the same chunker secret and the same id_key, thus producing the same chunks / the same chunk ids if the input data is the same. The 2 independent borg create invocations mean that there is no error propagation from repo1 to repo2 when done like that. An alternative way would be to use ``borg transfer`` to copy backup archives from repo1 to repo2. Likely a bit more efficient and the archives would be identical, but suffering from potential error propagation. Warning: using borg with multiple repositories with identical repository ID (like when creating 1:1 repository copies) is not supported and can lead to all sorts of issues, like e.g. cache coherency issues, malfunction, data corruption. "this is either an attack or unsafe" warning -------------------------------------------- About the warning: Cache, or information obtained from the security directory is newer than repository - this is either an attack or unsafe (multiple repos with same ID) "unsafe": If not following the advice from the previous section, you can easily run into this by yourself by restoring an older copy of your repository. "attack": maybe an attacker has replaced your repo by an older copy, trying to trick you into AES counter reuse, trying to break your repo encryption. Borg users have also reported that fs issues (like hw issues / I/O errors causing the fs to become read-only) can cause this warning, see :issue:`7853`. If you decide to ignore this and accept unsafe operation for this repository, you could delete the manifest-timestamp and the local cache: :: borg config id # shows the REPO_ID rm ~/.config/borg/security/REPO_ID/manifest-timestamp borg rdelete --cache-only This is an unsafe and unsupported way to use borg, you have been warned. Which file types, attributes, etc. are *not* preserved? ------------------------------------------------------- * UNIX domain sockets (because it does not make sense - they are meaningless without the running process that created them and the process needs to recreate them in any case). So, don't panic if your backup misses a UDS! * The precise on-disk (or rather: not-on-disk) representation of the holes in a sparse file. Archive creation has no special support for sparse files, holes are backed up as (deduplicated and compressed) runs of zero bytes. Archive extraction has optional support to extract all-zero chunks as holes in a sparse file. * Some filesystem specific attributes, like btrfs NOCOW, see :ref:`platforms`. Are there other known limitations? ---------------------------------- - borg extract supports restoring only into an empty destination. After extraction, the destination will have exactly the contents of the extracted archive. If you extract into a non-empty destination, borg will (for example) not remove files which are in the destination, but not in the archive. See :issue:`4598` for a workaround and more details. .. _checkpoints_parts: If a backup stops mid-way, does the already-backed-up data stay there? ---------------------------------------------------------------------- Yes, Borg supports resuming backups. During a backup, a special checkpoint archive named ``.checkpoint`` is saved at every checkpoint interval (the default value for this is 30 minutes) containing all the data backed-up until that point. This checkpoint archive is a valid archive, but it is only a partial backup (not all files that you wanted to back up are contained in it and the last file in it might be a partial file). Having it in the repo until a successful, full backup is completed is useful because it references all the transmitted chunks up to the checkpoint. This means that in case of an interruption, you only need to retransfer the data since the last checkpoint. If a backup was interrupted, you normally do not need to do anything special, just invoke ``borg create`` as you always do. If the repository is still locked, you may need to run ``borg break-lock`` before the next backup. You may use the same archive name as in previous attempt or a different one (e.g. if you always include the current datetime), it does not matter. Borg always does full single-pass backups, so it will start again from the beginning - but it will be much faster, because some of the data was already stored into the repo (and is still referenced by the checkpoint archive), so it does not need to get transmitted and stored again. Once your backup has finished successfully, you can delete all ``.checkpoint`` archives. If you run ``borg prune``, it will also care for deleting unneeded checkpoints. Note: the checkpointing mechanism may create a partial (truncated) last file in a checkpoint archive named ``.borg_part``. Such partial files won't be contained in the final archive. This is done so that checkpoints work cleanly and promptly while a big file is being processed. How can I back up huge file(s) over a unstable connection? ---------------------------------------------------------- Yes. For more details, see :ref:`checkpoints_parts`. How can I restore huge file(s) over an unstable connection? ----------------------------------------------------------- Try using ``borg mount`` and ``rsync`` (or a similar tool that supports resuming a partial file copy from what's already copied). How can I switch append-only mode on and off? ----------------------------------------------------------------------------------------------------------------------------------- You could do that (via borg config REPO append_only 0/1), but using different ssh keys and different entries in ``authorized_keys`` is much easier and also maybe has less potential of things going wrong somehow. My machine goes to sleep causing `Broken pipe` ---------------------------------------------- While backing up your data over the network, your machine should not go to sleep. On macOS you can use `caffeinate` to avoid that. How can I compare contents of an archive to my local filesystem? ----------------------------------------------------------------- You can instruct ``export-tar`` to send a tar stream to the stdout, and then use ``tar`` to perform the comparison: :: borg export-tar archive-name - | tar --compare -f - -C /path/to/compare/to Can Borg add redundancy to the backup data to deal with hardware malfunction? ----------------------------------------------------------------------------- No, it can't. While that at first sounds like a good idea to defend against some defect HDD sectors or SSD flash blocks, dealing with this in a reliable way needs a lot of low-level storage layout information and control which we do not have (and also can't get, even if we wanted). So, if you need that, consider RAID or a filesystem that offers redundant storage or just make backups to different locations / different hardware. See also :issue:`225`. Can Borg verify data integrity of a backup archive? --------------------------------------------------- Yes, if you want to detect accidental data damage (like bit rot), use the ``check`` operation. It will notice corruption using CRCs and hashes. If you want to be able to detect malicious tampering also, use an encrypted repo. It will then be able to check using CRCs and HMACs. Can I use Borg on SMR hard drives? ---------------------------------- SMR (shingled magnetic recording) hard drives are very different from regular hard drives. Applications have to behave in certain ways or performance will be heavily degraded. Borg ships with default settings suitable for SMR drives, and has been successfully tested on *Seagate Archive v2* drives using the ext4 file system. Some Linux kernel versions between 3.19 and 4.5 had various bugs handling device-managed SMR drives, leading to IO errors, unresponsive drives and unreliable operation in general. For more details, refer to :issue:`2252`. .. _faq-integrityerror: I get an IntegrityError or similar - what now? ---------------------------------------------- A single error does not necessarily indicate bad hardware or a Borg bug. All hardware exhibits a bit error rate (BER). Hard drives are typically specified as exhibiting fewer than one error every 12 to 120 TB (one bit error in 10e14 to 10e15 bits). The specification is often called *unrecoverable read error rate* (URE rate). Apart from these very rare errors there are two main causes of errors: (i) Defective hardware: described below. (ii) Bugs in software (Borg, operating system, libraries): Ensure software is up to date. Check whether the issue is caused by any fixed bugs described in :ref:`important_notes`. .. rubric:: Finding defective hardware .. note:: Hardware diagnostics are operating system dependent and do not apply universally. The commands shown apply for popular Unix-like systems. Refer to your operating system's manual. Checking hard drives Find the drive containing the repository and use *findmnt*, *mount* or *lsblk* to learn the device path (typically */dev/...*) of the drive. Then, smartmontools can retrieve self-diagnostics of the drive in question:: # smartctl -a /dev/sdSomething The *Offline_Uncorrectable*, *Current_Pending_Sector* and *Reported_Uncorrect* attributes indicate data corruption. A high *UDMA_CRC_Error_Count* usually indicates a bad cable. I/O errors logged by the system (refer to the system journal or dmesg) can point to issues as well. I/O errors only affecting the file system easily go unnoticed, since they are not reported to applications (e.g. Borg), while these errors can still corrupt data. Drives can corrupt some sectors in one event, while remaining reliable otherwise. Conversely, drives can fail completely with no advance warning. If in doubt, copy all data from the drive in question to another drive -- just in case it fails completely. If any of these are suspicious, a self-test is recommended:: # smartctl -t long /dev/sdSomething Running ``fsck`` if not done already might yield further insights. Checking memory Intermittent issues, such as ``borg check`` finding errors inconsistently between runs, are frequently caused by bad memory. Run memtest86+ (or an equivalent memory tester) to verify that the memory subsystem is operating correctly. Checking processors Processors rarely cause errors. If they do, they are usually overclocked or otherwise operated outside their specifications. We do not recommend to operate hardware outside its specifications for productive use. Tools to verify correct processor operation include Prime95 (mprime), linpack, and the `Intel Processor Diagnostic Tool `_ (applies only to Intel processors). .. rubric:: Repairing a damaged repository With any defective hardware found and replaced, the damage done to the repository needs to be ascertained and fixed. :ref:`borg_check` provides diagnostics and ``--repair`` options for repositories with issues. We recommend to first run without ``--repair`` to assess the situation. If the found issues and proposed repairs seem right, re-run "check" with ``--repair`` enabled. How probable is it to get a hash collision problem? --------------------------------------------------- If you noticed, there are some issues (:issue:`170` (**warning: hell**) and :issue:`4884`) about the probability of a chunk having the same hash as another chunk, making the file corrupted because it grabbed the wrong chunk. This is called the `Birthday Problem `_. There is a lot of probability in here so, I can give you my interpretation of such math but it's honestly better that you read it yourself and grab your own resolution from that. Assuming that all your chunks have a size of :math:`2^{21}` bytes (approximately 2.1 MB) and we have a "perfect" hash algorithm, we can think that the probability of collision would be of :math:`p^2/2^{n+1}` then, using SHA-256 (:math:`n=256`) and for example we have 1000 million chunks (:math:`p=10^9`) (1000 million chunks would be about 2100TB). The probability would be around 0.0000000000000000000000000000000000000000000000000000000000043. A mass-murderer space rock happens about once every 30 million years on average. This leads to a probability of such an event occurring in the next second to about :math:`10^{-15}`. That's **45** orders of magnitude more probable than the SHA-256 collision. Briefly stated, if you find SHA-256 collisions scary then your priorities are wrong. This example was grabbed from `this SO answer `_, it's great honestly. Still, the real question is whether Borg tries not to make this happen? Well... previously it did not check anything until there was a feature added which saves the size of the chunks too, so the size of the chunks is compared to the size that you got with the hash and if the check says there is a mismatch it will raise an exception instead of corrupting the file. This doesn't save us from everything but reduces the chances of corruption. There are other ways of trying to escape this but it would affect performance so much that it wouldn't be worth it and it would contradict Borg's design, so if you don't want this to happen, simply don't use Borg. Why is the time elapsed in the archive stats different from wall clock time? ---------------------------------------------------------------------------- Borg needs to write the time elapsed into the archive metadata before finalizing the archive and committing the repo & cache. This means when Borg is run with e.g. the ``time`` command, the duration shown in the archive stats may be shorter than the full time the command runs for. How do I configure different prune policies for different directories? ---------------------------------------------------------------------- Say you want to prune ``/var/log`` faster than the rest of ``/``. How do we implement that? The answer is to back up to different archive *names* and then implement different prune policies for different prefixes. For example, you could have a script that does:: borg create --exclude var/log main-$(date +%Y-%m-%d) / borg create logs-$(date +%Y-%m-%d) /var/log Then you would have two different prune calls with different policies:: borg prune --verbose --list -d 30 -a 'sh:main-*' borg prune --verbose --list -d 7 -a 'sh:logs-*' This will keep 7 days of logs and 30 days of everything else. How do I remove files from an existing backup? ---------------------------------------------- A file is only removed from a BorgBackup repository if all archives that contain the file are deleted and the corresponding data chunks are removed from the repository. There are two ways how to remove files from a repository. 1. Use :ref:`borg_delete` to remove all archives that contain the files. This will of course delete everything in the archive, not only some files. 2. If you really want to remove only some specific files, you can run the :ref:`borg_recreate` command to rewrite all archives with a different ``--exclude`` pattern. See the examples in the manpage for more information. Finally, run :ref:`borg_compact` with the ``--threshold 0`` option to delete the data chunks from the repository. Can I safely change the compression level or algorithm? -------------------------------------------------------- The compression level and algorithm don't affect deduplication. Chunk ID hashes are calculated *before* compression. New compression settings will only be applied to new chunks, not existing chunks. So it's safe to change them. Security ######## .. _home_config_borg: How important is the $HOME/.config/borg directory? -------------------------------------------------- The Borg config directory has content that you should take care of: ``keys`` subdirectory All your borg keyfile keys are stored in this directory. Please note that borg repokey keys are stored inside the repository. You MUST make sure to have an independent backup of these keyfiles, otherwise you cannot access your backups anymore if you lose them. You also MUST keep these files secret; everyone who gains access to your repository and has the corresponding keyfile (and the key passphrase) can extract it. Make sure that only you have access to the Borg config directory. .. _home_data_borg: How important is the $HOME/.local/share/borg directory? ------------------------------------------------------- The Borg data directory has content that you should take care of: ``security`` subdirectory Each directory here represents one Borg repository by its ID and contains the last known status. If a repository's status is different from this information at the beginning of BorgBackup operation, Borg outputs warning messages and asks for confirmation, so make sure you do not lose or manipulate these files. However, apart from those warnings, a loss of these files can be recovered. Make sure that only you have access to the Borg data directory. .. _cache_security: Do I need to take security precautions regarding the cache? ----------------------------------------------------------- The cache contains a lot of metadata information about the files in your repositories and it is not encrypted. However, the assumption is that the cache is being stored on the very same system which also contains the original files which are being backed up. So someone with access to the cache files would also have access the original files anyway. The Internals section contains more details about :ref:`cache`. If you ever need to move the cache to a different location, this can be achieved by using the appropriate :ref:`env_vars`. How can I specify the encryption passphrase programmatically? ------------------------------------------------------------- There are several ways to specify a passphrase without human intervention: Setting ``BORG_PASSPHRASE`` The passphrase can be specified using the ``BORG_PASSPHRASE`` environment variable. This is often the simplest option, but can be insecure if the script that sets it is world-readable. .. _password_env: .. note:: Be careful how you set the environment; using the ``env`` command, a ``system()`` call or using inline shell scripts (e.g. ``BORG_PASSPHRASE=hunter2 borg ...``) might expose the credentials in the process list directly and they will be readable to all users on a system. Using ``export`` in a shell script file should be safe, however, as the environment of a process is `accessible only to that user `_. Using ``BORG_PASSCOMMAND`` with a file of proper permissions Another option is to create a file with a password in it in your home directory and use permissions to keep anyone else from reading it. For example, first create a key:: (umask 0077; head -c 32 /dev/urandom | base64 -w 0 > ~/.borg-passphrase) Then in an automated script one can put:: export BORG_PASSCOMMAND="cat $HOME/.borg-passphrase" and Borg will automatically use that passphrase. Using keyfile-based encryption with a blank passphrase It is possible to encrypt your repository in ``keyfile`` mode instead of the default ``repokey`` mode and use a blank passphrase for the key file (simply press Enter twice when ``borg rcreate`` asks for the password). See :ref:`encrypted_repos` for more details. Using ``BORG_PASSCOMMAND`` with macOS Keychain macOS has a native manager for secrets (such as passphrases) which is safer than just using a file as it is encrypted at rest and unlocked manually (fortunately, the login keyring automatically unlocks when you log in). With the built-in ``security`` command, you can access it from the command line, making it useful for ``BORG_PASSCOMMAND``. First generate a passphrase and use ``security`` to save it to your login (default) keychain:: security add-generic-password -D secret -U -a $USER -s borg-passphrase -w $(head -c 32 /dev/urandom | base64 -w 0) In your backup script retrieve it in the ``BORG_PASSCOMMAND``:: export BORG_PASSCOMMAND="security find-generic-password -a $USER -s borg-passphrase -w" Using ``BORG_PASSCOMMAND`` with GNOME Keyring GNOME also has a keyring daemon that can be used to store a Borg passphrase. First ensure ``libsecret-tools``, ``gnome-keyring`` and ``libpam-gnome-keyring`` are installed. If ``libpam-gnome-keyring`` wasn't already installed, ensure it runs on login:: sudo sh -c "echo session optional pam_gnome_keyring.so auto_start >> /etc/pam.d/login" sudo sh -c "echo password optional pam_gnome_keyring.so >> /etc/pam.d/passwd" # you may need to relogin afterwards to activate the login keyring Then add a secret to the login keyring:: head -c 32 /dev/urandom | base64 -w 0 | secret-tool store borg-repository repo-name --label="Borg Passphrase" If a dialog box pops up prompting you to pick a password for a new keychain, use your login password. If there is a checkbox for automatically unlocking on login, check it to allow backups without any user intervention whatsoever. Once the secret is saved, retrieve it in a backup script using ``BORG_PASSCOMMAND``:: export BORG_PASSCOMMAND="secret-tool lookup borg-repository repo-name" .. note:: For this to unlock the keychain automatically it must be run in the ``dbus`` session of an unlocked terminal; for example, running a backup script as a ``cron`` job might not work unless you also ``export DISPLAY=:0`` so ``secret-tool`` can pick up your open session. `It gets even more complicated`__ when you are running the tool as a different user (e.g. running a backup as root with the password stored in the user keyring). __ https://github.com/borgbackup/borg/pull/2837#discussion_r127641330 Using ``BORG_PASSCOMMAND`` with KWallet KDE also has a keychain feature in the form of KWallet. The command-line tool ``kwalletcli`` can be used to store and retrieve secrets. Ensure ``kwalletcli`` is installed, generate a passphrase, and store it in your "wallet":: head -c 32 /dev/urandom | base64 -w 0 | kwalletcli -Pe borg-passphrase -f Passwords Once the secret is saved, retrieve it in a backup script using ``BORG_PASSCOMMAND``:: export BORG_PASSCOMMAND="kwalletcli -e borg-passphrase -f Passwords" When backing up to remote encrypted repos, is encryption done locally? ---------------------------------------------------------------------- Yes, file and directory metadata and data is locally encrypted, before leaving the local machine. We do not mean the transport layer encryption by that, but the data/metadata itself. Transport layer encryption (e.g. when ssh is used as a transport) applies additionally. When backing up to remote servers, do I have to trust the remote server? ------------------------------------------------------------------------ Yes and No. No, as far as data confidentiality is concerned - if you use encryption, all your files/dirs data and metadata are stored in their encrypted form into the repository. Yes, as an attacker with access to the remote server could delete (or otherwise make unavailable) all your backups. How can I protect against a hacked backup client? ------------------------------------------------- Assume you back up your backup client machine C to the backup server S and C gets hacked. In a simple push setup, the attacker could then use borg on C to delete all backups residing on S. These are your options to protect against that: - Do not allow to delete data permanently from the repo, see :ref:`append_only_mode`. - Use a pull-mode setup using ``ssh -R``, see :ref:`pull_backup` for more information. - Mount C's filesystem on another machine and then create a backup of it. - Do not give C filesystem-level access to S. See :ref:`hosting_repositories` for a detailed protection guide. How can I protect against a hacked backup server? ------------------------------------------------- Just in case you got the impression that pull-mode backups are way more safe than push-mode, you also need to consider the case that your backup server S gets hacked. In case S has access to a lot of clients C, that might bring you into even bigger trouble than a hacked backup client in the previous FAQ entry. These are your options to protect against that: - Use the standard push-mode setup (see also previous FAQ entry). - Mount (the repo part of) S's filesystem on C. - Do not give S file-system level access to C. - Have your backup server at a well protected place (maybe not reachable from the internet), configure it safely, apply security updates, monitor it, ... How can I protect against theft, sabotage, lightning, fire, ...? ---------------------------------------------------------------- In general: if your only backup medium is nearby the backupped machine and always connected, you can easily get into trouble: they likely share the same fate if something goes really wrong. Thus: - have multiple backup media - have media disconnected from network, power, computer - have media at another place - have a relatively recent backup on your media How do I report a security issue with Borg? ------------------------------------------- Send a private email to the :ref:`security contact ` if you think you have discovered a security issue. Please disclose security issues responsibly. Common issues ############# /path/to/repo is not a valid repository. Check repo config. ----------------------------------------------------------- There can be many causes of this error. E.g. you have incorrectly specified the repository path. You will also get this error if you try to access a repository with a key that uses the argon2 key algorithm using an old version of borg. We recommend upgrading to the latest stable version and trying again. We are sorry. We should have thought about forward compatibility and implemented a more helpful error message. Why does Borg extract hang after some time? ------------------------------------------- When I do a ``borg extract``, after a while all activity stops, no cpu usage, no downloads. This may happen when the SSH connection is stuck on server side. You can configure SSH on client side to prevent this by sending keep-alive requests, for example in ~/.ssh/config: :: Host borg.example.com # Client kills connection after 3*30 seconds without server response: ServerAliveInterval 30 ServerAliveCountMax 3 You can also do the opposite and configure SSH on server side in /etc/ssh/sshd_config, to make the server send keep-alive requests to the client: :: # Server kills connection after 3*30 seconds without client response: ClientAliveInterval 30 ClientAliveCountMax 3 How can I deal with my very unstable SSH connection? ---------------------------------------------------- If you have issues with lost connections during long-running borg commands, you could try to work around: - Make partial extracts like ``borg extract PATTERN`` to do multiple smaller extraction runs that complete before your connection has issues. - Try using ``borg mount MOUNTPOINT`` and ``rsync -avH`` from ``MOUNTPOINT`` to your desired extraction directory. If the connection breaks down, just repeat that over and over again until rsync does not find anything to do any more. Due to the way borg mount works, this might be less efficient than borg extract for bigger volumes of data. Why do I get "connection closed by remote" after a while? --------------------------------------------------------- When doing a backup to a remote server (using a ssh: repo URL), it sometimes stops after a while (some minutes, hours, ... - not immediately) with "connection closed by remote" error message. Why? That's a good question and we are trying to find a good answer in :issue:`636`. Why am I seeing idle borg serve processes on the repo server? ------------------------------------------------------------- Maybe the ssh connection between client and server broke down and that was not yet noticed on the server. Try these settings: :: # /etc/ssh/sshd_config on borg repo server - kill connection to client # after ClientAliveCountMax * ClientAliveInterval seconds with no response ClientAliveInterval 20 ClientAliveCountMax 3 If you have multiple borg create ... ; borg create ... commands in a already serialized way in a single script, you need to give them ``--lock-wait N`` (with N being a bit more than the time the server needs to terminate broken down connections and release the lock). .. _disable_archive_chunks: The borg cache eats way too much disk space, what can I do? ----------------------------------------------------------- This may especially happen if borg needs to rebuild the local "chunks" index - either because it was removed, or because it was not coherent with the repository state any more (e.g. because another borg instance changed the repository). To optimize this rebuild process, borg caches per-archive information in the ``chunks.archive.d/`` directory. It won't help the first time it happens, but it will make the subsequent rebuilds faster (because it needs to transfer less data from the repository). While being faster, the cache needs quite some disk space, which might be unwanted. You can disable the cached archive chunk indexes by setting the environment variable ``BORG_USE_CHUNKS_ARCHIVE`` to ``no``. This has some pros and cons, though: - much less disk space needs for ~/.cache/borg. - chunk cache resyncs will be slower as it will have to transfer chunk usage metadata for all archives from the repository (which might be slow if your repo connection is slow) and it will also have to build the hashtables from that data. chunk cache resyncs happen e.g. if your repo was written to by another machine (if you share same backup repo between multiple machines) or if your local chunks cache was lost somehow. The long term plan to improve this is called "borgception", see :issue:`474`. Can I back up my root partition (/) with Borg? ---------------------------------------------- Backing up your entire root partition works just fine, but remember to exclude directories that make no sense to back up, such as /dev, /proc, /sys, /tmp and /run, and to use ``--one-file-system`` if you only want to back up the root partition (and not any mounted devices e.g.). If it crashes with a UnicodeError, what can I do? ------------------------------------------------- Check if your encoding is set correctly. For most POSIX-like systems, try:: export LANG=en_US.UTF-8 # or similar, important is correct charset If that does not help: - check for typos, check if you really used ``export``. - check if you have set ``LC_ALL`` - if so, try not setting it. - check if you generated the respective locale via ``locale-gen``. I can't extract non-ascii filenames by giving them on the commandline!? ----------------------------------------------------------------------- This might be due to different ways to represent some characters in unicode or due to other non-ascii encoding issues. If you run into that, try this: - avoid the non-ascii characters on the commandline by e.g. extracting the parent directory (or even everything) - mount the repo using FUSE and use some file manager .. _expected_performance: What's the expected backup performance? --------------------------------------- Compared to simply copying files (e.g. with ``rsync``), Borg has more work to do. This can make creation of the first archive slower, but saves time and disk space on subsequent runs. Here what Borg does when you run ``borg create``: - Borg chunks the file (using the relatively expensive buzhash algorithm) - It then computes the "id" of the chunk (hmac-sha256 (often slow, except if your CPU has sha256 acceleration) or blake2b (fast, in software)) - Then it checks whether this chunk is already in the repo (local hashtable lookup, fast). If so, the processing of the chunk is completed here. Otherwise it needs to process the chunk: - Compresses (the default lz4 is super fast) - Encrypts and authenticates (AES-OCB, usually fast if your CPU has AES acceleration as usual since about 10y, or chacha20-poly1305, fast pure-software crypto) - Transmits to repo. If the repo is remote, this usually involves an SSH connection (does its own encryption / authentication). - Stores the chunk into a key/value store (the key is the chunk id, the value is the data). While doing that, it computes CRC32 / XXH64 of the data (repo low-level checksum, used by borg check --repository) and also updates the repo index (another hashtable). Subsequent backups are usually very fast if most files are unchanged and only a few are new or modified. The high performance on unchanged files primarily depends only on a few factors (like FS recursion + metadata reading performance and the files cache working as expected) and much less on other factors. E.g., for this setup: - server grade machine (4C/8T 2013 Xeon, 64GB RAM, 2x good 7200RPM disks) - local zfs filesystem (mirrored) containing the backup source data - repository is remote (does not matter much for unchanged files) - backup job runs while machine is otherwise idle The observed performance is that Borg can process about **1 million unchanged files (and a few small changed ones) in 4 minutes!** If you are seeing much less than that in similar circumstances, read the next few FAQ entries below. .. _slow_backup: Why is my backup so slow? -------------------------- If you feel your Borg backup is too slow somehow, here is what you can do: - Make sure Borg has enough RAM (depends on how big your repo is / how many files you have) - Use one of the blake2 modes for --encryption except if you positively know your CPU (and openssl) accelerates sha256 (then stay with hmac-sha256). - Don't use any expensive compression. The default is lz4 and super fast. Uncompressed is often slower than lz4. - Just wait. You can also interrupt it and start it again as often as you like, it will converge against a valid "completed" state (see ``--checkpoint-interval``, maybe use the default, but in any case don't make it too short). It is starting from the beginning each time, but it is still faster then as it does not store data into the repo which it already has there from last checkpoint. - If you don’t need additional file attributes, you can disable them with ``--noflags``, ``--noacls``, ``--noxattrs``. This can lead to noticeable performance improvements when your backup consists of many small files. To see what files have changed and take more time processing, you can also add ``--list --filter=AME --stats`` to your ``borg create`` call to produce more log output, including a file list (with file status characters) and also some statistics at the end of the backup. Then you do the backup and look at the log output: - stats: Do you really have little changes or are there more changes than you thought? In the stats you can see the overall volume of changed data, which needed to be added to the repo. If that is a lot, that can be the reason why it is slow. - ``A`` status ("added") in the file list: If you see that often, you have a lot of new files (files that Borg did not find in the files cache). If you think there is something wrong with that (the file was there already in the previous backup), please read the FAQ entries below. - ``M`` status ("modified") in the file list: If you see that often, Borg thinks that a lot of your files might be modified (Borg found them in the files cache, but the metadata read from the filesystem did not match the metadata stored in the files cache). In such a case, Borg will need to process the files' contents completely, which is much slower than processing unmodified files (Borg does not read their contents!). The metadata values used in this comparison are determined by the ``--files-cache`` option and could be e.g. size, ctime and inode number (see the ``borg create`` docs for more details and potential issues). You can use the ``stat`` command on files to look at fs metadata manually to debug if there is any unexpected change triggering the ``M`` status. Also, the ``--debug-topic=files_cache`` option of ``borg create`` provides a lot of debug output helping to analyse why the files cache does not give its expected high performance. When borg runs inside a virtual machine, there are some more things to look at: Some hypervisors (e.g. kvm on proxmox) give some broadly compatible CPU type to the VM (usually to ease migration between VM hosts of potentially different hardware CPUs). It is broadly compatible because they leave away modern CPU features that could be not present in older or other CPUs, e.g. hardware acceleration for AES crypto, for sha2 hashes, for (P)CLMUL(QDQ) computations useful for crc32. So, basically you pay for compatibility with bad performance. If you prefer better performance, you should try to expose the host CPU's misc. hw acceleration features to the VM which runs borg. On Linux, check ``/proc/cpuinfo`` for the CPU flags inside the VM. For kvm check the docs about "Host model" and "Host passthrough". See also the next few FAQ entries for more details. .. _a_status_oddity: I am seeing 'A' (added) status for an unchanged file!? ------------------------------------------------------ The files cache is used to determine whether Borg already "knows" / has backed up a file and if so, to skip the file from chunking. It intentionally *excludes* files that have a timestamp which is the same as the newest timestamp in the created archive. So, if you see an 'A' status for unchanged file(s), they are likely the files with the most recent timestamp in that archive. This is expected: it is to avoid data loss with files that are backed up from a snapshot and that are immediately changed after the snapshot (but within timestamp granularity time, so the timestamp would not change). Without the code that removes these files from the files cache, the change that happened right after the snapshot would not be contained in the next backup as Borg would think the file is unchanged. This does not affect deduplication, the file will be chunked, but as the chunks will often be the same and already stored in the repo (except in the above mentioned rare condition), it will just re-use them as usual and not store new data chunks. If you want to avoid unnecessary chunking, just create or touch a small or empty file in your backup source file set (so that one has the latest timestamp, not your 50GB VM disk image) and, if you do snapshots, do the snapshot after that. Since only the files cache is used in the display of files status, those files are reported as being added when, really, chunks are already used. By default, ctime (change time) is used for the timestamps to have a rather safe change detection (see also the --files-cache option). Furthermore, pathnames recorded in files cache are always absolute, even if you specify source directories with relative pathname. If relative pathnames are stable, but absolute are not (for example if you mount a filesystem without stable mount points for each backup or if you are running the backup from a filesystem snapshot whose name is not stable), borg will assume that files are different and will report them as 'added', even though no new chunks will be actually recorded for them. To avoid this, you could bind mount your source directory in a directory with the stable path. .. _always_chunking: It always chunks all my files, even unchanged ones! --------------------------------------------------- Borg maintains a files cache where it remembers the timestamp, size and inode of files. When Borg does a new backup and starts processing a file, it first looks whether the file has changed (compared to the values stored in the files cache). If the values are the same, the file is assumed unchanged and thus its contents won't get chunked (again). Borg can't keep an infinite history of files of course, thus entries in the files cache have a "maximum time to live" which is set via the environment variable BORG_FILES_CACHE_TTL (and defaults to 20). Every time you do a backup (on the same machine, using the same user), the cache entries' ttl values of files that were not "seen" are incremented by 1 and if they reach BORG_FILES_CACHE_TTL, the entry is removed from the cache. So, for example, if you do daily backups of 26 different data sets A, B, C, ..., Z on one machine (using the default TTL), the files from A will be already forgotten when you repeat the same backups on the next day and it will be slow because it would chunk all the files each time. If you set BORG_FILES_CACHE_TTL to at least 26 (or maybe even a small multiple of that), it would be much faster. Besides using a higher BORG_FILES_CACHE_TTL (which also increases memory usage), there is also BORG_FILES_CACHE_SUFFIX which can be used to have separate (smaller) files caches for each backup set instead of the default one (big) unified files cache. Another possible reason is that files don't always have the same path, for example if you mount a filesystem without stable mount points for each backup or if you are running the backup from a filesystem snapshot whose name is not stable. If the directory where you mount a filesystem is different every time, Borg assumes they are different files. This is true even if you back up these files with relative pathnames - borg uses full pathnames in files cache regardless. It is possible for some filesystems, such as ``mergerfs`` or network filesystems, to return inconsistent inode numbers across runs, causing borg to consider them changed. A workaround is to set the option ``--files-cache=ctime,size`` to exclude the inode number comparison from the files cache check so that files with different inode numbers won't be treated as modified. Is there a way to limit bandwidth with Borg? -------------------------------------------- To limit upload (i.e. :ref:`borg_create`) bandwidth, use the ``--remote-ratelimit`` option. There is no built-in way to limit *download* (i.e. :ref:`borg_extract`) bandwidth, but limiting download bandwidth can be accomplished with pipeviewer_: Create a wrapper script: /usr/local/bin/pv-wrapper :: #!/bin/sh ## -q, --quiet do not output any transfer information at all ## -L, --rate-limit RATE limit transfer to RATE bytes per second RATE=307200 pv -q -L $RATE | "$@" Add BORG_RSH environment variable to use pipeviewer wrapper script with ssh. :: export BORG_RSH='/usr/local/bin/pv-wrapper ssh' Now Borg will be bandwidth limited. The nice thing about ``pv`` is that you can change rate-limit on the fly: :: pv -R $(pidof pv) -L 102400 .. _pipeviewer: http://www.ivarch.com/programs/pv.shtml How can I avoid unwanted base directories getting stored into archives? ----------------------------------------------------------------------- Possible use cases: - Another file system is mounted and you want to back it up with original paths. - You have created a BTRFS snapshot in a ``/.snapshots`` directory for backup. To achieve this, run ``borg create`` within the mountpoint/snapshot directory: :: # Example: Some file system mounted in /mnt/rootfs. cd /mnt/rootfs borg create rootfs_backup . I am having troubles with some network/FUSE/special filesystem, why? -------------------------------------------------------------------- Borg is doing nothing special in the filesystem, it only uses very common and compatible operations (even the locking is just "rename"). So, if you are encountering issues like slowness, corruption or malfunction when using a specific filesystem, please try if you can reproduce the issues with a local (non-network) and proven filesystem (like ext4 on Linux). If you can't reproduce the issue then, you maybe have found an issue within the filesystem code you used (not with Borg). For this case, it is recommended that you talk to the developers / support of the network fs and maybe open an issue in their issue tracker. Do not file an issue in the Borg issue tracker. If you can reproduce the issue with the proven filesystem, please file an issue in the Borg issue tracker about that. Why does running 'borg check --repair' warn about data loss? ------------------------------------------------------------ Repair usually works for recovering data in a corrupted archive. However, it's impossible to predict all modes of corruption. In some very rare instances, such as malfunctioning storage hardware, additional repo corruption may occur. If you can't afford to lose the repo, it's strongly recommended that you perform repair on a copy of the repo. In other words, the warning is there to emphasize that Borg: - Will perform automated routines that modify your backup repository - Might not actually fix the problem you are experiencing - Might, in very rare cases, further corrupt your repository In the case of malfunctioning hardware, such as a drive or USB hub corrupting data when read or written, it's best to diagnose and fix the cause of the initial corruption before attempting to repair the repo. If the corruption is caused by a one time event such as a power outage, running `borg check --repair` will fix most problems. Why isn't there more progress / ETA information displayed? ---------------------------------------------------------- Some borg runs take quite a bit, so it would be nice to see a progress display, maybe even including a ETA (expected time of "arrival" [here rather "completion"]). For some functionality, this can be done: if the total amount of work is more or less known, we can display progress. So check if there is a ``--progress`` option. But sometimes, the total amount is unknown (e.g. for ``borg create`` we just do a single pass over the filesystem, so we do not know the total file count or data volume before reaching the end). Adding another pass just to determine that would take additional time and could be incorrect, if the filesystem is changing. Even if the fs does not change and we knew count and size of all files, we still could not compute the ``borg create`` ETA as we do not know the amount of changed chunks, how the bandwidth of source and destination or system performance might fluctuate. You see, trying to display ETA would be futile. The borg developers prefer to rather not implement progress / ETA display than doing futile attempts. See also: https://xkcd.com/612/ Why am I getting 'Operation not permitted' errors when backing up on sshfs? --------------------------------------------------------------------------- By default, ``sshfs`` is not entirely POSIX-compliant when renaming files due to a technicality in the SFTP protocol. Fortunately, it also provides a workaround_ to make it behave correctly:: sshfs -o workaround=rename user@host:dir /mnt/dir .. _workaround: https://unix.stackexchange.com/a/123236 Can I disable checking for free disk space? ------------------------------------------- In some cases, the free disk space of the target volume is reported incorrectly. This can happen for CIFS- or FUSE shares. If you are sure that your target volume will always have enough disk space, you can use the following workaround to disable checking for free disk space:: borg config -- additional_free_space -2T How do I rename a repository? ----------------------------- There is nothing special that needs to be done, you can simply rename the directory that corresponds to the repository. However, the next time borg interacts with the repository (i.e, via ``borg list``), depending on the value of ``BORG_RELOCATED_REPO_ACCESS_IS_OK``, borg may warn you that the repository has been moved. You will be given a prompt to confirm you are OK with this. If ``BORG_RELOCATED_REPO_ACCESS_IS_OK`` is unset, borg will interactively ask for each repository whether it's OK. It may be useful to set ``BORG_RELOCATED_REPO_ACCESS_IS_OK=yes`` to avoid the prompts when renaming multiple repositories or in a non-interactive context such as a script. See :doc:`deployment` for an example. The repository quota size is reached, what can I do? ---------------------------------------------------- The simplest solution is to increase or disable the quota and resume the backup: :: borg config /path/to/repo storage_quota 0 If you are bound to the quota, you have to free repository space. The first to try is running :ref:`borg_compact` to free unused backup space (see also :ref:`separate_compaction`): :: borg compact /path/to/repo If your repository is already compacted, run :ref:`borg_prune` or :ref:`borg_delete` to delete archives that you do not need anymore, and then run ``borg compact`` again. My backup disk is full, what can I do? -------------------------------------- Borg cannot work if you really have zero free space on the backup disk, so the first thing you must do is deleting some files to regain free disk space. See :ref:`about_free_space` for further details. Some Borg commands that do not change the repository might work under disk-full conditions, but generally this should be avoided. If your backup disk is already full when Borg starts a write command like `borg create`, it will abort immediately and the repository will stay as-is. If you run a backup that stops due to a disk running full, Borg will roll back, delete the new segment file and thus freeing disk space automatically. There may be a checkpoint archive left that has been saved before the disk got full. You can keep it to speed up the next backup or delete it to get back more disk space. Miscellaneous ############# macOS: borg mounts not shown in Finder's side bar ------------------------------------------------- https://github.com/osxfuse/osxfuse/wiki/Mount-options#local Read the above first and use this on your own risk:: borg mount -olocal REPO MOUNTPOINT Requirements for the borg single-file binary, esp. (g)libc? ----------------------------------------------------------- We try to build the binary on old, but still supported systems - to keep the minimum requirement for the (g)libc low. The (g)libc can't be bundled into the binary as it needs to fit your kernel and OS, but Python and all other required libraries will be bundled into the binary. If your system fulfills the minimum (g)libc requirement (see the README that is released with the binary), there should be no problem. If you are slightly below the required version, maybe just try. Due to the dynamic loading (or not loading) of some shared libraries, it might still work depending on what libraries are actually loaded and used. In the borg git repository, there is scripts/glibc_check.py that can determine (based on the symbols' versions they want to link to) whether a set of given (Linux) binaries works with a given glibc version. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/global.rst.inc0000644000076500000240000000314514646713253016150 0ustar00twstaff.. highlight:: bash .. |package_dirname| replace:: borgbackup-|version| .. |package_filename| replace:: |package_dirname|.tar.gz .. |package_url| replace:: https://pypi.python.org/packages/source/b/borgbackup/|package_filename| .. |git_url| replace:: https://github.com/borgbackup/borg.git .. _github: https://github.com/borgbackup/borg .. _issue tracker: https://github.com/borgbackup/borg/issues .. _deduplication: https://en.wikipedia.org/wiki/Data_deduplication .. _AES: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard .. _HMAC-SHA256: https://en.wikipedia.org/wiki/HMAC .. _SHA256: https://en.wikipedia.org/wiki/SHA-256 .. _PBKDF2: https://en.wikipedia.org/wiki/PBKDF2 .. _argon2: https://en.wikipedia.org/wiki/Argon2 .. _ACL: https://en.wikipedia.org/wiki/Access_control_list .. _libacl: https://savannah.nongnu.org/projects/acl/ .. _libattr: https://savannah.nongnu.org/projects/attr/ .. _liblz4: https://github.com/Cyan4973/lz4 .. _libzstd: https://github.com/facebook/zstd .. _OpenSSL: https://www.openssl.org/ .. _`Python 3`: https://www.python.org/ .. _Buzhash: https://en.wikipedia.org/wiki/Buzhash .. _msgpack: https://msgpack.org/ .. _`msgpack-python`: https://pypi.python.org/pypi/msgpack-python/ .. _llfuse: https://pypi.python.org/pypi/llfuse/ .. _pyfuse3: https://pypi.python.org/pypi/pyfuse3/ .. _userspace filesystems: https://en.wikipedia.org/wiki/Filesystem_in_Userspace .. _Cython: http://cython.org/ .. _virtualenv: https://pypi.python.org/pypi/virtualenv/ .. _mailing list discussion about internals: http://librelist.com/browser/attic/2014/5/6/questions-and-suggestions-about-inner-working-of-attic> ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/index.rst0000644000076500000240000000055714646713253015253 0ustar00twstaff.. include:: global.rst.inc .. highlight:: none Borg Documentation ================== .. include:: ../README.rst .. when you add an element here, do not forget to add it to book.rst .. toctree:: :maxdepth: 2 installation quickstart usage deployment faq support changes changes_1.x changes_0.x internals development authors ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/installation.rst0000644000076500000240000004256314646713253016650 0ustar00twstaff.. include:: global.rst.inc .. highlight:: bash .. _installation: Installation ============ There are different ways to install Borg: - :ref:`distribution-package` - easy and fast if a package is available from your distribution. - :ref:`pyinstaller-binary` - easy and fast, we provide a ready-to-use binary file that comes bundled with all dependencies. - :ref:`source-install`, either: - :ref:`windows-binary` - builds a binary file for Windows using MSYS2. - :ref:`pip-installation` - installing a source package with pip needs more installation steps and requires all dependencies with development headers and a compiler. - :ref:`git-installation` - for developers and power users who want to have the latest code or use revision control (each release is tagged). .. _distribution-package: Distribution Package -------------------- Some distributions might offer a ready-to-use ``borgbackup`` package which can be installed with the package manager. .. important:: Those packages may not be up to date with the latest Borg releases. Before submitting a bug report, check the package version and compare that to our latest release then review :doc:`changes` to see if the bug has been fixed. Report bugs to the package maintainer rather than directly to Borg if the package is out of date in the distribution. .. keep this list in alphabetical order ============ ============================================= ======= Distribution Source Command ============ ============================================= ======= Alpine Linux `Alpine repository`_ ``apk add borgbackup`` Arch Linux `[extra]`_ ``pacman -S borg`` Debian `Debian packages`_ ``apt install borgbackup`` Gentoo `ebuild`_ ``emerge borgbackup`` GNU Guix `GNU Guix`_ ``guix package --install borg`` Fedora/RHEL `Fedora official repository`_ ``dnf install borgbackup`` FreeBSD `FreeBSD ports`_ ``cd /usr/ports/archivers/py-borgbackup && make install clean`` macOS `Homebrew`_ | ``brew install borgbackup`` (official formula, **no** FUSE support) | **or** | ``brew install --cask macfuse`` (`private Tap`_, FUSE support) | ``brew install borgbackup/tap/borgbackup-fuse`` Mageia `cauldron`_ ``urpmi borgbackup`` NetBSD `pkgsrc`_ ``pkg_add py-borgbackup`` NixOS `.nix file`_ ``nix-env -i borgbackup`` OpenBSD `OpenBSD ports`_ ``pkg_add borgbackup`` OpenIndiana `OpenIndiana hipster repository`_ ``pkg install borg`` openSUSE `openSUSE official repository`_ ``zypper in borgbackup`` Raspbian `Raspbian testing`_ ``apt install borgbackup`` Ubuntu `Ubuntu packages`_, `Ubuntu PPA`_ ``apt install borgbackup`` ============ ============================================= ======= .. _Alpine repository: https://pkgs.alpinelinux.org/packages?name=borgbackup .. _[extra]: https://www.archlinux.org/packages/?name=borg .. _Debian packages: https://packages.debian.org/search?keywords=borgbackup&searchon=names&exact=1&suite=all§ion=all .. _Fedora official repository: https://packages.fedoraproject.org/pkgs/borgbackup/borgbackup/ .. _FreeBSD ports: https://www.freshports.org/archivers/py-borgbackup/ .. _ebuild: https://packages.gentoo.org/packages/app-backup/borgbackup .. _GNU Guix: https://www.gnu.org/software/guix/package-list.html#borg .. _pkgsrc: http://pkgsrc.se/sysutils/py-borgbackup .. _cauldron: http://madb.mageia.org/package/show/application/0/release/cauldron/name/borgbackup .. _.nix file: https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/backup/borgbackup/default.nix .. _OpenBSD ports: https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/sysutils/borgbackup/ .. _OpenIndiana hipster repository: https://pkg.openindiana.org/hipster/en/search.shtml?token=borg&action=Search .. _openSUSE official repository: https://software.opensuse.org/package/borgbackup .. _Homebrew: https://formulae.brew.sh/formula/borgbackup .. _private Tap: https://github.com/borgbackup/homebrew-tap .. _Raspbian testing: https://archive.raspbian.org/raspbian/pool/main/b/borgbackup/ .. _Ubuntu packages: https://launchpad.net/ubuntu/+source/borgbackup .. _Ubuntu PPA: https://launchpad.net/~costamagnagianfranco/+archive/ubuntu/borgbackup Please ask package maintainers to build a package or, if you can package / submit it yourself, please help us with that! See :issue:`105` on github to followup on packaging efforts. **Current status of package in the repositories** .. start-badges |Packaging status| .. |Packaging status| image:: https://repology.org/badge/vertical-allrepos/borgbackup.svg :alt: Packaging status :target: https://repology.org/project/borgbackup/versions .. end-badges .. _pyinstaller-binary: Standalone Binary ----------------- .. note:: Releases are signed with an OpenPGP key, see :ref:`security-contact` for more instructions. Borg x86/x64 amd/intel compatible binaries (generated with `pyinstaller`_) are available on the releases_ page for the following platforms: * **Linux**: glibc >= 2.28 (ok for most supported Linux releases). Older glibc releases are untested and may not work. * **MacOS**: 10.12 or newer (To avoid signing issues download the file via command line **or** remove the ``quarantine`` attribute after downloading: ``$ xattr -dr com.apple.quarantine borg-macosx64.tgz``) * **FreeBSD**: 12.1 (unknown whether it works for older releases) ARM binaries are built by Johann Bauer, see: https://borg.bauerj.eu/ To install such a binary, just drop it into a directory in your ``PATH``, make borg readable and executable for its users and then you can run ``borg``:: sudo cp borg-linux64 /usr/local/bin/borg sudo chown root:root /usr/local/bin/borg sudo chmod 755 /usr/local/bin/borg Optionally you can create a symlink to have ``borgfs`` available, which is an alias for ``borg mount``:: ln -s /usr/local/bin/borg /usr/local/bin/borgfs Note that the binary uses /tmp to unpack Borg with all dependencies. It will fail if /tmp has not enough free space or is mounted with the ``noexec`` option. You can change the temporary directory by setting the ``TEMP`` environment variable before running Borg. If a new version is released, you will have to download it manually and replace the old version using the same steps as shown above. .. _pyinstaller: http://www.pyinstaller.org .. _releases: https://github.com/borgbackup/borg/releases .. _source-install: From Source ----------- .. note:: Some older Linux systems (like RHEL/CentOS 5) and Python interpreter binaries compiled to be able to run on such systems (like Python installed via Anaconda) might miss functions required by Borg. This issue will be detected early and Borg will abort with a fatal error. Dependencies ~~~~~~~~~~~~ To install Borg from a source package (including pip), you have to install the following dependencies first: * `Python 3`_ >= 3.9.0, plus development headers. * Libraries (library plus development headers): - OpenSSL_ >= 1.1.1 (LibreSSL will not work) - libacl_ (which depends on libattr_) - liblz4_ >= 1.7.0 (r129) - libzstd_ >= 1.3.0 - libxxhash >= 0.8.1 (0.8.0 might work also) * pkg-config (cli tool) and pkgconfig python package (borg uses these to discover header and library location - if it can't import pkgconfig and is not pointed to header/library locations via env vars [see setup.py], it will raise a fatal error). **These must be present before invoking setup.py!** * some other Python dependencies, pip will automatically install them for you. * optionally, if you wish to mount an archive as a FUSE filesystem, you need a FUSE implementation for Python: - Either pyfuse3_ (preferably, newer) or llfuse_ (older). See also the BORG_FUSE_IMPL env variable. - See pyproject.toml about the version requirements. If you have troubles finding the right package names, have a look at the distribution specific sections below or the Vagrantfile in the git repository, which contains installation scripts for a number of operating systems. In the following, the steps needed to install the dependencies are listed for a selection of platforms. If your distribution is not covered by these instructions, try to use your package manager to install the dependencies. On FreeBSD, you may need to get a recent enough OpenSSL version from FreeBSD ports. After you have installed the dependencies, you can proceed with steps outlined under :ref:`pip-installation`. Debian / Ubuntu +++++++++++++++ Install the dependencies with development headers:: sudo apt-get install python3 python3-dev python3-pip python3-virtualenv \ libacl1-dev libacl1 \ libssl-dev \ liblz4-dev libzstd-dev libxxhash-dev \ build-essential \ pkg-config python3-pkgconfig sudo apt-get install libfuse-dev fuse # needed for llfuse sudo apt-get install libfuse3-dev fuse3 # needed for pyfuse3 In case you get complaints about permission denied on ``/etc/fuse.conf``: on Ubuntu this means your user is not in the ``fuse`` group. Add yourself to that group, log out and log in again. Fedora ++++++ Install the dependencies with development headers:: sudo dnf install python3 python3-devel python3-pip python3-virtualenv \ libacl-devel libacl \ openssl-devel \ lz4-devel libzstd-devel xxhash-devel \ pkgconf python3-pkgconfig sudo dnf install gcc gcc-c++ redhat-rpm-config sudo dnf install fuse-devel fuse # needed for llfuse sudo dnf install fuse3-devel fuse3 # needed for pyfuse3 openSUSE Tumbleweed / Leap ++++++++++++++++++++++++++ Install the dependencies automatically using zypper:: sudo zypper source-install --build-deps-only borgbackup Alternatively, you can enumerate all build dependencies in the command line:: sudo zypper install python3 python3-devel \ libacl-devel openssl-devel xxhash-devel libzstd-devel liblz4-devel \ python3-Cython python3-Sphinx python3-msgpack-python python3-pkgconfig pkgconf \ python3-pytest python3-setuptools python3-setuptools_scm \ python3-sphinx_rtd_theme gcc gcc-c++ sudo zypper install python3-llfuse # llfuse macOS +++++ When installing borgbackup via Homebrew_, the basic dependencies are installed automatically. For FUSE support to mount the backup archives, you need macFUSE, which is available via `github `__, or Homebrew:: brew install --cask macfuse When installing Borg via ``pip``, be sure to install the ``llfuse`` extra, since macFUSE only supports FUSE API v2. Also, since Homebrew won't link the installed ``openssl`` formula, point pkg-config to the correct path:: PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig" pip install borgbackup[llfuse] When working from a borg git repo workdir, you can install dependencies using the Brewfile:: brew install python@3.11 # can be any supported python3 version brew bundle install # install requirements from borg repo's ./Brewfile pip3 install virtualenv pkgconfig Be aware that for all recent macOS releases you must authorize full disk access. It is no longer sufficient to run borg backups as root. If you have not yet granted full disk access, and you run Borg backup from cron, you will see messages such as:: /Users/you/Pictures/Photos Library.photoslibrary: scandir: [Errno 1] Operation not permitted: To fix this problem, you should grant full disk access to cron, and to your Terminal application. More information `can be found here `__. FreeBSD ++++++++ Listed below are packages you will need to install Borg, its dependencies, and commands to make FUSE work for using the mount command. :: pkg install -y python3 pkgconf pkg install openssl pkg install liblz4 zstd xxhash pkg install fusefs-libs # needed for llfuse pkg install -y git python3 -m ensurepip # to install pip for Python3 To use the mount command: echo 'fuse_load="YES"' >> /boot/loader.conf echo 'vfs.usermount=1' >> /etc/sysctl.conf kldload fuse sysctl vfs.usermount=1 .. _windows_deps: Windows +++++++ .. note:: Running under Windows is experimental. .. warning:: This script needs to be run in the UCRT64 environment in MSYS2. Install the dependencies with the provided script:: ./scripts/msys2-install-deps Windows 10's Linux Subsystem ++++++++++++++++++++++++++++ .. note:: Running under Windows 10's Linux Subsystem is experimental and has not been tested much yet. Just follow the Ubuntu Linux installation steps. You can omit the FUSE stuff, it won't work anyway. Cygwin ++++++ .. note:: Running under Cygwin is experimental and has not been tested much yet. Use the Cygwin installer to install the dependencies:: python39 python39-devel python39-pkgconfig python39-setuptools python39-pip python39-wheel python39-virtualenv libssl-devel libxxhash-devel liblz4-devel libzstd-devel binutils gcc-g++ git make openssh Make sure to use a virtual environment to avoid confusions with any Python installed on Windows. .. _windows-binary: Building a binary on Windows ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: This is experimental. .. warning:: This needs to be run in the UCRT64 environment in MSYS2. Ensure to install the dependencies as described within :ref:`Dependencies: Windows `. :: export SETUPTOOLS_USE_DISTUTILS=stdlib # Needed for pip to work - https://www.msys2.org/docs/python/#known-issues pip install -e . pyinstaller -y scripts/borg.exe.spec A standalone executable will be created in ``dist/borg.exe``. .. _pip-installation: Using pip ~~~~~~~~~ Virtualenv_ can be used to build and install Borg without affecting the system Python or requiring root access. Using a virtual environment is optional, but recommended except for the most simple use cases. Ensure to install the dependencies as described within :ref:`source-install`. .. note:: If you install into a virtual environment, you need to **activate** it first (``source borg-env/bin/activate``), before running ``borg``. Alternatively, symlink ``borg-env/bin/borg`` into some directory that is in your ``PATH`` so you can run ``borg``. This will use ``pip`` to install the latest release from PyPi:: virtualenv --python=python3 borg-env source borg-env/bin/activate # might be required if your tools are outdated pip install -U pip setuptools wheel # pkgconfig MUST be available before borg is installed! pip install pkgconfig # install Borg + Python dependencies into virtualenv pip install borgbackup # or alternatively (if you want FUSE support): pip install borgbackup[llfuse] # to use llfuse pip install borgbackup[pyfuse3] # to use pyfuse3 To upgrade Borg to a new version later, run the following after activating your virtual environment:: pip install -U borgbackup # or ... borgbackup[llfuse/pyfuse3] When doing manual pip installation, man pages are not automatically installed. You can run these commands to install the man pages locally:: # get borg from github git clone https://github.com/borgbackup/borg.git borg # Install the files with proper permissions install -D -m 0644 borg/docs/man/borg*.1* $HOME/.local/share/man/man1/borg.1 # Update the man page cache mandb .. _git-installation: Using git ~~~~~~~~~ This uses latest, unreleased development code from git. While we try not to break master, there are no guarantees on anything. Ensure to install the dependencies as described within :ref:`source-install`. :: # get borg from github git clone https://github.com/borgbackup/borg.git # create a virtual environment virtualenv --python=$(which python3) borg-env source borg-env/bin/activate # always before using! # install borg + dependencies into virtualenv cd borg pip install -r requirements.d/development.txt pip install -r requirements.d/docs.txt # optional, to build the docs pip install -e . # in-place editable mode or pip install -e .[pyfuse3] # in-place editable mode, use pyfuse3 or pip install -e .[llfuse] # in-place editable mode, use llfuse # optional: run all the tests, on all installed Python versions # requires fakeroot, available through your package manager fakeroot -u tox --skip-missing-interpreters By default the system installation of python will be used. If you need to use a different version of Python you can install this using ``pyenv``: :: ... # create a virtual environment pyenv install 3.9.0 # minimum, preferably use something more recent! pyenv global 3.9.0 pyenv local 3.9.0 virtualenv --python=${pyenv which python} borg-env source borg-env/bin/activate # always before using! ... .. note:: As a developer or power user, you should always use a virtual environment. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1721490075.8596337 borgbackup-2.0.0b9/docs/internals/0000755000076500000240000000000014646755234015407 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/compaction.odg0000644000076500000240000007040014646713253020232 0ustar00twstaffPK} U.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK} UConfigurations2/toolbar/PK} UConfigurations2/floater/PK} UConfigurations2/menubar/PK} UConfigurations2/popupmenu/PK} UConfigurations2/toolpanel/PK} UConfigurations2/progressbar/PK} UConfigurations2/statusbar/PK} UConfigurations2/images/Bitmaps/PK} UConfigurations2/accelerator/PK} U styles.xml\[sۺ~LF"ɶ8gN98'$!Οc_IDRv:3I]`w?,wYIh~=$_|ٿOolF|d9KJ)׃Uy$P]dy=XW9Z'WPՈy ^ITa$YOL3l7S0\ F|:v[IYyz>[?@9~fk0\P wTŊe-MaP j9Y #`q2 wP}]Wa(HPTƂ67D;E%樯,E=d$kh2jXg2g hcRxQؒ _Y8?.ç>%}t3z'&sT.lދovh{d pop>-tx".gI!ߤQghY蕐 ł$ëB1-G5Ș7qkΞѫhʧ"ԇZ1$9$ >ZqZ!)eŢZ<+m5YQtat'(\,긡@ s"l3OS iV@XM(a%nVvmY*ڗ5JIx(xҳm?'|xTpYA\GsQQUΙhV>* ʝ} ռ\K0o CѢ oB5s)bhYQdShE*gX>LjFUX:XDC3RT&z` nYM_ͱUbR #3~0TՀC8puob𐯫٣p拡DS9>hqi&¥8K+] S ^bWb?Ȇ*\c# rG&aB-8St%֥SD(T$N*VYTP*8XfB_oS 97brItY8)ȟe؀ HChtB._%B!^%B'Ch*8>4N_ +ӓ":t Vzm:B`]hnڻeնE\*)J%rDf#NL p-QVKu"9tk BHWIZ _lL W6}MݣolbtK-i#̎r grN6bvӞm/vRkI负}dАƶ#RCJRGeDZES]-;Ds䄻,,ߓ^6#uv?u7%.wJCKp~l&pT֡r<4 u!yb~G esGj~eϕb\ز7e[67f'9Y s]u_4Z=o6 ajlK[WonofdL=PgFE>*"Ga~EeyfXgCw}ܾ/)]tPVF ׁQp=B6ON;bwƁ@4s>h 'C5JVX'DBf胄yp2$cơ=D[0 ~|GGByCkYxJ3+vi"^Yt@m>XϽvjݙkOG ٶEqjČgmnyI|C0Ẕ/+Xp|z-#˳($u5vR)Sw_<9; m9ga$Vkʈ2R=/ {n7im ~ p(3M zAki\a0 Bm;QVWS赾}x\Κ= YrLj?v(PKzL՞ZxƷ:zuePK3i IPK} U content.xml]ےșS]A@TMLw{螙p׬{3AAJ "e@*/~~ *KL?'o^.= َ_/yhv,xg#k^[ _,B~YJh,98gnapZwkzE[ǥiǼ 1j\OЧ7 v;![&F.MZƧ\_!ԑi\_5Xf8צyZnu\~blz yhaőws0>J' "^ -,/D jGf'yo/ix+VG!jhb tx . 7r?v8iQFh>#*cNt$}Hfju2?_͒Q&)37VnJ׍o+=3}G_Ilӷu.pdQf3 Qleuq nͶcaҊ o|ty~}m>Fw[ˎ&6;~plrHxff4S$ Up}>|DV Si@L׎KkKD7<چ%]}h+>wc$ FlҶ'FRK`|V`u>h'|F J{I@Cf3g]NثGxO2ʚ2AvQԱϐPA^DSHeA\[ҐQ!X*ӢxDRͱcHԣ8x9m3Σ@\8<*1yhUJ&^"*?p.,Q ӫ9G%>KS%־P -v5qW"}XiZ4:$HCbşkת^ܥp2>7SͺY?=lB%^Bt5Q宻9+oojn=]75@v S[o@۪Y gk0uǡo@M8*;sjdhx6wz}vN3J^G}o̞6!G U9=B̦$IwAX*h.с?J%3yco J޻{I`%&3{ Mom.ޟ#?&K"VT[[nUVOܷ`vhܺ ^r-r/hQЕ~Ȃ_wC{YYjqN`œ 'qUnțԜ}v$ʫZW( 5GhY`"7ILFwsM"i."("* ڢY cHg"V2 qB+qכq@oƜ͘E3cN"@dhEYgt1;/Yz.#b=PxADy /r'G_h Q1Mw;Z ʗj(q9'ѴI1zmyta%g t6G-p )לz~TW{f|`P( ,1 |{Fgf,_O1=܌#hÛ|ɱ|MGVm'n2#~N ˕k3 "ah`AHZHXCP KHXM(T) vxHM1kRR9J[ h୴seǖ@OvTy gt-9Ό_Qd̨y2̃JLB6+-9]Dq2/|R h類iu_ĴnOkqBd Do)[^ђF~_l715g:\d3DCJ+uBc$TI]Uk9;kFPP*.}/L>}bW|,,M,gB>w g~jzC_yaPZeqJt5u L.><Զq? fL/ SRs>J%6m|>6j\6 d:j}2r(S\&o_p Xb1 3 l4O4q[r xsK&J.81[rorͲ ^ &zMq)a29MIq7߱gqLK4- _*tݽ<#FGR2t[)%r%Dh%l|Hˋ2!Rs~}OYyP$N[g?XAD׹͝mz8` -B %<'W(qMP54ЄbS+~|%.=,|} ."KʖSc|)? BtuXHH|v~yձH ±U = Prl~xyHf"-[Z~J8# ?| OkRAg$3hV6pOW uB|ܙSb %JD,q#ڄ'( )ry6v I8Jc5'ŎC6d[f#ew΅M\[?~ɴ ` p}a5opQi#w[P]()a~ܽ7r %V\BE7X0k`)>^Uʜ?d'(#1k#bNK׉JHo a<94z7g!I(NO&I~!'nő u#6994Ҟi ]mpk} u6>fy~i,(v.OVl 5*wlb ߴ6`fnE'l 1DhrZt*$v;5ֈ︄kр jO'{>ݣv;gi15 KPKO3(PK} U3P{AAThumbnails/thumbnail.pngPNG  IHDRjpPLTE #$*<$+-5+8,!!47&###"*!+++'7%#2:?/'9/);3/898-B4L ;Wa8 @]AX Gh MqQwW-AL/DP/L]:CG4JV7P^;Ve@FLSU \!D.!L4'C<8Q6(U9*Z=-Z?1e%i&o(t,|,c>(AN?]@.\A3@d;Ch=kI5rM9vR=CCCEGIDLCGHHLHFKKKDRBHWFIRHIXGK[IGT[\MDYRNSSSQVZT\STZ^\\\G[fB_pU\`Ff@Fk@JsDMxFO{HQaNXeVQ~J^p[GgyaOEeSHaXS~V@au^cccdhcjjjfzcsss}yv{{{XZ`fnr|LnNrPtV}TMZR^U`W`XcZlhqnuq|xg^h_kamcpftiwmxm{p}rZ]aejnpuy|ӂ/02578;>@DZCaGeJlPnQrT{ZFHIMOPRVWX[}^`tvxz|LjdЎiؔmޗpsw|ۄڀރᄡʣѨԬ۱㷌SZ>M?yoH(aXA-IoozCfWOXV[uۻ)BRLjW綳eΖNX~DuZB]Yjw͹ GU ` 2 ( SG&+5h_}5HʟJN3uo@T nnP5_wShѻILAwN,R/]b[cn"A#FBM"/QD^~5ye^Nٳ݀%"Dz* h#Ny _:T-jy a|'jPeG2:W!0D]Jpi{ S4tA(f2AK_}^R/8b,ъG$:~<x #5G: i 84n"EeX87ŗ^|ᕯ~M;q+^hlڨM"g%(o{^/ )Tȡ:(Pn G#uDcX6 m9!qQ9q0 =')aK]';y+Kv %玚2aaįЙP $hQ޾nsօ=}zmɫkHZM͠QEz:pC@t7M8nPr!1M6B #7 adQ[& &ŗK{ү~qO) i~l) ל8t"0$hXn"Au6mZ u vr5QH#ՁqFRExyki$.LQ|aKTC9TNx]댢ox#.P` 4~W/_^BHКC#DlH~:,Q,p̐kY%Z۾c[o9yV5 XZa*튋Vpϲ2"rt<@b8ιoiW׶@қ0kap)>j~ æz6CQ8Q7B2/y+vmGG2zצ$ s/NȖ^!ݨ srmZ8* lGm膞2 ]P6j>P*ͤ GsGZzȢQ(ӫgz!G b: :b+3Zt dL(3nuCzQgs/cVn, ;*3f 4?Y8Z)38G44q|63+U3 Qd=+j-LZt'Et#fݯm2z.Xa U( $[i~ԮMAL۫9| =yjn1gy/rI k7R"|gE@^$7 w *v +w Q:W G;o 'Ffظ`}שBz裛6-ny-S^At60p3 K F$2F z !0fh^4!(dCO| Áoٿgwۛ1۾_B}G(haMđÉ:=\FM TnN]yShB~ , :[p$$u qFoF4 0VF'j"P±m?*{Ĩo+*zuy^Kū, aw1jzmɛ+rū{83 K^=a:ơu{󻇏Ԟt1A4[\ë5+M1pyU L3ݬTZ(:"{bj6T>{ԓUeW| xW~Y̥^=9H^zP6ulӛf>TSնi#$;za䋰$e/W8ȄuqQՓ p- %;p,-{u4l s49e/~\n4(#Bs M Ȗ~<QEYzI*@ uHab4K+1DnXjaq[_1LiT(!쮁{jQlCMsQ洔)ט,{c:WjZQZZyB0P.i3d${Og%0u5Blosi6 @ލj!XFsyUyx$Eԟf5 c}@ߩteOA=類8~~m01]yy1Ir96s星{,(LQEfَXzg7v'e4¸xN!(AcHнǚk' ͢ʍmu>ĎVon]_B-2it-]VPo*F?}6F!BAdUP)X! QboZTy{_'ܷ$j^W˻"(Mߺ}Ot?1@?S8L$rDY=gnxyL1]=5rP0if|<}ol{ަ=Il|RcV#:Og?uݙBPOjznFi@RO\*7nX_֫KE=ױ1LyC}j j㹡Oio PHB80(mS*Vx@wz2{ǚ~k.u]SSū4=@,lA꣏nt7=y-kUnRZ"".ҩ\<;a|M!eGbbbC_D¨ZwXfEW'7p}=%VuUūCUn9rt͋[>p*z F8&6EC׎8Pvd(CL"?gLd7gBH~w]Kv+w]~?9d~Wr*7kOoo躅 ԭz QptYRzE#;2,+J?)<ӑk3vktQPar4'+Ǝ%݃gWT\cpMMz;Ցc2,cC7K7nYhTdפ^ m4A4b@om NO4<X2'N(5ld\N٨ܔP*/@B} ĞPE}5{T B5a99'(&PifgTkkcy\n M\/ⲜY3#S=zTȞ!Aá$,ՈtSdxY gZ!{P7FqA$BτTy9f8"71fY*^/IXHިALfeGȝ5rs~2Sa8an֠F9wQknI,e)RBՔʍ2ZdQLj߃Ɇ!BJowcɹJyMLk=lZOuڍ;E,`"ytwN+9V/T_t):`oT"A~_GAL@ "oxz VٻD;&t&@4 M" S"&PlyxߝbC#Cߋ:.@,̀4!tԎUe 0e"+c镝݃mmoߕTtX5ҡ`YFZ:?GwJ dLE!gHh? uX '!\1ۿcP^r^!(+Հha<+H^ss(? k֜nN (4?[DhI ԁ 0v8"& 3v*7PDYM"1OjUȡSk㊊TO[*@0U"S6"y #֌;51)'.>{OIp ddF՗Д#3Zaږ2 I3[ XA*d<A2n+[Z۵->լؔ!HȘAȑ[XƐHI"YBh[z lDC@y-$!Uwڵdg,(Խ2ow.9Qh!rb/a+f%A!rӺk[*7W`\NR8|? iO=?LsЯ2z5rpzBPء9 F3`{>xuxCwBc5 Dշ}t+z5&((T<$0L.=Z  IdFΦv_4NVgż o`e=nƧq&V~!8}rfad7EtFzH jW^3TcXyXQF=ʹmmH;)-dwi^hz3viv ϢnBhKsWG!B{6+vՠgض a/V z !jX Ր-+"YHȞ &eP mf@+:t!t-"jr97X~φB= `cxh˘%+ bAwSJFɿ!@ɠS~q<ٮɊ DaB&D!0|kNČ\92ktA@+mWszu|aD.j+mYgIj 7ZLDrQ>ęI -je umj uםWbMƾ"1UD!P/Ub` =ԽIp٩{CJ؁uY>}2s6nj秾sJ|6hv-la =$!N 9ungzwuz6<(b9&jy&N;jkۻwPٿSٛj9؆=Af[psǡE!` ]s/V-V1G<!I ^=ضrmpgO@ i0]LxPG˚ᎢMaǏ4 ہ.rB$^]7 yo { "%8v'UnrYҠ W ,^=Hpr312&DHRD#.qsǰBGݫ!W~bsf`Ŏ3;M;ر$rì78=M3-^|e"6?.%Xi`I[WZ.URͪGC}¥!1d`ŘMц  srŴ3 4LvʍnCG)Unpyw׮]ĨwuUc>{cbr}O~4ۖjt pBzzUo]utEzV$'f "C2Zh!:Rݰu` Llٚ h Fm 2`ZPhNJ;+Ko}짿*ܴ~Mw+{umcm$C4-Z[ݼG+B52bI,ˊ 5 F2qv C, 1Œa1McLm.WHG~HڄZUVdwPwĿ{Z(Ayz?Ei*+Ԙww5Lޙ1aVP+νn҆O?,K9֘5GO.LOs "{Z1:ٸ2ON%wPKG޽ƈO19׫iC%")@(:{kT.n98wpe0:zКf) L6-Y/c=q/֮E]skگY}n^=ad" AQ.@vy'VJGCqteϟ(wK XI!ۅw$u5k?)lͧ-;^=5AdГb)@,(Գ{G;RfɭcdPGC, GT:4|5&$MN/zulZyݦ վ=ñ" ӑ/Z*ȲwXzpׁU^]xoTKhX(^M"߰E7(D}lU6o۲x[צE=v{u|rtz9z&k Ek  K^=u@vҬEK=xSMۼi9Փ C|QME)Գ5diٌD<{95˥j4=u Ii8: 5$D 9ۤWC@rcJ⢸J }R/I lE(ք^LRm^D*xvW?tӳ?|C <`=D?9hѰ /@N*(4PIzi^ /%-//*]+n Pqo%G>7}O/ ٧n|hg?PЖ:Dܬ }lEB^ KB9+]&2'Q_(YG>GmJ@-n.z5{Wꆫ\}dj6xMKŐ1PF"{u^7BVQ FD*7♡2m|#fLVC%~ްqӟz࡫熧oZGtu)AWy O?􆧟?G,z%jU%I:9 7HeaJi~39]6x'395GLVMu׫yʫW+ y~4mӧ*8Y8[QFC66\qe]>!Ӆ#ƥ|gGώZsϊ Nx;;;:\oVs_>Lqv`UnlE]j-ױ04DCtLg+SkIea ##n ^N][9Lv&4D@ьm;BxyQwo[zɲ;KEƨ 6 "Hؐda%e\ξCHeTȐ)A3Fm]rS^)CL 0eYVq("ٙ3Rp//onJCNun(!7 CJeHa}բxew^yj%;;[VW9:aܹFEqG%`@00*W:0nVȸgb`{Kq`*7%m!q]s+{6xu4èy!nrhXI; Ä*7 !+Q l+.weWf!u(r#~儳d--)1ƆV#103VXyR,89X98\8v{8c߈Zg BML&[wt/i4Rlz߅lg'V[tnfz\-]=DETݚᩥ;}[צukWݲEZ۾y5"6$: ^[]NE&>3q~~K[8ŋ[Եuљ-f|y4fx|v#DexQsi"TV%}r;#;>䀭#ߕ\3д=9VٍY#S=: d@öPm!r\8=î"A-PH,T8m.yo/[e^AohaM[y_#ԅC0n䲹Ɔ. F |qPUl_ܦo۴eUW{r?CnΈLb84(aaf>M4Lm&eo;CobF~wgwXfwۙbXdU"^GO O9xG?]remrMؔTܜn=}XzڅGמ>v ZB_|!X Ɲ*!aÀFAxPk2A E͂9**7w^_^|\ çN|kyW~^ve_ĩB!.@,eԄ@{cP>}]UU9?n3xcPİ0CqrxԷm=KXﮞ˾򉕼_yp!u`6#Z缱("ľȠId``w(MֻԇN<%O> )c| Uc{󩢾|ެi7UdOQ%Iy&5`Q'iq7`И\';iԲqg j>]Ir'I֭;Լmbӯ[<9^YEaw7*z)Ø%L<aMڸ+%;zóO<3ZQuǸRdA{EXEѫ: ZB]Fzj.:{5W01sBP3dHMl6 6-KMWo+/oC|ٌz|dOtPTDŽefYrKTPʍ'S1Pf`EԺaNrsz z7-7lqc}H>&V=Xj9ĂB5!p_ZnIuFUX"7Fm; 13EGX zf%>ox~l\P_CLIȣ& &+e';7Z;!sYCѫ׭ mˋo$Zl&{9Je>O?#UPNCǥ:n`B!f g$6YwK\Ar_teRڞ9+݀B 41ѪEu.ݽ/uګgMD{/U]?4Z7 jo9`=Z}~>2ClPXS,JoܻMW)Ln"X쒂@$Y7Qr]G|S*gN A\?WחC[nz چK>JW78(bgq,pܿl}g}/N-@ ZKE5nɌ4qup4S9AU ]PKqK)PK} UMETA-INF/manifest.xmlMj09R6EɢP3 ~s&N\J 4{ov?:AaU@ڵH]þ_6^I·ܣx-I"FI(N(ɿrRV 삶:9ԪT/B0x8 Iin+Pp0ګtlt0E='j_λudbOG&t|L3r$l!;D+*lqD͍Ry7|8(|䞺;"ث_CRZߊ_q PK;f1%PK} U.++mimetypePK} UQConfigurations2/toolbar/PK} UConfigurations2/floater/PK} UConfigurations2/menubar/PK} UConfigurations2/popupmenu/PK} U+Configurations2/toolpanel/PK} UcConfigurations2/progressbar/PK} UConfigurations2/statusbar/PK} UConfigurations2/images/Bitmaps/PK} UConfigurations2/accelerator/PK} U3i I Lstyles.xmlPK} UZR content.xmlPK} UO3( settings.xmlPK} U3P{AA'Thumbnails/thumbnail.pngPK} UqK)eimeta.xmlPK} U;f1%WkMETA-INF/manifest.xmlPK+l././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/compaction.png0000644000076500000240000120760114646713253020253 0ustar00twstaffPNG  IHDRpY7HIDATx|HZRX)RkRS܊-p[)r8Zܥz_^`MZ~Nf2۷y%hJwA$(&AE4ق/gɃ]fW'"'O4~b.f2& M4nx=Gc[7%$]vK8 5jmERp?cǎ*;w^ЬY5^^^;@RpCCCaÆ͟2eJa+V??? ݹm۶2eʐ4iHwb%! \??fBq>Mp(Q"W_yCÚCKB2v^qP|iȰ};ѻwo2sL>Ͷ ˰Ù'T9}4&wϟ_WnϞ=zEHr睯EhBK#Im nŊu87 -#G]ZJh`B r5}ڶPhAR -& -0_ I2~JDFF0Ztp: $f n 6ƮsJ7v4]_ݻwBOO.W^n ǹ/X Vh/_cݻ^KرcGKa/pVXъc}&Mi@fȐG<-X3LeB:iҤ9Q,Y:eʔ91.p{)Saaa~3YY,ZvV޲,NYesX@hC.HգB `QXĉeXP+0W/_J!)M4Ydȑ8F.[ 2{vA\Z8ѐnذ x`~3ğ !;v `1N:!ǝ͹o~ (HmkpD}澨dڵqQ˗/'[3HڽI_1 K_>e^hyXe \X\$IZ ((~!z!BPhʝ 1$ˉ H-WI"jg p8 - [%KltAH! TۚJA޻w#>b:8h\D-`L+-=l#NY-b qMh\D-...Q(6}ؽ{w JGm-x ZM.rͭ_"y` m\$SN 9:Ǭ^V6` IXR 0.wwwmDɣ;KJЂ b q˗/zX%STN(aqO%c1#wBP*B3n0)Z 78TBV/} h>ZZ n۶m?Խ Bm+V1m+&@1i&m輐'/S $ݫ`D^<|i(K/j\DhX2Ѵ- >0ؒ?]O-@љ3gin!adݻ \Sb{Ńc``ldϞ9-["<׸zj"E\qk͚5XUT͞={̙.۷o=hv֭ Ml7be0~qޝ I6n YW)Y`NVY毜l^͏[@>6lؐeVzQܴtIWį5x)lS8N;^mSar_:T|G={QTҡC_7o\AO7xkIA_=yB^0_reKΕ-[87oޤ<V{8%:u7|  /NN|cgLxAH&'e0 ǽr-pV @Ӡ-A_ԟ1[~OZ//=79`Gpaܹ< ,gW;]xaAN+t@h&MTh^hr: /|TS!hbիWiW$Ҽ L!>ud4q@ ?OztS!ԱtB7V@7 D;XҽZ 7oTcQ)T`Qh*Lw(!!v(hhM::j64fԑܔ5.IPpMh%Dv\gqHjhb.f2rA^rثKRV B GO.]mۖPs0gkE=n" 'NRQ W!* "ZL\V~~ ^\9C4f݌f(ؒlhU[Lׯϟ?_Bc'N1V9h=W^nFCZ> ݌vΟlY$i^$ꁛ5D0)fԘ&.QCkW`K5ZZ*c;vTRiTܽ{) e+|Q jI ~nFrrݞ_jm7BAjڹk׮ϟ?`ɵ~`iz}Γ''/r8޽{7g9A"KB N9-FT.큡:: {o )lHkOe[[-᯿l;$^*ϙV. 5W8p3* ݌l?-UԸ&ѬN9r}@C1+u12yt$0ݱ XtRıP5LoMwMEQPæ;?IPpMhU0f4WW6~nIѣW![l* jARpAhhJ8T@nFK{6۴u6z)S~S%<}J;V.&&ƹbŊ=-۳gYonQ]n]8vuT݌C{dNҍ:?3`J]ko(ٴKӴnFOnZZt!mk7 \sڴf -BۦMe4i۶RB{9\H˸FR5jd0o܌‘Ψ(f4I$dg -`k7'u߸˖-kC4-,ն.͟2eJVȑ2xfTJ([j~ܔ6Mu3J/_`-݌/^|Jς &@VɹՇz ۷Ι3]=/^Н۶m)SQ7\]:4Å}y)x&Jvӽ)["#{ڟ5|_1|Voέ#y޽{3gi=Xe`$ ӧOooor1ٳT^] F%O38#] -Ǐ$yqA`Iڐ&O_ܒ$KkkK1wȑ#ܹs8u.fn2nŊuNh9tΒBKZ UDLi-Zv!V¬֙$Oh_D?22Ҕ.` К>!lM A4fࣛQ5قǍ\Mٕcn"cMQQ@7&QNIƍ x`ʒ% y.$$tؑ_ň:uH5}.eF{ϐs(I&)3~֣M%u%I7kα@مCEسpB i_=Y[ fTc#*Yo*c\j B V!.}Wmf? sqm C~-/@I &ԥ/^wM6`Y:zt75x'QC*@(]+DThٲu ׂ޽{q썍u_'/ '?ԁ,?sΘ$*Yb7f4SŴ߾-\}oM7o9{VhYm+O,-VNy{ Z9 m|$u3@ڵko]*AO&;ӂCh\M# `̙3{ɽ7x+b JykL'~Q{+VDR!4DGޝLp8|ʔ)U݌]t}r*nF-5ݱܝr_:d9D;{xx E] +s:c -KMo( Q.q1c,i۵ksqaU^?,,h;bG;ްL\rÞ x8mp3DQ^X *UwXgT(qIPpMhK:Q$.ۮ]%5ڀFH .*oΝ^//vH )p ~)SǏ{իW$mڴ+Ma|7hN6hmذ!om,gH|T1aW\]eǩ&O 17b{˱Ù/0((V(uᎷ) B+u}S_ g14 ׶!ͨyXEp6 C@ f͢wkCbPajMOTͨytIͨJAkt3h* D+g}bW-ZyC7")^<59re˖0 A쀤R p4&`Zvaĉ$O|0gϞ>R$']jo]3 q[nMnܸkժY|h [$"E ŋgzɟZ*| %_\pݻWOSt%Xs~Њ}U'n>[!H4ѷtK+;>-{d]7LB?f+V\$B?Ah'Os3gN]B +W^6iqC?dOaMԯ?~zc7ֺ7_BMj>nEy\˧x92'iVU{&K}l|^9{ͨyXEpo߾Kã,Y3J&Ο%… -/u3j°`֬Y2d`σC7a0CT1ZW*|^苭) JY@;g&ƒS-5YEC XdS?)Oy^X)77;fW=ln_jm&,UmP}$XrcV^E3sΙ܉S7^z~~PrDŽJФI~N2h 2aѲeY Z>>|Ϟ=gq,^ٰ0?ؘ}y}Nk^c0XF]$VbAGL* Tʹ4Q7jE֭[ي䱱N/^ރrC40Ni9ldϾ" uv?)ZxeHmIJ֝iۍ DK<<5t3j;7}*Iäџh(-qrTp: $9tɒ0SWr* x)Ը&AE4 .IPpMh\D"$ C EP"$(&AE4%kS]L+lWXP9َy > [7%Lzmgþ ETp%O*U߻w/K.גp!]{ DFr~*-h3pn 9s()ۢi<6qJग?hw8e"*SJѺFUߟb(`3F#3 >Oٯ_BkЙyo>xW=z^=CB % 5WˋIf=rŀv 4lq]3ɉułK- -BK1ܲ~|-N^ŊM?N\^]uiCBKݨ )Mb0kC>+m'j^_+W*W19sڵb(fXP W\9t~x?~1Y!~<ԭ[<ùWߝX*haPиǏ{>k֬RnnnnTh!oĈx˖-{^ 4nÆ 7r4o>}J-[ܩihvlx%StKi7ɓ'k׮sBKB B -Zy0L4x#ՌQo1Е3i9¨] -]09rTPO{|wd%!-M208 1Q1řOTIG*~v,ܬ)|Bu"/'5"/yPa1.ZQ@Ap1y葤 Q0EΕ0__}RB p?/,[& ~3?/'&5>"-@?X ,uX ˦ -)X$]Z̋"j[냳 &AZpnK,\>HK7ZTr6.qMh\DXYҚAqa,fQJ[x4ؒ%pV!.K?"E\cIUڸH .@h(%t., Yy؀̉ )+?,[G&? 1cI%Yd 97`J] c% `X>Vy8HG}wڳgx|MFpC &@ò!&t@8h%ۋ wT]CC'>6߫@Ji^?$q„CLJ0L7$XRgZa&AE4f*XJ-D\G @hKH%-]@~EKdq0 All7`+h.9JȐ!sF` ~8vnZ]qFHW.ϳg~ԾL򽟟_غu"&[k׮8i#0?w 3fT(&aqV&MJ>}dC/pf[ W\ҰC=QEL !!] T_k/y}}RO;> a„9t+,nʝ'OUn:Yf͚Yzu\|04u9r.3할SH!cƌ=c={v௿zʃsiӾrTpϟxԁ6fTjnF1i$2pYS~>fw+S,͋l` F`K݌f̘DFF壛QaW^a)s~Ӎ1)|^e~lƎ\|RpO}j%pb)kBVK  Ժ(:t(BLӶ1QCBnFͦE4b{~?ҒEVfT+o@lbnF-]8[{nǣ&rt3mDǏ9>ytb9ا{CQ -@ BK(޽{tJȡCʕ+%|b)Sa#Tuqu lB\)ߐCCڐp୑bfDh+Sطxjg#QwC}ԩSH-u]&9<Ѯ5e Vㆅ&>߰FyK`Ci0YQ-}4Mu{kl<4S]6jnFVdMaeTR 8q?z#G`}ve>B\r8r׮]5E){ k nժUuVZ|Xԩ!'N0x~j܇/ߧJ=m%{OmW}-=*d5)fոӻjsf;mFԩç ~[<3-wx8њnF ӧO~hW#ݻ9R 9bĈl>ݻ zm`8f͚!C+ ɷ-`57O,cǎ (SuVӮf4Ͽ LπոºB [PھxAnFYT"""26xxxϟ?u8p6 )S[s롩0S6 f ?%( cyU 4a?t3h٦;!!!A!$m#ZKMw֬YC7oN?~o@/PA Ȼ} ;͚5㏹rBmŠ; Yd/"|8YZf$qMh\Dhb#{1 nFg?\,C,/t3K*4h`G{t 6.FUZS*ԬY $ϛf+u`;g=J޼ya{d?Vf='z]cp3!C=CK݌H.\={NM?~-+rǎ+q 6Enݺ5-xhCzɒ%oQ2q<Z8 Vi7,6/C _,-7BQ3f|DvI˅A&mڴY;pIBJAh7o\Ç)-_p(CCCu/bp@jp3%ALtT3O9n yZ9nFHDDF{e=#J=G-#\X'ĮU~ʹKo 7_c!Lq3:qD2h ^hͨ<#Za޽{9k F/7V-1,!8kOT(6?<s%mMPp ÇI bRu3Z¢O'N|ZC. G5p~eP'L=Z/Sמ!\FwAo_b@;>| )Rĵ0&N2O*P Ck߾}WAޏD m4iPhAۚ | $fT0W$8T@4fWXT?0Kq3*t3jf$ =z'#G *?tþ[ndܹa2ʉos(h+ *2Osbi p!A.Y# <1wK:k׮(XUC $5khѢ$PgϮKPf͚85P5fc޽{UMDa9veMyk&۶Y/c-^w~2P鎅7 >C!PPʕ3xmYRxq7oޘ$ BG<~PZaN4Tcc &0EhSSNPhuPáδN݌6[  &AE4 .I4k,nFKڰ/b2TJ}Goze^"Qurr=x/Wpp }--E Q+Z]ØQ.L :йf믿Jn Y_{&7ftWƬΤLAh.]SE%OG:Vд!dɒK΁I4qDIv7tLt}ֵhW%4Bat3j},\]QRiC[@hԶBY3#mYע;8M.u3*l݌C4 U)8&6 U@4 MٕU*[R/t3,Fr+g߾}K\AQ#] -5.ށF)`˚Ds?'H~J)c#fyA~ԍ膐'6.Mզf{GMnF+l%  &AE4 .I,ޫq %_|4%3X݌n߾4h@ozȑ$ lEu9>yRnFAHHc̜94o~;;oETܨQ)*U*l2>8eSN_O+Z@7.];B:t?D&L\Ջ7a1û^5.;CuVZ0K\why~^777//X@7_hQr>mX\*ã"rm>;on:gΖ4Yo:u⅗N}اOr]vI|Zjcܰ0?ú 6Gggg~e˖qFF8GK ޼|w)Ҥn,BK3gNr}ֽ[T>3o BKO98go3FbBK)\0yU0S"VZUOU.6'NDnF7&kU@W΅Jƍ1#ʕܾ}/# qu}' 6x?h[xD}Ri=eBnKM$ ^>݌j{U9솢tؑeʔS[dK)8w;+Ѳ^7gOc;iC$vZb45_TiS$+5%ϟ?וpBE7a۪I&qP&86䷿[RtGϞ=3<)τB-[[d̘]XXv[OXXhX"yy(Q"~ hKvG67)Y%$1 <0r܌߿n~z>OF:L[:[ak@/׮]+qZ")F)r %裋 uCV73J),ՊYҽ46Ƥuѽϐ!?8e=yzs=g-*W| XLM68K %^>m΀QJh-u3Zx[0e_ ^O5!({7t汿B7${܌,jYw 1 扝}JCװHSnFA ?]ԏltkJ͂x ߾|wM"\muUOz{P\7w-Tf+>\GunFaAjAs7+7~cbf/a["{Xl=cs: } -G7=m+ZWmӧd)R4/^ܾC@sΚ5[;wgذac9)w!v~:?^o\&uaY*6}!)L8BJTiƕNNq(jnnn4}Ap!ݳgYt:nܸBpnݺ:/'hݻQqV+ 4VlJ_6mc>u&wYMYLСC ږ?0O -/$a܌kCjcISrht3Rͨad,YtAđmBǸfnF߭JRǧك|=$ yfͨ@`Z8hՀQըT ݏ94;w.bEKP,bǝvC|Z5.IPpMh\D"$(&AE4IK6  #A; ANEpAOnVGيrwK'O*~b.ebm[ I'''Xo p4i }?rQ6mj@=.[͛)A lcVF5^=bkBҨQ#ޕKyLuV\I*TW7$$ԴiS&M]mxs5 V)!O_B[4!sKrin@@d\s !w筸OHrp>|CT.] ݻwl(==I7F7;YƑA[IӐ$6:8%%iwFgg+> 4c _ܿD f*O$ `GHPP.QAX*po 8pẊM曣lus?k׮.߾[PpN$LFm+\@N$킶I祭ӧDBᲑXe |YfOQP#Zazb&_$ f#Zaɸ5[ps-2}t(K[DkB"8pANORwr~|ܠ.QTƅƎ;VyyzլYs׍78qDoߺC^;C ϡ͇JhY?tϞ=iٳz2eʜXpa'ggӛ7oR2^J!BCCT}p vBcbbi~xxA‹)Ve[`SNFî!PTc׮]QB_v@|n@z͚5?5jڱ'xოy#7ٮᅥQ-Q = UX0M0y;v0^Ƴq޼y] ԬY5pe ҥK+p/p!x/D6TF̙3{crbn&> <OX2y^bmysM#Q͢իW'd֬YӧOG0Wmݺ5>|^J,(lb L?͝/T*P8_T|&$Hsٿd }*ĮzF #KM"N 4_D?ѣG,2eJ{?c!l?I$n$ޒj+YaA*.k5%hsh9rJB(nsՙ0DٲJs~̓7,f;6N`e?+`j YV̴Rҥ1u+M!ZQE@-VqXO]r_~EQEo4xsU :t͖… _(l#+( AeN)  T v. @_ vF EnqRH^>X+Zծ]{{ʔ)۹?pѮ]j Ʉhժ fJQ/.4lT#1*pPj8q8C;gh GEE&iӦ&MJ>}drk|%d=Bt|Wh!W biv_/FcϛӶk׎lܸѨ/320Q2EOCCFw {p|? {JwD89'pe˯l^͏Ӻp\qlV:tI&{&1/j/pyam(Ȥ):u*U*Nڜ-1*.+FHK[n2bJUxQ|yȁUM:7< /^8Z6=/Cב 0F^`iT-PEq0Q:Nɋ/tD)p b'p]\\Q#]udKG*jի`%-ݦX0n&Mq4!$Mp˖-ky÷oq|JD8KEip +s>lSe-z(mڴY/1e A$iٳwBJ;y-y&ɓ'5 /ɚ5I($Yc{W彄TI :B^6?g tOkE߿}w1fx`h=b}I$CD2uz3Y x'epjY^v}0=B6`شEHHHرcrwŐ !)Oum. ҧOu̙3%N͛7ʣڵk<ҥKE>} ~2Pc)h]r|tǎRHH"գG99s / y>{'LK O. [F*ڨj.#F)[ݻw'OH̙RoeΝ=n^wsW:IȅZpx8j5Z\o4k镫w%{a|3Rekw-Tf+>f~IP?`-;TA6""­|G9 Q!\rĉ2wAQJBe ̝;X%JYv^Li$ݸq#_ICk@ٲuY@ي[9N@ʥ`Ŕ0?^fGl-Q¥[EmV0Ŕ- (۹%Hnx#Xׅy^һ'aL2qX)SMrEsqu9jXn^F0W7ќ?ӧdҤI|`?gYUcf9\@HeK;v,ٺu+ٳ'իWz` QzAR!\5e5U1_K⍎uJ אl)߾}>}z]D!6ĉʶ|ѣ3)5x %skհ… -Ƙo AԎj7\? 6ydRVܐ9s$A*T?~\V@c~^=t>]=41{T{MFd)  ׯ_Ӵ:*!T٦]6+Ѫ{ݭ306ozSt4:?Bl*.+%K䕭/!wΕ+W5PAV8eauLAfKnk6#`X`@lzoF,"v4:%P+LEl*. #pPyrH8Esˋ/-n  b J#\sݜy@+A, %SNnWV>G Q+\Pli!,X[߫@E-ݦX0.?;ґرcA˗/<" /433ebXӃOCClltO#D]pa'x@RDk4]yæM;WZ5w^+%{s@-6'oIkҭ^4_X~Ց+Z@0{kBJ>~FH-C7(hUt);K.|<8$H/*܏,iԨ&)g齋&Wa>)5z siH> iKXJ?!3zO>DSGpÇ^5kuƍ|k͞=;c6P0gχ{ʒ%Kځ)2|AmNd>q$cŋ_/>>Ξ=[LAيjYreK˖-k R& ʱ}ɘ13P0a`8r4p Z-FesTp-#W ([ֶ4iR_ ʖT;j2]v-7gQ?lMwҞ73<`G֘ }qpt [kʐ=MutU,-u^)N>]2((HɃ*8 V#J9mS6r䏭BeKyBfRvzka)SgDAk@0 ~N~ ͔b;m|Gs W+^sL}E/y/z'nQK3kpIES,#B"""@BVAAD8\ҥKknwss+9S\A4CjjEʕ ylbgŊW:Κ5kHy ]t)u趡U^]*仸k`|omAA5sjVmb!kj`!6 A(\Cmeɒ?0Q90!  tf͚I [chOku`t? YC8გ`>b;mDANV-[\jժ " [?Mx٢3 R@KA e&*1[1OwK̢ywS e˖=Q֞A, !Q参 ,Y/PTdn֣qzu^{E$qOˏ%c 3=<>p)S*Q{_8Z8gR &6gtLSg'bX$8˃~f/_6 z"ɔ?CslE*O1 7vaԩSuR-E3D`#!ٳggR%`VXq|"ALH…eOgUɠc;L- . AN8/[IH>8άD)p b'1|wBQ ql:YvE]DN?!XDad++WЅS;v 64tRxf͚f֭kiӦݻw8Yb-Nd+\VÆ  /}MQn_)Dm۶X`'PfMk.#5bA+UX9VʊÜu{s f1Y:K/{z,z)4fcraknX%5}8{]b5|HF/'epkxs<V+sRs?RNm'N(sL9<<<锛piYR9r?^˅)rϑ#ǽgwvvp|ww0۷o݅U;vdZ4ѣG֭['''>nW !ȅL2EOICHu@:TF4xrs^ԣV (9˪8y2 tK*eYA-PI3$)SK /}^f:S={" sRr?ҧO.}/xsm۶աeXe2nܸ+̟:uj?h۽{rQh ]΃vC"GA n;7qD\ӧO/' zu /`#D.QbhBY U=V˓2<瓤JGl,菘GB)_cGbiJѢEURR~x`TiT%Jծ]{X,RVXVׯTx@-0wnRص+Pr@yDԭkZG+שqsU?`% Y!(AÅ)]OqV(]BsGOwAD;%Ď1e;JA1; j q HBfjtA?P8tP%CJQ/pJTZu_tt4~IA-ajhlc  e˖+WZAmd+ܕ+W-: )A;p"YfRh gEnQ/|Rm[ )6\ H!Ky&5ǛyuO>ԧOG9 QF`v˖-lgQl&L#}Aԋ, X1^x-|vB S L4:Gs>߽F3;ǫ8w[?&9$P2E[^7>? {J%oԱS % Uʉ]Go =xt>iGwaݻ;NREaєPٚj|)8;xIY?(},^Ƚ| rH #szY")U+0:ѤI8y; ZAfj ,r^p*[ayk/Vy*[eǥuž;@?,׃N:-}B(b`6AKbDI:G?(iի@E-ݦ,~|'7--6{ FDl^xxG)EΏ%\-VUVmo۶m far厱iCזwGѓpܹ=s^K> gϞe\xq{0v0`d[fMÇWk4SJUl}DD~:|!oNMS!3K~ْRJJ*ջHWSݻ(D9mste>(@PnoŊʺDJpРAxرrpMO:T͛7pdڷot)rXۣG1,}gΜ9=3>6lXxѼf͚}ouJ.]J8!Н'FUiҤ5k$v2RCj-b_Չ{n:ZwɁZ7,`+k^VoAM[7okv4CO Xk/tb܏,iHQ!\;WJݲ5QHhuhrˇoz }}RkpɻW1MC}8OæyIft-V[(Yˑ-K8q⯠nWggg9s8`sf`oB-Ut%JMHy1!1K5.QKWAqӾt޺up2)4=lEJ=#;bKKW C6v4x͖>蘘g(#wޥ nݺ[A{M~yy{NP•Ϋ ԩd'w16jo߾07K`޽gڈP!1kpO4^ŎmT(p:23R)pBe"Vm\&}O1`JU3f /Cu *t T,Ӡ"h Q+WRyhnJ-*=tqJ-X Stidɒ}Ja ¿Y\S\6kbg9V[ .!v)[5Q:čBC;bA7R 1 vPŢB(F6]]]CLP522R-hTb%Т 1>(% PrK`+L2=UZ#\ER> GVja Q,b ʕ+[A p8_ J,3)T E*IJDJm%$pb R@GÇ^JQ7v` " "!l ~ I+ܮ\TPAnHHI<9iڴ.$m6>ܹsM8%2(Ӽmut#`^1N ℹeF{`\u²m{>?|@:vH֭[g4#ܽ{68ξ bY:UG^#^@ի8)!'S tu _ U{!~~~$IGZU_Wp>Nh֭k'vXӯzPIᨑ;5aյp]W?w2X^,ucI%tzP?ۗoMOH)[CM=9[AT*X_@,b/pEl9G,Xj턣6zHj@,r< rാ uԵU#[BFb P *\A;pPyru"K%Q" 4|3. R͓lWkO8FG vB½s̙3{.]d-V={,ŋۃÀ&Cޚ5k>|"XA*Ub#0a` JQ'9s3flذacE5k^)*VHZjEO ,$EY:utVJYʹ5= 6riW},iP28,MR2B.$S uhBXBjgR5|ẼK."EHׯ6m.իGl"c+6:\O"~ +w]iy8B6gu9 cҰx'Oڵ[2hРgΖ={Tar?vymD}{Ç)&M@N>]͛y/~s/_.\P+p;vgz|ԩRYdy֋Gyȑ3}֝~UZGC)-z$00̚5#nݚ >\^IĉyK4 ([XOs狧o?Yz㠦kA+{qZ&{k҄Kr0iqʾ}sd)2|V`wYʕܾ}p_@m6ω".ڳIz}j6 JVV5j-8@¹Wqn5A) 'H .|YLQBBBJN\?۷*qssx⯠޻w/[nݺ&p?~Aqu](U)8H~7ɗ/ W>GTpY)*pѺ"ׯqAqlŬ΄iPp4Wٲʱ`?<ѭsb`F:BR::LISlҴX:Gq ϱJ*[) KFpڠ|䉨&=_j}SN %VW[47h /,P[@ A جtbw rܣՔi[ι*̿*H?(_TTyU)WܱǏ ر}Jk'N8VaqHɾ B<رcSH6Y|p}FhE XxA3giVtiE-%KF>}Hӵ##i>b?76x k|~_% aX! ,6!w`;WnαG`DDI0rւQ:.\H:wl%Ď1e;JaG4ҥKI۶mIҤI777ʕ+S˲pīWHڴi|߿ϗao.ZHWFƠ#zA8X˜h۷o/T^^PbɆ>wa;R(=ɿyһ8x*bG7RV.g[6 Vg(4лwo D A?QzA VA@ԍÅQrKԖ0VCnp b'd+ܖ-[d #md+ܕ+W-: )A;p[fRh OEnQ/|Rm[ R@FmҤ:A߃M65aC-[fY_   UQF‹oӦ2xɹ&S˭ٳY;y-or vRA$ L=@D&m>n׈(Hw#`^1N b?'~J;r&` !L`-**JV%ST>HpE߿}wS#&:9sXyYի1c^Kk J9\P,#Fa;l{wt| yq4"DBR@4-ajEō1%/_l޺Āόyd+[a@B5^6M+-wj w}s1XhU(\:RQ@aRQ ]vK8*S^-a̙z19>" d)Xϟg=SN !pdTAޚ5k{hy #K:99ņ=aҼf͚a똲HFP=q)S9CSp6^!"ZZUkAޮ-W؞[(W$ǽV&|2kH݃3fr-{5?N‘l\xi>Ǐ? ٸqQK7GVD+fsqĻOiѹ]k %Mw4 i9zG\-2 jь I)_ Ν#^^^ԗ9X>e/R@4-ajEy%6*c ipoJM6Yh)Q9s >_αctJl5Wq"GOU{'i<4rž?(5E5Sք69HADCBr=KA KGjteX`D^||| :? n{-pd\N\ϟ~4h]2R%S0P.#Crؼy-W9sy9\6$M uʮաnUJp@QV& >AAAz#dGd- +SXGv۷o{dc%tI]p [T(x)R5(PxPczDnQ5_ڠ e`FaaÆzDm(pƍIl+V%e )SwРAKһӱ)  OTAE1_ Jp]"RNhP0:j"R@*st+V]ŀǸ֭[[mDG?(ixЫ@E /l||ܮ5\S[rtߧVEk4cOa#,vilmzPÇnݺ-\Ν;yfݷot|߾}.Tr/gtOx lOÒ%Kv`|ׄ]r" `IS6]vE'4o|u"E. -߾{.Cyȃ4/&-ix%Ox;wxs3fpؿ!m7CV+W>}4פI4h"-P5|JE…lܹE$JK#c<\yr.kZܒSƶ#?P<` 'e ݞFH5E )e!vĉ-Z'U!͞gY;m[%|*U?XŊ\矼4ݶmۥ-[\ٳiҤy6mW4-]VDb'N2e3 >^ZZUkAޮ-W%"ߥv_BGe6ط ^W^S˧nber~6CO\͋7Iʔ/s;uzCf fj C vZa?0T6 !}MMKwܾ>)5G36`νp<6耲uqqQ.Re"ߤ|/)UCTR_}ݜl4Q&UN[@ ח4nxgZvf G*{J=-K %v]]ŰBO\V+w~` Pmfm0ax[ԁ3kP1KUז5?`Vbl3ؽ&{xȐ!|HgϞmΩC1@ق҄4U\z|"o% hCDR9+=1^zQ3P3"B|ۖXBPyʳBx3gClE.&p1xAPp]<-x% \4*gd OËj ]Gw?2j)f">_X-*[vta^k+ߧL-/\6|x7U>LE˕)ӋqrQ)XeX+)RlAvWr Q#A]Uҕ^ҥVɒ%h˚XzJ~JeJw0v !ϣ4 H<.!v)[6\ »{ί;y-2BH4rN$IG[0PLNCXXӰ;m۶1ϟ;>+za1cEլYڵ˦b{U#ﰔkIg/'8'N:󂇺#R2b='V*|IJ*{߹sg>9!v|C [L3(X,͛gLZB̈*[qlٲؼ}`Ȑ!qڷ7%wN+N:6Pt_ͱ_1e G$4/12g-`ltt12̙S*[s7nd۷dtK-΍bv*:OTp1!eA dɒ}Be^ JoiRrK`+)Nc '_ɔ" pA*\A; ANEpA*\A; AN(*Ađ. @ b'P" T v. @ b'P" T v.X8@ "(J(\3Yd}=B\Cȧ(得ӻdm9T`Dq'bITT[L#\WWHP~~~a~k ,[@kԁG-G{VSpSNٳŽVVmoRNwHL2=eȑu Md)'Od.^ *0a;vD<8޻w/-: 5d)\<9RM',]mVKR|yrmrE7o^2p@2~xriRre]]Nٓ>ĉ̙3zI.#Y7oeܸ w)Yܲ6~ LAHtKY`~.I&%?/ ?3JÆ ɐ!CHbjxd̙A| d㢤Qd͑qD~"uzgNf<cVyHڵɜ9sH= ߷oZ!Q͢)S 9ql"EJw֬Yd̙z敭K.VҦ}v LZPdY3KlФr;&%~LW^Sgnr{.Q3Qq֮]K6m{_T)r){>}^=''v>U`ZXY_sGbT&o>3dS9M+\~֣qqN|/lV eΜ9Q"@5 8~8y?Zslaᅮ_)ߡC2zh/_>B 5@}L)r-!q /ƬF 2eJ(KNcvS b FBg ё1|u|(."eKի?eԹsgeM;v+WΦm# **iӦM)0KaGEcLts%0Ϗ 6gqYc۳gOogFysTlWbq\s`11ͬ1~l-b W *\A; ANEvW& V/cK'v߬(  ,z9ҥKEX#;jP][$i۶Rl9[]#$iӦ sb΃t^f;w֢ 2<Y/^߿%K]v8'tSGyΘ1wݺu1bÇ+R?PÇ^5ku }sUt铐.\ٳg6&M#>&Jԯ_3jb1I$_ժUk'u6@aߒ+W OLvem@xhڴi}N-uܹ-T[r,X*/_\8.@.([g9pĊTT鐔Oܯ_&-x#eKBUj<A: о}yX=׾}bM8QK/-dXl۷oiݻT&"b" I&k4 yXinACԨQc7n%A;Do]-1KCP}N%K(}SC4k֌ 'Ol{']Lsn_ \I+&I}ېːc~]Z71,!9iFK񖆸 ')?ٲe# _Pp%Yye 鵂$WD#&5$]"ETpbp;b`7 {c rC]jhLsGP4 ZD5 PKRxv&xEsC#}SB<|V&.$z_3[mIJ( W!v`jp;bn MVw7g͚5qqYgi9&"Q\"8 pA*\A; AEb(I 9RnA tmS  v. @ b'P" T v. @ b'0|P,L:XNDEE̙Ӄc}BnRGdzq ڋkv`/BɂP0@8 VׯAbY wϞ=9ȩ3gλ&ƎAm(Qo &!?z'0RlnZ^z[²eҥKEB ۷o@lYQ3nJQ7֭U7n@Zj G ?hwС慇eXt) 4 Dzҥu.aСC|4٨8uE̙3Au(Rƍ 9󚐉3<(V'q4TODc #ܓKҤIc?3EOqr%+v hQR ~C=oJF|{hBф!(GVjnsbwThSNի[nJ*_@1 /(P@d`F[كSU щ=zdRYm5GzLƆM35`~; ;hS,?HDUرTu P%I$ ]^~ܹޗ*UJ/r/۾}{ȽnQFP'ˏpŪ@xSվ5ũP tt%uƜ>l{#ܻwU(\! 0|Νt;m4ҸqcF;pEj D$d:0?]vg^IfͤZZּ(vFS+ ;3@e0gΜfli6}1R\9 R(paJ^*RG6M\XR%ύ?0"6t-saE8 ?3z*L[1jO()b[)Be. ANEpA W1J>}RPy[EF)ܾG v. @ b'00HA{!vHR8(yb>[tvڹJ'bm#S  vB-P5rI5GyBRS~s^^^UTR=D}HL2=e\ \$~0pI\+95S Y ɓ'/~B G&L0xǎ...Q4/,,W5jVÍ"I> CK_D ݻwxgΝPWBEA߿?{9AgϞO׮] ˻F@͚5[á~OY_zjv-Rn{v7mԀcӿ_2G)z.:::,j ߰aÍ G1c{=!ٳ!\_s!̇8e,{޽pF;2lZ)[U.l˗/Iƌ3jժ H=e{6߼y\RHL_,_Xn74 o:*</eʔu>/q1V= AR*Bt*a?" c q#L Oκ+|X#[lnNºkխ g<&RZ% y]*u'N5$$$ Ը1GWj*SVns17č0~%e˖\*q^|t^^դhv AP\"H|0bǞ+b'yCXJCđ}V024JApA*\A; AN8\BD)*x"CQ R@bAN<AđyTREAC쀇yQ_|f͚_E:vuc>ׯ_ɸqi0GwC`9 b3_4ezjRre x\l t׮] t!.AQ+\:MFz]$eʔz4$߽{NaC> EqKG^ HԨQ?N2 '-$T# EP!,ʙRG GrfXnA{9JQ+3f|tu9 j۹>}I~ .XܹsBOt1*ɓ'j@T)A,wDcEpA*\A; ANEpA*\A;aw/3H(߾'T};99A4'H :**EK8vWJ~%KF>.T?ӷWwON+~[P0@k38 V3p= %MχH,ɓ''?~ԋg ˩App7gtׁKERݤ(yEh$7I&|a:ؿ2uT]vsORJ]QF͛7rϯ6Sc"cԣO8wO5/P<ߓZy+u5wG:gңGA*:GEsCgNРcƌ)[ŋIDT"HLȓ'O4(p9%) a^2X{xam„yEj'܏O?{:a|r}%$̫oȡazSքCPϞ?p *޽{IժUmA*@qX= 6L/ (SN޽{GǏue>}KϘ1C4Xh_2'n;Q&7"֭[ɓMn:smڴ![9_GYS;PMZjGVP…/;PϟX>:3g ȸ-)/;h^>`i5Lev87" m۶OT ä7kLbooHU@ˊKn{V8Ihh䵬1[ o)OZ%k?x.u_-yiT-P\*S Z. @!8Dh vP۫OjGF2n=ܼy3Ͼ}^)z歹Ug[}E#4@ĉ9r9 U9gApU *[_`cϋzbsTB ;vBOrrU~nNAf X N;>XTmpJAEtݻMlB"<6ɓOtlJ3t_ 6SloVv;~.-q܍ 6ycV-!vX~H\,܎Pek77m>-u ON?֭?BaC/d{`XBkL8l2cL&NVn8M7V:'[eV)i%+W|@'לO X'Xz. `GL/˗/IuN`@ٖ ZxHE(Rp;ƀ_*Rkd # qg- T!s([H_ PW|x;͌6U:4\+`m_%00p6G'i-(TR{Ν;kA?w*]ٳ*l{=7ͣe^zG1zO8QlӦͲE^0a`M5kP‘O` fSHDg^~… E#!{olҤI QŢBڸՔp;7uF{nz)`QC@ƚ݆F7FӅԹ[P4L~ƻvy޽l>(ƍ4k444ԟ*[ic.(Bơ=ϝ;#T۷s6-[c 6eO6or}TpbGȸG*,} cmӲGy*o7)R%fb?/ncR=CxK5wlͺ4p=} iVYܓUz)%wj]tO A!TNUɕ+m=Hd`WNelӥKaÆi_`d,nsT(ؔ~9Pj x#FCኍvp;Ʈ{Σ-H(ar憸X~`aYr%W^mrI-nu[78yTy:-Kxxٳgc.8#)@-Zԁ===hB/(8v@q `*oHs ` `A\xMիWRe? %J꺹Eyj~ᔂ CPe Ul+nG( ]#)[7(bC'ɿ,f-ܭza}EKyNC =OUVi߾bxAѣGk> `4 ^W^-Hl_`*~@|DD~!*PrѢ<,͔ X ˚x[ԭ'2w T6bcVZ- T6Մ+48hzcK#(`+n昘gm0ر5R(Apk`J/.( "*\ uVn8Ep-qh9 CX0a4v8 FBjJ.X(N)  n`c.[ AA~`;Fjur}G+Nƍɺu׮] y+C$~!v~ʶN:kٳdȐο6mʿGnܸ!oTh;P… d&/^8㮔gĉl*B-#\tȫTaT Rk!B)΀>}`9i7mڤFWj֝4i;'Uǔ|A\P!U4pDԬYS20p L0a0WA r޽'} n0Ď9y#!G2b 8EpA*\A;![9bYf t?"[bL.A)A; ANEvWS$"_?|SFl #q]>! WIo_ɒ%#V俍[RN;0'9T( b  \PFS b@BDkt_b­]ݻe˖z3f|6bĈѐWRCsik3gλ9mQۂ\ٳgo߾v"E.*UԮ]j֨Qc7}=!w:AVŋ? f͚=XdI]/PFK.Ú7nܘ[';tFyskݻw]Yf^z@tժUe95cǥ.i?gK=zy]XvGo l~.^5LVYi8nXxLWꘒo l!.]=HԩSuRD =kMߟTaB|2\jiٲ藊*[ a'$cby`!ON/a޼.;@j'p4 04iRgEYܼyɓ %]d0˧ןɰ}HiWȰbt٣\ٳg)S/1 B2"VP͢(ׯ% ԩS|u8R\5Fy7" #~>@iRdOj]bLnΝ;˪#$K,|d9\ Uh7v]'[&S7'c} Y.O>%ٲe#<]Aj.(y>|8qrr"J+f޽^^Μ9e?f |ٶrKbeGh:Պxj;vL/)ud+[Fj1dyPn#MՉ3-RZ83FT?~R@ *Vy1c/ݲ".?GPp5gV1c!v/bgqg5!ËO$c2X.Qdn%۪vz#ygg'iI+m)!`Ft5Wraq:[zEj> quyvASd*S Z. P[ԃ8(͉&(G%# @ b'P" @J{Nn( ! J!v{b!v}؁νV>)kAR@6 !v u =lbǘUKF_{" #Uq3pޅ 9֮]Kbbbx_Ŕ.] ]3)k<2EGF$̜YߌoۖtpͩtNR'SJo`7#{: 48<<܃#Xcƌ>lذl~)>p0#u/׮]+qV #(ϡWic!n;2/_. OPvҤI 4ի-E3C)#3~`ikbce?&GѲtڬ9teȑ%|qƍ7Ԑ"ɕ+m8kժbuɑsߓϞ=ּys}0?~E#7Yʖ{G8grJ!AB~޼yyfȇ>Tp#ѤMMZ#܎5CMi mvd|[<:5,H V~H)[ "A-Vp/^SL^~ax-l˖-{صWUkSd 1KC1L7~ f8,cm<rylZ#2<)[HV-A1Q8/+,'uѣ9yo޼IMVXOG]3TZsZR+(pCX3č5-b0zV"T.:SE"xhN"hT vC%C$OI A8 b'P" T vCFB|IK.X(N)  b'lbACC-!v䄘Y ,b9!fy͛7I~~QA\cA)\Th)\Q+`tu A@\nsRq;J?9(D`PJ8 b'P" T vBu92k֬]d+\\B1R@pA*\A;.)[TDD2XfnRGdj?o|Tc;NK_nbܻw/Rq6CS b!9r7lذJQ?ŋ۷ifСCAA6lŋ! BBB:9sˑӺFu1jԨM4YD E…0UVp!*ͣ!ъ#F~JQ7nl|G)rnq\zRsԣi>[^ua|oBaEI]C0 v-=O+u5v~4}$<<{I6-//ZvEnbw̞eP٬Y8sժU|t1%B-)S&>ݡCo>Y}%) a^2X{xa~K7KP GtttId?'6y&ɓ'AID8 *ery[HJl)b&MrE7:ƺCj s8y {{ըQCo^kg?s4M)_2W'ƮjsXU&7boΝe%KBÈ~:o/ߤaɷ3o+wWr(Q"!**YDF yÇ'NNNTR`{zy9sNȳmeQBGZoY@cǎ±Z',,,e GO] hQXYcJ'Z?tٳg͹.U*`cƌ_;e?E\.v b l(6WkcB^>3M =t)d|-{/!!!zyƦD+(psuh)\Th)\A AN(-MA Bv AoqlXhܸz[h R@4L=h#Z.z ,xڵkP"Z.Z|#FQ]0C*f 5+ZJ``l;̆ ;p ʶ[ns?!AzS(sAJ*yy-6o߾^-pՂT8p2(f=z([00ؚ:uj?wz?Ǐ/ va(Ν;hyc% X/=mޑ*o[Fky m/pC 9֮] ?b Y`}ඍ/ے_L]3)keH0xÙ9izU#on-ЛSl=NZ9 լ[Rnʖ=BϟBvs%L-(Ν;/+۷D`@y] M+/nG.qcixsBV W ndLX ben:*Awۥo_2clUuz 3nmçO: YiUx, sѢEhLѵha<˗ 7lp#dtRCWxr)HOʳs0=cC0rf݅ecL-t]Pp%/gTp#ѤMMZ+܎Be98>kD5=CzN n8 ҬUd̘(Kwh9sP#+\1uNPK07M޿FBYc8Tcm̯ʥ æ 4i\0Ďz'wwwԩSgGUɓ1{FFFrDȑ#Gs@v:޽{π]K\,Yc<Cvɶv@s Qjۛpپ}{mCaolyiҤy J>a{C@9x?{@8-W%K< b`=`{#@s Q&'NtxEkT.(ܹs% `G; ;bpٜ>}_Ą}&LP;bʔ)toHTOgΜI-ڪ cg q A~βxu VhJAL]AMT/ .8RO P#(rP"zwޥ4lSBE .x 70Ď!7N|npċ p!v>}XK&'OT 2ľxIq[?h y'OdM6 y G;rB,u 9͛C hgذaV^Pi6/b9!fy͛7I . @ b'd+\ 8*f8[~ EA)A; ANEJ(\ Lj?o|Tݿ>:AK!N%YøvZ ( b! 6bĈJQ?p t_"KBh6m,:t8H7h`ӆ x"=ݐ Qin#عsg-Y aժUk'(\J/~bbbP L-[p,_Ѱ0?6T:4ln.] /_k۷o/yǓӧOʕ+꺸>ĉ̙3¤õQ7I.#Y~_}:pHE.%MvKLf-[mec7̄i~f !CbŊ< ۰6c"-j\oȡaqϐ%8^Wڽ҈o= Dk׮M̙Cza}HժUmAsnnnL2ĉtg͚EfΜlh^ tle ,ԲO#{熣F&?5#oRYH@X̙- TpǏh>*Vk ƂEbabCލbCcb#bWc!jQ,E}W,^vgܻs3ŋ|rmHO>Çݻ7:u*+W\tggg~Ϲ8FM RS-f%Eӱk*gΜzxp]pR#koEBI+WS~Z*[&5+?PPVvm̏Py&7)j[fPBmt59Zh]*[=uK}DÆ X D5DGGмBR'sG5C0p.0W'ΰ*Zoee]aFp1E+4) *\#A `$bLj&6δ?}@z@X-+GU@Np.| SQ'=M#~02{LPRhcX _ ~nwO? MކҔ#/WLt;zh`7.0`[retż]aO[Z$\;=O˧ukwKu9|SV rK=&UwZ=?~:tm謳wkFmؑ@9t;ex?4-'Uunrڻ1̧}4lI6mW{)sttLNuzRkpU e7|Ț%KRyqmȢ%J+ίvڡt_Ye+PWَ9EP,+^p 2d)>rQ?ym:Z޸q,==}o+}ɶRJwۡr'ׅUn_}%6ks c}bҏ`ɒ%kdZ߰[߱'ldrHu:?Wˣwd@M6 hO1ooy}I_TIM6m8ـ\eTOr _Y+ֵk wp+?CT_B\TrL27#""z5jݻwKHIѲTP.ee1WqX5mU5ݎ*^?.V޽;y]z->*]oRmJ/dƍq:o޼_huqE'ߊideشi8zS M S7k}-Re*5pifv-5 ? 뷊&n-0N$kZ4Iz0>TF HP 12X rS0Ŏ ?rzCO2_|cH_I]fϞ=v̘1"9IPKᇌNx+}2gάj\?-.?pMNѢE#ڵk 'ZOJJ2vsC/E.@z ׄ/_PQQOrDT -^0Wf7NLL\g5j`aaaQF4ARTTtޝFuҔS-ZJ4.EtuRc(HX?3Df[nBh#F𣮽>ն4p)3_as ` PᚹÇ k>|ȧQ٤Iՠ*UVQ/m޽{b$\ 2;4(3瑲?qn4KS4nthITf-Q'EwBesS~: 51[v$N?ZLqݻ)K5e)hC0p.E>r7Tz@WYb`P1uK3$rPق&0@ 4) *\#A `$ZWrLD :t. .09*\tc֏gg#r;| wl~upo? "\#Ѫ­PUNm_iUΝUxxxU''7>Tzt}٦PB(Q⮲̉V.Yju랜={ؠBMNYXX$q޽[hpɓuiӦO iDl愀~0CHQF|”4n|||}.\8y^3\j`uB.-kDpK.菮g*n~N1}}v6z<ۤ dϞ=ռjLOǏi ?h^.wl2xTH/CIaOaBBΚؐ!CTna֨Q#]`tO38;7oP KU@Tu*G{[?X57[2FkE+ى###5Vx .-1dNw}sF.h97 ZBE?]ΚX˖-5V֞fx琞 $ٲecZJ^LWb^av^z[www׺ S_XeZ@ qe^3E4 t:~Vřs$vﻪmw^2hZْC;wt9ѥ 4ȯS30U5=|T|h]p.\<<XSo?}ވE[;mŸos;T붳@.4K/SV.VU /4-L74튩4pR#_)~Ȼw$E>Mlg#*7P\hE^xIտG]+n'su`C]+\m1l9sr'ݾ~SXȈEZan2vt0 Nq#u_NCgi7no۶mvޭ1y:"[ZVXWEm+>Ŏu4vB)nE?H.].llRmF+n[Hdp*\#A `$pSOq#gLr;F&#A `$p؉Hhaaa1)**BҜ߿o~Ku$2}Q'!0L`$bիW[dSʕ! |ׯ_;3=M32KCOЀ?|0qgسVVV˗tėglѢEe*cz؉'$~:+WA/}eɒ%cAڢ? .ȯ?Z|=mDWkG/q녖d3"=gSC>6dO2Ŏ6SebFV@(5k!T,ҥKE㜼/_h?"-ZC"E&l|eK^ȬK^.*2Ŏ6SeV,XumǎrT1cƤ)ժUKQ u%{:au0?MoSh: ʦ_ժUSӴӪ -UWٺ6̙;o巣)] ޞ{.f`ٳg?/|5_;{7gt 'L[G{l9ޚ*g*ie*[42>1ɓ'|Q Ė-[uO_3mȑ#E}څ`~˴A'}E=xy-+;eyu~UmW(-1TkmK.eC aGNSjst*Mm&LB'*[BڵkY޽%TųReMeKBMHLPL?6M Xw_ -t*bY@q%;i3=iLa̼y3RdNڊLtЁ_X5T>߸qTq>D9J۱zWUZYXX|8{*PZy_([7Bʕ+5biJ]u!˜93svvfϟ?W5ոwDZ)ljNMBPI-E-]d n8.̫Se뵬sCׄCM4nܘE Ep CSS.DիWO_…mڴi"7n_BŊ m;oZc4Q6KݗƇX $Oįű߾}A+|4-SlW?mp*`}SOuLX*j"s#4x)Cz>;wXR4T V6YtP{'Ϛ5+_~% Erbo޼ѩ*[kkkUJrK5fk֬I5UІK,f5۲e "ᓲ~.sdrGv-9.\ jN/ Zf5osvP\Qn?+ˀTҴLy_dI+ZqD-^-g+>^i3-<nV/7=b;B-95Za]jV?|wT*>DѲJ[լM27WnqQʖ(fDwuպI :UО{~^cBmck@4A_)Du>oůx- qHݿ]Uz\"6gز2US9e0wNKq=k˨|jw? aM+$U<ںu+sDŽ?OrOh5~qC)}&u0dYp#^ c.PDSl#X e2J{O@]،^JuqR$ "TR(*=[z|ju᳨Iie ;$!111F?frw Ž<;5ci]cӨ:>Xx!Wy];\:0y TlzW wMU%^ +Y_r)vh[E4vP9̌'sC_>S FmU*uޤT.ElG֭KxyѢE#Fƚ/J*8Urz b)v=zTH Cj ⷓ犮4lmСfkei-H,AeX="j:_9j?X!BSQ+lCC]rJWH&Γ7lu- y7k@pppSt:,>x|Zj6v+Wy={k+U BӥsOCWp W CUM M*{ pA/,Y2TV.p޹sBL`#gTKSYD˟ 8 ob?fZ9_/wFdQmh*7p3[MUg7d+SPTwW;hРNut:WLsww!o!>Sۆ MٳgO"O\vjsKdbGـ~pq~T/qadkUʡäF k?'sƿ%49:]ȩfnWwrB玆pmX.=&qxT?~?xp!礤*ywƸ3q}!1i,9ri;ӆ57O}EܗBvV8}u!NXz<b4mʓh$] n 6OۈAXrgFrAN¥(4TZfl޿ 3ڊ#”/QJ5pG0k֬!CYdH\ȑmLL]|?|wTDw_~P^/^Tpgnڑ43̸dpr8w]?$J4d]9GPw!nv@ p>}J٠JAa6AH_6oܹRJh}ٲe;wUئN:\\\.׮];Tν_|G޽{[ӈ3 Wݥ4iZFݣJ% Tj:F,A]^+u).֡C;;;wu puu=lۆ־sNiӦMT|+94hp_c=JǏن JTوԝIޤRaCCTf/-J}L&+ߖWJW/=Eݲhtrr-[ƦM¾Tҭ\+\DD]DR%uPqꑴ=[m{7 6V|~.miz*.֊be a `ƌh16sbit5ō^TvẽgtKM $d@p.` *!>>Zrdbب[Hhaaa1)**Jі߿/ۜ`iL_/l g@#1;t 'fSWb-WbG$$$D)fefѵ%G_0`~g$˗/i<4آE&Uz'NHE{(cLQ!0{.w@5TF HP *\#A `$p.0TF HP *\#A `$p.X>2EL \0)p L \0)p bnL09o?] 0c_|ɤ鶾)SL3gΘ_u!\bٱtSK"UR]Y<v(Vt~ wr/k pa"11"@g.d cƌSXڴ,  שSTΜ9*88i߾}oѢMGFF]zuv ,޼ysg۪UV( dɒw8% \x<==;uEr@eWn)|ԩ:ccǎ" o޼AAA-?}dKAx/+T-[knΝ;` E9B1?~\gϞ\]]LmK몂۴0,zJYZZiqƬZj,$$Oϟ۷Y*UÇꗸQF̳Yf/_yFG{؂ X.]%YmzkcXoU]Ro]νdl*ýUS+ccmszxƆglӿЄƆӇ-[,9]xrYrTtRɼU}Τl۶NwΜ9Ê+ J,-YNU~3s/ӛΧڿNcZ+Xkuk2W݈YR]0{Xxq ,FA!Cۛ>*RiӦK(A.-q|){fWׅ`f,:::E:n)ԩիWÆ .^ѣiseW^e/^)jL& lm;yՑVr`uneƺp`ט$!!A:Bzψ"9SCBʖ-֭[jԨsхH&%$lm76Dfae27O޲y'i]9ts}ϟ/D :ğ"o֬Y/dÆ ٦M$ZZnbԺG+ÇV۷6R d7n{Ec ij߼H`l?^{^s)>x6FpKV\29[owۗQ Vd`W=̓'߂Otr,8v_^0gp9880777 -[RtA%EEE1GGǪW*Yp|.\ڴi?R-SN\[vm1;[qMU̥1A݉Ǐ)˗/v.]b...L]SX]Z|t#63e.c a7=qtv+*4*.ªqu%=b .uQ(UTy3]!FhYݤIعs瘽=Wꇆ K2o<6ydְaC$00M8={÷g>? &xϧOk u2v c5PZ<^LR3eɖnO (]~{t U< 'X5\5Z_i@};.eΖ3Ζ֧ftw^-[6VbE/Y&*K$@ .G"{.Eb//@YKkLL (,"Gښ IUI7\yOrVW1 0B#)smY EU툝$ߘ1th;a E=TlPK>{sm*t&@F`\p b!GHJR`.bs}ZFrsaܟ?/p| /[iOU^Es9r䧡C.F}GڵS\5JS¯^O1{0z*TP96a*U.p`.d-PDU>hڴi_xW}4iTʯVZ=TZ/SK.U6jԨ6668 .f͚Ϟ=S:+۞^KYw#+WO=֖YxX|9s按rT-!tZ^)ׯ_UulY4hpfZXۼN:&Lq޽[oܸQnnj3kyy9sfk٥|ɶwt,!˗yJ*u[}vOO@<>|Zi;vpǏ׷Jxaϟ;yd]u{ujUGhhhmjϚ5qR0j{'O ʕ lۀԂK,X;o޼/TS۲6֭YFM6yQPMηo.EM6M1xsJ.%tZo7n|h׮]ԩsJ `h&_=r@9r`o߾ | -7=;::FUXXÆ J_AAA-)@?>m˨i_z[XM`UH\ZTmʼ>y@oɒ%Ʀ+OAH_xGU0pN`ggƲM.}:{5NN[ ~;uza4:8?1 =z"mܹիtuO1>vz[ c3֮R6=ʌu 7%B "USܫv7O޲y'iUB0tp+> J?gGԝ̑۷3www~]Uބ.ܰa[(Է+Zw\>\7U dViɞjþ$7t!hE1̾Yf Q%ׯU$ZZnbԺUF ʯ+|J,n:6Њ琧 `ܸqŋ)-Wք MW܊!cnϳ鯁بSV][N'z-4ziu[9hxv|Tv2ދ$c3ddEV+ٝjp~#nupp`nnn|-[ ԝ8}/RK.1C[9ZbO6aLյ-8UL~4 7B nR8Iعs瘽=Wꇟ 2o<6ydL\e- d'NdϞ=ٳOw„ ,>>4ӧUl 0cn)ŁiͼtK~-cNJb±SS#VKEWGמ.y]]áPN{YXU ZPp}k׮] R\>kB׮]u> ݻu:,s'\ғ>b͇0/}pՖ.S\z| .G"{.E//e-t ]tC+o9(k6]m'9k &G'>d1 ^cZoCCC%ccc5ʛNhb ).UMq}s `}S^X'U- \3Yҕwޡ \HWrvÆ ].d\f9Ŧ^|(9J9 ќ?*@t!C]B4g_|1_w bȐ!Ki`L>L \0)ptqӦM^>~~~ÄƍbtQL \0)&fʔeC̙./m&L2e2]F\`L>%\%+wdaggƲM.lϽ)Ma+s'W>F銚dφUbc36ƦTT_{ƌ˯~])|+Zhy9{,[reLyɼU}ԕ%wgШߪk+P8[J?$XЦ.Wï޵no;*ׅc sӆ8׀Rmd,fǠv_Z/ N1vm AxOTHϞ=;Ovԑ+ٍ7Xٲe5zi! 5s7,;6ٖVI v j9xvͅ]OZ@p'׮]cÆIV#ls1V~Q^5+ ޻wo f޽Sɓ'ڵkSWHHUZz۬-_KM^ vsN"EXPPQ[BVV4+E@^*g5+{c=rrr⿧ 4֡ *hѢP+V.]?nII)g̘1|iӦ1 /ի2www 4vX6e._5[!x4, }Θh?O[@kWU jCCCYڵt 猂i)!!!lȑgɘWFX9R|.DsNkE&/,;?)޳gOrHr 1 ^'9s71 .VѣT*(mX3u({k똋'ky_6>@.ϙ2M4E0&uȄ%c;8x2Ct'O!u[Ejlp֘fẕ&4؜E}SH9Ϥ `RI1P#db7~lzDoaaa:Bqsbܟ?/pi_c.`RI17S&N ^ȑ}Vbp +pN`ggƲM.sXXE B˨*9}.\"a7<<*'\_NS9s޷o_}E#""6mYt}-X{͝L2UV(e 8pgd ]Ue˖AT@i/^׻qƇ>܈MKM*U.ph&Z`RԩSuƎ;ÇE ߼y?Z~ɖbv^VPTknΝ;+͛7BCCk#0-h9˾A/\pg+W*\VFG1]ӧz?lN}||O6mrP5jS,e˖Ntkkx-i}S|9~i}СK-^x#QZ6mL>ݧB Wyz*A[>}V}U^ωh_*Т1J1^Wz|,įw}w-[6xȐ!K.~o޾}C?mΝQL7<{,2 6lڥKBpŋKGrF^YEsʨ E9B13Džz}`DҺTpK Zwu$`۶m_?~8W^ف/ *~\̸/rf6|W\Y޼ySl'!nԨ;rHtCtUcK]!-mE5?V]=x؄RQ2_{m@o)ۓcA\ Vx׺΀;*ׅc <5)*:6I}'řuUv6dA)۴O8T*Q;؃ه̫{|Қ0~īVG iiգ-$$$5C?o.Ud;&PǏ=U.9s =z>W9"U5kO@߸s*w&Æ &ͱc *cԺŝ Y1 s_BՋٻwn{Ivǖkt''ג۹8-ϖG6+v}:9S+kV]_43WX.g9ԡz2H] +ZZޫgwW׳9}Fo9bbR`*AǏ߻wokMoG-ʂ[ҿ*>N]QLϟ?Z~~m۾}ʛ#.\oIϣG ӤjueO-ú--=gZNs-}vѢE#t -ڰnݺ V -PDz2en{ʶWVF>BE:u;Xbҥ &%l~njw6mw+[zu*U;+WIP6Ψ%|2U,66?ZzLw/M_-#`k|`و;GjE(X2iMYlneÁ2L]Eyi_rf}Ҫz &BPP[K}y %uq^^z={lu*7\y!Ut[W^@ʆÒLa]dv^tq q& ƇL sDӅcRҊZB.V͙E+LjŹX E6& 3+NA*eaS*Bwm0 y1 \0)p|ke3Q2"pNPZ0?f0X^.ܯSΩ9sF۷ӷo[h?""™D,JS[`͛;O2erVQ>ʆ6lgd  pظ̧N#<6v>,2`ΐ-T)۵kK%Fʕ+W*@a. i?.Գgu47t}mmm?Ѷ*%'Nmgxڲe _wpp`o޼כ5kO}/?VVV,1111u},YB-'LONs;tkԨQ}bbbX5z@>ԂK:+Y*UXӦMYN.΢VP)]|94hg}arv gj|l TX%W ,XFmh/2Zj[ n߾}ڨm ߿ϊ/Wc=zH>.)ӶG5z\GwwwvĈlѢE?~o}||Zp)l׮۵k޵kW>\r=6uo8qNW"(V W\I]>2 ԂkiiwK~>P@>P*ҥK̙3|kkkv ǎE<|oŽxbC}X^z \U]ӧOUcaa~͚5StYPgϞ*ێ;4>1ҟ-[t !tsΛi\H7,--˖-{SN[. d\fhuԉ rhZv/_ot A~#w94| .`R veM }H? :tdwƍ]h1q(IA &.p3eE2!sqqqr̗6>|Qƍż{ސg.*Y 3.;_G0" 9 Y9wr>mHoԨa &0 %Y1Xb5kzwi `WrٳM^&&&ZZ߃͞={l|_tҴi&~ѣ ?~\Hݸqfݾ}Ԏ;۶mVX%K)iPlp@W p)pmР!C,]h{{w-Z/<.uvv,'[KJɓAcʜDCWLr26JMK.B^^^BBBTTҳg}clmm?yzz:mXim `llǎ##ɦN:n޼ܷˌ{ 6|pk.?%$$ *=5/n:6x`K=zj{:={Xՙ/[|yZ$I;}}}\~ز/0cο^G/-]l;"Ic1lG,Rݘ/y]cTAz (σ7;v,˛7>4mڔsjWtpFB:mk.Ϳ?lK+K\']NO_pԁnPRSܴ!۷nݚGA1ĝN^0zhwj`dp\ǏG͚5$_| ~:%խ[W(._<˚5+ܪ+V"Ϛ9n6{ gN~hͨyZ%g..?[c>WePM6l_~aWmQD-?ٳJpQt\:m-,, K}8ac^L|f|{Yb6iYMQx,Y[ )[lmHHk׮щԫWTkPɧZD8QLZ[oGuӹ{M;4 n7jF0 p8q"y|Ps6mڴT+;vd|AӇʕ+|uzƏO]1ʕS`ɀlsr{[?Z@Y-՞P?I'{?\llmpmas[￱SाG79k,; )~ɤ zzJ/6gsڞEM4o@QFF5j St)Vvmc@kp9=zR^5:"qO](%{rĉE5k$!y]q ң5I>)EHj$-)[ѶL5kUCxh^ɉJ*G'QS'g^K xݳ'; nЅf귕P(ʕ%&~ε"gANԟ_ \0)p LY'eFjYsAWo^K3k.e.)w|/_4Ӿ{b 'p 63go氷'w\[g^.\)H?h@` |)S&LѣGZ.29r.rd00W&s^ΎZͦ55gϚ?kZ\\3e<}.,h}.\FU+wb.l˛o2k˹'}.h`Wrٳ ]hjժ~oqcҥKM6GmheeBƍ7ۥv޶mݜʎGqV{]&[JaoO0Ϧ `. 486dȐ-AC'hb79"22Olx;KTj(P$O?tuW^WBZ ~,]t]x *U6RE^^^BBBTTҳg}clmm?yzz+J۴5 իW;v0~ԏ+':u*;ty&F_|qσq9˜93>|8۵k_XÆ ښϗ[n޽cʕcjb[nMN'}ٳggJuu};\20a_nOUPu]~&7F=Gs􆭆M+:5s<{Dթw-cJST?aeի_᪶nwr$WHuܵl2 S@tMUE͛7-wj*U\TH.vYnӛ?*Y&;x ˗/ꩦiz|C\n]Ǣ|,k֬|pPWXoV`mi8UYm?llv&-gtq: ; JM!tJ?w͟;C[1{{{M6zϻxP+5Kܹsu poq/~ty߷uޟBZlŨ%zudiX|tPf\vm/ @[k@ӦM[jO18ʔ)squ1cѦ\\memmw)vP8))">>Zhgccŋy.\8j͚5U>}@%W=|p#Hr'6lxt֬Y~ᇿoo߾Vzz]yL>g̙V<-1&&ƮQFꔞ3gC5^/w;#**QUV 2Q KZ9rxKZXXmTtڕuMme|pZ`ZJQt\:m/s}q0 ?Uv^ɚf٬ߑv`?Ui7j = t韫,pWW=uqÇ?i>G9>Zd;bd24I:׳gu˖-L $[&cvՎ֭[osƍtmpKj׮J@j_ܹ_?~>0?6pɓ%ۇZ)Xe)zM~NP0J'+WOA{2 Mt"Ai^rΖ-::uꜢku"""RVFZnе;0k:yAĉOȟ?θ3`vbێ;2WWWӧ͕+W/uzƏO]12<`ɀ3f. @y߯|s]q V>dּ_D֬bn]󱱵IõW3m1pR#s֛5[ϝzPTӺ?.oӵBQe}e?9~p?z,~54w\3g~a-CiC\KSݙwhyx%oSQ0D]"@-GO'S<xQpI롡Y~5#:::'uPݶԅ+)4 R9,X7o<jVyAta7ɓ's* i*|.o!nյ(^.ώԫW/E[a~':@-ߓ'N/Y&y]R&VnZ@b5eBV'Mթ\|yAXڌԳϼ:|ǣB4l)º콾7Me+#jw```:Mk mA[`I9ǻ\Cteեv@Bv_q@+ ZˋЈ?M6yiRK^~>B>ԂK -D|7z$S_au壖hż.tb@3hK})E*8G pdӾe:֪pljLA?M-.w9< )/g\-rF 1! )"ƭs\PybZn`:"g\2fC.]}Εu>x!9άxYqj|h uM5kv*_UL>A̙3'(- ;R*f1vY C rqq,};;}_~an&-yt6lJ>^Y\y@`.kOٱ *0.(Qq-92̇\iϞ=mB!iժUh^ٳg͗/K.U6mׯ_;=zUǏ 7nܬ۷oڱc;ˤɥѣ§Nөi0w p)pmР!C,]h{{w-Z/<.uvv,'[JɓAcʜDqf͚5GRJݦۥK[//Mc!!!M*Utٳg龏t1v<==i}ŊCtlٲ5 q2[z5۱cHK@qdSNeb7o˗/3y0.8g3gfÇgvb믿XBBkذZ[[~֭cf/_U:t={ЅSח-_\קJ`` NR]t/ Çpllĉ!͍&hPz}r?gUٶmH. %Ǐ`ԬYϟ?gӦMn)ر#suu[qi>}\rrN޽+\rJO_*efz. =Au͞=F_s ӣG~!ȉz֩@hQ"ON@P]0f͚Vqyzz.զ,mD@}A &.+s#w cC رcg?]ȸ@A,e˖!wY 2WjUsAÔSNe|9ӧO+-,,.dl&rTFri0 \0)p<ҥM6y8~ :tƍbtQL \ݻwKp]0 &Ҵ! ;;;;kϔ,rѣ NNN9Nz>`!w c3XK(cǎ5֛6mYT3]j;[[O^b+-?hZRրV^.Πؽ{(`g| sNV~}fe˖R|0 EXҥY\\\ZZ}}vz% 2a8=es^1eݷw6e24{ڵk޿">/gϞeٳhfes lq'pPB>5肬|ϼ|kcb_ 6Y,e,.lװ_m֧(659=ƳЍX.,CV'%$M8}QR鄚,Y 2$9]jru WF .2f͚5B ׯƯs{}n޼޼y$!!A*UA޽;Ǐt`VPp%c\nc̷`)Xm:uC>-RS ``?=ck#&&Ӈ5kLJ}ҥK|%ϖ[1KK_g݆}=}"Tj{qPK1Yu`eğǩ=VƍPpaNPd#A 7{NnY˖-{-+_eʔQ-}Psb nZӧ<˒9I=}dkcmE9ҭR ZfECEFFJ>FNJ}T߿?Bl '-{}R} 'vRiȑ^},,Ru{Tg9T]l2Ϝ9=tP;wp) FܲF&00A ǏO˂W`*ZFy_R-|!-쀸UןoRlOt65kcKBs,/.\ȶl<==u:f-InA%ǹWZ%X)uyk Y'S3U4g}:t(޼yz˛>NkԨ鹟:uծ]ۘ\N=ETWJ_5kV~͓'<Μ9q޺Rlmzb6k6bާfZj.#h$o}QS@#5bcc5[LT-TQC*ӺiACQM3:aMW.Yfe.\0)p LVVV 2e2L,c6R̚ #N#I1j1'W3/>>Z2| .`RL>͔)s}ΎZf35gS.ͨ.,U]Tx 0" jh_!QUrruy_ef\0/ p+Tpjժּ֭ڶmV1}çM6ٳg---z ΝﳅW@ŋy9/\\\.s\ ?gAAA-?lv^?~\Íw?e>|2eܤdѐ?III=*LA' 48hyɺg[h֭[ﵶS܎̙3Q~SLlaaDC}lM6{Zx wk8. d< pr{n cM6 ,*.'OO@ZX"V^ߧS48ˋݻwvfiiɧ sNV~}fe˖|/_d...;9HVti֧ -ih}YlʶV}FYm&3?3ا89Mqy˯ 5Wi|-i4qMCKYsvW!FtmGcB aڵc߿ON!ߟ={vM3W̛.3www~툽}V2]xE6m/II9L/^['5.K웗ٔ:tsBP˗:4E ?ͦV\K.ҰaãۅΔ/_; i]҄}WމF8q4Mn}ԘTvP}Xy_z0z>/}vYf3l)AN5k _ү_?qF~RsM>% TRwZ?~bMq羘<5kǭ-o|d׮#⩀ecJ%hg^GS`tꆮ}Zxz, 9iK_܆}={"Tj{@Ns|b111O>Yfɟqe޽ץ^K.'zr1kTVæRL>cx.WL+܏ ݿ>НyL(@NrPCGϞ=Q6m ޲eK'Dm׽{c+ԽkٲeW)P muˉ[rڵBp) zjӧhr<ĉ)I*B\=JTF G>݊ˁ7Lؗ s*VUܳgOzuNRu\b@cׯ_ߍ\abʕBk~ӻwlٲ-KܗݺuլYSr2eHj*jRp\_uǤy9REa{z\xL1͛Nھ!e|~"UY5kV~͓'<Μ9qEUtMdcR<PyGɡZG~1eCXFZ4եK~K.CТ>/y g_ko MA-Ui`T.[aU6-u9//MեVU9rxK]@t-y 6(իW5C1K[҄IPL\HwL1jx,#n<0,92O@f.`RI1rCvvvB ,,,LȢFts{5. `^ VPjժU׭[3ymv7b=ŶHJq c3h;wW߿^]2e6k׮%Dž>ܨ{Sv :t؆ܤ$GΒ%G Z4hp,11ɓugϞ=hѢ[kmmO =ș3gL2XW|ɓ'Oɕ+כ蜜hC= R0zcǎ5֛6mYT3]j;[[O^b+-5 իWi'0.bݣYZZܹկ_q:Yٲe5:8˗/ NR?x.]ťjU֮];z={gθ 9Ie^gMk{}VP!] \d͚5kpA6ۯ_?qF~ SsM>% TR|׽{w>Ǐ^@ Fǵ)_Y-:h7Ev@,s̬gϯ@?~<~. _˗]vڡ<(\H p2edS#.'+W\'w@=_\@oL> rL`^IA &.`RIA &\kkxL`\4!|G/_.,X>ϟ?S\~ (pb_fk}B3A&z>}ܾ^| 7Λ7ѣGϗLq,}}XXX7o Lk~m۶i+Xɒ%pJ /_d c{b]Ș ۿsss;د_UYdH*SE.\QPPPO>N2ex;JV2d Ԓt~. dLjժ~t+("E<0a clmm? [[Js֪U+uV~سgϒvlر,o޼QXRRXq'zɓP+w9 㒵.r_BCCիtqwKJJb| sNV~}߬lٲW"/_2ѣ<`KfqqqzxYM%zn0Cp˹[ 2u9͆,-4:6A-wQVO2= aڵc߿ONg2~Ytt4]52oe3MgPB>5ЅYޞsGKy牧!3A\ Vx_߱#̶TQCIaO홤M6m褚/jߧǏ'"PKǸ}mRo^GStꆮ}Zx*nwqzLFLL ӧk֬^kK} ܊}yƐ9k4v?g䂖Cy*:{|_M{޽{'e˖}/_ݺuլYSr2e(͏Z`>e(oAPPQlU;}4'1@vY2=X57Ǿ/lm(GZj!6VˬhHu)_ϙ*[d͞5n?WL66Z<Ǒ ]w:۹j}۝ZprwQ˙3g>}9::TCePkj`` ˜93ٳ'~T,e /_-DuQj m} mqf-UF/ޯx6pxg{ZcVƮ\p秗6ϙ[p!۲e i=wqK Ěul(K]ނyp~mO 'B'(>>>z=5f0K'5jHuLeO:j׮m2.G"Eϫb/Ϛ5k 9sFu,-Rll" żOV]9GТI:t(H(oU3mbHʂ>GcǣB4Hkh3,uWu)=+Ydh^d92h.`RIA &\sr5g1'O rzEOw޽׬]&M2Dr_&| Ç7jܸ1?Er_v5kz].S@O޿PB߾}"ݻ%_$ H:l۾};?ˢEFDGG甹Hf\kk #F,Er++xk (5׋X>ϟl1Scys}o]c\q.,hZم}ӚWY4/7*smn,bhP r1@[K4Eis<.w@s p߽{gV͛7<==Ӛ_۶mws*4hg߿EW8`~vT>sD+Zب]&MwN:uR  i2eb-[^O5WM=z~F뚇4)klllʕ+uƍ<ˍڵkj-e>`;77[%KR:}(6`… ? j'[RQP*@^|bŊ=3s"N?WJݗς{%w (@eV)8)SK* 3fmnotmqΝ{ ꧟~:rٳg-XGŋ%J^6mDJ{i 4мS5mѢE#?&N8-wܯ>|~)73k…h8gϞW 2/_aÆ ,ʇRʅ#G#G4"]̬YJߕ+W*ObRFm]VZՏnp nH"'L0'?vVVTzeU^o|e.qr4~6PC;k׮v/_Ӻumn nHR*UpF_ ׂÇ/ڴi'22(WeMZd<|o6Ϟ=[SN[TJѣGyy9sRp@8ƍ.@n=z!~S!CRzΝ7<L}p)V^ߧSe.bcIIIҒO'lΝhejt\q>rc...ѣG)ҹ .]kϢoN__a}YlʶV}FYm7u}Ͻ=vyi qzЦ.Wïhtݯdf[ZY&i2$g2$$k׎vMNGg΢}ys'ݝ_;Fݎ۷o* uvοhEj#ӷ+$%e0yKWjxnԸ/o^fS.S #C-u-/""9-e"Z~+jS ?}֬Y?PQYo߾]ZgRնkE.StНy#(K֭[דuf_?u'r"48mӦM^B&eV<^ɒ%PTm\ Zp5ɟZu=zbނ U n)QZ([֡.>G "sqtOP|.7{Nn˳[n5kJSLQ ,TQK2-sΥT-jbO$iiJwVc~Z[\/ދr[!P|$kq{MAI6O?DH.;fV|>w,$d>z.;!8kxEK!;+46,{_<>WKY:GH:uNQLZC@0 h7\v@tzɧ?~<~. _˗<0A]Zp@Cr_cЮ*^vIE#OV1ENrFK[e‶xTK4? ni%lֱIo+*/cuMP/gR?Ovʯӱ۴iOɓ'(ʡN#b^.nqn3F[ jKi|i}Ʊ3غ%Zs攮? e|_/~"UY5kV~͓'<Μ9qEUtMd9( &;-R x" ВСCEJllFy #-ҥ +Pkܸ1NvV4h 9Cb(F(KWux.vBz 5nP\`A0B$u&Bst_׫܅ ~ᇿiȩm۶u4.\ׯfiiIYtFgϞ6[lDB(_1\!O/]H')UF1JHG@ \Uh($~ZgƎ;[})[b޽{Q+~Yfhfq.^ ?[f3[nH2_+l#GvuaV@XL4B-z)@FY jIFءC+0_+TOMcSN|ٸ+5;v,5k_… ӧ'xxԡm(65k 9vۯ_?qF~">7odo޼[qpKJ*9ݻw>!@|1.FCXh>}f͚5_Y\.]}nIMuŊ˗%O?Ç,7{NnY̖-{-w-VfM}ʔ)4?jsww[:AAA|Kܹs%[jժN>Ii 1)V|^gUϷ5[6m zlo-ZS̙3={ǏO˂W`*RGyP`>RIR[p!۲e Be*RHQ0v0OԩSvj鄍6ױ c@ѣH.Ϛ5V?RɓGigΜ8o]);СCEJllFyz)Q,تrHW^=ݔ@`R@^U2@ƆWWs^&w9 B Fф?K."wY 2W<3lMa΢d=Ç7jܸ!\o~| _F#}A &.]tٸi&/C??aC]"w9<<ݸqcZ }. `RIA &L2} rX]0_ڌk˙={O>L`L>%\%+wdaggY}|grEg򣍹Ψ!˾?wQ\;kɓ'OF tnj3@E3`.R/ݶknWҥo]&Ș {>,,ƛ7oryzz5m洕zdɒw8%z ߬Yƕ)S&],v_~dTJ 9n /\𣠠jʔ)Q c;vq͒qªUѭL[-R &.<&*k%im `={+UÙ%7n̪UBBB4oYپ}XժUcǏgUTafVV_FϳS{%˛7om~t?~,X@ĥiKhK6V}xqi_ 8zܭGW\f/Ou4?:oU|.]T2oU3)۶mzΜ9Ê+ J6։m˂soOm:r5Z]z;*ў:]8Wj8ԟd!o aYhh(+X 1bcĆ ?F oooHUצMR=|DTY/YRp+zV^ͯ ׯYtttt"R۩S'֫WLJ 1]RP!ѣiseW^e/^)jL&B*ήo6mei.M'#h? pd[?N p~i ' */ҳgFԝϙ2:tRlYn:VF .@21!B*ۮcGmieyj{q˜1ZE!ܿ_r ®C'5k ٰa~zi&텖֭[Q ʯ+|U:Њ@qƱ/^8Zqɝ3ﮋvC\gjzyF{^s)>x6FpKV\Ji稦WWo^ (OcaxuwwWy… 's֦M>j:u*ⴏChC]w^|>]n4 /Tc胺?St!9˗/_.]\\\P뽱 $>Y;s?ױN{ 88]P 6_gzZײ΍:j vȹiWWRCzߩˈ>(RRJΜ:o5M4;w.JP_=oIZ͛&O6l'gϞ}'Ղ;aϜz T.av lZ5\<Ƭ?X| #\\b-ٱ|V?YLcƾy{EŴ-.,h}.\FU+wb.޽ ͛\iͯm۶9m |3ߢ+z ۿsss;د_UYdH*S0J 0pZ~vʔ)Q˗*VN1C=0<ªUѭb n* &.<&J ={*UbҒO7fժUc!!!|0;Pپ}XժUcǏgUTafVV_FϳYf/_yFClK.iyZЬ--[V)}1 nV͠Fl~JaE'ֶ֬BrOg/rFv fc\fGN}sB؉uaE٠M=Un],,B9W',=/M idjՊm-.P{YgfcǎM9%s'lʕ,W\k׮lmҥlȑ,!!׌t;dF=O5}"_,?mע+?l׆o^m7p6n4vRt_cfZ3Kk*\nzoٲeo>6̙3S;wW/^kaal-[^*N zɓ'뺻(XZ mA;ٱPBPY5Oe7'xL}p)b{f\Ưӏ8N>~qet"R۩S'֫WLJ 1q{Qs粫W/,nit[kܚmji_辶M'#h?|vYUj6㏯E9͖jʷvWW6d7X\Ynin;~!:e7C=iӆN$/)ȓ'˗BmON]r?r!C'{iq9f|4KNA臷o<9SJKWu=)!B^YzChQL7W݆ 97mڴ=8Bs[ʓE\\\.6 .%5NӦMq!S5¸7׮]+j:nLLi%l߾݃^ <1UeoذM4 QuLիWK,yK.ܺw? ̙3fዿ{ȑ-'ϟ?_cǎ5/]-yIG_B?~ӧO P>x&6}YM'Ags=u 2.\d͚5klذ]~=۴iBW֭Vٳb1WWW~]&U :Њ琧aܸqŋ)-<ꞜD=!9ƦJ6Ϯv@C\gjzyFE!$©3Z' n(vÕHΐ*Vr'lΝF96\>aA>G/5w;Ncf?ŸեzdPCAUB||}zg麌h={X6EW|VtLuڵH\olkNY%x̘1s(Tkz߹O9-;u%SΩ8m_xi{s\UFS $NN27otK 8p֭[iKo-]lْ @.%1GGǸʕ^m,\pr>.\[(Ȗj:u*_)3KZimt-rB R4]4/϶ed˓E <;Vqg8 օЂ+#GXΜ9v-ZOޯـ v1s:D\ Qh+ӰӴhmڴɋZ^|hV7n(K]ZӧLmUÇY9zPj t?~E1RJ-»vjN*Q]j]`<`.F:I學_RRR!3g *{Wg oRJI >R?gV;yɓ'@*[oI`` 8q"@PZjAZp2ggg>xΤc1uRʥo{8]*[4^kX/gTcj,l=^{A=hHUWhٵj܆5)/<ل#%ͺ݋ڨM9WBԍj.S,v9>Idpg -KK7\<>ܨqƇh;ъ[Bo >lC+VHQ+0͜9s<[^TtQ.N-#Gj[BuJ~oϟYŊP,_m#ݫ \N=E u3x.?֘p_ĄR[ZiMd׸`z*TX%Kj{2 VBUk\\\4ni~EwT?*Ty$ϩn3o#U%tŋG 늁} T3<-4YTPPIЊRhzO]>(_Y Fc.b"w&i@IRɓ4k0'b.1X XXXEE5իWY̑cRŊ-UV$72ģu릿YӜ˕+g?QQQv޽{9s'Nb02;@~f@JElʔ)X@@kժҼ(3g_ RVCNݻwSy cǎ1+߿o E aaa5\iͯm۶9msܴgϞzsF°IIIlYS؎;3f \tĆ+W.H{-T|2֖UV_;`;77[EC!QJ'9n /\𣠠>}2edvFAr|iC=sfaa/^/bJ*)($?~4Z%G|/7|YY~5jΟ?f͚^|͛bhұ?~,XtSVJxn666O>lٲeB9V\jzK.[,e۶mlر,..9sؘ Zd{MF9RWx-a;֭[ `Ϟ=K~mh;ooos=!i͚5f͚i},X0E:uu:)vԉ_/^8BÇpllĉsƂTRj#֣GvF5~^r.r_wlׯYtttt"RK?NzJ~|0.\WvJBs/^SԘPٳg_#u畾[فA<@*[B\ae,YF +{(}c"Q+ RuVb۷oYoݺ5 QbNNNܼ<2ïё橅Vx@ɓYDDDmk+8n[⛌:+m&:tHիSEmB?mEKزHW>JS `Z!:=svv׎;*&vׂEYfq$:.( 3g9i+~Rj-TBer2| R߂:pi#?fKNY7=wuuU9 Ny/_p?ض"3״iS.ȮoY;wp}ӧOg/_ )WZtө4-Z͘15iDa-;ʩ8R OV ԩSYBB7'/^kՁ `Z4ozz׀ӥ?t4Z[wfיZi-NdV==z;Jr<<<ҵ.#r}VLetV|폻;w{tm7#(]CX_=ʏΈH["jܸY\ &Y(@z4&x}: ēJW\ 񹅲sA6):x\3*uV.Ag&eyBtvBVNEQ˶:)W?zZ%wG4ɣξ}*Qu!2 Kȇ+ҥ.%dC Yƈ#w)~=d[pu]}X͛@N(R:uֽH#_ Hp.dq{_N4K\/p@ G۶o]{W]OZpmփ&mo Et \)p@|#GmVNӜ߿}70pE\# FO7M+v]`mU1 *g/9o#wL}Y! kЋܫW֔߯_~e#GZ0`;wTvuu{u 6[x;vtѪU#YJ8jk_ Z~=g@@@}I& )쭪qX{Z mQʊnǔm/7rCo[ۤ_zŊ)*>/.]bk׮M|ɟ2rJV9SVkkkm*(xR;1r?U] v8pvW{ZiD}~hzrR*e5M{hgg޾}FEgذaø;-^8:}?wĉ)K,Ic&J.-Ί}Y6l$fk֬a{NY[:Pm߾uޝ n :)U^7oޤZj`2Q\t5]^p/76wJI CmP{҆\-}iO_'OQFLY=HrÇYٲeUڇɤ$:֍ ,O9r|oʗ^-NA4>aaa2yyyqQ®SNqZ@pGlĈ2eΝ;5j1jݫ]6srrϹV????+?۴iSmk i ( 6vS-ެqXC={ݏzt߮kWksL…oZkZp?R+U}qf<ʂڋ_[ku:kk}&p^鬢V) jYz2 猂iYN1ff%tF o'}@|p@ t9rdY "\J\-FO766wYȝ}zt3((H쪈zXr-z˘3ŮX"ի5%ׯ`ii}ȑV~~~ X~Ν;]]]^~]dÆ /^(9ԂK:+eׯ۰a7逼fֻwv{\p΁[Y% {Mennn\O>i N~䭧]t9-\Vj4ړ63%|ЙdPǺtyA(})gB742LV^ݧ*_>{VI|k;DWg_'OSfϞ=cǎܼ$ }hfp>Sp/rlYn't'6QSZ^kZîDv_ZMs[ZT~q.2rєjpp01br|sαFzZj׮͜yysϏ-6mڔjbQdUǮ:7Ym6N{ۻ]W%vS`T]䗺U_>2o߾zIMJ/{uWΗ[ -A+ݝ;Sځѣ&'n'NfϞ͝nS,$$$J%Jp ^^^Բ<==eusttd>}⶝٭ZBy9Z묭=MnR 륩u`;E8W~z'-Kj]/SW:s)uʂ@V^ mR7vYcw8]zwtr3-K͘nϗ+\ZWy@{JP @<)%J' SN!Aa뭴qƥK'>cf!țW^=,L]11U 'UgWݖؑsP|F)KG |*OTdΝ)7VxB:iP*‚NNC?|4:sAZv< p xt>%:]E_bE$vUDQvmv=n8}dool _X$ GWowXRj͠bbW@E CkիWkJ\ׯ_?2ȑ#\ ;w*~Ȇ  -^x;yzzhժZS>#FAk.R&M4?$$׸m7S PB-[m׮݁۷oW־@ʕ+ߑ^o -ԧONNN=<<\SSoT… [-[0I]Rwԉ޽YÆ S eddy*GyǏgrFr"##mr| ;sL$=իWX"ERE#d]6%Jʕ+e[묬.kZZ>kϾ{-5jsttdÆ 6vXx4P={6,ףG}v֝Qwl ×ҥ ۹sZX) . KasI% Rr])ӫ,bQ'fRvMɏ5.^7kZK\j[jc׏mذ%5[f w0X:vޝ n9Rp+uao޼I͍ӧ7uuJLLdr_'OzՃ+W=|-[V}mO>za&\\m6n" Py'|)S0?²)CfHXYgQ-gfڰH^)qBS=Orz^B}cn.)5.XqRk څ̤=z4% ^2Νc5JNNNܼRݹ@|||StINNNUv&Nȥ N:IYHHر(QKejQY֭[iO>qV58Le\`` W^!|)ɓlk)x-?^СC)ӫnݺlΜ9lԩ*?zF/ԡCOS4ɢƢwx0n?3ג?GIU+n>굈_|k&*-݆G@[",X22࠰VڸqRpniN>ŀ'"^gy7oεE+j%٧T!xү#QWfGa9UӲeKnL\Bc9K`6,i4 ZY]{\[sp@w 2y-4k@jyN&i.e&$(WreP s!t^q y Nd t>~a_NA :En=m߾YÇn۶MASN7G?Įr̙wc … 'L8q֯[nnt>%Y',,=ݿܾ}Vu۳ *˳%Jիs H]9otӔ[i6bmU1 *g/)ŏ#wLM}_ׯ ͑oSQ&LXHw<íĮ@v?M6@% իWY||Z155ΐuQVQKڿ-[& YKkwV޹s%$$ O\r*A`ZLΝ;)v} >|>tP}nJJJ2S,^*:IjgϞ|gϞmbddZHXnp־d&:ԪU ę]}O0na]Սga侺ʓky ?aeƟnM0'M|x[nٵk׿Nk.7>7lذ˖-eaa~ύ\ׯ_)k ͘1Ój%(K$i q4ika￉ ~> I|[{ Fř.{+ϿHL6q0ه|K/ebjXj| OmzUzd'Z pK*nW\9nwンɓͫUvݻw辇ǟcr>>>Cm+[lalÆ l޽SN)4l֬YԩSѣG)nݺ$$9]F8Ў6h>pI 6։Iu\tIa. *odc\PTn]k׮T{B]f w?O<,::):)ҡC`jԨ))orqsv*NClC˽v;L|>pB08 jXX~.KٰO1Li}D*:KnėtKF[!9rnݚ{GEg;WN: @մWWW6n8⒮bJ68(X%ua'N`@=MD@zNuRrpkРmQLA*RX1.R w_Y9v4b~q^ 'P=S,]kS+|,QbԪfGr!QK }Ǝ&M dɒ.Yvm݀$N i#@}LJϞ=RYj3J;r-}\.m_^Y rxqI*%}9u ~-YоkalhqEyvL+l*rFM<{+WPԂK<}v .`3IIIr[e}4*x ΩeZ5o@^(\wb&%c*'?FzVڠgc:Oּ=]MjF0 p\p!eŋ\P{6{4+]taNNN\+.߿?W\ʁ2cSLNSCA<^~~~2m356J>z٩w㪷nfꮃZT#7a!͛4NTOM򘚨EQK%By.<n|||RLnjժrRs֨Q#%qu'&$8_k|_蕭km]ΕB8Wa)?x_R̐8[6a;W|mZ+bO^޻v≠Kv/ء궴e{HDwܩăWwD6l<08 nSO6ٸqc/_ReJoW[-=ZS/O:~YǨVu;ukzQtږLzڅ˻U>*UwK>?is!i&s& g3")nv/DF{AẹD[o/+QxD"J+R$i$#AA!} 4T^Un^cגIr{ II꬇ZKYEQNm¶$SyT6^"iJO}`coGSڕZI/m$o<,s&lu[SlYfhG8:NSKS$x jo3UWyIJ'ͫr@F+JՑB ~rş)hrt0P \UwM=V)Y}jkd_Zl.(M"~3Ȅ\ʕ+3 - {B+ϻwX%} FGs5z Joh~˴ً&E+2+?1f"Y}l~puu[B2]|K}o]<:~A :.psȁA/͛Ĉ] A}.谶uC;W}J?WVdnFO76 eGo]rבܨ%עgj{;B_Z?{[!n|--Sg6vq媾+Qd3R15,gfٙ^E}@ԪU+|fի,>>^uPҁ3c$$|f-pI)k\021Mv(Ul0e# /Q\0BŢh#A@g6}Y\u jԨqMݻqyUX6i-CwSRRuz'ϟ͛7͞={Ǐ={Qbhhh!aɓ'{I{vl۶AGϓXA^zܤi,'&&$swtzRUм,VArK44+ /~L ͫ;?\. ڿ$}[tU_ӤdG~ -h!yt|ܹ7,U<of͚5]\M:t**mYT'ߋrݺu۱{O>ue`^6)K\Uƍ6le˖/8;_.7S@͘1ÓjR,rK4nQK.bdetxJZo8o"l_[{}ԭZ6zI%3N K5}IiQuG}etAgK(Ev3",Çe%jrnZj]^ޢE4{ފ+]v_Yk7oGYSٰaC~BBLiC˄qoʕV^G@@@}kklSyWvg}qZ p_nwンɓͫUvݻw辇ǟcr~43Dv(h]lrSNLw@'ϟg 6L5: <<ɿ9*wzlȑ)JdW4̧d, z7zkӰ-j]Y1-Oޯj_sv=ab/+Z%ۨ8sUב(UTHLN6HNJVEPvbh1ǫ޻p`4:hwecֿk^%[uR|M$ʶI ,?aKϕz-Zh"?ݪ6:vԭDcbr}lz)4o>LFɊTgjÚIֺmV-Wl.4RFccc-C/'OSfϞ=cǎi% }hcwW~t\I)};vԷfn>Vm8'N>Yf̜[vRr~|~?O$xyy3u2uYq/(Qm(*:ZjuDz9'-5S+]>_|tX1y$ -A|LѣGS5b2Νc5JإKXڵ7/ܩjcrM6ڶZzɂa]un>{am??w?_K~F*V0-*o5526Jje|&9/ Dm:YWnۍczucr 9W+VleEtr %MX^QK۾}AEJRwo۠˲3>\JNd-P֩Sa˨u9JqwwtLJу Bt8q"60{ltW3 IiRr)AM4yzz,w-O>qUq.wNs.ܹ&p^]0G[BѷQ9jk4=9IsKl4I:peEU˄tEn-nrU[p*j-;PXeڍ r122HR*,݌^I u94e/6}E򎓗n?S} K{/UruQ`;`OT,=(qx!Oq n  d)II]#࠰VڸqRJ1+/Kp|a-'wX tn,zy(<Υrvm~pA ;W%$qbrL-^xΙR^ ySG͛\|sΔƍ+w^Yϕ\6-E%PSAX1Ȋ.Ԛ4i|~y^k׮.s:rHNۤҋ/_nP10pwZ#Ogn߾]zĺիHHwom~%K|ֹsWz;OggKsΝB}9Qo߾2ԫ]E?.Mp[4jWGU!ղh}*Ǐ1UZCVPEjqz劼IٛtlgV{+G h)#d9s~zS/=JkOQ)*?(`MHH0[RtDz@ЩSGEfɿaٳ4#w(hIr;T߇@q>u(76"Ņ9s&rMիWH" t C\bmmͽ6Is&Ejo߾eFbLg[NرcŋӬCkh``Rf#\=S-~z6oެ>|.];w/f3>:4ێ -lXa 4{;Ky<\NΏ-;ŝZG [j[|pU׏mذ%5[f w0X:Js.U H Tܸ:>}Z}S_Dfll,wyqɹ`_Yzrʱe˪B2XY_d-݆W;Pځw4ɩĉ:I?43 a;vT%Jp C-*2ݺu;M'n۪, d63:t(}zխ[͙3M:UT^=Shs:t|iU\+yA[v}4 |9S&,#Urmp|4> 4 \(%=o)II]࠰VڸqRpniN>ŀ'"^gy7oεE+j%٧T!xү#QWfGa9UӲeKn4c͟-aR&߀ԭʖ+چ} 2y-4kf!2@F5jP\,l#Į@v E.ى^q yDxxholllHOy߉ 3>,vyE|K]uȮt>t \)p@ t \)p@ t \)p@ t \)F?~\)p@ t \)p@ t \)p@ t \)p@ t \)p@t۠Ab@ԯ_?߿s0)11QK9t$!!ٙ]QH,ص6~!v5DC9bWCyj~ᄍ9Xh_vDﯱ:Ϲt9U7:@t[ pk֬yUu .dݫ(qOz@ *]H>=i-=ydΝ;~e1KK茮׷r:Tr2 _۷\H/ƍ󊎎* v-կRJwg͚5$͛7r 122J|Q;;pZرc{yynrmdŋ ),v= Z=ˋ/m`LLL^GGǧ[lի3ܕ+Wj+V1 ￁Xy-BZ p5jt˗/feʔydkkA˞>}X/U閺ɓ͔nm B-?maaP^zv9ׯ^'\pt-` Z pGM?66ւ?|pnݺ/<[r>}C۶m*xqiYD`K3336w\6rȔ\]]rֿqFfhhڴiۗR6))լYŋ=@ҥ +Y$۹s'+]tJ]xCe+W%ؔ)SX5ӧ;Jw|qɫW bl5JKRc4˜r-yv8v畗#{_1e\ۑ/EFF2[[[nx,00,X59::aÆq{$Ž ,s&SNĉ{lӦM5|Ms`Vl,o QfS̚53}Dz4P6ij/;;),mynVGV _jUr=޲e N֮]ﭢy@m*U ƶLTT+R\2kܸ1TU{$''se7o$:۳or)QK G֥)ÇsSN&_E:;vL~* i*Ɲ~mSL-ڍ i2=@L-gNciHke{q.8,#R(zj#"".}+T%we]Q Uٚ2=91kA{u+uSx@&3E) +V.\5muaYWf8徢R^74) Wvqqz7 t4u`6{l0 dyHQSr۳jժ)ݖj۴iSWiyBoZ2ӠҌX?GvL_k|Ԅ?%HG:WZ,Z=肣~Ψ1Y-y>d)i1bۣ\eݵqwYzݟM(?ͺ(|P]}߈H\r}`}@tۧO%b@H~7˗3$#oݺg62e\-[6jK?~%~Z5j\uMU_M^ڤ$v=@u&Mjժ}aҴifݻ7QDj YN888ۺu^sCBB ΝL p S9OOիveGQkGGǧ=z=_.%J<(!\7oϟTXo%Ǐ655֤IW^o߾͛7?l.Ϛ5kSk=vk׮T^@???WZwĉ_ۥvy4hhچ۷oWMADUGʩi3%ݲKiTRXRuf͚W_˗/QPJ䩚.ŋnݪڿ sNYth v)С>j3SMEun7lذqqq +R?[zo%@W:EAw,X0,!!Zҕڂʕ+ߡE5۷oNysQz$V^zFO-/O>,۬YS>-զlx/(ݺukӾ7m Sk/tr) ]=zԝׯW|/v9s)??}YǏoѲeK_^ C YVt[V+C]s(Nkb`dɒϤϗ/ǯ_RwL&6mK-ԋ/?ޢE[Z|+jFΣj^NĔl;qEo޼YL2mSպ-[ݻw+QZp9L?uj׮oGz(Il@@gϞNǎsS'%E}ӧtjׯP~PI6lԩfSj[C <`E(*TJPTPB"@iԺh}ѢEi\@8]0V~Yύ^HSG\\E.d)ԃݦ7HMww x7yy0 uZ-4_EtyiZlׯPB`Z^Htt%RǫhrѸqs a@,k=WX1-Au;w\cJq/ ,|ƍQ`Li:E;L5t:mР݀b Q;vw^tᔬ+̛Ut*ZE[c彼I?'88*CD/>e`S޺dmSV h֋2OkqnP''RtG}S7(rQGمzOCU- \oofff_hmt˖-_zUrW\UX>|(@TVV .L7odm dZ p5jtģmmm#hrX/U閺;ŦryD7뫐:V^md/ZmLݻWϹ-,,bPv94" _Nz}p…[nU~yJUPwpMZ pGMƹ>ܺ[n;|||(ϖ&%N۶m*xqimܚli@bffΝFz5WWWn???Vvmֿ6mڰ}MJJb5k֤Nŋiۥuv҅,Yܹ.]:.C+Wr? lʔ)F]WIvbcs/syw'uYX^nb&8v癨S|Ms`Vl,o QfS̚5=F(4X]fxv%8xޑ{0<_FfVklmmŋ@V`A6j(Ȇ =FQN3.Mm#4}Ʈ=;sot*TƽgG^^^D(pUuĴϟ?sTyݻْ%K vE,ÒƲ/A{Yƽ;_I*n?  sX+%hƿˌ OY9s hd>R2:<+c *`eeŵRJ{ݻw<<ZoAq/]~;^OG3&c06fם]2C#C.Vc\a=[`:313ZpJWyǖaX=TѪU+5,,Lu=kV;22+պ:B˃Yfв3L{ ]pb.sF=y@ |?.rK\ ׯ)Ru벾}r;\`Hi .IJLby4>BPlv%i [zz, ,~ՂpuQ϶m۸%J}Um)UĴbCÃeriϖR[څ_|Kl%UiԺK9O>DǏe!!!p©֥ ݻwoϣv^z:=K5ҥK\.7//?[tyɡ]33WL1\ɝόhu{Ŭ9 2I?666Z󶳳Qnl:0˒?Eq˓Y,o9hY )ʕ+\:ܹ3w?66 ~)( _|ܺ/-ǔA{|ǎӵ{缑eKHfXq\|n*"qx n[mR峬p.=;%bI9ra-G*'o9h\)@^z5rʑussc\\ `iiɾ]L)L/wjɕ+o߾6n\˖-}Ůdo:g$]+v=2ouP{Աcǽb?p&CO7t .SNA :.SȑㇶY 1i=ŏd&(NA :.SNA :.p׭[7pРAkŮYvS1 7m N7o#v:[ȗ4A\̂Į($ CZh7 cg]14.wܜUXQ߾ڵk' l) azX ؈[\,--4hrb/eW^Mk.^zYCٳ֌~$|e=v%gKnݺ6!!X"A@7>> ۲e>zj)Swi1c,>| GGǧժUITX_ +jժ'Oz@ֳ]t%v= {ZǏ:uѣGe33/M49ۮ]_.dHAmIii>88Y鷳g6A 饵w„ =<< L2_^}ƌԙѣGݽG :t_[f`jKQAg$Ůd_Z p.\8n4۷ 6l%]Ç۶mzr3gTyB-ȓ'ϧ/_]ȾDEJ*;w[mB P'u捍)ߟmܸ1Y6myv̙4Qe bo޼ISC+W߿iǏgB4(JyVk/cᄆ#ܘrM(S'zTXߖṔ+"##Ȕ?]۷lԨQԢ$ȸ;-^8:>glذ 0 Yr5)Cٯ%ZM[^K&y.WhS3HCΖ g#U 啥m߷5w*߫W^"Epm˖-t+ IV$ JKblW3a6m46{l.MHH`FFF|ٳ\͛7޽{hfee=*.\ƍ-Z$.Bya<`e˖^*ֺ0ck3Vcs p3ؼX{^7(M#Z;62AeM|9UwY3YM׬hѢ}o Sd ܈?/ʈi݆0~z]P.*:oi,>y$ w~B\)>}Zxӓ-[ϟ?1KK˔!Cp-: cKV<Z nyV&ͮȫY}IeX7V?J] ʘþeyyMګi߿ʺ?gPˡ "rkj}7/.؊͚Z_fiҤ 5 ʰVZli`޽{$%%N:FqV ̙͚5vڥ t*2M_ظ\ p"___OE5^ӧOYRҔl2~[{8mn|u!Z{jǧ)캺meE"YYX X4norMVjUo@!`>|ؑ#GXVӧ7i/_\IN$mmOQ .?OAם^QhRG.ݟ9s&[|9S?~aquIw4uW]=Ko]wτާuRISwGFV\Czok׮lΝ}Y=_JL.ϛRWxb@:4׳}gS#fq2=Ywb&&l \"n __GkyziR$|;e-ӣ@v(~LF#I]Ѥj]D9Tbl7pƔoZφgl}dcc&=W0Uܔ,~NO)jeU'7ROUM]10MWWÇ&Yg?ɫU \(wZ$K+seݕ_ ]U!2y h Z@ s!t \)p@ tN4ܤasup]}=q`u -oT~6u̥.SNA :.SNwݺu Vzdk8p: p7ot \)Z pO<ټsλ_|Y2:m)+\ǏŋѦMC˗/m@wܸq^і4òNNN)ص*Z+WWWJ*ݝ5kt7o8.\8(ѣGei=cǎ]5F9~Pɓ'~@FmOslһO>:uڳ{ g1%'5jԸ&QCKG޽hbY@z>GzP,Ub{,/i#̾xx۶mutt|J?>^*9]rVb^~ZX荐ՂۿyM־@qppxsܹ}~~6nذIKP^btFY2eFвO:KU#DMHH0ɓ͔nTP!Zyݏ&˗cTT>|5PzۨQ2Jw?=l#k%lh9SÒp|yYuOۈ[._;߂K1ARR!-߳gO;O2ć?~ Ve[n٣GmTgl5Փ~RP:L,u$֮]4jժÆ [)|Nhh…&N*":ʫ}δڂK{Usn ؀ 77cϡ_Nz}p…[nU~y}inhf7nG-jCΝ;tܠL pi~d(qbG?^B⹼PP% "(W=>`MQPģ_#F JشiS_sɒ%lR':Rp+]????WY"=חU{E*:ʫ^Nk.Y4ccc-Ç/~K/ӧ QNnؘM3?;L){A1]\\ؙ3gҬG*Ty&M]V\ɾLMMSKLoLL,!e^RoΟXM]DSɏ=c/H "Cٯ%ZM[^K&y.Wh9 }xUGzpl8e1`v{ݧ*3[[۔#{-3GGGgT-^8:}慟޽{SΝtBzEִJyZ zY/\)ݷ98'-1{L ˙y~u"*O#`nZ^X u'L^]O<)E-|,PQCR 1a`^lهwޭm[`0 RK>i޽{;RØǕ{߼T^#g%/4U0nOm\Nw&R@;t+feiN_p6Y]FN*s:J\j@E\V]huk׮ϙ3g*RuSAnu*L1S^I1ﵱM yn+Wo߾!!!υ9qqqlW[ꨉ'G-d˖-/Xc)C wUNXX+]:M\h1~Ҕo~$ FQQ5o]slfK&oUErRLе3c[Aj V9Bo;c VZIyK-") C]l]GK,ӡC}{MR1_&y˫<.?ZV-eIcM4KR S0uAjYf1:.$RT!m+LaHk+_%nn?&Ny<4_j]GH/|:ZLdSS%9Pie5jRo$ZVT4",&">}ҴSu,ZayA5sI۷o'M!a.](ell@)NQt2j5՚G)tM염PR'\5&_בno޼YMnG:>x5AT^=Ns]d& ]E6_uQR_dFR0ZǏ뇤_Gz^ G-/s^"ꢨ}pSѢE˗/S 7c7o^AP<ɇI>l\=i>32/A (aA)E߻Ts(Q裢GW] >Ŋc_kۛYUy򄾌QKgΜI\:*GZŲYfozX3{lO]e*z{h`Y\f_ Zp߾s(fTjըˠ^4aܹ]dU_4\$'%P/pkCW?{[BTmm'+Ttݷcp$up%lA}go"K݃mڴisֆ4i  $?82Rn]qqq,ww'-cq%a.MRm>wyUfԾ3\Lz֝X [3{ȭ0r¥*:֚o]t%U={*AAXڵ+S6Q^VɽW|7a| ׷&uVVC"ߌnʛnnnnK<;wTV^2Ev=5?!eORp)؆ Rݧqxۤ.hR.ffft7%c{0VBY#\^Ίх\ 0{֓'OX/#C :F@ -ķR7a soiCiӦ.TP(+… )_ߺumڴ9$\/R2s2pc$?*JerS3Ů>}2GE!v+mI|lٲQt{MQ0ի5˄CO\'K\?p@ t \)p@ u4hQbBBL:n޼yuSbbN|̂Į(zV[:~A :.'Ol޹s/_,fii^^lه~˖-m@wܸq^і4òNNN)ص*Z+ J+Utw֬YMLL߼y ,WpѣGei=cǎ]5Nzgik? {Z=ˋ/m`LLL^GGǧ[lի3ܕ+Wj+V1 Ǐ9skԨqM[ًFY2eFвO:KU#D lll"ryD߾}3[ remZ{Q[ًV[p=<}C۶mA?.- >w7=suue'NHo``rʥŶN:)Sne n9fKٖ-[!̚6m .ԭ{Kmpy\p)y˙3g|Sc ZyW5k2TP/_'  5pvQ.J7ڰ4ϡ@rse͛4 JYdQWŋ\۷Srqe*CEEE1++t1nW޽{)>>>\*_+DǏg-=[dU1|6i$nnݺ-J_l&+eVP*4˗y… @sرlzjժv: sp 9sU@}Kٔ)Sؘ1c۳gOgGaBd.MNNf;vdGRj};{,spp K&Mt ٩Sҷ:Lo\Y=#mݺ'7Tݫ`j-ò(pzmx7z@a[lهb/Z$/WVد-ŋGŮd_p}/99٠UVsTb/exap ӧ:!,͛~c׮]]Į dop@tqqqˍ&]t:566 жYEl\7.t+)v@9JKܹnA\&!t \)p@ t \)ZpsCǏBD?r:.SNA :.St:]nǠAf]A] d!dPX֮];hT-O3g4mҤYm N7o!vĤ- 1I~VTnӦMcg]14.wܜUXQ߾ڵk';wTW^`rd=֣T}u'v} B Y_.]v%&&2v%o޼1b7Ϟ=+yС6={ܚإK%.et . X}ub'&W^9eʔ^^^N>2f̘%Ç_Zj7?TX_ +jժ'Oz@ֳs&LPz@7&&&ǏuiϣGпr33/avп$C j (N]h@UGzlll"o߾]Ez@y{xxIAl2e]~3<܎=z{СCW[a5k /((%Jxŋb/ .@o/uww?J· .Çer|m۶q5̙3gme4 %ffflܹlȑ)r}IQߎlƍАiӆ_O6`լYŋ=3Aҥ +Y$cKN O'\e)`SLa5j`OfFF}"c}+^**`NMǍZ.ancԿuY|:P᫏ʴwWUOp!k|[6Rc;M^)G}׮]ŋxŅOGHHspp`'6mK>_{Ocllڶmvޭnvbcǎe?fVbݺuK.$Cٯ%ZqQOdcodk; lϽNy>?WJ+wE'>MZs.,mtomsƿW&&&w^{~9߷-[(FJ|Vy_,ކp #DEJ*;w螉Ŋ)*W7nL#ZjgϞEs)#cm޼ 4(go߾Sy!npMQKֲeK6&& >8q".(>p{~:gM4P(ElȆ1KHQ Dn~&W%n;E$\aq_Oxj3ŋYf͛jժZFBB۳ge o)ݻwN:i^Ķm}K_,^Xy?)Ue@ۗ^G.dzt_΃:\WTEm7Iߞd}cccYl+GâU㉠@{D pjnׂKA*cwZOyԲsٔ ={֭[sW^p[sC-4}1_#߾}Z୭6mʥHR%&&$ZZiS yCij~e=ۦ\4r_. ;w˕+ַ#s3 K%UiԺ˟Nӧ7Q`Gni.\8պݻ7'μv^zǏs5r(ɉ״Џr@6f_ 55'ӺvA?(ߗ9UY驕m(իWܼ*,XZ/",‚}Pc,% }0g޲U˄i;۷oZ≢Sbؐ!CϟZ}ߊo_2M+JQRSMA +{(݀PKuDgϞuF,ʩSr۫õR C-P=J*Eq-și5Z8/7vޫV$CJMH7;{NNѥ O-@cY}^ r_QKVXQEDs5/jB^-ow"]|Ҹ#-M]Q/ U3ֺ4jA>hG_U{SSSOJ11bwFShѥ߬V^=(<@v_3gN. 6Q/^(t/pˣ* :p £ xѢE\Zu[yo; [g{vcKU*~1?^՗+-ڭv! 揥~p6K? ~VCWG.LDMidI^=d-Roej tpZ@ s!t \)p@ t \):(#o} V{O6)vBY/կ_?At@:~IJJ2422J(+KKhwt:L/^(^D9rl v}\ ػwoN:VP3ԫW_?~wp2lٲ=zT{W]@ n9sorjUV%v}'ji\ϟs}Njw^J*511{NitnݺI 'v=B]"N+@ VV!,99YjH֮];hĮt:ݼyso ,}em[&Nٙ] QP f~)?3iUØa6Lk'Yaz5777gI=W캈ayfŮt>ȈVf$''8xw2"vbC C\t\.ibFFIb T@+7/W\N)nLkmijgJ:tMϞ=ft}-%|^~]$))ɐW6h͍JUt vqiٗ\F [ի5L2kӧ]ƌ6utt|ZZ*Vx/GW\jɓ'H"hѢ? s]wMyjut]㮋*g3o/f{|y}_qw싪8|QF4w/~,AQ=c>梾c鱂E֟X&n$o%>v =FeHSY1iml؜}lyJţ<ɱCi,YDEJ*;w[mC樨(cqƬRJC˞={6o̺u۷r 8: .1S) p_|6&& >8q".(>p{~:gM4+!wW/a5th?]݋ސ cdtSi`m&eQț mc}[pb ~#z&WEh5בK)u,ii׳m)Y bo޼aG?D6U{ndvxC}V ^5. K?T:Э\JNX|5ʓ_*o*h[YˍLL)Wzוn'/8e ~(:cyi/^(ިQqÆ ۑ.C 9D pV*ceeŵRJ{ݻ?ZOy&&&ٳ)- .cֺukիnkΜ9vn[> hРA1#6y>wcN^>y\4_fW^2[}D}R+;uXsa'23eEus75xQMCZZ[4^ZѣYjm߾ܲTWڴ>C2%rg}lլ4_uto8"~ #o9(vAk pQ ,]AtFb^ҙK.9?~4-!|{豍Ri˗/ծ];Hr[\%K>?o޼1t_rV۶mҙs5\RtqJC9|p;Zσ.\8DVL7XZZFSZ"]Cgp^W@ƏOyZk.הy h)`UUݺuY߾}].?ZԼjgxm=0yEe 5K? yC# [7.P $$$keݔm6lIR<.^QpL:M?֝ێw*!o)\#_FrPn(k3duOOR' pܹs,]t4 3 +E|)ؤRJwԩpUY}nړR%s. ԨǠ:V`a˗/fh] )\l(J(^ 꾓.Φp w֭L*ZB6ѨQ{]͛7Qz/)uP`PS+Ti )}`ayA/%VokQFHM~$>SKAw\ G+eիWO|Bg)I~\` 7/ЏԢOOji];@#EyPfSnܺ)+5-",‚õPJ,xgZGFkyvvvܟ;;M/3s˯?pW=5u^<[G 7[W#ꃝn7n|r`)eZǩMyjTNݿ|r:(:S~/رcS4;m&O}~^,hdhdh…JO0sXϾ9>Oޅ].SԖ349g sp\zv%.:WK/\ M 1}P;a9yA9j[j}tU\ l%ܵk׿-Zd8[[dg9(e #ۦKUHI颻7nBKwM҅݋/h\EVmyu$ޠ|oW iSaqJid߿i3k׮U{|˯̪}PF\§H砏g)FZl>OwoƦL']oݺlG]1(M>$9qq@Y1Ejlb+A㏂Ζ,W'#w*'o9(G)@T9t|񋨫I:uNUŀG{:J:ʜ7oެF}ӧOE]u SkR[%Q74EEEYQ*Lreo = H~D ׻)_<+(fϞuF,O]6uT.|InK/kmڴ)[^ H~ d1|mYm̚s{: )5!q jsp\ eʪ}6ךo5M7N;S.>Kz|zoi\uFEF.èylV)l}.P,(R{fY!6t-S8L~,x駏ݼXzQv޺'7,lG3[Zp%5Ejf͚:TZ֐!C|h]2 .UԩS(Z… ) T5Q6 "G?PcŊ,J%hPJ[^ n2,P3#{]rMA'OU pEiΜ98lpp0x"By]M) wܡቹEg>U j߃]vej \/>uQ:C(K/Z;}?[U9bӉ9ґ͈" Cdʦ{WT^xZww@ i9ߋz(|YyRJ=\ZUSPKiGr)p^(=A TuQF#R]l?$(_Wٺh=Ӻ(e^}b?SSo驣"ү*݇)nAN hтlQ j=xZuhl&4Wɪ³k4\F{(>h٨W? n2y->~rI!^ aY0"S;?O<{5hi+Z.1asUahz .=~I++EWت+O޽ФR&2E@ 4PLJ0 {][拿ח;UJH݈zj t>x몜fO+,?|0{n%U Bed3ǧo&~OScDBra4]?p!ۻ2܎.~) jJ[s4 .dk}/9Zpwx|d}\ȶ\fٻ/wƺ?Z> ] .dKv}9IlSCY\V{3ڽWF/-lzNmА~ A#:h!l̝%w,fyb.p7؂> ~ϩ>9mrY]ϟ} ?>*R p]P]|>J.Yk׮՘8qOn}t ٳEEEY]tY-˛7oLll5lu.d ӧOEkJLL4ڍv ѝ:u>IIIb / :WWW?e4u.R F|Z:@DUr;So W\%q%\Uxx~կs֛}^}tnݺq Z$v=BF~zuF,뢋Ր t:ݼys ju7&v |̂Į(c &0zL\/p@ :YCn2>__ߖe4˗/ue׵kjdti-7100Hlٲ^Zsʔ)sƝ>}e̘1KijnZ[[X=͛\jɓ'ϓ CCä%K>@W[ًܘ4UN}Fno7W\UVl׮]}޽{ҟ.;v,4iYY~wpl^~&Mhu+۽{77is@}r)Rʟ(.ފ]e\ R)w{.z311agϞMi@gϞuիW+֜9s888pC|`נAt""}A6~xjEWXƆϭ[Xj :ǎcڵ[(D/֫W/ | >}1j?v(UUto߾,,,Kw7Ǐn7oùpiA3߂-%JZTQndd$7ߧOnǏܲVpTRԪٻwoONɣv^z )]t;k9o rMk^^=mW9, )ʕ+\:-O(sX.JǭK@."S/_ER;k?155,̴r6lRxgs ^f9Ⱥ>@) l\ok׮U{|˯\yr >gGL"(EC뎋@p ׻)_<-؂ ٳn(QZ\OSNZm۷o]tj۴iS~zJ B3|.S"((J M] ^%Zy@pE)uWE$lpp0_YŋS|}};w\-PyE(k׮\H^@%Lo xѢE\Zu[y͛e˕+u ѣ  baa -\8`kÆ hт1誂ZՅzxImWcUVU9ँ-E]ɻ tCedŋ7Ƹnp Ky} *]Ⱦ@ӥKu :.d&t[tb/eR!,c֭=}||]@гgϭt;x5b7 ۶m[__ߖb?p7؂>}cf̘xnt@:r4zuݡ.SNA :.SNz#Gd-Ą\)Zp/2Zp@ t \)p@ DɓROĮp4hP^z7P|ҥ.\8EY/:&$$:;; "9r3g]9)sĮ(Ɨd*}sssVbEvډ_cuSG]v[A\J,رcn@F!,E_~%]Ⱦ@=B.dܓ'O6ܹ/_|}}[JJ/ϑ#ǏΗ2 WP+v= {Z;n8hKaY''ZYYE-Z_JΚ5kI7ojZ##G ;v8v~ҥK|Ik.f233ŋm۶=ݲeKW^A\RXb/?|`-,GQܿ kBg<.FY2eF2&00^ %-u)cccɗ˓'')R@Qx4K-޻wϟs[XXԯW^ٻ(.OT,"b {M$5*bb(`Dػbb7Q^b D,~{G3gggggysJQ`lllYz >(=SL%JO<[|Eqƍ͛G-u/L:Ioذ0njj޾}֮]1]Xǎ֭[GfZ&-U{A >-Yy*T(c6ֳs{ˢ1g{m띧t Os2Xb_;W_Pz[#M~^۵.bccѣ 1b0섋͟??2Tse3E֬Y ڵkJ*o60b' "|Nb3KPl_5.JlT+\E(#0V*ߣ ݻlٲt6lΞ=V\w IAnjԨq%""V`ɓٌ3655(;v0Y~(GYYY `XX j͛,bEeׯ_g=Hf3-0 |>MF-[SЬj^Zfś~9Ou-7# $--M|t+)B'R4{1'''Als[3wa~*%:T*&vV۶~YoIѨ\cd:;y>|X8x7J @d@pBt񚥥eСCMн5-}L=I|YDs㓓~9j_m^.Ѿ^-=SjsJ6nc{:_BsT qJ* YѲeK"u1@ p? իǖ-[u FÅIOOg]vts.C5 dӧOg˗/g:uTTMP):Z{~n܊iV9f9G[OET7*6޺_y5֗PQ˕EEE3 6͝;WP£s-jkܝKiе/^U.]|9oreVfM!0qqq~l޽}Jl~~⏪.A nݺŋO}5h@('$ J9p.apww?rٓ6mߩ)4xY YH 5E3Uj@N kRU'dG3MS.f}ƖZ~\¾?8B/eGʽ߿?[bΗ/ߑ;pElll54-{y-.\ʟߺuXƍɓ'E|}}A=<<8+hjeo?s͍<]'b/rS 8v]"##U,Y2}i; ϭJY2~xȩuqB . ]z>Mo-Zmڴ)q % p4x ٨8,|+E!;x7m6THZݻ3zQ=Rzbb֙Ue;VgQgdk9%YLtz`N8upb+TFF.Qzlժ'.i׮{;`VzLi P | ^z),KFrP.`"R'/\kp ;q<"ڹNnju+zΦû #[NKwޝуm޼Yx M)) yS 'EDia TU~{1S?WUͱ|=~]">2j? +ӣ@^)(MFӧOkN"Mbnny|z*$e ^r:͔"L3g-;-꺚E_>PY52-h^ `?vZR^ _ܙ{-\ͭ#G "3FvӔCtJ-P.@>Y ̨mmޮylұ][Wϔ*&@?Y \0(p  \0(ྣK4nnۗxMgR1gO~od._J+S}7nTD<@i &v@*R˧OI]Ȼܹs_+11KԆ ݽ{)00p*wzqqq65 jjr;wQzǛS׮]sTe0-^^^ۿەR.!4III||Ϟ=zˇigK/99(=nܸ7=޼y:j֬.[!nѰaCaԔ} 8]6c]v; [fGʹM[T)Le>|8[d { +TP0OOOm63zT;cjYRy~Ay^]8ly!՗mitCqv(/MWYE6~*Pg.Kz"zQ}ݼٳgGƲѣG36ba:}Ge'l;/n׏_^eyݺuc7oj[tTI>0D?˄bM361Mw1u,{9y4?װ{6hzI׵b4Z|{:\:#""U:m/|-,Hgf͚WE%uԹ(SGu+ZJVPeҨQ,wWX1_)kd{&?c*L6귔 5I Qb?~o]-Qϡkl͠_޹Y_PPpD}'V۶~YoIo)fi]W`Kh 0, |>M|>zϲeX…UJ'lN,֧ͷb'M726yCo]8Qkg׫|~EM Q@;͔q47q8{siz\fPǏKj3g4ptt˿{8]OWW ,F~Zb^(WVe/xQ~C'?['~p$'' 5W$00-\(Q"5KKˌC 6hVRJi(А*k^NRʇ]s㓓~9j_mX&q/w< }!ϟ?w4}u9e($Fy)0&=E?R".~zOÆ O:u5k߾^ A58p*U\T;yQ:)Pm׮>M?BmVu%'N4rS)~D'#G\|A3&S:"S;/yveˎ9m75BW+WԠӃh\?oEߝPe6-p?Cի',ɣ`4<<?Y׮]1joũ P LM>-_u RnN"d$ d%VlM5?z*ׅGZerܟF~82eqS:zY~:uԛ(VbLkZ#,%.qQׅ3:^y/'(988RK̫W S͛&81 d߷[ׯ_Biڴx@$W-^phjTݫW_M6x--N4oKJPpi,5$Bl#xڠAVSCo[ nA0w_޼ysw>d̘1 E SzH0KZ|:LPЬlC YAiлFAOPm>;[~DԸ8V~}w^&;V:0899?:H ~Baũ@Ξ=4h ƥI蔮ʔUTU QhoMrj#â_}{uvvf[`Vp,mtPO},EAK…_%ˤ* VjTY<۷o E׻Gs Ӷi"+K.7n'q#FXB.]:s-CQ1Gm H5]dC>8%:uM:ovZ!Wi]AVB^WDcjҬ|[vV<g֭[7nLg`W٩0h:ϑݿ_X~ yصNMܜt9xKADliRR^ }$q.GWtMvpܧo[;TysWwRNmwET46rxQKϧMF]OEL)˭5k[)QY™QdOmsF בUe;VgQgdk9%YLt}?n-7ҧZjݻwg gϦ,7jx;.icOȿ.=͈pӼF8~jNH)ڼo쬟zqZ,ĭ_xQL|ߨk E5}Y2Ԯ]qPwR VzrT[3(K.;h}_.Եۑ#GZkZE}Puz{{o?߲eˆ)'/Ҵ7!H\R`[jIKڵk'0U^=S2dW^ ҨQ#?B}etEy=o7O>%已\E݇)Zh:;xt[s6Y2YI;UI-jyмAuޝ#.E=hee=(%[l@xڃ[f I0>F݄U_m &w Z n jzN݄_\G%nz>yJzH/BI^c,Nٱ(itz'ML^BE \M~^iN* \c׍ tԸ2NpYtw&[u5t}֡볰keZЄͽ~촒RA*CWh'44+Md%Noȭ@r޽ʺ\U㭩! .:.`PA1ٳg6אoo>KN6͏<<ߖ 0GYRE^2HŠAr@1`PAA .`PA1iӦaaanR||+/ɠTcv" M,׷ :.`P>| ooΖ ]^hhW2]]]#===.\ptvyܱc'$$XxddkQkee.ժU:})fffo-Z4_~]gJ۷ov@ޢ܀/_,baa֤q')Em۶mllYz >(=) o߾5+_M4 ڮmCoo yRR߳gO={||KNN.J7nM7oެ$ݲnѰaCaԔj6p@vڌyw:v(nݚ=z4r4YoRl[2elɒ%͛7PB8<==L={2eGf...lĈ喝pgZmV9+f6hР׮]cUTx[ 5j\*ź?tPa*UT)nѶ?yD/˖U)[^ Gyzزe2Nhxx8kٲ<==uڕ ϩV,XM>-_u)SY>R4*Վ:]*Vi>qmaܹsuZ0\p?*..կ_ݻo^>>>@ͣ3σ7꒺zHH֭+^8{={5h@('Ç;;; sVTL5))):/ &"666B"]=uswwy.ߟ[5nܘ={w>_~]H@gYRr4LLLҤ.h!I] :jt&Lr@A;v"u9 o[X<>>޺k׮nܸQ"|R>?5*ϷbŊ!9s0,[l. Rs|'cv]rƈ#EFF7nMf͚l]ȿ]ؼy3ѣ0^\9jZn-<~߿J.fΜ&OL'tymڴaTE}6ˣ5:FH]Ȼ$EFWJnE6@C7lP755b6p@vڌyw:v(ӁѣzK*sveVf͜\uW|e9y$nn<3P33c !MMMe&&&͍;vLg_~,!!YYY {. Ӹ&((;͛ e-Z]~fc++emt͘4NfZ;#Ea|1[ Xo?YռЋ7+rZnF BiZ2 O{H@ݻǜr.)aSp~>&wLvϠ&ehu+4/Ϛ)S؞={4jժ,<<\uk)ccwhINNj8 nI`` [p!+QDkCe6lx=111RJO[y&F$,~߹Imٯ6]/[h?yD/˖RlYAcwϟ>|ӊjyHQBVؑ#G$( @ޅ#~`W[lY)-[ Y׮]YͅT{+N]Pjp ,ȦOΖ/_:uꔩ,DSu.BW˼gӬstrJnTlu!jZ#/IN+=b+V4vذalܹ:-:'D:>>@3VQLx=$$u֍/^=}TΞ=4h ua|8LuIxu:]S=S ,s~K) W<8 t4Yh"WzkƍHROZ_АjrZr{G^{.ܨM}s\GY.}B JAn H\sBjjd{0BT"pIvիgJSPZSKaY5j$ŋt{c {m>.Ta{6GD;שßw[s6PMr*]@{BߨG*Q} )u*K^8*ôdա먛3쪺 5{3,:u~>9w%>>Rn:OBy\˵h|֭]v&u:߮\j`;w Б~ϥqZ[!Ȧ#Gz?w\}!ȢׯWqssFvvvOcbbMLLҤ.@~@Kϟ?*UW^655M~%K>\Aȃ{H]0\.+W~;xUR@ _~e.Wv! M绝Vts'I]mz߿/u1$QX1^}WfgwY>4޲_v$%ԯE> R2 +P{iRYR 4@$eB1K8U|KR 4@&I̯~.ݨyޘ_м)\+B<`od zOSE:)ɑ:t_~ƎjXڵk_GUeYpGϧlzV)uA6'۷+޽c>}~BCC Ow^tcQ5'=q`[1ϟI.ؔ./u k^~]HΝ;7oD+ GGǘhg''=zBtero߾5322zGk N8qvppXϘ1c9rKTZ.љ'ZSK.>a„9Ql{ M}-[t[35j.7xkܸɃz2wCBB|+WAJ*TG;888}Ǐ7k߾^:xVN3w/8L룚b>ƍ{#HA.:T[K4^ GH]&P.SkVKmRRGS_~y X*Tn~MspF8UX[[7#5k[uȣ $ :PzE2e=5kvPB5ڷޫ(ՂN*}ʨeB"I/ 5jԸUu+B Kxt  `ڵڵuQoݺ5;zhh^Y+{A >-Yy 28pyzo^[Ni;%DK8{ue)c_;W_S$%)>c{lJZ'+x2Kw@r{gi󰯿zWVs[)}`ܸq* Ղ_n766NtYȾ{ΈhOO>ݰAg5}]3+뤀˵x.,SZ SmÇmGxϨX(wIjoX*&Of̘!Ąرc~t`tBB{]6傂 7oҲ-Zb釞̺㼷z5pGr}O_)kk,)=x ֒`sK C dҍ;sa|Cڎ4W7o;i;v!˾f;h 0, |>M|>zϲe(R弡tGMx'(@tYHKi?ɾ6ܳ$е[NFFA~*_tBiЎg3%|t>/MM'\MqCS.*Xj^|Mj%rSZ5:trZFA7|5k ?a)]rz)E~ԤI0uS{jMqV{Ffffo1IO63|(NR1eʔQm4MG 3/S>er(Q≦9DѾSVF0LWNrrPsQpK?&efii1. 6h:sx~ 4 nZ?ɬs㓓~9j_mXM=wT`|n+.]rhO<˲'L Ν{./?\Ү5b]N; __⁧,>iwfЪ?k*N)ܹsy7ŵ4!իWV[S*-Xb/(DJ.j,˾Eh{\@fewرN ͗N (|_q͵tىqi:oQ4ߎK^ssHG9xzGn;eeÄ#~9^zB͒< F<==uڕ5o\xNu`l:uꔩ,$'Sa|Q bp+6ΦYUm=Q57'D/>Rtqp{65N9*GGmBN:BMTTXb5؟)omV[Mٕu.5Zu^NuQ6ԣM6U£蒶pΨԥ(ZAq͠&e]Ɨx} G]i|E塠/99)Uh:q׭sd桓 (ݜh)*#&5..կ_ݻo^>>> Yly`ŪCBBŋS_}jwY֠A4.5](LxӘrP>aϵ?G._*^UzÍ+7j4Ҡ<|P tQެb/ +Vih#p,mtP.S5F5ϟ?,7 jҬ|[jaRlٺue(;y$$UW4Ã:c(FvS7in! -VRW}n+h֐U\jCuҥKՒZjuqj뼜<ʓS6ԣmv)..H#7 rxQKϧM-Z6mڔڸq\ZfMFFFBC6552+V]/6pčG[9T^1Q5_ jpc=/]2Q9VZl(ٳK$5NN( _vMDMqȺভt]zZ9y?8q0KzȌj N]bp? ###G=jkNȽ0`u )MAjN2׫W/eiԨP/^"EJ(OXmۧdV0E=\]t[s6Yu.zP;cXnuM؊kDnU݄΅(k֝ݻ=zdtեMv>}T lٲEH(WNP8uȪkn/)+MM[VhO3TL}m» ]W1(ݾ}e.S~9K֬xjÝ>}ZuRa4hZssl*f&?4O~n.R5.;?.v rɧ'pjYl@M^SVh:vfJOT}"LS|W^ ʖ-+`@ղb{XStE _~E8Gp[\jԨC@G@@^ .MpLYTy7۶Coq+ ݅j˖-ݴ}ߣGֳ=9cƌ4N7-Gj7m"1U'N4[H|;Y>~X2niiX\\>|CBB|it3y~f!uE~SpjHw)޽_|qxtcB]{TV||7n4@=?Po *Ӽ+Vu*={)*#4Nҝ(%Eɴ (($GTkK+3gH\"޽{wDqŋy6QMI])>uFCHN6͏6irG2[KS>q^~iR 0ĉ .@~C|?iJ*ׯ]&u2#t Ee)z޽{eoNzR ~e@ ;wvpSRR̩8ze\r<A jQm,4NNWcZ*@NC j.][֭[¶mۺsϡc!(?vaV\DP .(uƍǏo&?}ժU5)RS-\ȭ :Zov0DʘTy8pׯ_?F2Wiii<<<ؙ3g.$6߫d3h~i?&p A .vvvOo߾]asvLxZzz1u8߭[-/^u@ާ۷fFFF(4/\Pwĉ9r1c9rKTZ.Ĺ֯_t&Lh*TM㭻vdaadnnҲec:u޽{e)0dɒeJ>6i<""u988k; o[0ʕ+߸tRSmv}څ>|)XbxygΜi քC5[Ν;;i@ڵwʕ#FX_nܸ7=Κ5k:4iFE^jԨq{VDCz9> aƸ)kf̻k.ֱcGauѣzK*ǏgǏsTm_TTX'Ӗ/_Ά )I\b`ߟM|(.Sj)Um/ SxJJˢݻ\B99jd\F.޺u <g֭[7nN<ɼ> vM`֣\juI9GFF-Y$RB1c),Y%mHQ>rxQKϧM-Z6mڔڸq\f͚z |)ϷbŊ!9s0wuw- ǝ;wv(=۵kʕ+5Ffoo(22ҕݸqcoz5k$en-uOٳ٨Q2^:K?x u^֮]ˌYǎَ;2nݺÇlw*K֭Pۼy3TRFY8I[$;)`'NduaGa&&}ϒRKʕz6:Gb/[wгukt Os2Xbυ&7v:_}^M~^۳U{ ʕc'OdlŅɾk},OՍ%T}yuڕ:tՋdg4hަ|{a;:9<_}h:[ Ƈx)_:_^#eL_ݍ%.4޶/V\H"oKڹNjY4}eff&.]1 6P?[re(BW.mPF+[X2ty9+[,^:kѢVW}{Nwԕ:88Xa:w呂MohW_ lȑB0"~=~]t8qlRC)kk,+ DK,481mƣJX$i2SU9t(M˟]Jb<`{ƕ0a GE3EmKyYftS҂]R εw481٫ewo_$&v9l.6Z"k[}pCB|hѢ,!!AO#IKRW+++fT <իWSjv;Q:t <_lu͚5KXOҥP-? 6mݳ}7Lc_r#?)2U/EK:{kśt~Moߞ/[{jɗn?}?b)l^- su~e닅pJe.>W$..7EEEezjk & p^M5jԈ_(!7JMO7.QK].i/^7ܨxJC|ӴFXRSSY%t\+fG\G{{{C4c+;+ʳV<iSpXv&{v⟀%kұ?.\XQtseVfM \ʗ//ԨʣZ7LI|||xaY2e>YK˙/^dkBpQׯ__׵Ir@)&Ft.ӡS/Msq ,G󷵵yKJIIi9yԂZO161WtRfmZrOաOD)MI˧RtGBA#ea1ʛPr(`#kkkaY\R޳gH1d2:Q~/啥T_ZB8S 1Ah:spt{&QV`AA+Gz¥ٲH,hpu5pPy…L)Gm۶i.5[ZZ -,VԢZ^[/MZZ+q/R̭zϟ֤WhJQXxpo麵emgTW~ڴPB]O(E HQ"uBZOSA?1c 奥ׯ_I& Ν;Zj]˅ZVZիWAЕ+W4Mv}'ݳR6-ݘRvL /^)hMnM"C jiPwn(;3~LQM^dd$ HuE~;S㳬,g -JyN{mǏϟ=/B]Q/ ٥SWnޡ2Kb؀׊fDBb+\)jt?zhܸ<= 5 201ʈ֦MOSN)*\jB-GK.{xd,5FX)7ohQ`ȿUƪhW;w\j|lh:놧b Ud˩pwaJA.ڨO5j9}ٸqp@>OS , ev:UVѩgDzt׌^ǟ{6;c$Wټ=Gv;% wsFR7adG 2Ձ|]k֬_~) j(ڵKP{rVi,Eixh逖No9K hfΜ) 9rM6qa_tMj9|'4H|V/7j5UN8INNsr(Ni5 3e tpz@ g! \0(p  t/e}⻁GyߓśN R}߄n  p}||WJ]FVfW u9 t \0(p  \0(pt۴iӿjI]֤I'N4R0755՜ny" M绝Vt{.d|Nb߿(VK/bv־+.|>Pg*u9b.?p  \;;o߮{}9 J&T<޽{eӍizDDDgjjb.u9 [[3##wܺF^pĉg=rH1c,9rbZj]sww_'&&qҥ'L0G:ʖ-{k; g>|2x,[X<>>޺k׮nܸQ"dg{V^ZfnX ͛YJ2Nؒ%>&I8q"S;r31ə6=or*ܽE!_~UM,)żDK8{ue)cυ7k?lÈ-¸M+Nr sYsҡ8;|#h**?SWlaUeKkskQI֣WwGxrتUX֭}>+]49s&#俧M6wZz bŊj֯_?vQ͛gm#_~o ;#VX_H74}.9_f׻?崺_Ǵuzk؊= Q4sg Zp1a._ރw_T^z|MA7ڼp¯d 2hYGW E $(ԨQ㊷V)֭ ?NyZhUիn߾Mػwyׯ_z),66VNݻ=m,NSFGG3ٟ𘘘F:QytoҥKĉe˖z$:{kV إ NNt z ˟h6I/iΖ\Ǿ?0eIcxOZFF:-;w?]|լYS˧իW9 )(V7nܹr!N .ZIo`X٪Nɭ+Ͽ<&hW%/GtBiЎg3%|t>/MM'\#cw9ٹq:U:mBt9ىџ:-h;6z^tU3ye%KP@fT{+zձjp)H7<<\8P{ʙ1yFMVPPӧ ϗ-[r]fC5c4VoӦ^\I '̡[WW"?)2U/EK\xIah^J%؄#o^eA{;=egZ[ď?F-NJ8222c=9i/}x8Ǭ[-Y)M}ĸ-gq'/ފuuw0m٪=Q6۲eK7//]QT zY7oViSGӧv~~ԨQe)rڴWͬm۶uT6?~YRnWG8pedP;*ܠA3csj'I?2(B)aaaM&M4ks-ժUe O:Ոr)ȧ 2d_N=iWhYqqq6Ըw)URz@n~pEd_|6n8j5:6LHA^z1N-jԨ߿?fþ{g8\}|̊x^Ӈ^.]/ 4dl}?+ R+gϞ=QvNH>nnn(` ZjW6lxZv\ +WVfeWNJS**;Yl* ݪիwXzoZZIrP7țzKj "hSKTM)Z6m  d_xQu֟1d޼ywル٪Q6mQ]xą @A?Ȗ/_^QG0# 8fQb2e>Y)+g~Xvڟ8p@9 \~}a\j,F?JCϐzuY>mͶ~ 4IS7=A jqs+b+Elذ,P-{e'PGi\e~zk׮8ZHER ]'^}s̙@m[脁Jz=JzH" ڽ>| hAv2R I?n5xUk̙3-;6§pjp.)pAvҼ(C>e,qPG KA#~(N?arpIIIBKA15.VGL12:S~/啥5]NX˨ KMO76ǖӬKYAdN֪LwiX V^jo^R^$.jiQ1zNl+_|ɎR6ԣ`S&VlAS=6ɿ/eA=N7Kʚ.M7nu5I9፵8y ݻwFt[<]F^d%[f@T7|)Xg|䬢)SLYtJaJZXUW> iDO3UlJej5- kȻ$$$w&t ?3f݀Q .\r.4ipܹF_T֖Tc.^rEABZcV ݻ"iƔcpMū7m "Uf7?`/;|%5;lgs;3Ԧ(lH_ *̝;W';~83ziȍ) W0i SG˧jle_9&G7Xu gxjp)_N>}JV@C]NӨoh?|O9YPS(򒂪5xRWʡ^貺[eeox*/^<Q*НF^T#J 賡b)E\Y,-KA\EG} y܏(8-XH~g#""noSN1ٙ]QM4?t{b!Rh~U(ҥ/ GN<)"{ο؋FuC6)U?vدϋ.Rt\,k5 ;"}oOgk91;$?0h*=-%jtI߻ŋ ϝ;}w#SЬ@=+|(zȲ]?phI.M~٥+Gt3}Q-`dua޾6oyajLխ[-ھO|Y\ݻŗi-Q'z.Tj[SN'-Xb/(*C;F+<l|Mk&⥠z!xI M#OM;R*-7s,Ք~a#GVl*;.#~vE Np|]3OS Dv)]viU 6hi ?n(p]أrfu. t) hۏ̋UZ7v';" hlf%0vץN;3i]gs׌U;UMWܰo`(ڻ钶&wEh^e.j飻w*{VujemQԘv)*R *_ܐOR0I݈OWlB+ M]4 ?lN+_>LJLѾ )kl/6y R#8ˑWkک)y\=C q͡L+p6\Un .*_&Nr@ޅre+w! \0(E2~&,9ٌ),?rx ubYRr4z p޽{݌|ܹs?HY܂n͹jժ9>ЄA]{fkƏ?MFHrJOҥK7o'l\]]#O<}"pro48ty i(X7k׾ŋb4kummms<8]h( r ~O?ڵ6)^{5&MZ݊+ޢZ%J< -(4i2Ss++Rynnn薮4N?}ɒ%sѥ]iKRA LSۡC=TR7oܽq'%-(ƍV]39uT#''Rr\<޽3~ ^svv`r7}Ќ5j~7fgg6111GGG ϭ,c:Y~bńe M._t4aٳg믿fNb%J쫯bΝ;?@ZjSWdR .@>ckkN޽{gϞBͮ0;v0333JKK`aȫ{axPj*a(^8?Y͚5۷СCtG+0 +[lFt" QZúu똉⿊Tm,YEEE ~VZsel޼yѣG w@ UHa:Y/[p[͝;Wxjs 4Prf2ju *$znZ/88Xxg޽-{z wاOЯdBӨKhnݺmxb>`WƩˋ`wѢE,>>^x.- %+>P+Wq^ ϻvI͵}֌5… u'N8;88x#GZ3fȑ#DժU벍M{8o>111K.>a„9!;Sw?k;ƍ ^`KJJbse~Ckui;[hmR5711x||u׮]3-,,SZlySNݻw,eJ+P{n]qCx--fRRHQA.]ׯΟ?kB3HKoP@@L byԩS۶m߾}趢Ç_}|+V"^ޙ3gȧ(5PMN 5C"r;wru@:z pQgߙOzl׮ݾ+W1bHW>wƍq֬YoEJ)+obnnfϞF񚧧Yr6p@vZ!߮cǎBwJ!֭[=|͟?_ -[nB lͬRJNؒ%>&$hgDkBLNV7cUVBzjqРAz.ը~a͚5PQ:s!fjTQ#aJyeʔdY<ڋ/ڵk~r!Ξ=+S n5맚"]*LsMIIi94ςJׁ͛B :=hɭU JÅ#'OA#]ʔo!MkeZ ~)Xr5/RpL9 8KSNtyU9ˣt cs?NNNBm)Ee5YQ>Q P*r(pB#KR>}*<R;ZSXӖb7K󴍺?gU/^̊-ʾ;;Yp=EAv/_f{#*Nq͂)ԕ0wl-o;V-Sjs]gM m3tDNΨwv`~Dn N w6""B[p5E }nHS(UDQMIF݅A~e-OVzziZ+V6xwdy\=S( ޽{gdll.u9 Bgds 2Ip W^f^ \{.]p xpeޓ,w!\gϞS?'rp  j˖-ݤ.mp Wh֬qz*uY oCkÛ_`CѨQSOnה,tkjj$,,2Ͽ=v>~&Mj nӡFWU(? :=qDS>ߞ t \0(p  \0(p=-P{}rk RB .8\0(p  \0(p bnӦM#ܤ.@~ӤI'N4?tjΜ9#uQ$Q@niRC*FM{>)Ӥ.Zj3{ /Vsww쿯Ai_SIV <.`P>| ooΖ ]^hhW2 (̙3 <<I) m۶occ'~իG Ǐo&@9\__$ >gϞ={uC4ʳϗ\7n؛o޼YIztRr  㦦۷llڵڵuQoݺ5;zhhRJd*ْ%K؛7oXB28pyzzjj=KJ1//ȟ?,nlwzVѶyN7P=/Cݍ%F=eȾs55r]ڳgϘ]sƲѣG36ba:# ?~eʾgY 4(kX*U4ޖHK4oS})iC<˔/upga/tZNxKͦ ez?vEݻlٲt6lΞ=V\w IAnjԨq%""V`ɓٌ3655(;v0Y~(GYYY `XX j͛,bEeׯ_gJJY[$_3fSH|}q>wLۏ)hV5/-3JeDPp`ai})Ƚ{SAvvIwtw44cڐ#}M5)KEwGO[yuއN.^|r>_h|=+'99Y*00-\(Q"5KKˌC 5:a*)V-}L=I|YDs㓓~9j_m^.Ѿ^-=Sj`lb:O]qZz]-/lْH] ܏%ze˖ezp`GY׮]1joũ P nYN2#ATsJ^jblUuYSU)4RGO5·£y– 8W*LeQŋjժK.:_wN[>m\|լYS0tp?L\\_>ۻw/k߾y}||.GGGgKfff!!![nxӧjG9 4I0>ɂRKX&]ݏ\G[wjtJ<:^`VÇsvvRtMLd2S5OcZPPP>aϵ:._*^Yz΃`M t{߿b3%;RtPFs/oݺ݅qKt[nkܸ1;y$RZ0h:}rMug]`UEnrTӮKYddܒ%Kh# d+Ss ? 5W<8 t4Yh"iӦƍ'(t Widd$4dZVC󑮼 7*OxUrS "jbwEAzgPH뉉:[gVU^1Q5_ jpGYfgr)VWP ;p?מPYDIUV]vBX3)(C-)@zꥰ,5AEGQtosv'Å*젾zOh:cu+zΦû #[NKwޝуm޼Yx M)) yS 'UyV~qT3iɪCKQ7a+fUu6kogolYu!u疗ѶP@]t@Ly@k4jĝ>}ZuRa4hZsssXl-S8U&'5.;?o*mޗmNgma9s0$K) ZVmrc&dIC5ejȑ 4eP4ңrKA )KU@M~ 39 .`PAA .`P =MKm!6?/teJ~K&t3t"_)u9zA^Ec.?p  \0(p bnӦM#ܤ.@NkҤI؉'J])tjLPg*u9b.?p _x{{ovLBCC O{}rرE: [;vKt_9 v;99_ѢEiׅ葂\EZjk; ok n@@p/_H kҸq㓔жm666q^zO~ypfk(UAY \__$ >gϞ={uC4ʳϗ\7n؛o޼YI~5k[-AwO7hذ0njj޾}֮]1]Xǎ֭[GfZ&-U{A >-Yy*T(c6e=or*ܝ?O15HvR,)żD tc c.M!mG }7p4he_hYOiii >{>gٲep* \m6!(BwzǺ:Ʀf34i 3W=e_ďYq;Z4ߣl:o^߳OG t˻>zvYNl3A?r+[.\J(񚥥eСCن 4^OLL T)SRhH܊p/w')MA},΍ONh~]c261~"ZSWV_R}`'5=.Uм׆"Oqy&oP©3u@~/֫WOYGhxx8kٲ<==uڕ ϩV,XM>-_u)SYHN"d$ d%VlM5?z*jnpO<]joml_s=}hݥV_l-mk TsJ'UzY~:uԛ(VbLkZ#k7@(O+qVWvr@zEAMBPX޽{Y# NNN,:::<0只fff!!!BaӧOվٳAB9i\jHQh+NNL48Osm^_U7ܸrӡF]ÇٙݻRnT"o^&))=~L301+0wîl8m~ jҬ|[vV<g֭[7nN<ɼ> vM`c(FvS7RE˙4K~;ۊڧ5d8+ v%jIn-TQa jV-=&<Q1yx.uGh2riӦEM6e6n8!0.֬YSoАjD̊.F {.ܨM}s{,KLzVZl(ٳYJJ,7V_z>ׯhebyBk딝 ֔܏5#R`[jIKڵk'0U^=S2dW^ ҨQ#/^`EIQ>ySOǕ*>LrGD;שßw[s6Yu.zP;c,gա먛3ܪ # /SQJ;ݻwg=zKQ>}AA}ZuRa4hZsssj6ymA~:s(p]76XeSO/\j%eզڳ 5z}O[ekk)=SӶ0MI}ENois {ԛMeʷf?trNZp>( {M_4q?d K-S<]=Խ!3e ) 39 .`PAA .`P =M?{2mtśN R}l&%n~tA>>>dJd.T :T~[$&FW"""Jne?Kxh+<^~]A#@nP^{'T6 ܏xMEzزe2Nhxxp!tk׮ԘNxNu`llSNBP!vttr?g,_bLkІ ΝrhC_1NjKVY/^`UVe]t2O<ɚ5ki˗/5k &Mb/Y94WFK|4^V0׼~'tQof'`~DAD\\_>ۻw/k߾y}||.GGGg,LxuƊ/Ξ>}}נA4k>,蚢YR)Ռ6K}R[0+>ow߿p\W}>ٳg>+oFj4'mR U$Ft0|pElllE-oy-.\ʟѺuXƍZ"q {xx q)G5ͺ$###UZ,YRpN|bf:uJ~7ofƍdzn+۶PJ<ʏF`b6/6s0gVt0|p@O6-Zmڴ)5:X\jL}QqNU۽{wF?g@A^WF ,8U|p)!X5ӧO>o~z]tbŊ fZʕ>xrn30$]'L{Zx,Rek2VP,].$تUO\B W(vzVڤ^z),KFrP^^"E2+bGB Q}ΊyΔ冃.?܀ʦ|Yڠ4 ͉`\SNY ƍ3Nh"uo%&fGT֋Ppk=EpM˺ ݄iKMXjMa0<p\wiI]ѠiY~tISt̙3A*,ݻ2u&t׳yfVRL5NdɇIvR&NԩÎ9|%aQ kجvu=+[Ǐh[tC<˔/upga/tZNxKO}jkW?ֲpu&=-(+eZAWq~Zlpu~JZ~p˖-kI."|_QPLKfLxÆ B-ʕ+3_U|.? UMBAHҋ,Uu+Cj-;( ?ZhAgB5ݻwL\~=ٳMޠݻw 7nzT쫯ȑ#`EC{8qlRC)kk,+ DKF}qWJLxUi$4 Hi{Vvu*cCTY!;"zQ=Sd۶mo߾l˖-YfI&,,,Lud]R ε>cw" g [g:$~OFzz]f ݨ֭Fe$A'?/G-*4@A-HRUHF5kRή^* ԞrTsر j:t <_lu͚5KXOҥP-? 6m4ۨu+ߠbLr2U/EK:{y^Kw2oT2NNhqN9NBA-"ⓣ ttq,`幮6/}݆xsY)*TEl6Cs 3[XX'ہr+ƍ'ܱL6LHA(p(ES5b"t(5=ݸD"/ufþ{g8 pb+ OxoP-]͚5كRG(Gөk6? ,wer+fzv#J-4^ӤF3+hn)`9~CkP-|[>}hݥVL{/ֲ]ɞݾ'`t?ȑ>e}._,|'@;p? FFUպQD|||xaY2e>YK˙tM8p@9\ 0>ɂj>i<蝮:c:48cT{i. fokk&L -=)+](yZj wϣ(fG{ΎϫԬ\Y:9Gw!D6S\+x`մ(-y&--ߕ)Vgokҫi]%J1K2RA Jw/Zzy,^Xxm4 x-1שSA6Af(Wk'{&RbmgzFhxi…RsU) X>Q:uC;pE4հQjŨ ff̘!tF,GyyiiiB2i$չsg:˗/jm[jV^v~*j^rEAICԹh7`|2=+oҍ)5!m@z՛OOYg#Pڵcf?(`Q==ݫl,00\Gܾ}{ַx)jLvGk6Zat˧M5yw?e)}H"o4*}!Zڎ?{^+Nv9(]:ue^/ST/ qhMףO' Wmt5# (I%՘iFj] R&"QC)4*tѣҥ/ GѨ?V ͛'EP`ȿUns|ͥlͶ3]Ƭm'iXo(EA{x.0r*]] ,}MUʈ ӧ iOd^_()qF |5/ Sova;#s.|#+S TK\εOy?ܳAߡ%K$Ft@Lu }ך5k>yNi ԕoڵKP{rVi,EiRأھ/jE@4{K&h9nsT)x|-M9s0䤒3O߾~kC7tZbuI-K9?iԨc)'RwC}QSd,?')+锾[ \=S [{^VL— AAi*F74y[JPC NO[wMd]o+BxŽ;" -8ⴸw-nw-NLIӤMҤI}y2LfDoNΜYHDD\#K7A]}go?MtVԎ0Y1OI:s0FtP i~HzZD'8 &i'Q|DBDD ;$Ak]<%)k :>_*cs+ Fs`s9:wquIkp!NړG-?^ʔ;DDdMPA.L?zJwI}Γ rUR)=SuD!C(R&llm65F ja߽{']Ǥ-3\I`R~>vp-VF TkL*:t|]*:rXɃth u!k+Z*PM/6AD7"F>ej%RT?4Y4Q,]Wڄj1&c70խ[}a@  |y; K%AI@ymsDu3gHGuIvL%Ν;N%, ?T ڢ.y]!#)GY#ʣ )G̙# LM(˟]""K;] UsXJ5W@"UTFh9vwCs"" tL""""_ KDDDD;DDDDKDDDD ;DDDDKDDDD ;DDDDKDDDD J.\S(-XK. M""SHe˖3uLAׁ\"Jt<==i v.~)Ȓ?4_@*U*C0L׍w^ S|Ѧn`o߾&(“;Lvq" bN3څ ݆Cslo2)#O`ly3-$fuG@Dd9|WԩSrISl>#y\}6rؠ3={h 2pDi}tBztT\v냫CCl݆}0Eg1oj(;H4֝`q֭hOJ1i`0A&"{WEg5yU?ׯn#iJϑk<{lckn̶ŦUV׬YRncmmUVVV@G)<>/~Fx[k>8(X(5 3Iw܉˝b,ӥ3>}hamOXz|/a *He)]>.{DZs|jem8@b[yf8prԩ߼{Ncn:g}#2up]]]o߾ym۶;ৼE!*~ɓhk׮Iac#M UOCL?)`p6g61z'2Wx(w6ݳQbW#7,T\SӤI͛71߫W/_oMxb… _QJ9+_Դ&sѳg٪چ{rGs͚5w)ԩEuFܞ))o˞?Nnׯ_5VZ;McÏhܐ{m]bذaN:`޽7/9r*RyggW,3 x :uȜ9\fɒ徱\ _6a$ˋ.5 Gi;;$ +Npf]1_(kI r@D*a<~dܸqC-X$,"KRSg,FըQcի[::i1upY;z;vL]5mMN0:'<6b3>z :noo.A#_|WVK M6p…h}ܹb{fϞݳk׮͛'c1Zy~:MIN2dɒ}Rƍ+G_ѩM.sR^/uVI& 1qX"$:ߵ֘jwW^}"-/?xݧ/I<Ȍ)3/s?eDd8Sy>CGv*9u'i^tI|K'i`>4#(8P!Ȕ(?܇o}UUύm:rڮ˗$ٳg|F1^uc\/P;6tnqٿi?FWXti?ۧ&/qɒ%a>w1!up 4/Dtb$+؊5jL:uo۶.~c>~)7/#KjoZ.ob[KhgӠ|M!CO2`Bm)2}WqY,{D8{:c).ipNVzr=kɒ%[Nd*UtCc#ڮSNPMm!1cƌ i{bkup'O<7nl"/Cz.֭ 8ʹ.ȉ #'bŊ60ap}مsHcI*u]):MhqV'㫜3,wv$J]':p£jpƨ%x:tXַo.N2st{s1'W]iwɮm)R!P>R]ȷE~T(-ӧOty9:rihzZhvڴiΝJk=2(S4L#XtI,Y$rM6 #~XWVM۷/vٯxQC̞=[*ALoP]So?O[lͱaFVJ}S#~0DS7\3\}t}Ѷޫ]!wFضzԞ6ڝDջd5׏<ti4uZg|ݼKSXZjy|2ۈm` O(׈N;Fud=uٶ:֭|p$^yy͟??("WeM_۷H[1[^e˖b:H\6|wT&5Qkʉq8-E׏cwߜq̟Kꖧ˚2n#5N+ע&l&*UwکM tEsV_MItT]6؇-I<$[߸fp}wmt<Ȇ}=nLzt>աPlY4r#& 3bn/!>Npz]M^i[MC22Mu_|)E\C ~:͑##1uTiu/̝;W3Ӻb mHsPkEyйzXkۯ6/ٰ\+Jgɔ Ek5O^_r 퀒οO=j.rH &|0 0(Xի7)1D%MS)4jժtY_;ZC Upʨ/^U]_SV>U)xy`\AAAH-3F̜9SM9&/_~ʕ+֠d$śd[egS1=IW:8y S1i uss!uN>:\<_fLbCU/\w.?\9{])NKzN;b}-?۩;iLz骍P]gϓEr](躍O_9W̗j=v%_l\]8$u-TLI`_+tm͇~:Xn7>"Վջ aº<*WS%g.n.?Eӗ)ݸ^L#̛o)p9 x,Ex)ӆ)~Tk8ŋK7/gΜnKSW2_:j=nW= {6[ȳ[;c :ws{^ZDݽM7S:g\;uf)Q{0dĉӧOIfؙVޥS+T8 ZaݵJ,DFq;;)GP"XADUVuJr @GYֺukm)[OuO}:u$*1-{޻w/+EHkʕjR551+={ ۹vZL2=!l{ejȑNhla׮]5q)Gr5H[A6-:I+ԀΫ.})~н#Vˁ(f믱ίjERQP_Wޮ\!qia`K*uR˗.0f˖۷=0Wt611ܹs_G@ȑ#q;b87oTǯVRe?j(P2e/Qi5̙3ܹ|\) hcă\#Ӕ`60S8{'"UzWm`tbbDiUt`3rn(&4AW52,w1)ӡ Uc>o޼R9Qb$:&ń$p޽GL666XgϞ1|th===O Q)rDr}က<a\?}t \bae\=GD`̩#z֕9K aͮfN"{on2b Fϟ?/J#Mg#FQ:OΙ'JHΝ;WTᜡ9Ȁ)>4Q:8DɗʔUoO&FdS؎H;.J-Ϛ-b3<)kOsZ1ZON^TZX}Mӧǎ&qu"SOe|ERT_ xXDFnckk4hdLQjD_?}H"uٮ~/^, QA]MJ\5CO:%BCCΌRY$ӾpJ_d1EiLQשS'ne5EJ_>s|tBLm!9c7'Ptu=2CК1cF_Td6mZ,Y"jhiH1@ݡCrɓ'EmlF.FZ[xq={TG6ECLm$;DoYL(GiU-]o513z!“;vquCClqVtz?ઘb똴٧{7 +.3*.̰GFdX<Xth b,2L8q#7gΜ7QYf$9H[//8Zj{ׯ_kq%K(mHHܙWF"]NхkpfD;;pE&m^gbt#;cR}Pt~/:Oe.)!:Iu9|c\:99bϯ.QAQ xaRކSNR#cǎK1iF"mBÊy9U[,D *)_Zc[}3gw\> Ž.+:Žtt-,w(#戈 syTW0u{;H@'UIX@q{iGz""!_Sb |~6)"N1:uOd6p]ĉs?r[ a]b5{잘L"]%#G.^xSq{sM y S]WQ0u3 C g-_>Zy&""Awp>\ KN""Jtع%Ć["J|vp(Aavp(Aavp(AI܅ vZ`vQ`.],4u;]lY?S(ѱV||M%?%2OOOofi훩a2<~oJ"1ӷVikꦘY^ D]Q.%(Qbk۷=6oܰm۶u{~~~ܻw/k˖-ל9sx\ADDDDhܐ{kkɓ'% 6qԩ[_~{#G[E9*p'O2̙3СCPp8ȲݻT_NӼyuׯ_ϝ2eɒ%TJ71E6]t)gee W\۾ҧOXADDDDhAM1bxtbs}ٳF5N:۷mVǻGs}f*o߿j‘#G>8Ȳ;yAܸqcypYnm/^,ԳgmnnnX .'L0\u˗?K8ȲBB.hb) +ӣH{2ey;;;N:%KDi&ѰaCiZjb߾}Ѷ~ţGGb"88X$I$r;DZt9X|'F^WO>}9r$߿6mZmt̚gu/^,:wyի"o޼ZK\sk׮֭[<ˣȜ9s#/_.N8aP_~h#zy]-ڴiq˘ߪU+f͚Zc[vS k6\OٰHYsN3"fbec+ kGgaYi}/݈:jۺy=sGWJQWX+I:ޚb1? $F)ƍ'unCCC駟u-[&ڷo/޾}+RN-_FG`bbʔ)ۢ,Eڵk"O| '6mjm=zTTX1ruϋ… KÇk6qv6]v4hzq/aHu4-'Љx(Uغu_u;t M޽{,˘:& lٲH* ~ȿ+]NǏg͚UJ 04usLNj)"Ɗf؏֙U;v"7Mklĉ91k^oNo{k6vp8;;KEoyM?~i^E,.]*ʕ+'Eٍ4ixcP;!lHʏs@@@QtҙK8> eD؎+l-?W^-eE0u"]a!{P.ЪҴ6vpU/:>zh1k,?Dކ/K|A`'xƉlǷ"E͛7GV0qFEM_=aL,ǂ";vL 'm6oT?uޗ1{ʐ(͛ޣx}HYGkZėK{㿁DdN9" " UV~M,X0Z&8^9Ժukm)[%OSNlӧkPǏsd*VXF)DD/izQD.&-#]6!OY-48L\Q^\KT\pZ%0iۖdɒ%_O،?^L؏Ν;j!E]5-7kPӶ{%M1?e@;JiqhU팪^Oqfݦ$"s.%(Ts듈s׮]{AdI52vd(.޼ydɒL"K.k۶ߦn%aL2M4M"K._gkks]7"\"""3sZ6lhjvYvp̐\6idBdi%""23[lip.WneY{aEc67!K<~oJ8x>r(D(G㲁 nY殖-[1T=|؇SHXDEY"vn\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JP%"""\""""JPl}f6P """""""""2S )pDDDDDDDDDDf\""""""""""3.bL1KDDDDDDDDDd%"""""""""2S )pDDDDDDDDDDf\""""""""""3.bL1KDDDDDDDDDd%"""""""""2S Z zcvXXG"DJ| "wasѥK1cF_*W|`Ȑ!ry!"""lٲe}%"J\p?|1u3ocp}ful.]˼̟?1GDDD-OOOofP|Bǎ>W\WP=heeMRHԫW/ߡC+V,Mۇ9L"""J|,.ݻw04]tY͛^~=wbɒ%+tyݺuay>}f^x ,x \d(77g^rHQFI$ɗf͚gG2 ޼y3E:cTXso8 Gp6wG9e p͛>xkm"]bC7?/]v666 <_|#0ŋm mϞ=gːq .m{AAA)( qyunݺCQeq\}!0ۮ]={3| n9Y|Сۛ7o.֮]e\NٳGTXQީS'd۵ׯ FMn6֭+ۧ~;vjՊ4{V{x4K \z?"iu[vBWFQ<B*xLrG]B/DBP|L]+SB*11 ==]'۹uY,B*m^nnnɓ"s>}Yf ___ѳg(ʟ/^^^"EbڴiZA-}>ϴxbѹsg9;;#Gyms'1ɔ"t}mBoΉ7K b£Z|;O|\}2]߾}v[DMzmOkWPkSR;KL|ڵK3]m[ b2-ioI e SL#Gƍ!x[L-[6q ) _~*UUTβeD#}VdϞ]4jH8p@ܿ_ȑCX[[k׮8⇺cܶ;T+ m5W^w5k֔޽|kcԩҤ ?bJm?t?0z駟 [B-wjpeom UfW~ֶZoшҤl@1"SygNۊɬDDjcSz1xgWL,3sj M"""""cK4\_PPt:ueȪ=ʏ+.nj#Zh!fΜ%I,YRʈyqnݺ0j*@ Y& @|67xH֐ϡë *]JS7)3^6J𖢳"""""K.ERdUΐ+WHr劶 y˗#<<\:MqСRmݺu8gHݾ}t*&tIVCf le>5T$njB8B'&DA巅NvXV= 1$n)˳Ym~ݻwhڴYjp'a[l)"-wtq%vSxIA"b:Bmw!"S2Ӷ-&#G\cQa69OsXoP^S>|Ȕ)[3m>ϐ5FmXX1i.\ %J= TH%~[UIΐĭSO5y[Iw@ xRu1L1|.G ZgVB! DDDDD.iy0ɓƍ/_H2lE-\e7oFZTk%ACPwҥ˕+'e=zT4kLZ)BՐ?Q[\uQnE] \uP@p1 b|"+-3pco!I$1Xt޽{zga ~i=QWW[ aC^"8u⮨5z)fB Tb'ōct7|&h \""""2G RcucLх׬Y#Ǝ+ڴieѣGKdҨ(iBa:wRDRn|)А4~uLvS+=yXs/qyDbуP?e\#;Gʻc9uH ?Aiժ W^vd+gm?t1b1aBDի"UeHL6((^}Gs[.EZT֞> v ){^w@5Q[_}FmVpΔ50A_gu6Ŏ\G? u=ԠP%K&XaҤ 5ǘmO.g1c],v#6.Zg2}^z&]|y-ل)K&Ι:&]M }QK9i2'7Ȓ?`Νߦ%;c}]MDDDDcL1KMSYMP EFj a1KQB.bL1KDDDDDDDDDd%"""""""""2S )p.Pqĉ!8R&^aV8)sk\;Pxgn 𽟸%_ݢbnnnp37S쟈7p-Dz DDDDD ]foڴѽ{RaS|ǻO>3}-z?nܸ#F3g۷ ۏ9R\rGcGzmVӧ倵/^ٳg;ބĜ}v__X,DDDDDD1hݺ˗߻wo5s*TwŊ>|رc9r丘E}uَK+adkժs׮]5ױ|=00.Ljnǎ߾}2e O<Dze;x`%yI :>|pDɟ?N|[rd5涉,DDDDDDZx;2mq7#pҥU,XuСb} A4ڮ,YOnuNC:uj)=a„΢WuO6acq׆j9 c%;}~%J8 t܆RF&>m1涉~hR9syRzg}ʥPFdtj{_9cAKږݻݷo_U//xu{1A6,.}P#a6dTr}1lٲEg͚ջUVsu;vt̙}<==Oϟ>mY-[4@QVSmӘ;JJ|19^[5p~~~G9 W`KEiWlm% Z vѣJBDDDچ͙3G.]- 7CCC0vOäPWmHz?ꏢ6"Hi(cI}4tIu٫K, 2dض[}~i{Dԯt[lm% Ye˖c(qI*xΨgBOnpBa\*T"&n%2 %dfPg}""Mg/l,B7u3O>%%ꦚ-DDD0KDDDDDDDDDd%"""""""""2S ) >+V)]`DضmmAF6uiqzb['M4dSBk֬kA|̛p VZp|]ݻ6mڬ0a?&)SpTr:vrJ>,ѣVVV4m/EAz:tobb^cɜ9svgɒ>kNj,p_{._~K. ߼yAׯ޽\L=YdpEn"E׭[wgŋ a`͑#ǭt=wss{+'NxjG5&I$_5kϯ^\֭[9Vo֭ўl ޼y3E:wm!ȾEp6wG9e Ν;Wt q:ulGYm۶E ǻbŊ4۷oV1m/&ӧ_v;lllcZĵjٰaϢADDDDDDDDD psysɃg)˗/_xV rٳly2nqy…±m/(((%20o޼n ۷Qbq\}!0ۮ]={憁†>m2'˗/:tx{ڵk,+WQى={+J;u$,Yvbaèfݺuž}oǎVZ&>>>wjosww=_|)\]]cV=GBuc\rDCEBX[XRq[6V777qIrG̚5K={FYW~)RӦMӪ jժXfڷo/}Y[[]Y׮]łQmٲXz{$,Akthl_+zȝs"pZ+-,$zV6¥Jᐫ{v[<_0E!lBKw/FlVv:o'-4X<;0㒰NR[?A|سH"E_cZ(.MuoI~M,^8ʲA)S#GqI-SȖ-q_J*I*UDngٲeҏg۷oEEFāE9׮]yD&Bɓŀ҆rP7&n%XSA\?\j{ &[m&>GofZOGStRN ,M1r1L1V`XIـxLgݻE͚5E޼yŻw"?1uTiRǏQVHmfݺuYf=懶7gϞIKNm!o))zǸ./l"l]2 qq÷"pZKwqJ'-NZQlY"e>Ҳ}d%O6Gپ.#q돺y(:,QR5.M{$qDDDDDPUPPt:ueȴ=n.nj#Zh!fΜ%I,YRڵK<~8rynDXXXjQO<.|64cUR6_IwIEL"F\D&")oV\e<@kPUH.2dW%A1Yemg4>' !CS7I+8cdС?&Md&YO'7I$}KKǺ=E}ū=:NMF,VLNF+)**-xuH,g>%cdUΐ+WHr劶 y˗#<<\ܺuK!-ۺuۏJ Gٟ!!w鹘ҥK'4@dRCJ֢D0v-U4^F' VEA巅NwXV=G ApPyX7|U삷p=2g{%Uv)󥏶ovh1H&Nm$>|ݻwjڴoeŋ.O:%](gΜZ8XM3{NK({'7Kt߇KaOGYhᐳxfT>{D}Y]'""""T R%^zݤZȸڼysNE D:Yd^r(]tRJIaoo/};wH"8EZymK( Pq>rP0iN&O={/3GNlck#TrnQW%:C*N=595r,|_'b"{,\[[D+7ga:uELLܺCu5IyPS|~_1K9;;KqaJ)PUvfD j*S8AݥKF./W{ҏlQ 4@ ^oooi!mV|ݒ{q)gmx1_ow> 6~eUA׉ aCB0S։jט_5O ^98hYP~$Ibvٳ%,fj!G *|pvr'EޣX^ܕ.m3DXNL]mZm}"""""K. ?pQ?e|;Vi& fGQAy4:;wn)[D )S7Hncʶ+ be!YԭQohcH#9\3ޛf12~l9s_Th嶻g";┸{P$..^?z# )R;鵍Hǎa:3>&N(]1j(i3pTcth~~lNO^tO|6K$le3ԪǪ4ޟ~`PWҤI#?.B 4E)J+d~AQbXJtǏ/f*pjZVLNm׮~("FAGX3gNe1-[Xn ZMvk6j˜jq4u[y߷ 5M~Q&s-юBx,DmwݶXmPP(֏\v{DE=}6v'~SDj=@XtL^TV!.MMZj%V^vq|F|hbҖam_q3ۤ Z[;c-53BҤt6t)'MƐX85w|Kt}b LcҤ {}ױuB3IVvq*sUDDDDDDDDDDf\hh)Rx=0KQB.b(<Ȍ 2<1u[(aH-[4xI׫W!""ć\""""""5?~ެY/Y:,3u(aHņ 6o|ݷo߬g~ȑ#M&"""J%"""""RcrQF 2d.]FDDD.O8!L2/onʽswn3k\? s^ۦM+Wlmvx """o%"""""""""J,>bŊ6L""""""""""C.QB.bL1KDDDDDDDDDd%"""""""""2S )pB 9R "coojgvB>|1=Za̘1 8pĉ؄c_DDDD`ׂ:S9EPP("ıZn 7BXqN],![/mhP^sا|'Nwb}K.v [Eh`uyї/_L2eɓaZj/??'6%""""DI`իٳ{/.\P?lQ.__^rLt=ׯtS'pT ի?͟?kURe…/]DDDXdw5G26n3furrzkvAF6uiqzYYf7l===ODDDDD QXfM7oޤFw߾}UM&"""J|,.{ z.]*XB~M:ܶsZ^^^ ~j]N]610[rs… ԪUkŋ;Ŵ)Raqƍ}:hW~7onKtN: Y~}3\ȑ㖡+"""""ҟMȑ#!ydU!L."""J\,.[D>>>+V<)2]Q۶m7X/00"8{rC t, קO| ۴i -P^rsNvMVZFj7| ~J \"""""2_o׮]ۂ\"""oJ*\dAӧ5k>/ɟ/^^^"EbڴiZA{K~i#88uŊ+˗Ǐ3|v5JdɒE횛% evv]ޗyÀ]һ|o>ħ֚y=L鳽y&rGqhԸC3R$ Y黦6mhֹSnq?v1Je.˧/vg|]I+hcrltJ j35L\l,3jժ%vڥvq# """"dQ$#@ \yʕ+LsoŋKo޼~dE? ;vbѢL2R4 @XY&l2Ѿ}{"^*'J,)Ľ{P"r޽{ )S&ZժUǏm^ZX~=+gΜRvܸq4i҈w^zE=jl)|nPĴ~IJu(ڴOQ0a5 qgN_߿ݺus-Zk֬i{2p 5|ikݺu |1ɚ5(W8r\3AGsG/d[ZW&,1؍IyY5}cmlmOk^q`CfKӣ;Qx۪[x5=˙?dzǖ7D[-%&={Dj M"""""cK4\]ԩEfӧOu&<Ə/o+Oy,q?>l0D.2v .,PW.+V\)aRm۶_Ś6mZQB8ׄ DXXu֍\/_>iB +>ӮF#vS% DX/ضTOj"bu!>+~ + ~79$ĖٮI2_mֵk׊3fDɺ3W1}M6ҤXbԩS"O<ѣ?Y 2V.{Luϛܪ|}S9<"W&OiI% o˖'k`} %&YpIW^۷JٱSUaXG]Wg B')R$r9x9U(݀<-Z$q=ZNj)WX]Ǻ> qvۭ&Du)3.iҤ@NFF6Ο?/Γ'O͛73 <== ltlaa6IBShwbw߸c[u۴lK*>xԢxO?MJ4A,%~&hb"""""Cb@Zz={vmƌ?l@-<@V*y .+ץDS0PÇ(A C]62}N޽hذaPeQ u.A(۱cGd mO"]-مȐTTWD+ZoXJ4Qɓf[<{T%*U$չ>{ K$0eTF.wrNi Utic fãu~Enu\ .\P ˋ )7͛'I&ҠC&B}̍7K렼>vs8^_UȕRdv)^_}!q]뷈,QXB!v*Ǝ+ $Dv G tbY\+Mgt9]: @ 4۷oK%H?Wv6u}Q۽~_ifն o޹qRm>˻ݮ{?԰]sS&~tQsN&WӓP3jA߾ZUiXj&}g ]ލ.Eoua $ pAr &"""1KQ(׌@?3g2l7m.~]rEwKAX(Y8v(SV˚5uq_yP3db@3gJ!#dl_q@c@{{{Q@1k,ѩSh~Tm2c!5\[wU! #2{G B1_=be 16z-},:UUlB~xO!I&O,*-ǟ3+ݴixogXb *Zj_-#?Xg*;wB)G=gg^_AūmÐ+|Cc0 ʬTȗی3ڸպԺve[M?R%){}ve8gb$jbK&hu(du.A!!m,O&nl+׊Ť> 6|kL1oAP!afGiL@!yKSBAt Ĥ}>=QhX"w1j{]>vaLڦ@'Aou6Ŏ\h"E #Ȱ% """"""""J%"""""""""2S )pDDDDDDDDDDf\""""""""""3.b78qℰ2u3NTWd*|'N6|q?оT M2Dw %ZY:L?s̜0>DDDpp@Dd a2S(1gtADDDDDDDDD.bL1KDDDDDDDDDd%"""""""""2S )pDDDDDDDDDDf\ VBG)lvQI<񣩛AD&R|#`vQaׂ&ť7us(9:: QEcLoN "mא6L4u{(~5|ǏٟȟIe "̬;tFEm!""".bL1KDDDDDDDDDd%"""""""""2S}}J+VhSti۷`m۶mFmԩzŶ2O4iم֬Ysׂh+>!!!˗С2eɒ%;wڵgϞmllM2ٶm[ݧOwss{f6PTx3gϞ-7+cL=p@ecٲe:o~I^#W@/q!㳸.8=~kVVcyxxM|{V6mVL0aǏ vȔ)C| .\B*UW\ бcǥϕ+W*TG2ZYY}Ӵ)RwСŊ;y]%sΝ]%Kد!/"""""|)o-Yxq'̿y&}"ۧO﯂6h% J!C'r_;̝p_{._~K. щA빻w>nǿ"KH"֭ ѹxb!,X9r丕.]իW'NԴ=̏5jL$I4kl_ӭ[rTZu֭[=qVɒ%Omܸ ΠsNv;jKԩ7q͛pݻWv]^UU .2uHbA˜9sz̚5 cƌM;={>} Wp~M6?B1w<.nҤI?y x\>|۷NN:U  1gΜ7[h[nRJN˴}Nޖ+W(Ϟ=g2eu>qa>>>pd(}ڢTVv tLѕe7nȕ5k{u CU̙3őXhsÇPFk?{0g"O"$5d5Yum.Zmٲ#FG@@oHtSk'<oppp.QaÆMP>]G03f~ĔLiO8xSbŊ4p1m/&RLڵwv:jذg """""cC}Ȑ!0@oj MC6FH-,, !1ޣG9ǎ+'H|A" allٲY}^Q0/P8E<ه( @\ϟ?O*},ݶ.KΝ7n$Q8n~M'x[~H۷ MDC`lڵ-DD{u"Ѓ~x?,Y7$3kຶEiΝq7]|9CEu]NGFqLx^FqiӦ}@jT'Fnj`ݺu͑$VRҥKqׯ_\!@ dذaCS.tʼ4h` nG3V^ 'rDc5kx.X_~Y ʲdɒܹs BvӧO#GC[*UJ3F.]:rN: @ulE(#,j._zRnܸ!'O.+mO [۸|lBE&ڞ#GR\rI(:ABv_xkEB,1o'{!ܓ QMq[n1}v)}ۻ\orH-_SA|b׷Uf}.Y)/ wMLu[=|!>[9`Jͻ49|?; GI"iJ5eiC΍O w{\YV.s_>}˘=jM*_A;&u{:ks힂1ӮoG{տզ^ڵkÇ E<6EW̚5KJ///"E 1m4ڠU]f4*Ȝ6=U>|?l"oߎD˖-m[g9§d %Sׅ5ReSI;Fy_=z} w:*sjy =`IŽ.^4%|6) OmY)|;{0]wUYXAeFtLܟ1՗-3G8bVQZt>dД8}Fȓ'O2ZC? A?)!h 3>!  dU^}YwmL@9R_A /Xg%"MŸR|wyDmĺDHt!lLc?A+\"8\.! Q(Øc{P=^#0GƟ9X<")_{u<h"$6y9fUkv]^}Q4"" X@ RdkǎXuk/_$A0o,S`(@߶}]G]{d #|A6Ӂ7/N0uo&/^,+:x#K?|B^J?ƿL2RTAT_(ȍիWRQp Gۻwo#2e$ZP|iHďdT1b_/)hI4i҈wT ѫW/ >Zk9ǫ!NGF]3{:O-:SXڅ bۢI¦y;Z>_[+/53~7&eCgԓ/Z3,'CA5HeL5peH@ȴ+q .5 Mf=u@0T`.S_Icۺ<.8UUVMSߗ.]-p9)S D rm+"I1^%Kti2cٻuٸj 1ʯ Mi.y9R>^c>} QȪ^8]UvQ^1)+\]+co 'p /rb:ujѬY3|+ym߾}#%ۇ mY\C W^]ݻW\R ɓh۶mqZŊL *&LS([Y_&d}m7gӊ {7B1_g"omƴ?E< qVх(~2V.{Luϛܪ|}S9<"W&OiI% o˖'k`t},kw%Ez63g)Sk׮3f̈kn-[6 `eI,>jv&4"W =6jϒ)Kw&F+դN_p9c"z烍}RFۆ?)^o߾Zpu]Pi:zh9VLOOF3М"*Khty\8{d.DV A&c!+%@F\S]G}ǎL̸ЗpF)ʷYx4ߐN)2\CQ][^O܆N:-F?^Bu\r4t=Veft}%{Im}}]Geڼ}_&K{tzDކPVh2pϨq#+>P## oP 2FxѢERW]y}햢`j!:xvR̴mƧ-TK/Đ?O*x˳1ogf!4kꏱ#~tTqg #iGU 3差NKT,vunKq)[6iҤSelŊ+[32#X߰Lz_irVkHl2nޖL[^;;F'Y53WK? ^=ϺN\[>t]UW|E]O r .Ҋ NF"x02څێ+Wl>pCR9FQYqFcUkF.7+l&-}}Gml_.<*Y >p) ԪUW 6C4r#mUud(Š\gASOQ@y;F:E j*E],NwiݻwNU,9(V,jQA(۱cGd m$9R~B+/%+kvdfa߻˿f"CR!bS!^!&G,hNΩ>-ݿ`J2pq=mUeã㲿mFTti*`4}ɓ'-7J'G9珤S:XWdL)ZFz2G'iP?v:DRud)S F Eї;S|HK(Q O8,q*02Dk*>p2j`?~)g(I&~XԷDLdb 0NON\;R%'>q!+ äIEq\,:AI F16Jɒ%O1Z>}ۮs+}G}  `.?;vYdE=\4 Agי3gA)d"C7-ZX;t?`3DO#``2" Yq{\UYl]_ 7Xsmtqytپ>K\O˲~y)H8u*bl"xyT'W (k~IlݺU .j*p(~8@mZ~drpT_Qk 0RTʴmf9ک_ǜJ(1{$6B1#" (vބKnL4 AN4*im')c[7f_Y(%.*,}Z>hR<{@>}| t'Z;9 |pIToT0b۪رuKVHlu}"Chʧ#h 20z? 6zyy-$_GPAW5k{K^ul#+C`D`v[ڶ. yR toqT2cƌ1Sds+#I߶5ay -C{U2¤v 2 SZje4Ѷup;c 8Luyl.*5v:˗ǤK}}Gqg8D;p)V@"ziS#LSkԈ>Sv"FFM x]t#F*>\{pJT(Q4rW[j9Sߌ 椸u&"tb{)h+_G)Zwvo\x&I$TӺq)p5g*Xǭ7Oi1K)G r&A: +ݸٽK?~i]OT zޥS͑۳mۮe޲5nȭԥmOW8YfGzSK={lP8M7|N&pIoߢ8TYՋ>rHiq ` ZԺEvJ-(:b Oxj޼y~Q0OdLf%i0KQ(e3g2l7m.~_rEKAX(Y8v4ҷ6f*l]W LIQCڃtپ:(「bǀ (-f͚% rz:pL5pѦG6fY3Vp(!Dʪk QUY-_^4'~hC!n}8uA~{kB(( -Q8:9~>|#ۏ{֪sG/9 xIXlɤ#OEEަK92u{(`,6(H"ZCDDDD ʃ`dwyߑ#G;q'N_`icƌ zm۶ӧOc-^S5֩[liаa͘_j/??`,kmݺ<߬Y wEƍV(S\rec6lDWW@`3KDDDDDDDD1zO&Mx}>~ޢ|1HUԩv8r͟?e ƍ^77on)S&5զ-jڹk׮Tǁ.../r+Wl}ʕ|SNn^|QBaa\KDDd%"""""Wq[ؾ}4<+aXGFӨQMe˖=aɒ%]~=7JTRe͛7sba^.-;w%I&ccc>| :w(ei\"""""˗/]pl[e:J*,Qi(+`?&Wh#>x 3vvvX6`Xd HDDd !#@7oR&/S-Y|$I^ϟ[ׯ#F"/G!Yr`(1a Li/QnzuK 芀!9mڴr U=,,v„ DDD DDDDDDfhȑ֬Yrƌ}߿n0cryAnW…/9sxnaq,$$YJB#c06TH"E|ۉ'?o߯hSW\wRqK,yرce˔)s\mݻZ.O>SyiӦ֯_LuEuFY@W}ӧO 4Y]_ Ć pu%cׂua3gt"SǻwL"2[[0EoATR' 1yVR>s>0_Z߾}@ &Wq)uPrOOq9"""KҥBLnDDDDDDDDDDf\""""""""""3.bL1KDDDDDDDDDd%"""""""""2S )p-X 9rAS|#`vq0kBCCS9J.-N8׀BDDDDDDDD.bL1KDDDDDDDDDd%"""""""""2S}}J+VhSti۷@Nm۶mFmԩzŶnxxM헏VH,٧oѣǜ:,y.!!!?vڪUX`h|{V6mVL0aǏ vȔ)e˖u(\*U\_>|p;.}\PB=zꛦH"W^C-VYz,666w[c8$I|1cFDDDDDDDDDί޽{ _NӥKo޼I sw}.&܎V\[Hu݆}yB/X%rsq+]tܞzĉQFAYfM>{e불(a͛7s.Zsn!kooUgs}}ȑPܹsE7oSv//۶m@wŊiǷo߬b^L/]vƴ#G=zoבQL\]"""""""""J,.3gΛ'O$_={vOy> <_|#0ŋm mϞ=gːq .m{AAA)( qyuX FZĮ],iӦeʔj{=dݻwoߊٳ_U_F}9iF\2ʲɓL2*UH9}9s8t NNNRJBqg1m4q)g1cF7o^ѢE 2)RD>bΝvZmZj~,DDDDDDDD0Y\W_̶kgϞy{{ >|dNBCCǏźuYNɒ%`W!CHӬYⱍq??~D`\Ν+ʖ-+=y޽{E5~/^k׮>D ݻ"W\",,,[nI֭[!Ə> >Der[ŋG^GY^۷o772xۡCtRinnnwޢ\rhѢh"ѩS'i˗/Q ;vLǏKUV ++8ѣ#˗/ڵr˗}kRbEq_BDDDDDDDD [ RT=p8|tVX9ߵkIJP__pfKN1cFD x/!i#GcJ-P@KS\ױQn"WD(3g,N*7o e^|ybGΣF:;w&eI$7oYf_~=B En/[lQ%ϟˑi6rHo=ĝ;wD#oC ٳg"Eh?j٪˜mݺud;6p9§Oę3g 6n(PH,YG])j*g*ׂEIcB` Rd"zզB| %\ A *+WFZ"S8qBZ%T^J\,Yoߊ He*U$SV-. ڽ{w);%~ԩql/^,/^od `]X(aa$Ȣ]rV*I&r~ĉJ*|ǎ0`٠AΝ;2eݺuq?)SgϞ9s_~UVnݒJ?^ /i3PHe۷… 1o<)x+K;#6p92Uضm[ʕ+k׮I5b߼y#j׮e}db}uaUeϞ]}[~})z=;wN̚5K f,(sppիWH K,&U(:jnU&ױQn"$g*O""""""""J%"""""Axx .-DDD0KKr Zn1#H[nmSpbSҀH_7oޤ|"EΛ=DDD0KDDDDDU~L"""J%"""""R˗.'O/wss{f6Q.͚5[Wk{{S0u{(qbHE6mV:t"7mDDDDDDDDDD}1yRN^r%ᅪk׮"""ċĉ """"X۶msΝ츎۳g˒%}S7p-X9sfNXXD6LXfv%O.m֬YmذiѢEϙMDDDDҥBLnADDD\""""""""""3.bL1KDDDDDDDDDd%"""""""""2S )p̔p۴ibʕM"""""2^zDDDDDDDDDDDDDD pWXADDDDDDDDDdh%"""""""""J%"""""""""2S )pDDDDDDDDDDf\""""""""""3.%z{vl͛7_!"""1k*Tpȑ#?DD8 7u;L|G>\>zh1cƌҥB;;իWjҤFc싈H ZP\zzz S7④ ٝCn-6Â8qN5KH5d |'"kDJOҥN8akGǎZꗦMn(R3gjņ\""""""+WϟdϞ΍7rۇ}DDD81KDDDDD$wo߾4lp;j]DDD81KDDDDD"s矟[hvΝ-[AaEDDDEpw]_~=zqΘ1ۨQM:uZ\^=?mo֬ 64żiOOm!iy0pBAMn߾r++on%.=}tL|r~tyѥK VP_SN_s//_~SvtP ܺu+GϞ=g/\KZv.^SLK"EF7nH۷ovկ_+y憸߿Sx֯_ 9reNJܗ/_7EڵwMDDDX\D}||+VxASdzAm+ tź=zܐ!C&~nCӧ1_z=(-P^rsNvMVZFj7| ~J \"""""2_8&\ Q|.TTC*b^Ύ]bE:r5&vvvautBCC0_#~%+8N"""""2->Yw7nȥ """"C.J ̞=Yz#+L2S ,Zsʕ={X…/ 3PB˕+wtҤICdrպunC6 VbߨQƠVFEJ(Ĵicth{QI5.߾}dQ"dq\d&{… lY5jؽtҎJ:)~ OyضBG)LuxVǃolA|rѡC7o\]62QreeسgXQJ:uK,Q][[[ 6۬[طoرCԪU+G[mѣG˗/}z!fϞym//JAnwsJtbrE]RKw֚wӧS=< wWgR$xmУvSlqY϶0[uo%.ۃn-}e_qݶ^Z13b1nܸnnnÇEƌ#o?~9r4߿|i~լYu= _vx{D\zm_6zhx{ǎ5~%s4AK/X1>ħ֚y=L鳽y&Q~+wF;48,EҐkz7}~Ԍ!ԝ5=vKn<_ ]s'O3gG̚5K={FYWsxyy)RiӦi[]!npDDDDd,./\ϔm1gXxqe SL1r2eʈlٲ7nHXȟ??\H*UDngٲe}߾}+g.5j$8 ߿Aݤ ˵kD~ YX]goR xۨT[۰%{ҤQ,}Z`_ b?T6m$޼y#:$ڵk'޿/ev]\\ķo?p(R4/_>qe_ӧEŧOݻE-DhhF\rzo;yRe˖S899SNmۊKJA͛7k~6Dyûq-ю?llm~zJk W겭tӫctہ;dm*˙?dzǖ7v-CK޼yŻw";!G齪˶?Ufm[ ԩSG.CV Q~\!p4IfΜ% %KJ1?\ޭ[7)Hj*@ٳg"}Zmjժb޽^Bfđ߾}7++@_IŬ;)mٚo#xK}(yȐ!DDDDD0KQt_S~dUΐ+WHrE!/ӔM.8tP)n:#GH3$dn߾]:StS+uX~}>0[YN$nj>;r?KꆅnZT̗^\t=n=v%ߐ& n=}&WomynZd#wːijIJ(m믿 g!sE|)ùL7nxXu[._/Z}tqE~%s)o^V*Uʷvq8eYse~v ЇψݻK^6m샷իWW\3gNuyQpaH=p)  ^P+58 N}ޝr,YD |r3ڠTRzg"xp'aq4NiXymK(MFƼM:Es֬Lߚ#9vPe;6J,ˑ>#"཮ *$$D>|Xz8QS©dJJ9sF*bv]>y_sOk]ˌ_|wx.}p2.ݮ{mz9MK&jN:=2e2qb[ g y@DDDDdH F`\Pq˗/R\P,7oJL.b4uQ+R=zh֬ YA ! 4R#h&mg㋺8لk훈D(m!ۦɹ;Oӯ_Zn} .e[;v!K?i]}3pU!\ul*ql 9oI$1X DDDDdX ǘ #JرcE6m b6{2#1AH A(gaܹsK^L ]&MTV8[< s:%B<.5~Vҫ6 nqהorzFq)3p(dFO6Mۆ4 u.R@sJ'ܼK('VeK.\.\˦Bִ><{i۪1_R;q^B Px1Ϡ %""""s.E.IF?~\:]i,SVpbŊ!QOg͚U*OSLNl׮~("FV7 x̙eYL5pyvs֪\ˁ?&xGG/W}rW)|8t^VI(j}l<ȼ͜(>VTY(/i0߰dZQXӧK;~iRUhQ믿uuUԷBw-5UoZoO4 u]u ՞,]黦ȹ[m4Mw9Ʉ^6mE݆lN57CoisBӪU+(zuC|V/N:C붉(v ?t!eppp롦\WWdˆÀIk`ǘmO.)}53WR'1麯M>`вڍ۸Mł0e AUV K.I\]]?w &ed:99IA9 ӷrsOfjz:tZjy!9wLܦW^Ҥ B?坌&"""1KDDR&}hʾkh1D """"""0KMSYMP EFj a1Kٻ (6 -nnݭ=݊"gAbwew幯kٙowy??DDDDDDDDDD\"""""""""".b@1KDDDDDDDDDd%"""""""""2P  9w011w[H 4m8fA~d>XLRnCz~–f翱w3f| DD7>}Jްa'O,/OCi @C}0KDD̙3QǏ)qoƍ-j׮Wm#""""""2$ QرcGc,YݻN>FDDDDDDd%""zmu..Oݻٳg355 gۈ DDִi-_~Mɓ'}F*T8 pXrnyzzvUXa%K&>f-[ԩS""""? `3:99 ///}7⑝YZ=\5|C˾~A29{}A?`?w}aHs8us5w#[4q5SZn /pHc3?BI`6""""""?DDАPәl_+S=nV[lџ\""Rɫo:{p4ۨNFDDDDDD2.z6߿/_oРٳgK4} ׯcǎ+j׮7ei2o޼h~֬YB㣭DD8Xq& ~3R:i܅rwۈtF.>p7oyݻwswi +WԺu$KL5t4,,̴f͚&&&?wsÆ ->|gϞ -[ֹFVX1;vGf˖푇GMN:qwﮇ̜1cmӧ\ ?lذhŋ#"RUP`^S|FDD|qkQctŋ{#k|'4E{={mjhW=651)O&UicZgwq3g~i)m]e޾%1ޡJ˻:'yxQM|]ܷ>o.ͫզz:RNiҧΫy6z4{/4 \^Z?*lܩA3yhBl^kD=eDc9:>plfծnCw_4iEƌ}s={ҥKakk+fΜR"J,6ovIG} +ڵXtii͚56mMKJ9,ϕK7cU; \=~!âuچF43h?ي~S4=x+c]Tst%V!,.g!A惝ӌi&6.I9#p_wT.4<](2.% >|#GG3~^ew86Ayɓj~ږ#GD%W ocZXb䢯coK;o#FqTϥm?_D* j 5p[ng[ YĊ+"L}P찊KuvvYdE) aaa"_|(s!0+UիWKϲ/_YǏKgϞٳKws'jŴiĐ!CRrP7&n12ƥ-?~IʣֶqN7ΰٙ.+ϊ?[o}Fǫu yuH6;/753>?L5+}aZ-޳6CcBUz|+SW<^9\XhiMn\>5Y2QȬ_H1*,,Tyn 0(OZ63'o%L#F>|It^ɓ,rm\]^xPZp~;öuMqRZ8v`;:Wۈ)pIs~~~md§! F˱cNJM9sDF4iRQD qAիݺu!!!bÆ : ~ZEYtvcT1_'ݳ'On]刾7q;AV!(v[Mm~l3³r괮ue{-C5YgrE #ωS:^ޖ^61zD3S3ӰKv/޿/ҦM&W 6LLtQ6dzNuR IolyeV>`_2I1GƮcJ_jN\L.F5s 8M޵kfS`uz +7wE 2uq7_z1Y~r'333gΔF ;d͛WnhӦ:<|D0RbE2䎜uhn޼Agqy ȬDUq2mP".WŶmۤz=Ȳ?U~AA1֯E5mwϞ=)R 6Ku/r`РAU>ӦMF*#\djUպT.EK#+uƅA)?" @PUJ2tZ"EY\ҊU§)SF=}txB'''ATm PWC! 3DZM϶ˏ^Kiz%rdH.?~_5aߑ g|zH.YV]KgךQeQ,ิEU\3W3LL5wHN#kbå+++hɁDi]R@I{X]3* Rgͣ;><{"s/}x(9nyqEU6:.O-۷_ *qihmK:u]vGلΝ;/C0ٵXFTR9or]?c@Aز>I66wU}Q2`Ð:cƌĉG*Ƞմ(7%}0U3Ui?0mC;\>|њM+wbvp /׼xh:V!sd\0˾1p#(qmt`.dei2ݻw_t]tY@`| A7dV*]4m[QYzF4yCF,YUq,'2f5ce6d㳃(9֭kmo޼&k"tK[g ɓ'gϞ.d"i2W|R D̙8F*UH"mj~ez@G8:ǻpb[ti]4iiWfQnGj7mptxI9ST[O3LBli_GBg>qAE~8 DB~e|~>E󼚾q]@s]o?/jϲ WyEU_[o]Ft<~P\?3ÆKȗm-cF)نt5æM~+.M4mZ֭A]Z2k.oz<玬ho+nnǪv$}rzuv`ɔ33lߚlEJ?}~J];$(|s/t<>)vIt2~ [d$#]u`& Di#ٍqVZq)<ިQre#GʗrK(pʕ¨&:i : cOQ8. tݲضa!q\'J޻2U>KDD.Ip`5.r]ݨlAd666RX( @=\utvCq@mT]>؎Qyj  tZ[; !7S75?}yFyu'("BθLmڥy >׉7&ž,]@|/R;i׫W/iPv; UY[p Bg1lNϧ{22[ /ہA斉BRfak|GA]L~kmoذVXXi$ǔ]:t)bZw*Uh*-Tըwq8nYA덊*ۊ[tO&e0(OS5*4&NTn@*A/_$U^ٻƠI[)SDD.Cvp[| &l#(.m.DDDb=z,Ƒ&nܸq!2&U y8! "0KF-Ay[[[H;BLG?Vieiι39&[N%4c|"Uv=<ȁ-:{#b>""mb;?Ovu'mhyGM+ݴIMkxQyxx-zGaD;Ԉn 1KDg;zΎR)lw i_mDDD$2p)SgQtJDDDK AHhiߕ]..OZ0ۣlM8{B'""2 _~M$I|w[(a(=~9YZy2 cU8b(l9s+]*6a-6͖FDDDDDDD\"" 1hO] \xi@mvVlp(pO 773 ݾƁ.%.mDDDDDDDd\5ns9aB<dip}bz-A}e$hsd'N,?ebIDDDDD?5b/^0$$G"n鉹yboADDDD?#ֹse?ɧOg̘wie:G܍7׮]{3⾕U mӦͺm1%"@|D/_EΟ?_,ѣGx{ݻv\DDDDDDDgbJ,y͛7.]TCŽ:TM޾}U/fii-%""""""\""5kz\v`T> [k׬YӮE}DDDDDDD01KD jI߿%傂, DDDDDDDD\"Jƍ7 nU].E]DDDDDDDD.%XWv=zXucnnrԩr3g0SWm#"""""""p(ABM[tD&wtt|7o[E^'O;al'%l rK yÑ#G-*['"""""""pXppnCN@*UJ;wn DDDDDDDDDD\"""""""""".2.z߿/_oРٳgK4} ׯcǎ+j׮Wndȑ?~UVf^.]|3n޼/wԩׯ(WܩuֵI,g;p@.], 3Y|ܰaCˇfٳe˖uQƁ+Vti}~cǎ=~ٲe{QSοxݻv3g̘10iҤV 5jԸ}Ι7o^omnDDDDDDDDDd|.[xqo8˗/ASdΟ?3n]܇,O.3t)Ϟ=˄yyUV= nF#77|||R<~8kt͛oBvڵm&"Ou3p!sO6a۶m12.TPɓ'c\Ύuwwo2eʏ2`kL,,,Cpfffi})RU`@@@"y: <}43nE`Z6"""""""""J،. ,9w>Ȋuvv>{3f||N+V<~ҥ ܂ ^+S)S ͔)3WkժAۘٶѭ/Ǎ=z,J"ԫWo7TB!((rĉn+WoSzr"""""""""" "õw0D'O;Ǐ^ZhϞ=uU[ZCVj_ds9Ŷ>???[y0~NU20.YFF;I&b˖-yyy+-,,ÇE;v(V\z͑y,Ջ:kժ%=/jԨvEg޼yO>QK.x4Gd_Ǹ=z uuiӦME1.3b1~iҤ޽_x!ҧO>o„ bȑČ3TzMeիWGju7CW|3ecƌAYho>?Ql.)oݺWm1d:t+V0mbR N!x,d"߿/b!,,L˗e.fJ׳zjѮ]_|YfǏϞ=ٳglws6N6M 2D 8P.U(uc'w%>,N<)ڶm+}&eCBBɓ5Zoʔ)ϟ?_zU.\Xϛ7yVگ[+VLCM`)Xs2e4^wĉ pf̈́H4phݺxXj޽{%Iɒ% 6w\vԨQ[@و͙3'B72J(!eIz*|znݤ t}t೶;'Nz;wNϭҌ-x_ٹx۷oJ\8r4>hР+WNl޼Y*UJ#m4 p)\roY3d֭[mΜWEI*>|( &Ѱ޿;|t|ڄ \ԩSK#N:2MLN$ۮȔF[4dŋ6R]V$6d%:u֟p) >>>R%j"c#)U)S _^0E;lF(YYܡ<~XݻW x\VK1.1PuQ#5VAAAԩSۉZʥ4`w*UL$I/Je54.E+ERg\PA" @Pk"9-j*\g *C=Rd>}Z4nXOD͐!ֶ5x{- `.Z+IUv]kLE_2wwwFŋNMK(Ⱦ.J.-]&ݟ={۷ֶ&p)V(wΟ3{)7nhժUNƌ##EN(i W9s"W\R#S7ܽ{Wlɓ'0JHc0QeW-:_mtZ4p"@6QL ɓ'gϞ}d"i2?q(_|χڠ;a9sf.7.CǴp{۶m5@3fD x.\aZL5putvC4k,QP!)߲eKiH"M6zh/QuUմB#8[1,#×H]  Te```ˡ\W7*VF AnPOm7D 27l .]*_.pppÇt b&M*%Aw.%Jujn.Qt%p͛7MD}9{Wې Q(: QAtPVG!"""?ׯ_Wm!""\2j|tIiѣlϖ-#}pQ3((UV=Q.Q4/^ '^^n%< EUW 'Nt333 w(a(t\V~]/V>}s(bHOٳ?vȑ*n%\ ܹsw""""U1prr^^^n#;;;'& zj$}}I,ORN74s nţAyƊAO/UTȹstzҡC^~hѢ߿3I$_O>]tgtDDDD1aҦM͛7ժU;teʔ9}̙g6"""J%"""""СC *tڵkW~A][[[?}pwڨg;dȐDMm"""߾}ϖ-#wwVJlѺu6_;]^u={&''sj.}/;GE?~d?]DDD]ڠ W^355 k޼&L 5˛7>}mժĉݾxp2J*X|k`in.7o\Tv~ԘӼ5=z,qAqk]-~]h2h枳ΪK ;v񾗫-0_-@WfWnKr|aݬt4u"]tEiӆ۷;w?}L~ҥ3gT Q}T*ݻyx}ѣGL2i^}Xssi,X0pnY\*-|"_;?X$uL>bߌ#xeD.'1Dړ|vqآ_GxO+k /GQciWŜqZwXHudt^Z䫜;e1'@5-[6inJ,,,q}Ï"i o߾Mӻwy Վ":+VH?Gp v1Qbe/0ڷo/)MMMŘ1c{011 _~բ]v"((Hܾ}[_(QBIF<}e#͛'2d U\Y|]ZMJ*ix9rHAKɓ'O<'Nz /_Til>KnŊ0?䭧/WkMK罵i@ozj0(Ok9i ˠƙinG+;'neahemp'l=Uɻjur]絛$oɓ'EnĢEDӦM͛cYCD8iA8k:gںuعs.X I̙E2eֶAϋpe﯏͐=EznYCĤs aU78Zh;>,TuZ 2-&Ydq͛7wR֙0aׯ5kVc0bvCƎ!PV*9"֯_/aڴiRubݺuCkTDr]'N!!!b޽VZ+ єۮo6VuR$ǃ'm9s+,3q S z>V!Wx\vRՊ^zzX{~Sm-[ٳgGȺ3T1}UVҠhѢ… "w+U&<ӊq_A}3ΫZk^K=[oT_ٔ9SaGġͬ(! $e80|.I 2Qpe?~ׯ_ .>Y<0`lGd(݀</_.q5:2]P$KphEp$=A-ػVfa#6S"MLL~bo>%c^oUwyf%yVǏKq҉ c.FF*\"|ׯQ]I[& ?HNKi[5|bD)*;glM?KuTJhK6-*?1~'DG[ DDDDD.EZj!k֬R]ӇOC-<@V[d4y.]VK)(a/^H(A C]64M.޽W/bt2ȨS:߿?<ëOMyzJ{sS;-vmYrb&qk\;P+׫Ԁg1-cOa;~>%>꾞?ޠ9}<ʩJ&TPAs}%ڡ^lnQΫ9r})d5k׮mڴ pQE1qt2|| BSy'0/?8r)wO.=vymPP%H+xqt;?**cN%1K勸vTYk?9r4:+A-j"K: j]xQd˖M%nnnR@wٲeRGg-[VIYqxby6l(u:l"ܱc2d +hBm7d]!kWEfkۊOg~LR"n)* 5Dd~X;xZ2[}Zh3u( ѵkW1n81x`aaa!ڶm+emܸQ tbZ\:0sݻw 0.T!*X#84ZẰHA\z9|:/^ۅ#\Į +.+mJJOs^}LL4LXM FE:CD*sx}y ӉSko㌈'D'PP.ʔ)]7Ŏ\@f$:ɘ1ak׮5pqv-ݨQ ,(QB9sF8;w̙޽{l]s+DDDD '''fP<~~~"kRˠOw{(~ٷ4/ 2s nų焉” o:S}ݟu n?p DDDDDDDDDD\""""""""""eto߾g˖푻{RJyyxx hݺ?nԯ_WǎWԮ]{ol><)S4hEp{^.]G[(va 3w[(1.AAA^J͛oPyӧVZO8ϟ+00*C /koBVTXŊ˗Sʵo~s֭ &&&?[_^6l2[hKWw[2f|ѢE2ezEDDDDDqKKK.]:"DڴiW̝;W̟?_P&tEڊ3gԆ[U͛"UTD}|}}ߏ={\ $5k&6m.t}[̐S* niBv>}9݁+>^ck1_5 ;@S4kb]ʏ4G { K,,BY>]oC;6MytX>70 u[rB F%8 X, Wz)usb"&U+|0=?H|( mtS3San/c7qIѭ[7h"8  '0(CPߑZ=uVQ^=v SNx(FE:uD*Uߵɵstj"L~V8Tas&N/P[1m弼fyt'Uɺ qiσ˦T׾Z}n"8dwcM;yg+L{yjZcS(E-̺e|`BMpeo9qfaq%X!Ȇgrn3\]CMϝ>wN>羏؏ƞ={6Ρq_===jM[3gΔ.W)x^dIה)S~DC+q}űOfu1x3DDK0\huoI5ɒ%7o޼{ m~ĬY0bvC!V*9"֯_/aڴiRubݺŊL*ŎNkĉ"$$DݻWԪU+|z޼yY_uۍ2pN_R^J[a?fwLS;n_t֟^֋v< ]*ڹZKn[|_-财U]cK ľGDU5Z/wխ7b˯ǜİ#}fY-Ӻh:nw^"9C-5\%~$y'[lgώkh%K N02DaÆ2$_޽Ju⠱ϴ ΚC+/xrޖoݫ^IgEjm4=,ZLO,:fߵGckϟa&.O ` u̙ҥKJ2[ϩا-G_ܟ1_=I= ӓ&ML2eݱcGI& G%XEX`l*mA鷃VW9p!5^d"Xy{<؟~ݻ}۾}{#d"JK+Uc2t)BS Nsޔ)S&2w>b H-[G5ڎ~Uzk/^Ȁ;96Wq]_V4{E/.\P$>!+_ ҅I$*/( D}>ZJ#Fc=͚5ی 5'/^,3: .@3>knf% ѩƍ[=v(1E5xuSӶ ~uݠ8Ǐgmy"2\ &K.4h! ؑq.*+ㇸ~Wmhe;"Cd#`|r)UyMƪC"ȰEEpZ%ϛp2NU\3[T<モRb ;탯QtoD%gl?; XDG RU\?R]ӇOC}D@md4yJ1(ES0P^ϋRBT@uuQk4]qkݥk!+ e-ab.B9ed*M2[PϾv޴'+V<!r DFjժUïV! AF-GEX`1NhARdhDGե+Os':2(\"e\G^s5per.\ M:Ӱ2`.j&rϟKԦtZQM92_֭,.Z7>n~ nϟdjbs`ڎrM'* +"?pQE1)$  aIZ{ lR=8nU; u_}8:~gC4u:#/_۫|)?<Ƿ/e"ϫԦϙ3[W 2:3Qwy"mA\j* d!/ue2yZYeǏֆ 3E@e b ciLW2}%*" l帴`"OC]|nȌn]Kl(sqqS;NuۂZۥ \wT?wǴ6p)V@"퍺VR8e[ay5kF>ND"б|@)#F.]TmAIŋK)pUG~*Λ!mKBB,'m,;Y8=\7:_1GX.>.%O.=vymP8s4BNQy15[mR Q.ۡo J)PP].Y5mU"c05M Q%,G҆3>Gp☂"k< 'ruYؖI/_$IjQEsƍE]fy꺞?$Jyh.Zvt.9Wu' 2e,ep1KR(V犬ڵk9R} n]R ϗYXLP?ŋ"[l8++e*v]le˖Yv)7/^,=/*~ 3ݱcԹ &tvcjn;ym>Y@I1A!fc7kOKfk[V)L.J*&}U;0c %sDz}kuvxêu|ҩAˉ~|8#;ڥHWYXjޙEZ9C˦ܼCl>5< s_8D('u]DE}n{):C-W\zz Q'<\:.Lh $Qu,(`[&M*O:tX Q~e㟙(,\\@54ȝnv8qJõQFԩr5YӤI6NT!,X2RQ^e@Pv{/:CP/ԍEmemeǏE%Jc`X]vkŌlfy9t wtЇQKPwX2lmAf/j24j8q֭庣"׶=OD\@.:.˘1ak׮5pq`j *v8 ,(QB(~̥U9sfodrfȄE`s̑:QCڃYTPxlJ'(vpI;wMˁc6>}:.n N4>9ҽZۧκs݋njΝ_5dE+%}dN^o*l1A3`gmLZOBTgh5dވKg%bvdy*GƑmBhrhچӘO>Dv1i~.J=D7 QcB""""ҵ;w6uuJ+mkEo\)n\]]Wcw;H;%"""""W)ܦO%.w{(aa(?~L[N """}`(pkeeQ.b@1KDDDDDDDDDd%"""""""""2P 1 \Ν&&&n/A njw;H?^~!zgtw3(Y/tA w(~1kN:UNm """""""""a@1KDDDDDDDDDd%"""""""""2P (p DDDDDDDDDD\""""""""""[lY=z (177YpaΝ;/w[Hw3bW-Q„Ͼ;\""""""?'''fP<~~~'PJΝw3(0KDDDDDDDDDd%"""""""""2P ( ~>[l[*UãfppE֭w۠~:v츢v{c[644Ԭ]vk(שS=z,tuu]m%"""""""""ft\k,_z4y0мyӧVZO8ϟ+00*C /c{BVTXŊ˗Sʵo~s֭ &&&?[_^6l2[hKWw[Bsb%J׌pSH$SΝ;/s2Yݻ{0`>ZpEn…ԪUkwεk b@͞=ԩSK&[Νsn}=zX[7nm޽]:::yi渮 F}A˗w֭bs---l\9r<\|ݻ15kҥ}B w޼y˗/2IL ^^^\\\#(ӲeO>]C+qU5!""""""""?ps`ڴi ,)߽{7<^lYO  |}*y"H۳g4dիb[<%2xnn:AZfpuu0FʕKmV(^+d 8ooo1rH~|%KcNJRJ/ӱcGrXOʔ)EҥСCEţlShhXpԶĉD햖"]tEiӆ۷;w?~Q&t"lmm̙3UjCT*4}?"00P޽[7oW^IgwF-2eʤzbQ$-A`m۶k߾}w&MCbŊϟѣG@sǎ+V _6R}RT3F8;;Kлw W^-ڵk'۷EE%D4iӧOh_O>b޼y"C Rr:7m$+U6r!mǏ/'O.-"di*pI}>>>C 4Hʎ8p`2UqCT^~RFMDDDDDDD j*׫YJumӧ5Gd5F&Ou庤"xyt2UhD]L8TREt]ԫ_:EdT*CSru!mGt=_UF\dB :Ǘ.]BDDDDDDD.Í^( He QW42yQ&EMRUU"s)pڴFPU98)<Ǟ={"LCnݺXbRYZ7>TvUT}?k YȨqڵkE6m>"""""""X!ppp2NQZj;YfCf͚IR4:sttwY1BtRn%/.ufUnR C {G"~Q KtQ8444ރDDDDDDD00K勸vTYk9Rl޼Y u.MG` 1tOxȖ-(X(Q"&t-[&ut`hٲeW/aÆRS0E};v!CHˠ&tvCֵkW1n81x`aaa!ڶm+enܸQ tbZ\:)p])=J2 rPt1cF)v׮]j"0w-Q ,(QB9sF8;;|3g{uXS3d¢C9sHN)20Ns;v@L5pѦӧOe ^Sdڢ4ŴiİaäΣpFM.e A͛kh""""""""% AM B\rɄi:p zTD6!5UlIWj{|tQ:MU1ai """"""" QS,eVG!"""""""".pɨi!JDDDD/^dmt^-DDD0KDDDDD ^J9sw{(a(7nl!7id>BDDD DDDDDDQɤIc\…MDDD0KDDDDDCNy#gΜ9@!""\"""""H6olڴi1>jԨqg&"""J%"""""R2}Amۮ;vh}.p( 3Em.]a6lFDDD F&׹s焉Cz}¦wƍ%g֨Qƍ[$M􋞛EDDD1;uTY}O6qADDDDDDDD"""2T (p DDDDDDDDDD\"""""""""".b@}UVׯ[ """""ݙ7o^^zw;pTFuwwoA """""""""6%"""""""""2P (p DDDDDDDDDD\"""""""""".b׈+Wg>}⏥epP`ADe˖1kĂx'''P<~~~"kRˠOw{(~ٷ4/ Ȓ)y' UJORJ;w\Յ+Vt"""J%"""""~g˖r3dٳg'N]m#""(ءjРN%O4} ׯcǎ+j׮W7nm0Un[HDDDDD1I*OfN.+5k8ydy}& z{{8p7o<ݻ;uʕ+wjݺum%K8PK.KLfbb3_|77lÇ{`ٲekԨqJŴ>[[[cǎ?~HvթS_[liZ^ݧN*cen%8`YgO>]fСSp!GWZ05ڎYǏgn}߼yMЮ]D}in.uP Æ $]DDD]%_$gǺJ2Gyr5&!}33` Ǵ>ǭU`@@@"yiN"""""/\O>n%,FE  ;wnd:;;=|pՌ3>_|y+tRB ]Efn)S)SfʔjڇmLσlF=I&[qVB fΜ9JBQoKHP0ۿ DDDߌ. ޽{y^~In`ifRs)NMn+@{9XӣgBߥZ,f9Jz0SMl{O5ޢlqY:pa 'J绹q@mq]oii)ҥK'MM6|^߾}ܹs eK.]9sJm곥 MT:]ܼySzJ>wѣEL4Zզz:>)9Wuz:)?Ϋy6z40w\k݋6AoV߸S fʙk|VYҰ-1]@MY*yQaaQ2{ކ]K ɦMD-b\fĈbӤI#޽{'xBO>|ބ }0` 3vkÇ"G.xbѵkW\HȚ5P ?""""m3(<~֭l!СXb4gqQ)̱cDŊų/0ڷo/)MMMŘ1c{01իEvDPP}߿(QtS_O>b޼y"C Rr:q@QJ4F<A'=ɓ'O<'Nz^|uv}Hۋga[O3w_֢ś{kӀ&[YvaPfrAA[G373 f܏VvO,mNzܓw.^YU_ M5Ho߾'OnݺEM͛7>l0(CP`PLU[n;w ^|5ɜ9(S6CZo{l>}[]>}5jm[xoM\3V =aPVg}337ڹr&gAmO =`oI_>~|m8PiFc_Sr̪%hWصkY>N@P6$$DLI=][y<5&Q>>C 4Hʎ8J5jq.)#ǏNm}+u˥ SG7d  5N$w}':ȾE{*y4lĆ1tZ܃71*;W)z ׽ 2rn+̟Cy&ibz~&2{KU)v'ҤOU`Ⱦ|"eࢌ(}| Y&""""24 RU\f*յUcuLi22\\ASOQ@y=(A CvrFjj2UTݻw. U:(s:eٺn>޴1?7rm<Ж%/{kNYbڀzgGo<^qֿ^u>i /ѽq *g+_ LPTҥK~W?ؗLRnLIS$_ulrm<&d6uTSgMScYEݻ܅rk^3W)eҤ݆YQ#SdL\pI/kF$J2a@f< (kW &%j)pXy8BmZ@vPN98)<Ǟ={"LCnݺXbRYZ//>ߔkDI i2rñJ&&?mo9Y~̦+v)zU ZNv|RLSBƥ]Vi&N3D5pc?^>mugS_vٻ7A.Pixn}kF+ZyG5P """"C. HXŇޢq: Zj;YfCf͚IR4::w,eҥKuqJT(^ԙrWUj!p)߾W~[HG[f>od àewޕ|ThؾSה_0jqUs Z-])?m;.M:5dHeykӶb:iw^:'|e#;M:_.Ϋ[BaU~TWvc1_P))O̾U`|Zl) )R3 h/S֖WwDDDD;p)嚑'cƌR-.Ṱ[FPD qeΜYݻWcN͐ ̙#u:t@2s`P:Rϟ_̝;Wtˁc6y.n(HDDDD p脅n߾СC<~8}М9sZ---ve&MEM$""""9p cUVGyUT9 DDDD7^^^Pӳ\r?~ƍo311DDDDo^|ٕ+Wv 5'N{Ϟ=Mg DDDD3AAAk֬iN>| OGVm&MN4ix곍DDDDD\#V\k""?vvvחɉd~iu&cRlYSNw;(0kĂޘP?N͡xȚ2_-' L!O`j2׊ o:S} ͋Oxi?W>ُJm)ע9sD!zlћZn /pH-A?-OoYVȪeZMLM\v'OHDDDD`buԁ\{UQ {Y#ي~%"""߼{rٕWym߫Yi fajQBaCU߿/_oРٳgK4} ׯcǎ+j׮7eyǼyz~~~Yf733 ~|b}tҞ  jfnZWkt~.y*?}(!)\WI>~7#"1wθyf޽SN˯_^\r֭[&Yd15t4,,̴f͚&&&?aÆaٳe˖uƎ+:ƴ>[[[cǎ?~HxxxDԩ/{z0`3f n[І>}ŀÆ v,^.^;""""ϰ0U>~Ly^=p}D ]Ŋ#{bժU;2J*ݻv\סZJ#n,mڴY6ٷo9sXDp]xZ-_IMql?u }"8{2CٳL+δag%mԨvdϟr?~8kt͛oB?nnnř0u2p!cǎI FDDDo_Nw*/zfQ,MU|[T L8ҥK9qDLSi9X-gϏ/M5PB'O,q9;ݽ򗖃U.677-|Appt`LK"nMMMٱ.!Nֽ{r8"""|csΧ6.v Ld\Y;mm$@m$2r 'n 5k%I䫥ep&L[.ݹs'OLE5a\< DWRnҬY͛6mj<70 .r~8ntE5? 6qʕ… *OG ǦHuuu֬Ycڂ z"x۵k%W^X0O"c%K'EB7PwVω%J\(<q Kʉ'c ]5*8v͛ajytUB;wl@܏?㽠qr@ɓ'Y`߶me͕+=dLmoKt 4<\ezرJX&>}'`?FW9;94<>lѢFMۤT>A1|Ib~Bv]{!<ę֨`={b JS% [:QJ|^U; _fpuu0;m۶gϞNqbȑxpIP(Q!J*;+WzQti1tPˣlShhXp6kXO)^sanČ3m@?z3Ǐ}zz3vCbƛMmaf*#GW _],oݴ1K ;pl?c/~ _7[!{O5ޢlĝWYDXXZ:8\֧R::ۜNѤs ʏۻ~'oZuUiCN . #.q̵Lor}+}E?UiXژ.qi|[i>}LwH.pqqH6m}AKߗ.]Ł9sJmUݼy4naa!RJ%J(!ڷol^PS 3G|I4k oq^^?߹>v.Ts~t:xnG2.]>]oC;6M}r*vDq9Ȑ!t_rewi8HFRJm#+GRvRp!yɓ'ĉDžKO"<A/_~]ltK~ׅ[ՔUnPL%bEYhkT܏VvO,m 5+sHmw˧fVm+vҠ⭉knUg}'8AyZjX9>\;7K/Wa"~&IWn_h߆vit>5E4v©m^hӿ{Vo߾'OnݺEMJUf!`ںu+jڿk.K0uT1xpb ^ԩSGTRE]o?CCMN[ ӭlnB=ll>Atj"L~V8Tas&N/P[1m%s5YoIUn+w\obj)浯!cv۽#xXtN* ^޹X,mQgysD!.~#X"(nduN8Ayвiq8S3sNP2s̊ȧ4.QW>t@L]lׯi_GL)%*#iⷅq#YO^ Z"WhlٲE̞=;B&An,Y* 88d銋 52\x膀/-v)ԿU)g6|y*ɂ.։?&s:kuz:rz9o˷UXK UF-]MBNwLTڣkϟa&.O #esrmdlx".痧#(kk Aը*wz%F9}KtΔ:]):i!@CU+PuGp+4hr \d"[ETTz #Gi.WF OؖW-(kJ+"3+ǔ̙raqy 6ԉ<KnDת|?%".EG}4GdF&Or]M}7m7ah>`_2I1'Mձ˵U@R}mY}:Ԙ<ߐV#1uϟ?otQ^u!QNш#H6HB:gl]Q<$(ȼ؞G剴YȞD SjdNmڵNGD%U^q[ĈX!7H@8e艻Zj;YfCD؍`) ԝ;wp`tRn%/.ufUnVuT}_KjCB,'m,;Y8#] mҔIWֹf?ew]0Gl\J(ܺt'?s6[4ϫݛ$HR r9}OPN9g Cv-ywrR ]:jfٳVy D~ w^#s9U=cptQ=v76u'\B-.iAbڴiN&% A;"31KT{\UI ?9r8:Aj"kϟ/~ŋElDD 777)l23C˖-+]6,޸BG0x^?̝;az;v:WЄn,CC^<'ϸ'H4U#X6($l}ail#\~#*ECEID~Lwq5Z\,VKk&&mG<jbjв=7/-1O#12FIΐzpFn㨁r \t\1cF)v׮]j֭[R D" %JgΜzVE̙^ʝ!͙3Gl%2NsΕ:|9pL5pѦӧBm7Moijnf`{^`gE|L5pKsRURӈ/;'s*KMz`DނU "ȋz3]j= ]RL8럹J/LT"Glo'bzP[L羜mt޼d[ɠ YܠZ-k\g_v;u8>KOZjw*2mQfڴibذatC]F{4i"Gq/֭+t&gpB&~W+?:~SH3?}x3;{nZZ28(H mB>- ۷o2q>Q[ž^Çg̘DDDD>pɨq2___akkџy"`{q *C谍o=Z[nm۷oߦqtt|ΐ֭[צw<<<&Zj厎LOf=zXtdYf}ܥKx<2Nkk?<ċ/2|%)6 KuA^ZH/n#GM6ҭ[I$nە]lYg#~eB ]]pasA7nG:*SiGGSgwpҤI͛;gΜw]/C /m5j8x`u牼]>|p@MUM^o""31KFM y 8!!!!g^rI$c (>7nƫW~^z?^ϋ5kgƍ[{.iS|O(P;wc3gJ;88|*չse}jN?~$+9puV4x[N[_~WXTd.oٲի]yYU^xq?̒%˓߿'Fu7o[n-"[~]f;;;ߕ+Wvw^.2T1dWuG!?%HU :>C80eyg|:"җ;w6@*MYKwq><`EAE9:"cWVݻws! aÆ?" h봸yEWv#kzM5yYUY???}ժY˞=CĽvZP 9GekW_ /]  i} O*OG?E>ϟFT\++@y>nZ"?.K#"]ga݁zvqvz6v}v"p .첻|?aggggMv}&Qs,ʕ+qXtrH:t9r4%L3g'D.\PNgj\гev`Q^Aĉg͚Żw2 |ML{PzaĈ31+@"ǫ\A#TF r^V]%1ijȯ+""?DDD ///1}tl kE(%,Z//欅EXٲe/F}F׬Q1Mێ5pQv÷TRW-[Pq{G (c"DDDdݻ'Ǝ+o.ot'''1|p1h ?c ԇ03De.1) n&3fĤ X1i .|{޼yչm^z-$GI{6D j&/{PNG2S#"" d ҃ǟC-MMv~{޲\JZiҤNٯ???i2LŷO-vvS~o(upʕRh05b]t{E|R.HD:úw; jbw;?#-ODD+?~t9^ۅG5}߾} ctcN֭g$"""""2t pH0 y zUf U4k֬Q<88Z^niiڹs5H&}ur""""""fڵ4iõiG^j֬yauݶȰ1%""Dzˏ9RkҤILy___ב#G8}terual;!cKDDD?*^;e?~bq+/ 6lC|ҵȸ0%"""͛7o!C檲n:uyyyϗ/](`KDDDj 7X .Se}=[""""""0%"""ܹsRJ] VzϟwC(#u6"""""\3gw;(ڊ@-;sJ*=Qr׈I=\]]ѫI͡$dgg'8|S&777+yn%L2EFMS?&?Bm!"""""J p \""""""""""@e{C ŋM69o޼.hҤɮݻhР>U߶m[˱cNC{ϝ;wiIDDDDDDDDDK.6l[n}ݻw c͛7U\u:M.;x`^z-4uww111^H[7nÇypٲe=֭{pŊ۞mĉO=E8{يF ׯ3aVZG6o|z-Z/???Ǐk{8ߦMh׮]c*B߿rmCoB# pjժ'O:UrXooҥ >}r 0ssp⼙YDXX۞NB( Wɓ8Ex`ZoDDDDDDDDD] .`[|?9R+{ϖ/_ޣZj'\R:z/^FŊN>}T9"\_~zƵ7~(иqݨ_ P˩Sz\[PPM:u.Exb}YB>qD5e׻~˞={WmڵZkr.ȗ%@[y0޿?*20.YFt%2Q@ѩS'ѯ_?Nz.]cǎ'.Snnnt]\2<< *QF!,Wڦh"mQH:5i{Q07Ob}@+ԩ#=~N߾}… IA}z͊,Yz 9s $,X ׋"իW/akk+̙R=Թ֭[˗Nj9rh]CyfѶmRJ%o=D͚5c\޾}+?\d͚5)SH0tP}{M_M<|P˗//^,~nH ?Eo߾]Xm1dݺu+V?}$;&a?.U/.Z`uU )MMMń DݻjW;wFcq1dQlY)y QD;p@)e&x5j_~0 a5-8m'O,}'Oq/^Pil>(/_SN޽{]jJlٲE!ä.0꼞Um6sN).^$gΜbŊ̙3Z۷o{֭[e׮]...mQ2b\R_ڴiE-ׯŀ^rto,Ν}.3f~.zq"AVV-qQa)3gJhĺu뢯^2d+WN:u׏^^paiBOMfoo/6l(EVw͋PzVGIQRŋEٳgcBON7n,v}~сqĞ={4.z1GE%y/ym0CDDDDDD/ p)N~~~G h;vذb9ԭ[a\,͛7y9Z (݀^/_.Nn(N8!aA\gUzzJ}H .G"9U,AۮqwpAU\&P2jժR+WZIs9՘Fi }}%&/5Cer8Lޡ!&/:AAAb޽R"X{6-G#Bj Po5KBLgϞ_.]TwNڂ eʔ3S pUBHH\ൣo_PjpDDDn\ҤI#޾}+GENiK(18}YܸqC^ 4Ǝ+l" `u P#B /_yYFUe˖I! T z&ŋm֬4z>!F) u /"&M$F!,,,DN^6mN,Kq:߽{W Q:ѣGRI_ӧOr4Irh޼^BA zWXQk뫻m""""""R.ŠX3=eϞ]aw5pݾ}[BٲeŹsDU9s}Iuq]yP3ŀ`ϗ@Sh Sgʠz`6pP:R-ZT,X@:˶2}ԩ*znp XϞ=aw;݄('Ny++?EDDDRJ*Yre-[n w{d p(ūQ1}HDDDDDDDDDD.bKDDDDDDDDDd(DDDDDDDDDD{oذADDDDD9^nQR3ۻ=&}Hی>%"""""""""J(DDDDDDDDDD.bKDDDDDDDDDd(DDDDDDDDDD[lYϾ}. HDDDDɚyEs.qƟϟ?֫WE """?#z! oR++ }({o. p߿…03F1b.nH WWWqy}7 ,C3Me1|LNp3HSjY ~ %OϿ[N]&ɓǎ7nȑ#g ̽w^TR}mŇ.;v2(͛ϳeΜճgϲmDDD21%"""""R!Cwm~١VZG|}}]."""Jy׮]Mԩs… 弼Gw(1õ 2ŋY6ms޼yK&M޽ Se-Zl߱cGsc[WWW_ݶTQv;ޘ1cw33}R p/]TfذaoݺU$ew-أG7o,Vr֭6mOuQ*22{"Enmܸׯe˖[+Vto{'Njذ^\oݍq:t9gپ}{ Ɩ+"""""JpmH&"""JY.-S%OOUT9=]q8jTua=BWXٳg+5jӧOs2_΄yԳBۼy[hѿ?~;|6m6#]vm'}nn\"""""2\oaaȑ#QR3VzԩSU0/n.]:ӧ/1ssp<—3Ƿ='''?ZYY[MMM#j~~Ƚ|=sO<ȧQct.J ,\߂ Wl/ٳg|ժU;qʕR...3x7*Vxvr*~EGhm\ۋzǏزem7ލ: P@99s żyɓ'9~`H'e"""Jy.Exb}YB>qD5e׻~ jVW-#XjUr]/uKh{_PJ|z&&5kֈ.]yy˖-֭[c,;V B9rDT"uݻw+WT]sss7۬_8v8p@ԭ[7OOO1p@eɒExBz_ǻ} Fuۓʇ/A6:3{,Ϟ.?^u}}].դWҗm-C*m[E>VB9wY>$f{{ɾK_.u"6 m=6 Ņ D٥  ,^^^_~1֕?_z%lmmŜ9sTjC4{-K7ʫbzxOk]7Ǫ"#"M]6r}ͺ6v 1&:t(#>pDDDDd.jo.϶nݺI#FYfcNJɓ'Kޖ/_^ʕKܿ_ b!22R)Re.zYzܹsϟ?ܹs&M'NHׁObP7 }9s9r$z?KKn|tv}h!s(OI;aޣ373Tu{:>Iq|  6n:Jțρo+x<|ѫ%G5x6lw/ a7g({>|XԩSG *={4)BWֶ:؞={&@?xqKgNe;b/g@ӡZ0aL˪f=[P~'&޿˵s7rvۈNME}}nmog5kjuDDDDDb\\``t6meUƍsrĉUVb1Dٲe1/_^޻wo.6nܨիW)gmu EAfk̎vn2jtdӊg,÷Ucñܦ3 ޽3gwTL?ܽ{WAkJW.oJ.S:)BoG@DDDDd R (uBVpm4Enݺ6"""G-nv/!Ƞx{ڄ>>>ҡ2f(Z2 6TK"-9._?<"ҴOw 5}ik%\Rw.ym=wfθr~e_ts*ۼ:%R"N}~h޼A5|(_>ƣvpqqQzӧOO?Y]={=!sGGVkT厡pM\&/hٕK'z\.M MuɁsA!cLZj)]..h3HR 6T+kv-B;ź9r!߿K)}\r2MXZZJeb߾}RۺukptI좯j ]]^~bol[Edq p/d[C$Ѵ9yوϢz,˛c?oٲesz[MaR_~uе|{{940H)]@ڮ x&c W̚; 'ON Ap[N}Zior^mcLJ($3HR0 ”:ujѴiS,P-\A(j*ztZbEJ PwժU+V(={hѢUڡBD0`4\:yۤl{RQVW+ ..D<\mǯ3m?'ן]\}̝9*){O/LC.uy{ae˖!C<QVWK+8YZ[&[g;W)}=ߺ ApvvU髹s\>DDDDdR3vw0-[ĤIDc b6gҨ(iBy@!0]@)-SS7hH*Fg%W8ϻϥxΤ ?xWzKrVlϥ{c5L뺊=pDs~q؟gÀMq:lQkGb ߿,ƅ\᧶k]UK;t>*wt\jW78xez%{!bK1( ?4E/S,/ɓ'E*U3fHtL"r)'!XԩfwP;5㸠Eb,n tvC֦b[|M=pŁz*j\庮q(P:OW[hT ?;wYv}f h a|fiF^;yw={'U?믿SJwiҤaM6IGJRy[>|N=gĂzGv?`r ջTYvhѪ ^[{֒+~Mׯݏwwg4ڳnIe kϜ#'MڜgG{WwDDDD0$N;R.CBB\5(:ʠlAl666R Æ &U=qt&Hݞ]ml3M%nMmR&li߿4+00PG3U&LɝS u{&uoZ{+j׿M{0is˜?Zߦ1;b}uMDDDD cKDDDDDDDDDdQA\PVG!"""""""".dx%g p \""""""""""@1%"""""""""2P p \""""""""""׈YXXW9?Z60A {?e233黧-˥}{PzDDDDD4իw`͚5l?^f͚G&"""J9./ .`[|?9R+{ϖ/_ޣZj'\R:z/^ȑ)Ghm\ۋzǏزem7ލ:P@o%J\|F۵kW """""178̚5k8\"""JJFࢇ<1žPB8q!,ݳgO#]UVu-Wr___WyyR$G{ե5kֈ.]yy˖-֭[c,;V B9rDT"uݻw+WT]sss}v1cǎSzu&x),Y/^H>|@xշo_pnj;g{-~M \_ѷnS_l2t9"mWWwg:{ρ֌&HϠyPjϿ?$wWkmw:jF((O0B8dJ}!bm(ZO|$FLU=wV^{z.@]m4;͗\oƭ"u͛E۶m]_'O>,޾}+?\d͚5)ScJCgVTVNRnH~tR΂ D>}4vl ayw-04g6/)kʾqVOn^/ ;ifn)Yɻ'MoQ::&_ۘXА/ЍgXXZ~E߄(k|kꉧS٥ 3'W屨تf#f.?7!ʠAc@m۶D ]&:z`?*['{up|ۿ}ߺKN.ޗAi=<'ځJwMu/e˖.ܹn*a(;%O|}6 p5۷ -[nbŊ11B̚5Kwޖ/_^ʕKD}Yv!22R)RDqEYz^_bYΝ[4i$ӧOE޼y֋[A֦3g#GaÆIKn|tvcux-~#?q\5ƭ߅^6;JdY<_1dnҷGo>"mR]+sGլJNbّ*GFUܾ:[ZϽy|~XYqdM9Iq٨JDŽ~ }$~Pʄ1nmn*V +H@/_.(e8Νlkm$%rʓ&M29kB-Zlϣ#sTR}gȸ4oiF/C&7n\tx .'N(Zj%ϟ#A-[V:tH|2z9vlܸQ'WSڦjEr3y38SiҖSU~`zxӑM+0Gb jl6&M*QObҲ'מU C`9D<ϣ'1&ٗRӅ*W#mem쿏輨7lSNU곲~ |#qc%کD*mF>p Gv$gWl-u'K#yJ1415^kGunyz LA41tFwiYeKU{h,q̡{>jɒ%F}zWNC-,p9[lqȓ'ϣ\=zo/Yrnݺѫ<+^W\2% ~^/Uφ !EixNϟ?x9z<2U^xD{{/n;442u_+TpɓU5i?^3x~l~P݊P9A{w*ZHjcAIGQQݶi&"`K1ArYczm4eq)B#nv/?stO7ꋍ Sƌuְa 3z)XAm7VdR^f}ˏ_MeIuK}IsZ}Z*s>)?ݺKG[.]B=ܻgnmK'zze?XŮkll KPW)TQ}fv>q"'ҖM6E}SEp;t~ݺuqmXlًrH@j.4qrF{ԅqqՈ`Ԛlr۷ooSe=<<?~:IlAڧ;?KU} |L>w@2[[@xicGhsJ~ڕ1cLS\CӦMwFG_F9sWAAA6rsуVl`\@J5rBj*]g1BUVE/X3ٳE ; ;QQsP[P7ꟸ4\ۤl1UfCrL lhW;siJ?g(5pbjfT]O[2*}qukBobǻ337~6 r ܄pRʎj!$BJ?V~t\jKhy { >rYs?Ly }LQSV6.O 5k<*vp ymB3f\n ={\Zo1@3zע6o\ϐ!ﳤ&{6sESNU>|jZ2"Oumcn[JzΞ={ZX1uT_3  `B <7e.kT׮:b>SRE爈 UoPPTGPӯ_? (&M$ڷoc3tBD}ْF%GIp{v-\P(P@ {˔)#M*wޕNkt}}Pai;TKe2a6ԭt[+e{.+MmxqfZWSd,ce]|*J5.}J/ȜgẺ5sݷR=ܭ{Dbsy Qj>8X;`[Oo,l4 1& )rQ;Zї짟~J)?aP3R])7ܱ]5rͮNǷ~V=/^?GCgT) fVM'Ҫ+ԾE6aJۓ\WǡXæDa^ =!q 3z*[O>;vF^"|Gx/Y|@ޥܾ6 6m;;W6zQvŊ4lpeX&Bz#Eo\bZGqviHl ۮO[jkRo˘̝;WH?,M,YRt쨕#52x`i GJ6д~L>pt S޾!ઓ ]0S~^o㵺 \.ϰ44\q뙙[D]M{r_ECGw5!&SO<.MBuD"AOA]8?m!iܸn˵rՅ0VZGb/|wȇ+ax8(v]VYAd-OB9s E\e%0P Oa5pH~e(r q =Ì8l?c8?ԡk W\`= @4җ]? WWW_y0M1R8Lx?~-Uwy(u"۶mkv"UD? pI T2$$$PSW Ć:uaذaҤ Uw^m7d؎IEXXg oؒ3;Rd)ڽH޷Qyc/bŊIG]lܸw7o_J&~3fKW𣙽Tm$UmOLY[89C*n?0]:<1ey5-(%@osU޽{&E5J({yFwQco(Tue :t&usyip < Uw`_}gg7q>`\׀+WIH4Lv* QիwϟA]1iM#k"DD$J6*&M(ݤ4+KLZ<,>6iR#kK.MɶR4i"޷ {jے%KI4J',ѻQYU2" 5PAkҤICI&Pɓ'9 QA\PVG!"""@i0i}4wJ%j.\_v62\W\)աCwؗatmnѣҥK_G(aKDD)ΪUb;v;޽K`>|,ySSH77-[ֺu-ozҧRJ]sOy4[lixׯ_wYlYOL 6۳ge5k/:u M{@I qclwކ(,kqƻl p$gΜOo.`nƍ??x ^L899 )J3$m)6oL򲐐={4ḆC].Uvnf너(cKDDc iB襻nݺ^~IY-[M6݉B 3yC)B]$_W~.^+i=\"""=)UL ,(/0;BM6}y6OOO?AצM , DUB&M첰O뉈(1wQxx8G"Ν;?M8q<&} OddiPءwE*HDDD03bW(eI&w3YyF "=ި]QJ/puuϟw3( ى@>)" @͡$)SHӄ?~۶mD:fffZjCI&^M׊9sb.3~i.22R?~G]v+*UJSo^衕?-_x>Q/ADDDɐر4)zرcѣҤZԬYSlR4o\N:)N:fjj*=dC+W^zILu۵k~B KDDDDDqcKDDd͚U 8P?bϞ=bݺuիR]L:u^A4lP v֭+,,,wQޯ_?啨mQ( u.Ν;'֯_/M?tT:;&z֞={V+VLk(9aKDDD"W\J۷oKu7l >|)rrrRoիKa*M&.\P,ZH,_\tM;wDTXQ.]A.zz{{mV g2x``/.ʗ//ݝ"""""2BF>|!Cx"kӦMwΛ7og} 4i{+4hOv[;vҵo{ܹCv|#uN"""U.\X&L ۣ]L_VfϞ]ݼySݻ7=E8X1jaӧOs2_΄ZjAۼy[hѿ?~;|6m6#]vm}nn\ș3 mؾ}{ ?jDDDgff4 Gݝ;wJa^B^z%r-E=uT 'ôjժe蝋 ʕ%KO@zDDDD] UV=3WrXooҥ >}r 0ssp|gDXX4*K|srréUHԎs}Wׯm|޶qm/?~"J"DhFJ(ZN:cʕ݂lԩsH.@DD|RVѾ}DҥEHHZ?a:tTCY(فںMDDDD] B }ĉjʮwu={4Bڵk^jUr]/uKh{|ѶI5m %TPA*SŖ3gn͛E۶m]_'O>۷oϟYF_(E`9{lԩ# wիWS8H]ѧO_7uyF-d SЍ%.qIN/"|gq>}4vl ayf) """])o߾]Xm1dݺu*E#Ff͒vH˗cUSH;L6+++H17nH;~Lsd8t.ŀ!c5!qoߖNZ,%ROѣGK-ۮ]q:}z12kC[ 2^8Jkezlj^#յY EYcd}|4hUIBDDDD.Šxȹbѳn#k.b$je S;riR*?AۺukPmuT-bxx,ݥ[BiTy=lbEOSns)1.  }]gbA5TG'>j㵎^(b?񱱱DsODDDD℞3 Sԩ:g=TmBQ WU.b4V^l3ٳE2|NBTmC;`i)IUIjxC5" Z[[k]{Zb-2dp%uM: 133Si{ڮߜ:F ?J%?蠌12>>3%Y>tpY—~ԴD#.qe1i$Ѿ}Ƀ åzy(i0H݂L2ROݤC!UT]_m7y@sE@aBIOKަx1X*R*cy] 'T!m۶ ˒/EK&{u6l VA,A]Ce}\PVGi jFDDDDƅ.Šf(`g?zz)EpɓJ* ތ3z9gΜ!Np(oƲpx#FFGxbtEPXnڴi#޿/fV6p z\+N ՁCi1 ܹsGIu6m$=d bQln̝;WA?jbdɒcǎI޶/JGʠjb KHak֬իTRreϽl{ik+ GV}[я! ːC R2([j!`έ8Bw|PWݝ]=)ir1Z}2g̘1Ą(1%"""""իW۶m k>ܭ[nL p<~8wB7ϒ%={4w(bKDDDDDm߾}-['.\7EmDDDr15n+LLL>)[`` )ogg'R?Ot2!ĉcnW^ݥSNku}DDDD akĺt˗BI<|ѢE}{Lm!"J*qGOպ~Ro;v.s̯tu;DDDDΏCpR#"]iذ^LnQl p \""""""""""@1%"""""""""2P p \""""""""""@}۾}{ 6w;Hw<==K """JjFz{{ǤviDDDDDDDDDD\""""""""""@1%"""""""""2P p \""""""""""@15b˖-ѷoifn %-w}7*4%-?-۳gen QRbkV^ݕ-QʔwIOܧl)k \"""Ji&n%!;;;(r;X>\5fCIicC-O#BBB,2HSjY ~ %OϿ[/](E """"""""""@1%"""""""""2PF~>O<ۻq Сz} 4i{+4hO͛!FDDDDDDDDD\/_bjj٦MXaVp\о}{Sz|5Wlٲ=Ǩ...׫W~Zj')rӕv ׹}vŋxEVqm6^G -U!""""""""\'''?4cϞ=})-B{ӧpMW-QĵAͿqFq+V&\͘1[gg7~~~NqmǏhmmܢEkG3 pcǎI;Y;~VZE]J!0a(_޽{WDzjѹsg*ܹ# "ʖ-+œ'OG;p@)e&ըQC|U͛իktq[Bɓ'K;'Oa';/^Pil>dq|Őbu}KeZU(|{ЖެεcR\f1_C-Cdnf{x>W+  jh#t~J۠L{5~kW-4 )|"N:%z-~wѪU+eM0)BHXXVPLU۶m;wŋK>̙STXQ9sFkAgNe;׀VW^9cW,SiSLT?`JØUT{̷`?NL237_׿0߻tzԼ8 z㾍\o<ҪW n?_oϭZcL#G5kjuDDDDDb\ ^&׽%դMVhB~Z 0@u&SLsF_%nj#~DZc'ZjG 6HA0̜9S @;t ֭[}=b͐!\rԩSExxطo_~… KzhJm7{e ܫW2߃mzl=w.u*5$N,v q_vJK]IvgtuDw~ķ8ۋ JУu֭b޼y1z>Ѿ}{iRTT)qEQ`AqYqG!$Z^{k>\bO\C4*uP椲/U0z:cL """"2&)&% 1|pwaâ/r!a\,}MܼyS/QDr⁡Cj~Ć 蕇xRԱĭrEDː&W}'.}6_iԣVɫ&&&߱eK.7m;q3.UT 32v2^BvWWWm5 ]9s-WxXU*=P&iFW[e#y*ן]$|JV:tΚ_gB\@DDDDM p)ԪUW sf͚5zjz&/בeźMv?. 5v{.iepd>}D1ǥC\9@:EsXBсl]]^~bol„\%eɡ˥}OѢi(8q?o:QmnCfrǏku_/\`U<{T%V*չrJT{SUǗ.VmB\f̒!05k,/KW*݀6t) o}u?kg-ZI1&Q!4L """"6MINfL Q v u%caEr ܠ w^)EMJS p<{LIDmZ@6Pb8)ƞ={b,CڨQ#Qti,CTmOj5pJdejj${ő߿xaM j䭧L|*z.M׾*%d'%U?4qwڵcǎڞ!R$ygj3N߽zo{ힻN|bjpbu[պ6KDDDDƈ.%$K.KP)<l:$$P.b`?5:\Kڟz K) ߴK+k欯ݥ{r:uX\jZBA |& DDDDdR>,nܸ!sE Dl;Vi-j"6Zy/_yFsGUkkk!˖-:CZR%(MŋK۬Y3i!&B}?C9RZ4_ꔾޭ#a"Lo:Wс+ò>&ˣ B#&n9Yo߯13mo| r8c$\T` _ĤIĈ#ԩoӦMRЉe 0<äwޕB`&#$ Ѭk+fpZfw#~xsF,gnaѲGS9=i0S,uGwTN O ǣ(1U-hҚ#M7z'[u;YYXgJV,$9U&%PP,*V6%.ŠX3dϞ]ak׮5pvmݸqʖ-+Ν;'ʗ/̙S۷Oꭋʃ',?4zĠ=L+2聇}@KKKQhQ`ѽ{.ڄel!CP){.+0k cJǨfӐۛt')1uA!a#V8;TV!ptsH>uX4S\ܭ"0߸l;G٬0>xOWJ̜9S=ZZgPWyI&U?-s/6TmڴѬFۙG9W`~Lz+WkT%I]~>5y{n*erYsgXi;{]ܿ5t^7ߤ %*Wk!/@DDDDd&&ua@.dB\P2vJE8YYoAI* jGWmOJLIl3MۉĶN`oNmR&&Mo 4}4 &u6iy)SHSrA dbR:'_?RJI[KkOc61&J>X_mQQSwakki\2jADDDDDDDD\""""""""""@1%"""""""""2P p \""""""""""@1%"""""""""2P pŻD!=x9Ҵل n)5{޲\SK-Q"""׈>}@DDDDDDDDD@1%"""""""""2P p \""""""""""@1%"""""""""2P p \#lٲ}nQ3666۷owRssEٳ2}\#z^ oR(fw) w3HG}(ea D```p՘in%- ̐#}ޛ;0 oGO1G7Oat_DDDD(DDDDDDDDDD.2˗/yy{XXEmФI]ݻw_ѠA} ٳӧO5|Yau94`^z-Ma3amhh˗/Fif3GDD.\o{ԩ_~M?$$*[l1jիVډ"E:}t]un߾]x7^x{\۳ ߿ѣuK*uޗٳ?sNjNNN~i0GǞ={.SZ+ЧO1r [Dkߏ ƍ/VMy}1cƷo|}}]Ǐ?:E 1ÇykԨql޽ ўl pum߭13Mn{.+Mm1apm+KWe>0cai>S/k>2tȗYwf iٳEperߚ4貍m ^[ʫ҆=^>{Obǵs7rl\֥Y-fjvCzX|tl jjSgii)d"ի'<<z{9\:=y[;eL67yzS$wmJ+{1b>jQ?\]u*s7W]㻏i3ecǎI;9?~VZEnݒvR &KݻwIW;wΝ;bȐ!Nx u(<==El٤5j_JN2իktq[Bɓ'KႣɓ'EšCb\ŋ/Tھ.n oq^|b݂h%(jzZGF4p.Y<_1d>ڪS0pFJ pe35ճs2;lZ5SƤjc[wbYd\U ߿Ra"wyCqJK}xХUc첶<©g gߗ/_ĩSD޽.Zj ?aRPaaaZqk۶mqRw%ڵk'݇3f#T hذY-9C:k_O*.dy‰<&}43Sk;V,}|7> 5156@6(}\[ʽm=aEQ亷iӊ-Zׯ_ݻwGSLsXz|̘1~ )U8zذa̙3CbݺuC/V\rԩSExxطo_~… Kz}iJm7聛+cOTan7fwb0sVV/;|Tڥm=V+իp|-kyyTk޾|W~]RN`לT6֡e |R#ھeVU{?[KohQ ڸ76wy04_/:tJhz4c 5wOOHlkkSSqV0fq} 7JWS|棜)'y>K?x*v|!C/ɐ)m9=B|#"S+Hx߱Nnl2H$+.gϞIjӂZᨦpFFҥKKe!pLIvcӿejF~n2v&&߇5/Eh;y*6^r(O\?p(BȩF% CTq{{]Kj/JI8etmTSF͛3L2%*mtv>Hh} TaBb| >-AS f]0J.ro}>nS\JH.]߿F&GSk׮c}y0wwwCD؍&J(Zӿ.eu:fK[Yse03qͪ>1bKqqTj4h>vXiq `uU(%c~˗E v#;jܩC^<~x[U4-;mI+}064i1b4pXN^6mIJ );w?KXB!~{hД{*R;y~uz>YeK8-^u1;4͓5FX Xs\͋or\KDDDDD11kbٳK=lw.vo߾-@7nBٲeŹs礑U3gNiouA͟?_D  @A(m>t(ZX`4MÁ㫁6={6.n Z42}eeyv`ӝP03ӺR\qmAsfpN{n;]9($bD b`*uq.uۙG9W`~&+WkTNRdE'OMĀkޞoY\hpyY?hZN^OZ==Ț+G-5h3=mQf̙br8͛7O6lRыeݺuґ2 P[3YB{7KUyKWg tۗϩ h^k>1놤ٽ{w3 )0i3e)yEsBDDիWaxrq(e!!!nى_'ߗ! w+H{̣0%"n2*Ο?fPB>rssV92eoR9s挈:1K?%./&K #w9"x n0%"""""""""2P p \""""""""""et/_ۻy0:w۠I&wᄁAZ7""¬sk&D jذ޾}.ҥh+6 pֆZ|2id6m6c9… 8p{O:ׯXe˖9F-uqq^zժU;QH[OܵkU۷ /^Ƌ/|k{=zonR`^bff~m>X[[k1#"""""""""dtѱgϞ>}!{ wLZn%կ_?4h7cXb7͛aƌ:;;suk{?~D-Zؾo߾_s3eɓ'9-"""""""""J.}A˗ݻb蹊p@Ǝ;e ^Zrݍqwww^z-ݿ}Tr*I|ۋBϻիWB=sLgV֭JGbU1!""""""""|=9s… w-(WT &[YY{.|"ׯByz. m/00V^rXxqoU6A=y5fѥKlllDDNDc^?\ҥKbرx|rʉ' 77uw.V\}I.P5j(S6EDDEImH:(T\'{A1{l>yuԑK|AO>$m{RPv---E,YDzȜ9se  ,^^^EիsQ [UhzVEHHؽ{n/_^x?^ȑC c~]@ݺušC-砠 \V6۫ۋ 6Ļ 1?~eiBdȐA-[VtU4hw={ 'Zn-6oޜXd8T_?"?&e֟mnºH{!'B߾tم[3aW1{3bԕڊ}|ByJ nZ?È|KG3,"ӴsВ*=6օ+t֩.%HZ`SNk߼y<`Ϩ/S&Cԭ[7b iӧOرcvP?.UnѢE ;)MMMń Dݻ$zիWΝ;Pq1diY''Ov?#N<)C/^}]]/_ĩSD޽.΢(`R[b2-&mڴEbRC92ef=qГ%ZjGJz̙3Cbݺ~G/V&ibL:Udz_~… KzhJm7Žz!G֭[żybF2TՁ^h*UJ\xQ,XP={V?>F/Θ_D0qt {d??Jp۷ҤIcyn\iȑ#͚5h|Jm)1.K NoSo)v% *oaHmY)%B]_| VcE4uZajV}CYui>v4o98F -uHRLK>|;vذaїa9pذ .։Po߾7oJ%J^-0tP܏P;/_.Nn(N8!J*L^蕆٪v2^zGmTum.(y1ҥKKpȾbx6^>i$HpEq {N+͛٧!rMbK]zM,[ xbt녝!VR Y+LEapGi]\jBܹY7jz5&/בuźMN 5{4.iп>}H*B9@JEsXBсl]]8$… ]W3s UV_r%Jrb̯ @e낌1ƕ6^͛7'UZ7bS룬jc\n6c|\5ϛƉ/l[sq3os5Cer8Lކ+ (kb0{Ja.j.b`ٳgjz4bGT1Mnp(ŽoFDҥ8Pj ܤh{RSZbG?)zzb\ԕرcgLuK 1׸Ô5'J `rb|޼y#fʔI-1`Lq^>m>M*`S0Mm>7 X/]$޿/Ό8׮];`Jqa)M x䝊={J.M*h J*)SFL1UnICB~D2 aqtQ1"" v .bŤ*CzдiӤ0(%1qzBdG15q1 B_os}aDԺעc`M, Fu'"""gq +z6h z'dرyu #N j]|YɓG/^\jmm-<<<@wٲe@gC1(K``ԋ7/^,.ja)A}?CQ( ]ݐ/R-DpS:u$LڴitbYbK^Ϙ9ݻRg=z$d".)b/I^bE!s!1ָqD=yv| ekqFmcHϿ"!v)}7Ï&`R>4iZx~}3o8XV7<-/2Ϻ$ i綕?.[ZM>vfD#"""R\Af(zʞ=v׮]1jbNvz;wNX9sF2Fo]\W =a1 A`2u 8&n,--EѢEł >b_ \ٳuvCP=F--G8¨T}=# >6츷iFF'3 &C{WREDFFJgϞ- -[Jcb-o"30%1&\!T,"߉/{JS\ ĻDdf]H[7)<$jWŋ^9y3,"ӴsI."""R\ Ĥ. %L ۋ]TAW Vb&EJ:PUۓ;(6izVŔ)S)2 Gѭݶ0׸ p1i~Ĕ\o^RLyE7w#2ϻںNYE֥O]y]Iz n>i\2j ( @5DDDDDDDDD1"""""""""R\""""""""""@1%"""""""""2P p \""""""""""@1%"""""""""2P pŻD!=sOL''}%=顏r)'j'L !""Fӕ"""""""""DDDDDDDDDD.bKDDDDDDDDDd(DDDDDDDDDD.bKDDDDDDDDDd>m߾ DDDDD;v%5p+pcw;\""""""""".bKDDDDDDDDDd(DDDDDDDDDD.bkͣDDDDD、O?~tL*7Ln < pXʕo9s'}UhHpAD*U:sn<&N8 6ܻe˖ s(05baaaf8-]Xf4~Zz*ߣfmm-ҦM+M3g2e>l055y ;;;(r;X>\5fCIicC-]]]JbN!!"C{o?Θo|P~Mo߾1/^:1)~_;|cǎW^5k)1!Jbnvi޽{!mժV}?ɀ(\ζ/7oވ`i9;w]үJ8)[l^' """J Ukaru.Uk|,YbiH5k_~eҥK{nzӧOs >|FDD\JPT _u+l'FWBǏK.`'Q^!ϐ!Q"~G;Iy(%Yd/NNN~ӦM3bĈrE.""J6A@@;wni?~T'w6ķlg;_DDD1ɽWU)K$oO^XX_ %HNqu6ml~mFn%OF>|!Cx"kӦMwΛ7og} 4i{+4hOK;c>˸[ԗr_ݶ0eĤ+q@Ʒ,&4m6aB|X[gv Ȕ. upԩsZMeYXEh)R, J[v?)JD}yY󛈈[n]G}' p/]TfذaoݺU$ew-أG7o,Vr.;x`^z-)0uww111^H[7nÇypٲe=֭{pŊ۞m F }\Eׯ0w!ҥvQctn2e.yzzR)ٳg;t+{}zpٳG5qרLU͛7߁Eǹ0k׮1MKyUQ4ٴYmm[h;[//91äv&ĊA0cęC,_R[-DDI%[Eo޿`a߫WBV&e[f͚OQ}?Gn%?FBժUO:u ޱįr 0ssp⼙YDXXT,B妦rq?Z*KTaJuurH Mp/"$F[f.@ESE46Af,5A%՗k?Q7pRGFDj.[LeVei!"য়~}CtxbY}' pQa…,X0b˗/#GjeϞ{TVĕ+WJ\GŋߨXӧʑ#Sߏ6Ao۸Ə?e˖7nuz*rsy77h'Or ŐTW_VB9ucxkHOeRE1KMkߚaj|U{;^vr90Շ7~U ^ٽ{>,4L[ZYۧf`l`'sN) |tgt iӧjfn]rZ:cYr+""Ò/_pGDDbt.z0S *')FݳgO#]UVu-Wr___Wyh+ϣ&<W M(M k֬]t-[[Xjժ1#GD*R'iV$V\t,7nc9Y~}q1;p[n+.bJ/`%ӷo_pn{RA grg@ߙ=gOF{uuϽEuu&jlkm:gϟUiCze/zpQa~<_(n5K^];Nu[4ZyjIe%rezݰl{JM`؋T%LLzuneez;;; .ٳK $,X D~b+o[[[1g_4Μ9S9 P7>n>C*.;|Qw~Gfnd:>Iq|  6n:Jțρo+x<fqv.h&|?iΟoB'po [v~R6CCCEppx4|h6~yEץuݻXi 2D6fϞ-M|U):x 駟1 J9s‘{پ'Z}|N^ݴhA!Mk>m\:mmb#\{"duc:F.ӣۉn#:Jc!ܪ%ZݮPâN:ҏj3s͚5M"""""]K1.i.00P:E #C7n\+'NZϏ ʖ-+ye޽{pqF>kn(֠0w_SfnbxxS feaܭ"<6}-!(5;cOb_ص 0j?~s7oHTFH;:XOC@qq[t4w*<:ď7w};=QCM8W ({/_d>zXm]izf͕bi珞;v[Ͳ8BVtAR骙jl߉I4upbo+qz|VIKDDDD] p):]!bY@;ȟj[n) >8LqRxk.r M#)cƌҡ(аaC}0+H$ۮoBN~Ow 5}ik%\Rw.ym=wfθr~e_ts*ۼ:%\n!K#Cm`ԩSO>yR Pvoߤ0-\,v`A1ݹs'QQXZZE?C*]&\\\^-zKʂ߾}} _+\MP5P_sUݚ9E {?(09f[wi5rgR- BaO++9.^{guM\&/hٕK'z\.M MuɁsA!xCokժt=O˧ҶL """"&!~~~RMԊEݻwKpb]9r ܻL10E;ܢϗ+WNZ 6(8|߾}RۺukptIqxL n>޴ل 03d^2߃1-*H};isM+Ek X7?#/Cwww!euSJ%M9ses4BP@۶mzĢ'^zJ2tлbp 0..蹬kZyc-OdPuׁurq=p3QhWJtUQo+ dFf*>m~y/T479` KDDDD.e ;3&3&t7 SLunIo:3i'7rH1@IJ ~fRİrbOݜS˜m7 EDž4Su"9~]sP^.U}omT3n9Df0#Ԕ|c^9mu/yMץ_~b`\L B%.k ?Y׶Y䟧m:(iݬU'Iu*`rEH=Ov o#[FD;iN.*i Jd&OY<6a2' dOUNk) u qy+BР0D+b6_BHӛA[Y[Ys-wLn9IW111:MfۧmD!L}P56\ Teja6Z[%9Ź9wsSNwU.x턤KԢF)bmV"cI„ ػE_>K+;:IA,0`$K>wd6I5UKMx.3ݽ_ZXZV$X_mQYӵ!`{2RՀh׽T_*Vq,4)26>GFA:de~wh_,C`^\c-5򦫹;O@$(H /?!7*y''N((S^)}# bl$MPj"11Q ߿/N{.t>>>O%"""2{ ps3gΘ)t9Q.72 fd>r>FL;^< VTu3!#~fʯq,2c={{_^ze≈H""cLQ """i pX߾}b2v;0(DDDDDDDDDD&.bKDDDDDDDDDd(DDDDDDDDDD&.bkԩsDDs܄pc7vǏ;V """׌%%%Ylٲw}' ‹/ϟuCWoooq/6X[ '''!&&F(Hb cr'3'* {%qm+_mP>| 'N}zob!A`ajUKG7Xg/hGW弻KgO\&6 sG?вeKn3..N 'OB``8]~]{ϟ_ 3'""A+ը@ب;q>D6H[CJalgKy'8'|u.UO_"""""Բ+&N`8@X>@8>>^\I U8VVW!""L\T]dHkdr>Z6fyxSԔd CA05Z [y'ټrSADdL]vݰq.NR׼Rʹ^zhٲl{C:Okժu";URJ.^XիWmҏ~zrժUݯ_^lٲ7r>(ØVXQFY(yNLLL oݺvװ6= ,(8;;2ެR3H;,).ެV@4(ۼys6m|i;vOFEE9Ϛ5QF}m2d>&i~h""J,76l\|kny󆺺F]жm{U#8:pAhLL#HΝ;2%'ښ ŤoږeDDkOR9 LhťX.u]\~wh?778_E|&"$.O\5G'l@DSCC* /l "":-ZTFS|ͬ%Jm߾6>,2qV~+V~~ 4halchM?V<==Crpȑzgq 6JsΛ};;8G;y.\}?Ҹq7nxr ZF/ŋm۶3fwwΝm ,߽{Dɒ%te'l?`T믿>xG+nccPrcǎQNcY}9/_"3yq>2_)W1b7nUۥڵkh՟Cu۷)>RSS-7o \n'0`KŇ>2ڞc >N:xjժ;|rs鱠 ńcƌ矿2sGYcrz´*)ԕHHb_JA+Ba7𛀸s50QZd#496eT!LUz[]GkBDD"}9 έY&''[}?,YO>Y[nk._AV^G"sfv.q$nݺGEhg}?XGz.'N=zGm_;S~oԨ:t؊r]WyJpТ !Ň.=p#mW\'LTjS2ogH"oDg<<)<&6@yK#""\ݻ_8uk0:>>Y o,{wFPF]>\NG;G]q$G [3SIqx3ڞa"-Ǒ5] w21s8ea!Ѹ$kPPX #ⓒە>acm.>F׽wP.3R'"ѥTRgY\\\ ""2}豈NC.]JnSfлﳴ~\OW%uҕ!m퇄x>{G塦&~=NWMZ&G 㽣zqqqv|WUPR'4^i&ڋrYy5*Tp.5fhjH:zŢF́Hֲe=s& ~pEft?8i{N3ԩf)ѣJ(SpCa,<5DgNsNB8Z~-q|K8.Pg'-z o= g;kX ŀX1>B.Nv6$u%`4AAA6X[fb^;AP~DDw Oq.ݻw_e6eF*Ne7={lݻw@OLm%uJIIԴNV R d:fdgA.gA0CouP!ۤ^)6]zׯ?`ԩS5e">N9CFK x\3)/2=|=&НP+VZY3gTl{*@)Luґ ֥!\Rٳgeb;w[wya„ x0(|NQBP~9/_vQB͚5ѣG#,W& Ŷ)S=s} g^D I& A _ /Ѷl룠JIg=~pe~DHBb{|?*m~ݬʹU_X5{DPD㋕tն]5,hBa('`^0dDrXKcRoRUZaUQ=G|v3m6j#~Sk S׶].XC6tCɫ.Pc +Q7F'}߷ }'Ow0ma|eж;%jCg6pJ[RЫW/e˖:oOUttM!ٳG t"lذ!?%]:UȚ5]P 1>ڳ` YKsNߺ^?_@ePJOsUX^fVQ:9~z NuPn_vj:(SN[+G {B9EFg0݃2l 9?09E CD׮])'1cBH3gpi=^]~hO?,Bd)r ]!^#<_[lŋe11͛7uAH IϮ_|/_\:qȬas[lu{տ9}ͺloдc/xl\lT)VzyB_6S'5rp}zu{+^B~f&/ >ֽ{O=>.LJL u q u |8pHIN3V8v9r#f+By!lΝ7 xON:@QߺOGGG3ypk8Eޱc/ԳfFQVZ }W{j{Ncrpu yrܮu+]_Хz{{Wmm峰xҙjWOK =k}/އϰW#źzۢV "&IGT655BLzȴF?61.V1l K+!"A?(8M!3P*Ρץt:mڴAT? RW^\ zJ%ыSmPE0I\)(p) ?<^dE/nVN2[ xfw&  C'Ya2J#<^/ H=S{C_/|' xD}I pIwYرî"vܙ*?pvСܹeo,w}ر(v @QFk׊A0|b}友CTu>}:FEAeaB2tzq ڪiL5,b4*־ڻ}=vO^xУ~AitŊ}WTjS/َ{NɔWdwʟg0 0ǾM&t@Ӌ&e; 4}gUг.i`Ύ9vmEK 8& q 6$()X Y_χ:]<~x9R!z,32*Hg D.ݴiLz-ZT„|xƅr!K#yED3ŽT9$N9 ;+b[  ImHQEU;'xܾ) ыK(ZmF62,:kDJͻ^}*5jDD` =2!B& d%J[ |kRٳ! KOղ#@bG'ٿ'OY;b0&&5/$_rticK9R^X,MwX p%8ڵkOr!! @/cWbCC\}чNڣ7wܚC cwPg1ubK9y\f92clL|»W׶j=}Fdr>4P<7dJJzjf{ȯ99&unJd F($~YW~(qgGK KӖ(OSi;.)=><{<_uvf}i^zRh)wF!>>rrqz֥: QhR-{"@Ɓ)s26O֬Y#w˗ŃyթUU=/[M>y@|bKmk4KJ.>s߄F]سA}n^o]'"24@uqq)聻yN8vǍ6""2o p)Ԫ׫bŊum1Ҷ=TIˤu$8V^g)S^+F Tay]]Ų8r蕅2+VLٳgOU޻woZm趛+ys5E9[W_jτnk~P⭝C DXzc65NM\?NW޺Ʃh!$aB9Jer.+Z̿HĄ$Fm{~&/p=;&%&$Z&'ZSC~Vd)K *)[z0mms<|cMgJ,={yd/3)sAO]p/#Bqi {'WƯu$۬-~6r{g7t]('4pE-OS16 l7o2,"H$J&"`Ν;b\U2#'1E]$?~,M ժUwQPf!|mݺPR%,Nh[7'nP~o\9CFGЄu5ȗՈFh;uѺ6^RxyF-ݷ7eEРPP.|XڲXmU4m e@ 6d WJNJDamkSB7*|mGEڿJM硼.*m?ŋ:Kn\}Q"^amlTבIܼt'c3 '5wTƔJ={+𦜄K} oR)nCwI(QXBA{xpŜڧԤ# [JWoxso:XTs|f;v6]'"2$w}{\ ծ]n?QDDpU+zնl2m|„ =hQPjce/\ /^Ş}ܸqbtRq3kbbb^?K{mmm7I))B)֍X619r#6xըUkF%x|>(hȴ&qI֪a> L6`ٛ#2;ţ`EU:tm:99{k= 7/nxrbe:iIkkCX5gnWW}#~޽peo:7=ꒃCOn;\:pnZF}Ե6e: i[_Xtao-r|空TqYN}”)SQFu]lA0,;Dfj⌈۷O4K(hͯ`Kw_cӸϨud8yx,o{Ա=/mZ x(ūKg=qIUBCpQnRbŋo;mUTŋ+,:..+Tvǎjb͛b oV aJ*$"Ex.V =a1 AK dl_q@hc@B!+WNX`8ȍj(Q \ĉi vsM,-R^V)lv[W.3[tgԻe"ޮwcubGyR o8!kL;uֳ{#l}XӅU2ڔ)'^uzBRK;.jQWыxi,j4iGX^\MRu[l_f>Uᙈ/\t56*z(V azZ|Jv?oo<'z :߿XX5ꓣ')u]1K߿/NY0>CUIc(, ߡ*w!_g:uk#_V^-]M+ML̍X^8^8aIդx+ς*|V喟\Eϳo6э 26ay Z"WͱP#YQ5|ǫ.Vu4?vN.Z&HDjذas_^j𖈈.jbJ&hSVU5kLm(BIk׮J,Cݔq &mtMݦ>U'`ň IVqv/줰uۥUEK |dMLsA&Y+] ^߄<VٯsU*l-"Segj5 ?CV<5h/&}o7#Y+2 ([0I!Pg!_x!ø֭syرV&z c:1Jn)/+QLڬ[lo۽2BĤԥ0Iu]Jadd"!22e…>},3ZǎӠARRt0qɓT~L\z|+z ,|#@"5>>jF"tm۶.]lܰaC.{mpN,YmϞ=ֻ~%JU < G.Y䝃~hWΝ7Zm{i~ڵ˕+w]Z2 ӦM+V}oӦ.#!0%څRRUy(ͿY$$9I͑g}A*b@5}bo]Lx@L`XØGYya}BU8#XZ죓ȑ#pT)ͥÌa #SNիwv .HuE ƍ`R4¥;6Y H1p۶mګ3i^<66^ C{a.z*9ؕnjE>uʌ.#!0%2#!„G'Z~A"bS X_۲<]"QP 0&+V붥:šBa288X,?m9 ]!%>3]| D;&ΉH'RRy@i*Pjz#ܿ1c|.{nŋf %/SyT-QK[>VmU瑈Hzᨨ,Opl՘Hr\~""kM  tVz7n2zήq^Ξ1NyN>^ "B꛱L32J*0{wkӦMW^x ?a~-Ay׵k y<}q+W!-G}vm.mGG\*Wpfk<\ʳt= WH]O+̫.+PP('''!&&F(Hb,W!"2q('!}Nٟoaa%-{ם0aX](> v񏲴DD9 %8Lec]| Fϛ7o(j"X:t<ԮnGڱc-7o@[d>`„ S=ZW f&}]^(6$E96:TA[*T.T᩺Yf{q)E#""\Hu%)m T"a#0 6t}.MfuUG7MYU?(WWWȜG-&}o7)!:PXp資n+M[zf;zxd=w"")S|m۶݁:>,2|9k:z}c(`H`iӣ5(((m,C@YȊ kk$k/$.`U9`/K-Ik8r,,'ADf uj/^}y뫘|bl7vs(. Q^D1%"""""""""2Q pLYo-Ю]avA۶mwז-[f͛7w0aԐnݺ;w0 TCLϟ]^ppE8{ĉZGѣ¸ k@@5jt!nGor宇zܿz׮]7 ]jUqMGի|"En_7iO:hРTo{w>|p}uwʕ {kmܸ+VZY3gTl{111(Q!T^=m޽{ ˗/O(_f͚ѣmSJJ?mS>^q{\w߾}ٳǀ(QBhҤ<0$$3_-,^8G۞=v{V5k&7Nȟ?mC ,X ,ZH|I~ œ9sjVY}?k#!!u5k7n={&ޙ8qPp,m\6m*o/^p,mrsK;&~966VܹFggg׭[7aڵ.M6 ƍykkk[RЫW/e˖:oOUttI{Zسg&tEذaC$9'D_*$>$J Z  M|xU}x)(~ 8*(}(ޞxOPAp=j8T3~F 'JJ (c?`a,Dn.DXXs)ZKDDDg)42l)/_U:$|`寿/.W`a!0i$Fbzm!_IoB=Xu0l0qe$P"m . ,(4lPxM(`AYz%KԩS,www‘#G`ӧZmߐm7c=*|WO?$΢(`Î-$ۺyfab\|yI"EZj Ǐc0U}^IO<)ԩSG?~/p`wVtV)[p1-|OiFl;O?T| fF7~+jJo$?|t]H~(Ğ"Ğ"8~&BߩGĿcbV{ʧ;u*~*}a,Mz-зiן~U\RS-t'Nr'J |W,̮#0i&tQ $:iӦСCs Kn;vڞ8RB1@kԨpAW`>V^wŊ$1͎ӧ ®]-Z-/S8KVƆ^[qC/$hݴi0o޼tLUFg]&+ ΝJ.-8qB8}t^蹝9/a.'OkA|G{Q3n޼),sqqMr[hQw&\oĞ۷6KR?t ?/^JJ .Ƥ[?j"1u ӄja"{뱋6%* E WSVR pu]\(44T\/CJ7`Ge7ӫ2tMÇCvvvb0m4+ =qe:ϟ?{Gyjlb MK,.)V}>eLۙpEF8ݼ{tHP?׹!bdsu}"""2o N^3T"( ;0meXGNT1EMRe?~,<6-G#v4PM>0v|[n-TTI, S%͉4m6%vsBO,"D>GH{VAQ{ѿWI ³Z_󮩭KDDD.jbJ&hTtu@k(&}B_kl㛕*j{NcN;衬OY}?kcڴiWP#6nT{\^ :1V#0d(ݺuΦTuq҆hs4n[\(ap5_$&ӿɈ[Y["""dִ`. As the id / key is used for deduplication, id_hash must be a cryptographically strong hash or MAC. Segments ~~~~~~~~ Objects referenced by a key are stored inline in files (`segments`) of approx. 500 MB size in numbered subdirectories of ``repo/data``. The number of segments per directory is controlled by the value of ``segments_per_dir``. If you change this value in a non-empty repository, you may also need to relocate the segment files manually. A segment starts with a magic number (``BORG_SEG`` as an eight byte ASCII string), followed by a number of log entries. Each log entry consists of (in this order): * crc32 checksum (uint32): - for PUT2: CRC32(size + tag + key + digest) - for PUT: CRC32(size + tag + key + payload) - for DELETE: CRC32(size + tag + key) - for COMMIT: CRC32(size + tag) * size (uint32) of the entry (including the whole header) * tag (uint8): PUT(0), DELETE(1), COMMIT(2) or PUT2(3) * key (256 bit) - only for PUT/PUT2/DELETE * payload (size - 41 bytes) - only for PUT * xxh64 digest (64 bit) = XXH64(size + tag + key + payload) - only for PUT2 * payload (size - 41 - 8 bytes) - only for PUT2 PUT2 is new since repository version 2. For new log entries PUT2 is used. PUT is still supported to read version 1 repositories, but not generated any more. If we talk about ``PUT`` in general, it shall usually mean PUT2 for repository version 2+. Those files are strictly append-only and modified only once. When an object is written to the repository a ``PUT`` entry is written to the file containing the object id and payload. If an object is deleted a ``DELETE`` entry is appended with the object id. A ``COMMIT`` tag is written when a repository transaction is committed. The segment number of the segment containing a commit is the **transaction ID**. When a repository is opened any ``PUT`` or ``DELETE`` operations not followed by a ``COMMIT`` tag are discarded since they are part of a partial/uncommitted transaction. The size of individual segments is limited to 4 GiB, since the offset of entries within segments is stored in a 32-bit unsigned integer in the repository index. Objects / Payload structure ~~~~~~~~~~~~~~~~~~~~~~~~~~~ All data (the manifest, archives, archive item stream chunks and file data chunks) is compressed, optionally obfuscated and encrypted. This produces some additional metadata (size and compression information), which is separately serialized and also encrypted. See :ref:`data-encryption` for a graphic outlining the anatomy of the encryption in Borg. What you see at the bottom there is done twice: once for the data and once for the metadata. An object (the payload part of a segment file log entry) must be like: - length of encrypted metadata (16bit unsigned int) - encrypted metadata (incl. encryption header), when decrypted: - msgpacked dict with: - ctype (compression type 0..255) - clevel (compression level 0..255) - csize (overall compressed (and maybe obfuscated) data size) - psize (only when obfuscated: payload size without the obfuscation trailer) - size (uncompressed size of the data) - encrypted data (incl. encryption header), when decrypted: - compressed data (with an optional all-zero-bytes obfuscation trailer) This new, more complex repo v2 object format was implemented to be able to query the metadata efficiently without having to read, transfer and decrypt the (usually much bigger) data part. The metadata is encrypted not to disclose potentially sensitive information that could be used for e.g. fingerprinting attacks. The compression `ctype` and `clevel` is explained in :ref:`data-compression`. Index, hints and integrity ~~~~~~~~~~~~~~~~~~~~~~~~~~ The **repository index** is stored in ``index.`` and is used to determine an object's location in the repository. It is a HashIndex_, a hash table using open addressing. It maps object keys_ to: * segment number (unit32) * offset of the object's entry within the segment (uint32) * size of the payload, not including the entry header (uint32) * flags (uint32) The **hints file** is a msgpacked file named ``hints.``. It contains: * version * list of segments * compact * shadow_index * storage_quota_use The **integrity file** is a msgpacked file named ``integrity.``. It contains checksums of the index and hints files and is described in the :ref:`Checksumming data structures ` section below. If the index or hints are corrupted, they are re-generated automatically. If they are outdated, segments are replayed from the index state to the currently committed transaction. Compaction ~~~~~~~~~~ For a given key only the last entry regarding the key, which is called current (all other entries are called superseded), is relevant: If there is no entry or the last entry is a DELETE then the key does not exist. Otherwise the last PUT defines the value of the key. By superseding a PUT (with either another PUT or a DELETE) the log entry becomes obsolete. A segment containing such obsolete entries is called sparse, while a segment containing no such entries is called compact. Since writing a ``DELETE`` tag does not actually delete any data and thus does not free disk space any log-based data store will need a compaction strategy (somewhat analogous to a garbage collector). Borg uses a simple forward compacting algorithm, which avoids modifying existing segments. Compaction runs when a commit is issued with ``compact=True`` parameter, e.g. by the ``borg compact`` command (unless the :ref:`append_only_mode` is active). The compaction algorithm requires two inputs in addition to the segments themselves: (i) Which segments are sparse, to avoid scanning all segments (impractical). Further, Borg uses a conditional compaction strategy: Only those segments that exceed a threshold sparsity are compacted. To implement the threshold condition efficiently, the sparsity has to be stored as well. Therefore, Borg stores a mapping ``(segment id,) -> (number of sparse bytes,)``. (ii) Each segment's reference count, which indicates how many live objects are in a segment. This is not strictly required to perform the algorithm. Rather, it is used to validate that a segment is unused before deleting it. If the algorithm is incorrect, or the reference count was not accounted correctly, then an assertion failure occurs. These two pieces of information are stored in the hints file (`hints.N`) next to the index (`index.N`). Compaction may take some time if a repository has been kept in append-only mode or ``borg compact`` has not been used for a longer time, which both has caused the number of sparse segments to grow. Compaction processes sparse segments from oldest to newest; sparse segments which don't contain enough deleted data to justify compaction are skipped. This avoids doing e.g. 500 MB of writing current data to a new segment when only a couple kB were deleted in a segment. Segments that are compacted are read in entirety. Current entries are written to a new segment, while superseded entries are omitted. After each segment an intermediary commit is written to the new segment. Then, the old segment is deleted (asserting that the reference count diminished to zero), freeing disk space. A simplified example (excluding conditional compaction and with simpler commit logic) showing the principal operation of compaction: .. figure:: compaction.png :figwidth: 100% :width: 100% (The actual algorithm is more complex to avoid various consistency issues, refer to the ``borg.repository`` module for more comments and documentation on these issues.) .. _internals_storage_quota: Storage quotas ~~~~~~~~~~~~~~ Quotas are implemented at the Repository level. The active quota of a repository is determined by the ``storage_quota`` `config` entry or a run-time override (via :ref:`borg_serve`). The currently used quota is stored in the hints file. Operations (PUT and DELETE) during a transaction modify the currently used quota: - A PUT adds the size of the *log entry* to the quota, i.e. the length of the data plus the 41 byte header. - A DELETE subtracts the size of the deleted log entry from the quota, which includes the header. Thus, PUT and DELETE are symmetric and cancel each other out precisely. The quota does not track on-disk size overheads (due to conditional compaction or append-only mode). In normal operation the inclusion of the log entry headers in the quota act as a faithful proxy for index and hints overheads. By tracking effective content size, the client can *always* recover from a full quota by deleting archives. This would not be possible if the quota tracked on-disk size, since journaling DELETEs requires extra disk space before space is freed. Tracking effective size on the other hand accounts DELETEs immediately as freeing quota. .. rubric:: Enforcing the quota The storage quota is meant as a robust mechanism for service providers, therefore :ref:`borg_serve` has to enforce it without loopholes (e.g. modified clients). The following sections refer to using quotas on remotely accessed repositories. For local access, consider *client* and *serve* the same. Accordingly, quotas cannot be enforced with local access, since the quota can be changed in the repository config. The quota is enforcible only if *all* :ref:`borg_serve` versions accessible to clients support quotas (see next section). Further, quota is per repository. Therefore, ensure clients can only access a defined set of repositories with their quotas set, using ``--restrict-to-repository``. If the client exceeds the storage quota the ``StorageQuotaExceeded`` exception is raised. Normally a client could ignore such an exception and just send a ``commit()`` command anyway, circumventing the quota. However, when ``StorageQuotaExceeded`` is raised, it is stored in the ``transaction_doomed`` attribute of the repository. If the transaction is doomed, then commit will re-raise this exception, aborting the commit. The transaction_doomed indicator is reset on a rollback (which erases the quota-exceeding state). .. rubric:: Compatibility with older servers and enabling quota after-the-fact If no quota data is stored in the hints file, Borg assumes zero quota is used. Thus, if a repository with an enabled quota is written to with an older ``borg serve`` version that does not understand quotas, then the quota usage will be erased. The client version is irrelevant to the storage quota and has no part in it. The form of error messages due to exceeding quota varies with client versions. A similar situation arises when upgrading from a Borg release that did not have quotas. Borg will start tracking quota use from the time of the upgrade, starting at zero. If the quota shall be enforced accurately in these cases, either - delete the ``index.N`` and ``hints.N`` files, forcing Borg to rebuild both, re-acquiring quota data in the process, or - edit the msgpacked ``hints.N`` file (not recommended and thus not documented further). The object graph ---------------- On top of the simple key-value store offered by the Repository_, Borg builds a much more sophisticated data structure that is essentially a completely encrypted object graph. Objects, such as archives_, are referenced by their chunk ID, which is cryptographically derived from their contents. More on how this helps security in :ref:`security_structural_auth`. .. figure:: object-graph.png :figwidth: 100% :width: 100% .. _manifest: The manifest ~~~~~~~~~~~~ The manifest is the root of the object hierarchy. It references all archives in a repository, and thus all data in it. Since no object references it, it cannot be stored under its ID key. Instead, the manifest has a fixed all-zero key. The manifest is rewritten each time an archive is created, deleted, or modified. It looks like this: .. code-block:: python { 'version': 1, 'timestamp': '2017-05-05T12:42:23.042864', 'item_keys': ['acl_access', 'acl_default', ...], 'config': {}, 'archives': { '2017-05-05-system-backup': { 'id': b'<32 byte binary object ID>', 'time': '2017-05-05T12:42:22.942864', }, }, } The *version* field can be either 1 or 2. The versions differ in the way feature flags are handled, described below. The *timestamp* field is used to avoid logical replay attacks where the server just resets the repository to a previous state. *item_keys* is a list containing all Item_ keys that may be encountered in the repository. It is used by *borg check*, which verifies that all keys in all items are a subset of these keys. Thus, an older version of *borg check* supporting this mechanism can correctly detect keys introduced in later versions. *config* is a general-purpose location for additional metadata. All versions of Borg preserve its contents. Feature flags +++++++++++++ Feature flags are used to add features to data structures without causing corruption if older versions are used to access or modify them. The main issues to consider for a feature flag oriented design are flag granularity, flag storage, and cache_ invalidation. Feature flags are divided in approximately three categories, detailed below. Due to the nature of ID-based deduplication, write (i.e. creating archives) and read access are not symmetric; it is possible to create archives referencing chunks that are not readable with the current feature set. The third category are operations that require accurate reference counts, for example archive deletion and check. As the manifest is always updated and always read, it is the ideal place to store feature flags, comparable to the super-block of a file system. The only problem is to recover from a lost manifest, i.e. how is it possible to detect which feature flags are enabled, if there is no manifest to tell. This issue is left open at this time, but is not expected to be a major hurdle; it doesn't have to be handled efficiently, it just needs to be handled. Lastly, cache_ invalidation is handled by noting which feature flags were and which were not understood while manipulating a cache. This allows borg to detect whether the cache needs to be invalidated, i.e. rebuilt from scratch. See `Cache feature flags`_ below. The *config* key stores the feature flags enabled on a repository: .. code-block:: python config = { 'feature_flags': { 'read': { 'mandatory': ['some_feature'], }, 'check': { 'mandatory': ['other_feature'], } 'write': ..., 'delete': ... }, } The top-level distinction for feature flags is the operation the client intends to perform, | the *read* operation includes extraction and listing of archives, | the *write* operation includes creating new archives, | the *delete* (archives) operation, | the *check* operation requires full understanding of everything in the repository. | These are weakly set-ordered; *check* will include everything required for *delete*, *delete* will likely include *write* and *read*. However, *read* may require more features than *write* (due to ID-based deduplication, *write* does not necessarily require reading/understanding repository contents). Each operation can contain several sets of feature flags. Only one set, the *mandatory* set is currently defined. Upon reading the manifest, the Borg client has already determined which operation should be performed. If feature flags are found in the manifest, the set of feature flags supported by the client is compared to the mandatory set found in the manifest. If any unsupported flags are found (i.e. the mandatory set is not a subset of the features supported by the Borg client used), the operation is aborted with a *MandatoryFeatureUnsupported* error: Unsupported repository feature(s) {'some_feature'}. A newer version of borg is required to access this repository. Older Borg releases do not have this concept and do not perform feature flags checks. These can be locked out with manifest version 2. Thus, the only difference between manifest versions 1 and 2 is that the latter is only accepted by Borg releases implementing feature flags. Therefore, as soon as any mandatory feature flag is enabled in a repository, the manifest version must be switched to version 2 in order to lock out all Borg releases unaware of feature flags. .. _Cache feature flags: .. rubric:: Cache feature flags `The cache`_ does not have its separate set of feature flags. Instead, Borg stores which flags were used to create or modify a cache. All mandatory manifest features from all operations are gathered in one set. Then, two sets of features are computed; - those features that are supported by the client and mandated by the manifest are added to the *mandatory_features* set, - the *ignored_features* set comprised of those features mandated by the manifest, but not supported by the client. Because the client previously checked compliance with the mandatory set of features required for the particular operation it is executing, the *mandatory_features* set will contain all necessary features required for using the cache safely. Conversely, the *ignored_features* set contains only those features which were not relevant to operating the cache. Otherwise, the client would not pass the feature set test against the manifest. When opening a cache and the *mandatory_features* set is not a subset of the features supported by the client, the cache is wiped out and rebuilt, since a client not supporting a mandatory feature that the cache was built with would be unable to update it correctly. The assumption behind this behaviour is that any of the unsupported features could have been reflected in the cache and there is no way for the client to discern whether that is the case. Meanwhile, it may not be practical for every feature to have clients using it track whether the feature had an impact on the cache. Therefore, the cache is wiped. When opening a cache and the intersection of *ignored_features* and the features supported by the client contains any elements, i.e. the client possesses features that the previous client did not have and those new features are enabled in the repository, the cache is wiped out and rebuilt. While the former condition likely requires no tweaks, the latter condition is formulated in an especially conservative way to play it safe. It seems likely that specific features might be exempted from the latter condition. .. rubric:: Defined feature flags Currently no feature flags are defined. From currently planned features, some examples follow, these may/may not be implemented and purely serve as examples. - A mandatory *read* feature could be using a different encryption scheme (e.g. session keys). This may not be mandatory for the *write* operation - reading data is not strictly required for creating an archive. - Any additions to the way chunks are referenced (e.g. to support larger archives) would become a mandatory *delete* and *check* feature; *delete* implies knowing correct reference counts, so all object references need to be understood. *check* must discover the entire object graph as well, otherwise the "orphan chunks check" could delete data still in use. .. _archive: Archives ~~~~~~~~ Each archive is an object referenced by the manifest. The archive object itself does not store any of the data contained in the archive it describes. Instead, it contains a list of chunks which form a msgpacked stream of items_. The archive object itself further contains some metadata: * *version* * *name*, which might differ from the name set in the manifest. When :ref:`borg_check` rebuilds the manifest (e.g. if it was corrupted) and finds more than one archive object with the same name, it adds a counter to the name in the manifest, but leaves the *name* field of the archives as it was. * *item_ptrs*, a list of "pointer chunk" IDs. Each "pointer chunk" contains a list of chunk IDs of item metadata. * *command_line*, the command line which was used to create the archive * *hostname* * *username* * *time* and *time_end* are the start and end timestamps, respectively * *comment*, a user-specified archive comment * *chunker_params* are the :ref:`chunker-params ` used for creating the archive. This is used by :ref:`borg_recreate` to determine whether a given archive needs rechunking. * Some other pieces of information related to recreate. .. _item: Items ~~~~~ Each item represents a file, directory or other file system item and is stored as a dictionary created by the ``Item`` class that contains: * path * list of data chunks (size: count * ~40B) * user * group * uid * gid * mode (item type + permissions) * source (for symlinks) * hlid (for hardlinks) * rdev (for device files) * mtime, atime, ctime, birthtime in nanoseconds * xattrs * acl (various OS-dependent fields) * flags All items are serialized using msgpack and the resulting byte stream is fed into the same chunker algorithm as used for regular file data and turned into deduplicated chunks. The reference to these chunks is then added to the archive metadata. To achieve a finer granularity on this metadata stream, we use different chunker params for this chunker, which result in smaller chunks. A chunk is stored as an object as well, of course. .. _chunks: .. _chunker_details: Chunks ~~~~~~ Borg has these chunkers: - "fixed": a simple, low cpu overhead, fixed blocksize chunker, optionally supporting a header block of different size. - "buzhash": variable, content-defined blocksize, uses a rolling hash computed by the Buzhash_ algorithm. For some more general usage hints see also ``--chunker-params``. "fixed" chunker +++++++++++++++ The fixed chunker triggers (chunks) at even-spaced offsets, e.g. every 4MiB, producing chunks of same block size (the last chunk is not required to be full-size). Optionally, it supports processing a differently sized "header" first, before it starts to cut chunks of the desired block size. The default is not to have a differently sized header. ``borg create --chunker-params fixed,BLOCK_SIZE[,HEADER_SIZE]`` - BLOCK_SIZE: no default value, multiple of the system page size (usually 4096 bytes) recommended. E.g.: 4194304 would cut 4MiB sized chunks. - HEADER_SIZE: optional, defaults to 0 (no header). The fixed chunker also supports processing sparse files (reading only the ranges with data and seeking over the empty hole ranges). ``borg create --sparse --chunker-params fixed,BLOCK_SIZE[,HEADER_SIZE]`` "buzhash" chunker +++++++++++++++++ The buzhash chunker triggers (chunks) when the last HASH_MASK_BITS bits of the hash are zero, producing chunks with a target size of 2^HASH_MASK_BITS bytes. Buzhash is **only** used for cutting the chunks at places defined by the content, the buzhash value is **not** used as the deduplication criteria (we use a cryptographically strong hash/MAC over the chunk contents for this, the id_hash). The idea of content-defined chunking is assigning every byte where a cut *could* be placed a hash. The hash is based on some number of bytes (the window size) before the byte in question. Chunks are cut where the hash satisfies some condition (usually "n numbers of trailing/leading zeroes"). This causes chunks to be cut in the same location relative to the file's contents, even if bytes are inserted or removed before/after a cut, as long as the bytes within the window stay the same. This results in a high chance that a single cluster of changes to a file will only result in 1-2 new chunks, aiding deduplication. Using normal hash functions this would be extremely slow, requiring hashing approximately ``window size * file size`` bytes. A rolling hash is used instead, which allows to add a new input byte and compute a new hash as well as *remove* a previously added input byte from the computed hash. This makes the cost of computing a hash for each input byte largely independent of the window size. Borg defines minimum and maximum chunk sizes (CHUNK_MIN_EXP and CHUNK_MAX_EXP, respectively) which narrows down where cuts may be made, greatly reducing the amount of data that is actually hashed for content-defined chunking. ``borg create --chunker-params buzhash,CHUNK_MIN_EXP,CHUNK_MAX_EXP,HASH_MASK_BITS,HASH_WINDOW_SIZE`` can be used to tune the chunker parameters, the default is: - CHUNK_MIN_EXP = 19 (minimum chunk size = 2^19 B = 512 kiB) - CHUNK_MAX_EXP = 23 (maximum chunk size = 2^23 B = 8 MiB) - HASH_MASK_BITS = 21 (target chunk size ~= 2^21 B = 2 MiB) - HASH_WINDOW_SIZE = 4095 [B] (`0xFFF`) The buzhash table is altered by XORing it with a seed randomly generated once for the repository, and stored encrypted in the keyfile. This is to prevent chunk size based fingerprinting attacks on your encrypted repo contents (to guess what files you have based on a specific set of chunk sizes). .. _cache: The cache --------- The **files cache** is stored in ``cache/files`` and is used at backup time to quickly determine whether a given file is unchanged and we have all its chunks. In memory, the files cache is a key -> value mapping (a Python *dict*) and contains: * key: id_hash of the encoded, absolute file path * value: - file inode number - file size - file ctime_ns (or mtime_ns) - age (0 [newest], 1, 2, 3, ..., BORG_FILES_CACHE_TTL - 1) - list of chunk ids representing the file's contents To determine whether a file has not changed, cached values are looked up via the key in the mapping and compared to the current file attribute values. If the file's size, timestamp and inode number is still the same, it is considered not to have changed. In that case, we check that all file content chunks are (still) present in the repository (we check that via the chunks cache). If everything is matching and all chunks are present, the file is not read / chunked / hashed again (but still a file metadata item is written to the archive, made from fresh file metadata read from the filesystem). This is what makes borg so fast when processing unchanged files. If there is a mismatch or a chunk is missing, the file is read / chunked / hashed. Chunks already present in repo won't be transferred to repo again. The inode number is stored and compared to make sure we distinguish between different files, as a single path may not be unique across different archives in different setups. Not all filesystems have stable inode numbers. If that is the case, borg can be told to ignore the inode number in the check via --files-cache. The age value is used for cache management. If a file is "seen" in a backup run, its age is reset to 0, otherwise its age is incremented by one. If a file was not seen in BORG_FILES_CACHE_TTL backups, its cache entry is removed. See also: :ref:`always_chunking` and :ref:`a_status_oddity` The files cache is a python dictionary, storing python objects, which generates a lot of overhead. Borg can also work without using the files cache (saves memory if you have a lot of files or not much RAM free), then all files are assumed to have changed. This is usually much slower than with files cache. The on-disk format of the files cache is a stream of msgpacked tuples (key, value). Loading the files cache involves reading the file, one msgpack object at a time, unpacking it, and msgpacking the value (in an effort to save memory). The **chunks cache** is stored in ``cache/chunks`` and is used to determine whether we already have a specific chunk, to count references to it and also for statistics. The chunks cache is a key -> value mapping and contains: * key: - chunk id_hash * value: - reference count - size The chunks cache is a HashIndex_. Due to some restrictions of HashIndex, the reference count of each given chunk is limited to a constant, MAX_VALUE (introduced below in HashIndex_), approximately 2**32. If a reference count hits MAX_VALUE, decrementing it yields MAX_VALUE again, i.e. the reference count is pinned to MAX_VALUE. .. _cache-memory-usage: Indexes / Caches memory usage ----------------------------- Here is the estimated memory usage of Borg - it's complicated:: chunk_size ~= 2 ^ HASH_MASK_BITS (for buzhash chunker, BLOCK_SIZE for fixed chunker) chunk_count ~= total_file_size / chunk_size repo_index_usage = chunk_count * 48 chunks_cache_usage = chunk_count * 40 files_cache_usage = total_file_count * 240 + chunk_count * 80 mem_usage ~= repo_index_usage + chunks_cache_usage + files_cache_usage = chunk_count * 164 + total_file_count * 240 Due to the hashtables, the best/usual/worst cases for memory allocation can be estimated like that:: mem_allocation = mem_usage / load_factor # l_f = 0.25 .. 0.75 mem_allocation_peak = mem_allocation * (1 + growth_factor) # g_f = 1.1 .. 2 All units are Bytes. It is assuming every chunk is referenced exactly once (if you have a lot of duplicate chunks, you will have fewer chunks than estimated above). It is also assuming that typical chunk size is 2^HASH_MASK_BITS (if you have a lot of files smaller than this statistical medium chunk size, you will have more chunks than estimated above, because 1 file is at least 1 chunk). If a remote repository is used the repo index will be allocated on the remote side. The chunks cache, files cache and the repo index are all implemented as hash tables. A hash table must have a significant amount of unused entries to be fast - the so-called load factor gives the used/unused elements ratio. When a hash table gets full (load factor getting too high), it needs to be grown (allocate new, bigger hash table, copy all elements over to it, free old hash table) - this will lead to short-time peaks in memory usage each time this happens. Usually does not happen for all hashtables at the same time, though. For small hash tables, we start with a growth factor of 2, which comes down to ~1.1x for big hash tables. E.g. backing up a total count of 1 Mi (IEC binary prefix i.e. 2^20) files with a total size of 1TiB. a) with ``create --chunker-params buzhash,10,23,16,4095`` (custom): mem_usage = 2.8GiB b) with ``create --chunker-params buzhash,19,23,21,4095`` (default): mem_usage = 0.31GiB .. note:: There is also the ``--files-cache=disabled`` option to disable the files cache. You'll save some memory, but it will need to read / chunk all the files as it can not skip unmodified files then. HashIndex --------- The chunks cache and the repository index are stored as hash tables, with only one slot per bucket, spreading hash collisions to the following buckets. As a consequence the hash is just a start position for a linear search. If a key is looked up that is not in the table, then the hash table is searched from the start position (the hash) until the first empty bucket is reached. This particular mode of operation is open addressing with linear probing. When the hash table is filled to 75%, its size is grown. When it's emptied to 25%, its size is shrunken. Operations on it have a variable complexity between constant and linear with low factor, and memory overhead varies between 33% and 300%. If an element is deleted, and the slot behind the deleted element is not empty, then the element will leave a tombstone, a bucket marked as deleted. Tombstones are only removed by insertions using the tombstone's bucket, or by resizing the table. They present the same load to the hash table as a real entry, but do not count towards the regular load factor. Thus, if the number of empty slots becomes too low (recall that linear probing for an element not in the index stops at the first empty slot), the hash table is rebuilt. The maximum *effective* load factor, i.e. including tombstones, is 93%. Data in a HashIndex is always stored in little-endian format, which increases efficiency for almost everyone, since basically no one uses big-endian processors any more. HashIndex does not use a hashing function, because all keys (save manifest) are outputs of a cryptographic hash or MAC and thus already have excellent distribution. Thus, HashIndex simply uses the first 32 bits of the key as its "hash". The format is easy to read and write, because the buckets array has the same layout in memory and on disk. Only the header formats differ. The on-disk header is ``struct HashHeader``: - First, the HashIndex magic, the eight byte ASCII string "BORG_IDX". - Second, the signed 32-bit number of entries (i.e. buckets which are not deleted and not empty). - Third, the signed 32-bit number of buckets, i.e. the length of the buckets array contained in the file, and the modulus for index calculation. - Fourth, the signed 8-bit length of keys. - Fifth, the signed 8-bit length of values. This has to be at least four bytes. All fields are packed. The HashIndex is *not* a general purpose data structure. The value size must be at least 4 bytes, and these first bytes are used for in-band signalling in the data structure itself. The constant MAX_VALUE (defined as 2**32-1025 = 4294966271) defines the valid range for these 4 bytes when interpreted as an uint32_t from 0 to MAX_VALUE (inclusive). The following reserved values beyond MAX_VALUE are currently in use (byte order is LE): - 0xffffffff marks empty buckets in the hash table - 0xfffffffe marks deleted buckets in the hash table HashIndex is implemented in C and wrapped with Cython in a class-based interface. The Cython wrapper checks every passed value against these reserved values and raises an AssertionError if they are used. .. _data-encryption: Encryption ---------- .. seealso:: The :ref:`borgcrypto` section for an in-depth review. AEAD modes ~~~~~~~~~~ For new repositories, borg only uses modern AEAD ciphers: AES-OCB or CHACHA20-POLY1305. For each borg invocation, a new sessionkey is derived from the borg key material and the 48bit IV starts from 0 again (both ciphers internally add a 32bit counter to our IV, so we'll just count up by 1 per chunk). The encryption layout is best seen at the bottom of this diagram: .. figure:: encryption-aead.png :figwidth: 100% :width: 100% No special IV/counter management is needed here due to the use of session keys. A 48 bit IV is way more than needed: If you only backed up 4kiB chunks (2^12B), the IV would "limit" the data encrypted in one session to 2^(12+48)B == 2.3 exabytes, meaning you would run against other limitations (RAM, storage, time) way before that. In practice, chunks are usually bigger, for big files even much bigger, giving an even higher limit. Legacy modes ~~~~~~~~~~~~ Old repositories (which used AES-CTR mode) are supported read-only to be able to ``borg transfer`` their archives to new repositories (which use AEAD modes). AES-CTR mode is not supported for new repositories and the related code will be removed in a future release. Both modes ~~~~~~~~~~ Encryption keys (and other secrets) are kept either in a key file on the client ('keyfile' mode) or in the repository config on the server ('repokey' mode). In both cases, the secrets are generated from random and then encrypted by a key derived from your passphrase (this happens on the client before the key is stored into the keyfile or as repokey). The passphrase is passed through the ``BORG_PASSPHRASE`` environment variable or prompted for interactive usage. .. _key_files: Key files --------- .. seealso:: The :ref:`key_encryption` section for an in-depth review of the key encryption. When initializing a repository with one of the "keyfile" encryption modes, Borg creates an associated key file in ``$HOME/.config/borg/keys``. The same key is also used in the "repokey" modes, which store it in the repository in the configuration file. The internal data structure is as follows: version currently always an integer, 2 repository_id the ``id`` field in the ``config`` ``INI`` file of the repository. crypt_key the initial key material used for the AEAD crypto (512 bits) id_key the key used to MAC the plaintext chunk data to compute the chunk's id chunk_seed the seed for the buzhash chunking table (signed 32 bit integer) These fields are packed using msgpack_. The utf-8 encoded passphrase is processed with argon2_ to derive a 256 bit key encryption key (KEK). Then the KEK is used to encrypt and authenticate the packed data using the chacha20-poly1305 AEAD cipher. The result is stored in a another msgpack_ formatted as follows: version currently always an integer, 1 salt random 256 bits salt used to process the passphrase argon2_* some parameters for the argon2 kdf algorithm the algorithms used to process the passphrase (currently the string ``argon2 chacha20-poly1305``) data The encrypted, packed fields. The resulting msgpack_ is then encoded using base64 and written to the key file, wrapped using the standard ``textwrap`` module with a header. The header is a single line with a MAGIC string, a space and a hexadecimal representation of the repository id. .. _data-compression: Compression ----------- Borg supports the following compression methods, each identified by a ctype value in the range between 0 and 255 (and augmented by a clevel 0..255 value for the compression level): - none (no compression, pass through data 1:1), identified by 0x00 - lz4 (low compression, but super fast), identified by 0x01 - zstd (level 1-22 offering a wide range: level 1 is lower compression and high speed, level 22 is higher compression and lower speed) - identified by 0x03 - zlib (level 0-9, level 0 is no compression [but still adding zlib overhead], level 1 is low, level 9 is high compression), identified by 0x05 - lzma (level 0-9, level 0 is low, level 9 is high compression), identified by 0x02. The type byte is followed by a byte indicating the compression level. Speed: none > lz4 > zlib > lzma, lz4 > zstd Compression: lzma > zlib > lz4 > none, zstd > lz4 Be careful, higher compression levels might use a lot of resources (CPU/memory). The overall speed of course also depends on the speed of your target storage. If that is slow, using a higher compression level might yield better overall performance. You need to experiment a bit. Maybe just watch your CPU load, if that is relatively low, increase compression until 1 core is 70-100% loaded. Even if your target storage is rather fast, you might see interesting effects: while doing no compression at all (none) is a operation that takes no time, it likely will need to store more data to the storage compared to using lz4. The time needed to transfer and store the additional data might be much more than if you had used lz4 (which is super fast, but still might compress your data about 2:1). This is assuming your data is compressible (if you back up already compressed data, trying to compress them at backup time is usually pointless). Compression is applied after deduplication, thus using different compression methods in one repo does not influence deduplication. See ``borg create --help`` about how to specify the compression level and its default. Lock files ---------- Borg uses locks to get (exclusive or shared) access to the cache and the repository. The locking system is based on renaming a temporary directory to `lock.exclusive` (for exclusive locks). Inside this directory, there is a file indicating hostname, process id and thread id of the lock holder. There is also a json file `lock.roster` that keeps a directory of all shared and exclusive lockers. If the process is able to rename a temporary directory (with the host/process/thread identifier prepared inside it) in the resource directory to `lock.exclusive`, it has the lock for it. If renaming fails (because this directory already exists and its host/process/thread identifier denotes a thread on the host which is still alive), lock acquisition fails. The cache lock is usually in `~/.cache/borg/REPOID/lock.*`. The repository lock is in `repository/lock.*`. In case you run into troubles with the locks, you can use the ``borg break-lock`` command after you first have made sure that no Borg process is running on any machine that accesses this resource. Be very careful, the cache or repository might get damaged if multiple processes use it at the same time. Checksumming data structures ---------------------------- As detailed in the previous sections, Borg generates and stores various files containing important meta data, such as the repository index, repository hints, chunks caches and files cache. Data corruption in these files can damage the archive data in a repository, e.g. due to wrong reference counts in the chunks cache. Only some parts of Borg were designed to handle corrupted data structures, so a corrupted files cache may cause crashes or write incorrect archives. Therefore, Borg calculates checksums when writing these files and tests checksums when reading them. Checksums are generally 64-bit XXH64 hashes. The canonical xxHash representation is used, i.e. big-endian. Checksums are stored as hexadecimal ASCII strings. For compatibility, checksums are not required and absent checksums do not trigger errors. The mechanisms have been designed to avoid false-positives when various Borg versions are used alternately on the same repositories. Checksums are a data safety mechanism. They are not a security mechanism. .. rubric:: Choice of algorithm XXH64 has been chosen for its high speed on all platforms, which avoids performance degradation in CPU-limited parts (e.g. cache synchronization). Unlike CRC32, it neither requires hardware support (crc32c or CLMUL) nor vectorized code nor large, cache-unfriendly lookup tables to achieve good performance. This simplifies deployment of it considerably (cf. src/borg/algorithms/crc32...). Further, XXH64 is a non-linear hash function and thus has a "more or less" good chance to detect larger burst errors, unlike linear CRCs where the probability of detection decreases with error size. The 64-bit checksum length is considered sufficient for the file sizes typically checksummed (individual files up to a few GB, usually less). xxHash was expressly designed for data blocks of these sizes. Lower layer — file_integrity ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To accommodate the different transaction models used for the cache and repository, there is a lower layer (borg.crypto.file_integrity.IntegrityCheckedFile) wrapping a file-like object, performing streaming calculation and comparison of checksums. Checksum errors are signalled by raising an exception (borg.crypto.file_integrity.FileIntegrityError) at the earliest possible moment. .. rubric:: Calculating checksums Before feeding the checksum algorithm any data, the file name (i.e. without any path) is mixed into the checksum, since the name encodes the context of the data for Borg. The various indices used by Borg have separate header and main data parts. IntegrityCheckedFile allows borg to checksum them independently, which avoids even reading the data when the header is corrupted. When a part is signalled, the length of the part name is mixed into the checksum state first (encoded as an ASCII string via `%10d` printf format), then the name of the part is mixed in as an UTF-8 string. Lastly, the current position (length) in the file is mixed in as well. The checksum state is not reset at part boundaries. A final checksum is always calculated in the same way as the parts described above, after seeking to the end of the file. The final checksum cannot prevent code from processing corrupted data during reading, however, it prevents use of the corrupted data. .. rubric:: Serializing checksums All checksums are compiled into a simple JSON structure called *integrity data*: .. code-block:: json { "algorithm": "XXH64", "digests": { "HashHeader": "eab6802590ba39e3", "final": "e2a7f132fc2e8b24" } } The *algorithm* key notes the used algorithm. When reading, integrity data containing an unknown algorithm is not inspected further. The *digests* key contains a mapping of part names to their digests. Integrity data is generally stored by the upper layers, introduced below. An exception is the DetachedIntegrityCheckedFile, which automatically writes and reads it from a ".integrity" file next to the data file. It is used for archive chunks indexes in chunks.archive.d. Upper layer ~~~~~~~~~~~ Storage of integrity data depends on the component using it, since they have different transaction mechanisms, and integrity data needs to be transacted with the data it is supposed to protect. .. rubric:: Main cache files: chunks and files cache The integrity data of the ``chunks`` and ``files`` caches is stored in the cache ``config``, since all three are transacted together. The ``[integrity]`` section is used: .. code-block:: ini [cache] version = 1 repository = 3c4...e59 manifest = 10e...21c timestamp = 2017-06-01T21:31:39.699514 key_type = 2 previous_location = /path/to/repo [integrity] manifest = 10e...21c chunks = {"algorithm": "XXH64", "digests": {"HashHeader": "eab...39e3", "final": "e2a...b24"}} The manifest ID is duplicated in the integrity section due to the way all Borg versions handle the config file. Instead of creating a "new" config file from an internal representation containing only the data understood by Borg, the config file is read in entirety (using the Python ConfigParser) and modified. This preserves all sections and values not understood by the Borg version modifying it. Thus, if an older versions uses a cache with integrity data, it would preserve the integrity section and its contents. If a integrity-aware Borg version would read this cache, it would incorrectly report checksum errors, since the older version did not update the checksums. However, by duplicating the manifest ID in the integrity section, it is easy to tell whether the checksums concern the current state of the cache. Integrity errors are fatal in these files, terminating the program, and are not automatically corrected at this time. .. rubric:: chunks.archive.d Indices in chunks.archive.d are not transacted and use DetachedIntegrityCheckedFile, which writes the integrity data to a separate ".integrity" file. Integrity errors result in deleting the affected index and rebuilding it. This logs a warning and increases the exit code to WARNING (1). .. _integrity_repo: .. rubric:: Repository index and hints The repository associates index and hints files with a transaction by including the transaction ID in the file names. Integrity data is stored in a third file ("integrity."). Like the hints file, it is msgpacked: .. code-block:: python { 'version': 2, 'hints': '{"algorithm": "XXH64", "digests": {"final": "411208db2aa13f1a"}}', 'index': '{"algorithm": "XXH64", "digests": {"HashHeader": "846b7315f91b8e48", "final": "cb3e26cadc173e40"}}' } The *version* key started at 2, the same version used for the hints. Since Borg has many versioned file formats, this keeps the number of different versions in use a bit lower. The other keys map an auxiliary file, like *index* or *hints* to their integrity data. Note that the JSON is stored as-is, and not as part of the msgpack structure. Integrity errors result in deleting the affected file(s) (index/hints) and rebuilding the index, which is the same action taken when corruption is noticed in other ways (e.g. HashIndex can detect most corrupted headers, but not data corruption). A warning is logged as well. The exit code is not influenced, since remote repositories cannot perform that action. Raising the exit code would be possible for local repositories, but is not implemented. Unlike the cache design this mechanism can have false positives whenever an older version *rewrites* the auxiliary files for a transaction created by a newer version, since that might result in a different index (due to hash-table resizing) or hints file (hash ordering, or the older version 1 format), while not invalidating the integrity file. For example, using 1.1 on a repository, noticing corruption or similar issues and then running ``borg-1.0 check --repair``, which rewrites the index and hints, results in this situation. Borg 1.1 would erroneously report checksum errors in the hints and/or index files and trigger an automatic rebuild of these files. HardLinkManager and the hlid concept ------------------------------------ Dealing with hard links needs some extra care, implemented in borg within the HardLinkManager class: - At archive creation time, fs items with st_nlink > 1 indicate that they are a member of a group of hardlinks all pointing to the same inode. For such fs items, the archived item includes a hlid attribute (hardlink id), which is computed like H(st_dev, st_ino). Thus, if archived items have the same hlid value, they pointed to the same inode and form a group of hardlinks. Besides that, nothing special is done for any member of the group of hardlinks, meaning that e.g. for regular files, each archived item will have a chunks list. - At extraction time, the presence of a hlid attribute indicates that there might be more hardlinks coming, pointing to the same content (inode), thus borg will remember the "hlid to extracted path" mapping, so it will know the correct path for extracting (hardlinking) the next hardlink of that group / with the same hlid. - This symmetric approach (each item has all the information, e.g. the chunks list) simplifies dealing with such items a lot, especially for partial extraction, for the FUSE filesystem, etc. - This is different from the asymmetric approach of old borg versions (< 2.0) and also from tar which have the concept of a main item (first hardlink, has the content) and content-less secondary items with by-name back references for each subsequent hardlink, causing lots of complications when dealing with them. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/encryption-aead.odg0000644000076500000240000005427614646713253021175 0ustar00twstaffPKPW.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKPWConfigurations2/toolpanel/PKPWConfigurations2/floater/PKPWConfigurations2/statusbar/PKPWConfigurations2/popupmenu/PKPWConfigurations2/progressbar/PKPWConfigurations2/menubar/PKPWConfigurations2/images/Bitmaps/PKPWConfigurations2/toolbar/PKPWConfigurations2/accelerator/PKPW styles.xml\r8}߯`ijEK8SIefT<DB'!O~ɢq!7ɒ7S[@>}꧇McZ$$WYD$[ >zN?+\&$np܂=px㬘, 4T$n 4V=&Ne7!4P:'M2)FkKP6%$Tc*}eIY,nXrFfDR̓u[vFbˑW-~4g-=sBYt Nkrw+*nhן0jocreutφʾQ N%DeEz 54؀90ҎXIw([9w4Ƞy\O5*ׯ l%)$.ISdxLĈe|B(%|UR*>ʊHXm`] Ѩ+TтV+B\),I"ǜFW [\Iuկtcީ?CϟyJ8)=&cw:-:] p2t$9Wq֦,d\ -)ٵ8M[ WGI;TSWntë*zXym񚛋mcMcVXXo=wMwMhi$wd-m声pC 1 ƨXF]]L_Aڮ aRMk$$(t}1+k+5"Sq)End)ǩ$v4̑P.&QVpYf4UZEM)Z&<t^qzYt'qj4QgG>1 $k^Bó!H;qΈE"4>BE"49Byqzz6F/4NΈˌӐ?D+Pj5mZ7@`PUvܻeE H ;K@Ai (+dҍ#2u44lMvvU^zH$L䆸oA8gmTQd̆Z$rMRK21u%1m3}iHؗWT_-. TЬ~jm PZQJ/V4QR4R4@R7@"l o5F{U ^(:'ad:id.akA AԔVY^DgOAJO1fdvjĔ -I ؚ2avSSg{V5i}t"~j@U;#?B /Dv@NFhb4k~П)[tOi^̛Aftڅ۾R2&W.Sm2FFoP|K2GԪB^\tqщⷺ ]ȔfSݥA]ÓܥI]G~#f}1 WC{N7zȵL_5//Zc;ǏMe/HGC?: 5~FCr5#]=ysaӱ^rlmܿ 0Q/Z@(|S}ܮEE?#>W9-$ bl.З ͻß ׳|=kxDwoaϢ]qb>d'h%'%v"r XqjG_#~I~|O?}cY8OJ,K4oЖo{]ÕbMv6K:;-8h/܈iˀC{{_>z+-ԟ݋@~XTS gWЬЇapAN'Iy)"k&Cf]y>:C%4fၢ(}Qj,_XQkb &|.af~6H:xcǢ4J FO3|吠(acKKokʡ*3xKկoԔ$v>AM&#oaQMŲII,,$tf)XA/g]7;ㅃqS4 G:Ph8}8Ny> ,jU66+\ RHtI`5c8@Sv;4pMVj//W}?PK ̧ UPKPW settings.xmlZ[s8~_a3t$M$ṱB&laTd#q#cJlBmyH@s9ߑs١OXHe谘;aen4lU)1q`+S,g|9͔r˅w1[raJya=A89O2G2Ceeҕ\@rrP: M2xX~W5X&gSb6q࿣Bt5uO6bnB8WY* *-?yc .sr`%zrQ~_3&Ro!0r7z.<$L*[?੊?99J ~G,5B?.~9=M ĞEj_*}? 7O) {]4~PS*HXmc~9ň*Jx8 |Sp)2!z[r\Kٿ+56a2;!w0+bnĦj \JƘd 1biP-ދToph$%aHmPNŤּA ({H/'UPB,ryLF2BYKpsEއrCAd.qߪ>8"s(mz8` [|m52pE[ֹNQb·Y5,[4ӈ fٸϗ,|bXXs?zNKJ1YYyrrXHHQ,ᦾ t-GgN9Z}zV̫:0&0!C2yZLi6Ƥ`=6ȹs"jL(e )~\d% ͪ|f8cL`%f*1UW<ՖLDXE:$zj{''`QMX|'!q& Eߩ0`H;Y},Fd@K^v`F hD;v@-;x%B:`>!D_Nw"d=-?u4H Qswȩb0#4u}rD曣~'ƽ>&էBR'L, .;=ŧPTYHXOrmd0/x8ϐ-Y&rn #ool̵&ER)QP 3ey%j32k^.$wIk̠ e zV\c$=Guqz^*CΙhwfi6IsG34&}ټ ;rT`mo IVD*{Bi[_ cKMR7s?{rۢo7=޷Qʝ>5헩wqkT_6 c6HmϻFst_G];, ڰ~֝;8ʛ[^ݨގfh40Px24g@wѽn7gfih70vZ{{m;p0zOت{,_aHEUZ4J0e$* oiSyT~5{WxoPKp`{c)PKPW8!(-(-Thumbnails/thumbnail.pngPNG  IHDRj[!iPLTE     ! !$" ,*%&'3-;3#$$"%*&.!%)-,,,(,1.3"-277##57$33305;38=;;;5:A9>C>A+;F2>@B[_fqfwl}@@oqw|éC̱FպJMNQSXƈɛĖП›ҤȩֹťČʑЕĂʨα׽þɴܹʃ׋ݪ뙙孵ٺˇӌؐے٩֪ٸՁؔx IDATx|ys|W$Z䑉V q,@ &ENbiGs8"&i-vP?@sf;OnMl67%TUt.w79;SGzywҮĮ}?ywvwއUT؜dw ycVO uLۋau`Y/Ħ>txz i~bwN qĺ 儒{ojE1&mdACV*%d )[<@<,ѕ%3l^%[XyLHP sb#N0)D+E@,z k\،+ .2-HfؖD i*vM(*D5R%#ʽr>!Sm&?W/T&0!CT>k P29| p!U |c26WQHU8dYQi?@g}SXE, zL.s(GEl ˘3[1L! ,?A LhzŖ=7CCldXS! R5$l ECf94c)"xd X4kĬBx),ιrFf>?ʭQC@plǖzj{^/TpXUB7@ԅ֏YpiV `$]&n'PT `}=x*Nq'`Yiȯy5w޸,PlӶ*8{NQ S2G.g,FnBa2%At0*w|>r]&8'ൂ[aH*6J0s jӋ(^&f cg _ί9DV È4Ņl,kLxø1ʳ\ɱA".*4:!r$R$1عb.T `Q<-@8ZC4ljh>%UDC*R+'Q qpEX(m~DT0ڰA!Pcdq(GZ]1`R@p!`>ǰaohk-2yH5JmJ: 3 @)1j0 $=Vh T67\0@@=L :kL"@cه!pX sύB>W 8E\a**H'TN39>( (#1 @1q,Q@Ub*Q<6?-hr%bZ˲jl[a$a I.ȲZ{RW`& 6LjZM/TM1afQ&20bMA"`xe)*K(-Hmߧ"Ah2x$L-Jy!y^\Be&0r1*(hỜ@Kxk3ݛW U-'U@aN&`{, (((#"O`EKDjF> uO<Ͱ 1VwfX %Y WL(K=c}!D bXeM $9(K*0E.R\aEj##3AR>N{:.R3*?Q-29;r`@`x@@@@2 P BA:i;6%}S2Y)V .3{~ѯNw.3K2fոCˡd"qT$ 4᭩fXHtCUP"3k4p QKP KP1MT;T\2Q\^@'T(.  (5x9m@U+@DrU=zfd9wJ}wF6&_[e Z  Kq% oWR`DdxmNp2}6XlYx8 V[w7@"س7DafG7?}ms*>[]ms˝c'qvg[Z ܸG[A3mM9iO73}wK˦%]y+ ?y0yHsQ\mꜫ|O'dhy *I ~x8uv pHX7P7H7GyMo";[_]ۙ7g(@͏G>OP'~s'~> x$s*8q'>?8z1hikіMNkRFenq7lmpڴ#Nkw0z - 77ϽË_=o?OGxz=3n??}k?G\ч~c'~H:xc/e|i  ?8psNkxmmm9[Z0޻һmxtJ7a"( E./C'l&yi)z*NpN\ER"$tN`Lbϙ ~ޠ<@+0 +G93\OD]DDD#eeڬ6Qkוp 4 HUYm`K6mZqH!bɄ$Ewm *HFB { ٢j%>BQZ<9B-+|Ly2m+wrUd*^X蘲U]]<΢#4(Iv9Wk{ d@L \dj(L뚏lFvDZB7@sA_..2aOx +a-2H`z̅(AQ Q2f oDT91E7JDXO<7sw2U]R1@YYϓ*(VbmDD|PdՇYL !D*7RE]N1 E ">|CD/k)(#;ngT+ @(Qj|~} @yGw ޞ|=Cf.nⒿy>۟'/܀e3ht&]ٱY@Eh,(8!jPfdP 0nZDPu+" @ @\QD g, rrޘu> /O;Q+Z_Ҵޑ[^wSKg Q{:ls>oqvA\% P%dkm{޴Ӷm6 @zMtpǝtR1ۣjc@K[:-mlh_afCFg 9ي"DQ*(QQQQY/O_oD.x3_/[{U/}_^^ X @u)g? ںu ܋[_~_~. 0?o|ޏSQ?K k[]/ E|3l7L`u!  ٞJm?Cf/RY$Ivno_@L(sMK>z4pM]l!{O#Ty*W2@r8^c*)a`9P|^j! @ @ @ @ޚF6`NPF @ @ @ @ @ @ @ ᇷ>^|m~3Ťp.&B SͩTH$zQ @F)A2R‘T*S\ Ro.KDNYE BR @#%IŦp$Sl _eyP70ő3fHYx^7L!Y^12]jF03h!srB! \@em#(CQ,hBVL@Jb@P" %xNkĤ'%:攊 IDATXsrLڟ`*0 |ٓRLP1ɸ`<bcy29/. WpTٯ,]l)˻b"! ;?H&*s"Ha-@] . 'Q<'E W F< |d\t9IPO 51J=aTt g *UqC}B@e0B*0 S$T*%JpcG w7NfdH+:+;3@1]at;W|9̌@ @ @(׏g;qU:Sf:pk 1 0{^9{m± Bjy ty ~D( ]T?u к*FR]/%8SJbA{eL:NI.23:l 6@ F F F F F F F F@_|{s.boH Tk-}u-=XIyw,C˖8tvٚGjo~4zv '?l%wozlMדkzfCk?XZhk[ 㑮;wj[nt= w<|s7w=cC>xyĺ-vMV.M'sSW m'w'kB-?xήc7?I絇<ڹv9H`GׁZO]̊y}kŊqgw:+Yon~\T0[3ИV,Z(C v90 c9Z>v`Cp:YK$*]=3J岅!!k`hO9Kr/ _"E>,4nt7 iis-\$ 8Ĵ藻? eI;o'mSX˫s?u;Iti8X_Zv-^mO vm}9- #x' 3M{5EY & `oO`MI}kI[c?@7V)xK $ʞ)@Sj,7hnH ݶ5ͶD/?7zg^~¶@Ću\YdO !ҧ#4:70l[P{xgd嘑oc+b8C-e=fB=i jmpLs9+R(aZ~s]yZ%)mvPMpDc#]( Ҷ1v0et:RP[R4XH<;iƬ/H@Jݼlcbͦr"#ĨGXQۖz`oHB/XǣgQؘV[?6?#PJDګXhh3a^'vAHt JNlm OfIdžLe`0hvc8Id+'MW:a D'}NA[\$턣@R%I Cj4,L C d0["3xlkr _}CN2[~8-tE!EHwWXՏ뗨h~pt+|܏0$iT;6U6d"vŸֲ { [SbIq,T$>9Vnsn>,PZB|YHZ2ˮ."n+GI$4}4U"[ܮN11iRx(YUQʥn{wMxF<$$&! 2&g)!u0 A$$|Ld0 )g%t~etH}^::ʻ\_XFaǮҹ(6gߓhmRqIߧY[xT5rX_ ; JɖRRAV,xOSDJ|)},MH ,>HPmXX C) & &챳`Қ%u B9&Q]:9tS* ouXq\7S}ըFK|`| L(@wx>Q`Y-;:Q4yhve玸qL$Qg75 @ԻFU#4<  uL}&X!_O51{<o?~z*vy9얕4&C6q0eܻ?U{Kjm9۵Uk˓\Q'X,|HH8¤U d]];:P0;<l5M]]5I3`v袚upNE zNEypLF3\[,ı}}8. 5qML` c@ I8Shh|J"(M_^KH4fcc (jHU=ǩD)oQ9e 4а,5VI.: Qui~u z\LdMϞ{R/zIhm\E\:Pu#l.5 )o$mch:jsFJ|.G7Oǟ|/,4EXl~kIrz.3p8?,w1]:M7ݲ1]]TjlWQaO~XTC2'W/y8:N l&tjL^}ICm1/n{w6Bs +2aU.tfuR{aN6z%=U)AR2 f]6WE@{ rP2/A^.nt0WiÍyG~ރ9}޿j) ,o6P.riS*vZڪo) _d'݃PsBsCKA\( ukb8Y PK PKPWmeta.xmlTKo W^m ~#RCTV-xKkl6ůFJ>{ sn@Am@2Ņa$OD0JBu<;Qӈ!\4$i \Xw|~ԣVmGn<&^ւ |OHplbneADt[ox>rM<32>N<8ȦZ1a!>sC mi1WBnſPK*u7%PKPW.++mimetypePKPWQConfigurations2/toolpanel/PKPWConfigurations2/floater/PKPWConfigurations2/statusbar/PKPWConfigurations2/popupmenu/PKPW/Configurations2/progressbar/PKPWiConfigurations2/menubar/PKPWConfigurations2/images/Bitmaps/PKPWConfigurations2/toolbar/PKPWConfigurations2/accelerator/PKPW ̧ U Lstyles.xmlPKPWp`{c) +settings.xmlPKPW8!(-(-Thumbnails/thumbnail.pngPKPW >Ccontent.xmlPKPWsKPmeta.xmlPKPW*u7%SMETA-INF/manifest.xmlPK+}T././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/encryption-aead.png0000644000076500000240000040245514646713253021204 0ustar00twstaffPNG  IHDR['( pHYsC IDATxw@?E*6EłD#b7Q vEaFƒb[ M`/H+6PQ@DEA1< 2;{w=3  CF@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@F@ j-@FЂt𾱡 U%yIpAúx43w3ƟhykWiN' K]=QՊeU#XcC9X:*;'/۾.~h.4]OyF<cz'dCR\"&PP:vPD։[5| <ҁ'+ j-@F@ j-@<.A뫣ӬY3sss\O,:::((H++u떄tڵJ*oJᡡ t?>7nmР% (}j,U?ڦM*U뫧סCؽ{q>177~1vɓ'dccSPP`dd;A̼zjXX۷ouuu6mjjjڭ[J*)V?֮]p'3܊}Ƙ ]t)cZjZ§>KnHNNRٳg:wm Ƙ.f/yyyʕû,^[^{{˗iF\HMVo߾)))|ZMe__߮]6m<}CN]PPSPB Xzܹ1|5j0ƶl۳gLI0hР*U0z쉫PT/޴i 'N8qġC&MTꯆmڵK}Q|QZ5Ƙ LRVz}:7n|DA "##׭[WV-w,Sرcr\ނcǎi\çC􈎎f۷/111771V|y3uYfO:vڌ1 .]466{Μ9s•C 9"F͛@z@]z$''3ƶl2iҤXll͛/_Xy߾}gΜnР/_X˗;w񉏏jj߾L&:uj{1iҤ+Vxxx}vƍƍu6oU yY[[_tWnܸ7((hΝQQQQQQ٦-Z}\?Sttt7mڔqk׮T\nZ,͛7/33S9CCCw㓐S^=z̙3GM0B 2?Tŋ/^8pQ{_޽[i==;wԩS')))++uڴi ::: ޽r_~dq5ww .`mJβzꘘ\~!^i&3ft-[_ 5y?CrWZմiBҭ[7{N2Ei?1V~J*zJi۷ߺu+66V&խ[z̙+vڵW?tttj׮n:}GGG'&&֫WM6/ƔSN;w.00۷UT111ٳԩ#vUWWW;`ѢEO<}yŊo?ڢE >y$..oרQ%?cN? FFFђcJ^b={ͥ|3f̠j7nÍbŊe˖Gib, 8j(IW^~oEfff ɍ5Ruݻw+J]Fׯ_S͍7CpyUG]vxxrǎc/^Yr$[?0*T`լYSR>b~4KKKLF/VuY֭[Gz ]]]r ݺu wO&MǽpdOyϨxyyQ###C}[n9rDF]b[n،155VYTB(îXb@@}?cǎ933aÆ|ٳ ,<ֹsgGGG(q˓K,a+++nvUmYfQ5'''mip UiٲeVV8Ҫ:Ν;ŕ7o===WN4?]q7uB';Zԍ)ieUcTc䔘(MLLT?/_jժSSSk׮=jԨf͚}1f``0eKKǏٳg͚54&NþիW_xjr<00gΜYbŚ5kx崴mfff27n<}͛yqqq_n׮]\\ kҤɸq6lqΝg򖟥%_%..nرQ#F֭ׯO:ҡCoߪy!_5֭СC6mpؤ; codddؤ:[ncɓgիׇ|.\377aVhcϞ=e2͛7le˖NNNnb3Fr0ԩ!a?/ٳ[n=bĈF0Ƣgм"vچ BCCkժ5n8 ݻwN>GA ܵkg͝8q"]sNj{ GGG=xygϞիo1[[[CCC޾]t "3 ޞo8ֶz!!!۶m 4iҩS4yQڵ㉡M֡CW^|16gjBχիW{1feetn |"1WjiT#ce˖iii+ I޼'NL;wPsuUCxxdpp8k155III3rTHPyAAA׮]5k7o%ڵk|װax?K%.OOO^tT# D]gffRʕ+GtN<)~R;w QT ޿_|WPA.B 1*~ wO }ŀQ%9R(EŻ\]]yb} G5޽{߾}{]4pR>}¡Cjƶm PF Ƙbu2ƚ7o.&՘G!9>{1GS%'rpp'''S }]$M_~S8pgTA +esT#)<<+W?~֭[k+D\rnݺթS{w0`aÆtU3fXg@@ѰalllJ)գm 9++{VVV]bBXPP(YsF[8p@XժU>~~~Orooue2L&3~4H1jI?PcCĨF祤 U*VXsf͚JMMM%M/'K+Vݶo߾ݳg޽ _S˗/LҪ4Ҽ_~ɇa]VGGgs6hkС>gΜz/[L͐F4%C&cQJ=zzGݻw-[TJIԜQɉwٳB|VxJ(OʬR6T4a4iݼy*v̙31vQ-nKPժUjN[b3<"*Wl4 e-U T8btq.1`CPsGGG{̙3[nMaJ@600hZzZj~~~W\o p…~ى;oڴI>~˖-&&& X. zvgffR'?hhhH5y7[^^c,443$̢Nb/-|ۺuׇm̘1s挝]ڵm&YRf cСcɓ'Ν߿i ͛7ǏӼ'''5133˰zCBgΜSN5<5zU5)Aɓ' W:N"<<<44TkkbwBe$`hBJ֭FN GGrotU~>>>;wHv>Vs޽{\֭[ϝ;^|ꕹyn .(NxeÆ +VH%QQQqqqL8q߾}PǏתUKL:#jڣ=z'OtvvMHH?)UV婅OyEŖn׮]yUqu^^ޫWZj%)733֭۽{nܸqƍ6[|<666FFFWP qسgϲtttKLL |}͛7o޵kWET9zĉcƍƈZ*WȨI&~dff>{LUN ==F—[nF{1?Ef͌,Xs5?ghhhkk{؄ ^|Yvm5cbbNKJJ*ɱ]<2-L͉'mڴiѢŋ/\gXYY)%(֩S'>ѣ IDATzRU+f?dWffɓ'vԩc``K*\~oP*pZlj߿?)wҥ!C%F^~ɓgϞXXX4k֬sΊxUf믿+UԼysgC}\:^7n8ӧy &\Bߋ+hAOM ų/_۷<''G(88b ^ĉ{'O޺uP_~T~=2ߟP411QR[&2ƍK򂌱CQ5Z`1cRt2==]Rrcw]ÏoI׬YJrss)?P9%200ʒ\"HaqOļI^.~Y > FZGI&99YV5jؿQpHHx&M!T*U:uw$G9Sg[PP@ uyF8W^9kџ򌥦])))4af͚>>>uݻGw.]P95/^(jR :t+ :x1'''Ϛ5}Poرc5c^^^\@J۶mŅ[l4v%[VVVTAccc%.Tضm[(͞;w _~%b֭ٳgÇ{ĮFNHd|[T(IK~;MH1ˌ ^pARY6<گ_?Śf}nHI+s - Qj|.]]׭[[AbbbhUիrzy9 h>ufaRj#yf\\ܥK7nD_kj^SƘs|||Ϙ}E:yeF>;rHff _r;(ӧOt;v kժuڵA"##) xq&ѣG._A3uyX>8% [h{TiڵknU̶̔d5yyy>EǏװ޾}[N;J QX&&&T~^W_B%_%"|[n<==7m$VӰaÄz`QC))7nȐd?ԩһVB l߾WRE=UEi1##C$y(AٳgAx PcIIITE,Y$66O.?|ڮիW|)jFRIIImޞcSSS>LC7l@jB^+Wv޽cG2jK={kZŧ|}52l/$T T8""_&աFATM3f aQPU$k)ԊdJj?M###yPKݍ14(Cm5QTMJJR2ROO͛J"B 0:w\B]t zLx>AQV<${w 0EI> ,4ǰN:KjL♀S›hԨQ>͍?iӦLi唔bŊqqqԋ#͓oT\Y&wQԩSJ+@2x`*P!?6-5F :ԪUKin@^]v)BdR̩޽K*4ix˛3gʕ7o &_16sLO>s/yZo/4R{/iii))z*?u/k*fC>|G$$Yytff)SUTYbxD/Fpp0$5>P&jHBߟڵk+fӢ$cgϞB>jժFF7o\ȑ#| j%Jq۷={x*>>>WT\FFOj/*TO&={Ν;>R%++ٳgAAA$޿[n=}o S:P=}vppx{ 'bܿ!U𰷷oժU:u:v8vX_Vrppl<عs:u,\pҤI'Něȅ LZ_xqʔ)&Mze~~ާOsss333>PrRGGr1ƪW>m4#GeiΝ;aʔ)gΜ:::k̬{?#ϼAƏ_+ ’%KC(YԩS5|ENb͙3IcV޷oܸj㏪nkA/+AQne777*TjSfM5ai˗qO@$ܚ($$֭[!!!%m-111>{nDD; I>wA ?C'.>>^a%򂂂5Tj Ԩ۷;88L0' 2lڵ]v511177ׯݻjTN{Ŝ9s:vؠASSSkk J,X79|||&Ow^^i&I&.ZƥK*dŊ"!L+KvO~>Aٽ >m p%ih\҇$e%>1d2m2Ɔ "Ƀ;/^Obe&~WC)]̌)JW6mZ^&#---?h"qwE P*PF .bC FFF*mj={HFIP JLI C4j˖-T4HcW.XvMU-F(jwѽ{Njm۶+d~PvE[Q5k(=/h'jI W]aڵ= :ag\rPcy]~/2ӨQ0>N[|ynn.c&B1{쨨(ܹsimb|_{{MFGG޽[.{xxL27;$++gUTҲnݺƍ O(RHJJzcN:xٲeӦMc}wp޽4'piƘJ*ZŁ ޻wV1cbb >e-ZT[֖\Æ }QZ1F\g-++ɓ<ZbR%>1j$NwQ8O?C1t=DhOOqRnqr5RxݪT+ACxW@e˖9::N2E<nڴ~ر#oV/_G5 *tT*єn\W)Z8k{5x}jSCCCs"g"H`TZUô' A tF )j %/^r{2mjTN3J RB 4mfHNJ &P" cQGuԩ޽{ӊ^˗/qJŋGGG6Ljժ"%&PhiKTTbik.\!((H>xwB_5^pAk|ׯKhِ]J*S !Nv|͛yINN/ ]dI#G]JW͢%{]+wlR}xFLF+*=ZMXF\/@lU|2uWYf9;;u$jF )iw}'Li7ԨF (ڷǏ%;vP'r4;+;{ȈDdSddv]ժU'1ctuu>dɒ%﷯lu1> SSӘ7vؑnIfff'O a#FxUNpY: "ٵaÆDLFCÈd޼y|c޽򨨨gϞ1G_~t$4ӧ_r/jhhcccc^///1uTR.`DRRm͜9sk֬JBBBw됕ձcׯ_3ƺvJ4prxxxH@@/bhh+ƘΆ ;hРfmm]J2jԨA?B$Ο?O ru5k֌o}!m322ڢ0eRظqǎdT3??nذa^BBBBv1cƈۍ,clرΛ7oE322zMm4VPP߽{wС|׆ \TTΠj֬PcRVVVzz:cnݺԱ\*UTm߾aÆ=zsNbb۷{:7f̘x:(uttyLjժ~~~4J oxzzI1BBB> Hԭ[^ԩus||OZt҅GڴiC B%&& I_bҥ␟˗&OMM|#؜?^U"j733Ϗ >|8O^:uƛ7op 1֢E Ž[晩?\4G1P7hY Ə1A=J>]?zơCuر\r5k 5 f]gϞ5j=\21֪U+(ѨQǏOFCCC@qRѦMݛɓ,j([ۨ9y͍ ԞPr1j)^ K4EϏrj2LMM&^*WHhU?ڡCz㌋-|qFo[PPP|||NN΁Tc"|bk^bȑΝ+_|ϟ? i*KP2}Jgn^414 1:tӤFEE1Ʋ\4hbJ~W3n۶Ж}[2OtO (WxDD> l88EaQ9s(Op(J " UV?xxÆ riգU]"iذ!ϯ)ÇSÛ6m*?%Jf[VDҟ14iʕ4K)؊CSLŕJNN4cժU^xSNSNӟ;w.pqqa|3gOVb]zvMEa͛TDS:ĝP!e ~x芛?>6>Bi}!NZOTTX1""GA1&& Jyk  _sM<1w,Y$|\ѡCNEjbٲexXhtQ nX/^hDӘhU"VÇTVH7o?3ƪW'Aa\Z.88Xi}BP,Oǎdׁttt*W|r fff֭[7؍7nܸPF z7o-[Hjժ[xÇgeff_\:uJiiiJ 噛(+$2,--yЭ|/z֔Լc>4((hƍ?̙3Zbt%33Si5ZФ}kccӮ];//[l7on׮ZLT#2:&] J,\^^hرcc111nyڴi?]hRvvvFFF:::{x֠J*Q/2_ eddb8JWBɄea@?|EQ^Ҹq&M;vҤIy"""&NX|yKKK^^^k֬UoܸqFlll(XϞ=˗/_PP~aЃniӦ7 6(\.߱cG۶mҚ 5nxΎؽ{M0o8qBi& lnSSOXXdѣ5jc޽knnߣGj=~o4n(ھ}YBB˟[TQQQLjϘ1|100^zӦMץK|ZH߾}yޘ]v4nɒ%餪i'OOfڵͫTQVZ~щ'  5|LJ܄ ТE q //B?_|ř3gc3f4ޞʧMƃNNNAAA5|\ >~qz'NP?C\r<:Wt".t]چKGOTSok豚uYp!,Fc.\PiȌ3Լ:޽Í9RMM3FI+=N:uŧL2ƾA%D̛t{en^nn.ek۶h2Hݺu x=zt5FXs^5JΝ (k֬).wxyyB\nbb 4i\.˛5kV+ IR?µk^zvZjhB|-[ 6Ф7R9a5jWزeKWPӧOWs+>uT ѿ5(ݾ}{q9uttTgϞkMT IDATi uw@}:uTҥK>4AhjNZ]FFF,i<ųkXǎ>-|e*ܺu+/lڴU:y3ZhqЀR==D۵kwկ_ܹsQQQw4h=~߾S7^e{F5_V^MZ[[w۷AAA|ĸ\.wtt|ٶm4?͂ Ņ\WW\\r={ r:w,)ˋ|%Ŀ$LJEIIIgϞMOOj\p!##C>&+5mڔ nݚP4R+hW ._ܽ{wL {Ν~8_ٳԴ;}#5 d:L>}411EhӦ֭[#FDEEըQCWWiii3W~b_ġCnܸqŌ+WULMM%?/_4["?gffGVRVqf9GM^ > ?޶mdlgΜ@Njժ}FF_fffRW>^fddԽ{wބ]pp0Oa?W^U?MR֭{왅Ň(۷oҤIPD[`iJi1OOļyF1aܹs;=k,'| +5biӆ_%cc۷o/^B ^^^ҲeX"CvA1V}[G5( jcժU||[ը![[[MHH>}ZrZ?~QcNJ}ҢӲ-ZFرcThutt[VM←Pc$Ss"##$uʕ+7i$U73g1ljDeK? &TQݡ 5%5 Z 56nܸB{iK׮]iDr4y???MNQ޾t|(cdd$n5~>}+ 5zyy? Nt !!!4ڨM6JxxxJ_2 _~}RRRbb"O!~ƍ#G={L[AF{G~$ÿӦMO211ahh۷?~*|j%HI㣝sssӧϮ]wяq˩i޴{A+>PٳgCTd7n(O!BӮ8<קZ 5"x Lݺuq(9jh/I1PcY9111kVǏǷXBlPc APwamm-S:HSQEAAصkd 8:(h!C_ 3(uŋŻrrr$ϖ{xxP5U,>x9rnbK.U~A1 /H/>jr`8q+6nܸ1{+j 4JoLlnvvv|yXXt5Gcݾ}=5333yoVD<<<[n3h(@Y0{쨨(ܹs J6loOfٲePjh}khh8|p>{COO>xSNjƺ78svvvrr 3~23ۗV@-ZTnrL֩S]vg_^=+>>~Ȑ!4{FUc۷o8qbXXĄv9;;h͛c>g@mD%U;d2cĉ<|'҄eM.OЬY3+++ Ο?FmSEm۶577 ;v؁$ӧo޼Y[WwӟG9rYPegg_~=33s޽ԘQd0&""%4c8sxY*M|W @q&MGDDhޙTrxzz7jLi}kaaA9czZd?.vQbhhȷ֭~~Usӌ-Zܽ{W@iݺ5_,+'''##jժ1ZEjgdmذˁiii^Ù(J#92d۷o5k(kjKIkeggi. F`)))|r&jyAΝ;7}tùo߾>o||d0E7n˃$O[&߹sWb 5_lف9Bգ&89sP;ԄA>}:E?,9*s)tVHF2h׷7nQ2M4ѣG~L*@){o޼ٴi޽{*oz깻 ۷ֆPʳw}S?>9JNٽmڴi֭ƍfk)ό[jw^RRR||?^z2ƞ={FFUG8S/ϟ?>/%; tttܡCMi ! Et-!!!!$$$++4hЀ~b &LP-Zxyyɓ<ٳGUre9ߑ#G5hРGw܉~ljՆ ~8^{nAC2?uSY͚5+Rp… .32(e_700@wnZlvYRBsss?R`P+Kutt;xbX?R>??7*VhjjJd2Yff\.d4I(###GdEPĀ]Ԩ(؍Q?5jbh؍Qckw^P])[fcp+*wf-޹W}m ԮӬA D@zDv3#w6lpΝyE~F.-[fdX@GG`i\Xz= * 0 ԨQc+WLOOm=}VlHyN:}A!}<(MSl٫WkN(>>>_bT8~K*%ߓ?;)@D$όk׮GY3%%eذaRʹs>:t4cJJ깛6mb~9W 2-Zl͎;*T@D6;//:uю;o.UqRioj])Y500K.DPM7cƌHH'NHA|ʁgϞI)SF;Q_XX޺Q#ȓoڵk+M/%Y-[H͛7WW_\Ah|ÇKH2fffJxyyɷX|}+Ochx^~xҥ˗駟bV*BBB{}###岵Tп3]*ܹs'""BOJJS|3v jlW\qssnnnu)UqcƌŋGDDIEEE1PX?\hQ"JJJ2d[=w֭ϟ?_*q={ʿ7O~Ϲ%]tOmڴ 0MVVXѠAɓ'xSZhQP!"zjJO>eʔ5jtI,Yd޼ys˗//U.[sݺu[~= Yrc~wzruuqƬY>3"S}/֭[?0*Wst9=zXނ]h˗>}jccStK7Ϙ1̙3 m=SqKvR y1o ޏo[$^/0)>%amo"gwm;:k@ Q#DP5@@Q#DP5@@@&0q\ڡQDSDO1ea)8V8"dYAYoN0EO_t{ĕ'|Q*"1ZE< ֕q>.s4o ݈Lh5#Rƨ?0DiZ;'xc+g;+[+?·x>5 h]I &~ZRLpp *CkonD&(G>4\y8"swq,6W+\d}Z>S^olF '-i1}C;\y;xXǕkg TnhЙ\eiy+%v\i5)A`JLFsЫLFs `J5+W!j\iLFs%FӁ|1h0z5 A`ЫLFsŠW#DP5@@`DQ#X`B5@@`p4DP5@@Q#`R5@@`8sP A`AR)`:5%Ro:5… ;;;)0VJMg`^ YRky+%v^|0LV!j0Kj R!j\>}4 >2t0Kha?~ƕ>} %K\zq"b{}755J,y͛7_p!22 . =CV+ "rJ͚5A +:;;_vիWK,rʩSZCFV9R*߿Ν;OlР] IDAT5k3ݻ7**ɓ/^(**'"??"Ybbb%h p~֭SN 0N>}5%RN5󖔔t"ٳg˖-JRwޜ+4o޼K.ڵ+{7JmӦMG+WJ%IebYspYZJiG2|Z'1{B]OYeФic%"@YYhO2,eh%b!-W138B D tD$ٰeQ2 Rj4Q12u(|"F͝;СC.z{(沨J*ZiS)9B}g>Б쾄S0¦T{&FΒY]fͽӒӓ>3%^fx)DL^otǓi4iA}g>alZ)o]vy-s-z2 `˜J}Ѵ'">TH*tiyٲe]=T>". JH5W\ HJJuS_4 ۛD6ݛW ѣGFFFO/ԣ٧D~?N  Q#XbF2˲OjDEga;1nժUCX5f6*U=<,JII(B&M҈hɃ &:u?ڷo/Ν۽{EJ{wvvNNNkQ#]bE`DBFK0d"z葯5ko>hРqVNЧO;w8qb޼yO<>}ɓϟ?bxxO?tƍKOoѢ?>sRJ) g}`r-@Zf٨ :tsDTV899K6L_ŋh+ dG.*UDDDW+Vl̘1'N$"ӧϞ=[5e٣ht"tiΝw۶mV\ثW͛7?]ѣ~T_/XShvi>EP0- [x1c3fΜ)/r,^ܹ7|ioݺ0AVVV[jՑ#GRSS֭;lذtPf͚ոq;vLAVVV'ND[`IJ?_&KӫWǏ/ ]\\H@KVJ|iA`Cbb#Gw0j-T:0- 5k֬Yfh h05 h05F0A j0h0= j F# j Fà j`Z0A j(X5&G&HI4aTJJɩJɱL׻>LïaD eh05]}g^ 鍦0}go=AeE`D"Z)9el*%kTJJIdvBHn䃜(HLn?v_zbfqv/ӲOڕk6gN'Wk7AF6 1ɵ#/9+#g0u+yry"ՠ^ :Zy^ Ҿʖ\ZIiX*rv֝s֤rFП5Yc>WqLh432CAhe<j$`Ѭ|޴oW f Q#ӭ:B84V-`Fjx: &­ƙcVY`5|vlqLjh.U3~EjAsgI\>TtiQ#%OF"M}0;ݛz|?L&ƙo,]@` ر]̗c`_c@ ŝVOgITtiQ#0ޱ]Z8k)/`0ܓ7f F ac#4;keeZڣ Z a$qFTti Q#ȫc#4Xm>ꄜǎTFyqRѥ>&D#׎` ;jY۠Ri@6*YLk.!j(9;6K#ڡm )-O98KJrRѥ>2DŠc#4XRV8CCS0’8,]C`i;6K#ҡPws }8K TtiQ#;6K#^˅xA 8L,]?Iѥ" PERj@kˇ}r8)KEtiM`yV,uh Ӵgl&x7^}xA$nD5||(hx ;Q=1Чe[#IMt²L-pDדX*Q%o"Nvػǚ>Q\/ YzǦ,Ua(15D?%}?'6yz5@Ŧ-=faWG;{s/١5ZcwQ䓔3>}ݻNNN]v5#9<Q$t<t ZNE\@3Zjڵ&5Y&((F| ` X%"aL0X0DCPP(qqqh T`F03(.]ĉnnn䈈uݻw/55ǧʕWyg&00yYYY%K;vlٲeW~Q…ƎkVtO P|&MtQ .8::~-V؊+N>WxZj1/4D`N+V#&$$d޼yժU˹رc.\hP?3Ftg&eˎ?>>>^^sW^ G(@̆|/Ǐ ]~]<˽{ ֌ ʕ{ҥKD4h r ic8@fCA%$$D0y+VldR`nw TpttԯPsi^5@~qѠA{;"Zh<5^gE8BBB֭['oa޼y$~}{ ?>Y+pdX!"܈h:VZ… uEGEo=EziLj|7٦~B a@JNx6?o>(Rr)Kv3_dZ]Nr"Q$M U~˴{nt"+m% 0`VNć$dgbu:΅(:;!F*,vETJeSDWʹe=',t~_}egDl Tq *++,")}.˹`88e,Bq VD^ AR)՛v웤ﰑ "cپ_5jAmqH" ft8rYDIQFeY&A7meY[S'!1 )X,1 #!j|Rr*3gee:݃.^~2ޡn& k.ҦS,\N^m59K5>Z0R s#FvBD#;Wu4DTN 6)S&E&8|H`#%7\#:p0-CQtsѩjg?7?9bfS.^"YdYƫ_2=4h_?TŰ̍ky^p/S3~BDϟ%f DZmP(X"bYvߓ7ftTWq 7J?/oߍ}t~u=7>+0LZ 98\Nj 'C{{o٩g̲?ݿsxnO;&zOwJe5{z^ ֵKGv^tGS]݊\v/,Z[`I51bĈ#"##333ɦ;v8{l5)sNAO{{'^\iKFTxy/y^ܳ5_bm+n[WwĘw#3#]z\{VCZ.gH tptƛS0 h^)g,Y?Y[+vJ 3f*":z}*GQh@XxJruKOpoz};DYLK,ð 2m[.KKM?N>s~un0ۙ)P*ْ(8Ů-kѫ% IDATD/_8u4eSgffLG ؎:N"el]rDɯYәW7|8>Q,B:~[*/_=\R zћ;#k3:*Q)vzTT5Ą4Zge]rrzO'f*Uԧkaw軪R)nzuER+{B?sWZE)+KJ-ZNR_w牓m@+=y^o Odkgߩ֝{Mp"9>p+6vo增xp_#!FF< "I qF6uԑd"jдuɲCm8:爰,.iJZj ]^Vy\aN=,339P?DAݝlFt!#ea&>.E**]$ux^k_X3+kNog[ӶkT/7wY֣TؑD~I.e;wWc}Gm +"DZ77gWL៾ǵvJg؟'J*\Ο0vjq;"ڳu]t:ÏˤC7s/Z,͊[A֝]:ӤERejX4CŽP7., *~&7dܯ] WqA8voF28F/Kղ~ŲAB*0cb3D"cHRnYArXI{R9\7F Fxs| Mu(&:Ȝ+us…sԘ,猟y{)]uq)_v״{B|7lV*kSyW=*Uakgod;WΝ$"ŊTZ֮vD|t.??W*x~VAF,]8j^O FOBF 'Bzٓ͘Ԕ c1֐Sҭ*bThB/ D*e߷X}7_WLʹ ٝk2>}IY!N/DDG^ V6}~w;,WV<,VSJظvs]|mҧ<7S.%qҟ/)S΃b|e자٤R)&$6m):qI!iiDԠq;1K_]yѲN'_X5+K{>΂Č;\y쿘췔( VqyމӚҼ=&aR¨VgEݿVϵ^!]pebs'KMѨ0mjϷGٻue)վ۲(:zk@6!#eE7Sor oVoӷ;r#+KT*rGJۥUznQZ?w{J';EfĹݺ~ V˭!B@+a֝kojg@D{>r^5 >*,(~ r͵ yn uM=cKtTԉOvΓǏt٢]8|t+f^?nZTx44s?Ι_Q$hG#3 &({f9X۵Tk_mmfOo%)AvLk"2e=(#Cj|;/ӯ^mqa5R*' KQO3{ir-TC&|DѥT~f7mim]Ի:=-#DԤEBed'&8AyMRyu0 $]݊#5X'g=:9ϗ 9/tɂ}u}'tm;G^K}XQOY~w<5]~9wf7ѕKnMoC׷*kG{6K6]b̜Bg:ܶk_AͶ:jܺ_P3ʔJ;of4Z-_jK)Go;}ı[ϞfI9MJ_jGDϞd?nпg]aɓ;^<{Yb.<*k\8Qg;vj|p\}8B|G<9j"3IλH#sLyǽHaXFudY&>{nրq/[;EQNrv@~0 R*;Q|u!u#eckؾ{Ѿ?%R:{ 9U^'Ҳgcn_DDεY~u]>*-܉55ޣ }JDi݋فC`AT\zmػ#uъ6=FDiߎYv^3eJ%%%ݠ1?òLΝN#v}lܥ{]۴9Gx^0YDgi3`YfÚcDql=U\S܏'9xFaB֟zĪQiOFTV?j4:-@8{݃R^&;'GN5*UT Qw;vگ 2*H"jӹVeؽO,7C0xTػm}<( nEFEQ;ޥ˽فYC`AԨue[tPF "}{.q W *UP_mx(4a|32'H9rΚ!JJzU9; \qޒH97oY&%%c39)DԭG=uBw Y-=pviw3vRkV*wt8Sp:~f~&3r(c \:0~RHP**NFp\Nmձ߾#{7tFiQ.I)(DQ۝}ԔkuϝHJwtr!"Axd{I6 Cg( Nvgf /*`YF22y&3&LzEDq)6 KK ;tQ'8vÚS׷ui]Bm;1>9:fK懦d>qڕhlB+u^ 1`h ^{L*`aZ-ODZ-JϳGuMfX{)qxg,1H*iFe}BE@h5ZBٿSAC"*~u\ }ؑEQ8DoQDY5ll<9?bru0 2›8V _KJJ|u|E^R!R0ᎸJ~ Սl-;feEQQvTVV[?~pW?(MҲcO#9B'8jRC60^-h_F` JVϟ͌߂RTΛ9adĒ^xfҏKAx۳^@DaLּz1 gEvBT_)i\)JbM96fV9gwL͂_Lx^nTUN]k>ϼ תSx"rP3#2t|㦟K兿9{/]ז39fx{~㛚DIw77"JI8rҤoK Ź/{um[mM-q)<%*vdm".пe}J.ODRϝ8[K;t |؁?T*s=L;w0,;d7j >G\?s+]`ƶ>.܈8,`񼽂 >zРƤKNb d796 SFi興/5[!"gS<0T)sӆDtgU0/Rgwn?)SCEe:Ib8+˞>I"" b.i}:-ݗ:*QM/∯l>IDVUlϾt:(DZQ8zx1vs뛞#ckg]s/.E1|5j7Pg煸ؔUmնZ2YUs(Rb` (^;^F 1@EE;1pyc8gvwvvfgyRK>%dCHh[ΆWyCFz)ǥ!w䜬 #phh6ro]N:0.*.niY6uWihLl'wG W X*cY™0jjJͶ1ʹwUW,î2$4}ZjXLq9b9,˭[y.㫗N+0)1+)1!$E$w&Daէ#`PuF`Yv B$E͉Y]50yh9/JEuuȘ{v|cjjȲm9nxX@@jq,>+IZtZ#3RTmE"JvbX(;},ModŲ\g7CB bTf,1tcO^<.(#c-;{CUXv\UMҹ2CMcSmfvՆ~n/LȠ%O'@ʠUG?-h̦SQQ4AO?f+[us"T2lƁ(emLp: ӵla5eF`3d%pgdbnfae`lFӒa4ue??sinNq{3OeUa4 ?bpиIuF`Y F&IA@Ht xYÜT" Lu YZ4Ykxۺ)\H=nfZ*0Cl$$h(Det]q$4޲/$ pWA9c9?$I$YmaH8߼}P˲[(W@*1pÌRmGO;xMFH$ 8LCr/j`0 `,Wsp0?W$ej.rSߡ  aY+/ 0 `0 `0K `0 `0 F `0 `0 R#`0 `0 ``0 `0 Ԉ`0 `0 `~Xj`0 `0 `0?,5b0 `0 `0W`0 HG ~iss_>'e=:E@l‡̌uu%;`0&Xj`0 `0?A~:5Jb_һ.$q0 >vwk+j"=-/9)[C"54T4T 5i+ 2^JO-XN[Oļ!CӸ01 `0A7@N?(ADpp,WVm㕚UUUlھ]=h CȲPq?AԽۚc\{ݼ/0VpqEQat\ `0 'B(y  DEO&Vџv|H֤O];6_52rvG)6Co:/~7"Xs搤Y`)ú_{M:#{b{6.zͿP8w@KWCqS|i 0 `0ODjjDŽ hH{\!`⧩-E/}w79dD#(+GԽq IDATLxxMȓzcnwvKN]p,;_nj4i+ro֯'5 MX|ƥӇ yJ 6q6*KKӒeL]R#`~E iZBA,Dz M?&I 8ek|StZ²,DZRU'OUX?}W@@qr;#Ie9a6.>($8ae_e9eQʗ#*z% I$`Yf8$("HIEikW I$ CI莾ݾ\~Gυu)I$rCWzy#_ Ts[$H$H8=ZM-H$Hf_Z$?Fm$ X7WhSWOTN F$RGSKGĥiN LzӇkexΒc_۲$Ia (`1rE jjZNM5SUdjEQFup\^ZzuS$%}yx|FzOAüouTKϣ%d*++i6ma3rl|x/~Lwkׯnܚ+wv )9)I9AXwp4:LT{_P(pmbUw~B!uf!#>eg ka76՝{^1Lld4yHصF!1( 49/R?(40Ԝ.*i$IvsE'=&%9'-5W(Է2hb9tT{--AZ&pȣW_&(*;?ŏ!5u~)X/}Gg%=-w!OSSr7pq?hW#g˅0V XӮ׉0yk%bZbcR9qM^ԹӡѿgUPfYv1f#}mJJnjJ}Cf-lGcIO|ElK(˲SN{>*%SY4ɃB2SJulъ'C [W̦iļ~cS;MDvfF}=ZUIQ7/>#1!.?/GUM̽g^*{! ݾ",aӗ$'~8k}bB֮hL?|B\tfZJa~E}V:5ɏ۟IڿNء{,0g-SPPR[Lgаq>td#>~p2DZO8n֕ 1}P(/ο=Hiu'ZS&~)z-lʹpU`036A1o-c|-ܛ{]CT1I}ѝ+N>g.Vn!v:w?qJQ(uwm; 7ļRɣ^ 9|#~F5>vŵ']'l-/WTZ_ fr,IT6 1Ƈby攃psǼO,=}~ dY# #mex>YXyU,c4D' .4X*9{@,{ ~_D"s[{] }6 ҵɟG'B^^nQV >gWyGV% 5;ujW^k*A9&L[/S!޹9F27/k(? [ad-W=x[-hn4[GmA}6@~Ovq~~I<|bJ?W~cf˪fVSW:wuSc PTjW3}Ns=;nΛyn 'zٙ.9t)[^n8>{uv{R3&8nGrׁH޺%g9xY=Y^ƭGKo0#mGs4khSA7,|084rwؕ$. 7V͝PFm˫B(гaIQOT>C3M‚z'}Pj2l/|/XQQ'IFGGߺ{ld萰;f؍pu -T|T{K߷u,ٸݢEҾO<'8?K1 K@V͛bhbܤ.2YO/*g!vkfqS N]?6>]S>M錾'YIlh\Ǖd& ~ps״#k38}#SM0U{-x5[f ͊J~YkI5hSA-&'e\ꥧ>͙vP:P(]̞5Ĭ-}I$̡Rs`攃)..pu[or'$6!:φ5ru~쩧>:_A, \jK(~tz "JMM ∗ (=c#+= ]VFnysHgTSWӿ1˰oNRV*r1|Ss8N(ބtFsK}Z= ri6_}./NƫWuF]|NEeOCbϝ훮iQn;M7M=~$H" K~a[8pOУO cmaLt nW ѱ_&FFZYYA>FSom öo6F26NN9z᧏{ozn#I4N5#=衇(s'we[j|G>uƀ@v OR׏ o`=kjqAMWHDݚXD>O8r>i Cr4oe7.W.'|H۩k(Y=w&V]7QKLܿvvVafF[n-e1 E "t>CjɫL9̫!+fKEs&-yjhjž}}aƒ?i]BH[6s4˲m}$޵w^;:u뫫/Ur90/;35{ oxڹOb &zZjŨ($k"hܻm96b]:u㸨C7 38S FE> ~m| I3S@EUC> ls_>}bL{rRk+!CFxwlX,߿KzլmI(*,ERM3И|hrH8uFܙ1 ~c}S˼r1=]OӭԴkwڄYOCRc#K{C"O:һ٧:U~-n}6lYyX_]=YI(IKPwmЉ): es0/ 7]:DL7ijݬm\l*'M내ZTc}a޾N_-.ung>.?$EBFx05ah:C,J7vo}'kLAAc>sڴs=ە=w=Kk{'($b']aD"617l¬=#s`G݇tFcӍih Fw=`Ǻ};kzۏ\URV zp⋰>r3' ().OK6V1,ð H$"Ŏ]E(ώ ?T{8:?3b40mqxe?>% "_O6+t 005`GEEaɪHg%%QNJ okCv&V Q xuYk\oosah +f ;F1aBj_vmJwhy]ux.==H@ꪚ6߉8S۵̶?F0LM:]up4#*Mqa{OW7 H^}3Syx]Գ~C4ئu[Tgêש)j:}uSirHj~YZ[K$̐ދW;p|QojAV^&L(&uBi?I Иc9k[ SvC%2IR/o.ݚhmߝo0,u 1U;n$4{ma^g$Bo>𗥠@+)@[ON,Anv&XԷuF4kj?{Vް;Q"wӒD ND\asW#_ࣵS> Vl?²,CRE L-ngȵcqV m6Ff%sWihj×W2h&T_uL(|0?!xW#`?X[c[9g<ܺ|zBD };C.m\:Ӳ6szA%D@p?).*\S[wԔ^~SӇwkܩ2x aD :_ ?pTaiin_]jҜz'y9Y:7^\h0jݹ乫5l)ϝ8ȿ0?ZzubE!b]tE+l>}0P+;E߬$%4 )/o'I@% mΛ8ս~]P)j˨N, +ɞTRV18S}n@$"墅SiNYUG Iҿ2Rm~nO,gh[XXzYK|o W_ܽʷDBwOa \s)/@{Ƽ>[PKGrJ$LN.qzHT~n{wP%yث[=1 ;fBNJ2|[MCT×@ZCD-:/I(,5|j}UxC2:VV&Њ[U6X={ie! Mp4ai!,e(UA|[ݡ\#f}<ϖ,**^f)(fwLKYljN٬ϼ5Noe[zƒ`1t%|Hh9qP0,598DŽ $dZd%ԕQ^= f/wU/^K͛ZKOne$@+ -mSWVX(+*_D nf};o6mQYYA0&ZͬƊٛvsҤ5A@ݕQ(ѾCn*DZZyƖ(!rF.t*PoҴ-msڷZʧOGgg 7LlЖqᡱ 4Qm E޼TT(ao>H* f'޽}S(4Ͳ )wTcYxYPTTF ð x RD,.*ݝ$}[V +!q@dgih̴.WR>U]h10"$ >})O*yqrRUH!--)~"4}TA~aaɉQCءtZr"Lo-2x?}p`0 E "ŸtݹI{]Gl!;vò,p  6tr,xAbqy^NvX]VR!Q NC@8 /:kܳWo!3j-Zǡ;r@˰kL }t'&*ʶ6f2,Aqp1HX4ZOzAQaB/>rhIVXz1ivqQœ\^>ikoz"ege{ 7!6s4B#>i |߄ bFV'αFz+,,%SriiB[WJj,jK%/,,!*۵jϫQwrEpڜ1;{f=:[sΫwILDG?cڷmMA wdhUNE +W@?_7i+yxΊ]ԩK=T2$ɋ6>f IDAT¦O:]rY~YďaRPL[ K'wҳyrcN񈇩 q &*E(}a̺&JKe͟ \>fZΏe34ak߸pT :UԖ*..54OXj`0Ӽy~m۶̙3OccW^՞G>:}4~4u%ʮFMn3ZVi^zKX".;uph ' ހO_wgab{7/v,\e2 {;'~|:k#ZFqo#ꎣIhޑ=?KMN r߭'2oѮM[O%bqP$=x\A~3=}z <x.ˏKVK6˾κ44vۧ.@@EU^7"|p T']]5sp|[B nl$g^saiyquVX-F/m:w*H'r쩐BF]a C2g#mGi]5vFZ"H;u|QST !{KTs~GKu6oikh, MY^_0(֞zJBH.ܩ< "E%.}O:`se )ھf~bBl'9Jʪj5VZ"$5d]P hjղ㰪 eUUq>7wsRPBE%Dեx5 d*?&*`0] ;;Ԩoę1Z7P\@Šd' 5J,i؄ٲV8k IEyhR،d01ա\Gؾ%nӽĿbQֳDee&AwE~'Et%c/5ݹҋlɲY5IOX\'lnIпV6 ~ qZ(]TX@Ͷsk@W1hj@NNr-+Hڨy"eeJ*]WsE"J\w~ f!aY޼a6FǨ7"_~D'sFf;И ;7#Ξ AƪW./_tj񊾵E$| m'wgStțT+*{]ʬ>UFS,KKڣi ~3'33`[VFCG)R>a?JOhE?e9N:څQj8R.!uk\PK:")GHgS~Q â^QjiWo4j\f9} 1 M5k&ܿq9Y(6$T9*M7rrAꈚ'ivUTa. ztF]y$I~Ԩ*0ID2S2BR#|iӦsڵ?wnvΎRDf _b5tDM]@"WӷO]!:(G&cja2tx8D acwճG srae.)IR|PgVU]:6EQIѕvNrWz६ _AQ.Us~W^/lh=v#\]쀘Lt>@JRN`B!ER$r1ml>LE$\O@̌=RQPZG31Z}KgV6"J]K\N[9wNQENKt)ή][' ]n@yYBo=ɥ.Æ%\\ib)-3goO:8Ƥrf-l[neg׭8G=9Z׉H45]3}U,˚~KtEAqsbt (}]V`f+8$];5Jt9WÁ1,xuGR3G g`IBI9|fTx|J6ھ23IRI>TR7i$Iȗq,`s``Θ1cKtԩSN%Jmg#5/JKZK,:Ъ_GQYנ;W^>;Df=3;3*Kbf-,9xuzExxۗB{sOZ_]&H";K~~J*&3dbRȲ% /X\TPG1`T5u]e3,O f ZxIaoǭ:ȪNiζS(l:jJEyϞ95=PH=y6 t?T"V XZ}} ܢga|̌|T2B!Q2Ivid-/@B|e=}P!==5׽lroؒ‚Қ,)DAl{$./?O{}tmIX0AuO6-5OG(B)N8N,-좸T$bI[fzt_\Hph=酾V,úx >Ek;"u'z }1 ?̛q;~% 9#H"=CzGuzD~~I/&qld. c=c j]#./[:cԚ]ky8ͮ g=|tr~rR Iq6'ceDfekjeHKVUPВ kwy7s634RRQ--.**mÝ y(J)(..}Svvׯ߼yS51q?~]999џ?:v^^ޛ7o"##SRRY,GGGGFFiii?ny{C7h濿(HӤ&%~VWPn$%J2S*:#H}!-% {pzAez-c/VUqۻ/z܉Bi**̪H%EDe9**8〤U!k];*kv?|b@ч&ʬPf$ &fU3Lze5TEE Jm޿B鳧Bx(ܳ0 ŒYշv zAذPTyw mY3aJ@S%zf;5J/{B 4Q9&d,_xb\nΟ S(z(*"_Q巘dG]%ǓyfxwcDKjc5I9?F^ZVmwߖ=H.ɲ4uhGoe3D;q]fvYVey$7PfྩeV췍IdBjͲQ+.* _|=s6z[y&׾G=6LEb1m㕎mݝ .Bq,gj*{Wi^T_2nnߢ2UqG_~+P"!>]fBj=| -Z^>wa~HW߼'1!NxO~ls"eI>+A|8Cdv IJ={w$_1 dҒbJ h]n(}m<Wϑk6'R#QZZ:sL%%%UUU[[[kkk$n޼)VVV5rrrֶr\'O6lؐ$IsssMMM55IHH۷/A:::A|S~}   {slmmMLL/_.gݺuA흝۴iE^5jAzzz_^AAȨ~?dK ,XXIk"C-2=}/Xߴl:H RPTTR5sfگǀ3^{o#[_=}eHֵ8PR5e~-EtxYY T6umv.ܚ,yQ#{ѣSd x1S~5uޟ`S< [uZ´r}ʋr <q(@@/ܞ(,,(=uIvKQQb[_-RTvnkjt&O@bߓw>N&IȈ:z-|z ݹm㕌|Ξ<B!մ M3CFJC{z=w:\AA@D>9)4x/ɶގLn^CP$(+߹u3h_ KزRnN(5%7J%.Il(=ߖw$If};JZ6=[ͺ}#\(dY.EB'泌T<YiY5wH>eh-kWkd2?~V,N=}COIΉI%߭ k)( W,>=sA(+vr{ yuiݥ \w8**[蝽:Wuup.&͚z(6&UQQ$';N.lTJ"dH[qG_NM͍zXV*浗ޡ(R "^$tY~FΖۻ^ P ~]\Oo#n7/}!oټ|DO#{%} CGtvXa~biIcO,x>;be_:ctO@@DDx𘾾ٙȍ4uDFy)8 ~psxwOKeOPPT(8x}i) 9?|2 }tg"BIqk禍?rApww-hii}ŋ;vzjΝQϘ1H8ӧ߿߻w5]v'iwvv_.**ZbETT ##aÆ`iiihh˗/߿?66 ͛Nҍ5RSS [`Appk҉>is玂Bƍw"e"7l؀n6mZZZ+KKUῈI5MӞ>]GS:v[*Gĝ*{~A Mm]z枾cʖ4-stwr(AaA+gPVZRwxx!UB]*UwXR5> Ah UͱkBx,ˮubdv9Yٙ3Fv6AOBi +S%4ZOW< 6BVOOzo gB/ >.?+^trOG]]ع=fs27E7X`S<$ˮcѥ{iq\حم ~n\}$f fy/f32[0x[Z:e).{ mVm8zy0wQ?%d콩 Mt/6}S\'`㚋\]9ǜRz7kh$04r{M3I~TV*۶jzGo۾Zo1\N0o녅IZϖj G+ZziѬd;ܛ44 mS1[]hDBŦ huDl#--9Z\^o^b]MHH IJJzbQQڵk-ϟhiicXׯ_?s ʉCX|Νm۶!111^|̙`hhodd[G=P"}ԭ˧jYA%I辭e%ӰwzvIH-˲qD,Eg$)8%J*o'UEGEbͰ,//"յ*5-wK$ʾ /((*}|yzZio댘gZ}yN.Wyz﫵qC'TѪث~jQLV $eko t ajs]dG9Sh߼;ˇ/PSS3c5z7vb&Dt_#93mȬP ?/ تԝdkgMѩEwxEk=[?zR֪'0/r?. ̯Y`b-no<1^tMfeeեKss~8q2!!A6ɓ'?| 666<|0̘1cܼy/cFi2ܺuKcϟ?wwwk׮!q̘1񇡡!>yd߾}`߾}Ç<|Ν;T]L,=ǁp>$I\vutnRuu7/]0;o枾(-vp$IFG0O^XeY8 ۏ\/7,ѹI Mٻc{z'Ζ+6%tjb V6;^i:91athծU;n_Yp Xnkgnv%ӚjYGRdY=֊cݞSk||>j+/‚NFN?b2? E}|]rĭ缫JGSc7)!pEڌFCE!2.k|kO !I$)VֆJJ>*z%YV*IO)RUU4110Ԭ͙HP -!wQo߽{z IDAT"!.AE,EPD JP ˕1qǕ!b3m˽ G`@@R!ˈ#u=9:b"zn3fU*))ҋ4>.U &8TH h1-Aw7)#=ˉ+R^Tw'1'PeqrEp)Uؘ"ko_77{/I )(P;:لԪ _ar ws--U^N~\4 R(M֚lOvrT*EZZ[ EIuzq*"1!#!>@blLq)L#\moo]MeJ8JhVkGSAuRiScS'ei:O/'ogJQ+QDAy/V*Rt:ѯt2Hede99IYN6NZMVdS9].7H'&d::ZZ Y[:YOZ IW8P(<ϧ$ bki\R*Ui)REή.A)U9S,Hyi^rVIxicgu;B~i5&Sr(;8{|-#DAHOsvu9LV>Nq^r\V'fgZY۸yz;w0 x@HwrRg PJ @Tw'WwV9WL0r 4JsDz.  ?#'OH!)JV|tװ/B^щbcc| 2ҥ{odnFR?:_O{FM/ܢ}N'ZS)(n^p~L ɴ:QTH՞8UܱS^/إ'q(P +B.+M .owU GAL}:pzc}0#)q$>ش?b/iݩg6]J?L֥o$y[gW7/NTnY὿ѭ]XXZG1OQaZNE m=VReQ{Reը8A[3 -]>^EՅO(ޕ;oX֠i`A8XsyJL~'MCwו* DAHO}pNG*Oq<3D>G@U\xTʫeޙ Rxs]5ڧjSq1Q§#AA^QS\\D4j~`i8(֩ M,>j^T|Fjwrur6۞N ׃Fj8Pdͽ (ZW;WҴO)LQ$Nss JqFVAlfɢO}^JZ-omm!ۨD'dVNDhR?(.&SrTSʉ=J!"/^+X}nF*PP{$'ƧeAC~ju?%%O9e§E>~ѧSh֤ak k`emSXuYq(p?|0qpWOJN&aKfO~u6sptIMN:v`';=17'kn-vHK9qlnv98:w  }ƟvOg3z6[ʼ79(x* عi:P-X{uc eȌqjȐ!DA~fR~fɍeBD|R+wҤIyyyԇp _;߫Ts~"񽳏=^z֭ cufX{o]rf5Ɵl7>\MDD;YY¡DDԠk?;!T)o\$#"++- vOrbKȭxL~^\0Ctv0|L.Reik}WΟ:y@rR|^N{&^kQHn}jHKU < m 6:dqeA.Uv}(Btt_Ds):ӻCT3١8^V#6%=rprUaAJ4;`LovDQ\lΟr"}qv s*O%oʕu\E?l\E 3C[[!C4Ç:4))iΜ9B`#:88r-ZhѢ%&&?~׮] +V;vTԩSNy~ժU&Laʔ).\0`PPPrr2@rr2+=O#Ԉ\>,6;XQ (|mh'q'cгa:+"zOm֪ۨvƜLƮ ?=l[;^odlj(7%B= ->_Q?*Bٱgoq6Rb0Dۯ;,> AGC"y zt賱4j0䍗0@ GO]C*4XD&Oپ} g&^{=j'zfgg߹sGΝ;YOZuYƎ{QTT  K.&[߿BBB)V k׮,:^rjͳ q' yg$:6DmJxʦAv4^WBgWʍlJ+4gh !兟_``L?f "0`eee͟?_ZjjBXr%}!!!999A` Ezz:qu]bNSRR䡎7Ν|֭,TڷolN:W_}?,(l>_d5@yP^L0?ܽ{w۶mG_QjX.q,X?cƌ۷o;88;wnܹ[+ ;v֬Y<M6aÆ ۋ-bՆ ҶmۣG?ҥK{vqqIOOߺuMh&I&Zbǖ:`BqС |Ѹq_~O>ڸqYS+]^_rG2󩩢X_i^^rBSD$h428DxR>}k׶lrرcǎaqϟfkkkV>::z׮]ǎygРAkז65yԺuJKo޼o۷/))8WW׶m۾[ڨQO>D[baa1sL\ޤIgϞ^^^R%K\xQ9;;w=<<|޽~~~y}\mg j #B 2rʕ}kb@|lj(sǿc4d[ݵҥˢ!C^hqGp-;`@`4+勍g>)^6WƿQ?CCK<|֫kNv/fjⅦWAB5_WN p~zuqjnnǙDME/-KE{߭ -?ݻ2kmaw7)klO߻gBD3fq$rǏhвek֘ }eˠ=o>\ַJqv׿J*N]8"zkN߻7׮zB② *;"O6^Ԝ9J%eu%"A\RG^z4+5U H" Rz̘eflۖ AV+ѱmZ._&[ - ۛѫ׍?n~T(\>_Y_&#ڶ5;4 NN޸BHs8U<|8<*59уh"  vvuGj|UF"8xmZĉM>YGR}s Nݹ 0gdx~q  SFIIJ ;鯒EE7^' _XY;8Q[&q܃75( C|n3YDjEEPSƥdi)n]^~^Oragi%lJr|yLvljq2׿v^>?MOsͯO.p5pܹY1R%<7VmDV"#s ǭ[nؒgMVUۛt04Q(0}Oeafz겅OG2BBѣБ},=$ ss{ =;ch"6޲;a?4sZd޹כhoGlYSrNݼ2ӿX"+k>6-c>[ 0V+@iS\z:YTMW"##=ً9wXIPSR*4vox߉c~m:!bGkgtqgu?p“N3dfٕ廷ogRepqF^:ƚd2 JBw⌎N.RQ,f;u;篛Vs%j 2o(ΗNܹ0_-9yV|FƧ:Os۱0,j_1CijUO'T m۰LVQrԋޭqqƽ* V+yةN.n+}JDl\w2?<\{[qJOD{MAʸ~,)Ew8k5"7In^@D <{^n{mp%dVJ2RRQQj!~d88m<(o=q͒yzw *t:"سB5ZZ۰B~nɈL#׫w 4GVn߭C[.%n7JgP}23Tcd,"*\ЭqS~d2Y>~ٸB{:zW10 O `Z Ʀ_JԪ5{w_(~гg^s0?ۛy8iT^3sJ9oT02HVnҲAޠZpԱ;(Jy!/b3+tOŮ}޾Aat<<+*7oGgUDZF"Δ㸜,"wEA.+*BRY(JoGQ@`L&d驉q&Eq|tdiiƊK@D7IS~y=V|wÆ/|H"#MlajpdrGXv=1\<6j͟1v`7$%(U QK%e?jEX VZA~KR'.[s'?Yʠ%9۸ť3u:];~UqOTpmCC{7lʽ-"y ’!Cllhٳ'o6 3{v%&fi%loO? &38]IMtq&[[2ӑ.?oہG|w1n/+# ޿u<3.liiED#d=E 뙒@D7U'^_io3iOy%'ٴd Yt䡂MZƛҪ[ S棫CnjP*ڣG)}7jBI?x`\Z9e +_0a:A rIL\w;l:y|Z5L? wr2ddFL_Wv=iɫ٧urRɗWSn#sy|q;a}iOEcM<կ{ȿj TR=Nhkv1k7GLwȸimַRVmr7vy㫕k5prqV3tGyxHMU<ٍZE;{G6r+>{+ v-iSƍM6gk>| -k;mZoUkiC/|ym??W{))yɶOFƄBHKa;{G((tukד+߽y#GEթɉo'Dms0C{y?VR[O<ƃjW G3q܍f;ߤk I~>vߏy~˄ cǚU֭dصkx-gPK)OmoXT3@!6hcg_WNGDA5B 9Vs"Jyǁ]wa \Z3OCtOniOG5hf\&7_Lg=wޛe0[QC¬m{yx[YZ( !a KDI B66v B672YWIy~IqNsr\lm~*-{{{߿¸i 7DF}8>##)+޾KzN7 ++dfqɄGQ5uR"6!;Q;QTXʻo۸~hN&;wg2ka%;D˗5""Vij \to{XLGg7 Ɨg}oU? 7XXϯS!]ZS ŸcEvTdH՛aRi޸yRCAY9?7|ݺ]"sa~)Q(쉣9Ygerw)[PasHXsrL `=N,Nr%"++gWtFdV1X]< B&$$Hcѩ8 /7;`G _tşd'yI|f8,bZV{^_ؓU۷'iưy'"\hEݬXYvu4 8v`qć_@"鴍eKbw)ⵋgXR'O*utqŅPn!ܽ|X2\Ua 93W.W\>sb߯?_kISTtNVw@(a=;~b3>+şMe ?|IP%H,qEke2SX9~+k"EkAl5K3Bm2Dƽ\&wwկӠY:9-ZW c, 81.+#_mt+"";{|Je[#oپۊEsrsRC7tq罙aT^`^N;}ێyNH9w|xOCǼoн ?/ "rrqhpO5<#N۠i;6хj]mu?^9頋 5=H4a }݆3*7rohwh ~)*7'{ E;de2ْ ǽI.HKYƕ?|IRr%ӿn $JI[wepR@Q6:@H&-۳C2`mVw؀`[hZ9||PݮID]f3(>;zΝ:VWɯ^;NDMZ_p 6+WrбV˽|*}1Sfe2٩?J%b`rß%)_p 9Zr\Ѭ~u?'4; FSRxA;/,B1{ljDu8Eɉy9u &oV,T-uQ { ^d2B""Qui_ea ZZ& jjT(Ӓ5jU858L(&#=Epvq43Ҙ\~^xs*6iߨF\ػ.S+@ xnď<6zƱ0Qu:B򭬿 רy %&MH>ԉ[EVkk`kPDxJ|ZEyyc2d?GLqFrKY ؁]) e(3-߶Wn} BE}4{VPQdYߗ< 5ܙ1^÷xa^E?%Ze)A"^#9Di /h*3:,{440Ѽ*B׺E)+ku¤zh4Wʨ,4Ghm (j(FE45{Ԫxۨ^}[W+F򫔉Hixe2)b P&)R&6"^ ʵ&6"F4 P#@yWrb#R^qOMlDJ#05w%$6ju»Hix啐؈Fxjx KllQ)/B/$&/B/F4db#RC`؈F0`؈Fxjxi'6" $6"^<^Rb#R$))@e&FQDJ#7hqHvxDZʯ~/yur_4i{n;vgl04x5"{Z|N#RU{}\8Fp#? 1K prZJcjWRwTp2Zt S K;&C3 1{Bhl;յ\;6G໯XDB@y^`:W eF(5@@BPj2P# eF(5@@BPj2P#\txtNJB!~B`5ϡ!^Ngn&VۛGӸ'+5Y^ý/"5  eF(5@@l̚5N:!!!>|IO_~ٳ'444,,l˖-oשSf͚EEExn{iڵSNF?@`&LqN駟K٢E B!Bdd$ڭz*<7l`rM*U*WܫWUSuVTTTiׯQbb".0(+۷o߽{{ԨQ޽nmNW?))ڵkyj+J''RڵkrGu̙s޸q#&&*W\z)StѠ:T¦t:݉'_zuaҥٳ=<AX?rhРA|իWO8QVz[@i={V3m߾N:}ݍ7ݻ-ZdC&ݽ{w|ԩf͚)S~~ѶmVZeooVPL&۳gOivFGmӦ +?SNh4|͇~<@e"bjj*q666l@ب*Uԭ[ѱ9s&..ã~nnnu233u:Rd9{lBBsݺuJsbccu:]jBBBJ8'Ok׎8,,,rssDQtvvV(YYYZV.;;;QVV˗ҥK驩(dO̓uٔJ۬Y3̝Nwpp U&;VVV&͛7 5޹s'>>>>>ֶvժU_|zz?jؒ] yxx4nήiiiя=*,,  -ٳg߿/*U$,o aaa.\06l3|"jrZ_ǻTV-00NQDdXԿ+ KgϞh4k6xX@4DQtww/KO>mpqqq駟X3m۴iӧOљ3g:tgddQDžXti^^M6M32V5jThhh&Mp"@)>r >2mz l9=^ZrMoݺŖL>=--q6}ԧNjuAN6l(#_#C7oP\7ςW8cƌ۷Kվ+V1>>>εkĿBo~7n^&O0v9ionٲqq7(AM??ׯKGrͧ^1\F)/Ν;‰'.d&M$ k2_7~:\.?~swwwoRWWWF__reRgP(RJ1cRQ r1og7o.-zJlK;&7jdIDTZ5.+!Ԩ߅\RIO@v~R6@MDG1hkڴi)7ׯ_wK)PH+WN4)//}تm۶Ifh̘1,}ҥAƍ*ݛŋ׸q㸸8FSTTtIKKK"JII`kջv""kkjժ%7|Z}btڕ}߿Zɹ}vpp0EGG Vf!o(~e+%%<<>^V':::--%ZD3>(**_YY@qrr"3g3gΜ7oޞ={?wݻ3g|뭷'L`05 Zl ^:jYy'N4/ړ_.ԩ[di-W'1c[5uTi[x R[/LϞ=+t:)zȲI}*)AWR{ KqX$ )M6;e1lw uTE8]VڵkYiiԟ4i[tlXΊ+ؒ 4wΝ; wJePY ֩SGZx)ǠիW&EV3CV~ٶ e):99?iV~[O|튋cY^^^[0( Rm՘n5Gʂz1[XfM)+\" c>쳑#G|# IDATǵ ƗxerY/+v199Ǎg..NF2`|Ν֭ce)Ԙsرן8q͛D!{N&x gC"1brH05 3@}s0=bR ^vΝ;QQQRjƍ`>}Uf}$"NV\Y4}LJ#7onܻw޽{ֆKV\cǎK:$sa` XAJe.\tH?9RWɅ}F>}fsj0Hi|. {BPtg8-Zϝ;'=%cǎd2777ߜ~g[[[pB6?5jlٲv˗j/jx)' ''rsssssK{Xq=W4cDz˖-[l_1l0VvTDQ߿3gZjerҐRt'hb޽[5o޼֭[lIvJ3bt_RFFFY"_r122rŊӦM39g(p~sɼś7o9CEFǻp† L9xΝ;Y{}IYCzI4Mvϟ/FOIT_rx#&LnjSj׮BDlJ5p@sW\i$;;[ M3%ݾ}{V0x׮]ۼy/{q|Pe9@QPJ\`u묭uwxZW[GjqZ@u=pDP3&?N|I>I9Qׇ5&'4۷jg -J]4F;YZͯj7n8#5U'n3f̮]rK/5^x_Njm7[y͛'۷o4;:99ɉ'N0ٚwk.((H^O> cǎxbӧO gȐ!CdZ;wsrʕ+W^5YM[oCoV.]͞={q'&''l޽{ݻwԩr1'`eeNڵ brU-ZxKnd -^{-v޽rJkv߾}kNZtڵk7]tiĈ?k=`Og8qb̘1Q޽;!!AqFV7rV5aؼy?hizѲS]R$F k֬s5k&wttt|O>Zt>0~Ɲ׿Խv:cƌ~UVj5kCo6i޼Q䦀  SѺu)SW9o<~h|8@M֯_o#9sI=eϜ0)**Jez꫃"o׮]q S>LX[[\dpG%%%WrBCC N1߽{U *Fc:nҤIe˖#?p{UШ`^zllI&M?eh0Wi=j4 W-~͛(1jT޽{܄ r|+"f֬YSNݰaCXX؝;w]]]  MfeeڵԬY_~ݷnJMMZjj^uB?!!RBjժM>]՚TiӦ_5:::33nݺ&L0F7yrz]߽{o=v\q&LP{QϞ=;""L2={T7͙3gܸqW>zh\\\.aÆAAA*ժ5jܻwoɒ%ݫPB͚5|||BCCu:С`P/Ok׎7oޅ ݻ5vXwww!ի5kv̙rթS4iҝ;wLh)GrcǎZ[[9d;lٲ{HN>pΝ; !ZjqƔjժd?-[nݺ(J۷oߘӧk4:OO|W . >ydtt۷<<<ԩ3r$[g(?j֬i{ݺuϟOKKZjvFmmm=}D5Lڷooee//+2eJlluG:YxJ*)ýGN?W3&&fɒ%'NxaJǍWj],ѣGkN8q:c=+W~˖-+W6lW҄ bŊ+&&|j߿AYS :))5w@qϧmBL}~MwwhFcڨQ#yb8h,[XXQ# j`D,5F@XQ# j`D,5F@(ŗNoq7A(%gD&ee7ٖrhGXQ#ŘV,Xבw7i+df~ӜD,(7+FXuZi5mTѣ"u`qDou_nYI}(gbor̜hοQz5gbc|LldJ#g`R>&623E@I؉Li5PB=SLvY+i(ʹqiI:Ø\F@YUlo$+;֪DΈgeaI}t|'%<[DŒwJu]9I*M^BL5WȔFF*҈AP=vb#SQhNldJ# Q#@F405oyLlϔ,ݲgө$Q#@Ni-q?7- 9(OɊwrb㙈ƝyLiҭ]2E@PL3ӝVÚ۔,ݚW CF2FXQ#@I]˙kOl4Ҙ[;|NBF<+D%>Jc2hFuJ#!# Q#@1ϐٿLCȈG,ԕXA\Yi5k;qEWua>TJ8򒕨%XdG_wJeû6=m0 ^jV<ޫxJF`yR^ ]uao3uب7u8/[2m^FC J21|9`LFe< F#pD j(, ϓ`عsFT/&a] h OD޽{xbrr`P[ͽcNII޽e˖g3g C͕\kyڵx!MƍB=ztرgyzz֫Wy666&"""8`hԨ]HHHȵk233ԩӪUz%I&xzDȑ#'N믿rkE)h4zU?x@l>`׮]]vy=1--m ,0鷱yM6;68p_6|ϟoٶm۟ё(yq/tzN"j{ׯ2dzCDEEedd!bbb###gΜY|r/^hW^kmm-9Ni P2ؔюۄ:, xKLLTsݻ={6++ڵkW\IOO?<=Y1k֬SNǯjǏ?v؞={tȑv\r1cȜyƍ!>>>;;{ԩr֭[CCCɲ~99s挟]|2gtuu=rÇݻwڵk !"##qƬF@l2xWvaA;vׯ?,>};}t֭ bƌӦM+ jժUgϞMʶVO׬Y#X~}۶mGɆ 󖕕%V=~:ôVZaaaUVB[T(ە+WdW_m_|qݦM)]v[ӱ˗wwwWLR\9.\XxqTTTTTTZZZ5իآE ;vشiӭ[E]ϕ=z׻krovΝW\wpppwwo׮ݤI*T``ٹwXRF 8o߾?G1 CСr IDATAƏommmggh"Y-[!uֿ9,44433Sg 1BF7nP;ը1Xܼysjj⭷29ŋ5k S2SfEAN4IF/ oFFF֭sXL}ݻwnOo<2>>#K,QG&%%΀#DDDTR%E 1tRiϞ=mڴ1ݻƻM00_tϟ_jUZZڦMM'=zysСaaa7oB7aÆB&MzÇoҤIDDDHH'اO3gx{{eʔ &\t}ջ|ŋ>|8eʔvnIIIBL81FDDjJ_zW_}ٳ .LLL f%yہƝ7o\jȑ#5k&WVt'O !4M=̏ٯ_?8xlTVM%ҥ˰a5BMnݪo7j(s匌 !Dz/(Jndޤ^zl~w111Qj 2D>Ycl߿_6ԩӬY3!DLL̡C[N6Ǝ/`ѣѣGk׮5G5mڴKN2A۷eQQQM4ٽ{۷O>GMה)SyZr?Ê+~]v۷ҥKǏׯs[nS/_,7UXqƍrec q ;;vBӧW ֭[N$\\\:ѹs իgϞ9Rmŋz(:<{J55k4.ͷ !:u$cľ}>}:K^->>^ UVVV+W߽{jժB;vLdNe+ZpԩSVV_???Fj.\ϝ;s2>  vժUkܸq˖-ehѢsqrC(94MϞ={)HOO?x ҄[PP\YP 1)oӦM}e˄qqqK.>o^;wl׮\ϟEݻĉ۷o=sSSSM6=Algggұc!Cucڴisʕ׿V5 2jddd[nʕTw7|ի2!mԨё#G?cپ}{ժUSSSݻw̙ƍ/_^ߛҽ{VZK^ݻW%MNVX:x`ٹfQt:ud58ZtixxxPP:o6hΝ;jg ]vOpg0BBB:t0`'Ja eee嶯I͏uܹ; !6l(HHHhѢE> *Q4u(#Gm5ȓkOڪ'^~}"0ٳfhooߩS'>|.VujcZdX9"j|M43g!-ZDEEEnܹƇ]p6m/PTuyYYYǎ9sf:udM>cP4!'i !~j)"oܸѡC.\Gbbb4h^pժUBs !2ߩS'y~q'{brZhr+grD(~3goyT/>'PVH.ڵkO<944rZܙ3gM͚5ի2kB,Y$#Kܾ};7nܐ OOO!…իWխ[^B>|8..~'NA=SN}yMprr ___MeC䈨P-]SNsylh.,vttR&ݻw=㞇/'-hРz׮]#G6lXV)))Mѣjel׮]!eY/-[dꫯ8sQx 0al_^Fuر`BlݺU=#>GϯV(s1ߚ.^J{V 5իW_{܆M>ʕ+B٩oңGWWWOOO9 rΝ;wްa`*ʕBjãe˖&nݺ%leeս{w69}[,O‚OO>gϖ)Sɦ_p}uea"""4hjͧC6L>ٳg˙cN:uݻwL"?~^~/}jUƍKJJBT^]]{ĈpB˅6l8}V]A@X >s^vmժUg̘K.]v?XhQ?9O>+ !N*ڼy .Ǐj꯿Bxzzɏꤼϛ7ObLL̬Yz27nڠA`u /;**JѥK<0.Xޓ+W_}Un7o޳+3#=zW7͟?_6^}չsP/##cꤿΝ;PlWFBQF_c.\ h4an.>39y2CLNNnذ .\p۷7klŊ|z+VW4 6o^z̙S3(gΜ)O-+CbJFpP,|X]v[oݺvXUN/1'$|hW<813gΔz-s_MZZÇUVco{Wr߳gO>&ΝۨQ#[[[OO!C$%% Ĕ/ =~8A~ӬaV#o޼.ZbB .]1cɦ_~}5鷷/_qB)SŠAl۶m޼ylll{7nh4.t#x㍰-Zq۶mSJy϶K6ߗ"++˼ӘF +(Urjb1?z(&&Çz޾z*y|r\\[*Uʖ-[F 8\BBדjԨ!/tX =rpp4ΞD777;;<geeۧ{xxDFFڃLLL+hXTTԝ;w4[|oߖRJ###ko/4hmK/ŋ)ONJJGG'S ɛVUg=CӦO'[[[u!2Bwy0wvqwwWs'OB+͘1?޼yW0]C>,<<~~~T (=8H111u (m@;wNQnSN͞={K,Bl۶ͺob EQ޽o>*DEBjرc+Vam#G=Zqq*DjԨ!{qgӦM>7}}}111 (U@8::/S;G֔ (U@!Zn'{ʖ-+"XrN: (U((6m,_|ѮÆ _W~q;Q{###;vV@B M6Bt~A_ =j(OOOj*@ <<\挹\`˩P0@rr{UVhSRjsھ@҉@5:t0_%۠t(@ f\\lmmm[)KRXDDĴi6oޜeoSOM҆+ްDTNO)ޠ(B(j2 ÁڶmM6mڴ~ V@BՈ &Se[XD'?/\)G6ԩӧOWWW[w~ y!Ĉ#zQR%|ޮ]P8Ԩbokïx矏=B|wAAAƛR3wU17##cʕJ %wM!I(egg5lBDGGS.T!jP|y!D͚5SN! JFPriǏ1BFQ.T!jѾ}|VkuĉE9;;]J6E;mgS7j()+[(" Xk +CEJNO۲V:קn@GEK\(ir,]~F bxrpT j+iQ _prp j+iQD@BEc|QFB4lذm۶=/w7nݻǏ79udcرE8P5ύNk޼yttV?֭+'N8w*ؼy?,bŋBԨQEŢ DsӡC .!BCC6m*;7nx!Ē%K|||d(k֬sehoo߯_?!ڵku:zPQ4 p#jD1PiEm<B=9rX6 d(B۷OBNvիW s׷1%=KM@ (ZYin;yS(|IGɑmgcUtEQN_BdfZz!ĸ'Uh~Bjت^3>Bk읬+Uy;)>ٺl+ B4<0' IDAT XWVNVC=]͞7?Q#% ՝dA jU @Qsyo?HxS:qB&c3B˾pxGnܦVZ oMpk9W >n\y!'ۻH=U]ji0ۼ{@ۺm@qAYիWu֜9k׾m۶je˗/6?^"cǍpT!o|Ragg׫wI5yP5MQ;w%$$+**QnR"33o߾=C>}BBBVZ駟 52P, P*Wܹsg;;m۶ !:unKQ'''_td ӥ'N(}mΝ;'?~|1`p+f{O@F6W?#!g̘!;ecҤI&;ofĈ&B !6mZNRBFJFyO|}}k2do֬ٺuV^uY!D>}L"1 cƌ)Ϛk5Ghl׮]={y󦣣?rC^hQo%_Ə?}t5jTd"j OϞ=TRBΊ+o{B>}m۶>~ڵk###u:WPPPJTr:ں>yE8ؕTD@ҥK.]L:sح[޿_U4&"j䠠 !F㴵%b)%%_~}g}'X|9eQ#P,ݼysРAuyyyQ5RŊ \\\&MTNj/FXrqqYnuExzD,5F@XQ# j`D,5F@XQ# j`D,5+Jxڿ z^0EQ4mePz`06R(L$Fs:s"}_-;y ?|hu.;o7 Ν:_(^9z 8LQ +)J%f5 (!JcÄZ{``nY7r⇆Nx4RރX٠Wvfcem(ߩkgBliUɆ3P(MQ_7?{x:%05%ޝ-v2?B-^X8K.u+[?fffƑ{ڕup\ŠB(mii)}ͻn6rO:veg?=*f7gwlqPx! 6-_>V/f5(jOdn|F9Ǟs'޽USivv_vWzsrun!V=\9:%J!F@u# !D2e~ccEx޴_6(ضq <$]!M:.iVeFkA_4k+27dY@rvjP$(JA.@9-njam]F]{YY9ifFz~CmWiV{E$ JHA VzI xas E@A"Ez3@BIBzHq~kw0sLfgsF }|"gP05rfZ9!UQ[vKfB3_:x{{ 'mwB\ROO/o~jKϛRׯ^mޞxI649g !DC+WNY22p·B-?hY0?m\5|ݞ8ߛ:.P!ߧ:v߷k|љ>ַOIƞP`Q <<8bxzzmZE9پ&Yqn^W4))Ij`fu~ߥY_ nӾ: 3(Ȩj%^Iio8ΪH&a:=O*dŒѴ-vZm|`{OOωS?yiɉe=6Yﺱaq1n2 (T(ilЈ74fZ| |kPPǖ>>U\f] j%>^ûa=r {շXӴ6zVZþoȉbZ {]мuaȨQ#50Q#50Q#50Q#50Q#50Q#50Q#50Q#50Q#50Q#50Q#50Q#x ܏lٴ^y/:f,Stk/Tj߉Nxg״u+ !S"#n arcyy.YjZmlG^L 6U}v`d6wE^uxV>qUٻf*v' Q0M||[_hs3G/u:xv̔68/g2̱K׬]4-O1}ؼ_iBϏҲcfs인㿟qn!v[Jb; ZmG?ӹokxx?ƕ[BקXRYRMӼ}s7g'FĽپvߍ\`Ko"mpWDn"Nwӡ[B4_hM;~y7.%mnlPtp%OQXa9]fH\tEBeՂ?YKzۚ_9x|Obj؊fӪ6MQT} %Ku>O/kGac+A=?cg 63 -뫓W[]f%r`Mx!D$6"jt('JkҦ%⢱tB̐f9]lq6jwp rAZV5OcD߾'F;13LIr|2M7a0fd6tp9AԘL9_hο?95s4!".G{K->tBrF7FԘiB)-2r ܋Ag1d2QcٴR1Vlο(/twb_B*[|橅|}l6[ 5r<!hRW,B?tb!*T氞%{Q[gX;6 | l;}5yW*Uԩ#Xf"---<<\ꫯMϰ_~˜ޟ֦B/D@6tP!Į]RRRV^-gc!#nӆ &'emcv26;usUVڵK1|ph>F {w){i0`@~D%F ߿VbРA&)~BFQ#WOXLh_>(kyt+sv$p\tڴ/5oZ,k_.y1DJZF_/LJ+UdћYun<|5`=OV *װz8]8sӊ y{tjV8ݫW(Oe^~x}ӥIivs,V/6c!pP0qOӻjb msYiuKm Yia²~V%rc8x(0X`oVUظ{eJҐ=TC6cMBYJsr8x(0^ )iD>4(9<,9D9y<4D/4"bC\4('l uJ<1䖬9D9-<(Dd6voQ,%WQr4('⢰FS..iQrOQ#Ea#%ȧ\9D9u9D9u<Dd#4"_s /,!A^@A@6rZHI#5iQ4(yOQ#ˮF4(ycC'eWHI#܀]C}>h>?x'\4>sŋݻWD5jԨQC4555))IQhB 9}bQc;vءC֭[sFeȑK.8p`R>}ܹSq`!O !&L0|nݺfw}wNOOMzߥKիW/^ܮٳO~}̪U.Y駟lԨ˗K*u[n !y-[T//Ç˼ةwމ,Ŝ /_L0Aѻwou^LLUfj d3 -_\NtڵN:Ν2e4T%&INɉ˗/׭[W挾I̙##֭[W挾 onwCSNV*_t}+V7o)##cȑ2gԿc~ˬQF)sFɤ}=ZNlܸ155y-[5s yB5M222N8f/no!'T5… hBNDFFʉ;vuV~}3gΔ"Rϗ_~Y _SpYfȐ!rH"vCعxkׄ5j۷M69͛7T̙3S!ҥKwO@Ԙ5mTNz7;UT*ՠ"hٲ3)RB BHc/BܲsQ ͚5ȬSO=崁99 X+Qc7 !}5k:ThfH=Qn߾-'̙ 44벁*Tr3_ =ydrW\ܹsf-[vջ{n͛rB ,_~  d7"'N>m3;',U&&&ʉ"""T˄rJ:u8 {kN'''gq޻wONOa9SŎ 쨞d>|x۶m3kf*Vh7l./?xhhO?Ծ}{!_|QfMǁhB޽{'4M?^vW_=sB˗ !ʔ)ӦM@ j}}ݶm?1cW\ի״idZTT.: ̊9QrAH_=OrqU^f@9QL-ZDDDl߾=99ڵkbѬ3: 0@NŽ?Nӧɓϟw)+(E&=9fEÆ {ƍSR?3jtI&rĉ@rŊ_&jk V~ڵk6wrjժzխ[W^:tP~}5שSg Xy׭[^zWf UgԩӧOB̞=r#FpڲGr%Jd%jLKKyM6 i=,Ujժ?xv }z۷^zl_.]zĉjjŋj56m;==NSc_y啀޽{jJ?ԨQobݺuNB<s̼2DVC?ЩSMv .!ʖ-[ZgvGZn-5j\tiС}vL@CVESNVuaaa|nݺZO?AY={Lm۶+V̮isݴiݻg6kժU^YfUP!_ތ%Klٲȑ#111rO<ѼyQF5n8o󨨨'O !޽c/ڱcG//ŋnɓwxؗtرc߿oX\GZ??/(RH.]{F9m0y}:ujԨQk׮~#\7.+7<7oA 'N|xf)A3{;v8]_rJ*ׯL29Ξ=kxݻW`ܜ>[,g^VZjıʕ+3uhѢcg  .|뭷]ʗۼyENy{{ׄ )_~ժUkl=uݼyXy/bVq%''ػRZo7oLn~؄<&s9Ƽ:t?ժUKIIlޥK}]fJ׮]ϟ?oUըUU!C#vʗ/owTwZըrW5jvr?ѣoݺUX1OX\9,TPըPUɓ';Ll}9V(HHHȬ֭[-j"ǪFMWzIIIQ+ZLL~{U5:=モo<~Uc޽lݺӦMS?66]Qˑ#GL&*VN'%% ,/2e竿aÆ'''*UJ.;wc<\d|#GW^u,iٲcƍ]s9rdذaz V\ʕ+B/Rߙޗ_~)vOjjfsٲe[liWgX^'x"(((ƱbŊ5ktq4ٳg#""bbbBCC\wwr5lP{Y,///7ߺuرcw)RHhhC믏5Jh";\BzJklh{ꕖ&ѣǏ?@un㤗_~W^lwMLL|ʹeΝr">N}C !z˱ͱcǮ]XN}Q#yJUZ5j8=eqNKKKHHBxyy-l{dddjjj``]b&$$>|͛%JhР#ts2eԫW/8884dɒB+Wh|^xr*t~zMӄ7.|۷ۮ];!DddhѢJ@y3g+";WUխXNHHo/^*&&f9X,&hѢ Uw4->|U!e5^pA)]>JNNV !K,O XK%J'D1..N_UX1ӧOvzz]=z^!v#V\Y_֪U+U4j4M_Ofr;}TTT"\*ʱ "oݺ5"[/>~Ԩ'v IDATuQZ~._\خRn~ڱը)K.U3ݻ///nR>s{ߨQ#奿wt.߹zUVY]ئMUuL:jTdNsΩRY٬?l߯_?s^%#׫WZjTlG%v5C~Էܳgw"j*TȮ.m|㰊. :jtmĉvy䔀Q/+QRHݻwwzs<Ta6oެ.9N.vן5+VʐՂ ;V U8\DԈ\A;=QRFdlVv*h޼UvqUML8QW黊S߼yٳgU8t\Kէm*_j@YdQ4u=,6##DrCur jݻ,ZjiԨhժս{[n=䓎uF֭[߸qC噱Yrex,**J-.TMP:uY/תUKmoo]vəսQ]8*U=Yx;4*ҫm4mT6f5޽[η"k\xQ?ٳSSzwܩGrd3U9L…?^zuH !P;ӨQ-e˖UfSڲNfToDT3U&ID֧O}!U5q5XiZlle+W̙PWpa5S=]5Jv޽N}B"EA{.޼Qb'p2jt-jT DzYܹxL-^?:.Cw޽+߆iiir7e3Y>P'?'NPSWU߮];޽[?FQc."jD jtÝQ)Qرcׯ!<<<^E=,:iԨ"y;w jڴ:z}cuk%97mG111111+ޚ__|q[n9sQ1u|95j&OOO{BmQ*\l6U)~SqyŊkذ5Of͚9ի:MTs~X#a;j? SU7#F{[nϝF5o\.rgb6MNRϟ/d5j_Ge˖7oO?b mR=Ɣ"֭[O<_}f9eT'1\o9jܰ߮q\\dQƌ3v֜Ej\///X xĉ4jTsOCNƤ$+Z,uԨ"iӦ9.UY)ɯo)+rSU3F\x>5N?6**Jp]D 6̬hZE0Ӥ=k w|=B8tP.]퓹~J@ԨqɲMÆ L hiEUjiꫴhѢ)ٳ3XVՃ#<v}=y9\rvU/ D wz9QV0F-k0ǢFDZ,IyV>Wc1}vTT?/_4jtܹsǶ^؛!r,j?emT\);ŷU>4iܹrJu.=5$uW\fW^Q33zl=OG:jTc;~6ׯru ݏ&g|Xn)#ѢSc~J@Ԩzjqծ9==͛Gq2{l5Smt}Ԫ/xtU%.MwK]lgΜqY'fwS¤ILU5"F䊬|L2ޤI7]SL>}?n`,GQyTXoU]so߾G<5Pw^9bI^M"E,c6Gr\?͢e˖믎oܸ1|9p{xWWD7Wj*]rX;_m4Sӑ>)11144tݺuwxf+V111wQUjU1DFFa+V4Sl6~\x_ֆަMTU^Vb'NٳgРAG2eJPPU)\v&"E{"##eEWnڡC}x?Y߱R ۷w\ZzuynUf%wZ.]$'j׮8vj֭o vQv7ߡCU,8qbf87.X@yG U{yyj~67n8ӮчSBMk%>>>66Ν;ߖ}ݻw* )A2cƌ:]tUl~d~ZՆ?Fm6[BBKUɪngwrJ9BG}:}Z ؕM?+Μ9StiӦAqPl&IΝ;FQ )A>RV{C ;w,\n߻{nPPĉ/ H}k 냏6w3K:ut_Ɲ.u @dp-W\xxx\\?}m۶ !bcc{`[D^anժU``ݻwe<&?UBki$ߣ)4#xwBEԩS@@@\\Yf%&&ʾ^|.]VF//>l[l ߾}7V?ܷoߎ;T㰰}EEE[n׮];vĵkך5kq^z=k׮!ڵzm!BBBfϞݾ}{ƍ>ed9d2nRh ԱWh-ZHNȳÇ˻>=P{yFɓ'cmHӸhKess޽{'Lp!"Zre.]vуI i* [XXdff##8DīU Ydee F>'wz%QF5j̛7/''gÆ ӦMh4cǎݱcKlKtJo"~2BP/j6669ǏolْΞ=rLg.w҅7n$ׯZQlx8bvM.))N:1׏2n~$()  xم ^ݽE{[<=={G}Tpv0?c?z111l uZ7nاO-..NbV&P.] HxGԯ_߾}|… F^qȑla_T"M"?=y_wyf~QKN n%*n߾%q+W%ՙ\$4>ײe˳gϲ< 1O6:;J %d_9tPۈ0awܙ}fo._d̈́XC/o߾^^^|U;PBK033^:5+5~MJ.q}wXZc>;_S9 ԕ+WֹO*lڴ8e"##مիW/6$:jnnn(ӧOM6[?lo #9##VZlȑ#_k ILL V.-Sɓ'O8!=C/|rQRWZEL٢(~Wώ;J |{FJ!Ez)p[YYTt=rbff&ZWfM|E~onѢE6m6N:/gkD m|jQ. Qߊu_6mZl_l;[d 0&&7~gk)Mg㓋/^}?ѱDZK'ӋyS _0q*yVZw;D4s̗>8`6m4o<6678ooo{ *w#*PKu[lywWWWgΜ/:fذas̙+󰝣Ν;i$gggvYrr2;ϳc'Ν;wԩ{GQOQ˨Q'|2gAIB!?vX233c"*͚53s1\4#yRJ!CLͥ7n|%᥽O!!!ѣЃYey"8p U`ڷo?cƌAd3-AӧOǎYJ*f͚1cl,Slmm.\(/qb=I =5J\QEys̙!!!}-^5g9uo\?(t N? &:ɓ'g族5jܹCe~DoV\ٳg(J,hҤɤIx&ܻ`ʯ7ȱchW_*꧔wBV 6͛7IvĈQQQҽaaa|& MZ3FYCɓ_Q1 IDAT?_n3g~ ꯯wbQU;w~(7&(Jb7}MEܹsێԊ+Q͛߂߭[wo>(J&: 5lٲ&32D`凤h~dtt4"mNOz B]~=33S$U~w9JݻwSjUӚ5Ș+W7\ 5J0`@~ǯjEʕ+M։ܫYoPIHii)OOOݻ}KKUV6jEqExT3&ؿ `QEiwljBO:|}}W13''GzdS\ }^,{e Znjo޼ŋlY+qǎcGNNN*d2YFt.䋧8;;\)Å(J eoo~}ݾ};%%ܼ\r^^^#G=zdw4h JI-YԩS cƌ  T/`~!-nܹSLYbEtttdddzzz}||ڵkg=%ix{{k4 ]E&ѣvSN|d#FH[27n;wM^h=<>>qqq;v8rHDDDZZߘ1cR̤IZjzpZܪU$Eŕ-[g߿C6lťgϞ|mGիO_t)!!#((hذa4aÆ$5EsA>__ٳgr&5cǎjZuNNN~~~ÇNu,Zhyʕ}]|999955޾B ͚5IEEEٳ?~ZZguQΝ333׮]{̙<}ۻz#G ?6mʾI$6m$%%]ѣ999...u8p`rt۴iRSS ><<\ȥV&JU<pJJ (cl dz7mtׯ+ oo޽{oٳgsRy޽?<&&חmhBPhZŔ'MWp3f꼓2zjԨѢE"""222\\\ׯ?bCq… ߿C6E=O:599YV'[OM߿3 :#$(q8jsoÓk׮=j(~ر_4ԩV4/t8a„G鿂,Y2yu]|{zz6o|:o%2k֬9y ̃>~޽lٲ샐L&;}Ν;wCAu֭[ǏϞ=[&鯊;|JeZE t,qq|گ[jrIN8Ǐ={v͚56mʗ[2eJrrL&ӟiӦ)`ŋ/]R,Ybkkx+Wر#))I& 6LTZuvT*ŋ\z^z|'O3FTZYY UTNNNSN>}:F_=k؟8qM+ݵcfvzi999ׯ;vRlذe˖ݾ};11ťaÆ3g?g %;/}ܭA^9szvo4icJeP O`<{VsFS짻̲eJ(ض#-ʕ(}&JL&Mx9N.44d8cRRCg,X`kko>Iղiٲ%5>}u֬Z(ɓׯoڴv'NSKoii_0k-[.\PZ;s͚5D? 59r`?T*t1112111.]Zl޽{ye@iW_|Ҥ~lH9s|QFcuy)1c'N o^ZPj9r$11gϞ)-Zf xp⫯Zh|h(6=믿VT111ݻwVYU~gϞꬉ9r+~8}jժEFF^paӦM|ykk!C( ٳgH77˗>?~ڵkGFF`Pʌ7nɒ%\ŋKf2P-X`7o n߾&www{bBCC;wleeUrQFmٲٳg2:uFFF]NNNNgiiɣQ"6k֬Yr%+ic,)o׮]algg;Ҝի:t`޼y̙3?_^{ŋYQP޽ d5eݻw{)Sv/u֭[Xe˖g6VI8pmWnݚmڎ;/o'N%,ŬzyfV~]|&8p@Kڵk6nܸ(lllɓӧO?}.((iӦq098߿J իW,pƷ|;vڵk:t=СC6lիQ 6Ņuww/Yˋ-0a͛hʕ<(֭[O}q''' A([,(ܺvvx[pAH¢O>l#Glڴi֭l/3{0x7nܸ#SSS fݛU/?ߩlԨQr߿%~vܩjh̘1WE`tPcFF3z3#{{.]t_m۶cLjhΜ9o ȗ0Juݻϟ m3|M@RYZ{p„ SL!%K.ׯg 1477ϯs_ z95 G:::&''ݻw +VE :o?g]l/uNRݺu3zhj_X]vQǎgx;P!ǏӧOڵ 8z,111PcDDī<*6oM&>|.e,kk={nݺ5>>ٳ Ξ&'OΝ;lBo̙3Y+W٬9upsscl#33o3~GK]oٲqƍJ*{:uj\\\~OUR>|(lvp)3qDV~ '";;wѣGu߽{mx{{G@q [駟P}f͚_<_~j}||؅QQQDtС;߿_BՉ?RRR"##7nطo_޻wVZFb vVt JZjh…~xΝ;w5y*U?;Pl!-_/]Էo2euuu7n\ll!Ct.y&bc㏁?322.FߒU;6V7m$p1u]~e^CyYhpSwb#xƎkdE~(0Gx/3k,4zj0'$$;w/&/-B4wܿ١C4 0F -ZgϞŬZBV#)mذ7yCgj@LF0 kP b@.C/Q-)PLefRS L!G;Wy-P`ߎKyVB&;}{/͕ @HfJyZSB*OA Ί zhڢ3[kg9UT2 BUݵym,*4ɴSHTUE{HJ\)]JP{Z[*f&4Z_K%ks,|),m+[w\߽6:4ABnQD#H 4]U3Ef=hEaI=Ѡj<50#;!Գy9 Rl[1`Ks@akRóٽ_ N` K;k-T+8t4GƘ^r凙F+zF+NQ%eT C1239q>ȏ9ʁWadb\P" B1&39q>(X9 %qT @D*439q>(X9ʁWWhb#R PcTpfr}`rs&f%6"JPcIU@fr}`rs,P@b#R PcI_fr}`<9,+Y9`a؈F('O0`fr}`<92؈F(p Xg!'ExML؈F('OЇPcɦ8tNnruIlDJ#8yA5l8ġdkf,)PF5Nod!'/ +^؈F(5p}5xvfZTDN^uUdf9j Rj<@J&(Fv4G.?Ak8}ZVJ{˜-Ҥz^z6հNu^B.J'B ":4}nf PB" d;4v(MjZ`5 &P#B`5 &P#B`5 &P#B`5 &P#B`5 &P#B`5 &P#B`5 &P#B`5 &P#B`5 ($& %IZʢPc߯.Ң)=rG~-+)PcD29C"cX|4`$ !D"9 &P#B`( ʝVBKrdDiE҈/D ֐4"8łB @jՊ TZ $D ;HCTCN6" )ZE I .H!#dDVh^Ar/&tJVfդK^2Pb YٸKn\HzAD>NVmKOR!Pk;?|. roxRpJNEElݖl%T߮zE5S`aqϲ4Dlѹ ռܭ <! ߸q'^Sv|yi='LJ,Պn.6wɅirv4"p ǿpqZڽ1ct 8 t'*}g糲4jx|g|P_ [!Q@[@v[Ԑ|9A#W0A : =p j;R0jјsW9,S,_ IDATQ[[ +Iܫ[ñO'bpOʮe?T~-@vF--O'>}Rk~x2a쀀⓲u"[+ {3߼gGE;Uy!$ ?㌃>[1G={9iӞ{DtVJGnkmlv ܌Hm7H~Tx4)۪qYKsIm"{vFq~}>hsrbyf]#'6.Ӱc%, X0d5@ióGp@2!vJؔ2fI{Ϋ*6£+öOnm=P\^N]Wz( !06"kꦹ#P|BvR4콎{^Ig`V{Kɗk?r+[}t8wdkkܱcNc|,Kc]e ]Ԩ_w܀L8w9^lוWt(ZLllK)+!)'f'fefii:>)+.1KҊ [}߃7SHGWY:1uӋQ-7?Xl|R ٶ}:)O|ViWmGՊ w̱UkT,5~;BA"bre"5b˦{N_H0)^JDvfG6jnPoybZNg]o3Py1C+֫HD7"R/]~|!dm)x&e@nVJLQjd@A8}>~lT^˿Wł_nѺ&dOU*QJ;rƙvDIogxoUנ#aH|*%Tx@@̓́V5+;@D ?aO4zw,gf.߰W.lXC"""矘Q!g=ɔ^ܡϟ\X{;5uI*mbqIC*.="G%G;ѿѳέID ߘ*cf]3{\VIf8o ]I$2;wO 5s5z֙u.Yaٗqy ܪTy:n*މN'W' RÚ}'OOUDO?kSج(.]}ܛYJZw;-K2nGr s-*t39!9;=9ֺOPѳJ.] e-. syVz;DшW\&.Y=mW ls#³BD$(Q|Rv~Noo /GO\֑2juؗ`l6 3|3чw,oҭjI&@Vɔ YlтH.V Ԣ 5^4w"!Qݱ\NH B|3TUHh܃D695ѺY~krdٸ shx=d{]ZyS @L>~9ٽ7IN<ŶuɾхicCDiǜsls7~ZNDٮM}= wy1FbT䛽n1HؓK7H.7nHk(geͽmZϥ[ il5b_{l!܍NqgθS?|M݉is[I$ s]rBB#Ona;$mGcټN-=͈DE^[TPh 1#~uM~bTy "R: ;OwM s{={t*Kh0wh,K|QglW;/#oآ! ܸ@W'osJY:F>9k+Ej {׿ +mØ[bLa^vܶ~y[YZg 8xV$"(!9;":Qn$Ecշj-ui1fgYCYqW_OhODfy1a|Bz]zHX{BV$zs_ PBRn:W^V D&>_|m0ΤH+RƩߚ{5$zxjDDj-hn&'R=T{7Q\O uy@$+HТZEV#5i4ȴ@?[ D"kj={N*:Yۑ ͭ+}蟓34+7ܙ<iy9Ue+>ouQV#b1gRO3bnwn ~^ZAo2" |q|&}̽\9I>r>W}< >5BTTjmLx7A5># ?(pf O7/G ND;?`Fikޤ/,ѲhTԳTW\z禐Ms8"*kpFB+,?Kӳ-E&)e w}RG{3>W7ᕞH7 x"ZzdVdsvvtkk ml:=":x1O3@'*FrWc"ȣɣ*-Ϥ[[NmS~)GC"/CԅzYYPyp7Z[.,ZumDdcXaqF"-F vi`5Z[xG?OsQlV-'+Բۼr+E'agFDTP5G~پ+=zz>fmZ+omefVA[OϬmqŗ=`\TSD-EֻQ+nsIN>,ᘴ5bXɗQ}*F. \uuh:UsvdZA1#Ym8(wRI>F&Tjd"uIcym)35lme_ xZ7<_\HF?։bZlSk+xYvF'ldN/ƝxQ+|f /AFpYDTmmF]S$畚v;@X"*tZjY -6_qךfBZ҈5*;]Ljwlj[,% @\+gio[k"N5\΍T*0%^_]d"=ؤNeiyuOI"qZ5ɭrx,~;%%-q.xѺs;߹7ԅ_[>ʭ#X>_G]|,5 zD*)0=M#֬6yhU`HDj8{U:9ϼ=O<)"R*dgw#1ֶ+hs4w4z=^fwJ=2Xt"plԽVkvʍqty,%-N]O5Y?c"j-dZ-RȞ?#?Ii׾ն>|J瓪C<}Hf򥿅+lW,}<0mN_pµdRHH)۵BD]Zy E88CwGu  )ܙJ7?^NDv6r,֔r+e$Xǖt#EWL{; ]KևkMRL@s j\pj=:*kEDOknLr53C~Nuvdڐa}.*Gehd_[隕/4TD\ſ,Jۢ/̘#+8AɃtraVmMtwJ)z;w:ɭENOh }< Dgɶ-M깸:Y;]JĬGO22A?e_Z!keńBK;V6aYf?4uo}egrɇOgmnowo{v*_7?Df2gL?oך: 4 ?MDtU@Ve씧'<[xF"md j;qu6~viŭ?5ոK gK7˝W{3uBZQ^a1G.Ww}\|^mWFAY9=yUm//;Ï.Ar)Let0&Rk7zX&oN"r =V27&y^F6E*m-˒HQDjqfrMJx갍8U&/:{ 1Pt9ڛ͙Pm@.F\R![{1v67, /.~oiıgl WV>0 4SḿZQ-:h,)䲵 wneԊu*M-; =rcQ#aOH zjUx^ĘxJٷB.^OI70p'A۟͐ v1yWigrk3 ~Fў8#5vH>Cj\Uz?yɓIq]}BjeMF){V{Wא, sq?ҪУ ٩*鋺Jg$"j .-AL&ӫ"-X,˺r@F\e+ufJ|RͪyC|e2Az-?oeBNoE# ݷuZ`ޡG:$b2JQHF#(uT2!W&ysh#l5[#O˴TxY~ _j ZPi5Wmi Z,m_hUs#9\SJT22Q9?IEDH=CODQS/RADV eC{H$t2{)emk[yw{~|rE+ϝ*MK[B !wrӼq{}̉j}'Gm状^,Ԫƹkc5-f51R )LfwSu*1 _l8IDAT Vic({7q ѧVd9uk\W.MB R0db{V"X9L= 1bHiq)BCӝ$ÚR(C)M3ƝvCմ1ԞսG֮nٽQi^epqӕθu 'k)8}@Ә)iʣzJ4͇kFg&Kjۚ>GxS aw@U=~G  Pu7^VLejj˒[W8ًkԳeu3ܷގk,sб;wtn7`rW#P th{*~i_*1ܓ+{!s#g.u]=oFϿ>9xm+hnQuuz##[w.qXVuvCzrҸuC yZ}|msS_ ڒc9bPԝX2'5mɴoO1_>Pӂya\=;PH@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@R#d 5H@fC_IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/frontends.rst0000644000076500000240000007576614646713253020163 0ustar00twstaff.. include:: ../global.rst.inc .. highlight:: none .. _json_output: All about JSON: How to develop frontends ======================================== Borg does not have a public API on the Python level. That does not keep you from writing :code:`import borg`, but does mean that there are no release-to-release guarantees on what you might find in that package, not even for point releases (1.1.x), and there is no documentation beyond the code and the internals documents. Borg does on the other hand provide an API on a command-line level. In other words, a frontend should (for example) create a backup archive just invoke :ref:`borg_create`, give commandline parameters/options as needed and parse JSON output from borg. Important: JSON output is expected to be UTF-8, but currently borg depends on the locale being configured for that (must be a UTF-8 locale and *not* "C" or "ascii"), so that Python will choose to encode to UTF-8. The same applies to any inputs read by borg, they are expected to be UTF-8 encoded also. On POSIX systems, you can usually set environment vars to choose a UTF-8 locale: :: export LANG=en_US.UTF-8 export LC_CTYPE=en_US.UTF-8 Another way to get Python's stdin/stdout/stderr streams to use UTF-8 encoding (without having a UTF-8 locale / LANG / LC_CTYPE) is: :: export PYTHONIOENCODING=utf-8 See :issue:`2273` for more details. Dealing with non-unicode byte sequences and JSON limitations ------------------------------------------------------------ Paths on POSIX systems can have arbitrary bytes in them (except 0x00 which is used as string terminator in C). Nowadays, UTF-8 encoded paths (which decode to valid unicode) are the usual thing, but a lot of systems still have paths from the past, when other, non-unicode codings were used. Especially old Samba shares often have wild mixtures of misc. encodings, sometimes even very broken stuff. borg deals with such non-unicode paths ("with funny/broken characters") by decoding such byte sequences using UTF-8 coding and "surrogateescape" error handling mode, which maps invalid bytes to special unicode code points (surrogate escapes). When encoding such a unicode string back to a byte sequence, the original byte sequence will be reproduced exactly. JSON should only contain valid unicode text without any surrogate escapes, so we can't just directly have a surrogate-escaped path in JSON ("path" is only one example, this also affects other text-like content). Borg deals with this situation like this (since borg 2.0): For a valid unicode path (no surrogate escapes), the JSON will only have "path": path. For a non-unicode path (with surrogate escapes), the JSON will have 2 entries: - "path": path_approximation (pure valid unicode, all invalid bytes will show up as "?") - "path_b64": path_bytes_base64_encoded (if you decode the base64, you get the original path byte string) JSON users need to pick whatever suits their needs best. The suggested procedure (shown for "path") is: - check if there is a "path_b64" key. - if it is there, you will know that the original bytes path did not cleanly UTF-8-decode into unicode (has some invalid bytes) and that the string given by the "path" key is only an approximation, but not the precise path. if you need precision, you must base64-decode the value of "path_b64" and deal with the arbitrary byte string you'll get. if an approximation is fine, use the value of the "path" key. - if it is not there, the value of the "path" key is all you need (the original bytes path is its UTF-8 encoding). Logging ------- Especially for graphical frontends it is important to be able to convey and reformat progress information in meaningful ways. The ``--log-json`` option turns the stderr stream of Borg into a stream of JSON lines, where each line is a JSON object. The *type* key of the object determines its other contents. .. warning:: JSON logging requires successful argument parsing. Even with ``--log-json`` specified, a parsing error will be printed in plain text, because logging set-up happens after all arguments are parsed. The following types are in use. Progress information is governed by the usual rules for progress information, it is not produced unless ``--progress`` is specified. archive_progress Output during operations creating archives (:ref:`borg_create` and :ref:`borg_recreate`). The following keys exist, each represents the current progress. original_size Original size of data processed so far (before compression and deduplication, may be empty/absent) compressed_size Compressed size (may be empty/absent) deduplicated_size Deduplicated size (may be empty/absent) nfiles Number of (regular) files processed so far (may be empty/absent) path Current path (may be empty/absent) time Unix timestamp (float) finished boolean indicating whether the operation has finished, only the last object for an *operation* can have this property set to *true*. progress_message A message-based progress information with no concrete progress information, just a message saying what is currently being worked on. operation unique, opaque integer ID of the operation :ref:`msgid ` Message ID of the operation (may be *null*) finished boolean indicating whether the operation has finished, only the last object for an *operation* can have this property set to *true*. message current progress message (may be empty/absent) time Unix timestamp (float) progress_percent Absolute progress information with defined end/total and current value. operation unique, opaque integer ID of the operation :ref:`msgid ` Message ID of the operation (may be *null*) finished boolean indicating whether the operation has finished, only the last object for an *operation* can have this property set to *true*. message A formatted progress message, this will include the percentage and perhaps other information (absent for finished == true) current Current value (always less-or-equal to *total*, absent for finished == true) info Array that describes the current item, may be *null*, contents depend on *msgid* (absent for finished == true) total Total value (absent for finished == true) time Unix timestamp (float) file_status This is only output by :ref:`borg_create` and :ref:`borg_recreate` if ``--list`` is specified. The usual rules for the file listing applies, including the ``--filter`` option. status Single-character status as for regular list output path Path of the file system object log_message Any regular log output invokes this type. Regular log options and filtering applies to these as well. time Unix timestamp (float) levelname Upper-case log level name (also called severity). Defined levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL name Name of the emitting entity message Formatted log message :ref:`msgid ` Message ID, may be *null* or absent See Prompts_ for the types used by prompts. .. rubric:: Examples (reformatted, each object would be on exactly one line) .. highlight:: json :ref:`borg_extract` progress:: {"message": "100.0% Extracting: src/borgbackup.egg-info/entry_points.txt", "current": 13000228, "total": 13004993, "info": ["src/borgbackup.egg-info/entry_points.txt"], "operation": 1, "msgid": "extract", "type": "progress_percent", "finished": false} {"message": "100.0% Extracting: src/borgbackup.egg-info/SOURCES.txt", "current": 13004993, "total": 13004993, "info": ["src/borgbackup.egg-info/SOURCES.txt"], "operation": 1, "msgid": "extract", "type": "progress_percent", "finished": false} {"operation": 1, "msgid": "extract", "type": "progress_percent", "finished": true} :ref:`borg_create` file listing with progress:: {"original_size": 0, "compressed_size": 0, "deduplicated_size": 0, "nfiles": 0, "type": "archive_progress", "path": "src"} {"type": "file_status", "status": "U", "path": "src/borgbackup.egg-info/entry_points.txt"} {"type": "file_status", "status": "U", "path": "src/borgbackup.egg-info/SOURCES.txt"} {"type": "file_status", "status": "d", "path": "src/borgbackup.egg-info"} {"type": "file_status", "status": "d", "path": "src"} {"original_size": 13176040, "compressed_size": 11386863, "deduplicated_size": 503, "nfiles": 277, "type": "archive_progress", "path": ""} Internal transaction progress:: {"message": "Saving files cache", "operation": 2, "msgid": "cache.commit", "type": "progress_message", "finished": false} {"message": "Saving cache config", "operation": 2, "msgid": "cache.commit", "type": "progress_message", "finished": false} {"message": "Saving chunks cache", "operation": 2, "msgid": "cache.commit", "type": "progress_message", "finished": false} {"operation": 2, "msgid": "cache.commit", "type": "progress_message", "finished": true} A debug log message:: {"message": "35 self tests completed in 0.08 seconds", "type": "log_message", "created": 1488278449.5575905, "levelname": "DEBUG", "name": "borg.archiver"} Prompts ------- Prompts assume a JSON form as well when the ``--log-json`` option is specified. Responses are still read verbatim from *stdin*, while prompts are JSON messages printed to *stderr*, just like log messages. Prompts use the *question_prompt* and *question_prompt_retry* types for the prompt itself, and *question_invalid_answer*, *question_accepted_default*, *question_accepted_true*, *question_accepted_false* and *question_env_answer* types for information about prompt processing. The *message* property contains the same string displayed regularly in the same situation, while the *msgid* property may contain a msgid_, typically the name of the environment variable that can be used to override the prompt. It is the same for all JSON messages pertaining to the same prompt. .. rubric:: Examples (reformatted, each object would be on exactly one line) .. highlight:: none Providing an invalid answer:: {"type": "question_prompt", "msgid": "BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "message": "... Type 'YES' if you understand this and want to continue: "} incorrect answer # input on stdin {"type": "question_invalid_answer", "msgid": "BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "is_prompt": false, "message": "Invalid answer, aborting."} Providing a false (negative) answer:: {"type": "question_prompt", "msgid": "BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "message": "... Type 'YES' if you understand this and want to continue: "} NO # input on stdin {"type": "question_accepted_false", "msgid": "BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "message": "Aborting.", "is_prompt": false} Providing a true (affirmative) answer:: {"type": "question_prompt", "msgid": "BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "message": "... Type 'YES' if you understand this and want to continue: "} YES # input on stdin # no further output, just like the prompt without --log-json Passphrase prompts ------------------ Passphrase prompts should be handled differently. Use the environment variables *BORG_PASSPHRASE* and *BORG_NEW_PASSPHRASE* (see :ref:`env_vars` for reference) to pass passphrases to Borg, don't use the interactive passphrase prompts. When setting a new passphrase (:ref:`borg_rcreate`, :ref:`borg_key_change-passphrase`) normally Borg prompts whether it should display the passphrase. This can be suppressed by setting the environment variable *BORG_DISPLAY_PASSPHRASE* to *no*. When "confronted" with an unknown repository, where the application does not know whether the repository is encrypted, the following algorithm can be followed to detect encryption: 1. Set *BORG_PASSPHRASE* to gibberish (for example a freshly generated UUID4, which cannot possibly be the passphrase) 2. Invoke ``borg list repository ...`` 3. If this fails, due the repository being encrypted and the passphrase obviously being wrong, you'll get an error with the *PassphraseWrong* msgid. The repository is encrypted, for further access the application will need the passphrase. 4. If this does not fail, then the repository is not encrypted. Standard output --------------- *stdout* is different and more command-dependent than logging. Commands like :ref:`borg_info`, :ref:`borg_create` and :ref:`borg_list` implement a ``--json`` option which turns their regular output into a single JSON object. Some commands, like :ref:`borg_list` and :ref:`borg_diff`, can produce *a lot* of JSON. Since many JSON implementations don't support a streaming mode of operation, which is pretty much required to deal with this amount of JSON, these commands implement a ``--json-lines`` option which generates output in the `JSON lines `_ format, which is simply a number of JSON objects separated by new lines. Dates are formatted according to ISO 8601 in local time. No explicit time zone is specified *at this time* (subject to change). The equivalent strftime format string is '%Y-%m-%dT%H:%M:%S.%f', e.g. ``2017-08-07T12:27:20.123456``. The root object of '--json' output will contain at least a *repository* key with an object containing: id The ID of the repository, normally 64 hex characters location Canonicalized repository path, thus this may be different from what is specified on the command line last_modified Date when the repository was last modified by the Borg client The *encryption* key, if present, contains: mode Textual encryption mode name (same as :ref:`borg_rcreate` ``--encryption`` names) keyfile Path to the local key file used for access. Depending on *mode* this key may be absent. The *cache* key, if present, contains: path Path to the local repository cache stats Object containing cache stats: total_chunks Number of chunks total_unique_chunks Number of unique chunks total_size Total uncompressed size of all chunks multiplied with their reference counts unique_size Uncompressed size of all chunks .. highlight: json Example *borg info* output:: { "cache": { "path": "/home/user/.cache/borg/0cbe6166b46627fd26b97f8831e2ca97584280a46714ef84d2b668daf8271a23", "stats": { "total_chunks": 511533, "total_size": 22635749792, "total_unique_chunks": 54892, "unique_size": 2449675468 } }, "encryption": { "mode": "repokey" }, "repository": { "id": "0cbe6166b46627fd26b97f8831e2ca97584280a46714ef84d2b668daf8271a23", "last_modified": "2017-08-07T12:27:20.789123", "location": "/home/user/testrepo" }, "security_dir": "/home/user/.config/borg/security/0cbe6166b46627fd26b97f8831e2ca97584280a46714ef84d2b668daf8271a23", "archives": [] } Archive formats +++++++++++++++ :ref:`borg_info` uses an extended format for archives, which is more expensive to retrieve, while :ref:`borg_list` uses a simpler format that is faster to retrieve. Either return archives in an array under the *archives* key, while :ref:`borg_create` returns a single archive object under the *archive* key. Both formats contain a *name* key with the archive name, the *id* key with the hexadecimal archive ID, and the *start* key with the start timestamp. *borg info* and *borg create* further have: end End timestamp duration Duration in seconds between start and end in seconds (float) stats Archive statistics (freshly calculated, this is what makes "info" more expensive) original_size Size of files and metadata before compression compressed_size Size after compression deduplicated_size Deduplicated size (against the current repository, not when the archive was created) nfiles Number of regular files in the archive command_line Array of strings of the command line that created the archive The note about paths from above applies here as well. chunker_params The chunker parameters the archive has been created with. :ref:`borg_info` further has: hostname Hostname of the creating host username Name of the creating user comment Archive comment, if any Some keys/values are more expensive to compute than others (e.g. because it requires opening the archive, not just the manifest). To optimize for speed, `borg list repo` does not determine these values except when they are requested. The `--format` option is used for that (for normal mode as well as for `--json` mode), so, to have the comment included in the json output, you will need: :: borg list repo --format "{name}{comment}" --json` Example of a simple archive listing (``borg list --last 1 --json``):: { "archives": [ { "id": "80cd07219ad725b3c5f665c1dcf119435c4dee1647a560ecac30f8d40221a46a", "name": "host-system-backup-2017-02-27", "start": "2017-08-07T12:27:20.789123" } ], "encryption": { "mode": "repokey" }, "repository": { "id": "0cbe6166b46627fd26b97f8831e2ca97584280a46714ef84d2b668daf8271a23", "last_modified": "2017-08-07T12:27:20.789123", "location": "/home/user/repository" } } The same archive with more information (``borg info --last 1 --json``):: { "archives": [ { "chunker_params": [ "buzhash", 13, 23, 16, 4095 ], "command_line": [ "/home/user/.local/bin/borg", "create", "/home/user/repository", "..." ], "comment": "", "duration": 5.641542, "end": "2017-02-27T12:27:20.789123", "hostname": "host", "id": "80cd07219ad725b3c5f665c1dcf119435c4dee1647a560ecac30f8d40221a46a", "name": "host-system-backup-2017-02-27", "start": "2017-02-27T12:27:20.789123", "stats": { "compressed_size": 1880961894, "deduplicated_size": 2791, "nfiles": 53669, "original_size": 2400471280 }, "username": "user" } ], "cache": { "path": "/home/user/.cache/borg/0cbe6166b46627fd26b97f8831e2ca97584280a46714ef84d2b668daf8271a23", "stats": { "total_chunks": 511533, "total_size": 22635749792, "total_unique_chunks": 54892, "unique_size": 2449675468 } }, "encryption": { "mode": "repokey" }, "repository": { "id": "0cbe6166b46627fd26b97f8831e2ca97584280a46714ef84d2b668daf8271a23", "last_modified": "2017-08-07T12:27:20.789123", "location": "/home/user/repository" } } File listings +++++++++++++ Each archive item (file, directory, ...) is described by one object in the :ref:`borg_list` output. Refer to the *borg list* documentation for the available keys and their meaning. Example (excerpt) of ``borg list --json-lines``:: {"type": "d", "mode": "drwxr-xr-x", "user": "user", "group": "user", "uid": 1000, "gid": 1000, "path": "linux", "healthy": true, "target": "", "flags": null, "mtime": "2017-02-27T12:27:20.023407", "size": 0} {"type": "d", "mode": "drwxr-xr-x", "user": "user", "group": "user", "uid": 1000, "gid": 1000, "path": "linux/baz", "healthy": true, "target": "", "flags": null, "mtime": "2017-02-27T12:27:20.585407", "size": 0} Archive Differencing ++++++++++++++++++++ Each archive difference item (file contents, user/group/mode) output by :ref:`borg_diff` is represented by an *ItemDiff* object. The properties of an *ItemDiff* object are: path: The filename/path of the *Item* (file, directory, symlink). changes: A list of *Change* objects describing the changes made to the item in the two archives. For example, there will be two changes if the contents of a file are changed, and its ownership are changed. The *Change* object can contain a number of properties depending on the type of change that occurred. If a 'property' is not required for the type of change, it is not output. The possible properties of a *Change* object are: type: The **type** property is always present. It identifies the type of change and will be one of these values: - *modified* - file contents changed. - *added* - the file was added. - *removed* - the file was removed. - *added directory* - the directory was added. - *removed directory* - the directory was removed. - *added link* - the symlink was added. - *removed link* - the symlink was removed. - *changed link* - the symlink target was changed. - *mode* - the file/directory/link mode was changed. Note - this could indicate a change from a file/directory/link type to a different type (file/directory/link), such as -- a file is deleted and replaced with a directory of the same name. - *owner* - user and/or group ownership changed. size: If **type** == '*added*' or '*removed*', then **size** provides the size of the added or removed file. added: If **type** == '*modified*' and chunk ids can be compared, then **added** and **removed** indicate the amount of data 'added' and 'removed'. If chunk ids can not be compared, then **added** and **removed** properties are not provided and the only information available is that the file contents were modified. removed: See **added** property. old_mode: If **type** == '*mode*', then **old_mode** and **new_mode** provide the mode and permissions changes. new_mode: See **old_mode** property. old_user: If **type** == '*owner*', then **old_user**, **new_user**, **old_group** and **new_group** provide the user and group ownership changes. old_group: See **old_user** property. new_user: See **old_user** property. new_group: See **old_user** property. Example (excerpt) of ``borg diff --json-lines``:: {"path": "file1", "changes": [{"path": "file1", "changes": [{"type": "modified", "added": 17, "removed": 5}, {"type": "mode", "old_mode": "-rw-r--r--", "new_mode": "-rwxr-xr-x"}]}]} {"path": "file2", "changes": [{"type": "modified", "added": 135, "removed": 252}]} {"path": "file4", "changes": [{"type": "added", "size": 0}]} {"path": "file3", "changes": [{"type": "removed", "size": 0}]} .. _msgid: Message IDs ----------- Message IDs are strings that essentially give a log message or operation a name, without actually using the full text, since texts change more frequently. Message IDs are unambiguous and reduce the need to parse log messages. Assigned message IDs and related error RCs (exit codes) are: .. See scripts/errorlist.py; this is slightly edited. Errors Error rc: 2 traceback: no Error: {} ErrorWithTraceback rc: 2 traceback: yes Error: {} Buffer.MemoryLimitExceeded rc: 2 traceback: no Requested buffer size {} is above the limit of {}. EfficientCollectionQueue.SizeUnderflow rc: 2 traceback: no Could not pop_front first {} elements, collection only has {} elements.. RTError rc: 2 traceback: no Runtime Error: {} CancelledByUser rc: 3 traceback: no Cancelled by user. CommandError rc: 4 traceback: no Command Error: {} PlaceholderError rc: 5 traceback: no Formatting Error: "{}".format({}): {}({}) InvalidPlaceholder rc: 6 traceback: no Invalid placeholder "{}" in string: {} Repository.AlreadyExists rc: 10 traceback: no A repository already exists at {}. Repository.CheckNeeded rc: 12 traceback: yes Inconsistency detected. Please run "borg check {}". Repository.DoesNotExist rc: 13 traceback: no Repository {} does not exist. Repository.InsufficientFreeSpaceError rc: 14 traceback: no Insufficient free space to complete transaction (required: {}, available: {}). Repository.InvalidRepository rc: 15 traceback: no {} is not a valid repository. Check repo config. Repository.InvalidRepositoryConfig rc: 16 traceback: no {} does not have a valid configuration. Check repo config [{}]. Repository.ObjectNotFound rc: 17 traceback: yes Object with key {} not found in repository {}. Repository.ParentPathDoesNotExist rc: 18 traceback: no The parent path of the repo directory [{}] does not exist. Repository.PathAlreadyExists rc: 19 traceback: no There is already something at {}. Repository.StorageQuotaExceeded rc: 20 traceback: no The storage quota ({}) has been exceeded ({}). Try deleting some archives. Repository.PathPermissionDenied rc: 21 traceback: no Permission denied to {}. MandatoryFeatureUnsupported rc: 25 traceback: no Unsupported repository feature(s) {}. A newer version of borg is required to access this repository. NoManifestError rc: 26 traceback: no Repository has no manifest. UnsupportedManifestError rc: 27 traceback: no Unsupported manifest envelope. A newer version is required to access this repository. Archive.AlreadyExists rc: 30 traceback: no Archive {} already exists Archive.DoesNotExist rc: 31 traceback: no Archive {} does not exist Archive.IncompatibleFilesystemEncodingError rc: 32 traceback: no Failed to encode filename "{}" into file system encoding "{}". Consider configuring the LANG environment variable. KeyfileInvalidError rc: 40 traceback: no Invalid key data for repository {} found in {}. KeyfileMismatchError rc: 41 traceback: no Mismatch between repository {} and key file {}. KeyfileNotFoundError rc: 42 traceback: no No key file for repository {} found in {}. NotABorgKeyFile rc: 43 traceback: no This file is not a borg key backup, aborting. RepoKeyNotFoundError rc: 44 traceback: no No key entry found in the config of repository {}. RepoIdMismatch rc: 45 traceback: no This key backup seems to be for a different backup repository, aborting. UnencryptedRepo rc: 46 traceback: no Key management not available for unencrypted repositories. UnknownKeyType rc: 47 traceback: no Key type {0} is unknown. UnsupportedPayloadError rc: 48 traceback: no Unsupported payload type {}. A newer version is required to access this repository. UnsupportedKeyFormatError rc: 49 traceback:no Your borg key is stored in an unsupported format. Try using a newer version of borg. NoPassphraseFailure rc: 50 traceback: no can not acquire a passphrase: {} PasscommandFailure rc: 51 traceback: no passcommand supplied in BORG_PASSCOMMAND failed: {} PassphraseWrong rc: 52 traceback: no passphrase supplied in BORG_PASSPHRASE, by BORG_PASSCOMMAND or via BORG_PASSPHRASE_FD is incorrect. PasswordRetriesExceeded rc: 53 traceback: no exceeded the maximum password retries Cache.CacheInitAbortedError rc: 60 traceback: no Cache initialization aborted Cache.EncryptionMethodMismatch rc: 61 traceback: no Repository encryption method changed since last access, refusing to continue Cache.RepositoryAccessAborted rc: 62 traceback: no Repository access aborted Cache.RepositoryIDNotUnique rc: 63 traceback: no Cache is newer than repository - do you have multiple, independently updated repos with same ID? Cache.RepositoryReplay rc: 64 traceback: no Cache, or information obtained from the security directory is newer than repository - this is either an attack or unsafe (multiple repos with same ID) LockError rc: 70 traceback: no Failed to acquire the lock {}. LockErrorT rc: 71 traceback: yes Failed to acquire the lock {}. LockFailed rc: 72 traceback: yes Failed to create/acquire the lock {} ({}). LockTimeout rc: 73 traceback: no Failed to create/acquire the lock {} (timeout). NotLocked rc: 74 traceback: yes Failed to release the lock {} (was not locked). NotMyLock rc: 75 traceback: yes Failed to release the lock {} (was/is locked, but not by me). ConnectionClosed rc: 80 traceback: no Connection closed by remote host ConnectionClosedWithHint rc: 81 traceback: no Connection closed by remote host. {} InvalidRPCMethod rc: 82 traceback: no RPC method {} is not valid PathNotAllowed rc: 83 traceback: no Repository path not allowed: {} RemoteRepository.RPCServerOutdated rc: 84 traceback: no Borg server is too old for {}. Required version {} UnexpectedRPCDataFormatFromClient rc: 85 traceback: no Borg {}: Got unexpected RPC data format from client. UnexpectedRPCDataFormatFromServer rc: 86 traceback: no Got unexpected RPC data format from server: {} ConnectionBrokenWithHint rc: 87 traceback: no Connection to remote host is broken. {} IntegrityError rc: 90 traceback: yes Data integrity error: {} FileIntegrityError rc: 91 traceback: yes File failed integrity check: {} DecompressionError rc: 92 traceback: yes Decompression error: {} Warnings BorgWarning rc: 1 Warning: {} BackupWarning rc: 1 {}: {} FileChangedWarning rc: 100 {}: file changed while we backed it up IncludePatternNeverMatchedWarning rc: 101 Include pattern '{}' never matched. BackupError rc: 102 {}: backup error BackupRaceConditionError rc: 103 {}: file type or inode changed while we backed it up (race condition, skipped file) BackupOSError rc: 104 {}: {} BackupPermissionError rc: 105 {}: {} BackupIOError rc: 106 {}: {} BackupFileNotFoundError rc: 107 {}: {} Operations - cache.begin_transaction - cache.download_chunks, appears with ``borg create --no-cache-sync`` - cache.commit - cache.sync *info* is one string element, the name of the archive currently synced. - repository.compact_segments - repository.replay_segments - repository.check - check.verify_data - check.rebuild_manifest - check.rebuild_refcounts - extract *info* is one string element, the name of the path currently extracted. - extract.permissions - archive.delete - archive.calc_stats - prune - upgrade.convert_segments Prompts BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK For "Warning: Attempting to access a previously unknown unencrypted repository" BORG_RELOCATED_REPO_ACCESS_IS_OK For "Warning: The repository at location ... was previously located at ..." BORG_CHECK_I_KNOW_WHAT_I_AM_DOING For "This is a potentially dangerous function..." (check --repair) BORG_DELETE_I_KNOW_WHAT_I_AM_DOING For "You requested to DELETE the repository completely *including* all archives it contains:" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/object-graph.odg0000644000076500000240000007204514646713253020452 0ustar00twstaffPKU.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKUConfigurations2/toolbar/PKUConfigurations2/floater/PKUConfigurations2/menubar/PKUConfigurations2/popupmenu/PKUConfigurations2/toolpanel/PKUConfigurations2/progressbar/PKUConfigurations2/statusbar/PKUConfigurations2/images/Bitmaps/PKUConfigurations2/accelerator/PKU styles.xml\[o~|о)Kt] )6t@K, ''_Rol|K$gș8C~|Z%#yL$uIǛ?#y⫈NWH-ˮ}T^7瞪xu[<ίR sU"|']^7$2KLFqE]my>`fs?e57X^>LsGa4lQ ᛖ%13X#6][^nvukur? CXM }* xmQOI>T?NY礫x󃮑TNbPrQs?B\4c"Ɖ/c]PBU)$jt'_wŐg;-Yh(KcV%#P{zn?'|ƟؑϠuvQ;w$%=׽f=8Tp8ăD%,f!GDc_Fy}u Es*~*PV-RBG-790rxvǏ5/V>9ëc /ժ^DhޯT\޼WG':CŧT4?[)(]*{ G>YcU7,AϮXvc/<2v0 8mf`,*qVi/7GʍW78IȦG#Oe+KAȶ&D)tzO19 /K\ %FQ{NR09W-=S{./=Zg?l?*#{ HxaDF5y;$̈ UV8QƗabyZ!ەkkSy0U1li.1clm) D(ƱP. y;^pY<| x(hf1%x΀CbYBS ('(*{%y$2xU;q#mp\-8l$9b"/V#:8u46c9V?~%4p$f~{5o/7M$B!\ $B!4x\7''ChF8 {W'h-Z&V{ ./`\zՅ*ˎr\ڔ̪FrKrH`HVLaN ]hQfJR ڬhhmVIXÖKWelL92#}Aݣ n M!i#s5g*T6brݞHlɎjePhƺTnTeI*EQ6Z70sOt;}5k0 Hx-ȝEqy*bP!V.%Gf_q61[餺d"Ƭ i0~ {:ߔoh rE!-e3ā ە`NR;ϼO'Ht{;suz8n4ܿE7ojb`‚ x}>,T,ߓ^6#5v!u7k.wJåB3\/)`4Lթ>No˚>mܒn]C^$Qw4͖}Pvs+=ԻR5KY5P)j[nM}~+7@b4RxaTca"}v7u^>g_ieL,/ b.3 kz&~sMeey1\s {Wtxnh]З OFm4X'DB]|삄#y2$£y@uW FZQr_u#8]|[{,Aif PSs!jq8qZYtR5SNcvG NEWԈiπs»[@=xJ\f%k~*xwi[o8hޖ.ovomx ˋ.׻ہ1f,1иQ7 ,ˤ2H04` wk‡mRgy3ø"Py.FEpLxoHzo׳|BI(_Nb*Sm;$(XKbXZuSƵ:-,x_PKvz QPKU content.xml][~HЊ,,8K K$*|l)}i\~IIbɺX[h19$ 3Gq(]Ly <;n?~N0׏zsFW> AB9:Z_&I0i)bEќ_Eb7~,@:(m-J}zo/o> vR¤C'IB%9c*cO(DRqEyuyѢ:NdBiɚ*7з9-%kVؖgM=]J7Ժsu}X}Ǣc~ڝ~d{f){6+wlUFv+TŚ"#.V E&'`P&4=Z' v6{PCІÈʋ$N(MND^"~췚Pj3rsYp,9lEl%˖uhLޒJՎ%#7mShq$ #_O9oe#A?JCQ̥)S NJ{o1Ȟc;l8>aZsia"`b}(nb<[|rwu؛<7Q) _'SfKl@4¾uC.x`]O'[5*k~m ޣF܏߷\=KQq蓶 +V -~}}VxuB,2 ZZojM.];/쇐6³dW<> k+Y@Q⢘=?" J!نQKd9OP (PAgt)e4!ܒM<;ُ}D%Ȝ,jѴ8ާ Ɍ `x4iPXsbzKby'|ꗰ K.D.sˋI?nPJ@SU zVIӤ=*&LeU S:4ꋙҾhDE9*Qo1@TbHaL!z[ro~2.M\Tf8N;1+ZOZk8| ^*'H|+^"L',Iz^znl+U\CN{kWBzi6p4?ٿi҂tPV<4OZ4VuΔ2)6( x8Z:zGLnQU+z+j&!6╤sBHqt.a/iOK@7s6p+!]i "e2up;xBpQnNw@pC9xs&ny5O d ^x kE7ApC4MȷpX4{R~5α T\lD1nu-uE`a#bA$M0vQcVeNz:/N{D my8$гT",«iYkI~iaTFύ$LgeV.dӟi@I*FkQf+xXR-E5#pgV qr!bI%B2!bA%Brܩ6.rvڼ Bi A~ZTړ<ŬbmFnx|CoN7qKawLA(skѠ#z,8H?J-}}«FuN H\Ղ(2 3%AȷUMiI=fog:dثHIV؈lEIiG)SV(,MDlqLYE6tKj7V2ud/gK" GX $ڲN댾d,9(ibOmN#d'V(%]o9)k^}ܿwl 22}z%!AZ;Gq2},P4ZRt;{p):VX.  ' %Q̖-]9o\ w' ݧWO_kI |`w XI6b}ņ?9֊+/&PcO0\mYmZڋlhi7 IC@Ƨv2 ehx2Gr&ɜRHK.Ʃq*ryuQF 퉾 u |@Q.>s-2pyqHÜj}N6YmZ i ꉬڹpswYX:݉@3[޹}i᭐˘F#ظ9 ̄ZU{=3s۟,(O]TtP4S&m9Kf,S"[%_g;|P_V+'ٯTL3gMEnIWiMÿvݭ~p4fJxqT;wR)rea|7pRomz&R|=?z뭜0SQ]rpGe)vKꓕ4 Ȱv"']T'rb|U2׻gxO7s1'CݏOlx)Ʈd7վݝSz^!Z""!Jpb%R&k蚡I:cD$И;Z~WnO.4e#6fHQBd(ȆD@ڏf!>fSjecPWe3H٘l) h(F6T٤ϿG Q6H3L@g1fQ@=*3Dhdz G(a(8+g‘& gv0#U ޷ T8*PpVk{S(Ԅ"qwM7bwZA]$I<s@@ 6=ވH{ԅHZCD)/@˽S[XV&bYyA{7L(YӻYfwN| Ah2# g8Y/r<+ x[}3<7tke:(f9SSޑp`| W'{Fi{Ѣ+W ~?PKf.fRPί~k#E.‘$eE9tCT1)JsbSXp/׼r8'f\D {xb8X+|xu3mem){룂O;l{ؘA|>Q6d9HzrQ~^cm. S~<^EKg'U(Bxl)xzQ} \x}\0xqĔJ-24ȵ>m)F,WGT4Mٶwޑ#|k8x%4=$fH.a8bjcG5 f2pe d1biZfht˥@j4x[@0e. (CEqt78ytB6>Be^\\$S(k.w>E}>7k; ySZ9 (ڷ^A܎ls.S@;z@yPrOؠ&$!_e⻧Qb9bgp]V" t )d)uıK xЛ ~XLxxSA4-@k%TaM q;6rF:24M&I h )5` Px=.!g,bewy]GOX}{Dnc>]%HQQSx؍i0|l (t%/H༏(lyX9Kp$Iى@‰:tP7Li\3y[uPr'H3ӿP&|@Έ;Նgcא#*4EYiP=ћ)`uBGýwE\u1{HP%&,4 x0FnvB   澹>m|%K,37Kv2maw#4r"[' )3(𼬜ohi7Dm=M3ŢY1PgCi2߰0Â8{뙩hȇ#al+;;,"zڞDllHܦIk#ќW&Vp72{?.Lo;a ehඬe+u 7 hRVa݄^iQSxmS)ʞ4 &ÿ~8EҐbZS^N[mʽ7WN/Sj1[VA>2ijVܰZohq193mka9)?LM~b^zCf[J׬N"ҍWPBN<]c172xvǽ+XPKm(PKU?pHpHThumbnails/thumbnail.pngPNG  IHDR<fPLTE ###+++333;;;CCCKKKTTT[[[ccckkksss|||7zeGIDATx]*{A/2qF0>h8888888TNJo]uӿ.Q;Qk=犃WUaЯ,~߫WenYW!ug$3IaV6RZu!QlYYm]\:, 0%AE2*t M2 VRJk;@ 9ҐRNlU%uUvtwN @(UfN#iZAY38V{QGvĩg|GusG!9+4B6?n~pc*1(r(GeYBv@Yݷ'o/˕A<֟1cTbQdi~oSpӴtzWap4xkߖh~akZ'ϢpgY&..PRմBi{^HU WYF'PEYQ/J/ĕYgYYV jNMq@=ПGP`vQdMZw񾽦`6QefUHUiiEs 5+1@"Du%5 ܿ?[8?:^OG@Kz!):F/+xԯ9()@t {F&TU0cK+<+NyrXݝ5_c:ݬYU7%^WcH57+!Sx$ I'ibfb̫eƬ!mU^G:L*GufE-An*>+/|cG(6o|cklEelqiEZEiaxg[ӵ|NeYLβM)@n{A]EZYݳWnKHA\=@($"1PMȼ=$2"MxI(|Z4-3_:©9I92 tM?3ͬ9D 8{Ax4L?.YiFQVeY℅Ki'`8czeYfigI > "'7C&td //l]Ec <m Ou85ʃ*V*=aR$r2n%Xzo@V&8ÿH.U?rKv^J=_Fd<[Bp x>ؤ$_B ˶,yj!(((l @0:Q myT@L` 5]׭- y@bx86YRx$>4/7ix|I#rOPˉs{־Tnǩ fpgd+'+ǿ%gPP(t8P?ՎiI/(_9eՊ=Q Z5Y~^E1 GlpTpsp:e7?!{_r Hҳ_hAߩzI[u,*:_X1[0$[ ĻQPW[i)<|cbvl$E7}{ޡxZx?Li\ZSFf6G}]mts@Vfr67 6{g&[ {-@^fJTgmzOi1P(z:>u=f^ծ}ď#Xi"K bonjy =ܭ_} ];2ȯPv._x'޳˰o"\P xy~oG1<ׁQBC<}ǟ+ʚ>gDC|HyBPɿdw^ؿX˞'.Kvm5>޲Y4JyڮHR!4++I?5L_^\RmDMO]dRX=EM{x66:_{1Sݵmj?85 {f Be>k& GN N;&P[ I1>.:ˎ9Ks#'m귗ՍtdﴩIAuҧ5mͰ/9I}X50S]U0].z^h-h :9͙&*K-SMˏń(ZIUVfF͎{%^kQ {'`Q8{lH;w}_iSTu#L'1F <Lw?:p1)xW)M&^ o"$Q<6JbnY1+i 6UcEU ye# ?i2~zžV{cQSRB#0yK) {fnzɰ)Y&*L=EOg_!e[7MEpܰa#%]M3vŅoNFlH<ȷJe(n3zf:>P+/"E]IL s<@'IVۍd Y"`U"P3D.?kq#]C-{]~xm$:D"$,1EӲhuSb -r˄ډ^޾ 5DhŇ&!˨((wF$Q#JX IH mNgH'5dBw 0}rGg#0$/+ yCUB CZ$Hv"ug?x대, B)f^)C;ND뛂(#Fk'(߅@t~o Zv: NDꦠeLBjbyE^˒F"kUk`R׭-}G*Пb&Oϰ,e$:ʿ LBJ];яJJHrIH)S;5-0 TbȢ&!>zP&j9ШܟM؉vf$^i{)Фڇ<{I!ߕxN!II-o}JMjZk[Bك)>4ma Z_f|JDj$}h SWyX/LB-~NddD'F-LAxCAh9^/L F"k%_~$ ةi$2I+w*ڱoSm&}SF nm&e޹OB/+[A[`Ih9_ۉ5mb z{66/˼~2;K#AhSb =g- HQ,I~qo-Xډhi#&yLB,?hxq:/o cO;Qr0mc /LB.?o@%&Dۘ6Ihl)&Iy}+SK,"I;c&mO^DcF"{D/D-8siۨ؎ҴJ |-֩2 m;*BN+Dۘ6T&헟ӢST}Z$#Q]E;X~\wj'mi4اpmc ՕEs*1zݣ̓5auM;0Yh,Oᇻ3*D"\ TMldi$79#ˡth16y _Խ(;=Ypofo.OʼnnH1,YfE>p6e+O3yo?v[y0f27_I1vgy[ҢM93hl-DoHpw2V ftKnͤ DGf|j P_YO'<@o<@{mڊ6=3Nu)<6@SwxTx㮽 EDZ=5<jI2yFT3+nyeӛ!y}-J'Sp"48lJN8nQ%8b XATNLPIڟLaFBwyJVY~A`"fی}85ҳ LpuLo(`2W[17@[O1G@08 @މ$7Puֹ磊8} +d1c3M13b5t{M XJ}P(r-B5<ف*8=T8#2DYVx.BQ"z~|(b!ͿVKmz>n"vrޭp#mH^XVsgu˦ʊ ASR[JH T{rQ`%[;K=@3}xW18 A/Xa>:zWeT(lBkZ1Hx M`2%oaz!M w`k%Жih LGgNIc^LjӶ5"~`y<8nA;=ɗ"5jg2J9~%HS>#Ū,gxAv5 cVVN7=n3)Ve3&05 d_]w'Gׄۧ?=Ϻ˟ ݡƠ\۠i yǵW?Y1?I%㦟&Y3eDO;[-5G yr6 |~@rQbjk2.SF$)X~w<8Ib^wa &C)/~o_,?4d)U[ޚ>isMwѴ4Lō4?lXs@19)o!7-4Los.z"npS:#R>q |K4SMr K5WU)ي ~˗l!+T'41OU5oA6$|}tMoUC:nTP&9r>I\IY]'!:ӇX[a/N<WX7{ Ky[ XmIxmo3DK5:>מXc1r9~9aIsvp#g%r B{1]^wbGiGXu#ڵ}Bg9:LVؙvb#45ڥ SZΎJ5! |Be` (]^oDS7R[wdJ) $.~UQ@inc- pK I.Yy)T. nJ r8 @,xKI32/Y.տhSK;3?pDtsW٭]΀QS΃#on?\HCQ0 &èU''p| X H ܛܲB]# pHhlsX p Գ0;#+)@IA0h`NjIHe(U 02{ 0@ZR==%`v( CpivEaZݐJʏQwŖ<(@.ZVPӀx-R]˸i U(@X9#=4l!*dNpc]9o ԇ[ pc1`6EeqG|f -nPaYұ'Y/;- [Ƽkx|@( 9$˰KOL0$S)G"0q()A/,k_R4fY' N9g`a}{Bs RP"d0MBv 4NxL-wrU֏4s@.z0m4XȤ# ^HRRM_[Lru"[^AȖARp` #t if2nZs=} wi/n(/CWC ?k=wTOn<^fT]h# 08!m} P}'!8Xaq5 7dmMMSR9v(fhO$@şR%`pO0@@ )4NeS;Ku^x3Sh|h0о10}}T@B;vg ؓw-=C]eU;I6^JF|+3t:YBl\C/X3>z4P:wʞf!|jIV`du}(P>ڧ8^xu K/oߒ5\}q돽 0r\j"ޢ(qdr8¯S9C : Jwݶ, vD¡EVצ }@ %{>tޏ^nARLQ}*G cnw&ӿJjQ1fdpQ;XW0pg8$ח*pt*; Ϗ{#:UP,p^%U{|+{X2롦Cj9U$1 \_mA7XEցˀ[CtZ/QKՠ["@;5Y<>COU(Vq ߧ]Ut.Vw OqRzyS~|.# QMy|5vw-K^Dm@㘍{I*o y9US|x5yTpep/D#crDwcTβoj̄ TһNR9˳5rT@؂v q'TD9  N7A'R&mKe Dĥ~ZPxh](ږI41r h" )L9G sZ18@fFָp8`h;6 @FX3~&-S'd6ysے[؈z}h+ }BPuҊ\0۱b5C 셖 (ie5 OrO2[޹wS )J܊2<o@yIeOY喝Cߧ<)jDeCߧ<V,yqj N" @PFD(U/{YpZUuauu&/na@kbgLfp Y8VY-ڹUάx{ҩuTlG7>՗\kY ӓ A[&X^'' dӊۖ}ą>}뎀GvSΫ-;%V p1oƤ5=xw1g+d@QW(gdzVg;fn{4 wlf5L BME3=\eU7VX}bY>V#{\kMVs׼X}a5` L5pM|21Gl7 ߫sj9igs4CA0  0z &=|p}#Isَ|a:"gfڇT"x P9O9 |"jd/r*PҊqi&d~cHw?ę)x|ҹ:wK3Ho SLQvTΛ^Q{?r@Hb]J |o) o\ fZP2/L- PQg-7, 4r'|{`&q@[(ܞ1w`0fFTFPn#gq;3A4Q Od"܇aSI$о7<;RP{Cz/Rv }7R*OP9zpq<w*"#;+:糧= о7ݸ;5z0Y3ᯝ[W9ǬsᯙJSn7*GTh"'qΣVsDRN *8$`N?#k=hn~\ B k9wcwQrx=́U@/qAUW3Z{ބ8+ 0aK9eA;Q0t~9RN^~!5pϏwh_bR5_h*@˖ev7^|Wz令/F5tHz> Z 4sa-=6ۜpUyog=W,8܅* & MDkCl4;ߧ/% ٪_i;rrW@S#}qH5@+r#RG"Z#b8(mrrFq4ʼAXK:l^"fMuE]) "9Ur]C!)q]# u,ߋ׀^m;ڹ ^L]5}TC2r@K1Ou9 kX\+S6G[^L%u6[R$mP4IrYw?Ow T72+kIkڰ׊cF+z-TpA 3kO?skB|iUQ\TImOH&W@K8!w48oPB8q|#\5Nki/&01"#LvxB8f5@~: 1'Z.8x챹 дB#^|*o.W|z NJ@ )iK t78Qr4E 4k.4<z>#5lr`ri&h)x瀿$d{  !ӊЊ^FVL{y> Hd$KlN>{e1KUڇ}W9Υh6}Ly-_z5t0S ZGO^twJv1P[fM[ߚo@׍2^O2Dp+z[D+"vq :JhNGk(}#e+BiMo6ۤQ }^R;[<}t,FZnk箢s౹kMe; Me Dz>#]E@M3|mE^!D}KDQQgVɠ 0!-`'QPd=چXwFG>ͬŴn.mSGsA|^ӘG@(@;p)u:SZA4 !eb@JﴦVpjAלVMt@bъ^WT.lo[.K>665 k*z7s1SF2@ӹAҌ Ste\ 4 egي*T,1 h*z$|vgYl yP?7,p_[Ӆw>S 3yMwv@K@/+yEuNLh o^ Q ^Ӈ$Љ-tn-PmNeֲ@mz2%P5r0N5MϩyB'䚴_-joHV`S hLmCݧH-RA|/Zхwb:ՠ ^u€ ~m7n ';SjT1+c8q^d*}֎n2Np DΪqU!,[JqIE 䨆5c.%9M0͗gKp k}˝,=1i}bd1eXK9y`gԙ$%97. =ǠVч)}Q _Y&ꨆG|"j.> PG5l#^6H&l) ůoQ hy7A/EGێۅ(!:Dǂ @*a%d@ &\ONdl|yl/ Q0:c]qB k9}Z4Ƣѩu4jkr:ŸOe@M9XO+sCO (@|Bƃ)R7qL<v:p xt6#0*b*1NS%Vq`%Gɻa ~&(@ftxI8Ԝh"fKQ [ Ua-G)9nu[P'?PvI8h󪖺7$$vF]_YK*ZRZ!uXKޒ*LLf i_"! kg$^WX$Y$NUGOn9AԾ2ֲ맓a-9Eh@5TQ ӉcUpI)%%= *g:N5R=$ɄUQՃ.Auβv\>/f1Ǻ=0 zRcß2:PEj> *>e_kW)+0O@E nj:43 !)Ƚ  o\+2+˙=m|.cqܹ.a~#0 ctFW, E٤ߥR[]n&i.:?/ß{>Jz)w$,~Ϥ77·lsh &0oh_p2`vL8z+mXX\}mɽTgJʍKzʫ?r<t>rmwћɸ5jNo^K8,^se qm7AC< ܴS[欷`c$|cFک 5y7+e>fN3֒O0Q@\TQ]# aEz ͜BAc>BGG;۪<9F@þ0 #T6{r- 1$a8f,1?][G A uY`Z8Q`WVGXF3QYtHMb^)UGwJ-x~5A5RW* $TT 888888888888ѫ@]IENDB`PKUmeta.xmlS0+W1EXZ[DY-6KdU8{3gCxoPrG!=Lq!c)C^^[6hVHvkIUejP˨@.Dz͡(6Eh"Ps4N9oNa!^1l F%E{oI &9״;an`yN^7N0gEa-<ϑ==OY?Us!'6x_.S6YV8%8 ja44]$ ) FS_Ț$N  vos*WK"0e} $dgiGp+$Bl[%`i E1~؋]5Ӟ+j?DZGe.G PKC?+PKUMETA-INF/manifest.xmlMj09R6EɢP3 ~s&N\J 4{ov?:AaU@ڵH]þ_6^I·ܣx-I"FI(N(ɿrRV 삶:9ԪT/B0x8 Iin+Pp0ګtlt0E='j_λudbOG&t|L3r$l!;D+*lqD͍Ry7|8(|䞺;"ث_CRZߊ_q PK;f1%PKU.++mimetypePKUQConfigurations2/toolbar/PKUConfigurations2/floater/PKUConfigurations2/menubar/PKUConfigurations2/popupmenu/PKU+Configurations2/toolpanel/PKUcConfigurations2/progressbar/PKUConfigurations2/statusbar/PKUConfigurations2/images/Bitmaps/PKUConfigurations2/accelerator/PKUvz Q Lstyles.xmlPKU[u늩H-'tGtGtGtGtGtGtGtGtGt:t(Cq((e*W)Po poᆿqԩ$%%%{;?~<{|Z֮][5Z1^pUx'Ю\r횻[ݻw[?nܸǣ>(>|8_po˦jժѲ%Ý8qb(c t9A-hѢ[ٱ%%;9\ˁ`j .p#4ptzTc4|u|i:ׯߠ(9Q7J*ݬYd~a'tp[$XT;=V<-˾ t;s3ve tN:ϼ>/y* 2g o^;];]/ jwxᆵO~// (]n;feʔ%Ji ,hsϽMRqp]v6ŋmE=i 5Kƍ&m/_NW Ӌ'T|wäDj&^m۶2dHߩS>zNbnݺFiXe6,NOk'̙3.^uU 5S]ih߿+Wf͚?EidpX@ua'|F|00ms s*̙3ٖ9\QZ+ޫQr0 ~>o߾CرZIêV 5-;tb1TVGyTscM "XBD3 Aŋ~ߣGȑ#i2CP&^t]|yJcwپ}{9s.s>(R^=zlZ*RzHBBµfp@6J8]D 5xH^s͛7O~'E~OeݮNm;]2 /oHҋwѾ;*U\nQ&ҝ.9\":JYtqVbcf?Op p (/>/o޼˶'DŽي/k֬'|x{/_aTE)駟>z=?s@ *lR;4ҦM{1JZ:nҤQ̝;Y~3e yg[Jul (Lۺq Rݑ#GrѬNٱcGIR@ߢp1{#ɓ'{'|غukYZZe%ێ%-ٰaÞ!{LWT͚5K/1=rVOw}wn}իW_MjF\å͞=qrf?ij0aB{z͚5eٲeR؀,(ɦEQågyfNU=oM&%zQMԛ3NS ýzj$: =ȶI%Zl9ӧOgΒ%˩X 6TmP >wA5wE..135%P7?:n׮DRumRZEtݴd@) ԁI̙3&%'ۦ#u\vv6t&(Y䎝;wseH>y68_/J:%J)^;֮?C40Lr۶m)αcrmF#k}kۛK.-Zn畛9/{B9K! bɹRޢ3m|z9sqLo;>]ܱcǏ{ыġAO9~D7>qΎƽV+ ~aq4LđF6$Ŕi9\!U8sƊ9p%C |ËN׍ pF; co߾ ._e H @}y%@ѾRؐ.,Ay\ p;MH)tL۟g\ˀu@ M%A\l iZl(ͣGrT뻰8\?4bFNȶ8աkΝOf ؐmNv֪UkSO=9\@wqwJg̘ltU[:-Zt+믿MG <:QL!pA#xN7zjKJJJm0N76fؿavjժZ-Hl߾E.A޵V%w6l#?UVF#5$&\HS\*AM!l-7x(ۦ R[F 6]~)EY=2˗nݺuG+J{r-;]mY,[.ӊ  >J[xȮ]t}e\֭YlFeVBב6jԨkyaZ&/ѣGGƌ{>^#&` PY,5h+VٸqfI'tiÆ t{u׮ T.(ܸqo5je ]_ј2GQGePpr+]. .H:@e\wi@XpN # |J|$ӀiZ (s啮w93{n` 7J,{f̜9x-坮t,JUx8TŽEY 9\6u[zQT f +7ԪX;w;f̘.ne˖rmNw͚5N ^`if˖x4;߱cv>w\ӟw#m`enm,ёf^]'Nd-[b:tP|)SZgȐ᜗@P25k67J3/1k֬>bĈ?DǏо}{;Zn=Γ={x~ٳzڵx%vva|v&N0_6# ?=ǎ!ل2 Fmy:UҫWJHHH8qb;jrl":N!gΜGe PMG~R2Ο*UƨlE2,\}(ۮ0QVUmI(:=zIπMVD,EڰaeV\Y[ 2 ]BƌϪo|ќr:>˶ 93gdC |ly6m|/#tN&g+_0Pu1>f0:0;[0d۠HQ0Txr"a(??ꫯm yAuV gÆ d :]jIk|lԹpBi^mJTXqldj$C_-ܲOUi3Y6ٚ-.] l:#M;6ʝowiG 1-M+e=؂:Yd9S C;҈]U\y=yngNBAj }2lvڪmPHQ`d, :th$:u+27?6B\6/I:@ޫWuٌҙ{V7rوtdeNѼy9Q˶nb_B{17ii7ƟSo0[T8We˖խWR i3sj==5ɶA5#Md߾}7F'#@SR</^LKŽ9-@DL2mjmG;l;lPUMenݺ*[yU%.B8*:[8@BMhl-i|骲No0> * rOw1dDg+ ~džrNرc9Nkd   ~?iם.۵6vlE|ףR&M[ioexvي/駟jNp[ƣa7-.:W\I$5juin]8۔P%2e… h\[P`]\wŊv~ӲeYQZ-1Kz۷bL UlA*tc.;~,˲)o&LheLߔ.]zSO=F9Š_<|cgtw:l;xt2f]e[af*I9KڵK /7쑉*yѯ_?ۯ=(Pʆu{m͋r@pҶn ai#J@X ӥݻɟoȼy$[믿N##٪RǂuFfRJnLT.=zDF)%?>kJfYANv}BzǴJv\-Xl.]5[·~iܸq^SxǎG$x ; ۾=yl䫯.[ldK̘1_h+nXi3?p^B8]8]8]8]%jKfLT y#*=vv 圮 8&ݦb)f)syN6c'doo(X+W(W7ba%Ə7Ff͚j1ƌӥscgm…nEn]tca[M"uqly/^ bw,F~ctdٸfvȞ=cǎpdElR.ʖ I{~"Wl 6Qw dU'-[v+ 隑mtMcǎm۶FZ%KAS{lYZ쫥jہvs79Z*:6=栕&M4zIV+K$&&^vj]rB RާN˗eۤ1cƳ>Vʏ]95/{.|[ut>}:3X._(˽>cMիVE̴:yPQ隀 U 3g>w嗥l֭LJuٶj~n7VUt@ZNηDwv}Nsmfz4ǟ;u ӟN%JT2:Y:dȐ}\%Mv!C 0`Wutc@w Oԣdt3]矯\SX,F.GQQҥp^K,C?7ܹsJ TӭU֪~f8|:tP~2dRRRܥK;QY+}=C1Re|iӦO#bOyΝ%̦n;7>S~ɬ=}=FyEPۯ^ճLCyb)9zׯD:W׮]GJ_ʵg޵ܻwwc9\rύ7^@\F0  `6dzg˖Y{ukpEU^}8vα,<* c0U(_ѱD0rZš4LzW#+bp :i9l{ҶMM寵[=fw(9GO*ÇeJS؂ g;]#͝ģQ|lԓ|Ϭ=VyaՔ)i-lk7^'O<5V|1SNe%KS|XINjXj#ћ^Q|֪=={̞=/"RzuSi[c z{:ͮ}޺'N7s^$kVfad͚$YvވXEvlp̙a2e2{3{($Dd)~[7FH2V L[\,bYh^bʶ.nWb)ӧS}QxVXoU\!pJW( XxbX.fkAKTk5/tFUZ-[iE^xæ ph9NW evtHLJe{ M銠yA!ho yg$uCM4/DkP;]lbJ&q$ZfnVBtRtU籀ӵHЕbPՐrJPVKٝMh`O~N7jHDvSuAub^$%м`?Ԑ A"+>dVoP GaXUP 1@*A-[(GaMbn^cUT{3 ď慠)] luTyAPoNjNgIjȪMH d^PyAtVӥZD-qڑ )QE:]Bv{V5;xJ7%8]W S%o8݀/`#=^![ tڼ# p C5'/[vil IJb&nؚT+d;]q/W ** ̍} 3[jZPA骂u)h:YO}쑉ÄtAE.:'NDe˖f@ƿ;"}]f͚)/^iРFn5ټkhѢȭ=v{]4nܘ7޶mcζn)[l.iءC &C }67VaFt.]J+kN_40SNb)j^:m0FSղuk:-Tz_eynCJ`7N(ްGy$g|rU{Dm=0'yIM5SLIa7fHIII1~ƌU4ڱֲTҵ)~f* 0c j JBÈuduB^77vA(X7TMӔ=ӧOO_dIdazFu5~j9~x̶QvGk&6w+捑ҵ,+"yI>6GF=7{5^zxt7li|)4O$VN|y_LVҷj{Jވ̪={o;ճ^XϾٲeKӶX.;fF NR+~,?112n=qҐZ1nun0E=~IYQZ=z)VRbu٥Ka$Yu|B/W3C x0G2F+VHb<_YŴbK=~+[*7ׯ׬6㹑=4فF/q=zt+#S& qdsҥZKn` %|z7^,Ƃھ̴B;u' .4o%oOÆ K>]N|Vy_WXJ&92Aí\i=w0=:b5/xO3y$/sqĈ)̔-agNcǎ?8't=>EVxKAgՂ[p52c%oشS+P'sC t5{wlTJQ𳜨6h31FSu`j^oiRfI^CF0Sz9]dLӔnal~8;6\bO? > > > > > > > > > \套^z#K~9`^(n(7SNFdG,#f2{~ \.o˜ښ5k:u꬈RG/.{>}wWt,:ܧ~?QURyF~6mڋ.\Hǟ^..p"ERa%&&^ȾQŊ]Ju/[ IO>1vrxϞ=E#Gro"{ӯ\y e9\ܹs/e|rmtk0.?`Ǽӣ:tϾ&9rv3gΣ޷o!,w"zJU ׊׵kѱ.p@ pf ^mgf:)vd$|sRӤxC^ ^MJJJz_u+ti. (t1sSu1$Б> >xFDwT 5;o~;yQ߱'dcM6UIn=i,CC50J*=J)7S\-Q}/:Cځ֭[WE8-C Xȑ.]za~uQFu蝏dɒ 4XE?Í娦N@b;~ާMviV+B ^h]NbZG8]t+)8İ/(iީiy~/:\zgZW#^/7|Xi.P@)ػN>ɜ9aN( 9qEnyE+vesT~|ժU="˗/FݸqcJ*m`17|Yw_sp yp*xbxf GzƭY>R.|Wx қ@80aB{Rt<|^={!&7/trq,J^y8@Ma&NÉ͏;lrٳ[ *Tl$ΗGk ?RNfDYWzմ%A|{w3<3 1cƳ^XQ{Yx5k֓f,K*PoQ ر 5jh!u]DdӤIs)JΝ;i~L_p!c AA)K\Z5V%:\bc(S/tLWKõ:~SdҋKå&Lå^o&YTp:_-9]`IAoeo۶^ZcƌeUH6ťDt9\8(tiGv-%wpL4Bk0gk 8_`RN3|sF`fa7G7i}׻wwEKuzi%~qj˞=qU)SZiK:0`@R\M{ nJWoU& z$A5m)\u2/Z:J+Mu؜;w.8pTGҥ阦 SS94iC&9ɃFpqcW8 'J9]Z5YEjժ^fc!,XX{ZΔa 'pUK>?C Bb HzѨolyjdJ`cn wy9\6D,$!%M; |ÁNV:rH.'i.Ӑ&:trXkg}vڵhz1kϯ:p o MGZ<g V Ϯ iӦ(2 etAJlH2:cu p #FIe˖խWR i:ٶpҔWz J9sL̙3cꠤC6`@0Siw} 2dH_6`)j"#-h xmC7o\\r[d:Hmecj͒ġU_Y /4V-) <;]-,?*?  HH ;p Hz2 avϟi)~`8]aСC靦*tLkZ]RN%lAaSimkj=FRlۂ:pҥ4lEn׽{lBk:`ȑ#{ڷ:l@w/cA<&MKt,@Ztgcڟf͚?ɶ ZNԃ{|t\5n 9u|c4 l+/Xpڠ#-E /szҝޙÍNj sZΗZ%MZ/J;]k:='*6~@Yen^vn%ڶm+L|<`x3n#s>`ep;,9\09\"t o>wqB2,Y2=Vh]U ]GNiӦ˔)i@pΛ7676]8]t@(? _p .&MJ~(t85gg3gdʜ9sdok׮F2beޮ]&LH97zj$7T\&J;]#X%tL2aK4i\xbZa2RJurС}ܾ9WnWw}_Ko^9EˇlE3^Sr*]fM5rnijW+}z׭[_qޕ+WRtQ/6F4d̘l^n;[\p-k@2V]v"b9r-˗-[VH7xI 2 eݢǹ|og+"={)Rdv/⛲mIhݻEeC2۴iSEaeIhů8_sly*TʬRJP+BӑF4i6>S d*?lE6lPq^bMe\-hF(Qb'ˉ4^Te$g+wI.6@.Ci;w,A={x7o\\r[Z-Av"͐!9/'9]YmF1'f͚ղ|)l_"4W 1ctyl*bH&HӲEnٲ,ԩSYfzr֭lҥd0;[*?j*u9zW:4j'K,DDh3ٶY!-5Qw{B׼ bM:[!CFAjF\v2B\X eA{dWٚCŲS:m*#Qhb6AF,MΟ7omklT i"|Q>m]d8_8[wСCwX]2߿mP7/ڵx]Av ?/7P9ZVϲmrӥd6^8_8[U**'~j8ozK4jhaPY g?lj8:Pw1,X8jF [`!Lg8[QVlT".:aT<,H۷@xJ,ŁU0ӧOgm[?>lT". Dה)SZ*Uj;yA0če]D1… dCKҤM" qtI5#09sӴҙ< A,h3,N#M$jר6^:o[P#ڵA,Z^òmPj^ B8Z8yd۠qtàviAږJ *NACr ZVz-o?ȓ;w?e}i['(N9@ oɓYM@Hce!ophҤT6E݃Rn^hذᏪlE|Þ={;JM.ZV:Ts"̙(*ȾQ$2TP;[G6m|l?p@!ZLe@Dt9r8K0$ #!{XМۤ)T:B-aBtTvZsxqN:cǎE:L/VAw"$~כ)nXLM:?w\3eeOtg~O6g+rM7***7JGer#m^ݰ;[-dwc)^(#RlE|2bm %qߑ&%KSn3 g8_q|/ܶ-,tiW\vlUhU/ƺ`ӥ LO~a(Z u|G,'Nd˚5I34hP?o &hضm[(:]8[f˖,٤+vϥ!Nݺu{ԩhŃu8_k#ʇew}_ɱ0#Me˖=o޼>?cDyVneK.'0:t(?Uz;T.ryʕ{4S+@wjv!կ_ ??X6DY n<0{p=qn,[UZu-*|N^0P+N:%N_x?8YMi sLmxKJ;vܴiȯ*P~PȦM"ҥj϶mے(1n8A 4.֬YkzAٳf{M.T`M "<ϬH0ӿ>7/ܹX?"ʖ--Zt+myN~N~ON;#F ҥKi/;9Wq8?Cێ%:uTX pTnGv+WeEB8Q*C9dejw ,mt XF6dɒW-N:+T<># M-ZlڴBM* 8]@nK mnVU-;j QU?Q}=(jN_}}nw}}FMJJJH*U+W٪s%Kܑ6mڋ.\ӦM߭Tl څӍW*[*~ќ Ifyln(Qbġ3"U6.4~۷ &=tM?CQ򻕞ە gΜGiFc E:w.] ϟO\)aAf l1Nn:\])fNC0v1JbA*e„ 0Q=UC ۧO^);… R؏k޿ף7Q{%K˴ ;];… ToԨ 46h\"/V|z4JӔ܋/5k MU9ziֵk|f_~}J*m`y[j+QQFu֭f4L2ыJTqaykd4C}뭷^>>SNFDХK;\ך<#FIj}۷Xq3fxvذav?c=oAыϧ߳g#G+}>>]gϞh6Ӓ+Xq%'j;M3≠Db21%=ztWQrV򒯴7^`ߪ:޽(931u;^\+e+FWZvIJ}4t>F60o?g/[3Vnݺ*t;\39\#5gΜe8]k[U x3)XNmsG3U.XO4Pt&MD矧ٶm[䮻>Sin-j "۷׈Vҋ&*`)~s'OfuӞ #U0mTK9jeKd͚KQU")]ȔӧL]T+[©ӕ*ӵzX1eT V/q*]/Rl^HL?(ttqQz# GŲ(TKQZ8PyJW V;GŲ jJjޠyt\L'6NA`Oy.}Vvn 7$/ptTUѼk;^VY7VqtV|th^7iXWjBtttUT Rl,!CsVtڑAi++2C4/$%%yd?8i^TtP鈀u/J}fEڃi_shlTSY|=ek (]t'tE骰TԠ kN7|3fP+l^p۞ Z')!G}:]/n*ξt?^.]9%}\uVwD:ttpA-[Rp0 >SťٳgU8]ytUGPD٪ i!U醹y䅠+]0Sރ NAG #hvpHGU' k)]U*f [ 9e T JIOa'~YE|Mdĉ2eD~Hc*]yc'%G8˲9sf_N`dC+>Uf3r(Nf.a55㰬_uriӦ%_FX-[-HѢE#u5iӦh=ļ|ג,Zy)̷q yc5[o5kV$W\lղZ ӍfJ޽{+ru 7F,\8V9iaPA[{7rFx$#6_VŷZm۶xGMǍp -kyo8wk%oƿ-mlsZa/\PZi2d& h)Qz ~\aiz+=#>,Eռ4GXK[m^0o9VSPR5Nu֑)Snbղz8!իpzZ뻊aDbŊHY|3_$⚅m7 3?H4ӳ7V!Q^Z-[={=iҤ\~ճGm'kvӓ_dIr۴hqxڵfL7e;-M7X+UtMiַ6Eh7Nfyݼ`d\U*[alx-{4 plJLLvl^lҔVҷÆ RՍ eFuw:ŋC +VjT^K&#rBJߏ)~-`c5oKL銲(# m_>EFx ӽ,mev>~Ɗ=V^i^~«5[b=ztrzwD `v$+]u=/_Nj=a&°7V[-+xtaĈ)O:כ9+y:ud*6,*hȑ#if&=:H5u٣^|qyOenܸ֔H>fQ3.\hk׮q_V=/XO1f] Աkyc5>4?S[)[m<ۮdtcngJIX}1cƵ2dHrG#ŏ} ?KQFYK-{b}; ={eKgxӿ#YQ45zpf>Xek6/ 27Vw1'?䓆񭖭z6%cuh׫X 0P\u~)Rt|v0_TnE`d?˧~:y=-F/8_wAkd#<5%үZ.ZJ?j(hKK6;LS.cZV[xt7*&kYQ8^j=z(}J^j)uV1$bzMG~ciگ_u)ҏuC:/yv;]-X0X- q3#5dHJ^0&ptH` 8݈:jH5T#Ut.XC [:]m{Rg~X$upzUTniPZ TayUA:nt^UbTS =Bt>Un^5-*ݠvz;VeS&Mw 2d#iX ҦMk qk.9S #-f'/# ]vzh^pe k#Yeډ5N.?y^nNkUfȐڨK.iwp鉎pڼ`eQ0 U X- b^KAċ8D?XT_T啮Wy {TKU{̢r-v?@w`#Ŷx tebT4_VS;]YmON+3fu MG*a *ҝnP;OPw뵊*Ni' ׂހ6N'5yNhK BcQyA6aP<*8tt:Lj[iPPqTpA%.:LHlt/U"<*8B|pzTm0.&6A?8֫B^tig~g#.\h)V0ŋiGN+$V|~o5tٳʕ+ $qZF5kJ|l'>'饊=^͛7kS{~^VwC I_ɶA% @P B .% @P B .%IHHH>;>so#<٧~(tۢsn!yA{k}ߵmvrvl:]N eEϾb<^ ga߉"|x/׫Wm9dȐ}FP]<^jU->LKŋilRlٲ[IL0`@1-=*Ko9r8%^h=|xe˖սtRVla,^Ai I&=?Mƍ,\wxZ}]$&&^V=3cx≏˗/￿}N.Q{z$)Ή',Xq Ι1P[?s7h`qݺu?>= |b:O>y`(RbŊ޴iS%K Lk^)1eʔֹr:rٌcǎI׿KL]NӶu%VXq#㏏裏ǿ]p!]ڴi/: C(.wR*~G#aOajԩS_ *l:u|w#N{uÆ llƾMƏTjmeA4&m6nXQ+8pSNeqfcz!Bl…8p %~IZkAMh?tⲡ 3rgf%h "1;Μ9if`Cb 'B7a<s/tl2]tC/A ХO68.-^\o|)SZGb7-!JӇuܦx%,U[n5l;w/_~-[a7 * /EBp?ׯ_ɟ[Kj}駏&{^>UV_GiŇ͚5<0u޽EHL+{۷o?aĈ=ȥɓ'5ڶm+ۄ1ynhٲٳgVN~J2+>u-F/Ŏ?]n{69`B^P ]=*Jcǎ^z'2.Ċyfip ]@1'ԃG=ѩSK*}ƍӤIslZ^2U]՚?D=*TD4iرc9`-R^/ǚS>@=AB!rÇ5yk˞/wZzKj C3i͛ÇcӯQQjӧOo Ggک?dF4hY7o߾Ɏ(7^ s6XF^_AˉtܫWno;O>C ׋Ben۷o/UtmtlVסC|cFLLL|ʕF֮][Zjkh6њf,YRA( -3xx'>d:Yzuuz/TZJ+o5ϯyZ~ ݳgf41 \qM7Z4iQZ{tc&r zbBD=% tXH$QWY!%+EժUתG[n-[\-$>[l'>5j֦饗ވD.VjA.x{FTZt)[ou_| 5EQG۶m+M3fx6V>}$i9r˒%) %LiȂZ'NlWdV]JjYoΜ9YϠ顔ʠf͚?Q:,ޡC:u* \l٭t8U] #~c+[{ĉlVaqhT0; 襤4sL&>@ijd&xAÆ ;0?[PIV+V񆾜&🽜5 vkke\,!!!I ϓ'jį(fg>1ךwX"/|&5PСCЋ}}صs:ĵe@˖-[^bxv&N0 @J2etF(AϞ=G9>s̻[l9KM5Ac-(CeA=&s+ABWZZipvv(i۶d~976K*UEEhQpΥ~…tiӦ(& mZ3\AB7# 9ӟ'VdoʕHG.]fL~׭|m6mPk[cd\"ݔd>>;,v-fGie}hmR1JgyD!. jYf=ɇmZn=_aB&LZ 4E 0n$t;m6ſ{/Zֆ h>j N1V/gZV~>P0M.ү_AQxM6U}O"IDK5V# >?]ڴi%g͚wB"RbŊ:rr "E:Z*}͏Wc[9s?>vډeܸqӱ T1LSgvv+.ݬh%YNn/ʟ;w?pzYvmU6BnJD@h Q9Vߴ֩SgڳgOQ1V|$lu+il߲c1ںoʕ{*VÁP+|Ƌᴎ**&^+Qm nX@ w6IReQf̘s2@x t})']͝;VvNqbW2e~Nί&G Ν?> #Ù(|o^dɒ; ov5^{@kjm޼XKie:$9>.MI!SbaW\IM駚w|3fc:&_xᅷ,bhk^֦LҚ&*U=i0?. tM&L4!ZSkǦX+ښDSyhVx߾}߸qcE;g|ZV0iEf͚͵nm|.-GʰM,λv:z̘1]82e|$6ZΌ5 \z)@x ]?C=$>hrn%V9Lc#{&?n4l=v|w- 6TN7~ZTMȆ|+X`eΦK.cFUzvDjI5{pl @l֖JY']^N&zKҥ1&P+ ϣIl҈(|ift.k J ]ِ=%KoРb:aժUҶfJ$-%f#0Xx{ڨMb=lK_%;v(f'!B7$DHڎ1'Wxꩧoʗ/a>~,:u!ң.2jZZ  MtRkժlMNS+ {uGܺ:C?Ю]Ɋ tB[d&.;ȑ#{4Zl+XA>-,Jy&2YxB\|91e36?~<{$j\bv]:ŋeřiڴ|G%X"ƞ^3Mb_[ne9scnj p.&ZCP-gd*R^? i6ǎۙ^,V{8|p>9V`.ZڀYϟn'V|А n{^LpACi z[5WZMVDAKbʕ+!|@@3gΣǎ!MHHHa+4\v핫V% Cϗ/a t`+W?Ӑ1ڹ-pl] Fih񃖰4L=CbMEً(-t6m:˔)l[{0'@8馛~5u18(-t͛wlsXN3:L -{ҥ4Di cR=DA&! tch1Orќg$sp,+ bd45f„ >jԨ3.`RiӦ(ƣ!4_/$}5kV-Z̖e*C}ȑ=ŭߩnyr6QZ袅?9Z-4i&o;͜9n\C2ZSTɓz?J ]0;cƌ{Zl9K=>u0n t' gp:{!ۆX^ ;%3:J ŋzhҠAɶG]v6!tD^ ^%0"zDײwPZG%,hvQZ`]JǏN6^ ɶn9;VQZb2B@~8j* /^89s7߬=-F%rpZ7b.|@6hະÇG?wH&Mc'O ;p@aÆ)WTۓy"Yd|W>E#;v|ׅzum62x`41ʖ-ٺuk̴Z(-t<db;|E7S 5k*T(]ܷ~;L4v͔رcGdɒI%c]/#""ֱX|cBWQ=zo\@.J x~Hv}1c$N>}MZjZ/_n^V&nt1bDUV9,Y1ڵk[.2nܸH^l7w)Ek׮͛7GF)V(-tʕ+' v3͗/_})~?^;f7S{Ut ZB+lΝ׎Νk_ t^ XuĨDŽ~δiR5mZ{gLXd B .%J ]LFvQZd4`.vB.&(-t1 Ei={Pnm^W 0(⚰ [#K.aȐ!}3p0O5 t#biӦәdrj֭lҥX J [#HÐ;^Zq{t6(-ta2"vy2g|Zkee˖EIڴi/^p! akqRСCDS4VmQZƳ#G+%|i !n[ jBܹ1ctc!ٴiS6y(-t3=w\_aIII gcv ;|t]:O>ykm]. ;ZLM E˖-g͞=(zhiٳ:%?XJC:vl@&vYfs4m̚5%VyիpZZ'1D_ l /jfzԩSY򣉨v A1hР~mrQZd4-xEy_MCkҋ}qZ+VH-N|gΜy c%^<[`Kٷoߍx_u O5e@~&2d8GK@z BprJjua ׽#Gʝ; 4XB\.&ï /kM:>_~)StmZ'-aۢEJ!W\GxGJi)3Ϝ9I@s&QZVVm 8-ٶ6EYL_x4_"@=t=ҺuIvl:Bwe۠:jAVhuBzu.[ti=)F _._&MKB/8 `}tBbW].Whٲeuy)S3O쿅@؂xs}2t>5MǴ WL:6 AKB+;@؂2dȐbٲ5ߣG ۬[l:(-t1D,'5L* ^[r.9XŋvOeǕ+W^/J ]`^Rw8f!Z6\VU(Ni{,Y2&- 5M^&l(-t\.B뮻rl}VZUjȚ5I>6pt a uh~~rִiͻMmjabo}D-&?3GG˚hݻw@BW&:=|pyuO0`@ 1v*eדO>wM7l;jtRzݳgOQ>] ;w,ᯥqŊun;!\ >QZV^}5w}_Koȶ'h+VlaÞ2H"{ဃ4FkezӡIII X @S .i㘭[caA=[m꡴]fM5zgXwE݊cl/>aB&DuڵkBylz(-tqu 6'U _c5?C4PCK ؁ .\xժUȘ1Y6QZIXcWT[СC۷0qv4߷oߍt:MB>QF Y/ SmwĠ N@B7PM1a„?wa7޸7|^={῅e?k8f̘.Rg 6= t ]A^Zx>0ЫWb*wTlڸ^Zqߴmvl(-t7@O؄ٳg"gΜG9 &)cBcŔ|ʶB; vo Zѣ91bDOzZ+g!CʱP>W..J ]-恰x=%&&^rJj_@9t>baT?&OܖWVmL[@9إY4!BM*a>/_N?/_~-[ʉyMKLx;v4/uW℅zhl@0ٳg3d"g)&͛7?eҧOVk׮_JRե .[֭|mX>] @m4&8̙39 }Y[xa.]Z~KhU>^G,;&7eʔּ;~xlٲ8kkȴB7-BoΝ%f͚L 2^zKy@=4FXr֭"H_ϟn={zqT+(-t/^|;lwn_ tsӚ~|yӤ7Z T@hD.8M6Uc1+V(>:ya3gμl l-Kް 8z.CeJ6o66l$> { .U.-BV[ĉ |_G~כ) Y (-t1M4_5v!lh e˖j͢-` eI4YT.N9@PZW % l̚5%;Jwh߾ ,Y>YkDZŒ2`._b@\wtϞ=E+Cö(n:J6mԋcG}SiB؅*Rh=MǴh.0(vVhx?S(?u]F㼼h=Q{(ym'2f̘.b\r%5_ 0,%Z ݻw|4 wᴠ?תUjEY%Ƈa@?2< ^zG3tBʕ+ fN3o0\[RJm߱cGI,Г5{Lhþ}ъ ]h`lK?h,[na<:x/s=H#o/'muQ˶C5 tMжm[&(ɓ#RORDHeWܹ3&%tut WH 67)aywM ,'%H5" mREI H 67)AB]:N 8Gi ] t@(uŋGvڕkZh={/믿NF7nl7~?X_ߔ*UC ǎ'Df'kk6^޽>|x/?k׮-[6ukav[d޼y+GRRRL>=V*wߍ/_>r#KSN׎E۴U$V`k#6iҤ?x۷L0CЇ E="#G4}ժUu^JPZ蚝v8M/Rjڍ 6l}+F޼yiԨQ￿&tԯ_?o)Y?CKv"\$&&Ҧ߇I\pN/\7a͛ a]J t@(B]kꁔ &MJ~mPo6A@캻 %l bYyhvsi8I'p3RJuU+=/k'4jhEne ҷO>C%ЦH6Fr w]hѢ{AxY7ڧo߾CHuS.Vn7ҳK@ױц#qjsF(NKscnj ;"oe_S 6bt͓`7`B"G>43etәX}tQE:';@P";u*SLiͧ5vϪAEa+ҤIqߐ^N+Wnh &;v(i%X=sL& aNؕ.pZsnjI}TaܹsE+UYjU-vV^cHKo\z5Ӵ̊U&@Qڏ>Lu]jڙ|W犇V0 [;;vQlXԬYFX[yeU7زeK9駟>J/b t+ؚUWުUg̘q;?-nfa7|sWodh(;V7b*+[V΋]k@z.p+ߎ믿nşnϪoV;&d W5jy͜z9:uEM*}NZb[ tcTnehղީKfVYf2KA2ci:3]ooevMd@z.pTLNᄏEf+/1-Z͎e_;A/<8)))y >ׯ,ۆ'Zw]`q=~O˖- ٭Vjեe&&z5[[y!lA㬣h ~bPq*VyUv,µh5kTq*U &X48JY6ؽ|rIj߾]`|aÆ=ӻwwe ^Y* e`ZfjHHHHVV={EjXIhr6#X>VPa͛˳(}WZ -w]LM"ZmRK.rY?\ .Er嶈K֨|3"ۺw>&#X>7-1KݓUTYǾ&ʻt]xbXq\:11ݼXu~]Lϸc3yQ&a*ĭ1Lw[^TtZ5;ǎ!&=HPBc[pB:z׺2H:7* "ZDN z4nl|/U9X>g兮[Oz ὼHntC"mh̗Vn9sksj&9r3#!X ,ht~='ٳ[07ZDc.yղjiӦO/l0`^{3!lca^=ԩbʕ:ѣ>L4Ԛ);d6N}LB]Nn~M7w"n' ]#y a5w׮]m0aBd-v/^w+&]IF7˛o92uTaqEx ?vmZJ?jsDڱ?`ٶmGi'#FDFy]XA={ósر^x֭k) >Ҥf'5NƯٽ.ŴEyym7ҩS'ҷc{6mh^-[U ͜{'b,1ɓ'zun/#}Ț5Xgʔ~!M̷seɒgS%G/+7Qlu%P6mڋbةSdSW^D~#t3d`7^ tL^;8UOul\XD(t|N&:A. ?N>UT?[ɫb"Af[NB^6n rlk[B-t"X<^KS#{2d/ n!!Fed9z+^C^$7=.)r ]8^M8tAvJ.a)Ν3OW q*HXK.87ȭN"'Avk>}M.ted]p k{d_A hU$&B[te?ݫ8tOL*KX[yȑUٯ^u!iI_]>ǭ 2s#=Т@5Anѕf.\`}"{[e1t^5 ^=\^.G벅 *;U/o.+{d?&-aCW‰z믿n2}\",-^Yz0|[t$ȓьPq8Y}MۦuPZb r7hvP>MW .D2AfD[tRoe(-tv߄EWER- -\olEPxL&`JLvkĵ S }.t3VA!˩EWֆ^+W(} >YE6b~6(]Hyј;B9OWPAId9ՠ[/[teojWc]Ga.kǨfȠ~,Ey*>ݫԢЕum\Zkd'Kꌲ6ʵ#^U^#s̹.x]vN?F#Zyk*U*E\7Zζn)['iz뭑E'ӽXNk}ݘ8'i'$$h?Bu# rvMtHzlqHn!?斨tld7mB{}A9Fع߆n,G֚5k"mڴk.ꫯZb]n p+T@;Dl\n\;+Tш%KFΝy6>剓JWb=XNq?NqczIII .V2"Vْ#M4L>r^-bToHҥm/ubZyF/We| NZvz7wM;vl=zN_r+V믿I??3^n.V;v$S=?gٲel>nܸݻ11|3vٳg?dȐ?0 z)yeE{zkVzQoڮV[[Fh/ Q>I[i~M|.G3.K۽^_A9~OTCiZVkwqGdΝ}onE:uS1?۳iӦ%JNwË9^n庱3AҎω7֋(-tcu1ce,|ƵAN-d€e?/߫cu#T-*}7mlݨ[f JLVڿp®/uf'Cܸ.c ~*+W۷ﺮz5ht*ǂ {-]zRQ-Jb͛5gٹ,Gݻw_r-L:%h 8p EQbuc'Zmm,og•zk'}nXeF݊>ݐݘ4m-AA|J_J&&&ܑE/xia7Xx}?WSBwz.G *T^\i>zýA/?\8"nMNp#}V765PEX~an>o&4l0fFuvlWeg8IN늕z]vne֭CT~jQZ;Jf{7'v2putmse,sKnj@ )۫W27;o޼aV+u,F -!^H)=MԎZ F;YA+}UN;n$};+VR?FivV`7|u+}]+jʟX+iLݪVvr?cӕp.xy]sTV4J]x-On0L3(c"hQ NWۭi1}w.S!١^*zjy$=\ڸqf\u]ZI ZO9%O 'ץ_0un.(󺴒>'Zv13ʎ'at.^Vۭ.h7gh]\ݺuKъ"Ҥs5tͱlZީҷr#俓]7֯z4};7[|u+s֜nlc]V6CƌS:t(v;kulwڢϏE| Х }R}䵒Hz3i}g+WdbKӼL7ֵc?NZt(X77m,[|Nn9͟0ulwҢu# ~2J X-촮xa?͖n7+4qe yQNb*n^7wҢFMG{Pz+Ȩ[l8Mn7;tNfQZvgf~bv'~n\7aN7(-tN(r=\֌GѸ[k9Xx%h\V={nqk+] ;lv}H޽M ^\77̤m?Vz+vuk۠P}^IK I |k[o.ݶ]ĭ&(>õeDeZЅU@.\+^_\#GTR%nݺtq˟?3qL9#FJS|׿uիSIW=ݿ{OrosO)^_ 7_l5NX},#nQ$,Yr]x׮]0;FNfDzuigi4#۵v3$ܺn.[8Khr]vռy䗕cotR8NnzA2W"[=k?c +&Du?vnfӦnv#俛rn??n[;VϑQRQbѺ1;tNfqǮ)nٮ'Dݺn sе3+/vZNAbauy+Yxu]:FVz7CPVkF2f;/׸Ur]YMҧOo7bM'MfE7ׄ])۠,iҤ{BPKoulY^t/tcz ^ ]/TyWE׈^7h!CMݺ%vnfn[t(a.U9 .Ch;m8UB7(OV5]bUxcFD_t[v:>G BX>Z- .kto/o~: ĨWek+Ȟ7bnn-B{]I Ztl vݩ^۴iƼ{jud|VN.b+?7^]fJ n]1"BWa)[TL]V4D1cF/Oo NFvjiAQՏGOvZt>,v uvZt/(tѢ7^]v`6C&/'^6ڑݢ>,*-n@= AÄP{DI+'NhZt^f=1*sRyDŲЅn2/lCB7%*MXRU4*`upm׎ą b7YsfRv't(t&I'Kg}uF٭ra*[uz=BzTӧOziҢuU4SAJhuZtl.܋@*7Lك׃t/UQI誸m''x.\E]^?\E3q!t 0tA>T),Fhva)NcÉ>9(>_6))I Daz}CzjUr_E!t?{$gtojg˖DlN7/l'?֭Nt(QZ_,Tl{zz6u{}?s挧ق|v?eA{k^^^M9H_uB]J t@(B]J t@(B]J t@(B]J t@($_%\ t@ BD. t@ BD. t@ BD. t@ BD. t@ BD.ɝ;Qr7p_K߉afrJZm۶g[Gz"=Q*}pD.@YDf$ڜԩS_GK:RHVXqcm\lڴB^Kb73q9|^>;W^MJ.mxݺuU*W)W1}&|EX_~饗`qVtܳgd7o._BM#cn7iҤ~ϵ&~ Pj!Uڴi/{>;p6?]2Kҥ@cǎ\z۶m+Myof͚j-Z-VVUQjuY -[ZvmUvN9s)[^j>hNS8_~eEˉ+O?g~\Ķ<^ԙY`ܸqŋɓ'; ;֪)h\pvn,ޜ9skCg!|^l oIj3W\Ga @p( H.ZVҋW?$D.@I܂)fzSNgJg'" 1d- OT:}r* B)rc1uhaÆ=xs6ի%Kϛ7(sɧ8.$D<0^osFqiܹsI`fʔ =@+ĝȵBڵWc~ mIE 6b4a jJ+dFUi֖QrIgо2k0O(E.a1Yfs~KK:u꬈%pҦ%e/V"\: r@ȕ [}+,D"@GEmUb9ae,m@ ܹX68aرoڤId/rnjE N`"=/r-@J} r@#T"֘eٻtܴ?O={~0ѽ{Q~7vn&LоCp;ts{+YJj"-[j[io@`m@hD.Xkh.]1Wݻw+WܖI&=tN7s"E}^i߾*Tؔ={K,/~7dȐFw :`@lڶm+ۄ1yd&ŊCM*Zm)LȚiUݷoߍUTYw…t>/nfߋ~K[D.{ի۷;1x`&swϜ1c= B#rc!>tM2A_|x(O>9i~weBح45R4i\ݻ>7q:fCZ7mTAlٲ Ћ\=yҥ4bG}b1hР~w˗,N:+K+'` \ D. t@4 bŊ|qI I8%eʔ%J7md7nXv%u3m= 2;|z:6Niq͝;v~7;%>q" Ѩ%+W$k +mKйNAL;w.n_}YiVZ}l;Z~ȑ=ԋZ8K.|g>}2os]SKH-,,o޼S+QS+s&M~/c͛7?sGӋI>ɓjCs^y(ebwf҆OV-[2dݻwڨQ ,hlF֒ʟ:u+Fi+Wn DbKys4/Uv? rXn\?Cƍ/G#FiOlUVժYONm4xFhٳg3Jm+>K,'yAe3g%K?rH+Vԡ:u>իWWg.\؈[Xݻv*ntnO3g2e]~3+I蚉ʣ;vZe}R,|/Kok@s6l-wvlr5'&&^zj*>o,^'Nd$p"tM۷F<7D1cty뭷^x4Аi^4ӦMlc_8|BP'76ދ^n)+~[lG}SjݬT;i̙޽{Ӵ2Pk# /ws -9a„ڵ(:ɦMο|rb,<vac鉿pBI&e˖74J.]h4pe˖Hڴi#/g/"RfiG4N6-knׄ2(PrNVĽSu {:th}˗/3 \ւtu xș3g"~t']bJOJ\\^K˴`L'L8e˖r~lo駟^kQWa|ql ht͸S,X–__1$hi-N~{]jĭmժ]J IȊᴨx֬YOzynq56Aj@v~k1~<.&wn/T3K8*ԯb h"cKُ0q@(Dﴕ?Є-?I(P7Y◸l `MgϞ#Fك,X I&?ȲcӦMlmn P Y`0bĈ0aB:gKÇEBX +VȎIϻ6`\@܆ HK֫_ޫWj׮D2mpŴQ.aԪۼy93" @7w?G2e~RƯ -q1cƳgΜ$.[Jϛ/_,VȠWݺui#Dh vʖ-ۉ'OfmNՁnoVh[|ޥjժaP"EơIP>/x9QFuٱcGI1 \7n~^x-ڽƍ{?+Θ1cf][T^}5k`Gcek\h ǖ+@ZCeG?DR7S8?Of?S!aH?_L<-sdZDx;a4́S ;?i/9cRץK1\kdU[0(c]wl* &/K<:"K` ZZ#~V^{)*X^%gx[>'lԲ'!!!&[ v+eP\e;2XH--<@ !K/-4%ni{q$~vin_Y8 i  'ٴ/[/R׃_x^І'ZK$E1oGvJ/ζ כd\uЦ"E#U N4i.im,A-7y"WO>1Zg}>3I,2;Uь [2ٲ i ٻۛOLa=x%-$p z6ܹX &ɓe[@@k.ZgIG<\;u!fs "-;߿0;.\~zk!4гqNwzx6堇1jԨ ҭ[tmP&fi @xȍ0` F9ݻb%JI]QPʕ+ꫯ -[΢cs;w.[̕+MBLϊh={v ''jժ"=z4'Dh;l-eF'i7JYɉ,hK7z'H# loK2D/^ oEJxǎ%I]*ugȐ?&wxԩԬY'63mJ7cƌgK.).B6lذg87g *l27ԊKcqiH M$L) |4iAF~͛wrr?` =qS CgSK/>};Dh,wZ7o.;w?1[-ҩűX'ٳg?~ \5k6W%Xgw}L믿_ q=۷ҲOZaƴ>b,ݳ=<;˾eEn׮]G3Aq$B-ļNy~C/q"&;o~4QVMIJARjյmmܡC z#X{-QؖM6?o޼d"&4v͔)әgfcV7/5-;ۘ2)@X?~SuQV#gΜD^v7=h3 aRkc j ɳ ~Z|>}.cFt-XNKo0]+Vl7֒%K7h`w"Z~ZzjCڵWҦ :@kp^nݺ,-9C;p-+»iӦ ,h,VdZ"+ڢ9m;|^ DVE.\؈ƤhQZ90ooy~XbōzNlٲ[͌}gߡŧA&+VC"2l\!Vo.rȵR/-Z Ђ6Ҡ1eL5]V\Y[ #?$&@l؆8Sdzpٮ ހO?}ZdirJllٲY| }yLcڬ!m۶FquDYg% jӠ퇣CǡCtmFjC[;͑XfM5N-{ڙR} ʊ~ 4iCtL>#<=uS @]OO?cCZJQpC[ ;w.?³fzrƌIc5ؕu$,_u'x#%E4,şIRNjͲ4+Z4jժ|IHݜիWWw)mĉX8; `lw(+r9kdЮ]c~|kÆ Z*f-9ydVz|V|Z/G=A/=;|"JjZ?az?pN@0aB{zHUޱe0ޠ @-g͚±e0ޠUm3O- U`-ӲeYt^ŋbl`FBXeE.a&i1|8 $vi;wi=2 r?# Y1[xhLe>k mKh @KRK/6: X<"c]Ue0΁!z[Ҧ!M4AMp-D.6]~&b ,X mLn l >ʊ\9ŋi(TN eh906'NdrmٺukYζ iMIʊgyfؘ1c1c 2`7[l)G˾/[VIʊ\TTm}©ޱe0ga - (g( 0`WH4QVzG9O$f \CKxYؖ7o._BM,|-A<"7]tRN}%JrVښիWWm$ΝOڹLM`o&K;eΜ4 g[6m F&nE.A)_>YߊΓ'b-ܲ|ٲeuen)S3ZKPK/}O>YxG\\b޽E k׮J-b8-K-X V'O$ z``/@ mv2d܅֡%v3gM5d2a"4B ߿aڹLMLf̘,6!vAQVvu4v<vi8ZYCM2gϞHeʔe۶mY8} ɲ(+r}|…tb8KzoӦ͗SLi©}_tm,ʊ\x]6NKiF,Zz[">PV`[Wq`jw)T"l ¶ ޸qcJ*m`2 D. z[ʕ\&&7*V.픖%KS,mLoذL r=z4' Y1J*,&w2g|.'SK/]'O*F@eY~}eb8u AĩSgzQO< A Co]Ln% r20. l T@YwwQD;e9M;ю,b"RJm'!+s uz> JӦM˶D=۷w <&ʊ^z l;{`w24BQd  <@Ђm,öƪ: 3-K Ҿ} Gg[c}t`\*7 |ʕ+ĉ ;]+@W0gTTi=˰ @0ə3Q󗐐׭[WzI矹e"8('!+hb6X؁z68rH.L'%%%ȳ D. X61xإ^l,PVb35z/lӺu)2l?```eE.P6m|9eʔb/Rtd@XoO/1?@e.\CD.F…7jh!L 'OmB`QVoФI]vmO,,ۄP-{LcP/} r=rHݻwmʊ\좬Ŏg.ʊ\ BD. t@ wj8^ވT8'*T@(rQTY* {\!m4I)IC9qdzAɓ'9s&/_ClSO$_x1?<vy6e3  q q q ʖ-غu+իW`%{L0!Pn]߶n:0}tՃzܙ3gzw 9cرcT?0C!/WJY~}O2!CӦ^k@կo\V0O$"K /^oreex?pڴHVv۶m_{}]6Oۏʔ)s)4hP{ \ZF[bŊz>Qladij6mts==ztnb`'D,7gΜoٳ 6N:!O~ {M۾}Ѵ3ca=zŶ//=w<}`߿>%?bIҦe\olTT)o`՗2@f>K/)R$kL峴ȑ#D~ ӯ_+v]… ~`RjմU#3~VbxԬY3rʴ㎰Y%K.\H>+!C_*;w.-kUÆ O>ds?O?0k}hٲeM6Q y6E p񈖟5kV wʔ)i͖-[ S0#7o<0nܸIs lܸ12'W$"K I۶}뭷҂ 7j׮}EV7bĈM6e(\34`;P vٳSpavh$,K ﴿z+cֻB/ q q q q qdzA.#.] r+UUV3T O>C塺];;;;; r vy6"@l;rP]g\?)[*0`b^BkS/J%{O<ěڍ‗t ѼɓsqB>}zVZpf)Z={1Η "]tU %I 6\hѢSt;v(Wr֭M]UV]^Ճ>| vrɞ=I֭[ObEQF .\P/2y>|pح]ryNIIɘ!CEruCugW^y/N{ɒ%T-=؈TG$!)Sk߾dmСC{Sܚ}oVD;y3fLQY'@R] wΝ%.]ZWu=[o=HR+V2GO>CѫWÆ 뭲Ӽ/^7ǨQ%%%%k, 7-[vk*v.(mBW_}>m{Cz$T[nݺ 7O?t6_|:x`~bMųAn"xe˖rZo\B 헺={63ZKy#)?F? -[SO*:t(m۶*MVau@y6M4~n2g|fVt\=z4?N&qԩmez„ ;t0Q]qTGʔ)-UurY{ر\2-z~@Spkd?vq+{&0 vӜ`kɨ626}bÆ TjzJAF;fʔtXXIHz?t9&]iiRr=F?̙3[Nn:w\&y.\m4N 5$E޳gOUTYvڪ!Cҫ eXT'V[XׯX?dY"Epkݻʳuȴt8x~jDN~l۽{چh'Tn"Xxq}y_ƍց':C ++W֬Q*u˚5iu rY6mi̙x"ǎY/8pm~%vʳ,M9-Z̚={vsDܟa֬Ys"\+[V Wu=I&Do߾ߵ<ڶm;uʔ)TEp{ݺu%뮻9s4K+J8pkvc̚5ktN#ӧOgg>8q2-jDv]w}P !)Sf[2Uf\6e@p}f`ǎ'Çr`Fo ۷V]?0;,t7k֬|%ߍ-] j{X{MYŐv:Zu > '-@,U`W?nMpJnݺtm>&#An"xtEmɔ)9^֛n6N gzN^cvҥm~ƍ˳'L3g4'6ͦM*TXq6?C mV+Ϩ g~ZhhܹXy̝;ifhpykr~Bp *TI ٿDm>7 ׇJ,k6m:WNK*C?|^h۶)SSXEO#]{&͛DPݰ*W\TЎ;Ji f#8M:5k\bE-U[8Es,YΜ={6 ݡCZ{zh]Ui#8;W\YS?_H] "[Μ9E"Jv" x~߲enMUVuY\%2uJN#Gɝ;QUuz-jn۶meT!QtedDQ6vvy9fPk׮U D;֭Tu=L}'H:%*`W?O'֭[O1cF+x?}ls-6͏}yol3ϼ"C!UO;f̘1E:É]vSf;|?rEAAO?k"6p9F.iwϞ=y٪@ %%%mʗ/ߡÇ1%=k~߷o2Ok:T~ŴLǪo 9_E<СCr7lPIO*#_(y7Zxq}FS}':u*[S˭_<ǬY={)\^U#E<0k'߯_ؼysrmQW;){'U@nﵿe&.m4926H"{y… 4hHEndG/hʗ/Y/\x({Iu=qG꡺F.cرt2F߰aÅzhnxǒ%KꩮɳA.m۶2瘝eRM3@t̚ ΝL׮]G 7鳹O=멞R]'8,56.:Ќ3Znz6gժU5TDx' rS`:Zj5Cdp kr5EeGRd"T?*YRW_}>i/5d 4R]Dw}}8+y tG6*Tشy|-ؕrƌSbWS h诠p2-Jjv@ƱoTߧNʖ:>7mڴriUk$v}xf\HFQǖ-[I6jƳA+̗_~yM |igϞ$\[”)Ss޽ >6k]e/Hd?pB 2+Wn<`mEuwy6ݹsg m4'#߰?9ذazk>} ׫Wo<3KΝF]a Aɀ-__r*U3 Kϩ˳A.;Ђ\<]"ue< 0T|*W^!Cf |nlˈg)Y䯩JB ZH2vYU 8p<:u4nرL g]+VK[hݻv*zqI䩮dzA.cǎRZ&lLn8vX.m4'1nܸNhҤɼs6u@<[|ymy^MΟ?A޽{wQ9wmtI{Du="^~W.5yf޼yMd\D\ KIII;oB1s̖-Zv>ra 7A \V]DHyF֟&PΒ%˙ӧOgUWC-[Δ'Of,[:rжmʨC"jpkd|̙,@DO/Pm֦}˺]V]xAngszS=NOYgĉ:v8AϾe> Anz7$u[#& 2:LG] xoeΜ\AQY?rsjC7QqN<Frs<ȑㄴ!љ0aBGyΗ/ߡÇ畿Ϟ=Yƍ_UZA{>S]xg\K^s$8n޼l֭s95:qDy~v71jM5'&Bo,Ӄ'磌7}l |7F>uT6N"F[l)'2͗~AYn̔~e^FQ<\tj-IȳA.#[nV[M` 6tD\ӧOo-2l{iy^n]TU2úL2۴L-  rᮤdF۱6aÆ}ͯR:yvr >vڪժU[O2:rdɵ ~!N22eJOk]% 0`  2UV]+Ǜ!Cf DvPr *Y'e=YZWk% #N:;vlguFn>G͚5WZ6_bŊߊ_,qO B!M`kI- ô[%VYo(P`?ƍ$&M̛;wnSufʕ5Yn<|{׮]ޭ[Q$w}Tu]HCn#ØH3o޼&rb.UԎ۷VYGo>y0jԨn={vxXu] N?ԯyu ncG?rļcǎR2-9%j>%˳t5kӪ$UDߩ"!U,Mp3 `Y jrH[+ٟZl9S?,_0 l+'6yG}Nx nM4Iw.ׂ]\S>WWJfΜRGqQV{ͳA.boԩmSM;&/<7nx iPy>tP>R)+f͂d(nyH7~ҝY;wo#%z7ߒEk0HpϟXPm~| *UXq~"E)SsڼҥKo^SW3s/ ed}'Ez_ǰazKI_R !WC8dɒz_b T]A..#AK`n!ǔ)Sڵo~6_o UիD/8pm] \\D;SP]pn'Y[WZUf͚+Z;CJ z׬YSM/~ג*'e6 W]_M^unJ5Vɶ\UP|B!&M̛;wnSu`Y? $@Gφx6e3oҺ'E$?d8w\̙3ϛ7˔)-Q"%:=1h?_뮻X(֟ l Cʝ* -!wum۶22-;v,`i>}:k,Yθ+Wf? r ,dZTM*\[8$-ɴ\=|uA?\-imd<>wu[e#>y6}嗟z$2}6S#Kp rIk$%嘭wsZti]D|l oyvKpX3 vl{@h:t(- *tĉ*F=[:΍ nPҶPO X3a„'O#rސO<]VZ͘>}zk>뮻©rR\i N n5N&EݽgϞ"|-7ip#Gg~2cƌV2-=&Ic~{He 1",IJU\vMp ۽{wQynذE5i,'r +5JJJJ,\^e͛UD EXm۶-s0UHR[… sΝǎ76_.ʳ{&K0,˲s} G^%w(U>ue!M}lRN/{-,:o| EXr2oѢŬٳg77{P?m p nj׮\iW>|8%KZ7m޼us%m$:+iFKHI1/菩7WA.g\9oU>}zkx6ݰaC3fR]g\.x<v   :> <3ҥK@L.{lٲ[*ɺӯGz^zɓW,ĶqqB i+0|pa$:"9h! !?ݻwvm>KypH:8iƃFp֍1іMu6Bz\i p]/; ,?|b6e?@ڵ~/S?͑fWX7m#]v_˴ė&׏y6޽$ŋ-y*Tn9.],P=2ڵk`Ѧg޽feϞ̕ugV\mڴhv0$l6 n䒴u`Ƕ~2gX~}XbW$GΝ]'lO]vW̋ФIϜ:uԖ-[l8qLmm#h͑#Gv$:М>l޼9P|D<VZumHp6[YNDHDsn:4%l/,ŶmEn4pY? ׏$*[ONN+W.v#eʔ ~e˖*\bEڥ>}\?3P`s1cF`iL\2si<| C i[HLlmܸ1PbŴ˳sM/M9Ȱmkժ5ҥKHJJJwF'&6\s=6ѭΓEk2SO]'OKPeMg{U;`WFp֍ޣ+\p1m#4'+j"-%mA.<{];;;;;;;;;-[Vu[e} A.\|Kޞt0aBǏ甃L5<8OEpџ|~RylHZ?_ r;kƍSmS֐!C>ӯ:q<СD d˔)-ڲRr#H5ƍ뤺;v(e9s?cm)r`w2,/.Μ9YFǫ[H"{Aܫ ҥ;#Orwںo'n۴ӵΏ-Iw.ZX]2-}ٗϝ;Iul}.?gs]p̦M*7鮻/Si{9?ӦMkjzx܈nF4xm+Z[rIbN֮][U溋 {>S] *lr#䠞;w2M;@`ժU5j֬8oA{޼yMRSY/َsb`>-ȕ{?7Qh\wqǏWu6o\ޭ%{ ?>[3M6hߥU^6lPc9Xq+ jdsc 2{w|n@W*f̘1%JVnPjР"uBk׮bŋMdcyWdthrO?>o iҤ;=;OwÆ bE+#ȅ&NAun>KnD (Q[3^{/~bI֓^dI=R;]ec X~'ܟ:[u A.VZ5dTTf\͐!yckԨ8?[#C3oK(S%|_: ,\8FFP]pdpUmlmh]z-,Lvԍu*?֑uA.by ,u ӧ>pdc?Hm# pZ߭%hk \w"*3VɁ_e\#9if?pLˍhnKpkN5Yu=$?TH/ߴ lro+uJ;Ku=M (p@cNWիW_m?@gWj׮oK.O,F˜5nܸNZK: 1( Oܹs.?vѓ_廑=!(S(ۣl2-ѣ>G[Dӱc ҋ~ފ+j))ZcͭP¦TT͏r1Cu="դIyRmn4oveەNP ll-[ʕ/_~LwutϞ=>}tV1bcF8YLzo162E5c\z8߼rc6We]A."C}!<z^j֭[OײjZ;]+?($#'YҥKoF/ض9s泱K0NfcfzT\r[ {ߒ+^qƊ}_xo+<`=^lKJɒ%MURu=A."?l rcTӲe˙*[8p@i}* nlٺukXllVfH6nݺKS̮f*Uj|/s5‹u5cK#ȅ#~2 V|AnD \ Hk'H̾bŊ2.'YP2{ukih%[lReSU/?͵FάYZx1W" HeϞde`ټyٱY|KΘ&ەvZKruŽ;JdI9IW~ XiѢŬx8WyA.lrn֬?e Ϟ=K) v`K[25f-iv}}fl3DGڣKi^M}ݟ; ,AlGF[|W8q"kMĺN~OI96{e3]C\'|^O<Fk&G'_>.տK=/FS+#)))9e`Y' Əo2̙,:ҥ$h8w\j|9 $i52`D͛ u{=U;-w,CNk'x3ѮL2$f3vv M_$nѢEwˠZk˗67n<=S_Z3<+ h[9q{mٮǜ|?ҽmWD17{駟~U[w9:$=zxnB-cƌ{דCwÆ쵓'Of@9%'''{-vcer1cƔPh˗czҝ$Bq?XSP^+Oqp ON s*Yŋ5.ԪUkYbqg79  r p3g}vOe`7z9>W.KI׃f6z,ȕܢ-_`߉͛ˏ;sVo;w._ivm_Kע p+L Jٷn3$c~t$FV+9fImNaÆJm)N83l3nKpr/Xm+:8\V$fL̽k;`R5fAݻqqlnll; Wo֭lٿ a$V?Cg}vDSpRyn馈>x\7n8ۭn-߭2999;r t9íxY%K".*7ޡCih`Ʋ~iAe v믿^qlaRt"/}'{.+wn{?oz ,Zv,X pUWETݻwN^ 7V 7Ϝٴi/ةٳ|.;th'H];E׸uw+'{R׭>Dpuw{vwr#ҧwK7v+/Tn}~Y*h:Yu*&`‹eysm ۰Y"L[ۥ'K+eeobEUݚuDʏS7^.U]>x|r㹹B".zkM ׋3wv~n`A59v@<n \rktdIsoףK|n|nMs˹vVG 7&\֩A\W%zp+&r1 > ^9&=3^nUKV%zp32DޑWvnTN  K 판Yw5#.+'^3NzSr10^Gݺnّp=SC|&x ׍+0^})))3%U?8M=FHn?rU7Wgn\v˥+]yv"5W *7X;Aw ~\^.~/P.x!NUg :S[jn\͌:SۗT W/ .n^=r`‹eyUp D~A%1ێlb<5W}ˋSs]f~K7nRwmr}@Dk@&!mL|W2WR=Ra4TǤƠ|+\ /O^+H σx1S}Lb&7uL6\cs,P>/A v%pԋ\AS/ /vGscst!fY~9]QlxYLH9%9vԌ#_V7,"C{) '2ݺY[ss:\OsɏۍۼtIΏHQ7WpLpYҋ-|@u\;rvnRϋߺy ~c\Ձ \kݒmrpw .]y|7x)b6+we{Wz{k3rwy[Nr=Z1'FnR ~nfFNU 3cm'Z \r-с\2M rbwvenK ׏ ɨGnR ^z2ҥKq٪q~9>xz|?_ &}{yt +F\kxCʶ"^~>$rx@u&3slO,/{1~X,5Eɐ!C1젹5~ rU^A/UOՏ#/tIۋ'?grL4T7W#܍̩m_94WpAGٶ 2W%m?b֋Gq|T]c^<sAGѻzWR@|y)KLn<6s/|?_=JT fȐ\d%Ks+y)bHb1ic_nϝޯ?e~n[sUz%uk^>.ݸzu\bGҧOzy ?NzƏA@ȩS@WqTzAnB8^WO"ɵ\/~FdURurubF(TuI=YT_:W`h`M܀77\'L"ސ U~5^qJ&ך`Y8tC\V=z9~nBͬ Qu"q[o]!+x1 NQ1VH/\nxqesh++.+Dm4WpMK2"Pznsnp_v:+Ǭ wx ^)^n!ȍAvyOz~'AI' A.b)^!+>{/\/2g/]eMZ2e y۰E;4\!:^>>; WMnhrT@ v~n1 cSTgr+w떸 ro?([l`֭ݧOСC/MGs[o |7͋~Y:Q~(_}Uo4r@l*TbY'Nv7׿mb:(׏u`ぜ9sF^Q 6w@ӦM/vvݝn-?cƌ)1kXEkvѣmo:Y@ŊݨjժXbťܹeGs?4j(`x"{ΉCywu (Q"P\@-2]Υ+'7׏m8hO8h+omN1G8oun4h8pCj J١w}7P@@ʕ/}޺u"*?hKuwrpxQ}WAن%_|0;8Y7O:t,[̴hxy 1":uUs8õ43mڴ@jNJ;P:񽺹nQF(+? }Ld 'ܾߦ-;Ծ5f̘@ڵ-[ L4fT,191G1_5SN_si{o`i/5rY ]tiecĉ;lْvhѢQ_wuWM6)䒏Voyr-i;Ӧ .Uoɗʖ_;v%U'7׿Vxe(FFFF[w[ DWmnY|nõtcrccW.͗/LG ^z)?{}zڼ^zٮ#9]uUiu?hРuIs'7׿Vxes‰dprvٷZK/[eʷzN~f7.l7n1G1+|7iS][V^myY;6ly"`Hg5n8#ivW 7[;;b$m'4'[3ns4vp`*%y~q23ioy6uvr./-]4-}gw44m.]=sO>v 2\_v9"S岉uZdr4H-!!n?߭mnhۋ/ au 'XsÇ gMݷ* +ٳRlv~Vr©crcN{`s|w}}n!]/576~!УG /S˥9pgPk\%\""iWfw'K7,[/ќpv˷Fc6b׿diGY5 7\VZR~b>hZg{oQF];PʷX+_h޽W)]w];v,+N+'3ZjwGZ[ee?߭hǩo8Y`A}+`h֏&X{Pe[jKPbv܍঺+/DݺYp>&]z,Ep77X]62JE mі#meP;tHʷ\kq|;~nm'֍*]~͏Sd}$]?єmE|!6q̸}Lv{1СC} eE&%^Ћ65;wE/aБ U5j 7'C%:%UqVJw~k&9n7E1+ĉdh++ۊP| i)Ȱ{nCmÉdqI'w |HMѶs͋ ٧ CV~DRaҘQAn?߭-VzwkVtѤ^J+&l+\wfÉN4WphG |Z,l%;H;}Ini%N4WۍpjOltcv;km[/sTt.h:뇛wݪQ'N4WpmG-rݼ֭#d,?nc~ɴXFN=4Wٳ7RxP폢]?nr0^[/ur2Kl,]4бcEs0{z)pW"vcۥsTϽAO.' 0 {" rMF]vmDNcj Sh!d`T.D~NnhECm4Y0ew}xl+B T6ol{UP}$u7zN$ۍ L߭s/Ekᆻm&7CmX/ŚEΉqryN,']Fl򻵳~h.oTw-3_~eף rÕmE7\N|.\Y9uw csr>w/\Oݿk-gҕ[mI./{/@TR%W1ׯ7.)?Y_re]9~bٯZW[;?ݪ#siCnO/-guoV˶l92AC3j׮ml7Ka4!ݨ>9uqUq>_ ʷu| ˩~N>q6mvwrswҕן,.Z?n^z~oD ݪ{,ۿoiy֍;wuZA\zK͞=;fvsvI&׏|=9n*^ ?ֻxG/Mmk| z>|e"#ERvƌ~FTѻw+5zw=z3ɥ+Uo2Ɂ$[u{4rb򻵳~~k&n)7={G8v+8Y$iXoN# rl7z~9椤yNoA~4O?]1?L?a߮7pC\;Gr*Xʕ+ۨ廱]9~bY?v9~6\S_7?ɍog#ih*lߒnv뗶}Z$;u$ݨ>!VƍW"ȵ]+D[~e#,`;[ou?p@CfikTjհ)S:~bzJ''`o<oYaFse1c.eh\7K;uw" ݄Q ۥ9noʗAx/M/YDL:Q~ W.nnKlUag'shV>*ɥ+SV+.[AOrzsj5x~.^h~+ܨ}ˌ'\;eI&5k3gew:uj25]ک{$ۍ*[7η^ xOCDy(nnvI vc~,[cўOAo%|(?TwrRF;p{Uis+ZKI#u~kM,[}Jv3Vʶ@UnPUv)"{nl.D<~%~=h=/\+t?QLvn'ƚn҅Ϗ=[lfb黊Nqݲzhw._vn沰*OnӅeۥꓥ`p^w<;RǗ@ȏ[w"ȵC3?Ջ!ɍ2 Nb,3|ercT~ ՗]ݺ ץ\)WJ3fvuB6Nzs߭Ƌ+0Pv WwkAM*/ASX+ k~2?8%k|/BzF#1YFsxi"E1_ވ 1 'pxp~ WuGAۉ/~*9 :sF)3(V[/fUsYxi`L嘯:֌_[2:k瓥Sr:#˲~Y،'xzZ~]+ u2xn*n\T\/odȐ|׽Ųl/^:[&Wues,|/[+x Az%z:K~o>&{l#?w!:2xn צX1iv;W)a^BL >^-Hu(P/߭Wm^<_rGer[?ϟq ɽpke\+D.^[ ϗN[yD:#+mt".Wu~:U~Lb&M4W" c%X_n/^\&U/^[GC~Ć3[?_=r]qN^=ܨ>?n$P̋Trw;գxjf Wf 7^2r|Nb,'Ku#6Cȓ[~n/mrS5\vx3>cQST'"hxtT,^6Az[/SԩK s%ǜx9{U4WPOϋTSOV 7V](?OfqZ\+ c]^<7WM~jz3;TgUnS_Bw]c|qmr=&^?7WH 2C=B,1#r2צ( L~$2/ /?Or0]t*mF יr=&^?/]%z&׏]y_xn Δ Wv^ |TdҡS-]~nUx懲 WvM jAnh~nKOs+\Kp^Eq~rUOLB)~oip%+8S{W1I4W/F>\Q%62\J~ni`=ۥ-\ˆ!/^8rC•131O%a\/P r3f̘D9n`OıDsǩ]~Θ:Gu&'\g|@Ous;WFs+xn] xqJ?oz4W0GqnnXw ?frݸMU6~n]]\%ωph߭Wy6u{}r!k ^.Fr1cn`m?&ۍO80R_&7:^ǏZ.;cA.ܿg8^+?x /~oi/﷪+|9WGcXEۿ+nM6y=Ν[N;O-?5Hkw7mJ 4XATRe D9*U`6ӦMry@2|d.\$sH >@2|d.\$s.] 3ϼt|tNgk)gEwܹM5k6￿M6ӬgϞo?C`g;eղe˙fjb[!~F/ʔ)m֭eUOHкu3fh,Vl٭۶m+#ϒQ*Iu]_={6s$$|C?VaM6k{>잃{:Yv$%K3,;d[ʐ!yĉ9R}(   j6}5m۶z̙,NCZ]5kϟ`FHK-[˗/!wHrrrR…J ג%K|Is8Ug=IVZum_|$-yT/t͖MIIxw~)I&$(kgnm]^|Gu޽7n<̘1]J*#ǎխ[QӧOo1cƔ=z3`ew|鬷z7m߾'vVo?~W,XP˾Ip ,Zxq &tB֒dԯOIf˖픬[_R 7n(KJEmkv! t^~}T_ܒ֦.&$ao߾e;̙35JTZ>o|Ix˲["LEm I K"73owJ$s,ZbE-Ir>ZN_V[[פ˅{P!ӦMkc$z5\?o!gΜowXbפ<j o6_#Ey~ _$[9\"WHP˗/ىC%W^]=OSЦk׮ܸL}"WH]Z.X~cg}^z9k\sdɒzڼH-!,0Un`\w>RGҊQ*+I:y$5A%<˭}Zy5#ɺ+n4>HZG2UZ+Lekyׯ`'NZz'JyްaC%2VF<@oni SYVvR\7&r'@D<: ;V֬YOK!RXoP&i,I"W>>z! `x3rYTnVjKB5I&k2nђZ_5Oq3\$Y(S3~-Z%ZIb6z?[/}J_ϟ A<-a+d'| mZ@zϑV_b|}Tĩsu ]le˴$֧qCɕ+1}W 2ț[ikZI߳4Mg$)Ss$N٬e믿O%I^pά9\֭(I={58X"w۶meʖ-U?ԩSٲfzZ?/XKg}A?w\3ȼ&I(ϟ?qRRRUjh˷ifn$},ZWZZySRr|!H"{V^]ZjkbY >>*Dn8'hs}4[l~̙3YӧOg%MOJ @:I*lr}V]dn+]vt^KK۔ZK[dk}͖ߟ>}zk+I\tS!χΫ*)>~wyGsq^4O!-i1cx뭷{!CU] \ڰaC={=eʔv.\^O8~xN׬Yse6ȼ_oիW_-ϒ$tGV[tҺ[ާO*C2Gd1yne:gΜǥk4\bŊZߢEY6mpwL߿ $+'I]_~HXfM5-Iݵk#ן~We`7邢C͛$K,g"Cŋ￿)2ZJ4X4%nyI$+l cYZV-{y >@2|d. &Iݺu>@0$sTIIIЦIkH*O ;HkH*6jԨn?.]QY'$E3gl٢EYD2W/S]D ffƌZl93! [x\$4ZF/H Qk׮[o=~…D*}VVu]8k՗-[VG;w,qС|XreMuxG2ףҥKwQڏk76*觳drr7{:UXq *9YڵXu7| !~c<~4r8wyzD2׃oG-*Tشy͚5=u ޻gϞ"N˭ \v_}noE')Ss\aٳg3 43g,\yR:>}zkIݻ~]wŗ_~yq)))mk/XQÆ tcEuVU*[*PAy(F2׃-`m޼ly.T~mt SNe˚5iZ>護ͨQ铹rC̕$lLկ_E_oڴ7|sx7íC'9 ~7̍ZUZVTiÿϞ=~E1+J.=Ui7Vv~-M}wy%`⋻/#}9NQ/ H& .׺Sxֻҷnv(ngg}vwy _kܸ|y]bO8t\%7ώ7<n#scd\m۶SiIn}f/s0{Obv\$sH!qWXq *K8RWիWVm ~|wwa"۔z$sRk֬Vz^ڵ{[}w͖_E5pn~X[xS]$u] ްaÅ֭rtwqǤ/NmRJ_Kw}ʀW]uO=G*G=rז7L׮wY#vm_WWJIK?-`F7=|6~{W_}_~$$ɬ_|hѢŬ?B 폶&)wʕ5w]ToƓ͚5DT;vzG_͟?'|E[q{U֊#Gɝ;I&ar%K3W_}>IFS\rS:aӦMnS~_JE=L駟~u4hh„  .7nF2ą7Dp5VDYx衇>ڵk>/jSRR2k6yƄHKӷz{lDej񩑖?ue"|F֬YO:u*~IkazϜ93gd//ɷTɑ$[j5C?cǎl}ZZߊ.i,ߒ%K*q-/$2=s̖ED|שSgk8q"GOjGcd.WiI%-a!$bNקO]t#? t3etN~-\hS޲eԭ[wut,ۣ5={|{Ĉ-:' USޜ9sIrM?OжG3VYl٭|_ti]d:cƌ)N$qހN2WKzKT[rG= H"]vSEZ:O m$eY"ٳN6Tm\!ӧOAmV&{}… WnvXOV@t˖-gv"d̷[!%+- krNu#GchqA(VϾ,{Ŋ$q?,Ӓ ]xq}eK>Gm8qbI^IkhܨQ\|'O.ҺR=Kɓۭta M$R@$Ze=3h8D:Hc/ۊ$_\ñcrEs+Y~߸Xb/\{Ǐٹsq:$%<$qdɒzє'Sy޿!p-˵iHf|wbwD;_yg$1k׮b2\uVF&{ui$µb֒<$w}vh`gҥܹs-7%,I&̒7pÏnu]տ;YKj|B t sevJ}T\/*T@1N7t>pLxܹLN'z{d^?K"o+I~$b׮]GGHڴt sFrլk7VԷ կ߼y[ʍH&s$Afl*J[`Ĭ*]uHHzy_s޽ie}JX{ѢE H]n\2ؚ}v%mno[`u_';N$n|m%._3fLQV]0}L߷$ڵFV ` QUH|u $sRdd<ܪK>׭ll~UJu1{={EKIp#)#n/n^ V~wH]u-s2pY5rW|^Gcd.Z^|M`֭?)#U_6{_&%9.UZٲe/v@֬Y/{`ҚGIRti+ׯdΜ嚅&UViuop믿.]J֪U+PF@lҒzޏ?("_6p:t8vX`ҤIoW,k\pB|Z࣏>D3gO>//Vإnd$?Ӑ-q-[6hР۷OklU~Zd..o~E2oӧV]رc;wez%\+rʥ%?.]x/{-X B**T(YfkFɓ!E7D\}Cӻwa'$sXܹ;v,Wsu,ujZj$Y5|^Z+ּy^6W<##F4i" g=8mǎoҼN:+}jKPx -s:ӧPyhөk\Y|dn:|)fOop@iݺ3flΜ9oذRѢEwk#izᴾtuԕ. $eUfeUV-_*{i . yiuA̤|>rdaÆ~3gtM͛7ҧOsd}'f͚ٓ6ϯ]pt*TI?޸q:CnҤɼ9s4} ,OIk!9~xJ*mAC,_l٭ׯ)Ssp]HRHZ7+K?Hv]/=hذa/ t=)Iv gcÇjΝTf͕O-?o޼&ӧM*ɓH )$sD.mݺlժUמ9s&۶m;uʔ)ܮGrQcݺuU:w'^$Rbō2Rj~-[VW]u2%}XKBmZ%gϞ=E̖:uj[-n޿bŊZfvϟ?UV5kV 9:u*[d.lyʜ9Y}ꫯWzZɉϐ2n]u]uuWUPaÇZYkeܹM3gw.'-/-{rulƍ .~RFUxW]HT$saK׮]Gz뭷~I&!# ۷jշHoƓڴ`?%_e˖r˗l\¬H6._ߦw=|6~{kwY_fo޼|r嶘f>ZY7>-X(n1 t֭7|M YZ][R}k|]^Kn;Dwrlj~%_~V?ݻwaÇecr)Rd7f! N<]]{-|w~)\2orY-Z_n]LJ4R`\wYBƤl4e2ט  g?c}-:ϟ?C3[FY״ŋ&\m;d\GzXDΥE3$(($ܬM5[RRRre~zС}$pF$s+IZ-HR4裏+ϋ/,(-|{k_s=<.[h> Roy VE޵kW1qIWVmAg^v}iz~ 2dH_O< f_nFCV5k6'r;TkC j?⋻ӟ%`LIW zKb^H}odΜ9͚6m:Wc=6Vno͚5Ռdύ:$b͎fdrFM;ܮ&.]5)Sfܝf앇6ݤIyE]@ WIbwܕdĉ;H?2/ƍ|d|zUT .l([G$?KIe۷o?Yn{衇>ݴil߾(}FSg}ݟgȐ5ACSn۶ʕ+RsQ>} ZWou[ZFДe}[8qDΝ;*Unns (Μ9E[q+˗.]zud͚u$.D>{lfJJ3[~޼yM [͞=X'$]zƄ$QK/<# p/%8OZ?/_C>#Ҳ[~edp`Gj:f? ,XH?- [yGawG^?VJuOjeVZ͐ 1n ‘e;v8!X(}ȑW`\33fh%-.߫W&LQ?-ʝOfJފ+n4Cݬ#75Θ1ch]߽?)S]k Կd.p$b/t+J'?wz]/Q߅tPvϟ`շ앾%!o" Rr[4o替?~F-PYB̨Xbb^{y ?~xVAetnիW_r7ٱcrIҿSNmTM`[lY` ~8p$/ׯ_gΜ"ץyڴim]( ߑpNNNNZreݻw3M6klNY]/R;c[7id|"۾ckԩSqcǎv QH`Fy{6|^f=z4a|Rn\D?|@>|pW۾䇿Җ?{֬Y-_Y2WZr}G%1* R}?pѺ;ؿ!|9ڲӛoH5?7!ǿjժz-Y䯒ҷ,zhnc2W>1T K60o޼&;8?-$s1k%:nfْQ@I Nڼ?d6-p-Ztw*U۵k2h c,WK2?ɭ[n_~YiY& ??n:=i!Yxפ=k}ʈ¡]NuH5{nҒZZ׋)\#]aCK6]wC5CVFє/K˗4ҕŽp-hyIM6U u熜_ ]ʕv]H"*fIE#K7XQKʙ/VZ+[2&dP0Ok=ztWi)o9VI"WZS[n>X?2/Ih~"K,#+bfeYK.k6߬_d(\Ffʔ)ӡTX};$smϓzצMiE٣'zOF+7#ݽ*xX ݙF0ֽH*mF[|D%X4Hw=CvGƺЏwrʚE2[^Z[JjE]w$smz?VHk~^d… ,/qK 5k\7*T͖1MתUkŒ%Kic&HQ:L0ݰaC%˾{P*0\zvm_W⳼رcG geի^|ym~@$M_p!-" [WXQ+cƌ)ڴ :+/~F2p Ь^z:u[1"G/ҧOa}\=t6Uի7$s1ҮdC-f=o-7* yϬYZ4jh,ۣGwucҳA$￿iǎ̙35-|I_R5ִ<w~/>ꫯ>--u/_kZtӦMkSZ5kr=|ޢ`lkY,YӧOo}뭷~#:u*[֬YO_}~?~{HH ɾa &;3Won=%ެ_b1ct @"i<}o]|'rqB IP^z w}<$-/K|C k|Y2.}_yg _ZlrfNkL/_~$relm~g߿P-̓ɖ-)zf!(H΄ :vauˤ<3fjݺ`welÇrZ, J$s1I|+5ۇ~tg nÕ--T>軟~}E#ҕij#-[VGz#y_4kN5%ԲZ"׸<"gfZQ$?Ν;I ۸qcE+_}mV 'ݑIWb3gȝm[qe8yu" EĤE6v#pb\6SL$%K3x… $Hm>]Mu~^5VIB@eCK/=Ͼl#G:Gy=n@>IߣO;=$y,#ڛ}o-]?HzM#wѾ}cɓ'[YI&Νz$Vݹsg } 6ݩSqAUd u]*\Iesy\SN:dm?JƯ8|p^eyhc̙3Yq&:~xNoϞ=E,_jյ+V1cСCiI֯_5[~޼yMҧOAM6Uț7T4$se˖r+W^bնm۩QHvҥu}\=iٛ/_C^z*Uֹ]W@" ,I' e_Hb@>s2o~-+-{. 1ct @H<#$3@Էo!Ц]xҥy?x~nH uQLέ\tvh׮ݔ/ӦnZVbse2[^.\CK(@HbBn=VښW|Bˠ"y9vPl٭gϞͬM`*Uڰ{fO:mt./\ĎE}C2׆ݻLNNNKJJJ9rdwUuٿ *l:rH+7idޜ9sYΜ9ڵ~^Vf̜9Ҳ7sg߰aCEv pļy4klVP:u4N?@"1cF+t޽ >ٲҲXboٲL7.[$#C+n o [tKZ꧉ ̵ASs rNneϓۚo^TR;U Džj5bfeP7odXyhsmzu>} 6OH&͛o/]vy$vTgH"V尲l9NHnMΕdp70;v(emꫯ޷iӦ s>F27?>Gy B*۶m+SjյOjemN@d2etn}\}]'O#Z\wEZӈ#{RY' wƨW^q?\}g̖+W^7f̘.~{A2{P]H"V?F8Ѧ]ҥyhܕ A2@[錤ϴŋׯS21ޙf͚jk^b#Vt̵{#󒒒G]U$A.]Z Sȗ/!VnA>vX+nܻwoaNV?h3f̘@"# P¦C峲D>ʕ+ױ={Ѧ^˂ -/-{e 57nXp{cQ_H$$scUCzH \+wi~ IH`z=l̖E٣/rmF]Ww$smRS$`"۷7"C?l^i۸qyC# a qd.Ę@"ɓ'A*ܬ IꓳsmڬY9į>۫W0\p$be+fɒ͛/^7iӦsE6s+W^fK n4i2O±+ \pЙ3gh[l)geRJX~}Yvn*%Jyĉٳg3W^}M*-?o޼&}7gϞd, ^E2cǎRUTYwԩlVoժՌӧv^eΜƍ+煺MZȑW^BMnd.D \_FX3eʔvPcMHފ+nc d.jT^3Iݺubh'Nбc o߾dd ӦMkbŊZyjZѦMi!IIIɣFfe_X`A/v^@СDjVQNeϟ`շO0c, n!käIwy" ˅ 7nxEXY>wGo^:ݮjԨ*%%R^ѣK.͖Aj֬rҥu3dp>'0wFwHЦ5Xre͌3O ^G2׆#Gvz-mWFvm… Bu&? (p@~U5$sčp"1 XD}< 4Xd|?Pd.ߒD~@p&Oܾ]vSܬݻ0yhsmڬY9Ц{5\n4$s$bNʲ3g>f͚j˗vćMνxb:mzǎTԩS̖>|x/yhM4' X@b" Ξ=z7mT%Jع~ٳg?v$RJ8ydvm̙3YUf˖-̖7o^t]ԿݺuUev*H;w\z} WZ,Yl޼~^;e_Hc >D M2~:Ҳdɒ1HF53t>^mzرt2&۷!2dpޥp\ >}:klNE1ctw@Z$r^"NC;#۷o?{5jZreMj-$sڵk[駟'Fy5u%K3ϼKudpP֭ۨduΗ"+<믿T]?dUVՐN֬YOUD b-[WLm ̵nݺK塺\$sH >@2׆ݻLNNNKJJJ9rdwUuH kt@ bd.\$s8?z]vDիWo lݺե /lٲiv[2eOt8d.D)#oi?ϴK*9sEoh ѐԷoߴg9ɏrlb#G $''ghӦM7]7.￧M7zH.˞={6裏-ZhРA?4]m.\9s@N HL/q#ܺuݺu ۷/pW}ߑ#G]v ^:PZ]͚5XnϞ=i-Y$Xzc=Qi_}U_>}:O㎨vHR?O`ǎi7|3PP!%ud ݻw"I?/ C:AUO p iazW,+?.4i(Zh|ĉ=&?*L˗/<×Ix*U\wXvm`̘1ioVڏ>}x mT~o޼u[w8X B 6i͛7tR/Η/ h"y„ ]{AV/KM/K>.ШQ|Y96M{anK#dp,]b֬YiJ"l֭/͗Ķ>裴v֭[XfM [lAr$s(?/=/^<;w|f?NCzG/TGYf⇩=ztk9ٿCql.G10TO~UXJ}ر@\l?/9_@"kॗ^4oӦM * 8p`Ǵ }СCi\9ouӯ_?r%ףG;3vgH̼i-|7nXȕs>+\I~Zj]VΔ)SΛ H6M:5pŴWS57|s֌FrC쳦-{9qaV~__UVM^ji2IH,+kZ}7 &զn\+mv9Ϭl^zi=bA߅^үyUk\iӦ]dw5D|}\wuA5o$/Ze x8_Cs +`>Si=Wʗ/K3H >@2|d ӦMkbŊZyjZѦM| $sm4iIyIII$sd.\F] q >@2|d.\$sHн{IyIII#G쮪N\6H \Z%e˪>ӴJ$s 2W]%P8F@dH"Ξ=9k֬/\^u]zΈ#S]%K1ŋyؕ>} OΪH $ss2e:w *3g'Na/Aչs2U^}ƍ+ZYL2֭[W%K,gܮΗ^ҰaÅ-j`eN:;vlgd-ZtyZ1}ֱxoS73g>+&Mt*HHǏ)WΌ9r0Kœ$6lPI?]vSNlm۶Vft\I"p{ݮ+_5j`… ,Q:u*6=q;v`3ZK6=f̘.;wzŘ$rG2 Kn[X'O.G%騪^~7eʔv޽{>|x/e;H"{iI/XQ]OS6:L_PĮ$x͖ҥyk׮]Ů?bUW7͛7:Pd.2&to^M6RQUx2lذЦG-)))lYI7h`~- >%R6 &tryI?ʅ گM7nx/rm ]6{WVQE2׆ݻLNNNϓȑ#3K7JR}֭(yhsmڬY9׷H B* pX$[iOp&lٲ:tP>mz̙-]eϟX <_߾}Ģ-ׯ`u[$syBWP¦{lz%Mj*]\TReݙ3g-?pЦ?x[glr<"lRtcUW@l@6שSg~^ʕ׫!hy?[*U ?T+HѾe:IݻǠ>"}yHƆ"鞨lٲ[wQʸ&TmZbuUaU.y7 ̵An u[8){'U[eXRUD3g{)MˏSI,^wFҦ}@ y勞mzڵUUlW_[Xଯ6}C6 D;SRR.5jTde5yhӳgn.-cPMUTYbd.Œ3ZIߪ[n-OBj׮\Ц_H^8zhnKt۶mN2], N!yP<믿:ee[Ο?ݻw͚5X|q^޼y+ Halٲ{ĉ$tGB9r$6-h7o.oԩSNgd-[DC_ -Zt3g;x`lٲҦٖ=ݻwiG @!k@mi#G쮪Nps#G$//sgd< Mf˯]jLiӹs>}Z-R@OΪM^^_LX4:1λ;TQ,?Nɓ'!ʨbح zAOkڴ\Xxq:u,sG-fIߥV%y 'Į$q͖'}g~Rd`o D@~n>MؓAB 7f̘.;wr5*&)G}|Ҧ[l9S'U=Ϻv:8oРAUZ$smR!q%tMFZj{H,C[l.]6=`/r|-HZ>|86|8s̖jС}R[~}egyu\r_bō={|[UZUխU֊CԩӸcvE]x[#Pƙ5jT7e.H*Y1*x"ld4{l$tAU7UZus2iүnҥ(fˏ7<&M̛;wnX@lE"Ag%vݻq9風TR;i9YZ oGm@" $JM?_Zlݺq>;w(Mˏ/^lY͛D\~nذRlNŢG\ƌSSD^dI=9-+wσ}2x~'6iҤ; c\ ҲR>˖-U vҥKϓֹz;w,!,YٲeKbŊr!y D^zK]2H_. WUjT^}u, ^5kӪ@ @ڴi3MxHM77ԏ3gd)^oy2$ܮ'H;fjaeY@x/6]BM7o.ol5Vi+۷o/-JcPMp g 4X.d.yyӦM~r; ]8V]tlycr+VnFXE bKb-_!eg+2d8M˹ۑիqѣ o kCGBwȑU 11Þ."0>Үmor6ݫWÆ -%KUצGMӓMO27TVm:Pd. ]F^"$t M6a+-*UԩS̖>|x/yhm۶:eʔv+$oַO5k6G.r-{]@w.*}Ǣ1ct1ΓUwcǎR_1FB&}@|ڴ[|Ϳ[qNV?R $|[UxFsiBX"-uMi۷lyk׷o!nА-ȑ#y3fjݺte5} vڪy>*[H1`Е+VأGwT ߚ*֮]{3-߯_Ц;u4nرcQW?&y/)))yԨQ̖!KO}…ƪ?L*kx% HDQP^Qk# & eT$+`@0($ I, $~sf-j{+ݺ5=j+\ $mOZ{p $ۡCUxѰaeX"uuk׮vǎ4iROy۴i3gmÈ#y @5i}+Y r)'Zck0^7k 43V+pW"C2 !h2 ϦMVReȈ۷o/c>rH ,_jU=̙jjժd… #^D&~'3Zh1nޯxG"X% u??ӚAUAȟ?+W7OK5j0/{͚5ṷ_$ot2Mj88ug|i. e>n^kk֮Uֺ0'H/_et2H},pSNg2y5_qem=bw+Vx-͛*Y'-8ַO}75ƍY[9R-*bM$s 4BZ>sכI; ]dŮz=n^~l &իĠw2"d^D֭[Wx-ҳoUg_~c I׃>xu@4ua:mԨQ7ȉ<.2$fY -UIRМ:$o +uC\vLdkeJɷm#NШQU :H Ib+-0IG.X+_n~ 6m I];mڴ.NGnDD;.Zݼ2֭[+wq'`M4uZ%~W " (&)o߾"$t{r}ٳgO1im۶vKr\wqK.\x +!y ?\^=tPk_~\…w>Z>u?WE,d.{-j7EwP*btQX=*x-7AZn=/hi7%Kgee6^p ?(oaī3|TN|N)]I'zcXD\ "$eMJ5jVCU\n{4o޼ViR׮ۚ駟N(UNuB,[ydLEZ[>վڜ}%KFҳ`c@%t7lP .UqVL0^hly;M.S5XztIIu>i$`rΜ1cFǰZ>}[ 6>6@%to'ݢ*. NȅpnI6zjAFcH@H]v4^Ϝ9܎;ΰW3s3]Nᐞai{?U HdЕ䑴0`hUqq%IMK.=MF?|p~JkB-di}k>رc+C~.XoO޴iS*UlVid$;w2^EnÆ Y֮իW߰z)8Icҏ?Xx_lժr F+y\a…HqKT H;H͛7W1O' m۶%!UҥwnH[h]xqyO?'|wr^[@Ca D/|u " hfӦMU^}/:u`ҥ}'ٽ?iҤ0^nzF!@E55~޺uk%ip,|}2gϞ&N+8̽ ?|_\@C{-j)^lU 7?,2 ۽?w*TQa$dJ*UzС?;SՐިÈPA.*b5gϞb5jXo@xLZI/<swQbŊ۬Ą>+Y.;sƌÊ[>}[w}T@/$s%tO~D[Uđm^SNޣG)֭;O=A0D=8j=VfΜyXJFN3@2$s]ꪫ^ZիJU<]B'N:k$'oҽ{n۶mg',qOx=p#FB"a1+Uy!95{Ж-[*p ?+):"™gyO5^kf@*v% S$sd3<}6mTJ*UDUܓy ]s=SW|75ue .Yq/i}O?`'mڴc7_||zG2dxqv^{ˬƍwXd.#N>ӫVIZ)Rd؀(m^xݺuR+VZ`kfƍʔ)=X0' C}dC!?ϟ<:X;^ \ f.2 f^hѽdqE;:̥vUlٲyͭu,%VggPV\Y?Paai7^ " -5kȨҽ.md@4hy43@>M0 `pIn.J$kTݼVg. 0Z?Xd.SG O>ltIK]yewd{<:?կ_|X1e=sŋ7%F/& جYK͛7W1O' ]=sgΘ1c1X?2_\:tcذaxݳgIHAZߚDҥKOI&+UUJ7dee#NW_:qMd  m޿1RUL@2r)rW<.t@VҍRWZjo^nI&ZF&={v0b@,Y-[*qYnZ@kNdN{H`޽E͵ 2bj*b쐼%K_n,ZsicURe3 +Wb]2v~Ґn^yO?Cg'`wuW"" dikMٳޛHBYpi2@ubŊYzu]tHJsʳ>O?,y;tsҥwl۶"7#3[Vx 낔StdݰaCΝ;9z1eԩݝK6sI\s\ \WLnJI)snժռ<ذXηcǎ曑 ̚y3:{Xd.aӧOn{a„3%8]d7 @K>֮]{m`$o5_igyy6p#Ftֽ{S'MJFeB'JibE'\ CI};_7*P!ur~Yn]RJ 8T@(s/)4v~v:y?" 4V)Pᓒ%KR=2\Νߓd4ti-`>Df yLGc~=hР fK9s‚ r:N@f;!?9r$ʕ|w'[Ux]~+V85X g HE,d RW8ѣ [o}b͚5uw; x#y fM~H (ڼyso߾"ҽKjr ΐ![:yխ]Zf&M)u6m̞=m2u7~FRS<^5ٯ_ro߾[7:rٻwoQs-!-Ҋ/;[qUq!7@4+W۷1^Et]jU=̙Ƽ msHkN9oͽHd n^y<;묳> #θv_R $o ={Y7j+ӑ $9k&Mn~ZH}ky&uO>9<ڵ??n޳>2elAظܒ%K@<]Bw5t2-YB"y ć f~-5u̓ҘIK+n3^˾x޼yZh1?8>kg믿cqu>}bؽ{SLV:ӧx봻RK{oDzݮ*"y dGyd<2@Z޽'+-[~a6a„޽ztPl__x-rnj7gFĮ$xÈS-jjvߣ"B2@t6O{o~ݴ> 5'ge3eתUkyr#G$+)fnݺH~T}>o&@|پ}k[ 9*Yl%Ue-8W|wYx-uu{Bl̙皏5jXjժzR/1p1#t D7aCy晟}z9)\5ᅲtՑ2m֭a%II *tاTôiӺͿ~;%J.OyKS\_r v{d$v%j71DW&׎;J% t$@ua"eT+\yUWTResVXqj |C"x-T5 |q|} 3,4.o'1$g^GҨ;Y0'|g GyӧCW袋z7/D_$sxrW"hѢ{e0~'Y\5u.L:u?ɼ5zu5jUذa#1Bn*KW/ eSLH|gƾ}>orcW^*r}d.^uAZ HuQ[-s ߣ-nݺ 3~/|<>E-B@^ɮ]JgΜynǎg8]#+uxp^$?\ϸ@໫%yvu\dwG<@(QwjYYYwg|)! n=ܙr'ݾ}YN~lٲkO?,k2WCr< &Zd.\3N;mZ:yr\{EZtMϜz+TǂH~nF2-1`cD~'=D>}r.4h{v1|GG}4iӦ~ '3ꫯEi)u7$zgJb߾};&ȗ// ƍС0rP܊ #G$|(TPgϞnAuXl߀[l;@4uanj<cF= 爐nݺZk^k~ѼtI˗﨟w-`tٖd-UTy}߀[l;@8H源u:nݺUĒ)uXfoiw1Ǐ9@ƍ3$T!-\رcGN"sζJ:E$r%[~?go9ZNtҜawߟ%[X1Hw{pK. ji-=~D%T o-\}s=w1aÆR K%?VZ뼔@=䓷C~+$oo@ljI.r,K;61wD֭ @߀[l;{$s9]B *fwqGbʔ)L۰a1b$$w/^t$OI,[ 2X&M< &$:\:ի3КMoVD꘢LZ56qE2@]D[XTZ~}l׿;dyqbTLr"l~۶m I~hb~~YdIM.ʤUv>Ei/vk֬Mرfw.Քq۷>-[~!ϴօua&MgrO?=k֬YUyر?q$ 9< #mܸu -XjJW)7x㳒5H"iv- ֬YSGE,Q -3O˪)വ[q_0#yL۶mggkkv9|U1A~lZW[g%TĒNBVYl LA2@dWM]ڰcd-'MSe:3\0QvRJ[lR9H޺矟imKmܸŋ7 ;> rNh!8 L@2@dٵ,Xzu]Dڵkk[27*\]0NJ.cΝKZ"H&o37o tԦM9ژ\쫊 ђWk])`[xժU7) W]uQN֯_evdH"HW^yJuYv,Qc-`ª(0} :w}Z$o#es)djk].`mBVz%?Z&{ 7 ⍄.d.HiV"(Ķ̍j2 e%ц W֭fkmֱc: fn[P,h~ֺ(U]`޽EF2XyQn6.d.yW^naUKk Dxu{]tf}(@k]OZUC,X[RfNej+7h-Z4;QNZ閘jԨ3t4#"+|:-Y}L& niK2 ee@B6zZj5/[+GULK^u삱ߴiS*UlV'# Ys ϒS^#=d+ t"eɗMWުcdް]B\y5u+Wߞv|2 ֹY[y5.4mt… O9臄.t@22v- -ZTE,q"--1OМ|K.ZJ[JZO>94?M6]dwl]UBVR[W.e4cߟt'g@J]tEoEZ3<8F:H"H#(ϝ:un&M,/xJֲYKubT3&O|W\}uy晛=\IVdf͚^! esBr~_;fWsB NA҆>dСX1Ik۶?d5nܸ벍 .Zd SJHb:ߛoyqxQ'V+Woܨ'9;($ۏ1Ƅ zkHH\8ʁ1Y\dVF\0cՕ~6l}ֺfDظqc#Ӌ]0J/H[Zy7֕IׯR~޿"E쓟%;$]d^PEa?m?3'rD9![z FBVO>P'C .IHBٺ/ >~8B ?? _I 8pd#Nn槳lNVs{w} aŨZZ7vE]$K*T耪A2@(.]zZzv6o\Ds\pnݺ/_$VW9$`rPvzM"M$oK2/U"[ny2Șlɾ(Qv|sZ 4h89r@s27/~Y$rSKJJW;Š w斷@Ԑ z^i G x gp"礥Qz9kSΚΝ;oHWN 县 %y޽Tȶd'xV- 5i1-Byֵw@J)32y'7%AFL:[jU=U^+i(C"QF2@hٞO˔.]zG1ō$ZJNPŒ+.ֺvv$"ի*|>Kyf;o~V^AZfMyNhժռ>gرZZٍ,and/s2f!ϟ"նs]?`aƤ+i]/79ɠb^f̘Q8 "46BԐ>}K>wy)<]H#N+]!/-BvYUW]+re:-Ln$^ s綶Svѣ>#CH"Lr?%J].$;wَ3OXⶭ[VRa>~8IwynڴjA+ѸG#x1d.Pɨ2\l_rc3I@gd0#&J2饗^ǥJ)'Rgј~nݺaYQpy^KDC^%鶬ʜtelrYZM#zJnPIxͶ']#Ƞs9#;ٮ]>3UDŽE2SO VAZ8h^|A cJ$Ru7mժU7c\rrqd^I3`L+Nu:kv_>ٯ/{i"?i)t~HUJ]RϏG!Ix_vnUoOIw=?<:B\߶mVO.ڝuYz~Z֖y;vTLq:$3-TJ79uaT42@Q)IHyly cO?PB YFSFWIzI''҉ w[΢tM-a)irrc)L˶$%,Y2j:M{w7cJnѢ|W9bĈAN^ w.dL$s&r"NZO%nbF냊 238er*J\ѴiE`V[raJs$9N27J\!ɼQk]n J\!9)zކd>3kge4$vu4u1I%spΝ^~ew̴tⷻ0ٳg;c^g}LvA嗻tMQ]t%[+-(|}СiG7h o*m>?ÇDiFoF駟>=?"e2e$y2}o_WױZ-ðaW_=}>ײ-ٳ'}&czTROks%{1>/[.u=x㍉[o/O6g^.NK?y\tvH}X9%K?XqE2g~11tkvw>!j]mem^'GKanmJKmA:{;68,*^[q_Fmֽk˹3A'{\cFN*3_g,XcTW>_è\$m \Mm8uxPu9qwtZ':|E2dﷵf¾Gd݌2 Qf!7!a/ NێJq\M~Dn^xq<:tumn&>e>DLL1yYA,>_e|me暖ζVNێJq_g$s5G疹YP# z*<&T@utی^z{x<'* V:e\'*[fmmN8} ֽNTn;^z EA:#)ݻfj2 2 (ÉƑ#GrMat?VL~qlat?|]i{^X2aPy2 Pf!ZX:yHj*'KVO5{:xaOkt_ qvx>9ːzo,u{Hq< h-s"8~qt2 :]ԫep !ǪLa[׋8ojѭ{ ?郦}-s3\McJAcDA;:!86i勯kLA+-pao{Beñ*ekvqUY 8Ws/Ò9 qdpm_2_[i=:,C#^ێw/[s52)9 .~G'$scD/.}q,CB%t_ ^k]GAYCr"76YP#e>S~cmX2<T_g$scD/~ /'Yp/GrI@mw[7\ػ ~e}O{X̂ՉC"Jv]uyNn*Ȥ-!#|q3YPG x, q!7̂qH y19],8QdKq8Iuez- w *asȑ\2mWE2 'sBtaGg3pqItI.~{~XQH ;^?,AamCWyw=k-iۿ*^=tuOĄ 9q(P Sh[X_cT붣{N ސuI $"'q*+85CB'.pz#I_kRf,{p|c>ݽ!jl>Ӯ9ZdKqt=I][w*$s{l?}#C2 UnL~}"hijQfLv6_C@Hd)P@թIjbE.@v,:/ I(е̂-s㘘C27ˠjQf=sA);xO1bt/S@wtn\ػG--Q2/}ʑ.H5]oZ%[qhժ*Yȍ2 y=aign;cf6.zgеAT鐜"!Q_(a]nf>|8oO&[8, Y-^qgf .=D70=ˉF7軯>׮]kѣGu?L`Fܨl3***~lZFev7uXݿ퍤,ۛ~įFR=6|xׯwcvqϟwq=g2+ K׆:wu,ZL9\cA .7oשS'1}DÆ {}s/_@b6sJnID-KbѢE?8qw=$&Lssyʕ|Iδ/e˖<DrR~dnTf~oۼ:lQv ݿBePyFR=VN{^zc2(Py$߮]D߾}Kp 9:/rQۤb!]Q_aqÏu\*e292!뒗&UT{9_^z%>cLKW(\ZjI-F_N0JSB8?쳜u.w1ӝ|a}g.|etx)rGw* ˠrW]fAz֫ sҍ߮@:Xtxʶ#YZq)S&u,mޮyXj:wı*qI 9stI.9=L81ai+iؽ{w-ŋ%Kt)TM&~<;VҍTRuOm&LP|]tvt^ D-n3 . aT=V֑<ϷnNa.C:Ӷ]A׸&' Vaůn@ 69/$"eq (-C:t?Wu ֽw6 vۼHQ_<\ܞhȅ T6~ۻ3fȹm۶DŊ+0<@/9AteIɉ:rϴm텽eú2X{Q:}t]-_̂׸ⶥ2#*8l;kwGeign; \t}5̂/~ZW]vyγlٲDѢE:ŋ}/Vu˗/y_u 09EiuuݧVIWTq8ZO2Xb<瑗(Y#n\^=z4x4=׆׻ :/pR{/n;=ߒO=[nI-[TTV/_vӽ0L;˗;rŏB^ugGܪqDaU6.СC7[QZLms ep{=m-s/.[]׻WQ봿y{\Wy rAAeKnw|M΅ @_|?ⷻ5vJj9;@JFewˏUhg mǯQnUwrm`yþ^X{֩x*eYYY Hn u;V6^UsL:='oϸ'uU~/se]v%{ڵk7tqHz뭁.T5dcÆ 91cd6y䜚O_~ykI*US~cLPܶR6{]vgNEaW]9NU/ۓ(}ou?޺}A{?mX(jv-9$6momvG~q^ݿnX^z yǺWYf! ێt/ߒ~J~}k>笳J|aDڵ͚5]_e2K.I{svfu֕u|As֬Y9E̓]X w.ݶ6VP|XQuTU̍V[QxԾGu0^z Ea/x$>(yc=}/!|?ۄe\w6m>,~{UE;Nz qc/mGs A,ʃ:A\ꊲqƜ"7oYmbȉ:9au.dݦ D#ê0y7]!۠{ĉ'}x>_8,]oE]d'KeZRKw '}~08 uVTt?G$s]rӭ_~.2rM=`n^N6Ruϐn]w[oI2 am3*͇27 ۼ}2 Qު~T#~7qÏnq8ω24h gT*T;wn|o/nˠ?ֻ_jnk,/Z\7\tPW~ܽtŏB^@EuϼDuL'ݏmFy'yNEaycuu50 8,UX#{I Gids]Gg;~7 ۼe.|upRP>_|GΫߏvQ onm׺nNP7ޣݯtI.y '$*Wo]Ñ#Gr +~U]Q<cǎ9Aӻ^rvjA{(}O*~oX&' nHRkԩM NֻqEe{RPۼH^3<)s='oH䥮gu]5?jꫯNm(1cFݳm۶%*VgsrWm>oRQmn(-"'T:ު*]vM7h"ןbG~q GqqvK~ltk;m>cm>aL?Ϸ58\tɔk}A;Ӯ{QBhɨmMԶT߄]f!j?D=N[1 xu{㖝^Z檼>q9^!ۼD27uvx<>j !).9gϞ=F%\ҽ{{iŏbtEej֬S<yFJ9-R_gqFN7 &x3'Al3^+|:]hͧ&n)X0WY@}~m;" w}ܐOJ[ZkNlٲ%e^l;aF:e qZ\~x kgµm: e랓s$s}d֭[γ//KٲesnN;Q[L9W6=ܢx)ۨ]$s}d衇W^yebʼn&M{iq7&'nv_(ƟnN:%֮]۷o7݁dz6m+wDP\,m&(AQSM *~qGy'݁t xi8,~zbҥiԒxIN8]a톮mn?m??_:c'9q\\}[hg+3R+W.{ķ~{{~ad /_`O+I;PŸRJ9rlΝ'T t,+3ѱccZʉߟS_~A8=؅%|:'Qu-_XC+mGd¾'m&a뮻۶m3=z$Zڵ+/'{챜ײ{I?2 vam'j]m"kL_rsRpd}m"˗]eʔITR%'juO7.ߗJ˝q>?S;~w_IFvpa&@KN<9=Ÿ́-j|ݼ*y辿![ /Qf! A&U n3enfds.N!DLHȥCWu I9LG2G|s xie&tU5nn7'ٿkER5 '{hdm8 2 T.Ñ#GB;ASX=:,CYf!8q/2 Hq\ ݛ"*pR-j' ,EAOıt_ -~bX|.rwJ޺wk'|*/=atުva^cXq\ ޤ=~Q{ 'no:\G:m;*龿*,xQ(9r$iȟ?梺w8HRs8鐐\ͽ uҽ s:sݐՐMڃJ/gV:t{L/eR3 /r݁!,pa^=}s5![UVY?tH\7$s5]w_UvrakyTth)UlöejF;^e?3p{27|]բ@ךY{J'_=~8Hdt6[nq¶ʛ~Yia\77:c<*QNJyN[߉CU+]{[N4  !ǪLa[w;级83۰*qv^ˤcJA/êZ|ݑՐw_?ܪ-su=:,CL>l[nƹ{tU)st \ K^ֽʃL?ѰC=t_ qv!{x} ܺm&uVm'7z d5;t(w)w;!G暦{v]׵f (^!鲿IEeöþ'7-Vty~oi< R;*˩%:{=ֽHQI̍L:`6;ލCvT@NJa7j}W/bR}On:{}>5s`QG׸Se 9pUdnL.eDCvt,>k@ pa\.r̂qfġuۿq˱6<7sr<'t_7$sc"8KYPkW8h5R, *atm,C 8 x3! ]kQ쁔?#NUyk,sun# >)[A$ueP!'$rSyx8t f.OpuXL/-5{yNTv;1A27^F6?tP;:,8P'u8, $s k@,03|o)]wsݶ;:,CQ=sr̂{ǯ1iݞU! gFX(E*qM ?u([?a2N|ݓ\cF (pHu d v-,uBb=[ơ";kc\9]9#@q2 j2-ۏ; ~X2 ~V$J+=~ȡ̂{ Gwvː"5)ľ'~Y`dsgƳ*m;vtXL?Wcin;ٿkEt&ӿd qt_%,DfnPr#@P],Jm<[۶cGe2 QK՜uH+.~c`t-d.]&uvQeP!=9kZw? 'j:2 ѡaH vJ }{*z5nݻu x,CT谿Km{ם1Kejnt=K&܄C+8, ʍ2 q\t}t5yTY=^7De^t)bWO'~wޙ8Y ]u?WqX( T ,}o'U #>uAq<`;kֽ n趿}%/8O|rK}{~_ S?љ8&&D&\ !eP~Xd t?jt &N(.ÇT2}cEDt8K&\ ~]aT̂:qy~yn('(\c+.~JF6eԝP ˠV {󻅫::'{"[vqϟ_E(UcZuuy{\c+.~/thqCu'v>$iUe{+t_{tw Wj溧yN^Nd]62ĹO; O.V\Qpf̙3ߎؽ\ۏ2 l3v/"^mnۙ>}zCvod#7ˢzv~Z-.[m?v ׽e?ptv-[ͶHPbmcONu qk%Kr:L ~VAu5k~:/҉_mG e˖Uu ^/_g1x! ;w,:I'U:16 6?TۙuGQj6:7Ns6/9~)0(Qw1xy9)xG2ׅ /moOܺf͚::bs/~ /pw;J[糛/͛/p:'?~>AƖ={Nj۶t~~8QZ q%-/JC)t~Oܹs[O0wP9!L߾}Own߱iӦB :t#nN|d6o\%e8&e~v^y+?ӳ/K/;H)Oᥗ^??3؜ѣǔs9t~g dw>2+7L7&~ѢEMǎOe]ƍ/s:g1Z:ގ7tȹNPq9!ۻln~W_tƌ+]v}K.7x۷3nm+r>qС@.ɯNm֬Wex&2mŭ-L"^CժU7hժ)]w`:#$~nd *6'.袷:uA:#'G/9aS)V9Ie˖55j Aŗ ,L:#yTڵת!S[o}Bu ^HbCu nIB]H׵^}CunH]unnz|qմiEG:tk+V:$"qx!IEyÍ2el$8ܐ$h߾,y krCkٲk:tYf_ o$r\>}ݶm[E>Ur-I ?~>\4IΝ;שSN>KrRJ[ÇVw.~]w=8iҤ~'oIL# ?i-NkYIVP~D? #xUWK /p? oA|FrQccWH}cqKnn5qD.@f{_{e;|}iڨQGsEu%ƍ[o}K/}]^Κ5kt}kgȑ#&緐믿91x[g?7?cK+hYd+K/]_RG[Ϟ='9m!o3gNIʺGT#-x׭[WK֍ZVF<~)rcw2]}/I|7.~!mK+\?yo |gd2ռ/i0N{ɒ%Yj2>]v`OZf+-_|k$,9 70y QT{Hs̘11jמuY[uBnyw&[ ,7VN糅A=I:_JL6\^URr\YGÆ Ovȼ2|իW f)a~bŊ۬k3I[M6]$u|AF57K"QSL!e^w^:䨬Wiqjml7]#+IRJ4_<M3D?~<ەiFܺ 䳍$<*T1mʕ%y-c)$+[ouln-aM IJ"WF&pHZ[IbTcǎ' ]ۡC%I'ɺT_L*gc5I˳Bhڲe/̿gWHZ(PP׿ߩb53ZL^.]4yKlIJۻ'g$-t$H [VRL5QVj:IK\yf$^|1SO]!v%++<n[e;FBm۶~@# )`HZ͛7W6ɼve`.kSF`$@̚5k=) M?UfFKy+yGSlY,#ϛ9s|q,%>3<6j͚ <)y~.sZfF ոYRCݶ?\r[Y 'I;<8\4-ӵiӦPVFkdqLBVlRr:RJX?kȑ.(F kϯy?k֬n:ʗ/ػwoQy~7/5FIs:%5t Fb(!-u*n[:̝;w~OJeK_u53@ppD.@*V޽Sر T PiMb5y0ɂl/y晛K}\뮻n<́ԬYR>Bsa-aͫ Y:ۖĵK۵<6駟NK. D.@Zfٮ{F9Ur瞻^˖-=LBϞ='ɳ %FY}ȳ ,eN@].\xzXܐN=>7nD֏BV|^g?IM2 6fnk(,>c4a # Hum%sOTe+yy \4HdWCZ`2dts޽Cjժ./[ar : FWڵkO?,ye=II-j*39sHM4YjYzR Հhbܹ9UKbQɠhN?[Z+W) e!N]JNCwf{Hi 2؅^yڠAF/5<0m֖FRUVՓgI`JK˦M.2ڵNd!Ov-<+`nݺƎO/袷t?[Z0$Q~7>+D kY,R>6uvJ7F<6O$]2`et6'Īᣏ>:I2Z-u%+ ofzV%7mKHyl?I_yȴnqȍdۡ ,# $HDy8#F ySZ2) ]qmذzj6Rcv̘1yѢWV^DZ7/Çb~m<3gN?2޽{OR=x` #?I;ݖ@HjओN^C G^ @ѢEʳ1ߌAr ߫]ڣG #J*mVi͍~1J7^n˖-0>|8ϿcXrel+K.#[ F:>s9͛dee>3_˖)SfѣHk?5j<0`5\1SNkvի{Suv{lj8sgk* ȟ?5kɶlٲZ'o'|wN6YK_vMfʔ)= ,xMؕ0O+`;۶mV ]$r5bԕ9rgy&i۾}Y&MY||$2~+Tرc}ٟ?Vƕ+Wv\Iz+·;@Hjh#N:},1*a-Ovj~ie53tE""D.D\8q$r H@đ#uYg}GS@CcR!iӦ  ]D\f͚^ZuH.T# 8d$tk֬ڵkk˗HihӦ͜ٳgU2 \PDB۷UhѽTʕw.j ]{/Cu>,KQB"0! (" $H H"H"cm޼'H@đ# G""D.D\z衇ܼysqnTRew8_~)W_5[xqޱcG={N4h@ȍ|5j cǎ3fΜyѣG/k]Mַ<_xo?ˋ/x_˴.3 ڌcAΥ}mذÇ7]tV\HF1M7^bO>9}N8ᄟuγ>{cB0?|aqpfڵ۵kُ?XAu,cȍ F)e˖U1=~S%K4N3/[f{l3fL={_^xZ?u>t9|͋lM74~ΝߓM6]4rȁgqƗ믿~<..W/^5kL4kLu@JZoFuҔnW u<*Vt;ڴi3'E"7dp4I\1MZ-} 2<ΝۺUVmڴjj6%ft^gIg̘1G̿lÆ DL05\yN5ӧO tc[do 6N^K<%͛7O<RIUR_vrիWaG"7b$j~ݬY(Ī<ׯ_1Xb{yѢEM4iX~>|pVnzTZu1MJS$޽{lʳLȕĕl1}eլp Iد]ZGcYNjO'H:˔-[WyHn \sMnGf3n҂2Y"wѢEMU=X^xk%w9|d|A-[OtsyZzV1zYfi"O,u~1}1(ϓmEjI+ 43F/|i-IhQ.i!Vp~2Hۭנ̚5$:M B v֮F7y66E]xqF̚lիDI6jkIJ+O7˔w<1Z^ߍoi)дiE~s饗nJZc/|!|'5f~/hPHX 3zJ\kz-[PY^>[VTnؽgϞbn>$_}U3Ic"Iɓ'_.%*dرcɳt7+ VO֙t7?w z/jIJ+[y%gy&GJԩSK+p 7͂ e"̯jٷnZɜ ;6.թSg.'N% 6TdB˳ t7>{I'}/%*Xݶ%+1%={v[y-qyE+|EyF瞻.˗7%K4][ouVԨQc<ؽ/-eHim]w8DqG^dU+m?hHx$\N<>s^ ڬn>W_B?3۶m;_|K;v!R}Ȑ!KZ 2sKXȺ$ˌİ| x5~>v|'Id MwdI )<۷{ʕ+o *tI47 UD.О1S$#Yn?c׮]%YFuLĀ6YYYe$PY\^cϒDܸqc5`fyDnP֘8=䓿flFa34]=YG+^xAgO?=+ۧkN冀ut'pOy},;\MF=}!/;ƹs1y=1.]4??OFGe2ӧxIUTiu àI"Po{TnN>#vJ{i(ɯ{Qkigw*-Ԯ]{mĕwEjkvuyERvJ RV>Si++4o|6m̑ϖȑ#֭e+ϨHlڽ'5|ՔAdK)H%&fI=NVF m۶YRkLaÆݗ,+IN:}gSM ߑDuحۀVײ}8pP$+O<ᅯjhժռ~By8; $rR~ dd<:5ի`˖-S߻w 0ODm6СCI6Ν;KՋt?Ң;g $ Egs7 N7o^+1ĩ\BȳtW _$r+Y,5IU?$rk5jHT^=1cƌ<;_+$ZhTx?IWPB֬YSGuL'v[ƍKt=*#.ܠAo$F5x*cƌїѥKĪUׯWnj\\rAhN6lˆ+d]YYYJň#W]u1&MZWUJ.: Eɒ%szE]8p@n!W"Wj/>]v߹K['$>c[re㎳ߐFu^<ͮFQ;L'9r$QnݜfW_}1-%>rȔQj so.СCs7_|I-_|{IuY'̙3۷O̚5w$3>ڻ֭ jrR{9~-qW&z衜^x1תU+yȐ!9}%^|ĨQ"Qzz E@y&Gٲe-TЁ˗7UVDnj֬W޻뮻|3hҥ~ >hݻO2eJ3fLSI& $<{Dz 'J"VXquZb޽xSvѣǔo$ )_rص$ׯ_g%kz뭷<~ᜇx:th#/:uyhѢqƥ{Q%7/T^w-gDzh>wP={$zÊ@IkiӦuq2oB,_AZ'vCشiSܷo_TO4<ڴi3GZ'g_}U31r# lժռp2ɒ%wmذzٲe :6 ΪVi޽Eײk^}23gN|D… O:V*U:MC}*] &,D\(԰aek׮d*Ul^jU"E :6 MI5h`7|S3R@$r|'Ԥ\=s{;v(ݭ[w/?6mQF_)D.ɮ]J֩Sg?p"vѢEMicݺu9e˖_,Xy4CѢEJ"XnȔ)Sf{X:)QsGk^9eʔw} A@ D.@ozꭒN' _!?;[-y%+`[]fo‰̙3Ͻ;~G\і-[ְI&>dݻOk |nWyիD,ռRADԼn֬WD C\roŪF"&ի몎o_~^{2Gu,%Қ39bĈAA't6l} ͛7_ ?; 8oq4f̘zw۶m6l'%z*IdVg sI'}o7 'G#-۷o?kɒ%ehbuM6Umjܹ-mטs^>D/M t `Ik#Gt2H}N˖-:.;sgJo)98ʹie!9ߕVa \ꫯ^QDߍ/5VLy5\y$Ra-?`5I7s ,+wU'UHY7ϓ?pZ=s-c:m˺,e=7^pڵB ?ctCժUۘ'3u.$k0ON,Kb˗9[yy- IZ&ָ7vܸq%z?&*][nTr-O?͒LL߹sg)&rѣǔSvw2|o-[ְvk zrCYzmܸZW߿p<${cgS~*UVd}iEk]ltyr~dСM.z>]EkLoժ}nzjfj/t-bRskI+77{:u1JEjbˍd7d6Aߞ"sM5f(R>IKҥK+VH5ŰUgRm"Wrl={sA=}|Fؤ<35iR`tW+-#W^}m-ܮ:TY/ܑOػwoQ'K it\AZ~Wg9IC $e N ȅ'N:HU2r,2pt7Z{JK^zMwln &hb5/5׌u"Wsi?I ;YR@F;ڰaCu,Iu:0 /_@jSEZ] @|9TJiSN9[IgȸD 2 \hW_B?3۶m;n].>;c1Qv饗O*^/7[ҒWCs/uz2=3?w:~18"Ʋ<ÇWn:ed\s#H"PQ/]Ԓk׮\l_54IHbVJ9djLܹ{^?N)<7]ZZ'ϒLVr"7^"cZ/@IKnݺt~cCy䑡1bĠ?>l„ Uo#@IG}oҚR f%I+VD,-)%Au;0`믔;vti?ӳ$(ˤY>馛Oζt?L0ȼ2[TPG<2*$L۷o?륗^Z:ZJo}/e]JIǎOZJCߗ2}}oۣRS 3{s^A SwcSO 4hЈ c3CZ{B^<$!C#'P蒇ߓzٖKmSce]ɓ/%a&-˚Um>}Ɵ}ٟs$Ah % Yc?pbf̓$n5'etcIhK:XP˫v5_Ӥn1Y^\H뒹s6W^c#Y%[ti^Fz^8ִÆ SLѽ{AH+[y8A 1pҪ7@EZˮu7o^t֩"' dص~4ҲNgmܸZrl7ݏ~u.$1d>;-ZhI{3&RQEEE'N\RQ٨9sT9D.$!!!wzzt?w7-))4xͿկS'F}O?oNƍ/isYf=zĬ"o{W7p)EY򽫃^g>ܹ~>j:z뭷ԿիWk?qzm_:uo_ߵkW /Vhj3h 3kMݦN:7>%oF8:?ڻwo_~xwM:@z͊x\TMgٳg)1ex#׮];Rkc;۾cǎϟ?LI`V׿w֭[>SoڏUj{l/^xJVAН}6lvnر+Fe;]-T_?|w4hР-Ǐog… MMt߿w~UCDDDfպ3V79~}oV^C YT={vZ'Oys/((s%,Y2ՍHc uցkժuK߾}ZYZuM6-WI{%?ť84cӭZlyĉJ6jKϜ9ӲUV5~[ƍu5LIlIܳg϶h޼9[f}'kඏu򞕕N"wU+Wc9_)15kּm߯S w]?KIɓ'/*,,[ոOݼyСC7n۶;۶m{bΝ͚5;/w.oЦM:'|r}?pF7uNΛ! 'qeժUaJ~%''oĕT%r51?G$QLDk9գ}P3:G}DWu"H~?퓸ҠAÆ >?㏿jQB3$ܷo_}0;[]lDo$r+zm[iuȵߑʭ[>絔ѝ9 ҆d*x6ʱOӟ7{:`b{vgJMܹalٲeVH«{w{GU+77wژ1cVJ8KjVq#)5x≷Uz;fiefJ5ig=yyyzԬ#F+3X_UY?9>.܉%K.&ۍ3q5^}8XqqqYVt{Np֍p= (7'JP$rQmlɁ'.)G-r5TKR-Uw]Q\ՌUb*6c?~meO?O_S{]7fu\Ұ:_QTTT i?|ywz2 &,܊+V嵍xwङY9swHYY":6 `̙3SST4^XzΎkGE"[rͰ}l^qE_?c#GtLK[]JKfƎ>,mѢE+e`KzcНȶƚڮ %UF.:Y4ib[fPWٸqPh7oTfȅ UV?骼f*匶|ê6`YXOOOOҬ-onԩ{|5W?_%l~zРA[<}͊(Q;dUS;*YJQkiVb^p-_|7Ϳlmjذ=^S>o??[_נߑ C M2eU+T}]>nͬҥ!mF+f\@p{+6XHZi}_7Jo*fSk?fΝJ)Ae?h|Jk/3ƶ[iiiZjRHMO[VW•\zh[T-׮y>l(INTc^W֮];R?mle*h_~2/fgl3w䌒Ѯd{TC=}mߦv.]cǎ/s*N D{QfLߥcn[C]7 ըuHcAάSNvotd;3*_ʼfV6Jp:ws5^J`;[_o*g={,5~%}}FjYf9GPUeTEe2* ή6Iy mMpH9n2kxstf HζСC]@L*pgV@رf{;.ի3MCCCw?x(<|;5JjCAoLxf:tmqG+}25kvެX$r-R͜y~\gD%ɓmU3V@uSrֶ$""pѢEƫ4V(U!;v{Ԇdׯ_x60Bl ͮDMhe9QH#-[6^Aeurrrfx;.أ`4VMUOw̉C"T'ͦww|BBBfFFF7c":T&555*X~6=ػޣJtvݾ}{?og͛4h;_ _?3PU$~fLTKqMc8P9$rl iӦZ' aƍCIE%?бJݕ&:*lB5YN-A{Q M.M$Xt鄉'.h2e͝;7ތG$r2wvYիW1b:o76ܺu@+--5ʊS:ujf'D.<>]t9jm}/8U \ζ6GumulK̚5k+vɭ]v|ͧoy׮]}TlG?iSۿ=z﫨s皷k7:~k۷ow}sلc_gqUwT?4#`;c5jtY;w>0\糡;/\h:hkV:UJ5jJ`yݺuo8eJ~gϞmq=|ĩO<۶o߮iK.I?uǎTW:TdN>jȐ!~q+!Y]ߧ"whٲ=_xg^ ~LKKKvdj_ziu޽w]X*;6z=zu֍pg|6mNܹ3yy]x61>zhEEEJj?m4V$rQiZ[^zǭZ:$Oy^|{W}JV8p[Zn=o' mCuJ{O祈5uϞ=m۶'<ʦ`ݻwozޣF+W4lРU[ُ=vX{6mz!///W^{l?m`=wg*˗oÇ;3gϞ{Դ~׼I&NT)Fl2N:7uAÆ +D.*z|79\d̾ϖ%)/̾oʕc踴?|Pˎk3>͈+Ӧ:^]J~vԩ>[Y*{F%|ڵkGrtm۶z Z1g4^tMD;v9HR>{R NquePJ^ښsZ٬F߷:?9M2e;D@u}/W6o[nժ5,Nl_jѢYo`Kĺ|U]0-vvv;#O@ Q#GuKLL̼ގ @0zLLLL0`*k;vfUHRUJ\xJYO턫[ l4Kf$qEQ3tj4VÔ1b:-ǶNn+zw;ww|BBB6(fL*CTYi4GڸXJO6-`>|;|^/Cme9[2^fkث2qm4_'=}]6%S`u֧͊6EJ5_?VUKe~G@iccc>~nEUAI5_A"bPw}L եǮ=i榾e˖gʷ?yFjr6{Dgی:<#yDec9m0VE=3fJ=>36U{kWZae6;SQe?,twgggΘ1#Nj!To>***:*lBx\T޽{{[nĤ}_) dO]t9@t^:ǎk 7W\ih4^|MdM0+N\@й}vMՐ/wbDj-z;6Py*gZS]EEEJ*nݺk.5+V:ŝ*%R\\<~׼:^;zh&SV7bƫ4*9mlܰa+f @eSNvga6]vjz;6P1J6N^bXڷQFVW3|͊w[*逸zS8gڵkQM0',_|O>}~nn4*СCJkn)#iӦZ5m8jԨ5nݪxm3q&$&&fdff&Ui}%U[ߜ(pD. `FL2e2322-:T&555hJ3;vGEFF.0'JD.i6mlllSRRRuŐ{ߔMJJJh|TTTӓ4D.o{e;cƌ/j ,%kCwBc)$TJaҥ&N:QT,$r~#>>~nVVV;ck֬y{ŊcGq1a„JnڴiȈ#Uy6NSӦض 2S[^[lԻwގ !Cl*--}vʕFsssըQNxxxf' x۷o.ѫWVZ޹sgh˖-x;6h|QQQJ[nDZn+ 7n8pݻwvg|hРUoWӦM/:uU e׮]}ƫ4CڵKuv`۶m9WT\O,=z;sLKw:tڵkG2nݺ7 HutzhժUaF8ЭaÆW޻woO"2+V@`! .nTwի O9 T>aʕcܝziݺuSJ>}v) PXbƍCGmbbbv\`H=ʊ3 ;k֬y{V%ߑJi'N ތ :̝;7^2)Fc1cVy~~~f%_"77w;>%%%UA^ +^7݌NJJJh|TTTzD"gϞmעEV .`@HLLPsJ3qC \lcv,"U,)ǒBMkFwKLJS{$rʝM>l &,UBM_333 $rBi 3nݺ7l2O>:tֿmW^m`4~޼y1jEkVB"1(;vUV3iӦ۳UV֭ہ+W4pB=z;sLKEEE5jԸDڵkG֪UYG"7ԫWcӧ[Y uƍ ڲk׮>Eʶm7hષc7٭2c 8pݻ{Wiڵkv}qqα 8?ol6yEd?bU<fs7 iݺu#-P1ҍ۷oԪիW6 6N;w u17 p 2QQQ;w|Lg[FJT]Lx1$yt=)))sXz!tG׿՘yj-Z8/?WI`3`w/lӓ3 \LMtccc+1j܈E"7=쳿Q$j4ٳ-4V;Ν;5!osgi=ͲU+,,2eŠOXH1cƬTBs·0fodff&3V/_>Nގ (Ե݆ 5jME\PM05׬8#rwޞ;ݝ>}i[͛7@6l؆޿m׮]o4^{)p)f <BϞ=ꀯR _w͚5 @if㗭Xb;4irqΝ۷?ݻwNj3 ZDڵkG֬YYC"_V^=ZϏ=aٳ:6qF!ClڱcG_wwm7lc9Zn}̙3-_^O>:hJ3ԪUV=_5b#1C:t8?fu,s&}ݡ1<nر+જkJ V-&&ff':c5ئN:77oS"##x3&pF"ڿcҥ+CeΝoV \rg7X5k^z#Fv\P &,}vͭ[6l؆R|;{WKׯ۱@ukܸ񥒒N;dȐMZah4~˖-ԩsS={ҪDb?Hz@w**l'OѲs5wgj߮Yfcoݶm[=?~˗3 J7i;v9$rT}0`@k3B{q[:~y'*@ Zlx=ŋt7o2 D PmTiȑkݝ3/''gYf.3_G)]%&&fdff&Uis%ǍU"$r8ŋOhf%EEE U{_l"U$k"ʤT4^8ӦM˭h|ݺuoP,$r|ʼn'?uEt9666MKKK9s未E@\fK?ӧO$u6'x[]v=XkF *$r=-:j{3ϼ^qRRR:P"զ2r 8eQdj)))Jwy\i!D./iѢY>mK&''͙3g#݋\koӱFȖ.]:aĉK* jJϝ;7G?W^y[֟{{Q0\_ܹs aƍCy5k^jU6=wf2` &,UBw˖-0 j>׻wݬ.\|}7r9wջk׮>]t9T`Zryf0hР-7oެsرU{ʕ6?+S`Bn߾]s̘1+=֭[ڹsgcIfJ2`|r/6۷Gv+QX&[1.Bj׮]ZٯѣǾ׿捘Y&M\ކ ^v\ wuFTk*;8+ٸ_VF; ~MF.Hsfuc+u{ۦMވh&>n:ϵ:@elݺuo~gwձ~J4|8RB:ժU+dΝ_]_B֯_Ҵi/U^?*F"rHzFwܹc--Xn̙叶R1:Ptڵ!͛7Ҙg}tر!o>uvlٲ/>Awʅ"՞b҅fOٟŋ'i.JzQ ! 4p=%K&OͤudK:&JVlݺ5~7 կ~U?:w1/!!<^Wk.SWc;}tyWܹsB5D.P(Z¬vmӿtQ*}QEh3O?GDQbbbfAZjQ* ,(*//9^@0x{.]?ꆟQ"+78Þ R1v_y݈/ulQ"R"2trĉ!oTʕ+叏?ێI\]<V$rٖd ҝF]jhjj˯l#gϞ-4:ػChtazD5k5^}ځ;vL*m'&6$ZJU/%KJ}TIWJ0XwyQ7o~iѣG~ G;v,TYDfT\DjҤ1D.!2Q;$Z&itaZ[#FT!/.FJ5M>Tlwm' u*?X8^r`H~ԧ:Ů5lmƌx5k}Wm'~Q" & D.%K?c_էy"mIjٖXIy䑐>|ُ{_;u7 R/xU$֭[y.5Q3  $rhQIJJ紋hlO/LmTWPç^O=Tsxj3<{n&/ X\t碢BCΜ9ҲeK^7( /^iF7P333C]V> QFNŅdee,[,d&G l5ڴirVźukƆܸq#d޼y!M_2lذ 6N*͝;7$>>>w/廸(K 6nX󪑫Dj!;w.;rt SސXUrYhvFmV9-ZXfVPvp\Ch y.\0dʔ) VmԪԷw/qrv rQF?F./-L#@pxK+VHN }Tg֬Y7"##Z4hPH^^Wƨ˟ͶWv$rTtPukutqjړx^*KwMݍ_KF xi%q~߾}JfϞ]ތu]._Y"w6y H# >D.8H# >D.8H# >D̙3ӱo̙s@#4>D.8H#끈BcD.8H# >D.8H# >D.8H# >D.8QǾ;w԰"D.8H# >D H# /)o5`ѫW/CD"|\VZ_p3ȅ~ߖy8Ymc8^"PpPOiu@UHTweou,tyڵV pqD x z(sd.tfu|$ra:0rQ6mN:uc;wjX?HLJJJwwO6-׋!@x #LНuԹuց}\͝6}X X֭[ըQc׵@`#}~[>ؿnݺeYILLPə]xElzzz%pmurrrڜ9sf+7omeE,8&rE3uUzYz܂fF7o>{e{w'=ڸeݺu#\3-Z4h6{iذ֭[R--Z5'R@uLWLj۷ #OPӍOsOդСQ#>Y7M͌`>gq$r}*`ELDz>}iFcO:պe˖gABwԩĜ( [uZdm.]?~q:F֯_ѣWZ*Ϗr싊ʷ"" 1b: Q] kOcbbbFfff˗/7ܹa]oٲeP%$p';vɓ'tHiisիWViӦڎ=EHe4sEX5SW)Xedd$_lOv P˗/7vD pwi7r]r嘊yZ墄nZZZj#nu DTPjժuK,Ѿ{D5^7%u+?nܸz2^3f;wPV&''ivf#\eY.*uW^"&ԂZNNΌjC W*ݶm[Нގ+X(1s̙i4֖զ$xUVU^f̘`Hw UcI)T?E:5w6A9rcӦM/#z}ZajE,Gr ֭[Trl]Oe4hҥܩe[R2 f^!k>O1R3n8mڬYhEj's*%|dE,G"3tЍݱ~.5a„XݼyÇWh|fffZLL|p%t iݺu#(@0#T>Ar̙3S6 ߃nx#HMMMqLf1r#ChҠA(`4~ӦMCT:{5~̊F7x̜9sYYYqFcUN:7<ص}̊j[k\xG+};8\Cqq=?~˗3 4ڦM:Qj޼9S ^*6rȵZj͛7tVt[ 3g{\w}1DhJ/Xfٲe8}ӌƞe/Q]dt cƌYiVPU$pݸnŊcǍhV蘘fsc`ZjRM8-'%8^Ĥt{ر+\K"##$x.<㜎w9993bcc&''ivf#@0" T`u_~2뭈 ޑ΅QeggΘ1#{H:ئD9sfUyFlϨ PVZVyѣWs0 L  Dyj,/`5ԦNZ>jfgWF.9rcӦM/'>> "! 6pӉk֬5lذ }nݪ f"0lo-/U2WfBf(((fݻq/_nԬY TkΝn}V:$r7 :t~m~X?g„ KuiӦ!#FX$x-?Ufjf ٔݳgOK.5СQ=cǎ(\p3@AD.ষ~2o>}+UqV7*G}̣}K"UJ=7n+V5o߾ 4ڦM:9D בS5m~&hXxȑ;_l^z"" Tһc"W4SW g@5rj͛1cǎG̉!@nݺ7nܨۥKC'Nhj!:f̘`oE,E";.IIII% G ,3r͛c4ҥK;uTRn7o@ @۩6 ---uy r1'?mڴO73NUK,gE,E"իG;[ 2 -''g6F0Fc5sI ]jVRXX*`.&YR :i:%Y1?:# x@UnTK"FtAήXQKL\˩T(x \cǮ1NiS4:Vff#/" xhuW^"&ۮޚ]x[ Xi~.Y嚡A@0uV-c;HjժiWp6zF{Jʪ;(髖aF.mɓ-^xqۻwȑ#4ir8 }}:W"#Tj:ξS\p6[pEetn')))]MTƄx.EM}v>}ڻwoOW9hӦM/ʶmkqTbͱ؊XXD.PÆ 'Nhkr8&LXƍ9rmEKRSSSԴ4uܹf  \3gϞ^/^lҮ]W^mj;j|DDD… '%///ڱϝ|\z'˼ew6* V6tЍڷo_vZ}0FMhCe$pꡲ W\i:-,,Ь\՞Wb38 gE,G"'xmD7nJ/XG=i6n}|ڤo$r 0UbVƎbժUaFwݺuoBv׮]}۷Y.rrrfiɆ 4SN%4AÊXpDY+bxu/B OG+WZvZPP0h6Kh֬ym"ټ:t8jNlw֭qN+OnܸQs·UO8fMP\|83cOG9HHBtAaߧ$ramGw^xIǎh-[g9Q.t,ӍJP޽[nr5vŊcu4&&ff'T~c_E?l$rjjjJ/XmibbbFfffXb ݩ.nGڬ8_F?[ZZZ[3nǏhnx%Y1@Us=ZꮵnT>{$raD5wv}vͰUz%\*`No! q-WٳFcu|TSi|Cb\icg;#J/Xmow.hŶ\+;;;Ve!`=@RSV75N:@%C< Feb/`c3iӦI>~vV.hsss3C<666[-===Ië0 \ |ڤI's^ziܸ%mРU3{}:"D.XkT]\PdڴiXu7RB.|/^[ 4D.%o֓e޲2=U 6lf(vׯ_g4>333A-&&f^NN .{-Z8{ʕ@7ڍF(z*`V @yVw'x1+Iyգ 0]]V_7BCCw?yŨ1S .#)ԏ׆ijs΍Wyb::" x /r֬Y3ʪxwmĹs皫FG`46Si˔4sb\! 2l㕨MNNN3?Wmݺu#ެH^EDhIf2Z.}ȑ7nܨ;x;w 5lٲJio@@U|fjX՗[CuMPb&Bt>% ;vUݱcǮ4N<ԩs]vUwW;+ \v:7njnvx8ЭVZ̋@rY=Y B"{QDhJ/X %VZ瑑  5ܤI۾}cD`B7mذa-YCƕtJ텠*& G9! @ {F"jz1cFNE/^D3hfh{mNd$pEǯg϶P ͈uV-Wc/_>N6E33N>۱/***ߊX 4QKU{MkXPrrrf%&&fdff&Ռ>}9rZD *]t9TZZZ[3nËfeeũ%Y1\sϧVz$rh]֭Oim߯!٪꒑R;jԨ5zec*`Ng$p/s&''-ZhI#Vz$r(j* VTMIݤۖeggǪL! W|s̙i4vɋk׮>={kV&=XE"0I۶mOh'cǺjaaan޼YǪoP5f'̈ -[ ߿6oT>A{O?8%gz굧Eg9Z &?اs+b{H&ZbѣGS5\PE50bʔ) +Yj)))kB1$pO>^[v]i 6&c׾"DT˱O˪V?~f(TBWDYEUgW-!!!Se̊֩lwݺu#q@ei߾}=Μ9ӲSN%׮]jmԩS ,Xif|W^^^cM H]͋)3ϾĉmUrA 0AkҞ={zfLPf T6vڑÆ JZlyի T{РA[LUBw̙sTcǎw싎γ"D.`'|-D;vիG[`6-;UmhDצ/W\ih4^7@Ԙ8HZuU(Ԍ׆ijl QǎX@" /r֬Y3ʪxk˗]xIhhNg3f--Yd+ \V3^4 @U?`D.`g/:&rE3u5Њ+5iѣG;ܸqf/޽p%4vÆ j׮]jV \ Q5,]*GTnܦMf:{iu |\hc zIf`ݵkW3fʊf`:unv6.f ?t=jM6 q5N78۶m{s·ߝlݻ >DXxggϞ=l+b|zё TRh6jrӦM/hpm2cNp.TlƍCU'SN%ΝkjfjiU!0Q~~~cG"̩}ms3mRь .4mժz].]2'Jؐjg϶8tP=zuV-Wc-[6^ΝofO?DZ/***߂P(VZe* Vj Fc_^Ol3{Gά8 \|,--]XX1eʔFcҒUs׬{Du֧ʴت_Rkk ɓ'/2'AWDDDk46999MmœHY9>D.`1mԮ]* VMIݤXٱ*j4N0a;cI@|;+Q&MXﵻw fh1}$ri'b@X-,,l͛7X/t $}1`.J{>nWٳ-Z=rH_33NU>>KY E"+V;z}vVڸɪYj͝M!4W-%%%U3{Mѯki$%kUKWZWqZ 0X+̌* |Q8 ۙ"##ZQiUKHHԌ'$pw}ә3gZvԩڵk]-..ښ@w͌@E;39@p! yŔgwĉ* V"\l$%5h4" e˖g^@ǸAm1;M ݙ3gIKKK6+Fs}yVw|ēO>c"WƎbգ ܪzӚݮځW\ih4^7UԦNZ2 f+*]f(6fk'JN>}9sT\5+F{c[H>d֬Y̲SĪx@Ү]/_nt…[RL &]t \_J*DmrrrX[wÆ Æќ@u _~DhfZh6mzA ^~f2ٳx%8]vY.OPSVtƪNݺuohJϙ"'ь zI@WݻwVѣG^n[lTNݺu;m۶ܬX..fC ٴyݸqn-vIXFg:"D.ct V2F]z>eʔF8ЭaÆWZjuz׮]}tlNՃ.M6 Qm;9|3W:E+Nk 3$rp /k…S8cƌfaҤIo# -mӲm4̓R4`b=_lq-7'J* J /""PJ5قw}gf2 ڵ;ؿaÆae؂ҿ)^/ӣj^=.*dFcOjcϞ=wߤ`T|T۶mOh`- [ f* ,z=Π.fkwƒ])٤_RRҩ~̌T5>fpD.VX1vѫn޼YG%Tz`,XF \@u.--ZGjܙ3gZ6h61(???ʱ:\Pf5jgyvf"##蘰t wuTgW-!!!SeIi8rHGMԩS6t5v֭u|Q !23N E;3Q@p" 8-?'NU^*.G5iT3,Ռ&񙙙 j1112ߋ.۴ڵk׬Y3qui:̜9sNZZZY1B7O# 8%z2nܸV "& 4hʟ@ӹsV7Yfe߷zV ^rT=AS|UVe?WfO1b]UJλJ%|7n8tȐ!̉@"/ \L.`-MU2W5СC]+ _'.qSVt:tcÆ tj޼9B[B"SM_ׯvo@eu[j)Y;eʔFcԔUR׬_MtߊXQƶy}m'a>On޼Y|ƎzjT>AJ5ϫ}gwu]#˜&Iڵ;د *`AHPNTq-ףjEFF.jTʹUSVI]w}g#ZkVʐ+$r?ӶmWKVݸqUqp \M^{̈ͮkmX %:.i%K&VNJZlyS'`6g1@EH~HKRk\Pt7cƌ DmjZZZ̙3x;?K竪{Ɲ9se 8p-[#`&rSi+b?H~hѫ0̎#MPKN8q⒊'''%$$dfdd$ޤ9ԩS;w|\ݺu@''`h>wnn$r?֚gwĉ* V+o%pM0a7o<|eVeff&Feխu֧]VգW9͝VhY1ަ"}yVQ8܊XqL6>ZjU1Ȭo.--}nvF͛6uiL7'>}|s̙ٹkVtr6XvHc}`U<@0*H\PTCCCw={GLCu@e)1J)Yk4֖ݴi4'B|\͞={c"W4S%ԀwJבj˗/7ׯÇw6_TTQ7()J')YYFc aÆWTsYf͊ZQeu \=#yľO˧IW5jtСC]n߾]sРA[mhƍ֮]Gԯ_Yms34ٵkWW"yvzp߾}=j֬yۼ(9茲 A"s 5SW $uY%f\0  \mӦɝ;wؔ@pA#4ر .4u5]$""p…ŠD~~~cp\̝;7{Æ Pf}߬Yf< \g-[6^ T#hɓ'۴hlƍ/ر.͉J7RtQ-]Wc #tL lœ!X`oժUauֽد *`ELlW 9r ,c||ܬ8.]jܩS:uܼy}0'JJ{lSLYh4V85%sv/rvCbɋ! %ZZjuL+~V@N:҅;߼y6OϬ1cƬ4+N|oՍI~ĉ# j<p\ @fv;J/X)ȶ;xFFFbRRRX]4;v4$Nh;LϵjvY1hf1_$rѶmL-U7nܨkU\  pΎ1cF#9* &,-** w5k[IIIz]73NFAm^ ΐSJiYJ.ժ_B5%eTKם 7UKOOOR"،pfҥt۵k׃ǎkj΋ׯmԨQkt73F@ ]$r2z P|vf+V7nrw[ב&.ݩ) j3gΜR f#qNjݹsׯ_j5kFx=%ϟ?8Tʱϝ $rюKO8V%Tz*iӦ!#FXXő6NSSB-s5+NnԵkZQnn4SRRR_*cRbgE,\ sVRUVY`gȐ!T[pMFԩS T8j!dMMMMQ\5+F@T@z_)}5,HzO_zg׹s/(("i0)LDY%tӴrh-y bND.fϞ=1+ڔH[m$pͣ%gϞmqF}ݡݿkq6lڵkG֬YY`:jJjonԨe5kvެ<7@zG/}E!k]Λv W۷3aÆaݣG}۶m_^f 'hnhhݻwv5N7,7o~[nۓh>mgE,\ @6npL]^"&:%\Y]wr1Fף~ڶm{bΝtMvdmǎ\p .bf,Q}lt2HL˘5ξo֬YIŸ]G###F'NLƍ_RBCG͉7q_~uSΝof -oE,\ Z*nݺ7׿>\Vx2 \Yf(Y`Ag̘3o޼.]jPz2ZjN=o߮d)SʊSS2WI]bsv@3" 0-wnժ2U?hK* QFfLpjsS7j4 }ѫ͊QRMIIIFc-Yd " T\8;JR x@v;J/XŶSJՌUzZr*`NKbbb}k4vĉK4Bt)W$r̈́9CZJhUq(;~e/3gΜYՍΎUGQ5k]vq7oެ2A[>uջnf}*l! ˗nɦJ.UqH%eTKםM>UKOOO )3bFuܥKCǏojܩSZׯ_i 3coˋv4ib+bHAUf T6AKNԊƫ^ZJJJKeLr*pر'Olٷ.uٖӦM˝?t3oR(>wnf=@вde'Nh *`U\^$paOoaƍCGֱLmHcVifj1cV͝īY1:tc_ttt_$r=@r#-avVRI fF{#FXG :tf8۷V \v5f<̦e:QvjO5t2+Fnݺ:D.DW}v?xی… N1+Ns̙i4֖ݹsgoD$r 2{Y\L]^"&> -_=w\K.5۷#Gt4>|z.n|h4644tgF.ִi fk8+ ~eəA"MNL#иqK%%%TpРA[4h׬YvϞ=n߾61+V@pSh={zwF͚5;*)שS+bHAI⫯\W .I ;vرcWTT{޽=֭{m۶'vՇYO3|{ݽcǎG.^tG.g\6: @6l-wS\ 0.W\9F###L5ĉԤI۾}cD fZQr… ٿmFI@ f ZhdǾ|+bHAH34Cͱ_%TzHj ,3r͛c4V3:tpT[lF33۷k*Y;eʔFc333ΝeVg3$r ɭZ:]}#<8.|}%&&fh7j-e^6fP;͙3gfrrrjK.^dV0A! ڵ;د\VPf=zlU2)Fc5;2 D f3gΜDmVVV &,Dv4a D"RVZԲWBC3լ .K d](W4V.;;;Ve! ة|ȑ#׮[nq7oެ@[>URRY4&gqS$r |qaaat *`U\-$pT_P-77wW4>666[-===Ië֮];R]t9tvƝ:uuz޶'|[^^^cߤI[ G"bm (6:Dp @3mڴ\=ĉT4>)))]-%%%U3{MT>رc9ұ[nJKK]^뼫Fwtl?t3Dtc_ttt$r %Ěyfwĉ* VESA}_~V:j kVԱc#cǎ]a4VMMKKKV]bTرV *D.T1+ƍ[1$plS+_^h|fffZLL̼f NcƌY2sKNNNS\5+Fx{" {s}WmU<0 \={vZ}F yfF͛Qp)f NxD9sfU-xݹsgh޽w#$r=c +;&r婧zSm۶'Ν;ŋMѣF <A-22rAAATWtnקO]5zM6`f?bu  \~ῖyؾOsI&M\ԅ74hˮ]/** Y^zپ}{ڵk+ ,X ҖݳgO/W._ܨYfD'n8FglE,\GiJ/X \r֭{CKSUGWTTrFq]vUwaÆW̊\t޾{ޗ.]jĠVcn8R|yyyю}yV 0CnTϾD# T.~m?VU?NY5w߾}=ZjuڜHqƗ.\T3nq$̙3DqEMv싊ʷ"D./hf99@rV=jmxf4VZn}J[nȦ3oׯv Qvʔ) j4sec0ı!3gδ:$X3ʴW\66m2lذ $pə`4VvU6wȑk͊\T>AJ&''f͚QSV[V@-Z-Tѱ_;Uz222^*b4VrFFϵ4% ب|YYYqFcul҄Cuqv07%m۶=ej+YeVH{ߔMJJJh>^vvv4x=@@PR#F[~pWn޼Y}ڴisȑ#k׮]jfhœ@! +/_>.,,l}NTrM{| \ԂZnnӧϯh|lllZzzzΌgݺu#4)K.N8ո'O1cƬ\bX3c 4yyyю}{'V p} W.Ml:#ū&2|S%%%w﾿e>`ʕcjԨqGdzO73@2J}yV pԛoT7t^%(o&pu8l,[l VWuv2U8SN%Zmƍ[n4V+LMKKKV]b g+" )-uLN4ӂ \?~6;۳gO~m7% j111rrrf' x;v/6E3ٹkVG# {2^zU@ի͂֞={rJC͋Q:uj "͊<Ԕ3gLvcY1D.^y*`AHA.ڵkwˍ.^$44tc/(( %KLsbOP& =CyȾ/;;;Dn# ]=zv8pݻw6_TT^fۃ ڲ~k.5+V@pXhdӧϮ{t5ҥK6mzo߾;m֟Fg:t8jE, \׿>?O܊ \I\Tuk׮i4~˖-ԩsk׮uܰa+f |iZ9U$W^mj;j6\p3Uyyyю}yV PCn,3ԾOsIV \t!f͚Qz@%c4j+b$pTDʤL#Gs͞D *Ϊ41СC]]O&&͝7mڴ\+bҶmLHw׵ۺUq2SR7)))=O|PlF~Æ \yfԩS׮]0M'ku \L>}cw VX11Ѩs5/s΢| \fP5]@fW4v~`~ѹs'Olj\III';v˗33FE;s=Z D"FY~;vej͝5W-%%%U3{M9'>|sߺu RF;111tC8Y"7:::ϊX*7|̛}Ǐo *`QXڼyCn$ J >TTT>q%'ήZBBB4' iVniiim͸?~2fM΍Vp\廎\UVYeHEEuցZ%i񙙙 j8+ `q-yrVVV\||\ijS|͊,={ku \&`ӟe~j߷zVc&ptl̘1+8pV1W^zrJCYQSN-P,5%j̙3hA*{\wW={zY`W_}9DhJ/X)HG%ˍ.\дGΜ9hfC"Z3{.]:8M&MO>8kdƍ/=z͌*1l$rx䡇C}ٱ% 4mӧ[]~^>}v:txUBwyZn+ p-^xJ{}zwҥM4m=اV 0߱_3uUz \^z>~& >|Y1V5T'DEJ/XHsj/IMMM1GI˖-?nܸD T*6}ӌƎ1bV j϶m۞0+F\UҮ]㚍希H'T7nܨkU\FH{^7%u+?~ez?iӦz=@@@DÆ ۰qơC%8mݵIyQŋ'=LΰU}7oެ *`QX_Aٳ->ܹ{oݺUXרQn&ꦢE;EGGşo}۩J/cշ,-6B# aیfҥ&N񪳫2 fL;w>\ZZZ[uËfeeũ%nulJ:8s'T\⩧z1+r \0DŽ V\jp]XLP2 f <ˮcZa46999MmѢE'M߻Eg?ٳ^gz굧 Pm~ӟOVZflO?UPu ڢ쪲:W^m`4~޼y1jSN-POPSvΜ93NݪO>Th|AATE4}.]Ը̥G *v~}WTM3e4irQ4hpuynVDp5%ϟ?߬iӦ 65߿x[Ύ}8Zju̙3-_^w޻1x]*;dȐM֭QV[ƪ/~񋟘Uo_>{mZgukm.^ؤaÆWt S\\<U٠g}7e{r3QPU$r= >.&4ꮻ:hU.IoWCu7PٴiӐڵkj7m۶_51JCGtV 롛:u*vZ}Wcu5r?→_w},s;4jKeV[.^xx͠R֭[RC$h%s=x5xjٲm׍ān5k+*0q%1:䭷zM6'݉C%< H˗/7rڊ} $p 0hp=N>}~nn4Njuoǎ}uqmyewGv0`@%th6Lsiڄ j+.,,|\U~'|-O_VםX|cǮ4yϟ?]F7 ;w|TWwL6-W %jXe^5׬Y3}I'eƸqR\'x[e]^Vo>ځ?kQCi;C=z_osZYXX\0pV7J_$p poIIIׯ{?, ꐡCnԆ~VܣG}9rcuHvs{~駟So}[xbʼ> \\j9993bcc?ތx6n8T0۷?εIIII'-~m/СQE XJΛ7/fƌ9ܹ3Ti}wIQi:~k?O~ wH%իwVVf?Σ>yTn_vR]x'JD.Qm۶=a y߾}wTD.0x˥ 4ö_klM$rW_}t:?q7oެjÆ |uԹI&-~AeEըQ1gգ=oߨxWmy>mu?ϟofۅx?SB_X}s) */fa8S\]$rQ)?ju 2?:x!cqwEPN/@  >D.w!F: >H5 ܱf͚ݻw[|c=fuWہ; x񾁊8;Om֬Y<`QD\S$rQeG={a@o5k'9+buΒq$ra Tyj6mAƁH# >D.8Hz`ʔ) .\8ŊX>(,,:D.8H#끴dcD.8H# >D.8H#ٳP ګW/}Gz;4> xJ={ Yp<8ʕ+_| noSG">EO?tȄ , p1i$ Go/rțoi8 ax߀|\gφ\Ɋ+Bڴir|fffy7;wաDNyg }b{__+K>liu׭/F?c%[&MC9t7oj^{Ѹ:tHy+vjFy~ԭ[$F[ʛJd„ K@ E1 /2!:hР*X`vm_Ҝ}͓Js=wo|fX24竕V[t76W_m+J+bߒ҈#J={,䓙ar[o5Z38]vIZ_vi`K.i~p|WGKOs4?&lҼBHsNyviQwtȅw7^9餓J{gU{{7u9duw,=#<O<ҧOXl={[ou /uǏo:?ʹL7=:u=?&uԨQ͑[mz%i}? ׿t>`$G]뮻i!2.#pn -?&r፤?i"$7M# ^zX呧];HzB"ā,96l'q~?i}? !#Ėy智Dl~@ZoLhV^rqǹ-Z`"(8A,K,8D.P`\pmӦ 9`^zW^#ɻl@Vj=n ,]~xgוv" :[o_sDpp7zwo'*~衇^,QDH൨b.oؖb"WA锷7>ZXr7}'xb&O.%+-z} /QeI,[@N䁾2Dgʗ{%ra]$_.Q\ -^{+Z~29܉'.<"n~Z논$nKlSM6<@z6uU&B },mkK\%Xb2E ]Z|D" D(K/2 y]57_~wy;F\6?#o.|nsFBCdysP+_nT+DՆ\uM7 p ڝL9V[m@ɛ 0[_fg@l~V/oak]6\='> *ED.oE-'.v n9O>L ,N\YۦMyL{'7lrzyse3vȃ<jQ(:U5a„e+r>uE /֚kbCq1t+'$Un 2dp䁿{U1 @eYf2Եk q뮻vl~F\ \3i7{lvj!jQD"tL7߼2hr7eJY͕I@j[K5&S)NTmT/C;찋]vw))BZTV{-]-P='弹7ɛ/ks&pYoi^D|*%ʛ+dĉX|'9("5jMsՎ3f&c߭[w|9N7\qVW}r)Ȳ9eHKHvamsH \[lP Hܵ^y2ysQDEUJ+1`[ ޒU\Y=V *!b"wn]\A#ҕ Ql~&yqemɛOfg@\Yvίy )ZSg駟W~ڴi%_ZȻLQ\WQ r4L L6h]ɛZO?~]~7W6?#o.U&yw]j?lQr/҃? Y,1 ;sELີ>d 2dC=2Ar\iף&lys'Mx.]&(#Pרj!pTߑ/y *a" 2$(h~%K~N\0yԳg+ǹFRbzAE\6?#o.16*U/WVUo+ȗ0 +Æ I4]p]d#Flݻw~.Gkʔ)]6_rQˀ0gE^*j{M's\2W7tn$_.l"*!a"WdNWO|8+$bys \]$݂]p]"+-$_.:5E\jҘ>!6r&rxwV=lR=;~e\' 弹s57~Q/yv1뿵^&kW~O 5jKWe^ysGjyC`6r &rxO.c gms϶Q?ț&pHzY=6;)Yi!!]ɛ"E՚z`JraQ!\!z.{r}s>՛Yͽw̼ˆlUkGHk=/T ʆ00 Qwh;V=.1\!ɛ+Krge.a7<=:Ms]V/ol~F\Uka'] \޽Xe@(.+7wm{sKDɣwي H[olkKR']x.[ֈE 1 /M^t]L.]Ll~&sjG#_.FT.4a"S{E].fJ[DqVpUt+|uq?С3.% Y=y4bĈ] TIz>sޓDDTr5r+q]$o2Jm喣z-~^L"-yԧOc3@ZQy|QЂ\_u;ܱW5jԖv"e7;LT=z&ALZC\d\hD.gm8(J0~UOyf"?d7eKk4yu9jA2h@\d\hD.ggX.fF_Dرc*͕&9e \ `IY=ytvU&kTm=R_X`O]( x.;"KDwLJ=^w]͢:&bZ\(ysLஷz<.!f*fgU+K[{ ~rW>\Oiڢ*ȗ, 1 {;e(.-gÆ .sɛ+Ǐ_&e \z3kTi7|sEi tfw߫=z )1-طVY2+Kɪ dzLկNr%rܸq+,ⓈDZQ&MZ\&p] `"uapꩧTzS2HȯTjmP\9+ؑ%Lse#mmYbInI܅Z|K"GfA&jer^kfꟵoZa$qa]$}ן}|Q;O˯Tz˗+hD.ԊuU&@0 >ʉ֔e"RJY>9sYgu\TdQב>ϒ͕z;O8q&㼖 \"$U;ȽfBkTDO'keuҪ7WRI\*oH2d`&raJ y]:ر4=ꨣΓvKS|o/B֢r`\sMKT,Ua"7[ou&mmIJ(s\591ߕ.\jh-j5r%ʣQPo-* \0#E'JTJNܨI!YD.Lm>q_/ /rQ-&[y$1޾.?p8S_Q,Idue]ʨ\&p#\pp7A{/ZM^Y6Mǝ=nf.S^{UNqوvy࿩S.bMq]&rB:q&re2K.(Sh!D{DJݔ8OGW~-+d/,^ۯ_;⾯,9sfbjͭ&[BykRME䁌l&.'1~M>u]5t8b-U5+&ͣd59SNv]r#[Qľ[˻(Sd2_^Q?>l)dyqb>2d`|}7NW^ypK3JT-&tI\!Or7v&yhp1ǜ3_t]\9#.ߧ=:3<̿(SdUK"hV^y1Iދ \N\偝LhU~֦!QZE%mL*v!\5+ٲdrL"+-O\9#ϯMIG}t3(^\C?$Is5l=L&mYuQDs;Nz_|ɓd]ƴVYel6mLw]&#&7|sEeA1k >L"(O(J+Mb#|D.Tm?~2QVd\H*_V!ofK/`Y$Dt˕u]oN"&MZ\ 8!*:*>|}&R'I\jQIVS\{{w&;,AI*{jMxE=2^袋Nu]$RK-r#GJ{$qM7}F\^&6$/fꑝ_}UDIzyCd)駟~|~Zh%g'(kK/ZI/i}zeK6SL'=?o߾'i@ܸqVhu];T|NK|+f{衇rdQ6xwe[>.2%%w{o_3\I6w%[tMl2 WLVAf܉6(>LC~m+1|-Y 3_Nc ܌d8L@0[sgk,i=ȧT|]vA˓:NzTwqj5}?dLzI)MIfSN]uL$̢g+ɹF ͓e=2{gzM>KrJz e)[`>u],{v]yciq0<]v]49}eIOV} (ZIsy-*ZIoOGE;#Sjmyg6ogW7(-K-Teү/UQ͟^3n|SiHi=)S}gR,iӚu/!|G>t1e\f)M(Yӧ71?묳J#FgI:QM6 XF>R?EGlVzDd*eYwm,ߛ%iC[l1C[*hwc2R of3K´e]JvZVL<-m{k-$+` R3YwFq衇J^u+,io众c+}3ԩSsaUW4UcȲ5[7Fo|~כՄDԪÇ_~yڽjUmU^V̴<Ce|ͥj{eN 1RO?sΚ_*Sk׾}JҁM7yR/w`?=b"׷6}b^=6Ydb:kjIv fj?گ P[#lCTݑ-KZҥ?(zJ,mq۞.2Mh6&r$zu>)}񺕇i:wM[4th>f=Y՝Tv?*5\FՄ:/}Y}|3eQeY9hcH=lQO"r510<PUFmܬ@2鍎ؘȊz 3O:!;h?/K/l:/\c=f>&\o5ɺ1gG[݉ڝ$}!ʯʹ^wbܣO)>*? n`R&Zly伮٬džy3#IϴhBz\a)iA5I2]6#ߖ'ԟ,iowD+&mˇwQ[MB7=eGӄf6~ˇwLh/㱱z|J/5ɈB'#OC8!F=00#"7=&ryx$n "!HK.hzD;6"Q ǧAAzZoڗD1]zBƲm>HW;h8K!bRûe0D:}'؇$=9IbFNiY^5/6<7ԟhowmO>LK!b2=Bԇp .Bc"7]a3|J/>:!J']'1c&㲣L# .hT1>>! i 3;X=Р~ab:;}bBk(Кe?l|MziowKuj!D0 JDn:6jƶQP:=~~+E}s\a)ii/KZ#UBMoҳ塭 a2!;E=.ޅ8[V8I&]zJ{?e?_{I?'CZ/WFNѓ6=_ e= paзw"Zs)8IBU.(Vȇia|R\(S~ ab7kK4qYOA4Z!&mO0G{[SejB{+ZbH唴_4 7IDnz, s㊆W^ʠ>oM0 ZO~N>H_RƮp&i٨;ڛ8hh/ѲmO5Qap$h}-544wB\Ši*&'ťuvHN{}fmzޱvy q3Ӻ:ac׺ZjIփλA̵?t! tGû(uG[?"rWXJ/5M&=*.&h_$>wYC|!"W{Dk̵Dho 2H唴vʴ7"UHXCK6ZLϴ]D"Lj0 1`c坶+|@$=FF?M\.>BD.zӋk 15 >_"cpd2.#r<!i񿜒F{}fMj7DVh?Һ_Nji'ko/E}LK{z!I-RwE{FC񚸼}áoѸhdh(inc`nvuJhEk$DI:txM\+5hS~^~h.dJz,Q~ Crk`uJhEMܕo] T7.ih$eK M|[9V`ُh׭~ uI/\ h/HT8 ])> Re?.ke?z#U_B1!3i;iK::ܕB8"Wsc,9H}u[ L䦤b_CCabxX(|[ I) hK::8ZJ!/Ws\wuRh^~hACDb-.h3eLB{ n;M\-室Lsj;ޫBl/y`wŔ촗7dhXpH2[KƴǠ}p OFbzYy"!VdrWG+*cE0S\ 4Qz~Glt2(&"r~ .ݜ!FZAdrWG}5mu6v7P~99%27"\`FKl|OccˍVwiBQ넨 : 0zQW蛝fG23)ic|ab Mu> +Zz "6Hh-t:QH#>IE_yov沏=G.)iԗiYkٹbFDnzE;Z!R5.#4=ZbDnҽ=Eǥ}|"B8_m+EeSLeqn4\~\"\ iK.s):+e?Z!ym;yeZ'DM{{hiʇi?22'H}+=]ZSKWlt2ԙ5LRdD-E[k-w[ZJ!ԟj.smjj{F}P/Ce$}uVDFTSc^)iXj~ڭ}+7;xl8iޔimC8=!+6h?c! o}TذJ[_xl>^w;G,5_{+K7BTc636SeHo~cpD՟Bh/o}T+6hU9% kB2Mh~1T#Kzo~cp9h$hm+E_y6n~N<0v׾\EOZA1\8Q4F6گ[vaK뽪R}m+k~NG/f}'G;NF^lDCkrPf3"oA'58"m{S{B1Tayz j|\ɫkӴϋAw NF|"ě+-uQy ! 褦Wܮ`B?'crIjm]k956v)B#7w4/fi1}!+E튍̵oC8j.SVh"NLho/s|@:wBL!Վ"%Z;x>rδ=*wk;WtoC8j.&MiWӼk6|9! Һ̶=ެPK7Qu']vM!A} `mP$s95)c:}/sRH"%f#ee?(DUDnB`]6cr/ K-޷~&6Ri;.=9Q]q]ƮgIvL;xL'SG8ɒƆ<"EgiFVg#Z6crR$RC^Fخh5L9X! ~mb% <N&r)d˺c3w|!LFb#o!~1T]>riRr^KEP:uHGuuIη-w/Xw2hG10Bۓ^їb#h6_y:^hȍ+ETW\G-֐뿿#:I}K.$ 9ra#Z>C]kSe݉j3*2aFם#!kWQ'2ۖ\YEjx^1R]-}ٙ6_k˚ڭ Q*z??/EhN 3+K#rX)LF'C y~C;!Db} 8WLO]Fy!ޫMht\)z?R]q]ry؊u9]%Hl)+6sWQ-.#r m~zERHq dZAywh2 ^a?_1G9L-DJʂ!LLh[""7S+h;!Ѣ \aK!ޫ4s|U~~^!Bq.idf]\ot2#"%-jѰA}E=Db%}6"r-epzYO\=}TNLWKCwWRʇiLڃ ќGBհq_eG":i+d66"i?.؈T8S+ HC+~~䃢GJxTW\|{ZhZ:khǠ,=҉DDn|&mfm?/6mq | a3fb{+ķtگ[MTW\BhDi0~`P^Qk ap!w\m->PwLdNGC4k8Yova|RK]1L^wb#ev\Šzb7wark0c"7=K7eEL a_! BrHnu/J!+YV65cQZOi-i-Dȍ '~! \1Y&)g3"Wï&SByH[q6?cp%U!հa[~~NK\@*C/ ˄7Ĉ\ >`ál胬jL !Z_S6=tiݰ-BH a !XϐhYkmpO亜LԞZFږtRCxx䏢 ,n3IǤ5l%y~CxS-4X4+c_ےt"C#rLDkҞZ"ruh{_\1IBDcؐirF{\0z&h5Bl8Rh]fip߱ƃS [W}+ FX絤> wگ[Gu)3:F;cKQ7Rh<+B/=[A珢m|CI/t:|rYovu!N&F?GuKDn1Bd5BNR |&Bt-jSVzZWȃer]lW}yʻ[smc,tR#FE;%KY`2%=NO^ oBHC폢Mp h]uj&N4q1u>=~qc^c+r|m3I- 1)(2rhKNzZBm2rUlFu늍~&s#}]K!Ou!aRKNFzEM'R+nzBT+EIEBk Yo]FkX{&sҳQtŠ a5BHNFzt2 !"\֝)=5o}Tt:,NtZ5ej0 u s*B-.iciz&F{{Q7_> /KsiK1’C-}燐MCT1ez6UIkm[WBci+*aE|E{ϷN:u!9LaX I/h*uŴhȥJK3jBڟ~^Z'D҉G'#!9lnvFJ!dc!RS?CuS)]ɺB_MCTq׭+6UI+}}}NJ;Ս^QiO`# Z\FjQp(K5g .jbvj2[m6Zt% j"r髥g# &s+;>aw?jiB+t2򡽽Zsٌv 46\_H!Fgi8X*^փjrWKF Mc,9٨;0ҌZI-9L!(4DHJK.Rdom~Pu_ڞ'r5MJ u3[uG 4 [?G+}o] anQicלdNFMu> ;#U٧m'Ɔ01JV= u3}5 3i?ZǶ>мWPKҾ ZSK흌(LDz|ho/֜}E_f+-NMmm -Z>"rrEsv!5Q ل J]v o:bf}]wvaȟeٙE|rժh;1>.ېwۓeoS)cp%V\F'F{_>.뎆ܼ9yݫ4pG}L{)m|̘1߾4rV_r`Em䲉szK#F7޸4u&r駟.5_3mڴ+\zS/8 |4%cyyl՝s\ޫ\5[2&rsv1ǔYdꫯg{G B7|ˁ1>}ziV(7>k2,{ (N=ҠAJlIϯ2A,K])cpCۓI;6_J.Ra)#X֭[s=V#3΄Vv/j_y.ۛ, V_~V>u13 MyKG.-bߓf׹sҋ/X=\6ʟǓoj57?3(]}͟_s5OZc28H[`Joo${5,}͟[˖VS屣ju%uGdq .XJy=.#|h{޷\=iS+rug5\.ףG믿>|^{^srW}w9>q)n_z%\C?1|DnFUZk=^}c=V:cvI'sϺU쳥u]y7O͟ y晧{oi-w%[`;"u{i*_HON;ϫ.a徟u@nhݻw/=۵k]?6-i$}.]NZ{,o]1*RZguJm]n4]ve26L:d) 2IoZ]^ ?wcηrWOi?6ڞ`pQ~宔1ܷ\O$\?ضHN\>Q;'O2nCbiv.(e^xao^s']k̓HTvԩK/.KVu1OʤL:K mf5-m-!C\Y=yD䖹j{ҦV(s}uLK1n%-Dn2.Gqu߲QKc00:>ɂyw#~˺S~c,}"c""P*H?ۚ\Jy|M6?_p[mJ,myݬe7ƨrKe,JK.ds~IݤInwm~W_.M֙z[7بyɳȳCu (ӶSCۓ;[m͍:בBp :t '4L4u]<859S+hd%n:u_^U˺S~c,ȈDE|iڴiu_'a$ s1GzRo6+\ٍ1=*{CCCLqD.Hjyӛt[7wp`E{{)|ժ-宔1hF1[n_.|ByC^׭,GoN6JJs(˯ܕlC9r]|<"~˺C?~N\d/ܱiC.ӧ|}o^ayF-u1d٘ ly,6|^|mo|89r}nkn;mC^qy=6.qve? V^d)GZQLe[yV$cȣĆ<ϻd~6H6j;4QU&R^ʟNY3Y6ɈQ~jgV1]7[w6^dYMzpu[KutkwBFcB6wDn^`}7~fQWey߲UA2L*Ą 6.ZOydr!䒍'dÓd!,ko!Ne٧5!d1l/ȵF?_S%S2ĺ|5!j2u@y5qΑkmTF.=^y79E^ULם@ N:^sdԨQ;FqnZ~} QI/ 'LPu6T7|So0;N?:gTiMtPM|^Z6,S+Ƕ>)`:1=&Ի]&I1%mye)޶mD}ˤ>r8 㓼e}syE6 696k݉˷ s'`qwHՀfQ~}=أO]ځ $W\q8:dJ7Ew>4!Ri'T|jԓWq|zz׸],w} i6l>"m^U~yS.[B9:#=K{qu\87kil1zwR/W:BSyP" PС$YӤK೪3bͪFdQ]Ee<>'YiD'8D%>o5s푉VKݺuk޸?ܹsYr! .6lQcs.6YW*)zuYmͶ>/ǐvKc6.6~N=yݷ\=袋mY۴f"cpWV0=٨;E縼n]:>Ѻ[U5mp$fr3dޱ^盬ꌫNFV7e_ٴλ^ _R1=|n{Nٸ&3_9p t{,Vv·c0iw|8dez]Qw h`FLSN)tM> ~WKl?>}4?yzWS'O&Ç7&:cc8*~KKOJk+r i"n{Lo5s j4hPi6˟U]YIIn/MRw\ޫ\UwqyݺKfСCKnai%(瞥ywݐ=zhqt)۸LjmͻJJrV[mҬYUVY%=~R'rرݻVXaFmOyV1ȍњEMfQ]n>"dEڞmO6~N4+\ZguJ믿~,Vvgu Yn}S?&ԝY{l՝"s\^OڕEDnN8'NX3ۛoYm"沓Em\q&夼?S7xcGkZdRZ8=E;ɲ,o*dJu&zKCOCk+PҮ>=iN[۸|jdA1&r"cҾQGu^N",/ ,`.~*Ef-KLފʢXw"7JȢλjo/c8rɡmOڇ`۞m[ ,h?[Q{˟E]O&fq Y:owyrɇR{?'ֹϋ}Zl٘qN)W`QJ!jA/\ [4p UnξpvfZAV~j.'1TP{ǐu~[~KE瘬4kw\hr&Q?ڶm{ cϢ6r┿IAQ;Y(n,o*mɢλ\j!߫mOԵmOVWڜ>3tBPT!2"O>^C4.Y?JATbFB-ܲf36٪ID-͈Ȣλ|jU~߫mO܇H>=i'Dm=q|뼻iU\qQFvd.r;Y >y>w*|;&>sҎmoCf\0C"r"l8 69JK;wn=\v(<'- w}W1bDiC=T&Z}+m'C,ꌍqت?:O{cF1hW $2ԇ'mi]nqdc0+YUnu'<}yk6su$6mݫCfY޽[СCK={,K#<׹ cϢQ7hV& iJ+rss裏o߾tw)F|&lySqʟEwTֹsُcȢܮ|, >ԭ[wGرcM[n%5&d@_߼.mv<꼭s/ySYS}~ښR~#h{lnGci۞l~C`k=zk2-u'1d}*z_ͤps}G݉:q'~1b{/\m٘q)y# @;Jeŧ d暫4xV>(j &܁VwaL1$WVwcfcL4 co5ಞz[ lsdlVdMlUqdbYczE_-}_k`h*h tMX|S(>ĉvh5&d|75Dnu>m7E݉S}IknoʴC֗#8~mOԦOY pl=&w~N8{QwslMD=>'UL,Ύs1G͟|EQVZ?},l wuWsXn!ӦM?gw߽ߎSD+3.;꼩8TuޔL1pݚ~kk[8ﮣ*}8 vןr>?9oYu\Dn/M٪yPܻC1D _tLzDnpG}ti:_/叒GMfJBn4l%z۩N>O?T5?ZciMytOM꼩8ѮM7qh=LJ%.۞8w=Yo]⼻L"r?qR(rdq .rn/M٪yLfq]؊ͫv|n^僸羱e+_XEDnlmnΤ&([oeYVs=zti͍}R瞻 qhEuFj _7$Sw.fۛ2ǐE]/1-zcrM;0~6_p &m'cy{dc3_SqU~׃z_h8l`cɡ'"[cR̲jBo㺍Kk.,dq Y߷V/z??/.SH^qO0DQ6k4u2UK{SKz&ϸgC}[4=!y ͷTN'._kkayB% _ikF \y &^~uob,0kRglVHzvP]d}.[zZo'.mVLtmou'i]=#/K{ 6 >pf% Ҟ{_dYwD?X'5E \5jT=Cv,\~i`W\qXm-o+Ҽ jȓEaΛSw.rMCR>\8K};y=o]r}޳}$8餓J~{;\]v533-˄MEẵQgq]Lqwj0#LKݺuk(^ܹs㢱Y< EY4`Rf({e[b=أOCVuU\uTgQmD$ӹ51Js݉38΢qZ!K9Yp]wû^"ij(UYC7aֹϋ6?It9[sR&rstE5k^>2a^:Sɲ7:TJgwILo=SYĴQqy;8|:i|:$|nMdu r\wއL۞Wuue?'+6NG]A2,cpU]&l$iLV8y^qYwn}&rsԱcGkǒ1{m&Z&KO f4tȪθZLwO>dOǐ/׭FMK~kZ~[qϸq4+*ˉܬUw]RM|mf\ם9.N/sR0Dn T~wKl?/Ço VK=MͪθzZLwDէsv2ڧcH—DV`6ms݉;1m{L"Mn<6? ]wuK|A?㍬2-GVns|&c,<;!4sL2'3LhW.:_?ly,uY<;Խ{ +PhRWW_g"E;YOtvrӹ51.;q=};q[Y=Y~m)!u{)nG}TZx9*˺1Hj:/u>G[Zwo}#eN fȵH`ˎQ%3fLwK, 12$K}w`y7@ڴik\9V[mҬUVY%ouUgdP[">c6 [`G 4՝3mNmoyOc{^}RO/mᆥ%X{wӣGg*wu's1Xs|q#r:hkD=9)a""=r2K,Y/МuYolhMk7nت36IF{|Ku'&dPm!%NCCC.'TFQ3[\.J^_駟"cĉ57y7K6["e*r۪;!CL۸_I:S7;3E?+sR0̃'zywjK;}NZkΘ܇p *wYCֺS[7B6O9VwD_ĩGK+yV| Z|_|~~^-uG{?e4>BDn~ D hTPvҾ]|ؼĄy7l,Q&msk3 6vwZv?V;W9dcpT)/&r۪;!Cλ^Z69.뎆~%# 'PG.?ԫWb-fLI&%|,G}t sϭ(_ve͝ۯd=!r醭:ccOk Pgd#Ek|=I&}=z|nq 6kֺSuc>oysVeh hck螤^e~~˺crLL?CpM6٤b?a5%{8Zԯ_MV]ud=!Z$䑒|RlƥSI?:׽-||uL䦐䢑 C^{miJULX k= Tndi?<&r%URVʍ3ό|MUglo܇p (wK|<$6nmԃG[|;ix I"dBkE;%:w\ݻw[k*ͺ|qy7h;sݫZ#)$]~ҷoدp J7_Ŕ4ߣo^K;hd=!ɸ[Ykw2K36vT-%xȺ.rsv =č~k~N=>CO֥>yR_~q9rn5o?ַ:ۢ߮[јM!ĄKz,AyOJ[㒜.&MJ;R~Ybٚ'Dntio߾9MkˣLOKT,x}<8.|;ڞyomϩcHgc9uM6N>Dnk<Ktl[{uVfh;s÷VG4&rSHzHH,+cwLU$?Cv,94a„R׮]k,-?餓êmh=~챭:OIǺC?9)a"7$O?z=SzJ/|d$%7|gyw)ɤOwi:th%RiӦ57RFU~ue[6E6UiJp@i|w͹ʃIr˵wͫ؊(ݿ}=I:C=6ʝwDG[˧'nP^[|1$o=uGԍ!C6|ۘ1cJzX|Śmh><<ʝCǐG{iηV<c,wuG0BIJ.|kwf-|*]tQ>*uԩԥKDͺ^!K]w g}R~vb`fQUPtӘڛT1uOBOʇ'ID~fg|$1$nep/㯿9:q3 |'χHEfg60kBk?I-kU@˕ӉhWMSlCqB0vx΋%&BU3]2'L hW!rRHZOv;hUܬtb%jy~`b""r[rͬF?'6z![hG_4!ެuBTk$q-ZhβDU[{u >^֣dɡv'jQzp a"7cpF_M{?e?c, lz~">?yOO:ԁY\,M Nj:zV]1tH{D~N=EDn:DBkcUگ[t ڟG|Oab"r[b"7jioʴB{nΚm :&&ޫ*0틢\)>$s4aCiNASK}.#%~4DRNc~ -%7BjUBEj󵷗.9rnLu/z7;WذFhQB(.wsh:]K5hvQ{_MkGJ!|Q+|Os~E8T7h(i..XE2=:*w^>e%SnΚm}5L&&ޫ*R+*t(QeS?1?6 SQ|kj銍e?ڣXޜ^:ZO5ҺģuB; r]K[J|V0B?n8\RE+lXWZ7!K SjC`#:h_tRBK{S5B(Yi]P~WBON/\mֺ &wHF?'m(thk/s'~="7a k_.i(iB?'~ -׭tS~+OjiCTqe?``iloszfg-ϻ?Zi8m}5Wi~NzVBEUիra#:~tNVz !\WqYwbcP NTjBm5׭yѵ]\  >Z4G =e"'y1FO /dMVZ!Y$= 己V}5mɤP`׭k%Ӽ!\\`OuyB2Ą ,qǴP)G1hW&rݰ>CU.s>ƭ?ϻ,uYwL|\#}]Ku_e5:ؘDDs*2Ǡ^%B8W>q0M C8Z˪ Z"GnzV@\[ G/3׼|+;8@K*Qٙ{a+!.9l~ .aC5 !wZ q"״ͧGꛎ+Z;eτl<ˇehNR5REJg%cLPMkjm]}5߱FO?'"r)h:)!{>-FMR>*!2cpm+Ql!C5wZK"rӳB~N d^7Ztyv iȑ5R^>P}DnIꛎ+ZeZ B"|XfI 6?=R+fgaC5QN&ws|`c"~N"X&EIaZ~a?z8ϽfPwB8WHiB\)Z'ChXy+~s\&ruwDa&%DT_ "r[Ԣa2:6 [&f!Li݇$Z^uƴw>aFuu%0v-ȳ edh?vn&l!oGbc'mqd]ۄu!\\sG hm/ Օוص"R,MX&>sﲽ,RDR?/6rjȃ\őDj9*z??/64 1'}qDk'-kiQ8=ٶECz^HD֩,u[+Z&!D|++.x cײ֛7"HKZڛZ4 pBnCya5ET \10 aP5}]u^k_wF*#M|k?Fuuo[fZhXjQh=>(j:Z7hp݆p ۍs*p de!:㫢b#v\A+k]FkO2ۖ7hxxB \)5;׭S+h˗BniGEE[0>A6ta<=].Z\! ˛[=q^L.sUjfvCh{\:/Zwak"B>紤a|l0ʈ3-k]~}"׷t"%-M- YM]&OCX΋IS)cpEYմn(b_-4X-+sZ""8tThh_kG) re-18O>+!~룢3BYE|xgr !6u|iI{p!c4aZnZ\LDzwB,^VҚNuG9B8WL"̈5۩7RKvsңӒtOO4,Z\.ϻ\w˛]Cccc.ҺJ!+Z7̪BiI=X&+sZ""8h%2EOQkdh~^ h[Fj;!=D9ʪ8b+FؚXwB?%OwMaظYkX~5gXR!_"h{4o}d:vC8WE/zD.}ll ie$1v'|BDn<6n "7Ek>*B?R6f\Ǡv6UPw#"%0]S=rRKkԊ*w^K„+t2^7;&cpFۣ=Rŕ"s*p hLjFcccαUҳ&.UkIC{ln|r66~0~ *.=Yov-%6_FD:EXp hfD fZ'>&s3}b44ċyFB( FADnz,ov'NFKmѬMLhBZs\K~O|`^ me*mc,T7|>!=ihp, !Wl\e}rܬ7՚WsGN; _i_*lcecqxаd#e?ZzfPz-WA{Z >hz\޷LjX1Ⱦw -2y++Lc333B&O-CQA ~²K=mv\>2m{4L(j wT8ĉ\ 0k^yNC諹b#mbpW7Uw}'|8ܿ-2c8qb9Smٌ{YYg5飏>j=mglm"~;쳷ߵkJ=*aJO=T?D-Js=w&_˗_~{Y\qOT?m۶u%NKU:jӦM!Un!1bDwߍ^[nK{XIVʵMNԹoWr6wlZ|^{Mu>'͈t]iL7}7}r6zl dTﭷ*.n63eO"oFVZڛZ}ݗeQs=YM*YȤZQc׶QF9Y\.I];p Q/:u5(s$$*D sRhcbRwڗzuL{}ZAk+i?"Z]>~jKQPܕLR+ = HO{{Y~mX|'.%XVteᄏ$袋NN:}e,E:٬ud !I*1k&2iUt?jE+R'Vkۣ~+>l>(kI;7g>C?.CZ])1H{9f̘m'.;vf,mrMZpD{{9<|Z9^wa"7.&.GYҲG?*ORlM쵾6yRq&yyym'nfMSO=Ay79RqٳIG&(Om٣q^Xn޶]xkJ(Ow6I^/&]l'I^}yeO6ohhhLG}t9;[IJڑ+Aw| ^dQ[IjUVy-:㚜eÓtHHGO>YVi߾OrsoLW0Lh\r%H/>4j,oq}?l'p~Ͳ"СCOH:%VXaqRv99C vi'&=I&-.o[ec-xhv+I3dȐ}6D˽'C\)n)m+_#}n2 .'BI~gg^J I4S,ȇ@9En2eʔ~W~*}]lHTesǞ-m1sNy5FTWvK.dj+>'iwN<\6l?ʽ*i4`ϻ{;[ecM7}lwNJo\qH?G2M{2&n=sRR/*&rS2w]OfIݧ$ǫQt]dڧʤvq;u9qR2)e]vr$%20s]20)24)yxOduH83. >쳏u]$RK>\#)0!u9ҐITeH\>\#-V&%yj-͊7_H2%4I!=&rsL1 c"< k}G s7666?^}_lׯ;wҴ{s9寿Ν:u}}ꪫkR5}{6m3va]vezݥ^zAtY15&~^pG.&7gxyl-L8q 'h 7|u&r?xVZ Ro˭qʔ)NKnM4iq;w,TnƏ=zeK)nBe7n ݻw[:ij\K/Zkp/[gy5XXS_ھ+{k]GY@P{?]}e|޻w]v.CP.Gylv.O>kw'6x!mڴM0d9rd=:K~H*N%[n9߱q!+uSN99˿b]竭++k٧r-kde`|Y~ǟ.Y] !(VIЛoyW\~K9[r@.<̿]NxJ_rT_Uhʒk?<|.uhРAg.>$5Yrꫯ:{}_%ם+gZSO=I.BP.vm)1M4igx)-v1jԨ-{`l뮻v~O>m\sߚuQ畳k~wadb-EK/C9BW^yvډ[_[M$=}6L3pE9/LC=k~[ k۶UwYf-]ǟ:^'٢O:S㼷׏?~^?|wꪫ+OIv>装r{mrg/ r] 2dz~!K.^S%WHW_}u.y晃?#N+y[BoɢOlT嚔kc=k[?]?[oe}&QYȕ^{m$:WɶfZh,@z~e曹{・%h]vvaK@OzD^xᏮ9s=]wݞWo{y; 4w}L';K~jv]/h.%\rHsɀZoD!˭ [~"kZKVuY9 ,gQy{뭷{K0od<应PV_~$`[^#p)Kk%h~Hs\&$tVz_>} 7g)NJ G^P'(W%yʔ)7{wA%XbbΝk7XIQ%oI8A-ؔ%\ =C/PFٟ~%T.5orVfu%vK}^xᅇ:?GkKr{|رm {_ɹeZA@Z sl&YU_V}V\q7o%0N/;K|.η[ _Q= B%n-$2pS>e]n--h6qǟ^UN8q :*+:5<)nկɇIFM}IaczGT4Ւ94y.ߓ’U>s9玛Y6rxK`|.A4馛>VE]tʇ# S."|X;g}Xu9_~yu l+{kSz5>3ϬeYf|H@z 䖯w7lGCڵZϮ[yHp?W[2*dKnkmnI\hry >l>T\+X5_|<_Z@$~akYuRQ>>%O;%PL${|T^-Jd49~m,M4^{{Kry*ۄ?lzI?0aBr` 㪫گIVIvZ\[I2EVfɕZ노9RZ ˢk{\2Kd{,+A+ s϶寳Ȓ"YOY_g[fZO?P9۷)MYc*6mẔY/ WTWYr\/,׷\m۶U/׹KX$SkyǬr%nڭd+ٯ|_XklVovN9|,ロ~P6dѵ~ޚÇzm' LUom>[kg^93:-ɦ+{1{_~?@Ν;^~eRs X)~]U6gk.or|K\~;?ߋ&[җ?=8Ts^ϕW^?Od!ӴguqYe6zk]}5n;_.r?f:uRlUcC*_衇^|^/E]tXsĺ{\U% V g/~G%$;_}U4eyinO{m;ܱ_;?)P A|dE]tjlYx){dM>'Y+_'ɬZmRWIVI.]LdEV=z>,V\O?Aik'd'*-xq^R&编_Nj/f<,޷̴ܓ'O7U>c9'UMjɮ{ǟ^z-xhE02%G?E;찋 $pG쭷Zfy*+ɲ׹KoKdt.jn$zV;teQ޺vmwwrI`dE/MAtYsi=ܣAȔq?*i\8Vek2m=  w}*cܟGرݟ_%dM7}uϞ=4hЙ~O<[UVgJs^W\q@s LYoiZh%R7xc,'_Km~hY'˙,qHw߽ݎ;x]wݵ|~Pw$\~OzexϮ[:N;4lذ?l寣ιG5dȐ\!K.%,]qId .-:uU (Zfeƿ~I_so۷o_3? cjɖYz%dqO+Ԓd>WYeul.>ηUロ2mT[eFK!n=ɞկ=9ɶQmM9hL2Z/8Ly-ls߷,rif'x-7p\*@ߕkE9&5Rm_ZWgy߫_{y%2cǎJz\^}U%I'tkRJf߫ܚSO=s:Ol$Ok#mo]%P]ڦ\{{?Rze j]ov5J\+_?#_~eg {V~5|1NJ#F#>} O@ SV\"q_$(PFJ@|$@(A$P3nO KJ tJ2`6*[deʟ]>hڵʟKmeСCO(UENYMc=lz_:9&h6rr)'Ki߾}#G{裏> cjZ_|vElZ]O @*I~omnyYgk%]˵&AcƌYy&ߩ J'N\bћUl83=3ɇ|Z9%Vt7y>G?>`޽{_Zꅋs AȔp CAuǟ%|Hdh_~y/W_u짒9wz{[$p+IzqHpWe0ܸqVxז%S*_/hX:z.ӦMXZJK.Ɉ:y.]tѩlST)=N)_'A Y_Vvq+/.uDIҿW%xPJ;%W2J+꫒t饗~{W /E]t\WK1w%i9 W HΚdb-zה0eʔžy$O\[n(9m۶5ߑC{JYYP O>Y|;w<Ŋ+o&l2z8㜿 ^vmj>˺G%$W¥Ҏɇd86]/e@Ϟ= rPQGu^xcRIf kɼ˿@$@W^#]"EV1ɺ(Y8lQ$0LjǛobWfvm)g`ʿWR'~|k[c#w%(sGZk ^;YEGO}$mwꩧ$IVu%v$^8󎒏]&]$# \d{@1 Ic9&|wsH /p['بuuFK(S.ڣG%n~ВuP,>Xp]PTfɕ,ey'./r-{\,%rdKve#(0DP.`\A>`^z,sϭk?L[SN9SN]tEeBP.`Ѵi:JoVzk۶vE2s|Wرco}皫zo?3>sݩSZh[og6h'C_r2ebnᓓ'OR ,xy߾}]lŦkdk7n s1#d]-2tG_^zW_uZx?g}6?|W^qz? ի=:k~O}zYfz=bĈo*{Çӯ_;$ Xڵ HҥFӟHZ/Û\hA@Fx㍕ +0N>mzlԄ o꟟z' ofu֟Ӽ_Ȗ]vw+?~2 d!Ͽ_Y5+r`ԩS,M_l]^{^~WP~w_~龜;N_~i?J3GP..]Lzʔ){:ukP} ʵ] qUW?>`[◴X>*wy?' !(Ȉdv]~j|=nܸ&Lеe%qI mݶ6ls_m{|]w>[]v.o{M+r-G* hCP.s=={>XeС_㏳cvW{・Yds 駟گZ/+kH]wݵo/e)rrwY dH2^|Ň6X~7_}_~ꩧ6h߾O~_^} 0jL3G믿~M7^w,0= 3fW]u~v. ԕ6mLw]FMQ￿T{7p+. dCDs7h'>^yfmX`O:{o.]&m)S,&t}$ywrKz_3k ʔ3ϐ!Cgu&\7~ѣG'O^X]v1m#\϶}of.{|{Jp|0,eeY@r v:ᣏ>ZoO<.;O?]O>E>~Gt%{}m-4hЙ[lCT_#A{կ]~vi'J %œ&MZ\~I'лw7`F3{^e;vlW\zv>\}} .[GYx?::KFP.`ќsE]t|WϞ=$#wV]uW?y|e%y $ݻMz^w}:rC  "(0DP.`\AP@ M]BAP./>iʔ)ɿ_{ッeY~s].Њ\(I&-~\!5AAG.CP.U@<b#H8p7tnhF.A XSҽv2dM71edn{ \EBP.r)'of. @P. o(ХKSLY, 3"(PAPAd hw}p t]AP@7p!!(0DP.`\A!rC1L>GqW\q1@Q4LpW\pGifPtBoJƍ[w]Z^}N>SR1\ ιK~P6ls_룏>ZI7|{G7']ԣGnj|^d5ݥ^z0i}Kq]B2v?|뭷oS$@>X[n :Ȁt-N9唓n/?{?SN]Gg}En75\{}mcaذau9lW+?/ͣ|>2Z} sdݻ _v>s):<'UFt_{U_N<餓N-=l8hР3wiۻt2yڴi%g9H_%o=^_x?7n s9"=w}wݻ;mFOH&NW_dw?jԨ-%U%1b>} /ׇgw >ha)g)S,v1ǜ#7tnidN^`>=ΝzMk;#Gu-Ge]v|;I/%1v.[4#(P/#<{ uYa/#? +_#efCt\r>y%hTv?۷oSkeY|'E#mݶs |Yy% Yguܩzdge+AL3^ɶh[[oEE8<^NܻM?Cc.ַ'w-V%5-V@!h Nq'Z "I%(,|99ygbk=y癝̐{$.ꜫpn֬YF~ҥjx'@Jr\W,_r$իW_^H!ә3g|rшWgSufxӧO?~ii@nd3g~ӬN:{5WSaɓ'0IiӦGFp:Ο? gϞ AGȍLg+(|JBBٳg|ܹR1N5\ r҈9s>:u갞={.ۻ;6m7._v}yg:#v׮] vKY؎ɖ-6!]qaDUTZ]s E(H"/^:rq.q5r#I, &´硡iZٳg{… _KA(Ha/~1ɓr/^dTVӼXb ^ZUb׮]+\P뉵R )S?h6rIӧ&O<"<<4޽ K5)H.]렠 pvv;a„Ѧ...7oniI\ ?,]`ϟgʓ'Ͻի|lhhhvڭ۴iS+e[ЪUM]uS}?Gǎcaoo|ʕ;~g9s|aÆ679RӥI&ߧRB@ Th nz֭[?~Y5jzYd ioq_|Ų˗چG=g5cai$?YrG;m۶׭[.ϟGr\[޽aÆz@RA(HԽu˖- .;)|zҥb<ȕ!C廣N-Zg}kgg˶4i҄˭˺|}}=z#[[n+5+}BX]t5{W]yXlٲ @(H$oָ%J\;v8 #-[ #jEeĉ4̹̙3?S[ sD;aT=B ]c7r3D(0\Lr3D(0\Yv֭_.S̙ӧOM53g~L1sرJ+VTұwy.]Η/ߝ܆ܹkǏvܹW^`ƍwtL2=ϊmӦMZn4u \j)̦ZBߣG˖-"庬gϞKZPBݧ:ҥ Lz|={,s"cǎ6m{tIիE|}}:t.[_Yd Enti֋/cwދu_}綶l _wܹ󚈗igΜ)STs1]7[Bw!1 %תUoӼe˖ǶÇWV!Ӽm۶׭[.c[j}sT U>rH}oݲe'$$Cr@n~ᶑ/߳gOze)S 6lԐ4y޽<{pƍ[_~Ѐi)Rn7޸۳$̗#GG 5CpBz[nזY>U讣8p¢`^V^eڵ)U]ڵkqF3HHXIڴiCFrN}_y{{wȢ'O,Ζ 7tСwb@ңq=DΞ=[Za\I:I௿/_.ڭZڴo߾5kܯu5ZtR~>wꉹ\DO8QA9m :vMʕobIbŊ]u<}tلWgѣGO>}PuX{{={.7nXr{F|\|?-\o/Zr]k ϟ7oހֺ}vsk"c%VE熭mx\+pskձvvvaQuO(R}ݏ_rMj'T߾}VVc֩S)וZ\z*}T *ÇQtiK>n;[n8ۋk?-u6,ɔ)ǏQwj׮P.@1vq]v]eϘ1cȪU&,A{WWNSK̵(.o֟իW?7o޻2dxuKӶmZO(l'}#FLӧ"}豔p3}]Py(Xŋ +qYg})#GG?Q6l}NF_|yS Wڷo֨X`A?Ǒ~ *P4וըQ@PPN 0a_?9?y{}ݧ|ɖu$__ߦ͛7nzޥI&Tk脛3qFAN2e4hyc^+BIDFvF'FD ٮ]uׯokNmL_+Tk׮QSABI&41}?_|wPPTR… %6mp55rI ekRE]4W7,qd˖uݣڵk7h_~ b-}|| EHNΏň&N8J3c:\r199c4W_te6ڎ;Wn޼Y@˟㏷&R2nUwڈ.]j8;;5=N>|@-"_7bw^=NlI~ǚ֮;#l޽k:u:Q?W^KڕvE{,BCC(ܫ2u=5jD#%mڴ!w-ަ=sL{m)ΈȍLo+=g#rK"r===] Fм71PnjzJndI]d4"^ֶm}I6rY%FܹsFVX믿e &%V(w֭k~+lٲ/8=z,OPE\K'*zmk֬?B +dq $V(w-=Z9,1B nnU".kDŽrSmquJ Mׯ_/ӬX̙9::ծ]{_ji(Lʵk oڴN8qDxT1멣5B:G'|2k6c 7"0kb;aK߾}߿ʕ+izh$ݻvScQ.x?-L'ĵifCBnK K-LOgb-%裏~qz.\>ydyVk,78 }NQuW˗/oڕH"Ξ=[: ZFkyfB ]7u4^Ar ivOi+ɓ'PpQۜ!Cf>Xqm .:uZ&(y.:^!ygWG;v4qƍݵkWC}ۻ񩝜 .PS\B f:j l7nx%k4=_hQÇWtu#wqiTbi bc;eM_%n|I 5R^BIPzxxu]g mڴ!ݺu[΋ϟ?Ϥ˵ewb6l&b_}/k֬OcW`sǷ3lѣGOrܴ}] +뺹y(BQշ խ[w կ_}phݱ!>c1"˖-{:QVݣGV6]lٲ/zRk4=UۻC Nzŋǔ_zH\wҥbq &wӧOڡC9|۷77ͻvJϳctM_:BǗ\u'7u7onZJ)] \,+W[og ,x#1֒-[' 6.F]em\֨CXOTի˗/38k'*J*~o #WTҴq\/E/qYclݼ,#.kkfk'*ѵz"Ǣz丬Q X΅ Jh+yu05]O?}$uԿYz޽{/6E,tĹnatoٲvڭ L|~UҼO>Çb jgϖzEZ*UY|yM+dݖ־_t{ ,\&Ξ={`|~_LEIxK,y>/_\iӦ'O,oLkܹ󚨎WwMuU7\e#G4qQKMw֭7sz GpctcB9WGRt{쩛3g·`m@æbc?ᇏ;V).Eu + A'0ĥ?OOO&M|ߪUM_R B YR mŽ{/_;q1ȁFXG:)rwwk:%bRHI^GLtZ#1cƌO5DÒc1>!$+%p~/WJ#cBWF۶mkQ@kI (q 6#Sm\]׭[.ϟGr\Z{YKÆ wڕZu˞=cu`VV.mpWJpԩrw F+ۃri,Y+V쒂بQ &>|Sal6 ;NPڵkub F!+WٳsuVNnM[Ո#&G ZkcBCCm2e.uߦ@.\IJ֭m_nk.Aټ62ecn_c{u=zdsر[n .Teԯ_O?ɕ+!?DF(@:+ggg˗{?͛_=b… ǩ~hshΝܹslذ7ߌaӭ[u}M"SO?}=zpa^wM&͂ Uoٲeq>VaWDWZz>}xrc mСCDz~Cɍ¯͓'O^+WcLgn}v.]{}~%95j=nڷoIݯ޹sJ\b FlnݺvnҎ9Re֬Y;IvӦMSu@uSLb3gN޶:뚨C_w?˕+P[lb\|W رc|O>u(Wtdɒ%c?eϞ=6M4Ȧo߾6Ν{}={… ۴iƦ[n62dHztMaAӚ5kckkrdHZiƏ?fʔ)Ã{=X]vmS;uT^nݺ6.\0겫n 4)Vmt:}뮫&))4kiٳg?7Vm~V8ĉ6xi6׮]5k.kkkk5!oТEmy%. :tznV'RVoڴ۷[6`7 (p3GҧOeŽgϞ=В"i۾}rׯ_oSfXwa *eS˗g`|`Vw˿[wܹ믏;fa3p@ IDž J899yihoq0wދ3g,P. ڵa&M L1RʑVZmj޼v}mHw]pa9s>y$[bIóg5*k֬-Zj6zYdy~lV^mS~D[Bkx.rח/_6riHDnzcȐ!344W0{+MW{}H^ȣGrTZիW$s羯7{${ ^񦎇ӧOrnFֶ Icƌ|^^^NFևmfٲe Rck:u^F˕+:lɓS7md?n,YdݦF6{~}K5OuMΜ9_ѣG6gΜN6?͹s^ט5k'|mTZU_^z6+Vɛ7Mm>|hsȑ!k??\D6y~S =.~?K9rxݡ֧}]8sBCCٳsu\lrqzqʘU " }ݧ}ٷ^Fv.ZORYb]ći}}}ǯe,ڶm~"P벳ٹsv2dǏmzDM66cƌ駟l dÇlذ!.^:lUnjbոqCL4wzIOׯ_zD?!6e˖mgQ`/~͍7 6mfܹ $Lʕ^W\ys.]˗̩fq4hௐ;5wHYuڵo~m\ϒ%Kd~P N8qԾ}j]?k֬OH[̙wS7Ը 8p 5.uMpBk_L2wQU >lx͘*Um"|+.?}4Çs[߿Aƍ,Rʑ˳;vM4iBͭP.=~8{nVX[[m۶h֬@dAAA:T!sΕ2BZnnnzZ!CF$M: }F{sȑ*]v]9^rNo.z*}le̘իWʕ5s3a„w-s_rMWW9=wvvKgvP.>|j\ԩrٳ.]˗/3]AؼyF\vvva#~~~ӦMsWX7<<֜:dܸqc54W(m۶nj3dɒ]?B^ O5RGV9s`ooiU˖-7˟46~ JL>}+JPPÚ5k:khӚ4iBjܵ !L]}||];SL{|С ,xĤD44{nޅ 3g'OS;,,NvFYf>4TX%KҎ'^z-iذ᮸^Hm  ڼysKu=ydyɓ^߾}ɞ=c`y4Y˗P7ݛ7o0-Zl3+TpB't;mڴ!@Zji޼yb;.<9sg...ۯ]ԩS:uO8Qk׮44W(O>4i6iҤ{ct,YtmçϟH -zY]54~7oހ4;k yt4i҄[2.\FرcϷ:tv` !T_X_ݩsk"_}͚5zXb\fkԨq@[Xb79RE_[lI"/)>>s-((aݺu={li)Rgsiƌ_]Νy```:=~1.\(anÇWڵ*  vuumͭHtB>K0`\o޼YΝ;Z@@@uwYfͫUv,P.ɗ/ݾ}w͛!CQ?M\uR yQB#ģ2WX}ԩn߾*U:6xt K.K.54 E\~-Pg9r<2>ٳgQ|Rk׶ٮ:uz-#?k::iN(իW̚5kвe˾xEF7h}Zͷ].LVGqڴi>>>̭ƍB;jԨ)\Vn ܤ@~ٚ5k:cږM6uZ1bdrZ?|K]v9R%2e\#jLi[8ٺuǶ}m۶c`? ?-\o/ӧOСCEwLwoڴU\ ZwJ-IJ+v)cʔ)sFZQujyA.}| 胢d͚>tR-[n {v]FbZΌ=zӇF}p}5t%Yq~B?7oހׇ~Ç9c~xxmL75رcf̘1D';;I|)ӤI;LYXi~zOÈ!%Kzihnbرj֬ܵrX:Uoƍ{\oʕ끾'O)w}ךڢM L/m@Fʕf̘ō7 OL2e:J 4h_IkW еjj[o>ϛ7 2T5mB?C%.h ӿBu2]7yzRSNSOA T@1mMyɍ C\޼y*Ӭc*X6mڐ#GNc?((ȡvvYQ}~5z5tzR@ZbccΝU;K,:1A8) iĉ6mk~hutuRk:F0]d:E 2dFB]$+Vkn] ݻb Qf4V^ܫW%EjժM?[l$?}v/_; ihJ:w.\(BQ]OoM\Ο?_2 *|N5-ZrTE_~}ۄԴ}n稉Ÿݺu[UeOu:p{zzkk۷ncÆ mk=Oz]6lKcҤI#zXRb%9g+?T߼ys˽{1/^;W )ĘNړk=G+Ut,\Uǭ~Ĩǹ?w\)ut@ꦭWZU']vuNqrrbL'A$;y1gWڑǴ y 0`v1>@RC(@裏~Ph&L0Z)nκ& i榎;FeT۸_|&G1>ߴiS+uPݻy={9((!f~Ᏹݾw_Ou[[r^{rah̙E,b6#Lt?֭[?\ׯRw 4ttt]jժx7DW'Xqr%%sks:?z(NLiժ&[[p>K.5LرN믿[Ν; 6UCs)Dh:h-Zǧ͛7 hW_}-['qW硡iz݄w^{WS7τ ?KTĨ8Kړ|F DLxN9)ت_?|K?Ԉ|2eʜUHYQq^pk =IDtҥbsqI^JodmӴiSߑ#GN[#kDq;4LCUn7:8fC'K% ڶm^=s`m$m~ƍ ~ŊG+8WPDZMoZW^B|rzi+,Y|ӧ֬Yslk:yd\%'W9Y4iB;vF)f͚ήsMW[;k|O\gr~ 12ԨK ژF}>朐B-gg&Lɓl+Py斖݈۳Ƕ|tuf4k[l{\əϚ5kڵkt[~ ab;&I>O9jmiӦ 68L\+kr<<^)[8G )V%OOO ߿{uGrS[sh5 e >|JV6EC@b" ٲVrʝzqo9s>T(-vj9rHQܤIn\oN:{W[_;v?gqޯ_Qٲe'ڵ[.^:u֭k7¿&"\wlȈxI7Nlٞ9WfZWtHL[mg}B7sHN*{~Z:Okz,i{i=xVwFϒX땔8O@tΝ|:!I[,'4h}Zͷ] 9(G~~~:)J[޽{ytڵCBB }_D&M|uҎR2a;vҌ3;N;w  "B 2ZdڊYO5jb…] Ү8W۷ϙ3u޼y^xќaaav0nB( X6?~4~ܹog9]Q˟?S< ˊ+khbiPgv;mڴ!\,[jU׉'vZa+VNNN^ӧet}$L,Y{AAA֭k7iҤgϞ-mncǎUҎ)Rgsiƌ_[\r@p?w\G0~ժUytk;;02tZCp[f'OgϞֿzjWW9+ܭ[Ç.)\$]|ے%Kzz*7nccիѵxlmmÛ7o]tݻO2eoSvͩE'ihPp۶m׏5jbҥϚ~|IÇΞ={w4Fֶn׮ݺ#FL.[i#k _۷77/^X)0009֬YYCs6m꫐n:uv|qرvڙ3g~ֽ{ (pHފ/~Q\ ݻg4qvsjO3 e 4͚5Qh$P.$/1nܸk *Tzbԑlmu2eΜ>}lb)?裏~0zuݓkJ RsHxY9+88~ڵe%^Swwދ8;k֬O-O<7͟?iٲe_̜9s [߿A- ;;;ҥ 4>H={,{L>}͛7 ]B ':CiӦ 1>RL2=wqq<,,n-=ydys_x  ۷Bͳg qf{nޅ 3g'O]~ZnQti}||[޽{y#iW({\',Xuv3fbŊ!!!C&M3fZjmdm(~ѣG+Ϝ9sw4~ys:khߑ[lYz˗/ܵ ϻu4?w\_ LuҧOjĉ 4+}Ν|q]|:x/^b\cÇAPPC\תYVTv?ު7d5/T_~e˞:[9R%0~1>} >tP莩_M6Kmq駟~7;F-[|Tt~G?WuG5qҤI#M`v޼yHsHx|͵%9T6 5vt۴iA!ܒ%K76`-+W>z._rٳg\tiϗ/_f0vXXƍ.3&ѼyP.P К0aƍȚ5K.[fMguzU2d }TlukժզzիT+C />|5m⧟~D4?^1.!GP˗/5];w...UXK )yĉ ?/_C[ywnݺv;w^c@VRc ]Ga k LI&k׮4pƌ_ܸq)S zj5N;v&zWMHM)H:vqKS)@jn:88q?$z|_9sLŊwylٲ=hٲe_̚5knOARJ3ZwBC(z|51s&nA(rzпss@bZvo^tӧY-ZG?x hbiޓXG()gϞurʝ^}֠u^[itE^vuuH ԜBm547]ÜӐr vsspP.7nȁԥPLC17>Aم)vjxum)dY` ݩk~ޙ3g6͵UM6$*1H. Q #S(h`͇>%rp-[4_xqȡQopp}lkHXё|?~5/kۜ<2FB^s#2s+SӧUsWR CR4Lte+ݷo_ms_rMB}Y4tXe`u}ckkA_=!Sڵk7mJ'NT{ngϞeVnK] ;vRNa={\j@nW/GG˵M{\khs!"v 5FM/_.f!1~Ᏹ'cƌ/}"\)+5k1ٲe{bZ[CBB5j)^!y;KFf%`}?{K. F:QF; $}]{ibދ^{Qn޼v e~~~:qYaݨZ+ܶmGݎ]? exɔ)szɓ'r(1꤫-Kz{5HP )L6ua\F}Æ m8P#.oF^shhhGq3k?V;\P^!y5KFf%9PG2k֬A:͜Ǣboo.F *xUzO///'¹x\trr6$Xi~…bʕG'WYzn5i{tk׮ܵ`uN*Ϝ9S7o,MW~W\Twܹ5.kՇw&IxРA d)]~-0m+8W7ضi%K8?}tٸt6c/Msf̘1ƍͭߠELsuž޳Oy`IrX޽{먫:F!oӈoURTSވsLlEe˖-htYEܿ?MZi;wF8q(Vz8> ?kVܹsEٳgK(F CaoGHHHZ>\U[Gz :9l? zu5L9scn}2nܸ+.Cﭘ[P.O2dȌcǎUR`׮] _^H… _Sg/bYɒ%VK7u}ae˖}'*hy7ܹڵkub ETRL[_z—zR4qQA\r=ȓ'=uTTO]Hr{QQ(NN:t9r:F>^4¡ ouhPRcիW?UT|Ҧ齽;_: XRS!<അe+q7;tmn]KH ʒ%K4{z\t— ֪U={.}wх哺>$%=e\KH9AtNѿFֿSzLR7Ms?~71v.Dk72|)15 (hѢ>FRJw5b;V]M['T"E4h9u\G {[ ~jz1I&Mw15z;^^^N/_.j Nh=k2걢BMR\ږ^5CGFk>7:u0__ߦ}݋Ntk۶zpuLUT9z.XK|esj5kt0];YQF;];I \XŜ9s\sl5mu  SS|ɒ%Ա51W ݪIFݻfO>:]@Shڹ̴{v7o dn}LsՄAdjs*e{ĭSD XC]M߿;AAA겭ٳgK]7߼ѫW%2dxit}L'Fܱwτ F?9Rk׮44W(X \E}扽ܾ};b@<}4ʕ+M:u%~\A͢c!K.54ng-Q!ݿ/_\T\Ί ܜ9s>4>D(}_i$:s]zȬY-[/^d4~ ݧ5o|ѵۙwi 5r7nҥ lӦ͆1cƌ/YyscǎU1cooi[lY[/_ 19::i'Nڵkۇd```5kt\[5icǎY~s9*>g8ԩ (943vLc!Cf*T P‰իWwݻy.\wΜ9O޽7gΜ˕+wJFo~Jh0;__ߦ۷ooo߾? K\(QG}CnVڭ̙3e-_~yիEr…5i=z,/Y^cb}y;wl߿[Aܹsϓ'Ͻ"E\U|O5k]'<]o558Pڵk>|L{w~O[Zg K=Rs|6>-zYhh& z;vha+ѩS̭H+Wv޽ ӼQF;ᇏꈩ7kmu,_Iu"6cQJy/((A'(I4 NR]|i粈Sc5W35\&\\\<ҧOP.zjغu +2?- I[lӦ3kժ}jt9s>6/:]B4}}}ZsVN1uk֬;SXur6lTSܔO>"rI&v 2>}ИQ9PW?ui\wt\K(%=eŊݧM.FׯTұСwL'RtkjR4Ǐ?ƈ&.]* =_#GG$rX Bvu,S̙:Erj޼y.m'efoɓl;Zr>-cjԨqok|)-/^4WH4.\K1ٳg/_\TTkϣq]x"4h߁7oOoƈ79d4`ޏ֎i+ڭp̭H(q]\W|;V)nݺ{sBC\j\h èى'*D׫W/#+:t B|LF'.,8UziUF͒kOpۄ\/k ͜9^R1Fn׮ݺ׷5sO۠.]'K>YfM.]6|%z.݅PbW;wyxx;o7 $rXTƍw)?*荬~jjjٳ澾M?oYoD\dʔyvڑ}MjժwL(/o[I&4.#%*UtdɒQRsu$=zu$0$D oE={5v`瑥CCmyFϝ;~-pqqԉ.F .wgԩ44ȢtR[0-Zl3 2dȌ:xM6#  )j޻w *Tztiڴopp}lիСCk(.TQF;EQ) j ZkÆ wEwƍ۶E|W~u1ݻw_q޽<3ĵ~jECʕ&dw}pyf2eʜ9|p!xiֈ\r=: ,p¾ Mɛ7]Ν+|Y9Hٳ?֙۷oo>~1w[l(ߴu)Qą &5k֧/_.@!!!7?x;odE|3wXArʝJJgÇsV^~~u͜93iif|/~Q=zCΝ;-[ xZ5kfϞ=Κ5k)[|o`PJ# Ϫk\͛[1Q>?:NѢE/9VGv:Ȓ!Νӌ|;NѿAFf.]VkhT}||)kio?lذ+ܭ[̭0\`\YblT1 mڴ‘ׯo ۬B7nFR_(׿|. xH-^B PpC?GT(/ng~z!ݞF>[l$:_|Ų˗$Ў+uK)T <5f̘vdx|zs?J~w5:Gjo?S5gRxTʕ+okn]TǶmv:4DWR#K?'̙dɒ^^Jot}Ա$zy5L:tڔ)SPvͩE5khP 9r$gG(V-˽b;N*xh5ЁjXc FE Yrz޽\u曎:I:ib6l47X@]44W(iӦ\陻v@@*cǎo1:+V%OOO c4qvsjvx0]F!UVۍpr  _vm{myFϗ/777uϔ)sɓޗ3iw3g~z!sH~d⩡yPPúuM4iٳgK[ѣ3 8pvϞ=f̘ )# V\ÜFׯZa777:rppҥj m}||)w:ֿzj4y֬Y~_ >|Jo[B`!/_.tҞ/_`t ?~LÆ w]N͛7߮a߿ԩS6UhלO>:w\g  n۶ѣGO(U9sP.ȑ#Uf͚5ۻChhh#kkn݈#&-[bo4xbqOOO///t rXfMg  nڴBkg@9~;w62v̙u} 4>@B/^B߻w/ς iV'^f {$͚5Qh8_vm{mxԩrFϛ7>},rssȖ-XJ}i Ĝ9s>4>@jo^tӧY-ZG;=|0UT92p;v&M4:9[BΝ+et}}ѫW%2dxit}L'IO9Rk׮44 A(Vѻw^^^NxX/;DFg!K.547z+W:GCsvNr$yd.]˗ߠA/ѸqFم5o|2???iӦ+nkN}$Z+ܶmcƌ_d@@(@s3g!444M˖-7+[|F@a_pv^ZbE>+ rXfMg S&MWHVZv\Եǧѵ3g{+`o]C%.xyy9ih~ݼ .;g'Od3vXXۊvgrww֬Y3[[ps # ͛[Sɓ']?o޼wuN])G4Y˗P7ݛ7o0-Zl3K,y~Ȑ!3tyڴiC̭ ! 8q(u&Y>zRq6l-C /-&<<Ӳe˾1cƐ7n4: 0`^޽K.H㒋k׮m?uaN*gnϗtrrtrGlٞ[@# ȝ;}^GjԱco-:tܣGr_UZj>ܻw/ς yzz<~8`ooܥKYwΝ̭ݼƍBꢫ (pP.½Yz|+?Gʕ;e5ŋrFViӦFXNFoǎM#GT5k ooi̩ٳsu\vڭ1be˞6w,P. h+iӆsi\rʛ˗?I&̔)sK$ eop[#k;88mvBK>kdmhUT9z._|ҥK{|29׬YYtYƍwnwv# _|2uXuQ; F7lpeW >L'ݻf?jS5-ZrR7x_bEwtn5j4Ϟ=cukݺwywu5~֭[N!ܳgϖ6~"E8p:g̘$W\7ӭ_?>\k׮44W(uW_[@RݻشiSΝ;yUyqv///'˗?Yl QPꄗ%K]^B$\YtԩSݾ};+Utl3ؤK.K.54 m:~1in˗/U(WCܹsׯ9r<2>RVZmxQtlQeOgjDرc q\zȬY-[/^d4~ ݧ5o|ѵ.LE|?qڴi>>>̭ƍB;jԨ fn}P.w}3f%KR6sرJ3fv!!! 4iЯ^A#ki~ĉ _```:}=>5թY~svrt͛7@CK.3g{<}?^k׮44W(c2f@JB(VzX#@rw?w\G0~6ljV6چ]we;v43fՌG+jhPpnVjo2>K.3g%Kzümڴ:׭[w$m7ޡa>|ٳ~7̩E44W(]v^d2eΘv 9! $CUr6mjnkdmuo۶zv\zu ͍llf͚0ah # 8uT7n (W)k i6y{kt}PŊ颡sϟ?>z(wX4VڡÇOiժ&en} o^^^NxX%9[BgΜ)ctvuu3`y3f|at}Wܹo[jU׉'vZask6ml0 vqqӧen}  eŊݧM~֭7_bC ѡCiӆ].]^z-<,,׷q8p/]TLM44W(_~ ͑##sB(H;wp7oހ/^d4~ ݧ5o|ѵvvvaz2~~~jZϭ wuըQ&.\K! +N>}ڵkۇ{nҤ F aj```%KМTTʅUd̘E\qX@l]t+VAAA֭k7ygΜ)cncǎUҎe)Rgs);R Ż~;wGr]jժ<:u] sppҥj m}||)gϞֿzjWW9+ܭ[Ç.P.R˗/p[dIW^7~ƍw?~Lz266y5L]vF1lٲ իܰaCŋ===]hf͚+ܴiS_tԩܵ u dgǎǎ;n9sgݻw_>@70F/*{,X?nNmuia~ 6Yf> 횹|@rۯ])S>}wwދ8;k֬Oy$4h> u k޼v e~~~ӦMsifn{7nX  ѣ!C(Tus # :qDv!!!>7T4i1cתUo#kRGGG? ѣgΜ9ۻChhhsj?<ܹs54{-[ܬN˗?iE hKp[#kK.M6-Yy#kRʕ+]zu ͯ^Zd֬Y-[ŋ/2S;,,nƍ5Lv{ؽ\Fo(*|;a„w-ʕA;;;͙3CQ"EzzzhhӬ+W6uaoon}-Zf+qQΝ+enGVڵ* |+nnnO<@EL>}Çs]J*G8!K.54i}j[ʕ+oy gѐ!Cfhw9sXr-7{K. FoРq6jhѵ6[[͛o0]`ԩ|}}*kN}5Ϙ6m mvѣ'*Uꜹy*z)㜜/^kȑ#Uf͚5ۻChhh#kknç+WHԠbM .Ўt+WloN 5kt.I&+[v}C( s;wldt̙3?޽CN/X (QₚZ[ݽ{7… Ι3ɓ'̩fLtBӚ5kN# J荸͛7;vSN3~޼ygGlٞ]Ho?{,{̘1cȍ7 [߿A- FnVj;s# B]di榦 }i멜9s>4>H}uѢE}Çs[_D7n4W(x;vM4iBͭ\H֭[N!sΕ2|sssիג 24>HԬ}%&L0%ͭȑ*]v]yѢE/s H3g̘1_r壃  2.]<,,׷Bw-s_|BʕA;;;e?+W9{K. FoРno޼vk.L1Dqڴi 놇ۚS_ Jƍ7VCtifØ1cƗ,YH*XѣG+Ϝ9sw4Fc-[?ʗ/a?v\bE&֬YYCs}ѤIҭU 0lqfFΔ)=z,:t 0>@lICw]pa9s>y$9KYL6k6X\xC7onN'O,ot}O8Qk׮44ϗ/}2pYf}jn}#޽{y,XٍvK ҥj e;vh|Jo] (Zensϟ?>z(wX4W(ͣSN_م[P.HQ֭[nҤI#Ϟ=[E:p={\1cFɝ;/MtV:qQ׮]+lnÇWڵ* ͋+v+}̭RB m-lh^z-ƚ)C@@@+Vt:u۷o7~J yۍ I>O>۱mڴ1vĈN]>Ӊi}||[Ǎ7VCsUwԨQ .| ! cǎU1cƐk׶ 1wQӤIFJY*-4sږٍy}_s_1qtt0͏?^qC)000v YӗQs?B >󯜜իѵ<{9L2=ѣ!C(Tu@r={ږ`nt6ᖼJŊ^wfĮډDiE\R2۷7|ȺXr@ݻoGPP޸8zhezz׷:uKȝ;~-pqq̑##@rf`.\IM|L:uYVX]Mcnݺhbi0CiӦ IH͓'OW}qֿ{ V`'qukIG?2]n[jgΜ)SD q-}VZuĉ]Vudp7})%r$Yd Kۯ]ɓGs0s?~b׮]WihPǀe̘El׿xb*Uu9::5lp>K&Mk! OHuo? F^hhh *Л =su~QVZCÇҪUM| c`.\ɕ}p.]Vk.۱cGѣGOسgO]s߹s'߰aæjhPpnVjo܊x۷본ڵֺy1H:(|29tPSҥKrʛO>:g%KzUz#ףr6m;rIucdmH 4nxiϦL2|ӦMjlYFCsmۮ߿|fL?o+W|λp¾[?)w\pJ,yeD0@.@9nذi~ܹRӦMs_fM砠 sj=zrL/^9C(Çs֨Q˗Zcښ`s HJ*unٲe_hh~=au{IF8pF\L2=wqq<,,׷qƪ%nsĉԭW(Q%n/Bbݺu[W_}nYd o:6o|%,+.jժ" cgg"~VRcǏho%Kر7_u'#k ڷo_~t,:P.$_ ^pO>{ 䪣\0OƍwȍHt6m?|K;hZv\@ppr6  5ŇbooHۡCw^RFo<6jSv} "8qBʕ4$./ZX\@Ev1ݸqc .b 6,W˂+80Mu'VVV6l?ŦM^}_WA(X_@U4 LnnŤI~ǍgQR%SZgs'OZd4s玅o3,<==-ve1qWݼΕ+Wt?~֫hٲ^co޼i1bݻ[DDDX)SsݺupCٕܭ[7Xf^8r9sX 8LBBEPPŹs^;bzhc}z/Kpczk<@aCS.?Mo߾]S׸5knڴRPlXܿ~Q+Wu4x3gδpss7zŻkj.={ZԮ]ػwŪU^}~GGZ+W:tE=,jժjQ' K.YO111oՇzEF,-[˿Zd\_}E^^ž},Zhj!\n]C1ّ,\]]_RGttxbȑ~kӻw?*4i<@+W|oܹbѢE*JZ?x5b(hʅYDFFz15(XДE֬Y/ [\|Rd=YX[v¼^z>{</^ӧo;gmfQl3Ut7! ={Z';QaEǎ-222^/-?Oswر۷oڴ5kf1a !?e,7^UE'?ה{棏>zE<}TZEc}/5xŒ\@ȿի׫ݡ'[Wlݺb;1D ^];#;Zt-[*UJќ$ Sjvcǎ}nU]zWFtFyR+**&&&bz ZX,^U./֗%P{=xMo,N>[. ?"׭]ܿRpErriŴhٲ1rVffENNΫkY-22ϟڽ, ?+;[}۷y̙*6rMPԍ%K`ku~[J8(^X_%K(`xM0 [[ʕ+?g9Pp&Olm?|WWԩSLjUQF?~>3{-֯_*C~{0 ;a^}}W:x5jrE%P2+XJ"ra-'Qu(Xd WWWΝ;[ܻwgM6ש\ŠA,6l*-*ʢwf0+~'7nXܿ Z\|"44q/XTRE|bٲeOYf*WΈyyoѯ_?*]ŏ?h׿?Ev,.]j?wܫzzaG?@`} X xΩ\Yƻw?j3f̰۷ErZ>da|u?ڵk~Ӈ\bn&M9ի 4_-,j9,W!ƎzUZ$&&z2uTGYxzz]ty 7֗%PxMKNN+C6mj<&Lm3ӧJs[E\\ܫ?Ŏ;,8jQ*׮deeFXU֫kҤIkN~+hv___zER Sv4kw5ݻw[9rΝ;v˼˸RJ7h޼W @`} X x↦\+W(GvJFF5o*aݻqƍ{̛7USTT文J֗K`Ӎ5X rh)P\@!rh)P\@!rh)f1bĈHo]㼽##""F&c)P\@!rh)f1B0rh)P\@!rh)P\@!rh)P\@!rh)f~k\ Q1є |]ygk\Ͻ ((g4(1ܗ/5N^j]~?9B#k׮2{pK|wܩ![lyz„ *G)K^\\˔)S9r1絶8piӦzw.sJ6\r}!CJH.'-_\rOф[plll|||$$tժUsrr ]wO>.]ŰaV˚X(y.\XB @FS.˖--'nڴi6l>kI\]]JhnsΝΟ$%$ףG^&/m+W@Ji:ulrԘ҄\y-!;:/JGEEyIH.kʉ'Η5l:5V?Zg 6mzӡ)J7]N̕.]tl1cF9ju?ѓ'O^px9YNU24͐.cjZn)@BnյkS>ggg[Yf8%\(a~ǿo+:::5j9jH֭OFGG{JH~ڵzK,񕓊={VVvr"Th9[i]@Cn$$$ ,xb,C=zh޽{4֫WjPݿxiL]0-r:rHƍ_rJ]cGLs?oQ ޽{U/_>Ju=zTQrollk...q3gΜޥKJkPЄ[2s@ 9I@@@Ȟ={z:ד+W~ s;6\rOT:">*U)J ++SNrrrJatiҜh7Qj{_JtUV  V:m۶M4iҼlS:? SNGvS>Ks-[^~s>xr```rkMq1q) h6M17##N/?;v}v펛>P>>>aU6m8gΜ)/^ltĶ1ڼAWeСCȋx0pJ*+YfV6}m-Ϟ=+kΝk-ٯ_m-x{E;vgӣ)f1bĈHo]㼽##""F&rӧ[6j,uc.\XQ` 666YYn۶ٳJrJ%!yjRFrܸq*TXG.J*%$OJJj.'ƺ+W֥.c&O}v&`Z4@ W^kGжmDiV|؜VZJNNvrttL5W1YZZ湺n~mBBB/DHII&/h%$/_9EwҤIjԨqGpo7hE~͛7Oe Sn05r̙3d kZV3>L2M]0=r[>klffm&MKcbS֭~ m~̙r=ƍ)үɓc%${?o9a xs40YwwX /_>J~Zyː!CJH7mڴ9aFqgԵ)__~KuMKKshٲ/6*] sS-DGG{JH~ƍ: .O>-d,u}*!f̘ԡCƨ(.hEQboo"! ˆL9MWD##,=?쳯gϞ=jժU;;p@TG}ƪT*AS.7 cǎ 5ڵk011-W)S΍0 ҥKHܿsssKm۶ku&\'7:usFϨ(/ kժuK*u0Zg\ΝUV-)f1Bۘ1cJaPP ]cO<?~Cڗe֮];d֬YnݺUK)jժ)yq+'Y M(I\\\Y|̴>d蜲k׮BBBuHe0Fqg\wB)H\|Q4 4Q2e{yyEIH.nٲY:{l3)JC Y+!yݺu.e˖}t~\L݄;{쩍5h̹S͔R$$yfmjժ999V+{?gkkC5jԸcvFϟoXJ6u=|he˖oc]c7l015,,4Jhn3fڵkW/_~4JH.F\J*=T:?`,s4ݻ}cK.ڵkߌ\إa 3;;:**KBrY;N0aesjj>6lxYfgM]0rjӦM1wΝu 6} (jΛ7o͛Y*[Ge >|h͚5o+Mq;v|5k g.wޭn蜲v cǎ !!!={mFqgPД x-9}9EN\9EY۶mcbb<իWPy*/\̝a'˕4yM49v@&\dM%!{ʟ+V| '$$tի.3'z]3V@It*^g)ӑ#G:5n•+W;zer9j_UiJJJ5yxbǏWP24[S ԥYfMܹ! (xUV#!Ç Q277Tll+W~ s-[jJZg\Jv}ES.@'++SNrrrJu91w;QPUV-_IɓW&/o)_Nµ_~,--ApM6kϞ==9/MFodҤI~ %$o֬YYlh4nSTjS̏\^lmm3ϟ?Ds322tS8;־]vQPܕ/_P$!yVVͦMJåKQ:||s+䅫44hCҥ_(EM@&<==%$ksCCCTgϞ5t޳g6ϲsΝ;aÆU;Px;36{P|Д ЛCӧ[ TYPߩS#.\hܠA+(IlllhӐow֬Y:*_^2dիWx̘1KI_(h*U<))~m۶~Ιg.!]ѣMUtJ5)Fիwѣڶm(/a^76''ǪUVSU#PIӃV פ"$$$@VwVuh9rʉ'Η}s͛74iҼ+W40tNQI֞w+v(P*}}ߗ)S湩GS.n|M49/rr9ݺu/Oܰa iW2Ǐ+*'~N>}&ח430+!yzzG͙3gʓ'O:ŋyxxhs LIƨ(4>4 r_~iiii-[<-/eJ.att,hѢq?rJ斫֭[ҤѧO_Ծ}cƨф P!?ltuݖ:qqq.mڴ9!eC#"fTTq* vw^U}ƪT*\ !55'Lk׮СĶ\]NNNaaa>˟e˖J-m۶~گ9;;]WW׭JkЄ T棘m.͵ƍ[$:l5k׾9uÇ_eeecVU{wW^\"cǎ pgΜ9]ؓ'O裏?4Gmތcꗿ<##|o߾]ScK兮WЄ ĝ:u|̴]tyMzQECyfmooH e3ghh׮]n\4>+MA9asŊ_?|'|' 2$li7n{ppps*_ VBz]_K^Ɩ-[pFr7nܨ3gΜ)SnN1t^):{Сkd#8t;;QTjS M0#FDDFFz'M8#QZ|(91oXvppH 1GmC^zzzFKh&חJȡC:+ڵk|}}HH^j{_| +UPEM:uܐgVǏ3tN%!2u٣FZ^tƪ0Zg\ 4o<CS.h6m4PNݹsgo]cJcg6!חJhtKo7//Rݫ*'qKHnoo>lذbYiM#Y';v|ʲ?RRR:zw%$Iy9I;wP2w^^mIh//wMv Mf:w|h޽g99Wֈ_/erRY```͛7OcU7VUSTjS M0ɓ'?O]Vz0=[[7܌ ;]]\\?ޮm۶@P|'rrYYY66m(&/_ntxWAhĉ4hCҥ_(&\0YyyyEIH0K,}yCMJJjI6l0`ܹs'7lj@$˾}(hʅYԩSDAӧOlԨEY߱cDŽ/6_Us𱱱􌖐\ ݾ}{ߠǎkt3gδ2dZ q-ʕ{t~Pф #ϖ߶rrʮ]z:ܲ.!}QO2el5V(@&}n7GM`є 0z]&rx؜-[NNNvrttL5W /yHUB5i ضm[?߸q +Txȑ+CTr_  :ݹsgo,ϙ6o< 000ի 3==^֘w+vOjZϸ?e>3u=є 0֭[k[dklffm&MKc]9Ptm6?uT Lذa iW2Ǐ+[LrԩSg׮]@G. 0+!4044ӧ … =<_I~&{lly\dù|3fR9RJW СCSRR3VRM](hKíO׮]ױcDŽǏ@onݺ|$$w^˗Ç̝[J^4w;̀&\(&m.͵~~~Ϝ99冧ȍ*rWYYYnjZϸN:QS rf5vpi̝9st]cO8棏>(Vz/iIrU˕?J珏wLy6mNLOys+Mn7nܹs'_peCG6_Uِ0bĈ2ec4.4 \BBBGi<+u5jrGGTsyIў߸q… Wgff*[NaZnݧ>}f;&~ 3i•w˘҄ 0Zj݊]CsʿM'NVlgƪơ)*TxܣG=&.24 Uӧ[:99%:/'HJcn^v>ХN:7|$$q+WH߿_Erv۶m$_svvquuݪv MK.egg[Yf//o:gZZC```-Z83o޼If`8}rU*Ե‡\@`kky&Ҙak|޽w?~]۶mQ .M?ڵk̞={͛7k+?>>9W-[<=a„rݩltP:?D.򊒐\6/X`’%K|e]hgΜiݔiii7`Ҥ۠A+ƪɱڱcG}Jr\''6j/t~ԩӑ˗/7F^s*S/f۷ӓd!C\^[,^r*%hTrSppp eݻ{:g^^ellFZ>eʔ9˗bǾp%-\ō7ܻwqUV'?&Sz }Nf͚MNNvA)Gړ4,IΝ;{+_^]"!)/i}||*W@M;&h?f-[&k׮3tt ɛ4ir~̙4]9UX?jJq|e˖}fz@CS.bܹ###ua^mڴ9!L_^L͛']~.A(ʺu?..E8q͢Eƭ_~U2\4CBr;;Ç8qZjRZ;d3u4I19wwX }?G6wqqe˖-OnNѸ3NRM] (hJ{ootMII&/^lTtLM6(DGG{JH.''-YW6:s5dddɋ^ ɵMOҴ۴isƨP|ф ɭ&;w|uW2llժ)lkk9f̘&MWbGƨ$9|wޭX777MBktG#j]t9 իWZXXݫ|QҨѣJ斓xEor4E߭Jkm4`~a2&&Coݺu /]sʍSruԹ1eʔ9W}ugjZϸ;&[P8є (|||f͚5MأGv裏{#sjժV./W嗷/)Ihm&iJ liit~@E.V ,,[lܹs'?~s޸qw9344_ƪ8h4nSTjS /r+V|k'|K6(,e#YYY66m8gΜ)/^ltĶ1ڼAWC t/(84PeHH4mڴY<,//yecfvg>k(_ZcPT]|aRRRs}ƺiL](hʅYDDD(:]rE{jjck;::ʕf( %y-!ݶm[ٳgO=rH'_rA%ȑ#W7nQ +`:4P899%GGG{JH.͵'Nĉ6)=$$Yӧdc&(=%^zZly‹\@~,4888)! ;KK˼ם i f]󧤤T !!y :tͤIըQ %Nn;\_6uݫj蜷o߮cfΝ{?nLVRԦn4;wk/^GNsFsEMnKh3gδ7n/<<|rrlxw.)hZ򊒐֭[f͚5mժUsrr СCwO>ɹr/[vÇ]nnnS 7rE\ްaN~+\sEY-T]hѸxi9%sL֭TBriӧiСQc%M@_jպ-!;:lꌊ\M8q2e<7VEѸ3Nnѣ 9rEqfNNNɩɌrbn^v>(.ٰ0 .]:FN}Ae%sڶm[? לB\]]*3i• cK.%O׮]9;;z͚5Ceϝ;wj:%$!!!<EZV3NR---L](hIIII֭{]{ڶmh8ӎϟ?/v!r\t~9)^Z:5~^oeet~(h`mm%!l_`ŋ'{lN>k_Uc`*999V;vXi5u=)PdUV-Es5jtQ5SNG._PN~4G}P5_[l/crO:jȐ!k%$rwdٲe) +p@a 7OI C9e.!}lƔ[Sʕ+H?g']5\@V^kұc]cqYfg䥂9D:Jh&er]z)u)WBr|ԨQ%TC@A m=vS4Z9탂fHH޴is9 j>׿MF@Д (:tpt̴m޼y,`a ׭[Λ7o͛Y*[R.cp͚5o+L&\P~Ssܟ9w\Smxb-Z1FoJѸ3NRM] (h ~|'/}klJJJ5yFVVV9m۶MW^f͚JȰ +!u7M;wj3Mcz@@S.^tVZʗɓ'W^=LN[D?#/mOB5gg~m](hsrww\k-[6zܹlLNNv%n۴isHNVRԦ4iZsW\9RO?Cs"p)_p!!yVVͦMΞ={KQ:||skŚ7o:hР K~t~œpf4m1(,2ds/^l4url4t޸8m&g>kY;VZj%Ǖ+W$%%5glg4%\scccuo>qttLQpb3ZBR۷o+2tC!Czw3fmM4NF.xhsi0a‚'O6tN%!yZnM6mWYYYnPi47}խ[zVNPtД (a~޽wڵK,R}y8o! m[%_湐m۶S:ݻwKH^B#G\) (h(8...q'Nh#>}Z.<<|lpppÇ+:[jy{{GJHޥKݺuo@qVUSTjSra#F5NEDD0GMJih׮ĶN>}+V `R5ӧO? 6 ɱR2Ǐ+Hïrr34hpEi )pCMnݺIc P+Wi@@@7oެ-?[Zj{?gkkCz_U;(=zTq޽3Mcz@BS.;rH ^NNNv5/X! `z-[<)!|?XhѸS-W[S ɵ xr l 1FMf͚֦MƜk׾)haرc 3;;:**KBry68a„Kʔ)XCѸ3|Oz\@WtgϞm䔜kG̮]zIHH.-[6ZD}Ae%sڶm[? ל%V0 MS޽w=z|5k ۰޽[9e,!yǎPrj>\KK@Sv_}ϟxJ珏w\a?nܸE^oeet~4ʉqqq.Ɯ&\:+JB{U={+V| ߇%$$tgY~߿iҭW5c 9xa}RԦ=4Jjժ9sEF.XߩS#/_n('*>@`gg&!qƿϛ7o(ɓ VBry+wdٲe)(hUZ^[R9?t޽:4ƺKH^rr3رc˕+X?|ٳs}n7GMh)f1B_=tPgvNX9AyINiPiKگIߴif_v _|BJ*=T:?Pф 7%C>Ks-[K:*KH޴iss{qVU_iz@CS.С5V0o֬Yy8i-8 m~r\kgdnbU^JHnoo>lذroځ&\(W Su9Ϝ;wG6ׯ߶E{w.n`z6T*kEM?~ݺuNؔj-Z8sFVVV9Pt֭[]+W իWו̝n>VBr9wL2qF҄m۶~Ɯ&\*U<))l uW2<.c&OW~7KO<)/J F^?}I8;;UEaD. YSJH.,_|Ԝ9sy VBr LhݺIcތZV3NRM] (hxr"rʑ~w 0DIHeiӦHxJ珏w}Z-L8qA6.]7%' &\u RB .4K4]4iqqq.ڟimllFK+W~`kȭgΜi^~\^ZbҘk7|󉣣c\Cnşp􌖐<778vX{'0թSƸqyyyE+Wߣ %Eƍ/xhsi?~SN2tNٸ>VBZjݒÇ1Fi47}999%s=xr<<ի׮ݻw5vɒ%iSNm%4n~mBBBxƍ:K$$P#GR} 'OϙK.#?+?|s޺uw]v=o(jJq*JmZ@FS.ڵWv'&&5VNs*9s(ٺu_BKޅ ߰aà+%s?~4JH^Lrl>]M 63 DBr 9gΜ)VdwuСCM+5jԸc(I޽{g,M@r#Gtjذd']cTA91=%WEGG{JH~/zYY%s?#!4J˗/5k1GB.\:unDFFzKH" Ǐogor -2Vg-//R8{{={6GM))]􋤤NNNiii{xx ,nݺ|$$w^˗\5"77TllkrM̙3kQ W~m6јsEKܱcgi]fӧϼ{nuCLMMu SNGV=z1R;jZ8777eEM;;g6O5^rZ/%yzz\?t~iݻNm.'Ow.\ht'Ny;6|Ĉeʔyt~M@o-!C:۷s*Uubٲev~gϞ5N{o9jEM4oi5VNh޼yRrrC9Pr gyyyҠ9gΜ)~WW^DBr2rȕ~~~+VHx34E[Νݻ},͵|'&M&W YfgwwXc @ahgkkiz@GS.:t;HÉvu˕+` y[%_ۿ۷]%󧤤TW%$/_Co/J (,ϟ?1,,Gٳgio@56* 6l(ljJq*JmZ@@S.bR{5裏[nݧ/5VZhqŋrQЭ[<))4nܸrB<<|666YSNݨQJk/ihJ.K9sd} 3ccc%$=zɓ'ϭPcc@AJHH/X777M0~齨(/]d5M O>TGv[X[ż9j7o)!7,\pW_}yffldfӧرc1/NLՄ+k}n ([giݼyiҽrJCd䲙rS4]YGvIѸ3]vkժu⁦\ހN8{LRsթS\*!Ǐ+\rdhh(;774o:uvvquuݪ&\c%$OOO_|9sLL Wn ...qiUVQ7VUSTjSrxCf͚&'FDD5Sωgr4JH2k׮"Yn޼Y[Ҙ-[0am*G ML>=M䆒Xw%Źn|3fJ*=4Bݵk>}>cio\ ʉQ<ի׮ݻw5vɒ%Ҙ+QQRr]]]JhnҤsJONNv]"!cQU\&\KܩSZgi]tYrarDAƶk׮^rĉ6N6m41" P$tmĤ{Eƭ_~dTǠeL'N_V[Jk4(jlmm3B$$qF9sLꫯ>W^M:t8*F4իWkx'O߳gO}ƪT* M(tȑN%9Oؑ#Gl6Gm5mڴ9)!kɉ󑑑ϟ?/d ɽ"MM6=ghPԩS熬$$ m 3;;:**KBUޛ2et/U;)+LsrPHNsHJJj䔜k{۳g^z|$$OIIbŊ/QWBNvu~Mj.]|hPsVV_&6Cw^U__%CBBF* F8777<3u=x)#gϞmVnO>-k쪕$4@3@QZ/%yzzUK_~-IO\a'M4ONMrzovsn0,//( o߾]S6^z؋/ ~yw{G>ko;?D9 HJ٨3=J6u=)#&3gδhԨŜ+];utҥKۧIH.3mڴi9s\xeGJM5kގСCC TR)e>3V_9`G5Ⅶ\~Wsǎtζn޼yRrrC9ә<==%$˳/f͚5-!!cAG.s·]>ɹr܀ƓW \Θ1#=XuF889⇦\CGwfdd5k+W9$&XWW׭گ߿[HHH)iUt^^^Q9̟?%K|?^yko:؀6ϛ7oR v@ѧVUSTjS'r0>h9?NJJJ-Z+rQ%Yn*U*W>1:r*TؔUrXpppGk׮^)ƺKH.'5j)S/_j-=~[nnnS'r0O?tXثWҥ#Gt2Gm4*'$tl֭[ ,˕r9k@J;w-sssKmٲ```}Zy/\#FɼZ:eZV3Sr4`brBjjcDD]c<==_4Gmj•=((h!_{yknݪ׈w_^?~[YY(?W;wDd޸8֭[϶cƌY*VT:u>cU*⋦\`ʕ#1wtS-Z4P ʔ)+JBru"X^+A^ 2duֽ.{{{G-[hڴ鹘muVWxҥw 3336$$$@B:uܘ2eʜÇb$]Mq~6mNPє i ={ܽgϞ.^!M4 v;whש 9ei3n5)Ҕ+!l5jr9 V alٲѲ|qCqF$)!K4 Zg\ AS.f{m۶M%6OLLl+'ʩyyyJ~ 2&К5kVZ;V <99iڴiOdfgkkC5kִjժvq;:}ƪT*Mّ#G:;!#G\) 0`9j&\]dSN+U^Z_NVZflk%sOc%$4yM49v(=%$ډ'?#빨(/ eܚ2lذեK~a )lȐ {i@ES.BNy5NaHLRRRsyk\-w{ `Ž W_5vRmŊ_,^OɵB^ [S ɵNL2s·Q?urj"l{U5t۷oהw]L6dv}9F8WW׭,⍦\ ={lu^i9]{[iJz.r闿ɓ'W^=,888Ν;5-ȿ ~mE&+JB[n՚5kִUV ɱ2tCu~RJv;utҥK %hU|O|||$$S6m4pS;iy͓C +VtjպvYʚi Sj6qKʔ)Xۏ?L[]乣l`7GMx)$WW]i5Vd'y`kM%6yzzFKH./sow̙ӏ=AIII͇ VBի[/56##îYfg_^\rOQ&܂%מn~MNl 0wVrB GRNR}@Qemm%!yjj &,Ye WnUӞ(kl&]9X@IVU4,"""FHtPX}GEGw9uRRRɩ /^ldeec0u/o1.iu_B:uްaà+%s?~4JH.WzxxP 4v(SyVB򄄄!wiyyyɍǏ_(rXرco߾]S*Jmz@@S.ħ~NNU7n"]c^Z_L;rH's(yh-ZjuJ6HH.'/^/**ٳge-?[S ^9tr3ڮ]zR[l/ʹ׮]gޒI&gΜ9=Xu@qh׶mڵk4u=d)BoqZZÜ9s+'.HSK}Qx [0 e3вeFKJJ{'ggxt(d4jgd}g_Ϛ5kZjRU;4ذk׮^UTjSJr(9w޹k#"1[QЄ9~֭ʕ+ ĥիW{Ⅲgc%${Inhܸ@QҨQ111\k'Lɓ 3++&**KB5kޞ>}Ç1FPjJ {i@AS.4$%%5wrrJNKKs5~=z1Cy3 EA DFFzKH~/[tL[%sggg[[S ɵwM6SNGQ?r5i]rHY?|s޾}Ħs·d{qh4nsuuZT\SJr(䪲g6[O5gϞ۶iM(W~7888PB'O_bϟfבNG?#rr\گ_m{]iPdIH~ڳgϞjժ999V+&wO>.]ŰaVzc&ό:*Jmz@CS.EDjRΜ9B)AwuԹaЄ|OiVBr9iӦMg͚5M~nQ:||Fhĉ4h@V:?k׾t5sxtTTi]RLƪύMTN5GMd)"~W}v]+ԷIII&W7_xU9 Wɋ-pQtm6?yd ߰aà+%sNr*r|5mڴYjպv(SGgϞ)ƺKH^r2ltvnݪXJ6u=d)"JyFYثWҥAyj$2uy&Uƞ(jZn}2::SBk׮[doTT׳g*ed ɵ;Ir1¬SNGvS>Ks-[mlʁ7mltww5RFqg\6mNԩS熩%M0#FDDFFz15@qXs L؄rK}Qw4CzHH~޽˗/%Ç+); gg3gNի.@&qV<{*R)ܹsM=<'LBl7}ܹ/\X' O׿:vp1L2ϕUfxgyvyL{円Ιa !SV駟c#$Zjj׮qSJ.r(&gϞ=wٳrC< 5CiP$Є ٞ˟w9I>|]_z ɫU2rȕ~~~+VHPIì{\lٲѲzIyCMNNv$$g,ϟ(tńFqgԵ\ݻwl۶m>L2e4z{{G4(th űV MNe2)))ՂfHH^|'C][o~(2B$$JM6KPΊsg&>zSVzX(zd#Ν;{3VRM](hʅYI?k fPȑ#6lxƍutkS@A r]җ?&\x֭~ m\t7n/^(z"'D\^"wy0jܸ񅘘m.͵Ǐ_xԩVΙe%!\I/kÇ1F9%Wgʕ{*rQ(hʅYԩSDA%\|fNNNiii0`={z{Q MyIў槅 ꫯ>̴U2D^nݧ*U*O>;O>cǎ ƨ yrYUK.Jy֭Zr3v.] Ͽ@$MsssȳSJ6r(j0i̭[O5G{۶i ȦӰ0 ?~\aʕ#e(;77ԶmIh/WnUZ;6摐͛gϞ=uժUsrr ]{⦅f1t5AAA3jԨqX(x,8sב\S@S.TjRΜ9ӢQFyp٩S#/_n 9MeΜ9ShP*T8 ϟYvy,/Q˖-OO0as%+v7###%$s >vX{Cζ1UUKʔ)X0?;"==^8KK<6<s)b~W4i5VJ6klrrC97A.B^zyyEIH.n߾/?~O>rȐ!k%$wrrJ[,^r* ynsYcYfg޽{s:J;vL ٳnc <4>z굫|OL]Ms0Q@^ڮklFF4^~.  MRJI,Ocٿ7iݹsgo˦*9IBr9iԨQ}||*W@PXX[[gy޽rKɊ+x:JÞ|5\HnzvVU )є @ ЧOr4III֢E3/^lủ&\%InĉmΝ;ʉOAAA3$$>|'ίU-@aQj{aaa>>|݀{orIllQ;vl8YKbbbۛ7ogJRAS.%g4h?~W^ߥKGdL4jӦ͉m.?KHϟQ2܆>VBrOҴ۴isJkw=gϞYkl_6( #ʁmsr󉻻{` }OmݺI''dS h7nܢ49MX_~^gn•:v`yԯ_jӞ6uɒ%=dߟ$љ3gNYJk@6$J㬶yUBCCeٳ{f12o;sXЏFqgԵhє @ #1WN]5v} ! @B.OjRV/t8 m޵kr lҒJVJ'%%5u)WMvvvG^6y*Txl_7oެV*Jmzh(Ww蘺p @E.}OYYY66m(_x85)2 4:lذեK~t~(h͛7Oںu|gYLkҤI\9322d58{r.R*}լYv폙-r(c=ݻ}]c-Z4!Mv6EMPxdyzzFKH[Jn=5kִJ痗ޑW^1c,T:?$iuww\n'Y|(yɓ+&=<4@Ҳeў''';-Zh?<}u>\Nӧώ/_j߾1cEu:u|;.]:f޼y=zT9o޼Y[Ɛk׮BCCU7P\HS>!y&az)f!/޻wqUVWN 21nݺiٳĶ[>iMdVXXaK^,˩M'ytv"k :tMPPЌ5j1V@Q$ϲnX777=raҐkaZj)gΜiѨQ/hwlpo!_Ia'/,X0֭[XVN?~sU+J{QѸ8i=~x;Cζ1u„ dv(عsgt{}Ʋroׯ]:utDXyجYrͱ4l>o&\1 >>>aˉO[l?cƌs5U:\:dȐ-Kdoٲe) }Lt~Sr%$F\J*=T:?uWo߮9sW 9rSϞ=wgYKhhlv4R@VU;9є }n_V))e#[ly… f0/p|扉m͛7߫$ۧ6lh͚5o+M2:ts@@@Ⱦ}:j.!y*U˺In=u'Nhsƍ:UTjSGh3ZƏP+W4ҥAٍoڀ&\@QӶmĘm.?7iMr]\۪dtˉS4yM49v0Ν;ڻwYkO嗷 Ud ɛ7o4cƌEj'EBS."""bDAx3ƍ[ z&$$tׯ߶6$8uTٳgO P\4hJSօ+V|xbǏWP24[S ---S~w~0RJ˳O\d:oRRRs,l 6lSh4nsssӘ?CS.x-9SN̍5v}?쳯_ MZj)_J'O_z;wP2|/ c79;;UL^>+,!MJ;vov9e.!}QO2eNvnݺURԦД t̤1_t]vGG L0Gm@QF.M^IHeiӦҥK(?>>9i9rmA6.]\ڷo,..E>˳Ey|Ιn !yƍ/̚5kF4Zgos?CS.˖-[c޽{5v…TrsQPTЄ ]knnn)a̙ӏ=Arm!CJH^F;Kƌ6S`0+!4O>-g.\hd?#o|>f̙ӫW~Xdg[nugBS.0HjRd'}ƍ/Xn˗/7S s(E.ŏcꗿ<##N^6ϟ?۷k*?>>Yk֭[7nܢO>9YW`JrK^dd\9:Rj{SL3jԨK~aQ<ڵד'O3\PД ֠A+OS|=zr?tajZ8NM@}n/}koӦ͉s5^M}^B; ۷U34CBr{{aÆ4¬f͚###%$d-O?g蜹֭[UT*7pH#$'';3VRM]>hF!񦦦:N0a/^lԹsCGdPrф L9~֭ٳͤIwƍⅢmc%${iԩ5jtQi`*]t9o߾YFWK[y*7ohF3~lܹuMHH53M 4klttwޭxbK̴U2wvvuS,--䦊iӦUҥ_xyyEIH.z,X`’%K|?^y˻,l7oޤ \1V(<4>8%&4Eykm}g_JC1D.(W~WNnV\9r-?گɽrE46Irp~k׮^)Xw G|ʔ)sʗ/X`ܾ}c3MczES.bĈ޺y{{GFDD0GMӑ1_t]vy';Q6p@QTB4+!yVVͦMΚ5k˗*?>>9 -Z8qAmөֱcDŽ;wϹl_L׮]g!!!7i̙3irjyj>z_M$￿w߾}u]pxI&3Gm(:hőMgz}f{ 9sŐ!CJH^Nƍ[$Ɩ+WJ*+!*KcmxxاO3t7LxѢEZlyuô4>T*Ե rٳGVNIS'O+'9jCtrbM$Ю[%_ۿ7y m۶~JqF__%ˆѣG/;vlx*U+r%$?w\3fƺ+7..EYg[[1c,B*Vux>cPД LF:~x ^F].i/sԇG.֭~ m~rĆ X);--AN啐L2TiӦͪU-15m\LL6ߺu^tC̴ #SL%'Q7 'V]d=׿ @_4ΖrÇ+߿-{}{PMgϞ6?{-E5p &"&9'î3cVU1c",0kXYkΊ9 o zfVΙ#O۷BRK=W$/wޙ3<`С{S7ٿT9>./'Oӝ{g3H߾}K~fI]vendw-l}2bn@-HE!.=駟^{myyk/’/KE!  2>묳K~/:wyYnkT#¦ j=rG\{ktMav{ony UW]C#{sϟ[n:t;_&{]tW1yR)76x[n @Hm>{疖L9$erQzHݢڈƑ s_?vKz'?#:V^fe=#Nr-ojjjnSF$C9EOcǎ~Ȝsu]/r)tZZ1 $$,o<+O;nܸR)W5L3}[@PpԱcwg_1b[y믿P.V[][y{{?{=pdY/gIv0`z?>o߾C%?ʏtIjerY'O]IP+Sء,w//¯L=?>$\rj߾v y26דO>bow)/Y^{]pA> 3|@:t0v=*/?&~mz?WATΕ g_mo$6x[n @=Hhn'>lZW_}uvڍ/yH!  NMMMr\f#GN~>.$/ya]vvᇟȅi!֭ۇC +/G]C=GY_:t;u!rSE^x%PKn&7 T/rzoCG\Xn)g}򒟥B[o:XFZuUƍk?lذ] 4O?Zg~WDy/fȵ^>_I*/K7y$5|i!u 'zSO=Th$`r"W\ivE]1ciǎ+Q^<c 6cG Oh?ԫ}c򒟥ȩ3<_~:sY`[^'Nr-gyUr@H?f\wnHy+wѶ zu:~ .`/_g?Uw#vIrs^mF:_Jg)$"z?S读;v3ϝfij{Y|sHrnƷz :tss{/첝;uܑ^Dʎ$\ef^.K~jQ_~y#~s5ᄉr 7ܰyyK~^x_;:_7߼IuW\ɼP/r@dêW^>Ck+̕#8"V&$@TSMK W^Yϗn>}.g}ׯY3<7~>cYfO<\^ܤ(뮻w#{=I "n~w}ϕ%38w>ڭI9{OTI MMM<̲=zww_*bɅ6FYt%O?(7plwH@s\Hs-}/5WH׿C=9FXtE_k?˺G?RxdԨQ=̟~iN:0y$vbAW;_v'o/[l՟'zoS>OвzUDER.JIݻzoOل`ɽgfgD.bK?W8-~C ? H}g//Yl5RIjEyѶ@8I"n9s\yH߾}K~O>eYY_mn;曙~筶j3f;諍 3ꫯ.2믿N9>#СXX+k.]|ݒ@|UW{_V[mu֖kHRuwG~'>z $Q?UH,_I^zۍ66y$ <`?K.ϗ ꪫ>*oe/>l6I4?u n .駉zEz I@;K^\\kyTj}U7x[??oz'뮗 B >zi?ͥꫯp`<[Z, .`/iowgIb=ٳH}Z|_ ϯ²N&l{]vγ6gPo۲ +<#־}qy|>@-HE! > 6Ȧ[lqÓO>bHRav }\pcXwi+%??߾<⩧Z뭷O_x9mUz1JsN.ZZ}֚ 6YoR:cD~){l̓Ժ. g$!?oᆷo7II}L3Tխ|8;e?^$x$;册w}wq'eRy'ۚkbѮ]2GWߍ9I't>l?DyO?r#8k׮ʿ'ȣ\Y'Zr1] o?mk0V8ֽ޻avO?\9nܸDCyϳ:?U"һw7tӦFzg[=c÷{{۾9~N:}|!)Zz饟{w敪Q 8V.O:ȅ9O?+I@xǰKr)FI~a>{yϒl+&!K. R:scǎp)~lX)1ܤ(z=Г[z{I&nz$ ˺ I O/rQe],+=-2Ͼ%).Y;Ԋ$\@sYgO^T:s|EA*ky̬<`GΝH{$U*>N)"7!q/WJ\I[wu׿f\B.,KrIW}g~Z?gfvrM*a*=K5 H'Io!?5.N=~aW:r裏xQG<5XS<~v7p,+S|~Osss[lq_eKRn-noM6x[| /$RjXzNR#nkHO*;,y փ ꫯ.xgyT͝gy֮]o^{|~fyo@J_|_:#N^=F=tGITs"o϶N1ެ):z-lБ`-`뮻_,;;s~?Z+Sr%og{;:8v5l;;K~bmI[nzرc;~ :ti]%7UzɣH$7摐v;lذ]x≕[l.v7.ʨQz]t\r_,W?r]GHomIr'8y!C#0Ԭݒ ;䬳׾}qkE駟Gjk ^s_^li3w8<[p@H+YP-/,9\\zP~qeq8VrߛM`̇d^tya `k> Wm" ." >0'I@Hm69c 뭷^2j(;|0`@2bf s dk#뮻 hر09s@X(I@HDR. r 4\b=pȐ!}]۷ /p" I@HDR. rB\x{Ky )hI@HDR. r 4\A$ ")hI?+o-8K,D2z6sw& .`]m|@9 o7I?o[w5۷o6$:tȱei6J^}ʟ?%C Qn`1\ve }Ɔɋ/8vナ1P$b E#P?rCIs~K䫯JNO?M\y1 7ܐtҥ:+/䢋.J^{\ m7|@ш;dGR.d4S$3<k17|@ш;ؑBtA_ve;޷;_vT@&w9ꨣ޳:SOsmj'\K.qԺvߠ"ڵ^ս޻N=ëkEC~СCSO=UE?T(dfdJkCJ>`2aU<)'͕T $"O34 > *sW^~M6٤6~w*òĻK%YHe"Iof{&믿Qu8*U{g$s9g2z駟N.gM^~JblVI~kF#*UnjSkI$Y^'8ɰajn;?;0P$b E# )=z|YWD{Zf:tY{);jԨY8aVRc=J~Ѫ:=d+B'~UDgOcǎ;o;OK, $&Im]5a&믿~2~JҨ$n67xZ]H[nd۩SK*Jɑdiy?)2dd?åu5ށ&}=SM5U{% r$gꫯ$SM5U .%{ >t1ꪫ-آ$.I+ UW^yeKbW7|Sg_@1P$b E#FR.4Oo䥗^3)2u]s9'Ym՜W_˚k|1SYy睕cdV$8㌓lIEz뭗,袙Zj矯L^dw[D\I_+Y~+g[l?We"hbwlI 4SL?#eYFy@´ -TQG%wqG%ffUD||@9 o7(Ip)T^./x2tdfk}GqDr׶!W~7 :w<_ 0 vکXeU\&[;$ON>JL=ɬZF+Uu%U)D'xb%aO>ܥK]&cǎwrZ_@91P$b E#DR.[W^y9*"c8N /$TH~U^GR. r 4\A$ ")hI@HDR. r 4\A$ ")hI@HDR. rᩧJ0'IruGv;n |i@Xb:XO$y睷^~nM>ƏN]7O?M7O3ϻ3<7y|׃>__>ioumÇo?vto|c5|&￟^믿?Sj= mEj׮M6[e5N>.<̲~wߟ=s~+>ٹs/|6&O/'/|ާO˧r_h%Eq/rVgYLTSM:son>65?9Œs%fyo^\h^ϻMd=#w^{z1*6!cv=~a?%8GVa~HS2nw}=jԨY۵kO7x[nEq䉤\ 1 Cgyy :VZi'׿^zo]wݵ$Q,M'|GyqYZC^{o)Nyg;#o ?s 'Z@mOrQ4_0`'ta_~e;c[oK.䯒XO+`S]veXɼX3A9WXa&7siwb&k?x~{֯W^ye1cLMgr|v$wG6"lm#Flzߧ~Un\9rd"\eM6c9>&!7nG}{on{sWD4?oys$ˋ{n?oIµ#8Ajr 4hpQmPUVY1IGKL'T}׳w˟fk.ݨ kTɕ"97'8}oRɿUsI(3I̕}5Y^s\Hh@ TI\d\I1HW5jTK/-^gP=t*{!r1zoZ"@G2}Urk+թSRs,7j.#U+咘 q!)NR%K.kR%% [6esBz1_\G\لzS=y:$ R+'ZdUW]QIB 4]tSz%&Psnݺ}zUsI@H PRsw( a~GR-Wޗ5;F>Sz矿@HE-z2rL͇|Tϕ$PZf}Bժ,IwUs8_|H͆Z@r w_|Żey/UrmZ-K/UkZnko;~}% z.$\4j>6aIWϕDk*?g,k-Ur']}<3d.?Lnch:t0VФk\p7$Y&\Iu1EQ=# IC9c=v2>.rdn~E./ܻw먞 BYޛu,҉T͆Z.s $H.fcl;ꨣɒ-޽{hW+h6gyB@. rO9C V#n#S=s1YU4kkGb-z GR.@j{ ͻ=lK\z і۵kO Fy'[a(?IZ.F[^駟v3䂵z?Yg{j/e;xAyCn裏$6;kh51wֺo rj Urba1GfIξK*㨖zꫯu]כʆ$\BxرzT֒27*mEʚr?S=UrȃJn[?t^m ,ߥKϵRKb]V˕ʘE @9Q=+7gyTeر$Q֊w>rsO|7n@}jI̕J$@HȈ*KK[=W뮗ʋB@.DλRU-w̘1yjJWg}˚T+6z.<*־{sPdMms/_},gN:_yih7I̕A^s $d1cRu3K&쨥Z1sToQzTlnlz\;|YNߑ2Z'x8rJbf{Țs7tӛ^yEkzh hI$Tp GHe]hĐK.Q=W.lE <kkVbܨ> 3|T{KnC\!#1ʁ\3dȐY+ɻTd+sQD.JˋQ=@H…EGyqzj,r} n>箳:ʟ%FdTڐX[)ⷵZ~k%v >r _Z?x{}Ts&t9ILI|I%\{eLK\UDzW_ "kk73<7Y;}S.UsĄ\ImwY}EG{u$< @I 0N;,rO9C /T`Tbm#k,}?!!xT s \$*Y-h?f+˚ƥ nf7S=wfL^x{ X$P-@hs~եzg}6[-{n%ϫ J$vC;^rCȑrC~Q5@,jM̕'X'm$L%kBlR%YuQ^7t=.r hܝw2yQ=('pySO?nܸmOE mDKaÆRߗR]J,dF<CbmBImAz.'$\I4\q@yǝviS-@seve\/:S=Xۈ>۷ۃ[5N:'X?mJ$>r&A3%AG*P%ZTX-]pQ=U+7Ȇ^_$ŢZ.av}\./~ 諥Z#8@[Xc Gbmڷo?n`R=z53~FW-UrfۃT殰 OInC\ 1 Њlf%ـ*r^{UDPt\fH\X$*Stra?oR-WOhdz\_s5ȩ@!H=#{[=ٓzBAb.") EfM|ʥl2~:c< M7{Zu_s傽l< I@9ȓN?\r%SOO\Q=wֺ_;^)7QEZHhK"T-'9˹ʆ\CR.@J-Ur$R.+rT[Zn)ld^. $\ 6:ϸ+wsшcvXȃd&{ 4"D\eEb. )TJ.&Hrh1cLN;]![Ço7,|gm$8#;_܋!y~bQmFH\RJ/O-h+7X~^!YE j.251WN'S-x "kN:}nx ZJ矿wn7e뮻֓8$:.]2W^$d"8I@|~Zܘz|Q-@H.lgy5Z=wgnbUVy,/kkGb-b!^n^ƃʨ\Kb.4\i&:jv&!Rw}=^ʺ]v!?R=W6뭞+jkR=wĈOVOf_uU?C9:t06֢ڑX d۹s/(I̕u]^s1$$Ug}+ME*HrZSKx;,|M\$\6{q)z<@*R-@>䆺Z:ty1m#v$J.D#UsB$FHJ6!1ER.0*Are,6l6u#8ZskQ=ZN•VZ _293Z.kz`zn߾}\q;?9T%v$:y*Y5Q^T͕Us\I<:eUPR%y zIjw>E JWϕ6Z_Kzavr-ϫ  rX's/>Q=nbW~<֋ڵX;5L3}F#[*fyJ TP&$@H}WPT~+O-¯5Z=wɟ HP+Up)zzrQm"*<&Σz.#*yʂ\I4@?~|;{nmmQ/InY=}jtJ2䦛nz\3F f{{ꩧwZ-w)tx`M(_t3&W=ڑX Eb4UrR{)IYUsh 1AR.0KwydylR%Ez zTyʺT˵g%xޚ_ yI%z箿w^}S= /2ב*j,&Uu 5\As̘1H\Iʩ匿ZFb-z`*yE A\51'sm!)D\NF_~9k[V=s+ms19$T=<vWbT֥Z.FX[;k࿤J.E($:CvW*咘 FR.0G{fyQGu  re,{傀jhwÇoE @drg@\ ֯w!CСX@ȲVɕf"ڄj.I\s1$sd5k"LTi,r%9޿\|Uϝy晿znL]m9ի׃>?mT˕tA." _$U_y7\^^s9G7ptW_u:A j. !)"Ur9*VK\<`c s7`;㥗^Z\n4! @ew(rjQm6kk7Sڽ{'Xȼ/˿dC˰,>9W^y{PYcJ"p _Z䑘;nܸW\qNk-\Pz(Zr~饗~Nz9O=rQ*~@J\yRHƮTGxV9rdGyd~x_~eyeYfgsm8JEb$^TtIbT'$\In[s5PuYT˕|irޒ=J$IڅX s`niϳ6gkC=e]ٗJ.EШ}~]5W$w2?e &J#hYV_'66r@ɣ%Vz\駗W=UCZ(r2G[Ν;{ZkIP=SN9C=Y˫ VH\D,jA.UgqƁTy:t!)?HJbwyH󟛯Owme+닮]~Z<Ȝ1g&/kE\jTk.=z_uU;D&./ $\\D&6J*p-oH$1:E' d!ܟ|ߞ}e|%葤|Vp o{sK/,W*,o6?I_?Uzʷ~;ϖs$,Vm%֎55"I&.袯,b/X_jܝwnaZT]i?g+7ɜT.r|e/ G@cV_}_~L;ꨣ6)K8Qo\) 7KbGR.zԒ//VD T$(EEYն6j!MU`Z7z֔ǘ.㏯,cf$q6-A\s{mso sTR7wuK KIK,|ZHuy\ $HdTxg=I'N>$V/Knx7HTMu$;,o$&7KYrsrIwٿfUs|+{TYo=R__ho%K$1WnghBFR.\*-y~|o饗~깒+27x[UZ_VҒ^.h>#<*PYOb.I$:t3,+qj?(kCb](7\o?[zsƻɽ_~?:GrMnϑw2,_?裫FUk"r7Yc1b[ُ~7nI 0{a$|TqD4s<:O%Q~G|.lJWϕD+|w3:\^%]M~[$I3f4G}A ;).$ևZ4"]=W;\U: /ܬqSo{)p!g~BE$`Gj'6f1wRg#R)HXc~|}v~ΒDJ_TIUYd[o,T镤vڍRW*uxI%撄 8pGq _%l_;s|ܻw|}^krc.U;kCb-BF$ssyV[mu[lj}=W3&zȼk&= $=BكrC=CLqxW"H~iW@Y r)wwHIJC=dj!Izi,k$a]r} t\I.<>_*=kL1긓"ZDD.ԯ}2$fo_|EF?ǜ5BO/'aK;ʀXXHUna wܱo$뮻{}{LSO^{uYgկϚgy}Wm>6@=zy|W^#IZ}O>dvAY 2L3}. ky^1逋gE|魷ޚ_N#Ge:!lp7|3̥z7޸Ͻ ԩW|vT( `R$6G}4n;Bj ʀ\D')W{Uz1*vM[o{ケWZi'>j ȣmˋ/gϔC'أ8so.p`fkzNW\uU;Ò[ˍ$R j2U͵!On[%O\1@ݻw-~-kxoyjPMM7O>2gyEnj%)w{Z# y u I&~瑤+0rbuֹO>~BXAR.lfIʕG6l"[ {h1]}]y 'p\?O㒄 ~Hl7+rs/2U[ R%g N}r-l\O$)W~[TǎZ܎8)U_μ ưW^ Vn}O?#GKPTۀIyO?Ftx#u;y[|Gsn#~յ! )DI*4Ju ߒ VSt.N:$pr\Fzw6ܴS6*[rSDu=B5X㡟yjW$H-73#Ymu][*69eVbb$^~zs 6'XiW|!sKyB>WdtFteOOnw}ͷb&7L gYNgͦ.BR.T$_NO>_}U'wSO=L3͘ܟims;vcMwaq2m]HviGO5TLO9唿ݲm} 3={O?M'yeG=V;]"n cǎ u173~׮]?m}A2.g ./bT1X_ɊR]qWXY+I}FsV|N[ɓT;6I5,PW*ٶ>uc'pr]17h)}/Is817p"܉ܺs=>_ds=?"m>Ρ>氚-oL,qRqC^_]vek<6q7 f>-RZq8 e믿NYԼsaqHowuzǷe&sMYcI|Xׇr~ȓ\#ng:2]vgI{&<9ߧ;x%EʄIĚw}wܻ 럢S"iwyu}ƥwyk]9=S+L}sHy}U}bX`7}|vԨQ=IE̝kI9Yx_kt_Ǻ7oμ}ˬjE冰o7c '{~)GCe̝s9I |믿~K j^zO'v*IVe'y<}Q7|SWE|WHniӼWcpQG痕$kTY;ͭm]͛$2Fjv[%]wݻS|eB .fg=SVwz+ C +$Su .FUm.sJRP޽-ߟ]VݻwkF|Q){r$a 2d%?BrEN>C!ɦ7pR&$tɓJy}G5s~'rbeyV*h#4rGp?-wH9KRZ_vs Iȝ4#|9y$H%r'MUe#Ux/չϵW]u;㕚 T1䢱\;r'Mbs>L7 S#!w$iSIfmjz+yꩧ˫}׮],{Gd7׸غ9:ZhdYgXXsə0>z^&F;t-{'wYΡo#.ߖ.KsM7]KK߷5?O[}+Y@ڙdUWÿwC ⒜ۊKys~Y8LhK+g˸֎C>wy9ce\b+g9-/s|e/Ckif-ѣD5VcTSM,YY-7}MY.]c'5?ߕFy |;\s%ݻwow+4r^[^ǁwf0<YL3͔,bY]&׹"}5ƺ[Rd?Y\Yd(~\Bf.QzJp`~ֹsdXи5k?.oyŝ]:=Ztd/MȓʇI6 WJf= n9Bv%*+2SRE[/8S OFrOcOjZ׎iVUibT7$t"Tyg*ɺ/jL}eY<2b{6 e11߭SK%R Vc??Y\;AK@[҆1ߏ2Ś8k4A;[p|NlA+9rrϷVǺ>r<9N{>qGOYNl1G:VKhķKY^=76/[p 4LlZ\<^6FInlz`5pM81O{o+² Aˏ2Ś8k4A;sލ1!Y=Yc9Qlo^|kϱqy>>}wb9B;Wr5D@K|dcy'B[)X{A,q>svܡBJʍ1^A+cm2{b{-|n(VbMl}/XiCYb>[Kw;4777?>Sylc_+[5[αn}/bvn}[e9ߊ_-<ˏо f+hmc|ENX*zX{}|ͺ{}8nZb;Y" Z&i.Z)X$K;n$'=,'M~is{1Gh美ոM0V^%svܱt-͞<*庅([ 1{n>E[7!\0&ָio$ jf8^A+6q!9S۸$X+*eAbo`vR5 ho,'Mh*iЀv# we-mȣ jB"d5d{=c,QD2˿Z^bc??!\ıB{3j<Zx\rѾ`f82Ѿx[ߋ | B1D97n@G{?ZLq'fuC]ڛVЈZMogO9k,XV^w>nTElmFލd|hՍ LlݴǺ:޹ؿ2UEYα1|O;z^B8V?]1e5}&߶</ly?9OqJzƻ i|BXc6/Sƽ(KܡxuC)d]qg}>8ٻKkaĶ V!y>6P=A{3ϗsf>[ !X!$ݸÏ2Ś> U<^؍߁||]ls|x8|}-%qoG#qӎ{Aף-͞<ˋ&Tuc֣8Оr8#,'i립JW>r£-e.bMl=GVYNL׮',kYMR!*˸>VϷe3-5վ1r!~>Pb(N6n!yFguJ+Ӣ)&ѾFv߷l)9ϗչjbl}^q/bA!?ꕖc~ȏ2%K)6C5UϷ!u-'ki$ YMR!*_h{yU-q/cVsB7޿!f7+[`r+v-Uxԛڋ c]h'D[X9vܡeS Z*zTY>!Lq~do1^Xx!TY>߆p=67 x8>ݴЎ;VB{oLk,}/;h|@K|$ŝ8IZЖ'ɉVǺ̰\5Q[A;!mfPYMQ汍} 4A;  9泾͇5nZ7>1M#x !W1q}ηV^hg39n!/ Gף-6#xO6eJM,m\bZh/*,o$izp~S[Hɉ?,|N$so֘Ӯ]ʣ cg}BmP'%-y>}^Ў;Vǽ(K߷!&)j  we;1!JrJo剖^T] y4Av߷';nET|x2BEZCl_{9azcl}Fr\;6kp򼇘G+1jzڤX>و-քfykg{q /}/嘯wbȹ)@⋤].$k*zqg?ڱwӾR}/qBXoEcR֋hZrcj9w t1?w>IBU׺!|Z[HVŠս28޵ϳVϱB;[SVc2㦝c߇h,Rdƅ|hŝVM{3#.-mȣ jBHвz nBUq}M߁bϣ̋k^KRVSSSsmaB%bZn!c<Z +쫹i' 8޵XSVNk,}/~l}/wb!@C|'z<51(nYr% ;5nT/-_<aW8X9"qo9e)b=a#ނ[7ymB8cAZ+-cC[>(Vjǻyk)n!c9jG⎛6ƾĵKR:ڋ6TK-Ol˲m 8Oq BelXدbz?B79gKhoi٘Q=vӞg!& !TqB([#Ώ7"9jϳ\Kq"ugBtsssS651GwܴoĈv-6#xHʇ'ڱr)Kߋ_9VVm 8rc9"U\wniCMPj̗onV1縅t\`rJ aWqܴlkc]ƞɉT mjʔ?Zj縱qY @I|7C?ܸE8 .Tpmc;nET08iTЊ-i9ݴ7El!ld[ZU-bM iU(c~zZ4]X!~^&O{[5q> #/^e8h%Y]f5o$wcv߳"-m0w>}FR.bj:ѲAe|hIsӺ>wZg{ &8ZՃZa~YfFbi[Xˍ5a}B?XS[c,П|g5P51ou]%Fh'R)׍K;Z:,/'-m0eIe{:h/c낾ף9Lًq0|4b՘#BU7 h-mȣ j^XZUYߺi3[ڐGԄkgpjl1HkkvO8k.ݒ0wcO3Mc7Bω-鉏Ў~<˓N6OY7RZ~ܡVkܴ1VJԌ3-ovk}KL63b;1?7r!Wq-}/-h%hYG1ڿj b_Ui$<-ݍ=Mמ[^XkLl}/%qInJ7])7V/ <qFX>jezOlqG}sssr2?ZV[LuӾI^X[ƣcB{[5!cV; in!ŝƽI0">a}KqcO?&qM[ڐGhauOYk?'j ݀fp]~%aE-/|zXho1{ &ϱ< ӬY=WM-b~P9-h:C9[,ǚ13zXkKw Bwls0d&ַϳ}=ir{a5P)WvuC)X~G'}kuǥv(M5Nww[!l$Y=XB;YNОsZ^ci}KL{CcxѪn!%v u&'^h =\Gh$ rmmyV{c9h=9n}/boiɸB}/c>%U;gyqBYvzI+/iMغ Vcоr-VMGYz嘯}McHi}KL{Cyl-ǻy~7U;Z{w7N4,WM a}kuk[Jh|sܴ^}{|]!}@C\`yOz~VUƺȳVc(˸7훎ZzB[1?}ab>[7X#bnsq\-Zkkyk4νn7 | BjѾn( u[7V1߿2^0 ^<֊VϱB{i9ho8nEl,8UV:B8XW a}kU7[N ՞XB|k9k}KL5c;1o3gD//$dk'XUV9{/ZBцU7tKh6|훎Z:2#Se8h_<v 7Ąc{i[H8'1֜R܉m#4ƾ4u>k)nƽSX21 z!\<}w[j' ]N?1^ElcL}/HNOUc!ĝ*^h_<(j ҚsZ] o9k}嘯}jY'B{o'rFCV; [`ط{ [1Vh^h|@K|V']Ij8UĶL ]?1^Ѯ#BgEHZx'1?_\wӞesbVe,&Ў5irn|{Hb~ƾ!YC;[,k:}/)kHEl;!x',h/& JL߈-$!bbZ6^XX}QkV7Tk!GBܩDY=$hioc{i>GVqܴx=6b?s4Ac-}>}5{iB;[,}9Vձf5777ZmF)X=ˉL$m *&NlT)7IBVc(K߷!&⁞b~u!ĝ*nFr"et[ oCǬ8i!&Fiq,5&_+b>{Qgjgf2 | hk`uBJau3Ido5AThU`bƂڿTz[}/$,}>w>/I8nڏ;s̝[k%3ݴ{9}fw,"'O{YWh㾩)[`rVDYcB{oy-m0!o|yfInvL,ފN }Ճܘ=ij׺j6{7-mȣ jBx׾pfyii!&!/~c[j7[)~~}_=:s{sH/bdIn(':Zyj${.T1/_wmb?!ĝ*뵓&VIڿ܌䦵e&vߧ;B̏@-w47¸!nyoG{[=\NJ-hǜ6!o-q6Hp 14ZwY؆xwc3?BBZ6bAZٖA+zYMFڛVB;A֟ĚB;֤Y>o}O/raojRG<ۺJh}ɢ,k斢,}/b;j.hLY䆐('.Ixy~ 6,'h_< ָiz31Hfy/}C[ iVWB;n!܌[ :zl[}+`,|`F4c;s4⎛FRqub>^͙ޫ[ c=a?-V^P)`uc'Tt#Qŏb j7޿2LQEƾvߧu>e1{-So-t_t bo=I#;{b}Ԭ}-քPj sh|ns &~1N-guqBYv&Znڋ;xԛe5(K>7sDY.!&4ZٖcŃ4+ƾ/Kyyc>9n$K8X?Z-[Hr-*=V?:)c{~}Khbb>%HR+Sʖ65zZUybMl}/+ Y] :eH҆Xo=-_7Vd{}-%99z՘B%3guq]jkolĸ vMYkub˝~(˂:ƾV7,}/bOz[qqeIRljjƽ^XV;֤YgzXc;(ܜ JfVǽ(\ y4A9 &~U-/w,~w'h`d# $}l`-EElqFhˏ{kFM%Dlǁ Z aSEwӎ1vunTG,ǻU,%Ƕ&ոz-JfOpZ!|q=qbIM|;%MAv lX׾X#XPiofke9NJ_,'G~>!wnb{tnT,ǻvI8ib|x7"1uo\D{b帣C߻i}Khoi1 ֔㛚=:(")JfF-wua妽q[ 5-m`AǾ/˸oiCMPi$GvO8i^;[{qou/MeǸqpF + ZVː[Dl}V~1jߋ}҆Y9׎9vJ4hnnnN6!ldH76{n!<~#>k,ofh;\va~R-kmݸX/ĹM"}{͎w718#+k!|[Ѫ^iu 8O7B̷w@e4}SSSt{1)fN{%,/Ⰱseyk&dlf*1-Da5>|c?B;nq,&c=ڱ&q݈~f8h%1wӎ"񮵟Ƶ7+5^{OFh|O:d]'}$Wc3u !Ķn}/ǾǩeOvZ~b=Q汍{8nkb(KuX5D,皱Ў5i7 }y6}4cD9[7FwuviiCMP=4یՒ(F{UXT=Ѳ'46XcuQWݴu1nf%sFvߧ8Xp#c~ysoY{X<܏XV^h4A;[sc[[Ӭo֒(s[kSčk)-/c~Y|uMZ.BRvUn!Ǿ/>x/2Elc_{h/"h,BHmjjn#U{gy[can2}/ṵ*}R˛1?q(rܡ QyX1hǚ47q/ʲg[DL7ǁ؎C}_2k,5C:; k]7b!4c_b{;qNkiCMP-m0#VZ눲-o;hESJn$ 6Z&bu8#u{||i19%3f9QN;) f'Z'{}y-B5V$b3C&BqЊ?Vc~4?JfV^h-}2<[X[ aЎV"豍Z%Jkm!Q΍ eO3#:+jwBWB{no9|+b!|@K|AcB\l'z,0|jsXfX7;cP&BUVcηiV~̬>Z?"|Lc{]I(q(K|DŽ9V;Қ影2oElSisv!AˍX*}/cio-/o3GYv)[ Iط|XL)7QOb嘯iBh[|f !$Gwܴ>#Byl& V^hWJ|cGkknnnІL+? Vϳ!l$Y;cw )QTn!=q^cBR#:օ\341?t}/4[ACZZNRn,y(bո~.^%8C)Ɖ-1'Z^cM{A'bVc I>}RD|Tc?fu)I( Vк x-m0;ޙk aӿZ!C6$h)K߷!& ![㰟K{Mc9"hLY>чp=Ѳ}M{Q!btKLnfd5 C߻(qPBiVDPj |7G6CXkjf5˿1VĶҚgfSk)nc?G~[7[}h/"hOړ,ލ_Z;I*B;rx3[a#FiV7VCHNIBH7NLAnC;֤Ye[ Dw i/bWʍط\Kqc9oB:v[|h4'zI`립[k-&XcvK5c}RD|*+4c?qhjjj^cY{}-Obk|ƭCXF#c9Q.ml-;^;n+ӞBcG;X9B{F,赓B[`퓽 lŝ剭%-_<![=φdiڛ[Hb?B+[b~5VM{V({s9"X_e5T]k]1?cy3'ߢ,׮,9ϭ &~{ V^hq-va/͍JQ|;%}|cO~i-,uX_wyg]k`Xw73B63,c%{%B:ɉϷsC:-m0-ތJ soѱĬP52 Cժ..qR)78/v,ycy],~ߋX.0`9懰h!)*DߵkdԨQnL?Ɉ#wo89#/d6Jkkh{U|'kFr)$:kmѮ*L*ck/|% T5֥_zVٹsʿ޽VK.rYUNO>9Ys5jv)q(c]h' YXVP^&_E'tBX/b;jWJ8[G(qH2Ś{O#ICxp ! Vc=a_ת^i5 :!w&*7oi &c~9V^h'݊E#)*D/fm]jvUg*$.l2s'7xD_`:+YhAh?CXL|% z5i2qj*wmˣ /γgLFСCra%} (^ڢk40a Ta5k' 6",}HE'G V{^q?VUne~yH2Ś{Z4/,tBu )iu9!w:V,j1}5=!v 1?[A穀Bi諤>[93ǖ%!*[+ivIH*q톘*!Qj TKe}{q[qYsBַǽVܱ:NWm w{9 { WUB;X"@ I(.MJkI<ʿ믓z+}i/*zV,rK/~;S2hР\J;}ZqFX96O߻xI:!|֮"]q <7"yY^߶ϹZ魅|BHLgwk=9eDcunu]%bɉVǽsDqe5X"y>P4rQ(rw}pN8EڔǫԪL1Dv^͠qU.n^d*Ys.]ɰaÒ;#+++_Hz.jOlukH2}/,cw+[%l!Y3IP;?ꕖc~ѫk˶ĺ !6C5U&b<!d9t i㐍չ}&w3EY i[}/>q?}<(I(ϓ,4{gP'Ie&ZeZ=) ;L JG>y 3Pk2u{#L-m0{-K܉CULdRn[;^qq嬮oE ZY:Y!\0xCբA~9w|V8;3}~sw}52}ꍦja?mrЎ;c~H|h$P> HeDrB8KhsssS6C2lJbw/4>Y)?<64}ڏȲ.XڏTa#9V{[!?ֶ{w|qq}?!ގycϋ8e{9˶ ![ ѪU+xBHL'39׉8;ݴ,wg/?N-早vܱsM$P>73&I.LBU<Lcϋ5eS,[ڐGh{aeدZ6!W=- 7>|:Fh9ϋ8e ex Rn~bAZk]ߏs.eϹ!{;eW#gu)j)Lbe=-vQ+@S|响7$WhN|W,/,*3Fr!\"_EwJʍmBrJU<_G { 4ba㳚Mp}5T.BeB̯|՚kܴ;Y5}oyOA{?Gݴ>1?79EH@:p?ϕ2仪I'j꽨&m8ه4Z 7 qF[ڐG0kB;!~Xl}/BD8iO}_+&d |Қ>M7ݔ<ɻ[]ɱѣGO;uQwYZ=džPAr a ֏C-^6R,㠑Jk9[ގC2L'bvߧY^piuaWi 82X>q/4-)h紴Uhjjj]`6h|ODR. U^N {D[nIϞ=ݻ'N;mL+ԫԩS] a[fRhy/zeH}EOl铌9gU6XSb:.Eo$}r!Ўiz>!WY?,+{P֘/BZklǚ*[LO^ %YI E㽪dֹ}57=eqGc}_B5քvz#}{nDR. Us;S2hР?r" g>N!ȱ~$o;ۣ]cM!u.z#){aH4n!]-eNO/7S-rA"o5i}-ZR܉8h󭮭BWw⦽\}d{B2X!c[W2ŝF@8HE\u? ^kiCa'_3iFH}&/k&YveFhǚ"7PCB{AMq Lًm 혟VC;WM'J8RXoviXֺ! nې[0ޫvBg~SumlU~2՘rѮMq!)*D'oyϷzk{7dSfRhWcB{ǎ9]uU~:4yҎ5En4օc^X=džpȪ!ЎiI1BUE99Ҿx) "e]߆kbkj}-nH1Hk[6!"׷cۗfwqG{O3q/>ִ"g?n qG0ODR. URK-KviÓ;.իWß]6<ٗ8(Rk=vȱ>xᆱLj9眳ϭv)rAXڏ+z3#{acL vO5uU1jǡ誉!˖6AYǽu}KOӊ~0abVشֺ|N~~Hq^k~V~Nh]{_47d}/B26CX= ͧ* 1_M$PEnfVZ)駟*Og'*U&Z?}щr"׺ꫯUW]7&={Lz8㌕;\rɺڧkPƺоӯv߷96JvO|4b՘#BEn Dovj Qo#ָtxaq1HkkE㽪y~H!|K|\=9h_-kb~sqG9{W֘h")*1(-sp)z;T);|NZ=} ]zРAɘ1c&wNU_|1vik{ڱEE(c]X;}VUbM6wBgvO+ZHAciy]B̯<~5v߷Q׷Ě5T=lNoUUPCAZk]b[Hq'u3aī;3wdlkַEg8޹2yeKKZ[k,bVX,.J h .)3<<#?uam5v+xB(^:LZ)q"ךd=+{^Kʫ5SXS..EcE(J߇=}/c~Z7rkky]B̯CJk:Q׷x4qVcZjNsǁ'n!}qs-?׸+׎;|V^h^hzgR>il"Jf_dqw(Eoftk463B&ƻq/JVz!%bVkb~C=x|( &cP19X5oà; iu-.[B#s-帣^CRCPXhoqqi5$_˸ojj;Fq^TĶڏٳ<^X=f9o>mت CHI/"_e8h'MhT EUҭ^<Q15z>L1?׺|ַuzKjb(BXZB;Ak)n}[|kO eti|@S\+:ibKF峪뮤G5=I(dJk?@cJkU+zA-}=v戯Wmӎ5E/BBbFbb(MV~͊e{c%Pcm!TY]_ qc(Fv C}2Վ5-m򝡌wOH8h|n(1HL+:Q.㠱ǦJE/qs-e򾖢y嘯=oiɽL41DR. U􉾖^mړ\a+i$ʅo`8k~gU}_ӎ5V^Pk\ ǽc)bY^,[RJNU|D_xP_zkXN?Zl=-1?n(1H-2_sǁ[sLϏm om旱}VJЎ&rQ/{u{.0`@ꫯ&.l2dȐdYfB8JkO4 |*:H#駟O>$yg7x;wNzJ%/yoNj#u]CqWY^v6ߔ5)7P] Zb~(-B;UVǽ(˜HVZ1 Ƭo'«8mx혯 %i}P[h4SZwC8Z!TMɉۖi~ZsB{4bII(Fez-mݖn햬 ɩlfu}u#|ZA#|V2zcW^ 1r-s=7Yy啓+i?jg .:1Q>_{Aq1:%)&1>Cb6dƽОsEl^bFƺa?gR,혯 %i}P[h4^㠑ՈηE/2޵*}-u۲~s2s҈nE\M[9Δv;(K[CjgNUkV2L3%~m2pR_<.ɾGkW+S2z׺Vޱc[oM[lOvqd5=E-#|[P/XIȇ":B#)7|]#L7#Ur^=b~(k}+UUeϙA;q+Y(1_{_-l뭲ZbM(}.b-m(yx.#Rtsc-4˼f9k P\ֲӧp2aBO6sOD#F;6СC͟=mi׾㵌Ⱦ/{\ߞx߲T tQK/cߋ2ǚ*}*{c%!<,cu !T7}6q(c{bP-ZrWջ-x1;q(Z7-=64'HWKzڷ4%*\َC*VYwt1k)b;e"eeo}/&52JQ80軟nIVԫOg%O?trwWN.U;S]'aqJkW>: |*wީquv5MS}qq^N?͌P,}/Jk_$niM1?jJ.:"uUMG5*Y)(_[=-h}oqۨ؈bxOӈ(qи 8lU+}nv&cvܱe[)S̏m/Mh|@S+wQ~РAɘ1cf- %\О䊢7B퉖fj(}.O?yf!c]X jdP_5SB7E颥qR)7!ĝ/8P_w@#A+$PַB{VpKcJ R)7=o8kb[[0_epoy~Y5}{5A}@ I(TћJ%/gyM7]J_~Oye/z3)מhiJk]/zb[kM}EI_dOvں?K*EYS|V^#9c~^xO_1(u/|c~(-qf5q3R( Z־NkPַB{iy?'}*1,1_/c8Q)8?E2޵sҬ oy-oM$PE}ӹsg/ӨP*= OPJUW^y4*XSt(c]h駱JElXV7!4JP[t2sϛB}K|g(}`b[ &9n!=^2cv4{B8BD_sPƻv1au/Mh}˲)ĸ==Vc~[@I(FPB9h<"o߅ Ph6 5}尿*b2mfX{EPd?MMMrcoBܩxy(}=Šo:eg|J8Ӫ"g9k4⎛@[pվc=7޿{3):}/ηfO!ЮZ-7c!}/cy[-_ bոBO<6$!<ꭊ}s~7#cK7η>uݴn r8Ϸ!{㽖^ecg7k@߻i{9WձW4E~z駓n)y'w}bu]I=j;T2퓽fv߇B?ϕ~T^[=m !h%eiuQ䱠}K~vkYZ6Jk=-j뵏hAֹ`{Sc~lf=ɗ嘯}j# fG1?- Kra_j.{;ewϷc~Y^w &c~[@I(T>}$#GYU-M֓ eߏN}B7}ѣG'LF}矿B):9..7Q5CxO(}1~vMYKG#1=,oCEor&7C'i|_=縅t8WK̷ǦUxxO+zi80wfP{NHBŤP_;n}/b ai5p4By!D#7`dvPyv֪"OeAŎuk&wݺuKzt=vi+wn&Css_[NjnKJB!uu#IQ¾'/KVoh}?E'VtbzHA+[>߆4q(z#;{1_hVhw94}uCAWGոq:-m0wu=׌m]UgO?M[!3rM$PE^Hx5\, fTRX;|m*Nl9N;% j3B)MHc]hiYfFHQtBt^;OOZ!П [2>Ͻes C_Si}+ǻO8i:߆B>α!i{\)78VN1NU!vܱSJI(TUW]5y+СCß׈EOڋ;_J!}蕄|Ě;]wݵkDXeYP[5WBtH}5pweHUDl?B{nV䜓7{վVVeoyS,_ېbz<s{X!wVvBH*r?Gg?Ǎ_1DR. UON[oq)s9zQ-mh}kR߇^UX?Ó7߼g޻ϬWjڋ/T}_>koxRp}oa1?s"?abϽVVe~N8nڿη! .1-yq=W+znxacuo'Gw{c~NB{b~}/E#)qW(SSSS%g+'JrUW%kF;IϞ==z$38cyoגK.Y0ꕵ,vgMR3}oaZ*y饗w=9ӒÇ'w\ҫW?Ve9a4o}_.u},qŃ2vIqp|Վ;i7W;[o=-h} sjBo )=ӊ|yHA幽89VBȵ/jeS'?r#rQ('3<33fLmxw*zɴN[)Cdh}OǏoܔ{Yb%ѣGgO>ˣE%|2uT/Kwַ>/qᱶeo|^H87ν>{ַ,kscM xo;efqi>Nu,s{91w-NNw2!oM$P>'=\%fMuF~Nyrgkꩧ;{2ъ{ߋ;mz->htKU*Xڏ!d/cmc{M68C]e:Yccmc-RB:?ެq9g<^}^/ikq&2 hje;e:$i8S-m0y-%FeSg?'ZJl:!o@HE|nfdMr):מfx@;XWjOǺ.Xe`OcbZ5}R;N8d^*w|>֖P=jn!2ox^iմmbP1?.SP51W:幽~Nƻ9 &}2v!imO'븟;?^^97(\9~S o"^N4MMM9L'Z/┉F[w D{A{#LЎ;.O8(юiݴXϽ>G|x4۲|?VNUӬJfc-hWVc~ YY;/#^N8紓W65 MsssS֒0ti%~N;m2bĈd)_}U[$|A={&_~y]*hy-0Ik=:0`@eԔt%9kV{ZoݻYڋiǦuƺ^嵑T/K5^87}.*Ck|e9νns^qyyַB{cy?G;֤qv-C i_jbZq A+Q^qyas-6Q9N_{_rߗe}+qj) }=QnDӭ[vHNx ׯ_rm%#G,O<Ě?KD'8}?yy~)YeU*{} leJfqdJ+|u%.l͟B.X<63e1vܱ<<9mz1?w/qЎA{ݘsW sN}^Y+ĸiմC۲ĠX)v-׷yekcսb>qǍ/}5*,_?ю96rQs)~ꩧ&~{e''SM5UM=D;c4M}&Rl]z.RLvkUXueP#Y|}7dkQL !+uEu}+?q^3y܈ArQeo|ofs="Nl}z̏m}+皵T*x׎iv|[z:!4c,A+Q^{?VR&VFiSמnĬoc{@I(LI+R/W|'^8رc͟]@䱸.KkHTNݻ'nϯJ2|նĴN[&!NNm Ƶ$H0ǡB`cQeo|Ǡ2GbhY_SQY{l[AXX>1?Vl1OO=r7-ho(pR}mik)TljjNec9k}=-Ii=\D ?<;O>W_=6lXңGY/$KD{=Z+d_/# jw֋}{&=P893Yfek$Ȅv-꣗jUX[)SRn-Ie͌<1]!W屑]c[W 혟fu#7T-"NY>G[] SI8iokY%>'/qz}\jiC6 q]sssS6d̲{2/e[^Wi?u G@R. S.{9)92{s+㏓[%묳NҫWʝs5dOb};$>hrNxgLY nK'k$7kL>dLeg駯_'9c^z馛V6B},c]kӺU'H-7!<6Sr~|'BvOrBXڛٖ>G[] Ś4CĠ|d2\,|jyfL]{))p'%2T~c~^1 b~<1?-_㠵7=q޿<B}cاBk@I(L^rUx;"wE~7mݖ<3 /{"wi."/Ow><%?yVZ']tQϯzrV *d"'[ounFiuxy<0N Ǿ8_ճ$B{qF8Q1?|g 8Rn_ܛgrCV׷XxA;C " {?< ^1QCc?s"!m1[ˡWJ5suwA]+|uykz{)r>Ħ\ͱdhlD"m]{&;6);u2# ǞD]}PqcKC싖YdhoN })Yj>d# @/S_ӵ ꜯ ̐f)w-#eMf-rP"z>DZ{V&z{^Ey5眯3Ӧ}uZ86Se]=VRoTt*bo) s} 묭=?kDێ׉}Z.>gOY@k#ARAc?y晸us{=6LlktIM:\Ny5uw,Fj2*rP| gꍊa&;ur'y9L`'Tǵgho\7dy>k\S-A=Zr.uw?A1 ZmnC}{u{<;k%c,-uw>1K{}ujM1WM)s]p¸Zg̨kb0P;/TXלԱ_r.Ձל]r6G>k s~Npwϵ h)[O29O}ju=e|:lV}8cj2*ҢF1ԟ$p;*Zn =LmϜ9;zLwficXT23|fo5e(uwY%{ίΔk>ds3>(~ږiVCﴷm}rCgͼb9α8!JfK }Pm=cܱUv9 l '\opk渠ncs:KuT233k:AM󫵳3j%r`MǕa^my_8>u{{u!qL9s a\Z(U#-  6vź><Ɍ Iズu/9*2-W6 >k oʭVշs2!CM)ZsKo.<k?39 Ni>bg>GGw}rQUR&6>1,jv+u}SZyf|rIK!mXt?Eʐ\sk ?e^m>M= 9!w5g>([真irmC-}6RSa>GK=C{F{۟:Zzɧ@cߦ\Nw\Mm]cyZ:L!egc5e(Gu5!`v2u\s:, c]>g1j_Uy jg>GK[uޡm\TUk66 =P7U;zepk:;bߟ:/9* S\>7d >dߠU-[k{ Kai"Aj1q|U9z>طeW?s Z:P۸)U˨Hk$^ņOiP}Źt7Id\䒖z@M2$TT5g ̐}OqmM} \an6+Crm/Ts^=O2q2)>ss{:L|@^k\'PCu>x-Սu]koi5<ߟ:LOPט'oFʐ\3jS-nMszPFZΛr7Uw6);x @iSyCS%zٳgĿfZP ZZ7hUt2(6Sws%MU9,jzP5WeW;3)T}iS{r>PO 97NVoS 0TAqHR$;X3}rb^8s}XgmKYb-5A=r~gr+wC\Sgc-QmV6(;|ĥ3Tk{ Zy5k2jϯVf*bF߾?^r~7墪zj:2L*ط&T7z8O$su jnRث'&V:,i-5Aη&Δkrh#=Wyy=לTڷsWbߖ_-}z-Z:8 yP5[Ըɬ-ç8*6nHW 0m\{<?dImnX|u_gMm={ q͔kXKC96-S?Z rz>zߦF:4ձVC(˨HڸAq uc{է8\i qvɃhcXԤ iʡZ3C93|9+^r~[\S-XKUc(rml[C?}qO%眯^Ka>-5AB9g;R 169lA!ϷhnpHRuԧ,w`9q[ br;whcːw\O~Sn9K)j?C9ܬM5S 7.QW-oZ{2mls5mSbߦ}w9g9?|z䝊ϐwzjdF[ATlghUuM}o#^AF}2^lw 2%yMV} So q#e(a9g?Z3jintޘgmP̱朐Qm5Du7hU꾦Ġ=c64mŜ޻j͐ }[+6I=׺s]W~YtlL 6vY؊0|^QL7hj9(C9Ns{zbW{sz{rM辦a$~ZOk;oP뽪\v2|9ǵ:c,u9Mձ* zjd:/'\'6T,ju=<hcǘ uƭ}sЖwYE+MqZ3u5mܔ;9b3=z*׹oߟ:6uw0dfq}PwsT5Cjײ7~Vڸn6uiZ\ oa+Ȩchc8 _Pmܚ؇v%MB5tJ2ߎN`>mtib@6d㝡\xu߾Z샺u^KQi2Fr~>:8|u{ ˨H˹Wo ܠl椣juZZ:6uCg8eIoSI%E98oNɐd(o;Xjݖ!T\H3Aݞi;P\s`>5QKw\}Pi2Ӗ;8|uz%H˹ep6"Z:8/;x :׼a5AwmM~G9*|w2~Ew&):ÂX7Cwj˸7hun'üy7Kkпt}PT;)k'+6Q+x TX՟q] >TkY[؇ uSm=Ff:scMm|ʼ Z5>Goː󫍷Tc]qUj M=wZu}cm!P5Cjlm˰PWNbiM5Wr¸`:;xjy> Z۸)}>X>gpQlrw<͢fَ|r~Tc]qUZŭZqZ:\pҖ;bu߹tPFZ 02,U,7V*u]knS>T&\cygߦyZI7ٜ={v]Րk!1O5e\v\}Pd:aw-u;KԱ߽ÈWQrUy5A]s:ZOdݹWN9/n(?A<>Y-|rI+Cr~~[rp5Cs?~:9+kԷk2r5ƺ ZKbTmk_[U}Pk)9MmF|+a+ȨsN 緩7jDZΧo ys(:DǶMhIsHpҵ\ =r|SnqUGoSPmc:wۉvw]wYS!'4djoПkS5%e;!>Ukz{ۜ?o\TUk90ԝ;_;oSݹc55A= mlgXs[ȐFʐ]sPOW5ky~ SusyZٿ|W-g)ަ'y>AP-mP}qUPPדCZ46mL? ԧ\+ԟs2\c2/A1ou_grhS{v0dԱǪ Z6rM/hvT_e;:A5s4g-M=\-YFLkݏoUWwZ\'L-ߗCIzk]PZչU>8OfȫGjYVus'w0dԱ߽*l:>u}'״ގ\[8 }ϹTvY^M9M-uYKiS'Wuw^3qs9PדCZ΃ -^>Ʀ~Թ9~m:usJr]c95N;LU:j_ʜ\34ގ M+s}'(64Pu.-c!z؇ju?C޵Ϲ;XΥu 4ݟͩ'\aOTJׅ}pmcЉ \AXOo㳶c ⯎,s~6۱ԿiEU6'cW%9-+?m[sQ5ޜH>T;u?2緱)Uj͐dFk];ZAӜ4lV}iNuM}ʵbՃ ׅ}p;ksIpFێY5mnЪ8:K3T;r~"ks59u7c]r~T7Vyz:㪠{uy}ps7c PFZ΃ 72Tsl=>uq$sW~m:bߖiѲZ9d5ZCQinvQ;X9\3@{;7o]ޱg-Sastio,XK1:L7VAz=9EcYꎖZ)&ԟ{gc?K߽ÈWQ>}u\A95!C٣m/uK?>u}ӪmcWל{9ZQmNjzs6пQ> AZQ-CGZ՟$p=uTpTuT9K#- J|mDO֫:Y \OYyF= \ch9/ŢeŜ{omogh{WwK}oSju=d\`ϹԿ6ʵ4+Lyun9(ʁOeW{e>>N3c|9_G5w9PJ3L*nS];Oށ@%w 2ot2%:!1mScDnW]WS-eVju=sЦ4?A9_]ߗ\疃8Жa^5f<0؏AoSjkѐM[r_bѦ[:>?:;/%؇LQX3\OX[gΜYNط53G]]7A%c]-r}ƼC{zZ3|5a>mαi-Z!kVW\ۭsh9#vm[]|PyԱ6Nw!/w)2w?A]ľM 9 Zk&cc]r.9- nd^!úag}Muǹnoc!rNjfKRƵѠ`бmS/P߇<7c\ - hxL']WA]s%w 2Ƿhogf[>sW@L2ViSǾZ C2T;ꜳ{b\TUW\;ZZ\{ד!=!Ϸ܌Աwޜ} egfгsK۠.bߦsj9Ц j9(2|yϹ(x|pj>g>N:}P)8^]c>gnVÈWtֱzwz[)tq>M cb?lNi_ߚX-A%mPsm/Tj}ƹU%ʡ-CίO\疃۷eZ3GMj>7'6u⟡c ~HuP=jܠXu}b,߽ÈW0Af~8Oc?SZ>ުcD9pߟ99͠KqUp;6 iSǞ3ľAP-sNp[@^\Ozg Jpmw{PM`\]׃k?A{ 矉+a+Ȩ?wXS2}mPoS9w0dǧαW(6o`#^AFuFu_zs^=\ numzOs\F3Z\op{epݰ>y8rM]]Pr][7MɤYPb}[;d۠.bߦsj9Hߦ5c.Qm{ƺ]FLc܊yGQ}{,N\83žbQľM٧_ Z iNfd`l͚%ϵЦc?K3Too^u(6O}Aߡoߦw 2qu-em_stfF 9?@ތ rhe8YY lU]3jꓖY|z?KCsΒ/U98꼳D9ثs~Sn0K}V׃:Kc]u989>X_Qq 9ǵ\Vwm؇j'dػU#5Ɍ  3uGyFZ۱=sf}uϒ竵a؇ju_s(6 ;K6u{uwܚx|ꛄ}[r/bKU79YUZޙjϰAF%5dZ3hHɌ $uhX$gߚ[-]pϒ竵aa+Ȩsֻm>k[1so`a+ȨMP/k2CľMuFvtZ961֦Z}g-E'Ú|:8|uy>G;X9'c~PՋFjLfe8T-k'+(bϠ~c{uw߄Yb}uYXGw\?;9ȹߣ^Hp=_9>r:Kژ/{ίQ%ɒkWdMka- 9y>Gws:0Fr6\  :Zm3胺ޖK,}%;^1(T;ksN7zsMV19u;o25ˁ__g5qɵɌ\Ӧ׼ZJ6hwڈ}3o]szl= dRW\'366D3=AɭB=޽Ak\@uԟtC%ʡMuVNP%6G1oOM:nGGa|ۖLrP|O*WddɵT-_O!緩ǷZձnܷ*{z3&H)F}\7;wT̔k*.بs oSǾZ |C%ʡ~9ys:6uK\9Y{\^_"緩j*9?íKhx6Rː]۠;9_w+FSȠVOi9/gv 0xZ7Fۃf̨־u9cD9)~9ɹľ[pb}Xr`F#íKN3]xY֮v0dgZKq;ľ?uq9aa+Ȩ:@Z4Y[l?ub(۶ ZUWxސZ|:Kkaٔgf5Z:/h{#:|"vU5>sЦ^Z_Bf~&yM=ƪ{u9P-!l6P| tԃ늱W 0;nMt3mʭƆY&3M^Y؊пs] |2M{NY[ԿBAA\ӦkV}PAccsy/P-TZuu\F=\| oS :@~Hy?IbÐ cu]=8D6V= 9y";r~vɵsh{SOf;/dߠUg55kɹ:kp}ɵ-fwNڜUjֵ:w|NľbW_ju:M^`q{NiNvl30k2,kԱV,m,rhc kϰi5A]OP99Ѧsz\pc##_ٟk]x횹ށecf=sXrQY_5SmlC>ڦfkf*?zf{u_r^QkvSdvrpuPȞ59L}M@P|sq6ni.e9'oMt^3W\fybr>V''32lcDzpM`Pі!Tpsk샺;yطq{XgAZ3C9Է{T?!j}\C}9ˁ9cݓ6v]u@-n2kc|ۏ:ϻi:8c\3>sho2jϐZjEcӖjt*0wTOYgp}%;bߟ:K. \Ac Fkc%ʡ-eK7e*@zyuLyy\]kݟiU-uޡƦ\TVECJΓ[YwTOYv+ogicۈ}/n 19?C{Zk@?u'緑 he8Z=9_1b}[|>NO:^r5jWikݟi|iֱ6UΘ5"tp56Ows0pL uP6Ϝo[5AicӖiѲZ EלF%ʡMV}Pr~jJFKQeɵ2usb4|ufmoQ}bߦncCc{˺?Z_'s^=ukѐM[MĿ?yb]Wn7 ]sM$6bߟ:K9?%׺\c5Uw={[b0s;ƺsl4L7hq{e|o_Λr33]>9Z:66墲zl$^I%26u߹cНfҺZ}WofO.G-ӢerȾhY-gkPA4dƸ꺾{6ds-ƺO<\=QNUy>[<5Lk)b?|NŜ2Fːz=i &?v޹c5΋NnRo2-ZV?!=<ÍK?C9>?9BGvm=r0u4 8 j{)׼u{f9چ!U98^wXuwB:T}P|Nz3s)kѐ'uChj ަgLfP6n/K]szl'l͚[g?y ZZ~2jmϒk9dYȐ7U@MݷV׃z>߹ޫc{3EaCN~>R/"%ONDmPO`Wې b\{<gS}[*c乫yX0,NO>dߠUm;Sa5Ц0T-1d*FHyp!mO&SU7z.քYF5 O۟s3="q[z(\LT|q\Sgc-Qm_-9Z'vm9l6ru_U}8oRMP~y4_0@_hs} zl |CKثYFV@iS>2Q1bؔۇa u[1g?Qg53(6fj'(;|eK9'oWQ5U׼|9ZꍡαϐwZ-r>qnw`kUAa"MX_;kص\ {΋rpno3|p 縉 ZM*\ӖI9<Ǧ8;Cs,T|W=\Ա:5篍}`>?Zs3@/)1k)WONnp] \`} ״~؇Y؊ yg7ju_s(6=R}:=CYZ W42ju=d{vc+{%|N[1k샺ws}jѐ$zp{ nϵتs m|?ibw 4؊4A96VD9e> Fϔk\X!S_ӵ2'W?A\zȐ(@Mݷ\}XmX_-A yPדFJk'>_I) ~6O<)(>|T]?sV_u]??:Ϟ={fnߟ ehc/9R睋/2}Rw~w.H {=v*n =GJZ?+n{/9R;+lvy6$>O k7?x䫤&jc?]v٪)K/-5{o׿R@/.19Rwsԟ^~b؇ ey3q?GE]ϑ:\r 9(M8Ӝ:=s>۶&kk䠶9x\ʡ ߨuSi3Cۘb^1Qrq}c ^~k_]2MO}Sɨ<\p8]z//W~W+_D|zvFЇ/|Kzz׻~x߽]{8qg<wc'=韞x҈_؇?}{sQvs~pߎk^g~yӞ׿Oao__7o~?!'oV32ȏxNQW'5W0z>y{G\~;b7v3f7"71vo|grc.S(lQDWE/zы\]N)g>󙯎rQϙmnsOE{s8| Q'owg~Su|ۧ?[zlv}(ny[~f3"bCF=g6խ>cbso|؜}׼5/>q9\z^w5kX1ŗPrqT)4Q4fzի&G?Q.sGG>3cڛo^{9'A↬ſ5X|c=!6~=EQXwq 8"6~3=F}sPvG?zg{8XČwq 7ό5Mkoweor8tK_?ƳpbSX?v_'Ț#,E޻R8)6KHW6xEyk4Ȅ3gΜ 8fLAE*[ 6FC|a֨+wwUV5_=Mqeۊ ~;=&wnԈ |D#~c~G]Ł~Ŧ\koAy[*/^,v`_ - `Fixed integer overflow and EXT size problem `_ - `Fixed array and map size overflow `_ Using OpenSSL ============= Borg uses the OpenSSL library for most cryptography (see `Implementations used`_ above). OpenSSL is bundled with static releases, thus the bundled copy is not updated with system updates. OpenSSL is a large and complex piece of software and has had its share of vulnerabilities, however, it is important to note that Borg links against ``libcrypto`` **not** ``libssl``. libcrypto is the low-level cryptography part of OpenSSL, while libssl implements TLS and related protocols. The latter is not used by Borg (cf. `Remote RPC protocol security`_, Borg itself does not implement any network access) and historically contained most vulnerabilities, especially critical ones. The static binaries released by the project contain neither libssl nor the Python ssl/_ssl modules. Compression and Encryption ========================== Combining encryption with compression can be insecure in some contexts (e.g. online protocols). There was some discussion about this in :issue:`1040` and for Borg some developers concluded this is no problem at all, some concluded this is hard and extremely slow to exploit and thus no problem in practice. No matter what, there is always the option not to use compression if you are worried about this. Fingerprinting ============== Stored chunk sizes ------------------ A borg repository does not hide the size of the chunks it stores (size information is needed to operate the repository). The chunks stored in the repo are the (compressed, encrypted and authenticated) output of the chunker. The sizes of these stored chunks are influenced by the compression, encryption and authentication. buzhash chunker ~~~~~~~~~~~~~~~ The buzhash chunker chunks according to the input data, the chunker's parameters and the secret chunker seed (which all influence the chunk boundary positions). Small files below some specific threshold (default: 512 KiB) result in only one chunk (identical content / size as the original file), bigger files result in multiple chunks. fixed chunker ~~~~~~~~~~~~~ This chunker yields fixed sized chunks, with optional support of a differently sized header chunk. The last chunk is not required to have the full block size and is determined by the input file size. Within our attack model, an attacker possessing a specific set of files which he assumes that the victim also possesses (and backups into the repository) could try a brute force fingerprinting attack based on the chunk sizes in the repository to prove his assumption. To make this more difficult, borg has an ``obfuscate`` pseudo compressor, that will take the output of the normal compression step and tries to obfuscate the size of that output. Of course, it can only **add** to the size, not reduce it. Thus, the optional usage of this mechanism comes at a cost: it will make your repository larger (ranging from a few percent larger [cheap] to ridiculously larger [expensive], depending on the algorithm/params you wisely choose). The output of the compressed-size obfuscation step will then be encrypted and authenticated, as usual. Of course, using that obfuscation would not make any sense without encryption. Thus, the additional data added by the obfuscator are just 0x00 bytes, which is good enough because after encryption it will look like random anyway. To summarize, this is making size-based fingerprinting difficult: - user-selectable chunker algorithm (and parametrization) - for the buzhash chunker: secret, random per-repo chunker seed - user-selectable compression algorithm (and level) - optional ``obfuscate`` pseudo compressor with different choices of algorithm and parameters Secret key usage against fingerprinting --------------------------------------- Borg uses the borg key also for chunking and chunk ID generation to protect against fingerprinting. As usual for borg's attack model, the attacker is assumed to have access to a borg repository. The borg key includes a secret random chunk_seed which (together with the chunking algorithm) determines the cutting places and thereby the length of the chunks cut. Because the attacker trying a chunk length fingerprinting attack would use a different chunker secret than the borg setup being attacked, they would not be able to determine the set of chunk lengths for a known set of files. The borg key also includes a secret random id_key. The chunk ID generation is not just using a simple cryptographic hash like sha256 (because that would be insecure as an attacker could see the hashes of small files that result only in 1 chunk in the repository). Instead, borg uses keyed hash (a MAC, e.g. HMAC-SHA256) to compute the chunk ID from the content and the secret id_key. Thus, an attacker can't compute the same chunk IDs for a known set of small files to determine whether these are stored in the attacked repository. Stored chunk proximity ---------------------- Borg does not try to obfuscate order / proximity of files it discovers by recursing through the filesystem. For performance reasons, we sort directory contents in file inode order (not in file name alphabetical order), so order fingerprinting is not useful for an attacker. But, when new files are close to each other (when looking at recursion / scanning order), the resulting chunks will be also stored close to each other in the resulting repository segment file(s). This might leak additional information for the chunk size fingerprinting attack (see above). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/structure.odg0000644000076500000240000003643514646713253020150 0ustar00twstaffPKyU.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKyUConfigurations2/accelerator/PKyUConfigurations2/images/Bitmaps/PKyUConfigurations2/toolpanel/PKyUConfigurations2/progressbar/PKyUConfigurations2/statusbar/PKyUConfigurations2/toolbar/PKyUConfigurations2/floater/PKyUConfigurations2/popupmenu/PKyUConfigurations2/menubar/PKyU styles.xml\rۺSptIǶ8gN9?3qN'N:ӫ3 I)Be߯O]H'u}f#baw, ~yw)˯Y8h$͗WO/?+X1%,ެi.RZW3ƻ!y] ]2}U,|$+@AKxA[.($'iA&? %ܶ6-U$H˟Zy 7 ?;)$_0K4g<0MoEF|s{1.&cG|͍SwY20bO̍77Fc?yaon?im5>'t2m0x> )hY7XMf-;Z~[YKB$+\~KkO4 {7 (TS-#l\ /V`)8Nʕ+-|F?y7z 2y6(#0g4_;< ! t"de6"{4^/\@Hi)xD<>c"c/w/l |VS|\)UN`$ k>VI+Ɋ]MJٰv|a9%@ CE/}LCr_k ~'XRPY+\,8_(qGneGݔˆl5㊩ Ǹpl8^_>Bed M:AC 'SA=>H^U (0(r=}Y~@,dq& CZ*Ԓ~{?fQbT%'#I% eiRҔTۦHzC0GKVWvMmqKƯk <AZH䏦`DPxamb<]|ޔ"]>FsK[t5j`*Ke5B>@5*)T״9i/[KR"F8,W3b)s_PWJo\w\1tír L3W%'0#n}J}8H步~(0ݔ/kEUǙMP#nIlޗV=[X,Ht]Ƚx4K]51 Qe H=?XlS܁š)Nwb)tT-J[ߥ~XCw_a0oex9]N_hSpTw4aOTl(Z֮)RӾ-k55Aipwo2Y/"uo 1A}!J ,,ߓÃlDGB?u7vKݸpiІcEt6śh2\^\N <Ї,aG%yi5ޝ>)SCwJ{5nEߴ5{05'9˒hW5t=,zwP)k/5P+f[n]j4#+FG`+vRxfTOHGч*_a~~<̰ U!%3-Q7JGUey9p-TLy~~$w[0G_A'O v vwg;̬zN}lzXmW{u>d[Bnm :ǩ3o~v7?#xoF%A5k~x/t|#Ӭ{n*S78vs=&^<0O?N<)cؑ8 9uRD肏,0n4I|m}lV6AišBFC@0 uBƉ~/e^ۇGݽ1W8:8֔AU!صCEkV=©rʅ:߻2h- PKr_C% EPKyU content.xml\ۮ۸}W%K'h2-0@9KAK$$}c_RX-ى}9σ-{{/n.^}^d$(Ɇ&y<œ_?$ T PNٷĴs2-sB3yAi14TLU5S}|+'L^|I4$SLj]t' (p* ,IeYJ]L!aSk hzVז')nVK8 C -KP,hvP}_hpiڢr n H1&Ũ h!ɀ+PZt$& aZKA#\,q*@)P`0=p'xVɱB'`}j)\:Sչl[`X[ @4m Ov ZV Z<ZX_J6$U"4Єe8|;u O+D ވB/9'͘g?gzfQY$" ezڴS! qZ>E`t:͏A $ WO`HHvtb@޳L]{95: pRLt1^ lYkMu,הIF@)yxUv&Y*߹3{Rz9ޣ3jY6߀?TYjBs17}d)1Y3Pq) emw ¤A{rQڵ8+LcEF'aD8bU1.b s z1ҏ? S \Ś`8d[6DU:XR/"iD|vl 8*[xO5ƠX$A\̗nE)d=8r+`# 4D'SgÏ%I{+IJv`%Qb&Rr#4͒Ie4oYNB>..Ko`az2N9~+gr:mq TTGu,:ZO)b>UOYl-0]/&Q2-%!O.@7q K#Jtt?'N/u7Yb`Sҁ 1d__4sн(Iә>Ihzԫ5EK_T݉DOKɨ50- PLN<4jyu#W)C H}ܛv75ɣu39Ԥ@L{OC`}{sӭlڸ7&cs&>ݝCn pӪ͗i TftrZf)c&?nBUHvûK ,N=F`څ~~d6oI;A!Y@E"I~fnڎ>F}vUobIȌZu;'{ZV6PK 8HPKyU settings.xmlZS"9~šګ}@D=JԢr{fșI0*3f>܋L}NOfN??l7^<fp?TNϭNxLChD"Lcຢ@kvp:Wm!D3j4U_\rR۫W߃l4n AU NbP 6gXĆpqQŔm `VB'2b HP8o ]g/mjXְRxxiſ .f&7)^'țoT kK C7%|wb·O3`4y'f{p.+9`SU*Q%ksABkǎ{ ^l{9B\\lu)h#Ѭ`*ry% |_~UVKnLaSBtb![sn6 Lz0!܁,r]t;(ЛwmRiڟiߴ 3qCxw‡#ŖdjJ$Tpه))34&2Ubf*IPsNi Ѥ*9rFG>]DMmHhI45=^#ڊ>%MtG)IK؆'DkKdE , umZ[!G4<=,oҜ/{6 uL(7CgK_ }$E0oo3WDU6~m<\մ΄xx'8#჏2ڟ"JNӆ=faao|a_? MD-ݸ%Ht$( <J%7L;;le$ꋘR>ʔ$tƱk#ϔ0W^iaAvd6.#s,K2KQ< OO)tٚA/>)F 'y#{% #% B+4_=wnIǰ !`ŷH.v~aϧݝj]PKFm|p&PKyU<"55Thumbnails/thumbnail.pngPNG  IHDR<fPLTE """+++111;;;CCCKKKSSS[[[ccckkksss}}}+5_IDATx흉b:E`Ș U[4 >'QmZ@ @ @ @ @~3j[jn<ږ෰* ^hoDQQd$v{jn;fqwoVpa8,B@Slp8 dasUi>}'g1 "QH!5:t/=aez/ڷWk?S (*[R5WGr$pif*a +_~LyfÞdP9/"~u^N931'Vd/BU) iZLfuּY Y…a{9W)39^ %Q=X`K{J{ڤf,:ImbcKs}t_@<{+9d{əeuo$4TL=Z}igpAF;#Hnɮvg/!`n]˞r6~p{>X n??}i+v kw9OdW}SX=><.y[ty =={<}xr>Bc`^oX4 |v7Q"@B!@B!8B@!  ݒA8XH 4ߎ(N (1ᆓB"7P(r!S*!`9B(!`㣀u.YÎZ,<1/.j|M,}hp( Q7КDq,ٙIm,Zn&s+KuIb.em sJfakկɭ/űj*F=;\X5Ku0OuJL%cY!*Z,u=/I=e:'%& |ߐKC @h}y, ұDžTd'3R.JƲ(2*a?Z%b[{cMeSLrjSJ-M +Sq4ZZHڇP2B?>/nXp[c"4= ,M(%tp.1t(`8d"t $1!~A~f~Ol`U@w\Mu ySBVtgt sKQ߅Pį̭+ݯL_+ wc"!2:|!;V+ˌm t]>,[^ҷ(S =a pne]=S_xʱ*|w'MK@󹠃;yEYZ}L5mM21Tk!ouph&;K~/ߕs/2 *3DžN}t:K:ЎХ]LuúB`|Nr  w R/@EOI .mW7!KUyI.\emյY`r_9@ K0uO&&t3j!@lq*R*\l`GY(IӔԜmTؚPc_F?V,6YZʴ.=hSRظ4 cCz$p'L [p{8Dj <0j[@!ljC)ab$* I׈$>14MTI;pp:lлᕚyZUaoBgpZC)^?럼s}0CXd"w$pۧm\|=EB|.^BAZh&p#n=9,ܗN DZ;L u3FKGHVZ3)\[i 1[Qe˻[B@s}0MjeN+_?܊ҊNU_ A8=s&%cZ+`…/#!` +=~w^GAKˀpy\ZEj*mo׸(Aji'?X7CQwz?s,7BW~0 ctW `٣`"hDnG!38-|!ےC !B !B@! #|P8_1ssa8:S:?pcgWPnԅ5B[bȦ V[s^*z!`k 00̠d(1Q߽еY龗3 ȅ[AiZUqYN=XTuLeٜp̖$Tʲ<>D~>(ZVQZRؤEVƾ9U{/d_nN]'账vG֒Bz/"Pf`IE YXE<w ڇgܾn^I45$VњТڇ@(1ED@hP<_hX<\gĿdmJ١j1SPM0ot=UF׏D5 BkO4H#Xͱ7rA_< CU9@`5]nd3j.DuGO4u6 zs˲KA7KTtpEF/qGqlB|ds`̼Rt`cІG h 8`q98B9EO%By.Գ`EX}۵vt'`a;S/v(GXV@G# @7N e6 rP.v 5 ش4:MCx8bp]"WUąk4W/֕ԇ@sjU#Z kg>^;+&y{ X@xeV :t})zoNװYF8֥$zWh?w!h~]+NVYP`/mZlHTf-R:dK;u:M(k)/}Ji\4aiτms`u.IZv0R4]ID.gIR*65 X)@vIGZ?HUǜeSq8|?RwB]bE_3~fv2$UAɂ5<%ڕDjujZw#/UϹU|Ncx~K* /;--EXH4:Od! ,|uJ”"2w9'0_CØ51+˶P(&3HщD4-=>TaK|LZI`Ը:WAFV9ӌ~2>`9̪TFf3,KvB|,D̶TQ 5g˅Td 4֚d^ @cK("M*Ҋl0RQ6P4)=O[ ̒PTq25i {'6Izh8sMB! r>7nr@JfSDv_N ڦ"}epyȽ+I5P)- D[W3;@sfgu#[Tj0<;2a"oyKŢ;0v7v^P0H_?oU=>ĭDL7.gx`jwwv?@p{K%7@ஆIwE!zP\`r> |G?(n\^g%bF.]J~& m0ϟ:8A2~ܔ\9 tOLp8/ w W_ }H&!k~&`'B7 !eUy l+ n468F OGKݘ \ḨHqdE Kq0}wWׄO?ߨn L8r \.VY%sXe)\H8 9Mw(unQߜ#?ѯ?@7Ss|`9 '1%`l߿ļ4Hp^ /MX(8]Z*-Co0EЊ25YU P0Z[49:-:*ˑ,~k@8RIv 2xs9B9ÿH@{gq,`#S?s0 FK[>X89şvULbkVuX_0˼R9G~lBvA=G%S~ÏC񜀶'kG ˹Z+k(,y(*F@y(Hʦ3D!9K<..e7qG3ҦEY٦_a75eUG4cnPÁ!Hk&hvB.97TVKf[Oǥ\C:I-!jX+1JYCWˬ>YG6oU_mڤF{YeXh@|dQ: <|}pEeBweH h9!]@뮴4]#kp銐%0kVuO6"Rf}Ӄ>yD V0 R,]P8!d pU'98@9 @؞Qnڗu&& vmmilXt[ɖg.uЦ @ @ @ @ @ - XuS؈IENDB`PKyUmeta.xml͎0} Dg 6#uTԌ]D;-6CifUϱoxjJ(ľ).d,?E0\il卨4`Pe]^K*# U ZFUr5C]9>QJv 5"h_Zsޜ0CjcT#^*x0|\JN'U&iEs/;ine#wn!h` S#[Ey#wzZ~w !&48$g1dK4&3M t(874I)IqnHV\.WmO})qubXީ=/X<W_x罴+ c5'q9a&!yx?~d&.N)!ç^4< KW֪PK:չ(PKyUMETA-INF/manifest.xmlMj09R6EɢP3 ~s&N\J 4{ov?:AaU@ڵH]þ_6^I·ܣx-I"FI(N(ɿrRV 삶:9ԪT/B0x8 Iin+Pp0ګtlt0E='j_λudbOG&t|L3r$l!;D+*lqD͍Ry7|8(|䞺;"ث_CRZߊ_q PK;f1%PKyU.++mimetypePKyUQConfigurations2/accelerator/PKyUConfigurations2/images/Bitmaps/PKyUConfigurations2/toolpanel/PKyUConfigurations2/progressbar/PKyU:Configurations2/statusbar/PKyUrConfigurations2/toolbar/PKyUConfigurations2/floater/PKyUConfigurations2/popupmenu/PKyUConfigurations2/menubar/PKyUr_C% E Lstyles.xmlPKyU 8H content.xmlPKyUFm|p& psettings.xmlPKyU<"55Thumbnails/thumbnail.pngPKyU:չ(5meta.xmlPKyU;f1%t7META-INF/manifest.xmlPK+8././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals/structure.png0000644000076500000240000045616514646713253020171 0ustar00twstaffPNG  IHDR ㈁\39|<1gΜuf3i8IZ;q(|q(|q(|q(|q(|q(|q(|'/..Rq(|(|PBɓ*G^?wʚ5k*)ծ]I."O^EP=3Wvml2u52 4P=jԨQeӽzR;vL2ߨlٲIdׯ:t׶ .TŊ3}?~\ߪdɒݻW-Z4Y?XV# >9 }٢,3|%K${\_m\!I< >JQ |v^~emی6mTe@ت+W|&;ף>f͚m)z N6_H.ڽ{Zfiq%ki?d9R/9~x~zբE :͊ԢEkI{Æ _L\ʕՊ+uzG\^OR> lS?:)BҧO^1q%uyNɓ8Ϭwѩk&/W23=zHQ1f̘d}U^C8a/|{HJN->p ǡp ǡp ǡp ǡp  kHa5D žv7#H;v,'@ q(|q(|'j ĉouSQ?\5m4Em=&j ?<#ܻwrʘ1c?ʇzHr$[bz܏4hvޭ 5j2gά/ˏj;C6l=cA2&裏j&սޛ}W'TcފqeUVj5k.7+j?ocҥ۶mޞ{~Q6 GBՅOի'CL3.?|Z {1\o߾]*UgQe3dȠvnX纥\pA+|R|,SL ,z&]{[%Ku̙خY{GX Eu ʂ LR\9˜`i )f$5>؞g<ө$-oخ]d4 ӧO-~[ D ԦM9-Bk!IO.:Fotw]ElI&՞ٲަ緍` ^|a^"q(|q^-[;fvauC^d'Y@ k$bc|q(|q(|q(|xQd.%ؾ}{)V׫WF6@sȑ#{-I{h)+/\Oȡܙ3gg˖lt]Hڵܹs|;vkw@ ܟ;wc.eF믟ؽ{]ŋ%c"=ɞ=}>:e_~)iӦ m۶Dc8TXqKE_˸ oW6gիЬ-}Y)r]L_>䓶2u ^P/Zh1]-2͚5駟)J%Kr]D˖-y=z]9{F˗/Qf=_fo>3f4&YQ]wݵ[uNL.z>FvkԨI|rM Hڵ) _>hGl`O0;x{PB^[O~Ԉ#Tjԕ+W?pCh(|4f|w_|UV%_ى'TΜ9=W8/̤P/^\ڵKuj刂$ˬX"Y:+V>&={V5iD[N}7ꫯRSLRСCU~Rm;E=gիWwOLlܸQ'{1"ҳ1P8P8N !#gp"p[`_$>C8>C8(ƩȠEL*@ΫW\9 -f PVǏW#G0!EYAڳg*VXwyy-zbZᓢ 4L|B^ƍ,/ӗ˟?UӦM؞c 81;Ѩ5kVeK*o-Eq$9@`(|QXDP8p>>'?ܡC lԄ :XĆ'>|c|q(|q(|q(|q(|'/...19>z]_׮]UΝݬr yζG q(|q(|q(|(yJo^M81_vMǧ@PlN^iXb*o޼w/;n8թSd޽=zt\Z5jժl2椨.\}{ͪhѢɖ3=aw6I/z9rhyLV\lrʩ-[ؚ /|`uY>ؿ{_~9mo; Y3K{bӦMYJ ǏhuY>Dh::Cq(|#GZD0ȗ/޽{au?Y>=3bĈ׬ "#8Rdhb33PbGs 4>C8>C8>Cn`xիVox#Ο?}vYfK'Q3Pz ǡp R$K,‡z__Md\rl٢(OR&n߾GC@tI/z)XCC@ƌ3N-b)BD,p ǡp ǡp _}CK.@ / / `"Pz{d˖ŋ3]z5Uv55N> coZzE= eh}w+g\׽O?tYΞ=M>uԍy=r,~yo;U~lm͛71v.cy'`FYVZmsQ/^z4ޞ?~رcGɬY@V9x)}:mڴW =ە=}Gɻk񶾋ϤIڙ-vڪ=^9NLhb\eyn+MF/7?r3o,XP 8/Fp'Rp ǡp ǡp fU5j~d+T:p.f̘-B .ҤIݫϟ?Zb{!Cɓ' yl߾}U۶mĨKY;d|fc6l̟6mVDL>a,vqqqZzڿ߿VEO+G\)&*zÇ$>#f ^ҥK'hfΜ龿f͚jӦMoF^64Yx/|R\)oop[? X1Y歐1fJ*]Ν;2v v"EO6=4{1YU@gp 0 H(|1YEs _ 1u<;P8P8P8/p$ARK 9/Fp3pJ ʕ+?ʙ30u Q<+J#P8P׏0vE჻5nXm޼Y^jžWm۶̙3')IQd (|ЊQ޽E8_^^|j֬Y 8> .7xC}O>ђQ-LsNI;yj֬Ye~ݷG9YժUsOlR_>c3dȠ}<9rP-J̊+ Xy lq(|q(|#Rz%/pz$ (|ڵk9Xxq)|9n36nxKcv%v0.swrLo~K{v2et%~[/M4¥I,Yλd{DqƊYf=w]w֭;ov4i\7k,ӧ%Lo޼|bdΜBS^gbi),bN2RJ.ͥtBBBW)z 2@5E5+zXtc޽{oWbō/Y|U||)v.> )={5r^}ߟ2eJ+=[v%Kp) 7x>UI{g?7oޣ>wa\::1?Hӭ_<ȩOEXP[vZjH;Ǐ(}%]׮]/+\ﷇH{ _NCA$<p ǡp ǡp ǡp ǡp ǡp ǡ'=-[L;v,g,x^mۦ]XDs>4e1>C8>C8>C8>C8>C8>C8>C8>C8>61U=B(=B(=B(=B(=B(=B(=B(=֢`ĸP+ݔ<#InPB)z |\ҥKwE)|GGC4G<4jhK#ȠF2~ rbv՘1c,÷~y*#_fm|ѻ;OOM7V7o8nѢ=o}E?T?iR0aVx<2Ə|j۶ulܸQUX1ɼ]vӧOkM4R' _BBzGɓYfZ1bM6 *hӋ-ڷǫkIڼtʘ1zG}d{L-]kfyjƌ^D/zK,qO{Kiǿsd ^ &GO^F"EԾ}O6+jz3._hSʕm,xbѦ0Nlt[XӃ| DڴiUYA8 #(zQ(z%E/H k<o8 EP8 EP8 EP8 EP8 ECɰA"aOz9VDo8 EP8 EDmѓ_}%u9PqƩN:k׮n!G{×^Bǫ~X~#`.]kռys^(P@:tHΝ[eȐA-[V*ss6fϞzM>|XtM2Fz{9b g͚5*O<ڴc=:t蠖.]ZjԨ̙J.dE@gեKxbmޣ>,׽{wmhѢJ*uyFm֞A)Dm3g,YR6=)B5kԖѯ2ݻz饗|<#Y?b„ v۵۴@}^nݴoOm/߁ky'(xJ=GpG {۷o {ѓ]C ZqGю1=B(=B(=ĢE,?`G쉢x2eJ+)VA<<3S)zE(a-zqqqlF8,쇤~z@r9r8z䱥JRPB_XO=~ V["سgO1+@zRʺ~>Y^v{ѿ֎v…:XbEu}q֭Rjյڃ$=EU/x<}XtR\Vxc6O}?P/H7Ӌ/eO>} /Anޑ`f͚{>F[J6lܸ0ק$Ӹ*}=gx`P)xҗig5<aÆJ1˘1%}zذa7D=ĉ^ƍgq4:PlԨQI&o+Ht]?^3mooWZUMݻW}-mck<ϱcr[DE/B{xyςHa۵kW: Sy9ju90۱c:qV*TNfF+WVׯO2ڵk'TsQsOn׮v[/s駟Rgh̘1]"f%KtOoڴI64)Zz?ڊx IG/x|Ν; ^*H֢pGpH…Q8lOIP8 EP8 E/8(zwQnKuQuAM0!I{ƍS:uR7nTŋS` P"Ĭ+Ǐn/]k+V."}*[la-1+ zI?SeVꞖ}$mݺUeɒE~#5E/γ2k׮uOKlٲI۲eK 8 E/xȢpGpΧQZ[Xބ :=78 EP8 EP8 EP8 EP8JX^\\\b8s8<FaOzHMpƎ|.ӵkWչsPDo8 EP8 EP8 E~pkYY7dʔbtpOri\F?ukn;R(z &tr ٳ^ elge˖j֬Ov۟mIz6yM)8JkXqK.eԧ?~>YtRo߾\z/ElZ/xƏzȘ\^}>p}ަRͶ/5Pbp ٳX8ډ$g/%4}K9(zQ(zQWƍ:udu7b8q"{Μ9X' 1[o߮J* *J(͛M/^X.\X>p>-ݻww2_O&|%?~>I;Ne,pfr￷@`bI!VOT||ڹs6_/li)\sϓOߟ}}VĂ&MhOo7ߜ׋\Hz1YEiɒ%@tb7hk׮U=zPӧO^͚5 jӦMI򴂖eL⋝d;ݻرccBĂ,zFzqqqITܹ<=">m,xoLKj EHC(=XDEpڵh:9‹Orlݺ@dQb{y쁢Cn˴p:u^<7n|$9o PXEŋ>խު矠ڤ!PΘf͚垟)S&pjݺuJ*I6mZ#G#G-ɓYf (=3&/H*g}Ve̘1VZeچi)- _ǁQSӦMV=B(=B(]E/q^7`du?=… w)lu?aС\Zݏh@L'˰age=ϴ|wrLo~K{'(-QNk̙O̜E0a,"=qDNYܹsY-<<[yf)tr-N ~Z||g?6ηoP/ϴ,14om-B): jժE/J &tG;N.@V?(zv}>K Wѻ~zpDыX3RpGpGpGpGpGpGzL` Pk^^&ϔ,(x7sp7 9m@ds0Q(zQ(zQ(zQ(zQ(zQ(zQ(zQ(zQ&&&_ 1O6F1l`c=#a{6F1l`c=ڰhu*qNZnaOWtiUdIcm6֟&M.i}D}ثUܹ;vaڵkr=k֬O=ԗ|W_y啷,H]7%z^}7oߟ~V @h{S+VYfEzW2>|@l"ҿεBG؋?Zd6]P!u{N<֯_y䑐[NGlhݺO1&^_BZR%amڵkQFjܹm9sݻ}jذa[nI28}hѢj޽ޮ˔)~z衞zꩀo3$zFK(v~e<={V >\1"mՆs拯^{M֬YcuE]ZX!E;3޿?>>^޽l٢xO?k=tOCJ~Hr;m|rf51X%8y _mʕK ]aܖׯ[jӑx/~M֒.^Ѓ!{c'j}?zOvi}vfy5>ƼmYak.YZ}?j׋/oӧOƌM%$$h/jgiH {H9l`c=#a{6F1Em؋K`~2@DmuUun@č;V%$$X 6a#a{6F1^&N ,~an:տl2)T:p@*6mRsVyM2'T[l yK\vM͚5K5m4ٶGS~zoXޯR:x}ÇW} `BD:uŋ}>lq^bbT̓j×&Mx]g^]lYuV|5k>}˫͛7ݞ@Ŋ*}:5n8թSe|ݫnfuy.]:m:M4Pk:W\>@j"셉񟇌;v}_|||e̖1 xmì=zߺ=vpiG/1kٲe@˗Oΐ!=[hQc韾`p†%5/ާ`c=#aƢ>iJEmKLL.jR`c=#a{խ[wK] p=@/^\>a%~a }=@@{Yd9>/j_ph9߅ 2.\xKa {]Ν;[ cǪ8P(\_IzjZ} |+D}D ,F٫WobRdv&N8,_{o._߲fLJ6=}=} =zx{ҤIM<CMbaQML;wL2GjΜ9ڴdYQtim6U^=F}XxeMZJ͛Wծ];I;UTQWyϯVXM_xQ*UJm=gU}uϻթSD9݊\Aw@{9_jٲz4o˵=}ѣ]||J&^?ׯj۶{{W1c{#Ν֯_*W޴iih'OtY!!ț:;|ʗ/z'ܡ*]t~ILL}wKr[F^|Ewi;u]407r Aɓ*G[n:Ĕcǎo}|ժӃRݻz3ΫVZWzӓ[! on2 DGhB؃fu`c=#aƢ>%$$h/^׮]UΝD-BG1lnNbFBLV:tHլYS~衇Ԅ ũDկ_?駟+V$[UUѢEm\ݻ'pں޽{N6MlRO^ڵ+'` %ӫWV/_6 bmۺ7{lj*m,xedO繜}ݧM+W.ĭ?lHFlHpl2'uA}˗WW^Uio^UPA]6[@p{FMvשWYfymø^R'6mdڇ-[xm ";vhQOl`c=] {qV Em@l`c=#a{6F1l,j^\\\}3}W d$pڰڵܹ݀;V%$$ޫB Y6a#a{6FbqGN:ݻՏӫ]v7NvݵkԬYTӦMS{@ Ø.=t.]T͚5?-ShQ5qDϪI&viVXfΜW=q… ׭[/^NwUӧOWoTҥ)RDM:U3FN[--AxegϞ}5o]רQ=Of&L,Y~amgСv-ț^xhѣGiӪʕ+kcg\wFg}J,d=2gg6muh۶vGiaOB)AرD+`ƀK/{/mݺ5Ɉ1dʔ)Ȟ%3CI2f|g?ϳ]}xmT8k2ڇSTV@{@ -nݺi#OȚ5}{fz뇷m'{6͗wm%y'Gmfu|ۤfΜ>=k֬V@h{5k\}?[!L%ӛ6m`e_H !al2u1A&rA|b ywqoV@xbv{'l`c=#aּy}^TV@x09r@˗/ ~z+g5q^ڴi^r%r= LnsVH)sW 2\tRF 4=Wzw rɗB5hР.l`c=ɒ%˼?ju?{¦aÆMf:t -󍡮y͘1cq.\pwL믿`g=a3wrSO_p=z/ϛ7˗/';_[̙/;wSz@/lNj'#o2} 2{6F1l`c= i{!0`7Vthu:\Tk#C2쾸@߲K.O޽{)Sʛ7r%WݰaCUO[7kpCD9]vM۞\p!sL.ڶmo;d> }.]h-ם:uҩt~2۹sg v^hQ݂ oKW^M.]+r;sΟ?lɓ<3+7y[[Yd9/'5j4[ ~48cƌ-Z.%T=@P֮][}3fjBq_Fzߟ:u3dy vsye102Ѳei*_ǓO>GݸqYlK9NJ24eʔVn@ɓ'sd˖K6vZ~<}-mlG_ŋmϟm}z86Jh4z?J,CHX̞Yf5h|}zkEDzmy9ζ}6OWH}/_H;ˮ[>OF $`x/Ipٓ owhNjo=rJ:}|5zݺuyk[mzmڴlפ=u(>Iz(_iuJFcazNrShxEJ I0Ο?@˚5\vK"`c=#a{6FK% RPT6 R[,Y:rĉWZUQFkS_`WTvM7xg'ȉ)U4iק +J?~\uQw}~qƩN:엷72wxIyŧEk_Ӄ_ҥ?_L.Ղ N2eʛ18a"< S,w^w(ˢET.]T:u'c˭XBFLaJnݪ4i,XaϫSN% ^ѣܷzjIw?xaÆ׭[Wr׮]:t@7Nc|V._F T֭@OիWWׯO2lٲjϞ=I˗O-\:n6{nm{kTR=͝;w O?uo ~^z4@T۷[~ 8p\%Z!2neɩS8]b]޼y>|8r= 3\oѻgϞYCz `3=#a{6F1B"{-ZH}V@0)]*Y@9m۶~G ~ 4h  x=#apB X @h:vɓ$WZy{n-2%JP;w M㼢E|NFy'aϗ h=VHo>ue˘:t:w*[{` f D=|tj|, z0Yf> {†ч`c=#a{@$$$h aH8DZܹY!z?СKC;{H'uB_|(Pмy͙3h®9{o?lȑ#y_w馛5>TӋ-+#*`lݺu2OI_u֟?̙3__.\x||5xMN&u͛7oڴ{-+WmV:Ox`A:P_}ֶޗׯiӦtVhѽl0ۏB3IH8pࠔi NrmQrc /نF~˭WAgʔ)>2}LdZz: zw}\vmذ\ %xyk[_}%ɵL}>A/61< Wۏ=7sm(%Jعcǎ2oa\1$6;h\ܹq2-ƑI1={xѿ!ƶeD;vlgYʕ+~D/ Lt$FwǼg>l/0[>6L0CzxshyYRҎi^D7```hlԩXSx;w.@4(T]`3=#a{6F1l`c=#a{6mT> a|ܹsuX!L%o'&&Y]ҦM{ʕ+ڰ'HH}^~6 {6F1l`c=#a{6F1l`c=#a&&&ZD#{6F1l`c=#a{6F1l`c=#a{6F1l`c=#a{6F1l`c=ڰhu q] 4pٍ9~aoXEj`+ݨQrmEQ~ib̙;x;cƌ\2ZaoذaVwRaUVSBs rزN{#_/u.{$_LmV @{$gC=ztw{d{e 4=@2=92}E*S/.e!Lmݺ,f>/9ߞw~aב#GZ!YPB 7ܠV^dbq!Á,{@,#E$ Q~$aBe?w0RR%< m 6Tsn@˔)lxw>#siٓ-IH6^|E-@$ |ZQ/c ۻwڹs*QDP}ֆLרQC:u}_.FDm%رtk{c K28:s뭷!!Q.<{t*r̙lYHv4˸?~fֆ<)R$vku7m۶V@{QBI*Wڵk{|d5KQ _*/Te˖Us{nu]w\nfս{wխ[7ի}̖-[|(_3FkgѢEjܸq~xg3F_ jժMڰdɒWŋOaիW/x}:tP˗/׾[fs9sfmײ'OTO?tޞ'msPeWPA+VL͘1#|н* x=k:??qZjXxqP03 }fכ w͛'w믿,==Fg{-Dnڴ)|_.Rv=zh\ru\\:sL@m 62-c 7_P^ǔAKJwѦ\:O \ml߾=>x6#_G_ˤ_ymF{>U R&ZF]4=#a{6F1l`c=׷o_>͜9.Ĭ {  {"111>ĺ {H9l`c=#a{6F1>UVmK5 4=O/= v>=_[#vL.T҆۷Glǎ%~oK? x=_C 鯇'?V @`{|y衇V"5eeӦMDeػzjT RC4@uG:\zM6|̙OMAfϞHa]rP})j VwREBB@{%LWZuKՔYX=wK"4hn_ìp6Sԇ=@t9|p>=[L?+WXQ=2/cH df!Wz%mϬy2d|ҥ]vMxw_)=@<ʕ+<} .CioϞ=}ڵ *l2+h K}d]4Omٲc~$$$t #{a9rjf_?~fk?+7<Ce -[6ugR?=@P~2NQZ#UiӦ>9bNC, Rl٭t[om9|r׺Zn,Wzۿ#G│'15ڐ}2g|̙3۴i3yڴi-seu9Ȳ@8Yt8|+u5نq@ӗ7=f͚͖<K.c"Ơg[ "kXo2fxٳŋ-{|5hSȵku_hBVZˬ4iN:;qƩN:Y r ̻{Տ?hqGЃl۶>(UхձcG5k,mcCgU}զΝu{17h!q}hѢ2Z6侉'&Oo{ŪptϞ=ٳMy>{I_=Ԝ9s,W_ %J$k&eʔ> aQkɒ%ZXdi=ũ3gӧOƍP'TԄ [xk[gČaS/'_I3kN:_~n*0  =ĴwyG_^U\Y/_^ʕK]xQIFN\-i&:gΜjҥ~,Ril~*UgΜ=?VǏ߽_dh…SO=%'i%!ޯj֬6oެ8oO-dtO~{,YOA%½j߾}Zx37ԙ~mK|_W!_~>={ҥKrVmZF$@>/6… Q>QElKUt|.DbaQMBwwГyCYjժFv~}ԢE)Q >\M:UK5$iFmذ!iam=G5k&? X(!!}:پn.FӮ3dȐlk&-(1BAbɓ'ܮ=In^ X>ocui`k{6F1l`c=#aƢ>gʰf͚X 2k,Y+H #*Þс v[ Q:l`c=#a{6F1F  ϟΜ97onuW4BAm{iMZlҧOvڕ>d޾}T"E=~ŋ… !Cɓ''iضp*]6w^oDa1EtA+t 3__WZ$L}0k߳Bg {2f5lٲΨQܖպuk駟#GDfUV"ӡC~O{~nsQ۶mSŋWM4Q ȑ#_lʕ+U޽kꮻRW\k׮Z|v@ ԯ__K !&4h@x2-[$OFGz.oԬY3/$_zu~do6{nI&y |$OF^|E%K@xFqa{6F1l`c=#Xԇ=wF { СC  hu?GT=ѧOV Em@l`c=#a{6F1l`c=#a{6F1l`c=ʰwرy9ju?,G͓;wc<*"!C /]~ {~V# 1ʰgt+TPXὊ {> t=#a{6F1l`c=#1h_vO]vM͚5K5mƟڳgJ6uʊs5p@ժU+mꐣ;5AcULm6!Cm5nX͝;W}gϞu֩u^ IF飾;m[o~UtiaKpB5sLm/vuVUl$!7TgϞUCM2ʕV=ʜ9{0Ay6[f$ajժU@ ĨAia6w$˗/],YR5lP5kLK[oU7o֖ $˛};`w[W3fP͛7wWLb$m43#Gng_$艎;K.3Zj1z{@ҿ =YlW^P4cÞO>D{g}.]곭ڵk1cƸÞ۷*mի_G3Wxcu8㈖!IB׺Օ+WLM۶m~1B9R ƃH<=2MLR?mE4/֭[ju؈=["EԢE./޽;}xթY8qҥ6b_<71j(ZW^}qYXkN-_ aٳgY!L5l}Κ4i\/BG7oޣV@>ϩ/_V@^ժUk}2=@QK>de_a}Z 2etQꫯ/ƒ̙3*\~'xGSRdu?`/VDԩS1NLLK> BSkV^>=z#a{6F1l`c=#a{6FhLȑ#y_{V@K8+믿9hР}.K(sǎ% !apȑfV7oϬnΝ%ÌU@x0Y ^6XӧoȞ=: d=@22ޔ3grn8{S7tӿQ>ba3<3 4=OrJ=OduآEB1l`c=Ȓ%˼?ju?{6FV~GydÄ y[n|{ƌ#ի˖-{H"GR=acjuuL7iҤSy.߫W| Czeȑ#?Y^L~OjԨ1J}ǍW^io6&M[p{H˚5s5wi3g2_z5>mڴ׬#8 a@Ⱦw> |o/eZBk6ӪWYfd68ѣOGoT=#a{6F1l`c=#a{@dɒe} aH87=@.\XoﵺCu̙.gdjժk]Z'!ʖ-Y}zݺuUիPҵOKBY>T҆ 2\^f)m+µM瞟.\y6? ^~L_~=>/%0/;f̘.v 1\E*hyzjɓ'i׮$"~vr-ܒv`14i\?%/Ko˺]rؾއnݺ3z7x)\ֳoB>Ν%/K (pu@Cocƍ+TPB\ /Yf=w,ۓ/_G9_ӳgQ.=-ϭy۷k׮wu+VTQrvo]n믟hԨl/믿ovy#mԃGyf߮XFy]z/&/A2exҥ6mL'ng/aO^\qe_`-DQ={ $y!&#P<ۖE-Uv_`.nj9\}`'~x{هut2 ȃ hɕZ^]rS:xlŋ3ա0T.vʖ-Uڑ#lSGa۱cGI'Mۍ7__zm*U5;@#Iϗ{%<=Oy[2.}pʕt.Wyfc(d=_ӽ> /|`eГ0!oy#}-m%ϟ?uJpk78ҤIb'_ WGk9Qsys?~fo}1ʟ?C /_oQ4 z}Y3ٗt'gΜ'>sz o#VvC) 1= 'ްad]v]kȴH[?f\\\b쏰gnݺ14UPA>qС0a̖g`f6syomW^ykVA$}*Al̟2e7n,ZbŽe ^*M{Wk5KLL:i&:gΜjҥ~ۮR\̙eͨQܖnZ}ȑ#a_bK֬Y/J@[hQx`… e˖e.~ǗUVK \^ϧv){s[nѾ25ծG믿O}Xfvu!_M7Я;v]n_re6mm9s&Kjg=z$t̙駟֦W͗p?Ȩ`\\ /w˗WW^!'`_=h-[VVZoe׿͚5H[.]J^s,`oN.u֕rjذaIZvFڵׯҥK$d >\M:UK5ڵk/_M{~}zs&Lꫯ~jժڐ,Xp98=g!eh"Ǭ]6<9zS߾}ѤI|/moYf_~8CӦMWso1I.y-[\fzЧiku? aH!F=`UV]`[hu_ayᇗXG1l`c=#a{6F1l`c= e 40[ocǎN>?`u`?"_ܹs;zh+ e{@OF$Y7#a2l0gu˔)ݻ6@ba`J]Bw wi`u Է?G$#|u. `K.Y#du`c=#a{*THΣfu7D1p2'[Uh$q8_l7pɖ;vJHHЦsȡ6nܨMZJ͛Wծ];ǝ={V}꥗^8ap8=8!RJy׮]S 6TsM_UNTmRlY0(!{ ʕs p2$_t||ڱce|M5a„_AlrYf%-K.j̘1ɖ%@r=>IN:jÆ h`hѢ.Ν۰RJBiwƌͷlRoo߾w…ĉ7msfʔرc;knц./c ~H"? <د_>/_~s5.+C 'momE-^oPGt!VNd!رc瞟d:Q͛0 Q+"̙3e7|U7>Y~/^i5_cǎ?`H6oF^{mL?snֿ}yfzN?>y>-6HGȑd (mڴ6%PHSH_f>&=h"251hРr]Fr-#w=?~Vۆ/iӦh NN>}ٲr=gΜǃ,pO>C2dHpGLϵkµOɓ'sȵ {[n?-zn/zҤIs]F97{g/_+3w}?|WO>_P.\x|,a鍊n7BOBxߪU)2[ HѻM*UօcdQF.@k+WdD7׫Wo6+W^Ճek̙/HO83m=@@֮][Um駭edI?dɒ;o^W[ .cǎP0?ck?̶SB׾y/_Π?մ~Dvߛm7@/Vĩ<,o6?6<ɑN] Ih|jt]/_-k6O΁hm[Ǐkn=_z`qOΝZCGN*;Q[8sQvһw7/<{ qƊr :D?Y'`c=8ށ)T(c `=#a{6F1l`c=#a{6F1l`c=#a{6F1lXwY!|:w\V}ʾaSlZ#Kԧ9ʾ a̮](Qb~;gΜ'n?D}۷]GxeРA=ΝѣGX')ao̙Vw̙3gmQ 0xXAj}zjkV@EeqV+jR`c=#a{6F1l`c=#a{6F1l`c=#a{6F1l`c=#a{6F1l`c=Khuoqb{@ b`A 1= 1 b{@ b`A 1= 1 b{@ b`A 1= 1 b{@ b`A `}:T~ (pO>íGjYzG~zf4i[{A2eJ֭[ju?z;O?mݪU)V%Җ-[VkРA[h1]-[gΜne9pV9ٳe:111ڵܹ@;V%$$X K?{)v]w_jժlҥY?{(V;O˞=}r c`)9 tM{|ojР 7gpk17xᇗx_=,Ya9<ܹsY6l8ץU0A K8o޼yr.>1 ([n-8/gΜ'8$)S,Ywb?ug\Z/=ACrӤIs8UVS 0sIUbE{GyĒ>z߯gnʕgU+%<{ӧ%q?pV 'a`WP!=sO>8Yՙ3gl9Hp5UhQ5|pմiSK7cR>zwRӤIcuTaÆJ{ᇗxj. ;S-Y$ɼ;>Ho^|I۶m6w^UdI5rHF9sk{z?_pAnZܹSskԨQ)8GV_}>+Zhd7oCov }mvکݻҥKӵ>Ȁ |I?nVh]֬Y'|ǫL2w}W~^۔פjr{Vjُ` 0 A@_G#نΝ;GU\Y%$$hۮxٳZz馛T^T_i~7M6%\dƍoUfMV DK?|̈́~iذ4h*RHL "y=9 p#Fh}rKA=@裏 e˖WPA:uJ=cj*նm[um'|RE.bA39 3.~PgQ֭ӦS111Q.\XJh[lIl0({<7m1cv_n/jA-+dٳkoFk#ɞ?A^xA*Uʜ9N `.?6˪Dϟ'Of͚$202#G:ꌃ22,7)eyŊ/_=W^Q:tpѣ6mZ ,+W.s Dt6h( \~=N퇼.!Co*y srHnٲeAN:Y չGuccW)-ê> &ñ #bӦM'IFnSN xO@_f}+W\)F3W(=ܓlNG~XO2d"{$YFjٲi\X2eʸkPܹsڵ 1YA=QF m@J2'ϓ' yJ4iC4'yݥ/2ICdo9Oe~I/u o&%'$O>cHÆ 9 :g}̪> d),0,{qcjժyĉڵ (ʡŋO`7̖-[yW}C{d7|SIK u?|p U|Lr Fxa+z㡇Ү=q=Of:ov׬Y<f͚՘="=; I RO?dϘ/R>1cFƎ XhyѨQ#m2yḾaBe/G<ӟ#90u} 'b Q(YrC?迨7)S~$D?=ޫ~۶g<>g 믦9Ռ{q :T`wVҥ azIoܞ+ˇx4~Ѝ6C$93Wsd94QPGtg fઑIҥ!Ǟ={6'+%B-fy!OrCodyAGQ9e@Kun69tYK釉a^_co( T `a6`$\>A~9 =L@^G6lZ4@ja`h9}|xE_9Ng}0b`/W^p r Fڵܹ@;V%$$X b{@ b`A 1= 1 b{NBOkڵkZo m:tHլY3zHM0!۫>|k ,P]tI2Dj޼y{EUTd?Uvd{fϞd^Պ+-Uj~/mPOhi13o>辯_~m۶IUPA:u}|x+\rٳ^ץ|wIWRE{^/^ .lNr}.:2Wu T4l>|P-RAJy."=E| 1"Em;= e۟{9U~}Kfd@88*z>۷~w}cǎi{#X2P,_xq}Cg`k]:uԦMܷK /he˺2,l٢/v>mԓc.N޼yժU3[_.н}{--+N!/=zZnzg cEɠ8-_ ;E\{'d$O60ׯgPAh=֛zjl<32$ƌsW_}=ͤѤ_@aeɒE}GU͚5S{i2xTzuCު ʇ̙3uʕ}.w^DR(U#c4eAm[O(Yv}95kVm:VK{ē!d2mOX6`I&i׭[vٵkz嗓,/]z5uɠ[ݺu2C_ [nEIp5x#78qބr<-經,PtM}.'kfᘾ"A( 7y ձcGs.˞ٲeK z,jI6ʞ{f_rDjNx&,!{\tIM6~Ү\.ɞ.7oҦM>|vK+%z-9o:~6e$curȡ bz&rѣvh,'(P Irާpvh<3gN퐭'Y[h^A9 $us^Godm"r=9X=ϻ'c7n:"3@f{5D6ءCtRm4OC?=c ߮|iO {HQtgr;v.'RGqm EΟk}J>a͛7\@=QF mZ'D2&hyPڞ3gvm6ոqc䗃~-!=qP_y 6ɯEiXWumirk6m͟9sF *y<9֮]+{A!i[^g+#t;}T32,ρ`\C~@eIC.:ޞg0]9ߞ+&*~>'")*m*)Y94X. ǑQ.vשqSo}HPDlq]gϞlC{_c*fHksO;>yc$`"2eeH_ ÇP^Rk|N? 0`Ab{@ b`A 1= 1 ^ %$$h 51 H}@ BVe}:T (pO>íB@b{@ b`A 1= 1 b{R$s\2`w HիW?8K.c rbiҤ>}\/X1 ,N>}CL.5h`~bbbU}3ftrq~ݺuԵ_{f/^\g˖-\X-l=auܹ.ʗ/իi=` ;v,wٲe;ۯ_'Nlo3Nzn?P}fp1 b*UAW<472`;Qb޽.F=zt^z<{ƍ۷o?Q@s~駭݁K7mڴwqo2phܳQQXNś7o.߸qYSLi6%{Zqtɓ 6y[ g|}eO۷zgrD0 `رc;weq zE^Vי ͙3q9϶qPO)o޽E!2PynE}GoӦdCN.rk=e˖ՒP+W>(M6<ߡ3gpL+"}-m| m6l$ŋ%Ϗ1cK&V H;w۷oagϞk9=p7SNh/zrm2(6խ[wv`WFrݣG7ҥ8tPŔR"qٳg?cO~XEwo6wȑۻv*.ˎ9}hk֬g3g|>ٻM^^ Ew&@ʔ)EJiu?L h"^0[]4Xb{{c7,I?[۽7ЬJ-/ԛ>:f̘ծ|&/nd'0@,2ɘ1c&kuYgy Mz 0 9] %Ċm,!,1(=ztiW\o+D(n۷5ը@" /b?cQF%s9grmrfm|߿֭[OZk?Oo?sk­/8&"O:uꔬ*E]k'Kz'HcOL;3L6hg{N-N뗼[oL0!y7]{eJʴC=Kk({oSO=5y&;;6Prޚqɂ .>g^vک@j[eqW_[5j@>4h:C==B"{sΝ;S.]{7Yq? "<ӧO2qĤcǎG:?ji AUlSdWxRK-;r-wy>jf%ӫWd-pyM.>OqWkN>4 eLِ!CmwVh/{-GM+Xy?mzeݻ馛.Ǽ~1 8zkPVK~紷[6,T*\k& Ə_^ʕk]v:;tTP9q[Th7{{-zMi8n߾}C&~xr]wչ#LAS?t+Ct+"p+g8j7tSzƵ- Yf[Z= DO\rɒ=ڊW}tK[o5=zLvg=yꩧ*>o9W_EY$/PϾ!᧟~JR_:^ _R瘳:+2aK_k&w%[ܶ;__Z=4k֨"xklϷb^j;v5lt-1$bٗqe5k V3s_ֿsQ '=IxŋVZiVhO{9~`rH9$@ {C=!`rHW1c(n1bD0*@j@ УG1mrHrAUZy7وR6`rH9$@ {C=!`rHЌ瞤 3zVmٳg/c p-U@n Z'N.#k =*zQF%K,Dҷo_Lb3ϬsG}:ϧrJ'yr';wNFY[nKneY&c=ӧdϸ?0Ywu!Cu/893N:%JrE%j.qp^uUT||걗{i%mYr''tۘk ZqnqPrK"$wqGiĉiA%\R>|%W\qE\#Fy9Ho䬳Jkdi/k EZŖ=_uhPCBAelq_^~w@:{?PK{wj+Onƴ[|Ex≒Bj:Ե@Nl&1wi iOe]6=]yc+CtK &4WL3͔|7gϱ7sE=PPД!+B!뭷dsUr8u]\ve ۣG}ٓz_5\97bW(V|s=lV%Zk\~ w=fbkB^z,k1LƊTϔbv[Ze=zk;S=+@u {C=!`rH9$@ GM>j@3y׫]@W_M7hM2 u?3owh:v8qܸqc_Z 0lذA|S;7L3}3hРa-\y0qĎ:u0iҤծ` Ǐwv P9_CI:jP;/1bD˨*ٳ%L`rH9$@ {C=!`rHЊz 0 9] 9'Vr=$O 70aBO&{Gz}mUԻ袋&Æ K~f9g\a믿N=>5ikjk GUҩSd5L暒^>}?N[_ /p" ڵk믿movҫWc;,;1S- 2 JC=41{ori[|œ{WhgN.^K6|dvJnᆊ5u-z뭓k=}7sOK/L4-ޣ7|38p`riwy|cO}=*֍}wM?77BZkw!dq @uʞxt?L3i?裓n)P+s=wc3oF`eK^gu{v(f+Ӟ^dqŠ=x:vI*_zM:wumK.dzl9_}?9Yqko5~~W۾j%_|E㊃RǕsϟŎ8+y_q".>C[ioBM6٤WU쳟?㲞>Jv[[&;N=駟NV]uղ<ڟ`;.9<8+ls0 unGJ+%]tQmP/Do8:^7ѫ-c9}' ࢇ`ki8|ϟ$mݒ:m+i&L0Y:L*u,м{ʲ92|A4UW]Uݻ'J>3Θ?d喫s_7{gONY+]qoJ]>KCnk1BeY6tkI->fb^_xdOg7zB[oݺm- @#*[p@hmI뗌92my?&믿~:Z_~%[ .(bHnybl~Lܹsһw3c5Ű矿FJva)]PJsM8qb馛?};3ӯprXa},rRhwNT=},R֕ǰm6ݥK6 qqǝXvGVZ@="ܢWT 1"Ԋb~89 70RYXvI'+#Hn8oZYg= cP[ox4|+Yj>WqWchlzq_dWNfy9^~d7N瞋P++\$si?!QGPX_:mq c+|^uc9s@D;Shq*L5jF$4V-Q(šSN9%S<<8ة/UPc+G,F۔l֐P rJbm;%3Ou\)式~;co!L[V7kB5jHdgtMɍ7Xrh_~n-Q G=`ԜQ#׏/g-ntMF- -viGVh{@YY>ۏ8ӫP[=,:mڒը3h{~mE}g%x@{&;ZUzSt ' >묳O4C5{>c {@:t0TPO@2bĈtvرc8~73U&.U |X?:t/fmۚ5P5}&aÆ 裏v=bjݻծ>9cϫ]P`4hаj@L;,r/~ラTa= uQG[G9$@ {C=!`rH9$@ h曙]@.]޽ծ_cСCۏ>S 65Pu:tT&NرurѱewKFٯ5@{&7v =z5iҤծ[oG~?[w%\olw}f֫uw{le]w.no~]k %SN)O??T`Ȅ :=#Nog<䓏VmM??⅐b\,dBnF.ۻeժ v={>䓹Q =!`rH9$ڕݻqjM!mΤI:R}Kaۦnzc=l73>nܸ:zW]h>lhU=͙s9PSNnYx;.R @^6?n:/L34k+?#Gz{[dm뮻wu> 3߽@+m{キ[q[};v?lVؾjYnw>:ꫯviǶt{@|Yguk_S /cnj3sqsoӟtlݥ^w'0mNqEY>`RBxw֘sg>*A9$@ {C=!`rH9$@ h3w~wk U˿PcjPoݫ5"]M33~[O?uB)n&/߿9mvڑzQժ v=:ww<\sIkSx 'xq{I>.-ѳ><蠃k >we뮿ۇ 2U(E?~{饗{_֘:_~WiJfm~嗳`hVn%uwnة v_;vx1ǜ|@W[W:ksZk_򗵫UWcZΊ+\,_9sJ3qĎ,N0`Yvؙ?Z[uU馛֭OlW~Co%\\[v;>,{爿 =܊RKk-7|?W<=cڀ]ëzq?[oušo9ӿ׿563uAQC=m~/z 6.=E/]t4?0}!14nGW߱_ {)~GGwqǝx ' ڿ曙bhg;vgup风:6#G3TIW _@+~zk]졇Z 듉9x8;7zfɆNB@GqH{ޓO>z>}moS_|Y[xSO=ZJ?OJy[n٦xύEXg$>_W_}uw4Cvuh{@Xr%_^% 3s=x-j駟[Ss]wmMU|vmwS=wF돞@%>z\і}Pi{ƱςjLR˱[Zܖ+l;S9rd9Y?pRHn喷o߲0D V㳡#p^[}ΦXeU)轚vm[> |cv)lߵԄ :e~~ѓ/ 38MA4_dK`Z;LWe93{/5SbdD/ɝw޹yF؊`1C=w%bHh ,lPTE{1cqϹJ,r/X.zZ}w}ŏ)3ƾ:s^ 9ᘅ1/Wk9S@O믒\}y\c?#y oGC>m?@s6I^A%{Wj:h{ nmc%J믿>}J&뮻n2dȐo߾u_zgoOg>c;㏛{7{XdE>;>}ݫ>~;=깋./"lh/?_羶4Զr|1Ny͗״"'xY)´/xgq䨣uq]_x+O?u 7SO.>OJСäw k h{Lٚkg}}!у>8߿CLc+Ct334S7Lv̄ />}1|5* Q_r Yve7<8qb .o--|m6wvGy¶[}^c|'Wz>hi=څ.t=dfFK):||_g}䩧=jdZk/{un1S[Cuc"lhrDvk']vYۘ1cc9n.ufmTqWϹJ_F6l? Z`JCbm1 Z6%v[YN a1]cC=\rd׮#(]9.|ۖ:795 VQ pJ*V'؃FU]c2%@ {@=gq ,aJvC45\ӷo߾Th/{@zzfq%\o5Dmر]vkM7d{Z&ho{@EW&MК@{&曷=Fc'vСä ?=ڌݻ]H_}'xb)6lsKkLN@EoofjPK.cwch b>XJvhfio]sW: {C=!`rH9$@ {C=!`6lؠ>hjPCN޽߬v-C |f`zuu knvuhȑ#~ҤI]Kk8s_~y^j`/ծ,2/g? -Th{)rHrAU ٳgK¶^xaUVYO"C?V*=0E/ ƍݞ~3fLc_b-@5ǾT EwxAW.'5V]0M>\:dȐmO>=h9=!`rH9$vgϞ~U`rHY^W椓NJ{رlzIǎK?'L%3 ۺu+tϞ=GW<#<^|.*y|giffu}tȑfy毛ʶ%^'xܱ{Rk>Ь"yG]o)l3fL,EI׿w߫SQt26BR[| 8+B{SUdѣG\hoےƆ544=E7T|ĉ;=܊+-[y睛~7BN8a!C:_` 77]ZW\y{?~N:M(?28wq'dm+<}{E8g^xa/nWo[^~yRK>S:O^:;\s}]֧O&yߥα˾/.W|м{@oA7|3l &tjV\qZ'6ls]wݵY"ڷvۛ?o_L7t?/Ӗ/ڗYf/°fDa_aRu4?ϕk#4ZtEisG`\P/ ?/첽 k-^M8_\G`׮]5n>_DPZ|\|k7.ƅL#F[q =Gu4hа칊s1'_pd߅eu uEWcb;n-[R6tӻzkU}ž>?4t6G;0Ѷj=WxlKQjW^kD>4@){v}b[ǟy晇]{wy:vر]K~ YAXJ=7=C믽i%6r.`CO{Ãf/?B^zݚ5k{'Xr6ѳJ‹ݻ8c.j\|%OZGkQ^Cz[K n<E'|rjEO;cr?[s&5iJ] EX؞-TȂ}S^ZA4W_}u^REoZ)ogVcc(:؇~vmwSֹsq^fv!V$1W_܎9cgoavf63X*>(W܊@-BЖ~jX8cW2;/¹.>c1L{8qyN9唣KCtzX-ΧS@;7sO4CktaRݻծĿs[oGXb׫] 0^ 2N\:h#G7x:ڵC9dD2,K/l"+@P/LV[jnv=@]B=^[o 83<ڵG4謳>ڵ#kvء%ЌFUf饗~ҥznͫ3]09^|.fԞCG/+/OO0Sǎ'~u@!P?B̥wmmU|ߌ3?C5PLz⋿o.l"VmPox,Qܾ62iҤը PO?5>-n?cOql5jz@s} O>czP=B=AO>ꥆy晇85@{'hwƎm.St 7Tꅗ^zi/U$hׄz@,oĊm뭷#_~ժ +(<*O?m_},ժ3(=zS}ȑjlz=6t!5tA u Fyǒ> mْw=_'{g;$[ner'<.zqqM6hd%˜tIwܑ;6` SO=5رc)G\_Qǖ>4hPw^/uY'|z^{O[n3Hki?sLoKfymrThu;{ImPZPJqKmAK/tAbԜJpb]&&{Gz{OzNHɆnؤT<tqȑxmvDsZlj{Asl`пOL➕Fq7\g.ĸv[o9_Nj^VʤI&./CuVq7} O82dHsϕ"-uL81YdEYf%yg#>ƍ_e*>c93|*yۓobB=ڣmPG]Z@{"ԃXLvevBZheI?|m=]wdJ{'Ǘ:ԶEok"Ћ)fĜ[a-H G}t˔7t4x_#-zDoJ]mՒ뮻N[+,zg&{ _5ڵkm{[$y';gKiɎW\^{+},r=Cj۞~ڟX_aUb,lntQBqsWrDBcbYim_ŖPNѓ1>q/d}Mۏ<4л{;{̩7ߙ~}۫A{ӫW۾٫Q 7B=H&u2s'_p!zm-uz-L3͔|7 >G)>_|t/zieq/!*5FbfulIz;⠮cÉ0 3\"*Cs;²ioPW-2 0 3O*aQc>[' 1;/. BԋqͲŁ^zE^{5>AZO?UBrXc5ҞvZ[1<ŵݻw"׫]Pgbh]1n&BPt@Jܕe55{lJ*y1oWn+sR ކ,xk"l Y),gZ -P9c5V5s1ݗfSoiZxdÔ[Z%uq=b|sj}lHߙ|\ڄzP z0^{-/nY[i/ :o,PhK~OeWTj(; ͚SCc(w)'mA=V\qŴ^ Ga"m(ZdmC4wަw!YNIKrdD,d]̇W_Oƨls. a^xa?Z2:{>+\ao~t9bɧz* c޹^KSD^mQ3/z<ͩ1;ӔU߃>uh N;m^]#BdEW<,|رROs.@lzћ.澋oRLK}ګI5yDjȢ.:&@;%ԃzO0l~ .`EtߥK+z[{1^TœҒY^uǏorx"p@o[m{ZjjL̝^e,式@1DϮR6TK EX@!ߞzgќVRG F'J͡ߙJ?Oy ł"k9ycnX7ާnYϝ){EP?[-KbՒlY>?ŗqծڿN'IdeMγ'T.›z)$oy_$Æ K&N9_c9bX#V+‘]t9aMk6DXf^x?va{+">^S式՗O8z_~io9cwY'؈M'Zw\4QO|lr,Bsy畜pgnJ?|pm!COyۛNEGhfe۾YK 4$'ď/_j#_.qfvu"0[Rq-~M2~/eCz2N;G]axe59ԋIkFr[8Ò3I^x-,}\s5}ḽc_Sz|aOd76V 1l95̔܄[}{>;)isNY]rCX`SYgu՞zzІ~>Vec߾YhObra=Z=>zXB{ֱcljm&L0$01n6K8∤GPX1+2uxgӹ#cbx.R2(sMb*zFtA*!l7~ pߩk6\N|&rHLPrF9#@ gz3B=PrF9#@ gz3B=PrF9#k={VPrFW]ZkĿ]@1^~n;w7qĎծױcljojPLWG݄ :U7PrF9#@ gz3B=PrF9#@ gz3B=PrF9#@ gz3B=PrF9#@ gz3B=PrF9#@ gz3B=PrFW'vܹWZ^ǎ'7s] @!^u@ſi] @!^~׮ծ߀@[$@h.fԳgj0EB=PrF9#@ gz3B=PrF9#@ gz3B=PrF9#ڔk&:th2zjҠ={r\aoͿby5Ҿߩ/۷s]ֳRK%{k 0* _|}i6$2pjFrWs=QG;dI矯v kh9a_qɥ^:UM7ݔ;yGu]̄zg=1[Ը袋;,СCK8u\w} /ӥKt~%n +2c=C=41bDm{}u>dV|A-C -6t%JұcJ_Jg}{lRä>裒_[odȑu|u|4*=%o:m;oOv?,䒓G8O^.SzY Cv xo9ITzsSO=.KoYgy&i|0vشWM i2dd/yG&{ޛ|u_|glS4O<1ꪫ~z\9rj 1~ߑ]&ko'zܭ\Zy>'!.Bɝwޙh;9^F.!~o5\3GP\09cUW]52)tm/ӟcfJìxEYY*,L2f̘4/2K=Lq6|}I'虱['7x# 2Qcl7BYg5AO?^BY0|tλSOMQ7}䜒I&%[ne/ S|L7yg}6}SεD7jԨd%H?/b>+U "+mI=ҡv08GE|V 5}l+}`fH.체fmNWҿmA9cIXW_MAk=zsC,M~WP6ϟ~/ww\P/;1 etiso4D?J\\zEpb+L1|%W\qE7ck{Fs.SOO&f"<>{gm\P[lqYܢ_= k.yk](,aq:*R{lD@=ƏL3oj_G3/׶E M8➨;jj"~VkJc9k,\"D0U<iK>6~?~9dvH{E箻R/+soP`"#bUS'zu* =w}c@&4fJ ?qãj-%*7F 38cςz +eJC˹օ@/ZvJDQG8 JˆIk 1$9BEͭj8Ri}r_6T9b,@lJ=hLfEGCbc|ыnK>:˗_~j^z}inSC쳟J<Ɨ9#.z:t=+$oio\ꫳW_}.=^{;7x%׺N񹍡х^ ;-SȂ;GƶBSzۚJ^ccc[gE\0ӦR g  z)1O?m9WJVk}Liv1\/v-y瓓N:)Baqѓ.i;ӹE< "R:DPZjQX< R_,C7kR^̏WR ),}Io=sUTۊr_jZ|L]zTŸq},z0P<T|YV8Yw¹c/S<>z4vk(14°J{[R1`waK7`:E/RA@2CoX|9նگ) /VGK^aȑU ԣEU2iV[o",lhxd=:wZib)/>3<1Өoya0кƼOAǍTJ?c06V,QFS]i*.R~VC%cc;4XS+}"Cjу-\vZv Q 5%sn]wF?mn@9s07|.Mh#ى) : 6e]wM7yUsq=\3SR *GPhOz3B=PrF9#@ gz3B=PrF9#@ gz3B&:c]PFUhgz3B=^|Bծv ńze:tva9ҤI]-CN޽߬v-ńze]|U/PrF9#@ gz3B=PrF9#@uqbqۤI:ThOz@źt2mر]Q 'B=b]vM-OTLO=PYgO?ըPX?p֯Pⶏ>hjPEq_|1{5jD9#@f/L[jS+$}G>mwufmMժ vB=I6|;C;c $[nGyim7|7pNժ vB=IYdwƏ M6 3|_c¶zhU& &ӟtᩧzTaO@MvqǝX=3T &֭Oծ,v_jL[vYg qVjPhsN~,l;#N@b}8ԛ0aBjS3Т>jSlN9唣kRvᇟ!%QGujqk|]`j$U=Qض˿.P`#+ĉ;vy\] -cǎǍ9ծ%O{[l >'MԡƤjS^u@ſi]KRK-ԫڒ]Lze_VZV /S ^%" KPhvEš^o~󝠴mu-N71OժجW_}5KvSN]tw8|=5?xy??ZZPF]hF={v Sw]w &t*l0`YqߜsYjkHok.^jm?Š+\|eO?Fmto>lθ/GgCq9/y}Ə?M,px饗{_VZZPh1_1䶸 O?ը0orm{zժd^\{?OwQGZPh1305v+u_[[G}tRvag^{pwI'ۘEϸ?|ZoqXe9?zƝ|w^eUik5j?#O+uzTS?S}^CßO9唣48欳0HVmPhQW]u-zV#mM^`=aó2W?Qoa[p74L3\xDNpֻkK.dgy毿曙Og+ |n6TZ"SLC ep 24svuyc8m\/W^o{ st}ز1z{)--Mǎ'7Z~S{\0'Xsu}4nKޟ 'p) }EX ';'v, ]bE^l 4ڲ>䓹b zR pP\ZhG];޻&lrivdބrF/ݻ˾`q  *ìRbjzŵ?} Gx +<_؃oEy7FsĐ.>z> B|בּy/ Yz_}a6x{cs {7fCnjӣehۄz@?gJTsEܬWX6zϫq=ܳI8ӋC\>S^y啥Euܩ%_%\K6<#@{$Zox5W5X#Gw޽{Y_ؿ M\sIq[Wɹڲ)؜[-n%x 4l-fM^ԋP/lRC?lνJ4tަc9>1ځ ,aP9Тv_JGgc9kGc_ܾ6Zm՞*<6{}>}QZ!ؠeN?#bPO=ԣR+6Շ~@s=-fȑ~׮6z~?>G/؟tIǞx{ 7]Zs-RX*抋9C= ˯շok"ԋeKz1`cǐX97z+% "cݖ8?@[!Z~wq/b֮b^zi-⎸]> 5wyϮj-\p[nPֶ/PlmcZ yǾľ9F֒zw=ܳIu{ 7joglqJ oz@pnm֮%:Sc2˼\Zh;z@9Yu!1]\[#<-z|xe~4ЋsFMoi[}YddK;dK?:c#馛3Hc9>Qo|ɩb[h+2uYcuE(Aeʽ!QF%K,Dҷot;,93+9+nk.F-OXveu|cs";#/8o<}kv0ԛ8qbZS/p iO7Xז[np#FLVwl{kۆ $,cǎu{ ^p%OO?pm[p[eUjølTrCʋy[nI{qB=2ܢc4@t?36\2eblMg}vɠ>}dmY9䓓a_+0+ ꪫ&oСkmb|q&E0~di?E^,DX%M3<5JPf-wrk^}^Ct..ۿuӽ{t馛&;cˮ:Ykҡs1G>$o}6FculDHPeY&gpYz}3Cm czW`,-q&zhcchkn?y[hh ڦ|_U( @bT[0v>tY%bQGy--Ă"+rrOc̑GgV[%v[EuPnn*q(LzaJk ќ~wgNvitQjk K)dŽPB U4pȑ#XÔQlnS^;<̓s1:ps:K/Ts&P'v,nرjPXE2Q 'B=b~mB=hyB=d9hN׿+n@3fL⶙fjPدڵK.cQ 'B=bcǎR&'*6nܸm;wWZ=4iRjPrF9#@ gz3B=PrF9#@ gzMԳgj@;#@ gz3B&=ztKY PrF9#@ gz3B=PrF9#@ gz3B=PrF9#& ɷ~=ڥ9B=fԳg駓fi;&L,ɰaÒ߾P]t?|Khz3B=*[#8"y7>}e.d/}'y&k/O${GC%7|sr饗NvI^8Y}Փkfsp qu]K,nݺ%[our۫Wȃ JLVx3Y,/iw'K.dϳ;m!snKƎlfW\<5,Vεh˄z-3JGǏOF*$zjrQG%/re4Ћ`sϭm|ӭ>>~ޫ}&K簋g3ы/l&sĉɋ/0 ^,R6vxco3jԨt_HFMq^2khzUviչ6ۤA /P'h߿/ cJCK[otV#y~Ĉ%zO>90`@-reX?8xwޙ7.ܹs{:@ (g8RK-Uv }W;%k-y:vX[ϔ>ztպZkMv_E=W]u:5ZuB=*9Zo)sW&/x:OSgҥdmM7]o, 8cbY?0}-}ZPk׮>ӈPovKo}Ģ>t?PgyI17`[(/0;`j$ȉuY'yǒ?kkopZ6XYnHfqjڹ[cz3B=PrF9#@ gz3B=PrF9#@ gz3B&:c]PFUhgz3B=^|Bծv ńze:tva9ҤI]-CN޽߬v-ńze]|U/PrF9#@ gz3B=PrF9#@ gz3B=PrF9#@ gz3B=PrF9#@ gz3B=PrF9#@ gz3B=P 'Nعsqv--cǎǍ9|y0pgqծP ݺuO`jo/2mk<@ >|avsYk믿vv -5 W\AUP` )q9#kѣGW&ٳgKU;dĈ.AB=PrF9#@ gz3B=PrF9#@ gz3B=PrF9#h%+B&Gv)PZIϞ=Kw%yWiiYo@{I_8 0`@\}S%0@<Ʌ^>c=\~^{USNc>(q(cob{ł `C{+*"*{;+6Q]g!lfu5df2 g}[o4܌JÇOsZ*+v`Z'".=cSzw_r衇NmJ)Ev&GqDz{eMYd䮻Jooɐ!C*_[.)+wGi 6lUYZk|SlE]sP9W\{|,jQGySlׯ_2`ߒeYfCM6t);<ŶY}umO?VB>mݖ\}S?gN|#FHN:N^zC?-ВȾt=\sMnJN>}ɭޚ,BiPAKp*WOl}м;ɆnSz>;z:݀ */3fLۧmm۶Ɏݵk4-ɮE7&wqGkM+*8);/r-ӐJkn}#h@Oߗ^z)c=Zj2nms1h $B=(>8]&ݸ⋓>}{rEnMqp-$JsTo:ɱVp67p )*lIZ-V:43J_O,ogm/)n1e>hŶqYkmI0_I6mJҐ1pnݺ.sC;.]_tEm6ӠO?cbZYLN-B%2**l=z)UiafJYH83-˘Bo6b8_sEWݖŶbm5֨Oӭ*iҊ椺q]vzs`8B[2RK-N1-PXn뮻.-y۳.ն*1YCevT5ڝ/۷vej]Or&7qtm&LbomxgdD_6YIs5k3&ex`W_U鑯u6mU@K""1"̋^TEѦtD[^;Fb~{xwYpu)uade 2 #tK/$B&4"}11'"1Y|QgB*&8bqY\TgU&j~I&5} /pZ]34\sMrꩧN=o6J1qF~`3ĆE:1V9眓e_6v_}\}N;-TOl_OEMd;skL3\r%ɶnti$1m}D[La?^=*Bd[nac*s}%ݻwOCʇ~x":ꨣ%6mݖSR[c̷ѽ7 QQ/(,uwܸqi7 2blc/BCPs].b"^{vt9y@3LTzi{4*7ԋj_>4&ޘbyqQ5zwQ"3ƸrU6b-V6:w 83sO5k8'3Ɇzkm&*Un, 29}*=l(dgM7]v +jE@E5ZS|trc&?;qiԿ[et/= r-i?<*?ƔpOLy䑴;hTnuj瞛s1G>ǎFP7`tx|޽/fs5*ګWb . /f_W^91QcXWх9B~51vu]op (F[@iҋlҥ roGWʎU^"E1GM"+w|=zHlvRc@瞫վRKmwڞ뺼QWdD0 n)F[Pɓ'cE%#T[;[^jN018&{B3TVV֪mLLst~R/oҥKLم^xD?"4Z$Pgoo+hz@hӦ_nB=N.҃9-R :9#.6xh TB=N~g}.F[v7T6B=vmp1-Pgm~h dB=V32[֭'jժL-;18z@.#+ޫW[-P:m}^B=G}ymwoGTT_b?B=Js1m'7h9z@?!E1?B= @ 7zb7Yx7m:tM`JB=#G -UW]~wee?~n05w{^p?kvS@ :wm IN83{%W=z衇?5Ugso⋫Om+'pVzJMB@TkWq uyVe]n*KSZ"P+ -Ko6{0?bĈ< V^yW>hIz@<]ve|߷*_1-P:貟~iO<9!)F2`3njXK/`P>`VZog)l1-Phwr;n 3^zՊ& wZ@K dfmF%F%F%F%F%F%F%F%F%F%F7x38nԗPJPJPJPhxE;_.;wzn/Uq7߼fm}~Сnݺzy;ivzry%z@V[㏯3f;IIݷUb_X~Ǐp7>'}uu1bF?vbz@ނ .￿gw}f/:묓|ܭZ冃+>`}P z@v=mĈgo{un:uMU>餓nʽ}wRK]sw;?^V@%\;+9K.x`vۦ~瞓feСʶ?5@! fg5|7Ƽfk7;餓xV.^zis=W|o]wmy_Phfi?:蠻ce]N;תn2V[n9]w &lݴ%ae8BZ[ǔIP4B=Y8q3mvب<端zO?}??ԋ;~s\1~6tӳ⾡C^R&/g,*7fosE(n=Zv@1f}W6FU﮻X, =PJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPfUv)v;JP~믿D@Q=z_b2+ҫn@ezb-6&D%F%F4،3{s|;XmiPh#83nD)\V*`p5ZZ#ݟ9CucD\Zk toXӵfk G[~z<kGixg׉+{5ePB=Eމ 䯿jS~?Zݺu{4wvmw߾}[Y^zty}m7JèЊ*;V.M8K~)q;g>!CߎmλkcdbU=o5]wgl|7sW-һO>#s⊯+5uc]pGf]tnjXv;^w#꒻->Wǒݎ%\}jsĵD|d5,RUI_(~j7~,hj/U#E@㎷=u}fe k#Gqa|}n:,ԋ@!#~Bk.Ĥ& ,m</02^-RdI}]=ÛFez/Fxb,G}[e&u BtueդDi<&8wJ]uxqNlg5&'ޏ"dM9ϋ!M%A|F}swmr@/&Yy_=KC{M7}811g}`uzK,~3ףF_~m{]k7ߗq.q׷-4/B=.]_ko3PvFr^}nHI$!xyuYgg稊s뢪Y=*Z**#ˎwE3{l۪^Gm4Bد \T;~~ٲm\rɡQ}Cƨdϱ#{oLEu\>qEEs=v9ʯr"0*˶V f"B95um̪B]uĆ7=bĈs?^8BvP/DWz8 #g=7˂I&2~43QQWdžxV{z=Ť)!~,ΎQۉ2zW[ޗBiP(.]|4vEXh{:~ ꧺ/ܱ{1,BO>yPE^rigme򃑨?nVYq.첃5]uUfP]]_Ycml]sÏ~]~źJl[eDXUkȭΗE&LQ3egameqA]֐nYnQAtu1|C5.Xmz@ADM}ZnmNabUcj>!Yxz7? fmQѓ?!Y7**kb}Xϧzj, Q+waÆQm_!х2ls}}mك5>纮bLc927jkzemnR[|/?0r]Q 8<t MqPz@.n =KN9唁YpRLQR1Zhنs=~יRO>o]z…(WVcUuls2L3<1vX6vZ}BTjFզ-ؘ !\Eǎ??~B}|Tv=W5TrQKQqcn@])b{ctٍq3c29EJPhTT/ t ޔ*1Az1}ֽ7j#hVY̘7:vcưʨ1g pF0YuWR[['Am>jܡ>纶B/'>9_|1ܱ[1HtqͽVz=EYdu]ꫯbӶB^#>Ш^+nw7e{)&l>+x\1kfꪚ1̽"TʤSyƒMc-~)Ř!ϕ19sl}#G-qQ1q :וqc]z1IuUa3 8sm6\O1uz/jݟ] 1LU(5B&fl{tu㚕YeU^3fA=ܳUcb<13+wʺydHDZ1l 6pSb09v}mVd* -~wy7PGUV7&bmEoQ9۞~bUo=&&12d!5m.Y]sgX<5=.fm j+rg mlq㽊.Y^?SpqYwUW]յ-l|F(}B=QKdcAcOSIR'?Ќ.uSin@#5Xʎ]Y@-‡#~n Čdd\qb€8VecŅǮ{キG뭪\r:tP<2,v}Uu =Όk?w[t9ϟ1..rюXr﫮;7߼S$n٣G{CN:X*ۿ.bOB;~YQRKScb6rsT֭&L0Kt[=3OI,"Ĉ " %&2-&]r}Ǯhˎ;xw߽k߿EnU??ckm2&y9ήj2:<~]ݭO;b6Ԫ]s]'OncEecL>3{RUP:uI,[?v8ahvێ T'*<쵗\rɡo2q^znuUĵb 8>-zU~Ageb+o uPڄz@El\JhO]gd,uyfm`]*Z7XW6_TB~RDeTmz}|;}.rS{38c@,?1k;l]u]kcn{֨1N/*'kFdUɝ=6 >o#ԭsq+:[Դ_MHwpy7ƴG4XToJW\b+bLYgb9cɟdw>m۶)z9 ]=C݋Z\!&nGwbc+Tmp=Q z@E5K[bk׮{nEW_um뮻nϪ&($͙Pw饗KqǟKQbXz(1c,PvTfVz)p-EK.vꫯT6TF@Q-#H,jժlĉ[vS6TE%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%lWN~䣏>*vSvI&mUc@!f{aV}tPrG6q'Y|œ'{.vs19S}As=e]L0!oZ+ @fM7tz뭗vMҥK2|i.Z&-Zk|Sl{衇E]tm 1q۷o{YWsa3_~ʿN"~VX=z^^{u5\sAOwп#ٳsW^yE'@ E5YСO8tHe]6ҰoM6xlfk:2@^b#G +Ǎலp,L^hq+W}UDiw`.7|\gu?_1`9U|*LN<=bmիSTC9䮝ws_tMgVQyO6v 7t[ꩧ߿{c:w|Ygէ^lbhzLYKw>3Sl~:ǏaC;6ht}WNX k׮s9H9cM1l1iNGP +8B_~yAO5\?l>_߾}2d6]v6w-k54--mݖ Z/޽{:?<:uQ@{衇&\rIs̆;jԨ5zuwܸqLMXu|BC\Q뮻VOm];sꭽr loZ?3+}'M4 /u7~-w{OZjOb=hР]sC6P!&7袋cEw/b-6ն[.Xr=S܎^_~t}cGT6lemAY励pfޮk#/pfkc駟^}f6&2zUo6Gz 94-ƹ瞛s1Gwy.*N?cǎn&,"c`jB=` gqƀbPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPJPzw^|Ň*v[u.v;ZVZn=[ng{y]LI@ќr) trP0y?v衇^)vE$J^v%\rh,Q#lR@K&7sМ<ݢQznw= zٳW\W_}ubZJ>}=zt[oE5vE{%o^Æ ۣ}_{۷o?\&jhf8b7h C^X6|=c[)x 7V&Mj׶m?ʵmږ@%jIJbͿ?SNT@K#jm̘1vm;>ӎQ/F%u;Gu)Q}G}yB=(<Pg,_}r߷:<[n"4 Z P//vsϭ]6@K!mذa{zrÊ$hz@x≧;1w۩zP8B=AN;CO>S-PJPJPJPJPJPJPJPJPJPJPJPZÇ'L>b7'`/brq%{rA%[<85jT2t%zJ92s=+R??o 4(9䓓K/4|v}g=vd}Ml͙/]d%k}s4<׵k?-um-PZrC#8"@O>-W^If}qƥo.lZV>äUVt}M7vmW.?/(/o`/xSK<ԩS[,b-)8sv@/;ZPQ[eUz 0`P,Yfe*йsCɏ?XsKS]amMQr=ݺuKCa.)nO0!~]srQ-RK-UsT2B˧z*Y+W^he@ {׸OTj#{%\1unW~-Իk=zL}8W_#̗U {UiսƬCMx㍊Y9\s5Z;hYzB-"Sm&O\q>K׋.TfƏ_eWygm /p[oMzYmuםb]C~W\_u!\~8ݻwov0m@ 믿&:r3fV0,Ի 1 GUmW^9.8g}v3ϤQM7lBWxkvڅv-Lt{twUv0m@ O]Sj'x"Yq/&NXiӌ3ΘPA<m6?*VVP;o>cP/Ő=`"㏟"ԋB\0]_veɑG9cR0 3XbOڵkWOj# G7@mQC^{a۷oL;zBI޽$}݊oG1~;crm]HG_aaV{ bn!YaҰ+/’»&OYtME]ޟ;o+ ,XuUӊC&wuW^r% lAzSNtBiPZb܉bvVZMYgK!ܚkY}vKgun2-m{UVYe>b6f5+TO! 2b&g<El4B=h?tF%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F%F@ҥKb7@@ ~\B=m۶k[vԤ_~ zͯ:s6mWn;餓N@a{Vnb eB=Q+j{z街,o]0-⥗^ZUVeۗ[n7ǎ /q1b9￟U4B=ќqʝ}E{뭷qo+Fj/ ~zX6M "]m^zWcGgv9=t!2$m)@#,^zڥK>EѶDeTtM=z( :^7qg1c,ݹcgl۶qロ6ӷi2Ƴ,tI4>l[裏DVϞ=Gq}+ֹ]W\q{%+ 'Hc[n=!2d!|Z<۷o?j&㏶L4]e5g6^޽on,ۋ.Ͳ)/Z} ,U7lذ=_|1=wMk믿g 6x273Z7v:묳;STc/WtP/*_o߾~Mc3}Jov}\knRn裏va7n\N:}{YgGKT N?޷馛>#l~z'|r 7mUM~GKvwKWv?mqʽ{x,ԋv]۸Zk=]M' ߪYPPOGTTm^rk?_DfϪb|,̶GT[]Aɓ[3Q rUb‰hGCw}[駟^1W[q"Ћxsg}\s^TŤq;IΝ;=6ϱ1Kq|/2˄~mFB O;n~oowTIfϕ~[kzumw{|ɃxJ'09g|F+{lzX\ l* jW^ye }u"@- " a?<[!х17H oQ믯Pʞ+W[eJyۮ/>>W^_m o62hE`?瞭r 3ֹ^r-V~@/DYt-7˞{W~% b-6&B&lo}憪OCTz!0G΂?q Ͳ`.bB*Mo;",l-? ?;Cc}0UU5ċ?.;WMю;v",똇rȐXE%\w1nULjsRn<_tAP/Bݸc='.Gw,T{etA6;DUcuǎn ;7˺wц&B= *+&1Y UMTPHtr5\/1AVCY4dܘu7&X]Bn;r_Xfqc=bĈybvϯ@N\oۖXbcU} :wRK-N# Ǣܳ]cz{mPiw&& 1FTwl>m1&lH[ԆPht tcnOU573ܮ:t1օ B-&9ccM7ݴK~nG}D\Tfƌ8~81bP]ki>1^fFnf&8#fou6DVfzMt HoSSgiw6յMmƏD 1pl PhTQT]׳gQwqvM٦s]wݞbd])xc=E6e;c#֗_~|"±UVY,fm#|u6v_ 17cŤ+1p,;bL?BhHk+BW˼I2F_^1QUM-!{v&Xc5^hO̢5e;>X<6sm6w!/*Ŷ}JrXQW{U>O<E߰aۗ]vA 9P7B=dԩ'QEUU8C=#<晅;J_|q^vq֨x3~khztQܾKlB.v;cO3GHcŘ=BEYdlw) +¿`d1mtY[,&z.뭷ӹrkK/Zt&!9\ѵ5fS>ϋk*jC=qczmjẴ>.{u&uPh1=u笩EuFx=sk/ңsEPd~7h=Y0$[B."8.T4T/A梋.ᥗ^zp,5#Fs.1 SO=~~\s^1>^̈;m?蠃.º|1Cq6Kq0/*;gbfxs#}ݮK.{ iw]{ǔ;P3*Ubv9[9 lՉ1R Wת_vI'tZ#Pjgd,Uݟ_uDKMEլjubxOj׶a6{c9>ڭ.N4W_}5oeY-4m_n M/:*hiz@e1j4}41>_^nc,bZ"`on@F57n\b P;C!CԁP;Ó=z$Æ Y=zt[o,駟^f4 Q,; ZjUV@![noyG-Rzꫯ~WW@K!mڵmD˜s]e۟| ):{T1-P'eY&Tu?<[SZ*P+[m={owj@K&/ܳgQol޵kw] hnhnBѵjժ.++J=Ԅz 4rb7"¿}fbZPg|C 9J5ܹbn۷/v;'#/8쳏ϩxJv{fy뭷{v[njժRXꫯܹ?m4{y=dȐCƍyym0~nbɶu+rN:}R̶@)QGA\{/r?m:xs5׷l+zTX`>bfyGyǏ_hK/=MXL3ۨQz_mvqmj>GydLP+mڴ+ {%W[m&L0KM¾\1c,EMNhuK/ڻw[n^5/01vE:tcSz@r-u{UMO/B?Ewޯ}М(m}k׮﮻ԴI-?~fh4Ygu}7[a^c=g)MIPPnmك6nVY_M6h*;묳X/ >ANԩ'M.h*[~aSn袋 hv@SQ4?]~y'8㌿7E)(` ?c*TܾK7߼-jzÇOv%{n[ӎ>}$ҟd 6(nhRksKVn?s+b(k@)hV^y䧟~cfu裏Nve4 Ȇ -?o J?,ݻ-q4皚92vmz+k;/ٳg@:C/u]oioy'zLKZdEGydm &$cǎMxnH~ON`Ӛ믿P/ M.6Qzkk$?s(:mnMdw_~y;vrcmPHtM>J+. Hw|oW^y%4hPEl Lfa/{Oydy-rh ٳgQrKz 8)X:Y`**krI'%wuWRVVV~Q'|~d=' /pr9礅6='8c31!?ǵn:W^*RK/M6|ZP>OOZ߭[+v~cIJ~…^Lϲ.?I=ymtMqL~5i?<ׯ_zToO۔ywW_}59:}'ni/'GqD_TzVb*dv2[z}5}ZhnsSמg}ﻆ*1/w}g|>RK-~]tj+gNK V:*qκtRc<SNOػ؆:9묳*nuOOS^#y,3)5ӞY/Oɓc=Zvs=[)`ZXZ뒧zN;Tm^7rȊ1JF I??41^.Qwԫ/bEЊ+ꫯ1ioj{S=6@ޣG>ض:mYzB7x#-,?Gq^stz뭓'Vlڵkҷod5L{5~wkEAM >qA3&XbdgNZkP4?ԩS2[ne{wz h瞛gzvϯXQbFkqU. k/F(=W15xo>Ctx47tSW_U܎sGYv`-uU1Z`T'Vbb%[,-b;f:\QEv[:r`;"_cE1MV7'O ;~sE%ofl(&cDL9p*M3+:kQi,[Sc9&-QQEbQiC#;,4H}?QL6bl? -GIMc=b=T & tՉ?(.1\=CO?ӿ?$FyEOLkEnDQ&[ij|LLDsիW'H]vSܞqS {T͌3&)FQdҤIsF:1ja & 21bU&[}/W]Fӑ⵿E3Ojܦ{WVVVq!E@<֤}<csIU?gb3X򜔂<1gDp|Ŀ%ٿ'!F<~5gXOP6[?S@[k~or5͟b=j-FnyBcoSoƔrj[_VT7_rۜ_Ub?uYz.WWǍd`/sڊCvdjV7d*Fi+cz(,ѯb4q~Bx kPǚ/ "Fx+ӔRsRjq>(/F-JP/ )F١C"Kת;STMAuD1Jڣ>~bܑ\p)#OIZl SH;v9_SeƎ[fb-6xObD*b6۬vLsxW;Um֭[yUʿcb(ލ%s913{;~Uc]#RLS~?5sM/'%F{֨i5Xㅦhb=j-Eu]?bqWÆ Kf)#8|W:ոq?eSiӦыjzX/^\nz}`!F˝آ"|뭷?Zɞ{x 9#+B2|MzE ٸ뮻yUQ?䬳Jo5QL3?HveX6b(:T;pLe[nfSu_~i;C> y,3 z^\rIz;>:u{:YxeMu1>3q]eo|'~SsRۯbN|AQMq>vۭ+ \q2,N{$>l:JߟK.uz=qJS|f纹~f+O1ꫯ1E;qVJ_F;6a6}HW .tXkȑUNEX-֟|I*x 6 tz5(?>F/s=R(9U"(Za?#R>*>ʆnĈReeeɹ瞛.ՉcTlĶb - M- /.uS;秹2dH:abNXh|B} %ǣ /L(i03k1[6V?pEuůMP#~%O?tz;͈cT|q>'H{,K3Ψu[)4SS7+0iZ9wY@)J1BIvҩ1KӹsZ=}CzEt/;#r4lU5,F"(F{bĸCΛ4}1k6Wfg/NsD^y5硇J t:&F3s9cdNXfJ},8/2馛?0gGX -0\s()GqM4zk&LH@Qs(3>qԦXogNzi*nj%Ck"ќ5W1) 80AB| #HmGI>߃"(͖4g&b]21raOsӘ#y+F[o(hQ$ }ZT~*. Ջ7>W^ye:5-O;y/#0mPЂem Q;[c??-bXk (e]6]ScMS׶mjӘ u|䣏>:]jFL!K]g()cJYs K6]r($?䠃ticBlfX N7t…8'?)+:vXj q>bNY: 3S6Dc^#<6g_؟PjL!]ǎlpy%oqA}kĉ-Ph G3zd}MU_O;x(}Qśzj:a|֣ aVQc5(|f {Nyz~ 6(nb=^}R1E#)in.Ph1]lFIi̴[n)vBQ>b)'LGf)c9W\1֭[馛&[.vX*1,Y h4@)SX Lb=(0zP`@)SX Lb=(0zP`QT=XW_@%F]&L3QToVL@)֣ :wyPn@sX8p)]GO?XVV֪UVe;vgϞvnP*Qp Lb=(0zP`@)SX Lb=(0zP`@)SX Lb=(0zP`@)SX Lb=(0zP`@)SX Lb=(0zP`@)SX Lb= w:jԨ~iDzVnPZ*ر={յkwRX9S4bh| 8#'|R4w(ÇUӾtQ߾}-͙b= bܸqijX LE&K/tTb[oUfLQToqr!@% X(SX Lb=(0zP`@)SX Lb=(0zP`@)SX L@5矤G|n:yE]*I~{rV~wm9W^y䧟~J>#:9#@SO%K` k-JP䬳Κj{6mg=]:uꔬZk,Eh%P&NitM/~s9QXV]ud 6HT.汣4lZ>Y@ -J^OVLCz*7 ZkU{8NLas%vZm]vI TcbaÆU{+C|FG8'^x ce]~FꫯNÇ!?kxcDX3wziJT Q D1mYZ+BV{W+PIyKI%]|Ys'ݺul΅ =#;'uEj'oFZI"Y;*ɴiVZ)mkժU2?3GV:ҥKr'D$Xn{/& %Qh^ė{:+W^z{K?4H"@ya/"6;ViTYl,ֹc뮻3)_ LbONT8p`z;> ?k~eu1宓ޣr|UcPxzt;⭬^]]>]tѴ VTJ9/jufU9_BGqi`"&-j-L[FֲD8Ve7V\qkpL!](zNyzF{2>:b5\qiث"+i+Rs=SREh'sz~ %N;TX;H~!]yU ^)湮#O^8FIѢ8 Q1r?K~>. qeu1k޼yέ @&,pJ/jBÆ ^;y7hkW9O~}+t,URr_O?=jL,5D ڵk( 7pC'Uj}Z.9 嬰 1cm>?J[QI'Ћ^TYveų~WY0"YgJz / y&H2UW]7m[ZT+Y)*8-2euby}? :~Fk|ϪcY@]!=R.-@&,p?G+DTcNT*8ռK"xSSwy)S},ZFu ĸf gDU;&GydUw]tꩧνڶm[h"2Nv樎7޸Zd)mtLɶޭ`\ƍK`PeiQ%qw1mMWBy)?JjԨ? T^^`Ǻ_Vy饗޹s2#yGݻ'niZ ڗR-8jo)8弣mnI5UI1}/bsos9r<,۷OF=w}ڴiɻロӸKf̘Kv|@*澳Ė^z>j+w|/]Ϧ߾Ǎ"L]UE|D[ø^#dsuץC\G]vY+{y}?L]?_~(v(FJƎ;w=e"$_F"j|Z,uq!yGuD5-nyt/smS#('<ϵ2M6M6`t9߫WOoG+з~U[wfwzt7_p 殟yxJ|cqmr )L]ֲesI_pI'%[nez&L\xsFʮbDa~|x1駟ʿ9[ougCXX`DPW^94hPcKVYTv̙3; UG#*vz?s)Y;y'zhK𫯾p6yÇOsLVZiyousQQt˵ںyq! Ɉ#Vp^\!ZtAymVsǎ~^zir'V*L]?s++ٳ1x`WbףW\9QoU?Cm\]x&~>Rʉסt+lugXVn.Du<jl@6jǷ5~K/C=jz#H[>"-,4&]vM۵Fk^82eJZ.~az_T^duI5kVŘsM(ļj4\뮻&Kꫯ~!6,iѢE2k֬oMxGMČ/g R}_|Iv2Q}g}I+Zi8^mԩS5Xc +$]tI6d:[r%*nywr=ؼŵQq2gBnҖ{{+:\Eh_~y+b^68ŵǺjA +'MXoy>ޡCjFmT龢XnRA/M<RZT;SZeնm_56Y> O>$}-y~ym{iͽ]z99WRn5+LM;ÒgyqQ09ԩSXh^3zsV=?K:K^( %N /V!Ly?wcOrYm>_)!>?_f |3յ^{Ky:^Te^z5PRTBk G bv;wN[l 7tH7/Xb?}^-"^ulcW[o]缦yy>5}n_^YjQV}gx*V*a=2DK7Z;?IV^ybO sg_P۸>꾨.7CT|ǒyV@ʱ 'J뮻&~&>hk{j'VGI<#jG7rȴMvr-o3JX 4HzU +$FdO@Y\u_Julz1a=ZB$dLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX4hPτ czdaÆ3=0{ @!rΚ>}zbN&Mǿ{hٲS6۷^ziٳg/S~ٽ{ /=NX?]tE'RdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz@Q4j|͚5As EѸq>}zYI&7cƌY&B -k>-\ kz@Qʓ7qVY&*2!q&LX%ۙ@hժ|Ʃ@X(ƍXm>j1cF~. EӡC* 녗^zuP4n˷~~{7=î/Ĝ z@De|=3[g=ȒP4l+K-Է[q}cǎm$a=vmnC*7|=}'wyYg (Ĝ EեKG5k6w*[o_w/jnPSjР?|_~|ec SXHX(={'7lذW]u1͛7":[n9w[V4n֬Y ;/S 57 z@pi_YX/\|}N= ]tџ 1/ z@;<ٹs׹q3gl8`"WjvmSٸK.#85\s|!JX5fwyG~sec?@XUz+ٳW4nԨQ[|B KXU[n/=3N;+{!ms#W@u Ωzaz7ME^.]}뭷R@uOd'|r^{{os| 둉[n@A=ſEbυ?6mڌ{֮llT6lXB !G&&LJ[oZW=z {-:QF}km|*s9g>[9rbPی;]1bv 'Onٸq/;vݭ[~{L6B -kELj ~a뚞K/ͷ~T܎gqnM IXj׮]{@yy{ 4Fm1c6ls=y&MGh/Ic]S2_?:ڬE⋛}~Z#Eo<$[veDئMN3gNt_󳧤3g6rn}СvasNTE&{l+֣V__}c=ʫo:ufmO<",B̳.6åFX\, s={]}ս~ŏ>kbyGvҥˣŚ3gMڵk76*P;S/tt-k>h#8no.& uҕW^y[n9r;QmlEs/Rf=AÆ gƹʄ\z饽]wwƍ&mJm(x Zl99'Lb-cEE ?f`ꬽ_~e:4vvlw֯՛G_fͦf=EV&zQy/*U~矛GnmZD00*&<9n;;cw}w5\s|߾}/KN蘗]v ҵFݺu?^c>CoXfewes)ݻw# >hʂzEz뭟hLT<3έn'x% ` 5:[Ѹnʭ =c%&qqc7‡~X{<^@uZz뭿D}JqÇ#ҏEk=g[ 4=N={(_wuGW\q p֎;Dl_,ֿ~\,ՙcrrآE"8m;ܷfjoݷ?sp _+I~r)=33ǚW_jۿm8Z!Ѫ95O8s{[na[n90Ǝ3f6mڌk'MN8뭷ޛǏ_k׮uwn^zѢo}=zv뭷ݳ6 Ql#ջwKe_>ۼd`kA!|F.N'卉Tɠ^ӨbXrLlb)YN;?>w!ҏErW^e]vJT+]uqĉ[E諪inrR[mճel~Tuya] 7Jcڶmvqmѫ\qt:]QAco q\[W67x!Q16lX&Rz?}QQFևzx'2cǎ+&&lrrQk.A.U sKV+vNTxvǣB",qX0`>`#y?sTyOӦMtA7_tE'E7?YguލJnK.wVZT +9t`t<NUJ+}ZmB9;ߊ*J鶷/Rbͥ6(V5kV_~Y8qf:`#iѺc*D[ը׷o Zh_Ajg|/nS=n)۵k7}7MfaW(w/Xs*Ke ar]vywk>^߽Xú<[܎mMT IgϮ?W[EZh39s̆_|qzfMϽ<~.O NhK/w3ܝw޹oÍ*'LJeaʊ۹׸8餓.F"g=ꈪ}U1cFb )S,X%ߤI=o.m8qb}+k?׍6ոok|"Wz|F^ʵ0=ЮY=5uUWaxÆ Q~%F,>[rYxEQc?N;gE૬"!űcǶ}z:k9sf+hO-t9~5+z_D^B u /)AvڵYi~YdE E@|ZtEz7؋Q>JK,+<)}=zVZm-ezw߽wT_^q? qwEV,mŲ6<sQ0sW_ +yǎGGkXffmbgg1bv_|ӦMkZϪz`,b9>{챝^zQ0˜͛79^XV]uO"`[=VZMsҤI+#AXmqa=N PqƵ`U曥 uR_x"\'pe7&Bpԩ 5=yKXk2dHlR)KÆ gFĚxKU`7BQ%p^@;SnTgRK-ZTtz^̟_n=餓.mo;蠃nέ_{G5idzaf 5z@H7tӗEEB̍S袋N% ֤YW6a=֚={v 6`L*ǯ)Ǽ:î\lذa=}.Qi/Z7klj-l^ڵ{.OX=&Nتq՛w_Lb-c^s>a=V馛g߿k^SjjAts>c=+isy!'?CzwI^;!c?fjPٸuY+B 慰E1eʔN|JǮM7ݴ3|3v{d= zo?$\p5m4Yjy睗̚5+K 9U+9m4h0vش*ߋ/L<9駟%X"Y~Ν;'[W93&袋/"ɶnx/ {ɗ_~_9cF}ѣG'v[z:w֭w9s= kWq%Æ K+Ɯc-[LVYedmIv,B_M}駟N}oIfϞ,_dwLvi~՚}ݗ'&&M$.lzkݾu]w}u]O<|gԩSj:uJ;dUWge pV>cI}qVs"@Aso/iȭ&E܃:( _%oW_޷;$W]uU,˚k’K.r"t.쒆KS'hBf͒C=4GiSLI^x!90wߝ yQF%?o?>}zˈ#Xrےb *~i<#z"ZkU89s$|pϗ̙3?8]"A8wo ݻwW^)KuW2TsPZwyg4n8 U~..ovƭjͅa=2alV*Ec axWڄ  u?C\k׮]Ϧ*뮻&g"v9礷#WRСC/2q9[Tϋ\jnQJtqbK+UUվ⋴ԫWq/RZ81iӦ+Rr7'Z*s?pXIѶ&E(hj۶m;6OJYT>`LjYI&6 Q]h ><0ׯ_Ex/Z'J[췲jrExK-Uq:h!Yg} .yz 7L6|M6e/yXŠ+\s5)ľP:NH92V7xc[.{GT졇? +[!5IX:駟C{ڨVA\wy'y^mYf?G[|VY!27oYIn*ݮ}V+OT 駟vN8ǧQ^T;7pC'UK,] u]DeDp1Wǵ>J U5x#׳g!Y @JW+]io^DҒZnv}JmԨ6lXzEaW*ꪫa}ҤInSo\mrra[Z)s=7!XJףcǎɑGYfBﻦ)ni%3Ϛ5+@&OGRHa=.a=29^zoIן}dTW-:Qz\e-QU"T:Xگ Ҵ[l#\8rj"۷OF=w}ڴiɻロ=\2cƌXBq4?\Pe]nѢWO2!@Ar)I>}J/NN>y&lgy&` *.DHn 7̋m6Ʌr"YHX{Q?NV[m̏۴i5{^<}1$ov y1\|z#@AD?0dȐO.Js^zirI'鱨ֽ{;Hׯs ;tw'>?>iܸqURݻw2jԨdE-.9oVFmT"L=3=+RA]s9spmw>1ufO=.`"l:(m;]ڵkI-Z"'w_:6 {n2s4"ԲeNHbd%H'L䧟~mZ1E;h_:vVrk۶mرc9sG`n(\"b^ Hc:>V[kaSLI'O=TXc!wXa.]uuI\rɤ^zQgr8p`mwVu 9r䖳gϮ_ٸΝ;?RK}[9@(ۧ-E?Ӥ_~itEg]~#PugC=L<9۷oc#x~5j4/OFDm̘1#5z2E.BY[. (–<y4iRr-KMСCӥ<:r!i{T}vah=[ KYuԩu z饗:3ߛ_z.%a="Zx5͛' J0~rkҤIGxT"XjRT`<"*RS5k\__,-c7xƎ%tM_|^z@8qzuz@Q|KRٸ%X_B "ń Vg*2!ۙ@Zj51@ք2eʲ[q?z.5a=(O$qM4\ kz@QkܸYbƌ'@X(Yf5g\gg=ȚdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ([n%y衇= }0֣t 둉7xcb( P9a=ȘX>|Şb֣ڵkŞPwy';vl0_֣vc-42\yz5DX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX2& TA~!ݻwW^ŝu?󴏗^z)YfejhF'f͚s?[n5~^{ OX:sIobOZw%wuWO$}Y2uԤEIN;,YuUc&O=T2z/LaÆRK-,iE78j_7n\2lذ_NӨQe˖*l6I׮]Z)qn|K,n:y睓=3=7 x=P/&'ON~\,IΝv-Y}Y^o J{O>ywߝt=9s~ɝwޙ.7NO+r^yW={&?CO>=_I&%zz.2dH5jT}O>~M7T1>t1bD*W_\z^nz~{W2f̘v6mYiN.vf͒C=4+4nʔ) /$vZ˦ +P汣bYϷO,VQ.UsݻwҫW ǔA4ܕX| ;CrUW% 4(wa=x{w:묳دV7裏3f"פIr7gΜd=HD}i:/"9c?>W^^z饴z[I4>ٳ=z$*=fra{E5DP0zq s?ꨣPabKv?3Lf͚V(9nݺU:l^Z `V&*FuøFBT<]Y'LVcE]vɳ>VGM_a=ꄲYv%UNH927xc[8{G0^y8∹AZӥ +ԭHʼ?Eկ* E5'BoO[lz&+EU>}$ÇO0aT|zm۶MxrF/^ F䨒|0cu N$@VW\1Yx?/w￟VˉYЪ+*UԫH jT ]wݕĢZiQ:u ne9䐹a~-m;/j.L6˵~w{/Y{+ݶ&k杰 ZVek[-χ~[o[k>Ӽz5y]0-X1iMJzoFr-$gNz葌1b^{m /#6t*?E ,U$4m޼sʔ"؜(a=A;vLCY?s~w$m]g~%zo'|Ir'w^o&_|qÆ K7n\92fm*sa=*6d??3lPv1.'na @ 0_z>+꫋޿du֩־QT0K9[mUF8-X?&L-w8C\Jt;y IP|zP"`O'k/$?x'kvrA%mYҢE%~}GӖQunȐ!ET馛nݺ'|Ǻt钶ǭ-]\T Ɖ'Ϩ =D .Be9~<^zi[nI:u9塇J&O۷}D/6بQJ@%@.Kst~WګjuD>FYVҭޚEÆ ӰZ`Mqe^\54E>KB^T'*Y-ڷF;zo|i#F̽CMw^ę@' >;mq[ڲ.mӦMfa=XEX/,y :a=ȘdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX4hPτ czdaÆ3=0{ @!rΚ>}zbN&Mǿ{hٲS6۷^ziٳg/S~ٽ{ /=NX?]tE'RdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX̽ >|I&駟#Kt>|x+_~I:4 Uyo ;CrUW% 4(ss9'馛=NK<䓕j\WGmF8Cf͒C=)S^H}dVpY\#9sI>/3g&qD5'l\+ۯ1{NzUᘜB\YQF%0 )M>=eĈgNmc^ziz;B[.y^sg6m`"@I~R[z饿z.5a=x7x֣Uy&LV,6wV7|sҪU2?3G|I.]O>9ٳgu]] Q^l:th2pvjJqVTʊTY*}e=?v%>lҢE?=3ӥF0OuV-O!uj5aq"X ]T;ꨣUbK+4%k$'_^{챴bdy"N>6t䣏>۷OXUY_YDX/H+pFz9^J+A7x#V=VЕϣ\Pqi5?Ҿ曥RK}\ kz,P" ?'|AZ)**EŪ^m :#LU>\p/yFhs}oV*OO.^czrm&<@ǎ+"<K| gM+Թ.K]Fׯ"V[ 룬JuY_#%8?Š+\s5~J}Uʼ?hU%#D+ TF/W0\i;i҄X0_߿'B0Qq*W V` aO?=9DEXƏGuX,֣-nG{͘c&MUnTpL"k;$^kWmM)Թu 2rܰoKW+5 7ܐ|'iZ6ϊ~۷oAqw#lx]wL>w=*uԩoƍ+Uߺu dMXZT d9?c'rK\zeVKCM͛7/w_ UzW9E[ҊD(Fat`zɰ^-uyͱO?aBP&\eV]u?O4Oc q{{Eh-رcrG[.+q7D+K.$ݻw#ײe?6Ѫ9D5;n ̟~mI%\?k&W6j;a=(цq 6H.,NϦ_?֔mA#GjV:X TږִbpDh[:YZT8+Fڷo=ziӒw}7y7{dƌ韱h;5DžZ۔%*iuI=#F}kM^x/V(OUڴi3.@!@'tRr}#rw'nFh{IoGoElM63<*r"VRm:׵ `H.UJ+5Ҵiӹh3ӫWOos1o=Rd]WWߏE5_=}mq{>_|Euݻ'wqG~Wm)KJ ZM\ &Lּk۹H"5jT袋w}rjd6ӸB_#^#Ky.k۹v[ڪ87yiϟxuY3ꂧ~af<(k'C Iu떼zydø@E}'#EKƏ}ip6m6]#OFU;ryc:sG,*'k$ 5 I.]K&K>ofou]cVM7ݔ''V;"<^zi%^N:U ~RTj;mq[ڲ.#nӦMfUW]u1޽Y IX8#!z̫ǯ裏vgQGumB bРAg\=-S2of!Cg?AO NX\߾}/={vmOoB IX￿֍7xH>cxJb2իW׭[6p׳n?3 /|XL͏:k{9٪UY EX^{uϴiӚV6n5g[9@5n<;3vذa=PFSO \poPc&Nj-؝vSN9e`s@X?Ӣ뭷ޛ3gά%\oz<矛*ۨQ|6m:s@X'~RQY/&+gY ja={オ_7O$#F.g<-ujٳ|ǿ⋛u,P%3glvۍ9roРz/mڴvwݭ[̙S//ƍkb6(ǠAH{loM6iΏ<ûd9/+2M4i޽{_zYի7߽k׮f57kNÆ g{c?]Uwm'|r ̪y@]',p9 pӛ{.&ML߱=UVy晭W]uO=N˖-'O:Y߾}/K{Ϟ=~Pկ_vH bχX}?z駷Yy'{.P  2.:)bFvꩧ^pg2GXP fmOx≗lv#={0 @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX2& @Ƅ cz1a=ȘdLX2&u߯ǚ5k6cǎjgnl+՛S9@] ,>5w;_ =d 7|;w5sxNlĈrg[N:p_ *h뮻;[bK͘1qB /t%[KNh^-X̙3.EU5j7q;*2|mf/{^P(!z矻{Q3gNbσ>Xcǎv= :MN+ Kz@_~Yx~m瞽>azҾ}{챝YfyP U ?\pj)S,{epW믿.T}k[h[oL4i2g#Ԉe]vO%q}+廏gyfh{5}QG]lL}|ҤI+Ϟ=駟~^.ė>kרQ߲'ώv 2G98Ǝn%[{W,y@ٳX8[ ֣k}/#dAX([o?|V[m9sU4vڴiM;tĉ[իWoN5IX(-b\{ߛ5kV~+p 4(a=hZnڵ냕k8p)M6V@Mj]w}h7wW4nƌhjPc'{オ 1iz@5idz>㢺^s,@Ƅ cz1a=ȘdLX2& @ƄCÆ ۶gϞȭ{6mtF@ @Ƅ czy:uj;wܱuecW]u]v}.iȑO)&MvM7]T}P1a=JD[_c5>?ݩS[lٳM2eW^yex?iO7o>X.CW|+/[oիkuYO(>s 7\Z@Y*qg}>0pKYeUIJ>-.~kw-畼73[?ꨣέFm4* O~׋[Ff}4xAz%p#zulT^zia=#Pxh#?/;גּ[n6|۷o?~x 6*iwIoaE׫WoO?-?=&PUW]u)S:ujh{=lꫯ_.{XJos)ygV}԰aU@SfͦyRz3<[ouX8p#Fpȑ'{@ Xfe~8ngw޹o,=z 6Es938,7,2|[k56:c2>gΜz<>O &:r-GnᆯG8'm #V[ĶYs~AݻQј͛ktM_ono۶ۅ#P͜9a;g͚ՠq͚5z%xG.`A矯p衇OXxOtA7x≗b~ 2a=VZi>믗vj۷-n:^x}wuׇ/ZgOosh^xS֭?,|CP]ve'z{:[veg߾_|vL:QGuG}߿{׮],)[/5j[n}Сvaq|լRza};vݫW;w|˖-''zGzk]{GK9B(Ե Pa=V駟~>oUw]ddu}'*ľVXak~u_|a_Qū;䯿W_}"Z2Gq]! =m\~-ަMqݺu+yT/k/jbe]9\WDe믿O0a&!~5mݫ>>k7\պhsw߽w."8q]|}Y{[n9_죏>Z=~4mtZ6x?Ώ&d9#[O(n<~}Gn ʉmϓ,+P}z@_n^}սby6 yԨ}wKR8Ny5qA#85z莱>}&~?םvzT="`Cr_s7|PT˭xpkIvk{yoq% /ˉ'xI\Ex-#Flw@O|>E躲du]g_+ {m ǘSRX{<\Q :Ͼ)Wn=ZoVFcs%ڞ6idzW_}*qDH_c"%7;^{uOUϼ(Ίs-qkb߅|ϒSOm_FXu 4o粶)ĵjs$~?^^fei_~e%}KnKVV4o8:i7. [T+fM/ c ˛#UB~ҤI+G`իWoNYy晭#4W}BQ*Qaبxa6[n/K*L*D;ռrA1 ")nʉ/c~<cq0@)+\V8qGX'1Z5G9*|7K/y+ַo =B9EwkUo" D;ʨhǏfeǏ-b@jU,%#v~~ !-gTq΢j<[VYe x ue/"f#[XϾ{oDU>K XJ #va]_'[BV}E%ΨZV@+ύ8kWỨүY[  XӨ6/= 0ԋ رcE%G0-彇Bv֟#ݻwsFP/}'tEq;•1"NJpy"\#KOr W*ViC 2^T?ٳ琬SD5XSY{D*/KVQ#P2V9͋C> sq>ғ "K/w>sVmGa,]Hq]U6&[>`b~UnϹ~DEUzlT MnFs=׹ތ3qKW̼|UGTϹhֵP.LUxjN'*k\骪ka$s/~~s={E{nG,qRTr+oY>E0q;ޓQ/*PV);E-^BpW9(a=Έ IQUD9*4oBEW\[Urˑ?vmrV~퟊Lt,>s%p4nxF*W裏V/=&2ٗl{TQv^_Sݱd UbK[nS^P~,(xF8~nE{~QtT+oY~> <8}:~Rz\tT+e!st}Nz@U"m骻3BfQusϗsuG8RVED.P*bt]wuv%<9DӪ=Syw\ɖ(dVUYλbNn1B^l|T몫:&vmS .85n'U[l1G9oO7ƕ\OeDZYHY!,g_k駟&A0ڻQssréXɟ3SE9e]vB5r}mE!,?:uBZ|vFؗ_~yhO0}&g,1&ZF`:`^sۄZ+vn>hl_(ǗQ%FfXv%CEfرFŃ>vp|kh#X5Qahذa=v6PNh|[F_ V@FMUrޅ%#\ј\$'{e+ k>AqEk8Ovq*Ms!DUn EŭxT]ݎ~>NjsU+S\R|&z;BM.씊`S 3Gl}>Eh![YUĸ> 3FZro]m B }c9/ݿ^{!{!B#@ RTvi嵨+O׮][n;2j`~3=3Z*_ms7rgA#׆/Zu E+vxZm _4.D r"Pp '\Ͼ#xOz&^ Wmw!Eߕn Ah[4Zl,r_N:СCi>}.=~WZoޜgQ=-[|9yg_ܧK0=TV-/'ZoF(ʄQ5BC.]<TKR\Kq*9MRYzT˵,rg\w{K.9qرb=Y:}E_Yb>?RRK-m>DN(U׿>϶|^<|?CBM]us(>a=9S/8p) CQq弨=|dQ"Q=+ 0DP/\n{߿?xn~sh!V_}"j_qe(ڊif\mҤI+G"*Ep]vc# /t:3ωxg7|A۷-yՎ"dTzW7zꩧv]ww~wDk֨n~f{̘1wy?;n}gwQ1Uc7}蓩x/E5?y,x|g+FX?-1^zs#`q!h.㱸_ܖn[ZuV ˏ;|;szy3fLhcl9ϧ!5kY?~_mfg},~of}oc ޮ#@ U~w\YD0%xU}%(sE͍@gׯ_|1" llP/5j7()<E _aɓ'+#0D*E{?So1bĈ9眫"k%}WE0[Qᱨ9mфaÆ$U"طo߳ V\J?*ӧOrQ3ϧAD%9?E8&~f[jqikNKr޽ٳg׿{QxnT݋~_K֋"娞AG00Eݖg_"6~M"U?oQO ~>obo{1w"P^Z<|x}4>":c7'y|Dஸj%vn#@ UFkӦ{v^H{_KC9dX'*D՟^7*D( R,G;݊OI"8A]bg%K{OuQ,FZYs=Ky+I-3cD(*FE: V1+o͒>VE4?:!1sVb뭷~`P8cǎݼqTY+T:QYOQͮ?+羢֋jyK:OHtz@O뤲=STi^+FF =sϽ*{9-I%@ U™gymYwqټyD^z~G^ߣG~'x͹,K|kܹC:u7n<=ڧFܻh#p¼φn4/ |>9z@΍3}oiVYen+cO-4{Zkhž`YեK>uui-7t.ge|z@Ε%\8p1r"ڊl- m嗟ջw^1r\P1o(˼W_۴i7k֬͛W'ԩ3/zՉLk߾_~y\:q_3fL\:i@u@ PFE_|š@UԤI{-ZT# iذ\LXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @m6駟2{t=:tN<ӳ}zͫ}?M6ԩӫDX zǒN;k֬4h Yy啓VZ%[mU& 6MPfzϙ1u'LzmKnN:9%yw*tx_lrW^|zq~=$_|qkl?:EJ 8ÒVZiqܨvW' (gϞ< /|w},\0iԨQf%{{$yyyKFpܸqɌ32-|[h^IΝZ+)5jT'ӧOO~̚kV;$_/^?dĈ{w|gɯԭ[7Yc56mdN;Gu.JCM|믿Nj׮4n8Ywuw9~xcǎm~c)S}g\sz w^ر[Uï4dȐymî1k֬z~w 6˲5s]kI&fuXv&.>ezK͛o->߿g# 7ܰtMI߾}3[nc-247dƫ Ó^صg͚y䑙]Q"cرɠA2n5knXhQrQG%J/X 2eJfdC[6h`N._cǎWzoOǸ;vpo=.n[^W̜9^qkw};^zgYXJ~8Jgř:ujݜ9o.;L5kV_|191s=s9'9KS"•z?L*{۷Ono֢ZBTX\Æ |~Q履~Zn=:Y}ՋkAy= +P/"+K=a뭷N&O?׷m6%qEeFAQQe˖c|.J%SNTQFxLu"gCk׮VХ_6WNL5?`ّw6LפIz뭓W\qYV?-{Je]PwO:Q}mn'Ndܹvz+2{|'?ҧO7D=ʂs(a=j(T3gL>LvA͢] -Jt]T* tPNjQ]/Zh;f#HzUm޻曓:+9rd]S.*ecni#, E0q<'3+OIAФI_WswQJ_ꪫ8om)xGKި*¨*XR2Bيav#f/ ͚5{-s%]E]tϹ;S}{o-bވ#v8C_(8/ _ڳgZ3~/Y:ugi[,˄޽{gFq"$U"WVz^ ʴcĉ{Lah[c9fqXobpQ-~X|UJe[?>0aBF9?w}˷v[TxlJ}MeٳԠ^i{6lX2c FQU&gϞ񋏣oď TO9_1.p w}m۶*]БGLIGAgΜY?M?叇Kݻj駟>BX|L~dʔ)]wݕ 曙ѼyLAŮ emKh[[ڵkg*Еfip-g jѢEv>bc_~yҩSL@/[b.֭[ު8Er-<8kMz9kܸEhߩ~nA]ty?믿^'2Fyj-l߾^W^yfisf/yo:uk=15[lEis#a=j(Zui&3LѣGg|_~8ӺfE^JmQ%/F$Q嬠-p !WZk۶m&9s$q\/'#D+w߽L.*|V~r/NT{3aօ &]vM{ŷxɫܰaLI`ٵ~"ah[l-+*V[_K"0X(Iz"pVݓz*sON>än2f]ロymq{+2kfC&u>~'FGva=];cƌ/Ϋ*k:t`ذa;_~e~ev&t-pOX`)ѷod={_{XTtoN>G(O6p?̋bK3E:(Sy/Gn֬Y7|7.yWg}6t 6XV+I^^^f~Ten2Uycn!y7Ϗ0XT ,_,X  &kܸqrg$۷OV^yo uyeEp,' 5ɞ{KVYeFɗ_~i5|M7%}^uULvX5o['&'tRn/\4wevC Ls9gmG{\`5szkFNӦM;8.{᧍5%;iӦOk0{oui7xԶmO?m矯ְaÑv#7dͫ믷o|A:u,ȿ+TXD=#]drO??n<̈"p6mڴ䮻ʌ{/ 3^{yW-J\/k5jT2}gϞE΍ݡWv29Byzkf'>c:Ԫzw_~QxM~Rgyf&FE(J_bת󝶨xfK֪?w]b7'tѺwwWq׮Hu֝}gE`oȑ(8///o%\rw6mzO. P] TA$ \YeE%i0[ A [EŹɓ'Wz <8uKRi;+*u *}U"s̚5kv׮]Q|ׇuvmф )ܴ#JXXj}  ,UϟL4)S [|t%;`Y&,.LXcL;78#@֭[f@e^ ez2a=HLXR&) 9믿Py+¯i O?{YmF AXȩoqƵ.m^Æ }ݟ=@Er[nn*ܳ>o^^´irb'r)2wm}Ͽ2=@ZJ5k֬#|Wַa_)}@J</}[oOǏIݺu禹7H3fv_xpÇ?0}@e*kׯE]tY\.}kժ };+i*P!}] ^z饿.g}v߫Tz@͞=|YT{6z ,pz7f͚W>uI޽{Jc:u̻O֭MiU@-ˏ>`ivA=0hР5.{",jժ`s(KzTQA/E @.˴or! {w^-aÆ}P5?p z7Z_z?P˴ 6wymMݺunc׿N;;ܠATUz@.\;a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HPqsmРTWz2i…y={ӯ_q9ѣ_>}z\t\ݻWIs6m:m]vyz Y?.eS:HPp5ל5`SNnƍzOƴiӚ~^}gԙgy;r.Ủ@8*cWz/T|GQmWZis?lz2g[Ei~7|1N%Z֫WoN_[n9!FF5j>lIX~zr)z95`9tuۧ~{;vKw}hm}N: vHNF @%,[s9&N#/ZͫXq=zt6mڼW;*L˖-'>Co\ pʢEjˊ[lŻ{7//oa;!b?-ƸqZOkO<Ğ+¯ǏduםV uz@Zn=Zkʔ)waWڋ|j'ܣcǎOU> -z@i޼ 6.]WO;uatCn=FM1cj͏J?W 9*0mڴ6x%͝3gNN8T$a= gի7^y7ԩ|J;zB2IXȹ6샲&MԢ2MXȹep¼i @ʄ ez2a=HLXR&) RJzx9 , ez2a=H,c.\\uUmVf͚%7pC馛i~-袋Gy$YhQj֬yɹ瞛\VcƌI>3>,o6(yGK ]pɰa7n893w1Yy3!GE_~In̈ ?%zoZ6m]&[ouꪫf~a&=O{dĉa2{dM5j$cǎM E8^͛''tR[&z&9cƌK~g<&.r%}=$_| $sLұcLx3֞(}3xԭ[gI^:u$ ʄ]wݕYcm-zAt>,cjժ꫙@TAQ,[,v <0H*J ?T Q-*ň9眓kuV:uYsE.F w}5j=:_l_&;SfEp,ϳ;\`fZl?ZnQ.^M4)u]31ǒuQɐ!C2'|r&㏙Y6mZ\`&˘h[8W + OEUB[ ["0U8WXΝ3AhmԮ]\!**M#  Z{3!YMSy\`APY6"WT0޽{'FTKB6=r=!v/b O?i\ZݻwTU ٰ_Qry>,cڷo_ꜨfVPT-+֋ СC?ez6{wm٦L:5?+nYt-(>Qe;+5kV'p 3ׯoyqT{+m֓O>!Ez9+(גYz6"8~e߯6nz)K^z .o3g̙^yn\sr'/_Ĺ*|̞=;>|x=kT>o2Ub8b׌teϕW쩼uZ3ZdѣG_89F|K7a=XLo_||M7%g}vVZuU>}ds9^"v-dZG{믿>9*{Jzsxg2-q;u 0 裏2s5j_ITMz k3j5kmQ,*=裋`jVZC Iog|=P&WXT_hڵܫ -ZH.qMj~2m VT{7+uʼnq$Jq;C&DYӧgemfEŠ+<{̟??24k֬=͙3'y3 dO4l0kO?=sqZk~/p>IX1d c$J$뭷^s6tLնş}YҮ]RСCLx*{Ta*{K2jԨ(ο䤓N7Ȍm2ϡ$b0aBrueF^lP=a}ɴÍi-=ŷu=iӦMZP2&ňСC3!3fdVQnݺeZAj}!֊믿6sdVT9jp3A\{wV7lذ'T={vҸqd-L$o3mcDո8q~n]{gqFfDg}6xqLqʪI&m=u13*RZcVZ2aƊ-z2'?>92~KwYg->˒:uTX˜h{뭷fFYD{7dMRK+a=`sgƯ<ѣ>('jҦMd]vIvm$///[Y+BrgIXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&P>>}zSǏ z7n\f%)9뮻\`i;@ɄeGqɓ׿K/^_|+ʄeR޽{[9ӴiӚ.ZFPԨQcQӦMuidV>~X:ԪUkAY-\0/@eZ`k޼̋&@a^)˼x+-ZLJ{OPkҤ-mN;ɓׯSμTa=J2dQ7>o޼:%/:O0aW^z@QF?]ovUVY凡Cv=!T3<~)]=s~W_wu=Xbz@>:qĖms̩Wj[ӵZ뫧zc֭U>Vo֖Æ ;_qڴiMU[nߚ4iŖ[nV*5Z~gzihԨwq. /<{z@|2k֬c'yrEFN>W]uչ2K{KqƵy_u?Ro2dȐooTFY;v/g~`e=~Ytr_ySnݹg}vߋ/ڵkOkoT] ,U[?rO@nUR^^§~zw}w:_W(-ZTcĈ}gT6xqtOGK/=5;KH?|vڽ=8pɕ+J|D88{?Qwi#F?wܺ_~1bn2%Ti[lŻˊ=PC=y)GOFm4!*cuM6d|xWv({:t5k~#駟kT(.ݻ V[mFǎE`;.G0vѣ_nw @.BBk~ȒV>0aFzyן!+-ZLZ]Wm}]wݩi=gy_~vIڴi=sXV>.O=Th=[lrbϞ=\{gF{uם㽵k|~V@#<_\@h졤U|*Ct2f'xsT|ٰ^xG-KX#Qa4[s嗟N;Au/>[(o̙ {)=VVrʀ\ں~[[n7}݇6yS暳:u4GN;XҜ.좨8Z}Jrg6>GJZ#]Q!1/~N2y.=쳻eᦛn1{+#_@U$T+mk3fXmΜ9"hr-̞=~T|2~Mj׮=?ʕv홂ny뭷\s5ǸqI'+{+rg\qDPu]G{M"-ի7lhmy#*}iW6.wqaާnݺs|vug8*y_(-p6 *"az8Pdxr6mZӂǥ|U{$>=ko{ .m۶movfܸqc ;^( ~7iTOWkH޽{EtŸ+/v8∻n?+۷o?&… O_6#"٠A(]% v/M6{nO6(ԋKa=Z@7|bh!l̊9VJzo;Q,*xZ_m+¯@[of$Z)|m*tM?,<]voǸNR"S^^;EsϽF5-ׯG9~h^.CjyʊπK?Gn^>E3!;%'Ja/^lp:r!âiy UPEKhV[;ZFQDe׎TQ>oFF}'̆BU,*tTXD5>YR-sxEJ"B6?^&MjayG7?Xـh6WԼz>r)’/_rT{Wv 1J:|>x W,#CZ8WPTMv:4RoMx f/  ;ꨣDh_|N:-{~U9-8E!Ѻ>ъ9s'b/j1s{<׸ܬYϪbPLD.(娼*pڀN)=gTiHTȋ*u{mQ]*=meik]]}#tUa~畊ۼy)8юo?&ꫯZ+* (|8w饗^\T'qRQ!O>W|ּۿ&Q 0{^E<6Tz@n^hyլYv/e %GU.\a>"m3 +kIUwYg]ƌ>O1bۣ^ّGyg?KZr7m:rTՊz5.Zy6x"x-n?uR\Q+=?}ZҼ?<.<ܪuJ{`NQ",Ȣ‘6wqq8Qu}<蠃(i]_s5ge#曏]'_Q0o~G}G\"+Bg%FU%Y?#oGnZ5# ø.*p j&a=J:yUW[DTマI\y0K<GG$ ~D+s6l6mڼ޽{jufϞ]С]2փ>x{KnUV;ڵ{;.[lUO> ^l:űW>3*gAy-j%._֮]{~yI|WkmҤ=Fh=@Z*%OE+-eOTJ{[ZEh9{%)%mF[hK9a„"XRLje.]c5*ehX@p>0qĖQ-{|-nv#$8!2,!U{d嗟uꩧ4w5:>kU"paf7W[m!*E57'~D?/T?CKUJ[+1-BeseS"ߖ|I;*Eȳ<ߕiȐ!GExgz!^ro&a=ʈ`F7n\̏gQQ(ZMQTsU#L4f̘Q?_'!QiWySSTҋZI 1chTUoֈ~ 4eE%;{e9^/%YA8Q-#r4D8,Kq䢊XT+<2#W^y1x=# ;ﴍ#tM? GygYgDr" /_/᫨J]ZYO?]/‚o-S"`ڋM|Wxgq^{x.i5߯_iiYꪫ~!l( jZйsbT;v|*:LC"TVQQXV>3gN8>^xᅗz_%jx1~QiG k1*jh[wu85CT̬*BtJ*| )Ftz@0pew}xT J{O@:~Q->`Sr/ }QI3*Fe8Jmu ՕP%ݻWYlA=ޢ})Sz@jAu[T|ڬ V vei3ڲeˉgu5'b-r5kN:<Ӯ_}տ2 9W [{ci`it^#`mczPիWUK^^=zӧOϸPO 2oV9@*X" .̻k0`)SN]qs'JXa5kX ̝;~ePU 2L ̛7/[[`o(<ej?>꫓n-ژzKTe\^^^rfmT{z2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ1cjejH{/a= ~`YmF AXȩs9ofhbN;be *3}=;FY^veH;w~hĈeav!2,=@ZJoll̙S,wug5}@J1a„"x_4)}<'p-SN]mѢŤwy+K [w}w~}uY`CgGo&+Z++|g&Lرc7=zt)S4Lj zFڧ}c*b=ȩgUS>}zݻWkkzsӦM>T%z@i֬g>n]vy.{$G*jժ {*$ׯ_֭[^ WH1s^zܹsz/@֭;7N0jXc59?ShbRUhܸ~m={[r…yPѣ_>}z\ѤI/6phӦ{:t-#5s}=;Fr ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&) @ʄ ez2a=HLXR&)?vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/internals.rst0000644000076500000240000000320414646713253016133 0ustar00twstaff.. include:: global.rst.inc .. _internals: Internals ========= The internals chapter describes and analyses most of the inner workings of Borg. Borg uses a low-level, key-value store, the :ref:`repository`, and implements a more complex data structure on top of it, which is made up of the :ref:`manifest `, :ref:`archives `, :ref:`items ` and data :ref:`chunks`. Each repository can hold multiple :ref:`archives `, which represent individual backups that contain a full archive of the files specified when the backup was performed. Deduplication is performed globally across all data in the repository (multiple backups and even multiple hosts), both on data and file metadata, using :ref:`chunks` created by the chunker using the Buzhash_ algorithm ("buzhash" chunker) or a simpler fixed blocksize algorithm ("fixed" chunker). To perform the repository-wide deduplication, a hash of each chunk is checked against the :ref:`chunks cache `, which is a hash-table of all chunks that already exist. .. figure:: internals/structure.png :figwidth: 100% :width: 100% Layers in Borg. On the very top commands are implemented, using a data access layer provided by the Archive and Item classes. The "key" object provides both compression and authenticated encryption used by the data access layer. The "key" object represents the sole trust boundary in Borg. The lowest layer is the repository, either accessed directly (Repository) or remotely (RemoteRepository). .. toctree:: :caption: Internals contents internals/security internals/data-structures internals/frontends ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/introduction.rst0000644000076500000240000000035014646713253016654 0ustar00twstaffIntroduction ============ .. this shim is here to fix the structure in the PDF rendering. without this stub, the elements in the toctree of index.rst show up a level below the README file included .. include:: ../README.rst ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1721490075.868517 borgbackup-2.0.0b9/docs/man/0000755000076500000240000000000014646755234014163 5ustar00twstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-benchmark-cpu.10000644000076500000240000000266314646713253017715 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-BENCHMARK-CPU" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-benchmark-cpu \- Benchmark CPU bound operations. .SH SYNOPSIS .sp borg [common options] benchmark cpu [options] .SH DESCRIPTION .sp This command benchmarks misc. CPU bound borg operations. .sp It creates input data in memory, runs the operation and then displays throughput. To reduce outside influence on the timings, please make sure to run this with: .INDENT 0.0 .IP \(bu 2 an otherwise as idle as possible machine .IP \(bu 2 enough free memory so there will be no slow down due to paging activity .UNINDENT .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-benchmark-crud.10000644000076500000240000000660014646713253020056 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-BENCHMARK-CRUD" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-benchmark-crud \- Benchmark Create, Read, Update, Delete for archives. .SH SYNOPSIS .sp borg [common options] benchmark crud [options] PATH .SH DESCRIPTION .sp This command benchmarks borg CRUD (create, read, update, delete) operations. .sp It creates input data below the given PATH and backups this data into the given REPO. The REPO must already exist (it could be a fresh empty repo or an existing repo, the command will create / read / update / delete some archives named borg\-benchmark\-crud* there. .sp Make sure you have free space there, you\(aqll need about 1GB each (+ overhead). .sp If your repository is encrypted and borg needs a passphrase to unlock the key, use: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C BORG_PASSPHRASE=mysecret borg benchmark crud REPO PATH .ft P .fi .UNINDENT .UNINDENT .sp Measurements are done with different input file sizes and counts. The file contents are very artificial (either all zero or all random), thus the measurement results do not necessarily reflect performance with real data. Also, due to the kind of content used, no compression is used in these benchmarks. .INDENT 0.0 .TP .B C\- == borg create (1st archive creation, no compression, do not use files cache) C\-Z\- == all\-zero files. full dedup, this is primarily measuring reader/chunker/hasher. C\-R\- == random files. no dedup, measuring throughput through all processing stages. .TP .B R\- == borg extract (extract archive, dry\-run, do everything, but do not write files to disk) R\-Z\- == all zero files. Measuring heavily duplicated files. R\-R\- == random files. No duplication here, measuring throughput through all processing stages, except writing to disk. .TP .B U\- == borg create (2nd archive creation of unchanged input files, measure files cache speed) The throughput value is kind of virtual here, it does not actually read the file. U\-Z\- == needs to check the 2 all\-zero chunks\(aq existence in the repo. U\-R\- == needs to check existence of a lot of different chunks in the repo. .TP .B D\- == borg delete archive (delete last remaining archive, measure deletion + compaction) D\-Z\- == few chunks to delete / few segments to compact/remove. D\-R\- == many chunks to delete / many segments to compact/remove. .UNINDENT .sp Please note that there might be quite some variance in these measurements. Try multiple measurements and having a otherwise idle machine (and network, if you use it). .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B PATH path were to create benchmark input data .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-benchmark.10000644000076500000240000000214314646713253017121 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-BENCHMARK" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-benchmark \- benchmark command .SH SYNOPSIS .nf borg [common options] benchmark crud ... borg [common options] benchmark cpu ... .fi .sp .SH DESCRIPTION .sp These commands do various benchmarks. .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-benchmark\-crud(1)\fP, \fIborg\-benchmark\-cpu(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-break-lock.10000644000076500000240000000237614646713253017211 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-BREAK-LOCK" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-break-lock \- Break the repository lock (e.g. in case it was left by a dead borg. .SH SYNOPSIS .sp borg [common options] break\-lock [options] .SH DESCRIPTION .sp This command breaks the repository and cache locks. Please use carefully and only while no borg process (on any machine) is trying to access the Cache or the Repository. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-change-passphrase.10000644000076500000240000000303314646713253020562 0ustar00twstaff.\" Man page generated from reStructuredText. . .TH BORG-CHANGE-PASSPHRASE 1 "2017-11-25" "" "borg backup tool" .SH NAME borg-change-passphrase \- Change repository key file passphrase . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SH SYNOPSIS .sp borg [common options] change\-passphrase [options] [REPOSITORY] .SH DESCRIPTION .sp The key files used for repository encryption are optionally passphrase protected. This command can be used to change this passphrase. .sp Please note that this command only changes the passphrase, but not any secret protected by it (like e.g. encryption/MAC keys or chunker seed). Thus, changing the passphrase after passphrase and borg key got compromised does not protect future (nor past) backups to the same repository. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .sp REPOSITORY .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-check.10000644000076500000240000002200714646713253016245 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-CHECK" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-check \- Check repository consistency .SH SYNOPSIS .sp borg [common options] check [options] .SH DESCRIPTION .sp The check command verifies the consistency of a repository and its archives. It consists of two major steps: .INDENT 0.0 .IP 1. 3 Checking the consistency of the repository itself. This includes checking the segment magic headers, and both the metadata and data of all objects in the segments. The read data is checked by size and CRC. Bit rot and other types of accidental damage can be detected this way. Running the repository check can be split into multiple partial checks using \fB\-\-max\-duration\fP\&. When checking a remote repository, please note that the checks run on the server and do not cause significant network traffic. .IP 2. 3 Checking consistency and correctness of the archive metadata and optionally archive data (requires \fB\-\-verify\-data\fP). This includes ensuring that the repository manifest exists, the archive metadata chunk is present, and that all chunks referencing files (items) in the archive exist. This requires reading archive and file metadata, but not data. To cryptographically verify the file (content) data integrity pass \fB\-\-verify\-data\fP, but keep in mind that this requires reading all data and is hence very time consuming. When checking archives of a remote repository, archive checks run on the client machine because they require decrypting data and therefore the encryption key. .UNINDENT .sp Both steps can also be run independently. Pass \fB\-\-repository\-only\fP to run the repository checks only, or pass \fB\-\-archives\-only\fP to run the archive checks only. .sp The \fB\-\-max\-duration\fP option can be used to split a long\-running repository check into multiple partial checks. After the given number of seconds the check is interrupted. The next partial check will continue where the previous one stopped, until the full repository has been checked. Assuming a complete check would take 7 hours, then running a daily check with \fB\-\-max\-duration=3600\fP (1 hour) would result in one full repository check per week. Doing a full repository check aborts any previous partial check; the next partial check will restart from the beginning. With partial repository checks you can run neither archive checks, nor enable repair mode. Consequently, if you want to use \fB\-\-max\-duration\fP you must also pass \fB\-\-repository\-only\fP, and must not pass \fB\-\-archives\-only\fP, nor \fB\-\-repair\fP\&. .sp \fBWarning:\fP Please note that partial repository checks (i.e. running it with \fB\-\-max\-duration\fP) can only perform non\-cryptographic checksum checks on the segment files. A full repository check (i.e. without \fB\-\-max\-duration\fP) can also do a repository index check. Enabling partial repository checks excepts archive checks for the same reason. Therefore partial checks may be useful with very large repositories only where a full check would take too long. .sp The \fB\-\-verify\-data\fP option will perform a full integrity verification (as opposed to checking the CRC32 of the segment) of data, which means reading the data from the repository, decrypting and decompressing it. It is a complete cryptographic verification and hence very time consuming, but will detect any accidental and malicious corruption. Tamper\-resistance is only guaranteed for encrypted repositories against attackers without access to the keys. You can not use \fB\-\-verify\-data\fP with \fB\-\-repository\-only\fP\&. .SS About repair mode .sp The check command is a readonly task by default. If any corruption is found, Borg will report the issue and proceed with checking. To actually repair the issues found, pass \fB\-\-repair\fP\&. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 \fB\-\-repair\fP is a \fBPOTENTIALLY DANGEROUS FEATURE\fP and might lead to data loss! This does not just include data that was previously lost anyway, but might include more data for kinds of corruption it is not capable of dealing with. \fBBE VERY CAREFUL!\fP .UNINDENT .UNINDENT .sp Pursuant to the previous warning it is also highly recommended to test the reliability of the hardware running Borg with stress testing software. This especially includes storage and memory testers. Unreliable hardware might lead to additional data loss. .sp It is highly recommended to create a backup of your repository before running in repair mode (i.e. running it with \fB\-\-repair\fP). .sp Repair mode will attempt to fix any corruptions found. Fixing corruptions does not mean recovering lost data: Borg can not magically restore data lost due to e.g. a hardware failure. Repairing a repository means sacrificing some data for the sake of the repository as a whole and the remaining data. Hence it is, by definition, a potentially lossy task. .sp In practice, repair mode hooks into both the repository and archive checks: .INDENT 0.0 .IP 1. 3 When checking the repository\(aqs consistency, repair mode will try to recover as many objects from segments with integrity errors as possible, and ensure that the index is consistent with the data stored in the segments. .IP 2. 3 When checking the consistency and correctness of archives, repair mode might remove whole archives from the manifest if their archive metadata chunk is corrupt or lost. On a chunk level (i.e. the contents of files), repair mode will replace corrupt or lost chunks with a same\-size replacement chunk of zeroes. If a previously zeroed chunk reappears, repair mode will restore this lost chunk using the new chunk. Lastly, repair mode will also delete orphaned chunks (e.g. caused by read errors while creating the archive). .UNINDENT .sp Most steps taken by repair mode have a one\-time effect on the repository, like removing a lost archive from the repository. However, replacing a corrupt or lost chunk with an all\-zero replacement will have an ongoing effect on the repository: When attempting to extract a file referencing an all\-zero chunk, the \fBextract\fP command will distinctly warn about it. The FUSE filesystem created by the \fBmount\fP command will reject reading such a \(dqzero\-patched\(dq file unless a special mount option is given. .sp As mentioned earlier, Borg might be able to \(dqheal\(dq a \(dqzero\-patched\(dq file in repair mode, if all its previously lost chunks reappear (e.g. via a later backup). This is achieved by Borg not only keeping track of the all\-zero replacement chunks, but also by keeping metadata about the lost chunks. In repair mode Borg will check whether a previously lost chunk reappeared and will replace the all\-zero replacement chunk by the reappeared chunk. If all lost chunks of a \(dqzero\-patched\(dq file reappear, this effectively \(dqheals\(dq the file. Consequently, if lost chunks were repaired earlier, it is advised to run \fB\-\-repair\fP a second time after creating some new backups. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS optional arguments .INDENT 0.0 .TP .B \-\-repository\-only only perform repository checks .TP .B \-\-archives\-only only perform archives checks .TP .B \-\-verify\-data perform cryptographic archive data integrity verification (conflicts with \fB\-\-repository\-only\fP) .TP .B \-\-repair attempt to repair any inconsistencies found .TP .BI \-\-max\-duration \ SECONDS do only a partial repo check for max. SECONDS seconds (Default: unlimited) .UNINDENT .SS Archive filters .INDENT 0.0 .TP .BI \-a \ PATTERN\fR,\fB \ \-\-match\-archives \ PATTERN only consider archive names matching the pattern. see \(dqborg help match\-archives\(dq. .TP .BI \-\-sort\-by \ KEYS Comma\-separated list of sorting keys; valid keys are: timestamp, archive, name, id; default is: timestamp .TP .BI \-\-first \ N consider first N archives after other filters were applied .TP .BI \-\-last \ N consider last N archives after other filters were applied .TP .BI \-\-oldest \ TIMESPAN consider archives between the oldest archive\(aqs timestamp and (oldest + TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newest \ TIMESPAN consider archives between the newest archive\(aqs timestamp and (newest \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-older \ TIMESPAN consider archives older than (now \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newer \ TIMESPAN consider archives newer than (now \- TIMESPAN), e.g. 7d or 12m. .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-common.10000644000076500000240000000526214646713253016464 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-COMMON" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-common \- Common options of Borg commands .SH SYNOPSIS .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help show this help message and exit .TP .B \-\-critical work on log level CRITICAL .TP .B \-\-error work on log level ERROR .TP .B \-\-warning work on log level WARNING (default) .TP .B \-\-info\fP,\fB \-v\fP,\fB \-\-verbose work on log level INFO .TP .B \-\-debug enable debug output, work on log level DEBUG .TP .BI \-\-debug\-topic \ TOPIC enable TOPIC debugging (can be specified multiple times). The logger path is borg.debug. if TOPIC is not fully qualified. .TP .B \-p\fP,\fB \-\-progress show progress information .TP .B \-\-iec format using IEC units (1KiB = 1024B) .TP .B \-\-log\-json Output one JSON object per log line instead of formatted text. .TP .BI \-\-lock\-wait \ SECONDS wait at most SECONDS for acquiring a repository/cache lock (default: 1). .TP .B \-\-bypass\-lock Bypass locking mechanism .TP .B \-\-show\-version show/log the borg version .TP .B \-\-show\-rc show/log the return code (rc) .TP .BI \-\-umask \ M set umask to M (local only, default: 0077) .TP .BI \-\-remote\-path \ PATH use PATH as borg executable on the remote (default: \(dqborg\(dq) .TP .BI \-\-upload\-ratelimit \ RATE set network upload rate limit in kiByte/s (default: 0=unlimited) .TP .BI \-\-upload\-buffer \ UPLOAD_BUFFER set network upload buffer size in MiB. (default: 0=no buffer) .TP .BI \-\-debug\-profile \ FILE Write execution profile in Borg format into FILE. For local use a Python\-compatible file can be generated by suffixing FILE with \(dq.pyprof\(dq. .TP .BI \-\-rsh \ RSH Use this command to connect to the \(aqborg serve\(aq process (default: \(aqssh\(aq) .TP .BI \-\-socket \ PATH Use UNIX DOMAIN (IPC) socket at PATH for client/server communication with socket: protocol. .TP .BI \-r \ REPO\fR,\fB \ \-\-repo \ REPO repository to use .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-compact.10000644000076500000240000000422214646713253016615 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-COMPACT" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-compact \- compact segment files in the repository .SH SYNOPSIS .sp borg [common options] compact [options] .SH DESCRIPTION .sp This command frees repository space by compacting segments. .sp Use this regularly to avoid running out of space \- you do not need to use this after each borg command though. It is especially useful after deleting archives, because only compaction will really free repository space. .sp borg compact does not need a key, so it is possible to invoke it from the client or also from the server. .sp Depending on the amount of segments that need compaction, it may take a while, so consider using the \fB\-\-progress\fP option. .sp A segment is compacted if the amount of saved space is above the percentage value given by the \fB\-\-threshold\fP option. If omitted, a threshold of 10% is used. When using \fB\-\-verbose\fP, borg will output an estimate of the freed space. .sp See \fIseparate_compaction\fP in Additional Notes for more details. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS optional arguments .INDENT 0.0 .TP .BI \-\-threshold \ PERCENT set minimum threshold for saved space in PERCENT (Default: 10) .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # compact segments and free repo disk space $ borg compact .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-compression.10000644000076500000240000001117414646713253017534 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-COMPRESSION" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-compression \- Details regarding compression .SH DESCRIPTION .sp It is no problem to mix different compression methods in one repo, deduplication is done on the source data chunks (not on the compressed or encrypted data). .sp If some specific chunk was once compressed and stored into the repo, creating another backup that also uses this chunk will not change the stored chunk. So if you use different compression specs for the backups, whichever stores a chunk first determines its compression. See also borg recreate. .sp Compression is lz4 by default. If you want something else, you have to specify what you want. .sp Valid compression specifiers are: .INDENT 0.0 .TP .B none Do not compress. .TP .B lz4 Use lz4 compression. Very high speed, very low compression. (default) .TP .B zstd[,L] Use zstd (\(dqzstandard\(dq) compression, a modern wide\-range algorithm. If you do not explicitly give the compression level L (ranging from 1 to 22), it will use level 3. .TP .B zlib[,L] Use zlib (\(dqgz\(dq) compression. Medium speed, medium compression. If you do not explicitly give the compression level L (ranging from 0 to 9), it will use level 6. Giving level 0 (means \(dqno compression\(dq, but still has zlib protocol overhead) is usually pointless, you better use \(dqnone\(dq compression. .TP .B lzma[,L] Use lzma (\(dqxz\(dq) compression. Low speed, high compression. If you do not explicitly give the compression level L (ranging from 0 to 9), it will use level 6. Giving levels above 6 is pointless and counterproductive because it does not compress better due to the buffer size used by borg \- but it wastes lots of CPU cycles and RAM. .TP .B auto,C[,L] Use a built\-in heuristic to decide per chunk whether to compress or not. The heuristic tries with lz4 whether the data is compressible. For incompressible data, it will not use compression (uses \(dqnone\(dq). For compressible data, it uses the given C[,L] compression \- with C[,L] being any valid compression specifier. .TP .B obfuscate,SPEC,C[,L] Use compressed\-size obfuscation to make fingerprinting attacks based on the observable stored chunk size more difficult. Note: .INDENT 7.0 .IP \(bu 2 You must combine this with encryption, or it won\(aqt make any sense. .IP \(bu 2 Your repo size will be bigger, of course. .IP \(bu 2 A chunk is limited by the constant \fBMAX_DATA_SIZE\fP (cur. ~20MiB). .UNINDENT .sp The SPEC value determines how the size obfuscation works: .sp \fIRelative random reciprocal size variation\fP (multiplicative) .sp Size will increase by a factor, relative to the compressed data size. Smaller factors are used often, larger factors rarely. .sp Available factors: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 1: 0.01 .. 100 2: 0.1 .. 1,000 3: 1 .. 10,000 4: 10 .. 100,000 5: 100 .. 1,000,000 6: 1,000 .. 10,000,000 .ft P .fi .UNINDENT .UNINDENT .sp Example probabilities for SPEC \fB1\fP: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 90 % 0.01 .. 0.1 9 % 0.1 .. 1 0.9 % 1 .. 10 0.09% 10 .. 100 .ft P .fi .UNINDENT .UNINDENT .sp \fIRandomly sized padding up to the given size\fP (additive) .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C 110: 1kiB (2 ^ (SPEC \- 100)) \&... 120: 1MiB \&... 123: 8MiB (max.) .ft P .fi .UNINDENT .UNINDENT .UNINDENT .sp Examples: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C borg create \-\-compression lz4 REPO::ARCHIVE data borg create \-\-compression zstd REPO::ARCHIVE data borg create \-\-compression zstd,10 REPO::ARCHIVE data borg create \-\-compression zlib REPO::ARCHIVE data borg create \-\-compression zlib,1 REPO::ARCHIVE data borg create \-\-compression auto,lzma,6 REPO::ARCHIVE data borg create \-\-compression auto,lzma ... borg create \-\-compression obfuscate,110,none ... borg create \-\-compression obfuscate,3,auto,zstd,10 ... borg create \-\-compression obfuscate,2,zstd,6 ... .ft P .fi .UNINDENT .UNINDENT .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-config.10000644000076500000240000000517314646713253016442 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-CONFIG" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-config \- get, set, and delete values in a repository or cache config file .SH SYNOPSIS .sp borg [common options] config [options] [NAME] [VALUE] .SH DESCRIPTION .sp This command gets and sets options in a local repository or cache config file. For security reasons, this command only works on local repositories. .sp To delete a config value entirely, use \fB\-\-delete\fP\&. To list the values of the configuration file or the default values, use \fB\-\-list\fP\&. To get an existing key, pass only the key name. To set a key, pass both the key name and the new value. Keys can be specified in the format \(dqsection.name\(dq or simply \(dqname\(dq; the section will default to \(dqrepository\(dq and \(dqcache\(dq for the repo and cache configs, respectively. .sp By default, borg config manipulates the repository config file. Using \fB\-\-cache\fP edits the repository cache\(aqs config file instead. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B NAME name of config key .TP .B VALUE new value for key .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-c\fP,\fB \-\-cache get and set values from the repo cache .TP .B \-d\fP,\fB \-\-delete delete the key from the config file .TP .B \-l\fP,\fB \-\-list list the configuration of the repo .UNINDENT .SH EXAMPLES .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 The repository & cache config files are some of the only directly manipulable parts of a repository that aren\(aqt versioned or backed up, so be careful when making changes! .UNINDENT .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # find cache directory $ cd ~/.cache/borg/$(borg config id) # reserve some space $ borg config additional_free_space 2G # make a repo append\-only $ borg config append_only 1 .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-create.10000644000076500000240000004712214646713253016440 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-CREATE" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-create \- Create new archive .SH SYNOPSIS .sp borg [common options] create [options] NAME [PATH...] .SH DESCRIPTION .sp This command creates a backup archive containing all files found while recursively traversing all paths specified. Paths are added to the archive as they are given, that means if relative paths are desired, the command has to be run from the correct directory. .sp The slashdot hack in paths (recursion roots) is triggered by using \fB/./\fP: \fB/this/gets/stripped/./this/gets/archived\fP means to process that fs object, but strip the prefix on the left side of \fB\&./\fP from the archived items (in this case, \fBthis/gets/archived\fP will be the path in the archived item). .sp When giving \(aq\-\(aq as path, borg will read data from standard input and create a file \(aqstdin\(aq in the created archive from that data. In some cases it\(aqs more appropriate to use \-\-content\-from\-command, however. See section \fIReading from stdin\fP below for details. .sp The archive will consume almost no disk space for files or parts of files that have already been stored in other archives. .sp The archive name needs to be unique. It must not end in \(aq.checkpoint\(aq or \(aq.checkpoint.N\(aq (with N being a number), because these names are used for checkpoints and treated in special ways. .sp In the archive name, you may use the following placeholders: {now}, {utcnow}, {fqdn}, {hostname}, {user} and some others. .sp Backup speed is increased by not reprocessing files that are already part of existing archives and weren\(aqt modified. The detection of unmodified files is done by comparing multiple file metadata values with previous values kept in the files cache. .sp This comparison can operate in different modes as given by \fB\-\-files\-cache\fP: .INDENT 0.0 .IP \(bu 2 ctime,size,inode (default) .IP \(bu 2 mtime,size,inode (default behaviour of borg versions older than 1.1.0rc4) .IP \(bu 2 ctime,size (ignore the inode number) .IP \(bu 2 mtime,size (ignore the inode number) .IP \(bu 2 rechunk,ctime (all files are considered modified \- rechunk, cache ctime) .IP \(bu 2 rechunk,mtime (all files are considered modified \- rechunk, cache mtime) .IP \(bu 2 disabled (disable the files cache, all files considered modified \- rechunk) .UNINDENT .sp inode number: better safety, but often unstable on network filesystems .sp Normally, detecting file modifications will take inode information into consideration to improve the reliability of file change detection. This is problematic for files located on sshfs and similar network file systems which do not provide stable inode numbers, such files will always be considered modified. You can use modes without \fIinode\fP in this case to improve performance, but reliability of change detection might be reduced. .sp ctime vs. mtime: safety vs. speed .INDENT 0.0 .IP \(bu 2 ctime is a rather safe way to detect changes to a file (metadata and contents) as it can not be set from userspace. But, a metadata\-only change will already update the ctime, so there might be some unnecessary chunking/hashing even without content changes. Some filesystems do not support ctime (change time). E.g. doing a chown or chmod to a file will change its ctime. .IP \(bu 2 mtime usually works and only updates if file contents were changed. But mtime can be arbitrarily set from userspace, e.g. to set mtime back to the same value it had before a content change happened. This can be used maliciously as well as well\-meant, but in both cases mtime based cache modes can be problematic. .UNINDENT .sp The mount points of filesystems or filesystem snapshots should be the same for every creation of a new archive to ensure fast operation. This is because the file cache that is used to determine changed files quickly uses absolute filenames. If this is not possible, consider creating a bind mount to a stable location. .sp The \fB\-\-progress\fP option shows (from left to right) Original and (uncompressed) deduplicated size (O and U respectively), then the Number of files (N) processed so far, followed by the currently processed path. .sp When using \fB\-\-stats\fP, you will get some statistics about how much data was added \- the \(dqThis Archive\(dq deduplicated size there is most interesting as that is how much your repository will grow. Please note that the \(dqAll archives\(dq stats refer to the state after creation. Also, the \fB\-\-stats\fP and \fB\-\-dry\-run\fP options are mutually exclusive because the data is not actually compressed and deduplicated during a dry run. .sp For more help on include/exclude patterns, see the \fIborg_patterns\fP command output. .sp For more help on placeholders, see the \fIborg_placeholders\fP command output. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B NAME specify the archive name .TP .B PATH paths to archive .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-n\fP,\fB \-\-dry\-run do not create a backup archive .TP .B \-s\fP,\fB \-\-stats print statistics for the created archive .TP .B \-\-list output verbose list of items (files, dirs, ...) .TP .BI \-\-filter \ STATUSCHARS only display items with the given status characters (see description) .TP .B \-\-json output stats as JSON. Implies \fB\-\-stats\fP\&. .TP .B \-\-no\-cache\-sync experimental: do not synchronize the chunks cache. .TP .B \-\-no\-cache\-sync\-forced experimental: do not synchronize the chunks cache (forced). .TP .B \-\-prefer\-adhoc\-cache experimental: prefer AdHocCache (w/o files cache) over AdHocWithFilesCache (with files cache). .TP .BI \-\-stdin\-name \ NAME use NAME in archive for stdin data (default: \(aqstdin\(aq) .TP .BI \-\-stdin\-user \ USER set user USER in archive for stdin data (default: do not store user/uid) .TP .BI \-\-stdin\-group \ GROUP set group GROUP in archive for stdin data (default: do not store group/gid) .TP .BI \-\-stdin\-mode \ M set mode to M in archive for stdin data (default: 0660) .TP .B \-\-content\-from\-command interpret PATH as command and store its stdout. See also section Reading from stdin below. .TP .B \-\-paths\-from\-stdin read DELIM\-separated list of paths to back up from stdin. All control is external: it will back up all files given \- no more, no less. .TP .B \-\-paths\-from\-command interpret PATH as command and treat its output as \fB\-\-paths\-from\-stdin\fP .TP .BI \-\-paths\-delimiter \ DELIM set path delimiter for \fB\-\-paths\-from\-stdin\fP and \fB\-\-paths\-from\-command\fP (default: \fB\en\fP) .UNINDENT .SS Include/Exclude options .INDENT 0.0 .TP .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN exclude paths matching PATTERN .TP .BI \-\-exclude\-from \ EXCLUDEFILE read exclude patterns from EXCLUDEFILE, one per line .TP .BI \-\-pattern \ PATTERN include/exclude paths matching PATTERN .TP .BI \-\-patterns\-from \ PATTERNFILE read include/exclude patterns from PATTERNFILE, one per line .TP .B \-\-exclude\-caches exclude directories that contain a CACHEDIR.TAG file (\fI\%http://www.bford.info/cachedir/spec.html\fP) .TP .BI \-\-exclude\-if\-present \ NAME exclude directories that are tagged by containing a filesystem object with the given NAME .TP .B \-\-keep\-exclude\-tags if tag objects are specified with \fB\-\-exclude\-if\-present\fP, don\(aqt omit the tag objects themselves from the backup archive .TP .B \-\-exclude\-nodump exclude files flagged NODUMP .UNINDENT .SS Filesystem options .INDENT 0.0 .TP .B \-x\fP,\fB \-\-one\-file\-system stay in the same file system and do not store mount points of other file systems \- this might behave different from your expectations, see the description below. .TP .B \-\-numeric\-ids only store numeric user and group identifiers .TP .B \-\-atime do store atime into archive .TP .B \-\-noctime do not store ctime into archive .TP .B \-\-nobirthtime do not store birthtime (creation date) into archive .TP .B \-\-noflags do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive .TP .B \-\-noacls do not read and store ACLs into archive .TP .B \-\-noxattrs do not read and store xattrs into archive .TP .B \-\-sparse detect sparse holes in input (supported only by fixed chunker) .TP .BI \-\-files\-cache \ MODE operate files cache in MODE. default: ctime,size,inode .TP .B \-\-read\-special open and read block and char device files as well as FIFOs as if they were regular files. Also follows symlinks pointing to these kinds of files. .UNINDENT .SS Archive options .INDENT 0.0 .TP .BI \-\-comment \ COMMENT add a comment text to the archive .TP .BI \-\-timestamp \ TIMESTAMP manually specify the archive creation date/time (yyyy\-mm\-ddThh:mm:ss[(+|\-)HH:MM] format, (+|\-)HH:MM is the UTC offset, default: local time zone). Alternatively, give a reference file/directory. .TP .BI \-c \ SECONDS\fR,\fB \ \-\-checkpoint\-interval \ SECONDS write checkpoint every SECONDS seconds (Default: 1800) .TP .BI \-\-checkpoint\-volume \ BYTES write checkpoint every BYTES bytes (Default: 0, meaning no volume based checkpointing) .TP .BI \-\-chunker\-params \ PARAMS specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, HASH_MASK_BITS, HASH_WINDOW_SIZE). default: buzhash,19,23,21,4095 .TP .BI \-C \ COMPRESSION\fR,\fB \ \-\-compression \ COMPRESSION select compression algorithm, see the output of the \(dqborg help compression\(dq command for details. .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Backup ~/Documents into an archive named \(dqmy\-documents\(dq $ borg create my\-documents ~/Documents # same, but list all files as we process them $ borg create \-\-list my\-documents ~/Documents # Backup /mnt/disk/docs, but strip path prefix using the slashdot hack $ borg create /path/to/repo::docs /mnt/disk/./docs # Backup ~/Documents and ~/src but exclude pyc files $ borg create my\-files \e ~/Documents \e ~/src \e \-\-exclude \(aq*.pyc\(aq # Backup home directories excluding image thumbnails (i.e. only # /home//.thumbnails is excluded, not /home/*/*/.thumbnails etc.) $ borg create my\-files /home \-\-exclude \(aqsh:home/*/.thumbnails\(aq # Backup the root filesystem into an archive named \(dqroot\-YYYY\-MM\-DD\(dq # use zlib compression (good, but slow) \- default is lz4 (fast, low compression ratio) $ borg create \-C zlib,6 \-\-one\-file\-system root\-{now:%Y\-%m\-%d} / # Backup into an archive name like FQDN\-root\-TIMESTAMP $ borg create \(aq{fqdn}\-root\-{now}\(aq / # Backup a remote host locally (\(dqpull\(dq style) using sshfs $ mkdir sshfs\-mount $ sshfs root@example.com:/ sshfs\-mount $ cd sshfs\-mount $ borg create example.com\-root\-{now:%Y\-%m\-%d} . $ cd .. $ fusermount \-u sshfs\-mount # Make a big effort in fine granular deduplication (big chunk management # overhead, needs a lot of RAM and disk space, see formula in internals docs): $ borg create \-\-chunker\-params buzhash,10,23,16,4095 small /smallstuff # Backup a raw device (must not be active/in use/mounted at that time) $ borg create \-\-read\-special \-\-chunker\-params fixed,4194304 my\-sdx /dev/sdX # Backup a sparse disk image (must not be active/in use/mounted at that time) $ borg create \-\-sparse \-\-chunker\-params fixed,4194304 my\-disk my\-disk.raw # No compression (none) $ borg create \-\-compression none arch ~ # Super fast, low compression (lz4, default) $ borg create arch ~ # Less fast, higher compression (zlib, N = 0..9) $ borg create \-\-compression zlib,N arch ~ # Even slower, even higher compression (lzma, N = 0..9) $ borg create \-\-compression lzma,N arch ~ # Only compress compressible data with lzma,N (N = 0..9) $ borg create \-\-compression auto,lzma,N arch ~ # Use short hostname, user name and current time in archive name $ borg create \(aq{hostname}\-{user}\-{now}\(aq ~ # Similar, use the same datetime format that is default as of borg 1.1 $ borg create \(aq{hostname}\-{user}\-{now:%Y\-%m\-%dT%H:%M:%S}\(aq ~ # As above, but add nanoseconds $ borg create \(aq{hostname}\-{user}\-{now:%Y\-%m\-%dT%H:%M:%S.%f}\(aq ~ # Backing up relative paths by moving into the correct directory first $ cd /home/user/Documents # The root directory of the archive will be \(dqprojectA\(dq $ borg create \(aqdaily\-projectA\-{now:%Y\-%m\-%d}\(aq projectA # Use external command to determine files to archive # Use \-\-paths\-from\-stdin with find to back up only files less than 1MB in size $ find ~ \-size \-1000k | borg create \-\-paths\-from\-stdin small\-files\-only # Use \-\-paths\-from\-command with find to back up files from only a given user $ borg create \-\-paths\-from\-command joes\-files \-\- find /srv/samba/shared \-user joe # Use \-\-paths\-from\-stdin with \-\-paths\-delimiter (for example, for filenames with newlines in them) $ find ~ \-size \-1000k \-print0 | borg create \e \-\-paths\-from\-stdin \e \-\-paths\-delimiter \(dq\e0\(dq \e smallfiles\-handle\-newline .ft P .fi .UNINDENT .UNINDENT .SH NOTES .sp The \fB\-\-exclude\fP patterns are not like tar. In tar \fB\-\-exclude\fP .bundler/gems will exclude foo/.bundler/gems. In borg it will not, you need to use \fB\-\-exclude\fP \(aq*/.bundler/gems\(aq to get the same effect. .sp In addition to using \fB\-\-exclude\fP patterns, it is possible to use \fB\-\-exclude\-if\-present\fP to specify the name of a filesystem object (e.g. a file or folder name) which, when contained within another folder, will prevent the containing folder from being backed up. By default, the containing folder and all of its contents will be omitted from the backup. If, however, you wish to only include the objects specified by \fB\-\-exclude\-if\-present\fP in your backup, and not include any other contents of the containing folder, this can be enabled through using the \fB\-\-keep\-exclude\-tags\fP option. .sp The \fB\-x\fP or \fB\-\-one\-file\-system\fP option excludes directories, that are mountpoints (and everything in them). It detects mountpoints by comparing the device number from the output of \fBstat()\fP of the directory and its parent directory. Specifically, it excludes directories for which \fBstat()\fP reports a device number different from the device number of their parent. In general: be aware that there are directories with device number different from their parent, which the kernel does not consider a mountpoint and also the other way around. Linux examples for this are bind mounts (possibly same device number, but always a mountpoint) and ALL subvolumes of a btrfs (different device number from parent but not necessarily a mountpoint). macOS examples are the apfs mounts of a typical macOS installation. Therefore, when using \fB\-\-one\-file\-system\fP, you should double\-check that the backup works as intended. .SS Item flags .sp \fB\-\-list\fP outputs a list of all files, directories and other file system items it considered (no matter whether they had content changes or not). For each item, it prefixes a single\-letter flag that indicates type and/or status of the item. .sp If you are interested only in a subset of that output, you can give e.g. \fB\-\-filter=AME\fP and it will only show regular files with A, M or E status (see below). .sp A uppercase character represents the status of a regular file relative to the \(dqfiles\(dq cache (not relative to the repo \-\- this is an issue if the files cache is not used). Metadata is stored in any case and for \(aqA\(aq and \(aqM\(aq also new data chunks are stored. For \(aqU\(aq all data chunks refer to already existing chunks. .INDENT 0.0 .IP \(bu 2 \(aqA\(aq = regular file, added (see also \fIa_status_oddity\fP in the FAQ) .IP \(bu 2 \(aqM\(aq = regular file, modified .IP \(bu 2 \(aqU\(aq = regular file, unchanged .IP \(bu 2 \(aqC\(aq = regular file, it changed while we backed it up .IP \(bu 2 \(aqE\(aq = regular file, an error happened while accessing/reading \fIthis\fP file .UNINDENT .sp A lowercase character means a file type other than a regular file, borg usually just stores their metadata: .INDENT 0.0 .IP \(bu 2 \(aqd\(aq = directory .IP \(bu 2 \(aqb\(aq = block device .IP \(bu 2 \(aqc\(aq = char device .IP \(bu 2 \(aqh\(aq = regular file, hardlink (to already seen inodes) .IP \(bu 2 \(aqs\(aq = symlink .IP \(bu 2 \(aqf\(aq = fifo .UNINDENT .sp Other flags used include: .INDENT 0.0 .IP \(bu 2 \(aq+\(aq = included, item would be backed up (if not in dry\-run mode) .IP \(bu 2 \(aq\-\(aq = excluded, item would not be / was not backed up .IP \(bu 2 \(aqi\(aq = backup data was read from standard input (stdin) .IP \(bu 2 \(aq?\(aq = missing status code (if you see this, please file a bug report!) .UNINDENT .SS Reading backup data from stdin .sp There are two methods to read from stdin. Either specify \fB\-\fP as path and pipe directly to borg: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C backup\-vm \-\-id myvm \-\-stdout | borg create REPO::ARCHIVE \- .ft P .fi .UNINDENT .UNINDENT .sp Or use \fB\-\-content\-from\-command\fP to have Borg manage the execution of the command and piping. If you do so, the first PATH argument is interpreted as command to execute and any further arguments are treated as arguments to the command: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C borg create \-\-content\-from\-command REPO::ARCHIVE \-\- backup\-vm \-\-id myvm \-\-stdout .ft P .fi .UNINDENT .UNINDENT .sp \fB\-\-\fP is used to ensure \fB\-\-id\fP and \fB\-\-stdout\fP are \fBnot\fP considered arguments to \fBborg\fP but rather \fBbackup\-vm\fP\&. .sp The difference between the two approaches is that piping to borg creates an archive even if the command piping to borg exits with a failure. In this case, \fBone can end up with truncated output being backed up\fP\&. Using \fB\-\-content\-from\-command\fP, in contrast, borg is guaranteed to fail without creating an archive should the command fail. The command is considered failed when it returned a non\-zero exit code. .sp Reading from stdin yields just a stream of data without file metadata associated with it, and the files cache is not needed at all. So it is safe to disable it via \fB\-\-files\-cache disabled\fP and speed up backup creation a bit. .sp By default, the content read from stdin is stored in a file called \(aqstdin\(aq. Use \fB\-\-stdin\-name\fP to change the name. .SS Feeding all file paths from externally .sp Usually, you give a starting path (recursion root) to borg and then borg automatically recurses, finds and backs up all fs objects contained in there (optionally considering include/exclude rules). .sp If you need more control and you want to give every single fs object path to borg (maybe implementing your own recursion or your own rules), you can use \fB\-\-paths\-from\-stdin\fP or \fB\-\-paths\-from\-command\fP (with the latter, borg will fail to create an archive should the command fail). .sp Borg supports paths with the slashdot hack to strip path prefixes here also. So, be careful not to unintentionally trigger that. .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-delete(1)\fP, \fIborg\-prune(1)\fP, \fIborg\-check(1)\fP, \fIborg\-patterns(1)\fP, \fIborg\-placeholders(1)\fP, \fIborg\-compression(1)\fP, \fIborg\-rcreate(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-delete.10000644000076500000240000000756314646713253016444 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-DELETE" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-delete \- Delete archives .SH SYNOPSIS .sp borg [common options] delete [options] .SH DESCRIPTION .sp This command deletes archives from the repository. .sp Important: When deleting archives, repository disk space is \fBnot\fP freed until you run \fBborg compact\fP\&. .sp When in doubt, use \fB\-\-dry\-run \-\-list\fP to see what would be deleted. .sp When using \fB\-\-stats\fP, you will get some statistics about how much data was deleted \- the \(dqDeleted data\(dq deduplicated size there is most interesting as that is how much your repository will shrink. Please note that the \(dqAll archives\(dq stats refer to the state after deletion. .sp You can delete multiple archives by specifying a matching pattern, using the \fB\-\-match\-archives PATTERN\fP option (for more info on these patterns, see \fIborg_patterns\fP). .sp Always first use \fB\-\-dry\-run \-\-list\fP to see what would be deleted. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS optional arguments .INDENT 0.0 .TP .B \-n\fP,\fB \-\-dry\-run do not change repository .TP .B \-\-list output verbose list of archives .TP .B \-\-consider\-checkpoints consider checkpoint archives for deletion (default: not considered). .TP .B \-s\fP,\fB \-\-stats print statistics for the deleted archive .TP .B \-\-force force deletion of corrupted archives, use \fB\-\-force \-\-force\fP in case \fB\-\-force\fP does not work. .TP .BI \-c \ SECONDS\fR,\fB \ \-\-checkpoint\-interval \ SECONDS write checkpoint every SECONDS seconds (Default: 1800) .UNINDENT .SS Archive filters .INDENT 0.0 .TP .BI \-a \ PATTERN\fR,\fB \ \-\-match\-archives \ PATTERN only consider archive names matching the pattern. see \(dqborg help match\-archives\(dq. .TP .BI \-\-sort\-by \ KEYS Comma\-separated list of sorting keys; valid keys are: timestamp, archive, name, id; default is: timestamp .TP .BI \-\-first \ N consider first N archives after other filters were applied .TP .BI \-\-last \ N consider last N archives after other filters were applied .TP .BI \-\-oldest \ TIMESPAN consider archives between the oldest archive\(aqs timestamp and (oldest + TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newest \ TIMESPAN consider archives between the newest archive\(aqs timestamp and (newest \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-older \ TIMESPAN consider archives older than (now \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newer \ TIMESPAN consider archives newer than (now \- TIMESPAN), e.g. 7d or 12m. .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # delete a single backup archive: $ borg delete \-a Monday # actually free disk space: $ borg compact # delete all archives whose names begin with the machine\(aqs hostname followed by \(dq\-\(dq $ borg delete \-a \(aqsh:{hostname}\-*\(aq # delete all archives whose names contain \(dq\-2012\-\(dq $ borg delete \-a \(aqsh:*\-2012\-*\(aq # see what would be deleted if delete was run without \-\-dry\-run $ borg delete \-\-list \-\-dry\-run \-a \(aqsh:*\-May\-*\(aq .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-compact(1)\fP, \fIborg\-rdelete(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-diff.10000644000076500000240000001147214646713253016104 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-DIFF" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-diff \- Diff contents of two archives .SH SYNOPSIS .sp borg [common options] diff [options] ARCHIVE1 ARCHIVE2 [PATH...] .SH DESCRIPTION .sp This command finds differences (file contents, metadata) between ARCHIVE1 and ARCHIVE2. .sp For more help on include/exclude patterns, see the \fIborg_patterns\fP command output. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B ARCHIVE1 ARCHIVE1 name .TP .B ARCHIVE2 ARCHIVE2 name .TP .B PATH paths of items inside the archives to compare; patterns are supported .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-numeric\-ids only consider numeric user and group identifiers .TP .B \-\-same\-chunker\-params Override check of chunker parameters. .TP .B \-\-sort Sort the output lines by file path. .TP .BI \-\-format \ FORMAT specify format for differences between archives (default: \(dq{change} {path}{NL}\(dq) .TP .B \-\-json\-lines Format output as JSON Lines. .TP .B \-\-content\-only Only compare differences in content (exclude metadata differences) .UNINDENT .SS Include/Exclude options .INDENT 0.0 .TP .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN exclude paths matching PATTERN .TP .BI \-\-exclude\-from \ EXCLUDEFILE read exclude patterns from EXCLUDEFILE, one per line .TP .BI \-\-pattern \ PATTERN include/exclude paths matching PATTERN .TP .BI \-\-patterns\-from \ PATTERNFILE read include/exclude patterns from PATTERNFILE, one per line .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ borg diff archive1 archive2 +17 B \-5 B [\-rw\-r\-\-r\-\- \-> \-rwxr\-xr\-x] file1 +135 B \-252 B file2 added 0 B file4 removed 0 B file3 $ borg diff archive1 archive2 {\(dqpath\(dq: \(dqfile1\(dq, \(dqchanges\(dq: [{\(dqtype\(dq: \(dqmodified\(dq, \(dqadded\(dq: 17, \(dqremoved\(dq: 5}, {\(dqtype\(dq: \(dqmode\(dq, \(dqold_mode\(dq: \(dq\-rw\-r\-\-r\-\-\(dq, \(dqnew_mode\(dq: \(dq\-rwxr\-xr\-x\(dq}]} {\(dqpath\(dq: \(dqfile2\(dq, \(dqchanges\(dq: [{\(dqtype\(dq: \(dqmodified\(dq, \(dqadded\(dq: 135, \(dqremoved\(dq: 252}]} {\(dqpath\(dq: \(dqfile4\(dq, \(dqchanges\(dq: [{\(dqtype\(dq: \(dqadded\(dq, \(dqsize\(dq: 0}]} {\(dqpath\(dq: \(dqfile3\(dq, \(dqchanges\(dq: [{\(dqtype\(dq: \(dqremoved\(dq, \(dqsize\(dq: 0}]} .ft P .fi .UNINDENT .UNINDENT .SH NOTES .SS The FORMAT specifier syntax .sp The \fB\-\-format\fP option uses python\(aqs \fI\%format string syntax\fP\&. .sp Examples: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ borg diff \-\-format \(aq{content:30} {path}{NL}\(aq ArchiveFoo ArchiveBar modified: +4.1 kB \-1.0 kB file\-diff \&... # {VAR:NUMBER} \- pad to NUMBER columns right\-aligned. $ borg diff \-\-format \(aq{content:>30} {path}{NL}\(aq ArchiveFoo ArchiveBar modified: +4.1 kB \-1.0 kB file\-diff \&... .ft P .fi .UNINDENT .UNINDENT .sp The following keys are always available: .INDENT 0.0 .IP \(bu 2 NEWLINE: OS dependent line separator .IP \(bu 2 NL: alias of NEWLINE .IP \(bu 2 NUL: NUL character for creating print0 / xargs \-0 like output .IP \(bu 2 SPACE: space character .IP \(bu 2 TAB: tab character .IP \(bu 2 CR: carriage return character .IP \(bu 2 LF: line feed character .UNINDENT .sp Keys available only when showing differences between archives: .INDENT 0.0 .IP \(bu 2 path: archived file path .IP \(bu 2 change: all available changes .IP \(bu 2 content: file content change .IP \(bu 2 mode: file mode change .IP \(bu 2 type: file type change .IP \(bu 2 owner: file owner (user/group) change .IP \(bu 2 group: file group change .IP \(bu 2 user: file user change .IP \(bu 2 link: file link change .IP \(bu 2 directory: file directory change .IP \(bu 2 blkdev: file block device change .IP \(bu 2 chrdev: file character device change .IP \(bu 2 fifo: file fifo change .IP \(bu 2 mtime: file modification time change .IP \(bu 2 ctime: file change time change .IP \(bu 2 isomtime: file modification time change (ISO 8601) .IP \(bu 2 isoctime: file creation time change (ISO 8601) .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-export-tar.10000644000076500000240000000721714646713253017303 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-EXPORT-TAR" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-export-tar \- Export archive contents as a tarball .SH SYNOPSIS .sp borg [common options] export\-tar [options] NAME FILE [PATH...] .SH DESCRIPTION .sp This command creates a tarball from an archive. .sp When giving \(aq\-\(aq as the output FILE, Borg will write a tar stream to standard output. .sp By default (\fB\-\-tar\-filter=auto\fP) Borg will detect whether the FILE should be compressed based on its file extension and pipe the tarball through an appropriate filter before writing it to FILE: .INDENT 0.0 .IP \(bu 2 \&.tar.gz or .tgz: gzip .IP \(bu 2 \&.tar.bz2 or .tbz: bzip2 .IP \(bu 2 \&.tar.xz or .txz: xz .IP \(bu 2 \&.tar.zstd or .tar.zst: zstd .IP \(bu 2 \&.tar.lz4: lz4 .UNINDENT .sp Alternatively, a \fB\-\-tar\-filter\fP program may be explicitly specified. It should read the uncompressed tar stream from stdin and write a compressed/filtered tar stream to stdout. .sp Depending on the \fB\-tar\-format\fP option, these formats are created: .TS center; |l|l|l|. _ T{ \-\-tar\-format T} T{ Specification T} T{ Metadata T} _ T{ BORG T} T{ BORG specific, like PAX T} T{ all as supported by borg T} _ T{ PAX T} T{ POSIX.1\-2001 (pax) format T} T{ GNU + atime/ctime/mtime ns T} _ T{ GNU T} T{ GNU tar format T} T{ mtime s, no atime/ctime, no ACLs/xattrs/bsdflags T} _ .TE .sp A \fB\-\-sparse\fP option (as found in borg extract) is not supported. .sp By default the entire archive is extracted but a subset of files and directories can be selected by passing a list of \fBPATHs\fP as arguments. The file selection can further be restricted by using the \fB\-\-exclude\fP option. .sp For more help on include/exclude patterns, see the \fIborg_patterns\fP command output. .sp \fB\-\-progress\fP can be slower than no progress display, since it makes one additional pass over the archive metadata. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B NAME specify the archive name .TP .B FILE output tar file. \(dq\-\(dq to write to stdout instead. .TP .B PATH paths to extract; patterns are supported .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-tar\-filter filter program to pipe data through .TP .B \-\-list output verbose list of items (files, dirs, ...) .TP .BI \-\-tar\-format \ FMT select tar format: BORG, PAX or GNU .UNINDENT .SS Include/Exclude options .INDENT 0.0 .TP .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN exclude paths matching PATTERN .TP .BI \-\-exclude\-from \ EXCLUDEFILE read exclude patterns from EXCLUDEFILE, one per line .TP .BI \-\-pattern \ PATTERN include/exclude paths matching PATTERN .TP .BI \-\-patterns\-from \ PATTERNFILE read include/exclude patterns from PATTERNFILE, one per line .TP .BI \-\-strip\-components \ NUMBER Remove the specified number of leading path elements. Paths with fewer elements will be silently skipped. .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-extract.10000644000076500000240000001014414646713253016641 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-EXTRACT" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-extract \- Extract archive contents .SH SYNOPSIS .sp borg [common options] extract [options] NAME [PATH...] .SH DESCRIPTION .sp This command extracts the contents of an archive. By default the entire archive is extracted but a subset of files and directories can be selected by passing a list of \fBPATHs\fP as arguments. The file selection can further be restricted by using the \fB\-\-exclude\fP option. .sp For more help on include/exclude patterns, see the \fIborg_patterns\fP command output. .sp By using \fB\-\-dry\-run\fP, you can do all extraction steps except actually writing the output data: reading metadata and data chunks from the repo, checking the hash/hmac, decrypting, decompressing. .sp \fB\-\-progress\fP can be slower than no progress display, since it makes one additional pass over the archive metadata. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 Currently, extract always writes into the current working directory (\(dq.\(dq), so make sure you \fBcd\fP to the right place before calling \fBborg extract\fP\&. .sp When parent directories are not extracted (because of using file/directory selection or any other reason), borg can not restore parent directories\(aq metadata, e.g. owner, group, permission, etc. .UNINDENT .UNINDENT .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B NAME specify the archive name .TP .B PATH paths to extract; patterns are supported .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-list output verbose list of items (files, dirs, ...) .TP .B \-n\fP,\fB \-\-dry\-run do not actually change any files .TP .B \-\-numeric\-ids only obey numeric user and group identifiers .TP .B \-\-noflags do not extract/set flags (e.g. NODUMP, IMMUTABLE) .TP .B \-\-noacls do not extract/set ACLs .TP .B \-\-noxattrs do not extract/set xattrs .TP .B \-\-stdout write all extracted data to stdout .TP .B \-\-sparse create holes in output sparse file from all\-zero chunks .TP .B \-\-continue continue a previously interrupted extraction of same archive .UNINDENT .SS Include/Exclude options .INDENT 0.0 .TP .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN exclude paths matching PATTERN .TP .BI \-\-exclude\-from \ EXCLUDEFILE read exclude patterns from EXCLUDEFILE, one per line .TP .BI \-\-pattern \ PATTERN include/exclude paths matching PATTERN .TP .BI \-\-patterns\-from \ PATTERNFILE read include/exclude patterns from PATTERNFILE, one per line .TP .BI \-\-strip\-components \ NUMBER Remove the specified number of leading path elements. Paths with fewer elements will be silently skipped. .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Extract entire archive $ borg extract my\-files # Extract entire archive and list files while processing $ borg extract \-\-list my\-files # Verify whether an archive could be successfully extracted, but do not write files to disk $ borg extract \-\-dry\-run my\-files # Extract the \(dqsrc\(dq directory $ borg extract my\-files home/USERNAME/src # Extract the \(dqsrc\(dq directory but exclude object files $ borg extract my\-files home/USERNAME/src \-\-exclude \(aq*.o\(aq # Restore a raw device (must not be active/in use/mounted at that time) $ borg extract \-\-stdout my\-sdx | dd of=/dev/sdx bs=10M .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-mount(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-import-tar.10000644000076500000240000001342114646713253017266 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-IMPORT-TAR" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-import-tar \- Create a backup archive from a tarball .SH SYNOPSIS .sp borg [common options] import\-tar [options] NAME TARFILE .SH DESCRIPTION .sp This command creates a backup archive from a tarball. .sp When giving \(aq\-\(aq as path, Borg will read a tar stream from standard input. .sp By default (\-\-tar\-filter=auto) Borg will detect whether the file is compressed based on its file extension and pipe the file through an appropriate filter: .INDENT 0.0 .IP \(bu 2 \&.tar.gz or .tgz: gzip \-d .IP \(bu 2 \&.tar.bz2 or .tbz: bzip2 \-d .IP \(bu 2 \&.tar.xz or .txz: xz \-d .IP \(bu 2 \&.tar.zstd or .tar.zst: zstd \-d .IP \(bu 2 \&.tar.lz4: lz4 \-d .UNINDENT .sp Alternatively, a \-\-tar\-filter program may be explicitly specified. It should read compressed data from stdin and output an uncompressed tar stream on stdout. .sp Most documentation of borg create applies. Note that this command does not support excluding files. .sp A \fB\-\-sparse\fP option (as found in borg create) is not supported. .sp About tar formats and metadata conservation or loss, please see \fBborg export\-tar\fP\&. .sp import\-tar reads these tar formats: .INDENT 0.0 .IP \(bu 2 BORG: borg specific (PAX\-based) .IP \(bu 2 PAX: POSIX.1\-2001 .IP \(bu 2 GNU: GNU tar .IP \(bu 2 POSIX.1\-1988 (ustar) .IP \(bu 2 UNIX V7 tar .IP \(bu 2 SunOS tar with extended attributes .UNINDENT .sp To import multiple tarballs into a single archive, they can be simply concatenated (e.g. using \(dqcat\(dq) into a single file, and imported with an \fB\-\-ignore\-zeros\fP option to skip through the stop markers between them. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B NAME specify the archive name .TP .B TARFILE input tar file. \(dq\-\(dq to read from stdin instead. .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-tar\-filter filter program to pipe data through .TP .B \-s\fP,\fB \-\-stats print statistics for the created archive .TP .B \-\-list output verbose list of items (files, dirs, ...) .TP .BI \-\-filter \ STATUSCHARS only display items with the given status characters .TP .B \-\-json output stats as JSON (implies \-\-stats) .TP .B \-\-ignore\-zeros ignore zero\-filled blocks in the input tarball .UNINDENT .SS Archive options .INDENT 0.0 .TP .BI \-\-comment \ COMMENT add a comment text to the archive .TP .BI \-\-timestamp \ TIMESTAMP manually specify the archive creation date/time (yyyy\-mm\-ddThh:mm:ss[(+|\-)HH:MM] format, (+|\-)HH:MM is the UTC offset, default: local time zone). Alternatively, give a reference file/directory. .TP .BI \-c \ SECONDS\fR,\fB \ \-\-checkpoint\-interval \ SECONDS write checkpoint every SECONDS seconds (Default: 1800) .TP .BI \-\-checkpoint\-volume \ BYTES write checkpoint every BYTES bytes (Default: 0, meaning no volume based checkpointing) .TP .BI \-\-chunker\-params \ PARAMS specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, HASH_MASK_BITS, HASH_WINDOW_SIZE). default: buzhash,19,23,21,4095 .TP .BI \-C \ COMPRESSION\fR,\fB \ \-\-compression \ COMPRESSION select compression algorithm, see the output of the \(dqborg help compression\(dq command for details. .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # export as uncompressed tar $ borg export\-tar Monday Monday.tar # import an uncompressed tar $ borg import\-tar Monday Monday.tar # exclude some file types, compress using gzip $ borg export\-tar Monday Monday.tar.gz \-\-exclude \(aq*.so\(aq # use higher compression level with gzip $ borg export\-tar \-\-tar\-filter=\(dqgzip \-9\(dq Monday Monday.tar.gz # copy an archive from repoA to repoB $ borg \-r repoA export\-tar \-\-tar\-format=BORG archive \- | borg \-r repoB import\-tar archive \- # export a tar, but instead of storing it on disk, upload it to remote site using curl $ borg export\-tar Monday \- | curl \-\-data\-binary @\- https://somewhere/to/POST # remote extraction via \(dqtarpipe\(dq $ borg export\-tar Monday \- | ssh somewhere \(dqcd extracted; tar x\(dq .ft P .fi .UNINDENT .UNINDENT .SS Archives transfer script .sp Outputs a script that copies all archives from repo1 to repo2: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C for A T in \(gaborg list \-\-format=\(aq{archive} {time:%Y\-%m\-%dT%H:%M:%S}{NL}\(aq\(ga do echo \(dqborg \-r repo1 export\-tar \-\-tar\-format=BORG $A \- | borg \-r repo2 import\-tar \-\-timestamp=$T $A \-\(dq done .ft P .fi .UNINDENT .UNINDENT .sp Kept: .INDENT 0.0 .IP \(bu 2 archive name, archive timestamp .IP \(bu 2 archive contents (all items with metadata and data) .UNINDENT .sp Lost: .INDENT 0.0 .IP \(bu 2 some archive metadata (like the original commandline, execution time, etc.) .UNINDENT .sp Please note: .INDENT 0.0 .IP \(bu 2 all data goes over that pipe, again and again for every archive .IP \(bu 2 the pipe is dumb, there is no data or transfer time reduction there due to deduplication .IP \(bu 2 maybe add compression .IP \(bu 2 pipe over ssh for remote transfer .IP \(bu 2 no special sparse file support .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-info.10000644000076500000240000000630414646713253016125 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-INFO" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-info \- Show archive details such as disk space used .SH SYNOPSIS .sp borg [common options] info [options] .SH DESCRIPTION .sp This command displays detailed information about the specified archive. .sp Please note that the deduplicated sizes of the individual archives do not add up to the deduplicated size of the repository (\(dqall archives\(dq), because the two are meaning different things: .sp This archive / deduplicated size = amount of data stored ONLY for this archive = unique chunks of this archive. All archives / deduplicated size = amount of data stored in the repo = all chunks in the repository. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS optional arguments .INDENT 0.0 .TP .B \-\-json format output as JSON .UNINDENT .SS Archive filters .INDENT 0.0 .TP .BI \-a \ PATTERN\fR,\fB \ \-\-match\-archives \ PATTERN only consider archive names matching the pattern. see \(dqborg help match\-archives\(dq. .TP .BI \-\-sort\-by \ KEYS Comma\-separated list of sorting keys; valid keys are: timestamp, archive, name, id; default is: timestamp .TP .BI \-\-first \ N consider first N archives after other filters were applied .TP .BI \-\-last \ N consider last N archives after other filters were applied .TP .BI \-\-oldest \ TIMESPAN consider archives between the oldest archive\(aqs timestamp and (oldest + TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newest \ TIMESPAN consider archives between the newest archive\(aqs timestamp and (newest \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-older \ TIMESPAN consider archives older than (now \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newer \ TIMESPAN consider archives newer than (now \- TIMESPAN), e.g. 7d or 12m. .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ borg info Tuesday2022\-06\-25T20:51:39 Archive name: Tuesday2022\-06\-25T20:51:39 Archive fingerprint: f7dea0788dfc026cc2be1c0f5b94beb4e4084eb3402fc40c38d8719b1bf2d943 Comment: Hostname: mba2020 Username: tw Time (start): Sat, 2022\-06\-25 20:51:40 Time (end): Sat, 2022\-06\-25 20:51:40 Duration: 0.03 seconds Command line: /Users/tw/w/borg\-env/bin/borg \-r path/to/repo create \-\-stats \(aqTuesday{now}\(aq src \-\-progress Utilization of maximum supported archive size: 0% Number of files: 244 Original size: 13.80 MB Deduplicated size: 531 B .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-list(1)\fP, \fIborg\-diff(1)\fP, \fIborg\-rinfo(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key-change-algorithm.10000644000076500000240000000533314646713253021172 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY-CHANGE-ALGORITHM" 1 "2022-06-26" "" "borg backup tool" .SH NAME borg-key-change-algorithm \- Change repository key algorithm .SH SYNOPSIS .sp borg [common options] key change\-algorithm [options] ALGORITHM .SH DESCRIPTION .sp Change the algorithm we use to encrypt and authenticate the borg key. .sp Important: In a \fIrepokey\fP mode (e.g. repokey\-blake2) all users share the same key. In this mode upgrading to \fIargon2\fP will make it impossible to access the repo for users who use an old version of borg. We recommend upgrading to the latest stable version. .sp Important: In a \fIkeyfile\fP mode (e.g. keyfile\-blake2) each user has their own key (in \fB~/.config/borg/keys\fP). In this mode this command will only change the key used by the current user. If you want to upgrade to \fIargon2\fP to strengthen security, you will have to upgrade each user\(aqs key individually. .sp Your repository is encrypted and authenticated with a key that is randomly generated by \fBborg init\fP\&. The key is encrypted and authenticated with your passphrase. .sp We currently support two choices: .INDENT 0.0 .IP 1. 3 argon2 \- recommended. This algorithm is used by default when initialising a new repository. The key encryption key is derived from your passphrase via argon2\-id. Argon2 is considered more modern and secure than pbkdf2. .IP 2. 3 pbkdf2 \- the legacy algorithm. Use this if you want to access your repo via old versions of borg. The key encryption key is derived from your passphrase via PBKDF2\-HMAC\-SHA256. .UNINDENT .sp Examples: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Upgrade an existing key to argon2 borg key change\-algorithm /path/to/repo argon2 # Downgrade to pbkdf2 \- use this if upgrading borg is not an option borg key change\-algorithm /path/to/repo pbkdf2 .ft P .fi .UNINDENT .UNINDENT .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B ALGORITHM select key algorithm .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key-change-location.10000644000076500000240000000323214646713253021010 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY-CHANGE-LOCATION" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-key-change-location \- Change repository key location .SH SYNOPSIS .sp borg [common options] key change\-location [options] KEY_LOCATION .SH DESCRIPTION .sp Change the location of a borg key. The key can be stored at different locations: .INDENT 0.0 .IP \(bu 2 keyfile: locally, usually in the home directory .IP \(bu 2 repokey: inside the repo (in the repo config) .UNINDENT .sp Please note: .sp This command does NOT change the crypto algorithms, just the key location, thus you must ONLY give the key location (keyfile or repokey). .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B KEY_LOCATION select key location .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-keep keep the key also at the current location (default: remove it) .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key-change-passphrase.10000644000076500000240000000555514646713253021363 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY-CHANGE-PASSPHRASE" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-key-change-passphrase \- Change repository key file passphrase .SH SYNOPSIS .sp borg [common options] key change\-passphrase [options] .SH DESCRIPTION .sp The key files used for repository encryption are optionally passphrase protected. This command can be used to change this passphrase. .sp Please note that this command only changes the passphrase, but not any secret protected by it (like e.g. encryption/MAC keys or chunker seed). Thus, changing the passphrase after passphrase and borg key got compromised does not protect future (nor past) backups to the same repository. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Create a key file protected repository $ borg rcreate \-\-encryption=keyfile\-aes\-ocb \-v Initializing repository at \(dq/path/to/repo\(dq Enter new passphrase: Enter same passphrase again: Remember your passphrase. Your data will be inaccessible without it. Key in \(dq/root/.config/borg/keys/mnt_backup\(dq created. Keep this key safe. Your data will be inaccessible without it. Synchronizing chunks cache... Archives: 0, w/ cached Idx: 0, w/ outdated Idx: 0, w/o cached Idx: 0. Done. # Change key file passphrase $ borg key change\-passphrase \-v Enter passphrase for key /root/.config/borg/keys/mnt_backup: Enter new passphrase: Enter same passphrase again: Remember your passphrase. Your data will be inaccessible without it. Key updated # Import a previously\-exported key into the specified # key file (creating or overwriting the output key) # (keyfile repositories only) $ BORG_KEY_FILE=/path/to/output\-key borg key import /path/to/exported .ft P .fi .UNINDENT .UNINDENT .sp Fully automated using environment variables: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ BORG_NEW_PASSPHRASE=old borg rcreate \-\-encryption=repokey\-aes\-ocb # now \(dqold\(dq is the current passphrase. $ BORG_PASSPHRASE=old BORG_NEW_PASSPHRASE=new borg key change\-passphrase # now \(dqnew\(dq is the current passphrase. .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key-export.10000644000076500000240000000574514646713253017311 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY-EXPORT" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-key-export \- Export the repository key for backup .SH SYNOPSIS .sp borg [common options] key export [options] [PATH] .SH DESCRIPTION .sp If repository encryption is used, the repository is inaccessible without the key. This command allows one to back up this essential key. Note that the backup produced does not include the passphrase itself (i.e. the exported key stays encrypted). In order to regain access to a repository, one needs both the exported key and the original passphrase. .sp There are three backup formats. The normal backup format is suitable for digital storage as a file. The \fB\-\-paper\fP backup format is optimized for printing and typing in while importing, with per line checks to reduce problems with manual input. The \fB\-\-qr\-html\fP creates a printable HTML template with a QR code and a copy of the \fB\-\-paper\fP\-formatted key. .sp For repositories using keyfile encryption the key is saved locally on the system that is capable of doing backups. To guard against loss of this key, the key needs to be backed up independently of the main data backup. .sp For repositories using the repokey encryption the key is saved in the repository in the config file. A backup is thus not strictly needed, but guards against the repository becoming inaccessible if the file is damaged for some reason. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B PATH where to store the backup .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-paper Create an export suitable for printing and later type\-in .TP .B \-\-qr\-html Create an html file suitable for printing and later type\-in or qr scan .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C borg key export > encrypted\-key\-backup borg key export \-\-paper > encrypted\-key\-backup.txt borg key export \-\-qr\-html > encrypted\-key\-backup.html # Or pass the output file as an argument instead of redirecting stdout: borg key export encrypted\-key\-backup borg key export \-\-paper encrypted\-key\-backup.txt borg key export \-\-qr\-html encrypted\-key\-backup.html .ft P .fi .UNINDENT .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-key\-import(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key-import.10000644000076500000240000000422514646713253017272 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY-IMPORT" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-key-import \- Import the repository key from backup .SH SYNOPSIS .sp borg [common options] key import [options] [PATH] .SH DESCRIPTION .sp This command restores a key previously backed up with the export command. .sp If the \fB\-\-paper\fP option is given, the import will be an interactive process in which each line is checked for plausibility before proceeding to the next line. For this format PATH must not be given. .sp For repositories using keyfile encryption, the key file which \fBborg key import\fP writes to depends on several factors. If the \fBBORG_KEY_FILE\fP environment variable is set and non\-empty, \fBborg key import\fP creates or overwrites that file named by \fB$BORG_KEY_FILE\fP\&. Otherwise, \fBborg key import\fP searches in the \fB$BORG_KEYS_DIR\fP directory for a key file associated with the repository. If a key file is found in \fB$BORG_KEYS_DIR\fP, \fBborg key import\fP overwrites it; otherwise, \fBborg key import\fP creates a new key file in \fB$BORG_KEYS_DIR\fP\&. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B PATH path to the backup (\(aq\-\(aq to read from stdin) .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-paper interactively import from a backup done with \fB\-\-paper\fP .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-key\-export(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key-migrate-to-repokey.10000644000076500000240000000364314646713253021507 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY-MIGRATE-TO-REPOKEY" 1 "2022-02-19" "" "borg backup tool" .SH NAME borg-key-migrate-to-repokey \- Migrate passphrase -> repokey .SH SYNOPSIS .sp borg [common options] key migrate\-to\-repokey [options] [REPOSITORY] .SH DESCRIPTION .sp This command migrates a repository from passphrase mode (removed in Borg 1.0) to repokey mode. .sp You will be first asked for the repository passphrase (to open it in passphrase mode). This is the same passphrase as you used to use for this repo before 1.0. .sp It will then derive the different secrets from this passphrase. .sp Then you will be asked for a new passphrase (twice, for safety). This passphrase will be used to protect the repokey (which contains these same secrets in encrypted form). You may use the same passphrase as you used to use, but you may also use a different one. .sp After migrating to repokey mode, you can change the passphrase at any time. But please note: the secrets will always stay the same and they could always be derived from your (old) passphrase\-mode passphrase. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .sp REPOSITORY .SH SEE ALSO .sp \fIborg\-common(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-key.10000644000076500000240000000232714646713253015763 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-KEY" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-key \- Manage a keyfile or repokey of a repository .SH SYNOPSIS .nf borg [common options] key export ... borg [common options] key import ... borg [common options] key change\-passphrase ... borg [common options] key change\-location ... .fi .sp .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-key\-export(1)\fP, \fIborg\-key\-import(1)\fP, \fIborg\-key\-change\-passphrase(1)\fP, \fIborg\-key\-change\-location(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-list.10000644000076500000240000001511014646713253016140 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-LIST" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-list \- List archive contents .SH SYNOPSIS .sp borg [common options] list [options] NAME [PATH...] .SH DESCRIPTION .sp This command lists the contents of an archive. .sp For more help on include/exclude patterns, see the \fIborg_patterns\fP command output. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B NAME specify the archive name .TP .B PATH paths to list; patterns are supported .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-short only print file/directory names, nothing else .TP .BI \-\-format \ FORMAT specify format for file listing (default: \(dq{mode} {user:6} {group:6} {size:8} {mtime} {path}{extra}{NL}\(dq) .TP .B \-\-json\-lines Format output as JSON Lines. The form of \fB\-\-format\fP is ignored, but keys used in it are added to the JSON output. Some keys are always present. Note: JSON can only represent text. .UNINDENT .SS Include/Exclude options .INDENT 0.0 .TP .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN exclude paths matching PATTERN .TP .BI \-\-exclude\-from \ EXCLUDEFILE read exclude patterns from EXCLUDEFILE, one per line .TP .BI \-\-pattern \ PATTERN include/exclude paths matching PATTERN .TP .BI \-\-patterns\-from \ PATTERNFILE read include/exclude patterns from PATTERNFILE, one per line .UNINDENT .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ borg list root\-2016\-02\-15 drwxr\-xr\-x root root 0 Mon, 2016\-02\-15 17:44:27 . drwxrwxr\-x root root 0 Mon, 2016\-02\-15 19:04:49 bin \-rwxr\-xr\-x root root 1029624 Thu, 2014\-11\-13 00:08:51 bin/bash lrwxrwxrwx root root 0 Fri, 2015\-03\-27 20:24:26 bin/bzcmp \-> bzdiff \-rwxr\-xr\-x root root 2140 Fri, 2015\-03\-27 20:24:22 bin/bzdiff \&... $ borg list root\-2016\-02\-15 \-\-pattern \(dq\- bin/ba*\(dq drwxr\-xr\-x root root 0 Mon, 2016\-02\-15 17:44:27 . drwxrwxr\-x root root 0 Mon, 2016\-02\-15 19:04:49 bin lrwxrwxrwx root root 0 Fri, 2015\-03\-27 20:24:26 bin/bzcmp \-> bzdiff \-rwxr\-xr\-x root root 2140 Fri, 2015\-03\-27 20:24:22 bin/bzdiff \&... $ borg list archiveA \-\-format=\(dq{mode} {user:6} {group:6} {size:8d} {isomtime} {path}{extra}{NEWLINE}\(dq drwxrwxr\-x user user 0 Sun, 2015\-02\-01 11:00:00 . drwxrwxr\-x user user 0 Sun, 2015\-02\-01 11:00:00 code drwxrwxr\-x user user 0 Sun, 2015\-02\-01 11:00:00 code/myproject \-rw\-rw\-r\-\- user user 1416192 Sun, 2015\-02\-01 11:00:00 code/myproject/file.ext \-rw\-rw\-r\-\- user user 1416192 Sun, 2015\-02\-01 11:00:00 code/myproject/file.text \&... $ borg list archiveA \-\-pattern \(aq+ re:\e.ext$\(aq \-\-pattern \(aq\- re:^.*$\(aq \-rw\-rw\-r\-\- user user 1416192 Sun, 2015\-02\-01 11:00:00 code/myproject/file.ext \&... $ borg list archiveA \-\-pattern \(aq+ re:.ext$\(aq \-\-pattern \(aq\- re:^.*$\(aq \-rw\-rw\-r\-\- user user 1416192 Sun, 2015\-02\-01 11:00:00 code/myproject/file.ext \-rw\-rw\-r\-\- user user 1416192 Sun, 2015\-02\-01 11:00:00 code/myproject/file.text \&... .ft P .fi .UNINDENT .UNINDENT .SH NOTES .SS The FORMAT specifier syntax .sp The \fB\-\-format\fP option uses python\(aqs \fI\%format string syntax\fP\&. .sp Examples: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ borg list \-\-format \(aq{mode} {user:6} {group:6} {size:8} {mtime} {path}{extra}{NL}\(aq ArchiveFoo \-rw\-rw\-r\-\- user user 1024 Thu, 2021\-12\-09 10:22:17 file\-foo \&... # {VAR:NUMBER} \- pad to NUMBER columns right\-aligned. $ borg list \-\-format \(aq{mode} {user:>6} {group:>6} {size:<8} {mtime} {path}{extra}{NL}\(aq ArchiveFoo \-rw\-rw\-r\-\- user user 1024 Thu, 2021\-12\-09 10:22:17 file\-foo \&... .ft P .fi .UNINDENT .UNINDENT .sp The following keys are always available: .INDENT 0.0 .IP \(bu 2 NEWLINE: OS dependent line separator .IP \(bu 2 NL: alias of NEWLINE .IP \(bu 2 NUL: NUL character for creating print0 / xargs \-0 like output .IP \(bu 2 SPACE: space character .IP \(bu 2 TAB: tab character .IP \(bu 2 CR: carriage return character .IP \(bu 2 LF: line feed character .UNINDENT .sp Keys available only when listing files in an archive: .INDENT 0.0 .IP \(bu 2 type: file type (file, dir, symlink, ...) .IP \(bu 2 mode: file mode (as in stat) .IP \(bu 2 uid: user id of file owner .IP \(bu 2 gid: group id of file owner .IP \(bu 2 user: user name of file owner .IP \(bu 2 group: group name of file owner .IP \(bu 2 path: file path .IP \(bu 2 target: link target for symlinks .IP \(bu 2 hlid: hard link identity (same if hardlinking same fs object) .IP \(bu 2 flags: file flags .IP \(bu 2 size: file size .IP \(bu 2 dsize: deduplicated size .IP \(bu 2 num_chunks: number of chunks in this file .IP \(bu 2 unique_chunks: number of unique chunks in this file .IP \(bu 2 mtime: file modification time .IP \(bu 2 ctime: file change time .IP \(bu 2 atime: file access time .IP \(bu 2 isomtime: file modification time (ISO 8601 format) .IP \(bu 2 isoctime: file change time (ISO 8601 format) .IP \(bu 2 isoatime: file access time (ISO 8601 format) .IP \(bu 2 blake2b .IP \(bu 2 blake2s .IP \(bu 2 md5 .IP \(bu 2 sha1 .IP \(bu 2 sha224 .IP \(bu 2 sha256 .IP \(bu 2 sha384 .IP \(bu 2 sha3_224 .IP \(bu 2 sha3_256 .IP \(bu 2 sha3_384 .IP \(bu 2 sha3_512 .IP \(bu 2 sha512 .IP \(bu 2 xxh64: XXH64 checksum of this file (note: this is NOT a cryptographic hash!) .IP \(bu 2 archiveid: internal ID of the archive .IP \(bu 2 archivename: name of the archive .IP \(bu 2 extra: prepends {target} with \(dq \-> \(dq for soft links and \(dq link to \(dq for hard links .IP \(bu 2 health: either \(dqhealthy\(dq (file ok) or \(dqbroken\(dq (if file has all\-zero replacement chunks) .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-info(1)\fP, \fIborg\-diff(1)\fP, \fIborg\-prune(1)\fP, \fIborg\-patterns(1)\fP, \fIborg\-rlist(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-match-archives.10000644000076500000240000000365614646713253020077 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-MATCH-ARCHIVES" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-match-archives \- Details regarding match-archives .SH DESCRIPTION .sp The \fB\-\-match\-archives\fP option matches a given pattern against the list of all archive names in the repository. .sp It uses pattern styles similar to the ones described by \fBborg help patterns\fP: .INDENT 0.0 .TP .B Identical match pattern, selector \fBid:\fP (default) Simple string match, must fully match exactly as given. .TP .B Shell\-style patterns, selector \fBsh:\fP Match like on the shell, wildcards like \fI*\fP and \fI?\fP work. .TP .B \fI\%Regular expressions\fP, selector \fBre:\fP Full regular expression support. This is very powerful, but can also get rather complicated. .UNINDENT .sp Examples: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # id: style borg delete \-\-match\-archives \(aqid:archive\-with\-crap\(aq borg delete \-a \(aqid:archive\-with\-crap\(aq # same, using short option borg delete \-a \(aqarchive\-with\-crap\(aq # same, because \(aqid:\(aq is the default # sh: style borg delete \-a \(aqsh:home\-kenny\-*\(aq # re: style borg delete \-a \(aqre:pc[123]\-home\-(user1|user2)\-2022\-09\-.*\(aq .ft P .fi .UNINDENT .UNINDENT .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-mount.10000644000076500000240000001362214646713253016335 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-MOUNT" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-mount \- Mount archive or an entire repository as a FUSE filesystem .SH SYNOPSIS .sp borg [common options] mount [options] MOUNTPOINT [PATH...] .SH DESCRIPTION .sp This command mounts an archive as a FUSE filesystem. This can be useful for browsing an archive or restoring individual files. When restoring, take into account that the current FUSE implementation does not support special fs flags and ACLs. .sp Unless the \fB\-\-foreground\fP option is given the command will run in the background until the filesystem is \fBumounted\fP\&. .sp The command \fBborgfs\fP provides a wrapper for \fBborg mount\fP\&. This can also be used in fstab entries: \fB/path/to/repo /mnt/point fuse.borgfs defaults,noauto 0 0\fP .sp To allow a regular user to use fstab entries, add the \fBuser\fP option: \fB/path/to/repo /mnt/point fuse.borgfs defaults,noauto,user 0 0\fP .sp For FUSE configuration and mount options, see the mount.fuse(8) manual page. .sp Borg\(aqs default behavior is to use the archived user and group names of each file and map them to the system\(aqs respective user and group ids. Alternatively, using \fBnumeric\-ids\fP will instead use the archived user and group ids without any mapping. .sp The \fBuid\fP and \fBgid\fP mount options (implemented by Borg) can be used to override the user and group ids of all files (i.e., \fBborg mount \-o uid=1000,gid=1000\fP). .sp The man page references \fBuser_id\fP and \fBgroup_id\fP mount options (implemented by fuse) which specify the user and group id of the mount owner (aka, the user who does the mounting). It is set automatically by libfuse (or the filesystem if libfuse is not used). However, you should not specify these manually. Unlike the \fBuid\fP and \fBgid\fP mount options which affect all files, \fBuser_id\fP and \fBgroup_id\fP affect the user and group id of the mounted (base) directory. .sp Additional mount options supported by borg: .INDENT 0.0 .IP \(bu 2 \fBversions\fP: when used with a repository mount, this gives a merged, versioned view of the files in the archives. EXPERIMENTAL, layout may change in future. .IP \(bu 2 \fBallow_damaged_files\fP: by default damaged files (where missing chunks were replaced with runs of zeros by \fBborg check \-\-repair\fP) are not readable and return EIO (I/O error). Set this option to read such files. .IP \(bu 2 \fBignore_permissions\fP: for security reasons the \fBdefault_permissions\fP mount option is internally enforced by borg. \fBignore_permissions\fP can be given to not enforce \fBdefault_permissions\fP\&. .UNINDENT .sp The BORG_MOUNT_DATA_CACHE_ENTRIES environment variable is meant for advanced users to tweak the performance. It sets the number of cached data chunks; additional memory usage can be up to ~8 MiB times this number. The default is the number of CPU cores. .sp When the daemonized process receives a signal or crashes, it does not unmount. Unmounting in these cases could cause an active rsync or similar process to delete data unintentionally. .sp When running in the foreground ^C/SIGINT unmounts cleanly, but other signals or crashes do not. .SH OPTIONS .sp See \fIborg\-common(1)\fP for common options of Borg commands. .SS arguments .INDENT 0.0 .TP .B MOUNTPOINT where to mount filesystem .TP .B PATH paths to extract; patterns are supported .UNINDENT .SS optional arguments .INDENT 0.0 .TP .B \-\-consider\-checkpoints Show checkpoint archives in the repository contents list (default: hidden). .TP .B \-f\fP,\fB \-\-foreground stay in foreground, do not daemonize .TP .B \-o Extra mount options .TP .B \-\-numeric\-ids use numeric user and group identifiers from archive(s) .UNINDENT .SS Archive filters .INDENT 0.0 .TP .BI \-a \ PATTERN\fR,\fB \ \-\-match\-archives \ PATTERN only consider archive names matching the pattern. see \(dqborg help match\-archives\(dq. .TP .BI \-\-sort\-by \ KEYS Comma\-separated list of sorting keys; valid keys are: timestamp, archive, name, id; default is: timestamp .TP .BI \-\-first \ N consider first N archives after other filters were applied .TP .BI \-\-last \ N consider last N archives after other filters were applied .TP .BI \-\-oldest \ TIMESPAN consider archives between the oldest archive\(aqs timestamp and (oldest + TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newest \ TIMESPAN consider archives between the newest archive\(aqs timestamp and (newest \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-older \ TIMESPAN consider archives older than (now \- TIMESPAN), e.g. 7d or 12m. .TP .BI \-\-newer \ TIMESPAN consider archives newer than (now \- TIMESPAN), e.g. 7d or 12m. .UNINDENT .SS Include/Exclude options .INDENT 0.0 .TP .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN exclude paths matching PATTERN .TP .BI \-\-exclude\-from \ EXCLUDEFILE read exclude patterns from EXCLUDEFILE, one per line .TP .BI \-\-pattern \ PATTERN include/exclude paths matching PATTERN .TP .BI \-\-patterns\-from \ PATTERNFILE read include/exclude patterns from PATTERNFILE, one per line .TP .BI \-\-strip\-components \ NUMBER Remove the specified number of leading path elements. Paths with fewer elements will be silently skipped. .UNINDENT .SH SEE ALSO .sp \fIborg\-common(1)\fP, \fIborg\-umount(1)\fP, \fIborg\-extract(1)\fP .SH AUTHOR The Borg Collective .\" Generated by docutils manpage writer. . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1721472683.0 borgbackup-2.0.0b9/docs/man/borg-patterns.10000644000076500000240000003065014646713253017033 0ustar00twstaff.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "BORG-PATTERNS" 1 "2024-07-19" "" "borg backup tool" .SH NAME borg-patterns \- Details regarding patterns .SH DESCRIPTION .sp When specifying one or more file paths in a Borg command that supports patterns for the respective option or argument, you can apply the patterns described here to include only desired files and/or exclude unwanted ones. Patterns can be used .INDENT 0.0 .IP \(bu 2 for \fB\-\-exclude\fP option, .IP \(bu 2 in the file given with \fB\-\-exclude\-from\fP option, .IP \(bu 2 for \fB\-\-pattern\fP option, .IP \(bu 2 in the file given with \fB\-\-patterns\-from\fP option and .IP \(bu 2 for \fBPATH\fP arguments that explicitly support them. .UNINDENT .sp Borg always stores all file paths normalized and relative to the current recursion root. The recursion root is also named \fBPATH\fP in Borg commands like \fIborg create\fP that do a file discovery, so do not confuse the root with the \fBPATH\fP argument of e.g. \fIborg extract\fP\&. .sp Starting with Borg 1.2, paths that are matched against patterns always appear relative. If you give \fB/absolute/\fP as root, the paths going into the matcher will start with \fBabsolute/\fP\&. If you give \fB\&../../relative\fP as root, the paths will be normalized as \fBrelative/\fP\&. .sp Borg supports different pattern styles. To define a non\-default style for a specific pattern, prefix it with two characters followed by a colon \(aq:\(aq (i.e. \fBfm:path/*\fP, \fBsh:path/**\fP). .INDENT 0.0 .TP .B \fI\%Fnmatch\fP, selector \fBfm:\fP This is the default style for \fB\-\-exclude\fP and \fB\-\-exclude\-from\fP\&. These patterns use a variant of shell pattern syntax, with \(aq*\(aq matching any number of characters, \(aq?\(aq matching any single character, \(aq[...]\(aq matching any single character specified, including ranges, and \(aq[!...]\(aq matching any character not specified. For the purpose of these patterns, the path separator (backslash for Windows and \(aq/\(aq on other systems) is not treated specially. Wrap meta\-characters in brackets for a literal match (i.e. \fB[?]\fP to match the literal character \(aq?\(aq). For a path to match a pattern, the full path must match, or it must match from the start of the full path to just before a path separator. Except for the root path, paths will never end in the path separator when matching is attempted. Thus, if a given pattern ends in a path separator, a \(aq*\(aq is appended before matching is attempted. A leading path separator is always removed. .TP .B Shell\-style patterns, selector \fBsh:\fP This is the default style for \fB\-\-pattern\fP and \fB\-\-patterns\-from\fP\&. Like fnmatch patterns these are similar to shell patterns. The difference is that the pattern may include \fB**/\fP for matching zero or more directory levels, \fB*\fP for matching zero or more arbitrary characters with the exception of any path separator, \fB{}\fP containing comma\-separated alternative patterns. A leading path separator is always removed. .TP .B \fI\%Regular expressions\fP, selector \fBre:\fP Unlike shell patterns, regular expressions are not required to match the full path and any substring match is sufficient. It is strongly recommended to anchor patterns to the start (\(aq^\(aq), to the end (\(aq$\(aq) or both. Path separators (backslash for Windows and \(aq/\(aq on other systems) in paths are always normalized to a forward slash \(aq/\(aq before applying a pattern. .TP .B Path prefix, selector \fBpp:\fP This pattern style is useful to match whole sub\-directories. The pattern \fBpp:root/somedir\fP matches \fBroot/somedir\fP and everything therein. A leading path separator is always removed. .TP .B Path full\-match, selector \fBpf:\fP This pattern style is (only) useful to match full paths. This is kind of a pseudo pattern as it can not have any variable or unspecified parts \- the full path must be given. \fBpf:root/file.ext\fP matches \fBroot/file.ext\fP only. A leading path separator is always removed. .sp Implementation note: this is implemented via very time\-efficient O(1) hashtable lookups (this means you can have huge amounts of such patterns without impacting performance much). Due to that, this kind of pattern does not respect any context or order. If you use such a pattern to include a file, it will always be included (if the directory recursion encounters it). Other include/exclude patterns that would normally match will be ignored. Same logic applies for exclude. .UNINDENT .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 \fBre:\fP, \fBsh:\fP and \fBfm:\fP patterns are all implemented on top of the Python SRE engine. It is very easy to formulate patterns for each of these types which requires an inordinate amount of time to match paths. If untrusted users are able to supply patterns, ensure they cannot supply \fBre:\fP patterns. Further, ensure that \fBsh:\fP and \fBfm:\fP patterns only contain a handful of wildcards at most. .UNINDENT .UNINDENT .sp Exclusions can be passed via the command line option \fB\-\-exclude\fP\&. When used from within a shell, the patterns should be quoted to protect them from expansion. .sp The \fB\-\-exclude\-from\fP option permits loading exclusion patterns from a text file with one pattern per line. Lines empty or starting with the hash sign \(aq#\(aq after removing whitespace on both ends are ignored. The optional style selector prefix is also supported for patterns loaded from a file. Due to whitespace removal, paths with whitespace at the beginning or end can only be excluded using regular expressions. .sp To test your exclusion patterns without performing an actual backup you can run \fBborg create \-\-list \-\-dry\-run ...\fP\&. .sp Examples: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Exclude \(aq/home/user/file.o\(aq but not \(aq/home/user/file.odt\(aq: $ borg create \-e \(aq*.o\(aq archive / # Exclude \(aq/home/user/junk\(aq and \(aq/home/user/subdir/junk\(aq but # not \(aq/home/user/importantjunk\(aq or \(aq/etc/junk\(aq: $ borg create \-e \(aqhome/*/junk\(aq archive / # Exclude the contents of \(aq/home/user/cache\(aq but not the directory itself: $ borg create \-e home/user/cache/ archive / # The file \(aq/home/user/cache/important\(aq is *not* backed up: $ borg create \-e home/user/cache/ archive / /home/user/cache/important # The contents of directories in \(aq/home\(aq are not backed up when their name # ends in \(aq.tmp\(aq $ borg create \-\-exclude \(aqre:^home/[^/]+\e.tmp/\(aq archive / # Load exclusions from file $ cat >exclude.txt <