diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index 528426af320..0c13c7c8004 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -943,9 +943,8 @@ nsresult CNavDTD::HandleEntityToken(CToken* aToken) {
CEntityToken* et = (CEntityToken*)(aToken);
nsresult result=NS_OK;
- eHTMLTags tokenTagType=(eHTMLTags)et->GetTypeID();
- if(PR_FALSE==CanOmit(GetTopNode(),tokenTagType)) {
+ if(PR_FALSE==CanOmit(GetTopNode(),eHTMLTag_entity)) {
nsCParserNode aNode((CHTMLToken*)aToken,mLineNumber);
result=AddLeaf(aNode);
}
@@ -3175,11 +3174,11 @@ CNavDTD::ConsumeEntity(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
if(NS_OK==result) {
if(nsString::IsAlpha(ch)) { //handle common enity references &xxx; or .
- aToken = gTokenRecycler.CreateTokenOfType(eToken_entity,eHTMLTag_unknown,gEmpty);
+ aToken = gTokenRecycler.CreateTokenOfType(eToken_entity,eHTMLTag_entity,gEmpty);
result = aToken->Consume(ch,aScanner); //tell new token to finish consuming text...
}
else if(kHashsign==ch) {
- aToken = gTokenRecycler.CreateTokenOfType(eToken_entity,eHTMLTag_unknown,gEmpty);
+ aToken = gTokenRecycler.CreateTokenOfType(eToken_entity,eHTMLTag_entity,gEmpty);
result=aToken->Consume(0,aScanner);
}
else {
@@ -3225,7 +3224,7 @@ CNavDTD::ConsumeWhitespace(PRUnichar aChar,
* @return new token or null
*/
nsresult CNavDTD::ConsumeComment(PRUnichar aChar,CScanner& aScanner,CToken*& aToken){
- aToken = gTokenRecycler.CreateTokenOfType(eToken_comment,eHTMLTag_unknown,gEmpty);
+ aToken = gTokenRecycler.CreateTokenOfType(eToken_comment,eHTMLTag_comment,gEmpty);
nsresult result=NS_OK;
if(aToken) {
result=aToken->Consume(aChar,aScanner);
diff --git a/mozilla/htmlparser/src/nsLoggingSink.cpp b/mozilla/htmlparser/src/nsLoggingSink.cpp
index 508b25ebd5c..7cd02729a9e 100644
--- a/mozilla/htmlparser/src/nsLoggingSink.cpp
+++ b/mozilla/htmlparser/src/nsLoggingSink.cpp
@@ -41,7 +41,7 @@ static char gSkippedContentTags[] = {
* @param
* @return
*/
-ostream& operator<<(ostream& os,nsAutoString& aString){
+ostream& operator<<(ostream& os, nsAutoString& aString) {
const PRUnichar* uc=aString.GetUnicode();
int len=aString.Length();
for(int i=0;i= eHTMLTag_unknown) &&
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
const char* tag = NS_EnumToTag(nodeType);
- (*mOutput) << "" << endl;
WriteAttributes(aNode);
@@ -439,29 +456,29 @@ nsLoggingSink::LeafNode(const nsIParserNode& aNode)
PRInt32 pos;
nsAutoString tmp;
switch (nodeType) {
- case eHTMLTag_whitespace:
- case eHTMLTag_text:
- QuoteText(aNode.GetText(), tmp);
- (*mOutput) << "" << endl;
- break;
+ case eHTMLTag_whitespace:
+ case eHTMLTag_text:
+ QuoteText(aNode.GetText(), tmp);
+ (*mOutput) << "" << endl;
+ break;
- case eHTMLTag_newline:
- (*mOutput) << "" << endl;
- break;
+ case eHTMLTag_newline:
+ (*mOutput) << "" << endl;
+ break;
- case eHTMLTag_entity:
- tmp.Append(aNode.GetText());
- tmp.Cut(0, 1);
- pos = tmp.Length() - 1;
- if (pos >= 0) {
- tmp.Cut(pos, 1);
- }
- (*mOutput) << "" << endl;
- break;
+ case eHTMLTag_entity:
+ tmp.Append(aNode.GetText());
+ tmp.Cut(0, 1);
+ pos = tmp.Length() - 1;
+ if (pos >= 0) {
+ tmp.Cut(pos, 1);
+ }
+ (*mOutput) << "" << endl;
+ break;
- default:
- NS_NOTREACHED("unsupported leaf node type");
- }
+ default:
+ NS_NOTREACHED("unsupported leaf node type");
+ }//switch
}
return NS_OK;
}
diff --git a/mozilla/htmlparser/src/nsParserNode.cpp b/mozilla/htmlparser/src/nsParserNode.cpp
index c18127336e6..fb3dc217848 100644
--- a/mozilla/htmlparser/src/nsParserNode.cpp
+++ b/mozilla/htmlparser/src/nsParserNode.cpp
@@ -205,7 +205,7 @@ PRInt32 nsCParserNode::GetNodeType(void) const{
/**
* Gets the token type, which corresponds to a value from
- * eHTMLTags_xxx.
+ * eHTMLTokens_xxx.
*
* @update gess 3/25/98
* @param
diff --git a/mozilla/htmlparser/tests/logparse/filelist.txt b/mozilla/htmlparser/tests/logparse/filelist.txt
new file mode 100644
index 00000000000..2c34c42d0e1
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/filelist.txt
@@ -0,0 +1,10 @@
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test0.html s:/mozilla/htmlparser/tests/logparse/test0.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test1.html s:/mozilla/htmlparser/tests/logparse/test1.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test2.html s:/mozilla/htmlparser/tests/logparse/test2.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test3.html s:/mozilla/htmlparser/tests/logparse/test3.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test4.html s:/mozilla/htmlparser/tests/logparse/test4.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test5.html s:/mozilla/htmlparser/tests/logparse/test5.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test6.html s:/mozilla/htmlparser/tests/logparse/test6.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test7.html s:/mozilla/htmlparser/tests/logparse/test7.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test8.html s:/mozilla/htmlparser/tests/logparse/test8.bl
+s:/mozilla/dist/win32_d.obj/bin/res/samples/test9.html s:/mozilla/htmlparser/tests/logparse/test9.bl
\ No newline at end of file
diff --git a/mozilla/htmlparser/tests/logparse/logparse.cpp b/mozilla/htmlparser/tests/logparse/logparse.cpp
index d4dffae165b..087f6ac49a1 100644
--- a/mozilla/htmlparser/tests/logparse/logparse.cpp
+++ b/mozilla/htmlparser/tests/logparse/logparse.cpp
@@ -118,27 +118,45 @@ PRBool CompareFiles(const char* aFilename1, const char* aFilename2) {
//----------------------------------------------------------------------
+void ComputeTempFilename(const char* anIndexFilename, char* aTempFilename) {
+ if(anIndexFilename) {
+ strcpy(aTempFilename,anIndexFilename);
+ char* pos=strrchr(aTempFilename,'\\');
+ if(!pos)
+ pos=strrchr(aTempFilename,'/');
+ if(pos) {
+ (*pos)=0;
+ strcat(aTempFilename,"/temp.blx");
+ return;
+ }
+ }
+ //fall back to our last resort...
+ strcpy(aTempFilename,"c:/windows/temp/temp.blx");
+}
+
+//----------------------------------------------------------------------
+
static const char* kAppName = "logparse ";
static const char* kOption1 = "Compare baseline file-set";
static const char* kOption2 = "Generate baseline ";
-static const char* kResultMsg[2] = {" does not match baseline."," matches baseline."};
+static const char* kResultMsg[2] = {" failed!"," ok."};
void ValidateBaselineFiles(const char* anIndexFilename) {
fstream theIndexFile(anIndexFilename,ios::in | ios::nocreate);
char theFilename[500];
char theBaselineFilename[500];
+ char theTempFilename[500];
PRBool done=PR_FALSE;
+ ComputeTempFilename(anIndexFilename,theTempFilename);
+
while(!done) {
theIndexFile >> theFilename;
theIndexFile >> theBaselineFilename;
if(theFilename[0] && theBaselineFilename[0]) {
- char theTempFile[500];
- sprintf(theTempFile,theBaselineFilename);
- strcat(theTempFile,"x");
- if(0==GenerateBaselineFile(theFilename,theTempFile)) {
- PRBool matches=CompareFiles(theTempFile,theBaselineFilename);
+ if(0==GenerateBaselineFile(theFilename,theTempFilename)) {
+ PRBool matches=CompareFiles(theTempFilename,theBaselineFilename);
cout << theFilename << kResultMsg[matches] << endl;
}
}
diff --git a/mozilla/htmlparser/tests/logparse/test0.bl b/mozilla/htmlparser/tests/logparse/test0.bl
new file mode 100644
index 00000000000..2227e8e077c
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test0.bl
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/htmlparser/tests/logparse/test1.bl b/mozilla/htmlparser/tests/logparse/test1.bl
new file mode 100644
index 00000000000..21f5cae6e18
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test1.bl
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/htmlparser/tests/logparse/test2.bl b/mozilla/htmlparser/tests/logparse/test2.bl
new file mode 100644
index 00000000000..c69833979f1
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test2.bl
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/htmlparser/tests/logparse/test3.bl b/mozilla/htmlparser/tests/logparse/test3.bl
new file mode 100644
index 00000000000..a4b9b7ea112
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test3.bl
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/htmlparser/tests/logparse/test4.bl b/mozilla/htmlparser/tests/logparse/test4.bl
new file mode 100644
index 00000000000..2d9091481b6
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test4.bl
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/htmlparser/tests/logparse/test5.bl b/mozilla/htmlparser/tests/logparse/test5.bl
new file mode 100644
index 00000000000..00723c9034a
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test5.bl
@@ -0,0 +1,969 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/htmlparser/tests/logparse/test6.bl b/mozilla/htmlparser/tests/logparse/test6.bl
new file mode 100644
index 00000000000..dcfd59df718
--- /dev/null
+++ b/mozilla/htmlparser/tests/logparse/test6.bl
@@ -0,0 +1,831 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+