diff --git a/jetty-core/jetty-http/pom.xml b/jetty-core/jetty-http/pom.xml index 57b4946f85fa..410dd4583b8d 100644 --- a/jetty-core/jetty-http/pom.xml +++ b/jetty-core/jetty-http/pom.xml @@ -28,12 +28,17 @@ org.slf4j slf4j-api - org.eclipse.jetty jetty-slf4j-impl test + + org.eclipse.jetty.tests + jetty-test-multipart + ${project.version} + test + org.eclipse.jetty.toolchain jetty-test-helper diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java index 0329464ac41a..ab4d1cd6f40d 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java @@ -47,6 +47,7 @@ public enum HttpHeader CONTENT_LOCATION("Content-Location"), CONTENT_MD5("Content-MD5"), CONTENT_RANGE("Content-Range"), + CONTENT_TRANSFER_ENCODING("Content-Transfer-Encoding"), CONTENT_TYPE("Content-Type"), EXPIRES("Expires"), LAST_MODIFIED("Last-Modified"), diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPart.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPart.java index e4abd0b623b3..da534a781aaa 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPart.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPart.java @@ -25,6 +25,7 @@ import java.nio.file.StandardCopyOption; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -908,6 +909,7 @@ public static class Parser private final Utf8StringBuilder text = new Utf8StringBuilder(); private final String boundary; private final SearchPattern boundaryFinder; + private final MultiPartCompliance compliance; private final Listener listener; private int partHeadersLength; private int partHeadersMaxLength = -1; @@ -920,13 +922,33 @@ public static class Parser private String fieldValue; private long maxParts = 1000; private int numParts; + private EnumSet eols; public Parser(String boundary, Listener listener) + { + this(boundary, MultiPartCompliance.RFC7578, listener); + } + + public Parser(String boundary, MultiPartCompliance compliance, Listener listener) { this.boundary = boundary; // While the spec mandates CRLF before the boundary, be more lenient and only require LF. this.boundaryFinder = SearchPattern.compile("\n--" + boundary); + this.compliance = compliance; this.listener = listener; + + if (LOG.isDebugEnabled()) + { + List.of( + MultiPartCompliance.Violation.CR_LINE_TERMINATION, + MultiPartCompliance.Violation.BASE64_TRANSFER_ENCODING, + MultiPartCompliance.Violation.WHITESPACE_BEFORE_BOUNDARY + ).forEach(violation -> + { + if (compliance.allows(violation)) + LOG.debug("{} ignoring violation {}: unable to allow it", getClass().getName(), violation.name()); + }); + } reset(); } @@ -1050,6 +1072,7 @@ else if (type != HttpTokens.Type.SPACE && type != HttpTokens.Type.HTAB) HttpTokens.Token token = next(buffer); if (token.getByte() != '-') throw new BadMessageException("bad last boundary"); + notifyEndOfLineViolations(); state = State.EPILOGUE; } case HEADER_START -> @@ -1099,6 +1122,7 @@ else if (type != HttpTokens.Type.SPACE && type != HttpTokens.Type.HTAB) if (LOG.isDebugEnabled()) LOG.debug("parse failure {} {}", state, BufferUtil.toDetailString(buffer), x); buffer.position(buffer.limit()); + notifyEndOfLineViolations(); notifyFailure(x); } } @@ -1123,18 +1147,35 @@ private HttpTokens.Token next(ByteBuffer buffer) } case LF -> { + if (!crFlag) + { + MultiPartCompliance.Violation violation = MultiPartCompliance.Violation.LF_LINE_TERMINATION; + addEndOfLineViolation(violation); + if (!compliance.allows(violation)) + throw new BadMessageException("invalid LF-only EOL"); + } crFlag = false; } case CR -> { if (crFlag) - throw new BadMessageException("invalid EOL"); + { + MultiPartCompliance.Violation violation = MultiPartCompliance.Violation.CR_LINE_TERMINATION; + addEndOfLineViolation(violation); + if (!compliance.allows(violation)) + throw new BadMessageException("invalid CR-only EOL"); + } crFlag = true; } default -> { if (crFlag) - throw new BadMessageException("invalid EOL"); + { + MultiPartCompliance.Violation violation = MultiPartCompliance.Violation.CR_LINE_TERMINATION; + addEndOfLineViolation(violation); + if (!compliance.allows(violation)) + throw new BadMessageException("invalid CR-only EOL"); + } } } return t; @@ -1331,6 +1372,13 @@ private boolean parseContent(Content.Chunk chunk) { // The boundary was fully matched, so the part is complete. buffer.position(buffer.position() + boundaryMatch - partialBoundaryMatch); + if (!crContent) + { + MultiPartCompliance.Violation violation = MultiPartCompliance.Violation.LF_LINE_TERMINATION; + addEndOfLineViolation(violation); + if (!compliance.allows(violation)) + throw new BadMessageException("invalid LF-only EOL"); + } partialBoundaryMatch = 0; crContent = false; notifyPartContent(Content.Chunk.EOF); @@ -1373,7 +1421,16 @@ private boolean parseContent(Content.Chunk chunk) if (boundaryOffset >= 0) { if (boundaryOffset == 0) + { + if (!crContent) + { + MultiPartCompliance.Violation violation = MultiPartCompliance.Violation.LF_LINE_TERMINATION; + addEndOfLineViolation(violation); + if (!compliance.allows(violation)) + throw new BadMessageException("invalid LF-only EOL"); + } crContent = false; + } // Emit as content the last CR byte of the previous chunk, if any. notifyCRContent(); @@ -1384,7 +1441,16 @@ private boolean parseContent(Content.Chunk chunk) // BoundaryFinder is configured to search for '\n--Boundary'; // if '\r\n--Boundary' is found, then the '\r' is not content. if (length > 0 && buffer.get(position + length - 1) == '\r') + { --length; + } + else + { + MultiPartCompliance.Violation violation = MultiPartCompliance.Violation.LF_LINE_TERMINATION; + addEndOfLineViolation(violation); + if (!compliance.allows(violation)) + throw new BadMessageException("invalid LF-only EOL"); + } Content.Chunk content = asSlice(chunk, position, length, true); buffer.position(position + boundaryOffset + boundaryFinder.getLength()); notifyPartContent(content); @@ -1536,6 +1602,39 @@ private void notifyFailure(Throwable failure) } } + private void notifyEndOfLineViolations() + { + if (eols != null) + { + for (MultiPartCompliance.Violation violation: eols) + { + notifyViolation(violation); + } + eols = null; + } + } + + private void addEndOfLineViolation(MultiPartCompliance.Violation violation) + { + if (eols == null) + eols = EnumSet.of(violation); + else + eols.add(violation); + } + + private void notifyViolation(MultiPartCompliance.Violation violation) + { + try + { + listener.onViolation(violation); + } + catch (Throwable x) + { + if (LOG.isDebugEnabled()) + LOG.debug("failure while notifying listener {}", listener, x); + } + } + /** *

A listener for events emitted by a {@link Parser}.

*/ @@ -1598,6 +1697,16 @@ default void onComplete() default void onFailure(Throwable failure) { } + + /** + *

Callback method invoked when the low level parser encounters + * a fundamental multipart violation

> + * + * @param violation the violation detected + */ + default void onViolation(MultiPartCompliance.Violation violation) + { + } } private enum State diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartCompliance.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartCompliance.java index 5ff3b819e684..b96747c73bb2 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartCompliance.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartCompliance.java @@ -17,6 +17,10 @@ import java.util.EnumSet; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +import static java.util.EnumSet.allOf; +import static java.util.EnumSet.noneOf; /** * The compliance mode for MultiPart handling. @@ -25,7 +29,12 @@ public class MultiPartCompliance implements ComplianceViolation.Mode { public enum Violation implements ComplianceViolation { - CONTENT_TRANSFER_ENCODING("https://tools.ietf.org/html/rfc7578#section-4.7", "Content-Transfer-Encoding is deprecated"); + CONTENT_TRANSFER_ENCODING("https://tools.ietf.org/html/rfc7578#section-4.7", "Content-Transfer-Encoding header is deprecated"), + CR_LINE_TERMINATION("https://tools.ietf.org/html/rfc2046#section-4.1.1", "CR only line termination is forbidden"), + LF_LINE_TERMINATION("https://tools.ietf.org/html/rfc2046#section-4.1.1", "LF only line termination is forbidden"), + WHITESPACE_BEFORE_BOUNDARY("https://tools.ietf.org/html/rfc2046#section-5.1.1", "Whitespace not allowed before boundary"), + BASE64_TRANSFER_ENCODING("https://tools.ietf.org/html/rfc7578#section-4.7", "'base64' Content-Transfer-Encoding is deprecated"), + QUOTED_PRINTABLE_TRANSFER_ENCODING("https://tools.ietf.org/html/rfc7578#section-4.7", "'quoted-printable' Content-Transfer-Encoding is deprecated"); private final String url; private final String description; @@ -55,10 +64,28 @@ public String getDescription() } } + /** + * Strict (RFC7578) {@code multiPart/form-data} compliant strict parsing. + */ + public static final MultiPartCompliance RFC7578_STRICT = new MultiPartCompliance( + "RFC7578_STRICT", EnumSet.noneOf(Violation.class)); + + /** + * RFC7578 {@code multiPart/form-data} compliant parsing lenient to LF EOL and Content-Transfer-Encoding. + */ public static final MultiPartCompliance RFC7578 = new MultiPartCompliance( - "RFC7578", EnumSet.of(Violation.CONTENT_TRANSFER_ENCODING)); + "RFC7578", EnumSet.of(Violation.CONTENT_TRANSFER_ENCODING, Violation.LF_LINE_TERMINATION)); - private static final List KNOWN_MODES = Arrays.asList(RFC7578); + /** + * Legacy {@code multiPart/form-data} parsing which is slow, buggy, but forgiving to a fault. + * This mode is not recommended for websites on the public internet. + * It will accept non-compliant preambles and inconsistent line termination that are in violation of RFC7578. + */ + public static final MultiPartCompliance LEGACY = new MultiPartCompliance( + "LEGACY", EnumSet.complementOf(EnumSet.of(Violation.BASE64_TRANSFER_ENCODING))); + + private static final List KNOWN_MODES = Arrays.asList(RFC7578, LEGACY); + private static final AtomicInteger __custom = new AtomicInteger(); public static MultiPartCompliance valueOf(String name) { @@ -70,6 +97,85 @@ public static MultiPartCompliance valueOf(String name) return null; } + /** + * Create compliance set from a set of allowed Violations. + * + * @param violations A string of violations to allow: + * @return the compliance from the string spec + */ + public static MultiPartCompliance from(Set violations) + { + return new MultiPartCompliance("CUSTOM" + __custom.getAndIncrement(), violations); + } + + /** + * Create compliance set from string. + *

+ * Format: {@code [,[-]]...} + *

+ *

BASE is one of:

+ *
+ *
0
No {@link MultiPartCompliance.Violation}s
+ *
*
All {@link MultiPartCompliance.Violation}s
+ *
<name>
The name of a static instance of MultiPartCompliance (e.g. {@link MultiPartCompliance#LEGACY}). + *
+ *

+ * The remainder of the list can contain then names of {@link MultiPartCompliance.Violation}s to include them in the mode, or prefixed + * with a '-' to exclude them from the mode. Examples are: + *

+ *
+ *
{@code 0,CONTENT_TRANSFER_ENCODING}
Only allow {@link MultiPartCompliance.Violation#CONTENT_TRANSFER_ENCODING}
+ *
{@code *,-BASE64_TRANSFER_ENCODING}
Only all except {@link MultiPartCompliance.Violation#BASE64_TRANSFER_ENCODING}
+ *
{@code LEGACY,BASE64_TRANSFER_ENCODING}
Same as LEGACY plus {@link MultiPartCompliance.Violation#BASE64_TRANSFER_ENCODING}
+ *
+ * + * @param spec A string describing the compliance + * @return the MultiPartCompliance instance derived from the string description + */ + public static MultiPartCompliance from(String spec) + { + MultiPartCompliance compliance = valueOf(spec); + if (compliance == null) + { + String[] elements = spec.split("\\s*,\\s*"); + + Set violations = switch (elements[0]) + { + case "0" -> noneOf(MultiPartCompliance.Violation.class); + case "*" -> allOf(MultiPartCompliance.Violation.class); + default -> + { + MultiPartCompliance mode = MultiPartCompliance.valueOf(elements[0]); + yield (mode == null) ? noneOf(MultiPartCompliance.Violation.class) : copyOf(mode.getAllowed()); + } + }; + + for (int i = 1; i < elements.length; i++) + { + String element = elements[i]; + boolean exclude = element.startsWith("-"); + if (exclude) + element = element.substring(1); + + MultiPartCompliance.Violation section = MultiPartCompliance.Violation.valueOf(element); + if (exclude) + violations.remove(section); + else + violations.add(section); + } + + compliance = new MultiPartCompliance("CUSTOM" + __custom.getAndIncrement(), violations); + } + return compliance; + } + + private static Set copyOf(Set violations) + { + if (violations == null || violations.isEmpty()) + return EnumSet.noneOf(MultiPartCompliance.Violation.class); + return EnumSet.copyOf(violations); + } + private final String name; private final Set violations; @@ -92,13 +198,13 @@ public boolean allows(ComplianceViolation violation) } @Override - public Set getKnown() + public Set getKnown() { return EnumSet.allOf(Violation.class); } @Override - public Set getAllowed() + public Set getAllowed() { return violations; } @@ -106,6 +212,8 @@ public Set getAllowed() @Override public String toString() { - return String.format("%s@%x%s", name, hashCode(), violations); + if (this == RFC7578 || this == LEGACY) + return name; + return String.format("%s@%x(v=%s)", name, hashCode(), violations); } } diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormData.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormData.java index 7e3b43efd664..e1cae2531fa7 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormData.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormData.java @@ -32,6 +32,7 @@ import org.eclipse.jetty.io.content.ContentSourceCompletableFuture; import org.eclipse.jetty.util.Attributes; import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.thread.AutoLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,21 +79,30 @@ private MultiPartFormData() } /** - * @deprecated use {@link #from(Attributes, ComplianceViolation.Listener, String, Function)} instead. This method will be removed in Jetty 12.1.0 + * Returns {@code multipart/form-data} parts using {@link MultiPartCompliance#RFC7578}. */ - @Deprecated(since = "12.0.6", forRemoval = true) public static CompletableFuture from(Attributes attributes, String boundary, Function> parse) { - return from(attributes, ComplianceViolation.Listener.NOOP, boundary, parse); + return from(attributes, MultiPartCompliance.RFC7578, ComplianceViolation.Listener.NOOP, boundary, parse); } - public static CompletableFuture from(Attributes attributes, ComplianceViolation.Listener listener, String boundary, Function> parse) + /** + * Returns {@code multipart/form-data} parts using the given {@link MultiPartCompliance} and listener. + * + * @param attributes the attributes where the futureParts are tracked + * @param compliance the compliance mode + * @param listener the compliance violation listener + * @param boundary the boundary for the {@code multipart/form-data} parts + * @param parse the parser completable future + * @return the future parts + */ + public static CompletableFuture from(Attributes attributes, MultiPartCompliance compliance, ComplianceViolation.Listener listener, String boundary, Function> parse) { @SuppressWarnings("unchecked") CompletableFuture futureParts = (CompletableFuture)attributes.getAttribute(MultiPartFormData.class.getName()); if (futureParts == null) { - futureParts = parse.apply(new Parser(boundary, listener)); + futureParts = parse.apply(new Parser(boundary, compliance, listener)); attributes.setAttribute(MultiPartFormData.class.getName(), futureParts); } return futureParts; @@ -209,7 +219,8 @@ public static class Parser { private final PartsListener listener = new PartsListener(); private final MultiPart.Parser parser; - private ComplianceViolation.Listener complianceViolationListener; + private final MultiPartCompliance compliance; + private final ComplianceViolation.Listener complianceListener; private boolean useFilesForPartsWithoutFileName; private Path filesDirectory; private long maxFileSize = -1; @@ -220,13 +231,14 @@ public static class Parser public Parser(String boundary) { - this(boundary, null); + this(boundary, MultiPartCompliance.RFC7578, ComplianceViolation.Listener.NOOP); } - public Parser(String boundary, ComplianceViolation.Listener complianceViolationListener) + public Parser(String boundary, MultiPartCompliance multiPartCompliance, ComplianceViolation.Listener complianceViolationListener) { - parser = new MultiPart.Parser(Objects.requireNonNull(boundary), listener); - this.complianceViolationListener = complianceViolationListener != null ? complianceViolationListener : ComplianceViolation.Listener.NOOP; + compliance = Objects.requireNonNull(multiPartCompliance); + complianceListener = Objects.requireNonNull(complianceViolationListener); + parser = new MultiPart.Parser(Objects.requireNonNull(boundary), compliance, listener); } public CompletableFuture parse(Content.Source content) @@ -533,11 +545,38 @@ public void onPart(String name, String fileName, HttpFields headers) memoryFileSize = 0; try (AutoLock ignored = lock.lock()) { - if (headers.contains("content-transfer-encoding")) + // Content-Transfer-Encoding is not a multi-valued field. + String value = headers.get(HttpHeader.CONTENT_TRANSFER_ENCODING); + if (value != null) { - String value = headers.get("content-transfer-encoding"); - if (!"8bit".equalsIgnoreCase(value) && !"binary".equalsIgnoreCase(value)) - complianceViolationListener.onComplianceViolation(new ComplianceViolation.Event(MultiPartCompliance.RFC7578, MultiPartCompliance.Violation.CONTENT_TRANSFER_ENCODING, value)); + switch (StringUtil.asciiToLowerCase(value)) + { + case "base64" -> + { + complianceListener.onComplianceViolation( + new ComplianceViolation.Event(compliance, + MultiPartCompliance.Violation.BASE64_TRANSFER_ENCODING, + value)); + } + case "quoted-printable" -> + { + complianceListener.onComplianceViolation( + new ComplianceViolation.Event(compliance, + MultiPartCompliance.Violation.QUOTED_PRINTABLE_TRANSFER_ENCODING, + value)); + } + case "8bit", "binary" -> + { + // ignore + } + default -> + { + complianceListener.onComplianceViolation( + new ComplianceViolation.Event(compliance, + MultiPartCompliance.Violation.CONTENT_TRANSFER_ENCODING, + value)); + } + } } MultiPart.Part part; @@ -594,6 +633,21 @@ public void onFailure(Throwable failure) fail(failure); } + @Override + public void onViolation(MultiPartCompliance.Violation violation) + { + try + { + ComplianceViolation.Event event = new ComplianceViolation.Event(compliance, violation, "multipart spec violation"); + complianceListener.onComplianceViolation(event); + } + catch (Throwable x) + { + if (LOG.isDebugEnabled()) + LOG.debug("failure while notifying listener {}", complianceListener, x); + } + } + private void fail(Throwable cause) { List partsToFail; diff --git a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartCaptureTest.java b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartCaptureTest.java index dabe245e146f..7469cb2af516 100644 --- a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartCaptureTest.java +++ b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartCaptureTest.java @@ -13,294 +13,154 @@ package org.eclipse.jetty.http; -import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.security.DigestOutputStream; -import java.security.MessageDigest; import java.util.ArrayList; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; -import java.util.Locale; import java.util.Map; -import java.util.Objects; -import java.util.stream.Stream; import org.eclipse.jetty.io.Content; -import org.eclipse.jetty.toolchain.test.Hex; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.io.content.ByteBufferContentSource; +import org.eclipse.jetty.tests.multipart.MultiPartExpectations; +import org.eclipse.jetty.tests.multipart.MultiPartFormArgumentsProvider; +import org.eclipse.jetty.tests.multipart.MultiPartRequest; +import org.eclipse.jetty.tests.multipart.MultiPartResults; +import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.MavenPaths; import org.eclipse.jetty.util.BufferUtil; -import org.eclipse.jetty.util.IO; -import org.eclipse.jetty.util.Promise; -import org.eclipse.jetty.util.QuotedStringTokenizer; -import org.eclipse.jetty.util.StringUtil; -import org.hamcrest.Matchers; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; +import org.junit.jupiter.params.provider.ArgumentsSource; public class MultiPartCaptureTest { - public static Stream data() - { - return Stream.of( - // == Arbitrary / Non-Standard Examples == - - "multipart-uppercase", - // "multipart-base64", // base64 transfer encoding deprecated - // "multipart-base64-long", // base64 transfer encoding deprecated - - // == Capture of raw request body contents from Apache HttpClient 4.5.5 == - - "browser-capture-company-urlencoded-apache-httpcomp", - "browser-capture-complex-apache-httpcomp", - "browser-capture-duplicate-names-apache-httpcomp", - "browser-capture-encoding-mess-apache-httpcomp", - "browser-capture-nested-apache-httpcomp", - "browser-capture-nested-binary-apache-httpcomp", - "browser-capture-number-only2-apache-httpcomp", - "browser-capture-number-only-apache-httpcomp", - "browser-capture-sjis-apache-httpcomp", - "browser-capture-strange-quoting-apache-httpcomp", - "browser-capture-text-files-apache-httpcomp", - "browser-capture-unicode-names-apache-httpcomp", - "browser-capture-zalgo-text-plain-apache-httpcomp", - - // == Capture of raw request body contents from Eclipse Jetty Http Client 9.4.9 == - - "browser-capture-complex-jetty-client", - "browser-capture-duplicate-names-jetty-client", - "browser-capture-encoding-mess-jetty-client", - "browser-capture-nested-jetty-client", - "browser-capture-number-only-jetty-client", - "browser-capture-sjis-jetty-client", - "browser-capture-text-files-jetty-client", - "browser-capture-unicode-names-jetty-client", - "browser-capture-whitespace-only-jetty-client", - - // == Capture of raw request body contents from various browsers == - - // simple form - 2 fields - "browser-capture-form1-android-chrome", - "browser-capture-form1-android-firefox", - "browser-capture-form1-chrome", - "browser-capture-form1-edge", - "browser-capture-form1-firefox", - "browser-capture-form1-ios-safari", - "browser-capture-form1-msie", - "browser-capture-form1-osx-safari", - - // form submitted as shift-jis - "browser-capture-sjis-form-edge", - "browser-capture-sjis-form-msie", - // TODO: these might be addressable via Issue #2398 - // "browser-capture-sjis-form-android-chrome", // contains html encoded character and unspecified charset defaults to utf-8 - // "browser-capture-sjis-form-android-firefox", // contains html encoded character and unspecified charset defaults to utf-8 - // "browser-capture-sjis-form-chrome", // contains html encoded character and unspecified charset defaults to utf-8 - // "browser-capture-sjis-form-firefox", // contains html encoded character and unspecified charset defaults to utf-8 - // "browser-capture-sjis-form-ios-safari", // contains html encoded character and unspecified charset defaults to utf-8 - // "browser-capture-sjis-form-safari", // contains html encoded character and unspecified charset defaults to utf-8 - - // form submitted as shift-jis (with HTML5 specific hidden _charset_ field) - "browser-capture-sjis-charset-form-android-chrome", // contains html encoded character - "browser-capture-sjis-charset-form-android-firefox", // contains html encoded character - "browser-capture-sjis-charset-form-chrome", // contains html encoded character - "browser-capture-sjis-charset-form-edge", - "browser-capture-sjis-charset-form-firefox", // contains html encoded character - "browser-capture-sjis-charset-form-ios-safari", // contains html encoded character - "browser-capture-sjis-charset-form-msie", - "browser-capture-sjis-charset-form-safari", // contains html encoded character - - // form submitted with simple file upload - "browser-capture-form-fileupload-android-chrome", - "browser-capture-form-fileupload-android-firefox", - "browser-capture-form-fileupload-chrome", - "browser-capture-form-fileupload-edge", - "browser-capture-form-fileupload-firefox", - "browser-capture-form-fileupload-ios-safari", - "browser-capture-form-fileupload-msie", - "browser-capture-form-fileupload-safari", - - // form submitted with 2 files (1 binary, 1 text) and 2 text fields - "browser-capture-form-fileupload-alt-chrome", - "browser-capture-form-fileupload-alt-edge", - "browser-capture-form-fileupload-alt-firefox", - "browser-capture-form-fileupload-alt-msie", - "browser-capture-form-fileupload-alt-safari" - ).map(Arguments::of); - } - @ParameterizedTest - @MethodSource("data") - public void testMultipartCapture(String fileName) throws Exception + @ArgumentsSource(MultiPartFormArgumentsProvider.class) + public void testMultipartCapture(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations) throws Exception { - Path rawPath = MavenTestingUtils.getTestResourcePathFile("multipart/" + fileName + ".raw"); - Path expectationPath = MavenTestingUtils.getTestResourcePathFile("multipart/" + fileName + ".expected.txt"); - MultiPartExpectations expectations = new MultiPartExpectations(expectationPath); - - String boundaryAttribute = "boundary="; - int boundaryIndex = expectations.contentType.indexOf(boundaryAttribute); - assertThat(boundaryIndex, greaterThan(0)); - String boundary = HttpField.PARAMETER_TOKENIZER.unquote(expectations.contentType.substring(boundaryIndex + boundaryAttribute.length())); - - TestPartsListener listener = new TestPartsListener(expectations); + String boundary = MultiPart.extractBoundary(formExpectations.getContentType()); + TestPartsListener listener = new TestPartsListener(); MultiPart.Parser parser = new MultiPart.Parser(boundary, listener); - parser.parse(Content.Chunk.from(ByteBuffer.wrap(Files.readAllBytes(rawPath)), true)); - listener.assertParts(); + ByteBuffer rawByteBuffer = formRequest.asByteBuffer(); + parser.parse(Content.Chunk.from(rawByteBuffer, true)); + formExpectations.assertParts(mapActualResults(listener.parts), defaultCharset); } - private record NameValue(String name, String value) + @ParameterizedTest + @ArgumentsSource(MultiPartFormArgumentsProvider.class) + public void testMultiPartFormDataParse(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations) throws Exception { + String boundary = MultiPart.extractBoundary(formExpectations.getContentType()); + Path tempDir = MavenPaths.targetTestDir(MultiPartCaptureTest.class.getSimpleName() + "-temp"); + FS.ensureDirExists(tempDir); + + MultiPartFormData.Parser parser = new MultiPartFormData.Parser(boundary); + parser.setUseFilesForPartsWithoutFileName(false); + parser.setFilesDirectory(tempDir); + ByteBufferContentSource contentSource = new ByteBufferContentSource(formRequest.asByteBuffer()); + MultiPartFormData.Parts parts = parser.parse(contentSource).get(); + formExpectations.assertParts(mapActualResults(parts), defaultCharset); } - private static class MultiPartExpectations + private MultiPartResults mapActualResults(final MultiPartFormData.Parts parts) { - public final String contentType; - public final int partCount; - public final List partFilenames = new ArrayList<>(); - public final List partSha1Sums = new ArrayList<>(); - public final List partContainsContents = new ArrayList<>(); - - public MultiPartExpectations(Path expectationsPath) throws IOException + return new MultiPartResults() { - String parsedContentType = null; - String parsedPartCount = "-1"; + @Override + public int getCount() + { + return parts.size(); + } - try (BufferedReader reader = Files.newBufferedReader(expectationsPath)) + @Override + public List get(String name) { - String line; - while ((line = reader.readLine()) != null) - { - line = line.trim(); - if (StringUtil.isBlank(line) || line.startsWith("#")) - { - // skip blanks and comments - continue; - } + List namedParts = parts.getAll(name); + + if (namedParts == null) + return null; - String[] split = line.split("\\|"); - switch (split[0]) - { - case "Request-Header": - if (split[1].equalsIgnoreCase("Content-Type")) - { - parsedContentType = split[2]; - } - break; - case "Content-Type": - parsedContentType = split[1]; - break; - case "Parts-Count": - parsedPartCount = split[1]; - break; - case "Part-ContainsContents": - { - NameValue pair = new NameValue(split[1], split[2]); - partContainsContents.add(pair); - break; - } - case "Part-Filename": - { - NameValue pair = new NameValue(split[1], split[2]); - partFilenames.add(pair); - break; - } - case "Part-Sha1sum": - { - NameValue pair = new NameValue(split[1], split[2]); - partSha1Sums.add(pair); - break; - } - default: - throw new IOException("Bad Line in " + expectationsPath + ": " + line); - } + List results = new ArrayList<>(); + for (MultiPart.Part namedPart : namedParts) + { + results.add(new NamedPartResult(namedPart)); } + return results; } + }; + } - Objects.requireNonNull(parsedContentType, "Missing required 'Content-Type' declaration: " + expectationsPath); - this.contentType = parsedContentType; - this.partCount = Integer.parseInt(parsedPartCount); - } - - private void assertParts(Map> allParts) throws Exception + private MultiPartResults mapActualResults(final Map> parts) + { + return new MultiPartResults() { - if (partCount >= 0) - assertThat(allParts.values().stream().mapToInt(List::size).sum(), is(partCount)); - - String defaultCharset = UTF_8.toString(); - List charSetParts = allParts.get("_charset_"); - if (charSetParts != null) + @Override + public int getCount() { - defaultCharset = Promise.Completable.with(p -> Content.Source.asString(charSetParts.get(0).getContentSource(), StandardCharsets.US_ASCII, p)) - .get(); + return parts.values().stream().mapToInt(List::size).sum(); } - for (NameValue expected : partContainsContents) + @Override + public List get(String name) { - List parts = allParts.get(expected.name); - assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); - MultiPart.Part part = parts.get(0); - String charset = getCharsetFromContentType(part.getHeaders().get(HttpHeader.CONTENT_TYPE), defaultCharset); - String partContent = Content.Source.asString(part.newContentSource(), Charset.forName(charset)); - assertThat("Part[" + expected.name + "].contents", partContent, containsString(expected.value)); - } + List namedParts = parts.get(name); - // Evaluate expected filenames - for (NameValue expected : partFilenames) - { - List parts = allParts.get(expected.name); - assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); - MultiPart.Part part = parts.get(0); - assertThat("Part[" + expected.name + "]", part.getFileName(), is(expected.value)); - } + if (namedParts == null) + return null; - // Evaluate expected contents checksums - for (NameValue expected : partSha1Sums) - { - List parts = allParts.get(expected.name); - assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); - MultiPart.Part part = parts.get(0); - MessageDigest digest = MessageDigest.getInstance("SHA1"); - try (InputStream partInputStream = Content.Source.asInputStream(part.newContentSource()); - DigestOutputStream digester = new DigestOutputStream(OutputStream.nullOutputStream(), digest)) + List results = new ArrayList<>(); + for (MultiPart.Part namedPart : namedParts) { - IO.copy(partInputStream, digester); - String actualSha1sum = Hex.asHex(digest.digest()).toLowerCase(Locale.US); - assertThat("Part[" + expected.name + "].sha1sum", actualSha1sum, Matchers.equalToIgnoringCase(expected.value)); + results.add(new NamedPartResult(namedPart)); } + return results; } + }; + } + + public static class NamedPartResult implements MultiPartResults.PartResult + { + private final MultiPart.Part namedPart; + + public NamedPartResult(MultiPart.Part namedPart) + { + this.namedPart = namedPart; } - private String getCharsetFromContentType(String contentType, String defaultCharset) + @Override + public String getContentType() { - if (StringUtil.isBlank(contentType)) - return defaultCharset; + return namedPart.getHeaders().get(HttpHeader.CONTENT_TYPE); + } - QuotedStringTokenizer tok = QuotedStringTokenizer.builder().delimiters(";").ignoreOptionalWhiteSpace().build(); - for (Iterator i = tok.tokenize(contentType); i.hasNext();) - { - String str = i.next().trim(); - if (str.startsWith("charset=")) - { - return str.substring("charset=".length()); - } - } + @Override + public ByteBuffer asByteBuffer() throws IOException + { + return Content.Source.asByteBuffer(namedPart.newContentSource()); + } + + @Override + public String asString(Charset charset) throws IOException + { + if (charset == null) + return Content.Source.asString(namedPart.newContentSource()); + else + return Content.Source.asString(namedPart.newContentSource(), charset); + } + + @Override + public String getFileName() + { + return namedPart.getFileName(); + } - return defaultCharset; + @Override + public InputStream asInputStream() + { + return Content.Source.asInputStream(namedPart.newContentSource()); } } @@ -309,12 +169,6 @@ private static class TestPartsListener extends MultiPart.AbstractPartsListener // Preserve parts order. private final Map> parts = new LinkedHashMap<>(); private final List partByteBuffers = new ArrayList<>(); - private final MultiPartExpectations expectations; - - private TestPartsListener(MultiPartExpectations expectations) - { - this.expectations = expectations; - } @Override public void onPartContent(Content.Chunk chunk) @@ -326,14 +180,14 @@ public void onPartContent(Content.Chunk chunk) @Override public void onPart(String name, String fileName, HttpFields headers) { - MultiPart.Part newPart = new MultiPart.ByteBufferPart(name, fileName, headers, List.copyOf(partByteBuffers)); + List copyOfByteBuffers = new ArrayList<>(); + for (ByteBuffer capture: partByteBuffers) + { + copyOfByteBuffers.add(BufferUtil.copy(capture)); + } + MultiPart.Part newPart = new MultiPart.ByteBufferPart(name, fileName, headers, copyOfByteBuffers); partByteBuffers.clear(); parts.compute(newPart.getName(), (k, v) -> v == null ? new ArrayList<>() : v).add(newPart); } - - private void assertParts() throws Exception - { - expectations.assertParts(parts); - } } } diff --git a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartFormDataTest.java b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartFormDataTest.java index b3e2fb295612..13878b3a0a69 100644 --- a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartFormDataTest.java +++ b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartFormDataTest.java @@ -14,6 +14,7 @@ package org.eclipse.jetty.http; import java.io.ByteArrayInputStream; +import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; @@ -42,9 +43,11 @@ import static java.nio.charset.StandardCharsets.US_ASCII; import static java.nio.charset.StandardCharsets.UTF_8; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsStringIgnoringCase; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -56,6 +59,8 @@ public class MultiPartFormDataTest { + private static final String CR = "\r"; + private static final String LF = "\n"; private static final AtomicInteger testCounter = new AtomicInteger(); private Path _tmpDir; @@ -242,6 +247,316 @@ public void testEmptyStringBoundary() throws Exception } } + @Test + public void testContentTransferEncodingQuotedPrintable() throws Exception + { + String boundary = "BEEF"; + String str = """ + --$B\r + Content-Disposition: form-data; name="greeting"\r + Content-Type: text/plain; charset=US-ASCII\r + Content-Transfer-Encoding: quoted-printable\r + \r + Hello World\r + --$B--\r + """.replace("$B", boundary); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578, violations); + formData.setFilesDirectory(_tmpDir); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + try (MultiPartFormData.Parts parts = formData.parse(source).get(5, TimeUnit.SECONDS)) + { + assertThat(parts.size(), is(1)); + + MultiPart.Part greeting = parts.getFirst("greeting"); + assertThat(greeting, notNullValue()); + Content.Source partContent = greeting.getContentSource(); + assertThat(partContent.getLength(), is(11L)); + assertThat(Content.Source.asString(partContent), is("Hello World")); + + List events = violations.getEvents(); + assertThat(events.size(), is(1)); + ComplianceViolation.Event event = events.get(0); + assertThat(event.violation(), is(MultiPartCompliance.Violation.QUOTED_PRINTABLE_TRANSFER_ENCODING)); + } + } + + @Test + public void testLFOnlyNoCRInPreviousChunk() throws Exception + { + String str1 = """ + --BEEF\r + Content-Disposition: form-data; name="greeting"\r + Content-Type: text/plain; charset=US-ASCII\r + \r + """; + String str2 = "Hello World"; // not ending with CR + String str3 = """ + \n--BEEF--\r + """; + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser("BEEF", MultiPartCompliance.RFC7578, violations); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, false, str1, Callback.NOOP); + Content.Sink.write(source, false, str2, Callback.NOOP); + Content.Sink.write(source, true, str3, Callback.NOOP); + + try (MultiPartFormData.Parts parts = formData.parse(source).get(5, TimeUnit.SECONDS)) + { + assertThat(parts.size(), is(1)); + + MultiPart.Part greeting = parts.getFirst("greeting"); + assertThat(greeting, notNullValue()); + Content.Source partContent = greeting.getContentSource(); + assertThat(partContent.getLength(), is(11L)); + assertThat(Content.Source.asString(partContent), is("Hello World")); + + List events = violations.getEvents(); + assertThat(events.size(), is(1)); + ComplianceViolation.Event event = events.get(0); + assertThat(event.violation(), is(MultiPartCompliance.Violation.LF_LINE_TERMINATION)); + } + } + + @Test + public void testLFOnlyNoCRInCurrentChunk() throws Exception + { + String str1 = """ + --BEEF\r + Content-Disposition: form-data; name="greeting"\r + Content-Type: text/plain; charset=US-ASCII\r + \r + """; + // Do not end Hello World with "\r". + String str2 = """ + Hello World\n--BEEF--\r + """; + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser("BEEF", MultiPartCompliance.RFC7578, violations); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, false, str1, Callback.NOOP); + Content.Sink.write(source, true, str2, Callback.NOOP); + + try (MultiPartFormData.Parts parts = formData.parse(source).get(5, TimeUnit.SECONDS)) + { + assertThat(parts.size(), is(1)); + + MultiPart.Part greeting = parts.getFirst("greeting"); + assertThat(greeting, notNullValue()); + Content.Source partContent = greeting.getContentSource(); + assertThat(partContent.getLength(), is(11L)); + assertThat(Content.Source.asString(partContent), is("Hello World")); + + List events = violations.getEvents(); + assertThat(events.size(), is(1)); + ComplianceViolation.Event event = events.get(0); + assertThat(event.violation(), is(MultiPartCompliance.Violation.LF_LINE_TERMINATION)); + } + } + + @Test + public void testLFOnlyEOLLenient() throws Exception + { + String boundary = "BEEF"; + String str = """ + --$B + Content-Disposition: form-data; name="greeting" + Content-Type: text/plain; charset=US-ASCII + + Hello World + --$B-- + """.replace("$B", boundary); + + assertThat("multipart str cannot contain CR for this test", str, not(containsString(CR))); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578, violations); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + try (MultiPartFormData.Parts parts = formData.parse(source).get(5, TimeUnit.SECONDS)) + { + assertThat(parts.size(), is(1)); + + MultiPart.Part greeting = parts.getFirst("greeting"); + assertThat(greeting, notNullValue()); + Content.Source partContent = greeting.getContentSource(); + assertThat(partContent.getLength(), is(11L)); + assertThat(Content.Source.asString(partContent), is("Hello World")); + + List events = violations.getEvents(); + assertThat(events.size(), is(1)); + ComplianceViolation.Event event = events.get(0); + assertThat(event.violation(), is(MultiPartCompliance.Violation.LF_LINE_TERMINATION)); + } + } + + @Test + public void testLFOnlyEOLStrict() + { + String boundary = "BEEF"; + String str = """ + --$B + Content-Disposition: form-data; name="greeting" + Content-Type: text/plain; charset=US-ASCII + + Hello World + --$B-- + """.replace("$B", boundary); + + assertThat("multipart str cannot contain CR for this test", str, not(containsString(CR))); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578_STRICT, violations); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + ExecutionException ee = assertThrows(ExecutionException.class, () -> formData.parse(source).get(5, TimeUnit.SECONDS)); + assertThat(ee.getCause(), instanceOf(BadMessageException.class)); + BadMessageException bme = (BadMessageException)ee.getCause(); + assertThat(bme.getMessage(), containsString("invalid LF-only EOL")); + } + + /** + * Test of parsing where there is whitespace before the boundary. + * + * @see MultiPartCompliance.Violation#WHITESPACE_BEFORE_BOUNDARY + */ + @Test + public void testWhiteSpaceBeforeBoundary() + { + String boundary = "BEEF"; + String str = """ + preamble\r + --$B\r + Content-Disposition: form-data; name="greeting"\r + Content-Type: text/plain; charset=US-ASCII\r + \r + Hello World\r + --$B--\r + """.replace("$B", boundary); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578, violations); + formData.setFilesDirectory(_tmpDir); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + ExecutionException ee = assertThrows(ExecutionException.class, () -> formData.parse(source).get()); + assertThat(ee.getCause(), instanceOf(EOFException.class)); + EOFException bme = (EOFException)ee.getCause(); + assertThat(bme.getMessage(), containsString("unexpected EOF")); + } + + @Test + public void testCROnlyEOL() + { + String boundary = "BEEF"; + String str = """ + --$B + Content-Disposition: form-data; name="greeting" + Content-Type: text/plain; charset=US-ASCII + + Hello World + --$B-- + """.replace("$B", boundary); + + // change every '\n' LF to a CR. + str = str.replace(LF, CR); + + assertThat("multipart str cannot contain LF for this test", str, not(containsString(LF))); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578, violations); + formData.setFilesDirectory(_tmpDir); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + ExecutionException ee = assertThrows(ExecutionException.class, () -> formData.parse(source).get(5, TimeUnit.SECONDS)); + assertThat(ee.getCause(), instanceOf(BadMessageException.class)); + BadMessageException bme = (BadMessageException)ee.getCause(); + assertThat(bme.getMessage(), containsString("invalid CR-only EOL")); + } + + @Test + public void testTooManyCRs() + { + String boundary = "BEEF"; + String str = """ + --$B + Content-Disposition: form-data; name="greeting" + Content-Type: text/plain; charset=US-ASCII + + Hello World + --$B-- + """.replace("$B", boundary); + + // change every '\n' LF to a multiple CR then a LF. + str = str.replace("\n", "\r\r\r\r\r\r\r\n"); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578, violations); + formData.setFilesDirectory(_tmpDir); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + ExecutionException ee = assertThrows(ExecutionException.class, () -> formData.parse(source).get()); + assertThat(ee.getCause(), instanceOf(BadMessageException.class)); + BadMessageException bme = (BadMessageException)ee.getCause(); + assertThat(bme.getMessage(), containsString("invalid CR-only EOL")); + } + + @Test + public void testContentTransferEncodingBase64() throws Exception + { + String boundary = "BEEF"; + String str = """ + --$B\r + Content-Disposition: form-data; name="greeting"\r + Content-Type: text/plain; charset=US-ASCII\r + Content-Transfer-Encoding: base64\r + \r + SGVsbG8gV29ybGQK\r + --$B--\r + """.replace("$B", boundary); + + AsyncContent source = new TestContent(); + CaptureMultiPartViolations violations = new CaptureMultiPartViolations(); + MultiPartFormData.Parser formData = new MultiPartFormData.Parser(boundary, MultiPartCompliance.RFC7578, violations); + formData.setFilesDirectory(_tmpDir); + formData.setMaxMemoryFileSize(-1); + Content.Sink.write(source, true, str, Callback.NOOP); + + try (MultiPartFormData.Parts parts = formData.parse(source).get(5, TimeUnit.SECONDS)) + { + assertThat(parts.size(), is(1)); + + MultiPart.Part greeting = parts.getFirst("greeting"); + assertThat(greeting, notNullValue()); + Content.Source partContent = greeting.getContentSource(); + assertThat(partContent.getLength(), is(16L)); + assertThat(Content.Source.asString(partContent), is("SGVsbG8gV29ybGQK")); + + List events = violations.getEvents(); + assertThat(events.size(), is(1)); + ComplianceViolation.Event event = events.get(0); + assertThat(event.violation(), is(MultiPartCompliance.Violation.BASE64_TRANSFER_ENCODING)); + } + } + @Test public void testNoBody() throws Exception { @@ -633,7 +948,7 @@ public void testDefaultCharset() throws Exception \r --AaB03x\r Content-Disposition: form-data; name="utf"\r - Content-Type: text/plain; charset="UTF-8" + Content-Type: text/plain; charset="UTF-8"\r \r """; ByteBuffer utfCedilla = UTF_8.encode("ç"); @@ -1324,4 +1639,20 @@ public void retain() throw new UnsupportedOperationException(); } } + + private static class CaptureMultiPartViolations implements ComplianceViolation.Listener + { + private final List events = new ArrayList<>(); + + @Override + public void onComplianceViolation(ComplianceViolation.Event event) + { + events.add(event); + } + + public List getEvents() + { + return events; + } + } } diff --git a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartTest.java b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartTest.java index bb2f589a9f0f..717c658e43ac 100644 --- a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartTest.java +++ b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/MultiPartTest.java @@ -22,6 +22,7 @@ import org.eclipse.jetty.io.Content; import org.eclipse.jetty.util.BufferUtil; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -370,6 +371,48 @@ public void testSimple() throws Exception assertEquals(0, data.remaining()); } + /** + * Whitespace before boundaries. + * + * @see MultiPartCompliance.Violation#WHITESPACE_BEFORE_BOUNDARY + */ + @Test + @Disabled + public void testWhitespaceBeforeBoundary() throws Exception + { + TestPartsListener listener = new TestPartsListener(); + MultiPart.Parser parser = new MultiPart.Parser("BOUNDARY", listener); + + ByteBuffer data = BufferUtil.toBuffer(""" + preamble\r + --BOUNDARY\r + name: value\r + \r + Hello\r + --BOUNDARY\r + powerLevel: 9001\r + \r + secondary\r + content\r + --BOUNDARY--epi\r + logue\r + """); + + parser.parse(Content.Chunk.from(data, true)); + + assertEquals(2, listener.parts.size()); + + MultiPart.Part part1 = listener.parts.get(0); + assertEquals("value", part1.getHeaders().get("name")); + assertEquals("Hello", Content.Source.asString(part1.getContentSource())); + + MultiPart.Part part2 = listener.parts.get(1); + assertEquals("9001", part2.getHeaders().get("powerLevel")); + assertEquals("secondary\r\ncontent", Content.Source.asString(part2.getContentSource())); + + assertEquals(0, data.remaining()); + } + @Test public void testLineFeed() throws Exception { @@ -575,7 +618,7 @@ public void testOnlyCRAfterHeaders() parser.parse(Content.Chunk.from(data, true)); assertNotNull(listener.failure); - assertThat(listener.failure.getMessage(), containsStringIgnoringCase("Invalid EOL")); + assertThat(listener.failure.getMessage(), containsStringIgnoringCase("Invalid CR-only EOL")); } private static List badHeaders() diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt deleted file mode 100644 index 0a05edeeeff7..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|430 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------117031256520586657911714164254 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form-charset.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Android 8.1.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 -Parts-Count|3 -Part-ContainsContents|_charset_|Shift_JIS -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt deleted file mode 100644 index 0d91a3d3545b..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt +++ /dev/null @@ -1,18 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate, br -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|354 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryDHtjXxgNUcgLjcKs -Request-Header|Cookie|visited=yes -Request-Header|DNT|1 -Request-Header|Host|localhost:9090 -Request-Header|Origin|http://localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form-charset.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 -Parts-Count|3 -Part-ContainsContents|_charset_|Shift_JIS -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt deleted file mode 100644 index 4b4cc724c95f..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|362 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e227e17151054 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form-charset.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 -Parts-Count|3 -Part-ContainsContents|_charset_|utf-8 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt deleted file mode 100644 index 2d6fbab768cd..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|354 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryvshQXGBfIsRjfMBN -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form-charset.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (iPad; CPU OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1 -Parts-Count|3 -Part-ContainsContents|_charset_|Shift_JIS -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt deleted file mode 100644 index 5d84aa6eb753..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|358 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e226e1b2109c -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form-charset.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko -Parts-Count|3 -Part-ContainsContents|_charset_|utf-8 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt deleted file mode 100644 index 18452b29e95c..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|354 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryHFCTTESrC7sXQ2Gf -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form-charset.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6 -Parts-Count|3 -Part-ContainsContents|_charset_|Shift_JIS -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt deleted file mode 100644 index b3baf1946894..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|303 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------18591390852002031541755421242 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Android 8.1.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-chrome.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-chrome.expected.txt deleted file mode 100644 index 6cba2d9e365b..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-chrome.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate, br -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|249 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundarysKD6As9BBil2g6Fc -Request-Header|Cookie|visited=yes -Request-Header|DNT|1 -Request-Header|Host|localhost:9090 -Request-Header|Origin|http://localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-firefox.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-firefox.expected.txt deleted file mode 100644 index ad25c45b3216..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-firefox.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|261 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------265001916915724 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-safari.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-safari.expected.txt deleted file mode 100644 index 2acbd52718bf..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-safari.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|249 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundarytsFILMzOBBWaETUj -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64-long.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64-long.expected.txt deleted file mode 100644 index 2b1d5ded0601..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64-long.expected.txt +++ /dev/null @@ -1,4 +0,0 @@ -Content-Type|multipart/form-data; boundary="JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8" -Parts-Count|1 -Part-Filename|png|jetty-avatar-256.png -Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64.expected.txt b/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64.expected.txt deleted file mode 100644 index 5d4a189b8dc5..000000000000 --- a/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64.expected.txt +++ /dev/null @@ -1,4 +0,0 @@ -Content-Type|multipart/form-data; boundary="8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp" -Parts-Count|1 -Part-Filename|png|jetty-avatar-256.png -Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/MultiPartParser.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/MultiPartParser.java deleted file mode 100644 index ec705640473d..000000000000 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/MultiPartParser.java +++ /dev/null @@ -1,713 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 -// which is available at https://www.apache.org/licenses/LICENSE-2.0. -// -// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 -// ======================================================================== -// - -package org.eclipse.jetty.server.internal; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.EnumSet; - -import org.eclipse.jetty.http.BadMessageException; -import org.eclipse.jetty.http.HttpParser.RequestHandler; -import org.eclipse.jetty.http.HttpTokens; -import org.eclipse.jetty.util.BufferUtil; -import org.eclipse.jetty.util.SearchPattern; -import org.eclipse.jetty.util.Utf8StringBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A parser for MultiPart content type. - * - * @see https://tools.ietf.org/html/rfc2046#section-5.1 - * @see https://tools.ietf.org/html/rfc2045 - * - * TODO convert to use a {@link org.eclipse.jetty.io.Content.Source} and to be async - */ -public class MultiPartParser -{ - public static final Logger LOG = LoggerFactory.getLogger(MultiPartParser.class); - - // States - public enum FieldState - { - FIELD, - IN_NAME, - AFTER_NAME, - VALUE, - IN_VALUE - } - - // States - public enum State - { - PREAMBLE, - DELIMITER, - DELIMITER_PADDING, - DELIMITER_CLOSE, - BODY_PART, - FIRST_OCTETS, - OCTETS, - EPILOGUE, - END - } - - private static final EnumSet __delimiterStates = EnumSet.of(State.DELIMITER, State.DELIMITER_CLOSE, State.DELIMITER_PADDING); - private static final int MAX_HEADER_LINE_LENGTH = 998; - - private final boolean debugEnabled = LOG.isDebugEnabled(); - private final Handler _handler; - private final SearchPattern _delimiterSearch; - - private String _fieldName; - private String _fieldValue; - - private State _state = State.PREAMBLE; - private FieldState _fieldState = FieldState.FIELD; - private int _partialBoundary = 2; // No CRLF if no preamble - private boolean _cr; - private ByteBuffer _patternBuffer; - - private final Utf8StringBuilder _string = new Utf8StringBuilder(); - private int _length; - - private int _totalHeaderLineLength = -1; - - public MultiPartParser(Handler handler, String boundary) - { - _handler = handler; - - String delimiter = "\r\n--" + boundary; - _patternBuffer = ByteBuffer.wrap(delimiter.getBytes(StandardCharsets.US_ASCII)); - _delimiterSearch = SearchPattern.compile(_patternBuffer.array()); - } - - public void reset() - { - _state = State.PREAMBLE; - _fieldState = FieldState.FIELD; - _partialBoundary = 2; // No CRLF if no preamble - } - - public Handler getHandler() - { - return _handler; - } - - public State getState() - { - return _state; - } - - public boolean isState(State state) - { - return _state == state; - } - - private static boolean hasNextByte(ByteBuffer buffer) - { - return BufferUtil.hasContent(buffer); - } - - private HttpTokens.Token next(ByteBuffer buffer) - { - byte ch = buffer.get(); - HttpTokens.Token t = HttpTokens.TOKENS[0xff & ch]; - - switch (t.getType()) - { - case CNTL: - throw new IllegalCharacterException(_state, t, buffer); - - case LF: - _cr = false; - break; - - case CR: - if (_cr) - throw new BadMessageException("Bad EOL"); - - _cr = true; - return null; - - case ALPHA: - case DIGIT: - case TCHAR: - case VCHAR: - case HTAB: - case SPACE: - case OTEXT: - case COLON: - if (_cr) - throw new BadMessageException("Bad EOL"); - break; - - default: - break; - } - - return t; - } - - private void setString(String s) - { - _string.reset(); - _string.append(s); - _length = s.length(); - } - - /* - * Mime Field strings are treated as UTF-8 as per https://tools.ietf.org/html/rfc7578#section-5.1 - */ - private String takeString() - { - String s = _string.takeCompleteString(null); - // trim trailing whitespace. - if (s.length() > _length) - s = s.substring(0, _length); - _length = -1; - return s; - } - - /** - * Parse until next Event. - * - * @param buffer the buffer to parse - * @param last whether this buffer contains last bit of content - * @return True if an {@link RequestHandler} method was called and it returned true; - */ - public boolean parse(ByteBuffer buffer, boolean last) - { - boolean handle = false; - while (!handle && BufferUtil.hasContent(buffer)) - { - switch (_state) - { - case PREAMBLE: - parsePreamble(buffer); - continue; - - case DELIMITER: - case DELIMITER_PADDING: - case DELIMITER_CLOSE: - parseDelimiter(buffer); - continue; - - case BODY_PART: - handle = parseMimePartHeaders(buffer); - break; - - case FIRST_OCTETS: - case OCTETS: - handle = parseOctetContent(buffer); - break; - - case EPILOGUE: - BufferUtil.clear(buffer); - break; - - case END: - handle = true; - break; - - default: - throw new IllegalStateException(); - } - } - - if (last && BufferUtil.isEmpty(buffer)) - { - if (_state == State.EPILOGUE) - { - _state = State.END; - - if (LOG.isDebugEnabled()) - LOG.debug("messageComplete {}", this); - - return _handler.messageComplete(); - } - else - { - if (LOG.isDebugEnabled()) - LOG.debug("earlyEOF {}", this); - - _handler.earlyEOF(); - return true; - } - } - - return handle; - } - - private void parsePreamble(ByteBuffer buffer) - { - if (LOG.isDebugEnabled()) - LOG.debug("parsePreamble({})", BufferUtil.toDetailString(buffer)); - - if (_partialBoundary > 0) - { - int partial = _delimiterSearch.startsWith(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining(), _partialBoundary); - if (partial > 0) - { - if (partial == _delimiterSearch.getLength()) - { - buffer.position(buffer.position() + partial - _partialBoundary); - _partialBoundary = 0; - setState(State.DELIMITER); - return; - } - - _partialBoundary = partial; - BufferUtil.clear(buffer); - return; - } - - _partialBoundary = 0; - } - - int delimiter = _delimiterSearch.match(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); - if (delimiter >= 0) - { - buffer.position(delimiter - buffer.arrayOffset() + _delimiterSearch.getLength()); - setState(State.DELIMITER); - return; - } - - _partialBoundary = _delimiterSearch.endsWith(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); - BufferUtil.clear(buffer); - } - - private void parseDelimiter(ByteBuffer buffer) - { - if (LOG.isDebugEnabled()) - LOG.debug("parseDelimiter({})", BufferUtil.toDetailString(buffer)); - - while (__delimiterStates.contains(_state) && hasNextByte(buffer)) - { - HttpTokens.Token t = next(buffer); - if (t == null) - return; - - if (t.getType() == HttpTokens.Type.LF) - { - setState(State.BODY_PART); - - if (LOG.isDebugEnabled()) - LOG.debug("startPart {}", this); - - _handler.startPart(); - return; - } - - switch (_state) - { - case DELIMITER: - if (t.getChar() == '-') - setState(State.DELIMITER_CLOSE); - else - setState(State.DELIMITER_PADDING); - continue; - - case DELIMITER_CLOSE: - if (t.getChar() == '-') - { - setState(State.EPILOGUE); - return; - } - setState(State.DELIMITER_PADDING); - continue; - - case DELIMITER_PADDING: - default: - } - } - } - - /* - * Parse the message headers and return true if the handler has signaled for a return - */ - protected boolean parseMimePartHeaders(ByteBuffer buffer) - { - if (LOG.isDebugEnabled()) - LOG.debug("parseMimePartHeaders({})", BufferUtil.toDetailString(buffer)); - - // Process headers - while (_state == State.BODY_PART && hasNextByte(buffer)) - { - // process each character - HttpTokens.Token t = next(buffer); - if (t == null) - break; - - if (t.getType() != HttpTokens.Type.LF) - _totalHeaderLineLength++; - - if (_totalHeaderLineLength > MAX_HEADER_LINE_LENGTH) - throw new IllegalStateException("Header Line Exceeded Max Length"); - - switch (_fieldState) - { - case FIELD: - switch (t.getType()) - { - case SPACE: - case HTAB: - { - // Folded field value! - - if (_fieldName == null) - throw new IllegalStateException("First field folded"); - - if (_fieldValue == null) - { - _string.reset(); - _length = 0; - } - else - { - setString(_fieldValue); - _string.append(' '); - _length++; - _fieldValue = null; - } - setState(FieldState.VALUE); - break; - } - - case LF: - handleField(); - setState(State.FIRST_OCTETS); - _partialBoundary = 2; // CRLF is option for empty parts - - if (LOG.isDebugEnabled()) - LOG.debug("headerComplete {}", this); - - if (_handler.headerComplete()) - return true; - break; - - case ALPHA: - case DIGIT: - case TCHAR: - // process previous header - handleField(); - - // New header - setState(FieldState.IN_NAME); - _string.reset(); - _string.append(t.getChar()); - _length = 1; - - break; - - default: - throw new IllegalCharacterException(_state, t, buffer); - } - break; - - case IN_NAME: - switch (t.getType()) - { - case COLON: - _fieldName = takeString(); - _length = -1; - setState(FieldState.VALUE); - break; - - case SPACE: - // Ignore trailing whitespaces - setState(FieldState.AFTER_NAME); - break; - - case LF: - { - if (LOG.isDebugEnabled()) - LOG.debug("Line Feed in Name {}", this); - - handleField(); - setState(FieldState.FIELD); - break; - } - - case ALPHA: - case DIGIT: - case TCHAR: - _string.append(t.getChar()); - _length = _string.length(); - break; - - default: - throw new IllegalCharacterException(_state, t, buffer); - } - break; - - case AFTER_NAME: - switch (t.getType()) - { - case COLON: - _fieldName = takeString(); - _length = -1; - setState(FieldState.VALUE); - break; - - case LF: - _fieldName = takeString(); - _string.reset(); - _fieldValue = ""; - _length = -1; - break; - - case SPACE: - break; - - default: - throw new IllegalCharacterException(_state, t, buffer); - } - break; - - case VALUE: - switch (t.getType()) - { - case LF: - _string.reset(); - _fieldValue = ""; - _length = -1; - - setState(FieldState.FIELD); - break; - - case SPACE: - case HTAB: - break; - - case ALPHA: - case DIGIT: - case TCHAR: - case VCHAR: - case COLON: - case OTEXT: - _string.append(t.getByte()); - _length = _string.length(); - setState(FieldState.IN_VALUE); - break; - - default: - throw new IllegalCharacterException(_state, t, buffer); - } - break; - - case IN_VALUE: - switch (t.getType()) - { - case SPACE: - case HTAB: - _string.append(' '); - break; - - case LF: - if (_length > 0) - { - _fieldValue = takeString(); - _length = -1; - _totalHeaderLineLength = -1; - } - setState(FieldState.FIELD); - break; - - case ALPHA: - case DIGIT: - case TCHAR: - case VCHAR: - case COLON: - case OTEXT: - _string.append(t.getByte()); - _length = _string.length(); - break; - - default: - throw new IllegalCharacterException(_state, t, buffer); - } - break; - - default: - throw new IllegalStateException(_state.toString()); - } - } - return false; - } - - private void handleField() - { - if (LOG.isDebugEnabled()) - LOG.debug("parsedField: _fieldName={} _fieldValue={} {}", _fieldName, _fieldValue, this); - - if (_fieldName != null && _fieldValue != null) - _handler.parsedField(_fieldName, _fieldValue); - _fieldName = _fieldValue = null; - } - - protected boolean parseOctetContent(ByteBuffer buffer) - { - if (LOG.isDebugEnabled()) - LOG.debug("parseOctetContent({})", BufferUtil.toDetailString(buffer)); - - // Starts With - if (_partialBoundary > 0) - { - int partial = _delimiterSearch.startsWith(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining(), _partialBoundary); - if (partial > 0) - { - if (partial == _delimiterSearch.getLength()) - { - buffer.position(buffer.position() + _delimiterSearch.getLength() - _partialBoundary); - setState(State.DELIMITER); - _partialBoundary = 0; - - if (LOG.isDebugEnabled()) - LOG.debug("Content={}, Last={} {}", BufferUtil.toDetailString(BufferUtil.EMPTY_BUFFER), true, this); - - return _handler.content(BufferUtil.EMPTY_BUFFER, true); - } - - _partialBoundary = partial; - BufferUtil.clear(buffer); - return false; - } - else - { - // output up to _partialBoundary of the search pattern - ByteBuffer content = _patternBuffer.slice(); - if (_state == State.FIRST_OCTETS) - { - setState(State.OCTETS); - content.position(2); - } - content.limit(_partialBoundary); - _partialBoundary = 0; - - if (LOG.isDebugEnabled()) - LOG.debug("Content={}, Last={} {}", BufferUtil.toDetailString(content), false, this); - - if (_handler.content(content, false)) - return true; - } - } - - // Contains - int delimiter = _delimiterSearch.match(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); - if (delimiter >= 0) - { - ByteBuffer content = buffer.slice(); - content.limit(delimiter - buffer.arrayOffset() - buffer.position()); - - buffer.position(delimiter - buffer.arrayOffset() + _delimiterSearch.getLength()); - setState(State.DELIMITER); - - if (LOG.isDebugEnabled()) - LOG.debug("Content={}, Last={} {}", BufferUtil.toDetailString(content), true, this); - - return _handler.content(content, true); - } - - // Ends With - _partialBoundary = _delimiterSearch.endsWith(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); - if (_partialBoundary > 0) - { - ByteBuffer content = buffer.slice(); - content.limit(content.limit() - _partialBoundary); - - if (LOG.isDebugEnabled()) - LOG.debug("Content={}, Last={} {}", BufferUtil.toDetailString(content), false, this); - - BufferUtil.clear(buffer); - return _handler.content(content, false); - } - - // There is normal content with no delimiter - ByteBuffer content = buffer.slice(); - - if (LOG.isDebugEnabled()) - LOG.debug("Content={}, Last={} {}", BufferUtil.toDetailString(content), false, this); - - BufferUtil.clear(buffer); - return _handler.content(content, false); - } - - private void setState(State state) - { - if (debugEnabled) - LOG.debug("{} --> {}", _state, state); - _state = state; - } - - private void setState(FieldState state) - { - if (debugEnabled) - LOG.debug("{}:{} --> {}", _state, _fieldState, state); - _fieldState = state; - } - - @Override - public String toString() - { - return String.format("%s{s=%s}", getClass().getSimpleName(), _state); - } - - /* - * Event Handler interface These methods return true if the caller should process the events so far received (eg return from parseNext and call - * HttpChannel.handle). If multiple callbacks are called in sequence (eg headerComplete then messageComplete) from the same point in the parsing then it is - * sufficient for the caller to process the events only once. - */ - public interface Handler - { - default void startPart() - { - } - - @SuppressWarnings("unused") - default void parsedField(String name, String value) - { - } - - default boolean headerComplete() - { - return false; - } - - @SuppressWarnings("unused") - default boolean content(ByteBuffer item, boolean last) - { - return false; - } - - default boolean messageComplete() - { - return false; - } - - default void earlyEOF() - { - } - } - - @SuppressWarnings("serial") - private static class IllegalCharacterException extends BadMessageException - { - private IllegalCharacterException(State state, HttpTokens.Token token, ByteBuffer buffer) - { - super(400, String.format("Illegal character %s", token)); - if (LOG.isDebugEnabled()) - LOG.debug(String.format("Illegal character %s in state=%s for buffer %s", token, state, BufferUtil.toDetailString(buffer))); - } - } -} diff --git a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java index 6f78d3300cc5..27b5d9758b49 100644 --- a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java +++ b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java @@ -717,7 +717,7 @@ public static String toString(ByteBuffer buffer) } /** - * Convert the buffer to an ISO-8859-1 String + * Convert buffer to a String with specified Charset * * @param buffer The buffer to convert in flush mode. The buffer is unchanged * @param charset The {@link Charset} to use to convert the bytes diff --git a/jetty-ee10/jetty-ee10-servlet/pom.xml b/jetty-ee10/jetty-ee10-servlet/pom.xml index 3691cb35d2f0..33e3554defbc 100644 --- a/jetty-ee10/jetty-ee10-servlet/pom.xml +++ b/jetty-ee10/jetty-ee10-servlet/pom.xml @@ -62,12 +62,17 @@ jetty-http-tools test
- org.eclipse.jetty jetty-slf4j-impl test + + org.eclipse.jetty.tests + jetty-test-multipart + ${project.version} + test + org.eclipse.jetty.toolchain jetty-test-helper diff --git a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletMultiPartFormData.java b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletMultiPartFormData.java index 2eb0db801797..31ef0e5f1b8c 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletMultiPartFormData.java +++ b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletMultiPartFormData.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.http.MultiPart; +import org.eclipse.jetty.http.MultiPartCompliance; import org.eclipse.jetty.http.MultiPartFormData; import org.eclipse.jetty.io.AbstractConnection; import org.eclipse.jetty.io.ByteBufferPool; @@ -104,9 +105,10 @@ public static CompletableFuture from(ServletRequest servletRequest, Strin HttpChannel httpChannel = HttpChannel.from(servletContextRequest); ComplianceViolation.Listener complianceViolationListener = httpChannel.getComplianceViolationListener(); + MultiPartCompliance compliance = servletContextRequest.getConnectionMetaData().getHttpConfiguration().getMultiPartCompliance(); // Look for an existing future MultiPartFormData.Parts - CompletableFuture futureFormData = MultiPartFormData.from(servletContextRequest, complianceViolationListener, boundary, parser -> + CompletableFuture futureFormData = MultiPartFormData.from(servletContextRequest, compliance, complianceViolationListener, boundary, parser -> { try { diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/MultiPartRawServletTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/MultiPartRawServletTest.java new file mode 100644 index 000000000000..ddbe3b65819e --- /dev/null +++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/MultiPartRawServletTest.java @@ -0,0 +1,243 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.ee10.servlet; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.net.URI; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +import jakarta.servlet.MultipartConfigElement; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; +import org.eclipse.jetty.http.HttpTester; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.tests.multipart.MultiPartExpectations; +import org.eclipse.jetty.tests.multipart.MultiPartFormArgumentsProvider; +import org.eclipse.jetty.tests.multipart.MultiPartRequest; +import org.eclipse.jetty.tests.multipart.MultiPartResults; +import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.MavenPaths; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.component.LifeCycle; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +/** + * Test various raw Multipart Requests against the ee10 servlet implementation + */ +public class MultiPartRawServletTest +{ + private Server server; + private URI serverURI; + + private void startServer(Consumer configureContext) throws Exception + { + Path tempDir = MavenPaths.targetTestDir(MultiPartRawServletTest.class.getSimpleName()); + FS.ensureDirExists(tempDir); + server = new Server(); + + ServerConnector connector = new ServerConnector(server); + connector.setPort(0); + server.addConnector(connector); + + ContextHandlerCollection contexts = new ContextHandlerCollection(); + server.setHandler(contexts); + + ServletContextHandler servletContextHandler = new ServletContextHandler(); + servletContextHandler.setContextPath("/app"); + servletContextHandler.setTempDirectory(tempDir.toFile()); + + configureContext.accept(servletContextHandler); + contexts.addHandler(servletContextHandler); + + server.start(); + serverURI = server.getURI().resolve("/"); + } + + @AfterEach + public void stopServer() + { + LifeCycle.stop(server); + } + + @ParameterizedTest + @ArgumentsSource(MultiPartFormArgumentsProvider.class) + public void testMultiPartFormDataParse(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations) throws Exception + { + startServer((servletContextHandler) -> + { + MultiPartValidationServlet servlet = new MultiPartValidationServlet(formExpectations, defaultCharset); + ServletHolder servletHolder = new ServletHolder(servlet); + MultipartConfigElement config = new MultipartConfigElement(null, 1_500_000, 2_000_000, 3_000_000); + servletHolder.getRegistration().setMultipartConfig(config); + servletContextHandler.addServlet(servletHolder, "/multipart/*"); + }); + + try (Socket client = new Socket(serverURI.getHost(), serverURI.getPort()); + OutputStream output = client.getOutputStream(); + InputStream input = client.getInputStream()) + { + ByteBuffer bodyBuffer = formRequest.asByteBuffer(); + + StringBuilder reqBuilder = new StringBuilder(); + reqBuilder.append("POST /app/multipart/"); + reqBuilder.append(formRequest.getFormName()); + reqBuilder.append(" HTTP/1.1\r\n"); + reqBuilder.append("Host: ").append(serverURI.getAuthority()).append("\r\n"); + AtomicBoolean hasContentTypeHeader = new AtomicBoolean(false); + List droppedHeaders = List.of("host", "content-length", "transfer-encoding"); + formRequest.getHeaders().forEach((name, value) -> + { + String namelower = name.toLowerCase(Locale.ENGLISH); + if (!droppedHeaders.contains(namelower)) + { + if (namelower.equals("content-type")) + hasContentTypeHeader.set(true); + reqBuilder.append(name).append(": ").append(value).append("\r\n"); + } + }); + if (!hasContentTypeHeader.get()) + reqBuilder.append("Content-Type: ").append(formExpectations.getContentType()).append("\r\n"); + reqBuilder.append("Content-Length: ").append(bodyBuffer.remaining()).append("\r\n"); + reqBuilder.append("\r\n"); + + output.write(reqBuilder.toString().getBytes(StandardCharsets.UTF_8)); + output.write(BufferUtil.toArray(bodyBuffer)); + output.flush(); + + HttpTester.Response response = HttpTester.parseResponse(input); + assertThat(response.getStatus(), is(200)); + } + } + + public static class MultiPartValidationServlet extends HttpServlet + { + private final MultiPartExpectations multiPartExpectations; + private final Charset defaultCharset; + + public MultiPartValidationServlet(MultiPartExpectations expectations, Charset defaultCharset) + { + this.multiPartExpectations = expectations; + this.defaultCharset = defaultCharset; + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException + { + try + { + multiPartExpectations.assertParts(mapActualResults(req.getParts()), defaultCharset); + } + catch (Exception e) + { + throw new ServletException("Failed to validate multipart/form-data", e); + } + } + + private MultiPartResults mapActualResults(final Collection parts) + { + return new MultiPartResults() + { + @Override + public int getCount() + { + return parts.size(); + } + + @Override + public List get(String name) + { + List namedParts = new ArrayList<>(); + for (Part part: parts) + { + if (part.getName().equalsIgnoreCase(name)) + { + namedParts.add(new NamedPartResult(part)); + } + } + + return namedParts; + } + }; + } + + private class NamedPartResult implements MultiPartResults.PartResult + { + private final Part namedPart; + + public NamedPartResult(Part part) + { + this.namedPart = part; + } + + @Override + public String getContentType() + { + return namedPart.getContentType(); + } + + @Override + public ByteBuffer asByteBuffer() throws IOException + { + try (InputStream inputStream = namedPart.getInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) + { + IO.copy(inputStream, baos); + return ByteBuffer.wrap(baos.toByteArray()); + } + } + + @Override + public String asString(Charset charset) throws IOException + { + return IO.toString(namedPart.getInputStream(), charset); + } + + @Override + public String getFileName() + { + return namedPart.getSubmittedFileName(); + } + + @Override + public InputStream asInputStream() throws IOException + { + return namedPart.getInputStream(); + } + } + } +} diff --git a/jetty-ee8/jetty-ee8-nested/pom.xml b/jetty-ee8/jetty-ee8-nested/pom.xml index bc6e23d6c9b3..159211eb69ee 100644 --- a/jetty-ee8/jetty-ee8-nested/pom.xml +++ b/jetty-ee8/jetty-ee8-nested/pom.xml @@ -68,6 +68,12 @@ jetty-xml test + + org.eclipse.jetty.tests + jetty-test-multipart + ${project.version} + test + org.eclipse.jetty.toolchain jetty-test-helper diff --git a/jetty-ee9/jetty-ee9-nested/pom.xml b/jetty-ee9/jetty-ee9-nested/pom.xml index ca4e77786137..9249f05091a3 100644 --- a/jetty-ee9/jetty-ee9-nested/pom.xml +++ b/jetty-ee9/jetty-ee9-nested/pom.xml @@ -67,6 +67,12 @@ jetty-xml test + + org.eclipse.jetty.tests + jetty-test-multipart + ${project.version} + test + org.eclipse.jetty.toolchain jetty-test-helper @@ -80,7 +86,7 @@ maven-surefire-plugin @{argLine} ${jetty.surefire.argLine} - --add-reads org.eclipse.jetty.ee9.nested=org.eclipse.jetty.logging + --add-reads org.eclipse.jetty.ee9.nested=org.eclipse.jetty.logging --add-opens org.eclipse.jetty.server/org.eclipse.jetty.server=ALL-UNNAMED --add-reads org.eclipse.jetty.server=org.eclipse.jetty.logging diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPart.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPart.java new file mode 100644 index 000000000000..20085b999232 --- /dev/null +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPart.java @@ -0,0 +1,66 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.ee9.nested; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.List; + +import jakarta.servlet.MultipartConfigElement; +import jakarta.servlet.http.Part; +import org.eclipse.jetty.http.ComplianceViolation; +import org.eclipse.jetty.http.MultiPartCompliance; + +/** + * Generic `multipart/*` interface + */ +class MultiPart +{ + /** + * Create a new parser for `multipart/form-data` content. + * + * @param multiPartCompliance the compliance mode + * @param inputStream the input stream + * @param contentType the Request {@code Content-Type} + * @param config the servlet Multipart configuration + * @param contextTmpDir the temporary directory to use (if config has it unspecified) + * @param maxParts the maximum number of parts allowed + * @return the parser for `multipart/form-data` content + */ + public static MultiPart.Parser newFormDataParser(MultiPartCompliance multiPartCompliance, + InputStream inputStream, + String contentType, + MultipartConfigElement config, + File contextTmpDir, + int maxParts) + { + if (multiPartCompliance == MultiPartCompliance.RFC7578) + return new MultiPartFormInputStream(inputStream, contentType, config, contextTmpDir, maxParts); + else + return new MultiPartInputStreamLegacyParser(multiPartCompliance, inputStream, contentType, config, contextTmpDir, maxParts); + } + + public interface Parser + { + void deleteParts(); + + Part getPart(String name) throws IOException; + + Collection getParts() throws IOException; + + List getNonComplianceWarnings(); + } +} diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartFormInputStream.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartFormInputStream.java index a5d33d12d43d..df32f184dd40 100644 --- a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartFormInputStream.java +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartFormInputStream.java @@ -83,7 +83,7 @@ * } * @see https://tools.ietf.org/html/rfc7578 */ -public class MultiPartFormInputStream +public class MultiPartFormInputStream implements MultiPart.Parser { private enum State { @@ -94,14 +94,12 @@ private enum State DELETED } - record NonCompliance(ComplianceViolation.Mode mode, MultiPartCompliance.Violation violation, String detail) {} - private static final Logger LOG = LoggerFactory.getLogger(MultiPartFormInputStream.class); - private static final QuotedStringTokenizer QUOTED_STRING_TOKENIZER = QuotedStringTokenizer.builder().delimiters(";").ignoreOptionalWhiteSpace().allowEmbeddedQuotes().build(); + private static final QuotedStringTokenizer QUOTED_STRING_TOKENIZER = QuotedStringTokenizer.builder().delimiters(";").ignoreOptionalWhiteSpace().allowEscapeOnlyForQuotes().allowEmbeddedQuotes().build(); private final AutoLock _lock = new AutoLock(); private final MultiMap _parts = new MultiMap<>(); - private final List _nonComplianceWarnings = new ArrayList<>(); + private final List _nonComplianceWarnings = new ArrayList<>(); private final InputStream _in; private final MultipartConfigElement _config; private final File _contextTmpDir; @@ -117,7 +115,8 @@ record NonCompliance(ComplianceViolation.Mode mode, MultiPartCompliance.Violatio /** * @return an EnumSet of non compliances with the RFC that were accepted by this parser */ - public List getNonComplianceWarnings() + @Override + public List getNonComplianceWarnings() { return _nonComplianceWarnings; } @@ -487,6 +486,7 @@ private void delete() * @return the parts * @throws IOException if unable to get the parts */ + @Override public Collection getParts() throws IOException { parse(); @@ -501,6 +501,7 @@ public Collection getParts() throws IOException * @return the parts * @throws IOException if unable to get the part */ + @Override public Part getPart(String name) throws IOException { parse(); @@ -703,7 +704,7 @@ else if (key.equalsIgnoreCase("content-type")) if (key.equalsIgnoreCase("content-transfer-encoding")) { if (!"8bit".equalsIgnoreCase(value) && !"binary".equalsIgnoreCase(value)) - _nonComplianceWarnings.add(new NonCompliance(MultiPartCompliance.RFC7578, MultiPartCompliance.Violation.CONTENT_TRANSFER_ENCODING, value)); + _nonComplianceWarnings.add(new ComplianceViolation.Event(MultiPartCompliance.RFC7578, MultiPartCompliance.Violation.CONTENT_TRANSFER_ENCODING, value)); } } @@ -724,8 +725,6 @@ public boolean headerComplete() throw new IOException("Missing content-disposition"); } - QUOTED_STRING_TOKENIZER.tokenize(contentDisposition); - String name = null; String filename = null; for (Iterator i = QUOTED_STRING_TOKENIZER.tokenize(contentDisposition); i.hasNext();) diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartInputStreamLegacyParser.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartInputStreamLegacyParser.java new file mode 100644 index 000000000000..f26ac5a62175 --- /dev/null +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/MultiPartInputStreamLegacyParser.java @@ -0,0 +1,1145 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.ee9.nested; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + +import jakarta.servlet.MultipartConfigElement; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.Part; +import org.eclipse.jetty.http.ComplianceViolation; +import org.eclipse.jetty.http.MultiPartCompliance; +import org.eclipse.jetty.util.ByteArrayOutputStream2; +import org.eclipse.jetty.util.ExceptionUtil; +import org.eclipse.jetty.util.LazyList; +import org.eclipse.jetty.util.MultiMap; +import org.eclipse.jetty.util.QuotedStringTokenizer; +import org.eclipse.jetty.util.TypeUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * MultiPartInputStreamLegacyParser. + * + *

+ * Handle a MultiPart Mime input stream, breaking it up on the boundary into files and strings. + *

+ * + *

+ * Non Compliance warnings are documented by the method {@link #getNonComplianceWarnings()} + *

+ * + * @deprecated Replaced by {@link MultiPartFormInputStream}. + * This code is slower and subject to more bugs than its replacement {@link MultiPartFormInputStream}. However, + * this class accepts formats non-compliant the RFC that the new {@link MultiPartFormInputStream} does not accept. + */ +@Deprecated +class MultiPartInputStreamLegacyParser implements MultiPart.Parser +{ + private static final Logger LOG = LoggerFactory.getLogger(MultiPartInputStreamLegacyParser.class); + public static final MultipartConfigElement __DEFAULT_MULTIPART_CONFIG = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); + public static final MultiMap EMPTY_MAP = new MultiMap<>(Collections.emptyMap()); + private final int _maxParts; + private int _numParts; + protected InputStream _in; + protected MultipartConfigElement _config; + protected String _contentType; + protected MultiMap _parts; + protected Exception _err; + protected File _tmpDir; + protected File _contextTmpDir; + protected boolean _writeFilesWithFilenames; + protected boolean _parsed; + + private final MultiPartCompliance _multiPartCompliance; + private final List nonComplianceWarnings = new ArrayList<>(); + + /** + * @return an EnumSet of non compliances with the RFC that were accepted by this parser + */ + @Override + public List getNonComplianceWarnings() + { + return nonComplianceWarnings; + } + + public class MultiPart implements Part + { + protected String _name; + protected String _filename; + protected File _file; + protected OutputStream _out; + protected ByteArrayOutputStream2 _bout; + protected String _contentType; + protected MultiMap _headers; + protected long _size = 0; + protected boolean _temporary = true; + + public MultiPart(String name, String filename) + throws IOException + { + _name = name; + _filename = filename; + } + + @Override + public String toString() + { + return String.format("Part{n=%s,fn=%s,ct=%s,s=%d,t=%b,f=%s}", _name, _filename, _contentType, _size, _temporary, _file); + } + + protected void setContentType(String contentType) + { + _contentType = contentType; + } + + protected void open() + throws IOException + { + //We will either be writing to a file, if it has a filename on the content-disposition + //and otherwise a byte-array-input-stream, OR if we exceed the getFileSizeThreshold, we + //will need to change to write to a file. + if (isWriteFilesWithFilenames() && _filename != null && _filename.trim().length() > 0) + { + createFile(); + } + else + { + // Write to a buffer in memory until we discover we've exceeded the + // MultipartConfig fileSizeThreshold + _out = _bout = new ByteArrayOutputStream2(); + } + } + + protected void close() + throws IOException + { + _out.close(); + } + + protected void write(int b) + throws IOException + { + if (MultiPartInputStreamLegacyParser.this._config.getMaxFileSize() > 0 && _size + 1 > MultiPartInputStreamLegacyParser.this._config.getMaxFileSize()) + throw new IllegalStateException("Multipart Mime part " + _name + " exceeds max filesize"); + + if (MultiPartInputStreamLegacyParser.this._config.getFileSizeThreshold() > 0 && _size + 1 > MultiPartInputStreamLegacyParser.this._config.getFileSizeThreshold() && _file == null) + createFile(); + + _out.write(b); + _size++; + } + + protected void write(byte[] bytes, int offset, int length) + throws IOException + { + if (MultiPartInputStreamLegacyParser.this._config.getMaxFileSize() > 0 && _size + length > MultiPartInputStreamLegacyParser.this._config.getMaxFileSize()) + throw new IllegalStateException("Multipart Mime part " + _name + " exceeds max filesize"); + + if (MultiPartInputStreamLegacyParser.this._config.getFileSizeThreshold() > 0 && _size + length > MultiPartInputStreamLegacyParser.this._config.getFileSizeThreshold() && _file == null) + createFile(); + + _out.write(bytes, offset, length); + _size += length; + } + + protected void createFile() + throws IOException + { + Path parent = MultiPartInputStreamLegacyParser.this._tmpDir.toPath(); + Path tempFile = Files.createTempFile(parent, "MultiPart", ""); + _file = tempFile.toFile(); + + OutputStream fos = Files.newOutputStream(tempFile, StandardOpenOption.WRITE); + BufferedOutputStream bos = new BufferedOutputStream(fos); + + if (_size > 0 && _out != null) + { + //already written some bytes, so need to copy them into the file + _out.flush(); + _bout.writeTo(bos); + _out.close(); + } + _bout = null; + _out = bos; + } + + protected void setHeaders(MultiMap headers) + { + _headers = headers; + } + + /** + * @see Part#getContentType() + */ + @Override + public String getContentType() + { + return _contentType; + } + + /** + * @see Part#getHeader(String) + */ + @Override + public String getHeader(String name) + { + if (name == null) + return null; + return _headers.getValue(name.toLowerCase(Locale.ENGLISH), 0); + } + + /** + * @see Part#getHeaderNames() + */ + @Override + public Collection getHeaderNames() + { + return _headers.keySet(); + } + + /** + * @see Part#getHeaders(String) + */ + @Override + public Collection getHeaders(String name) + { + return _headers.getValues(name); + } + + /** + * @see Part#getInputStream() + */ + @Override + public InputStream getInputStream() throws IOException + { + if (_file != null) + { + //written to a file, whether temporary or not + return new BufferedInputStream(new FileInputStream(_file)); + } + else + { + //part content is in memory + return new ByteArrayInputStream(_bout.getBuf(), 0, _bout.size()); + } + } + + /** + * @see Part#getSubmittedFileName() + */ + @Override + public String getSubmittedFileName() + { + return getContentDispositionFilename(); + } + + public byte[] getBytes() + { + if (_bout != null) + return _bout.toByteArray(); + return null; + } + + /** + * @see Part#getName() + */ + @Override + public String getName() + { + return _name; + } + + /** + * @see Part#getSize() + */ + @Override + public long getSize() + { + return _size; + } + + /** + * @see Part#write(String) + */ + @Override + public void write(String fileName) throws IOException + { + if (_file == null) + { + _temporary = false; + + //part data is only in the ByteArrayOutputStream and never been written to disk + _file = new File(_tmpDir, fileName); + + BufferedOutputStream bos = null; + try + { + bos = new BufferedOutputStream(new FileOutputStream(_file)); + _bout.writeTo(bos); + bos.flush(); + } + finally + { + if (bos != null) + bos.close(); + _bout = null; + } + } + else + { + //the part data is already written to a temporary file, just rename it + _temporary = false; + + Path src = _file.toPath(); + Path target = src.resolveSibling(fileName); + Files.move(src, target, StandardCopyOption.REPLACE_EXISTING); + _file = target.toFile(); + } + } + + /** + * Remove the file, whether or not Part.write() was called on it + * (ie no longer temporary) + * + * @see Part#delete() + */ + @Override + public void delete() throws IOException + { + if (_file != null && _file.exists()) + _file.delete(); + } + + /** + * Only remove tmp files. + * + * @throws IOException if unable to delete the file + */ + public void cleanUp() throws IOException + { + if (_temporary && _file != null && _file.exists()) + _file.delete(); + } + + /** + * Get the file + * + * @return the file, if any, the data has been written to. + */ + public File getFile() + { + return _file; + } + + /** + * Get the filename from the content-disposition. + * + * @return null or the filename + */ + public String getContentDispositionFilename() + { + return _filename; + } + } + + /** + * @param in Request input stream + * @param contentType Content-Type header + * @param config MultipartConfigElement + * @param contextTmpDir javax.servlet.context.tempdir + * @param maxParts the maximum number of parts that can be parsed from the multipart content (0 for no parts allowed, -1 for unlimited parts). + */ + public MultiPartInputStreamLegacyParser(MultiPartCompliance multiPartCompliance, InputStream in, String contentType, MultipartConfigElement config, File contextTmpDir, int maxParts) + { + _multiPartCompliance = multiPartCompliance; + _contentType = contentType; + _config = config; + _contextTmpDir = contextTmpDir; + _maxParts = maxParts; + if (_contextTmpDir == null) + _contextTmpDir = new File(System.getProperty("java.io.tmpdir")); + + if (_config == null) + _config = new MultipartConfigElement(_contextTmpDir.getAbsolutePath()); + + if (in instanceof ServletInputStream) + { + if (((ServletInputStream)in).isFinished()) + { + _parts = EMPTY_MAP; + _parsed = true; + return; + } + } + _in = new ReadLineInputStream(in); + } + + /** + * Get the already parsed parts. + * + * @return the parts that were parsed + */ + public Collection getParsedParts() + { + if (_parts == null) + return Collections.emptyList(); + + Collection> values = _parts.values(); + List parts = new ArrayList<>(); + for (List o : values) + { + List asList = LazyList.getList(o, false); + parts.addAll(asList); + } + return parts; + } + + /** + * Delete any tmp storage for parts, and clear out the parts list. + */ + @Override + public void deleteParts() + { + if (!_parsed) + return; + + Throwable err = null; + Collection parts = getParsedParts(); + for (Part p : parts) + { + try + { + ((MultiPart)p).cleanUp(); + } + catch (Exception e) + { + err = ExceptionUtil.combine(err, e); + } + } + _parts.clear(); + ExceptionUtil.ifExceptionThrowUnchecked(err); + } + + /** + * Parse, if necessary, the multipart data and return the list of Parts. + * + * @return the parts + * @throws IOException if unable to get the parts + */ + @Override + public Collection getParts() + throws IOException + { + if (!_parsed) + parse(); + throwIfError(); + + Collection> values = _parts.values(); + List parts = new ArrayList<>(); + for (List o : values) + { + List asList = LazyList.getList(o, false); + parts.addAll(asList); + } + return parts; + } + + /** + * Get the named Part. + * + * @param name the part name + * @return the parts + * @throws IOException if unable to get the part + */ + @Override + public Part getPart(String name) + throws IOException + { + if (!_parsed) + parse(); + throwIfError(); + return _parts.getValue(name, 0); + } + + /** + * Throws an exception if one has been latched. + * + * @throws IOException the exception (if present) + */ + protected void throwIfError() + throws IOException + { + if (_err != null) + { + if (_err instanceof IOException) + throw (IOException)_err; + if (_err instanceof IllegalStateException) + throw (IllegalStateException)_err; + throw new IllegalStateException(_err); + } + } + + /** + * Parse, if necessary, the multipart stream. + */ + protected void parse() + { + //have we already parsed the input? + if (_parsed) + return; + _parsed = true; + + //initialize + long total = 0; //keep running total of size of bytes read from input and throw an exception if exceeds MultipartConfigElement._maxRequestSize + _parts = new MultiMap<>(); + + //if its not a multipart request, don't parse it + if (_contentType == null || !_contentType.startsWith("multipart/form-data")) + return; + + try + { + //sort out the location to which to write the files + + if (_config.getLocation() == null) + _tmpDir = _contextTmpDir; + else if ("".equals(_config.getLocation())) + _tmpDir = _contextTmpDir; + else + { + File f = new File(_config.getLocation()); + if (f.isAbsolute()) + _tmpDir = f; + else + _tmpDir = new File(_contextTmpDir, _config.getLocation()); + } + + if (!_tmpDir.exists()) + _tmpDir.mkdirs(); + + String contentTypeBoundary = ""; + int bstart = _contentType.indexOf("boundary="); + if (bstart >= 0) + { + int bend = _contentType.indexOf(";", bstart); + bend = (bend < 0 ? _contentType.length() : bend); + contentTypeBoundary = unquote(value(_contentType.substring(bstart, bend)).trim()); + } + + String boundary = "--" + contentTypeBoundary; + String lastBoundary = boundary + "--"; + byte[] byteBoundary = lastBoundary.getBytes(StandardCharsets.ISO_8859_1); + + // Get first boundary + String line = null; + try + { + line = ((ReadLineInputStream)_in).readLine(); + } + catch (IOException e) + { + LOG.warn("Badly formatted multipart request"); + throw e; + } + + if (line == null) + throw new IOException("Missing content for multipart request"); + + boolean badFormatLogged = false; + + String untrimmed = line; + line = line.trim(); + while (line != null && !line.equals(boundary) && !line.equals(lastBoundary)) + { + if (!badFormatLogged) + { + LOG.warn("Badly formatted multipart request"); + badFormatLogged = true; + } + line = ((ReadLineInputStream)_in).readLine(); + untrimmed = line; + if (line != null) + line = line.trim(); + } + + if (line == null || line.length() == 0) + throw new IOException("Missing initial multi part boundary"); + + // Empty multipart. + if (line.equals(lastBoundary)) + return; + + // check compliance of preamble + // this will show up as whitespace before the boundary that exists after the preamble + if (Character.isWhitespace(untrimmed.charAt(0))) + nonComplianceWarnings.add(new ComplianceViolation.Event(MultiPartCompliance.LEGACY, + MultiPartCompliance.Violation.WHITESPACE_BEFORE_BOUNDARY, + String.format("0x%02x", untrimmed.charAt(0)))); + + // Read each part + boolean lastPart = false; + + outer: + while (!lastPart) + { + String contentDisposition = null; + String contentType = null; + String contentTransferEncoding = null; + + MultiMap headers = new MultiMap<>(); + while (true) + { + line = ((ReadLineInputStream)_in).readLine(); + + //No more input + if (line == null) + break outer; + + //end of headers: + if ("".equals(line)) + break; + + total += line.length(); + if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize()) + throw new IllegalStateException("Request exceeds maxRequestSize (" + _config.getMaxRequestSize() + ")"); + + //get content-disposition and content-type + int c = line.indexOf(':'); + if (c > 0) + { + String key = line.substring(0, c).trim().toLowerCase(Locale.ENGLISH); + String value = line.substring(c + 1).trim(); + headers.put(key, value); + if (key.equalsIgnoreCase("content-disposition")) + contentDisposition = value; + if (key.equalsIgnoreCase("content-type")) + contentType = value; + if (key.equals("content-transfer-encoding")) + contentTransferEncoding = value; + } + } + + // Extract content-disposition + boolean formData = false; + if (contentDisposition == null) + { + throw new IOException("Missing content-disposition"); + } + + QuotedStringTokenizer tok = QuotedStringTokenizer.builder() + .legacy() + .delimiters(";") + .returnQuotes() + .build(); + String name = null; + String filename = null; + Iterator itok = tok.tokenize(contentDisposition); + while (itok.hasNext()) + { + String t = itok.next().trim(); + String tl = t.toLowerCase(Locale.ENGLISH); + if (tl.startsWith("form-data")) + formData = true; + else if (tl.startsWith("name=")) + name = value(t); + else if (tl.startsWith("filename=")) + filename = filenameValue(t); + } + + // Check disposition + if (!formData) + { + continue; + } + //It is valid for reset and submit buttons to have an empty name. + //If no name is supplied, the browser skips sending the info for that field. + //However, if you supply the empty string as the name, the browser sends the + //field, with name as the empty string. So, only continue this loop if we + //have not yet seen a name field. + if (name == null) + { + continue; + } + + // Check if we can create a new part. + _numParts++; + if (_maxParts >= 0 && _numParts > _maxParts) + throw new IllegalStateException(String.format("Form with too many parts [%d > %d]", _numParts, _maxParts)); + + //Have a new Part + MultiPart part = new MultiPart(name, filename); + part.setHeaders(headers); + part.setContentType(contentType); + _parts.add(name, part); + part.open(); + + InputStream partInput = null; + if ("base64".equalsIgnoreCase(contentTransferEncoding)) + { + nonComplianceWarnings.add(new ComplianceViolation.Event(MultiPartCompliance.LEGACY, + MultiPartCompliance.Violation.BASE64_TRANSFER_ENCODING, contentTransferEncoding)); + if (_multiPartCompliance.allows(MultiPartCompliance.Violation.BASE64_TRANSFER_ENCODING)) + partInput = new Base64InputStream((ReadLineInputStream)_in); + else + partInput = _in; + } + else if ("quoted-printable".equalsIgnoreCase(contentTransferEncoding)) + { + nonComplianceWarnings.add(new ComplianceViolation.Event(MultiPartCompliance.LEGACY, + MultiPartCompliance.Violation.QUOTED_PRINTABLE_TRANSFER_ENCODING, contentTransferEncoding)); + partInput = new FilterInputStream(_in) + { + @Override + public int read() throws IOException + { + int c = in.read(); + if (c >= 0 && c == '=') + { + int hi = in.read(); + int lo = in.read(); + if (hi < 0 || lo < 0) + { + throw new IOException("Unexpected end to quoted-printable byte"); + } + char[] chars = new char[]{(char)hi, (char)lo}; + c = Integer.parseInt(new String(chars), 16); + } + return c; + } + }; + } + else + partInput = _in; + + try + { + int state = -2; + int c; + boolean cr = false; + boolean lf = false; + + // loop for all lines + while (true) + { + int b = 0; + while ((c = (state != -2) ? state : partInput.read()) != -1) + { + total++; + if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize()) + throw new IllegalStateException("Request exceeds maxRequestSize (" + _config.getMaxRequestSize() + ")"); + + state = -2; + + // look for CR and/or LF + if (c == 13 || c == 10) + { + if (c == 13) + { + partInput.mark(1); + int tmp = partInput.read(); + if (tmp != 10) + partInput.reset(); + else + state = tmp; + } + break; + } + + // Look for boundary + if (b >= 0 && b < byteBoundary.length && c == byteBoundary[b]) + { + b++; + } + else + { + // Got a character not part of the boundary, so we don't have the boundary marker. + // Write out as many chars as we matched, then the char we're looking at. + if (cr) + part.write(13); + + if (lf) + part.write(10); + + cr = lf = false; + if (b > 0) + part.write(byteBoundary, 0, b); + + b = -1; + part.write(c); + } + } + + // Check for incomplete boundary match, writing out the chars we matched along the way + if ((b > 0 && b < byteBoundary.length - 2) || (b == byteBoundary.length - 1)) + { + if (cr) + part.write(13); + + if (lf) + part.write(10); + + cr = lf = false; + part.write(byteBoundary, 0, b); + b = -1; + } + + // Boundary match. If we've run out of input or we matched the entire final boundary marker, then this is the last part. + if (b > 0 || c == -1) + { + if (b == byteBoundary.length) + lastPart = true; + if (state == 10) + state = -2; + break; + } + + // handle CR LF + if (cr) + part.write(13); + + if (lf) + part.write(10); + + cr = (c == 13); + lf = (c == 10 || state == 10); + if (state == 10) + state = -2; + } + } + finally + { + part.close(); + } + } + if (lastPart) + { + while (line != null) + { + line = ((ReadLineInputStream)_in).readLine(); + } + + EnumSet term = ((ReadLineInputStream)_in).getLineTerminations(); + + if (term.contains(ReadLineInputStream.Termination.CR)) + nonComplianceWarnings.add(new ComplianceViolation.Event(MultiPartCompliance.LEGACY, + MultiPartCompliance.Violation.CR_LINE_TERMINATION, "0x13")); + if (term.contains(ReadLineInputStream.Termination.LF)) + nonComplianceWarnings.add(new ComplianceViolation.Event(MultiPartCompliance.LEGACY, + MultiPartCompliance.Violation.LF_LINE_TERMINATION, "0x10")); + } + else + throw new IOException("Incomplete parts"); + } + catch (Exception e) + { + _err = e; + } + } + + /** + * @deprecated no replacement offered. + */ + @Deprecated + public void setDeleteOnExit(boolean deleteOnExit) + { + // does nothing + } + + public void setWriteFilesWithFilenames(boolean writeFilesWithFilenames) + { + _writeFilesWithFilenames = writeFilesWithFilenames; + } + + public boolean isWriteFilesWithFilenames() + { + return _writeFilesWithFilenames; + } + + /** + * @deprecated no replacement offered. + */ + @Deprecated + public boolean isDeleteOnExit() + { + return false; + } + + private String value(String nameEqualsValue) + { + int idx = nameEqualsValue.indexOf('='); + String value = nameEqualsValue.substring(idx + 1).trim(); + return unquoteOnly(value); + } + + private String filenameValue(String nameEqualsValue) + { + int idx = nameEqualsValue.indexOf('='); + String value = nameEqualsValue.substring(idx + 1).trim(); + + if (value.matches(".??[a-z,A-Z]\\:\\\\[^\\\\].*")) + { + //incorrectly escaped IE filenames that have the whole path + //we just strip any leading & trailing quotes and leave it as is + char first = value.charAt(0); + if (first == '"' || first == '\'') + value = value.substring(1); + char last = value.charAt(value.length() - 1); + if (last == '"' || last == '\'') + value = value.substring(0, value.length() - 1); + + return value; + } + else + //unquote the string, but allow any backslashes that don't + //form a valid escape sequence to remain as many browsers + //even on *nix systems will not escape a filename containing + //backslashes + return unquoteOnly(value, true); + } + + // TODO: consider switching to Base64.getMimeDecoder().wrap(InputStream) + private static class Base64InputStream extends InputStream + { + private static final byte[] CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + ReadLineInputStream _in; + String _line; + byte[] _buffer; + int _pos; + int _marklimit; + int _markpos; + Base64.Decoder base64Decoder = Base64.getMimeDecoder(); + + public Base64InputStream(ReadLineInputStream rlis) + { + _in = rlis; + } + + @Override + public int read() throws IOException + { + if (_buffer == null || _pos >= _buffer.length) + { + _markpos = 0; + _line = _in.readLine(); + if (_line == null) + return -1; //nothing left + if (_line.startsWith("--")) + _buffer = ("\r\n" + _line + "\r\n").getBytes(StandardCharsets.UTF_8); //boundary marking end of part + else if (_line.isEmpty()) + _buffer = CRLF; //blank line + else + { + ByteArrayOutputStream baos = new ByteArrayOutputStream((4 * _line.length() / 3) + 2); + baos.write(base64Decoder.decode(_line)); + _buffer = baos.toByteArray(); + } + + _pos = 0; + } + + return _buffer[_pos++] & 0xFF; + } + + @Override + public synchronized void mark(int readlimit) + { + _marklimit = readlimit; + _markpos = _pos; + } + + @Override + public synchronized void reset() throws IOException + { + if (_markpos < 0) + throw new IOException("Resetting to invalid mark"); + _pos = _markpos; + } + } + + private static String unquoteOnly(String s) + { + return unquoteOnly(s, false); + } + + /** + * Unquote a string, NOT converting unicode sequences + * + * @param s The string to unquote. + * @param lenient if true, will leave in backslashes that aren't valid escapes + * @return quoted string + */ + private static String unquoteOnly(String s, boolean lenient) + { + if (s == null) + return null; + if (s.length() < 2) + return s; + + char first = s.charAt(0); + char last = s.charAt(s.length() - 1); + if (first != last || (first != '"' && first != '\'')) + return s; + + StringBuilder b = new StringBuilder(s.length() - 2); + boolean escape = false; + for (int i = 1; i < s.length() - 1; i++) + { + char c = s.charAt(i); + + if (escape) + { + escape = false; + if (lenient && !isValidEscaping(c)) + { + b.append('\\'); + } + b.append(c); + } + else if (c == '\\') + { + escape = true; + } + else + { + b.append(c); + } + } + + return b.toString(); + } + + private static String unquote(String s) + { + return unquote(s, false); + } + + /** + * Unquote a string. + * + * @param s The string to unquote. + * @param lenient true if unquoting should be lenient to escaped content, leaving some alone, false if string unescaping + * @return quoted string + */ + private static String unquote(String s, boolean lenient) + { + if (s == null) + return null; + if (s.length() < 2) + return s; + + char first = s.charAt(0); + char last = s.charAt(s.length() - 1); + if (first != last || (first != '"' && first != '\'')) + return s; + + StringBuilder b = new StringBuilder(s.length() - 2); + boolean escape = false; + for (int i = 1; i < s.length() - 1; i++) + { + char c = s.charAt(i); + + if (escape) + { + escape = false; + switch (c) + { + case 'n': + b.append('\n'); + break; + case 'r': + b.append('\r'); + break; + case 't': + b.append('\t'); + break; + case 'f': + b.append('\f'); + break; + case 'b': + b.append('\b'); + break; + case '\\': + b.append('\\'); + break; + case '/': + b.append('/'); + break; + case '"': + b.append('"'); + break; + case 'u': + b.append((char)( + (TypeUtil.convertHexDigit((byte)s.charAt(i++)) << 24) + + (TypeUtil.convertHexDigit((byte)s.charAt(i++)) << 16) + + (TypeUtil.convertHexDigit((byte)s.charAt(i++)) << 8) + + (TypeUtil.convertHexDigit((byte)s.charAt(i++))) + ) + ); + break; + default: + if (lenient && !isValidEscaping(c)) + { + b.append('\\'); + } + b.append(c); + } + } + else if (c == '\\') + { + escape = true; + } + else + { + b.append(c); + } + } + + return b.toString(); + } + + /** + * Check that char c (which is preceded by a backslash) is a valid + * escape sequence. + */ + private static boolean isValidEscaping(char c) + { + return ((c == 'n') || (c == 'r') || (c == 't') || + (c == 'f') || (c == 'b') || (c == '\\') || + (c == '/') || (c == '"') || (c == 'u')); + } +} diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ReadLineInputStream.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ReadLineInputStream.java new file mode 100644 index 000000000000..34404f6c21ce --- /dev/null +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ReadLineInputStream.java @@ -0,0 +1,161 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.ee9.nested; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.EnumSet; + +/** + * ReadLineInputStream + * + * Read from an input stream, accepting CR/LF, LF or just CR. + */ +@Deprecated(forRemoval = true) +class ReadLineInputStream extends BufferedInputStream +{ + boolean _seenCRLF; + boolean _skipLF; + private EnumSet _lineTerminations = EnumSet.noneOf(Termination.class); + + public EnumSet getLineTerminations() + { + return _lineTerminations; + } + + public enum Termination + { + CRLF, + LF, + CR, + EOF + } + + public ReadLineInputStream(InputStream in) + { + super(in); + } + + public ReadLineInputStream(InputStream in, int size) + { + super(in, size); + } + + public String readLine() throws IOException + { + mark(buf.length); + + while (true) + { + int b = super.read(); + + if (markpos < 0) + throw new IOException("Buffer size exceeded: no line terminator"); + + if (_skipLF && b != '\n') + _lineTerminations.add(Termination.CR); + + if (b == -1) + { + int m = markpos; + markpos = -1; + if (pos > m) + { + _lineTerminations.add(Termination.EOF); + return new String(buf, m, pos - m, StandardCharsets.UTF_8); + } + return null; + } + + if (b == '\r') + { + int p = pos; + + // if we have seen CRLF before, hungrily consume LF + if (_seenCRLF && pos < count) + { + if (buf[pos] == '\n') + { + _lineTerminations.add(Termination.CRLF); + pos += 1; + } + else + { + _lineTerminations.add(Termination.CR); + } + } + else + _skipLF = true; + + int m = markpos; + markpos = -1; + return new String(buf, m, p - m - 1, StandardCharsets.UTF_8); + } + + if (b == '\n') + { + if (_skipLF) + { + _skipLF = false; + _seenCRLF = true; + markpos++; + _lineTerminations.add(Termination.CRLF); + continue; + } + int m = markpos; + markpos = -1; + _lineTerminations.add(Termination.LF); + return new String(buf, m, pos - m - 1, StandardCharsets.UTF_8); + } + } + } + + @Override + public synchronized int read() throws IOException + { + int b = super.read(); + if (_skipLF) + { + _skipLF = false; + if (_seenCRLF && b == '\n') + b = super.read(); + } + return b; + } + + @Override + public synchronized int read(byte[] buf, int off, int len) throws IOException + { + if (_skipLF && len > 0) + { + _skipLF = false; + if (_seenCRLF) + { + int b = super.read(); + if (b == -1) + return -1; + + if (b != '\n') + { + buf[off] = (byte)(0xff & b); + return 1 + super.read(buf, off + 1, len - 1); + } + } + } + + return super.read(buf, off, len); + } +} diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/Request.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/Request.java index 62b53a499741..b5f916b0fb78 100644 --- a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/Request.java +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/Request.java @@ -78,6 +78,7 @@ import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.MetaData; import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.http.MultiPartCompliance; import org.eclipse.jetty.http.SetCookieParser; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.RuntimeIOException; @@ -198,7 +199,7 @@ public static Request getBaseRequest(ServletRequest request) private Charset _queryEncoding; private UserIdentityScope _scope; private long _timeStamp; - private MultiPartFormInputStream _multiParts; //if the request is a multi-part mime + private MultiPart.Parser _multiParts; // parser for multipart/form-data request content private AsyncContextState _async; private String _lastPathInContext; private ContextHandler.APIContext _lastContext; @@ -1914,7 +1915,9 @@ private Collection getParts(MultiMap params) throws IOException maxFormKeys = lookupServerAttribute(ContextHandler.MAX_FORM_KEYS_KEY, maxFormKeys); } - _multiParts = newMultiParts(config, maxFormKeys); + MultiPartCompliance multiPartCompliance = getHttpChannel().getHttpConfiguration().getMultiPartCompliance(); + + _multiParts = newMultiParts(multiPartCompliance, config, maxFormKeys); Collection parts = _multiParts.getParts(); reportComplianceViolations(); @@ -1985,15 +1988,15 @@ else if (getCharacterEncoding() != null) private void reportComplianceViolations() { ComplianceViolation.Listener complianceViolationListener = org.eclipse.jetty.server.HttpChannel.from(getCoreRequest()).getComplianceViolationListener(); - List nonComplianceWarnings = _multiParts.getNonComplianceWarnings(); - for (MultiPartFormInputStream.NonCompliance nc : nonComplianceWarnings) - complianceViolationListener.onComplianceViolation(new ComplianceViolation.Event(nc.mode(), nc.violation(), nc.detail())); + List nonComplianceWarnings = _multiParts.getNonComplianceWarnings(); + for (ComplianceViolation.Event nc : nonComplianceWarnings) + complianceViolationListener.onComplianceViolation(new ComplianceViolation.Event(nc.mode(), nc.violation(), nc.details())); } - private MultiPartFormInputStream newMultiParts(MultipartConfigElement config, int maxParts) throws IOException + private MultiPart.Parser newMultiParts(MultiPartCompliance multiPartCompliance, MultipartConfigElement config, int maxParts) throws IOException { - return new MultiPartFormInputStream(getInputStream(), getContentType(), config, - (_context != null ? (File)_context.getAttribute(ServletContext.TEMPDIR) : null), maxParts); + File contextTmpDir = (_context != null ? (File)_context.getAttribute(ServletContext.TEMPDIR) : null); + return MultiPart.newFormDataParser(multiPartCompliance, getInputStream(), getContentType(), config, contextTmpDir, maxParts); } @Override diff --git a/jetty-ee9/jetty-ee9-nested/src/test/java/org/eclipse/jetty/ee9/nested/MultiPartParserTest.java b/jetty-ee9/jetty-ee9-nested/src/test/java/org/eclipse/jetty/ee9/nested/MultiPartParserTest.java new file mode 100644 index 000000000000..df57fb7fa95a --- /dev/null +++ b/jetty-ee9/jetty-ee9-nested/src/test/java/org/eclipse/jetty/ee9/nested/MultiPartParserTest.java @@ -0,0 +1,173 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.ee9.nested; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import jakarta.servlet.MultipartConfigElement; +import jakarta.servlet.http.Part; +import org.eclipse.jetty.http.MultiPartCompliance; +import org.eclipse.jetty.tests.multipart.MultiPartExpectations; +import org.eclipse.jetty.tests.multipart.MultiPartFormArgumentsProvider; +import org.eclipse.jetty.tests.multipart.MultiPartRequest; +import org.eclipse.jetty.tests.multipart.MultiPartResults; +import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.MavenPaths; +import org.eclipse.jetty.util.IO; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import static org.junit.jupiter.api.Assumptions.assumeFalse; + +public class MultiPartParserTest +{ + private static final int MAX_FILE_SIZE = 1_500_000; + private static final int MAX_REQUEST_SIZE = 2_000_000; + private static final int FILE_SIZE_THRESHOLD = 2_500_000; + private static final int MAX_PARTS = 1_000; + private static File tempDir; + + @BeforeAll + public static void initTempDir() + { + Path tempPath = MavenPaths.targetTestDir(MultiPartParserTest.class.getSimpleName() + "-temp"); + FS.ensureDirExists(tempPath); + tempDir = tempPath.toFile(); + } + + @ParameterizedTest + @ArgumentsSource(MultiPartFormArgumentsProvider.class) + public void testMultiPartFormDataParserRFC7578(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations) throws Exception + { + testMultiPartFormDataParser(formRequest, defaultCharset, formExpectations, MultiPartCompliance.RFC7578); + } + + @ParameterizedTest + @ArgumentsSource(MultiPartFormArgumentsProvider.class) + public void testMultiPartFormDataParserLegacyDefault(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations) throws Exception + { + testMultiPartFormDataParser(formRequest, defaultCharset, formExpectations, MultiPartCompliance.LEGACY); + } + + @ParameterizedTest + @ArgumentsSource(MultiPartFormArgumentsProvider.class) + public void testMultiPartFormDataParserLegacyAllowBase64(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations) throws Exception + { + MultiPartCompliance legacyAllowBase64 = MultiPartCompliance.from("LEGACY_BASE64,BASE64_TRANSFER_ENCODING"); + + // Handle different sha1sum due to base64 auto decoding. + if (formRequest.getFormName().equals("multipart-base64.raw")) + formExpectations.setPartSha1Sum("png", "131e2fee6d4857f921b54c77f4231af52ad6bd7a"); + + assumeFalse(formRequest.getFormName().equals("multipart-base64-long.raw"), "Super long line BASE64 encoding not supported by LEGACY parser"); + + testMultiPartFormDataParser(formRequest, defaultCharset, formExpectations, legacyAllowBase64); + } + + private void testMultiPartFormDataParser(MultiPartRequest formRequest, Charset defaultCharset, MultiPartExpectations formExpectations, MultiPartCompliance multiPartCompliance) throws Exception + { + String contentType = formExpectations.getContentType(); + MultipartConfigElement config = new MultipartConfigElement(tempDir.toString(), MAX_FILE_SIZE, MAX_REQUEST_SIZE, FILE_SIZE_THRESHOLD); + File contextTmpDir = tempDir; + int maxParts = MAX_PARTS; + + try (InputStream inputStream = formRequest.asInputStream()) + { + MultiPart.Parser multipartParser = MultiPart.newFormDataParser(multiPartCompliance, inputStream, contentType, config, contextTmpDir, maxParts); + formExpectations.assertParts(mapActualResults(multipartParser.getParts()), defaultCharset); + } + } + + private MultiPartResults mapActualResults(Collection parts) + { + return new MultiPartResults() + { + @Override + public int getCount() + { + return parts.size(); + } + + @Override + public List get(String name) + { + List namedParts = new ArrayList<>(); + for (Part part: parts) + { + if (part.getName().equalsIgnoreCase(name)) + { + namedParts.add(new NamedPartResult(part)); + } + } + + return namedParts; + } + }; + } + + private class NamedPartResult implements MultiPartResults.PartResult + { + private final Part namedPart; + + public NamedPartResult(Part part) + { + this.namedPart = part; + } + + @Override + public String getContentType() + { + return namedPart.getContentType(); + } + + @Override + public ByteBuffer asByteBuffer() throws IOException + { + try (InputStream inputStream = namedPart.getInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) + { + IO.copy(inputStream, baos); + return ByteBuffer.wrap(baos.toByteArray()); + } + } + + @Override + public String asString(Charset charset) throws IOException + { + return IO.toString(namedPart.getInputStream(), charset); + } + + @Override + public String getFileName() + { + return namedPart.getSubmittedFileName(); + } + + @Override + public InputStream asInputStream() throws IOException + { + return namedPart.getInputStream(); + } + } +} diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt deleted file mode 100644 index 1eed1a48357a..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt +++ /dev/null @@ -1,9 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|248 -Request-Header|Content-Type|multipart/form-data; boundary=DHbU6ChASebwm4iE8z9Lakv4ybMmkp -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|1 -Part-ContainsContents|company|bob+%26+frank%27s+shoe+repair diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw deleted file mode 100644 index 7059e4760c71..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw +++ /dev/null @@ -1,7 +0,0 @@ ---DHbU6ChASebwm4iE8z9Lakv4ybMmkp -Content-Disposition: form-data; name="company" -Content-Type: application/x-www-form-urlencoded; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -bob+%26+frank%27s+shoe+repair ---DHbU6ChASebwm4iE8z9Lakv4ybMmkp-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt deleted file mode 100644 index fde7344fec70..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22940 -Request-Header|Content-Type|multipart/form-data; boundary=owr6UQGvVNunA_sx2AsizBtyq_uK-OjsQXrF -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|6 -Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 -Part-ContainsContents|company|bob & frank's shoe repair -Part-ContainsContents|power|ꬵо𝗋ⲥ𝖾 -Part-ContainsContents|japanese|オープンソース -Part-ContainsContents|hello|日食桟橋 -Part-Filename|upload_file|filename -Part-Sha1sum|upload_file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.raw deleted file mode 100644 index 87f46ff9258d..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-jetty-client.expected.txt deleted file mode 100644 index df6340cc7da3..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-jetty-client.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary1275gffetpxz8o0q -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|6 -Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 -Part-ContainsContents|company|bob & frank's shoe repair -Part-ContainsContents|power|ꬵо𝗋ⲥ𝖾 -Part-ContainsContents|japanese|オープンソース -Part-ContainsContents|hello|日食桟橋 -Part-Filename|upload_file|filename -Part-Sha1sum|upload_file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-jetty-client.raw deleted file mode 100644 index 04514a19dcb5..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-complex-jetty-client.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt deleted file mode 100644 index 796af8952cee..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|1815 -Request-Header|Content-Type|multipart/form-data; boundary=QW3F8Fg64P2J2dpfEKGKlX0Q9QF2a8SK_7YH -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|10 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw deleted file mode 100644 index e48b5a628561..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt deleted file mode 100644 index bc73cca6fc6f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary14beb4to333d91v8 -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|10 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.raw deleted file mode 100644 index 44646fda28c4..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.raw +++ /dev/null @@ -1,51 +0,0 @@ ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -3.14159265358979323846264338327950288419716939937510 ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -3.14159 ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -3 ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -π ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -π ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -%CF%80 ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="pi" -Content-Type: text/plain;charset=UTF-8 - -π = C/d ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="π" -Content-Type: text/plain;charset=UTF-8 - -3.14 ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="%CF%80" -Content-Type: text/plain;charset=UTF-8 - -Approximately 3.14 ---JettyHttpClientBoundary14beb4to333d91v8 -Content-Disposition: form-data; name="%FE%FF%03%C0" -Content-Type: text/plain;charset=UTF-8 - -Approximately 3.14 ---JettyHttpClientBoundary14beb4to333d91v8-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt deleted file mode 100644 index 5769e300b104..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|31148 -Request-Header|Content-Type|multipart/form-data; boundary=qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|169 -Part-ContainsContents|count|168 -Part-ContainsContents|persian-UTF-8|برج بابل -Part-ContainsContents|persian-CESU-8|برج بابل diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw deleted file mode 100644 index 17948f0419e3..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw +++ /dev/null @@ -1,1015 +0,0 @@ ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-Big5" -Content-Type: text/plain; charset=Big5 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-Big5-HKSCS" -Content-Type: text/plain; charset=Big5-HKSCS -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-CESU-8" -Content-Type: text/plain; charset=CESU-8 -Content-Transfer-Encoding: 8bit - -برج بابل ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-EUC-JP" -Content-Type: text/plain; charset=EUC-JP -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-EUC-KR" -Content-Type: text/plain; charset=EUC-KR -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-GB18030" -Content-Type: text/plain; charset=GB18030 -Content-Transfer-Encoding: 8bit - -101914 10191018 ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-GB2312" -Content-Type: text/plain; charset=GB2312 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-GBK" -Content-Type: text/plain; charset=GBK -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM-Thai" -Content-Type: text/plain; charset=IBM-Thai -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM00858" -Content-Type: text/plain; charset=IBM00858 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01140" -Content-Type: text/plain; charset=IBM01140 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01141" -Content-Type: text/plain; charset=IBM01141 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01142" -Content-Type: text/plain; charset=IBM01142 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01143" -Content-Type: text/plain; charset=IBM01143 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01144" -Content-Type: text/plain; charset=IBM01144 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01145" -Content-Type: text/plain; charset=IBM01145 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01146" -Content-Type: text/plain; charset=IBM01146 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01147" -Content-Type: text/plain; charset=IBM01147 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01148" -Content-Type: text/plain; charset=IBM01148 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM01149" -Content-Type: text/plain; charset=IBM01149 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM037" -Content-Type: text/plain; charset=IBM037 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM1026" -Content-Type: text/plain; charset=IBM1026 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM1047" -Content-Type: text/plain; charset=IBM1047 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM273" -Content-Type: text/plain; charset=IBM273 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM277" -Content-Type: text/plain; charset=IBM277 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM278" -Content-Type: text/plain; charset=IBM278 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM280" -Content-Type: text/plain; charset=IBM280 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM284" -Content-Type: text/plain; charset=IBM284 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM285" -Content-Type: text/plain; charset=IBM285 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM290" -Content-Type: text/plain; charset=IBM290 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM297" -Content-Type: text/plain; charset=IBM297 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM420" -Content-Type: text/plain; charset=IBM420 -Content-Transfer-Encoding: 8bit - -Xug@XVX ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM424" -Content-Type: text/plain; charset=IBM424 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM437" -Content-Type: text/plain; charset=IBM437 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM500" -Content-Type: text/plain; charset=IBM500 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM775" -Content-Type: text/plain; charset=IBM775 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM850" -Content-Type: text/plain; charset=IBM850 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM852" -Content-Type: text/plain; charset=IBM852 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM855" -Content-Type: text/plain; charset=IBM855 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM857" -Content-Type: text/plain; charset=IBM857 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM860" -Content-Type: text/plain; charset=IBM860 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM861" -Content-Type: text/plain; charset=IBM861 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM862" -Content-Type: text/plain; charset=IBM862 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM863" -Content-Type: text/plain; charset=IBM863 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM864" -Content-Type: text/plain; charset=IBM864 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM865" -Content-Type: text/plain; charset=IBM865 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM866" -Content-Type: text/plain; charset=IBM866 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM868" -Content-Type: text/plain; charset=IBM868 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM869" -Content-Type: text/plain; charset=IBM869 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM870" -Content-Type: text/plain; charset=IBM870 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM871" -Content-Type: text/plain; charset=IBM871 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-IBM918" -Content-Type: text/plain; charset=IBM918 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-2022-JP" -Content-Type: text/plain; charset=ISO-2022-JP -Content-Transfer-Encoding: 8bit - -$B!)!)!)(B $B!)!)!)!)(B ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-2022-JP-2" -Content-Type: text/plain; charset=ISO-2022-JP-2 -Content-Transfer-Encoding: 8bit - -$B!)!)!)(B $B!)!)!)!)(B ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-2022-KR" -Content-Type: text/plain; charset=ISO-2022-KR -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-1" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-13" -Content-Type: text/plain; charset=ISO-8859-13 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-15" -Content-Type: text/plain; charset=ISO-8859-15 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-2" -Content-Type: text/plain; charset=ISO-8859-2 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-3" -Content-Type: text/plain; charset=ISO-8859-3 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-4" -Content-Type: text/plain; charset=ISO-8859-4 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-5" -Content-Type: text/plain; charset=ISO-8859-5 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-6" -Content-Type: text/plain; charset=ISO-8859-6 -Content-Transfer-Encoding: 8bit - - ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-7" -Content-Type: text/plain; charset=ISO-8859-7 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-8" -Content-Type: text/plain; charset=ISO-8859-8 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-ISO-8859-9" -Content-Type: text/plain; charset=ISO-8859-9 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-JIS_X0201" -Content-Type: text/plain; charset=JIS_X0201 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-JIS_X0212-1990" -Content-Type: text/plain; charset=JIS_X0212-1990 -Content-Transfer-Encoding: 8bit - -"D"D"D"D"D"D"D"D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-KOI8-R" -Content-Type: text/plain; charset=KOI8-R -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-KOI8-U" -Content-Type: text/plain; charset=KOI8-U -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-Shift_JIS" -Content-Type: text/plain; charset=Shift_JIS -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-TIS-620" -Content-Type: text/plain; charset=TIS-620 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-US-ASCII" -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-16" -Content-Type: text/plain; charset=UTF-16 -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-16BE" -Content-Type: text/plain; charset=UTF-16BE -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-16LE" -Content-Type: text/plain; charset=UTF-16LE -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-32" -Content-Type: text/plain; charset=UTF-32 -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-32BE" -Content-Type: text/plain; charset=UTF-32BE -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-32LE" -Content-Type: text/plain; charset=UTF-32LE -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-UTF-8" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -برج بابل ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1250" -Content-Type: text/plain; charset=windows-1250 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1251" -Content-Type: text/plain; charset=windows-1251 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1252" -Content-Type: text/plain; charset=windows-1252 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1253" -Content-Type: text/plain; charset=windows-1253 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1254" -Content-Type: text/plain; charset=windows-1254 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1255" -Content-Type: text/plain; charset=windows-1255 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1256" -Content-Type: text/plain; charset=windows-1256 -Content-Transfer-Encoding: 8bit - - ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1257" -Content-Type: text/plain; charset=windows-1257 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-1258" -Content-Type: text/plain; charset=windows-1258 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-windows-31j" -Content-Type: text/plain; charset=windows-31j -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-Big5-HKSCS-2001" -Content-Type: text/plain; charset=x-Big5-HKSCS-2001 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-Big5-Solaris" -Content-Type: text/plain; charset=x-Big5-Solaris -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-euc-jp-linux" -Content-Type: text/plain; charset=x-euc-jp-linux -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-EUC-TW" -Content-Type: text/plain; charset=x-EUC-TW -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-eucJP-Open" -Content-Type: text/plain; charset=x-eucJP-Open -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1006" -Content-Type: text/plain; charset=x-IBM1006 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1025" -Content-Type: text/plain; charset=x-IBM1025 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1046" -Content-Type: text/plain; charset=x-IBM1046 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1097" -Content-Type: text/plain; charset=x-IBM1097 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1098" -Content-Type: text/plain; charset=x-IBM1098 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1112" -Content-Type: text/plain; charset=x-IBM1112 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1122" -Content-Type: text/plain; charset=x-IBM1122 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1123" -Content-Type: text/plain; charset=x-IBM1123 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1124" -Content-Type: text/plain; charset=x-IBM1124 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1166" -Content-Type: text/plain; charset=x-IBM1166 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1364" -Content-Type: text/plain; charset=x-IBM1364 -Content-Transfer-Encoding: 8bit - -ooo@oooo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1381" -Content-Type: text/plain; charset=x-IBM1381 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM1383" -Content-Type: text/plain; charset=x-IBM1383 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM300" -Content-Type: text/plain; charset=x-IBM300 -Content-Transfer-Encoding: 8bit - -BoBoBoBoBoBoBoBo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM33722" -Content-Type: text/plain; charset=x-IBM33722 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM737" -Content-Type: text/plain; charset=x-IBM737 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM833" -Content-Type: text/plain; charset=x-IBM833 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM834" -Content-Type: text/plain; charset=x-IBM834 -Content-Transfer-Encoding: 8bit - - ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM856" -Content-Type: text/plain; charset=x-IBM856 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM874" -Content-Type: text/plain; charset=x-IBM874 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM875" -Content-Type: text/plain; charset=x-IBM875 -Content-Transfer-Encoding: 8bit - -???@???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM921" -Content-Type: text/plain; charset=x-IBM921 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM922" -Content-Type: text/plain; charset=x-IBM922 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM930" -Content-Type: text/plain; charset=x-IBM930 -Content-Transfer-Encoding: 8bit - -ooo@oooo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM933" -Content-Type: text/plain; charset=x-IBM933 -Content-Transfer-Encoding: 8bit - -ooo@oooo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM935" -Content-Type: text/plain; charset=x-IBM935 -Content-Transfer-Encoding: 8bit - -ooo@oooo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM937" -Content-Type: text/plain; charset=x-IBM937 -Content-Transfer-Encoding: 8bit - -ooo@oooo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM939" -Content-Type: text/plain; charset=x-IBM939 -Content-Transfer-Encoding: 8bit - -ooo@oooo ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM942" -Content-Type: text/plain; charset=x-IBM942 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM942C" -Content-Type: text/plain; charset=x-IBM942C -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM943" -Content-Type: text/plain; charset=x-IBM943 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM943C" -Content-Type: text/plain; charset=x-IBM943C -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM948" -Content-Type: text/plain; charset=x-IBM948 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM949" -Content-Type: text/plain; charset=x-IBM949 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM949C" -Content-Type: text/plain; charset=x-IBM949C -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM950" -Content-Type: text/plain; charset=x-IBM950 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM964" -Content-Type: text/plain; charset=x-IBM964 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-IBM970" -Content-Type: text/plain; charset=x-IBM970 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-ISCII91" -Content-Type: text/plain; charset=x-ISCII91 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-ISO-2022-CN-CNS" -Content-Type: text/plain; charset=x-ISO-2022-CN-CNS -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-ISO-2022-CN-GB" -Content-Type: text/plain; charset=x-ISO-2022-CN-GB -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-iso-8859-11" -Content-Type: text/plain; charset=x-iso-8859-11 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-JIS0208" -Content-Type: text/plain; charset=x-JIS0208 -Content-Transfer-Encoding: 8bit - -!)!)!)!)!)!)!)!) ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-Johab" -Content-Type: text/plain; charset=x-Johab -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacArabic" -Content-Type: text/plain; charset=x-MacArabic -Content-Transfer-Encoding: 8bit - - ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacCentralEurope" -Content-Type: text/plain; charset=x-MacCentralEurope -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacCroatian" -Content-Type: text/plain; charset=x-MacCroatian -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacCyrillic" -Content-Type: text/plain; charset=x-MacCyrillic -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacDingbat" -Content-Type: text/plain; charset=x-MacDingbat -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacGreek" -Content-Type: text/plain; charset=x-MacGreek -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacHebrew" -Content-Type: text/plain; charset=x-MacHebrew -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacIceland" -Content-Type: text/plain; charset=x-MacIceland -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacRoman" -Content-Type: text/plain; charset=x-MacRoman -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacRomania" -Content-Type: text/plain; charset=x-MacRomania -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacSymbol" -Content-Type: text/plain; charset=x-MacSymbol -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacThai" -Content-Type: text/plain; charset=x-MacThai -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacTurkish" -Content-Type: text/plain; charset=x-MacTurkish -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MacUkraine" -Content-Type: text/plain; charset=x-MacUkraine -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MS932_0213" -Content-Type: text/plain; charset=x-MS932_0213 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MS950-HKSCS" -Content-Type: text/plain; charset=x-MS950-HKSCS -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-MS950-HKSCS-XP" -Content-Type: text/plain; charset=x-MS950-HKSCS-XP -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-mswin-936" -Content-Type: text/plain; charset=x-mswin-936 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-PCK" -Content-Type: text/plain; charset=x-PCK -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-SJIS_0213" -Content-Type: text/plain; charset=x-SJIS_0213 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-UTF-16LE-BOM" -Content-Type: text/plain; charset=x-UTF-16LE-BOM -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-X-UTF-32BE-BOM" -Content-Type: text/plain; charset=X-UTF-32BE-BOM -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-X-UTF-32LE-BOM" -Content-Type: text/plain; charset=X-UTF-32LE-BOM -Content-Transfer-Encoding: 8bit - -(1, ('(D ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-windows-50220" -Content-Type: text/plain; charset=x-windows-50220 -Content-Transfer-Encoding: 8bit - -$B!)!)!)(B $B!)!)!)!)(B ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-windows-50221" -Content-Type: text/plain; charset=x-windows-50221 -Content-Transfer-Encoding: 8bit - -$B!)!)!)(B $B!)!)!)!)(B ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-windows-874" -Content-Type: text/plain; charset=x-windows-874 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-windows-949" -Content-Type: text/plain; charset=x-windows-949 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-windows-950" -Content-Type: text/plain; charset=x-windows-950 -Content-Transfer-Encoding: 8bit - -??? ???? ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="persian-x-windows-iso2022jp" -Content-Type: text/plain; charset=x-windows-iso2022jp -Content-Transfer-Encoding: 8bit - -$B!)!)!)(B $B!)!)!)!)(B ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw -Content-Disposition: form-data; name="count" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -168 ---qqr2YBBR31U4xVib4vaVuIsrwNY1iw-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt deleted file mode 100644 index 473743d99e6e..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary1jcfdl0zps9nf362 -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|169 -Part-ContainsContents|count|168 -Part-ContainsContents|persian-UTF-8|برج بابل -Part-ContainsContents|persian-CESU-8|برج بابل diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.raw deleted file mode 100644 index 7f374670a107..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.raw +++ /dev/null @@ -1,846 +0,0 @@ ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-Big5" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-Big5-HKSCS" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-CESU-8" -Content-Type: text/plain - -برج بابل ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-EUC-JP" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-EUC-KR" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-GB18030" -Content-Type: text/plain - -101914 10191018 ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-GB2312" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-GBK" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM-Thai" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM00858" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01140" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01141" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01142" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01143" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01144" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01145" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01146" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01147" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01148" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM01149" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM037" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM1026" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM1047" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM273" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM277" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM278" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM280" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM284" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM285" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM290" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM297" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM420" -Content-Type: text/plain - -Xug@XVX ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM424" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM437" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM500" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM775" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM850" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM852" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM855" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM857" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM860" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM861" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM862" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM863" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM864" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM865" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM866" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM868" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM869" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM870" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM871" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-IBM918" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-2022-JP" -Content-Type: text/plain - -$B!)!)!)(B $B!)!)!)!)(B ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-2022-JP-2" -Content-Type: text/plain - -$B!)!)!)(B $B!)!)!)!)(B ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-2022-KR" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-1" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-13" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-15" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-2" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-3" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-4" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-5" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-6" -Content-Type: text/plain - - ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-7" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-8" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-ISO-8859-9" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-JIS_X0201" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-JIS_X0212-1990" -Content-Type: text/plain - -"D"D"D"D"D"D"D"D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-KOI8-R" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-KOI8-U" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-Shift_JIS" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-TIS-620" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-US-ASCII" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-16" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-16BE" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-16LE" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-32" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-32BE" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-32LE" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-UTF-8" -Content-Type: text/plain - -برج بابل ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1250" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1251" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1252" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1253" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1254" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1255" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1256" -Content-Type: text/plain - - ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1257" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-1258" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-windows-31j" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-Big5-HKSCS-2001" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-Big5-Solaris" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-euc-jp-linux" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-EUC-TW" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-eucJP-Open" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1006" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1025" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1046" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1097" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1098" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1112" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1122" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1123" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1124" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1166" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1364" -Content-Type: text/plain - -ooo@oooo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1381" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM1383" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM300" -Content-Type: text/plain - -BoBoBoBoBoBoBoBo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM33722" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM737" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM833" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM834" -Content-Type: text/plain - - ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM856" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM874" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM875" -Content-Type: text/plain - -???@???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM921" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM922" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM930" -Content-Type: text/plain - -ooo@oooo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM933" -Content-Type: text/plain - -ooo@oooo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM935" -Content-Type: text/plain - -ooo@oooo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM937" -Content-Type: text/plain - -ooo@oooo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM939" -Content-Type: text/plain - -ooo@oooo ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM942" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM942C" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM943" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM943C" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM948" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM949" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM949C" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM950" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM964" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-IBM970" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-ISCII91" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-ISO-2022-CN-CNS" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-ISO-2022-CN-GB" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-iso-8859-11" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-JIS0208" -Content-Type: text/plain - -!)!)!)!)!)!)!)!) ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-Johab" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacArabic" -Content-Type: text/plain - - ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacCentralEurope" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacCroatian" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacCyrillic" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacDingbat" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacGreek" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacHebrew" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacIceland" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacRoman" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacRomania" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacSymbol" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacThai" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacTurkish" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MacUkraine" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MS932_0213" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MS950-HKSCS" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-MS950-HKSCS-XP" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-mswin-936" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-PCK" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-SJIS_0213" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-UTF-16LE-BOM" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-X-UTF-32BE-BOM" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-X-UTF-32LE-BOM" -Content-Type: text/plain - -(1, ('(D ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-windows-50220" -Content-Type: text/plain - -$B!)!)!)(B $B!)!)!)!)(B ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-windows-50221" -Content-Type: text/plain - -$B!)!)!)(B $B!)!)!)!)(B ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-windows-874" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-windows-949" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-windows-950" -Content-Type: text/plain - -??? ???? ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="persian-x-windows-iso2022jp" -Content-Type: text/plain - -$B!)!)!)(B $B!)!)!)!)(B ---JettyHttpClientBoundary1jcfdl0zps9nf362 -Content-Disposition: form-data; name="count" -Content-Type: text/plain;charset=UTF-8 - -168 ---JettyHttpClientBoundary1jcfdl0zps9nf362-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt deleted file mode 100644 index 7b689768bb91..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt +++ /dev/null @@ -1,21 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate, br -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22759 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryafpkbdzB5Ciqre2z -Request-Header|Cookie|visited=yes -Request-Header|DNT|1 -Request-Header|Host|localhost:9090 -Request-Header|Origin|http://localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload-multi.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 -Parts-Count|4 -Part-ContainsContents|description|the larger icon -Part-ContainsContents|alternate|text.raw -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 -Part-Filename|file-alt|text.raw -Part-Sha1sum|file-alt|5fb031816a27d80cc88c390819addab0ec3c189b diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw deleted file mode 100644 index cb7809cf0d41..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt deleted file mode 100644 index 9c3e25494532..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22824 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e21c038151054 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload-multi.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 -Parts-Count|4 -Part-ContainsContents|description|the larger icon -Part-ContainsContents|alternate|text.raw -Part-Filename|file|C:\Users\joakim\Pictures\jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 -Part-Filename|file-alt|C:\Users\joakim\Pictures\text.raw -Part-Sha1sum|file-alt|5fb031816a27d80cc88c390819addab0ec3c189b diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.raw deleted file mode 100644 index 13fa9572fdd5..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt deleted file mode 100644 index f918d12a4f68..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22774 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------23281168279961 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload-multi.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 -Parts-Count|4 -Part-ContainsContents|description|the larger icon -Part-ContainsContents|alternate|text.raw -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 -Part-Filename|file-alt|text.raw -Part-Sha1sum|file-alt|5fb031816a27d80cc88c390819addab0ec3c189b diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw deleted file mode 100644 index ca094b5a9fc1..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt deleted file mode 100644 index b1534812a616..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22814 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e226692109c -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload-multi.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko -Parts-Count|4 -Part-ContainsContents|description|the larger icon -Part-ContainsContents|alternate|text.raw -Part-Filename|file|C:\Users\joakim\Pictures\jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 -Part-Filename|file-alt|C:\Users\joakim\Pictures\text.raw -Part-Sha1sum|file-alt|5fb031816a27d80cc88c390819addab0ec3c189b diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.raw deleted file mode 100644 index 786215f3d902..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt deleted file mode 100644 index 12c657e82588..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt +++ /dev/null @@ -1,18 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22774 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryEQhxWUv9r38x3LyB -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form-fileupload-multi.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6 -Parts-Count|4 -Part-ContainsContents|description|the larger icon -Part-ContainsContents|alternate|text.raw -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 -Part-Filename|file-alt|text.raw -Part-Sha1sum|file-alt|5fb031816a27d80cc88c390819addab0ec3c189b diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.raw deleted file mode 100644 index 125321970b1b..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt deleted file mode 100644 index ef15f1eba25a..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22054 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundary2oBNepLIldUG8YwL -Request-Header|DNT|1 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form-fileupload.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.021) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.raw deleted file mode 100644 index 2263dfdaf686..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt deleted file mode 100644 index fceb88d1000c..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22105 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------2117751712556306154183865432 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form-fileupload.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Android 8.1.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.raw deleted file mode 100644 index 3492fddbe80c..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt deleted file mode 100644 index 491fe431b377..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt +++ /dev/null @@ -1,18 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate, br -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22054 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundarylxcKjAyTlRs3jNP2 -Request-Header|Cookie|visited=yes -Request-Header|DNT|1 -Request-Header|Host|localhost:9090 -Request-Header|Origin|http://localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-chrome.raw deleted file mode 100644 index b31c88589892..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-chrome.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-edge.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-edge.expected.txt deleted file mode 100644 index 3086e324bc97..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-edge.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22085 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e225f6151054 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|C:\Users\joakim\Pictures\jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-edge.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-edge.raw deleted file mode 100644 index 6f60b77cd3ef..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-edge.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt deleted file mode 100644 index 6b138ba5bb60..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22063 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------24464570528145 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-firefox.raw deleted file mode 100644 index cb14119752fa..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-firefox.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt deleted file mode 100644 index 3620ce269c09..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22074 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundary5trdx3OwYr8uMtbA -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form-fileupload.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (iPad; CPU OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|66A4F66B-9B37-4F69-86A7-456547EBF079.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.raw deleted file mode 100644 index 24fbac72d3e8..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-msie.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-msie.expected.txt deleted file mode 100644 index e2f6482cadb4..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-msie.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22082 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e223ef2109c -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form-fileupload.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|C:\Users\joakim\Pictures\jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-msie.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-msie.raw deleted file mode 100644 index 9b27e7677b40..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-msie.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-safari.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-safari.expected.txt deleted file mode 100644 index 9dd878137309..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-safari.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|22054 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryWl9yEX5Fas0SI2xc -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form-fileupload.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6 -Parts-Count|2 -Part-ContainsContents|description|the larger icon -Part-Filename|file|jetty-avatar-256.png -Part-Sha1sum|file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-safari.raw deleted file mode 100644 index 3b6922522ebe..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form-fileupload-safari.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-chrome.expected.txt deleted file mode 100644 index 271e31b1181f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-chrome.expected.txt +++ /dev/null @@ -1,16 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|245 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryD4GyXQgjBRmK3aBz -Request-Header|DNT|1 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.021) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 -Parts-Count|2 -Part-ContainsContents|user|Androiduser -Part-ContainsContents|comment|Dyac! \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-chrome.raw deleted file mode 100644 index f5ce1cab07d8..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-chrome.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundaryD4GyXQgjBRmK3aBz -Content-Disposition: form-data; name="user" - -Androiduser -------WebKitFormBoundaryD4GyXQgjBRmK3aBz -Content-Disposition: form-data; name="comment" - -Dyac! -------WebKitFormBoundaryD4GyXQgjBRmK3aBz-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-firefox.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-firefox.expected.txt deleted file mode 100644 index 9f7d2307e87f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-firefox.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|306 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------6390283156237600831344307695 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Android 8.1.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 -Parts-Count|2 -Part-ContainsContents|user|androidfireuser -Part-ContainsContents|comment|More to say \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-firefox.raw deleted file mode 100644 index 75dbbde1a6fd..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-android-firefox.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------6390283156237600831344307695 -Content-Disposition: form-data; name="user" - -androidfireuser ------------------------------6390283156237600831344307695 -Content-Disposition: form-data; name="comment" - -More to say ------------------------------6390283156237600831344307695-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-chrome.expected.txt deleted file mode 100644 index d36342fb640e..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-chrome.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate, br -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|256 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundary46EP6zTN86hbbaJC -Request-Header|Cookie|visited=yes -Request-Header|DNT|1 -Request-Header|Host|localhost:9090 -Request-Header|Origin|http://localhost:9090 -Request-Header|Referer|http://localhost:9090/form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 -Parts-Count|2 -Part-ContainsContents|user|joe -Part-ContainsContents|comment|this is a simple comment \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-chrome.raw deleted file mode 100644 index 7f8bfc267d89..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-chrome.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundary46EP6zTN86hbbaJC -Content-Disposition: form-data; name="user" - -joe -------WebKitFormBoundary46EP6zTN86hbbaJC -Content-Disposition: form-data; name="comment" - -this is a simple comment -------WebKitFormBoundary46EP6zTN86hbbaJC-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-edge.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-edge.expected.txt deleted file mode 100644 index 0b7f887ddc62..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-edge.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|267 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e25e1e151054 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 -Parts-Count|2 -Part-ContainsContents|user|anotheruser -Part-ContainsContents|comment|with something to say \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-edge.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-edge.raw deleted file mode 100644 index 48aa4e73f1c2..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-edge.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------7e25e1e151054 -Content-Disposition: form-data; name="user" - -anotheruser ------------------------------7e25e1e151054 -Content-Disposition: form-data; name="comment" - -with something to say ------------------------------7e25e1e151054-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-firefox.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-firefox.expected.txt deleted file mode 100644 index 9f0e4ee98992..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-firefox.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|258 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------41184676334 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 -Parts-Count|2 -Part-ContainsContents|user|fireuser -Part-ContainsContents|comment|with detailed message \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-firefox.raw deleted file mode 100644 index a7c653154502..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-firefox.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------41184676334 -Content-Disposition: form-data; name="user" - -fireuser ------------------------------41184676334 -Content-Disposition: form-data; name="comment" - -with detailed message ------------------------------41184676334-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-ios-safari.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-ios-safari.expected.txt deleted file mode 100644 index 4d0533dfb0f8..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-ios-safari.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|268 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundary56m5uMm4gNcn4rL1 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (iPad; CPU OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1 -Parts-Count|2 -Part-ContainsContents|user|UseriPad -Part-ContainsContents|comment|This form isn’t pretty \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-ios-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-ios-safari.raw deleted file mode 100644 index 9664c903572f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-ios-safari.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundary56m5uMm4gNcn4rL1 -Content-Disposition: form-data; name="user" - -UseriPad -------WebKitFormBoundary56m5uMm4gNcn4rL1 -Content-Disposition: form-data; name="comment" - -This form isn’t pretty enough -------WebKitFormBoundary56m5uMm4gNcn4rL1-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-msie.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-msie.expected.txt deleted file mode 100644 index 60cbe9e59565..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-msie.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|285 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e21b6f2109c -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/form.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko -Parts-Count|2 -Part-ContainsContents|user|msieuser -Part-ContainsContents|comment|with information that they think is important \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-msie.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-msie.raw deleted file mode 100644 index e562e7213976..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-msie.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------7e21b6f2109c -Content-Disposition: form-data; name="user" - -msieuser ------------------------------7e21b6f2109c -Content-Disposition: form-data; name="comment" - -with information that they think is important ------------------------------7e21b6f2109c-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-osx-safari.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-osx-safari.expected.txt deleted file mode 100644 index 236c06f15e81..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-osx-safari.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|284 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryjwqONTsAFgubfMZc -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6 -Parts-Count|2 -Part-ContainsContents|user|safariuser -Part-ContainsContents|comment|with rambling thoughts about bellybutton lint \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-osx-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-osx-safari.raw deleted file mode 100644 index 0e6b82ffd18b..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-form1-osx-safari.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundaryjwqONTsAFgubfMZc -Content-Disposition: form-data; name="user" - -safariuser -------WebKitFormBoundaryjwqONTsAFgubfMZc -Content-Disposition: form-data; name="comment" - -with rambling thoughts about bellybutton lint -------WebKitFormBoundaryjwqONTsAFgubfMZc-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt deleted file mode 100644 index fc44839cac22..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|1203 -Request-Header|Content-Type|multipart/form-data; boundary=Cku4UvJrPFCXkXjge2a2Y2sgq1bbOa -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|4 -Part-ContainsContents|reporter| -Part-ContainsContents|timestamp|2018-03-21T18:52:18+00:00 -Part-ContainsContents|comments|this couldn't be parsed -Part-ContainsContents|attachment|banana \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.raw deleted file mode 100644 index 12ce1761a039..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.raw +++ /dev/null @@ -1,42 +0,0 @@ ---Cku4UvJrPFCXkXjge2a2Y2sgq1bbOa -Content-Disposition: form-data; name="reporter" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - - ---Cku4UvJrPFCXkXjge2a2Y2sgq1bbOa -Content-Disposition: form-data; name="timestamp" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -2018-03-21T18:52:18+00:00 ---Cku4UvJrPFCXkXjge2a2Y2sgq1bbOa -Content-Disposition: form-data; name="comments" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -this couldn't be parsed ---Cku4UvJrPFCXkXjge2a2Y2sgq1bbOa -Content-Disposition: form-data; name="attachment" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - ---nM8_n8ugj9L3fIomqyU6h9Wpb6Wt-3w -Content-Disposition: form-data; name="fruit" - -banana ---nM8_n8ugj9L3fIomqyU6h9Wpb6Wt-3w -Content-Disposition: form-data; name="color" - -yellow ---nM8_n8ugj9L3fIomqyU6h9Wpb6Wt-3w -Content-Disposition: form-data; name="cost" - -$0.12 USG ---nM8_n8ugj9L3fIomqyU6h9Wpb6Wt-3w -Content-Disposition: form-data; name="comments" - ---divc688gD49-GaZcLkprfUb8-PWOjF3Z ---nM8_n8ugj9L3fIomqyU6h9Wpb6Wt-3w-- - ---Cku4UvJrPFCXkXjge2a2Y2sgq1bbOa-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt deleted file mode 100644 index 12e9da8703e4..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|1577 -Request-Header|Content-Type|multipart/form-data; boundary=xDeLGHDDsXrlJSXfqDmg5IRop7auqTTBXuI -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|4 -Part-ContainsContents|reporter| -Part-ContainsContents|timestamp|2018-03-21T19:00:18+00:00 -Part-ContainsContents|comments|this also couldn't be parsed -Part-ContainsContents|attachment|cherry \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw deleted file mode 100644 index bf8c06a969d6..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw +++ /dev/null @@ -1,50 +0,0 @@ ---xDeLGHDDsXrlJSXfqDmg5IRop7auqTTBXuI -Content-Disposition: form-data; name="reporter" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - - ---xDeLGHDDsXrlJSXfqDmg5IRop7auqTTBXuI -Content-Disposition: form-data; name="timestamp" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -2018-03-21T19:00:18+00:00 ---xDeLGHDDsXrlJSXfqDmg5IRop7auqTTBXuI -Content-Disposition: form-data; name="comments" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -this also couldn't be parsed ---xDeLGHDDsXrlJSXfqDmg5IRop7auqTTBXuI -Content-Disposition: form-data; name="attachment" -Content-Type: application/octet-stream -Content-Transfer-Encoding: binary - ---GiQ7DQPSJdaP5c43_Zd1P6xVJTQVLzZ8T9ovx -Content-Disposition: form-data; name="fruit" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -cherry ---GiQ7DQPSJdaP5c43_Zd1P6xVJTQVLzZ8T9ovx -Content-Disposition: form-data; name="color" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -red ---GiQ7DQPSJdaP5c43_Zd1P6xVJTQVLzZ8T9ovx -Content-Disposition: form-data; name="cost" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - -$1.20 USG ---GiQ7DQPSJdaP5c43_Zd1P6xVJTQVLzZ8T9ovx -Content-Disposition: form-data; name="comments" -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit - ---gq4lBOlNh8FRiH6MLw4GaWE40UC-GeDRTy8bF ---GiQ7DQPSJdaP5c43_Zd1P6xVJTQVLzZ8T9ovx-- - ---xDeLGHDDsXrlJSXfqDmg5IRop7auqTTBXuI-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-jetty-client.expected.txt deleted file mode 100644 index 294f1eefd478..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-jetty-client.expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary1uz60vid2bq7x1t9 -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|4 -Part-ContainsContents|reporter| -Part-ContainsContents|timestamp|2018-03-21T18:52:18+00:00 -Part-ContainsContents|comments|this couldn't be parsed -Part-ContainsContents|attachment|banana \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-jetty-client.raw deleted file mode 100644 index 38f849cc89b2..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-nested-jetty-client.raw +++ /dev/null @@ -1,42 +0,0 @@ ---JettyHttpClientBoundary1uz60vid2bq7x1t9 -Content-Disposition: form-data; name="reporter" -Content-Type: text/plain;charset=UTF-8 - - ---JettyHttpClientBoundary1uz60vid2bq7x1t9 -Content-Disposition: form-data; name="timestamp" -Content-Type: text/plain;charset=UTF-8 - -2018-03-21T18:52:18+00:00 ---JettyHttpClientBoundary1uz60vid2bq7x1t9 -Content-Disposition: form-data; name="comments" -Content-Type: text/plain;charset=UTF-8 - -this couldn't be parsed ---JettyHttpClientBoundary1uz60vid2bq7x1t9 -Content-Disposition: form-data; name="attachment"; filename="sample" -Content-Type: multipart/form-data; boundary=JettyHttpClientBoundary10bb1gdlzug0xmmi - ---JettyHttpClientBoundary10bb1gdlzug0xmmi -Content-Disposition: form-data; name="fruit" -Content-Type: text/plain;charset=UTF-8 - -banana ---JettyHttpClientBoundary10bb1gdlzug0xmmi -Content-Disposition: form-data; name="color" -Content-Type: text/plain;charset=UTF-8 - -yellow ---JettyHttpClientBoundary10bb1gdlzug0xmmi -Content-Disposition: form-data; name="cost" -Content-Type: text/plain;charset=UTF-8 - -$0.12 USD ---JettyHttpClientBoundary10bb1gdlzug0xmmi -Content-Disposition: form-data; name="comments" -Content-Type: text/plain;charset=UTF-8 - ---gx1KGV2f8WMHHwtWog9AFqjD3IGHzEvk ---JettyHttpClientBoundary10bb1gdlzug0xmmi-- - ---JettyHttpClientBoundary1uz60vid2bq7x1t9-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt deleted file mode 100644 index e090188dbfde..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt +++ /dev/null @@ -1,9 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|173 -Request-Header|Content-Type|multipart/form-data; boundary=xE8WoYDcbqAfj08bxPk669iK22hMMlZL -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|1 -Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.raw deleted file mode 100644 index 0af35a6be1fb..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.raw +++ /dev/null @@ -1,5 +0,0 @@ ---xE8WoYDcbqAfj08bxPk669iK22hMMlZL -Content-Disposition: form-data; name="pi" - -3.14159265358979323846264338327950288419716939937510 ---xE8WoYDcbqAfj08bxPk669iK22hMMlZL-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-jetty-client.expected.txt deleted file mode 100644 index a9f21f2f65f0..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-jetty-client.expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary1shlqpw2yahae6jf -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|1 -# Start of sequence -Part-ContainsContents|pi|3.14159 26535 89793 23846 26433 83279 50288 -# End of sequence -Part-ContainsContents|pi|81592 05600 10165 52563 7567 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-jetty-client.raw deleted file mode 100644 index ab78f173b7c9..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only-jetty-client.raw +++ /dev/null @@ -1,6 +0,0 @@ ---JettyHttpClientBoundary1shlqpw2yahae6jf -Content-Disposition: form-data; name="pi" -Content-Type: application/octet-stream - -3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 70679 82148 08651 32823 06647 09384 46095 50582 23172 53594 08128 48111 74502 84102 70193 85211 05559 64462 29489 54930 38196 44288 10975 66593 34461 28475 64823 37867 83165 27120 19091 45648 56692 34603 48610 45432 66482 13393 60726 02491 41273 72458 70066 06315 58817 48815 20920 96282 92540 91715 36436 78925 90360 01133 05305 48820 46652 13841 46951 94151 16094 33057 27036 57595 91953 09218 61173 81932 61179 31051 18548 07446 23799 62749 56735 18857 52724 89122 79381 83011 94912 98336 73362 44065 66430 86021 39494 63952 24737 19070 21798 60943 70277 05392 17176 29317 67523 84674 81846 76694 05132 00056 81271 45263 56082 77857 71342 75778 96091 73637 17872 14684 40901 22495 34301 46549 58537 10507 92279 68925 89235 42019 95611 21290 21960 86403 44181 59813 62977 47713 09960 51870 72113 49999 99837 29780 49951 05973 17328 16096 31859 50244 59455 34690 83026 42522 30825 33446 85035 26193 11881 71010 00313 78387 52886 58753 32083 81420 61717 76691 47303 59825 34904 28755 46873 11595 62863 88235 37875 93751 95778 18577 80532 17122 68066 13001 92787 66111 95909 21642 01989 38095 25720 10654 85863 27886 59361 53381 82796 82303 01952 03530 18529 68995 77362 25994 13891 24972 17752 83479 13151 55748 57242 45415 06959 50829 53311 68617 27855 88907 50983 81754 63746 49393 19255 06040 09277 01671 13900 98488 24012 85836 16035 63707 66010 47101 81942 95559 61989 46767 83744 94482 55379 77472 68471 04047 53464 62080 46684 25906 94912 93313 67702 89891 52104 75216 20569 66024 05803 81501 93511 25338 24300 35587 64024 74964 73263 91419 92726 04269 92279 67823 54781 63600 93417 21641 21992 45863 15030 28618 29745 55706 74983 85054 94588 58692 69956 90927 21079 75093 02955 32116 53449 87202 75596 02364 80665 49911 98818 34797 75356 63698 07426 54252 78625 51818 41757 46728 90977 77279 38000 81647 06001 61452 49192 17321 72147 72350 14144 19735 68548 16136 11573 52552 13347 57418 49468 43852 33239 07394 14333 45477 62416 86251 89835 69485 56209 92192 22184 27255 02542 56887 67179 04946 01653 46680 49886 27232 79178 60857 84383 82796 79766 81454 10095 38837 86360 95068 00642 25125 20511 73929 84896 08412 84886 26945 60424 19652 85022 21066 11863 06744 27862 20391 94945 04712 37137 86960 95636 43719 17287 46776 46575 73962 41389 08658 32645 99581 33904 78027 59009 94657 64078 95126 94683 98352 59570 98258 22620 52248 94077 26719 47826 84826 01476 99090 26401 36394 43745 53050 68203 49625 24517 49399 65143 14298 09190 65925 09372 21696 46151 57098 58387 41059 78859 59772 97549 89301 61753 92846 81382 68683 86894 27741 55991 85592 52459 53959 43104 99725 24680 84598 72736 44695 84865 38367 36222 62609 91246 08051 24388 43904 51244 13654 97627 80797 71569 14359 97700 12961 60894 41694 86855 58484 06353 42207 22258 28488 64815 84560 28506 01684 27394 52267 46767 88952 52138 52254 99546 66727 82398 64565 96116 35488 62305 77456 49803 55936 34568 17432 41125 15076 06947 94510 96596 09402 52288 79710 89314 56691 36867 22874 89405 60101 50330 86179 28680 92087 47609 17824 93858 90097 14909 67598 52613 65549 78189 31297 84821 68299 89487 22658 80485 75640 14270 47755 51323 79641 45152 37462 34364 54285 84447 95265 86782 10511 41354 73573 95231 13427 16610 21359 69536 23144 29524 84937 18711 01457 65403 59027 99344 03742 00731 05785 39062 19838 74478 08478 48968 33214 45713 86875 19435 06430 21845 31910 48481 00537 06146 80674 91927 81911 97939 95206 14196 63428 75444 06437 45123 71819 21799 98391 01591 95618 14675 14269 12397 48940 90718 64942 31961 56794 52080 95146 55022 52316 03881 93014 20937 62137 85595 66389 37787 08303 90697 92077 34672 21825 62599 66150 14215 03068 03844 77345 49202 60541 46659 25201 49744 28507 32518 66600 21324 34088 19071 04863 31734 64965 14539 05796 26856 10055 08106 65879 69981 63574 73638 40525 71459 10289 70641 40110 97120 62804 39039 75951 56771 57700 42033 78699 36007 23055 87631 76359 42187 31251 47120 53292 81918 26186 12586 73215 79198 41484 88291 64470 60957 52706 95722 09175 67116 72291 09816 90915 28017 35067 12748 58322 28718 35209 35396 57251 21083 57915 13698 82091 44421 00675 10334 67110 31412 67111 36990 86585 16398 31501 97016 51511 68517 14376 57618 35155 65088 49099 89859 98238 73455 28331 63550 76479 18535 89322 61854 89632 13293 30898 57064 20467 52590 70915 48141 65498 59461 63718 02709 81994 30992 44889 57571 28289 05923 23326 09729 97120 84433 57326 54893 82391 19325 97463 66730 58360 41428 13883 03203 82490 37589 85243 74417 02913 27656 18093 77344 40307 07469 21120 19130 20330 38019 76211 01100 44929 32151 60842 44485 96376 69838 95228 68478 31235 52658 21314 49576 85726 24334 41893 03968 64262 43410 77322 69780 28073 18915 44110 10446 82325 27162 01052 65227 21116 60396 66557 30925 47110 55785 37634 66820 65310 98965 26918 62056 47693 12570 58635 66201 85581 00729 36065 98764 86117 91045 33488 50346 11365 76867 53249 44166 80396 26579 78771 85560 84552 96541 26654 08530 61434 44318 58676 97514 56614 06800 70023 78776 59134 40171 27494 70420 56223 05389 94561 31407 11270 00407 85473 32699 39081 45466 46458 80797 27082 66830 63432 85878 56983 05235 80893 30657 57406 79545 71637 75254 20211 49557 61581 40025 01262 28594 13021 64715 50979 25923 09907 96547 37612 55176 56751 35751 78296 66454 77917 45011 29961 48903 04639 94713 29621 07340 43751 89573 59614 58901 93897 13111 79042 97828 56475 03203 19869 15140 28708 08599 04801 09412 14722 13179 47647 77262 24142 54854 54033 21571 85306 14228 81375 85043 06332 17518 29798 66223 71721 59160 77166 92547 48738 98665 49494 50114 65406 28433 66393 79003 97692 65672 14638 53067 36096 57120 91807 63832 71664 16274 88880 07869 25602 90228 47210 40317 21186 08204 19000 42296 61711 96377 92133 75751 14959 50156 60496 31862 94726 54736 42523 08177 03675 15906 73502 35072 83540 56704 03867 43513 62222 47715 89150 49530 98444 89333 09634 08780 76932 59939 78054 19341 44737 74418 42631 29860 80998 88687 41326 04721 56951 62396 58645 73021 63159 81931 95167 35381 29741 67729 47867 24229 24654 36680 09806 76928 23828 06899 64004 82435 40370 14163 14965 89794 09243 23789 69070 69779 42236 25082 21688 95738 37986 23001 59377 64716 51228 93578 60158 81617 55782 97352 33446 04281 51262 72037 34314 65319 77774 16031 99066 55418 76397 92933 44195 21541 34189 94854 44734 56738 31624 99341 91318 14809 27777 10386 38773 43177 20754 56545 32207 77092 12019 05166 09628 04909 26360 19759 88281 61332 31666 36528 61932 66863 36062 73567 63035 44776 28035 04507 77235 54710 58595 48702 79081 43562 40145 17180 62464 36267 94561 27531 81340 78330 33625 42327 83944 97538 24372 05835 31147 71199 26063 81334 67768 79695 97030 98339 13077 10987 04085 91337 46414 42822 77263 46594 70474 58784 77872 01927 71528 07317 67907 70715 72134 44730 60570 07334 92436 93113 83504 93163 12840 42512 19256 51798 06941 13528 01314 70130 47816 43788 51852 90928 54520 11658 39341 96562 13491 43415 95625 86586 55705 52690 49652 09858 03385 07224 26482 93972 85847 83163 05777 75606 88876 44624 82468 57926 03953 52773 48030 48029 00587 60758 25104 74709 16439 61362 67604 49256 27420 42083 20856 61190 62545 43372 13153 59584 50687 72460 29016 18766 79524 06163 42522 57719 54291 62991 93064 55377 99140 37340 43287 52628 88963 99587 94757 29174 64263 57455 25407 90914 51357 11136 94109 11939 32519 10760 20825 20261 87985 31887 70584 29725 91677 81314 96990 09019 21169 71737 27847 68472 68608 49003 37702 42429 16513 00500 51683 23364 35038 95170 29893 92233 45172 20138 12806 96501 17844 08745 19601 21228 59937 16231 30171 14448 46409 03890 64495 44400 61986 90754 85160 26327 50529 83491 87407 86680 88183 38510 22833 45085 04860 82503 93021 33219 71551 84306 35455 00766 82829 49304 13776 55279 39751 75461 39539 84683 39363 83047 46119 96653 85815 38420 56853 38621 86725 23340 28308 71123 28278 92125 07712 62946 32295 63989 89893 58211 67456 27010 21835 64622 01349 67151 88190 97303 81198 00497 34072 39610 36854 06643 19395 09790 19069 96395 52453 00545 05806 85501 95673 02292 19139 33918 56803 44903 98205 95510 02263 53536 19204 19947 45538 59381 02343 95544 95977 83779 02374 21617 27111 72364 34354 39478 22181 85286 24085 14006 66044 33258 88569 86705 43154 70696 57474 58550 33232 33421 07301 54594 05165 53790 68662 73337 99585 11562 57843 22988 27372 31989 87571 41595 78111 96358 33005 94087 30681 21602 87649 62867 44604 77464 91599 50549 73742 56269 01049 03778 19868 35938 14657 41268 04925 64879 85561 45372 34786 73303 90468 83834 36346 55379 49864 19270 56387 29317 48723 32083 76011 23029 91136 79386 27089 43879 93620 16295 15413 37142 48928 30722 01269 01475 46684 76535 76164 77379 46752 00490 75715 55278 19653 62132 39264 06160 13635 81559 07422 02020 31872 77605 27721 90055 61484 25551 87925 30343 51398 44253 22341 57623 36106 42506 39049 75008 65627 10953 59194 65897 51413 10348 22769 30624 74353 63256 91607 81547 81811 52843 66795 70611 08615 33150 44521 27473 92454 49454 23682 88606 13408 41486 37767 00961 20715 12491 40430 27253 86076 48236 34143 34623 51897 57664 52164 13767 96903 14950 19108 57598 44239 19862 91642 19399 49072 36234 64684 41173 94032 65918 40443 78051 33389 45257 42399 50829 65912 28508 55582 15725 03107 12570 12668 30240 29295 25220 11872 67675 62204 15420 51618 41634 84756 51699 98116 14101 00299 60783 86909 29160 30288 40026 91041 40792 88621 50784 24516 70908 70006 99282 12066 04183 71806 53556 72525 32567 53286 12910 42487 76182 58297 65157 95984 70356 22262 93486 00341 58722 98053 49896 50226 29174 87882 02734 20922 22453 39856 26476 69149 05562 84250 39127 57710 28402 79980 66365 82548 89264 88025 45661 01729 67026 64076 55904 29099 45681 50652 65305 37182 94127 03369 31378 51786 09040 70866 71149 65583 43434 76933 85781 71138 64558 73678 12301 45876 87126 60348 91390 95620 09939 36103 10291 61615 28813 84379 09904 23174 73363 94804 57593 14931 40529 76347 57481 19356 70911 01377 51721 00803 15590 24853 09066 92037 67192 20332 29094 33467 68514 22144 77379 39375 17034 43661 99104 03375 11173 54719 18550 46449 02636 55128 16228 82446 25759 16333 03910 72253 83742 18214 08835 08657 39177 15096 82887 47826 56995 99574 49066 17583 44137 52239 70968 34080 05355 98491 75417 38188 39994 46974 86762 65516 58276 58483 58845 31427 75687 90029 09517 02835 29716 34456 21296 40435 23117 60066 51012 41200 65975 58512 76178 58382 92041 97484 42360 80071 93045 76189 32349 22927 96501 98751 87212 72675 07981 25547 09589 04556 35792 12210 33346 69749 92356 30254 94780 24901 14195 21238 28153 09114 07907 38602 51522 74299 58180 72471 62591 66854 51333 12394 80494 70791 19153 26734 30282 44186 04142 63639 54800 04480 02670 49624 82017 92896 47669 75831 83271 31425 17029 69234 88962 76684 40323 26092 75249 60357 99646 92565 04936 81836 09003 23809 29345 95889 70695 36534 94060 34021 66544 37558 90045 63288 22505 45255 64056 44824 65151 87547 11962 18443 96582 53375 43885 69094 11303 15095 26179 37800 29741 20766 51479 39425 90298 96959 46995 56576 12186 56196 73378 62362 56125 21632 08628 69222 10327 48892 18654 36480 22967 80705 76561 51446 32046 92790 68212 07388 37781 42335 62823 60896 32080 68222 46801 22482 61177 18589 63814 09183 90367 36722 20888 32151 37556 00372 79839 40041 52970 02878 30766 70944 47456 01345 56417 25437 09069 79396 12257 14298 94671 54357 84687 88614 44581 23145 93571 98492 25284 71605 04922 12424 70141 21478 05734 55105 00801 90869 96033 02763 47870 81081 75450 11930 71412 23390 86639 38339 52942 57869 05076 43100 63835 19834 38934 15961 31854 34754 64955 69781 03829 30971 64651 43840 70070 73604 11237 35998 43452 25161 05070 27056 23526 60127 64848 30840 76118 30130 52793 20542 74628 65403 60367 45328 65105 70658 74882 25698 15793 67897 66974 22057 50596 83440 86973 50201 41020 67235 85020 07245 22563 26513 41055 92401 90274 21624 84391 40359 98953 53945 90944 07046 91209 14093 87001 26456 00162 37428 80210 92764 57931 06579 22955 24988 72758 46101 26483 69998 92256 95968 81592 05600 10165 52563 7567 ---JettyHttpClientBoundary1shlqpw2yahae6jf-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt deleted file mode 100644 index aa49e327f1cc..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt +++ /dev/null @@ -1,9 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|240 -Request-Header|Content-Type|multipart/form-data; boundary=L8vdau8TpP0o-AYJDjCuYFQYnjB5gcHIFyap -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|1 -Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw deleted file mode 100644 index 641c1a148373..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw +++ /dev/null @@ -1,7 +0,0 @@ ---L8vdau8TpP0o-AYJDjCuYFQYnjB5gcHIFyap -Content-Disposition: form-data; name="pi" -Content-Type: text/plain -Content-Transfer-Encoding: 8bit - -3.14159265358979323846264338327950288419716939937510 ---L8vdau8TpP0o-AYJDjCuYFQYnjB5gcHIFyap-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt deleted file mode 100644 index 77ad18f68990..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt +++ /dev/null @@ -1,10 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|406 -Request-Header|Content-Type|multipart/form-data; boundary=u7tfLQaHJEHHUJjnVDbFdc_Oqz4jmkA25mgWd -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|2 -Part-ContainsContents|japanese|オープンソース -Part-ContainsContents|hello|日食桟橋 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.raw deleted file mode 100644 index dfe4e57ab497..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.raw +++ /dev/null @@ -1,13 +0,0 @@ ---u7tfLQaHJEHHUJjnVDbFdc_Oqz4jmkA25mgWd -Content-Disposition: form-data; name="japanese" -Content-Type: text/plain; charset=Shift_JIS -Content-Transfer-Encoding: 8bit - -I[v\[X ---u7tfLQaHJEHHUJjnVDbFdc_Oqz4jmkA25mgWd -Content-Disposition: form-data; name="hello" -Content-Type: text/plain; charset=Shift_JIS -Content-Transfer-Encoding: 8bit - -HV ---u7tfLQaHJEHHUJjnVDbFdc_Oqz4jmkA25mgWd-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt deleted file mode 100644 index 1ce9ca18e50f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt +++ /dev/null @@ -1,17 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|354 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryN7pYBoDaXhEcUl13 -Request-Header|DNT|1 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form-charset.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.021) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 -Parts-Count|3 -Part-ContainsContents|_charset_|Shift_JIS -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw deleted file mode 100644 index 5c77075588e9..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw +++ /dev/null @@ -1,13 +0,0 @@ -------WebKitFormBoundaryN7pYBoDaXhEcUl13 -Content-Disposition: form-data; name="_charset_" - -Shift_JIS -------WebKitFormBoundaryN7pYBoDaXhEcUl13 -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundaryN7pYBoDaXhEcUl13 -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundaryN7pYBoDaXhEcUl13-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw deleted file mode 100644 index b3c4ae8f72e0..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw +++ /dev/null @@ -1,13 +0,0 @@ ------------------------------117031256520586657911714164254 -Content-Disposition: form-data; name="_charset_" - -Shift_JIS ------------------------------117031256520586657911714164254 -Content-Disposition: form-data; name="japanese" - - ------------------------------117031256520586657911714164254 -Content-Disposition: form-data; name="hello" - -戆^ ------------------------------117031256520586657911714164254-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.raw deleted file mode 100644 index 64314612eccd..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.raw +++ /dev/null @@ -1,13 +0,0 @@ -------WebKitFormBoundaryDHtjXxgNUcgLjcKs -Content-Disposition: form-data; name="_charset_" - -Shift_JIS -------WebKitFormBoundaryDHtjXxgNUcgLjcKs -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundaryDHtjXxgNUcgLjcKs -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundaryDHtjXxgNUcgLjcKs-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.raw deleted file mode 100644 index 71dac77ca763..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.raw +++ /dev/null @@ -1,13 +0,0 @@ ------------------------------7e227e17151054 -Content-Disposition: form-data; name="_charset_" - -utf-8 ------------------------------7e227e17151054 -Content-Disposition: form-data; name="japanese" - -健治 ------------------------------7e227e17151054 -Content-Disposition: form-data; name="hello" - -ャユ戆タ ------------------------------7e227e17151054-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt deleted file mode 100644 index f085e29368df..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.5 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|370 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------114782935826962 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form-charset.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 -Parts-Count|3 -Part-ContainsContents|_charset_|Shift_JIS -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.raw deleted file mode 100644 index 921df609d8a7..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.raw +++ /dev/null @@ -1,13 +0,0 @@ ------------------------------114782935826962 -Content-Disposition: form-data; name="_charset_" - -Shift_JIS ------------------------------114782935826962 -Content-Disposition: form-data; name="japanese" - - ------------------------------114782935826962 -Content-Disposition: form-data; name="hello" - -戆^ ------------------------------114782935826962-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw deleted file mode 100644 index 9892c9c05feb..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw +++ /dev/null @@ -1,13 +0,0 @@ -------WebKitFormBoundaryvshQXGBfIsRjfMBN -Content-Disposition: form-data; name="_charset_" - -Shift_JIS -------WebKitFormBoundaryvshQXGBfIsRjfMBN -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundaryvshQXGBfIsRjfMBN -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundaryvshQXGBfIsRjfMBN-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.raw deleted file mode 100644 index 9a043e69d648..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.raw +++ /dev/null @@ -1,13 +0,0 @@ ------------------------------7e226e1b2109c -Content-Disposition: form-data; name="_charset_" - -utf-8 ------------------------------7e226e1b2109c -Content-Disposition: form-data; name="japanese" - -健治 ------------------------------7e226e1b2109c -Content-Disposition: form-data; name="hello" - -ャユ戆タ ------------------------------7e226e1b2109c-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.raw deleted file mode 100644 index ce14357da864..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.raw +++ /dev/null @@ -1,13 +0,0 @@ -------WebKitFormBoundaryHFCTTESrC7sXQ2Gf -Content-Disposition: form-data; name="_charset_" - -Shift_JIS -------WebKitFormBoundaryHFCTTESrC7sXQ2Gf -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundaryHFCTTESrC7sXQ2Gf -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundaryHFCTTESrC7sXQ2Gf-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt deleted file mode 100644 index f5e2236ce9b6..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt +++ /dev/null @@ -1,16 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US,en;q=0.9 -Request-Header|Cache-Control|max-age=0 -Request-Header|Connection|keep-alive -Request-Header|Content-Length|249 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryjJR29nbr1TDUu2yh -Request-Header|DNT|1 -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.021) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.raw deleted file mode 100644 index 618c30e3c987..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundaryjJR29nbr1TDUu2yh -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundaryjJR29nbr1TDUu2yh -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundaryjJR29nbr1TDUu2yh-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.raw deleted file mode 100644 index 5c8d5b471904..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------18591390852002031541755421242 -Content-Disposition: form-data; name="japanese" - - ------------------------------18591390852002031541755421242 -Content-Disposition: form-data; name="hello" - -戆^ ------------------------------18591390852002031541755421242-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-chrome.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-chrome.raw deleted file mode 100644 index 02e44b0913e5..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-chrome.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundarysKD6As9BBil2g6Fc -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundarysKD6As9BBil2g6Fc -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundarysKD6As9BBil2g6Fc-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-edge.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-edge.expected.txt deleted file mode 100644 index f51c4cc13991..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-edge.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|255 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e28636151054 -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-edge.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-edge.raw deleted file mode 100644 index b6a9a545c582..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-edge.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------7e28636151054 -Content-Disposition: form-data; name="japanese" - -健治 ------------------------------7e28636151054 -Content-Disposition: form-data; name="hello" - -ャユ戆タ ------------------------------7e28636151054-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-firefox.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-firefox.raw deleted file mode 100644 index 5c8def3fffcd..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-firefox.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------265001916915724 -Content-Disposition: form-data; name="japanese" - - ------------------------------265001916915724 -Content-Disposition: form-data; name="hello" - -戆^ ------------------------------265001916915724-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt deleted file mode 100644 index e4b4d8168e78..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt +++ /dev/null @@ -1,14 +0,0 @@ -Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-us -Request-Header|Connection|keep-alive -Request-Header|Content-Length|249 -Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundaryj1Xj6oPRT7sp3VPE -Request-Header|Host|192.168.0.119:9090 -Request-Header|Origin|http://192.168.0.119:9090 -Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html -Request-Header|Upgrade-Insecure-Requests|1 -Request-Header|User-Agent|Mozilla/5.0 (iPad; CPU OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1 -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.raw deleted file mode 100644 index f0d397577892..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundaryj1Xj6oPRT7sp3VPE -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundaryj1Xj6oPRT7sp3VPE -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundaryj1Xj6oPRT7sp3VPE-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-msie.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-msie.expected.txt deleted file mode 100644 index d8ddc61a07ec..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-msie.expected.txt +++ /dev/null @@ -1,13 +0,0 @@ -Request-Header|Accept|text/html, application/xhtml+xml, image/jxr, */* -Request-Header|Accept-Encoding|gzip, deflate -Request-Header|Accept-Language|en-US -Request-Header|Cache-Control|no-cache -Request-Header|Connection|keep-alive -Request-Header|Content-Length|255 -Request-Header|Content-Type|multipart/form-data; boundary=---------------------------7e21df392109c -Request-Header|Host|localhost:9090 -Request-Header|Referer|http://localhost:9090/sjis-form.html -Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko -Parts-Count|2 -Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-msie.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-msie.raw deleted file mode 100644 index b60882cec826..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-msie.raw +++ /dev/null @@ -1,9 +0,0 @@ ------------------------------7e21df392109c -Content-Disposition: form-data; name="japanese" - -健治 ------------------------------7e21df392109c -Content-Disposition: form-data; name="hello" - -ャユ戆タ ------------------------------7e21df392109c-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-safari.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-safari.raw deleted file mode 100644 index 82475faa9e71..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-safari.raw +++ /dev/null @@ -1,9 +0,0 @@ -------WebKitFormBoundarytsFILMzOBBWaETUj -Content-Disposition: form-data; name="japanese" - - -------WebKitFormBoundarytsFILMzOBBWaETUj -Content-Disposition: form-data; name="hello" - -戆^ -------WebKitFormBoundarytsFILMzOBBWaETUj-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-jetty-client.expected.txt deleted file mode 100644 index a0ec6edc7ed8..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-jetty-client.expected.txt +++ /dev/null @@ -1,10 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundaryny8fndkswj5ot6hx -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|2 -Part-ContainsContents|japanese|オープンソース -Part-ContainsContents|hello|日食桟橋 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-jetty-client.raw deleted file mode 100644 index eb7b56fcc396..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-jetty-client.raw +++ /dev/null @@ -1,11 +0,0 @@ ---JettyHttpClientBoundaryny8fndkswj5ot6hx -Content-Disposition: form-data; name="japanese" -Content-Type: text/plain; charset=Shift-JIS - -I[v\[X ---JettyHttpClientBoundaryny8fndkswj5ot6hx -Content-Disposition: form-data; name="hello" -Content-Type: text/plain; charset=Shift-JIS - -HV ---JettyHttpClientBoundaryny8fndkswj5ot6hx-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt deleted file mode 100644 index 42010b4fa30a..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|798 -Request-Header|Content-Type|multipart/form-data; boundary=z5xWs05oeiE0TAdFlrrlAX5RSgHrHzVcgskrru -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|4 -Part-ContainsContents|and "I" quote|Value 1 -Part-ContainsContents|and+%22I%22+quote|Value 2 -Part-ContainsContents|value"; what="whoa"|Value 3 diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw deleted file mode 100644 index 487ea39b98df..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw +++ /dev/null @@ -1,25 +0,0 @@ ---z5xWs05oeiE0TAdFlrrlAX5RSgHrHzVcgskrru -Content-Disposition: form-data; name="and \"I\" quote" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Value 1 ---z5xWs05oeiE0TAdFlrrlAX5RSgHrHzVcgskrru -Content-Disposition: form-data; name="and+%22I%22+quote" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Value 2 ---z5xWs05oeiE0TAdFlrrlAX5RSgHrHzVcgskrru -Content-Disposition: form-data; name="value\"; what=\"whoa\"" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Value 3 ---z5xWs05oeiE0TAdFlrrlAX5RSgHrHzVcgskrru -Content-Disposition: form-data; name="other\"; what=\"Something\"" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Value 4 ---z5xWs05oeiE0TAdFlrrlAX5RSgHrHzVcgskrru-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt deleted file mode 100644 index c246ce67c29e..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|737 -Request-Header|Content-Type|multipart/form-data; boundary=B8x_673_DRSeYGTpUMgof-qN1nircWQA -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|3 -Part-ContainsContents|text|text default -Part-ContainsContents|file1|Content of a.txt -Part-ContainsContents|file2|Content of a.html -Part-Filename|file1|a.txt -Part-Filename|file2|a.html -Part-Sha1sum|file1|588A0F273CB5AFE9C8D76DD081812E672F2061E2 -Part-Sha1sum|file2|9A9005159AB90A6D2D9BACB5414EFE932F0CED85 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.raw deleted file mode 100644 index b8fee37ca7ed..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.raw +++ /dev/null @@ -1,23 +0,0 @@ ---B8x_673_DRSeYGTpUMgof-qN1nircWQA -Content-Disposition: form-data; name="text" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -text default - ---B8x_673_DRSeYGTpUMgof-qN1nircWQA -Content-Type: text/plain; charset=UTF-8 -X-SHA1: 588A0F273CB5AFE9C8D76DD081812E672F2061E2 -Content-Disposition: form-data; name="file1"; filename="a.txt" -Content-Transfer-Encoding: binary - -Content of a.txt - ---B8x_673_DRSeYGTpUMgof-qN1nircWQA -Content-Type: text/html; charset=UTF-8 -X-SHA1: 9A9005159AB90A6D2D9BACB5414EFE932F0CED85 -Content-Disposition: form-data; name="file2"; filename="a.html" -Content-Transfer-Encoding: binary - -<!DOCTYPE html><title>Content of a.html. ---B8x_673_DRSeYGTpUMgof-qN1nircWQA-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-jetty-client.expected.txt deleted file mode 100644 index 7e0b528d284f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-jetty-client.expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary1e87p8a551psw1al -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|3 -Part-ContainsContents|text|text default -Part-ContainsContents|file1|Content of a.txt -Part-ContainsContents|file2|Content of a.html -Part-Filename|file1|a.txt -Part-Filename|file2|a.html -Part-Sha1sum|file1|588A0F273CB5AFE9C8D76DD081812E672F2061E2 -Part-Sha1sum|file2|9A9005159AB90A6D2D9BACB5414EFE932F0CED85 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-jetty-client.raw deleted file mode 100644 index 534054254316..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-text-files-jetty-client.raw +++ /dev/null @@ -1,20 +0,0 @@ ---JettyHttpClientBoundary1e87p8a551psw1al -Content-Disposition: form-data; name="text" -Content-Type: text/plain;charset=UTF-8 - -text default - ---JettyHttpClientBoundary1e87p8a551psw1al -Content-Disposition: form-data; name="file1"; filename="a.txt" -Content-Type: application/octet-stream -X-SHA1: 588A0F273CB5AFE9C8D76DD081812E672F2061E2 - -Content of a.txt - ---JettyHttpClientBoundary1e87p8a551psw1al -Content-Disposition: form-data; name="file2"; filename="a.html" -Content-Type: application/octet-stream -X-SHA1: 9A9005159AB90A6D2D9BACB5414EFE932F0CED85 - -<!DOCTYPE html><title>Content of a.html. ---JettyHttpClientBoundary1e87p8a551psw1al-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt deleted file mode 100644 index 446b69d34fc5..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|475 -Request-Header|Content-Type|multipart/form-data; boundary=yRxfRSltW63lJPc9oHOOVyCn-SmDG6i4Ts9M4E6 -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|2 -Part-ContainsContents|こんにちは世界|Greetings 1 -Part-ContainsContents|%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C|Greetings 2 - diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw deleted file mode 100644 index 938bdbdce6ba..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw +++ /dev/null @@ -1,13 +0,0 @@ ---yRxfRSltW63lJPc9oHOOVyCn-SmDG6i4Ts9M4E6 -Content-Disposition: form-data; name="こんにちは世界" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Greetings 1 ---yRxfRSltW63lJPc9oHOOVyCn-SmDG6i4Ts9M4E6 -Content-Disposition: form-data; name="%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C" -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Greetings 2 ---yRxfRSltW63lJPc9oHOOVyCn-SmDG6i4Ts9M4E6-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt deleted file mode 100644 index bc9e8e69dab7..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary9iv9jofnq5dkzmgl -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|2 -Part-ContainsContents|こんにちは世界|Greetings 1 -Part-ContainsContents|%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C|Greetings 2 - diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.raw deleted file mode 100644 index 4188d3e81d2c..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.raw +++ /dev/null @@ -1,11 +0,0 @@ ---JettyHttpClientBoundary9iv9jofnq5dkzmgl -Content-Disposition: form-data; name="こんにちは世界" -Content-Type: text/plain - -Greetings 1 ---JettyHttpClientBoundary9iv9jofnq5dkzmgl -Content-Disposition: form-data; name="%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C" -Content-Type: text/plain - -Greetings 2 ---JettyHttpClientBoundary9iv9jofnq5dkzmgl-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt deleted file mode 100644 index 8b7f3212c670..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt +++ /dev/null @@ -1,10 +0,0 @@ -Request-Header|Accept-Encoding|gzip -Request-Header|Connection|close -Request-Header|Content-Type|multipart/form-data; boundary=JettyHttpClientBoundary1evz7ehqg8tvo10h -Request-Header|Host|localhost:9090 -Request-Header|Transfer-Encoding|chunked -Request-Header|User-Agent|Jetty/9.4.9.v20180320 -Request-Header|X-BrowserId|jetty-client -Parts-Count|1 -Part-Filename|whitespace|whitespace.txt -Part-Sha1sum|whitespace|353E2CCDDE1069706B950414B230B6C047F98491 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.raw deleted file mode 100644 index 64f39f6ee0f9..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.raw +++ /dev/null @@ -1,209748 +0,0 @@ ---JettyHttpClientBoundary1evz7ehqg8tvo10h -Content-Disposition: form-data; name="whitespace"; filename="whitespace.txt" -Content-Type: application/octet-stream -X-SHA1: 353E2CCDDE1069706B950414B230B6C047F98491 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---JettyHttpClientBoundary1evz7ehqg8tvo10h-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt deleted file mode 100644 index 9fecae5916cd..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt +++ /dev/null @@ -1,12 +0,0 @@ -Request-Header|Accept-Encoding|gzip,deflate -Request-Header|Connection|keep-alive -Request-Header|Content-Length|1870 -Request-Header|Content-Type|multipart/form-data; boundary=V9oY7Ug2J-n4sFXLWdb7yd2LtU0hdK36ejhKYh -Request-Header|Host|localhost:9090 -Request-Header|User-Agent|Apache-HttpClient/4.5.5 (Java/1.8.0_162) -Request-Header|X-BrowserId|apache-httpcomp -Parts-Count|4 -Part-ContainsContents|zalgo-8|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ -Part-ContainsContents|zalgo-16|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ -Part-ContainsContents|zalgo-16-be|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ -Part-ContainsContents|zalgo-16-le|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw deleted file mode 100644 index 2cd8c76db094..000000000000 Binary files a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw and /dev/null differ diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64-long.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64-long.expected.txt deleted file mode 100644 index 2b1d5ded0601..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64-long.expected.txt +++ /dev/null @@ -1,4 +0,0 @@ -Content-Type|multipart/form-data; boundary="JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8" -Parts-Count|1 -Part-Filename|png|jetty-avatar-256.png -Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64-long.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64-long.raw deleted file mode 100644 index 2e2b49915681..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64-long.raw +++ /dev/null @@ -1,8 +0,0 @@ ---JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8 -Content-ID: -Content-Disposition: form-data; name="png"; filename="jetty-avatar-256.png" -Content-Type: image/png; name=jetty-avatar-256.png -Content-Transfer-Encoding: base64 - -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 ---JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64.expected.txt deleted file mode 100644 index 5d4a189b8dc5..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64.expected.txt +++ /dev/null @@ -1,4 +0,0 @@ -Content-Type|multipart/form-data; boundary="8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp" -Parts-Count|1 -Part-Filename|png|jetty-avatar-256.png -Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64.raw deleted file mode 100644 index 514a6a1ed3cb..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-base64.raw +++ /dev/null @@ -1,389 +0,0 @@ ---8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp -Content-ID: -Content-Disposition: form-data; name="png"; filename="jetty-avatar-256.png" -Content-Type: image/png; name=jetty-avatar-256.png -Content-Transfer-Encoding: base64 - -iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz -AAAI3AAACNwBn+hfPAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURB -VHic7X15fBRF2v+3eyYnOSCQcEMQQUBEhV05xQvvdxHB1d/iq6is1y6or7rgCgqLiJyut+uxrsfe -C57LKaIoCCr3KZBwyJFASICQkJDM8fsjdNJTU/VUdc/0HGG+n09/+pyequ56vs9R9VRrw4cPRwIJ -JHB2Qo92ARJIIIHoIUEACSRwFiNBAAkkcBbDHe0CRBrz5s3Tol2GSGPEiBH+aJfBQDSff7ifgxN1 -ifS70hprEPBsFHS7CLXRJZ519BDqu2sUBBADDdDO/8eMVk6g8UGVGOKWABwQ+miTiBWcbeTBezdn -2zMICSJCiCsCCJPQOyXoqvd1suHGg1DEEtFafV7RLntY3q+ZDOKCAEIQfDu/i/ZLpmCnAUSLFGL5 -OTY22H7HMd0LYFPwVX5j9b6RbsyiFyoqB9UA2N84RQix/kyB8Nc9knVw5B3HJAHYEHzZ9aGeD/V6 -GdgXJru/7HrVxhKKQFh5Bk5dy4MVQXEadv+PVwcr5K/8jmOOACwKP3Wt6Jyd34R6rQjGy1G5l/lF -ygRetQGoNConrLBwEK5VK4mHWI0BUP9j9V2T52OKACwIv1Xh5h23QxBWrlGBBrVG6Bf8p4hARAKs -2uDDaRGFi3DD8VurlpYTZbCLcLxrjT0XEwTgkOCzx1RJwKkGK7unVW3EIwVeIwmVDESw+pxCIdxQ -YcXSsgOn60ApAKttwHzOH3UCUBR+1cYT7n3ZcZVrrWpdEXPL7sM2BitkIPpfXvlUz4WDcGXnY6Xb -MxLtg4XsffPedRARRJUAQhB+SnBVz9klA9k5q9cK2ZlzXLWxWCUD9pwK7Fhd4SZcK7GOaPV+WD1v -RwHw3rcSEUSNABSEPxTBD9c2dYw6LoOKJha9QD9nW/ZfVslABKfIWHRvK1Dxf8NJAk7HNsJhGVBE -4AeiRABhEH4r2+xadp2oDOEiAZE/xzvHe4FWSED0e/O++ZgVhJNkQyUDK1YU77hVOKUkKG1tlcBk -RKABUSAAG8KvokUoIZetZcdE+6JjKhC9SD+zLXqBvMYQDheBgh1SViVflfvzIIuMi+pohwhUy2fH -MqDKK3rvvPctCgoKiSDqQUAGVk18WaNTJQErDZW3bxe8F0htmxsBu5b9j1QbKCIUobf6nKmyqUbG -VYTLClTKqEoCVDl4ykBEAiptgfvbiBKARPvbFX5VwbdDDNQ2dYwC7wWpCL5oHQ5SoMqmqvlDXfP+ -S9UCoI7xnmeo1o/VfdExURlkhM2uqfvy2kb9uYgRQBiE36rgW91WWfPKKjrGg6rwWxV8VQ0hK5fq -OxI9F1Uypta8/5PBqiVl3lf9H6sKivotD6I6UNYfBMdU/ityFoDDws9uh7LPuydVLtG+CHZMfpHw -i66xGzSSQfW9WCFbu1aAFc0vIwBVqLSFUEjMgJ12wCME3n2DrIFoxwDsCr+KUMuOWyECXjlEdZBB -henZtUz4eRaBKhGoakHZu7FKvLxt3n+pQNWForYpWBV+u3VRbQt237X5fyJjARDa36rwyxqbVeGn -ruVti8oo2mehov3tCD27GGWx2zhEYOuu8j5UjoGzZrcpqAq/HUvAShuVHZNBRfOrtAPz/7LHzGQf -ExaAATvaRVXAdYVrVLWVqKyiugByc1VV+K0uRlnCRQRW3ovqe+Ldx7xWgVWhd8ICcILIwtEepP/p -KAEoan+7wq+yiIRfRgqi/6bKztsHaAJQMfWsLj6IG4FZ+I1tFUJg6xzKOwkHyYIps4r2VPkNC7uC -LyIymXIIlxLwCepj3K++HNGwAGSkYFf4WaHWFc852UjNoBqfFTOPFXD2mCa4JhQrIBRCtkO25rUM -qmTKO8du8yB633ZJgAeV9qDSFgzB1wXHzf+hAQ4SgMVEn1CEnyfoqsdUyYBXJvOaVycDFMuzax4B -sC9ZZ4750CDQxnEZCahaASKtFwoZqzxn9r9FsCr84SAAWVul1iLI2oJI8Nn3DuYaAzrnmB9wiAAs -mv52hZ8ScvOaOheOBqqqqQB+w5NpfR7Lm0nA3Ag0WCMB8++peoRCxqqEAM62DFYEXkYWPLDtVaWt -sufZ+7DgaX+eMPPeGSv44PyeJYIAayCSLgBP+GXX2BF8q9uqZADONq8u7D5lAagwPqvtdWZtFmBW -8MH8lgX7Wx6sCr8KMfOeNTjbbBmM+rDbsmfKOye6F/t/5n1eWWVkwLsfC1k7MGtw3rtm17x2wi1L -tHsBZA9WVfjZbd3CcVUiYMtmLj+7zYLS/OZtSvDZtfHCzURgrNkGQVkE5sYkglXhD8czBsRl4mlN -0bYVEuDVm13LCECkIHh1ERGYqC3wyJ591+y9WRIIIISwE4DA/OcJikiIVIWfEm7Zwv5ORVupNlKR -tjLv2xV+dttMBMYiahjU/2mmc7y6qAq/HeuLesZsOdgyyrS9KgmY7yd6n5TAy9qGinJQsQLN79v8 -nlnhZ+vGkkB9eaJtARgwPzT2GK/BqQi/S+GcChGoNFLqBRtQZXtK4/OEn7fwGgb1v8ZxlcZPCb+q -JcYjdJEQiaBKpnasAJHCUiEBOwTAKz+rBFiLj33P7H8YQm/eDypPJAhA9DCNNXue94BVzH1W4F0K -27JGShEBrz4UVBos76XLhN4rKB+7sNYATzBYUA3dqhVGka152/x/FFSFXnQdew9evdmyqDxnXh1E -dZHVQcXiEylOMNfqzDEAYR4IFMKc/ioPlecCiIRbtFYhA1USAGdt3rZi/qua/F7whZ9HBCwoEuCV -l60fj4xVhJ99xjwikBEA75laIQCKFHh1FymqSBIARf68d83+B1snlgx8QGSHAouERUYEIsGnhF9l -W9UakBEAr6GawTbaUIRfRyAR6KZtlgjY50m5Amw52fpYEX7KElN9xux/m8ETXpkGlbkC5vtZ1f4y -C5FSijJLkBJ+83um7m3eDyqb0wQgKiB7XPagVbQMK+gu4rgqCVAEoPqSAXmjFfn85sUs/Kzgs42C -XbNEwFoB5rKZQTV4FaG3Y22Fqjllwq9CfOb/lml7UduwQmR2hd8ruDdbLz8aXADAZA2EjQAUc/5l -2t58nejBqmh8K4sVLUWVma2fARWNpeLr66a1mQSMMogaBY+szJFkkTCoan8rLhhFAjIBYstnRfhl -cQ/KBQiFAFSITKUtsFYe+569CARbRx2BFkD94qQFIKo0dVz2oGWmpwt1gU1WyIOOHTt2LGXOnDk9 -169ffw4Al3YGuq7Xb2qapgGAZoKxb14HVOLMMb/fH6RZjGO8tQg+n893Zm3e9/l8Pr/P5/N16NDh -wJw5c1bm5uaeRjAhsM/b3A3EiwPI3olM+FXcLRcAfefOnU1eeOGFi/bs2dMagKbretAz5T1f83Nl -nl/9oTM7fgD+Zs2aHe/WrVvR6NGjC9q3b1/NqbOs7uZtVtgD9gsKCpq8+OKLvXbv3t2SLbt5n6qD -+dWb2oCx+Px+vy87O/tY165d9z/88MNbOnbsyNZJ5OpwSUAbPny4oP7WwLEAeNrevE2xKWXqU5re -zdmuP1ZYWJgxceLEQT/88MPPf/rpp161tbWpYal8lJGUlHSyS5cuX956662LJk2atA11wm8svOAh -5Rsb4Fljdlyw+mNLly5t8cILL1y6YcOG3kVFRd18Pp8r3M9ChIyMjJIHH3zwjZkzZ64HbQGwWlsk -8DoA7Ysvvmjx8ssv91u3bt2FBw8e7BrJOqWnpx8aOXLkrLfeeus7BL5zLwAPGt69sC2EhQAkg3+o -ByozLynTUib0AQRQUVGR0q1bt6cOHjzYK+QKxzA6der0+e7du6chuEHw3AorFoAKIQvJecWKFc2v -v/76ZysqKlqEucqW0L17928++OCD9/r06VN+5pAo9mGshQTwzTff5Fx//fVPVVZWNnO63BQ6duy4 -6O23335xyJAhpQgkAJ7wB7QFnX/LkGHVzAfkD51nfqoQghuAe8CAAQ82duEHgD179lz9i1/84kbY -i4Wwz5ZaWLJ1A0jiLfv3788YPnz4E9EWfgDYvn37pYMGDXp+3bp1OWgoM1sHYV1gqtOIESP+L9rC -DwD79u277oYbbvjH0qVLc0DHslgSg1MEYEAWBDHOqbgEMt+TbZz1yzXXXHPr5s2brwxnxWIZCxcu -HPvKK690Ap8UVZ6hjAR4ws9bkqqrq1OuuOKKh0tKSjo5XnFFVFdXZ40fP/46KAo7u5w+fTr1qquu -eqCkpKR9NMrPQ21tbdNx48bdArHgcxenCcAMXoxAxd9SCfwJG+Xrr79+7ueff36bM1WKTXi93pQJ -EyY8XV5engJ17a9qKYjcLJ4l4L799tuvKywsvNj5WlvDihUrhhQXF6cj0AJgCYFLDqNHj75q165d -PaNScAJbt24dsWfPnlTw5YZrdTtBAKranr1eZglQfqexH2T+//Of/xwgKVOjRHl5ef7XX3/dHPxe -EatEYBZuoZsFRohOnjyZumTJkusjUF3LqK6uznjssccuA1/ghe5AZWVl6meffRaT1mRNTU2z0aNH -3wh+96qxDdOx0AlAYfIPq/EAlaizzF+tb6g7d+48337t4hv79+/PRni0vqr5HyBEjz/++MCKioqc -CFTVFpYvX94XFv3/CRMm/Ly8vLxpdEosx6ZNm66G3PyHsY7UUGD2j1V6BmRWgLSBlpSUpB05ciSf -Ktj9LZPR1B2fBsLycg9Wn2THgDSgpKQkC3XPwgD7vHl9xuw1ZjIWEUeQW+Dz+ZLmzZt3HVX+pm4N -97dMVqmqLRTV+PB+Sa3wfLNmzU6iTrDNMNc/QIP6fD7XP/7xjyuo/4x2ndLT08sQLDfm8R8B8hfp -dGArpj/Ph7FiAbg/+OCDzj6fT1jHDJeGlzqlwhWf8o+bfxQLPwCUlpZmooHkNQQODjIahqgbkEe8 -MuGvf/aTJk26uLS0tDVVvt+0TMaUDilkHULB+H3V5PkOHTocRbASFCqfGTNmdD9y5Egedc9o1yk3 -N/cAFIJ/cMgC4Gl22XUUEbA+jKwf2uynur7++uvzqML2zXDFrfADwCpC+wNAUlKShgYLwCz85rRS -0SAg9j2oan83ANe77757LVW2NB0Y09o5TXnc48ebh8WaEgC6du1aikAZoKwf7a233hpM3S8W6tSu -XbuD4Jv7bOwNCNUCsDDzr9AHIa6hBJ9qkPWNcfv27V2ogg3MdFGnYxo7q3046hGN3wEA+O+88849 -CHQBgODnKxoNp+p6BfUGvPbaa10PHDiQTxXurrxk5CU5x76vH67BSS/5fNC7d28eAXDb4Lvvvttx -z5497aj7xUKdevXqdQC0vDlqAahCxEw8rS8jAe7i8/ncP/30U2eqEAOy4pcAvi2ntX+zZs2KevXq -VYXgBm7OF9DBjwGoEgA3IPjKK68Mocrm0oBH2zinKat9wMtFNeQ1OTk5x2677bYjkBOADkB74YUX -BlD3i4U6paenFz3xxBO7oKZ0AYSXAILMC8l1Klpf5AaYu/+4DfTTTz9tW11dnS4qrEurcwHiFd+e -9JDnzznnnALwhd/YpmIALAErm/8fffRRu+3bt3ejyvbL5knolOLcEJR3S2pwpJbWlCNHjlydnJxs -1I10QxctWpS3adMmUpnEQp0uu+yyeU2aNDEuUjJFnLAAWNPevC1iIooMeIQgdQEWLlx4LlXIC9Jd -yIzjAMC3Ev+/T58+hvnPE25zirG5J4AnCJbM/+nTp18JSeP7nYOa0usHnj9Ea8qMjIxTU6dO3QJF -//+5557ry0nuDEC065SSknLi7bff/hxi358re5FwAdjgA2X+q/r/UhLYsGEDydjx7P+XevzYUeUj -rxk2bNhuNPj/5mdsdgF4yUCidyDV/qtWrWqxZs0aMt/i2qZuXNjEuWc/t7QWu6vpZzNixIi12dnZ -AP/5BBDAunXrslesWNGVul8s1Kl///6ftWnTxhwhdNYCsDj/nwEV859lYBkZuDhrV0FBQSeqIAPi -mABWnfQK0/cAID09veL6668/huD3a55DkMoG5MVfpAQwadKkwT4fnWA2rq1zmhIAZsk1Zc3UqVM3 -ocE64lmp9XWfPHlyn1ivk9vtrnrxxRcX2Ll3uCwAFf/fjvlvFnRVEnBt2bIlu6ysjMw8i+sAoMT8 -79y5814Emv/mZ2qQgDkGwIIlAF53a4ALsGvXrqyvvvqqN1Wun2e4cFmWc0bn58c92FBJP5sbbrhh -S7t27TwIJoCgtrd37960xYsXd6fuFwt16t2799JevXpVmg5RyjngfTs1DsDYZs183jnetarugAsc -DTV37lzS/O+QoqN9snMBG6chCwBedNFFP0H8bnkxAN41VgjAPWHChAG1tbXsqLoAjG/r3AAZAJgh -15TeZ555ZiOCydFYB7S3yZMnX1hTU0PKSLTrpOu6Z9q0af9lDtMBCxOiMRKQIgme+a8aB6hfVq9e -3WjN/xo/sKaC1ghDhgzZj+AhwMbCmxAEgmuVugBLSkrS5s+f/3OqTOel6Ria41xzW1PhxVcnaGK8 -/PLLd51//vnVqKuPGUHtr6ysLGnu3Lk9qPvFQp169uy54qqrrirjnOLNQRkEW6UP0f83tmXa32z6 -y6yBgMa5ffv2fKog8UwA6yu8oOJBSUlJnltuuYXq3w4nAbgBuJ5++uk+p06dIqdXe7xNSpDUhRMz -DtKaUtM0TJ48eRMahJ80/5999tnulZWVpHqPdp0A+J988snPINb47PEgUnC6G5A9JhJ2EOdlFkDA -cuzYseQDBw60oQoYzz0AKyX+f35+flF6ejrAJ3crBCByAQJSgauqqpL/9a9/9aXK1CZZw+25pHcQ -EnZW+/BJGT1Etm/fvnsHDhxYjmDtDzDtrbq62vXee++RWaSxUKcuXbqsu+222w6d2aXmeBROghoO -AuAF93gCbocYrJKA69///nc+NTFjpkvDBQ522TgNmf9/4YUXHoQ4wYUVfvZjIcb74AVduS7AtGnT -eh47diyTKtPDrVOQbMdmVMScg6dBd5IBTzzxxGbwYx5B7e3555/vXFpa2oS6XyzUacyYMYbvT1kA -LBEEHI9kOrCxthIA5LkAoh4BFwB9+fLl+VRB+mW6HDXbnIasB2Dw4MHFUCcAOxZAvfD7fD73O++8 -cwlVnqZuDfe1dE5THqrx4wMiPRYAevbsWXzTTTeVItjiBJj25fP59DfeeIPU/rFQp/bt2+946KGH -CiCeElwUAwggBMsEYNP/50FF66tq//pA4ObNmztSfxrP/n9BtY8cDqppGm6++ebD4AcAdTTMCOtH -YBcgr7tQagG88sor5x46dKg5VeYHWyY7OuLypaLTqJHEvP/v//5vK+gej/r6vv322+1++umnbOp+ -sVCnu+66y+j3pwhAtoRsAfDYlN23o/2p4J+QFHw+n6uwsLADVeB49v9l2r9t27bH2rVr50Xde2Wf -sejDoLw58UUuQEAc4NVXX/0ZVZ5UHRjrYHrsCa8fb0jSY/Pz84/dc889RWh4DlT3n/7iiy+Skf9Y -qFNubu6BKVOmbIL1z58FBQWdGAgkCu7xfsN9Ccy26mAgfeHCha2qqqqE0WiXBlwS1wlANAH06tXr -MAInADHWhuAbg39UJwIRuQCuf/7zn+127txJTvhxV67D6bHF8vTY3/72t9vAb4vs89E/+uij3G3b -tpEDyGKhTrfddtsiWNT0onORygUw1lZjAJRJGrQsXrw4nypIr3QXMuI6AYgOAA4YMOAoAs1/INj8 -5/n/vC4xkgDmzJlDjvqLhfTYli1bVj788MP7oab9tVmzZpGj/mKhTtnZ2aWzZs36Hg3vj/26tIpV -4EgQ0IpksS/AvC0TfiEZrF27ljT/B8Xx8N9jHj+2n6Ljwtddd50xwQX73MyfFpe5AFQMQAfg+vLL -L1vInvUtzZNwTqpz4db3SmpwWJIe++tf//rHpKQkQGwB1C8rVqzIXr16NWnRxEKdhg4d+nlqaipL -5ux7FW2D3bZEABYDgHb9f5G/zyOCAALYsWMH2SjjOQC4WpIA1KxZs+o+ffoYE4CYnyMvAYgXAARo -Aqi3AKZNm3ahLD12XJTTY7Oysk6PHz9+D8SuaEA9p06d2i3W65SWllYxZ86cFRALOLtQ34AM2QWg -/HrK/7dq8lPmf/01mzdvziotLSU/0zQgM1oTIIUOBf+/DMHCb352ogFAlghgy5YtmV9++eU5VFmu -djg99sOyWhRK0mNvv/32XZmZmebZcM0IqOe2bduaLF26lPzKTyzU6eqrr/7yzFegWa3P++ajkhUQ -zoFAsmtY7S86LyMCbuP8+OOP86kCdEzR0dbJkRsOY6XE/+/Xr5+R/st7TrzuPzsEoE+ZMqWn1+sl -H+R4BzUlAMyUDJFNTU31PPXUU4UQt82Aek6ZMqVLrNcpKSnp9KxZs76CdYEnF6dVoshKMNaqmp/X -GAPO7du3j/xYQzyb/7V+4AdJAtCVV155AnwCEEX/WQLgvZeAZ3/gwIG0Tz/9lMy0/FmGC5dnO9es -lp7wYL0kPXb48OF7WrdubfSlaSDqePDgwVSZ8oiFOg0aNGhl165dK8D/yrMoFiDtGVCulcT/tyLo -vGMiEmAFXaiZmjZtepoq/4VNXDgh6V6JVayv8IKaACglJcV32WWXVaJhfjsV7W+ZAKZOnXre6dOn -SSYd7/DkGLIEGbfb7Zs0adIu5jBreZp9/86xXieXy+V99tlnvwAt9LJjYe0F4Jny7MNlz4M5bzUO -INT+APScnBzyKT6xrxpPSD6qEK/w+/3Iz8+/9EwQy28cQ4NwQ3SMgKZpda/P7Xb7+/fvX7Jo0aK2 -1A+6puq4Kce5IbJrK7z4UpIee+211+7v2rVr1Zldsv2Vl5e7//a3v3Wi7hcLderdu/ea/v37l6FO -mM09ADJXIOIugKrAy85bsQx0AFqLFi1IC6Axo6amRi8uLibTcUPFvHnzyOQYAHisrbPpsTMlUXJN -0/DUU0/tNHYRHN8w1hoAfcaMGfknT54k1Xu06wTAP3HixM8hFnrZQsYFlAggDPn/7LFwaP+A/by8 -POmTTMA5tEnWcIeD6bG7qn34qJQeIjto0KCivn37njQdEiqbmpoa/e233ybjGbFQpx49emwZOnRo -EQKFmmcFUNpf5PqFxQIIt/8vMvVFcQG9pqbGNXny5EvDUJcEbOIhp9NjD9WopPzuFJwKansvv/xy -uyNHjqRR94uFOj3yyCOfo07gjUVGBFa6A21ZN5SZD85a9Fu7Zn+QZTB06NBrNm7cSLJ5As4h26Xh -fgfTY4tq/PighDbwLrzwwqM33HCDMTUWFZvS/H6/9uqrr5LfjYiFOuXn5xfee++9hbCm/S3FA5wY -CMTb51kAvPMiF0Do/69fvz57yZIl5Hx0CTiLB1s5nx57WqIqH330UVHkP2j7vffea7Vnzx5yEpNY -qNOvf/3rpWgQelXtb2ksgNQCCNP8f+Ztu0E/rv//5z//WTqEMwHnoGvRT4/t1KlT+Z133nlYcDpI -yTz//POk9o+FlN+WLVsemjBhwhYECroXtPBbJYKQA5wy/998zI7gU0FBDYC+Zs2ajiHWIYEQ0DJJ -Q0sH02P/VFyDcsn4jbFjx+4E3b1Z34Y+++yznM2bN+dQ9xuVmxz1Oo0cOfILBAq8VeGXuQJAmLsB -zaY975jMPZBpe27//44dO8gx3C91SsWNzZwd8HhXQRW+Ib7W+0jrZEc1ipM47Qd6baiA6EvkWQ6a -yad9Sim/p377298eFJwOanMzZswgtb/TKb8qdcrOzi579tln1yDY9JeNAZBpfTBrywRAaXf2OjIQ -Y3MJIIG1a9dmHz9+PIsq8P80c6ODg19t9QHYWEk7c9c2daOjg2VwEqtPeoXCD4AcoRgq3iupQbEk -Pfbee+8tSE5OZhs3wGlzq1atyvr2229bUvcbkZOEzg6n/MrqdPPNNy9LS0urRaDgq2h+2ci/AOEH -QncBeBCRg13fn7etAdA//fRT0vxvl6w7KvwAsKXSS5pzOoC+cZyHIJuGvJ1D/WQ+yNNjs7OzT48b -N24fxOZ/QJuaOnVqZ2nKr4PDflXqlJ6eXjFr1qxVoIN/FCGwQ4FJIiClw0YAUOb/866T+f/C7r/V -q1d3oAoTiQQgmYBc0MTlqJnsNGSzEDk1x+KHpbUokKTH/u///u+ezMxM3gsIeuA7duxIX7JkCTmU -eUi2Gxc5mfKrUKdrrrnmmxYtWlQj2O9XsQJ45r9jQUCRUPPOh+oCcK2B7du3k/5/JD4AKsvTj+dJ -SIG6LxFTGODQhzFVUn4nTpxYCEXtP2XKlHM8Hg/JxE4n/cjqlJycfHrmzJnLYT3oxxsLoOQGWCEA -KpgnIwLzdSIy4Ab5ILAGDh8+nHrw4EHSn4uE8MkIIJ7TkHdJpiEHgP4O1O+LEx6sk6f87mvVqpW5 -L80oaJCQFxUVJX/44Yektdgnw4UrHEz5VanToEGDVnfp0uUkxOY+zwowa3qVQUAwr8PtIKsKu4rp -TxGEPm/evHY+n0/I6BkuDb3SnRW+gzV+7JOM5ohnApCR23lpOlq4w+/eKKTH+p5++ukCzimuxTl1 -6tRO1dXVdMqvwxN+yOqk67p36tSpy6Au+FaDf9ZcgBD8f9lxKya/qFtQ+/rrr8kAYN8MF5x2vWX+ -cfsIBCGdxLflklmIHSC3dZVeLJOkx1533XUHzjvvvCoEazQzNAAoLy93/fWvf82n7tclVcew5s4N -+1Wp089+9rN1/fv3LwVf+FlBp4YDU1YAEPisbFsAIjPf2KYsAN41MisgiAg2b95M+v8xYf7H8SzE -gIp7E36TWeYna5qGiRMn7kKw0PPoXps1a1aH8vJyOuW3TbKzKb8KX/mdMGECL+mHHQOgEgRU6f6z -HATkPlwECrXKdXYDgAFrj8ejFxYWkhHdSAjfSmLwDxDf5n+Zx48fJZ384a5fQbUPH0rSYwcOHFjc -r18/c8ovjwg0AFpNTY321ltvkUlirZM13JHrnPmvUqcePXpsHTp06CHwyf1McAAAIABJREFUhd+K -4Ku4AQZs9QJQRjWl3UGcE3bzgSP8ALT58+e3On36tPDb7S6tzgVwEpU+PzadkgR14pgAVkmmIW/h -1nBeWnj1po2UXzJC+corr7Q9fPiwNOXXSS9NpU4PP/ywof1ZEz+UYb9mMgAEFgG36mH+AKixpghC -lP/PtQCWLFlC+v89012OZnIBwPeSEXKZLg09HQ5COgmZ+R/u6H9xrR/vS9Jje/XqVXrjjTeWQWz+ -17ebWEj5ValTfn7+7vvuu283goN/IguA91EQ5ZF/LMI5H4CxttsDQPr85vW6detI/z8Smlc2ACgS -QUgnIZuGPNz9/y8V1VhN+SW1//vvv99y9+7dZMrvA62SHR2kpVKn0aNHL4V1wVeNA0CwXb+oEICK -wFPXhUIEXAtAlgAUCd+7MQcAa/zAGsk05OEMspZ7/XijmNaUnTp1Kh81alQx6IE/xlqa8pvicMqv -Sp3y8vKKJk6cuBlqkX+egFvt+guCnYFAon3zMVFwUFXzC4V//fr12ceOHSO/3+608PkAfCchgHj2 -/9dXeEGNWE3WgD5hHDL7p+Ia6ZTtY8aMEWn/oHY2f/78nE2bNklTfls5nPIrq9PIkSNZ7c8L/qnM -AswjAgi2bfUCyGBH2GXBQK75/8knn5Ajuton62if7Gzf+9ZTXvLlxvtnyFdIyK1PhitsgbPTvjpT -mUJeXt6pMWPGHIBc+wOANn36dFL763A+5VdWp+zs7GPTpk1jU35FFoCKRaASC2AR7AKE+AEQ3jFe -XMA4Jwr8CS2A7777jgwARqT7T/advkb+GfJwmv8fKKTH3nfffbKUX2NbW716debKlSvJIeLDmyfh -XAdTflXqNGzYMFHKrx1f32r/f33hQg0C8twCUUzAiuYXTgCydevWdlThIuL/S/r/4/kz5IBCAlCY -BgD5UNdNRiErK6vmd7/73T5Ign5noE2dOvVcWcqvk0k/KnVKS0urnDlzJpvyyzP9Q035JbU/ICcA -mTBT++bjdoOBASRQUlKScvDgwVZUgSPheycSgMJTv49Ka7FLnvK7Oysri3rg9e3lxx9/TFu8eDE5 -QOyqbDcudjDlV6VO11xzzTd5eXlVsBb8sxMMBHEcQHhiACIioISfmu9PGAOYO3dueyoBKBJ974dq -/NgrTQBqvJ8h75qqIzdMwTPZV3FSU1O9EydO3I3AxmwgSCk988wznaOe8iupU1JSUs3MmTO/gnzY -r8j/V9X+gET7g40BhGkCEGOfRwwqml44MnD58uVkADAWEoDi/TPk0gSgMLk3y054sFbS1XjzzTfv -bd26NSVR9W2oqKgoSZby27uJC1c6mPKrUqdBgwat6tq160nIh/1SCT+h+P8BCGc3oCjQZ3cJChDK -EoASE4CEjkglAMkSZEwpvyraH9OmTZOm/Do53Rcgr5Ou695nnnlmGfhJPlZm+5FF/wGBwDPnSQIQ -RfdF/j7vGhXfnzf+n5cA5JIlAEVC+GQ9APE8AChSCUDrK71YKv/K78Fu3bpVEZfUt6Hy8nL3+++/ -34m6X5dUHcMdTPlVqVOfPn3WDRw4sBRiwQ/HhB8i7c9FqDEAnnCbj7PnWMFXngBk/vz5LaOdAHTK -58dGyawu8WwByBKAmocpAUgx5dc81z+p/WfPni1N+X00BlJ+n3zyyVCH/bJCbkX782IDYZ8RCAgt -2i8KAGqyBKALItD3LksAynZpOL+RJwCF+oQLqn2YJ0mPHTBgQHH//v1PkhfVQaupqdHffPNNMuW3 -VZKGOx1O+ZXVqUePHtuGDRt2EKGN8ZcF/wAL2h8wWQAhDgCizH3eNSoWQYAFEA8JQP0yXY5qGach -TQAKwzN+Xi3lVzbst75tvfrqqwopv8mOpvyq1Omhhx5iJ/xQMf/tDv5R0v6A2AVQEXjqOrvan2cB -6AA0aQJQDAQA47n/XykBKMQMwMMK6bEXXHBB6f/8z/+UQnHgz8svv0wO+81yaXiglXPaX6VOHTt2 -3HP//fcXQJzzb2fCD5YQAIvaH1AfCCTaN47xgoOi85T251kAmlICkMPC50PdV3IoxLP/H4kEoJeK -asj/AMiU3yBr8v33328p+8pvJFJ+ZXUaPXr05+Br+lAm/FAN+PkF2wBCCwKGIuwi7c81/2UJQB1S -dLRzOAFo2ykfmQDk1oBL4pgAZO5N7wwXQhk+X+7140+S9Nj8/HzVlF8Aaim/Dzmc8iurU15eXrHp -K79Wp/yy0+8PwT54+zoQsQQgSshJ81+aABQR/5/2jy9q4kK67mwQ0kk4nQD0xuFalZTfAk3jPkO2 -nWkLFixotnHjRjLl906HU35V6vSrX/1qqa7rHqhl/VH9/lYCf2COs9v1CMeMQFRMwI7fH0QKMZEA -1IjNf8DZAUB16bGnyWvy8vKqxo4du990iJKsGEn5peuUnZ197LnnnvsB4mQfs8DzpvqiYgCq/j7l -EnAJQKTdWR+ft89eS1kFIhcgwAI4kwBEpndGJAFIkgEYzwRQ4HAC0F+P1qKohr7/6NGjjZRf9sKg -NvTdd99lrFixgkwKu7l5Ero4mPKrUqehQ4d+KfnKr8qEHyoDfUBcAxBkavcJiYjAivDzAoBB5v+8 -efPa+3w+YTmzXBp6OpjdBQBFNX7skSUAOfSNvEhA5v93SdWRZ9OU9gGYc5DWlJmZmTVPPPHEPtMh -UvvHRMqvpE5paWmVs2fP/hZ8rW9l6K9qFyAPpPYHQnMBKFfAvG9F+weZ/8uXLye7//pGoO99rWT0 -3zmpuqO+ptNw8gtAH5fWYqdayq8HCtp/586dqYsWLSJdwiuz3ejtoFJQqdPVV18dKym/QqYcMWKE -X7cRAGTPWxV8mSUQsL1p0yayByAS/r/s83fx3P8PqExwat+6UUn5nTBhwh7F22lTpkyJi5TfGTNm -LIe68DuZ8ivaBwCwb5b3YEVmPXWNqu9P9v97PB7X7t27o54A1FTSj7yh0ovbd1F5K7ELvx+OJQB9 -ecIjHVx0880372vbtu1pBDfooDZUXFwsTfm9uIkLVzmY8qtSp4EDB67u1q1bOeSTfUYk5ZeHESNG -+IFgAjCgYhVQpKCi5aXEsGDBgpbV1dVkAlAkJt/MlpgAW075sOWUZDRInCLHraGbzQQgmaZ0uVy+ -p556iveVXx60adOmdaqqqiKl2/GUX0mddF33Tpky5QuIR/3ZMfVlg39YyKyDhvLKLlAESwrmbUsm -v3l7yZIlJNtfGKHJN2UWQGPGVdluqR/Iw4ZKLz4/TscWrrnmmoPdu3c/BQXf/+TJky5Zyu+5qTpG -OJjyq1Kn3r17r7/00kvZlF+rvr+dngBK2APOGdofUJsPgHfMirlvJRgYsL1u3TqSAAZGKPe+ZbKG -wXGc5x8KRuXZEygLX/kNOsU7Nnv27A4nTpyI+ZTf3//+99RXflUm/7Bq9gf8Pyxof8DapKAi/998 -3o7QCy2AWPgCEM4U5oMu6WguiwY2Moxrm4Lrmlr3pwurfZhXJk/5HTBgQDnEDbW+fXg8Hu2NN96Q -pvyOcjDlV6VO3bt33zZ8+HA25Vd1xh/RqD/R4B9wjvMg1P5AIAFQAT4WPAuAOk+5ANyhwOvXr88u -KyuTJABFru+9bbKGd84ls04bFYY3T8KzHYThFxLPH6qBZIQsxo8fz9P+XKh85XdsBFJ+ZXUaO3as -ecIPWX+/KPKv6vdTUX4l7Q9YjwGIVKBdM18UHJQmAEVj8s0bm7kxoV2KtFsw3vHzDBfeOzfNlu9/ -uNaP9yTpsT179iz7xS9+UUpcEtA+Xn75ZVL7RyLlV1anDh067HnwwQd3QT7qz27kHwgWfFlXn+0g -oMz/Nx+zY/oL/X5jPxYSgHj4Q/sU7O2TiRkdU3F+ejxP/xGItskaft0yGR+el44vzk+H3Zm/XraW -8ittoB988EHL3bt3Z1HX3N8yCdkOBmpV6nTmK792R/3Z6ftXJYV6sOY/IO4GBIIFnT2n4jKo+v1B -RLB169aY8P95aJWk4bE2yXisTTLWVXqxS9KPzmJXtQ+T94uHkiYlJfnfeuutSpdLuY4aAEydOjV1 -x44dwh8lacAL+Wkwu/WaBpyXquPCMIycO+n140+HpZNjnLzrrruKiUsClMbzzz9Pav+6lF97rooK -VOqUm5tbHIav/FIj/SA4BuY8tc+F0RQoYeYJtHnffNxOAJC1DIwEoDyq4LHy+a3eTVyWh53OlvQl -X3LJJd5Ro0bxLmIHydRj5cqVbkr4AWBUXjLub+VcN9kbh2txnJo0EXVf+dU0TWnAysKFC3M2bNjQ -nLrmjtxktHbQFVSp069+9asvTCm/vL7/cET+eTEApedIwUoUTUQEvICglQCgrQSg+J58UzL2fsAA -NtwsYvf6dzJ9+vRU6p5Op8fW+NVSfh966KEDxCUB7WT69Omk9o+FOmVlZR2bPn3691D/uIfdvn9A -rv2F1/HMfyD0gUAii8GK9g8y/2UJQPE++abs45uDBg0yM4S0i2fr1q2u+fPnk5IwrHkSujqZHltS -i0OS9Nh77rmnIDk52WjgAKHBvv/++4xvvvmGTPmNhTrddNNNX6WlpXlgX/hVtT9lFZAQCT9AzwfA -O2ZH21sJDMZMApBT2FntQwmRe69pGksAMvhnzJiRKk2PdVBT+gDMVkj5HT9+/D7ikgALUynlN8p1 -SktLOzVz5syVoH1/0badwB8PUu1PwQ2xwPMEnbomVPNfA2InAYiHE14/vin3olLWIUxguWRikTZt -2vgWLFgQ4KhTgnDs2DH9H//4BxkFOz/dhYJqHwqqfchwabgiO7zTl31SJk+Pvf322/c0bdrUnPLL -i2doALRdu3alLly4kGwDV2S70cfBPBCVOg0ZMuSbVq1amVN+eb6/yBpQ6fqT+f9SUNofCIwBqLQI -ihRCNf+VEoAiPfnmzmof/lvmwYLjHqws90AycU7IOHjwoH7HHXdkhPOeW08FZitmuTTc0tyNUXnJ -YSFT2RDZlJQU4yu/KjC+8kva9o6n/ErqlJSUVMt85ZcVfqqrj7cWEQIgFnhbWt8M1SCgiltg3uZp -/CBfn3dcmgDUxIUmEZp887/HPBj+4ylY6+SLfZR7/XjnSC3eOVKLrqk6lpyfbntW5a9OePBDmFN+ -586dS7aBi5q4MMTBlF+VOg0cOHDVmZRf0UAfGQmoWAIAX/uLEHBOpv2B4BhAJPx/Uf+/DpUEoAhp -/w2VXty+s6rRCT+LndU+3LGrSjrMVQSFlF//ma/8qkB77rnn4iHl13fmK7+ygT/h6PrjCb1KbEAJ -qslAsnPhCABqQGwkAB2o8WHoj6dQ6XPY3o8RfFPuxdQDdMCLh42VXiyRpMdeffXVB5iUX6H2V0n5 -7ZyqY0SOc2MZVOrUu3fvdYMGDToKNa1P+f+UFQA4rP2BBgIQCTN7zOo25Qqwwq9v3LgxJhKARu6s -knb/NDY8e+A0lkvmBmQh05RnUn6Vtf+cOXM6HD9+XJry6+T0DLI6AfA/8cQTbNIPL9qvEgewq/15 -27ag4vixRGDeVnULqLH/9YTw8ccfk+Z/foqONg4nABVW+6Rz5DVG+AD866g6Aeyu9mGu5Iu4/fv3 -Lx44cOAJBDfUoLZyJuX3HOp+LR1O+VWpU7du3baPGDHiAPhTe1kZ968S8QdnW7qvqv0Ba/MBmI+F -Ggfgmv+rV6+Oev//shPWtGBjgmzIqxkq6bHjxo1jtb8fArfytddea1tcXJxO3W9s6+SQPk8mg2LK -r/k7fyqRf8r0p6L+4BwLq/YH6G5A3j5LCLy1SMCp/n8dgL5t2zba/4/A+H/ZHPnnp+voGafDkP1+ -YG5prTCweVwxEnik1o93Jemx559/ftlNN910FOJgVYBCeOmll8hhv5kuDQ+0dE77q9SpQ4cOe3/z -m98YX/mV9f1bMf2N40AwGbCQWQOWwA4EEvn/4Oxb0fIyC0AvKSlJOXDggOQLQM77/zLzf2K7FPzS -wXnnnMTuah/+TZi4qhaAxZRfM7ja/69//WteYWGhNOW3qYMTMajU6Z577mGn+xLN8GveZoWcp/kN -8DS+6DourJj/gPUpwUTCzztGxQCCzP8PP/ywHZUAlO3S0MPh/PviWj92S1pBJGchCjdk5KYyyOmk -14/XFVJ+77777iLTIVL7y77ym6w5n/Irq1Nubu7hp556ypzyKzP3Zf6/LBbAQ1i1P6A2KaiqayDS -+rzIf9Dx5cuXk/5/JBKAZF/IicYsROGEjAB6N5E/4bcU0mN/85vf7DrzlV/zhdwHt2jRombr168n -U37/NzfJ0eCvSp1uu+02NuXXagDQSsRflRACYFX7A/xuQNF+OBdeAlDU+/9l/n88fwAUkH/iXPYF -oBo/8KIkPTY3N7fq4YcfPkhcEtAWVL7y+3hb57S/Sp2ysrKOn0n55XXzqVgEvH5/lei/GbwAYchg -JwW14/+z+yJTn0wAKiwsJL/3FgnhkxFAJIKQTuG4x49tko+XyJ7x30pqcVCe8luYkpLiRWBD5arv -NWvWZH799ddk3OemHGdTflXqNHTo0K+aNGlSC2sz/lAWQCjjALiwo/0BdRdA1dcX+fykBbBo0aK8 -aCcAnfL5sUHyEdB4tgBWnfSSLSkvScO5hKD5Acw+pPSV373EJQHt4Jlnnuns9/tJ297JYb8qdUpN -TT01a9asFYjjlF8KhiCy4Pn/IgtBJepPzgC0aNGijlQhL2oS3vRVHn6o8IJyA+N/FiKJdSMht0/K -PNghmftw5MiRbMovIND+BQUFaQsWLCBTfi/PduPnjqb8yut09dVXRzPlVwl2tT8gHgoMZp8lBKu+ -vogMNMRIApDM/I/3WYhWyPx/Se/GTMnkGAopv6z27yRL+R3n4IQfgLxOSUlJtdOnT/8Koaf8ysx/ -gC/0KtZBSODFAKh983GrgT7hAKBYSABaKZmoI55nIar1Q/5FW6J+y8s9+F7y+2HDhu1r166dOeVX -iCNHjiT/5z//Ia2+C5u4cI2NrxKpQqVOAwYMWN2jR49wpPxS5j8Q+Mxk2j+sRCBiYBERWIrsq1y3 -cePGrGgnAPkArG7EPQDrK72gLN1UHbiYMLVlk2O4XC7/U089VUhcEtAGpk2b1lGa8uu49pen/E6Z -MmUZ+JF+p1J+WSLgbQcgFPMfoOcEVNX0MlIg/f9PPvmE1ASdUnRHp30GgG2nfDhBDION9CxE4YbM -vflZhguiR7yp0ovFkvTYIUOGHDj//PMrVcpSWVnpeu+998ikn3NSddzi4GhLlTpdfPHF6wcPHlwC -esSfKPBHjfqzov15LkFYwdPUMK3NoIJ/qlZAEBGsXr06Bsb/042hV3rkZiFyAislA5wGEhaWQnqs -OeWX10ADFMrs2bPbx0HKL8aPHy9L+VWNA4hiAkCUtT9g3wIwnxeN8FPy/2VfAIpIAFDi/0fqM+RO -wW4PwJ7TPvxHkh7br1+/w4MGDeKl/JqhAYDKV37zkjTc5WDKr0qdzjvvvO2//OUv90Mc7Vcd/BNK -H7/j2h8IJgCRBWDHLeARQ8BSWlqaLEsAorRTuBBqF1kso6DahyPUNOQA+gvqF4av/AZYja+//nqb -oqKimE/5HTNmjDnl1+rAH1m/vwGRFRAx7Q8Em+mAPWEXaXuWCALWsi8ANXU7nwB0qMaPvafpvuB4 -TgCS+f/d0nTkcLLsSmr9ePcIbSr36NGjbNiwYeaUXx7q29ZLL71EDvvNdGl40MGUX5U6tW/ffu+Y -MWN2IXwpv6pmvxkR0f4AbQGITH7WzOftiwKAAYs0ASjDxQ1GhBOyz3TFfQKQxP8XWTcvF9WQPQcA -N+VX2Kj//ve/5xUUFJApv/dFIOVXVqd77rnH7Ptb6ftnfX2ZGwDiOIlwaX8geByAeW0+bjfiT8YA -pAlAMTABSDyb/4CCe8NJAKpQTPm95557iiAeqMIG/6Qpvw87mPKrUqfc3NzDTz/99CaoCb9K958K -CbBgn6dj2h8I1NwAX9uz+5Sfr2wReDweV0FBQdS/ANSYBwCVevz4UaLyePV760gtjknSYx988MGC -Mym/gLiRagCwZMmSprKU39udTvlVqNOtt94qS/kNV78/iOMRhcgCUNX4smi/cFm8eDH5BaAkDY6O -AweASp8fm0413gFAKglAXZiIW40feEGSINOiRYuqRx55ZD/4DTdIip977rku1P10AI+3cTblV1an -zMzMEzNmzJCl/MqEX4UMAHXtH4Rwmv9AcC6Aivkv8/9VXAFd9gWgSCQAfX9SngDUs0n8EoDM/OdF -//+ulvJbwKT8CrF27dqM5cuXkz09Q3PcOC/NuWCvSp2GDh36ZQgpv7Lgn4oFwIPjVoF5TkC7XX2s -0CuRwNq1a6Pe/7+ikScAyQYAsb0bfthK+TU3Uo3Z1qZMmXKuPOXXOe2vUqfU1NRQv/IrIgFK8HlF -heAcgPBrf4BvAaj4/7ygnrL2B6D/+OOP5AQgkfC9G3P/f40fWCOZ32AQU79PyzzSmMH/+3//b0+z -Zs2MlF/S9y8oKEhdsGAB+Z4vy3LjEgddPZU6DRkyZEWbNm1OIbSUXzskQAl0RGIChvAC6kE/mQUg -XbZs2ZJVWlpKJwBJpqcKFT4A3zXiBKC1FV5Qwxt4CUAzJZoyOTnZe+Y7f0pBq2eeeeYcacqv49/5 -o+vkdrtrZ8yY8SWs+fyqpr6K9vcLtgPghPYHGr4LwJpuxlrW3WfL/P/kk09I//+cVB2tkpz1/7dU -elFODAlzaWdXAtDX5V4pId50003mlF8y+Hf48OGk//znP/nU/Xo1ceFaB1N+VepEpPyK9u3EAwBa -0GX7joFnAahqf8ua31hWrVoV/fx/ScO4MM4TgGQDnNgh1rLJMc6k/O4E7cPWH582bVp+9FN+6Trp -uu77wx/+8AX42X6q3X92uvyA4OcYce0PBFoAoQT9LJHB1q1bY34C0LhPALIwvmHzKS8WSdJjr7rq -qgMXXHBBJcQEYLClv7Ky0v3++++TST+dUnRHP7CiUqeLLrpo/eWXX34U9sb8Wxn1Z8XXj5j2Bxp6 -AYKitxBr/6ARfQqLy1iXlZWl/PTTT3lUoRIJQKFhR5UPR4n+TQ2BXYCyyTEA4Mknn9wBcYMOMJVm -zZrV4fjx42Ro3/GUX4U6MSm/ouBfOFJ+AZoUIir0ZrDdgFai/VaFXwegf/zxx22pBKBmbg3dHU4A -OlDjw0+NOAFIRm7mBKC9p+nPhQHAJZdcUnzZZZcdA9+f1Uz7msfj0d58801y2G9ekoa78pwz/1Xq -1LVr1+233nqrkfJrNdVXReuDs89CKvhOmv9AYDegai+Arcg/zhDBV199Rfr//TIjkQBEC0i8JwBJ -PwBi0v6KX/n9EXQjN+B/7bXX2hYVFTWh7jemdTIcHPdjJeVXZbYflVF/oqCfivY3I+KWgNkFUA0A -WhZ687Jx48ao9/835vH/gIL/f6aLtaTWj79I0mO7detWOmLEiMNQGKgCQHvppZe6UvfLiEDKr6xO -7dq12zd27NidkJv+vJiArOsPgmMspM/Tae0PyF0Aq9rfRW17PB7Xrl27WlMFioT/35gzAEtq/dgp -/cBpXf1eKZanxz7yyCPboRbM0v72t7/lFRYWNqXud1/LJDRzMOVXpU5333039ZVf1S4+O25ATGl/ -IHgcgBXtL7IIXBAQwdKlS/OqqqqimgBU4fVjcyNPAKJgJABVeP14rViqKcvvvfdeUdKPGRoA/+zZ -s7tR94tEyq+sTi1atDg8efLkjbAe+GPNfjb4J3OPzIgJ7Q/IXQBW44cSAHR9/vnnpPl/cROXo74h -AHxX4SX9w3hPAJL5/0b0/22F9Nj7779/m67rRgMHAhusWY37Fy1alLNhwwayd2dkbpKjsRWVOv3y -l780p/xS2p9n9quO+rPrDkQcqjGAUKP/LgD6Dz/8EPX+//2n6WfdN94TgKTujRu1fuAFycy4zZs3 -P/X444/vRkOjZ+FHQ7vwTZs2rTt1Pw3Opvyq1CkzM/P4zJkzV8Net5+VXgBALPAqsZSIgR0IZN4W -DfqxJfwA9O3bt7ehChOJGYBkU051S9OxT9JFGKuo9QPrFL4A9PejtThQQ9fxjjvu2J6amkol/dQ/ -yO+//z5zxYoVJLkPzXGjm5Mpvwp1uvHGG7/MyMiogTXtTwm8lWCgCEHnImX+A/aCgFaCf/XLtm3b -so4ePUrOCReJvvemEo55uagGLxfJB5HEI4wEoHsLq8jrmjRpUjNx4sQfETyoxYDR968B0KZMmdJD -mvLroPb3A5gtGfabmpp6avbs2d+AHvYbzgk/2GemEhuIOEQugB3tzwb/Asjgs88+IzVE51QdLR1O -AALkFkBjxs8zXFh8zIPtkjD5Lbfcsr158+bm7/zxCEADgJ07d6YtXrz4HOp+g7Nc6Ouge/dZmbxO -V1xxxTdt27Y1p/xa1f5W/H9w9nmIqvYH+ASgc47xjltyA1atWkWb/xGKvLdM0uHSIB0o0hhxU06S -UsrvpEmTtkCs/QFTO5g0aVIPj8dDvjwnJ/wA1FJ+p0+fzkv6Ue0C5Gl/HiEAYu3P2446qG5AtqvP -zug/fdGiRS1XrlzZ7rvvvsunChKprrfWyRomtU/B0z/RjaaxoUuqjvNSdelHUK+77rodnTp1YpN+ -2Oi/BkArLi5O+eSTT8iuvwvSXbjOwZTfb8q90jr17dt3Va9evU5ALvyhaH+AFnTZfsS1P6DWDSgS -fiEhLFu2LO/NN9/svXz58l7FxcW5KgVxegIQM55om4KvTnix7ATdZdZY0Nyt4dPu6Xh0bzV5na7r -/qeffnoD6gRBFvzTJk2a1K2qqopM6Yv2hB+apvkmT55sDPwxd/+xAq6S+qsyEpCyBmJK+wPqQUBl -8/+qq666edmyZYOtFKKZW0N3pwcAmKADeO/cNPTZVEF+NqsxIFkD5p2XjtM+YOExyRwBAwcW9OnT -x0j6Ic3/iooK97/+9a8LqPvlp+i41cGU3y2nfNI6XXDBBeuGDBlIyrxuAAAUWUlEQVRyGIHCT5n/ -rPBb8flFiEntD4j9fVkvANc6GDt2bF+rwg/UDU6JdGiudbKGhd3TcUduUlxP/EGhZ7qOD7qkYVCW -Szo5BgA8+eSTa6BmJnv/8Ic/dD1x4gT5nT/nU37ldRo3btwiqAm/1aHAVgKCQAxqfwDQ/H5/Hhoi -+C7UWQXG2g0gybQ2luQzS/32Bx98cO4999zzmMfjsUz5Mzqm4jGHZ4ehUOH148MyD94vqcUeyTh6 -FrV+Pw5Jppx2u91+j8cjFAWXBrRN1kMmQQ3A+ek6bmjmxg3N3GifXGdV7T3tQ7f1FeQU6L169dq3 -cePGj9DQyAF+9B8ej0dv27bt3UeOHBGO+89N0rC7d6ZjIztV6tS5c+etBQUFfwRQSywe09q8qMYJ -VEgBIMggWtofsJ4NaNb69fuHDh1KGzNmzL12hL+pW8PoPOfMRBVkuDTcmZuEO3Otl+O9klqMLhD3 -q7dp06b20KFD5I2fbpeCCe2ci5T/8VANKSgA8Oijj36HuoYv677Spk+f3oUSfgAY08rZlF+VOj3w -wAML0SC8PKEW+fts1F8m6CCOs4gpS8AcA4BpWxYHCPD7//73v3cqLy8nP/0kwuNtkuO6b1728c2q -qiqychkuDb9p5Zz1c9Tjx1+O0JNjdOrUqWjUqFF7Edz1x0b/AUB78803L6HuFwt1at269Z7HH398 -GwI1uh0S8HO2Zd1+MJ0DcT6q2h+wPicgd5zADz/80MHqHydpwOT2Kfidw33ETkM2ucixY8fI7o1f -5zmbHvtqUQ1O+eg2dt99932LOuEQEUC98L/22mvn7N+/vxV1v1io08iRIxeAb86HQgIisz4utT8Q -7AIA1shAA6Dt2bOHHORzaZYLF6S70ESvM/l7prvQu4kLreN41h1A7eObFJI04BEHYx+VPj9elaTH -5uXllY4bN24bghs7D9qf/vSnn1P3i4U6NWvWrHjGjBk/IFDoWcG3kvCj4uOzUOkdiDpY7WTHCtBr -amrIN35fy2T8qkV0/XwnsFry8U1d1/0+n0/IciNbJKFdsnOO8tuHa1EmcZRvv/32FWfSY9lGzkID -gL1795ITusRCnYYOHTrf5XLJAnqyUYCU6R8W3z/a5j/ADwIaUO0W1GTBvzhX9ELIUm8p4dcAPO6g -+6OSHpuVlVU+ZcqUdaiLgssasXbo0KHUkydPZoruFwt1atKkybEXXnjhG8h9f1nGHzUOAGgE2h8I -tABYF8C8zVvqfycbC57SSPvZZR/fpHB5ths5bg2HHRqI9FFZLfZL0mNvuummFRkZGdUI1HSAgAC+ -+OKLZtT9YqFOV1555cKmTZtWg+7SMw/6sTv8F8RxFjGp/YHg7wKIhBym82CuhdfrJQNdjdECqPED -ayUf36Tw5QkP2q45GcYSWUNqamrVc889txJi7R/UA7Bu3TqypyfadUpOTj71xz/+8XMEC76ZDKwM -+lFxAVjEjfYHgmMALJRiAh6P56wjgHUVXlBjhpKTk301NTUxO7nQlVdeuaJt27YV4Af/2MarAUC3 -bt0OR66E1tGvX7/FnTt3Pgm1QT2qboDo+cS99gcQMPsVK6YisQ06LiOAxugCyPz/nj17ll188cUl -ESqOJbjd7tpp06YtQ/CIOPOouKCRcvfff/+u9u3bF0Sn1DRcLlfN9OnT/wt14ZdF/a1qfiDOtD/Q -QAA8F4DdFwYIvV4vGQNojBaA7OObffr0KXn44Yd/jFBxLOH6669fcOGFF5YhWMilhHDHHXfMj0qh -JRg8ePDc/v37l4Jv/quO/Vfp8rOt/UeMGOGPJe0PNHTnqYJ7rdQFiFlD2B6qfcByycc3Bg0aVDxq -1KifOnTocDxCxVLCRRdd9O2nn376KYAa0GPjuWPlp0yZsj4nJ+dgNMouQrdu3b5ctmzZvyAe02+s -eYJvhQQgOAbEofYHAl0A25AHARuXCfBRWS2OUx/f1DT/9ddfXwyg9i9/+cuyTp06HY1c6cTo0KHD -tq+//vptWEuMCSAFl8tVM2fOnJdzc3P3Rr4GwWjTps2mVatWvQSx0NsZAET5/SyUtb+tCjoMqwTA -Mp4fgF/qAjQyC+DPknHoXbt2LcnNza0EUHPllVce2bFjx78feOCBlcnJyVGZgcTlctWce+65az// -/PMXMjMzq0Fnx0lJ4a677tqzb9++J2+88ca/ud3uqMyg6nK5avLz879bvHjxtKZNm55mywi6/19k -/ts1++NS+wPyXgARAioqDQI2IgugsNqH5ZKZhK677roC1JnYPgC+pKQk7+uvv7561KhR2yZMmHDJ -vn37mh89ejTLRJwBz9PvD2pH1Hk/73hSUlJ1ly5dtlxxxRXrH3vssc2tWrVi+/t5I/9EDTgoJpSW -lub573//+9FHH320evLkycOOHDnS9uTJk3k+n49VBnZfflCdk5KSqjt16rRh8ODBP4wfP35Du3bt -qqA2yk824k+l/19aRoXjMQfN7/e3Q+BcAOaFnQsgYA4AYzstLW1OdXW18IuwxT/PRIs4zvgzY+JP -pzGdmIjC7XZ7CwoK3unYsaMxA60o0UQUdaYy0WTXy7ZV+rW5XYCwniTG7gPBwWQzRGUSPTdeQE8U -6OMl/YQ6DgCcbXC2Y9b8B+qEm2vWm/YhOF+/+Hy+s2IcgNcPvFdCW7yXXHJJQceOHcthvbHJBNbO -miIVFeE3ICMB3sxSuuB37D1F7Y9XF5YA2DVP8EXXygRfxeyXCn+swxBcXqFZluMxnx+AXxYEbCwu -wILjHhRJZv+58847N6DB/FclAJkw2z1HXSsSfnMFreSGqCzsPc1g2xZbZsoSUCEE9npVweeVU1nI -Y1n7A4ExAB6LiUiAJQAyzNcYgoAnvX48LplVNycn5/i99967C3QDNPbZhm1HgFXIQKb5ZRYAK7hW -XAH2evN9zJC1M55LI3quFPHazfoTWQDsM4tpYeeB1dxCLc9ZfAD8J0+epPw6uDX7UaBYwpg91SiU -zBd47bXXrtd1vRZiE9S8bYUAwrmtqv3NUBV+SuvzzH/2P8m2hmDhpSwCVY3PPhvRs+KVl0Ssa3+g -IQZgWfCN7ePHj9OZgI3A/P9rSS3+VkJ3/em67nv00Ud/QJ35TxGAHQtARahVG7IV7W+AGhkaCQKw -SgKyhWdVqGh8ijBjXth54FkAxlr2MnwAfOXl5Y3a/C+o9mHMHtr0B4BBgwb98LOf/ewoQos6qwi+ -qMGqHuORPUz7LEQugHlbRfCtuADmbRExWiEEFbJln4W5bLJnFHQsHrQ/EGwBKAu+sUgJII4NgMJq -H365owoVkg8JpqamVr344ouLEKj9fcw25YOKtJFVrW5X64saOE9rywiAPc7+VgQV5WOFCFSEXvV5 -sc+Ftx+XMPcC8BqF6GHVP9gTJ06QBBCPmYA+1H0m/KmfTksnnwSARx555F8XXXRRKej+aCsugB2N -bmUBZ5uCFSuAd968piCyAHj1p0hARKqy58t7TkDwcxIRJoD40f6AeByAD3XRXKHmN5aKiopGZQHs -qPLh14VVWCVJ9zXQr1+/Vc8995x5Akq7FoBVzaRq3lsVfmOffXOqJMA7x96DB5ECUiUBlbUdrW9J -+OMNZ70LsLvahzWVXqyt8GJNhQ+rKzw47VP7bfPmzYs//vjjf6JuHLpM+1PR6FAaqhUCAOc8mOMs -VN0A3rbo9zyoEoAqGYTyPMHZVkI8aX8g2AWQCjyzeLt37378zLXcl3ugxo/hO07B7+f8gd/0VgTn -/fAz+7xrBPfk3AOm6w/X+nFM9nkZAVwul+fFF198q2XLlpXgZ5xRLoBqQMr8HiA4pyL84Gyb1+y2 -GSICMNYigbfqAojKpkoAKvtWnh9VRuqauILxbUAdgd8HFH0nkM0RcANIat68+R/LysryI176KEHX -dc+jjz765qxZs3imfyS0P2wcA7GGYF/FDWDXVjU/7/9FZVclArvPUVQG85otaz3iTfsDchfAiAUE -aX40jPrynnvuuRu+//77/EgXPhpwu921v//971+ZMmXKBsizzkSDUvzgk0AojZYSejuanwUl2Cpa -P1QLwLwdroV3f2rNljXuwRKAD8FRXZ9pzSWCSy+9dP33338/LOKljzBatGixf/r06W+PHj16N9SF -X6b9Vc1WWNiH5Bi1zULVCpCdE91PJFyietglBPZ6cLaptai8AOJT+wN1LkBzNLgAIleAcgfcRUVF -6V27dn2toqKC/GZcvELXdc+QIUM+mzt37ieZmZnsSD9ZBhq1qGh8Fa1lpUFT2xQoQZcdE92H9/+8 -sqmSoOwc717UmtquR7wKPxDY1cdqITL4Z1o8rVu3PjV//vzHc3JyCiNeA4fRqlWrwnfeeefpxYsX -z1WcTUc0rRY1Yw07jx01s63KLDeUFaKSGafy/kX3okiRPUaRpxWXiiVVkXUlIw7AovDHOzS/35+D -OlY2LADKGnAjePKQ+uO7du3KuPzyyyccOnTo4khXJJxwu901PXr0+OHuu+9e+sgjj+yEeoOlBIwl -VpnJb0Xrq6ypbVWItDul9a10BMvKKqp3uC0jJbMfiG/tD9QRQDM0BPRYElAlgvr18ePHU2644Ybb -d+3adVFZWdk5sslCog1N0/w5OTlFHTp02NO9e/fCwYMHF44cOXLfGVNfpNEojaeiQa2a/uBsq6yp -bd4+BZlgWzX9ZeWQCaiMCOyseWVptMIP1BFAUzQQAI8EqLgAjxDql+Li4rQ///nPXQ4fPtzU5XJp -xqLrev3a7XbD2NZ1HWcW8zY0TTO2/ZqmaWfW0DTNz9n2A/C5XC6/pml+TdN8prUPgLHvzcnJqe7T -p8/xzMzMWtAmpqrQywjAz1mHS/hlx9ht6pgZKsJsRevLYgC8Y6EKtiME2VgIIBuBBCAiAlUy4C0i -YtGZ/+Yll4j6lnlgBYa3iLrhRL6lyM+1Ivzs/6kQADjb1Fp0TGXfClSEXZUAqHLIhFSl/lYE/qwT -fiAwF4AnKEBDFyBM+yLw7uFDw1gCQ9C9CCQbDTQBgLNm/5ctg6g8bNl4BGCFDETXsvfl/b+q4IdD -26sKGwuRxtaYfdExlXOi/7ciuOF8NmeF8ANiAhAJvEj4jd+5mHu4mDVrZWictV3tb5SDrYuxzwoc -JaQyrW7V17cb9ANzjD3OHmO3efuy46LrZETAu6eqtpeVy6oGD+XZnDXCD/AJwBBUHhmIYL6HQQK6 -aR0u4bebTALQBCAjAiuCz7MuKAJiy8qrB2/Nbqvsy45TsEIEsv/RFMtghQyoc2F5Lo1N+IEGAjBe -iFn4VQVfJPQiwReZ/aLJJMFZi8rCrkXWjYwERAQgE3iZ4IfL7Ke2qWPU8VBBEYGdMqjUyQ4BWtb6 -QOMUfiBwKLABVSIQNWAzAYiE3ormVx1PTmlM3qJCBDIBlwm9VeEPh9YXHVM5Fw4YCiXUe6geD/ex -IDRW4Qf43wUwtg3B1yEmATNY4VIx+UUEAFgTfrbslGDxhJEVVFVCoK6XCb6q8Ktu854DBauNmgri -hRt2CMwRImzMwg8EzwgENAivsQ0Ek4BIo5oFnj1GmfyU8KsGIdltkQVgHJORAI8AKC0fivDztqm6 -ifZVz9mB6v1U/ftQ/89u3ZXL1tiFH+ATAMAnAbMG0E3bxqIhsOGzcQCZ4FvR/ipdSjIrQCT8doWc -J+y8Y6Iy8dbUNnXMyvlQoTKwJ1SEWkdLZTobBN+AiACAYBIwhFlEBOaeAzaoaPxORAAQ7JvXqhAR -gHlbtoi0uMo2ex/R/4rKCGKbty87LoPsd6qDryIJ1f+0XLazSfgB8afBDLAkYAgwjwjMgq9BLPzm -favCb8UFMG/bIQHKMpAJPrXwyqNSB1F9RQhXQ7Z6n1ADgHb/1+5vAJx9gm/AbAGIfDdKgM2/M877 -TefN2xqChV+1y0+1UYmE31jbIQEZKVgVepHg29H6snPRQCTLE/J/na2Cb4DtBZAFcFgBNrQ/T+BZ -MrCq9VW1vwGR0IiIIBxkYEfbh6L5qeMiRKqBh0vzswh7+c92oTeDHQgEyEnArO0BvlbnaX9K8GVa -30oXILsfKhFQ56xoe7uCr9JYY6FBx0IZhEgIPR8qLgAQLMyAWPB5gu6k5ueVld2WkYB52y4hiO7B -+x+qrKJ92fEETEgIvBp4A4EAdStAVfgh2Tav2W3qmLk81LFwEgF1DW+bWvPKLqtLAiYkBD00sL0A -MsE3X8fuqwp7qJqf/W+qnOw2e0yFCOxuU2te2cMm+AmhSEAV5hgAEEgCVqwAlgTM91QVehWfnz1u -lQDM21atAqvHeGtemW0LfkLQEwgVol4AVRIAAoWdFXxjTQl8KKY/Ww7ZcbtEYKyt/kZ0TFReqUAn -hD6BcIKyAMywQgSiNaCu8cPRpUQJnAoRUOesanrKAhAdq0dC6BNwCprf7ze681SEU8WEt2Pmh6L5 -eZAJmSoZ8I6pXk9tU8fqkRD8BJwGLwhobAOBml/FCjCDtSaoe4WTAFRcAXY/VHKgtlX2A5AQ/AQi -BbMFEHCc2A/XNm9fdtwKnCYC2b1EZUgIfwIxA83v94u64XjHVIVZJujhNvllUBFEVWKwsy86Vo+E -4CcQDZgJAFDXyKHuU/8lO6cClYCl7Fi4hDwR2U8gZsESQP1x0fUKx0K9HwUr4wB4oK63QwrUPZXK -lhD+BKIJ0Xf7zME62XE2mOdkgw713lYJIJzHA5AQ/ARiAbIPd8qIgD3HGz/AOx5N2HEPQj0XgITw -JxArELkA5G8cPh8pqAhhKGQRhITgJxBr0IYPHw4AmDdvnh3BVP1NqEKv8nsn3YOQ/ich+AnEKuoJ -wIBNIqi/X4R+Ywd2hTAk4U0IfwKxjCACMCNEMqj/jzDcI1IIi7AmhD6BeAFJAGaEiQy4ZXDovjw4 -JpgJoU8gHqFMADw4SAoxj4TAJ9AYEBIB8NAYSSEh7Ak0VoSdABJIIIH4AS8TMIEEEjhLkCCABBI4 -i5EggAQSOIvx/wEH6mZY7Q+SDAAAAABJRU5ErkJg ---8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp-- diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-uppercase.expected.txt b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-uppercase.expected.txt deleted file mode 100644 index ef8470f4cc7f..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-uppercase.expected.txt +++ /dev/null @@ -1,5 +0,0 @@ -Content-Type|multipart/form-data; boundary="8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ" -Parts-Count|2 -Part-ContainsContents|STATE|TEXAS -Part-ContainsContents|CITY|AUSTIN - diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-uppercase.raw b/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-uppercase.raw deleted file mode 100644 index 3aecb111bc72..000000000000 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/multipart-uppercase.raw +++ /dev/null @@ -1,13 +0,0 @@ ---8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ -CONTENT-DISPOSITION: FORM-DATA; NAME="STATE" -CONTENT-TYPE: TEXT/PLAIN; CHARSET=WINDOWS-1252 -CONTENT-TRANSFER-ENCODING: 8BIT - -TEXAS ---8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ -CONTENT-DISPOSITION: FORM-DATA; NAME="CITY" -CONTENT-TYPE: TEXT/PLAIN; CHARSET=WINDOWS-1252 -CONTENT-TRANSFER-ENCODING: 8BIT - -AUSTIN ---8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ-- diff --git a/tests/jetty-test-multipart/pom.xml b/tests/jetty-test-multipart/pom.xml new file mode 100644 index 000000000000..dff0484594ff --- /dev/null +++ b/tests/jetty-test-multipart/pom.xml @@ -0,0 +1,38 @@ + + + + 4.0.0 + + org.eclipse.jetty.tests + tests + 12.0.7-SNAPSHOT + + jetty-test-multipart + jar + Tests :: Multipart Test Tools + + + ${project.groupId}.test.multipart + + + + + org.eclipse.jetty + jetty-util + + + org.eclipse.jetty.toolchain + jetty-test-helper + compile + + + org.junit.jupiter + junit-jupiter + compile + + + org.slf4j + slf4j-api + + + diff --git a/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartExpectations.java b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartExpectations.java new file mode 100644 index 000000000000..8e6fded88d74 --- /dev/null +++ b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartExpectations.java @@ -0,0 +1,264 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.tests.multipart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.security.DigestOutputStream; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +import org.eclipse.jetty.toolchain.test.Hex; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.QuotedStringTokenizer; +import org.eclipse.jetty.util.StringUtil; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalToIgnoringCase; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MultiPartExpectations +{ + private final String contentType; + private final int partCount; + private final List partFilenames; + private final List partSha1Sums; + private final List partContainsContents; + private final List partContainsHex; + + public MultiPartExpectations(String contentType, int partCount, List partFilenames, List partSha1Sums, + List partContainsContents, List partContainsHex) + { + this.contentType = contentType; + this.partCount = partCount; + this.partFilenames = partFilenames; + this.partSha1Sums = partSha1Sums; + this.partContainsContents = partContainsContents; + this.partContainsHex = partContainsHex; + } + + public static MultiPartExpectations parse(BufferedReader reader, MultiPartRequest multiPartRequest) throws IOException + { + String parsedContentType = null; + String parsedPartCount = "-1"; + List partContainsContents = new ArrayList<>(); + List partContainsHex = new ArrayList<>(); + List partFilenames = new ArrayList<>(); + List partSha1Sums = new ArrayList<>(); + + String line; + while ((line = reader.readLine()) != null) + { + line = line.trim(); + if (StringUtil.isBlank(line) || line.startsWith("#")) + { + // skip blanks and comments + continue; + } + + String[] split = line.split("\\|"); + switch (split[0]) + { + case "Request-Header": + String name = split[1]; + String value = split[2]; + multiPartRequest.addHeader(name, value); + if (name.equalsIgnoreCase("Content-Type")) + { + parsedContentType = value; + } + break; + case "Content-Type": + parsedContentType = split[1]; + break; + case "Parts-Count": + parsedPartCount = split[1]; + break; + case "Part-ContainsContents": + { + NameValue pair = new NameValue(split[1], split[2]); + partContainsContents.add(pair); + break; + } + case "Part-ContainsHex": + { + NameValue pair = new NameValue(split[1], split[2]); + partContainsHex.add(pair); + break; + } + case "Part-Filename": + { + NameValue pair = new NameValue(split[1], split[2]); + partFilenames.add(pair); + break; + } + case "Part-Sha1sum": + { + NameValue pair = new NameValue(split[1], split[2]); + partSha1Sums.add(pair); + break; + } + default: + throw new IOException("Bad Line: " + line); + } + } + + Objects.requireNonNull(parsedContentType, "Missing required 'Content-Type' declaration"); + + return new MultiPartExpectations( + parsedContentType, + Integer.parseInt(parsedPartCount), + partFilenames, + partSha1Sums, + partContainsContents, + partContainsHex); + } + + public void assertParts(MultiPartResults multiPartResults, Charset defaultCharset) throws Exception + { + if (partCount >= 0) + assertThat(multiPartResults.getCount(), is(partCount)); + + Charset formCharset = defaultCharset != null ? defaultCharset : UTF_8; + + List charsetParts = multiPartResults.get("_charset_"); + if (charsetParts != null && !charsetParts.isEmpty()) + { + String charset = charsetParts.get(0).asString(UTF_8); + if (StringUtil.isNotBlank(charset)) + formCharset = Charset.forName(charset); + } + + for (NameValue expected : partContainsContents) + { + List parts = multiPartResults.get(expected.name); + assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); + assertThat("Part count for [" + expected.name + "]", parts.size(), is(1)); + MultiPartResults.PartResult part = parts.get(0); + // Parse part with charset. + Charset charset = getCharsetFromContentType(part.getContentType(), formCharset); + ByteBuffer partBuffer = part.asByteBuffer(); + assertThat("part[" + expected.name + "].newContentSource", partBuffer, is(notNullValue())); + String partBufferAsString = BufferUtil.toString(partBuffer, charset); + assertThat("Part[" + expected.name + "].newContentSource > ByteBuffer > String", partBufferAsString, containsString(expected.value)); + String partContent = part.asString(charset); + assertThat("Part[" + expected.name + "].asString", partContent, containsString(expected.value)); + } + + for (NameValue expected : partContainsHex) + { + List parts = multiPartResults.get(expected.name); + assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); + MultiPartResults.PartResult part = parts.get(0); + ByteBuffer partBuffer = part.asByteBuffer(); + String partAsHex = Hex.asHex(partBuffer.slice()); + assertThat("Part[" + expected.name + "].contents", partAsHex, containsString(expected.value)); + } + + // Evaluate expected filenames + for (NameValue expected : partFilenames) + { + List parts = multiPartResults.get(expected.name); + assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); + MultiPartResults.PartResult part = parts.get(0); + assertThat("Part[" + expected.name + "]", part.getFileName(), is(expected.value)); + } + + // Evaluate expected contents checksums + for (NameValue expected : partSha1Sums) + { + List parts = multiPartResults.get(expected.name); + assertThat("Part[" + expected.name + "]", parts, is(notNullValue())); + MultiPartResults.PartResult part = parts.get(0); + MessageDigest digest = MessageDigest.getInstance("SHA1"); + + try (InputStream partInputStream = part.asInputStream(); + DigestOutputStream digester = new DigestOutputStream(OutputStream.nullOutputStream(), digest)) + { + IO.copy(partInputStream, digester); + String actualSha1sum = Hex.asHex(digest.digest()).toLowerCase(Locale.US); + assertThat("Part[" + expected.name + "].sha1sum", actualSha1sum, equalToIgnoringCase(expected.value)); + } + } + } + + public String getContentType() + { + return contentType; + } + + public boolean hasPartName(String name) + { + for (NameValue nameValue : partContainsContents) + { + if (nameValue.name.equals(name)) + return true; + } + return false; + } + + public void setPartSha1Sum(String name, String sha1) + { + List toremove = new ArrayList<>(); + + for (NameValue expected : partSha1Sums) + if (expected.name.equalsIgnoreCase(name)) + toremove.add(expected); + + if (toremove.isEmpty()) + throw new IllegalStateException("Unable to find expected part with name [" + name + "]"); + + assertTrue(partSha1Sums.removeAll(toremove), "Unable to remove existing parts with namne [" + name + "]"); + partSha1Sums.add(new NameValue(name, sha1)); + } + + @Override + public String toString() + { + return "expecting.multipart.count=" + partCount; + } + + private Charset getCharsetFromContentType(String contentType, Charset defaultCharset) + { + if (StringUtil.isBlank(contentType)) + return defaultCharset; + + QuotedStringTokenizer tok = QuotedStringTokenizer.builder().delimiters(";").ignoreOptionalWhiteSpace().build(); + for (Iterator i = tok.tokenize(contentType); i.hasNext(); ) + { + String str = i.next().trim(); + if (str.startsWith("charset=")) + { + return Charset.forName(str.substring("charset=".length())); + } + } + + return defaultCharset; + } + + record NameValue(String name, String value) {} +} diff --git a/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartFormArgumentsProvider.java b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartFormArgumentsProvider.java new file mode 100644 index 000000000000..2e1b79a4837c --- /dev/null +++ b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartFormArgumentsProvider.java @@ -0,0 +1,155 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.tests.multipart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class MultiPartFormArgumentsProvider implements ArgumentsProvider +{ + private static URL getMultipartResource(String resourceName) + { + URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName); + assertNotNull(url, "Unable to find resource: " + resourceName); + return url; + } + + private Arguments asArgs(String formPrefix, Charset charset) throws IOException + { + URL urlRaw = getMultipartResource("multipart/" + formPrefix + ".raw"); + URL urlExpectations = getMultipartResource("multipart/" + formPrefix + ".expected.txt"); + + try (InputStream input = urlExpectations.openStream(); + InputStreamReader inputStreamReader = new InputStreamReader(input, UTF_8); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) + { + MultiPartRequest multiPartRequest = new MultiPartRequest(urlRaw); + MultiPartExpectations expectations = MultiPartExpectations.parse(bufferedReader, multiPartRequest); + return Arguments.of(multiPartRequest, charset, expectations); + } + } + + public Stream provideArguments(ExtensionContext extensionContext) throws Exception + { + List args = new ArrayList<>(); + + // == Arbitrary / Non-Standard Examples == + args.add(asArgs("multipart-uppercase", null)); + args.add(asArgs("multipart-base64", null)); // base64 transfer encoding deprecated + args.add(asArgs("multipart-base64-long", null)); // base64 transfer encoding deprecated + + // == Capture of raw request body contents from Apache HttpClient 4.5.5 == + + args.add(asArgs("browser-capture-company-urlencoded-apache-httpcomp", null)); + args.add(asArgs("browser-capture-complex-apache-httpcomp", null)); + args.add(asArgs("browser-capture-duplicate-names-apache-httpcomp", null)); + args.add(asArgs("browser-capture-encoding-mess-apache-httpcomp", null)); + args.add(asArgs("browser-capture-nested-apache-httpcomp", null)); + args.add(asArgs("browser-capture-nested-binary-apache-httpcomp", null)); + args.add(asArgs("browser-capture-number-only2-apache-httpcomp", null)); + args.add(asArgs("browser-capture-number-only-apache-httpcomp", null)); + args.add(asArgs("browser-capture-sjis-apache-httpcomp", null)); + args.add(asArgs("browser-capture-strange-quoting-apache-httpcomp", null)); + args.add(asArgs("browser-capture-text-files-apache-httpcomp", null)); + args.add(asArgs("browser-capture-unicode-names-apache-httpcomp", null)); + args.add(asArgs("browser-capture-zalgo-text-plain-apache-httpcomp", null)); + + // == Capture of raw request body contents from Eclipse Jetty Http Client 9.4.9 == + + args.add(asArgs("browser-capture-complex-jetty-client", null)); + args.add(asArgs("browser-capture-duplicate-names-jetty-client", null)); + args.add(asArgs("browser-capture-encoding-mess-jetty-client", null)); + args.add(asArgs("browser-capture-nested-jetty-client", null)); + args.add(asArgs("browser-capture-number-only-jetty-client", null)); + args.add(asArgs("browser-capture-sjis-jetty-client", null)); + args.add(asArgs("browser-capture-text-files-jetty-client", null)); + args.add(asArgs("browser-capture-unicode-names-jetty-client", null)); + args.add(asArgs("browser-capture-whitespace-only-jetty-client", null)); + + // == Capture of raw request body contents from various browsers == + + // simple form - 2 fields + args.add(asArgs("browser-capture-form1-android-chrome", null)); + args.add(asArgs("browser-capture-form1-android-firefox", null)); + args.add(asArgs("browser-capture-form1-chrome", null)); + args.add(asArgs("browser-capture-form1-edge", null)); + args.add(asArgs("browser-capture-form1-firefox", null)); + args.add(asArgs("browser-capture-form1-ios-safari", null)); + args.add(asArgs("browser-capture-form1-msie", null)); + args.add(asArgs("browser-capture-form1-osx-safari", null)); + + // form submitted as shift-jis (with HTML5 specific hidden _charset_ field) + args.add(asArgs("browser-capture-sjis-charset-form-android-chrome", null)); // contains html encoded character + args.add(asArgs("browser-capture-sjis-charset-form-android-firefox", null)); // contains html encoded character + args.add(asArgs("browser-capture-sjis-charset-form-chrome", null)); // contains html encoded character + args.add(asArgs("browser-capture-sjis-charset-form-edge", null)); + args.add(asArgs("browser-capture-sjis-charset-form-firefox", null)); // contains html encoded character + args.add(asArgs("browser-capture-sjis-charset-form-ios-safari", null)); // contains html encoded character + args.add(asArgs("browser-capture-sjis-charset-form-msie", null)); + args.add(asArgs("browser-capture-sjis-charset-form-safari", null)); // contains html encoded character + + // form submitted with simple file upload + args.add(asArgs("browser-capture-form-fileupload-android-chrome", null)); + args.add(asArgs("browser-capture-form-fileupload-android-firefox", null)); + args.add(asArgs("browser-capture-form-fileupload-chrome", null)); + args.add(asArgs("browser-capture-form-fileupload-edge", null)); + args.add(asArgs("browser-capture-form-fileupload-firefox", null)); + args.add(asArgs("browser-capture-form-fileupload-ios-safari", null)); + args.add(asArgs("browser-capture-form-fileupload-msie", null)); + args.add(asArgs("browser-capture-form-fileupload-safari", null)); + args.add(asArgs("browser-capture-whitespace-16-fileupload-chrome", null)); + + // form submitted with 2 files (1 binary, 1 text) and 2 text fields + args.add(asArgs("browser-capture-form-fileupload-alt-chrome", null)); + args.add(asArgs("browser-capture-form-fileupload-alt-edge", null)); + args.add(asArgs("browser-capture-form-fileupload-alt-firefox", null)); + args.add(asArgs("browser-capture-form-fileupload-alt-msie", null)); + args.add(asArgs("browser-capture-form-fileupload-alt-safari", null)); + + // form parts submitted as UTF-8 + args.add(asArgs("browser-capture-sjis-form-edge", UTF_8)); + args.add(asArgs("browser-capture-sjis-form-msie", UTF_8)); + args.add(asArgs("browser-capture-sjis-jetty-client", UTF_8)); + + // form parts submitted at Shift_JIS (also contains html encoded character entities) + // forms that were submitted without {@code _charset_} named part (as specified by the HTML5 spec). + // This is a flaky and buggy part of the HTML spec in various browsers. + // This technique used to be common, but is being replaced by using + // the {@code _charset_} named part instead. + + Charset shiftJis = Charset.forName("Shift_JIS"); + args.add(asArgs("browser-capture-sjis-form-android-chrome", shiftJis)); + args.add(asArgs("browser-capture-sjis-form-android-firefox", shiftJis)); + args.add(asArgs("browser-capture-sjis-form-chrome", shiftJis)); + args.add(asArgs("browser-capture-sjis-form-firefox", shiftJis)); + args.add(asArgs("browser-capture-sjis-form-ios-safari", shiftJis)); + args.add(asArgs("browser-capture-sjis-form-safari", shiftJis)); + + return args.stream(); + } +} diff --git a/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartRequest.java b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartRequest.java new file mode 100644 index 000000000000..c0d485827de5 --- /dev/null +++ b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartRequest.java @@ -0,0 +1,78 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.tests.multipart; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.jetty.util.FileID; +import org.eclipse.jetty.util.IO; + +/** + * Represents a Raw Multipart Form + */ +public class MultiPartRequest +{ + private Map headers = new HashMap<>(); + private final URL rawMultipartFormURL; + + public MultiPartRequest(URL rawMultipartFormURL) + { + this.rawMultipartFormURL = rawMultipartFormURL; + } + + public void addHeader(String name, String value) + { + String prev = headers.put(name, value); + + if (prev != null) + throw new IllegalStateException("Lost previous header [" + name + ": " + prev + "] when setting value to " + value); + } + + public Map getHeaders() + { + return headers; + } + + public ByteBuffer asByteBuffer() throws IOException + { + try (InputStream in = rawMultipartFormURL.openStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) + { + IO.copy(in, baos); + return ByteBuffer.wrap(baos.toByteArray()); + } + } + + public InputStream asInputStream() throws IOException + { + return rawMultipartFormURL.openStream(); + } + + public String getFormName() + { + return FileID.getFileName(rawMultipartFormURL.getPath()); + } + + @Override + public String toString() + { + return getFormName(); + } +} diff --git a/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartResults.java b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartResults.java new file mode 100644 index 000000000000..23f8f450556e --- /dev/null +++ b/tests/jetty-test-multipart/src/main/java/org/eclipse/jetty/tests/multipart/MultiPartResults.java @@ -0,0 +1,43 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.tests.multipart; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.List; + +/** + * Generic interface for access to MultiPart results across core / ee10 / ee9 / ee8 / etc ... + */ +public interface MultiPartResults +{ + public int getCount(); + + public List get(String name); + + interface PartResult + { + String getContentType(); + + ByteBuffer asByteBuffer() throws IOException; + + String asString(Charset charset) throws IOException; + + String getFileName(); + + InputStream asInputStream() throws IOException; + } +} diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-company-urlencoded-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-complex-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-complex-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-duplicate-names-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-duplicate-names-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-encoding-mess-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-encoding-mess-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-chrome.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-chrome.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-edge.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-edge.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-edge.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-edge.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-firefox.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-firefox.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-msie.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-msie.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-msie.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-msie.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-safari.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-alt-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-alt-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-chrome.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-chrome.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-firefox.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-android-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-android-firefox.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-chrome.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-chrome.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-edge.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-edge.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-edge.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-edge.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-edge.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-edge.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-edge.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-edge.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-firefox.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-firefox.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-ios-safari.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-ios-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-ios-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-ios-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-msie.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-msie.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-msie.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-msie.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-msie.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-msie.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-msie.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-msie.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-safari.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-safari.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form-fileupload-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form-fileupload-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-chrome.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-chrome.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-chrome.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-firefox.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-firefox.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-android-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-android-firefox.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-chrome.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-chrome.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-chrome.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-edge.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-edge.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-edge.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-edge.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-edge.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-edge.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-edge.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-edge.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-firefox.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-firefox.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-firefox.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-ios-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-ios-safari.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-ios-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-ios-safari.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-ios-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-ios-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-ios-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-ios-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-msie.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-msie.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-msie.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-msie.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-msie.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-msie.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-msie.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-msie.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-osx-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-osx-safari.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-osx-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-osx-safari.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-osx-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-osx-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-form1-osx-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-form1-osx-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-binary-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-binary-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-nested-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-nested-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only2-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-number-only2-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt similarity index 87% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt index 1ce9ca18e50f..8260a2aa3066 100644 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-chrome.expected.txt @@ -14,4 +14,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OP Parts-Count|3 Part-ContainsContents|_charset_|Shift_JIS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-chrome.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt similarity index 84% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt index 0a05edeeeff7..cb2df5a06e50 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-firefox.expected.txt @@ -11,4 +11,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Android 8.1.0; Mobile; rv:59.0) Gecko/59. Parts-Count|3 Part-ContainsContents|_charset_|Shift_JIS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-android-firefox.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt similarity index 87% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt index 0d91a3d3545b..bba566692014 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-chrome.expected.txt @@ -15,4 +15,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/ Parts-Count|3 Part-ContainsContents|_charset_|Shift_JIS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-chrome.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt similarity index 84% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt index 4b4cc724c95f..5b085a52eca6 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-edge.expected.txt @@ -11,4 +11,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/ Parts-Count|3 Part-ContainsContents|_charset_|utf-8 Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|E581A5E6B2BB +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|E383A3E383A6E68886E382BF \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-edge.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-edge.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-edge.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt similarity index 84% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt index f085e29368df..87cd1644e700 100644 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-firefox.expected.txt @@ -11,4 +11,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gec Parts-Count|3 Part-ContainsContents|_charset_|Shift_JIS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-firefox.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt similarity index 85% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt index 2d6fbab768cd..c599146f93c9 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-ios-safari.expected.txt @@ -12,4 +12,6 @@ Request-Header|User-Agent|Mozilla/5.0 (iPad; CPU OS 11_2_6 like Mac OS X) AppleW Parts-Count|3 Part-ContainsContents|_charset_|Shift_JIS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-ios-safari.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt similarity index 83% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt index 5d84aa6eb753..bae3742c88a0 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-msie.expected.txt @@ -11,4 +11,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touc Parts-Count|3 Part-ContainsContents|_charset_|utf-8 Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|E581A5E6B2BB +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|E383A3E383A6E68886E382BF \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-msie.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-msie.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-msie.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt similarity index 85% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt index 18452b29e95c..808603ff8fee 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-safari.expected.txt @@ -12,4 +12,6 @@ Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleW Parts-Count|3 Part-ContainsContents|_charset_|Shift_JIS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-charset-form-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-charset-form-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt similarity index 81% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt index f5e2236ce9b6..49694247bceb 100644 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-chrome.expected.txt @@ -12,5 +12,8 @@ Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html Request-Header|Upgrade-Insecure-Requests|1 Request-Header|User-Agent|Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.021) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 Parts-Count|2 +# Parts were submitted in Shift_JIS encoding by Chrome on Android Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-chrome.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt similarity index 77% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt index b3baf1946894..c221112b98de 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-firefox.expected.txt @@ -9,5 +9,8 @@ Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html Request-Header|Upgrade-Insecure-Requests|1 Request-Header|User-Agent|Mozilla/5.0 (Android 8.1.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 Parts-Count|2 +# Parts were submitted in Shift_JIS encoding by Firefox Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-android-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-android-firefox.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-chrome.expected.txt similarity index 81% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-chrome.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-chrome.expected.txt index 6cba2d9e365b..74cc77995416 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-chrome.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-chrome.expected.txt @@ -13,5 +13,8 @@ Request-Header|Referer|http://localhost:9090/sjis-form.html Request-Header|Upgrade-Insecure-Requests|1 Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 Parts-Count|2 +# Parts were submitted in Shift_JIS encoding by Chrome Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-chrome.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-chrome.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-chrome.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-edge.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-edge.expected.txt similarity index 79% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-edge.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-edge.expected.txt index f51c4cc13991..939158e9f751 100644 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-edge.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-edge.expected.txt @@ -9,5 +9,8 @@ Request-Header|Host|localhost:9090 Request-Header|Referer|http://localhost:9090/sjis-form.html Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 Parts-Count|2 +# Parts were submitted in UTF-8 encoding by Edge Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|E581A5E6B2BB +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|E383A3E383A6E68886E382BF \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-edge.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-edge.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-edge.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-edge.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-firefox.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-firefox.expected.txt similarity index 77% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-firefox.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-firefox.expected.txt index ad25c45b3216..e1f835ff3f50 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-firefox.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-firefox.expected.txt @@ -9,5 +9,8 @@ Request-Header|Referer|http://localhost:9090/sjis-form.html Request-Header|Upgrade-Insecure-Requests|1 Request-Header|User-Agent|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 Parts-Count|2 +# Parts were submitted in Shift_JIS encoding by Firefox Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-firefox.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-firefox.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-firefox.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-firefox.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt similarity index 79% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt index e4b4d8168e78..490210df3110 100644 --- a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-ios-safari.expected.txt @@ -10,5 +10,8 @@ Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html Request-Header|Upgrade-Insecure-Requests|1 Request-Header|User-Agent|Mozilla/5.0 (iPad; CPU OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1 Parts-Count|2 +# Parts were submitted in Shift_JIS encoding by Safari on IOS Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-ios-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-ios-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-ios-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-msie.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-msie.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-msie.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-msie.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-msie.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-msie.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-msie.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-msie.raw diff --git a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-safari.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-safari.expected.txt similarity index 79% rename from jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-safari.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-safari.expected.txt index 2acbd52718bf..dc4117e6ea4b 100644 --- a/jetty-ee9/jetty-ee9-nested/src/test/resources/multipart/browser-capture-sjis-form-safari.expected.txt +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-safari.expected.txt @@ -10,5 +10,8 @@ Request-Header|Referer|http://192.168.0.119:9090/sjis-form.html Request-Header|Upgrade-Insecure-Requests|1 Request-Header|User-Agent|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6 Parts-Count|2 +# Parts were submitted in Shift_JIS encoding by Safari Part-ContainsContents|japanese|健治 -Part-ContainsContents|hello|ャユ戆タ \ No newline at end of file +Part-ContainsHex|japanese|8C928EA1 +Part-ContainsContents|hello|ャユ戆タ +Part-ContainsHex|hello|83838386262332353039343B835E \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-safari.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-safari.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-form-safari.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-form-safari.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-sjis-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-sjis-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-strange-quoting-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-text-files-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-text-files-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-apache-httpcomp.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-unicode-names-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-unicode-names-jetty-client.raw diff --git a/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-16-fileupload-chrome.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-16-fileupload-chrome.expected.txt new file mode 100644 index 000000000000..622f9747f03c --- /dev/null +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-16-fileupload-chrome.expected.txt @@ -0,0 +1,21 @@ +Request-Header|Accept|text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 +Request-Header|Accept-Encoding|gzip, deflate, br +Request-Header|Accept-Language|en-US,en;q=0.9,pt;q=0.8 +Request-Header|Cache-Control|no-cache +Request-Header|Connection|keep-alive +Request-Header|Content-Length|334 +Request-Header|Content-Type|multipart/form-data; boundary=----WebKitFormBoundary7kHAnf6TKNGH3Ac3 +Request-Header|Cookie|visited=yes +Request-Header|Host|localhost:9090 +Request-Header|Origin|http://localhost:9090 +Request-Header|Pragma|no-cache +Request-Header|Referer|http://localhost:9090/form-fileupload.html +Request-Header|Sec-Fetch-Dest|document +Request-Header|Sec-Fetch-Mode|navigate +Request-Header|Sec-Fetch-Site|same-origin +Request-Header|Upgrade-Insecure-Requests|1 +Request-Header|User-Agent|Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 +Parts-Count|2 +Part-ContainsContents|description|whitespace-16 +Part-Filename|file|whitespace-16.bytes +Part-Sha1sum|file|6f2520646be7df341572a818b6e6b5a5685020e1 diff --git a/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-16-fileupload-chrome.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-16-fileupload-chrome.raw new file mode 100644 index 000000000000..47210053239b --- /dev/null +++ b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-16-fileupload-chrome.raw @@ -0,0 +1,10 @@ +------WebKitFormBoundary7kHAnf6TKNGH3Ac3 +Content-Disposition: form-data; name="description" + +whitespace-16 +------WebKitFormBoundary7kHAnf6TKNGH3Ac3 +Content-Disposition: form-data; name="file"; filename="whitespace-16.bytes" +Content-Type: application/octet-stream + + +------WebKitFormBoundary7kHAnf6TKNGH3Ac3-- diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-only-jetty-client.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-only-jetty-client.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-whitespace-only-jetty-client.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-whitespace-only-jetty-client.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw b/tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/browser-capture-zalgo-text-plain-apache-httpcomp.raw diff --git a/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64-long.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64-long.expected.txt new file mode 100644 index 000000000000..5e5e24ff67f5 --- /dev/null +++ b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64-long.expected.txt @@ -0,0 +1,5 @@ +Content-Type|multipart/form-data; boundary="JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8" +Parts-Count|1 +Part-Filename|png|jetty-avatar-256.png +# For base64 decoded use Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 +Part-Sha1sum|png|acfe7f4d511c797c77cd7ffc42321d0958270d33 \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64-long.raw b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64-long.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/multipart-base64-long.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64-long.raw diff --git a/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64.expected.txt new file mode 100644 index 000000000000..9a69aa083595 --- /dev/null +++ b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64.expected.txt @@ -0,0 +1,5 @@ +Content-Type|multipart/form-data; boundary="8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp" +Parts-Count|1 +Part-Filename|png|jetty-avatar-256.png +# For base64 decoded use Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 +Part-Sha1sum|png|e5aff123276cdbf12c6ea6f189718a46b6fc20b6 \ No newline at end of file diff --git a/jetty-core/jetty-http/src/test/resources/multipart/multipart-base64.raw b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/multipart-base64.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/multipart-base64.raw diff --git a/jetty-core/jetty-http/src/test/resources/multipart/multipart-uppercase.expected.txt b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-uppercase.expected.txt similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/multipart-uppercase.expected.txt rename to tests/jetty-test-multipart/src/main/resources/multipart/multipart-uppercase.expected.txt diff --git a/jetty-core/jetty-http/src/test/resources/multipart/multipart-uppercase.raw b/tests/jetty-test-multipart/src/main/resources/multipart/multipart-uppercase.raw similarity index 100% rename from jetty-core/jetty-http/src/test/resources/multipart/multipart-uppercase.raw rename to tests/jetty-test-multipart/src/main/resources/multipart/multipart-uppercase.raw diff --git a/tests/pom.xml b/tests/pom.xml index e0e2ecaf4652..94b0ee9219b9 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -13,6 +13,7 @@ jetty-testers jetty-jmh + jetty-test-multipart jetty-test-session-common test-distribution test-integration