diff --git a/.hgignore b/.hgignore deleted file mode 100644 index c785e95..0000000 --- a/.hgignore +++ /dev/null @@ -1,6 +0,0 @@ -syntax: glob -php/test-settings.php -php/bin/*.html -*.pyc -tags -stats.prof diff --git a/LICENSE b/LICENSE deleted file mode 100644 index bd6070e..0000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2006-2011 The Authors - -Contributors: -James Graham - jg307@cam.ac.uk -Anne van Kesteren - annevankesteren@gmail.com -Lachlan Hunt - lachlan.hunt@lachy.id.au -Matt McDonald - kanashii@kanashii.ca -Sam Ruby - rubys@intertwingly.net -Ian Hickson (Google) - ian@hixie.ch -Thomas Broyer - t.broyer@ltgt.net -Jacques Distler - distler@golem.ph.utexas.edu -Henri Sivonen - hsivonen@iki.fi -Adam Barth - abarth@webkit.org -Eric Seidel - eric@webkit.org -The Mozilla Foundation (contributions from Henri Sivonen since 2008) -David Flanagan (Mozilla) - dflanagan@mozilla.com - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile deleted file mode 100644 index 7586f63..0000000 --- a/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -PY := python -PY3 := python3 - -ALL := $(filter-out %.pyc, $(shell find $(PY) -type f)) -DIRS := $(shell find $(PY) -type d) - -PY3_ALL = $(patsubst $(PY)/%, $(PY3)/%, $(ALL)) -PY3_DIRS = $(patsubst $(PY)/%, $(PY3)/%, $(DIRS)) - -.PHONY : all -all: $(PY3_ALL) - -$(PY3)/%.py: $(PY)/%.py - $(if $(wildcard $@),,$(warning Use make --always-make twice when converting new files)) - @echo Converting $@ - @cp $< $@ - @2to3 --no-diffs -wn $@ - -$(PY3)/%: $(PY)/% - cp $< $@ - -$(PY3_ALL): | $(PY3_DIRS) - -$(PY3_DIRS): - mkdir -p $@ - -.PHONY : clean -clean: - rm -rf $(PY3) \ No newline at end of file diff --git a/Ports.md b/Ports.md new file mode 100644 index 0000000..cd6afc3 --- /dev/null +++ b/Ports.md @@ -0,0 +1,19 @@ +html5lib ports (providing a similar public API): + + * Python + * [html5lib-python](https://github.com/html5lib/html5lib-python): the original html5lib implementation + * PHP + * [html5lib-php](https://github.com/html5lib/html5lib-php): dated, unmaintained, port + * Ruby + * [html5lib-ruby](https://github.com/html5lib/html5lib-ruby): dated, unmaintained, port + * Dart + * [Dart html5lib](https://github.com/dart-lang/html5lib): a third-party port to Dart. + +Other HTML parsers: + + * JavaScript + * [HTML5 parser for node.js](https://github.com/aredridel/html5) by Aria Stewart + * [dom.js implementation of DOM4](https://github.com/andreasgal/dom.js) by Andreas Gal and David Flanagan + * [Live DOM Viewer](http://livedom.validator.nu/) compiled via GWT by Henri Sivonen + * Java + * [Validator.nu HTML parser](http://about.validator.nu/htmlparser/) by Henri Sivonen \ No newline at end of file diff --git a/ProjectHome.md b/ProjectHome.md new file mode 100644 index 0000000..3ce7ef3 --- /dev/null +++ b/ProjectHome.md @@ -0,0 +1 @@ +# NOTE: html5lib is now hosted at github: https://github.com/html5lib # \ No newline at end of file diff --git a/UserDocumentation.md b/UserDocumentation.md new file mode 100644 index 0000000..905d37d --- /dev/null +++ b/UserDocumentation.md @@ -0,0 +1,226 @@ +# Using html5lib # + +## Installation ## + +Releases can be installed using `pip` in the usual way: +``` + $ pip install html5lib +``` + +The development version can be installed by cloning the source repository using mercurial and running: +``` + $ python setup.py develop +``` +in the `python` directory. + +## Tests ## + +The development version of html5lib comes with an extensive testsuite. All the tests can be run by invoking +runtests.py in the tests/ directory or by running +``` +$ python setup.py nosetests +``` + +## Parsing HTML ## + +Simple usage follows this pattern: +``` +import html5lib +f = open("mydocument.html") +doc = html5lib.parse(f) +``` +This will return a tree in a custom "simpletree" format. More interesting is the ability to use a variety of standard tree formats; currently minidom, ElementTree, lxml and BeafutifulSoup (deprecated) formats are supported by default. To do this you pass a string indicating the name of the tree format to use as the "treebuilder" argument to the parse method: +``` +import html5lib +f = open("mydocument.html") +doc = html5lib.parse(f, treebuilder="lxml") +``` + +It is also possible to explicitly create a parser object: +``` +import html5lib +f = open("mydocument.html") +parser = html5lib.HTMLParser() +doc = parser.parse(f) +``` +To output non-simpletree tree formats when explicitly creating a parser, you need to pass a TreeBuilder class as the "tree" argument to the HTMLParser. For +the built-in treebuilders this can be conveniently obtained from the treebuilders.getTreeBuilder function e.g. for minidom: +``` +import html5lib +from html5lib import treebuilders + +f = open("mydocument.html") +parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom")) +minidom_document = parser.parse(f) +``` + +For a BeautifulSoup tree replace the string "dom" with "beautifulsoup". For +ElementTree the procedure is slightly more involved as there are many libraries +that support the ElementTree API. Therefore getTreeBuilder accepts a second +argument which is the ElementTree implementation that is desired (in the future +this may be extended, for example to allow multiple DOM libraries to be used): + +``` +import html5lib +from html5lib import treebuilders +from xml.etree import cElementTree + +f = open("mydocument.html") +parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("etree", cElementTree)) +etree_document = parser.parse(f) +``` + +If you are using the excellent lxml library, using the generic etree treebuilder described above with fail. Instead you must use the lxml builder: + +``` +import html5lib +from html5lib import treebuilders +from lxml import etree + +f = open("mydocument.html") +parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("lxml")) +etree_document = parser.parse(f) +``` + +### SAX Events ### +The WHATWG spec is not very streaming-friendly as it requires rearrangement of +subtrees in some situations. However html5lib allows SAX events to be created +from a DOM tree using html5lib.treebuilders.dom.dom2sax + +### Character encoding ### + +Parsed trees are always Unicode. However a large variety of input encodings are supported. The encoding of the document is determined in the following way: + + * The encoding may be explicitly specified by passing the name of the encoding as the encoding parameter to HTMLParser.parse + + * If no encoding is specified, the parser will attempt to detect the encoding from a + +<meta> + + element in the first 512 bytes of the document (this is only a partial implementation of the current HTML 5 specification) + + * If no encoding can be found and the chardet library is available, an attempt will be made to sniff the encoding from the byte pattern + + * If all else fails, the default encoding (usually Windows-1252) will be used + +#### Examples #### + +Explicit encoding specification: +``` +import html5lib +import urllib2 +p = html5lib.HTMLParser() +p.parse(urllib2.urlopen("http://yahoo.co.jp", encoding="euc-jp").read()) +``` + +Automatic detection from a meta element: +``` +import html5lib +import urllib2 +p = html5lib.HTMLParser() +p.parse(urllib2.urlopen("http://www.mozilla-japan.org/").read()) +``` + +## Sanitizing Tokenizer ## + +When building web applications it is often necessary to remove unsafe markup and +CSS from user entered content. html5lib provides a custom tokenizer for this +purpose. It only allows known safe element tokens through and converts others +to text. Similarly, a variety of unsafe CSS constructs are removed from the +stream. For more details on the default configuration of the sanitizer, see +http://wiki.whatwg.org/wiki/Sanitization_rules The sanitizer can be used by +passing it as the tokenizer argument to the parser: +``` +import html5lib +from html5lib import sanitizer + +p = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer) +p.parse("") +``` + +## Treewalkers ## + +Treewalkers provide a streaming view of a tree. They are useful for filtering +and serializing the stream. html5lib provides a variety of treewalkers for +working with different tree types. For example, to stream a dom tree: +``` +from html5lib import treewalkers +walker = treewalkers.getTreeWalker("dom") + +stream = walker(dom_tree) #stream is an iterable representing each token in the + #tree +``` + +Treewalkers are avaliable for all the tree types supported by the HTMLParser plus +xml.dom.pulldom ("pulldom"), genshi streams ("genshi") and a lxml-optimized +elementtree ("lxml"). As for the treebulders, treewalkers.getTreeWalker takes a +second argument implementation containing a object implementing the ElementTree +API. + +### Sanitization using treewalkers ### +You may wish to sanitize content from an which has been parsed into a tree by some other code. This may be done using the sanitizer filter: + +``` +from html5lib import treewalkers, filters +from html5lib.filters import sanitizer + +walker = treewalkers.getTreeWalker("dom") + +stream = walker(dom_tree) +clean_stream = sanitizer.Filter(stream) +``` + +### Serialization of Streams ### + +html5lib provides HTML and XHML serializers which work on streams produced by the treewalkers. These are implemented as generators with each item in the generator representing a single tag. A full example of parsing and serializing content looks like: + +``` +import html5lib +from html5lib import treebuilders, treewalkers, serializer +from html5lib.filters import sanitizer + +p = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom")) + +dom_tree = p.parse("
Hello World
") + +walker = treewalkers.getTreeWalker("dom") + +stream = walker(dom_tree) + +s = serializer.htmlserializer.HTMLSerializer(omit_optional_tags=False) +output_generator = s.serialize(stream) + +for item in output_generator: + print item + + + + + ++ +Hello + + +World +
+ + + +``` + + +# Bugs # + +Please report any bugs on the issue tracker: +http://code.google.com/p/html5lib/issues/list + +# Ports # + +There is a listing of [html5lib ports](Ports.md) to JavaScript, Ruby and more. + +# Get Involved # + +Contributions to code or documenation are actively encouraged. Submit +patches to the issue tracker or discuss changes on irc in the #whatwg +channel on freenode.net \ No newline at end of file diff --git a/c/chtml5lib/charset.c b/c/chtml5lib/charset.c deleted file mode 100644 index b36157d..0000000 --- a/c/chtml5lib/charset.c +++ /dev/null @@ -1,289 +0,0 @@ -#include "charset.h" - -struct vstr *get_encoding(FILE *stream, num_bytes_meta) { - - //Read the first 512 bytes of the stream into an array - char buf[num_bytes_meta+1]; - int n; - struct vstr *encoding; - - encoding = vstr_new(8); - - n = fread(buf, 1, BUF_SIZE, stream); - //Reset the buffer position - fseek(stream, -n, SEEK_CUR); - buf[n] = '\0'; - - //Check for byte order marks - if (strncmp(buf, "\xfe\xff", 2) == 0) { - vstr_append(encoding, "UTF-16BE"); - } else if(strncmp(buf, "\xff\xfe", 2) == 0) { - vstr_append(encoding, "UTF-16LE"); - } else if(strncmp(buf, "\xef\xbb\xbf", 3) == 0) { - vstr_append(encoding, "UTF-8"); - } else { - //Run autodetect algorithm - detect_encoding(&buf[0], encoding); - } - - return encoding; -}; - -void detect_encoding(char *buf, struct vstr *encoding) { - while (*buf != '\0') { - if (strncmp(buf, ""); - } else if(strncmp(buf, "str) != '\0') { - break; - } - } else if (*buf == '<' && isalpha((int)*(buf+1))) { - buf = handle_tag(buf); - } else if (*buf == '<' && *(buf+1) == '/' && isalpha((int)*(buf+2))) { - buf = handle_tag(buf); - } else if (strncmp(buf, ""); - if (buf == NULL) { - break; - } - } - buf++; - } -}; - -struct attr *attr_new() { - struct attr *new_attr; - new_attr = (struct attr *)malloc(sizeof(struct attr)); - return new_attr; -}; - -char *handle_meta(char *buf, struct vstr *encoding) { - struct attr *attr_value; - buf += 5; //Point to the character after the a - if (isspace((int)*buf) == 0) { - //The next character is not a space so treat it as an ordinary tag - buf -= 5; - buf = handle_tag(buf); - } else { - attr_value = attr_new(); - buf = get_attr(buf, attr_value); - while (*(attr_value->name->str) != '\0') { - if (vstr_cmp(attr_value->name, "charset") == 0) { - if (is_encoding(attr_value->value)) { - vstr_append(encoding, attr_value->value->str); - break; - } - } else if (vstr_cmp(attr_value->name, "content")) { - //Parse the content value - struct vstr *content_encoding = handle_content_type(attr_value->value); - if (*(content_encoding->str) != '\0' && is_encoding(content_encoding)) { - vstr_append(encoding, content_encoding->str); - break; - } - vstr_free(content_encoding); - } - buf = get_attr(buf, attr_value); - } - free(attr_value); - } - return buf; -}; - -char *jump_to(char *str, char* target) { - //Return pointer to the last byte in the first match of target in str or null if is not present; - while (1) { - //Find a matching first character - while (*str != '\0' && *str != *target) { - str++; - } - if (*str == '\0') { - str = NULL; - break; - } else if(strncmp(str, target, strlen(target)) == 0) { - str += strlen(target)-1; - break; - } - } - return str; -}; - -char *handle_tag(char *buf) { - int skip_chars; - struct attr *attr_value; - buf++; - - skip_chars = strcspn(buf, "\t\n\f\v\f\r /><"); - buf += skip_chars; - - if (*buf == '<') { - buf -= 1; // This will be added back on in the caller - return buf; - }; - - attr_value = attr_new(); - buf = get_attr(buf, attr_value); - while (*(attr_value->name->str) != '\0' && buf != '\0') { - buf = get_attr(buf, attr_value); - }; - free(attr_value); - - return buf; -}; - -char *get_attr(char *buf, struct attr *attr_value) { - int skip_chars; - char quote[1]; - char lcase_letter[1]; - - int spaces = 0; //Do the spaces step - - attr_value->name = vstr_new(8); - attr_value->value = vstr_new(8); - - *(attr_value->name->str) = '\0'; - *(attr_value->value->str) = '\0'; - skip_chars = strspn(buf, "\t\n\f\v\f\r /"); - buf += skip_chars; - if (*buf == '\0' || *buf == '<' || *buf == '>') { - if (*buf == '<') { - buf -=1; - } - return buf; - } - - while (1) { - if (*buf == '\0') { - return buf; - } else if (*buf == '=' && strlen(attr_value->name->str) != 0) { - buf++; - break; - } else if (isspace((int)(*buf))){ - spaces = 1; - break; - } else if (*buf == '/' || *buf == '<' || *buf == '>') { - return buf; - } else if(isupper((int)(*buf))) { - lcase_letter[0] = (char)tolower((int)(*buf)); - vstr_append_n(attr_value->name, lcase_letter, 1); - } else { - vstr_append_n(attr_value->name, buf, 1); - } - buf++; - } - - if (spaces) { - buf = skip_space(buf); - if (*buf != '=') { - buf -= 1; - return buf; - } else { - buf++; - } - } - - buf = skip_space(buf); - if (*buf == '\'' || *buf == '"') { - quote[0] = *buf; - buf++; - while (*buf != quote[0] && *buf != '\0') { - if (isupper((int)(*buf))) { - vstr_append_n(attr_value->value, (char *)tolower((int)(*buf)), 1); - } else { - vstr_append_n(attr_value->value, buf, 1); - } - buf++; - } - //XXX need to advance position here - if (*buf == quote[0]) { - buf++; - } - return buf; - } else if (*buf == '<' || *buf == '>' || *buf == '\0'){ - return buf; - } else if (isupper((int)(*buf))) { - lcase_letter[0] = (char)tolower((int)(*buf)); - vstr_append_n(attr_value->value, lcase_letter, 1); - } else { - vstr_append_n(attr_value->value, buf, 1); - }; - buf++; - while (buf != '\0') { - if (isspace((int)(*buf)) || *buf == '<' || *buf == '>') { - return buf; - } else if (isupper((int)(*buf))) { - lcase_letter[0] = (char)tolower((int)(*buf)); - vstr_append_n(attr_value->value, lcase_letter, 1); - } else { - vstr_append_n(attr_value->value, buf, 1); - }; - buf++; - } - return buf; -}; - -struct vstr *handle_content_type(struct vstr *attr_value) { - struct vstr *encoding; - char *value; - char *quote; - - encoding = vstr_new(8); - value = attr_value->str; - //Skip characters up to and including the first ; - value = jump_to(value, ";"); - value++; - - if (*value == '\0') { - return encoding; - } - - skip_space(value); - - if (strncmp(value, "charset", 7) != 0) { - return encoding; - } - value += 7; - - skip_space(value); - - if (*value != '=') { - return encoding; - } - - value++; - - skip_space(value); - - if (*value == '\'' || *value == '"') { - quote = value; - value++; - if (strstr(value, quote) != NULL) { - while(value != quote) { - vstr_append_n(encoding, value, 1); - value++; - } - return encoding; - } else { - return encoding; - } - } else { - while(*value != '\0' && isspace((int)(*value)) == 0) { - vstr_append_n(encoding, value, 1); - value++; - } - return encoding; - } -}; - -int is_encoding(struct vstr *encoding) { - //Is the string a valid encoding? - //return 1; - return vstr_in_char_array(encoding, valid_encodings, sizeof(valid_encodings)/sizeof(char*)); -}; - -char *skip_space(char *buf) { - int skip_chars=0; - skip_chars = strspn(buf, "\t\n\f\v\f\r "); - buf += skip_chars; - return buf; -}; \ No newline at end of file diff --git a/c/chtml5lib/charset.h b/c/chtml5lib/charset.h deleted file mode 100644 index bfcba2e..0000000 --- a/c/chtml5lib/charset.h +++ /dev/null @@ -1,19 +0,0 @@ -#include "utils.h" - -#define BUF_SIZE 512 //preparse buffer size - -struct attr { - struct vstr *name; - struct vstr *value; -}; - -struct vstr *get_encoding(FILE *stream); -void detect_encoding(char* buf, struct vstr *encoding;); -char *jump_to(char *str, char* target); -char *get_attr(char *buf, struct attr *attr_value); -char *handle_tag(char *buf); -int is_encoding(struct vstr *encoding); -char *skip_space(char *buf); -char *handle_meta(char *buf, struct vstr *encoding); -struct vstr *handle_content_type(struct vstr *attr_value); -struct attr *attr_new(); \ No newline at end of file diff --git a/c/chtml5lib/consts.c b/c/chtml5lib/consts.c deleted file mode 100644 index d289fd4..0000000 --- a/c/chtml5lib/consts.c +++ /dev/null @@ -1,219 +0,0 @@ -#include "consts.h" - -char *valid_encodings[] = { - "ansi_x3.4-1968", - "iso-ir-6", - "ansi_x3.4-1986", - "iso_646.irv:1991", - "ascii", - "iso646-us", - "us-ascii", - "us", - "ibm367", - "cp367", - "csascii", - "ks_c_5601-1987", - "korean", - "iso-2022-kr", - "csiso2022kr", - "euc-kr", - "iso-2022-jp", - "csiso2022jp", - "iso-2022-jp-2", - "iso-ir-58", - "chinese", - "csiso58gb231280", - "iso_8859-1:1987", - "iso-ir-100", - "iso_8859-1", - "iso-8859-1", - "latin1", - "l1", - "ibm819", - "cp819", - "csisolatin1", - "iso_8859-2:1987", - "iso-ir-101", - "iso_8859-2", - "iso-8859-2", - "latin2", - "l2", - "csisolatin2", - "iso_8859-3:1988", - "iso-ir-109", - "iso_8859-3", - "iso-8859-3", - "latin3", - "l3", - "csisolatin3", - "iso_8859-4:1988", - "iso-ir-110", - "iso_8859-4", - "iso-8859-4", - "latin4", - "l4", - "csisolatin4", - "iso_8859-6:1987", - "iso-ir-127", - "iso_8859-6", - "iso-8859-6", - "ecma-114", - "asmo-708", - "arabic", - "csisolatinarabic", - "iso_8859-7:1987", - "iso-ir-126", - "iso_8859-7", - "iso-8859-7", - "elot_928", - "ecma-118", - "greek", - "greek8", - "csisolatingreek", - "iso_8859-8:1988", - "iso-ir-138", - "iso_8859-8", - "iso-8859-8", - "hebrew", - "csisolatinhebrew", - "iso_8859-5:1988", - "iso-ir-144", - "iso_8859-5", - "iso-8859-5", - "cyrillic", - "csisolatincyrillic", - "iso_8859-9:1989", - "iso-ir-148", - "iso_8859-9", - "iso-8859-9", - "latin5", - "l5", - "csisolatin5", - "iso-8859-10", - "iso-ir-157", - "l6", - "iso_8859-10:1992", - "csisolatin6", - "latin6", - "hp-roman8", - "roman8", - "r8", - "ibm037", - "cp037", - "csibm037", - "ibm424", - "cp424", - "csibm424", - "ibm437", - "cp437", - "437", - "cspc8codepage437", - "ibm500", - "cp500", - "csibm500", - "ibm775", - "cp775", - "cspc775baltic", - "ibm850", - "cp850", - "850", - "cspc850multilingual", - "ibm852", - "cp852", - "852", - "cspcp852", - "ibm855", - "cp855", - "855", - "csibm855", - "ibm857", - "cp857", - "857", - "csibm857", - "ibm860", - "cp860", - "860", - "csibm860", - "ibm861", - "cp861", - "861", - "cp-is", - "csibm861", - "ibm862", - "cp862", - "862", - "cspc862latinhebrew", - "ibm863", - "cp863", - "863", - "csibm863", - "ibm864", - "cp864", - "csibm864", - "ibm865", - "cp865", - "865", - "csibm865", - "ibm866", - "cp866", - "866", - "csibm866", - "ibm869", - "cp869", - "869", - "cp-gr", - "csibm869", - "ibm1026", - "cp1026", - "csibm1026", - "koi8-r", - "cskoi8r", - "koi8-u", - "big5-hkscs", - "ptcp154", - "csptcp154", - "pt154", - "cp154", - "utf-7", - "utf-16be", - "utf-16le", - "utf-16", - "utf-8", - "iso-8859-13", - "iso-8859-14", - "iso-ir-199", - "iso_8859-14:1998", - "iso_8859-14", - "latin8", - "iso-celtic", - "l8", - "iso-8859-15", - "iso_8859-15", - "iso-8859-16", - "iso-ir-226", - "iso_8859-16:2001", - "iso_8859-16", - "latin10", - "l10", - "gbk", - "cp936", - "ms936", - "gb18030", - "shift_jis", - "ms_kanji", - "csshiftjis", - "euc-jp", - "gb2312", - "big5", - "csbig5", - "windows-1250", - "windows-1251", - "windows-1252", - "windows-1253", - "windows-1254", - "windows-1255", - "windows-1256", - "windows-1257", - "windows-1258", - "tis-620", -"hz-gb-2312"}; \ No newline at end of file diff --git a/c/chtml5lib/consts.h b/c/chtml5lib/consts.h deleted file mode 100644 index 6b84cde..0000000 --- a/c/chtml5lib/consts.h +++ /dev/null @@ -1 +0,0 @@ -char *valid_encodings[216]; \ No newline at end of file diff --git a/c/chtml5lib/main.c b/c/chtml5lib/main.c deleted file mode 100644 index 500d46c..0000000 --- a/c/chtml5lib/main.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "charset.h" - -int main(int argc, char* argv[]) { - FILE *fp; - struct vstr *encoding; - - //Take the filename to read from argv[0] for now - - if (argc > 1) { - char* fn = argv[1]; - fp = fopen(fn, "r"); - } else { - printf("No file specfied\n"); - return 1; - } - - encoding = get_encoding(fp); - printf("%s\n", encoding->str); - vstr_free(encoding); - - return 0; -}; \ No newline at end of file diff --git a/c/chtml5lib/utils.c b/c/chtml5lib/utils.c deleted file mode 100644 index a1d905a..0000000 --- a/c/chtml5lib/utils.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "utils.h" - -int vstr_in_char_array(struct vstr *search_item, char *array[], int array_length) { -/*Is an vstr a member of a character array. The array must be sorted - - Returns 1 if the vstr is in the array, 0 otherwise*/ - char *match = NULL; - - //I think the following should work but it doesn't seem to... - /*qsort(array, array_length, sizeof(char *), (int(*)(const void*,const void*))strcmp); - match = (char *)bsearch(search_item->str, *array, array_length, sizeof(char *), (int(*)(const void*,const void*))strcmp);*/ - - int i; - for (i = 0; i < array_length; i++) { - if (*array[i] == *(search_item->str)) { - match = array[i]; - break; - } - } - - if (match == NULL) { - return 0; - } else { - return 1; - }; -} \ No newline at end of file diff --git a/c/chtml5lib/utils.h b/c/chtml5lib/utils.h deleted file mode 100644 index bd83672..0000000 --- a/c/chtml5lib/utils.h +++ /dev/null @@ -1,10 +0,0 @@ -#include*/ - $this->ignore_lf_token = 2; - - $this->original_mode = $this->mode; - $this->flag_frameset_ok = false; - $this->mode = self::IN_CDATA_RCDATA; - - /* Switch the tokeniser's content model flag to the - RCDATA state. */ - $this->content_model = HTML5_Tokenizer::RCDATA; - break; - - /* A start tag token whose tag name is "xmp" */ - case 'xmp': - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name - "p" has been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - )); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->flag_frameset_ok = false; - - $this->insertCDATAElement($token); - break; - - case 'iframe': - $this->flag_frameset_ok = false; - $this->insertCDATAElement($token); - break; - - case 'noembed': case 'noscript': - // XSCRIPT: should check scripting flag - $this->insertCDATAElement($token); - break; - - /* A start tag whose tag name is "select" */ - case 'select': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - $this->flag_frameset_ok = false; - - /* If the insertion mode is one of in table", "in caption", - * "in column group", "in table body", "in row", or "in - * cell", then switch the insertion mode to "in select in - * table". Otherwise, switch the insertion mode to "in - * select". */ - if ( - $this->mode === self::IN_TABLE || $this->mode === self::IN_CAPTION || - $this->mode === self::IN_COLUMN_GROUP || $this->mode ==+self::IN_TABLE_BODY || - $this->mode === self::IN_ROW || $this->mode === self::IN_CELL - ) { - $this->mode = self::IN_SELECT_IN_TABLE; - } else { - $this->mode = self::IN_SELECT; - } - break; - - case 'option': case 'optgroup': - if ($this->elementInScope('option')) { - $this->emitToken(array( - 'name' => 'option', - 'type' => HTML5_Tokenizer::ENDTAG, - )); - } - $this->reconstructActiveFormattingElements(); - $this->insertElement($token); - break; - - case 'rp': case 'rt': - /* If the stack of open elements has a ruby element in scope, then generate - * implied end tags. If the current node is not then a ruby element, this is - * a parse error; pop all the nodes from the current node up to the node - * immediately before the bottommost ruby element on the stack of open elements. - */ - if ($this->elementInScope('ruby')) { - $this->generateImpliedEndTags(); - } - $peek = false; - do { - if ($peek) { - // parse error - } - $peek = array_pop($this->stack); - } while ($peek->tagName !== 'ruby'); - $this->stack[] = $peek; // we popped one too many - $this->insertElement($token); - break; - - // spec diversion - - case 'math': - $this->reconstructActiveFormattingElements(); - $token = $this->adjustMathMLAttributes($token); - $token = $this->adjustForeignAttributes($token); - $this->insertForeignElement($token, self::NS_MATHML); - if (isset($token['self-closing'])) { - // XERROR: acknowledge the token's self-closing flag - array_pop($this->stack); - } - if ($this->mode !== self::IN_FOREIGN_CONTENT) { - $this->secondary_mode = $this->mode; - $this->mode = self::IN_FOREIGN_CONTENT; - } - break; - - case 'svg': - $this->reconstructActiveFormattingElements(); - $token = $this->adjustSVGAttributes($token); - $token = $this->adjustForeignAttributes($token); - $this->insertForeignElement($token, self::NS_SVG); - if (isset($token['self-closing'])) { - // XERROR: acknowledge the token's self-closing flag - array_pop($this->stack); - } - if ($this->mode !== self::IN_FOREIGN_CONTENT) { - $this->secondary_mode = $this->mode; - $this->mode = self::IN_FOREIGN_CONTENT; - } - break; - - case 'caption': case 'col': case 'colgroup': case 'frame': case 'head': - case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': case 'tr': - // parse error - break; - - /* A start tag token not covered by the previous entries */ - default: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->insertElement($token); - /* This element will be a phrasing element. */ - break; - } - break; - - case HTML5_Tokenizer::ENDTAG: - switch($token['name']) { - /* An end tag with the tag name "body" */ - case 'body': - /* If the stack of open elements does not have a body - * element in scope, this is a parse error; ignore the - * token. */ - if(!$this->elementInScope('body')) { - $this->ignored = true; - - /* Otherwise, if there is a node in the stack of open - * elements that is not either a dc element, a dd element, - * a ds element, a dt element, an li element, an optgroup - * element, an option element, a p element, an rp element, - * an rt element, a tbody element, a td element, a tfoot - * element, a th element, a thead element, a tr element, - * the body element, or the html element, then this is a - * parse error. - */ - } else { - // XERROR: implement this check for parse error - } - - /* Change the insertion mode to "after body". */ - $this->mode = self::AFTER_BODY; - break; - - /* An end tag with the tag name "html" */ - case 'html': - /* Act as if an end tag with tag name "body" had been seen, - then, if that token wasn't ignored, reprocess the current - token. */ - $this->emitToken(array( - 'name' => 'body', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - if (!$this->ignored) $this->emitToken($token); - break; - - case 'address': case 'article': case 'aside': case 'blockquote': - case 'center': case 'datagrid': case 'details': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'footer': - case 'header': case 'hgroup': case 'listing': case 'menu': - case 'nav': case 'ol': case 'pre': case 'section': case 'ul': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with - the same tag name as that of the token, then this - is a parse error. */ - // XERROR: implement parse error logic - - /* If the stack of open elements has an element in - scope with the same tag name as that of the token, - then pop elements from this stack until an element - with that tag name has been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== $token['name']); - } else { - // parse error - } - break; - - /* An end tag whose tag name is "form" */ - case 'form': - /* Let node be the element that the form element pointer is set to. */ - $node = $this->form_pointer; - /* Set the form element pointer to null. */ - $this->form_pointer = null; - /* If node is null or the stack of open elements does not - * have node in scope, then this is a parse error; ignore the token. */ - if ($node === null || !in_array($node, $this->stack)) { - // parse error - $this->ignored = true; - } else { - /* 1. Generate implied end tags. */ - $this->generateImpliedEndTags(); - /* 2. If the current node is not node, then this is a parse error. */ - if (end($this->stack) !== $node) { - // parse error - } - /* 3. Remove node from the stack of open elements. */ - array_splice($this->stack, array_search($node, $this->stack, true), 1); - } - - break; - - /* An end tag whose tag name is "p" */ - case 'p': - /* If the stack of open elements has a p element in scope, - then generate implied end tags, except for p elements. */ - if($this->elementInScope('p')) { - /* Generate implied end tags, except for elements with - * the same tag name as the token. */ - $this->generateImpliedEndTags(array('p')); - - /* If the current node is not a p element, then this is - a parse error. */ - // XERROR: implement - - /* Pop elements from the stack of open elements until - * an element with the same tag name as the token has - * been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== 'p'); - - } else { - // parse error - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5_Tokenizer::STARTTAG, - )); - $this->emitToken($token); - } - break; - - /* An end tag whose tag name is "li" */ - case 'li': - /* If the stack of open elements does not have an element - * in list item scope with the same tag name as that of the - * token, then this is a parse error; ignore the token. */ - if ($this->elementInScope($token['name'], self::SCOPE_LISTITEM)) { - /* Generate implied end tags, except for elements with the - * same tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - /* If the current node is not an element with the same tag - * name as that of the token, then this is a parse error. */ - // XERROR: parse error - /* Pop elements from the stack of open elements until an - * element with the same tag name as the token has been - * popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== $token['name']); - } else { - // XERROR: parse error - } - break; - - /* An end tag whose tag name is "dc", "dd", "ds", "dt" */ - case 'dc': case 'dd': case 'ds': case 'dt': - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(array($token['name'])); - - /* If the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // XERROR: implement parse error - - /* Pop elements from the stack of open elements until - * an element with the same tag name as the token has - * been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== $token['name']); - - } else { - // XERROR: parse error - } - break; - - /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - generate implied end tags. */ - if($this->elementInScope($elements)) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as that of the token, then this is a parse error. */ - // XERROR: implement parse error - - /* If the stack of open elements has in scope an element - whose tag name is one of "h1", "h2", "h3", "h4", "h5", or - "h6", then pop elements from the stack until an element - with one of those tag names has been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while (!in_array($node->tagName, $elements)); - } else { - // parse error - } - break; - - /* An end tag whose tag name is one of: "a", "b", "big", "em", - "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'a': case 'b': case 'big': case 'code': case 'em': case 'font': - case 'i': case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - // XERROR: generally speaking this needs parse error logic - /* 1. Let the formatting element be the last element in - the list of active formatting elements that: - * is between the end of the list and the last scope - marker in the list, if any, or the start of the list - otherwise, and - * has the same tag name as the token. - */ - while(true) { - for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { - if($this->a_formatting[$a] === self::MARKER) { - break; - - } elseif($this->a_formatting[$a]->tagName === $token['name']) { - $formatting_element = $this->a_formatting[$a]; - $in_stack = in_array($formatting_element, $this->stack, true); - $fe_af_pos = $a; - break; - } - } - - /* If there is no such node, or, if that node is - also in the stack of open elements but the element - is not in scope, then this is a parse error. Abort - these steps. The token is ignored. */ - if(!isset($formatting_element) || ($in_stack && - !$this->elementInScope($token['name']))) { - $this->ignored = true; - break; - - /* Otherwise, if there is such a node, but that node - is not in the stack of open elements, then this is a - parse error; remove the element from the list, and - abort these steps. */ - } elseif(isset($formatting_element) && !$in_stack) { - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* Otherwise, there is a formatting element and that - * element is in the stack and is in scope. If the - * element is not the current node, this is a parse - * error. In any case, proceed with the algorithm as - * written in the following steps. */ - // XERROR: implement me - - /* 2. Let the furthest block be the topmost node in the - stack of open elements that is lower in the stack - than the formatting element, and is not an element in - the phrasing or formatting categories. There might - not be one. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $length = count($this->stack); - - for($s = $fe_s_pos + 1; $s < $length; $s++) { - $category = $this->getElementCategory($this->stack[$s]); - - if($category !== self::PHRASING && $category !== self::FORMATTING) { - $furthest_block = $this->stack[$s]; - break; - } - } - - /* 3. If there is no furthest block, then the UA must - skip the subsequent steps and instead just pop all - the nodes from the bottom of the stack of open - elements, from the current node up to the formatting - element, and remove the formatting element from the - list of active formatting elements. */ - if(!isset($furthest_block)) { - for($n = $length - 1; $n >= $fe_s_pos; $n--) { - array_pop($this->stack); - } - - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 4. Let the common ancestor be the element - immediately above the formatting element in the stack - of open elements. */ - $common_ancestor = $this->stack[$fe_s_pos - 1]; - - /* 5. Let a bookmark note the position of the - formatting element in the list of active formatting - elements relative to the elements on either side - of it in the list. */ - $bookmark = $fe_af_pos; - - /* 6. Let node and last node be the furthest block. - Follow these steps: */ - $node = $furthest_block; - $last_node = $furthest_block; - - while(true) { - for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { - /* 6.1 Let node be the element immediately - prior to node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 6.2 If node is not in the list of active - formatting elements, then remove node from - the stack of open elements and then go back - to step 1. */ - if(!in_array($node, $this->a_formatting, true)) { - array_splice($this->stack, $n, 1); - - } else { - break; - } - } - - /* 6.3 Otherwise, if node is the formatting - element, then go to the next step in the overall - algorithm. */ - if($node === $formatting_element) { - break; - - /* 6.4 Otherwise, if last node is the furthest - block, then move the aforementioned bookmark to - be immediately after the node in the list of - active formatting elements. */ - } elseif($last_node === $furthest_block) { - $bookmark = array_search($node, $this->a_formatting, true) + 1; - } - - /* 6.5 Create an element for the token for which - * the element node was created, replace the entry - * for node in the list of active formatting - * elements with an entry for the new element, - * replace the entry for node in the stack of open - * elements with an entry for the new element, and - * let node be the new element. */ - // we don't know what the token is anymore - // XDOM - $clone = $node->cloneNode(); - $a_pos = array_search($node, $this->a_formatting, true); - $s_pos = array_search($node, $this->stack, true); - $this->a_formatting[$a_pos] = $clone; - $this->stack[$s_pos] = $clone; - $node = $clone; - - /* 6.6 Insert last node into node, first removing - it from its previous parent node if any. */ - // XDOM - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - // XDOM - $node->appendChild($last_node); - - /* 6.7 Let last node be node. */ - $last_node = $node; - - /* 6.8 Return to step 1 of this inner set of steps. */ - } - - /* 7. If the common ancestor node is a table, tbody, - * tfoot, thead, or tr element, then, foster parent - * whatever last node ended up being in the previous - * step, first removing it from its previous parent - * node if any. */ - // XDOM - if ($last_node->parentNode) { // common step - $last_node->parentNode->removeChild($last_node); - } - if (in_array($common_ancestor->tagName, array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - $this->fosterParent($last_node); - /* Otherwise, append whatever last node ended up being - * in the previous step to the common ancestor node, - * first removing it from its previous parent node if - * any. */ - } else { - // XDOM - $common_ancestor->appendChild($last_node); - } - - /* 8. Create an element for the token for which the - * formatting element was created. */ - // XDOM - $clone = $formatting_element->cloneNode(); - - /* 9. Take all of the child nodes of the furthest - block and append them to the element created in the - last step. */ - // XDOM - while($furthest_block->hasChildNodes()) { - $child = $furthest_block->firstChild; - $furthest_block->removeChild($child); - $clone->appendChild($child); - } - - /* 10. Append that clone to the furthest block. */ - // XDOM - $furthest_block->appendChild($clone); - - /* 11. Remove the formatting element from the list - of active formatting elements, and insert the new element - into the list of active formatting elements at the - position of the aforementioned bookmark. */ - $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); - array_splice($this->a_formatting, $fe_af_pos, 1); - - $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); - $af_part2 = array_slice($this->a_formatting, $bookmark); - $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); - - /* 12. Remove the formatting element from the stack - of open elements, and insert the new element into the stack - of open elements immediately below the position of the - furthest block in that stack. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - array_splice($this->stack, $fe_s_pos, 1); - - $fb_s_pos = array_search($furthest_block, $this->stack, true); - $s_part1 = array_slice($this->stack, 0, $fb_s_pos + 1); - $s_part2 = array_slice($this->stack, $fb_s_pos + 1); - $this->stack = array_merge($s_part1, array($clone), $s_part2); - - /* 13. Jump back to step 1 in this series of steps. */ - unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); - } - break; - - case 'applet': case 'button': case 'marquee': case 'object': - /* If the stack of open elements has an element in scope whose - tag name matches the tag name of the token, then generate implied - tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // XERROR: implement logic - - /* Pop elements from the stack of open elements until - * an element with the same tag name as the token has - * been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== $token['name']); - - /* Clear the list of active formatting elements up to the - * last marker. */ - $keys = array_keys($this->a_formatting, self::MARKER, true); - $marker = end($keys); - - for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { - array_pop($this->a_formatting); - } - } else { - // parse error - } - break; - - case 'br': - // Parse error - $this->emitToken(array( - 'name' => 'br', - 'type' => HTML5_Tokenizer::STARTTAG, - )); - break; - - /* An end tag token not covered by the previous entries */ - default: - for($n = count($this->stack) - 1; $n >= 0; $n--) { - /* Initialise node to be the current node (the bottommost - node of the stack). */ - $node = $this->stack[$n]; - - /* If node has the same tag name as the end tag token, - then: */ - if($token['name'] === $node->tagName) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* If the tag name of the end tag token does not - match the tag name of the current node, this is a - parse error. */ - // XERROR: implement this - - /* Pop all the nodes from the current node up to - node, including node, then stop these steps. */ - // XSKETCHY - do { - $pop = array_pop($this->stack); - } while ($pop !== $node); - break; - - } else { - $category = $this->getElementCategory($node); - - if($category !== self::FORMATTING && $category !== self::PHRASING) { - /* Otherwise, if node is in neither the formatting - category nor the phrasing category, then this is a - parse error. Stop this algorithm. The end tag token - is ignored. */ - $this->ignored = true; - break; - // parse error - } - } - /* Set node to the previous entry in the stack of open elements. Loop. */ - } - break; - } - break; - } - break; - - case self::IN_CDATA_RCDATA: - if ( - $token['type'] === HTML5_Tokenizer::CHARACTER || - $token['type'] === HTML5_Tokenizer::SPACECHARACTER - ) { - $this->insertText($token['data']); - } elseif ($token['type'] === HTML5_Tokenizer::EOF) { - // parse error - /* If the current node is a script element, mark the script - * element as "already executed". */ - // probably not necessary - array_pop($this->stack); - $this->mode = $this->original_mode; - $this->emitToken($token); - } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'script') { - array_pop($this->stack); - $this->mode = $this->original_mode; - // we're ignoring all of the execution stuff - } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) { - array_pop($this->stack); - $this->mode = $this->original_mode; - } - break; - - case self::IN_TABLE: - $clear = array('html', 'table'); - - /* A character token */ - if ($token['type'] === HTML5_Tokenizer::CHARACTER || - $token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Let the pending table character tokens - * be an empty list of tokens. */ - $this->pendingTableCharacters = ""; - $this->pendingTableCharactersDirty = false; - /* Let the original insertion mode be the current - * insertion mode. */ - $this->original_mode = $this->mode; - /* Switch the insertion mode to - * "in table text" and - * reprocess the token. */ - $this->mode = self::IN_TABLE_TEXT; - $this->emitToken($token); - - /* A comment token */ - } elseif($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - /* A start tag whose tag name is "caption" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'caption') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - /* Insert an HTML element for the token, then switch the - insertion mode to "in caption". */ - $this->insertElement($token); - $this->mode = self::IN_CAPTION; - - /* A start tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'colgroup') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the - insertion mode to "in column group". */ - $this->insertElement($token); - $this->mode = self::IN_COLUMN_GROUP; - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'col') { - $this->emitToken(array( - 'name' => 'colgroup', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => array() - )); - - $this->emitToken($token); - - /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'], - array('tbody', 'tfoot', 'thead'))) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in table body". */ - $this->insertElement($token); - $this->mode = self::IN_TABLE_BODY; - - /* A start tag whose tag name is one of: "td", "th", "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - in_array($token['name'], array('td', 'th', 'tr'))) { - /* Act as if a start tag token with the tag name "tbody" had been - seen, then reprocess the current token. */ - $this->emitToken(array( - 'name' => 'tbody', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => array() - )); - - $this->emitToken($token); - - /* A start tag whose tag name is "table" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'table') { - /* Parse error. Act as if an end tag token with the tag name "table" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->emitToken(array( - 'name' => 'table', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - if (!$this->ignored) $this->emitToken($token); - - /* An end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'table') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (fragment case) */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - $this->ignored = true; - - /* Otherwise: */ - } else { - do { - $node = array_pop($this->stack); - } while ($node->tagName !== 'table'); - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', - 'tfoot', 'th', 'thead', 'tr'))) { - // Parse error. Ignore the token. - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - ($token['name'] === 'style' || $token['name'] === 'script')) { - $this->processWithRulesFor($token, self::IN_HEAD); - - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'input' && - // assignment is intentional - /* If the token does not have an attribute with the name "type", or - * if it does, but that attribute's value is not an ASCII - * case-insensitive match for the string "hidden", then: act as - * described in the "anything else" entry below. */ - ($type = $this->getAttr($token, 'type')) && strtolower($type) === 'hidden') { - // I.e., if its an input with the type attribute == 'hidden' - /* Otherwise */ - // parse error - $this->insertElement($token); - array_pop($this->stack); - } elseif ($token['type'] === HTML5_Tokenizer::EOF) { - /* If the current node is not the root html element, then this is a parse error. */ - if (end($this->stack)->tagName !== 'html') { - // Note: It can only be the current node in the fragment case. - // parse error - } - /* Stop parsing. */ - /* Anything else */ - } else { - /* Parse error. Process the token as if the insertion mode was "in - body", with the following exception: */ - - $old = $this->foster_parent; - $this->foster_parent = true; - $this->processWithRulesFor($token, self::IN_BODY); - $this->foster_parent = $old; - } - break; - - case self::IN_TABLE_TEXT: - /* A character token */ - if($token['type'] === HTML5_Tokenizer::CHARACTER) { - /* Append the character token to the pending table - * character tokens list. */ - $this->pendingTableCharacters .= $token['data']; - $this->pendingTableCharactersDirty = true; - } elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - $this->pendingTableCharacters .= $token['data']; - /* Anything else */ - } else { - if ($this->pendingTableCharacters !== '' && is_string($this->pendingTableCharacters)) { - /* If any of the tokens in the pending table character tokens list - * are character tokens that are not one of U+0009 CHARACTER - * TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), or - * U+0020 SPACE, then reprocess those character tokens using the - * rules given in the "anything else" entry in the in table" - * insertion mode.*/ - if ($this->pendingTableCharactersDirty) { - /* Parse error. Process the token using the rules for the - * "in body" insertion mode, except that if the current - * node is a table, tbody, tfoot, thead, or tr element, - * then, whenever a node would be inserted into the current - * node, it must instead be foster parented. */ - // XERROR - $old = $this->foster_parent; - $this->foster_parent = true; - $text_token = array( - 'type' => HTML5_Tokenizer::CHARACTER, - 'data' => $this->pendingTableCharacters, - ); - $this->processWithRulesFor($text_token, self::IN_BODY); - $this->foster_parent = $old; - - /* Otherwise, insert the characters given by the pending table - * character tokens list into the current node. */ - } else { - $this->insertText($this->pendingTableCharacters); - } - $this->pendingTableCharacters = null; - $this->pendingTableCharactersNull = null; - } - - /* Switch the insertion mode to the original insertion mode and - * reprocess the token. - */ - $this->mode = $this->original_mode; - $this->emitToken($token); - } - break; - - case self::IN_CAPTION: - /* An end tag whose tag name is "caption" */ - if($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'caption') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (fragment case) */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - $this->ignored = true; - // Ignore - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a caption element, then this - is a parse error. */ - // XERROR: implement - - /* Pop elements from this stack until a caption element has - been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== 'caption'); - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag - name is "table" */ - } elseif(($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) || ($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'table')) { - /* Parse error. Act as if an end tag with the tag name "caption" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->emitToken(array( - 'name' => 'caption', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - if (!$this->ignored) $this->emitToken($token); - - /* An end tag whose tag name is one of: "body", "col", "colgroup", - "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'], - array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', - 'thead', 'tr'))) { - // Parse error. Ignore the token. - $this->ignored = true; - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->processWithRulesFor($token, self::IN_BODY); - } - break; - - case self::IN_COLUMN_GROUP: - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertToken($token['data']); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - $this->processWithRulesFor($token, self::IN_BODY); - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'col') { - /* Insert a col element for the token. Immediately pop the current - node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - // XERROR: Acknowledge the token's self-closing flag, if it is set. - - /* An end tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'colgroup') { - /* If the current node is the root html element, then this is a - parse error, ignore the token. (fragment case) */ - if(end($this->stack)->tagName === 'html') { - $this->ignored = true; - - /* Otherwise, pop the current node (which will be a colgroup - element) from the stack of open elements. Switch the insertion - mode to "in table". */ - } else { - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* An end tag whose tag name is "col" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'col') { - /* Parse error. Ignore the token. */ - $this->ignored = true; - - /* An end-of-file token */ - /* If the current node is the root html element */ - } elseif($token['type'] === HTML5_Tokenizer::EOF && end($this->stack)->tagName === 'html') { - /* Stop parsing */ - - /* Anything else */ - } else { - /* Act as if an end tag with the tag name "colgroup" had been seen, - and then, if that token wasn't ignored, reprocess the current token. */ - $this->emitToken(array( - 'name' => 'colgroup', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - if (!$this->ignored) $this->emitToken($token); - } - break; - - case self::IN_TABLE_BODY: - $clear = array('tbody', 'tfoot', 'thead', 'html'); - - /* A start tag whose tag name is "tr" */ - if($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'tr') { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Insert a tr element for the token, then switch the insertion - mode to "in row". */ - $this->insertElement($token); - $this->mode = self::IN_ROW; - - /* A start tag whose tag name is one of: "th", "td" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Parse error. Act as if a start tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->emitToken(array( - 'name' => 'tr', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => array() - )); - - $this->emitToken($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - // Parse error - $this->ignored = true; - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node from the stack of open elements. Switch - the insertion mode to "in table". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ - } elseif(($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead'))) || - ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) { - /* If the stack of open elements does not have a tbody, thead, or - tfoot element in table scope, this is a parse error. Ignore the - token. (fragment case) */ - if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), self::SCOPE_TABLE)) { - // parse error - $this->ignored = true; - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Act as if an end tag with the same tag name as the current - node ("tbody", "tfoot", or "thead") had been seen, then - reprocess the current token. */ - $this->emitToken(array( - 'name' => end($this->stack)->tagName, - 'type' => HTML5_Tokenizer::ENDTAG - )); - - $this->emitToken($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th", "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - $this->ignored = true; - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->processWithRulesFor($token, self::IN_TABLE); - } - break; - - case self::IN_ROW: - $clear = array('tr', 'html'); - - /* A start tag whose tag name is one of: "th", "td" */ - if($token['type'] === HTML5_Tokenizer::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in cell". */ - $this->insertElement($token); - $this->mode = self::IN_CELL; - - /* Insert a marker at the end of the list of active formatting - elements. */ - $this->a_formatting[] = self::MARKER; - - /* An end tag whose tag name is "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'tr') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (fragment case) */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - // Ignore. - $this->ignored = true; - - /* Otherwise: */ - } else { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node (which will be a tr element) from the - stack of open elements. Switch the insertion mode to "in table - body". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE_BODY; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ - } elseif(($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) || - ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) { - /* Act as if an end tag with the tag name "tr" had been seen, then, - if that token wasn't ignored, reprocess the current token. */ - $this->emitToken(array( - 'name' => 'tr', - 'type' => HTML5_Tokenizer::ENDTAG - )); - if (!$this->ignored) $this->emitToken($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - $this->ignored = true; - - /* Otherwise: */ - } else { - /* Otherwise, act as if an end tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->emitToken(array( - 'name' => 'tr', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - $this->emitToken($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th'))) { - /* Parse error. Ignore the token. */ - $this->ignored = true; - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->processWithRulesFor($token, self::IN_TABLE); - } - break; - - case self::IN_CELL: - /* An end tag whose tag name is one of: "td", "th" */ - if($token['type'] === HTML5_Tokenizer::ENDTAG && - ($token['name'] === 'td' || $token['name'] === 'th')) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token, then this is a - parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - $this->ignored = true; - - /* Otherwise: */ - } else { - /* Generate implied end tags, except for elements with the same - tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - - /* Now, if the current node is not an element with the same tag - name as the token, then this is a parse error. */ - // XERROR: Implement parse error code - - /* Pop elements from this stack until an element with the same - tag name as the token has been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== $token['name']); - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in row". (The current node - will be a tr element at this point.) */ - $this->mode = self::IN_ROW; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (fragment case) */ - if(!$this->elementInScope(array('td', 'th'), self::SCOPE_TABLE)) { - // parse error - $this->ignored = true; - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - $this->emitToken($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html'))) { - /* Parse error. Ignore the token. */ - $this->ignored = true; - - /* An end tag whose tag name is one of: "table", "tbody", "tfoot", - "thead", "tr" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'], - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), self::SCOPE_TABLE)) { - // Parse error - $this->ignored = true; - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - $this->emitToken($token); - } - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->processWithRulesFor($token, self::IN_BODY); - } - break; - - case self::IN_SELECT: - /* Handle the token as follows: */ - - /* A character token */ - if( - $token['type'] === HTML5_Tokenizer::CHARACTER || - $token['type'] === HTML5_Tokenizer::SPACECHARACTER - ) { - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - $this->processWithRulesFor($token, self::INBODY); - - /* A start tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'option') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->tagName === 'option') { - $this->emitToken(array( - 'name' => 'option', - 'type' => HTML5_Tokenizer::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* A start tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'optgroup') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->tagName === 'option') { - $this->emitToken(array( - 'name' => 'option', - 'type' => HTML5_Tokenizer::ENDTAG - )); - } - - /* If the current node is an optgroup element, act as if an end tag - with the tag name "optgroup" had been seen. */ - if(end($this->stack)->tagName === 'optgroup') { - $this->emitToken(array( - 'name' => 'optgroup', - 'type' => HTML5_Tokenizer::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* An end tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'optgroup') { - /* First, if the current node is an option element, and the node - immediately before it in the stack of open elements is an optgroup - element, then act as if an end tag with the tag name "option" had - been seen. */ - $elements_in_stack = count($this->stack); - - if($this->stack[$elements_in_stack - 1]->tagName === 'option' && - $this->stack[$elements_in_stack - 2]->tagName === 'optgroup') { - $this->emitToken(array( - 'name' => 'option', - 'type' => HTML5_Tokenizer::ENDTAG - )); - } - - /* If the current node is an optgroup element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if(end($this->stack)->tagName === 'optgroup') { - array_pop($this->stack); - } else { - // parse error - $this->ignored = true; - } - - /* An end tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'option') { - /* If the current node is an option element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if(end($this->stack)->tagName === 'option') { - array_pop($this->stack); - } else { - // parse error - $this->ignored = true; - } - - /* An end tag whose tag name is "select" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'select') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (fragment case) */ - if(!$this->elementInScope($token['name'], self::SCOPE_TABLE)) { - $this->ignored = true; - // parse error - - /* Otherwise: */ - } else { - /* Pop elements from the stack of open elements until a select - element has been popped from the stack. */ - do { - $node = array_pop($this->stack); - } while ($node->tagName !== 'select'); - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* A start tag whose tag name is "select" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'select') { - /* Parse error. Act as if the token had been an end tag with the - tag name "select" instead. */ - $this->emitToken(array( - 'name' => 'select', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - ($token['name'] === 'input' || $token['name'] === 'keygen' || $token['name'] === 'textarea')) { - // parse error - $this->emitToken(array( - 'name' => 'select', - 'type' => HTML5_Tokenizer::ENDTAG - )); - $this->emitToken($token); - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') { - $this->processWithRulesFor($token, self::IN_HEAD); - - } elseif($token['type'] === HTML5_Tokenizer::EOF) { - // XERROR: If the current node is not the root html element, then this is a parse error. - /* Stop parsing */ - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - $this->ignored = true; - } - break; - - case self::IN_SELECT_IN_TABLE: - - if($token['type'] === HTML5_Tokenizer::STARTTAG && - in_array($token['name'], array('caption', 'table', 'tbody', - 'tfoot', 'thead', 'tr', 'td', 'th'))) { - // parse error - $this->emitToken(array( - 'name' => 'select', - 'type' => HTML5_Tokenizer::ENDTAG, - )); - $this->emitToken($token); - - /* An end tag whose tag name is one of: "caption", "table", "tbody", - "tfoot", "thead", "tr", "td", "th" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - in_array($token['name'], array('caption', 'table', 'tbody', 'tfoot', 'thead', 'tr', 'td', 'th'))) { - /* Parse error. */ - // parse error - - /* If the stack of open elements has an element in table scope with - the same tag name as that of the token, then act as if an end tag - with the tag name "select" had been seen, and reprocess the token. - Otherwise, ignore the token. */ - if($this->elementInScope($token['name'], self::SCOPE_TABLE)) { - $this->emitToken(array( - 'name' => 'select', - 'type' => HTML5_Tokenizer::ENDTAG - )); - - $this->emitToken($token); - } else { - $this->ignored = true; - } - } else { - $this->processWithRulesFor($token, self::IN_SELECT); - } - break; - - case self::IN_FOREIGN_CONTENT: - if ($token['type'] === HTML5_Tokenizer::CHARACTER || - $token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - $this->insertText($token['data']); - } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) { - $this->insertComment($token['data']); - } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // XERROR: parse error - } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'script' && end($this->stack)->tagName === 'script' && - // XDOM - end($this->stack)->namespaceURI === self::NS_SVG) { - array_pop($this->stack); - // a bunch of script running mumbo jumbo - } elseif ( - ($token['type'] === HTML5_Tokenizer::STARTTAG && - (( - $token['name'] !== 'mglyph' && - $token['name'] !== 'malignmark' && - // XDOM - end($this->stack)->namespaceURI === self::NS_MATHML && - in_array(end($this->stack)->tagName, array('mi', 'mo', 'mn', 'ms', 'mtext')) - ) || - ( - $token['name'] === 'svg' && - // XDOM - end($this->stack)->namespaceURI === self::NS_MATHML && - end($this->stack)->tagName === 'annotation-xml' - ) || - ( - // XDOM - end($this->stack)->namespaceURI === self::NS_SVG && - in_array(end($this->stack)->tagName, array('foreignObject', 'desc', 'title')) - ) || - ( - // XSKETCHY && XDOM - end($this->stack)->namespaceURI === self::NS_HTML - )) - ) || $token['type'] === HTML5_Tokenizer::ENDTAG - ) { - $this->processWithRulesFor($token, $this->secondary_mode); - /* If, after doing so, the insertion mode is still "in foreign - * content", but there is no element in scope that has a namespace - * other than the HTML namespace, switch the insertion mode to the - * secondary insertion mode. */ - if ($this->mode === self::IN_FOREIGN_CONTENT) { - $found = false; - // this basically duplicates elementInScope() - for ($i = count($this->stack) - 1; $i >= 0; $i--) { - // XDOM - $node = $this->stack[$i]; - if ($node->namespaceURI !== self::NS_HTML) { - $found = true; - break; - } elseif (in_array($node->tagName, array('table', 'html', - 'applet', 'caption', 'td', 'th', 'button', 'marquee', - 'object')) || ($node->tagName === 'foreignObject' && - $node->namespaceURI === self::NS_SVG)) { - break; - } - } - if (!$found) { - $this->mode = $this->secondary_mode; - } - } - } elseif ($token['type'] === HTML5_Tokenizer::EOF || ( - $token['type'] === HTML5_Tokenizer::STARTTAG && - (in_array($token['name'], array('b', "big", "blockquote", "body", "br", - "center", "code", "dc", "dd", "div", "dl", "ds", "dt", "em", "embed", "h1", "h2", - "h3", "h4", "h5", "h6", "head", "hr", "i", "img", "li", "listing", - "menu", "meta", "nobr", "ol", "p", "pre", "ruby", "s", "small", - "span", "strong", "strike", "sub", "sup", "table", "tt", "u", "ul", - "var")) || ($token['name'] === 'font' && ($this->getAttr($token, 'color') || - $this->getAttr($token, 'face') || $this->getAttr($token, 'size')))))) { - // XERROR: parse error - do { - $node = array_pop($this->stack); - // XDOM - } while ($node->namespaceURI !== self::NS_HTML); - $this->stack[] = $node; - $this->mode = $this->secondary_mode; - $this->emitToken($token); - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG) { - static $svg_lookup = array( - 'altglyph' => 'altGlyph', - 'altglyphdef' => 'altGlyphDef', - 'altglyphitem' => 'altGlyphItem', - 'animatecolor' => 'animateColor', - 'animatemotion' => 'animateMotion', - 'animatetransform' => 'animateTransform', - 'clippath' => 'clipPath', - 'feblend' => 'feBlend', - 'fecolormatrix' => 'feColorMatrix', - 'fecomponenttransfer' => 'feComponentTransfer', - 'fecomposite' => 'feComposite', - 'feconvolvematrix' => 'feConvolveMatrix', - 'fediffuselighting' => 'feDiffuseLighting', - 'fedisplacementmap' => 'feDisplacementMap', - 'fedistantlight' => 'feDistantLight', - 'feflood' => 'feFlood', - 'fefunca' => 'feFuncA', - 'fefuncb' => 'feFuncB', - 'fefuncg' => 'feFuncG', - 'fefuncr' => 'feFuncR', - 'fegaussianblur' => 'feGaussianBlur', - 'feimage' => 'feImage', - 'femerge' => 'feMerge', - 'femergenode' => 'feMergeNode', - 'femorphology' => 'feMorphology', - 'feoffset' => 'feOffset', - 'fepointlight' => 'fePointLight', - 'fespecularlighting' => 'feSpecularLighting', - 'fespotlight' => 'feSpotLight', - 'fetile' => 'feTile', - 'feturbulence' => 'feTurbulence', - 'foreignobject' => 'foreignObject', - 'glyphref' => 'glyphRef', - 'lineargradient' => 'linearGradient', - 'radialgradient' => 'radialGradient', - 'textpath' => 'textPath', - ); - // XDOM - $current = end($this->stack); - if ($current->namespaceURI === self::NS_MATHML) { - $token = $this->adjustMathMLAttributes($token); - } - if ($current->namespaceURI === self::NS_SVG && - isset($svg_lookup[$token['name']])) { - $token['name'] = $svg_lookup[$token['name']]; - } - if ($current->namespaceURI === self::NS_SVG) { - $token = $this->adjustSVGAttributes($token); - } - $token = $this->adjustForeignAttributes($token); - $this->insertForeignElement($token, $current->namespaceURI); - if (isset($token['self-closing'])) { - array_pop($this->stack); - // XERROR: acknowledge self-closing flag - } - } - break; - - case self::AFTER_BODY: - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Process the token as it would be processed if the insertion mode - was "in body". */ - $this->processWithRulesFor($token, self::IN_BODY); - - /* A comment token */ - } elseif($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the first element in the stack of open - elements (the html element), with the data attribute set to the - data given in the comment token. */ - // XDOM - $comment = $this->dom->createComment($token['data']); - $this->stack[0]->appendChild($comment); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - $this->processWithRulesFor($token, self::IN_BODY); - - /* An end tag with the tag name "html" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'html') { - /* If the parser was originally created as part of the HTML - * fragment parsing algorithm, this is a parse error; ignore - * the token. (fragment case) */ - $this->ignored = true; - // XERROR: implement this - - $this->mode = self::AFTER_AFTER_BODY; - - } elseif($token['type'] === HTML5_Tokenizer::EOF) { - /* Stop parsing */ - - /* Anything else */ - } else { - /* Parse error. Set the insertion mode to "in body" and reprocess - the token. */ - $this->mode = self::IN_BODY; - $this->emitToken($token); - } - break; - - case self::IN_FRAMESET: - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - /* A start tag with the tag name "frameset" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'frameset') { - $this->insertElement($token); - - /* An end tag with the tag name "frameset" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'frameset') { - /* If the current node is the root html element, then this is a - parse error; ignore the token. (fragment case) */ - if(end($this->stack)->tagName === 'html') { - $this->ignored = true; - // Parse error - - } else { - /* Otherwise, pop the current node from the stack of open - elements. */ - array_pop($this->stack); - - /* If the parser was not originally created as part of the HTML - * fragment parsing algorithm (fragment case), and the current - * node is no longer a frameset element, then switch the - * insertion mode to "after frameset". */ - $this->mode = self::AFTER_FRAMESET; - } - - /* A start tag with the tag name "frame" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'frame') { - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - // XERROR: Acknowledge the token's self-closing flag, if it is set. - - /* A start tag with the tag name "noframes" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'noframes') { - /* Process the token using the rules for the "in head" insertion mode. */ - $this->processwithRulesFor($token, self::IN_HEAD); - - } elseif($token['type'] === HTML5_Tokenizer::EOF) { - // XERROR: If the current node is not the root html element, then this is a parse error. - /* Stop parsing */ - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - $this->ignored = true; - } - break; - - case self::AFTER_FRAMESET: - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - $this->processWithRulesFor($token, self::IN_BODY); - - /* An end tag with the tag name "html" */ - } elseif($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] === 'html') { - $this->mode = self::AFTER_AFTER_FRAMESET; - - /* A start tag with the tag name "noframes" */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'noframes') { - $this->processWithRulesFor($token, self::IN_HEAD); - - } elseif($token['type'] === HTML5_Tokenizer::EOF) { - /* Stop parsing */ - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - $this->ignored = true; - } - break; - - case self::AFTER_AFTER_BODY: - /* A comment token */ - if($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - // XDOM - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE || - $token['type'] === HTML5_Tokenizer::SPACECHARACTER || - ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) { - $this->processWithRulesFor($token, self::IN_BODY); - - /* An end-of-file token */ - } elseif($token['type'] === HTML5_Tokenizer::EOF) { - /* OMG DONE!! */ - } else { - // parse error - $this->mode = self::IN_BODY; - $this->emitToken($token); - } - break; - - case self::AFTER_AFTER_FRAMESET: - /* A comment token */ - if($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - // XDOM - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - } elseif($token['type'] === HTML5_Tokenizer::DOCTYPE || - $token['type'] === HTML5_Tokenizer::SPACECHARACTER || - ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) { - $this->processWithRulesFor($token, self::IN_BODY); - - /* An end-of-file token */ - } elseif($token['type'] === HTML5_Tokenizer::EOF) { - /* OMG DONE!! */ - } elseif($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'nofrmaes') { - $this->processWithRulesFor($token, self::IN_HEAD); - } else { - // parse error - } - break; - } - // end funky indenting - } - - private function insertElement($token, $append = true) { - $el = $this->dom->createElementNS(self::NS_HTML, $token['name']); - - if (!empty($token['attr'])) { - foreach($token['attr'] as $attr) { - if(!$el->hasAttribute($attr['name'])) { - $el->setAttribute($attr['name'], $attr['value']); - } - } - } - if ($append) { - $this->appendToRealParent($el); - $this->stack[] = $el; - } - - return $el; - } - - private function insertText($data) { - if ($data === '') return; - if ($this->ignore_lf_token) { - if ($data[0] === "\n") { - $data = substr($data, 1); - if ($data === false) return; - } - } - $text = $this->dom->createTextNode($data); - $this->appendToRealParent($text); - } - - private function insertComment($data) { - $comment = $this->dom->createComment($data); - $this->appendToRealParent($comment); - } - - private function appendToRealParent($node) { - // this is only for the foster_parent case - /* If the current node is a table, tbody, tfoot, thead, or tr - element, then, whenever a node would be inserted into the current - node, it must instead be inserted into the foster parent element. */ - if(!$this->foster_parent || !in_array(end($this->stack)->tagName, - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - end($this->stack)->appendChild($node); - } else { - $this->fosterParent($node); - } - } - - private function elementInScope($el, $scope = self::SCOPE) { - if(is_array($el)) { - foreach($el as $element) { - if($this->elementInScope($element, $scope)) { - return true; - } - } - - return false; - } - - $leng = count($this->stack); - - for($n = 0; $n < $leng; $n++) { - /* 1. Initialise node to be the current node (the bottommost node of - the stack). */ - $node = $this->stack[$leng - 1 - $n]; - - if($node->tagName === $el) { - /* 2. If node is the target node, terminate in a match state. */ - return true; - - // We've expanded the logic for these states a little differently; - // Hixie's refactoring into "specific scope" is more general, but - // this "gets the job done" - - // these are the common states for all scopes - } elseif($node->tagName === 'table' || $node->tagName === 'html') { - return false; - - // these are valid for "in scope" and "in list item scope" - } elseif($scope !== self::SCOPE_TABLE && - (in_array($node->tagName, array('applet', 'caption', 'td', - 'th', 'button', 'marquee', 'object')) || - $node->tagName === 'foreignObject' && $node->namespaceURI === self::NS_SVG)) { - return false; - - - // these are valid for "in list item scope" - } elseif($scope === self::SCOPE_LISTITEM && in_array($node->tagName, array('ol', 'ul'))) { - return false; - } - - /* Otherwise, set node to the previous entry in the stack of open - elements and return to step 2. (This will never fail, since the loop - will always terminate in the previous step if the top of the stack - is reached.) */ - } - } - - private function reconstructActiveFormattingElements() { - /* 1. If there are no entries in the list of active formatting elements, - then there is nothing to reconstruct; stop this algorithm. */ - $formatting_elements = count($this->a_formatting); - - if($formatting_elements === 0) { - return false; - } - - /* 3. Let entry be the last (most recently added) element in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. If the last (most recently added) entry in the list of active - formatting elements is a marker, or if it is an element that is in the - stack of open elements, then there is nothing to reconstruct; stop this - algorithm. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - return false; - } - - for($a = $formatting_elements - 1; $a >= 0; true) { - /* 4. If there are no entries before entry in the list of active - formatting elements, then jump to step 8. */ - if($a === 0) { - $step_seven = false; - break; - } - - /* 5. Let entry be the entry one earlier than entry in the list of - active formatting elements. */ - $a--; - $entry = $this->a_formatting[$a]; - - /* 6. If entry is neither a marker nor an element that is also in - thetack of open elements, go to step 4. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - break; - } - } - - while(true) { - /* 7. Let entry be the element one later than entry in the list of - active formatting elements. */ - if(isset($step_seven) && $step_seven === true) { - $a++; - $entry = $this->a_formatting[$a]; - } - - /* 8. Perform a shallow clone of the element entry to obtain clone. */ - $clone = $entry->cloneNode(); - - /* 9. Append clone to the current node and push it onto the stack - of open elements so that it is the new current node. */ - $this->appendToRealParent($clone); - $this->stack[] = $clone; - - /* 10. Replace the entry for entry in the list with an entry for - clone. */ - $this->a_formatting[$a] = $clone; - - /* 11. If the entry for clone in the list of active formatting - elements is not the last entry in the list, return to step 7. */ - if(end($this->a_formatting) !== $clone) { - $step_seven = true; - } else { - break; - } - } - } - - private function clearTheActiveFormattingElementsUpToTheLastMarker() { - /* When the steps below require the UA to clear the list of active - formatting elements up to the last marker, the UA must perform the - following steps: */ - - while(true) { - /* 1. Let entry be the last (most recently added) entry in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. Remove entry from the list of active formatting elements. */ - array_pop($this->a_formatting); - - /* 3. If entry was a marker, then stop the algorithm at this point. - The list has been cleared up to the last marker. */ - if($entry === self::MARKER) { - break; - } - } - } - - private function generateImpliedEndTags($exclude = array()) { - /* When the steps below require the UA to generate implied end tags, - * then, while the current node is a dc element, a dd element, a ds - * element, a dt element, an li element, an option element, an optgroup - * element, a p element, an rp element, or an rt element, the UA must - * pop the current node off the stack of open elements. */ - $node = end($this->stack); - $elements = array_diff(array('dc', 'dd', 'ds', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); - - while(in_array(end($this->stack)->tagName, $elements)) { - array_pop($this->stack); - } - } - - private function getElementCategory($node) { - if (!is_object($node)) debug_print_backtrace(); - $name = $node->tagName; - if(in_array($name, $this->special)) - return self::SPECIAL; - - elseif(in_array($name, $this->scoping)) - return self::SCOPING; - - elseif(in_array($name, $this->formatting)) - return self::FORMATTING; - - else - return self::PHRASING; - } - - private function clearStackToTableContext($elements) { - /* When the steps above require the UA to clear the stack back to a - table context, it means that the UA must, while the current node is not - a table element or an html element, pop elements from the stack of open - elements. */ - while(true) { - $name = end($this->stack)->tagName; - - if(in_array($name, $elements)) { - break; - } else { - array_pop($this->stack); - } - } - } - - private function resetInsertionMode($context = null) { - /* 1. Let last be false. */ - $last = false; - $leng = count($this->stack); - - for($n = $leng - 1; $n >= 0; $n--) { - /* 2. Let node be the last node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 3. If node is the first node in the stack of open elements, then - * set last to true and set node to the context element. (fragment - * case) */ - if($this->stack[0]->isSameNode($node)) { - $last = true; - $node = $context; - } - - /* 4. If node is a select element, then switch the insertion mode to - "in select" and abort these steps. (fragment case) */ - if($node->tagName === 'select') { - $this->mode = self::IN_SELECT; - break; - - /* 5. If node is a td or th element, then switch the insertion mode - to "in cell" and abort these steps. */ - } elseif($node->tagName === 'td' || $node->nodeName === 'th') { - $this->mode = self::IN_CELL; - break; - - /* 6. If node is a tr element, then switch the insertion mode to - "in row" and abort these steps. */ - } elseif($node->tagName === 'tr') { - $this->mode = self::IN_ROW; - break; - - /* 7. If node is a tbody, thead, or tfoot element, then switch the - insertion mode to "in table body" and abort these steps. */ - } elseif(in_array($node->tagName, array('tbody', 'thead', 'tfoot'))) { - $this->mode = self::IN_TABLE_BODY; - break; - - /* 8. If node is a caption element, then switch the insertion mode - to "in caption" and abort these steps. */ - } elseif($node->tagName === 'caption') { - $this->mode = self::IN_CAPTION; - break; - - /* 9. If node is a colgroup element, then switch the insertion mode - to "in column group" and abort these steps. (innerHTML case) */ - } elseif($node->tagName === 'colgroup') { - $this->mode = self::IN_COLUMN_GROUP; - break; - - /* 10. If node is a table element, then switch the insertion mode - to "in table" and abort these steps. */ - } elseif($node->tagName === 'table') { - $this->mode = self::IN_TABLE; - break; - - /* 11. If node is an element from the MathML namespace or the SVG - * namespace, then switch the insertion mode to "in foreign - * content", let the secondary insertion mode be "in body", and - * abort these steps. */ - } elseif($node->namespaceURI === self::NS_SVG || - $node->namespaceURI === self::NS_MATHML) { - $this->mode = self::IN_FOREIGN_CONTENT; - $this->secondary_mode = self::IN_BODY; - break; - - /* 12. If node is a head element, then switch the insertion mode - to "in body" ("in body"! not "in head"!) and abort these steps. - (fragment case) */ - } elseif($node->tagName === 'head') { - $this->mode = self::IN_BODY; - break; - - /* 13. If node is a body element, then switch the insertion mode to - "in body" and abort these steps. */ - } elseif($node->tagName === 'body') { - $this->mode = self::IN_BODY; - break; - - /* 14. If node is a frameset element, then switch the insertion - mode to "in frameset" and abort these steps. (fragment case) */ - } elseif($node->tagName === 'frameset') { - $this->mode = self::IN_FRAMESET; - break; - - /* 15. If node is an html element, then: if the head element - pointer is null, switch the insertion mode to "before head", - otherwise, switch the insertion mode to "after head". In either - case, abort these steps. (fragment case) */ - } elseif($node->tagName === 'html') { - $this->mode = ($this->head_pointer === null) - ? self::BEFORE_HEAD - : self::AFTER_HEAD; - - break; - - /* 16. If last is true, then set the insertion mode to "in body" - and abort these steps. (fragment case) */ - } elseif($last) { - $this->mode = self::IN_BODY; - break; - } - } - } - - private function closeCell() { - /* If the stack of open elements has a td or th element in table scope, - then act as if an end tag token with that tag name had been seen. */ - foreach(array('td', 'th') as $cell) { - if($this->elementInScope($cell, self::SCOPE_TABLE)) { - $this->emitToken(array( - 'name' => $cell, - 'type' => HTML5_Tokenizer::ENDTAG - )); - - break; - } - } - } - - private function processWithRulesFor($token, $mode) { - /* "using the rules for the m insertion mode", where m is one of these - * modes, the user agent must use the rules described under the m - * insertion mode's section, but must leave the insertion mode - * unchanged unless the rules in m themselves switch the insertion mode - * to a new value. */ - return $this->emitToken($token, $mode); - } - - private function insertCDATAElement($token) { - $this->insertElement($token); - $this->original_mode = $this->mode; - $this->mode = self::IN_CDATA_RCDATA; - $this->content_model = HTML5_Tokenizer::CDATA; - } - - private function insertRCDATAElement($token) { - $this->insertElement($token); - $this->original_mode = $this->mode; - $this->mode = self::IN_CDATA_RCDATA; - $this->content_model = HTML5_Tokenizer::RCDATA; - } - - private function getAttr($token, $key) { - if (!isset($token['attr'])) return false; - $ret = false; - foreach ($token['attr'] as $keypair) { - if ($keypair['name'] === $key) $ret = $keypair['value']; - } - return $ret; - } - - private function getCurrentTable() { - /* The current table is the last table element in the stack of open - * elements, if there is one. If there is no table element in the stack - * of open elements (fragment case), then the current table is the - * first element in the stack of open elements (the html element). */ - for ($i = count($this->stack) - 1; $i >= 0; $i--) { - if ($this->stack[$i]->tagName === 'table') { - return $this->stack[$i]; - } - } - return $this->stack[0]; - } - - private function getFosterParent() { - /* The foster parent element is the parent element of the last - table element in the stack of open elements, if there is a - table element and it has such a parent element. If there is no - table element in the stack of open elements (innerHTML case), - then the foster parent element is the first element in the - stack of open elements (the html element). Otherwise, if there - is a table element in the stack of open elements, but the last - table element in the stack of open elements has no parent, or - its parent node is not an element, then the foster parent - element is the element before the last table element in the - stack of open elements. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->tagName === 'table') { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $table->parentNode !== null) { - return $table->parentNode; - - } elseif(!isset($table)) { - return $this->stack[0]; - - } elseif(isset($table) && ($table->parentNode === null || - $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { - return $this->stack[$n - 1]; - } - } - - public function fosterParent($node) { - $foster_parent = $this->getFosterParent(); - $table = $this->getCurrentTable(); // almost equivalent to last table element, except it can be html - /* When a node node is to be foster parented, the node node must be - * be inserted into the foster parent element. */ - /* If the foster parent element is the parent element of the last table - * element in the stack of open elements, then node must be inserted - * immediately before the last table element in the stack of open - * elements in the foster parent element; otherwise, node must be - * appended to the foster parent element. */ - if ($table->tagName === 'table' && $table->parentNode->isSameNode($foster_parent)) { - $foster_parent->insertBefore($node, $table); - } else { - $foster_parent->appendChild($node); - } - } - - /** - * For debugging, prints the stack - */ - private function printStack() { - $names = array(); - foreach ($this->stack as $i => $element) { - $names[] = $element->tagName; - } - echo " -> stack [" . implode(', ', $names) . "]\n"; - } - - /** - * For debugging, prints active formatting elements - */ - private function printActiveFormattingElements() { - if (!$this->a_formatting) return; - $names = array(); - foreach ($this->a_formatting as $node) { - if ($node === self::MARKER) $names[] = 'MARKER'; - else $names[] = $node->tagName; - } - echo " -> active formatting [" . implode(', ', $names) . "]\n"; - } - - public function currentTableIsTainted() { - return !empty($this->getCurrentTable()->tainted); - } - - /** - * Sets up the tree constructor for building a fragment. - */ - public function setupContext($context = null) { - $this->fragment = true; - if ($context) { - $context = $this->dom->createElementNS(self::NS_HTML, $context); - /* 4.1. Set the HTML parser's tokenization stage's content model - * flag according to the context element, as follows: */ - switch ($context->tagName) { - case 'title': case 'textarea': - $this->content_model = HTML5_Tokenizer::RCDATA; - break; - case 'style': case 'script': case 'xmp': case 'iframe': - case 'noembed': case 'noframes': - $this->content_model = HTML5_Tokenizer::CDATA; - break; - case 'noscript': - // XSCRIPT: assuming scripting is enabled - $this->content_model = HTML5_Tokenizer::CDATA; - break; - case 'plaintext': - $this->content_model = HTML5_Tokenizer::PLAINTEXT; - break; - } - /* 4.2. Let root be a new html element with no attributes. */ - $root = $this->dom->createElementNS(self::NS_HTML, 'html'); - $this->root = $root; - /* 4.3 Append the element root to the Document node created above. */ - $this->dom->appendChild($root); - /* 4.4 Set up the parser's stack of open elements so that it - * contains just the single element root. */ - $this->stack = array($root); - /* 4.5 Reset the parser's insertion mode appropriately. */ - $this->resetInsertionMode($context); - /* 4.6 Set the parser's form element pointer to the nearest node - * to the context element that is a form element (going straight up - * the ancestor chain, and including the element itself, if it is a - * form element), or, if there is no such form element, to null. */ - $node = $context; - do { - if ($node->tagName === 'form') { - $this->form_pointer = $node; - break; - } - } while ($node = $node->parentNode); - } - } - - public function adjustMathMLAttributes($token) { - foreach ($token['attr'] as &$kp) { - if ($kp['name'] === 'definitionurl') { - $kp['name'] = 'definitionURL'; - } - } - return $token; - } - - public function adjustSVGAttributes($token) { - static $lookup = array( - 'attributename' => 'attributeName', - 'attributetype' => 'attributeType', - 'basefrequency' => 'baseFrequency', - 'baseprofile' => 'baseProfile', - 'calcmode' => 'calcMode', - 'clippathunits' => 'clipPathUnits', - 'contentscripttype' => 'contentScriptType', - 'contentstyletype' => 'contentStyleType', - 'diffuseconstant' => 'diffuseConstant', - 'edgemode' => 'edgeMode', - 'externalresourcesrequired' => 'externalResourcesRequired', - 'filterres' => 'filterRes', - 'filterunits' => 'filterUnits', - 'glyphref' => 'glyphRef', - 'gradienttransform' => 'gradientTransform', - 'gradientunits' => 'gradientUnits', - 'kernelmatrix' => 'kernelMatrix', - 'kernelunitlength' => 'kernelUnitLength', - 'keypoints' => 'keyPoints', - 'keysplines' => 'keySplines', - 'keytimes' => 'keyTimes', - 'lengthadjust' => 'lengthAdjust', - 'limitingconeangle' => 'limitingConeAngle', - 'markerheight' => 'markerHeight', - 'markerunits' => 'markerUnits', - 'markerwidth' => 'markerWidth', - 'maskcontentunits' => 'maskContentUnits', - 'maskunits' => 'maskUnits', - 'numoctaves' => 'numOctaves', - 'pathlength' => 'pathLength', - 'patterncontentunits' => 'patternContentUnits', - 'patterntransform' => 'patternTransform', - 'patternunits' => 'patternUnits', - 'pointsatx' => 'pointsAtX', - 'pointsaty' => 'pointsAtY', - 'pointsatz' => 'pointsAtZ', - 'preservealpha' => 'preserveAlpha', - 'preserveaspectratio' => 'preserveAspectRatio', - 'primitiveunits' => 'primitiveUnits', - 'refx' => 'refX', - 'refy' => 'refY', - 'repeatcount' => 'repeatCount', - 'repeatdur' => 'repeatDur', - 'requiredextensions' => 'requiredExtensions', - 'requiredfeatures' => 'requiredFeatures', - 'specularconstant' => 'specularConstant', - 'specularexponent' => 'specularExponent', - 'spreadmethod' => 'spreadMethod', - 'startoffset' => 'startOffset', - 'stddeviation' => 'stdDeviation', - 'stitchtiles' => 'stitchTiles', - 'surfacescale' => 'surfaceScale', - 'systemlanguage' => 'systemLanguage', - 'tablevalues' => 'tableValues', - 'targetx' => 'targetX', - 'targety' => 'targetY', - 'textlength' => 'textLength', - 'viewbox' => 'viewBox', - 'viewtarget' => 'viewTarget', - 'xchannelselector' => 'xChannelSelector', - 'ychannelselector' => 'yChannelSelector', - 'zoomandpan' => 'zoomAndPan', - ); - foreach ($token['attr'] as &$kp) { - if (isset($lookup[$kp['name']])) { - $kp['name'] = $lookup[$kp['name']]; - } - } - return $token; - } - - public function adjustForeignAttributes($token) { - static $lookup = array( - 'xlink:actuate' => array('xlink', 'actuate', self::NS_XLINK), - 'xlink:arcrole' => array('xlink', 'arcrole', self::NS_XLINK), - 'xlink:href' => array('xlink', 'href', self::NS_XLINK), - 'xlink:role' => array('xlink', 'role', self::NS_XLINK), - 'xlink:show' => array('xlink', 'show', self::NS_XLINK), - 'xlink:title' => array('xlink', 'title', self::NS_XLINK), - 'xlink:type' => array('xlink', 'type', self::NS_XLINK), - 'xml:base' => array('xml', 'base', self::NS_XML), - 'xml:lang' => array('xml', 'lang', self::NS_XML), - 'xml:space' => array('xml', 'space', self::NS_XML), - 'xmlns' => array(null, 'xmlns', self::NS_XMLNS), - 'xmlns:xlink' => array('xmlns', 'xlink', self::NS_XMLNS), - ); - foreach ($token['attr'] as &$kp) { - if (isset($lookup[$kp['name']])) { - $kp['name'] = $lookup[$kp['name']]; - } - } - return $token; - } - - public function insertForeignElement($token, $namespaceURI) { - $el = $this->dom->createElementNS($namespaceURI, $token['name']); - if (!empty($token['attr'])) { - foreach ($token['attr'] as $kp) { - $attr = $kp['name']; - if (is_array($attr)) { - $ns = $attr[2]; - $attr = $attr[1]; - } else { - $ns = self::NS_HTML; - } - if (!$el->hasAttributeNS($ns, $attr)) { - // XSKETCHY: work around godawful libxml bug - if ($ns === self::NS_XLINK) { - $el->setAttribute('xlink:'.$attr, $kp['value']); - } elseif ($ns === self::NS_HTML) { - // Another godawful libxml bug - $el->setAttribute($attr, $kp['value']); - } else { - $el->setAttributeNS($ns, $attr, $kp['value']); - } - } - } - } - $this->appendToRealParent($el); - $this->stack[] = $el; - // XERROR: see below - /* If the newly created element has an xmlns attribute in the XMLNS - * namespace whose value is not exactly the same as the element's - * namespace, that is a parse error. Similarly, if the newly created - * element has an xmlns:xlink attribute in the XMLNS namespace whose - * value is not the XLink Namespace, that is a parse error. */ - } - - public function save() { - $this->dom->normalize(); - if (!$this->fragment) { - return $this->dom; - } else { - if ($this->root) { - return $this->root->childNodes; - } else { - return $this->dom->childNodes; - } - } - } -} - diff --git a/php/library/HTML5/named-character-references.ser b/php/library/HTML5/named-character-references.ser deleted file mode 100644 index e3ae050..0000000 --- a/php/library/HTML5/named-character-references.ser +++ /dev/null @@ -1 +0,0 @@ -a:52:{s:1:"A";a:16:{s:1:"E";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:198;}s:9:"codepoint";i:198;}}}}s:1:"M";a:1:{s:1:"P";a:2:{s:1:";";a:1:{s:9:"codepoint";i:38;}s:9:"codepoint";i:38;}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:193;}s:9:"codepoint";i:193;}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:258;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:194;}s:9:"codepoint";i:194;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1040;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120068;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:192;}s:9:"codepoint";i:192;}}}}}s:1:"l";a:1:{s:1:"p";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:913;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:256;}}}}}s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10835;}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:260;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120120;}}}}s:1:"p";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"y";a:1:{s:1:"F";a:1:{s:1:"u";a:1:{s:1:"n";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8289;}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:197;}s:9:"codepoint";i:197;}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119964;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8788;}}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:195;}s:9:"codepoint";i:195;}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:196;}s:9:"codepoint";i:196;}}}}s:1:"B";a:8:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"s";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}}}}s:1:"r";a:2:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10983;}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8966;}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1041;}}}s:1:"e";a:3:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8757;}}}}}}s:1:"r";a:1:{s:1:"n";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8492;}}}}}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:914;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120069;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120121;}}}}s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:728;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8492;}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8782;}}}}}}}s:1:"C";a:14:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1063;}}}}s:1:"O";a:1:{s:1:"P";a:1:{s:1:"Y";a:2:{s:1:";";a:1:{s:9:"codepoint";i:169;}s:9:"codepoint";i:169;}}}s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:262;}}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8914;}s:1:"i";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:"i";a:1:{s:1:"f";a:1:{s:1:"f";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8517;}}}}}}}}}}}}}}}}}}}s:1:"y";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"y";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8493;}}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:268;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:199;}s:9:"codepoint";i:199;}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:264;}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8752;}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:266;}}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:184;}}}}}}s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:183;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8493;}}}s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:935;}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"l";a:1:{s:1:"e";a:4:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8857;}}}}s:1:"M";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8854;}}}}}}s:1:"P";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8853;}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8855;}}}}}}}}}}}s:1:"l";a:1:{s:1:"o";a:2:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"w";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8754;}}}}}}}}}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"C";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8221;}}}}}}}}}}}}s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8217;}}}}}}}}}}}}}}}s:1:"o";a:4:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8759;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10868;}}}}}s:1:"n";a:3:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8801;}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8751;}}}}s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8750;}}}}}}}}}}}}}}s:1:"p";a:2:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8450;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:"u";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8720;}}}}}}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"C";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"w";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8755;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10799;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119966;}}}}s:1:"u";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8915;}s:1:"C";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8781;}}}}}}}s:1:"D";a:11:{s:1:"D";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8517;}s:1:"o";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"h";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10513;}}}}}}}}s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1026;}}}}s:1:"S";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1029;}}}}s:1:"Z";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1039;}}}}s:1:"a";a:3:{s:1:"g";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8225;}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8609;}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10980;}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:270;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1044;}}}s:1:"e";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8711;}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:916;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120071;}}}s:1:"i";a:2:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:4:{s:1:"A";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:180;}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:729;}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"A";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:733;}}}}}}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:96;}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:732;}}}}}}}}}}}}}}s:1:"m";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8900;}}}}}}s:1:"f";a:1:{s:1:"f";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8518;}}}}}}}}}}}}}s:1:"o";a:4:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120123;}}}s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:168;}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8412;}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8784;}}}}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:6:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8751;}}}}}}}}}}}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:168;}}s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8659;}}}}}}}}}}s:1:"L";a:2:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8656;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10980;}}}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:2:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10232;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10234;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10233;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8872;}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8657;}}}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8661;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:6:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8595;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10515;}}}}s:1:"U";a:1:{s:1:"p";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8693;}}}}}}}}}}}}}s:1:"B";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:785;}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:3:{s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10576;}}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10590;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8637;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10582;}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10591;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8641;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10583;}}}}}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8868;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8615;}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8659;}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119967;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:272;}}}}}}}s:1:"E";a:16:{s:1:"N";a:1:{s:1:"G";a:1:{s:1:";";a:1:{s:9:"codepoint";i:330;}}}s:1:"T";a:1:{s:1:"H";a:2:{s:1:";";a:1:{s:9:"codepoint";i:208;}s:9:"codepoint";i:208;}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:201;}s:9:"codepoint";i:201;}}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:282;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:202;}s:9:"codepoint";i:202;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1069;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:278;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120072;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:200;}s:9:"codepoint";i:200;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8712;}}}}}}}s:1:"m";a:2:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:274;}}}}s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:2:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9723;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9643;}}}}}}}}}}}}}}}}}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:280;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120124;}}}}s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:917;}}}}}}}s:1:"q";a:1:{s:1:"u";a:2:{s:1:"a";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10869;}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8770;}}}}}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8652;}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8496;}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10867;}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:919;}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:203;}s:9:"codepoint";i:203;}}}s:1:"x";a:2:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8707;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8519;}}}}}}}}}}}}}s:1:"F";a:5:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1060;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120073;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"d";a:2:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9724;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}}}}}}}}}}}}}}}}}}s:1:"o";a:3:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120125;}}}s:1:"r";a:1:{s:1:"A";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8704;}}}}}s:1:"u";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8497;}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8497;}}}}}s:1:"G";a:12:{s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1027;}}}}s:1:"T";a:2:{s:1:";";a:1:{s:9:"codepoint";i:62;}s:9:"codepoint";i:62;}s:1:"a";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:915;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:988;}}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:286;}}}}}}s:1:"c";a:3:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:290;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:284;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1043;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:288;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120074;}}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8921;}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120126;}}}}s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:6:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8805;}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8923;}}}}}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8807;}}}}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10914;}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8823;}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10878;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8819;}}}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119970;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8811;}}}s:1:"H";a:8:{s:1:"A";a:1:{s:1:"R";a:1:{s:1:"D";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1066;}}}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:711;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:94;}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:292;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8460;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"b";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8459;}}}}}}}}}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8461;}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"z";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"L";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9472;}}}}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8459;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:294;}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"p";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"H";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8782;}}}}}}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8783;}}}}}}}}}}s:1:"I";a:14:{s:1:"E";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1045;}}}}s:1:"J";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:306;}}}}}s:1:"O";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1025;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:205;}s:9:"codepoint";i:205;}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:206;}s:9:"codepoint";i:206;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1048;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:304;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8465;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:204;}s:9:"codepoint";i:204;}}}}}s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8465;}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:298;}}}s:1:"g";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"I";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8520;}}}}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}}}}}s:1:"n";a:2:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8748;}s:1:"e";a:2:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8747;}}}}}s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8898;}}}}}}}}}}}s:1:"v";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8291;}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8290;}}}}}}}}}}}}}}s:1:"o";a:3:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:302;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120128;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:921;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8464;}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:296;}}}}}}s:1:"u";a:2:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1030;}}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:207;}s:9:"codepoint";i:207;}}}}s:1:"J";a:5:{s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:308;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1049;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120077;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120129;}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119973;}}}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1032;}}}}}}s:1:"u";a:1:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1028;}}}}}}s:1:"K";a:7:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1061;}}}}s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1036;}}}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:922;}}}}}s:1:"c";a:2:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:310;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1050;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120078;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120130;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119974;}}}}}s:1:"L";a:11:{s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1033;}}}}s:1:"T";a:2:{s:1:";";a:1:{s:9:"codepoint";i:60;}s:9:"codepoint";i:60;}s:1:"a";a:5:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:313;}}}}}s:1:"m";a:1:{s:1:"b";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:923;}}}}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10218;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8466;}}}}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8606;}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:317;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:315;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1051;}}}s:1:"e";a:2:{s:1:"f";a:1:{s:1:"t";a:10:{s:1:"A";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10216;}}}}}}}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8592;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8676;}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8646;}}}}}}}}}}}}}}}}s:1:"C";a:1:{s:1:"e";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8968;}}}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10214;}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:2:{s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10593;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8643;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10585;}}}}}}}}}}}}}}s:1:"F";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8970;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8596;}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10574;}}}}}}}}}}}}s:1:"T";a:2:{s:1:"e";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8867;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8612;}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10586;}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8882;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10703;}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8884;}}}}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:3:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10577;}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10592;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8639;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10584;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8636;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10578;}}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8656;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"s";a:6:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8922;}}}}}}}}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8806;}}}}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8822;}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10913;}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10877;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8818;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120079;}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8920;}s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8666;}}}}}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:319;}}}}}}s:1:"o";a:3:{s:1:"n";a:1:{s:1:"g";a:4:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10229;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10231;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10230;}}}}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10232;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10234;}}}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10233;}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120131;}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8601;}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8600;}}}}}}}}}}}}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8466;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8624;}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:321;}}}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8810;}}}s:1:"M";a:8:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10501;}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1052;}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8287;}}}}}}}}}}s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8499;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120080;}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"P";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8723;}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120132;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8499;}}}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:924;}}}s:1:"N";a:9:{s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1034;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:323;}}}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:327;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:325;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1053;}}}s:1:"e";a:3:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"v";a:1:{s:1:"e";a:3:{s:1:"M";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}}}s:1:"T";a:1:{s:1:"h";a:1:{s:1:"i";a:2:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"T";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"d";a:2:{s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8811;}}}}}}}}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8810;}}}}}}}}}}}}}s:1:"w";a:1:{s:1:"L";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120081;}}}s:1:"o";a:4:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8288;}}}}}}s:1:"n";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"k";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:160;}}}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8469;}}}s:1:"t";a:11:{s:1:";";a:1:{s:9:"codepoint";i:10988;}s:1:"C";a:2:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8802;}}}}}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"C";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8813;}}}}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}}}}}}}}}}}}}}}s:1:"E";a:3:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8713;}}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8800;}}}}}s:1:"x";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8708;}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8815;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8817;}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8825;}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8821;}}}}}}}}}}}}}s:1:"L";a:1:{s:1:"e";a:2:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"T";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8938;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8940;}}}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8814;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8816;}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8824;}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8820;}}}}}}}}}}s:1:"P";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8832;}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8928;}}}}}}}}}}}}}}}}}}}s:1:"R";a:2:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"E";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8716;}}}}}}}}}}}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"T";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8939;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8941;}}}}}}}}}}}}}}}}}}}s:1:"S";a:2:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"S";a:1:{s:1:"u";a:2:{s:1:"b";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8930;}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8931;}}}}}}}}}}}}}}}}}}}s:1:"u";a:3:{s:1:"b";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8840;}}}}}}}}}}s:1:"c";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8833;}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8929;}}}}}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8841;}}}}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8769;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8772;}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8775;}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8777;}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119977;}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:209;}s:9:"codepoint";i:209;}}}}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:925;}}}s:1:"O";a:14:{s:1:"E";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:338;}}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:211;}s:9:"codepoint";i:211;}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:212;}s:9:"codepoint";i:212;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1054;}}}s:1:"d";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:336;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120082;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:210;}s:9:"codepoint";i:210;}}}}}s:1:"m";a:3:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:332;}}}}s:1:"e";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:937;}}}}s:1:"i";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:927;}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120134;}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"C";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8220;}}}}}}}}}}}}s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8216;}}}}}}}}}}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10836;}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119978;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:216;}s:9:"codepoint";i:216;}}}}}s:1:"t";a:1:{s:1:"i";a:2:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:213;}s:9:"codepoint";i:213;}}}s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10807;}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:214;}s:9:"codepoint";i:214;}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"B";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:175;}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9182;}}s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9140;}}}}}}}}s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9180;}}}}}}}}}}}}}}}}s:1:"P";a:9:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8706;}}}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1055;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120083;}}}s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:934;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:928;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"M";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:177;}}}}}}}}}s:1:"o";a:2:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8460;}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8473;}}}}s:1:"r";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10939;}s:1:"e";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8826;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10927;}}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8828;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8830;}}}}}}}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8243;}}}}s:1:"o";a:2:{s:1:"d";a:1:{s:1:"u";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8719;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8759;}s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119979;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:936;}}}}s:1:"Q";a:4:{s:1:"U";a:1:{s:1:"O";a:1:{s:1:"T";a:2:{s:1:";";a:1:{s:9:"codepoint";i:34;}s:9:"codepoint";i:34;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120084;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8474;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119980;}}}}}s:1:"R";a:12:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10512;}}}}}s:1:"E";a:1:{s:1:"G";a:2:{s:1:";";a:1:{s:9:"codepoint";i:174;}s:9:"codepoint";i:174;}}s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:340;}}}}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10219;}}}s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8608;}s:1:"t";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10518;}}}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:344;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:342;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1056;}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8476;}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:2:{s:1:"E";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8715;}}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8651;}}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10607;}}}}}}}}}}}}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8476;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:929;}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:8:{s:1:"A";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10217;}}}}}}}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8594;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8677;}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8644;}}}}}}}}}}}}}}}s:1:"C";a:1:{s:1:"e";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8969;}}}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10215;}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:2:{s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10589;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8642;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10581;}}}}}}}}}}}}}}s:1:"F";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8971;}}}}}}s:1:"T";a:2:{s:1:"e";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8866;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8614;}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10587;}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8883;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10704;}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8885;}}}}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:3:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10575;}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10588;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8638;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10580;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8640;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10579;}}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}}}}}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8477;}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:"I";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10608;}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8667;}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8475;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8625;}}}s:1:"u";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"D";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"y";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10740;}}}}}}}}}}}}s:1:"S";a:13:{s:1:"H";a:2:{s:1:"C";a:1:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1065;}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1064;}}}}s:1:"O";a:1:{s:1:"F";a:1:{s:1:"T";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1068;}}}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:346;}}}}}}s:1:"c";a:5:{s:1:";";a:1:{s:9:"codepoint";i:10940;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:352;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:350;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:348;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1057;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120086;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:4:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8595;}}}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8592;}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8594;}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8593;}}}}}}}}}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:931;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"C";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8728;}}}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120138;}}}}s:1:"q";a:2:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8730;}}}s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:9633;}s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8851;}}}}}}}}}}}}}s:1:"S";a:1:{s:1:"u";a:2:{s:1:"b";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8847;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8849;}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8848;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8850;}}}}}}}}}}}}}}s:1:"U";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8852;}}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119982;}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8902;}}}}s:1:"u";a:4:{s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8912;}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8912;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8838;}}}}}}}}}}s:1:"c";a:2:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8827;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10928;}}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8829;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8831;}}}}}}}}}}}s:1:"h";a:1:{s:1:"T";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8715;}}}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8721;}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8913;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8835;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8839;}}}}}}}}}}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8913;}}}}}}}s:1:"T";a:11:{s:1:"H";a:1:{s:1:"O";a:1:{s:1:"R";a:1:{s:1:"N";a:2:{s:1:";";a:1:{s:9:"codepoint";i:222;}s:9:"codepoint";i:222;}}}}s:1:"R";a:1:{s:1:"A";a:1:{s:1:"D";a:1:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8482;}}}}}s:1:"S";a:2:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1035;}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1062;}}}}s:1:"a";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:932;}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:356;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:354;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1058;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120087;}}}s:1:"h";a:2:{s:1:"e";a:2:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8756;}}}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:920;}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8201;}}}}}}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8764;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8771;}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8773;}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8776;}}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120139;}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8411;}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119983;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:358;}}}}}}}s:1:"U";a:14:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:218;}s:9:"codepoint";i:218;}}}}s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8607;}s:1:"o";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10569;}}}}}}}}s:1:"b";a:1:{s:1:"r";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1038;}}}s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:364;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:219;}s:9:"codepoint";i:219;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1059;}}}s:1:"d";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:368;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120088;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:217;}s:9:"codepoint";i:217;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:362;}}}}}s:1:"n";a:2:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"B";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:818;}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9183;}}s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9141;}}}}}}}}s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9181;}}}}}}}}}}}}}}}s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8899;}s:1:"P";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8846;}}}}}}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:370;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120140;}}}}s:1:"p";a:8:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8593;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10514;}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8645;}}}}}}}}}}}}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8597;}}}}}}}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10606;}}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8869;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8613;}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8657;}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8661;}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8598;}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8599;}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:978;}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:933;}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:366;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119984;}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:360;}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:220;}s:9:"codepoint";i:220;}}}}s:1:"V";a:9:{s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8875;}}}}}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10987;}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1042;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8873;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10982;}}}}}}s:1:"e";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8897;}}s:1:"r";a:3:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8214;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8214;}s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:4:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8739;}}}}s:1:"L";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:124;}}}}}s:1:"S";a:1:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10072;}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8768;}}}}}}}}}}}s:1:"y";a:1:{s:1:"T";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8202;}}}}}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120089;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120141;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119985;}}}}s:1:"v";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8874;}}}}}}}s:1:"W";a:5:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:372;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8896;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120090;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120142;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119986;}}}}}s:1:"X";a:4:{s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120091;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:926;}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120143;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119987;}}}}}s:1:"Y";a:9:{s:1:"A";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1071;}}}}s:1:"I";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1031;}}}}s:1:"U";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1070;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:221;}s:9:"codepoint";i:221;}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:374;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1067;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120092;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120144;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119988;}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:376;}}}}}s:1:"Z";a:8:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1046;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:377;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:381;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1047;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:379;}}}}s:1:"e";a:2:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"W";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:918;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8488;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8484;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119989;}}}}}s:1:"a";a:16:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:225;}s:9:"codepoint";i:225;}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:259;}}}}}}s:1:"c";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8766;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8767;}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:226;}s:9:"codepoint";i:226;}}}s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:180;}s:9:"codepoint";i:180;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1072;}}}s:1:"e";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:230;}s:9:"codepoint";i:230;}}}}s:1:"f";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8289;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120094;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:224;}s:9:"codepoint";i:224;}}}}}s:1:"l";a:2:{s:1:"e";a:2:{s:1:"f";a:1:{s:1:"s";a:1:{s:1:"y";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8501;}}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8501;}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:945;}}}}}s:1:"m";a:2:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:257;}}}s:1:"l";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10815;}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:38;}s:9:"codepoint";i:38;}}s:1:"n";a:2:{s:1:"d";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8743;}s:1:"a";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10837;}}}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10844;}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10840;}}}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10842;}}}s:1:"g";a:7:{s:1:";";a:1:{s:9:"codepoint";i:8736;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10660;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8736;}}}s:1:"m";a:1:{s:1:"s";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8737;}s:1:"a";a:8:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10664;}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10665;}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10666;}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10667;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10668;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10669;}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10670;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10671;}}}}}}s:1:"r";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8735;}s:1:"v";a:1:{s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8894;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10653;}}}}}}s:1:"s";a:2:{s:1:"p";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8738;}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8491;}}}s:1:"z";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9084;}}}}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:261;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120146;}}}}s:1:"p";a:7:{s:1:";";a:1:{s:9:"codepoint";i:8776;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10864;}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10863;}}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8778;}}s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8779;}}}s:1:"o";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:39;}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8776;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8778;}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:229;}s:9:"codepoint";i:229;}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119990;}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:42;}}s:1:"y";a:1:{s:1:"m";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8776;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8781;}}}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:227;}s:9:"codepoint";i:227;}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:228;}s:9:"codepoint";i:228;}}}s:1:"w";a:2:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8755;}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10769;}}}}}}s:1:"b";a:16:{s:1:"N";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10989;}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"k";a:4:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8780;}}}}}s:1:"e";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1014;}}}}}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8245;}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8765;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8909;}}}}}}}}s:1:"r";a:2:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8893;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8965;}s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8965;}}}}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9141;}s:1:"t";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9142;}}}}}}}}s:1:"c";a:2:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8780;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1073;}}}s:1:"d";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8222;}}}}}s:1:"e";a:5:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"u";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8757;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8757;}}}}}}s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10672;}}}}}}s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1014;}}}}s:1:"r";a:1:{s:1:"n";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8492;}}}}}s:1:"t";a:3:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:946;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8502;}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8812;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120095;}}}s:1:"i";a:1:{s:1:"g";a:7:{s:1:"c";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8898;}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9711;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8899;}}}}s:1:"o";a:3:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10752;}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10753;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10754;}}}}}}}s:1:"s";a:2:{s:1:"q";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10758;}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9733;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9661;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9651;}}}}}}}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10756;}}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8897;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8896;}}}}}}}}s:1:"k";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10509;}}}}}}s:1:"l";a:3:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"k";a:3:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"z";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10731;}}}}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:9652;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9662;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9666;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9656;}}}}}}}}}}}}}}}}s:1:"n";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9251;}}}}s:1:"k";a:2:{i:1;a:2:{i:2;a:1:{s:1:";";a:1:{s:9:"codepoint";i:9618;}}i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:9617;}}}i:3;a:1:{i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:9619;}}}}s:1:"o";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9608;}}}}}s:1:"n";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8976;}}}}s:1:"o";a:4:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120147;}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8869;}s:1:"t";a:1:{s:1:"o";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8869;}}}}}s:1:"w";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8904;}}}}}s:1:"x";a:12:{s:1:"D";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9559;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9556;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9558;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9555;}}}s:1:"H";a:5:{s:1:";";a:1:{s:9:"codepoint";i:9552;}s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9574;}}s:1:"U";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9577;}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9572;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9575;}}}s:1:"U";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9565;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9562;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9564;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9561;}}}s:1:"V";a:7:{s:1:";";a:1:{s:9:"codepoint";i:9553;}s:1:"H";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9580;}}s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9571;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9568;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9579;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9570;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9567;}}}s:1:"b";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10697;}}}}s:1:"d";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9557;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9554;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9488;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9484;}}}s:1:"h";a:5:{s:1:";";a:1:{s:9:"codepoint";i:9472;}s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9573;}}s:1:"U";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9576;}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9516;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9524;}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8863;}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8862;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8864;}}}}}}s:1:"u";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9563;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9560;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9496;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9492;}}}s:1:"v";a:7:{s:1:";";a:1:{s:9:"codepoint";i:9474;}s:1:"H";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9578;}}s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9569;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9566;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9532;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9508;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9500;}}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8245;}}}}}}s:1:"r";a:2:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:728;}}}}s:1:"v";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:166;}s:9:"codepoint";i:166;}}}}}s:1:"s";a:4:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119991;}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8271;}}}}s:1:"i";a:1:{s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8765;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8909;}}}}s:1:"o";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:92;}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10693;}}}}}s:1:"u";a:2:{s:1:"l";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8226;}s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8226;}}}}}s:1:"m";a:1:{s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8782;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10926;}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8783;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8783;}}}}}}}s:1:"c";a:15:{s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:263;}}}}}s:1:"p";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8745;}s:1:"a";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10820;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10825;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10827;}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10823;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10816;}}}}}s:1:"r";a:2:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8257;}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:711;}}}}}s:1:"c";a:4:{s:1:"a";a:2:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10829;}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:269;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:231;}s:9:"codepoint";i:231;}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:265;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10828;}s:1:"s";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10832;}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:267;}}}}s:1:"e";a:3:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:184;}s:9:"codepoint";i:184;}}}s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10674;}}}}}}s:1:"n";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:162;}s:9:"codepoint";i:162;s:1:"e";a:1:{s:1:"r";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:183;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120096;}}}s:1:"h";a:3:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1095;}}}s:1:"e";a:1:{s:1:"c";a:1:{s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10003;}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10003;}}}}}}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:967;}}}s:1:"i";a:1:{s:1:"r";a:7:{s:1:";";a:1:{s:9:"codepoint";i:9675;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10691;}}s:1:"c";a:3:{s:1:";";a:1:{s:9:"codepoint";i:710;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8791;}}}s:1:"l";a:1:{s:1:"e";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8634;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8635;}}}}}}}}}}}s:1:"d";a:5:{s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:174;}}s:1:"S";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9416;}}s:1:"a";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8859;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8858;}}}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8861;}}}}}}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8791;}}s:1:"f";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10768;}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10991;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10690;}}}}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9827;}s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9827;}}}}}}}}s:1:"o";a:4:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:58;}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8788;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8788;}}}}}}s:1:"m";a:2:{s:1:"m";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:44;}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64;}}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8705;}s:1:"f";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8728;}}}s:1:"l";a:1:{s:1:"e";a:2:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8705;}}}}}s:1:"x";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8450;}}}}}}}}s:1:"n";a:2:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8773;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10861;}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8750;}}}}}s:1:"p";a:3:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120148;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8720;}}}}s:1:"y";a:3:{s:1:";";a:1:{s:9:"codepoint";i:169;}s:9:"codepoint";i:169;s:1:"s";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8471;}}}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8629;}}}}s:1:"o";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10007;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119992;}}}s:1:"u";a:2:{s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10959;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10961;}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10960;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10962;}}}}}s:1:"t";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8943;}}}}}s:1:"u";a:7:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:2:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10552;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10549;}}}}}}s:1:"e";a:2:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8926;}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8927;}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8630;}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10557;}}}}}}s:1:"p";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8746;}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10824;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10822;}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10826;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8845;}}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10821;}}}}s:1:"r";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8631;}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10556;}}}}}s:1:"l";a:1:{s:1:"y";a:3:{s:1:"e";a:1:{s:1:"q";a:2:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8926;}}}}}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8927;}}}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8910;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8911;}}}}}}}}s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:164;}s:9:"codepoint";i:164;}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8630;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8631;}}}}}}}}}}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8910;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8911;}}}}}s:1:"w";a:2:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8754;}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8753;}}}}}s:1:"y";a:1:{s:1:"l";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9005;}}}}}}}s:1:"d";a:19:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8659;}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10597;}}}}s:1:"a";a:4:{s:1:"g";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8224;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8504;}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8595;}}}s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8208;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8867;}}}}}s:1:"b";a:2:{s:1:"k";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10511;}}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:733;}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:271;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1076;}}}s:1:"d";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8518;}s:1:"a";a:2:{s:1:"g";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8225;}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8650;}}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10871;}}}}}}}s:1:"e";a:3:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:176;}s:9:"codepoint";i:176;}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:948;}}}}s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10673;}}}}}}}s:1:"f";a:2:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10623;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120097;}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8643;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8642;}}}}}s:1:"i";a:5:{s:1:"a";a:1:{s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8900;}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8900;}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9830;}}}}}}}}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9830;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:168;}}s:1:"g";a:1:{s:1:"a";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:989;}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8946;}}}}s:1:"v";a:3:{s:1:";";a:1:{s:9:"codepoint";i:247;}s:1:"i";a:1:{s:1:"d";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:247;}s:9:"codepoint";i:247;s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8903;}}}}}}}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8903;}}}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1106;}}}}s:1:"l";a:1:{s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8990;}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8973;}}}}}}s:1:"o";a:5:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:36;}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120149;}}}s:1:"t";a:5:{s:1:";";a:1:{s:9:"codepoint";i:729;}s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8784;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8785;}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8760;}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8724;}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8865;}}}}}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8966;}}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8595;}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8650;}}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8643;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8642;}}}}}}}}}}}}}}}}s:1:"r";a:2:{s:1:"b";a:1:{s:1:"k";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10512;}}}}}}}s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8991;}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8972;}}}}}}s:1:"s";a:3:{s:1:"c";a:2:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119993;}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1109;}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10742;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:273;}}}}}}s:1:"t";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8945;}}}}s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9663;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9662;}}}}}s:1:"u";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8693;}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10607;}}}}}s:1:"w";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10662;}}}}}}}s:1:"z";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1119;}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10239;}}}}}}}}}s:1:"e";a:18:{s:1:"D";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10871;}}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8785;}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:233;}s:9:"codepoint";i:233;}}}}s:1:"s";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10862;}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:283;}}}}}s:1:"i";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8790;}s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:234;}s:9:"codepoint";i:234;}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8789;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1101;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:279;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8519;}}s:1:"f";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8786;}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120098;}}}s:1:"g";a:3:{s:1:";";a:1:{s:9:"codepoint";i:10906;}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:232;}s:9:"codepoint";i:232;}}}}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10902;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10904;}}}}}}s:1:"l";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10905;}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9191;}}}}}}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8467;}}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10901;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10903;}}}}}}s:1:"m";a:3:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:275;}}}}s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8709;}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8709;}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8709;}}}}}s:1:"s";a:1:{s:1:"p";a:2:{i:1;a:2:{i:3;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8196;}}i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8197;}}}s:1:";";a:1:{s:9:"codepoint";i:8195;}}}}s:1:"n";a:2:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:331;}}s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8194;}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:281;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120150;}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8917;}s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10723;}}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10865;}}}}s:1:"s";a:1:{s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:1013;}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:949;}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:949;}}}}}s:1:"q";a:4:{s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8790;}}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8789;}}}}}}s:1:"s";a:2:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8770;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:2:{s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10902;}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10901;}}}}}}}}}}s:1:"u";a:3:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:61;}}}}s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8799;}}}}s:1:"i";a:1:{s:1:"v";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8801;}s:1:"D";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10872;}}}}}}s:1:"v";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10725;}}}}}}}}s:1:"r";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8787;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10609;}}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8495;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8784;}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8770;}}}}s:1:"t";a:2:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:951;}}s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:240;}s:9:"codepoint";i:240;}}s:1:"u";a:2:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:235;}s:9:"codepoint";i:235;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8364;}}}}s:1:"x";a:3:{s:1:"c";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:33;}}}s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8707;}}}}s:1:"p";a:2:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8496;}}}}}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8519;}}}}}}}}}}}}}s:1:"f";a:11:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8786;}}}}}}}}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1092;}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9792;}}}}}}s:1:"f";a:3:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64259;}}}}}s:1:"l";a:2:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64256;}}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64260;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120099;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64257;}}}}}s:1:"l";a:3:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9837;}}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64258;}}}}s:1:"t";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9649;}}}}}s:1:"n";a:1:{s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:402;}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120151;}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8704;}}}}s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8916;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10969;}}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10765;}}}}}}}}s:1:"r";a:2:{s:1:"a";a:2:{s:1:"c";a:6:{i:1;a:6:{i:2;a:2:{s:1:";";a:1:{s:9:"codepoint";i:189;}s:9:"codepoint";i:189;}i:3;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8531;}}i:4;a:2:{s:1:";";a:1:{s:9:"codepoint";i:188;}s:9:"codepoint";i:188;}i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8533;}}i:6;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8537;}}i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8539;}}}i:2;a:2:{i:3;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8532;}}i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8534;}}}i:3;a:3:{i:4;a:2:{s:1:";";a:1:{s:9:"codepoint";i:190;}s:9:"codepoint";i:190;}i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8535;}}i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8540;}}}i:4;a:1:{i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8536;}}}i:5;a:2:{i:6;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8538;}}i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8541;}}}i:7;a:1:{i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8542;}}}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8260;}}}}s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8994;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119995;}}}}}s:1:"g";a:16:{s:1:"E";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8807;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10892;}}}s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:501;}}}}}s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:947;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:989;}}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10886;}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:287;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:285;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1075;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:289;}}}}s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8805;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8923;}}s:1:"q";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8805;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8807;}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10878;}}}}}}}s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10878;}s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10921;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10880;}s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10882;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10884;}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10900;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120100;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8811;}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8921;}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8503;}}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1107;}}}}s:1:"l";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8823;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10898;}}s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10917;}}s:1:"j";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10916;}}}s:1:"n";a:4:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8809;}}s:1:"a";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10890;}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10890;}}}}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10888;}s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10888;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8809;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8935;}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120152;}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:96;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8458;}}}s:1:"i";a:1:{s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8819;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10894;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10896;}}}}}s:1:"t";a:7:{s:1:";";a:1:{s:9:"codepoint";i:62;}s:9:"codepoint";i:62;s:1:"c";a:2:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10919;}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10874;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8919;}}}}s:1:"l";a:1:{s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10645;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10876;}}}}}}s:1:"r";a:5:{s:1:"a";a:2:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10886;}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10616;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8919;}}}}s:1:"e";a:1:{s:1:"q";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8923;}}}}}s:1:"q";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10892;}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8823;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8819;}}}}}}}s:1:"h";a:10:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}}}s:1:"a";a:4:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8202;}}}}}s:1:"l";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:189;}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8459;}}}}}s:1:"r";a:2:{s:1:"d";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1098;}}}}s:1:"r";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8596;}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10568;}}}}s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8621;}}}}}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8463;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:293;}}}}}s:1:"e";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9829;}s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9829;}}}}}}}}s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8230;}}}}}s:1:"r";a:1:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8889;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120101;}}}s:1:"k";a:1:{s:1:"s";a:2:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10533;}}}}}}s:1:"w";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10534;}}}}}}}}s:1:"o";a:5:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8703;}}}}s:1:"m";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8763;}}}}}s:1:"o";a:1:{s:1:"k";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8617;}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8618;}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120153;}}}s:1:"r";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8213;}}}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119997;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8463;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:295;}}}}}}s:1:"y";a:2:{s:1:"b";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8259;}}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8208;}}}}}}}s:1:"i";a:15:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:237;}s:9:"codepoint";i:237;}}}}}s:1:"c";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8291;}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:238;}s:9:"codepoint";i:238;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1080;}}}s:1:"e";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1077;}}}s:1:"x";a:1:{s:1:"c";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:161;}s:9:"codepoint";i:161;}}}}s:1:"f";a:2:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120102;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:236;}s:9:"codepoint";i:236;}}}}}s:1:"i";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8520;}s:1:"i";a:2:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10764;}}}}s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8749;}}}}s:1:"n";a:1:{s:1:"f";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10716;}}}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8489;}}}}}s:1:"j";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:307;}}}}}s:1:"m";a:3:{s:1:"a";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:299;}}}s:1:"g";a:3:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8465;}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8464;}}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8465;}}}}}}s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:305;}}}}s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8887;}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:437;}}}}}s:1:"n";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8712;}s:1:"c";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8453;}}}}}s:1:"f";a:1:{s:1:"i";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8734;}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10717;}}}}}}}s:1:"o";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:305;}}}}}s:1:"t";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8747;}s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8890;}}}}s:1:"e";a:2:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8484;}}}}}s:1:"r";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8890;}}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10775;}}}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10812;}}}}}}}s:1:"o";a:4:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1105;}}}s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:303;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120154;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:953;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10812;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:191;}s:9:"codepoint";i:191;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119998;}}}s:1:"i";a:1:{s:1:"n";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8712;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8953;}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8949;}}}}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8948;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8947;}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8712;}}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8290;}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:297;}}}}}}s:1:"u";a:2:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1110;}}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:239;}s:9:"codepoint";i:239;}}}}s:1:"j";a:6:{s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:309;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1081;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120103;}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:567;}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120155;}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119999;}}}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1112;}}}}}}s:1:"u";a:1:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1108;}}}}}}s:1:"k";a:8:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:954;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1008;}}}}}}s:1:"c";a:2:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:311;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1082;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120104;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:312;}}}}}}s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1093;}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1116;}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120156;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120000;}}}}}s:1:"l";a:22:{s:1:"A";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8666;}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8656;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10523;}}}}}}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10510;}}}}}s:1:"E";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8806;}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10891;}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10594;}}}}s:1:"a";a:9:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:314;}}}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10676;}}}}}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8466;}}}}}s:1:"m";a:1:{s:1:"b";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:955;}}}}}s:1:"n";a:1:{s:1:"g";a:3:{s:1:";";a:1:{s:9:"codepoint";i:10216;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10641;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10216;}}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10885;}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:171;}s:9:"codepoint";i:171;}}}s:1:"r";a:1:{s:1:"r";a:8:{s:1:";";a:1:{s:9:"codepoint";i:8592;}s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8676;}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10527;}}}}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10525;}}}s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8617;}}}s:1:"l";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8619;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10553;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10611;}}}}s:1:"t";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8610;}}}}}s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:10923;}s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10521;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10925;}}}}s:1:"b";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10508;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10098;}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:123;}}s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:91;}}}}s:1:"k";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10635;}}s:1:"s";a:1:{s:1:"l";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10639;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10637;}}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:318;}}}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:316;}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8968;}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:123;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1083;}}}s:1:"d";a:4:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10550;}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8220;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8222;}}}}}s:1:"r";a:2:{s:1:"d";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10599;}}}}}s:1:"u";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10571;}}}}}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8626;}}}}s:1:"e";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8804;}s:1:"f";a:1:{s:1:"t";a:5:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8592;}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8610;}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8637;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8636;}}}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8647;}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8596;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8646;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8651;}}}}}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8621;}}}}}}}}}}}}}}}}s:1:"t";a:1:{s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8907;}}}}}}}}}}}}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8922;}}s:1:"q";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8804;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8806;}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10877;}}}}}}}s:1:"s";a:5:{s:1:";";a:1:{s:9:"codepoint";i:10877;}s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10920;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10879;}s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10881;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10883;}}}}}}s:1:"g";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10899;}}}}s:1:"s";a:5:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10885;}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8918;}}}}s:1:"e";a:1:{s:1:"q";a:2:{s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8922;}}}}s:1:"q";a:1:{s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10891;}}}}}}}s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8822;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8818;}}}}}}}s:1:"f";a:3:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10620;}}}}}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8970;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120105;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8822;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10897;}}}s:1:"h";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8637;}}s:1:"u";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8636;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10602;}}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9604;}}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1113;}}}}s:1:"l";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8810;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8647;}}}}s:1:"c";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8990;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10603;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9722;}}}}}s:1:"m";a:2:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:320;}}}}}s:1:"o";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9136;}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9136;}}}}}}}}}}s:1:"n";a:4:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8808;}}s:1:"a";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10889;}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10889;}}}}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10887;}s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10887;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8808;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8934;}}}}}s:1:"o";a:8:{s:1:"a";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10220;}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8701;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10214;}}}}s:1:"n";a:1:{s:1:"g";a:3:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10229;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10231;}}}}}}}}}}}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10236;}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10230;}}}}}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8619;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8620;}}}}}}}}}}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10629;}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120157;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10797;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10804;}}}}}}s:1:"w";a:2:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8727;}}}}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:95;}}}}}s:1:"z";a:3:{s:1:";";a:1:{s:9:"codepoint";i:9674;}s:1:"e";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9674;}}}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10731;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:40;}s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10643;}}}}}}s:1:"r";a:5:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8646;}}}}s:1:"c";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8991;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8651;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10605;}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8206;}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8895;}}}}}s:1:"s";a:6:{s:1:"a";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8249;}}}}}s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120001;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8624;}}s:1:"i";a:1:{s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8818;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10893;}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10895;}}}}s:1:"q";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:91;}}s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8216;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8218;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:322;}}}}}}s:1:"t";a:9:{s:1:";";a:1:{s:9:"codepoint";i:60;}s:9:"codepoint";i:60;s:1:"c";a:2:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10918;}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10873;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8918;}}}}s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8907;}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8905;}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10614;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10875;}}}}}}s:1:"r";a:2:{s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10646;}}}}s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:9667;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8884;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9666;}}}}}s:1:"u";a:1:{s:1:"r";a:2:{s:1:"d";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10570;}}}}}}s:1:"u";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10598;}}}}}}}}s:1:"m";a:14:{s:1:"D";a:1:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8762;}}}}}s:1:"a";a:4:{s:1:"c";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:175;}s:9:"codepoint";i:175;}}s:1:"l";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9794;}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10016;}s:1:"e";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10016;}}}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8614;}s:1:"s";a:1:{s:1:"t";a:1:{s:1:"o";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8614;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8615;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8612;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8613;}}}}}}}s:1:"r";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9646;}}}}}}s:1:"c";a:2:{s:1:"o";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10793;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1084;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8212;}}}}}s:1:"e";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8737;}}}}}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120106;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8487;}}}s:1:"i";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:181;}s:9:"codepoint";i:181;}}}s:1:"d";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8739;}s:1:"a";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:42;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10992;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:183;}s:9:"codepoint";i:183;}}}}s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8722;}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8863;}}s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8760;}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10794;}}}}}}}s:1:"l";a:2:{s:1:"c";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10971;}}}s:1:"d";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8230;}}}}s:1:"n";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8723;}}}}}}s:1:"o";a:2:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8871;}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120158;}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8723;}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120002;}}}s:1:"t";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8766;}}}}}}s:1:"u";a:3:{s:1:";";a:1:{s:9:"codepoint";i:956;}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8888;}}}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8888;}}}}}}s:1:"n";a:23:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8653;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8654;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8655;}}}}}}}}}}}s:1:"V";a:2:{s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8879;}}}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8878;}}}}}}s:1:"a";a:4:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8711;}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:324;}}}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8777;}s:1:"o";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:329;}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8777;}}}}}}s:1:"t";a:1:{s:1:"u";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9838;}s:1:"a";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9838;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8469;}}}}}}}}s:1:"b";a:1:{s:1:"s";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:160;}s:9:"codepoint";i:160;}}}s:1:"c";a:5:{s:1:"a";a:2:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10819;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:328;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:326;}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8775;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10818;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1085;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8211;}}}}}s:1:"e";a:6:{s:1:";";a:1:{s:9:"codepoint";i:8800;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8663;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10532;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8599;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8599;}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8802;}}}}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10536;}}}}}s:1:"x";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8708;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8708;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120107;}}}s:1:"g";a:3:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8817;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8817;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8821;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8815;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8815;}}}}s:1:"h";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8654;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8622;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10994;}}}}}s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8715;}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8956;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8954;}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8715;}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1114;}}}}s:1:"l";a:6:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8653;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8602;}}}}s:1:"d";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8229;}}}s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8816;}s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8602;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8622;}}}}}}}}}}}}}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8816;}}s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8814;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8820;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8814;}s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8938;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8940;}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120159;}}}s:1:"t";a:4:{s:1:";";a:1:{s:9:"codepoint";i:172;}s:9:"codepoint";i:172;s:1:"i";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8713;}s:1:"v";a:3:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8713;}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8951;}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8950;}}}}}s:1:"n";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8716;}s:1:"v";a:3:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8716;}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8958;}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8957;}}}}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8742;}s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}}}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10772;}}}}}}s:1:"r";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8832;}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8928;}}}}s:1:"e";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8832;}}}}}s:1:"r";a:4:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8655;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8603;}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8603;}}}}}}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8939;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8941;}}}}}}s:1:"s";a:7:{s:1:"c";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8833;}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8929;}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120003;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:2:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}}}}}}}}}}s:1:"i";a:1:{s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8769;}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8772;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8772;}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}s:1:"q";a:1:{s:1:"s";a:1:{s:1:"u";a:2:{s:1:"b";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8930;}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8931;}}}}}}s:1:"u";a:3:{s:1:"b";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8836;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8840;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8840;}}}}}}}s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8833;}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8837;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8841;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8841;}}}}}}}}}s:1:"t";a:4:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8825;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:241;}s:9:"codepoint";i:241;}}}}s:1:"l";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8824;}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8938;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8940;}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8939;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8941;}}}}}}}}}}}}}}}}s:1:"u";a:2:{s:1:";";a:1:{s:9:"codepoint";i:957;}s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:35;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8470;}}}}s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8199;}}}}}s:1:"v";a:6:{s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8877;}}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10500;}}}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8876;}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"f";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10718;}}}}}}s:1:"l";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10498;}}}}}s:1:"r";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10499;}}}}}}s:1:"w";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8662;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10531;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8598;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8598;}}}}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10535;}}}}}}}s:1:"o";a:18:{s:1:"S";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9416;}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:243;}s:9:"codepoint";i:243;}}}}s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8859;}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8858;}s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:244;}s:9:"codepoint";i:244;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1086;}}}s:1:"d";a:5:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8861;}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:337;}}}}}s:1:"i";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10808;}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8857;}}}s:1:"s";a:1:{s:1:"o";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10684;}}}}}}s:1:"e";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:339;}}}}}s:1:"f";a:2:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10687;}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120108;}}}s:1:"g";a:3:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:731;}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:242;}s:9:"codepoint";i:242;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10689;}}}s:1:"h";a:2:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10677;}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8486;}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8750;}}}}s:1:"l";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8634;}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10686;}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10683;}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8254;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10688;}}}s:1:"m";a:3:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:333;}}}}s:1:"e";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:969;}}}}s:1:"i";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:959;}}}}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10678;}}s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8854;}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120160;}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10679;}}}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10681;}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8853;}}}}}s:1:"r";a:7:{s:1:";";a:1:{s:9:"codepoint";i:8744;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8635;}}}}s:1:"d";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10845;}s:1:"e";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8500;}s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8500;}}}}}s:1:"f";a:2:{s:1:";";a:1:{s:9:"codepoint";i:170;}s:9:"codepoint";i:170;}s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:186;}s:9:"codepoint";i:186;}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8886;}}}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10838;}}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10839;}}}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10843;}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8500;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:248;}s:9:"codepoint";i:248;}}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8856;}}}}s:1:"t";a:1:{s:1:"i";a:2:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:245;}s:9:"codepoint";i:245;}}}s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8855;}s:1:"a";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10806;}}}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:246;}s:9:"codepoint";i:246;}}}s:1:"v";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9021;}}}}}}s:1:"p";a:12:{s:1:"a";a:1:{s:1:"r";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8741;}s:1:"a";a:3:{s:1:";";a:1:{s:9:"codepoint";i:182;}s:9:"codepoint";i:182;s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}}}s:1:"s";a:2:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10995;}}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:11005;}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8706;}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1087;}}}s:1:"e";a:1:{s:1:"r";a:5:{s:1:"c";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:37;}}}}s:1:"i";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:46;}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8240;}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8869;}}s:1:"t";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8241;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120109;}}}s:1:"h";a:3:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:966;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:966;}}}s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8499;}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9742;}}}}}s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:960;}s:1:"t";a:1:{s:1:"c";a:1:{s:1:"h";a:1:{s:1:"f";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8916;}}}}}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:982;}}}s:1:"l";a:2:{s:1:"a";a:1:{s:1:"n";a:2:{s:1:"c";a:1:{s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8463;}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8462;}}}}s:1:"k";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8463;}}}}}s:1:"u";a:1:{s:1:"s";a:9:{s:1:";";a:1:{s:9:"codepoint";i:43;}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10787;}}}}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8862;}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10786;}}}}s:1:"d";a:2:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8724;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10789;}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10866;}}s:1:"m";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:177;}s:9:"codepoint";i:177;}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10790;}}}}s:1:"t";a:1:{s:1:"w";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10791;}}}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:177;}}s:1:"o";a:3:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10773;}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120161;}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:163;}s:9:"codepoint";i:163;}}}}s:1:"r";a:10:{s:1:";";a:1:{s:9:"codepoint";i:8826;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10931;}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10935;}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8828;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10927;}s:1:"c";a:6:{s:1:";";a:1:{s:9:"codepoint";i:8826;}s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10935;}}}}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8828;}}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10927;}}}s:1:"n";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10937;}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10933;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8936;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8830;}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8242;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8473;}}}}}s:1:"n";a:3:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10933;}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10937;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8936;}}}}}s:1:"o";a:3:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8719;}}s:1:"f";a:3:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9006;}}}}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8978;}}}}}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8979;}}}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8733;}s:1:"t";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8830;}}}}s:1:"u";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8880;}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120005;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:968;}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"c";a:1:{s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8200;}}}}}}}s:1:"q";a:6:{s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120110;}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10764;}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120162;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8279;}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120006;}}}}s:1:"u";a:3:{s:1:"a";a:1:{s:1:"t";a:2:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8461;}}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10774;}}}}}}s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:63;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8799;}}}}}}s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:34;}s:9:"codepoint";i:34;}}}}s:1:"r";a:21:{s:1:"A";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8667;}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10524;}}}}}}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10511;}}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10596;}}}}s:1:"a";a:7:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10714;}}s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:341;}}}}}s:1:"d";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8730;}}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10675;}}}}}}}s:1:"n";a:1:{s:1:"g";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10217;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10642;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10661;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10217;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:187;}s:9:"codepoint";i:187;}}}s:1:"r";a:1:{s:1:"r";a:11:{s:1:";";a:1:{s:9:"codepoint";i:8594;}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10613;}}}s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8677;}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10528;}}}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10547;}}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10526;}}}s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8618;}}}s:1:"l";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8620;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10565;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10612;}}}}s:1:"t";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8611;}}}s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8605;}}}}s:1:"t";a:2:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10522;}}}}s:1:"i";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8758;}s:1:"n";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8474;}}}}}}}}}s:1:"b";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10509;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10099;}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:125;}}s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:93;}}}}s:1:"k";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10636;}}s:1:"s";a:1:{s:1:"l";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10638;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10640;}}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:345;}}}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:343;}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8969;}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:125;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1088;}}}s:1:"d";a:4:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10551;}}}s:1:"l";a:1:{s:1:"d";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10601;}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8221;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8221;}}}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8627;}}}}s:1:"e";a:3:{s:1:"a";a:1:{s:1:"l";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8476;}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8475;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8476;}}}}}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8477;}}}}s:1:"c";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9645;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:174;}s:9:"codepoint";i:174;}}s:1:"f";a:3:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10621;}}}}}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8971;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120111;}}}s:1:"h";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8641;}}s:1:"u";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8640;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10604;}}}}}s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:961;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1009;}}}}s:1:"i";a:3:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:6:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8594;}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8611;}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8641;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8640;}}}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8644;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8652;}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8649;}}}}}}}}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8605;}}}}}}}}}}}s:1:"t";a:1:{s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8908;}}}}}}}}}}}}}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:730;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8787;}}}}}}}}}}}}s:1:"l";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8644;}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8652;}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8207;}}}s:1:"m";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9137;}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9137;}}}}}}}}}}s:1:"n";a:1:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10990;}}}}}s:1:"o";a:4:{s:1:"a";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10221;}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8702;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10215;}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10630;}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120163;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10798;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10805;}}}}}}}s:1:"p";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:41;}s:1:"g";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10644;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10770;}}}}}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8649;}}}}}s:1:"s";a:4:{s:1:"a";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8250;}}}}}s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120007;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8625;}}s:1:"q";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:93;}}s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8217;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8217;}}}}}}s:1:"t";a:3:{s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8908;}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8906;}}}}}s:1:"r";a:1:{s:1:"i";a:4:{s:1:";";a:1:{s:9:"codepoint";i:9657;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8885;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9656;}}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10702;}}}}}}}}s:1:"u";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10600;}}}}}}}s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8478;}}}s:1:"s";a:19:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:347;}}}}}}s:1:"b";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8218;}}}}}s:1:"c";a:10:{s:1:";";a:1:{s:9:"codepoint";i:8827;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10932;}}s:1:"a";a:2:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10936;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:353;}}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8829;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10928;}s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:351;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:349;}}}}s:1:"n";a:3:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10934;}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10938;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8937;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10771;}}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8831;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1089;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8901;}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8865;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10854;}}}}}s:1:"e";a:7:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8664;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10533;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8600;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8600;}}}}}}s:1:"c";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:167;}s:9:"codepoint";i:167;}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:59;}}}s:1:"s";a:1:{s:1:"w";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10537;}}}}}s:1:"t";a:1:{s:1:"m";a:2:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}s:1:"x";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10038;}}}}s:1:"f";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:120112;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8994;}}}}}}s:1:"h";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9839;}}}}s:1:"c";a:2:{s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1097;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1096;}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:2:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8739;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}}}}}}}}}s:1:"y";a:2:{s:1:";";a:1:{s:9:"codepoint";i:173;}s:9:"codepoint";i:173;}}s:1:"i";a:2:{s:1:"g";a:1:{s:1:"m";a:1:{s:1:"a";a:3:{s:1:";";a:1:{s:9:"codepoint";i:963;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:962;}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:962;}}}}}s:1:"m";a:8:{s:1:";";a:1:{s:9:"codepoint";i:8764;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10858;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8771;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8771;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10910;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10912;}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10909;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10911;}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8774;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10788;}}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10610;}}}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8592;}}}}}s:1:"m";a:4:{s:1:"a";a:2:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}}}}}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10803;}}}}}s:1:"e";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10724;}}}}}}}s:1:"i";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8739;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8995;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10922;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10924;}}}}s:1:"o";a:3:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1100;}}}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:47;}s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10692;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9023;}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120164;}}}}s:1:"p";a:1:{s:1:"a";a:2:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9824;}s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9824;}}}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}s:1:"q";a:3:{s:1:"c";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8851;}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8852;}}}}s:1:"s";a:1:{s:1:"u";a:2:{s:1:"b";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8847;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8849;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8847;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8849;}}}}}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8848;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8850;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8848;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8850;}}}}}}}}}s:1:"u";a:3:{s:1:";";a:1:{s:9:"codepoint";i:9633;}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9633;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8594;}}}}}s:1:"s";a:4:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120008;}}}s:1:"e";a:1:{s:1:"t";a:1:{s:1:"m";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8995;}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8902;}}}}}}s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9734;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9733;}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1013;}}}}}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:981;}}}}}}}}}s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:175;}}}}}s:1:"u";a:5:{s:1:"b";a:9:{s:1:";";a:1:{s:9:"codepoint";i:8834;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10949;}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10941;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8838;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10947;}}}}}s:1:"m";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10945;}}}}}s:1:"n";a:2:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10955;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8842;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10943;}}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10617;}}}}}s:1:"s";a:3:{s:1:"e";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8834;}s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8838;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10949;}}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8842;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10955;}}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10951;}}}s:1:"u";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10965;}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10963;}}}}}s:1:"c";a:1:{s:1:"c";a:6:{s:1:";";a:1:{s:9:"codepoint";i:8827;}s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10936;}}}}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8829;}}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10928;}}}s:1:"n";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10938;}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10934;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8937;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8831;}}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8721;}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9834;}}}s:1:"p";a:13:{i:1;a:2:{s:1:";";a:1:{s:9:"codepoint";i:185;}s:9:"codepoint";i:185;}i:2;a:2:{s:1:";";a:1:{s:9:"codepoint";i:178;}s:9:"codepoint";i:178;}i:3;a:2:{s:1:";";a:1:{s:9:"codepoint";i:179;}s:9:"codepoint";i:179;}s:1:";";a:1:{s:9:"codepoint";i:8835;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10950;}}s:1:"d";a:2:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10942;}}}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10968;}}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8839;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10948;}}}}}s:1:"h";a:1:{s:1:"s";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10967;}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10619;}}}}}s:1:"m";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10946;}}}}}s:1:"n";a:2:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10956;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8843;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10944;}}}}}s:1:"s";a:3:{s:1:"e";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8835;}s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8839;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10950;}}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8843;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10956;}}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10952;}}}s:1:"u";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10964;}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10966;}}}}}}s:1:"w";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8665;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10534;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8601;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8601;}}}}}}s:1:"n";a:1:{s:1:"w";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10538;}}}}}}s:1:"z";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:223;}s:9:"codepoint";i:223;}}}}}s:1:"t";a:13:{s:1:"a";a:2:{s:1:"r";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8982;}}}}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:964;}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9140;}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:357;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:355;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1090;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8411;}}}}s:1:"e";a:1:{s:1:"l";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8981;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120113;}}}s:1:"h";a:4:{s:1:"e";a:2:{s:1:"r";a:1:{s:1:"e";a:2:{i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8756;}}s:1:"f";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8756;}}}}}}}s:1:"t";a:1:{s:1:"a";a:3:{s:1:";";a:1:{s:9:"codepoint";i:952;}s:1:"s";a:1:{s:1:"y";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:977;}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:977;}}}}}s:1:"i";a:2:{s:1:"c";a:1:{s:1:"k";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8776;}}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8764;}}}}}}s:1:"n";a:1:{s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8201;}}}}}s:1:"k";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8776;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8764;}}}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:254;}s:9:"codepoint";i:254;}}}}s:1:"i";a:3:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:732;}}}}s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:215;}s:9:"codepoint";i:215;s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8864;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10801;}}}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10800;}}}}}s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8749;}}}}s:1:"o";a:3:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10536;}}}s:1:"p";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8868;}s:1:"b";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9014;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10993;}}}}s:1:"f";a:2:{s:1:";";a:1:{s:9:"codepoint";i:120165;}s:1:"o";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10970;}}}}}}s:1:"s";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10537;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8244;}}}}}}s:1:"r";a:3:{s:1:"a";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8482;}}}}s:1:"i";a:7:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:5:{s:1:";";a:1:{s:9:"codepoint";i:9653;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9663;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9667;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8884;}}}}}}}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8796;}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9657;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8885;}}}}}}}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9708;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8796;}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10810;}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10809;}}}}}s:1:"s";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10701;}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10811;}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"z";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9186;}}}}}}}}s:1:"s";a:3:{s:1:"c";a:2:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120009;}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1094;}}}s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1115;}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:359;}}}}}}s:1:"w";a:2:{s:1:"i";a:1:{s:1:"x";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8812;}}}}s:1:"o";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"d";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8606;}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8608;}}}}}}}}}}}}}}}}}}s:1:"u";a:18:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8657;}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10595;}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:250;}s:9:"codepoint";i:250;}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8593;}}}}s:1:"b";a:1:{s:1:"r";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1118;}}}s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:365;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:251;}s:9:"codepoint";i:251;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1091;}}}s:1:"d";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8645;}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:369;}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10606;}}}}}s:1:"f";a:2:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10622;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120114;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:249;}s:9:"codepoint";i:249;}}}}}s:1:"h";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8639;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8638;}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9600;}}}}}s:1:"l";a:2:{s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8988;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8988;}}}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8975;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9720;}}}}}s:1:"m";a:2:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:363;}}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:168;}s:9:"codepoint";i:168;}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:371;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120166;}}}}s:1:"p";a:6:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8593;}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8597;}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8639;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8638;}}}}}}}}}}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8846;}}}}s:1:"s";a:1:{s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:965;}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:978;}}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:965;}}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8648;}}}}}}}}}}s:1:"r";a:3:{s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8989;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8989;}}}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8974;}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:367;}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9721;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120010;}}}}s:1:"t";a:3:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8944;}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:361;}}}}}s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9653;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9652;}}}}}s:1:"u";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8648;}}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:252;}s:9:"codepoint";i:252;}}}s:1:"w";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10663;}}}}}}}}s:1:"v";a:14:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8661;}}}}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10984;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10985;}}}}}s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8872;}}}}}s:1:"a";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10652;}}}}}s:1:"r";a:7:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:949;}}}}}}}}s:1:"k";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1008;}}}}}}s:1:"n";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8709;}}}}}}}}s:1:"p";a:3:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:966;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:982;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8597;}s:1:"h";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1009;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:962;}}}}}}s:1:"t";a:2:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:977;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8882;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8883;}}}}}}}}}}}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1074;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8866;}}}}}s:1:"e";a:3:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8744;}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8891;}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8794;}}}}s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8942;}}}}}s:1:"r";a:2:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:124;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:124;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120115;}}}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8882;}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120167;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}s:1:"r";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8883;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120011;}}}}s:1:"z";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"z";a:1:{s:1:"a";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10650;}}}}}}}}s:1:"w";a:7:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:373;}}}}}s:1:"e";a:2:{s:1:"d";a:2:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10847;}}}}s:1:"g";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8743;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8793;}}}}}s:1:"i";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8472;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120116;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120168;}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8472;}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8768;}s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8768;}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120012;}}}}}s:1:"x";a:14:{s:1:"c";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8898;}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9711;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8899;}}}}s:1:"d";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9661;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120117;}}}s:1:"h";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10234;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10231;}}}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:958;}}s:1:"l";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10232;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10229;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10236;}}}}s:1:"n";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8955;}}}}s:1:"o";a:3:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10752;}}}}s:1:"p";a:2:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120169;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10753;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10754;}}}}}}s:1:"r";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10233;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10230;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120013;}}}s:1:"q";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10758;}}}}}}s:1:"u";a:2:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10756;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9651;}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8897;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8896;}}}}}}}s:1:"y";a:8:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:253;}s:9:"codepoint";i:253;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1103;}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:375;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1099;}}}s:1:"e";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:165;}s:9:"codepoint";i:165;}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120118;}}}s:1:"i";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1111;}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120170;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120014;}}}}s:1:"u";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1102;}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:255;}s:9:"codepoint";i:255;}}}}s:1:"z";a:10:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:378;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:382;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1079;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:380;}}}}s:1:"e";a:2:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8488;}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:950;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120119;}}}s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1078;}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8669;}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120171;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120015;}}}}s:1:"w";a:2:{s:1:"j";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8205;}}s:1:"n";a:1:{s:1:"j";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8204;}}}}}} \ No newline at end of file diff --git a/php/maintenance/scrape-ncr.php b/php/maintenance/scrape-ncr.php deleted file mode 100644 index 016200b..0000000 --- a/php/maintenance/scrape-ncr.php +++ /dev/null @@ -1,47 +0,0 @@ -send(); - $html = $request->getResponseBody(); -} else { - $html = file_get_contents($url); -} - -preg_match_all( - '#\s*([^<]+?)\s*
\s*\s*\s*U\+([^<]+?)\s*<#', - $html, $matches, PREG_SET_ORDER); - -$table = array(); -foreach ($matches as $match) { - list(, $name, $codepoint) = $match; - - // Set the subtable we're working with initially to the whole table. - $subtable =& $table; - - // Loop over each character to the name creating an array key for it, if it - // doesn't already exist - for ($i = 0, $len = strlen($name); $i < $len; $i++) { - if (!isset($subtable[$name[$i]])) { - $subtable[$name[$i]] = null; - } - $subtable =& $subtable[$name[$i]]; - } - - // Set the key codepoint to the codepoint. - $subtable['codepoint'] = hexdec($codepoint); -} - -file_put_contents($output, serialize($table)); diff --git a/php/maintenance/style-check.php b/php/maintenance/style-check.php deleted file mode 100644 index 35cdbe5..0000000 --- a/php/maintenance/style-check.php +++ /dev/null @@ -1,76 +0,0 @@ - strlen($e) && substr($file, -strlen($e)) === $e) { - return; - } - } - $orig = $contents = file_get_contents($file); - - // vimline - $contents = style_add_vimline($file, $contents); - - // tab2space - $contents = str_replace("\t", ' ', $contents); - - if ($orig !== $contents) { - echo "$file\n"; - file_put_contents($file, $contents); - } -} - -function style_add_vimline($file, $contents) { - $vimline = 'et sw=4 sts=4'; - $ext = strrchr($file, '.'); - if (strpos($ext, '/') !== false) $ext = '.txt'; - $no_nl = false; - switch ($ext) { - case '.php': - $line = '// %s'; - break; - case '.txt': - $line = ' %s'; - break; - default: - throw new Exception('Unrecognized extension'); - } - $regex = '~' . str_replace('%s', 'vim: .+', preg_quote($line, '~')) . '~m'; - $contents = preg_replace($regex, '', $contents); - - $contents = rtrim($contents); - - if (strpos($contents, "\r\n") !== false) $nl = "\r\n"; - elseif (strpos($contents, "\n") !== false) $nl = "\n"; - elseif (strpos($contents, "\r") !== false) $nl = "\r"; - else $nl = PHP_EOL; - - if (!$no_nl) $contents .= $nl; - $contents .= $nl . str_replace('%s', 'vim: ' . $vimline, $line) . $nl; - return $contents; -} - -chdir(dirname(__FILE__) . '/..'); -style_check('.'); - -// vim: et sw=4 sts=4 diff --git a/php/tests/HTML5/DataHarness.php b/php/tests/HTML5/DataHarness.php deleted file mode 100644 index 844b1fc..0000000 --- a/php/tests/HTML5/DataHarness.php +++ /dev/null @@ -1,48 +0,0 @@ -tests = $this->getDataTests(); - // 1-indexed, to be consistent with Python - $ret = array(); - for ($i = 1; $i <= count($this->tests); $i++) { - $ret[] = "test_$i"; - } - return $ret; - } - /** - * Emulates our test functions - */ - public function __call($name, $args) { - list($test, $i) = explode("_", $name); - $this->invoke($this->tests[$i-1]); - } -} diff --git a/php/tests/HTML5/InputStreamTest.php b/php/tests/HTML5/InputStreamTest.php deleted file mode 100644 index b60787a..0000000 --- a/php/tests/HTML5/InputStreamTest.php +++ /dev/null @@ -1,174 +0,0 @@ -assertIdentical("\xEF\xBF\xBD", $stream->remainingChars(), $name); - } - - public function testInvalidReplace() { - // Above U+10FFFF - $this->invalidReplaceTestHandler("\xF5\x90\x80\x80", 'U+110000'); - - // Incomplete - $this->invalidReplaceTestHandler("\xDF", 'Incomplete two byte sequence (missing final byte)'); - $this->invalidReplaceTestHandler("\xEF\xBF", 'Incomplete three byte sequence (missing final byte)'); - $this->invalidReplaceTestHandler("\xF4\xBF\xBF", 'Incomplete four byte sequence (missing final byte)'); - - // Min/max continuation bytes - $this->invalidReplaceTestHandler("\x80", 'Lone 80 continuation byte'); - $this->invalidReplaceTestHandler("\xBF", 'Lone BF continuation byte'); - - // Invalid bytes (these can never occur) - $this->invalidReplaceTestHandler("\xFE", 'Invalid FE byte'); - $this->invalidReplaceTestHandler("\xFF", 'Invalid FF byte'); - - // Min/max overlong - $this->invalidReplaceTestHandler("\xC0\x80", 'Overlong representation of U+0000'); - $this->invalidReplaceTestHandler("\xE0\x80\x80", 'Overlong representation of U+0000'); - $this->invalidReplaceTestHandler("\xF0\x80\x80\x80", 'Overlong representation of U+0000'); - $this->invalidReplaceTestHandler("\xF8\x80\x80\x80\x80", 'Overlong representation of U+0000'); - $this->invalidReplaceTestHandler("\xFC\x80\x80\x80\x80\x80", 'Overlong representation of U+0000'); - $this->invalidReplaceTestHandler("\xC1\xBF", 'Overlong representation of U+007F'); - $this->invalidReplaceTestHandler("\xE0\x9F\xBF", 'Overlong representation of U+07FF'); - $this->invalidReplaceTestHandler("\xF0\x8F\xBF\xBF", 'Overlong representation of U+FFFF'); - } - - public function testStripLeadingBOM() { - $leading = new HTML5_InputStream("\xEF\xBB\xBFa"); - $this->assertIdentical('a', $leading->char(), 'BOM should be stripped'); - } - - public function testZWNBSP() { - $stream = new HTML5_InputStream("a\xEF\xBB\xBF"); - $this->assertIdentical("a\xEF\xBB\xBF", $stream->remainingChars(), 'A non-leading U+FEFF (BOM/ZWNBSP) should remain'); - } - - public function testNull() { - $stream = new HTML5_InputStream("\0\0\0"); - $this->assertIdentical("\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD", $stream->remainingChars(), 'Null character should be replaced by U+FFFD'); - $this->assertIdentical(3, count($stream->errors), 'Null character should be throw parse error'); - } - - public function testCRLF() { - $stream = new HTML5_InputStream("\r\n"); - $this->assertIdentical("\n", $stream->remainingChars(), 'CRLF should be replaced by LF'); - } - - public function testCR() { - $stream = new HTML5_InputStream("\r"); - $this->assertIdentical("\n", $stream->remainingChars(), 'CR should be replaced by LF'); - } - - public function invalidParseErrorTestHandler($input, $numErrors, $name) { - $stream = new HTML5_InputStream($input); - $this->assertIdentical($input, $stream->remainingChars(), $name . ' (stream content)'); - $this->assertIdentical($numErrors, count($stream->errors), $name . ' (number of errors)'); - } - - public function testInvalidParseError() { - // C0 controls (except U+0000 and U+000D due to different handling) - $this->invalidParseErrorTestHandler("\x01", 1, 'U+0001 (C0 control)'); - $this->invalidParseErrorTestHandler("\x02", 1, 'U+0002 (C0 control)'); - $this->invalidParseErrorTestHandler("\x03", 1, 'U+0003 (C0 control)'); - $this->invalidParseErrorTestHandler("\x04", 1, 'U+0004 (C0 control)'); - $this->invalidParseErrorTestHandler("\x05", 1, 'U+0005 (C0 control)'); - $this->invalidParseErrorTestHandler("\x06", 1, 'U+0006 (C0 control)'); - $this->invalidParseErrorTestHandler("\x07", 1, 'U+0007 (C0 control)'); - $this->invalidParseErrorTestHandler("\x08", 1, 'U+0008 (C0 control)'); - $this->invalidParseErrorTestHandler("\x09", 0, 'U+0009 (C0 control)'); - $this->invalidParseErrorTestHandler("\x0A", 0, 'U+000A (C0 control)'); - $this->invalidParseErrorTestHandler("\x0B", 1, 'U+000B (C0 control)'); - $this->invalidParseErrorTestHandler("\x0C", 0, 'U+000C (C0 control)'); - $this->invalidParseErrorTestHandler("\x0E", 1, 'U+000E (C0 control)'); - $this->invalidParseErrorTestHandler("\x0F", 1, 'U+000F (C0 control)'); - $this->invalidParseErrorTestHandler("\x10", 1, 'U+0010 (C0 control)'); - $this->invalidParseErrorTestHandler("\x11", 1, 'U+0011 (C0 control)'); - $this->invalidParseErrorTestHandler("\x12", 1, 'U+0012 (C0 control)'); - $this->invalidParseErrorTestHandler("\x13", 1, 'U+0013 (C0 control)'); - $this->invalidParseErrorTestHandler("\x14", 1, 'U+0014 (C0 control)'); - $this->invalidParseErrorTestHandler("\x15", 1, 'U+0015 (C0 control)'); - $this->invalidParseErrorTestHandler("\x16", 1, 'U+0016 (C0 control)'); - $this->invalidParseErrorTestHandler("\x17", 1, 'U+0017 (C0 control)'); - $this->invalidParseErrorTestHandler("\x18", 1, 'U+0018 (C0 control)'); - $this->invalidParseErrorTestHandler("\x19", 1, 'U+0019 (C0 control)'); - $this->invalidParseErrorTestHandler("\x1A", 1, 'U+001A (C0 control)'); - $this->invalidParseErrorTestHandler("\x1B", 1, 'U+001B (C0 control)'); - $this->invalidParseErrorTestHandler("\x1C", 1, 'U+001C (C0 control)'); - $this->invalidParseErrorTestHandler("\x1D", 1, 'U+001D (C0 control)'); - $this->invalidParseErrorTestHandler("\x1E", 1, 'U+001E (C0 control)'); - $this->invalidParseErrorTestHandler("\x1F", 1, 'U+001F (C0 control)'); - - // DEL (U+007F) - $this->invalidParseErrorTestHandler("\x7F", 1, 'U+007F'); - - // C1 Controls - $this->invalidParseErrorTestHandler("\xC2\x80", 1, 'U+0080 (C1 control)'); - $this->invalidParseErrorTestHandler("\xC2\x9F", 1, 'U+009F (C1 control)'); - $this->invalidParseErrorTestHandler("\xC2\xA0", 0, 'U+00A0 (first codepoint above highest C1 control)'); - - // Single UTF-16 surrogates - $this->invalidParseErrorTestHandler("\xED\xA0\x80", 1, 'U+D800 (UTF-16 surrogate character)'); - $this->invalidParseErrorTestHandler("\xED\xAD\xBF", 1, 'U+DB7F (UTF-16 surrogate character)'); - $this->invalidParseErrorTestHandler("\xED\xAE\x80", 1, 'U+DB80 (UTF-16 surrogate character)'); - $this->invalidParseErrorTestHandler("\xED\xAF\xBF", 1, 'U+DBFF (UTF-16 surrogate character)'); - $this->invalidParseErrorTestHandler("\xED\xB0\x80", 1, 'U+DC00 (UTF-16 surrogate character)'); - $this->invalidParseErrorTestHandler("\xED\xBE\x80", 1, 'U+DF80 (UTF-16 surrogate character)'); - $this->invalidParseErrorTestHandler("\xED\xBF\xBF", 1, 'U+DFFF (UTF-16 surrogate character)'); - - // Paired UTF-16 surrogates - $this->invalidParseErrorTestHandler("\xED\xA0\x80\xED\xB0\x80", 2, 'U+D800 U+DC00 (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xA0\x80\xED\xBF\xBF", 2, 'U+D800 U+DFFF (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xAD\xBF\xED\xB0\x80", 2, 'U+DB7F U+DC00 (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xAD\xBF\xED\xBF\xBF", 2, 'U+DB7F U+DFFF (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xAE\x80\xED\xB0\x80", 2, 'U+DB80 U+DC00 (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xAE\x80\xED\xBF\xBF", 2, 'U+DB80 U+DFFF (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xAF\xBF\xED\xB0\x80", 2, 'U+DBFF U+DC00 (paired UTF-16 surrogates)'); - $this->invalidParseErrorTestHandler("\xED\xAF\xBF\xED\xBF\xBF", 2, 'U+DBFF U+DFFF (paired UTF-16 surrogates)'); - - // Charcters surrounding surrogates - $this->invalidParseErrorTestHandler("\xED\x9F\xBF", 0, 'U+D7FF (one codepoint below lowest surrogate codepoint)'); - $this->invalidParseErrorTestHandler("\xEF\xBF\xBD", 0, 'U+DE00 (one codepoint above highest surrogate codepoint)'); - - // Permanent noncharacters - $this->invalidParseErrorTestHandler("\xEF\xB7\x90", 1, 'U+FDD0 (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xEF\xB7\xAF", 1, 'U+FDEF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xEF\xBF\xBE", 1, 'U+FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xEF\xBF\xBF", 1, 'U+FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF0\x9F\xBF\xBE", 1, 'U+1FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF0\x9F\xBF\xBF", 1, 'U+1FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF0\xAF\xBF\xBE", 1, 'U+2FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF0\xAF\xBF\xBF", 1, 'U+2FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF0\xBF\xBF\xBE", 1, 'U+3FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF0\xBF\xBF\xBF", 1, 'U+3FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\x8F\xBF\xBE", 1, 'U+4FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\x8F\xBF\xBF", 1, 'U+4FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\x9F\xBF\xBE", 1, 'U+5FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\x9F\xBF\xBF", 1, 'U+5FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\xAF\xBF\xBE", 1, 'U+6FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\xAF\xBF\xBF", 1, 'U+6FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\xBF\xBF\xBE", 1, 'U+7FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF1\xBF\xBF\xBF", 1, 'U+7FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\x8F\xBF\xBE", 1, 'U+8FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\x8F\xBF\xBF", 1, 'U+8FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\x9F\xBF\xBE", 1, 'U+9FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\x9F\xBF\xBF", 1, 'U+9FFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\xAF\xBF\xBE", 1, 'U+AFFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\xAF\xBF\xBF", 1, 'U+AFFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\xBF\xBF\xBE", 1, 'U+BFFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF2\xBF\xBF\xBF", 1, 'U+BFFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\x8F\xBF\xBE", 1, 'U+CFFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\x8F\xBF\xBF", 1, 'U+CFFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\x9F\xBF\xBE", 1, 'U+DFFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\x9F\xBF\xBF", 1, 'U+DFFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\xAF\xBF\xBE", 1, 'U+EFFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\xAF\xBF\xBF", 1, 'U+EFFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\xBF\xBF\xBE", 1, 'U+FFFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF3\xBF\xBF\xBF", 1, 'U+FFFFF (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF4\x8F\xBF\xBE", 1, 'U+10FFFE (permanent noncharacter)'); - $this->invalidParseErrorTestHandler("\xF4\x8F\xBF\xBF", 1, 'U+10FFFF (permanent noncharacter)'); - } -} diff --git a/php/tests/HTML5/JSONHarness.php b/php/tests/HTML5/JSONHarness.php deleted file mode 100644 index dd1cf66..0000000 --- a/php/tests/HTML5/JSONHarness.php +++ /dev/null @@ -1,21 +0,0 @@ -data = json_decode(file_get_contents($this->filename)); - } - public function getDescription($test) { - return $test->description; - } - public function getDataTests() { - return isset($this->data->tests) ? $this->data->tests : array(); - // could be a weird xmlViolationsTest - } -} diff --git a/php/tests/HTML5/ParserTest.php b/php/tests/HTML5/ParserTest.php deleted file mode 100644 index 43b87e9..0000000 --- a/php/tests/HTML5/ParserTest.php +++ /dev/null @@ -1,15 +0,0 @@ -'); - $this->assertIsA($result, 'DOMDocument'); - } - public function testParseFragment() { - $result = HTML5_Parser::parseFragment('asdf foo'); - $this->assertIsA($result, 'DOMNodeList'); - } -} diff --git a/php/tests/HTML5/TestData.php b/php/tests/HTML5/TestData.php deleted file mode 100644 index 39e9e44..0000000 --- a/php/tests/HTML5/TestData.php +++ /dev/null @@ -1,167 +0,0 @@ -= 9) continue; - } - $pfilename = var_export($filename, true); - $code = "class $prefix$name extends $base { public \$filename = $pfilename; }"; - eval($code); - } - } - - public $tests; - - public function __construct($filename) { - $test = array(); - $newTestHeading = null; - $heading = null; - foreach (explode("\n", file_get_contents($filename)) as $line) { - if ($line !== '' && $line[0] === '#') { - $newHeading = substr($line, 1); - if (!$newTestHeading) { - $newTestHeading = $newHeading; - } elseif ($newHeading === $newTestHeading) { - $test[$heading] = substr($test[$heading], 0, -1); - $this->tests[] = $test; - $test = array(); - } - $heading = $newHeading; - $test[$heading] = ''; - } elseif ($heading) { - $test[$heading] .= "$line\n"; - } - } - if (!empty($test)) { - $test[$heading] = substr($test[$heading], 0, -1); - $this->tests[] = $test; - } - // normalize - foreach ($this->tests as &$test) { - foreach ($test as $key => $value) { - $test[$key] = rtrim($value, "\n"); - } - } - } - - /** - * Converts a DOMDocument into string form as seen in test cases. - */ - public static function strDom($node, $prefix = '| ') { - // XXX: Doesn't handle svg and math correctly - $ret = array(); - $indent = 2; - $level = -1; // since DOMDocument doesn't get rendered - $skip = false; - $next = $node; - while ($next) { - if ($next instanceof DOMNodeList) { - if (!$next->length) break; - $next = $next->item(0); - $level = 0; - } - $text = false; - $subnodes = array(); - switch ($next->nodeType) { - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: - if ($next->doctype) { - $subnode = 'doctype->name; - if ($next->doctype->publicId || $next->doctype->systemId) { - $subnode .= ' "' . $next->doctype->publicId . '"'; - $subnode .= ' "' . $next->doctype->systemId . '"'; - } - $subnode .= '>'; - $subnodes[] = $subnode; - } elseif (!empty($next->emptyDoctype)) { - $subnodes = array(''); - } - break; - case XML_TEXT_NODE: - $text = '"' . $next->data . '"'; - break; - case XML_COMMENT_NODE: - $text = ""; - break; - case XML_ELEMENT_NODE: - $ns = ''; - switch ($next->namespaceURI) { - case HTML5_TreeBuilder::NS_MATHML: - $ns = 'math '; break; - case HTML5_TreeBuilder::NS_SVG: - $ns = 'svg '; break; - } - $text = "<{$ns}{$next->tagName}>"; - foreach ($next->attributes as $attr) { - $ans = ''; - switch ($attr->namespaceURI) { - case HTML5_TreeBuilder::NS_MATHML: - $ans = 'math '; break; - case HTML5_TreeBuilder::NS_SVG: - $ans = 'svg '; break; - case HTML5_TreeBuilder::NS_XLINK: - $ans = 'xlink '; break; - case HTML5_TreeBuilder::NS_XML: - $ans = 'xml '; break; - case HTML5_TreeBuilder::NS_XMLNS: - $ans = 'xmlns '; break; - } - // XSKETCHY: needed for our horrible xlink hack - $name = str_replace(':', ' ', $attr->localName); - $subnodes[] = "{$ans}{$name}=\"{$attr->value}\""; - } - sort($subnodes); - break; - } - if (!$skip) { - // code duplication - if ($text) { - $ret[] = $prefix . str_repeat(' ', $indent * $level) . $text; - } - foreach ($subnodes as $node) { - $ret[] = $prefix . str_repeat(' ', $indent * ($level + 1)) . $node; - } - } - if ($next->firstChild && !$skip) { - $next = $next->firstChild; - $level++; - $skip = false; - } elseif ($next->nextSibling) { - $next = $next->nextSibling; - $skip = false; - } elseif ($next->parentNode) { - $next = $next->parentNode; - $level--; - $skip = true; - if ($level < 0) break; - } else { - $next = false; - } - } - return implode("\n", $ret); - } -} diff --git a/php/tests/HTML5/TestDataHarness.php b/php/tests/HTML5/TestDataHarness.php deleted file mode 100644 index 0b90321..0000000 --- a/php/tests/HTML5/TestDataHarness.php +++ /dev/null @@ -1,18 +0,0 @@ -data = new HTML5_TestData($this->filename); - } - public function getDescription($test) { - return $test['data']; - } - public function getDataTests() { - return $this->data->tests; - } -} - diff --git a/php/tests/HTML5/TestDataTest.php b/php/tests/HTML5/TestDataTest.php deleted file mode 100644 index de97040..0000000 --- a/php/tests/HTML5/TestDataTest.php +++ /dev/null @@ -1,31 +0,0 @@ -assertIdentical($data->tests, array( - array('data' => "Foo", 'des' => "Bar"), - array('data' => "Foo") - )); - } - function testStrDom() { - $dom = new DOMDocument(); - $dom->loadHTML('foobarasdf'); - $this->assertIdentical(HTML5_TestData::strDom($dom), << -#errors -Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element. -Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element. -Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element. -Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element. -Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element. -Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element. -Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element. -Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element. -Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element. -Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element. -Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element. -Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element. -Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element. -Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element. -Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element. -Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element. -Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element. -Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element. -Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element. -Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element. -Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element. -Line: 1 Col: 130 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 140 This element (img) has no end tag. -Line: 1 Col: 148 Unexpected end tag (title). Ignored. -Line: 1 Col: 155 Unexpected end tag (span). Ignored. -Line: 1 Col: 163 Unexpected end tag (style). Ignored. -Line: 1 Col: 172 Unexpected end tag (script). Ignored. -Line: 1 Col: 180 Unexpected end tag (table). Ignored. -Line: 1 Col: 185 Unexpected end tag (th). Ignored. -Line: 1 Col: 190 Unexpected end tag (td). Ignored. -Line: 1 Col: 195 Unexpected end tag (tr). Ignored. -Line: 1 Col: 203 This element (frame) has no end tag. -Line: 1 Col: 210 This element (area) has no end tag. -Line: 1 Col: 217 Unexpected end tag (link). Ignored. -Line: 1 Col: 225 This element (param) has no end tag. -Line: 1 Col: 230 This element (hr) has no end tag. -Line: 1 Col: 238 This element (input) has no end tag. -Line: 1 Col: 244 Unexpected end tag (col). Ignored. -Line: 1 Col: 251 Unexpected end tag (base). Ignored. -Line: 1 Col: 258 Unexpected end tag (meta). Ignored. -Line: 1 Col: 269 This element (basefont) has no end tag. -Line: 1 Col: 279 This element (bgsound) has no end tag. -Line: 1 Col: 287 This element (embed) has no end tag. -Line: 1 Col: 296 This element (spacer) has no end tag. -Line: 1 Col: 300 Unexpected end tag (p). Ignored. -Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 320 Unexpected end tag (caption). Ignored. -Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 339 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 355 Unexpected end tag (thead). Ignored. -Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 393 Unexpected end tag (dir). Ignored. -Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 460 This element (wbr) has no end tag. -Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 513 Unexpected end tag (html). Ignored. -Line: 1 Col: 513 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 520 Unexpected end tag (head). Ignored. -Line: 1 Col: 529 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 537 This element (image) has no end tag. -Line: 1 Col: 547 This element (isindex) has no end tag. -Line: 1 Col: 557 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 568 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 579 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 599 Unexpected end tag (option). Ignored. -Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 622 Unexpected end tag (textarea). Ignored. -#document -| -| -| -|-| -| -| baz="1" -| foo="bar" -| "foo" -| -| "bar" -| "asdf" -RESULT -); - } -} - diff --git a/php/tests/HTML5/TestDataTest/sample.dat b/php/tests/HTML5/TestDataTest/sample.dat deleted file mode 100644 index 4351e8d..0000000 --- a/php/tests/HTML5/TestDataTest/sample.dat +++ /dev/null @@ -1,7 +0,0 @@ -#data -Foo -#des -Bar - -#data -Foo diff --git a/php/tests/HTML5/TestableTokenizer.php b/php/tests/HTML5/TestableTokenizer.php deleted file mode 100644 index 4f064c3..0000000 --- a/php/tests/HTML5/TestableTokenizer.php +++ /dev/null @@ -1,76 +0,0 @@ -_contentModelFlag = $contentModelFlag; - $this->_lastStartFlag = $lastStartFlag; - } - public function parse() { - $this->content_model = $this->_contentModelFlag; - if ($this->_lastStartFlag) { - $this->token = array( - 'type' => self::STARTTAG, - 'name' => $this->_lastStartFlag, - ); - } - return parent::parse(); - } - // --end mismatched interface - - protected function emitToken($token, $checkStream = true, $dry = false) { - parent::emitToken($token, $checkStream, true); - - // tree handling code omitted - switch ($token['type']) { - case self::DOCTYPE: - if (!isset($token['name'])) $token['name'] = null; - if (!isset($token['public'])) $token['public'] = null; - if (!isset($token['system'])) $token['system'] = null; - $this->outputTokens[] = array('DOCTYPE', $token['name'], $token['public'], $token['system'], empty($token['force-quirks'])); - break; - case self::STARTTAG: - $attr = new stdclass(); - foreach ($token['attr'] as $keypair) { - // XXX this is IMPORTANT behavior, check if it's - // in TreeBuilder - $name = $keypair['name']; - if (isset($attr->$name)) continue; - $attr->$name = $keypair['value']; - } - $start = array('StartTag', $token['name'], $attr); - if (isset($token['self-closing'])) $start[] = true; - $this->outputTokens[] = $start; - break; - case self::ENDTAG: - $this->outputTokens[] = array('EndTag', $token['name']); - break; - case self::COMMENT: - $this->outputTokens[] = array('Comment', $token['data']); - break; - case self::CHARACTER: - case self::SPACECHARACTER: - if (count($this->outputTokens)) { - $old = array_pop($this->outputTokens); - if ($old[0] === 'Character') { - $old[1] .= $token['data']; - $this->outputTokens[] = $old; - break; - } - $this->outputTokens[] = $old; - } - $this->outputTokens[] = array('Character', $token['data']); - break; - case self::PARSEERROR: - $this->outputTokens[] = 'ParseError'; - break; - } - } -} diff --git a/php/tests/HTML5/TokenizerPositionTest.php b/php/tests/HTML5/TokenizerPositionTest.php deleted file mode 100644 index 534456a..0000000 --- a/php/tests/HTML5/TokenizerPositionTest.php +++ /dev/null @@ -1,164 +0,0 @@ -characterTokens) { - array_pop($this->outputLines); - array_pop($this->outputCols); - } - $this->characterTokens[] = $token; - - default: - $this->outputLines[] = $this->stream()->getCurrentLine(); - $this->outputCols[] = $this->stream()->getColumnOffset(); - } - if ($token['type'] !== self::CHARACTER) { - $this->characterTokens = array(); - } - } -} - -class HTML5_TokenizerTestOfPosition extends UnitTestCase -{ - function testBasic() { - $this->assertPositions( - "f \na", - array(1,1,1,1, 2,2,2,2), - array(3,6,7,10,0,3,4,8) - ); - } - - function testUnicode() { - $this->assertPositions( - "\xC2\xA2\xE2\x82\xACa\xf4\x8a\xaf\x8d", - array(1,1,1,1,1), - array(1,4,6,9,10) - ); - } - - function testData() { - $this->assertPositions( - "a\na\n\xC2\xA2", - array(3,3), - array(1,4) - ); - } - - function testMarkupDeclarationDoubleDash() { - $this->assertPositions( - '', - array(1), - array(12) - ); - } - - function testMarkupDeclarationDoctype() { - $this->assertPositions( - '', - array(1), - array(10) - ); - } - - function testAfterDoctypeNamePublic() { - $this->assertPositions( - '', - array(1), - array(23) - ); - } - - function testAfterDoctypeNameSystem() { - $this->assertPositions( - '', - array(1), - array(23) - ); - } - - function testDecEntitySansSemicolon() { - $this->assertPositions( - 'Ĭ', - array(1), - array(5) - ); - } - - function testDecEntityWithSemicolon() { - $this->assertPositions( - 'Ĭ', - array(1), - array(6) - ); - } - - function testHexEntity() { - $this->assertPositions( - '̀', - array(1), - array(7) - ); - } - - function testEmptyEntity() { - $this->assertPositions( - '', - array(1,1), - array(3,6) - ); - } - - function testNamedEntity() { - $this->assertPositions( - '"foo', - array(1,1), - array(9,12) - ); - } - - function testBadNamedEntity() { - $this->assertPositions( - '&zzz;b', - array(1), - array(6) - ); - } - - function testAttributeEntity() { - $this->assertPositions( - 'a', - array( 1, 1), - array(16,17) - ); - } - - function testBogusComment() { - $this->assertPositions( - "d", - array(2,2), - array(5,6) - ); - } - - protected function assertPositions($input, $lines, $cols, $flag = HTML5_Tokenizer::PCDATA, $lastStartTag = null) { - $tokenizer = new HTML5_PositionTestableTokenizer($input, $flag, $lastStartTag); - $GLOBALS['TIME'] -= get_microtime(); - $tokenizer->parse($input); - $GLOBALS['TIME'] += get_microtime(); - $this->assertIdentical($tokenizer->outputLines, $lines, 'Lines: %s'); - $this->assertIdentical($tokenizer->outputCols, $cols, 'Cols: %s'); - } -} diff --git a/php/tests/HTML5/TokenizerTest.php b/php/tests/HTML5/TokenizerTest.php deleted file mode 100644 index d00fa78..0000000 --- a/php/tests/HTML5/TokenizerTest.php +++ /dev/null @@ -1,88 +0,0 @@ -description ."\n"; - if (!isset($test->contentModelFlags)) { - $test->contentModelFlags = array('PCDATA'); - } - if (!isset($test->ignoreErrorOrder)) { - $test->ignoreErrorOrder = false; - } - - // Get expected result array (and maybe error count). - $expect = array(); - $expectedErrorCount = 0; // This is only used when ignoreErrorOrder = true. - foreach ($test->output as $tok) { - // If we're ignoring error order and this is a parse error, just count. - if ($test->ignoreErrorOrder && $tok === 'ParseError') { - $expectedErrorCount++; - } else { - // Normalize character tokens from the test - if ($expect && $tok[0] === 'Character' && $expect[count($expect) - 1][0] === 'Character') { - $expect[count($expect) - 1][1] .= $tok[1]; - } else { - $expect[] = $tok; - } - } - } - - // Run test for each content model flag. - foreach ($test->contentModelFlags as $flag) { - $output = $this->tokenize($test, $flag); - $result = array(); - $resultErrorCount = 0; // This is only used when ignoreErrorOrder = true. - foreach ($output as $tok) { - // If we're ignoring error order and this is a parse error, just count. - if ($test->ignoreErrorOrder && $tok === 'ParseError') { - $resultErrorCount++; - } else { - $result[] = $tok; - } - } - $this->assertIdentical($expect, $result, - 'In test "'.str_replace('%', '%%', $test->description). - '" with content model '.$flag.': %s' - ); - if ($test->ignoreErrorOrder) { - $this->assertIdentical($expectedErrorCount, $resultErrorCount, - 'Wrong error count in test "'.str_replace('%', '%%', $test->description). - '" with content model '.$flag.': %s' - ); - } - if ($expect != $result || ($test->ignoreErrorOrder && $expectedErrorCount !== $resultErrorCount)) { - echo "Input: "; str_dump($test->input); - echo "\nExpected: \n"; echo $this->tokenDump($expect); - echo "\nActual: \n"; echo $this->tokenDump($result); - echo "\n"; - } - } - } - private function tokenDump($tokens) { - $ret = ''; - foreach ($tokens as $i => $token) { - $ret .= ($i+1).". {$token[0]}: {$token[1]}\n"; - } - return $ret; - } - public function tokenize($test, $flag) { - $flag = constant("HTML5_Tokenizer::$flag"); - if (!isset($test->lastStartTag)) $test->lastStartTag = null; - $tokenizer = new HTML5_TestableTokenizer($test->input, $flag, $test->lastStartTag); - $GLOBALS['TIME'] -= get_microtime(); - $tokenizer->parse(); - $GLOBALS['TIME'] += get_microtime(); - return $tokenizer->outputTokens; - } -} - -// generate test suites for tokenizer -HTML5_TestData::generateTestCases( - 'HTML5_TokenizerHarness', - 'HTML5_TokenizerTestOf', - 'tokenizer', '*.test' -); diff --git a/php/tests/HTML5/TreeBuilderTest.php b/php/tests/HTML5/TreeBuilderTest.php deleted file mode 100644 index 708d6a0..0000000 --- a/php/tests/HTML5/TreeBuilderTest.php +++ /dev/null @@ -1,39 +0,0 @@ -parseFragment($test['document-fragment']); - } else { - $tokenizer->parse(); - } - $GLOBALS['TIME'] += get_microtime(); - $this->assertIdentical( - $test['document'], - HTML5_TestData::strDom($tokenizer->save()), - $test - ); - } -} - -HTML5_TestData::generateTestCases( - 'HTML5_TreeBuilderHarness', - 'HTML5_TreeBuilderTestOf', - 'tree-construction', '*.dat' -); - diff --git a/php/tests/all-tests.php b/php/tests/all-tests.php deleted file mode 100644 index 1b342e9..0000000 --- a/php/tests/all-tests.php +++ /dev/null @@ -1,13 +0,0 @@ -= 0x7F) { - $spec = "\\"; - switch ($byte) { - case 0x00: $echo = '0'; break; - case 0x07: $echo = 'a'; break; - case 0x08: $echo = 'b'; break; - case 0x09: $echo = 't'; break; - case 0x10: {$echo = "\n"; $spec = ''; break;} - case 0x11: $echo = 'v'; break; - case 0x12: $echo = 'f'; break; - case 0x13: {$echo = $spec = ''; break;} - case 0x1B: $echo = 'e'; break; - default: - $echo = 'x' . strtoupper(dechex($byte)); - } - } - if ($echo == '\\') $echo = '\\\\'; - echo $spec . $echo; - } - echo "\n"; -} - -/** - * Pretty prints a token as taken by TreeConstructer->emitToken - */ -function token_dump($token) { - switch ($token['type']) { - case HTML5_Tokenizer::DOCTYPE: - echo "\n"; - break; - case HTML5_Tokenizer::STARTTAG: - $attr = ''; - foreach ($token['attr'] as $kp) { - $attr .= ' '.$kp['name'] . '="' . $kp['value'] . '"'; - } - echo "<{$token['name']}$attr>\n"; - break; - case HTML5_Tokenizer::ENDTAG: - echo "{$token['name']}>\n"; - break; - case HTML5_Tokenizer::COMMENT: - echo "\n"; - break; - case HTML5_Tokenizer::CHARACTER: - echo '"'.$token['data'].'"'."\n"; - break; - case HTML5_Tokenizer::EOF: - echo "EOF\n"; - break; - } -} - -require_once $simpletest_location . '/autorun.php'; - -class TimedTextReporter extends TextReporter -{ - public function paintFooter($test_name) { - parent::paintFooter($test_name); - echo 'Time: ' . $GLOBALS['TIME'] . "\n"; - } -} - -function get_microtime() { - $microtime = explode(' ', microtime()); - return $microtime[1] . substr($microtime[0], 1); -} - -SimpleTest::prefer(new TimedTextReporter()); - -// vim: et sw=4 sts=4 diff --git a/python/README b/python/README deleted file mode 100644 index 12a48f3..0000000 --- a/python/README +++ /dev/null @@ -1,39 +0,0 @@ -html5lib is a pure-python library for parsing HTML. It is designed to -conform to the HTML 5 specification, which has formalized the error handling -algorithms of popular web browsers. - - = Installation = - -html5lib is packaged with distutils. To install it use: - $ python setup.py install - - = Tests = - -You may wish to check that your installation has been a success by -running the testsuite. All the tests can be run by invoking -runtests.py in the html5lib/tests/ directory - - = Usage = - -Simple usage follows this pattern: - -import html5lib -f = open("mydocument.html") -parser = html5lib.HTMLParser() -document = parser.parse(f) - - -More documentation is avaliable in the docstrings or from -http://code.google.com/p/html5lib/wiki/UserDocumentation - - = Bugs = - -Please report any bugs on the issue tracker: -http://code.google.com/p/html5lib/issues/list - - = Get Involved = - -Contributions to code or documenation are actively encouraged. Submit -patches to the issue tracker or discuss changes on irc in the #whatwg -channel on freenode.net - diff --git a/python/html5lib/__init__.py b/python/html5lib/__init__.py deleted file mode 100644 index 45c9f76..0000000 --- a/python/html5lib/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -u""" -HTML parsing library based on the WHATWG "HTML5" -specification. The parser is designed to be compatible with existing -HTML found in the wild and implements well-defined error recovery that -is largely compatible with modern desktop web browsers. - -Example usage: - -import html5lib -f = open("my_document.html") -tree = html5lib.parse(f) -""" -from __future__ import absolute_import -__version__ = u"0.95-dev" -from .html5parser import HTMLParser, parse, parseFragment -from .treebuilders import getTreeBuilder -from .treewalkers import getTreeWalker -from .serializer import serialize diff --git a/python/html5lib/constants.py b/python/html5lib/constants.py deleted file mode 100644 index ef4f2c2..0000000 --- a/python/html5lib/constants.py +++ /dev/null @@ -1,3079 +0,0 @@ -from __future__ import absolute_import -import string, gettext -_ = gettext.gettext - -EOF = None - -E = { - u"null-character": - _(u"Null character in input stream, replaced with U+FFFD."), - u"invalid-codepoint": - _(u"Invalid codepoint in stream."), - u"incorrectly-placed-solidus": - _(u"Solidus (/) incorrectly placed in tag."), - u"incorrect-cr-newline-entity": - _(u"Incorrect CR newline entity, replaced with LF."), - u"illegal-windows-1252-entity": - _(u"Entity used with illegal number (windows-1252 reference)."), - u"cant-convert-numeric-entity": - _(u"Numeric entity couldn't be converted to character " - u"(codepoint U+%(charAsInt)08x)."), - u"illegal-codepoint-for-numeric-entity": - _(u"Numeric entity represents an illegal codepoint: " - u"U+%(charAsInt)08x."), - u"numeric-entity-without-semicolon": - _(u"Numeric entity didn't end with ';'."), - u"expected-numeric-entity-but-got-eof": - _(u"Numeric entity expected. Got end of file instead."), - u"expected-numeric-entity": - _(u"Numeric entity expected but none found."), - u"named-entity-without-semicolon": - _(u"Named entity didn't end with ';'."), - u"expected-named-entity": - _(u"Named entity expected. Got none."), - u"attributes-in-end-tag": - _(u"End tag contains unexpected attributes."), - u'self-closing-flag-on-end-tag': - _(u"End tag contains unexpected self-closing flag."), - u"expected-tag-name-but-got-right-bracket": - _(u"Expected tag name. Got '>' instead."), - u"expected-tag-name-but-got-question-mark": - _(u"Expected tag name. Got '?' instead. (HTML doesn't " - u"support processing instructions.)"), - u"expected-tag-name": - _(u"Expected tag name. Got something else instead"), - u"expected-closing-tag-but-got-right-bracket": - _(u"Expected closing tag. Got '>' instead. Ignoring '>'."), - u"expected-closing-tag-but-got-eof": - _(u"Expected closing tag. Unexpected end of file."), - u"expected-closing-tag-but-got-char": - _(u"Expected closing tag. Unexpected character '%(data)s' found."), - u"eof-in-tag-name": - _(u"Unexpected end of file in the tag name."), - u"expected-attribute-name-but-got-eof": - _(u"Unexpected end of file. Expected attribute name instead."), - u"eof-in-attribute-name": - _(u"Unexpected end of file in attribute name."), - u"invalid-character-in-attribute-name": - _(u"Invalid chracter in attribute name"), - u"duplicate-attribute": - _(u"Dropped duplicate attribute on tag."), - u"expected-end-of-tag-name-but-got-eof": - _(u"Unexpected end of file. Expected = or end of tag."), - u"expected-attribute-value-but-got-eof": - _(u"Unexpected end of file. Expected attribute value."), - u"expected-attribute-value-but-got-right-bracket": - _(u"Expected attribute value. Got '>' instead."), - u'equals-in-unquoted-attribute-value': - _(u"Unexpected = in unquoted attribute"), - u'unexpected-character-in-unquoted-attribute-value': - _(u"Unexpected character in unquoted attribute"), - u"invalid-character-after-attribute-name": - _(u"Unexpected character after attribute name."), - u"unexpected-character-after-attribute-value": - _(u"Unexpected character after attribute value."), - u"eof-in-attribute-value-double-quote": - _(u"Unexpected end of file in attribute value (\")."), - u"eof-in-attribute-value-single-quote": - _(u"Unexpected end of file in attribute value (')."), - u"eof-in-attribute-value-no-quotes": - _(u"Unexpected end of file in attribute value."), - u"unexpected-EOF-after-solidus-in-tag": - _(u"Unexpected end of file in tag. Expected >"), - u"unexpected-character-after-soldius-in-tag": - _(u"Unexpected character after / in tag. Expected >"), - u"expected-dashes-or-doctype": - _(u"Expected '--' or 'DOCTYPE'. Not found."), - u"unexpected-bang-after-double-dash-in-comment": - _(u"Unexpected ! after -- in comment"), - u"unexpected-space-after-double-dash-in-comment": - _(u"Unexpected space after -- in comment"), - u"incorrect-comment": - _(u"Incorrect comment."), - u"eof-in-comment": - _(u"Unexpected end of file in comment."), - u"eof-in-comment-end-dash": - _(u"Unexpected end of file in comment (-)"), - u"unexpected-dash-after-double-dash-in-comment": - _(u"Unexpected '-' after '--' found in comment."), - u"eof-in-comment-double-dash": - _(u"Unexpected end of file in comment (--)."), - u"eof-in-comment-end-space-state": - _(u"Unexpected end of file in comment."), - u"eof-in-comment-end-bang-state": - _(u"Unexpected end of file in comment."), - u"unexpected-char-in-comment": - _(u"Unexpected character in comment found."), - u"need-space-after-doctype": - _(u"No space after literal string 'DOCTYPE'."), - u"expected-doctype-name-but-got-right-bracket": - _(u"Unexpected > character. Expected DOCTYPE name."), - u"expected-doctype-name-but-got-eof": - _(u"Unexpected end of file. Expected DOCTYPE name."), - u"eof-in-doctype-name": - _(u"Unexpected end of file in DOCTYPE name."), - u"eof-in-doctype": - _(u"Unexpected end of file in DOCTYPE."), - u"expected-space-or-right-bracket-in-doctype": - _(u"Expected space or '>'. Got '%(data)s'"), - u"unexpected-end-of-doctype": - _(u"Unexpected end of DOCTYPE."), - u"unexpected-char-in-doctype": - _(u"Unexpected character in DOCTYPE."), - u"eof-in-innerhtml": - _(u"XXX innerHTML EOF"), - u"unexpected-doctype": - _(u"Unexpected DOCTYPE. Ignored."), - u"non-html-root": - _(u"html needs to be the first start tag."), - u"expected-doctype-but-got-eof": - _(u"Unexpected End of file. Expected DOCTYPE."), - u"unknown-doctype": - _(u"Erroneous DOCTYPE."), - u"expected-doctype-but-got-chars": - _(u"Unexpected non-space characters. Expected DOCTYPE."), - u"expected-doctype-but-got-start-tag": - _(u"Unexpected start tag (%(name)s). Expected DOCTYPE."), - u"expected-doctype-but-got-end-tag": - _(u"Unexpected end tag (%(name)s). Expected DOCTYPE."), - u"end-tag-after-implied-root": - _(u"Unexpected end tag (%(name)s) after the (implied) root element."), - u"expected-named-closing-tag-but-got-eof": - _(u"Unexpected end of file. Expected end tag (%(name)s)."), - u"two-heads-are-not-better-than-one": - _(u"Unexpected start tag head in existing head. Ignored."), - u"unexpected-end-tag": - _(u"Unexpected end tag (%(name)s). Ignored."), - u"unexpected-start-tag-out-of-my-head": - _(u"Unexpected start tag (%(name)s) that can be in head. Moved."), - u"unexpected-start-tag": - _(u"Unexpected start tag (%(name)s)."), - u"missing-end-tag": - _(u"Missing end tag (%(name)s)."), - u"missing-end-tags": - _(u"Missing end tags (%(name)s)."), - u"unexpected-start-tag-implies-end-tag": - _(u"Unexpected start tag (%(startName)s) " - u"implies end tag (%(endName)s)."), - u"unexpected-start-tag-treated-as": - _(u"Unexpected start tag (%(originalName)s). Treated as %(newName)s."), - u"deprecated-tag": - _(u"Unexpected start tag %(name)s. Don't use it!"), - u"unexpected-start-tag-ignored": - _(u"Unexpected start tag %(name)s. Ignored."), - u"expected-one-end-tag-but-got-another": - _(u"Unexpected end tag (%(gotName)s). " - u"Missing end tag (%(expectedName)s)."), - u"end-tag-too-early": - _(u"End tag (%(name)s) seen too early. Expected other end tag."), - u"end-tag-too-early-named": - _(u"Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s)."), - u"end-tag-too-early-ignored": - _(u"End tag (%(name)s) seen too early. Ignored."), - u"adoption-agency-1.1": - _(u"End tag (%(name)s) violates step 1, " - u"paragraph 1 of the adoption agency algorithm."), - u"adoption-agency-1.2": - _(u"End tag (%(name)s) violates step 1, " - u"paragraph 2 of the adoption agency algorithm."), - u"adoption-agency-1.3": - _(u"End tag (%(name)s) violates step 1, " - u"paragraph 3 of the adoption agency algorithm."), - u"unexpected-end-tag-treated-as": - _(u"Unexpected end tag (%(originalName)s). Treated as %(newName)s."), - u"no-end-tag": - _(u"This element (%(name)s) has no end tag."), - u"unexpected-implied-end-tag-in-table": - _(u"Unexpected implied end tag (%(name)s) in the table phase."), - u"unexpected-implied-end-tag-in-table-body": - _(u"Unexpected implied end tag (%(name)s) in the table body phase."), - u"unexpected-char-implies-table-voodoo": - _(u"Unexpected non-space characters in " - u"table context caused voodoo mode."), - u"unexpected-hidden-input-in-table": - _(u"Unexpected input with type hidden in table context."), - u"unexpected-form-in-table": - _(u"Unexpected form in table context."), - u"unexpected-start-tag-implies-table-voodoo": - _(u"Unexpected start tag (%(name)s) in " - u"table context caused voodoo mode."), - u"unexpected-end-tag-implies-table-voodoo": - _(u"Unexpected end tag (%(name)s) in " - u"table context caused voodoo mode."), - u"unexpected-cell-in-table-body": - _(u"Unexpected table cell start tag (%(name)s) " - u"in the table body phase."), - u"unexpected-cell-end-tag": - _(u"Got table cell end tag (%(name)s) " - u"while required end tags are missing."), - u"unexpected-end-tag-in-table-body": - _(u"Unexpected end tag (%(name)s) in the table body phase. Ignored."), - u"unexpected-implied-end-tag-in-table-row": - _(u"Unexpected implied end tag (%(name)s) in the table row phase."), - u"unexpected-end-tag-in-table-row": - _(u"Unexpected end tag (%(name)s) in the table row phase. Ignored."), - u"unexpected-select-in-select": - _(u"Unexpected select start tag in the select phase " - u"treated as select end tag."), - u"unexpected-input-in-select": - _(u"Unexpected input start tag in the select phase."), - u"unexpected-start-tag-in-select": - _(u"Unexpected start tag token (%(name)s in the select phase. " - u"Ignored."), - u"unexpected-end-tag-in-select": - _(u"Unexpected end tag (%(name)s) in the select phase. Ignored."), - u"unexpected-table-element-start-tag-in-select-in-table": - _(u"Unexpected table element start tag (%(name)s) in the select in table phase."), - u"unexpected-table-element-end-tag-in-select-in-table": - _(u"Unexpected table element end tag (%(name)s) in the select in table phase."), - u"unexpected-char-after-body": - _(u"Unexpected non-space characters in the after body phase."), - u"unexpected-start-tag-after-body": - _(u"Unexpected start tag token (%(name)s)" - u" in the after body phase."), - u"unexpected-end-tag-after-body": - _(u"Unexpected end tag token (%(name)s)" - u" in the after body phase."), - u"unexpected-char-in-frameset": - _(u"Unepxected characters in the frameset phase. Characters ignored."), - u"unexpected-start-tag-in-frameset": - _(u"Unexpected start tag token (%(name)s)" - u" in the frameset phase. Ignored."), - u"unexpected-frameset-in-frameset-innerhtml": - _(u"Unexpected end tag token (frameset) " - u"in the frameset phase (innerHTML)."), - u"unexpected-end-tag-in-frameset": - _(u"Unexpected end tag token (%(name)s)" - u" in the frameset phase. Ignored."), - u"unexpected-char-after-frameset": - _(u"Unexpected non-space characters in the " - u"after frameset phase. Ignored."), - u"unexpected-start-tag-after-frameset": - _(u"Unexpected start tag (%(name)s)" - u" in the after frameset phase. Ignored."), - u"unexpected-end-tag-after-frameset": - _(u"Unexpected end tag (%(name)s)" - u" in the after frameset phase. Ignored."), - u"unexpected-end-tag-after-body-innerhtml": - _(u"Unexpected end tag after body(innerHtml)"), - u"expected-eof-but-got-char": - _(u"Unexpected non-space characters. Expected end of file."), - u"expected-eof-but-got-start-tag": - _(u"Unexpected start tag (%(name)s)" - u". Expected end of file."), - u"expected-eof-but-got-end-tag": - _(u"Unexpected end tag (%(name)s)" - u". Expected end of file."), - u"eof-in-table": - _(u"Unexpected end of file. Expected table content."), - u"eof-in-select": - _(u"Unexpected end of file. Expected select content."), - u"eof-in-frameset": - _(u"Unexpected end of file. Expected frameset content."), - u"eof-in-script-in-script": - _(u"Unexpected end of file. Expected script content."), - u"eof-in-foreign-lands": - _(u"Unexpected end of file. Expected foreign content"), - u"non-void-element-with-trailing-solidus": - _(u"Trailing solidus not allowed on element %(name)s"), - u"unexpected-html-element-in-foreign-content": - _(u"Element %(name)s not allowed in a non-html context"), - u"unexpected-end-tag-before-html": - _(u"Unexpected end tag (%(name)s) before html."), - u"XXX-undefined-error": - (u"Undefined error (this sucks and should be fixed)"), -} - -namespaces = { - u"html":u"http://www.w3.org/1999/xhtml", - u"mathml":u"http://www.w3.org/1998/Math/MathML", - u"svg":u"http://www.w3.org/2000/svg", - u"xlink":u"http://www.w3.org/1999/xlink", - u"xml":u"http://www.w3.org/XML/1998/namespace", - u"xmlns":u"http://www.w3.org/2000/xmlns/" -} - -scopingElements = frozenset(( - (namespaces[u"html"], u"applet"), - (namespaces[u"html"], u"caption"), - (namespaces[u"html"], u"html"), - (namespaces[u"html"], u"marquee"), - (namespaces[u"html"], u"object"), - (namespaces[u"html"], u"table"), - (namespaces[u"html"], u"td"), - (namespaces[u"html"], u"th"), - (namespaces[u"mathml"], u"mi"), - (namespaces[u"mathml"], u"mo"), - (namespaces[u"mathml"], u"mn"), - (namespaces[u"mathml"], u"ms"), - (namespaces[u"mathml"], u"mtext"), - (namespaces[u"mathml"], u"annotation-xml"), - (namespaces[u"svg"], u"foreignObject"), - (namespaces[u"svg"], u"desc"), - (namespaces[u"svg"], u"title"), -)) - -formattingElements = frozenset(( - (namespaces[u"html"], u"a"), - (namespaces[u"html"], u"b"), - (namespaces[u"html"], u"big"), - (namespaces[u"html"], u"code"), - (namespaces[u"html"], u"em"), - (namespaces[u"html"], u"font"), - (namespaces[u"html"], u"i"), - (namespaces[u"html"], u"nobr"), - (namespaces[u"html"], u"s"), - (namespaces[u"html"], u"small"), - (namespaces[u"html"], u"strike"), - (namespaces[u"html"], u"strong"), - (namespaces[u"html"], u"tt"), - (namespaces[u"html"], u"u") -)) - -specialElements = frozenset(( - (namespaces[u"html"], u"address"), - (namespaces[u"html"], u"applet"), - (namespaces[u"html"], u"area"), - (namespaces[u"html"], u"article"), - (namespaces[u"html"], u"aside"), - (namespaces[u"html"], u"base"), - (namespaces[u"html"], u"basefont"), - (namespaces[u"html"], u"bgsound"), - (namespaces[u"html"], u"blockquote"), - (namespaces[u"html"], u"body"), - (namespaces[u"html"], u"br"), - (namespaces[u"html"], u"button"), - (namespaces[u"html"], u"caption"), - (namespaces[u"html"], u"center"), - (namespaces[u"html"], u"col"), - (namespaces[u"html"], u"colgroup"), - (namespaces[u"html"], u"command"), - (namespaces[u"html"], u"dd"), - (namespaces[u"html"], u"details"), - (namespaces[u"html"], u"dir"), - (namespaces[u"html"], u"div"), - (namespaces[u"html"], u"dl"), - (namespaces[u"html"], u"dt"), - (namespaces[u"html"], u"embed"), - (namespaces[u"html"], u"fieldset"), - (namespaces[u"html"], u"figure"), - (namespaces[u"html"], u"footer"), - (namespaces[u"html"], u"form"), - (namespaces[u"html"], u"frame"), - (namespaces[u"html"], u"frameset"), - (namespaces[u"html"], u"h1"), - (namespaces[u"html"], u"h2"), - (namespaces[u"html"], u"h3"), - (namespaces[u"html"], u"h4"), - (namespaces[u"html"], u"h5"), - (namespaces[u"html"], u"h6"), - (namespaces[u"html"], u"head"), - (namespaces[u"html"], u"header"), - (namespaces[u"html"], u"hr"), - (namespaces[u"html"], u"html"), - (namespaces[u"html"], u"iframe"), - # Note that image is commented out in the spec as "this isn't an - # element that can end up on the stack, so it doesn't matter," - (namespaces[u"html"], u"image"), - (namespaces[u"html"], u"img"), - (namespaces[u"html"], u"input"), - (namespaces[u"html"], u"isindex"), - (namespaces[u"html"], u"li"), - (namespaces[u"html"], u"link"), - (namespaces[u"html"], u"listing"), - (namespaces[u"html"], u"marquee"), - (namespaces[u"html"], u"menu"), - (namespaces[u"html"], u"meta"), - (namespaces[u"html"], u"nav"), - (namespaces[u"html"], u"noembed"), - (namespaces[u"html"], u"noframes"), - (namespaces[u"html"], u"noscript"), - (namespaces[u"html"], u"object"), - (namespaces[u"html"], u"ol"), - (namespaces[u"html"], u"p"), - (namespaces[u"html"], u"param"), - (namespaces[u"html"], u"plaintext"), - (namespaces[u"html"], u"pre"), - (namespaces[u"html"], u"script"), - (namespaces[u"html"], u"section"), - (namespaces[u"html"], u"select"), - (namespaces[u"html"], u"style"), - (namespaces[u"html"], u"table"), - (namespaces[u"html"], u"tbody"), - (namespaces[u"html"], u"td"), - (namespaces[u"html"], u"textarea"), - (namespaces[u"html"], u"tfoot"), - (namespaces[u"html"], u"th"), - (namespaces[u"html"], u"thead"), - (namespaces[u"html"], u"title"), - (namespaces[u"html"], u"tr"), - (namespaces[u"html"], u"ul"), - (namespaces[u"html"], u"wbr"), - (namespaces[u"html"], u"xmp"), - (namespaces[u"svg"], u"foreignObject") -)) - -htmlIntegrationPointElements = frozenset(( - (namespaces[u"mathml"], u"annotaion-xml"), - (namespaces[u"svg"], u"foreignObject"), - (namespaces[u"svg"], u"desc"), - (namespaces[u"svg"], u"title") -)) - -mathmlTextIntegrationPointElements = frozenset(( - (namespaces[u"mathml"], u"mi"), - (namespaces[u"mathml"], u"mo"), - (namespaces[u"mathml"], u"mn"), - (namespaces[u"mathml"], u"ms"), - (namespaces[u"mathml"], u"mtext") -)) - -spaceCharacters = frozenset(( - u"\t", - u"\n", - u"\u000C", - u" ", - u"\r" -)) - -tableInsertModeElements = frozenset(( - u"table", - u"tbody", - u"tfoot", - u"thead", - u"tr" -)) - -asciiLowercase = frozenset(string.ascii_lowercase) -asciiUppercase = frozenset(string.ascii_uppercase) -asciiLetters = frozenset(string.ascii_letters) -digits = frozenset(string.digits) -hexDigits = frozenset(string.hexdigits) - -asciiUpper2Lower = dict([(ord(c),ord(c.lower())) - for c in string.ascii_uppercase]) - -# Heading elements need to be ordered -headingElements = ( - u"h1", - u"h2", - u"h3", - u"h4", - u"h5", - u"h6" -) - -voidElements = frozenset(( - u"base", - u"command", - u"event-source", - u"link", - u"meta", - u"hr", - u"br", - u"img", - u"embed", - u"param", - u"area", - u"col", - u"input", - u"source", - u"track" -)) - -cdataElements = frozenset((u'title', u'textarea')) - -rcdataElements = frozenset(( - u'style', - u'script', - u'xmp', - u'iframe', - u'noembed', - u'noframes', - u'noscript' -)) - -booleanAttributes = { - u"": frozenset((u"irrelevant",)), - u"style": frozenset((u"scoped",)), - u"img": frozenset((u"ismap",)), - u"audio": frozenset((u"autoplay",u"controls")), - u"video": frozenset((u"autoplay",u"controls")), - u"script": frozenset((u"defer", u"async")), - u"details": frozenset((u"open",)), - u"datagrid": frozenset((u"multiple", u"disabled")), - u"command": frozenset((u"hidden", u"disabled", u"checked", u"default")), - u"hr": frozenset((u"noshade")), - u"menu": frozenset((u"autosubmit",)), - u"fieldset": frozenset((u"disabled", u"readonly")), - u"option": frozenset((u"disabled", u"readonly", u"selected")), - u"optgroup": frozenset((u"disabled", u"readonly")), - u"button": frozenset((u"disabled", u"autofocus")), - u"input": frozenset((u"disabled", u"readonly", u"required", u"autofocus", u"checked", u"ismap")), - u"select": frozenset((u"disabled", u"readonly", u"autofocus", u"multiple")), - u"output": frozenset((u"disabled", u"readonly")), -} - -# entitiesWindows1252 has to be _ordered_ and needs to have an index. It -# therefore can't be a frozenset. -entitiesWindows1252 = ( - 8364, # 0x80 0x20AC EURO SIGN - 65533, # 0x81 UNDEFINED - 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK - 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK - 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK - 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS - 8224, # 0x86 0x2020 DAGGER - 8225, # 0x87 0x2021 DOUBLE DAGGER - 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT - 8240, # 0x89 0x2030 PER MILLE SIGN - 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON - 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE - 65533, # 0x8D UNDEFINED - 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON - 65533, # 0x8F UNDEFINED - 65533, # 0x90 UNDEFINED - 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK - 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK - 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK - 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK - 8226, # 0x95 0x2022 BULLET - 8211, # 0x96 0x2013 EN DASH - 8212, # 0x97 0x2014 EM DASH - 732, # 0x98 0x02DC SMALL TILDE - 8482, # 0x99 0x2122 TRADE MARK SIGN - 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON - 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE - 65533, # 0x9D UNDEFINED - 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON - 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -) - -xmlEntities = frozenset((u'lt;', u'gt;', u'amp;', u'apos;', u'quot;')) - -entities = { - u"AElig": u"\xc6", - u"AElig;": u"\xc6", - u"AMP": u"&", - u"AMP;": u"&", - u"Aacute": u"\xc1", - u"Aacute;": u"\xc1", - u"Abreve;": u"\u0102", - u"Acirc": u"\xc2", - u"Acirc;": u"\xc2", - u"Acy;": u"\u0410", - u"Afr;": u"\U0001d504", - u"Agrave": u"\xc0", - u"Agrave;": u"\xc0", - u"Alpha;": u"\u0391", - u"Amacr;": u"\u0100", - u"And;": u"\u2a53", - u"Aogon;": u"\u0104", - u"Aopf;": u"\U0001d538", - u"ApplyFunction;": u"\u2061", - u"Aring": u"\xc5", - u"Aring;": u"\xc5", - u"Ascr;": u"\U0001d49c", - u"Assign;": u"\u2254", - u"Atilde": u"\xc3", - u"Atilde;": u"\xc3", - u"Auml": u"\xc4", - u"Auml;": u"\xc4", - u"Backslash;": u"\u2216", - u"Barv;": u"\u2ae7", - u"Barwed;": u"\u2306", - u"Bcy;": u"\u0411", - u"Because;": u"\u2235", - u"Bernoullis;": u"\u212c", - u"Beta;": u"\u0392", - u"Bfr;": u"\U0001d505", - u"Bopf;": u"\U0001d539", - u"Breve;": u"\u02d8", - u"Bscr;": u"\u212c", - u"Bumpeq;": u"\u224e", - u"CHcy;": u"\u0427", - u"COPY": u"\xa9", - u"COPY;": u"\xa9", - u"Cacute;": u"\u0106", - u"Cap;": u"\u22d2", - u"CapitalDifferentialD;": u"\u2145", - u"Cayleys;": u"\u212d", - u"Ccaron;": u"\u010c", - u"Ccedil": u"\xc7", - u"Ccedil;": u"\xc7", - u"Ccirc;": u"\u0108", - u"Cconint;": u"\u2230", - u"Cdot;": u"\u010a", - u"Cedilla;": u"\xb8", - u"CenterDot;": u"\xb7", - u"Cfr;": u"\u212d", - u"Chi;": u"\u03a7", - u"CircleDot;": u"\u2299", - u"CircleMinus;": u"\u2296", - u"CirclePlus;": u"\u2295", - u"CircleTimes;": u"\u2297", - u"ClockwiseContourIntegral;": u"\u2232", - u"CloseCurlyDoubleQuote;": u"\u201d", - u"CloseCurlyQuote;": u"\u2019", - u"Colon;": u"\u2237", - u"Colone;": u"\u2a74", - u"Congruent;": u"\u2261", - u"Conint;": u"\u222f", - u"ContourIntegral;": u"\u222e", - u"Copf;": u"\u2102", - u"Coproduct;": u"\u2210", - u"CounterClockwiseContourIntegral;": u"\u2233", - u"Cross;": u"\u2a2f", - u"Cscr;": u"\U0001d49e", - u"Cup;": u"\u22d3", - u"CupCap;": u"\u224d", - u"DD;": u"\u2145", - u"DDotrahd;": u"\u2911", - u"DJcy;": u"\u0402", - u"DScy;": u"\u0405", - u"DZcy;": u"\u040f", - u"Dagger;": u"\u2021", - u"Darr;": u"\u21a1", - u"Dashv;": u"\u2ae4", - u"Dcaron;": u"\u010e", - u"Dcy;": u"\u0414", - u"Del;": u"\u2207", - u"Delta;": u"\u0394", - u"Dfr;": u"\U0001d507", - u"DiacriticalAcute;": u"\xb4", - u"DiacriticalDot;": u"\u02d9", - u"DiacriticalDoubleAcute;": u"\u02dd", - u"DiacriticalGrave;": u"`", - u"DiacriticalTilde;": u"\u02dc", - u"Diamond;": u"\u22c4", - u"DifferentialD;": u"\u2146", - u"Dopf;": u"\U0001d53b", - u"Dot;": u"\xa8", - u"DotDot;": u"\u20dc", - u"DotEqual;": u"\u2250", - u"DoubleContourIntegral;": u"\u222f", - u"DoubleDot;": u"\xa8", - u"DoubleDownArrow;": u"\u21d3", - u"DoubleLeftArrow;": u"\u21d0", - u"DoubleLeftRightArrow;": u"\u21d4", - u"DoubleLeftTee;": u"\u2ae4", - u"DoubleLongLeftArrow;": u"\u27f8", - u"DoubleLongLeftRightArrow;": u"\u27fa", - u"DoubleLongRightArrow;": u"\u27f9", - u"DoubleRightArrow;": u"\u21d2", - u"DoubleRightTee;": u"\u22a8", - u"DoubleUpArrow;": u"\u21d1", - u"DoubleUpDownArrow;": u"\u21d5", - u"DoubleVerticalBar;": u"\u2225", - u"DownArrow;": u"\u2193", - u"DownArrowBar;": u"\u2913", - u"DownArrowUpArrow;": u"\u21f5", - u"DownBreve;": u"\u0311", - u"DownLeftRightVector;": u"\u2950", - u"DownLeftTeeVector;": u"\u295e", - u"DownLeftVector;": u"\u21bd", - u"DownLeftVectorBar;": u"\u2956", - u"DownRightTeeVector;": u"\u295f", - u"DownRightVector;": u"\u21c1", - u"DownRightVectorBar;": u"\u2957", - u"DownTee;": u"\u22a4", - u"DownTeeArrow;": u"\u21a7", - u"Downarrow;": u"\u21d3", - u"Dscr;": u"\U0001d49f", - u"Dstrok;": u"\u0110", - u"ENG;": u"\u014a", - u"ETH": u"\xd0", - u"ETH;": u"\xd0", - u"Eacute": u"\xc9", - u"Eacute;": u"\xc9", - u"Ecaron;": u"\u011a", - u"Ecirc": u"\xca", - u"Ecirc;": u"\xca", - u"Ecy;": u"\u042d", - u"Edot;": u"\u0116", - u"Efr;": u"\U0001d508", - u"Egrave": u"\xc8", - u"Egrave;": u"\xc8", - u"Element;": u"\u2208", - u"Emacr;": u"\u0112", - u"EmptySmallSquare;": u"\u25fb", - u"EmptyVerySmallSquare;": u"\u25ab", - u"Eogon;": u"\u0118", - u"Eopf;": u"\U0001d53c", - u"Epsilon;": u"\u0395", - u"Equal;": u"\u2a75", - u"EqualTilde;": u"\u2242", - u"Equilibrium;": u"\u21cc", - u"Escr;": u"\u2130", - u"Esim;": u"\u2a73", - u"Eta;": u"\u0397", - u"Euml": u"\xcb", - u"Euml;": u"\xcb", - u"Exists;": u"\u2203", - u"ExponentialE;": u"\u2147", - u"Fcy;": u"\u0424", - u"Ffr;": u"\U0001d509", - u"FilledSmallSquare;": u"\u25fc", - u"FilledVerySmallSquare;": u"\u25aa", - u"Fopf;": u"\U0001d53d", - u"ForAll;": u"\u2200", - u"Fouriertrf;": u"\u2131", - u"Fscr;": u"\u2131", - u"GJcy;": u"\u0403", - u"GT": u">", - u"GT;": u">", - u"Gamma;": u"\u0393", - u"Gammad;": u"\u03dc", - u"Gbreve;": u"\u011e", - u"Gcedil;": u"\u0122", - u"Gcirc;": u"\u011c", - u"Gcy;": u"\u0413", - u"Gdot;": u"\u0120", - u"Gfr;": u"\U0001d50a", - u"Gg;": u"\u22d9", - u"Gopf;": u"\U0001d53e", - u"GreaterEqual;": u"\u2265", - u"GreaterEqualLess;": u"\u22db", - u"GreaterFullEqual;": u"\u2267", - u"GreaterGreater;": u"\u2aa2", - u"GreaterLess;": u"\u2277", - u"GreaterSlantEqual;": u"\u2a7e", - u"GreaterTilde;": u"\u2273", - u"Gscr;": u"\U0001d4a2", - u"Gt;": u"\u226b", - u"HARDcy;": u"\u042a", - u"Hacek;": u"\u02c7", - u"Hat;": u"^", - u"Hcirc;": u"\u0124", - u"Hfr;": u"\u210c", - u"HilbertSpace;": u"\u210b", - u"Hopf;": u"\u210d", - u"HorizontalLine;": u"\u2500", - u"Hscr;": u"\u210b", - u"Hstrok;": u"\u0126", - u"HumpDownHump;": u"\u224e", - u"HumpEqual;": u"\u224f", - u"IEcy;": u"\u0415", - u"IJlig;": u"\u0132", - u"IOcy;": u"\u0401", - u"Iacute": u"\xcd", - u"Iacute;": u"\xcd", - u"Icirc": u"\xce", - u"Icirc;": u"\xce", - u"Icy;": u"\u0418", - u"Idot;": u"\u0130", - u"Ifr;": u"\u2111", - u"Igrave": u"\xcc", - u"Igrave;": u"\xcc", - u"Im;": u"\u2111", - u"Imacr;": u"\u012a", - u"ImaginaryI;": u"\u2148", - u"Implies;": u"\u21d2", - u"Int;": u"\u222c", - u"Integral;": u"\u222b", - u"Intersection;": u"\u22c2", - u"InvisibleComma;": u"\u2063", - u"InvisibleTimes;": u"\u2062", - u"Iogon;": u"\u012e", - u"Iopf;": u"\U0001d540", - u"Iota;": u"\u0399", - u"Iscr;": u"\u2110", - u"Itilde;": u"\u0128", - u"Iukcy;": u"\u0406", - u"Iuml": u"\xcf", - u"Iuml;": u"\xcf", - u"Jcirc;": u"\u0134", - u"Jcy;": u"\u0419", - u"Jfr;": u"\U0001d50d", - u"Jopf;": u"\U0001d541", - u"Jscr;": u"\U0001d4a5", - u"Jsercy;": u"\u0408", - u"Jukcy;": u"\u0404", - u"KHcy;": u"\u0425", - u"KJcy;": u"\u040c", - u"Kappa;": u"\u039a", - u"Kcedil;": u"\u0136", - u"Kcy;": u"\u041a", - u"Kfr;": u"\U0001d50e", - u"Kopf;": u"\U0001d542", - u"Kscr;": u"\U0001d4a6", - u"LJcy;": u"\u0409", - u"LT": u"<", - u"LT;": u"<", - u"Lacute;": u"\u0139", - u"Lambda;": u"\u039b", - u"Lang;": u"\u27ea", - u"Laplacetrf;": u"\u2112", - u"Larr;": u"\u219e", - u"Lcaron;": u"\u013d", - u"Lcedil;": u"\u013b", - u"Lcy;": u"\u041b", - u"LeftAngleBracket;": u"\u27e8", - u"LeftArrow;": u"\u2190", - u"LeftArrowBar;": u"\u21e4", - u"LeftArrowRightArrow;": u"\u21c6", - u"LeftCeiling;": u"\u2308", - u"LeftDoubleBracket;": u"\u27e6", - u"LeftDownTeeVector;": u"\u2961", - u"LeftDownVector;": u"\u21c3", - u"LeftDownVectorBar;": u"\u2959", - u"LeftFloor;": u"\u230a", - u"LeftRightArrow;": u"\u2194", - u"LeftRightVector;": u"\u294e", - u"LeftTee;": u"\u22a3", - u"LeftTeeArrow;": u"\u21a4", - u"LeftTeeVector;": u"\u295a", - u"LeftTriangle;": u"\u22b2", - u"LeftTriangleBar;": u"\u29cf", - u"LeftTriangleEqual;": u"\u22b4", - u"LeftUpDownVector;": u"\u2951", - u"LeftUpTeeVector;": u"\u2960", - u"LeftUpVector;": u"\u21bf", - u"LeftUpVectorBar;": u"\u2958", - u"LeftVector;": u"\u21bc", - u"LeftVectorBar;": u"\u2952", - u"Leftarrow;": u"\u21d0", - u"Leftrightarrow;": u"\u21d4", - u"LessEqualGreater;": u"\u22da", - u"LessFullEqual;": u"\u2266", - u"LessGreater;": u"\u2276", - u"LessLess;": u"\u2aa1", - u"LessSlantEqual;": u"\u2a7d", - u"LessTilde;": u"\u2272", - u"Lfr;": u"\U0001d50f", - u"Ll;": u"\u22d8", - u"Lleftarrow;": u"\u21da", - u"Lmidot;": u"\u013f", - u"LongLeftArrow;": u"\u27f5", - u"LongLeftRightArrow;": u"\u27f7", - u"LongRightArrow;": u"\u27f6", - u"Longleftarrow;": u"\u27f8", - u"Longleftrightarrow;": u"\u27fa", - u"Longrightarrow;": u"\u27f9", - u"Lopf;": u"\U0001d543", - u"LowerLeftArrow;": u"\u2199", - u"LowerRightArrow;": u"\u2198", - u"Lscr;": u"\u2112", - u"Lsh;": u"\u21b0", - u"Lstrok;": u"\u0141", - u"Lt;": u"\u226a", - u"Map;": u"\u2905", - u"Mcy;": u"\u041c", - u"MediumSpace;": u"\u205f", - u"Mellintrf;": u"\u2133", - u"Mfr;": u"\U0001d510", - u"MinusPlus;": u"\u2213", - u"Mopf;": u"\U0001d544", - u"Mscr;": u"\u2133", - u"Mu;": u"\u039c", - u"NJcy;": u"\u040a", - u"Nacute;": u"\u0143", - u"Ncaron;": u"\u0147", - u"Ncedil;": u"\u0145", - u"Ncy;": u"\u041d", - u"NegativeMediumSpace;": u"\u200b", - u"NegativeThickSpace;": u"\u200b", - u"NegativeThinSpace;": u"\u200b", - u"NegativeVeryThinSpace;": u"\u200b", - u"NestedGreaterGreater;": u"\u226b", - u"NestedLessLess;": u"\u226a", - u"NewLine;": u"\n", - u"Nfr;": u"\U0001d511", - u"NoBreak;": u"\u2060", - u"NonBreakingSpace;": u"\xa0", - u"Nopf;": u"\u2115", - u"Not;": u"\u2aec", - u"NotCongruent;": u"\u2262", - u"NotCupCap;": u"\u226d", - u"NotDoubleVerticalBar;": u"\u2226", - u"NotElement;": u"\u2209", - u"NotEqual;": u"\u2260", - u"NotEqualTilde;": u"\u2242\u0338", - u"NotExists;": u"\u2204", - u"NotGreater;": u"\u226f", - u"NotGreaterEqual;": u"\u2271", - u"NotGreaterFullEqual;": u"\u2267\u0338", - u"NotGreaterGreater;": u"\u226b\u0338", - u"NotGreaterLess;": u"\u2279", - u"NotGreaterSlantEqual;": u"\u2a7e\u0338", - u"NotGreaterTilde;": u"\u2275", - u"NotHumpDownHump;": u"\u224e\u0338", - u"NotHumpEqual;": u"\u224f\u0338", - u"NotLeftTriangle;": u"\u22ea", - u"NotLeftTriangleBar;": u"\u29cf\u0338", - u"NotLeftTriangleEqual;": u"\u22ec", - u"NotLess;": u"\u226e", - u"NotLessEqual;": u"\u2270", - u"NotLessGreater;": u"\u2278", - u"NotLessLess;": u"\u226a\u0338", - u"NotLessSlantEqual;": u"\u2a7d\u0338", - u"NotLessTilde;": u"\u2274", - u"NotNestedGreaterGreater;": u"\u2aa2\u0338", - u"NotNestedLessLess;": u"\u2aa1\u0338", - u"NotPrecedes;": u"\u2280", - u"NotPrecedesEqual;": u"\u2aaf\u0338", - u"NotPrecedesSlantEqual;": u"\u22e0", - u"NotReverseElement;": u"\u220c", - u"NotRightTriangle;": u"\u22eb", - u"NotRightTriangleBar;": u"\u29d0\u0338", - u"NotRightTriangleEqual;": u"\u22ed", - u"NotSquareSubset;": u"\u228f\u0338", - u"NotSquareSubsetEqual;": u"\u22e2", - u"NotSquareSuperset;": u"\u2290\u0338", - u"NotSquareSupersetEqual;": u"\u22e3", - u"NotSubset;": u"\u2282\u20d2", - u"NotSubsetEqual;": u"\u2288", - u"NotSucceeds;": u"\u2281", - u"NotSucceedsEqual;": u"\u2ab0\u0338", - u"NotSucceedsSlantEqual;": u"\u22e1", - u"NotSucceedsTilde;": u"\u227f\u0338", - u"NotSuperset;": u"\u2283\u20d2", - u"NotSupersetEqual;": u"\u2289", - u"NotTilde;": u"\u2241", - u"NotTildeEqual;": u"\u2244", - u"NotTildeFullEqual;": u"\u2247", - u"NotTildeTilde;": u"\u2249", - u"NotVerticalBar;": u"\u2224", - u"Nscr;": u"\U0001d4a9", - u"Ntilde": u"\xd1", - u"Ntilde;": u"\xd1", - u"Nu;": u"\u039d", - u"OElig;": u"\u0152", - u"Oacute": u"\xd3", - u"Oacute;": u"\xd3", - u"Ocirc": u"\xd4", - u"Ocirc;": u"\xd4", - u"Ocy;": u"\u041e", - u"Odblac;": u"\u0150", - u"Ofr;": u"\U0001d512", - u"Ograve": u"\xd2", - u"Ograve;": u"\xd2", - u"Omacr;": u"\u014c", - u"Omega;": u"\u03a9", - u"Omicron;": u"\u039f", - u"Oopf;": u"\U0001d546", - u"OpenCurlyDoubleQuote;": u"\u201c", - u"OpenCurlyQuote;": u"\u2018", - u"Or;": u"\u2a54", - u"Oscr;": u"\U0001d4aa", - u"Oslash": u"\xd8", - u"Oslash;": u"\xd8", - u"Otilde": u"\xd5", - u"Otilde;": u"\xd5", - u"Otimes;": u"\u2a37", - u"Ouml": u"\xd6", - u"Ouml;": u"\xd6", - u"OverBar;": u"\u203e", - u"OverBrace;": u"\u23de", - u"OverBracket;": u"\u23b4", - u"OverParenthesis;": u"\u23dc", - u"PartialD;": u"\u2202", - u"Pcy;": u"\u041f", - u"Pfr;": u"\U0001d513", - u"Phi;": u"\u03a6", - u"Pi;": u"\u03a0", - u"PlusMinus;": u"\xb1", - u"Poincareplane;": u"\u210c", - u"Popf;": u"\u2119", - u"Pr;": u"\u2abb", - u"Precedes;": u"\u227a", - u"PrecedesEqual;": u"\u2aaf", - u"PrecedesSlantEqual;": u"\u227c", - u"PrecedesTilde;": u"\u227e", - u"Prime;": u"\u2033", - u"Product;": u"\u220f", - u"Proportion;": u"\u2237", - u"Proportional;": u"\u221d", - u"Pscr;": u"\U0001d4ab", - u"Psi;": u"\u03a8", - u"QUOT": u"\"", - u"QUOT;": u"\"", - u"Qfr;": u"\U0001d514", - u"Qopf;": u"\u211a", - u"Qscr;": u"\U0001d4ac", - u"RBarr;": u"\u2910", - u"REG": u"\xae", - u"REG;": u"\xae", - u"Racute;": u"\u0154", - u"Rang;": u"\u27eb", - u"Rarr;": u"\u21a0", - u"Rarrtl;": u"\u2916", - u"Rcaron;": u"\u0158", - u"Rcedil;": u"\u0156", - u"Rcy;": u"\u0420", - u"Re;": u"\u211c", - u"ReverseElement;": u"\u220b", - u"ReverseEquilibrium;": u"\u21cb", - u"ReverseUpEquilibrium;": u"\u296f", - u"Rfr;": u"\u211c", - u"Rho;": u"\u03a1", - u"RightAngleBracket;": u"\u27e9", - u"RightArrow;": u"\u2192", - u"RightArrowBar;": u"\u21e5", - u"RightArrowLeftArrow;": u"\u21c4", - u"RightCeiling;": u"\u2309", - u"RightDoubleBracket;": u"\u27e7", - u"RightDownTeeVector;": u"\u295d", - u"RightDownVector;": u"\u21c2", - u"RightDownVectorBar;": u"\u2955", - u"RightFloor;": u"\u230b", - u"RightTee;": u"\u22a2", - u"RightTeeArrow;": u"\u21a6", - u"RightTeeVector;": u"\u295b", - u"RightTriangle;": u"\u22b3", - u"RightTriangleBar;": u"\u29d0", - u"RightTriangleEqual;": u"\u22b5", - u"RightUpDownVector;": u"\u294f", - u"RightUpTeeVector;": u"\u295c", - u"RightUpVector;": u"\u21be", - u"RightUpVectorBar;": u"\u2954", - u"RightVector;": u"\u21c0", - u"RightVectorBar;": u"\u2953", - u"Rightarrow;": u"\u21d2", - u"Ropf;": u"\u211d", - u"RoundImplies;": u"\u2970", - u"Rrightarrow;": u"\u21db", - u"Rscr;": u"\u211b", - u"Rsh;": u"\u21b1", - u"RuleDelayed;": u"\u29f4", - u"SHCHcy;": u"\u0429", - u"SHcy;": u"\u0428", - u"SOFTcy;": u"\u042c", - u"Sacute;": u"\u015a", - u"Sc;": u"\u2abc", - u"Scaron;": u"\u0160", - u"Scedil;": u"\u015e", - u"Scirc;": u"\u015c", - u"Scy;": u"\u0421", - u"Sfr;": u"\U0001d516", - u"ShortDownArrow;": u"\u2193", - u"ShortLeftArrow;": u"\u2190", - u"ShortRightArrow;": u"\u2192", - u"ShortUpArrow;": u"\u2191", - u"Sigma;": u"\u03a3", - u"SmallCircle;": u"\u2218", - u"Sopf;": u"\U0001d54a", - u"Sqrt;": u"\u221a", - u"Square;": u"\u25a1", - u"SquareIntersection;": u"\u2293", - u"SquareSubset;": u"\u228f", - u"SquareSubsetEqual;": u"\u2291", - u"SquareSuperset;": u"\u2290", - u"SquareSupersetEqual;": u"\u2292", - u"SquareUnion;": u"\u2294", - u"Sscr;": u"\U0001d4ae", - u"Star;": u"\u22c6", - u"Sub;": u"\u22d0", - u"Subset;": u"\u22d0", - u"SubsetEqual;": u"\u2286", - u"Succeeds;": u"\u227b", - u"SucceedsEqual;": u"\u2ab0", - u"SucceedsSlantEqual;": u"\u227d", - u"SucceedsTilde;": u"\u227f", - u"SuchThat;": u"\u220b", - u"Sum;": u"\u2211", - u"Sup;": u"\u22d1", - u"Superset;": u"\u2283", - u"SupersetEqual;": u"\u2287", - u"Supset;": u"\u22d1", - u"THORN": u"\xde", - u"THORN;": u"\xde", - u"TRADE;": u"\u2122", - u"TSHcy;": u"\u040b", - u"TScy;": u"\u0426", - u"Tab;": u"\t", - u"Tau;": u"\u03a4", - u"Tcaron;": u"\u0164", - u"Tcedil;": u"\u0162", - u"Tcy;": u"\u0422", - u"Tfr;": u"\U0001d517", - u"Therefore;": u"\u2234", - u"Theta;": u"\u0398", - u"ThickSpace;": u"\u205f\u200a", - u"ThinSpace;": u"\u2009", - u"Tilde;": u"\u223c", - u"TildeEqual;": u"\u2243", - u"TildeFullEqual;": u"\u2245", - u"TildeTilde;": u"\u2248", - u"Topf;": u"\U0001d54b", - u"TripleDot;": u"\u20db", - u"Tscr;": u"\U0001d4af", - u"Tstrok;": u"\u0166", - u"Uacute": u"\xda", - u"Uacute;": u"\xda", - u"Uarr;": u"\u219f", - u"Uarrocir;": u"\u2949", - u"Ubrcy;": u"\u040e", - u"Ubreve;": u"\u016c", - u"Ucirc": u"\xdb", - u"Ucirc;": u"\xdb", - u"Ucy;": u"\u0423", - u"Udblac;": u"\u0170", - u"Ufr;": u"\U0001d518", - u"Ugrave": u"\xd9", - u"Ugrave;": u"\xd9", - u"Umacr;": u"\u016a", - u"UnderBar;": u"_", - u"UnderBrace;": u"\u23df", - u"UnderBracket;": u"\u23b5", - u"UnderParenthesis;": u"\u23dd", - u"Union;": u"\u22c3", - u"UnionPlus;": u"\u228e", - u"Uogon;": u"\u0172", - u"Uopf;": u"\U0001d54c", - u"UpArrow;": u"\u2191", - u"UpArrowBar;": u"\u2912", - u"UpArrowDownArrow;": u"\u21c5", - u"UpDownArrow;": u"\u2195", - u"UpEquilibrium;": u"\u296e", - u"UpTee;": u"\u22a5", - u"UpTeeArrow;": u"\u21a5", - u"Uparrow;": u"\u21d1", - u"Updownarrow;": u"\u21d5", - u"UpperLeftArrow;": u"\u2196", - u"UpperRightArrow;": u"\u2197", - u"Upsi;": u"\u03d2", - u"Upsilon;": u"\u03a5", - u"Uring;": u"\u016e", - u"Uscr;": u"\U0001d4b0", - u"Utilde;": u"\u0168", - u"Uuml": u"\xdc", - u"Uuml;": u"\xdc", - u"VDash;": u"\u22ab", - u"Vbar;": u"\u2aeb", - u"Vcy;": u"\u0412", - u"Vdash;": u"\u22a9", - u"Vdashl;": u"\u2ae6", - u"Vee;": u"\u22c1", - u"Verbar;": u"\u2016", - u"Vert;": u"\u2016", - u"VerticalBar;": u"\u2223", - u"VerticalLine;": u"|", - u"VerticalSeparator;": u"\u2758", - u"VerticalTilde;": u"\u2240", - u"VeryThinSpace;": u"\u200a", - u"Vfr;": u"\U0001d519", - u"Vopf;": u"\U0001d54d", - u"Vscr;": u"\U0001d4b1", - u"Vvdash;": u"\u22aa", - u"Wcirc;": u"\u0174", - u"Wedge;": u"\u22c0", - u"Wfr;": u"\U0001d51a", - u"Wopf;": u"\U0001d54e", - u"Wscr;": u"\U0001d4b2", - u"Xfr;": u"\U0001d51b", - u"Xi;": u"\u039e", - u"Xopf;": u"\U0001d54f", - u"Xscr;": u"\U0001d4b3", - u"YAcy;": u"\u042f", - u"YIcy;": u"\u0407", - u"YUcy;": u"\u042e", - u"Yacute": u"\xdd", - u"Yacute;": u"\xdd", - u"Ycirc;": u"\u0176", - u"Ycy;": u"\u042b", - u"Yfr;": u"\U0001d51c", - u"Yopf;": u"\U0001d550", - u"Yscr;": u"\U0001d4b4", - u"Yuml;": u"\u0178", - u"ZHcy;": u"\u0416", - u"Zacute;": u"\u0179", - u"Zcaron;": u"\u017d", - u"Zcy;": u"\u0417", - u"Zdot;": u"\u017b", - u"ZeroWidthSpace;": u"\u200b", - u"Zeta;": u"\u0396", - u"Zfr;": u"\u2128", - u"Zopf;": u"\u2124", - u"Zscr;": u"\U0001d4b5", - u"aacute": u"\xe1", - u"aacute;": u"\xe1", - u"abreve;": u"\u0103", - u"ac;": u"\u223e", - u"acE;": u"\u223e\u0333", - u"acd;": u"\u223f", - u"acirc": u"\xe2", - u"acirc;": u"\xe2", - u"acute": u"\xb4", - u"acute;": u"\xb4", - u"acy;": u"\u0430", - u"aelig": u"\xe6", - u"aelig;": u"\xe6", - u"af;": u"\u2061", - u"afr;": u"\U0001d51e", - u"agrave": u"\xe0", - u"agrave;": u"\xe0", - u"alefsym;": u"\u2135", - u"aleph;": u"\u2135", - u"alpha;": u"\u03b1", - u"amacr;": u"\u0101", - u"amalg;": u"\u2a3f", - u"amp": u"&", - u"amp;": u"&", - u"and;": u"\u2227", - u"andand;": u"\u2a55", - u"andd;": u"\u2a5c", - u"andslope;": u"\u2a58", - u"andv;": u"\u2a5a", - u"ang;": u"\u2220", - u"ange;": u"\u29a4", - u"angle;": u"\u2220", - u"angmsd;": u"\u2221", - u"angmsdaa;": u"\u29a8", - u"angmsdab;": u"\u29a9", - u"angmsdac;": u"\u29aa", - u"angmsdad;": u"\u29ab", - u"angmsdae;": u"\u29ac", - u"angmsdaf;": u"\u29ad", - u"angmsdag;": u"\u29ae", - u"angmsdah;": u"\u29af", - u"angrt;": u"\u221f", - u"angrtvb;": u"\u22be", - u"angrtvbd;": u"\u299d", - u"angsph;": u"\u2222", - u"angst;": u"\xc5", - u"angzarr;": u"\u237c", - u"aogon;": u"\u0105", - u"aopf;": u"\U0001d552", - u"ap;": u"\u2248", - u"apE;": u"\u2a70", - u"apacir;": u"\u2a6f", - u"ape;": u"\u224a", - u"apid;": u"\u224b", - u"apos;": u"'", - u"approx;": u"\u2248", - u"approxeq;": u"\u224a", - u"aring": u"\xe5", - u"aring;": u"\xe5", - u"ascr;": u"\U0001d4b6", - u"ast;": u"*", - u"asymp;": u"\u2248", - u"asympeq;": u"\u224d", - u"atilde": u"\xe3", - u"atilde;": u"\xe3", - u"auml": u"\xe4", - u"auml;": u"\xe4", - u"awconint;": u"\u2233", - u"awint;": u"\u2a11", - u"bNot;": u"\u2aed", - u"backcong;": u"\u224c", - u"backepsilon;": u"\u03f6", - u"backprime;": u"\u2035", - u"backsim;": u"\u223d", - u"backsimeq;": u"\u22cd", - u"barvee;": u"\u22bd", - u"barwed;": u"\u2305", - u"barwedge;": u"\u2305", - u"bbrk;": u"\u23b5", - u"bbrktbrk;": u"\u23b6", - u"bcong;": u"\u224c", - u"bcy;": u"\u0431", - u"bdquo;": u"\u201e", - u"becaus;": u"\u2235", - u"because;": u"\u2235", - u"bemptyv;": u"\u29b0", - u"bepsi;": u"\u03f6", - u"bernou;": u"\u212c", - u"beta;": u"\u03b2", - u"beth;": u"\u2136", - u"between;": u"\u226c", - u"bfr;": u"\U0001d51f", - u"bigcap;": u"\u22c2", - u"bigcirc;": u"\u25ef", - u"bigcup;": u"\u22c3", - u"bigodot;": u"\u2a00", - u"bigoplus;": u"\u2a01", - u"bigotimes;": u"\u2a02", - u"bigsqcup;": u"\u2a06", - u"bigstar;": u"\u2605", - u"bigtriangledown;": u"\u25bd", - u"bigtriangleup;": u"\u25b3", - u"biguplus;": u"\u2a04", - u"bigvee;": u"\u22c1", - u"bigwedge;": u"\u22c0", - u"bkarow;": u"\u290d", - u"blacklozenge;": u"\u29eb", - u"blacksquare;": u"\u25aa", - u"blacktriangle;": u"\u25b4", - u"blacktriangledown;": u"\u25be", - u"blacktriangleleft;": u"\u25c2", - u"blacktriangleright;": u"\u25b8", - u"blank;": u"\u2423", - u"blk12;": u"\u2592", - u"blk14;": u"\u2591", - u"blk34;": u"\u2593", - u"block;": u"\u2588", - u"bne;": u"=\u20e5", - u"bnequiv;": u"\u2261\u20e5", - u"bnot;": u"\u2310", - u"bopf;": u"\U0001d553", - u"bot;": u"\u22a5", - u"bottom;": u"\u22a5", - u"bowtie;": u"\u22c8", - u"boxDL;": u"\u2557", - u"boxDR;": u"\u2554", - u"boxDl;": u"\u2556", - u"boxDr;": u"\u2553", - u"boxH;": u"\u2550", - u"boxHD;": u"\u2566", - u"boxHU;": u"\u2569", - u"boxHd;": u"\u2564", - u"boxHu;": u"\u2567", - u"boxUL;": u"\u255d", - u"boxUR;": u"\u255a", - u"boxUl;": u"\u255c", - u"boxUr;": u"\u2559", - u"boxV;": u"\u2551", - u"boxVH;": u"\u256c", - u"boxVL;": u"\u2563", - u"boxVR;": u"\u2560", - u"boxVh;": u"\u256b", - u"boxVl;": u"\u2562", - u"boxVr;": u"\u255f", - u"boxbox;": u"\u29c9", - u"boxdL;": u"\u2555", - u"boxdR;": u"\u2552", - u"boxdl;": u"\u2510", - u"boxdr;": u"\u250c", - u"boxh;": u"\u2500", - u"boxhD;": u"\u2565", - u"boxhU;": u"\u2568", - u"boxhd;": u"\u252c", - u"boxhu;": u"\u2534", - u"boxminus;": u"\u229f", - u"boxplus;": u"\u229e", - u"boxtimes;": u"\u22a0", - u"boxuL;": u"\u255b", - u"boxuR;": u"\u2558", - u"boxul;": u"\u2518", - u"boxur;": u"\u2514", - u"boxv;": u"\u2502", - u"boxvH;": u"\u256a", - u"boxvL;": u"\u2561", - u"boxvR;": u"\u255e", - u"boxvh;": u"\u253c", - u"boxvl;": u"\u2524", - u"boxvr;": u"\u251c", - u"bprime;": u"\u2035", - u"breve;": u"\u02d8", - u"brvbar": u"\xa6", - u"brvbar;": u"\xa6", - u"bscr;": u"\U0001d4b7", - u"bsemi;": u"\u204f", - u"bsim;": u"\u223d", - u"bsime;": u"\u22cd", - u"bsol;": u"\\", - u"bsolb;": u"\u29c5", - u"bsolhsub;": u"\u27c8", - u"bull;": u"\u2022", - u"bullet;": u"\u2022", - u"bump;": u"\u224e", - u"bumpE;": u"\u2aae", - u"bumpe;": u"\u224f", - u"bumpeq;": u"\u224f", - u"cacute;": u"\u0107", - u"cap;": u"\u2229", - u"capand;": u"\u2a44", - u"capbrcup;": u"\u2a49", - u"capcap;": u"\u2a4b", - u"capcup;": u"\u2a47", - u"capdot;": u"\u2a40", - u"caps;": u"\u2229\ufe00", - u"caret;": u"\u2041", - u"caron;": u"\u02c7", - u"ccaps;": u"\u2a4d", - u"ccaron;": u"\u010d", - u"ccedil": u"\xe7", - u"ccedil;": u"\xe7", - u"ccirc;": u"\u0109", - u"ccups;": u"\u2a4c", - u"ccupssm;": u"\u2a50", - u"cdot;": u"\u010b", - u"cedil": u"\xb8", - u"cedil;": u"\xb8", - u"cemptyv;": u"\u29b2", - u"cent": u"\xa2", - u"cent;": u"\xa2", - u"centerdot;": u"\xb7", - u"cfr;": u"\U0001d520", - u"chcy;": u"\u0447", - u"check;": u"\u2713", - u"checkmark;": u"\u2713", - u"chi;": u"\u03c7", - u"cir;": u"\u25cb", - u"cirE;": u"\u29c3", - u"circ;": u"\u02c6", - u"circeq;": u"\u2257", - u"circlearrowleft;": u"\u21ba", - u"circlearrowright;": u"\u21bb", - u"circledR;": u"\xae", - u"circledS;": u"\u24c8", - u"circledast;": u"\u229b", - u"circledcirc;": u"\u229a", - u"circleddash;": u"\u229d", - u"cire;": u"\u2257", - u"cirfnint;": u"\u2a10", - u"cirmid;": u"\u2aef", - u"cirscir;": u"\u29c2", - u"clubs;": u"\u2663", - u"clubsuit;": u"\u2663", - u"colon;": u":", - u"colone;": u"\u2254", - u"coloneq;": u"\u2254", - u"comma;": u",", - u"commat;": u"@", - u"comp;": u"\u2201", - u"compfn;": u"\u2218", - u"complement;": u"\u2201", - u"complexes;": u"\u2102", - u"cong;": u"\u2245", - u"congdot;": u"\u2a6d", - u"conint;": u"\u222e", - u"copf;": u"\U0001d554", - u"coprod;": u"\u2210", - u"copy": u"\xa9", - u"copy;": u"\xa9", - u"copysr;": u"\u2117", - u"crarr;": u"\u21b5", - u"cross;": u"\u2717", - u"cscr;": u"\U0001d4b8", - u"csub;": u"\u2acf", - u"csube;": u"\u2ad1", - u"csup;": u"\u2ad0", - u"csupe;": u"\u2ad2", - u"ctdot;": u"\u22ef", - u"cudarrl;": u"\u2938", - u"cudarrr;": u"\u2935", - u"cuepr;": u"\u22de", - u"cuesc;": u"\u22df", - u"cularr;": u"\u21b6", - u"cularrp;": u"\u293d", - u"cup;": u"\u222a", - u"cupbrcap;": u"\u2a48", - u"cupcap;": u"\u2a46", - u"cupcup;": u"\u2a4a", - u"cupdot;": u"\u228d", - u"cupor;": u"\u2a45", - u"cups;": u"\u222a\ufe00", - u"curarr;": u"\u21b7", - u"curarrm;": u"\u293c", - u"curlyeqprec;": u"\u22de", - u"curlyeqsucc;": u"\u22df", - u"curlyvee;": u"\u22ce", - u"curlywedge;": u"\u22cf", - u"curren": u"\xa4", - u"curren;": u"\xa4", - u"curvearrowleft;": u"\u21b6", - u"curvearrowright;": u"\u21b7", - u"cuvee;": u"\u22ce", - u"cuwed;": u"\u22cf", - u"cwconint;": u"\u2232", - u"cwint;": u"\u2231", - u"cylcty;": u"\u232d", - u"dArr;": u"\u21d3", - u"dHar;": u"\u2965", - u"dagger;": u"\u2020", - u"daleth;": u"\u2138", - u"darr;": u"\u2193", - u"dash;": u"\u2010", - u"dashv;": u"\u22a3", - u"dbkarow;": u"\u290f", - u"dblac;": u"\u02dd", - u"dcaron;": u"\u010f", - u"dcy;": u"\u0434", - u"dd;": u"\u2146", - u"ddagger;": u"\u2021", - u"ddarr;": u"\u21ca", - u"ddotseq;": u"\u2a77", - u"deg": u"\xb0", - u"deg;": u"\xb0", - u"delta;": u"\u03b4", - u"demptyv;": u"\u29b1", - u"dfisht;": u"\u297f", - u"dfr;": u"\U0001d521", - u"dharl;": u"\u21c3", - u"dharr;": u"\u21c2", - u"diam;": u"\u22c4", - u"diamond;": u"\u22c4", - u"diamondsuit;": u"\u2666", - u"diams;": u"\u2666", - u"die;": u"\xa8", - u"digamma;": u"\u03dd", - u"disin;": u"\u22f2", - u"div;": u"\xf7", - u"divide": u"\xf7", - u"divide;": u"\xf7", - u"divideontimes;": u"\u22c7", - u"divonx;": u"\u22c7", - u"djcy;": u"\u0452", - u"dlcorn;": u"\u231e", - u"dlcrop;": u"\u230d", - u"dollar;": u"$", - u"dopf;": u"\U0001d555", - u"dot;": u"\u02d9", - u"doteq;": u"\u2250", - u"doteqdot;": u"\u2251", - u"dotminus;": u"\u2238", - u"dotplus;": u"\u2214", - u"dotsquare;": u"\u22a1", - u"doublebarwedge;": u"\u2306", - u"downarrow;": u"\u2193", - u"downdownarrows;": u"\u21ca", - u"downharpoonleft;": u"\u21c3", - u"downharpoonright;": u"\u21c2", - u"drbkarow;": u"\u2910", - u"drcorn;": u"\u231f", - u"drcrop;": u"\u230c", - u"dscr;": u"\U0001d4b9", - u"dscy;": u"\u0455", - u"dsol;": u"\u29f6", - u"dstrok;": u"\u0111", - u"dtdot;": u"\u22f1", - u"dtri;": u"\u25bf", - u"dtrif;": u"\u25be", - u"duarr;": u"\u21f5", - u"duhar;": u"\u296f", - u"dwangle;": u"\u29a6", - u"dzcy;": u"\u045f", - u"dzigrarr;": u"\u27ff", - u"eDDot;": u"\u2a77", - u"eDot;": u"\u2251", - u"eacute": u"\xe9", - u"eacute;": u"\xe9", - u"easter;": u"\u2a6e", - u"ecaron;": u"\u011b", - u"ecir;": u"\u2256", - u"ecirc": u"\xea", - u"ecirc;": u"\xea", - u"ecolon;": u"\u2255", - u"ecy;": u"\u044d", - u"edot;": u"\u0117", - u"ee;": u"\u2147", - u"efDot;": u"\u2252", - u"efr;": u"\U0001d522", - u"eg;": u"\u2a9a", - u"egrave": u"\xe8", - u"egrave;": u"\xe8", - u"egs;": u"\u2a96", - u"egsdot;": u"\u2a98", - u"el;": u"\u2a99", - u"elinters;": u"\u23e7", - u"ell;": u"\u2113", - u"els;": u"\u2a95", - u"elsdot;": u"\u2a97", - u"emacr;": u"\u0113", - u"empty;": u"\u2205", - u"emptyset;": u"\u2205", - u"emptyv;": u"\u2205", - u"emsp13;": u"\u2004", - u"emsp14;": u"\u2005", - u"emsp;": u"\u2003", - u"eng;": u"\u014b", - u"ensp;": u"\u2002", - u"eogon;": u"\u0119", - u"eopf;": u"\U0001d556", - u"epar;": u"\u22d5", - u"eparsl;": u"\u29e3", - u"eplus;": u"\u2a71", - u"epsi;": u"\u03b5", - u"epsilon;": u"\u03b5", - u"epsiv;": u"\u03f5", - u"eqcirc;": u"\u2256", - u"eqcolon;": u"\u2255", - u"eqsim;": u"\u2242", - u"eqslantgtr;": u"\u2a96", - u"eqslantless;": u"\u2a95", - u"equals;": u"=", - u"equest;": u"\u225f", - u"equiv;": u"\u2261", - u"equivDD;": u"\u2a78", - u"eqvparsl;": u"\u29e5", - u"erDot;": u"\u2253", - u"erarr;": u"\u2971", - u"escr;": u"\u212f", - u"esdot;": u"\u2250", - u"esim;": u"\u2242", - u"eta;": u"\u03b7", - u"eth": u"\xf0", - u"eth;": u"\xf0", - u"euml": u"\xeb", - u"euml;": u"\xeb", - u"euro;": u"\u20ac", - u"excl;": u"!", - u"exist;": u"\u2203", - u"expectation;": u"\u2130", - u"exponentiale;": u"\u2147", - u"fallingdotseq;": u"\u2252", - u"fcy;": u"\u0444", - u"female;": u"\u2640", - u"ffilig;": u"\ufb03", - u"fflig;": u"\ufb00", - u"ffllig;": u"\ufb04", - u"ffr;": u"\U0001d523", - u"filig;": u"\ufb01", - u"fjlig;": u"fj", - u"flat;": u"\u266d", - u"fllig;": u"\ufb02", - u"fltns;": u"\u25b1", - u"fnof;": u"\u0192", - u"fopf;": u"\U0001d557", - u"forall;": u"\u2200", - u"fork;": u"\u22d4", - u"forkv;": u"\u2ad9", - u"fpartint;": u"\u2a0d", - u"frac12": u"\xbd", - u"frac12;": u"\xbd", - u"frac13;": u"\u2153", - u"frac14": u"\xbc", - u"frac14;": u"\xbc", - u"frac15;": u"\u2155", - u"frac16;": u"\u2159", - u"frac18;": u"\u215b", - u"frac23;": u"\u2154", - u"frac25;": u"\u2156", - u"frac34": u"\xbe", - u"frac34;": u"\xbe", - u"frac35;": u"\u2157", - u"frac38;": u"\u215c", - u"frac45;": u"\u2158", - u"frac56;": u"\u215a", - u"frac58;": u"\u215d", - u"frac78;": u"\u215e", - u"frasl;": u"\u2044", - u"frown;": u"\u2322", - u"fscr;": u"\U0001d4bb", - u"gE;": u"\u2267", - u"gEl;": u"\u2a8c", - u"gacute;": u"\u01f5", - u"gamma;": u"\u03b3", - u"gammad;": u"\u03dd", - u"gap;": u"\u2a86", - u"gbreve;": u"\u011f", - u"gcirc;": u"\u011d", - u"gcy;": u"\u0433", - u"gdot;": u"\u0121", - u"ge;": u"\u2265", - u"gel;": u"\u22db", - u"geq;": u"\u2265", - u"geqq;": u"\u2267", - u"geqslant;": u"\u2a7e", - u"ges;": u"\u2a7e", - u"gescc;": u"\u2aa9", - u"gesdot;": u"\u2a80", - u"gesdoto;": u"\u2a82", - u"gesdotol;": u"\u2a84", - u"gesl;": u"\u22db\ufe00", - u"gesles;": u"\u2a94", - u"gfr;": u"\U0001d524", - u"gg;": u"\u226b", - u"ggg;": u"\u22d9", - u"gimel;": u"\u2137", - u"gjcy;": u"\u0453", - u"gl;": u"\u2277", - u"glE;": u"\u2a92", - u"gla;": u"\u2aa5", - u"glj;": u"\u2aa4", - u"gnE;": u"\u2269", - u"gnap;": u"\u2a8a", - u"gnapprox;": u"\u2a8a", - u"gne;": u"\u2a88", - u"gneq;": u"\u2a88", - u"gneqq;": u"\u2269", - u"gnsim;": u"\u22e7", - u"gopf;": u"\U0001d558", - u"grave;": u"`", - u"gscr;": u"\u210a", - u"gsim;": u"\u2273", - u"gsime;": u"\u2a8e", - u"gsiml;": u"\u2a90", - u"gt": u">", - u"gt;": u">", - u"gtcc;": u"\u2aa7", - u"gtcir;": u"\u2a7a", - u"gtdot;": u"\u22d7", - u"gtlPar;": u"\u2995", - u"gtquest;": u"\u2a7c", - u"gtrapprox;": u"\u2a86", - u"gtrarr;": u"\u2978", - u"gtrdot;": u"\u22d7", - u"gtreqless;": u"\u22db", - u"gtreqqless;": u"\u2a8c", - u"gtrless;": u"\u2277", - u"gtrsim;": u"\u2273", - u"gvertneqq;": u"\u2269\ufe00", - u"gvnE;": u"\u2269\ufe00", - u"hArr;": u"\u21d4", - u"hairsp;": u"\u200a", - u"half;": u"\xbd", - u"hamilt;": u"\u210b", - u"hardcy;": u"\u044a", - u"harr;": u"\u2194", - u"harrcir;": u"\u2948", - u"harrw;": u"\u21ad", - u"hbar;": u"\u210f", - u"hcirc;": u"\u0125", - u"hearts;": u"\u2665", - u"heartsuit;": u"\u2665", - u"hellip;": u"\u2026", - u"hercon;": u"\u22b9", - u"hfr;": u"\U0001d525", - u"hksearow;": u"\u2925", - u"hkswarow;": u"\u2926", - u"hoarr;": u"\u21ff", - u"homtht;": u"\u223b", - u"hookleftarrow;": u"\u21a9", - u"hookrightarrow;": u"\u21aa", - u"hopf;": u"\U0001d559", - u"horbar;": u"\u2015", - u"hscr;": u"\U0001d4bd", - u"hslash;": u"\u210f", - u"hstrok;": u"\u0127", - u"hybull;": u"\u2043", - u"hyphen;": u"\u2010", - u"iacute": u"\xed", - u"iacute;": u"\xed", - u"ic;": u"\u2063", - u"icirc": u"\xee", - u"icirc;": u"\xee", - u"icy;": u"\u0438", - u"iecy;": u"\u0435", - u"iexcl": u"\xa1", - u"iexcl;": u"\xa1", - u"iff;": u"\u21d4", - u"ifr;": u"\U0001d526", - u"igrave": u"\xec", - u"igrave;": u"\xec", - u"ii;": u"\u2148", - u"iiiint;": u"\u2a0c", - u"iiint;": u"\u222d", - u"iinfin;": u"\u29dc", - u"iiota;": u"\u2129", - u"ijlig;": u"\u0133", - u"imacr;": u"\u012b", - u"image;": u"\u2111", - u"imagline;": u"\u2110", - u"imagpart;": u"\u2111", - u"imath;": u"\u0131", - u"imof;": u"\u22b7", - u"imped;": u"\u01b5", - u"in;": u"\u2208", - u"incare;": u"\u2105", - u"infin;": u"\u221e", - u"infintie;": u"\u29dd", - u"inodot;": u"\u0131", - u"int;": u"\u222b", - u"intcal;": u"\u22ba", - u"integers;": u"\u2124", - u"intercal;": u"\u22ba", - u"intlarhk;": u"\u2a17", - u"intprod;": u"\u2a3c", - u"iocy;": u"\u0451", - u"iogon;": u"\u012f", - u"iopf;": u"\U0001d55a", - u"iota;": u"\u03b9", - u"iprod;": u"\u2a3c", - u"iquest": u"\xbf", - u"iquest;": u"\xbf", - u"iscr;": u"\U0001d4be", - u"isin;": u"\u2208", - u"isinE;": u"\u22f9", - u"isindot;": u"\u22f5", - u"isins;": u"\u22f4", - u"isinsv;": u"\u22f3", - u"isinv;": u"\u2208", - u"it;": u"\u2062", - u"itilde;": u"\u0129", - u"iukcy;": u"\u0456", - u"iuml": u"\xef", - u"iuml;": u"\xef", - u"jcirc;": u"\u0135", - u"jcy;": u"\u0439", - u"jfr;": u"\U0001d527", - u"jmath;": u"\u0237", - u"jopf;": u"\U0001d55b", - u"jscr;": u"\U0001d4bf", - u"jsercy;": u"\u0458", - u"jukcy;": u"\u0454", - u"kappa;": u"\u03ba", - u"kappav;": u"\u03f0", - u"kcedil;": u"\u0137", - u"kcy;": u"\u043a", - u"kfr;": u"\U0001d528", - u"kgreen;": u"\u0138", - u"khcy;": u"\u0445", - u"kjcy;": u"\u045c", - u"kopf;": u"\U0001d55c", - u"kscr;": u"\U0001d4c0", - u"lAarr;": u"\u21da", - u"lArr;": u"\u21d0", - u"lAtail;": u"\u291b", - u"lBarr;": u"\u290e", - u"lE;": u"\u2266", - u"lEg;": u"\u2a8b", - u"lHar;": u"\u2962", - u"lacute;": u"\u013a", - u"laemptyv;": u"\u29b4", - u"lagran;": u"\u2112", - u"lambda;": u"\u03bb", - u"lang;": u"\u27e8", - u"langd;": u"\u2991", - u"langle;": u"\u27e8", - u"lap;": u"\u2a85", - u"laquo": u"\xab", - u"laquo;": u"\xab", - u"larr;": u"\u2190", - u"larrb;": u"\u21e4", - u"larrbfs;": u"\u291f", - u"larrfs;": u"\u291d", - u"larrhk;": u"\u21a9", - u"larrlp;": u"\u21ab", - u"larrpl;": u"\u2939", - u"larrsim;": u"\u2973", - u"larrtl;": u"\u21a2", - u"lat;": u"\u2aab", - u"latail;": u"\u2919", - u"late;": u"\u2aad", - u"lates;": u"\u2aad\ufe00", - u"lbarr;": u"\u290c", - u"lbbrk;": u"\u2772", - u"lbrace;": u"{", - u"lbrack;": u"[", - u"lbrke;": u"\u298b", - u"lbrksld;": u"\u298f", - u"lbrkslu;": u"\u298d", - u"lcaron;": u"\u013e", - u"lcedil;": u"\u013c", - u"lceil;": u"\u2308", - u"lcub;": u"{", - u"lcy;": u"\u043b", - u"ldca;": u"\u2936", - u"ldquo;": u"\u201c", - u"ldquor;": u"\u201e", - u"ldrdhar;": u"\u2967", - u"ldrushar;": u"\u294b", - u"ldsh;": u"\u21b2", - u"le;": u"\u2264", - u"leftarrow;": u"\u2190", - u"leftarrowtail;": u"\u21a2", - u"leftharpoondown;": u"\u21bd", - u"leftharpoonup;": u"\u21bc", - u"leftleftarrows;": u"\u21c7", - u"leftrightarrow;": u"\u2194", - u"leftrightarrows;": u"\u21c6", - u"leftrightharpoons;": u"\u21cb", - u"leftrightsquigarrow;": u"\u21ad", - u"leftthreetimes;": u"\u22cb", - u"leg;": u"\u22da", - u"leq;": u"\u2264", - u"leqq;": u"\u2266", - u"leqslant;": u"\u2a7d", - u"les;": u"\u2a7d", - u"lescc;": u"\u2aa8", - u"lesdot;": u"\u2a7f", - u"lesdoto;": u"\u2a81", - u"lesdotor;": u"\u2a83", - u"lesg;": u"\u22da\ufe00", - u"lesges;": u"\u2a93", - u"lessapprox;": u"\u2a85", - u"lessdot;": u"\u22d6", - u"lesseqgtr;": u"\u22da", - u"lesseqqgtr;": u"\u2a8b", - u"lessgtr;": u"\u2276", - u"lesssim;": u"\u2272", - u"lfisht;": u"\u297c", - u"lfloor;": u"\u230a", - u"lfr;": u"\U0001d529", - u"lg;": u"\u2276", - u"lgE;": u"\u2a91", - u"lhard;": u"\u21bd", - u"lharu;": u"\u21bc", - u"lharul;": u"\u296a", - u"lhblk;": u"\u2584", - u"ljcy;": u"\u0459", - u"ll;": u"\u226a", - u"llarr;": u"\u21c7", - u"llcorner;": u"\u231e", - u"llhard;": u"\u296b", - u"lltri;": u"\u25fa", - u"lmidot;": u"\u0140", - u"lmoust;": u"\u23b0", - u"lmoustache;": u"\u23b0", - u"lnE;": u"\u2268", - u"lnap;": u"\u2a89", - u"lnapprox;": u"\u2a89", - u"lne;": u"\u2a87", - u"lneq;": u"\u2a87", - u"lneqq;": u"\u2268", - u"lnsim;": u"\u22e6", - u"loang;": u"\u27ec", - u"loarr;": u"\u21fd", - u"lobrk;": u"\u27e6", - u"longleftarrow;": u"\u27f5", - u"longleftrightarrow;": u"\u27f7", - u"longmapsto;": u"\u27fc", - u"longrightarrow;": u"\u27f6", - u"looparrowleft;": u"\u21ab", - u"looparrowright;": u"\u21ac", - u"lopar;": u"\u2985", - u"lopf;": u"\U0001d55d", - u"loplus;": u"\u2a2d", - u"lotimes;": u"\u2a34", - u"lowast;": u"\u2217", - u"lowbar;": u"_", - u"loz;": u"\u25ca", - u"lozenge;": u"\u25ca", - u"lozf;": u"\u29eb", - u"lpar;": u"(", - u"lparlt;": u"\u2993", - u"lrarr;": u"\u21c6", - u"lrcorner;": u"\u231f", - u"lrhar;": u"\u21cb", - u"lrhard;": u"\u296d", - u"lrm;": u"\u200e", - u"lrtri;": u"\u22bf", - u"lsaquo;": u"\u2039", - u"lscr;": u"\U0001d4c1", - u"lsh;": u"\u21b0", - u"lsim;": u"\u2272", - u"lsime;": u"\u2a8d", - u"lsimg;": u"\u2a8f", - u"lsqb;": u"[", - u"lsquo;": u"\u2018", - u"lsquor;": u"\u201a", - u"lstrok;": u"\u0142", - u"lt": u"<", - u"lt;": u"<", - u"ltcc;": u"\u2aa6", - u"ltcir;": u"\u2a79", - u"ltdot;": u"\u22d6", - u"lthree;": u"\u22cb", - u"ltimes;": u"\u22c9", - u"ltlarr;": u"\u2976", - u"ltquest;": u"\u2a7b", - u"ltrPar;": u"\u2996", - u"ltri;": u"\u25c3", - u"ltrie;": u"\u22b4", - u"ltrif;": u"\u25c2", - u"lurdshar;": u"\u294a", - u"luruhar;": u"\u2966", - u"lvertneqq;": u"\u2268\ufe00", - u"lvnE;": u"\u2268\ufe00", - u"mDDot;": u"\u223a", - u"macr": u"\xaf", - u"macr;": u"\xaf", - u"male;": u"\u2642", - u"malt;": u"\u2720", - u"maltese;": u"\u2720", - u"map;": u"\u21a6", - u"mapsto;": u"\u21a6", - u"mapstodown;": u"\u21a7", - u"mapstoleft;": u"\u21a4", - u"mapstoup;": u"\u21a5", - u"marker;": u"\u25ae", - u"mcomma;": u"\u2a29", - u"mcy;": u"\u043c", - u"mdash;": u"\u2014", - u"measuredangle;": u"\u2221", - u"mfr;": u"\U0001d52a", - u"mho;": u"\u2127", - u"micro": u"\xb5", - u"micro;": u"\xb5", - u"mid;": u"\u2223", - u"midast;": u"*", - u"midcir;": u"\u2af0", - u"middot": u"\xb7", - u"middot;": u"\xb7", - u"minus;": u"\u2212", - u"minusb;": u"\u229f", - u"minusd;": u"\u2238", - u"minusdu;": u"\u2a2a", - u"mlcp;": u"\u2adb", - u"mldr;": u"\u2026", - u"mnplus;": u"\u2213", - u"models;": u"\u22a7", - u"mopf;": u"\U0001d55e", - u"mp;": u"\u2213", - u"mscr;": u"\U0001d4c2", - u"mstpos;": u"\u223e", - u"mu;": u"\u03bc", - u"multimap;": u"\u22b8", - u"mumap;": u"\u22b8", - u"nGg;": u"\u22d9\u0338", - u"nGt;": u"\u226b\u20d2", - u"nGtv;": u"\u226b\u0338", - u"nLeftarrow;": u"\u21cd", - u"nLeftrightarrow;": u"\u21ce", - u"nLl;": u"\u22d8\u0338", - u"nLt;": u"\u226a\u20d2", - u"nLtv;": u"\u226a\u0338", - u"nRightarrow;": u"\u21cf", - u"nVDash;": u"\u22af", - u"nVdash;": u"\u22ae", - u"nabla;": u"\u2207", - u"nacute;": u"\u0144", - u"nang;": u"\u2220\u20d2", - u"nap;": u"\u2249", - u"napE;": u"\u2a70\u0338", - u"napid;": u"\u224b\u0338", - u"napos;": u"\u0149", - u"napprox;": u"\u2249", - u"natur;": u"\u266e", - u"natural;": u"\u266e", - u"naturals;": u"\u2115", - u"nbsp": u"\xa0", - u"nbsp;": u"\xa0", - u"nbump;": u"\u224e\u0338", - u"nbumpe;": u"\u224f\u0338", - u"ncap;": u"\u2a43", - u"ncaron;": u"\u0148", - u"ncedil;": u"\u0146", - u"ncong;": u"\u2247", - u"ncongdot;": u"\u2a6d\u0338", - u"ncup;": u"\u2a42", - u"ncy;": u"\u043d", - u"ndash;": u"\u2013", - u"ne;": u"\u2260", - u"neArr;": u"\u21d7", - u"nearhk;": u"\u2924", - u"nearr;": u"\u2197", - u"nearrow;": u"\u2197", - u"nedot;": u"\u2250\u0338", - u"nequiv;": u"\u2262", - u"nesear;": u"\u2928", - u"nesim;": u"\u2242\u0338", - u"nexist;": u"\u2204", - u"nexists;": u"\u2204", - u"nfr;": u"\U0001d52b", - u"ngE;": u"\u2267\u0338", - u"nge;": u"\u2271", - u"ngeq;": u"\u2271", - u"ngeqq;": u"\u2267\u0338", - u"ngeqslant;": u"\u2a7e\u0338", - u"nges;": u"\u2a7e\u0338", - u"ngsim;": u"\u2275", - u"ngt;": u"\u226f", - u"ngtr;": u"\u226f", - u"nhArr;": u"\u21ce", - u"nharr;": u"\u21ae", - u"nhpar;": u"\u2af2", - u"ni;": u"\u220b", - u"nis;": u"\u22fc", - u"nisd;": u"\u22fa", - u"niv;": u"\u220b", - u"njcy;": u"\u045a", - u"nlArr;": u"\u21cd", - u"nlE;": u"\u2266\u0338", - u"nlarr;": u"\u219a", - u"nldr;": u"\u2025", - u"nle;": u"\u2270", - u"nleftarrow;": u"\u219a", - u"nleftrightarrow;": u"\u21ae", - u"nleq;": u"\u2270", - u"nleqq;": u"\u2266\u0338", - u"nleqslant;": u"\u2a7d\u0338", - u"nles;": u"\u2a7d\u0338", - u"nless;": u"\u226e", - u"nlsim;": u"\u2274", - u"nlt;": u"\u226e", - u"nltri;": u"\u22ea", - u"nltrie;": u"\u22ec", - u"nmid;": u"\u2224", - u"nopf;": u"\U0001d55f", - u"not": u"\xac", - u"not;": u"\xac", - u"notin;": u"\u2209", - u"notinE;": u"\u22f9\u0338", - u"notindot;": u"\u22f5\u0338", - u"notinva;": u"\u2209", - u"notinvb;": u"\u22f7", - u"notinvc;": u"\u22f6", - u"notni;": u"\u220c", - u"notniva;": u"\u220c", - u"notnivb;": u"\u22fe", - u"notnivc;": u"\u22fd", - u"npar;": u"\u2226", - u"nparallel;": u"\u2226", - u"nparsl;": u"\u2afd\u20e5", - u"npart;": u"\u2202\u0338", - u"npolint;": u"\u2a14", - u"npr;": u"\u2280", - u"nprcue;": u"\u22e0", - u"npre;": u"\u2aaf\u0338", - u"nprec;": u"\u2280", - u"npreceq;": u"\u2aaf\u0338", - u"nrArr;": u"\u21cf", - u"nrarr;": u"\u219b", - u"nrarrc;": u"\u2933\u0338", - u"nrarrw;": u"\u219d\u0338", - u"nrightarrow;": u"\u219b", - u"nrtri;": u"\u22eb", - u"nrtrie;": u"\u22ed", - u"nsc;": u"\u2281", - u"nsccue;": u"\u22e1", - u"nsce;": u"\u2ab0\u0338", - u"nscr;": u"\U0001d4c3", - u"nshortmid;": u"\u2224", - u"nshortparallel;": u"\u2226", - u"nsim;": u"\u2241", - u"nsime;": u"\u2244", - u"nsimeq;": u"\u2244", - u"nsmid;": u"\u2224", - u"nspar;": u"\u2226", - u"nsqsube;": u"\u22e2", - u"nsqsupe;": u"\u22e3", - u"nsub;": u"\u2284", - u"nsubE;": u"\u2ac5\u0338", - u"nsube;": u"\u2288", - u"nsubset;": u"\u2282\u20d2", - u"nsubseteq;": u"\u2288", - u"nsubseteqq;": u"\u2ac5\u0338", - u"nsucc;": u"\u2281", - u"nsucceq;": u"\u2ab0\u0338", - u"nsup;": u"\u2285", - u"nsupE;": u"\u2ac6\u0338", - u"nsupe;": u"\u2289", - u"nsupset;": u"\u2283\u20d2", - u"nsupseteq;": u"\u2289", - u"nsupseteqq;": u"\u2ac6\u0338", - u"ntgl;": u"\u2279", - u"ntilde": u"\xf1", - u"ntilde;": u"\xf1", - u"ntlg;": u"\u2278", - u"ntriangleleft;": u"\u22ea", - u"ntrianglelefteq;": u"\u22ec", - u"ntriangleright;": u"\u22eb", - u"ntrianglerighteq;": u"\u22ed", - u"nu;": u"\u03bd", - u"num;": u"#", - u"numero;": u"\u2116", - u"numsp;": u"\u2007", - u"nvDash;": u"\u22ad", - u"nvHarr;": u"\u2904", - u"nvap;": u"\u224d\u20d2", - u"nvdash;": u"\u22ac", - u"nvge;": u"\u2265\u20d2", - u"nvgt;": u">\u20d2", - u"nvinfin;": u"\u29de", - u"nvlArr;": u"\u2902", - u"nvle;": u"\u2264\u20d2", - u"nvlt;": u"<\u20d2", - u"nvltrie;": u"\u22b4\u20d2", - u"nvrArr;": u"\u2903", - u"nvrtrie;": u"\u22b5\u20d2", - u"nvsim;": u"\u223c\u20d2", - u"nwArr;": u"\u21d6", - u"nwarhk;": u"\u2923", - u"nwarr;": u"\u2196", - u"nwarrow;": u"\u2196", - u"nwnear;": u"\u2927", - u"oS;": u"\u24c8", - u"oacute": u"\xf3", - u"oacute;": u"\xf3", - u"oast;": u"\u229b", - u"ocir;": u"\u229a", - u"ocirc": u"\xf4", - u"ocirc;": u"\xf4", - u"ocy;": u"\u043e", - u"odash;": u"\u229d", - u"odblac;": u"\u0151", - u"odiv;": u"\u2a38", - u"odot;": u"\u2299", - u"odsold;": u"\u29bc", - u"oelig;": u"\u0153", - u"ofcir;": u"\u29bf", - u"ofr;": u"\U0001d52c", - u"ogon;": u"\u02db", - u"ograve": u"\xf2", - u"ograve;": u"\xf2", - u"ogt;": u"\u29c1", - u"ohbar;": u"\u29b5", - u"ohm;": u"\u03a9", - u"oint;": u"\u222e", - u"olarr;": u"\u21ba", - u"olcir;": u"\u29be", - u"olcross;": u"\u29bb", - u"oline;": u"\u203e", - u"olt;": u"\u29c0", - u"omacr;": u"\u014d", - u"omega;": u"\u03c9", - u"omicron;": u"\u03bf", - u"omid;": u"\u29b6", - u"ominus;": u"\u2296", - u"oopf;": u"\U0001d560", - u"opar;": u"\u29b7", - u"operp;": u"\u29b9", - u"oplus;": u"\u2295", - u"or;": u"\u2228", - u"orarr;": u"\u21bb", - u"ord;": u"\u2a5d", - u"order;": u"\u2134", - u"orderof;": u"\u2134", - u"ordf": u"\xaa", - u"ordf;": u"\xaa", - u"ordm": u"\xba", - u"ordm;": u"\xba", - u"origof;": u"\u22b6", - u"oror;": u"\u2a56", - u"orslope;": u"\u2a57", - u"orv;": u"\u2a5b", - u"oscr;": u"\u2134", - u"oslash": u"\xf8", - u"oslash;": u"\xf8", - u"osol;": u"\u2298", - u"otilde": u"\xf5", - u"otilde;": u"\xf5", - u"otimes;": u"\u2297", - u"otimesas;": u"\u2a36", - u"ouml": u"\xf6", - u"ouml;": u"\xf6", - u"ovbar;": u"\u233d", - u"par;": u"\u2225", - u"para": u"\xb6", - u"para;": u"\xb6", - u"parallel;": u"\u2225", - u"parsim;": u"\u2af3", - u"parsl;": u"\u2afd", - u"part;": u"\u2202", - u"pcy;": u"\u043f", - u"percnt;": u"%", - u"period;": u".", - u"permil;": u"\u2030", - u"perp;": u"\u22a5", - u"pertenk;": u"\u2031", - u"pfr;": u"\U0001d52d", - u"phi;": u"\u03c6", - u"phiv;": u"\u03d5", - u"phmmat;": u"\u2133", - u"phone;": u"\u260e", - u"pi;": u"\u03c0", - u"pitchfork;": u"\u22d4", - u"piv;": u"\u03d6", - u"planck;": u"\u210f", - u"planckh;": u"\u210e", - u"plankv;": u"\u210f", - u"plus;": u"+", - u"plusacir;": u"\u2a23", - u"plusb;": u"\u229e", - u"pluscir;": u"\u2a22", - u"plusdo;": u"\u2214", - u"plusdu;": u"\u2a25", - u"pluse;": u"\u2a72", - u"plusmn": u"\xb1", - u"plusmn;": u"\xb1", - u"plussim;": u"\u2a26", - u"plustwo;": u"\u2a27", - u"pm;": u"\xb1", - u"pointint;": u"\u2a15", - u"popf;": u"\U0001d561", - u"pound": u"\xa3", - u"pound;": u"\xa3", - u"pr;": u"\u227a", - u"prE;": u"\u2ab3", - u"prap;": u"\u2ab7", - u"prcue;": u"\u227c", - u"pre;": u"\u2aaf", - u"prec;": u"\u227a", - u"precapprox;": u"\u2ab7", - u"preccurlyeq;": u"\u227c", - u"preceq;": u"\u2aaf", - u"precnapprox;": u"\u2ab9", - u"precneqq;": u"\u2ab5", - u"precnsim;": u"\u22e8", - u"precsim;": u"\u227e", - u"prime;": u"\u2032", - u"primes;": u"\u2119", - u"prnE;": u"\u2ab5", - u"prnap;": u"\u2ab9", - u"prnsim;": u"\u22e8", - u"prod;": u"\u220f", - u"profalar;": u"\u232e", - u"profline;": u"\u2312", - u"profsurf;": u"\u2313", - u"prop;": u"\u221d", - u"propto;": u"\u221d", - u"prsim;": u"\u227e", - u"prurel;": u"\u22b0", - u"pscr;": u"\U0001d4c5", - u"psi;": u"\u03c8", - u"puncsp;": u"\u2008", - u"qfr;": u"\U0001d52e", - u"qint;": u"\u2a0c", - u"qopf;": u"\U0001d562", - u"qprime;": u"\u2057", - u"qscr;": u"\U0001d4c6", - u"quaternions;": u"\u210d", - u"quatint;": u"\u2a16", - u"quest;": u"?", - u"questeq;": u"\u225f", - u"quot": u"\"", - u"quot;": u"\"", - u"rAarr;": u"\u21db", - u"rArr;": u"\u21d2", - u"rAtail;": u"\u291c", - u"rBarr;": u"\u290f", - u"rHar;": u"\u2964", - u"race;": u"\u223d\u0331", - u"racute;": u"\u0155", - u"radic;": u"\u221a", - u"raemptyv;": u"\u29b3", - u"rang;": u"\u27e9", - u"rangd;": u"\u2992", - u"range;": u"\u29a5", - u"rangle;": u"\u27e9", - u"raquo": u"\xbb", - u"raquo;": u"\xbb", - u"rarr;": u"\u2192", - u"rarrap;": u"\u2975", - u"rarrb;": u"\u21e5", - u"rarrbfs;": u"\u2920", - u"rarrc;": u"\u2933", - u"rarrfs;": u"\u291e", - u"rarrhk;": u"\u21aa", - u"rarrlp;": u"\u21ac", - u"rarrpl;": u"\u2945", - u"rarrsim;": u"\u2974", - u"rarrtl;": u"\u21a3", - u"rarrw;": u"\u219d", - u"ratail;": u"\u291a", - u"ratio;": u"\u2236", - u"rationals;": u"\u211a", - u"rbarr;": u"\u290d", - u"rbbrk;": u"\u2773", - u"rbrace;": u"}", - u"rbrack;": u"]", - u"rbrke;": u"\u298c", - u"rbrksld;": u"\u298e", - u"rbrkslu;": u"\u2990", - u"rcaron;": u"\u0159", - u"rcedil;": u"\u0157", - u"rceil;": u"\u2309", - u"rcub;": u"}", - u"rcy;": u"\u0440", - u"rdca;": u"\u2937", - u"rdldhar;": u"\u2969", - u"rdquo;": u"\u201d", - u"rdquor;": u"\u201d", - u"rdsh;": u"\u21b3", - u"real;": u"\u211c", - u"realine;": u"\u211b", - u"realpart;": u"\u211c", - u"reals;": u"\u211d", - u"rect;": u"\u25ad", - u"reg": u"\xae", - u"reg;": u"\xae", - u"rfisht;": u"\u297d", - u"rfloor;": u"\u230b", - u"rfr;": u"\U0001d52f", - u"rhard;": u"\u21c1", - u"rharu;": u"\u21c0", - u"rharul;": u"\u296c", - u"rho;": u"\u03c1", - u"rhov;": u"\u03f1", - u"rightarrow;": u"\u2192", - u"rightarrowtail;": u"\u21a3", - u"rightharpoondown;": u"\u21c1", - u"rightharpoonup;": u"\u21c0", - u"rightleftarrows;": u"\u21c4", - u"rightleftharpoons;": u"\u21cc", - u"rightrightarrows;": u"\u21c9", - u"rightsquigarrow;": u"\u219d", - u"rightthreetimes;": u"\u22cc", - u"ring;": u"\u02da", - u"risingdotseq;": u"\u2253", - u"rlarr;": u"\u21c4", - u"rlhar;": u"\u21cc", - u"rlm;": u"\u200f", - u"rmoust;": u"\u23b1", - u"rmoustache;": u"\u23b1", - u"rnmid;": u"\u2aee", - u"roang;": u"\u27ed", - u"roarr;": u"\u21fe", - u"robrk;": u"\u27e7", - u"ropar;": u"\u2986", - u"ropf;": u"\U0001d563", - u"roplus;": u"\u2a2e", - u"rotimes;": u"\u2a35", - u"rpar;": u")", - u"rpargt;": u"\u2994", - u"rppolint;": u"\u2a12", - u"rrarr;": u"\u21c9", - u"rsaquo;": u"\u203a", - u"rscr;": u"\U0001d4c7", - u"rsh;": u"\u21b1", - u"rsqb;": u"]", - u"rsquo;": u"\u2019", - u"rsquor;": u"\u2019", - u"rthree;": u"\u22cc", - u"rtimes;": u"\u22ca", - u"rtri;": u"\u25b9", - u"rtrie;": u"\u22b5", - u"rtrif;": u"\u25b8", - u"rtriltri;": u"\u29ce", - u"ruluhar;": u"\u2968", - u"rx;": u"\u211e", - u"sacute;": u"\u015b", - u"sbquo;": u"\u201a", - u"sc;": u"\u227b", - u"scE;": u"\u2ab4", - u"scap;": u"\u2ab8", - u"scaron;": u"\u0161", - u"sccue;": u"\u227d", - u"sce;": u"\u2ab0", - u"scedil;": u"\u015f", - u"scirc;": u"\u015d", - u"scnE;": u"\u2ab6", - u"scnap;": u"\u2aba", - u"scnsim;": u"\u22e9", - u"scpolint;": u"\u2a13", - u"scsim;": u"\u227f", - u"scy;": u"\u0441", - u"sdot;": u"\u22c5", - u"sdotb;": u"\u22a1", - u"sdote;": u"\u2a66", - u"seArr;": u"\u21d8", - u"searhk;": u"\u2925", - u"searr;": u"\u2198", - u"searrow;": u"\u2198", - u"sect": u"\xa7", - u"sect;": u"\xa7", - u"semi;": u";", - u"seswar;": u"\u2929", - u"setminus;": u"\u2216", - u"setmn;": u"\u2216", - u"sext;": u"\u2736", - u"sfr;": u"\U0001d530", - u"sfrown;": u"\u2322", - u"sharp;": u"\u266f", - u"shchcy;": u"\u0449", - u"shcy;": u"\u0448", - u"shortmid;": u"\u2223", - u"shortparallel;": u"\u2225", - u"shy": u"\xad", - u"shy;": u"\xad", - u"sigma;": u"\u03c3", - u"sigmaf;": u"\u03c2", - u"sigmav;": u"\u03c2", - u"sim;": u"\u223c", - u"simdot;": u"\u2a6a", - u"sime;": u"\u2243", - u"simeq;": u"\u2243", - u"simg;": u"\u2a9e", - u"simgE;": u"\u2aa0", - u"siml;": u"\u2a9d", - u"simlE;": u"\u2a9f", - u"simne;": u"\u2246", - u"simplus;": u"\u2a24", - u"simrarr;": u"\u2972", - u"slarr;": u"\u2190", - u"smallsetminus;": u"\u2216", - u"smashp;": u"\u2a33", - u"smeparsl;": u"\u29e4", - u"smid;": u"\u2223", - u"smile;": u"\u2323", - u"smt;": u"\u2aaa", - u"smte;": u"\u2aac", - u"smtes;": u"\u2aac\ufe00", - u"softcy;": u"\u044c", - u"sol;": u"/", - u"solb;": u"\u29c4", - u"solbar;": u"\u233f", - u"sopf;": u"\U0001d564", - u"spades;": u"\u2660", - u"spadesuit;": u"\u2660", - u"spar;": u"\u2225", - u"sqcap;": u"\u2293", - u"sqcaps;": u"\u2293\ufe00", - u"sqcup;": u"\u2294", - u"sqcups;": u"\u2294\ufe00", - u"sqsub;": u"\u228f", - u"sqsube;": u"\u2291", - u"sqsubset;": u"\u228f", - u"sqsubseteq;": u"\u2291", - u"sqsup;": u"\u2290", - u"sqsupe;": u"\u2292", - u"sqsupset;": u"\u2290", - u"sqsupseteq;": u"\u2292", - u"squ;": u"\u25a1", - u"square;": u"\u25a1", - u"squarf;": u"\u25aa", - u"squf;": u"\u25aa", - u"srarr;": u"\u2192", - u"sscr;": u"\U0001d4c8", - u"ssetmn;": u"\u2216", - u"ssmile;": u"\u2323", - u"sstarf;": u"\u22c6", - u"star;": u"\u2606", - u"starf;": u"\u2605", - u"straightepsilon;": u"\u03f5", - u"straightphi;": u"\u03d5", - u"strns;": u"\xaf", - u"sub;": u"\u2282", - u"subE;": u"\u2ac5", - u"subdot;": u"\u2abd", - u"sube;": u"\u2286", - u"subedot;": u"\u2ac3", - u"submult;": u"\u2ac1", - u"subnE;": u"\u2acb", - u"subne;": u"\u228a", - u"subplus;": u"\u2abf", - u"subrarr;": u"\u2979", - u"subset;": u"\u2282", - u"subseteq;": u"\u2286", - u"subseteqq;": u"\u2ac5", - u"subsetneq;": u"\u228a", - u"subsetneqq;": u"\u2acb", - u"subsim;": u"\u2ac7", - u"subsub;": u"\u2ad5", - u"subsup;": u"\u2ad3", - u"succ;": u"\u227b", - u"succapprox;": u"\u2ab8", - u"succcurlyeq;": u"\u227d", - u"succeq;": u"\u2ab0", - u"succnapprox;": u"\u2aba", - u"succneqq;": u"\u2ab6", - u"succnsim;": u"\u22e9", - u"succsim;": u"\u227f", - u"sum;": u"\u2211", - u"sung;": u"\u266a", - u"sup1": u"\xb9", - u"sup1;": u"\xb9", - u"sup2": u"\xb2", - u"sup2;": u"\xb2", - u"sup3": u"\xb3", - u"sup3;": u"\xb3", - u"sup;": u"\u2283", - u"supE;": u"\u2ac6", - u"supdot;": u"\u2abe", - u"supdsub;": u"\u2ad8", - u"supe;": u"\u2287", - u"supedot;": u"\u2ac4", - u"suphsol;": u"\u27c9", - u"suphsub;": u"\u2ad7", - u"suplarr;": u"\u297b", - u"supmult;": u"\u2ac2", - u"supnE;": u"\u2acc", - u"supne;": u"\u228b", - u"supplus;": u"\u2ac0", - u"supset;": u"\u2283", - u"supseteq;": u"\u2287", - u"supseteqq;": u"\u2ac6", - u"supsetneq;": u"\u228b", - u"supsetneqq;": u"\u2acc", - u"supsim;": u"\u2ac8", - u"supsub;": u"\u2ad4", - u"supsup;": u"\u2ad6", - u"swArr;": u"\u21d9", - u"swarhk;": u"\u2926", - u"swarr;": u"\u2199", - u"swarrow;": u"\u2199", - u"swnwar;": u"\u292a", - u"szlig": u"\xdf", - u"szlig;": u"\xdf", - u"target;": u"\u2316", - u"tau;": u"\u03c4", - u"tbrk;": u"\u23b4", - u"tcaron;": u"\u0165", - u"tcedil;": u"\u0163", - u"tcy;": u"\u0442", - u"tdot;": u"\u20db", - u"telrec;": u"\u2315", - u"tfr;": u"\U0001d531", - u"there4;": u"\u2234", - u"therefore;": u"\u2234", - u"theta;": u"\u03b8", - u"thetasym;": u"\u03d1", - u"thetav;": u"\u03d1", - u"thickapprox;": u"\u2248", - u"thicksim;": u"\u223c", - u"thinsp;": u"\u2009", - u"thkap;": u"\u2248", - u"thksim;": u"\u223c", - u"thorn": u"\xfe", - u"thorn;": u"\xfe", - u"tilde;": u"\u02dc", - u"times": u"\xd7", - u"times;": u"\xd7", - u"timesb;": u"\u22a0", - u"timesbar;": u"\u2a31", - u"timesd;": u"\u2a30", - u"tint;": u"\u222d", - u"toea;": u"\u2928", - u"top;": u"\u22a4", - u"topbot;": u"\u2336", - u"topcir;": u"\u2af1", - u"topf;": u"\U0001d565", - u"topfork;": u"\u2ada", - u"tosa;": u"\u2929", - u"tprime;": u"\u2034", - u"trade;": u"\u2122", - u"triangle;": u"\u25b5", - u"triangledown;": u"\u25bf", - u"triangleleft;": u"\u25c3", - u"trianglelefteq;": u"\u22b4", - u"triangleq;": u"\u225c", - u"triangleright;": u"\u25b9", - u"trianglerighteq;": u"\u22b5", - u"tridot;": u"\u25ec", - u"trie;": u"\u225c", - u"triminus;": u"\u2a3a", - u"triplus;": u"\u2a39", - u"trisb;": u"\u29cd", - u"tritime;": u"\u2a3b", - u"trpezium;": u"\u23e2", - u"tscr;": u"\U0001d4c9", - u"tscy;": u"\u0446", - u"tshcy;": u"\u045b", - u"tstrok;": u"\u0167", - u"twixt;": u"\u226c", - u"twoheadleftarrow;": u"\u219e", - u"twoheadrightarrow;": u"\u21a0", - u"uArr;": u"\u21d1", - u"uHar;": u"\u2963", - u"uacute": u"\xfa", - u"uacute;": u"\xfa", - u"uarr;": u"\u2191", - u"ubrcy;": u"\u045e", - u"ubreve;": u"\u016d", - u"ucirc": u"\xfb", - u"ucirc;": u"\xfb", - u"ucy;": u"\u0443", - u"udarr;": u"\u21c5", - u"udblac;": u"\u0171", - u"udhar;": u"\u296e", - u"ufisht;": u"\u297e", - u"ufr;": u"\U0001d532", - u"ugrave": u"\xf9", - u"ugrave;": u"\xf9", - u"uharl;": u"\u21bf", - u"uharr;": u"\u21be", - u"uhblk;": u"\u2580", - u"ulcorn;": u"\u231c", - u"ulcorner;": u"\u231c", - u"ulcrop;": u"\u230f", - u"ultri;": u"\u25f8", - u"umacr;": u"\u016b", - u"uml": u"\xa8", - u"uml;": u"\xa8", - u"uogon;": u"\u0173", - u"uopf;": u"\U0001d566", - u"uparrow;": u"\u2191", - u"updownarrow;": u"\u2195", - u"upharpoonleft;": u"\u21bf", - u"upharpoonright;": u"\u21be", - u"uplus;": u"\u228e", - u"upsi;": u"\u03c5", - u"upsih;": u"\u03d2", - u"upsilon;": u"\u03c5", - u"upuparrows;": u"\u21c8", - u"urcorn;": u"\u231d", - u"urcorner;": u"\u231d", - u"urcrop;": u"\u230e", - u"uring;": u"\u016f", - u"urtri;": u"\u25f9", - u"uscr;": u"\U0001d4ca", - u"utdot;": u"\u22f0", - u"utilde;": u"\u0169", - u"utri;": u"\u25b5", - u"utrif;": u"\u25b4", - u"uuarr;": u"\u21c8", - u"uuml": u"\xfc", - u"uuml;": u"\xfc", - u"uwangle;": u"\u29a7", - u"vArr;": u"\u21d5", - u"vBar;": u"\u2ae8", - u"vBarv;": u"\u2ae9", - u"vDash;": u"\u22a8", - u"vangrt;": u"\u299c", - u"varepsilon;": u"\u03f5", - u"varkappa;": u"\u03f0", - u"varnothing;": u"\u2205", - u"varphi;": u"\u03d5", - u"varpi;": u"\u03d6", - u"varpropto;": u"\u221d", - u"varr;": u"\u2195", - u"varrho;": u"\u03f1", - u"varsigma;": u"\u03c2", - u"varsubsetneq;": u"\u228a\ufe00", - u"varsubsetneqq;": u"\u2acb\ufe00", - u"varsupsetneq;": u"\u228b\ufe00", - u"varsupsetneqq;": u"\u2acc\ufe00", - u"vartheta;": u"\u03d1", - u"vartriangleleft;": u"\u22b2", - u"vartriangleright;": u"\u22b3", - u"vcy;": u"\u0432", - u"vdash;": u"\u22a2", - u"vee;": u"\u2228", - u"veebar;": u"\u22bb", - u"veeeq;": u"\u225a", - u"vellip;": u"\u22ee", - u"verbar;": u"|", - u"vert;": u"|", - u"vfr;": u"\U0001d533", - u"vltri;": u"\u22b2", - u"vnsub;": u"\u2282\u20d2", - u"vnsup;": u"\u2283\u20d2", - u"vopf;": u"\U0001d567", - u"vprop;": u"\u221d", - u"vrtri;": u"\u22b3", - u"vscr;": u"\U0001d4cb", - u"vsubnE;": u"\u2acb\ufe00", - u"vsubne;": u"\u228a\ufe00", - u"vsupnE;": u"\u2acc\ufe00", - u"vsupne;": u"\u228b\ufe00", - u"vzigzag;": u"\u299a", - u"wcirc;": u"\u0175", - u"wedbar;": u"\u2a5f", - u"wedge;": u"\u2227", - u"wedgeq;": u"\u2259", - u"weierp;": u"\u2118", - u"wfr;": u"\U0001d534", - u"wopf;": u"\U0001d568", - u"wp;": u"\u2118", - u"wr;": u"\u2240", - u"wreath;": u"\u2240", - u"wscr;": u"\U0001d4cc", - u"xcap;": u"\u22c2", - u"xcirc;": u"\u25ef", - u"xcup;": u"\u22c3", - u"xdtri;": u"\u25bd", - u"xfr;": u"\U0001d535", - u"xhArr;": u"\u27fa", - u"xharr;": u"\u27f7", - u"xi;": u"\u03be", - u"xlArr;": u"\u27f8", - u"xlarr;": u"\u27f5", - u"xmap;": u"\u27fc", - u"xnis;": u"\u22fb", - u"xodot;": u"\u2a00", - u"xopf;": u"\U0001d569", - u"xoplus;": u"\u2a01", - u"xotime;": u"\u2a02", - u"xrArr;": u"\u27f9", - u"xrarr;": u"\u27f6", - u"xscr;": u"\U0001d4cd", - u"xsqcup;": u"\u2a06", - u"xuplus;": u"\u2a04", - u"xutri;": u"\u25b3", - u"xvee;": u"\u22c1", - u"xwedge;": u"\u22c0", - u"yacute": u"\xfd", - u"yacute;": u"\xfd", - u"yacy;": u"\u044f", - u"ycirc;": u"\u0177", - u"ycy;": u"\u044b", - u"yen": u"\xa5", - u"yen;": u"\xa5", - u"yfr;": u"\U0001d536", - u"yicy;": u"\u0457", - u"yopf;": u"\U0001d56a", - u"yscr;": u"\U0001d4ce", - u"yucy;": u"\u044e", - u"yuml": u"\xff", - u"yuml;": u"\xff", - u"zacute;": u"\u017a", - u"zcaron;": u"\u017e", - u"zcy;": u"\u0437", - u"zdot;": u"\u017c", - u"zeetrf;": u"\u2128", - u"zeta;": u"\u03b6", - u"zfr;": u"\U0001d537", - u"zhcy;": u"\u0436", - u"zigrarr;": u"\u21dd", - u"zopf;": u"\U0001d56b", - u"zscr;": u"\U0001d4cf", - u"zwj;": u"\u200d", - u"zwnj;": u"\u200c", -} - -replacementCharacters = { - 0x0:u"\uFFFD", - 0x0d:u"\u000D", - 0x80:u"\u20AC", - 0x81:u"\u0081", - 0x81:u"\u0081", - 0x82:u"\u201A", - 0x83:u"\u0192", - 0x84:u"\u201E", - 0x85:u"\u2026", - 0x86:u"\u2020", - 0x87:u"\u2021", - 0x88:u"\u02C6", - 0x89:u"\u2030", - 0x8A:u"\u0160", - 0x8B:u"\u2039", - 0x8C:u"\u0152", - 0x8D:u"\u008D", - 0x8E:u"\u017D", - 0x8F:u"\u008F", - 0x90:u"\u0090", - 0x91:u"\u2018", - 0x92:u"\u2019", - 0x93:u"\u201C", - 0x94:u"\u201D", - 0x95:u"\u2022", - 0x96:u"\u2013", - 0x97:u"\u2014", - 0x98:u"\u02DC", - 0x99:u"\u2122", - 0x9A:u"\u0161", - 0x9B:u"\u203A", - 0x9C:u"\u0153", - 0x9D:u"\u009D", - 0x9E:u"\u017E", - 0x9F:u"\u0178", -} - -encodings = { - u'437': u'cp437', - u'850': u'cp850', - u'852': u'cp852', - u'855': u'cp855', - u'857': u'cp857', - u'860': u'cp860', - u'861': u'cp861', - u'862': u'cp862', - u'863': u'cp863', - u'865': u'cp865', - u'866': u'cp866', - u'869': u'cp869', - u'ansix341968': u'ascii', - u'ansix341986': u'ascii', - u'arabic': u'iso8859-6', - u'ascii': u'ascii', - u'asmo708': u'iso8859-6', - u'big5': u'big5', - u'big5hkscs': u'big5hkscs', - u'chinese': u'gbk', - u'cp037': u'cp037', - u'cp1026': u'cp1026', - u'cp154': u'ptcp154', - u'cp367': u'ascii', - u'cp424': u'cp424', - u'cp437': u'cp437', - u'cp500': u'cp500', - u'cp775': u'cp775', - u'cp819': u'windows-1252', - u'cp850': u'cp850', - u'cp852': u'cp852', - u'cp855': u'cp855', - u'cp857': u'cp857', - u'cp860': u'cp860', - u'cp861': u'cp861', - u'cp862': u'cp862', - u'cp863': u'cp863', - u'cp864': u'cp864', - u'cp865': u'cp865', - u'cp866': u'cp866', - u'cp869': u'cp869', - u'cp936': u'gbk', - u'cpgr': u'cp869', - u'cpis': u'cp861', - u'csascii': u'ascii', - u'csbig5': u'big5', - u'cseuckr': u'cp949', - u'cseucpkdfmtjapanese': u'euc_jp', - u'csgb2312': u'gbk', - u'cshproman8': u'hp-roman8', - u'csibm037': u'cp037', - u'csibm1026': u'cp1026', - u'csibm424': u'cp424', - u'csibm500': u'cp500', - u'csibm855': u'cp855', - u'csibm857': u'cp857', - u'csibm860': u'cp860', - u'csibm861': u'cp861', - u'csibm863': u'cp863', - u'csibm864': u'cp864', - u'csibm865': u'cp865', - u'csibm866': u'cp866', - u'csibm869': u'cp869', - u'csiso2022jp': u'iso2022_jp', - u'csiso2022jp2': u'iso2022_jp_2', - u'csiso2022kr': u'iso2022_kr', - u'csiso58gb231280': u'gbk', - u'csisolatin1': u'windows-1252', - u'csisolatin2': u'iso8859-2', - u'csisolatin3': u'iso8859-3', - u'csisolatin4': u'iso8859-4', - u'csisolatin5': u'windows-1254', - u'csisolatin6': u'iso8859-10', - u'csisolatinarabic': u'iso8859-6', - u'csisolatincyrillic': u'iso8859-5', - u'csisolatingreek': u'iso8859-7', - u'csisolatinhebrew': u'iso8859-8', - u'cskoi8r': u'koi8-r', - u'csksc56011987': u'cp949', - u'cspc775baltic': u'cp775', - u'cspc850multilingual': u'cp850', - u'cspc862latinhebrew': u'cp862', - u'cspc8codepage437': u'cp437', - u'cspcp852': u'cp852', - u'csptcp154': u'ptcp154', - u'csshiftjis': u'shift_jis', - u'csunicode11utf7': u'utf-7', - u'cyrillic': u'iso8859-5', - u'cyrillicasian': u'ptcp154', - u'ebcdiccpbe': u'cp500', - u'ebcdiccpca': u'cp037', - u'ebcdiccpch': u'cp500', - u'ebcdiccphe': u'cp424', - u'ebcdiccpnl': u'cp037', - u'ebcdiccpus': u'cp037', - u'ebcdiccpwt': u'cp037', - u'ecma114': u'iso8859-6', - u'ecma118': u'iso8859-7', - u'elot928': u'iso8859-7', - u'eucjp': u'euc_jp', - u'euckr': u'cp949', - u'extendedunixcodepackedformatforjapanese': u'euc_jp', - u'gb18030': u'gb18030', - u'gb2312': u'gbk', - u'gb231280': u'gbk', - u'gbk': u'gbk', - u'greek': u'iso8859-7', - u'greek8': u'iso8859-7', - u'hebrew': u'iso8859-8', - u'hproman8': u'hp-roman8', - u'hzgb2312': u'hz', - u'ibm037': u'cp037', - u'ibm1026': u'cp1026', - u'ibm367': u'ascii', - u'ibm424': u'cp424', - u'ibm437': u'cp437', - u'ibm500': u'cp500', - u'ibm775': u'cp775', - u'ibm819': u'windows-1252', - u'ibm850': u'cp850', - u'ibm852': u'cp852', - u'ibm855': u'cp855', - u'ibm857': u'cp857', - u'ibm860': u'cp860', - u'ibm861': u'cp861', - u'ibm862': u'cp862', - u'ibm863': u'cp863', - u'ibm864': u'cp864', - u'ibm865': u'cp865', - u'ibm866': u'cp866', - u'ibm869': u'cp869', - u'iso2022jp': u'iso2022_jp', - u'iso2022jp2': u'iso2022_jp_2', - u'iso2022kr': u'iso2022_kr', - u'iso646irv1991': u'ascii', - u'iso646us': u'ascii', - u'iso88591': u'windows-1252', - u'iso885910': u'iso8859-10', - u'iso8859101992': u'iso8859-10', - u'iso885911987': u'windows-1252', - u'iso885913': u'iso8859-13', - u'iso885914': u'iso8859-14', - u'iso8859141998': u'iso8859-14', - u'iso885915': u'iso8859-15', - u'iso885916': u'iso8859-16', - u'iso8859162001': u'iso8859-16', - u'iso88592': u'iso8859-2', - u'iso885921987': u'iso8859-2', - u'iso88593': u'iso8859-3', - u'iso885931988': u'iso8859-3', - u'iso88594': u'iso8859-4', - u'iso885941988': u'iso8859-4', - u'iso88595': u'iso8859-5', - u'iso885951988': u'iso8859-5', - u'iso88596': u'iso8859-6', - u'iso885961987': u'iso8859-6', - u'iso88597': u'iso8859-7', - u'iso885971987': u'iso8859-7', - u'iso88598': u'iso8859-8', - u'iso885981988': u'iso8859-8', - u'iso88599': u'windows-1254', - u'iso885991989': u'windows-1254', - u'isoceltic': u'iso8859-14', - u'isoir100': u'windows-1252', - u'isoir101': u'iso8859-2', - u'isoir109': u'iso8859-3', - u'isoir110': u'iso8859-4', - u'isoir126': u'iso8859-7', - u'isoir127': u'iso8859-6', - u'isoir138': u'iso8859-8', - u'isoir144': u'iso8859-5', - u'isoir148': u'windows-1254', - u'isoir149': u'cp949', - u'isoir157': u'iso8859-10', - u'isoir199': u'iso8859-14', - u'isoir226': u'iso8859-16', - u'isoir58': u'gbk', - u'isoir6': u'ascii', - u'koi8r': u'koi8-r', - u'koi8u': u'koi8-u', - u'korean': u'cp949', - u'ksc5601': u'cp949', - u'ksc56011987': u'cp949', - u'ksc56011989': u'cp949', - u'l1': u'windows-1252', - u'l10': u'iso8859-16', - u'l2': u'iso8859-2', - u'l3': u'iso8859-3', - u'l4': u'iso8859-4', - u'l5': u'windows-1254', - u'l6': u'iso8859-10', - u'l8': u'iso8859-14', - u'latin1': u'windows-1252', - u'latin10': u'iso8859-16', - u'latin2': u'iso8859-2', - u'latin3': u'iso8859-3', - u'latin4': u'iso8859-4', - u'latin5': u'windows-1254', - u'latin6': u'iso8859-10', - u'latin8': u'iso8859-14', - u'latin9': u'iso8859-15', - u'ms936': u'gbk', - u'mskanji': u'shift_jis', - u'pt154': u'ptcp154', - u'ptcp154': u'ptcp154', - u'r8': u'hp-roman8', - u'roman8': u'hp-roman8', - u'shiftjis': u'shift_jis', - u'tis620': u'cp874', - u'unicode11utf7': u'utf-7', - u'us': u'ascii', - u'usascii': u'ascii', - u'utf16': u'utf-16', - u'utf16be': u'utf-16-be', - u'utf16le': u'utf-16-le', - u'utf8': u'utf-8', - u'windows1250': u'cp1250', - u'windows1251': u'cp1251', - u'windows1252': u'cp1252', - u'windows1253': u'cp1253', - u'windows1254': u'cp1254', - u'windows1255': u'cp1255', - u'windows1256': u'cp1256', - u'windows1257': u'cp1257', - u'windows1258': u'cp1258', - u'windows936': u'gbk', - u'x-x-big5': u'big5'} - -tokenTypes = { - u"Doctype":0, - u"Characters":1, - u"SpaceCharacters":2, - u"StartTag":3, - u"EndTag":4, - u"EmptyTag":5, - u"Comment":6, - u"ParseError":7 -} - -tagTokenTypes = frozenset((tokenTypes[u"StartTag"], tokenTypes[u"EndTag"], - tokenTypes[u"EmptyTag"])) - - -prefixes = dict([(v,k) for k,v in namespaces.items()]) -prefixes[u"http://www.w3.org/1998/Math/MathML"] = u"math" - -class DataLossWarning(UserWarning): - pass - -class ReparseException(Exception): - pass diff --git a/python/html5lib/filters/__init__.py b/python/html5lib/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/python/html5lib/filters/_base.py b/python/html5lib/filters/_base.py deleted file mode 100644 index 4987277..0000000 --- a/python/html5lib/filters/_base.py +++ /dev/null @@ -1,13 +0,0 @@ - -class Filter(object): - def __init__(self, source): - self.source = source - __init__.func_annotations = {} - - def __iter__(self): - return iter(self.source) - __iter__.func_annotations = {} - - def __getattr__(self, name): - return getattr(self.source, name) - __getattr__.func_annotations = {} diff --git a/python/html5lib/filters/inject_meta_charset.py b/python/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index 106ca33..0000000 --- a/python/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,65 +0,0 @@ -from __future__ import absolute_import -from . import _base - -class Filter(_base.Filter): - def __init__(self, source, encoding): - _base.Filter.__init__(self, source) - self.encoding = encoding - __init__.func_annotations = {} - - def __iter__(self): - state = u"pre_head" - meta_found = (self.encoding is None) - pending = [] - - for token in _base.Filter.__iter__(self): - type = token[u"type"] - if type == u"StartTag": - if token[u"name"].lower() == u"head": - state = u"in_head" - - elif type == u"EmptyTag": - if token[u"name"].lower() == u"meta": - # replace charset with actual encoding - has_http_equiv_content_type = False - for (namespace,name),value in token[u"data"].items(): - if namespace != None: - continue - elif name.lower() == u'charset': - token[u"data"][(namespace,name)] = self.encoding - meta_found = True - break - elif name == u'http-equiv' and value.lower() == u'content-type': - has_http_equiv_content_type = True - else: - if has_http_equiv_content_type and (None, u"content") in token[u"data"]: - token[u"data"][(None, u"content")] = u'text/html; charset=%s' % self.encoding - meta_found = True - - elif token[u"name"].lower() == u"head" and not meta_found: - # insert meta into empty head - yield {u"type": u"StartTag", u"name": u"head", - u"data": token[u"data"]} - yield {u"type": u"EmptyTag", u"name": u"meta", - u"data": {(None, u"charset"): self.encoding}} - yield {u"type": u"EndTag", u"name": u"head"} - meta_found = True - continue - - elif type == u"EndTag": - if token[u"name"].lower() == u"head" and pending: - # insert meta into head (if necessary) and flush pending queue - yield pending.pop(0) - if not meta_found: - yield {u"type": u"EmptyTag", u"name": u"meta", - u"data": {(None, u"charset"): self.encoding}} - while pending: - yield pending.pop(0) - meta_found = True - state = u"post_head" - - if state == u"in_head": - pending.append(token) - else: - yield token - __iter__.func_annotations = {} diff --git a/python/html5lib/filters/lint.py b/python/html5lib/filters/lint.py deleted file mode 100644 index 7ca0491..0000000 --- a/python/html5lib/filters/lint.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import absolute_import -from gettext import gettext -_ = gettext - -from . import _base -from html5lib.constants import cdataElements, rcdataElements, voidElements - -from html5lib.constants import spaceCharacters -spaceCharacters = u"".join(spaceCharacters) - -class LintError(Exception): pass - -class Filter(_base.Filter): - def __iter__(self): - open_elements = [] - contentModelFlag = u"PCDATA" - for token in _base.Filter.__iter__(self): - type = token[u"type"] - if type in (u"StartTag", u"EmptyTag"): - name = token[u"name"] - if contentModelFlag != u"PCDATA": - raise LintError(_(u"StartTag not in PCDATA content model flag: %s") % name) - if not isinstance(name, unicode): - raise LintError(_(u"Tag name is not a string: %r") % name) - if not name: - raise LintError(_(u"Empty tag name")) - if type == u"StartTag" and name in voidElements: - raise LintError(_(u"Void element reported as StartTag token: %s") % name) - elif type == u"EmptyTag" and name not in voidElements: - raise LintError(_(u"Non-void element reported as EmptyTag token: %s") % token[u"name"]) - if type == u"StartTag": - open_elements.append(name) - for name, value in token[u"data"]: - if not isinstance(name, unicode): - raise LintError(_(u"Attribute name is not a string: %r") % name) - if not name: - raise LintError(_(u"Empty attribute name")) - if not isinstance(value, unicode): - raise LintError(_(u"Attribute value is not a string: %r") % value) - if name in cdataElements: - contentModelFlag = u"CDATA" - elif name in rcdataElements: - contentModelFlag = u"RCDATA" - elif name == u"plaintext": - contentModelFlag = u"PLAINTEXT" - - elif type == u"EndTag": - name = token[u"name"] - if not isinstance(name, unicode): - raise LintError(_(u"Tag name is not a string: %r") % name) - if not name: - raise LintError(_(u"Empty tag name")) - if name in voidElements: - raise LintError(_(u"Void element reported as EndTag token: %s") % name) - start_name = open_elements.pop() - if start_name != name: - raise LintError(_(u"EndTag (%s) does not match StartTag (%s)") % (name, start_name)) - contentModelFlag = u"PCDATA" - - elif type == u"Comment": - if contentModelFlag != u"PCDATA": - raise LintError(_(u"Comment not in PCDATA content model flag")) - - elif type in (u"Characters", u"SpaceCharacters"): - data = token[u"data"] - if not isinstance(data, unicode): - raise LintError(_(u"Attribute name is not a string: %r") % data) - if not data: - raise LintError(_(u"%s token with empty data") % type) - if type == u"SpaceCharacters": - data = data.strip(spaceCharacters) - if data: - raise LintError(_(u"Non-space character(s) found in SpaceCharacters token: ") % data) - - elif type == u"Doctype": - name = token[u"name"] - if contentModelFlag != u"PCDATA": - raise LintError(_(u"Doctype not in PCDATA content model flag: %s") % name) - if not isinstance(name, unicode): - raise LintError(_(u"Tag name is not a string: %r") % name) - # XXX: what to do with token["data"] ? - - elif type in (u"ParseError", u"SerializeError"): - pass - - else: - raise LintError(_(u"Unknown token type: %s") % type) - - yield token - __iter__.func_annotations = {} diff --git a/python/html5lib/filters/optionaltags.py b/python/html5lib/filters/optionaltags.py deleted file mode 100644 index 9e22c6e..0000000 --- a/python/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,207 +0,0 @@ -from __future__ import absolute_import -from . import _base - -class Filter(_base.Filter): - def slider(self): - previous1 = previous2 = None - for token in self.source: - if previous1 is not None: - yield previous2, previous1, token - previous2 = previous1 - previous1 = token - yield previous2, previous1, None - slider.func_annotations = {} - - def __iter__(self): - for previous, token, next in self.slider(): - type = token[u"type"] - if type == u"StartTag": - if (token[u"data"] or - not self.is_optional_start(token[u"name"], previous, next)): - yield token - elif type == u"EndTag": - if not self.is_optional_end(token[u"name"], next): - yield token - else: - yield token - __iter__.func_annotations = {} - - def is_optional_start(self, tagname, previous, next): - type = next and next[u"type"] or None - if tagname in u'html': - # An html element's start tag may be omitted if the first thing - # inside the html element is not a space character or a comment. - return type not in (u"Comment", u"SpaceCharacters") - elif tagname == u'head': - # A head element's start tag may be omitted if the first thing - # inside the head element is an element. - # XXX: we also omit the start tag if the head element is empty - if type in (u"StartTag", u"EmptyTag"): - return True - elif type == u"EndTag": - return next[u"name"] == u"head" - elif tagname == u'body': - # A body element's start tag may be omitted if the first thing - # inside the body element is not a space character or a comment, - # except if the first thing inside the body element is a script - # or style element and the node immediately preceding the body - # element is a head element whose end tag has been omitted. - if type in (u"Comment", u"SpaceCharacters"): - return False - elif type == u"StartTag": - # XXX: we do not look at the preceding event, so we never omit - # the body element's start tag if it's followed by a script or - # a style element. - return next[u"name"] not in (u'script', u'style') - else: - return True - elif tagname == u'colgroup': - # A colgroup element's start tag may be omitted if the first thing - # inside the colgroup element is a col element, and if the element - # is not immediately preceeded by another colgroup element whose - # end tag has been omitted. - if type in (u"StartTag", u"EmptyTag"): - # XXX: we do not look at the preceding event, so instead we never - # omit the colgroup element's end tag when it is immediately - # followed by another colgroup element. See is_optional_end. - return next[u"name"] == u"col" - else: - return False - elif tagname == u'tbody': - # A tbody element's start tag may be omitted if the first thing - # inside the tbody element is a tr element, and if the element is - # not immediately preceeded by a tbody, thead, or tfoot element - # whose end tag has been omitted. - if type == u"StartTag": - # omit the thead and tfoot elements' end tag when they are - # immediately followed by a tbody element. See is_optional_end. - if previous and previous[u'type'] == u'EndTag' and \ - previous[u'name'] in (u'tbody',u'thead',u'tfoot'): - return False - return next[u"name"] == u'tr' - else: - return False - return False - is_optional_start.func_annotations = {} - - def is_optional_end(self, tagname, next): - type = next and next[u"type"] or None - if tagname in (u'html', u'head', u'body'): - # An html element's end tag may be omitted if the html element - # is not immediately followed by a space character or a comment. - return type not in (u"Comment", u"SpaceCharacters") - elif tagname in (u'li', u'optgroup', u'tr'): - # A li element's end tag may be omitted if the li element is - # immediately followed by another li element or if there is - # no more content in the parent element. - # An optgroup element's end tag may be omitted if the optgroup - # element is immediately followed by another optgroup element, - # or if there is no more content in the parent element. - # A tr element's end tag may be omitted if the tr element is - # immediately followed by another tr element, or if there is - # no more content in the parent element. - if type == u"StartTag": - return next[u"name"] == tagname - else: - return type == u"EndTag" or type is None - elif tagname in (u'dt', u'dd'): - # A dt element's end tag may be omitted if the dt element is - # immediately followed by another dt element or a dd element. - # A dd element's end tag may be omitted if the dd element is - # immediately followed by another dd element or a dt element, - # or if there is no more content in the parent element. - if type == u"StartTag": - return next[u"name"] in (u'dt', u'dd') - elif tagname == u'dd': - return type == u"EndTag" or type is None - else: - return False - elif tagname == u'p': - # A p element's end tag may be omitted if the p element is - # immediately followed by an address, article, aside, - # blockquote, datagrid, dialog, dir, div, dl, fieldset, - # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, - # nav, ol, p, pre, section, table, or ul, element, or if - # there is no more content in the parent element. - if type in (u"StartTag", u"EmptyTag"): - return next[u"name"] in (u'address', u'article', u'aside', - u'blockquote', u'datagrid', u'dialog', - u'dir', u'div', u'dl', u'fieldset', u'footer', - u'form', u'h1', u'h2', u'h3', u'h4', u'h5', u'h6', - u'header', u'hr', u'menu', u'nav', u'ol', - u'p', u'pre', u'section', u'table', u'ul') - else: - return type == u"EndTag" or type is None - elif tagname == u'option': - # An option element's end tag may be omitted if the option - # element is immediately followed by another option element, - # or if it is immediately followed by an
optgroup
- # element, or if there is no more content in the parent - # element. - if type == u"StartTag": - return next[u"name"] in (u'option', u'optgroup') - else: - return type == u"EndTag" or type is None - elif tagname in (u'rt', u'rp'): - # An rt element's end tag may be omitted if the rt element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - # An rp element's end tag may be omitted if the rp element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - if type == u"StartTag": - return next[u"name"] in (u'rt', u'rp') - else: - return type == u"EndTag" or type is None - elif tagname == u'colgroup': - # A colgroup element's end tag may be omitted if the colgroup - # element is not immediately followed by a space character or - # a comment. - if type in (u"Comment", u"SpaceCharacters"): - return False - elif type == u"StartTag": - # XXX: we also look for an immediately following colgroup - # element. See is_optional_start. - return next[u"name"] != u'colgroup' - else: - return True - elif tagname in (u'thead', u'tbody'): - # A thead element's end tag may be omitted if the thead element - # is immediately followed by a tbody or tfoot element. - # A tbody element's end tag may be omitted if the tbody element - # is immediately followed by a tbody or tfoot element, or if - # there is no more content in the parent element. - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == u"StartTag": - return next[u"name"] in [u'tbody', u'tfoot'] - elif tagname == u'tbody': - return type == u"EndTag" or type is None - else: - return False - elif tagname == u'tfoot': - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == u"StartTag": - return next[u"name"] == u'tbody' - else: - return type == u"EndTag" or type is None - elif tagname in (u'td', u'th'): - # A td element's end tag may be omitted if the td element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - # A th element's end tag may be omitted if the th element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - if type == u"StartTag": - return next[u"name"] in (u'td', u'th') - else: - return type == u"EndTag" or type is None - return False - is_optional_end.func_annotations = {} diff --git a/python/html5lib/filters/sanitizer.py b/python/html5lib/filters/sanitizer.py deleted file mode 100644 index a392aaa..0000000 --- a/python/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import absolute_import -from . import _base -from html5lib.sanitizer import HTMLSanitizerMixin - -class Filter(_base.Filter, HTMLSanitizerMixin): - def __iter__(self): - for token in _base.Filter.__iter__(self): - token = self.sanitize_token(token) - if token: yield token - __iter__.func_annotations = {} diff --git a/python/html5lib/filters/whitespace.py b/python/html5lib/filters/whitespace.py deleted file mode 100644 index e19aa23..0000000 --- a/python/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import absolute_import -import re - -from . import _base -from html5lib.constants import rcdataElements, spaceCharacters -spaceCharacters = u"".join(spaceCharacters) - -SPACES_REGEX = re.compile(u"[%s]+" % spaceCharacters) - -class Filter(_base.Filter): - - spacePreserveElements = frozenset([u"pre", u"textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in _base.Filter.__iter__(self): - type = token[u"type"] - if type == u"StartTag" \ - and (preserve or token[u"name"] in self.spacePreserveElements): - preserve += 1 - - elif type == u"EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == u"SpaceCharacters" and token[u"data"]: - # Test on token["data"] above to not introduce spaces where there were not - token[u"data"] = u" " - - elif not preserve and type == u"Characters": - token[u"data"] = collapse_spaces(token[u"data"]) - - yield token - __iter__.func_annotations = {} - -def collapse_spaces(text): - return SPACES_REGEX.sub(u' ', text) -collapse_spaces.func_annotations = {} - diff --git a/python/html5lib/html5parser.py b/python/html5lib/html5parser.py deleted file mode 100644 index 68c92d7..0000000 --- a/python/html5lib/html5parser.py +++ /dev/null @@ -1,2988 +0,0 @@ -from __future__ import absolute_import -import sys -import types - -from . import inputstream -from . import tokenizer - -from . import treebuilders -from .treebuilders._base import Marker -from .treebuilders import simpletree - -from . import utils -from . import constants -from .constants import spaceCharacters, asciiUpper2Lower -from .constants import formattingElements, specialElements -from .constants import headingElements, tableInsertModeElements -from .constants import cdataElements, rcdataElements, voidElements -from .constants import tokenTypes, ReparseException, namespaces, spaceCharacters -from .constants import htmlIntegrationPointElements, mathmlTextIntegrationPointElements -from itertools import izip - -def parse(doc, treebuilder=u"simpletree", encoding=None, - namespaceHTMLElements=True): - u"""Parse a string or file-like object into a tree""" - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, encoding=encoding) -parse.func_annotations = {} - -def parseFragment(doc, container=u"div", treebuilder=u"simpletree", encoding=None, - namespaceHTMLElements=True): - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, encoding=encoding) -parseFragment.func_annotations = {} - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if type(attribute) == types.FunctionType: - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - __new__.func_annotations = {} - return Decorated -method_decorator_metaclass.func_annotations = {} - -class HTMLParser(object): - u"""HTML parser. Generates a tree structure from a stream of (possibly - malformed) HTML""" - - def __init__(self, tree = simpletree.TreeBuilder, - tokenizer = tokenizer.HTMLTokenizer, strict = False, - namespaceHTMLElements = True, debug=False): - u""" - strict - raise an exception when a parse error is encountered - - tree - a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - tokenizer - a class that provides a stream of tokens to the treebuilder. - This may be replaced for e.g. a sanitizer which converts some tags to - text - """ - - # Raise an exception on the first error encountered - self.strict = strict - - self.tree = tree(namespaceHTMLElements) - self.tokenizer_class = tokenizer - self.errors = [] - - self.phases = dict([(name, cls(self, self.tree)) for name, cls in - getPhases(debug).items()]) - __init__.func_annotations = {} - - def _parse(self, stream, innerHTML=False, container=u"div", - encoding=None, parseMeta=True, useChardet=True, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.tokenizer = self.tokenizer_class(stream, encoding=encoding, - parseMeta=parseMeta, - useChardet=useChardet, - parser=self, **kwargs) - self.reset() - - while True: - try: - self.mainLoop() - break - except ReparseException, e: - self.reset() - _parse.func_annotations = {} - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] #only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = u"no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == u'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases[u"beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False - self.phase = self.phases[u"initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - reset.func_annotations = {} - - def isHTMLIntegrationPoint(self, element): - if (element.name == u"annotation-xml" and - element.namespace == namespaces[u"mathml"]): - return (u"encoding" in element.attributes and - element.attributes[u"encoding"].translate( - asciiUpper2Lower) in - (u"text/html", u"application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - isHTMLIntegrationPoint.func_annotations = {} - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - isMathMLTextIntegrationPoint.func_annotations = {} - - def mainLoop(self): - CharactersToken = tokenTypes[u"Characters"] - SpaceCharactersToken = tokenTypes[u"SpaceCharacters"] - StartTagToken = tokenTypes[u"StartTag"] - EndTagToken = tokenTypes[u"EndTag"] - CommentToken = tokenTypes[u"Comment"] - DoctypeToken = tokenTypes[u"Doctype"] - ParseErrorToken = tokenTypes[u"ParseError"] - - for token in self.normalizedTokens(): - new_token = token - while new_token is not None: - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token[u"type"] - - if type == ParseErrorToken: - self.parseError(new_token[u"data"], new_token.get(u"datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token[u"name"] not in frozenset([u"mglyph", u"malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces[u"mathml"] and - currentNodeName == u"annotation-xml" and - token[u"name"] == u"svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases[u"inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token= phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and token[u"selfClosing"] - and not token[u"selfClosingAcknowledged"]): - self.parseError(u"non-void-element-with-trailing-solidus", - {u"name":token[u"name"]}) - - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - mainLoop.func_annotations = {} - - def normalizedTokens(self): - for token in self.tokenizer: - yield self.normalizeToken(token) - normalizedTokens.func_annotations = {} - - def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): - u"""Parse a HTML document into a well-formed tree - - stream - a filelike object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - """ - self._parse(stream, innerHTML=False, encoding=encoding, - parseMeta=parseMeta, useChardet=useChardet) - return self.tree.getDocument() - parse.func_annotations = {} - - def parseFragment(self, stream, container=u"div", encoding=None, - parseMeta=False, useChardet=True): - u"""Parse a HTML fragment into a well-formed tree fragment - - container - name of the element we're setting the innerHTML property - if set to None, default to 'div' - - stream - a filelike object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - """ - self._parse(stream, True, container=container, encoding=encoding) - return self.tree.getFragment() - parseFragment.func_annotations = {} - - def parseError(self, errorcode=u"XXX-undefined-error", datavars={}): - # XXX The idea is to make errorcode mandatory. - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError - parseError.func_annotations = {} - - def normalizeToken(self, token): - u""" HTML5 specific normalizations to the token stream """ - - if token[u"type"] == tokenTypes[u"StartTag"]: - token[u"data"] = dict(token[u"data"][::-1]) - - return token - normalizeToken.func_annotations = {} - - def adjustMathMLAttributes(self, token): - replacements = {u"definitionurl":u"definitionURL"} - for k,v in replacements.items(): - if k in token[u"data"]: - token[u"data"][v] = token[u"data"][k] - del token[u"data"][k] - adjustMathMLAttributes.func_annotations = {} - - def adjustSVGAttributes(self, token): - replacements = { - u"attributename":u"attributeName", - u"attributetype":u"attributeType", - u"basefrequency":u"baseFrequency", - u"baseprofile":u"baseProfile", - u"calcmode":u"calcMode", - u"clippathunits":u"clipPathUnits", - u"contentscripttype":u"contentScriptType", - u"contentstyletype":u"contentStyleType", - u"diffuseconstant":u"diffuseConstant", - u"edgemode":u"edgeMode", - u"externalresourcesrequired":u"externalResourcesRequired", - u"filterres":u"filterRes", - u"filterunits":u"filterUnits", - u"glyphref":u"glyphRef", - u"gradienttransform":u"gradientTransform", - u"gradientunits":u"gradientUnits", - u"kernelmatrix":u"kernelMatrix", - u"kernelunitlength":u"kernelUnitLength", - u"keypoints":u"keyPoints", - u"keysplines":u"keySplines", - u"keytimes":u"keyTimes", - u"lengthadjust":u"lengthAdjust", - u"limitingconeangle":u"limitingConeAngle", - u"markerheight":u"markerHeight", - u"markerunits":u"markerUnits", - u"markerwidth":u"markerWidth", - u"maskcontentunits":u"maskContentUnits", - u"maskunits":u"maskUnits", - u"numoctaves":u"numOctaves", - u"pathlength":u"pathLength", - u"patterncontentunits":u"patternContentUnits", - u"patterntransform":u"patternTransform", - u"patternunits":u"patternUnits", - u"pointsatx":u"pointsAtX", - u"pointsaty":u"pointsAtY", - u"pointsatz":u"pointsAtZ", - u"preservealpha":u"preserveAlpha", - u"preserveaspectratio":u"preserveAspectRatio", - u"primitiveunits":u"primitiveUnits", - u"refx":u"refX", - u"refy":u"refY", - u"repeatcount":u"repeatCount", - u"repeatdur":u"repeatDur", - u"requiredextensions":u"requiredExtensions", - u"requiredfeatures":u"requiredFeatures", - u"specularconstant":u"specularConstant", - u"specularexponent":u"specularExponent", - u"spreadmethod":u"spreadMethod", - u"startoffset":u"startOffset", - u"stddeviation":u"stdDeviation", - u"stitchtiles":u"stitchTiles", - u"surfacescale":u"surfaceScale", - u"systemlanguage":u"systemLanguage", - u"tablevalues":u"tableValues", - u"targetx":u"targetX", - u"targety":u"targetY", - u"textlength":u"textLength", - u"viewbox":u"viewBox", - u"viewtarget":u"viewTarget", - u"xchannelselector":u"xChannelSelector", - u"ychannelselector":u"yChannelSelector", - u"zoomandpan":u"zoomAndPan" - } - for originalName in list(token[u"data"].keys()): - if originalName in replacements: - svgName = replacements[originalName] - token[u"data"][svgName] = token[u"data"][originalName] - del token[u"data"][originalName] - adjustSVGAttributes.func_annotations = {} - - def adjustForeignAttributes(self, token): - replacements = { - u"xlink:actuate":(u"xlink", u"actuate", namespaces[u"xlink"]), - u"xlink:arcrole":(u"xlink", u"arcrole", namespaces[u"xlink"]), - u"xlink:href":(u"xlink", u"href", namespaces[u"xlink"]), - u"xlink:role":(u"xlink", u"role", namespaces[u"xlink"]), - u"xlink:show":(u"xlink", u"show", namespaces[u"xlink"]), - u"xlink:title":(u"xlink", u"title", namespaces[u"xlink"]), - u"xlink:type":(u"xlink", u"type", namespaces[u"xlink"]), - u"xml:base":(u"xml", u"base", namespaces[u"xml"]), - u"xml:lang":(u"xml", u"lang", namespaces[u"xml"]), - u"xml:space":(u"xml", u"space", namespaces[u"xml"]), - u"xmlns":(None, u"xmlns", namespaces[u"xmlns"]), - u"xmlns:xlink":(u"xmlns", u"xlink", namespaces[u"xmlns"]) - } - - for originalName in token[u"data"].keys(): - if originalName in replacements: - foreignName = replacements[originalName] - token[u"data"][foreignName] = token[u"data"][originalName] - del token[u"data"][originalName] - adjustForeignAttributes.func_annotations = {} - - def reparseTokenNormal(self, token): - self.parser.phase() - reparseTokenNormal.func_annotations = {} - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - u"select":u"inSelect", - u"td":u"inCell", - u"th":u"inCell", - u"tr":u"inRow", - u"tbody":u"inTableBody", - u"thead":u"inTableBody", - u"tfoot":u"inTableBody", - u"caption":u"inCaption", - u"colgroup":u"inColumnGroup", - u"table":u"inTable", - u"head":u"inBody", - u"body":u"inBody", - u"frameset":u"inFrameset", - u"html":u"beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in (u"select", u"colgroup", u"head", u"html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases[u"inBody"] - break - - self.phase = new_phase - resetInsertionMode.func_annotations = {} - - def parseRCDataRawtext(self, token, contentType): - u"""Generic RCDATA/RAWTEXT Parsing algorithm - contentType - RCDATA or RAWTEXT - """ - assert contentType in (u"RAWTEXT", u"RCDATA") - - element = self.tree.insertElement(token) - - if contentType == u"RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases[u"text"] - parseRCDataRawtext.func_annotations = {} - -def getPhases(debug): - def log(function): - u"""Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - constants.tokenTypes.items()) - def wrapped(self, *args, **kwargs): - if function.__name__.startswith(u"process") and len(args) > 0: - token = args[0] - try: - info = {u"type":type_names[token[u'type']]} - except: - raise - if token[u'type'] in constants.tagTokenTypes: - info[u"name"] = token[u'name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - wrapped.func_annotations = {} - return wrapped - log.func_annotations = {} - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - getMetaclass.func_annotations = {} - - class Phase(object): - __metaclass__ = getMetaclass(debug, log) - u"""Base class for helper object that implements each phase of processing - """ - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - __init__.func_annotations = {} - - def processEOF(self): - raise NotImplementedError - processEOF.func_annotations = {} - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - processComment.func_annotations = {} - - def processDoctype(self, token): - self.parser.parseError(u"unexpected-doctype") - processDoctype.func_annotations = {} - - def processCharacters(self, token): - self.tree.insertText(token[u"data"]) - processCharacters.func_annotations = {} - - def processSpaceCharacters(self, token): - self.tree.insertText(token[u"data"]) - processSpaceCharacters.func_annotations = {} - - def processStartTag(self, token): - return self.startTagHandler[token[u"name"]](token) - processStartTag.func_annotations = {} - - def startTagHtml(self, token): - if self.parser.firstStartTag == False and token[u"name"] == u"html": - self.parser.parseError(u"non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token[u"data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - startTagHtml.func_annotations = {} - - def processEndTag(self, token): - return self.endTagHandler[token[u"name"]](token) - processEndTag.func_annotations = {} - - class InitialPhase(Phase): - def processSpaceCharacters(self, token): - pass - processSpaceCharacters.func_annotations = {} - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - processComment.func_annotations = {} - - def processDoctype(self, token): - name = token[u"name"] - publicId = token[u"publicId"] - systemId = token[u"systemId"] - correct = token[u"correct"] - - if (name != u"html" or publicId != None or - systemId != None and systemId != u"about:legacy-compat"): - self.parser.parseError(u"unknown-doctype") - - if publicId is None: - publicId = u"" - - self.tree.insertDoctype(token) - - if publicId != u"": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token[u"name"] != u"html" - or publicId.startswith( - (u"+//silmaril//dtd html pro v0r11 19970101//", - u"-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - u"-//as//dtd html 3.0 aswedit + extensions//", - u"-//ietf//dtd html 2.0 level 1//", - u"-//ietf//dtd html 2.0 level 2//", - u"-//ietf//dtd html 2.0 strict level 1//", - u"-//ietf//dtd html 2.0 strict level 2//", - u"-//ietf//dtd html 2.0 strict//", - u"-//ietf//dtd html 2.0//", - u"-//ietf//dtd html 2.1e//", - u"-//ietf//dtd html 3.0//", - u"-//ietf//dtd html 3.2 final//", - u"-//ietf//dtd html 3.2//", - u"-//ietf//dtd html 3//", - u"-//ietf//dtd html level 0//", - u"-//ietf//dtd html level 1//", - u"-//ietf//dtd html level 2//", - u"-//ietf//dtd html level 3//", - u"-//ietf//dtd html strict level 0//", - u"-//ietf//dtd html strict level 1//", - u"-//ietf//dtd html strict level 2//", - u"-//ietf//dtd html strict level 3//", - u"-//ietf//dtd html strict//", - u"-//ietf//dtd html//", - u"-//metrius//dtd metrius presentational//", - u"-//microsoft//dtd internet explorer 2.0 html strict//", - u"-//microsoft//dtd internet explorer 2.0 html//", - u"-//microsoft//dtd internet explorer 2.0 tables//", - u"-//microsoft//dtd internet explorer 3.0 html strict//", - u"-//microsoft//dtd internet explorer 3.0 html//", - u"-//microsoft//dtd internet explorer 3.0 tables//", - u"-//netscape comm. corp.//dtd html//", - u"-//netscape comm. corp.//dtd strict html//", - u"-//o'reilly and associates//dtd html 2.0//", - u"-//o'reilly and associates//dtd html extended 1.0//", - u"-//o'reilly and associates//dtd html extended relaxed 1.0//", - u"-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - u"-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - u"-//spyglass//dtd html 2.0 extended//", - u"-//sq//dtd html 2.0 hotmetal + extensions//", - u"-//sun microsystems corp.//dtd hotjava html//", - u"-//sun microsystems corp.//dtd hotjava strict html//", - u"-//w3c//dtd html 3 1995-03-24//", - u"-//w3c//dtd html 3.2 draft//", - u"-//w3c//dtd html 3.2 final//", - u"-//w3c//dtd html 3.2//", - u"-//w3c//dtd html 3.2s draft//", - u"-//w3c//dtd html 4.0 frameset//", - u"-//w3c//dtd html 4.0 transitional//", - u"-//w3c//dtd html experimental 19960712//", - u"-//w3c//dtd html experimental 970421//", - u"-//w3c//dtd w3 html//", - u"-//w3o//dtd w3 html 3.0//", - u"-//webtechs//dtd mozilla html 2.0//", - u"-//webtechs//dtd mozilla html//")) - or publicId in - (u"-//w3o//dtd w3 html strict 3.0//en//", - u"-/w3c/dtd html 4.0 transitional/en", - u"html") - or publicId.startswith( - (u"-//w3c//dtd html 4.01 frameset//", - u"-//w3c//dtd html 4.01 transitional//")) and - systemId == None - or systemId and systemId.lower() == u"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = u"quirks" - elif (publicId.startswith( - (u"-//w3c//dtd xhtml 1.0 frameset//", - u"-//w3c//dtd xhtml 1.0 transitional//")) - or publicId.startswith( - (u"-//w3c//dtd html 4.01 frameset//", - u"-//w3c//dtd html 4.01 transitional//")) and - systemId != None): - self.parser.compatMode = u"limited quirks" - - self.parser.phase = self.parser.phases[u"beforeHtml"] - processDoctype.func_annotations = {} - - def anythingElse(self): - self.parser.compatMode = u"quirks" - self.parser.phase = self.parser.phases[u"beforeHtml"] - anythingElse.func_annotations = {} - - def processCharacters(self, token): - self.parser.parseError(u"expected-doctype-but-got-chars") - self.anythingElse() - return token - processCharacters.func_annotations = {} - - def processStartTag(self, token): - self.parser.parseError(u"expected-doctype-but-got-start-tag", - {u"name": token[u"name"]}) - self.anythingElse() - return token - processStartTag.func_annotations = {} - - def processEndTag(self, token): - self.parser.parseError(u"expected-doctype-but-got-end-tag", - {u"name": token[u"name"]}) - self.anythingElse() - return token - processEndTag.func_annotations = {} - - def processEOF(self): - self.parser.parseError(u"expected-doctype-but-got-eof") - self.anythingElse() - return True - processEOF.func_annotations = {} - - - class BeforeHtmlPhase(Phase): - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken(u"html", u"StartTag")) - self.parser.phase = self.parser.phases[u"beforeHead"] - insertHtmlElement.func_annotations = {} - - # other - def processEOF(self): - self.insertHtmlElement() - return True - processEOF.func_annotations = {} - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - processComment.func_annotations = {} - - def processSpaceCharacters(self, token): - pass - processSpaceCharacters.func_annotations = {} - - def processCharacters(self, token): - self.insertHtmlElement() - return token - processCharacters.func_annotations = {} - - def processStartTag(self, token): - if token[u"name"] == u"html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - processStartTag.func_annotations = {} - - def processEndTag(self, token): - if token[u"name"] not in (u"head", u"body", u"html", u"br"): - self.parser.parseError(u"unexpected-end-tag-before-html", - {u"name": token[u"name"]}) - else: - self.insertHtmlElement() - return token - processEndTag.func_annotations = {} - - - class BeforeHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = utils.MethodDispatcher([ - (u"html", self.startTagHtml), - (u"head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = utils.MethodDispatcher([ - ((u"head", u"body", u"html", u"br"), self.endTagImplyHead) - ]) - self.endTagHandler.default = self.endTagOther - __init__.func_annotations = {} - - def processEOF(self): - self.startTagHead(impliedTagToken(u"head", u"StartTag")) - return True - processEOF.func_annotations = {} - - def processSpaceCharacters(self, token): - pass - processSpaceCharacters.func_annotations = {} - - def processCharacters(self, token): - self.startTagHead(impliedTagToken(u"head", u"StartTag")) - return token - processCharacters.func_annotations = {} - - def startTagHtml(self, token): - return self.parser.phases[u"inBody"].processStartTag(token) - startTagHtml.func_annotations = {} - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases[u"inHead"] - startTagHead.func_annotations = {} - - def startTagOther(self, token): - self.startTagHead(impliedTagToken(u"head", u"StartTag")) - return token - startTagOther.func_annotations = {} - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken(u"head", u"StartTag")) - return token - endTagImplyHead.func_annotations = {} - - def endTagOther(self, token): - self.parser.parseError(u"end-tag-after-implied-root", - {u"name": token[u"name"]}) - endTagOther.func_annotations = {} - - class InHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = utils.MethodDispatcher([ - (u"html", self.startTagHtml), - (u"title", self.startTagTitle), - ((u"noscript", u"noframes", u"style"), self.startTagNoScriptNoFramesStyle), - (u"script", self.startTagScript), - ((u"base", u"basefont", u"bgsound", u"command", u"link"), - self.startTagBaseLinkCommand), - (u"meta", self.startTagMeta), - (u"head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self. endTagHandler = utils.MethodDispatcher([ - (u"head", self.endTagHead), - ((u"br", u"html", u"body"), self.endTagHtmlBodyBr) - ]) - self.endTagHandler.default = self.endTagOther - __init__.func_annotations = {} - - # the real thing - def processEOF (self): - self.anythingElse() - return True - processEOF.func_annotations = {} - - def processCharacters(self, token): - self.anythingElse() - return token - processCharacters.func_annotations = {} - - def startTagHtml(self, token): - return self.parser.phases[u"inBody"].processStartTag(token) - startTagHtml.func_annotations = {} - - def startTagHead(self, token): - self.parser.parseError(u"two-heads-are-not-better-than-one") - startTagHead.func_annotations = {} - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token[u"selfClosingAcknowledged"] = True - startTagBaseLinkCommand.func_annotations = {} - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token[u"selfClosingAcknowledged"] = True - - attributes = token[u"data"] - if self.parser.tokenizer.stream.charEncoding[1] == u"tentative": - if u"charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes[u"charset"]) - elif (u"content" in attributes and - u"http-equiv" in attributes and - attributes[u"http-equiv"].lower() == u"content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = inputstream.EncodingBytes(attributes[u"content"].encode(u"utf-8")) - parser = inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - startTagMeta.func_annotations = {} - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, u"RCDATA") - startTagTitle.func_annotations = {} - - def startTagNoScriptNoFramesStyle(self, token): - #Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, u"RAWTEXT") - startTagNoScriptNoFramesStyle.func_annotations = {} - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases[u"text"] - startTagScript.func_annotations = {} - - def startTagOther(self, token): - self.anythingElse() - return token - startTagOther.func_annotations = {} - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == u"head", u"Expected head got %s"%node.name - self.parser.phase = self.parser.phases[u"afterHead"] - endTagHead.func_annotations = {} - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - endTagHtmlBodyBr.func_annotations = {} - - def endTagOther(self, token): - self.parser.parseError(u"unexpected-end-tag", {u"name": token[u"name"]}) - endTagOther.func_annotations = {} - - def anythingElse(self): - self.endTagHead(impliedTagToken(u"head")) - anythingElse.func_annotations = {} - - - # XXX If we implement a parser for which scripting is disabled we need to - # implement this phase. - # - # class InHeadNoScriptPhase(Phase): - - class AfterHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = utils.MethodDispatcher([ - (u"html", self.startTagHtml), - (u"body", self.startTagBody), - (u"frameset", self.startTagFrameset), - ((u"base", u"basefont", u"bgsound", u"link", u"meta", u"noframes", u"script", - u"style", u"title"), - self.startTagFromHead), - (u"head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = utils.MethodDispatcher([((u"body", u"html", u"br"), - self.endTagHtmlBodyBr)]) - self.endTagHandler.default = self.endTagOther - __init__.func_annotations = {} - - def processEOF(self): - self.anythingElse() - return True - processEOF.func_annotations = {} - - def processCharacters(self, token): - self.anythingElse() - return token - processCharacters.func_annotations = {} - - def startTagHtml(self, token): - return self.parser.phases[u"inBody"].processStartTag(token) - startTagHtml.func_annotations = {} - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases[u"inBody"] - startTagBody.func_annotations = {} - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases[u"inFrameset"] - startTagFrameset.func_annotations = {} - - def startTagFromHead(self, token): - self.parser.parseError(u"unexpected-start-tag-out-of-my-head", - {u"name": token[u"name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases[u"inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == u"head": - self.tree.openElements.remove(node) - break - startTagFromHead.func_annotations = {} - - def startTagHead(self, token): - self.parser.parseError(u"unexpected-start-tag", {u"name":token[u"name"]}) - startTagHead.func_annotations = {} - - def startTagOther(self, token): - self.anythingElse() - return token - startTagOther.func_annotations = {} - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - endTagHtmlBodyBr.func_annotations = {} - - def endTagOther(self, token): - self.parser.parseError(u"unexpected-end-tag", {u"name":token[u"name"]}) - endTagOther.func_annotations = {} - - def anythingElse(self): - self.tree.insertElement(impliedTagToken(u"body", u"StartTag")) - self.parser.phase = self.parser.phases[u"inBody"] - self.parser.framesetOK = True - anythingElse.func_annotations = {} - - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - #Keep a ref to this for special handling of whitespace in- self.processSpaceCharactersNonPre = self.processSpaceCharacters - - self.startTagHandler = utils.MethodDispatcher([ - (u"html", self.startTagHtml), - ((u"base", u"basefont", u"bgsound", u"command", u"link", u"meta", - u"noframes", u"script", u"style", u"title"), - self.startTagProcessInHead), - (u"body", self.startTagBody), - (u"frameset", self.startTagFrameset), - ((u"address", u"article", u"aside", u"blockquote", u"center", u"details", - u"details", u"dir", u"div", u"dl", u"fieldset", u"figcaption", u"figure", - u"footer", u"header", u"hgroup", u"menu", u"nav", u"ol", u"p", - u"section", u"summary", u"ul"), - self.startTagCloseP), - (headingElements, self.startTagHeading), - ((u"pre", u"listing"), self.startTagPreListing), - (u"form", self.startTagForm), - ((u"li", u"dd", u"dt"), self.startTagListItem), - (u"plaintext",self.startTagPlaintext), - (u"a", self.startTagA), - ((u"b", u"big", u"code", u"em", u"font", u"i", u"s", u"small", u"strike", - u"strong", u"tt", u"u"),self.startTagFormatting), - (u"nobr", self.startTagNobr), - (u"button", self.startTagButton), - ((u"applet", u"marquee", u"object"), self.startTagAppletMarqueeObject), - (u"xmp", self.startTagXmp), - (u"table", self.startTagTable), - ((u"area", u"br", u"embed", u"img", u"keygen", u"wbr"), - self.startTagVoidFormatting), - ((u"param", u"source", u"track"), self.startTagParamSource), - (u"input", self.startTagInput), - (u"hr", self.startTagHr), - (u"image", self.startTagImage), - (u"isindex", self.startTagIsIndex), - (u"textarea", self.startTagTextarea), - (u"iframe", self.startTagIFrame), - ((u"noembed", u"noframes", u"noscript"), self.startTagRawtext), - (u"select", self.startTagSelect), - ((u"rp", u"rt"), self.startTagRpRt), - ((u"option", u"optgroup"), self.startTagOpt), - ((u"math"), self.startTagMath), - ((u"svg"), self.startTagSvg), - ((u"caption", u"col", u"colgroup", u"frame", u"head", - u"tbody", u"td", u"tfoot", u"th", u"thead", - u"tr"), self.startTagMisplaced) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = utils.MethodDispatcher([ - (u"body",self.endTagBody), - (u"html",self.endTagHtml), - ((u"address", u"article", u"aside", u"blockquote", u"center", - u"details", u"dir", u"div", u"dl", u"fieldset", u"figcaption", u"figure", - u"footer", u"header", u"hgroup", u"listing", u"menu", u"nav", u"ol", u"pre", - u"section", u"summary", u"ul"), self.endTagBlock), - (u"form", self.endTagForm), - (u"p",self.endTagP), - ((u"dd", u"dt", u"li"), self.endTagListItem), - (headingElements, self.endTagHeading), - ((u"a", u"b", u"big", u"code", u"em", u"font", u"i", u"nobr", u"s", u"small", - u"strike", u"strong", u"tt", u"u"), self.endTagFormatting), - ((u"applet", u"marquee", u"object"), self.endTagAppletMarqueeObject), - (u"br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - __init__.func_annotations = {} - - def isMatchingFormattingElement(self, node1, node2): - if node1.name != node2.name or node1.namespace != node2.namespace: - return False - elif len(node1.attributes) != len(node2.attributes): - return False - else: - attributes1 = sorted(node1.attributes.items()) - attributes2 = sorted(node2.attributes.items()) - for attr1, attr2 in izip(attributes1, attributes2): - if attr1 != attr2: - return False - return True - isMatchingFormattingElement.func_annotations = {} - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - addFormattingElement.func_annotations = {} - - # the real deal - def processEOF(self): - allowed_elements = frozenset((u"dd", u"dt", u"li", u"p", u"tbody", u"td", - u"tfoot", u"th", u"thead", u"tr", u"body", - u"html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError(u"expected-closing-tag-but-got-eof") - break - processEOF.func_annotations = {} - #Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of,, and
-|- -#data -