diff --git a/.env b/.env index c9d5d9c5..34d924dc 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -CHANGELOG_START_TAG=mstor-1.0.0 +CHANGELOG_START_TAG=mstor-1.0.2 CHANGELOG_END_TAG=HEAD -GRADLE_VERSION=6.9.1 +GRADLE_VERSION=7.6 diff --git a/.github/workflows/publish-site.yml b/.github/workflows/publish-site.yml new file mode 100644 index 00000000..eb8018a6 --- /dev/null +++ b/.github/workflows/publish-site.yml @@ -0,0 +1,17 @@ +name: publish-site +on: + push: + branches: + - master + - feature/refactor +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force + \ No newline at end of file diff --git a/.github/workflows/publish-snapshots.yml b/.github/workflows/publish-snapshots.yml index b50940dc..60d39a96 100644 --- a/.github/workflows/publish-snapshots.yml +++ b/.github/workflows/publish-snapshots.yml @@ -4,6 +4,7 @@ on: push: branches: - 'develop' + - 'feature/refactor' jobs: gradle: diff --git a/.gitignore b/.gitignore index c7d0376f..0a7ccb8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ -/target +target /.settings /.classpath /.project -/build -/.gradle +build +.gradle /bin .idea mstor.iml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 16a02859..00000000 --- a/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -#before_cache: -# - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock -# - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ -cache: - directories: - #- $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ -sudo: false -dist: trusty -language: java -jdk: - - oraclejdk8 - - openjdk8 -env: - - GRADLE_OPTS="-Xmx512m -XX:MaxPermSize=256m" -script: - - ./gradlew build jacocoTestReport -after_success: - - bash <(curl -s https://codecov.io/bash) -deploy: - provider: script - script: ./gradlew -Prelease.customUsername=$GIT_USER -Prelease.customPassword=$GIT_PASSWORD -Prelease.disableChecks -Prelease.pushTagsOnly release bintrayUpload - on: - branch: master - jdk: oraclejdk8 diff --git a/Makefile b/Makefile index 30ba62fd..f107470b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ SHELL:=/bin/bash include .env +NEXT_VERSION=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) + .PHONY: all gradlew clean build changelog currentVersion markNextVersion verify release publish all: test @@ -25,7 +27,6 @@ currentVersion: ./gradlew -q currentVersion markNextVersion: - NEXT_VERSION=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) ./gradlew markNextVersion -Prelease.version=$(NEXT_VERSION) verify: diff --git a/build.gradle b/build.gradle index 26995754..5dc21c52 100644 --- a/build.gradle +++ b/build.gradle @@ -5,13 +5,13 @@ buildscript { } plugins { + id 'java' + id 'java-library' id 'pl.allegro.tech.build.axion-release' version '1.13.3' - id "nebula.provided-base" version "3.0.3" + id "nebula.provided-base" version "7.0.0" id "biz.aQute.bnd.builder" version "$bndVersion" } -apply plugin: 'java' -apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'groovy' //apply plugin: 'checkstyle' @@ -46,7 +46,7 @@ repositories { } dependencies { - api "com.sun.mail:jakarta.mail:$jakartaMailVersion", + api "jakarta.mail:jakarta.mail-api:$jakartaMailVersion", "org.slf4j:slf4j-api:$slf4jVersion" implementation "org.apache.commons:commons-lang3:$commonsLangVersion", @@ -62,13 +62,13 @@ dependencies { "cglib:cglib:$cglibVersion", "org.slf4j:jul-to-slf4j:$slf4jVersion", "org.slf4j:jcl-over-slf4j:$slf4jVersion", "org.apache.jackrabbit:jackrabbit-jcr-rmi:$jackrabbitVersion" - + implementation "org.jparsec:jparsec:$jparsecVersion", optional // used in javadoc generation.. compileOnly 'biz.aQute.bnd:bndlib:2.4.0' - runtime "commons-logging:commons-logging:$commonsLoggingVersion" + runtimeOnly "commons-logging:commons-logging:$commonsLoggingVersion" testImplementation "org.apache.jackrabbit:jackrabbit-core:$jackrabbitVersion", "junit:junit:$junitVersion", @@ -80,6 +80,15 @@ dependencies { // spock testImplementation platform("org.spockframework:spock-bom:2.0-M4-groovy-3.0"), "org.spockframework:spock-core" + + // testcontainers + testImplementation "org.testcontainers:testcontainers:$testcontainersVersion", + "org.testcontainers:spock:$testcontainersVersion" +} + +java { + withJavadocJar() + withSourcesJar() } jacocoTestReport { @@ -98,35 +107,22 @@ javadoc { } } -task javadocJar(type: Jar, dependsOn: javadoc) { - archiveClassifier.set('javadoc') - from 'build/docs/javadoc' -} - -task sourcesJar(type: Jar) { - from sourceSets.main.allSource - archiveClassifier.set('sources') -} - -artifacts { - archives jar - archives javadocJar - archives sourcesJar -} - scmVersion { tag { prefix = 'mstor-' } versionCreator 'versionWithBranch' - branchVersionCreator = ['master': 'simple'] + branchVersionCreator = [ + 'master': 'simple', + 'feature/refactor': 'simple' + ] nextVersion { suffix = 'pre' separator = '-' } } -group = 'org.mnode.mstor' +group = 'org.mstor' description = ''' An mbox provider for JavaMail ''' @@ -137,6 +133,8 @@ ext { } test { + useJUnitPlatform() + include '**/*Test.class' include '**/*Spec.class' @@ -159,8 +157,6 @@ publishing { publications { mstor(MavenPublication) { from components.java - artifact javadocJar - artifact sourcesJar pom.withXml { asNode().appendNode('name', project.name) asNode().appendNode('description', project.description) @@ -186,7 +182,7 @@ publishing { repositories { maven { name = "OSSRH" - url = !isReleaseVersion ? "https://oss.sonatype.org/content/repositories/snapshots/" : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + url = !isReleaseVersion ? "https://s01.oss.sonatype.org/content/repositories/snapshots/" : "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" credentials { username = System.getenv("MAVEN_USERNAME") password = System.getenv("MAVEN_PASSWORD") diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 00000000..44fa03c1 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +www.mstor.org \ No newline at end of file diff --git a/docs/images/cherry.png b/docs/images/cherry.png new file mode 100644 index 00000000..5d157c46 Binary files /dev/null and b/docs/images/cherry.png differ diff --git a/docs/images/mnode_logo.png b/docs/images/mnode_logo.png new file mode 100644 index 00000000..5d3e2404 Binary files /dev/null and b/docs/images/mnode_logo.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..fd79d479 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,31 @@ +# mStor - Universal message archival and storage + +mStor is a Java library that supports persistence of various forms of digital communications, such as Email +and Instant Messaging. + +## Overview + +Messaging specifications typically define encoding and metadata, but are relatively agnostic to the content. +So too is mStor, which focuses on supporting persistence of metadata and a suitably encoded message body. + +## JavaMail + +The origins of mStor are as a JavaMail provider for the unofficial mbox specification. JavaMail is still +supported, however the intention is to also support storage of other communications such as Instant +Messaging via a universal API. This would theoretically allow messages to be stored and retrieved as either +Email or Instant Messaging interchangeably. + +## JMAP + +JMAP is a relatively new API from Fastmail, designed to support Web-based Email clients. + +## Tinkerpop + +Tinkerpop is an open API for interacting with graph databases. This is potentially useful for capturing +relationships between messages, senders and recipients, and can support powerful analytics and reporting +on large data sets. + +## DynamoDB + +DynamoDB is a highly scalable NoSQL database from AWS. It can efficiently store large amounts of metadata +and efficiently query on a well-designed schema. diff --git a/docs/javamail.md b/docs/javamail.md new file mode 100644 index 00000000..d66f7b3f --- /dev/null +++ b/docs/javamail.md @@ -0,0 +1,2 @@ +# MStor Javamail Provider + diff --git a/etc/plugin.xml b/etc/plugin.xml deleted file mode 100644 index 05ecc31c..00000000 --- a/etc/plugin.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 50a0acff..f0fbba3e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,22 @@ -jakartaMailVersion = 1.6.7 -slf4jVersion = 1.7.32 -groovyVersion = 3.0.8 +jakartaMailVersion = 2.1.1 +slf4jVersion = 2.0.7 +groovyVersion = 3.0.17 commonsLangVersion = 3.12.0 commonsNetVersion = 3.8.0 commonsIoVersion = 2.11.0 commonsLoggingVersion = 1.2 cglibVersion = 3.3.0 jdomVersion = 1.1 -xstreamVersion = 1.4.18 +xstreamVersion = 1.4.19 jyamlVersion = 1.3 jcrVersion = 2.0 jcromVersion = 2.2.0 ehcacheVersion = 2.6.11 jparsecVersion = 3.1 -bndVersion = 6.1.0 -jackrabbitVersion = 2.21.9 +jackrabbitVersion = 2.21.10 logbackVersion = 1.2.10 junitVersion = '4.13' + +testcontainersVersion = 1.16.2 +bndVersion = 6.3.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053..e708b1c0 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3ab0b725..070cb702 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fbd7c515..4f906e0c 100755 --- a/gradlew +++ b/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 5093609d..107acd32 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/groovy/net/fortuna/mstor/InternetAddressFactory.groovy b/src/main/groovy/org/mstor/provider/mail/InternetAddressFactory.groovy similarity index 95% rename from src/main/groovy/net/fortuna/mstor/InternetAddressFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/InternetAddressFactory.groovy index fc1d8cd1..db739372 100644 --- a/src/main/groovy/net/fortuna/mstor/InternetAddressFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/InternetAddressFactory.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor +package org.mstor.provider.mail -import javax.mail.Message.RecipientType -import javax.mail.internet.InternetAddress +import jakarta.mail.Message.RecipientType +import jakarta.mail.internet.InternetAddress class InternetAddressFactory extends AbstractFactory { diff --git a/src/main/groovy/net/fortuna/mstor/MessageBuilder.groovy b/src/main/groovy/org/mstor/provider/mail/MessageBuilder.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/MessageBuilder.groovy rename to src/main/groovy/org/mstor/provider/mail/MessageBuilder.groovy index 5e77b5aa..4252a0bb 100644 --- a/src/main/groovy/net/fortuna/mstor/MessageBuilder.groovy +++ b/src/main/groovy/org/mstor/provider/mail/MessageBuilder.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor +package org.mstor.provider.mail -import javax.mail.Message.RecipientType +import jakarta.mail.Message.RecipientType class MessageBuilder extends FactoryBuilderSupport { diff --git a/src/main/groovy/net/fortuna/mstor/MimeMessageFactory.groovy b/src/main/groovy/org/mstor/provider/mail/MimeMessageFactory.groovy similarity index 95% rename from src/main/groovy/net/fortuna/mstor/MimeMessageFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/MimeMessageFactory.groovy index 635c58fc..1db4bd03 100644 --- a/src/main/groovy/net/fortuna/mstor/MimeMessageFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/MimeMessageFactory.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor +package org.mstor.provider.mail -import javax.mail.Session -import javax.mail.internet.MimeMessage +import jakarta.mail.Session +import jakarta.mail.internet.MimeMessage class MimeMessageFactory extends AbstractFactory { diff --git a/src/main/groovy/net/fortuna/mstor/SessionFactory.groovy b/src/main/groovy/org/mstor/provider/mail/SessionFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/SessionFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/SessionFactory.groovy index 5b814d8c..2e3c9ff2 100644 --- a/src/main/groovy/net/fortuna/mstor/SessionFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/SessionFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor +package org.mstor.provider.mail -import javax.mail.Session +import jakarta.mail.Session class SessionFactory extends AbstractFactory { diff --git a/src/main/groovy/net/fortuna/mstor/search/AndTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/AndTermFactory.groovy similarity index 95% rename from src/main/groovy/net/fortuna/mstor/search/AndTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/AndTermFactory.groovy index 18316238..1f9af610 100644 --- a/src/main/groovy/net/fortuna/mstor/search/AndTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/AndTermFactory.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.AndTerm -import javax.mail.search.SearchTerm +import jakarta.mail.search.AndTerm +import jakarta.mail.search.SearchTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/BodyTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/BodyTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/BodyTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/BodyTermFactory.groovy index 6d521418..125369e0 100644 --- a/src/main/groovy/net/fortuna/mstor/search/BodyTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/BodyTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.BodyTerm +import jakarta.mail.search.BodyTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/FlagTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/FlagTermFactory.groovy similarity index 95% rename from src/main/groovy/net/fortuna/mstor/search/FlagTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/FlagTermFactory.groovy index 95309500..aabaebe4 100644 --- a/src/main/groovy/net/fortuna/mstor/search/FlagTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/FlagTermFactory.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.Flags -import javax.mail.search.FlagTerm +import jakarta.mail.Flags +import jakarta.mail.search.FlagTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/FromStringTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/FromStringTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/FromStringTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/FromStringTermFactory.groovy index baba0e64..6243d393 100644 --- a/src/main/groovy/net/fortuna/mstor/search/FromStringTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/FromStringTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.FromStringTerm +import jakarta.mail.search.FromStringTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/FromTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/FromTermFactory.groovy similarity index 93% rename from src/main/groovy/net/fortuna/mstor/search/FromTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/FromTermFactory.groovy index 8bb9a650..cf58c70a 100644 --- a/src/main/groovy/net/fortuna/mstor/search/FromTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/FromTermFactory.groovy @@ -29,11 +29,11 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.Address -import javax.mail.internet.InternetAddress -import javax.mail.search.FromTerm +import jakarta.mail.Address +import jakarta.mail.internet.InternetAddress +import jakarta.mail.search.FromTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/HeaderTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/HeaderTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/HeaderTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/HeaderTermFactory.groovy index 3afb6847..ad4b2077 100644 --- a/src/main/groovy/net/fortuna/mstor/search/HeaderTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/HeaderTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.HeaderTerm +import jakarta.mail.search.HeaderTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/InReplyToTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/InReplyToTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/InReplyToTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/InReplyToTermFactory.groovy index ff436e5b..d432e174 100644 --- a/src/main/groovy/net/fortuna/mstor/search/InReplyToTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/InReplyToTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import net.fortuna.mstor.model.MStorMessage +import org.mstor.provider.mail.MStorMessage /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/MessageIDTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/MessageIDTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/MessageIDTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/MessageIDTermFactory.groovy index e87e7457..63705227 100644 --- a/src/main/groovy/net/fortuna/mstor/search/MessageIDTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/MessageIDTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.MessageIDTerm +import jakarta.mail.search.MessageIDTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/MessageNumberTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/MessageNumberTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/MessageNumberTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/MessageNumberTermFactory.groovy index 0a91897a..1e42ede1 100644 --- a/src/main/groovy/net/fortuna/mstor/search/MessageNumberTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/MessageNumberTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.MessageNumberTerm +import jakarta.mail.search.MessageNumberTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/NotTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/NotTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/NotTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/NotTermFactory.groovy index 4436dc24..52d17de3 100644 --- a/src/main/groovy/net/fortuna/mstor/search/NotTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/NotTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.NotTerm +import jakarta.mail.search.NotTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/OrTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/OrTermFactory.groovy similarity index 95% rename from src/main/groovy/net/fortuna/mstor/search/OrTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/OrTermFactory.groovy index b3f030fd..5a5a07fc 100644 --- a/src/main/groovy/net/fortuna/mstor/search/OrTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/OrTermFactory.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.OrTerm -import javax.mail.search.SearchTerm +import jakarta.mail.search.OrTerm +import jakarta.mail.search.SearchTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/ReceivedDateTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/ReceivedDateTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/ReceivedDateTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/ReceivedDateTermFactory.groovy index f63bdf16..a89cceee 100644 --- a/src/main/groovy/net/fortuna/mstor/search/ReceivedDateTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/ReceivedDateTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.ReceivedDateTerm +import jakarta.mail.search.ReceivedDateTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/RecipientStringTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/RecipientStringTermFactory.groovy similarity index 94% rename from src/main/groovy/net/fortuna/mstor/search/RecipientStringTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/RecipientStringTermFactory.groovy index 008740ec..b125eab3 100644 --- a/src/main/groovy/net/fortuna/mstor/search/RecipientStringTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/RecipientStringTermFactory.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.Message.RecipientType -import javax.mail.search.RecipientStringTerm +import jakarta.mail.Message.RecipientType +import jakarta.mail.search.RecipientStringTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/RecipientTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/RecipientTermFactory.groovy similarity index 91% rename from src/main/groovy/net/fortuna/mstor/search/RecipientTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/RecipientTermFactory.groovy index 5deb4a1d..118bb7d5 100644 --- a/src/main/groovy/net/fortuna/mstor/search/RecipientTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/RecipientTermFactory.groovy @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.Address -import javax.mail.Message.RecipientType -import javax.mail.internet.InternetAddress -import javax.mail.search.RecipientTerm +import jakarta.mail.Address +import jakarta.mail.Message.RecipientType +import jakarta.mail.internet.InternetAddress +import jakarta.mail.search.RecipientTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/ReferencesTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/ReferencesTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/ReferencesTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/ReferencesTermFactory.groovy index 830bee0f..1ac6a23f 100644 --- a/src/main/groovy/net/fortuna/mstor/search/ReferencesTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/ReferencesTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import net.fortuna.mstor.model.MStorMessage +import org.mstor.provider.mail.MStorMessage /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/SearchTermBuilder.groovy b/src/main/groovy/org/mstor/provider/mail/search/SearchTermBuilder.groovy similarity index 97% rename from src/main/groovy/net/fortuna/mstor/search/SearchTermBuilder.groovy rename to src/main/groovy/org/mstor/provider/mail/search/SearchTermBuilder.groovy index 0d181fa2..4a7588f9 100644 --- a/src/main/groovy/net/fortuna/mstor/search/SearchTermBuilder.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/SearchTermBuilder.groovy @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.Message.RecipientType -import javax.mail.search.ComparisonTerm +import jakarta.mail.Message.RecipientType +import jakarta.mail.search.ComparisonTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/SentDateTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/SentDateTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/SentDateTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/SentDateTermFactory.groovy index e0d2cf5a..81f957ae 100644 --- a/src/main/groovy/net/fortuna/mstor/search/SentDateTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/SentDateTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.SentDateTerm +import jakarta.mail.search.SentDateTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/SizeTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/SizeTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/SizeTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/SizeTermFactory.groovy index a8024787..8f113287 100644 --- a/src/main/groovy/net/fortuna/mstor/search/SizeTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/SizeTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.SizeTerm +import jakarta.mail.search.SizeTerm /** * @author Ben diff --git a/src/main/groovy/net/fortuna/mstor/search/SubjectTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/SubjectTermFactory.groovy similarity index 96% rename from src/main/groovy/net/fortuna/mstor/search/SubjectTermFactory.groovy rename to src/main/groovy/org/mstor/provider/mail/search/SubjectTermFactory.groovy index 306ef339..99d724b1 100644 --- a/src/main/groovy/net/fortuna/mstor/search/SubjectTermFactory.groovy +++ b/src/main/groovy/org/mstor/provider/mail/search/SubjectTermFactory.groovy @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search +package org.mstor.provider.mail.search -import javax.mail.search.SubjectTerm +import jakarta.mail.search.SubjectTerm /** * @author Ben diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrConnector.java b/src/main/java/org/mstor/connector/jcr/JcrConnector.java similarity index 85% rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrConnector.java rename to src/main/java/org/mstor/connector/jcr/JcrConnector.java index 6bcd9e26..ffdbf156 100644 --- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrConnector.java +++ b/src/main/java/org/mstor/connector/jcr/JcrConnector.java @@ -29,18 +29,17 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; -import net.fortuna.mstor.connector.AbstractProtocolConnector; -import net.fortuna.mstor.model.MStorFolder; -import net.fortuna.mstor.model.MStorStore; +import jakarta.mail.*; import org.apache.commons.lang3.StringUtils; import org.apache.jackrabbit.rmi.client.ClientRepositoryFactory; import org.jcrom.Jcrom; +import org.mstor.provider.mail.AbstractProtocolConnector; +import org.mstor.provider.mail.MStorStore; import javax.jcr.Session; import javax.jcr.*; -import javax.mail.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -62,13 +61,13 @@ public class JcrConnector extends AbstractProtocolConnector { private Session session; - private final javax.mail.Session mailSession; + private final jakarta.mail.Session mailSession; /** * @param url * @param store */ - public JcrConnector(URLName url, MStorStore store, javax.mail.Session session) { + public JcrConnector(URLName url, MStorStore store, jakarta.mail.Session session) { super(url, store); this.mailSession = session; @@ -138,28 +137,28 @@ public void disconnect() { /** * {@inheritDoc} */ - public Folder getDefaultFolder() throws MessagingException { - JcrFolder delegate = jcrom.fromNode(JcrFolder.class, getNode()); - delegate.setConnector(this); - if (!delegate.exists()) { - delegate.create(Folder.HOLDS_FOLDERS); - } - return new MStorFolder(store, delegate); - } +// public Folder getDefaultFolder() throws MessagingException { +// JcrFolder delegate = jcrom.fromNode(JcrFolder.class, getNode()); +// delegate.setConnector(this); +// if (!delegate.exists()) { +// delegate.create(Folder.HOLDS_FOLDERS); +// } +// return new MStorFolder(store, delegate); +// } /** * {@inheritDoc} */ - public Folder getFolder(String name) throws MessagingException { - return getDefaultFolder().getFolder(name); - } +// public Folder getFolder(String name) throws MessagingException { +// return getDefaultFolder().getFolder(name); +// } /** * {@inheritDoc} */ - public Folder getFolder(URLName url) throws MessagingException { - return getDefaultFolder().getFolder(url.getFile()); - } +// public Folder getFolder(URLName url) throws MessagingException { +// return getDefaultFolder().getFolder(url.getFile()); +// } /** * @return the jcrom instance @@ -216,4 +215,24 @@ private Node getNode() throws MessagingException { throw new MessagingException("Unexpected error", e); } } + + @Override + public boolean isProtocolSupported(String protocol) { + return false; + } + + @Override + public Folder getDefaultFolder() throws MessagingException { + return null; + } + + @Override + public Folder getFolder(String name) throws MessagingException { + return null; + } + + @Override + public Folder getFolder(URLName url) throws MessagingException { + return null; + } } diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolder.java b/src/main/java/org/mstor/connector/jcr/JcrFolder.java similarity index 97% rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrFolder.java rename to src/main/java/org/mstor/connector/jcr/JcrFolder.java index 3ef59fb2..aa26f366 100644 --- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolder.java +++ b/src/main/java/org/mstor/connector/jcr/JcrFolder.java @@ -29,24 +29,24 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.util.MessageUtils; +import jakarta.mail.Flags.Flag; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.jcrom.AbstractJcrEntity; import org.jcrom.JcrMappingException; import org.jcrom.annotations.JcrProperty; +import org.mstor.provider.mail.FolderDelegate; +import org.mstor.provider.mail.MessageDelegate; +import org.mstor.provider.mail.MessageUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.jcr.Node; import javax.jcr.RepositoryException; -import javax.mail.Flags.Flag; -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.IOException; import java.io.InputStream; import java.util.Date; @@ -65,7 +65,7 @@ */ public class JcrFolder extends AbstractJcrEntity implements FolderDelegate { - private static final Log LOG = LogFactory.getLog(JcrFolder.class); + private static final Logger LOG = LoggerFactory.getLogger(JcrFolder.class); /** * diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolderDao.java b/src/main/java/org/mstor/connector/jcr/JcrFolderDao.java similarity index 98% rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrFolderDao.java rename to src/main/java/org/mstor/connector/jcr/JcrFolderDao.java index a0d910c7..588bad73 100644 --- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolderDao.java +++ b/src/main/java/org/mstor/connector/jcr/JcrFolderDao.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; import org.jcrom.Jcrom; import org.jcrom.dao.AbstractJcrDAO; diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessage.java b/src/main/java/org/mstor/connector/jcr/JcrMessage.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrMessage.java rename to src/main/java/org/mstor/connector/jcr/JcrMessage.java index 34048273..f5866d6f 100644 --- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessage.java +++ b/src/main/java/org/mstor/connector/jcr/JcrMessage.java @@ -29,11 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.model.MStorMessage; -import net.fortuna.mstor.util.MessageUtils; +import jakarta.mail.*; +import jakarta.mail.Flags.Flag; +import jakarta.mail.internet.InternetHeaders; +import jakarta.mail.internet.MimeMessage; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.jcrom.AbstractJcrEntity; @@ -43,18 +44,16 @@ import org.jcrom.annotations.JcrFileNode; import org.jcrom.annotations.JcrProperty; import org.jcrom.annotations.JcrReference; +import org.mstor.provider.mail.MessageDelegate; +import org.mstor.provider.mail.MessageUtils; -import javax.mail.*; -import javax.mail.Flags.Flag; -import javax.mail.internet.InternetHeaders; -import javax.mail.internet.MimeMessage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; -import static net.fortuna.mstor.util.MessageUtils.getFlag; -import static net.fortuna.mstor.util.MessageUtils.getFlagName; +import static org.mstor.provider.mail.MessageUtils.getFlag; +import static org.mstor.provider.mail.MessageUtils.getFlagName; /** * @author Ben @@ -349,9 +348,8 @@ private void appendAttachments(final Part part) throws MessagingException, IOExc Message attachedMessage; if (part.getContent() instanceof Message) { attachedMessage = (Message) part.getContent(); - } - else { - attachedMessage = new MStorMessage(null, (InputStream) part.getContent()); + } else { + attachedMessage = new MimeMessage(null, (InputStream) part.getContent()); } jcrMessage.setFlags(attachedMessage.getFlags()); jcrMessage.setHeaders(attachedMessage.getAllHeaders()); diff --git a/src/main/java/org/mstor/connector/jcr/JcrMessageCollection.java b/src/main/java/org/mstor/connector/jcr/JcrMessageCollection.java new file mode 100644 index 00000000..e6de3f48 --- /dev/null +++ b/src/main/java/org/mstor/connector/jcr/JcrMessageCollection.java @@ -0,0 +1,61 @@ +package org.mstor.connector.jcr; + +import org.mstor.filter.FilterExpression; +import org.mstor.model.Message; +import org.mstor.model.MessageCollection; + +import java.util.List; +import java.util.Set; + +public class JcrMessageCollection implements MessageCollection { + + @Override + public void addLabel(String label) { + + } + + @Override + public void removeLabel(String label) { + + } + + @Override + public Set getLabels() { + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public MessageCollection getParent() { + return null; + } + + @Override + public List getCollections() { + return null; + } + + @Override + public int getMessageCount() { + return 0; + } + + @Override + public Iterable listMessages(int offset, int length) { + return null; + } + + @Override + public Iterable query(FilterExpression filterExpression) { + return null; + } + + @Override + public Message getMessage(String messageId) { + return null; + } +} diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessageDao.java b/src/main/java/org/mstor/connector/jcr/JcrMessageDao.java similarity index 97% rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrMessageDao.java rename to src/main/java/org/mstor/connector/jcr/JcrMessageDao.java index 0795df8d..ce3cd562 100644 --- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessageDao.java +++ b/src/main/java/org/mstor/connector/jcr/JcrMessageDao.java @@ -29,15 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; -import net.fortuna.mstor.util.MessageUtils; +import jakarta.mail.Flags.Flag; import org.jcrom.Jcrom; import org.jcrom.dao.AbstractJcrDAO; import org.jcrom.util.NodeFilter; +import org.mstor.provider.mail.MessageUtils; import javax.jcr.Session; -import javax.mail.Flags.Flag; import java.util.List; /** diff --git a/src/main/java/org/mstor/connector/jcr/JcrMessageStore.java b/src/main/java/org/mstor/connector/jcr/JcrMessageStore.java new file mode 100644 index 00000000..315175fb --- /dev/null +++ b/src/main/java/org/mstor/connector/jcr/JcrMessageStore.java @@ -0,0 +1,29 @@ +package org.mstor.connector.jcr; + +import org.mstor.model.MessageCollection; +import org.mstor.model.MessageStore; + +import java.util.List; + +public class JcrMessageStore implements MessageStore { + + @Override + public void connect() { + + } + + @Override + public void disconnect() { + + } + + @Override + public List getCollections() { + return null; + } + + @Override + public MessageCollection getCollection(String collectionId) { + return null; + } +} diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/AbstractMetaFolder.java b/src/main/java/org/mstor/connector/mbox/AbstractMetaFolder.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/mbox/AbstractMetaFolder.java rename to src/main/java/org/mstor/connector/mbox/AbstractMetaFolder.java index 12e5e5ca..36f5b3be 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/AbstractMetaFolder.java +++ b/src/main/java/org/mstor/connector/mbox/AbstractMetaFolder.java @@ -29,15 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.connector.AbstractFolderDelegate; -import net.fortuna.mstor.connector.DelegateException; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import org.mstor.provider.mail.AbstractFolderDelegate; +import org.mstor.provider.mail.DelegateException; +import org.mstor.provider.mail.FolderDelegate; +import org.mstor.provider.mail.MessageDelegate; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.File; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MboxConnector.java b/src/main/java/org/mstor/connector/mbox/MboxConnector.java similarity index 90% rename from src/main/java/net/fortuna/mstor/connector/mbox/MboxConnector.java rename to src/main/java/org/mstor/connector/mbox/MboxConnector.java index 1b44acb7..390cdf09 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/MboxConnector.java +++ b/src/main/java/org/mstor/connector/mbox/MboxConnector.java @@ -29,16 +29,16 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.connector.AbstractProtocolConnector; -import net.fortuna.mstor.model.MStorFolder; -import net.fortuna.mstor.model.MStorStore; -import net.fortuna.mstor.util.Configurator; +import jakarta.mail.Folder; +import jakarta.mail.Session; +import jakarta.mail.URLName; +import org.mstor.provider.mail.AbstractProtocolConnector; +import org.mstor.provider.mail.MStorFolder; +import org.mstor.provider.mail.MStorStore; +import org.mstor.util.Configurator; -import javax.mail.Folder; -import javax.mail.Session; -import javax.mail.URLName; import java.io.File; /** @@ -145,4 +145,9 @@ else if (MetadataStrategy.NONE.equals(metadataStrategy)) { public Folder getFolder(URLName url) { return getFolder(url.getFile()); } + + @Override + public boolean isProtocolSupported(String protocol) { + return "mstor".equalsIgnoreCase(protocol); + } } diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MboxFolder.java b/src/main/java/org/mstor/connector/mbox/MboxFolder.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/mbox/MboxFolder.java rename to src/main/java/org/mstor/connector/mbox/MboxFolder.java index 76c98e68..1d76da75 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/MboxFolder.java +++ b/src/main/java/org/mstor/connector/mbox/MboxFolder.java @@ -29,19 +29,19 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.connector.AbstractFolderDelegate; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.data.MboxFile; -import net.fortuna.mstor.util.CapabilityHints; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import org.mstor.data.MboxFile; +import org.mstor.provider.mail.AbstractFolderDelegate; +import org.mstor.provider.mail.FolderDelegate; +import org.mstor.provider.mail.MessageDelegate; +import org.mstor.util.CapabilityHints; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.*; import java.util.ArrayList; import java.util.List; @@ -75,7 +75,7 @@ else if (pathname.getName().endsWith(DIR_EXTENSION)) { || pathname.length() < 0 || MboxFile.isValid(pathname); }; - private final Log log = LogFactory.getLog(MboxFolder.class); + private final Logger log = LoggerFactory.getLogger(MboxFolder.class); private final File file; diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MetaFolder.java b/src/main/java/org/mstor/connector/mbox/MetaFolder.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/mbox/MetaFolder.java rename to src/main/java/org/mstor/connector/mbox/MetaFolder.java index cdc6ce72..28b87b27 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/MetaFolder.java +++ b/src/main/java/org/mstor/connector/mbox/MetaFolder.java @@ -29,17 +29,17 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.connector.DelegateException; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.data.xml.DocumentBinding; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; import org.jdom.Element; import org.jdom.Namespace; +import org.mstor.data.xml.DocumentBinding; +import org.mstor.provider.mail.DelegateException; +import org.mstor.provider.mail.FolderDelegate; +import org.mstor.provider.mail.MessageDelegate; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; @@ -125,7 +125,7 @@ public MetaFolder[] list(String pattern) { /* * (non-Javadoc) * - * @see net.fortuna.mstor.data.MetaFolder#setName(java.lang.String) + * @see org.mstor.mail.data.MetaFolder#setName(java.lang.String) */ /* private final void setName(final String name) { @@ -189,7 +189,7 @@ private void addMessage(final MessageDelegate message) { /* * (non-Javadoc) * - * @see net.fortuna.mstor.data.MetaFolder#removeMessage(java.lang.String) + * @see org.mstor.mail.data.MetaFolder#removeMessage(java.lang.String) */ /* private final MessageDelegate removeMessage(final int messageNumber) { diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MetaMessage.java b/src/main/java/org/mstor/connector/mbox/MetaMessage.java similarity index 93% rename from src/main/java/net/fortuna/mstor/connector/mbox/MetaMessage.java rename to src/main/java/org/mstor/connector/mbox/MetaMessage.java index cc7f6a83..3fbe8513 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/MetaMessage.java +++ b/src/main/java/org/mstor/connector/mbox/MetaMessage.java @@ -29,24 +29,24 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; - -import net.fortuna.mstor.connector.AbstractMessageDelegate; -import net.fortuna.mstor.connector.DelegateException; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.data.MboxFile; -import net.fortuna.mstor.data.xml.ElementBinding; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +package org.mstor.connector.mbox; + +import jakarta.mail.Flags; +import jakarta.mail.Flags.Flag; +import jakarta.mail.Header; +import jakarta.mail.internet.InternetHeaders; import org.jdom.Element; import org.jdom.IllegalDataException; import org.jdom.IllegalNameException; import org.jdom.Namespace; +import org.mstor.data.MboxFile; +import org.mstor.data.xml.ElementBinding; +import org.mstor.provider.mail.AbstractMessageDelegate; +import org.mstor.provider.mail.DelegateException; +import org.mstor.provider.mail.MessageDelegate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.Flags; -import javax.mail.Flags.Flag; -import javax.mail.Header; -import javax.mail.internet.InternetHeaders; import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -55,8 +55,8 @@ import java.util.List; import java.util.Locale; -import static net.fortuna.mstor.util.MessageUtils.getFlag; -import static net.fortuna.mstor.util.MessageUtils.getFlagName; +import static org.mstor.provider.mail.MessageUtils.getFlag; +import static org.mstor.provider.mail.MessageUtils.getFlagName; /** * A JDOM-based implementation of a meta message. @@ -99,7 +99,7 @@ public class MetaMessage extends AbstractMessageDelegate { private static final DateFormat MESSAGE_DATE_FORMAT = new SimpleDateFormat( META_DATE_PATTERN, Locale.US); - private final Log log = LogFactory.getLog(MetaMessage.class); + private final Logger log = LoggerFactory.getLogger(MetaMessage.class); private final ElementBinding binding; @@ -328,7 +328,7 @@ public final void setHeaders(final Enumeration
headers) { log.warn("Invalid header (ignored): " + header.getName() + "=" + header.getValue()); if (log.isDebugEnabled()) { - log.debug(ine); + log.debug("Unexpected exception", ine); } } } diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaFolder.java b/src/main/java/org/mstor/connector/mbox/YamlMetaFolder.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaFolder.java rename to src/main/java/org/mstor/connector/mbox/YamlMetaFolder.java index aea5bc6e..76514434 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaFolder.java +++ b/src/main/java/org/mstor/connector/mbox/YamlMetaFolder.java @@ -29,19 +29,19 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.connector.DelegateException; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.data.yaml.FolderExt; -import net.fortuna.mstor.data.yaml.MessageExt; +import jakarta.mail.Flags; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; import org.ho.yaml.Yaml; import org.ho.yaml.YamlDecoder; +import org.mstor.data.yaml.FolderExt; +import org.mstor.data.yaml.MessageExt; +import org.mstor.provider.mail.DelegateException; +import org.mstor.provider.mail.FolderDelegate; +import org.mstor.provider.mail.MessageDelegate; -import javax.mail.Flags; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaMessage.java b/src/main/java/org/mstor/connector/mbox/YamlMetaMessage.java similarity index 93% rename from src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaMessage.java rename to src/main/java/org/mstor/connector/mbox/YamlMetaMessage.java index a1471e91..57223387 100755 --- a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaMessage.java +++ b/src/main/java/org/mstor/connector/mbox/YamlMetaMessage.java @@ -29,16 +29,16 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.connector.AbstractMessageDelegate; -import net.fortuna.mstor.connector.DelegateException; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.data.yaml.MessageExt; +import jakarta.mail.Flags; +import jakarta.mail.Header; +import jakarta.mail.internet.InternetHeaders; +import org.mstor.data.yaml.MessageExt; +import org.mstor.provider.mail.AbstractMessageDelegate; +import org.mstor.provider.mail.DelegateException; +import org.mstor.provider.mail.MessageDelegate; -import javax.mail.Flags; -import javax.mail.Header; -import javax.mail.internet.InternetHeaders; import java.io.InputStream; import java.util.Date; import java.util.Enumeration; diff --git a/src/main/java/net/fortuna/mstor/connector/nntp/NntpConnector.java b/src/main/java/org/mstor/connector/nntp/NntpConnector.java similarity index 81% rename from src/main/java/net/fortuna/mstor/connector/nntp/NntpConnector.java rename to src/main/java/org/mstor/connector/nntp/NntpConnector.java index 9f3fa12c..bac212dc 100644 --- a/src/main/java/net/fortuna/mstor/connector/nntp/NntpConnector.java +++ b/src/main/java/org/mstor/connector/nntp/NntpConnector.java @@ -29,15 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.nntp; +package org.mstor.connector.nntp; -import net.fortuna.mstor.connector.AbstractProtocolConnector; -import net.fortuna.mstor.model.MStorStore; +import jakarta.mail.Folder; +import jakarta.mail.MessagingException; +import jakarta.mail.URLName; import org.apache.commons.net.nntp.NNTPClient; +import org.mstor.provider.mail.AbstractProtocolConnector; +import org.mstor.provider.mail.MStorStore; -import javax.mail.Folder; -import javax.mail.MessagingException; -import javax.mail.URLName; import java.io.IOException; /** @@ -54,7 +54,8 @@ public class NntpConnector extends AbstractProtocolConnector { private final NNTPClient client; - + + /** * @param url * @param store @@ -65,7 +66,7 @@ public NntpConnector(URLName url, MStorStore store) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.ProtocolConnector#connect(java.lang.String, int, java.lang.String, java.lang.String) + * @see org.mstor.mail.connector.ProtocolConnector#connect(java.lang.String, int, java.lang.String, java.lang.String) */ public boolean connect() { /* @@ -89,7 +90,7 @@ public boolean connect() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.ProtocolConnector#disconnect() + * @see org.mstor.mail.connector.ProtocolConnector#disconnect() */ public void disconnect() throws MessagingException { try { @@ -101,7 +102,7 @@ public void disconnect() throws MessagingException { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.ProtocolConnector#getDefaultFolder() + * @see org.mstor.mail.connector.ProtocolConnector#getDefaultFolder() */ public Folder getDefaultFolder() { // TODO Auto-generated method stub @@ -109,7 +110,7 @@ public Folder getDefaultFolder() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.ProtocolConnector#getFolder(java.lang.String) + * @see org.mstor.mail.connector.ProtocolConnector#getFolder(java.lang.String) */ public Folder getFolder(String name) { // TODO Auto-generated method stub @@ -117,11 +118,15 @@ public Folder getFolder(String name) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.ProtocolConnector#getFolder(javax.mail.URLName) + * @see org.mstor.mail.connector.ProtocolConnector#getFolder(jakarta.mail.URLName) */ public Folder getFolder(URLName url) { // TODO Auto-generated method stub return null; } + @Override + public boolean isProtocolSupported(String protocol) { + return false; + } } diff --git a/src/main/java/net/fortuna/mstor/connector/nntp/NntpFolder.java b/src/main/java/org/mstor/connector/nntp/NntpFolder.java similarity index 73% rename from src/main/java/net/fortuna/mstor/connector/nntp/NntpFolder.java rename to src/main/java/org/mstor/connector/nntp/NntpFolder.java index 44242def..bd8948cb 100644 --- a/src/main/java/net/fortuna/mstor/connector/nntp/NntpFolder.java +++ b/src/main/java/org/mstor/connector/nntp/NntpFolder.java @@ -29,16 +29,16 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.nntp; +package org.mstor.connector.nntp; -import net.fortuna.mstor.connector.AbstractFolderDelegate; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; +import jakarta.mail.Folder; +import jakarta.mail.Message; import org.apache.commons.net.nntp.NNTPClient; import org.apache.commons.net.nntp.NewsgroupInfo; +import org.mstor.provider.mail.AbstractFolderDelegate; +import org.mstor.provider.mail.FolderDelegate; +import org.mstor.provider.mail.MessageDelegate; -import javax.mail.Folder; -import javax.mail.Message; import java.io.InputStream; /** @@ -67,7 +67,7 @@ public NntpFolder(NewsgroupInfo newsgroupInfo, NNTPClient client) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.AbstractFolderDelegate#createMessage(int) + * @see org.mstor.mail.connector.AbstractFolderDelegate#createMessage(int) */ protected MessageDelegate createMessage(int messageNumber) { // TODO Auto-generated method stub @@ -75,7 +75,7 @@ protected MessageDelegate createMessage(int messageNumber) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.AbstractFolderDelegate#setLastUid(long) + * @see org.mstor.mail.connector.AbstractFolderDelegate#setLastUid(long) */ protected void setLastUid(long uid) throws UnsupportedOperationException { // TODO Auto-generated method stub @@ -83,7 +83,7 @@ protected void setLastUid(long uid) throws UnsupportedOperationException { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#appendMessages(javax.mail.Message[]) + * @see org.mstor.mail.connector.FolderDelegate#appendMessages(jakarta.mail.Message[]) */ public void appendMessages(Message[] messages) { // TODO Auto-generated method stub @@ -91,7 +91,7 @@ public void appendMessages(Message[] messages) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#close() + * @see org.mstor.mail.connector.FolderDelegate#close() */ public void close() { // TODO Auto-generated method stub @@ -99,7 +99,7 @@ public void close() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#create(int) + * @see org.mstor.mail.connector.FolderDelegate#create(int) */ public boolean create(int type) { // TODO Auto-generated method stub @@ -107,7 +107,7 @@ public boolean create(int type) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#delete() + * @see org.mstor.mail.connector.FolderDelegate#delete() */ public boolean delete() { // TODO Auto-generated method stub @@ -115,7 +115,7 @@ public boolean delete() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#exists() + * @see org.mstor.mail.connector.FolderDelegate#exists() */ public boolean exists() { // TODO Auto-generated method stub @@ -123,7 +123,7 @@ public boolean exists() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#expunge(javax.mail.Message[]) + * @see org.mstor.mail.connector.FolderDelegate#expunge(jakarta.mail.Message[]) */ public void expunge(Message[] deleted) { // TODO Auto-generated method stub @@ -131,7 +131,7 @@ public void expunge(Message[] deleted) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getFolder(java.lang.String) + * @see org.mstor.mail.connector.FolderDelegate#getFolder(java.lang.String) */ public FolderDelegate getFolder(String name) { // TODO Auto-generated method stub @@ -139,7 +139,7 @@ public FolderDelegate getFolder(String name) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getFullName() + * @see org.mstor.mail.connector.FolderDelegate#getFullName() */ public String getFullName() { // TODO Auto-generated method stub @@ -147,7 +147,7 @@ public String getFullName() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getLastModified() + * @see org.mstor.mail.connector.FolderDelegate#getLastModified() */ public long getLastModified() throws UnsupportedOperationException { // TODO Auto-generated method stub @@ -155,7 +155,7 @@ public long getLastModified() throws UnsupportedOperationException { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getLastUid() + * @see org.mstor.mail.connector.FolderDelegate#getLastUid() */ public long getLastUid() throws UnsupportedOperationException { // TODO Auto-generated method stub @@ -163,7 +163,7 @@ public long getLastUid() throws UnsupportedOperationException { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getMessage(int) + * @see org.mstor.mail.connector.FolderDelegate#getMessage(int) */ public MessageDelegate getMessage(int messageNumber) { // TODO Auto-generated method stub @@ -171,7 +171,7 @@ public MessageDelegate getMessage(int messageNumber) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getMessageAsStream(int) + * @see org.mstor.mail.connector.FolderDelegate#getMessageAsStream(int) */ public InputStream getMessageAsStream(int index) { // TODO Auto-generated method stub @@ -179,21 +179,21 @@ public InputStream getMessageAsStream(int index) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getMessageCount() + * @see org.mstor.mail.connector.FolderDelegate#getMessageCount() */ public int getMessageCount() { return newsgroupInfo.getArticleCount(); } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getFolderName() + * @see org.mstor.mail.connector.FolderDelegate#getFolderName() */ public String getFolderName() { return newsgroupInfo.getNewsgroup(); } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getParent() + * @see org.mstor.mail.connector.FolderDelegate#getParent() */ public FolderDelegate getParent() { // TODO Auto-generated method stub @@ -201,7 +201,7 @@ public FolderDelegate getParent() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getSeparator() + * @see org.mstor.mail.connector.FolderDelegate#getSeparator() */ public char getSeparator() { // TODO Auto-generated method stub @@ -209,14 +209,14 @@ public char getSeparator() { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getType() + * @see org.mstor.mail.connector.FolderDelegate#getType() */ public int getType() { return Folder.HOLDS_MESSAGES; } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#getUidValidity() + * @see org.mstor.mail.connector.FolderDelegate#getUidValidity() */ public long getUidValidity() throws UnsupportedOperationException { // TODO Auto-generated method stub @@ -224,7 +224,7 @@ public long getUidValidity() throws UnsupportedOperationException { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#list(java.lang.String) + * @see org.mstor.mail.connector.FolderDelegate#list(java.lang.String) */ public FolderDelegate[] list(String pattern) { // TODO Auto-generated method stub @@ -232,7 +232,7 @@ public FolderDelegate[] list(String pattern) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#open(int) + * @see org.mstor.mail.connector.FolderDelegate#open(int) */ public void open(int mode) { // TODO Auto-generated method stub @@ -240,7 +240,7 @@ public void open(int mode) { } /* (non-Javadoc) - * @see net.fortuna.mstor.connector.FolderDelegate#renameTo(java.lang.String) + * @see org.mstor.mail.connector.FolderDelegate#renameTo(java.lang.String) */ public boolean renameTo(String name) { // TODO Auto-generated method stub diff --git a/src/main/java/net/fortuna/mstor/data/MboxEncoder.java b/src/main/java/org/mstor/data/MboxEncoder.java similarity index 99% rename from src/main/java/net/fortuna/mstor/data/MboxEncoder.java rename to src/main/java/org/mstor/data/MboxEncoder.java index 38c2e94e..f0949cb2 100755 --- a/src/main/java/net/fortuna/mstor/data/MboxEncoder.java +++ b/src/main/java/org/mstor/data/MboxEncoder.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; +package org.mstor.data; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/src/main/java/net/fortuna/mstor/data/MboxFile.java b/src/main/java/org/mstor/data/MboxFile.java similarity index 97% rename from src/main/java/net/fortuna/mstor/data/MboxFile.java rename to src/main/java/org/mstor/data/MboxFile.java index a5a49eb2..ba90c371 100755 --- a/src/main/java/net/fortuna/mstor/data/MboxFile.java +++ b/src/main/java/org/mstor/data/MboxFile.java @@ -29,14 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; +package org.mstor.data; -import net.fortuna.mstor.util.CacheAdapter; -import net.fortuna.mstor.util.CapabilityHints; -import net.fortuna.mstor.util.Configurator; -import net.fortuna.mstor.util.EhCacheAdapter; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.mstor.util.CacheAdapter; +import org.mstor.util.CapabilityHints; +import org.mstor.util.Configurator; +import org.mstor.util.EhCacheAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.*; import java.nio.ByteBuffer; @@ -153,7 +153,7 @@ public enum BufferStrategy { private static final Charset charset = Charset.forName(Configurator.getProperty( "mstor.mbox.encoding", "ISO-8859-1")); - private final Log log = LogFactory.getLog(MboxFile.class); + private final Logger log = LoggerFactory.getLogger(MboxFile.class); private final CharsetDecoder decoder = charset.newDecoder(); @@ -551,7 +551,7 @@ public static boolean isValid(final File file) { return line == null || VALID_MBOX_PATTERN.matcher(line).matches(); } catch (Exception e) { - Log log = LogFactory.getLog(MboxFile.class); + Logger log = LoggerFactory.getLogger(MboxFile.class); log.info("Not a valid mbox file [" + file + "]", e); } diff --git a/src/main/java/net/fortuna/mstor/data/MessageAppender.java b/src/main/java/org/mstor/data/MessageAppender.java similarity index 95% rename from src/main/java/net/fortuna/mstor/data/MessageAppender.java rename to src/main/java/org/mstor/data/MessageAppender.java index 20d0156f..7046da89 100755 --- a/src/main/java/net/fortuna/mstor/data/MessageAppender.java +++ b/src/main/java/org/mstor/data/MessageAppender.java @@ -29,11 +29,11 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; +package org.mstor.data; -import net.fortuna.mstor.util.Configurator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.mstor.util.Configurator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.ByteBuffer; @@ -77,7 +77,7 @@ public class MessageAppender { private static final String FROM__DATE_PATTERN = "EEE MMM d HH:mm:ss yyyy"; - private final Log log = LogFactory.getLog(MessageAppender.class); + private final Logger log = LoggerFactory.getLogger(MessageAppender.class); private final CharsetDecoder decoder; diff --git a/src/main/java/net/fortuna/mstor/data/MessageInputStream.java b/src/main/java/org/mstor/data/MessageInputStream.java similarity index 98% rename from src/main/java/net/fortuna/mstor/data/MessageInputStream.java rename to src/main/java/org/mstor/data/MessageInputStream.java index af0ee41f..562a1743 100755 --- a/src/main/java/net/fortuna/mstor/data/MessageInputStream.java +++ b/src/main/java/org/mstor/data/MessageInputStream.java @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; +package org.mstor.data; -import net.fortuna.mstor.util.Configurator; +import org.mstor.util.Configurator; import java.io.InputStream; import java.nio.ByteBuffer; diff --git a/src/main/java/net/fortuna/mstor/data/xml/DocumentBinding.java b/src/main/java/org/mstor/data/xml/DocumentBinding.java similarity index 99% rename from src/main/java/net/fortuna/mstor/data/xml/DocumentBinding.java rename to src/main/java/org/mstor/data/xml/DocumentBinding.java index 359e110f..898b6a84 100755 --- a/src/main/java/net/fortuna/mstor/data/xml/DocumentBinding.java +++ b/src/main/java/org/mstor/data/xml/DocumentBinding.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.xml; +package org.mstor.data.xml; import org.jdom.Document; import org.jdom.Element; diff --git a/src/main/java/net/fortuna/mstor/data/xml/ElementBinding.java b/src/main/java/org/mstor/data/xml/ElementBinding.java similarity index 98% rename from src/main/java/net/fortuna/mstor/data/xml/ElementBinding.java rename to src/main/java/org/mstor/data/xml/ElementBinding.java index 59e2853f..c90f5478 100755 --- a/src/main/java/net/fortuna/mstor/data/xml/ElementBinding.java +++ b/src/main/java/org/mstor/data/xml/ElementBinding.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.xml; +package org.mstor.data.xml; import org.jdom.Element; import org.jdom.Namespace; diff --git a/src/main/java/net/fortuna/mstor/data/xml/XmlBinding.java b/src/main/java/org/mstor/data/xml/XmlBinding.java similarity index 98% rename from src/main/java/net/fortuna/mstor/data/xml/XmlBinding.java rename to src/main/java/org/mstor/data/xml/XmlBinding.java index 9c3d6cac..ace95323 100755 --- a/src/main/java/net/fortuna/mstor/data/xml/XmlBinding.java +++ b/src/main/java/org/mstor/data/xml/XmlBinding.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.xml; +package org.mstor.data.xml; import org.jdom.Namespace; diff --git a/src/main/java/net/fortuna/mstor/data/yaml/FlagWrapper.java b/src/main/java/org/mstor/data/yaml/FlagWrapper.java similarity index 98% rename from src/main/java/net/fortuna/mstor/data/yaml/FlagWrapper.java rename to src/main/java/org/mstor/data/yaml/FlagWrapper.java index f7390377..6ebf18ab 100755 --- a/src/main/java/net/fortuna/mstor/data/yaml/FlagWrapper.java +++ b/src/main/java/org/mstor/data/yaml/FlagWrapper.java @@ -29,10 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.yaml; - -import javax.mail.Flags.Flag; +package org.mstor.data.yaml; +import jakarta.mail.Flags.Flag; import org.ho.yaml.wrapper.DelayedCreationBeanWrapper; /** diff --git a/src/main/java/net/fortuna/mstor/data/yaml/FlagsWrapper.java b/src/main/java/org/mstor/data/yaml/FlagsWrapper.java similarity index 96% rename from src/main/java/net/fortuna/mstor/data/yaml/FlagsWrapper.java rename to src/main/java/org/mstor/data/yaml/FlagsWrapper.java index ecc0595e..c88f4283 100755 --- a/src/main/java/net/fortuna/mstor/data/yaml/FlagsWrapper.java +++ b/src/main/java/org/mstor/data/yaml/FlagsWrapper.java @@ -29,11 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.yaml; - -import javax.mail.Flags; -import javax.mail.Flags.Flag; +package org.mstor.data.yaml; +import jakarta.mail.Flags; +import jakarta.mail.Flags.Flag; import org.ho.yaml.wrapper.DelayedCreationBeanWrapper; /** diff --git a/src/main/java/net/fortuna/mstor/data/yaml/FolderExt.java b/src/main/java/org/mstor/data/yaml/FolderExt.java similarity index 98% rename from src/main/java/net/fortuna/mstor/data/yaml/FolderExt.java rename to src/main/java/org/mstor/data/yaml/FolderExt.java index 6b8573aa..3207a471 100755 --- a/src/main/java/net/fortuna/mstor/data/yaml/FolderExt.java +++ b/src/main/java/org/mstor/data/yaml/FolderExt.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.yaml; +package org.mstor.data.yaml; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; diff --git a/src/main/java/net/fortuna/mstor/data/yaml/HeaderWrapper.java b/src/main/java/org/mstor/data/yaml/HeaderWrapper.java similarity index 97% rename from src/main/java/net/fortuna/mstor/data/yaml/HeaderWrapper.java rename to src/main/java/org/mstor/data/yaml/HeaderWrapper.java index 33484803..b92db37e 100755 --- a/src/main/java/net/fortuna/mstor/data/yaml/HeaderWrapper.java +++ b/src/main/java/org/mstor/data/yaml/HeaderWrapper.java @@ -29,12 +29,11 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.yaml; +package org.mstor.data.yaml; +import jakarta.mail.Header; import org.ho.yaml.wrapper.DelayedCreationBeanWrapper; -import javax.mail.Header; - /** * @author Ben * diff --git a/src/main/java/net/fortuna/mstor/data/yaml/InternetHeadersWrapper.java b/src/main/java/org/mstor/data/yaml/InternetHeadersWrapper.java similarity index 96% rename from src/main/java/net/fortuna/mstor/data/yaml/InternetHeadersWrapper.java rename to src/main/java/org/mstor/data/yaml/InternetHeadersWrapper.java index 0513bf35..750ce429 100755 --- a/src/main/java/net/fortuna/mstor/data/yaml/InternetHeadersWrapper.java +++ b/src/main/java/org/mstor/data/yaml/InternetHeadersWrapper.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.yaml; +package org.mstor.data.yaml; +import jakarta.mail.Header; +import jakarta.mail.internet.InternetHeaders; import org.ho.yaml.wrapper.DelayedCreationBeanWrapper; -import javax.mail.Header; -import javax.mail.internet.InternetHeaders; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; diff --git a/src/main/java/net/fortuna/mstor/data/yaml/MessageExt.java b/src/main/java/org/mstor/data/yaml/MessageExt.java similarity index 97% rename from src/main/java/net/fortuna/mstor/data/yaml/MessageExt.java rename to src/main/java/org/mstor/data/yaml/MessageExt.java index 5523c276..a309c0cc 100755 --- a/src/main/java/net/fortuna/mstor/data/yaml/MessageExt.java +++ b/src/main/java/org/mstor/data/yaml/MessageExt.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data.yaml; +package org.mstor.data.yaml; -import java.util.Date; +import jakarta.mail.Flags; +import jakarta.mail.internet.InternetHeaders; -import javax.mail.Flags; -import javax.mail.internet.InternetHeaders; +import java.util.Date; /** * @author Ben diff --git a/src/main/java/org/mstor/filter/FilterExpression.java b/src/main/java/org/mstor/filter/FilterExpression.java new file mode 100644 index 00000000..b392b456 --- /dev/null +++ b/src/main/java/org/mstor/filter/FilterExpression.java @@ -0,0 +1,95 @@ +package org.mstor.filter; + +import org.mstor.filter.expression.*; + +import java.time.LocalDate; +import java.time.temporal.Temporal; +import java.util.Collection; +import java.util.List; + +public interface FilterExpression { + + enum Op { + // comparison operators.. + equalTo, notEqualTo, in, notIn, + greaterThan, greaterThanEqual, lessThan, lessThanEqual, between, + // object matching operators.. + exists, notExists, + // value matching operators.. + contains, matches, + // logical operators.. + and, or, not + } + + static FilterExpression equalTo(String target, String value) { + return new BinaryExpression(new TargetExpression(target), Op.equalTo, new StringExpression(value)); + } + + static FilterExpression equalTo(String target, List attributes, String value) { + return new BinaryExpression(new TargetExpression(target, attributes), Op.equalTo, new StringExpression(value)); + } + + static FilterExpression equalTo(String target, LocalDate value) { + return new BinaryExpression(new TargetExpression(target), Op.equalTo, new DateExpression(value)); + } + + static FilterExpression equalTo(String target, Integer value) { + return new BinaryExpression(new TargetExpression(target), Op.equalTo, new NumberExpression(value)); + } + + static FilterExpression in(String target, Collection value) { + return new BinaryExpression(new TargetExpression(target), Op.in, new CollectionExpression(value)); + } + + static FilterExpression greaterThan(String target, Temporal value) { + return new BinaryExpression(new TargetExpression(target), Op.greaterThan, new StringExpression(value.toString())); + } + + static FilterExpression greaterThan(String target, Number value) { + return new BinaryExpression(new TargetExpression(target), Op.greaterThan, new StringExpression(value.toString())); + } + + static FilterExpression greaterThanEqual(String target, Temporal value) { + return new BinaryExpression(new TargetExpression(target), Op.greaterThanEqual, new TemporalExpression(value)); + } + + static FilterExpression lessThan(String target, Temporal value) { + return new BinaryExpression(new TargetExpression(target), Op.lessThan, new TemporalExpression(value)); + } + + static FilterExpression lessThanEqual(String target, String value) { + return new BinaryExpression(new TargetExpression(target), Op.lessThanEqual, new StringExpression(value)); + } + + static FilterExpression contains(String target, String value) { + return new BinaryExpression(new TargetExpression(target), Op.contains, new StringExpression(value)); + } + + static FilterExpression matches(String target, String value) { + return new BinaryExpression(new TargetExpression(target), Op.matches, new StringExpression(value)); + } + + default FilterExpression and(FilterExpression expression) { + return new BinaryExpression(this, Op.and, expression); + } + + default FilterExpression or(FilterExpression expression) { + return new BinaryExpression(this, Op.or, expression); + } + + static FilterExpression not(FilterExpression expression) { + return new UnaryExpression(Op.not, expression); + } + + static FilterExpression exists(String target) { + return new UnaryExpression(Op.exists, new TargetExpression(target)); + } + + static FilterExpression notExists(String target) { + return new UnaryExpression(Op.notExists, new TargetExpression(target)); + } + + static FilterExpression parse(String filterExpression) { + return new FilterExpressionParser().parse(filterExpression); + } +} diff --git a/src/main/java/org/mstor/filter/FilterExpressionParser.java b/src/main/java/org/mstor/filter/FilterExpressionParser.java new file mode 100644 index 00000000..ed225711 --- /dev/null +++ b/src/main/java/org/mstor/filter/FilterExpressionParser.java @@ -0,0 +1,217 @@ +package org.mstor.filter; + +import org.jparsec.*; +import org.mstor.filter.FilterExpression.Op; +import org.mstor.filter.expression.BinaryExpression; +import org.mstor.filter.expression.NumberExpression; +import org.mstor.filter.expression.StringExpression; +import org.mstor.filter.expression.TargetExpression; + +import java.time.*; +import java.time.temporal.Temporal; +import java.time.temporal.TemporalAdjusters; +import java.time.temporal.TemporalAmount; +import java.time.temporal.WeekFields; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * Support for parsing a query string to produce a {@link FilterExpression} instance. + */ +public class FilterExpressionParser { + + private static final String[] OPERATORS = { + ">", "<", "=", ">=", "<=", "<>", ".", "(", ")", "[", "]", ":", "," + }; + + private static final String[] KEYWORDS = { + "by", "order", "asc", "desc", + "and", "or", "not", "in", "exists", "between", "is", "null", "like", + "contains", "matches" + }; + + private static final String[] FUNCTION_NAMES = { + "now", "startOfDay", "endOfDay", "startOfWeek", "endOfWeek", "startOfMonth", "endOfMonth", + "startOfYear", "endOfYear", "startOfWeek", "endOfWeek", "startOfMonth", "endOfMonth", + }; + + private static final Terminals TERMS = Terminals.operators(OPERATORS) + .words(Scanners.IDENTIFIER).caseInsensitiveKeywords(Arrays.asList(KEYWORDS)) + .keywords(FUNCTION_NAMES).build(); + + private static final Parser TOKENIZER = Parsers.or( + Terminals.IntegerLiteral.TOKENIZER, Terminals.StringLiteral.SINGLE_QUOTE_TOKENIZER, + TERMS.tokenizer()); + + static final Parser ATTRIBUTE_PARSER = Parsers.sequence(Terminals.Identifier.PARSER, + term(":"), Terminals.Identifier.PARSER, (name, x, value) -> new FilterTarget.Attribute(name, value)) + .or(Terminals.Identifier.PARSER.map(FilterTarget.Attribute::new)); + + static final Parser> ATTRIBUTE_LIST_PARSER = ATTRIBUTE_PARSER + .between(term("["), term("]")).sepBy(term(",")); + + static final Parser NUMBER = Terminals.IntegerLiteral.PARSER.map(NumberExpression::new); + + static final Parser STRING = Terminals.StringLiteral.PARSER.map(StringExpression::new); + + static final Parser NAME = Parsers.sequence( + Terminals.Identifier.PARSER, ATTRIBUTE_LIST_PARSER, TargetExpression::new) + .or(Terminals.Identifier.PARSER.map(TargetExpression::new)); +// static final Parser NAME = Terminals.Identifier.PARSER +// .map(SpecificationExpression::new); + + static final Parser IGNORED = Parsers.or( + Scanners.JAVA_LINE_COMMENT, + Scanners.JAVA_BLOCK_COMMENT, + Scanners.WHITESPACES).skipMany(); + + static final Parser> COLLECTION_PARSER = Terminals.StringLiteral.PARSER + .between(term("("), term(")")).sepBy(term(",")).from(TOKENIZER, IGNORED); + +// static final Parser STRING = Terminals.StringLiteral.SINGLE_QUOTE_TOKENIZER.map(StringExpression::new); + +// static final Parser TEMPORAL = Terminals.StringLiteral.PARSER.map(TemporalExpression::new); + + static Parser term(String... names) { + return TERMS.token(names); + } + + static Parser op(String name, T value) { + return term(name).retn(value); + } + + private static final Map> FUNCTIONS = new HashMap<>(); + static { + FUNCTIONS.put("now", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return Instant.now().plus(temporalAmount); + } + return Instant.now(); + }); + FUNCTIONS.put("startOfDay", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return LocalDate.now().atStartOfDay().plus(temporalAmount); + } + return LocalDate.now().atStartOfDay(); + }); + FUNCTIONS.put("endOfDay", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return LocalDate.now().atTime(23, 59).plus(temporalAmount); + } + return LocalDate.now().atTime(23, 59); + }); + FUNCTIONS.put("startOfWeek", (Function) s -> { + DayOfWeek first = WeekFields.ISO.getFirstDayOfWeek(); + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return LocalDate.now().with(TemporalAdjusters.previousOrSame(first)).plus(temporalAmount); + } + return LocalDate.now().with(TemporalAdjusters.previousOrSame(first)); + }); + FUNCTIONS.put("endOfWeek", (Function) s -> { + DayOfWeek last = DayOfWeek.of(WeekFields.ISO.getMinimalDaysInFirstWeek()); + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return LocalDate.now().with(TemporalAdjusters.nextOrSame(last)).plus(temporalAmount); + } + return LocalDate.now().with(TemporalAdjusters.nextOrSame(last)); + }); + FUNCTIONS.put("startOfMonth", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return YearMonth.now().atDay(1).atStartOfDay().plus(temporalAmount); + } + return YearMonth.now().atDay(1).atStartOfDay(); + }); + FUNCTIONS.put("endOfMonth", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return YearMonth.now().atEndOfMonth().atTime(23, 59).plus(temporalAmount); + } + return YearMonth.now().atEndOfMonth().atTime(23, 59); + }); + FUNCTIONS.put("startOfYear", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return Year.now().atMonth(1).atDay(1).atStartOfDay().plus(temporalAmount); + } + return Year.now().atMonth(1).atDay(1).atStartOfDay(); + }); + FUNCTIONS.put("endOfYear", (Function) s -> { + if (!s.isEmpty()) { + TemporalAmount temporalAmount = Duration.parse(s); + return Year.now().atMonth(12).atEndOfMonth().atTime(23, 59).plus(temporalAmount); + } + return Year.now().atMonth(12).atEndOfMonth().atTime(23, 59); + }); + } + + public FilterExpression parse(String filterExpression) { + FilterExpression expression = null; + for (String part : filterExpression.split("\\s*and\\s*")) { + if (part.matches("[\\w-]+\\s*>=\\s*\\w+")) { + String[] greaterThanEqual = part.split("\\s*>=\\s*"); + expression = FilterExpression.greaterThanEqual(greaterThanEqual[0], resolveValue(greaterThanEqual[1])); + } else if (part.matches("[\\w-]+\\s*<=\\s*\\w+")) { + String[] lessThanEqual = part.split("\\s*<=\\s*"); + expression = FilterExpression.lessThanEqual(lessThanEqual[0], resolveValue(lessThanEqual[1])); + } else if (part.matches("[\\w-]+\\s*=\\s*[^<>=]+")) { + String[] equalTo = part.split("\\s*=\\s*"); + expression = FilterExpression.equalTo(equalTo[0], (String) resolveValue(equalTo[1])); + } else if (part.matches("[\\w-]+\\s*>\\s*\\w+")) { + String[] greaterThan = part.split("\\s*>\\s*"); + expression = FilterExpression.greaterThan(greaterThan[0], (Integer) resolveValue(greaterThan[1])); + } else if (part.matches("[\\w-]+\\s*<\\s*\\w+")) { + String[] lessThan = part.split("\\s*<\\s*"); + expression = FilterExpression.lessThan(lessThan[0], resolveValue(lessThan[1])); + } else if (part.matches("[\\w-]+\\s+in\\s+\\[[^<>=]+]")) { + String[] in = part.split("\\s*in\\s*"); + List items = Arrays.asList(in[1].replaceAll("[\\[\\]]", "") + .split("\\[?\\s*,\\s*]?")); + expression = FilterExpression.in(in[0], items); + } else if (part.matches("[\\w-]+\\s+contains\\s+\".+\"")) { + String[] contains = part.split("\\s*contains\\s*"); + expression = FilterExpression.contains(contains[0], contains[1].replaceAll("^\"?|\"?$", "")); + } else if (part.matches("[\\w-]+\\s+exists")) { + String[] exists = part.split("\\s*exists"); + expression = FilterExpression.exists(exists[0]); + } else if (part.matches("[\\w-]+\\s+not exists")) { + String[] notExists = part.split("\\s*not exists"); + expression = FilterExpression.notExists(notExists[0]); + } else { + throw new IllegalArgumentException("Invalid filter expression: " + filterExpression); + } + } + return expression; + } + + private T resolveValue(String valueString) { + if (valueString.matches("\\w+\\(.*\\)") + && FUNCTIONS.containsKey(valueString.replaceAll("\\(.*\\)", ""))) { + return (T) FUNCTIONS.get(valueString.replaceAll("\\(.*\\)", "")) + .apply(valueString.split("[()]")[1]); + } else if (valueString.matches("\\d+")) { + return (T) Integer.valueOf(valueString); + } else { + return (T) valueString; + } + } + + public static Parser newInstance() { + Parser.Reference ref = Parser.newReference(); + Parser unit = ref.lazy().between(term("("), term(")")) + .or(NUMBER).or(NAME).or(STRING); //.or(TEMPORAL); + Parser parser = new OperatorTable() + .infixl(op("=", (l, r) -> new BinaryExpression(l, Op.equalTo, r)), 10) + .infixl(op("<>", (l, r) -> new BinaryExpression(l, Op.notEqualTo, r)), 10) + .build(unit); + ref.set(parser); + return parser.from(TOKENIZER, IGNORED); + } +} diff --git a/src/main/java/org/mstor/filter/FilterTarget.java b/src/main/java/org/mstor/filter/FilterTarget.java new file mode 100644 index 00000000..0a987d33 --- /dev/null +++ b/src/main/java/org/mstor/filter/FilterTarget.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.mstor.filter; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public class FilterTarget { + + private final String name; + + private final Optional value; + + private final List attributes; + + public FilterTarget(String spec) { + this(spec, Collections.emptyList()); + } + + public FilterTarget(String spec, List attributes) { + this.name = spec.split(":")[0].replace("_", "-"); + this.value = Optional.ofNullable(spec.split(":").length > 1 ? spec.split(":")[1] : null); + this.attributes = attributes; + } + + public String getName() { + return name; + } + + public Optional getValue() { + return value; + } + + public List getAttributes() { + return attributes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FilterTarget that = (FilterTarget) o; + return name.equals(that.name) && Objects.equals(value, that.value) && Objects.equals(attributes, that.attributes); + } + + @Override + public int hashCode() { + return Objects.hash(name, value, attributes); + } + + public static class Attribute { + + private final String name; + + private String value; + + public Attribute(String name) { + this.name = name; + } + + public Attribute(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Attribute attribute = (Attribute) o; + return name.equals(attribute.name) && Objects.equals(value, attribute.value); + } + + @Override + public int hashCode() { + return Objects.hash(name, value); + } + + public static Attribute parse(String string) { + String name = string.split(":")[0]; + String value = string.contains(":") ? string.split(":")[1] : null; + return new Attribute(name, value); + } + } +} diff --git a/src/main/java/org/mstor/filter/MessageFilter.java b/src/main/java/org/mstor/filter/MessageFilter.java new file mode 100644 index 00000000..8b6d96dc --- /dev/null +++ b/src/main/java/org/mstor/filter/MessageFilter.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.mstor.filter; + +import jakarta.mail.search.SearchTerm; +import org.mstor.filter.expression.BinaryExpression; +import org.mstor.filter.expression.LiteralExpression; +import org.mstor.filter.expression.TargetExpression; +import org.mstor.filter.expression.UnaryExpression; + +public class MessageFilter implements PredicateFactory { + + protected V literal(FilterExpression expression) { + if (expression instanceof BinaryExpression && ((BinaryExpression) expression).right instanceof LiteralExpression) { + return ((LiteralExpression) ((BinaryExpression) expression).right).getValue(); + } + throw new IllegalArgumentException("Not a valid filter"); + } + + protected FilterTarget target(FilterExpression expression) { + if (expression instanceof UnaryExpression + && ((UnaryExpression) expression).operand instanceof TargetExpression) { + return ((TargetExpression) ((UnaryExpression) expression).operand).getValue(); + } else if (expression instanceof BinaryExpression + && ((BinaryExpression) expression).left instanceof TargetExpression) { + return ((TargetExpression) ((BinaryExpression) expression).left).getValue(); + } + throw new IllegalArgumentException("Not a valid filter"); + } + + public SearchTerm predicate(UnaryExpression expression) { + switch (expression.operator) { + case not: + return not(predicate(expression.operand)); + } + throw new IllegalArgumentException("Not a valid filter"); + } + + public SearchTerm predicate(BinaryExpression expression) { + switch (expression.operator) { + case and: + return and(predicate(expression.left), predicate(expression.right)); + case or: + return or(predicate(expression.left), predicate(expression.right)); + } + throw new IllegalArgumentException("Not a valid filter"); + } +} diff --git a/src/main/java/org/mstor/filter/PredicateFactory.java b/src/main/java/org/mstor/filter/PredicateFactory.java new file mode 100644 index 00000000..e5359f01 --- /dev/null +++ b/src/main/java/org/mstor/filter/PredicateFactory.java @@ -0,0 +1,36 @@ +package org.mstor.filter; + +import jakarta.mail.search.AndTerm; +import jakarta.mail.search.NotTerm; +import jakarta.mail.search.OrTerm; +import jakarta.mail.search.SearchTerm; +import org.mstor.filter.expression.BinaryExpression; +import org.mstor.filter.expression.UnaryExpression; + +public interface PredicateFactory { + + default SearchTerm predicate(FilterExpression expression) { + if (expression instanceof UnaryExpression) { + return predicate((UnaryExpression) expression); + } else if (expression instanceof BinaryExpression) { + return predicate((BinaryExpression) expression); + } + throw new IllegalArgumentException("Not a valid filter"); + } + + SearchTerm predicate(UnaryExpression expression); + + SearchTerm predicate(BinaryExpression expression); + + default SearchTerm and(SearchTerm...predicates) { + return new AndTerm(predicates); + } + + default SearchTerm or(SearchTerm...predicates) { + return new OrTerm(predicates); + } + + default SearchTerm not(SearchTerm predicate) { + return new NotTerm(predicate); + } +} diff --git a/src/main/java/org/mstor/filter/expression/BinaryExpression.java b/src/main/java/org/mstor/filter/expression/BinaryExpression.java new file mode 100644 index 00000000..d19497a8 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/BinaryExpression.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import org.mstor.filter.FilterExpression; + +import java.util.Objects; + +public class BinaryExpression implements FilterExpression { + + public final FilterExpression left; + + public final FilterExpression.Op operator; + + public final FilterExpression right; + + public BinaryExpression(FilterExpression left, FilterExpression.Op operator, FilterExpression right) { + this.left = left; + this.operator = operator; + this.right = right; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BinaryExpression that = (BinaryExpression) o; + return left.equals(that.left) && operator == that.operator && right.equals(that.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, operator, right); + } +} diff --git a/src/main/java/org/mstor/filter/expression/CollectionExpression.java b/src/main/java/org/mstor/filter/expression/CollectionExpression.java new file mode 100644 index 00000000..6de933a9 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/CollectionExpression.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import java.util.Collection; +import java.util.Objects; + +public class CollectionExpression implements LiteralExpression> { + + private final Collection value; + + public CollectionExpression(Collection value) { + this.value = value; + } + + @Override + public Collection getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CollectionExpression that = (CollectionExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/DateExpression.java b/src/main/java/org/mstor/filter/expression/DateExpression.java new file mode 100644 index 00000000..153bf8f3 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/DateExpression.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import java.text.ParseException; +import java.time.LocalDate; +import java.util.Objects; + +public class DateExpression implements LiteralExpression { + + private final LocalDate value; + + public DateExpression(String value) throws ParseException { + this(LocalDate.parse(value)); + } + + public DateExpression(LocalDate value) { + this.value = value; + } + + @Override + public LocalDate getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DateExpression that = (DateExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/FunctionExpression.java b/src/main/java/org/mstor/filter/expression/FunctionExpression.java new file mode 100644 index 00000000..16aa98f5 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/FunctionExpression.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import java.time.temporal.Temporal; +import java.util.Objects; +import java.util.function.Function; + +public class FunctionExpression implements LiteralExpression> { + + private final Function value; + + public FunctionExpression(Function value) { + this.value = value; + } + + @Override + public Function getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FunctionExpression that = (FunctionExpression) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/LiteralExpression.java b/src/main/java/org/mstor/filter/expression/LiteralExpression.java new file mode 100644 index 00000000..98a8eb6a --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/LiteralExpression.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.mstor.filter.expression; + +import org.mstor.filter.FilterExpression; + +public interface LiteralExpression extends FilterExpression { + + T getValue(); +} diff --git a/src/main/java/org/mstor/filter/expression/NumberExpression.java b/src/main/java/org/mstor/filter/expression/NumberExpression.java new file mode 100644 index 00000000..1ad750cb --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/NumberExpression.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import java.util.Objects; + +public class NumberExpression implements LiteralExpression { + + private final Number value; + + public NumberExpression(String value) { + this(Integer.valueOf(value)); + } + + public NumberExpression(Number value) { + this.value = value; + } + + @Override + public Number getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NumberExpression that = (NumberExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/StringExpression.java b/src/main/java/org/mstor/filter/expression/StringExpression.java new file mode 100644 index 00000000..080f43c0 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/StringExpression.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import java.util.Objects; + +public class StringExpression implements LiteralExpression { + + public final String value; + + public StringExpression(String value) { + this.value = value; + } + + @Override + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StringExpression that = (StringExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/TargetExpression.java b/src/main/java/org/mstor/filter/expression/TargetExpression.java new file mode 100644 index 00000000..4de038d1 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/TargetExpression.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import org.mstor.filter.FilterExpression; +import org.mstor.filter.FilterTarget; + +import java.util.List; +import java.util.Objects; + +public class TargetExpression implements FilterExpression { + + public final FilterTarget value; + + public TargetExpression(String value) { + this.value = new FilterTarget(value); + } + + public TargetExpression(String value, List attributes) { + this.value = new FilterTarget(value, attributes); + } + + public FilterTarget getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TargetExpression that = (TargetExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/TemporalExpression.java b/src/main/java/org/mstor/filter/expression/TemporalExpression.java new file mode 100644 index 00000000..6618c679 --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/TemporalExpression.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import java.time.Instant; +import java.time.temporal.Temporal; +import java.util.Objects; + +public class TemporalExpression implements LiteralExpression { + + private final Temporal value; + + public TemporalExpression(String value) { + //TODO: implement parsing + this(Instant.now()); + } + + public TemporalExpression(Temporal value) { + this.value = value; + } + + @Override + public Temporal getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TemporalExpression that = (TemporalExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/org/mstor/filter/expression/UnaryExpression.java b/src/main/java/org/mstor/filter/expression/UnaryExpression.java new file mode 100644 index 00000000..7bb55bcc --- /dev/null +++ b/src/main/java/org/mstor/filter/expression/UnaryExpression.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2004-2021, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package org.mstor.filter.expression; + +import org.mstor.filter.FilterExpression; + +import java.util.Objects; + +public class UnaryExpression implements FilterExpression { + + public final FilterExpression.Op operator; + + public final FilterExpression operand; + + public UnaryExpression(FilterExpression.Op operator, FilterExpression operand) { + this.operator = operator; + this.operand = operand; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + UnaryExpression that = (UnaryExpression) o; + return operator == that.operator && operand.equals(that.operand); + } + + @Override + public int hashCode() { + return Objects.hash(operator, operand); + } +} diff --git a/src/main/java/org/mstor/model/ConstraintViolationException.java b/src/main/java/org/mstor/model/ConstraintViolationException.java new file mode 100644 index 00000000..ff8521e6 --- /dev/null +++ b/src/main/java/org/mstor/model/ConstraintViolationException.java @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2012, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.mstor.model; + +/** + * $Id$ + * + * Created on 02/03/2008 + * + * Indicates the violation of a constraint imposed by a relevant specification. + * @author Ben + * + */ +public class ConstraintViolationException extends RuntimeException { + + private static final long serialVersionUID = 6728653187698888940L; + + /** + * Default constructor. + */ + public ConstraintViolationException() { + } + + /** + * @param message an error message + */ + public ConstraintViolationException(String message) { + super(message); + } +} diff --git a/src/main/java/org/mstor/model/Content.java b/src/main/java/org/mstor/model/Content.java new file mode 100644 index 00000000..20b3172f --- /dev/null +++ b/src/main/java/org/mstor/model/Content.java @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2012, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.mstor.model; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; + +/** + * $Id$ + *

+ * Created: 12/10/2004 + *

+ * Base class for calendar content in the form of + * properties and parameters. + * + * @author Ben Fortuna + */ +public abstract class Content implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -2892694760294583989L; + + /** + * @return the cotent name + */ + public abstract String getName(); + + /** + * @return the content value + */ + public abstract String getValue(); + + public static abstract class Factory implements Serializable { + + private final List supportedNames; + + public Factory(String... supportedNames) { + this.supportedNames = Arrays.asList(supportedNames); + } + + public final boolean supports(String name) { + return supportedNames.contains(name); + } + } +} diff --git a/src/main/java/org/mstor/model/ContentCollection.java b/src/main/java/org/mstor/model/ContentCollection.java new file mode 100644 index 00000000..b44a9272 --- /dev/null +++ b/src/main/java/org/mstor/model/ContentCollection.java @@ -0,0 +1,58 @@ +package org.mstor.model; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * Implementors of this interface support the immutable collection contract specified by this interface. + * + * The contract states that any mutation function will not modify the underlying collection, but rather + * will return a copy of the collection with the applied mutation. + * + * @param + */ +public interface ContentCollection extends Serializable { + + ContentCollection add(T content); + + ContentCollection addAll(Collection content); + + ContentCollection remove(T content); + + ContentCollection removeAll(String... name); + + ContentCollection replace(T content); + + List getAll(); + + /** + * Return a list of elements filtered by name. If no names are specified return all elements. + * @param names a list of zero or more names to match + * @param content type + * @return a list of elements less than or equal to the elements in this collection + */ + @SuppressWarnings("unchecked") + default List get(String... names) { + if (names.length > 0) { + List filter = Arrays.stream(names).map(String::toUpperCase).collect(Collectors.toList()); + return getAll().stream().filter(c -> filter.contains(c.getName())).map(c -> (R) c).collect(Collectors.toList()); + } else { + return (List) getAll(); + } + } + + @SuppressWarnings("unchecked") + default Optional getFirst(String name) { + return (Optional) getAll().stream().filter(c -> c.getName().equalsIgnoreCase(name)).findFirst(); + } + + @SuppressWarnings("unchecked") + default R getRequired(String name) throws ConstraintViolationException { + return (R) getFirst(name).orElseThrow(() -> new ConstraintViolationException( + String.format("Missing required %s", name))); + } +} diff --git a/src/main/java/org/mstor/model/FluentMessage.java b/src/main/java/org/mstor/model/FluentMessage.java new file mode 100644 index 00000000..8ce1da92 --- /dev/null +++ b/src/main/java/org/mstor/model/FluentMessage.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.mstor.model; + +/** + * Provide fluent API support for {@link Message} + */ +public interface FluentMessage { + + C getFluentTarget(); + + default FluentMessage withProperty(Property property) { + getFluentTarget().add(property); + return getFluentTarget(); + } +} diff --git a/src/main/java/org/mstor/model/LabelSupport.java b/src/main/java/org/mstor/model/LabelSupport.java new file mode 100644 index 00000000..b69889f8 --- /dev/null +++ b/src/main/java/org/mstor/model/LabelSupport.java @@ -0,0 +1,12 @@ +package org.mstor.model; + +import java.util.Set; + +public interface LabelSupport { + + void addLabel(String label); + + void removeLabel(String label); + + Set getLabels(); +} diff --git a/src/main/java/org/mstor/model/MboxMessageCollection.java b/src/main/java/org/mstor/model/MboxMessageCollection.java new file mode 100644 index 00000000..fc0bb641 --- /dev/null +++ b/src/main/java/org/mstor/model/MboxMessageCollection.java @@ -0,0 +1,59 @@ +package org.mstor.model; + +import org.mstor.filter.FilterExpression; + +import java.util.List; +import java.util.Set; + +public class MboxMessageCollection implements MessageCollection { + + @Override + public void addLabel(String label) { + + } + + @Override + public void removeLabel(String label) { + + } + + @Override + public Set getLabels() { + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public MessageCollection getParent() { + return null; + } + + @Override + public List getCollections() { + return null; + } + + @Override + public int getMessageCount() { + return 0; + } + + @Override + public Iterable listMessages(int offset, int length) { + return null; + } + + @Override + public Iterable query(FilterExpression filterExpression) { + return null; + } + + @Override + public Message getMessage(String messageId) { + return null; + } +} diff --git a/src/main/java/org/mstor/model/MboxMessageStore.java b/src/main/java/org/mstor/model/MboxMessageStore.java new file mode 100644 index 00000000..3b4afc21 --- /dev/null +++ b/src/main/java/org/mstor/model/MboxMessageStore.java @@ -0,0 +1,26 @@ +package org.mstor.model; + +import java.util.List; + +public class MboxMessageStore implements MessageStore { + + @Override + public void connect() { + + } + + @Override + public void disconnect() { + + } + + @Override + public List getCollections() { + return null; + } + + @Override + public MessageCollection getCollection(String collectionId) { + return null; + } +} diff --git a/src/main/java/org/mstor/model/Message.java b/src/main/java/org/mstor/model/Message.java new file mode 100644 index 00000000..b67e6261 --- /dev/null +++ b/src/main/java/org/mstor/model/Message.java @@ -0,0 +1,41 @@ +package org.mstor.model; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +public class Message implements PropertyContainer, FluentMessage { + + private PropertyList propertyList; + + private final byte[] content; + + public Message(byte[] content) { + this.content = content; + } + + public byte[] getContent() { + return content; + } + + InputStream getContentAsStream() { + return new ByteArrayInputStream(content); + } + +// Iterable getReferences(); + + + @Override + public Message getFluentTarget() { + return this; + } + + @Override + public PropertyList getPropertyList() { + return propertyList; + } + + @Override + public void setPropertyList(PropertyList properties) { + this.propertyList = properties; + } +} diff --git a/src/main/java/org/mstor/model/MessageCollection.java b/src/main/java/org/mstor/model/MessageCollection.java new file mode 100644 index 00000000..535e525a --- /dev/null +++ b/src/main/java/org/mstor/model/MessageCollection.java @@ -0,0 +1,22 @@ +package org.mstor.model; + +import org.mstor.filter.FilterExpression; + +import java.util.List; + +public interface MessageCollection extends LabelSupport { + + String getName(); + + MessageCollection getParent(); + + List getCollections(); + + int getMessageCount(); + + Iterable listMessages(int offset, int length); + + Iterable query(FilterExpression filterExpression); + + Message getMessage(String messageId); +} diff --git a/src/main/java/org/mstor/model/MessageReference.java b/src/main/java/org/mstor/model/MessageReference.java new file mode 100644 index 00000000..53617d8b --- /dev/null +++ b/src/main/java/org/mstor/model/MessageReference.java @@ -0,0 +1,25 @@ +package org.mstor.model; + +public class MessageReference { + + public enum ReferenceType { + InReplyTo; + } + + private final Message message; + + private final ReferenceType referenceType; + + public MessageReference(Message message, ReferenceType referenceType) { + this.message = message; + this.referenceType = referenceType; + } + + public Message getMessage() { + return message; + } + + public ReferenceType getReferenceType() { + return referenceType; + } +} diff --git a/src/main/java/org/mstor/model/MessageStore.java b/src/main/java/org/mstor/model/MessageStore.java new file mode 100644 index 00000000..1d66b6cd --- /dev/null +++ b/src/main/java/org/mstor/model/MessageStore.java @@ -0,0 +1,14 @@ +package org.mstor.model; + +import java.util.List; + +public interface MessageStore { + + void connect(); + + void disconnect(); + + List getCollections(); + + MessageCollection getCollection(String collectionId); +} diff --git a/src/main/java/org/mstor/model/Property.java b/src/main/java/org/mstor/model/Property.java new file mode 100644 index 00000000..bbf7e9d4 --- /dev/null +++ b/src/main/java/org/mstor/model/Property.java @@ -0,0 +1,14 @@ +package org.mstor.model; + +public class Property extends Content { + + @Override + public String getName() { + return null; + } + + @Override + public String getValue() { + return null; + } +} diff --git a/src/main/java/org/mstor/model/PropertyContainer.java b/src/main/java/org/mstor/model/PropertyContainer.java new file mode 100644 index 00000000..e182f150 --- /dev/null +++ b/src/main/java/org/mstor/model/PropertyContainer.java @@ -0,0 +1,81 @@ +package org.mstor.model; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +public interface PropertyContainer { + + PropertyList getPropertyList(); + + void setPropertyList(PropertyList properties); + + default List getProperties(final String... name) { + return getPropertyList().get(name); + } + + default Optional getProperty(final String name) { + return getPropertyList().getFirst(name); + } + + /** + * Convenience method for retrieving a required named property. + * + * @param name name of the property to retrieve + * @return the first matching property in the property list with the specified name + * @throws ConstraintViolationException when a property is not found + */ + default T getRequiredProperty(String name) throws ConstraintViolationException { + return getPropertyList().getRequired(name); + } + + /** + * Add a property to the container. + * @param property the property to add + * @return a reference to the container to support method chaining + */ + default PropertyContainer add(Property property) { + setPropertyList((PropertyList) getPropertyList().add(property)); + return this; + } + + /** + * Add multiple properties to the container. + * @param properties a collection of properties to add + * @return a reference to the container to support method chaining + */ + default PropertyContainer addAll(Collection properties) { + setPropertyList((PropertyList) getPropertyList().addAll(properties)); + return this; + } + + /** + * Remove a property from the container. + * @param property the property to remove + * @return a reference to the container to support method chaining + */ + default PropertyContainer remove(Property property) { + setPropertyList((PropertyList) getPropertyList().remove(property)); + return this; + } + + /** + * Remove all properties with the matching name. + * @param name name of the properties to remove + * @return a reference to the container to support method chaining + */ + default PropertyContainer removeAll(String... name) { + setPropertyList((PropertyList) getPropertyList().removeAll(name)); + return this; + } + + /** + * Add a property to the container whilst removing all other properties with the same property name. + * @param property the property to add + * @return a reference to the container to support method chaining + */ + default PropertyContainer replace(Property property) { + setPropertyList((PropertyList) getPropertyList().replace(property)); + return this; + } +} diff --git a/src/main/java/org/mstor/model/PropertyList.java b/src/main/java/org/mstor/model/PropertyList.java new file mode 100644 index 00000000..c0328a8c --- /dev/null +++ b/src/main/java/org/mstor/model/PropertyList.java @@ -0,0 +1,155 @@ +/** + * Copyright (c) 2012, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.mstor.model; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * $Id$ [Apr 5, 2004] + * + * Accessor implementation for a list of iCalendar properties. + * @author Ben Fortuna + */ +public class PropertyList implements ContentCollection { + + private final List properties; + + /** + * Default constructor. + */ + public PropertyList() { + this(Collections.emptyList()); + } + + /** + * Creates an unmodifiable copy of the specified property list. + * @param properties a property list + */ + + public PropertyList(List properties) { + this.properties = Collections.unmodifiableList(properties); + } + + @Override + public ContentCollection add(Property content) { + List copy = new ArrayList<>(properties); + copy.add(content); + return new PropertyList(copy); + } + + @Override + public ContentCollection addAll(Collection content) { + List copy = new ArrayList<>(properties); + copy.addAll(content); + return new PropertyList(copy); + } + + @Override + public ContentCollection remove(Property content) { + List copy = new ArrayList<>(properties); + if (copy.remove(content)) { + return new PropertyList(copy); + } else { + return this; + } + } + + @Override + public ContentCollection removeAll(String... name) { + List names = Arrays.asList(name); + List copy = new ArrayList<>(properties); + if (copy.removeIf(p -> names.contains(p.getName()))) { + return new PropertyList(copy); + } else { + return this; + } + } + + @Override + public ContentCollection replace(Property content) { + List copy = new ArrayList<>(properties); + copy.removeIf(p -> p.getName().equals(content.getName())); + copy.add(content); + return new PropertyList(copy); + } + + @Override + public List getAll() { + return properties; + } + + /** + * {@inheritDoc} + */ + @Override + public final String toString() { + return properties.stream().map(Property::toString).collect(Collectors.joining("")); + } + + /** + * Returns the first property of specified name. + * @param aName name of property to return + * @return a property or null if no matching property found + * + * @deprecated use {@link PropertyList#getFirst(String)} + */ + @Deprecated + public final Optional getProperty(final String aName) { + return getFirst(aName); + } + + /** + * Returns a list of properties with the specified name. + * @param name name of properties to return + * @return a property list + * + * @deprecated use {@link PropertyList#get(String...)} + */ + @Deprecated + public final List getProperties(final String name) { + return get(name); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PropertyList that = (PropertyList) o; + return Objects.equals(properties, that.properties); + } + + @Override + public int hashCode() { + return Objects.hash(properties); + } +} diff --git a/src/main/java/org/mstor/model/property/Bcc.java b/src/main/java/org/mstor/model/property/Bcc.java new file mode 100644 index 00000000..ad28a783 --- /dev/null +++ b/src/main/java/org/mstor/model/property/Bcc.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Bcc extends Recipient { +} diff --git a/src/main/java/org/mstor/model/property/Cc.java b/src/main/java/org/mstor/model/property/Cc.java new file mode 100644 index 00000000..364dcf7a --- /dev/null +++ b/src/main/java/org/mstor/model/property/Cc.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Cc extends Recipient { +} diff --git a/src/main/java/org/mstor/model/property/Comments.java b/src/main/java/org/mstor/model/property/Comments.java new file mode 100644 index 00000000..5d87eb35 --- /dev/null +++ b/src/main/java/org/mstor/model/property/Comments.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Comments { +} diff --git a/src/main/java/org/mstor/model/property/DateProperty.java b/src/main/java/org/mstor/model/property/DateProperty.java new file mode 100644 index 00000000..84107d67 --- /dev/null +++ b/src/main/java/org/mstor/model/property/DateProperty.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public abstract class DateProperty { +} diff --git a/src/main/java/org/mstor/model/property/Forwarded.java b/src/main/java/org/mstor/model/property/Forwarded.java new file mode 100644 index 00000000..ba3953bf --- /dev/null +++ b/src/main/java/org/mstor/model/property/Forwarded.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Forwarded extends DateProperty { +} diff --git a/src/main/java/org/mstor/model/property/InReplyTo.java b/src/main/java/org/mstor/model/property/InReplyTo.java new file mode 100644 index 00000000..d9c5b88d --- /dev/null +++ b/src/main/java/org/mstor/model/property/InReplyTo.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class InReplyTo { +} diff --git a/src/main/java/org/mstor/model/property/Keywords.java b/src/main/java/org/mstor/model/property/Keywords.java new file mode 100644 index 00000000..d69eceb8 --- /dev/null +++ b/src/main/java/org/mstor/model/property/Keywords.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Keywords { +} diff --git a/src/main/java/org/mstor/model/property/Received.java b/src/main/java/org/mstor/model/property/Received.java new file mode 100644 index 00000000..4c45ea7b --- /dev/null +++ b/src/main/java/org/mstor/model/property/Received.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Received extends DateProperty { +} diff --git a/src/main/java/org/mstor/model/property/Recipient.java b/src/main/java/org/mstor/model/property/Recipient.java new file mode 100644 index 00000000..3252d1ac --- /dev/null +++ b/src/main/java/org/mstor/model/property/Recipient.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public abstract class Recipient { +} diff --git a/src/main/java/org/mstor/model/property/Sender.java b/src/main/java/org/mstor/model/property/Sender.java new file mode 100644 index 00000000..9621bf91 --- /dev/null +++ b/src/main/java/org/mstor/model/property/Sender.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Sender { +} diff --git a/src/main/java/org/mstor/model/property/Sent.java b/src/main/java/org/mstor/model/property/Sent.java new file mode 100644 index 00000000..45fb44d7 --- /dev/null +++ b/src/main/java/org/mstor/model/property/Sent.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Sent extends DateProperty { +} diff --git a/src/main/java/org/mstor/model/property/Subject.java b/src/main/java/org/mstor/model/property/Subject.java new file mode 100644 index 00000000..facdf1ee --- /dev/null +++ b/src/main/java/org/mstor/model/property/Subject.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Subject { +} diff --git a/src/main/java/org/mstor/model/property/To.java b/src/main/java/org/mstor/model/property/To.java new file mode 100644 index 00000000..1da18d2f --- /dev/null +++ b/src/main/java/org/mstor/model/property/To.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class To extends Recipient { +} diff --git a/src/main/java/org/mstor/model/property/Uid.java b/src/main/java/org/mstor/model/property/Uid.java new file mode 100644 index 00000000..15ba0da4 --- /dev/null +++ b/src/main/java/org/mstor/model/property/Uid.java @@ -0,0 +1,4 @@ +package org.mstor.model.property; + +public class Uid { +} diff --git a/src/main/java/net/fortuna/mstor/connector/AbstractFolderDelegate.java b/src/main/java/org/mstor/provider/mail/AbstractFolderDelegate.java similarity index 98% rename from src/main/java/net/fortuna/mstor/connector/AbstractFolderDelegate.java rename to src/main/java/org/mstor/provider/mail/AbstractFolderDelegate.java index 40fdb58b..f3bdc255 100755 --- a/src/main/java/net/fortuna/mstor/connector/AbstractFolderDelegate.java +++ b/src/main/java/org/mstor/provider/mail/AbstractFolderDelegate.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; /** * @param the type of message delegate supported diff --git a/src/main/java/net/fortuna/mstor/connector/AbstractMessageDelegate.java b/src/main/java/org/mstor/provider/mail/AbstractMessageDelegate.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/AbstractMessageDelegate.java rename to src/main/java/org/mstor/provider/mail/AbstractMessageDelegate.java index d2fee316..b4684aa3 100755 --- a/src/main/java/net/fortuna/mstor/connector/AbstractMessageDelegate.java +++ b/src/main/java/org/mstor/provider/mail/AbstractMessageDelegate.java @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; -import javax.mail.internet.InternetHeaders; +import jakarta.mail.internet.InternetHeaders; /** diff --git a/src/main/java/net/fortuna/mstor/connector/AbstractProtocolConnector.java b/src/main/java/org/mstor/provider/mail/AbstractProtocolConnector.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/AbstractProtocolConnector.java rename to src/main/java/org/mstor/provider/mail/AbstractProtocolConnector.java index fafc090c..096d17db 100755 --- a/src/main/java/net/fortuna/mstor/connector/AbstractProtocolConnector.java +++ b/src/main/java/org/mstor/provider/mail/AbstractProtocolConnector.java @@ -29,11 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; -import net.fortuna.mstor.model.MStorStore; - -import javax.mail.URLName; +import jakarta.mail.URLName; /** * @author Ben diff --git a/src/main/java/net/fortuna/mstor/util/Cache.java b/src/main/java/org/mstor/provider/mail/Cache.java similarity index 98% rename from src/main/java/net/fortuna/mstor/util/Cache.java rename to src/main/java/org/mstor/provider/mail/Cache.java index 7639b79c..dd7cd694 100755 --- a/src/main/java/net/fortuna/mstor/util/Cache.java +++ b/src/main/java/org/mstor/provider/mail/Cache.java @@ -29,14 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.util; +package org.mstor.provider.mail; + +import jakarta.mail.Message; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; -import javax.mail.Message; - /** * Implements a very rudimentary cache. * diff --git a/src/main/java/net/fortuna/mstor/connector/DelegateException.java b/src/main/java/org/mstor/provider/mail/DelegateException.java similarity index 98% rename from src/main/java/net/fortuna/mstor/connector/DelegateException.java rename to src/main/java/org/mstor/provider/mail/DelegateException.java index 7404ce02..0f57cc03 100755 --- a/src/main/java/net/fortuna/mstor/connector/DelegateException.java +++ b/src/main/java/org/mstor/provider/mail/DelegateException.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; /** * An exception used to indicate an unhandled situation in a delegate. diff --git a/src/main/java/net/fortuna/mstor/connector/FolderDelegate.java b/src/main/java/org/mstor/provider/mail/FolderDelegate.java similarity index 95% rename from src/main/java/net/fortuna/mstor/connector/FolderDelegate.java rename to src/main/java/org/mstor/provider/mail/FolderDelegate.java index 2f25d7ac..a3d7c444 100755 --- a/src/main/java/net/fortuna/mstor/connector/FolderDelegate.java +++ b/src/main/java/org/mstor/provider/mail/FolderDelegate.java @@ -29,17 +29,17 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; -import net.fortuna.mstor.model.MStorFolder; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.IOException; import java.io.InputStream; /** - * Implementors support delegation of specific functions from {@link MStorFolder}. + * Implementors support delegation of specific functions from {@link Folder}. * * @param the type of message delegate supported * @author Ben @@ -77,8 +77,8 @@ public interface FolderDelegate { /** * @return the type of folder this delegate represents. - * @see javax.mail.Folder#HOLDS_FOLDERS - * @see javax.mail.Folder#HOLDS_MESSAGES + * @see jakarta.mail.Folder#HOLDS_FOLDERS + * @see jakarta.mail.Folder#HOLDS_MESSAGES */ int getType(); @@ -126,8 +126,8 @@ public interface FolderDelegate { /** * Open the folder delegate. * @param mode the mode to open the folder - * @see javax.mail.Folder#READ_ONLY - * @see javax.mail.Folder#READ_WRITE + * @see jakarta.mail.Folder#READ_ONLY + * @see jakarta.mail.Folder#READ_WRITE */ void open(final int mode); diff --git a/src/main/java/org/mstor/provider/mail/IndexedMessageList.java b/src/main/java/org/mstor/provider/mail/IndexedMessageList.java new file mode 100644 index 00000000..9a1f7437 --- /dev/null +++ b/src/main/java/org/mstor/provider/mail/IndexedMessageList.java @@ -0,0 +1,37 @@ +package org.mstor.provider.mail; + +import jakarta.mail.Header; +import jakarta.mail.Message; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Support for indexing messages by message header. + */ +public class IndexedMessageList { + + private final Map> indexMap; + + public IndexedMessageList(List messages, Header...headers) { + this.indexMap = new ConcurrentHashMap<>(); + messages.forEach(message -> add(message, headers)); + } + + private void add(Message message, Header... headers) { + Arrays.stream(headers).forEach(header -> { + if (indexMap.containsKey(header)) { + indexMap.get(header).add(message.getMessageNumber()); + } else { + indexMap.put(header, Collections.singletonList(message.getMessageNumber())); + } + }); + } + + List getMessages(Header header) { + return indexMap.get(header); + } +} diff --git a/src/main/java/net/fortuna/mstor/model/MStorFolder.java b/src/main/java/org/mstor/provider/mail/MStorFolder.java similarity index 96% rename from src/main/java/net/fortuna/mstor/model/MStorFolder.java rename to src/main/java/org/mstor/provider/mail/MStorFolder.java index dadf7ee0..2d08e559 100755 --- a/src/main/java/net/fortuna/mstor/model/MStorFolder.java +++ b/src/main/java/org/mstor/provider/mail/MStorFolder.java @@ -29,20 +29,17 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; - -import net.fortuna.mstor.connector.DelegateException; -import net.fortuna.mstor.connector.FolderDelegate; -import net.fortuna.mstor.connector.MessageDelegate; -import net.fortuna.mstor.util.CacheAdapter; -import net.fortuna.mstor.util.Configurator; -import net.fortuna.mstor.util.EhCacheAdapter; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.mail.*; -import javax.mail.event.ConnectionEvent; -import javax.mail.event.FolderEvent; +package org.mstor.provider.mail; + +import jakarta.mail.*; +import jakarta.mail.event.ConnectionEvent; +import jakarta.mail.event.FolderEvent; +import org.mstor.util.CacheAdapter; +import org.mstor.util.Configurator; +import org.mstor.util.EhCacheAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -64,7 +61,7 @@ */ public final class MStorFolder extends Folder implements UIDFolder { - private static final Log LOG = LogFactory.getLog(MStorFolder.class); + private static final Logger LOG = LoggerFactory.getLogger(MStorFolder.class); private static final String INVALID_FOLDER_TYPE_MESSAGE = "Invalid folder type"; @@ -357,7 +354,7 @@ public synchronized int getDeletedMessageCount() throws MessagingException { return delegate.getDeletedMessageCount(); } catch (UnsupportedOperationException e) { - LOG.debug(e.getMessage()); + LOG.debug("Unexpected error", e); } return super.getDeletedMessageCount(); } diff --git a/src/main/java/net/fortuna/mstor/model/MStorMessage.java b/src/main/java/org/mstor/provider/mail/MStorMessage.java similarity index 97% rename from src/main/java/net/fortuna/mstor/model/MStorMessage.java rename to src/main/java/org/mstor/provider/mail/MStorMessage.java index 4a29db3c..68910ea6 100755 --- a/src/main/java/net/fortuna/mstor/model/MStorMessage.java +++ b/src/main/java/org/mstor/provider/mail/MStorMessage.java @@ -29,16 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; -import net.fortuna.mstor.connector.MessageDelegate; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import jakarta.mail.*; +import jakarta.mail.Flags.Flag; +import jakarta.mail.internet.InternetHeaders; +import jakarta.mail.internet.MimeMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.*; -import javax.mail.Flags.Flag; -import javax.mail.internet.InternetHeaders; -import javax.mail.internet.MimeMessage; import java.io.InputStream; import java.io.Serializable; import java.util.*; @@ -57,7 +56,7 @@ */ public final class MStorMessage extends MimeMessage implements Serializable, Taggable { - private final Log log = LogFactory.getLog(MStorMessage.class); + private final Logger log = LoggerFactory.getLogger(MStorMessage.class); /** * Delegate for providing additional functions not supported by MimeMessage. diff --git a/src/main/java/net/fortuna/mstor/model/MStorStore.java b/src/main/java/org/mstor/provider/mail/MStorStore.java similarity index 95% rename from src/main/java/net/fortuna/mstor/model/MStorStore.java rename to src/main/java/org/mstor/provider/mail/MStorStore.java index 85c7c8a3..360c0e02 100755 --- a/src/main/java/net/fortuna/mstor/model/MStorStore.java +++ b/src/main/java/org/mstor/provider/mail/MStorStore.java @@ -29,12 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; -import net.fortuna.mstor.connector.ProtocolConnector; -import net.fortuna.mstor.connector.ProtocolConnectorFactory; - -import javax.mail.*; +import jakarta.mail.*; /** * Implementation of a javamail store for the mstor provider. diff --git a/src/main/java/net/fortuna/mstor/connector/MessageDelegate.java b/src/main/java/org/mstor/provider/mail/MessageDelegate.java similarity index 96% rename from src/main/java/net/fortuna/mstor/connector/MessageDelegate.java rename to src/main/java/org/mstor/provider/mail/MessageDelegate.java index 015a85a7..f1a673fa 100755 --- a/src/main/java/net/fortuna/mstor/connector/MessageDelegate.java +++ b/src/main/java/org/mstor/provider/mail/MessageDelegate.java @@ -29,20 +29,20 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; -import net.fortuna.mstor.model.MStorMessage; +import jakarta.mail.Flags; +import jakarta.mail.Header; +import jakarta.mail.Message; +import jakarta.mail.internet.InternetHeaders; -import javax.mail.Flags; -import javax.mail.Header; -import javax.mail.internet.InternetHeaders; import java.io.InputStream; import java.util.Date; import java.util.Enumeration; import java.util.List; /** - * Implementors support delegation of specific functions from {@link MStorMessage}. + * Implementors support delegation of specific functions from {@link Message}. * * @author Ben * diff --git a/src/main/java/net/fortuna/mstor/util/MessageUtils.java b/src/main/java/org/mstor/provider/mail/MessageUtils.java similarity index 95% rename from src/main/java/net/fortuna/mstor/util/MessageUtils.java rename to src/main/java/org/mstor/provider/mail/MessageUtils.java index e413a68a..7b1ffb04 100644 --- a/src/main/java/net/fortuna/mstor/util/MessageUtils.java +++ b/src/main/java/org/mstor/provider/mail/MessageUtils.java @@ -29,13 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.util; +package org.mstor.provider.mail; -import javax.mail.Flags; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Flags.Flag; -import javax.mail.internet.MimeMessage; +import jakarta.mail.Flags; +import jakarta.mail.Flags.Flag; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; /** * @author Ben diff --git a/src/main/java/net/fortuna/mstor/connector/ProtocolConnector.java b/src/main/java/org/mstor/provider/mail/ProtocolConnector.java similarity index 89% rename from src/main/java/net/fortuna/mstor/connector/ProtocolConnector.java rename to src/main/java/org/mstor/provider/mail/ProtocolConnector.java index 6ca725ab..8b20ec7a 100755 --- a/src/main/java/net/fortuna/mstor/connector/ProtocolConnector.java +++ b/src/main/java/org/mstor/provider/mail/ProtocolConnector.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; -import javax.mail.AuthenticationFailedException; -import javax.mail.Folder; -import javax.mail.MessagingException; -import javax.mail.URLName; +import jakarta.mail.AuthenticationFailedException; +import jakarta.mail.Folder; +import jakarta.mail.MessagingException; +import jakarta.mail.URLName; /** * Implementors provide protocol-specific storage support. @@ -82,4 +82,11 @@ public interface ProtocolConnector { * @throws MessagingException where an error occurs retrieving the folder */ Folder getFolder(URLName url) throws MessagingException; + + /** + * Indicate the supported protocol string(s). + * @param protocol + * @return + */ + boolean isProtocolSupported(String protocol); } diff --git a/src/main/java/net/fortuna/mstor/connector/ProtocolConnectorFactory.java b/src/main/java/org/mstor/provider/mail/ProtocolConnectorFactory.java similarity index 73% rename from src/main/java/net/fortuna/mstor/connector/ProtocolConnectorFactory.java rename to src/main/java/org/mstor/provider/mail/ProtocolConnectorFactory.java index 0d6076d9..7dac92a0 100755 --- a/src/main/java/net/fortuna/mstor/connector/ProtocolConnectorFactory.java +++ b/src/main/java/org/mstor/provider/mail/ProtocolConnectorFactory.java @@ -29,14 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; +package org.mstor.provider.mail; -import net.fortuna.mstor.connector.jcr.JcrConnector; -import net.fortuna.mstor.connector.mbox.MboxConnector; -import net.fortuna.mstor.model.MStorStore; +import jakarta.mail.Session; +import jakarta.mail.URLName; -import javax.mail.Session; -import javax.mail.URLName; +import java.util.ServiceLoader; /** * @author Ben @@ -52,7 +50,17 @@ public class ProtocolConnectorFactory { private static final ProtocolConnectorFactory instance = new ProtocolConnectorFactory(); - + + protected transient ServiceLoader factoryLoader; + + public ProtocolConnectorFactory() { + this(ServiceLoader.load(ProtocolConnector.class, ProtocolConnector.class.getClassLoader())); + } + + public ProtocolConnectorFactory(ServiceLoader factoryLoader) { + this.factoryLoader = factoryLoader; + } + /** * @param url a URL location of a connector-specific store * @param store a store instance to associate with the connector @@ -60,10 +68,16 @@ public class ProtocolConnectorFactory { * @return a new implementation-specific connector for the specified URL */ public ProtocolConnector create(URLName url, MStorStore store, Session session) { - if (session.getProperty("mstor.repository.name") != null) { - return new JcrConnector(url, store, session); + for (ProtocolConnector p : factoryLoader) { + if (p.isProtocolSupported(url.getProtocol())) { + return p; + } } - return new MboxConnector(url, store, session); +// if (session.getProperty("mstor.repository.name") != null) { +// return new JcrConnector(url, store, session); +// } +// return new MboxConnector(url, store, session); + return null; } /** diff --git a/src/main/java/net/fortuna/mstor/model/Taggable.java b/src/main/java/org/mstor/provider/mail/Taggable.java similarity index 96% rename from src/main/java/net/fortuna/mstor/model/Taggable.java rename to src/main/java/org/mstor/provider/mail/Taggable.java index 02e05869..87a02d85 100755 --- a/src/main/java/net/fortuna/mstor/model/Taggable.java +++ b/src/main/java/org/mstor/provider/mail/Taggable.java @@ -29,9 +29,9 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; -import javax.mail.MessagingException; +import jakarta.mail.MessagingException; /** * Implementors support tagging. diff --git a/src/main/java/net/fortuna/mstor/model/Tags.java b/src/main/java/org/mstor/provider/mail/Tags.java similarity index 98% rename from src/main/java/net/fortuna/mstor/model/Tags.java rename to src/main/java/org/mstor/provider/mail/Tags.java index 114cc75d..a5187155 100755 --- a/src/main/java/net/fortuna/mstor/model/Tags.java +++ b/src/main/java/org/mstor/provider/mail/Tags.java @@ -29,11 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; + +import jakarta.mail.Flags; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; -import javax.mail.Flags; -import javax.mail.Message; -import javax.mail.MessagingException; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; diff --git a/src/main/java/net/fortuna/mstor/search/InReplyToSearchTerm.java b/src/main/java/org/mstor/provider/mail/search/InReplyToSearchTerm.java similarity index 86% rename from src/main/java/net/fortuna/mstor/search/InReplyToSearchTerm.java rename to src/main/java/org/mstor/provider/mail/search/InReplyToSearchTerm.java index 473d3eee..ffac1c09 100644 --- a/src/main/java/net/fortuna/mstor/search/InReplyToSearchTerm.java +++ b/src/main/java/org/mstor/provider/mail/search/InReplyToSearchTerm.java @@ -29,14 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; +package org.mstor.provider.mail.search; -import net.fortuna.mstor.model.MStorMessage; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.mail.Message; -import javax.mail.search.SearchTerm; +import jakarta.mail.Message; +import jakarta.mail.search.SearchTerm; +import org.mstor.provider.mail.MStorMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Ben @@ -56,7 +55,7 @@ public class InReplyToSearchTerm extends SearchTerm { */ private static final long serialVersionUID = -4186790883587837877L; - private static final Log LOG = LogFactory.getLog(InReplyToSearchTerm.class); + private static final Logger LOG = LoggerFactory.getLogger(InReplyToSearchTerm.class); private final MStorMessage message; @@ -68,7 +67,7 @@ public InReplyToSearchTerm(MStorMessage message) { } /* (non-Javadoc) - * @see javax.mail.search.SearchTerm#match(javax.mail.Message) + * @see jakarta.mail.search.SearchTerm#match(jakarta.mail.Message) */ @Override public boolean match(Message msg) { diff --git a/src/main/java/org/mstor/provider/mail/search/PredicateSearchTerm.java b/src/main/java/org/mstor/provider/mail/search/PredicateSearchTerm.java new file mode 100644 index 00000000..ca514212 --- /dev/null +++ b/src/main/java/org/mstor/provider/mail/search/PredicateSearchTerm.java @@ -0,0 +1,23 @@ +package org.mstor.provider.mail.search; + +import jakarta.mail.Message; +import jakarta.mail.search.SearchTerm; + +import java.util.function.Predicate; + +/** + * A search term backed with a functional predicate. + */ +public class PredicateSearchTerm extends SearchTerm { + + private final Predicate messagePredicate; + + public PredicateSearchTerm(Predicate messagePredicate) { + this.messagePredicate = messagePredicate; + } + + @Override + public boolean match(Message msg) { + return messagePredicate.test(msg); + } +} diff --git a/src/main/java/net/fortuna/mstor/search/ReferencesSearchTerm.java b/src/main/java/org/mstor/provider/mail/search/ReferencesSearchTerm.java similarity index 86% rename from src/main/java/net/fortuna/mstor/search/ReferencesSearchTerm.java rename to src/main/java/org/mstor/provider/mail/search/ReferencesSearchTerm.java index 0e8b7eec..95af0f95 100644 --- a/src/main/java/net/fortuna/mstor/search/ReferencesSearchTerm.java +++ b/src/main/java/org/mstor/provider/mail/search/ReferencesSearchTerm.java @@ -29,14 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; +package org.mstor.provider.mail.search; -import net.fortuna.mstor.model.MStorMessage; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.mail.Message; -import javax.mail.search.SearchTerm; +import jakarta.mail.Message; +import jakarta.mail.search.SearchTerm; +import org.mstor.provider.mail.MStorMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Ben @@ -56,7 +55,7 @@ public class ReferencesSearchTerm extends SearchTerm { */ private static final long serialVersionUID = 6818650576380745976L; - private static final Log LOG = LogFactory.getLog(ReferencesSearchTerm.class); + private static final Logger LOG = LoggerFactory.getLogger(ReferencesSearchTerm.class); private final MStorMessage message; @@ -68,7 +67,7 @@ public ReferencesSearchTerm(MStorMessage message) { } /* (non-Javadoc) - * @see javax.mail.search.SearchTerm#match(javax.mail.Message) + * @see jakarta.mail.search.SearchTerm#match(jakarta.mail.Message) */ @Override public boolean match(Message msg) { diff --git a/src/main/java/net/fortuna/mstor/search/SearchTerms.java b/src/main/java/org/mstor/provider/mail/search/SearchTerms.java similarity index 96% rename from src/main/java/net/fortuna/mstor/search/SearchTerms.java rename to src/main/java/org/mstor/provider/mail/search/SearchTerms.java index 55f5b12a..cbabcfa1 100755 --- a/src/main/java/net/fortuna/mstor/search/SearchTerms.java +++ b/src/main/java/org/mstor/provider/mail/search/SearchTerms.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; +package org.mstor.provider.mail.search; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; +import jakarta.mail.search.SearchTerm; -import javax.mail.search.SearchTerm; import java.io.Reader; import java.io.Writer; diff --git a/src/main/java/net/fortuna/mstor/search/TagsTerm.java b/src/main/java/org/mstor/provider/mail/search/TagsTerm.java similarity index 86% rename from src/main/java/net/fortuna/mstor/search/TagsTerm.java rename to src/main/java/org/mstor/provider/mail/search/TagsTerm.java index 95808905..eb706608 100755 --- a/src/main/java/net/fortuna/mstor/search/TagsTerm.java +++ b/src/main/java/org/mstor/provider/mail/search/TagsTerm.java @@ -29,16 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; +package org.mstor.provider.mail.search; -import net.fortuna.mstor.model.Taggable; -import net.fortuna.mstor.model.Tags; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.search.SearchTerm; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.search.SearchTerm; +import org.mstor.provider.mail.Taggable; +import org.mstor.provider.mail.Tags; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A Search Term that matches all messages with a given set of tags. @@ -54,7 +53,7 @@ */ public class TagsTerm extends SearchTerm { - private final Log log = LogFactory.getLog(TagsTerm.class); + private final Logger log = LoggerFactory.getLogger(TagsTerm.class); private static final long serialVersionUID = 7893903141033644620L; @@ -79,7 +78,7 @@ public TagsTerm(final Tags tags) { /* * (non-Javadoc) * - * @see javax.mail.search.SearchTerm#match(javax.mail.Message) + * @see jakarta.mail.search.SearchTerm#match(jakarta.mail.Message) */ public final boolean match(final Message m) { try { diff --git a/src/main/java/net/fortuna/mstor/util/CacheAdapter.java b/src/main/java/org/mstor/util/CacheAdapter.java similarity index 98% rename from src/main/java/net/fortuna/mstor/util/CacheAdapter.java rename to src/main/java/org/mstor/util/CacheAdapter.java index 60a2e01e..71262a29 100644 --- a/src/main/java/net/fortuna/mstor/util/CacheAdapter.java +++ b/src/main/java/org/mstor/util/CacheAdapter.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.util; +package org.mstor.util; /** diff --git a/src/main/java/net/fortuna/mstor/util/CapabilityHints.java b/src/main/java/org/mstor/util/CapabilityHints.java similarity index 98% rename from src/main/java/net/fortuna/mstor/util/CapabilityHints.java rename to src/main/java/org/mstor/util/CapabilityHints.java index d9ef7f9e..963e033c 100755 --- a/src/main/java/net/fortuna/mstor/util/CapabilityHints.java +++ b/src/main/java/org/mstor/util/CapabilityHints.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.util; +package org.mstor.util; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/net/fortuna/mstor/util/Configurator.java b/src/main/java/org/mstor/util/Configurator.java similarity index 93% rename from src/main/java/net/fortuna/mstor/util/Configurator.java rename to src/main/java/org/mstor/util/Configurator.java index ada34a09..7d756ae6 100755 --- a/src/main/java/net/fortuna/mstor/util/Configurator.java +++ b/src/main/java/org/mstor/util/Configurator.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.util; +package org.mstor.util; -import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import java.util.Properties; /** * Provides configuration properties specified either as system properties @@ -52,7 +52,7 @@ */ public final class Configurator { - private static final Log LOG = LogFactory.getLog(Configurator.class); + private static final Logger LOG = LoggerFactory.getLogger(Configurator.class); private static final Properties CONFIG = new Properties(); diff --git a/src/main/java/net/fortuna/mstor/util/EhCacheAdapter.java b/src/main/java/org/mstor/util/EhCacheAdapter.java similarity index 98% rename from src/main/java/net/fortuna/mstor/util/EhCacheAdapter.java rename to src/main/java/org/mstor/util/EhCacheAdapter.java index 3bb73627..91ae9f54 100644 --- a/src/main/java/net/fortuna/mstor/util/EhCacheAdapter.java +++ b/src/main/java/org/mstor/util/EhCacheAdapter.java @@ -29,7 +29,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.util; +package org.mstor.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; diff --git a/src/main/resources/META-INF/javamail.providers b/src/main/resources/META-INF/javamail.providers index b7526074..4b00a72d 100755 --- a/src/main/resources/META-INF/javamail.providers +++ b/src/main/resources/META-INF/javamail.providers @@ -1 +1 @@ -protocol=mstor; type=store; class=net.fortuna.mstor.model.MStorStore; vendor=Ben Fortuna; \ No newline at end of file +protocol=mstor; type=store; class=org.mstor.provider.mail.MStorStore; vendor=Micronode; diff --git a/src/main/resources/META-INF/services/org.mstor.provider.mail.ProtocolConnector b/src/main/resources/META-INF/services/org.mstor.provider.mail.ProtocolConnector new file mode 100644 index 00000000..b6564c26 --- /dev/null +++ b/src/main/resources/META-INF/services/org.mstor.provider.mail.ProtocolConnector @@ -0,0 +1 @@ +#org.mstor.connector.mbox.MboxConnector diff --git a/src/main/resources/jyaml.yml b/src/main/resources/jyaml.yml index 10934acc..fe324a30 100755 --- a/src/main/resources/jyaml.yml +++ b/src/main/resources/jyaml.yml @@ -3,11 +3,11 @@ indentAmount: " " suppressWarnings: true encoding: "ISO-8859-1" transfers: - folder: net.fortuna.mstor.data.yaml.FolderExt - message: net.fortuna.mstor.data.yaml.MessageExt - header: javax.mail.Header + folder: org.mstor.mbox.data.yaml.FolderExt + message: org.mstor.mbox.data.yaml.MessageExt + header: jakarta.mail.Header handlers: - javax.mail.Flags: net.fortuna.mstor.data.yaml.FlagsWrapper - javax.mail.Flags$Flag: net.fortuna.mstor.data.yaml.FlagWrapper - javax.mail.internet.InternetHeaders: net.fortuna.mstor.data.yaml.InternetHeadersWrapper - javax.mail.Header: net.fortuna.mstor.data.yaml.HeaderWrapper + jakarta.mail.Flags: org.mstor.mbox.data.yaml.FlagsWrapper + jakarta.mail.Flags$Flag: org.mstor.mbox.data.yaml.FlagWrapper + jakarta.mail.internet.InternetHeaders: org.mstor.mbox.data.yaml.InternetHeadersWrapper + jakarta.mail.Header: org.mstor.mbox.data.yaml.HeaderWrapper diff --git a/src/main/resources/net/fortuna/mstor/util/package-info.java b/src/main/resources/net/fortuna/mstor/util/package-info.java deleted file mode 100644 index 71c1172e..00000000 --- a/src/main/resources/net/fortuna/mstor/util/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Contains utility types. - */ -@Version("1.0.0") -package net.fortuna.mstor.util; - -import aQute.bnd.annotation.Version; \ No newline at end of file diff --git a/src/main/resources/net/fortuna/mstor/data/package-info.java b/src/main/resources/org/mstor/data/package-info.java similarity index 79% rename from src/main/resources/net/fortuna/mstor/data/package-info.java rename to src/main/resources/org/mstor/data/package-info.java index 9756d70b..cdf11bd4 100644 --- a/src/main/resources/net/fortuna/mstor/data/package-info.java +++ b/src/main/resources/org/mstor/data/package-info.java @@ -2,6 +2,6 @@ * Contains underlying mbox and metadata implementations. */ @Version("1.0.0") -package net.fortuna.mstor.data; +package org.mstor.mbox.data; import aQute.bnd.annotation.Version; \ No newline at end of file diff --git a/src/main/resources/net/fortuna/mstor/data/xml/package-info.java b/src/main/resources/org/mstor/data/xml/package-info.java similarity index 77% rename from src/main/resources/net/fortuna/mstor/data/xml/package-info.java rename to src/main/resources/org/mstor/data/xml/package-info.java index dd143610..539ba4f2 100644 --- a/src/main/resources/net/fortuna/mstor/data/xml/package-info.java +++ b/src/main/resources/org/mstor/data/xml/package-info.java @@ -2,6 +2,6 @@ * Contains XML binding classes used for metadata persistence. */ @Version("1.0.0") -package net.fortuna.mstor.data.xml; +package org.mstor.data.xml; import aQute.bnd.annotation.Version; \ No newline at end of file diff --git a/src/main/resources/net/fortuna/mstor/package-info.java b/src/main/resources/org/mstor/package-info.java similarity index 84% rename from src/main/resources/net/fortuna/mstor/package-info.java rename to src/main/resources/org/mstor/package-info.java index 0170d3a3..9b211bb1 100644 --- a/src/main/resources/net/fortuna/mstor/package-info.java +++ b/src/main/resources/org/mstor/package-info.java @@ -2,6 +2,6 @@ * Contains JavaMail implementations and metadata definitions for this provider. */ @Version("1.0.0") -package net.fortuna.mstor; +package org.mstor.mbox; import aQute.bnd.annotation.Version; \ No newline at end of file diff --git a/src/main/resources/net/fortuna/mstor/search/package-info.java b/src/main/resources/org/mstor/search/package-info.java similarity index 76% rename from src/main/resources/net/fortuna/mstor/search/package-info.java rename to src/main/resources/org/mstor/search/package-info.java index 35b1e64d..ccafcfd6 100644 --- a/src/main/resources/net/fortuna/mstor/search/package-info.java +++ b/src/main/resources/org/mstor/search/package-info.java @@ -2,6 +2,6 @@ * Contains JavaMail search terms and utilities. */ @Version("1.0.0") -package net.fortuna.mstor.search; +package org.mstor.mbox.search; import aQute.bnd.annotation.Version; \ No newline at end of file diff --git a/src/test/groovy/net/fortuna/mstor/connector/jcr/JcrMessageSpec.groovy b/src/test/groovy/org/mstor/connector/jcr/JcrMessageSpec.groovy similarity index 78% rename from src/test/groovy/net/fortuna/mstor/connector/jcr/JcrMessageSpec.groovy rename to src/test/groovy/org/mstor/connector/jcr/JcrMessageSpec.groovy index 63494f29..731c033d 100644 --- a/src/test/groovy/net/fortuna/mstor/connector/jcr/JcrMessageSpec.groovy +++ b/src/test/groovy/org/mstor/connector/jcr/JcrMessageSpec.groovy @@ -29,25 +29,20 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr +package org.mstor.connector.jcr -import javax.jcr.Session; -import javax.jcr.SimpleCredentials; -import javax.mail.Authenticator; -import javax.mail.Flags; -import javax.mail.Flags.Flag; -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.PasswordAuthentication; -import javax.mail.internet.MimeMessage; -import javax.naming.InitialContext; -import org.apache.jackrabbit.core.TransientRepository; -import org.apache.jackrabbit.core.config.RepositoryConfig; -import org.apache.jackrabbit.core.jndi.RegistryHelper; +import jakarta.mail.Flags.Flag +import jakarta.mail.Folder +import jakarta.mail.Message +import jakarta.mail.internet.MimeMessage +import org.apache.jackrabbit.core.jndi.RegistryHelper +import spock.lang.Shared +import spock.lang.Specification -import spock.lang.Shared; -import spock.lang.Specification; +import javax.jcr.Session +import javax.jcr.SimpleCredentials +import javax.naming.InitialContext class JcrMessageSpec extends Specification { @@ -55,7 +50,7 @@ class JcrMessageSpec extends Specification { @Shared Session session - @Shared javax.mail.Session mailSession + @Shared jakarta.mail.Session mailSession def setupSpec() { // def configFile = JcrMessageSpec.getResource('/repository.xml').toURI() @@ -77,8 +72,8 @@ class JcrMessageSpec extends Specification { mailSessionProps.setProperty('mstor.repository.create', 'true') mailSessionProps.setProperty('mail.store.protocol', 'mstor') - mailSession = javax.mail.Session.getInstance(mailSessionProps, - { new PasswordAuthentication('admin', '') } as Authenticator) + mailSession = jakarta.mail.Session.getInstance(mailSessionProps, + { new java.net.PasswordAuthentication('admin', '') } as java.net.Authenticator) } def cleanupSpec() { @@ -107,7 +102,8 @@ class JcrMessageSpec extends Specification { inbox.appendMessages([message] as Message[]) expect: - def messageNode = session.rootNode.mail.folders.inbox.messages.nodes.next() - messageNode.flags?.values.collect { it.string } == ['deleted'] + groovy.util.Node messageNode = session.rootNode.getNode('mail').getNode('folders') + .getNode('inbox').getNode('messages').nodes.nextNode() + messageNode.getProperty('flags').values.collect { it.string } == ['deleted'] } } diff --git a/src/test/groovy/net/fortuna/mstor/connector/mbox/MboxMessageSpec.groovy b/src/test/groovy/org/mstor/connector/mbox/MboxMessageSpec.groovy similarity index 76% rename from src/test/groovy/net/fortuna/mstor/connector/mbox/MboxMessageSpec.groovy rename to src/test/groovy/org/mstor/connector/mbox/MboxMessageSpec.groovy index c89cc11f..a8b9cef4 100644 --- a/src/test/groovy/net/fortuna/mstor/connector/mbox/MboxMessageSpec.groovy +++ b/src/test/groovy/org/mstor/connector/mbox/MboxMessageSpec.groovy @@ -29,29 +29,29 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox +package org.mstor.connector.mbox import groovy.util.logging.Slf4j - -import javax.mail.Folder; -import javax.mail.Store -import javax.mail.URLName - +import jakarta.mail.Folder +import jakarta.mail.Store +import jakarta.mail.URLName import spock.lang.Shared import spock.lang.Specification +import java.nio.file.FileSystems + @Slf4j class MboxMessageSpec extends Specification { - @Shared javax.mail.Session mailSession + @Shared jakarta.mail.Session mailSession def setupSpec() { - mailSession = javax.mail.Session.getInstance(new Properties()) + mailSession = jakarta.mail.Session.getInstance(new Properties()) } def 'assert read messages from mbox file'() { setup: 'construct a local store' - def filename = new File(path).absolutePath + def filename = FileSystems.getDefault().getPath(path).toAbsolutePath() Store localStore = mailSession.getStore(new URLName("mstor:$filename")) localStore.connect() @@ -69,11 +69,11 @@ class MboxMessageSpec extends Specification { where: path | messageCount - 'etc/samples/mailboxes/contenttype-semis.mbox' | 1 -// 'etc/samples/mailboxes/imagined.mbox' | 223 - 'etc/samples/mailboxes/parseexception.mbox' | 1 - 'etc/samples/mailboxes/received-0xc.mbox' | 1 - 'etc/samples/mailboxes/samples.mbx' | 2 - 'etc/samples/mailboxes/subject-0x1f.mbox' | 1 + 'src/test/resources/samples/mailboxes/contenttype-semis.mbox' | 1 +// 'src/test/resources/samples/mailboxes/imagined.mbox' | 223 + 'src/test/resources/samples/mailboxes/parseexception.mbox' | 1 + 'src/test/resources/samples/mailboxes/received-0xc.mbox' | 1 + 'src/test/resources/samples/mailboxes/samples.mbx' | 2 + 'src/test/resources/samples/mailboxes/subject-0x1f.mbox' | 1 } } diff --git a/src/test/groovy/net/fortuna/mstor/MessageBuilderTest.groovy b/src/test/groovy/org/mstor/provider/mail/MessageBuilderTest.groovy similarity index 94% rename from src/test/groovy/net/fortuna/mstor/MessageBuilderTest.groovy rename to src/test/groovy/org/mstor/provider/mail/MessageBuilderTest.groovy index ab692b09..7ba9fae8 100644 --- a/src/test/groovy/net/fortuna/mstor/MessageBuilderTest.groovy +++ b/src/test/groovy/org/mstor/provider/mail/MessageBuilderTest.groovy @@ -29,14 +29,11 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor; +package org.mstor.provider.mail -import javax.mail.Session; -import javax.mail.internet.InternetAddress; - -import org.junit.Test; - -import static org.junit.Assert.*; +import jakarta.mail.Session +import jakarta.mail.internet.InternetAddress +import org.junit.Test class MessageBuilderTest { diff --git a/src/test/groovy/net/fortuna/mstor/search/SearchTermBuilderTest.groovy b/src/test/groovy/org/mstor/provider/mail/search/SearchTermBuilderTest.groovy similarity index 91% rename from src/test/groovy/net/fortuna/mstor/search/SearchTermBuilderTest.groovy rename to src/test/groovy/org/mstor/provider/mail/search/SearchTermBuilderTest.groovy index 4f1fe70e..9d44ce83 100644 --- a/src/test/groovy/net/fortuna/mstor/search/SearchTermBuilderTest.groovy +++ b/src/test/groovy/org/mstor/provider/mail/search/SearchTermBuilderTest.groovy @@ -29,19 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; -import javax.mail.Address; +package org.mstor.provider.mail.search - -import javax.mail.Message; -import javax.mail.Message.RecipientType; -import javax.mail.search.FromTerm; -import javax.mail.search.RecipientTerm; -import javax.mail.internet.InternetAddress; - -import org.junit.Test; - -import static org.junit.Assert.*; +import jakarta.mail.Address +import jakarta.mail.Message +import jakarta.mail.Message.RecipientType +import jakarta.mail.internet.InternetAddress +import jakarta.mail.search.FromTerm +import jakarta.mail.search.RecipientTerm +import org.junit.Test class SearchTermBuilderTest { diff --git a/src/test/java/net/fortuna/mstor/model/StoreLifecycle.java b/src/test/java/org/mstor/connector/StoreLifecycle.java similarity index 95% rename from src/test/java/net/fortuna/mstor/model/StoreLifecycle.java rename to src/test/java/org/mstor/connector/StoreLifecycle.java index 162491b4..5c9cd56a 100755 --- a/src/test/java/net/fortuna/mstor/model/StoreLifecycle.java +++ b/src/test/java/org/mstor/connector/StoreLifecycle.java @@ -29,10 +29,10 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.connector; -import javax.mail.NoSuchProviderException; -import javax.mail.Store; +import jakarta.mail.NoSuchProviderException; +import jakarta.mail.Store; /** * @author Ben diff --git a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java b/src/test/java/org/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java similarity index 98% rename from src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java rename to src/test/java/org/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java index 0af68acb..41bc2c52 100644 --- a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java +++ b/src/test/java/org/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; import junit.framework.TestSuite; -import net.fortuna.mstor.model.MStorFolderTest; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.provider.mail.MStorFolderTest; import java.io.File; import java.util.Properties; @@ -65,7 +65,7 @@ public static TestSuite suite() { defaultProps.setProperty("mstor.repository.path", "mail"); defaultProps.setProperty("mstor.repository.create", "true"); - File initMboxDir = new File("etc/samples/mailboxes/MboxFile"); + File initMboxDir = new File("src/test/resources/samples/mailboxes/MboxFile"); String repoName = "JcrMStorFolderTest.testExists"; Properties p = new Properties(defaultProps); diff --git a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java b/src/test/java/org/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java similarity index 95% rename from src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java rename to src/test/java/org/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java index bc5ad747..4c39b650 100644 --- a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java +++ b/src/test/java/org/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; import junit.framework.TestSuite; -import net.fortuna.mstor.model.MStorStoreTest; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.provider.mail.MStorStoreTest; import java.io.File; import java.util.Properties; @@ -65,7 +65,7 @@ public static TestSuite suite() { defaultProps.setProperty("mstor.repository.path", "mail"); defaultProps.setProperty("mstor.repository.create", "true"); - File initMboxDir = new File("etc/samples/mailboxes/MboxFile"); + File initMboxDir = new File("src/test/resources/samples/mailboxes/MboxFile"); String repoName = "JcrMStorStoreTest.testGetDefaultFolder"; Properties p = new Properties(defaultProps); diff --git a/src/test/java/net/fortuna/mstor/connector/jcr/JcrStoreLifecycle.java b/src/test/java/org/mstor/connector/jcr/JcrStoreLifecycle.java similarity index 95% rename from src/test/java/net/fortuna/mstor/connector/jcr/JcrStoreLifecycle.java rename to src/test/java/org/mstor/connector/jcr/JcrStoreLifecycle.java index 8f13c5fc..4b8e5650 100755 --- a/src/test/java/net/fortuna/mstor/connector/jcr/JcrStoreLifecycle.java +++ b/src/test/java/org/mstor/connector/jcr/JcrStoreLifecycle.java @@ -32,16 +32,16 @@ /** * */ -package net.fortuna.mstor.connector.jcr; +package org.mstor.connector.jcr; -import net.fortuna.mstor.model.StoreLifecycle; +import jakarta.mail.*; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.time.DurationFormatUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.core.jndi.RegistryHelper; +import org.mstor.connector.StoreLifecycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.*; import javax.naming.Context; import javax.naming.InitialContext; import java.io.File; @@ -53,7 +53,7 @@ */ public class JcrStoreLifecycle implements StoreLifecycle { - private static final Log LOG = LogFactory.getLog(JcrStoreLifecycle.class); + private static final Logger LOG = LoggerFactory.getLogger(JcrStoreLifecycle.class); private static final String BASE_TEST_DIR = System.getProperty("java.io.tmpdir") + File.separator + JcrStoreLifecycle.class.getSimpleName() + File.separator; diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java similarity index 94% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java index f028c65d..cb6e6e07 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java @@ -29,15 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; import junit.framework.TestSuite; -import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy; -import net.fortuna.mstor.model.MStorFolderTest; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.NotFileFilter; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.connector.mbox.MboxConnector.MetadataStrategy; +import org.mstor.provider.mail.MStorFolderTest; import java.io.File; import java.io.FileFilter; @@ -66,9 +66,9 @@ public static TestSuite suite() { Properties p = new Properties(); p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString()); - File[] samples = new File("etc/samples/mailboxes").listFiles( + File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java similarity index 88% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java index b9636b49..1c7a891c 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java @@ -29,15 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; import junit.framework.TestSuite; -import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy; -import net.fortuna.mstor.model.MStorMessageTest; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.NotFileFilter; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.provider.mail.MStorMessageTest; import java.io.File; import java.io.FileFilter; @@ -64,11 +63,11 @@ public static TestSuite suite() { TestSuite suite = new TestSuite(MboxMStorMessageIntegrationTest.class.getSimpleName()); Properties p = new Properties(); - p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString()); + p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MboxConnector.MetadataStrategy.YAML.toString()); - File[] samples = new File("etc/samples/mailboxes").listFiles( + File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java similarity index 91% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java index 280a4cee..82cbf8f2 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java @@ -29,14 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; import junit.framework.TestSuite; -import net.fortuna.mstor.model.MStorStoreTest; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.NotFileFilter; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.provider.mail.MStorStoreTest; import java.io.File; import java.io.FileFilter; @@ -64,9 +64,9 @@ public static TestSuite suite() { Properties p = new Properties(); - File[] samples = new File("etc/samples/mailboxes").listFiles( + File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java similarity index 90% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java index 473f5e30..46f04bd2 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java @@ -29,12 +29,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; import junit.framework.TestSuite; -import net.fortuna.mstor.model.MessedUpCacheTest; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.provider.mail.MessedUpCacheTest; import java.util.Properties; @@ -62,9 +62,9 @@ public static TestSuite suite() { suite.addTest(new MessedUpCacheTest("testMessedUpCache", new MboxStoreLifecycle("testMessedUpCache", p, null), null, null)); -// File[] samples = new File("etc/samples/mailboxes").listFiles( +// File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( // (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; // for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxStoreLifecycle.java b/src/test/java/org/mstor/connector/mbox/MboxStoreLifecycle.java similarity index 95% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxStoreLifecycle.java rename to src/test/java/org/mstor/connector/mbox/MboxStoreLifecycle.java index e5eb1811..7f04af35 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxStoreLifecycle.java +++ b/src/test/java/org/mstor/connector/mbox/MboxStoreLifecycle.java @@ -29,14 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; -import net.fortuna.mstor.model.StoreLifecycle; +import jakarta.mail.Session; +import jakarta.mail.Store; +import jakarta.mail.URLName; import org.apache.commons.io.FileUtils; +import org.mstor.connector.StoreLifecycle; -import javax.mail.Session; -import javax.mail.Store; -import javax.mail.URLName; import java.io.File; import java.util.Properties; diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxTagIntegrationTest.java similarity index 87% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxTagIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxTagIntegrationTest.java index e58d378a..69b29578 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxTagIntegrationTest.java @@ -29,15 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; import junit.framework.TestSuite; -import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy; -import net.fortuna.mstor.model.TagTest; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.NotFileFilter; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.provider.mail.TagTest; import java.io.File; import java.io.FileFilter; @@ -64,11 +63,11 @@ public static TestSuite suite() { TestSuite suite = new TestSuite(MboxTagIntegrationTest.class.getSimpleName()); Properties p = new Properties(); - p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString()); + p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MboxConnector.MetadataStrategy.YAML.toString()); - File[] samples = new File("etc/samples/mailboxes").listFiles( + File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagsTermIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxTagsTermIntegrationTest.java similarity index 87% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxTagsTermIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxTagsTermIntegrationTest.java index 8cea5168..ce79875d 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagsTermIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxTagsTermIntegrationTest.java @@ -29,20 +29,18 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; - -import java.io.File; -import java.io.FileFilter; -import java.util.Properties; +package org.mstor.connector.mbox; import junit.framework.TestSuite; +import org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.apache.commons.io.filefilter.NotFileFilter; import org.junit.runner.RunWith; import org.junit.runners.AllTests; -import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy; -import net.fortuna.mstor.search.TagsTermTest; +import org.mstor.provider.mail.search.TagsTermTest; -import org.apache.commons.io.filefilter.DirectoryFileFilter; -import org.apache.commons.io.filefilter.NotFileFilter; +import java.io.File; +import java.io.FileFilter; +import java.util.Properties; /** * @author Ben @@ -65,11 +63,11 @@ public static TestSuite suite() { TestSuite suite = new TestSuite(MboxTagsTermIntegrationTest.class.getSimpleName()); Properties p = new Properties(); - p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString()); + p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MboxConnector.MetadataStrategy.YAML.toString()); - File[] samples = new File("etc/samples/mailboxes").listFiles( + File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java similarity index 91% rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java rename to src/test/java/org/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java index 37386986..673af264 100755 --- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java +++ b/src/test/java/org/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java @@ -29,15 +29,15 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector.mbox; +package org.mstor.connector.mbox; import junit.framework.TestSuite; -import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy; -import net.fortuna.mstor.model.UIDFolderTest; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.NotFileFilter; import org.junit.runner.RunWith; import org.junit.runners.AllTests; +import org.mstor.connector.mbox.MboxConnector.MetadataStrategy; +import org.mstor.provider.mail.UIDFolderTest; import java.io.File; import java.io.FileFilter; @@ -66,9 +66,9 @@ public static TestSuite suite() { Properties p = new Properties(); p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString()); - File[] samples = new File("etc/samples/mailboxes").listFiles( + File[] samples = new File("src/test/resources/samples/mailboxes").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); - //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")}; + //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")}; for (int i = 0; i < samples.length; i++) { // log.info("Sample [" + samples[i] + "]"); diff --git a/src/test/java/net/fortuna/mstor/data/MboxEncoderTest.java b/src/test/java/org/mstor/data/MboxEncoderTest.java similarity index 91% rename from src/test/java/net/fortuna/mstor/data/MboxEncoderTest.java rename to src/test/java/org/mstor/data/MboxEncoderTest.java index 01e79c04..d0f2618d 100755 --- a/src/test/java/net/fortuna/mstor/data/MboxEncoderTest.java +++ b/src/test/java/org/mstor/data/MboxEncoderTest.java @@ -29,14 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; - -import java.io.IOException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +package org.mstor.data; import junit.framework.TestCase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; /** * @author Ben Fortuna @@ -52,7 +51,7 @@ */ public class MboxEncoderTest extends TestCase { - private static Log log = LogFactory.getLog(MboxEncoderTest.class); + private static Logger log = LoggerFactory.getLogger(MboxEncoderTest.class); /** * @throws IOException diff --git a/src/test/java/net/fortuna/mstor/data/MboxFileTest.java b/src/test/java/org/mstor/data/MboxFileTest.java similarity index 93% rename from src/test/java/net/fortuna/mstor/data/MboxFileTest.java rename to src/test/java/org/mstor/data/MboxFileTest.java index 05dadbbc..b50fa4e5 100755 --- a/src/test/java/net/fortuna/mstor/data/MboxFileTest.java +++ b/src/test/java/org/mstor/data/MboxFileTest.java @@ -29,26 +29,25 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; - -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; +package org.mstor.data; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; -import net.fortuna.mstor.data.MboxFile.BufferStrategy; -import net.fortuna.mstor.util.CapabilityHints; +import org.mstor.data.MboxFile.BufferStrategy; +import org.mstor.util.CapabilityHints; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.shaded.org.apache.commons.io.FileUtils; +import org.testcontainers.shaded.org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.testcontainers.shaded.org.apache.commons.io.filefilter.NotFileFilter; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.DirectoryFileFilter; -import org.apache.commons.io.filefilter.NotFileFilter; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; /** - * Unit tests for {@link net.fortuna.mstor.data.MboxFile}. + * Unit tests for {@link MboxFile}. * * @author Ben Fortuna * @@ -61,7 +60,7 @@ */ public class MboxFileTest extends TestCase { - private static Log log = LogFactory.getLog(MboxFileTest.class); + private static Logger log = LoggerFactory.getLogger(MboxFileTest.class); private String filename; @@ -121,7 +120,7 @@ public MboxFileTest(String method, String filename, BufferStrategy bufferStrateg */ protected final void setUp() throws Exception { super.setUp(); - // File f = new File("etc/samples/mailboxes/MboxFile/Inbox"); + // File f = new File("src/test/resources/samples/mailboxes/MboxFile/Inbox"); testFile = createTestHierarchy(new File(filename)); mbox = new MboxFile(testFile, MboxFile.READ_WRITE); @@ -278,13 +277,13 @@ public static Test suite() { // suite.addTest(new MboxFileTest("testGetMessageCount", "/tmp/Inbox")); suite.addTest(new MboxFileTest("testGetMessageCount", - "etc/samples/mailboxes/foxmail/in.BOX", + "src/test/resources/samples/mailboxes/foxmail/in.BOX", BufferStrategy.DEFAULT, false, true)); suite.addTest(new MboxFileTest("testGetMessageCount", - "etc/samples/mailboxes/foxmail/NEWBO2.BOX", + "src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX", BufferStrategy.DEFAULT, false, true)); - File[] testFiles = new File("etc/samples/mailboxes") + File[] testFiles = new File("src/test/resources/samples/mailboxes") .listFiles((FileFilter) new NotFileFilter( DirectoryFileFilter.INSTANCE)); for (int i = 0; i < testFiles.length; i++) { diff --git a/src/test/java/net/fortuna/mstor/data/MessageInputStreamTest.java b/src/test/java/org/mstor/data/MessageInputStreamTest.java similarity index 88% rename from src/test/java/net/fortuna/mstor/data/MessageInputStreamTest.java rename to src/test/java/org/mstor/data/MessageInputStreamTest.java index 19628c41..efee127c 100755 --- a/src/test/java/net/fortuna/mstor/data/MessageInputStreamTest.java +++ b/src/test/java/org/mstor/data/MessageInputStreamTest.java @@ -29,22 +29,21 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.data; +package org.mstor.data; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.testcontainers.shaded.org.apache.commons.io.FileUtils; +import org.testcontainers.shaded.org.apache.commons.io.IOUtils; +import org.testcontainers.shaded.org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.testcontainers.shaded.org.apache.commons.io.filefilter.NotFileFilter; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.nio.ByteBuffer; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.filefilter.DirectoryFileFilter; -import org.apache.commons.io.filefilter.NotFileFilter; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - /** * @author Ben * @@ -95,7 +94,7 @@ public static Test suite() { TestSuite suite = new TestSuite(MessageInputStream.class.getSimpleName()); - File[] testFiles = new File("etc/samples/messages").listFiles( + File[] testFiles = new File("src/test/resources/samples/messages").listFiles( (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE)); for (int i = 0; i < testFiles.length; i++) { diff --git a/src/test/java/net/fortuna/mstor/model/AbstractMStorTest.java b/src/test/java/org/mstor/provider/mail/AbstractMStorTest.java similarity index 96% rename from src/test/java/net/fortuna/mstor/model/AbstractMStorTest.java rename to src/test/java/org/mstor/provider/mail/AbstractMStorTest.java index 88d4b0d1..4f5c55cd 100755 --- a/src/test/java/net/fortuna/mstor/model/AbstractMStorTest.java +++ b/src/test/java/org/mstor/provider/mail/AbstractMStorTest.java @@ -29,12 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; +import jakarta.mail.Folder; +import jakarta.mail.Store; import junit.framework.TestCase; +import org.mstor.connector.StoreLifecycle; -import javax.mail.Folder; -import javax.mail.Store; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/net/fortuna/mstor/model/MStorFolderTest.java b/src/test/java/org/mstor/provider/mail/MStorFolderTest.java similarity index 98% rename from src/test/java/net/fortuna/mstor/model/MStorFolderTest.java rename to src/test/java/org/mstor/provider/mail/MStorFolderTest.java index 06c9de7d..14c65eef 100755 --- a/src/test/java/net/fortuna/mstor/model/MStorFolderTest.java +++ b/src/test/java/org/mstor/provider/mail/MStorFolderTest.java @@ -29,13 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; +import jakarta.mail.*; import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.mstor.connector.StoreLifecycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.*; import java.io.IOException; import java.util.Arrays; @@ -55,7 +56,7 @@ public class MStorFolderTest extends AbstractMStorTest { // private static final int INITIAL_MESSAGE_COUNT = 1; - private static Log log = LogFactory.getLog(MStorFolderTest.class); + private static Logger log = LoggerFactory.getLogger(MStorFolderTest.class); // private static Properties p = new Properties(); // static { diff --git a/src/test/java/net/fortuna/mstor/model/MStorMessageTest.java b/src/test/java/org/mstor/provider/mail/MStorMessageTest.java similarity index 96% rename from src/test/java/net/fortuna/mstor/model/MStorMessageTest.java rename to src/test/java/org/mstor/provider/mail/MStorMessageTest.java index 1d31f2b5..43528bac 100755 --- a/src/test/java/net/fortuna/mstor/model/MStorMessageTest.java +++ b/src/test/java/org/mstor/provider/mail/MStorMessageTest.java @@ -29,12 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import jakarta.mail.*; +import org.mstor.connector.StoreLifecycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.*; import java.util.Enumeration; /** @@ -51,7 +52,7 @@ */ public class MStorMessageTest extends AbstractMStorTest { - private static Log log = LogFactory.getLog(MStorFolderTest.class); + private static Logger log = LoggerFactory.getLogger(MStorFolderTest.class); // private String testFolder; diff --git a/src/test/java/net/fortuna/mstor/model/MStorStoreTest.java b/src/test/java/org/mstor/provider/mail/MStorStoreTest.java similarity index 90% rename from src/test/java/net/fortuna/mstor/model/MStorStoreTest.java rename to src/test/java/org/mstor/provider/mail/MStorStoreTest.java index ee4aa1c6..6387f9af 100755 --- a/src/test/java/net/fortuna/mstor/model/MStorStoreTest.java +++ b/src/test/java/org/mstor/provider/mail/MStorStoreTest.java @@ -29,14 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.mail.Folder; -import javax.mail.MessagingException; -import javax.mail.URLName; +import jakarta.mail.Folder; +import jakarta.mail.MessagingException; +import jakarta.mail.URLName; +import org.mstor.connector.StoreLifecycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -51,7 +51,7 @@ */ public class MStorStoreTest extends AbstractMStorTest { - private static Log log = LogFactory.getLog(MStorStoreTest.class); + private static Logger log = LoggerFactory.getLogger(MStorStoreTest.class); /** * Default constructor. diff --git a/src/test/java/net/fortuna/mstor/model/MessedUpCacheTest.java b/src/test/java/org/mstor/provider/mail/MessedUpCacheTest.java similarity index 95% rename from src/test/java/net/fortuna/mstor/model/MessedUpCacheTest.java rename to src/test/java/org/mstor/provider/mail/MessedUpCacheTest.java index 26167a98..52fe15e3 100755 --- a/src/test/java/net/fortuna/mstor/model/MessedUpCacheTest.java +++ b/src/test/java/org/mstor/provider/mail/MessedUpCacheTest.java @@ -29,11 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; + +import jakarta.mail.*; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; +import org.mstor.connector.StoreLifecycle; -import javax.mail.*; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; import java.util.Random; /** diff --git a/src/test/java/net/fortuna/mstor/connector/ProtocolConnectorFactoryTest.java b/src/test/java/org/mstor/provider/mail/ProtocolConnectorFactoryTest.java similarity index 77% rename from src/test/java/net/fortuna/mstor/connector/ProtocolConnectorFactoryTest.java rename to src/test/java/org/mstor/provider/mail/ProtocolConnectorFactoryTest.java index e265b69d..18c22b80 100755 --- a/src/test/java/net/fortuna/mstor/connector/ProtocolConnectorFactoryTest.java +++ b/src/test/java/org/mstor/provider/mail/ProtocolConnectorFactoryTest.java @@ -29,16 +29,14 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.connector; - -import java.util.Properties; - -import javax.mail.Session; -import javax.mail.URLName; +package org.mstor.provider.mail; +import jakarta.mail.Session; +import jakarta.mail.URLName; import junit.framework.TestCase; -import net.fortuna.mstor.connector.jcr.JcrConnector; -import net.fortuna.mstor.connector.mbox.MboxConnector; +import org.junit.Ignore; + +import java.util.Properties; /** * @author Ben @@ -50,22 +48,23 @@ * * */ +@Ignore public class ProtocolConnectorFactoryTest extends TestCase { /** - * Test method for {@link ProtocolConnectorFactory#create(URLName, net.fortuna.mstor.MStorStore, Session)}. + * Test method for {@link ProtocolConnectorFactory#create(URLName, MStorStore, Session)}. */ public void testCreate() { Properties p = new Properties(); URLName urlName = new URLName("mstor", null, -1, "/tmp/mbox", null, null); - assertTrue(ProtocolConnectorFactory.getInstance().create(urlName, null, Session.getDefaultInstance(p)) - instanceof MboxConnector); + assertNotNull(ProtocolConnectorFactory.getInstance().create(urlName, null, + Session.getDefaultInstance(p))); urlName = new URLName("mstor", "localhost", -1, "/tmp/mbox", "test", null); - p.setProperty("mstor.repository.name", "test"); - assertTrue(ProtocolConnectorFactory.getInstance().create(urlName, null, Session.getDefaultInstance(p)) - instanceof JcrConnector); +// p.setProperty("mstor.repository.name", "test"); +// assertTrue(ProtocolConnectorFactory.getInstance().create(urlName, null, Session.getDefaultInstance(p)) +// instanceof JcrConnector); } } diff --git a/src/test/java/net/fortuna/mstor/model/TagTest.java b/src/test/java/org/mstor/provider/mail/TagTest.java similarity index 94% rename from src/test/java/net/fortuna/mstor/model/TagTest.java rename to src/test/java/org/mstor/provider/mail/TagTest.java index f8935a90..a803f191 100755 --- a/src/test/java/net/fortuna/mstor/model/TagTest.java +++ b/src/test/java/org/mstor/provider/mail/TagTest.java @@ -29,16 +29,17 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.Store; import junit.framework.TestCase; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.mstor.connector.StoreLifecycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Store; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -57,7 +58,7 @@ */ public class TagTest extends TestCase { - private static final Log LOG = LogFactory.getLog(TagTest.class); + private static final Logger LOG = LoggerFactory.getLogger(TagTest.class); // private String testFolder; diff --git a/src/test/java/net/fortuna/mstor/model/TagsTest.java b/src/test/java/org/mstor/provider/mail/TagsTest.java similarity index 82% rename from src/test/java/net/fortuna/mstor/model/TagsTest.java rename to src/test/java/org/mstor/provider/mail/TagsTest.java index 31c95d60..b4f2ae5f 100755 --- a/src/test/java/net/fortuna/mstor/model/TagsTest.java +++ b/src/test/java/org/mstor/provider/mail/TagsTest.java @@ -29,20 +29,20 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; +import jakarta.mail.Flags; import junit.framework.TestCase; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.Flags; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** - * Unit tests for {@link net.fortuna.mstor.model.Tags}. + * Unit tests for {@link Tags}. * * @author Ben Fortuna * @@ -55,7 +55,7 @@ */ public class TagsTest extends TestCase { - private static final Log LOG = LogFactory.getLog(TagsTest.class); + private static final Logger LOG = LoggerFactory.getLogger(TagsTest.class); private Flags flags; @@ -75,7 +75,7 @@ protected void setUp() throws Exception { } /* - * Test method for 'net.fortuna.mstor.Tags.size()' + * Test method for 'org.mstor.mail.Tags.size()' */ public void testSize() { assertEquals(4, tags.size()); @@ -83,7 +83,7 @@ public void testSize() { } /* - * Test method for 'net.fortuna.mstor.Tags.isEmpty()' + * Test method for 'org.mstor.mail.Tags.isEmpty()' */ public void testIsEmpty() { tags.clear(); @@ -92,7 +92,7 @@ public void testIsEmpty() { } /* - * Test method for 'net.fortuna.mstor.Tags.contains(Object)' + * Test method for 'org.mstor.mail.Tags.contains(Object)' */ public void testContains() { assertTrue(tags.contains("Work")); @@ -100,7 +100,7 @@ public void testContains() { } /* - * Test method for 'net.fortuna.mstor.Tags.iterator()' + * Test method for 'org.mstor.mail.Tags.iterator()' */ public void testIterator() { Iterator i = tags.iterator(); @@ -111,7 +111,7 @@ public void testIterator() { } /* - * Test method for 'net.fortuna.mstor.Tags.toArray()' + * Test method for 'org.mstor.mail.Tags.toArray()' */ public void testToArray() { Object[] array = tags.toArray(); @@ -119,7 +119,7 @@ public void testToArray() { } /* - * Test method for 'net.fortuna.mstor.Tags.toArray(T[]) ' + * Test method for 'org.mstor.mail.Tags.toArray(T[]) ' */ public void testToArrayTArray() { String[] array = (String[]) tags.toArray(new String[tags.size()]); @@ -127,7 +127,7 @@ public void testToArrayTArray() { } /* - * Test method for 'net.fortuna.mstor.Tags.add(String)' + * Test method for 'org.mstor.mail.Tags.add(String)' */ public void testAdd() { tags.add("mstor"); @@ -136,7 +136,7 @@ public void testAdd() { } /* - * Test method for 'net.fortuna.mstor.Tags.remove(Object)' + * Test method for 'org.mstor.mail.Tags.remove(Object)' */ public void testRemove() { tags.remove("Work"); @@ -145,7 +145,7 @@ public void testRemove() { } /* - * Test method for 'net.fortuna.mstor.Tags.containsAll(Collection)' + * Test method for 'org.mstor.mail.Tags.containsAll(Collection)' */ public void testContainsAll() { Set set = new HashSet(); @@ -155,7 +155,7 @@ public void testContainsAll() { } /* - * Test method for 'net.fortuna.mstor.Tags.addAll(Collection)' + * Test method for 'org.mstor.mail.Tags.addAll(Collection)' */ public void testAddAll() { Set set = new HashSet(); @@ -167,7 +167,7 @@ public void testAddAll() { } /* - * Test method for 'net.fortuna.mstor.Tags.retainAll(Collection)' + * Test method for 'org.mstor.mail.Tags.retainAll(Collection)' */ public void testRetainAll() { Set set = new HashSet(); @@ -180,7 +180,7 @@ public void testRetainAll() { } /* - * Test method for 'net.fortuna.mstor.Tags.removeAll(Collection)' + * Test method for 'org.mstor.mail.Tags.removeAll(Collection)' */ public void testRemoveAll() { Set set = new HashSet(); @@ -195,7 +195,7 @@ public void testRemoveAll() { } /* - * Test method for 'net.fortuna.mstor.Tags.clear()' + * Test method for 'org.mstor.mail.Tags.clear()' */ public void testClear() { tags.clear(); diff --git a/src/test/java/net/fortuna/mstor/model/UIDFolderTest.java b/src/test/java/org/mstor/provider/mail/UIDFolderTest.java similarity index 93% rename from src/test/java/net/fortuna/mstor/model/UIDFolderTest.java rename to src/test/java/org/mstor/provider/mail/UIDFolderTest.java index ad6d4972..aaf4d242 100755 --- a/src/test/java/net/fortuna/mstor/model/UIDFolderTest.java +++ b/src/test/java/org/mstor/provider/mail/UIDFolderTest.java @@ -29,15 +29,16 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.model; +package org.mstor.provider.mail; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.UIDFolder; +import org.mstor.connector.StoreLifecycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.UIDFolder; import java.util.ArrayList; import java.util.List; @@ -55,7 +56,7 @@ */ public class UIDFolderTest extends AbstractMStorTest { - private static final Log LOG = LogFactory.getLog(UIDFolderTest.class); + private static final Logger LOG = LoggerFactory.getLogger(UIDFolderTest.class); /* private static Properties p = new Properties(); @@ -81,7 +82,7 @@ public UIDFolderTest(String method, StoreLifecycle lifecycle, /* * (non-Javadoc) * - * @see net.fortuna.mstor.model.AbstractMStorTest#setUp() + * @see org.mstor.mail.model.AbstractMStorTest#setUp() */ protected void setUp() throws Exception { super.setUp(); @@ -96,7 +97,7 @@ protected void setUp() throws Exception { } /* (non-Javadoc) - * @see net.fortuna.mstor.model.AbstractMStorTest#tearDown() + * @see org.mstor.mail.model.AbstractMStorTest#tearDown() */ protected void tearDown() throws Exception { for (int i = 0; i < uidFolders.length; i++) { diff --git a/src/test/java/net/fortuna/mstor/search/SearchTermsTest.java b/src/test/java/org/mstor/provider/mail/search/SearchTermsTest.java similarity index 87% rename from src/test/java/net/fortuna/mstor/search/SearchTermsTest.java rename to src/test/java/org/mstor/provider/mail/search/SearchTermsTest.java index 9e8f3524..695a1482 100755 --- a/src/test/java/net/fortuna/mstor/search/SearchTermsTest.java +++ b/src/test/java/org/mstor/provider/mail/search/SearchTermsTest.java @@ -29,17 +29,17 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; +package org.mstor.provider.mail.search; +import jakarta.mail.search.AddressStringTerm; +import jakarta.mail.search.FromStringTerm; +import jakarta.mail.search.OrTerm; import junit.framework.TestCase; -import net.fortuna.mstor.model.Tags; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.junit.Ignore; +import org.mstor.provider.mail.Tags; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.mail.search.AddressStringTerm; -import javax.mail.search.FromStringTerm; -import javax.mail.search.OrTerm; import java.io.StringReader; import java.io.StringWriter; @@ -56,7 +56,7 @@ @Ignore public class SearchTermsTest extends TestCase { - private static final Log LOG = LogFactory.getLog(SearchTermsTest.class); + private static final Logger LOG = LoggerFactory.getLogger(SearchTermsTest.class); /** * Test save method. diff --git a/src/test/java/net/fortuna/mstor/search/TagsTermTest.java b/src/test/java/org/mstor/provider/mail/search/TagsTermTest.java similarity index 92% rename from src/test/java/net/fortuna/mstor/search/TagsTermTest.java rename to src/test/java/org/mstor/provider/mail/search/TagsTermTest.java index 7ebecb68..daaa5a9d 100755 --- a/src/test/java/net/fortuna/mstor/search/TagsTermTest.java +++ b/src/test/java/org/mstor/provider/mail/search/TagsTermTest.java @@ -29,29 +29,29 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.fortuna.mstor.search; +package org.mstor.provider.mail.search; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.Store; +import jakarta.mail.search.AddressStringTerm; +import jakarta.mail.search.FromStringTerm; +import jakarta.mail.search.OrTerm; import junit.framework.TestCase; -import net.fortuna.mstor.model.StoreLifecycle; -import net.fortuna.mstor.model.Taggable; -import net.fortuna.mstor.model.Tags; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Store; -import javax.mail.search.AddressStringTerm; -import javax.mail.search.FromStringTerm; -import javax.mail.search.OrTerm; +import org.mstor.connector.StoreLifecycle; +import org.mstor.provider.mail.Taggable; +import org.mstor.provider.mail.Tags; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.ArrayList; import java.util.List; /** - * Unit tests for {@link net.fortuna.mstor.search.TagsTerm}. + * Unit tests for {@link TagsTerm}. * * @author Ben Fortuna * @@ -64,7 +64,7 @@ */ public class TagsTermTest extends TestCase { - private static final Log LOG = LogFactory.getLog(TagsTermTest.class); + private static final Logger LOG = LoggerFactory.getLogger(TagsTermTest.class); private String tag = "Test 1"; diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 34ac7c91..a12da07a 100755 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -32,26 +32,26 @@ ## set root logging preferences.. log4j.rootLogger=info, stdout -#log4j.logger.net.fortuna.mstor=debug, stdout -#log4j.additivity.net.fortuna.mstor=false +#log4j.logger.org.mstor.mbox=debug, stdout +#log4j.additivity.org.mstor.mbox=false log4j.logger.net.sf.ehcache=info, stdout log4j.additivity.net.sf.ehcache=false -log4j.logger.net.fortuna.mstor.data.MboxFile=warn, stdout -log4j.additivity.net.fortuna.mstor.data.MboxFile=false +log4j.logger.org.mstor.data.MboxFile=warn, stdout +log4j.additivity.org.mstor.data.MboxFile=false -log4j.logger.net.fortuna.mstor.delegate.MetaMessage=debug, stdout -log4j.additivity.net.fortuna.mstor.delegate.MetaMessage=false +log4j.logger.org.mstor.mbox.delegate.MetaMessage=debug, stdout +log4j.additivity.org.mstor.mbox.delegate.MetaMessage=false -log4j.logger.net.fortuna.mstor.data.MboxEncoderTest=debug, stdout -log4j.additivity.net.fortuna.mstor.data.MboxEncoderTest=false +log4j.logger.org.mstor.mbox.data.MboxEncoderTest=debug, stdout +log4j.additivity.org.mstor.mbox.data.MboxEncoderTest=false -log4j.logger.net.fortuna.mstor.data.MboxFileTest=info, stdout -log4j.additivity.net.fortuna.mstor.data.MboxFileTest=false +log4j.logger.org.mstor.mbox.data.MboxFileTest=info, stdout +log4j.additivity.org.mstor.mbox.data.MboxFileTest=false -log4j.logger.net.fortuna.mstor.util.Configurator=warn, stdout -log4j.additivity.net.fortuna.mstor.util.Configurator=false +log4j.logger.org.mstor.util.Configurator=warn, stdout +log4j.additivity.org.mstor.util.Configurator=false ## appender: stdout.. log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout diff --git a/src/test/resources/logback.groovy b/src/test/resources/logback.groovy index a59bd63a..f42a2097 100644 --- a/src/test/resources/logback.groovy +++ b/src/test/resources/logback.groovy @@ -29,9 +29,8 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import ch.qos.logback.classic.Level -import ch.qos.logback.classic.encoder.PatternLayoutEncoder -import ch.qos.logback.core.ConsoleAppender + +import Level appender("CONSOLE", ConsoleAppender) { encoder(PatternLayoutEncoder) { diff --git a/etc/samples/mailboxes/MboxFile/Inbox b/src/test/resources/samples/mailboxes/MboxFile/Inbox similarity index 100% rename from etc/samples/mailboxes/MboxFile/Inbox rename to src/test/resources/samples/mailboxes/MboxFile/Inbox diff --git a/etc/samples/mailboxes/Store/Inbox b/src/test/resources/samples/mailboxes/Store/Inbox similarity index 100% rename from etc/samples/mailboxes/Store/Inbox rename to src/test/resources/samples/mailboxes/Store/Inbox diff --git a/etc/samples/mailboxes/Tags/Inbox b/src/test/resources/samples/mailboxes/Tags/Inbox similarity index 100% rename from etc/samples/mailboxes/Tags/Inbox rename to src/test/resources/samples/mailboxes/Tags/Inbox diff --git a/etc/samples/mailboxes/Tags/Inbox.emf b/src/test/resources/samples/mailboxes/Tags/Inbox.emf similarity index 100% rename from etc/samples/mailboxes/Tags/Inbox.emf rename to src/test/resources/samples/mailboxes/Tags/Inbox.emf diff --git a/etc/samples/mailboxes/TagsTerm/Inbox b/src/test/resources/samples/mailboxes/TagsTerm/Inbox similarity index 100% rename from etc/samples/mailboxes/TagsTerm/Inbox rename to src/test/resources/samples/mailboxes/TagsTerm/Inbox diff --git a/etc/samples/mailboxes/TagsTerm/Inbox.emf b/src/test/resources/samples/mailboxes/TagsTerm/Inbox.emf similarity index 100% rename from etc/samples/mailboxes/TagsTerm/Inbox.emf rename to src/test/resources/samples/mailboxes/TagsTerm/Inbox.emf diff --git a/etc/samples/mailboxes/UIDFolder/Inbox b/src/test/resources/samples/mailboxes/UIDFolder/Inbox similarity index 100% rename from etc/samples/mailboxes/UIDFolder/Inbox rename to src/test/resources/samples/mailboxes/UIDFolder/Inbox diff --git a/etc/samples/mailboxes/UIDFolder/Inbox.emf b/src/test/resources/samples/mailboxes/UIDFolder/Inbox.emf similarity index 100% rename from etc/samples/mailboxes/UIDFolder/Inbox.emf rename to src/test/resources/samples/mailboxes/UIDFolder/Inbox.emf diff --git a/etc/samples/mailboxes/contenttype-semis.mbox b/src/test/resources/samples/mailboxes/contenttype-semis.mbox similarity index 100% rename from etc/samples/mailboxes/contenttype-semis.mbox rename to src/test/resources/samples/mailboxes/contenttype-semis.mbox diff --git a/etc/samples/mailboxes/foxmail/NEWBO2.BOX b/src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX similarity index 98% rename from etc/samples/mailboxes/foxmail/NEWBO2.BOX rename to src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX index 2128d2e7..3f2cfec1 100644 --- a/etc/samples/mailboxes/foxmail/NEWBO2.BOX +++ b/src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX @@ -1,592 +1,592 @@ -S -Date: -From: "Foxmail¿ª·¢×é" -To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?=" -Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?= -Message-ID: <200906261059103758227@foxmail.com> -X-mailer: Foxmail 6, 15, 201, 21 [cn] -Mime-Version: 1.0 -Content-Type: multipart/related; - boundary="=====002_Dragon172714510278_====="; - type="multipart/alternative" - -This is a multi-part message in MIME format. - ---=====002_Dragon172714510278_===== -Content-Type: multipart/alternative; - boundary="=====003_Dragon172714510278_=====" - - ---=====003_Dragon172714510278_===== -Content-Type: text/plain; - charset="gb2312" -Content-Transfer-Encoding: base64 - -IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x -49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ -wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH -18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9 -sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi -uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21 -tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0 -tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg -DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d -tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7 -r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi -t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g -0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9 -wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4 -xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/ -7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht -YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog -zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT -yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5 -09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq -1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K -vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW -97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs -08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM -4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ -0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX -q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP -T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL -zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2 -ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg -0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5 -xOo21MINCg== - ---=====003_Dragon172714510278_===== -Content-Type: text/html; - charset="gb2312" -Content-Transfer-Encoding: base64 - -PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv -L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF -IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du -ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg -KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1 -bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l -dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv -bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0 -eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw -cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7 -IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO -Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ -R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu -dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS -R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ -TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF -Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU -OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct -Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw -cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog -MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN -CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4 -OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct -VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM -SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl -Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw -eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H -LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU -OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O -VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp -ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI -RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw -eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP -VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog -MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv -U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F -UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu -bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9 -MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm -bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj -bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk -dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv -Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3 -uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z -dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg -d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8 -L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ -xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz -cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8 -VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7 -PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN -tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz -PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU -RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR -y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ -PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8 -zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk -dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg -ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U -Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2 -yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K -vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK -p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K -08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT -xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi -o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi -o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+ -PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G -b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB -Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP -RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9 -dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8 -UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh -oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog -IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj -bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+ -DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz -cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz -PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU -RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL -987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT -0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+ -tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys -oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K -ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg -Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC -TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P -8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250 -Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo -PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48 -L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28 -/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2 -1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo -PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+ -DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv -VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK -vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1 -xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw -JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj -bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U -QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr -x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z -dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg -d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv -Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9 -yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS -u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+ -PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp -bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW -IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg== - ---=====003_Dragon172714510278_=====-- - ---=====002_Dragon172714510278_===== -Content-Type: image/jpeg; - name="banner(06-26-10-58-52).jpg" -Content-Transfer-Encoding: base64 -Content-ID: <__0@Foxmail.net> - -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 -3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c -J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1 -cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd -XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps -Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ -1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1 -nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m -HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9 -BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA -80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG -KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA -t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w -580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F -wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt -el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl -y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO -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 -cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D -8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14 -/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8 -4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq -fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on -yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze -e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN -57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8 -3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57 -zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57 -zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+ -FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ -uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn -IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B -xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo -Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf -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 -lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4 -9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t -5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2 -l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk -desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj -HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd -JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8 -mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m -fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn -4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T -/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8 -Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ -x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f -Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+ -nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f -Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r -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 -b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt -+gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO -mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2 -Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr -Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0 -tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0 -bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L -lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN -walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf -guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL -ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa -m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt -M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP -9ar+x//Z - ---=====002_Dragon172714510278_===== -Content-Type: image/gif; - name="bot(06-26-10-58-52).gif" -Content-Transfer-Encoding: base64 -Content-ID: <__1@Foxmail.net> - -R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg -7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA -AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz -gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7 - ---=====002_Dragon172714510278_=====-- +S +Date: +From: "Foxmail¿ª·¢×é" +To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?=" +Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?= +Message-ID: <200906261059103758227@foxmail.com> +X-mailer: Foxmail 6, 15, 201, 21 [cn] +Mime-Version: 1.0 +Content-Type: multipart/related; + boundary="=====002_Dragon172714510278_====="; + type="multipart/alternative" + +This is a multi-part message in MIME format. + +--=====002_Dragon172714510278_===== +Content-Type: multipart/alternative; + boundary="=====003_Dragon172714510278_=====" + + +--=====003_Dragon172714510278_===== +Content-Type: text/plain; + charset="gb2312" +Content-Transfer-Encoding: base64 + +IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x +49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ +wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH +18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9 +sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi +uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21 +tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0 +tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg +DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d +tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7 +r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi +t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g +0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9 +wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4 +xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/ +7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht +YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog +zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT +yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5 +09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq +1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K +vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW +97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs +08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM +4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ +0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX +q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP +T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL +zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2 +ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg +0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5 +xOo21MINCg== + +--=====003_Dragon172714510278_===== +Content-Type: text/html; + charset="gb2312" +Content-Transfer-Encoding: base64 + +PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv +L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF +IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du +ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg +KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1 +bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l +dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv +bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0 +eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw +cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7 +IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO +Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ +R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu +dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS +R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ +TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF +Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU +OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct +Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw +cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog +MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN +CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4 +OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct +VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM +SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl +Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw +eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H +LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU +OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O +VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp +ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI +RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw +eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP +VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog +MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv +U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F +UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu +bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9 +MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm +bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj +bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk +dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv +Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3 +uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z +dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg +d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8 +L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ +xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz +cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8 +VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7 +PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN +tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz +PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU +RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR +y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ +PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8 +zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk +dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg +ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U +Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2 +yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K +vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK +p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K +08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT +xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi +o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi +o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+ +PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G +b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB +Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP +RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9 +dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8 +UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh +oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog +IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj +bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+ +DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz +cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz +PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU +RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL +987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT +0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+ +tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys +oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K +ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg +Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC +TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P +8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250 +Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo +PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48 +L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28 +/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2 +1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo +PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+ +DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv +VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK +vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1 +xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw +JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj +bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U +QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr +x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z +dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg +d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv +Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9 +yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS +u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+ +PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp +bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW +IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg== + +--=====003_Dragon172714510278_=====-- + +--=====002_Dragon172714510278_===== +Content-Type: image/jpeg; + name="banner(06-26-10-58-52).jpg" +Content-Transfer-Encoding: base64 +Content-ID: <__0@Foxmail.net> + +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 +3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c +J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1 +cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd +XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps +Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ +1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1 +nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m +HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9 +BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA +80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG +KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA +t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w +580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F +wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt +el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl +y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO +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 +cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D +8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14 +/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8 +4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq +fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on +yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze +e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN +57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8 +3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57 +zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57 +zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+ +FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ +uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn +IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B +xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo +Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf +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 +lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4 +9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t +5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2 +l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk +desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj +HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd +JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8 +mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m +fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn +4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T +/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8 +Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ +x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f +Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+ +nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f +Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r +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 +b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt ++gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO +mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2 +Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr +Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0 +tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0 +bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L +lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN +walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf +guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL +ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa +m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt +M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP +9ar+x//Z + +--=====002_Dragon172714510278_===== +Content-Type: image/gif; + name="bot(06-26-10-58-52).gif" +Content-Transfer-Encoding: base64 +Content-ID: <__1@Foxmail.net> + +R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg +7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA +AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz +gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7 + +--=====002_Dragon172714510278_=====-- diff --git a/etc/samples/mailboxes/foxmail/in.BOX b/src/test/resources/samples/mailboxes/foxmail/in.BOX similarity index 98% rename from etc/samples/mailboxes/foxmail/in.BOX rename to src/test/resources/samples/mailboxes/foxmail/in.BOX index 63aa4861..99bdb624 100644 --- a/etc/samples/mailboxes/foxmail/in.BOX +++ b/src/test/resources/samples/mailboxes/foxmail/in.BOX @@ -1,1266 +1,1266 @@ -S -Date: -From: "Foxmail¿ª·¢×é" -To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?=" -Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?= -Message-ID: <200906261059103758227@foxmail.com> -X-mailer: Foxmail 6, 15, 201, 21 [cn] -Mime-Version: 1.0 -Content-Type: multipart/related; - boundary="=====002_Dragon172714510278_====="; - type="multipart/alternative" - -This is a multi-part message in MIME format. - ---=====002_Dragon172714510278_===== -Content-Type: multipart/alternative; - boundary="=====003_Dragon172714510278_=====" - - ---=====003_Dragon172714510278_===== -Content-Type: text/plain; - charset="gb2312" -Content-Transfer-Encoding: base64 - -IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x -49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ -wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH -18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9 -sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi -uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21 -tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0 -tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg -DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d -tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7 -r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi -t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g -0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9 -wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4 -xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/ -7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht -YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog -zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT -yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5 -09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq -1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K -vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW -97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs -08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM -4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ -0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX -q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP -T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL -zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2 -ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg -0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5 -xOo21MINCg== - ---=====003_Dragon172714510278_===== -Content-Type: text/html; - charset="gb2312" -Content-Transfer-Encoding: base64 - -PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv -L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF -IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du -ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg -KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1 -bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l -dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv -bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0 -eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw -cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7 -IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO -Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ -R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu -dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS -R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ -TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF -Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU -OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct -Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw -cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog -MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN -CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4 -OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct -VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM -SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl -Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw -eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H -LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU -OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O -VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp -ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI -RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw -eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP -VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog -MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv -U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F -UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu -bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9 -MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm -bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj -bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk -dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv -Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3 -uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z -dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg -d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8 -L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ -xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz -cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8 -VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7 -PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN -tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz -PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU -RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR -y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ -PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8 -zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk -dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg -ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U -Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2 -yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K -vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK -p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K -08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT -xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi -o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi -o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+ -PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G -b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB -Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP -RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9 -dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8 -UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh -oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog -IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj -bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+ -DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz -cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz -PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU -RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL -987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT -0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+ -tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys -oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K -ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg -Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC -TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P -8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250 -Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo -PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48 -L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28 -/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2 -1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo -PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+ -DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv -VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK -vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1 -xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw -JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj -bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U -QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr -x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z -dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg -d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv -Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9 -yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS -u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+ -PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp -bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW -IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg== - ---=====003_Dragon172714510278_=====-- - ---=====002_Dragon172714510278_===== -Content-Type: image/jpeg; - name="banner(06-26-10-58-52).jpg" -Content-Transfer-Encoding: base64 -Content-ID: <__0@Foxmail.net> - -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 -3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c -J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1 -cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd -XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps -Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ -1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1 -nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m -HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9 -BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA -80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG -KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA -t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w -580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F -wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt -el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl -y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO -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 -cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D -8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14 -/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8 -4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq -fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on -yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze -e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN -57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8 -3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57 -zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57 -zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+ -FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ -uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn -IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B -xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo -Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf -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 -lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4 -9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t -5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2 -l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk -desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj -HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd -JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8 -mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m -fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn -4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T -/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8 -Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ -x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f -Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+ -nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f -Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r -/wD/2gAIAQIDAT8Q/ptyvCwyzcuXLilzkf09Bw2lxJGLS3EuXLly4MuPBUqVKlSpUqVKlSpUqVKl -SpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUr/AMthKy8XggjCnhAesscpsy+LymSXFLlwZUwf -6MgjC3jcRFsuBcI3qlURLWFwUeIGM4OIMGDBnL41KlSpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVK -lSpUqVKlSpUqVKlSpUrhUr6qhERUVfAkj0Rb4MZQhaWR8Fw4NA1EVTBgwYQZcf0BrrwVFDWJ5Rbw -qIIt8LWuCpfC5cuDFwMVwYQhCVMvFypUqVLulwIFLzm09pbhFdovNHPzfaDcqVKlSpUqVKljTWN1 -qdMvxGBAF1m+3eGkKxBdI+e83f2hClHnuxAtl1BfPebv7RUFHnvKlSpUqVKlSpUqVK4VwqVKlSuF -fRBm2VEovlFvh1OIk0irrx1Q0LHHxEIpVhwEIQhBxXhejFcENHJb32IlLpzQMuduVRW8Dnf/AGCh -IWc1npj2lgVKuQMWxdnK+TDti4TOo94IWtyGvIdfiHrBs4dDlKORRbvdGPvGEUi6sBLZF9RjFwCV -b63+hMbo1/0I/LYUXpWiOuWVIrWvEa4VlZ0x6GXh3RG7Abr8EAxGpqlvW9SUOC+0GsfwAsjWzVOF -THLiINEVdfDr49+gHjEIQh42N+v6lrMJ/n4Iv8CztmFDWkX2M/5CV81HpHq/S3ID/sGHAXz07Rzk -8m3lpAUNKPxCx+g9Nf1LAdR/L94Sa0P0Lz9jGp0sGOR6dqgNxzQXfrEo+Q/l+82w3q+WGVy/f/jh -bTpMucsValArpDBZrLM4mnyv/gQWmdBiNUawt68K8OrhmPjIa8GsEIQh4wKDOlqgAURtPnUSUubq -VaA6ChK6mvXn7ygt6yZYes0JOikmDE6CCYNi3d3eb63Hy06qfMp8yllTvOFr1iZRLrSz3mbVVXmt -vBCxNr8f5G7CWRMwWkm1+P8AIpYfiBX8CecN1GLEp+gNY7Egica4hCCDazVCEIQ/oIslWVCTPKZq -YjqRhZyiV4b18USVKlSoHC1lYGGiEIQh46XAsrUaFyt1K1cp4WkQa8CsBEEA+BBrwESl1Ll8bl8L -408CSCSsBMQMsupZdSt14FqINZSoDEEBjyR+TgKZqOTKmDZLl+vC3hL6JUU6y0qW4bwKlSpXDUuZ -m5hCEIQ8JJ15fuE7WY3+eBWW0bkI+WItiIviNtLv7QhGj9xEcfqBRDow2kS/P+Q1yhzpwKsvSBd1 -2RIDesFynz8TBbjdtS1LJeU2qFg95XKBgiYXpG5ekPy/XAmr6d594Id4YDAlyrDu/uZsWZq68/EL -brSBXBpWqrPfvNGJTR5/ULRcMitczJ08+0wTz+pZdOn5gzff88BzguNBzIYiSpXCpUqVNIWGrgPH -k2QG3WOrYklmGEIQh49qAEoqolyspVRDxqVKyso0lJWIlF3xqJcpVSkQYh1gBAqAGnEA0lEqIMrj -UpdxF3ACAEAIl8KrjRwpVSiAaxLqQLQiHWAG+CWQwwaE5ho8KlSpUqVKlRjH8pqmIK0SY8yPNXG0 -FSlWxoy4l5Jfh4HA/oZzBZ2mZaVUqVKlSpUqVKjDwLwkJwWROFDOVxEtX9COODRhsipUqVKlSpUq -VKlSpUqVGL+LmU4iyAP6IkFkw7Ro1KlSpUqVKlSpUqVKlSpXAtyeDnPJx3CbhNwm4TcJuE3CbhNw -m4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3Cbh -Nwm4TcJuE3CbhNwm4TcJuE3CbpN0m6TdJuk3yb5N895vnvN895vnvOpJuk3iLGpN4m8TeJvE3ibx -N4m8TeJvE3ibxN4m8TeJvE3yPUIeonBLadrmw95svebL3/rV/wBj/9oACAEDAwE/EP6bUtwHEVKl -SpUqc7+n24KSoNhFeIkqVKlSokFP9Kp4aSuAmEkJJdpMpUUQ6pQxJUqVKlh/R7cNONQkBKmkVwcM -JKJiIcEWBBEleDmf0KlhIZXgEwMqVKjiXNcA8FROAWpqcHiyh/oAx4QWEgHGuNXCDhXGpUSCLlE4 -sYLJWa8Jmsq1Y8sfmYrZAA5t/wCTee8p0+6B1nX/AGJX0hbAwWe0psda5R1hw7Sg3gsY46jph/af -PSPMt6Xf/REVEesnWWX1qHz0qiyNFb7/AJv4BS+A4A8FeB0muCHjeDRjGMYxlZ8O5BANK/iZzOuL -ziEgKzK9F1/2VtfNaEbrV6DBPR7aSigDr51j6ijaYEX2hSqAbRLTS60mLgG2JeQr2I2ovQ9YtsMO -QGWXLocKh6B9Wh+b9IAGrdLDyHo594uGBrQzrzmty09potRfRuaj0KumctOte0pBYbx66a9oiUU6 -b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt -+gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO -mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2 -Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr -Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0 -tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0 -bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L -lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN -walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf -guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL -ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa -m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt -M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP -9ar+x//Z - ---=====002_Dragon172714510278_===== -Content-Type: image/gif; - name="bot(06-26-10-58-52).gif" -Content-Transfer-Encoding: base64 -Content-ID: <__1@Foxmail.net> - -R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg -7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA -AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz -gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7 - ---=====002_Dragon172714510278_=====-- -S -X-Uidl: GmailId12a6707d170a511c&&pop.gmail.com -Return-Path: -Received: from Antoni-Windows7 (ita250.internetdsl.tpnet.pl [79.190.233.250]) - by mx.google.com with ESMTPS id a48sm2388387eei.6.2010.08.12.09.00.18 - (version=SSLv3 cipher=RC4-MD5); - Thu, 12 Aug 2010 09:00:19 -0700 (PDT) -Date: Thu, 12 Aug 2010 18:00:25 +0200 -From: "johnnybravo159" -To: "johnnybravo159" -Subject: Test mail from Foxmail. -Message-ID: <201008121800258604089@gmail.com> -X-mailer: Foxmail 6, 15, 201, 22 [en] - -This mail was sent by Foxmail where testing your SMTP setting. - -S -X-Uidl: GmailId12a670cec752827c&&pop.gmail.com -Delivered-To: johnnybravo159@gmail.com -Received: by 10.227.143.6 with SMTP id s6cs144098wbu; - Thu, 12 Aug 2010 09:05:55 -0700 (PDT) -Received: by 10.213.5.5 with SMTP id 5mr385907ebt.72.1281629155351; - Thu, 12 Aug 2010 09:05:55 -0700 (PDT) -Return-Path: -Received: from mail-ey0-f177.google.com (mail-ey0-f177.google.com [209.85.215.177]) - by mx.google.com with ESMTP id w46si4044334eeh.87.2010.08.12.09.05.54; - Thu, 12 Aug 2010 09:05:54 -0700 (PDT) -Received-SPF: pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) client-ip=209.85.215.177; -Authentication-Results: mx.google.com; spf=pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) smtp.mail=antoni.mylka@gmail.com; dkim=pass (test mode) header.i=@gmail.com -Received: by mail-ey0-f177.google.com with SMTP id 10so855513eyd.36 - for ; Thu, 12 Aug 2010 09:05:54 -0700 (PDT) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=gamma; - h=domainkey-signature:received:received:message-id:date:from - :user-agent:mime-version:to:subject:references:in-reply-to - :content-type:content-transfer-encoding; - bh=PivaTP4ZM6VG0cBqUIcNpNqEdDuLIjYl/ub0gtahuU4=; - b=kB1U6Pp8EVDMWEUl+n8BsD9BYFi6u1qaIgnTBqUwhZ57uso0t11pVp+noSS7Wfxm9u - S3wH8uM/NcGLcBE29cfDvEe4s43j+bF04RnBIYM6S+ExHB5EQ3hqCeHlHfAgKCNCM9+/ - yVE5v9w+G8N8wCkMD2jnMCG1G7P9ah49E7n5E= -DomainKey-Signature: a=rsa-sha1; c=nofws; - d=gmail.com; s=gamma; - h=message-id:date:from:user-agent:mime-version:to:subject:references - :in-reply-to:content-type:content-transfer-encoding; - b=qfpJCkETuSk1g6LVXFfQcRvXyRW87IoqKy8sj+TY75VYLlQHUR1fMBw33QPR+QppH3 - duzZ33oOqNwcGsG/GYOHeWWfK7e7+PAWYM/Cq8+r6TiJVgT3EpqP7vySPS0tOYBBDfHQ - mXGCJdkpd1wNqklEtCqzHvBxSB3kpx1jrRiqI= -Received: by 10.213.28.194 with SMTP id n2mr7432209ebc.10.1281629154117; - Thu, 12 Aug 2010 09:05:54 -0700 (PDT) -Return-Path: -Received: from [192.168.0.4] (ita250.internetdsl.tpnet.pl [79.190.233.250]) - by mx.google.com with ESMTPS id v59sm2397289eeh.10.2010.08.12.09.05.52 - (version=SSLv3 cipher=RC4-MD5); - Thu, 12 Aug 2010 09:05:52 -0700 (PDT) -Message-ID: <4C641BDC.9080504@gmail.com> -Date: Thu, 12 Aug 2010 18:05:48 +0200 -From: Antoni Mylka -User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.11) Gecko/20100711 Lightning/1.0b1 Thunderbird/3.0.6 -MIME-Version: 1.0 -To: johnnybravo159 -Subject: Re: A test email from Foxmail -References: <201008121803499552355@gmail.com> -In-Reply-To: <201008121803499552355@gmail.com> -Content-Type: text/plain; charset=UTF-8; format=flowed -Content-Transfer-Encoding: 7bit - -W dniu 2010-08-12 18:03, johnnybravo159 pisze: -> Hello everyone, I succesfully installed Foxmail, -> I wonder if it makes any sense to use mstor for this. It seems like a -> huge overkill. -> Or should we rather settle on implementing an incomplete javamail driver -> with very limited functionality. single-folder, without properly -> supporting those standard-violating 8bit characters in emails. -> This might become a problem though. This is a Chineese program, popular -> in china. The majority of customers who would like to use it, will -> probably use it on chinese content. This means that my driver pretty -> much has to support CJK characters properly. Otherwise it's as good as -> useles.. - -Hello, anybody there? - -Antoni -S -Date: -From: "Foxmail¿ª·¢×é" -To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?=" -Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?= -Message-ID: <200906261059103758227@foxmail.com> -X-mailer: Foxmail 6, 15, 201, 21 [cn] -Mime-Version: 1.0 -Content-Type: multipart/related; - boundary="=====002_Dragon172714510278_====="; - type="multipart/alternative" - -This is a multi-part message in MIME format. - ---=====002_Dragon172714510278_===== -Content-Type: multipart/alternative; - boundary="=====003_Dragon172714510278_=====" - - ---=====003_Dragon172714510278_===== -Content-Type: text/plain; - charset="gb2312" -Content-Transfer-Encoding: base64 - -IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x -49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ -wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH -18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9 -sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi -uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21 -tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0 -tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg -DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d -tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7 -r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi -t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g -0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9 -wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4 -xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/ -7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht -YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog -zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT -yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5 -09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq -1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K -vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW -97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs -08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM -4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ -0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX -q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP -T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL -zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2 -ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg -0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5 -xOo21MINCg== - ---=====003_Dragon172714510278_===== -Content-Type: text/html; - charset="gb2312" -Content-Transfer-Encoding: base64 - -PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv -L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF -IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du -ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg -KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1 -bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l -dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv -bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0 -eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw -cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7 -IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO -Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ -R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu -dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS -R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ -TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF -Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU -OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct -Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw -cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog -MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN -CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4 -OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct -VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM -SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl -Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw -eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H -LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU -OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O -VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp -ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI -RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw -eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP -VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog -MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv -U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F -UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu -bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9 -MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm -bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj -bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk -dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv -Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3 -uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z -dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg -d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8 -L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ -xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz -cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8 -VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7 -PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN -tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz -PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU -RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR -y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ -PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8 -zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk -dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg -ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U -Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2 -yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K -vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK -p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K -08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT -xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi -o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi -o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+ -PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G -b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB -Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP -RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9 -dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8 -UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh -oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog -IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj -bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+ -DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz -cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz -PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU -RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL -987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT -0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+ -tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys -oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K -ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg -Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC -TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P -8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250 -Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo -PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48 -L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28 -/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2 -1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo -PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+ -DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv -VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK -vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1 -xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw -JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj -bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U -QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr -x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z -dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg -d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv -Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9 -yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS -u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+ -PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp -bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW -IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg== - ---=====003_Dragon172714510278_=====-- - ---=====002_Dragon172714510278_===== -Content-Type: image/jpeg; - name="banner(06-26-10-58-52).jpg" -Content-Transfer-Encoding: base64 -Content-ID: <__0@Foxmail.net> - -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 -3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c -J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1 -cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd -XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps -Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ -1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1 -nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m -HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9 -BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA -80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG -KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA -t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w -580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F -wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt -el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl -y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO -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 -cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D -8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14 -/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8 -4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq -fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on -yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze -e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN -57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8 -3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57 -zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57 -zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+ -FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ -uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn -IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B -xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo -Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf -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 -lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4 -9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t -5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2 -l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk -desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj -HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd -JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8 -mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m -fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn -4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T -/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8 -Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ -x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f -Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+ -nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f -Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r -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 -b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt -+gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO -mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2 -Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr -Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0 -tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0 -bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L -lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN -walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf -guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL -ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa -m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt -M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP -9ar+x//Z - ---=====002_Dragon172714510278_===== -Content-Type: image/gif; - name="bot(06-26-10-58-52).gif" -Content-Transfer-Encoding: base64 -Content-ID: <__1@Foxmail.net> - -R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg -7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA -AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz -gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7 - ---=====002_Dragon172714510278_=====-- +S +Date: +From: "Foxmail¿ª·¢×é" +To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?=" +Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?= +Message-ID: <200906261059103758227@foxmail.com> +X-mailer: Foxmail 6, 15, 201, 21 [cn] +Mime-Version: 1.0 +Content-Type: multipart/related; + boundary="=====002_Dragon172714510278_====="; + type="multipart/alternative" + +This is a multi-part message in MIME format. + +--=====002_Dragon172714510278_===== +Content-Type: multipart/alternative; + boundary="=====003_Dragon172714510278_=====" + + +--=====003_Dragon172714510278_===== +Content-Type: text/plain; + charset="gb2312" +Content-Transfer-Encoding: base64 + +IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x +49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ +wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH +18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9 +sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi +uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21 +tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0 +tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg +DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d +tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7 +r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi +t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g +0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9 +wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4 +xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/ +7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht +YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog +zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT +yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5 +09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq +1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K +vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW +97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs +08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM +4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ +0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX +q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP +T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL +zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2 +ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg +0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5 +xOo21MINCg== + +--=====003_Dragon172714510278_===== +Content-Type: text/html; + charset="gb2312" +Content-Transfer-Encoding: base64 + +PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv +L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF +IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du +ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg +KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1 +bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l +dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv +bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0 +eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw +cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7 +IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO +Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ +R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu +dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS +R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ +TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF +Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU +OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct +Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw +cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog +MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN +CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4 +OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct +VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM +SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl +Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw +eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H +LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU +OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O +VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp +ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI +RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw +eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP +VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog +MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv +U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F +UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu +bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9 +MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm +bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj +bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk +dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv +Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3 +uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z +dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg +d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8 +L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ +xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz +cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8 +VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7 +PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN +tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz +PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU +RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR +y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ +PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8 +zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk +dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg +ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U +Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2 +yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K +vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK +p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K +08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT +xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi +o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi +o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+ +PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G +b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB +Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP +RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9 +dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8 +UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh +oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog +IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj +bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+ +DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz +cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz +PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU +RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL +987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT +0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+ +tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys +oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K +ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg +Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC +TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P +8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250 +Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo +PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48 +L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28 +/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2 +1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo +PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+ +DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv +VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK +vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1 +xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw +JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj +bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U +QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr +x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z +dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg +d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv +Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9 +yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS +u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+ +PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp +bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW +IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg== + +--=====003_Dragon172714510278_=====-- + +--=====002_Dragon172714510278_===== +Content-Type: image/jpeg; + name="banner(06-26-10-58-52).jpg" +Content-Transfer-Encoding: base64 +Content-ID: <__0@Foxmail.net> + +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 +3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c +J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1 +cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd +XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps +Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ +1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1 +nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m +HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9 +BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA +80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG +KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA +t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w +580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F +wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt +el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl +y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO +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 +cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D +8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14 +/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8 +4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq +fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on +yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze +e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN +57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8 +3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57 +zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57 +zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+ +FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ +uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn +IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B +xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo +Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf +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 +lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4 +9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t +5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2 +l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk +desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj +HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd +JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8 +mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m +fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn +4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T +/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8 +Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ +x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f +Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+ +nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f +Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r +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 +b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt ++gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO +mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2 +Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr +Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0 +tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0 +bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L +lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN +walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf +guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL +ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa +m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt +M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP +9ar+x//Z + +--=====002_Dragon172714510278_===== +Content-Type: image/gif; + name="bot(06-26-10-58-52).gif" +Content-Transfer-Encoding: base64 +Content-ID: <__1@Foxmail.net> + +R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg +7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA +AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz +gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7 + +--=====002_Dragon172714510278_=====-- +S +X-Uidl: GmailId12a6707d170a511c&&pop.gmail.com +Return-Path: +Received: from Antoni-Windows7 (ita250.internetdsl.tpnet.pl [79.190.233.250]) + by mx.google.com with ESMTPS id a48sm2388387eei.6.2010.08.12.09.00.18 + (version=SSLv3 cipher=RC4-MD5); + Thu, 12 Aug 2010 09:00:19 -0700 (PDT) +Date: Thu, 12 Aug 2010 18:00:25 +0200 +From: "johnnybravo159" +To: "johnnybravo159" +Subject: Test mail from Foxmail. +Message-ID: <201008121800258604089@gmail.com> +X-mailer: Foxmail 6, 15, 201, 22 [en] + +This mail was sent by Foxmail where testing your SMTP setting. + +S +X-Uidl: GmailId12a670cec752827c&&pop.gmail.com +Delivered-To: johnnybravo159@gmail.com +Received: by 10.227.143.6 with SMTP id s6cs144098wbu; + Thu, 12 Aug 2010 09:05:55 -0700 (PDT) +Received: by 10.213.5.5 with SMTP id 5mr385907ebt.72.1281629155351; + Thu, 12 Aug 2010 09:05:55 -0700 (PDT) +Return-Path: +Received: from mail-ey0-f177.google.com (mail-ey0-f177.google.com [209.85.215.177]) + by mx.google.com with ESMTP id w46si4044334eeh.87.2010.08.12.09.05.54; + Thu, 12 Aug 2010 09:05:54 -0700 (PDT) +Received-SPF: pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) client-ip=209.85.215.177; +Authentication-Results: mx.google.com; spf=pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) smtp.mail=antoni.mylka@gmail.com; dkim=pass (test mode) header.i=@gmail.com +Received: by mail-ey0-f177.google.com with SMTP id 10so855513eyd.36 + for ; Thu, 12 Aug 2010 09:05:54 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=gamma; + h=domainkey-signature:received:received:message-id:date:from + :user-agent:mime-version:to:subject:references:in-reply-to + :content-type:content-transfer-encoding; + bh=PivaTP4ZM6VG0cBqUIcNpNqEdDuLIjYl/ub0gtahuU4=; + b=kB1U6Pp8EVDMWEUl+n8BsD9BYFi6u1qaIgnTBqUwhZ57uso0t11pVp+noSS7Wfxm9u + S3wH8uM/NcGLcBE29cfDvEe4s43j+bF04RnBIYM6S+ExHB5EQ3hqCeHlHfAgKCNCM9+/ + yVE5v9w+G8N8wCkMD2jnMCG1G7P9ah49E7n5E= +DomainKey-Signature: a=rsa-sha1; c=nofws; + d=gmail.com; s=gamma; + h=message-id:date:from:user-agent:mime-version:to:subject:references + :in-reply-to:content-type:content-transfer-encoding; + b=qfpJCkETuSk1g6LVXFfQcRvXyRW87IoqKy8sj+TY75VYLlQHUR1fMBw33QPR+QppH3 + duzZ33oOqNwcGsG/GYOHeWWfK7e7+PAWYM/Cq8+r6TiJVgT3EpqP7vySPS0tOYBBDfHQ + mXGCJdkpd1wNqklEtCqzHvBxSB3kpx1jrRiqI= +Received: by 10.213.28.194 with SMTP id n2mr7432209ebc.10.1281629154117; + Thu, 12 Aug 2010 09:05:54 -0700 (PDT) +Return-Path: +Received: from [192.168.0.4] (ita250.internetdsl.tpnet.pl [79.190.233.250]) + by mx.google.com with ESMTPS id v59sm2397289eeh.10.2010.08.12.09.05.52 + (version=SSLv3 cipher=RC4-MD5); + Thu, 12 Aug 2010 09:05:52 -0700 (PDT) +Message-ID: <4C641BDC.9080504@gmail.com> +Date: Thu, 12 Aug 2010 18:05:48 +0200 +From: Antoni Mylka +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.11) Gecko/20100711 Lightning/1.0b1 Thunderbird/3.0.6 +MIME-Version: 1.0 +To: johnnybravo159 +Subject: Re: A test email from Foxmail +References: <201008121803499552355@gmail.com> +In-Reply-To: <201008121803499552355@gmail.com> +Content-Type: text/plain; charset=UTF-8; format=flowed +Content-Transfer-Encoding: 7bit + +W dniu 2010-08-12 18:03, johnnybravo159 pisze: +> Hello everyone, I succesfully installed Foxmail, +> I wonder if it makes any sense to use mstor for this. It seems like a +> huge overkill. +> Or should we rather settle on implementing an incomplete javamail driver +> with very limited functionality. single-folder, without properly +> supporting those standard-violating 8bit characters in emails. +> This might become a problem though. This is a Chineese program, popular +> in china. The majority of customers who would like to use it, will +> probably use it on chinese content. This means that my driver pretty +> much has to support CJK characters properly. Otherwise it's as good as +> useles.. + +Hello, anybody there? + +Antoni +S +Date: +From: "Foxmail¿ª·¢×é" +To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?=" +Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?= +Message-ID: <200906261059103758227@foxmail.com> +X-mailer: Foxmail 6, 15, 201, 21 [cn] +Mime-Version: 1.0 +Content-Type: multipart/related; + boundary="=====002_Dragon172714510278_====="; + type="multipart/alternative" + +This is a multi-part message in MIME format. + +--=====002_Dragon172714510278_===== +Content-Type: multipart/alternative; + boundary="=====003_Dragon172714510278_=====" + + +--=====003_Dragon172714510278_===== +Content-Type: text/plain; + charset="gb2312" +Content-Transfer-Encoding: base64 + +IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x +49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ +wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH +18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9 +sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi +uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21 +tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0 +tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg +DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d +tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7 +r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi +t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g +0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9 +wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4 +xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/ +7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht +YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog +zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT +yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5 +09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq +1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K +vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW +97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs +08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM +4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ +0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX +q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP +T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL +zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2 +ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg +0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5 +xOo21MINCg== + +--=====003_Dragon172714510278_===== +Content-Type: text/html; + charset="gb2312" +Content-Transfer-Encoding: base64 + +PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv +L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF +IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du +ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg +KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1 +bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l +dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv +bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0 +eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw +cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7 +IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO +Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ +R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu +dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS +R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ +TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF +Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU +OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct +Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw +cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog +MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN +CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4 +OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct +VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM +SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl +Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw +eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H +LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU +OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O +VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp +ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI +RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw +eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP +VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog +MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv +U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F +UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu +bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9 +MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm +bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj +bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk +dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv +Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3 +uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z +dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg +d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8 +L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ +xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz +cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8 +VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7 +PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN +tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz +PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU +RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR +y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ +PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8 +zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk +dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg +ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U +Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2 +yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K +vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK +p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K +08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT +xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi +o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi +o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+ +PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G +b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB +Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP +RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9 +dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8 +UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh +oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog +IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj +bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+ +DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz +cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz +PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU +RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL +987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT +0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+ +tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys +oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K +ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg +Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC +TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P +8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250 +Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo +PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48 +L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28 +/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2 +1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo +PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+ +DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv +VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK +vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1 +xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw +JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj +bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U +QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr +x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z +dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg +d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv +Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9 +yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS +u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+ +PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp +bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW +IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg== + +--=====003_Dragon172714510278_=====-- + +--=====002_Dragon172714510278_===== +Content-Type: image/jpeg; + name="banner(06-26-10-58-52).jpg" +Content-Transfer-Encoding: base64 +Content-ID: <__0@Foxmail.net> + +/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4AJkFkb2JlAGTAAAAAAQMA +FQQDBgoNAAAUGgAAJRsAADuoAABYaf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoI +CQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQU +FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8IAEQgAoALuAwERAAIR +AQMRAf/EAPEAAQACAwEBAQAAAAAAAAAAAAABAgMEBgUHCAEBAQEBAQEBAAAAAAAAAAAAAAECAwQF +BhAAAQQBAwMEAQQCAwEAAAAAAgABAwQREhMFECAhMGAUBjFAUEEicBUyQiMWEQACAQIDBQMHCAcI +AwEBAAABAgMAESExEkGRMhMEUWEiECBxgUIjFDBgobHB0VIF8GKCkjOTNFDh8XKi0kMkQFNj4kQS +AAIBAwMDBQEAAAAAAAAAAAARARAhMTBgkPBxgSBAAhIyIhMBAAIBAgQFBAMBAQEAAAAAAQARITFh +EEFRcSDwgZHxMKGxwVBg0eFAcP/aAAwDAQACEQMRAAAB+39+QAAAAAAAAAAAAAAAAAAAAAAhIIqC +CCtkEFahKkVUiypBWypFVSpFVIsqVqEqRUEFotLeXJm5JbykpUWadXTW6ZwbwAO38PrAAAAAAAAA +AAAAAAAAAAAAAgJBFQQVSKggrZBWoIStVIqqQVqqRVSErUFahJltLeLS2lx51rZuNdlNszWRZhrV +smos0O3OlyB23i9QAAAAAAAAAAAAAAAAAAAAAEEEEWQQQRUJUioKpFVIK2QVIqqRVSCtgtm5Jbyh +LlzdXOuV3NfpnYSDTXUxfb566+zDZFRZSzDrOh35wg7Tx+oAAAAAAAAAAAAAAAAAAAAAQggggioI +SCKgqRZBUioSpFVIStQTLklvm3ipUyTWfFtL4Vcx359ZL0Hn6bWdQmnqeJ358dvPl8On0Kt1KWY9 +Stmj0xq9eY7HyekAAAAAAAAAAAAAAAAAAAAACAQkEVBBBCRUFSLIKkVBVC3lyZt5ZihSpl2MXPnV +S0vn2cJ6eXbc9e5x6TGMgVi1PO6Y4frnx/P0+r2UspZi1Mdnmd+WPWev8voAAAAAAAAAAAAAAAAA +AAAAAggEEJFQQQRZBUgioKpFbPPebGq2UKFVz5u1jWSXCZDYzcZ8z7c/c656nz9MuNYyxYsLNXU8 +Dtj5gfROWui1KWY9ZwamDWfO7c+s8/YAct8/9Fodufk/c/MwVPqPzPSsAAAAS8l6ueGzs/J1rnfO +eP7np68u118uz28nM+L7/p68ux08+16fCAAAAAAIIBBBFQkEEEVBCVIqCC+dXzpLlzdrGs+bEYNM +su1lWNZfIs4L1cfoPPXq8t1ltFi5YVr6njdM8d25+N5uv1jecdmPUxWYdZ1d597GwBbGvnvv4aep +2nh7/O/p+b3fN0zS856+O/y3pdM+95eup0z4vo5/R/k+vmPZx8rtjzeuPP7Y+7/D9vK/P/Q8r4/u +9L6fjdP7vg0z0+ffL/XdD6fke36/k+j38YAAAAAAghBBBBFQQQkEVBBBCVqZra5dPQ47tLjMOmeN +rFrGvWGIOe1OX9XL6Fx3v89ovFixJNaepq6zzvo5/LfN1+77zjsx6mO5wamDU9jNAA+T/T4dn4O+ +KzjPdx2833PN0+efU8v0P5Xr+dfV8nS+Xr7vl6/NPr+T0eWvX4dPJ7Y2sXqfN07/AMXXgvkfsfe9 +Px+S8P6Tq/Z+f3Ovlzb48V879V2X0fy3pejwgAAAAACARUEAhIIIqCCCKhKkEGzy7Z8bnLal2+do +a5hBJJy1nN+rl9C479Dnq8tixJYsebqTrPOejn8h83X77vOPWcdmOzDqYNT1s0ASaNu7IXz9S0uS +M0a9KkzZYaxakGXNkzGVMPPvgx2ya5zF9Y18d73O128gAAAAAAUIIBCQQRUAqCtkEEEEVl572OfX +d56z4uBMIWYksSc/Z8/9PL6XjXq8t5ovLKSuSyh52pk1OD78+M8vX7V0xj1MdmLUxWYdT1c0AAAA +AAAAAAAAAAAAAAAAAKEEAhIIIqCCAVSKgggiku3x60usmbjsvi5M3LlaLljVPifTP0/tz9/j03MX +KtokGhqTWj0x8Ur6Dy12O847MepisxamHWfWxoCQeRm7FYjdMRhNWX29ZEg0pcteblvVqRcz1uWC +TXPNzd2tQ9WwXBQFyhcGuudJBoS6pslasmehrRt6kAoeXm7+pijEusWKp6O5s8t5cdMuNVJyiopE +klo+enNd+f1U9PlvYi8orZpVXU4ztz+W+Tt+i+uKWY7MVmPUxWYdT18aA83tmDi/J29ezyzeJPR1 +OVxr6d15jxvRja5657z9Pc3nQzcJz+dbKejqdfvNa531cug8nXk+e92zn866recZqR6Opgl1Y9Cv +Elykxns6bedLpNPpm/l66xzWL7WprrZMJuV7+8ZK571c/Z8nXi+W93WdKWF8iOh1L2dN1xkxrPjd +8a2cawl4Ekkg1z45GL0c/pepv41nysuOzX3nltz4h4+/6Il9LeN/rjHZjsx2YtTDZ7ONASDxpfRs +oZTSly1WN+wSUPKlym1ZiXFGUzWZwSa5hUZkwrlS5QzAwlTKYjKZSQaJC5UGMy1kTCZKgRFaMZKg +1ihs2YTbqDb5by42lyZsRJNCQSasfLJeH1Oz7Y6PWcteXm8Jy3o8t9XHPy/V9T3N42+3PHZhrDZj +1Pd56AAAAAAAAAAAAAAAAAAAAACoBAISCCKggggiyCCCCKgqmxjd86vm58axliQgkAqeQvB5vOZu +I9au+3n2bPnGNfJ8a35fsFdP15278qWVsw6nQctgAAAAAAAAAAAAAAAAAAAABUAgEJBBFQQQQRZB +BBBFVIS8uXGs+NYqz41FkgAEgAAVCVPEl+eY18y579WX6edh2519XDX3mlnUefqAAAAAAAAAAAAA +AAAAAAAAFQCAQkEEVBBBBFkEEEFaghINjG5ltF5YiwFQAAAQggrVK5rN4Llv59z36Mv0I7b3eWO3 +IdZ5u4AAAAAAAAAAAAAAAAAAAAAEAEEECoSCCCCKEFUFaEEF82TNnWKzLmwSCBQgAEAhKVjMRzmb +wvPp8/56+mdef0X1+cDt/m+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVKnMp2KyA +bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//aAAgBAQABBQL2dpdba0stCYFp +bphYRdDH2fpd1tutDLC0unKMUV2EU1+FNeidDLHIsLCNM2ejsibS/srQS21pZumHdNE6mnigaTkJ +p3apZmTcSn4hkfGzAtdqBVeWdRSRzAaZsNjoY5b2Npd1tLQPY0ZOmiFllmVy80QjFLcKvRQVoxWk +GT6UccTqaqDq3x2FWuzVZIJo7Q4WE7dJQ9h7ZLbZYZumVlMJkmgTCIpyTRmSuTBXCJiuTV4GFD4b +Utaz0IVJGuSpZbi+Q+JY6YTsnbKIdL/v4C2FlZWpeXTQE6aIBWU5pojJMIgjNhHkpymOlAwsDYTv +0wsLCwjZWQyuVr7EvB2/l0Oj9JB1N28hz1fjrI/aKxR//b1E/wB3rM3DfbWmf0ssyofZOO5K1D9o +4+xdTkIDDz1KzL80lFNus3lNz9A7HzSUU+6/69idlrWUMZkmgFl4ZalrymhIkzCCck8iuyaYof8A +2uwDhv47jTtqfmYNdb6pYxc6v00/37NRL7byM9Sp9f5Ua9GDmuOsyv8AZOUv8tzNvk+Lp8ByfIcp +Qo/aLkV+tzXMcxd5b7LyFPkuVucpxdDguR5jlxL7JykfK2ZDabluTtcfVh+w3ZeD4W/I1b6jBucm +y+xWNnjPrm/GrfONRkgljnittKdXiuM5Dj7NvmCoKnahu1/17Jh3HYABZTmy1uTtA7ptIs5J5F+e +nJlgeL8lF6Ez4HR/S6OY/rxaOc6un7/sFljvxcTTOvPRocdB9dgge79okhmOgVbhOK5KCXki4C1X +/wBfx9R7vNfbSeZ+Fj/1vCcZWNrf1+kB8l9n+PMVuuEHEHBFV4D6xUjgqrn5GebjWiiqX5vk35eR +q0HschBVaG1Xnj5mwMlmlFs1/wBgEnZNM61EaGuvAs5J5O3l/wDjxDqJ/QP+x/8AW8+A+u/3+wdX +Tr+e0qdQyT4dvgUUNKmDyVq8r6B0jUqggq1onkq1Zi2o3AKtaJfAor4FFHUqyIqtY2CMI2UkUUq+ +HUQQQxuUEBkcYSN8OohrVwf9hBC+FDJGMetk59/Kx64eLl02oSQv3G+GH8H4bm59ur9Mh3eQ7HX8 +/v7Ph0TOz6C0sTrcWtllZ62Q1xWtVC9VlGQAdN2ZUxZTeFNJhvtF9fV+PehxPY6/ntPlOPjniuV5 +pnv12hnlGvAVmIZvn1Nr/bVO2a1FAUs8NcW5bjXP5MJIeSqGrN+Co0VmOYuss8Fcf9txryPah2T5 +Tj45tQ6tQ6umodTELuhITHo80TF1kvUYTg5Tj7AlcrA9S7WuxjbqGJSRiW5HuFbqBL1JxEZeRqQD +GYTDHNHKjtRRnDyEE4vdi3ILb2Og+Wb+wxEiHSS0stsVodYNZNbi5ynuhwvJbJRSoZExrUtS1JiZ +yOVcryQVYuEoHz/K9rr+et2Z4AoSyTRWRs7dLDTyVpD4bkap/wCqKhIzvK8vEUnojN0vWHgesc0l +Ww1urPVqvHELvIfKVd+1W4+wNrlKscKpV4Pkos6a9uSWzIJGEcVp7XMwtLCQ8kDV2P51j5Bzvckl +rU2sRkbWX5ITsQAIbVqtBppSiQQ8nPMwERFeVqQooaE5zvdGyw8ZFIADFPBPxQXYpCiGeJ9x59dn +ZjKaaWMNuNWbcgTSCZhHHcmgrtPZoxU3ilvxvYn4wQikt5ns04AGygfznBF/V/8AmLd80TSjzfEH +GXFc0LKOXLDIa3jXyEU+U8mluR5aCmNy7Py1ijTocLxFa0M49jrPntPiuNkaOCKFfGh+NLGE0ZUY +TJ6kDwS0ak7dSbWL8bWJ/gwaSggKIKkAF8CtpkqQSvsRb/WWEZhenVeL4kGJIIpSmp1LBRQQQNHF +HCEMEFcdI6mEReGCCuI1awG8UbtJVrSntR6upVIDlKpAUsUEUAxQRQDHWrQtJHHKyCOOJumej1YN +l4YnFoYmlsUqlpQ0KVdSxBMI1a4H0fywvrGMsIvz3zQjK3LfXNwo73JcOdX7PXNBzVEk/L0lP9hp +RNd+1SSKtwnI8kXwuN4sQ5f/AN4JYrscFhpBTp3Tv7DB/AvgpPCZ9Teg7MSscfDONr6fSkc/p1hk +30++Sg+jRO9DgON49TwCQcnxzWhliKMqlvQ9KavJFFM0gu/T8LV59gi/l0L6mB9Lv6OVlZWVlZWV +bgyuT4/faSNxejeOA6nIDIozGYXNO+fYovhzZCWW9HKysrKysp1ai0PyVDcUkbi9S24vR5F2fcaX +roNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDW +g1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1tmts1tyLbkW3ItuRbci25FtyLakW1ItqVbUq2pV +tSralW1KtmVDFKtqVaJHZo5WJ45FtyLbkW3ItuRbci25FtyLbkW3KtuRbcq25VtyrblTxzIq8ptL +UlAuT4mUVJG7PwPD2pY/jzr486+POsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEs +EsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEs +EsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEjgcnasv8A5Xivk6XWCWCWC9v/ +AP/aAAgBAgABBQL2y3tTPtvPTCwvHXHs/PbnswnJZ7M+g3sPKz3Z7WTv7Vz3sn9Fk/qFLhRFrL47 +r4zqSDHqFEQs8JMyd8LdWtCWem6taYs/smfRb9PhQAzvKGXeN2WyIjGIk8oMLlC2CjEGjhZxjESe +UBBbI6WUYMTvE2uQfNh/6qZ/EaeXCF8o/wACLsnkdkBZ/Zs/om9WFvGt1l3Uz+IEWTIH0qVnyZaQ +rqV9Rm/iYv6wIXyecyTPl1L+Y/DF5fXpTyYTGjfyDeP2HCws/pG9Xz1y689fPbl1l+1xZ1oZaGWh +k4stDLQ37E/R/SZP6beysLCx3Mn9FkXq57s9+emVnuz0z+gz6eeuVlZ7X7M9zP6P49QUXpCi/Pou +3jo/rMi7G72btdN0bo/qsSx24X4Tvnoz+yn9PK1MvHTLLX2s/tXCwsLHez+32f22/YP46ZWVlZWV +lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV +lZWVlZWf0r9BZZZZWf8AHv8A/9oACAEDAAEFAv8AFuPcWfbOPVf/ABu3qQ03kGxV2h3GW4hP1GJn +WpujNlypkLbDIw09PhEzbDI42H2JlG/gX8alrd3J3ZC+Uxpid0R+Sd2YXd1rfKJ8LX4F1H+VRDMl +3S6jp62MNLwuzFYnjkGOq0imieMvYhrC8IEabwz+UH4ZsvIh8MKBvJp/x/1H8KkP9bGSOEdEY1yl +QV3NHCQvUDAzFqP2sJkK3zTyE6aUmTG7LfNPKb/sTeo/ulvaj/pXTek6b9Y3pv8Ap8e38LHXCx7c +ys97t7fdvb5e3XWFhY/x7//aAAgBAgIGPwLg5RkyfzqMez7QYHIlR/EvkciVGYMEQRG0VR0+p39C +rMnbaWdHJnn4/9oACAEDAgY/AuDhjdb+wczEH6jrwZdHNj9R14MxOy7ltPsREyhxIiGJlvkLZb1H +S59iwts2Ml5Eyxkzz2//2gAIAQEBBj8C+bN/mpiawtWw+Twt6vLar/M/Hy4VjX21bp1v+tsr3kh9 +C1jc+k1hXgY14xcVZ/Ev01rjNx8zcfN7Kxx8h2Ctc3B7Mf31l91Y41gKyrK3ortrXFga7/aXYRSy +R8O3uPm3+YmPm4CvEawFd9Y+EfTWlc9prnN/DB92O/t+RMiYEVaTCF/DIOw9vzGufNwrHCu3yWGJ +7BXj8I7BnXhFFjsoRKfFIbeqhhgMB8jp7a1jhbCl1G8kXu39WX0edbzT0rQtI6gFiDbOppPhmCwp +rPiHaFA3mv6N/wB8UdHRtr9m7i16HTfmxCv7HVZD9r7/AJMsxsoxJ7hSdH08c4ke9iwTTgL42al6 +GKGZneTlh/DpztfPKsKZ3OlFGpmOwCjD0sPUTuMfAq5duLCv6Hqt0f8AvokwywWtbm6cb9mknyfD +QJN1EmQ5SrY29JFf0PVbo/8AfRB6eaGwvql029GDH+wMPLlvrxG9YYeSy4mveGw7BVlFvJhXpp22 +ILD10PkS3qFOdoxHqqfptkiax6VP9/nA+bnUEUErRzSvfUh0nSg7vTXN/NOubmTuTFzmZ/AmGF77 +b0sEHVh5X4VH+FL0fQusMDyctDpDHT+LHfQ6lfzDWzOEVTFGL11DTMonVtEM2n2rXxFN035yQIhq +VyFsVYeimX8tC9P0CcUjrqsO/vPZT9J0jK6RaUOpQdT2xyr4p+sVp9Spo5S6dRxNSvJ1CxRxkKCI +gSSa+DWRJ4hNyuADV4tOyiF/MEgH/qKxkjea50P5ik0pYKseiP7DXW9T1IQyqwhibSLNrzBGWVfm +PXvHCnw8OmNo4Y4zzJMsVAoznLp0LD/M3hH1+RkHFOwT1Zn6qnlj6YzarJq1BALY2xoR9T0bKzDU +LOrYeqknj4ZFDC+eNTpB/GdCqXwzo9RJ03M8JVQJEGJ9dJ8T0RUPw+8U5eik6mIEK18GzBH9ggb6 +wHlsguavIfUKsot5MPKKlbtf7B8j35DyMK6dPxBx/oJ+z5TlbIlC+s41CnUQB3jQLjf0n6TU3WQd +OqTIjaWF73ItRnChTEh0nvbCoOmJuIwXNjtbD7Ki53hLXk0e0Wb+6pPzYx8uEkLcZdnr9NCLBW6U +eO2Fx+L76SaRr6pTO/qOqum6YNbTeVh/mwH21zDxWedvs+gU3VltTQI8/wC0Bh/qIrn9Q4flhn8e +1jht9N6g6eFlGi7PoAzOWVdF0Wo+8LdS/rwX6Kjgx/7kvMbt0p+gqSVBjM/0J/efJFEwuFXVj+t/ +hUQuow1HLNqZY/FiI0tS9O+pmVQPDb76QzXHMxGFCVCAp7cDSxL4ggt24mo47WKriO84n+wdQrEV +ZRc1eQ/sirLgPJh5t6lHZJ9g+RtsX6/I3oqA/hV2P7hH2/KGR+mhZziWMYJ8ljiDmDX9JB/LWtSd +NCrDIrGoNapYY5HHtOgY1oIBTLTbw29FHR08S6hpayAXB2GtUMEUbZakQKbVrlgikfLU6BjXKZFM +VtPLt4bDZajyoIo9Qs2hALjsr+kg/lrX9JB/KWhzOnifSNK6kBsBspVkgidUwQMgIUd1BI1CIMkQ +aQPJ72NJLZa1DV/TQ/yxV4okjPaigGtbRRs/42UE1plRZB2OL1/TQ/yxWqOGNG/EqAH+wrUaAvjt +rOsPPPop0/GNQ/Z/x+Qv2V3nySnaRpHpNdX1fsxpyx6XP/5+Y96w21qGNZeTPzT3VqHsHWveppXU +3VhcHzwnbnV/JyFOWJ9JqPmC00/vpP2shu+U+HfqYw/i1XdbKUIFjjnjRgjYmQa80dR7ttLWJFjY +9lNPjpCSzKLYtHCbFhsscCMcb1LO99ESM7WzsovSwf8AKzaLdl0Z747PCcRtpJ1fXFIxjjMatJqZ +b3sFB/CalLCZVhNnYwS24Q34cM9vm6X7NTkZIn4m7B+mQNtc8qxJe2p2Ci/rp0+LiGm2JkSxB7Df +9N1QGNhInUOY43QhluFZs/2TSlS2hxEUfQ1jz2ZV2XGK5nDKpDIsp5S6m0wyMMBfitp+mtKCQG1/ +HFJGN7qPM1zypEl7anYKL+umj+Li8KhtfMTSdV8Ab5i2NL1CMJYmZUVoyGF3cJ9ZrkP1MYezavGt +lKECxxzxopcawASu2xy+qilxrABK7bHL6vKUuNYAJXbY5fVRAIJXBgNhtf7fIHQ6kYXVhiCD5Qmo +a2blgZ+PTrt+7j5hjm6qKOQZo7qpHqJqMp1MeuUDTEXXXdtlr51LzpFhWJxEWkIUFigfC/caEnTy +K1wrMgILLq2NbI0HTqI2Rm5asHUgufZ9PdSRs4Ekl9Ck4tbOwrk6xzra+Xfxacr27K5DTxifAcou +Ndzlh5hdyFRcWY4AAUrTuImcrpjchX0s2kNpJy2+ihJCwkjOTqbj6KwwOqRQpz90+hjvoowluPww +yuN6qRUbIs3vbFbwyW8X62m3rvamgjSWSdf+NY2H+p9K2wON8aUr00qxNlK3L0/Q5OOyw8ttorH1 +13eZgxrOsqxU1rjHvUxXvHZXwkp8DH3R7D2eeX3eQuT4vYFc+cX6KA65SfaOwev6vk1axMd/Hb6K +LPw38BPZXUFZEEfK/M7KUJOnnDUL68zsNsO+nAcSfEzdRDKi3EkYSSVr3U4Dxdl7tnkKEzQxTxjo +V5ZkaxitFiVGhvF33GzsvXURDo+ngQBpLxWcLpRiWsyJibBLjHG+yghimIQm3w69GsNiGGAcA2s7 +YNfPbnUE0qc6eWJPYLeKRMT4Y5LYE+zbZQKwJNddOHTyqQjgM7DTG2u4cDEIOwAN5VuDyyNmHioM +cJTfQzC/oJGFRxwN1WmaSzuvwp1nlE4a8b+HbhbAbKMchLwOAF6eQJ4F04r4cM792wYVD0Tvrhif ++Mb+9MOIW/4lOLY46f8AMF6P3MB1SaedKvMOEch0lMMNvHnsqLpynu4TF7vWngWBmYPf4cXDasLG +5xvt0kx9Gr6WfqppZI4XLpq1t/yI9l1ZWxwGWaD4LkTQXfnqsK3cixQ8otYWcFQTc+rGjpxax0jv +pEUN/wDW+NFUcxsfbW1x+8CPooxfGyfGWCzye40GOPEaV0Z+PL2b438OqIchJG5sQ5sgDBNUqDLM +32jDDbXMjfQ/TOvSBeZH4RK8eAA6YDEaSOz6KkEmMg6bp9Zzx1S9y/UK6uOBjzEghkhS9gZA8pt6 +G0gN3V1H5h0j3iYxx9Ox8KcsEB5MQbEFnuSMlGFSRT6QoCskfNadxe97s6qbYYXvtqb4eRE9xDq5 +iGT25ex1r8wZnXm/ERh5VXSFRkhDNYlraVxxwr4RHdoZImaXVI7MhuAtmJ1DV4tuzDbX5UqSyp8R +y+baR+H4d2sLk2H+W31V+Yus0v8A0tXww5jYEQrJjj48T7d66qeHwr0a6dbTNEBLpDiyKtn4lwc9 +1u0Am4XrbKOwfBX+3ya1BNiNds9NSHHkjhvjjXPh6lokjF5EHKAKi9/FIpsfSbejOsJ3fo1HKgik +CXATC50qDfC1jltxwE83Swp0t51hsnLRk5kcekE8qTMkYLke0YiXp5nv0/TWhjTUrW8CMMokJwOd +/Vtrp4nuA3XdV4hxA/8AYsR3jMV0nWddZHWUx9iqscEutvFkGa5vtULXxHwM/P5/xOr3d9F9NtOu +9+T4bWz78a64QJDL08si+8diRZoI/ZC2YW/WF6SPUX0ALqfFjbafI0VmEmrwW/DswqwVTJ4T48VD +DG/qzFdMBJZeoCTqOYqXlwmb/wDnf2rtbV9FdO/XCKVGtPNJOFdFj0bBZLHHvsL4100nSQww9S8f +VTKJI8g0iFFOmxBAbT3Y0kr9OebykWRShlCnFrA/DTD2swa/L5GiI1WCusdsWiOZ+HW/8w9uNSxr +08ksTfCxuxSye7nYtxWuLH2QRSSxQqg/7cbNGgUeGdQgOkdg8lqvsNathwNd/wAhbbspup6dcM5Y +x9YoQ9U3+WX/AHffV1fDfWYNZViDVl31ajqa7/hq1/B7TbAKjPTPq1C5ce21d/yj6+ljYyFi7FfF +dzc+LPbRMa6SxJY7Tdi31sa+D0/9fRytFzwW02vnlTwyC8cgKuO44Gixea5N8J5gNwek6bSeRGAF +TU1rKLWOOI7jTLNEJA7iVg2PjUAA7hbzCpv4hY2JB3ilLGYlTdb9RNgbW/H30UJkdCQWV5pXBtsO +pjhjiMjXIaNTBYDlEDTYZYUjhSZEwV3ZnbbtYntNuy57aC2YEEnmCRxIb9r31HIZnYOymLgnXbX4 +mxCi2k48P6uVDqdI54Ux69ukm9vM0uWAvfwO0Z3oRSwclREhuiqNOlu1bZHvFRgqX5Ruhdmds75s +STjY49g7BSPIupozdT+noB9IB2Vr6jp45XAsGdAxt66tDGsYtbwALhcnZ6TQjhQRxjJFFh9FaII1 +iQm+lAFF/VRew1kAFtthl9dEgWLG7HtNrfZWjp41iQm+lAFF/VRkSFFkY62cKAS2OPpxNOpQESfx +Bbiwtj24YVzJYUeS2jWygnSdnoxrVoGq+u9sdVtN/TbDzOdIC7ggqHZmQEZEKTpB7wK59istwWZG +ZNVstWkjV+1WiFdC3vYfp6h2DCtEK6Fvew/T1DsGFBYYUjAOsBVA8VrXw22wrTKgcdjC+Yt9Rt5L +RIEHYotkLfULeanT2IjisI9LEMukWwYG+WGdImnwRkFEGCjTlh3bKMwX3rYFv09A3Dso/EQJIbad +TAardxzpTD08aMmCuFGrszzrRJcpmVuQD3G2Y7jhQkjTQww8HhBAFhcDOwyvl5lj6DWk5ir/ACH6 +3bRm6X3U21fYb7q5UylB+FsUPo/ur3qlT+riPvr+MPXh9dfx131gxb0YfXatHTYXy04nfXO68np+ +nz0njPq++mJkCp/6+KXd99RmFdPSxH3cLY76+M6I2k/5Iu+u8Zj5kdxrWPX8lY0VZQyn2WFxV4w0 +J/8AmcNxvXuusNuwr/fWPWf6T99X6meST0WX76vDCof8ebbzXhGIrUuHULl391EgWYcS0Nq7R20J +ekOlhxKTeu8Zr8ydO6r/APga19dc6Ie/GY/FWtM/aWg6H00JFNm21qXi2r8x/TVxn/4VxlR6iEeP +217e+uZHntFXBoG9cwC18/LwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ +3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c +J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1 +cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd +XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps +Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ +1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1 +nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m +HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9 +BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA +80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG +KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA +t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w +580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F +wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt +el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl +y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO +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 +cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D +8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14 +/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8 +4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq +fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on +yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze +e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN +57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8 +3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57 +zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57 +zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+ +FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ +uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn +IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B +xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo +Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf +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 +lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4 +9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t +5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2 +l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk +desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj +HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd +JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8 +mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m +fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn +4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T +/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8 +Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ +x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f +Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+ +nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f +Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r +/wD/2gAIAQIDAT8Q/ptyvCwyzcuXLilzkf09Bw2lxJGLS3EuXLly4MuPBUqVKlSpUqVKlSpUqVKl +SpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUr/AMthKy8XggjCnhAesscpsy+LymSXFLlwZUwf +6MgjC3jcRFsuBcI3qlURLWFwUeIGM4OIMGDBnL41KlSpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVK +lSpUqVKlSpUqVKlSpUrhUr6qhERUVfAkj0Rb4MZQhaWR8Fw4NA1EVTBgwYQZcf0BrrwVFDWJ5Rbw +qIIt8LWuCpfC5cuDFwMVwYQhCVMvFypUqVLulwIFLzm09pbhFdovNHPzfaDcqVKlSpUqVKljTWN1 +qdMvxGBAF1m+3eGkKxBdI+e83f2hClHnuxAtl1BfPebv7RUFHnvKlSpUqVKlSpUqVK4VwqVKlSuF +fRBm2VEovlFvh1OIk0irrx1Q0LHHxEIpVhwEIQhBxXhejFcENHJb32IlLpzQMuduVRW8Dnf/AGCh +IWc1npj2lgVKuQMWxdnK+TDti4TOo94IWtyGvIdfiHrBs4dDlKORRbvdGPvGEUi6sBLZF9RjFwCV +b63+hMbo1/0I/LYUXpWiOuWVIrWvEa4VlZ0x6GXh3RG7Abr8EAxGpqlvW9SUOC+0GsfwAsjWzVOF +THLiINEVdfDr49+gHjEIQh42N+v6lrMJ/n4Iv8CztmFDWkX2M/5CV81HpHq/S3ID/sGHAXz07Rzk +8m3lpAUNKPxCx+g9Nf1LAdR/L94Sa0P0Lz9jGp0sGOR6dqgNxzQXfrEo+Q/l+82w3q+WGVy/f/jh +bTpMucsValArpDBZrLM4mnyv/gQWmdBiNUawt68K8OrhmPjIa8GsEIQh4wKDOlqgAURtPnUSUubq +VaA6ChK6mvXn7ygt6yZYes0JOikmDE6CCYNi3d3eb63Hy06qfMp8yllTvOFr1iZRLrSz3mbVVXmt +vBCxNr8f5G7CWRMwWkm1+P8AIpYfiBX8CecN1GLEp+gNY7Egica4hCCDazVCEIQ/oIslWVCTPKZq +YjqRhZyiV4b18USVKlSoHC1lYGGiEIQh46XAsrUaFyt1K1cp4WkQa8CsBEEA+BBrwESl1Ll8bl8L +408CSCSsBMQMsupZdSt14FqINZSoDEEBjyR+TgKZqOTKmDZLl+vC3hL6JUU6y0qW4bwKlSpXDUuZ +m5hCEIQ8JJ15fuE7WY3+eBWW0bkI+WItiIviNtLv7QhGj9xEcfqBRDow2kS/P+Q1yhzpwKsvSBd1 +2RIDesFynz8TBbjdtS1LJeU2qFg95XKBgiYXpG5ekPy/XAmr6d594Id4YDAlyrDu/uZsWZq68/EL +brSBXBpWqrPfvNGJTR5/ULRcMitczJ08+0wTz+pZdOn5gzff88BzguNBzIYiSpXCpUqVNIWGrgPH +k2QG3WOrYklmGEIQh49qAEoqolyspVRDxqVKyso0lJWIlF3xqJcpVSkQYh1gBAqAGnEA0lEqIMrj +UpdxF3ACAEAIl8KrjRwpVSiAaxLqQLQiHWAG+CWQwwaE5ho8KlSpUqVKlRjH8pqmIK0SY8yPNXG0 +FSlWxoy4l5Jfh4HA/oZzBZ2mZaVUqVKlSpUqVKjDwLwkJwWROFDOVxEtX9COODRhsipUqVKlSpUq +VKlSpUqVGL+LmU4iyAP6IkFkw7Ro1KlSpUqVKlSpUqVKlSpXAtyeDnPJx3CbhNwm4TcJuE3CbhNw +m4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3Cbh +Nwm4TcJuE3CbhNwm4TcJuE3CbpN0m6TdJuk3yb5N895vnvN895vnvOpJuk3iLGpN4m8TeJvE3ibx +N4m8TeJvE3ibxN4m8TeJvE3yPUIeonBLadrmw95svebL3/rV/wBj/9oACAEDAwE/EP6bUtwHEVKl +SpUqc7+n24KSoNhFeIkqVKlSokFP9Kp4aSuAmEkJJdpMpUUQ6pQxJUqVKlh/R7cNONQkBKmkVwcM +JKJiIcEWBBEleDmf0KlhIZXgEwMqVKjiXNcA8FROAWpqcHiyh/oAx4QWEgHGuNXCDhXGpUSCLlE4 +sYLJWa8Jmsq1Y8sfmYrZAA5t/wCTee8p0+6B1nX/AGJX0hbAwWe0psda5R1hw7Sg3gsY46jph/af +PSPMt6Xf/REVEesnWWX1qHz0qiyNFb7/AJv4BS+A4A8FeB0muCHjeDRjGMYxlZ8O5BANK/iZzOuL +ziEgKzK9F1/2VtfNaEbrV6DBPR7aSigDr51j6ijaYEX2hSqAbRLTS60mLgG2JeQr2I2ovQ9YtsMO +QGWXLocKh6B9Wh+b9IAGrdLDyHo594uGBrQzrzmty09potRfRuaj0KumctOte0pBYbx66a9oiUU6 +b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt ++gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO +mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2 +Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr +Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0 +tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0 +bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L +lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN +walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf +guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL +ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa +m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt +M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP +9ar+x//Z + +--=====002_Dragon172714510278_===== +Content-Type: image/gif; + name="bot(06-26-10-58-52).gif" +Content-Transfer-Encoding: base64 +Content-ID: <__1@Foxmail.net> + +R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg +7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA +AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz +gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7 + +--=====002_Dragon172714510278_=====-- diff --git a/etc/samples/mailboxes/imagined.mbox b/src/test/resources/samples/mailboxes/imagined.mbox similarity index 100% rename from etc/samples/mailboxes/imagined.mbox rename to src/test/resources/samples/mailboxes/imagined.mbox diff --git a/etc/samples/mailboxes/parseexception.mbox b/src/test/resources/samples/mailboxes/parseexception.mbox similarity index 100% rename from etc/samples/mailboxes/parseexception.mbox rename to src/test/resources/samples/mailboxes/parseexception.mbox diff --git a/etc/samples/mailboxes/received-0xc.mbox b/src/test/resources/samples/mailboxes/received-0xc.mbox similarity index 100% rename from etc/samples/mailboxes/received-0xc.mbox rename to src/test/resources/samples/mailboxes/received-0xc.mbox diff --git a/etc/samples/mailboxes/samples.mbx b/src/test/resources/samples/mailboxes/samples.mbx similarity index 100% rename from etc/samples/mailboxes/samples.mbx rename to src/test/resources/samples/mailboxes/samples.mbx diff --git a/etc/samples/mailboxes/subject-0x1f.mbox b/src/test/resources/samples/mailboxes/subject-0x1f.mbox similarity index 100% rename from etc/samples/mailboxes/subject-0x1f.mbox rename to src/test/resources/samples/mailboxes/subject-0x1f.mbox diff --git a/etc/samples/messages/sample1.msg b/src/test/resources/samples/messages/sample1.msg similarity index 100% rename from etc/samples/messages/sample1.msg rename to src/test/resources/samples/messages/sample1.msg diff --git a/etc/samples/messages/sample2.msg b/src/test/resources/samples/messages/sample2.msg similarity index 100% rename from etc/samples/messages/sample2.msg rename to src/test/resources/samples/messages/sample2.msg diff --git a/etc/samples/messages/sample3.msg b/src/test/resources/samples/messages/sample3.msg similarity index 100% rename from etc/samples/messages/sample3.msg rename to src/test/resources/samples/messages/sample3.msg