diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..8e3ff067f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,60 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: Bug
+assignees: ''
+
+---
+
+
+- [ ] I have searched open and closed issues for duplicates
+
+
+
+### Bug Description
+
+
+
+### Steps to Reproduce
+
+
+
+1. step one
+2. step two
+3. step three
+
+Actual Result:
+
+
+
+Expected Result:
+
+
+
+### Screenshots
+
+
+
+### Platform Info
+
+Friendica Version:
+
+
+
+Friendica Source:
+
+PHP version:
+
+SQL version:
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000..7bdd4f066
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: true
+contact_links:
+ - name: Friendica Community Support
+ url: https://forum.friendi.ca/
+ about: Please ask and answer questions here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..7484a8362
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,22 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: New Feature
+assignees: ''
+
+---
+
+### Is the feature request related to a problem? Please describe.
+
+
+
+### Describe alternatives you've considered
+
+
+
+### Additional context
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
new file mode 100644
index 000000000..86df43733
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -0,0 +1,10 @@
+---
+name: Question / Support
+about: Select this if you have a question
+title: ''
+labels: Support Request
+assignees: ''
+
+---
+
+# For general question about Friendica, please try to find a solution at https://wiki.friendi.ca first.
\ No newline at end of file
diff --git a/.github/issue_template.md b/.github/issue_template.md
deleted file mode 100644
index e1ae36e70..000000000
--- a/.github/issue_template.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### Expected behavior
-
-### Actual behavior
-
-### Steps to reproduce the problem
-
-### Friendica version you encountered the problem
-
-see `example.com/friendica` on your Friendica node for the version information.
-
-### Friendica source (git, zip)
-
-### PHP version
-
-### SQL version
diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml
new file mode 100644
index 000000000..91a8b6074
--- /dev/null
+++ b/.github/workflows/php.yml
@@ -0,0 +1,101 @@
+name: Testing Friendica
+on: [push, pull_request]
+
+jobs:
+ friendica:
+ name: Friendica (PHP ${{ matrix.php-versions }})
+ runs-on: ubuntu-latest
+ services:
+ mariadb:
+ image: mariadb:latest
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: true
+ MYSQL_DATABASE: test
+ MYSQL_PASSWORD: test
+ MYSQL_USER: test
+ ports:
+ - 3306/tcp
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
+ redis:
+ image: redis
+ ports:
+ - 6379/tcp
+ options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
+ memcached:
+ image: memcached
+ ports:
+ - 11211/tcp
+ strategy:
+ fail-fast: false
+ matrix:
+ php-versions: ['7.2', '7.3', '7.4']
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Setup PHP, with composer and extensions
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-versions }}
+ tools: pecl, composer:v1
+ extensions: pdo_mysql, gd, zip, opcache, ctype, pcntl, ldap, apcu, memcached, redis, imagick, memcache
+ coverage: xdebug
+ ini-values: apc.enabled=1, apc.enable_cli=1
+
+ - name: Start mysql service
+ run: sudo /etc/init.d/mysql start
+
+ - name: Validate composer.json and composer.lock
+ run: composer validate
+
+ - name: Get composer cache directory
+ id: composercache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: Cache dependencies
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composercache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+ restore-keys: ${{ runner.os }}-composer-
+
+ - name: Install dependencies
+ run: composer install --prefer-dist
+
+ - name: Copy default Friendica config
+ run: cp config/local-sample.config.php config/local.config.php
+
+ - name: Verify MariaDB connection
+ env:
+ PORT: ${{ job.services.mariadb.ports[3306] }}
+ run: |
+ while ! mysqladmin ping -h"127.0.0.1" -P"$PORT" --silent; do
+ sleep 1
+ done
+
+ - name: Setup MYSQL database
+ env:
+ PORT: ${{ job.services.mariadb.ports[3306] }}
+ run: |
+ mysql -h"127.0.0.1" -P"$PORT" -utest -ptest test < database.sql
+
+ - name: Test with Parallel-lint
+ run: vendor/bin/parallel-lint --exclude vendor/ --exclude view/asset/ .
+
+ - name: Test with phpunit
+ run: vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-clover clover.xml
+ env:
+ MYSQL_HOST: 127.0.0.1
+ MYSQL_PORT: ${{ job.services.mariadb.ports[3306] }}
+ MYSQL_DATABASE: test
+ MYSQL_PASSWORD: test
+ MYSQL_USER: test
+ REDIS_PORT: ${{ job.services.redis.ports[6379] }}
+ REDIS_HOST: 127.0.0.1
+ MEMCACHED_PORT: ${{ job.services.memcached.ports[11211] }}
+ MEMCACHE_PORT: ${{ job.services.memcached.ports[11211] }}
+
+ - name: Upload coverage to Codecov
+ uses: codecov/codecov-action@v1
+ with:
+ file: clover.xml
diff --git a/.gitignore b/.gitignore
index 2d8acf016..3250fb076 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,8 +71,8 @@ venv/
/addons
/addon
-#ignore .htaccess
-.htaccess
+#ignore base .htaccess
+/.htaccess
#ignore filesystem storage default path
/storage
diff --git a/.htaccess-dist b/.htaccess-dist
index a671cc680..3c9098251 100644
--- a/.htaccess-dist
+++ b/.htaccess-dist
@@ -1,3 +1,6 @@
+# This file is meant to be copied to ".htaccess" on Apache-powered web servers.
+# The created .htaccess file can be edited manually and will not be overwritten by Friendica updates.
+
Options -Indexes
AddType application/x-java-archive .jar
AddType audio/ogg .oga
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 5e4c3483b..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
----
-language: php
-## Friendica officially supports PHP version >= 7.1
-php:
- - 7.1
- - 7.2
- - 7.3
-
-services:
- - mysql
- - redis
- - memcached
-env:
- - MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USERNAME=travis MYSQL_PASSWORD="" MYSQL_DATABASE=test
-
-install:
- - composer install
-before_script:
- - cp config/local-sample.config.php config/local.config.php
- - mysql -e 'CREATE DATABASE IF NOT EXISTS test;'
- - mysql -utravis test < database.sql
- - pecl channel-update pecl.php.net
- - pecl config-set preferred_state beta
- - phpenv config-add .travis/redis.ini
- - phpenv config-add .travis/memcached.ini
-
-script:
- - vendor/bin/parallel-lint --exclude vendor/ --exclude view/asset/ .
- - vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-clover clover.xml
-
-after_success: bash <(curl -s https://codecov.io/bash)
diff --git a/.travis/apcu.ini b/.travis/apcu.ini
deleted file mode 100644
index 92598662c..000000000
--- a/.travis/apcu.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-extension="apcu.so"
-
-apc.enabled = 1
-apc.enable_cli = 1
\ No newline at end of file
diff --git a/.travis/memcached.ini b/.travis/memcached.ini
deleted file mode 100644
index c9a2ff0c9..000000000
--- a/.travis/memcached.ini
+++ /dev/null
@@ -1 +0,0 @@
-extension="memcached.so"
\ No newline at end of file
diff --git a/.travis/redis.ini b/.travis/redis.ini
deleted file mode 100644
index ab995b837..000000000
--- a/.travis/redis.ini
+++ /dev/null
@@ -1 +0,0 @@
-extension="redis.so"
\ No newline at end of file
diff --git a/CHANGELOG b/CHANGELOG
index 197b2bca0..97a12d55d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,11 +1,269 @@
-Version 2020.06 (unreleased)
+Version 2021.03 (unreleased)
+ Friendica Core
+ Removed the frontend worker [annando]
+
+ Friendica Addons
+
+ Closed Issues
+
+Version 2021.01 (2021-01-04)
+ Friendica Core
+ Added HU translation
+ Updates to the translations: DE, IT, RU [translation teams]
+ Updates to the themes (duepuntozero, frio, vier) [annando, MrPetovan, tobiasd, vinzv]
+ General Code cleanup [annando, MrPetovan, nupplaphil]
+ Enhanced the handling of permission sets [annando]
+ Enhanced the usage of system resources when displaying photos and updating contacts [annando]
+ Enhanced the database structure [annando, Quix0r]
+ Enhanced the detection of PeerTube servers [annando]
+ Enhanced the photo cache [annando]
+ Enhanced the import of old postings which would otherwise not be imported due their age [annando]
+ Enhanced the delivery process of ActivityPub content [annando]
+ Enhanced the performance profiler [annando]
+ Enhanced the background worker [annando]
+ Enhanced the handling of blocked authors [MrPetovan]
+ Enhanced the user management in the admin panel [MrPetovan]
+ Enhanced the process of expiring postings [annando]
+ Enhanced the un/follow process of contacts [annando]
+ Enhanced the handling of HTTP requests [nupplaphil]
+ Enhanced filter possibilities of contacts [annando]
+ Enhanced language detection of postings [annando]
+ Enhanced the admin panel [MrPetovan, tobiasd]
+ Enhanced the contact suggestions [annando]
+ Enhanced the community page (filter, tags) [annando]
+ Enhanced the display of the reason why a posting is displayed in a stream [annando]
+ Enhanced the forum delivery of postings [redmatrix]
+ Enhanced PHP8 compatibility [annando]
+ Enhanced the worker_cooldown mechanism [annando]
+ Added new options to the remote_self feature [annando]
+ Added API endpoints for accounts and trends [annando]
+ Added API endpoints for re-sharing of postings [annando]
+ Added provider fields to the API [annando]
+ Added the possibility to map $_SERVER variables during installation [nupplaphil]
+ Added the possibility to filter account types on the network page [annando]
+ Added missing Mastodon API endpoints as "unsupported" [annando]
+ Added a watchdog mode to check if the daemon is running [annando]
+ Added number of group members to the contact widget [annando]
+ Added endless scrolling in several places [annando]
+ Added an option to stay local when clicking on a contact profile [annando]
+ Added support of ActivityPub relays [annando]
+ Model\User::getAuthenticationInfo is now available for addons [MrPetovan]
+ Contact details can only edited for mail and feed contacts [annando]
+ Fixed some problems during the export of user data [annando]
+ Fixed various problems with the notification system [MrPetovan]
+ Fixed a problem with emoticon alt-text interpretation [MrPetovan]
+ Fixed a problem that caused comments on Tweets being distributed via ActivityPub [annando]
+ Fixed a problem with the auto-completion when composing comments [MrPetovan]
+ Fixed an ACL problem while poking contacts [MrPetovan]
+ Fixed a problem with Mastodon emoticons [MrPetovan]
+ Fixed a parser problem that caused additional
tags [annando]
+ Fixed escaping of several HTML snippets [MrPetovan]
+ Fixed a problem with fetching objects by URL [annando]
+
+ Friendica Addons
+ Updated to the translations IT, HU [translation teams]
+ advancedcontentfilter:
+ Added examples [hoergen]
+ blackout:
+ Improved the wording in the admin interface [urbalazs]
+ catavatar:
+ Improved the generation of avatars [annando]
+ ifttt:
+ Added support for delayed postings [annando]
+ mailstream:
+ Improved code structure [nupplaphil]
+ Fix case-sensitive check by [nupplaphil]
+ markdown:
+ Improved parsing [MrPetovan]
+ newmemberwidget:
+ Improved addon description [SpencerDub]
+ langfilter:
+ Changed the input to use a slider [MrPetovan]
+ ldapauth:
+ Reworked the authentication code [MrPetovan]
+ libravatar:
+ Fixed a problem with DNS requests [annando]
+ Improved the list of available avatars [annando]
+ phpmailer:
+ Fixed UTF8 encoding problems [MrPetovan]
+ rendertime:
+ Added more information about the "other" things that cost time [annando]
+ showmore:
+ Improved handling of the HTML structure of postings [MrPetovan]
+ showmore_dyn:
+ Improved user settings, language [MrPetovan]
+ twitter:
+ Improved logging [annando]
+ Improved the twitter_post_hook [MrPetovan]
+ Improved the posts send to twitter [annando]
+ Improved the remote_self functionality [annando]
+ Added support for delayed postings [annando]
+ Fixed a bug with direct re-shares [MrPetovan]
+
+ Closed Issues
+ 2803, 4230, 4486, 4494, 5616, 7393, 7697, 8485, 8533, 8605, 8689,
+ 8796, 8896, 8943, 8950, 9042, 9089, 9127, 9142, 9165, 9235, 9236,
+ 9238, 9249, 9264, 9268, 9276, 9281, 9291, 9296, 9305, 9306, 9315,
+ 9326, 9328, 9329, 9337, 9344, 9348, 9363, 9383, 9385, 9407, 9427,
+ 9430, 9432, 9457, 9461, 9464, 9465, 9480, 9486, 9496, 9508, 9518,
+ 9525, 9538, 9549, 9564, 9568, 9573, 9598, 9611, 9622, 9629, 9630,
+ 9633, 9636, 9639, 9641, 9642, 9662, 9672, 9673, 9678, 9682, 9692,
+ 9712
+
+Version 2020.09-1 (2020-09-24)
Friendica Core:
+ Updates to the translations: RU [translation teams]
+ Enhanced forum delivery using attached mention tags [redmatrix]
+ Enhanced code test-ability [nupplaphil]
+ Enhanced character set detection when parsing URLs [MrPetovan]
+ Enhanced the Activity Pub relay functionality [annando]
+ Added phpseclib dependency to replace standalone ASN1 library [nupplaphil]
+ Fixed a bug generating Message-IDs for notification mails [nupplaphil]
+ Fixed missing uri-ids in the database [annando]
+ Fixed a display problem with the new re-shares [annando]
Friendica Addons:
- showmore_dyn:
- New addon to collapse long post depending on their actual height [wiwie]
+ nominatim:
+ Added addon to resolve coordinates with OpenStreetmap [annando]
+ phpmailer:
+ Fixed a bug that prevented notification mails being send [nupplaphil]
Closed Issues:
+ 9142, 9264
+
+Version 2020.09 (2020-09-20)
+ Friendica Core:
+ Updates to the translations: DE, EN GB, EN US, ES, FR, IT, NL, PL, RU, ZH_CN [translation teams]
+ Updates to the themes (all) [MrPetovan, tobiasd]
+ Updates to the documentation [annando, mpanhans, realkinetix, tobiasd]
+ General code cleanup and refactoring [annando, MrPetovan, nupplaphil]
+ Enhanced the API [annando]
+ Enhanced the processing of background jobs [annando]
+ Enhanced federation of activities [annando, vpzomtrrfrt]
+ Enhanced the user notifications[annando]
+ Enhanced database usage [annando, MrPetovan]
+ Enhanced ActivityPub support for forums [annando]
+ Enhanced the utilization of the cache [annando, MrPetovan]
+ Enhanced the performance of the daemon [annando]
+ Enhanced the communication with the directory servers [annando]
+ Enhanced the re-sharing of items [annando]
+ Enhanced sample lighttpd and nginx configs [MrPetovan, tobiasd]
+ Enhanced the checks for incoming postings using ActivityPub [annando, Roger Meyer]
+ Enhanced the import of RSS feeds by removing tracking pixels [annando]
+ Enhanced the speed of the full text search [annando]
+ Replaced library used for text completion [MrPetovan]
+ Fixed a problem that prevented recipients of direct messages to be selected [MrPetovan]
+ Fixed a problem that prevented new email contacts from being added [annando]
+ Fixed a problem with the console command search [tobiasd]
+ Fixed a problem during the search for contacts [annando]
+ Fixed a problem with the JOT of private notes [MrPetovan]
+ Fixed missing HTML encoding [MrPetovan]
+ Fixed a layout problem with the frio composer for new postings [MrPetovan]
+ Fixed some composer notices [nupplaphil]
+ Fixed a problem for empty preview data when importing feed posts [annando]
+ Fixed a problem with the pager on search result pages [annando]
+ Fixed some templates to show the correct un-/follow button for contacts [annando]
+ Fixed a problem with the generation of the Message-ID of notification emails [nupplaphil]
+ Added nodeinfo2 support [annando]
+ Added CSV export and import of blocked servers to the console [tobiasd]
+ Added new admin debug module for ActivityPub [MrPetovan]
+ Added the automatic determination of frequency to pull feeds [annando]
+ Added signed fetching from system users for ActivityPub [annando]
+ Added the discovery of new peers from contacts [annando]
+ Added the directory API endpoint [annando]
+ Added support for signed outbox requests [annando]
+ Added direction functionality for clarification of posting flow [annando]
+ Added the ability to set the database version [annando]
+ Added support for ActivityPub relay server [annando]
+ By default display of re-sharer information is now flattened [annando]
+ Removed some unused POCO functionality [annando]
+ Removed the unused rating functionality [annando]
+ Removed unneeded network request for local stuff [annando]
+ Removed some useless info messages [annando]
+ Reworked some additional features according to a user voting [MrPetovan]
+
+ Friendica Addons:
+ Updates to the translations: DE, EN GB, EN US, IT, NL, RU, ZH_CN [translation teams]
+ Updates to the docs [SpencerDub]
+ General code cleanup and maintenance [annando, MrPetovan]
+ blockbot:
+ added some "good" bots [annando]
+ forumdirectory:
+ fixed some SQL queries [MrPetovan]
+ phpmailer:
+ fixed a problem leading to double message ID headers [nupplaphil]
+ qcomment:
+ restructured the addon and fixed a bug preventing the addon from working [MrPetovan]
+
+ Closed Issues:
+ 2811, 4606, 5742, 5782, 7660, 8676, 8788, 8797, 8798, 8847, 8860,
+ 8874, 8882, 8885, 8906, 8914, 8922, 8928, 8929, 8935, 8940, 8941,
+ 8956, 8958, 8961, 8967, 8989, 8993, 8994, 8995, 8997, 8999, 9000,
+ 9004, 9013, 9015, 9051, 9064, 9065, 9072, 9081, 9090, 9091, 9099,
+ 9107, 9135, 9136, 9137, 9138, 9140, 9142, 9150, 9153, 9154, 9163,
+ 9164, 9172, 9182, 9192, 9193, 9204, 9210, 9229, 9231, 9246
+
+Version 2020.07-1 (2020-09-08)
+ Friendica Core
+ Fixed a problem that leaked sensitive information [Roger Meyer, MrPetovan]
+
+Version 2020.07 (2020-07-12)
+ Friendica Core:
+ Update to the translations: DE, EN GB, EN US, FR, ET, NL, PL, RU, ZH-CN [translation teams]
+ Updates to the themes (frio, vier) [MrPetovan]
+ Updated the shipped composer version, and the dependency list [annando, MrPetovan, tobiasd]
+ Updates to the documentation [MrPetovan]
+ General code refactoring and enhancements [AlfredSK, annando, MrPetovan]
+ Replace charged terms with "allowlist", "denylist" and "blocklist" [MrPetovan]
+ Enhanced the comment distribution in threads that involve diaspora*, AP and DFRN actors [annando]
+ Enhanced the profile probing mechanism [annando, MrPetovan]
+ Enhanced the post update process of the database [annando]
+ Enhanced the database performance [annando]
+ Enhanced ActivityPub attachment handling [MrPetovan]
+ Enhanced security of redirections [annando]
+ Enhanced database performance [annando]
+ Enhanced the handling of BBCode [pre] tags [MrPetovan]
+ Enhanced Markdown to BBCode conversion [MrPetovan]
+ Enhanced the speed of the network page [annando]
+ Fixed a problem recognising logins via the API [MrPetovan]
+ Fixed a problem with handling local diaspora* URLs [MrPetovan]
+ Fixed a problem with implicit mentions [annando]
+ Fixed a problem with the password reset token security [lynn-stephenson]
+ Fixed a problem with receiving non-public posts via ActivityPub [annando]
+ Fixed a problem with the photo endpoint of the API [MrPetovan]
+ Fixed a problem with pressing the ESC key in the frio-theme [MrPetovan]
+ Fixed a problem with the display if post categories [annando]
+ Fixed a problem with validation of feeds [annando]
+ Fixed a problem that prevented AP activities being fetched sometimes [annando]
+ Renamed the -q option of the console user delete command to -y [MrPetovan]
+ Added notification count to page title [MrPetovan]
+ Added handling of relative URLs during feed detection [MrPetovan]
+ Added entities [nupplaphil]
+
+ Friendica Addons:
+ Update to the translations (EN GB, NB NO, NL, PL, RU, ZH CN) [translation teams]
+ blockbot:
+ The list of accepted user agents was enhanced [annando]
+ Diaspora*:
+ Enhanced conntector settings [MrPetovan]
+ PHP Mailer SMTP:
+ Updated phpmailer version [dependabot]
+ showmore_dyn:
+ New addon to collapse long post depending on their actual height [wiwie]
+ twitter:
+ Enhaceed the handling of mobile twitter URLs [annando]
+ Enhanced the handling of quoted tweets [MrPetovan]
+ added HTML error code handling [MrPetovan]
+ various:
+ enhancements to the probe mechanism [MrPetovan]
+
+ Closed Issues:
+ 3084, 3884, 8287, 8314, 8374, 8400, 8425, 8432, 8458, 8470, 8477,
+ 8482, 8488, 8489, 8490, 8493, 8495, 8498, 8511, 8517, 8523, 8527,
+ 8551, 8553, 8560, 8564, 8565, 8568, 8578, 8586, 8593, 8606, 8610,
+ 8612, 8626, 8664, 8672, 8683, 8685, 8691, 8694, 8702, 8709, 8714,
+ 8717, 8722, 8726, 8732, 8736, 8743, 8744, 8746, 8756, 8766, 8769,
+ 8781, 8800, 8807, 8808, 8827, 8829, 8836, 8844, 8846, 8857, 8866
Version 2020.03 "Red Hot Poker" (2020-03-30)
Friendica Core:
@@ -61,7 +319,7 @@ Version 2020.03 "Red Hot Poker" (2020-03-30)
Update to the translations (CS, DE, FR, PL, RU, ZH-CN) [translation teams]
General code refactoring and enhancements [AndyHee, annando, MrPetovan, nupplaphil]
blockbot:
- Ensure that good agents are whitelisted [valvin1]
+ Ensure that good agents are allowlisted [valvin1]
markdown:
Addon to use Markdown while composing a posting was added [annando]
showmore:
@@ -617,7 +875,7 @@ Version 2018.09 (2018-09-23)
Version 2018.05 (2018-06-01)
Friendica Core:
Update to the translations (DE, EN-GB, EN-US, FI, IS, IT, NL, PL, RU, ZN CH) [translation teams]
- Update to the documentation [andyhee, annando, fabrixxm, M-arcus, MrPedovan, rudloff, tobiasd]
+ Update to the documentation [andyhee, annando, fabrixxm, M-arcus, MrPetovan, rudloff, tobiasd]
Enhancements to the DB handling [annando]
Enhancements to the relay system [annando]
Enhancements to the handling of URL that contain unicode characters [annando]
@@ -911,7 +1169,7 @@ Version 3.5.3 (2017-10-05)
Updates to the documentation [tobiasd]
Code revision and refactoring [Hypolite]
pumpio, twitter bridges adopted to new background mechanism [annando]
- Leistungsschutzrecht has a new source list, and a whitelist [annando]
+ Leistungsschutzrecht has a new source list, and an allowlist [annando]
retriever marked unsupported due to unwanted side-effects [annando]
Unicode emoji added [annando]
Enhancement to the general content filter [annando]
@@ -1373,7 +1631,7 @@ Version 3.3.1 (2014-11-06)
Set default location to empty for new users. Suppress warning on user creation (issue #1193) (fabrixxm)
Correctly build urls with queries (issue #1190) (fabrixxm)
Optionally use keywords in feed as post tags with "remote self" (annando)
- A blacklist of keywords to not use can be defined (annando)
+ A denylist of keywords to not use can be defined (annando)
"remote self" works also with Friendica and Diaspora contacts (annando)
Show exact post time after 12 hours (FX7)
Optionally redirect from non-SSL to SSL (annando)
diff --git a/CREDITS.txt b/CREDITS.txt
index 4f794e0d9..2f6897054 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -9,6 +9,7 @@ Aditoo
AgnesElisa
Albert
Alberto Díaz Tormo
+Aleksandr "M.O.Z.G" Dikov
Alex
Alexander An
Alexander Fortin
@@ -34,6 +35,7 @@ Athalbert
aweiher
axelt
balderino
+Balázs Úr
Beanow
beardyunixer
Beatriz Vital
@@ -54,6 +56,7 @@ Chris Case
Christian González
Christian M. Grube
Christian Vogeley
+Christian Wiwie
Cohan Robinson
Copiis Praeesse
CrystalStiletto
@@ -113,7 +116,6 @@ Hypolite Petovan
Ilmari
ImgBotApp
irhen
-Jak
Jakob
Jens Tautenhahn
jensp
@@ -121,6 +123,7 @@ Jeroen De Meerleer
jeroenpraat
Joan Bar
JOduMonT
+joe slam
Johannes Schwab
John Brazil
Jonatan Nyberg
@@ -131,6 +134,8 @@ julia.domagalska
Julio Cova
Karel
Karolina
+Kastal András
+Keenan Pepper
Keith Fernie
Klaus Weidenbach
Koyu Berteon
@@ -141,10 +146,11 @@ Leberwurscht
Leonard Lausen
Lionel Triay
loma-one
+loma1
Lorem Ipsum
Ludovic Grossard
+Lynn Stephenson
maase2
-Magdalena Gazda
Mai Anh Nguyen
Manuel Pérez Monís
Marcin Klessa
@@ -153,7 +159,6 @@ Marcus Müller
Marie Olive
Mariusz Pisz
marmor
-Marquis_de_Carabas
Martin Schmitt
Mateusz Mikos
Mats Sjöberg
@@ -169,9 +174,11 @@ Michal Šupler
Michalina
Mike Macgirvin
miqrogroove
+mpanhans
mytbk
nathilia-peirce
Nicola Spanti
+nobody
Olaf Conradi
Oliver
Olivier
@@ -208,6 +215,7 @@ repat
Ricardo Pereira
Rik 4
RJ Madsen
+Roger Meyer
Roland Häder
Rui Andrada
rwa
@@ -219,23 +227,22 @@ Samuli Valavuo
Sandro Santilli
Sebastian Egbers
sella
-Sennewood
Seth
Silke Meyer
Simon L'nu
Simó Albert i Beltran
softmetz
soko1
-SpencerDub
+Spencer Dub
St John Karp
Stanislav N.
Steffen K9
StefOfficiel
+steve jobs
Sveinn í Felli
Sven Anders
Sylke Vicious
Sylvain Lagacé
-szymon.filip
Sérgio Lima
Taekus
Tazman DeVille
@@ -263,7 +270,6 @@ U-SOUND\mike
ufic
Ulf Rompe
Unknown
-Valvin
Valvin A
Vasudev Kamath
Vasya Novikov
diff --git a/README.md b/README.md
index 1406678be..a7494d7f8 100644
--- a/README.md
+++ b/README.md
@@ -40,3 +40,7 @@ Have a look at the [installation documentation](doc/Install.md) for further info
|*Vier theme, desktop browser. Public timeline view.*|
|![Vier theme in desktop browser](images/screenshots/friendica-vier-community.png?raw=true "Vier theme in desktop browser")
|*Vier theme, desktop browser. Community post displayed.*|
+
+## Endorsements
+
+- [![Awesome Humane Tech](images/humane-tech-badge.svg)](https://github.com/humanetech-community/awesome-humane-tech) On August 12th 2020, Friendica was added to [the curated Awesome Humane Tech directory](https://github.com/humanetech-community/awesome-humane-tech) in [the "Fediverse" category](https://github.com/humanetech-community/awesome-humane-tech#fediverse).
diff --git a/VERSION b/VERSION
index 51ae1fea5..50ccf18a2 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2020.06-dev
+2021.03-dev
diff --git a/bin/.htaccess b/bin/.htaccess
new file mode 100644
index 000000000..716a932e1
--- /dev/null
+++ b/bin/.htaccess
@@ -0,0 +1,10 @@
+# This file prevents browser access to Friendica command-line scripts on Apache-powered web servers.
+# It isn't meant to be edited manually, please check the base Friendica folder for the .htaccess-dist file instead.
+
+
+ Require all denied
+
+
+ Order Allow,Deny
+ Deny from all
+
diff --git a/bin/auth_ejabberd.php b/bin/auth_ejabberd.php
index f00615f02..d6e20dfe1 100755
--- a/bin/auth_ejabberd.php
+++ b/bin/auth_ejabberd.php
@@ -51,9 +51,14 @@
*
*/
+if (php_sapi_name() !== 'cli') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
+ exit();
+}
+
use Dice\Dice;
use Friendica\App\Mode;
-use Friendica\Util\ExAuth;
+use Friendica\Security\ExAuth;
use Psr\Log\LoggerInterface;
if (sizeof($_SERVER["argv"]) == 0) {
@@ -80,6 +85,7 @@ $dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['auth_ejabb
$appMode = $dice->create(Mode::class);
if ($appMode->isNormal()) {
- $oAuth = new ExAuth();
+ /** @var ExAuth $oAuth */
+ $oAuth = $dice->create(ExAuth::class);
$oAuth->readStdin();
}
diff --git a/bin/composer.phar b/bin/composer.phar
index 57fce9576..4cb50a573 100755
Binary files a/bin/composer.phar and b/bin/composer.phar differ
diff --git a/bin/console.php b/bin/console.php
index 27522d855..4d5b4c79c 100755
--- a/bin/console.php
+++ b/bin/console.php
@@ -20,6 +20,11 @@
*
*/
+if (php_sapi_name() !== 'cli') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
+ exit();
+}
+
use Dice\Dice;
use Psr\Log\LoggerInterface;
diff --git a/bin/daemon.php b/bin/daemon.php
index c2ce05c8e..fcdd73566 100755
--- a/bin/daemon.php
+++ b/bin/daemon.php
@@ -23,11 +23,18 @@
* This script was taken from http://php.net/manual/en/function.pcntl-fork.php
*/
+if (php_sapi_name() !== 'cli') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
+ exit();
+}
+
use Dice\Dice;
+use Friendica\App\Mode;
use Friendica\Core\Logger;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface;
// Get options
@@ -59,6 +66,8 @@ if (DI::mode()->isInstall()) {
die("Friendica isn't properly installed yet.\n");
}
+DI::mode()->setExecutor(Mode::DAEMON);
+
DI::config()->load();
if (empty(DI::config()->get('system', 'pidfile'))) {
@@ -138,34 +147,35 @@ Logger::notice('Starting worker daemon.', ["pid" => $pid]);
if (!$foreground) {
echo "Starting worker daemon.\n";
- // Switch over to daemon mode.
- if ($pid = pcntl_fork()) {
- return; // Parent
- }
-
- fclose(STDIN); // Close all of the standard
-
- // Enabling this seem to block a running php process with 100% CPU usage when there is an outpout
- // fclose(STDOUT); // file descriptors as we
- // fclose(STDERR); // are running as a daemon.
-
DBA::disconnect();
+ // Fork a daemon process
+ $pid = pcntl_fork();
+ if ($pid == -1) {
+ echo "Daemon couldn't be forked.\n";
+ Logger::warning('Could not fork daemon');
+ exit(1);
+ } elseif ($pid) {
+ // The parent process continues here
+ echo 'Child process started with pid ' . $pid . ".\n";
+ Logger::notice('Child process started', ['pid' => $pid]);
+ file_put_contents($pidfile, $pid);
+ exit(0);
+ }
+
+ // We now are in the child process
register_shutdown_function('shutdown');
+ // Make the child the main process, detach it from the terminal
if (posix_setsid() < 0) {
return;
}
- if ($pid = pcntl_fork()) {
- return; // Parent
- }
+ // Closing all existing connections with the outside
+ fclose(STDIN);
- $pid = getmypid();
- file_put_contents($pidfile, $pid);
-
- // We lose the database connection upon forking
- DBA::reconnect();
+ // And now connect the database again
+ DBA::connect();
}
DI::config()->set('system', 'worker_daemon_mode', true);
@@ -185,7 +195,12 @@ while (true) {
$do_cron = true;
}
- Worker::spawnWorker($do_cron);
+ if ($do_cron || (!DI::process()->isMaxLoadReached() && Worker::entriesExists() && Worker::isReady())) {
+ Worker::spawnWorker($do_cron);
+ } else {
+ Logger::info('Cool down for 5 seconds', ['pid' => $pid]);
+ sleep(5);
+ }
if ($do_cron) {
// We force a reconnect of the database connection.
@@ -195,8 +210,9 @@ while (true) {
$last_cron = time();
}
- Logger::info("Sleeping", ["pid" => $pid]);
$start = time();
+ Logger::info("Sleeping", ["pid" => $pid, 'until' => gmdate(DateTimeFormat::MYSQL, $start + $wait_interval)]);
+
do {
$seconds = (time() - $start);
@@ -204,9 +220,14 @@ while (true) {
// Background: After jobs had been started, they often fork many workers.
// To not waste too much time, the sleep period increases.
$arg = (($seconds + 1) / ($wait_interval / 9)) + 1;
- $sleep = round(log10($arg) * 1000000, 0);
+ $sleep = min(1000000, round(log10($arg) * 1000000, 0));
usleep($sleep);
+ $pid = pcntl_waitpid(-1, $status, WNOHANG);
+ if ($pid > 0) {
+ Logger::info('Children quit via pcntl_waitpid', ['pid' => $pid, 'status' => $status]);
+ }
+
$timeout = ($seconds >= $wait_interval);
} while (!$timeout && !Worker::IPCJobsExists());
diff --git a/bin/dev/make_credits.py b/bin/dev/make_credits.py
index d89521390..be7a52e32 100755
--- a/bin/dev/make_credits.py
+++ b/bin/dev/make_credits.py
@@ -34,7 +34,7 @@ dontinclude = ['root', 'friendica', 'bavatar', 'tony baldwin', 'Taek', 'silke m'
path = os.path.abspath(argv[0].split('bin/dev/make_credits.py')[0])
print('> base directory is assumed to be: '+path)
# a place to store contributors
-contributors = ["Andi Stadler", "Ratten", "Vít Šesták 'v6ak'"]
+contributors = ["Andi Stadler", "Ratten", "Roger Meyer", "Vít Šesták 'v6ak'"]
# get the contributors
print('> getting contributors to the friendica core repository')
p = subprocess.Popen(['git', 'shortlog', '--no-merges', '-s'],
diff --git a/bin/testargs.php b/bin/testargs.php
index b7d7125f7..9aed35303 100644
--- a/bin/testargs.php
+++ b/bin/testargs.php
@@ -26,6 +26,10 @@
*
*/
+if (php_sapi_name() !== 'cli') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
+ exit();
+}
if (($_SERVER["argc"] > 1) && isset($_SERVER["argv"][1])) {
echo $_SERVER["argv"][1];
diff --git a/bin/wait-for-connection b/bin/wait-for-connection
index b6c03a670..de860e984 100755
--- a/bin/wait-for-connection
+++ b/bin/wait-for-connection
@@ -24,6 +24,11 @@
* Usage: php bin/wait-for-connection {HOST} {PORT} [{TIMEOUT}]
*/
+if (php_sapi_name() !== 'cli') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
+ exit();
+}
+
$timeout = 60;
switch ($argc) {
case 4:
diff --git a/bin/worker.php b/bin/worker.php
index 1b70a2095..52400a045 100755
--- a/bin/worker.php
+++ b/bin/worker.php
@@ -21,8 +21,14 @@
* Starts the background processing
*/
+if (php_sapi_name() !== 'cli') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
+ exit();
+}
+
use Dice\Dice;
use Friendica\App;
+use Friendica\App\Mode;
use Friendica\Core\Update;
use Friendica\Core\Worker;
use Friendica\DI;
@@ -53,6 +59,8 @@ $dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['worker']])
DI::init($dice);
$a = DI::app();
+DI::mode()->setExecutor(Mode::WORKER);
+
// Check the database structure and possibly fixes it
Update::check($a->getBasePath(), true, DI::mode());
@@ -76,4 +84,4 @@ Worker::processQueue($run_cron);
Worker::unclaimProcess();
-Worker::endProcess();
+DI::process()->end();
diff --git a/boot.php b/boot.php
index a070e103e..1c5b4c168 100644
--- a/boot.php
+++ b/boot.php
@@ -38,7 +38,7 @@ use Friendica\Util\DateTimeFormat;
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Red Hot Poker');
-define('FRIENDICA_VERSION', '2020.06-dev');
+define('FRIENDICA_VERSION', '2021.03-dev');
define('DFRN_PROTOCOL_VERSION', '2.23');
define('NEW_UPDATE_ROUTINE_VERSION', 1170);
@@ -201,6 +201,7 @@ define('PRIORITY_HIGH', 20);
define('PRIORITY_MEDIUM', 30);
define('PRIORITY_LOW', 40);
define('PRIORITY_NEGLIGIBLE', 50);
+define('PRIORITIES', [PRIORITY_CRITICAL, PRIORITY_HIGH, PRIORITY_MEDIUM, PRIORITY_LOW, PRIORITY_NEGLIGIBLE]);
/* @}*/
/**
@@ -253,10 +254,10 @@ function public_contact()
if (!$public_contact_id && !empty($_SESSION['authenticated'])) {
if (!empty($_SESSION['my_address'])) {
// Local user
- $public_contact_id = intval(Contact::getIdForURL($_SESSION['my_address'], 0, true));
+ $public_contact_id = intval(Contact::getIdForURL($_SESSION['my_address'], 0, false));
} elseif (!empty($_SESSION['visitor_home'])) {
// Remote user
- $public_contact_id = intval(Contact::getIdForURL($_SESSION['visitor_home'], 0, true));
+ $public_contact_id = intval(Contact::getIdForURL($_SESSION['visitor_home'], 0, false));
}
} elseif (empty($_SESSION['authenticated'])) {
$public_contact_id = false;
@@ -266,7 +267,7 @@ function public_contact()
}
/**
- * Returns contact id of authenticated site visitor or false
+ * Returns public contact id of authenticated site visitor or false
*
* @return int|bool visitor_id or false
*/
@@ -382,38 +383,6 @@ function is_site_admin()
return local_user() && $admin_email && in_array($a->user['email'] ?? '', $adminlist);
}
-function explode_querystring($query)
-{
- $arg_st = strpos($query, '?');
- if ($arg_st !== false) {
- $base = substr($query, 0, $arg_st);
- $arg_st += 1;
- } else {
- $base = '';
- $arg_st = 0;
- }
-
- $args = explode('&', substr($query, $arg_st));
- foreach ($args as $k => $arg) {
- /// @TODO really compare type-safe here?
- if ($arg === '') {
- unset($args[$k]);
- }
- }
- $args = array_values($args);
-
- if (!$base) {
- $base = $args[0];
- unset($args[0]);
- $args = array_values($args);
- }
-
- return [
- 'base' => $base,
- 'args' => $args,
- ];
-}
-
/**
* Returns the complete URL of the current page, e.g.: http(s)://something.com/network
*
diff --git a/composer.json b/composer.json
index 20cbe46a7..c24292454 100644
--- a/composer.json
+++ b/composer.json
@@ -34,34 +34,39 @@
"league/html-to-markdown": "^4.8",
"level-2/dice": "^4",
"lightopenid/lightopenid": "dev-master",
+ "matriphe/iso-639": "^1.2",
"michelf/php-markdown": "^1.7",
"mobiledetect/mobiledetectlib": "^2.8",
"monolog/monolog": "^1.25",
"nikic/fast-route": "^1.3",
"paragonie/hidden-string": "^1.0",
+ "patrickschur/language-detection": "^3.4",
"pear/console_table": "^1.3",
- "pear/text_languagedetect": "1.*",
+ "phpseclib/phpseclib": "^2.0",
"pragmarx/google2fa": "^5.0",
"pragmarx/recovery": "^0.1.0",
"psr/container": "^1.0",
"seld/cli-prompt": "^1.0",
"smarty/smarty": "^3.1",
+ "xemlock/htmlpurifier-html5": "^0.1.11",
"fxp/composer-asset-plugin": "^1.4",
"bower-asset/base64": "^1.0",
"bower-asset/chart-js": "^2.8",
"bower-asset/dompurify": "^1.0",
+ "bower-asset/fork-awesome": "^1.1",
"bower-asset/vue": "^2.6",
+ "npm-asset/cropperjs": "1.2.2",
"npm-asset/es-jquery-sortable": "^0.9.13",
+ "npm-asset/fullcalendar": "^3.10",
+ "npm-asset/imagesloaded": "4.1.4",
"npm-asset/jquery": "^2.0",
"npm-asset/jquery-colorbox": "^1.6",
"npm-asset/jquery-datetimepicker": "^2.5",
"npm-asset/jgrowl": "^1.4",
"npm-asset/moment": "^2.24",
- "npm-asset/fullcalendar": "^3.10",
- "npm-asset/cropperjs": "1.2.2",
- "npm-asset/imagesloaded": "4.1.4",
- "npm-asset/typeahead.js": "^0.11.1",
- "bower-asset/fork-awesome": "^1.1"
+ "npm-asset/perfect-scrollbar": "0.6.16",
+ "npm-asset/textcomplete": "^0.18.2",
+ "npm-asset/typeahead.js": "^0.11.1"
},
"repositories": [
{
@@ -74,14 +79,10 @@
"Friendica\\": "src/",
"Friendica\\Addon\\": "addon/"
},
- "psr-0": {
- "": "library/"
- },
"files": [
"include/conversation.php",
"include/dba.php",
"include/enotify.php",
- "include/items.php",
"boot.php"
]
},
@@ -91,6 +92,9 @@
}
},
"config": {
+ "platform": {
+ "php": "7.0"
+ },
"autoloader-suffix": "Friendica",
"optimize-autoloader": true,
"preferred-install": "dist",
@@ -124,7 +128,7 @@
"mikey179/vfsstream": "^1.6",
"mockery/mockery": "^1.2",
"johnkary/phpunit-speedtrap": "1.1",
- "jakub-onderka/php-parallel-lint": "^1.0"
+ "php-parallel-lint/php-parallel-lint": "^1.2"
},
"scripts": {
"test": "phpunit"
diff --git a/composer.lock b/composer.lock
index 52f1e80a3..779c3b51b 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "0d0fe0cafbe7bd050b41a5c9e96dba5f",
+ "content-hash": "7d8031c9b95fd94d8872804759a26509",
"packages": [
{
"name": "asika/simple-console",
@@ -87,16 +87,16 @@
},
{
"name": "bower-asset/Chart-js",
- "version": "v2.8.0",
+ "version": "v2.9.3",
"source": {
"type": "git",
"url": "https://github.com/chartjs/Chart.js.git",
- "reference": "947d8a7ccfbfc76dd9d384ea75436fa4a7aeefb1"
+ "reference": "06f73dc3590084b2c464bf08189c7aee2b6b92d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chartjs/Chart.js/zipball/947d8a7ccfbfc76dd9d384ea75436fa4a7aeefb1",
- "reference": "947d8a7ccfbfc76dd9d384ea75436fa4a7aeefb1",
+ "url": "https://api.github.com/repos/chartjs/Chart.js/zipball/06f73dc3590084b2c464bf08189c7aee2b6b92d2",
+ "reference": "06f73dc3590084b2c464bf08189c7aee2b6b92d2",
"shasum": ""
},
"type": "bower-asset-library",
@@ -115,20 +115,20 @@
"MIT"
],
"description": "Simple HTML5 charts using the canvas element.",
- "time": "2019-03-14T13:03:00+00:00"
+ "time": "2019-11-14T18:37:30+00:00"
},
{
"name": "bower-asset/base64",
- "version": "1.0.2",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/davidchambers/Base64.js.git",
- "reference": "10f0e9990dab0a73009fc106ff2b88102a0a13cf"
+ "reference": "660b299aa4854843fd35d42b30eda9273125b9da"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/davidchambers/Base64.js/zipball/10f0e9990dab0a73009fc106ff2b88102a0a13cf",
- "reference": "10f0e9990dab0a73009fc106ff2b88102a0a13cf",
+ "url": "https://api.github.com/repos/davidchambers/Base64.js/zipball/660b299aa4854843fd35d42b30eda9273125b9da",
+ "reference": "660b299aa4854843fd35d42b30eda9273125b9da",
"shasum": ""
},
"type": "bower-asset-library",
@@ -146,7 +146,7 @@
"WTFPL"
],
"description": "Base64 encoding and decoding",
- "time": "2019-02-12T17:19:36+00:00"
+ "time": "2019-11-02T20:07:47+00:00"
},
{
"name": "bower-asset/dompurify",
@@ -239,16 +239,16 @@
},
{
"name": "bower-asset/vue",
- "version": "v2.6.10",
+ "version": "v2.6.11",
"source": {
"type": "git",
"url": "https://github.com/vuejs/vue.git",
- "reference": "e90cc60c4718a69e2c919275a999b7370141f3bf"
+ "reference": "ec78fc8b6d03e59da669be1adf4b4b5abf670a34"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vuejs/vue/zipball/e90cc60c4718a69e2c919275a999b7370141f3bf",
- "reference": "e90cc60c4718a69e2c919275a999b7370141f3bf",
+ "url": "https://api.github.com/repos/vuejs/vue/zipball/ec78fc8b6d03e59da669be1adf4b4b5abf670a34",
+ "reference": "ec78fc8b6d03e59da669be1adf4b4b5abf670a34",
"shasum": ""
},
"type": "bower-asset-library"
@@ -394,21 +394,24 @@
},
{
"name": "ezyang/htmlpurifier",
- "version": "v4.7.0",
+ "version": "v4.13.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "ae1828d955112356f7677c465f94f7deb7d27a40"
+ "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40",
- "reference": "ae1828d955112356f7677c465f94f7deb7d27a40",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75",
+ "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
+ "require-dev": {
+ "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
+ },
"type": "library",
"autoload": {
"psr-0": {
@@ -416,11 +419,14 @@
},
"files": [
"library/HTMLPurifier.composer.php"
+ ],
+ "exclude-from-classmap": [
+ "/library/HTMLPurifier/Language/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "LGPL-2.1-or-later"
],
"authors": [
{
@@ -434,7 +440,7 @@
"keywords": [
"html"
],
- "time": "2015-08-05T01:03:42+00:00"
+ "time": "2020-06-29T00:56:53+00:00"
},
{
"name": "friendica/json-ld",
@@ -541,27 +547,29 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.3.3",
+ "version": "6.5.5",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
+ "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
- "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
+ "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
"shasum": ""
},
"require": {
+ "ext-json": "*",
"guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.4",
- "php": ">=5.5"
+ "guzzlehttp/psr7": "^1.6.1",
+ "php": ">=5.5",
+ "symfony/polyfill-intl-idn": "^1.17.0"
},
"require-dev": {
"ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
- "psr/log": "^1.0"
+ "psr/log": "^1.1"
},
"suggest": {
"psr/log": "Required for using the Log middleware"
@@ -569,16 +577,16 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "6.3-dev"
+ "dev-master": "6.5-dev"
}
},
"autoload": {
- "files": [
- "src/functions_include.php"
- ],
"psr-4": {
"GuzzleHttp\\": "src/"
- }
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -602,7 +610,7 @@
"rest",
"web service"
],
- "time": "2018-04-22T15:46:56+00:00"
+ "time": "2020-06-16T21:01:06+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -792,16 +800,16 @@
},
{
"name": "level-2/dice",
- "version": "4.0.1",
+ "version": "4.0.2",
"source": {
"type": "git",
"url": "https://github.com/Level-2/Dice.git",
- "reference": "e631f110f0520294fec902814c61cac26566023c"
+ "reference": "b9336d9200d0165c31e982374dc5d8d2552807bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Level-2/Dice/zipball/e631f110f0520294fec902814c61cac26566023c",
- "reference": "e631f110f0520294fec902814c61cac26566023c",
+ "url": "https://api.github.com/repos/Level-2/Dice/zipball/b9336d9200d0165c31e982374dc5d8d2552807bc",
+ "reference": "b9336d9200d0165c31e982374dc5d8d2552807bc",
"shasum": ""
},
"require": {
@@ -834,7 +842,7 @@
"di",
"ioc"
],
- "time": "2019-05-01T12:55:36+00:00"
+ "time": "2020-01-28T13:47:49+00:00"
},
{
"name": "lightopenid/lightopenid",
@@ -870,22 +878,69 @@
"time": "2013-10-27T16:25:49+00:00"
},
{
- "name": "michelf/php-markdown",
- "version": "1.8.0",
+ "name": "matriphe/iso-639",
+ "version": "1.2",
"source": {
"type": "git",
- "url": "https://github.com/michelf/php-markdown.git",
- "reference": "01ab082b355bf188d907b9929cd99b2923053495"
+ "url": "https://github.com/matriphe/php-iso-639.git",
+ "reference": "0245d844daeefdd22a54b47103ffdb0e03c323e1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/michelf/php-markdown/zipball/01ab082b355bf188d907b9929cd99b2923053495",
- "reference": "01ab082b355bf188d907b9929cd99b2923053495",
+ "url": "https://api.github.com/repos/matriphe/php-iso-639/zipball/0245d844daeefdd22a54b47103ffdb0e03c323e1",
+ "reference": "0245d844daeefdd22a54b47103ffdb0e03c323e1",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matriphe\\ISO639\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Muhammad Zamroni",
+ "email": "halo@matriphe.com"
+ }
+ ],
+ "description": "PHP library to convert ISO-639-1 code to language name.",
+ "keywords": [
+ "639",
+ "iso",
+ "iso-639",
+ "lang",
+ "language",
+ "laravel"
+ ],
+ "time": "2017-07-19T15:11:19+00:00"
+ },
+ {
+ "name": "michelf/php-markdown",
+ "version": "1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/c83178d49e372ca967d1a8c77ae4e051b3a3c75c",
+ "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
+ "require-dev": {
+ "phpunit/phpunit": ">=4.3 <5.8"
+ },
"type": "library",
"autoload": {
"psr-4": {
@@ -913,7 +968,7 @@
"keywords": [
"markdown"
],
- "time": "2018-01-15T00:49:33+00:00"
+ "time": "2019-12-02T02:32:27+00:00"
},
{
"name": "mobiledetect/mobiledetectlib",
@@ -969,16 +1024,16 @@
},
{
"name": "monolog/monolog",
- "version": "1.25.1",
+ "version": "1.25.4",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "70e65a5470a42cfec1a7da00d30edb6e617e8dcf"
+ "reference": "3022efff205e2448b560c833c6fbbf91c3139168"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/70e65a5470a42cfec1a7da00d30edb6e617e8dcf",
- "reference": "70e65a5470a42cfec1a7da00d30edb6e617e8dcf",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/3022efff205e2448b560c833c6fbbf91c3139168",
+ "reference": "3022efff205e2448b560c833c6fbbf91c3139168",
"shasum": ""
},
"require": {
@@ -992,11 +1047,10 @@
"aws/aws-sdk-php": "^2.4.9 || ^3.0",
"doctrine/couchdb": "~1.0@dev",
"graylog2/gelf-php": "~1.0",
- "jakub-onderka/php-parallel-lint": "0.9",
"php-amqplib/php-amqplib": "~2.4",
"php-console/php-console": "^3.1.3",
+ "php-parallel-lint/php-parallel-lint": "^1.0",
"phpunit/phpunit": "~4.5",
- "phpunit/phpunit-mock-objects": "2.3.0",
"ruflin/elastica": ">=0.90 <3.0",
"sentry/sentry": "^0.13",
"swiftmailer/swiftmailer": "^5.3|^6.0"
@@ -1043,7 +1097,7 @@
"logging",
"psr-3"
],
- "time": "2019-09-06T13:49:17+00:00"
+ "time": "2020-05-22T07:31:27+00:00"
},
{
"name": "nikic/fast-route",
@@ -1270,12 +1324,69 @@
"time": "2017-07-06T13:46:38+00:00"
},
{
- "name": "npm-asset/fullcalendar",
- "version": "3.10.1",
+ "name": "npm-asset/eventemitter3",
+ "version": "2.0.3",
"dist": {
"type": "tar",
- "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.1.tgz",
- "shasum": "cca3f9a2656a7e978a3f3facb7f35934a91185db"
+ "url": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+ "shasum": "b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
+ },
+ "type": "npm-asset-library",
+ "extra": {
+ "npm-asset-bugs": {
+ "url": "https://github.com/primus/eventemitter3/issues"
+ },
+ "npm-asset-main": "index.js",
+ "npm-asset-directories": [],
+ "npm-asset-repository": {
+ "type": "git",
+ "url": "git://github.com/primus/eventemitter3.git"
+ },
+ "npm-asset-scripts": {
+ "build": "mkdir -p umd && browserify index.js -s EventEmitter3 | uglifyjs -m -o umd/eventemitter3.min.js",
+ "benchmark": "find benchmarks/run -name '*.js' -exec benchmarks/start.sh {} \\;",
+ "test": "nyc --reporter=html --reporter=text mocha",
+ "test-browser": "zuul -- test.js",
+ "prepublish": "npm run build",
+ "sync": "node versions.js"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Arnout Kazemier"
+ }
+ ],
+ "description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.",
+ "homepage": "https://github.com/primus/eventemitter3#readme",
+ "keywords": [
+ "EventEmitter",
+ "EventEmitter2",
+ "EventEmitter3",
+ "Events",
+ "addEventListener",
+ "addListener",
+ "emit",
+ "emits",
+ "emitter",
+ "event",
+ "once",
+ "pub/sub",
+ "publish",
+ "reactor",
+ "subscribe"
+ ],
+ "time": "2017-03-31T14:51:09+00:00"
+ },
+ {
+ "name": "npm-asset/fullcalendar",
+ "version": "3.10.2",
+ "dist": {
+ "type": "tar",
+ "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.2.tgz",
+ "shasum": "9b1ba84bb02803621b761d1bba91a4f18affafb7"
},
"type": "npm-asset-library",
"extra": {
@@ -1313,7 +1424,7 @@
"full-sized",
"jquery-plugin"
],
- "time": "2019-08-10T16:05:46+00:00"
+ "time": "2020-05-19T03:44:55+00:00"
},
{
"name": "npm-asset/imagesloaded",
@@ -1647,11 +1758,11 @@
},
{
"name": "npm-asset/moment",
- "version": "2.24.0",
+ "version": "2.26.0",
"dist": {
"type": "tar",
- "url": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "shasum": "0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
+ "url": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
+ "shasum": "5e1f82c6bafca6e83e808b30c8705eed0dcbd39a"
},
"type": "npm-asset-library",
"extra": {
@@ -1665,8 +1776,12 @@
"url": "git+https://github.com/moment/moment.git"
},
"npm-asset-scripts": {
- "typescript-test": "tsc --project typing-tests",
+ "ts3.1-typescript-test": "cross-env node_modules/typescript3/bin/tsc --project ts3.1-typing-tests",
+ "typescript-test": "cross-env node_modules/typescript/bin/tsc --project typing-tests",
"test": "grunt test",
+ "eslint": "eslint Gruntfile.js tasks src",
+ "prettier-check": "prettier --check Gruntfile.js tasks src",
+ "prettier-fmt": "prettier --write Gruntfile.js tasks src",
"coverage": "nyc npm test && nyc report",
"coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
},
@@ -1709,7 +1824,7 @@
}
],
"description": "Parse, validate, manipulate, and display dates",
- "homepage": "http://momentjs.com",
+ "homepage": "https://momentjs.com",
"keywords": [
"date",
"ender",
@@ -1721,20 +1836,78 @@
"time",
"validate"
],
- "time": "2019-01-21T21:10:34+00:00"
+ "time": "2020-05-20T06:46:22+00:00"
+ },
+ {
+ "name": "npm-asset/perfect-scrollbar",
+ "version": "0.6.16",
+ "dist": {
+ "type": "tar",
+ "url": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-0.6.16.tgz",
+ "shasum": "b1d61a5245cf3962bb9a8407a3fc669d923212fc"
+ },
+ "type": "npm-asset-library",
+ "extra": {
+ "npm-asset-bugs": {
+ "url": "https://github.com/noraesae/perfect-scrollbar/issues"
+ },
+ "npm-asset-files": [
+ "dist",
+ "src",
+ "index.js",
+ "jquery.js",
+ "perfect-scrollbar.d.ts"
+ ],
+ "npm-asset-main": "./index.js",
+ "npm-asset-directories": [],
+ "npm-asset-repository": {
+ "type": "git",
+ "url": "git+https://github.com/noraesae/perfect-scrollbar.git"
+ },
+ "npm-asset-scripts": {
+ "test": "gulp",
+ "before-deploy": "gulp && gulp compress",
+ "release": "rm -rf dist && gulp && npm publish"
+ },
+ "npm-asset-engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Hyunje Jun",
+ "email": "me@noraesae.net"
+ },
+ {
+ "name": "Hyunje Jun",
+ "email": "me@noraesae.net"
+ }
+ ],
+ "description": "Minimalistic but perfect custom scrollbar plugin",
+ "homepage": "https://github.com/noraesae/perfect-scrollbar#readme",
+ "keywords": [
+ "frontend",
+ "jquery-plugin",
+ "scroll",
+ "scrollbar"
+ ],
+ "time": "2017-01-10T01:03:05+00:00"
},
{
"name": "npm-asset/php-date-formatter",
- "version": "v1.3.5",
+ "version": "v1.3.6",
"source": {
"type": "git",
"url": "https://github.com/kartik-v/php-date-formatter.git",
- "reference": "d842e1c4e6a8d6108017b726321c305bb5ae4fb5"
+ "reference": "514a53660b0d69439236fd3cbc3f41512adb00a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/kartik-v/php-date-formatter/zipball/d842e1c4e6a8d6108017b726321c305bb5ae4fb5",
- "reference": "d842e1c4e6a8d6108017b726321c305bb5ae4fb5",
+ "url": "https://api.github.com/repos/kartik-v/php-date-formatter/zipball/514a53660b0d69439236fd3cbc3f41512adb00a0",
+ "reference": "514a53660b0d69439236fd3cbc3f41512adb00a0",
"shasum": ""
},
"type": "npm-asset-library",
@@ -1759,7 +1932,101 @@
],
"description": "A Javascript datetime formatting and manipulation library using PHP date-time formats.",
"homepage": "https://github.com/kartik-v/php-date-formatter",
- "time": "2018-07-13T06:56:46+00:00"
+ "time": "2020-04-14T10:16:32+00:00"
+ },
+ {
+ "name": "npm-asset/textarea-caret",
+ "version": "3.1.0",
+ "dist": {
+ "type": "tar",
+ "url": "https://registry.npmjs.org/textarea-caret/-/textarea-caret-3.1.0.tgz",
+ "shasum": "5d5a35bb035fd06b2ff0e25d5359e97f2655087f"
+ },
+ "type": "npm-asset-library",
+ "extra": {
+ "npm-asset-bugs": {
+ "url": "https://github.com/component/textarea-caret-position/issues"
+ },
+ "npm-asset-files": [
+ "index.js"
+ ],
+ "npm-asset-main": "index.js",
+ "npm-asset-directories": [],
+ "npm-asset-repository": {
+ "type": "git",
+ "url": "git+https://github.com/component/textarea-caret-position.git"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "description": "(x, y) coordinates of the caret in a textarea or input type='text'",
+ "homepage": "https://github.com/component/textarea-caret-position#readme",
+ "keywords": [
+ "caret",
+ "position",
+ "textarea"
+ ],
+ "time": "2018-02-20T06:11:03+00:00"
+ },
+ {
+ "name": "npm-asset/textcomplete",
+ "version": "0.18.2",
+ "dist": {
+ "type": "tar",
+ "url": "https://registry.npmjs.org/textcomplete/-/textcomplete-0.18.2.tgz",
+ "shasum": "de0d806567102f7e32daffcbcc3db05af1515eb5"
+ },
+ "require": {
+ "npm-asset/eventemitter3": ">=2.0.3,<3.0.0",
+ "npm-asset/textarea-caret": ">=3.0.1,<4.0.0",
+ "npm-asset/undate": ">=0.2.3,<0.3.0"
+ },
+ "type": "npm-asset-library",
+ "extra": {
+ "npm-asset-bugs": {
+ "url": "https://github.com/yuku-t/textcomplete/issues"
+ },
+ "npm-asset-main": "lib/index.js",
+ "npm-asset-directories": [],
+ "npm-asset-repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/yuku-t/textcomplete.git"
+ },
+ "npm-asset-scripts": {
+ "build": "yarn run clean && run-p build:*",
+ "build:dist": "webpack && webpack --env=min && run-p print-dist-gz-size",
+ "build:docs": "run-p build:docs:*",
+ "build:docs:html": "webpack --config webpack.doc.config.js && pug -o docs src/doc/index.pug",
+ "build:docs:md": "documentation build src/*.js -f md -o doc/api.md",
+ "build:lib": "babel src -d lib -s && for js in src/*.js; do cp $js lib/${js##*/}.flow; done",
+ "clean": "rm -fr dist docs lib",
+ "format": "prettier --no-semi --trailing-comma all --write 'src/*.js' 'test/**/*.js'",
+ "gh-release": "npm pack textcomplete && gh-release -a textcomplete-$(cat package.json|jq -r .version).tgz",
+ "opener": "wait-on http://localhost:8082 && opener http://localhost:8082",
+ "print-dist-gz-size": "printf 'dist/textcomplete.min.js.gz: %d bytes\\n' \"$(gzip -9kc dist/textcomplete.min.js | wc -c)\"",
+ "start": "run-p watch opener",
+ "test": "run-p test:*",
+ "test:bundlesize": "yarn run build:dist && bundlesize",
+ "test:e2e": "NODE_ENV=test karma start --single-run",
+ "test:lint": "eslint src/*.js test/**/*.js",
+ "test:typecheck": "flow check",
+ "watch": "run-p watch:*",
+ "watch:webpack": "webpack-dev-server --config webpack.doc.config.js",
+ "watch:pug": "pug -o docs --watch src/doc/index.pug"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Yuku Takahashi"
+ }
+ ],
+ "description": "Autocomplete for textarea elements",
+ "homepage": "https://github.com/yuku-t/textcomplete#readme",
+ "time": "2020-06-10T06:11:00+00:00"
},
{
"name": "npm-asset/typeahead.js",
@@ -1813,18 +2080,60 @@
],
"time": "2015-04-27T04:03:42+00:00"
},
+ {
+ "name": "npm-asset/undate",
+ "version": "0.2.4",
+ "dist": {
+ "type": "tar",
+ "url": "https://registry.npmjs.org/undate/-/undate-0.2.4.tgz",
+ "shasum": "ccb2a8cf38edc035d1006fcb2909c4c6024a8400"
+ },
+ "type": "npm-asset-library",
+ "extra": {
+ "npm-asset-bugs": {
+ "url": "https://github.com/yuku-t/undate/issues"
+ },
+ "npm-asset-main": "lib/index.js",
+ "npm-asset-directories": [],
+ "npm-asset-repository": {
+ "type": "git",
+ "url": "git+https://github.com/yuku-t/undate.git"
+ },
+ "npm-asset-scripts": {
+ "build": "babel src -d lib && for js in src/*.js; do cp $js lib/${js##*/}.flow; done",
+ "test": "run-p test:*",
+ "test:eslint": "eslint src/*.js test/*.js",
+ "test:flow": "flow check",
+ "test:karma": "karma start --single-run"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Yuku Takahashi"
+ }
+ ],
+ "description": "Undoable update for HTMLTextAreaElement",
+ "homepage": "https://github.com/yuku-t/undate#readme",
+ "keywords": [
+ "textarea"
+ ],
+ "time": "2018-01-24T10:49:39+00:00"
+ },
{
"name": "paragonie/certainty",
- "version": "v2.5.0",
+ "version": "v2.6.1",
"source": {
"type": "git",
"url": "https://github.com/paragonie/certainty.git",
- "reference": "cc39b91595e577fdff6128d7ce787892bd117274"
+ "reference": "b0068bc1e5605bd2ebe1ba906f2426d5df123944"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/certainty/zipball/cc39b91595e577fdff6128d7ce787892bd117274",
- "reference": "cc39b91595e577fdff6128d7ce787892bd117274",
+ "url": "https://api.github.com/repos/paragonie/certainty/zipball/b0068bc1e5605bd2ebe1ba906f2426d5df123944",
+ "reference": "b0068bc1e5605bd2ebe1ba906f2426d5df123944",
"shasum": ""
},
"require": {
@@ -1833,7 +2142,7 @@
"guzzlehttp/guzzle": "^6",
"paragonie/constant_time_encoding": "^1|^2",
"paragonie/sodium_compat": "^1.11",
- "php": "^5.5|^7"
+ "php": "^5.5|^7|^8"
},
"require-dev": {
"composer/composer": "^1",
@@ -1873,28 +2182,28 @@
"ssl",
"tls"
],
- "time": "2019-09-27T22:26:33+00:00"
+ "time": "2020-01-02T00:55:01+00:00"
},
{
"name": "paragonie/constant_time_encoding",
- "version": "v2.2.3",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/constant_time_encoding.git",
- "reference": "55af0dc01992b4d0da7f6372e2eac097bbbaffdb"
+ "reference": "47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/55af0dc01992b4d0da7f6372e2eac097bbbaffdb",
- "reference": "55af0dc01992b4d0da7f6372e2eac097bbbaffdb",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2",
+ "reference": "47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2",
"shasum": ""
},
"require": {
- "php": "^7"
+ "php": "^7|^8"
},
"require-dev": {
"phpunit/phpunit": "^6|^7",
- "vimeo/psalm": "^1|^2"
+ "vimeo/psalm": "^1|^2|^3"
},
"type": "library",
"autoload": {
@@ -1935,7 +2244,7 @@
"hex2bin",
"rfc4648"
],
- "time": "2019-01-03T20:26:31+00:00"
+ "time": "2019-11-06T19:20:29+00:00"
},
{
"name": "paragonie/hidden-string",
@@ -2033,16 +2342,16 @@
},
{
"name": "paragonie/sodium_compat",
- "version": "v1.11.1",
+ "version": "v1.13.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/sodium_compat.git",
- "reference": "a9f968bc99485f85f9303a8524c3485a7e87bc15"
+ "reference": "bbade402cbe84c69b718120911506a3aa2bae653"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a9f968bc99485f85f9303a8524c3485a7e87bc15",
- "reference": "a9f968bc99485f85f9303a8524c3485a7e87bc15",
+ "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/bbade402cbe84c69b718120911506a3aa2bae653",
+ "reference": "bbade402cbe84c69b718120911506a3aa2bae653",
"shasum": ""
},
"require": {
@@ -2050,7 +2359,7 @@
"php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8"
},
"require-dev": {
- "phpunit/phpunit": "^3|^4|^5"
+ "phpunit/phpunit": "^3|^4|^5|^6|^7"
},
"suggest": {
"ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.",
@@ -2111,7 +2420,53 @@
"secret-key cryptography",
"side-channel resistant"
],
- "time": "2019-09-12T12:05:58+00:00"
+ "time": "2020-03-20T21:48:09+00:00"
+ },
+ {
+ "name": "patrickschur/language-detection",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/patrickschur/language-detection.git",
+ "reference": "95b55109177d5c4bd6b1bec6e8835cd0df36ef5f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/patrickschur/language-detection/zipball/95b55109177d5c4bd6b1bec6e8835cd0df36ef5f",
+ "reference": "95b55109177d5c4bd6b1bec6e8835cd0df36ef5f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "LanguageDetection\\": "src/LanguageDetection"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Patrick Schur",
+ "email": "patrick_schur@outlook.de"
+ }
+ ],
+ "description": "A language detection library for PHP. Detects the language from a given text string.",
+ "homepage": "https://github.com/patrickschur/language-detection",
+ "keywords": [
+ "detect",
+ "detection",
+ "language"
+ ],
+ "time": "2018-09-19T21:45:51+00:00"
},
{
"name": "pear/console_table",
@@ -2169,48 +2524,109 @@
"time": "2018-01-25T20:47:17+00:00"
},
{
- "name": "pear/text_languagedetect",
- "version": "v1.0.0",
+ "name": "phpseclib/phpseclib",
+ "version": "2.0.29",
"source": {
"type": "git",
- "url": "https://github.com/pear/Text_LanguageDetect.git",
- "reference": "bb9ff6f4970f686fac59081e916b456021fe7ba6"
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "497856a8d997f640b4a516062f84228a772a48a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pear/Text_LanguageDetect/zipball/bb9ff6f4970f686fac59081e916b456021fe7ba6",
- "reference": "bb9ff6f4970f686fac59081e916b456021fe7ba6",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/497856a8d997f640b4a516062f84228a772a48a8",
+ "reference": "497856a8d997f640b4a516062f84228a772a48a8",
"shasum": ""
},
+ "require": {
+ "php": ">=5.3.3"
+ },
"require-dev": {
- "phpunit/phpunit": "*"
+ "phing/phing": "~2.7",
+ "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
+ "squizlabs/php_codesniffer": "~2.0"
},
"suggest": {
- "ext-mbstring": "May require the mbstring PHP extension"
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
},
"type": "library",
"autoload": {
- "psr-0": {
- "Text": "./"
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib\\": "phpseclib/"
}
},
"notification-url": "https://packagist.org/downloads/",
- "include-path": [
- "./"
- ],
"license": [
- "BSD-2-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Nicholas Pisarro",
- "email": "taak@php.net",
- "role": "Lead"
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
}
],
- "description": "Identify human languages from text samples",
- "homepage": "http://pear.php.net/package/Text_LanguageDetect",
- "time": "2017-03-02T16:14:08+00:00"
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-08T04:24:43+00:00"
},
{
"name": "pragmarx/google2fa",
@@ -2542,16 +2958,16 @@
},
{
"name": "psr/log",
- "version": "1.1.0",
+ "version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
- "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
"shasum": ""
},
"require": {
@@ -2560,7 +2976,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -2585,7 +3001,7 @@
"psr",
"psr-3"
],
- "time": "2018-11-20T15:27:04+00:00"
+ "time": "2020-03-23T09:12:05+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -2677,21 +3093,25 @@
},
{
"name": "smarty/smarty",
- "version": "v3.1.33",
+ "version": "v3.1.36",
"source": {
"type": "git",
"url": "https://github.com/smarty-php/smarty.git",
- "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f"
+ "reference": "fd148f7ade295014fff77f89ee3d5b20d9d55451"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/smarty-php/smarty/zipball/dd55b23121e55a3b4f1af90a707a6c4e5969530f",
- "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f",
+ "url": "https://api.github.com/repos/smarty-php/smarty/zipball/fd148f7ade295014fff77f89ee3d5b20d9d55451",
+ "reference": "fd148f7ade295014fff77f89ee3d5b20d9d55451",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
+ "require-dev": {
+ "phpunit/phpunit": "6.4.1",
+ "smarty/smarty-lexer": "^3.1"
+ },
"type": "library",
"extra": {
"branch-alias": {
@@ -2699,8 +3119,8 @@
}
},
"autoload": {
- "files": [
- "libs/bootstrap.php"
+ "classmap": [
+ "libs/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2726,20 +3146,141 @@
"keywords": [
"templating"
],
- "time": "2018-09-12T20:54:16+00:00"
+ "time": "2020-04-14T14:44:26+00:00"
},
{
- "name": "symfony/polyfill-php56",
- "version": "v1.12.0",
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.17.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "0e3b212e96a51338639d8ce175c046d7729c3403"
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/0e3b212e96a51338639d8ce175c046d7729c3403",
- "reference": "0e3b212e96a51338639d8ce175c046d7729c3403",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a",
+ "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/polyfill-mbstring": "^1.3",
+ "symfony/polyfill-php72": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.17-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2020-05-12T16:47:27+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.17.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
+ "reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.17-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2020-05-12T16:47:27+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php56",
+ "version": "v1.17.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php56.git",
+ "reference": "e3c8c138280cdfe4b81488441555583aa1984e23"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/e3c8c138280cdfe4b81488441555583aa1984e23",
+ "reference": "e3c8c138280cdfe4b81488441555583aa1984e23",
"shasum": ""
},
"require": {
@@ -2749,7 +3290,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.12-dev"
+ "dev-master": "1.17-dev"
}
},
"autoload": {
@@ -2782,20 +3323,20 @@
"portable",
"shim"
],
- "time": "2019-08-06T08:03:45+00:00"
+ "time": "2020-05-12T16:47:27+00:00"
},
{
- "name": "symfony/polyfill-util",
- "version": "v1.12.0",
+ "name": "symfony/polyfill-php72",
+ "version": "v1.17.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-util.git",
- "reference": "4317de1386717b4c22caed7725350a8887ab205c"
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "f048e612a3905f34931127360bdd2def19a5e582"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/4317de1386717b4c22caed7725350a8887ab205c",
- "reference": "4317de1386717b4c22caed7725350a8887ab205c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582",
+ "reference": "f048e612a3905f34931127360bdd2def19a5e582",
"shasum": ""
},
"require": {
@@ -2804,7 +3345,62 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.12-dev"
+ "dev-master": "1.17-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2020-05-12T16:47:27+00:00"
+ },
+ {
+ "name": "symfony/polyfill-util",
+ "version": "v1.17.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-util.git",
+ "reference": "4afb4110fc037752cf0ce9869f9ab8162c4e20d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/4afb4110fc037752cf0ce9869f9ab8162c4e20d7",
+ "reference": "4afb4110fc037752cf0ce9869f9ab8162c4e20d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.17-dev"
}
},
"autoload": {
@@ -2834,7 +3430,58 @@
"polyfill",
"shim"
],
- "time": "2019-08-06T08:03:45+00:00"
+ "time": "2020-05-12T16:14:59+00:00"
+ },
+ {
+ "name": "xemlock/htmlpurifier-html5",
+ "version": "v0.1.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/xemlock/htmlpurifier-html5.git",
+ "reference": "f0d563f9fd4a82a3d759043483f9a94c0d8c2255"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/xemlock/htmlpurifier-html5/zipball/f0d563f9fd4a82a3d759043483f9a94c0d8c2255",
+ "reference": "f0d563f9fd4a82a3d759043483f9a94c0d8c2255",
+ "shasum": ""
+ },
+ "require": {
+ "ezyang/htmlpurifier": "^4.8",
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^1.1|^2.1",
+ "phpunit/phpunit": ">=4.7 <8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "library/HTMLPurifier/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "xemlock",
+ "email": "xemlock@gmail.com"
+ }
+ ],
+ "description": "HTML5 element definitions for HTML Purifier",
+ "keywords": [
+ "HTML5",
+ "Purifier",
+ "html",
+ "htmlpurifier",
+ "security",
+ "tidy",
+ "validator",
+ "xss"
+ ],
+ "time": "2019-08-07T17:19:21+00:00"
}
],
"packages-dev": [
@@ -2940,54 +3587,6 @@
],
"time": "2016-01-20T08:20:44+00:00"
},
- {
- "name": "jakub-onderka/php-parallel-lint",
- "version": "v1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/JakubOnderka/PHP-Parallel-Lint.git",
- "reference": "04fbd3f5fb1c83f08724aa58a23db90bd9086ee8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Parallel-Lint/zipball/04fbd3f5fb1c83f08724aa58a23db90bd9086ee8",
- "reference": "04fbd3f5fb1c83f08724aa58a23db90bd9086ee8",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "require-dev": {
- "jakub-onderka/php-console-highlighter": "~0.3",
- "nette/tester": "~1.3",
- "squizlabs/php_codesniffer": "~2.7"
- },
- "suggest": {
- "jakub-onderka/php-console-highlighter": "Highlight syntax in code snippet"
- },
- "bin": [
- "parallel-lint"
- ],
- "type": "library",
- "autoload": {
- "classmap": [
- "./"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-2-Clause"
- ],
- "authors": [
- {
- "name": "Jakub Onderka",
- "email": "ahoj@jakubonderka.cz"
- }
- ],
- "description": "This tool check syntax of PHP files about 20x faster than serial check.",
- "homepage": "https://github.com/JakubOnderka/PHP-Parallel-Lint",
- "time": "2018-02-24T15:31:20+00:00"
- },
{
"name": "johnkary/phpunit-speedtrap",
"version": "v1.1.0",
@@ -3038,16 +3637,16 @@
},
{
"name": "mikey179/vfsstream",
- "version": "v1.6.7",
+ "version": "v1.6.8",
"source": {
"type": "git",
"url": "https://github.com/bovigo/vfsStream.git",
- "reference": "2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb"
+ "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb",
- "reference": "2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb",
+ "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+ "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
"shasum": ""
},
"require": {
@@ -3080,20 +3679,20 @@
],
"description": "Virtual file system to mock the real file system in unit tests.",
"homepage": "http://vfs.bovigo.org/",
- "time": "2019-08-01T01:38:37+00:00"
+ "time": "2019-10-30T15:31:00+00:00"
},
{
"name": "mockery/mockery",
- "version": "1.2.3",
+ "version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/mockery/mockery.git",
- "reference": "4eff936d83eb809bde2c57a3cea0ee9643769031"
+ "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/4eff936d83eb809bde2c57a3cea0ee9643769031",
- "reference": "4eff936d83eb809bde2c57a3cea0ee9643769031",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be",
+ "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be",
"shasum": ""
},
"require": {
@@ -3107,7 +3706,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
@@ -3145,7 +3744,7 @@
"test double",
"testing"
],
- "time": "2019-08-07T15:01:07+00:00"
+ "time": "2019-12-26T09:49:15+00:00"
},
{
"name": "myclabs/deep-copy",
@@ -3192,6 +3791,59 @@
],
"time": "2017-10-19T19:58:43+00:00"
},
+ {
+ "name": "php-parallel-lint/php-parallel-lint",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
+ "reference": "474f18bc6cc6aca61ca40bfab55139de614e51ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/474f18bc6cc6aca61ca40bfab55139de614e51ca",
+ "reference": "474f18bc6cc6aca61ca40bfab55139de614e51ca",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=5.4.0"
+ },
+ "replace": {
+ "grogy/php-parallel-lint": "*",
+ "jakub-onderka/php-parallel-lint": "*"
+ },
+ "require-dev": {
+ "nette/tester": "^1.3 || ^2.0",
+ "php-parallel-lint/php-console-highlighter": "~0.3",
+ "squizlabs/php_codesniffer": "~3.0"
+ },
+ "suggest": {
+ "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+ },
+ "bin": [
+ "parallel-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "./"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "ahoj@jakubonderka.cz"
+ }
+ ],
+ "description": "This tool check syntax of PHP files about 20x faster than serial check.",
+ "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+ "time": "2020-04-04T12:18:32+00:00"
+ },
{
"name": "phpdocumentor/reflection-common",
"version": "1.0.1",
@@ -3340,33 +3992,33 @@
},
{
"name": "phpspec/prophecy",
- "version": "1.8.1",
+ "version": "v1.10.3",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76"
+ "reference": "451c3cd1418cf640de218914901e51b064abb093"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76",
- "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.0.2",
"php": "^5.3|^7.0",
- "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
- "sebastian/comparator": "^1.1|^2.0|^3.0",
- "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
},
"require-dev": {
- "phpspec/phpspec": "^2.5|^3.2",
+ "phpspec/phpspec": "^2.5 || ^3.2",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8.x-dev"
+ "dev-master": "1.10.x-dev"
}
},
"autoload": {
@@ -3399,7 +4051,7 @@
"spy",
"stub"
],
- "time": "2019-06-13T12:50:23+00:00"
+ "time": "2020-03-05T15:02:03+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -3648,6 +4300,7 @@
"keywords": [
"tokenizer"
],
+ "abandoned": true,
"time": "2017-12-04T08:55:13+00:00"
},
{
@@ -4307,16 +4960,16 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.12.0",
+ "version": "v1.17.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "550ebaac289296ce228a706d0867afc34687e3f4"
+ "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4",
- "reference": "550ebaac289296ce228a706d0867afc34687e3f4",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
+ "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
"shasum": ""
},
"require": {
@@ -4328,7 +4981,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.12-dev"
+ "dev-master": "1.17-dev"
}
},
"autoload": {
@@ -4361,31 +5014,41 @@
"polyfill",
"portable"
],
- "time": "2019-08-06T08:03:45+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-12T16:14:59+00:00"
},
{
"name": "symfony/yaml",
- "version": "v3.4.32",
+ "version": "v3.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "768f817446da74a776a31eea335540f9dcb53942"
+ "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/768f817446da74a776a31eea335540f9dcb53942",
- "reference": "768f817446da74a776a31eea335540f9dcb53942",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/ddc23324e6cfe066f3dd34a37ff494fa80b617ed",
+ "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
- },
- "conflict": {
- "symfony/console": "<3.4"
+ "php": ">=5.5.9"
},
"require-dev": {
- "symfony/console": "~3.4|~4.0"
+ "symfony/console": "~2.8|~3.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
@@ -4393,7 +5056,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.4-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -4420,35 +5083,34 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2019-09-10T10:38:46+00:00"
+ "time": "2017-07-23T12:43:26+00:00"
},
{
"name": "webmozart/assert",
- "version": "1.5.0",
+ "version": "1.9.0",
"source": {
"type": "git",
"url": "https://github.com/webmozart/assert.git",
- "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4"
+ "reference": "9dc4f203e36f2b486149058bade43c851dd97451"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4",
- "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/9dc4f203e36f2b486149058bade43c851dd97451",
+ "reference": "9dc4f203e36f2b486149058bade43c851dd97451",
"shasum": ""
},
"require": {
"php": "^5.3.3 || ^7.0",
"symfony/polyfill-ctype": "^1.8"
},
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
+ },
"require-dev": {
"phpunit/phpunit": "^4.8.36 || ^7.5.13"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3-dev"
- }
- },
"autoload": {
"psr-4": {
"Webmozart\\Assert\\": "src/"
@@ -4470,7 +5132,7 @@
"check",
"validate"
],
- "time": "2019-08-24T08:43:50+00:00"
+ "time": "2020-06-16T10:16:42+00:00"
}
],
"aliases": [],
@@ -4495,5 +5157,9 @@
"ext-simplexml": "*",
"ext-xml": "*"
},
- "platform-dev": []
+ "platform-dev": [],
+ "platform-overrides": {
+ "php": "7.0"
+ },
+ "plugin-api-version": "1.1.0"
}
diff --git a/database.sql b/database.sql
index a26b6f2bf..1d4f335e4 100644
--- a/database.sql
+++ b/database.sql
@@ -1,164 +1,95 @@
-- ------------------------------------------
--- Friendica 2020.06-dev (Red Hot Poker)
--- DB_UPDATE_VERSION 1346
+-- Friendica 2021.03-dev (Red Hot Poker)
+-- DB_UPDATE_VERSION 1385
-- ------------------------------------------
--
--- TABLE 2fa_app_specific_password
+-- TABLE gserver
--
-CREATE TABLE IF NOT EXISTS `2fa_app_specific_password` (
- `id` mediumint unsigned NOT NULL auto_increment COMMENT 'Password ID for revocation',
- `uid` mediumint unsigned NOT NULL COMMENT 'User ID',
- `description` varchar(255) COMMENT 'Description of the usage of the password',
- `hashed_password` varchar(255) NOT NULL COMMENT 'Hashed password',
- `generated` datetime NOT NULL COMMENT 'Datetime the password was generated',
- `last_used` datetime COMMENT 'Datetime the password was last used',
- PRIMARY KEY(`id`),
- INDEX `uid_description` (`uid`,`description`(190))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor app-specific _password';
-
---
--- TABLE 2fa_recovery_codes
---
-CREATE TABLE IF NOT EXISTS `2fa_recovery_codes` (
- `uid` mediumint unsigned NOT NULL COMMENT 'User ID',
- `code` varchar(50) NOT NULL COMMENT 'Recovery code string',
- `generated` datetime NOT NULL COMMENT 'Datetime the code was generated',
- `used` datetime COMMENT 'Datetime the code was used',
- PRIMARY KEY(`uid`,`code`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor authentication recovery codes';
-
---
--- TABLE addon
---
-CREATE TABLE IF NOT EXISTS `addon` (
- `id` int unsigned NOT NULL auto_increment COMMENT '',
- `name` varchar(50) NOT NULL DEFAULT '' COMMENT 'addon base (file)name',
- `version` varchar(50) NOT NULL DEFAULT '' COMMENT 'currently unused',
- `installed` boolean NOT NULL DEFAULT '0' COMMENT 'currently always 1',
- `hidden` boolean NOT NULL DEFAULT '0' COMMENT 'currently unused',
- `timestamp` int unsigned NOT NULL DEFAULT 0 COMMENT 'file timestamp to check for reloads',
- `plugin_admin` boolean NOT NULL DEFAULT '0' COMMENT '1 = has admin config, 0 = has no admin config',
- PRIMARY KEY(`id`),
- UNIQUE INDEX `name` (`name`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registered addons';
-
---
--- TABLE apcontact
---
-CREATE TABLE IF NOT EXISTS `apcontact` (
- `url` varbinary(255) NOT NULL COMMENT 'URL of the contact',
- `uuid` varchar(255) COMMENT '',
- `type` varchar(20) NOT NULL COMMENT '',
- `following` varchar(255) COMMENT '',
- `followers` varchar(255) COMMENT '',
- `inbox` varchar(255) NOT NULL COMMENT '',
- `outbox` varchar(255) COMMENT '',
- `sharedinbox` varchar(255) COMMENT '',
- `manually-approve` boolean COMMENT '',
- `nick` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `name` varchar(255) COMMENT '',
- `about` text COMMENT '',
- `photo` varchar(255) COMMENT '',
- `addr` varchar(255) COMMENT '',
- `alias` varchar(255) COMMENT '',
- `pubkey` text COMMENT '',
- `baseurl` varchar(255) COMMENT 'baseurl of the ap contact',
- `generator` varchar(255) COMMENT 'Name of the contact\'s system',
- `following_count` int unsigned DEFAULT 0 COMMENT 'Number of following contacts',
- `followers_count` int unsigned DEFAULT 0 COMMENT 'Number of followers',
- `statuses_count` int unsigned DEFAULT 0 COMMENT 'Number of posts',
- `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- PRIMARY KEY(`url`),
- INDEX `addr` (`addr`(32)),
- INDEX `alias` (`alias`(190)),
- INDEX `url` (`followers`(190))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='ActivityPub compatible contacts - used in the ActivityPub implementation';
-
---
--- TABLE attach
---
-CREATE TABLE IF NOT EXISTS `attach` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'generated index',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id',
- `hash` varchar(64) NOT NULL DEFAULT '' COMMENT 'hash',
- `filename` varchar(255) NOT NULL DEFAULT '' COMMENT 'filename of original',
- `filetype` varchar(64) NOT NULL DEFAULT '' COMMENT 'mimetype',
- `filesize` int unsigned NOT NULL DEFAULT 0 COMMENT 'size in bytes',
- `data` longblob NOT NULL COMMENT 'file data',
- `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation time',
- `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'last edit time',
- `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>',
- `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups',
- `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id',
- `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
- `backend-class` tinytext COMMENT 'Storage backend class',
- `backend-ref` text COMMENT 'Storage backend data reference',
- PRIMARY KEY(`id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='file attachments';
-
---
--- TABLE auth_codes
---
-CREATE TABLE IF NOT EXISTS `auth_codes` (
- `id` varchar(40) NOT NULL COMMENT '',
- `client_id` varchar(20) NOT NULL DEFAULT '' COMMENT '',
- `redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
- `expires` int NOT NULL DEFAULT 0 COMMENT '',
- `scope` varchar(250) NOT NULL DEFAULT '' COMMENT '',
- PRIMARY KEY(`id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
-
---
--- TABLE cache
---
-CREATE TABLE IF NOT EXISTS `cache` (
- `k` varbinary(255) NOT NULL COMMENT 'cache key',
- `v` mediumtext COMMENT 'cached serialized value',
- `expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime of cache expiration',
- `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime of cache insertion',
- PRIMARY KEY(`k`),
- INDEX `k_expires` (`k`,`expires`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Stores temporary data';
-
---
--- TABLE challenge
---
-CREATE TABLE IF NOT EXISTS `challenge` (
+CREATE TABLE IF NOT EXISTS `gserver` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `challenge` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `dfrn-id` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `type` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `last_update` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- PRIMARY KEY(`id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
-
---
--- TABLE clients
---
-CREATE TABLE IF NOT EXISTS `clients` (
- `client_id` varchar(20) NOT NULL COMMENT '',
- `pw` varchar(20) NOT NULL DEFAULT '' COMMENT '',
- `redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
- `name` text COMMENT '',
- `icon` text COMMENT '',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- PRIMARY KEY(`client_id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
-
---
--- TABLE config
---
-CREATE TABLE IF NOT EXISTS `config` (
- `id` int unsigned NOT NULL auto_increment COMMENT '',
- `cat` varbinary(50) NOT NULL DEFAULT '' COMMENT '',
- `k` varbinary(50) NOT NULL DEFAULT '' COMMENT '',
- `v` mediumtext COMMENT '',
+ `url` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `nurl` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `version` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `site_name` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `info` text COMMENT '',
+ `register_policy` tinyint NOT NULL DEFAULT 0 COMMENT '',
+ `registered-users` int unsigned NOT NULL DEFAULT 0 COMMENT 'Number of registered users',
+ `directory-type` tinyint DEFAULT 0 COMMENT 'Type of directory service (Poco, Mastodon)',
+ `poco` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `noscrape` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `network` char(4) NOT NULL DEFAULT '' COMMENT '',
+ `protocol` tinyint unsigned COMMENT 'The protocol of the server',
+ `platform` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `relay-subscribe` boolean NOT NULL DEFAULT '0' COMMENT 'Has the server subscribed to the relay system',
+ `relay-scope` varchar(10) NOT NULL DEFAULT '' COMMENT 'The scope of messages that the server wants to get',
+ `detection-method` tinyint unsigned COMMENT 'Method that had been used to detect that server',
+ `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
+ `last_poco_query` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
+ `last_contact` datetime DEFAULT '0001-01-01 00:00:00' COMMENT 'Last successful connection request',
+ `last_failure` datetime DEFAULT '0001-01-01 00:00:00' COMMENT 'Last failed connection request',
+ `failed` boolean COMMENT 'Connection failed',
+ `next_contact` datetime DEFAULT '0001-01-01 00:00:00' COMMENT 'Next connection request',
PRIMARY KEY(`id`),
- UNIQUE INDEX `cat_k` (`cat`,`k`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='main configuration storage';
+ UNIQUE INDEX `nurl` (`nurl`(190)),
+ INDEX `next_contact` (`next_contact`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Global servers';
+
+--
+-- TABLE user
+--
+CREATE TABLE IF NOT EXISTS `user` (
+ `uid` mediumint unsigned NOT NULL auto_increment COMMENT 'sequential ID',
+ `parent-uid` mediumint unsigned COMMENT 'The parent user that has full control about this user',
+ `guid` varchar(64) NOT NULL DEFAULT '' COMMENT 'A unique identifier for this user',
+ `username` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name that this user is known by',
+ `password` varchar(255) NOT NULL DEFAULT '' COMMENT 'encrypted password',
+ `legacy_password` boolean NOT NULL DEFAULT '0' COMMENT 'Is the password hash double-hashed?',
+ `nickname` varchar(255) NOT NULL DEFAULT '' COMMENT 'nick- and user name',
+ `email` varchar(255) NOT NULL DEFAULT '' COMMENT 'the users email address',
+ `openid` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `timezone` varchar(128) NOT NULL DEFAULT '' COMMENT 'PHP-legal timezone',
+ `language` varchar(32) NOT NULL DEFAULT 'en' COMMENT 'default language',
+ `register_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of registration',
+ `login_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last login',
+ `default-location` varchar(255) NOT NULL DEFAULT '' COMMENT 'Default for item.location',
+ `allow_location` boolean NOT NULL DEFAULT '0' COMMENT '1 allows to display the location',
+ `theme` varchar(255) NOT NULL DEFAULT '' COMMENT 'user theme preference',
+ `pubkey` text COMMENT 'RSA public key 4096 bit',
+ `prvkey` text COMMENT 'RSA private key 4096 bit',
+ `spubkey` text COMMENT '',
+ `sprvkey` text COMMENT '',
+ `verified` boolean NOT NULL DEFAULT '0' COMMENT 'user is verified through email',
+ `blocked` boolean NOT NULL DEFAULT '0' COMMENT '1 for user is blocked',
+ `blockwall` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to post to the profile page of the user',
+ `hidewall` boolean NOT NULL DEFAULT '0' COMMENT 'Hide profile details from unkown viewers',
+ `blocktags` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to tag the post of this user',
+ `unkmail` boolean NOT NULL DEFAULT '0' COMMENT 'Permit unknown people to send private mails to this user',
+ `cntunkmail` int unsigned NOT NULL DEFAULT 10 COMMENT '',
+ `notify-flags` smallint unsigned NOT NULL DEFAULT 65535 COMMENT 'email notification options',
+ `page-flags` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'page/profile type',
+ `account-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `prvnets` boolean NOT NULL DEFAULT '0' COMMENT '',
+ `pwdreset` varchar(255) COMMENT 'Password reset request token',
+ `pwdreset_time` datetime COMMENT 'Timestamp of the last password reset request',
+ `maxreq` int unsigned NOT NULL DEFAULT 10 COMMENT '',
+ `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `account_removed` boolean NOT NULL DEFAULT '0' COMMENT 'if 1 the account is removed',
+ `account_expired` boolean NOT NULL DEFAULT '0' COMMENT '',
+ `account_expires_on` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp when account expires and will be deleted',
+ `expire_notification_sent` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last warning of account expiration',
+ `def_gid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `allow_cid` mediumtext COMMENT 'default permission for this user',
+ `allow_gid` mediumtext COMMENT 'default permission for this user',
+ `deny_cid` mediumtext COMMENT 'default permission for this user',
+ `deny_gid` mediumtext COMMENT 'default permission for this user',
+ `openidserver` text COMMENT '',
+ PRIMARY KEY(`uid`),
+ INDEX `nickname` (`nickname`(32)),
+ INDEX `parent-uid` (`parent-uid`),
+ FOREIGN KEY (`parent-uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='The local users';
--
-- TABLE contact
@@ -200,6 +131,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`notify` varchar(255) COMMENT '',
`poll` varchar(255) COMMENT '',
`confirm` varchar(255) COMMENT '',
+ `subscribe` varchar(255) COMMENT '',
`poco` varchar(255) COMMENT '',
`aes_allow` boolean NOT NULL DEFAULT '0' COMMENT '',
`ret-aes` boolean NOT NULL DEFAULT '0' COMMENT '',
@@ -209,11 +141,13 @@ CREATE TABLE IF NOT EXISTS `contact` (
`last-update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last try to update the contact info',
`success_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last successful contact update',
`failure_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last failed update',
+ `failed` boolean COMMENT 'Connection failed',
`name-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
`uri-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
`avatar-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
`term-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
`last-item` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'date of the last post',
+ `last-discovery` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'date of the last follower discovery',
`priority` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
`blocked` boolean NOT NULL DEFAULT '1' COMMENT 'Node-wide block status',
`block_reason` text COMMENT 'Node-wide block reason',
@@ -222,6 +156,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum',
`prv` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a private group',
`contact-type` tinyint NOT NULL DEFAULT 0 COMMENT '',
+ `manually-approve` boolean COMMENT '',
`hidden` boolean NOT NULL DEFAULT '0' COMMENT '',
`archive` boolean NOT NULL DEFAULT '0' COMMENT '',
`pending` boolean NOT NULL DEFAULT '1' COMMENT '',
@@ -230,6 +165,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`unsearchable` boolean NOT NULL DEFAULT '0' COMMENT 'Contact prefers to not be searchable',
`sensitive` boolean NOT NULL DEFAULT '0' COMMENT 'Contact posts sensitive content',
`baseurl` varchar(255) DEFAULT '' COMMENT 'baseurl of the contact',
+ `gsid` int unsigned COMMENT 'Global Server ID',
`reason` text COMMENT '',
`closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT '',
`info` mediumtext COMMENT '',
@@ -238,22 +174,247 @@ CREATE TABLE IF NOT EXISTS `contact` (
`bd` date NOT NULL DEFAULT '0001-01-01' COMMENT '',
`notify_new_posts` boolean NOT NULL DEFAULT '0' COMMENT '',
`fetch_further_information` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `ffi_keyword_blacklist` text COMMENT '',
+ `ffi_keyword_denylist` text COMMENT '',
PRIMARY KEY(`id`),
INDEX `uid_name` (`uid`,`name`(190)),
INDEX `self_uid` (`self`,`uid`),
- INDEX `alias_uid` (`alias`(32),`uid`),
+ INDEX `alias_uid` (`alias`(128),`uid`),
INDEX `pending_uid` (`pending`,`uid`),
INDEX `blocked_uid` (`blocked`,`uid`),
INDEX `uid_rel_network_poll` (`uid`,`rel`,`network`,`poll`(64),`archive`),
INDEX `uid_network_batch` (`uid`,`network`,`batch`(64)),
- INDEX `addr_uid` (`addr`(32),`uid`),
- INDEX `nurl_uid` (`nurl`(32),`uid`),
- INDEX `nick_uid` (`nick`(32),`uid`),
+ INDEX `addr_uid` (`addr`(128),`uid`),
+ INDEX `nurl_uid` (`nurl`(128),`uid`),
+ INDEX `nick_uid` (`nick`(128),`uid`),
+ INDEX `attag_uid` (`attag`(96),`uid`),
INDEX `dfrn-id` (`dfrn-id`(64)),
- INDEX `issued-id` (`issued-id`(64))
+ INDEX `issued-id` (`issued-id`(64)),
+ INDEX `network_uid_lastupdate` (`network`,`uid`,`last-update`),
+ INDEX `uid_network_self_lastupdate` (`uid`,`network`,`self`,`last-update`),
+ INDEX `uid_lastitem` (`uid`,`last-item`),
+ INDEX `gsid` (`gsid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`gsid`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='contact table';
+--
+-- TABLE item-uri
+--
+CREATE TABLE IF NOT EXISTS `item-uri` (
+ `id` int unsigned NOT NULL auto_increment,
+ `uri` varbinary(255) NOT NULL COMMENT 'URI of an item',
+ `guid` varbinary(255) COMMENT 'A unique identifier for an item',
+ PRIMARY KEY(`id`),
+ UNIQUE INDEX `uri` (`uri`),
+ INDEX `guid` (`guid`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='URI and GUID for items';
+
+--
+-- TABLE tag
+--
+CREATE TABLE IF NOT EXISTS `tag` (
+ `id` int unsigned NOT NULL auto_increment COMMENT '',
+ `name` varchar(96) NOT NULL DEFAULT '' COMMENT '',
+ `url` varbinary(255) NOT NULL DEFAULT '' COMMENT '',
+ PRIMARY KEY(`id`),
+ UNIQUE INDEX `type_name_url` (`name`,`url`),
+ INDEX `url` (`url`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='tags and mentions';
+
+--
+-- TABLE clients
+--
+CREATE TABLE IF NOT EXISTS `clients` (
+ `client_id` varchar(20) NOT NULL COMMENT '',
+ `pw` varchar(20) NOT NULL DEFAULT '' COMMENT '',
+ `redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
+ `name` text COMMENT '',
+ `icon` text COMMENT '',
+ `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
+ PRIMARY KEY(`client_id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
+
+--
+-- TABLE permissionset
+--
+CREATE TABLE IF NOT EXISTS `permissionset` (
+ `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
+ `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner id of this permission set',
+ `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>\'',
+ `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups',
+ `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id',
+ `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
+ PRIMARY KEY(`id`),
+ INDEX `uid_allow_cid_allow_gid_deny_cid_deny_gid` (`uid`,`allow_cid`(50),`allow_gid`(30),`deny_cid`(50),`deny_gid`(30)),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
+
+--
+-- TABLE verb
+--
+CREATE TABLE IF NOT EXISTS `verb` (
+ `id` smallint unsigned NOT NULL auto_increment,
+ `name` varchar(100) NOT NULL DEFAULT '' COMMENT '',
+ PRIMARY KEY(`id`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Activity Verbs';
+
+--
+-- TABLE 2fa_app_specific_password
+--
+CREATE TABLE IF NOT EXISTS `2fa_app_specific_password` (
+ `id` mediumint unsigned NOT NULL auto_increment COMMENT 'Password ID for revocation',
+ `uid` mediumint unsigned NOT NULL COMMENT 'User ID',
+ `description` varchar(255) COMMENT 'Description of the usage of the password',
+ `hashed_password` varchar(255) NOT NULL COMMENT 'Hashed password',
+ `generated` datetime NOT NULL COMMENT 'Datetime the password was generated',
+ `last_used` datetime COMMENT 'Datetime the password was last used',
+ PRIMARY KEY(`id`),
+ INDEX `uid_description` (`uid`,`description`(190)),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor app-specific _password';
+
+--
+-- TABLE 2fa_recovery_codes
+--
+CREATE TABLE IF NOT EXISTS `2fa_recovery_codes` (
+ `uid` mediumint unsigned NOT NULL COMMENT 'User ID',
+ `code` varchar(50) NOT NULL COMMENT 'Recovery code string',
+ `generated` datetime NOT NULL COMMENT 'Datetime the code was generated',
+ `used` datetime COMMENT 'Datetime the code was used',
+ PRIMARY KEY(`uid`,`code`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor authentication recovery codes';
+
+--
+-- TABLE addon
+--
+CREATE TABLE IF NOT EXISTS `addon` (
+ `id` int unsigned NOT NULL auto_increment COMMENT '',
+ `name` varchar(50) NOT NULL DEFAULT '' COMMENT 'addon base (file)name',
+ `version` varchar(50) NOT NULL DEFAULT '' COMMENT 'currently unused',
+ `installed` boolean NOT NULL DEFAULT '0' COMMENT 'currently always 1',
+ `hidden` boolean NOT NULL DEFAULT '0' COMMENT 'currently unused',
+ `timestamp` int unsigned NOT NULL DEFAULT 0 COMMENT 'file timestamp to check for reloads',
+ `plugin_admin` boolean NOT NULL DEFAULT '0' COMMENT '1 = has admin config, 0 = has no admin config',
+ PRIMARY KEY(`id`),
+ UNIQUE INDEX `name` (`name`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registered addons';
+
+--
+-- TABLE apcontact
+--
+CREATE TABLE IF NOT EXISTS `apcontact` (
+ `url` varbinary(255) NOT NULL COMMENT 'URL of the contact',
+ `uuid` varchar(255) COMMENT '',
+ `type` varchar(20) NOT NULL COMMENT '',
+ `following` varchar(255) COMMENT '',
+ `followers` varchar(255) COMMENT '',
+ `inbox` varchar(255) NOT NULL COMMENT '',
+ `outbox` varchar(255) COMMENT '',
+ `sharedinbox` varchar(255) COMMENT '',
+ `manually-approve` boolean COMMENT '',
+ `nick` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `name` varchar(255) COMMENT '',
+ `about` text COMMENT '',
+ `photo` varchar(255) COMMENT '',
+ `addr` varchar(255) COMMENT '',
+ `alias` varchar(255) COMMENT '',
+ `pubkey` text COMMENT '',
+ `subscribe` varchar(255) COMMENT '',
+ `baseurl` varchar(255) COMMENT 'baseurl of the ap contact',
+ `gsid` int unsigned COMMENT 'Global Server ID',
+ `generator` varchar(255) COMMENT 'Name of the contact\'s system',
+ `following_count` int unsigned DEFAULT 0 COMMENT 'Number of following contacts',
+ `followers_count` int unsigned DEFAULT 0 COMMENT 'Number of followers',
+ `statuses_count` int unsigned DEFAULT 0 COMMENT 'Number of posts',
+ `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
+ PRIMARY KEY(`url`),
+ INDEX `addr` (`addr`(32)),
+ INDEX `alias` (`alias`(190)),
+ INDEX `followers` (`followers`(190)),
+ INDEX `baseurl` (`baseurl`(190)),
+ INDEX `sharedinbox` (`sharedinbox`(190)),
+ INDEX `gsid` (`gsid`),
+ FOREIGN KEY (`gsid`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='ActivityPub compatible contacts - used in the ActivityPub implementation';
+
+--
+-- TABLE attach
+--
+CREATE TABLE IF NOT EXISTS `attach` (
+ `id` int unsigned NOT NULL auto_increment COMMENT 'generated index',
+ `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id',
+ `hash` varchar(64) NOT NULL DEFAULT '' COMMENT 'hash',
+ `filename` varchar(255) NOT NULL DEFAULT '' COMMENT 'filename of original',
+ `filetype` varchar(64) NOT NULL DEFAULT '' COMMENT 'mimetype',
+ `filesize` int unsigned NOT NULL DEFAULT 0 COMMENT 'size in bytes',
+ `data` longblob NOT NULL COMMENT 'file data',
+ `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation time',
+ `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'last edit time',
+ `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>',
+ `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups',
+ `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id',
+ `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
+ `backend-class` tinytext COMMENT 'Storage backend class',
+ `backend-ref` text COMMENT 'Storage backend data reference',
+ PRIMARY KEY(`id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='file attachments';
+
+--
+-- TABLE auth_codes
+--
+CREATE TABLE IF NOT EXISTS `auth_codes` (
+ `id` varchar(40) NOT NULL COMMENT '',
+ `client_id` varchar(20) NOT NULL DEFAULT '' COMMENT '',
+ `redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
+ `expires` int NOT NULL DEFAULT 0 COMMENT '',
+ `scope` varchar(250) NOT NULL DEFAULT '' COMMENT '',
+ PRIMARY KEY(`id`),
+ INDEX `client_id` (`client_id`),
+ FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
+
+--
+-- TABLE cache
+--
+CREATE TABLE IF NOT EXISTS `cache` (
+ `k` varbinary(255) NOT NULL COMMENT 'cache key',
+ `v` mediumtext COMMENT 'cached serialized value',
+ `expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime of cache expiration',
+ `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime of cache insertion',
+ PRIMARY KEY(`k`),
+ INDEX `k_expires` (`k`,`expires`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Stores temporary data';
+
+--
+-- TABLE challenge
+--
+CREATE TABLE IF NOT EXISTS `challenge` (
+ `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
+ `challenge` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `dfrn-id` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `type` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ `last_update` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+ PRIMARY KEY(`id`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
+
+--
+-- TABLE config
+--
+CREATE TABLE IF NOT EXISTS `config` (
+ `id` int unsigned NOT NULL auto_increment COMMENT '',
+ `cat` varbinary(50) NOT NULL DEFAULT '' COMMENT '',
+ `k` varbinary(50) NOT NULL DEFAULT '' COMMENT '',
+ `v` mediumtext COMMENT '',
+ PRIMARY KEY(`id`),
+ UNIQUE INDEX `cat_k` (`cat`,`k`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='main configuration storage';
+
--
-- TABLE contact-relation
--
@@ -261,8 +422,12 @@ CREATE TABLE IF NOT EXISTS `contact-relation` (
`cid` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact the related contact had interacted with',
`relation-cid` int unsigned NOT NULL DEFAULT 0 COMMENT 'related contact who had interacted with the contact',
`last-interaction` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last interaction',
+ `follow-updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last update of the contact relationship',
+ `follows` boolean NOT NULL DEFAULT '0' COMMENT '',
PRIMARY KEY(`cid`,`relation-cid`),
- INDEX `relation-cid` (`relation-cid`)
+ INDEX `relation-cid` (`relation-cid`),
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`relation-cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Contact relations';
--
@@ -278,7 +443,8 @@ CREATE TABLE IF NOT EXISTS `conv` (
`updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'edited timestamp',
`subject` text COMMENT 'subject of initial message',
PRIMARY KEY(`id`),
- INDEX `uid` (`uid`)
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='private messages';
--
@@ -298,13 +464,27 @@ CREATE TABLE IF NOT EXISTS `conversation` (
INDEX `received` (`received`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Raw data and structure information for messages';
+--
+-- TABLE delayed-post
+--
+CREATE TABLE IF NOT EXISTS `delayed-post` (
+ `id` int unsigned NOT NULL auto_increment,
+ `uri` varchar(255) COMMENT 'URI of the post that will be distributed later',
+ `uid` mediumint unsigned COMMENT 'Owner User id',
+ `delayed` datetime COMMENT 'delay time',
+ PRIMARY KEY(`id`),
+ UNIQUE INDEX `uid_uri` (`uid`,`uri`(190)),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Posts that are about to be distributed at a later time';
+
--
-- TABLE diaspora-interaction
--
CREATE TABLE IF NOT EXISTS `diaspora-interaction` (
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
`interaction` mediumtext COMMENT 'The Diaspora interaction',
- PRIMARY KEY(`uri-id`)
+ PRIMARY KEY(`uri-id`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Signed Diaspora Interaction';
--
@@ -332,7 +512,10 @@ CREATE TABLE IF NOT EXISTS `event` (
`deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id',
`deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
PRIMARY KEY(`id`),
- INDEX `uid_start` (`uid`,`start`)
+ INDEX `uid_start` (`uid`,`start`),
+ INDEX `cid` (`cid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Events';
--
@@ -374,88 +557,12 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
`photo` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`note` text COMMENT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- PRIMARY KEY(`id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='friend suggestion stuff';
-
---
--- TABLE gcign
---
-CREATE TABLE IF NOT EXISTS `gcign` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Local User id',
- `gcid` int unsigned NOT NULL DEFAULT 0 COMMENT 'gcontact.id of ignored contact',
PRIMARY KEY(`id`),
+ INDEX `cid` (`cid`),
INDEX `uid` (`uid`),
- INDEX `gcid` (`gcid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='contacts ignored by friend suggestions';
-
---
--- TABLE gcontact
---
-CREATE TABLE IF NOT EXISTS `gcontact` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name that this contact is known by',
- `nick` varchar(255) NOT NULL DEFAULT '' COMMENT 'Nick- and user name of the contact',
- `url` varchar(255) NOT NULL DEFAULT '' COMMENT 'Link to the contacts profile page',
- `nurl` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `photo` varchar(255) NOT NULL DEFAULT '' COMMENT 'Link to the profile photo',
- `connect` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `updated` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `last_contact` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `last_failure` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `last_discovery` datetime DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last contact discovery',
- `archive_date` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `archived` boolean NOT NULL DEFAULT '0' COMMENT '',
- `location` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `about` text COMMENT '',
- `keywords` text COMMENT 'puplic keywords (interests)',
- `gender` varchar(32) NOT NULL DEFAULT '' COMMENT 'Deprecated',
- `birthday` varchar(32) NOT NULL DEFAULT '0001-01-01' COMMENT '',
- `community` boolean NOT NULL DEFAULT '0' COMMENT '1 if contact is forum account',
- `contact-type` tinyint NOT NULL DEFAULT -1 COMMENT '',
- `hide` boolean NOT NULL DEFAULT '0' COMMENT '1 = should be hidden from search',
- `nsfw` boolean NOT NULL DEFAULT '0' COMMENT '1 = contact posts nsfw content',
- `network` char(4) NOT NULL DEFAULT '' COMMENT 'social network protocol',
- `addr` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `notify` varchar(255) COMMENT '',
- `alias` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `generation` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `server_url` varchar(255) NOT NULL DEFAULT '' COMMENT 'baseurl of the contacts server',
- PRIMARY KEY(`id`),
- UNIQUE INDEX `nurl` (`nurl`(190)),
- INDEX `name` (`name`(64)),
- INDEX `nick` (`nick`(32)),
- INDEX `addr` (`addr`(64)),
- INDEX `hide_network_updated` (`hide`,`network`,`updated`),
- INDEX `updated` (`updated`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='global contacts';
-
---
--- TABLE gfollower
---
-CREATE TABLE IF NOT EXISTS `gfollower` (
- `gcid` int unsigned NOT NULL DEFAULT 0 COMMENT 'global contact',
- `follower-gcid` int unsigned NOT NULL DEFAULT 0 COMMENT 'global contact of the follower',
- `deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates that the connection has been deleted',
- PRIMARY KEY(`gcid`,`follower-gcid`),
- INDEX `follower-gcid` (`follower-gcid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Followers of global contacts';
-
---
--- TABLE glink
---
-CREATE TABLE IF NOT EXISTS `glink` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `cid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- `gcid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `zcid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- PRIMARY KEY(`id`),
- UNIQUE INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`),
- INDEX `gcid` (`gcid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='\'friends of friends\' linkages derived from poco';
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='friend suggestion stuff';
--
-- TABLE group
@@ -467,7 +574,8 @@ CREATE TABLE IF NOT EXISTS `group` (
`deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the group has been deleted',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT 'human readable name of group',
PRIMARY KEY(`id`),
- INDEX `uid` (`uid`)
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, group info';
--
@@ -479,36 +587,11 @@ CREATE TABLE IF NOT EXISTS `group_member` (
`contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id of the member assigned to the associated group',
PRIMARY KEY(`id`),
INDEX `contactid` (`contact-id`),
- UNIQUE INDEX `gid_contactid` (`gid`,`contact-id`)
+ UNIQUE INDEX `gid_contactid` (`gid`,`contact-id`),
+ FOREIGN KEY (`gid`) REFERENCES `group` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, member info';
---
--- TABLE gserver
---
-CREATE TABLE IF NOT EXISTS `gserver` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `url` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `nurl` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `version` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `site_name` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `info` text COMMENT '',
- `register_policy` tinyint NOT NULL DEFAULT 0 COMMENT '',
- `registered-users` int unsigned NOT NULL DEFAULT 0 COMMENT 'Number of registered users',
- `directory-type` tinyint DEFAULT 0 COMMENT 'Type of directory service (Poco, Mastodon)',
- `poco` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `noscrape` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `network` char(4) NOT NULL DEFAULT '' COMMENT '',
- `platform` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `relay-subscribe` boolean NOT NULL DEFAULT '0' COMMENT 'Has the server subscribed to the relay system',
- `relay-scope` varchar(10) NOT NULL DEFAULT '' COMMENT 'The scope of messages that the server wants to get',
- `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `last_poco_query` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `last_contact` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `last_failure` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
- PRIMARY KEY(`id`),
- UNIQUE INDEX `nurl` (`nurl`(190))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Global servers';
-
--
-- TABLE gserver-tag
--
@@ -516,7 +599,8 @@ CREATE TABLE IF NOT EXISTS `gserver-tag` (
`gserver-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'The id of the gserver',
`tag` varchar(100) NOT NULL DEFAULT '' COMMENT 'Tag that the server has subscribed',
PRIMARY KEY(`gserver-id`,`tag`),
- INDEX `tag` (`tag`)
+ INDEX `tag` (`tag`),
+ FOREIGN KEY (`gserver-id`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Tags that the server has subscribed';
--
@@ -532,6 +616,16 @@ CREATE TABLE IF NOT EXISTS `hook` (
UNIQUE INDEX `hook_file_function` (`hook`,`file`,`function`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='addon hook registry';
+--
+-- TABLE host
+--
+CREATE TABLE IF NOT EXISTS `host` (
+ `id` tinyint unsigned NOT NULL auto_increment COMMENT 'sequential ID',
+ `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'The hostname',
+ PRIMARY KEY(`id`),
+ UNIQUE INDEX `name` (`name`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Hostname';
+
--
-- TABLE inbox-status
--
@@ -552,7 +646,7 @@ CREATE TABLE IF NOT EXISTS `inbox-status` (
CREATE TABLE IF NOT EXISTS `intro` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- `fid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `fid` int unsigned COMMENT '',
`contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT '',
`knowyou` boolean NOT NULL DEFAULT '0' COMMENT '',
`duplex` boolean NOT NULL DEFAULT '0' COMMENT '',
@@ -561,7 +655,11 @@ CREATE TABLE IF NOT EXISTS `intro` (
`datetime` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
`blocked` boolean NOT NULL DEFAULT '1' COMMENT '',
`ignore` boolean NOT NULL DEFAULT '0' COMMENT '',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `contact-id` (`contact-id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
--
@@ -573,9 +671,9 @@ CREATE TABLE IF NOT EXISTS `item` (
`uri` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the item uri',
`uri-hash` varchar(80) NOT NULL DEFAULT '' COMMENT 'RIPEMD-128 hash from uri',
- `parent` int unsigned NOT NULL DEFAULT 0 COMMENT 'item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item',
- `parent-uri` varchar(255) NOT NULL DEFAULT '' COMMENT 'uri of the parent to this item',
- `parent-uri-id` int unsigned COMMENT 'Id of the item-uri table that contains the parent uri',
+ `parent` int unsigned COMMENT 'item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item',
+ `parent-uri` varchar(255) NOT NULL DEFAULT '' COMMENT 'uri of the top-level parent to this item',
+ `parent-uri-id` int unsigned COMMENT 'Id of the item-uri table that contains the top-level parent uri',
`thr-parent` varchar(255) NOT NULL DEFAULT '' COMMENT 'If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri',
`thr-parent-id` int unsigned COMMENT 'Id of the item-uri table that contains the thread parent uri',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Creation timestamp.',
@@ -587,8 +685,9 @@ CREATE TABLE IF NOT EXISTS `item` (
`network` char(4) NOT NULL DEFAULT '' COMMENT 'Network from where the item comes from',
`owner-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the owner of this item',
`author-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the author of this item',
+ `causer-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the contact that caused the item creation',
`icid` int unsigned COMMENT 'Id of the item-content table entry that contains the whole item content',
- `iaid` int unsigned COMMENT 'Id of the item-activity table entry that contains the activity data',
+ `vid` smallint unsigned COMMENT 'Id of the verb table entry that contains the activity verbs',
`extid` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`post-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Post type (personal note, bookmark, ...)',
`global` boolean NOT NULL DEFAULT '0' COMMENT '',
@@ -607,8 +706,9 @@ CREATE TABLE IF NOT EXISTS `item` (
`forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
`psid` int unsigned COMMENT 'ID of the permission set of this post',
`resource-id` varchar(32) NOT NULL DEFAULT '' COMMENT 'Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type',
- `event-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Used to link to the event.id',
- `attach` mediumtext COMMENT 'JSON structure representing attachments to this item',
+ `event-id` int unsigned COMMENT 'Used to link to the event.id',
+ `iaid` int unsigned COMMENT 'Deprecated',
+ `attach` mediumtext COMMENT 'Deprecated',
`allow_cid` mediumtext COMMENT 'Deprecated',
`allow_gid` mediumtext COMMENT 'Deprecated',
`deny_cid` mediumtext COMMENT 'Deprecated',
@@ -662,12 +762,27 @@ CREATE TABLE IF NOT EXISTS `item` (
INDEX `resource-id` (`resource-id`),
INDEX `deleted_changed` (`deleted`,`changed`),
INDEX `uid_wall_changed` (`uid`,`wall`,`changed`),
+ INDEX `uid_unseen_wall` (`uid`,`unseen`,`wall`),
INDEX `mention_uid_id` (`mention`,`uid`,`id`),
INDEX `uid_eventid` (`uid`,`event-id`),
INDEX `icid` (`icid`),
INDEX `iaid` (`iaid`),
+ INDEX `vid` (`vid`),
INDEX `psid_wall` (`psid`,`wall`),
- INDEX `uri-id` (`uri-id`)
+ INDEX `uri-id` (`uri-id`),
+ INDEX `parent-uri-id` (`parent-uri-id`),
+ INDEX `thr-parent-id` (`thr-parent-id`),
+ INDEX `causer-id` (`causer-id`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`thr-parent-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`owner-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`author-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`causer-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`vid`) REFERENCES `verb` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Structure for all posts';
--
@@ -682,7 +797,8 @@ CREATE TABLE IF NOT EXISTS `item-activity` (
PRIMARY KEY(`id`),
UNIQUE INDEX `uri-hash` (`uri-hash`),
INDEX `uri` (`uri`(191)),
- INDEX `uri-id` (`uri-id`)
+ INDEX `uri-id` (`uri-id`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Activities for items';
--
@@ -696,6 +812,7 @@ CREATE TABLE IF NOT EXISTS `item-content` (
`title` varchar(255) NOT NULL DEFAULT '' COMMENT 'item title',
`content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`body` mediumtext COMMENT 'item body content',
+ `raw-body` mediumtext COMMENT 'Body without embedded media links',
`location` varchar(255) NOT NULL DEFAULT '' COMMENT 'text location where this item originated',
`coord` varchar(255) NOT NULL DEFAULT '' COMMENT 'longitude/latitude pair representing location where this item originated',
`language` text COMMENT 'Language information about this post',
@@ -710,23 +827,13 @@ CREATE TABLE IF NOT EXISTS `item-content` (
`verb` varchar(100) NOT NULL DEFAULT '' COMMENT 'ActivityStreams verb',
PRIMARY KEY(`id`),
UNIQUE INDEX `uri-plink-hash` (`uri-plink-hash`),
+ FULLTEXT INDEX `title-content-warning-body` (`title`,`content-warning`,`body`),
INDEX `uri` (`uri`(191)),
INDEX `plink` (`plink`(191)),
- INDEX `uri-id` (`uri-id`)
+ INDEX `uri-id` (`uri-id`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Content for all posts';
---
--- TABLE item-uri
---
-CREATE TABLE IF NOT EXISTS `item-uri` (
- `id` int unsigned NOT NULL auto_increment,
- `uri` varbinary(255) NOT NULL COMMENT 'URI of an item',
- `guid` varbinary(255) COMMENT 'A unique identifier for an item',
- PRIMARY KEY(`id`),
- UNIQUE INDEX `uri` (`uri`),
- INDEX `guid` (`guid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='URI and GUID for items';
-
--
-- TABLE locks
--
@@ -750,8 +857,8 @@ CREATE TABLE IF NOT EXISTS `mail` (
`from-name` varchar(255) NOT NULL DEFAULT '' COMMENT 'name of the sender',
`from-photo` varchar(255) NOT NULL DEFAULT '' COMMENT 'contact photo link of the sender',
`from-url` varchar(255) NOT NULL DEFAULT '' COMMENT 'profile linke of the sender',
- `contact-id` varchar(255) NOT NULL DEFAULT '' COMMENT 'contact.id',
- `convid` int unsigned NOT NULL DEFAULT 0 COMMENT 'conv.id',
+ `contact-id` varchar(255) COMMENT 'contact.id',
+ `convid` int unsigned COMMENT 'conv.id',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`body` mediumtext COMMENT '',
`seen` boolean NOT NULL DEFAULT '0' COMMENT 'if message visited it is 1',
@@ -766,7 +873,8 @@ CREATE TABLE IF NOT EXISTS `mail` (
INDEX `convid` (`convid`),
INDEX `uri` (`uri`(64)),
INDEX `parent-uri` (`parent-uri`(64)),
- INDEX `contactid` (`contact-id`(32))
+ INDEX `contactid` (`contact-id`(32)),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='private messages';
--
@@ -786,7 +894,9 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
`movetofolder` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`pubmail` boolean NOT NULL DEFAULT '0' COMMENT '',
`last_check` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Mail account data for fetching mails';
--
@@ -797,7 +907,10 @@ CREATE TABLE IF NOT EXISTS `manage` (
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
`mid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
PRIMARY KEY(`id`),
- UNIQUE INDEX `uid_mid` (`uid`,`mid`)
+ UNIQUE INDEX `uid_mid` (`uid`,`mid`),
+ INDEX `mid` (`mid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`mid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='table of accounts that can manage each other';
--
@@ -813,8 +926,8 @@ CREATE TABLE IF NOT EXISTS `notify` (
`msg` mediumtext COMMENT '',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id',
`link` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `iid` int unsigned NOT NULL DEFAULT 0 COMMENT 'item.id',
- `parent` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `iid` int unsigned COMMENT 'item.id',
+ `parent` int unsigned COMMENT '',
`uri-id` int unsigned COMMENT 'Item-uri id of the related post',
`parent-uri-id` int unsigned COMMENT 'Item-uri id of the parent of the related post',
`seen` boolean NOT NULL DEFAULT '0' COMMENT '',
@@ -825,7 +938,12 @@ CREATE TABLE IF NOT EXISTS `notify` (
PRIMARY KEY(`id`),
INDEX `seen_uid_date` (`seen`,`uid`,`date`),
INDEX `uid_date` (`uid`,`date`),
- INDEX `uid_type_link` (`uid`,`type`,`link`(190))
+ INDEX `uid_type_link` (`uid`,`type`,`link`(190)),
+ INDEX `uri-id` (`uri-id`),
+ INDEX `parent-uri-id` (`parent-uri-id`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='notifications';
--
@@ -834,11 +952,19 @@ CREATE TABLE IF NOT EXISTS `notify` (
CREATE TABLE IF NOT EXISTS `notify-threads` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
`notify-id` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `master-parent-item` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `master-parent-item` int unsigned COMMENT '',
`master-parent-uri-id` int unsigned COMMENT 'Item-uri id of the parent of the related post',
`parent-item` int unsigned NOT NULL DEFAULT 0 COMMENT '',
`receiver-uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `master-parent-item` (`master-parent-item`),
+ INDEX `master-parent-uri-id` (`master-parent-uri-id`),
+ INDEX `receiver-uid` (`receiver-uid`),
+ INDEX `notify-id` (`notify-id`),
+ FOREIGN KEY (`notify-id`) REFERENCES `notify` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`master-parent-item`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`master-parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`receiver-uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
--
@@ -858,12 +984,14 @@ CREATE TABLE IF NOT EXISTS `oembed` (
--
CREATE TABLE IF NOT EXISTS `openwebauth-token` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
+ `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id - currently unused',
`type` varchar(32) NOT NULL DEFAULT '' COMMENT 'Verify type',
`token` varchar(255) NOT NULL DEFAULT '' COMMENT 'A generated token',
`meta` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime of creation',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Store OpenWebAuth token to verify contacts';
--
@@ -889,36 +1017,26 @@ CREATE TABLE IF NOT EXISTS `participation` (
`fid` int unsigned NOT NULL COMMENT '',
PRIMARY KEY(`iid`,`server`),
INDEX `cid` (`cid`),
- INDEX `fid` (`fid`)
+ INDEX `fid` (`fid`),
+ FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`fid`) REFERENCES `fcontact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Storage for participation messages from Diaspora';
--
-- TABLE pconfig
--
CREATE TABLE IF NOT EXISTS `pconfig` (
- `id` int unsigned NOT NULL auto_increment COMMENT '',
+ `id` int unsigned NOT NULL auto_increment COMMENT 'Primary key',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- `cat` varbinary(50) NOT NULL DEFAULT '' COMMENT '',
- `k` varbinary(100) NOT NULL DEFAULT '' COMMENT '',
- `v` mediumtext COMMENT '',
+ `cat` varchar(50) NOT NULL DEFAULT '' COMMENT 'Category',
+ `k` varchar(100) NOT NULL DEFAULT '' COMMENT 'Key',
+ `v` mediumtext COMMENT 'Value',
PRIMARY KEY(`id`),
- UNIQUE INDEX `uid_cat_k` (`uid`,`cat`,`k`)
+ UNIQUE INDEX `uid_cat_k` (`uid`,`cat`,`k`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='personal (per user) configuration storage';
---
--- TABLE permissionset
---
-CREATE TABLE IF NOT EXISTS `permissionset` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner id of this permission set',
- `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>\'',
- `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups',
- `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id',
- `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
- PRIMARY KEY(`id`),
- INDEX `uid_allow_cid_allow_gid_deny_cid_deny_gid` (`allow_cid`(50),`allow_gid`(30),`deny_cid`(50),`deny_gid`(30))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
-
--
-- TABLE photo
--
@@ -928,6 +1046,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
`contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id',
`guid` char(16) NOT NULL DEFAULT '' COMMENT 'A unique identifier for this photo',
`resource-id` char(32) NOT NULL DEFAULT '' COMMENT '',
+ `hash` char(32) COMMENT 'hash value of the photo',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation date',
`edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'last edited date',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '',
@@ -955,39 +1074,105 @@ CREATE TABLE IF NOT EXISTS `photo` (
INDEX `uid_profile` (`uid`,`profile`),
INDEX `uid_album_scale_created` (`uid`,`album`(32),`scale`,`created`),
INDEX `uid_album_resource-id_created` (`uid`,`album`(32),`resource-id`,`created`),
- INDEX `resource-id` (`resource-id`)
+ INDEX `resource-id` (`resource-id`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='photo storage';
--
--- TABLE poll
+-- TABLE post-category
--
-CREATE TABLE IF NOT EXISTS `poll` (
- `id` int unsigned NOT NULL auto_increment COMMENT '',
+CREATE TABLE IF NOT EXISTS `post-category` (
+ `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- `q0` text COMMENT '',
- `q1` text COMMENT '',
- `q2` text COMMENT '',
- `q3` text COMMENT '',
- `q4` text COMMENT '',
- `q5` text COMMENT '',
- `q6` text COMMENT '',
- `q7` text COMMENT '',
- `q8` text COMMENT '',
- `q9` text COMMENT '',
- PRIMARY KEY(`id`),
- INDEX `uid` (`uid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Currently unused table for storing poll results';
+ `type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `tid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ PRIMARY KEY(`uri-id`,`uid`,`type`,`tid`),
+ INDEX `uri-id` (`tid`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`tid`) REFERENCES `tag` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to categories';
--
--- TABLE poll_result
+-- TABLE post-delivery-data
--
-CREATE TABLE IF NOT EXISTS `poll_result` (
+CREATE TABLE IF NOT EXISTS `post-delivery-data` (
+ `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
+ `postopts` text COMMENT 'External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery',
+ `inform` mediumtext COMMENT 'Additional receivers of the linked item',
+ `queue_count` mediumint NOT NULL DEFAULT 0 COMMENT 'Initial number of delivery recipients, used as item.delivery_queue_count',
+ `queue_done` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries, used as item.delivery_queue_done',
+ `queue_failed` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of unsuccessful deliveries, used as item.delivery_queue_failed',
+ `activitypub` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via ActivityPub',
+ `dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via DFRN',
+ `legacy_dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via legacy DFRN',
+ `diaspora` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via Diaspora',
+ `ostatus` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via OStatus',
+ PRIMARY KEY(`uri-id`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for items';
+
+--
+-- TABLE post-media
+--
+CREATE TABLE IF NOT EXISTS `post-media` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `poll_id` int unsigned NOT NULL DEFAULT 0,
- `choice` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
+ `url` varbinary(511) NOT NULL COMMENT 'Media URL',
+ `type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Media type',
+ `mimetype` varchar(60) COMMENT '',
+ `height` smallint unsigned COMMENT 'Height of the media',
+ `width` smallint unsigned COMMENT 'Width of the media',
+ `size` int unsigned COMMENT 'Media size',
+ `preview` varbinary(255) COMMENT 'Preview URL',
+ `preview-height` smallint unsigned COMMENT 'Height of the preview picture',
+ `preview-width` smallint unsigned COMMENT 'Width of the preview picture',
+ `description` text COMMENT '',
PRIMARY KEY(`id`),
- INDEX `poll_id` (`poll_id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='data for polls - currently unused';
+ UNIQUE INDEX `uri-id-url` (`uri-id`,`url`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Attached media';
+
+--
+-- TABLE post-tag
+--
+CREATE TABLE IF NOT EXISTS `post-tag` (
+ `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
+ `type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `tid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `cid` int unsigned NOT NULL DEFAULT 0 COMMENT 'Contact id of the mentioned public contact',
+ PRIMARY KEY(`uri-id`,`type`,`tid`,`cid`),
+ INDEX `tid` (`tid`),
+ INDEX `cid` (`cid`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`tid`) REFERENCES `tag` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to tags';
+
+--
+-- TABLE post-user
+--
+CREATE TABLE IF NOT EXISTS `post-user` (
+ `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
+ `uid` mediumint unsigned NOT NULL COMMENT 'Owner id which owns this copy of the item',
+ `protocol` tinyint unsigned COMMENT 'Protocol used to deliver the item for this user',
+ `contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id',
+ `unseen` boolean NOT NULL DEFAULT '1' COMMENT 'post has not been seen',
+ `hidden` boolean NOT NULL DEFAULT '0' COMMENT 'Marker to hide the post from the user',
+ `notification-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
+ `origin` boolean NOT NULL DEFAULT '0' COMMENT 'item originated at this site',
+ `psid` int unsigned COMMENT 'ID of the permission set of this post',
+ PRIMARY KEY(`uid`,`uri-id`),
+ INDEX `uri-id` (`uri-id`),
+ INDEX `contact-id` (`contact-id`),
+ INDEX `psid` (`psid`),
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='User specific post data';
--
-- TABLE process
@@ -1048,7 +1233,8 @@ CREATE TABLE IF NOT EXISTS `profile` (
`net-publish` boolean NOT NULL DEFAULT '0' COMMENT 'publish profile in global directory',
PRIMARY KEY(`id`),
INDEX `uid_is-default` (`uid`,`is-default`),
- FULLTEXT INDEX `pub_keywords` (`pub_keywords`)
+ FULLTEXT INDEX `pub_keywords` (`pub_keywords`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='user profiles data';
--
@@ -1061,7 +1247,11 @@ CREATE TABLE IF NOT EXISTS `profile_check` (
`dfrn_id` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`sec` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `uid` (`uid`),
+ INDEX `cid` (`cid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='DFRN remote auth use';
--
@@ -1079,7 +1269,9 @@ CREATE TABLE IF NOT EXISTS `profile_field` (
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `order` (`order`),
- INDEX `psid` (`psid`)
+ INDEX `psid` (`psid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Custom profile fields';
--
@@ -1097,7 +1289,9 @@ CREATE TABLE IF NOT EXISTS `push_subscriber` (
`renewed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of last subscription renewal',
`secret` varchar(255) NOT NULL DEFAULT '' COMMENT '',
PRIMARY KEY(`id`),
- INDEX `next_try` (`next_try`)
+ INDEX `next_try` (`next_try`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Used for OStatus: Contains feed subscribers';
--
@@ -1111,7 +1305,9 @@ CREATE TABLE IF NOT EXISTS `register` (
`password` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`language` varchar(16) NOT NULL DEFAULT '' COMMENT '',
`note` text COMMENT '',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registrations requiring admin approval';
--
@@ -1122,7 +1318,8 @@ CREATE TABLE IF NOT EXISTS `search` (
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
`term` varchar(255) NOT NULL DEFAULT '' COMMENT '',
PRIMARY KEY(`id`),
- INDEX `uid` (`uid`)
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
--
@@ -1139,88 +1336,20 @@ CREATE TABLE IF NOT EXISTS `session` (
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='web session storage';
--
--- TABLE term
+-- TABLE storage
--
-CREATE TABLE IF NOT EXISTS `term` (
- `tid` int unsigned NOT NULL auto_increment COMMENT '',
- `oid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `otype` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `term` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `url` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `guid` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
- `global` boolean NOT NULL DEFAULT '0' COMMENT '',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- PRIMARY KEY(`tid`),
- INDEX `term_type` (`term`(64),`type`),
- INDEX `oid_otype_type_term` (`oid`,`otype`,`type`,`term`(32)),
- INDEX `uid_otype_type_term_global_created` (`uid`,`otype`,`type`,`term`(32),`global`,`created`),
- INDEX `uid_otype_type_url` (`uid`,`otype`,`type`,`url`(64)),
- INDEX `guid` (`guid`(64))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='item taxonomy (categories, tags, etc.) table';
-
---
--- TABLE tag
---
-CREATE TABLE IF NOT EXISTS `tag` (
- `id` int unsigned NOT NULL auto_increment COMMENT '',
- `name` varchar(96) NOT NULL DEFAULT '' COMMENT '',
- `url` varbinary(255) NOT NULL DEFAULT '' COMMENT '',
- PRIMARY KEY(`id`),
- UNIQUE INDEX `type_name_url` (`name`,`url`),
- INDEX `url` (`url`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='tags and mentions';
-
---
--- TABLE post-category
---
-CREATE TABLE IF NOT EXISTS `post-category` (
- `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
- `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- `type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `tid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- PRIMARY KEY(`uri-id`,`uid`,`type`,`tid`),
- INDEX `uri-id` (`tid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to categories';
-
---
--- TABLE post-delivery-data
---
-CREATE TABLE IF NOT EXISTS `post-delivery-data` (
- `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
- `postopts` text COMMENT 'External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery',
- `inform` mediumtext COMMENT 'Additional receivers of the linked item',
- `queue_count` mediumint NOT NULL DEFAULT 0 COMMENT 'Initial number of delivery recipients, used as item.delivery_queue_count',
- `queue_done` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries, used as item.delivery_queue_done',
- `queue_failed` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of unsuccessful deliveries, used as item.delivery_queue_failed',
- `activitypub` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via ActivityPub',
- `dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via DFRN',
- `legacy_dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via legacy DFRN',
- `diaspora` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via Diaspora',
- `ostatus` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via OStatus',
- PRIMARY KEY(`uri-id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for items';
-
---
--- TABLE post-tag
---
-CREATE TABLE IF NOT EXISTS `post-tag` (
- `uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
- `type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `tid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `cid` int unsigned NOT NULL DEFAULT 0 COMMENT 'Contact id of the mentioned public contact',
- PRIMARY KEY(`uri-id`,`type`,`tid`,`cid`),
- INDEX `uri-id` (`tid`),
- INDEX `cid` (`tid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to tags';
+CREATE TABLE IF NOT EXISTS `storage` (
+ `id` int unsigned NOT NULL auto_increment COMMENT 'Auto incremented image data id',
+ `data` longblob NOT NULL COMMENT 'file data',
+ PRIMARY KEY(`id`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Data stored by Database storage backend';
--
-- TABLE thread
--
CREATE TABLE IF NOT EXISTS `thread` (
`iid` int unsigned NOT NULL DEFAULT 0 COMMENT 'sequential ID',
+ `uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the item uri',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
`contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT '',
`owner-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Item owner',
@@ -1256,7 +1385,14 @@ CREATE TABLE IF NOT EXISTS `thread` (
INDEX `uid_received` (`uid`,`received`),
INDEX `uid_commented` (`uid`,`commented`),
INDEX `uid_wall_received` (`uid`,`wall`,`received`),
- INDEX `private_wall_origin_commented` (`private`,`wall`,`origin`,`commented`)
+ INDEX `private_wall_origin_commented` (`private`,`wall`,`origin`,`commented`),
+ INDEX `uri-id` (`uri-id`),
+ FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`owner-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
+ FOREIGN KEY (`author-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Thread related data';
--
@@ -1269,62 +1405,13 @@ CREATE TABLE IF NOT EXISTS `tokens` (
`expires` int NOT NULL DEFAULT 0 COMMENT '',
`scope` varchar(200) NOT NULL DEFAULT '' COMMENT '',
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
- PRIMARY KEY(`id`)
+ PRIMARY KEY(`id`),
+ INDEX `client_id` (`client_id`),
+ INDEX `uid` (`uid`),
+ FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
---
--- TABLE user
---
-CREATE TABLE IF NOT EXISTS `user` (
- `uid` mediumint unsigned NOT NULL auto_increment COMMENT 'sequential ID',
- `parent-uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'The parent user that has full control about this user',
- `guid` varchar(64) NOT NULL DEFAULT '' COMMENT 'A unique identifier for this user',
- `username` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name that this user is known by',
- `password` varchar(255) NOT NULL DEFAULT '' COMMENT 'encrypted password',
- `legacy_password` boolean NOT NULL DEFAULT '0' COMMENT 'Is the password hash double-hashed?',
- `nickname` varchar(255) NOT NULL DEFAULT '' COMMENT 'nick- and user name',
- `email` varchar(255) NOT NULL DEFAULT '' COMMENT 'the users email address',
- `openid` varchar(255) NOT NULL DEFAULT '' COMMENT '',
- `timezone` varchar(128) NOT NULL DEFAULT '' COMMENT 'PHP-legal timezone',
- `language` varchar(32) NOT NULL DEFAULT 'en' COMMENT 'default language',
- `register_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of registration',
- `login_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last login',
- `default-location` varchar(255) NOT NULL DEFAULT '' COMMENT 'Default for item.location',
- `allow_location` boolean NOT NULL DEFAULT '0' COMMENT '1 allows to display the location',
- `theme` varchar(255) NOT NULL DEFAULT '' COMMENT 'user theme preference',
- `pubkey` text COMMENT 'RSA public key 4096 bit',
- `prvkey` text COMMENT 'RSA private key 4096 bit',
- `spubkey` text COMMENT '',
- `sprvkey` text COMMENT '',
- `verified` boolean NOT NULL DEFAULT '0' COMMENT 'user is verified through email',
- `blocked` boolean NOT NULL DEFAULT '0' COMMENT '1 for user is blocked',
- `blockwall` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to post to the profile page of the user',
- `hidewall` boolean NOT NULL DEFAULT '0' COMMENT 'Hide profile details from unkown viewers',
- `blocktags` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to tag the post of this user',
- `unkmail` boolean NOT NULL DEFAULT '0' COMMENT 'Permit unknown people to send private mails to this user',
- `cntunkmail` int unsigned NOT NULL DEFAULT 10 COMMENT '',
- `notify-flags` smallint unsigned NOT NULL DEFAULT 65535 COMMENT 'email notification options',
- `page-flags` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'page/profile type',
- `account-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `prvnets` boolean NOT NULL DEFAULT '0' COMMENT '',
- `pwdreset` varchar(255) COMMENT 'Password reset request token',
- `pwdreset_time` datetime COMMENT 'Timestamp of the last password reset request',
- `maxreq` int unsigned NOT NULL DEFAULT 10 COMMENT '',
- `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `account_removed` boolean NOT NULL DEFAULT '0' COMMENT 'if 1 the account is removed',
- `account_expired` boolean NOT NULL DEFAULT '0' COMMENT '',
- `account_expires_on` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp when account expires and will be deleted',
- `expire_notification_sent` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last warning of account expiration',
- `def_gid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
- `allow_cid` mediumtext COMMENT 'default permission for this user',
- `allow_gid` mediumtext COMMENT 'default permission for this user',
- `deny_cid` mediumtext COMMENT 'default permission for this user',
- `deny_gid` mediumtext COMMENT 'default permission for this user',
- `openidserver` text COMMENT '',
- PRIMARY KEY(`uid`),
- INDEX `nickname` (`nickname`(32))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='The local users';
-
--
-- TABLE userd
--
@@ -1344,7 +1431,10 @@ CREATE TABLE IF NOT EXISTS `user-contact` (
`blocked` boolean COMMENT 'Contact is completely blocked for this user',
`ignored` boolean COMMENT 'Posts from this contact are ignored',
`collapsed` boolean COMMENT 'Posts from this contact are collapsed',
- PRIMARY KEY(`uid`,`cid`)
+ PRIMARY KEY(`uid`,`cid`),
+ INDEX `cid` (`cid`),
+ FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='User specific public contact data';
--
@@ -1359,7 +1449,9 @@ CREATE TABLE IF NOT EXISTS `user-item` (
`notification-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
PRIMARY KEY(`uid`,`iid`),
INDEX `uid_pinned` (`uid`,`pinned`),
- INDEX `iid_uid` (`iid`,`uid`)
+ INDEX `iid_uid` (`iid`,`uid`),
+ FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+ FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='User specific item data';
--
@@ -1376,7 +1468,8 @@ CREATE TABLE IF NOT EXISTS `worker-ipc` (
--
CREATE TABLE IF NOT EXISTS `workerqueue` (
`id` int unsigned NOT NULL auto_increment COMMENT 'Auto incremented worker task id',
- `parameter` mediumtext COMMENT 'Task command',
+ `command` varchar(100) COMMENT 'Task command',
+ `parameter` mediumtext COMMENT 'Task parameter',
`priority` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Task priority',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Creation date',
`pid` int unsigned NOT NULL DEFAULT 0 COMMENT 'Process id of the worker',
@@ -1385,23 +1478,16 @@ CREATE TABLE IF NOT EXISTS `workerqueue` (
`retrial` tinyint NOT NULL DEFAULT 0 COMMENT 'Retrial counter',
`done` boolean NOT NULL DEFAULT '0' COMMENT 'Marked 1 when the task was done - will be deleted later',
PRIMARY KEY(`id`),
- INDEX `done_parameter` (`done`,`parameter`(64)),
+ INDEX `command` (`command`),
+ INDEX `done_command_parameter` (`done`,`command`,`parameter`(64)),
INDEX `done_executed` (`done`,`executed`),
- INDEX `done_priority_created` (`done`,`priority`,`created`),
+ INDEX `done_priority_retrial_created` (`done`,`priority`,`retrial`,`created`),
INDEX `done_priority_next_try` (`done`,`priority`,`next_try`),
INDEX `done_pid_next_try` (`done`,`pid`,`next_try`),
+ INDEX `done_pid_retrial` (`done`,`pid`,`retrial`),
INDEX `done_pid_priority_created` (`done`,`pid`,`priority`,`created`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Background tasks queue entries';
---
--- TABLE storage
---
-CREATE TABLE IF NOT EXISTS `storage` (
- `id` int unsigned NOT NULL auto_increment COMMENT 'Auto incremented image data id',
- `data` longblob NOT NULL COMMENT 'file data',
- PRIMARY KEY(`id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Data stored by Database storage backend';
-
--
-- VIEW category-view
--
@@ -1437,6 +1523,69 @@ CREATE VIEW `tag-view` AS SELECT
LEFT JOIN `tag` ON `post-tag`.`tid` = `tag`.`id`
LEFT JOIN `contact` ON `post-tag`.`cid` = `contact`.`id`;
+--
+-- VIEW network-item-view
+--
+DROP VIEW IF EXISTS `network-item-view`;
+CREATE VIEW `network-item-view` AS SELECT
+ `item`.`parent-uri-id` AS `uri-id`,
+ `item`.`parent-uri` AS `uri`,
+ `item`.`parent` AS `parent`,
+ `item`.`received` AS `received`,
+ `item`.`commented` AS `commented`,
+ `item`.`created` AS `created`,
+ `item`.`uid` AS `uid`,
+ `item`.`starred` AS `starred`,
+ `item`.`mention` AS `mention`,
+ `item`.`network` AS `network`,
+ `item`.`unseen` AS `unseen`,
+ `item`.`gravity` AS `gravity`,
+ `item`.`contact-id` AS `contact-id`,
+ `ownercontact`.`contact-type` AS `contact-type`
+ FROM `item`
+ INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
+ STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
+ LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
+ LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
+ LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
+ LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id`
+ WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
+ AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
+ AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
+ AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
+ AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`);
+
+--
+-- VIEW network-thread-view
+--
+DROP VIEW IF EXISTS `network-thread-view`;
+CREATE VIEW `network-thread-view` AS SELECT
+ `item`.`uri-id` AS `uri-id`,
+ `item`.`uri` AS `uri`,
+ `item`.`parent-uri-id` AS `parent-uri-id`,
+ `thread`.`iid` AS `parent`,
+ `thread`.`received` AS `received`,
+ `thread`.`commented` AS `commented`,
+ `thread`.`created` AS `created`,
+ `thread`.`uid` AS `uid`,
+ `thread`.`starred` AS `starred`,
+ `thread`.`mention` AS `mention`,
+ `thread`.`network` AS `network`,
+ `thread`.`contact-id` AS `contact-id`,
+ `ownercontact`.`contact-type` AS `contact-type`
+ FROM `thread`
+ STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
+ STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
+ LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
+ LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
+ LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
+ LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id`
+ WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
+ AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
+ AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
+ AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
+ AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`);
+
--
-- VIEW owner-view
--
@@ -1494,18 +1643,18 @@ CREATE VIEW `owner-view` AS SELECT
`contact`.`term-date` AS `term-date`,
`contact`.`last-item` AS `last-item`,
`contact`.`priority` AS `priority`,
- `contact`.`blocked` AS `blocked`,
+ `user`.`blocked` AS `blocked`,
`contact`.`block_reason` AS `block_reason`,
`contact`.`readonly` AS `readonly`,
`contact`.`writable` AS `writable`,
`contact`.`forum` AS `forum`,
`contact`.`prv` AS `prv`,
`contact`.`contact-type` AS `contact-type`,
+ `contact`.`manually-approve` AS `manually-approve`,
`contact`.`hidden` AS `hidden`,
`contact`.`archive` AS `archive`,
`contact`.`pending` AS `pending`,
`contact`.`deleted` AS `deleted`,
- `contact`.`rating` AS `rating`,
`contact`.`unsearchable` AS `unsearchable`,
`contact`.`sensitive` AS `sensitive`,
`contact`.`baseurl` AS `baseurl`,
@@ -1517,7 +1666,7 @@ CREATE VIEW `owner-view` AS SELECT
`contact`.`bd` AS `bd`,
`contact`.`notify_new_posts` AS `notify_new_posts`,
`contact`.`fetch_further_information` AS `fetch_further_information`,
- `contact`.`ffi_keyword_blacklist` AS `ffi_keyword_blacklist`,
+ `contact`.`ffi_keyword_denylist` AS `ffi_keyword_denylist`,
`user`.`parent-uid` AS `parent-uid`,
`user`.`guid` AS `guid`,
`user`.`nickname` AS `nickname`,
@@ -1625,5 +1774,3 @@ CREATE VIEW `workerqueue-view` AS SELECT
FROM `process`
INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid`
WHERE NOT `workerqueue`.`done`;
-
-
diff --git a/doc/API-Mastodon.md b/doc/API-Mastodon.md
index d9e6f22b6..588947cc3 100644
--- a/doc/API-Mastodon.md
+++ b/doc/API-Mastodon.md
@@ -15,10 +15,13 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
## Implemented endpoints
+- [`GET /api/v1//accounts/:id`](https://docs.joinmastodon.org/methods/accounts/#retrieve-information)
+- [`GET /api/v1//accounts/:id/statuses`](https://docs.joinmastodon.org/methods/accounts/#retrieve-information)
- [`GET /api/v1/custom_emojis`](https://docs.joinmastodon.org/methods/instance/custom_emojis/)
- Doesn't return unicode emojis since they aren't using an image URL
+- [`GET /api/v1/directory`](https://docs.joinmastodon.org/methods/instance/directory/)
- [`GET /api/v1/follow_requests`](https://docs.joinmastodon.org/methods/accounts/follow_requests#pending-follows)
- Returned IDs are specific to follow requests
- [`POST /api/v1/follow_requests/:id/authorize`](https://docs.joinmastodon.org/methods/accounts/follow_requests#accept-follow)
@@ -33,6 +36,8 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
- [`GET /api/v1/instance`](https://docs.joinmastodon.org/methods/instance#fetch-instance)
- [`GET /api/v1/instance/peers`](https://docs.joinmastodon.org/methods/instance#list-of-connected-domains)
+- [`GET /api/v1/timelines/public`](https://docs.joinmastodon.org/methods/timelines/)
+- [`GET /api/v1/trends`](https://docs.joinmastodon.org/methods/instance/trends/)
## Non-implemented endpoints
diff --git a/doc/API-Twitter.md b/doc/API-Twitter.md
index d352e528d..fab26ae5b 100644
--- a/doc/API-Twitter.md
+++ b/doc/API-Twitter.md
@@ -152,19 +152,29 @@ These endpoints use the [Friendica API entities](help/API-Entities).
- [GET api/friendships/incoming](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friendships-incoming)
- Unsupported parameters
- `stringify_ids`
-- [GET api/followers/ids](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids)
- - Unsupported parameters:
- - `user_id`: Relationships aren't returned for other users than self
- - `screen_name`: Relationships aren't returned for other users than self
-- [GET api/friends/ids](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-ids)
- - Unsupported parameters:
- - `user_id`: Relationships aren't returned for other users than self
- - `screen_name`: Relationships aren't returned for other users than self
+
+- - [GET api/followers/ids](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids)
+ - [GET api/followers/list](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-list)
+ - [GET api/friends/ids](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-ids)
+ - [GET api/friends/list](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-list)
+ - Additional parameters:
+ - `since_id`: You can use the `next_cursor` value to load the next page.
+ - `max_id`: You can use the inverse of the `previous_cursor` value to load the previous page.
+ - Unsupported parameter:
+ - `skip_status`: No status is returned even if it isn't set to true.
+ - Caveats:
+ - `cursor` trumps `since_id` trumps `max_id` if any combination is provided.
+ - `user_id` must be the ID of a contact associated with a local user account.
+ - `screen_name` must be associated with a local user account.
+ - `screen_name` trumps `user_id` if both are provided (undocumented Twitter behavior).
+ - Will succeed but return an empty array for users hiding their contact lists.
- [POST api/friendships/destroy](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/post-friendships-destroy)
+
+
## Non-implemented endpoints
- [GET oauth/authenticate](https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate)
@@ -188,8 +198,6 @@ These endpoints use the [Friendica API entities](help/API-Entities).
- [POST lists/subscribers/destroy](https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/post-lists-subscribers-destroy)
-- [GET followers/list](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-list)
-- [GET friends/list](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-list)
- [GET friendships/lookup](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friendships-lookup)
- [GET friendships/no_retweets/ids](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friendships-no_retweets-ids)
- [GET friendships/outgoing](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friendships-outgoing)
diff --git a/doc/Addons.md b/doc/Addons.md
index bf8f9eef4..c1861c791 100644
--- a/doc/Addons.md
+++ b/doc/Addons.md
@@ -466,6 +466,19 @@ Hook data is a `\FastRoute\RouterCollector` object that should be used to add ad
**Notice**: The class whose name is provided in the route handler must be reachable via auto-loader.
+### probe_detect
+
+Called before trying to detect the target network of a URL.
+If any registered hook function sets the `result` key of the hook data array, it will be returned immediately.
+Hook functions should also return immediately if the hook data contains an existing result.
+
+Hook data:
+
+- **uri** (input): the profile URI.
+- **network** (input): the target network (can be empty for auto-detection).
+- **uid** (input): the user to return the contact data for (can be empty for public contacts).
+- **result** (output): Set by the hook function to indicate a successful detection.
+
## Complete list of hook callbacks
Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above.
@@ -505,10 +518,6 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
Hook::callAll('item_photo_menu', $args);
Hook::callAll('jot_tool', $jotplugins);
-### include/items.php
-
- Hook::callAll('page_info_data', $data);
-
### mod/directory.php
Hook::callAll('directory_item', $arr);
@@ -595,10 +604,6 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
Hook::callAll('post_local_end', $arr);
-### mod/lockview.php
-
- Hook::callAll('lockview_content', $item);
-
### mod/uexport.php
Hook::callAll('uexport_options', $options);
@@ -670,6 +675,10 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
Hook::callAll('register_account', $uid);
Hook::callAll('remove_user', $user);
+### src/Module/PermissionTooltip.php
+
+ Hook::callAll('lockview_content', $item);
+
### src/Content/ContactBlock.php
Hook::callAll('contact_block_end', $arr);
diff --git a/doc/BBCode.md b/doc/BBCode.md
index cab51bd09..753bc6942 100644
--- a/doc/BBCode.md
+++ b/doc/BBCode.md
@@ -65,17 +65,17 @@ table.bbcodes > * > tr > th {
Friendica |
- [img]https://raw.githubusercontent.com/friendica/friendica/master/images/friendica-32.jpg[/img] |
- |
+ [img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img] |
+ |
- [img=https://raw.githubusercontent.com/friendica/friendica/master/images/friendica-32.jpg]The Friendica Logo[/img] |
- |
+ [img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg]The Friendica Logo[/img] |
+ |
- [img=64x32]https://raw.githubusercontent.com/friendica/friendica/master/images/friendica-32.jpg[/img]
+ | [img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img]
Note: provided height is simply discarded. |
- |
+ |
[size=xx-small]small text[/size] |
@@ -502,10 +502,6 @@ You can embed video, audio and more in a message.
[embed]URL[/embed] |
Embed OEmbed rich content. |
-
- [iframe]URL[/iframe] |
- General embed, iframe size is limited by the theme size for video players. |
-
[url]*url*[/url] |
If *url* supports oembed or opengraph specifications the embedded object will be shown (eg, documents from scribd).
@@ -613,15 +609,34 @@ On Mastodon this field is used for the content warning.
| Result |
- If you need to put literal bbcode in a message, [noparse], [nobb] or [pre] are used to escape bbcode:
+ | If you need to put literal BBCode in a message, [noparse], [nobb] or [pre] blocks prevent BBCode conversion:
- [noparse][b]bold[/b][/noparse]
- [nobb][b]bold[/b][/nobb]
- [pre][b]bold[/b][/pre]
+ Note: [code] has priority over [noparse], [nobb] and [pre] which makes them display as BBCode tags in code blocks instead of being removed.
+ [code] blocks inside [noparse] will still be converted to a code block.
|
[b]bold[/b] |
+
+ Additionally, [noparse] and [pre] blocks prevent mention and hashtag conversion to links:
+
+ - [noparse]@user@domain.tld #hashtag[/noparse]
+ - [pre]@user@domain.tld #hashtag[/pre]
+
+ |
+ @user@domain.tld #hashtag |
+
+
+ Additionally, [pre] blocks preserve spaces:
+
+ |
+ Spaces |
+
[nosmile] is used to disable smilies on a post by post basis
diff --git a/doc/Chats.md b/doc/Chats.md
index 29067e128..df3e7c784 100644
--- a/doc/Chats.md
+++ b/doc/Chats.md
@@ -43,7 +43,7 @@ At first you have to get the current version. You can either pull it from [Githu
$> cd /var/www/virtual/YOURSPACE/html/addon; git pull
-Or you can download a tar archive here: [jappixmini.tgz](https://github.com/friendica/friendica-addons/blob/master/jappixmini.tgz) (click at „view raw“).
+Or you can download a tar archive here: [jappixmini.tgz](https://github.com/friendica/friendica-addons/blob/stable/jappixmini.tgz) (click at „view raw“).
Just unpack the file and rename the directory to „jappixmini“.
Next, upload this directory and the .tgz-file into your addon directory of your friendica installation.
diff --git a/doc/Forums.md b/doc/Forums.md
index 03657b6af..d58a8565a 100644
--- a/doc/Forums.md
+++ b/doc/Forums.md
@@ -4,49 +4,46 @@ Forums
* [Home](help)
-Friendica also lets you create forums and/or celebrity accounts.
+Friendica also lets you create community forums and other types of accounts that can function as discussion forums, celebrity accounts, announcement channels, news reflectors, or organization pages, depending on how you want to interact with others. Management of these pages can be delegated to other accounts, or a parent account can be designated to easily toggle multiple identities.
-Every page in Friendica has a nickname and these must all be unique.
-This applies to all forums, whether they are normal profiles or forum profiles.
+Every page in Friendica has a nickname and these must all be unique. This applies to all forums, whether they are normal profiles or forum profiles.
-Therefore the first thing you need to do to create a new forum is to register a new account for the forum.
-Please note that the site administrator can restrict and/or regulate the registration of new accounts.
-
-If you create a second account on a system and use the same email address or OpenID account as an existing account, you will no longer be able to use the email address (or OpenID) to log in to the account.
-You should log in using the account nickname instead.
-
-On the new account, visit the 'Settings' page.
-Towards the end of the page are "Advanced Account/Page Type Settings".
-Typically you would use "Normal Account" for a normal personal account.
-This is the default selection.
-Community Forum/Celebrity Accounts provide the ability for people to become friends/fans of the forum without requiring approval.
-
-The exact setting you would use depends on how you wish to interact with people who join the page.
-The "Soapbox" setting lets the page owner control all communications.
-Everything you post will go out to the forum members, but there will be no opportunity for interaction.
-This setting would typically be used for announcements or corporate communications.
-
-The most common setting is the "Community Forum".
-This creates a forum page where all members can freely interact.
-
-The "Automatic Friend Account" is typically used for personal profile forums where you wish to automatically approve any friendship/connection requests.
-
-Managing Multiple forums
+Managing Accounts
---
-We recommend that you create group forums with the same email address and password as your normal account.
-If you do this, you will find a new "Manage" tab on the menu bar which lets you toggle identities easily and manage your forums.
-You are not required to do this, but the alternative is to log out and log back into the other account to manage alternate forums.
-This could get cumbersome if you manage several different forums/identities.
+To create a new linked account that can be used as a forum, log in to your normal account and go to Settings > Manage Accounts.
+Here you can register additional accounts with new nicknames that will be linked to your primary account.
-You may also appoint a delegate to manage your forum.
-Do this by visiting the [Delegation Setup Page](settings/delegation).
-This will provide you with a list of contacts on this system under "Potential Delegates".
+You may appoint a delegate to manage your new account (e.g. forum page).
+The Delegates section of Manage Accounts page will provide you with a list of contacts on this instance under "Potential Delegates".
Selecting one or more persons will give them access to manage your forum.
They will be able to edit contacts, profiles, and all content for this account/page.
Please use this facility wisely.
-Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
+Delegated managers will not be able to alter basic account settings, such as passwords or page types, or remove the account.
+Additionally, this page is also where you can choose to designate an account as a parent user.
+If your primary account is designated as the parent user, you will be able to easily toggle identities and manage your forums or other types of accounts.
+
+Types of Accounts
+---
+
+On the new account, visit the Settings > Account page.
+Towards the end of the page is a section for "Advanced account types".
+Typically you would use "Personal Page - Standard" for a normal personal account with manual approval of “friends” and “followers.”
+This is the default selection.
+On this page you can change the type of account if desired.
+
+The other subtypes of a Personal Page are “Soapbox” and “Love-all.”
+A Soapbox account is an announcement channel that automatically approvals follower requests.
+Everything posted by the account will go out to the followers, but there will be no opportunity for interaction.
+This setting would typically be used for announcements or corporate communications.
+“Love-all” automatically approves contacts as friends.
+
+In addition to Personal Page, there are options for Organization Page, News Page, and Community Forum.
+Organization and New Pages automatically approve contact requests as followers.
+
+Community Forum provide the ability for people to become friends/fans of the forum without requiring approval.
+This creates a forum page where all members can freely interact.
Posting to Community forums
---
diff --git a/doc/Github.md b/doc/Github.md
index ca467e525..5fbc3788e 100644
--- a/doc/Github.md
+++ b/doc/Github.md
@@ -22,7 +22,7 @@ Our Git Branches
There are two relevant branches in the main repo on GitHub:
-1. master: This branch contains stable releases only.
+1. stable: This branch contains stable releases only.
2. develop: This branch contains the latest code.
This is what you want to work with.
@@ -43,7 +43,7 @@ Release branches
A release branch is created when the develop branch contains all features it should have.
A release branch is used for a few things.
-1. It allows last-minute bug fixing before the release goes to master branch.
+1. It allows last-minute bug fixing before the release goes to stable branch.
2. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes.
3. It makes sure the develop branch can receive new features that are **not** part of this release.
diff --git a/doc/Home.md b/doc/Home.md
index 9ed552bd3..bd6fad747 100644
--- a/doc/Home.md
+++ b/doc/Home.md
@@ -35,6 +35,7 @@ Friendica Documentation and Resources
* [Using SSL with Friendica](help/SSL)
* [Config values that can only be set in config/local.config.php](help/Config)
* [Improve Performance](help/Improve-Performance)
+* [Migrate](help/Migrate)
* [Administration Tools](help/tools)
**Developer Manual**
diff --git a/doc/Install.md b/doc/Install.md
index f37521d75..8d66425a8 100644
--- a/doc/Install.md
+++ b/doc/Install.md
@@ -33,7 +33,7 @@ The account will expire after 7 days, but you can ask the server admin to keep y
* Apache with mod-rewrite enabled and "Options All" so you can use a local `.htaccess` file
* PHP 7+ (PHP 7.1+ is recommended for performance and official support)
* PHP *command line* access with register_argc_argv set to true in the php.ini file
- * Curl, GD, PDO, MySQLi, hash, xml, zip and OpenSSL extensions
+ * Curl, GD, PDO, mbstrings, MySQLi, hash, xml, zip and OpenSSL extensions
* The POSIX module of PHP needs to be activated (e.g. [RHEL, CentOS](http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7) have disabled it)
* some form of email server or email gateway such that PHP mail() works
* MySQL 5.6+ or an equivalent alternative for MySQL (MariaDB, Percona Server etc.)
@@ -47,7 +47,6 @@ For alternative server configurations (such as Nginx server and MariaDB database
### Optional
* PHP ImageMagick extension (php-imagick) for animated GIF support.
-* [Composer](https://getcomposer.org/) for a git install
## Installation procedure
@@ -61,6 +60,8 @@ If this is nothing for you, you might be interested in
### Get Friendica
+Download the full archive of the stable release of Friendica core and the addons from [the project homepage](https://friendi.ca/resources/download-files/).
+Make sure that the version of the Friendica archive and the addons match.
Unpack the Friendica files into the root of your web server document area.
If you copy the directory tree to your webserver, make sure that you also copy `.htaccess-dist` - as "dot" files are often hidden and aren't normally copied.
@@ -72,7 +73,7 @@ This makes the software much easier to update.
The Linux commands to clone the repository into a directory "mywebsite" would be
- git clone https://github.com/friendica/friendica.git -b master mywebsite
+ git clone https://github.com/friendica/friendica.git -b stable mywebsite
cd mywebsite
bin/composer.phar install --no-dev
@@ -88,7 +89,7 @@ Get the addons by going into your website folder.
Clone the addon repository (separately):
- git clone https://github.com/friendica/friendica-addons.git -b master addon
+ git clone https://github.com/friendica/friendica-addons.git -b stable addon
If you want to use the development version of Friendica you can switch to the develop branch in the repository by running
@@ -435,7 +436,7 @@ provided by one of our members.
>
> This is obvious as soon as you notice that the friendica-cron uses `proc_open`
> to execute PHP scripts that also use `proc_open`, but it took me quite some time to find that out.
-> I hope this saves some time for other people using suhosin with function blacklists.
+> I hope this saves some time for other people using suhosin with function blocklists.
### Unable to create all mysql tables on MySQL 5.7.17 or newer
diff --git a/doc/Message-Flow.md b/doc/Message-Flow.md
index 9692ae88c..e96798569 100644
--- a/doc/Message-Flow.md
+++ b/doc/Message-Flow.md
@@ -4,9 +4,7 @@ Friendica Message Flow
This page documents some of the details of how messages get from one person to another in the Friendica network.
There are multiple paths, using multiple protocols and message formats.
-Those attempting to understand these message flows should become familiar with (at the minimum) the [DFRN protocol document](https://github.com/friendica/friendica/blob/master/spec/dfrn2.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub).
-
-Most message passing involves the file include/items.php, which has functions for several feed-related import/export activities.
+Those attempting to understand these message flows should become familiar with (at the minimum) the [DFRN protocol document](https://github.com/friendica/friendica/blob/stable/spec/dfrn2.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub).
When a message is posted, all immediate deliveries to all networks are made using include/notifier.php, which chooses how (and to whom) to deliver the message.
This file also invokes the local side of all deliveries including DFRN-notify.
diff --git a/doc/Migrate.md b/doc/Migrate.md
new file mode 100644
index 000000000..e116d029f
--- /dev/null
+++ b/doc/Migrate.md
@@ -0,0 +1,92 @@
+Migrating to a new server installation
+===============
+
+* [Home](help)
+
+## Preparation
+
+### New server
+Set up your new server as described [here](Install); follow the installation procedure until you have created a database.
+
+### Heads up to users
+Inform your users of an upcoming interruption to your service.
+To ensure data consistency, your server needs to be offline during some steps of the migration processes.
+
+You may also find these addons useful for communicating with your users prior to the migration process:
+* blackout
+* notifyall
+
+### Storage
+Check your storage backend with ``bin/console storage list`` in the root folder.
+The output should look like this:
+````
+Sel | Name
+-----------------------
+ | Filesystem
+ * | Database
+````
+
+If you are *not* using ``Database`` run the following commands:
+1. ``bin/console storage set Database`` to activate the database backend.
+2. ``bin/console storage move`` to initiate moving the stored image files.
+
+This process may take a long time depending on the size of your storage and your server's capacity.
+Prior to initiating this process, you may want to check the number of files in the storage with the following command: ``tree -if -I index.html /path/to/storage/``.
+
+### Cleaning up
+Before transferring your database, you may want to clean it up; ensure the expiration of database items is set to a reasonable value and activated via the administrator panel.
+*Admin* > *Site* > *Performance* > Enable "Clean up database"
+After adjusting these settings, the database cleaning up processes will be initiated according to your configured daily cron job.
+
+To review the size of your database, log into MySQL with ``mysql -p`` run the following query:
+````
+SELECT table_schema AS "Database", SUM(data_length + index_length) / 1024 / 1024 / 1024 AS "Size (GB)" FROM information_schema.TABLES GROUP BY table_schema;
+````
+
+You should see an output like this:
+````
++--------------------+----------------+
+| Database | Size (GB) |
++--------------------+----------------+
+| friendica_db | 8.054092407227 |
+| [..........] | [...........] |
++--------------------+----------------+
+````
+
+Finally, you may also want to optimise your database with the following command: ``mysqloptimize -p friendica-db``
+
+### Going offline
+Stop background tasks and put your server in maintenance mode.
+1. If you had set up a worker cron job like this ``*/10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php`` run ``crontab -e`` and comment out this line. Alternatively if you deploy a worker daemon, disable this instead.
+2. Put your server into maintenance mode: ``bin/console maintenance 1 "We are currently upgrading our system and will be back soon."``
+
+## Dumping DB
+Export your database: ``mysqldump -p friendica_db > friendica_db-$(date +%Y%m%d).sql`` and possibly compress it.
+
+## Transferring to new server
+Transfer your database and a copy of your configuration file ``config/local.config.php.copy`` to your new server installation.
+
+## Restoring your DB
+Import your database on your new server: ``mysql -p friendica_db < your-friendica_db-file.sql``
+
+## Completing migration
+
+### Configuration file
+Copy your old server's configuration file to ``config/local.config.php``.
+Ensure the newly created database credentials are identical to the setting in the configuration file; otherwise update them accordingly.
+
+### Cron job for worker
+Set up the required daily cron job.
+Run ``crontab -e`` and add the following line according to your system specification
+``*/10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php``
+
+### DNS settings
+Adjust your DNS records by pointing them to your new server.
+
+## Troubleshooting
+If you are unable to login to your newly migrated Friendica installation, check your web server's error and access logs and mysql logs for obvious issues.
+
+If still unable to resolve the problem, it's likely an issue with your [installation](Install).
+In this case, you may try to an entirely new Friendica installation on your new server, but use a different FQDN and DNS name.
+Once you have this up and running, take it offline and purge the database and configuration file and try migrating to this installation.
+
diff --git a/doc/README.md b/doc/README.md
new file mode 100644
index 000000000..4902b4cdf
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,21 @@
+# About the docs of the Friendica Project
+
+**Note**: It is expected that some of the links in these files wont work in the Friendica repository as they are supposed to work on an installed Friendica node.
+
+## User and Admin documentation
+
+Every Friendica node has the _current_ version of the user and admin documentation available in the `/help` location.
+The documentation is mainly done in English, but the pages can be translated and some are already to German.
+If you want to help expanding the documentation or the translation, please register an account at the [Friendica wiki](https://wiki.friendi.ca) where the [texts are maintained](https://wiki.friendi.ca/docs).
+The documentation is periodically merged back from there to the _development_ branch of Friendica.
+
+Images that you use in the documentation should be located in the `img` sub-directory of this directory.
+Translations are located in sub-directories named after the language codes, e.g. `de`.
+Depending on the selected interface language the different translations will be applied, or the `en` original will be used as a fall-back.
+
+## Developers Documentation
+
+We provide a configuration file for [Doxygen](https://www.doxygen.nl/index.html) in the root of the Friendica repository.
+With that you should be able to extract some documentation from the source code.
+
+In addition there are some documentation files about the database structure in `doc`db`.
diff --git a/doc/Settings.md b/doc/Settings.md
index f2af9617c..16b7ec38a 100644
--- a/doc/Settings.md
+++ b/doc/Settings.md
@@ -74,7 +74,7 @@ You can chose between the following modes:
##### Invitation based registry
Additionally to the setting in the admin panel, you can decide if registrations are only possible using an invitation code or not.
-To enable invitation based registration, you have to set the `invitation_only` setting in the [config/local.config.php](/help/Config) file.
+To enable invitation based registration, you have to set the `invitation_only` setting to `true` in the `system` section of the [config/local.config.php](/help/Config) file.
If you want to use this method, the registration policy has to be set to either *open* or *requires approval*.
#### Check Full Names
@@ -182,7 +182,7 @@ By default, any (valid) email address is allowed in registrations.
#### Allow Users to set remote_self
-If you enable the `Allow Users to set remote_self` users can select Atom feeds from their contact list being their *remote self* in the advanced contact settings.
+If you enable the `Allow Users to set remote_self` users can select Atom feeds from their contact list being their *remote self* in the contact settings.
Which means that postings by the remote self are automatically reposted by Friendica in their names.
This feature can be used to let the user mirror e.g. blog postings into their Friendica postings.
@@ -240,15 +240,9 @@ This section allows you to configure the background process that is triggered by
The process does check the available system resources before creating a new worker for a task.
Because of this, it may happen that the maximum number of worker processes you allow will not be reached.
-If your server setup does not allow you to use the `proc_open` function of PHP, please disable it in this section.
-
The tasks for the background process have priorities.
To guarantee that important tasks are executed even though the system has a lot of work to do, it is useful to enable the *fastlane*.
-Should you not be able to run a cron job on your server, you can also activate the *frontend* worker.
-If you have done so, you can call `example.com/worker` (replace example.com with your actual domain name) on a regular basis from an external service.
-This will then trigger the execution of the background process.
-
### Relocate
## Users
diff --git a/doc/Update.md b/doc/Update.md
index 7f8a0fcae..c4fe16186 100644
--- a/doc/Update.md
+++ b/doc/Update.md
@@ -36,11 +36,11 @@ The addon tree has to be updated separately like so:
git pull
For both repositories:
-The default branch to use is the ``master`` branch, which is the stable version of Friendica.
+The default branch to use is the ``stable`` branch, which is the stable version of Friendica.
It is updated about four times a year on a fixed schedule.
If you want to use and test bleeding edge code please checkout the ``develop`` branch.
-The new features and fixes will be merged from ``develop`` into ``master`` after a release candidate period before each release.
+The new features and fixes will be merged from ``develop`` into ``stable`` after a release candidate period before each release.
Warning: The ``develop`` branch is unstable, and breaks on average once a month for at most 24 hours until a patch is submitted and merged.
Be sure to pull frequently if you choose the ``develop`` branch.
diff --git a/doc/database.md b/doc/database.md
index b58fba9d9..e135b19ae 100644
--- a/doc/database.md
+++ b/doc/database.md
@@ -18,9 +18,6 @@ Database Tables
| [event](help/database/db_event) | Events |
| [fcontact](help/database/db_fcontact) | friend suggestion stuff |
| [fsuggest](help/database/db_fsuggest) | friend suggestion stuff |
-| [gcign](help/database/db_gcign) | contacts ignored by friend suggestions |
-| [gcontact](help/database/db_gcontact) | global contacts |
-| [glink](help/database/db_glink) | "friends of friends" linkages derived from poco |
| [group](help/database/db_group) | privacy groups, group info |
| [group_member](help/database/db_group_member) | privacy groups, member info |
| [gserver](help/database/db_gserver) | |
diff --git a/doc/database/db_contact.md b/doc/database/db_contact.md
index eb5c505d1..2963a1a2a 100644
--- a/doc/database/db_contact.md
+++ b/doc/database/db_contact.md
@@ -67,6 +67,6 @@ Table contact
| bd | | date | NO | | 0001-01-01 | |
| notify_new_posts | | tinyint(1) | NO | | 0 | |
| fetch_further_information | | tinyint(1) | NO | | 0 | |
-| ffi_keyword_blacklist | | mediumtext | NO | | NULL | |
+| ffi_keyword_denylist | | mediumtext | NO | | NULL | |
Return to [database documentation](help/database)
diff --git a/doc/database/db_gcign.md b/doc/database/db_gcign.md
deleted file mode 100644
index 9f5bbce76..000000000
--- a/doc/database/db_gcign.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Table gcign
-===========
-
-| Field | Description | Type | Null | Key | Default | Extra |
-| ----- | ------------------------------ | ------- | ---- | --- | ------- | --------------- |
-| id | sequential ID | int(11) | NO | PRI | NULL | auto_increment |
-| uid | local user.id | int(11) | NO | MUL | 0 | |
-| gcid | gcontact.id of ignored contact | int(11) | NO | MUL | 0 | |
-
-Return to [database documentation](help/database)
diff --git a/doc/database/db_gcontact.md b/doc/database/db_gcontact.md
deleted file mode 100644
index 3c0118a33..000000000
--- a/doc/database/db_gcontact.md
+++ /dev/null
@@ -1,32 +0,0 @@
-Table gcontact
-==============
-
-| Field |Description | Type | Null | Key | Default | Extra |
-|--------------|------------------------------------|------------------|------|-----|---------------------|----------------|
-| id | sequential ID | int(10) unsigned | NO | PRI | NULL | auto_increment |
-| name | Name that this contact is known by | varchar(255) | NO | | | |
-| nick | Nick- and user name of the contact | varchar(255) | NO | | | |
-| url | Link to the contacts profile page | varchar(255) | NO | | | |
-| nurl | | varchar(255) | NO | MUL | | |
-| photo | Link to the profile photo | varchar(255) | NO | | | |
-| connect | | varchar(255) | NO | | | |
-| created | | datetime | NO | | 0001-01-01 00:00:00 | |
-| updated | | datetime | YES | MUL | 0001-01-01 00:00:00 | |
-| last_contact | | datetime | YES | | 0001-01-01 00:00:00 | |
-| last_failure | | datetime | YES | | 0001-01-01 00:00:00 | |
-| location | | varchar(255) | NO | | | |
-| about | | text | NO | | NULL | |
-| keywords | puplic keywords (interests) | text | NO | | NULL | |
-| gender | | varchar(32) | NO | | | |
-| birthday | | varchar(32) | NO | | 0001-01-01 | |
-| community | 1 if contact is forum account | tinyint(1) | NO | | 0 | |
-| hide | 1 = should be hidden from search | tinyint(1) | NO | | 0 | |
-| nsfw | 1 = contact posts nsfw content | tinyint(1) | NO | | 0 | |
-| network | social network protocol | varchar(255) | NO | | | |
-| addr | | varchar(255) | NO | | | |
-| notify | | text | NO | | | |
-| alias | | varchar(255) | NO | | | |
-| generation | | tinyint(3) | NO | | 0 | |
-| server_url | baseurl of the contacts server | varchar(255) | NO | | | |
-
-Return to [database documentation](help/database)
diff --git a/doc/database/db_glink.md b/doc/database/db_glink.md
deleted file mode 100644
index 734eb04b9..000000000
--- a/doc/database/db_glink.md
+++ /dev/null
@@ -1,13 +0,0 @@
-Table glink
-===========
-
-| Field | Description | Type | Null | Key | Default | Extra |
-|---------|------------------|------------------|------|-----|---------------------|----------------|
-| id | sequential ID | int(10) unsigned | NO | PRI | NULL | auto_increment |
-| cid | | int(11) | NO | MUL | 0 | |
-| uid | | int(11) | NO | | 0 | |
-| gcid | | int(11) | NO | MUL | 0 | |
-| zcid | | int(11) | NO | MUL | 0 | |
-| updated | | datetime | NO | | 0001-01-01 00:00:00 | |
-
-Return to [database documentation](help/database)
diff --git a/doc/de/Addons.md b/doc/de/Addons.md
index b54f011bf..2ff749549 100644
--- a/doc/de/Addons.md
+++ b/doc/de/Addons.md
@@ -226,10 +226,6 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
Hook::callAll('item_photo_menu', $args);
Hook::callAll('jot_tool', $jotplugins);
-### include/items.php
-
- Hook::callAll('page_info_data', $data);
-
### mod/directory.php
Hook::callAll('directory_item', $arr);
@@ -316,10 +312,6 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
Hook::callAll('post_local_end', $arr);
-### mod/lockview.php
-
- Hook::callAll('lockview_content', $item);
-
### mod/uexport.php
Hook::callAll('uexport_options', $options);
@@ -426,6 +418,10 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
Hook::callAll('storage_instance', $data);
+### src/Module/PermissionTooltip.php
+
+ Hook::callAll('lockview_content', $item);
+
### src/Worker/Directory.php
Hook::callAll('globaldir_update', $arr);
diff --git a/doc/de/BBCode.md b/doc/de/BBCode.md
index 1db798427..ded52cdb7 100644
--- a/doc/de/BBCode.md
+++ b/doc/de/BBCode.md
@@ -65,17 +65,17 @@ table.bbcodes > * > tr > th {
| Friendica |
- [img]https://raw.githubusercontent.com/friendica/friendica/master/images/friendica-32.jpg[/img] |
- |
+ [img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img] |
+ |
- [img=https://raw.githubusercontent.com/friendica/friendica/master/images/friendica-32.jpg]Das Friendica Logo[/img] |
- |
+ [img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg]Das Friendica Logo[/img] |
+ |
- [img=64x32]https://raw.githubusercontent.com/friendica/friendica/master/images/friendica-32.jpg[/img]
+ | [img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img]
Note: provided height is simply discarded. |
- |
+ |
[size=xx-small]kleiner Text[/size] |
@@ -482,10 +482,6 @@ Du kannst Videos, Musikdateien und weitere Dinge in Beiträgen einbinden.
[embed]URL[/embed] |
OEmbed rich content einbetten. |
-
- [iframe]URL[/iframe] |
- General embed, iframe size is limited by the theme size for video players. |
-
[url]*url*[/url] |
Wenn *url* die OEmbed- oder Opengraph-Spezifikationen unterstützt, wird das Objekt eingebettet (z.B. Dokumente von scribd).
diff --git a/doc/de/Chats.md b/doc/de/Chats.md
index 9c1a82b18..83c55e991 100644
--- a/doc/de/Chats.md
+++ b/doc/de/Chats.md
@@ -49,7 +49,7 @@ Per Git:
cd /var/www/<Pfad zu Deiner friendica-Installation>/addon; git pull
-oder als normaler Download von hier: https://github.com/friendica/friendica-addons/blob/master/jappixmini.tgz (auf „view raw“ klicken)
+oder als normaler Download von hier: https://github.com/friendica/friendica-addons/blob/stable/jappixmini.tgz (auf „view raw“ klicken)
Entpacke diese Datei (ggf. den entpackten Ordner in „jappixmini“ umbenennen) und lade sowohl den entpackten Ordner komplett als auch die .tgz Datei in den Addon Ordner Deiner Friendica Installation hoch.
diff --git a/doc/de/Install.md b/doc/de/Install.md
index 8225993e4..8b9434a33 100644
--- a/doc/de/Install.md
+++ b/doc/de/Install.md
@@ -55,7 +55,7 @@ Wenn du die Möglichkeit hierzu hast, empfehlen wir dir "git" zu nutzen, um die
Das macht die Aktualisierung wesentlich einfacher.
Der Linux-Code, mit dem man die Dateien direkt in ein Verzeichnis wie "meinewebseite" kopiert, ist
- git clone https://github.com/friendica/friendica.git -b master mywebsite
+ git clone https://github.com/friendica/friendica.git -b stable mywebsite
cd mywebsite
bin/composer.phar install
@@ -70,7 +70,7 @@ Falls Addons installiert werden sollen: Gehe in den Friendica-Ordner
Und die Addon Repository klonst:
- git clone https://github.com/friendica/friendica-addons.git -b master addon
+ git clone https://github.com/friendica/friendica-addons.git -b stable addon
Um das Addon-Verzeichnis aktuell zu halten, solltest du in diesem Pfad ein "git pull"-Befehl eintragen
diff --git a/doc/de/Message-Flow.md b/doc/de/Message-Flow.md
index 8ef8704d1..ef2a0a271 100644
--- a/doc/de/Message-Flow.md
+++ b/doc/de/Message-Flow.md
@@ -6,9 +6,7 @@ Friendica Nachrichtenfluss
Diese Seite soll einige Infos darüber dokumentieren, wie Nachrichten innerhalb von Friendica von einer Person zur anderen übertragen werden.
Es gibt verschiedene Pfade, die verschiedene Protokolle und Nachrichtenformate nutzen.
-Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll ([Dokument mit den DFRN Spezifikationen](https://github.com/friendica/friendica/blob/master/spec/dfrn2.pdf)) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub).
-
-Der Großteil der Nachrichtenverarbeitung nutzt die Datei include/items.php, welche Funktionen für verschiedene Feed-bezogene Import-/Exportaktivitäten liefert.
+Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll ([Dokument mit den DFRN Spezifikationen](https://github.com/friendica/friendica/blob/stable/spec/dfrn2.pdf)) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub).
Wenn eine Nachricht veröffentlicht wird, werden alle Übermittlungen an alle Netzwerke mit include/notifier.php durchgeführt, welche entscheidet, wie und an wen die Nachricht geliefert wird.
Diese Datei bindet dabei die lokale Bearbeitung aller Übertragungen ein inkl. dfrn-notify.
diff --git a/doc/de/Settings.md b/doc/de/Settings.md
index abb381757..34b349e88 100644
--- a/doc/de/Settings.md
+++ b/doc/de/Settings.md
@@ -172,7 +172,7 @@ Wildcards werden akzeptiert Standardmäßig sind alle gültigen Email-Adressen e
#### Nutzern erlauben das remote_self Flag zu setzen
-Webb du die Option `Nutzern erlauben das remote_self Flag zu setzen` aktivierst, können alle Nutzer Atom Feeds in den erweiterten Einstellungen des Kontakts als "Entferntes Konto" markieren.
+Webb du die Option `Nutzern erlauben das remote_self Flag zu setzen` aktivierst, können alle Nutzer Atom Feeds in den Kontakteinstellungen als "Entferntes Konto" markieren.
Dadurch werden automatisch alle Beiträge dieser Feeds für diesen Nutzer gespiegelt und an die Kontakte bei Friendica verteilt.
Dieses Feature kann z.B. dafür genutzt werden Blogbeiträge zu spiegeln.
@@ -227,15 +227,9 @@ In diesem Abschnitt kann der Hintergrund-Prozess konfiguriert werden.
Bevor ein neuer *Worker* Prozess gestartet wird, überprüft das System, dass die vorhandenen Resourchen ausrechend sind,
Aus diesem Grund kann es sein, dass die maximale Zahl der Hintergrungprozesse nicht erreicht wird.
-Sollte die PHP Funktion `proc_open` auf dem Server nicht verfügbar sein, kann die Verwendung durch Friendica hier unterbunden werden.
-
Die Aufgaben die im Hintergrund erledigt werden, haben Prioritäten zugeteilt.
Um garantieren zu können, das wichtige Prozesse schnellst möglich abgearbeitet werden können, selbst wenn das System gerade stark belastet ist, sollte die *fastlane* aktiviert sein.
-Wenn es auf deinem Server nicht möglich ist, einen cron Job zu starten, kannst du den *frontend* Worker einschalten.
-Nachdem dies geschehen ist, kannst du `example.com/worker` (tausche example.com mit dem echten Domainnamen aus) aufrufen werden.
-Dadurch werden dann die Aufgaben aktiviert, die der cron Job sonst aktivieren würde.
-
### Umsiedeln
## Nutzer
diff --git a/doc/img/editor_frio.png b/doc/img/editor_frio.png
index d37081b83..d969f261b 100644
Binary files a/doc/img/editor_frio.png and b/doc/img/editor_frio.png differ
diff --git a/doc/img/editor_vier.png b/doc/img/editor_vier.png
index 5278b0ff1..7ffac7fc7 100644
Binary files a/doc/img/editor_vier.png and b/doc/img/editor_vier.png differ
diff --git a/doc/img/vier_icons.png b/doc/img/vier_icons.png
index 4dc8ae03f..b880e9562 100644
Binary files a/doc/img/vier_icons.png and b/doc/img/vier_icons.png differ
diff --git a/doc/smarty3-templates.md b/doc/smarty3-templates.md
index b39fa117e..f3f7c3e60 100644
--- a/doc/smarty3-templates.md
+++ b/doc/smarty3-templates.md
@@ -87,7 +87,7 @@ Field parameter:
1. Label for the input box,
2. Current value of the variable,
3. Help text for the input box,
-4. if set to "required" modern browser will check that this input box is filled when submitting the form,
+4. Should be set to the translation of "Required" to mark this field as required,
5. if set to "autofocus" modern browser will put the cursur into this box once the page is loaded,
6. if set, it will be used for the input type, default is `text` (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types).
@@ -122,7 +122,7 @@ Field parameter:
1. Label for the field,
2. Value for the field, e.g. the old password,
3. Help text for the input field,
-4. if set to "required" modern browser will check that this field is filled out,
+4. Should be set to the translation of "Required" to mark this field as required,
5. if set to "autofocus" modern browser will put the cursor automatically into this input field.
### field_radio.tpl
@@ -176,5 +176,5 @@ Field parameter:
0. Name of the input field,
1. Label for the input box,
2. Current text for the box,
-3. Help text for the input box.
-4. if set to "required" modern browser will check that this input box is filled when submitting the form,
+3. Help text for the input box,
+4. Should be set to the translation of "Required" to mark this field as required.
diff --git a/doc/themes.md b/doc/themes.md
index 94dc47da1..b7bb2e226 100644
--- a/doc/themes.md
+++ b/doc/themes.md
@@ -3,7 +3,7 @@
* [Home](help)
To change the look of friendica you have to touch the themes.
-The current default theme is [Vier](https://github.com/friendica/friendica/tree/master/view/theme/vier) but there are numerous others.
+The current default theme is [Vier](https://github.com/friendica/friendica/tree/stable/view/theme/vier) but there are numerous others.
Have a look at [friendica-themes.com](http://friendica-themes.com) for an overview of the existing themes.
In case none of them suits your needs, there are several ways to change a theme.
diff --git a/doc/tools.md b/doc/tools.md
index 8746e9c15..1c3b8e119 100644
--- a/doc/tools.md
+++ b/doc/tools.md
@@ -27,6 +27,7 @@ The console provides the following commands:
* typo: Checks for parse errors in Friendica files
* postupdate: Execute pending post update scripts (can last days)
* storage: Manage storage backend
+* relay: Manage ActivityPub relay servers
Please consult *bin/console help* on the command line interface of your server for details about the commands.
diff --git a/doc/translations.md b/doc/translations.md
index a29b0d63b..23ac4a62d 100644
--- a/doc/translations.md
+++ b/doc/translations.md
@@ -8,7 +8,7 @@ Friendica translations
The Friendica translation process is based on `gettext` PO files.
Basic worflow:
-1. `xgettext` is used to collect translation strings across the project in the master PO file located in `view/lang/C/messages.po`.
+1. `xgettext` is used to collect translation strings across the project in the authoritative PO file located in `view/lang/C/messages.po`.
2. This file makes translations strings available at [the Transifex Friendica page](https://www.transifex.com/Friendica/friendica/dashboard/).
3. The translation itself is done at Transifex by volunteers.
4. The resulting PO files by languages are manually updated in `view/lang//messages.po`.
diff --git a/friendica_test_data.sql b/friendica_test_data.sql
index 3728da771..779a9c6a3 100644
--- a/friendica_test_data.sql
+++ b/friendica_test_data.sql
@@ -330,7 +330,7 @@ CREATE TABLE `contact` (
`bd` date NOT NULL DEFAULT '0001-01-01',
`notify_new_posts` tinyint(1) NOT NULL DEFAULT '0',
`fetch_further_information` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `ffi_keyword_blacklist` text,
+ `ffi_keyword_denylist` text,
PRIMARY KEY (`id`),
KEY `uid_name` (`uid`,`name`(190)),
KEY `self_uid` (`self`,`uid`),
@@ -1492,7 +1492,7 @@ CREATE TABLE `photo` (
LOCK TABLES `photo` WRITE;
/*!40000 ALTER TABLE `photo` DISABLE KEYS */;
-INSERT INTO `photo` VALUES (1,1,0,'9305bf00a1f6a976','59483894715bf00a1f6a24a891914929','2018-11-17 12:31:27','2018-11-17 12:31:27','','','Profilbilder','person-300.jpg','image/jpeg',300,300,11007,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0,,\0\\0\0\0\0\0\0\0\0\0\0\0\n \\08\0 \0\0\0\0 \n!\"1A#3BQ$%2Saqs\\0\0\0?\0\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/6\^b\\mS\m&mpKY!\\\\K V\~\4+\/\3\\"u\OX\GXq\\ڭ/\+xߌ\[VJ$+\\c|>ob_j\m\0&\Q\<\E\-AZv\Ɍԏ.y\\M+z\Ga\\J\&\\Q\'۫\|0\&G(\p\<\s0\\zy|r\Sh]\\n\H|j=[P\`vm\PYESGMM\\\$\h\0S9\\J\LJL}XIQC\$kgD̛\:ռJt\\WUu}A\L\JsC\V\mPb@ |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1>CO$yQ2Ka(#q\:\\O\\9\WPKg\\\ν\C(@l\n1|l߷\0=\x\?\Sg\{\KI˵\\=k\a&\\\S(#x\kY&N\\97m\ZY\ڨuE(@8b\{\٭\\\sݜ\v~\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\&\Z\o\\\9A/0\p4\xF|i\\C\\uXm.S4Uq\n\ʟ\rM\%rV\[\\<\o]\ضͮVe\\[\\'\dك\\2<8QF5Ѓ\Z4X1\G_\ss\4OKWv_xڍ3\\~9N\\\B2r\0!t\\D\Eu\+@\0E\0cFF 872\\Zہ\e%\\>\ԁq\^cog/\o\+\ɘ\e\dwJwOŷGi{oq5\Ϗc\"rL:\!\ne\B91f\'Ө/O\gdcB{fDM&\\=؆k*e\\~v1\c\\i\\\\)\#[H<|nږVV\i{\}IL\Kf9\#\KrԷ\86P\\1\\XW5\\#ᬙ\0\ـDx\\m#>\7.\eDDDDDDDDDDD\\d \2\`&<)cf2琏vp\1\\\8k\9\1M~C\\\ҵ|բ\\9Ug{\\v05\U,SHx&B|\"\\X\\t\l{\\\\_v\[\;d卮$RH\z\?a!\8\dmfD\<+n&|\2\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]\\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\dJ>\rms1/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\Z\\J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^8R\7$ș>Wn\I#\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\Wp\'\\\\\\"\"\"(\c̞94\m\i\"J\_0\\{\rkA\"\{\\jwƯX*\Z[\m3Ɋ\\\\l\ʋc W^V,g_Z\0c}ƒd\b\x\m&)\<# E.OF\:\0\'܇#v\Bp\\{\\5nq\<8g\\DDDDE/Q/jE\\l\\}~rY[g0@\\G#֊3O\n0\\8\E\\ϞXӕ\;k/*|lÍm{]\\ZuT;\˹x\h2C26dFfwԝ\\dz\|\?\Sk0$\C\y&\KlbX|\0I]f<|U\t]f\6ڹ{V\\\5,ҩ~\ME\\\dW\C\ J,.\\{;=}Iқ\Z\\ry\HJI0YNJAL\\\p/\UZt+](}\|@ȣB\S\:f{\\\Vtٻ$<>ql\09O\\gAz<V\-i\g\\\2K[-g8\G)3P[\6~+{\U\˪Eę;,\pans!\\.\f\8\\a\HkaW\7\P\\\BRX\eM,I\C^\q\+\R3X\+X\hdF)}V\M\q(8\\cDW5\7\c\c\w|㳬\0e\\ZiY밚9[\\ckZs.u\G9\x\\'JaΦ=\v{Mʙd}v\\أ2L\\V.hjHh\|q#\}2 ^\rޞ\\3j:\\\5KG\0S\2&\.\'\hN \mSfǩ(\5\ljb1FƍLx\ƌ \0FA\шCkX\5cp\c\x\\|t{@\\\\xF\x;c\#\\(\\Z9116̋\*}TUc#8*i9w\"\6\1\\b\Kߴk\\\\\{:k\\2bs\Vg8i̊SLr\0rtho\\OcN~n\\ԇv\\i\Wg>E\Z4cQ\r`\#Ub\G:4\9t\"\"\"\1E \0\07\3\ \"n^B\X1s\\rcq;8\3Qw\v\\/;ku6\\\c\gZ\~2noLZ64Y)g\&.#\\\-c\ߩcJ\皭I\ \Z\\Ut\$\o̸x\(,cB\+\Ǫj\i\u%n\u(\"m]t1\q\Ŏ,acw;?\"y{\"\"\"\"\"\"\"\"\"\"\"(J瞵\\"Y\\Ys[\\zs\X\7*\\QHiOiG=n^7{\ɾ8{}\}\dԬG܋\\\7\\"w\?̯\\έfSC6\]Q*s+.َ\'\cKa\)k5\%;-c*.!UsZW\=]XVQ 6\\(\wՌDDZ\Vg\\\gnըu\H.3\\Nk\Zm\\Z\8#_\\7\\D\^lٖS%\\˓>\|͝:i\*dْʗ.Q\ȓ \ys=\1^\{\02\]ӊ>\S2\w\Ճ&ma*qAZKȦMZ\0`Ћ\L\cߚ\"\"\"\"\"\"\"\"\"\"\"\"\0C(&$\"\Z@\aB`BaaF9\ \ܱ\\Z\g\UnpwM{ˣ\'Z\Fr\\T\cck;\\r\L{\\\\n\\b\b\0i&ۘml$+k~N\s\N\r\Pϴ\\ \+Z)3!꼉\\M=t\\'\P͎aͭc\IV\:\\\DE?S\r5\\\&ns=\\t㲽a~9ǴsUF\ϻp\\.\p^\U\G)qv.@\h! fW[\ubx\\"H aAn~7\ñ|\'UWQOQ5Օ\n X\\bah5kq\\=\0]9\{\"\"\"\"\"\"\"\"\"\",h\q\*\\8q\ku]ebr\o\$\nw6s%\@\H\"0\Z>@\g\m\n2zη.vl䭐h[XNՁf\e\Y3v.\X\Z얺+s2T\]t\\\K}\Z\c]\nª%v\ݎ=@\nh4䷱\\5X\G9{`t\I\\'\Ɗs\ܧ\\\\\%r\\jH3ܭFڷ*,\\J\7Q*\<F]\6@\'dcJ(C\ZOXL\1\3\0\>i\g/\\}\h}dF\e}xN\\\K\R>\0r\'X\$bO9Y\\N<`v\\d\[\WH\=dș\\Xg\\o^4!m\7Gދv\}\\\\y\Z(5gضK9q)`̰85ǛcȈ\r|p\\\tO\\ ,ڲ{\oi\6fXL>@l\\;G79v(\\h.uK\[cOkWT\3̫j\J\L\]I:1\s҉\s{\\\$7\o~E[X!84{m\!aJ\\H\B!|Xǻ8no\\h{\0Ñ\P֭H\%4)79ÆPc\\v3\]*\[/(\q\\r\nK\UB $Kca-\#Ǝ\"\sD&q jx\{xΉ\Zjó\pM8;#4\jb\b?G\\Ŵ:\y+\lZ:\k;Ȳ$f;lm\\Ξioc\\&T\ X[8qy)lA!bTh\GW\\"ֹ_\O\~\p\I\\\\Z\-\im\\c1UTVP&J>Zw½y\\\pU \\yR\\\8\2$g\\J\$\˟l{{\Z\"\"\"\"*}Q-l?~\ޱ*[{o}o\\.5f\\2{B\\8;m \ϗ>Ćي\Ɓ_y\W\#\\.\\\\JMP\\hȸy\\E줟8m\\R\5$\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃ\q\n;\\\M^(ѽ\$0eK^m<\U֨\n\:\A\ZkJ\Z٤}~\ȟCCk\\n5$\մ/O_Kŗ\[\AqO\f\8K/\%\\x昙\~\X\\0\\Y\O1\\r.\W\\\\\0\F\\0ya?%5|\a~q\gITV:5D\0+\F]\"\"\"\"\"ž\t{\@\o?j\m},7kuqe)Z)Xp\@[(\H$2b@\ Um\\0˝S`H\x[m\$\\Zxq\\\$\xo\\@YF3+hq\Ӹy_GּDI\]\=6n=٢F\y8\z.g2W\8qWh֏X\1lʶ\\Z\%}9\_\0w5.\zݴ}s[ko3_\\\n\N\\\Z,ʋ&9\QFT\"\"\"\"\"\"\"\".(\Z0\"D`@\0!c\!\!汌k\a\UR\2=\\[gf\lvZ\cF!C\.J\y`_:\:М\$&in\"W\;y\ɧfu>ptC|\nӐ9\n\)ka\[ih\\4-(5p\\\-~ΗWT{ʛz/Ѿ\ם/}ա\\z\l&^ߺ$q\[\\8\eݵM2Iֲ\"[Q3 \\\\\DDDDDDD^a\+Ľ\\Ú\R\?\\\U_j{4K\ZfF %\r\d\Ex\"a(,RJ \0O+\\\\EA\\}_f\\rv\;TH\y/3S\j\\,ӨgÃ!ulK[\X^|\\0nr\ =jS.m\\H\"Xj܉\mRKk,66E,c`3\d 1d?\\Geb\\6#<\(\j\c~\/Q+ \I\\M20\\Sw_O`\8\?$rg\\\o1\"\!u\s-\\Ytⰻi\Z\\:7\Z\\0̬,\ZQqpo^wY\~4\r{F䚢\r\\Dœ#J\.,X3eM|Ղ%\\;3ƃ1aR#06&\ADn2˘AØ\-ss79\qȈ)@w絞W9w\\l\B\m_\q[IQ\'9.˵lQ\rE\ ɝ\'\Z\ (A\Ozfv)d\\^f\J\\k\6>h\\"\\t\\Q6f\iZfq\\~\}r\0vOG\5{&^q\r.:)cD\uv\*mk\\l{\J\Z|x\\ݩظ\O\,\mGH\Z.N\\Ipc\W\` G\*6ڑ\2\\ BkWM#ҵ\b\\~;;Y\n)2\0\;4>\u:}4\lb\o\㽭w>\ha\\\@خeN\m;yKnwF\ﱂK:9;1\q8O\5\\2ܷ\Ƿ7\\#r\o[<\r\mu$bs\\VJs\Z7/~qͶ~\kKQ\\%i&\\Qd7\ā܇\o\EJֽ\i\v\\\\\\sK\\\k\4\Ȝ\,D~G)\\vʊ610\\;`/\-w\\\ٽ\C\(\I\-jh\ZvQ\ĉQ\0(UA9lp\07\e\#\\s\\QS\/\\7L:\\\ǒd\f\c\\X0,5#2Zn&7\;o\9\\V}\\r\\"ޠ\+\W\\K\Aߜ\\\^\0\"\"\"\"\O=2^\S:\lSM\'\\\c\\Dz߾Xǃ9Ǿ}x\\icoqPn\N쎭\'\\p% \xV ԭeNr\g$v.?\0m\5\@!k\y\\\\i\\\8\0# HLyBY\q2\ai\\0ߟv\7\~Y@\уx$;yF\/\'c\!\h\\\L\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\V\0 RDDDD_\Al(\#ZonZ\Z=\\\\c-ssg\s\L]z\2~q9(# \kc\1ٍ[\lc9SDDDDDDDDDDDDQ`\\e\\]ό\r\p\#|\\0XjB\1fWVx\\\Zܘ֔ 8n2Be2{\\3\X\m\"\"\"\"\"GmC\\\\Zia<\\w.X坲\\!=\c(\\|\01\0\l\"\"\"\"\"\"\"\"\"\"\"\"~\\0\gi\V2\0/<9\\\\\\\E*V[\?\\r#\\ĉ\K\Ӿ\0\hT\v3DDDDZ\\qO.\*\s\6RZCl (\zq`\n>\n\^\dNsƈ\c\\c?PfFh\\\ [(p%\ \\Gtı$30\3?ɇ\_\=8\<,?ڄA\,\r^Q0\?710`xȱ\k\\\*|*fuՕMdx3)w$?g\c1&\Zs\ۂ\\\_\}\DDDDDDDDDDDE\7=F|\\u\re55\\\Cѕ\|ax\\\\3\\=ѡQ\kՍ{+hjk\Ga\d\Za{Z\9\\0;n\g8kqc\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/\',4,1,'','','',''),(2,1,0,'9305bf00a1f6a976','59483894715bf00a1f6a24a891914929','2018-11-17 12:31:27','2018-11-17 12:31:27','','','Profilbilder','person-300.jpg','image/jpeg',80,80,2354,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0\0 \n!#\"AB\\0\0\0?\0\\8\8\8㚑\1V\\7M\PCm;\n\f˲\A\"&\n(\\\z\r+\\*N\1dVq+:}\wN\\z/ \\I̮֩\uJ7\ZIA\y\d2m`\^N|HKFow\nRɭc5mö0\~Sr\\\t<Ŏ8\Mi\-2\Cz*\}\\`C\_\qț\\\'0\g(督v\\pQaYV\[=AXFR\\Y\Zp|6RPoSz\\B9d\\\V؛jl.e6Nڔ\"S\\pσ\U{\r<є\\*F@VԘ:WV`b6]hX\\F\G8a\n\\\hNcsѿ7?\Z*GLn.{^\m}kY(IF\s(\#\#Y+{|2&%hZ\OL~\0\:\vڗ-\\E\;=!\0\DZ\vW\^Q\\"\5y\0\Z\G\لJ ]\٥\CT\\ZiR.!-:eZ_>(qJ\dHqya\0\\T9\\\/ZŹ\潩DO\\"f4D\rR\wDPm5-\\\]P>A\r+\sњK^_\z\A\t\n3V\)\ٚ@.gE0{H\0.`FZP\qi7k\\\=4ąםL\c\\+c\\\\ΩN h\HH\\&\O\r^m\\K1R\\\0z\?W\'m\\r`\ƵD\*\Z.4.\D\)&\Z\"\1yȐ_\2\eǧXv:r\^*d!!ܭ;@\3\=?\'kR\\Fq\u*\\"0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬OcaYr\]C\(%g\F6X͟+\\\a0Qԫ$]#cJ4\HZ&f:\dפ3b\\rs`*\%IZp\nJ%I\2c8\q|\8\?g\qϞ8\~S&S\II(\\rnws\ZQ3q\$L\%r\ZS4\j\0*8}\e92(w\f\r\\\GAW\#\0xؘxxZ2*.86\\d@f[a\\}sm}Bِn\6=\"+o^Vpo9\k;:\84\\*n8j\`d|\һi\.\\v l\rsn\2#җ!E\*2P\gS\!Z^뒠\\*\2p\\v#f\~\\֫\B/j\U)^ĉ,y-`\0$|kkם:4\0\Mj8Pߨ)\\(Y\\0-yVQې&E\0@>,\>\\8\\c\K?\m a\nm3\;sR$\%Զ\*ͭL\\\M\q\ua= \^LrE\}ĚXRra]ޱMd~4\D\e-8\\eᲬ6[§q\t\\\TB:)M\aG`t\+w\0ٍ\XCoKˎp$QK\ vY3\%\K㈲\\\p㌌ᅸ;KVP\\!M*y̫8\u-;99\r\rB}\^xt;^oVZR9\g\',5,1,'','','',''),(3,1,0,'9305bf00a1f6a976','59483894715bf00a1f6a24a891914929','2018-11-17 12:31:27','2018-11-17 12:31:27','','','Profilbilder','person-300.jpg','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\(:+jo6;+\Ya>\U\aZ\\Hbqc1oz\\iق%a\-]\o)s\^\x[-4й\\\;\jT[P\lQ\\--\\v\$\ g3N]c\F|J^f<:Ī\umYȬƼ1[\Z,En֨ESpRƆ\AKp\"K5\c\\k\{\=z\\eV<\}O^ԋʜ9E\\!\rf*9ʱ\'94nT\+NS?Ƈ!j5X\&\<1)d\-\\\u)_\]lQ91Y\¸K!\\`5R_\\\y\P\Ұ \h{G\\1ԏ P\\\ۦ%<\U0]y?gp)vIϬ\\\'\\uY\\"I۔
a\\aYXj[G\ؤ\r\0\B\<\\uoy\j:齟!5\6O\\\D|@V\<|\\r\\Rľ\\vM/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\Ή6\u\xL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@lD<>U\\\03EW\0\\W%oſm\]\\;\\͋l\\\f]ռ|\&A=1\r\#Å`]1\\E㛑\ؙ|~N\*Yc++*aj\Z?ЋK}$L\Z\\Q\β\0P4`4h#\\0\G\0Y!\шBZk\\nas\",=\|z\\#s/kyqMR]\S\-Hkiu\66\rf\\fGx$\7z\[\vF ^\l{\\\\'$àH\y \^D#\bz\:XdvF4/dD۸\l3\͈f]\\c\>6~\\2ϱ8ke\ɇ\\6\kenqƗˠn\g/1كs\F|\ \\d\ƪ\\IK\[@\QK\Z\m_)X<}M!>.,bb:=\\\䯻|G\jO[Z;d卮$W\\z\?a!\8\dmfL\<++n&|\6\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]S\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\J>\rms>)/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\ZX\܍J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^89R\7\ș>Wn\I#\\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\W\'\\\\\\"\"\"(\c̞94\m\i!ʾ\_0\\{\rkA\"\y\\jwƯX*\Z[\l3Ɋ\\\Il\ʋc W^\Y;\\8j\!`IuMP\8\hh1\y,G-n\Vͤmr(7`\vjYyeS\:9ȯ&!Y ]\vz7\ZđyL>^\~M\\b\aWa`oV}z`6%\@_֫\`n\V>Q7;\eF\c\t\z\vHn%By)Bh`ϯ~\0:\\)\M\gk?J\\rŒZ\\kSv\!}\\]\`ٶ.6\m<8w=<\\\\w\ap{xT\N[F¦\"E,\d\\wV}=%\|w;4\us]U#\ua#XBΑ;#\\1uhB`;xMSZ\uM;N\}n5EDaî<ᕷuhO\\Myy|Ʌ[\\\||;9\-\X_q\\QG6s\\0˱*|נq=v\\|i\\E$ꝋ4\+HB)Y\m|أ0^3#H(Ae\v0\_ \U\|}\\B\ruef`4zZ&c\rfZ\61\\0,9vsDDDDDDDDDDDX\\>\u:U\0\p\$\\7^\[\\\H\>l\K+\Zؑ*D`5|aс\Ϭ۠\e(o\\\\\\[ ж;ͬ\cIJf\D]\y<5\-tV\9 d;n\\\\=B5ƺTKZ\Oz^\i\oc[[\j\\\ݛ`bO)?4S6\8>^g~+v~P\A\\l5&տ\Qd\>\ZViŔyVq\\\"4b\<#\ZQB\|\\e\0iY\HOk9z\\\rͅGǴ\\"6S+\\\ṷv2_(5:\#|\\\x>\q\SV<\%RޢF1\;&D\\\\"\?\{-\\DhB\\nu\Z;\\gٷ\40Pjϱmvr\RsO&=n!WGai(qk)6Ǒ\Z\\n+Y\\)iekp\\SmA̰|\2)#5\\vnr\Qհ\\\\\]&`֮,/f3WsO4\֕ҙ\nlc\;0\a\]H:o)\fU\\r7d+FC8ph:\9oB`\"\B?8vp\\\\\/-\"\"֡[B\'a\\hj5MR\'IR\!2%F\x\uq-k\/\请_D\\v\n.&3\ZH0\UCedz\\g\\+מ \~]p\iQ\0ǚ.^(\0c#*F|\\IO9\\\l\q숈Gx\\0v-ǚĨm\\S`՚\3L\\Ps\\bm>df+G\Z|Q\/\_L{h\#u)6yCp_\"\\i\\\_\Z^|\~e\4\eK\1䝵\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃq\n;\\\M(\$\\nVT\\\9X\[j\\:\\lJJ8\5\O&.JǨ\\ȍo\'Ģ#0\o\A\nK:v\Ym7[\n\C@\ͪ,\57\ȉY\\5~(\?\\\6]\([\r\\\\\\\\+h\r>K`NJܖDlF5\\C\aշ]7x\=\'m\w\n\9}}UAcߌ\tr\\\]$\s8\}:\"\"\"\"\"\";\~z3\\\݅\\\0\V\qJ\lڎ>\*\ð\\d\rM)Hz}\\\\T%EEe\r\re\\݄*jjRlm\lueet1\Zd E dʒQ\0y^\\\?O*],\c\525\pkyڢE$s\|ɚW6Id\m&C>bZ\\Us\HwȈÖO\Rsoh3H\c8\r\|gʇ\BP\Kۤf\\{ͽl7R\mԑ\+3\XI+\\kܽ\\6\ciu/\Gl#n\DX}\\7\m(jA L\j\\28\0Dy$E\r\\4Qx\\;\\\Yrwl\6O\NMH\?Y\\Zo\Z\q,$Fq+\s\EPr_&tS\\g\nf\T;\0\UΨ\uE-s\r[d\\E&\G _.\4ќ\Wst?\\\]=J\\g1qV\\`\\"`k\i\SG:R6>2ƌFr\\"\"\"\"\\.C\/\ȕn\:\\6Uro鿍93Z\r9\?~[g?\\/|9\S$>7\"r\m\*(\\\H\\vXL\{{fL\\'SеqPi\\FS$aD\0TA \\\V\/\/)\s\ڈQO)a\{nqT\\0Cfd \\\u<\[8 a\\ףw1x\x1\7Gb{\>[\X\\"__&\\vZtQ|\\r\\kbm:\ϧ>\=lMq\.`ݙM \"\\\\/\X\4\0\o-\\ŝ˘eL\u}Of\\\#~\3u$i\+X瀱\a\\6p>4֨;9ҾR\06H\P[Xem9\\iI\Zc#@kI[.n6I\iqҾ\-\\0\\RoV>7\<\=\\\\kH{v\wdui?ۄ(Nkǂk,bp\81#Yw\So<\Oț_+ϒ\\r\dp\\W{Ng7\0ZBe\\9!\\\H\\k\\\ \~{PW2k?~p\+\\\\|>M$\\'\\0Pc#˳>]n\rO\4 ǗvGwc$bh\`j\]zF1\0\"1\˜\\\1ke\w\nse\l\-\s}XčJ\9\}0\0|{c\\\\URO4mevX6H\a\|q5R\Z\\\\\rvKs\9ضBc\\[_`Wj\W\}/돷\\;\>\0\\\H~!iФ`\s\4\j_\85z\D\p<\\]\\\"\~5kDDDDEu\Z9\VU5\\ئ6\\H~ϲ\c0L4\\7\'7\\\"\"\"\"\"\"\"\"\"\"\".\4\\sl)b\#\{\V?`Y|\\q\hi\t\c^\\\Z\j\y`\k\ֱ~\0\\\[;\~\Ȉ\',4,0,'','','',''),(5,0,2,'9305bf00acda37f7','52226322615bf00acd9acbf086558812','2018-11-17 12:50:03','2018-11-17 12:50:03','','','Contact Photos','1.jpg','image/jpeg',80,80,2355,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\9ZM\*x\\.d% \r1!hu\GS6J\\9jdžBÏ-_e9+\r 0p\m<\\Ƌ\?Jt>\l\\ϭu1y[U:^R\0rT Ƕ>,G6\\9\\\\oCN0!..-ӭ/\nC)!i\V\*\q㕈w{\C\Jg]U%,}$\\p\\I\\5Wț$DEWI.f\"\\A\պ\0t\KDu\Y\\Z%ލjR\\n\24\\J 0f0L<\#N\Ҏv@F37\\WKLE҂C2IH\5)]i\8>*ƌޖ~\c\B\\m]cȢ~ڔ\rvb?N\Z \\\\S 6a\0\0p|;8\s:S7`3x\52\,\y\)\\r \\ɻ$\DW\tiR\fԷ=\\0B\\mg/Ň\{\Z\\P^\Z\|\!v\Z&I\^\n\X<\0f\\,,zq+u\c.\\A2\\;\\ZjI\r#;Sؓz\,`ͤgR2/\QeN-鵍u\U[R\ڽb:XبFmC2;- B1xo:\V\\0Ww\W?[\ڪ\N\\\XbA:e]X3㭶1\4\\՞i\\\V[\>$\.kI\ LɻyܪaP\\8R\\0t%WY/O\ZO\\0\Do-\a\\ ^-\,R\\\u\!Y \tu\\U5t\\\B[Q\\\\'SY\"P\\n\>VQ\ | #x˥\4\qm\Z\n\5\#g-ӞW]ۦZjybN-\r53c-{{o\+\D\\\P*#T-L\\ZCM\,fjY@\g\\LnF\#N\W\\-8SHY\\t\I\N,\ϳ\\S\^\+w~Ak>\m\l}\h\ (MN\4,^ J1(\2\b>\\\{(U՚ۭ)jdvvӢ\\ڞT\Rw\\ƌת1\\\3Z^F\¶\r\$㦣c\a\R&X$\\\\h$ca8\"\Z\$B\u!q6!X\gO\rv\\]ZA/3{^PQ[ˎ_\\4%5\\\0%_rLe\rC\^2\8c 0\\\\#\\,\16\M(m \\' N1c{xyՠ/5[-&\\Z\_\!dGlx\\"\"\䭒><%R\eն\*\+\\c|>ob_j\m\0&\Q\<\E\-AZv\Ɍԏ.y\\M+z\Ga\\J\&\\Q\'۫\|0\&G(\p\<\s0\\zy|r\Sh]\\n\H|j=[P\`vm\PYESGMM\\\$\h\0S9\\J\LJL}XIQC\$kgD̛\:ռJt\\WUu}A\L\JsC\V\mPb@ |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1>CO$yQ2Ka(#q\:\\O\\9\WPKg\\\ν\C(@l\n1|l߷\0=\x\?\Sg\{\KI˵\\=k\a&\\\S(#x\kY&N\\97m\ZY\ڨuE(@8b\{\٭\\\sݜ\v~\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\&\Z\o\\\9A/0\p4\xF|i\\C\\uXm.S4Uq\n\ʟ\rM\%rV\[\\<\o]\ضͮVe\\[\\'\dك\\2<8QF5Ѓ\Z4X1\G_\ss\4OKWv_xڍ3\\~9N\\\B2r\0!t\\D\Eu\+@\0E\0cFF872\\Zہ\e%\\>\ԁq\^cog/\o\+\ɘ\e\dwJwOŷGi{oq5\Ϗc\"rL:\!\ne\B91f\'Ө/O\gdcB{fDM&\\=؆k*e\\~v1\c\\i\\\\)\#[H<|nږVV\i{\}IL\Kf9\#\KrԷ\86P\\1\\XW5\\#ᬙ\0\ـDx\\m#>\7.\eDDDDDDDDDDD\\d \2\`&<)cf2琏vp\1\\\8k\9\1M~C\\\ҵ|բ\\9Ug{\\v05\U,SHx&B|\"\\X\\t\l{\\\\_v\[\;d卮$RH\z\?a!\8\dmfD\<+n&|\2\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]\\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\dJ>\rms1/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\Z\\J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^8R\7$ș>Wn\I#\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\Wp\'\\\\\\"\"\"(\c̞94\m\i\"J\_0\\{\rkA\"\{\\jwƯX*\Z[\m3Ɋ\\\\l\ʋc W^V,g_Z\0c}ƒd\b\x\m&)\<# E.OF\:\0\'܇#v\Bp\\{\\5nq\<8g\\DDDDE/Q/jE\\l\\}~rY[g0@\\G#֊3O\n0\\8\E\\ϞXӕ\;k/*|lÍm{]\\ZuT;\˹x\h2C26dFfwԝ\\dz\|\?\Sk0$\C\y&\KlbX|\0I]f<|U\t]f\6ڹ{V\\\5,ҩ~\ME\\\dW\C\ J,.\\{;=}Iқ\Z\\ry\HJI0YNJAL\\\p/\UZt+](}\|@ȣB\S\:f{\\\Vtٻ$<>ql\09O\\gAz<V\-i\g\\\2K[-g8\G)3P[\6~+{\U\˪Eę;,\pans!\\.\f\8\\a\HkaW\7\P\\\BRX\eM,I\C^\q\+\R3X\+X\hdF)}V\M\q(8\\cDW5\7\c\c\w|㳬\0e\\ZiY밚9[\\ckZs.u\G9\x\\'JaΦ=\v{Mʙd}v\\أ2L\\V.hjHh\|q#\}2 ^\rޞ\\3j:\\\5KG\0S\2&\.\'\hN \mSfǩ(\5\ljb1FƍLx\ƌ \0FA\шCkX\5cp\c\x\\|t{@\\\\xF\x;c\#\\(\\Z9116̋\*}TUc#8*i9w\"\6\1\\b\Kߴk\\\\\{:k\\2bs\Vg8i̊SLr\0rtho\\OcN~n\\ԇv\\i\Wg>E\Z4cQ\r`\#Ub\G:4\9t\"\"\"\1E \0\07\3\ \"n^B\X1s\\rcq;8\3Qw\v\\/;ku6\\\c\gZ\~2noLZ64Y)g\&.#\\\-c\ߩcJ\皭I\ \Z\\Ut\$\o̸x\(,cB\+\Ǫj\i\u%n\u(\"m]t1\q\Ŏ,acw;?\"y{\"\"\"\"\"\"\"\"\"\"\"(J瞵\\"Y\\Ys[\\zs\X\7*\\QHiOiG=n^7{\ɾ8{}\}\dԬG܋\\\7\\"w\?̯\\έfSC6\]Q*s+.َ\'\cKa\)k5\%;-c*.!UsZW\=]XVQ 6\\(\wՌDDZ\Vg\\\gnըu\H.3\\Nk\Zm\\Z\8#_\\7\\D\^lٖS%\\˓>\|͝:i\*dْʗ.Q\ȓ \ys=\1^\{\02\]ӊ>\S2\w\Ճ&ma*qAZKȦMZ\0`Ћ\L\cߚ\"\"\"\"\"\"\"\"\"\"\"\"\0C(&$\"\Z@\aB`BaaF9\ \ܱ\\Z\g\UnpwM{ˣ\'Z\Fr\\T\cck;\\r\L{\\\\n\\b\b\0i&ۘml$+k~N\s\N\r\Pϴ\\ \+Z)3!꼉\\M=t\\'\P͎aͭc\IV\:\\\DE?S\r5\\\&ns=\\t㲽a~9ǴsUF\ϻp\\.\p^\U\G)qv.@\h! fW[\ubx\\"H aAn~7\ñ|\'UWQOQ5Օ\n X\\bah5kq\\=\0]9\{\"\"\"\"\"\"\"\"\"\",h\q\*\\8q\ku]ebr\o\$\nw6s%\@\H\"0\Z>@\g\m\n2zη.vl䭐h[XNՁf\e\Y3v.\X\Z얺+s2T\]t\\\K}\Z\c]\nª%v\ݎ=@\nh4䷱\\5X\G9{`t\I\\'\Ɗs\ܧ\\\\\%r\\jH3ܭFڷ*,\\J\7Q*\<F]\6@\'dcJ(C\ZOXL\1\3\0\>i\g/\\}\h}dF\e}xN\\\K\R>\0r\'X\$bO9Y\\N<`v\\d\[\WH\=dș\\Xg\\o^4!m\7Gދv\}\\\\y\Z(5gضK9q)`̰85ǛcȈ\r|p\\\tO\\ ,ڲ{\oi\6fXL>@l\\;G79v(\\h.uK\[cOkWT\3̫j\J\L\]I:1\s҉\s{\\\$7\o~E[X!84{m\!aJ\\H\B!|Xǻ8no\\h{\0Ñ\P֭H\%4)79ÆPc\\v3\]*\[/(\q\\r\nK\UB $Kca-\#Ǝ\"\sD&q jx\{xΉ\Zjó\pM8;#4\jb\b?G\\Ŵ:\y+\lZ:\k;Ȳ$f;lm\\Ξioc\\&T\ X[8qy)lA!bTh\GW\\"ֹ_\O\~\p\I\\\\Z\-\im\\c1UTVP&J>Zw½y\\\pU \\yR\\\8\2$g\\J\$\˟l{{\Z\"\"\"\"*}Q-l?~\ޱ*[{o}o\\.5f\\2{B\\8;m \ϗ>Ćي\Ɓ_y\W\#\\.\\\\JMP\\hȸy\\E줟8m\\R\5$\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃ\q\n;\\\M^(ѽ\$0eK^m<\U֨\n\:\A\ZkJ\Z٤}~\ȟCCk\\n5$\մ/O_Kŗ\[\AqO\f\8K/\%\\x昙\~\X\\0\\Y\O1\\r.\W\\\\\0\F\\0ya?%5|\a~q\gITV:5D\0+\F]\"\"\"\"\"ž\t{\@\o?j\m},7kuqe)Z)Xp\@[(\H$2b@\ Um\\0˝S`H\x[m\$\\Zxq\\\$\xo\\@YF3+hq\Ӹy_GּDI\]\=6n=٢F\y8\z.g2W\8qWh֏X\1lʶ\\Z\%}9\_\0w5.\zݴ}s[ko3_\\\n\N\\\Z,ʋ&9\QFT\"\"\"\"\"\"\"\".(\Z0\"D`@\0!c\!\!汌k\a\UR\2=\\[gf\lvZ\cF!C\.J\y`_:\:М\$&in\"W\;y\ɧfu>ptC|\nӐ9\n\)ka\[ih\\4-(5p\\\-~ΗWT{ʛz/Ѿ\ם/}ա\\z\l&^ߺ$q\[\\8\eݵM2Iֲ\"[Q3 \\\\\DDDDDDD^a\+Ľ\\Ú\R\?\\\U_j{4K\ZfF %\r\d\Ex\"a(,RJ \0O+\\\\EA\\}_f\\rv\;TH\y/3S\j\\,ӨgÃ!ulK[\X^|\\0nr\ =jS.m\\H\"Xj܉\mRKk,66E,c`3\d 1d?\\Geb\\6#<\(\j\c~\/Q+ \I\\M20\\Sw_O`\8\?$rg\\\o1\"\!u\s-\\Ytⰻi\Z\\:7\Z\\0̬,\ZQqpo^wY\~4\r{F䚢\r\\Dœ#J\.,X3eM|Ղ%\\;3ƃ1aR#06&\ADn2˘AØ\-ss79\qȈ)@w絞W9w\\l\B\m_\q[IQ\'9.˵lQ\rE\ ɝ\'\Z\ (A\Ozfv)d\\^f\J\\k\6>h\\"\\t\\Q6f\iZfq\\~\}r\0vOG\5{&^q\r.:)cD\uv\*mk\\l{\J\Z|x\\ݩظ\O\,\mGH\Z.N\\Ipc\W\` G\*6ڑ\2\\ BkWM#ҵ\b\\~;;Y\n)2\0\;4>\u:}4\lb\o\㽭w>\ha\\\@خeN\m;yKnwF\ﱂK:9;1\q8O\5\\2ܷ\Ƿ7\\#r\o[<\r\mu$bs\\VJs\Z7/~qͶ~\kKQ\\%i&\\Qd7\ā܇\o\EJֽ\i\v\\\\\\sK\\\k\4\Ȝ\,D~G)\\vʊ610\\;`/\-w\\\ٽ\C\(\I\-jh\ZvQ\ĉQ\0(UA9lp\07\e\#\\s\\QS\/\\7L:\\\ǒd\f\c\\X0,5#2Zn&7\;o\9\\V}\\r\\"ޠ\+\W\\K\Aߜ\\\^\0\"\"\"\"\O=2^\S:\lSM\'\\\c\\Dz߾Xǃ9Ǿ}x\\icoqPn\N쎭\'\\p% \xV ԭeNr\g$v.?\0m\5\@!k\y\\\\i\\\8\0# HLyBY\q2\ai\\0ߟv\7\~Y@\уx$;yF\/\'c\!\h\\\L\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\V\0 RDDDD_\Al(\#ZonZ\Z=\\\\c-ssg\s\L]z\2~q9(# \kc\1ٍ[\lc9SDDDDDDDDDDDDQ`\\e\\]ό\r\p\#|\\0XjB\1fWVx\\\Zܘ֔ 8n2Be2{\\3\X\m\"\"\"\"\"GmC\\\\Zia<\\w.X坲\\!=\c(\\|\01\0\l\"\"\"\"\"\"\"\"\"\"\"\"~\\0\gi\V2\0/<9\\\\\\\E*V[\?\\r#\\ĉ\K\Ӿ\0\hT\v3DDDDZ\\qO.\*\s\6RZCl (\zq`\n>\n\^\dNsƈ\c\\c?PfFh\\\ [(p%\ \\Gtı$30\3?ɇ\_\=8\<,?ڄA\,\r^Q0\?710`xȱ\k\\\*|*fuՕMdx3)w$?g\c1&\Zs\ۂ\\\_\}\DDDDDDDDDDDE\7=F|\\u\re55\\\Cѕ\|ax\\\\3\\=ѡQ\kՍ{+hjk\Ga\d\Za{Z\9\\0;n\g8kqc\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/\',4,1,'','','',''),(8,2,0,'9305bf00c122b3bd','90913473615bf00c122ac78338492980','2018-11-17 12:39:46','2018-11-17 12:39:46','','','Profile Photos','person-300.jpg','image/jpeg',80,80,2354,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0\0 \n!#\"AB\\0\0\0?\0\\8\8\8㚑\1V\\7M\PCm;\n\f˲\A\"&\n(\\\z\r+\\*N\1dVq+:}\wN\\z/ \\I̮֩\uJ7\ZIA\y\d2m`\^N|HKFow\nRɭc5mö0\~Sr\\\t<Ŏ8\Mi\-2\Cz*\}\\`C\_\qț\\\'0\g(督v\\pQaYV\[=AXFR\\Y\Zp|6RPoSz\\B9d\\\V؛jl.e6Nڔ\"S\\pσ\U{\r<є\\*F@VԘ:WV`b6]hX\\F\G8a\n\\\hNcsѿ7?\Z*GLn.{^\m}kY(IF\s(\#\#Y+{|2&%hZ\OL~\0\:\vڗ-\\E\;=!\0\DZ\vW\^Q\\"\5y\0\Z\G\لJ ]\٥\CT\\ZiR.!-:eZ_>(qJ\dHqya\0\\T9\\\/ZŹ\潩DO\\"f4D\rR\wDPm5-\\\]P>A\r+\sњK^_\z\A\t\n3V\)\ٚ@.gE0{H\0.`FZP\qi7k\\\=4ąםL\c\\+c\\\\ΩN h\HH\\&\O\r^m\\K1R\\\0z\?W\'m\\r`\ƵD\*\Z.4.\D\)&\Z\"\1yȐ_\2\eǧXv:r\^*d!!ܭ;@\3\=?\'kR\\Fq\u*\\"0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬OcaYr\]C\(%g\F6X͟+\\\a0Qԫ$]#cJ4\HZ&f:\dפ3b\\rs`*\%IZp\nJ%I\2c8\q|\8\?g\qϞ8\~S&S\II(\\rnws\ZQ3q\$L\%r\ZS4\j\0*8}\e92(w\f\r\\\GAW\#\0xؘxxZ2*.86\\d@f[a\\}sm}Bِn\6=\"+o^Vpo9\k;:\84\\*n8j\`d|\һi\.\\v l\rsn\2#җ!E\*2P\gS\!Z^뒠\\*\2p\\v#f\~\\֫\B/j\U)^ĉ,y-`\0$|kkם:4\0\Mj8Pߨ)\\(Y\\0-yVQې&E\0@>,\>\\8\\c\K?\m a\nm3\;sR$\%Զ\*ͭL\\\M\q\ua= \^LrE\}ĚXRra]ޱMd~4\D\e-8\\eᲬ6[§q\t\\\TB:)M\aG`t\+w\0ٍ\XCoKˎp$QK\ vY3\%\K㈲\\\p㌌ᅸ;KVP\\!M*y̫8\u-;99\r\rB}\^xt;^oVZR9\g\',5,1,'','','',''),(9,2,0,'9305bf00c122b3bd','90913473615bf00c122ac78338492980','2018-11-17 12:39:46','2018-11-17 12:39:46','','','Profile Photos','person-300.jpg','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\(:+jo6;+\Ya>\U\aZ\\Hbqc1oz\\iق%a\-]\o)s\^\x[-4й\\\;\jT[P\lQ\\--\\v\$\ g3N]c\F|J^f<:Ī\umYȬƼ1[\Z,En֨ESpRƆ\AKp\"K5\c\\k\{\=z\\eV<\}O^ԋʜ9E\\!\rf*9ʱ\'94nT\+NS?Ƈ!j5X\&\<1)d\-\\\u)_\]lQ91Y\¸K!\\`5R_\\\y\P\Ұ \h{G\\1ԏ P\\\ۦ%<\U0]y?gp)vIϬ\\\'\\uY\\"I۔
a\\aYXj[G\ؤ\r\0\B\<\\uoy\j:齟!5\6O\\\D|@+\\c|>ob_j\m\0&\Q\<\E\-AZv\Ɍԏ.y\\M+z\Ga\\J\&\\Q\'۫\|0\&G(\p\<\s0\\zy|r\Sh]\\n\H|j=[P\`vm\PYESGMM\\\$\h\0S9\\J\LJL}XIQC\$kgD̛\:ռJt\\WUu}A\L\JsC\V\mPb@ |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1>CO$yQ2Ka(#q\:\\O\\9\WPKg\\\ν\C(@l\n1|l߷\0=\x\?\Sg\{\KI˵\\=k\a&\\\S(#x\kY&N\\97m\ZY\ڨuE(@8b\{\٭\\\sݜ\v~\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\&\Z\o\\\9A/0\p4\xF|i\\C\\uXm.S4Uq\n\ʟ\rM\%rV\[\\<\o]\ضͮVe\\[\\'\dك\\2<8QF5Ѓ\Z4X1\G_\ss\4OKWv_xڍ3\\~9N\\\B2r\0!t\\D\Eu\+@\0E\0cFF872\\Zہ\e%\\>\ԁq\^cog/\o\+\ɘ\e\dwJwOŷGi{oq5\Ϗc\"rL:\!\ne\B91f\'Ө/O\gdcB{fDM&\\=؆k*e\\~v1\c\\i\\\\)\#[H<|nږVV\i{\}IL\Kf9\#\KrԷ\86P\\1\\XW5\\#ᬙ\0\ـDx\\m#>\7.\eDDDDDDDDDDD\\d \2\`&<)cf2琏vp\1\\\8k\9\1M~C\\\ҵ|բ\\9Ug{\\v05\U,SHx&B|\"\\X\\t\l{\\\\_v\[\;d卮$RH\z\?a!\8\dmfD\<+n&|\2\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]\\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\dJ>\rms1/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\Z\\J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^8R\7$ș>Wn\I#\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\Wp\'\\\\\\"\"\"(\c̞94\m\i\"J\_0\\{\rkA\"\{\\jwƯX*\Z[\m3Ɋ\\\\l\ʋc W^V,g_Z\0c}ƒd\b\x\m&)\<# E.OF\:\0\'܇#v\Bp\\{\\5nq\<8g\\DDDDE/Q/jE\\l\\}~rY[g0@\\G#֊3O\n0\\8\E\\ϞXӕ\;k/*|lÍm{]\\ZuT;\˹x\h2C26dFfwԝ\\dz\|\?\Sk0$\C\y&\KlbX|\0I]f<|U\t]f\6ڹ{V\\\5,ҩ~\ME\\\dW\C\ J,.\\{;=}Iқ\Z\\ry\HJI0YNJAL\\\p/\UZt+](}\|@ȣB\S\:f{\\\Vtٻ$<>ql\09O\\gAz<V\-i\g\\\2K[-g8\G)3P[\6~+{\U\˪Eę;,\pans!\\.\f\8\\a\HkaW\7\P\\\BRX\eM,I\C^\q\+\R3X\+X\hdF)}V\M\q(8\\cDW5\7\c\c\w|㳬\0e\\ZiY밚9[\\ckZs.u\G9\x\\'JaΦ=\v{Mʙd}v\\أ2L\\V.hjHh\|q#\}2 ^\rޞ\\3j:\\\5KG\0S\2&\.\'\hN \mSfǩ(\5\ljb1FƍLx\ƌ \0FA\шCkX\5cp\c\x\\|t{@\\\\xF\x;c\#\\(\\Z9116̋\*}TUc#8*i9w\"\6\1\\b\Kߴk\\\\\{:k\\2bs\Vg8i̊SLr\0rtho\\OcN~n\\ԇv\\i\Wg>E\Z4cQ\r`\#Ub\G:4\9t\"\"\"\1E \0\07\3\ \"n^B\X1s\\rcq;8\3Qw\v\\/;ku6\\\c\gZ\~2noLZ64Y)g\&.#\\\-c\ߩcJ\皭I\ \Z\\Ut\$\o̸x\(,cB\+\Ǫj\i\u%n\u(\"m]t1\q\Ŏ,acw;?\"y{\"\"\"\"\"\"\"\"\"\"\"(J瞵\\"Y\\Ys[\\zs\X\7*\\QHiOiG=n^7{\ɾ8{}\}\dԬG܋\\\7\\"w\?̯\\έfSC6\]Q*s+.َ\'\cKa\)k5\%;-c*.!UsZW\=]XVQ 6\\(\wՌDDZ\Vg\\\gnըu\H.3\\Nk\Zm\\Z\8#_\\7\\D\^lٖS%\\˓>\|͝:i\*dْʗ.Q\ȓ \ys=\1^\{\02\]ӊ>\S2\w\Ճ&ma*qAZKȦMZ\0`Ћ\L\cߚ\"\"\"\"\"\"\"\"\"\"\"\"\0C(&$\"\Z@\aB`BaaF9\ \ܱ\\Z\g\UnpwM{ˣ\'Z\Fr\\T\cck;\\r\L{\\\\n\\b\b\0i&ۘml$+k~N\s\N\r\Pϴ\\ \+Z)3!꼉\\M=t\\'\P͎aͭc\IV\:\\\DE?S\r5\\\&ns=\\t㲽a~9ǴsUF\ϻp\\.\p^\U\G)qv.@\h! fW[\ubx\\"H aAn~7\ñ|\'UWQOQ5Օ\n X\\bah5kq\\=\0]9\{\"\"\"\"\"\"\"\"\"\",h\q\*\\8q\ku]ebr\o\$\nw6s%\@\H\"0\Z>@\g\m\n2zη.vl䭐h[XNՁf\e\Y3v.\X\Z얺+s2T\]t\\\K}\Z\c]\nª%v\ݎ=@\nh4䷱\\5X\G9{`t\I\\'\Ɗs\ܧ\\\\\%r\\jH3ܭFڷ*,\\J\7Q*\<F]\6@\'dcJ(C\ZOXL\1\3\0\>i\g/\\}\h}dF\e}xN\\\K\R>\0r\'X\$bO9Y\\N<`v\\d\[\WH\=dș\\Xg\\o^4!m\7Gދv\}\\\\y\Z(5gضK9q)`̰85ǛcȈ\r|p\\\tO\\ ,ڲ{\oi\6fXL>@l\\;G79v(\\h.uK\[cOkWT\3̫j\J\L\]I:1\s҉\s{\\\$7\o~E[X!84{m\!aJ\\H\B!|Xǻ8no\\h{\0Ñ\P֭H\%4)79ÆPc\\v3\]*\[/(\q\\r\nK\UB $Kca-\#Ǝ\"\sD&q jx\{xΉ\Zjó\pM8;#4\jb\b?G\\Ŵ:\y+\lZ:\k;Ȳ$f;lm\\Ξioc\\&T\ X[8qy)lA!bTh\GW\\"ֹ_\O\~\p\I\\\\Z\-\im\\c1UTVP&J>Zw½y\\\pU \\yR\\\8\2$g\\J\$\˟l{{\Z\"\"\"\"*}Q-l?~\ޱ*[{o}o\\.5f\\2{B\\8;m \ϗ>Ćي\Ɓ_y\W\#\\.\\\\JMP\\hȸy\\E줟8m\\R\5$\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃ\q\n;\\\M^(ѽ\$0eK^m<\U֨\n\:\A\ZkJ\Z٤}~\ȟCCk\\n5$\մ/O_Kŗ\[\AqO\f\8K/\%\\x昙\~\X\\0\\Y\O1\\r.\W\\\\\0\F\\0ya?%5|\a~q\gITV:5D\0+\F]\"\"\"\"\"ž\t{\@\o?j\m},7kuqe)Z)Xp\@[(\H$2b@\ Um\\0˝S`H\x[m\$\\Zxq\\\$\xo\\@YF3+hq\Ӹy_GּDI\]\=6n=٢F\y8\z.g2W\8qWh֏X\1lʶ\\Z\%}9\_\0w5.\zݴ}s[ko3_\\\n\N\\\Z,ʋ&9\QFT\"\"\"\"\"\"\"\".(\Z0\"D`@\0!c\!\!汌k\a\UR\2=\\[gf\lvZ\cF!C\.J\y`_:\:М\$&in\"W\;y\ɧfu>ptC|\nӐ9\n\)ka\[ih\\4-(5p\\\-~ΗWT{ʛz/Ѿ\ם/}ա\\z\l&^ߺ$q\[\\8\eݵM2Iֲ\"[Q3 \\\\\DDDDDDD^a\+Ľ\\Ú\R\?\\\U_j{4K\ZfF %\r\d\Ex\"a(,RJ \0O+\\\\EA\\}_f\\rv\;TH\y/3S\j\\,ӨgÃ!ulK[\X^|\\0nr\ =jS.m\\H\"Xj܉\mRKk,66E,c`3\d 1d?\\Geb\\6#<\(\j\c~\/Q+ \I\\M20\\Sw_O`\8\?$rg\\\o1\"\!u\s-\\Ytⰻi\Z\\:7\Z\\0̬,\ZQqpo^wY\~4\r{F䚢\r\\Dœ#J\.,X3eM|Ղ%\\;3ƃ1aR#06&\ADn2˘AØ\-ss79\qȈ)@w絞W9w\\l\B\m_\q[IQ\'9.˵lQ\rE\ ɝ\'\Z\ (A\Ozfv)d\\^f\J\\k\6>h\\"\\t\\Q6f\iZfq\\~\}r\0vOG\5{&^q\r.:)cD\uv\*mk\\l{\J\Z|x\\ݩظ\O\,\mGH\Z.N\\Ipc\W\` G\*6ڑ\2\\ BkWM#ҵ\b\\~;;Y\n)2\0\;4>\u:}4\lb\o\㽭w>\ha\\\@خeN\m;yKnwF\ﱂK:9;1\q8O\5\\2ܷ\Ƿ7\\#r\o[<\r\mu$bs\\VJs\Z7/~qͶ~\kKQ\\%i&\\Qd7\ā܇\o\EJֽ\i\v\\\\\\sK\\\k\4\Ȝ\,D~G)\\vʊ610\\;`/\-w\\\ٽ\C\(\I\-jh\ZvQ\ĉQ\0(UA9lp\07\e\#\\s\\QS\/\\7L:\\\ǒd\f\c\\X0,5#2Zn&7\;o\9\\V}\\r\\"ޠ\+\W\\K\Aߜ\\\^\0\"\"\"\"\O=2^\S:\lSM\'\\\c\\Dz߾Xǃ9Ǿ}x\\icoqPn\N쎭\'\\p% \xV ԭeNr\g$v.?\0m\5\@!k\y\\\\i\\\8\0# HLyBY\q2\ai\\0ߟv\7\~Y@\уx$;yF\/\'c\!\h\\\L\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\V\0 RDDDD_\Al(\#ZonZ\Z=\\\\c-ssg\s\L]z\2~q9(# \kc\1ٍ[\lc9SDDDDDDDDDDDDQ`\\e\\]ό\r\p\#|\\0XjB\1fWVx\\\Zܘ֔ 8n2Be2{\\3\X\m\"\"\"\"\"GmC\\\\Zia<\\w.X坲\\!=\c(\\|\01\0\l\"\"\"\"\"\"\"\"\"\"\"\"~\\0\gi\V2\0/<9\\\\\\\E*V[\?\\r#\\ĉ\K\Ӿ\0\hT\v3DDDDZ\\qO.\*\s\6RZCl (\zq`\n>\n\^\dNsƈ\c\\c?PfFh\\\ [(p%\ \\Gtı$30\3?ɇ\_\=8\<,?ڄA\,\r^Q0\?710`xȱ\k\\\*|*fuՕMdx3)w$?g\c1&\Zs\ۂ\\\_\}\DDDDDDDDDDDE\7=F|\\u\re55\\\Cѕ\|ax\\\\3\\=ѡQ\kՍ{+hjk\Ga\d\Za{Z\9\\0;n\g8kqc\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/\',4,1,'','','',''),(11,3,0,'9305bf00c27303da','17543934065bf00c273021a183499779','2018-11-17 12:40:07','2018-11-17 12:40:07','','','Profile Photos','person-300.jpg','image/jpeg',80,80,2354,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0\0 \n!#\"AB\\0\0\0?\0\\8\8\8㚑\1V\\7M\PCm;\n\f˲\A\"&\n(\\\z\r+\\*N\1dVq+:}\wN\\z/ \\I̮֩\uJ7\ZIA\y\d2m`\^N|HKFow\nRɭc5mö0\~Sr\\\t<Ŏ8\Mi\-2\Cz*\}\\`C\_\qț\\\'0\g(督v\\pQaYV\[=AXFR\\Y\Zp|6RPoSz\\B9d\\\V؛jl.e6Nڔ\"S\\pσ\U{\r<є\\*F@VԘ:WV`b6]hX\\F\G8a\n\\\hNcsѿ7?\Z*GLn.{^\m}kY(IF\s(\#\#Y+{|2&%hZ\OL~\0\:\vڗ-\\E\;=!\0\DZ\vW\^Q\\"\5y\0\Z\G\لJ ]\٥\CT\\ZiR.!-:eZ_>(qJ\dHqya\0\\T9\\\/ZŹ\潩DO\\"f4D\rR\wDPm5-\\\]P>A\r+\sњK^_\z\A\t\n3V\)\ٚ@.gE0{H\0.`FZP\qi7k\\\=4ąםL\c\\+c\\\\ΩN h\HH\\&\O\r^m\\K1R\\\0z\?W\'m\\r`\ƵD\*\Z.4.\D\)&\Z\"\1yȐ_\2\eǧXv:r\^*d!!ܭ;@\3\=?\'kR\\Fq\u*\\"0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬OcaYr\]C\(%g\F6X͟+\\\a0Qԫ$]#cJ4\HZ&f:\dפ3b\\rs`*\%IZp\nJ%I\2c8\q|\8\?g\qϞ8\~S&S\II(\\rnws\ZQ3q\$L\%r\ZS4\j\0*8}\e92(w\f\r\\\GAW\#\0xؘxxZ2*.86\\d@f[a\\}sm}Bِn\6=\"+o^Vpo9\k;:\84\\*n8j\`d|\һi\.\\v l\rsn\2#җ!E\*2P\gS\!Z^뒠\\*\2p\\v#f\~\\֫\B/j\U)^ĉ,y-`\0$|kkם:4\0\Mj8Pߨ)\\(Y\\0-yVQې&E\0@>,\>\\8\\c\K?\m a\nm3\;sR$\%Զ\*ͭL\\\M\q\ua= \^LrE\}ĚXRra]ޱMd~4\D\e-8\\eᲬ6[§q\t\\\TB:)M\aG`t\+w\0ٍ\XCoKˎp$QK\ vY3\%\K㈲\\\p㌌ᅸ;KVP\\!M*y̫8\u-;99\r\rB}\^xt;^oVZR9\g\',5,1,'','','',''),(12,3,0,'9305bf00c27303da','17543934065bf00c273021a183499779','2018-11-17 12:40:07','2018-11-17 12:40:07','','','Profile Photos','person-300.jpg','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\(:+jo6;+\Ya>\U\aZ\\Hbqc1oz\\iق%a\-]\o)s\^\x[-4й\\\;\jT[P\lQ\\--\\v\$\ g3N]c\F|J^f<:Ī\umYȬƼ1[\Z,En֨ESpRƆ\AKp\"K5\c\\k\{\=z\\eV<\}O^ԋʜ9E\\!\rf*9ʱ\'94nT\+NS?Ƈ!j5X\&\<1)d\-\\\u)_\]lQ91Y\¸K!\\`5R_\\\y\P\Ұ \h{G\\1ԏ P\\\ۦ%<\U0]y?gp)vIϬ\\\'\\uY\\"I۔
a\\aYXj[G\ؤ\r\0\B\<\\uoy\j:齟!5\6O\\\D|@+\\c|>ob_j\m\0&\Q\<\E\-AZv\Ɍԏ.y\\M+z\Ga\\J\&\\Q\'۫\|0\&G(\p\<\s0\\zy|r\Sh]\\n\H|j=[P\`vm\PYESGMM\\\$\h\0S9\\J\LJL}XIQC\$kgD̛\:ռJt\\WUu}A\L\JsC\V\mPb@ |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1>CO$yQ2Ka(#q\:\\O\\9\WPKg\\\ν\C(@l\n1|l߷\0=\x\?\Sg\{\KI˵\\=k\a&\\\S(#x\kY&N\\97m\ZY\ڨuE(@8b\{\٭\\\sݜ\v~\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\&\Z\o\\\9A/0\p4\xF|i\\C\\uXm.S4Uq\n\ʟ\rM\%rV\[\\<\o]\ضͮVe\\[\\'\dك\\2<8QF5Ѓ\Z4X1\G_\ss\4OKWv_xڍ3\\~9N\\\B2r\0!t\\D\Eu\+@\0E\0cFF872\\Zہ\e%\\>\ԁq\^cog/\o\+\ɘ\e\dwJwOŷGi{oq5\Ϗc\"rL:\!\ne\B91f\'Ө/O\gdcB{fDM&\\=؆k*e\\~v1\c\\i\\\\)\#[H<|nږVV\i{\}IL\Kf9\#\KrԷ\86P\\1\\XW5\\#ᬙ\0\ـDx\\m#>\7.\eDDDDDDDDDDD\\d \2\`&<)cf2琏vp\1\\\8k\9\1M~C\\\ҵ|բ\\9Ug{\\v05\U,SHx&B|\"\\X\\t\l{\\\\_v\[\;d卮$RH\z\?a!\8\dmfD\<+n&|\2\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]\\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\dJ>\rms1/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\Z\\J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^8R\7$ș>Wn\I#\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\Wp\'\\\\\\"\"\"(\c̞94\m\i\"J\_0\\{\rkA\"\{\\jwƯX*\Z[\m3Ɋ\\\\l\ʋc W^V,g_Z\0c}ƒd\b\x\m&)\<# E.OF\:\0\'܇#v\Bp\\{\\5nq\<8g\\DDDDE/Q/jE\\l\\}~rY[g0@\\G#֊3O\n0\\8\E\\ϞXӕ\;k/*|lÍm{]\\ZuT;\˹x\h2C26dFfwԝ\\dz\|\?\Sk0$\C\y&\KlbX|\0I]f<|U\t]f\6ڹ{V\\\5,ҩ~\ME\\\dW\C\ J,.\\{;=}Iқ\Z\\ry\HJI0YNJAL\\\p/\UZt+](}\|@ȣB\S\:f{\\\Vtٻ$<>ql\09O\\gAz<V\-i\g\\\2K[-g8\G)3P[\6~+{\U\˪Eę;,\pans!\\.\f\8\\a\HkaW\7\P\\\BRX\eM,I\C^\q\+\R3X\+X\hdF)}V\M\q(8\\cDW5\7\c\c\w|㳬\0e\\ZiY밚9[\\ckZs.u\G9\x\\'JaΦ=\v{Mʙd}v\\أ2L\\V.hjHh\|q#\}2 ^\rޞ\\3j:\\\5KG\0S\2&\.\'\hN \mSfǩ(\5\ljb1FƍLx\ƌ \0FA\шCkX\5cp\c\x\\|t{@\\\\xF\x;c\#\\(\\Z9116̋\*}TUc#8*i9w\"\6\1\\b\Kߴk\\\\\{:k\\2bs\Vg8i̊SLr\0rtho\\OcN~n\\ԇv\\i\Wg>E\Z4cQ\r`\#Ub\G:4\9t\"\"\"\1E \0\07\3\ \"n^B\X1s\\rcq;8\3Qw\v\\/;ku6\\\c\gZ\~2noLZ64Y)g\&.#\\\-c\ߩcJ\皭I\ \Z\\Ut\$\o̸x\(,cB\+\Ǫj\i\u%n\u(\"m]t1\q\Ŏ,acw;?\"y{\"\"\"\"\"\"\"\"\"\"\"(J瞵\\"Y\\Ys[\\zs\X\7*\\QHiOiG=n^7{\ɾ8{}\}\dԬG܋\\\7\\"w\?̯\\έfSC6\]Q*s+.َ\'\cKa\)k5\%;-c*.!UsZW\=]XVQ 6\\(\wՌDDZ\Vg\\\gnըu\H.3\\Nk\Zm\\Z\8#_\\7\\D\^lٖS%\\˓>\|͝:i\*dْʗ.Q\ȓ \ys=\1^\{\02\]ӊ>\S2\w\Ճ&ma*qAZKȦMZ\0`Ћ\L\cߚ\"\"\"\"\"\"\"\"\"\"\"\"\0C(&$\"\Z@\aB`BaaF9\ \ܱ\\Z\g\UnpwM{ˣ\'Z\Fr\\T\cck;\\r\L{\\\\n\\b\b\0i&ۘml$+k~N\s\N\r\Pϴ\\ \+Z)3!꼉\\M=t\\'\P͎aͭc\IV\:\\\DE?S\r5\\\&ns=\\t㲽a~9ǴsUF\ϻp\\.\p^\U\G)qv.@\h! fW[\ubx\\"H aAn~7\ñ|\'UWQOQ5Օ\n X\\bah5kq\\=\0]9\{\"\"\"\"\"\"\"\"\"\",h\q\*\\8q\ku]ebr\o\$\nw6s%\@\H\"0\Z>@\g\m\n2zη.vl䭐h[XNՁf\e\Y3v.\X\Z얺+s2T\]t\\\K}\Z\c]\nª%v\ݎ=@\nh4䷱\\5X\G9{`t\I\\'\Ɗs\ܧ\\\\\%r\\jH3ܭFڷ*,\\J\7Q*\<F]\6@\'dcJ(C\ZOXL\1\3\0\>i\g/\\}\h}dF\e}xN\\\K\R>\0r\'X\$bO9Y\\N<`v\\d\[\WH\=dș\\Xg\\o^4!m\7Gދv\}\\\\y\Z(5gضK9q)`̰85ǛcȈ\r|p\\\tO\\ ,ڲ{\oi\6fXL>@l\\;G79v(\\h.uK\[cOkWT\3̫j\J\L\]I:1\s҉\s{\\\$7\o~E[X!84{m\!aJ\\H\B!|Xǻ8no\\h{\0Ñ\P֭H\%4)79ÆPc\\v3\]*\[/(\q\\r\nK\UB $Kca-\#Ǝ\"\sD&q jx\{xΉ\Zjó\pM8;#4\jb\b?G\\Ŵ:\y+\lZ:\k;Ȳ$f;lm\\Ξioc\\&T\ X[8qy)lA!bTh\GW\\"ֹ_\O\~\p\I\\\\Z\-\im\\c1UTVP&J>Zw½y\\\pU \\yR\\\8\2$g\\J\$\˟l{{\Z\"\"\"\"*}Q-l?~\ޱ*[{o}o\\.5f\\2{B\\8;m \ϗ>Ćي\Ɓ_y\W\#\\.\\\\JMP\\hȸy\\E줟8m\\R\5$\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃ\q\n;\\\M^(ѽ\$0eK^m<\U֨\n\:\A\ZkJ\Z٤}~\ȟCCk\\n5$\մ/O_Kŗ\[\AqO\f\8K/\%\\x昙\~\X\\0\\Y\O1\\r.\W\\\\\0\F\\0ya?%5|\a~q\gITV:5D\0+\F]\"\"\"\"\"ž\t{\@\o?j\m},7kuqe)Z)Xp\@[(\H$2b@\ Um\\0˝S`H\x[m\$\\Zxq\\\$\xo\\@YF3+hq\Ӹy_GּDI\]\=6n=٢F\y8\z.g2W\8qWh֏X\1lʶ\\Z\%}9\_\0w5.\zݴ}s[ko3_\\\n\N\\\Z,ʋ&9\QFT\"\"\"\"\"\"\"\".(\Z0\"D`@\0!c\!\!汌k\a\UR\2=\\[gf\lvZ\cF!C\.J\y`_:\:М\$&in\"W\;y\ɧfu>ptC|\nӐ9\n\)ka\[ih\\4-(5p\\\-~ΗWT{ʛz/Ѿ\ם/}ա\\z\l&^ߺ$q\[\\8\eݵM2Iֲ\"[Q3 \\\\\DDDDDDD^a\+Ľ\\Ú\R\?\\\U_j{4K\ZfF %\r\d\Ex\"a(,RJ \0O+\\\\EA\\}_f\\rv\;TH\y/3S\j\\,ӨgÃ!ulK[\X^|\\0nr\ =jS.m\\H\"Xj܉\mRKk,66E,c`3\d 1d?\\Geb\\6#<\(\j\c~\/Q+ \I\\M20\\Sw_O`\8\?$rg\\\o1\"\!u\s-\\Ytⰻi\Z\\:7\Z\\0̬,\ZQqpo^wY\~4\r{F䚢\r\\Dœ#J\.,X3eM|Ղ%\\;3ƃ1aR#06&\ADn2˘AØ\-ss79\qȈ)@w絞W9w\\l\B\m_\q[IQ\'9.˵lQ\rE\ ɝ\'\Z\ (A\Ozfv)d\\^f\J\\k\6>h\\"\\t\\Q6f\iZfq\\~\}r\0vOG\5{&^q\r.:)cD\uv\*mk\\l{\J\Z|x\\ݩظ\O\,\mGH\Z.N\\Ipc\W\` G\*6ڑ\2\\ BkWM#ҵ\b\\~;;Y\n)2\0\;4>\u:}4\lb\o\㽭w>\ha\\\@خeN\m;yKnwF\ﱂK:9;1\q8O\5\\2ܷ\Ƿ7\\#r\o[<\r\mu$bs\\VJs\Z7/~qͶ~\kKQ\\%i&\\Qd7\ā܇\o\EJֽ\i\v\\\\\\sK\\\k\4\Ȝ\,D~G)\\vʊ610\\;`/\-w\\\ٽ\C\(\I\-jh\ZvQ\ĉQ\0(UA9lp\07\e\#\\s\\QS\/\\7L:\\\ǒd\f\c\\X0,5#2Zn&7\;o\9\\V}\\r\\"ޠ\+\W\\K\Aߜ\\\^\0\"\"\"\"\O=2^\S:\lSM\'\\\c\\Dz߾Xǃ9Ǿ}x\\icoqPn\N쎭\'\\p% \xV ԭeNr\g$v.?\0m\5\@!k\y\\\\i\\\8\0# HLyBY\q2\ai\\0ߟv\7\~Y@\уx$;yF\/\'c\!\h\\\L\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\V\0 RDDDD_\Al(\#ZonZ\Z=\\\\c-ssg\s\L]z\2~q9(# \kc\1ٍ[\lc9SDDDDDDDDDDDDQ`\\e\\]ό\r\p\#|\\0XjB\1fWVx\\\Zܘ֔ 8n2Be2{\\3\X\m\"\"\"\"\"GmC\\\\Zia<\\w.X坲\\!=\c(\\|\01\0\l\"\"\"\"\"\"\"\"\"\"\"\"~\\0\gi\V2\0/<9\\\\\\\E*V[\?\\r#\\ĉ\K\Ӿ\0\hT\v3DDDDZ\\qO.\*\s\6RZCl (\zq`\n>\n\^\dNsƈ\c\\c?PfFh\\\ [(p%\ \\Gtı$30\3?ɇ\_\=8\<,?ڄA\,\r^Q0\?710`xȱ\k\\\*|*fuՕMdx3)w$?g\c1&\Zs\ۂ\\\_\}\DDDDDDDDDDDE\7=F|\\u\re55\\\Cѕ\|ax\\\\3\\=ѡQ\kՍ{+hjk\Ga\d\Za{Z\9\\0;n\g8kqc\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/\',4,1,'','','',''),(14,4,0,'9305bf00c3cedc12','24803714715bf00c3ced9f6942163975','2018-11-17 12:40:28','2018-11-17 12:40:28','','','Profile Photos','person-300.jpg','image/jpeg',80,80,2354,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0\0 \n!#\"AB\\0\0\0?\0\\8\8\8㚑\1V\\7M\PCm;\n\f˲\A\"&\n(\\\z\r+\\*N\1dVq+:}\wN\\z/ \\I̮֩\uJ7\ZIA\y\d2m`\^N|HKFow\nRɭc5mö0\~Sr\\\t<Ŏ8\Mi\-2\Cz*\}\\`C\_\qț\\\'0\g(督v\\pQaYV\[=AXFR\\Y\Zp|6RPoSz\\B9d\\\V؛jl.e6Nڔ\"S\\pσ\U{\r<є\\*F@VԘ:WV`b6]hX\\F\G8a\n\\\hNcsѿ7?\Z*GLn.{^\m}kY(IF\s(\#\#Y+{|2&%hZ\OL~\0\:\vڗ-\\E\;=!\0\DZ\vW\^Q\\"\5y\0\Z\G\لJ ]\٥\CT\\ZiR.!-:eZ_>(qJ\dHqya\0\\T9\\\/ZŹ\潩DO\\"f4D\rR\wDPm5-\\\]P>A\r+\sњK^_\z\A\t\n3V\)\ٚ@.gE0{H\0.`FZP\qi7k\\\=4ąםL\c\\+c\\\\ΩN h\HH\\&\O\r^m\\K1R\\\0z\?W\'m\\r`\ƵD\*\Z.4.\D\)&\Z\"\1yȐ_\2\eǧXv:r\^*d!!ܭ;@\3\=?\'kR\\Fq\u*\\"0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬OcaYr\]C\(%g\F6X͟+\\\a0Qԫ$]#cJ4\HZ&f:\dפ3b\\rs`*\%IZp\nJ%I\2c8\q|\8\?g\qϞ8\~S&S\II(\\rnws\ZQ3q\$L\%r\ZS4\j\0*8}\e92(w\f\r\\\GAW\#\0xؘxxZ2*.86\\d@f[a\\}sm}Bِn\6=\"+o^Vpo9\k;:\84\\*n8j\`d|\һi\.\\v l\rsn\2#җ!E\*2P\gS\!Z^뒠\\*\2p\\v#f\~\\֫\B/j\U)^ĉ,y-`\0$|kkם:4\0\Mj8Pߨ)\\(Y\\0-yVQې&E\0@>,\>\\8\\c\K?\m a\nm3\;sR$\%Զ\*ͭL\\\M\q\ua= \^LrE\}ĚXRra]ޱMd~4\D\e-8\\eᲬ6[§q\t\\\TB:)M\aG`t\+w\0ٍ\XCoKˎp$QK\ vY3\%\K㈲\\\p㌌ᅸ;KVP\\!M*y̫8\u-;99\r\rB}\^xt;^oVZR9\g\',5,1,'','','',''),(15,4,0,'9305bf00c3cedc12','24803714715bf00c3ced9f6942163975','2018-11-17 12:40:28','2018-11-17 12:40:28','','','Profile Photos','person-300.jpg','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\(:+jo6;+\Ya>\U\aZ\\Hbqc1oz\\iق%a\-]\o)s\^\x[-4й\\\;\jT[P\lQ\\--\\v\$\ g3N]c\F|J^f<:Ī\umYȬƼ1[\Z,En֨ESpRƆ\AKp\"K5\c\\k\{\=z\\eV<\}O^ԋʜ9E\\!\rf*9ʱ\'94nT\+NS?Ƈ!j5X\&\<1)d\-\\\u)_\]lQ91Y\¸K!\\`5R_\\\y\P\Ұ \h{G\\1ԏ P\\\ۦ%<\U0]y?gp)vIϬ\\\'\\uY\\"I۔
a\\aYXj[G\ؤ\r\0\B\<\\uoy\j:齟!5\6O\\\D|@+\\c|>ob_j\m\0&\Q\<\E\-AZv\Ɍԏ.y\\M+z\Ga\\J\&\\Q\'۫\|0\&G(\p\<\s0\\zy|r\Sh]\\n\H|j=[P\`vm\PYESGMM\\\$\h\0S9\\J\LJL}XIQC\$kgD̛\:ռJt\\WUu}A\L\JsC\V\mPb@ |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1>CO$yQ2Ka(#q\:\\O\\9\WPKg\\\ν\C(@l\n1|l߷\0=\x\?\Sg\{\KI˵\\=k\a&\\\S(#x\kY&N\\97m\ZY\ڨuE(@8b\{\٭\\\sݜ\v~\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\&\Z\o\\\9A/0\p4\xF|i\\C\\uXm.S4Uq\n\ʟ\rM\%rV\[\\<\o]\ضͮVe\\[\\'\dك\\2<8QF5Ѓ\Z4X1\G_\ss\4OKWv_xڍ3\\~9N\\\B2r\0!t\\D\Eu\+@\0E\0cFF872\\Zہ\e%\\>\ԁq\^cog/\o\+\ɘ\e\dwJwOŷGi{oq5\Ϗc\"rL:\!\ne\B91f\'Ө/O\gdcB{fDM&\\=؆k*e\\~v1\c\\i\\\\)\#[H<|nږVV\i{\}IL\Kf9\#\KrԷ\86P\\1\\XW5\\#ᬙ\0\ـDx\\m#>\7.\eDDDDDDDDDDD\\d \2\`&<)cf2琏vp\1\\\8k\9\1M~C\\\ҵ|բ\\9Ug{\\v05\U,SHx&B|\"\\X\\t\l{\\\\_v\[\;d卮$RH\z\?a!\8\dmfD\<+n&|\2\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]\\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\dJ>\rms1/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\Z\\J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^8R\7$ș>Wn\I#\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\Wp\'\\\\\\"\"\"(\c̞94\m\i\"J\_0\\{\rkA\"\{\\jwƯX*\Z[\m3Ɋ\\\\l\ʋc W^V,g_Z\0c}ƒd\b\x\m&)\<# E.OF\:\0\'܇#v\Bp\\{\\5nq\<8g\\DDDDE/Q/jE\\l\\}~rY[g0@\\G#֊3O\n0\\8\E\\ϞXӕ\;k/*|lÍm{]\\ZuT;\˹x\h2C26dFfwԝ\\dz\|\?\Sk0$\C\y&\KlbX|\0I]f<|U\t]f\6ڹ{V\\\5,ҩ~\ME\\\dW\C\ J,.\\{;=}Iқ\Z\\ry\HJI0YNJAL\\\p/\UZt+](}\|@ȣB\S\:f{\\\Vtٻ$<>ql\09O\\gAz<V\-i\g\\\2K[-g8\G)3P[\6~+{\U\˪Eę;,\pans!\\.\f\8\\a\HkaW\7\P\\\BRX\eM,I\C^\q\+\R3X\+X\hdF)}V\M\q(8\\cDW5\7\c\c\w|㳬\0e\\ZiY밚9[\\ckZs.u\G9\x\\'JaΦ=\v{Mʙd}v\\أ2L\\V.hjHh\|q#\}2 ^\rޞ\\3j:\\\5KG\0S\2&\.\'\hN \mSfǩ(\5\ljb1FƍLx\ƌ \0FA\шCkX\5cp\c\x\\|t{@\\\\xF\x;c\#\\(\\Z9116̋\*}TUc#8*i9w\"\6\1\\b\Kߴk\\\\\{:k\\2bs\Vg8i̊SLr\0rtho\\OcN~n\\ԇv\\i\Wg>E\Z4cQ\r`\#Ub\G:4\9t\"\"\"\1E \0\07\3\ \"n^B\X1s\\rcq;8\3Qw\v\\/;ku6\\\c\gZ\~2noLZ64Y)g\&.#\\\-c\ߩcJ\皭I\ \Z\\Ut\$\o̸x\(,cB\+\Ǫj\i\u%n\u(\"m]t1\q\Ŏ,acw;?\"y{\"\"\"\"\"\"\"\"\"\"\"(J瞵\\"Y\\Ys[\\zs\X\7*\\QHiOiG=n^7{\ɾ8{}\}\dԬG܋\\\7\\"w\?̯\\έfSC6\]Q*s+.َ\'\cKa\)k5\%;-c*.!UsZW\=]XVQ 6\\(\wՌDDZ\Vg\\\gnըu\H.3\\Nk\Zm\\Z\8#_\\7\\D\^lٖS%\\˓>\|͝:i\*dْʗ.Q\ȓ \ys=\1^\{\02\]ӊ>\S2\w\Ճ&ma*qAZKȦMZ\0`Ћ\L\cߚ\"\"\"\"\"\"\"\"\"\"\"\"\0C(&$\"\Z@\aB`BaaF9\ \ܱ\\Z\g\UnpwM{ˣ\'Z\Fr\\T\cck;\\r\L{\\\\n\\b\b\0i&ۘml$+k~N\s\N\r\Pϴ\\ \+Z)3!꼉\\M=t\\'\P͎aͭc\IV\:\\\DE?S\r5\\\&ns=\\t㲽a~9ǴsUF\ϻp\\.\p^\U\G)qv.@\h! fW[\ubx\\"H aAn~7\ñ|\'UWQOQ5Օ\n X\\bah5kq\\=\0]9\{\"\"\"\"\"\"\"\"\"\",h\q\*\\8q\ku]ebr\o\$\nw6s%\@\H\"0\Z>@\g\m\n2zη.vl䭐h[XNՁf\e\Y3v.\X\Z얺+s2T\]t\\\K}\Z\c]\nª%v\ݎ=@\nh4䷱\\5X\G9{`t\I\\'\Ɗs\ܧ\\\\\%r\\jH3ܭFڷ*,\\J\7Q*\<F]\6@\'dcJ(C\ZOXL\1\3\0\>i\g/\\}\h}dF\e}xN\\\K\R>\0r\'X\$bO9Y\\N<`v\\d\[\WH\=dș\\Xg\\o^4!m\7Gދv\}\\\\y\Z(5gضK9q)`̰85ǛcȈ\r|p\\\tO\\ ,ڲ{\oi\6fXL>@l\\;G79v(\\h.uK\[cOkWT\3̫j\J\L\]I:1\s҉\s{\\\$7\o~E[X!84{m\!aJ\\H\B!|Xǻ8no\\h{\0Ñ\P֭H\%4)79ÆPc\\v3\]*\[/(\q\\r\nK\UB $Kca-\#Ǝ\"\sD&q jx\{xΉ\Zjó\pM8;#4\jb\b?G\\Ŵ:\y+\lZ:\k;Ȳ$f;lm\\Ξioc\\&T\ X[8qy)lA!bTh\GW\\"ֹ_\O\~\p\I\\\\Z\-\im\\c1UTVP&J>Zw½y\\\pU \\yR\\\8\2$g\\J\$\˟l{{\Z\"\"\"\"*}Q-l?~\ޱ*[{o}o\\.5f\\2{B\\8;m \ϗ>Ćي\Ɓ_y\W\#\\.\\\\JMP\\hȸy\\E줟8m\\R\5$\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃ\q\n;\\\M^(ѽ\$0eK^m<\U֨\n\:\A\ZkJ\Z٤}~\ȟCCk\\n5$\մ/O_Kŗ\[\AqO\f\8K/\%\\x昙\~\X\\0\\Y\O1\\r.\W\\\\\0\F\\0ya?%5|\a~q\gITV:5D\0+\F]\"\"\"\"\"ž\t{\@\o?j\m},7kuqe)Z)Xp\@[(\H$2b@\ Um\\0˝S`H\x[m\$\\Zxq\\\$\xo\\@YF3+hq\Ӹy_GּDI\]\=6n=٢F\y8\z.g2W\8qWh֏X\1lʶ\\Z\%}9\_\0w5.\zݴ}s[ko3_\\\n\N\\\Z,ʋ&9\QFT\"\"\"\"\"\"\"\".(\Z0\"D`@\0!c\!\!汌k\a\UR\2=\\[gf\lvZ\cF!C\.J\y`_:\:М\$&in\"W\;y\ɧfu>ptC|\nӐ9\n\)ka\[ih\\4-(5p\\\-~ΗWT{ʛz/Ѿ\ם/}ա\\z\l&^ߺ$q\[\\8\eݵM2Iֲ\"[Q3 \\\\\DDDDDDD^a\+Ľ\\Ú\R\?\\\U_j{4K\ZfF %\r\d\Ex\"a(,RJ \0O+\\\\EA\\}_f\\rv\;TH\y/3S\j\\,ӨgÃ!ulK[\X^|\\0nr\ =jS.m\\H\"Xj܉\mRKk,66E,c`3\d 1d?\\Geb\\6#<\(\j\c~\/Q+ \I\\M20\\Sw_O`\8\?$rg\\\o1\"\!u\s-\\Ytⰻi\Z\\:7\Z\\0̬,\ZQqpo^wY\~4\r{F䚢\r\\Dœ#J\.,X3eM|Ղ%\\;3ƃ1aR#06&\ADn2˘AØ\-ss79\qȈ)@w絞W9w\\l\B\m_\q[IQ\'9.˵lQ\rE\ ɝ\'\Z\ (A\Ozfv)d\\^f\J\\k\6>h\\"\\t\\Q6f\iZfq\\~\}r\0vOG\5{&^q\r.:)cD\uv\*mk\\l{\J\Z|x\\ݩظ\O\,\mGH\Z.N\\Ipc\W\` G\*6ڑ\2\\ BkWM#ҵ\b\\~;;Y\n)2\0\;4>\u:}4\lb\o\㽭w>\ha\\\@خeN\m;yKnwF\ﱂK:9;1\q8O\5\\2ܷ\Ƿ7\\#r\o[<\r\mu$bs\\VJs\Z7/~qͶ~\kKQ\\%i&\\Qd7\ā܇\o\EJֽ\i\v\\\\\\sK\\\k\4\Ȝ\,D~G)\\vʊ610\\;`/\-w\\\ٽ\C\(\I\-jh\ZvQ\ĉQ\0(UA9lp\07\e\#\\s\\QS\/\\7L:\\\ǒd\f\c\\X0,5#2Zn&7\;o\9\\V}\\r\\"ޠ\+\W\\K\Aߜ\\\^\0\"\"\"\"\O=2^\S:\lSM\'\\\c\\Dz߾Xǃ9Ǿ}x\\icoqPn\N쎭\'\\p% \xV ԭeNr\g$v.?\0m\5\@!k\y\\\\i\\\8\0# HLyBY\q2\ai\\0ߟv\7\~Y@\уx$;yF\/\'c\!\h\\\L\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\V\0 RDDDD_\Al(\#ZonZ\Z=\\\\c-ssg\s\L]z\2~q9(# \kc\1ٍ[\lc9SDDDDDDDDDDDDQ`\\e\\]ό\r\p\#|\\0XjB\1fWVx\\\Zܘ֔ 8n2Be2{\\3\X\m\"\"\"\"\"GmC\\\\Zia<\\w.X坲\\!=\c(\\|\01\0\l\"\"\"\"\"\"\"\"\"\"\"\"~\\0\gi\V2\0/<9\\\\\\\E*V[\?\\r#\\ĉ\K\Ӿ\0\hT\v3DDDDZ\\qO.\*\s\6RZCl (\zq`\n>\n\^\dNsƈ\c\\c?PfFh\\\ [(p%\ \\Gtı$30\3?ɇ\_\=8\<,?ڄA\,\r^Q0\?710`xȱ\k\\\*|*fuՕMdx3)w$?g\c1&\Zs\ۂ\\\_\}\DDDDDDDDDDDE\7=F|\\u\re55\\\Cѕ\|ax\\\\3\\=ѡQ\kՍ{+hjk\Ga\d\Za{Z\9\\0;n\g8kqc\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/\',4,1,'','','',''),(17,5,0,'9305bf00c9709025','12966450605bf00c9708ea1748285071','2018-11-17 12:41:59','2018-11-17 12:41:59','','','Profile Photos','person-300.jpg','image/jpeg',80,80,2354,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0\0 \n!#\"AB\\0\0\0?\0\\8\8\8㚑\1V\\7M\PCm;\n\f˲\A\"&\n(\\\z\r+\\*N\1dVq+:}\wN\\z/ \\I̮֩\uJ7\ZIA\y\d2m`\^N|HKFow\nRɭc5mö0\~Sr\\\t<Ŏ8\Mi\-2\Cz*\}\\`C\_\qț\\\'0\g(督v\\pQaYV\[=AXFR\\Y\Zp|6RPoSz\\B9d\\\V؛jl.e6Nڔ\"S\\pσ\U{\r<є\\*F@VԘ:WV`b6]hX\\F\G8a\n\\\hNcsѿ7?\Z*GLn.{^\m}kY(IF\s(\#\#Y+{|2&%hZ\OL~\0\:\vڗ-\\E\;=!\0\DZ\vW\^Q\\"\5y\0\Z\G\لJ ]\٥\CT\\ZiR.!-:eZ_>(qJ\dHqya\0\\T9\\\/ZŹ\潩DO\\"f4D\rR\wDPm5-\\\]P>A\r+\sњK^_\z\A\t\n3V\)\ٚ@.gE0{H\0.`FZP\qi7k\\\=4ąםL\c\\+c\\\\ΩN h\HH\\&\O\r^m\\K1R\\\0z\?W\'m\\r`\ƵD\*\Z.4.\D\)&\Z\"\1yȐ_\2\eǧXv:r\^*d!!ܭ;@\3\=?\'kR\\Fq\u*\\"0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬OcaYr\]C\(%g\F6X͟+\\\a0Qԫ$]#cJ4\HZ&f:\dפ3b\\rs`*\%IZp\nJ%I\2c8\q|\8\?g\qϞ8\~S&S\II(\\rnws\ZQ3q\$L\%r\ZS4\j\0*8}\e92(w\f\r\\\GAW\#\0xؘxxZ2*.86\\d@f[a\\}sm}Bِn\6=\"+o^Vpo9\k;:\84\\*n8j\`d|\һi\.\\v l\rsn\2#җ!E\*2P\gS\!Z^뒠\\*\2p\\v#f\~\\֫\B/j\U)^ĉ,y-`\0$|kkם:4\0\Mj8Pߨ)\\(Y\\0-yVQې&E\0@>,\>\\8\\c\K?\m a\nm3\;sR$\%Զ\*ͭL\\\M\q\ua= \^LrE\}ĚXRra]ޱMd~4\D\e-8\\eᲬ6[§q\t\\\TB:)M\aG`t\+w\0ٍ\XCoKˎp$QK\ vY3\%\K㈲\\\p㌌ᅸ;KVP\\!M*y̫8\u-;99\r\rB}\^xt;^oVZR9\g\',5,1,'','','',''),(18,5,0,'9305bf00c9709025','12966450605bf00c9708ea1748285071','2018-11-17 12:41:59','2018-11-17 12:41:59','','','Profile Photos','person-300.jpg','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\(:+jo6;+\Ya>\U\aZ\\Hbqc1oz\\iق%a\-]\o)s\^\x[-4й\\\;\jT[P\lQ\\--\\v\$\ g3N]c\F|J^f<:Ī\umYȬƼ1[\Z,En֨ESpRƆ\AKp\"K5\c\\k\{\=z\\eV<\}O^ԋʜ9E\\!\rf*9ʱ\'94nT\+NS?Ƈ!j5X\&\<1)d\-\\\u)_\]lQ91Y\¸K!\\`5R_\\\y\P\Ұ \h{G\\1ԏ P\\\ۦ%<\U0]y?gp)vIϬ\\\'\\uY\\"I۔
a\\aYXj[G\ؤ\r\0\B\<\\uoy\j:齟!5\6O\\\D|@+\\c|>ob_j\m\0&\Q\<\E\-AZv\Ɍԏ.y\\M+z\Ga\\J\&\\Q\'۫\|0\&G(\p\<\s0\\zy|r\Sh]\\n\H|j=[P\`vm\PYESGMM\\\$\h\0S9\\J\LJL}XIQC\$kgD̛\:ռJt\\WUu}A\L\JsC\V\mPb@ |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1>CO$yQ2Ka(#q\:\\O\\9\WPKg\\\ν\C(@l\n1|l߷\0=\x\?\Sg\{\KI˵\\=k\a&\\\S(#x\kY&N\\97m\ZY\ڨuE(@8b\{\٭\\\sݜ\v~\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\&\Z\o\\\9A/0\p4\xF|i\\C\\uXm.S4Uq\n\ʟ\rM\%rV\[\\<\o]\ضͮVe\\[\\'\dك\\2<8QF5Ѓ\Z4X1\G_\ss\4OKWv_xڍ3\\~9N\\\B2r\0!t\\D\Eu\+@\0E\0cFF872\\Zہ\e%\\>\ԁq\^cog/\o\+\ɘ\e\dwJwOŷGi{oq5\Ϗc\"rL:\!\ne\B91f\'Ө/O\gdcB{fDM&\\=؆k*e\\~v1\c\\i\\\\)\#[H<|nږVV\i{\}IL\Kf9\#\KrԷ\86P\\1\\XW5\\#ᬙ\0\ـDx\\m#>\7.\eDDDDDDDDDDD\\d \2\`&<)cf2琏vp\1\\\8k\9\1M~C\\\ҵ|բ\\9Ug{\\v05\U,SHx&B|\"\\X\\t\l{\\\\_v\[\;d卮$RH\z\?a!\8\dmfD\<+n&|\2\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]\\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\dJ>\rms1/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\Z\\J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^8R\7$ș>Wn\I#\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\Wp\'\\\\\\"\"\"(\c̞94\m\i\"J\_0\\{\rkA\"\{\\jwƯX*\Z[\m3Ɋ\\\\l\ʋc W^V,g_Z\0c}ƒd\b\x\m&)\<# E.OF\:\0\'܇#v\Bp\\{\\5nq\<8g\\DDDDE/Q/jE\\l\\}~rY[g0@\\G#֊3O\n0\\8\E\\ϞXӕ\;k/*|lÍm{]\\ZuT;\˹x\h2C26dFfwԝ\\dz\|\?\Sk0$\C\y&\KlbX|\0I]f<|U\t]f\6ڹ{V\\\5,ҩ~\ME\\\dW\C\ J,.\\{;=}Iқ\Z\\ry\HJI0YNJAL\\\p/\UZt+](}\|@ȣB\S\:f{\\\Vtٻ$<>ql\09O\\gAz<V\-i\g\\\2K[-g8\G)3P[\6~+{\U\˪Eę;,\pans!\\.\f\8\\a\HkaW\7\P\\\BRX\eM,I\C^\q\+\R3X\+X\hdF)}V\M\q(8\\cDW5\7\c\c\w|㳬\0e\\ZiY밚9[\\ckZs.u\G9\x\\'JaΦ=\v{Mʙd}v\\أ2L\\V.hjHh\|q#\}2 ^\rޞ\\3j:\\\5KG\0S\2&\.\'\hN \mSfǩ(\5\ljb1FƍLx\ƌ \0FA\шCkX\5cp\c\x\\|t{@\\\\xF\x;c\#\\(\\Z9116̋\*}TUc#8*i9w\"\6\1\\b\Kߴk\\\\\{:k\\2bs\Vg8i̊SLr\0rtho\\OcN~n\\ԇv\\i\Wg>E\Z4cQ\r`\#Ub\G:4\9t\"\"\"\1E \0\07\3\ \"n^B\X1s\\rcq;8\3Qw\v\\/;ku6\\\c\gZ\~2noLZ64Y)g\&.#\\\-c\ߩcJ\皭I\ \Z\\Ut\$\o̸x\(,cB\+\Ǫj\i\u%n\u(\"m]t1\q\Ŏ,acw;?\"y{\"\"\"\"\"\"\"\"\"\"\"(J瞵\\"Y\\Ys[\\zs\X\7*\\QHiOiG=n^7{\ɾ8{}\}\dԬG܋\\\7\\"w\?̯\\έfSC6\]Q*s+.َ\'\cKa\)k5\%;-c*.!UsZW\=]XVQ 6\\(\wՌDDZ\Vg\\\gnըu\H.3\\Nk\Zm\\Z\8#_\\7\\D\^lٖS%\\˓>\|͝:i\*dْʗ.Q\ȓ \ys=\1^\{\02\]ӊ>\S2\w\Ճ&ma*qAZKȦMZ\0`Ћ\L\cߚ\"\"\"\"\"\"\"\"\"\"\"\"\0C(&$\"\Z@\aB`BaaF9\ \ܱ\\Z\g\UnpwM{ˣ\'Z\Fr\\T\cck;\\r\L{\\\\n\\b\b\0i&ۘml$+k~N\s\N\r\Pϴ\\ \+Z)3!꼉\\M=t\\'\P͎aͭc\IV\:\\\DE?S\r5\\\&ns=\\t㲽a~9ǴsUF\ϻp\\.\p^\U\G)qv.@\h! fW[\ubx\\"H aAn~7\ñ|\'UWQOQ5Օ\n X\\bah5kq\\=\0]9\{\"\"\"\"\"\"\"\"\"\",h\q\*\\8q\ku]ebr\o\$\nw6s%\@\H\"0\Z>@\g\m\n2zη.vl䭐h[XNՁf\e\Y3v.\X\Z얺+s2T\]t\\\K}\Z\c]\nª%v\ݎ=@\nh4䷱\\5X\G9{`t\I\\'\Ɗs\ܧ\\\\\%r\\jH3ܭFڷ*,\\J\7Q*\<F]\6@\'dcJ(C\ZOXL\1\3\0\>i\g/\\}\h}dF\e}xN\\\K\R>\0r\'X\$bO9Y\\N<`v\\d\[\WH\=dș\\Xg\\o^4!m\7Gދv\}\\\\y\Z(5gضK9q)`̰85ǛcȈ\r|p\\\tO\\ ,ڲ{\oi\6fXL>@l\\;G79v(\\h.uK\[cOkWT\3̫j\J\L\]I:1\s҉\s{\\\$7\o~E[X!84{m\!aJ\\H\B!|Xǻ8no\\h{\0Ñ\P֭H\%4)79ÆPc\\v3\]*\[/(\q\\r\nK\UB $Kca-\#Ǝ\"\sD&q jx\{xΉ\Zjó\pM8;#4\jb\b?G\\Ŵ:\y+\lZ:\k;Ȳ$f;lm\\Ξioc\\&T\ X[8qy)lA!bTh\GW\\"ֹ_\O\~\p\I\\\\Z\-\im\\c1UTVP&J>Zw½y\\\pU \\yR\\\8\2$g\\J\$\˟l{{\Z\"\"\"\"*}Q-l?~\ޱ*[{o}o\\.5f\\2{B\\8;m \ϗ>Ćي\Ɓ_y\W\#\\.\\\\JMP\\hȸy\\E줟8m\\R\5$\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃ\q\n;\\\M^(ѽ\$0eK^m<\U֨\n\:\A\ZkJ\Z٤}~\ȟCCk\\n5$\մ/O_Kŗ\[\AqO\f\8K/\%\\x昙\~\X\\0\\Y\O1\\r.\W\\\\\0\F\\0ya?%5|\a~q\gITV:5D\0+\F]\"\"\"\"\"ž\t{\@\o?j\m},7kuqe)Z)Xp\@[(\H$2b@\ Um\\0˝S`H\x[m\$\\Zxq\\\$\xo\\@YF3+hq\Ӹy_GּDI\]\=6n=٢F\y8\z.g2W\8qWh֏X\1lʶ\\Z\%}9\_\0w5.\zݴ}s[ko3_\\\n\N\\\Z,ʋ&9\QFT\"\"\"\"\"\"\"\".(\Z0\"D`@\0!c\!\!汌k\a\UR\2=\\[gf\lvZ\cF!C\.J\y`_:\:М\$&in\"W\;y\ɧfu>ptC|\nӐ9\n\)ka\[ih\\4-(5p\\\-~ΗWT{ʛz/Ѿ\ם/}ա\\z\l&^ߺ$q\[\\8\eݵM2Iֲ\"[Q3 \\\\\DDDDDDD^a\+Ľ\\Ú\R\?\\\U_j{4K\ZfF %\r\d\Ex\"a(,RJ \0O+\\\\EA\\}_f\\rv\;TH\y/3S\j\\,ӨgÃ!ulK[\X^|\\0nr\ =jS.m\\H\"Xj܉\mRKk,66E,c`3\d 1d?\\Geb\\6#<\(\j\c~\/Q+ \I\\M20\\Sw_O`\8\?$rg\\\o1\"\!u\s-\\Ytⰻi\Z\\:7\Z\\0̬,\ZQqpo^wY\~4\r{F䚢\r\\Dœ#J\.,X3eM|Ղ%\\;3ƃ1aR#06&\ADn2˘AØ\-ss79\qȈ)@w絞W9w\\l\B\m_\q[IQ\'9.˵lQ\rE\ ɝ\'\Z\ (A\Ozfv)d\\^f\J\\k\6>h\\"\\t\\Q6f\iZfq\\~\}r\0vOG\5{&^q\r.:)cD\uv\*mk\\l{\J\Z|x\\ݩظ\O\,\mGH\Z.N\\Ipc\W\` G\*6ڑ\2\\ BkWM#ҵ\b\\~;;Y\n)2\0\;4>\u:}4\lb\o\㽭w>\ha\\\@خeN\m;yKnwF\ﱂK:9;1\q8O\5\\2ܷ\Ƿ7\\#r\o[<\r\mu$bs\\VJs\Z7/~qͶ~\kKQ\\%i&\\Qd7\ā܇\o\EJֽ\i\v\\\\\\sK\\\k\4\Ȝ\,D~G)\\vʊ610\\;`/\-w\\\ٽ\C\(\I\-jh\ZvQ\ĉQ\0(UA9lp\07\e\#\\s\\QS\/\\7L:\\\ǒd\f\c\\X0,5#2Zn&7\;o\9\\V}\\r\\"ޠ\+\W\\K\Aߜ\\\^\0\"\"\"\"\O=2^\S:\lSM\'\\\c\\Dz߾Xǃ9Ǿ}x\\icoqPn\N쎭\'\\p% \xV ԭeNr\g$v.?\0m\5\@!k\y\\\\i\\\8\0# HLyBY\q2\ai\\0ߟv\7\~Y@\уx$;yF\/\'c\!\h\\\L\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\V\0 RDDDD_\Al(\#ZonZ\Z=\\\\c-ssg\s\L]z\2~q9(# \kc\1ٍ[\lc9SDDDDDDDDDDDDQ`\\e\\]ό\r\p\#|\\0XjB\1fWVx\\\Zܘ֔ 8n2Be2{\\3\X\m\"\"\"\"\"GmC\\\\Zia<\\w.X坲\\!=\c(\\|\01\0\l\"\"\"\"\"\"\"\"\"\"\"\"~\\0\gi\V2\0/<9\\\\\\\E*V[\?\\r#\\ĉ\K\Ӿ\0\hT\v3DDDDZ\\qO.\*\s\6RZCl (\zq`\n>\n\^\dNsƈ\c\\c?PfFh\\\ [(p%\ \\Gtı$30\3?ɇ\_\=8\<,?ڄA\,\r^Q0\?710`xȱ\k\\\*|*fuՕMdx3)w$?g\c1&\Zs\ۂ\\\_\}\DDDDDDDDDDDE\7=F|\\u\re55\\\Cѕ\|ax\\\\3\\=ѡQ\kՍ{+hjk\Ga\d\Za{Z\9\\0;n\g8kqc\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/\',4,1,'','','',''),(20,6,0,'9305bf00cb1412b6','19504305895bf00cb14111f611783866','2018-11-17 12:42:25','2018-11-17 12:42:25','','','Profile Photos','person-300.jpg','image/jpeg',80,80,2354,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0\0 \n!#\"AB\\0\0\0?\0\\8\8\8㚑\1V\\7M\PCm;\n\f˲\A\"&\n(\\\z\r+\\*N\1dVq+:}\wN\\z/ \\I̮֩\uJ7\ZIA\y\d2m`\^N|HKFow\nRɭc5mö0\~Sr\\\t<Ŏ8\Mi\-2\Cz*\}\\`C\_\qț\\\'0\g(督v\\pQaYV\[=AXFR\\Y\Zp|6RPoSz\\B9d\\\V؛jl.e6Nڔ\"S\\pσ\U{\r<є\\*F@VԘ:WV`b6]hX\\F\G8a\n\\\hNcsѿ7?\Z*GLn.{^\m}kY(IF\s(\#\#Y+{|2&%hZ\OL~\0\:\vڗ-\\E\;=!\0\DZ\vW\^Q\\"\5y\0\Z\G\لJ ]\٥\CT\\ZiR.!-:eZ_>(qJ\dHqya\0\\T9\\\/ZŹ\潩DO\\"f4D\rR\wDPm5-\\\]P>A\r+\sњK^_\z\A\t\n3V\)\ٚ@.gE0{H\0.`FZP\qi7k\\\=4ąםL\c\\+c\\\\ΩN h\HH\\&\O\r^m\\K1R\\\0z\?W\'m\\r`\ƵD\*\Z.4.\D\)&\Z\"\1yȐ_\2\eǧXv:r\^*d!!ܭ;@\3\=?\'kR\\Fq\u*\\"0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬OcaYr\]C\(%g\F6X͟+\\\a0Qԫ$]#cJ4\HZ&f:\dפ3b\\rs`*\%IZp\nJ%I\2c8\q|\8\?g\qϞ8\~S&S\II(\\rnws\ZQ3q\$L\%r\ZS4\j\0*8}\e92(w\f\r\\\GAW\#\0xؘxxZ2*.86\\d@f[a\\}sm}Bِn\6=\"+o^Vpo9\k;:\84\\*n8j\`d|\һi\.\\v l\rsn\2#җ!E\*2P\gS\!Z^뒠\\*\2p\\v#f\~\\֫\B/j\U)^ĉ,y-`\0$|kkם:4\0\Mj8Pߨ)\\(Y\\0-yVQې&E\0@>,\>\\8\\c\K?\m a\nm3\;sR$\%Զ\*ͭL\\\M\q\ua= \^LrE\}ĚXRra]ޱMd~4\D\e-8\\eᲬ6[§q\t\\\TB:)M\aG`t\+w\0ٍ\XCoKˎp$QK\ vY3\%\K㈲\\\p㌌ᅸ;KVP\\!M*y̫8\u-;99\r\rB}\^xt;^oVZR9\g\',5,1,'','','',''),(21,6,0,'9305bf00cb1412b6','19504305895bf00cb14111f611783866','2018-11-17 12:42:25','2018-11-17 12:42:25','','','Profile Photos','person-300.jpg','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\(:+jo6;+\Ya>\U\aZ\\Hbqc1oz\\iق%a\-]\o)s\^\x[-4й\\\;\jT[P\lQ\\--\\v\$\ g3N]c\F|J^f<:Ī\umYȬƼ1[\Z,En֨ESpRƆ\AKp\"K5\c\\k\{\=z\\eV<\}O^ԋʜ9E\\!\rf*9ʱ\'94nT\+NS?Ƈ!j5X\&\<1)d\-\\\u)_\]lQ91Y\¸K!\\`5R_\\\y\P\Ұ \h{G\\1ԏ P\\\ۦ%<\U0]y?gp)vIϬ\\\'\\uY\\"I۔
a\\aYXj[G\ؤ\r\0\B\<\\uoy\j:齟!5\6O\\\D|@e{R\A b;\'NYen\eEŖc\\N\m|˪䝀\l\QZo[ &U\t(J,\\,\>1l\Dp\\0\+6v\\0\/\\l\\|\Zf\>9lb\\ΓUYÍL9ƅ-f6h#\At6=:\m|\\$\0\-}w\6A\9\ \+P\\\0o\+\{6_n{Ѷmo6-i\\\3lgIy&T\)H\9϶=c\?\\\0{\\8\0\O\\\\0M\-\'.\g=\0e`\7\/r\L\-dm:G\Dx\\\r\'\\rj\\Z:*mb_\jRQ\E\ZʚȢ@\\0E0Bykqv\\g.s\\Ɇ\[\3PK\;\\\\=).&\\Zy]VKl/\\\Br\\F\^\38\Bp:6,ا\Z.> \\\\lm\\}mb%|93̸̎IC\n\\\7Uo`\6&\p\s\NIA\ρ^3G1&,\u\,\h_/lȉq\Xg?\e^,\\?\\=|\0~\w:s|\j;>\\᭖\+&/h۶U\?\Z^.IL\Kf9\!KrԷ\86P\\\\X75\\#ᬙ\0\فDx\\m#>ln].ʈ\Ad1Ly\nR?\\e\!\\c\vp\7\sc9Uz\w\\0k#,\'E\|s\Z\3h.:%/!n\E,k9\~X`6LD\\"\/ۇ\Y>mh퓖6_ :\|\,s[呵\1\0$𬮣ٺUpۤ\\r[\8\uCM֪%}=,ǣ\"}\_\0D\=\?\L\&Ⱥ\v\O\3G\\\Ɨ\c8G<`pH\nM\=͵mh\rwyխі\0\\rśb\J{jbs͑\\\VV\\kr\\^\j謧S^Q\WqMqW(l\k\'k\A\0ʉ(% C(\\|ձރy]\Ͳ\ZyQu{\rv96+\\H)cYj־YfD\\\\'H)3\lWZ#\·\\hƩn&\֧S es\(b\a\\\#$\Zinp)\g3\2Th;\DDDDDDDDDDE,\\^\:Xbʰ\x\֧U2fkY\5\\a{o\n$S4Dzi{DߐI$rʓ:tgMis&K1$ʗ*Iid\3c\9\{\R=\{\g9tV|?~?-\;Uρ\tS\ȉ|\'ɐ\8I2bL\ʸ\AopI*\hĿ\(}O\\D\u7M~r\\\0qqwg8/`G!j\\cr5(\n\[7!ɘ \B\%Uȝm\"\"\"\"\"\"\"\"\"(\\wx\\\ ߲7a9\_n>81x\\QJ˜߳\"dq^1q&kez\\0\\\\\\'\0ffo1\\\;1\ \\Sj1\`n\ZL\-;8kώse^Cp\\*~$\;(\UW\t0iB\Q\y \km\\[DDD\\Ɲ\ZD).\Z,9F7\\0x \V8eǷ-\qG9\\Ȧ\Nm4\\\\0\\5\r\O,;\67b\\0\j`A٫*cf5Sc곈;ȝ@\.Lgn4h\'e3+\[\]\\[ݣS\\(FLfQ%}a\\\DDDDDDDDDE[\\qCu,1~y#v,圌f\5o\ٯ^a\~r\\[\_]\)Z8R\\0\\,\Yt\<#^äS\\N\-kʖ>$r\"[C\\\2x\\yY*|\O\6!q\\Oq\W2n)`ioU\\&(EK#\;%W*-\\]xq\nU\sΥBM\%:OCl\nAn!e\ \\kv\\"\"\"\"\"\"\"\"\"\"/^ :\0\=y5\\\韥RYE\F\el5\\\.ۆWBZ~mnl\0*[\Ə5\V9*S\m\Z\\|r܍ѩ->\\湡kX\R^xj\Z{)aq۽ws.Q\\0\Ȝ?2\\ b;\e\\6nD\N5=Bַ;)\v\"mv\lېLp\\j,6\(aQiIyj\"\"\"\"\"\"\"\"\"\"G+r\'d:\<}ֹ;\\4 \3\ \\l1N\U)rz46\>\=I\\_y\0\7k.\'9\~xq<\[\\\s|DDDDZB\^{PI\\q)\\%oVpjka\nlr9h4 ݜӈKޔ^\\\勍9^Jꦿ\k\\8\ޑU\Y}[\'S(D9s#fDaKia\I\^vGW̓\;V#M;גm\\+@\EG\\vc\g\9h\\u]Eڶm#mGiΫR\ȳ*ad\]U\\`fE}91\r\쌏gה=)լט~$\dAo\6\\\Z\r#xb\Ԥ\\͑(\r}^\\\wB\\\؎G\,4=;k\Ȉ\gM@q*\JG\0}}譓\^OZm?c;WW n,\\\Y\\d6\\L,ìj魝\vr\*\"\"\"\"\"\"\"\"\"\"*U=g\e\:\3ÝD(\N\Q3\Tc\ClX(v\Z\ϑoq&N\9lh\\0۫\\~G9\\8{x\%Ǣ>#\\U\mM\\DGT!9\5PT4@0Ki1\WqG#\\\\y\5Iҵ\DYB\m4\\a7\f4EsZ\b\s湘DDE\\_\\>\0\~w\}Zfk\&Vǽm\\־D\\˝ifx\w<:\\|\ңs\\m#\\rYk坲m(\L6U˾=Z\Z,b-p/<ɹd\\O@3}2 ^\rޞ\\3j:\\\5KG\0\ک\W`FIJ\^C4\')c\\}\\\Ď@\#Q\F&N:=\\\ j\r#o<\\}g\\p\\n\^ZfE>D_4\;\o_fm\\5\\sk\\\=5\qr1Nƹ\+34\fE)\OPN&L9\09:JC\7\j\\'?Mwm|\f\C\[N;ll\+\\\"\Z)\rh\*\1k#X\X\Zuq\"ȐQ\0\s\B7/!JG\\ƹ\{݆˝cʨԃ\7l\Ï5ˉѺ\\\rb\n1\\Çy\\-N\]\|F7aEM$\l*h$R\\rL\\Guo\\\\^\\q\3SN\W8(\\5Z>[5/\x\\Ic<ߙp(-s_PXƄ+VT\5[Ӵ\J\oW\\TQQTF:\\c\ŋX\X\7\v}\R9\+\R=\\+\oz\oyh\Vux\\o&\\MRz\r/;\H\r\T \02:-LRMX\\ruD̮\\f8\\\}\->\\\\\lr\\\\?͎2ȨVmU\i_vQaYD&0\p\V2k\\\=Xu\syUVP> ϳ:j8k\\0߯9oޑyfYLcc.L O6t\,fJ+\*\\G{\\"L\9\\{\G\\s\\_MwN(⟁LʷA\;VrӮ\'jẋ&i4ӨfdC6:\6\a&S\~[x\K\'QL4חX\n\U\\óQ\ێ\\\\U\ZTsg>\\§\z\Wmƚ\\RNعM\"%]o\\͊3\0\"4Qx\\c\qU]G\\==D \VV\:\(0@&\0QcG1f0\e\c\g\\=\4vO\_\kG8\5\.ײ\9d7\0;9\\n\F Ev$J\r~ Xt`{3\6\7J=g[;6rV\4-\'\k2\,Qh^|\,\rvK]\H[wwgfоj1aUֻ_\\\W4\Zr[\\\\uzyrr>f\X\Oō獹N߮J\]f\6g[.IoTY1nqeUy8lO$\ƔP4<\cg\0?\"|\\\^saA\\ȍ\8es+]̗\\rf}~l\N\Hğ8r3Ĝx\c$8\e男|\re1\\\"\"\_\"#]\\\0B~Ga\=|\-6n\\jvM0Y&E$fc\\\\]:\ZRV\\\\\Z\ŕL\`s*\i暺ҺS1aaMx\f\4~1\\6\M\>4\\ߑV꼁\h\g\r\[g-XR,R;G\1\\\x\%^0\@\5hR\8GcM\nds\r\p\&c\\g8s]\]*\[/(\q\\r\nK\UB $˝ca-\#Ǝ\"\sD&qc jx\{xΉ\Zjg*\NaqYw\\GLi\n;\&\\\~ghu\\W\شu\r\\v?dH\v\\Kٶ<\\\\\M\rF@p\)5JR&BĨ\\:/^1\Er\\\ȓQ\\5\[\\\m\\$\cIlL_oY#-S;\^pO[\{Lu\<ԩujGoU3\\%v_Jy\\{e\϶3cDDDDETO;ŵGm\\<\%D\omﭶ\0eƬ\yfOu\Z\gGpCm\\'ؐ\1Z8\+\1}V\d{\Eܟ[I\]SO>\к\\-[*\\氡$\<\VQ\e#DDDDDDDDD^3\q\'W8y\^qܪ^4\\9\\\6<U\\\n\0@\y%\`\R6s\\\*\kTv7|q\R\\~ 5\\0k\_r\'\\\\\\"f*95m!\\\W\V\\\S\i4NR\\st\9&q@#\d?ntS\{K\\ym08z:C>,\0\5\\\FO\l7B\;L\2~\F2|Hձ Ë4DDDDDXܮpz\m\\Z͡\%\-un,E>\E+4vAe\\Cƒ1DPHq@\\\\'y:$\a%I\4d\Y\\\d]6@Q\ G,T\8\\i\L\^\"|.\\s 7\\#j<\\CH\w3+\O8ݴkGɬuV\SXW6e[mi\>/;\`z\U\\>\9\؇\-\7?\uhT\\WIa\˅>4Y!Ls2JDDDDDDDD\\2$(\r*Q\Z4aD0\0\C\#1CkB=\c\9\\q}Ke.\;p\\i=|\\\FCD\\\I/5\Eu\r)u92HMv\\EgM\8\V\ \\r\:]Lq\\a\[c.\]c>\]FS\\=\m\\\-\P%M\jmGBG\n\+!GS}JRit2>\\QQkkYCCYawywa\n+[{[)\"]YY]F>\|\,(QBY2@\0W\\\_\\v>\[S/\\\{睪$_rG<̙\5sdL\\i\3\%\,/MEW>d7|\9k{)6v\ZUy,5nD\\)Q\\\"1R\\\xۘytowϑ\cG\fN\\p\rӱ[?\ryƗk\Į&}ER\S\\]T\Oa)˯˰vg3wk\F\:,qX]\@KlpYO\TEikfVW\\Vt\-z۸7Z\_?]\ZrMQeZ\\V\\\ɑm,\nڙ\O>j\u\A)Q\ \"7Fe\ \\a\{sÛ\8\\DDDDDU;s\\+6cut8ѭΨeڶ(\\cQcml\'2gJƹA<\ad\0\`Sޙ\\ZY2xҸ-2\1]&,3\L\V.j9\"8|\7DDDDDDDDDDE=\\\\pF\\\^ɇ\dfˢ쎌X\6Fݸlʛh&ZE8,\6}\+^2y\wjv.\0\څp(~ E\\|i.{(X&\}\Y&DZ\\Hyع\\n\\mBLο\//\Nl\/`#\\kkdϻ\*v6+SDDDDE\<N\^RۣѤju쀒\ej=f\\Fke\4v3-\q\}\-\a\\r\0x佺H\ml\\\0Cp/a\n\\Ic=n!ƿ\r\ߜ|m;\RTp\ZI6\\E\\r O\O_p\\MV#GH\$P\LCHUi;\G\o\_CM:]e\'pf\h\d\z\d\dԍcѨ\mUG\@g.\'=U\nqW%oYyI\=,z_+p VlC\r\\ꍧPadR\\0նLY$Rl\r\\cO9\5w7CAK\߳ԭvsjf(:x8%4xsY@\ #c\,h\adg.[\"\"\"\"-n\9O\V\k-S|e_&\0\C5p\ss\\&sw\(9C%2C\r\')q!\x6ݲ͌L1d\\e\]woyд\>:\u=Z\ku1\"F@\nDB[?\\\?q}켤{\\{j\"\"\"\"\"\"\"\"\"\"\"*t=E<釕\\\\Od\\n\rGT\\\[]֘^옌ۡlr\\%aÂk^\d\\\m\\8\\\n[$[\\Z~Ec|Jb~a|H09\k\\\\DDDDZ\\|Jw\]i\\>,|Uq4njve4$?[p|9c\2\0wtcGt[.bŗ\0_lf\\=k(8\ԑc\aڮDDDDDDDDDDDDU\\Z\\JJ\0\9#yC^\n0!6M:ٴ\kJv$j\V&yn$\\'A\J78EJѿ\ⷉlϷ\,c\\>\<~\\\"\"\"\"\\\jݺ\ZO\!\.J\&AZ\<\\H\]|~\M\0\n\'\0dM\\s\28b+3\C-!2\\k$DDDDDDDDDDDDPM\5\\\\?Oy+58n~u}F\\c&b|Ɍ\\0Y\1\\\F\w\Zc\ڻ#α14d5m.H\#[\0\\hcXvƵ\DDDD^[\Qq;9\gW9\0,bFn\߿0\0|{c\\\\id\\p\dmv\<ú9\H\k.\\n;5\/\k\b\\DDDDDDDDDDDE [n\ޗ\}~\]\\0/^/>\\p\o}\0\\\H~!iФ`\s\Y\q2\a\\\0ߟv\7\~Y@\уx$;yE\/\'c\!\h\\\̗\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\l+\0\0}nT\ \aE\n\"\(ּdۖdcnr\5\\\\\\\q\A7\A̟lG\*G\\o\Z\\\?#qc\\҉϶1\0|)ڢ\"\"\"\"\"\"\"\"\"\"\"(\xJ\i2\g\\s\r\p\#|\0H\}\0\\\Vsx7\rWo\,\\\Z#c\Z҄R\\r\HL\g\\\1ò\7\k\\[C\\i\0x+XG$1]˖9kl3Owe,e\Z@\π\"\rDDDDDDDDDDDDQ\O\\\L\ϱ6;I\dk\r\@_a\C(h\O|W\Z;6%!G\8\L<\\1\\Xx\d|i\\\"q`j\y1ǶEnk^\7P\T\44sk#Ll!>\0ӟ\7\\\^\\w\\oΡv\2801\Z\f}7c\>\r4r^k\[CS]M^\;# \\{\\5\\0<9\kp\c9\q\>\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\',4,0,'','','',''),(23,0,9,'9305bf00e7f8a224','53312796025bf00e7f82e82896954942','2018-11-17 13:50:05','2018-11-17 13:50:05','','','Contact Photos','15820583805bf00e7fd7909940374120-4.jpg?ts=1542459007','image/jpeg',80,80,2356,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0*\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\kڐH\$Ͳ&a\DK.P\\\Vn\\r\\k\0Vq\\m%I^SD\\\#;q4)\\p\\\S\\hկJ\-&\Mzg\2TV:x\lbXc\!aǍѯ\B28G6X\\\E\z\㟥:b6H\g\Y^ǘ[^*\`)Y\ҹ*aPL\\#N?rzq\\}Ie\i\!}YyQ\i֗!\\B\+Nrc8\q\\{ս\A{>^v}vDXz\$N\\Ă\s\\Z\I\$M\ky\"X\"\$en\Z\}j\u%:\N\FE)jraÚC\l\X\%SL Hx3`i\ȧi\GFIڠ#\zv\o\\%\\\\\\&\"\AJ}Q$\$a\.8>*ƌޖ~\c\B\\m]cȢ~ڔ\rS\\\cO\n4\E\ܦ@ \\\)d\0\vcGq\\\ftO4n\gan\\0TkHe\Y\'\:S\Z69vI\'AG\ҥͩn{\\0]_\\04\v\k9~,\WX%c\\r-}\5EJMV\__\2\dcӍ[W;Lw/2\r\V\\@\RLi\\ğ\5cm#8:\\a~B0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬ON\³r\]!\J,} j\Q\=g\\Lu*\H\ҍ)$-~3Hdk\\fx\\8RU%X\J{\8\=g\3\8\\sQ?-ٯ*~j:M\JP\DuO@kwۘ҈ \D\z\^W(q8ʃMva\\Y!\"pma!!\P\5\\Tt~0X8Hpc\"\m\0 D1ZhqFem\r)\\\?!v\\-\cc\*\\\j\5\r\0ۍa\bgB<u\ʾG\j\`d|h\]\Xi\.\\v l\rsn\2#җ!E\*2P\gS\!Z\뒱\\4\nuL4A!\\\lݯ\\0\j\0;zHd)\Z\%[:ʑ?K\0P82E#\0\\0mv\F\4>u\ɭG\7\e:ۥ\K:@\0\Elv\m{\0 FG\q\0|s>q\s\Z\x\RceE\'.\\\-,!M`\njQq\|peA):?\z\պ0H;SQy\C#&]WaSF[\0RP\l2\ul\VK\Sǎ8\@\z:W\\\Ss\o?~G`t\+w\\l\\WU\S~\0=\H @\$g\KM\d+?\\\pvBJTW?q\\d1T[g\vrsC:e\\\n\w\\]xvqgҕ\ \;<\',5,0,'','','',''),(24,0,9,'9305bf00e7f8a224','53312796025bf00e7f82e82896954942','2018-11-17 13:50:05','2018-11-17 13:50:05','','','Contact Photos','15820583805bf00e7fd7909940374120-4.jpg?ts=1542459007','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\I\\]Un\_Pf\-5a.-\\5ۮ6B]eW\]\~:\'jjy3 6e5-MG>\u3vk\x\ZxJ§=!&1y֙\z\\>\\<\\]e\h\rWQkUbeb\\#\:ӳJ\\r\'3[d\0 \'\R\ҽRZisӵw?9\Ԩgt\أ\[@Z\Ih3Az\&f\r9!@Ew\~\x\'JuU\\XU}Yy\\b5\ZXݭP\'\्\r3Ђ\* Dk\\\g\\\{\\\UX\y.&C#gk-8r\\B\Z\TsbNs\nh&&\)䩦VJC\Z\jMCxbR\\[WM\5FRmP8آsbp\ZCY\Xk\0rɟ-\`9\>\.kI\ LɻyܪaHgp)vIϬ\\\'\\uY\\"Iۖ
a\دVFZ\Q)q:\\::\[\\*\{κog\}-M{\Mo)\ő(ba+(\>e\\|qN\\u8̶\Y\\\ \\q\\Z\\\|+\\Z5<\1\'G\9\Z\flpV \(GJ~N\rɉk!35^k&7#oT\+v\)֤,Qtͺi$\b\'J\\r\\\0\m\[O]ൟY>\\\\p6S_NቴkN?|MN\4,^ J1 \\b>\l\{hU՚ۭ)jdvvӢ56)BT55\w\\\&kFk\\\\BMXV\}\\dt\l|\9\JD\$\\y\rq\6PG[[Xδ@\2.!\Ԥ+\\\\\|H%\ow>p\\n+yq\\=Ƹc?d\Ir\}k\Pc4xavVZa\BZdq\BZe[F0\i\r8\P\)\1c\o3ڴ\e\\Ü\\+5{$,\/?DT\Y¼@gǖ@\T۬֜YLjǪj\\/\)R\fH)M\m\ZW.\\k\ppA?Է`k\nV~\n\SpMGصrjKue+R\[N]5k4=?\\SQp\0FU\0o6~b\\Z/[S!)\\E\{- \\\8ZМ\0BS\\>\',6,0,'','','',''),(25,0,10,'9305bf00e7f924b7','95550517915bf00e7f84cd7979805449','2018-11-17 13:50:06','2018-11-17 13:50:06','','','Contact Photos','12287146285bf00e7fd3b7e500413187-4.jpg?ts=1542459007','image/jpeg',300,300,11008,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0,,\0\\0\0\0\0\0\0\0\0\0\0\0\n \\08\0 \0\0\0 \n!\"13A#BQ$%2Saqs\\0\0\0?\0\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/6\^b\\mS\m&mpKY!\\\\K V\~\4+\/r9f3D뺞g\]L\\ϵ[d_\\"W\ĶHx\x.+\'=Yf0H\F}`V\<|\\r\\Rľ\\v=/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\6\uxL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)T\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@le{R\A b;\'NYen\eEŖc\\N\m|˪䝀\l\QZo[ &U\t(J,\\,\>1l\Dp\\0\+6v\\0\/\\l\\|\Zf\>9lb\\ΓUYÍL9ƅ-f6h#\At6=:\m|\\$\0\-}w\6A\9\ \+P\\\0o\+\{6_n{Ѷmo6-i\\\3lgIy&T\)H\9϶=c\?\\\0{\\8\0\O\\\\0M\-\'.\g=\0e`\7\/r\L\-dm:G\Dx\\\r\'\\rj\\Z:*mb_\jRQ\E\ZʚȢ@\\0E0Bykqv\\g.s\\Ɇ\[\3PK\;\\\\=).&\\Zy]VKl/\\\Br\\F\^\38\Bp:6,ا\Z.> \\\\lm\\}mb%|93̸̎IC\n\\\7Uo`\6&\p\s\NIA\ρ^3G1&,\u\,\h_/lȉq\Xg?\e^,\\?\\=|\0~\w:s|\j;>\\᭖\+&/h۶U\?\Z^.IL\Kf9\!KrԷ\86P\\\\X75\\#ᬙ\0\فDx\\m#>ln].ʈ\Ad1Ly\nR?\\e\!\\c\vp\7\sc9Uz\w\\0k#,\'E\|s\Z\3h.:%/!n\E,k9\~X`6LD\\"\/ۇ\Y>mh퓖6_ :\|\,s[呵\1\0$𬮣ٺUpۤ\\r[\8\uCM֪%}=,ǣ\"}\_\0D\=\?\L\&Ⱥ\v\O\3G\\\Ɨ\c8G<`pH\nM\=͵mh\rwyխі\0\\rśb\J{jbs͑\\\VV\\kr\\^\j謧S^Q\WqMqW(l\k\'k\A\0ʉ(% C(\\|ձރy]\Ͳ\ZyQu{\rv96+\\H)cYj־YfD\\\\'H)3\lWZ#\·\\hƩn&\֧S es\(b\a\\\#$\Zinp)\g3\2Th;\DDDDDDDDDDE,\\^\:Xbʰ\x\֧U2fkY\5\\a{o\n$S4Dzi{DߐI$rʓ:tgMis&K1$ʗ*Iid\3c\9\{\R=\{\g9tV|?~?-\;Uρ\tS\ȉ|\'ɐ\8I2bL\ʸ\AopI*\hĿ\(}O\\D\u7M~r\\\0qqwg8/`G!j\\cr5(\n\[7!ɘ \B\%Uȝm\"\"\"\"\"\"\"\"\"(\\wx\\\ ߲7a9\_n>81x\\QJ˜߳\"dq^1q&kez\\0\\\\\\'\0ffo1\\\;1\ \\Sj1\`n\ZL\-;8kώse^Cp\\*~$\;(\UW\t0iB\Q\y \km\\[DDD\\Ɲ\ZD).\Z,9F7\\0x \V8eǷ-\qG9\\Ȧ\Nm4\\\\0\\5\r\O,;\67b\\0\j`A٫*cf5Sc곈;ȝ@\.Lgn4h\'e3+\[\]\\[ݣS\\(FLfQ%}a\\\DDDDDDDDDE[\\qCu,1~y#v,圌f\5o\ٯ^a\~r\\[\_]\)Z8R\\0\\,\Yt\<#^äS\\N\-kʖ>$r\"[C\\\2x\\yY*|\O\6!q\\Oq\W2n)`ioU\\&(EK#\;%W*-\\]xq\nU\sΥBM\%:OCl\nAn!e\ \\kv\\"\"\"\"\"\"\"\"\"\"/^ :\0\=y5\\\韥RYE\F\el5\\\.ۆWBZ~mnl\0*[\Ə5\V9*S\m\Z\\|r܍ѩ->\\湡kX\R^xj\Z{)aq۽ws.Q\\0\Ȝ?2\\ b;\e\\6nD\N5=Bַ;)\v\"mv\lېLp\\j,6\(aQiIyj\"\"\"\"\"\"\"\"\"\"G+r\'d:\<}ֹ;\\4 \3\ \\l1N\U)rz46\>\=I\\_y\0\7k.\'9\~xq<\[\\\s|DDDDZB\^{PI\\q)\\%oVpjka\nlr9h4 ݜӈKޔ^\\\勍9^Jꦿ\k\\8\ޑU\Y}[\'S(D9s#fDaKia\I\^vGW̓\;V#M;גm\\+@\EG\\vc\g\9h\\u]Eڶm#mGiΫR\ȳ*ad\]U\\`fE}91\r\쌏gה=)լט~$\dAo\6\\\Z\r#xb\Ԥ\\͑(\r}^\\\wB\\\؎G\,4=;k\Ȉ\gM@q*\JG\0}}譓\^OZm?c;WW n,\\\Y\\d6\\L,ìj魝\vr\*\"\"\"\"\"\"\"\"\"\"*U=g\e\:\3ÝD(\N\Q3\Tc\ClX(v\Z\ϑoq&N\9lh\\0۫\\~G9\\8{x\%Ǣ>#\\U\mM\\DGT!9\5PT4@0Ki1\WqG#\\\\y\5Iҵ\DYB\m4\\a7\f4EsZ\b\s湘DDE\\_\\>\0\~w\}Zfk\&Vǽm\\־D\\˝ifx\w<:\\|\ңs\\m#\\rYk坲m(\L6U˾=Z\Z,b-p/<ɹd\\O@3}2 ^\rޞ\\3j:\\\5KG\0\ک\W`FIJ\^C4\')c\\}\\\Ď@\#Q\F&N:=\\\ j\r#o<\\}g\\p\\n\^ZfE>D_4\;\o_fm\\5\\sk\\\=5\qr1Nƹ\+34\fE)\OPN&L9\09:JC\7\j\\'?Mwm|\f\C\[N;ll\+\\\"\Z)\rh\*\1k#X\X\Zuq\"ȐQ\0\s\B7/!JG\\ƹ\{݆˝cʨԃ\7l\Ï5ˉѺ\\\rb\n1\\Çy\\-N\]\|F7aEM$\l*h$R\\rL\\Guo\\\\^\\q\3SN\W8(\\5Z>[5/\x\\Ic<ߙp(-s_PXƄ+VT\5[Ӵ\J\oW\\TQQTF:\\c\ŋX\X\7\v}\R9\+\R=\\+\oz\oyh\Vux\\o&\\MRz\r/;\H\r\T \02:-LRMX\\ruD̮\\f8\\\}\->\\\\\lr\\\\?͎2ȨVmU\i_vQaYD&0\p\V2k\\\=Xu\syUVP> ϳ:j8k\\0߯9oޑyfYLcc.L O6t\,fJ+\*\\G{\\"L\9\\{\G\\s\\_MwN(⟁LʷA\;VrӮ\'jẋ&i4ӨfdC6:\6\a&S\~[x\K\'QL4חX\n\U\\óQ\ێ\\\\U\ZTsg>\\§\z\Wmƚ\\RNعM\"%]o\\͊3\0\"4Qx\\c\qU]G\\==D \VV\:\(0@&\0QcG1f0\e\c\g\\=\4vO\_\kG8\5\.ײ\9d7\0;9\\n\F Ev$J\r~ Xt`{3\6\7J=g[;6rV\4-\'\k2\,Qh^|\,\rvK]\H[wwgfоj1aUֻ_\\\W4\Zr[\\\\uzyrr>f\X\Oō獹N߮J\]f\6g[.IoTY1nqeUy8lO$\ƔP4<\cg\0?\"|\\\^saA\\ȍ\8es+]̗\\rf}~l\N\Hğ8r3Ĝx\c$8\e男|\re1\\\"\"\_\"#]\\\0B~Ga\=|\-6n\\jvM0Y&E$fc\\\\]:\ZRV\\\\\Z\ŕL\`s*\i暺ҺS1aaMx\f\4~1\\6\M\>4\\ߑV꼁\h\g\r\[g-XR,R;G\1\\\x\%^0\@\5hR\8GcM\nds\r\p\&c\\g8s]\]*\[/(\q\\r\nK\UB $˝ca-\#Ǝ\"\sD&qc jx\{xΉ\Zjg*\NaqYw\\GLi\n;\&\\\~ghu\\W\شu\r\\v?dH\v\\Kٶ<\\\\\M\rF@p\)5JR&BĨ\\:/^1\Er\\\ȓQ\\5\[\\\m\\$\cIlL_oY#-S;\^pO[\{Lu\<ԩujGoU3\\%v_Jy\\{e\϶3cDDDDETO;ŵGm\\<\%D\omﭶ\0eƬ\yfOu\Z\gGpCm\\'ؐ\1Z8\+\1}V\d{\Eܟ[I\]SO>\к\\-[*\\氡$\<\VQ\e#DDDDDDDDD^3\q\'W8y\^qܪ^4\\9\\\6<U\\\n\0@\y%\`\R6s\\\*\kTv7|q\R\\~ 5\\0k\_r\'\\\\\\"f*95m!\\\W\V\\\S\i4NR\\st\9&q@#\d?ntS\{K\\ym08z:C>,\0\5\\\FO\l7B\;L\2~\F2|Hձ Ë4DDDDDXܮpz\m\\Z͡\%\-un,E>\E+4vAe\\Cƒ1DPHq@\\\\'y:$\a%I\4d\Y\\\d]6@Q\ G,T\8\\i\L\^\"|.\\s 7\\#j<\\CH\w3+\O8ݴkGɬuV\SXW6e[mi\>/;\`z\U\\>\9\؇\-\7?\uhT\\WIa\˅>4Y!Ls2JDDDDDDDD\\2$(\r*Q\Z4aD0\0\C\#1CkB=\c\9\\q}Ke.\;p\\i=|\\\FCD\\\I/5\Eu\r)u92HMv\\EgM\8\V\ \\r\:]Lq\\a\[c.\]c>\]FS\\=\m\\\-\P%M\jmGBG\n\+!GS}JRit2>\\QQkkYCCYawywa\n+[{[)\"]YY]F>\|\,(QBY2@\0W\\\_\\v>\[S/\\\{睪$_rG<̙\5sdL\\i\3\%\,/MEW>d7|\9k{)6v\ZUy,5nD\\)Q\\\"1R\\\xۘytowϑ\cG\fN\\p\rӱ[?\ryƗk\Į&}ER\S\\]T\Oa)˯˰vg3wk\F\:,qX]\@KlpYO\TEikfVW\\Vt\-z۸7Z\_?]\ZrMQeZ\\V\\\ɑm,\nڙ\O>j\u\A)Q\ \"7Fe\ \\a\{sÛ\8\\DDDDDU;s\\+6cut8ѭΨeڶ(\\cQcml\'2gJƹA<\ad\0\`Sޙ\\ZY2xҸ-2\1]&,3\L\V.j9\"8|\7DDDDDDDDDDE=\\\\pF\\\^ɇ\dfˢ쎌X\6Fݸlʛh&ZE8,\6}\+^2y\wjv.\0\څp(~ E\\|i.{(X&\}\Y&DZ\\Hyع\\n\\mBLο\//\Nl\/`#\\kkdϻ\*v6+SDDDDE\<N\^RۣѤju쀒\ej=f\\Fke\4v3-\q\}\-\a\\r\0x佺H\ml\\\0Cp/a\n\\Ic=n!ƿ\r\ߜ|m;\RTp\ZI6\\E\\r O\O_p\\MV#GH\$P\LCHUi;\G\o\_CM:]e\'pf\h\d\z\d\dԍcѨ\mUG\@g.\'=U\nqW%oYyI\=,z_+p VlC\r\\ꍧPadR\\0նLY$Rl\r\\cO9\5w7CAK\߳ԭvsjf(:x8%4xsY@\ #c\,h\adg.[\"\"\"\"-n\9O\V\k-S|e_&\0\C5p\ss\\&sw\(9C%2C\r\')q!\x6ݲ͌L1d\\e\]woyд\>:\u=Z\ku1\"F@\nDB[?\\\?q}켤{\\{j\"\"\"\"\"\"\"\"\"\"\"*t=E<釕\\\\Od\\n\rGT\\\[]֘^옌ۡlr\\%aÂk^\d\\\m\\8\\\n[$[\\Z~Ec|Jb~a|H09\k\\\\DDDDZ\\|Jw\]i\\>,|Uq4njve4$?[p|9c\2\0wtcGt[.bŗ\0_lf\\=k(8\ԑc\aڮDDDDDDDDDDDDU\\Z\\JJ\0\9#yC^\n0!6M:ٴ\kJv$j\V&yn$\\'A\J78EJѿ\ⷉlϷ\,c\\>\<~\\\"\"\"\"\\\jݺ\ZO\!\.J\&AZ\<\\H\]|~\M\0\n\'\0dM\\s\28b+3\C-!2\\k$DDDDDDDDDDDDPM\5\\\\?Oy+58n~u}F\\c&b|Ɍ\\0Y\1\\\F\w\Zc\ڻ#α14d5m.H\#[\0\\hcXvƵ\DDDD^[\Qq;9\gW9\0,bFn\߿0\0|{c\\\\id\\p\dmv\<ú9\H\k.\\n;5\/\k\b\\DDDDDDDDDDDE [n\ޗ\}~\]\\0/^/>\\p\o}\0\\\H~!iФ`\s\Y\q2\a\\\0ߟv\7\~Y@\уx$;yE\/\'c\!\h\\\̗\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\l+\0\0}nT\ \aE\n\"\(ּdۖdcnr\5\\\\\\\q\A7\A̟lG\*G\\o\Z\\\?#qc\\҉϶1\0|)ڢ\"\"\"\"\"\"\"\"\"\"\"(\xJ\i2\g\\s\r\p\#|\0H\}\0\\\Vsx7\rWo\,\\\Z#c\Z҄R\\r\HL\g\\\1ò\7\k\\[C\\i\0x+XG$1]˖9kl3Owe,e\Z@\π\"\rDDDDDDDDDDDDQ\O\\\L\ϱ6;I\dk\r\@_a\C(h\O|W\Z;6%!G\8\L<\\1\\Xx\d|i\\\"q`j\y1ǶEnk^\7P\T\44sk#Ll!>\0ӟ\7\\\^\\w\\oΡv\2801\Z\f}7c\>\r4r^k\[CS]M^\;# \\{\\5\\0<9\kp\c9\q\>\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\',4,0,'','','',''),(26,0,10,'9305bf00e7f924b7','95550517915bf00e7f84cd7979805449','2018-11-17 13:50:06','2018-11-17 13:50:06','','','Contact Photos','12287146285bf00e7fd3b7e500413187-4.jpg?ts=1542459007','image/jpeg',80,80,2356,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0*\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\kڐH\$Ͳ&a\DK.P\\\Vn\\r\\k\0Vq\\m%I^SD\\\#;q4)\\p\\\S\\hկJ\-&\Mzg\2TV:x\lbXc\!aǍѯ\B28G6X\\\E\z\㟥:b6H\g\Y^ǘ[^*\`)Y\ҹ*aPL\\#N?rzq\\}Ie\i\!}YyQ\i֗!\\B\+Nrc8\q\\{ս\A{>^v}vDXz\$N\\Ă\s\\Z\I\$M\ky\"X\"\$en\Z\}j\u%:\N\FE)jraÚC\l\X\%SL Hx3`i\ȧi\GFIڠ#\zv\o\\%\\\\\\&\"\AJ}Q$\$a\.8>*ƌޖ~\c\B\\m]cȢ~ڔ\rS\\\cO\n4\E\ܦ@ \\\)d\0\vcGq\\\ftO4n\gan\\0TkHe\Y\'\:S\Z69vI\'AG\ҥͩn{\\0]_\\04\v\k9~,\WX%c\\r-}\5EJMV\__\2\dcӍ[W;Lw/2\r\V\\@\RLi\\ğ\5cm#8:\\a~B0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬ON\³r\]!\J,} j\Q\=g\\Lu*\H\ҍ)$-~3Hdk\\fx\\8RU%X\J{\8\=g\3\8\\sQ?-ٯ*~j:M\JP\DuO@kwۘ҈ \D\z\^W(q8ʃMva\\Y!\"pma!!\P\5\\Tt~0X8Hpc\"\m\0 D1ZhqFem\r)\\\?!v\\-\cc\*\\\j\5\r\0ۍa\bgB<u\ʾG\j\`d|h\]\Xi\.\\v l\rsn\2#җ!E\*2P\gS\!Z\뒱\\4\nuL4A!\\\lݯ\\0\j\0;zHd)\Z\%[:ʑ?K\0P82E#\0\\0mv\F\4>u\ɭG\7\e:ۥ\K:@\0\Elv\m{\0 FG\q\0|s>q\s\Z\x\RceE\'.\\\-,!M`\njQq\|peA):?\z\պ0H;SQy\C#&]WaSF[\0RP\l2\ul\VK\Sǎ8\@\z:W\\\Ss\o?~G`t\+w\\l\\WU\S~\0=\H @\$g\KM\d+?\\\pvBJTW?q\\d1T[g\vrsC:e\\\n\w\\]xvqgҕ\ \;<\',5,0,'','','',''),(27,0,10,'9305bf00e7f924b7','95550517915bf00e7f84cd7979805449','2018-11-17 13:50:06','2018-11-17 13:50:06','','','Contact Photos','12287146285bf00e7fd3b7e500413187-4.jpg?ts=1542459007','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\I\\]Un\_Pf\-5a.-\\5ۮ6B]eW\]\~:\'jjy3 6e5-MG>\u3vk\x\ZxJ§=!&1y֙\z\\>\\<\\]e\h\rWQkUbeb\\#\:ӳJ\\r\'3[d\0 \'\R\ҽRZisӵw?9\Ԩgt\أ\[@Z\Ih3Az\&f\r9!@Ew\~\x\'JuU\\XU}Yy\\b5\ZXݭP\'\्\r3Ђ\* Dk\\\g\\\{\\\UX\y.&C#gk-8r\\B\Z\TsbNs\nh&&\)䩦VJC\Z\jMCxbR\\[WM\5FRmP8آsbp\ZCY\Xk\0rɟ-\`9\>\.kI\ LɻyܪaHgp)vIϬ\\\'\\uY\\"Iۖ
a\دVFZ\Q)q:\\::\[\\*\{κog\}-M{\Mo)\ő(ba+(\>e\\|qN\\u8̶\Y\\\ \\q\\Z\\\|+\\Z5<\1\'G\9\Z\flpV \(GJ~N\rɉk!35^k&7#oT\+v\)֤,Qtͺi$\b\'J\\r\\\0\m\[O]ൟY>\\\\p6S_NቴkN?|MN\4,^ J1 \\b>\l\{hU՚ۭ)jdvvӢ56)BT55\w\\\&kFk\\\\BMXV\}\\dt\l|\9\JD\$\\y\rq\6PG[[Xδ@\2.!\Ԥ+\\\\\|H%\ow>p\\n+yq\\=Ƹc?d\Ir\}k\Pc4xavVZa\BZdq\BZe[F0\i\r8\P\)\1c\o3ڴ\e\\Ü\\+5{$,\/?DT\Y¼@gǖ@\T۬֜YLjǪj\\/\)R\fH)M\m\ZW.\\k\ppA?Է`k\nV~\n\SpMGصrjKue+R\[N]5k4=?\\SQp\0FU\0o6~b\\Z/[S!)\\E\{- \\\8ZМ\0BS\\>\',6,0,'','','',''),(28,0,12,'9305bf00e7fb7439','73148550885bf00e7fb1447228602212','2018-11-17 13:50:05','2018-11-17 13:50:05','','','Contact Photos','12242958235bf00e8006f72987476580-4.jpg?ts=1542459008','image/jpeg',300,300,11008,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0,,\0\\0\0\0\0\0\0\0\0\0\0\0\n \\08\0 \0\0\0 \n!\"13A#BQ$%2Saqs\\0\0\0?\0\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/6\^b\\mS\m&mpKY!\\\\K V\~\4+\/r9f3D뺞g\]L\\ϵ[d_\\"W\ĶHx\x.+\'=Yf0H\F}`V\<|\\r\\Rľ\\v=/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\6\uxL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)T\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@le{R\A b;\'NYen\eEŖc\\N\m|˪䝀\l\QZo[ &U\t(J,\\,\>1l\Dp\\0\+6v\\0\/\\l\\|\Zf\>9lb\\ΓUYÍL9ƅ-f6h#\At6=:\m|\\$\0\-}w\6A\9\ \+P\\\0o\+\{6_n{Ѷmo6-i\\\3lgIy&T\)H\9϶=c\?\\\0{\\8\0\O\\\\0M\-\'.\g=\0e`\7\/r\L\-dm:G\Dx\\\r\'\\rj\\Z:*mb_\jRQ\E\ZʚȢ@\\0E0Bykqv\\g.s\\Ɇ\[\3PK\;\\\\=).&\\Zy]VKl/\\\Br\\F\^\38\Bp:6,ا\Z.> \\\\lm\\}mb%|93̸̎IC\n\\\7Uo`\6&\p\s\NIA\ρ^3G1&,\u\,\h_/lȉq\Xg?\e^,\\?\\=|\0~\w:s|\j;>\\᭖\+&/h۶U\?\Z^.IL\Kf9\!KrԷ\86P\\\\X75\\#ᬙ\0\فDx\\m#>ln].ʈ\Ad1Ly\nR?\\e\!\\c\vp\7\sc9Uz\w\\0k#,\'E\|s\Z\3h.:%/!n\E,k9\~X`6LD\\"\/ۇ\Y>mh퓖6_ :\|\,s[呵\1\0$𬮣ٺUpۤ\\r[\8\uCM֪%}=,ǣ\"}\_\0D\=\?\L\&Ⱥ\v\O\3G\\\Ɨ\c8G<`pH\nM\=͵mh\rwyխі\0\\rśb\J{jbs͑\\\VV\\kr\\^\j謧S^Q\WqMqW(l\k\'k\A\0ʉ(% C(\\|ձރy]\Ͳ\ZyQu{\rv96+\\H)cYj־YfD\\\\'H)3\lWZ#\·\\hƩn&\֧S es\(b\a\\\#$\Zinp)\g3\2Th;\DDDDDDDDDDE,\\^\:Xbʰ\x\֧U2fkY\5\\a{o\n$S4Dzi{DߐI$rʓ:tgMis&K1$ʗ*Iid\3c\9\{\R=\{\g9tV|?~?-\;Uρ\tS\ȉ|\'ɐ\8I2bL\ʸ\AopI*\hĿ\(}O\\D\u7M~r\\\0qqwg8/`G!j\\cr5(\n\[7!ɘ \B\%Uȝm\"\"\"\"\"\"\"\"\"(\\wx\\\ ߲7a9\_n>81x\\QJ˜߳\"dq^1q&kez\\0\\\\\\'\0ffo1\\\;1\ \\Sj1\`n\ZL\-;8kώse^Cp\\*~$\;(\UW\t0iB\Q\y \km\\[DDD\\Ɲ\ZD).\Z,9F7\\0x \V8eǷ-\qG9\\Ȧ\Nm4\\\\0\\5\r\O,;\67b\\0\j`A٫*cf5Sc곈;ȝ@\.Lgn4h\'e3+\[\]\\[ݣS\\(FLfQ%}a\\\DDDDDDDDDE[\\qCu,1~y#v,圌f\5o\ٯ^a\~r\\[\_]\)Z8R\\0\\,\Yt\<#^äS\\N\-kʖ>$r\"[C\\\2x\\yY*|\O\6!q\\Oq\W2n)`ioU\\&(EK#\;%W*-\\]xq\nU\sΥBM\%:OCl\nAn!e\ \\kv\\"\"\"\"\"\"\"\"\"\"/^ :\0\=y5\\\韥RYE\F\el5\\\.ۆWBZ~mnl\0*[\Ə5\V9*S\m\Z\\|r܍ѩ->\\湡kX\R^xj\Z{)aq۽ws.Q\\0\Ȝ?2\\ b;\e\\6nD\N5=Bַ;)\v\"mv\lېLp\\j,6\(aQiIyj\"\"\"\"\"\"\"\"\"\"G+r\'d:\<}ֹ;\\4 \3\ \\l1N\U)rz46\>\=I\\_y\0\7k.\'9\~xq<\[\\\s|DDDDZB\^{PI\\q)\\%oVpjka\nlr9h4 ݜӈKޔ^\\\勍9^Jꦿ\k\\8\ޑU\Y}[\'S(D9s#fDaKia\I\^vGW̓\;V#M;גm\\+@\EG\\vc\g\9h\\u]Eڶm#mGiΫR\ȳ*ad\]U\\`fE}91\r\쌏gה=)լט~$\dAo\6\\\Z\r#xb\Ԥ\\͑(\r}^\\\wB\\\؎G\,4=;k\Ȉ\gM@q*\JG\0}}譓\^OZm?c;WW n,\\\Y\\d6\\L,ìj魝\vr\*\"\"\"\"\"\"\"\"\"\"*U=g\e\:\3ÝD(\N\Q3\Tc\ClX(v\Z\ϑoq&N\9lh\\0۫\\~G9\\8{x\%Ǣ>#\\U\mM\\DGT!9\5PT4@0Ki1\WqG#\\\\y\5Iҵ\DYB\m4\\a7\f4EsZ\b\s湘DDE\\_\\>\0\~w\}Zfk\&Vǽm\\־D\\˝ifx\w<:\\|\ңs\\m#\\rYk坲m(\L6U˾=Z\Z,b-p/<ɹd\\O@3}2 ^\rޞ\\3j:\\\5KG\0\ک\W`FIJ\^C4\')c\\}\\\Ď@\#Q\F&N:=\\\ j\r#o<\\}g\\p\\n\^ZfE>D_4\;\o_fm\\5\\sk\\\=5\qr1Nƹ\+34\fE)\OPN&L9\09:JC\7\j\\'?Mwm|\f\C\[N;ll\+\\\"\Z)\rh\*\1k#X\X\Zuq\"ȐQ\0\s\B7/!JG\\ƹ\{݆˝cʨԃ\7l\Ï5ˉѺ\\\rb\n1\\Çy\\-N\]\|F7aEM$\l*h$R\\rL\\Guo\\\\^\\q\3SN\W8(\\5Z>[5/\x\\Ic<ߙp(-s_PXƄ+VT\5[Ӵ\J\oW\\TQQTF:\\c\ŋX\X\7\v}\R9\+\R=\\+\oz\oyh\Vux\\o&\\MRz\r/;\H\r\T \02:-LRMX\\ruD̮\\f8\\\}\->\\\\\lr\\\\?͎2ȨVmU\i_vQaYD&0\p\V2k\\\=Xu\syUVP> ϳ:j8k\\0߯9oޑyfYLcc.L O6t\,fJ+\*\\G{\\"L\9\\{\G\\s\\_MwN(⟁LʷA\;VrӮ\'jẋ&i4ӨfdC6:\6\a&S\~[x\K\'QL4חX\n\U\\óQ\ێ\\\\U\ZTsg>\\§\z\Wmƚ\\RNعM\"%]o\\͊3\0\"4Qx\\c\qU]G\\==D \VV\:\(0@&\0QcG1f0\e\c\g\\=\4vO\_\kG8\5\.ײ\9d7\0;9\\n\F Ev$J\r~ Xt`{3\6\7J=g[;6rV\4-\'\k2\,Qh^|\,\rvK]\H[wwgfоj1aUֻ_\\\W4\Zr[\\\\uzyrr>f\X\Oō獹N߮J\]f\6g[.IoTY1nqeUy8lO$\ƔP4<\cg\0?\"|\\\^saA\\ȍ\8es+]̗\\rf}~l\N\Hğ8r3Ĝx\c$8\e男|\re1\\\"\"\_\"#]\\\0B~Ga\=|\-6n\\jvM0Y&E$fc\\\\]:\ZRV\\\\\Z\ŕL\`s*\i暺ҺS1aaMx\f\4~1\\6\M\>4\\ߑV꼁\h\g\r\[g-XR,R;G\1\\\x\%^0\@\5hR\8GcM\nds\r\p\&c\\g8s]\]*\[/(\q\\r\nK\UB $˝ca-\#Ǝ\"\sD&qc jx\{xΉ\Zjg*\NaqYw\\GLi\n;\&\\\~ghu\\W\شu\r\\v?dH\v\\Kٶ<\\\\\M\rF@p\)5JR&BĨ\\:/^1\Er\\\ȓQ\\5\[\\\m\\$\cIlL_oY#-S;\^pO[\{Lu\<ԩujGoU3\\%v_Jy\\{e\϶3cDDDDETO;ŵGm\\<\%D\omﭶ\0eƬ\yfOu\Z\gGpCm\\'ؐ\1Z8\+\1}V\d{\Eܟ[I\]SO>\к\\-[*\\氡$\<\VQ\e#DDDDDDDDD^3\q\'W8y\^qܪ^4\\9\\\6<U\\\n\0@\y%\`\R6s\\\*\kTv7|q\R\\~ 5\\0k\_r\'\\\\\\"f*95m!\\\W\V\\\S\i4NR\\st\9&q@#\d?ntS\{K\\ym08z:C>,\0\5\\\FO\l7B\;L\2~\F2|Hձ Ë4DDDDDXܮpz\m\\Z͡\%\-un,E>\E+4vAe\\Cƒ1DPHq@\\\\'y:$\a%I\4d\Y\\\d]6@Q\ G,T\8\\i\L\^\"|.\\s 7\\#j<\\CH\w3+\O8ݴkGɬuV\SXW6e[mi\>/;\`z\U\\>\9\؇\-\7?\uhT\\WIa\˅>4Y!Ls2JDDDDDDDD\\2$(\r*Q\Z4aD0\0\C\#1CkB=\c\9\\q}Ke.\;p\\i=|\\\FCD\\\I/5\Eu\r)u92HMv\\EgM\8\V\ \\r\:]Lq\\a\[c.\]c>\]FS\\=\m\\\-\P%M\jmGBG\n\+!GS}JRit2>\\QQkkYCCYawywa\n+[{[)\"]YY]F>\|\,(QBY2@\0W\\\_\\v>\[S/\\\{睪$_rG<̙\5sdL\\i\3\%\,/MEW>d7|\9k{)6v\ZUy,5nD\\)Q\\\"1R\\\xۘytowϑ\cG\fN\\p\rӱ[?\ryƗk\Į&}ER\S\\]T\Oa)˯˰vg3wk\F\:,qX]\@KlpYO\TEikfVW\\Vt\-z۸7Z\_?]\ZrMQeZ\\V\\\ɑm,\nڙ\O>j\u\A)Q\ \"7Fe\ \\a\{sÛ\8\\DDDDDU;s\\+6cut8ѭΨeڶ(\\cQcml\'2gJƹA<\ad\0\`Sޙ\\ZY2xҸ-2\1]&,3\L\V.j9\"8|\7DDDDDDDDDDE=\\\\pF\\\^ɇ\dfˢ쎌X\6Fݸlʛh&ZE8,\6}\+^2y\wjv.\0\څp(~ E\\|i.{(X&\}\Y&DZ\\Hyع\\n\\mBLο\//\Nl\/`#\\kkdϻ\*v6+SDDDDE\<N\^RۣѤju쀒\ej=f\\Fke\4v3-\q\}\-\a\\r\0x佺H\ml\\\0Cp/a\n\\Ic=n!ƿ\r\ߜ|m;\RTp\ZI6\\E\\r O\O_p\\MV#GH\$P\LCHUi;\G\o\_CM:]e\'pf\h\d\z\d\dԍcѨ\mUG\@g.\'=U\nqW%oYyI\=,z_+p VlC\r\\ꍧPadR\\0նLY$Rl\r\\cO9\5w7CAK\߳ԭvsjf(:x8%4xsY@\ #c\,h\adg.[\"\"\"\"-n\9O\V\k-S|e_&\0\C5p\ss\\&sw\(9C%2C\r\')q!\x6ݲ͌L1d\\e\]woyд\>:\u=Z\ku1\"F@\nDB[?\\\?q}켤{\\{j\"\"\"\"\"\"\"\"\"\"\"*t=E<釕\\\\Od\\n\rGT\\\[]֘^옌ۡlr\\%aÂk^\d\\\m\\8\\\n[$[\\Z~Ec|Jb~a|H09\k\\\\DDDDZ\\|Jw\]i\\>,|Uq4njve4$?[p|9c\2\0wtcGt[.bŗ\0_lf\\=k(8\ԑc\aڮDDDDDDDDDDDDU\\Z\\JJ\0\9#yC^\n0!6M:ٴ\kJv$j\V&yn$\\'A\J78EJѿ\ⷉlϷ\,c\\>\<~\\\"\"\"\"\\\jݺ\ZO\!\.J\&AZ\<\\H\]|~\M\0\n\'\0dM\\s\28b+3\C-!2\\k$DDDDDDDDDDDDPM\5\\\\?Oy+58n~u}F\\c&b|Ɍ\\0Y\1\\\F\w\Zc\ڻ#α14d5m.H\#[\0\\hcXvƵ\DDDD^[\Qq;9\gW9\0,bFn\߿0\0|{c\\\\id\\p\dmv\<ú9\H\k.\\n;5\/\k\b\\DDDDDDDDDDDE [n\ޗ\}~\]\\0/^/>\\p\o}\0\\\H~!iФ`\s\Y\q2\a\\\0ߟv\7\~Y@\уx$;yE\/\'c\!\h\\\̗\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\l+\0\0}nT\ \aE\n\"\(ּdۖdcnr\5\\\\\\\q\A7\A̟lG\*G\\o\Z\\\?#qc\\҉϶1\0|)ڢ\"\"\"\"\"\"\"\"\"\"\"(\xJ\i2\g\\s\r\p\#|\0H\}\0\\\Vsx7\rWo\,\\\Z#c\Z҄R\\r\HL\g\\\1ò\7\k\\[C\\i\0x+XG$1]˖9kl3Owe,e\Z@\π\"\rDDDDDDDDDDDDQ\O\\\L\ϱ6;I\dk\r\@_a\C(h\O|W\Z;6%!G\8\L<\\1\\Xx\d|i\\\"q`j\y1ǶEnk^\7P\T\44sk#Ll!>\0ӟ\7\\\^\\w\\oΡv\2801\Z\f}7c\>\r4r^k\[CS]M^\;# \\{\\5\\0<9\kp\c9\q\>\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\',4,0,'','','',''),(29,0,12,'9305bf00e7fb7439','73148550885bf00e7fb1447228602212','2018-11-17 13:50:05','2018-11-17 13:50:05','','','Contact Photos','12242958235bf00e8006f72987476580-4.jpg?ts=1542459008','image/jpeg',80,80,2356,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0*\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\kڐH\$Ͳ&a\DK.P\\\Vn\\r\\k\0Vq\\m%I^SD\\\#;q4)\\p\\\S\\hկJ\-&\Mzg\2TV:x\lbXc\!aǍѯ\B28G6X\\\E\z\㟥:b6H\g\Y^ǘ[^*\`)Y\ҹ*aPL\\#N?rzq\\}Ie\i\!}YyQ\i֗!\\B\+Nrc8\q\\{ս\A{>^v}vDXz\$N\\Ă\s\\Z\I\$M\ky\"X\"\$en\Z\}j\u%:\N\FE)jraÚC\l\X\%SL Hx3`i\ȧi\GFIڠ#\zv\o\\%\\\\\\&\"\AJ}Q$\$a\.8>*ƌޖ~\c\B\\m]cȢ~ڔ\rS\\\cO\n4\E\ܦ@ \\\)d\0\vcGq\\\ftO4n\gan\\0TkHe\Y\'\:S\Z69vI\'AG\ҥͩn{\\0]_\\04\v\k9~,\WX%c\\r-}\5EJMV\__\2\dcӍ[W;Lw/2\r\V\\@\RLi\\ğ\5cm#8:\\a~B0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬ON\³r\]!\J,} j\Q\=g\\Lu*\H\ҍ)$-~3Hdk\\fx\\8RU%X\J{\8\=g\3\8\\sQ?-ٯ*~j:M\JP\DuO@kwۘ҈ \D\z\^W(q8ʃMva\\Y!\"pma!!\P\5\\Tt~0X8Hpc\"\m\0 D1ZhqFem\r)\\\?!v\\-\cc\*\\\j\5\r\0ۍa\bgB<u\ʾG\j\`d|h\]\Xi\.\\v l\rsn\2#җ!E\*2P\gS\!Z\뒱\\4\nuL4A!\\\lݯ\\0\j\0;zHd)\Z\%[:ʑ?K\0P82E#\0\\0mv\F\4>u\ɭG\7\e:ۥ\K:@\0\Elv\m{\0 FG\q\0|s>q\s\Z\x\RceE\'.\\\-,!M`\njQq\|peA):?\z\պ0H;SQy\C#&]WaSF[\0RP\l2\ul\VK\Sǎ8\@\z:W\\\Ss\o?~G`t\+w\\l\\WU\S~\0=\H @\$g\KM\d+?\\\pvBJTW?q\\d1T[g\vrsC:e\\\n\w\\]xvqgҕ\ \;<\',5,0,'','','',''),(30,0,12,'9305bf00e7fb7439','73148550885bf00e7fb1447228602212','2018-11-17 13:50:05','2018-11-17 13:50:05','','','Contact Photos','12242958235bf00e8006f72987476580-4.jpg?ts=1542459008','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\I\\]Un\_Pf\-5a.-\\5ۮ6B]eW\]\~:\'jjy3 6e5-MG>\u3vk\x\ZxJ§=!&1y֙\z\\>\\<\\]e\h\rWQkUbeb\\#\:ӳJ\\r\'3[d\0 \'\R\ҽRZisӵw?9\Ԩgt\أ\[@Z\Ih3Az\&f\r9!@Ew\~\x\'JuU\\XU}Yy\\b5\ZXݭP\'\्\r3Ђ\* Dk\\\g\\\{\\\UX\y.&C#gk-8r\\B\Z\TsbNs\nh&&\)䩦VJC\Z\jMCxbR\\[WM\5FRmP8آsbp\ZCY\Xk\0rɟ-\`9\>\.kI\ LɻyܪaHgp)vIϬ\\\'\\uY\\"Iۖ
a\دVFZ\Q)q:\\::\[\\*\{κog\}-M{\Mo)\ő(ba+(\>e\\|qN\\u8̶\Y\\\ \\q\\Z\\\|+\\Z5<\1\'G\9\Z\flpV \(GJ~N\rɉk!35^k&7#oT\+v\)֤,Qtͺi$\b\'J\\r\\\0\m\[O]ൟY>\\\\p6S_NቴkN?|MN\4,^ J1 \\b>\l\{hU՚ۭ)jdvvӢ56)BT55\w\\\&kFk\\\\BMXV\}\\dt\l|\9\JD\$\\y\rq\6PG[[Xδ@\2.!\Ԥ+\\\\\|H%\ow>p\\n+yq\\=Ƹc?d\Ir\}k\Pc4xavVZa\BZdq\BZe[F0\i\r8\P\)\1c\o3ڴ\e\\Ü\\+5{$,\/?DT\Y¼@gǖ@\T۬֜YLjǪj\\/\)R\fH)M\m\ZW.\\k\ppA?Է`k\nV~\n\SpMGصrjKue+R\[N]5k4=?\\SQp\0FU\0o6~b\\Z/[S!)\\E\{- \\\8ZМ\0BS\\>\',6,0,'','','',''),(31,0,11,'9305bf00e7fb6ff3','11822615065bf00e7fab8ba088168210','2018-11-17 13:50:06','2018-11-17 13:50:06','','','Contact Photos','97971161215bf00e801fdd7464746900-4.jpg?ts=1542459008','image/jpeg',300,300,11008,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0,,\0\\0\0\0\0\0\0\0\0\0\0\0\n \\08\0 \0\0\0 \n!\"13A#BQ$%2Saqs\\0\0\0?\0\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/6\^b\\mS\m&mpKY!\\\\K V\~\4+\/r9f3D뺞g\]L\\ϵ[d_\\"W\ĶHx\x.+\'=Yf0H\F}`V\<|\\r\\Rľ\\v=/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\6\uxL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)T\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@le{R\A b;\'NYen\eEŖc\\N\m|˪䝀\l\QZo[ &U\t(J,\\,\>1l\Dp\\0\+6v\\0\/\\l\\|\Zf\>9lb\\ΓUYÍL9ƅ-f6h#\At6=:\m|\\$\0\-}w\6A\9\ \+P\\\0o\+\{6_n{Ѷmo6-i\\\3lgIy&T\)H\9϶=c\?\\\0{\\8\0\O\\\\0M\-\'.\g=\0e`\7\/r\L\-dm:G\Dx\\\r\'\\rj\\Z:*mb_\jRQ\E\ZʚȢ@\\0E0Bykqv\\g.s\\Ɇ\[\3PK\;\\\\=).&\\Zy]VKl/\\\Br\\F\^\38\Bp:6,ا\Z.> \\\\lm\\}mb%|93̸̎IC\n\\\7Uo`\6&\p\s\NIA\ρ^3G1&,\u\,\h_/lȉq\Xg?\e^,\\?\\=|\0~\w:s|\j;>\\᭖\+&/h۶U\?\Z^.IL\Kf9\!KrԷ\86P\\\\X75\\#ᬙ\0\فDx\\m#>ln].ʈ\Ad1Ly\nR?\\e\!\\c\vp\7\sc9Uz\w\\0k#,\'E\|s\Z\3h.:%/!n\E,k9\~X`6LD\\"\/ۇ\Y>mh퓖6_ :\|\,s[呵\1\0$𬮣ٺUpۤ\\r[\8\uCM֪%}=,ǣ\"}\_\0D\=\?\L\&Ⱥ\v\O\3G\\\Ɨ\c8G<`pH\nM\=͵mh\rwyխі\0\\rśb\J{jbs͑\\\VV\\kr\\^\j謧S^Q\WqMqW(l\k\'k\A\0ʉ(% C(\\|ձރy]\Ͳ\ZyQu{\rv96+\\H)cYj־YfD\\\\'H)3\lWZ#\·\\hƩn&\֧S es\(b\a\\\#$\Zinp)\g3\2Th;\DDDDDDDDDDE,\\^\:Xbʰ\x\֧U2fkY\5\\a{o\n$S4Dzi{DߐI$rʓ:tgMis&K1$ʗ*Iid\3c\9\{\R=\{\g9tV|?~?-\;Uρ\tS\ȉ|\'ɐ\8I2bL\ʸ\AopI*\hĿ\(}O\\D\u7M~r\\\0qqwg8/`G!j\\cr5(\n\[7!ɘ \B\%Uȝm\"\"\"\"\"\"\"\"\"(\\wx\\\ ߲7a9\_n>81x\\QJ˜߳\"dq^1q&kez\\0\\\\\\'\0ffo1\\\;1\ \\Sj1\`n\ZL\-;8kώse^Cp\\*~$\;(\UW\t0iB\Q\y \km\\[DDD\\Ɲ\ZD).\Z,9F7\\0x \V8eǷ-\qG9\\Ȧ\Nm4\\\\0\\5\r\O,;\67b\\0\j`A٫*cf5Sc곈;ȝ@\.Lgn4h\'e3+\[\]\\[ݣS\\(FLfQ%}a\\\DDDDDDDDDE[\\qCu,1~y#v,圌f\5o\ٯ^a\~r\\[\_]\)Z8R\\0\\,\Yt\<#^äS\\N\-kʖ>$r\"[C\\\2x\\yY*|\O\6!q\\Oq\W2n)`ioU\\&(EK#\;%W*-\\]xq\nU\sΥBM\%:OCl\nAn!e\ \\kv\\"\"\"\"\"\"\"\"\"\"/^ :\0\=y5\\\韥RYE\F\el5\\\.ۆWBZ~mnl\0*[\Ə5\V9*S\m\Z\\|r܍ѩ->\\湡kX\R^xj\Z{)aq۽ws.Q\\0\Ȝ?2\\ b;\e\\6nD\N5=Bַ;)\v\"mv\lېLp\\j,6\(aQiIyj\"\"\"\"\"\"\"\"\"\"G+r\'d:\<}ֹ;\\4 \3\ \\l1N\U)rz46\>\=I\\_y\0\7k.\'9\~xq<\[\\\s|DDDDZB\^{PI\\q)\\%oVpjka\nlr9h4 ݜӈKޔ^\\\勍9^Jꦿ\k\\8\ޑU\Y}[\'S(D9s#fDaKia\I\^vGW̓\;V#M;גm\\+@\EG\\vc\g\9h\\u]Eڶm#mGiΫR\ȳ*ad\]U\\`fE}91\r\쌏gה=)լט~$\dAo\6\\\Z\r#xb\Ԥ\\͑(\r}^\\\wB\\\؎G\,4=;k\Ȉ\gM@q*\JG\0}}譓\^OZm?c;WW n,\\\Y\\d6\\L,ìj魝\vr\*\"\"\"\"\"\"\"\"\"\"*U=g\e\:\3ÝD(\N\Q3\Tc\ClX(v\Z\ϑoq&N\9lh\\0۫\\~G9\\8{x\%Ǣ>#\\U\mM\\DGT!9\5PT4@0Ki1\WqG#\\\\y\5Iҵ\DYB\m4\\a7\f4EsZ\b\s湘DDE\\_\\>\0\~w\}Zfk\&Vǽm\\־D\\˝ifx\w<:\\|\ңs\\m#\\rYk坲m(\L6U˾=Z\Z,b-p/<ɹd\\O@3}2 ^\rޞ\\3j:\\\5KG\0\ک\W`FIJ\^C4\')c\\}\\\Ď@\#Q\F&N:=\\\ j\r#o<\\}g\\p\\n\^ZfE>D_4\;\o_fm\\5\\sk\\\=5\qr1Nƹ\+34\fE)\OPN&L9\09:JC\7\j\\'?Mwm|\f\C\[N;ll\+\\\"\Z)\rh\*\1k#X\X\Zuq\"ȐQ\0\s\B7/!JG\\ƹ\{݆˝cʨԃ\7l\Ï5ˉѺ\\\rb\n1\\Çy\\-N\]\|F7aEM$\l*h$R\\rL\\Guo\\\\^\\q\3SN\W8(\\5Z>[5/\x\\Ic<ߙp(-s_PXƄ+VT\5[Ӵ\J\oW\\TQQTF:\\c\ŋX\X\7\v}\R9\+\R=\\+\oz\oyh\Vux\\o&\\MRz\r/;\H\r\T \02:-LRMX\\ruD̮\\f8\\\}\->\\\\\lr\\\\?͎2ȨVmU\i_vQaYD&0\p\V2k\\\=Xu\syUVP> ϳ:j8k\\0߯9oޑyfYLcc.L O6t\,fJ+\*\\G{\\"L\9\\{\G\\s\\_MwN(⟁LʷA\;VrӮ\'jẋ&i4ӨfdC6:\6\a&S\~[x\K\'QL4חX\n\U\\óQ\ێ\\\\U\ZTsg>\\§\z\Wmƚ\\RNعM\"%]o\\͊3\0\"4Qx\\c\qU]G\\==D \VV\:\(0@&\0QcG1f0\e\c\g\\=\4vO\_\kG8\5\.ײ\9d7\0;9\\n\F Ev$J\r~ Xt`{3\6\7J=g[;6rV\4-\'\k2\,Qh^|\,\rvK]\H[wwgfоj1aUֻ_\\\W4\Zr[\\\\uzyrr>f\X\Oō獹N߮J\]f\6g[.IoTY1nqeUy8lO$\ƔP4<\cg\0?\"|\\\^saA\\ȍ\8es+]̗\\rf}~l\N\Hğ8r3Ĝx\c$8\e男|\re1\\\"\"\_\"#]\\\0B~Ga\=|\-6n\\jvM0Y&E$fc\\\\]:\ZRV\\\\\Z\ŕL\`s*\i暺ҺS1aaMx\f\4~1\\6\M\>4\\ߑV꼁\h\g\r\[g-XR,R;G\1\\\x\%^0\@\5hR\8GcM\nds\r\p\&c\\g8s]\]*\[/(\q\\r\nK\UB $˝ca-\#Ǝ\"\sD&qc jx\{xΉ\Zjg*\NaqYw\\GLi\n;\&\\\~ghu\\W\شu\r\\v?dH\v\\Kٶ<\\\\\M\rF@p\)5JR&BĨ\\:/^1\Er\\\ȓQ\\5\[\\\m\\$\cIlL_oY#-S;\^pO[\{Lu\<ԩujGoU3\\%v_Jy\\{e\϶3cDDDDETO;ŵGm\\<\%D\omﭶ\0eƬ\yfOu\Z\gGpCm\\'ؐ\1Z8\+\1}V\d{\Eܟ[I\]SO>\к\\-[*\\氡$\<\VQ\e#DDDDDDDDD^3\q\'W8y\^qܪ^4\\9\\\6<U\\\n\0@\y%\`\R6s\\\*\kTv7|q\R\\~ 5\\0k\_r\'\\\\\\"f*95m!\\\W\V\\\S\i4NR\\st\9&q@#\d?ntS\{K\\ym08z:C>,\0\5\\\FO\l7B\;L\2~\F2|Hձ Ë4DDDDDXܮpz\m\\Z͡\%\-un,E>\E+4vAe\\Cƒ1DPHq@\\\\'y:$\a%I\4d\Y\\\d]6@Q\ G,T\8\\i\L\^\"|.\\s 7\\#j<\\CH\w3+\O8ݴkGɬuV\SXW6e[mi\>/;\`z\U\\>\9\؇\-\7?\uhT\\WIa\˅>4Y!Ls2JDDDDDDDD\\2$(\r*Q\Z4aD0\0\C\#1CkB=\c\9\\q}Ke.\;p\\i=|\\\FCD\\\I/5\Eu\r)u92HMv\\EgM\8\V\ \\r\:]Lq\\a\[c.\]c>\]FS\\=\m\\\-\P%M\jmGBG\n\+!GS}JRit2>\\QQkkYCCYawywa\n+[{[)\"]YY]F>\|\,(QBY2@\0W\\\_\\v>\[S/\\\{睪$_rG<̙\5sdL\\i\3\%\,/MEW>d7|\9k{)6v\ZUy,5nD\\)Q\\\"1R\\\xۘytowϑ\cG\fN\\p\rӱ[?\ryƗk\Į&}ER\S\\]T\Oa)˯˰vg3wk\F\:,qX]\@KlpYO\TEikfVW\\Vt\-z۸7Z\_?]\ZrMQeZ\\V\\\ɑm,\nڙ\O>j\u\A)Q\ \"7Fe\ \\a\{sÛ\8\\DDDDDU;s\\+6cut8ѭΨeڶ(\\cQcml\'2gJƹA<\ad\0\`Sޙ\\ZY2xҸ-2\1]&,3\L\V.j9\"8|\7DDDDDDDDDDE=\\\\pF\\\^ɇ\dfˢ쎌X\6Fݸlʛh&ZE8,\6}\+^2y\wjv.\0\څp(~ E\\|i.{(X&\}\Y&DZ\\Hyع\\n\\mBLο\//\Nl\/`#\\kkdϻ\*v6+SDDDDE\<N\^RۣѤju쀒\ej=f\\Fke\4v3-\q\}\-\a\\r\0x佺H\ml\\\0Cp/a\n\\Ic=n!ƿ\r\ߜ|m;\RTp\ZI6\\E\\r O\O_p\\MV#GH\$P\LCHUi;\G\o\_CM:]e\'pf\h\d\z\d\dԍcѨ\mUG\@g.\'=U\nqW%oYyI\=,z_+p VlC\r\\ꍧPadR\\0նLY$Rl\r\\cO9\5w7CAK\߳ԭvsjf(:x8%4xsY@\ #c\,h\adg.[\"\"\"\"-n\9O\V\k-S|e_&\0\C5p\ss\\&sw\(9C%2C\r\')q!\x6ݲ͌L1d\\e\]woyд\>:\u=Z\ku1\"F@\nDB[?\\\?q}켤{\\{j\"\"\"\"\"\"\"\"\"\"\"*t=E<釕\\\\Od\\n\rGT\\\[]֘^옌ۡlr\\%aÂk^\d\\\m\\8\\\n[$[\\Z~Ec|Jb~a|H09\k\\\\DDDDZ\\|Jw\]i\\>,|Uq4njve4$?[p|9c\2\0wtcGt[.bŗ\0_lf\\=k(8\ԑc\aڮDDDDDDDDDDDDU\\Z\\JJ\0\9#yC^\n0!6M:ٴ\kJv$j\V&yn$\\'A\J78EJѿ\ⷉlϷ\,c\\>\<~\\\"\"\"\"\\\jݺ\ZO\!\.J\&AZ\<\\H\]|~\M\0\n\'\0dM\\s\28b+3\C-!2\\k$DDDDDDDDDDDDPM\5\\\\?Oy+58n~u}F\\c&b|Ɍ\\0Y\1\\\F\w\Zc\ڻ#α14d5m.H\#[\0\\hcXvƵ\DDDD^[\Qq;9\gW9\0,bFn\߿0\0|{c\\\\id\\p\dmv\<ú9\H\k.\\n;5\/\k\b\\DDDDDDDDDDDE [n\ޗ\}~\]\\0/^/>\\p\o}\0\\\H~!iФ`\s\Y\q2\a\\\0ߟv\7\~Y@\уx$;yE\/\'c\!\h\\\̗\s\\\osp\\a\3\u\ghz\oaLނ\\A\\\l+\0\0}nT\ \aE\n\"\(ּdۖdcnr\5\\\\\\\q\A7\A̟lG\*G\\o\Z\\\?#qc\\҉϶1\0|)ڢ\"\"\"\"\"\"\"\"\"\"\"(\xJ\i2\g\\s\r\p\#|\0H\}\0\\\Vsx7\rWo\,\\\Z#c\Z҄R\\r\HL\g\\\1ò\7\k\\[C\\i\0x+XG$1]˖9kl3Owe,e\Z@\π\"\rDDDDDDDDDDDDQ\O\\\L\ϱ6;I\dk\r\@_a\C(h\O|W\Z;6%!G\8\L<\\1\\Xx\d|i\\\"q`j\y1ǶEnk^\7P\T\44sk#Ll!>\0ӟ\7\\\^\\w\\oΡv\2801\Z\f}7c\>\r4r^k\[CS]M^\;# \\{\\5\\0<9\kp\c9\q\>\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\',4,0,'','','',''),(32,0,11,'9305bf00e7fb6ff3','11822615065bf00e7fab8ba088168210','2018-11-17 13:50:06','2018-11-17 13:50:06','','','Contact Photos','97971161215bf00e801fdd7464746900-4.jpg?ts=1542459008','image/jpeg',80,80,2356,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0*\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\kڐH\$Ͳ&a\DK.P\\\Vn\\r\\k\0Vq\\m%I^SD\\\#;q4)\\p\\\S\\hկJ\-&\Mzg\2TV:x\lbXc\!aǍѯ\B28G6X\\\E\z\㟥:b6H\g\Y^ǘ[^*\`)Y\ҹ*aPL\\#N?rzq\\}Ie\i\!}YyQ\i֗!\\B\+Nrc8\q\\{ս\A{>^v}vDXz\$N\\Ă\s\\Z\I\$M\ky\"X\"\$en\Z\}j\u%:\N\FE)jraÚC\l\X\%SL Hx3`i\ȧi\GFIڠ#\zv\o\\%\\\\\\&\"\AJ}Q$\$a\.8>*ƌޖ~\c\B\\m]cȢ~ڔ\rS\\\cO\n4\E\ܦ@ \\\)d\0\vcGq\\\ftO4n\gan\\0TkHe\Y\'\:S\Z69vI\'AG\ҥͩn{\\0]_\\04\v\k9~,\WX%c\\r-}\5EJMV\__\2\dcӍ[W;Lw/2\r\V\\@\RLi\\ğ\5cm#8:\\a~B0\-m*tQh_MkoRШ4X\BO\\\,l,H\\\F3hdP\m8Jsǻy\\no:t1\\\W-jtȬ\\\e1\\( \\wmɏi֬ON\³r\]!\J,} j\Q\=g\\Lu*\H\ҍ)$-~3Hdk\\fx\\8RU%X\J{\8\=g\3\8\\sQ?-ٯ*~j:M\JP\DuO@kwۘ҈ \D\z\^W(q8ʃMva\\Y!\"pma!!\P\5\\Tt~0X8Hpc\"\m\0 D1ZhqFem\r)\\\?!v\\-\cc\*\\\j\5\r\0ۍa\bgB<u\ʾG\j\`d|h\]\Xi\.\\v l\rsn\2#җ!E\*2P\gS\!Z\뒱\\4\nuL4A!\\\lݯ\\0\j\0;zHd)\Z\%[:ʑ?K\0P82E#\0\\0mv\F\4>u\ɭG\7\e:ۥ\K:@\0\Elv\m{\0 FG\q\0|s>q\s\Z\x\RceE\'.\\\-,!M`\njQq\|peA):?\z\պ0H;SQy\C#&]WaSF[\0RP\l2\ul\VK\Sǎ8\@\z:W\\\Ss\o?~G`t\+w\\l\\WU\S~\0=\H @\$g\KM\d+?\\\pvBJTW?q\\d1T[g\vrsC:e\\\n\w\\]xvqgҕ\ \;<\',5,0,'','','',''),(33,0,11,'9305bf00e7fb6ff3','11822615065bf00e7fab8ba088168210','2018-11-17 13:50:06','2018-11-17 13:50:06','','','Contact Photos','97971161215bf00e801fdd7464746900-4.jpg?ts=1542459008','image/jpeg',48,48,1488,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\00\00\0\\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0(\0\0\0\0\0\0\0\0\0 \n\"1$%\\0\0\0?\08\\{\0݇\I\\]Un\_Pf\-5a.-\\5ۮ6B]eW\]\~:\'jjy3 6e5-MG>\u3vk\x\ZxJ§=!&1y֙\z\\>\\<\\]e\h\rWQkUbeb\\#\:ӳJ\\r\'3[d\0 \'\R\ҽRZisӵw?9\Ԩgt\أ\[@Z\Ih3Az\&f\r9!@Ew\~\x\'JuU\\XU}Yy\\b5\ZXݭP\'\्\r3Ђ\* Dk\\\g\\\{\\\UX\y.&C#gk-8r\\B\Z\TsbNs\nh&&\)䩦VJC\Z\jMCxbR\\[WM\5FRmP8آsbp\ZCY\Xk\0rɟ-\`9\>\.kI\ LɻyܪaHgp)vIϬ\\\'\\uY\\"Iۖ
a\دVFZ\Q)q:\\::\[\\*\{κog\}-M{\Mo)\ő(ba+(\>e\\|qN\\u8̶\Y\\\ \\q\\Z\\\|+\\Z5<\1\'G\9\Z\flpV \(GJ~N\rɉk!35^k&7#oT\+v\)֤,Qtͺi$\b\'J\\r\\\0\m\[O]ൟY>\\\\p6S_NቴkN?|MN\4,^ J1 \\b>\l\{hU՚ۭ)jdvvӢ56)BT55\w\\\&kFk\\\\BMXV\}\\dt\l|\9\JD\$\\y\rq\6PG[[Xδ@\2.!\Ԥ+\\\\\|H%\ow>p\\n+yq\\=Ƹc?d\Ir\}k\Pc4xavVZa\BZdq\BZe[F0\i\r8\P\)\1c\o3ڴ\e\\Ü\\+5{$,\/?DT\Y¼@gǖ@\T۬֜YLjǪj\\/\)R\fH)M\m\ZW.\\k\ppA?Է`k\nV~\n\SpMGصrjKue+R\[N]5k4=?\\SQp\0FU\0o6~b\\Z/[S!)\\E\{- \\\8ZМ\0BS\\>\',6,0,'','','',''),(34,3,5,'9305bf00e7fdf2d2','15820583805bf00e7fd7909940374120','2018-11-17 12:50:07','2018-11-17 12:50:07','','','Contact Photos','3.jpg','image/jpeg',300,300,11005,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0,,\0\\0\0\0\0\0\0\0\0\0\0\0\n \\08\0 \0\0\0\0 \n!\"1A#3BQ$%2Saqs\\0\0\0?\0\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/6\^b\\mS\m&mpKY!\\\\K V\~\4+\/r9f3D뺞g\]L\\ϵ[d_\\"W\ĶHx\x.+\'=Yf0H\F}`>V\<|\\r\\Rľ\\vM/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\Ή6\u\xL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@lD<>U\\\03EW\0\\W%oſm\]\\;\\͋l\\\f]ռ|\&A=1\r\#Å`]1\\E㛑\ؙ|~N\*Yc++*aj\Z?ЋK}$L\Z\\Q\β\0P4`4h#\\0\G\0Y!\шBZk\\nas\",=\|z\\#s/kyqMR]\S\-Hkiu\66\rf\\fGx$\7z\[\vF ^\l{\\\\'$àH\y \^D#\bz\:XdvF4/dD۸\l3\͈f]\\c\>6~\\2ϱ8ke\ɇ\\6\kenqƗˠn\g/1كs\F|\ \\d\ƪ\\IK\[@\QK\Z\m_)X<}M!>.,bb:=\\\䯻|G\jO[Z;d卮$W\\z\?a!\8\dmfL\<++n&|\6\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]S\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\J>\rms>)/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\ZX\܍J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^89R\7\ș>Wn\I#\\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\W\'\\\\\\"\"\"(\c̞94\m\i!ʾ\_0\\{\rkA\"\y\\jwƯX*\Z[\l3Ɋ\\\Il\ʋc W^\Y;\\8j\!`IuMP\8\hh1\y,G-n\Vͤmr(7`\vjYyeS\:9ȯ&!Y ]\vz7\ZđyL>^\~M\\b\aWa`oV}z`6%\@_֫\`n\V>Q7;\eF\c\t\z\vHn%By)Bh`ϯ~\0:\\)\M\gk?J\\rŒZ\\kSv\!}\\]\`ٶ.6\m<8w=<\\\\w\ap{xT\N[F¦\"E,\d\\wV}=%\|w;4\us]U#\ua#XBΑ;#\\1uhB`;xMSZ\uM;N\}n5EDaî<ᕷuhO\\Myy|Ʌ[\\\||;9\-\X_q\\QG6s\\0˱*|נq=v\\|i\\E$ꝋ4\+HB)Y\m|أ0^3#H(Ae\v0\_ \U\|}\\B\ruef`4zZ&c\rfZ\61\\0,9vsDDDDDDDDDDDX\\>\u:U\0\p\$\\7^\[\\\H\>l\K+\Zؑ*D`5|aс\Ϭ۠\e(o\\\\\\[ ж;ͬ\cIJf\D]\y<5\-tV\9 d;n\\\\=B5ƺTKZ\Oz^\i\oc[[\j\\\ݛ`bO)?4S6\8>^g~+v~P\A\\l5&տ\Qd\>\ZViŔyVq\\\"4b\<#\ZQB\|\\e\0iY\HOk9z\\\rͅGǴ\\"6S+\\\ṷv2_(5:\#|\\\x>\q\SV<\%RޢF1\;&D\\\\"\?\{-\\DhB\\nu\Z;\\gٷ\40Pjϱmvr\RsO&=n!WGai(qk)6Ǒ\Z\\n+Y\\)iekp\\SmA̰|\2)#5\\vnr\Qհ\\\\\]&`֮,/f3WsO4\֕ҙ\nlc\;0\a\]H:o)\fU\\r7d+FC8ph:\9oB`\"\B?8vp\\\\\/-\"\"֡[B\'a\\hj5MR\'IR\!2%F\x\uq-k\/\请_D\\v\n.&3\ZH0\UCedz\\g\\+מ \~]p\iQ\0ǚ.^(\0c#*F|\\IO9\\\l\q숈Gx\\0v-ǚĨm\\S`՚\3L\\Ps\\bm>df+G\Z|Q\/\_L{h\#u)6yCp_\"\\i\\\_\Z^|\~e\4\eK\1䝵\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃq\n;\\\M(\$\\nVT\\\9X\[j\\:\\lJJ8\5\O&.JǨ\\ȍo\'Ģ#0\o\A\nK:v\Ym7[\n\C@\ͪ,\57\ȉY\\5~(\?\\\6]\([\r\\\\\\\\+h\r>K`NJܖDlF5\\C\aշ]7x\=\'m\w\n\9}}UAcߌ\tr\\\]$\s8\}:\"\"\"\"\"\";\~z3\\\݅\\\0\V\qJ\lڎ>\*\ð\\d\rM)Hz}\\\\T%EEe\r\re\\݄*jjRlm\lueet1\Zd E dʒQ\0y^\\\?O*],\c\525\pkyڢE$s\|ɚW6Id\m&C>bZ\\Us\HwȈÖO\Rsoh3H\c8\r\|gʇ\BP\Kۤf\\{ͽl7R\mԑ\+3\XI+\\kܽ\\6\ciu/\Gl#n\DX}\\7\m(jA L\j\\28\0Dy$E\r\\4Qx\\;\\\Yrwl\6O\NMH\?Y\\Zo\Z\q,$Fq+\s\EPr_&tS\\g\nf\T;\0\UΨ\uE-s\r[d\\E&\G _.\4ќ\Wst?\\\]=J\\g1qV\\`\\"`k\i\SG:R6>2ƌFr\\"\"\"\"\\.C\/\ȕn\:\\6Uro鿍93Z\r9\?~[g?\\/|9\S$>7\"r\m\*(\\\H\\vXL\{{fL\\'SеqPi\\FS$aD\0TA \\\V\/\/)\s\ڈQO)a\{nqT\\0Cfd \\\u<\[8 a\\ףw1x\x1\7Gb{\>[\X\\"__&\\vZtQ|\\r\\kbm:\ϧ>\=lMq\.`ݙM \"\\\\/\X\4\0\o-\\ŝ˘eL\u}Of\\\#~\3u$i\+X瀱\a\\6p>4֨;9ҾR\06H\P[Xem9\\iI\Zc#@kI[.n6I\iqҾ\-\\0\\RoV>7\<\=\\\\kH{v\wdui?ۄ(Nkǂk,bp\81#Yw\So<\Oț_+ϒ\\r\dp\\W{Ng7\0ZBe\\9!\\\H\\k\\\ \~{PW2k?~p\+\\\\|>M$\\'\\0Pc#˳>]n\rO\4 ǗvGwc$bh\`j\]zF1\0\"1\˜\\\1ke\w\nse\l\-\s}XčJ\9\}0\0|{c\\\\URO4mevX6H\a\|q5R\Z\\\\\rvKs\9ضBc\\[_`Wj\W\}/돷\\;\>\0\\\H~!iФ`\s\4\j_\85z\D\p<\\]\\\"\~5kDDDDEu\Z9\VU5\\ئ6\\H~ϲ\c0L4\\7\'7\\\"\"\"\"\"\"\"\"\"\"\".\4\\sl)b\#\{\V?`Y|\\q\hi\t\c^\\\Z\j\y`\k\ֱ~\0\\\[;\~\Ȉ\',4,0,'','','',''),(35,2,4,'9305bf00e7fdc853','12287146285bf00e7fd3b7e500413187','2018-11-17 12:50:07','2018-11-17 12:50:07','','','Contact Photos','2.jpg','image/jpeg',300,300,11005,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0,,\0\\0\0\0\0\0\0\0\0\0\0\0\n \\08\0 \0\0\0\0 \n!\"1A#3BQ$%2Saqs\\0\0\0?\0\\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"/6\^b\\mS\m&mpKY!\\\\K V\~\4+\/r9f3D뺞g\]L\\ϵ[d_\\"W\ĶHx\x.+\'=Yf0H\F}`>V\<|\\r\\Rľ\\vM/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\Ή6\u\xL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@lD<>U\\\03EW\0\\W%oſm\]\\;\\͋l\\\f]ռ|\&A=1\r\#Å`]1\\E㛑\ؙ|~N\*Yc++*aj\Z?ЋK}$L\Z\\Q\β\0P4`4h#\\0\G\0Y!\шBZk\\nas\",=\|z\\#s/kyqMR]\S\-Hkiu\66\rf\\fGx$\7z\[\vF ^\l{\\\\'$àH\y \^D#\bz\:XdvF4/dD۸\l3\͈f]\\c\>6~\\2ϱ8ke\ɇ\\6\kenqƗˠn\g/1كs\F|\ \\d\ƪ\\IK\[@\QK\Z\m_)X<}M!>.,bb:=\\\䯻|G\jO[Z;d卮$W\\z\?a!\8\dmfL\<++n&|\6\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]S\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\J>\rms>)/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\ZX\܍J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^89R\7\ș>Wn\I#\\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\W\'\\\\\\"\"\"(\c̞94\m\i!ʾ\_0\\{\rkA\"\y\\jwƯX*\Z[\l3Ɋ\\\Il\ʋc W^\Y;\\8j\!`IuMP\8\hh1\y,G-n\Vͤmr(7`\vjYyeS\:9ȯ&!Y ]\vz7\ZđyL>^\~M\\b\aWa`oV}z`6%\@_֫\`n\V>Q7;\eF\c\t\z\vHn%By)Bh`ϯ~\0:\\)\M\gk?J\\rŒZ\\kSv\!}\\]\`ٶ.6\m<8w=<\\\\w\ap{xT\N[F¦\"E,\d\\wV}=%\|w;4\us]U#\ua#XBΑ;#\\1uhB`;xMSZ\uM;N\}n5EDaî<ᕷuhO\\Myy|Ʌ[\\\||;9\-\X_q\\QG6s\\0˱*|נq=v\\|i\\E$ꝋ4\+HB)Y\m|أ0^3#H(Ae\v0\_ \U\|}\\B\ruef`4zZ&c\rfZ\61\\0,9vsDDDDDDDDDDDX\\>\u:U\0\p\$\\7^\[\\\H\>l\K+\Zؑ*D`5|aс\Ϭ۠\e(o\\\\\\[ ж;ͬ\cIJf\D]\y<5\-tV\9 d;n\\\\=B5ƺTKZ\Oz^\i\oc[[\j\\\ݛ`bO)?4S6\8>^g~+v~P\A\\l5&տ\Qd\>\ZViŔyVq\\\"4b\<#\ZQB\|\\e\0iY\HOk9z\\\rͅGǴ\\"6S+\\\ṷv2_(5:\#|\\\x>\q\SV<\%RޢF1\;&D\\\\"\?\{-\\DhB\\nu\Z;\\gٷ\40Pjϱmvr\RsO&=n!WGai(qk)6Ǒ\Z\\n+Y\\)iekp\\SmA̰|\2)#5\\vnr\Qհ\\\\\]&`֮,/f3WsO4\֕ҙ\nlc\;0\a\]H:o)\fU\\r7d+FC8ph:\9oB`\"\B?8vp\\\\\/-\"\"֡[B\'a\\hj5MR\'IR\!2%F\x\uq-k\/\请_D\\v\n.&3\ZH0\UCedz\\g\\+מ \~]p\iQ\0ǚ.^(\0c#*F|\\IO9\\\l\q숈Gx\\0v-ǚĨm\\S`՚\3L\\Ps\\bm>df+G\Z|Q\/\_L{h\#u)6yCp_\"\\i\\\_\Z^|\~e\4\eK\1䝵\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃq\n;\\\M(\$\\nVT\\\9X\[j\\:\\lJJ8\5\O&.JǨ\\ȍo\'Ģ#0\o\A\nK:v\Ym7[\n\C@\ͪ,\57\ȉY\\5~(\?\\\6]\([\r\\\\\\\\+h\r>K`NJܖDlF5\\C\aշ]7x\=\'m\w\n\9}}UAcߌ\tr\\\]$\s8\}:\"\"\"\"\"\";\~z3\\\݅\\\0\V\qJ\lڎ>\*\ð\\d\rM)Hz}\\\\T%EEe\r\re\\݄*jjRlm\lueet1\Zd E dʒQ\0y^\\\?O*],\c\525\pkyڢE$s\|ɚW6Id\m&C>bZ\\Us\HwȈÖO\Rsoh3H\c8\r\|gʇ\BP\Kۤf\\{ͽl7R\mԑ\+3\XI+\\kܽ\\6\ciu/\Gl#n\DX}\\7\m(jA L\j\\28\0Dy$E\r\\4Qx\\;\\\Yrwl\6O\NMH\?Y\\Zo\Z\q,$Fq+\s\EPr_&tS\\g\nf\T;\0\UΨ\uE-s\r[d\\E&\G _.\4ќ\Wst?\\\]=J\\g1qV\\`\\"`k\i\SG:R6>2ƌFr\\"\"\"\"\\.C\/\ȕn\:\\6Uro鿍93Z\r9\?~[g?\\/|9\S$>7\"r\m\*(\\\H\\vXL\{{fL\\'SеqPi\\FS$aD\0TA \\\V\/\/)\s\ڈQO)a\{nqT\\0Cfd \\\u<\[8 a\\ףw1x\x1\7Gb{\>[\X\\"__&\\vZtQ|\\r\\kbm:\ϧ>\=lMq\.`ݙM \"\\\\/\X\4\0\o-\\ŝ˘eL\u}Of\\\#~\3u$i\+X瀱\a\\6p>4֨;9ҾR\06H\P[Xem9\\iI\Zc#@kI[.n6I\iqҾ\-\\0\\RoV>7\<\=\\\\kH{v\wdui?ۄ(Nkǂk,bp\81#Yw\So<\Oț_+ϒ\\r\dp\\W{Ng7\0ZBe\\9!\\\H\\k\\\ \~{PW2k?~p\+\\\\|>M$\\'\\0Pc#˳>]n\rO\4 ǗvGwc$bh\`j\]zF1\0\"1\˜\\\1ke\w\nse\l\-\s}XčJ\9\}0\0|{c\\\\URO4mevX6H\a\|q5R\Z\\\\\rvKs\9ضBc\\[_`Wj\W\}/돷\\;\>\0\\\H~!iФ`\s\4\j_\85z\D\p<\\]\\\"\~5kDDDDEu\Z9\VU5\\ئ6\\H~ϲ\c0L4\\7\'7\\\"\"\"\"\"\"\"\"\"\"\".\4\\sl)b\#\{\V?`Y|\\q\hi\t\c^\\\Z\j\y`\k\ֱ~\0\\\[;\~\Ȉ\',4,0,'','','',''),(36,3,5,'9305bf00e7fdf2d2','15820583805bf00e7fd7909940374120','2018-11-17 12:50:07','2018-11-17 12:50:07','','','Contact Photos','3.jpg','image/jpeg',80,80,2355,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\9ZM\*x\\.d% \r1!hu\GS6J\\9jdžBÏ-_e9+\r 0p\m<\\Ƌ\?Jt>\l\\ϭu1y[U:^R\0rT Ƕ>,G6\\9\\\\oCN0!..-ӭ/\nC)!i\V\*\q㕈w{\C\Jg]U%,}$\\p\\I\\5Wț$DEWI.f\"\\A\պ\0t\KDu\Y\\Z%ލjR\\n\24\\J 0f0L<\#N\Ҏv@F37\\WKLE҂C2IH\5)]i\8>*ƌޖ~\c\B\\m]cȢ~ڔ\rvb?N\Z \\\\S 6a\0\0p|;8\s:S7`3x\52\,\y\)\\r \\ɻ$\DW\tiR\fԷ=\\0B\\mg/Ň\{\Z\\P^\Z\|\!v\Z&I\^\n\X<\0f\\,,zq+u\c.\\A2\\;\\ZjI\r#;Sؓz\,`ͤgR2/\QeN-鵍u\U[R\ڽb:XبFmC2;- B1xo:\V\\0Ww\W?[\ڪ\N\\\XbA:e]X3㭶1\4\\՞i\\\V[\>$\.kI\ LɻyܪaP\\8R\\0t%WY/O\ZO\\0\Do-\a\\ ^-\,R\\\u\!Y \tu\\U5t\\\B[Q\\\\'SY\"P\\n\>VQ\ | #x˥\4\qm\Z\n\5\#g-ӞW]ۦZjybN-\r53c-{{o\+\D\\\P*#T-L\\ZCM\,fjY@\g\\LnF\#N\W\\-8SHY\\t\I\N,\ϳ\\S\^\+w~Ak>\m\l}\h\ (MN\4,^ J1(\2\b>\\\{(U՚ۭ)jdvvӢ\\ڞT\Rw\\ƌת1\\\3Z^F\¶\r\$㦣c\a\R&X$\\\\h$ca8\"\Z\$B\u!q6!X\gO\rv\\]ZA/3{^PQ[ˎ_\\4%5\\\0%_rLe\rC\^2\8c 0\\\\#\\,\16\M(m \\' N1c{xyՠ/5[-&\\Z\_\!dGlx\\"\"\䭒><%R\eն\*\et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\9ZM\*x\\.d% \r1!hu\GS6J\\9jdžBÏ-_e9+\r 0p\m<\\Ƌ\?Jt>\l\\ϭu1y[U:^R\0rT Ƕ>,G6\\9\\\\oCN0!..-ӭ/\nC)!i\V\*\q㕈w{\C\Jg]U%,}$\\p\\I\\5Wț$DEWI.f\"\\A\պ\0t\KDu\Y\\Z%ލjR\\n\24\\J 0f0L<\#N\Ҏv@F37\\WKLE҂C2IH\5)]i\8>*ƌޖ~\c\B\\m]cȢ~ڔ\rvb?N\Z \\\\S 6a\0\0p|;8\s:S7`3x\52\,\y\)\\r \\ɻ$\DW\tiR\fԷ=\\0B\\mg/Ň\{\Z\\P^\Z\|\!v\Z&I\^\n\X<\0f\\,,zq+u\c.\\A2\\;\\ZjI\r#;Sؓz\,`ͤgR2/\QeN-鵍u\U[R\ڽb:XبFmC2;- B1xo:\V\\0Ww\W?[\ڪ\N\\\XbA:e]X3㭶1\4\\՞i\\\V[\>$\.kI\ LɻyܪaP\\8R\\0t%WY/O\ZO\\0\Do-\a\\ ^-\,R\\\u\!Y \tu\\U5t\\\B[Q\\\\'SY\"P\\n\>VQ\ | #x˥\4\qm\Z\n\5\#g-ӞW]ۦZjybN-\r53c-{{o\+\D\\\P*#T-L\\ZCM\,fjY@\g\\LnF\#N\W\\-8SHY\\t\I\N,\ϳ\\S\^\+w~Ak>\m\l}\h\ (MN\4,^ J1(\2\b>\\\{(U՚ۭ)jdvvӢ\\ڞT\Rw\\ƌת1\\\3Z^F\¶\r\$㦣c\a\R&X$\\\\h$ca8\"\Z\$B\u!q6!X\gO\rv\\]ZA/3{^PQ[ˎ_\\4%5\\\0%_rLe\rC\^2\8c 0\\\\#\\,\16\M(m \\' N1c{xyՠ/5[-&\\Z\_\!dGlx\\"\"\䭒><%R\eն\*\V\<|\\r\\Rľ\\vM/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\Ή6\u\xL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@lD<>U\\\03EW\0\\W%oſm\]\\;\\͋l\\\f]ռ|\&A=1\r\#Å`]1\\E㛑\ؙ|~N\*Yc++*aj\Z?ЋK}$L\Z\\Q\β\0P4`4h#\\0\G\0Y!\шBZk\\nas\",=\|z\\#s/kyqMR]\S\-Hkiu\66\rf\\fGx$\7z\[\vF ^\l{\\\\'$àH\y \^D#\bz\:XdvF4/dD۸\l3\͈f]\\c\>6~\\2ϱ8ke\ɇ\\6\kenqƗˠn\g/1كs\F|\ \\d\ƪ\\IK\[@\QK\Z\m_)X<}M!>.,bb:=\\\䯻|G\jO[Z;d卮$W\\z\?a!\8\dmfL\<++n&|\6\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]S\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\J>\rms>)/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\ZX\܍J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^89R\7\ș>Wn\I#\\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\W\'\\\\\\"\"\"(\c̞94\m\i!ʾ\_0\\{\rkA\"\y\\jwƯX*\Z[\l3Ɋ\\\Il\ʋc W^\Y;\\8j\!`IuMP\8\hh1\y,G-n\Vͤmr(7`\vjYyeS\:9ȯ&!Y ]\vz7\ZđyL>^\~M\\b\aWa`oV}z`6%\@_֫\`n\V>Q7;\eF\c\t\z\vHn%By)Bh`ϯ~\0:\\)\M\gk?J\\rŒZ\\kSv\!}\\]\`ٶ.6\m<8w=<\\\\w\ap{xT\N[F¦\"E,\d\\wV}=%\|w;4\us]U#\ua#XBΑ;#\\1uhB`;xMSZ\uM;N\}n5EDaî<ᕷuhO\\Myy|Ʌ[\\\||;9\-\X_q\\QG6s\\0˱*|נq=v\\|i\\E$ꝋ4\+HB)Y\m|أ0^3#H(Ae\v0\_ \U\|}\\B\ruef`4zZ&c\rfZ\61\\0,9vsDDDDDDDDDDDX\\>\u:U\0\p\$\\7^\[\\\H\>l\K+\Zؑ*D`5|aс\Ϭ۠\e(o\\\\\\[ ж;ͬ\cIJf\D]\y<5\-tV\9 d;n\\\\=B5ƺTKZ\Oz^\i\oc[[\j\\\ݛ`bO)?4S6\8>^g~+v~P\A\\l5&տ\Qd\>\ZViŔyVq\\\"4b\<#\ZQB\|\\e\0iY\HOk9z\\\rͅGǴ\\"6S+\\\ṷv2_(5:\#|\\\x>\q\SV<\%RޢF1\;&D\\\\"\?\{-\\DhB\\nu\Z;\\gٷ\40Pjϱmvr\RsO&=n!WGai(qk)6Ǒ\Z\\n+Y\\)iekp\\SmA̰|\2)#5\\vnr\Qհ\\\\\]&`֮,/f3WsO4\֕ҙ\nlc\;0\a\]H:o)\fU\\r7d+FC8ph:\9oB`\"\B?8vp\\\\\/-\"\"֡[B\'a\\hj5MR\'IR\!2%F\x\uq-k\/\请_D\\v\n.&3\ZH0\UCedz\\g\\+מ \~]p\iQ\0ǚ.^(\0c#*F|\\IO9\\\l\q숈Gx\\0v-ǚĨm\\S`՚\3L\\Ps\\bm>df+G\Z|Q\/\_L{h\#u)6yCp_\"\\i\\\_\Z^|\~e\4\eK\1䝵\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃq\n;\\\M(\$\\nVT\\\9X\[j\\:\\lJJ8\5\O&.JǨ\\ȍo\'Ģ#0\o\A\nK:v\Ym7[\n\C@\ͪ,\57\ȉY\\5~(\?\\\6]\([\r\\\\\\\\+h\r>K`NJܖDlF5\\C\aշ]7x\=\'m\w\n\9}}UAcߌ\tr\\\]$\s8\}:\"\"\"\"\"\";\~z3\\\݅\\\0\V\qJ\lڎ>\*\ð\\d\rM)Hz}\\\\T%EEe\r\re\\݄*jjRlm\lueet1\Zd E dʒQ\0y^\\\?O*],\c\525\pkyڢE$s\|ɚW6Id\m&C>bZ\\Us\HwȈÖO\Rsoh3H\c8\r\|gʇ\BP\Kۤf\\{ͽl7R\mԑ\+3\XI+\\kܽ\\6\ciu/\Gl#n\DX}\\7\m(jA L\j\\28\0Dy$E\r\\4Qx\\;\\\Yrwl\6O\NMH\?Y\\Zo\Z\q,$Fq+\s\EPr_&tS\\g\nf\T;\0\UΨ\uE-s\r[d\\E&\G _.\4ќ\Wst?\\\]=J\\g1qV\\`\\"`k\i\SG:R6>2ƌFr\\"\"\"\"\\.C\/\ȕn\:\\6Uro鿍93Z\r9\?~[g?\\/|9\S$>7\"r\m\*(\\\H\\vXL\{{fL\\'SеqPi\\FS$aD\0TA \\\V\/\/)\s\ڈQO)a\{nqT\\0Cfd \\\u<\[8 a\\ףw1x\x1\7Gb{\>[\X\\"__&\\vZtQ|\\r\\kbm:\ϧ>\=lMq\.`ݙM \"\\\\/\X\4\0\o-\\ŝ˘eL\u}Of\\\#~\3u$i\+X瀱\a\\6p>4֨;9ҾR\06H\P[Xem9\\iI\Zc#@kI[.n6I\iqҾ\-\\0\\RoV>7\<\=\\\\kH{v\wdui?ۄ(Nkǂk,bp\81#Yw\So<\Oț_+ϒ\\r\dp\\W{Ng7\0ZBe\\9!\\\H\\k\\\ \~{PW2k?~p\+\\\\|>M$\\'\\0Pc#˳>]n\rO\4 ǗvGwc$bh\`j\]zF1\0\"1\˜\\\1ke\w\nse\l\-\s}XčJ\9\}0\0|{c\\\\URO4mevX6H\a\|q5R\Z\\\\\rvKs\9ضBc\\[_`Wj\W\}/돷\\;\>\0\\\H~!iФ`\s\4\j_\85z\D\p<\\]\\\"\~5kDDDDEu\Z9\VU5\\ئ6\\H~ϲ\c0L4\\7\'7\\\"\"\"\"\"\"\"\"\"\"\".\4\\sl)b\#\{\V?`Y|\\q\hi\t\c^\\\Z\j\y`\k\ֱ~\0\\\[;\~\Ȉ\',4,0,'','','',''),(41,4,6,'9305bf00e8022c7a','12242958235bf00e8006f72987476580','2018-11-17 12:50:08','2018-11-17 12:50:08','','','Contact Photos','4.jpg','image/jpeg',80,80,2355,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\9ZM\*x\\.d% \r1!hu\GS6J\\9jdžBÏ-_e9+\r 0p\m<\\Ƌ\?Jt>\l\\ϭu1y[U:^R\0rT Ƕ>,G6\\9\\\\oCN0!..-ӭ/\nC)!i\V\*\q㕈w{\C\Jg]U%,}$\\p\\I\\5Wț$DEWI.f\"\\A\պ\0t\KDu\Y\\Z%ލjR\\n\24\\J 0f0L<\#N\Ҏv@F37\\WKLE҂C2IH\5)]i\8>*ƌޖ~\c\B\\m]cȢ~ڔ\rvb?N\Z \\\\S 6a\0\0p|;8\s:S7`3x\52\,\y\)\\r \\ɻ$\DW\tiR\fԷ=\\0B\\mg/Ň\{\Z\\P^\Z\|\!v\Z&I\^\n\X<\0f\\,,zq+u\c.\\A2\\;\\ZjI\r#;Sؓz\,`ͤgR2/\QeN-鵍u\U[R\ڽb:XبFmC2;- B1xo:\V\\0Ww\W?[\ڪ\N\\\XbA:e]X3㭶1\4\\՞i\\\V[\>$\.kI\ LɻyܪaP\\8R\\0t%WY/O\ZO\\0\Do-\a\\ ^-\,R\\\u\!Y \tu\\U5t\\\B[Q\\\\'SY\"P\\n\>VQ\ | #x˥\4\qm\Z\n\5\#g-ӞW]ۦZjybN-\r53c-{{o\+\D\\\P*#T-L\\ZCM\,fjY@\g\\LnF\#N\W\\-8SHY\\t\I\N,\ϳ\\S\^\+w~Ak>\m\l}\h\ (MN\4,^ J1(\2\b>\\\{(U՚ۭ)jdvvӢ\\ڞT\Rw\\ƌת1\\\3Z^F\¶\r\$㦣c\a\R&X$\\\\h$ca8\"\Z\$B\u!q6!X\gO\rv\\]ZA/3{^PQ[ˎ_\\4%5\\\0%_rLe\rC\^2\8c 0\\\\#\\,\16\M(m \\' N1c{xyՠ/5[-&\\Z\_\!dGlx\\"\"\䭒><%R\eն\*\V\<|\\r\\Rľ\\vM/\y\Zd\{\.%F29#1\\?\CVގ\\r\MƕM\G\9OWag\,\"Q\\x7\\a\\6\-Nл\\\q\z\.\\-̡nic!I)\\0sp1ؕ9Jh\^I\\\\Ή6\u\xL\8x\m\V\mPbH |u\J\\=\-KS\NS\ܛW\y=^-\ϬM)AT\2\1CO$yQ2Ka(#q\:\\O\\y\WPKg\\\ν\C(@lD<>U\\\03EW\0\\W%oſm\]\\;\\͋l\\\f]ռ|\&A=1\r\#Å`]1\\E㛑\ؙ|~N\*Yc++*aj\Z?ЋK}$L\Z\\Q\β\0P4`4h#\\0\G\0Y!\шBZk\\nas\",=\|z\\#s/kyqMR]\S\-Hkiu\66\rf\\fGx$\7z\[\vF ^\l{\\\\'$àH\y \^D#\bz\:XdvF4/dD۸\l3\͈f]\\c\>6~\\2ϱ8ke\ɇ\\6\kenqƗˠn\g/1كs\F|\ \\d\ƪ\\IK\[@\QK\Z\m_)X<}M!>.,bb:=\\\䯻|G\jO[Z;d卮$W\\z\?a!\8\dmfL\<++n&|\6\>!\m8\D\*\\9\]fP\u\_OEOÍ\Z0\,k[C=\0PDϋ1\舼Gz\=\$qcx@ 3&]S\dr\\<1\8A&<\*\0\\Kv\\\s\r?o\"g]\"~ \d3N$aL#\6[\J>\rms>)/DDE\nSx\6!]M\\\:f^^Z\\86\UI|\\W\\5\@3NֿE\n\Q{\Y{+\B\>\/\2u.I\{\wtӆ`8\&P\D&!,0\`Lc<\J`s\\\\k䣧]\\<>#\\*Q\ZX\܍J6Aۨ\pV\\r\ffcA6P\Ur\'@pf`\">r\~6x\"\\Nv\\,^89R\7\ș>Wn\I#\\m^s8W:\ \|\W\isW!nTڌy֓1Kn\\\\Z\\W\'\\\\\\"\"\"(\c̞94\m\i!ʾ\_0\\{\rkA\"\y\\jwƯX*\Z[\l3Ɋ\\\Il\ʋc W^\Y;\\8j\!`IuMP\8\hh1\y,G-n\Vͤmr(7`\vjYyeS\:9ȯ&!Y ]\vz7\ZđyL>^\~M\\b\aWa`oV}z`6%\@_֫\`n\V>Q7;\eF\c\t\z\vHn%By)Bh`ϯ~\0:\\)\M\gk?J\\rŒZ\\kSv\!}\\]\`ٶ.6\m<8w=<\\\\w\ap{xT\N[F¦\"E,\d\\wV}=%\|w;4\us]U#\ua#XBΑ;#\\1uhB`;xMSZ\uM;N\}n5EDaî<ᕷuhO\\Myy|Ʌ[\\\||;9\-\X_q\\QG6s\\0˱*|נq=v\\|i\\E$ꝋ4\+HB)Y\m|أ0^3#H(Ae\v0\_ \U\|}\\B\ruef`4zZ&c\rfZ\61\\0,9vsDDDDDDDDDDDX\\>\u:U\0\p\$\\7^\[\\\H\>l\K+\Zؑ*D`5|aс\Ϭ۠\e(o\\\\\\[ ж;ͬ\cIJf\D]\y<5\-tV\9 d;n\\\\=B5ƺTKZ\Oz^\i\oc[[\j\\\ݛ`bO)?4S6\8>^g~+v~P\A\\l5&տ\Qd\>\ZViŔyVq\\\"4b\<#\ZQB\|\\e\0iY\HOk9z\\\rͅGǴ\\"6S+\\\ṷv2_(5:\#|\\\x>\q\SV<\%RޢF1\;&D\\\\"\?\{-\\DhB\\nu\Z;\\gٷ\40Pjϱmvr\RsO&=n!WGai(qk)6Ǒ\Z\\n+Y\\)iekp\\SmA̰|\2)#5\\vnr\Qհ\\\\\]&`֮,/f3WsO4\֕ҙ\nlc\;0\a\]H:o)\fU\\r7d+FC8ph:\9oB`\"\B?8vp\\\\\/-\"\"֡[B\'a\\hj5MR\'IR\!2%F\x\uq-k\/\请_D\\v\n.&3\ZH0\UCedz\\g\\+מ \~]p\iQ\0ǚ.^(\0c#*F|\\IO9\\\l\q숈Gx\\0v-ǚĨm\\S`՚\3L\\Ps\\bm>df+G\Z|Q\/\_L{h\#u)6yCp_\"\\i\\\_\Z^|\~e\4\eK\1䝵\*\<\Dh\{\$\\o<\\;^Ɯ{G:b3ǃq\n;\\\M(\$\\nVT\\\9X\[j\\:\\lJJ8\5\O&.JǨ\\ȍo\'Ģ#0\o\A\nK:v\Ym7[\n\C@\ͪ,\57\ȉY\\5~(\?\\\6]\([\r\\\\\\\\+h\r>K`NJܖDlF5\\C\aշ]7x\=\'m\w\n\9}}UAcߌ\tr\\\]$\s8\}:\"\"\"\"\"\";\~z3\\\݅\\\0\V\qJ\lڎ>\*\ð\\d\rM)Hz}\\\\T%EEe\r\re\\݄*jjRlm\lueet1\Zd E dʒQ\0y^\\\?O*],\c\525\pkyڢE$s\|ɚW6Id\m&C>bZ\\Us\HwȈÖO\Rsoh3H\c8\r\|gʇ\BP\Kۤf\\{ͽl7R\mԑ\+3\XI+\\kܽ\\6\ciu/\Gl#n\DX}\\7\m(jA L\j\\28\0Dy$E\r\\4Qx\\;\\\Yrwl\6O\NMH\?Y\\Zo\Z\q,$Fq+\s\EPr_&tS\\g\nf\T;\0\UΨ\uE-s\r[d\\E&\G _.\4ќ\Wst?\\\]=J\\g1qV\\`\\"`k\i\SG:R6>2ƌFr\\"\"\"\"\\.C\/\ȕn\:\\6Uro鿍93Z\r9\?~[g?\\/|9\S$>7\"r\m\*(\\\H\\vXL\{{fL\\'SеqPi\\FS$aD\0TA \\\V\/\/)\s\ڈQO)a\{nqT\\0Cfd \\\u<\[8 a\\ףw1x\x1\7Gb{\>[\X\\"__&\\vZtQ|\\r\\kbm:\ϧ>\=lMq\.`ݙM \"\\\\/\X\4\0\o-\\ŝ˘eL\u}Of\\\#~\3u$i\+X瀱\a\\6p>4֨;9ҾR\06H\P[Xem9\\iI\Zc#@kI[.n6I\iqҾ\-\\0\\RoV>7\<\=\\\\kH{v\wdui?ۄ(Nkǂk,bp\81#Yw\So<\Oț_+ϒ\\r\dp\\W{Ng7\0ZBe\\9!\\\H\\k\\\ \~{PW2k?~p\+\\\\|>M$\\'\\0Pc#˳>]n\rO\4 ǗvGwc$bh\`j\]zF1\0\"1\˜\\\1ke\w\nse\l\-\s}XčJ\9\}0\0|{c\\\\URO4mevX6H\a\|q5R\Z\\\\\rvKs\9ضBc\\[_`Wj\W\}/돷\\;\>\0\\\H~!iФ`\s\4\j_\85z\D\p<\\]\\\"\~5kDDDDEu\Z9\VU5\\ئ6\\H~ϲ\c0L4\\7\'7\\\"\"\"\"\"\"\"\"\"\"\".\4\\sl)b\#\{\V?`Y|\\q\hi\t\c^\\\Z\j\y`\k\ֱ~\0\\\[;\~\Ȉ\',4,0,'','','',''),(44,5,7,'9305bf00e803570d','97971161215bf00e801fdd7464746900','2018-11-17 12:50:08','2018-11-17 12:50:08','','','Contact Photos','5.jpg','image/jpeg',80,80,2355,_binary '\\\0JFIF\0\0H\0H\0\0\\0C\0\0\0P\0P\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n\\0+\0\0\0\0\0\0\0 \n!#\"BC\\0\0\0?\0\\8\8\8㚑\1VwZf\J\\!me\Mgܑ|\\qbtٙ$[Q\\\|\'J+\_Οyd\]~\\N\M>et-eMs2T9\4ZO\4\Z] W~?;J&\&u\約f}v\\+\3V\\;j\\\*stn].\\ \;E\\V\u0\EW}oH{^8\9{\\\Evػ\n4\+\"J\`kgR+\U\l\ƽ)͔ь|Poީ\9ZM\*x\\.d% \r1!hu\GS6J\\9jdžBÏ-_e9+\r 0p\m<\\Ƌ\?Jt>\l\\ϭu1y[U:^R\0rT Ƕ>,G6\\9\\\\oCN0!..-ӭ/\nC)!i\V\*\q㕈w{\C\Jg]U%,}$\\p\\I\\5Wț$DEWI.f\"\\A\պ\0t\KDu\Y\\Z%ލjR\\n\24\\J 0f0L<\#N\Ҏv@F37\\WKLE҂C2IH\5)]i\8>*ƌޖ~\c\B\\m]cȢ~ڔ\rvb?N\Z \\\\S 6a\0\0p|;8\s:S7`3x\52\,\y\)\\r \\ɻ$\DW\tiR\fԷ=\\0B\\mg/Ň\{\Z\\P^\Z\|\!v\Z&I\^\n\X<\0f\\,,zq+u\c.\\A2\\;\\ZjI\r#;Sؓz\,`ͤgR2/\QeN-鵍u\U[R\ڽb:XبFmC2;- B1xo:\V\\0Ww\W?[\ڪ\N\\\XbA:e]X3㭶1\4\\՞i\\\V[\>$\.kI\ LɻyܪaP\\8R\\0t%WY/O\ZO\\0\Do-\a\\ ^-\,R\\\u\!Y \tu\\U5t\\\B[Q\\\\'SY\"P\\n\>VQ\ | #x˥\4\qm\Z\n\5\#g-ӞW]ۦZjybN-\r53c-{{o\+\D\\\P*#T-L\\ZCM\,fjY@\g\\LnF\#N\W\\-8SHY\\t\I\N,\ϳ\\S\^\+w~Ak>\m\l}\h\ (MN\4,^ J1(\2\b>\\\{(U՚ۭ)jdvvӢ\\ڞT\Rw\\ƌת1\\\3Z^F\¶\r\$㦣c\a\R&X$\\\\h$ca8\"\Z\$B\u!q6!X\gO\rv\\]ZA/3{^PQ[ˎ_\\4%5\\\0%_rLe\rC\^2\8c 0\\\\#\\,\16\M(m \\' N1c{xyՠ/5[-&\\Z\_\!dGlx\\"\"\䭒><%R\eն\*\e{R\A b;\'NYen\eEŖc\\N\m|˪䝀\l\QZo[ &U\t(J,\\,\>1l\Dp\\0\+6v\\0\/\\l\\|\Zf\>9lb\\ΓUYÍL9ƅ-f6h#\At6=:\m|\\$\0\-}w\6A\9\ \+P\\\0o\+\{6_n{Ѷmo6-i\\\3lgIy&T\)H\9϶=c\?\\\0{\\8\0\O\\\\0M\-\'.\g=\0e`\7\/r\L\-dm:G\Dx\\\r\'\\rj\\Z:*mb_\jRQ\E\ZʚȢ@\\0E0Bykqv\\g.s\\Ɇ\[\3PK\;\\\\=).&\\Zy]VKl/\\\Br\\F\^\38\Bp:6,ا\Z.> \\\\lm\\}mb%|93̸̎IC\n\\\7Uo`\6&\p\s\NIA\ρ^3G1&,\u\,\h_/lȉq\Xg?\e^,\\?\\=|\0~\w:s|\j;>\\᭖\+&/h۶U\?\Z^.IL\Kf9\!KrԷ\86P\\\\X75\\#ᬙ\0\فDx\\m#>ln].ʈ\Ad1Ly\nR?\\e\!\\c\vp\7\sc9Uz\w\\0k#,\'E\|s\Z\3h.:%/!n\E,k9\~X`6LD\\"\/ۇ\Y>mh퓖6_ :\|\,s[呵\1\0$𬮣ٺUpۤ\\r[\8\uCM֪%}=,ǣ\"}\_\0D\=\?\L\&Ⱥ\v\O\3G\\\Ɨ\c8G<`pH\nM\=͵mh\rwyխі\0\\rśb\J{jbs͑\\\VV\\kr\\^\j謧S^Q\WqMqW(l\k\'k\A\0ʉ(% C(\\|ձރy]\Ͳ\ZyQu{\rv96+\\H)cYj־YfD\\\\'H)3\lWZ#\·\\hƩn&\֧S es\(b\a\\\#$\Zinp)\g3\2Th;\DDDDDDDDDDE,\\^\:Xbʰ\x\֧U2fkY\5\\a{o\n$S4Dzi{DߐI$rʓ:tgMis&K1$ʗ*Iid\3c\9\{\R=\{\g9tV|?~?-\;Uρ\tS\ȉ|\'ɐ\8I2bL\ʸ\AopI*\hĿ\(}O\\D\u7M~r\\\0qqwg8/`G!j\\cr5(\n\[7!ɘ \B\%Uȝm\"\"\"\"\"\"\"\"\"(\\wx\\\ ߲7a9\_n>81x\\QJ˜߳\"dq^1q&kez\\0\\\\\\'\0ffo1\\\;1\ \\Sj1\`n\ZL\-;8kώse^Cp\\*~$\;(\UW\t0iB\Q\y \km\\[DDD\\Ɲ\ZD).\Z,9F7\\0x \V8eǷ-\qG9\\Ȧ\Nm4\\\\0\\5\r\O,;\67b\\0\j`A٫*cf5Sc곈;ȝ@\.Lgn4h\'e3+\[\]\\[ݣS\\(FLfQ%}a\\\DDDDDDDDDE[\\qCu,1~y#v,圌f\5o\ٯ^a\~r\\[\_]\)Z8R\\0\\,\Yt\<#^äS\\N\-kʖ>$r\"[C\\\2x\\yY*|\O\6!q\\Oq\W2n)`ioU\\&(EK#\;%W*-\\]xq\nU\sΥBM\%:OCl\nAn!e\ \\kv\\"\"\"\"\"\"\"\"\"\"/^ :\0\=y5\\\韥RYE\F\el5\\\.ۆWBZ~mnl\0*[\Ə5\V9*S\m\Z\\|r܍ѩ->\\湡kX\R^xj\Z{)aq۽ws.Q\\0\Ȝ?2\\ b;\e\\6nD\N5=Bַ;)\v\"mv\lېLp\\j,6\(aQiIyj\"\"\"\"\"\"\"\"\"\"G+r\'d:\<}ֹ;\\4 \3\ \\l1N\U)rz46\>\=I\\_y\0\7k.\'9\~xq<\[\\\s|DDDDZB\^{PI\\q)\\%oVpjka\nlr9h4 ݜӈKޔ^\\\勍9^Jꦿ\k\\8\ޑU\Y}[\'S(D9s#fDaKia\I\^vGW̓\;V#M;גm\\+@\EG\\vc\g\9h\\u]Eڶm#mGiΫR\ȳ*ad\]U\\`fE}91\r\쌏gה=)լט~$\dAo\6\\\Z\r#xb\Ԥ\\͑(\r}^\\\wB\\\؎G\,4=;k\Ȉ\gM@q*\JG\0}}譓\^OZm?c;WW n,\\\Y\\d6\\L,ìj魝\vr\*\"\"\"\"\"\"\"\"\"\"*U=g\e\:\3ÝD(\N\Q3\Tc\ClX(v\Z\ϑoq&N\9lh\\0۫\\~G9\\8{x\%Ǣ>#\\U\mM\\DGT!9\5PT4@0Ki1\WqG#\\\\y\5Iҵ\DYB\m4\\a7\f4EsZ\b\s湘DDE\\_\\>\0\~w\}Zfk\&Vǽm\\־D\\˝ifx\w<:\\|\ңs\\m#\\rYk坲m(\L6U˾=Z\Z,b-p/<ɹd\\O@3}2 ^\rޞ\\3j:\\\5KG\0\ک\W`FIJ\^C4\')c\\}\\\Ď@\#Q\F&N:=\\\ j\r#o<\\}g\\p\\n\^ZfE>D_4\;\o_fm\\5\\sk\\\=5\qr1Nƹ\+34\fE)\OPN&L9\09:JC\7\j\\'?Mwm|\f\C\[N;ll\+\\\"\Z)\rh\*\1k#X\X\Zuq\"ȐQ\0\s\B7/!JG\\ƹ\{݆˝cʨԃ\7l\Ï5ˉѺ\\\rb\n1\\Çy\\-N\]\|F7aEM$\l*h$R\\rL\\Guo\\\\^\\q\3SN\W8(\\5Z>[5/\x\\Ic<ߙp(-s_PXƄ+VT\5[Ӵ\J\oW\\TQQTF:\\c\ŋX\X\7\v}\R9\+\R=\\+\oz\oyh\Vux\\o&\\MRz\r/;\H\r\T \02:-LRMX\\ruD̮\\f8\\\}\->\\\\\lr\\\\?͎2ȨVmU\i_vQaYD&0\p\V2k\\\=Xu\syUVP> ϳ:j8k\\0߯9oޑyfYLcc.L O6t\,fJ+\*\\G{\\"L\9\\{\G\\s\\_MwN(⟁LʷA\;VrӮ\'jẋ&i4ӨfdC6:\6\a&S\~[x\K\'QL4חX\n\U\\óQ\ێ\\\\U\ZTsg>\\§\z\Wmƚ\\RNعM\"%]o\\͊3\0\"4Qx\\c\qU]G\\==D \VV\:\(0@&\0QcG1f0\e\c\g\\=\4vO\_\kG8\5\.ײ\9d7\0;9\\n\F Ev$J\r~ Xt`{3\6\7J=g[;6rV\4-\'\k2\,Qh^|\,\rvK]\H[wwgfоj1aUֻ_\\\W4\Zr[\\\\uzyrr>f\X\Oō獹N߮J\]f\6g[.IoTY1nqeUy8lO$\ƔP4<\cg\0?\"|\\\^saA\\ȍ\8es+]̗\\rf}~l\N\Hğ8r3Ĝx\c$8\e男|\re1\\\"\"\_\"#]\\\0B~Ga\=|\-6n\\jvM0Y&E$fc\\\\]:\ZRV\\\\\Z\ŕL\`s*\i暺ҺS1aaMx\f\4~1\\6\M\>4\\ߑV꼁\h\g\r\[g-XR,R;G\1\\\x\%^0\@\5hR\8GcM\nds\r\p\&c\\g8s]\]*\[/(\q\\r\nK\UB $˝ca-\#Ǝ\"\sD&qc jx\{xΉ\Zjg*\NaqYw\\GLi\n;\&\\\~ghu\\W\شu\r\\v?dH\v\\Kٶ<\\\\\M\rF@p\)5JR&BĨ\\:/^1\Er\\\ȓQ\\5\[\\\m\\$\cIlL_oY#-S;\^pO[\{Lu\<ԩujGoU3\\%v_Jy\\{e\϶3cDDDDETO;ŵGm\\<\%D\omﭶ\0eƬ\yfOu\Z\gGpCm\\'ؐ\1Z8\+\1}V\d{\Eܟ[I\]SO>\к\\-[*\\氡$\<\VQ\e#DDDDDDDDD^3\q\'W8y\^qܪ^4\\9\\\6<U\\\n\0@\y%\`\R6s\\\*\kTv7|q\R\\~ 5\\0k\_r\'\\\\\\"f*95m!\\\W\ |